3Depict-0.0.19/0000755000175000017500000000000012723200271012454 5ustar pcuserpcuser3Depict-0.0.19/config.h.in0000644000175000017500000001007012723165611014505 0ustar pcuserpcuser/* config.h.in. Generated from configure.ac by autoheader. */ /* Dont use pkg-config to locate ftgl */ #undef FTGL_NO_PKG_CONFIG /* Define to 1 if you have the `atexit' function. */ #undef HAVE_ATEXIT /* Define to 1 if you have the header file. */ #undef HAVE_FENV_H /* Define to 1 if you have the `floor' function. */ #undef HAVE_FLOOR /* Define to 1 if you have the header file. */ #undef HAVE_FT2BUILD_H /* Define to 1 if you have the `getcwd' function. */ #undef HAVE_GETCWD /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `isascii' function. */ #undef HAVE_ISASCII /* Define if you have the FREETYPE2 library */ #undef HAVE_LIBFREETYPE /* Define to 1 if you have the `ftgl' library (-lftgl). */ #undef HAVE_LIBFTGL /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define if you have the GNOME XML library */ #undef HAVE_LIBXML /* Define to 1 if you have the header file. */ #undef HAVE_MACH_MACH_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* PNG compilation OK */ #undef HAVE_PNG /* Define to 1 if you have the `pow' function. */ #undef HAVE_POW /* Define to 1 if the system has the type `ptrdiff_t'. */ #undef HAVE_PTRDIFF_T /* qhull compilation OK */ #undef HAVE_QHULL /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the `sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `sysinfo' function. */ #undef HAVE_SYSINFO /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Have got vigra headers */ #undef HAVE_VIGRA /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of `size_t', as computed by sizeof. */ #undef SIZEOF_SIZE_T /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* "Enable mgl2 support" */ #undef USE_MGL2 /* Version number of package */ #undef VERSION /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t 3Depict-0.0.19/m4/0000755000175000017500000000000012723200271012774 5ustar pcuserpcuser3Depict-0.0.19/m4/ax_compare_version.m40000644000175000017500000001465212716174467017154 0ustar pcuserpcuser# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_compare_version.html # =========================================================================== # # SYNOPSIS # # AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # # DESCRIPTION # # This macro compares two version strings. Due to the various number of # minor-version numbers that can exist, and the fact that string # comparisons are not compatible with numeric comparisons, this is not # necessarily trivial to do in a autoconf script. This macro makes doing # these comparisons easy. # # The six basic comparisons are available, as well as checking equality # limited to a certain number of minor-version levels. # # The operator OP determines what type of comparison to do, and can be one # of: # # eq - equal (test A == B) # ne - not equal (test A != B) # le - less than or equal (test A <= B) # ge - greater than or equal (test A >= B) # lt - less than (test A < B) # gt - greater than (test A > B) # # Additionally, the eq and ne operator can have a number after it to limit # the test to that number of minor versions. # # eq0 - equal up to the length of the shorter version # ne0 - not equal up to the length of the shorter version # eqN - equal up to N sub-version levels # neN - not equal up to N sub-version levels # # When the condition is true, shell commands ACTION-IF-TRUE are run, # otherwise shell commands ACTION-IF-FALSE are run. The environment # variable 'ax_compare_version' is always set to either 'true' or 'false' # as well. # # Examples: # # AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8]) # AX_COMPARE_VERSION([3.15],[lt],[3.15.8]) # # would both be true. # # AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8]) # AX_COMPARE_VERSION([3.15],[gt],[3.15.8]) # # would both be false. # # AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8]) # # would be true because it is only comparing two minor versions. # # AX_COMPARE_VERSION([3.15.7],[eq0],[3.15]) # # would be true because it is only comparing the lesser number of minor # versions of the two values. # # Note: The characters that separate the version numbers do not matter. An # empty string is the same as version 0. OP is evaluated by autoconf, not # configure, so must be a string, not a variable. # # The author would like to acknowledge Guido Draheim whose advice about # the m4_case and m4_ifvaln functions make this macro only include the # portions necessary to perform the specific comparison specified by the # OP argument in the final configure script. # # LICENSE # # Copyright (c) 2008 Tim Toolan # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 11 dnl ######################################################################### AC_DEFUN([AX_COMPARE_VERSION], [ AC_REQUIRE([AC_PROG_AWK]) # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. AS_VAR_PUSHDEF([A],[ax_compare_version_A]) A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` AS_VAR_PUSHDEF([B],[ax_compare_version_B]) B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary dnl # then the first line is used to determine if the condition is true. dnl # The sed right after the echo is to remove any indented white space. m4_case(m4_tolower($2), [lt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [gt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [le],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"` ], [ge],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"` ],[ dnl Split the operator from the subversion count if present. m4_bmatch(m4_substr($2,2), [0],[ # A count of zero means use the length of the shorter version. # Determine the number of characters in A and B. ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'` ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'` # Set A to no more than B's length and B to no more than A's length. A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"` B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"` ], [[0-9]+],[ # A count greater than zero means use only that many subversions A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` ], [.+],[ AC_WARNING( [illegal OP numeric parameter: $2]) ],[]) # Pad zeros at end of numbers to make same length. ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`" B="$B`echo $A | sed 's/./0/g'`" A="$ax_compare_version_tmp_A" # Check for equality or inequality as necessary. m4_case(m4_tolower(m4_substr($2,0,2)), [eq],[ test "x$A" = "x$B" && ax_compare_version=true ], [ne],[ test "x$A" != "x$B" && ax_compare_version=true ],[ AC_WARNING([illegal OP parameter: $2]) ]) ]) AS_VAR_POPDEF([A])dnl AS_VAR_POPDEF([B])dnl dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE. if test "$ax_compare_version" = "true" ; then m4_ifvaln([$4],[$4],[:])dnl m4_ifvaln([$5],[else $5])dnl fi ]) dnl AX_COMPARE_VERSION 3Depict-0.0.19/m4/ftgl.m40000644000175000017500000001202412640746376014214 0ustar pcuserpcuser dnl @synopsis AX_CHECK_FTGL dnl dnl Check for the existence of FTGL, if it is found create FTGL_CFLAGS and FTGL_LIBS to locate the directory in dnl which the FTGL files are located. When #including the headers, do *not* use , but rather dnl The FTGL flags will be updated to ensure that this ambiguitity is overcome this automatically. dnl dnl Finally FTGL checking does not include version compatability - as without pkg-config it is unclear how to check the version. dnl dnl Tested platforms : Mac OS X 10.4.6 with ftgl installed via fink, Fedora core 7 i386. Only gcc has been checked. Requires g++ of some sort dnl dnl This script requires the pkg.m4 file #This is broken without pkg-config!! # Allow user to pass a manual dir for FTGL # AC_ARG_WITH([ftgl-prefix], [--with-ftgl-prefix : specify prefix dir for FTGL], ftgl_prefix="$withval", ftgl_config_prefix="") # # allow for disabling the pkg-config check AC_ARG_WITH([ftgl-no-pkg], [--with-ftgl-no-pkg : don't use pkg-config to check for ftgl]) AC_DEFUN([AX_CHECK_FTGL], [ dnl AC_REQUIRE([PKG_CHECK_MODULES]) - I had to take this out, with it in it messes up confgure dnl as the PKG_CHECK_MODULES is expanded with no arguments. I dont want to expand it, I just dnl want to ensure that it is defined. never mind. AC_MSG_CHECKING([for ftgl]) FTGL_CFLAGS="" FTGL_LIBS="" if test "x$ftgl_prefix" != "x" ; then #use the supplied CFLAGS. assume LIBS FTGL_CFLAGS="-I$ftgl_prefix/include/ -L$ftgl_prefix/lib/" FTGL_LIBS="-lFTGL" else HAVE_PKG=$(basename $(which pkg-config)) if test $HAVE_PKG != x"pkg-config" ; then manual_ftgl="yes" ; fi if test "x$with_ftgl_no_pkg" = "xyes" ; then AC_DEFINE([FTGL_NO_PKG_CONFIG], [1], [Dont use pkg-config to locate ftgl]) #well the user doesn't want us to use pkg-config so dont. manual_ftgl=yes else if ! test x"$manual_ftgl" == x"yes" ; then # #Use PKG_CONFIG to do the heavy lifting, must be greater than 2.0.0 # PKG_CHECK_MODULES([FTGL], ftgl >= 2.0.0, [libftgl="yes"], [libftgl="no"]) #Check to see if pkg-config did the job if test "x$libftgl" = "xno" ; then #dang, looks like we have to try a manual approach manual_ftgl=yes ; fi fi fi fi if test "x$manual_ftgl" = "xyes" ; then CFLAGS_ORIG="$CFLAGS" LIBS_ORIG="$LIBS" LIBS="$LIBS $FTGL_LIBS $LDFLAGS" if test x$FTGL_LIBS == x"" ; then FTGL_LIBS="-lftgl" fi #TODO: see if we can put in some more manual tests for a few common locations for ftgl? AC_CHECK_LIB(ftgl, ftglCreateSimpleLayout, [], AC_MSG_ERROR([Couldnt find ftgl -- provide base dir or install pkg_config]),-lm) CFLAGS="$CFLAGS_ORIG" LIBS="$LIBS_ORIG" fi # # If we get this far, we assume that FTGL_CFLAGS and FTGL_LIBS is set # all that remains is to check to see if FTGL.h is in the CFLAGS dir or in # the FTGL subdir # dnl remember FTGL is a c++ library AC_LANG_PUSH(C++) save_CPPFLAGS=$CPPFLAGS CPPFLAGS=$FTGL_CFLAGS AC_TRY_CPP([#include ], [ ftgl_nodir=yes ], [ ftgl_nodir=no ]) if test "x$ftgl_nodir" != "xyes" ; then AC_TRY_CPP([#include ], [ ftgl_dir=yes ], [ ftgl_dir=no ]) if test "x$ftgl_dir" = "xyes" ; then dnl This test is broken. If FTGL is in a default GCC search path, then this will dnl fail. We should test this again with the new CFLAGS and see if it works. dnl finally we need to then test save_FTGL_CFLAGS=$FTGL_CFLAGS dnl Watch the gotcha, m4 appears ot process away the [] when parsing the dnl sed regexp #scrub the FTGL_CFLAGS for -I and then tack on /FTGL as needed FTGL_CFLAGS=`echo $FTGL_CFLAGS | sed -e 's/-I\([[a-z\\\/]]*\)/-I\1\/FTGL /'` CPPFLAGS=$FTGL_CFLAGS AC_TRY_CPP([#include ], [ ftgl_def_dir=yes ], [ ftgl_def_dir=no ]) if test "x$ftgl_def_dir" = "xno" ; then #try retrieving and modifying gcc's search dirs. - OMG Nasty hack! gcc #has no nice output for include dirs - sigh. got this from gcc-help, #then parsed with greps and tr GCC_SEARCHDIRS=`cpp -x c++ -Wp,-v /dev/null 2>&1 | grep -v ^\# | grep -v "End of search list." | grep -v "ignoring" | tr \\\n \\ ` ftgl_search_ok="no" for flag in $GCC_SEARCHDIRS do CPPFLAGS="-I$flag/FTGL/" AC_TRY_CPP([#include ], [ ftgl_def_dir=yes ], [ ftgl_def_dir=no ]) echo "Checking for FTGL.h in: $CPPFLAGS, result : $ftgl_def_dir" if test "x$ftgl_def_dir" = "xyes"; then ftgl_search_ok="yes" FTGL_CFLAGS="-I$flag/FTGL/" break fi done if test "x$ftgl_search_ok" = "xno"; then AC_MSG_ERROR([Unfortuntately whilst this script worked out that you have ftgl, it couldn't quite work out how to set the CFLAGS]) fi fi fi fi dnl return the cflags CPPFLAGS=$save_CPPFLAGS AC_LANG_POP([C++]) dnl # dnl # Also There can exist variations on the naming of the library, some use libFTGL other libftgl dnl # So check that and see if that needs fixing dnl # dnl dnl AC_TRY_LINK([#include ], dnl [ ftgl_lcase=yes ], [ ftgl_lcase=no ]) dnl dnl let configure know we are good to go AC_MSG_RESULT([ yes ]) AC_SUBST(FTGL_CFLAGS) AC_SUBST(FTGL_LIBS) ]) 3Depict-0.0.19/m4/gl.m40000644000175000017500000001312612640746376013666 0ustar pcuserpcuserdnl FTGL_CHECK_GL() dnl Check for OpenGL development environment and GLU >= 1.2 dnl AC_DEFUN([FTGL_CHECK_GL], [dnl AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_PATH_X]) AC_REQUIRE([AC_PATH_XTRA]) AC_ARG_WITH([--with-gl-inc], AC_HELP_STRING([--with-gl-inc=DIR],[Directory where GL/gl.h is installed])) AC_ARG_WITH([--with-gl-lib], AC_HELP_STRING([--with-gl-lib=DIR],[Directory where OpenGL libraries are installed])) AC_ARG_WITH([--with-glu-lib], AC_HELP_STRING([--with-glu-lib=DIR],[Directory where OpenGL GLU library is installed])) AC_LANG_SAVE AC_LANG_C GL_SAVE_CPPFLAGS="$CPPFLAGS" GL_SAVE_LIBS="$LIBS" if test "x$no_x" != xyes ; then GL_CFLAGS="$X_CFLAGS" GL_X_LIBS="$X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu $X_EXTRA_LIBS" fi if test "x$with_gl_inc" != "xnone" ; then if test -d "$with_gl_inc" ; then GL_CFLAGS="-I$with_gl_inc" else GL_CFLAGS="$with_gl_inc" fi else GL_CFLAGS= fi CPPFLAGS="$GL_CFLAGS" AC_CHECK_HEADER([GL/gl.h], [AC_DEFINE([HAVE_GL_GL_H], 1, [Define to 1 if you have the ], [glBegin(GL_POINTS)], [GL_DYLIB="/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib" FRAMEWORK_OPENGL="-Xlinker -framework -Xlinker OpenGL -dylib_file $GL_DYLIB: $GL_DYLIB" ac_cv_search_glBegin="$FRAMEWORK_OPENGL" AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no)]) if test x"$FRAMEWORK_OPENGL" != "x"; then with_gl_lib="$FRAMEWORK_OPENGL" fi AC_SUBST(FRAMEWORK_OPENGL) LIBS="$PRELIBS" AC_MSG_CHECKING([for GL library]) echo host=$host AS_CASE([$host], [*-mingw32], [GL_GL_LIBS="-lopengl32" GL_GLU_LIBS="-lglu32"], [GL_GL_LIBS="-lGL" GL_GLU_LIBS="-lGLU"] ) if test "x$with_gl_lib" != "x" ; then if test -d "$with_gl_lib" ; then LIBS="-L$with_gl_lib $GL_GL_LIBS" else LIBS="$with_gl_lib" fi else LIBS="$GL_GL_LIBS" fi AC_LINK_IFELSE([AC_LANG_CALL([],[glBegin])],[HAVE_GL=yes],[ dnl This is done here so that we can check for the Win32 version of the dnl GL library, which may not use cdecl calling convention. AC_TRY_LINK([#include ],[glBegin(GL_POINTS)],[HAVE_GL=yes],[HAVE_GL=no])] ) if test "x$HAVE_GL" = xno ; then if test "x$GL_X_LIBS" != x ; then LIBS="$GL_GL_LIBS $GL_X_LIBS" AC_LINK_IFELSE([AC_LANG_CALL([],[glBegin])],[HAVE_GL=yes], [HAVE_GL=no]) fi fi if test "x$HAVE_GL" = xyes ; then AC_MSG_RESULT([yes]) GL_LIBS=$LIBS else AC_MSG_RESULT([no]) AC_MSG_ERROR([GL library could not be found, please specify its location with --with-gl-lib. If this still fails, please contact henryj@paradise.net.nz, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind.]) fi AC_CHECK_HEADER([GL/glu.h], [AC_DEFINE([HAVE_GL_GLU_H], 1, [Define to 1 if you have the = 1.2]) AC_TRY_COMPILE([ #ifdef HAVE_GL_GLU_H # include #endif #ifdef HAVE_OPENGL_GLU_H # include #endif ], [ #if !defined(GLU_VERSION_1_2) #error GLU too old #endif ], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([GLU >= 1.2 is needed to compile this library]) ]) if test "x$FRAMEWORK_OPENGL" = "x" ; then AC_MSG_CHECKING([for GLU library]) if test "x$with_glu_lib" != "x" ; then if test -d "$with_glu_lib" ; then LIBS="$GL_LIBS -L$with_glu_lib $GL_GLU_LIBS" else LIBS="$GL_LIBS $with_glu_lib" fi else LIBS="$GL_LIBS $GL_GLU_LIBS" fi AC_LINK_IFELSE([AC_LANG_CALL([],[gluNewTess])],[HAVE_GLU=yes], [ dnl This is done here so that we can check for the Win32 version of the dnl GL library, which may not use cdecl calling convention. AC_TRY_LINK([#include ],[gluNewTess()],[HAVE_GLU=yes],[HAVE_GLU=no])] ) if test "x$HAVE_GLU" = xno ; then if test "x$GL_X_LIBS" != x ; then LIBS="$GL_GLU_LIBS $GL_LIBS $GL_X_LIBS" AC_LINK_IFELSE([AC_LANG_CALL([],[gluNewTess])],[HAVE_GLU=yes], [HAVE_GLU=no]) fi fi if test "x$HAVE_GLU" = xyes ; then AC_MSG_RESULT([yes]) GL_LIBS="$LIBS" else AC_MSG_RESULT([no]) AC_MSG_ERROR([GLU library could not be found, please specify its location with --with-gl-lib. If this still fails, please contact henryj@paradise.net.nz, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind.]) fi fi AC_SUBST(GL_CFLAGS) AC_SUBST(GL_LIBS) CPPFLAGS="$GL_SAVE_CPPFLAGS" LIBS="$GL_SAVE_LIBS" AC_LANG_RESTORE GL_X_LIBS="" ]) 3Depict-0.0.19/m4/wxwin.m40000644000175000017500000003022112640746376014433 0ustar pcuserpcuserdnl --------------------------------------------------------------------------- dnl Macros for wxWidgets detection. Typically used in configure.in as: dnl dnl AC_ARG_ENABLE(...) dnl AC_ARG_WITH(...) dnl ... dnl AM_OPTIONS_WXCONFIG dnl ... dnl ... dnl AM_PATH_WXCONFIG(2.6.0, wxWin=1) dnl if test "$wxWin" != 1; then dnl AC_MSG_ERROR([ dnl wxWidgets must be installed on your system dnl but wx-config script couldn't be found. dnl dnl Please check that wx-config is in path, the directory dnl where wxWidgets libraries are installed (returned by dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or dnl equivalent variable and wxWidgets version is 2.3.4 or above. dnl ]) dnl fi dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" dnl dnl LIBS="$LIBS $WX_LIBS" dnl --------------------------------------------------------------------------- dnl --------------------------------------------------------------------------- dnl AM_OPTIONS_WXCONFIG dnl dnl adds support for --wx-prefix, --wx-exec-prefix, --with-wxdir and dnl --wx-config command line options dnl --------------------------------------------------------------------------- AC_DEFUN([AM_OPTIONS_WXCONFIG], [ AC_ARG_WITH(wxdir, [ --with-wxdir=PATH Use uninstalled version of wxWidgets in PATH], [ wx_config_name="$withval/wx-config" wx_config_args="--inplace"]) AC_ARG_WITH(wx-config, [ --with-wx-config=CONFIG wx-config script to use (optional)], wx_config_name="$withval" ) AC_ARG_WITH(wx-prefix, [ --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional)], wx_config_prefix="$withval", wx_config_prefix="") AC_ARG_WITH(wx-exec-prefix, [ --with-wx-exec-prefix=PREFIX Exec prefix where wxWidgets is installed (optional)], wx_config_exec_prefix="$withval", wx_config_exec_prefix="") ]) dnl Helper macro for checking if wx version is at least $1.$2.$3, set's dnl wx_ver_ok=yes if it is: AC_DEFUN([_WX_PRIVATE_CHECK_VERSION], [ wx_ver_ok="" if test "x$WX_VERSION" != x ; then if test $wx_config_major_version -gt $1; then wx_ver_ok=yes else if test $wx_config_major_version -eq $1; then if test $wx_config_minor_version -gt $2; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $2; then if test $wx_config_micro_version -ge $3; then wx_ver_ok=yes fi fi fi fi fi fi ]) dnl --------------------------------------------------------------------------- dnl AM_PATH_WXCONFIG(VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND dnl [, WX-LIBS [, ADDITIONAL-WX-CONFIG-FLAGS]]]]) dnl dnl Test for wxWidgets, and define WX_C*FLAGS, WX_LIBS and WX_LIBS_STATIC dnl (the latter is for static linking against wxWidgets). Set WX_CONFIG_NAME dnl environment variable to override the default name of the wx-config script dnl to use. Set WX_CONFIG_PATH to specify the full path to wx-config - in this dnl case the macro won't even waste time on tests for its existence. dnl dnl Optional WX-LIBS argument contains comma- or space-separated list of dnl wxWidgets libraries to link against (it may include contrib libraries). If dnl it is not specified then WX_LIBS and WX_LIBS_STATIC will contain flags to dnl link with all of the core wxWidgets libraries. dnl dnl Optional ADDITIONAL-WX-CONFIG-FLAGS argument is appended to wx-config dnl invocation command in present. It can be used to fine-tune lookup of dnl best wxWidgets build available. dnl dnl Example use: dnl AM_PATH_WXCONFIG([2.6.0], [wxWin=1], [wxWin=0], [html,core,net] dnl [--unicode --debug]) dnl --------------------------------------------------------------------------- dnl dnl Get the cflags and libraries from the wx-config script dnl AC_DEFUN([AM_PATH_WXCONFIG], [ dnl do we have wx-config name: it can be wx-config or wxd-config or ... if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi dnl deal with optional prefixes if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi dnl don't search the PATH if WX_CONFIG_NAME is absolute filename if test -x "$WX_CONFIG_NAME" ; then AC_MSG_CHECKING(for wx-config) WX_CONFIG_PATH="$WX_CONFIG_NAME" AC_MSG_RESULT($WX_CONFIG_PATH) else AC_PATH_PROG(WX_CONFIG_PATH, $WX_CONFIG_NAME, no, "$WX_LOOKUP_PATH:$PATH") fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION="" min_wx_version=ifelse([$1], ,2.2.1,$1) if test -z "$5" ; then AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version]) else AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version ($5)]) fi WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args $5 $4" WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` _WX_PRIVATE_CHECK_VERSION([$wx_requested_major_version], [$wx_requested_minor_version], [$wx_requested_micro_version]) if test -n "$wx_ver_ok"; then AC_MSG_RESULT(yes (version $WX_VERSION)) WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs` dnl is this even still appropriate? --static is a real option now dnl and WX_CONFIG_WITH_ARGS is likely to contain it if that is dnl what the user actually wants, making this redundant at best. dnl For now keep it in case anyone actually used it in the past. AC_MSG_CHECKING([for wxWidgets static library]) WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null` if test "x$WX_LIBS_STATIC" = "x"; then AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi dnl starting with version 2.2.6 wx-config has --cppflags argument wx_has_cppflags="" if test $wx_config_major_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_minor_version -eq 2; then if test $wx_config_micro_version -ge 6; then wx_has_cppflags=yes fi fi fi fi fi dnl starting with version 2.7.0 wx-config has --rescomp option wx_has_rescomp="" if test $wx_config_major_version -gt 2; then wx_has_rescomp=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -ge 7; then wx_has_rescomp=yes fi fi fi if test "x$wx_has_rescomp" = x ; then dnl cannot give any useful info for resource compiler WX_RESCOMP= else WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` fi if test "x$wx_has_cppflags" = x ; then dnl no choice but to define all flags like CFLAGS WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CPPFLAGS=$WX_CFLAGS WX_CXXFLAGS=$WX_CFLAGS WX_CFLAGS_ONLY=$WX_CFLAGS WX_CXXFLAGS_ONLY=$WX_CFLAGS else dnl we have CPPFLAGS included in CFLAGS included in CXXFLAGS WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi ifelse([$2], , :, [$2]) else if test "x$WX_VERSION" = x; then dnl no wx-config at all AC_MSG_RESULT(no) else AC_MSG_RESULT(no (version $WX_VERSION is not new enough)) fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" ifelse([$3], , :, [$3]) fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" ifelse([$3], , :, [$3]) fi AC_SUBST(WX_CPPFLAGS) AC_SUBST(WX_CFLAGS) AC_SUBST(WX_CXXFLAGS) AC_SUBST(WX_CFLAGS_ONLY) AC_SUBST(WX_CXXFLAGS_ONLY) AC_SUBST(WX_LIBS) AC_SUBST(WX_LIBS_STATIC) AC_SUBST(WX_VERSION) AC_SUBST(WX_RESCOMP) ]) dnl --------------------------------------------------------------------------- dnl Get information on the wxrc program for making C++, Python and xrs dnl resource files. dnl dnl AC_ARG_ENABLE(...) dnl AC_ARG_WITH(...) dnl ... dnl AM_OPTIONS_WXCONFIG dnl ... dnl AM_PATH_WXCONFIG(2.6.0, wxWin=1) dnl if test "$wxWin" != 1; then dnl AC_MSG_ERROR([ dnl wxWidgets must be installed on your system dnl but wx-config script couldn't be found. dnl dnl Please check that wx-config is in path, the directory dnl where wxWidgets libraries are installed (returned by dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or dnl equivalent variable and wxWidgets version is 2.6.0 or above. dnl ]) dnl fi dnl dnl AM_PATH_WXRC([HAVE_WXRC=1], [HAVE_WXRC=0]) dnl if test "x$HAVE_WXRC" != x1; then dnl AC_MSG_ERROR([ dnl The wxrc program was not installed or not found. dnl dnl Please check the wxWidgets installation. dnl ]) dnl fi dnl dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" dnl dnl LDFLAGS="$LDFLAGS $WX_LIBS" dnl --------------------------------------------------------------------------- dnl --------------------------------------------------------------------------- dnl AM_PATH_WXRC([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl dnl Test for wxWidgets' wxrc program for creating either C++, Python or XRS dnl resources. The variable WXRC will be set and substituted in the configure dnl script and Makefiles. dnl dnl Example use: dnl AM_PATH_WXRC([wxrc=1], [wxrc=0]) dnl --------------------------------------------------------------------------- dnl dnl wxrc program from the wx-config script dnl AC_DEFUN([AM_PATH_WXRC], [ AC_ARG_VAR([WXRC], [Path to wxWidget's wxrc resource compiler]) if test "x$WX_CONFIG_NAME" = x; then AC_MSG_ERROR([The wxrc tests must run after wxWidgets test.]) else AC_MSG_CHECKING([for wxrc]) if test "x$WXRC" = x ; then dnl wx-config --utility is a new addition to wxWidgets: _WX_PRIVATE_CHECK_VERSION(2,5,3) if test -n "$wx_ver_ok"; then WXRC=`$WX_CONFIG_WITH_ARGS --utility=wxrc` fi fi if test "x$WXRC" = x ; then AC_MSG_RESULT([not found]) ifelse([$2], , :, [$2]) else AC_MSG_RESULT([$WXRC]) ifelse([$1], , :, [$1]) fi AC_SUBST(WXRC) fi ]) 3Depict-0.0.19/m4/gsl.m40000644000175000017500000001174312640746376014054 0ustar pcuserpcuser# Configure path for the GNU Scientific Library # Christopher R. Gabriel , April 2000 AC_DEFUN([AX_PATH_GSL], [ AC_ARG_WITH(gsl-prefix,[ --with-gsl-prefix=PFX Prefix where GSL is installed (optional)], gsl_prefix="$withval", gsl_prefix="") AC_ARG_WITH(gsl-exec-prefix,[ --with-gsl-exec-prefix=PFX Exec prefix where GSL is installed (optional)], gsl_exec_prefix="$withval", gsl_exec_prefix="") AC_ARG_ENABLE(gsltest, [ --disable-gsltest Do not try to compile and run a test GSL program], , enable_gsltest=yes) if test "x${GSL_CONFIG+set}" != xset ; then if test "x$gsl_prefix" != x ; then GSL_CONFIG="$gsl_prefix/bin/gsl-config" fi if test "x$gsl_exec_prefix" != x ; then GSL_CONFIG="$gsl_exec_prefix/bin/gsl-config" fi fi AC_PATH_PROG(GSL_CONFIG, gsl-config, no) min_gsl_version=ifelse([$1], ,0.2.5,$1) AC_MSG_CHECKING(for GSL - version >= $min_gsl_version) no_gsl="" if test "$GSL_CONFIG" = "no" ; then no_gsl=yes else GSL_CFLAGS=`$GSL_CONFIG --cflags` GSL_LIBS=`$GSL_CONFIG --libs` gsl_major_version=`$GSL_CONFIG --version | \ sed 's/^\([[0-9]]*\).*/\1/'` if test "x${gsl_major_version}" = "x" ; then gsl_major_version=0 fi gsl_minor_version=`$GSL_CONFIG --version | \ sed 's/^\([[0-9]]*\)\.\{0,1\}\([[0-9]]*\).*/\2/'` if test "x${gsl_minor_version}" = "x" ; then gsl_minor_version=0 fi gsl_micro_version=`$GSL_CONFIG --version | \ sed 's/^\([[0-9]]*\)\.\{0,1\}\([[0-9]]*\)\.\{0,1\}\([[0-9]]*\).*/\3/'` if test "x${gsl_micro_version}" = "x" ; then gsl_micro_version=0 fi if test "x$enable_gsltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GSL_CFLAGS" LIBS="$LIBS $GSL_LIBS" rm -f conf.gsltest AC_TRY_RUN([ #include #include #include char* my_strdup (const char *str); char* my_strdup (const char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (void) { int major = 0, minor = 0, micro = 0; int n; char *tmp_version; system ("touch conf.gsltest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_gsl_version"); n = sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) ; if (n != 2 && n != 3) { printf("%s, bad version string\n", "$min_gsl_version"); exit(1); } if (($gsl_major_version > major) || (($gsl_major_version == major) && ($gsl_minor_version > minor)) || (($gsl_major_version == major) && ($gsl_minor_version == minor) && ($gsl_micro_version >= micro))) { exit(0); } else { exit(1); } } ],, no_gsl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_gsl" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$GSL_CONFIG" = "no" ; then echo "*** The gsl-config script installed by GSL could not be found" echo "*** If GSL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the GSL_CONFIG environment variable to the" echo "*** full path to gsl-config." else if test -f conf.gsltest ; then : else echo "*** Could not run GSL test program, checking why..." CFLAGS="$CFLAGS $GSL_CFLAGS" LIBS="$LIBS $GSL_LIBS" AC_TRY_LINK([ #include ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GSL or finding the wrong" echo "*** version of GSL. If it is not finding GSL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GSL was incorrectly installed" echo "*** or that you have moved GSL since it was installed. In the latter case, you" echo "*** may want to edit the gsl-config script: $GSL_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi # GSL_CFLAGS="" # GSL_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(GSL_CFLAGS) AC_SUBST(GSL_LIBS) rm -f conf.gsltest ]) AU_ALIAS([AM_PATH_GSL], [AX_PATH_GSL]) 3Depict-0.0.19/m4/opengl.m40000644000175000017500000001163512640746376014553 0ustar pcuserpcuserdnl @synopsis AX_CHECK_GL dnl dnl Check for an OpenGL implementation. If GL is found, the required compiler dnl and linker flags are included in the output variables "GL_CFLAGS" and dnl "GL_LIBS", respectively. This macro adds the configure option dnl "--with-apple-opengl-framework", which users can use to indicate that dnl Apple's OpenGL framework should be used on Mac OS X. If Apple's OpenGL dnl framework is used, the symbol "HAVE_APPLE_OPENGL_FRAMEWORK" is defined. If dnl no GL implementation is found, "no_gl" is set to "yes". dnl dnl @copyright (C) 2003 Braden McDaniel dnl @license GNU GPL dnl @version 1.5 dnl @author Braden McDaniel dnl AC_DEFUN([AX_CHECK_GL], [ AC_REQUIRE([AC_PATH_X])dnl dnl AC_REQUIRE([ACX_PTHREAD])dnl # # There isn't a reliable way to know we should use the Apple OpenGL framework # without a configure option. A Mac OS X user may have installed an # alternative GL implementation (e.g., Mesa), which may or may not depend on X. # AC_ARG_WITH([apple-opengl-framework], [AC_HELP_STRING([--with-apple-opengl-framework], [use Apple OpenGL framework (Mac OS X only)])]) if test "X$with_apple_opengl_framework" = "Xyes"; then AC_DEFINE([HAVE_APPLE_OPENGL_FRAMEWORK], [1], [Use the Apple OpenGL framework.]) GL_CFLAGS="-framework OpenGL" else GL_CFLAGS="${PTHREAD_CFLAGS}" GL_LIBS="${PTHREAD_LIBS} -lm" # # Use x_includes and x_libraries if they have been set (presumably by # AC_PATH_X). # if test "X$no_x" != "Xyes"; then if test -n "$x_includes"; then GL_CFLAGS="-I${x_includes} ${GL_CFLAGS}" fi if test -n "$x_libraries"; then GL_LIBS="-L${x_libraries} -lX11 ${GL_LIBS}" fi fi AC_LANG_PUSH(C) AC_CHECK_HEADERS([windows.h]) AC_CACHE_CHECK([for OpenGL library], [ax_cv_check_gl_libgl], [ax_cv_check_gl_libgl="no" ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" LIBS="" ax_check_libs="-lopengl32 -lGL" for ax_lib in ${ax_check_libs}; do if test "X$CC" = "Xcl"; then ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'` else ax_try_lib="${ax_lib}" fi LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}" AC_TRY_LINK([ # if HAVE_WINDOWS_H && defined(_WIN32) # include # endif # include ], [glBegin(0)], [ax_cv_check_gl_libgl="${ax_try_lib}"; break]) done LIBS=${ax_save_LIBS} CPPFLAGS=${ax_save_CPPFLAGS}]) if test "X${ax_cv_check_gl_libgl}" = "Xno"; then no_gl="yes" GL_CFLAGS="" GL_LIBS="" else GL_LIBS="${ax_cv_check_gl_libgl} ${GL_LIBS}" fi AC_LANG_POP(C) fi AC_SUBST([GL_CFLAGS]) AC_SUBST([GL_LIBS]) ])dnl dnl @synopsis AX_CHECK_GLU dnl dnl Check for GLU. If GLU is found, the required preprocessor and linker flags dnl are included in the output variables "GLU_CFLAGS" and "GLU_LIBS", dnl respectively. This macro adds the configure option dnl "--with-apple-opengl-framework", which users can use to indicate that dnl Apple's OpenGL framework should be used on Mac OS X. If Apple's OpenGL dnl framework is used, the symbol "HAVE_APPLE_OPENGL_FRAMEWORK" is defined. If dnl no GLU implementation is found, "no_glu" is set to "yes". dnl dnl @copyright (C) 2003 Braden McDaniel dnl @license GNU GPL dnl @version 1.0 dnl @author Braden McDaniel dnl AC_DEFUN([AX_CHECK_GLU], [AC_REQUIRE([AX_CHECK_GL])dnl GLU_CFLAGS="${GL_CFLAGS}" if test "X${with_apple_opengl_framework}" != "Xyes"; then AC_CACHE_CHECK([for OpenGL Utility library], [ax_cv_check_glu_libglu], [ax_cv_check_glu_libglu="no" ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" LIBS="" ax_check_libs="-lglu32 -lGLU" for ax_lib in ${ax_check_libs}; do if test "X$CC" = "Xcl"; then ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'` else ax_try_lib="${ax_lib}" fi LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}" # # libGLU typically links with libstdc++ on POSIX platforms. However, # setting the language to C++ means that test program source is named # "conftest.cc"; and Microsoft cl doesn't know what to do with such a # file. # if test "X$CXX" != "Xcl"; then AC_LANG_PUSH([C++]) fi AC_TRY_LINK([ # if HAVE_WINDOWS_H && defined(_WIN32) # include # endif # include ], [gluBeginCurve(0)], [ax_cv_check_glu_libglu="${ax_try_lib}"; break]) if test "X$CXX" != "Xcl"; then AC_LANG_POP([C++]) fi done LIBS=${ax_save_LIBS} CPPFLAGS=${ax_save_CPPFLAGS}]) if test "X${ax_cv_check_glu_libglu}" = "Xno"; then no_gl="yes" GLU_CFLAGS="" GLU_LIBS="" else GLU_LIBS="${ax_cv_check_glu_libglu} ${GL_LIBS}" fi fi AC_SUBST([GLU_CFLAGS]) AC_SUBST([GLU_LIBS]) ])3Depict-0.0.19/m4/libxml2.m40000644000175000017500000001731012640746376014634 0ustar pcuserpcuser# Configure paths for LIBXML2 # Mike Hommey 2004-06-19 # use CPPFLAGS instead of CFLAGS # Toshio Kuratomi 2001-04-21 # Adapted from: # Configure paths for GLIB # Owen Taylor 97-11-3 dnl AM_PATH_XML2([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for XML, and define XML_CPPFLAGS and XML_LIBS dnl AC_DEFUN([AM_PATH_XML2],[ AC_ARG_WITH(xml-prefix, [ --with-xml-prefix=PFX Prefix where libxml is installed (optional)], xml_config_prefix="$withval", xml_config_prefix="") AC_ARG_WITH(xml-exec-prefix, [ --with-xml-exec-prefix=PFX Exec prefix where libxml is installed (optional)], xml_config_exec_prefix="$withval", xml_config_exec_prefix="") AC_ARG_ENABLE(xmltest, [ --disable-xmltest Do not try to compile and run a test LIBXML program],, enable_xmltest=yes) if test x$xml_config_exec_prefix != x ; then xml_config_args="$xml_config_args" if test x${XML2_CONFIG+set} != xset ; then XML2_CONFIG=$xml_config_exec_prefix/bin/xml2-config fi fi if test x$xml_config_prefix != x ; then xml_config_args="$xml_config_args --prefix=$xml_config_prefix" if test x${XML2_CONFIG+set} != xset ; then XML2_CONFIG=$xml_config_prefix/bin/xml2-config fi fi AC_PATH_PROG(XML2_CONFIG, xml2-config, no) min_xml_version=ifelse([$1], ,2.0.0,[$1]) AC_MSG_CHECKING(for libxml - version >= $min_xml_version) no_xml="" if test "$XML2_CONFIG" = "no" ; then no_xml=yes else XML_CPPFLAGS=`$XML2_CONFIG $xml_config_args --cflags` XML_LIBS=`$XML2_CONFIG $xml_config_args --libs` xml_config_major_version=`$XML2_CONFIG $xml_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` xml_config_minor_version=`$XML2_CONFIG $xml_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` xml_config_micro_version=`$XML2_CONFIG $xml_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_xmltest" = "xyes" ; then ac_save_CPPFLAGS="$CPPFLAGS" ac_save_LIBS="$LIBS" CPPFLAGS="$CPPFLAGS $XML_CPPFLAGS" LIBS="$XML_LIBS $LIBS" dnl dnl Now check if the installed libxml is sufficiently new. dnl (Also sanity checks the results of xml2-config to some extent) dnl rm -f conf.xmltest AC_TRY_RUN([ #include #include #include #include int main() { int xml_major_version, xml_minor_version, xml_micro_version; int major, minor, micro; char *tmp_version; system("touch conf.xmltest"); /* Capture xml2-config output via autoconf/configure variables */ /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = (char *)strdup("$min_xml_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string from xml2-config\n", "$min_xml_version"); exit(1); } free(tmp_version); /* Capture the version information from the header files */ tmp_version = (char *)strdup(LIBXML_DOTTED_VERSION); if (sscanf(tmp_version, "%d.%d.%d", &xml_major_version, &xml_minor_version, &xml_micro_version) != 3) { printf("%s, bad version string from libxml includes\n", "LIBXML_DOTTED_VERSION"); exit(1); } free(tmp_version); /* Compare xml2-config output to the libxml headers */ if ((xml_major_version != $xml_config_major_version) || (xml_minor_version != $xml_config_minor_version) || (xml_micro_version != $xml_config_micro_version)) { printf("*** libxml header files (version %d.%d.%d) do not match\n", xml_major_version, xml_minor_version, xml_micro_version); printf("*** xml2-config (version %d.%d.%d)\n", $xml_config_major_version, $xml_config_minor_version, $xml_config_micro_version); return 1; } /* Compare the headers to the library to make sure we match */ /* Less than ideal -- doesn't provide us with return value feedback, * only exits if there's a serious mismatch between header and library. */ LIBXML_TEST_VERSION; /* Test that the library is greater than our minimum version */ if ((xml_major_version > major) || ((xml_major_version == major) && (xml_minor_version > minor)) || ((xml_major_version == major) && (xml_minor_version == minor) && (xml_micro_version >= micro))) { return 0; } else { printf("\n*** An old version of libxml (%d.%d.%d) was found.\n", xml_major_version, xml_minor_version, xml_micro_version); printf("*** You need a version of libxml newer than %d.%d.%d. The latest version of\n", major, minor, micro); printf("*** libxml is always available from ftp://ftp.xmlsoft.org.\n"); printf("***\n"); printf("*** If you have already installed a sufficiently new version, this error\n"); printf("*** probably means that the wrong copy of the xml2-config shell script is\n"); printf("*** being found. The easiest way to fix this is to remove the old version\n"); printf("*** of LIBXML, but you can also set the XML2_CONFIG environment to point to the\n"); printf("*** correct copy of xml2-config. (In this case, you will have to\n"); printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); printf("*** so that the correct libraries are found at run-time))\n"); } return 1; } ],, no_xml=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CPPFLAGS="$ac_save_CPPFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_xml" = x ; then AC_MSG_RESULT(yes (version $xml_config_major_version.$xml_config_minor_version.$xml_config_micro_version)) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$XML2_CONFIG" = "no" ; then echo "*** The xml2-config script installed by LIBXML could not be found" echo "*** If libxml was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the XML2_CONFIG environment variable to the" echo "*** full path to xml2-config." else if test -f conf.xmltest ; then : else echo "*** Could not run libxml test program, checking why..." CPPFLAGS="$CPPFLAGS $XML_CPPFLAGS" LIBS="$LIBS $XML_LIBS" AC_TRY_LINK([ #include #include ], [ LIBXML_TEST_VERSION; return 0;], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding LIBXML or finding the wrong" echo "*** version of LIBXML. If it is not finding LIBXML, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means LIBXML was incorrectly installed" echo "*** or that you have moved LIBXML since it was installed. In the latter case, you" echo "*** may want to edit the xml2-config script: $XML2_CONFIG" ]) CPPFLAGS="$ac_save_CPPFLAGS" LIBS="$ac_save_LIBS" fi fi XML_CPPFLAGS="" XML_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(XML_CPPFLAGS) AC_SUBST(XML_LIBS) rm -f conf.xmltest ]) 3Depict-0.0.19/m4/freetype2.m40000644000175000017500000001431212640746376015167 0ustar pcuserpcuser# Configure paths for FreeType2 # Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor # # Copyright 2001, 2003, 2007, 2009 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, # and distributed under the terms of the FreeType project license, # LICENSE.TXT. By continuing to use, modify, or distribute this file you # indicate that you have read the license and understand and accept it # fully. # # As a special exception to the FreeType project license, this file may be # distributed as part of a program that contains a configuration script # generated by Autoconf, under the same distribution terms as the rest of # that program. # # serial 3 # AC_CHECK_FT2([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) # Test for FreeType 2, and define FT2_CFLAGS and FT2_LIBS. # MINIMUM-VERSION is what libtool reports; the default is `7.0.1' (this is # FreeType 2.0.4). # AC_DEFUN([AC_CHECK_FT2], [# Get the cflags and libraries from the freetype-config script # AC_ARG_WITH([ft-prefix], dnl don't quote AS_HELP_STRING! AS_HELP_STRING([--with-ft-prefix=PREFIX], [Prefix where FreeType is installed (optional)]), [ft_config_prefix="$withval"], [ft_config_prefix=""]) AC_ARG_WITH([ft-exec-prefix], dnl don't quote AS_HELP_STRING! AS_HELP_STRING([--with-ft-exec-prefix=PREFIX], [Exec prefix where FreeType is installed (optional)]), [ft_config_exec_prefix="$withval"], [ft_config_exec_prefix=""]) AC_ARG_ENABLE([freetypetest], dnl don't quote AS_HELP_STRING! AS_HELP_STRING([--disable-freetypetest], [Do not try to compile and run a test FreeType program]), [], [enable_fttest=yes]) if test x$ft_config_exec_prefix != x ; then ft_config_args="$ft_config_args --exec-prefix=$ft_config_exec_prefix" if test x${FT2_CONFIG+set} != xset ; then FT2_CONFIG=$ft_config_exec_prefix/bin/freetype-config fi fi if test x$ft_config_prefix != x ; then ft_config_args="$ft_config_args --prefix=$ft_config_prefix" if test x${FT2_CONFIG+set} != xset ; then FT2_CONFIG=$ft_config_prefix/bin/freetype-config fi fi if test "x$FT2_CONFIG" = x ; then AC_PATH_PROG([FT2_CONFIG], [freetype-config], [no]) fi min_ft_version=m4_if([$1], [], [7.0.1], [$1]) AC_MSG_CHECKING([for FreeType -- version >= $min_ft_version]) no_ft="" if test "$FT2_CONFIG" = "no" ; then no_ft=yes else FT2_CFLAGS=`$FT2_CONFIG $ft_config_args --cflags` FT2_LIBS=`$FT2_CONFIG $ft_config_args --libs` ft_config_major_version=`$FT2_CONFIG $ft_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` ft_config_minor_version=`$FT2_CONFIG $ft_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` ft_config_micro_version=`$FT2_CONFIG $ft_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` ft_min_major_version=`echo $min_ft_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` ft_min_minor_version=`echo $min_ft_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` ft_min_micro_version=`echo $min_ft_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test x$enable_fttest = xyes ; then ft_config_is_lt="" if test $ft_config_major_version -lt $ft_min_major_version ; then ft_config_is_lt=yes else if test $ft_config_major_version -eq $ft_min_major_version ; then if test $ft_config_minor_version -lt $ft_min_minor_version ; then ft_config_is_lt=yes else if test $ft_config_minor_version -eq $ft_min_minor_version ; then if test $ft_config_micro_version -lt $ft_min_micro_version ; then ft_config_is_lt=yes fi fi fi fi fi if test x$ft_config_is_lt = xyes ; then no_ft=yes else ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $FT2_CFLAGS" LIBS="$FT2_LIBS $LIBS" # # Sanity checks for the results of freetype-config to some extent. # AC_RUN_IFELSE([ AC_LANG_SOURCE([[ #include #include FT_FREETYPE_H #include #include int main() { FT_Library library; FT_Error error; error = FT_Init_FreeType(&library); if (error) return 1; else { FT_Done_FreeType(library); return 0; } } ]]) ], [], [no_ft=yes], [echo $ECHO_N "cross compiling; assuming OK... $ECHO_C"]) CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi # test $ft_config_version -lt $ft_min_version fi # test x$enable_fttest = xyes fi # test "$FT2_CONFIG" = "no" if test x$no_ft = x ; then AC_MSG_RESULT([yes]) m4_if([$2], [], [:], [$2]) else AC_MSG_RESULT([no]) if test "$FT2_CONFIG" = "no" ; then AC_MSG_WARN([ The freetype-config script installed by FreeType 2 could not be found. If FreeType 2 was installed in PREFIX, make sure PREFIX/bin is in your path, or set the FT2_CONFIG environment variable to the full path to freetype-config. ]) else if test x$ft_config_is_lt = xyes ; then AC_MSG_WARN([ Your installed version of the FreeType 2 library is too old. If you have different versions of FreeType 2, make sure that correct values for --with-ft-prefix or --with-ft-exec-prefix are used, or set the FT2_CONFIG environment variable to the full path to freetype-config. ]) else AC_MSG_WARN([ The FreeType test program failed to run. If your system uses shared libraries and they are installed outside the normal system library path, make sure the variable LD_LIBRARY_PATH (or whatever is appropriate for your system) is correctly set. ]) fi fi FT2_CFLAGS="" FT2_LIBS="" m4_if([$3], [], [:], [$3]) fi AC_SUBST([FT2_CFLAGS]) AC_SUBST([FT2_LIBS])]) # end of freetype2.m4 3Depict-0.0.19/config.rpath0000644000175000017500000000000012640746376014772 0ustar pcuserpcuser3Depict-0.0.19/TODO0000644000175000017500000001126612721022606013154 0ustar pcuserpcuserTODO List - worlds simplest bugtracking system --Packaging-- --Main app-- To Implement: == Next version == * Voxelisation filter should not show ions disabled in upstream range * VTK voxel data export UI * Bounding box tick values could be improved - scientific notation, better font size control, absol. coords, etc * Mesh generation/operation? - This is tricky. I don't have a good mesh library * Proxigram? * Theoretical distributions are missing from the binomial algorithm == Eventually == * Update to qhull 2015's qhull_r (reentrant qhull). - This requires some refactoring of the doHull wrapper for convex hull computation * Voxel export dialog * OPS and other 3DAP formats reader? * Polynomial error estimator in graph * Shear-warp volume render mode for voxels - This can be broken into two useful stages (1) transfer function editor, could be tested with point cloud mode (2) Volume render code (check out SMVIS, Author gave perm. under GPLv3+) * Ion exchange/explode filter * DTD (Document type descriptor) for state files, to specify a consistent statefile structure - How to ensure version compatibility in future state files? * Voxelisation filter needs progress * Better progress during cluster ranging * Billboard text * Camera animation control (slerp?) * Range file drag/drop ignores drop coordinates; this could be useful in trying to interpret where the user wants to drop the object * Plots cannot currently be updated on name change. Need to add "needUpdate" to setUserString * Isotope overlay in normal spectra - Include full atomic species eg 57^Fe18^O in label Outstanding bugs: == Next release== * Composition profile progress bad == Eventually== * Cluster filter wont save state correctly if parent rangefile has disabled ions. It will output incorrect number of enabled ions, and get wiped during next ::initFilter * Lighting calculations on isosurfaces can be problematic. See example package * Select an X-Y crop, camera coords, on a dataset, then view target (-9.14237,-0.995174,83.2904) origin (188.23,-0.995174,83.2904). Now press ctrl+space. Note dataset disappears until mouse motion. This is due to camera up vector not being updated, I suspect. * 3D Text bounding boxes are wrong. OSX: * drag drop not working? == Needs reproducing == Auditing: == Next release == Performance: * Scene is sometimes continuously refreshed during post effects, causing CPU usage to max out. * Clipping sphere/cylinder does BB test? (only useful if we have bb cache) * Pos limit loader could alter its behaviour when sampling rates some percentage to be determined (load file, skip buffer). * Clustering can now be paralellised. - consider implementing/using sphere grab algorithm, which is much faster * Examine performance characteristics of HULL_GRAB in ioninfo * Conversion of double axis-angle rotations to single axis angle rotations - any value here? - Use TRIAD/ Wahba's problem to solve. Should be a lot faster? Misc: -- Refactor/cleanup -- * read/write xml could have default reader/writer routines Variables could be registered, then an order independant parser could be used to "vacuum" most of the data. Bounds/corretness checking could be used thereafter, and fallback to traditional xml tree traversal could be done after that * Plotting code is a nightmare. Data model for plot.h is not very well thought out, leading to large duplication, and elaborate special-case-ing - Plots need log/non-log axes - Plots need to be connected/disconnected - Plots need to be able to specify bounding boxes separate from their data - This would aid things like bar plots, pie charts - Plots need to be able to set strings/legends - There is little diference between plot1D and plot2D, really. - Error bar handling is a bit of a hack. Error generation should be moved to filters * work out which inline FIXMEs and TODOs are still valid, and need attention * K3DTree currently requires public access to members of boundcube * Enums should be, where possible, moved into their relevant class' namespace * Better error code behaviour for filters. There is a lot of needless duplication -- Deprecate -- * On Minor version change: - DataLoadFilter::readState(...) -> doSample test for statefiles without doSample. - 3Depict versions prior to 1207:2a01b7e83d75 - VoxeliseFilter::readState(...) -> axial slice read will be silently skipped if it is missing - 3Depict versions <= 1628:ffa0b851e966 don't know about this element - Annotation XML element "sphereanglesize" name doesn't match its purpose, and needs to be renamed "spheremarkersize" 3Depict-0.0.19/configure0000755000175000017500000104231312723165556014407 0ustar pcuserpcuser#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for 3Depict 0.0.19. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='3Depict' PACKAGE_TARNAME='3depict' PACKAGE_VERSION='0.0.19' PACKAGE_STRING='3Depict 0.0.19' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS DEBUG_FLAGS OPENMP_FLAGS GETTEXT_LIBS GSL_LIBS GSL_CFLAGS GSL_CONFIG MGL_LIBS MGL_CFLAGS RANLIB LN_S GL_LIBS PNG_LIBS PNG_CFLAGS QHULL_LIBS QHULL_CFLAGS CXXCPP FTGL_LIBS FTGL_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG FT_LIBS FT_INCLUDES FREETYPE_CONFIG USE_XML_FALSE USE_XML_TRUE XML_LIBS XML_CFLAGS XMLCONFIG HAVE_WINDRES_FALSE HAVE_WINDRES_TRUE WX_RESCOMP WX_VERSION WX_LIBS_STATIC WX_LIBS WX_CXXFLAGS_ONLY WX_CFLAGS_ONLY WX_CXXFLAGS WX_CFLAGS WX_CPPFLAGS WX_CONFIG_PATH host_os host_vendor host_cpu host build_os build_vendor build_cpu build EGREP GREP CPP USE_PRECOMPILED_HEADERS_FALSE USE_PRECOMPILED_HEADERS_TRUE am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_ftgl_prefix with_ftgl_no_pkg enable_silent_rules enable_dependency_tracking with_wxdir with_wx_config with_wx_prefix with_wx_exec_prefix with_xml_config with_freetype with_libqhull_flags with_libqhull_link with_libpng_flags with_libpng_link with_mgl_flags with_mgl_libs with_gsl_flags with_gsl_libs with_gsl_prefix with_gsl_exec_prefix enable_gsltest with_intl_libs enable_openmp_parallel enable_debug_checks enable_ubsan enable_experimental_cpp11 ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR FTGL_CFLAGS FTGL_LIBS CXXCPP PNG_CFLAGS PNG_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures 3Depict 0.0.19 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/3depict] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of 3Depict 0.0.19:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-gsltest Do not try to compile and run a test GSL program --enable-openmp-parallel Enable OpenMP multi-CPU usage; requires GCC > 4.2 for parallel STL support --disable-debug-checks Disable any debug checking, provides faster operation, but less information needed to debug internal problems, or to provide problem reports to developers --disable-ubsan Disable undefined behaviour sanitizer. Only takes effect on certain ubsan supporting compilers. Useful for working around ubsan aborts that you cant fix (eg 3rd party libs --enable-experimental-cpp11 Enable experimental C++11 support. Requires a full C++11 compiler (eg gcc/clang). Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-ftgl-prefix : specify prefix dir for FTGL --with-ftgl-no-pkg : don't use pkg-config to check for ftgl --with-wxdir=PATH Use uninstalled version of wxWidgets in PATH --with-wx-config=CONFIG wx-config script to use (optional) --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional) --with-wx-exec-prefix=PREFIX Exec prefix where wxWidgets is installed (optional) --with-xml-config=PATH use xml-config in PATH to find libxml --with-freetype=DIR where to find the freetype 2.x library --with-libqhull-flags=PATH : specify compiler flags for libqhull --with-libqhull-link=PATH : specify linker flag (library) for libqhull --with-libpng-flags=PATH : specify compiler flags for libpng --with-libpng-link=PATH : specify linker flag (library) for libpng --with-mgl-flags=PATH : specify compiler flags for mathgl --with-mgl-libs=PATH : specify linker flag (library) for mathgl --with-gsl-flags=PATH : specify compiler flags for gsl --with-gsl-libs=PATH : specify linker flag (library) for gsl --with-gsl-prefix=PFX Prefix where GSL is installed (optional) --with-gsl-exec-prefix=PFX Exec prefix where GSL is installed (optional) --with-intl-libs=FLAGS: specify linker flags (library) for internationalisation libs Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CC C compiler command CFLAGS C compiler flags CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path FTGL_CFLAGS C compiler flags for FTGL, overriding pkg-config FTGL_LIBS linker flags for FTGL, overriding pkg-config CXXCPP C++ preprocessor PNG_CFLAGS C compiler flags for PNG, overriding pkg-config PNG_LIBS linker flags for PNG, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF 3Depict configure 0.0.19 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by 3Depict $as_me 0.0.19, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='3depict' VERSION='0.0.19' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 $as_echo_n "checking whether the C++ compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C++ compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 $as_echo_n "checking for C++ compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C++ compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_config_headers="$ac_config_headers config.h" ac_config_files="$ac_config_files Makefile src/Makefile" # =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_compare_version.html # =========================================================================== # # SYNOPSIS # # AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # # DESCRIPTION # # This macro compares two version strings. Due to the various number of # minor-version numbers that can exist, and the fact that string # comparisons are not compatible with numeric comparisons, this is not # necessarily trivial to do in a autoconf script. This macro makes doing # these comparisons easy. # # The six basic comparisons are available, as well as checking equality # limited to a certain number of minor-version levels. # # The operator OP determines what type of comparison to do, and can be one # of: # # eq - equal (test A == B) # ne - not equal (test A != B) # le - less than or equal (test A <= B) # ge - greater than or equal (test A >= B) # lt - less than (test A < B) # gt - greater than (test A > B) # # Additionally, the eq and ne operator can have a number after it to limit # the test to that number of minor versions. # # eq0 - equal up to the length of the shorter version # ne0 - not equal up to the length of the shorter version # eqN - equal up to N sub-version levels # neN - not equal up to N sub-version levels # # When the condition is true, shell commands ACTION-IF-TRUE are run, # otherwise shell commands ACTION-IF-FALSE are run. The environment # variable 'ax_compare_version' is always set to either 'true' or 'false' # as well. # # Examples: # # AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8]) # AX_COMPARE_VERSION([3.15],[lt],[3.15.8]) # # would both be true. # # AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8]) # AX_COMPARE_VERSION([3.15],[gt],[3.15.8]) # # would both be false. # # AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8]) # # would be true because it is only comparing two minor versions. # # AX_COMPARE_VERSION([3.15.7],[eq0],[3.15]) # # would be true because it is only comparing the lesser number of minor # versions of the two values. # # Note: The characters that separate the version numbers do not matter. An # empty string is the same as version 0. OP is evaluated by autoconf, not # configure, so must be a string, not a variable. # # The author would like to acknowledge Guido Draheim whose advice about # the m4_case and m4_ifvaln functions make this macro only include the # portions necessary to perform the specific comparison specified by the # OP argument in the final configure script. # # LICENSE # # Copyright (c) 2008 Tim Toolan # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 11 #Ok, lets try using gcc style precompiled headers. if 1; then USE_PRECOMPILED_HEADERS_TRUE= USE_PRECOMPILED_HEADERS_FALSE='#' else USE_PRECOMPILED_HEADERS_TRUE='#' USE_PRECOMPILED_HEADERS_FALSE= fi #Check sizeof ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5 $as_echo_n "checking size of size_t... " >&6; } if ${ac_cv_sizeof_size_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"; then : else if test "$ac_cv_type_size_t" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (size_t) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_size_t=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_size_t" >&5 $as_echo "$ac_cv_sizeof_size_t" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_SIZE_T $ac_cv_sizeof_size_t _ACEOF # Support {host_os} variable # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Check whether --with-wxdir was given. if test "${with_wxdir+set}" = set; then : withval=$with_wxdir; wx_config_name="$withval/wx-config" wx_config_args="--inplace" fi # Check whether --with-wx-config was given. if test "${with_wx_config+set}" = set; then : withval=$with_wx_config; wx_config_name="$withval" fi # Check whether --with-wx-prefix was given. if test "${with_wx_prefix+set}" = set; then : withval=$with_wx_prefix; wx_config_prefix="$withval" else wx_config_prefix="" fi # Check whether --with-wx-exec-prefix was given. if test "${with_wx_exec_prefix+set}" = set; then : withval=$with_wx_exec_prefix; wx_config_exec_prefix="$withval" else wx_config_exec_prefix="" fi case "${host_os}" in *mingw*) #Windows requires 3.1, as there is a bug with wxPropertyGrid modification during events # under GTK we use a hack to workaround, by keeping two grids, and flipping them in and out. #This doesn't work properly under windows. wx3.1 is not available under linux # (using repositories) at this time. if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi if test -x "$WX_CONFIG_NAME" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5 $as_echo_n "checking for wx-config... " >&6; } WX_CONFIG_PATH="$WX_CONFIG_NAME" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else # Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args. set dummy $WX_CONFIG_NAME; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_WX_CONFIG_PATH+:} false; then : $as_echo_n "(cached) " >&6 else case $WX_CONFIG_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy=""$WX_LOOKUP_PATH:$PATH"" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_WX_CONFIG_PATH" && ac_cv_path_WX_CONFIG_PATH="no" ;; esac fi WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH if test -n "$WX_CONFIG_PATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION="" min_wx_version=3.1.0 if test -z "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version ()" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version ()... " >&6; } fi WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args " WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_ver_ok="" if test "x$WX_VERSION" != x ; then if test $wx_config_major_version -gt $wx_requested_major_version; then wx_ver_ok=yes else if test $wx_config_major_version -eq $wx_requested_major_version; then if test $wx_config_minor_version -gt $wx_requested_minor_version; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $wx_requested_minor_version; then if test $wx_config_micro_version -ge $wx_requested_micro_version; then wx_ver_ok=yes fi fi fi fi fi fi if test -n "$wx_ver_ok"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5 $as_echo "yes (version $WX_VERSION)" >&6; } WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5 $as_echo_n "checking for wxWidgets static library... " >&6; } WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null` if test "x$WX_LIBS_STATIC" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi wx_has_cppflags="" if test $wx_config_major_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_minor_version -eq 2; then if test $wx_config_micro_version -ge 6; then wx_has_cppflags=yes fi fi fi fi fi wx_has_rescomp="" if test $wx_config_major_version -gt 2; then wx_has_rescomp=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -ge 7; then wx_has_rescomp=yes fi fi fi if test "x$wx_has_rescomp" = x ; then WX_RESCOMP= else WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` fi if test "x$wx_has_cppflags" = x ; then WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CPPFLAGS=$WX_CFLAGS WX_CXXFLAGS=$WX_CFLAGS WX_CFLAGS_ONLY=$WX_CFLAGS WX_CXXFLAGS_ONLY=$WX_CFLAGS else WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi wxWin=1 else if test "x$WX_VERSION" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5 $as_echo "no (version $WX_VERSION is not new enough)" >&6; } fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" : fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" : fi ;; *) if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi if test -x "$WX_CONFIG_NAME" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5 $as_echo_n "checking for wx-config... " >&6; } WX_CONFIG_PATH="$WX_CONFIG_NAME" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else # Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args. set dummy $WX_CONFIG_NAME; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_WX_CONFIG_PATH+:} false; then : $as_echo_n "(cached) " >&6 else case $WX_CONFIG_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy=""$WX_LOOKUP_PATH:$PATH"" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_WX_CONFIG_PATH" && ac_cv_path_WX_CONFIG_PATH="no" ;; esac fi WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH if test -n "$WX_CONFIG_PATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION="" min_wx_version=3.0.0 if test -z "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version ()" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version ()... " >&6; } fi WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args " WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_ver_ok="" if test "x$WX_VERSION" != x ; then if test $wx_config_major_version -gt $wx_requested_major_version; then wx_ver_ok=yes else if test $wx_config_major_version -eq $wx_requested_major_version; then if test $wx_config_minor_version -gt $wx_requested_minor_version; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $wx_requested_minor_version; then if test $wx_config_micro_version -ge $wx_requested_micro_version; then wx_ver_ok=yes fi fi fi fi fi fi if test -n "$wx_ver_ok"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5 $as_echo "yes (version $WX_VERSION)" >&6; } WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5 $as_echo_n "checking for wxWidgets static library... " >&6; } WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null` if test "x$WX_LIBS_STATIC" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi wx_has_cppflags="" if test $wx_config_major_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_minor_version -eq 2; then if test $wx_config_micro_version -ge 6; then wx_has_cppflags=yes fi fi fi fi fi wx_has_rescomp="" if test $wx_config_major_version -gt 2; then wx_has_rescomp=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -ge 7; then wx_has_rescomp=yes fi fi fi if test "x$wx_has_rescomp" = x ; then WX_RESCOMP= else WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` fi if test "x$wx_has_cppflags" = x ; then WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CPPFLAGS=$WX_CFLAGS WX_CXXFLAGS=$WX_CFLAGS WX_CFLAGS_ONLY=$WX_CFLAGS WX_CXXFLAGS_ONLY=$WX_CFLAGS else WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi wxWin=1 else if test "x$WX_VERSION" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5 $as_echo "no (version $WX_VERSION is not new enough)" >&6; } fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" : fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" : fi esac if test "$wxWin" != 1; then as_fn_error $? " wxWidgets must be installed on your system but wx-config script couldnt be found. Please check that wx-config is in path, the directory where wxWidgets libraries are installed (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH or equivalent variable and wxWidgets version is above the minimum specified above. " "$LINENO" 5 fi #Append the --gl-libs flag WX_LIBS="$WX_LIBS `$WX_CONFIG_PATH --libs gl,propgrid`" WANT_WINDRES="no" case "${host_os}" in *mingw*) #wx-config is a little unreliable in cross-compile mode # Manually append -DUNICODE to cppflags/cxxflags WX_CXXFLAGS="$WX_CXXFLAGS -DUNICODE" WX_CPPFLAGS="$WX_CPPFLAGS -DUNICODE" WANT_WINDRES="yes" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: Want windres... $WANT_WINDRES" >&5 $as_echo "Want windres... $WANT_WINDRES" >&6; } if test x"$WANT_WINDRES" == "xyes" ; then HAVE_WINDRES_TRUE= HAVE_WINDRES_FALSE='#' else HAVE_WINDRES_TRUE='#' HAVE_WINDRES_FALSE= fi # Check for xml-config (libxml2 configuration utility) # ------------ # Test from icecast library (GPL) # Check whether --with-xml-config was given. if test "${with_xml_config+set}" = set; then : withval=$with_xml_config; fi have_xml="no" if test "$with_xml_config" != "no" then if test -n "$with_xml_config" -a "$with_xml_config" != "yes" then XMLCONFIG="$with_xml_config" if ! test -x "$XMLCONFIG" then as_fn_error $? "$with_xml_config cannot be run" "$LINENO" 5 fi else for ac_prog in xml2-config xml-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_XMLCONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$XMLCONFIG"; then ac_cv_prog_XMLCONFIG="$XMLCONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_XMLCONFIG="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi XMLCONFIG=$ac_cv_prog_XMLCONFIG if test -n "$XMLCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XMLCONFIG" >&5 $as_echo "$XMLCONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$XMLCONFIG" && break done fi if test -n "$XMLCONFIG" then $as_echo "#define HAVE_LIBXML 1" >>confdefs.h have_xml="yes" else as_fn_error $? "Unable to locate the configuration utility xml-config: specify with --with-xml-config, or ensure it is your PATH environment variable" "$LINENO" 5 fi XML_LIBS="`$XMLCONFIG --libs`" XML_CFLAGS="`$XMLCONFIG --cflags`" fi if test "$have_xml" = "yes"; then USE_XML_TRUE= USE_XML_FALSE='#' else USE_XML_TRUE='#' USE_XML_FALSE= fi #---------------- # Check for FT2 #FT2 teset from the graphviz library configure.ac FREETYPE_DIR="yes" # Check whether --with-freetype was given. if test "${with_freetype+set}" = set; then : withval=$with_freetype; FREETYPE_DIR=$withval fi if test "x$FREETYPE_DIR" = "xno"; then as_fn_error $? "FREETYPE2 library disabled" "$LINENO" 5 else if test "x$FREETYPE_DIR" != "xyes"; then # Extract the first word of "freetype-config", so it can be a program name with args. set dummy freetype-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_FREETYPE_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $FREETYPE_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_FREETYPE_CONFIG="$FREETYPE_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$FREETYPE_DIR/bin:$PATH" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_FREETYPE_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi FREETYPE_CONFIG=$ac_cv_path_FREETYPE_CONFIG if test -n "$FREETYPE_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_CONFIG" >&5 $as_echo "$FREETYPE_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else # Extract the first word of "freetype-config", so it can be a program name with args. set dummy freetype-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_FREETYPE_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $FREETYPE_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_FREETYPE_CONFIG="$FREETYPE_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_FREETYPE_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi FREETYPE_CONFIG=$ac_cv_path_FREETYPE_CONFIG if test -n "$FREETYPE_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_CONFIG" >&5 $as_echo "$FREETYPE_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -n "$FREETYPE_CONFIG"; then if test "x$FREETYPE_DIR" != "xyes"; then FT_INCLUDES="`$FREETYPE_CONFIG --cflags` -I$FREETYPE_DIR/include" else FT_INCLUDES=`$FREETYPE_CONFIG --cflags` fi ft_libtool=`$FREETYPE_CONFIG --libtool` # check that it really exists (FreeBSD apparently forgot to insttall it!) if test -f "$ft_libtool"; then FT_LIBTOOL="$ft_libtool" else FT_LIBTOOL="" fi FT_LIBS=`$FREETYPE_CONFIG --libs` FT_LDFLAGS=`echo " $FT_LIBS" |sed 's/ -l[^ ][^ ]*//g'` else if test "x$FREETYPE_DIR" != "xyes"; then FT_INCLUDES="-I$FREETYPE_DIR/include/freetype2 -I$FREETYPE_DIR/include" FT_LDFLAGS="-L$FREETYPE_DIR/lib" FT_LIBS="-lfreetype" else FT_INCLUDES="" FT_LDFLAGS="" FT_LIBS="" fi FT_LIBTOOL="" fi save_CPPFLAGS=$CPPFLAGS save_LDFLAGS=$LDFLAGS CPPFLAGS="$CPPFLAGS $FT_INCLUDES" LDFLAGS="$LDFLAGS $FT_LDFLAGS" for ac_header in ft2build.h do : ac_fn_c_check_header_mongrel "$LINENO" "ft2build.h" "ac_cv_header_ft2build_h" "$ac_includes_default" if test "x$ac_cv_header_ft2build_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FT2BUILD_H 1 _ACEOF fi done if test `eval echo '${'$as_ac_Header'}'` = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lfreetype" >&5 $as_echo_n "checking for main in -lfreetype... " >&6; } if ${ac_cv_lib_freetype_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfreetype $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_freetype_main=yes else ac_cv_lib_freetype_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freetype_main" >&5 $as_echo "$ac_cv_lib_freetype_main" >&6; } if test "x$ac_cv_lib_freetype_main" = xyes; then : FT_LIBS="$FT_LIBS" cat >>confdefs.h <<_ACEOF #define HAVE_LIBFREETYPE 1 _ACEOF else as_fn_error $? "Error: FREETYPE2 library not available - no libfreetype." "$LINENO" 5 fi else as_fn_error $? "Required FREETYPE2 library not available - no ft2build.h" "$LINENO" 5 fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS fi #Check for FTGL using custom script. if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ftgl" >&5 $as_echo_n "checking for ftgl... " >&6; } FTGL_CFLAGS="" FTGL_LIBS="" if test "x$ftgl_prefix" != "x" ; then #use the supplied CFLAGS. assume LIBS FTGL_CFLAGS="-I$ftgl_prefix/include/ -L$ftgl_prefix/lib/" FTGL_LIBS="-lFTGL" else HAVE_PKG=$(basename $(which pkg-config)) if test $HAVE_PKG != x"pkg-config" ; then manual_ftgl="yes" ; fi if test "x$with_ftgl_no_pkg" = "xyes" ; then $as_echo "#define FTGL_NO_PKG_CONFIG 1" >>confdefs.h #well the user doesn't want us to use pkg-config so dont. manual_ftgl=yes else if ! test x"$manual_ftgl" == x"yes" ; then # #Use PKG_CONFIG to do the heavy lifting, must be greater than 2.0.0 # pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FTGL" >&5 $as_echo_n "checking for FTGL... " >&6; } if test -n "$FTGL_CFLAGS"; then pkg_cv_FTGL_CFLAGS="$FTGL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ftgl >= 2.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "ftgl >= 2.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FTGL_CFLAGS=`$PKG_CONFIG --cflags "ftgl >= 2.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FTGL_LIBS"; then pkg_cv_FTGL_LIBS="$FTGL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"ftgl >= 2.0.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "ftgl >= 2.0.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FTGL_LIBS=`$PKG_CONFIG --libs "ftgl >= 2.0.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FTGL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "ftgl >= 2.0.0" 2>&1` else FTGL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "ftgl >= 2.0.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FTGL_PKG_ERRORS" >&5 libftgl="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } libftgl="no" else FTGL_CFLAGS=$pkg_cv_FTGL_CFLAGS FTGL_LIBS=$pkg_cv_FTGL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } libftgl="yes" fi #Check to see if pkg-config did the job if test "x$libftgl" = "xno" ; then #dang, looks like we have to try a manual approach manual_ftgl=yes ; fi fi fi fi if test "x$manual_ftgl" = "xyes" ; then CFLAGS_ORIG="$CFLAGS" LIBS_ORIG="$LIBS" LIBS="$LIBS $FTGL_LIBS $LDFLAGS" if test x$FTGL_LIBS == x"" ; then FTGL_LIBS="-lftgl" fi #TODO: see if we can put in some more manual tests for a few common locations for ftgl? { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ftglCreateSimpleLayout in -lftgl" >&5 $as_echo_n "checking for ftglCreateSimpleLayout in -lftgl... " >&6; } if ${ac_cv_lib_ftgl_ftglCreateSimpleLayout+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lftgl -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ftglCreateSimpleLayout (); int main () { return ftglCreateSimpleLayout (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ftgl_ftglCreateSimpleLayout=yes else ac_cv_lib_ftgl_ftglCreateSimpleLayout=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ftgl_ftglCreateSimpleLayout" >&5 $as_echo "$ac_cv_lib_ftgl_ftglCreateSimpleLayout" >&6; } if test "x$ac_cv_lib_ftgl_ftglCreateSimpleLayout" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBFTGL 1 _ACEOF LIBS="-lftgl $LIBS" else as_fn_error $? "Couldnt find ftgl -- provide base dir or install pkg_config" "$LINENO" 5 fi CFLAGS="$CFLAGS_ORIG" LIBS="$LIBS_ORIG" fi # # If we get this far, we assume that FTGL_CFLAGS and FTGL_LIBS is set # all that remains is to check to see if FTGL.h is in the CFLAGS dir or in # the FTGL subdir # ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu save_CPPFLAGS=$CPPFLAGS CPPFLAGS=$FTGL_CFLAGS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ftgl_nodir=yes else ftgl_nodir=no fi rm -f conftest.err conftest.i conftest.$ac_ext if test "x$ftgl_nodir" != "xyes" ; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ftgl_dir=yes else ftgl_dir=no fi rm -f conftest.err conftest.i conftest.$ac_ext if test "x$ftgl_dir" = "xyes" ; then save_FTGL_CFLAGS=$FTGL_CFLAGS #scrub the FTGL_CFLAGS for -I and then tack on /FTGL as needed FTGL_CFLAGS=`echo $FTGL_CFLAGS | sed -e 's/-I\([a-z\\\/]*\)/-I\1\/FTGL /'` CPPFLAGS=$FTGL_CFLAGS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ftgl_def_dir=yes else ftgl_def_dir=no fi rm -f conftest.err conftest.i conftest.$ac_ext if test "x$ftgl_def_dir" = "xno" ; then #try retrieving and modifying gcc's search dirs. - OMG Nasty hack! gcc #has no nice output for include dirs - sigh. got this from gcc-help, #then parsed with greps and tr GCC_SEARCHDIRS=`cpp -x c++ -Wp,-v /dev/null 2>&1 | grep -v ^\# | grep -v "End of search list." | grep -v "ignoring" | tr \\\n \\ ` ftgl_search_ok="no" for flag in $GCC_SEARCHDIRS do CPPFLAGS="-I$flag/FTGL/" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ftgl_def_dir=yes else ftgl_def_dir=no fi rm -f conftest.err conftest.i conftest.$ac_ext echo "Checking for FTGL.h in: $CPPFLAGS, result : $ftgl_def_dir" if test "x$ftgl_def_dir" = "xyes"; then ftgl_search_ok="yes" FTGL_CFLAGS="-I$flag/FTGL/" break fi done if test "x$ftgl_search_ok" = "xno"; then as_fn_error $? "Unfortuntately whilst this script worked out that you have ftgl, it couldn't quite work out how to set the CFLAGS" "$LINENO" 5 fi fi fi fi CPPFLAGS=$save_CPPFLAGS ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes " >&5 $as_echo " yes " >&6; } #Not doing anything??? #Check for qhull # Check whether --with-libqhull-flags was given. if test "${with_libqhull_flags+set}" = set; then : withval=$with_libqhull_flags; fi # Check whether --with-libqhull-link was given. if test "${with_libqhull_link+set}" = set; then : withval=$with_libqhull_link; fi if test x"$with_libqhull_flags" != x"" ; then QHULL_CFLAGS="$with_libqhull_flags" fi #Attempt to compile a test program CFLAGS_ORIG="$CFLAGS" CFLAGS="$CFLAGS $QHULL_CFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "qhull/qhull_a.h" "ac_cv_header_qhull_qhull_a_h" "$ac_includes_default" if test "x$ac_cv_header_qhull_qhull_a_h" = xyes; then : $as_echo "#define HAVE_QHULL /**/" >>confdefs.h else as_fn_error $? "Required libqhull headers not found (looking for qhull/qhull_a.h)" "$LINENO" 5 fi if test x"$with_libqhull_link" != x"" ; then QHULL_LIBS="$with_libqhull_link" else QHULL_LIBS="-lqhull" fi LIBS_ORIG="$LIBS" LIBS="$LIBS $QHULL_LIBS $LDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for qh_qhull in -lqhull" >&5 $as_echo_n "checking for qh_qhull in -lqhull... " >&6; } if ${ac_cv_lib_qhull_qh_qhull+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lqhull $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char qh_qhull (); int main () { return qh_qhull (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_qhull_qh_qhull=yes else ac_cv_lib_qhull_qh_qhull=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_qhull_qh_qhull" >&5 $as_echo "$ac_cv_lib_qhull_qh_qhull" >&6; } if test "x$ac_cv_lib_qhull_qh_qhull" = xyes; then : $as_echo "#define HAVE_QHULL /**/" >>confdefs.h else as_fn_error $? "You must have libqhull installed and be able to compile a sample program. compiler flags can be set using the with-libqhull-flags and with-libqhull-link parameters " "$LINENO" 5 fi CFLAGS="$CFLAGS_ORIG" LIBS="$LIBS_ORIG" #Check for libpng # Check whether --with-libpng-flags was given. if test "${with_libpng_flags+set}" = set; then : withval=$with_libpng_flags; fi # Check whether --with-libpng-link was given. if test "${with_libpng_link+set}" = set; then : withval=$with_libpng_link; fi #set libpng's compiler flags if test x"$with_libpng_flags" != x"" ; then PNG_CFLAGS="$with_libpng_flags" fi #set libpng's link flags if test x"$with_libpng_link" != x"" ; then PNG_LIBS="$with_libpng_link" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_create_write_struct_2 in -lpng" >&5 $as_echo_n "checking for png_create_write_struct_2 in -lpng... " >&6; } if ${ac_cv_lib_png_png_create_write_struct_2_+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpng -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char png_create_write_struct_2 (); int main () { return png_create_write_struct_2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_png_png_create_write_struct_2_=yes else ac_cv_lib_png_png_create_write_struct_2_=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_create_write_struct_2_" >&5 $as_echo "$ac_cv_lib_png_png_create_write_struct_2_" >&6; } if test "x$ac_cv_lib_png_png_create_write_struct_2_" = xyes; then : PNG_LIBS=-lpng else PNG_USE_PKG_CFG=yes fi if test x"$PNG_USE_PKG_CFG" == x"yes" ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG" >&5 $as_echo_n "checking for PNG... " >&6; } if test -n "$PNG_CFLAGS"; then pkg_cv_PNG_CFLAGS="$PNG_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_CFLAGS=`$PKG_CONFIG --cflags "libpng >= 1.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PNG_LIBS"; then pkg_cv_PNG_LIBS="$PNG_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "libpng >= 1.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PNG_LIBS=`$PKG_CONFIG --libs "libpng >= 1.2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libpng >= 1.2" 2>&1` else PNG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libpng >= 1.2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PNG_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (libpng >= 1.2) were not met: $PNG_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PNG_CFLAGS and PNG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables PNG_CFLAGS and PNG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else PNG_CFLAGS=$pkg_cv_PNG_CFLAGS PNG_LIBS=$pkg_cv_PNG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi fi #Attempt to compile a test program CFLAGS_ORIG="$CFLAGS" CFLAGS="$CFLAGS $PNG_CFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" if test "x$ac_cv_header_png_h" = xyes; then : $as_echo "#define HAVE_PNG /**/" >>confdefs.h else as_fn_error $? "Required libpng headers not found (looking for png.h" "$LINENO" 5 fi LIBS_ORIG="$LIBS" LIBS="$LIBS $PNG_LIBS $LDFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_sig_cmp in -lpng" >&5 $as_echo_n "checking for png_sig_cmp in -lpng... " >&6; } if ${ac_cv_lib_png_png_sig_cmp+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpng -lz -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char png_sig_cmp (); int main () { return png_sig_cmp (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_png_png_sig_cmp=yes else ac_cv_lib_png_png_sig_cmp=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_sig_cmp" >&5 $as_echo "$ac_cv_lib_png_png_sig_cmp" >&6; } if test "x$ac_cv_lib_png_png_sig_cmp" = xyes; then : $as_echo "#define HAVE_PNG /**/" >>confdefs.h else as_fn_error $? "You must have libpng installed and be able to compile sample program" "$LINENO" 5 fi CFLAGS="$CFLAGS_ORIG" LIBS="$LIBS_ORIG" #Check for opengl #------------ #Try linking against gluSphere windows usese -lglu32; mac?? ; linux -lGLU case "${host_os}" in mingw*|windows*|winnt) #win32 opengl names GL_LIBS="-lglu32 -lopengl32" #Add GLEW dependency for opengl > 1.1 GL_LIBS="$GL_LIBS -lglew32" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi ;; darwin*) #This is handled by the --with-apple-opengl-framework #option already. Nothing to do here ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluSphere in -lGLU" >&5 $as_echo_n "checking for gluSphere in -lGLU... " >&6; } if ${ac_cv_lib_GLU_gluSphere+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGLU $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gluSphere (); int main () { return gluSphere (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_GLU_gluSphere=yes else ac_cv_lib_GLU_gluSphere=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLU_gluSphere" >&5 $as_echo "$ac_cv_lib_GLU_gluSphere" >&6; } if test "x$ac_cv_lib_GLU_gluSphere" = xyes; then : GL_LIBS="$GL_LIBS -lglu" else as_fn_error $? "Could not find GLU library" "$LINENO" 5 fi GL_LIBS="-lGL -lGLU" ;; esac #------------ #Check for Mathgl CFLAGS_ORIG="$CFLAGS" LDFLAGS_ORIG="$LDFLAGS" # Check whether --with-mgl-flags was given. if test "${with_mgl_flags+set}" = set; then : withval=$with_mgl_flags; fi if test x"$with_mgl_flags" != x"" ; then MGL_CFLAGS="$with_mgl_flags" fi CFLAGS="$CFLAGS $MGL_CFLAGS" # Check whether --with-mgl-libs was given. if test "${with_mgl_libs+set}" = set; then : withval=$with_mgl_libs; fi if test x"$with_mgl_libs" != x"" ; then MGL_LIBS="$with_mgl_libs" else MGL_LIBS="-lmgl" fi LDFLAGS="$LDFLAGS $MGL_LIBS" # mathgl2.x uses mgl_cf.h for c functions. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu $as_echo "#define USE_MGL2 1 " >>confdefs.h as_ac_Header=`$as_echo "ac_cv_header_"mgl2/mgl_cf.h"" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" ""mgl2/mgl_cf.h"" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : else as_fn_error $? "\"mgl2 specified, but header mgl2/mgl_cf.h not found\"" "$LINENO" 5 fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS="$CFLAGS_ORIG" LDFLAGS="$LDFLAGS_ORIG" #Check for gsl # Check whether --with-gsl-flags was given. if test "${with_gsl_flags+set}" = set; then : withval=$with_gsl_flags; fi # Check whether --with-gsl-libs was given. if test "${with_gsl_libs+set}" = set; then : withval=$with_gsl_libs; fi if test x"$with_gsl_flags" != x"" ; then GSL_CFLAGS="$with_gsl_flags" fi if test x"$with_gsl_libs" != x"" ; then GSL_LIBS="$with_gsl_libs" else # Check whether --with-gsl-prefix was given. if test "${with_gsl_prefix+set}" = set; then : withval=$with_gsl_prefix; gsl_prefix="$withval" else gsl_prefix="" fi # Check whether --with-gsl-exec-prefix was given. if test "${with_gsl_exec_prefix+set}" = set; then : withval=$with_gsl_exec_prefix; gsl_exec_prefix="$withval" else gsl_exec_prefix="" fi # Check whether --enable-gsltest was given. if test "${enable_gsltest+set}" = set; then : enableval=$enable_gsltest; else enable_gsltest=yes fi if test "x${GSL_CONFIG+set}" != xset ; then if test "x$gsl_prefix" != x ; then GSL_CONFIG="$gsl_prefix/bin/gsl-config" fi if test "x$gsl_exec_prefix" != x ; then GSL_CONFIG="$gsl_exec_prefix/bin/gsl-config" fi fi # Extract the first word of "gsl-config", so it can be a program name with args. set dummy gsl-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GSL_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $GSL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_GSL_CONFIG="$GSL_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GSL_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GSL_CONFIG" && ac_cv_path_GSL_CONFIG="no" ;; esac fi GSL_CONFIG=$ac_cv_path_GSL_CONFIG if test -n "$GSL_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GSL_CONFIG" >&5 $as_echo "$GSL_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi min_gsl_version=1.1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSL - version >= $min_gsl_version" >&5 $as_echo_n "checking for GSL - version >= $min_gsl_version... " >&6; } no_gsl="" if test "$GSL_CONFIG" = "no" ; then no_gsl=yes else GSL_CFLAGS=`$GSL_CONFIG --cflags` GSL_LIBS=`$GSL_CONFIG --libs` gsl_major_version=`$GSL_CONFIG --version | \ sed 's/^\([0-9]*\).*/\1/'` if test "x${gsl_major_version}" = "x" ; then gsl_major_version=0 fi gsl_minor_version=`$GSL_CONFIG --version | \ sed 's/^\([0-9]*\)\.\{0,1\}\([0-9]*\).*/\2/'` if test "x${gsl_minor_version}" = "x" ; then gsl_minor_version=0 fi gsl_micro_version=`$GSL_CONFIG --version | \ sed 's/^\([0-9]*\)\.\{0,1\}\([0-9]*\)\.\{0,1\}\([0-9]*\).*/\3/'` if test "x${gsl_micro_version}" = "x" ; then gsl_micro_version=0 fi if test "x$enable_gsltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $GSL_CFLAGS" LIBS="$LIBS $GSL_LIBS" rm -f conf.gsltest if test "$cross_compiling" = yes; then : echo $ac_n "cross compiling; assumed OK... $ac_c" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include char* my_strdup (const char *str); char* my_strdup (const char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (void) { int major = 0, minor = 0, micro = 0; int n; char *tmp_version; system ("touch conf.gsltest"); /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_gsl_version"); n = sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) ; if (n != 2 && n != 3) { printf("%s, bad version string\n", "$min_gsl_version"); exit(1); } if (($gsl_major_version > major) || (($gsl_major_version == major) && ($gsl_minor_version > minor)) || (($gsl_major_version == major) && ($gsl_minor_version == minor) && ($gsl_micro_version >= micro))) { exit(0); } else { exit(1); } } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else no_gsl=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_gsl" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$GSL_CONFIG" = "no" ; then echo "*** The gsl-config script installed by GSL could not be found" echo "*** If GSL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the GSL_CONFIG environment variable to the" echo "*** full path to gsl-config." else if test -f conf.gsltest ; then : else echo "*** Could not run GSL test program, checking why..." CFLAGS="$CFLAGS $GSL_CFLAGS" LIBS="$LIBS $GSL_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding GSL or finding the wrong" echo "*** version of GSL. If it is not finding GSL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means GSL was incorrectly installed" echo "*** or that you have moved GSL since it was installed. In the latter case, you" echo "*** may want to edit the gsl-config script: $GSL_CONFIG" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" LIBS="$ac_save_LIBS" fi fi # GSL_CFLAGS="" # GSL_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"Could not find GNU Scientific Library.. You should install this, as it is needed by mathgl. Otherwise, you can override it with --with-gsl-link and --with-gsl-flags. For example you might use the gsl-config program to spit out the needed libs.\"" >&5 $as_echo "$as_me: WARNING: \"Could not find GNU Scientific Library.. You should install this, as it is needed by mathgl. Otherwise, you can override it with --with-gsl-link and --with-gsl-flags. For example you might use the gsl-config program to spit out the needed libs.\"" >&2;} fi rm -f conf.gsltest fi #Check for libintl { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libintl " >&5 $as_echo_n "checking for libintl ... " >&6; }; # Check whether --with-intl-libs was given. if test "${with_intl_libs+set}" = set; then : withval=$with_intl_libs; fi if test x"$with_intl_libs" != x"" ; then GETTEXT_LIBS="$with_intl_libs" { $as_echo "$as_me:${as_lineno-$LINENO}: result: specified " >&5 $as_echo " specified " >&6; }; else case "${host_os}" in darwin*) #Darwin requires explicit libintl GETTEXT_LIBS="-lintl -liconv" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETTEXT_LIBS " >&5 $as_echo " $GETTEXT_LIBS " >&6; }; ;; mingw*|windows*|winnt) GETTEXT_LIBS="-lintl" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETTEXT_LIBS " >&5 $as_echo " $GETTEXT_LIBS " >&6; }; ;; *) #elsewhere it appears to be part of libc. or something. { $as_echo "$as_me:${as_lineno-$LINENO}: result: no " >&5 $as_echo " no " >&6; }; ;; esac fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_fn_cxx_check_header_mongrel "$LINENO" "vigra/multi_array.hxx" "ac_cv_header_vigra_multi_array_hxx" "$ac_includes_default" if test "x$ac_cv_header_vigra_multi_array_hxx" = xyes; then : $as_echo "#define HAVE_VIGRA /**/" >>confdefs.h else as_fn_error $? "Required vigra headers not found (looking for vigra/multi_array.hxx)" "$LINENO" 5 fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #Should we compile with openMP? # Check whether --enable-openmp-parallel was given. if test "${enable_openmp_parallel+set}" = set; then : enableval=$enable_openmp_parallel; fi #Should we enable or disable debug checking? # Check whether --enable-debug-checks was given. if test "${enable_debug_checks+set}" = set; then : enableval=$enable_debug_checks; enable_debug_checks="no" else enable_debug_checks="yes" fi # Check whether --enable-ubsan was given. if test "${enable_ubsan+set}" = set; then : enableval=$enable_ubsan; enable_no_ubsan="yes" else enable_no_ubsan="no" fi # Check whether --enable-experimental-cpp11 was given. if test "${enable_experimental_cpp11+set}" = set; then : enableval=$enable_experimental_cpp11; fi if test x"$enable_openmp_parallel" != x"" ; then OPENMP_FLAGS="-fopenmp -D_GLIBCXX_PARALLEL" fi if test x"$enable_debug_checks" == x"yes" ; then if test x"$enable_openmp_parallel" != x"" ; then #Note that GLIBCXX_DEBUG cannot exist with GLIBCXX_PARALLEL DEBUG_FLAGS="-DDEBUG" else DEBUG_FLAGS="-DDEBUG -D_GLIBCXX_DEBUG" fi if test x"$GCC" = x"yes" ; then # Strip optimsation flags from debug build #-- CFLAGS=`echo "$CFLAGS" | sed -e 's/-O[0-9s]*//g'` CXXFLAGS=`echo "$CXXFLAGS" | sed -e 's/-O[0-9s]*//g'` CFLAGS="$CFLAGS -g" CXXFLAGS="$CXXFLAGS -g" #-- #Check for UbSan availability #-- if test x"${enable_no_ubsan}" == x"no" ; then USE_UBSAN="no" case "${host_os}" in *inux*) GCC_VER=`gcc --version | head -n 1 | awk '{ print $(NF)}'` # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo " $GCC_VER " | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "4.9" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then USE_UBSAN="yes" else USE_UBSAN="no" fi # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo " $GCC_VER " | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "6.0" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then USE_UBSAN_GCC6="yes" else USE_UBSAN_GCC6="no" fi ;; esac if test x"$USE_UBSAN" == x"yes" ; then CFLAGS="$CFLAGS -fsanitize=address -fsanitize=undefined -fsanitize=return -fsanitize=integer-divide-by-zero -fsanitize=vla-bound -fsanitize=null -fsanitize=signed-integer-overflow" CXXFLAGS="$CXXFLAGS -fsanitize=address -fsanitize=undefined -fsanitize=return -fsanitize=integer-divide-by-zero -fsanitize=vla-bound -fsanitize=null -fsanitize=signed-integer-overflow" LDFLAGS="$LDFLAGS -fsanitize=address -fsanitize=undefined -fsanitize=return " { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"Enabling Gcc-UbSan\"" >&5 $as_echo "\"Enabling Gcc-UbSan\"" >&6; }; fi if test x"$USE_UBSAN_GCC6" == x"yes" ; then CFLAGS="$CFLAGS -fsanitize=bounds-strict" CXXFLAGS="$CXXFLAGS -fsanitize=bounds-strict" LDFLAGS="$LDFLAGS -fsanitize=bounds-strict" { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"Enabling More Gcc-UbSan (gcc6)\"" >&5 $as_echo "\"Enabling More Gcc-UbSan (gcc6)\"" >&6; }; fi fi #-- fi else echo x"$enable_debug_checks" echo x"no" if test x"$enable_debug_checks" != x"no" ; then as_fn_error $? "\"Well something isnt right, debug checks should be enabled or disabled (yes/no), was $enable_debug_checks\"" "$LINENO" 5 fi fi if test x"$enable_experimental_cpp11" == x"yes" ; then #Should work for gcc/clang CXXFLAGS="$CXXFLAGS --std=c++11" fi if test x"$CXX" = xdistcc ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"Adding distcc link flags\"" >&5 $as_echo "\"Adding distcc link flags\"" >&6; }; #Add -lstdc++ to libs for distcc LIBS="$LIBS -lstdc++" fi # Checks for typedefs, structures, and compiler characteristics. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 $as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } if ${ac_cv_header_stdbool_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef bool "error: bool is not defined" #endif #ifndef false "error: false is not defined" #endif #if false "error: false is not 0" #endif #ifndef true "error: true is not defined" #endif #if true != 1 "error: true is not 1" #endif #ifndef __bool_true_false_are_defined "error: __bool_true_false_are_defined is not defined" #endif struct s { _Bool s: 1; _Bool t; } s; char a[true == 1 ? 1 : -1]; char b[false == 0 ? 1 : -1]; char c[__bool_true_false_are_defined == 1 ? 1 : -1]; char d[(bool) 0.5 == true ? 1 : -1]; /* See body of main program for 'e'. */ char f[(_Bool) 0.0 == false ? 1 : -1]; char g[true]; char h[sizeof (_Bool)]; char i[sizeof s.t]; enum { j = false, k = true, l = false * true, m = true * 256 }; /* The following fails for HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ _Bool n[m]; char o[sizeof n == m * sizeof n[0] ? 1 : -1]; char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; /* Catch a bug in an HP-UX C compiler. See http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html */ _Bool q = true; _Bool *pq = &q; int main () { bool e = &s; *pq |= q; *pq |= ! q; /* Refer to every declared value, to avoid compiler optimizations. */ return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + !m + !n + !o + !p + !q + !pq); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdbool_h=yes else ac_cv_header_stdbool_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 $as_echo "$ac_cv_header_stdbool_h" >&6; } ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" if test "x$ac_cv_type__Bool" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE__BOOL 1 _ACEOF fi if test $ac_cv_header_stdbool_h = yes; then $as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) $as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint64_t $ac_cv_c_uint64_t _ACEOF ;; esac # Checks for library functions. for ac_func in atexit sqrt do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in floor getcwd gettimeofday isascii memset do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in pow setlocale strdup sysinfo do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac #check for some headers for ac_header in fenv.h libintl.h sys/time.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" if test "x$ac_cv_type_ptrdiff_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTRDIFF_T 1 _ACEOF fi #Check platform specific headers case "${host_os}" in darwin*) for ac_header in mach/mach.h do : ac_fn_c_check_header_mongrel "$LINENO" "mach/mach.h" "ac_cv_header_mach_mach_h" "$ac_includes_default" if test "x$ac_cv_header_mach_mach_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MACH_MACH_H 1 _ACEOF fi done ;; *) ;; esac cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_PRECOMPILED_HEADERS_TRUE}" && test -z "${USE_PRECOMPILED_HEADERS_FALSE}"; then as_fn_error $? "conditional \"USE_PRECOMPILED_HEADERS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_WINDRES_TRUE}" && test -z "${HAVE_WINDRES_FALSE}"; then as_fn_error $? "conditional \"HAVE_WINDRES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_XML_TRUE}" && test -z "${USE_XML_FALSE}"; then as_fn_error $? "conditional \"USE_XML\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by 3Depict $as_me 0.0.19, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ 3Depict config.status 0.0.19 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi 3Depict-0.0.19/locales/0000755000175000017500000000000012723200271014076 5ustar pcuserpcuser3Depict-0.0.19/locales/de_DE/0000755000175000017500000000000012723200271015036 5ustar pcuserpcuser3Depict-0.0.19/locales/de_DE/LC_MESSAGES/0000755000175000017500000000000012723200271016623 5ustar pcuserpcuser3Depict-0.0.19/locales/de_DE/LC_MESSAGES/3Depict.mo0000644000175000017500000012714012723200271020460 0ustar pcuserpcuserc45L& 3!3F03w3f3_4d4 ~4 44444434m5$5$5$5/5 $6.6A6 ^6j6~6666666666 7#737 D7R7 b7 o7|777 7 7 7777G7 .898H8W8f8u888 8w8*9 99G9 O9 [9 f9 r9 ~9 999 9<9 9: : :(: .::: M:&X:: : : ::::::::; ; !; -; 9;E; J;T; d; q;|; ;;u;!<'<+< 2< ><K<c<&x<<<<<< ===*=<=A=I=P= X=Vc== === =$>$,>6Q>>> >> >>>>??(?:? I? U?c?i?p?????? ???? @@@ &@3@ 8@ B@P@g@m@@@#@@HA BBC0DDDD EEE;E NEXoEEE4E%F/8FhFF'FSFGN+G(zG$G%G0G"H BHOHVHgH~HHH HH HHH H II"I=IWItIIIII IFI,!J NJ[JjJyJJ J JJ J J JJ K K K(K 1K =KKKcKkK KKK\KK"L%L+L JLVLZL _LjLsL |L LLLLLL LLLLdmMMNNN!NN:N 4O ?OMORO aO kO/wO OOOOO%O P P(P,P5P =PGP#eP PPPP#PPP"Q*Q9BQ|QQGQGQ=RBR SR ]R jRxR R RRRR R R RRRR SS!SG0SxSS S,SSS S S S TT&TDTMT`T/wTJT T T U U U+U 1U>U CU MU WU&dU UUUU;UU V V'V ,V 8VDVbVVV VVV VV W(W:WJW^WeWwW }W W W WSW>X?XYX`XhXzX~X1X XXXX X XY Y&YAYWYjYyY YYYYY Y YY Y Z ZZ5Z HZVZ fZsZ Z Z Z ZZZZ@Z :[ H[-R[ [[[ [[%[![ \:\*P\ {\\\\ \ \ \ \\ \]$]4]=] D] P] Z]h] n]y] ]] ]7]]]]]^ ^^ ^'"^ J^T^j^eW_ _;_`'%`M`c`}```R`aa7a Pa^a oaya a a'aVa!b):b4db+b<b%c (cbIc2c2c2dAEd%d1dd#d&"e'Ie)qe ee;e1f9fBfXf`fgfff6fff fffgg"g(g BgOg\ggg g[g83hlhi(i*i`,i iii i iiiiijj1jAj Qj ^j jj wj j jjjjjj)jj jTjHkLkPkTkXk\k`khk mBm\m{mYn^ntnnnnnnn3nd!o!o!o!o3o p1pFp bpnpp p ppppppqq qAqTqfquqqqqqqqqrr r #rG-r urrrrrrrrr|r{s s s s s s s ss ss tEt btpt xttt tt t1tt u uu/uEuWuiu|uuuu u u u uuuuv vv 9v EvxQvvvv vvww$8w]wvwwwww wwwx xxx xH)xrx yxx xx)x)xByVykyqyyy&yyyyy zz -z 9zGzNzUz uzzzzzzz+zz z {{{-{ 6{@{\{v{|{{{({{c}l}p~cA| Ȁ̀ ր3/LćC.DL!">ւkj2-2-`i# -9OoɅ  &2!:\%w(M,V &̇   $0&Ah w   ̈ֈ qr2 ݉   0:K_f lwd| q~$ȌH׌ 2@H ^ i?wƍ ʍ֍0->V Zfn%0ގ-A#Y1} BЏ0*O[W *<M V aou{  őґJ\q'Ò ̒ ֒* CM^Bom *8 ?L[ an s } $ ” ɔӔM&4 [ fq v-,,2NWn )Җ  ! / <`GB 261F x ؘ0 ?M`|)Й .JdxΚ$?]Wƛ*Λ  "0%C'i;-ޜ $7W ^ l v  Ɲ՝ޝ   (3 LDZ ȞԞٞ ޞ+ !k˟^7 C4<Zs'ӡH4;Xr  ˢu^3{6)@%Qw77V7Hƥ2/B r$,0.$EjZAާ /GOVqze&7JP kx\ {=|p $.HP`r¬׬0@O`gjmpEw ɭlӭ@DHLPTXZJR @jF|*t31d+VpzW 5+'ubcd R#&BZ516>?~:!.Xw[L:zBmt ?2$4 )Tv/gU+b9UK]Nb9E)a$`1;{W)lsiA =` q=V[.[%6I<Fe/3M8l6]\qD{Q0"LfI2kN'_#rCEGyn;7V/-& 5M#8~f(0 "AwG47I*<P=( p;| -?$Ki@ DX3(yv^e,OK-sWm>J\Aa"<Oh87c:SnP0QSN} _OPCYE!a>xF@kUBZ` LCH%o'SD&r*Y!XHM_}jTc ,g%R^HoGJT\Qx 2,h9.]^ Y 4u Config Load: --------------------------- Parameter selection notice ------------- If your inter-cluster distance is sufficiently large (larger than your bulk linking distance), then you can get away with this. In theory it is possible to "join" the clusters, but this has not been implemented for speed reasons. RDF as it was not recognised cannot use. clusters does not exist does not exist. Skipping found online. is up-to-date. of points were un-analysable. These have been dropped points were unable to find neighbour points that exceeded the search radius, and thus terminated prematurely"backcolour" node missing "b" value."backcolour" node missing "g" value."backcolour" node missing "r" value."backcolour"s rgb values must be in range [0,1]&About...&Axis Ctrl+Shift+I&Background Colour... Ctrl+B&Contact...&Control Pane Alt+C&Control Pane F2&Edit&Export&File&Fullscreen mode Ctrl+Shift+F&Fullscreen mode F11&Help&Help... Ctrl+H&Image... Ctrl+I&Legend Ctrl+L&Merge... Ctrl+Shift+O&Open... Ctrl+O&Plot List Alt+P&Plot List F4&Plot... Ctrl+P&Preferences&Quit Ctrl+Q&Raw Data Pane Alt+R&Raw Data Pane F3&Recent&Redo Ctrl+Y&Save Ctrl+S&Undo Ctrl+Z&View(fast)(slow)---------------------------------------------------------------------- --Counts--10 minutes ago10 seconds ago15 minutes ago20 minutes ago30 minutes ago30 seconds ago3D Post-processing3D lighting3Depict file (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS File (*.pos)|*.pos|XML State File (*.xml)|*.xml|All Files (*)|*45 minutes ago5 minutes agoAbortedAborting...Across dirActive Ion Active Rng AlgorithmAligned boxAll IonsAll Ions (conc)All RangesAn auto-save state was found, would you like to restore it?.Anaglyph ModeAnalyseAnalysisPackageAnd so on...AngleAngle (deg)Animation progressAnnotationAre you sure you wish to exit 3Depict?ArrowArrow+TextAuto Min/maxAuto RefreshAutosaveAutosave complete.Available DataAvailable FiltersAvailable stashesAxisBarsBaseline SeparationBin widthBin width xBin width yBin width zBlueBound boxBoundbox CentreBounding BoxBox ColourBulk Link (Envelope) DistBulk RangesBy CountBy Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*.svg|PNG File (*.png)|*.png|All Files (*)|*CacheCamCameraCamera NameCamera SpeedCamera data informationCamera zooming rate.Cameras section missing "active" node.Change background colourChemistry Dist.Chemistry DistributionChoose resolutionClassify Knn MaxCleanup inputClippingCluster AnalysisClustering ParamsColdCollateColourColour Colour MapColour based 3D effect enable/disable - requires appropriate colour filter 3D glasses.CommandComp. Prof.Compiled with wx Version: Compos. ProfilesCompositionsCompositions (fractional, core only)Compositions (fractional, core+bulk)Config file present, but is not valid (root node test)Confirmation requestCons.Control PaneConvex Volume (len^3): Convex hullCopy raw data to clipboardCopyingCopying referenced filesCoreCore Classify DistCore Link + ErodeCore Link DistCore RangesCorner offsetCountCountsCreated new filter tree stashCropCyclicCylinderDataDefault colour DenominatorDensity (\frac{\#}{len^3})Detailed view of selected rangeDetailsDigit formatDist MaxDistanceDownsamplingDrawDraw SizeDrop unrangedDuplicate effect foundE&xitEmpty stash name for stash Enable Anaglyphic StereoEnable CroppingEnable cropping post-process effectEnable/Disable "Alpha blending" (transparency) in rendering system. Blending is used to smooth objects (avoids artefacts known as "jaggies") and to make transparent surfaces. Disabling will provide faster rendering but look more blockyEnable/Disable automatic updates of data when filter change takes effectEnable/Disable caching of intermediate results during filter updates. Disabling caching will use less system RAM, though changes to any filter property will cause the entire filter tree to be recomputed, greatly slowing computationsEnable/Disable lighting calculations in rendering, for objects that request this. Lighting provides important depth cues for objects comprised of 3D surfaces. Disabling may allow faster rendering in complex scenesEnable/Disable weak randomisation (Galois linear feedback shift register). Strong randomisation uses a much slower random selection method, but provides better protection against inadvertent correlations, and is recommended for final analysesEnable/disable visual effects on final 3D outputEnabledEndEnd rng Erode DistErr. EstimatorError - Found NaN in pos fileError copying fileError interpreting field in fileError interpreting range file header, expecting ion count and range count, respectively.Error loading fileError loading file: Error loading state file. See console for more info.Error opening fileError opening file, check name and permissions.Error opening pos fileError processing node: Error re-opening file, after first scanError reading colour data in the file, expecting 3 decimal values, space separated.Error reading effect : Error reading file, unexpected format, are you sure it is a proper range file?Error reading from pos file (after open)Error reading the long name for ion.Error reading the short name for ion.Error saving file. Check output dir is writable.Error whilst reading file contentsExit ProgramExportExport AnimationExport Current 3D ViewExport Current PlotExport Ion DataExport Pos DataExport RangeExport Range DataExport RangesExport analysis packageExport:Ext. ProgramExtern. Prog.ExtremaFailed reading range file.Failed to allocate parserFast and weak randomisation.Field of View (deg)FileFile : File already exists, overwrite?File readback check failedFile typeFiles have been referred to using relative paths. Keep relative paths?Filesize during readback appears to be zero.Filter CountFilter StashesFilter cachingFilter settingsFilter view for current stashFilteringFixed Bin NumFixed Tick NumFixed ticksFixed widthFlip ChannelsFolder creation failedFont SizeFor stash Found :FractionFrame countFreq. ProfileFrequencies (core+bulk)GeneralGlasses colour modeGreen-MagentaGreyHotIf you want this, please contact the author, or just use the source to add this in yourself.Image progressIncorrect number of fields in fileIndexInformation about this programInvert ClipIonIon Ion ColourIon InfoIon NameIon SamplerIon TransformIon infoIon&s... Ctrl+NIon. TransformIonID IonsIsosurfaceIsovalueJetLets the program check the internet to see if updates to the program version are available, then notifies you about updates now and again.Level of separation between left and right images, which sets 3D depth to visual distortion tradeoffLimitation on the screenshot dimension; please ensure that both width and height exceed the initial values, or that they are smaller than the initial values. If this bothers, please submit a bug.Line thicknessLinesList of available filtersList of rangefiles in filter treeLoad Limit (MB)Load data source (file->open) before choosing a new filterLoad errorLocal DensityLockLock Axis Mag.Log ScaleLogarithmicManual not found locally. Launching web browserMass CentreMaxMax SizeMax. Ram usage (%)Max. Sep + ErodeMemory allocation failure on POS loadMerge other fileMerged file.MinMin SizeMonitorMove RateMoving - Hold control to copyMoving - Hold ⌘ (command) to copyMoving avg.NN Freq.NN MaxNew camera name...Next fullscreen mode: with toolbarsNo data to saveNo filter stashes to edit.No filters means no data to exportNo numerical data foundNo plot available. Please create a plot before exporting.No plots selected.No range data. Can't cluster.No ranges selected for cluster "bulk". Cannot continue with clustering.No ranges selected for cluster "core". Cannot continue with clustering.NoneNone (Raw count)NormaliseNormalise byNot availableNum BinsNum RangesNum TicksNum XNum YNum ZNum bins xNum bins yNum bins zNumber Density (\#/Vol^3)Number of framesNumber of points : NumeratorOnline Check: Online UpdatesOnline access for non win32/apple platforms is intentionally disabled, Open contact pageOpen state fileOpenGL FailedOpening contact page in external web browserOriginOrigin OrthogonalOut FractionOutput CountOverwrite?P&lot...PNG File (*.png)|*.png|All Files (*)|*POS DataPac&kage... Ctrl+KPackage directory namePackage folder already exists, won't overwrite.Package folder creation failed check writing to this location is possible.Package namePanel DisplayParamPer SpeciesPerspectivePlanePlane NormalPlotPlot ListPlot TypePlot colour Plotting functions returned an error: Point CloudPointsPos DataPos file emptyPos file size appears to have non-integer number of entriesPos load aborted by interrupt.Position APosition BPostPostprocessPreferencesPress enter to restore cameraPress enter to restore stashPress enter to store new cameraPress enter to store new stashPrimitiveProgram limitationProgram text outputProjectionPropertyPseudo-RandomQuick and dirty analysis for point data.Radial DistanceRadial DistributionRadiusRan&ges... Ctrl+GRangeRange FileRange SourcesRange StartRange endRange file appears to be empty, check file is a proper range file and is not empty.Range file appears to be inconsistent (eg, overlapping ranges)Ranged Density (pts/vol):RangesRangingRatio (Num/Denom)RawRaw Data PanelReadable files (*.xml, *.pos, *.txt,*.csv, *.ato)RectilinearRectilinear Bounds : Red-BlueRed-CyanRed-GreenReflexiveRefresh Aborted.Remember lastRemove the selected cameraRendering sequence...Rendering tiles...RepresentationResetReset AllRestored camera: RotateRulerSave &As... Ctrl+Shift+SSave Data...Save Image...Save current state to new fileSave errorSave plot...Save pos...Save raw data to fileSave state to fileSave state...Saved 3D View :Saved ions: Saved package: Saved plot: Saved state: Saving Image Scale Fact.Security warningSelect Data or State File...Select RNG File...Select an item from the filter tree before choosing a new filterSelected DataSelectionSettings for selected filter in current stashShow AngleShow BarShow PrimitiveShow SelectedShow all panelsShow all panels when starting programShow help files and documentationShow markerShow panels visible at last shutdown when starting programShow selected panels when starting programSize CroppingSize DistributionSmooth && translucent objectsSourceSource FilterSpacing XSpacing YSpacing ZSpat. AnalysisSpatial analysis aborted by userSpecifySpectral ColourSpectrumSphereSphere sizeSpot sizeStandard dev.StartStart rng StartupStash NameStashed FiltersStashed TreesState was created by a newer version of this program.. StemStepsStereoStored camera: SurfaceTargetTextText DataText File (*.txt)|*.txt|All Files (*)|*Text sizeThis file is a "state" file for the 3Depict program, and stores information about a particular analysis session. This file should be a valid "XML" fileThis state file contains filters that can be unsafe to run Do you wish to remove these before continuing?.This will be a problem in the case where two or more clusters can equally lay claim to a "bulk" ion. Tick SpacingTip: You can shift-click to force full refresh, if requiredTip: You can use ctrl to mergeTip: You can use ⌘ (command) to mergeToggle Legend displayToggle World Axis displayToggle left control paneToggle plot listToggle raw data pane (bottom)Too many ranges appeared to have range entries with no usable data (eg, all blank)ToolsTotal (incl. unranged) Total Density (pts/vol):Total Ranged Transform ParamsTranslateTranslate ValueTranslationTransparencyUnable to allocate memory to store dataUnable to allocate requested memory. Try a lower resolution, or save as vector (SVG).Unable to compute volumeUnable to create stash, selection invalidUnable to determine filter type in defaults listing.Unable to find or interpret "showaxis" nodeUnable to find property "value" for "cameras->active" node.Unable to find the "backcolour" node.Unable to find the "writer" nodeUnable to initialise the openGL (3D) panel. Program cannot start. Please check your video drivers.Unable to interpret "backColour" node's "b" value.Unable to interpret "backColour" node's "g" value.Unable to interpret "backColour" node's "r" value.Unable to interpret property "value" for "cameras->active" node.Unable to interpret recent file entryUnable to interpret the camera type for camera : Unable to load autosave file..Unable to locate "filtertree" node.Unable to locate stash name for stash Unable to read file contents after openUnable to read range start and end valuesUnable to read range table entryUnable to saveUnable to save. Check output destination can be written to.Unknown file extension. Please use "svg" or "png"UnrangedUnrecognised effect :Up Dir.Up dirUpdate Notice: New version Updated.Use camera coordinatesUse shift/ctrl-space or double tap to alter reset axisValueValue2View sizeVisibleVolumeVolume (Density)Volume (len^3): VoxelVoxel Limits (min,max): (VoxelisationWARNING: Skipping node Waiting for refresh to abort. Exiting could lead to the program backgrounding. Exit anyway? Warning,Warning, Warning, unparseable version number in state file. File reading will continue, but may failWarning: Your configuration file appears to be invalid: Warning:One or more bounds of the loaded data approaches the limits of numerical stability for the internal data type(magnitude too large). Consider rescaling data before loadingWork DirXYYou can do this; thats OK, but the output is no longer independent of the computational process;Zoom Rate\% Done\% Done (Esc aborts)a day agoa decade agoa few days agoa few decades agoa few hours agoa few minutes agoa few months agoa few seconds agoa few weeks agoa few years agoa minute agoa month agoa second agoa week agoa year agoan hour agocountdXdYdZerrorfile reading will continue, but may fail.in the future?moments agoregardless of the settings you use here. Use your package manager to keep up-to-datex-yx-zy-xy-zz-xz-y§Cons.Project-Id-Version: 3Depict Report-Msgid-Bugs-To: POT-Creation-Date: 2016-05-31 11:15+1000 PO-Revision-Date: 2012-07-09 08:21+0000 Last-Translator: epix1234 Language-Team: German (Germany) (http://www.transifex.com/projects/p/3depict/language/de_DE/) Language: de_DE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1) Config Load: --------------------------- Parameterauswahl Notiz ------------- If your inter-cluster distance is sufficiently large (larger than your bulk linking distance), then you can get away with this.Theoretisch ist es möglich die Cluster zu 'verbinden', dies wurde jedoch aus Gescheindigkeitsgründen nicht implementiert. RDF wurde nicht erkannt.kann nicht verwenden. Cluster existiert nicht existiert nicht. Überspringe online gefunden.ist up-to-date. von points were un-analysable. These have been dropped Punkte konnten keine Nachbapunkte die den Suchradius überschritten finden und beendeten vorzeitig."backcolour" node fehlt "b" Wert."backcolour" node fehlt "g" Wert."backcolour" node fehlt "r" Wert."backcolour"s rgb Wert muss im Bereich [0,1] liegenÜber 3Depict...&Achsen Ctrl+Shift+I&Hintergrundfarbe... Ctrl+B&Kontakt...&Kontrollfenster Alt+C&Kontrollfenster F2&Bearbeiten&Exportieren&Datei&Vollbildmodus Ctrl+Shift+F&Vollbildmodus F11&Hilfe&Hilfe... Ctrl+H&Bild... Ctrl+I&Legende Ctrl+L&Zusammenführen... Ctrl+Shift+O&Öffnen... Ctrl+O&Plot Liste Alt+P&Plot Liste F4&Plot... Ctrl+P&Voreinstellungen&Beenden Ctrl+Q&Rohdatenfenster Alt+R&Rohdatenfenster F3&Letzte&Wiederholen Ctrl+Y&Speichern Ctrl+S&Zurück Ctrl+Z&Ansicht(schnell)(langsam)---------------------------------------------------------------------- - Anzahl -vor 10 Minutenvor 10 Sekundenvor 15 Minutenvor 20 Minutenvor 30 Minutenvor 30 Sekunden3D Nachbearbeitung3D Beleuchtung3Depictdateien (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS Datei (*.pos)|*.pos|XML Status Datei (*.xml)|*.xml|All Files (*)|*vor 45 Minutenvor 5 MinutenAbgebrochenAbbrechen...Across dirActives Ion Activer Rng AlgorithmusAusgerichtete BoxAlle IonenAlle Ionen (Konz)Alle RangeEin auto-save Status wurde gefunden. Wollen Sie ihn wiederherstellen?AnaglyphmodusAnalyseAnalysepaketUnd so weiter...WinkelWinkel (deg)Animation-FortschrittKommentarSind Sie sicher, dass Sie 3Depict beenden wollen?PfeilPfeil+TextAuto Min/maxAutom. aktualisierenAutomatisch speichernAutosave beendet.Verfügbare DatenVerfügbare FilterVerfügbare StashAchseBlockBasislinienabstandBin-BreiteBin-Breite xBin-Breite yBin-Breite ZBlauBegrenzungs-BoxBoundbox ZentrumBegrenzungs-BoxBox FarbeBulk Link (Envelope) DistBulk RangesNach AnzahlDateierweiterung (svg,png)|*.svg;*.png|Skalierbare Vektorgrafik (*.svg)|*.svg|PNG Datei (*.png)|*.png|Alle Dateien (*)|*ZwischenspeicherCamKameraKameranameKamerageschwindigkeitKamerainformationZoomgeschwindigkeit der KameraCameras section fehlt "active" node.Hintergrundfarbe ändernChemistry Dist.Chemische VerteilungAuflösung auswählenClassify Knn MaxBereinige EingabeZuschneidenClusteranalyseCluster ParameterKaltAbgleichenFarbeFarbeFarbtabelleFarbbasierte 3D-Effekte ein/ausschalten - erfordert geeignete 3D-BrillenBefehlKonz. Prof.Kompiliert mit wx Version: Konz.ProfilZusammensetzungenZusammensetzungen (fractional, core only)Zusammensetzungen (fractional, core+bulk)Konfigurationsdatei vorhanden, aber nicht gültig (root node test)BestätigungsabfrageKons.KontrollfensterKonvexes Volumen (Läng.^3)Konvexe HülleKopiere Rohdaten in die ZwischenablagekopiereCopying referenced filesKernCore Classify DistCore Link + ErodeCore Link DistCore RangesCorner offsetAnzahlAnzahlNeuer Filterstash wurde erzeugtZuschneidenCyclicZylinderDatenBevorzugte Farbe NennerDichte (\frac{\#}{len^3})Detailierte Ansicht des ausgewählten RangeDetailsZahlenformatAbst. Max.AbstandDatenreduktionZeichnenDraw SizeNicht gerangete ausschaltenDoppelter Effekt gefundenE&xitLeerer Stashname für StashAnaglyphic Stereo aktivierenZuschneiden aktivierenCropping post-Prozess Effect einschaltenEin/Ausschalten des "Alpha blending" (Transparenz) im Rendersystem. Dieses wird verwendet um ebene Objekte (vermeidet Artefakte bekannt als jaggies) und transparente Oberflächen zu generieren. Ausschalten erlaubt schnelleres Renden führt jedoch zu blockigerer Darstellung.Ein/Ausschalten vom automatischen Aktualisieren der Daten wenn Änderungen am Filter wirksam werdenEin/Ausschalten des Zwischenspeicherns von Ergebnissen während Filteraktualisierungen. Dies verbraucht weniger RAM, führt jedoch dazu, dass bei Änderungen der Filterparameter der ganze Filterbaum neu berechnet wird. Dies erhöht den Rechenaufwand deutlich.Ein/Ausschalten der Beleuchtungseffekte beim Rendern von Objekten die dies anfordern. Beleuchtung bietet wichtige 'depth cues' für mit 3D Oberflächen umrandete Objekte. Deaktivieren erlaubt u.U. schnelleres Rendern bei komplizierten Szenen.Ein/Ausschalten der schwachen Randomisierung (Galois linear feedback shift register). Starke Randomisierung verwendet einen viel langsamere Auswahlmethode bietet dafür aber einen besseren Schutz gegen unbeabsichtigte Korrelationen und wird für die endgültige Analyse empfohlen.Ein/Ausschalten von visuellen Effekten in der finalen 3D Ausgabe.AktiviertEndeEnd rng Erode DistFehlerschätzerFehler - Fand NaN in pos-DateiFehler beim Kopieren der DateiFehler beim Interpretieren eine Feldes in der DateiFehler beim Rangedatei interpretieren, erwarte Ionenanzahl bzw. Rangeanzahl.Fehler beim Laden der DateiFehler beim Laden der Datei: Fehler beim Laden der Statusdatei. Konsole für mehr Informationen.Fehler beim Öffnen der DateiFehler beim Öffnen der Datei, überprüfe Namen und Berechtigungen.Fehler beim Öffnen der pos-DateiFehler beim Verarbeiten von Node: Fehler beim nochmaligen Öffnen der Datei nach dem ersten ScanFehler beim Lesen der Farbinformationen in der Datei. Erwarte 3, durch Leerzeichen getrennte, Dezimalwerte.Fehler beim Lesen:Fehler beim Lesen der Datei: Unerwartetes Format, sind Sie sicher, dass dies eine korrekte Rangedatei ist?Fehler beim Lesen aus pos-Datei (nach dem öffnen)Fehler beim Lesen des langen Namens für Ion.Fehler beim Lesen des kurzen Namens für Ion.Fehler beim Schreiben der Datei. Stellen Sie sicher, dass das Zielverzeichnis nicht schreibgeschüzt ist.Fehler beim Lesen des DateiinhaltesProgramm beendenExportierenAnimation exportierenAktuelle 3D Ansicht exportierenAktuellen Plot exportierenIonendaten exportierenPOS Daten exportierenRange exportierenRangedaten exportierenRange exportierenAnalysepaket exportierenExportieren:Ext. ProgrammExt. Progr.ExtremaFehler beim Lesen der Rangedatei.Kann Parser nicht zuordnenSchnelle aber schwache RandomisierungBildausschnittDateiDatei : Datei existiert bereits. Überschreiben?File readback check failedDateitypAuf Dateien wurde mit relativen Pfaden verwiesen. Relative Pfade beibehalten?Filesize during readback appears to be zero.Filter CountFilter StashesFilter zwischenspeichernFiltereinstellungenFilteransicht für den aktuellen StashFilternFix. Bin-Anz.Fixed Tick NumFixe MarkerFixe BreiteKanäle tauschenAnlegen des Ordners ist fehlgeschlagenSchriftgrößeFür Stash Gefunden:AnteilBildanzahlHäufigkeitsprofilHäufigkeiten (core+bulk)AllgemeinBrillenfarbmodusGrün-MagentaGrauHeissSollten Sie dies wollen, kontaktieren Sie den Autor oder verwenden Sie den Sourcecode um es selbst hinzuzufügen.Bild FortschrittDie Datei enthält eine falsche Anzahl von FeldernIndexInformationen zu diesem ProgrammInvertiere ClipIonIon IonenfarbeIon InfoIonennameIon SamplerIonentransform.IoneninfoIon&en... Ctrl+NIon. TransformierenIonID IonenIsosurfaceIsovalueJetLässt das Programm via Internet überprüfen ob Updates für diese Programmversion verfügbar sind. Danach informiert es über die neuen Updates.Level of separation between left and right images, which sets 3D depth to visual distortion tradeoffBeschränkung der Screenshot Dimensionen; stellen Sie bitte sicher, dass Breite und Höhe die ursprünglichen Werte überschreiten, oder dass diese kleiner als die ursprünglichen Werte sind. Sollte Sie dies stören, melden Sie bitte einen Bug.LinienbreiteLinienListe der verfügbaren FilterListe der Rangedateien im FilterbaumLadelimit (MB)Lade Datenquelle (Datei->öffnen) vor dem Auswählen eines neuen FiltersFehler beim LadenLokale DichteSperrenAchsen Vergr. sperrenLog. SkalaLogarithmischAnleitung konnte lokal nicht gefunden werden. Starte WebbrowserMassen-ZentrumMaxMax GrößeMax. RAM-Nutzung (%)Max. Sep + ErodeSpeicherzuweisungsfeher beim Laden der pos-DateiMerge other fileDatei zusammengeführt.MinMin GrößeMonitorBewegungsgeschwindigkeitVerschieben - Halte Strg zum kopierenVerschieben - Halte ⌘ (command) um zu kopierenGleit.Durchschn.NN Freq.NN MaxNeuer Kameraname...Nächster Vollbildmodus: ohne WerkzeugleistenKeine Daten zum SichernKeine Filterstashes zum Bearbeiten.Keine Filter bedeutet keine Daten zum ExportierenKeine numerischen Daten gefundenKein Plot vefügbar. Plot muss vor dem Exportieren erzeugt werden.Kein Plot ausgewählt.Keine Rangedaten. Clusteranalyse nicht möglich.Kein Range für "bulk" ausgewählt. Kann mit Clusteranalyse nicht weitermachen.Kein Range für cluster "core" ausgewählt. Kann mit Clusteranalyse nicht weitermachen.KeinerKeine (Roh count)NormalisierenNormalisieren mitNicht verfügbarBin-Anz.Num RangesAnzahl MarkerNum XNum YNum ZAnzahl Bins xAnzahl Bins yAnzahl Bins zNumber Density (\#/Vol^3)BilderanzahlAnzahl der Punkte: ZählerÜberprüfe online:Online UpdatesOnlinezugang für nicht Win32/apple systeme wurde absichtlich deaktiviert.Kontaktseite öffnenStatusdatei öffnenOpenGL fehlgeschlagenÖffne Kontaktseite in externem BrowserUrsprungUrsprung OrthogonalAusgabe AnteilAusgabe AnzahlÜberschreiben?P&lot...PNG Datei (*.png)|*.png|Alle Dateien (*)|*Pos-DatenPa&ket... Ctrl+KPaketverzeichnisPaketverzeichnis existiert bereits. Werde es nicht überschreiben.Anlegen des Paketverzeichnisses fehlgeschlagen Überprüfen Sie ob der angegenbene Ort schreibgeschützt ist.PaketnamePanel DisplayParam.Nach SpeziesPerspektivischEbenePlane NormalPlotPlotlistePlot TypePlotfarbe Plot-Funktion meldete einen Fehler: PunktwolkePunktePOS-DatenPos-Datei ist leerPos-Dateigröße scheint eine nicht ganzzahlige Anzahl an Einträgen zu habenPos laden durch Interrupt abgebrochen.Position APosition BPostPostprozessVoreinstellungenEingabe drücken um Kamera wiederherzustellenEingabe drücken um Stash wiederherzustellenEingabe drücken um neue Kamera zu speichernEingabe drücken um neuen Filterstash zu speichernPrimitivProgrammeinschränkungProgramm TextausgabeProjektionEigenschaftPseudo-Random"Quick and dirty" Analyse von Punktdaten.Radialer AbstandRadial DistributionRadiusRan&ges... Ctrl+GRangeRangedateiRange SourcesRange AnfangRange EndeRangedatei scheint leer zu sein. Prüfe ob die Datei wirklich ein Rangedatei und nicht leer ist.Rangedatei schein inkonsistent zu sein (z.B. überlappende Ranges)Ranged Dichte (pts / vol):RangesRangingVerhältnis (Zähler/Nenner)RohRohdatenfensterLesbare Dateien (*.xml, *.pos, *.txt,*.csv,*.ato)GeradlinigGeradlinige Grenzen:Rot-BlauRot-ZyanRot-GrünReflexiveAktualisieren abgebrochenZuletzt verwendetAusgewählte Kamera entfernenRenderreihenfolge...Rendering tiles...RepresentationZurücksetzenAlle zurücksetzenWiederhergestellte Kamera: RotierenLinealSpeichern &als... Ctrl+Shift+SDatei speichern...Speichere Bild...Aktuellen Status als neue Datei speichernFehler speichernPlot speichern...pos speichern...Speichere Rohdaten in DateiStatus in Datei speichernSpeichere Status...Gespeicherte 3D AnsichtGespeicherte Ionen:Gespeicherte Pakete: Gespeicherter Plot:Gespeicherter Status: Speichere Bild SkalierungsfaktorSicherheitswarnungDaten oder Statusdatei auswählen...RNG Datei auswählen...Aktivieren Sie zuerst ein Punkt aus dem Filterverlauf bevor Sie einen neuen Filter auswählenDaten auswählenAuswahlEinstellungen für den ausgewählten StashZeige WinkelZeige BalkenZeige PrimitivZeige AuswahlZeige alle FensterZeige alle Fenster beim ProgrammstartHilfedateien und Dokumentation anzeigenZeige MarkierungBeim Programmstart zuletzt eingeschaltete Fenster anzeigen.Zeige ausgewählte Fenster beim ProgrammstartGrößeneinschrankungenGrößenverteilungGlatte && durchsichtige ObjekteQuelleSource FilterX-AbstandY-AbstandZ-AbstandRäumliche AnalyseSpatial analysis aborted by userAngebenSpectral FarbeSpektrumKugelKugelgrößeSpot sizeStandardabweichungAnfangStart rng StartupStash NameZwischengelagerte FilterStashed TreesStatus wurde von einer neueren Version dieses Programmes erstellt.. StemStufenStereoGespeicherte Kamera: OberflächeZielTextText-DatenText Datei (*.txt)|*.txt|Alle Dateien (*)|*TextgrößeDiese Datei ist ein "Status" Datei für das Programm 3Depict. Sie speichert Informationen über die jeweiligen Analysesitzung. Dies sollte ein gültige "XML" Datei sein.Diese Statusdatei enthält Filter deren Anwendung möglicherweise unsicher ist. Wollen Sie diese entfernen.Dies ist ein Problem wenn zwei oder mehrere Cluster auf dasselbe "bulk" Ion Anspruch erheben. MarkerabstandTipp: Verwende shift-click um komplettes Aktualisieren zu erzwingenTip: Sie können strg zum Zusammen führen verwendenTip: Sie können ⌘ (command) zum Zusammenführen verwendenLegende anzeigen ein/ausHauptachsen ein/aus schaltenLinkes Kontrollfenster ein/aus schaltenPlotliste ein/aus schaltenRohdatenfenster (unten)Zu viele Ranges scheinen ungültige Einträge zu haben (z.B. alle leer)Werkz.Total (inkl. nicht geranged)Gesamtdichte (pts / vol):Gesamt ranged TransformationsparameterTranslateTranslate WertTranslationTransparenzKann Speicher nicht zuordnenKann den notwendigen Speicher nicht zuordnen. Versuche eine geringer Auflösung oder speichere als Vektografik (svg).Kann Volumen nicht berechnenStash kann nicht erstellt werden, Auswahl ungültigKann den Filtertyp im Defaultslisting nicht bestimmen.Kann "showaxis" node nicht interpretierenKann "Eigenschaftswert" für "Kamera->aktiv" Node nicht finden.Unable to find the "backcolour" node.Kann "writer" node nicht findenKann das OpenGL (3D)-Panel nicht initialisieren. Das Programm kann nicht gestartet werden. Bitte überprüfen Sie Ihren Video-Treiber.Kann "backColour" node's "b" Wert nicht interpretieren.Kann "backColour" node's "g" Wert nicht interpretieren.Kann "backColour" node's "r" Wert nicht interpretieren.Kann "Eigenschaftswert" für "Kamera->aktiv" Node nicht interpretieren.Kann den letzten Dateieintrag nicht interpretierenKann den Kameratype nicht interpretieren für :Kann Autosavedatei nicht laden..Kann "filtertree" node nicht finden.Kann den Stashnamen für Stash nicht findenKann den Dateiinhalt nach dem Öffnen nich lesenKann Anfangs und Endwert des Range nicht lesenKann Rangetabelleneintrag nich lesenSpeichern nicht möglichSpeichern nicht möglich. Bitte überprüfen Sie ob der Ausgabepfad schreibgeschützt ist.Unbekannte Dateierweiterung. Bitte verwenden Sie "svg" oder "png"Nicht GerangedNichterkannter Effekt :Up Dir.Up dirUpdatenotiz: Neue Version Updated.Verwende KamerakoordinatenVerwenden Sie Shift / Strng-Leertaste oder doppeltippen, um Achsen zurückzusetzen oder zu verändernWertWert2AnzeigegrößeSichtbarVolumenVolumen (Dichte)Volumen (Läng.^3)VoxelVoxel Grenzen (min,max): (VoxelisationWARNUNG: Skipping node Waiting for refresh to abort. Exiting could lead to the program backgrounding. Exit anyway? Warnung,Warnung, Warnung: Nicht lesbare Versionsnummer in Statusdatei. Datei wird weiter eingelesen kann aber unter Umständen fehlschlagen.Warnung: Ihre Konfigurationsdatei scheint ungültig zu sein. Warnung: Eine oder mehrere Grenzen der geladenen Daten erreichen das Limit der numerischen Stabilität des internen Datentyps (Größenordnung zu groß). Erwägen Sie die Daten vor dem Laden zu skalieren. ArbeitsverzeichnisXYSie könne das machen, das ist in Ordnung, aber die Ausgabe ist nicht länger unabhängig vom BerechnungsprozessZoomgeschwindigkeit\% fertig\% fertig (Esc abbrechen)gesternvor zehn Jahrenvor einigen Tagenvor einigen Dekadenvor einigen Stundenvor einigen Minutenvor einigen Monatenvor einigen Sekundenvor einigen Wochenvor einigen Jahrenvor einer Minutevor einem Monatvor einer Sekundevor einer Wochevor einem Jahrvor einer StundeAnzahldXdYdZFehlerDatei wird weiter eingelesen kann aber unter Umständen fehlschlagen.in Zukunft?kürzlichNutzen Sie Ihren Paketmanager um up-to-date zu sein unabhängig von den Einstellungen die Sie hier verwendenx-yx-zy-xy-zz-xz-y§Kons.3Depict-0.0.19/test/0000755000175000017500000000000012723200271013433 5ustar pcuserpcuser3Depict-0.0.19/test/rangefiles/0000755000175000017500000000000012640746376015575 5ustar pcuserpcuser3Depict-0.0.19/test/rangefiles/test5.rng0000644000175000017500000000027312640746376017353 0ustar pcuserpcuser4 2 Ab Ab 0.60 0.60 0.60 Cd Cd 1.00 0.00 0.00 Cd2 Cd2 1.00 0.00 0.00 (Cd2) AbCd2 AbCd2 1.00 0.00 0.00 (AbCd2) ---------------------- Ab Cd Cd2 AbCd2 . 1.0 2.0 0 2 0 0 . 2.1 3.0 1 2 0 0 3Depict-0.0.19/test/rangefiles/test4.rrng0000644000175000017500000000124612640746376017535 0ustar pcuserpcuser[Ions] Number=9 Ion1=A Ion2=B Ion3=C Ion4=D Ion5=E Ion6=F Ion7=G Ion8=H Ion9=I [Ranges] Number=15 Range1=11.877 13.29 A:1 Color:CC00CC Range2=5.93 6.17 A:1 Color:00FF00 Range3=28.812 32.3 B:1 Color:FF0000 Range4=13.94 14.44 A:1 C:2 Color:99FF00 Range5=15.03 15.47 A:1 C:3 Color:00B200 Range6=15.89 18.43 D:1 Color:0000FF Range7=37.24 39.88 A:6 Color:999900 Range8=43.54 48.89 A:7 Color:CCFF00 Range9=57.43 60.95 A:8 Color:B2B200 Range10=73.44 79 A:10 D:1 Color:66FF66 Range11=27.3 27.81 E:1 Color:FF6666 Range12=25.97 26.29 F:1 Color:009999 Range13=23.87 24.29 G:1 Color:666666 Range14=27.85 28.33 H:1 Color:000000 Range15=0.98 1.13 C:1 Color:FFAFAF 3Depict-0.0.19/test/rangefiles/test11.rng0000644000175000017500000000045712640746376017434 0ustar pcuserpcuser4 10 Aa Aa 0.80 0.80 0.80 Ab Ab 1.00 1.00 0.00 Ac Ac 1.00 0.80 0.20 Ad Ad 0.00 0.80 1.00 ------------------- Aa Ab Ac Ad . 1.1 1.2 1 0 0 0 . 2.1 2.2 1 0 0 0 . 3.1 3.2 1 0 0 0 . 4.1 4.2 1 0 0 0 . 5.1 5.2 1 0 0 0 . 6.1 6.2 1 0 0 0 . 7.1 7.2 0 1 0 0 . 8.1 8.2 0 1 0 0 . 9.1 9.2 0 0 1 0 . 10.1 10.2 1 0 0 1 3Depict-0.0.19/test/rangefiles/test7.rng0000644000175000017500000000007512640746376017355 0ustar pcuserpcuser2 2 M M 0 0 1 N N 1 0 0 ------- . -0.5 0.5 1 0 . 1.5 2.4 0 1 3Depict-0.0.19/test/rangefiles/test8.rng0000644000175000017500000000007512640746376017356 0ustar pcuserpcuser2 2 M M 0 0 1 N N 1 0 0 ------- 3 -0.5 0.5 1 0 . 1.5 2.4 0 1 3Depict-0.0.19/test/rangefiles/test6.rng0000644000175000017500000000017412640746376017354 0ustar pcuserpcuser3 1 A A 0.60 0.60 0.60 B B 0.00 0.39 1.00 C C 1.00 0.00 0.00 ------------------- A B C . 123.456 234.123 0 1 1 3Depict-0.0.19/test/rangefiles/test6.rrng0000644000175000017500000000050312640746376017532 0ustar pcuserpcuser # Number of elements and Number of mass ranges [IONS] Number=2 Ion1=A Ion2=B [Ranges] Number=4 Range1= 12.345 13.456 vol:12.110 Name:A A:1.000 Range2= 22.220 23.100 vol:12.110 Name:A A:1.000 Range3= 100.142 101.330 vol:12.110 Name:B B:1.000 Range4= 44.320 56.680 vol:12.110 Name:B B:1.000 3Depict-0.0.19/test/rangefiles/test2.rng0000644000175000017500000000103712640746376017347 0ustar pcuserpcuser7 9 Somethingium So 1.00 0.00 0.00 Eleysium Es 0.00 1.00 0.00 Element115 El 0.00 0.00 1.00 Testium Ts 1.00 1.00 0.00 Protonium Pr 0.00 1.00 1.00 Higgsium H 1.00 1.00 1.00 Fire F 1.00 1.00 0.00 ------------- So Es El Ts Pr H F . 10.00 11.00 0 0 0 1 0 0 0 . 12.00 13.00 0 1 0 0 0 0 0 . 21.00 22.00 0 0 0 1 0 0 0 . 25.00 30.00 0 0 1 0 0 0 0 . 32.00 34.00 0 0 0 0 0 1 0 . 35.00 36.00 1 0 0 0 0 0 0 . 39.00 40.00 1 0 0 0 0 0 0 . 59.00 60.00 0 0 1 0 0 0 0 . 70.00 80.00 0 0 0 0 1 0 0 3Depict-0.0.19/test/rangefiles/test1.env0000644000175000017500000000044412640746376017351 0ustar pcuserpcuser#This is a random comment, # -first numbers below are numbers of ions and ranges, respectively 1 1 HiggsBoson 0.0 0.0 1.0 #This is a comment, but the next section is the mass windowing data #last number is multiplicity HiggsBoson 110 135 1.0 1.0 #other useless data 1 3 5 3 lalall 3Depict-0.0.19/test/rangefiles/test1.rng0000644000175000017500000000051312640746376017344 0ustar pcuserpcuser10 6 Aa Aa 1 0 0 Bb Bb 0 1 0 Cc Cc 1 1 0 Dd Dd 0 0 1 Ee Ee 1 0 1 Ff Ff 0 1 1 Gg Gg 1 1 1 Hh Hh 0 0 0 Ii Ii 1 0 0 Jj Jj 0 1 0 ------- 23.00 24.00 1 0 0 0 0 0 0 0 0 0 5.50 6.50 0 1 0 0 0 0 0 0 0 0 15.50 17.50 0 1 0 0 0 0 0 0 0 0 26.50 27.50 0 1 0 0 0 0 0 0 0 0 6.50 7.50 0 0 1 0 0 0 0 0 0 0 8.50 9.50 0 0 1 0 0 0 0 0 0 0 3Depict-0.0.19/test/rangefiles/test2.rrng0000644000175000017500000000041712640746376017532 0ustar pcuserpcuser[Ions] Number=3 Ion1=A Ion2=B Ion3=C [Ranges] Number=6 Range1=1.00 2.001 A:1 Color:A033FF Range2=20.00 21.00 A:1 Color:A033FF Range3=32.00 34.00 B:1 Color:33FF33 Range4=92.08 94.00 C:1 Color:FF00A0 Range5=39.00 39.98 C:1 Color:FF00A0 Range6=40.00 41.00 C:1 Color:FF00A0 3Depict-0.0.19/test/rangefiles/test5.rrng0000644000175000017500000000017212640746376017533 0ustar pcuserpcuser# RRNG Created: 25/12/0001 00:00:00 [Ions] Number=1 Ion1=Ab [Ranges] Number=1 Range1= 1.62 1.93 Vol:0.01234 Name:Ab Ab:1 3Depict-0.0.19/test/rangefiles/test12.rng0000644000175000017500000000074212640746376017432 0ustar pcuserpcuser4 10 Aa Aa 0.80 0.80 0.80 Ab Ab 1.00 1.00 0.00 Ac Ac 1.00 0.80 0.20 Ad Ad 0.00 0.80 1.00 ------------------- Aa Ab Ac Ad . 13.8794 14.2981 1 0 0 0 . 27.8655 28.2919 1 0 0 0 . 14.4333 14.6733 1 0 0 0 . 14.9400 15.2000 1 0 0 0 . 28.9467 29.1733 1 0 0 0 . 29.8867 30.1133 1 0 0 0 . 68.7993 69.0600 0 1 0 0 . 70.8533 71.1000 0 1 0 0 . 196.8867 197.2867 0 0 1 0 . 43.9400 44.0267 1 0 0 1 --- polyatomic extension 1 1 AaAd AaAd 0.80 0.80 1.00 ----------------- AaAd . 43.9400 44.0267 1 3Depict-0.0.19/test/rangefiles/test9.rng0000644000175000017500000000024112640746376017352 0ustar pcuserpcuser3 3 In InsidePart 1 1 1 Out OutsidePart 1 1 1 Bd BorderPart 1 1 1 ----------------------In Out Bd . 1.0e7 4.0e7 1 0 0 . 4.01e7 6.0e7 0 1 0 . 6.01e7 1.0e8 0 0 1 3Depict-0.0.19/test/rangefiles/test1.rrng0000644000175000017500000000012312640746376017523 0ustar pcuserpcuser[Ions] Number=1 Ion1=A [Ranges] Number=1 Range1=21.00 22.000 Vol:0.01094 Name:A 3Depict-0.0.19/test/rangefiles/test4.rng0000644000175000017500000000021612640746376017347 0ustar pcuserpcuser1 4 Q Q 1.00 0.00 1.00 ------------------- Q . 56.0822 56.1200 1 . 56.1200 57.1350 1 . 58.0012 58.1525 1 . 58.0000 69.1100 1 3Depict-0.0.19/test/rangefiles/test3.rrng0000644000175000017500000000453012640746376017533 0ustar pcuserpcuser[Ions] Number=3 Ion1=A Ion2=B Ion3=C [Ranges] Number=42 Range1=31.8372 32.2963 Vol:0.01521 A:1 Color:999999 Range2=63.7905 64.2793 Vol:0.01521 A:1 Color:999999 Range3=65.8300 66.4600 Vol:0.01521 A:1 Color:999999 Range4=67.8400 68.4250 Vol:0.01521 A:1 Color:999999 Range5=69.8100 70.2550 Vol:0.01521 A:1 Color:999999 Range6=66.8500 67.1800 Vol:0.01521 A:1 Color:999999 Range7=32.9200 33.1850 Vol:0.01521 A:1 Color:999999 Range8=33.4250 33.5500 Vol:0.01521 A:1 Color:999999 Range9=33.9250 34.2550 Vol:0.01521 A:1 Color:999999 Range10=34.9250 35.0750 Vol:0.01521 A:1 Color:999999 Range11=40.1692 40.6397 Vol:0.03021 B:1 Color:3300CC Range12=60.3107 60.7970 Vol:0.03021 B:1 Color:3300CC Range13=61.3600 61.6050 Vol:0.03021 B:1 Color:3300CC Range14=40.8200 41.0750 Vol:0.03021 B:1 Color:3300CC Range15=120.7344 121.2780 Vol:0.06041 B:2 Color:FF0000 Range16=122.7150 123.5700 Vol:0.06041 B:2 Color:FF0000 Range17=121.7650 122.0400 Vol:0.06041 B:2 Color:FF0000 Range18=68.8150 69.1600 Vol:0.01960 C:1 Color:FFFF00 Range19=70.8250 71.1100 Vol:0.01960 C:1 Color:FFFF00 Range20=181.1350 181.6250 Vol:0.09062 B:3 Color:00FF00 Range21=182.1500 182.6150 Vol:0.09062 B:3 Color:00FF00 Range22=183.1700 183.6250 Vol:0.09062 B:3 Color:00FF00 Range23=184.2050 184.5450 Vol:0.09062 B:3 Color:00FF00 Range24=241.5300 242.2100 Vol:0.12083 B:4 Color:0000FF Range25=242.6100 243.0600 Vol:0.12083 B:4 Color:0000FF Range26=243.5450 244.2200 Vol:0.12083 B:4 Color:0000FF Range27=245.6050 246.1550 Vol:0.12083 B:4 Color:0000FF Range28=362.2900 363.4400 Vol:0.09062 B:3 Color:00FF00 Range29=364.1400 365.5600 Vol:0.09062 B:3 Color:00FF00 Range30=366.3000 367.3300 Vol:0.09062 B:3 Color:00FF00 Range31=368.4600 369.2200 Vol:0.09062 B:3 Color:00FF00 Range32=184.6400 185.2400 Vol:0.04542 A:1 C:1 Color:00FFFF Range33=186.5500 187.3500 Vol:0.04542 A:1 C:1 Color:00FFFF Range34=188.5900 189.3100 Vol:0.04542 A:1 C:1 Color:00FFFF Range35=190.5900 191.3400 Vol:0.04542 A:1 C:1 Color:00FFFF Range36=92.3300 92.5900 Vol:0.04542 A:1 C:1 Color:00FFFF Range37=93.2700 93.6100 Vol:0.04542 A:1 C:1 Color:00FFFF Range38=94.2900 94.5800 Vol:0.04542 A:1 C:1 Color:00FFFF Range39=95.3100 95.5800 Vol:0.04542 A:1 C:1 Color:00FFFF Range40=64.7700 65.1100 Vol:0.03042 A:2 Color:FF00FF Range41=65.3500 65.5200 Vol:0.03042 A:2 Color:FF00FF Range42=67.3400 67.5000 Vol:0.03042 A:2 Color:FF00FF 3Depict-0.0.19/test/rangefiles/test3.rng0000644000175000017500000001235512640746376017355 0ustar pcuserpcuser19 59 Q Q 1.00 0.00 1.00 L L 0.40 0.00 0.20 N N 0.60 0.80 0.00 P P 0.00 0.80 1.00 QiP QiP 0.00 0.40 0.40 (PQi) A A 1.00 1.00 0.60 QP QP 1.00 0.00 0.00 (QP) QP2 QP2 0.00 1.00 0.00 (QP2) AP AP 0.00 0.00 1.00 (PA) AP2 AP2 0.00 1.00 1.00 (P2A) Q2P Q2P 1.00 0.00 1.00 (Q2P) Ne Ne 1.00 0.00 1.00 QiP2 QiP2 1.00 1.00 0.00 (P2Qi) Lr Lr 1.00 0.20 0.80 W W 0.20 0.00 0.20 WN WN 1.00 0.78 0.00 (NW) QN QN 1.00 0.69 0.69 (QN) L2 L2 0.40 0.00 0.40 (L2) Qi Qi 0.00 0.20 0.20 ------------------- Q L N P QiP A QP QP2 AP AP2 Q2P Ne QiP2 Lr W WN QN L2 Qi . 1.0300 1.10962 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 2.0163 2.11575 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 3.0325 3.10725 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 4.0288 4.15775 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 5.0025 5.10762 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 6.0088 6.11788 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 7.0400 7.10938 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 8.0550 8.10008 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 9.0238 9.11133 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 10.0850 10.1050 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 11.0525 11.1012 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 12.0650 12.1575 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 13.0600 13.1963 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 14.0288 14.1688 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 15.0488 15.1113 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 16.0388 16.1088 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 17.0063 17.1550 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 18.0900 18.1950 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 29.0613 29.1275 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 20.0362 20.1325 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 21.0350 21.1225 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 22.0925 22.1938 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 . 23.0888 23.1900 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 . 24.0688 24.1963 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 25.0288 25.1700 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 26.0613 26.1100 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 27.0538 27.1475 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 28.0100 28.1500 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 39.0525 39.1312 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 30.0163 30.1388 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 31.0400 31.1275 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 32.0688 32.1738 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 33.0457 33.1363 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 . 34.0086 34.1225 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 . 35.0928 35.1812 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 . 36.0410 36.1150 0 0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 . 37.0373 37.1875 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 38.0868 38.1175 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 49.0840 49.1850 2 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 40.0900 40.1625 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 . 41.0941 41.1375 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 . 42.0791 42.1500 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 . 43.0935 43.1450 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 . 44.0928 44.1513 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 . 45.0442 45.1300 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 . 46.0887 46.1100 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 . 47.0585 47.1813 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 48.0908 48.1488 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 59.0206 59.1813 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 50.0921 50.1788 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 51.0367 51.1513 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 52.0866 52.1288 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 53.0863 53.1263 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 54.0868 54.1313 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 55.0385 55.1950 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 56.0822 56.1200 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 57.0828 57.1350 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 . 58.0012 58.1525 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . 69.0057 69.1100 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3Depict-0.0.19/test/rangefiles/test10.rng0000644000175000017500000000026012640746376017423 0ustar pcuserpcuser3 3 In-P Inside-Part 1 1 1 Out-P Outside-Part 1 1 1 Bd-P Border-Part 1 1 1 ----------------------In-P Out-P Bd-P . 1.0e7 4.0e7 1 0 0 . 4.01e7 6.0e7 0 1 0 . 6.01e7 1.0e8 0 0 1 3Depict-0.0.19/test/ref-images/0000755000175000017500000000000012640746376015475 5ustar pcuserpcuser3Depict-0.0.19/test/ref-images/plot-ref.png0000644000175000017500000005235512640746376017745 0ustar pcuserpcuserPNG  IHDR IDATxwtU}?,`DcA)b7( bK%"6 (رPPP@@ALb-{Wzk33眙{=UUvY                               Nn`m< dNZx/R$Q.dBZkwIry[m_ 2ɯ_(N@?7A$7lRIq:_oEWZ;>K $wNrL+W>!ٰk$$J$ WZS_gG2lq䄪$G$٢.p$?IT}Di,Vk#ILBZ}E4,Ww_D-%yO=!SlOJ XmbD-tUKkm,PCSYFy^xV[`z `}@VO*Y7Kr!]-XnI6ߠ{ pF_wz0!jȺ L ƿ l$Wfx%S`*,`0S-Zk V۴~(I֪\ e*uk'$y9vs$Itn]<0oW<399od +ϯ3k[MKY6d5~@&?[@@V6d ;&8&K{dI?dj:)m0q+zZL[a`$0u}$Lv]N=8 LX]oU`[Xu]@&zX֗L-\/ɞ&'ͺm;?zOU}CU\`*ukg%ӰMIUOV~rdz0>6I.Id$Mr[&?,`u3յ$Ik~* L~*Yڠ{  mKV0+ m$W0?-L|L%}.L'l`TwNqMYu/[Yq+z` zL,L6iX|#`5[_06TWd$7NבbgWe + \7NI:-Y[= k ĪzckU7IЭz\km9>YY:tuUջf;Kn]c?ck-,CsU=pLKQ?n@YkuCV54rn5u\dX@7!IOZ{&I6x,z UIJy$qQoY?;eI~=`WU qAWՓf9IWjV LV5=t  Z{R͓|m+ ˿$ZKKjK&@JmU]0]kMugkx+bpEUPն*r\VUk}4d|\L =Xa&yvkUnөIn䕯Kn$zv#u(z+ik'i`־odJLrF-R} Vd٫'yo$9?_U2bUrXJ V׵5F*{6]1oڭ/ X`w5W䰮1nWII~d$Mi$]ϐ%s \XX@Uӓ9bM0 "SU{'9<kU{yYXUնUՒ'I1INIGoUu|ƙ z`]-Ɏ&g$;n2έc/ 0ZU&Rvnpȗj9L2=DI"|W6 A2ɕ%?tSA^? @ &~_GX[C[k5z-XI C[kw;,'YXJYzkc9%W `-gw`%\!ZkNr$&9SIdӪu[yޛ?XU@l7gm/%9 ^A%yV2,4G,zy#`Z_@`ӎjsft*@ט~?ɛ|9ɻ2þOlkf˱uǏ$wmQUϪVjmIvIrbS.B{,C`yyuϩ%:5ɩ|:ɭ/T՗WA>! XN '&3#v9=ɇY9)SuNPUJr 4ɏc]<"ɓ\U) ?[,F/WIvg?$٠[CO%y{oNˆWU8n~=}^~5d[Z{DkE]!qt 6\e$g{pJE7?ϑc6;sxOL$$þZϧ֕ B&\UoYyzj y1I[}@UwԮ8Ff$#^ XU W_ _Ůӆ\hI L<ֽj$V/?aIX>7ɇQc%~`SU:d}~yZEyA%!F4ٞF ېs/},ɿ5S׷L܅ȃd}XkzoS#鮸oUuz=CU=u3gyO$%IU!{qCkU>.b=ώ,p,@os1v?Nؒc\UW%UΛҺ t3O[1^;dpGsU>r} ?YUG^>9b?iEv"~?aC,pez+c4Jߓkj$u di ڿ1}G4grPxE. Ws`U}zĦp׆tU2K}P?1Ψ^;KEUUg.bGl(ɟ, 9ߙ@z=yԻFl:w6r ~?u,cB\6[~:<_F@oږ3eR/ ˪ օ0 od&]?iIrXk3h_RUQ`TխZkdnA;d{ '݁ݶ^Uz w񽽮!ޙ֋wu!]ϱO0 T+olyegrP==j${C[pXf |sGej}s[k$5{KٝZ{GU=ex"K7 O>dݖ>m  $[Zk;礝t$&9rA$Nיo< ɮ7I~3 å;ݽÖ"QViKVO靟Z{rGVՇk~Ⱥ#&y2R1d݁k;w&yRn@ot? $iFR^da\ӽn'q6M~EI_O^koyWՑ˭:nj}(Ah݆<ҹrU1>q |nHcnƁ,|$o>& njtZ;'Sc zskԪ:wNk;I[S<9%3Uu:~)`$&j4; _!TՁӍ~4Dw''9`]_Z; ^8f#j=0slI\U⬼^ߪQd$yTUԠ3$EVqEgun˼'VRGLb諸*GXIw~sE~7?jNwt'/9QI z3bMJ˨}dȺE}hkmbX#@ |o8nd\{$-s>:>]᭵h:Lu$nX/m}jȺ.Qu)A% -S>xzUuI64XľC}qwHU/ΟNI2lZ]ZkY<~͓ wV kEx]osLaC=e#oyԥw̒O .Pg'1 ,a_5tn;~WUU8gzcZ:ȋq^$=dӝI>=dӞsLj!i/IԪ:bĦֶC f6w#jl9~iRq ,#6ꟍ|ۨ|;'wc YE*WxuGpȺoTY~=I:ߧ!I^ۍ`0d;U5^54vLrF|`Ȧ=[koZ;nO#!{TF_K?C6r$^5$̰@|wh-[k$y{[dX.n Fq ,_֞ZۻKg ֞ZڃzUu QW^]q̷17Puª2,exH=lW?dj9!a3ޮա"RxP.c^6q'yG&D|1Ckk5ˆo=pF]Zk['h=nD;7j}U؅ ,ݷKk#^Saq9KaTo~ސ=k%o||`)=dڇ+w5Ooӈ[koIrDkynkӒ||Z;ѳw־Z{tk]|kb֜A!Iޝ{Wk3uy>xŧ4^ZkȐ[OZ;7sg95ΪUU2ZUɅRt8S#,$oȵM_li  X㭒\4nlǜ5cOtU],6䵜맪,&rJU* IDAT=&ǿDc7f+IH:cڹINq#7Iί/Բ/ ں9Ih%I08 v$WX󙋧Neھ2n$?LҒ|r')zIO.T2#^] ^Isy[kϮ/SWoW]=U%.< EfjӒre}.Y>?izsjWKr$8 'qT{|RYmXN1)JU:bRcIS{xdT}RV;c,#UF5VU$]=Cu8@'5 @` .t<.Gfj@[kr D>_UNm6䤮W[Wi 0Zk[&%Kf] uYWCI.O>sxWY^f,7I$$&yҽ('Va 4˫0L7-dUu*/>;%Y?9䷳g5dz,Kd$&|7VWq:շIaSfj0mM=Um YINc{֦ /Ibd=V㒼N׎tW $GUWdŌ\GXNrJkZkȎ+?'٦Z7;#.p3v#+] `!| +jߵ<7'I6;dj |WJ,ee5xaVsL 8̹U6|xzza[\Um]0xmeUz,57VL2rV/k4g; ՃK\$:iRII;ɛfZ\$LzA;}U}[/NW:&"}f}8vm?*SWՇYoLC<]n6U]%NI^IC9UD]w൮:$YW2dn$7iUoUKzTέr<~ νc&mxڐ?QC?y_VovTUXӾ<>^H5'!u VwtU)Zߒl&VI{]U_U'tݪz[U%ɑC}ua[UXNc%VyZ{^vMrToScމ3\}oƠϰHoÇF7ػ|Н+PU3zު'87F!i?ɞqDZېU)bgz'}-/p+ݻ3Q;U3,$ /:wX ouB61þ_-$h{6þ)v<[ ޼W-x܀dב:nH/͙>WO%(0!/-?Z":WU4}f9qs cSz? 9qi<DzmdzCD3l Moғg6{pO>O$~c3iL??g;X/T+c7;|W|~(VVf M[Ս]_qmE_e#~ߝz'-`}EAw๷Q|~_?DzӐ4.cTK僻؇Ŗβߘ3pf97oӔfA$٨v}('yG Y7:i\v͆pvz[kƪ s1wߴYo;T,;]~}8ctٿw{V دo]ߌV*okfӐg .S^DV<`7LH녊壙 P~„R|6:$w &ydo]՛-ݦ|<yY5?1Lv-?1ů’;[kߨ|}IowcY6m9ӳwt=#u`ۿ 1h>ebE8?N/Ӆ HU} FruOܨ/  :HUn"ܥWϜeq[l^6;%yW_3Ee.a#l"kvlZِmc(WUeG.IuWU_㩿''8߬E!S Z _X+UJnbä헜UUVձ2ds<1_B6/gwϩ/@zOCi~&yKFֿ~|RXAg Ӭlԡoc< a! ~3R?gG?̫!3s[d(,']ߕe1Cd`NW /<wϐuϵGLEz節IJ-rrM4GZFb{f kzvV7b`CqLd19y[~k }yU~#͵~Z!߭fvhkFl,>z``ܫi]5d`v>sK!/v7"0Gc6 Yy{.qGu>Q/)=UU/` Yqwf8׌1`Y68t>'F7,c:y؟C-k7'xO5S-=^3ǩ9ˏ>붼?'1T),+W~hz@~&c"X&EzmU=4ɋFުE=7sQSnA"=vjUkyB5Yn8>{yn0N/e9Kx|^O ɾʹ==xW^^UcҸwd'y n# }xio#|~s|On1zPodwȚey~`{O[yH InTOH<_$v{yO|z{ޮvX6pOm ɨ?G i0ơKjyӟ:>\>v-"YrO/ky:#ILr*9SU}+INֻ*ɥF}zrڷbzVc8d$͵ow~b%d6K7!2h[.eI?Oh?[{Zi]}ېP,̡vtoߋKԇW3$NJٷ@8+"7u; K~ym!$ۭ|d (gf$X~xoMvWΐߒ+L}c5#3_4ǧ{Xo\%ߓOC=9w357FU?b{.S*k>͐A`od͞ $xD}ߐ:*@WN[WL'm'$o`1~g ߖY=H9+,/c|zί=S'kZky#WdӍ!?l[E>cgHfggo3o$wys^9-}Po.3,FƮ?my}<̓{(Vz=޽!mD) V_v$51z_;$uį6_ x y/;Zkowlkwʾu=#Y"|5 5| xGU}C}Xe^o=l.~=ՈԪ,CKf9dǁ?0d{y|:6ᖭefnhI7x9[?VБ#wٓEUu_fV U 91V^GVdZ?ROrQk+$9Yjg{hO;xoz=w^I~(i>˧w ɻ-Yp>~~ v4~YU?@k9_v+kߵy0 :rwbǮnqCEsԇf궹}u[y{Ankz}/#zV/ ^Z/ufw20{k/F]}TCoDmIzI6\'!/IHs3H2xډZkg`]ʿ6Y'jZ{@ky>ׄՇ;k#fIWM{:]}$kyZkZ;ې+>ªzNa^Zfk݈/~jT>t]N=9}uڰ;X >'dxpZ;`z%5%ؒܪ68ėg:77%UoZ۽ڏ:c@zLETo&WI~fU5)Pjw25_[]`dkqaTW[kw5W̵>&_UZ"׌}\{ʭe[LO嚹 z,i]ҥ$Hr$rBAX^ZnFa-]UHo7LO!PU]^kz?r>Nj: p^cԙ[kYv˵fUM"$6KG)ӝ|,=}n;\JR+$-b祻)~ *7UmBLr2WTە3w258[vi.SF,g5VL]xQW~{&l$tbb1$Zt7>\4o=nIҪ\$e*Sk5">gd}ְ~kJp w~Um'k7_9ITU,sdا}1I~?F`$Lrz>ɶI>鮴LES8ݕ`$ iH{'9i$LEn_I=dLoNw%H%9?Ʌ J$LE\Ir$TBv7'|?#ɿh=+IK AYXmUk ߩvt?Ѳ@%RU'&yto֞Zokm1;Z{c\3`|Fn̍X +[kJr;t y{T4bLEH4X^A{%s{~UzXZkh]s_W^A/t9~l'ٲ^ֲhh9g1UeZԼțdj9l`k1j鮦T̒ZkTKSU)y3l{Ӑc4%{X=2ޜdngwIҺY bW!U~sS-[ l;ZZk5?:þkU^0%4H_>leU]jeXnH rU>V[@o;ɣm͒omkt6F $Svj]*}kmԨ͔pkm}(X"]| Zkok=vDkeġ]/tiJeg1$ wY :/ :v$/cwU Cg~9r@xikI2ni,/X>AֶL򘮌I^<á?Mr JfI6Ho'UuLVUrɪԭ}4C[?VUs$ItF$)|'YTI~QU $V-e1O:=dP,jXXi.}H YwѤ'' %Y;9W&Ҕ*qCIjfGw9$G$UIn?0Ǻ$wMUP0޸𠪮tߡ{@ =UuyUޒadJ`q\.ɱS%$kjсݽɧPpS/ߕaS|ﮂ%-ɥIz' n3OwD$?Nr~1_ܔNtCWIHrm~J$_Kr`QPIpv/[/${  `Uӆ6_ݏưj>k[cVILѪگ7H`u3 _75y, YdOsKTՃ `y w%`A13uc=op_Uثad{]|3?𸪎_d6߲ oT^ .+jcUzp;edK]UOYߵ>X}65>F Yu&Y;zFw?u* :$k\"f˨OZdډ(iLU%yЮu, ;IKyCoyyLҕ#۟$-qTՉ1>$$9I 9,ߞ~WU항?4#ϟQUg,$Sl wN`rM~hSFl$g/lww-wأ7yg 7mAm>wGEU=] focq%P0?7j)tk(t6@ʳKA<UC Yw2!I~2tUE Dw?4I^__ԗJ@wc- ǝN(.6v)]INi~:9(2Ap=gdTi, E[8U$'@w-EsOs (`6TVU.3Iv$}hTտmݲ_GOQUy~CklkMw?cI:\, VolP plǏltd$MR;x_cop?NrU&C\Ig}x;%Ecߜ#6tU1`nc-p#}yw/.O˽{ ?*Y7b' 94ɳ{Øǝ䷳[] yx$OrĄ<"Uufw?j\p@=\;"^ˬ^ݯtwsKrPG%\T1P|G&y`+I,uw}A!6sGNIMݏND `54&z$P08Xok7Iv0f]ݒ-P0y,k$|-I6{KLŃW=&=yUb *ӷ^PUN`tUu.^%[ LUuL~'d}%xk;'v$'}pbSݛ+0I}fU+FK} tN`%d Sݟ0)d$N`#9N`%$'gG%~,;\% `eW$"U^In$&awAZ X8S>`fTWꬪxU' f$y8&7@(5G&M1)6@+I&nc XYI$%$2@+W(3{8\P @7o%̷%%ɮP0.M%fQ(o-(P @ @(ٵF̡]eu̳n)0_KCݏ0|ytI=<6 XyLrmw&q (P @ @($7/vI(̯KlIY [@ @(YF̡],>Ue[Kbd$s_lV˒I61G"\gIݛ"Pt̷{'up@r%, I~*(,% 'I>!"X5"`R$4I2wfS@K`69I;,G9>I-VՅzt'5wU RX:0 1IL($%yPߐ28iyygOa'"cINƘ$_w^w̋n)0_IY!䆑}0%IsI6B#=) `Eq@P P06@((~nLNu`(P @ @(PP @((P @ @(PP @(P @(P @(@(P P @(PP @(P @((P @(@(P P @(eے=IENDB`IENDB`3Depict-0.0.19/test/dogtail/0000755000175000017500000000000012640746376015101 5ustar pcuserpcuser3Depict-0.0.19/test/dogtail/test.py0000755000175000017500000002771612640746376016452 0ustar pcuserpcuser#!/usr/bin/python # # test.py - Automated UI testing for 3depict # Copyright (C) 2014, D Haley # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import os from os import environ import traceback import subprocess import time import tempfile import struct import array import random #Dogtail imports import dogtail from dogtail.config import config from dogtail import dump from dogtail import rawinput from dogtail import sessions from dogtail.procedural import * from dogtail.utils import screenshot from dogtail.predicate import GenericPredicate #Python magick - wrapper for imagemagick (no docs, afaik) import PythonMagick as Magick #HELPER FUNCTIONS #--- #Create a predicate from name/role def element(name,role,description=""): return predicate.GenericPredicate(name,role,description) #launch the colour dialog from the main window def loadColDlg(app3depict): viewMenu=app3depict.menu('View'); viewMenu.click(); backItem = viewMenu.menuItem("Background Colour...") backItem.click() colDlg = app3depict.findChild(element("Choose colour","color chooser")) return colDlg def sameImage(fileA,fileB): imA=Magick.Image(fileA); imB=Magick.Image(fileB); return imA == imB def appShot(application,ycrop=0): time.sleep(0.3) # Wait a fraction of second, in case image is not very static shot=screenshot() mainFrame=application.findChild(element("","frame")) xyStart=mainFrame.position; xySize=mainFrame.size im=Magick.Image(shot); im.crop(Magick.Geometry(xySize[0],xySize[1]-ycrop,xyStart[0],xyStart[1])) im.write(shot) return shot def find(target, someList): for item in someList: if target == item: return True return False #--- #Close the program def closeProgram(app3depict): fileMenu=app3depict.menu('File') fileMenu.click(); exitMenu=app3depict.menuItem('Exit'); exitMenu.click() try: reqDialog=app3depict.findChild(element("","alert"),retry=False) #For some reason, pressing the dialog contents using .button(...) does nothing # manually use keycombo to quit if reqDialog.name == "Error" : dogtail.rawinput.keyCombo("o") except: reqDialog=None #Try executing/aborting the file->open menu def openTest(app3depict): global overrideImage shotBefore=appShot(app3depict) fileMenu=app3depict.menu('File') fileMenu.click(); openMenu=fileMenu.menuItem('Open...') openMenu.click(); saveas = app3depict.dialog('Select Data or State File...') tmp=tempfile.NamedTemporaryFile(delete=False) tmp.close() filename=tmp.name+'.pos' writeRandomPos(filename,100) #Force gnome's annoying dialog to actually display a # place to type hddButton=saveas.findChild(element("File System","table cell")); hddButton.click() fileText=saveas.findChild(element("","text")); fileText.typeText(filename) saveas.button('Open').click() shotAfter=appShot(app3depict) #Point data should have loaded if(sameImage(shotBefore,shotAfter) and ( not overrideImage)): return False #FIXME: 3Depict bug! shouldn't need to tap space # after loading file - should auto-snap to bounds #Press space to tap dogtail.rawinput.pressKey("space") return True def filterTests(app3depict): global overrideImage #Fudge the bounding box of the # cropping region to exclude stuff like statusbar # - autosave, progress etc can affect this CROP_FUDGE=60 #Locate the data tab dataTab=app3depict.findChild(element("Data","page tab")) #locate listbox with filters inside filterText=dataTab.findChild(element("","text","List of available filters")) filterBox=filterText.findAncestor(element("","combo box")) xy=filterBox.position #move 5px beyond the box so we can click the down arrow xPlus=xy[0]+filterBox.size[0] -3 yPlus=xy[1] + filterBox.size[1]/2 #locate filter tree filterTree=dataTab.findChild(element("","panel","Tree - drag to move items, hold Ctrl for copy. Tap delete to remove items.")); #We can't interact with the tree using dogtail's # accessibility stuff - the tree doens't appear. # So just use the dropdown with undo dropdownBox=filterBox.menu("") dropItems=dropdownBox.findChildren(element("","menu item")) editMenu=app3depict.menu("Edit"); undoMenuItem=editMenu.menuItem("Undo"); #Single item on each for i in dropItems: #Range filter pops up a dialog, # needs special processing if i.name == "Range File": continue #Node is named "pos data", press "p" to activate it filterTree.click() dogtail.rawinput.pressKey("p") dogtail.rawinput.pressKey("space") dogtail.rawinput.click(xPlus,yPlus) shotBefore=appShot(app3depict,CROP_FUDGE) i.click() filterTree.click() dogtail.rawinput.pressKey("space") shotAfter=appShot(app3depict,CROP_FUDGE) if(sameImage(shotBefore,shotAfter) and not (overrideImage) ): print("Image didn't change before/after filter") return False #Tap the refresh shortcut, then refocus dialog to # kill tooltip dogtail.rawinput.pressKey("F5") time.sleep(2) #Wait for refresh to complete dogtail.rawinput.pressKey("space") #Tap "neutral key" to kill tooltip shotAfterRefresh=appShot(app3depict,CROP_FUDGE); if not sameImage(shotAfterRefresh,shotAfter) and not (overrideImage): print("Image Changed when refresh from cache") return False editMenu.click() undoMenuItem.click() SHOT_BLACKLIST=["Annotation" ] #Select the pos data item again filterTree.click() dogtail.rawinput.pressKey("p") for i in dropItems: shotBefore=appShot(app3depict,CROP_FUDGE) #Range filter pops up a dialog, # needs special processing if i.name == "Range File": continue dogtail.rawinput.click(xPlus,yPlus) i.click() shotAfter=appShot(app3depict,CROP_FUDGE) #For most filters, there should be a visible change if not find(i.name,SHOT_BLACKLIST) : if(sameImage(shotBefore, shotAfter) and not overrideImage): return False #Tap the refresh shortcut dogtail.rawinput.pressKey("F5") time.sleep(5) #Wait for refresh to complete dogtail.rawinput.pressKey("space") #Tap "neutral key" to kill tooltip shotAfterRefresh=appShot(app3depict,CROP_FUDGE); #Pressing refresh should do nothing if not sameImage(shotAfter,shotAfter) and not overrideImage: return False filterTree.click() dogtail.rawinput.pressKey("p") dogtail.rawinput.pressKey("del") return True #Try opening and closing panels with the menu, # check for change in GUI def panelTests(app3depict): global overrideImage viewMenu=app3depict.menu('View'); PANEL_TOGGLES=["Control Pane", "Raw Data Pane"] for i in PANEL_TOGGLES: shotBefore=appShot(app3depict); viewMenu.click(); viewMenu.menuItem(i).click(); shotAfter=appShot(app3depict); viewMenu.click(); viewMenu.menuItem(i).click(); if sameImage(shotBefore,shotAfter) and not overrideImage: print ('UI did not change, but should have:') return False return True #Try opening preferences menu, and activating a few items def prefTests(app3depict): prefMenu=app3depict.menu("Edit"); prefMenu.click(); editMenu=prefMenu.menuItem("Preferences"); editMenu.click(); prefDialog=app3depict.findChild(element("Preferences","frame")); #Get defaults tab tabFilterDefaults=prefDialog.findChild(element("Filt. Default","page tab",)); #Walk through all the filter entries in the list, clicking each one listFilters=tabFilterDefaults.findChild(element("","table")) listFilterEntries=tabFilterDefaults.findChildren(element("","table cell")) tmpDelay=dogtail.config.actionDelay; dogtail.config.actionDelay=0.05; for i in listFilterEntries: i.click() tmpDelay=tmpDelay; prefDialog.button("Cancel").click() return True #Try changing some of the view options def viewTests(app3depict): global overrideImage #Show colour dialog colDlg = loadColDlg(app3depict) #Set the colour to black, remembering orig #-------- #The first text field is the colour hex code field hexText=colDlg.findChild(element("","text")) origHex=hexText.text hexText.typeText("#000000") colDlg.button("OK").click() #-------- #Take screenshot shotBefore= appShot(app3depict) #Show dialog colDlg = loadColDlg(app3depict) #Set colour to green #------ hexText=colDlg.findChild(element("","text")) hexText.typeText("#22aa22") colDlg.button("OK").click() shotAfter = appShot(app3depict) #Colour should have changed if sameImage(shotAfter, shotBefore ) and not overrideImage: return False #Set the colour back to orig colDlg=loadColDlg(app3depict) hexText=colDlg.findChild(element("","text")) hexText.typeText(origHex) colDlg.button("OK").click() #Toggle axis shotBefore=appShot(app3depict) viewMenu=app3depict.menu('View'); viewMenu.click() axisItem=viewMenu.menuItem("Axis") axisItem.click() shotAfter=appShot(app3depict) #Screenshot should have changed if sameImage(shotBefore, shotAfter) and not overrideImage: return False #Restore axis viewMenu.click() axisItem.click() #Play with fullscreen shotBefore=appShot(app3depict) viewMenu.click() fullscrItem=viewMenu.menuItem("Fullscreen mode") fullscrItem.click() shotAfter=appShot(app3depict) if(sameImage(shotBefore,shotAfter)) and not overrideImage: return False #Leave fullscreen dogtail.rawinput.pressKey("F11") shotAfter=appShot(app3depict) if(sameImage(shotAfter,shotBefore)) and not overrideImage: return False return True #Try saving an image, and see if the file turns up def imageTest(app3depict): dogtail.rawinput.keyCombo('i') saveas = app3depict.dialog('Save Image...') saveLocText=saveas.findChild(element("","text")) tmp=tempfile.NamedTemporaryFile(delete=False) tmp.close() strDogSave=tmp.name + "-shot.png" saveLocText.typeText(strDogSave) saveas.button("Save").click() ressel= app3depict.findChild(element('Resolution Selection','frame')) ressel.button("OK").click() if not os.path.isfile(strDogSave) : return False return True def writeRandomPos(filename,numpoints): f=open(filename,'wb') #Inefficiently generate a whole bunch of random # floats in -100:100 randomData=[] for i in range(numpoints*4): randomData.append(random.uniform(-100,100)) s=struct.pack('>'+'f'*len(randomData),*randomData) f.write(s) def runDogtailTests(): environ['LANG']='en' # Start program run('3Depict') app3depict = tree.root.application('3Depict') #Tap escape twice, once for startuptips, # once to remove any autosave dialog questions dogtail.rawinput.pressKey("esc") dogtail.rawinput.pressKey("esc") #Run various tests #-------- if not panelTests(app3depict): return False; prefTests(app3depict) if not viewTests(app3depict): return False if not imageTest(app3depict): return False #This test does not return 3depict to # normal state, leaves file open if not openTest(app3depict): return False if not filterTests(app3depict): return False ##-------- closeProgram(app3depict) return True if __name__=='__main__': import sys global overrideImage overrideImage=True #Check for existing 3depict instances data=subprocess.Popen(['pidof', '3Depict'],stdout=subprocess.PIPE).communicate()[0] pids=data.split(' '); if not (len(pids) == 1 and len(pids[0]) == 0) : print("Cannot start - multiple program instances cannot be run with dogtail") exit(1) #Setup some rate parameters dogtail.config.defaultDelay=0.15; dogtail.config.actionDelay=0.15; dogtail.config.typingDelay=0.15; dogtail.config.searchCutoffCount=5 #Just complain if anything goes wrong try: testsOK =runDogtailTests() except : traceback.print_exc(limit=2) print('Test failed with exception.') exit(1); if not testsOK: print('Test failed.') exit(1) exit(0) 3Depict-0.0.19/test/manifest.txt0000644000175000017500000000170112640746376016024 0ustar pcuserpcuser#"Manifest" file. Contains the list of files that should be find-able with # 3depict. Used in unit tests. #Syntax is # [all|lin|win|mac] # path-to-file should be such that locateDataFile(...) [src/wx/wxcommon.cpp] can find it #Textures all 3Depict.xpm all atomic-mass-table.dtd all textures/animProgress0.png all textures/animProgress1.png all textures/animProgress2.png all textures/enlarge.png all textures/keyboard-alt.png all textures/keyboard-command.png all textures/keyboard-ctrl.png all textures/keyboard-shift.png all textures/keyboard-tab.png all textures/Left_clicked_mouse.png all textures/Left-Right-arrow.png all textures/middle_clicked_mouse.png all textures/plot_zoom_reset.png all textures/plot_zoom_x.png all textures/plot_zoom_y.png all textures/Right-arrow.png all textures/Right_clicked_mouse.png all textures/rotateArrow.png all textures/scroll_wheel_mouse.png #Startup tips all naturalAbundance.xml all startup-tips.txt 3Depict-0.0.19/docs/0000755000175000017500000000000012723200271013404 5ustar pcuserpcuser3Depict-0.0.19/docs/samples/0000755000175000017500000000000012640746376015073 5ustar pcuserpcuser3Depict-0.0.19/docs/samples/externalProg/0000755000175000017500000000000012640746376017545 5ustar pcuserpcuser3Depict-0.0.19/docs/samples/externalProg/python-example.py0000755000175000017500000000224512640746376023077 0ustar pcuserpcuser#!/usr/bin/python import sys import os #Append the contents of one file to another def appendFile(sourceFile,targetFile): try : fileSrc = open(sourceFile,"rb") fileTarget = open(targetFile,"ab") #Extremely inefficient!! byte = fileSrc.read(1) while byte != "" : fileTarget.write(byte) byte=fileSrc.read(1) except IOError: return 1 return 0 def main(): argv = sys.argv #Name of file that we will dump our results to OUTPUT_POSFILE="output.pos" #Remove any old files from previous runs if os.path.isfile(OUTPUT_POSFILE) : os.remove(OUTPUT_POSFILE) # do nothing if we have no arguments if(len(argv) < 2) : return 0; #Loop over all our inputs, then for .pos files, # create one big file with all data merged for i in argv[1:] : print "given file :" + i fileExt = i[-3:]; if fileExt == "pos" : if appendFile(i,OUTPUT_POSFILE): return 1; #Output to file failed, for some reason else : print "appended file to " + OUTPUT_POSFILE else : #Filename did not end in .pos, lets ignore it. print "File :" + i + " does not appear to be a pos file"; return 0 if __name__ == "__main__": sys.exit(main()) 3Depict-0.0.19/docs/samples/externalProg/bash-example.sh0000755000175000017500000000073112640746376022453 0ustar pcuserpcuser#!/bin/bash BYTES_PER_RECORD=16 echo "Num args : "$# echo "Working Directory:" `pwd` for (( i=1; i<=$#; i++ )); do eval arg=\$$i echo "Input file: $arg" echo "File size:" `filesize $arg` " Bytes" NUM_IONS=$(expr $(filesize $arg) / $BYTES_PER_RECORD) echo "Num Ions:" $NUM_IONS #Copy the output into the working directory, so that 3Depict's scanning of the working directory # for .pos files will find it cp $arg script-output-3Depict-input.pos done exit 0 3Depict-0.0.19/docs/samples/externalProg/loadPos.sci0000644000175000017500000000560612640746376021655 0ustar pcuserpcuser//Example function for loading, manipulating and writing // pos files in scilab, for integrating with 3Depict's // external program filter //------- function [errState, x,y,z,m]=loadPos(filename) x=[];y=[]; z=[]; m=[]; //get filesize [fileInf,ierr] = fileinfo(filename) filesize=fileInf(1); //ensure filesize has 16 as a factor. if ( modulo(filesize,16) ~= 0 ) errState=1; return end numEntries=filesize/16; //Open the file for read only, in binary mode [fd, err] = mopen(filename,'rb'); //Check to see we are A-OK if err ~= 0 errState=2; return end //Read the data in as floating point values in big-endian format data=mget(numEntries,'fb',fd); //check read OK if merror(fd) errState=3; mclose(fd); return end //Unsplice data, which was stored as xyzmxyzmxyzm... x=data(1:4:$)'; y=data(2:4:$)'; z=data(3:4:$)'; m=data(4:4:$)'; clear data; mclose(fd) errState=0; endfunction function err=writePos(filename,x,y,z,m) //Check that the array sizes match sizes = [ length(x), length(y),length(z),length(m)]; if max(sizes) ~= min(sizes) err=1; return end //Open the file write, in binary mode [fd, errState] = mopen(filename,'wb'); if(errState) err=2; return; end //Build a matrix to dump the data into // in xyzmxyzmxyzm form data=zeros(sizes(1)*4,1); data(1:4:$) = x; data(2:4:$) = y; data(3:4:$) = z; data(4:4:$) = m; mput(data,'fb',fd); //Check for io error if merror(fd) ~=0 mclose(fd); err=3; return; end err=0; mclose(fd); endfunction //------- //START OF SCRIPT //Inform scilab we may need lots of ram. stacksize('max'); //Strip out the script arguments from the general scilab arguments argsArray=sciargs(); realArgs=[]; numArgs =length(length(argsArray)); //'cause length() is dumb on strings. for i=1:numArgs if argsArray(i) == '-args' & i != length(argsArray); realArgs=argsArray(i+1:$); end end if( length(argsArray) == 0) error('no file to open!'); end //Load the first argument [errState, x, y, z, m] = loadPos(realArgs(1)); if errState error( strcat(['Unable to load posfile, :( ' realArgs(1)])); else printf('Opened file: %s ',realArgs(1)); end //Draw the point cloud scf drawlater plot3d1(x,y,z) f=gcf(); pointCloud=f.children.children; pointCloud.surface_mode="off"; pointCloud.mark_mode="on"; drawnow //plot a histogram of m, avoiding the error where m has no span // by artifically adding two elements, if needed. scf(); if max(m) ~= min(m) histplot(100,m); else histplot(100,[min(m)-1; m; max(m)+1]); end //Now shift each point around x=x-1; y=y-1; z=z-1; //now write the file back err=writePos('output.pos',x,y,z,m); if err~= 0 error('failed to write posfile, :('); end //Kill Scilab, because were done and would like to go back to 3Depict. exit 3Depict-0.0.19/docs/manual-latex/0000755000175000017500000000000012723172473016010 5ustar pcuserpcuser3Depict-0.0.19/docs/manual-latex/manual.bib0000644000175000017500000001452012723172472017744 0ustar pcuserpcuser% This file was created with JabRef 2.10b2. % Encoding: UTF-8 @Article{Boll2007, Title = {Investigation of the site occupation of atoms in pure and doped TiAl/Ti3Al intermetallic.}, Author = {Boll, T. and Al-Kassab, T. and Yuan, Y. and Liu, Z.G.}, Journal = {Ultramicroscopy}, Year = {2007}, Owner = {pcuser}, Timestamp = {2013.10.06} } @Book{Gault2012, Title = {Atom Probe Microscopy}, Author = {Gault, B. and Moody, M. and Cairney, J. and Ringer S. P.}, Publisher = {Springer}, Year = {2012}, Series = {Springer Series in Materials science}, Owner = {pcuser}, Timestamp = {2013.10.06} } @Article{Geiser2007, Title = {Spatial distribution maps for atom probe tomography.}, Author = {Geiser, B.P. and Kelly, T.F. and Larson, D.J. and Schneir, J. and Roberts, J.P.}, Journal = {Microscopy and Microanalysis}, Year = {2007}, Number = {6}, Pages = {437-447}, Volume = {13}, Owner = {pcuser}, Timestamp = {2013.10.06} } @Article{Hyde10, Title = {A sensitivity analysis of the maximum separation method for the characterisation of solute clusters}, Author = {J.M. Hyde and E.A. Marquis and K.B. Wilford and T.J. Williams}, Journal = {Ultramicroscopy}, Year = {2011}, Number = {6}, Pages = {440--447 }, Volume = {111}, Doi = {DOI: 10.1016/j.ultramic.2010.12.015}, ISSN = {0304-3991}, Keywords = {Atom probe tomography}, Url = {http://dx.doi.org/10.1016/j.ultramic.2010.12.015} } @Article{Moody2008, Title = {Quantitative Binomial Distribution Analyses of Nanoscale Like-Solute Atom Clustering and Segregation in Atom Probe Tomography Data }, Author = {Michael P. Moody and Leigh Stephenson and Anna V. Ceguerra and S. P. Ringer}, Journal = {Microscopy Research and Technique}, Year = {2008}, Pages = {542-550}, Volume = {71}, Number = {7}, Abstract = {The applicability of the binomial frequency distribution is outlined for the analysis of the evolution nanoscale atomic clustering of dilute solute in an alloy subject to thermal ageing in 3D atom probe data. The conventional v2 statistics and significance testing are demonstrated to be inappropriate for comparison of quantity of solute segregation present in two or more different sized system. Pearson coefficient, l, is shown to normalize v2 with respect to sample size over an order of magnitude. A simple computer simulation is implemented to investigate the binomial analysis and infer meaning in the measured value of l over a series of systems at different solute concentrations and degree of clustering. The simulations replicate the form of experimental data and demonstrate the effect of detector efficiency to significantly underestimate the measured segregation. The bino- mial analysis is applied to experimental atom probe data sets and complementary simulations are used to interpret the results.Microsc. Res. Tech. 71:542–550, 2008. VC 2008 Wiley-Liss, Inc. }, Doi = {10.1002/jemt.20582}, File = {:20582_ftp.pdf:PDF}, Owner = {pcuser}, Timestamp = {2013.10.06} } @Article{Stephenson07, Title = {{New Techniques for the Analysis of Fine-Scaled Clustering Phenomena within Atom Probe Tomography (APT) Data}}, Author = {Stephenson,Leigh T. and Moody,Michael P. and Liddicoat,Peter V. and Ringer,Simon P.}, Journal = {Microscopy and Microanalysis}, Year = {2007}, Number = {06}, Pages = {448-463}, Volume = {13}, Abstract = { ABSTRACT Nanoscale atomic clusters in atom probe tomographic data are not universally defined but instead are characterized by the clustering algorithm used and the parameter values controlling the algorithmic process. A new core-linkage clustering algorithm is developed, combining fundamental elements of the conventional maximum separation method with density-based analyses. A key improvement to the algorithm is the independence of algorithmic parameters inherently unified in previous techniques, enabling a more accurate analysis to be applied across a wider range of material systems. Further, an objective procedure for the selection of parameters based on approximating the data with a model of complete spatial randomness is developed and applied. The use of higher nearest neighbor distributions is highlighted to give insight into the nature of the clustering phenomena present in a system and to generalize the clustering algorithms used to analyze it. Maximum separation, density-based scanning, and the core linkage algorithm, developed within this study, were separately applied to the investigation of fine solute clustering of solute atoms in an Al-1.9Zn-1.7Mg (at.%) at two distinct states of early phase decomposition and the results of these analyses were evaluated. }, Doi = {10.1017/S1431927607070900}, Eprint = {http://journals.cambridge.org/article_S1431927607070900}, File = {Stephenson_cluster.pdf:/home/user/EMU/work/Literature/Stephenson_cluster.pdf:PDF}, Url = {http://journals.cambridge.org/action/displayAbstract?fromPage=online&aid=1424336&fulltextType=RA&fileId=S1431927607070900} } @Article{vaumousse03, Title = {A procedure for quantification of precipitates microstructures from three-dimensional atom probe data}, Author = {D. Vaumousse and A. Cerezo and P.J. Warren}, Journal = {Ultramicroscopy}, Year = {2003}, Pages = {215-221}, Volume = {95} } 3Depict-0.0.19/docs/manual-latex/manual.toc0000644000175000017500000001710712723172505017776 0ustar pcuserpcuser\contentsline {section}{\numberline {1}Foreword}{1}{section.1} \contentsline {subsection}{\numberline {1.1}Introduction}{1}{subsection.1.1} \contentsline {subsubsection}{\numberline {1.1.1}Background}{1}{subsubsection.1.1.1} \contentsline {subsubsection}{\numberline {1.1.2}What is Open Source?}{1}{subsubsection.1.1.2} \contentsline {subsection}{\numberline {1.2}Requirements}{2}{subsection.1.2} \contentsline {subsection}{\numberline {1.3}Platform specific notes}{2}{subsection.1.3} \contentsline {subsection}{\numberline {1.4}Getting help}{3}{subsection.1.4} \contentsline {subsection}{\numberline {1.5}Who wrote this program?}{3}{subsection.1.5} \contentsline {subsection}{\numberline {1.6}Alternate documentation}{3}{subsection.1.6} \contentsline {subsection}{\numberline {1.7}Helping out}{3}{subsection.1.7} \contentsline {section}{\numberline {2}Basics}{3}{section.2} \contentsline {subsection}{\numberline {2.1}Getting started}{3}{subsection.2.1} \contentsline {subsubsection}{\numberline {2.1.1}Licence}{3}{subsubsection.2.1.1} \contentsline {subsubsection}{\numberline {2.1.2}Installing the program}{4}{subsubsection.2.1.2} \contentsline {subsection}{\numberline {2.2}Understanding the interface}{4}{subsection.2.2} \contentsline {subsubsection}{\numberline {2.2.1}The Filter Tree}{5}{subsubsection.2.2.1} \contentsline {subsubsection}{\numberline {2.2.2}The 3D View}{5}{subsubsection.2.2.2} \contentsline {paragraph}{Basic movement}{6}{figure.4} \contentsline {subsubsection}{\numberline {2.2.3}Plot area}{7}{subsubsection.2.2.3} \contentsline {subsubsection}{\numberline {2.2.4}Console}{7}{subsubsection.2.2.4} \contentsline {subsubsection}{\numberline {2.2.5}Tools panel}{7}{subsubsection.2.2.5} \contentsline {subsection}{\numberline {2.3}Usage fundamentals}{9}{subsection.2.3} \contentsline {section}{\numberline {3}Quick start}{9}{section.3} \contentsline {subsection}{\numberline {3.1}Loading data}{10}{subsection.3.1} \contentsline {subsection}{\numberline {3.2}Loading an analysis}{10}{subsection.3.2} \contentsline {subsection}{\numberline {3.3}Ranging}{10}{subsection.3.3} \contentsline {subsection}{\numberline {3.4}Spectrum}{10}{subsection.3.4} \contentsline {subsection}{\numberline {3.5}Composition profiles}{11}{subsection.3.5} \contentsline {subsection}{\numberline {3.6}Counting Points and measuring volume}{11}{subsection.3.6} \contentsline {subsection}{\numberline {3.7}Concentration surface and slices}{12}{subsection.3.7} \contentsline {section}{\numberline {4}Understanding the program}{15}{section.4} \contentsline {subsection}{\numberline {4.1}Filters}{15}{subsection.4.1} \contentsline {subsection}{\numberline {4.2}Trees}{15}{subsection.4.2} \contentsline {subsection}{\numberline {4.3}Stashes}{16}{subsection.4.3} \contentsline {subsection}{\numberline {4.4}Plots}{17}{subsection.4.4} \contentsline {subsection}{\numberline {4.5}Cameras}{17}{subsection.4.5} \contentsline {subsection}{\numberline {4.6}Effects}{18}{subsection.4.6} \contentsline {subsection}{\numberline {4.7}Program actions}{18}{subsection.4.7} \contentsline {subsubsection}{\numberline {4.7.1}Save}{18}{subsubsection.4.7.1} \contentsline {subsubsection}{\numberline {4.7.2}Undo}{18}{subsubsection.4.7.2} \contentsline {subsubsection}{\numberline {4.7.3}Raw Data}{18}{subsubsection.4.7.3} \contentsline {subsubsection}{\numberline {4.7.4}Export Menu}{18}{subsubsection.4.7.4} \contentsline {subsubsection}{\numberline {4.7.5}Ranging dialog}{19}{subsubsection.4.7.5} \contentsline {subsubsection}{\numberline {4.7.6}Autosave}{21}{subsubsection.4.7.6} \contentsline {subsubsection}{\numberline {4.7.7}Export Animation}{21}{subsubsection.4.7.7} \contentsline {section}{\numberline {5}Detailed Reference}{25}{section.5} \contentsline {subsection}{\numberline {5.1}Data types}{25}{subsection.5.1} \contentsline {subsubsection}{\numberline {5.1.1}Ions}{25}{subsubsection.5.1.1} \contentsline {subsubsection}{\numberline {5.1.2}Plots}{25}{subsubsection.5.1.2} \contentsline {subsubsection}{\numberline {5.1.3}Range}{25}{subsubsection.5.1.3} \contentsline {subsubsection}{\numberline {5.1.4}Voxels}{25}{subsubsection.5.1.4} \contentsline {subsubsection}{\numberline {5.1.5}Drawables}{25}{subsubsection.5.1.5} \contentsline {subsection}{\numberline {5.2}Filters}{25}{subsection.5.2} \contentsline {subsubsection}{\numberline {5.2.1}Data load}{26}{subsubsection.5.2.1} \contentsline {subsubsection}{\numberline {5.2.2}Downsampling}{27}{subsubsection.5.2.2} \contentsline {subsubsection}{\numberline {5.2.3}Ion Information}{27}{subsubsection.5.2.3} \contentsline {subsubsection}{\numberline {5.2.4}Ranging}{28}{subsubsection.5.2.4} \contentsline {subsubsection}{\numberline {5.2.5}Bounding Box}{29}{subsubsection.5.2.5} \contentsline {subsubsection}{\numberline {5.2.6}Clipping}{29}{subsubsection.5.2.6} \contentsline {subsubsection}{\numberline {5.2.7}Spectrum}{29}{subsubsection.5.2.7} \contentsline {subsubsection}{\numberline {5.2.8}Profile}{30}{subsubsection.5.2.8} \contentsline {subsubsection}{\numberline {5.2.9}Spatial Analysis}{31}{subsubsection.5.2.9} \contentsline {paragraph}{Algorithms}{31}{section*.3} \contentsline {paragraph}{Radial Distribution:}{31}{section*.4} \contentsline {paragraph}{Axial Distribution:}{32}{section*.5} \contentsline {paragraph}{Binomial:}{32}{section*.6} \contentsline {paragraph}{Point em/re-placement}{32}{section*.7} \contentsline {subsubsection}{\numberline {5.2.10}Clustering analysis}{32}{subsubsection.5.2.10} \contentsline {subsubsection}{\numberline {5.2.11}External Program}{34}{subsubsection.5.2.11} \contentsline {paragraph}{Command syntax: }{34}{section*.8} \contentsline {paragraph}{Prior to program execution:}{34}{section*.9} \contentsline {paragraph}{After program execution:}{34}{section*.10} \contentsline {subsubsection}{\numberline {5.2.12}Annotation}{35}{subsubsection.5.2.12} \contentsline {paragraph}{Text}{35}{section*.11} \contentsline {paragraph}{Arrow, Arrow with Text}{35}{section*.12} \contentsline {paragraph}{Angle Measurement}{35}{section*.13} \contentsline {subsubsection}{\numberline {5.2.13}Voxels}{36}{subsubsection.5.2.13} \contentsline {subsubsection}{\numberline {5.2.14}Ion Colour}{37}{subsubsection.5.2.14} \contentsline {subsubsection}{\numberline {5.2.15}Ion Transform}{37}{subsubsection.5.2.15} \contentsline {section}{\numberline {6}Attributions}{38}{section.6} \contentsline {section}{\numberline {7}Licence}{38}{section.7} \contentsline {section}{\numberline {8}Appendices}{38}{section.8} \contentsline {subsection}{\numberline {8.1}Paths}{38}{subsection.8.1} \contentsline {subsection}{\numberline {8.2}File formats}{39}{subsection.8.2} \contentsline {subsubsection}{\numberline {8.2.1}State file}{39}{subsubsection.8.2.1} \contentsline {subsubsection}{\numberline {8.2.2}Range files}{40}{subsubsection.8.2.2} \contentsline {subsubsection}{\numberline {8.2.3}POS files}{41}{subsubsection.8.2.3} \contentsline {subsubsection}{\numberline {8.2.4}Text files}{41}{subsubsection.8.2.4} \contentsline {subsection}{\numberline {8.3}External Program Examples}{41}{subsection.8.3} \contentsline {subsubsection}{\numberline {8.3.1}Scilab}{42}{subsubsection.8.3.1} \contentsline {subsubsection}{\numberline {8.3.2}Python}{46}{subsubsection.8.3.2} \contentsline {subsubsection}{\numberline {8.3.3}Bash}{48}{subsubsection.8.3.3} \contentsline {subsubsection}{\numberline {8.3.4}C/C++}{49}{subsubsection.8.3.4} \contentsline {subsection}{\numberline {8.4}Modifying the program}{54}{subsection.8.4} \contentsline {subsubsection}{\numberline {8.4.1}Development tools}{54}{subsubsection.8.4.1} \contentsline {subsubsection}{\numberline {8.4.2}Getting yourself set up}{54}{subsubsection.8.4.2} \contentsline {subsubsection}{\numberline {8.4.3}Changing stuff}{55}{subsubsection.8.4.3} 3Depict-0.0.19/docs/manual-latex/python-example.py0000644000175000017500000000224512640746376021346 0ustar pcuserpcuser#!/usr/bin/python import sys import os #Append the contents of one file to another def appendFile(sourceFile,targetFile): try : fileSrc = open(sourceFile,"rb") fileTarget = open(targetFile,"ab") #Extremely inefficient!! byte = fileSrc.read(1) while byte != "" : fileTarget.write(byte) byte=fileSrc.read(1) except IOError: return 1 return 0 def main(): argv = sys.argv #Name of file that we will dump our results to OUTPUT_POSFILE="output.pos" #Remove any old files from previous runs if os.path.isfile(OUTPUT_POSFILE) : os.remove(OUTPUT_POSFILE) # do nothing if we have no arguments if(len(argv) < 2) : return 0; #Loop over all our inputs, then for .pos files, # create one big file with all data merged for i in argv[1:] : print "given file :" + i fileExt = i[-3:]; if fileExt == "pos" : if appendFile(i,OUTPUT_POSFILE): return 1; #Output to file failed, for some reason else : print "appended file to " + OUTPUT_POSFILE else : #Filename did not end in .pos, lets ignore it. print "File :" + i + " does not appear to be a pos file"; return 0 if __name__ == "__main__": sys.exit(main()) 3Depict-0.0.19/docs/manual-latex/manual.bbl0000644000175000017500000000330612723172474017751 0ustar pcuserpcuser\begin{thebibliography}{1} \bibitem{Moody2008} Michael~P. Moody, Leigh Stephenson, Anna~V. Ceguerra, and S.~P. Ringer. \newblock Quantitative binomial distribution analyses of nanoscale like-solute atom clustering and segregation in atom probe tomography data. \newblock {\em Microscopy Research and Technique}, 71(7):542--550, 2008. \bibitem{Gault2012} B.~Gault, M.~Moody, J.~Cairney, and Ringer~S. P. \newblock {\em Atom Probe Microscopy}. \newblock Springer Series in Materials science. Springer, 2012. \bibitem{Geiser2007} B.P. Geiser, T.F. Kelly, D.J. Larson, J.~Schneir, and J.P. Roberts. \newblock Spatial distribution maps for atom probe tomography. \newblock {\em Microscopy and Microanalysis}, 13(6):437--447, 2007. \bibitem{Boll2007} T.~Boll, T.~Al-Kassab, Y.~Yuan, and Z.G. Liu. \newblock Investigation of the site occupation of atoms in pure and doped tial/ti3al intermetallic. \newblock {\em Ultramicroscopy}, 2007. \bibitem{Stephenson07} Leigh~T. Stephenson, Michael~P. Moody, Peter~V. Liddicoat, and Simon~P. Ringer. \newblock {New Techniques for the Analysis of Fine-Scaled Clustering Phenomena within Atom Probe Tomography (APT) Data}. \newblock {\em Microscopy and Microanalysis}, 13(06):448--463, 2007. \bibitem{Hyde10} J.M. Hyde, E.A. Marquis, K.B. Wilford, and T.J. Williams. \newblock A sensitivity analysis of the maximum separation method for the characterisation of solute clusters. \newblock {\em Ultramicroscopy}, 111(6):440--447, 2011. \bibitem{Vaumousse03} D.~Vaumousse, A.~Cerezo, and P.J. Warren. \newblock A procedure for quantification of precipitates microstructures from three-dimensional atom probe data. \newblock {\em Ultramicroscopy}, 95:215--221, 2003. \end{thebibliography} 3Depict-0.0.19/docs/manual-latex/figures/0000755000175000017500000000000012640746376017463 5ustar pcuserpcuser3Depict-0.0.19/docs/manual-latex/figures/externalProgScilab.png0000644000175000017500000061107112640746376023767 0ustar pcuserpcuserPNG  IHDRL[2sRGBbKGDC pHYs  tIME2%c IDATxwxTf{%^H&ADEz-(U ڱw:ҥHUz!eI6}ydMMy${̙{vfgF1e"!B!B!DuJ4nAC)[X[QsmOI,!}d%*sXUQrs H#&Od KRK!B!BTO~HnaΟ[PPU ^踵[W4hB!}ũSbj@ՆWFF:w9>x ْZB!B!nҳXv$/`Zޝ{=8vX5(PmpkL~y 믄BҘ21UzNNG`Ppo1_.YRU^Gs,)eB!B!0eŁ fS KJGl^ϭUØ=󤧧IABVzZYY&֯[[ӷV>L 7 7 D@UU)iB!B!n琒ɡk0t-Vy1zϴ`ZOd 3QQiР uUB!HOǔΆ w߃)/SF:~!{ (8V?DWn9)WJB!B!3sٳw4,UuX}"9s ૯#B7==HF ['½R,\4~ '--eFCLt473|MXD8C\_l'ǟG--dffh1cf3bMDWZ/_'yчo2ҵ[W=_,!4,嵤|tAyo gd) ;ޜ9jDr}@dMg0>x?jS`t9>.2{u?ncVS2I5Yji{kZm2.BQ]s 9Z-ǓF_Xז窚Űd/$*Hfr_R~g#6o&R4 U4c&ƞbp>!Upm/ #(0Zl9fG@*Wfeeqazꉢ؇h4g0Xj5wJ_˾}wOٌ9\eϟC`WYQFVaS1 Wzk.)߫#]jrq9΁ɓƣb9ҚE8`pϻ8K28c]>eM)ziIƛKKF(TpWG{[С{c!|FRQU!/B>>txq^y?UU0iA&Qxi5䛭u$%'7O^[d.Cl\= Խ1\'&';BڿXm6Vo?Adh$w _ܧn`%K1[Ѭys:ww>mhP> 7ĦJ,ί]ˮ6.fjի͛7+:c2c.$&bY !>]vaM>J?=v-r|Rf3S٬xyyѸQ#zꉗSƹsN:E}2er {?Im|Gt::tb0ʀ u6 TVZx7KvxNW|_ru"*Y#azن܈pT\9B4gϢUhF5ylܘ^x~;=VbJ>Bqȡyy%ԙba :i:+X:<F2yޜM9HJ60δkU,{uD@ǗҸ@6߮>֕LB!j:j @*!ġvЯWWFBg/_nRyBCC ӕ/q;9 v6`<#JpRWU t%?~e` ';ѣoBbbTΜ9 J.IJJbe%''cRˆ1 dҋXr͚5-:xN>]층kѪUK6mDXXUI8z&N;z#B-Xzjv-11 :Bb"?ؿEEGӤqc֯[ꈇhAޤXwvHVV6w}g9]".[n/N"##aGJVZzT^h4.5's ]ו7|ړ\sMGSG8GaeY)0,f۸ sn3g[nD+9"i驝;vNLL˱z.̡ÇyyCIKKO>cݣO? $8={ТEsE omx{RNCnpcRXlNBΝ'88GNn.'99Ʉ@QyuETRgGQ.+_1Ws>g@csD_lqdش9hа> 4 33 pWEy;kȨHUU%,4T~7}me|)͆Fu4h rk1?6n̙DGGӨa4p!:thOnngΜe@%S-yUU#((oooTU%889)LcF`P M6)5\u0=j.;Q4^oזy/aZQUoαb8Yv:#"Y]%*^Ew>9g7 ?8q6PzPCχ|Ǽ6 v@QrHŊB!~K}=oPAT?̼ͥrVE#8B!DUCiPav o_]^2' |M{Z=TUǬ͛9u>}?A7 eV h4Ue fǸگ 46MlMV^Ǹ2ăl .( OӬcqqqt֕-[hٲe' gdx\i4EqpǿϿpYV\ŐJz?2PH-[4enË =#>Ơ |}]--[^#ڕLVs =3x u'Ov95 {s?gֹ3[hJ{۔^-#/BB09^KҜϾGؗM%#+q3^v/lf}lVǯ]K|,|R ??}<6kjԙsԋCF?B!jg@R8vUf< o{5uh#Rᶲϓj7Yؔ~ ݻs!;XyV9Wv饪cl&00{(k󪪢r'SI 4T˘F;}dddyNw^S Dxրԥsgt:q>!'Nr)2xfҺUK[;w̲eIˋqqקX.-;qyUK,TCU܀hx c< )Szu>^ݱga믗S4%9-ϗA8GuY0l*O6dQr\>|:Gs~Nu9|6{?n瑑hFQi6/(:>|rw jKq|o$sBZF2GIsybņSP*W"W o}Ƿ-vmKlDj߶JRH!!!JRRhVɏVVؾ}ǎ~z ПWhaЀJ׮]ٲe+[Aa/ؘ֕;"/7ػw999N-+ϡGgsb+c 5HJN?V5{ZFKu -FJJJeUU0?+W"11~/>>pҧ0 _0j~u!?N֭h4t~-C^׻ۼ)xQx9ǟ~xEdd$!"2tRZǕǗwHB!7UsBQJ#uV:gy$tΥH:\CהP eG(Z-6n"$$ R;C 8͛Wn׮-7m&/RӠQԍCtttҩUjRއT[6$&&ZM_J]0r !8GdB!FY6] (zoTJ/ƴLaooԊ ; d{ IDATvIzQ 4_111n_ @кm;+cEUJ/)),]j1c6kEx`C(|Q{#s %M!B!Czt^ZV/J;`(+Y9y*B!B!B!p!=B!B!eKꪄBKCz !B!B!Bj@)qq^աniKJJt|ZiK~~~fw/Ziڕg}EB!B!NRWU+d21hߞuZ5^.u8s\z,]x#JS!/$Pڱ\S]KpKu}rJťNl,}=ŶOrcbK\ΘcWCzzF):6ZlE>p ZoE]}\e5kltM)-]]۝gpcbٱc'N۵ݫ=<ͳX4mƈ7"wB!B!. RWueU5hЀ9s YŁ<ʳnķ}璮|!@zz ѣgOv_~ZS^}.]VeamS^}Fv;FѣmΖ.]Fz[ej 7 l6{ҷhv~˧}Fmhպ K,euķP,/* 1|'\өq%W5~}zWq)k@RURXpKKok3gz^yR4NӦO_ݳ]v p4is~yL8EQONtws|0zJ˻W^7rc3W^}գmy𡇘6m*N`OOVyD 2tv?޽$F\ҷo_֭[?6paF֬]K}%*gOMFd5<+B!B#uURf>C"2t(?Gy8lz[ott: VZɠAt >uk]1|}}akzjn1NfUms֣Gw~}%6ndysse]eS`Ȑ!9sλtOW[9$~ҷ9 ZFyߠ K~R*5:C^pp0O"9Ο5nDDIɎ& v[rn1@ӦMOhۦ mۖsѮ][.<+L[Ddd]B!B!I]UҥZiKNN˺vڑi(}]pm}~~%/!!!dffMHHGۜ?qaN};ﺻZl2t:/i[(J޿5~ԻKF ϑGX,|7 ~S;d|+, s-u?V[eڊ0a|a&FSt۷s̥W^՛?wٜsa!rw !B!&uUOꬫ)3Ai&, K.W.IׯfWms֧o?.\V%,41l2{|<̟QJ_΋e˖[o&үzWqv/>8[M2o޼*n['ϝ`ʔ)<#\۽/<\0`tǫ$q _#FxK>}xYUUի'x}TkjOhWmҫW/}mJ)B!BJSW5e&Lx'33pFGq{cc40a| K/}=4nҘ}!k_z~^|=3mysdyQ ϯrb 2ģߟC=?=7|*uy-˺+U\ >;}R )IrW$B!B)^gIO H]vzWq>-x$O lYj0KMrӕO!B!BH]Օ+9UymH=ݹg^ťsƩ)]'B!BQդӕϪz漸RO[\*IQSoB!B!B!<'R*w$!B!B!jU !@B!B!B!.@:yI!B!BQ#Zn[vB!.gWY;$%qaҌrB!*bSv:k:cT_Ej 綿`FiEtbq  B!W-CJr{+$BԀTCkvL3ٿo/;w!n+BIz`,f}UUEAyLu:\TM-8ֱ @BAA(ƒA8zKиE<&#,]9B2R!B'YB!%PjҡԵu'/7ܜlI-!|2M4+8 VM2Q!B!B\4B!B!B!™;L&Mŋ11v| Z-IIIDEEU:RR<%/XB!B!d;!O>I\\ܼgN夥k3xCJry[IkB!B!","K,Ey܀b}j c㏳`>CURQ!B!B! H 6j:EEEq!pCܹ['m7:-Y:DҧO_ܲ%~f[[%K8֧1ۨS'[GFzzcQдYs,R Sw%]cY ӣg/Y!B!B5fdUy_3h.njOԹ#W{'~%;;s'`9|6 8}yegH;{N򵬥@7wou{SAڶi؇|+:'s1x ~'^|%Ǝ}?kbɒ?۷9ݿo?{vb͚5w\H8ԩxWi޼|-3fo̲o6ݷ/D]*ˊ@HH˖.蚅B!B!̀mVv^k!FfըFtUPĿJ]4nъ+ )Ԝ<1s<4HV]^*}{HJlHڵK1Jy0M7G^Vd /? Ɩ1-( ) H۷gرM6'i&}n=cܼmfO8^ٓ+VШaC M7 w9veذafe˗b Cy?q4ج\_xooo&Mȧ}V5k0DY6z=^:ʒWyvh4tڅ]0qܹqWjR|ٻg˶>ϸ{;-}%`0s%ѹ ,+>ȓkBqt|g ?11IH!B!.'N@iEQ\r?*:_T[PaEGAQ*qdž[t|txi6dYHϳOi԰:v_s.eG7U?s>s5 4*4E/fxe8{,III]EQ PNGl=x9(l< Eu& #" XV0 ,+Lub`h4%C=qR-س{uLR3f,͘1cxn\@,Z<ƌw`ۇNW $%%`,+>EUB SFZHŋqM7"uܙsgJ" !BQ*q׆Js(V4J&M(ٕJUAQ5$'ejȶX1XH'%Ld;ʳ/2︳6Z[ T? 9tmS߀O *Ш^kȫ?8Z//"6%ؘw+s[^r#**~Q_矛h4}6[56T&΍G ? VNoKkF)Ĥ j*nDL*-B10>) 3S eBy܀t7}FIݺu0w1[hZR " z>|7g 2mtًg~oFXX(Fѣx 8GвE ;|˗-C/4i"oN$Xk,+>EUBԼÇc%B!u*0̐s(MZlJ 6"GlnC8Yh5 sL6-|(&LEqX4w끿yyy=o T 浙*X y VK>VX8ί>x`zKeow |wshA7%{Yhhdll*ٙdNULΞ;KpPaaoTys#4mܬj*Q."9w,V>0 dQyy*yyy<^zEy1Λd"<<ѣoeڴ} D|xΟ?hLe]o1'yj|<ԩyf5kG~/pЩs^~jIXV|5 !42;8)OXX wy'~~my'طoL>[U!BpHfԃjP6 `#\B/9KvR1Qirt!Z>L^^YY|՗t֝ 5S̙3<‹Yڌеe_Om'-.7g狷\<$īSh"RSԭ[ˤI/!;E_~`h4.<:9PA}4;,G< 7 oɓ'KB!5DQ49P@qFAUL8VZc ZJ+UU%?? *z=۶ofnҭ[7tp0Le1L6gG~bfӦL6^AXXX- DYYY@Ph <4H.\H i.?ڳmVHOO7˴yODDEAh( (B!DfhmtåHWpV8*(dfM-l<vb H**:\`o"0(~QUm;;nm۶@fA П>~gLyB`08}22 (# z|5|{6BCCINI!::c/_98fً{+^*t-_5trGuAQ;6 }՗ 2V-[UIjjA$5(X-fr]EQ4CzZ*!UϊZC]H@Hh0**yyYUc)))4mԬq #9%X,BBB0L}HK\:՞W{hL!(f:wo:^sM&'0} nv|B!BԌn]%66@Qh(NXW0[{)PlXVQ4]ְnZ֭_V%))3gMZQeei޼yZK.Ƃ_Q^}0>WH4nVcbu-GѶ]ǽdr)7^撓CVVc͚l2:pUI!,, cP7瑝eB% @|֣hh4X,f>>yUKsI֯]KIؖώm[XwΝ9r\ᶕ˗cN*++;VKٌ(}֣yjÐbifЌ~~~zFS8?jRSꁤ*|3|GBIht-Z2^[nu};x饗Թs|ח;ﺋW^y!BQSS .+U}:ǰuA;Tz=7 Wo=؇ leuIKܶg[n#|׼:u*s{W^}iSҼysMq c-YqGƔLy_En^./`ohƌxUy#ǎ0jhFǣoi$=GJ͊f#($3ck€~J kq|`7 uAa=/̏?/ȿ/ ȚkQ#֮[Ǡ=ʗxnw X:uh֬ eV,\֭ZAa#Rjj2a!X -Ǧ}jN꽭V+&hd0>f#Eػoc:Hllzυ9vVmVYoMAoLł:l^DdFexT(2"@YYYdd}[{hrrr81oJRRBK^bb[.VkW6jػjjj~DEq9:twzMⲿV%%%>$pAy&‹/JAB! RUAq,:z9o+ךJY)>j*} 뽽ӧ6\ve`ZU&[Vrss]IOțof֬7ۖ.]3gp ~>qܤfȐ!J䧞fϿs9=LTAb|}v(6/ ﯧe>&/B9k }7Qq%i4m進[ ,Q lEAPQe*{,HH6$nW^{swi<1P_Ӫ%HJzdP\.]3g` 8s,V~% 9sZ|0~(Jt7oapQ 2J~)sI呃 }^>zTϯpw4UӝZZB5gxմD*qnj CàVZ gWHRa͠T({-הJ%RSѴY (r8::hڼ%rrK}0ENN.j¡pB!B)?EX1-._aV0-zmTt,2U& Z!effVZzzhR~+UK,Nv?M&E5M'==bf<12ҞU ֎ePHqXEVкU+L~=\|o IR|q#n} oЮޡ&L\/a5V򐙑'NMѰaCp=VU*UΧ߄-ZPei>Y, #S 777 ST2iA .̀C2J..HAC`/Ly|IWC<~4MڵVGrr  ++ bϞ=C^3 g38a6mΝzXmN{FB!B С} G S8xQ$ͲIvVɼ9SϞԻQq>xi|>Μ@p@,t>5䲽z;wѪMEQzR)|7oްy( v񙒒!P(󐙙 Z $5Ɏ:;nJDNuEңGhhyA5899i煅5֎p ?̘1#haaa5{66 /{$Ө]\]]hƚ8N{yx$5 )O~ʬ,C8O>O5/B42_$#';NjR_׮Kn]]<ΜFj ,M!Bygli׶=|||VWa SO'A*S8gh[L&/ݦq㙳޽7b…z~r%f͜wBϞ=iݺuC||w.p?^ ܇HԔxz{1<98mPPJj׬ +{K35%O? `*vWW8;98dfL['^;]i8UB*%QȯXV]=0ӡP(h7B!Bhn.z>Q`Xñ ppp(M=>D.+~@PP}VAFfXhz\sP(FnnX^Q ?,B xǁn%8SR`,g)lgyP`Y֪{b1J\<S/5kAn3ש_}EiqMȤ2xh֢ņ()'# 9 Szuͯ(ql$?~˃  & Z@X$?~'''j c!BTZ+P|>_!B!`X<€RI*<<<5 jN hZ0(((#gkVnO>}L*JW( 21psiL}Pz \\]<*>{ tRRwqfps=+pp@->_B,ԋ އ3XAVv\-V^t I !S|8;; R)R<#^T*d4cISS)d BHUL[ B!BH]ϔ-#1wa1`8F;~ii|:;nݾ  P(wEݿ="q))puqNsA~ L Ns,qtQTLO1cYxK OiT89pq ZuwR~nx,NH$ƒ p@J,ԪSiRf}Wf!*\oŵ@"B!^ϔ&`c ڱz7K[)ąV QkW]UkCRex(((ǃ rU\jРnܼ t|31hAR)0]d2)֭_Sj5״ ΔUx`yyyh֬)Jx<^PN|"41Ξ;[|f` x< z, F;0|(UjH$>u0`^88fZJ,˂aEpOooHSRA^n.Dpyh 8h ̀,@.˦1*@Zv-zggv7n&?&槥aHLl2B!R63?֤q>[T5oڢ1$XCP@RAme,ÀAGZ*NYKPvmTqֈE*XN@S4SxN SX?EyZmY9׆ h+mz([?G}M_hf͚wwXx1cǎ8qɓprr™3gGEΝ7zh̟? x0et.s̱O[nŋXv6dJbb"?n >>Νŋl2\~O6TBHY6.yII&jGmu(U8$=MaPd(U!B!BΰCشiΞ=>| .GTT ,Z:u®]0d:u #FS0qD;v Æ 3ZVqԬY]tAtt:~}1uT;v,гgOL2»ヒ={ SuH!(UJr˄4 ŭ7pky~hն=*M Lwq58@~<yjpuӋ8#yk$oj^tB!R;U!B"Yfa̘1ػw|T5kjy<M>@~~>]mڴAVV.]u-端»ヒÇC `׮] 3T*[n͛6S4x5D"Dď_d>BJa4 m HI~ =.uHTX [pHsLaNc'(Y;fр l=@.WhA !B!POB Q&u"""[n՛/$%%!)) > ԫW}5jHP^pvv6ZD"]sb&iذaySRsTB .MK/@AFhնrZ=k(髲HI'!B!Bpزx„ .]ݻP*ؾ};bbbi;v_p@DD6l`r#ܹ3X LMxJ;wwhӦ ;s\B)l #; ǁSUi,ԕx !B!Bˋ_V`̘14ivٳ1n8;wիi:ug}M7>Xd :ud?SNرc,֮]Mڵ+Zl/_#=='N:{1W-a@@JU!V4124KӄB!޽T BH9i7M$Bpk8B!R! Cq:> ^6!B K8q<\\\н{$Ǝ_~ .ΈRJ&B!<g ={My͛7!! R+&Ra !TU~x1ԩ'qqzN܉;w  \\\b !B# 8.R03 CU$ !TL!jۦ 8zLoٳif㑗^{ ^e*!B!pQոs޽}KglzI)ttԾA!Mfru/t<| ࡃtٷ۪!T,BH5x07QFut ,Ŕɓܻٳff` X%U!B!ua+88HcMzI晗}{bIز Qyy6Wйsn޸\ѽoBNp^c&Ra[[oZ  m))))F/4-Un}i,ʇB˩FXt -_gΆݵ,\0ӧ ;r$U!B!j30sAHHvRveŝn]]\1p@L^Z}yZn+a4 ō#CUO}%BHbײ4-Uvz=qqqVQ -襛f2)xD!UC˖-c\xzQ#۾=8s${wokݍ[~¿zSB!RJኽ Ҿ _583Riz {L&զ]':C,FuÖ֋F@شyS2 Ϸܽ{@wmڶř3gL~sfff`xyI&|6B鿺wDpP0]aR"wW,zGo߾HINÆÏ>֦;j4M'ٳ1} mY{pU< 6o߾VưXt)dR)OѣG,x, 8O?ٟ`1&њWϨhԩU]-Y&};BBѽkYB*RP(ӗ/_FB}ϻԲ%a;cefdd`@쀁[~͚h!`=76l؀&M_ՕL&Ck}P?(}c=B!B!b;> 0B.t[5h@;etmg] CaX|DhӮ\>Q!##CoAޟVL.pswG0.>lUFDD`8~GL~s8p={DA _>k%e͋a0Xò4Uo}ԅ!T,vZ?a"&O}fxnp5EX9sa"^…ƻ{sg Z]-\quE!B!bGn4A*jyd&H2 ..2LO?C EfKKKDp|U/,{QVm\rg1ljj*BͰ|<ЪMK\r ]8!.!bg꫽! 1p§/J, >zzѽ ;mT8;;:t0 PiӦE!B!bG|s# A+$$!!!zkbd,7bX/6yx}ع'|||49Դ44K[*W元q#|30d>@~A:u#{Zm3¿?jլDq ;qª!T,vZNJtxжm;-k/R| Fpp$''륻\T=UB!B!BL1[nϐ+ݻGjn}Ef:q&(J, 4K[*e/L&3e{'OATb޽hּEHgΞAapOԨQ=zBh7oBqVE-!b)r\\vzРàAmVڲxxcm+䧥S;Rjj*QB!B!vķ ;t[#0..X;w۶nŧi֮Y#FIWzs>^DX0lRLK[(VaѢO!xa7yFm^>]`>֬^ jX`!֯]ᣨS.zEѽ'Bhت!T%]1..FkcKQV-̟@oy4TexݺE"4Ǝ?b֭8x`ճ'nۆwF_E!B!bG|0O-CtRvf63n>}зOciˮ]ڴcib֭ZҟM+e=Şzh.K dn#F"kz7ׄB*`[xyk |a=Z t&7YFd$$K2͛wgϢ~zX7.?›oի`y"bZ G!B1Gӭ0&M`޼y6ղe |HEׄB* H4ݳZ ^{-F;=fh[~zY[M}_L/٪2LY|{d2D":!XE&͝nB!b[3xuҹtds~ŏ*&Ra JnXv-;`ժжm[B!.X9d-4nڌ*BH}C B!d2RSSÇxa.`* HEc:N¾&RqP.])S"-5۴꯿J! m *v!*iӦXltb4>>>hԨJ-[`Μ9xU !U- O 1À)*irׯ]EaB1c`ժUxV0|p 8ÇΝ;" @"Ua_B8J@C½q HIIJEOQRk3APTᄔ#OYTB3gb%^ ?#l2PB^r|G !咬ˑN8Q=P!#&7LV(H|pN>>>T鄔eVSBHү_?̛7`R͛sN\~Rb߿?F `ҥqAogEƥlB!"(T UՕ~R ԫÅs@ B!2#Hw\?&$$ &&d$''?+w^k-[T`B!BD$NӧOS nnTTrq`o`Yӝ PPP`u ]pԺB!h̞="HoǏѡC<}wADD._5jhK$L4 3gΤ &%VPOPEm/U!e.~`xx $JE)GǕY|>8fr73gNY̏mp Y4 !B1rHG<*#GtY7vX|x à[nOЬY3j={K,ѣG6w ꊷz 111hԨ$ ?֭[gl0j֬#G{ 222pUl߾[lubxWDggg( deeѣGz*vލ8ꦗ؝ *BQ~^ܿo@f!!8ϟŜB(]&##wA0,˪9_=2mJIIȸ5$^zNNNh߾Zʪ<07٥%^ސQ+By9prrқwm۷Ϧ|:ׯ#,,L;O,s,ߦM鍧4nܸDO>Xf |}}]t3oe^,b̙>'iխ[7t ӦMCLL _y ,^&M3H 75k~W\믿x: !6 !!?75nn(DJ22;v` A\\LvWqF 2Ħ7o'NI&HNN_wQ%B!bכp/^@JJx<$^^hղ5jש !3#`Y R pW]ؕVff&D̚5 ۷Ǿ?[Ǐq \'Zj'OϪuR>+FaV-P(M'!B|?,Q^/^4׶m[ 1T*e#<<V<*"s2kkGEoc͚5F5xTZj2e ON?c^6xJhGByanNo:)) N@Y6x<8Zs_ e=f5d#99N8h,U5!V_p!f͚ZjA("88Oe%!!D"Lb@߾}?c \L6 uԁ燾}ݗ;vB!ۋ&aMP~XJRBB.G~~r 7jת}{K$B*CСC^Z?vp9l۶ :umKRam:TT!c֭VuWn7t0dd8WGTvy1w\<|bbp"e{xx8-ZI0uTL0Qo[7u nX5m MDf-ѴyK L{F*5Ƴ"Btyxx(\tH$7nMPڵIj} \;wСC˵?~_ENN|r,_`Ycx뭷yf$&&bȐ!Xl߿Pӧؽ{іJkצB!(JhVGhبJe(DH%Qԍ]7|Ft/oH탦͚X3mT|>={āM "z:tCpIDFvåݶL0NNNB\r ]kW.ܱ#.vAK!ptt4We4ONswwz~ WFAAT*U~wx֭&ڱcv]ntRm۶wۃi&曨U~㏚y-BM(^0iX lt ^]|}v ˲֞=@l,꫶_@@lc7u1 /@۶_&PkE M: TK s4r`8Mp`x@֚+MX*(Ǐڷ߹c|sǧi[[߻w5%M=zfe[s|X_K_iΟKgEqu2)CB&M{6D!ℇܾ}"##ؾ}Bux(֬Yc\A~^ c~-oѴz {J·c;#8 [.22aôŮ]fZرc̟oS=/_,\<ys1{'^#YX[ْ%wF 6o&ZYViO:=zKN8v6m6Q=w:ucPB!&\x`nѦMyϟz}S[x<#7AE.z|M\r 2 ;;Oʕ+1l0ԩSrR٣׎DMzS4YJ7믁%K5y|f^7))@n: IDATp&ԣ|~Okܴ {oF``r`fয়4v-nV233Ioegkm0WiSMӧ5s߾֏5~ Tٳ;w,oi_KҜ?eJ[QW?-[AVf'ؔ3ahnk %m/ YO(egea<I "V._QcA[|~~>/_ɓ߳wc섉2хHNv6߸ @T͋]ptasB%9L.7k׮\2hmҴ9v,˂84n 0HOOǸq5|رa`5kdS=]_wc>Cq"BH|!j׮ Zmu>,"!!` >}`Ϟ=FnZޱpttDAV %''G/zHJJ2g5Ad*dil]Ζ[jg=? nܸXJ*%/?iZ* X7)k`ԽG]zMI'bYfx̛3GTpT_T9^sS4AmMo[A 0f wp_TnYwh[n<'% u˶7NN@WTPmвeʷL;wκ+mX*h݃) Cjn +`~tx ,c֜_>-LJ5k:ƶOy?[ߖ㳼mbNj%1T*j5$=?TJj P( 2U`z]>DHUVkI3uRm/u%'+VǏH7uMxuh@JHt8 뫲,OWQWYn_y_Qiʷt|>} ԯ_vQ#`Z`M _/kO{غm}|'_?Ujwx<B!6D ;B*k+FL^YY((ȧG*8pJ%?7j57n oe{Sj}x=`Hם4 8rt]Qfl|M۶qTf:JQ8zY3~J+4㬔^4_Z-CY5]iŘ{9K{X%=ʪ !ǁSEHUtExzzbwڕKfZV͚5áCp76?@\ OL!©VΜ9m۶!::Vyf\pF.“'O:u W\ѿfYݻ3f@@@B!BCCfֽV iӦM7nQ~}L>7oDH2.+!/җ+W.]—+W̙3Vƭ}n|m`q&0lfC=mmh\ᆱmj'k2ptԤ.R3HjP`M޾={4-ƶs @tܻ|IYo|KgD0b曚:"¾ܡ+v''6F):YזvKzkUY0ƎV~2i^ª+0y(!R&V._ZV|c'LDVf&U:vп›ANc't4`r/6a.;(]"ڹB^*̙3KϜ9s0w\kmϘڵkSN;AI.MlngfŋcGx] yyIRh^7)kuQuSE0`&꫚5qzf+|ں;}ޤLW[0Q{?olңon 9B!5kzjOXP(0j(lܸ~saX~Ut WQ/^ B͚5ZxZn7nݺ$B!> @(ovZ_Aʼ?j85UaoV* *pZ>f-qv<.B,SsPJ$!B!ذa°sN(?tZB@PV*HJgQDEAEUT( DD-$63?Ν$LI%|<摙[=ܛg>O6mN{<:RSS .99={< 9N4.r6mT䶋/]v;֭nv9mf΄4%ڶ5׸U_2r8v2's8͑lNdzb<ϟ_|M7UW]E-"%%͛7d^uOH%.!о}{zڵkGtt4n;wW_o駟СCy'uTDC~R2% ЩkV| QQ<\e/?O ;͡XtOIff[DDDD*ۙ6mӦM+K:Nq믿xgyg ܦVZ,۷o_Pܾg,f͚Ŭf޺uk@mk#D`=!!,_hxfx\v8DEEѹkWΌ% Hl6{aݺu]6QX@_9@Jĉ%+agr8s96vHrRHDDDDn7v2p'Nd߿ """W^<#j0EDDDR*vi%5kDʉҗ0DDD 0nܸ<˞z)zꩀ߻w/|RDru _V|'/""R\%@"5"+aԭ{1H|||u:xdggk E$Wi? HY *hDÇ4"voJ 4 """U))t҅ٳg~;wdȑZJ(RթBXwٱc Gzl CwAǎzu dz36o쳰~=qLW^io7 k@V6""5]@DD[Tھl6"jrBTq{gϞ\z 4ӲeKtrO?Yx1999/]Qϙ̞ ^ |o / Htn(`HY:[͆sϭ~ldeetULDD4"5LL 3  gm2F G;ްjՂ[n t]ED"""Ih=<HS3/2z} ͛tykn`ݺ麊 $)IYp޼fpOv˥bb`24%5.|)eW&O_+uCbHI޻͛~!55UR vzuѪuk5-&""""""UWL3hz8= (c5m +WBϞeCp饺""H"Xn-=z Y8 LٕV ..ODDDDDJ3τk1xHxhh/v;wNW\I""RU9bccsM4UVz뭤bccgqRe8lܰĞs<*`>=/g_РTq#F=d}E;<6%|Z`zMA#aX,s_MLDDH_~%6-Ǘ_~Yc$''޽{駟ݻ7'N,+99^{+ Rϲ1Hn7)7XB8ҎOl8x,.ҸHw_|A /pݧ<|w޽Tǫ]6W^y%y^߾}6mcƌ hȊH. XAAA8.܁~LDDDDDD͜ >jA۶&j|TP ݻ3dȐS2K _Gff&AARRR6l͚5cذa[|9sW?X}%'''۷/͚5#!!{0|HE<6o,OxE[W"""8 Ry?òrM<m6 ɓs׍3ɓ'c^wƍc֭dҤI)}mEDDDDDDDDDDDNLGNtt4zYr%O<ՋG}4w]NXb$&&ҿR7ꫯfeHe)&RC6_[6:vWDDDDDDDD>'ԣG2fJڵS_n㦛n"88 p/歷_eӦMeHOPDD]veƌ4nܸ-Zu]GʬOe)zYl6. 6kp8Y1%;;[#""""~:ڽ{w?^feHOO'222w]tt4 ,`֭9y$Ceم[mEGrr2^zi$:͛Ǽy4""""Rfĉ8qr9fnc #''l"++L] snА3όeאsgʂMᒭ̦OhҤmv82)q׷4U~O?:pZ*Xݻwgdggb z葻G,]ATT)))|r.^{e; Cyw8BaۊTf2v}ov}|ퟝ͠A *>C*4nN_܁[oCZڑui6&禛o)CO>iYgC5X**$$"""W(-s3?s=?O3fL`?1c0m4훻~ԩ7Ν;sYgٷgϞ\tEm+RSrr_ҿj׮M~r?>/[Axx8۷oӇӸqc"""Xh.J /Ыݷ\uoo4w}CCC{uOO ;:UWPݟ۶ mO?+Ca+9@_:u ##cǠnE_i~?|4h|@RRs̡~ڷoϗ_~ɞ={صkW`c>m?`+~n<9s&IIIm+RӸnԩS0`@'3ϐ5\#<獴ꨨ(B:u*Ǐgĉ=:O_~gvܹsuqj>}zDXu_}5!((=/ѱcG>|%߮^Mj՗X*(;;;OsBCC !88&'' ۍrU~Th?Ӫu뀷ߵ|H\PoLY୷`  /4xq}G V aJ%3s&*L g{,ҿ9sWxa.3g¤IҌߦM/#?gܹeyNGQÔ)t{} QpUG+_ah1|wjâWSJϮ!⽉&++L`2 e˖يЮ |ߢ7e \vX֫> ͟_6أ0QX*t7ٳݻw>J[a"##-"R͛bUWeʔxcG&S#44zO),eLCgw0{W5jdj/iJK/5~+Hp`]ߢO޽+?ŹEݟf3 :^>@'iTxxE:~Rz Hݸ]2y].l[;lIC;zcGr_t|#ᙧkNeuRtԉ?\]t]ץKg>Z1999\._sW>,#AADEE|"P$<<\@4YtK,/Ϗ IDATf/[!.:##.WyIڶ5{\.>OX/O*;9E/>~߻7$$uk@3rm͚UuV&.<&L0I^\11&iJ9\I3@1Ǎ]6 QGqQ/YW+odeg3k[ o. .pU[*?c.,Y \tIGozoOO /HsZqػx啗5"""UN:~Z[o.>_¹DDDrIJl6nwrWGD*ĭ݆X'^!SSD&c>ѻn$KĸB!GfCjda>=<B}fwdpsXտѣ=&++vf2Z2 NLS.ye?+ŋ@62uvvw;,̓4rd` ֿ*Mcb3Mכ$Hu~Rz5*E~RSSNi+>>>w6::oeU~_|Q1 k>Hr]6Ǐ'..=GQgqǻoBBskv> KuR ` ;_ +ᦽ\ίRz5, .RHe1OEnr[DDDDNB!%DDDk JOMQvh"_@#"lJU5(""""n7ݻxn4?'YvƌOsAH_{_OƬߞ2c)3kǖ=GI8+IJù6 c{9I]Hhi<<.7$6Rl6BiѢ[pf#(8p r0u@T1YYYedqY"UځgF^ w˖C`l2]˖eߗQHMSH9S~*tC'ؾ9{/%6 rp<#M;X.sooO!#˴۪I]>fYN6lOuӺo2|ӟtl O|yM C5{9~2S؜6Ffs͋}R}9 @&5%[~ *(88Lؽ{wڰRH50s ?]x16df 7zl0l}qχ?ش sN_W\~y\Sg U׵w}qkkU "AFfn +IРc &3ˬ;r"S;<.;3#h mgN,#+T)"rmݲfQn]Zw>ѺX"""UPNNNngT dB11o;r$\r̙Pz+xFt<N%GΜ </t!!nv]niLL9ED@ lY~iĎ}֦ ]6NBdd9 xFa!AgP;"}}~O>[ᏙLv~.wjADDD uP999%ڷJHl·mdx<4|94ib^+74uj?^pFP~SܹpEsYYq4l{AD:Q py4 EL[g֡au.Za"(o4ڝU ΋du$ҡU4AvW$7;YG yڜQEַDDDDDDtp8!...p:U&\z=ݻMin(|Mǎд٠Q#ض[λ;m;e̜N{CTj| iw^wqNMYz79.ql+w1 *KmowsKﳹkے1{|}[ض1 M+sgQ+,OJ>e}Q49"((v3<v8v-|۷ނ=cco@l ňY?;]qmkX8~{ d""U] A|"yywƿͻؼ;-n-V{/6Gҳ_n{d6SuL);9ogìv8gx̢^Tm`@ϕa3RA_S:qH9 6%ֻ{`P3P۶p&{afnρ&r%YwM'ODDHU]̛l\L2DDDDDd pHd!V.44l H5Ӥɶ7/ 1UsL? 'bb?tn{/txF6?(- ߬eα~}]ᇺ/DD@^3$8:AlwYG"""""dY?5,Rj,/"޽䳚;0 jE)X7PL %hN""Օ25[fA"""""iحAixNY H}>q/7RD9VD7hH|4fV4m l}y*lއMM׮%]Fbcc}v6x̗'_IQ{?LN'^wݜ9+p<0swݦM8_#G5sγf[o Mv7@VÇUWAJ  ۷_q,_n~}ĉ5-(YF}HGꫯrϿr))) 6f͚1l0RSSs//:663gr%yry1o޼"yfz!C8S$1ԕ+W2eT XRaAjEDjFc|Gs7s 0t}A~xdԯo>YuMdHxF2( @vfPwՃG_-k6u 4lh `U[ǎ?ްƌZ[LΟƧ?#"W ΁Ժuky6l~ 0m۶1l0&Opۻv/^c̘1˟z)z ظqc̚5?;3z*=LB|a l H5w_qW]yc#}\.?|H^ٱ|8)֨)cGhP:v,zмY*=^ M@dҢ y_{Jyw믛9)@<ǧ#"@@JNN~cʔ)L]r% "88^zg}GDD}%'''wW_Mpppl 44Ν;9~a}kٲ%\r ^{-]vyEDDD7|oQq?V "cHjED1Nll,w/Ǐh+6QQ%[_Xػ[>;GߛkW,KwoHH0YRk@ZZ^[!..32eyLl)_d&V>t:9&jԩðaHJJ]JڵS&(<%%h8" &_6j(֬YèQtqEDDD<򭉒?x$**Rv!RH/"R8q~ o|}au1=jʮ͜icǚe5m +Wڵ 76mA?{+J /y<zٓKsl_N#"H, SPȓ}TP$oRT#緹 isA[~Z^z}2e:u*wp n3ǎ5s4mj2ox,obIc ~i͚eJժeӷozʠW&@wm&T2~&Х t ۷L;k[x9Ot?"rziRSSˠAruޝŋsײb z /_Ny饗>N޽3gw}wryy嗙8q"VO>m۶m,[}v:,]d)S$M+;/PvzuѪuk5#88X."""/[ Ra@ KuR XX~=T :V#"[ ƚ6קo߾L4)w>ʘ1cxGԩӦM]k1fjժC=1|AN:uĉܾK.tԉs=W_}5=<Ä3i$~[ߎr:9x֭G7? ﬏e ;;]Ij*Aⱗ1DDD)l#0>ʿA$ty*T$O5ľrhV~縊H>deg,.ҸHPHEnӠA>ˮ]r_D}_׭[wy'W^Ydb7Xԭ[7u릻]T Hy9[Ov[pp0g #FQK/""Rc<}/xYTQa#ϲYH.Li9WP=||&1Y6`20Z<>(hHMp.t8"""RY/d-ۛҔ+a;oΧqsblWQY>@o>?h*}p&PhRj`MR!Wwu~W)ߏx*o'"""M$ /]}Tu, qF9xNp)tUZ|tڷhm]+y`Q9k&0́~@J]Gu 6UPiH"""""R RuPp+cdPB|[kC x HpL<ɓ'` F=TW A4LVh IDAT#kYz73 p|`s | O1LkL:11Ci>wg7 ZDlk}A Jo[sΝL7 )oѿxdRY(䑬d<< ,]϶)k X}g:jL L1TXob2 Q>G2ܹ3g.{o 9|GDDjDTrr)ts=| TXUQx˶-cGmˁ9}=0L7Ww6Ob4L:Lh%&3 3Gw+kILP(:eןVQ9s xmÔDy)TN*Cyd HEρt2~<˖-[Ɔ h۶QDDDN4bWJYmQ"&0Hj b:{j3  < MKfWZljw.70%"v"6nÛp;PXsQ ۘRzmV~^*S٨|f~yGAjC$)%w$͔)S{)̟?OC(""""eηܛG"&01& k,ۘ`Mk@ZmikO?Yہ (yd͵0ZZ6 P%]0A,\Ey-;0A@L&V?c9HL*ȴO7j|]ESTU rrrՆH"R*Ee -[vjLJ~Ȇ i TTNW$&f.YI"F,3_P&(>_7Rv0A잕zc0ϲ֘RwbMZ7yL`L1DOZdwV0%=~cÉπ]xL xC wΫDIHRJDt.DMӅ)̝;G(""""eb&2'h)=79P x*Wxf{01xzY='Y ܘ =vil*){ B$rugcRI-7 &s\oS_W4R)IDDDv"rWhí FՙSrPTÔ[Cea)xkLd$`J4 u/0x3< yگ a/-u7zdbXw:OLVmx3~n=g͚[wgkN<7&Ӟ'>oʓ (fcIyPMDDDv"rڹIDDDDy>b?Feiݘ'SS_ ~΍ [ˇa^d =k3 `&) ,N I`WL`~ϱ=9}SvGbEck[00Q޲{Rkq=Ky*V|;8 HRIDDDDN3Ogެ;=T(Rm1~מ죕@߁vo@`5fgt`O7c+1Y@IL`( xjc&e5o&40.LXS>Oxe9L0xoঢ়tk?OV?[̣uszI ʓQMt©T@(}[=xFLxpN8o$ ؄)SS6%&kJLpi;n+k$%bLU,LE@/`(&@)a]|y[TLFPLUu־V[=HB1.0%X[ӗ@&f^k`Lp) ZIEPMDDD v"rڹ /Q ?F: =| c>Zby9&1pL6srrm0 x&qcB0Ad1s& B%Jd+d.eX{a59 ,GYe7lL Ls@CL:`I=Z) %I>@ >a+> E9neHn8r=phEDD L1?6W0a. }qaJŹQ 0d{j0fniP'k' SΣ& hO[<Xkl~ؿ B= $X)uIcq[,_i:' pAsEí{YoSf^Iq_EPHDDPIDJf#22zCf׸`#1y0N@6糉ILb,َI~R8Zmnnl[9)]\Ccs0@_V`-vXm^l/0-91S;``p9 SboxLP LuS11LRLk}&L 4udW-wm[/d*Ͳ(RS?DDvm\}%:Ҡ2=.l׎P H 9x2,^Za@X?Wc(>} qY<RR>)I7ou@PGL )&h,&'pmLɺ͘L{vL,kV[nnu>enh)3cژ̬F xSl $) e Ҥi׏gBڵ50""R#)$"%bw؉9۴au=rg1'a+^d$9фiEDDDjzL c=&hwΠ'Om{ ux T\mmo &{3L Ley(&#h4瘠X3ov L-yBֱ|p5=lm3`XXMknXjmf={AV1UZjqwЯ X HlvC .pرll)cAle`sFYW;JL9If 1%~​0Oݘ̙@nGa7#>{B JfVK ^+4:vFbYmR1V_FYpfϝdgZn^[3&PebvZa]آ߾PREs@&y^6oԲc۩WZ&Y35""""5p3:d,̷}f,l`ZwZۺ1 `2Ŕ ]7@/L9dG1`Lyt%a?Qx3wnd5} 䜰[i7SfLٺs@cfΤTLYa2~e7_$dݝzZcuշTL'œ*iLyn@]LE,*K@H%337ߜIv4""Rc)$"%r:9x֭G7? lͮ|j qq4̇UT53cj&q̽3z'g)YG;v› t &KYLfR#L'0Hg 2̼C/`ʻQ3Q4& xMaZXMd+--& 93 kn/ѧ"m/$99urux|$ X H8lܰĞӼYr`>G0} 5"<_DDDyxHI<=IK@kq;x,̜F1YFn]bNoX_ |Գ`}1APLfOsJ@J*p&(U\6& ݳq1?>0YIcN@j/Ayzc=}zTxIֹ$k05O;OL0+jsϿt|J%bU2j uP H"R2n7)7+C5#T ȋH́$U'( e=d܇ @Db/<ΧzO{c+Mۈ"X"uZ-*Ђ)D$ܑJZ\"-ݸm3ZE}Z3?^|:xcfvw}z|JɮI(IXo331p;<͞mɡ$JmH@{Xbcm߈$ -*}w61(; Il_Ǡ7HœHC)b ZjJB)FHЕCl3MQi+lM@FL3j|x)C$ -f 2c>8I8g@[ /^qq8&''%J{`P,֭9qq%_$8|4HLN+hC6E"$nz#!.?"iR%y 9r*!w$$8´x&E#9$PIa;=J!uJ>BSQ/g,BRZA 3\kp9kD owoz#)VʮVY$X "T tގ86.qq9%8ȉ q܅(EJ8,]H}RA2竘1 (Tɕ*Jb$ d6SBy Tn wDz1s_d^$1'۹]t˰wOQWr}[DJvG! [}usYvաsqpp888!Jvk}WE (P`oQzf*B-ϑ *ew5IDBy$NFnkG矨 "(:I$xSY;74U׎6SX p5*mnsguC,EpgP/3̽xG}! O!y ;qq H888ACTl0s"'%k!ޘQ-JG"#̑tdfαOw)-P Hl@"k)J&4XL(1 ~/^ nopD#(a%Mg;/ɮKG1w$P\eepTq`8\ڵkŋwyN͙0a/88Y (5vO*Q$ L1YH Ơ=z2wsI@ilejı T:/*9ڗ|Tv-\۱ HCT<܂9YO @ɥˑZ4F H צzׯye`Sw;js Xj7EϬ/zFrSͷ Fo}&D\;7⧚B2"y5x.6T:nWKʫq=Leʔ٫g΄޵qq9p8>vZO><~z  Uz#@:eif9Gշ>6@* RƦг k׶@ק!?88.9\wu,Ydc͚5e˖H8IH&;PyvpQT.M$6d8Pd\&`Gx# J4Fb#ɣ@jeLw *R7gM'JTƭ13C{)}A7uJDɦd$.CLXډMf%2x/#K1DɩH%x 5ֶ*4mlP_Uɮ8´8$z*/#Q5S]ͽؘ\p/*G (t/*We= зo]㏰|9yf;8Fq_q$Kf;=v]w988;SI)W4d}ڏ*v6J vr(HG $Q⬿#2d}Gf*Nsp JUBe$IA2$I^h6H܃ʾMyTkٸvlLߣRw%yH|[!0^+cߎ@je*5N [L~W f"u8J.ikZME#i [Hu@*V\믽N:p̱ѩ;"wSOA?88@rgزe3[l9W_݉Kn{iӦ{9lڴqqgMERGTv.ɉv<Ӿ"]JD,q1 Tb-/)D", (*PBC$wY݁\i 9orr`T7`Njދqqh $q\클RJѿ< 4p~98V~Ldg7#yEA }tJ&Q`(OTFo.#3-|[yY dϿ/$D'K1GFP^?A 9H m.G%4`#~QˀоLÁGht^%Z#9IZHI5(TIV[l|mwWy5lI- ~o$]Î( iMҿ?:(ʗ/ύ7d{Y3+q:wq&.G'tB||<M4 .p88s@͞Kӑyɍ@d]rhvMq2Id3%%E";+Q:(Ɉ B($#$w 12%ҐT$#fm5߆TL6RV$Dr͡& H45yɛ~l稍o% magm-Z?Z_Q*@. }\{vA2|>[AC߳0sszCذa?v8z,qq9vAiO*U~ѿm#qq?lp4 |~N%G HJ,@'%` R20!Em:҃HLDɠŨ5h_H,NGɞT$jؘ"TYhߠgўDpKPkH)QS4kRk {m0Qf p 6Ӂ@z{c$vVDPJEY}$z;dWQ{J{Bn{qc$~ׂ I϶.< Q}L%KXZ~:;_CYbM6%f*{hѢ`q`8Fn99:Kk3gw^qqq x%EO2A eFP@%.@lNPTBbCdǜH| I|1H <ͷHL(}t: 3Q:{*DG HhU@Rg=HL&NQ$YFbj][\ st݃H 5JmB2'*'wͷ+*w2UwOQj ];ܩe1ɶBt] *ɭϐt2^®h߮۵U'8@rgo B>rq !grԾcD v^ʴ F{D/?P7SJIc l!,:8Q2*0̷q F{ $mFJ.=AIǑkmCX"$ msۈds}z~CIl}۸o[7eylg\oL5bs^W:1?fBQ֟0)=ؽ RPYhϩ*{-$$f[qqq}"ۣdɒ.qq!H(JD>]&_'{IWPgI}A ko!Љ&\ witJL6uQr$y!IyHFr1J0=R e=nZ2wW"ipK)H%Ryl$jN6Q e6ώH]b8 I[HlE` 1V%B- i,ڻ(B+V?{ &3r *-fmģ$Rl$[B<88 $q\q!88솝Qs5#P:d#1q; kĴhg"ٰx VaPvxQT T,*%w=($L]$}RӁ(tgB8?BNF*oǣd4$(yLZA}bcH@$j>Z!!uE4/ %HX% G4\H^bňH-x1vGm UXK 1muu8>.Gr=Q88N% Na!G3`R2u=ID7(WK%iO  JljVC{u'LkQg` oBIxE$w}ʢNl?:A%~CbA$VDQͫ*e]Cꁘq@r[-HA%Frwm#vJTB$!X_T G,7DB5ўO`vߓPJͭ#*Ǘ[kH8&.'rs] 98xMIHF@̲Qyox Citj'#GəXhtjnKpDX.R2! $R*!I$BʰˡXr坂$H*;*PIDF2>~G Qi=JL}D9HF~6Y;:tokQ#;PLe9I(-HQ"I)C ҩH&ij}7ٚ@%=H0&!iֆ"s_K(yqq8xo(^5'%J;8HK Nh;J %]FTOGP&h}F udI-HJRHZUF"-@ԧHFɝvjWTޮcp1ګi8J^[mUlX@jl}C) (WgbKG$.F>Alm%HmI%-HTKAz#3L2vm-To=LZ*G(ɧ~ނٽ qFLlL>w@rq0)K8N(VH$¯+WmK!իVWbO88NQ&}@#9Tܱ(¾HH@&Eh=&cU`30#EXv~7KaTB{$q;Fbd$SoOqh JP$JG$G]cRU$ҮyS_{mͩDkCM%QIl}PVf$Qb $ĢFH>O?뷯\['իG>}HWo߾oիT@<8N(QZ{Ӛ5Jj/^l˪чаQ#J. 88~$PNaFR|88#Kj˖-+>uF׮]IMMbŊA-[V`*W8T2fl>FHʝlso{ a]C,$ņ8W!vWH!JO&L>_ݏqϱi'HHyKu"7G}t~ڨQ# (AľϓO>Ʉ /R #GUVyGꫯؼy3'x"sa ͛73l0.\Hnn.uTR߾o/i&:t@6mvFF7p| 5b֬Y:b Zn[yKJJ믿TRԭ[ѣGS~|/r-ڜ5ko6?KRϟϐ!CxWBʕumϞ=2e #Gdԩ|<ԫWP{zsx LBɒ%i۶N)V+V'%%%3yzjrrrvx̞=? ߧ=}~n}|հaC;8x Zl㶗@r@+VKQF ٲe ŊQTi+[qq/D&$/RH'?(1iJ i<]a=}XC9\[ dkX$vH^G2#;%? 1%hC EH`5Px-6hO#PI8 ZdǾ9RzPڏ|w5h Ai(ݔ`ͱVk:aTV[^v_fJZKDe SѾNDTg :X?=YZPHs:F)ljZm?]G}n-뻻>+(F.q撚ʋ/k{?O<~=z9oܸΝ;23TɓK݃M6d$FW &!م=YHVu%H򖵛QQYGxV6ty*|,YSN9Kb(SLǷ,^&Myd?SrWh|cƌv\r%{}m%HؗO_~!!!a}Nrg}SOj*6mʀv(񗝝?˕+Gvx $qqqQ):UI" h`"G%ҀH(dh A[%HLR0\xþHe3h:8QDNsi`cjaw6~>DD$9"at?`* J "(!;Hȴ~ct4 &Hnn65Hdڸuv?f[ml(q BI$tDe|:wJ:"tOkla;,qF%jY-JWW-sўNAjwzK6))c5r~koӦM;|P_9ϟOӦMxnnnN˻펍7.'' 6ZuQuQ+Ҵi] _N[⋩Vqqq;0旑Avv6dddDꪫ8sׯ/ӧOyV\YҾ%FYfƿO9m+ХK22H$ݛ׾vZ"k۶mn:NƍǸq;Yn]/_<^z)7tM4컺W_eѻgA'-[ӯ_q >իWrJz@lذ 6P\7jԈ^7}…{%VO 9888('9HLjG%"I)Rq/'W@?QW$;3WHST-R@uPè@c$dJ"iuL$IW{m$2l'YOۘ@l3;c [-;Q6HJaTDIN91c Ȳqγu^4vc%LľMA(ɳl\YFT5zݮdYI$LE+Q@.=VDDTlm)ȿbX@2Aw=~ !C[.}aSN)S#G7߰yfU~O=cTZ3tPڶmKnn.ueᅶ=zL2Ӈ~-[t~qO-[ُ͛%?r뭷O?QfMn&fΜ;˗h~W^X^探KOsUT,JFRe;ڣ((Ŷ I2e xIQH2 qM\*CIɰsOFbR$>Z!.)s W>GנDR CiɰɶPR"ڏ *E=JرQu^=Q?P)HJEQ*l)HT!B;w6JSEQj +"v J˥0u^Puk <GuPr6~v L@ SQk' };Kkx^yeVUuִnz_С:tm71*Ujo_ҥ ]tO>$_clْ-[ymg%v{W_MjjTM6if?h֬j-\pczkwm=7sS|AתU+&Oiذa޳;gwv|7Ǟ_~)K,UV?p888AOl$H{DP*$t$X!A9]P ($L AGH 1Ph4#=^J"Q8BIq,Ji\jm};JjdErCR (JAg!FY{_8?E%P LZKQ SmQ LQJ鬘>mѾCA:&ɻӵHO{: r S4gbe5+غFxGtG)Il;}O(<5? r3y?, @޽]s塇bĈ;H2O?4Ǐ( .qq9B:?W‿!1@ $ 2 %kHFJٍG2(E{F%@ra @3pQDu,2|V؝fm' *VH8N1El^_lm5",a:l 9ܾ@$~G" To *) Q./EI(*vS=8 t`5$:易zQ"TN$KqJgk=f(%5Puy^_dY3$~DePɻ,{#lm'zvE;i띀U7HT8d/_e]ƹNRJ7b;|M H888~a3Jɱ ;JE f:u89@rqq9 qYYHT~m)*3A!(gx%JN@f"!M_hs=%#2K $|z>0XRmTRBÐ(jdvRlɶ}EN$s=Uk@G5Ag$<4H|GkԓHk\Aj#`EQZ[(H=YWQp&#dɲsƣRr{ ݀R9?V$THe! PֲHg&h+1͢W.M0`_~ŋӨQ" Nɒ8s8885]O@)HH|P}$P44;;'#8,* i1 ړPiZ%2L|S(Tok:C7 I$\y2JJms E:Ō$mnGe *[dWtgow *=OX-% h2xWٹZOnF1;6ɺ3`>Pvq?k|Jub8fG}G"J/&Lzl@{#et(]yhedczEUY6l<)\wZX9\wZZkqqI\ 9888" ɚ  $M& H|۵qF%:"14 ,,®OC @^My7(ꢒtCQi&Pɮ]OKw$G*ZQ:c:H~aF^6.&&<{ZmQIL$o_!%XE \Gdԑ646xî}gktJ#Em_DұV2˴B-Dmٟ, ITk.C $٢vM=6`ߤ:H2 nz-r4O &Slذ?KQ2qDw8r@rqq& dC?H  t?0>D\:vDsJ2$+I!,J'av~gk-JἋB#q1ɣEQ8ߧ7 DT;^ZFT@$^Sm{6v(q 6?m̿(ų;; l^#T%.6$>De~Il|۽ iJD"yKay7Y ޏ@S[llP<-bV9мMH =Xq9$q888s|p|*OxI${H"d"t9 p.JdLFp$>.F`BJfB_QmU<:XA.J6U@ɞ{yIQtTh?& EtcHD=>A4Fɘ&Hqit`%V̊Gɟ/P)w2P-6Prh|J]=k}϶N(3\iv2.Zj$j} .AiJh6H|LB|R:5Q ^"SfD5 a@$fOL=x)(S%]J} H݆]d`$DI-(=UɏP)^rT5Tme(O!ytJ۔@gp:ڳ$؜Ht-DimLQ;dJwf$~u7JRV{ڮOyG&ZvoD_Z`sX`W?~.7LY{Eo' ; ;0G)V5jcqqI\ 988sEޏhHl Nɣ l@H8z Hf@2.$ ֠TS=%ryNf>mIb$& qx ="9 (gTQgJT6 ͡*`4a&tC,=om#A*2[<؜OϰODe 4ie6uHU ~(PUKPji6GS(,o}ݳÑlJD)jkc݊X ([lx6J;59ٚQjj %k(1s&oҵ("?Q*+ Z eNsm⬏z;{=C{Kšd$$k^''P+fʱyh_PB0N.*7XbDQ7$@I̵3ힵ]cs9Xf_ l>c۞(<88.qq9Yv9 >;F0KH@ 텄>O&,yƎW@w$^^k#YHH<e3D>Dn$vC)q)ʷ"1r$$#t͵90G n%fAIl$.DiHf- |JUF$J$X Jh5Ge:z$C{PC2mNP}G7wC'HMA"oͧ]ɪ6 [X"(4IAɬHԵF(JGɢH`v -i?p&(*Y=KE# $qq\ 9888{M*R$C,ѫv^[ Jlv]p ePh J@(&"Rf Qt`:I $ڡ2kS6\R6+m.964$G{Gm{ TڭV9sG̱"|KEVȮ$N:$d!;Pgt$G]^@%(Q{(UFɟߐpV$jV,#ۨ8J3CRHJZZC[;AvJXo[:4u 4$#YDoHEu$Fٳ1۾z {:>R͉Q9ґ,JߏF"k,q88888$O<h?,'H *7%W֠g//ض된9Iw!*?W+P '^q$9|Tny<88H3F2f+B.H,}i= ,Jg"r"԰kc,Q T^n_g`z(eu JKNW$F&$}@,Tvg)<_"Yb9خ]6g"u,0&9Ůe]OHUkzsJMmS$+esɤoژ+"ab]VL"y O?ĵ^CժUz.袝r$ϟ IDATC,J|{요)pqqqJbH&fHdd"pJTB)5H"CiHjD:emۣQe3!d$w:!ɰ7HJÞH2$yA6xnA!HpA%N멆ըS3@t1g#BSw#!,9KFIvDe@g?$zGe<(E$Qu0]~O)(!N\ֻviax.P@}]w;jBZ"T;%G}Q\V݅[Y֌Obl;;+{A|U>o>IMb7w$J(;@rqqg7&d=%y337Ilf㗼B!*'"ZCf\1 XA!Ap( Q,>7sDzIGy(Pb=$m% 9ɑClyq'(a5 j`; ɝ(7 Q #Eɤ6gGCa~~D(j Jz}z"}R_ll2q!v!O4Qɹ SZ}Y~X#T *EO6JE@joОl( 5 %.G)<שq`P6 Uj[ Lyn+WF<Ѓ<[ka„ >a暝>Ν;:0mڴbM>ۗmIIIiҤ.1$4hرcڵ+5b̙;{%qqqJ=atkJ#*UdQ+츑砲qOc' Q;>/?( p$SƠ~;۱A $~m;%b"!r+}桲vgu{#rLQRi_ccdF QZ(ə׀O_$!Jg#2R!,03l|#lF$F$O'PːARJ ɡL %F,BGɤL۷ O)8.zR]2Q)*WƗjחeƘmJ%z<$bq\xfcv5K,6lȃ>W\իπڵ+͚5Lƌ 7bWF~e]OgÆ K.)믿ҽ{wn]fժUcȑtЁ~ѷo_ ij>KqH88 'v -Ec(}s2<s&*#w!h͜? %Q !Ry p26!H gYn$iVQɴo(ɘv=)(MS}*+J,GefRqRpXW5\ki6\@dqv'Q{$gAK56:HVEs`=i8T^yZU(UV=(t㜸yV1$y"YɺHb5EoJ4dA`ךo <7<I$C Ȳ(H;aOoAFT{oz]Ջ+Wnuʕ+swsuQTT\ob/>k۶-砃"駟Q*Ʒ#qӽ{w5kˌ+dÆ ޿;;{qqq!Pڤ%Io1BB^&J$rf"0dΛ4Eޥˑ,%wfڶ!r Ex -ݧ!)I(T6J}jsQ}P)QIZH"ɖhcV~A;ցv}QD$Wj/!Rhst$J*UG$#QIlښqڜ~c>cJm~VF%la|JϸH1TJ;$nB*%؆z\[~eK~==ky6s KČ/Xa ?<;ڵk3j~;{nsTVBٲe袋osϥ\]oI{~ta{ٲe߸q9Kqqqݘ,ܮDQHC)YH4@R>>PO!C~;RB_ ʸUA"X$@X$ ^ϖ ߰?SȧJztZ 3;T] $j>F WC'߮{jV!2(QteG|$.ڼKb{ utk &_ڵ5,xAD%&=ʉgڽz}v 5lA*6ECEmP\\Mm=xsl 'X®4'J'rJ6.77X,FQQ$*Q%r'r /0vbߗ~XrjW86.qqq"<$I.G$$޸@rqqqJ4iD=x!9dB APٺ/b?(϶8{M2Z?~($\br;T TeCP虎d(=TAɗQZr$$6"q*Wɜ9A;QHe m 0$2G =E[6o"JD݈RSϾ(uSϮa#ն/kZKAf)JG)3Үh]lB="g=t5JkKOHNl-G+,X]rI'wH888hId2C: %V~s$qBqy @"L$|cK}b}K |e(ѳ ƣ;CPPy ,$ʠP-T݅Q=$[S;y |p)@>+UU$=ZdZ$V!AˈzuC⨪+I0IH@}KLγxgOID“<샄W]GDO {6F9 9o#mzvYA}jwH2uAb(I#;R;>6mfQGw'##'qø@rqqqIqS HBgm-JBeֺM}HJ%V( D$ro?HT,5 n4>`#哌4eP;l,I-l$@ɝېz%[B"3ʩ5@ o4T9#g$.@ HTowH9$}ڡoDKP 1v=L")x9JnESԣ$gz̳b`7O ɯKlN~H =@ԫ {ec+@eXA$ P]ˋ{ƃL(/a88SB96Qq#hc,CQQ6h;qqq&]JƍTBT~N$2& $ (C?B>3s6-gđ5=HQ%fs@xl0xjRMH|hsD@3$Qv}jNJٽiG=HOTg~D@B漸j$#6ev^԰w ɶ]H@ucDT=$uNIH=R$ڢx'ɽ_QG_Hlrq.qqqm9!Q=(XzΌG=VdPO <;VXH"z!eI!S8ǎ$O0|X BMXlWܯ(+"J7ٸA}Йg)@ ԧe4xȎ=lJɶT$lE}5Ph9.͉F_Z?_ٽ >t҃E0ߎ5ʮ7Qɿ<ꪊWo  q39hٔH_H M2Vv)@iQy_]=l.cv_#qW Qپ{6Fm,œy:qqN:+iH,_en~|Vw888nN!~+HyH(%M~Ci/ JMTެɔт}]e}$T])Gv?,$r>=H^f(RLP' TƢpm,$w@rg-qDIQ(޿cOW$~ZM$~#KQ)Qz 9ɧS4* Jv}zIHR5G)SD 9_Ʊ'MgU_Բv+6yrl#Pi%9o!t=_l\=잤׾]U$/"HcǻўOf ^࣏>fȐ!8~`i(i>ː A PIH6UFi(20KEr (ZOEdp.J:gc!ϷБZ%=!QɌ_E(=J؍A阺@ i$( :HBe_-2l't2$ y3AA+8Iq^4(atU(퓄I$%FTO^'eBdG(pJ]h' Q3ֶ6@$C I{ LF}ڳt(Q_\-Ijw %@;8$*3ˢ< #O <3h ^|qEf {={^B=Osqv;\ 988=o.hZX yH Bif(1x%GqCgi,H,G )De Qr0kF%f1*Crx4@$>DB&PG TZ/TC )k=Z>?(=fۀ6 HG #d^$[]/vD$ߎ@əHT-SzRs'IM$ɮ+]>gؽ|6G?əY8'n{$W=Jy˴_hAT61bw8$XTx`;CiG ώ>JߛRzuܗq-q888lЏ'{"SQh1~JĐ ϶-D@翨p;Wb>I$$ɠHΤ#ӟ٤01+$%Q*=PzfmJﵶqBK$'^D=t y ɏ9 hJMsUB2,IHD2&^{ٵ{5JSbsp4{tu=f'*%O(7%.C&RmAuk㷭%g+G컩0"SIb䢄[(aX)79L>&sʩQL^<ӧOqqvK\ 988z L.Vˋ $ ōj$O#Sd"*C$"ڡHh,QٴH$tDB,>D(iԅ\؇LasJIUB!Hƨ]vrgS(R hcsq(JJ%!yQޮ JLE0J fJ.A=K7 %NC߮gB.vHcP*ٻ;+}^5|m׺8IH1O{fsɥ67D($R왨R]7 ܍> *O8-I:+^,N{)W,e(CJX|O8[qqq*16_+C 1{Frbm"+?HTJ.w3JT@=}^DVpkPgtZ㨔x{]_#$xжoQ-Q>m|By6_|A"vy&Qא+c=g7v6{lyﲕg~ J*ZW_`ŊTR'q-q888)B{QV" QotbT$7nGq$P$# ɣ9HX\;i'pZ IDAT$"^C%z$SH& 9oA)[/GmH:yϿxl>gQ߮ öF$sDbS2$Zc=l1*sQ-1޿m!C.}H[y%U^dv"M6e/hh>9>18n $qqqvsbDΖ_dId{?TF,d{UH cC2'jACP'X?\Dd`fpx{Xi%|Ґ2 Q4$.n(T|jG;H@&JD%Vqv\@RyPg{ݑD]u.*wZC/$\m{%ꢤ7AL_lc;<$`NE}*uZPH J}nۮEp_nE2,vu[LNBp'!Q/$*mCB,ݟBJqw_~钟~u4֭[}+8}qH88ĈK8$"{B@! א76Ht;D  H~J4ЃHjQQw̋,e >c<3܎hf$M(2ɔv$$tjF%% 欎$nnEE.D)|$X꣄s *$z4$yؼ#*'gs IqHlU{MaPJDm ,{[!J,݂х>Bu-B6G=3D4"y6oHJ-sƧbvsmvL$+ǕB_H,vvO8qqq*9NngB{@JUF%Q;$-@硅vPm24'H(N2J|IwD.fF:ՑTM{ IEHBTCecPJ@"c.*w#|TK;FkT*mSIQϡP6Q6_vLکLTo^+m.k{ (hٶg~L^E#6 l)!h2RX$>AI;Q2[Y(Iv0J9ZJs3]K fI@¬ǛLT򼄝88% $qqqvs RQ['~6%/! oPR.JǤ"qaw $ vUQ)fw+ ɳz9P"Й^҈$LJK=FIfgY(543H:8%ٶyDiHנO]wcmwc0JC=J[}.%CP*gJēl?Ky|F>FI5OAej UƝf EpJbdJ>CQzUD$z;ljǬ^KJ@j1_KW(!Q88;H888+ePHAf}_RHE'Dym|R)YHIH3"T9 L`* RbH.F>EzDaQbe<*S(4H49@CTzno>6浨ܥHv}Q$?Po.6oR[4|Tfn8Qɹzݞx;"Zd{#WdUy,\{ .88% $qqq]\z5,G?H@IQhqm]6Q( Q hi(*CJ$>F"L4@v^3/ ȠsaH8|N$F!#kY(ThDR'F"1 qcۃ3]Q&1g娧O=T~n{5! E&H>{u>ZyHxyɢyɪFUl{I#Q94ĩ 4EdTpJ&{ l~3vH:նgZ$#a4 Iv/#񴗽] ɴvB-V<88NqqqݜIʔv$-G ' mZH(K7 ɅHԤ%SR(^"o?8x%6G") o"Y2ɍNLf">@h> #9s]a6(2 %Fj۹!y7 ɚ69 C3P)%VV Trm4Jh!m%fr'nۯ(U]K8;gD6Rp ɟPGԟ.$snA sv 7y~j( JlTT'FiDg4;IT-$m=M7Pl$Zۜ:CH8,.qqq*VړB gC I:}7cWQ}nq_jW'Qw0j`d( ̷oc^,^kZ]q37<.E"[{EHQo6?s>@«.ݻ6GeCiQiw7yvk"y.h88O8887 ђ="$ !! D,5SPO,*}j忺D,cQ_HhDC{T p'J@9҇\QՑ$HA2#Ν9APLF!XE$J!p7*3`󑃄^vwPɿev(5@g/$\nzSߡ΃De߄z4o C~osp=W'I;6y~:1(6َ[%X3T^:poܽhngC3(n<^⣏>K.ڵP6,]Ǿ3ǟ?3jԀZqmfswq><888KK6+&hQs AރC$ $!~@Yh'ZCbt;Db6$lZXd9hDSXh$>^@zi3Cma~S :?Ae/$Ff"cٵPy<$E1W2y)H"aHvz(hcg1>/gTkac9̾nN)~=[ey$@mw.`|=YHeHyT:o۶tz+;^mgT+RWP ^Hv=J$J߻xᇹg@ƽ~['Ǿ/Iٳf-o{H;C m8߇ $qqqvsbH8CQrVc' SSJu*W~O@ %w4IE$GCـCm$nVM)Gmє9 $2l6yk˴.66w='QZ=g+lPi_T*pm?7z'Qb2ƐK3[rxb#"+ ߱g͂/O>>~1楗`W8|8&=ċ͎{{7oÒ%q#ԫ_}}ߜXxq<^qqq!9%d}>;s}EHBLtL]$brphʗM@H"s"J tB%94&^M5kOkeTjm$ !?IH [w{߶-t|9[ˣm?|WTWCZю̟8y<888Sev5|$Pm}f~oJ:JMAR2GwP<}2(}2+xݐX9(2z0:bXZ>%J CIv 6PB,_Zοz.%& 9 9H %d;vmmnM&JywT$~DB"ɔv(uP͉;$>Dn H*%'"AI:!HЌDODQB,.<$a>nJ͵u( \|RJ}K$$+}ml`ןjְ{X:Es:<Ў~?}:T^A7D=']k˶ƿv~VTrRT28s)I\ 988/UJFI.)-PlEHȚD6g\ &jϾ`+$'5ɣm7ظ+=ظ{>`ǿozJ==j.Y]hEo[8yDeZ %eӿ?4n g58%qqq! POlٗDz+,' @=~1꓉z&e"9w Y@\R7;CK&Q<\DU;v(=q"x=n9J$+B h_1 HEʡ4L"ʱ G.㐠9l{%򐐛L8Գ(q2m'lԝ\:_x;8$Ym~tP6*aw Qˀ9(Q@$C %ڜTvwQbh=_l {rm =JA4[huގug#ο@Ux 8hHL:t~Mx'%GFQ{$GJJ̵oo9~-x;8[88891JCgW"Ʉ0{[YHFd_>\(#J B!Sv:b88 (Ut6J8lϹHR@(/T2G|J$!( CG sJl݆"lTA$JNLBb6~A iS.fco \d!݋'p˶9V!yU'@/ٵ?R>lLul߱{m<ASD!Yڞ T$r%9rTV"s(wW7/;l~A?IHT+2/a1dǾN-^v-kU%[ʖvkCNn]f{z^r~KNBG8q8880aY;v6]NFeЎD Qem P Jd>Hd6 ɝ#+ZRCg>$0TX(ۦ?(Z|$H8J7Ci=8  @:%j:bS%]kkdsoPoAy9"~&<;f賔JK]$ҀqO@2#$ޏJǝe̶~@-$1!Q1HGbPC$QjJ4}T[l53 ӂlvPH$ ޙH& *vU61 dLm_3^2v5Q(#ibvh(BAJY {r&%b(qU4"nzh#HCҮm<0Ӷ &wyλsF9:\p[$رpQ>/8Nqqqݜb@ #H<,AxȟH2J&K)D2i&p3p7*9%clY(yd89F!ŌG2Kz .(} IOQB*p ,!Iq' kA6PwQҥ"*7Ʈ+5JDp{<$܅~]$$Rs=PzJmnH **uh?ٶd<gbO!8a6>@uiʨ GIDr+Trs1Qz'l,$:1m}ɞJ6Oj$ڱRRQBmkd￷k86#[Q](Q4-l\l.B=E="MtJl{1^/ =[6"Qڶm2E6ᙌJ\HeEvc6W R% J0g@rqp888nN!_ ;!ɑMh.?A#D_qN.DdZOEBbo`B+)/nHRuG%@ HFL7(Id{_8V#îx |T 8KVҾHAҢI ()dO'K{$H|bkJ}k>$^ζy)A頙HٹmcGyɞH hs#k}mq=DYv +S!S*5~}x6~[JٳU gP20Yb߻'q)y\ 9888[%T˦xy9 -s!A4 -" z @!J]8Wc"Z>˱FR+P%%v$duKDicQ? ޵շmql@HTAɤHٽJE$ް{󩉤Q9tz%F~KKGj{nA *4R, 4B֡~H/2zvY;O 98S)pqqg&FXl=-؇`(%Bb3^7Gq)ud۴CH@T*h$&!AzơuQZ'[RKQ$ڢj;H#y-:@eBef\{ ɑ,FaYn8J"s64?$|1;Op߻QvWQo`:pgγ?p3yPA$e GIxfbsػ $~yHG)zJTk;/%(~CRj"ihJ(9}1\r)?`vx=?5k&̳(3gDRR6l)))4klۜq[<֎=ٞo]\_EIjl2z]j秤ݻ7˖-@;O 9888dZlOF ( !)ʚRuqۇRyA܀CTɔQA;S$zI;!/zDb`?عE%"iQk(Y4ɨH0܀0$Vؼ$Xz#S=RF|8[j{I{l>gOc IP-K>E2k;qv?"q01;sm/G8B^C%ӽʱ͵ws=\\=Tn/jIv>nD';V!*\alR,H&lD´D|C?=27o`<#y oN~c?-~wRz-nfG[y?~ _TTUW]ō7Xj秤 9rG)uxqqqg ,&Tʷe woK@Ҡry*V=oMmTm8*-!1E@v<;g/i"$tj"I9B8dGT^6(֮o}?G2`$}6ֶy6_QrZ~/@- kձyJ%#v'*w8:? \]C'!ْnckd&s'S3[ɶ;IHٓo`5*7ɱVv;Q",#nEATJpSQZ;<qv߃+<w2ԪUkUR>}?}ΐXv-])I&q%p2a„_vv6۷nݺuQk;4흃-'%%h":uDZر}_n:nf8 :wL~XnΓM:u8#Kl~;wݺu9ә1coq4hЀcҵkW5j̙3w4mڔ:I&R'qqq?̸ Q&i -/FJy J~tA'!F/=;4T?H&mN.7ޙGU}f'UDq!QܷZh j\RE@*bVR@JdZ*K"([F=p&!@[}]2s{frn Mr g#x tT Q@a+`zԮ $z HTtql}[\C_tkP9m3m_sbx$j \_(P%w!)J %~{GF"9sݳmrm|Db(t]k_JOEɟ?!qVTVwOWƾ9Q7mؙH6 %B`WOځJL,eotohҴ^Sޤ(ƎˤIx'Z*={dÆ \{%n_gРA4nܘqѷo_ZjUW^}ٔ+Wnvv잔t.]{s322h֬=ÇIW_};LϮƟ]j?<{jb\uUݛ^z/} :-[_Lqqq)5Z31 dhDWH,$1urZ6Z;M8}6JϜJ=1AY1T B3VRx@th>IUHPu="A?Wу6Ζ#k?6$Od5*?οW{s.*m lm@R_ɯ"WITk#D(TI؈fR=ؽx (g}i`gX>_ Pپ Er,$R$ bcoeHQ89JUA«&r% < ݺu-|g7n`РAtaҋ/u]G^\;t9眳vvMٿ_9sfoڴi@OhFtޝg}v;3[z;iܸ1yyy)s@rqq!=OHA&{y6Q $3rP$KH4C  3(i OE vӘOMSM Ar{%9ۑv Hndx$.Vml,P'y/cG{PmlDl~ @F,[>-"i>۶m+tN  N_WZx;eH888CHYed9~J,P>ˍHXĐ0i(T 8˶MEтcG#IP%H Cm_ 1H8U^IO () Ji<; ɡJo$r(u,a9~?$CHLB(ׇh'ml3Ed: );PoQY(%&Ja{|O<믿?N8885=%(⒘4 0,XW Qpn݅܉߬tH*o7I Ԏi`0we*kH QbzT BJJeQ&[[$RuHдF/JO BIXF(i3ś`zT#TZ맧E(!dd$v&GY6)m6$nftQ0sS${~B%nGi,$~p7# w>* ?ɨ a5t]mߵ@ IHX"eR8ز8%f?;۵K"mvu̮uԉN:/鶀;YCY`}uwv;AڭZb|'4o޼L?lْ-[ߡCܟٳgpBZj2 $qqqC QvDW JTB]$2byH +n8H*ڶ6Ԅ+]eA2%IY\ jb7ɣ' zιIpREJS_ VdTn1*+T*WH.`GJ`"mfPMm6 ls?sQfEi(Tٮw:J=@qCk ]k<܌dH M"*U`$sKSjZ]wH\6~~ƽ I~Q9 Dcƞ@:iР!!35G.9 2+~Ɍ1CD8eH888Nh\dʉHdE˓e|$:ZG7"qs\\@Z3kdsL5SL$ ҬOQJf * mxLjE#SkbvG-tivz$>B Hݎ0:>GII6-L$.@%n@wuf58۠5Rmע4cHvM>c?g7[{p=8! D3HBeGm;o0 Ck1;w˷y h< %_P(8{B͚5yꩧ|"se\ 988l%8{g(s*;v*z?8nJĐ|avp$>@ن#A7-Tb_n<? AȬPqNN hmh0ɧ(4P:0ɊPP?FeFrӵ(6_FR68`$:Z@"%fsv,1_#EҥJq وEQ`&\H%rJz-FmZrBoG6뭽$֦XؽX0$*J`nDI)\J(ʺ%@88eH888Nd!}6z ճwQ2=*cEرM{ H@ ;$Ng>xyla$X;hHl܃Ic$~ZY&Nu$=NG¦ BP:f J?gLC⨥(sZG$>N:Y{Ul\['BЊtz@hޟbf Hf {x@走~U$޵]eǴGZ$#ʐ|Z!ItwJ}܍D7_ZM3JFkNEb, vDHu0$O8g88>888qj(e-)ʫ堲i]ub#.yH>0(J䡲g[8Tnc~Ey\uYLX-ґ(s Zg]b6i}l$lo!q1`ېjz$_#aι*GWkD (Yu֏`-MS$ZvOF!bW#Qw9aPbk-l$$V" 1@uQz $&ظNU|$k6Dzɽpp?miNґcqÊ|tql $qqqgG4GI 7Q2i,zߥH{1ɐ\DHfK.#Q~&Jݎʞ5xE2)HF6k!ɖ;5=3_,$FXFi *%y@ j.: (dHTE-EgHN}KjP d„j&߮0I H@rj`݋J6T2$FR:ck %ru{|F7l6Q*;O7T !hY(PƵߙr]7K98sp888L=XibۃH *qM"A-H܉dD{$j8r3#Ïbm~De$8 Ke Qq6J]/kCՄL ɣJTC"'$[28Щh"~~@eNEk.}w6ܹ %8j 5q OlBk݄m"Z  IDAT "6^޻8 IOQ> Dk Xo5&ڶl`k'HմsRkOQvgXW;>L}kd֬ۨUNO: ɵjsl(7;-ZTGAJJ gqNkv֠A?8Xx޴S\ݻ/v{\ҿ9<8883ڡS)\z?IHF!3=_5ߡMIL\f (se J Gl[$(J~_/: qVDaH wA%f1@ɟ 0 ܊$ 6#Ϡr}%1f,H|u{T[DLcg$G"7ʐ8]쾵m֛ d^qae(5ɢHl#"-!L{1P( ԖyfP __|17ޓW^SOݺuwz\7TB q$'BpO_PP@nx xof.F_Rq.qqq}FXB(RJ 4B^6;& I?ɗHeVͻ?XQ<6rhX>Pf* O_N J qJЍDIl3(4ݶ_$mH4I*hZ{$O~@ fs%!vEShݣLS.3$ϻHv}mc Ys=8 xǮuJ JSs;vh VvlKQɽ(ʐ|Z?f[[}Q dU 8IiHUKB />-{|!P\Wre.Bƌye&TDE1ӦM^cӦMoߞ6mlO0sLV\ɶm8>}z_INNfΜ9%~Y_O?VZ 0VZSNcO/cмys9MF˖-=m۶L0ĎP\ 988'TeUg&J$tK1iHXJ 65ض>5|4` Y\RN'L䣒sQh.JDyHՈQy`K;+Ց@ .h]8J3M~P' ɣ(UWA%frrB駖/I;m" #Uc[H=OA"(Ʉ({>X( !L޹ɢv$LV"a4IH̤+q-h=QSOvP)H,cȸƼ (®5J>HtAIٶZ)%>DiMH}\téH}YƍGנAСvAyf6mĺuHNN.u 馛 MY1?%_뮣W^{܏O>Mz7&//o'N_Nq8.qqqXB(AӐFsP )x}/]g*鏄J8 $>@ɚe:(,dц$!Y1dCHΤ 9y}4 T$r࿩oh)HB$3!I%r#Ml^{gs3?u&RP"3H:A ^( ; ɦHuD)(*kC #Iϭs,@ɦh]}Kl~-v* yH8au]gmyno<~HeKbɒ%wp}Ճڟ3<жGz/Ce,_-Zp)ux 4iUW]G?UTTix5B& x 4 Ytxkk% oپ NQS( ZJQR(c+P*%.Ch0*7t/Ab*iP*75+!;|&6zG$fg&Pɺ H.}I6v//BV-^@2TOo'˗At~/W\yAOz8q"+v'?ڵkδ~UE(9_$ֺ6ivoIQkg]F(bE>@{ Er ^XlSN=%KpGrUW2!A'QzT\nݺ`lB:usg?P\9"wF*5tªUhԨQAvw>? Wp dggӢE; y'Oi//8H888NyEev9xg>Xchd-G`KG1H.ZkK= <$APzL$D(kh}JWM.P9QRfFT_e"(t;%} eF3$zTU(%D&hk7%*"jk} xjJ+EmnϷ1|m]iG"g*/a̲vbmQL˲kAk6% 6_@RnS$#ASy EHt4KT*70|.ZU.2&Qǧs町H]}:uSN5k^q޼y=oW/iժGO>y,4{l.\HV߱cG233 8888pJ k!b ?qGPvl6 D1$,2Q2HT)&PG$>/3j$P &J|DÃht$]CkEKGbf Z9J#}o-ݑ: IQ<1+Hoɑ aul֏PٶQ ia Qپm?ܮq $JRAuQj=pL6) ij\c'yZGª+HSJ4 Wjdm*wݧ(]uJ<5J]JQbm9N8Ρǐ!C߿aTFСCw>J-VX888 'D9a|zDAB(q}<;/5͑|hEBf$_>C2e.a c_9u `/ql)@g&J9I L5J= Ch JޜNeK5W3HCI}#dwӯYQj( %>D\cgjk.*YC")ɺ6k\ h6ձ@D+(->d_Fim{%yvH^}bP Kߢr(%IiA8!L͚5yꩧҜ8s (@|qq"X)rP BDEJ A :HhF`2C'QX$[u4#J> ~J$F$BrcnGfIzFLjH4FѮEڪHbem\ϓhdf?$XE;$6RQb `C/0T? D"IR=u(-;Bn#ZZ$.Ab`?ˬˑI'PV6l 6%HBO֟6Q$6$h@%Z{$Z*Lwv4XjΡ5qq6888]ξ&%A6ck"3,m[Q:EP*g*E#X'$۶@525n6oS?R_{ 娔\ _\l04=T%?!77GMzJ#Yɡ#!au9J95HU ;0}tS!)@$ND;Tx5*l g1ߐ'u" %B+k= ,gۈXyBxL&Q$288<\ 9882䣄BCZ$'HHJ` KAk$ojgP 4B1GaR%xp& D5r9.Jpu$6BrbJ1Tm#עd HCEft$9b(Is #PVR{$T!iNԉ(q7jjKC%|WJ^E:6Zk_HE!ٶ !h=(xu?P ѕLʶJFR0\MF,8sHrucn#i4ڈUvBJJ8Y>`ذa>a˗-屏 fe>q8/H888~!IpI)vLM$l߻) J"AWT pC$HFلb6* ,*yD%u8D/nBj.*sGR]+x~i5sZ 4 I%rnS r~[b9NֿPٽ+:CE(ںڞ\J|mc2Rɯ.6T"Hc۞mmhfvNkq5QK< nF4 !` Q(I tCjMµRQZI.֯\jR?R{_N@HāHbAX.SG6mP¨JM޴_hMߣޱvcH}$L$D%wY&J<_V1sk$n1]$̄kIvH4mAɯH$HȾ㲣k<#' z6mIsq~@rqq!w 3p"TBisQH&QBz>Apͤ>H:d"GC1wVB.s$޶OD5$^$K>-wJ4*Rkq{(A>TV.wZ֏>( t;wɏ@ƘJJy@B$6rq9luFr+vK½ Jkz.0^'}9ᜆvN휈]c^±cdVpfCQޞ-W5NQ^yU6l8q888shQ)H.@2? 8 ER XLaq ʥJ΁db3GTk]%Î J}Jͭ.He@ 6.(*MW %mRB@{T(mAXo ο L?neҭ8* ZVzEGw {}6s(T IDATJ T0b>nЧ(|@p C O ƌyѣpϽnߖ\6+/qq~q@rqqqY~5B$"qXӑH%m_5T `"Wwud _ nGk C)S` fEeCaYaTMmluϊ:ߘLkH5̰96H\AIQXBIL$HH_ɟ6 l[6RP|]0Qu-v*ndR"0 ^I'5 l+8T3<@* ,_{G8/H888 -Q ɃKQ*)yb;?Ja-}SE_pӹ>6$T)T>JtٶHrmA& J\Hjzo4mF)Z;c;Pj6Jtl#&i n̳IÐ)r-%Ch / 6=K >F%ڠR{1$G"e}$+a "c 8Zwxqq888_ YDÏH),@&T;&)CK])RBӹ$iJʥ5DQ&׮QDr$jFc$~@IfH=|*z-).FxY yrxBJ,E 9w %Q[68#:Ez~/NF {tcHAI\YztR o'`bI{6L$s K aGE% Y5 ɞ"K8/H888}K~j0gs$,yɍt$$M:uA@q"G"(pmXu3 IH^ !Yr1J]Sj*'`DAvf^"G RGȚ$\z$&woOh~R(R J)DXkmRcͰWAɨv7O P"ل%<$uv'|8 pZGnCTdvqq.%HҥKS.Yp!˿.4>J 5d;8884H% X^0T&mJ Xk'CNx N8q m׉uA)\B-.v\V5n!\( R 77#ǥbU!DAN, h]82Dmj-hmގEk2͵kwqF3-ٱIB(HJ G+j㞁V뀿Z{Հƨt_q2']Wm-+ɵB|98 j //||=z_͛1s&ĀRfͽƾ888:qv\, ;4H[&(u($]iȟNH.ccb0';ڙ fMOg$FZ+PIGKDEu!dF$% vt]s@:DWAT\ug*r{#3ۮYT+aܭm<Km%\+ia CHuO6>JAR*˴"(=Q@8&Ê# vr̳t R{9vqLpPҊ+wg[8S\22.MKcذ,nƾ888S22j;#m;#!,g%P%DyPB`TBQaވ`!<b5 / j3!iky pÅH"NC`*JJ=L(b=fU 70QTHfmND[QJ&"tbx lEL |*Y&f%+v~\M/-zQC@'q)[|Ǥ]kՀ+}ߔ)SW(֫_T/wqs47>q*T`ԩmhۉkf1(ʕW^K888ΡJsTP"w"X?p?-aRczx)6l%!A3P1H~$J%^gAUgE*u9 :M7BnmMTPٹltU:Tn.Wkc}7-[E?Օ-h-NOːzX@$smFxskٽslNvM=} 0+H8-I]w^o.硇V{l 7wĔ)S뮻X|nUZ`GydΝ~>1Wx2dٸqqqH0ݒB%i (as-Ej>0(0lmOEi"N 9jm\I67?G8ʯ.RB-s,t ;lz;:}$}z,hTm7-PhpEPr΄yN&0 |G%j aDbms& 7֯vq ΋ 7E}~=Ȱ{6a4|O 98 $4s{\uՕT\k-xv?|Mӹ_d)Wʕa֭[ٰaC3=?o888Nuh&z>/ 2 ~k@5$ #1pw>+ dҕ 0uEh 0bF(Ȁܘ$-`PP*o3Zۨ]~Iۀ*!Dhrܕ[RVAt$ иDNµ2}'16u&E5hMWL$Zrp:p6? U_BP."틴a1YZi680pͤ L2 F ɬYp뭷Qvb'תϞi4l+Vn2P>}Ώ+o@kWpSٳ׿Uߣe~>8e$X ?cɠ^ wX"oL駟^v5jիwH!4jԨmРGq?f{3.qqq"qB}k:#YQ(zlp5l <$P|>#q[f*D"\ #k)`)I1(}4/vAͭ6ɧ*eb|.$OyfP _}Z0.K=ow-x_y :^} Wpϧ' 믿s3fLVr2'ObA[8on}9_~ۿk.oժ_rcժUԩST͸qqq~iQ.(5oFx Pbh4aI <@nr8CT A@GpM*gjۂnPjn +÷XvPrkAaapJhuxrl'jw$_KB&I,PO%~Y) s7P%%3aܫH3p E =_RuעW[ VE?#o52P}o$WgH/1|ĉС\u[x_r ++4aB/n]PA7iRV,^ 矯$y畼#Hm ?{2Uv7?~Ľ=+gv7w=Gko?%iW3gk%it@ny}?gO_|Wsw0aD*T@͚I?*T`.2wuȗ^>cMlܴO?Çӭ[vaL2\1gظiǏuKή888ΡHUqA:8ш0u(̟Ga( s;Z'b<۸׸ɖu2]P]3/\#\y:|+#`SeX{84Y ZAp8u9 ~''ah7_k$wn]mg|Gvp~1ΙLzbEr {7PmTBW?L,gcblG(>O/t?aQ/ԡ'k=xv5k֔CޝAᩧ`H7F(|sЧ\~9W0w<{>=a غfس튂0Ezg)_IgW&鲯gwO/]RrܲΘ6 ڵ+ko?kpxիwY? ͛+O8=*aW\˗Сv_I{?駸{ۨPY^ܾ.SOcE^FW/ػ799Kx_?j֬a/ҹ˭TV>}zjkU(N<1]t?Yvv5.qqqC^ !At.B͢Hn܎w%R\#T.C)@ µpp=KBb]s|-H[ ĠVW`Sxl*88;qLo|yTKc -LKۏVj Q9667lTSg$gtim >ɵhݤ M T<Mg|} d9vl^½h[fPx&(roo$dXv-#GD(hW ]^yyǏ_r qG~&] k~:Eo_OAJ{]D<5?&$A> m 1c3K;嗀]00dOߔX WlE̜^~yn{QG1b]sW./tq׸;;]qqqC|| G &Hh4~DDOC%.NAR($,k:dùDUv\R] p%* HE7k`zmhTwN`V# 1]yﹷry_Tbu%7p>A9#}Bq%r(V23"ά³L&3ʇs,RVJ2lj>ecQuH~q$^qEX+5kʾ~fe[fV 3vuf1~i!ѻ7̘.Wܿem_eSZ+>&g 7Tl|oO¶mgOݿhHefBÆ^_E/c)M-   p"I@e5.~>HSۍP`iIan`-*kgׁ1i(V1u[a0mmY1{kf𲩑Q}~1Bt>tvP0쏂faV¬Jzۚt&$T;SQFbS=Q]([͜]5Ko(!rep&Mˇ%D{_} BeTu{HwUmزO?UB׮Jwev啐m39t(t8o*N|Jc|%$̘Qx@6qqФI`-_Iij֭ mv_+:+1 J?VAAH.W!R   %:E(Áʂ1ۙw@;PmQb%I,cYtċMj7MPb/Q(aāVV; -nq[9|k !E%?8&0 80Jt%9V.J}T+O:Kewoyn CXHoF ҪUʫ%  T z7Kc(c?jd8i@: %>=1hPNrӆςpJy1-._jwҎ_>\]{oU"R몆в%Z* UܻuS"RY%>cBВIdAy* iYz ]2vrzY01dPƓB,Ĉ3(#!SxdDLb寃hhׇ--6vOzB\uџW_3QS=d;48lš J9ev*[ngܺN7JFOVW |Dz% ŠXx5%\L5#Eeݧұ$ (>6#,:,oTYT |f`ݺc_p d~e[|$*阡n¥sMIJj_i)aҮ5רCz]nIni?8sMJo?Puf 5cy C&MIgAAipDd K0wp]1%jz>f<6&}Qfy["'pI[Āh燳6A,x2h |`p~oKx{|Eị\%^k}z:PYKPYM(UwTTS/T} 1>:NGdHZc\z7F]`E-(>۪j  ‰myy$jH:u%~?AAqIiB ?*Kȯ-ִL9dP\SDGFj g%X… 2@⏐q* P4Ѷ IDAT_Oᒟ7éw)q-mv3p=^_ igWfU 2|v_ W z_l9@s` ej]n&ձwtnmmqJ]\;TvQe~v}ӀOlۤmALX 919A'A JGYEyߐWM(9P(`,f.ʊêsVqpE sC P}SrpH.@>lɂ=uVh |oAz* !w"?a@H?svԂV&I?[ >B H({TݾtOnO@3#/GQ]",d5ccOC^oؕ%zF(/(;Xջ)(!l*/О flvY@A!(T DžO' B p^5Irc~V{&['Jp|)(q)͟@*>J%0&նn-&j \ZG 3֐7iITgoo|83zk'$m_ xoa *3Gݦ(۽[ u?GYչ>Xc%m-Xn{J^}`e&2~`R(Xekj3qAAO$q! P=&:d)d;A]?&>2u(%X M, ?#Q"XyoRr?sBV{1[0) 5m 1l0z[ȁ;߇Swh<`FC7QF./Wl,{- ?Q<ƒΧcr53J٠*he=Ae5#;u1ϹuL0Jh$[Qz@A! JF'Afv&9g&@?@"\o ' 7p)&,%r,F >B %FY(.ѧTvN\ s*8nv;| bcRr`y&c_8\r@.7a; d yG)%LGS7QB(l(p JleQ7TݡY(IIXy@T6l.?JD2K4u06XܡHՅ^}ݻӰCakF{7meϞ]xMAX˺CAAAWLLb_gbx%vO^oAA/j"\UT qX (a" G`v>d#D$SK'h=F.۾N}SPFz[WLyXTY|1f[77rm ۴i嬰mZ][ cmZsaر'?AAEqVwj݉:*F@;# tp`=35(g1?zmR 7xz3L'. 0h)Gʲ G' +gBF'2&BfQuƯfxH;Q;m]5b[=`vmf4e%lڢ~FJ(!;J̦v-.Geʀz U{TITlIA ?ñ2j\X~rmT=$zQBԜ9GHy7W=/uug˨W=_S'Z_t6=Ʃƌý[b pMi:u*}-[,վpxW<*Zr1W? o'o;dѢE7V궿nBܻ,CDtQ!vplI[9s&SLxA`S]IaxQ jݸ%(a?^e4츒ܛV?SJ u@3u>CYmEe׌NCe>>ɐ8 ~ AZ8{+||2JY;;ag \xm/Uz=uP=u,E5#db0]QJQ"5vة8(n,:.uۨm(yO`xA$qt,`C\牶J@3+E/.,q}ʬFɵ,qMK lMg_?rpȠ}t5}5j/ӧO_oeɒ%uʰ:|0SL!++tƒ>Hڵ rJ^z%jժÈ0%-+p_ROBCn\W_}< W_]n32 H?A8ATtNnxuڷo͛YJmب1Ϥ>=9Ë _yϭ.~7/)~z+}oFӰQc[a̞5? SO>ILn sUWU+  /ݝUd4jՃ6*\{fOUQEqӀ, D`)voI=>_{R>n$|C6|x}6~У\BelX ^*( \; N^ : rf{^#4:+>_ !( 3a-pJ2|Z6Fa()%8d VQ.0t|H9%PQQM n1]; 1Y ޸]d}1_o/~͚5cѢE\uUL8￟G}_|tzni̞=0g,X'x:u0gΜr}i/ ġ2Zd o3g$&& &pAn wiҤ e:͇bС}/J74hs)wkCsC?( ?AK ԸwޡUVѯeۯ3~ڴĔ,\7yMƎ 8S5|ypL8)>6yěs-J $yI $AAbSi@_T 3n3jR%aj 'Hhq6 _kOZpx]THv<)g(DW65L_)42' (*C l/KaM3HtgOMp><v@C6_C p N?,τ{Yw#?Jߢ5YE @ ctA .P~}a 9&gAe+bI~r!zygӬc 2Kڦ&%zwX؝xv;oϤMv G׬YÐ!C r-|'_z%MF˖-eگ?^~iRRRhݺ5GygypÇDEEy :th@! JZtN:gvvvW_ 2RQJteo߾JV];x߽RpZn;QV-"jA.b +w/ 4+`oۨ_>W]u%. P16wMPTR`&ݕUgJ.^Ǭ%lG(`Lq@\a!%87Iy:vR\3G$Λ lG ^:-؇4zɻT`Gm: {XdAQq,< .!ݯu색k! l;ʃh8yT}7PYIwn4x+S1 %\u|\gT)£@WXm29Pvx-WG(WК`(D}z:޶7ҰaC~'>wYңGnjQFǴI'9??{:wYTTT@ ;wt:+_< /_2x`:wСCo|{38Pi?nRp3_^vAYpBvJBBӦM㧟~"''|x5FR{ FV?AΔ.//u>#F_#33ݻlӼysS999vMsHuSˆ#y;"oިQu)q?|9_ P;muX]Y#uHNWoO5pFYJ `QWF`񄸢;PK-aj2A@,>&'^1$f.s:5=<1j iM my d5qw[N_ 'U6 ~Vǒ%Kصk)))e>ql߾}8eꫯx9r{Çs7P+ SVlcYFPH 4ଳⱙ3ѣ;kf4oޜ{ҢEu7曯 (WխJjY׮m[.""999!j҇H P50VwHjy^|W!r)BFkWTd d` "Ao@,eiO q@CG#W?{T.;W ?P4ƬխvUfS p2p s8|ew3uA ?J1=ĥl(ڍ[Z/w1S(K?\^[Gc/}K:,}]$111z g"U+ҳgψjcBB}=z(^p~ʛos=w\8p ˗//{'7N[O EBBB=&<٦Lvu'>2r,LH^z g?3YSs4i"˖s_駟ΒKYh1oY+ X^vmz-ُ٧4H$A*$^E^ޡς e!]&izy%ME(hBj̇R0d\(A .TaT~`ʎ-t>< ,dΥ ss $K,{He>Ԟ` d6Eaf87%!y3φv8761:Tnt@@b=eY` <)-+Py(GxdFU)KpU&M5/y]xՋCucуԧDT׿^ʸq:tܴoQ!>ۧ.E?=̊+馛"*x~7pYD H}.1nwqqq~Fg."TL`͚5tؑ{n@ys^#F~L <@}D@A#A8^Vwf\ *t X49JGXZR&ʒnʋύ-O3V֝T X,^}PS$ ,a0uUzD|Ow+l=ٷ8mom>d[0/tA_mHUfΛʉ 8Mb}pUDAOm猸VdӃ(gF&t1N2l/\$֘gd U&v8k=޸ևoXhׯ[nacB\vmyHbbb/iYdMI ưaBþΑU~%`Ȑ!^ΔMU 6l`۶m 0 2o C _wlMܹ֭3E֏5QF9G&MX2?)vq.lyuOw(gAʥPح|(;KUi .UE"S(e)ԁZqS^CG ܈ڡ`y@令(l` ~NaD՟S?wjKh;8'fq =蚦Rm#K#h\5ͿeygnR~y~®h͚Oq$`ԁYk@H};UK`:*b(ʾ`ZLGV(8>Vm7{6=~PG:D,M-3+\|/ _U ѤIqPT˘ԪLu KANX 1y;v9FF $L͛&@Vn)(+˦m*?Tƒ؀rF`K=G>~1BnWHjƩ5ϸ# yX ⸀\NV5_O(. e 0ǧu!Ua!*sh mSOYȃe^X_#a7!7{?9IWq%>K,~\x|yry?B^}PbMߡ̢}(\DL!(ʞ<%|B{*B!H  D&" ? Bx F(x| IDATeN; G9䛅_.J@ FRvQe溝w[@_-(V=!;nuXN`N>O J<o mz#,OO2IR|KڒR2m2Gw ,#]8R U2 U(WL`eê3dD,aͣRuf.Jɚ BtX  D" U2? BI Ou&[&uȤ#gT#cG7*?o,V~<%6e{A7JC 4f$$\LjQ>gP2٪bZ <\a t`3q\r!I]۰Z˘څ]wW_bJS^<'r&N!CB  BDR&i1A!A8 UPVwCž]T}2P*zp,גu8P5x]w?*K 4m(c[#swx 8l 鶘PV0B0"T4O͙ÿ}^ ~]ߗ/o1KNNo&55FU<* AR&If1A!-AX PKBMeu a%WᎲ"7J 0Eo<`(aëCegGPs)6oJ ٮZ FΏCex%}8WN"()üBIgXB=vs~f6Qnk*#YT1"$R4[K8NAA?8s΍~\W_}< W_>>>LFɺuHHH7k;HLL,Q<xgn{j׮M.]xG8s?m6p@/_.7 ZAAN5l&LfRYHt*J'Vg:P ]QH`*I:l)z4d,Pr(g1xݮTM:priX>,`<r13㹁tL?t"&c+ 1CJ2"~vs晝#K,7`̙0a< 7ݴiӸ9󈊊*r14Zh Zyg-ZJJ` 7N}X!J WIVh d8EIawB^2Y8"k(%Q4Rfٳ"O?4K.%..Gy뮻tuq{zt֍#Fp}ѫWcnkF;v,O?t&2AIA"&a BYݥ&Q"*e੾,~ؕ)I,9'z?P(cPXic $A@T]8T6f`VMYơfOѯ:("6<$dQhSV3(e5b]䖤/WR9^( :mT}<#c;^o`<*&2^RW3 ܹs;YdG#v E\;?T`O2t&j d*ͤ.T>W}B+7JBeÕa1LjEmMfbml4S`'.vL^H6n/a\=w}jx:k>xz%2<|dume^g>@*͚gmRRfqW>1u2fl‘#GhѢ^o{ԫW?g}6vfƍ4oޜO_;r|?E\Pt۷ "H'z+رcܹFA ;AR(n*ĩً@ P) W01E$o/s'}g,OE >F,bΨ22PȘl)\D_epo'"㴍\ۍf[+}]e,bŊ7\ ưaÊ]_ZFNI׭[V:,VZUdy߿PxNJM Bjj ADArrr馛С7t/g?>={}u;K._~ AA,Aʀ.j Pˀ7k(OZ(\ݭ&yQ≱ЗC ?$XZ%(= | lGbr訏mETRmY2 o_~&۶Òz -k,.bKC>#n6n*G~'>|_|Q" qn&j4n,.7V"ݐw ewg#vw>uϳzn(hf?n^A CFJOۀxFh#`!E钫m{,}E'OTR>޾`l r4d[ԼyK2AA\E@x<,̘1x#AAህ BP!Vwv"V9L2QDDvwڗU_BҍwLm"(,6'p+ثX3N2JGC_Ԡ‡mOcSvL&\흽R6c{WAAjK W^@ƍ%رcIKK` x[ŀī;TYA8>M~h^V-&TK&PCʶ#ݝ*T2LgN.])#s_4 X K1Nj'0j/iլeFp1g#IA!(pӰaC8!) yyy4jH! B%`<[:!=Cik3*h5*[#WݝP݁eX= iЇvv~(nX&Ht4{!5<ތ+0.vV!3b% P1t饗s7ҧOl)0a 妛n ba'H'*07~hYiꮉOY vw&4;-"x|8PaﭿHڏmRƗ!z^T!JG?]t@ۻ콣!'gӲgO.P!PÉ.L<˗өS'^y|Al <.v^ Ius\S87l` YβmZ-\H~^^Ჯo.Uz TAA$AA q{3ȴ @`*oH\)ٌ$gł3D2mW.ƶ.}=Ux4+X3 +;Ξ!êTYri\~L^&>p?Geڴ 0J}KF]FdkX~l|5}{]9|>e =mn7xFw™t k@L$s.km# B!  Dba'PyEMGCSq.,K' Ă }BbM~X/\ivwTΗGRm%S>[DۛuYrݶUcǧO)(( a?Jo@iӷ/q\A(A$ X $\LAG 󷙨yEUcJ3zXݕ%`"9qBQUϪ e{g<=:cx͟ψ>$0cvGǎ;c>ᇀw>! &*:Z}((A(A$ X B@~QÞ]Z6[cM~\:"vw‰ňiAPwf,mTA;͛GÆ ={GRI4:4ngCSphQ_l4 A! ;aAehTʹr. rBq`YSN$Y9QX݅ñIWk{VqNQ;{-`;3YJXɝ)tj>#:!&R9dX8^Iu+qtg:{M&**W\AJڲbQ'D/A3" B!vBuL^Dpj, d1nO&i$T"L0ʥ2J"h"I@KK֞%ByUƢl{g @f͋|޳{W 3s)Uݮ_?.IMeϲW8zH[VLLgaԩd='|r|d6-YM~BX A!NB>`s8NUGÞҁ7xD 8uXyb_R[UU:mc*=UDL%bBѠA>Z5xRR/qr]s+WXv}=ևArIA" IX@0fy8v\z]GK0$J)tfwcXH1`$:C(ju.a `pn?~ `cwH  H APH&[P"++޺,z[*?|2-.sdy|cӟ2-@M5'SKP| oU&ɉkwbuW^,ݝTSh_vxTօĹ`R\>X&# \f2k7 \/qg7JBvErIWvw:=IQS-J*  TD@AB,섪Ś&PtD!ʈ>X M6$fWLVIk|5 %k;1lvyݱyJݝCsi]*w  UA! ;!x/h Z!CM 'ET, MpYP*xU Vw&inuk 3 ;VbmPɓ5w  BF$AA Nʘ)S7jj?̀PSQ%tL66a NTݦ5L)35\# 7\(@Ht,:aVw3 Mh;7VR #vw9v " P} B vBUǁ^Kh`M((#%c˩].}^Tsr I(_u@JIDԹtD<S&(=$r{mQ=EcN{_wհ-$N!w #iּEvb!oYg NH;b '@AB,섪[ePI/fX.jM=ҪKxP{ޙGUUT(N[܃ZKTjjUU \U@P"ZM[XK%֍ԨY~ [2R H( ]2|$}yɧ=`k>\`,RDZYcZ*ӿdgw75Jr%~K$4=h/=(:t`w{#2 H>,ӟذa3Ϭ9VXXC=ɓy7ڵ+cƌ_~qϘ1mrYgB !hH@By IDAT!͙3]+ȣ%"hI׆_0*WS{؀JRmp|)Ca6tD=(#0fG)GbO$/(ݍt+Ĥ,XdtޤaxezR^~?N*+x ˹;ر#^{-ׯsΩ)3k,ƍ>ÓO>ɍ7X# -XSrwӾ}{>]!M HB!DBv%2-&.͔`B\,ؒdwکĂq13"ϋ[(䍖|vi$7_ \]1}|#",,d,b)gQ#QM +NduX$}y.ݝfa1{ {Dԇ/+z;v/Ӟ3qD|Izq4hPCռ?sj>Ϙ1nx<B!;B&,$,mU#zIl/OW_xw 1@gy#C%R-3(X}/@ӕF[톬T_|E)h%ua=`i5?cJK??\h4B䐀$B4!da''*LI\ ."4-ŀ ؟/"N6˦E@2m lr p g" NVE ہZTNF2yduW.aKkhv-_F"7y~طo2ݻwgt޽NmRUU=MB&$! ! ;-tңڢ zsq8궝%dg&TD|$0A \o#Pr/%VGEn`nU?o._$->~fT_W#Ŭ$nimHD2,FBwȉ3gx衇xҖ:t(^z)cƌaM69ur7s=yf@Bd$BJY"M&(k>J\]bp,!eVn bXbQW?F] V [l%k`Z~ҵ[W}VodŊsL|FȢaÆѡCF~ȦMu]wGzj*:tYgEii.B$!BVL\yovy@Q `KXf˞qp83 B{b a&,ZUzApSޘ`Wn D#lƖ9di qDO^ՋI6[ f9KxN~%D#X;֛u / /Lzlٲeߟ=G!H@B!hE*L㸁9Q[xc Y)sԶ,*lĴ 6ےFe*0?~?ԑ]BJduW-yD#{~@li,H h$)R!1$BJb `n^YNݗc +]{a1(,$.@RF|T0 X a|EXDQޮOe*: J*kڨ9v-PxL/&Zݵ8Q|jG"%B4W"^o*y5]IwQB!Ķ$'iU1!BfJnWauI|TQ*RVʲb+]ko$&G~b L {ȫIsmҢUmr՝ڵfbQ^ ⣏5aEDyvwXUzB* ZB!ۚg*l !B4C~ \[>AeL=[$iyO`krd[zaz`#8˭Ɗ`B1ߤ#hl- ؖT-]{dgM9ڸY︽UZ𯄏PvwecB!Y H~fJ!E 8bˇQ>)ݒ_F ۽e">y,n/2,C㱅 7)}&X}`xh\Vwkےfx A)G^r| 5Σvwr )U!Bl+I!k C9p&=CDߩ"jj$ɣ %ċOn_"~UŖ8+vB\`(9>\RhTHMpϝlu7G`Q.ɩƊLfkw77tNGB!DBB!D ߪh(>[^]==)Dbl w&$F3mlC} \ DL,SEn/Q ;!Xߜ=z!~pѲ KK{r奩#QH6* %]]$Wob>f:oQG̈́ W\y1m .|~ط&N!DDB!D+/Ӄ ")ޗ`bQ%&&O4UXйe->īAA;'WzfiKTn¢C]."Q5AT'@E]]Z"Heu7 )[mjДť0~$E>Z F J4{֮]}'2t0^x/5+*ʤI2!:t۵N !huH@B!h%cЯ"|1MH8V7>J6g)T\iX{3]ߣIP*ὃ$obvt%O[asE"\ex6$5Gb(Ur`cKG"(bl@\"*@rG-MrǞMI[1% י<0WaDcfǻLOO|6oԔSVIF`. !5 pVfbS*܄ HC7emIm S?l'ǻD~z{8)wj<^{5MBVI_If`ADB0 *l?KbWnfH,Nn+aXݍ,Aڅ^OIm켠 8[_4AV eKЃҽ\y͵|~=FU>kf饗qJS(0f_]wcŧ93˧|6{dOݥKW]8!ۍi3 yrLIT8+&hU9>y >Q,`UB(P|L\Y^fx-[ĉG`v_}s~uѩS'MBVI@4'*&"#5mj2W9?C!Dk'YM⅜Hmo+‚;^J!u4]wсB)|PDL%29~%f̺j &fU\0*q],ǜb"`>Wgn+tuOmNؒmu$1gS3qZ=P|o&EEj҄BJda'Y]AvBl;B`wYHE1ꯘ\BO^bM#yHȧ^@9]Ie+|UsEy]sflTr"ܟx2lE]زmr6v`BfK(]Vٖvg3utP{*{Ѓ :kN8!,BlO]K_p͇{}y=,h97|RXLI鍩Ask%qe eltKsJI8 ` Abwp ;ɛ˶˧"hxbQznz%7\K9ٖHmܾ'suiE+f%yfz^ X'TƍfBւr !Br|lj5B]4ʉL7:3]R{Q6SiX_~O%#I!uKEXL x8p}`\̧-וTS>rvUL–ꊸ2W [O Ar tT~t(l$MQLWO&j x` !/^$@`u7= |eݹTW¢HK'B!$kKnI0.]%}rJvu:>$~W!%K bǘSlsP=|M*: CbvhHᮊQIDsծ1sb",>$m5cX {_:tmTr?pyk>4> !Bl+*1ÿË1{.]Kg[4-Xâ B\.u Q(F|~Гg\>(]}%*w,rTRu}:@*kN@pe">SPƦE |]֛C6>OӥB!oY}cX9= t9|q9ؤm/Q:! V[4h o:$B!De:P ot <>hc mݾp+Cs1J1U@R=.^|jGw--L HlfjH^@h!B! 'iⶺ̼y޴mۖS3?t9s >,ϧoߓe]o.9;riqc瞣d:tQ#B!Dc!~R;*JsGRL)MrN(H:Da"Iز.̑@_L镥GUqoHW䣌[ߵ Gb U>SG`QGy>B8t=nD{HeTΟ[3r 8l%G~y!@Kٳø㯼/ vm2}.,,Lե2`6SN;,gΚlܸ?_//?X~G,Bh\z5uQM:uJy\|>m۶9r!Y՛L$g}Ǝ;Zv- !B46QѧM1&`$",PU bɿkH-3@^?Ţ{^P7&~sHGh0&ތue6w_MX:滲J͟%آn2*I7IѼ~aA)}N&υ|$ {ڵkoD l֬&e˖5~ڎr7֚\Rcϼy8)(w})NK|7x BvܦD"t'5QL+W|]taΜr>[ǎ7[veJ}Y}B!hl*1'lH[K9^XධmH,z(ENjAjG/} <>'xlָc9bUΗI-?|Bcs2 蠘|T;osۄ~ۿ)p?L* &0%b6Q.]$og磐)N:1jHvi=S]̝;O?ڋ?y!gd…WXX-B^9s&g}6pof^XGy晵yg6l]tq>.29c 9r_aa!6lw)_(?]ɢ>3c ?oo+sI+uYz0!?QiӦ Vs~r_y]6mcMߩ1?ϦM6KA\fz9[z*ӦOoᮻɺoB!ۂRLHfWEج-Ĝtw1g+{~✨+Y t_v}]:v>*9`?`PoI]O',Gna)bc6|NC,:\ٙ^BT$ JZ%ZBzjf͚Ÿqxw+>k׮L6x#-[kg ?Sزe8cxᇳn߳tR>S<,=ٺU!D-]@۷/r37v<}םYuwq~G :)eUob?g 7\ϳas'??? !Blo"؂aW3`^L Xt$,?O5E $;8ܫNLV Tĕ&$ >Qp4Ey|RМZGcфU"Hy((m sT4}Bp2b롇⠃C{|'Y{פAǕɔ>{ QGE^^nO'2~xzI$aܸqL<ƍٰa_}UҺKxVԷٲuV.Q2ϋ32ǂasUn<Ҍ=BE&%bϯT룋pm ! <0!h(hM̙L}d6ksÆ o~}֭IFݙ={6ݻwOz|﷿39sph[lx'?~|̟?gMnO*f=ّ)Ȟ;׌w]*_{~&E!-ӁknŬU'1e2[SL` 7ҕu[E>L a5兣dUq:ÔQڮ&a5 xɵSJm[0B4o6Bh̞]ә:a:l#AG<|7 6lgϞRʥ^o͛S?ne_;v&^z%z)ƍWO\P^ \SguBZ)yZdu !DQRRR7mܨIcaޅ*ɹX 1/aQEs1x3wFK`K1zv{>aQKծ$}_L+UP,xBb9nI(mvuwtV}BVj;/] q,2Kؼy3= wN_ХkZ3\-ѣ=z4p#F`ܹ9Ց,J'Wk᭷ޢ[nk 3ÆѡCF~ȦMu]j}裏n1Zj$p+f+X玗`M0lW` #|S$ 5 plK1)Q4lh\iu 9}Ie.{<@{ȥ܅^ȅ^+ .>+XC?Y/x^we16?v[ ̤IBԢ9+^#9B!Ķ/WdYʢ@*30ޮX⣈QEX^p-/veľs;"*^Y[!n)38>Ob+„ˁbsbWςP=Xŋ+%xs};GR`;V3Mča"e^xܫshh$rs̒]jHQ7w>TnmD]QE pΚnk-,G[1R!B$B #ChPEdE݋7# D"9Bㅧ_?rMKա L*l0'5ʝ{;VE~\1jG t%g"Կp~0QLJutp8fwIr #!; GġTE#B. !B$B‰avo1LB`VAj;:ok_6`L1&L ]Eb2` 8HvޅŗjLp _/$5н>O]X|]|7}01',~UU3~Jmsne!-GTEpGH0 aVtX`|17ʄbЋ T n5w'?w t oIn:(DQj_F`BQX8J.B!$!BVD2f?<ɱ`-1)3/XG4A6Ş(f%&}c uƽ_ʕ`BN[xGep*L6ZJF1_EcUyLKx8tBۦPp4B!H@B!h%x&Lvt ĥEI >̕_*dqD0(& <ꏷ[ |DG+vsP\E[!%†:FaOa"[oLV1wW 0$F%,J&67ϕu0\Qٗ5kС}{:h&LOt>.B&5B! \F [ 8W"XTM띡mo-#`n\%I_;ݛ ]]`et"q :]afa9B!ZB!ZbD $)=L< g*& "kz] oV[ =@[u:cL1(&-`E]ݞg'j \*_Z [Áܼ!jǯ"*ps˕6o7@Ɠ"r &x(e6b_sBdSN9o]B!DkIZuc|viG9XxtUWM$z衼{իW7x#<}ٛ^{-W_}IBB &8% \-/r?aF)fOWMm˶1Dw^U %F5Țxk\JϷ.wN&&E1ag}Q>@ JZY-~1D2@Ww&LpsEXh3Cs;(&0ZXڨ-D"U$eYՅouϻ5BBBi9KƏر2b< ]5!pswQ^>'N@3穚B!Z'QL U31/;0#|ޟp]^p &\<@obދ. Pد')#+DVxŬbXT@_,`v>&]t p!ȫu+.D IQ x9tm)bjI44š0G^W^!r{eĈu>.Bt]+xuńHz꩸$!hxeZh_}X8&ģPY/Deㅣ\%"@̪8o\ "%pY "]~!TnGjyZq}I`G~cB:ɝ#J]n2̇#!' mS NKX#!ŒeJ q!5,r mݺm{ׯ]tsG}^x!fǎ;ұ㎔ }oo wngܸ(,ܝ}ݏ{Nwh|ߧ[n,ZO>Kkѭ[7g=H/R}^v-\p!ݺJϞ97!D #*Sa, m^`EӴ~ PepuvtT(JE[Huu&n">xfqr1!fm73/̍%"\ Rͣk#}C }Et 3sB!DkI@qGܹ3g}6wuWͱ^z _矷?/_^N8Ν;tΈ#ԩS_5.]F4Y8 N}9s0lذu~egI6l?uA7+;oUGa~/sFaKaJ2GcDjltac^G]3xTOs!0ñ誏\'!HU0,QBњhW_}ؽ˯~u?8>N<.N;9H$dh*x̟.]cǎ=HFrV`ٷd] !D0])e*,[1 L,>c0q$Esj,gG*bׯj׏2a˻dĝCuq"VQ۪ص;VbĮж:fhk k<>kUz8 `6Brŧ:.B&6׎3G}ڴi9B4WoqI'Q^^5׌dƍr)uiӆ͛7i&Z#WO?SuP :QL IX0a 䢈f1!d1pq&}I>>oR,y;_I-~umtum"d]1'i8,cY̝[JHÀHud#ya%k.\ȼyj?2} xq>`N<:W^.BlG0a!Jrq7&bIX(y39TvQB@O2ޕ me(TJ"z+ѮB%#q-J*7I }ф&d(&-vBLc/e#}0an.& mY)B!Mv 8sishnjM]~~>Zmc]wK/Z.."~TN8x}Q]!haG*[ XdK36|!B*Dh[π>d%w@P ;|DרC$ἒPBM`iA\ƻz1uxts>@Xp RI-%~Bm !B! M@J3h  TyILh.[;~z\SNvfL6c>X-T`Kc] ́?ħn#1܈Ű^<1f $ !B!h\j B!Z6EXN9v|O%AD3]3y|Q>DY0|C`ɘhTEU`߀oU)KQ;?r(c119,2 (WnNAn,3_o]"0K "]oWY  ݎTdB!Bև$!BH n"Z-O"&=G$uVa, qNj.~nX^p>)t]x2ƍ&YWG)&VU3i(4$J%JEC勁=^ْ,S \ `7ơyB!B!5!B',I '>3"cśx<\A䑧7&EМ B` w+ӛ Gxᨈ ک{5+׀4 疺Dݜ&}.&R!x4y80nJ2b[ !D d}KnYHAT}a}ݏ.]^Q.',[,7l=իs;>ku `"yyoh&M=`Soۻ-muͷˆd׶h_Ȅ"B!Z> *„ T*[I'( K/DK +CF9Ot;` :G«>3r[7XޞܱnKؕ H?,;e}Q"o47QLT9 )Epue qQWGj L6/9hYLX*!X&C!?իM6pne]G"l*T-#>vX+/Eԩ?_)~ y|ʅ6 &O?ѣ+s+uk>_3j64v~8PyEo?\{-7Â#AWO/v=<Jnfu?3~ߤIpU tߏ<ӧüy ~iuWx~>#WL_If&tw`B;c9|%XT%&x˺(YTI`?,p!cBV&J}L&/U=ぽk&J`XG'%-`*&Es\o &a^~@S4BȬ^˖.{]kfz ~|[K/~P2`@.]p3qvҵ־n_ڧZj;^A Uo,b+p$ b__hyz9B!DˠfBTLh~Ec[r)r]w ZOsYh߾=۷g֬Y5+++9ؚV.u6CMf^mץfiܹ3 bժUz !G*314z}zcBIQB9oeÄ$zKb,' r7 ZE?'m>y464eX}n$YLƄ\\{ ҽ¬Rts r6mr}qD[֯__s/gj7JC?G-Is<[^MAXXO%@X/*L0<4yxUՇ߀!&p[ ZMp9"ʐ`MP+(""Ԋh m(e OJD 2 2wὶ2ys={=s[+;Lf^S,DWwOlsE&NuL5ŏTREQ<ԫ߀&MR܅5k"}zHoةFl|8?p8Yreu=m۶eÆ ?9nV׮]7n{aȐ!}em>(ݺu+ۯ-b'|#Su(/|Wlۺ/\EV oX0A_~}ĶC2|>c.1Ӈ={VW_zEkժߣGx}qٶuK86/5kt~G' 6tv8N gӦM8ٹsg@{Ezٷo_8۷o{]ƍ7:8֭8 {M6΍7,Xٽ{w@[&M~)u{7F֭sq4lذB{ 7/Zvm;NbbČCs;SN m۶VAF;87ovN=Ԩ뉴6m8:ur~z8p@0y˻hp^~e.s:^Ŋ5kq4j(D3ڳw Rvjժ9rӫW/g׮]q[=s+;wv-q5Zdp|g >e[hd>gfڃח bp'7ڒ|iQ4 9JpI6GYKZboח!VziC=a-٧˜? UU[9I5jm˜9ݘ">?ӣG';;ۙ;wnı*󝜜;t̙v7nt:tद:۷/W{N4i :i޼k9]tq>l?A9:ur:v<ξ}x7^z9wqGD_&M7|ӹ馛M:Zrz뭐1x -Wf\sMM6uڵk,_ٳ=8c=̟??b{ǎE9;//vV~Y_ }g.sF ,`˖-]6b~iڶŊc1=~88_)/Ϧ(-^-[Mie[W<^H8ҥK,F ( Q̘1 :q1w\fΜoذa 4uQXXXMVtlgʔ)<\s5<3elْٳgsg0f̘1>c~iƎ?Oroٌ9}Osatz>mEEEeg\y-[ߗ Us¾}ycgS9±|OkXW_eȐ! 2R1?;vQFq1ژўn6oy~V(G&&!F8a;"==Z z30ED1ͦ+A.VƙC#F/eE̞rq ˁfIWC 8K/ĹKRR]vY租~J-~缪PN7|w}*KߺuOk{:ȕ[̙TcJ H> cƌaO|ۗGyO۶m>}:gܹv*T+Wr-pW0a„ر#/PˏZl̙39W^ofѢE8pΟga޽tľcǎٳ#GƽH߿kDfϞ"^Ts #vڱrJ8@~~>_D[?Ȉ#o91k֬q={6wq3f̈kX>11ݻb >ӲիWgbge޽L:u_ٯhg(r䑆 t ƪYhUq} @D+p\Ja1a'GYϬ3H=HVS !h Tl^2c3ׁ|;*+>yEQciӦs!23?9t(Czul޼9l}bڵ\peΞ;?uꫣ[ z:ts5&$$qO?=p㍟wpSʮ˖-9ӪU+7oX/%N;`j֬YGr\QH8-rӝDNs^xᅀM69W_}p Ζ-[~O3gt~:wƌ8~i۶s;SN=j -]iѢSZ>[nuڶm$&&:-[t>裘1s:zs 7ԼFybuV窫r4iL6ͩVZ\W_,Zᬁtg:_}UdUl޼ٹDsu⋰9tPSRR^x!`h4GEwmm,XiӦsc>zhVZNǎ źƌGmxUUG@>|Ϥ05x㨿gj,4f:C<}m ck L߃+ZRZI8fsvP?o J2ìŮOvY39cc~c=CcW^qo!m QXH|7E]lذBk+z*p5/o9n)⺿K;~js9ԻGj:Ϝ7:{-k'<UQ +޶UV9 (۶ms=\-w5>g| l7 nvnF/^UW]u{۶muY+E)/ ݷkv{ ƛ;q疬s&Rʇ}b""Uq.3 .|snPqzi3[{놸wA:m\y%Ü_t>͌aR1Xao8 O:#Up </KMMz-Ro&Nȸq8x &L ???oNx˽^z7xÇsgE*jsFz3ШQ#z /Hii)>hY{>}pš IDATA|Ay_};ףGÅ^xXboѢ ZbL8_x<{x _9,YK/ɓ|Re:dv.rki[9ACԭ[)SpW?+B(( DDbMAWd"rmg#ˆ2MzJ^!#Xa2a֓66m^n*RO߬0@1]/TyjmaڒMM ~6E_yf4ϜO1} H*)(Ju=@ĒP$ZFx!6\q[(8spC<ؒ[/[(KM zr)'FوhY{"F)n">ם"a/FRMuW:[w*/p+o)((_TH@ZxF01VEQXc9" X.?n:;o+lnʵ4tq8ͬcIYj^#9ʾŎ1\ | E O߽%fKQHQEQEQE*adcEQ}T  N8HCqú+r3F"tA?"<,dYڗ)ƭ(hG\H3}y?>0Ú@9(PQk/&/qNH7&@]RY@ (1ęg۷T\z)Gk֬^!lۺE(h ;EQEQcHBC"l\y+y|e>W ;z JE;@Sr<lx+HJ^tܚKs%aR$}]J>60m~ rvpk&e *AEQEQBعs'&N$' }' F("((rcӵKMfEdD<@"Kn3nhEmWTOYK?bs)"tq*vo >[Ciuzo&0x-)H ^t V!Ⓗ7Ud֖yUEQԩS71O((PIQEQ&V',~DtԖV @E0rsgÀ_! e)"te֔mWx9 HE1%Xk38{W\uflW0m׎O֥5ъ{yx)?'l(rz4oAz$&&Ү];}f$j`)(%* )(X!ƾZ`ôٴuy).4"U"Χ&{@Ėd]jOJMqm0g.&R`;N7}Hv)Y铌<)b/JGm Bl(14(ǏO\ݻw< ϫKIQE9>ԢE ͛/9sԩs̡C %%x|#!!q%113fYEQEQvqD\?(\gDED\/xn~`y= XiE@}"yp ܅)#kt9"Xg "Pl35fcd]F~|.y_+yFM%fRbC5S*4EQXcڴ:t,wF^N:$& (rR2gffo{9sxo&۷?r1cwqghWEQE9H!\!)uKHz7EYlz"Dg ̱ wCj$5Xc)M- t[}Y\D 'd[!+ LBDYS'S+9=!{ֵR8TY4N2"zJSGT$Lt" sKܣb3)"({,un)UE)@RE93ӧ3y+$ը޽{yWHOOנ)(-r ]p^5kpAڷo8]/֭[uVڴiCRRmڴa۶mec&$$sѲeː~rP߿?`xREQE9^FݩG#$?~mB"#)5>D؄8vKq@A[WiI^g]an=1d~dBY7Tvu)(JtzsoMRO^ԫ wO hl}!CkEQJ9h۶- .},Xoo… Ƞzu8[nyk1p@^~qSRRXdI\&L`ƍ?Jn.EQEQcd5q^Wo"%I!(L_JƭIWIG7@!)7%^mDDI4sAp\-VT$Le#(qMS (Uv:HڵCۀСC5n#11:oIr*W^aƌ7<((ʱL0I1*xxPqLXGģֈ]ۼG{)#[E˩?nQiK)~#g5Er(̚>9RӒ0e!Phd5ur/ӡ(((rpBe+ׯdҥ/gϞO[vͶmۨ]65k Hap'|^`[laڵ4mڴJ<((ʱ֏Tٯ3[ku) |:5?N+!h@ NKqS=Cu 3GD@J#|"?Rhu1XCdWS 3օeQs>8~Y&NӀ(ߠ?(((JTZ@^:iiiqwf͚e/rzo~jժUvMݺuٵkuaԭ[7*ӧOgȐ!ZٳILL;((qM6"l!N]V‹ O=4>DGxW4PQ$ T ?,`sIW\s+B'U;w)f_1EQEQEQcbL:vbCz<۶mӹ뮻;wnYݤH$&&ҽ{w{9>S?5{lf̘wZQEQdRDXJZ?iHj;p]+aF͸:L2"^yds ΙInD+4.WXɯD:@RVn+$9p5#gM3}Kږ?}F4Q+G(((Jy礓N*di۶-IIIrssڵ+> W_}5?bQZ5yy䑲JHHH({Ȍ3;((qqȬ">Ǎ!…WxHFks6ݚt~BSq28Z\BD\ v |mƱ)@3D@b [SK"Ҥσ{5ui/yH`A4h%|&Ȉ2%\dJ(((IH'x"?CڵkgϞ 6dѢEar'믿믿>:'((q+F\uQ(A/(dӹYQ3N<3XlZ5{`u@g޷FExXmZf'j>e5)xQ4ZKJQEQEQEQ EQEQ 4uVl:_ 7m\7~zs,DR-F@=a\N1"Tox!KyFDbϞ=r)\E\ |)ԫi0|8|58W]'m p8?Tok۶~lN& \L۶W#EQEQChkp]<6nQ:w‘o I?+L Q%D氂QgqbϺBs<` n%~I8kKw/CDXT zX*BQE((.|;wdĉb]naO=iSIJJ*.O8(R0e Azry-4w.<\] '@x(G4((~D<*u!!xQD&A3 氢P."Xfbڲ3 8y7cy =eyxЬɦ3?Ǭ!׳_<1膤ln1k֚_hڊw֊(7ua@Z2|\23;[<χ{-_spţHJN!˜9}0cFӧCVr}B4o~͛Mxۖ$OHp[޽+D쯿]S$>k#Q6Wص ԩ9Ǎ[R\|1|Ih|. U֭nC7ᥗС]?vRSIy?vl*)ч:EQEQCK\8k^/ߙ6.Q#n|"D:P)ۜ܍97: Јztyএ8hi!i=q 613.X$T N:!Bf ęT^Q٧uQEC]JT(rz4o"HEׯ_K+(_0)S%UX߾Щ/'zO?AϞnϊ(t%PF9>XqK˷wljOχ<[ͩNnYn]\ 䔿}8cϚp" x30i8օ^2r$" D^~|P,bx޽a߷OݻCM?V{47EϗϩU3~0' O<A8@j ]yeh *;ِe%Νڵ圗WUp7U[g>Ͼ ̑\u[AkPш NQ ߀Af#)lfv|'v#Mg/HXk@RE96m:"+33|ڵoyoQj⥗&qټQ;tH}a)%%'%:}_o8c.Y"ľ}UL6U[`'J֭acG:&N׸q0hP2l$){Om§WvٳaZxܴU g^_:ϊRm=,ԾjL(CH/f4Ɗ(N|x '5Hz6/~$uZKDLTg6ı.p9_ˋ@+ $U^(1ېw^҂>4L{kK97SL(0} VFRK13EQE93ӧ3y+$>߻cƌqF袋b;iD+o_xa8tKϽ[oA'"GݥFUWENcעOqN"\#zlcuו9'cGqc?^D#$''P 5sυU((L IDATΝu,[!C>A}!5JGGr4P!^zȶm4ƊE(B)3¼Ouɔq,M1,D` ' %#v"vH"8@]96mpE+3c.u|@&b6c%#"?5|k/e!Dkj;ٴ&K1b>?#a(r{8x MRd۶n){KK.|a^x!y'DsVI#ֺuoYR|v|-<(B{ŷ~6Rz58^=e>}U5>Xӱc輱Ug)Bcy9m?hA$EQEQ%K-#$eZ09eƱN%Bu]tE50B~Dl>/CMYf? ft3~#$'DX_J s/EQEQEQp((RFuX{N{4ݏmQ8lВgJì%q~k5GXhVΊBb @mV )h.<㔘!"ϗH'g 5y'P KíeCP%룮(((ĉ H(( :t%(#"E]‹D:AɈpR_:!{Cm7+6כ.Ϧ+F\H2Yi0˱H+ҽΧHu2qiOoVxS*BFOQEo_{\@f¶:p͛ǎի9墋h|4EQE$EQEQb\GOѬC1,OcP$K " ;@Cf>gfM>ڋ+"}hZAHvވ'ߜ$YgQك=hVWʦ, #p]_(rsYe$ը%^ѹ_ ko>:wLSSSYls| 2X1(/ H(( iPaEPG[h"4s^qĴF+C=}f p?6 d93h[sȊLV(KZ <{ im~=Fĭ qZq`mSQJ)pREQ%V-ZDl뭷8iS>E̱XԖ-c?\Θ1BFE͚58p {[o 7l0 _LBBB8+Jjjjׯo@]Ts(/ H((JY|!TNdYBSq66\ ;`^gK(Xpj]KwD#S`( 7|6""'<"G #W1b\QJQEQ?~<}؞;z ύ}Ĭwĉ̜9&Eȑ#ҥKԥK.䒈j(q E|[Y e)(* )(( чONawe>.UQD$EQEQ,d!Dh8xr!'"D}^Ǐ'^WN2Hg0lAj R`?uhe!"e}2M? x|xJFIbN;D@ <+a%0_yU7(2gN!ӧOgWHQ#lŋsI'}~irrr{>|8g}6իW5jTnݺѭ[>Na0b/f>?[RQEEPIQEQEuӔ bRD`^LL2m`7UҀӷ>aʮ(b((%qLrpSY&V"Hy :`Ra0cD_g򌙃+PQ8kLLV!} W)[fR0\oRiWEQc͛63wnabEcqwrwFlKp( H((JɈxp9]J5HcTxV@ 7IuhJ>D\FbѸEQ}ŞǁC&6ݯ1.qTsi+,)_EO(((х H((J~yI<}6X(ŇlDݼX!"Rt`&N a TBhf<"eNԲ}&>Sp]GosuU@jS5EQEQEQ"((%MC [z]<@ D|ísm iA3DDo&I9YͼubQbNZJ>l"jA**1XoR:EQEQE9QIQEQE G#K8ePqú2q+XGR[3p"<kT6ফ 3mTJ6qܚE(|ϜGՅ7 (((TEQEQth,rX_ $M[25m6HCĖb[~ ؎Rg)%N9(f>/jĞdzdk*gQEQEQEQ H۶mf4Ɗ(th"g6{sӖ+/pKP0kbSfցs⎂b!NgMHj=?ή2Ρd`yͣjR)aPEQEQ帣BUW];,^Xc(qOQ# o:4p9m&4P -l긚߀qq5C ~+p+^*!0dSz%m ".q3m0:R񐌸Ґ:HɈ^\Sqɨܡ((8߲}vjK/e\|͚ݷG}+WQZ5xjPN8Mzjʿ/~GN?t>Ð~_TG) 7(NQEQEuXe9oSpV)5̀;4mH*8]A,7<DZj{H7m%HMqSMB7iK[)@&|> hc`ƬmƩé3D[EQ+vɄw)kK.as0sLƌyGx,;;=zG:u l5;Qm(4((J,qnsnw;"tGğe82ՌQd"M7%#LDLm^u#5=o4+ZM X7s{7G̐AG#?xgo&>1;f2sUEQԩSjʀ˗/}eo&>Y ЫW/zAaaaH{jj*6mcǎzt! 6Ю]Qjjj٫}o(;߬Y3n&>쳸gqq2͝:u EQ ԁ((Ĥ:ҐE6M݅pzEpdS @Dcu5y3םíl=^4s=<c#xqE%?n%g}V̲k7 HdaH\&%ZIQXeoiޢEo<qA N۶m}̘1BFE͚58p {[o 7l0 _LBBB8 D^ϧaÆaװ~)芊ܹ^xz(|c/d kA8?(At?SEQ)&P 9$Zj^ >5", 3a|"4xi0WPuo \g`ǺzJ*R'=sFx>(R!ƏO>ճ'K,ߝ@nஞ=}L83gҸqcFI.]B.]p%D'R]wO^xǸK+:uЯ_?&NXe+Wݤg Ü9sBQ%*VX?Oݺu0`+kOHH8*Čý΍7ҨQr_W5UFpREQELCҩY%Z: 4bT2 a/d7[`|5V715RpR*6V"]wQXhWEQ%6ӦMСCdefWسg/_T^G<ͤI9bvZ.s'W_uhiii׏ӥK׷e&MҥK)--СCULF6}EQҺuhӦ cƌaΜ9[]RZ5{Tp\{.[lѧNQEQc,DdW0u%8M]8 . TB[ɾO7n0%x4Dh\oD5 #i"ݳf:!hAh:@EQEQ\}B&mrHɟ4ڵk0fhrz:F1gΜ ryScǎ /( 9ݺuoaÆ>Ja7 xͼ*(qSҧOn6NDL` &Kg\ϼl#%W*`,ۙ|h*(JX)dԩL I5jq-*{93=ps6Ν;ϧI&aۛ4i’%KBw4hЀ͛}E\kׯ{OD@JN:(JϟOgk?#$)J4!AѢ9Or{އ=ߵv5+kР/_L֭UVƦ}Axzzorssc…~f/O/UgilؾL4d]veԨQTT֭mׯ_ի޽{Yl/_̙3 N:se<Ì5͛9`pܹszd-SYK;ИҦ[cV@##h3#p7?Jє=7GZL?@AiO%0R+IlJ?mߢqؙnA)y7CVW@V82BtKuv-ʒŋry׏~٬7q~߾}NFرâUVjʬxwJrI>}R?4Y@rsss)=644jժQ`A:vHhhhjݑ#Gڵ+^^^ۗ˗?)BΝILLtSNwބ9e̎a^DDD$'0.\ub0+lq;̝WRLYB`lcXTL٦qqU0*3c؞&4-iM%P=Δ}LmnN\|M'wv HrJ6l H*TԩST6}||<7nW^GEEQPfuK,[~DV\9~bbb2v72DDDDl(*AZLRݔҗai*F4nςPi>V1eb|K@!7 !uw9)-6_G2Pi<08-l';%H-[4[/dΜ9V/Q $''LRRZi۶mqg˖-OttEYTTKΖsMk}*{=)x$"""9) ɴQz]H~G1iEO߀)?_><i#ZOR-0>%H:p,HJ91a}=#gDDDDD^/ IDATDD*^z{5kpMѣ8q۴iÑ#GHJJ"(('|2ȑ#tޝ&M`PP!6nȍ7x7,~mYj:uʖզ\10d i:MZ`W26 "mʹWp~J;Wp$`Ly<1'ݴ+@=)z Rtso+Xx`yJ{]R Ak\I-z3{l/N׮]4i=z9s?~< f޼y,[,nӇʕ+SJvZzIٲeZE}ٲe嫯_ϖզm6u;W9.Rd1. 5 .R#'c ȘTӷN)0;)8]\FL`LgZ. \e @&m$R髈R0;i֬Y>W_}euݻӽ{灁Vs$$$>6lٶcǎeر#}gM{}ټys]8eHnrcݠ9XX| F0mEO҂@ 8 < X{nJL>q)0e!l/Z,@i{Q(ӸCD$+!=le)HDDDrXҦ wa]0am2҆л.ʹF)h0h~>[9ן12N96uDDDU*U?.]qY}TT{?,5jbypp#AA\,""=Hr$''e)x$"""P!o̝plus .KFɞLG0Ȼ%9H""yʕ+,Xf1r$jr5Rl9ZW>G'8c)٠O?mݕnFE]2%JXm޽V3\)ןG 9| Тޕ+&A|NXvtuNDDDr.҂<쟌ӹiScA)e邱P8 Lr܌̴{S)c([:ӮVX1ƏǢ+3X'?cQ9>t$(73$[{5f w_OqiӨرE;ѿFoLΔϑ Xt@\gׯC!)HDDDrSɝ'- ieg:E#12`Il:Nڴv_ Wr6cCD۷KJ3NIW7d&pN8ٮwğÇ͛y=s _A(TȬn{s c|j̪GAqb=pɒԛ8O=={v0ڹS$Dk H ZBLX?h'iY< HN`):Bxc^MiÑAuI~Nʾ1KںKίir0G[lojInwel3ED$?>F4+ ^1ZGiiʖ ||ԡưaV5gwp2-^Lrr2{ZQ_ez ktc @lc (Ȗ2C(:Gm3mׅׅ`d:2a 1͞Ijr@'l+F@+,yz!)Ħ}L_udk}6]:w6+/WVL}~>6\!%bݬ<.:'#)qL<""9H""""rǤ*2r2Nf4D2է:YS#si1L:/F;+I 4]`.3lIn.)wbϦ! +eP֬YCpr<=s}WǘPDDr!/ȭ[(Z{Gkp>zI֬YMҥsy.Ze8܊`g ~lL@zlt~:k=zp| X""y"8vPyE`DZQ$FҧN;8ᘯdR"Q#ݔ@a ClbJcuYEDDr[\y^vM@f4kp"elRu~un'kΜ] ]To?br^I)TM #m8g<^H4s)eҲŁ%4 N9N.Q4""""r "-"Fh$cZ ycaL7#Xcͣx, xU@}.g>b C@2orrPDDDrӴo)G OyT8dl:t/J ϰo82P1bj`d+]ҥ<,[2>LVϖe%x$'' v<"0#J?%\,..VFS5BgXc&%0ZCd=ҦtI[KDDDDD$rٳf\|o+V0o~ydfϞ͵k޽;򊮦HW#bm͊A"k%o1*>Z`{]%?FLt?A/0~;aѢ̙Ι o5p""/e9ƭ[nsv튗}˩u[n]v*TݻsA}'NH…ܹ3塡TV ұcGBCCu5EDDDB]ҕE`d||2e2Xi/؀|Zd㘃I8*p'a$Ɣ{Ck QPD$oI&x{hb>>|VKmꫯtEDDD$ycLXf_1EGY_NHF|}G ΛoG>`[;6n[fСT^u{Ɍ37onH""c< ,rZ;GS뉈HUf-Ο?Oi߾ 3׿Zq1b8͚5!CdԨQ:u$J,Ixs5jDLL cƌӓN:nEDSIDDDD$oZGZ@DD$o9tmZnM֭]j_~j]ddò6mЦMm nnn$Xa}$""""""_(e\JDDDD<DDDDDD$+!@3 Lwi0+ 5mT#'""""""""JժCѢEi֬o:? }7m":LDD5Ma'""""""""Lj<Ə`V?MJrrKDD=DDDDDDDD$_I&x{{le˖)DDDDDDDDDr$Μ9ú?TR@|T2}o_]˽}7탿~oj|gsO[@|ӓ&MmXb7GnP EG͛[7h֮5Q#-C52t?w}L·?n\9#PlaΜ;3ckl=г'*vY?0 kCPkatmZ޿?;GcO/qm޿wj׎/'PIDDDDRHɓ'۔*Uv'N#ժ9Fi\*-_K'uVPZŋв% V7d|˖ *@+W?0zwQ;3cﭡqQ}7Er2;g&d4SȾصƌ>Y>}sgt ?vw2`S+?;^@?߼l|xq{_'U}ώ^sψa-RLY[C^ a||nCDDrWʕl *dQV.H6q6hosd"""9\LteهRtIF@|\`U Y~VgM(QvCUVt٢gcӧC?Uă2NFYժik\͚x(\n2?io(Ox>};sg<W#G㪌+W&L0;*TZ5VOoe?'3/C"p:O,[B7)IDDDDRHu~ON6|mV^۷}֬~2W <8y4ERRƇ&.)tUe˂ +߽4QqGHVd[Ve6~wwzr>(,] 7nlMfJ {a09hyN_G}fu|+V(wK?^N~H"""")#"""&  1\v͢~˖pB+cLW7R1¼< +md5VZu)X˗w-`c=8#ߕG]N1ݺAvwqqzQ]'^{ Ə72?ژ.+7Ig?{q}l׍2G{}Q)FK?69VDDDDD2AYH"""Y3|S3ټ9UVi@|ԛgd ,_V6z4j}ZӧEk4?py0nDGaR~;:Gwv{%'͛ƣH׿͍eL5ɮUS.qqeWga2.bŌ޽엒%/[X(.xw횹]w@X,X˘?m`#TݳϚפ1mՀFS&͛oһ!;Q^q?Ӻ1z7~ ۶ݙXbktcƍᩧ?5bdSO=S+52/h.Yѣ{⥗\]y5Í6\y7LP#԰ݽ5<.DU_01C^EDDWX/)de%bŽuqE2)S`SpˉV1ƂeهRtIF@|rss3{*1އX/oi"(Sʖ]c&"" $w23\}$w7N]BH""""e%n)"""Эokf|!! Mw][{ߑȨF:OOhsxCBidG5n FAbeSOAiCgТ@xgj'}_ED${($""""yFƠ ($""?-_K'ulʕx1*V7p|˖?[#9xXsPZŋв% Ilk6 1vG3,ۙ0z n݂ݻK/}ukض ^~ٵ?<DDDDDDDDD2i,##`;oaԫ^^Fٴ ?X_|_S珟U}C=9r~-3&N ߱õ;Ck dɓF(v>q4ϒo\9ǿp΅o5C11p*OO禩2jv濧→'""GH"""""""""6}Zr@/juwRoeŕu""K$L=z_5q0nDG6Op4. 5kBTԼܹ:E+Wv("@ɤ@xyXc ߿I4XhH+1wOÇqcx)O6-w6o/]ZHvH"""""""""Y0|ڴj˺t1UޱHo_׎ [xxg or[;:?u!<\HvRQIDDDDDDDDDDDD($""""""""""""f@3 DDDDDDDDDDDDČH""""wcoDFFϵk׈䧟~bѢEtԉ Ӿ&''[<ݽWR%l٢|jG ?` .;+ 쓓8K.xeq/OΝs nݺԯ_?Su|gȥKPPC """)믿H"ӨQ#FĉYbP///&O̤IyHt1_?~Wr^2/99QF1iҤ~ƍٱ-j~ƌO*UꎴHV߿rJD2DDDD?cƌ(J&""N:QBZlI>}S 2j8oƃ>Hڵ- ]vTP }vm93Fp:vHٲeСE7'OdذaԮ]rO?=okSW>n۶_|}i&wf N:/_/q:uD2AH""""h͚5b;wiӦi0%䗩4e8#))3gΰϭf;8h3w\<<`ԨQtЁUVfؿj;k׮%44ٳgSpa&L@\\=zp'>jƍy뭷R ֭cԩnکΜkƔ)ShԨLYVƷO>1_x2l2۳go&  00ŋӼyswLvʂ hժzM-9@&]vE6l]v)SB QpaW㉎~T\!"""*]5",,ѣ_r>իWkQT)J(ԩSmn[X1?2wkGFFZ}1" N߿Cѷo_ .L^,>_p!soooz-/^rOjլ-[5kIϞ=9w::?HY9Inx]~h|IHHƍ=`_W*U͛H&(IDDD$ e/2oYYRRGѣg|||R=<<8p /UDDD$E]Ys 5k\ŋTX裏ؽ{7Νܾ}fqwww_jUVXA~Xr%O<پgΜAfe bll,Ŋs"\[)3h֬YGG駟`/_Ntt4 6dҤIԨQ㞼~ʕ+GLL];חI…?p"LH""""٤QFeK.ODDoESvk (@@@cvawԨQ7|0;fs[k G[ˮ55'Nd̙T^]v1o<ҥKo>ӧO;ooonܸk#;1 ^:K,a׮]۷mү_{6'N\rwx^_&W\qz2qL H-ʪTp?kS@TTɩc֯_ٳg?Ebb"7owޡ^zN1z!^}UvSz*n"../믿D3=;@ƍ &""8ٻw/e˖#ӓ^zb >̕+WHJJի9r+VгgO<<<@•kڱNTTDFF}v W:Oɿ_Ί뗩zɌ3tQQQSl_#p%?`QhGS9oJDD| %K4c bbbx"ӦMO>.9z}=z=wr|D2Ma'"""M.\`m+WҫW/ks3gθ>kѾgܸqn[:t(ӧOhѢTVjժs9&O̊+rҥKׯŽ?Zb <ADDr5kqy/NX0K4jԈƌ':u"(((~ܹ=~Çi&v/_رc9|0~~~߿ߥ3aÆt}ԬYѣC ӓQFq)(Yz3osBÆ ]̙3yWyWyG5jaaa.a-#˕ 3YƷQF_͓O>i}efmrVz4inbСԩS62?G/-[ЫWl?H~Ò/Z¥J/p?$&&=㫑r<ۮCm5kְuVΞ=<l۶%JߩSxꩧd-3ZP썅=.\v\pc)""9CLȿβ)]$N >.0*t^?/}6/ҽ{wƗڵkǁX}eܸq @m}a̘1.J~7yV\+G$3V~1:wM}q:j֪M!_e?ѹ[":˖MNDDD$,YO?4/̙3,]=zX"aaa.FRHHHsF3<(Ucǎuz{gGcƌyaÆL>˕ gG`d}GAHHLL aaaԮ]k޼y|'lr fv|Dr2DDDD?ŋnWreڵkx";wd)RK.X6!!YfQV->-J&Mزe5-M<7?~<*Uʔ)CΝ9zM6uxqqqL6J*IJ6mΙ3j3Ǝ3 מH~{oӲeKΝ;{xx5蒭}x H6=zͩ)X ͛7gٲe={׷`$&&30eӇw}ILLfӦMV3*VnݺE۶m9s&$$$̙3Сo6ߟ.]|N޼k֬^zXsΑYr%׷:Z2d:w̫ʉ'Rzԩt"^zhB(pmڴoӄ3sL~ ($"""nݺE߾}8pk(Q?͛7S`Azk~|w6ۜ6mϟg̘֭1:о};:N"88PB<[[?c=AAAܹjݎ;XjEi~WӇbŊ;v`uϱcʋ+vdzO?m۶Y ,k׮Qɥ@yy dCVjܸEٺuuqi߾=ӧOg˖-;wMҥСEm^n5k,{1l-[&/xӴ<쳹vYg=+""""""CA ȝ5kXf EYflْ͛SV-뱼 \,9z )BӦMiܸ1קVZ.]:ڷUR\>me>9]Zr~ee˖?""""""2DDDDׯm6S%KO>du=nNlll<5jzjٶmSLg?c>&&Ƣ,3ZEFF:tw:ע-ʲ8O۪V}_?PͷO&""H""""@tt4Vk׮<#V3ix o 伷s _W^xyy]z]v1|GJt,GݺuˢѴs$&&f2͒{n2_vt?mǏ#&:ߏc?~LDD5DDDDA2eh׮ӦM#44sQbE?8p6ӻ|6%KQаaC-[FBRnܸ̙3S4i҄ѣGb N>qZqt$**ʢߩ}Mv@)V=]K.ӓ&Mm~ ֛(״H6سgfe]twujGZe8qTjuԱ;J ؽ{7{e߾}ߑqx)X-f=ضm/5lؐ'OڬYEm9r˗7+kѢ}7onQfm=dlEgmfqʪ'N49yʔ)CB(]4{f޽b'r5X+ 2￟… Ӿ}{vmq8rUE:uY`K.Fxxxϸqؾ}X۷]v@8UV3z||H)""h $lp-?`1Y@@o6oM<ˢ|ذaݻ,PBL8jQF3gܹswl6lIʊ-… ] \y{{s }ϝ;g5#衇r_|q0`ݸqVZYͪqƒ%Kxm֯Ypse*>GcUR%mYƩcݾ}#GgϞ\y""ըY _?j֪}{Y0EDDDDDD_M͚5Y~=oviߣGҮ];|7kڴt§~pSNѪU+kH*::͛3vX63gѣ#F;IIIoީJPP={tѣ6 Ӈ~9DGGӣG-[kSDDC?O0o\+fw{eH~)DDDDӧ޽;t֍5kRT)~ *D\\/^ɓݻ01=SO=Efٳ'O<+VhѢܼyh8_VZEtt];'NP~}zMnݨW>>>$''s){>ԩvaF=x'..pBzEӦMPŊ#::Bpp0v~III,Z:жm[4h@Sٳݻ͛7yfj;22Fѯ_?{9֭7ׯ_?#88:B\|F1vXv횚uE9BXX6n߾ɓ1b-ZL2\~'Ni&.]˗syA$;ܹs̟?ttoor;nnnٺ]BB;Nkk={؜.NJHH`_>[MLL$((lW^eƌ̘1#K۷o )"""""i ;1|mr IDATQIDDDDDDDDDDDD($""""""""""""f@|jG ?` f>~W$$@rzksB7nNsgwGm-\3f""RPC """"""""_~a ^lLi4m >>e ̚!!F[7(Xڷwq:kݸbdN܎m)ad2"#FMm53hDyG( IߔP]C3l3Z?=G xg]׺k]ZK/1vHzt:B7.N۷E %ӓeRfxJDԥV$Fڷ/.xZzw7LSvmOyiSi6>(=ti6e+%Uyʔ%yx ~#==]ВK RJUxqiF^n)_IDD,>g4n'iӬTo3Zwޑ ,ɖY~bi,T)Og/I_}%=4utåc=վ]~;^۹ӳoFitOK Fj }#yH o$Ҋ=ʳ$IΝ;K=39s޽ ;VZ@j(={Jk'H+zgΔZ-A~ۓYB*_Ƶ{w{|վK)#)).Nz5a4qbuTo7wXi9'=ODH OԮSWTn=}kM{cWnp 5kࡃz 2mwuy޽W^{~Ð*T=Inݤn-_[ڴ)ܥjܹJ#"'3=yhgp}>3NF}b vGB ,vqɓ8yc(}{>Q~ژu\'z~S''m9 H<!/$@H@!?љ}r[ڻr&Mґ͛0@F ~P UZM=zRbb1vVLJ:UVX|]\~Uw#F軸8]HJ된lcsUհaxLLO!!!G4hϟdBH+NS ?a:vwHxZZF;***J/ T$^ZUTQz|ʺ\.]xQ 4y(={T޽Ure3@HOO/ƍyeÆj׮]{ޝx'Tݻ>lXk{5o3F#FM20a´|r}^&ezL'm&˥;3\.J(X!N2c~a$)55U[nճ… I'{+U<ѣOҥK_{8g-K'WN"""1mkzf3Wӧz衕+W].=:bŊz?rڴik(!$}ݗjժj۶|OII*}8**H:p,][f*WZj^.^X+WUdI >\)))ҥqcƌш#ԴiSSON#FO>SpppmHLLYO6lؐӧ5sL :kn_NKyՕ.i$~mf@@ djix܄4yīX-YD{=vXu'Թsg5k,zrKӧ(].xƟu%m+V0H o?vTGђ%Kկ-^ իW覆jԨ׾b|IE֓[~7oΝ;<ٳe>|X'OeY޿\%%J'qIPH o)˥jۮ]L0QzeLhohhVX?8UP!x ?t萂tw(99Y*W8+i_㤨(&>O /ԮSWGQ2eԾ};M{c1&LԈ#L#өj߾}JOOWppo^(7lPnF5kLf9shذaڽ{ I2e _UիWWA6ʩ<H$;|0_( H v~1V,r޽wc<'r߶m[Pvm[g֭պuk}-S/W>[n>}:_( H[g2$x!/$@H ~Jjѳ/jht:R^Pzz5g˕ڒmlܹ_6l>]*::ZLp(d$~aN׏?Q'g0alLj WO&M(lճgl111ZvmV{A1@_q:P@@;v}Ym۶նo]v\.=Z5k￯~Xaaaڵkq+VPddV*˥{'HKKȑ#ձcGEEE^PZZZV_~Q~T^=UT)էOC+W\.]xQ 4IxS{և~Wʕc?P@$7/q{4uaDzwSjժUZdy-Z䕜tR=-e͝;Wƍ7dۏN:i9Ӷm&? $jܤV^!C{zթ[OܹsÒkd=~6mMf͚x/Pnݲ{͛7gmŋ: ) &B رc5c Tfo…3fBBBTlY5*jԨ۷Xϊ+P@$7;ow$cTG+9JII/O_J,ٳg_6;->xjժuu(Qk0 9άw}W_v5k'ZBjԨQRt޽{}s).];v옪Uq%KԩSPH o)˥:{Wlڵ9c򗿨Zժ4iqOŊpSSSw,K)))Y۵j̙3yfm۶Mm۶Uݳ⡡ڶm[sڿytreӧO p3si޼䵿zڰacMzE/O?>Liii.߼ys;Y۳gVDDqm+%%E)))*Yd޽{o߾ڹsnwiРS=#Qrr?v4hc=QQQL|(b A:uu)SF۷Ӵ7zG=3g0 z"ݧ]tW^я?4g> %IJLL3hԨQm SLLLViӦ:t P@@.͛7/+ާO9N 8PSzzzǴl25nܸ@kڴ4tP9NEEE)..UVGͱÇ"k緹o&͜1ȴDON?KRNԩS|uŋkر9/lgݽNddϟ}ԦMi&cwء*222ݺu@?ԩS+,sմirϟ?O>x [nɓ ?NO wH  $x!Itdf'H ~JjѳǏW׮TUQ՜s1..NGne2T!?=TmݺU>;\ .ȊxiխSW:{RJW &);\NVZ5R{:޽pnMβeG}&MRH&*^˭= &)Q#IR2MSSm1 B ~t*""B ,ڿyzo<9N|z㍩@..NeNM$U߲iiС:e$tK/Z>H҉;tbIJ e/|=ɺx1k7/L@F@HOOׁdRxjժSPtM8I۷o/޷zžzJ|Rf^IsZիӦ˗^RPÆbŬޭaa 6k$ VSh:Wԯm@ ! ~#$7iիWkȐ^sVBBj SD=Xѥsvv~&k[k׌m[VZ7m*푤ʭ[b˖*v *߼$)Y& \Cx ~:r䈖,Y~kEYJ*iYP\EիxRu8qU{m Hir):zڶkk֬Z*}*}*Q5+'.e7LSϜ>Ȅ?F ~ܹsZlh55k>"ߟkst>R$UmN5jxP~d2 CUڶUoID[JáNІ Lc$jש#GL2j߾1+^+=oQ͛ߥE*44NݳfKʝ*I*VO3f諘}gi> 7d%5J]X7+]y8H /mv*{wǸZE<+UZfn*} 'x~(ZL $kT_xB5/ȶ>S3[m\$p,KeӲ,ٶlcyHB ^H :v_vCOtu_\..ಭXB'Ow)^@@_駟6g 5} M&Niڴiǫ]YI'OᇻhÆ3׫c_?} 9B!!! ֈ#;}FǫO>ѣV\s\ZzڵkUQFZvO={w@+uŽjȑjڵkb %…TR%5.XBB֩iZdroZrƏ%KjJIIQ.]Y|Ǝ5jhɒ%5j"##%I[lܹs5e(QBӦM"iO?gk׮8a$ɶP$''kԩm*YsáRJӹ &B رc5cSKfR:ut:#Y j̘1 Qٲe5j(.i̙$9sFKεQF^J(!۶;jժqq4MuRSSeɣU|yFpp-yYo2t\`$e)Iڵkw]T~xuj۶mJLL߿?mr\ڻw/p Ѕ  TN?b!*{-*QIDAT?Ɲ9?Ȱm[n[R.¹*q1rAJ:qǏet[ fQxq}D_O%:Yo` 6\))*si0$=ر_믷ĉr9s8 TMTZ5rA>YmeN^|R`P5p]v:SQjvk|o۶s}%D1EY$(B|]R_-:ux,au(lY8 $YKP6@ey?Yກw [ 5k2sq%'~6Osk_fqݸCa "#={)p/Q \ 3\@HK{Q燻j̙o6 Whv]ڿ׾5k֨\`֮]j<4vرjWn~W=DwU\ETU]'N(r׭?^s<>\Iw] -Y$cΜ9jV .5jD'N.$ຓ:uV׮i/?kZd﷊T;Nd}ڶmy۸qj֬>ڿ~:EnՎ;"䩾@dӏԢE /w>:tPW.;}Ο?c|Сr*-ZVwJ:HNӻQNSz&O Xk_v(j׶֭_oƍzqF֯W?))W_sNr:r:zK}euy:v?mG=zФɓsǯS'T2ep8t-hztH |ok_xx6nܐk W# m6~RZpW|]Q'#<<\W.\$8pPVdֲm; .IƒJJJVLJ:m5{g_Lո]+裏>9>/7/Sŋx>5j蚹n4{l 37,zj֬d=ԩWpNߕC6}\dUiӼ ?)"ຓʕ+7 #2=7\?^}Ftk̘W4׳+zP^9R/^8mѣGg[ajٲ>3I҆t%Iq&Iҧ}9:F-ww)!!!k]jvGfғI'hȑP\c{/:txPSn]/+i?r8zi?/e1=VK.ULjZzv]$qtH !˲ \.307tGZf-M:$!ڷo'ө.]֩S:|N[r}ZγݦMtR6n,c~z=uGtQ%4lXt4hnFmViiiK/hذh%:iAzukIҳ<%K^_c=Ա/"#.y+!ۖ6oW+Ž=GJK.% $םʕ+R/^Բ,t8yNyhtLbFZ.ijҤ,G+몷3:{L1H;=^6nؠ*|IG}L.\У> 3gq8S믰Z7kL~ZժUUR-cǎI$hŋJzHx7MnEi ٳg%IϟWٲ@UT=ܣw}km5nzYu̙3W.[vSO=3gjJII5bH 4(u\$?ԝ͚i֬>)S*EmܸQm۴ɵvmjju+Zb"sXN<}w5eTЉBN*=`{}|>9d_*UjѢEzenRJiO{/-[Vનw߭#ј1J/].%AoL^5kz )/yxfBC5dp0HsC{8~:uٳgrɫV~HE7_.(Jl]nKc(zK0 $ktM7#pϲu,aGl]nK@\ # RrL =*^ Kc ;92\E$PL4A*J :p-srȰݲ$9d6 I aɶlY2-(i2Lr˰ 0dɖ!yeɒdʔm2dHQN2lɐ);NC۶0ɶ%Ô-Cm8dȒ!S,2=ue62ΗY)C햑QN2(9d؞2l=llÔ[-Yu}7dgr|%˼.[:mK-)v˖C2<[2<#0͌>2l22mK-ɲdX~Y%6e-μ~mY2M6ɔ眞Je014eضdxe2͌l2[2dضܖ%>!ψٙ۔m[22reu sm!pΨӶl-K wdm0%sԐgZn4Xos4 ϕ3gf1Ilې 9cmYA)q \tɶ=,0<Cy^[G1Y[ ٦{eɐlKlv63&,Iʸ,{Ϸ2$!Yn3[fdx[m43enQ5̌9/ۖa۲ [Nz*fvl;#˶=LROt٦K[M[e0LO[l3_MCnKCFƼ:d[^%d220e[LΘn #`T1Ing~+s>L2 KmʰeFF;1. LygZZrp۶L!rS ˖0eM%۶%ې۰吙1Oަe{Uz;;]DDDDDDDZ~sVkXlƢ Ѥ KbjFQ=˨ЊwKG\)"""""""g\d$ڹ~eKhԦa^.eƧf{ X i$qIJ ,>Rt0,&/) }eEk8E}{,~{2g ;>倆i?0);3~}-sfu>6t|u2)ؼ}#7Uə|/7&&[v?,?.!~1߼mc#Ƨf:5Κmgk+:i$""R q‹r_@c^\tg,8K}w"g~gO)pUd`A[G>o͎}e>j1i$$yZ UFfVpϠ >q R)M|'gp,aي/k6?˜]{M•Z,/W3q> ga`# ~QDD6-8\p//Og׻ikЮԮa79Y9/鑝c_û4V⑄QxBҳO 8=֊ZñrZ~^qeשxq\EPVaQf.g \c^\ԳK"k,QϤ"8k5/{7Zf iաcjpTkh9%$&wm8˗3>Oyy7^캶\)5,V5pV 䩌g&+y{LG#*8DU;4]9^p\!(U8BBwn";=[u{w<#0MÑc5SV|Us~ļӦanS30wA'OepHM;٨Fhbj{*#3dm|4>EDDθ(Ο:03;‹r~ΞVem`AzpJ7pqq & q&xy%{{{eee*>t<5J+\p!ɋ ~ZY~^ohjq|zٽzfM܋Nܼu{E&ηZ4kR ^ྑѳ M> 5,"""T=džtmuzƁS,\ZR3<Е?!%cmQ#i̐Vu;L$/eoJ_>^6W#'X>*=ޭU;U@aed9xߊU1WtF_oa9@W1EgܹEDD.N a5EDD.N%tNbo^Fen'?ܮ@DDr1#m!_oeŒt /E )'cX+fhndFeT&`O|M灈;?/uK]BϾCr2/20Q@DDDDDD@?/GWKL9u9i,)‰Wgaxsq1O$s8o{آw < C0Գ@DDDDDDD P9z,TJ+*\Q%7>>|j8:''@bNnn-˲ڣw)%WDDDDDDl{cG_:3?vԵVYb(PJ.tkUQ?G'.\B  ǠA`\F*TCEDDDDDD䒹!$%%*=4n̙ߦiΘCZ,!""""""WR^W^ %%5onHMM+pop6zb Ww8t/k!66عsg*6l߮}⛱r ԮSwР8qB\ ~)~ra> ֭ǟL}iMg}{n} =vHǎ9^ƍ>^z9_N>cرa89uUn1bՏ?ϭZZݻUoc>)S^ye""""""Rݳ#G1ٖmݺu=<<|Rl{Eխ\Æl}nݺغuk||AϹGݺu[G?5~ݺ]Ζ7{+W~WDDDDDD.s,8ۻz$&&VLZl$&&V^J;N1㭙3Ϙ1v샮nQN~[̘1mvׯ glZ7M/99I -7le U*WNLL,bcb꫿{ޜ1${_Nw}7q g4i{ɚ1111,,,===,N_l={ٻ'//o ,MӧxczwVka<ƌ.&EQn]xcz..̚={el7O/WDDDDDD.20q„˺uuԙ1cF)zȇW(r$.x:>1߅ٳgVWW_4Gݺv6?]:w1MsNyn]ɘ}Bѝ;wkj\ F≄l5ejD5gEDDDDDDyyyq=4-2̯WVŨWWj9!.2{Qץlk,jH1r EDDDDDD䪢"""""""r?"""""""W /Nݳ;%%Y $"e4M8Ҵ;p8LgpvtlvtlFxX [ lP1 PGADDDD$O$,pJIN}DT^૶٤$W[L00p)8L4 p% aX 00XN0cIM3ғ]֜̎-븈\UvժGfgefefiD$rrrNL/Ap pm|aa``aώay:p8 ҳcv)X """"RfԔYYYj)!OO1UÂ:"""""rlv{EDjՈaOMMu]2Nzs;=)0fYWHh؛oةs1-""""""`o|͚xov+ u=恱>x`'ƏrgQwM:H\C=4f2[ޙ=k䨻)'?3I4p)SO'>3g;߱e˖b&,(Y%l͚5۰~SRw}k{}駅[f^^^Ç_LԩW^ݫ׵;p/wѾ}W[o8qӈouVWzPPPkUCBopqWbHHPr2"*VXfHXb`+.^"""""7 ֫zٴinna YxсNrÍ7Sw``Gs&9oyXYd]J"r!RRRިQjZ-&""""R^{_7cƛMLL5kÆ9߲Z'/w=hϚ5۵nN+\L^k=yyysӷ3_߾|a^^ޫv澩E-"ebgϾۋSAC`'\vmk{U֩sǎ>d[zjڤs_i۶vڮu_{<|xՈzgb;}|~m}#>c\ݙ."rN6ڀY1 0=-01 BŊ'ӀVL0Oޟ|Ǐ?z$__,([Lt>G{,!!0 0'X\a> ~x3tb@HI8Cq-j )6m\AoFUmݺe#FX!CM "'fzgǎ[m+2CB‰~{훷lQs\Tc:j,ˈal6//򼑋/vb2tXk1b„ EGn֧~if:""BDrdff5>>nD.Ν;_x!ϯJxD>ݞgc0VzA]/^ԤU7ZddJjrnnȕGN)тpX a;ʤ7 ?&"\DDDDD> ;Y ""wJ H !"RY+wDDg}V "mY|||)ֺx#r ͜g`' N9sfFF%ز={U-(HH?q"<ϷDDDDDD.E[ny/%%%*(@X D| Z-,9b$""""r7|ի:T =55uĈ5kּ馛Ҁ;v튈ظq#p;XwҥQQQQQQz_MSy}֨QE|r/.]Zx#""{カmۺg(9s4iҤI&|ͪUZhV])XAA[U/IIĄׇUܺm<{^G \&$EV )$""""rVuZN;w\~̙3"wVrPdݻ׭[7mڴ^zi۶m?ZwYZ&[UۯqqܲqCX:tκo0͸c'VrCh-"""""4wCԩ￿vZ>~)S<<|Μ9%_,uYSLС. g h8Amw8p8wZӼ, IOKՉ#""""7 1cƸ_Zc޽yyy ,8p3k׮ӧOܹ3ХKٳg޽ŋVkPP&V511ѹgϞkw-~)s*rE.rUziz4M2QGDDDD {ョ'N#22ON""W""s);;n"r2 VVRό`1 O YW^qlܨ'/p.o۶)ٻ700qc  Ԯ[Ҥ^}ԩ>cIII3fѷwoG?X "Wv)k-L)'Zn b^Ι:j?\ˇWKeڴiij{BLL[39..]bEDDD. a"""r)ќ1117ymxՈF,Q3PqMII~U#]?<55Օ7gvԙ3G1̞=Y(Gzzm X`c{b''L k@ E LXPXb'O~fӓ:8h)S. \v;g:DL2uذ;o}>%DDDDDDD,8uk kSRRJp=JXeիѷ_ߥ˖cbCwXCztEDDDDDDq+HL|~mKt+W9=sjuWXp) ~~~@ʕuEDDD""]z,Yf9onayEf>g 8v3Bczpps4ADDDDDD‚['3{ݻ ء}YfXd(b={Νקo-_߾~tEDDDDDDJ,pM@8r]o|3&&ƙ{ڴm[vmW^z5mҴ ^ɓ&N|Zȷ~W^>ߢxbe[jݮ][Ţ/r%q8)Ck_/q۝iIHIIIm۵=:"efZ] 0N?=?N3յj-FNN-;v$-""H (Hy Z~]w߭z7ڷo3@`fRb_߰ZCDDDDx\% Ϗ{ m۵1 x2{׮K_a~~v]/"r9 Rwc:~ٳWϞii:;bl^^^j+C ""W@DJ dff5>>nwBddԅbZoX~]ݡV vDܜ?x]>U#9̓O? ,$77?^RR5bq8rT윜k~@z,bԭgX]n DZcG+U_K\ȥ|mqWW7 ÿb~RnCffg#''gktuVk헖""""""6X 0M_>so_x LЧob vŊoiU|u*U*ᶅ}||:v%KF`hа :%DDJ@BD ܲ#0`O{;S&O~fӓ:8h)S.<00p7K uԩS>Cc<oۺٳFr<7lӼef-Z7oٺck=Hry4qYa-<5&/BK5(X Yo=te˖H_lСC~m((66vذa4iԩSKy+.zڵkk׎^}wߕpVn6o>.) Z BC#*Ԇ6`0/70l<=ԎR,23waÆ 6>Kˇ ֵk׹s疢[nݡCo*Ɋsޟ_GTX񒓓"$Hp8K.2_|y$&&VrzrZxŊ+fq7ŋ5kL b??~>;II+9-DHMxzZ'lP *=P ;0?M0 cpajUqR)3ޟ}Y׮] 6k֬Hg}]bo;}aywd;v9gm۷ŝqI O< dddb9AWb``G?VF34$dE:e 7t*#)YV#WJ؄o]QA?`@T@d։v1H~pxA6 !  |ƃ<O$5(X ]aҥ}Wn￿K.ϳX"d0^0mڴGFF$s}<=])^^^Fp\f-Y$33W^veZ'=z/rss-_޳5;\^{m{͝;O~ŬXdΎ:WV588(9!ԩO>^ŗ^ݻ9[W^~vL`I'>Uz[o[0"s+y#GYW9E6:xУ}ߓḬ:Qffk dgբ#Z:5\Z@M;`i bBOxހp34- 9  _# 8O̟QQ DθH/]/GZZ׹s˖xqLѣ{ܻ[&"rs8 RC' ! n)8 o@CA۴'͂`t a:~#x -(Lruڲi ~wSl6gb-/_j8g8ȟ`]3\a$)t[a"4a,삃 w@B.P 1h m6Ov,(>p&/N U+T2n t0|Y&@| H^p!&{!AH  PF=&|ZWJ @ Ig\~p(<t hX G5C#C?0 LwCcCJ RZVաr&YVU)""""Wga0LI87;%N7`%DC .P a/ )1  A W`XT =\=2R%)9 N$(%""""WP pp D TSC= `P p 9DxC} %GP2x<;vbG`9+9 DB~֣gvvTDD=P !W0 n @|@+`(oU8  H =Gd8 ' vCc`2Pʺe R6O[z ;&̆ΐ{d‡ -Uh`CBRW$%4""R>P&M^&j[UoX C[ ?HOa0 LPa+ԇ@|X;a3k~'yP*BW/37jNK v̫cc@BKhM6}YQm Q:(UAƒ؂5&jKc4j5DQQ4`(RD}w*59;eg1L況H!5,x "L}`()_ё!7FG}BBBeeO|GFp LCz3Ҁ Sng-CcI%,4Vp9\6y~!J%mHl(kH3>%Ҟ"RӁPlY(*bhYO'}.ح>e!{=0hР㏯AJA5 5fI'ԺuN:&݄ ZjժUÇO2.zAEEEGٺuݻ?ch֬Yv;@`xe,#VzX-;'h@ سĵM>LUP4^O1 4޼fLc%҂6b)QQI9XN4$iK&3(f=[iLzN{֐.d=M\CCVn^` RPTT{_ѣGϟ?Nkf3_p%\_K?^8o޼_W^{-/_^@ ,f a4@ qRa X2 p3I+i/T҄f^b r∰O9i ^CyrQ@.DE)(#5dѓ߲IpqX5 .;wC)~waX鯼~;kn߿/تU!C5KmcKwCk#}niuv ?8}{Ӏ {lZO eR+)Za92(HX wB"1+ xa̡Ӊ$V@]xYiqzS@l r9U<؏*d`+#D%]:³>%~WwçVlذ!##5awqǹ{g$&&>ݺu֭[~Gfڽ}Ns;--msOƍwܸq'|QƎ{s T3mH|T"o;DZ"m1!@ K\C OћEc8Ӊ|FJ?2?p;2qGs6tq/hGLV+ᱛic7V39zM|Ǩ;"͓\J]eC9>_$'I+&Ȣ;1T~ZXr6b5[s-p.}sTScCK95r[n /0`@۶mk::W^;اILLFqGT?om{bܸqiii={|뭷j6裏6n8--mܸqara Τ}ͷ|_?iS7\x7ϛsE^va~#>v{do6 _ՌTNP8:q>dI$x1޴.=gҋx Fq )FI)sOadӖTPL9c!d5[LGRVWB *bFW%ZzZ, b'v-Tm2% CA[ v;vEzƞ={k˖-[dI kتѣx㍙3gs95۽-Z}h4jժ[nƕW^?o~OSN9[n)**+> ͘1c…?)vxI#F0xСFuoy Cy׶ү_^~eo<_ b3{7N3?'tz̽L'4RiGi2BY 3T9m08F!XMz,"q \ǘN ^a04QiriBQq*IӄB-զX#؋O;v8bObA ]**JwcBbbbbbbRRRvfΜq7U/?~|6UU#F>~53G12--uG=3ϼC1ÚQ? G1|7sͪ!%%0‚𥔔mn[l9sz=spQ|LC>-u ^=Q&8p?8jREl'`)ݘKv́ c#p%A<2 XG+Pr4rd9ۉPA`:ћΠБ9|R*#L%QDlf#yy298 vCJʧ ‰ĂhtsmڸnݺޚUhڵYYZ^jVI{͛;֭[5Hڼe ͛?ojHnnc>2{懿7?Yx_̀-g+@ :ݹfs7GF' XϵLC#AA,$X% -dɬT]^e%q ifЀ*y-$Ѓӹ\Mɼ;3 c[+l( !wpgreiNSf1tx&LxW=dVC;|ij/>!!''xj`xn#@ 6ťdR̷!1δ>Њ9.&юxF`cɳ/mhD*S |t 9dљfXeTȠQ*$ICie"\g$bA{VEwgBYgUXgW=s-+/U۳wO5+~Ր]_pn {)=dYaD}ꀳ#{C8ą{GP̧l}.z#wNW^TbAT,؍6=UV'O>zɭNng޽Wn:6Sz4~LЃ,yO>4&5l2ML%ާ%C:#(f0r*iK^Khe wp 1b*1tUHb7Іft`}>;A,?Z Nºkv">p!81>RK>PoCTB@ =W4`>g'SAds-X'XAuR:PJ1YC}RIf(3.ca 1+}4b3)?blb F'Ʋ6A/Z2{uyuP_ @  vu礧$ԥM ~pP &3O~4UUѵkVO}wʁ=z$%% u%J9U I*6!+:\ @ Pt"r)o#RD=1l!J} c iNSA)T2ЍbN%(L;фVk9\-I ̥Mt3c> =8RқrFQN=8L>hEC(a:YN (%)4(osEjd?)E`` ;<6oZ3ŦXx恸'꾉HeU3?eyy7?97=%A4XWl)@ZriCZ7Myώ۬zCGlvA͛n.8m{WwxOOꄁ-Szu%ԌkҤi` +|M}Lyy))RKU\\pJ8,P؄;l@  {PFa,)& ЕXYxg"1Nf6^P*l!taLGXMwqQ>b![B'^c4Q+:PIgVsqTW)C(D'DI-Z1OuڰŤy̏_ű[\1~7?;dz.@X@PShP=04{0@G IDATK] |A+ݿѓ֥],RR_RV"%)aKiEFZB53?[ܻWԵ* /2rQa'| FsA|$݈Dإ2&>LA H>7ғ;t?,`&#iCunyK{0VFqPu4GV_k(;M۟Ӯifƪh4=%>Svڋ>ZZУmn\DVٳT7\oǼMj:8'Ob!7n@ 5s|-:ry *TQs7@ ɍDD VV$:3XJup%/M]mBrN"P]S)Lc5і\c m̿`#OsRE )0dp*kCGb.gELhȁ4u^cc3Xfާɴ?&9䲖x1~ּ|ag9?bK+ƽ-<^\p^rTqAꞻv=5i陇wozO۟IKvmTӹf߯,8cx[^}GA# U[yſ`؄=@ |gs7$),2A+ZґfˁQB:86,#T2>-EXjw4_?#|io# ds!Osq̧)y$S@p(L&ӗ1$)Dyba')I$2\#d!1燼Q82q:Il( `d3x& $Ū'~LH!dcYϯX.@ XMT?1dxP"sz7+.X;/-%72VSh :ql&XGԴݳ0b_MpWhp̴+7':sm< pۖݎD @`_&tOr(or9B*G3J2GRNYelbb,9KYJӎЋR9ft+'@:M&C98bb!zq&.O"'R3xPǬ"Gp1qq5MrU9[OB,ScK>SV61dїx%kd2siZ5sA] qw b-wi j>r.Q vJ2R I&N% za ,$X, K"˩mӊJ62/V`1)24b:X"#Sb_8T!ld/D<=H?Mta3# "r%DB!b39!1F*spFN`N4?ޚRɿ=U4s:S YX|'И Ҩ`t1oZVعٞdbA/V |] dHBJb@`#p.?y|JR3%8x6яE*|%cosﱞE (^f,y *阃,cX̲<`>MdkZAı@%c6Xz(Ӗpds1TB!B68lхT3EKJ+y:Ҁ?1ѓ@FT_mk/ӊЙ V !l_,Nь1ެ `=Wۙ]Q`GwS&b# 9i jT_JBŎVIjNF/cV9EiFXj T1)e9l6J~Lg6єޜc"Rhȉ@!k|Z6űq$ŜO⨮>E wEclh| s7q!I{SNhrrXF:ӝXKI#b~jqN+1/DrVQD9sCLQ (PFr2M%+p>KvXaUUVKDžK'x@`gTbbU_t.؃! ;w4xY,N@Z1Lf* ssT~>H" Ќt0a "!1#6.b2JL)$*VK֓mJ#SDElA:eTČGLюA_ZǂCE<T9Lp!8,>B&"ݵN3%ڹ3:\tML12(b#113Y%< 4縚$sc'J<o ;g$, ,(Rզ| [z҃@>7ir7*$у8"^c l46Q4#B!5VPESd,wь~Lf1,#)ø P*H"ͤNX5DXǩxYXM|"VJє$>a>ǓEFF2FDYRw939l&?r+D:R7jT_qTk2̾ۃ=bB"&6SiF&@͘ r1G*`&6q@ÑӀ2nڹ Z7Dy&\VA,>Ϸvw;D.3sf(c 7ӇId1xL'0tBiktfxé@tEJH!XH l'M0>|0(1RI |#, zVqeG$B#iG hM3$2CSA2Л4сiyr;ytcؠ*×wFoj)i62ĥD=̷F[2^l-E(PFװΉT&CG g(e,|.}إy)" """"">Q4^?I^Wu{5xmdDDDDć/qPO}T$ڒB$r3h&N2_L8L.g;Y\No(-X k)'  &p [4s֏f6s j yk7{2H#/BT30bI uhN!+Fg=]/4w(_fqĩRNFOh-yPM.b,:6"-$+, b9#zi |m-tH*ĂO3g|S;Fw'Av5Fs3qet@FDDD| &p-;&Nc,=ù17@Pyޟ4Бl"΢0I.jіzY,V`GP9/0tja8K[riI"8>6$P vq&69BA_ щuTӆ,/66nPt}ccz:GyR٤Жfa)h!H)E\M#5&QC!hf[8ul wZIesͥ\̯m.7FH,dZw=$4~>ND8`Ok=h oa1Uĸ1ҘlЛh"u6MV`(OpSK*7TaR#/N,4layWP9'n&긐&3f0v 6n2U,fw{5|,zSD.潆.0Fm2I(R.fs(ڈ1 ~AOLFRKv.#ęyI*PK6f#I e~93ύ`YtIRiOk$s"[~{c=T7c]Ep^#4TNL=CHJ!A v1ЍfƓM6|*# Wi΂ݎ$4u$ḏȗs]$̵TԹqCˋb8J*?Ie!u!B ,f?&}YM9MdP"Ny6O(';Cov~Tы>TRNЙ$ZLlr*zD5*4<5,e П+!L x*q(fHixmo{kUO $XOtZs#w^'apDZP+ʃ@Z(*id#-!`ϒN2~jHd(A0Zpǻ»^w Acc5kCc9z.9999Z؈^jws/΂o?TDV26TFS6I5 h`-%taFVwX̏hzcIc,aKBXG6Y4h*m3 %YsJ~ԓvKs Q+Z8$Op,ZCg%3v\̍bd:y#(b<2( N>pKhK:H#YH+f-_H i SI TU,a8t%:'F##'y"z18$Y!Mt ޸owB,H]e&N*f2GYŷx#xQϋd5tQ2zy8<mg$oљ` _9SO H%t;\h{!} kp$CsXôCؘn#8elc3#l+6L_;:ZHZ8 ( ,xPb?5 k1$c$іT[! IDATeG~0_LR B-4CL 4z1mɷklu^c%ݘH[xD>t+&ZR6Je$v$,%I0 J/1|6 #vxkWQ !/SCS^b ӟYYdMY+~RglDH,t[.ܳ^`O{ KB 3X="">Ah!ȣ<.`zZQ)e>mI&RZӆjIcE*͜M8մ JHIE4΋l'^9S+7O:&s'0A$RC#t@zR/'aeR/ÛLfJgвQZ]䪿+9+H`$MPM ;=(p- F4r/߹a!Y` B:K?'V "i,btTYJ[iiL&cp l@oY}^ķ5s6=T!K/5pOy\}n5D)0R. OFr-1\a{=q -$-QN9 ꩣ]7iaM%Ћ$c. .3Fd"[GWq pӗw8A ('1T6j:XE+eH01hE@eJ&PhnUdI- t>nZRH#1~IgzN\GzATԳx8TҎ2zG2˝`~̕n''y J;D r9ҕBC`鬢5a3qa7,gP(>IسR.5Kߎ}v:dJ􄈈W'' 9Hs@ 3sh}29{&X9Lc16 F5it#empΟH gk؃8s;%PA"h*Lh!8NifIXeq9rQϔQLutDE1Y&1.L(T- ױ'E 4ҕLd<8ViP6q7iLd"L [jd"=Qd GPNnb1fRK/KA3RGw_) F|bDpw۪ؼ]oK'q6nfPќ:.C_ xd8ӖJO4hC<cռ8 60/'\r.YIUP jI${h[W4I%6$QID}p+PKvjy4HK#L2԰9eįszf=,ջ,IӎT 98vІNA wRHwVJ\ d9xԑAh@ }Ba"b:r-U6N Udq5_he-AǑB2UlCy$'Nag5,),W/O}'`g LB """Js3C;6wWYiadSe1xn!g7JЛV̢H@;PWtFhM:ui2cyD2Џ2:Lhu)`MHC,#~_knxn00¡\?;`/ru!юsGtFPv' )8&#SD9bБt1ΜQ4E3 $4D6Z>,)=k92|/s$goCs^4ܷUW]CD$w'v*yww9 @91\G\2byѳ$""c<2D#4/cʩb&/ЇdS1,!BS"&FH Yce#|%8d)'PF"e@!uӟ8d1Fs2ifs;Ѝ\ޠ)Zj|Ljt6yRCX, 9a1PhME~S'(fJXO-( T3+kPnLHAH=\G_18MN!-s =yI"FOZsr+2ZrMo$Ў؏zQ@Y$RK%xr~ɽ,e6c8!ΗHa6'ʨI68{ց0Z(a;5t Ʃ2e:#k~U9$QpЍ3i*7,Tid%Fg DDDP?9џ%/jA C1,"/Ћe.Uzq8 42Ia;+d~Gyط糁79;Xo(%5KdQ*f?~c%!.a+UaUu}6rړ63Db8r4(Xd@Xl1H$VL!%Cy[8ytjfjY]&Fr+hIq+G3՜VdҞu4}'΢\Ru,`m1x뢨OQfAħ|p޼y;2w܁FkqrA㻄I55SFj1G>c8pCc_įB_@9T[g&Ӆ-Tґyt~HΧW|Bjϫ֑`/.đ`+t䋬-a޾įE9崥)$ 7ы ":Z1~Fz*\(7U,7dk:җˋa )QN7dYlMaːR99 M Hb$T xcYϏA)a(}PF2;šR.ayZHaaGгl [I;K#z^aWT3jg."K>I1YKAIї.l.%Lef2$_M_FJZ^"m<&#f YtM~J|J7Zюd0Ӎᗑ. "">r=f<^{흟:uܹŝ^ΡSB 9)G q lg_ B.. ~C%­ùsC:%-l/s>iYF)1h mOOXZ(~J;"'+Q@+g d2/;5-Zj5/Wva{T;#PIH;I;/ s5):d]+ l"ǟ$ʳ,d3k&Q:PZB5~Aef*i p`?j Y eɳe&ø g̠":PO9";zB">Qr6x|ĉk&)"/h>K 5=dO8Q_3䌈3y#ss8839:Нk)B9bОmdҞ9TM'L5PN_Ƈ * e Hf G[:CA:ҍR{ a+̿E"` ۸ iE2ٔ}YSkclFz}T屄9(#4y% ff# eT i.%6dPZfA̧L I[RI% \0 B!|~J!l8M63I#I`,EԒ_~JR!Tb) hE 9oSCKɡּI[a't(L\Lr#o|ˈĂV*[``ڴis0n'S8rӘV>$Jr 0uJEDDLu?7qI=aY@R';XO5ݙ̽F+IŇH:lc)#A5l&$c*'R, 3%3 4;qPMt!g*FB':s?e֓N夓NqQK\/A,1~Ǐ9x\&R lK g}2l1,(`+$rX2i!\:F302 'fX2eq _ 4Hs,)b# "#O[yQD9c̏F#]dd pN;;??"y4Бj)3=y|>G櫼B[fr #\$DD=8 }fƞIMqDŽa(\eg0!`wᅈQJ>_jJYJkZt fϑ:] ;āߡTDQ4Ƅ@0/o$\Z|J$[Ћk9XPN!˸xMomI f6q_8\QYLk3 ҋ•ڦK>md\ΪRiq;W[~p_'eB:p8fFjf=XI_f ŜJ5kx#XM&"| r^&̱ $HJ S}xa$NXC,FVb|j{Y :Ct%\pLg9Qu}҈#>9bGH;ԌwђN$s &۸6ʑ0.\~\Ho)%oߛzFҕgx8H%i2Ry0_M&FYAm?Hػ8s  ۰" (" f YyW.iZkkj.!l3 30s1}$w2pzNteTF;dvJ c q@t%gArnѬj}r73Owmnc_;x.fw&tƳ!aD%6 ^$Vnf죁A-ЛTs/sN#d?BGyUF6)v B+yK9j6SK g8IЕa裚AW#,$,f/F&˨y!d4B2r< QgAāS,Hi66R7I "">L˨-3S"ɡ"cYz00ODh2Cą@x od&$[dCcquRεlt^g*&,HhG LsGw9=уsTzl"!gSÜF)S A# >~Wh|vӇ} A"xE:@_+T^EˆVL`[DLgx4\-3%8D»z09A4΂\uDD Mhk&9m,P \=\W:rZWL ?4sIy^,AYkH;)&>>iҨg 1v` 8"3 $gq>+h&DvP2n"I\:J-ԑˣ䲟y4B*.>zЏT~r:=);: "RA /÷e$DDR|Vb(G0 a riT1\ H&x:ҋ̣?wQ!89'q$yEO' ސ;L}!N7VQnl2)*Avy"+XF!({#j a0>: Ymܠb,=&)Iufq  $YM^f4eR (!I4nx]F ;( B6b䶑;8`Ž|{¨HYHov&Ѕ!0hPr?!Hv*AC\f< p RMqf:qfK)~p  "">"x}}}"I'hU#">RĔi:*O c60#TǙCQ8IQ˽<*Z\DC\td.~XjpKt/|td?q|\p<enxlTқ8Yű`;Aן$!SD:U<ȧ|[Z ә'9B99-ԑ h"qڨ֐K=sX+A]ZfJ.vv5)UM#([_g 0)\ŧBdZD%q!CB 50b2bnbLayXp"6O<7L&M䰙m!!ɱg g+̹\k҃!0{.J6+xd&CYцZ IDAT\oL\~F6,zU{m"Ĉ#x՝dߣ*H&wVVkȌ6"#e!"hul`}p$5X ƍ¹a9qeS:H.` F` Eh IgTF¢pԿFS00lp$e,Ol`?xG !ƕ N:[ _vYJIݹ?8p0 tY ވYv-ROha1#2~H'ֳPĻZhf3ﲓA}$dHd ۈu`txB_EAء50mgH'BN)3DYSK&ٴpX A c6>J9sRC %b)/EQE9's ?f,rblujDBM+֭#Y6?L$EEG ܩSVvV51JG 0-ՄEDXff)d?i#a'G dp9]C( ט@2*/e QL+4dOS좔^ *AzJˌ!tFbI.u,y''$Ya5G%evެjԍml>ʙN7M2~F= JFS̥W8/0CW즉Hp=;-Hh٤S*e#b%L偰C1oȅ47û()>)E)}ay%`*9?VNonWqf"T3 dч{9|rbADĿX,޷o򶶶Ss318Z,5 "_t!7$7=ɧ[~Z ۜq,FwL/ H;24 )ml'9nDx1$A+ml/!1,uc,x:s&$I1 :#l7\GQIHp,%FwVirrIt +ho12Z{F/F&t.z0jM0vg28$w2vq ,6N8L'SySY\˥le+9~D?d-ǐO3xNSi"g˨c31_ 18(QT0@ x9zUGłG _(bhI#"9t tc g*kyBDDGM 9\| 37HsB}.׳VQű3Z@ vN;9aUl"uA#ټMWZ/EUln\ria++xfc WΠir:B G-\ٛm9Gy֝!nDFFEn&!d;ma=ci!7Myjyc2gd9TSJw{N̉||"p'%\I:K[hb8VsiuF-ҙŻřdNa!cE3ù,aC4t "">>nۺkjj‚C'===Z؈Q_R2iAؑx;ED|4L yuJ?0| D_2iNI(#lchetRd.'+4 p';g`A;lY, z#(zBsD2ȡorƟn죄^Ix#XJ0KF _֠0K@;H qRx$x"c!|ax^ ڶ3HjI 5; +tb 7,f빁B36nb:Lc?q28 `KeĽle/XLg=+x;~q&R63u/rKP*nfBKZ4 "">F'wZSnڰ^J%z#"">aK#AĿ'#:~ӃjQP_42N7QqM ї>$C| ƱjI##i ".<ž0~f&0Ç} *. 9KChX`V΢BJLXtyJZhd 2 Ҙ:Sǃ̥]t +{t®?9j6"c-KJ$(G gu긘cg EgokT:z'C6gǹe[A#sy묦^Rj#*DDł_Epb8a& i !s9RL>AfRI %,{Pwl72~*ffnrz4g;#\“2d!~@?c$` QN/)Kɣ2ZjD64{q3i ¡B?n$H,p:rv"Cҍ^a%;{xJ7*'L!gRVv&u{|9 9{;̡yt]="*DDDDDDDqwPTe.KxB4 7糒T6=~n!=tzuĹ qyt#'xSEe ]YaBm!m194QVV.K63I^a%s&2Z)a>aGRR(;Cy架s7`GWH$"z(IB>m.`%cTvY۩cm &ŔQL11NǕgd0 %̣o2Ry<3]=""*DJ"@DDDĿ˹$F29`K`8lc>q"/22i j̏C9_# 2ĩ3ɦ\c81"mI$]s YIn\kéB7{?ڹ-

CT2N;b2:‰^n]w55= 4T5t =BB>jA#4'pq7oQF;'1l燚 1.4 cx2p)4Ah'3"rB#.d/C f  EB)s2C:ԇɠ,pK%@J """"""">B3"f2'qwcWz3:~ƛt"5YaBD11=|=rp>yTi\LG9<:6*& q?M "<̍d2"b1P^)eȠ ƱӲdVo7NdLM RL&a7q4 䰅%$>G?JY;L9ǐb;+9(tf+H}1K\L5+:>cHM=ҕ'8,\6\'>B9kHg ^c2_z *ɐhPrRLa6I2^Q "TOܼy_ф nh""""> ~Hj1I "G1r`9籍vfQv&өS@&ta55<4VQ)$A#(cTh#E#*2B!gk@N x.NHDIЉг)<σD3}wpK*Izj.6f~i|dҹ +cF'Sk 䰑GBY,'J.f.䰂23C VƲ(K%_$98#$h`tfoXϙűF2~ ;Dl&sulpҝn /Ec 5ǼHjoIl+@%|;YOYdc8xI4RG)\As1'I1G}S<ιqM;O. dͬ4 d+ j `=]i"w:m^v6ҟ8juNCi^zIL s3C8Q,$TUɈidRνHa2N!?slhq4]q(9ȗXFV:)6^%NB#d88 ԰_M'vs-%-Aā9ӳgϜ93ZRf4&nq1z |Jh.$Nd;Aa^+y:dF븉I$ͤȑ4Rn9 e 7QIw2HB/V0ƟCxw(b =)!y?Hc2cfKةJmj}['Ŷv-%\ǼE;s1/@3(f6Ѕgeݠ ji S԰$5\|Rt# qjYMXM9d>(]PMl I,{9KXU ">΂K.k.ˣI "t*H{( |ie7ddX04QN9y4:(vHN#%}Xr4-g-3I=cdnK$zӉ,e\(j&1I|{dWvō2ߑɉXK9XU g)b?_e %t z_(N~I hf?b,)b+ 0F!_m҉1> ARN_je#B*Ȧ-d 긊,|FJwN7| vL汗h+$,8`hkkmii?~q=zw7n#o3"""#Cjp} Ajo3'G|'"~HnQdȧY,d8QқaI8Oѓn,%b'p&X M$hg݇Dz@_"*(3Ť$W"FtFg496PB-;=i>t7t\$&I]V$+ۦ}P<Ѝ4f"Ra0D yha#)⬡9d Lg?e\<^Zy ,H.=N=o2QbϤ*>`*'se;F.9\Ϲr(VJޣMySĹl;,q6{9t-c Jp!gub y +4P)LsLwJq t%l CA|,f*,rPVvPh yrYK ߇mnib{ouI.RJT`/[DkN9{ɅPd `+$fs'Ao2Tog3SȡV*Yp0^۬f Gb1xC9Ʊd(gieUdyQI7x=Z>()dYhMG ~! _lnh~6,b[?YhYc.;q=#H䟄\K%sn<;#0g&Ӽ08eNx|dnxy*he0wÜL ?,|BL֏RH&# &K4&o,)x*DB86s/0߳g9۸a C, es7pmT "LDgA#osrrD"POqv 5'1 '}r71S{CcYر78Rr31V,vp8%!~=D-լmN>o87D#8*-0ГtՌ?3D YK+.wlni請BKq8&I9y4BEK_ޥ. |c9M\N8#fs3 q>YClcl7D _Y(D"ȿsCyP ".b=17|D|bC)yg$WN;ev2p7yYFїi? /PGXadC3E54}! $$ia~p|O4rۘFzm,(#;bUv~wzz;'3Ѽ;,gtQJ wFq* 93X 9YH yj`&eeO>BEG8w#(F603L ) 3 [Cc~E5oq<7I97qL%I$xVXA?b@bA$א XD"6P_ TQ|ɡxboQ"QĥY`0 H!9t2V Ż̆Ps84mԄlT4WCR즑jt\ ư<OOOkH0&9!CF>kLTuxˊ.{0r;xIE<|Ix0W4"Jk93cwȳXOB8eOcB:#Q,D6RA "Hߏ!`&s 3CAxB#x(xa=J& ^@RaX(8()`+901_MS:BA8H2kXǀPvD9`odXA!^7؟$$h<|E[WӬdғ<PilcI˯R*!G|U.(ӏ\zruI<&3:>lek؟vxYѼ$`1]4>6$a%M7g30xJ%F#/l#XbaNM&_+NRH$b ‹&&l7 k804Qt 5a$j:C]Oa3чRrx& F5?6.c#Ӹ4͊z8g(b7* .6M;C%d^'I7+#G>\*)r;۞rI d3& |R4PKU|&ݔS{y졀jژG=!1=٬J3G,2!L4t1Ю-RG)ɡ^t1\@d.xVяj΢O;ȣdXDfR yc,#(#Ipfh&Eq8OPN' #K)og6ٟ94?7ߌkF5g0],");JiyF. rY.m˒pH~ 1K, /c$Dv).GPNEh[l Gxv&TY*Ԕ=*w>Bm6٥c.3y߲;L5lPؗflgGl-=I9 b1sGMtrZXξ+CKQ:t΢rSdsJ2(g ?Nd a>{ĵD"r1s Qp 5W <6cCa5O ΣtwT9.&&9|Ӌveg@7SH^>{G!{E'Bx&xAPL'm $!o`v}*uV?e`Na.pRȯDﱁC<QAkH"[唳4{ M3`09Jv=/ϧIp=K93hdQ >qdO$'IGoha:ׂ8;&|MbA$w%H>&N1D"'70.l$1s*Ş(xİ#./\;@.Tr/'yÖ+|22@4dF.PXPCHr4y"O']\W:zQCyAևv<ʥ;K-})Dv቞ey?Ia<ƃLnRͳH[O \]"JIxD{0\4S^vR ;SH)Vy6[yy#l`3lfGSF^Jb>pӹ.t%Nq04e-Ki` g_rb$?TNnQNn\H$ia\r z: ө:.#DҬf<1t!1T=|?$=|"nȒ%IۘI'yM#l={H*7F c7y졞dIvca_=7CcijS\ Ӯ==Z=Klp>0f*uQ9!\\^&ʼnNnh&Ҭf0nF^]~A)b=os@(,?K5( *N7O%H# f cKoPȹYA@>T~A񬢀cSyYͲ.~16ɗ؏(V0k9θ줈" @!s*ݜPҴsB'd覀\Xj&qdy]sŌa)s943B7; OЛ"!cyYJ),a*%lF޼f碆VcSIS(SJ#߉a߃pD"H_atjfY~^. Ya8+3馛=JYlr +ȲrXE+}$tV@gN $g7oRH> `!q-ˋԃ2ӟl ë 5`?#Y2/O"9RyD>sW)~aր.J h1B{ YJwwde)a 7З~`uS2Ol濸)az>r4빛V,e3Eb32 v.R$]Nj,,WIU0,,a$H$D"zT*%"^d7?!3ٗYb^cQ8@'s$!pyŬOhH0rƓbϰW)b[9$_L ]1, g=쥙7p ede7u<@P9GRQo hd+SAoaIVp:ET4s>Z 8!Ԧ2":xymr9xZ$dG:ȅ\W2fDXD"H$oBO3!`("Cg-df22f:0QL"bV<͑te+#M=CyU$ȣr6WN1` dOMZuVM{5).!0EWr K![IE~ȓqg[Cc_ys z1!xv0Yȯhc+CzBgbA$D"ȿ!=Ù?w J1p ,<'籈f.fޥ2L()>5l翘 Fe~W ()*i15%I=Y$)$MkiO C+DžĄηy99>s!,*2@0y|Ox~nd!<۸A`>he/+8Pu0oQJ Sy5G?Y>ϵ\}~Qv2 ;ף.D D"H<.&q|븉˗)e*3Fu9ԱLq$ERlr,|O1tz),vv ixHBa,4r@9iqɆG9`)9dE6ױK?1t:65Ǐa`c2%, I1M evP5W馕f^CibMYR$ yMu~̉ 7?xq %I)3ZF8'BN.HҗBD'5G M >ĆH$H$D"̢kYBu\C 3\*)P>K?rG5{yZinj 9SIIJ,;XpȥnXJ^a˚BNXšpНe*ZhlL,"AWuB_*HPKDtט-5vnZ%MSJ>!p24'r9SD.94r+-a-F=kJoӟ.|/[mV3\ m|Uwp:5^`;1,ezeIP)|ld7Qf=6s1 |sCT "(D"H$942)lME. 7`2_?Cã,ln~74)|18J^r/SE{v-N}t$20`49O#C9D7HoI0> bx<TS6vV9\23TP5!|FvJ y\`ҟu,?!uv֓"N|.eP0F,e}T "H$D"Gz29nr[Y%K_LXƫtJC~;lh2M5%ҋ R&pߦwCA>N$H0M#MCGLA}t( WLӛAژiRK;XE{i9_Z_E|2%CH>2corIإcHaPJ%\G3V2J 3"ul/M!!>kL2Ne% Xi,q[;OChND"Q,D"H$0/q639ShҸFvxq(3 ?Yi%$͸EC3]c/'e& T(fQm$khۦnܢN7J`sZI.`&f;s .R*ї\ΧBB%la0$9a1RXA4Z2a?QXx3iaj.b22OKd#7dC$( Clg; a>OUne5\JdY"wB$D"ȟ˜j`Nzʷtr9Ca-UTRH3eTҏ_NzX"3y,fMHk9+YzRB>mc&1diEJI2|Fo$iXC90dr(e/(Psm4VWdBwOr!PA?*ws%6k\1)&E1 JtXI34Þtd븖/%ћ ~PLO${R.gldqcf3mRF_^:NjrޥMS C~dK]* n,a;Y O7f-t3 E'BO _o2!q z {Y 幾|S$&MAkiO-)"t%̣wuL+𹿛v4( IDATO(%syM=b-**4#YK\\MWDΡ]т{ZH`2݌ AnEIZXB? ^ M3O1/dܡ'bA$D"?DJfqD,O03.Qξ]kRc:}IK̥dO— `8#x y[YN;x)&hf|y 犠 cy"61 D"H/OO8#BKd~ץfyh{J8Aa'A1t槜 z ) Q~>Nr G@y;kͬ6Pϭ,5YkO3Etr~2͊zմ>:m*RZw#Vy+8|g,dH5$l%Ee<$Qb$YV26A1q2F)9na7ȡݤJ.&#<.fX?3J瞙{zo2tDD[kLC%e'Q[41vը[#$F^QEӘ>sϋZ+{dYapf_!ya='P!>'S-\LRF*fElb;hd ?OAQ nDQEQRj).|-,0ZxF~ ]Fs:e\!H0*;&z':f"J(b&r6Q1줇Nۨ0p#p"4!"k,Xp?G}1[ylp9Oz fC8ݔA9_r1袊Vs?$Ip!s$1r7:Ya mCF48Q$#ISN9A-l>c"$ b ۹Lvx+iJ* 9v6o+QQEQE YH)'q>S} KJAbY#I+즘LZII$A h `C.cy#+>`8Q.,8C`E\7E.f~Lc2]l'l^f,9F?YQb<aU!ya 9bn`S(aOzEŴ((Cizj.>9Ӹ,N|:qϛ|ͪe?]%D-LNdE/CHRCh&q*tT(PC6Lb?d8ӟ)2#RPHԅ#xT'}kz(Кw,KNbbZ `@8Pnjг{9}\4\d5|>t3-Ly\ȓm3}@W8!6"_+S|DI=^,2\Na#o G0QKszDQDQEQRFp(wEb5I=_$_c$V_emRrC*a)F=fd22IP!ȇLa A.5C/^rO/| se`ra C6uEWsh(Â((IK5;#)"2|"e403C)`& 9ߚQj~즔VrE𿌕}SKԱ~XK i-dIQv? s#w nd%rl?h{= syS(%\F) ΥijHQJ!Vxx 8}hևĄO4nJFBOd3Ë6> V3˩g#sXpE)YSEQEQo! )eg2ỵ[X߳}Rr( Lmw6i3q#q8]i{c +h5A븇-t fHl|L]?8$G d53aPH"X|.2y$BFLeYyFIA}͂((Ϟe,Rpsb!; f36:&/0I2<e3(#fQaq Џ,zB'4+. k&bC1`e;M+7#XnhX`)q-iA R' 6BjɝLM۞LG>؛ԐPLbs g0"<ˣkXz*A+(7863n&10 v<*c1;[0YN&١Aъ&G{jړtd :iy>u9\L/ʰ€8ula#+" XɦB} g{heD&Ӹ fq0] !A%#<&n6 he+Iϰ5c ggQ!\daDQDQEQEPFp)q KY%c)g q9 D>{蠇ُM߃ I"   H91ɣffx r".h,3!$IE~H V!2HCMíߞj\`e2iP1:Nݭ(7 .$f,=d46za:2*f.eHs O'nJL*KA3NE+[ c?rM19L eY 8p5X$"2 $H=8&°-m "[]q!vo>:ɣE@1xj&$/Vfq"0|zq =|z Hdèe#TCc `U&Z6.o~1ts'H0k<v ` +yW$e_bCDѿYEQEQ9ԗhPΡ,DH4H])Lg HRHjxG ipe !W,9a`'=b i`hH:eLN0E=I1D`5ykHOxA2B/HPKQ`Zifhb(KVG>͆IMdyCE$cNUV֑J"I1q.4Dvr +2d FԱ4P#4慵T~L` CJ ͜J9q)#̡\LxgI/9f+^qH"EDQDQEQEPE9L7,'0IvҟqGh q8Ew!\v 9ua(&F$L&vC+x^~B`&Kd]ꍽ9%̐ꠛ=L1H Eof|!tH> XA&%$`)vH)v0%@&\S䳊7馓8qfGCVn3>= RU*zُ\r.9|]Z8,((>PաUaotEޣ "p3P~ ژDot,$]bބz)=c9ݔIG(>lCWyP̱ 1Gmaa&MƿഄtBv2ۚiI)ˡ`/>:J4'R!t.8T$&A>"6s)`OJ2Fr?woqT%SHL)1;o'MUT75sg$ F/k97)d>7r? yOaAEQEQ9S0Na'5Lnu4"'le7d+崲ya8'N[HCCF-L &/<^Y;y>L$Ahb B@d:yۘXcjqk YzTKɠv6&vvN²@/I;4rVP6 yp:]<& F g,%QR3ADѿpEQEQy6/1MWib.s9AtA6ixțL'^XUdI:ID!fy$8l&wXOrp;X"v:rc||*mU03 tA%yhVX1;; }?']%ew Ne_f5PNfr9|!ܘ(yәO%_m2[d(.e 4c0D6H( (so2_o؇q `htQIT1Zr 'A^eS(qڨa?d;9ţ\L#I6YteɖN&J =L4@s r, vcV3*l Ows v˾Md< *b[x/QB Y˾|6 :>i#5l*~F* QRCE:d 6/lFNU0ǸC(X,Ư( (_D)'1olPV3lV:㹚pI5= IL3 !2L-msyd3,vm%JX,L%Lɖ&c<'ZG'8gHSzȥ3I>||LΤ=8ߘu|p6G,f,mN(s;GRG khgJI&Gᇭ^5~D?`44X0(Px=AL(8,(( n$yx9le<ռ 9r&]V^Dޣrhr@/QA 䄬nr,ץueCb.eGxK&xٴR82HSi]bNY7+`Z{d N졄f>a)ֲiW:F*cI"jycd'$<ƿyC΁* IDATa%VzL e;y:ֲi{92c)ia oklIQ((>?pq$$5Tp*˝gL8Nx/I,9<@tq+frGX1M.l졖*Ɛd7M<ĦO tJW[F*) A ],a9N`+IP@ɧG 'vf'zB^kH$d6y#!@rx3VWX؛)o$)XzXEA&) П e4L2ޖnwe S餔ސXN*ژ16rq: C7kš4:OGX^@N?(1,>jmQ'rYG)M,e?\|IIO.?x&LE/=\Gz6sj)QʹDMM+BZy(͂((ϰw8p=M}ڗp!D3͔.C;\rWX[ߪ۩V-پ NR줉żr(`z襁mRJ`*q )Sx Ox==gqDh"zn%O _B Cb$ $43@jxPC7rKGEBEQEglL0l`e"ꁱw=qʹ$aؗ4[` K-&nяg9/r XȧYo=I i㋼`r\ᦿ9xp<4~&kZnsԳU,&O  2i|ΰhJd>3NJ9t=*H y=m: ?V]ia?W34q4mt (wq? JPn闑 {)3Y@4E?MOr6| xy$Hl`1rb&C45 G|s9t{YX#( ((bxAc%PGe@+C<퓌}t|q,#iTr;",D-CL7 #a~)Fa:i Y >C)#J-3(ci (» {91"r3+cAEQEQEo p|~a\):Hf0_K-W1Af鴄s=b$ȁ0_줛Egsu >ɷOԆV!`!بOU^ZVB\gՃb20q4 2R8rVEr pnϰ' ~pK.LJyuh"6^e !n)丛{hW<,!~;$FVS>LN2!EZCQ Cy:ǯTn1*oxNM]^[qm/³(|Lb'\DN*p==)%>r(JTvr=`l <({&k)c4C*s>=jj)&pC`6IƇCSE%㟸"{ndk#h~K‘3=40+eQ6M))NöŁ)'| %zy$|I,cCySF9o\G6 2wL~zORN++nqolbz2zaܠ$f!mn9\BFd;wr Ԅ v沒$ja\8dsAm1:T[J(:dNF17饕8D[ (ł((i Ge"lB-fq?ׅ[Y2c褑) ,"D=IA,%l)D:xw5}K;Hvp,0,-ТE']]#GlǍ\I52QL2<9H1p.1A>i A- H|+C] l{ *:Ҍ"C'5YS30L r*8FCu aQ|6 d8B:~r -e5snȋ3$X,f nIEћEC((T nN ie,,g,r9|#s?_&h_8>&΂4yR&c$H*{( k kBSTVWf]z9VP]4FAYY^_p"{k;+ npῖ!]T03,\b:II☿[X8O7$c)3j8A"t4ltX# (zQEQE,d-H8^vRo('r9))"1DCd(qt3ydg0u4J;4oJA?;t v(}=DYte0E\84ep8R )> Wz(`1g'?Y2K-t3~ևƁG5e3#n4f$)g=q's{x Lq,(bgAEQEO0y|v~F~2(e#E)gQ<?B!6Fg ,L +{Hu7/0M: #q_w+V)'xS9jjK5pkJacd|CbV ~|F7ِ060\&p|82OkD/PB e|+ʯCe!dƯCƙ,f]WO4ף(z QEQEf24# >L g12by!cs U!e Yzi'I3chR)R4DrRCHJʒ0|3(v[vvEL-L <)q?I?o;iKɄՌcb mQ" GoȆ|B MKr#B3qW, ?|<Qe΂((x>Xj9=úYlNG`*yy:a8(r~飈fhb9{C2]ygMpϿnxۤz݌_VD$E1CC:`?`:> A~eh B Q^Bk 3AmTBq/"fD&\ճ` wOx5C7죇dK.,2èdkh\dzCY~N]Ӎ7VIvh!eCJw:Bx-'_$92IRHD1ld3F"zyv@O} E~HPDŽgQM9f74՜ռelKY\JM|GQQEQE] 8!lt&~6PJ*fPE -$$8d|~USMI1`R8d0z>QGR*FFًM)0ɒ$Q~uD#^NY|3T[:BZA5+(bdAhg(q6Is$ OuB>YK7y&5m2"_`- 3$yCrwn9\K snDQQEQEрr$XJoW&RDcORR& Ƈn>x]fZy4|e6ޟ!A Zg^,P +b%)3p5-?hD7 hZ%V(IXƵtʐPvWs$0)#͝!1ϑ=&44%dl=<ϗ:naxFN@I /1젉g 3Ȳ/}5Qq,8~*(zˈ((1K0KmJj EVN>Y0px(2O:7~q D#/nȒrZkF+gj܅ߢ>SCiȳ_t&rec(vc g63OpOC6$k /{C (z뉝QEQEu>$:(0_MkdZL$Y B='Ki@2t)'ŃK[,Ƒbp )*-ѓT:Vdi6zfc8D%>m I%<^f.ײIq:alI~O8{:dBb衋N G0WZ#-e+l;,>5.Әr q]Y(ł((7 ^f,i E Qʫ$駅XXÙ<fQ.c~Rp^gy 􆇨OS9fOGl; /B 44,,!EC(-stbV/f%=hojPD+%YB/%} 82 ,g!,!.'i#Hu ø'L IPs졈ygm^nsSaNXbvFMm8wdie0Ux|X6z) 'A 9FA|4yXL+t1EFQDG6/0n6<` y* 3qF3~^I4Q+]&7I=Sb)UQĿqlfʇcGx/U $ >)3bz="A*d7Cx顈:b,g0?bd!O;sY58 XiF KE[S,(ͦY.4]`,ƁSB^;(PE hfzj1!N< =a~ ZjmwTo4͔s}lThHI)!i`8ljŽApɑtN7#e _"~t6r'pAտ.V}P(b (J e 3_c'r8t@7#x?6SR1F0*vRΰ2t1;\·R^Z%*BaG\.ȧܭakM+sh;H376ƒ 6r(FKPL1,(oh/3>R !c頍I//]zzQר12V'B gߥ&e snTGQQEQEi3id99g즁 dI)ETq,E ,Y!dgHx#;ʪLg3 7QKW"jLPc^cI$4{ESLkkC{%(03L9?n~ĨĂuسf95?Md3dSJ)V 6C6m<= SbK) I7iK&Q\įhb)C(gٍ(g#1!<?΢I_E BB!-kibZYऋa%N;hHLNL6SD3ig4<>z*) Z& r"WC|!xͪn睊wRLq0ryvi l6FP9g@+}phl*)b#y1%zH fV2֒G3ԑfV,O0/LePR q˞05"B!Bo e~!0'Lj.?G"I 4hjKw2:81qdMɠb22 &Ž I?+}=h|ŏ{FRK+%l`CiMd%OQ@,r9FR,c*c~z*9ђEΟ^Rb0=y,/pĤov%:h(XRp)k8d%Ug@R_eSΜqe,W33I BC5 B!iY?9>Y6 ټA;Ȧ\ݜA27c%(9IWz/RPD`|!P creY9WڇᬡѝIхyN< ,o,Jlϟ]M.Bvj^4Y:ɓ]hjrT7e"3MsHFf4a9ї&; v\I +Rwc6iߝ{{kꨣQQÌ'؉WM.|Ta)nc1v2Nr>;F#ISyטD 1ug;2L76&GY˗K<ΜHFTEQB!BfMLe{1l'Uj(|#/+8 $VQL9PHMjA&Ŭ-K{.;I~?q|S`?a Gӛ^, &Sne=TFȤLBg YdjN>Op$-`0MN=َx.n8960ݙ_ͭ{5Uf!>XB!_{9et?/pJ>C>Ɏ\-~|6ёVyx,ک%EdLP)g+\:sߥ:hf0'H;ҕopŴЍL%WRõtkjIQ,O6`)x!tM*!"f(I(ka<ĎQʉL&0{/HM<ފcQ;HsC5!|@1 B[idQHshbHs'T$Gqg5 .r-琦;$ E:aApFR*4бDzvDIa?s kfOr1s1Ӓp'3EΡAl`'O6BG1/=a-'p"]x<#Sx)Z~_O;2,N~ŲB!BٗHѕ \zQƣD"&JѬfze[Wu*6A4[ kVuOc!א0ٓdK'WՔN+-PM f~IA-BsSXn;8.(aA!Θ`Op9ҝK_S:'PD&tc 2'BfiyIs(SBI0PC>B]2h.c4s'%hEF\bw$CۑEAte$؉D!dR$z)d hg7a{46җ|Ɖ|y ̋ ۴AxU=C/!B4=3rRA 7y`ސL򯦀R@z3*ƥ%\O5(/_a8қLA%٤)Mn;'v!J?cFqkh%4_4N3I:p/"Qˆ*E4tј!}֗MI!1T2xɜ^VHSFLU8398q;ߠ<H1>,"iRg=u<Ξs|Lp& H >j. fJR2ɒgS,!'`1B;5*ؙ}i b5}頕 )rB> X.g[3CUR+(9N{ZjKeG{ }6 }h* K3d*b1%=hQ,&a3Se%IΩ&bڨ'9S8j$E@z2 Q ΢r '19)jpwrs҈13 B!q;Σcfp6Sˤ-iF9>\]XCs2=i,@utz6ɒ3)ZOUfKgJwPʭs"=)id@K~L2FvfO&R'YJ:FO2 ҍ1|u,NJ6Lc0tٜH ?E BBq{3|8t%61ZrH4&6wf#ulbYR# 3'M7JQ̫,]^tNgjȴr:Qy>\t~\D37яe)f;>Gyt@yvRUXNK?ʱ'ZRH\6П؋sO7)aK|t'Qʅ̡a)0(( B!>Dʒ^Iɽvȧ[?EQJ{r oq/Ii<@O&@2 Kzyscz^Z+`]ƳE 5ƓLg)of3g ӕFvJN%|T[,j~A%d+ic C8Υ\OVҶՔGi2y$韔W(!\fevd$ :{>.?'?a@'-{ǓI:~msN%a5'p2r520L\M5l IDATp\ PB!KɦitI7cdA3#vƑM1eHFѓ^e=oayorUt g%Ht' S<`gYK`!)N;Ӄ4P\x%iGI"*X-|Zz'Ƅ$#T#@o;r8;A;80( B!$JH&Υ,bi(cTr[dW$scA4IqFRB!B(~KMq<&؟ |eO+#]d=md[=O{"Mci#~\XW!IZ!q GQ&K5h ?$}hJz+vY&œ ԃN~ˣ<, ;)xNJB!Bl4D_ h_7e1JA XHv9.5kibGjC3VD&e4әD7:,eɲ2ٟbҍ.EF:&ٓFe&Oq'ߌJ)*Sc B B[eH~ñ|eIͿ4L`%TRAP 䜭([ v릲5h~%E+9t02Rt!<>,R:h7llv 6Ɛ4M/as8x|lZygcJ +s\if)+YMuB B7ٗ{b,h6N%%MW7+tjCMmٻXY)>dˌ&R |&J+KvrM8Fr)rfm](eϰ}e;FPOhݸ9Za!O(pB!P 2ӃyA ?4+uKgi\Hd_RzhJ2eWI1t+kQ &RdћlR,d%ntg%O)<ف9,qŭA426ơ3cCysэgm|!",!Bx7EJȡR^gysv yrɠ+h\j:HqW]6"!7M@YM92yA#d&|&~I1;>,C!DXB!O--VE'ss+]rkFf0Y43&2(12Xe?dd#;QÍY*~G!aA!>Yϒf}f A!QIGѴ(f{0E.,bid 2ٞzneL'!",!Ve&"HJYtPK+bGj؃d1\깃yƱ B 1L!Bp "7Zx<8 "Ew}zFqim(/1!‡һ~ ЗpNb%x,%L:^?A!aA!%s)؁p2c!wG5,K7x#F0B B۞I7 %̤ÉTG%SbA!aA!>#j 0jJ_e^BcaA!53!/# B!B[ B!|쪑T! B!B'‚B!B! B!B!w",!B!߉ B!B'‚B!%1!z簠9uG+V8 4`'O^r|]!B!B,{}q{uuW\y,zl-o W|-:ꨣ+++ C!B!o~˗-?83U+ߺ ?kP~f]v}Ɨ_~B!B6\uէvڸq{laSI'iv#͛G8p`]]ݖ[6n8p}Aaaauu|:B!qX z@§?,4I&r͛7{=˗-+&x{#_hі[^}ޣ< P[[۽{t!B!Bakv17a=֭t wt+ 44`7xyv4;;{ڴi\{淼P?斖;#z3 !B! +/w}!Cw?'?i}&q~߹qw,..{߻꫇ >l)S|w֭So3Cn~ջWaÆ?߿w<B!B!w_9vckkyed! ή#~Ԅ甶cqגBasW3 c,Ba+yӽ1!B!BR!Bcن;~*7=p=[Ss g6{!B!|6eZتDB!BwA1P}3qG4w !Bz4v"''77m B!5H?[6asX!BlLme!B!3,E\oۆXBՠ4"R1 7mM,C!Bߔ7[/ۊK[޶eޭB|xFNN/B!B(pEAaTwPP޻m36 !B!w|5ӮG޵Ǔe!B!>2w蝖/_N,Y2v];7tM={>֭[׹zc+9fbMM?-v̙3;/p 7uaQ~ 8yᇇ^ڭ{e !|lbB!B|Xp<ŋ?|%_~W8q⥗^ 222.omܸp—ϻk+̙3w?xWN=-‚ &!§@ (!OaX>tA<83zx_vN1-?v :#OtzO/軅Gyg}QU cܹaB!pǸ3:k͚sm]7%''sceeeΟfff?wK~|g=p-wrͯ7yǝdR7}3qG4w !B gQFvm?ظqcv󳳳?x>>M7m[狪m;luRCB{wUq;0ê,[^ona)&)tR\R\*3 K[nFkII&n73\Wo  *v|{ P0 xaT. CHM T1< (#,P0 (#U 2ba@qga@jT5 Cʈ; a!*"@X aP , @OBBG aP , @(< )B!(TD@(@X $ !pP@X aP , xG':PŽHu{") Փw@Ŝ@(IHBH!"", јmll+"S%%&HK{"HOjԥ.ѳ*g*h4iG8Rh4/8MPu!#:ju3^M-,*2!T C!a!1 *!T/ CNB] ٥?r{w>C4܅| BBݺtpE<°!1j‚BwK/&Ybe޽{u]nn:q- ֮]\uݻWjLNN͚ZZitxn !K!RE',(J O>эO[hܹI&θ`B3t?:~l5 O._lzTaA Jo_fMjO}r}/OOS'6M4OJ-x5 rIw J>[:77wŦw 3,wK̙7xjU.0E y]zukט؂. M>kߡcGw333;T{"HO;W8hӎ>ӻO9$×v&^bBoVU?ag:t8''gɒ/RRWI;v\l)gR*!,޷~0kkIgϝ;{'xS)!,B[|E)2(PŔ< ޽lD)Շ%"‘B@EDX aP , @(T IDATIHB@!"zLaO5ԩӯ_DJM666/^[Ο?occۦM 쬤wy'::zw>*޽{ !"#䖨=r;Tv{;#8tG%%{[eU@ !jsիWvW_KJvСgiZ^yټz7o`< ...Oᅤ7o_]\\M|W I0\NOO:5W7z&MjT@ rrr/^,Z߹s;&ȅ |MÆs8qb)))qFFzdw #13{BH133+jڇعsgH!!!+V7oP[''+W.\Pj>RxOTyfȻbJ P#!DLLLnݨPTFzE!@X $ !pP=@Xp///kkz-\b~Jxʕ͛ !n߾?Z%~ ̙3۷OD{zz1"%%ȑ#7o^x1BDEE !Zn?Z  ZfΜ9{l@cǎ8pUӦMW^ag$&&>VqZm@@@@@VB}x✜?pȑr dE;KΞ={ƍBI`ؔ___JJLݻ'2xȌ4vI-'gi611ں&j׮}U;;ƍ߽{Wܹ4Mzzz͚5vڸ2Vkaa!h̙3k׾yf ^{QLLLn݊<РAnݺj:!!]vB^zw}K.666rb뜔TV-+ʼ&N- Yx iiGݧtgށWV C. 5~z˖-B$%%I6660!BV !bŊsΝ9sư]J 6UnYDNwС˗}+!!A\177lҿFӾ}{/رcYYY^^^B<ј}2a!?++2m3Bi!xxx߿hh|!2-q~ ez;kז@X/ ~VZ98c^^^:NGbbb-ZԻwoE͚5룏>E<(#o_ xaq,Xv޽'O?~ʔ) jQQQ>>>udqqq]v]d}]fN7o㬝VtuuYjlժնmj| Zv.~AS2W 4icǎ{{~M:u[[nYƍ,XP^G~M6ktϹs8qI&;v| %o2_ L>>_|E:uΟ?8qBRZQR)[Vk{͝;wӦMnjӦͪUڶm=СC*{ٲe)))C=rZի'/ԬYsʕo߾]txȰ[nHJ (`W%4hЦM!C:8sݻw !f͚5jԨ۷^/ZFZZZ?~iӦM tRppСC„6m2dȁ.\ؤI9s,]tΜ9EGKFFFDDĘ1cË;xI֭8Y^9sҥKu5\رc[nBOFWbԨQFB?~<::J1tq !˗ !z7xլYsG~菖(=, *113))IjСۆ NNN֭WOIIJ)8F{q>}jj˼c^wҥ*;w޺uknnn^^޶m^x!ĕ+W7n,u]sJFNNF1Qa K.mذEDD!""BѴiѣ| x333G{I#Fx̙3qDqڴi޷n:uꔼiBBB233Ong!{ꩧ&LP7䗫Wѣ1oM6 +W?r̘1WBJ!M"##cʕ7QC׮]  P)-^8''?9V13fzgrϥK?ohg1.._~VVVCMII{:B-[T}4ѳ;w&%%=z̘1wݻw~(  !DAAÇ?ܱcǷ~[1eʔӧggggddL2eƌuT*sssGRw6mzʕ 3fhڢv=**þW^aA˖-ݻU*WO!ѢElP"AZu+W4o*V]OWܹ(~o߾]jܸqo߾5k֬Y=.ȍ_<~MVC._kgZZ,|GTfM!|}BBܿ?u\\\ $$$h4Jz-=l̙W\[&Lb ͚5f(XZZ.\ފB>|x5j?~|tt1''G޲Cz^߾}{5j0QCl ٲeKVV/!Â{/8r޽{2d|W^+rg_;eԺuTݻwy͛76m:dȐ4yW_}Ʀy'O,zc~Qnt-\+/v5^xӿ1~?6aœ'M8W//,E_x1fѳ>AA$ ݺuk͚57nܸ`냃6mڬY3ß'N4iҤcǎrchhɓmll/^f=e;whذaü9s!/qVgϞq<綉"\pڵk+V={S\by ets"32>]qngдŕرcw4hoLL^6ԩS,V8xJ_m<[>eK]\\6O߀o-;vX+++޽cbbi=^1?}饗jǎmat"}NNξ}.]JHH0am? $7}l߾pzPh/\믿 2B>UbnalB2:ytGt΅э7x3n8-yq?~nn_-=،N\t/zt]v7nG^V%N^tk<B:}6m޲ϝ۷XԭS ǎy&OwܼٳfJ'eV^\b姟ܟ]̬֫W/[[[ð0, 7n\ݿb# 3yM227&<g}JYk <8&&E[n-s8I&a4/zRRRi-Q܎L|΅э]_4hy%&+\wvvٳM Ν;ǎlkk;bÂ<݋!CӧYf7o#/T+滄6s(b#G j9:]p"!eK MyT,@S 9 8E*{>L],i&T3!*2Mp 0)TDgtc(@X aj睙:%R~;&&Q vmTCsHNJpJ "))R]Ϟ=g`> \Ń3 TW.ƹwlaRX^7X/z!VB7._@Z'J@uQP73=d(@X aP , jJ&4i\^j߾9899QTaY%r?m6j#,Ҳ}m萣?H)PP ܮ{vGF !zuիm?y!D|;( 6nz{73?wƄ.BtN!N)!ı;wD@XU3M?ӬEϾի3>.G~¿_zzsN?tBg!iFU IDAT?ueaTzʥeK4hPvvvR{JJʊ'N7@jqgrss7|Ћ.gdd=w)# jYifcHp3fɍoӧ%[[ƍm oѼ]7nܢy3kkkj8t߯yl߮_}:w~a Bw޹3fZxINNb'O_> 64 :]N/0a*5%~zYoA{"BzyzC !mӧn}T^U&,HJJF0S (PŔt֍ !bbb(`TFzE, @(4RJߙYp///kkz-\ᮟջ o.}`*@ ===Grȑ͛7/^"|8oݺ5yg*((@y.eбc8ʪiӦWްaCU*Dbbblg;;$s۷/22R~١CӧOꓒ2hР#Gt-<??zĉRX vZ\\܁Lرcwٰa￿n:=n4KyA9N7 &~sj9dBzR ! :"H ҟ*K]"x`rss85J; ARٲeKZݷo_6~YYY :4%%E88iӦ͚53𠠠7oܰ~3gC|¢ݑ4`AҴPKߵ{+dz700000PZ0aBыjy9 @~[o%w8qĉKn7MݻVb()z‚Wܽ Tj ~|eF0Pe)@0B8޽7~ Tm n޼3n߾ulYle@EXbo=`++gyf7o,J &&Q vmTO]۵;OrRRkÆ;v_ܸaFM.Z;7/>|^oٲE!;wt֍IIHO͛52lQTzB|W"v&b+W.:qSN>txɉBG̟?oQ{33zbJo}j4?_}iSkZK.bbbz* ۷K5jBX'''} mdݺY6n_ ,Jg->sw 233?~<P5t{?$=A싎Bmz!DfFbFzɟcB%BTj Jw;vVVVM6]z (UOiÂ}7 !:tpvMNRSS_}U͛mڴӧsJaJ7V\\\~"5ٳw&00r)ShZ%22e˖jo߾*GXШQׯ/sss¤億?-Z;ܽ{ʪvjժU%!!AѨT*WW[nqJa<ˀbҲ_vvaâٲc^^AN)rƍ[`AXXؽ{N<9~)SHovuɒ%r޽{:n׮]w֭[׹sgN O4icǎI&ku  ~त>@2dȐ>}4kl&:x-ZlݺS| (@ѽ{_~h{`````Ր+,Dl//ߧ4; 9:jʢZF~޵O5@u tZ]nnT݌ffVxZ8; w?\dzaBӹy&!Ў9lNc|jjB߄nw(`AwĄ qQGћ/w¸^q,"(v05DD'sQvcv8 @DDDD» eȏrB\HhLϚ&z8v'hY """"BgMDCu݉!ͼm*Ex8f~(.Ɛ!mj|_Z3lJ/ֵ_moQp2&NDd$;w; L")={b,TTtdzPPjkѿ;w0m q\SXQ I&Go-ꂃȷ͙q _]]`j'_Pxeᕈ:ٳx1JKq6{ ˖Y]wlSYYVMi{/m7obtZGw&deq/#j̝7>(-EI  cԜ9rͺuذhPw :x/ǃ3hqZ;Ŵ=r+˽4^U׭C߾Aԙ3p0băźwX#;b\.=cgD؁/PjNBN"#` ,][>Fy<pJKU13|:gxg89_}%W޹4tɓQUeu- .ow !%0s&yCޅ>@RRpf޽cǢL[<$""O?+ LLJP+*Xcނz P^m8TM2JajMFCupE&ȧNɓPPӵ/;:/і~>Ÿ?GFy$}t Sa^Ym'cz99G|Aep<ލ+kX˃өP$a>̛la46! .x0O>;gdբECN-+ Ñ#pg\.LSعؿ  BUŋy3bZ|,Yǎ)WPm 3 ̕^ °EoM #ˡ^]ZE^T#v#9ŖG,,,,,!\$ղYڅk 6ԨQ(,4JdPԏ{7cA*|F˗c.ku+W]>d6jj ^L&Ds܌0JI߆N'pnToܔݮ|hߠ A}!WOZKx;ij;X|*QX.!%E7`/OX`= z EE0j3gP][1m\rQ9s琔\r!4zQy/ﯮF>r /|aLSELI{˿_q y}0\1}zT+nbhlvDD ~ bZݻZMĽ{2NkKK.P[+zhP1tn彷2 4ii3x<ϗ'@z:vFS#Iz-xARWwk!; 8qBy.-GIDAT>)̀0Wz->qM6ewiK+8w'Oi\֞"" 'N #ق3`~+M ͣAA#>t݋zx-^4;Q;HMΝE}=>gĉ (HAfӰ?$e\$&nGb"UÆn^ p:~Lik!LHƵk*HKӉ$|$Fe \x A\O)a(-Ÿq(/7WU4$&b~13\.|_ѯ|Cơ)̀0Wz-VM6%.Ch}V`)8q1u6FYXXXX:\)4jn5;GjegTQCB46nopcainر :UeWƍӂ[;~1{<66@=ͦsEDD+ Mﰳƚ58w.Oۼѣe ~{ QkNYbgF:ܻP-&ǎc̘in7G : :ldeb`99X..^fV}9Qp0ZW\4b`sbvn/8QG"""""""7_Y&"⡉6a5?DDDDDDDD= Hf|wbb mh-IENDB`3Depict-0.0.19/docs/manual-latex/figures/Stash-operation.png0000644000175000017500000025636112640746376023266 0ustar pcuserpcuserPNG  IHDR)^_$sRGBbKGD pHYs  tIME 0$ IDATxw`EݻH wBZ@ MiDDDEEDTPAD)A^I#@B+q]r\vfogQFovL$X1+΀ !hPVli<C%݆K,D5,x%{G*D6#Hw%ʞs\9.YfKfVĥxS&N٫s%;5Nxx%[YW|PH*U.C/R :G1MxQ>;jhYINN"&6w⧅ #*`փ$&b6{5ě /_Cw3G5CbEhEt# tkjSҭ]l޼ɏBˆ&&&58thC>5:2ݑ5R&y=glVip- +kgH4jY.wOyxge|[v-Gwlzyq\xA{dx9K)U*"Ex`.~JTr/^:!=sf/A.FT@jBFR UUZmv(N6ZM  O)&d. [JS6*R> >;d9nwWp(Vf{`PXSۇ O[\bBA0n{N|)spޖbu9l+?SgqB_AjwBMCQUmEqjO"Q  'D&< qhT.RqvvzB[FJ;PEVSćڅ퉴AA]QҎ]vEm_./qu^%,,4Gyx0+&>‡}z\ssO ";b/sO߀!?aKpݓ:'Ҷ1AAv9epfF$=c~emRh8kmSvA r=h}r ЍLk١Hv\paO MyzP|m,WwG֯eq⤝H'N8qi}uad鶿nLreXf繧˱6/iwsiҸ!ߺ_ҥ{ߔc&NϋyE( ҽsW/g=tؖ{}Y*;vI9~kȎ]{ҩCv9sLu"*(1Hu xFAAU%H}̵kaRԸkҿo~WF|?֎z_6S>Nrr2#^dcx}y+VS{K$wL!mDA!_KFR ј %6*E‹p-.w:wlΏ ~Ü>s^}1R ʖQ"AADDTdKQFuyd̴pi?AAA~M;cFXGte "\ `41р`@UUTUBȷhZVV+fقd"d"9ل)99e;ɬjcAAn?ƿ-Ցk9ؤ:AWn}3e s%W[TPb- w/{33֐" p;{A,N8]|ay\UUDLۛn;:a[s'WO+^OT AAuE *On.d-JpjC{؝(@d(ŝDZlTHDDEWB@!S~za  B~HJ'.H8w8 2_2,JU[hwB hΟhs.rYN9fΟlIG e  "<#*b6h֬1MhT!K2-s̮غ}gΜjܵ{LÄC=h߮ ݺv4|UfgX8cq)8ź?f7s8x(Eh޴ݒ Rjjլv$5i۸#i  -F{GJ!4bEڎ ETmb01l+P2?a:|ǎx=L BR P|9g7IƍckpȦtQ7s|[Y*K"a)F& ]pk^v/grEh߮ զC64lPW. AA7964Pͫj{ X*b!#BM(V+Ck6o/KWlm)]hx5GF*XЫ8Ͽ4ٜ> d?{eB JKtt^8z?/Y&1ǽ6# 0:D*qǝ:O)jH*v+CǶː:ۧ`hT1T{{SӋRcV>r>5mTJDY֫NXs96$HH "*rIzsW}ՊiRJٺ8_Y/:ѲQVMCGNkcS|/NyST.ᾍhڤjl6c66g2&)E0(vSמxAA0wQp^} 1>+gP]@7F'2w^2)ҏ4Jk6u5Q=z~гgOƍGDZt+PjB5 Ӧs2fŅ1}t -/9_mdD?j  QTv7+*V4M TŀbUȟ df4*TT4MŪ(h5t4?'|l{0zHիc&]jIƒlnb5'ev`^<й-=2=?dj1iŦk9BaUŠPoʤ 2AA)-A0 =1!2( `-2"u4-t!nQJ&+܉]㑡Ob*7kʗ _, )7ѵ[/V,[ T>CB9x0ZN  ,RU [^+FВRȫHa_.1U>AȚPvԄL];ӧ2!r17ewعxbXD  ϵ#)EGR8vTEuXàf$R`!t vE] fjB. ՗o{ߖ AAna')u3ec)3NE|BoUALl,e˖a|%+W(YDU 87}OpuܾtW(@N(ܝ±cңW_jתϋ~Dr>:uӱC{Z{T  p:JiD )H11ԯ_%44~}ƿФݜ?W:Vv[')!c?{{1vܻ~cަS;/;wqzs_ e‚(m)1Σ 3-8q~-f3cǼ.q 2d K].!  :JZ"#֭MftJ/3{Ï 6՝@Oի_{fX:w}(X={td2/5c4֭+˗VFdZ8'2@ ̂p'o6nCVR!ZϓAAnL&EڷҬi^ ,[dw.>Ã]S\ϞI||=GrJ`H0Y@p8~!.[.;+ZR%sgR2 _c6^TF.P8bEj,\AA![;߰97otװa=]=p3N~ŊeݚD_9IѫG %z>!1>F+Q._Ń %e;  @2nksi>=hШT   "HmgW39y&h6v 8pz?؋j_~_ibF#E!:&ƣ,wԁÇb6﹧u{ݯ[̚5ď>I-cFIKv,]OՓ y4nԐ>1QQRq  75GRl޲Rd6 /1qx=LT}i ~qjnHU1}*0h(?֣<xFza%t6Eݶ5ӬiY2fd̂9w7nSBy JbZ4km۶f-`pʕ`J,] lJ̞=G*UAAȚ^1jg]m_Dϡgh9UUQUi ArIj@{f+Br綯Ɣt PP/`ȣ`N@ytܑ?^'y]0''1ש׈wK.] IDATBFEԕ.ӞCR#Ӫ1`os/BlU}_q}2d ƍ^nֽ׆Gqc[QRL%i  w >h<ƉH!Bv+t>C~/0}ZQUQT PxE pJÒ|&X-̀%K{5k>—JDDoy)` 22bŊb #"XAAOE O9_skVU " 9b׎/9w$C@2J*5j9jIv cJ޵+ޛƢ-C͆Sz P8uϏk#}!Èak#ҹ#=vW S^?66'{n4i>+?Nr8t lٲXƌ[y0rIq ԯw~d(AA;OHiN޽;su7w\z葥xz)}zŌjw;!VН;?N%h('͊P!  89yׯ3gt7sL累J* }P͛7TR&N4dɒ\rx֭4i҄J.w}-^hРS~ϟOѢEgř.k׎LņA?={Pvm~"##փ(|'Ԯ];2d'(QUTaժU^K / kSVpAaIb|  ŒDVGR74wsD)_мySBB R@z-*ʆKAAQҊ9Zj(ضmfY_VNYb]tq7 L0#FLgԨQ|Gܸq>}oСCV^MYn}ٳ;w.*T^`ɒ%ݻ_s:t(:qqq?W^yIHLLd̘1 6){̙3,XIqW_Nx";vȰ3+'|ܹ#G2j(ƍ=*;?AȈ6m^MM f DrR<R8< WЬ썤pxcˑ$_EIGErB4 QXS$ߌc1݌t*XLWS\8̺93'_ǜ|#c6lJdIlL'O`أAA"ukϴ61bcm_DϡcMcϯ*b0Z|ᇜ8q3fORlYƎ(%K>}:VK.+kNඇ{衇>|8wRJqYF#4jԈgϲtRΝO?DΝiР[neݺutڕ~nݺ`Zٲe ׯ7|àA#]d_СF^zロ :uR)RHxݕt޽%Jp9ʕ+a(q( gϞlٲ$%%Q|y._WieT~o5.]JϞ=>|8SNV6_ fBd91ka@A뵫H|*-Ŝz|R.nOE|RO4IH¾cM'ئSXtŪiUBbnz{4!^GcVcVS8f_eِ8t=5I z:Vłb!h   !tԇ:[z2iUзo_4h{Ǐ?pgDGGc^qM4i& O>͛7پ};?*Uիlڴ ǨJVhժGf֭Gԧ%22iӦo߾tF@͛G޽֭~~~lذƍvUa+Vό'-Kߟ  OOȢx˷ۥXdIE W"` (@r5 Q(< s$9+\M)J?~19}R۱cc䷨ݲ?8ܥN42svO|0z'^  Bg]lA5x'z.\ oӲeK]UR%ڶmˌ3jlPBԨQSҠAhذ!'NaÆPhQlԨ׮]s[]#<²e˜+Ɔ O?ܕlmD#qe Ӿ/11ŋ{|3*CF~ݛsαaÆJ9MHB(VةV:m6ujWC{}~p#2úBA#_~,Y$LG:tܹsq=iӦ9ҥ l63k,Zjuؑ?mжm[>3@nݘ)ޘE۶mIHHcǎz 6дiSSϟ?tڕr߿[HժUVS~fΜɸq_~,Xzʨ>[lr4o19Oc7YlY[~T´iӜM[Y)CF~mڴA̝;Wx">x|{UNjiY2m4"R  a2jgC[yfpfV^t:o>9 wE'3ϰ|饗Otpf=Iq%3Y9MjJty_L7s*hV4'NO#sWFNjs6ya  w.ƴھBVѣnb̘1T\9כUܲζmڂŧidg^K6<Ā[~]MBA6FԞ ¤I0L4)Gv$mi>INy7i֤>|)O8H AA;=2 TT۪#? oA)m۶eРAL>7fM44gΈCѴKi F,VD kJY(䳣)Y(O|s(JH! pX޽j30>SS[ 8%K1pPf??OU L0r,V@R\*Rڥ@QoLd6^$VôMի߲8AAȱF"Rx@h n=Zf

i,@j-97"괣@0, )*7r_ToP:_N˗3Qj%1ye{ʐAP!9#Y\ci\ވCA?:I PMUy F]BV9ѹk P#w7n|6mෝ~)k&>>N:eϟσ5K( ~(R:_+}[5R*  X%;r5ŏRV5 j 40o}oOs"wk֬9N+.oiի3  ^xt6JՒ MUE[͜$Z67Wӧ֛ys̨\`٭C"%^V>|:4+Ŕ@{!^}_X"Lx5'ujW{rʋ`T݆ƼĔ/`(ȨǔOަc^*| r۵kǚ5k%ti׮f'o! II!| S~IPr7n8/D8moMf.\@K 4\%Zqqqz[aZutF<_N Qzg~DOQL o~ċÇX&NE b??ۘ7t|?kV?voqz@fq! y4=2L\pd+Wsxᕷt  (\PUUw o$AAQ)(^/~muv ֮^w  "99R%Kǽ[TVU*P|˔O'w~7O>bIZ۶cT^F]ߨ#G@?} MINa[6oȚiN5@sIH.~4DHq}e;^o! E /4.2<ݵQch}_G;t,֑(N93J:3J(W_|ȏ_@H Гs~a$&%Q> {Ա5e%*FQwY x  T)}8EWN2/^")R.8K/g;~!.휦銤$~>ңW_Xx!׭{㏩o%{I!_fiMŋӹc;W_{]PBlrDA!Zt$~~ǞBQzi" Τ)1.~9I3mqqeƾ5K/ӣ|իcҶ}W]yga=A 4c?_vݟԮU'Czfۆº?7p}IBB 0sn&2 UK^yyvۇle&X4 m_Sԡ5:IaPx޺߱{/[>~t\BIy#AA`uݺp=*Qѹ^@oO0/ Cv'")) FFx#W */ǚ?Vvzns_cv l2"6z~űcg~v0Q4<!ԪUSNIy#AA|$X@WemAV *\3{< u waҌJnR.8Mz ?k^*0Dž۟:=::r4eiB, nV\C{xgܛ)S.>(YmG>ſra7/__WPv-5m<8qϧ3/Pz]jkCYn=%Kg_9w_>(|-R]V$^o! p0IaI3Ù=,o5.;ゟ1b4 )1)z*Dd46cޥF|?goS?X e˙4ޟCogӢEs~m׬ec+ re B""zGʦ[Xr|=7mfz@WJը^*bof3Æb+<%:&.pyܹqFSXHfMyd@j׮I- wH2BS~+Α$B^=Psu'ŀ9'E\)Ĩi'N`48}M;e2>SppU_`W.&,,4]EK#.SL^T@ֳm6n]9rv Sv-n%K`){bڵkѠ^]7n]ZRvMU+g>6žx/ޜfm`"8ܥ69yM;a1.\зK.FB>y,'A2A@'w7 [4~xm^⫯fv絰"2*wM0WUKf͜F]V.P8k]m3aN~ǝq\ IDAT:ujcNN:c:?ioߎBaQ>/~Ո? !88b>m{ҽ}Y`hA@} 4 YjٺmUo[FC֒_r帺}A7 ݾ+[rQJ3g4d  ?@n]=Q.T#^pE&6`0PVMjժɃl+5i~7ؿŋ;| IH^Tb>#8(…S(,S>$ Rn4p֜laŔ.{cI4/{wE:m}i,M{ZKAR jb`XX,-fa?őeKǟfޜo}ዩQ7EE3 Nc;uT^Ǟx^Ϗc^dIӯ_oHLLÉj|_޽2x`:pO_ 2dp-őg]Q$ӞL¤ߑq2aliz-E GRޖp$t(Ԙ{xH񠂔LΧI2W<(>U˓(YBt(%%2iEqS~%g=M#v崡y7awyPj]GqٵS2ɯ^*-SI<qgT&a,ģyxp݅2m q}OK L =UiVMf[~X,f4TiDLu%ˤ.i4,z9c}F?ctHʵw%Ӱ"m~8}.4M}|d""*ƻoo|L=5S!0kՊy6%gīi&:򬜰4TBAѴNmྒ[OUD ED )*RdEzG]D )bb(4M7(*VadgʒwsVGR(GV;/*NgqoR+q/YgϤw3ig}w+yzۜ l6/HexJR|,qP~<ȡ)AСBS֡BD )SwFgI[9lM„bW%Nve:v셦4L)۳X\5^yuϙGXzsWӘ:e2>"W"hղ9JNAX,Lj׮<޳U ,V\lDp|(ImR2뤓5L )D?"ŖhѼODMвe;i B^dɻzRGRF` Lx=dp&hX0iI(byorJ$_{$_j:=CϮy; 6G5`0b4̷ ~K/cn*ء3;)v0}38ܥ6p?j?=BJ0D=X;H7ի\xX, A+VbJK w:d,-Zj6m^ǝVؼemǷh~\ xDk6BqzVP4+-!#)Lq?};$6V9Of+vq J-'Q62 f#׌]Hh2lx?ʾ J(Ie$܈?3h+S\STL:N-,^Kp,_c tI2"HgSl!zҥObb2/D߻ٻU*ѽ<\/r)ի\]Q'Y<I*n@ݜw3=~萱"T/+Rg~ze׿abIl߸VmQLpE'O2hdž ޥ`rn .I\o5xj/!(TjIϣؗB|ٙUU45f{pGye'z>GLR s!aڔSַШX 1kqZOF4ll .8Jzz*q?b6$ m2rt-ؔ=jѳ=V@n ܕ/W|GUg7ۿ_͵QTȄزy? qh4]ԥ V#ݫ7kE*7;[Ov05SXGhT5+4NTvY]FâO6js /sMdhZΛXf_U}RcxfuٳL>C d'9M[hղM67x*|jns(dv_<mcBnw=ȴpP4@P)!Cf\M֍Z {x`nf•+8'o_4[ $"/233<Ѩ 2dhw]KdfJ]^>nݧE:H$RS044@ѐLյ /\EL#*qq ҍe2ZUq.D"P..6yD"ET}޽x]d4~{7I҆.ݹ~- / 5jR x|E h5*%TDyAAATZU AϮZU@q r CVoob߰D"Emz9 —ToTdAG#pݼ*BBB"M@ ,%R Zp 4 kǝ~:BFJ%""4e-.ڟziJ6\?erwǧ[:yҩj^;W64hX K zkgӆP:tjW6\a85;^h) YvF>aT,HMMYd2VffR m ST5i:tn]lm0R)KyXR(JF͞={X`bz "Z3)4ӹsg]Λoɿ'+m{={KM{U66.܌Ik[ͺ8գ¯Zf'pL@7{}8hf1(345S d2t)A3 ! VKd_T3I*1,]y eڔy^~zpn,kV&)1L 6<xvc~U8s3Sƌ%ۋL&'--)/%33+ϘMQ23P( Q5:ǟ&roӢ'u8͛g;UO'4q,.|R/ocEq]k~*,ݻxzzJhh(f|>Gt^[[ӧsU>SNZ۸q B`ٸq^2r#Zxu녩=^zDu10ɵd||=`f@IHH,+MZalfKopԯzuڵ'gwL9Ca\vwǏAgA"E\KQVfVkMf%%h4hf9f*12gh$ h c#X9h4jZMڪj6։zs)o iР%UjsN4ժ9Rd,qkV֭ߢYTu3F=͙hZbb[׭\W7:lIƯ슥M8Т'+ֺ._>!Ѿ&wKZ (P̛ysW̝J/Rî|2͛7'!!3gХK+Rhnaa?cYn 4͛;vӥKKtnj[1rF ¦[Qv\3U#s׷7 q>lg)'VKtL W/3geɢOHG>̙;8~p {eKHI|LpW#AGQ(9?7~.k܅z;SQg5ī::گ{)~g6/[R!qzjodNj *1. = oS-7oÙ?sʟyAuj.5144">> w\##GcoCU֣-IIJl|?Zro\7{fjt4C@"O̙cܸq6n.]'Gr߁^$%GǙp*zl_֢N#'u"oxa܄\|^/LgOpvo }r<.4Ԯkǥ?|,7n@‘iRbǙg$R:u ///7nLpp0 T!~ˏ?{vѥK|ҥ]t*r-<==9z(SLAPf͚aquuvlG_kՕ%,0˗-ݻ1mP(ӛU+ U+!ÛO,feӳEk΃Ѓ?P;]:ӷSݩS&cbbOdee3r0lmla jլs+~VVܾ}#{TŖ,.GdۖA0꿗{Tb˽S yl-X>b-w\?3r9km c\/8NdضKuE^uD 52?+Z Ve)J8ܻw/ˋ@LMME/;: ;mO_Bŏ?O_ڷoǎm[ }גbܸqԨm*:a%8yz;&]P`o^ÂˑCc.z~;wzri^W_{ >>ʙ?ӢYC|֏ŤD| 9GX,k+V̝3_\K~^M̏nqjMRqw@`eemKK4~CojjADJUg7 ;8ŀ:bk8`o_%OoTy [<{668 Ԃz SHˎ3I:Μ1c'Ofĉl۶MV(h322bwAoזޣ+xw$ڷk022*4}rJ"T]v^ڸi M'Pd. ?```@pRSXx^\LX~n^=^]`$&&r@wWg.]Jb歴m_ KװI+vه\.Ʀ@kLzݗoܞ o|k]gœsgקK>Ѥt(gO_)iesC@ ADvT3j5#F`,^˗+#pBa;ҹNݽ3EWdf v/3# p}xg̨|ƾ3߇Vu$jԥ+utK, hn-p^ukdOHMM,,r:^e),7V1"L-4x;7Imustz\[oBV IDATNOŽƻkvX7Mnلgl߆_z (@ɞQKr)J%ȑ#'ىV( {gKP+] [{mhBcd4jӽ8:]` ^=HM~b-Θ߳S/=G,^#ww7.]oogGء"?WaZjWF~ynܴ%_X*n !! S  O< KH7/~Is3n:r;A01@ "EV(GǙJ///Ξ=KhhXbTEVx#sf?і04[~4F!.` QլY v "P+Ks4LHKK KK T̲,-Ɗ$aF3N@ ('KEXX(ϾK5EElBUFR6Z%0n޺С~:  ;Jhh׶.GKKo*< ˰ >!I4@ <K7xC\ 3G'ų(G<ۍr&eGu|XL[ūi٢1/ >m 7@ A)D V RPTde޲tO O>%( TV3x`!P*DRWx9n`I1Z=+@ɞe1uTBCC rZm[RRʎx64mX4=+ZB RrTe\+Vb +. Z*v[m'6.!(-%}' @ UH,)$RNܻ~ZM]޽{:u*'NAP)x>)ҕ)8jD?'VZ#}!(޻NR@ D@ Jd.30ƮjF&\=Fꉭh4us>ĭ=czqt q#9;bn6 SKj5鎥;Tρ/WA.Θ1ſJ!@]%9쪼c:+2aHƸըӧ155W@RjЪ@8?I>^eG%zMN@ T Ǚݾ\.C&!HJ%|GC.Q~ٻD_ /ºuhuS2D#T0;v"==Q#ƨ,h5d(IL͆]*k%@ G>)ʉرcE nDP0tKsQV7c3k^}skJ,Ydf<=zDj. <Mѭ*cf$+=QTϫ1PXF<'H瘼 0x`֭իEk |Ks-/.~%{'?Msϖq',$&MpuѸ_z^"+]l(Vύ5kˎ ,Q샇?,dIlڴM'6.N4@ x@ x]"E-)V\Ixx8gϦQFEJFZb+*KI\\{P~=ڵJPdI_,bjZwё{Q׀'&ɹM ^o=ev]XpL06Y78yWvs;C'ݣftޛb)^^Ul\]ı6o-(,YW4lҪ2 <*qeiܸ1g,Dݺĥ~уۢAJT&ʮ*6y&==ŠBP*J8suɛpwsӭny;2oluLЮL6aC} <˖0zpCB"/K{_OG4xɱ̜=%>n:lݶ9sjb)^^Ytܑ!{e:_+k+=\t V)9Jm|5 \.{hyR2140CCC_9BFQVh44oޜ/raE!UF.ڠ;4D]=0 'HF8}d+,$nKq??瓢0hܲ!+hiFoc'9vǎoo| /.rIX]b:O\_Ƶr9cci٪-7]*2O@7+[Dݽ{W7_ Ң2 Gj44 * JEV-+KGӗFg~{:u=$ܹsA}K&!6 V#Rn纎7^t*A. ٝ4cM4")94={'5-!.0{;;~9rwbbz~X"59DIW>*sŋrt':&F'YX@ xRYR$&&2f,--Y~}<==9z(vvv=zTC?qOO29 ތ{&00__bůN@*SCfaDj{@ *{d8vpZ%')))6#ǿZ&::o333]x\\Mؾ};J=zY<|ӯ_?֭[nqˊL&ȑ#73gA*U1bv"11Q,RffaE7W):`Mۯ֩"zlxx!T4@ r;S<AErMV[HP|._ZֳXxyyĈ#8p]vՅկ_sҧOlmm,#P <],ڵkY&3fЋ/x!EƭhLMMիz]`:u*VVVxzzҽ{wJ4GPzRcϝOHuZ*#++ y):Q#GQ (+%) @ (AA<)n?PqzҢt۵@A~(^]:q^/S>ؘ^={Us\!{-aC=e|M>W @𬑗&ѳt~YQ*9R*svvv033%p9BCC9rׯWo=z4u8KiGHAѰ@(sU+ԕ06.~uT򵹮ym۲ѫw? 8z$MXXFIu6?Ѳesґ!@ x&A%կ_CqE^{FP%%%7oӧy&IBBQQQTkؤ%sfۧ'66=zT`>|fnG.3h^RPֻF#@ J RDh׮˗/իD$22R'D#X9@ gE"*E嫯bڴikx\\sΜ9CBBB ͛7'66iVVVXYY憝qxG-)2VZѪU+>C9}nŋJ-u:`^{jI'/wwW.{;[?[:ҵn"WYPw0hyҋ_,cOiƜ?;f$$$e| ? I6ܿ{˿w.#H$<𝨻xu>=;ÑJ7q|_'DRJBRR3g'..ի3l0f̘L*iUbǙFFF;O?0KUZMXXAAA>}W汌^{5֭Kƍqrr77b^]<0't҅.]ٳg ȑ#XKbggÇcǎygRU24+2N2l'2[yKXRkpY<Ʒ_,9fkkÇS&Ѵ:"6.;G|2cqe<˿v_jժɺdUHLxx8of=sѣi֬~ٳYh 2f@bddĺuJ\k׮1o<޽;\z'''F?AAA={hnܸCԩSDk5Zs{d25k'|?ټy3;v$44ݻ76l ?:Q5u"(yl!CIOϠ? dzaq)x^Q/VVuǜu xb^ZSݭ[=qzrs;li NU]{prv܎m9r7o^X= z=U֠J ~["d( 1mF?w>CaL6S6h/[BJfw響pW#AG)p3f^X=.F\JyVZϿ!!0g|*{+pQڊG_TTnn+3&!Ç a9>7nrz4s<*vM -,ݻESNѩS'$ WCCCW`>5j>xTm*Y IDATn~y͛Zf ?윧lDƍ]vze&>>/// ]tѭ ˩_hW Rg E+V(0RdΜ91yd"##!,,XmF߾}quuag.WRU<ʺI$hBVR*ʽ[e???ۧ,rNNNtڕ2&Klq%^Ck@PV-_R>)6m刳ܱ'GG}ox}\8;}zDP7hyz~9z^^کS&cbbOdeeY7=ۡj ?vD3ss3z.2q8LuA.ӣ7Dwd'mkӳVV X%zvݻqPX6kG *PL6ȑ#6mt:ڵ __ٲe 2i$9w^#F0c Y`SL_/^]Μ9Õ+W-ԩS0p@f̘oIII̚5K/ښSNN&xG_L( Z~_ļ/sѸqc,XƲo>tRtp$I[[HwYY_M 2"$;{Yme=ʊ)~~~޽Xݔ#G)!J}cJe[W!M!FT*Çox2sgZx J+i*TJ֭!? &0̙W`,X߁C߰^-Q*SsYpo̜57χaa#g f- K]jr?:Ft8E]sKKӺrmcnn?#]311&ѣbJ\2+WСC 0zIhh :gݻPaYf\z'''֬YC- ʼno߾( B||^s.\I033˷?ccc ġCW_E.ӫW/߯޻woD*E"E)d , ##իW߾};͛7'!!͛7woۂ̀GqiTZ-*؇iXY=SKۋ)Æ ӳ,Fm۶%$$䅰ɍqy 2F-uӽqV27/FC/L]Y=IMM;֤I# LӳWRR2x!# rqv[ogŮGIʊX/G)5'!/V|D&99{829 rAc$ںT*_g̙>|'N0s擩j>d׏uIooo_ ,Zj89>|߿`'^WC2hՋ@iԨ# ;c֛mZؖf\~!sR\cjjRIԭd_b7L˥DN")1#223 扟L5OX&TjB!G$!>],eMARSeohݨd8έ$T*MsIpnʔ,n'VkuyDKƘW^-T* "00pN<\.{ 0J*usQj⁕Y7p#:ёkRjK{wYJʊ}/իW#1) D\dܐj\<02n'S+I(STdĪ.D+IN'g3d\] \)l"/aeI9dF=%xܻVk~5ʪ5QFq]Ynĸq͜9ƽ?Gs?kЪ@!(e1r,W")){;;|ϗ,ֵ 5둒xm7k2|4?CY1c'2xHd2;7K=L{5Nwz%K0d(8E:}_>\k^;2m,Fӧҿ_o>5o8|Dvl.,!) >[s<; bĈ8p]*=z_0`\]]ILLd֭DDDvZj֬Y?ۖh"v؁O[7"""_>[laÆ z_BeqҥK7ngϞeL>\+#T曥ZHWx1s CMFђAfzcSP$$S"߼YDFabj6 L DckˑO*=Jj5s˺ &cǍOV/, CF%BbbNh :ˊUV???޽ #  ԩS+׀ҢQg:CO;9,a~aC2o`QTYlA(Gst.gvm wAjrn1#O>cҥ2i$<==|HO?Cl2Ϗe˖lڴ ???С[n- ıcǨ[.;w~&菾 (#G> ==ZjUHs棲0K LZVk˥zU*my)Y(S!S,xZB.bkgccy4zǞrP'{κsKiAxa_jժ̝;ٳgҥK `ݺu̞=qƕՏb1T 93R@PO\R=ZdsSJ~iE>e=?eʔ<<޾:iZgWpx0`ǎWœKRtˈ8 e~yl!臧*3ʤ}Hk zUqe2 ZT*K]๝;eo)\d2 ٳgټy3VVVL8.^(;ݿh 3yK B 9el &޽;ݻwTj5Z-wQϑH;@8CDYA "į⁈ x+*"*+*F@B$sLf$W>SՄKiItmCiq511AQШUDGRTPiMﯥjckl_uӶ ""(.vzn~~P"#=si XĊ4>C222߿?/nt^vTTŵcH~[ԈR  EpRLh4~zv_֮]K3fa,NODFua:G˶!;_z8{G&dm~Ǐ9^}b4ؾLߎP?Ne9>etH߀8bb8Y蹴%4 SL!==T-ZĠA͕ŗ)/믓!9G_ `߿".\0GZZVAAAlڴ1c0f6n_U~X3rwۦslNgHzsqTRXPi])o..'tyǬ;?Υźux7{3f ?W9l{L6E CpRAATKYZZuBŸqx駹;=(R\xSۖgΜ9\z饌91cưi&*|x]P7O0KR ȑ#1b[|tRBvO?4{R`4(7\;w<Ǚ AI6ӦtOp}Kqfs,)'k׮vmO9_= W_8':tҥKy>]滓O?_`_߾R|D  BP/y|Re&9s& L4|n1bfpp0: x￟+VOHf>Sx9s +A&Ok ?? LWHTwo>4&>k']̣~q߮]׌*+ =?Hˌi< dv&+ٴiTWWe~RRR4h+#x0OZZR n2ԣ_>2CFq½I AB[gx#(` :QRŗx.!\ye]>- ą2dvgӻycM:F3thlnNx}`Wrrr7>x G& : /Xޭ,]՛qW?<ʾ}ܹ}/}. û]Tb0sLU-u Ӕ9߼Œ QR\hh4qYB}=L5Uo><j]GU|jt˧0 _kzo .J g(.J Ešf?_ R Zӵy?:댤*@1)J1[Jk%#0?k\H/={Gӳw4wh/=zFҳw4!!bRPU$&ңg~64v>s]6<ХkIah*+%Hth=F|%d` {x?(+3dH,7Ei&ϧGk\r*136.G8.`T؟VU~8{!UFB{噟47@V5{p(`T8^Hrpy75]Ԕ )H-̛7M61|.RwAƍYz<@߾}yꩧ\_WDXbwu7tݺu_osO/\zmڔu}bùe *yE=3*uʳPQUiK_^#8ėJC|)+(sA,vq䜪@x?b8]Ny` `2)PQ'8ėd(cR(TSQG3Z3m_)bHۗgwrs*(+G\|0EU$\r * CBG k9|_:&rp^DỴ%찼-4v>ήrdTG ]\';G3Pϡ8{~͖6nуMWo3yBDŽ`O|= h@@-O  A>&*m/AA> 8qķٻ0_UvҴjzd~s 0@KuEX3|~MMhγrr (k>HMM%77,Ν; ̙3vիWe]fWTTĘ1cgc fQh2QVf>+.Bo05z I֨ %7tgxt; G[wT~Z;Ӏ@POKYWYev0JZihY}s2>>j~۝S?,wHuݻqxр>Z g+ njm;r iw[raaalܸ*Fɾ}.ovZY~ܶmL:~غ~,_r&O#5j:B;UN\|Pm;fFOvߎ^)! -)T*ZVZ"0,|sEܜQLEĵrMQ.6Ĥ0z$G,EV9^)qfQ?_g(毉zy;Txs9eμ/IAQ74оC0Y'0Ǚ^̛[ 1=~fKƱgoݻhTCָERkEtJ{E2v>"N}\0 zEժXRjw%ѣ[neȑ 4+Wrw^08p@222رc[nW^a֭^3fX=c0m4,Yb]a^~eZ-]w/_CI^|E|||.p Ȃv>lLZۚ]/# w?̸IL܍rmf߁dMݙ0GG8̻t}x7@3ͷ'=g Pp;5>)ZAڣGvY뮻ظq#Dj ưaX`;wdv"Eǎ Mcv&3gꫯ~<̤gϞu|atGS5v.{eǎlܸ:I‘+Ssر1h)I0`4֊M(jCB9t\TPE!.Kc`N: T9{F٭/-OCUȨ9^` "7ŤPV#}9k/&&&Jt:#Ȩ *kt*鰃y꾓TWO;9]NqQQy7k+3gdɒ&wꪫD?X*RDFFRVVFhh(DFF:̫\%/Xj-ktQWX &54Z4P۹O?Vc\^/Ź7[ʭsZjZPhQg "EQAU=))nСhɐ)̺>DKUc[JKtw M-|m?0!t:yZ˽ӣ7t('̖`NXVԽmOP9}YKC_jLUW5P]mh0@AY ^r]ezytFg)[.,}nN>lw4t> B;)STXIQamyr{> CCqؿ'W p^>B4^RZ_D W3dx7?U뮻5k]ti5l2n{9JKKa|rf̘ ޽;5kcǎTUU9]tO>a޼yr-ű`nFc2e w}7#Gdڵj(G}Ĕ)Sfٲe^w]_|E~RSS0+?_1ʙ%Ai} zNgc!(=1]1:4?ZByN "97.RXD8anCT54mhY"]E2 3\s𜷙ЏRp-P=3B BpHlvw4G5 ~;tRvʈ#x9|bټy3EEEFrrrx(++cZİyft:7|N#--[ ;ngpɤ?s?rH~7t:'N`ܹvڵ￧M60M8NGaa!s 8q"{/|5ܦEE YKF!m2Wkw'w:T_뵰*F#^GףBM8Hii;ժA2O;w.,]{벫0TrFs\7*Or2 .BQJsՇ37WYOX::?/0}MK.u;:I-/{; j+b4@zܨ*R V5XQX^jQ V"\E<7tx)>AAj}9)Y~ׯO<lݺӭ-$''N׮]INN&!!$∋kӝ h4i&^{5vENN^cȐ!^{\ZW`kMaPZhg|K?j,)BA=/'=ZKs,,,++o*\dddXCzz7@qq1{s jhNj'<<8Eb X~=~![l^I&qm1zSYk:m럠Ϊd/^Xn+'٭[2>ƻc~-gG̖gΜ),W&44..1cѣC2>___>s/jkIbʔ)r_h"ev'A1XԱϒޑO wvwRdOAAHMZR 8 >cxWU%:;3'Z<FKXT<=runp}4   ]2 xF}%3ٿ+\9>>-Aϩc{w #}L*W,:o/Y  xݥ xFYKF!ҡZC |{}J>-B+yY+QAM R*](&#YyWAqI9xyJ)/KJ! =A&ބb2brNT(->3NLJv1roy5Dy'  SK i UVQz],AAW)H Q՘rb/r243>>N.QgR~ҩyY[QA8u)*fIqffG!HAAjw%9{,۷o'==gŐ!CHII1~ [W/")1Q.k!ј5{*3  jwEoGחt 2339t:u7ߔBkKu*(.)+*P$%]$cBsQꮫ?AA zĒlٲSRXXȲe˘7oZ㏓СCK!jWs( OĉN:b^}eUVwX(O=mTRkM :kSGC\G5=nI/&%FFc  B)dvS^^Δ)St|Fꪫ4hP)z~~~m\I0nxOҲ2L& 0QE$lg`05x9?  jwE+-[Fff&~;qqqnӭ[76d270v6}Ԛ7n< NfeY]|`zTZ]퓢ȈyxXm4k*-jup<  )p"RH̥Ӻ|w4i6%Rٳ\暶]W,)Ãú7mޮ*vmhDVR|Nh4:۸6VZr  SKO Q)\ɺu먨C7,˞={޽b,YB>}%22[oѯѣu@JKKYnLJnݺ8k׮DGG[eR]]M޽IMMmrF"##QTvZQT7j+kc$jœٷСĘpO|ڵg + } ^NC[NXhy'ʰAA,% asjaO?č7ވ/#F ##3f0dvIll6z+Ç_̙3tԉczkƴigĉm?رc).6[$88ؚرc:t#G4u:1?;ٳ6mIII>*R48 >><}y<&mC6 EF*΂BQ*uE[/,=d  ;DvZgrݻ{Сo۶m5 ~jfx8p /F߶nʔ)lܸǏĮ]cлu]wŲeDo8y XngϮw|3 ώ;=*RXghκ[ǘj6Cpw'[UZ0kZ,+TuDc[)?9pBAez*ZJdgg[իYy1eXdnaذa|TWW^?p9Nؿu]ZZS @ϫi&v^禛nomnShң(S;6*T؊F7O"½  ]bIx뭷Pڵ{BȊ+XjZn;˗Xo[ł}]ougՍ~]>|8,_ WdggsiF(',,9syGiq[RTUwN7-T8+lf "  B)7n~)g_cԩtDzz:}xyٸq#ϧCpa͛Ǟ={Xd wyg=ʁPTzN*i*l ip"AA5SJr饗 6R^^NHH)))̙3obXcǎ<裤Gtt4#GfСXQ\r%yϓO[Y`]tiҹk׎DFɘ1cλLڵkO?SO=믿-|PO8n"O{ dV*JXGX'L!04 }uT6,Vu  ]2GG9<:tիi?qơRXh-:c8vaaa\e[iU "P\:d2g]z6,F^XQ4P.R  #=$OYh.L:W_}p)`uX;q1JAA.G1ƍ1LǓ۷/_~u]yy9_=~;Æ {YJ! vyv) EQ(,,W_ʚ}~~>gϞcĈL:ٳgK M"&:~*ZRފ  kwXRHBn **_~{ƤI}BB?8AAA+;0k,)\h2ChuoKAAC..\>f\ e)oEAAR;Ahbpi) u+EAAXK|RR8%!  ]ZEQP(MU*UM/K pTJ^AATK & AG3g B E V@"9yR,)r˻NASԈFUUURXF;gұcz3yRB+R  jwIRtZ"B%1"rJa  ]fBUmbi ڙg8yB CR  UBm#Ljxao.ppP[ [!ZE}2AApK:D%F'NXm"P…AIsCy3gVQAAϴ j,'l#k A.:ܺ[3XR2H  xݥ9EШUhZ5U N<{gNp˽q<'T->+((АrsŒBhJAA% u(T*h4:V;1BۣGrvaxp.Ιvޕ{{&v1R؂+& vZ QZ Mp!"V-RRRxٺuuݘ1c`ZD-aMܣ&H ^_'AAϴԨ@R[E >PRRҥKYt)O{x#GX_s5r.#:n}ouC@A-.* ZZ]cIQ:Dz_SEp=~->(^5o &&ȅ :fuK޽zovKa ^ AAJmvIՄZU3ܣ8_5W]u~~~^s\_}GFV˅`f·|4)hjRzl)l  vQ+FLEZ@S|QdX;vWQQ۶mdDžPU;,XZ-Q\<#dH [/AA6XD[V)`@7FWS G{ ve/KQ)AAz=k֬`̘1jF#999:.[""".nfK ٻ(6ÿ@pť "+nm)ZZxw-Z HYdlB{sr2wy{-[ۘPD$ #44/_+A)oTXcN?B!К#5Q ^x~~~ܼyڵk+Cj5jDƌSϟ?GCdh׮]ʾjtЁ;ҩS'j888(FYj7oT߿qƱ~tժUKIJaÆVj2۠AXCn޼0wNDD˖-I&>G~ZQˢ?D6ңEx^=)uȉX7F&_"y|HǙB!IVҚ0Vb*FE?)-s=BCYժVV=xGiR ~Ɛapvvev%ݳ|(uj2_Lq3 yn.AY[2ۻT*~Z6>wf*(z=z2tO50,;|:ullj7?ΙFC$qB@!"] ɠHӼ.G#里~I_y3888Qt҅NZ5 yy6iOw VŻ03@Yb9lڼ-{Яo_6i2L87z 1oXu]]G"7+VJ1vvMɺujL.!Q !B4Z_c2yJO38!b_^=_a5F]:wKnPR*Uky^Ϥ2i&ڽsK3z8cFmE҈T9zeStM_z56obߩV 2zIIxB!)w'X Gh2@!A !RV +bעHPÆ o/>{&M'>D,B!DRb7V"/Pa[,FRq,;|gF.7ѼY9i"inroB!Hr6C~` R xr)Gx)F3@eT3[(Sm/YJ|yelnB!"Q ^i1YL2<!Ҏ=[6~7!CG1hpf ٳe#f)Q !B$+w!diه#!ΕW$ľ[J!B$Q'd"H۲gƌifD!iEB!"Q ^%W)'~Ke0q s- ,,\2F$½RB!IURGBdс#ѩC;6oF_p ~oRB!b/"nu<m=~Shڢ M[a¤x{}y!YL8C4>{&#f)B!ec:)Jdzw}PpڴUKYl k׊ IDATd+ ~/*H%KǹY{>f=wKR!B$U5)CPp5Sϗ|y`ogO:''ʗ-_o+B5;)Ͽ,g/8x0Q2HRB!ko% m.ڳOYwq5~f;W׌ĉS̞#rZc'Ljylush#  |I`# h02i4wh|G.[WߌgwӔCf[K}J9B!IVz=ϜMV-Xv%:cʺһl޸mZ1}lvloÇls_tW\cʥT^%Kqz_B/*V2 n`1:tewӸr74obV^É9x\twu0bTB!IWҾKl9t59+zx?q,Y2SlT &Hx3]8SZUVXVx%H|vv4oք&MqlڴGɚ5 |}񩅛dV<\&,, s/ʕ/#Nt:t-A !BTL.|-u aCd)|xZ SL%踙3gիW8[צx,Y2uz3魫"M|$ss/舧' `-\ysɍԹC;:whgshܹ \v'Nb4'ŋMaJR!B$UjRܹ{/&KRu=zAm\V5j5/psyܖ͚ӂE888={6ݻ-;ճF.]UXkf=]:wTX᭎"-'O] ڵ 3??у)Z0%#k,ΝEIIA@-5׋b4QB!HrjM%Kf sfoB_ ezu;QVzX,K"""\y{.=2Rprr$44=j ''GrM ^=| O>5]\qqv ''G3剽niG'<]Qt?LrL|LHKBBBX//i+d ǹPV׹-/m!Wh B^ÃId2ߋQ>F^^'"BN3ED(sKؾ}=>>ص?a5)"fByx C]J \hZ .Hc  \|F#NN+Vƍb̓&ɣ) !B$UK+2!(̣JGlf"uGHAٳeM45Z&_+,4_V˽=k*y~L_;B!Dҕs"ռ_HUG|Oy_"1jZ3+T6LE`gg/>~~(]J/AI.e*Bt֤HRB$w))`f3#@ V%P챳`oo/sYnܼ @zHT?9 c+רB!+xZdR{˗V-[qf4ҥJ&[J\B!IV "wZQ5'Z?;&}}{RL!B$+wi%[ Ie u) Rd˚LRȥ*Ba]6i@&H؃[t-%Z-Z6rygjj٥srBU!BVHjR!ĪE\":!5)!2Hr !B|犘5)޲m]&q۱_rf-~M,[~#3f&0(Çi rD}KHB}"҇I&!gT:yF 8u,ʖZ5V\=Xd%ҽ[gr=_T{25j5]tb%9},Y3Xb5ժTf8{<'OeuXud25"ש"}id"Y)# deJbA34kj}qFXZY~I' ˳|TD16oʅ)Qۮ]99Qby&L&ȧ*`0".!q՞{>RzMCR!R\H&!>Hd2a4X(Q1(Q+^%((7nQhpJDPp<0(Fͩׄ6uy@@8ݻwe_1$Fl&hH$!xKB!Hr61 dȗ7WP"/00O^|ٙ+~AНVdɔg]qn$j\lS͸B{!BsDDTlݶeJZ""8p +FwXlܹ``Ǯ rX9ImZdV4 G',\ǪkJB|B!P" E"ʔ.`LұeȐVm:p:Y .,\3fN#͛7Z6r&NJ]ȑ=\B7KQ!B$Y+Ż,ȴ1s"SFX7mLix1i¸4qRlOԬZ~ƹBR!B|r61clN $pw@utt$C|GԬQ.:)S!!!08,33ar|{#BJ^1lݎFI !^TO=k!/_n?gΞS֕.U>kw2,?͛T+f5ΒyBX0^}/;S;SE~T**Zݼȑ ^sI%}J*hs;Ĭs E?T^8=r4B͵I׫bG I閎3w k`YdH>ߣGdΔ*ar„H 1 .ȄxsqALՆ_Pa?6Ge|ZB^Յ,#x(&ɪ&E\M=L&ߎe_=ۇ0k\TG8:{QtE~iF1z Sj-<3'*Ӽ~0;:wA<stѝLYs+-XaBՅZ~4O=!PkRHL7#cB zeAxh0FX*,0yw~OR~}wrIOէ?nn9ϭ?ֵHoLXXGKl|(d ܟX:tV˺5V2ŋU?6~"Wnʨ% LÇq1J9ڦsэeK@ѳG7*@t: ,勧ٻ{׮峸nܼe3'1mD4kٖn\ ne_P%ݻWϞՋ,O1 ' !Ҏpy;Gw=%+Myն /lԨUO(^װ.ߠ)/^|&(MQ,;ͤs̀KzJG "QB ԚѨ',,t.qʃ';*LueԣI\pOr~~:x1U*W⫱#S66uew``֌|Ф<Ǵ|;Gx{gPG3m5ZFU`#U l1G׌fze:f.W]wx{g`ǶV>w-۔e#58j,ZB\9_sZɛ'mDDDR?\I}B4"88 ӬionN9lZ4oʋgܩFܿs6[0j7򑣿bʤoy-7aWlFTӎxw0sB3rP#'UO7 SHFPڵk'_%3j L&. h,"~)~R@~ ,@R%ճ;DDD eqd2ѫw?|njk Zlfc/Ao,f {"mvvٙjժLeSƍD=lsA+ôΞ5Y&2]@~kX;vkJFQOF`צ|y)cW UNfJ!H5j':PܸyS'YmӤQC<<̵vEͱalE=jNNNiݒDmٲ jiЏ-SjelξW׮,DʏQHaVc„ <~X2#qt@V׿~]x)@gΞ#((HnAZSv˩I۵kc0w~zh(S'ZS\?hrt֙:ӼY7kbOXX\߸i+`/!6=Gȝ;E3N:Ý;w\mΞ;3QH8~AT7puu?sc݆t\Z;><Qj$YMQz%SJw= atN<{jٳE\=y'Cb3,_#>g鯋hݦ#MN˾)U9B E5)ć2tPu&0b7B1= we:gJ3KNNNtT–WD2yn_ Æ bߞm[3JMp8+Rv=Μ+M[}ߺmV1#5k)ӕڮrot\}v;wAW6[,~95rhaaa] 5{m!5Bӓ`/_3V 00̙2*==?OlL{ (AӸ{?z2=b(K鲟_3m$**9ݺvLGV7V"""-[7o<#&3eMF40lJB9mnw Nꅇ+MlݩT,%mwhuΧvM2dHݩT@k!E!P֩k)fXݻխի,e)Ud\(;NYvZ//X<)1D--Xjժ1qD:Ă !Fagg8~䀲M/Ν9zc)I ?`\|13jP%0cdZY7 ./^bБ֭ٝZX_=.^ @Zuɟc;A>Koߩl[v}_fR'6@z& }([4.Y`@|O6?@a~_jQ#m.:td͒ .sevlHt:@>Y~#Ӿ;/| \ΚH>(ǏcĨ1̛W&G`4DHaߣX6F ;a~TBCCٶ}'Yoq`հl۲9?gXz W&gԮU_YHvQgOeyL<N#}z/ʗ+˼gJ90PXOȔ1# ͡]֨T*&OO.s]j[7FjVǘ>u=z?GйS{_+/W/p27oCU?}iN/3dH{7~7maxyyRn͟K\9q,Op+.'I 6G1<騑C56;C,476d=>9@5)BF۴LHf~[B΋Hq{/wZ6|5`OW\?•cн?'Ȕ<{g9#BXؽv>͇a4L&nݼń1r` ";c28{x=P>[]JBѠhjh4j찷y-ZOVV#ޯ𗏹xxe}wd2q|UFIt,im~FIе{rkM.F!{R[F}dp2f:Zi'Ek65)aFz=z=:LG"ؾ۷ǧvGAr%DjGyY4#!DylTuC!"-yߣ{!bK_HFj!B!.-H[!ƞS"*/*/T*j;!}xZ{PΣX՞)B!iT?8t/%PQ4ޥix<{J=B!D1פgG\Bhb6@B!Dڥ5U6 )a!)4B!Q&W+!DkĮs%x!!B!Z6 % {!B( $A !M({B$3/'"Isp3}&5iΓ'O%sEJsʟZ-p";' )FלH`PÇ"NRB$"i!i!" [nH+5`V7mb^nJs)}hStKXCy!ބ4B`׮=!"FadP"fbzʃ&RB$yK4LөBteBC!Җ2VUݸy}qq1,˞={Q6nFJUh]v3w>3eeɌ0 LYɓ/?;vT(_9},?{=wP\}L1Ĝ Myd C,%rB*H!Y %; B$i!iGXX3f~@wy1Gt#];wb7l_ضu3wܥw/$S~~L&6o17W>j}B95k1sTfNƜ?2~$9!I"i4BAc焋?4֭[3u'O%w܌9]?QF52f~}KŢHtWz4il/([GsP7m|4m+WH ##$$1{GeV."Is!.p~N}Dи(c =>w\8yigZ_/+Wh(U$gs+H;};a2]3B1m*^^4kޒW%>"eԚQկN~dʔnzX53ڥ3|EھԨQUɉH"X 5mo߾üt nhބf$xyzƹ޷ܶQYokuMs2B$vB̙2a2ؼe/\ gO%4BmZjAV-|1t͋#}z/ta!ziԨ!5s ?I' ed2Rx)GGn|3vO>e¤P4mtݏ5n ׺CJx7w@נ) ԗtb&Bv_v5zّ5Kч]* w}Tg뎛-9I_IrcpHɘe/^L7'wHC!B$(HpY*Wh,1G5Zo9_ׯ 7ѣ6C^2j74lҒ&K}7mJkԜ#G[? [:g^b:r8~Sa3z+1`+M1m@PP0Ceol_|i"%ھcшOL㎝iU|*'-ҟVJ^,=B!$H'O)SXߤ 3M9_ޭ3VSʧr}2r&Nj.o_ 6|o&NJ^yZڶi_{ܘiH{G,]NUYl1MpڄU"۶}'`B.}AAA:t냽\hdt!B Jh4Ӌ|Z.6?Ih4TXOZ8::i  7z[Ype˰dѼMĕG'NZ*ӶmMFӱ{>|F&4޳O|6l M=,Is!B%L2cr@ѣǩ^J^9]AA5j̫qW$͠ץ/{4l藌0Vaꔉ|QMĕG/prr5bI|i"9|(!!׫,Ӹu^76GI*2B!P_AOJpԢ3gϱvoٙ-)m^2]ƴ)Xv%ztgW~FH/^$8mB$^\nqtRiXO6o;vVCw|Xq__?r-9rGܻw`莓Kz)Q JO$44MH;y"̚=7Ml!=B!DM5`݆8:oyh٢FㄅXz%\2ܹs]射%\Do>GШ5dqcmkŊٵk7_ ^zo7Zk9y>ko`oKF 3{?|?]1THa̞Ԯie+)Q{Dʕ([4Pܽ{=FU;1Sgx9`zoS0{{{{Cy ܹB!"A,Y23z0֬@1~$ZlF5:llߡ 9g{t L߸$8ѡc!1ؿ/WAL<Ç$1s?q.]{QP!T*U&DRvd:VeݚUTZŊ*[_ߝӳG7ʖ-Mhh(Fݔ?E{(T/fm_BCq~sllPXQj~=_ܽŹ38|h~UiB!"j3L5kU\?•cнIEyo\2C$ "[RVQhZZ vvvۛ,촑hQ,ȓ'77^P;yH.o14/@cmsuʔN;O&k,VL9#(׮#_%T+̙w77ٟEwfߟŋq𗏹xxe}Lh ɄFI,iڕL{rk!xW }Zad❵lBnN2!9x ժU)Uk "_GX>\^QPA "pIF#֦{t͚֙мY c͛'>KE7_ruwYr2eJߺ-:jXoK* 66ee愅vy$FC&MPktz]ba@B!)zZc"y(bIVZIagggV}RЉo_Uiqu};ÇSttC1_cgg똓LSGG}kpzklMK:u6wz[F mvS 2L{!B R@.99HI FF ?gS0ňjxMd2q-fBLl}=-`Y|0&kV+9r{[ʀQoŋxxxp ɓ+F}q+z4޵pspg6_{t6쵦c2(^'RB!"RK!A)T85k*2fWcGc[tkׯ[? +{H^>>t҅8e,MΝc֬Yx"փw}ǹsuGɓ9s&ѣGܽ{Bj3gLCղ{^Xɹsv:Ftwim_CB۴nӎKhX*诶ѣF(nЙvCShy߿O}YۗӾ\o-[z6lgt<~m1yZl!BDc7onL2={V)>>>888ógl+b6 WT̜9"E(Zn͢EYh[Zv ʔ)Yf T*~gܨZ ÖuѪ} +SL\x~*UbժUߩPE]V.4g@BTQ?{ 1q*UFbE* 6g*Z+.]:nܼaCطgg2dՃ3,]lٲq>?2ed2qEVXJgZoƭ$)lshRƎV 29sb iڤ\B!MTU,cC e˖еkW bX OOO?~T*Na͌*EWwSvKvøE9/ԫ -|N[L܂4LnAz)Y] q>1 IDATTp->_NV:3t*(r.uY`{C]q ES(,㻥,~O )t맟~RddմiSUd2.dRFFjԨV6m48p@/VRR7n~XV-+hKO!ɡCYVߤ`.]nݺn̙3kʕL5mڴtٓ>@q뱜ll6l6V,Kj5[V_֯Oݢ Ғ\y:x۸%'_'CCC < (\+99YǎSrrrK=;`M4IÆ Sttt&MH"""ܞ,Eޝ$b37LC>3= QxxƎ/3,T@E#.!}UJJ۸O>D3f0k׮ӧOK=ޥ$?~ܫmk֬f͚u8pΜ9[C )EC ]WXXIRttZaH{Hq f$dgg5>lH?v0HCo<̌L#?v:6;P#G&h(?fΜd={Vvرc5~xcX%''j*55U 𸬢 PJJΜ9KHHڵk=})..N=zܹs O>]999Zb Rz7oK n-Zl;wNVR޽=7l0-ZH'Oٳg5o<W-P3pɄy>#[ю;519]vu6[mw+<]?}}*N͵f⋪Qn6M0Ӆ{wyGz74sL*j+W*!!A7"02Ln_WbbZlVZ(oܸ)Sݻ/$=Z[nUTT~z빿ٳgkǎ+U~}㏚={Q_GhRJ(oXA!Z }719ݺvjۍ۶n7|U^_Z^^=mڴck\tCrc1cx\F&MpZraܸqn>#߮ &hرjذӽ0-]TK.XzjKdRJ$C /"???coWs^~v.oDIIԡC{I2wIzY^3u$4k,:tNR֮UHHԩS {. WEV͚5?cGi5k^폟|l͞vJ~O%%6-lڼN?ԕEkdC_*_?CwVdwٳgեK*H>qbѻvsuӦMhm͙3S?</*07jsϔhK{FO7|+ڹ)u1<1Ə'ۥsgw^[?Rc$/߯?H+IO'472L6M'N,M8QSNbRy9SϞփ({啗ko-Io+Զݵ턼֡zxcc)(nO6hm4hn!IںmuwU@@^|i6nܬQ'p8(ļ˨'Z7-[7n!E^vO}7E_]=+44DΝ*youznݦm۶å׫?[;w,PީS'}FmܴY͚7ӸqYӦZMq:T,^ ŝnf+]HafpzYt0BH3]oB 3$}e{nv}xKFɤ.;j?if^ziWv+1PNEm^+"@q!pn0RdW@%4o3}43F]N-w09j}q>Xk a6d6'`-skEAHR5K ݪ3Ǵo{jjQ/yX&+elPbb{#`s xru5N Lren*UGӳg"߳rokddXrVjj~{mذjP?*2 -(. ( ԖE]ڐjjzYvP TtT}"R(IS2.o '\/pB+ 0?[ U+!B E,o5k'w(*r嶤jU57ZR(Id^k ײ/ L.pT)xq5Ea!EQeP\PV!bZ=. \Js'B #h2 5L!Ev_adY_@EO<{O'N_[ߍ[>W zddz͙3G-[4JXg@uBHM1LL[RPxfj]6]6C6;@\QFcǎڷo"""S'?Jw:/8 .1>xTHaD U`wAH{i{, ptRKԩ{L^{myL&jժk֬YYPrkEqqaw8< {pT4kL/q.IjР=6;C(*%%qOAAAׯN8!IjѢ:$IڻwL&m&IڿZheff_ĉq;vPLLԨQ#-[}֬YjӦ P %MQc儺E4͒rdy7xCqqqZtnVGM6U۶mݦ۳g~}'JHH0:i~ui͚5zǴtRxڰaF4jƍڵ֯_XOM&x c{ɓ5p@XB<VZڲe%>zB^o={ (U"T{9Tp,n-YFǎ~m߾]7oyf-]Twy1Cuмn:͙3G[4vXIR|r=Z~~a}g8q>c3uYڵKǏ7| mݺU}j"##u}iƸcǎiҤI6l S9R|?QGG?~DEE̙3n:t蠬,]N>-I6ŒEGGkܹj׮jժ^P69sFu13gVjjjKי@H 5sL߿_VUǏܹsJNNjUjj `_ӧO 7^&~ 7hΜ9EG߉'/*!!o>ũG;wn|_ׯEϛFHSN]wݥ^zIYYY[K/y53~Xzˍkĉ۷ܐ⩧R\ yTTnV͜9(ו'N,:)3LZQRp!EPiF<7n|Q\NBUO~~~B ǐ!CoVZFyǎc#ܹs:v4hP䎹xbSŋ]K,ѓO>)SHCUp3v'ڸq?Ԑ!CsN 6eL&9"׷sN=W׮]5|;THHwM\[Ix hEr01]vQ\sMׯ__vgXzRhh$)88DIDDDT7V\ Qdd1-Z7W_BСl6իለ9sFtܹBj:/eeei͚5ի;jzСz衇԰aCuM5j(cN:i߿mDžKhŊ^olVFFj֬3oJZZZ?N%UBB ד5j{3f4111z74S5jgyF .UvmqnGRRLym۶zǍ1CBBH~]tõn:zc %hEoٓJ1/rlEۓziӦ_~Ӷm햣ժUK/Dzݻ?6oBuxҤIUb3->uڕATGRzoOM_ZP?Cj"ui}+Rd27Ԉ# w:^<>sծ][>ƍW6Uշ~ھ}L&n&-ZHjұcT^8N={VSN՛o]ڵӢEԾ}  fF2c eggWzWO{N:͛7뭷Ҝ9sxS2#Gȑ#:|4i$Ia^t:׿Uںu4j(q)K߯SVzg̘zH~ղeK-^X˖-M?Ç+<<\zGI )ڵkqm۶UV$)K߯4M&S&IWݺuUn]{OԨQ#*%%~Ǻo1?~)((HӉ'<.YfM6* @ڵ_|jjf͚}R޽Olsسgr9nPQ4m4=cZfMu}'zgQiiiJHHb)DiӦƻ=n:YF=.]Z`oVZڲe$)!!AsQRRRRRt}駟~b'AQFQcǎ԰a4g~M ҫj>Rmۖw >T>}h޼yڴiz]yyEDDhȐ!Ӗ-[Cj:dn/r֭Ӝ9s[nEcǎ-t :T5jԐ$Kj޼n& 6ѣGGiժUFH1m4[NVUW֘1c|r9}gںu5oxo߾O4c cv:}$);;[k,o֭teffj4h;{SO= :f$EEEwv]%'Ђ (%%EgΜ?_fz5sL%''ٳڵkƎ*99YVU0`e5]IM6ZjUN|͆ iӦ)::ڭ,::Zl:{z-]~7Թst9-X@ *Vxx}Qq+WTBB7n֭[ٺ7o5k_T5tmi„ 71cyEDD7̙3=.JK,ѳ> %$$hʕ}׺e2$9sըQ#m޼ٸcʔ)?j֬(>}z|-\иnSNU^=?ydͲJ›}^:v C['-^X={Tjjbcc Xd|IM2!ŧ~!Ch1cΞ=+I?nhbCHK+ݮޠ#F(((H}Ν;EL&ٹsz%uU۷ozwyBBBԽ{wv* 9xz5khʕk5{lIkf-P>jnذΜ9S`|vv5jtTn]IRHHHP~}>|mbq4++K;""= }] 0@ V^K"""zZ /U]tHq_~)0_~Q׮]=ΓYr.v},UɐJWv Bs>^WPPq믿*55U>1KhŊn0P͚5q9r6nܨnݺ]r\ :T=6lnݺ?FeLөS'm޼Y׶mԹsg] @{Ν;fO?Uz$}.???]v*2S /@)t=hꫯ_tyIs[F.]-IDAT4|p[Wn]vmj߾&LpqըQ#=3ZpOڵk;P^i4e͛7Om۶?պRv|<Νɓ'+00P111F7tyvmӵ^k|7\lgϞT/jlE0Lg>͌*EWwSvKvucwI cϞ=j۶-{=DlYe6ujU?Tz/ؠ22Fў:C~+$Hvje–e|%|󄏐iu:_ 9l6l6Y6Y,܇j>i}@ٽ{fϞ'L/v]s5Tʼ@y5k7o#G_UӦM+xZ_*#Pn-_m5x ߖǏWʼ@yظqF0EDDh̘1ھ}{2B *!!AK,qd%$$۱cbbbFiٲeFdҥK?:zhKIIQ``Ԯ];}2\zYfM6& ?6mj ׯ__{-TVK2={ u ҪU+L&ڵK:uΝ;e?m{W'Ob =#{-[ȑ#Zl^+43gO?NL&NUl٢5kl 3uOKe>RmۖꫯSN[QHҾ}#Fȑ#ʟ~ih4iRիRSSռystM6lXΡCFINSf L&JөJ ={R >&==Un\|! 'R@H\B:t蠷~cաCv +mܩS4h f͚Ç-bSeݻ5{ledd8az{n* o]Yfy:r~W5mTJe]r*@[|rq˗/nA? ߸qF0EDDh̘1ھ}{ee.#PdqK,QBB۸;v(&&FAAAjԨ-[fL&-]TGSN)66V߿[+ɤW^yEW\qb?~\}U:ukơBM8Qӟ մiSc~ڻwoee.hz-'JPjJ&IvRNsNl'd{&OjŊzGt=[lё#Gl2/4Hx/ꪫҲe4qD͛7(?pۧ 6(!!AŘ/66V֭رcyP q|FFŒ`}rrrb 2tMڷol6^{5uͫo߾Zhu9ZJ{.Se*D||L&=JLLT˖-ժU7VTT4eʔB3c = ՜9sꫯz}SNռysu҅7 >aںuU&PTtYE3Lg>͌*EWwSvKv#G-ٲmR똡R)]`l6l6PE$I^tٓ@gN,g3p8ddddXrVjj~{mذ7R@Hĸ@y (얳J;QRf??T.i\w_7u/TH U32]վh}%R[wGrjp52P1^rجj4TZaP1\)(팾:M]T˯䔸Nkf?]ּ:[VJ\)(î㿩eWINr"kRƱ_e2ѧ7PөJ E^oyM&s39d (PzI%(c'?B J{m2Irt.et:=Mk/Ry_'g *{ƛVRpg7{fN@^=*tTÅ#yMH(e??S?0m8$$D]-yU ԯ8&ZRpJ8ao )0~X/# &v{lӧOky[oTۺ70(qԅ8 ( +)0~\/ *OԔ/SLMQֵKIucܦ/jau )hI}H!>W*08ߒ5 )t䃐א"ro }R%mXܗS^Vx#7`(,,Tspϓ4Snܖ6B!Tηp}ø 0n?ꊐajR>՚{-%!=o,v-e[ߪ,\Ƀrq )lư{PSrsTZRP:wmɱÒ:uꔚ7k?\W]R{4h@g6?PÆ ܶr6x5kz*GВg׹w>Ek^٭$INOOxT-ɓ'+O .q]ygnUX~> "բ?ЇӰ[o͗\Z5kѴ3dY+50޹!!Xaa!{D-Z-I^Gݧpѭ[>4"*GH@k'nT=9qB|ZWo[ꑐ|rJa6[nGR$)rB>Xt}%ǒ {8TFi)li2.|=!.LfBkLaR!rB#(!/HQR++(4BELf9ÿ|&y=+!.Y:>%[&YatY. P9%Z)2TF 99!OV9V*@H|! 'q&#z%"}Zmx@-) >B )O >B )O >B )O >B )O >B )O >tfIENDB`3Depict-0.0.19/docs/manual-latex/figures/exportanimDialogFilterView.png0000644000175000017500000020000412640746376025474 0ustar pcuserpcuserPNG  IHDR_ pHYs  tIME /50 IDATxw|SUlҝA --2Z(TDTAPP% \Aą> KP( hi)ni6m3I$M~In=ܓ[g0Y1{.-%h<. "0D︟:YOOx&eYe<2!tv_tPz8Eѽ Ã8T @kAD"VH:f""Ɗo%RDx*Yw@V˽DjTT*aVEjzpksL>,_/0Ґ7kQBk2Macx _Q$&^9t#QuܼکS:PSS0 98==dmBw0qO>1\*L]stshIX-+/wqqe WWotʬ?] G ~+kR&Pz8uNZJ<!s/*.H>W\RTV<8KOϼx\]m;PvG%H.)p)j)7oQX~|ڥ4t@HG]ژaqaǝ5 fj //O''G'GKOɖ纺Œ,0 t&qYbHfڐD{s"䩄l9wvr/ΩQQ~~aSOЀJҽTTYF tVkKbRַ@ VT S"(8(P y8)GTI7T7<)Eu TVg>KR?_7wDWEh}.]G.%"H%ctߤ.*J-uuq1l0q3AmtiFF&^׵!! 3/ʖ avqqjjfA)./: U*J,I<]۠9 c;BapP`zFfAAy{{Z2 pΜpе;bW::;YP./>% a0w^Zwx/E[H?QQܥX>TxKJ*ek bvꈫ<WgWgԚ۷]\~1h.4QY$"77ׇG3qrrqW8;;UP(dx DDTr!R6'mqgemr!ZVk}z |?_XTVV^^y*+*33#":v/^>4" 3:f&O,+**N>WVH(Fۥ;;;CdMGZ[:u 7 =َZ6+K^qpph܆3kmN= "=)PofM vQS|U T]eHRV`H$^:;;pۥe<O"qADRtУ=wϿ蒹I$]_ /,31a$A>wbzFfzF&1]"+ <]]\Xٸ5m.`ίo_aR7ٱTQRvmt# ۵ JKPT ELnp3_/|HDa[!Z[݉KP4 W@kT*X,jGJUSrp,Ǎ7Z jjTjnwF*4ނhrɆ4BQlMM,{kc4hGկ( "2̫*"9V` D"HlQ,b ÈE"X%iB^w%{&12CGɺVxZъD}, FwD{qB/qKǫanN?p:_j*y<*:3ѣ;*xh=>uC wqt7:@  w'`y GВGDrBQhmIн b-07(045: ?~vCtCtCtCtذϾ333/<4rÇѫ?oZ"'`䩱ݳNRԪ#ܹM6ѽ 79rTV}ΒwwwWe/{^w{-[{u{^ulyNMuM4Z-+簬 K2mn>X{o_ZVV+{7Î&3}?h֯o̻_H$okڤj:<<&W^HLL ?=VWҲ2Z]^V/ e2;f!<\D)bauvJݝ|}}eقBoo/Ϟ9TZSS}FJ``@@?.z>-՗ط[ii5y葁ǟWϟ𣏭^KS^d˖323+\cs3][v!kɳ;w1u "?41 óz'M{KF?5~Qڊj3g.Z{L8nE#G {cL";6o;~H:ٳ[; ?uʤqܛs֜'O~ascnjƍ}j/6/--=zĖ6Zxv{ jslB3gBCCΞMmCtggg[[._uϮ..\|?S>>M@\gcg C"L#/_үoLbbRbb_M*99cI>0i&Oz>vwWLt ѱ[3g333MrY":s&oL uB7)WW"իgǎNğul;Sͧx6~ҽ{We=V3^{pKqQT*oH$Çe޵{͜]ߘ3g{Fw ?X†:NX[^^EK,vGTQNNd<8ζC&>s6)>Dnn}d2?۶{yym@WnP?ry>iA7^1}VZSUUED%$jSSSsۀJ jyDV7n>)6V Q=ޞ OWU)w٫Jevۆإzw;??81h pDkj Ȩ^1+Wf׫OoAaV\vñ>c]v1㴩SN[&&7¢qcBaTTTFD}F+J [>6x =6l[.y=bfY3 7uNMnc(ܼ|Oxh222tk >(tv*'L2yذdz}|pZǏ4mk}yڇGR+ScR44 6>Ahhku6]CJbXK e::Po,A$zŅ@wP `U!:ڙY0`z ˥\ʬtPMgQXh8""b\>*@3Y 0a O<؋UM Ah,9r4yB3GQ*p)S_0aߒ>w.WWԿ :xȑF FD6K!%>pdW}''Lj bUӦ@Ym_sXV[k/?[,DIJYsjorD $"?W?/Xܳ0 3o#1{&cqŢ?uʤqܛsUg.\XʼnϙLSǙZ>#G=7Z8 ۿ_jkׯFͷDO?nSD7&P._|_ߘĤ$UrrrZzFꭴɓ^$"a&gb]Euqv =$%_Ar7WW':`kZjY4x~РG zN9ҔĨL:JEEDyӆ_o_aܷ>|.MDbk x<ކ_޽+˲EERT?W]匌VnnɃ9ht0 գo{amx&@+MD<;/PRR{+6oll_Zy{ץ1ϲT*eeBNNNٰuTaD_v)*,V;܅FX|X,6״3 ǎGzFnܴY=.tID>)|>eYCY-3Nğl9*Ƀ֊X{"MSfX|sL.7c4Lha2(4q_=kaSSWWW B__>_W^%%%eAm,j??YJen^~Frvvn0yPC67yʴАw-oII9lē{ܹs|fl׮oADnj7YPW2CǏ4mk##@j۫{݇ `g~lE888m\o2L&jmxVR*Q 4^՘C=Mԣмlw.;}ڔ6m ѣCM<"ݎB"!O#z[Tp\ndۼJ"8iz`}jxh=AnZL}}㜭:kAt@d}@twhXDtoV-y%qH|oh{ˁHB4ԣ;vXbEYY~֭[;|={#hFnlձZG@ݙD]`!.]&ؾ}{キvZ 6:u;jԨٶ}srrl,@osk/[foM C"Ѐ1{H l0&&fݺuf1~W^rERuɉ***===HT˲999<^PEJJJvv[.]BaIIZ}vvvX,"t//;Pk_+Wm6((ȸNNNj8۷׭TZZCb3˹ ^#B4} 3Hܫh{)޻`nB݃#bV-5 Dttt\|^7n5{zz޸qo:t'f̘NDڵk_ީSӧO?S9,;~gFDDz{{>|?yg}GFFn۶m'N IMM<|L&3.Kzzz^r壏>1l7C ݻѣGk1y ]=zd+WO{?\]]Ϟ=+J\|K^Qz &Meҍ7g ط*dp!o09sŇDsx4+ի7oޜvwM4i„ 'Oꫯ&MT*  SSS(...222..NGe{Ů^zСҥK;w$+Wviɒ%/^ܶm-_֭[GIMM 裏W… .]JHH.\ȲILc@:ϕ+WΟ?>sW\qR駟T.>(M IDATf'&gm/۷o?~ʊrZ<Ƃ[ٶ \ ;C3:\GА{9jԨŋ k֬|2UWW?}ݻw\\L&KMMw=rdjzݺuƍ sqq1Yk׮k4'Ovvv&A)\XC&Ә<΋/HD XtkFDb8::ƍ+@}:;[/j slG-Ypv`]QaAAwX"1DEhʕ]v7o~KVV[j~KttA<==ccc 2s̲smݺVOWXz'~'e2S~~}u4tuObD"5 W4;BpO9sqyY g?~iHL+fk[L}ej z  )\tC/¢E̲-[o4hƍ O|}}Œs2dȐ!CT*զM&N8l0ggg!~֭n-Եh@0S!E=0\^N惍Bl$= XG-`aUA5 6;`Itw9"1ѷD/r/^óXto 87߬$";j(&&o4h.X'גP$EEE,իeٌ "y_~i~_#(u@]}O>D̒Dh\y~18ϫ>EX@] xw"whrс3f( ׷cǎ2lΜ9H$uttҥ.:PQQ1p@}mVׁ,WW7@H 8 R9o ͛9s1]Œ8~' xDUD "݈@c*F`2@>Rp4nt qcaZƉ|~cAa7ۿ]HuK)(,=sss ۥDV $ EExxP(-_Wp}BD;2h'0&1 W{sÇ~0e hGVm;tԇɉV^{y'qqq&7ߚ!<]o.[3I7+++7}񹃃W4MfqRvЀnFOL  Պ DZSOFDD~h4}p+-]tSN""[7}[Ҷoo.[9.V_xqJc#G -;ػEmIgHMzM3_CBbZ"'Z"-hDq :д "rvr2u+-]Tj[Cwu1O=IDB0"SfV>JhZYM#4Iq&*o#O<8' /kg$O :Є4h<==(7/WXPY"ܾYD(Db\BPUG -;p?*0̾$g;%?1, sD)DQL cx D%  #ݺFz+''لCJR"*--jsw[;hЍ@ԫĻw4BJYzf')F?0WT~~UPXi!݁/<4rÇѫ?!Z93fLo2?crp+ʽxyyu̲\^~~Hvr޽}-ٱm<7vhˋ=yyݻwӽJݺE 6gNDc-/6m+wwwWoz{3O~+- %Iv3^^3^-&MڵkلsII7.;gܹ >+8(Rݫw)w#//Onnnnnnh́>S_&ML(.Р׉& Q=j[i;wzY>DIJYo~նz9O:md2O9pb'>g28nE#G {cL";6o;~H+E"6}0]1} }iSL8nwp}4;>g&ܬh׮ja2gࠠGXR\~s$&&_M*99[D4nܘ:)#,,,,/Wr]'a={h1Τ|ΚqoٯDh_t ''}h4Q*-**6"#2}Ux6;P{,{g\/OϺvG b.QZZ*HtvԀ ۺv1cAmaKPs : ?Ү]`@@VVL݄/))ҥ1 ^66,&#`+JeaannzZf#h 43F<W_IWEB\E5RYVV?W,|/~|>˲ryeddN.>){f0>+V""kZ |Ҳ2<>߀5ݻР}[cФo 9@]o,g~}oKƌQ/M>j.ӦN9q">"3&If̉TW0QbV^Y`O?JY5&J8{o&_3~}x>&h V?YP' 0Lh 8O6Q .W֏u4X|GP'Ľ=/ɎMS+X]Zőƙ)?~5HQwjZ)C&<>?I(0}xm,_m}}L62 =5"ؚ1{,@tDiQe~rY8 6[[wcia# Ut@Rh%cCL}L4LshU5Z;-:JXށmfq09cQz@tUp7 Hk@]%0 :;`aJw'G{B'GGTjy?IDR]Hcyo"Zdټ?iT*UyJͷߋD޽87ޘ=[α3_Vk˖w|{\]9{<|)ā***}rttq'UMh~F܀}ϑiXwT{Ж1#@6zkO>1'֜7l"oܸqݺut#911Q#hS?ǒ[SLҽ|yK׮]7NÎzml\.|J1II~55d7n+յFͷDd8aO9::QߘB\{6x{9oz3gjMJ͛7SkΖurrMrFQ(Oh^,엮OV+=ceg~8~f>gԜ,^-m>-j bV(((7m6zzz}Ç D$^Cx""JJ轥ZVRZ,4r,zZmK>x͏?O. iyIhjk^ qX K Z^ri4Mʪ DPaI/MrnݺnXN(ڜѣG322O~fϯ{+t[yn]t@*TWU1~E___V[PPMDYr"2le/c,>>>DRtO+6oll_Zy{u7ڷeYvzWGw5[6p88RID^rE,f2S_voZP`ر@]gr8F4M ݼiss >pEbqWT]USSo:#DV7mޢ;99EwM.]"/8j>[߫g.R`|4ibX8KH8ղor/<'-=]pq]0~;̳/zrgaeg320^gINN),,rvqj5;ޕ-'"GG)jEmyݝi2[#,\xf֪N_+M&mj~y,궽k/ClGϿѬY3N<7 Ա>ʹSN̄ |.];OL5/\UUΟ55}b y|dTp[&/_]xTF=DX vקǍ!>KIDE^^k>Xyߓ^zyGGAeL<̀`yݶf?Sw_5F4W_n`Q`'㲲<uljGק ٿowAa!C}hlۖ/ _J NˠT*s==<\]]t.y02ޫGΝU~~bf5|qss koK{zzQNn!޽zSw߲嫣JcRf t{iqcӁ871ay`cR Ƕl|~۶+4P/TNy/Юm[KFU@uo8cYvݺFzzzgeeP(!eY陖ƲfgDo3h&dA}'9,g`?;~8< ü%K?1ze}|-} _$qpptr,**,DBD=|=;vb:T 4Ks h9ʤnM|.]4_u*BDmo\\\0~./ר5>>5#D|6T&@i[rzT,ɖx}nf5 F :Qk fa|[6$̶9ߐαcAt8P̈ :`Z669nۦ|Cks15 GشfcDb?VD8+umh[xiIٰ#Sw&RmA4hfZ6܊o6-gY7[8ks;:/3aAHMZ IDATV(T@sWvGg캗U6p†-}We]?&Ct㰠,FYI'֕ [eS9/3;q6*Vhv[ݰ€GnKM :3&ڰze5DҴ٨/8h]Z- `ہ Sl*d֜=):@Y`' %=JKڪL8+o[2c X>˪He9c}b@#Fy{^A@3 =Z'hԊe_Y#РgY3 lx{3n}{ [cqF/?Ox Sκַ]c~>"P @x%HTԹy"㵓Q%&@x# KiZπIXꄥZ! PرcGjj*999EDD=ЩSOD* tY(ӧdggup{ { $k EBTS]U;D,jܹS!4`(22r"xرc5Muuݻ###Y?~ٳg#"" >l&C3 FïyW9t(rr(Y׮]HNNsay\7dZ5q]Тy]mݺenݺi_|q„ k֬!W_}uҤI/^zC R)דQx#N-`򻇄+pTuh/]]J "UZN5"F=Ji5'3meI.I=x<~wV0Tu -}3hZ]SU!8"N|!M#:@F=믿޿BO;utƍ'N̝;7444;;[&u֍7.,,|<^fE2 9Wת49r!1KD|&PlK%(Yn pץ*oR)1!.Nh^'qAiέwx^|MB;ώ@V""|[f d*4R'9љ+ZenO}#:`K ==ц}G1w\'' HDDyyyK rss{o߾O?tŊW?~{;(E%ͮPf#{o5_)s(=Tj:'-MS]"*-F٥SLVkHiT<ɝ㨪8V, NnՊ,KE;jTXV d^(SWW<7C-]OL O۰At/F;~ +RVIĎD x<~";V&bdqTyQ{}45?ou,M MǸhaþzݦN^:|{DFui}_F#%ɞOHб/quq:~I~QEnڐu$ne>կ y ,\S.ז Յ0IXxNLV¢̀̀/4p{pW/U?kPߞ gOY8{W3'ghGTv c'$|{"oGN䱞9mmu/7q=jbl8v *O^1y3%՛~dܴ5U ;q22OK  ׫ GQ{Ms1s /*SLP5}"ؾXh Ϣ ?,ɺwRzesj^y3˩?5̴Wmkm8{kkm*Zf R)+ZKCK՛d]$kK%?m%\= -|C)܁k׮b̘Į]fddNjD"+++ J lڇf :ȵ̙,Puɋ1{~B-m "9-185Z +l NUK_T.70VԎO?qҤDm~5#>of "LjkmED߈$rI@ml)mjQQS)*Vgf_TJsMJDaN-&n?<_K(.!txZrU2rL =}AD<-ɊYEW'g^Af",[7|z4aЈ%~z|/Y~B6Uf+g(7olvɱYlv@Tܼ옰?Cr0G?RLj.ɔutl9\*deE"Jj;#XE?as8,"]c\&Qg!Y,ָC8:1唛ODzQ@Or 9< X$əlUU5Oˤ,WW7"ͭW7^NO׭C?cDb2yq br9r@".ͥ['e_>+arrlfٺFOϘt"DLJNn1OUA;*NTVT'/ݽi%?>!Y.[[woZ ,RF%Hvn)품Σ"2n~>%'," "X.*mf@@5~G]g ظbG]۵n̰zȿ`}MD<U 6ofg^iYѝ\bYl6MD<;44@,f>;%9}Ykn\/M'{!"M]3:2ZziJ<f&O[ג^)>ZO-XLJT"ne3k7q sWl 6944UpGCD*y =d='?n$ӗRT{K~3u.Wfq0n+{[{[f;VUY@=vaJk,rl~ QJx!SLKD%Y)o5MmZ$Tjf&cl6{/ܜBSU"*g$jief L(6$HnѢʿgd$ŊKJw{JyQ\k7Hb,[V76[zؐ"bbDEBcK;-씷:r4%6R-,Ղ,L&h-[=«Ru& 3% ,uϚGoyPNy陳9ҧ/ʤLQU6\"XlJO*lPC" ZqITb)^At@Sw,SY/Ч3RlIbIUUS,B=3Д؟lKpiH;0ݰ s9j\tN4)L-&ļ%%SS[!40[] :PU}dr""¯"P1.FG?nddԿ*GG"*1~~~C ),,,˗YȡC7UhR|a1>F/_yI6.ߏ{Ͼ8hZbkkvZ\.J׬YӣG&RP. T%ua///333TjccsIl`wjсk׮)Y,"=(([F277v:6CtSAT+VVVW\4d "x :Aue劥YYY\nrrs%bq^n^JJIXܢ✂,MMMXnoo$|\(3--MWWW]]}QʯX’}}}"***533%"LnbbfWn;;92\nNFFuTόYs.^T*qq/n޲b޼8hE>6ou3޽LN)|6nLQ7njTzrSϑc ?ӽg" |cHU6vtt1sK ?!Ԡ8LXɖ$LJbe2YddTHHhQQQW/((`)h-+)(77Y...IKO7<-=] GX,Oiy-Cŕrg !?nY .W\>| 4p AAU g]ѽ~'X7׎))o,=o٢ţvvwV@) oi>z,ttغYGGֲ}P mk׬~QxDP(. u"tӉOXbiN/w#N?zy7{' |1xygN#:zm^z|Kb< :P:VVrOOLL ^xaXX8%%ȶm#KHKKkg]h׮T*=˪^l۶=Սfʫ׮OGÆyԠ6m,3񎐐?~D[L&_'N͚9_544~?tx 3gL]tX,4y;C"7|_>ӧyу6|ԉLѻw;~ uvv"׮wrsU\[Nm3~@s;fluЮD֭[}>kzVINNa{~٧Hi׮L&c+r~H/~rR'}{Wخ]:?z쯯ѥC]׮ېbwkdga!P  `,MlaaT*RDԮm1TUU߾%ԐٟψzMD&&QLLӿf=^$ɮ߸5ޗjXI9Ntt.{wHπg`@tbXr?|Lir5P/]:wxnݹq`UUR*)kǎڵCF665hC'WN1T~UiݻwrYي +**QjZ:|bgg't \<{$wZ*C%常t|ۦM+7W?T /_Q MLM"#d2]:wZqM\\.燐.X,a{Չf;s}.84uּ#IIɏ_s\L&_RS*ҡC{--޻_>*U/K.vt3559y򴁁l( ݳ@_>sw90k"m۶Szvf4 ڪu+r3TTKMM.3׮ tTp82<%5xZthsמb"Ϟ)P|2wAUsqqѵ7]\QG'NouJ4s8*rpR)>^r_{ SR uuuU6mȐJ^b*{,[N0557f9f_>BBUU6ᣍ~ݻu IDAT.4h?6kвZ娪iutmfD.Qaa~EMMM;f XƶJ~?!/|>qW~~@W>WteåKV,nٴ(-=@__1UA){K%eWUafrΝʖM7:]'jSU'>ıMMMMMM ud[>|V+:2Ѵs˛MΈ E'W@#t:h0@.^xheeu5AC"_S,455O峲F?uuuOJur@=u֕yǣG011qEEko|̜o_ (s/]eddmTq+ 噳\v^U^*%&&dzURܟP~~MlǫMhN3<,|oaT[.+W,U\?//?,,\ 0WW(E̺%%Q_Qbb7SԭիdcR5v(,"zg/{uE_/Y+z2=]]Ziii[䄅6SQQee::=;[hQUirqqqRRrG)g%dyVK^?תo1)[}}vͫ,#"=GyxW9:{w1GNԫԞmߊvzNOꆅGܱmWB yӧs؍ :=|xي䉟g<4Q#=H.,Y1dW۾>K޾|y rnxD{?` ʖyffD$[o^ԋ.^SKKKt8"ZӼ|\._ЧF= pӧ>uJe={ x!fϒϞb]BP&ȱRVQǿ{ԙwԽ{߭ \qݺv!'N @˗bTn7D]D֭+EDD^x˂>zH4hW5üֶb\nUVILL ֵKXXxXX8o^R"d=z$%XOWW"pllxE͛I1}jHHhJJjEW5贪Ǐ[,ݪ6zԈ'OQQQ_]5*/d7bpf'"&L""55vھy:s{)3EGQ֭>5Z$'=SkF&1FF̂{=-^`OJ5k))T<2FD%l+DdblQ*=#=0(0׉(-=ܬիtZdgtםUիG ^f?d@廸OǏ8hhVV߻;U&ʻJvz:~EMMM]]]1׀ZI;@tCY(,\.g|L&۴q]3'3wڽ{WX|ĩ_/իs:?{ĬԴ0'7 $%%U3Q޽KL*1MH$"s3ӊVz;JY%%PŖ}1$_ȇXOjiiѹۙ?ݸyk~%٪nj&&Q2f .;߸y˦ \.W.SW׎HLLEllTUU[9;Rߤ9L&KLLj>..:XYY:;; se/{(3{555yvl\\>ejӮ~Z&ܹ۵6feW711JKurzERn/l3@cnjiŬ[W}xW _KWwW v#||3O[|#ڴnuđm6\M.=LM323?O!55mƬ\.W[[;--+oED|#G{ |D2cȳAԁb}aYs^.ƍP曕e^b}iW:w),,;VUirَR~Ka;ZV~ww葉ֽ[}}Duwzea7PK_~1ޜO;)rԙ=3iڧk Fj=[e/ĭT#CCfd2YRrX,曛+KYVVVn^U%HML0tӦ 4SS'JKOgب5贪TK}v׽]];֬na79Ω3翎 Q~6靨_trюq{ig۬ l6](f ;;wfSSSJ6 6hw6V^{ٳlkN:;6!>Ј=zBM]}Ǐ[ hBVZWFl 4u4u2nޯ6_z} A U;L9 \.Z[Ф:ۛT^VC6b :P߰ а>.>j.4u4u4u4u4ugA}qh"xY,ݺu|Z<[uOKKU---??rС3gΤ<|ر"S`rrrxx}>:t3gM;P/_x`ٰ*q唶m0_3K(9%%##PXHDK;q5߬ 166:^GGUQ=?^&q/kՊd$"DM7l*w^!d5>@t8@e˖2m۶Rt^^^7o&ٳg{{{zڵkiiiDWbw.۷on: "dcƌٺuƍ7lp/ۛYlԾ};qce}fc2L=fddQQQQJJ*616&"\dbjF?-=)D&ǸmNӦNIKKۺo]wъ!ɒSR|9*&&&66֊bKutKu::̧\.OMM#"##C obcؼx 90+('''""B-VE8޳fΘ6jԈظeR,.>.33K"XU{̛*o==wn$2"y[P6ݲeK]盲ܝ&DWB̔Yk}efҥKBp펎aaawe2,^.!!@,رc:::U)TTTDD!!!yyyٳgRlPEٟȆ MÇU$NljTk"?Ϟ x0,,|ɲaL77ןvDB&Nܼ[bfjڧw/" 8rxxxr[ao|鲕 ۶m͛)25[yyD4y҄իQ[ t#>dMMMGwztѡeXxVZ~#DZQo߸ykKY,IDKDlQ6+yUbu77\;αae)8R♓3sB۶~ӧDѥ#s8ݔƎ}歜"|5>hpybcckv!CΜ9ìQJJi@@D/^w^vN:U㉈/^~YUܼuOO_VI^cu+/fϚ>ͻpʴacƌ:_o^O2"ҥM8?XZZ>qVoJvV_=jDo^D}9 'M{ZZZ5[ظ]v)$))9 HD 0`H$ڻwĉ ]y[˖-mllbbb._ìLl^ d1һ|7}\r9frj\v#++bqˀIOvdlgM'B_\q+//Z-1 "nݺyγgAi/_;{z+ձc_I 盯X\.vx*͛:ߔ&OtשzJo&dffV4gсeڵ?L&[fM=|~\\\III-\\\d2Ն b@,~>y˗HEEE&ŵj,>+Lf+6tȶknFFIү,VNOMKW|4ظC u a%WT##3455Z%SYq-Epڷ<55r{l\wYEo|EQUyflHKK&&&DFD%%:ߔZlAD<yXRR^}4,^^^fffRɓDᡥk.Ŏ[ٞ={٣{ЦM"ZhX,?~ǏU|||Mk.WWT GCD2yhnf|}󪆆:XTTljjXE]MԭKN9035%"Pjjj߶*2~ h11DdnnVqKMmi""︸7ѨQ#ͨ>l艓Ǎ]Io3GJ)f8|2kvmOS*2<=`Gܻ%T.wU.GD8MiZǻ&6:67h>  ҵkMwtt NNNfXfffLb׮]322E"F dlݺuɒ%vvv,SrXX;@b~r嚰aABbϒ#F /,,|eHHKmwjnn2/{e"С"JҔfvaC88VKKuԴ,kOopF֘E'M(lŽ^"Μ{ ]T^zҵ6jdbl+Tޮ]۲ʊqD$_|ZoiSkVC眪nEo:ܔ m2utuΜ:VIfWWX>@t5&Rf<ccc SlPcS'z*$…YYYӦz}1~ikk\ǡ|cP۽ךoV*lloLJJp8i۶ Ue;FǟBa^=Lv Uu˦y_- y;Y?lɬUu q@_bYOvpvv2{5л{^\u) e==wtEa4Y_~1ޜO;EG {~Μ|OCµO >;,{~̘jhBKW^;oAF5$1)ehh>Nz-**JIM535cFܵ's+G!qqzH9PE#F}*=?qr{D"۷ ffΔr<;;;;;GWWР܉ҊK,?pukƩV &zsםSgy.o?NT/H[h8wRWWm֬aՙ66]nj=?UC}7RQo6qUu,wd&u?֦|5>h[yysPFFH$6tȢ_lt5_w7ٶO1Rռέ^ P'ehhh0@dgg_\\EY[73 ԅ‚Ԕ䄄W~DWp秥*_U iʺڭW"8##]MMs횚Zj4u/_6225يl͜\9.gx)z,Tf|M--&QOOĔΦan.(,TUUL\ W|ӧnjsiwww???r J326QI p8n^$O KOO3 J ? }"fX*\,̜[\\tŒb̌t33~II7mLD" g$ -;;\(,022 |R0pL./).ӻw+myLDݺիsgObfv={ {8'Q}65%9m\VV&T`BaS~~n.?󔁾?OJ$:? ;gaL6cN &:??O=EG~7YY7٫3'x|\?ޤ;xdХԗACD9c&iic0XLDI \MBPy~޼iխK;r/7PUUcXFƊU"$1%''RiZZEQJrRVV :&&O<244""aA>o`JDa s-hjߘT޽۫W/ХvN^tT(:с jjd"aa45@Iq .JH"7qo/}hiiž))):\ME~Q?eʤRT"J(,,TZr55_TǓm۹(RRblhBj Bfkjj1qmm"bBՕ _[[G[[_44:V4yoc-gX)u.?YаfdJD,kJJ)x'u \`ee*Y,sxXsZtdnj`mc@A~RRBUT[9_|sp@wf?8b޾^2U7bXķDEp1l6;&:Ĭ:lL&znـ]ߛztB!iI>:Lv__߂[[#F8;;ш#ƍWjj HN߭[7KKrK8~Q?pk_s"bvnnEHD<>+8  :|pjٳgBpjD~b9''ܟ'455DEJW;{R,JT!"Q8**ZZOO|&@ Kf:;`looo--gnٲ֭[NNN5yj]Y'Nd-[LKKf̘ѡCRRRw..]4yݻWCCT rpp(}̙s3fEEE͛7/""_z{{ۭӞ={Μ9yޫW^`vVs 33phgDS6H1a KJsr+#ߙа/_ B">-JHHx򥩩)f͚R٦OA&--|Yf֕]W,XYY))^x󭭭|>~ &y5jܸq/^`XLD"QPPr+a[ڵKܪU 2D?2ˡ}]p={Rl[-JE"QV566vppPlR_˚ _~ƍ}eRbqvvvBBqEh<WڱcYXX̙3gePu6mڵkץK<==y$lfDh~ڵg6m?q+# :rJEhZjU*СC;,0`̙;v\j☭R~W...>>>-[ܽ,X0dȐ/2++}˖-cBDbW^ݻwޜ9s-ZWTê744,)''5k߿J:""q„ /v>eʔ޽{[nȐ!:uRlR_˚D"LضmׯwSI=+T*1b3??γ6ʽ] @y~rr"}vV.jPHԱcٳ_vmŊ111+{9l2L&HN|'O4w Dʉ-[y /_ T3QkXu?|ذaTҗŜ^(j\v~ۛuܺu+::j֭JkSs}}I&=zذa[lyaGGo& ԳΥ(&SxzzzyhT-[ׇ0?V4'_%LOD={lӦիW+O/.}߾}󓓓#""bcc̙CD,k޼yﵽ_8 :uA Ua}񬭭-,,RRR?~\Q6MMME`|xBB x<^jjjNj>lذaÆѭ[ tO?T9۷o+gscu(++!<@WUeoo߼yGѣZ+)/{xxT^9kk낂`,22رcݻwW$?~b)cnj^9::Jr-[kY[[dALL˗srrs ӣϖuR~Y[[ylFEճ6VVVϞ=ڵ+m+t5\YP[8p`̩۶m;yw]=p@bb"?>**jСHwʊ[vk͛aɒ%Ϸ'5C2ܹsbٲk̳֬b ;;ӧSN=yO??Mfqqqc}Y`so\+JUTTd2s}gff~w.^FD|>իW ճ6&Ok׮lLq.]4o;())#"f3{t5Ç:uj<ϯԼ}eyzzv~„ wV]Q;;vL(Z[[0>cX1^{Gߗ/_nhh?s-[ԟ֭_**Pgmmmssqd[޽{U奏9RTTdff```pBLfeeh"777''A?=՜\zpҤIׯg\r2[ZZZb@ 066 ?ÇO0A*2833] dʂ&A&]p׷vĈD4b//qƕZڬ ~ֹҙ1?<===== W+(/QΝm#ttt*OW^7((H8ҥKS,,,-Ǐ+5kVnJռVu ͎NMM233c&c(NJ/^XPP`jjx[.Y$;;Ύ[Nkw޽555@.tU9QQ=+瓒Ba+nӧOGWME~~GXXW6mbcc{o>OO|&[VEm`y{Cfy M?vŪSWWwttzzHׯZ6b5k֬>װ~S\xjrk\:NUt5,Z(!!˗ok֬IHH(mZZZrZZ+**zefͬ+O/X,RSx[[['%%|6׶?>5YtzYUW?ލa9 :P(ښ׏=x:y T{ڹW^Ml5tio/6:C}OOĂ+++⮃[o6>**99ǧD|ǟ}BCCڥNxx+WWW^y<MKEE5kl^ږ0qD]vS/٥X"22NLAܾ}[}h:ujllGffÇmmm:ǏڦرLLL,..:}ܣGSN&&&s̩K.]ti˖-O>To߾6mҍbDGG]V !d2G}ԭ[Ǐ2w#FB(J77+Wfdd^z۶m={ܴiSCjbqDEE]VBX[[K+zbmm- Ӻu:!!!ӧO>}z#P62}駟 ŢEco1ޅ`TV=zモNCCCL믿jI@ukRΞw555_~u[hZ2eJxxxrrG}]k||ٳgn:|ݩB_|qҤIƍ[|s紗˗/9r$33}ŊK)))gΜYh?߳gϔK.ݾ}{ǎlqqqIII'N8t… /_{ڈ'N_>""B۴4Jb1]vm߾ٳg?{ g[u .T*__GC[0wn#Ȁť&&&CUUUnnnk_ baaѳO !nܸoKsIJJNq:u{KKKJe[l6nػwI&j!KLLի.]ZSS-2ei~{```UU7!I/]6uT)[^<{߬#F$'''''WVVJWMYaeeUVVVV5ԞzDl|8iU q6ҫ iӤyCAR !tIm,-% BQ#B{򌌌ťBSҺ#ƍ7n8!đ#GFcǎ~Ǐׯ_旞vJm6B=vrrӽa``tRmJStJŅW^Z(m.}n{2 iP62uzh\QQ6o0@t֔_P06l+/-4յ&77Wzdr劔؂Fѱc+W\|ynݒ~.((lnmW^=;vՎ;j4 6x/tO<<<曀me2vA~~6AYŵܶm> ݥ5ԫh~t=))iB޽{3#"3<25а-ã_~^mmZ^dGӻyG}y޽YYYFFFFzhʆywڸqcNNbݿ{HHHaÆBڣGJlٲ 6DGGKqqq{ץo]v !T*ղe˴ϟ?Bjzq+Vlܸqٲeiiʕ+wp4tTVVHܵW[e@qWUUU7n())BHv-'в.2e^TTh.]:`OOO :L䜜ܿNFFmevL&>}BpttȨ^# <СC_|>9rٳw>z{ 4hɓ;[nP(ݺu}뭷}L4i ,Сȑ#g̘|r%K>ұcGݟΝ{333z[ZǏ6l ˝;p4t|W:ӛj (*::~jZ7o-K.\ح[7{{-[W>`eMWˍO6Y!D{K-Q:tH{흒T*e2d?cZ[[?~";;EXbży󊊊t;KBiOׯ_[yW\yeK/#prrڻwoYYYvvv;[zóT*UΝzuڵ+W( KK HP]o^N#444''̬h.~^^mʀ^M~wݻsss===YBT/hT Zt闺{iwyrynݚXL&ܹXI IDATs`dThb^Ew8Z|檷W}@6K5?K'4]```vFV :gմ "v%@@@@߱+!AT>rll, F.@txj(=]3@}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}gԬܙeTTT-BBLo:>4p pXRBܝFLc^g ^ӄw bhoR(Yo_o{FgN !ʄzS/ u*=#W; i~޺ &ٽʪ}||‹yQnn.Mw8::t\Ԗ_]W&uU!RaiYwBKKyeee3ibU{!on]c`hс%%%B֜O?!h5^"'7W7&?ѱY;`hh,cǎM (,,zR@ۿ 2@&N:ݻ߷Ľ !/073$7ojYn!'G4@WTUUɄFB\zcy,!Dvzd2!ohyޜ}?w(='','yQ󧟏!zԝ~sׅ?ɺzu4w`m;}_1aRsMMM1Igׯu+fffYhnn.1 EoW;ݪ[OW,[?216)+/i_^{oY"M10 V3ڥ wV8rİg_022_xC#@63q̜RqI& .04`&D ?=ްl+))jt[YYܼYhnn^UUyﮮ...u⨉I=敘xVp<!Y>Mqʕ3# lll._Z=ߧ~lO|tYEE6.Z4֭n!&&規1,^ Xr٢Eptq󆋋ˮ pJ瞭o lGG\.%:ۯj۷y:t-Yt@ש]xyظK;ͻxtf$4m۾561תu| } @Ԛs|z:6сǎY<dƧ bIс.<v2Ѥ@*=Gt}׼7n߾=33S&9;;4͍NּQQQ;wT*/^\n].]TVVҏ<[`СV҆[oYF/U*UrrիWuf`` (++Bܾ}UhrsslGݻ/YdÆ BHٳg2!a!T*ŋӸİGtww_b"000'''33SӳgϘ8((<]ZZt\!BL6V:vqqYzҥKkjj111EEE;r>|8LihkׄҩB^?~9sr[Ç=z4 88ſ+ 4?=_~}׮];u$j\|ynݲBH ڵk;t0b{{{wwO>DPxyy1dvNsʊMcǎ>lFFFիBui/ 0<::Z,0|O><4с5kXZZ:99=&!!aȑwfsww={Gsi/XXXC 6] y+ :d+V̛7K.>=~ꩧjkk xX_q4ޞ^] ˈ.Ĭh9ؕbh}Dhؕ@ؾ}ȑ#2O#mIȿo4/:խ[7-H`}=;Rd2Y۵k'%ꔔN:?8t?xC5:0qD]vS/٥X"22Yjᮄjzʔ)ϟ9rdDDv~||ٳgn:|FCGfp@FFFzzzllt:gΜ.]dgg !Njii)>|xiiRtqq`WBj܁<###{{{TzW*ҩt`jj*aktյ&77W:r劔HY|sTt||·۶n644d ={xzv#ؽG!'58tZzݚC  !ţszykk_t`K$ԩK=F:>dUn݊=ai)U !&Lߔo.I9~ԍ7  _^^'llly}n[QXX:\ׅ%%sNB s!XQUbàAN8ǽrK!D>;wԔ/ZQ+֦ܸqCVxsnDWྐB-[U}Vf5IxذVV%7-k+\={_WmIÂzfK#חUx@CC >lU~~~eeBwAܿ7=s™Sc;)o2 w[=t__^rss]՚\Ev=wڵkSww;Zfi unWTai_vuԩ&&&;ә#?ksrnܸѻwOd񌙑^vuNu ѤXB3nTW]76ngkk+P/^~1/7oWWW_"ʺw}{22O 'j)Qmyс::3g&>$ 6_v-j={u}k^reHCWV,(00@1uz'N.o3Gjh4^+lc^7 ;tݼk!DԹC62b^z!%сS>=;7^?qԋ/4tlogwglŚvvvsfSO6^O͈4LV[[+;;;k4_d2Y5 X]]z{ސ!Gvw>ѷb]þO|tYEE6.ZnxNN,!DvzdFѽݝO̘Rlq?beUO  5߀?ZoׯOzanjWPzyaCԹ]SDw_Yiú:)zCZsmeuK{=x_O*NN&&&SvuNu՟277ѹ \]\ڬ74$66vȐ! xuoV74y.@5c/=͈<?ːPG%۷oB9;;;ֶY5h4={=z#,,ǧ[T*---rL̍`߁&ڹsg^^^VVᑞ⥥AAA3gBƍAAAwnܹڻ+m]DC]j$ܧO?֭[FwAnnnٳgggg:::J)K,ΖU*UZZL&޽{vļ<鵎jZTd|\^]]ҩS'www!DaaauuuQQQvv=h:L&mܹs:u*))\^^h"mh@ammݣG!DBBWDDɓSSS 'NJ[qq"887ׯܹsv_!V\zйs;Dok)x駋cbb<_}UXXn .T*__;TSL ONN>ȑ##"":?>>ٳqqq[n?F/^i&BBprrڵK.]$011:uuo޶m !ufdd9s+2uTKKK!KKKJCс>m4wx…//r T"++ͭΥ<###6...46)N`<;...׮]=<<6mڴnݺ3flĨm֬Yciiimm=f?? 6h/3t„ vvv?~w}a\dggw1???L}iB蘑Spɒ%vqqرc޽ڼs8p, w`M :l:ps_{ȗ>KRRrYYYt KǾ7u| -`oߵc&.awBNx&7Wicctu!DqIn'}dFw) @K uwIio:yLM9@tྒྷB-[U}Vf 0hM 䨑jz??H1[+3mgVWVV !tWx37Wll,_)s#:tW!7oޤGG'>1 sDwDwDwDwDwDwDwDwFMO/=͈6͇~!VZؾ}|Zn([XX؎;UnRYVVv/ڹsg^^ٳgy晱cޙťY5 ٹs¨eņj*!Drrr߾}O<9x|\R}||Onaa!.UUU;wSzοx[kbb"e),,.**611^uF6&77TVSRRT*U=r9 ]={444BGFF̞=ɓ!!!|-88W_3gݻMφ߾}[ʦ-rʌիWΝ;W?0`moݺ%t钷ɓ:tG6nܨhz-ť&&&ər̙E=={LIIt۷P?^xqBB¦Mt/=qqqiTTԨQ EmmmDDDxxxzz'֯_;Vl޼7OiӦ5eii@```UU7!I/][[ZZN0!**JVn:uT!DVVV\\܈#+++SSSc}ƌ3g\nllMW( LLL̴{ TVV6&MZjѣG+++Ǎ'? .]ֿFp_}3]&V }bذa۷߳gϮ]{9)<ѱcGFaÆV|͛7?@tO|yFc`PwL&{?'NH;v6l؛oi& cǎ C +ҐءCs1:Amܹs8`ffpՈ'NxzzjnZQQP(ufkk[oj܁{}@K/++Ӟ_"LOOuNNN{-++vttt ZK+.Z-:nݺ14]D555;v8qJիWDDuEJ\.o/hsѲ20VxQuDipptq򐐐kV:pMQ\\>ٳqqq[n?Fi~ӧ/##Cq*777)\.vZk :竨BXYYI}v:u^zTT2@C^xQTۿ BJ%055f333STN~kƾGNNNBWjBTWW溸4*B[m^^^ ,m$//HM\aaaDc``PgVիWuǎ۬xzzn۶mu.J+WHܥ! Jdr=))iB޽{[[[J:] Mlٲ 6DGGKqqq{ץo]vI ˖-Ӗrvv>v2!ƍsrrwCBBU\kŊ7n\l_ZZr;vxxxޫUK,۵k4?77wC B)S|EEEfҥ ltoҤI7o^`AG9cƌ˗KW,Yra;7wi'4k_|ZǏ6l ˝;'ɢO>P(322{ 6t4rw@EFFٹ-[H .֭}bbb]D=\xxxVVJܹR^]vBaii`)}麕ʕ/_vqqi߾}s )++sww733ҽSRRJL&校$''k󘚚jW4~w@o䔔jr*޽;77S&n:{9zhqqk@@QO=Ԍ3BCCGCoߞ)>>>#G7[XXXxx>{? :w\?yyy5oom[.5'M}Ғ/rYfI鹹eeeQQQ;w;{3<3vzo{@iڔf(//_vO?$m/q]qqqJJJNݵ**--M&u޽]vBJ;;;!۷ 'gF#mo`P7r1tUV !{rJ3}t )tܹsz`|mPT*F}7B1;wn׮] )1!!+""bީBX___)û&r?uT>}_j۳gOCCCiHٳgo-|gqƍ'8rѣw!2}J755BTTTKR6|;;^{_ݸqc73f̜9sr uWt`bb}hֈ#:vxʕ2H !Ç_vmFaoo'(޺gooߧO;k|Eq1:1:puM6Qwެ,{xx/5͒%K,E  P^^}i)X'L4ΐ!Cyw:tx?#G6_&I 1##cӦM%cc  =zHсaÆ1*}n7_RRRVX?,[ҥKR^zegg+K.]ti˖-O>TO߾}'BQQQqիWo۶gϞ6mޮ<**jڵЀںNBBBO>}t=z:u]g:ZaWgmݺu駟Ύ2DEE5JPFDD8qboߖť&&&y{{/^8!!A74 pJmn#⒒oKt`ԩBÇ*JKK &DEE !j֭[N*kao  ξpႥÇ睌XxPG k޲?t|WGݻfܹc[n-˲峇eIVL4@:P|}}o߾uAt:!,+W|$I~h462eʞ={z}vէOM6\رc-Z(b۶m[7*̂}Y?Y?PVGgxzzܹ3===&&ݺR`zJxxx]}Ʀ{{{zv[,hݺ… -ҁsppW^+y~(dTl%/^̝ ?#@HP;V%<~8@ @ǎi/fvjWt 775jÿW_~7n,)JQ:mΞ=ۻI&[n_˗[e˖+W.§)JM!4iRJJٳgƍ߿oyyIFcXXX rYMKK;ϝ;w4M2M&ӹsUMD=؁uM> !$I7oŋO8!ҥ˘1c4h0iҤ'Okǎ0aB=>U&'' !ҥG}ԬY)Sԭ[o&Pҁ˗/-ZXn]''Pˏ!!!.\8{l~erss>cƌSN]t)333S>}:444$$$88x,s(E@VV]\\*q1c!$I7n\~6le`_ZZZ\\ Rxzz !n4Lwܱ,IIIʕ]]];5Yk׮Qu 6HgQGIOOIBB\rݺu!BBBN:~*UpONƏ@ f̘QbE//Ν;1bO>>]tyw%Irppײ)a 8p͛7Fcu:uWXXXޒ!!!v|޴iS*U,+ -p{{{P!$IիWCvY^ׯ| 78(ڵk=z4$$bŊ+Wի7sM^zE*#@HP;V%<~8@ @ǎi/fv MյiBI6lp5!C :wlޯ_%t;ٲeժUoݺ57B+̂5k񡡡oFϞ=EBťܵYO>Y`uw}wI"EQșW_}% {O<پ}DGG߼yͭ^zctܹjժy{{[˛sƆ :88|ҥ?úkذaOIDATB??82|oo .jS7o޼W^fZnucTTTxx-?N2rj֮$)*O W=&O-ЧO>}888ܽ{׺QBdeeݹsG̝;Zuֲ,w9s4nxʔ)-666nnnlBgI<<<Pj~߉cx5m4ׯ_߽{-c-o@̏,+W꟨nݺC 9suK*Urssܹ%;Re$Ii)JmlldYBDEE-_>>>&LB(rQ\!}###-?֨QYf>}逷IZlY~nݺ 4艇geeyxxԫWeĉ,BTRe̘1iii%IZnozj.O03 !!!AAASNMIIYVn;haooo}Ν;cbb+T}K/tܹ8I.4xҁf]&)988ԫW('L44*G:ڑv649۹kϭ[zjڷhHJmm5k%VԬQ=x/sF: jӄ7nܥNҦl6_a2ԩm0, hvwwB\~#-5~t:ZuMHRZ5mlli"wvIHHpvvt9~8(^Ujڤd!7Fh*Tp͠:th': :}s_/<|ŋ6oڠ !.\4NNfsNNΒ׭Sg˗.-tk٣z~dWܘ^<-P;-\+dYȲ"lVf{WW~nvvfs ?k՞msشϗk^(sloD˗%Fh4Be'$\߽[f6˲,˳Gؼc-sۗ'[=jpO!2 |/\ȼ{7EO,Bt枽}fBBrxx'__q54`ΣȲ|ࡀӦwK^z?q-RVBh5YKv뫵>|kК_~0tʖ3?݈80%,,3>>Yիg89z4&oKHHHԡ~nddd 2Of !֭ra.OHL(z='n,[dE=;5{':tcEuד;~K99F뮨k7bbKMH#\ff&O][˔?NL4j9|SHM^_'0`pLfs6mV^dTk=s-߳kkE˖qc[>މuqqQ!))`0暮\\6Yoݺnh6\0Lu6 9E? ߷YPO://_muŝeA Z$˲(&Mmذ׮>yHV-E2ufӆuL6#++=4fݻ~ _0u[ v^SE3c2ף{ן~Q:t 1$K}ҸQwf嘭pґ'w/1d9(, B'Qܻm^ok0$ؑcdK]Qd9o9B'GV^~ Y6xf˗W\9!+mZgdd$&&޾s L@jaaھ&ڶp7NZcfH: dYQ!ҴZ}޽5³wgfI6Ftʟa!DJ1V?rw|˗w.g0ܻdeb !sZm%75k4.niڴ a;uA;thK:0zPc f1֝>R97W$Y5:;{!FeYggγF:7PfIզln,X`LJ?{vٳO 5e!d!̵j&j|||wբy};رgC,co.Zfslʕne-vA|h_`oNVovF{ӖozuݿBXVFB,GGG؇ZjyzxnܸGx֊3 YȲb6gי3Gk0D͙)օ+kfe ! aSP%ӧNeWZX{jZYcc!oqsSW˖-Λ-HOOOHL\٫MVϝeI3BBNwvóY{~osGo>];|f9{}ضsϰNNN6j]Wnݺ-{;qGH:l6]&%%e?o>՛7?wKU߯ݻw323<=-ۧO͛_zc+|......taNNNN_0 5kT/ӭ3bכG lÞ=pBw/k(XؠcRjmt,W(_D!Dn]<+{?*'su΃G:, 5BH{m++J[rtjռ7_S[M4ȯr눀LΛ?mߤĠM7ZVQO*N5Nydꃔ)^R/^n߾^=.>-^R ʕ+cgp?֬]]̣E:/;q FZs䈥laZRFnYW+U1xWyitنrRʗ/r:yxx$''=H}R%3#d2zK4@t^_z5/OiM5)))ѱsNNNN: |qK?`0ȲRd2ygeeyyyeefVl2==d\(ve[O$^\Eu}w{BKYV^Z#@YEu!;^hP$j<eIT%;^t;ڑvjG:ک.5p@@uo41fO6:=Gx7:vȏҁGv*tQT7v :aGTjV&1B}j .c[+ɞ׭oBwן@(3/D_*Ԯ,`@'#jC:=sb_HC@w=]P;%})/|Q @;t{ϊ% J3 {T`_]z +r`]L7bfÞРT2g,`!c@AYe;Ҍɋ|&_?緬@T@ (Rw=ox!afcz/=P@AD@A:ASP<)<1HϾWyd; v $gaUG:PJ?҅4*!Pҹ X_ kpYTG*WG:Pn|^JvJ fv(F0@*T}bG{o/H!B!Tr\GO.9B!B4T^ph猹r7!B!rK==5tZLIݜ{@UU!B! UZf~jFΑ &o]MvMxӥi}{B!B4`fM}T}\83M}Q,P!BѰYlb~ q?KV P!B!DN<EQu?Vznuڪ_2ױY:VdoZwp0=}OB!\{79BѸ`O.?+U*Y̅k폤:o9s1}ˬuluJ8_R5wn-'qэ;:8fw?rW !T]gdfYtvv6+:G^<۵Kx۰_vEѩJBƝmj*6u.=nµbJo62,'s'5ۡϓǥ3y[8J](-[I􅬉ϸ*7BH۽SG .IN}4uρ_|[ϥdVU j<۽S{&%g[b6-]mOM.?E.B4XS앨sµWٮxXN#pu}k9m~b֗ʬt,Ⱦ~SMtM ǿ;_R))؜_m% P!wGows)ـAvsj]lQ/sl=뫟nP8OI.prtl8Nz"ޅQ'kflƭ{߸> ܻaT`BˡC''UEEZ2'<+93ж{S/)&SϟxEn,!h\g/IXPX?'89Lf뒔G}d_|[k~adJ;3KhB!RG |]a6nexV%a^G suyo/wo{sƀ'ژb}[u=kwG`b4BF/,`,uVr -]ɐ=m!Y}X)NQTR廁g?|_lTdRms-WBFŘf^V?d:.1[,}#B L_WP䝧ѷcfע(:;'7GKfVNǖ~\gT57/o)ů]]\:G˧B4_X\󪬟&Y]دv:+SIyY2.G⛼uyK.K!6&E)(({Ј~BRZƄgʻOt-*GJWܼbEQ.sg?? Q]:d)GUUz]lptz2c-";GB4^:ZI?@NEX,Y~ضsO}{vZqV6qzdmwB.*rz E)pj*B!û3"so/9WMK%?h*XM>1V:ɪ6[VGw8K'rނ}|Iu89j'B!.^J6eXEEŶO2⢢ؽfY_`pZT\slfugBQQсǴOzm0[d>{YH%Bƙm#ljjYq;wﳏݢ:[ !к,+:y3|\z^FpêB⥔|Fve>M2s &2 t:~Kf BQjK'/L.tqr8TPPh۩K-zpEvPU~^+(tszξyk(4^.X[W޻JGuz{~%RT! `sp{`g0t@? B!v8aPkw%: /)y~E%_9[f>)`D<-=vjWmn-tWxqo\=>a=;owHH\&!h 3SW ^1n'ZNVX:;`tߪK!KuJ~|"+e>絊p lC !3L}KkӟXвE3o977_QT'''ߦ.&c7(ԼyHW讑ɩcv@ʜeMLvf.!h PrV8s:Gv*}#;OQf`ֹt}B49S9 MWڵi]^!SxY...۵)s~~~~~~BP`uT*RakWgDDGk`uP!TBQ. tءJW޵Vm} \g*.]XZV|Z !YTi95@IN5y :ιirC!_h085B!Aա}/jpƎy,.*ީB!BTOjVMfzwޱT.]'餉B!BX9ۛ5oq۔)Y&:}x+W87b'g~$>!b7ξW>IIICرHLLջOmيOc`Ӡ|ҺMoNMM[Y!BqUUkj.^8_z+k_znܶm~ sASuw/Ґ!W~bΜ%{A/j#'xbҷ fqɒO<(z{G iƿL]\\~ݴ[n C ~F[۶m;ߧ}r7 !B!*Vg/}Uچo۶ȑ#6lPòߑn4`0<_k92++s޽޽{Ǐww4x~ӧ& ᧟ \7[8''rK||B!B3^- h46kn]1rIyFUUKꎒc/YwYt?f{X;ׯ'߽gҥKzꕙ}}PH0F[!((HUU774F!BQX+<==m0~~~~))MFc-V;f_?zKV5iҤM6?S'OOψ%KFFF^h4VB!B\5266c&i';k9r+>6LozzPQG}|t2- <護!C\֒%EEEk|9jHB!WuMZ>7wÏغeK6m.]ZA!%?o{衇z3/nO%Ɖ3fW_5_/?@U+ &FV;E7^VB!BRTU}\v1(,,R/ZSB!BT 8t]CB\^!]}]թ !B!ʶ=t]}]ޥB!Jtr ңB!Bj#!B!B!B4%JwV;e~ϝE}uB/0VB`{BQ%e'#v+Y‚<9MBXEEE9ٕXrS[ kjAQEQAAQQAQŢh(^NEؾQ(A/F ]70AҥK@```-2xxxT|B ^^^>~֭x}!,nweY!۶kos٥W2)S\g=?_u֞J<`)_{xQ^օYFc-2e-Dݔ>>}z![rƄ,ԆT^-`ڕe!V1bҥo'&&i˖:^eG?O˖gz;== :c&iŊGm]8zԨ>dz7j>}٫a QǍ;6..` B7Kɩۭ UTBƚΙͱC /8Ұa:GvZѳg֭m۾k/JPpȴ-[V^{ڬk.3;wtޣ[n5|ZU!vmݦW\]g ۶mݻ[&[裏 !YkweTPSTU}\v1նz׽Y8 !n PhP=<2EP=?̅Tpuu+V5=j~O(( [vswֿѺO^~^r5FǿiZ[S?N0ʲB\\Y !];<~n޽{nggSJh!Dc[oڬNW%>hDx.[{+s{˟S!bſ|>a"8q vW4B`YTU-.*.*.R-9qBNg0A[ֈtI:uܹso2dwwE.?a^-& k`̂ hڷNQnL=t6''"!Pgt:[Ӡffsl2QkЮFQz^_֭>?#GZz~~~ÇzkqV3G!Ŀi6DA ZY!*33O%lӮ8QukXIaaaZj===}).>tjwt:4oٲ,gرy{MKKK{'m+9u6ey]iii{iO :yA$fჇ z !u .־'6SF{ F"X O4 hM5t%5T5==y5?32eZN!DNw70k!d4>Vlب% Ѩ=ј#bXztf!D7j̕(oHq'IcPɌ?vʹBz4dhπڴB*җB:b`ۤ 0q LnM!$V͏x\%( wrEEZ>Tk\'!Ŀ,os-5'wԩD|roʥ JIINMMQBVkoz#!!N+BGX5!͚%:eQ(j=4/]۷%&'ޱ|R^~Ir!DӴq?[iZY: hX IDAT,ߒb=4o_] ͿݣKvv7;?/o}6ڤIv:y{{[sۡ#FGv0ڶmRV.^p!ٹ`o;t-k=vlڭg/ooԔ=;wvٻ򑯡ἐּBB7[. qWC;) 5C(m۵?~p;ڶ]!Æ8~3S4cNOKKRSR|KlvbkЁ}5Ykzp6m;zr ٹ}{| yy} _~w8yxVVf*E})]vnܹgN[_>$eϔar!vſ,ٕWyQ|>gϜIO3z$'w(:'߅ CBS7of4jmLM i޼D^>)...~Mcxaa:?R'PX6+W(~U6z}{w٢V߲[ul****"`wBPp}n3̍?rݏقEŢbb9j_nYU-%VV9zR=th'nǿZJQZe!$i.|==z-)..~( {Œѹol4gdfDD-KwݽKQ={{xX(쬬ne08V|R5ˬ08:%[,/EQ:FDɗ.Z_nNvUTl2jwce-cWKm6(EED!j[\.I9!pL-Wt ! r\\]||}%UƊ;84qkr)wwwqT^/Q[^w8$ {v mu6FU2뿪oYuUu۶}xNjC뛝)7B_Wf8u.֪uӶ}rssUr>)i[~}||3Oѐlo^xQQp48LUrܜMϞ9]VSfWU[u>^e"AYY:SjBԥBH+%N%]+BI[lemxG~3g;tdKE>~l/]UN'8EO?]^!}{7oխ⭪̷l?%}eʢΥɮZZ W7MkTg,h 68UPpHPphpޣM*;r, ^strژC +tM4痗k[##;o[^t|@Z,jjJmwvtt&/]zࡇ|2r !jO܍!  VGm[}aATIB4(b mVv'!RTTd^gLs\=""#|}]+Gr#Ҽy<7^(7M7d4:ڗg)!~*,,EQ Z 1LE(GgJoN;~'}_cǏ{yy~ nZm x7 ^rsqiiiK5jB:b 5ڴu5zRŇ^]bX=賘!f+kџ1 !*I`pu0\=^x)$$Dܣ3f 4p7,翬 8~_6&_sMc6iӦx\A!DQ8Cڏ !^*'FA N%vL ,!p!Vve~B4ҞST̗}aCƍe[3܆v{uĈ&IN.ſ Z[~⟗୥i! ` 0MsY#aNva0 BP\"X*X@D @?U˃%q@Zzg}qرÇoX'psss(o_umk| !tapz1798 Q0K8 ` 0_3hQ fëB`xpHgB'ۏ7oχZ=<#?`K,LT!dſEp>< 0dCX3L73# Z+3!HDWӧ@7oL`L=o3LE !- &z@`2+2M~1(n 8x_z=w[_:qúw^'r'i^Z[Kh8 :n9`삥a5/CO0X G|(>eh"f03Oxf:!VWP_g0ZĿY-" AL`!t0xZȁ $,X@d@11x! Ba8A( S ; ,a?< ?j0At!n5i0  .B'x 6B4xM! a FQ `!bX Z*θ&b9ƶ,h Жʀ?Cv!ǎJ/RDԽ{OWZwsa#.>^J<|tI!,~Txn83 <X _p,E0ӡ Bh{aB:l L 5a0 >8V! 8 hN`:0 | ^^P-mz'ZhU)+*gW+Bmƌ;oO~ M_ƴkqרZ!'p_JDZ|@|,7$-5/ȁ? ^p H p>dx&B(a(D@6P saB6*xC_0@>d .Z *`- ?̐Fw8>;aD^`c&@:$$LYWɯQ3Z޹sgLР">SVWCKTq!ni[ۯ~qqq]F5 ^~uaZZڸ7mw+ U!h! ! fTP_XJW|]Iw.̃p!\+,ٰ^ C8dqN$90y8 P @1~`34D!= n4?8`7iXkÄz?L7H̃p&p Zk74( k^o!ٕcJF͘=v*<3g\时FW(3پQj{_8sq_`[o֗[6[a= 0P xC8XB8QB3j3Q3_$hUubB!L[66vMNNN'ߚQU~wڵupp5zԷ}g[>fhOO+Ϟ5￟p-NNNgϒ;@!Dcem_`8ޯ0]s_"r?&8 ] atM im(Pm:,ȃ`Tȅ#P~;ft  @>4I~ pC8ttB|@&3$ Aq8 Dx@fyT m6lH0X:IfO5?x߷z+Th ld-['(WɿNX' ;@!Dc ڗ38AA8Rod"h լ^B;`($AoȄ0a7Spz<߃)` Oh (dH3'[As <h! 'Np<ȁp@('` > ~2x ,&>p :^X ff? ZJ`8LHX nv'Fj::Zњ !*?\~`L=??ʔ)+W~\W]zЛKN3ږ~S7;+6zJֳW?@q!++sc;t}}/kR6,(JQQ=`;$#gpOj)>!OWضuI Eq6su\Mx:3 LpZN INaڼ!!C$C8,! Q:B* 7A Pߠ5a @@!$/@:d/a;|:V Io 6x 6k sA_CˠIs  ^pa I@!2븛:47ߺMwy~ջwoiiG%gC* Ŀ +BUP8L0ȅt8 n`/e 5̀>`HmXVo0Nk y0AN\`]{ t +=dBKD(`$A 8 x _A | AMk?0X&8_B|HPp/,# pm0N@$@HԴ0 alv5&D૯ĬY))={Z- D=rSEQ\!꫙p+'uǿ  ~`.jsBXSq'Z31 Epv&<;BQdVT _C"<P:+ g pv *B`6,r pEEERa6Uʒ*@3 NNNr*n TQX?Y~`Am?/oF±62Nsssk,lxfgey^JLHZx9X't=Zxv+4a]'~ʦp j>xGh= 'IXwB!LHXmK`p5t ?{&U}qA: HUFF5j4 X1&h71v]_AM^yX$F^sf;!!VߎkȿO:5ʿ :L,KyiT-(-p&Q< t *uq$0Zc䲚NDk!y."!A>D*'M,|?`PCBBBe d?d1)|˿ a "H$ˬBK<as+%O4 d)\XpA+"%~fzɤ-eЖZjI\B  zuSYnn'XN?ґlQAO01̩ɤ(!8[4`0",#:G"l'*YM& iP}N/*PHC`5M25-[gE0a zWOlʿoDmԀ 0;,^4s۟znLqlIq8E51-9Hs:|C/x М?k lD@;*YKra!U$L&KS l2fqsӚlhTF!(3r&čTq-԰?pvI%L ;3bGqcYơZ^ Gb]Ld1PB ͩ%> H'm죀O:qle9>ЖY\Go^bc"wT}n.Ўh`4F}ʿo vJG"g;[?nZTTOy7x~Ɲ+gy֣>2?vܙ[vNÃIIIwӧO>fEÆ  KӰ>j3$$$"|WO$Ϩ>)sD^ 7t9{7}Bb*(8-Q+`3-G51AzуӆnTK!03&xz1SHҚ5ZЀ\J/j W:~G ާ# ɠ gpa0O3d"7!htd Ams=,IrS`ڜÈ&D)k , +O 528^}f~dໄk$ `נ"n oƍG^vmvjk?'J??p٣x/y䪕+s;(gS3S6lX o[La?F0vNQFIOhfShFM(c"C2"$ '8>]zҝE L%ɯ85JRŇGb)M;8La|y+?f6p mm"JQG+Љ:N լqbK;Rsg XdJyn4 w!RGtӒqHN OF`԰^l%QK>?4<2Hx\" + A-8+xU2&(iiL\w$2 F.w_n_3[.^o_xm>GՖ"55uܸ_}8zȑy!!!!g5O~4Ǘ1sc<(7H>CY4Ɔ3f?XƙDlrӍ6q+p=c?hLBP\`b!eKcI<4ɢҸskpOj`RBsb1^Gq/T1C(Ա(( $긅Dq%짊iʻ4&Y4b9/l$ӟ !c8i2^f3!r=:l#`*YK)H{L ,@dPCBBBhȿy۷ ֯_xܸq{=tQ z>tpG{8?oju%%%9Οh܅0/{Î^4!!;<ɴׂG1 F5,S&6QLf"MYAWӁf쥎-Pufm8L9+6чϲ*d!J9גN"t50]D1a/sOCN'%ӌa%jrg~Tr6x@oȟ.~<3LRdfIq4B:88riljôe9Qb($AMrҏdqA!½ћl-Lu h@ Ϫ)|N0 [=,?ٽz̪߹{6mthW1s~~-ȉYg3--`),,LMMERROhZN H)̎ v+zr2^2=)txSNs2` Q@)wCkvRhbchI&)$AGi:s$Q,'-ͳ]r<'Z:vG1l!&V?PMj JN vޠ?唒Hwh)L'<;`}8&ӟbhZ氜J[' 1ԑod\hŵL k5$?KXo$&:K9 sޖ-+7mP/=+ȿ"[H/y%Knݺe][6/^d˖->%3# 噙:e=r1c.ʫH߾mkܱ3'sϮ_v gy7U r؋.֣ט_+;tj۾?g(h5ʿTCgm- Ib#EBꦶ.0ҽ`R@èPcG:iC6=yxx(fQY'ѝ:#28Xb;8A-;y6בHCqhmT&L&ϱtr8#Hb)iI {n6KYⳆu$ R6RAD\`S8*Vr4gN49D#DbiNb )d(s-f'̥jzRy`=u2V`k!!! SS[SITwO^QQ;5&f=C}򩧪_|饡Cs%%% Z:蕫V<ßUG;O?YXW_6k2i9ys;oW;/_,Ktݏalܰ.pBBB;0}Hzg:"t :К?*ҸKL#n7Hd6$$$T!&:uۨ17izFR/&&r"GZb?/8y}^{wg4ho^!!T)ДsDž!N #NP/'Db+o "QH.iCE5Յxp^!!ID{v;gGwaiIG,JKJޛ5ȁÅV֛=zxEEgDvlֶ}ϑq'\!t͚YSS'1KJJWRRkر^#{tsёHK+/*,,+,\cv9**EAgGFTTZzS}|q'|J}iaSHwTTFZ>4FcKTK2,gPM%Z6A_l!n b M,Ә82r(AN$/0D-s^#J[XEnV;HA f㹍dS2:P9 a5 w lz88aT"q" igizr(HITL`7hAT LR(d>EӹX|nTVV/}4H8腓WUV>̳c\4YBta@({י(xM~tl2XfЋѐȏ);SG SE-0 KHzZtiȡr&yXDޥP6pHEG"]H=ֱBrX՜즈6:, cY R0<&';c%Wuԃ3Xɱa!9D/QC* )SaO e+dqEAG}xV :xZ!$ՏSG/߂ 4D$"u%%%%şu+).⌚7߁ÿ_x!666#3(cLĻʿQEXkb^'.UH20 D{ަ/i*j %ZJJќ˦s'u SD~08wa.iVq Y@OfRDRM"{xO`#SBǑ!4g%Lڲq<;ldHd!igt8' :яu&?p. X2Tғ џD氒,e ˸nPK~J!{HIRxg,:q%~dF(1 kq!!! ȻZ~{ѵWOaơg~m-w;rW2dp+?g4XOxv24Tog٤6%~\AwN 9d4 CCe9̤)тwH-hclt&9n !"QrڐFW2C4A.^Ffn$YT ~: T2ChXhx0]d +YI3ڳ07т+LXNiY[_1х&$ҟJ ցM#L@`G j8-;+(>^5S_2˜b @CB#,?~Z?wp~G/4@aT})1* oū VQJ|r:d?}!d! z∧q$+hzdj(dqFjKgnvSA@EL"I&L)@,6M2{9 5!4.&:PE6%b:d3&<~xv4 71*lLTH^L7>c /Ӆ5>:fAE^USF48tfW2p.Im"%hְ4xc;T^f3[>쐐ʿ|:j梯 w7PI4huD*J!I154 f)?5PEw6)dViLB`R8 |ź f{h1IJ860<$V2Բ],֤*!Lb1;7r)gpU؄͌g#; / IDAT g&7q+Ӎ=2)c/Sѐ/WwW[Ŀ+!!!!A k c Lu{T]-/]KKcDD&y̨W,KY@{PJ%Y4"P*D᳠!" #$;8|VPi4 t]KpdM(b991Eԑ\ndIUiDH*Q]\F=9dm{2>RH$NYVx49p$i(q+MYIU I=Ԑ:ЎX 6aN0َ5CsqA6?Wf q7x((xCcz{;$$K4H+))NLJ %(/OmР.\ѐȿVw`?8'eҮ H4&}dҁ s\BW+i@40z2ΤІ|RhD\0FXLEVZ3FiJ2낟ьZy"RX jx4#Dȥ @ɤ.*0!(N 7HA:RGԧ6,YL2i\G2H)MhJ5y3 Sb/s44SM{.yL5f-eJ)69͋h^!!___r{v>\}Nj|W_?g,c'k姊nREu}їyg39?mXM^R܅(jil~,(/CoXdPN#+J*f D]q` 1>ʃbf\짔h"ù$^O#,b>ﲒr+ĒC2(5Dzטzxдq'x)\ %jqqM4KJLZ|yiiI('$+ѩ:w)߷/\Ր(;I=fCheer%YIoʦJ+eW=|'r2XDcR >`90hzIkI%8c3](,9vbA/!]I yK)aφ`7|3Z@:DQͶ@!lᎠK$"fq"uN|Tlv_ ⩤QM,ґG3sjHά Zhû!a'$kt%<#ۄ%oPklr*KF.+f$sq??! sHFDD 0""lvgZZZy1np؟6bƦ,;~B,DD|bʹGz&M-O EћrN {Gj[=I䳁ܐizS.aG~"[%)doHoօѸ6,>4F.'\;\@&m%(JmA"CCOڀ\ N}M!al) 4PN3oSXGд,~# N!z>SL 6ErAXl47Aqd-ddž9äMdp5؁f18gY :Fs ęmagNi:ۃ:DDDMiS2$WȕgPifd\zƉghb)qR3F 2 {z@H`-TJw]ʗ9, ySYART::QLL)h`9WO,N=Vpk± Y5C[?pC( o]76)s-"""|UU B(''C]:D(""*cs}Vwv}-QQ&сleYA_ ~SZ晳&Ja]ȢE_ ޡ.9 %[r8*hG/)[LepYgxtzbl du|.沒Rt3%LLzLr!ffP 崧y-ztMENN%4xюVM)︊4E"ՒLg>5Ytb3 Z~Kg3aKJv^C2;lA'cp01 9y0I*t`V4`'s2&Ra71,Zꅜέ Xx Y"fp wp'#'( CKX t⋔0rN eo ;·]32zˈ#X`AIIɂ Z7-@rssMO.rʔ)7tܹsʚwH$bX,CZZZdq 4k955I:i~2RZ \K*ylaО bApeOP 22XA릞(a04~|^,hrȢZQ̧oh Qt&HdQN'yҨ Gdq5 3X:B!䤷R[<#t4Cޡ> =o.Tz ~T4&Y+KG&2['NYN0C cd36s6's=ϲ6fop/ѝla'dS)s.=9~AvtHĩC$ѕtR` ?30O%dwL{w̙ .ܿs…3gμ{^!fg޽ٳ˓)}nݺu#|Wܜ^x)Sw>|{Gh8+]qgSAsi4Nq;䇜*Г4̾4cN;#?ry0Y8oV`"!Jh Fq4h*DJ.d3j Ԇ\Ry"""">fo8o^94Ԑl9+  riUa ue:P2Z4ZW9.XiEq40v%JA H]r*Wv\HȤ3iqzY H!SEg9(:c2?9+l,'K%q^~Y(d5{Ƞ,LSIOz RhO ?g)TPӻ;8L&4i2b(eΫ?c))I4cfC$6Ћo<;&)*if Ƞ'[,@翥'DD|"+p򯴴K.Ǐ_n~3|ӟNKK;ꨣzαc>/¤I^|ſD .<222f̘QYY!DIF5;#3bԘF9z؈5t^F/݈$tz(CS2ɧe38YO9$RQ{ \[)ћ4s/ M ^R2~VBU`^Rd#қ\0$b@65|JNӎ& 5\ɦLrw:r%-v)1RF/{/[ tT YM ;CtCk:)A"^/[i!34Υ2jh!" Llx$H1.4)˓yt㛴a";D_}r;gC>d*\FShRN8C9>sss o>s8㌴Ȑ!swXbٲenAğFű;oj,؈Q,zX,ݕH}I B'#85% Q[[[XX٦MJL IDATʕW]ug>ȣ>O5k/~?\q>?믾RPWo߶?>?9@W \H BrBh06d;Ow~JIgn;f)RzY"T@Rg:T|8A,uA_UP S =){H':6`1dʙJDGQ"''矮*|'|rĉzԢ3?[bժUSN3fkRSSWDUafrZc;tXݘ_Z7G:xᓲ? >s|ܑVTk]./syYx!?Dz{̔^{/`NozRq[w25TӅ e5\&RD. o9YYC+ș!tx6\|NRZP0F۱cṿ0L]RrB!A^"ˬw+ Á1)z[(*:7{?xu]=z;w_ , ̝;0o7n\^/BeEyeEyMMuN;mKD}jkj?Za> 7~>/8m7޸>7_u~{;/oZ7KsDĿ@KM'A'RRA?ɗ>o\0?CG_MpB_+O}g2*AM=DZaP5Ĺ" m!t*q7-t.eZ S 2 U ( +ԳCP%#A =i-3Yܛ{5ﲋj0Q,~Ofs(d7u3t_ fmy &&2| # !j#h 2{Q0q9M|;@GpLXG%y~8K878ߔЅÂPyy^!jK }_8w}Fo.G JJJ9rN:u?Dkd,H$4455dQٞ6EC=LJqϯ:ة~n޴qaG|p%vn֒ŭyy **Nxo7_y:t_xK/8|7矿Kɓw!tm#;E{=e 9BWsVnf-@&BKhMe,%;IA5IfSZ˳ tEZ85"'; l++*]ٙoܜϏyҥKsD'Hcvх|Y Fzr}He#_c 8L3ﲌ&ia'iOxe!ެ`RI Bmms0VISagX^@CCe\D 31l4&dfLF:h`R35Vr [(c M%dYt# 9Egha^Lګ+Vàc#Q0X#/h0woUGs<_nﱙ(e)2ϭ(e8\bC|)яh lf~2у4YO/Τ!<˛'O9\Xg08r&ꈈHF|ܸw-xO= V 1wj׾]mMMVV֭rrskv隚///+ lX6--m00=##3++H|zH jjkQWWW555v{~Kߺ8(o7"..~y :q;ZCe}$0ZNg/9./?!!PnA?V!g2Z[[n޴%hm[?\23Z;ak+*|7_{5 yp}}r^zzD"qC}b7vc=>ӟ^sǏK?~}lӞyfMx!G}̅\0e1EEsV""">6s&0s9҃2:RGz39<  oQE5 қڐr>9trͦ&( )^g.;i pn߷ ҍT3$c)]xr'TKIѐAuB)8jx4aYaKՑv4?xdGgs5R#aL7a/SJ+I?=la2rz !2dU!" 䲔6d2VEƒ| ~ҁ 1pS\N~W(- hϽ\KHg+K82FXK1"g41 i6.!53cֵ|e ?rȣp/9/kaYhӦ~Ƕ۶m>t]/wѳ8;c...mO_\\|!--mεkV%7Fb1X*Ivq{p0cPgiT17g014C!FMrڑJ 8.a 'KZr -!Í] id0obG 'a4э Jw 9O\4Y̡Σ4!FPC)qN忹dP9436J!ۤsU4Movړ\8F&9*ZFV3("1p;Ct@s |,i<մ#\C=z*csX^( ܰϔu`r{ChDDA4OCgA| G,_o͛76k?o6n|~2txJJ}Gԟ4HCRXBwiO`N0G$t[Tȡ,t*VrPB{OV1o&UﳵLF$r)$N{ֲ#rU<ϋD8;S,+w6U> cI=YNW2x+(',Td~!f-ռy2^ Yi)t/ ) )ɡĞf)@ԅɶd 'H ©[0]ȍb |l1젙zz@ZDx|eН8;Xl *&q?e0uJ1dԓ39]f2S /2Ag9_=8#|EsQ 0?M_VYYY_Xg􁃇g777WcqZwO3ă[Yp>C8 _gJ%7GPMme a6Л4S{+ES '-)CV *.IBڳZ )Ԑ1JYaf/XUt"n,/h hK+ar=O"&hC+bxi,vRDPM7Isřp!E3/y6*e[^bdPI&{'gAnz'$@HH PQ9PD&)pJ<)Gb$ Hocr g` t贄t^`LphIGl<ȕϹlC!=CZُlrC&5?rc(1ҵΨ(/68ϭ3 %H0̘W}vׄ%H y f1Za4O #(qYRCnh;xb^Sa[ Z(b"k( 7Ds")=Wg .˾/C& C%?瘐MA٘+擹 'ӹ<6q+Hک\AMA5tEMth2b22;"E32̤)䳈,a162(j^1!ROF5|dQc5SH&c\xkFSH:Yt n#cyLZ0,rN:eSΣ7M\NqpTt>"p+Xv#_v9r|k=S)p;u}h !)7/}Z1W4QK;y3Hԓ0^(5̔fi 4MQOCxRm3B1rt[>~4"XKPf5y䱜PV^a-L ZG6GZ(㴇up)0Ws5.b*<)f,!jRXN`Ft0Wx"zsO LҢ0}Lu52p>q|F.Tqpy!0O"vc6  Kf͚5k֬^g8q⩧& (  kL AB؋Lޑ3L&9+rQTF*3y%JЗm4 b Xo˨b3eQp_f]|RZ]񲢇=Ѥ-;91܉ '_q el2ىd漏9 t80<bN b d6-2AL5̠dr'#:&ڙNe15BἘ (&~7RF&&צ > ]VRRr駯Z*ٯLdgeo " o/ysȝZ[[ A_пyLb9wT]J#~ټJ 3Eyc1,z<*NG)Sxl*vVſ3 E9_BƐS&m5U fPTpsԓNO b+B6 4r4wc o)1O`mN5"4%6pTp@ ȢŌ C5~ykpFQ¼x;bBS8U)uRu)::>J BCORR x#"M{~A7CÊY\Fr)ϓQMdp&[v~w,(o[g mPtf`PΡ~y#ęxwryJ`GXΝ{g~9ӟy]w/++C>}֬yZ>}\z_ n9s椞~\pꫯ~ _***v?SO1conٳz앗74flEeeScŢ+&H! 2=]Yz0.\=1^ mS&ȦwA5AMWG;ٔFKTp(trŤѓv>S3e("`Zh n3ؓ"r'{KfT/4y6dp5R#)o2#.5ո4xAla $#:_/r@Dq9,b'bRAǘNvPʁh `)bC*k 6#%:*+LJdSJFؓ8"xF]C]!mL/ihcs1wxAl֡9N<{&)&sw$HcҾ_r%t-_K.kg!+W|G{N;mʕs[o掞uM7=O=_~Wh^xg\ve7xJKKꪬ5Cjkkٲ$h&HVە! IDAT b3pe 'WG7g!Пudϰc3-9Oo1`;f_ 0dwd Ȗ&'ƀA6%^"B08L*cs[?W2$EB\ZM!|멠'9 b*)4ώhKwM:wpQBN2nS1&3r,DЍ5Υw `wiLF.*YFEA c?y}̤S̢, Of:{{OQ` c9QN͝2F+QAY9/&<),x(^pZs$H? mv^wuGy$ϟgee^x/_r~~9s:::R7o޹瞛ugr-Y_Wrrrv}J J 6uc9fƌ XI$ښ7_mV !<ʘ2ݗcR.}ė}I.fqnNM0*`җk? :ҋW,l"v@؃ГfO3c.d0~dGT85)!fK>]!`5pXsAiZXh2xcSD9<1n9@5O1-2L.c8|3mASC~;gz ;+2xLI)o 2ɣ?(@2愧Z%Zx)L%YB#A#Fzr'sLop2 Zq8x :âhܗRNnbџmII a{jkk W[[-)FMMMJYUUgUWW#++Wz'O>~r%{WVT\H^gV40>>t1.uU#N!br/KQM d0>\4mK-_B bj*J+iMiN)\J_ʨQF?V=b 29\R^ #Kci :&GPjey ȶ}hbJdl xw] ~y h9eCiiiCCCQQQSSSii_TeeMlٲTVVxG+;wԩSΝ{E%]sD$ף{1m"0<^b(Zneo-<^ #FK&]1]yG6*$6T~y[djh.CVKV/:ZXDcV8/:c-TG7)ne:x-zOX\Yt.K#byIѹO/:b|fdLXB6d&y,1ƳGhB3Al:>IvdtQGKTCdʙhci9|1+>FxzQ68>47O&xxƙL>/ؕ( )D86O_+Vmm_!~5k}v=|ff7innkimqu1?{}Vdɒ qO>ҥK.A ӿZF]OST;մhֳr0*atO+#xc!U58jֳeYe]t0[XC!,3\tVz2ңb (oRzTbi ,e4}؅,pM|/r9 na+o5J8{l1*2~F:xSN/V 0U߷oߙ3gԜ{_x{&o7pi6y!Cb;% N6mzO>mڴo{^|\pAvv\$H oGNc̦!ћ4\1Ar)LHF fD_:yLve 3` c)u* cXA ރc,\n1cb&g+Bea0>Sݙn2ieeddNRY(gv,۽kJHj2) ,ڝ5,d c'jr8}lr:`l g#1M'f,2BQnd2FGIg? ^ Wq g XP@zɯIa GEMd" M䰜Z`)Re y4p78AL?s,JbR³9<%H .m󧨬뮻sIE}Ӆw[oM?Cw/ 3gΜ939$HࣆÃ]O'os>Fs8cx&r)%P!d K=8! "g=HG@{Q ʫ̌Z:h[מ6Y 9WJv}.U˞y۽*rPJ!yax0RiS<{KfeR :ՅĤti Cm7/Y:#Z&gkYB@NσsOws5Y L ߈?DA$S+-corم7A5#?K `T/XH:؝0Hyɡ+CdUPD%Q*AaGO8>*UIZrzGg,=iblo `˜>_j\2GG&f>PJ&aǢVT*`62iQ0<(V04@TeLck &8qdY-Nk9*(2YII+Mcq 9 N/?e&rSX7ShmCSN--` !oa gv̧w6̏F"NF&&H&\tksNa A ѿqYa䱞.*E3yoF3Cy._@za+S = c2$Chz y{>#*XBRE}F(U'h-Vw) B@=/҇~dғ,Ne؏<HZH_|d"8f x3QCM4INnb%r/SM׳efLSNln,6F"siPK=XD5c ݩ,Qw@h&8+<>O78FS*F5Z:袓%L,d9%4<; r3Uq;" Fr%@+‚؃2hJ߯jE쨌e.A?JN\ $xѿCvDV-hQ>K8G3\^gRx]&Q41| ъLa$b}o,a$%)dldCȏ W0cu grƱ%AVBf8΋u]D3"#?<9c((bV$#x&0NcJ&CL~SL蝕Al=ȋ41VߛeL*SԮ)c1bB?(f,-p2Q\FѿNj7$H0Lv\ $Hc,iM璪ɓL S\=`?9Q0:(_!'M**3EW:Tw+KL/bzg( γ4dEN`]X&NEKIwN{¶wtrI8ӨV^6ȡ'ىlt@G+糌<ceˁr ɘlѓ\P& (n0%_q=aԇ-lr("r:iTaXKȞi nia9JYh*c9#&=E;xN[0\('|CO!2RRcy@Soa<^&Ftd24vjrXA҃멍h3O@ Jg9*k=jj9Ƚ|l7UO'w$Ee`mhG+M%WYF O3T3NVIGr#Ռdgl|Klɤ8‰S~J! GvC $Hпo߹Os }xMt/ykh&7nHla;E_]VZz̯AUL[n49|RrٛbRpb Э)^6-{tV h΃cv 6DC!|'#Uk"7zx&YRArfsa"3;":/ a pͽE_b6L@s$)aO*wG6fSȤf61F 0q=pOn4PH5SdGp?SM,GJyY|oE\P')%zg(&7DnASsYALs#忄[y;%HG^{ԯO9nV&H AB?`Sˤa2S r({K%Or)\HYPM7I.Q *<4,5lla-MlHL!#䂩 F>2:v|ʸ.D&թVaUiQO1 F%}Bō N|mEO75l inKcY/44U/JʣC :(b(}Y͢8fp hóE\rH&4Ȕ_ql xdg' 3я[Fz[;:1 $H %Jy!lC:X\yt?QOwO6{̧lJ4ByfGq/xE_F6VlZ8ffXia+YRB7OtڢkyrFrhVL ؕr 5z)2 w1#M)嬤WJy9f r'_UlD÷ g9԰9t&A $a,a*?llnc+Y>[?8^(gh&znVzXX79Y`A{h 8*͑J&gcϣ-*$HK*UWfrbqp(_SӞsd} A Sm4r{d`T1GXJ'QV W^XG'0"Xq'?>[-Y>C%f"Gvsl<,@7C4r*вȅoꯌPVװr\2n2J-qˢ},oDv^Q+yNgs?F0>llwEFG>wԇ T)h2GATĒ}|p3=Q++7Au=sg<`\!9hh>ts?izx5]@yYM ͿRM5ur4E7ՌedEi i`?gs0 F;K |1gIϗeEet@sbx fjH DOmi_0U{MnX}67~V|;Oڶu'hkk{^'#fϙ3iʔda$HSả/lq tT x?3Dլg6`#\f %h~ŌbHŐg+9X#˛Ws%gsxL~~_a +XfLt1^V(J|LE\6ҝeҰ91ܬ?x3M(LrwuW&4iryU 0rl`f*ϣ||}S۹Tisvq<@5G3N>C=S}G=̧&2t8s@';)E9 j,xS:4ґ{5QADDCb(䯷Fd~.⨠9,˂KX^L/dș!{ _vҌX2\W8hਡG,ri1{bݞ`~ L}BLH>ƻG:v>t2|dbo 븇o29Rߐ!)q4?'zz C6p$vDC$S\/gS ,\~alCe'fh0/?/rOnw-]zꢗO6yUYYٌY3wU5&H/D[ۏ{qۏ;+@J>X&0Ĺ+54pR],v:cdNdF c*n`f0 (PM}1Kd,r;yʣSnxp!Z*gy,`8n(jS&5ޫ>h&Ne/U4PG!|h!܌~]ѵa%Yr x-o)Ev&29FIƅXbg2ꃛ=<,=vV \˘ħh- xrEdk(Dž7uF3T1!D&!cYȨidY ^fK÷2a^ə\b_,tCcI(ti99Ǚ7lb}K | ^M[۾I0iRMmCCCU&Hy?5{Bs:sWGıG#Y3D-hYx=}:%ݥ5!rtdOrOFxKWD`w XL,C0*:êWAZbtWfbZ`enY}b `PK}R9L 8rO97R.KӘ:zYQTg ˙EoU:hS9_&VF0RN4weݼcV8Zʻ 8Ja/G7Tr_x*hNsFElCnF9 xEyQHXemd'+ö7`)orNT rwY "4bƅ '/#,bZ |XFĽtQ(2́bl6/$?Aϛ6.#=z.Tfw֩CyzfQj(Υ;94;x-P~/439t&3pgL oBGV <ffRK3=le5vs"Ίa)j*^׸j.E} RNW"%l0Wx7i89=  iq ShRg:>Fnh lSn`\^|Ō~Qrt@#tnERy6i~!&lKxyHXM\@顉r{(09@-{8hzh*$E-#(ǰf3xLPx-8慸^ _mq$ $+?&Z6Pdq% c!M,bs;ռ\9 0MtqeHO)c T(:YCm3;YJCtsHFjY΃|ŵ 6U>GeWN&/L%C9bSLHco;dOvEf̷J(?0AګԑWAt1eR'D8!>** _j+ozq6UC81]9fg;\B _cXr~ɕ<@1@CBQ-#..naUL3!vy>Σlf!q 0LɥAkK3oaOVReN>C$ 0a L A"L pm}N۸=He\n8 QӾy mSUHQ)V\e Y4O,6 wa۩b J~&0qTv ++2#^Ng7I:^;LPɔ@{*(.`=SCo!QgSd%_/ ; +h.蓼v+`zE\|&_)Яq3 A 4ν#.]1lvށ:;8&zk8"_=ͼ<̤,n~jƨw/F|&_t 86IRrBܻ$s΍!jArVЃ hq>B(]ohRǶPێ.Ӭ#T9VR04p&iL ׼h!EfƸx&rJtMU,>{#l1:YԽ6:EV&Saiaf>C=ep;hJװň  A 4yw^}@K,:2ZD:ZO5etZT foeY^^9EvS=4QY#or:(^шPI?y^x>6p![r V5|h+N? N>D7dKѧ UmgXej:J)3Oߢ\ZRiŜG˖Di&ZZ8vXE9G{{kL.gˬ4OsI:][=fiꢂo {xj:B ){BP66a(b$Q q%ws/<y=&!pjB$ 0AbxW$ AG K*aq `: 4DŽd\%i]tPJ$ T&/L&P6̢^LoANiDƃb)*4M1jN= |@C칗bAUy)csIqDڢ}6 "nuVTA e ?1#*ʢ|n B"EðaMbXwwޡgȹ*EF_q8V.3$~<dB50Zh-Ȝ4jYE4fB]4#YZ.Ks4 LN8Lg3M1Z$m'j䐘-Q93X`q0!/Q ொ~D $xQ?ܗ.Þ=Md5 U4r!DiB5YRG+c*c=m|+&Kcm 0u ^Q<&.bu-G0_{AQOy\ΛH-diJ,ѹRcb.(F^#QEV^a>, :d^HFL&9!Z SeӪר[\!U,JWizwhWvo.j&8{[X& ma<=y7_cy(dfi}Jq89ۣ#= qT7H:禢hmRA'ThA(LiVv'EtFUnf(D@9|nD-4--lW:ME9o:V[*=i fӴG:9J%+ kȸC3 |:(p5f'2MëvhjJ?3z{= OskRQ,4?@ vaiTZGRȀ:CFC1E£ gdI'su,pόNd}_b)Sͯ餎袍kB.r>hri~qs?M_;ů3XQq<-uYJ/uu-W'H0 X>nq.]$Hb0нz^f 8Y #G'%V`*9e1丗FDFe]vR`7}ʻH7G=sVKnF [WPtb ;('(jT沕BPAY |7E?8ɱ; IDATJE 3Ub(t$ZڙλdpzXP ^*Rxh.Sl68Qπl۔BqzOPFq!a)=I1=u2cTs3`Zf GZ^"8S#"뮋;CY衁4+# vɌ5)#Tq uutKh*QW FoI^ A$ B᳟l|6a $xpk0;ΘKd$x/U pOp )Ri rUpGp"#" srX2-3#B.0btQnxK8DI?b!jB )r?]>ƄW=t %9tSw(5{XG=KHȶPt PX`HU9˾ F׊8()m*{(#e1zzc(3hh9\{e!Ňr#K33cM館)QO8^1kGbfr븅KFD/dCn>¾C>:5HM0 g7[` /.]0 X85 kBuIO|\,9)R ~=7K᥃|;y*h'|)ɑ4cA \&,51N(g륶\7 t34QԳ'x5#$+[K/ϐ /L g?gso,g 4X EbL%ƞg'0j`,'p?"]QȊU/FQ|[)b ]35A!frDGS١Q|jfs:~+=c)쥖h/ 2"̪DoJ+a]i~ GeI |,p$ oum8ږmT(Vj2ukV(TߦbJC =><PV;"˄PN"a] %+.&s尢"=b{DD+'c̢냽@ aɗhb"7H!?$H` P,[ $xap1Ys\n-TQKF}Hҿޭ,E&28Lʫoy0)gA!->h(c4c Z ?ᛑ86!ʇJ "3,f5sB6SvNUiCr){b:U z(:>G ?d-oe4])mHꔳ7;^k|AqfL+[)_]UnJ礇TdGܬ@%[breyC*-|' <Ճ1ajHGm~45.ne/qRȒ{z&2I|A˛Cp4ʼn f~!MGpLryޡ[ S5i&Hh $@iP,^:$O۫ie.3t[H;M3Uld B3tGjh0|q`𺒯o-YF;l?9d5T󷼖X yqI 3 v<0<YF#L?30΍U-=Cu CV¨FJ?YNH=ifѰRzXŕAqK%-2˹e^ύ%nJ>p$ 0A A80tp{L{U`{-4#i +Jk Ϥ,cϒ'f>ʸ&n6O8 43'CWFGg%`zK ["hdY҄A_:/XClciDδ$g/e\ݑS'8ƽdGʎ7'oN/}%ZVjܠMU(4vꟛ: G,6Tq;y%b;#y%Se)ߢ071=F&1Ɠv9ϝ zƅɌ%B&s#_xaEfr) Pŕt3kWG'CAC}4Rǃ?Q_m̦KY MG/JDL{T_W4th}*|&J7ۢAQp9cd9\nZ:B9M4,_> C9GƶKZyNe,aFpR, +4  83&1>d)T.s}jX~Ke.1Os k(ϹeDhvq h` C,c^D?L9e=?| t!(%za({UVOl~nYVQ6f&® ,F7s=>k& Ϣ,~g Yc_&8p$?a,z顗m,b'Ys0nfPT.xrT2| %E 簎q1ݭ7^D'J8DgJgϞ'8~8ҧf8,9%iQ/M+9>Ψ5{&@8lvD:tyPϳdE_$LJo 81vqWjVedEg+(]MUJ9JJ u"(fzǹ\DT1e711XJ kXFg6$]J͋\CF| XFgD9E{|o8ESޑi׿YC\ّG%|X#ЯpTx(G)@v=G7Ј8!yM~r#Eutfz7 G tr+P&6-d%c=j~jΌiyss5wQezߏpWtV<^P"%$ ѯtɨQg͞rG=N͚=kXCCyEyrn%Jԝ\ε[=`:v3=dөf=쥊D =L~:ќB|}\,J\@'O8'y 9.lgnQS2G^WG â륇I΋BFy9=>2dh!÷G1iSR)~]L"Fo3hewٕ۩pV8v]%ha'q1Q~v,1) .PJ;#$SrfsD+cy7MQ7>wP&0F́jxPڙ_>ne 's%nT6G NhA{Jy>8P`N|>1ּb?ױ(E-"!&J`RLivcƌrbKI*ɖWT$'6QDy-BeQ t ZeϻTY@4Mc'e>Ep4vj3)Q\(`=s'7Fdc93!Lr'i0L1,=kGt>n’cN5p{,ՠ*AOқާJ@e[3n?rY](%|}ZEaTnpr$p!Z=tF7С˟ 'Lvnؒ%Lz % "QD;3>A.p_u.;bv2]SbgNZ[]4:qR U3xe1)Tp\Jzcoe͜C6ҪZNd9Hq"q"g{BA!'pr3xKfN8#Ś-L tQey9IMcZt|7̳C:Xg`?F1Y!0F:(I24N=6qz)>@rEMPLb9og%}Ah!U,cR !)zX|:Gr&SG1LXPc 1x]HgS]'˗ťc9Xul&WDPh_r+,h"/N>_;9%-6 wlL#ƯP fcyle졇f4)6.LČNLS1Ҭb>hcC:4tAExcX8=#S}rsʥTP%깣v(=2:R5)9{˘ P\Wwm OP*<12%Vq";5TXp{xkyf3c>Ʋx *8zv3fֱ\N|l> ks.ScNu(ӢѴ˘G+ejMd8VƲ5\3XZ1Dw[--'Lu=[%6QD--MAň_1@_L5E1$''`nŧXC 3FlЭd;912n\I93vtZ/EQ]`*ө{3gig#[`?G<G`DDFCk!Kg,y2t p 2~RrUM8D* tEd2E`rb%J[5L?t5yK}S#ц,ccR&sj N~Ȱ]& y*n8Y`<s/i&GD6fBJu<:z"%+q_qr#b5CH)@BUs?ᾘQ<ȣaR@Ƞ?N?jKkC u<̗XFs01|m,]%v㦷r0XxҼ`C}|/ 91Z,-E##x7dx@zJgHh i`ic;CȰߦqk9qb7/d7=#"TD(QD v+}TEdj+BY81NFa@d1*L~2CbhN,fVc1v4xO{O >bb^ IDAT yJ&pK3-4s&9gYYC좙 SM!cJWSR$p|]r#o 4S^5yF3eL Tr>ǹao(*}1C5xL38}վkw<!g a ug cyn")M<ȓBn[HsG54' N>Bzsȵ@?YO->f,(p/=1bhe1DX^Eb4r?XSϙ'/QHɏnrKЛQR2>ni RB2󴳓nLyJ8=P {_:D7ZVg9<2 t.zVf{*>NSIs,`7y-4s>)IJfK{SʫgQ3r w6_`?cFnfWq 厢oϛßO|l]:Khs1JD>jYG(go4W>3e!pʢDgu>ӪoEEUNd20hyop"OrP%7hp.2Iz+C$ s,c|X.޵IZa%0$'QDUw%ȊVn)zKZ#Ml#$0j&mp_c=J$j~JXc=-Bc*{;S`d$QRh(|3=nah< 64):qZt,ڎr*Kry~,8V|YB/e젚^coN9M(L tF+gXˁ@A&Jk{}.[?u{]2(QAEQYq d ݼ0\cc묝4{yH :9~z =tDmL0qas8!CCZN H\"M=syud;=PE=hӌ 7y꧉\+pcAYtm8[<+ \O'[9q '\uT 3]|r)y`?G xF/c1&:e*J" N:bv|xۍ~:9?zhe:Cuqq%2,L3nݮz.b-h#(LYd׳<`l00LF^ϗHf#P6FN;0#?uUFK%QvPR0sjy+~? @K.EHc1P=!x3nVQF#u19a/X(D"As|M|R>ư~^|z),n:h N5 `ՋT{^O(q~?TZZ}|ꯒ3(QA8,苩=G5uLcyZ3a-3fSI+?ZGXDA Gir2rC(y%"ۃR T(%,I 3OE~,[#EYʙ:z`DE[yFpoތz|vYES064vb5c.7FVM\W[PRo 0=q}(e(N ~كL(m:8 Eagon%E WSȾ Mel "CH'\h>in5[C [w#iǼ9TQ*JA^L*R ؂ٲ(ڋkHme(OFmc!_)s3FEtw<i8z ez D{|2N` ^>vqhA56#a|Ա* >H+d8}(e9= g C:[GT}ѿ(WJɕLpNΣ*tgy ?|?qR*@d|DL_ fv닏 "QD]q Q-]Fd{s=Ync9F%Fwt\ 8X@- C+mdƚ:h\ݑ=EGXd8\9Lj,Y}ÍabpjZ4]O4EqN!l5e59 %~A d G7eDŽdo NQT @GF!/2g8Z ;c#61fFXF-/p.3KkiF8@ FpY:Y2 bsXL/XiC$k ]QT45HGƕLDdSYʿR66 O:.P @/HwrtMcƌz'0QD۸A5 +e!]xtp6Y4?r:*D&C3|d>i䩘 Oah4fNgSɵ)j.<&!1οJި6|> N ,.N+=.WD>.*"RluBF yxm֫NjTI%J8D2دHgDעAr@Ӿ.[oTUFU0 сY0I4vQrcAJ~Db/1-fhd(,g19QXR rJX0OX,eo-1tC6Gke2d/Ca9g!>M=!=3Œ޼CJeRLN TPO>fk۬yBs12 6?Ecsdo9kR$~Z/2fzx8fyQZD{;%h4(94Tro孜#Tӛ'yc3Wa ۜŸh-g35,f6;h\!P/*%0ѫD JtWM|?sYb7c4qhG}q#^+ `bOa B# R=!χ˩6>wPx#rƱ_l4cxaFn#C LmA5[yZϔF)p!9rb)('3S'x/P#Y *L㨉ҚGN=|#,gӫ"pK%0Q(Q{cp4;) rb 6V+5,5 W9ȱ.dmQrX`H-l묡%x?$9D*nOo"p}t=7%][ޯ)-L?X~%M9ygc:tOb0SA7Gٻ sQ,ɒ,w7\L`J(!ऑ{!7HB9BIhN.*Yzf~ /?ܕ.Kf5~ϓC젞XwhV Nv.C9_Ym÷J (Wb*/hsG0hp>?!ȵ1u댝ɉB;XAmJ.yrkw(1f.2]6p7O^G裁R#+A W{OABǤRw{++R䍚/@\L{XR( *JG#_<ȮhkȰ9U_$2> !E`XgmaVcQ(ɑP=cWSd\jnG,ͭGHqQ@?q O”~&iiv1(&VFV&0JG'F{^e2 16C븓#'3a g;M3dhirH2ɼ rD =cI3|/r~Lia]z3 %->OGfMQ%Rr"?SY@J؟Br1Fs0uQ,8㯬_CVOHH`ۇܜiӦ?3;wחݹ瞝t䂂&$$̋{#>Ƹ~+8h?1.@B#F7GHXM5?$GV IDATZr<lGbycW:*uf;bZHq6~g̉* ?@0Stq{ c%;Lx󹌆0F;P<J3}`9jdf"PG5d&3)<|-Rg-Ʀp9QnoS>fRlBynFswN1ysM,fUC^1Fb:i%?{ u_|,ENlKhLH~ʋ:b2 ©[HOH'ܜGL6ŋ>܁SM4(9 0s8!.ڋc%T3Y([?fXȽR87v., 3|Is1o3s) }k9 Mps+b)#A=yTF^KFfi(9l&"3C u߲@y ]-ˤXdxC"IJcx%ܡ r}gr*Xˏ Nl#f>E [>>ZW>F3),d <Ɓ4s3?aWɗ5 <Gmamc 98#4mBR(x Fr^7(ۙCTx*SﳉsU,,BۧfߒJ kjjFwRyEɁMHH( +^SNm7@fQzAȰ] c"Bfg-AL2262>0z&UZ_gȧ6`&YB/%tG.,^!6N2Ѯ|ry|0j2\{"lYMC, ۙO %F4 䑌&5r")vE+!agXʱ`ޙ'4*0y LHHHHHdwV8 ._p2G=M)—XB y6ls) x60 q}J݌g#9 YFRfZȕ\aNsF!{!CqJLU=̓@WXivZVڍTQL=9{ ,$&YM7Orkm@_G@I~nb4i>FQ6t2%QDRc0]b&iJPq.%:!6P%i+5X>KKarKPH1}6><@6{,$xky˕|Yt1.ΊGYKlHeg#ao|E& LHHHHHػlx*zi<ZJ(JǔeC ˔8|H̦3;z(,o:cz<1shfjHlB= 1):B41*v~H+es 蠆y8Ӹ߳ ͅXB>S0=%SSU~8<?e>8T"׹)`Zo4wo}F(̉(lF1e e>ޜ~uT`;]T_~wO1\ƇJSK+U0s('36 `KHG`L9Q^BRď8; cz~23Hx`q U&rXK|ǃN'l0a3Op,39&QE`9]L/ãc2eN133=l$\}Ql#E9c8</k^+| XHy'S~Z>ѢA )` cR_Yœ.0;)vZ8XLF~pVMN (;_IK%݄D&$$$$$].}KӿS4,neg'ZShH u\C,lb,GhO vknIb>f87r&3;3yh Ctt+x4dF|6(<<(V"Vβu'|=8fDJicG3R#nE2P,5jܫ9hb]F14ݜN!0),gw0zs/Xĉ\DcV/R-\,xæh /U?0\ȿPoUZNSQ*^VF[xxv,ÏWhv)0;/wicmNUgw]P5QEhc?&F*1.b&ǽ0e ӿd(ܸy,`M~׮Ӆ*)TK.x4j߿B_1CY##;nTlmK13|1['Fr~LecGhELb;cm00\~!r+ _QRȘzE %2a6eEڶ?̺Rcc) Gs1?blQDƐ I0Ild sv2;"k- t~IxVQ$.z|!( }rl @zlTR41&oÅgy6go2~0!Q {u[4`+|[Y1'zf9(gpŌg$)zMѠlB*.iHF˱|V|>O*?!N c8v3QpR 9>ZezY^a'C#i\&t23tT}:}7"Q{gvp Qό ,!#w1qg$X5 蠇D hwLk8Ry ,e$R"7ԑ*îh\=^bEQEG>4sp9 VF1_s7CٟQ9rFJop4La24SD褑ia1v}~2yvV#p֋y9kZ6+s?({Ȧ M 3f.X7@3YS|L o׳}]E|%s5ͤ,4&$ 0!!!!!a/8j/購ʱL{E19SVƔcΈ9ټ*(W٣BZOݴ d8142hRg?R`K_ $ ȉ9ێȥL*fHƆhvZTKh=Jٙ <:8'm"_Pc^aZ_e)䱕'3|N҈xi4\ϸ1tvRGeRTPO-#ɥ!j2ZcS9錥&F2e|ѼKScl2,kCsZ OѡW*D%,eQJxo̷mWSf~[L#0!!Q {Ǹ^;ZC%2r*X\=jJ& d9fkW禳)|<͊4ϰ \S9Uj]gOQX׼[(xK w2fZɋ2d=Z62ahV. ȥl\lɶhh )p0zR".Bb El<2W)e g0o9r/Mu$k /ŨvHI ]WtVp`uStfcSX1*vY^Nwa`Ɔt/'yby= ڐߏqs] p=KH`BBBBB¾wy+EPΥT@1a?;4}7]lwI+/!̵RW-nzoX}\hDhEB\z({\L7k >ia?5X²؎# ߉*v!WNbei",ln XBSy-ts h6SS~#(|w)'^,+2 9/Cv/uG)E I$İhk)c'}LV:Y*}\G7N }43[b;iyh#ZzhnN?g*y0gfg1~lo ,Ыd;!!Q { WeϺGy5swT2d80 t^#5. d.9%U8Ø*\C) S pJ]7L!+)LAH"t`tF/DŽ&9Gh422B8M# *Ms9qRB1=1>cQ̡Rq|VWX<8*i@_ t$U1Rc>+Xϝq.ՔG!荙j60oEAHgv.E\V^f | ؟xu'8To18-̓<6sdla5/p7symq!ca/kwEZ8rؐ}"t&$ 0!!!!!a&R`%Sy2fW馇a,ת׫!]Nf+{Q妈]PkJYFV c?02hg7Sa-PJYQHp(ݤCn ͱC1]|)Ahq)asx?A]60?iR XB#YOT6S@tr/D}[KvB:p;B'724[ea<њ-lb RF:SG#Ci 8>63*vL`e-e%60G="d(w>0f(@bS/ȅIElLJZlZff%sN9?ryWp6'ryڳoh= #%\tselRm(`!̧ u UaZlEr;UtդfH]s6zV"B3 dc58>.NF(4_4,Tq;Ϲm^qf})"[*F#ߐ ӟ$4!Q {~^qoS.cS4?i@ ý0@vjg'?XE#:x.drle;S&q<ƷHk\?ïE.OPFTr:a1=B14R,5>VbXT ({9r\,%vO]Eёb-kc4OG0Z!E;, 4&jYęLɥ4(Q8ͱ)qY]GO9kn2=pzc՗(}-{q8F B67gu;1@%%Sb.ۘ[hiUFe>#"͑nrY‘4G[|ib>?c(K=?! ghfS8e;^|_g)z(p>G"7lzh`iLb'fiJ桞bZh`s?a=ԃ~A9"Hje!0-Y/Lq)8H!#9W:~Nvet Ԓbrl$>ŧg~$p&˲PwE-MuyU|kq7eT7NJ׉,LH`BBBBB^"60#.\(iFnzHt5SePqD# ^SO!1EPG' Fid [- 8ϑT`q IDAT(iaL싟7>տfML (}KⒸs 6 ISH7El{q͵7Hq7+ȍ" ep&$q>L~;񒅬msi71Ra.foITLB.b-_ <[[xK9~Pa\B#JZxzz9a 9&ZŜ9 rnj]Ӥhd[c#F]0[6ula97&YMWp=y IJ"ճ1~ztӬ:~b"7SA>Wd13tr"?|nӗzuWb1oA=4ul)KrT7BDK'1{_!!eID 0%쯵Q5s7P5,bj(d3dL mWYL;+|d8Vl?Xx፶ϫ9dNCĚ(}9VMm_Z}Y!do_vjO05p0۩:hPA ci6~n:94gkg\tǽ;) 1xsORwc1VnbSNRɥC(F~cV9⫔a'_L嬣UKn1z@UYmʳL!P ȣ*uklbG>gpt<%4Gĩ4|0LKX$`#n1n8[zXghejE| X_t_Iǽl'U7jEjfchB!^ 9-x,uٜA Jk;@U"(+!?2r9. H`ŌX+fqEX~O= E'6 g$y|T2hDvkq( N&'zDEbQ81$愫#w6=Bқ  е`å(T,,PC H${qaXp'''gr=g>yc6VzS&t1r)`/~C5Q ,'#l'j66Q,>Rqs($7fkjaPt"7(v:y|25g )ֳ ]tPͷ^eL`˘;Tƪmܞyb )5${ LHHHHHxOpMOxC|, Sdq5{Q{d]g[瑨+j8=ҙi hghZ?*UiO#)tgaUKhJڨb)@B^d,33jMDH<oei3=4:b~&38 99B>ڥ Nc %RRĥ:&}ܐyzpukf0\b0t XT.%4G؛<4<ѠHy0nrMI^D'rFެq:^ڙgh91ٶO>y븄1,fv򕚐(>/܁gyY~xJDYJ'צF¿dJ8zs'&jhT~!bfc.}Q )ȸ73nr("brS8*Rz5>T@i0pf3sY^_JK K: l0fRp27)41}Q{Jb+rGE">&8|R39eVn,&3B6YN7Z(c5i_c\V>;7G)2MH`BBBBB Vfwu (g<"zG;C[ j <G%XH6z: G@h7 a6kBL ͌K23;^7r7'>6|(ɡt2+l&aWC]!X:*QCt%22ƶ[#igei7H.H+9[+ fGD P0ͦH c1E~T-l!jo6!::@WyeؕQMك s^,fk 2pˡ<ȃ ^=zA6Q%ZG79 ;p}^ nbg>nC(Il.RLdW:8N!w[@)ʠGQD+ad1B 7-ccȖROEοKoOf<70|Ca#\A41Rbr2gp _ |>q"Y !<>I<5@"zyn 91G[^)#OuL,GyLPdZ=Q3b=/ YʭR. !ez@9z0øI T!]Υ."/BG3R@gom~XU9ftyNZoGl LHHHHHHxw8:v,h*"&OF=rs"JKh`<̏,+H|cD97bb/3 -tDy}i}>941,gKLz# bH\/Y1_ "zAmT[Gk+BVGNG%)9`09QU LQ԰MpΡ2,I#@Q |?q-]WZ‚a:)~}l۱1X1̔fc{XK]q5gHJia:>ٶ?[;=`CMH`BBBBBB»F}xA0J~};enRUw ,aZe.3]oG 73|_p-MOPt#aYlz'h`fPĭQoک_og?D&$$$$$$y; Z3\=Thl3X3OKh/i5j84XN򯬣zSL S(dM)?q|0&x˨ B`PL5tÏZP t?I:a1*nɡs̕X,9r裖fzkiydwr14I6c4>{[A&f6G"1(/2Y,H 5T3QćEgt-XOn4ΥTr18Oq S;4 qH~uD,=DZwHF~mY&|[i&y8 SK1Ob)i&7IQFi hJG\{U~ǿs8[hM,-lb8O@Pox"ėy s A>s?~r;D&$$$$$_tp1GЇik|L_y_f1}зIqXN{*>Sr) d:"s@ܣeLxJ wG ydqrlog2E:if)awe13y2kSɢBݕqh tCA9h43"VK4擢:]T2I̎( 3. 3;+rC*w 閭]8=̴yd$K3*dYr YNݩ7ƨYU8ʹqH%DE VSo?[H`G0Lc3Ȩ-YKH`BBBBBB[X"p:;a n%2KnMV3cٺ8El)O\L ܡig ٌnL !}}Y<Ƚ?l$YFd YTK,e崓$Bb2V p ^a3c#O17O!Ք3a" I3#iv>ÿȣt+jI=OD{/wFF=iY)Բ<2e#)Ô[ӼV4ُ~'_AnZn94mc 顊\L+J@7Q:w3GH.DZ;iJE<|r0|9l!rk{N%+ LHHHHHHĝ^5aP̄\ɍ4N6/sTЏq Yf)ʸט7x5Fi/< ^%H&?mL$RPG ;le?g\d7.cijteW->ҏh}FiX3Fne, a3- j)ZcEglUFY8rjQlvZh%l`|bh.9z;ߓE(<+"jĄ=alR Ǖ|JZP.̞Qe+Ne hI~J` ˨`X,n [!78=>f[8a|IE/G;)Zx 裘s&$+ LHHHHHH3z'?4Ӻ] ^O'#.\H 7 T0aM]a`2~ˇq dc~WhڙNBDӒ۶1,t/2lx]"})L++̺BցɢYK3g>+if&^c=i2}ԑj~C-04O;3ǘ},5%ܒ%$ 0!!!!!!rKe_cTSK=1~p XXE?ꅧt4*-җ+]C~8聯Or8/ÐK%2% JP̾,S88&rw?'dMp` d Y㢷)F0񴱉H*b/o01: !l24d3ROVÕѥ&1oI7EZrX{6$0h>6@ĐS|:D&2U< *81{願 3.CXΕ+ze7;wi{5޺w"?FKH`BBBBBB; ܣk9`]j#ߣj. ~QchfsYPl,Ф$W@C/B=QO/Ux01YT1pwCgm)d\rf iEg#z{HP IDAT[u0S Q0DFK&æ>(ڌ23l Jj#'R2"IsFLKi^3"^>&v ewr"H>I7Fc"AK/ia s8Ǩ'g~#,=RmOf5Cocq mc/|%$ 0!!!!!!ᝐE&Rk;ؼٛ9Ա[d [FV$s#H|'i9zKVEmtџaԒ)r؟l!3Oq]ȘL11+ϢV01,82bla1D e)lb,;Y"Τ<@K90NJ=+Yݬ xZSrG ə8:il~ 9 >q0KifOTfJc)w \qⴘ XF9 j`ILz'3;QzwbfV2ge(wyP4}mdvm1`@#g.7ܞz?wF̅,jcO΂7mcX_BBq*ڐƷyo1;H] :g#xZRaoWIB5_g=xmu:ؓ&q.UxC}q(Yla5,!JAkh%251ʉ \^LlC#7FX]qrBQ6,(Kb#vEC}=؟)͐Bp2.rNyC!8jy us@;vEʸ2>Hi8Q@1/B)CY@6 q2,K4Q>e|)>9g)@M2ϝUgI_Bvݴ Doxv|TP]o]3n(bGp3g襂a䳅pQeH؛lr4SB{ru,:Svc i fHd̳4@rif34mL a 9bcy ᷔ:f&r84/S* -cCdC/Fh(*B+#q)[ϏYtF!91qM3W)#ōtSje+) hc=/?"l;d5,`-}2ld}EC\b򸞑\N9}Gio}V<瘷e%o$;9 KXyLȢvo4GnBVq B-5"k8"mHN(EJҬc)M-B8ˣG~"4CBe?bxX~2f$eQ;5v7#]rEbGq%(d䰒RҜhf憇9Pӿ722TX20rR(vc$PK;s'Z::ېl;z=@)l4LZɏ`hJi.cX`%tL#|eEN%0XJ'Wq Lc:~sN[WÄ) 0!!!!!7E9seVLhFEXhK+448׹5b0(1ʋ*g+.(QyKٝ5MaZ顂QF(hFl,jfE̱ $Mw!pw""$E#5L-DfbeEaI'yZO5 !MHFMG6tlVS`CfFz8TW9 {s+zXZLHS@]L)'DG◬$S̞A5tE RICX6̛KϬv\M71ZG>"Pk!2-?c(b0<:YJ5}Lf*9RZh'͋`FQBޔPE/oy|ʸ'}g+S9X]$ LHHHHHHBG y~ (fpzv7xyM^ 1.F@G%/r );ɂm-J&Io⮸dΔM` |ɰ)bKؗlf$hgh!l%4p#M3̧n&lP"Ƴ_i #^qo+21}YŊH%"4gQBW )砐RYK1KhLJM= +ӓb># end@)Ҭ=LK92&.dX4f)jeX\V>>ZL3sF~l,)cx^wWqs߼'!Q ;;#t:7 RH1SNvɌz' p]\ҌYå&S.kIxOɧ߰$wI7CiF91Pfybh y}ԐIsRţL]ɕ,"bDIy-&Υ|SEjGRD1"nC`sb|Wt3KiLؠ[oc8 ؋^3ًO9XH5u1te~K94qC|Z dP~).a*8jf9'h$5\rUI}zw4W-wK'!Q ;XT?NQB)eSA HI_tm|ILdӶ.mnVkӢA^F=“eJSB.Գ(fh?b߰G9(ZO4ȅd14<HeQƿ6\~D[oQK'G .Lee FEkͼF~|&I0IG&<̮bNT RG)aD)E;W}ǭ%$$ 0!!!!!!b%1,b b>wC邿D#x~tQGHM6U{we]}aU@dP\1%4@JK3dm=[2Oj Yh("(*003!ϩs~~g`f>|>y:[C:ul!,?m 6)rlvA3I 8us9$pݘTОiZ*a1$4"$ȿVXD>"Ͻ^~dq' #e[I=Ԏv'q:;B^*xӁL&RdoK#$S6(dw>묥e9_|*(f B|h9.$m^4 +RtJi5Nc~Z,~ SxC˖hX|ԓ"IlMfJrYAauhҙT @7P I`21Xt Xa˖f;G"QF"H$;o}ӿ :u6(32ЍɯrZhͤIUI߬V=V˱lSH3iғԇ^6kCJ5r2ET҇+IEHQcFІ˹5b oЉ\q8z^Jv@#}Zv Me9!JІ}̖ f%OQI\˜<3*Ir w?c RGpTq=69Ź.vg E :ЅQlkgU+e&#u\ǍA/ęL.HfcH{hl+yO@:ӏdҞ$ҋ=l6]Ǘ@;RP&~5 #F><-%H14҅>E {fП^e9g[crN9YI"iE.` 'jKğ,#H$<~_}z B =W qq|2r*8+go x>O7S0<dc[]=)nQ0.E"D"HcD0g!p ia1Tӻ؜5zgk>T 5dцxX"8c4ԓ+8b$#E]L&H^7(50l.ڃɧYB?pЃdPGQ8 <\IɧTp;Aml'5&(aQNX V2u3o+a6Wfvҟutg RM XJkSŊ_7~WZɬ?LDD"YZ?ħt'\_ H*td%t'4NQdpO &vz :6ĿӅzӍ ~LżjN -,+8{ӴГRfq*ݨ}hKvlicƑ,'y$‹xH yDJl tI0ZnA#de i׺&>bʨbP+KO)*q c3ݸ^^ HtZ&'}ϿF*F>f-H$D>NwC>:Nяrv0:nti%БJ`k5B#&( pXN"ӎ$i e2hf$p,?)߇b5o{ia#ou7gM<@Z*,("7 0D"8Lou:N'$$CB#ikVWiUi+`M I|"_bC%|Z& IDATJC.K&t-ٴЖL)c;QWC%K)brJ1QM ڐҙԒK=oӝOKzXOmU)6__kG5=B0J$Z* g3{i`8Lg {Xޫ)5yЋ&'A3\қY)ԆPWC>J)沗vavud 4zҏ;ld" rhg8BT~Ǚ=8!ˤ38u@GPDӉI C `a ,b:_#E!'їtFpiiUjtc5p9X`;LiW:4O-aٕA;J-WfɫUUwl8XnQx/FD"H$rILf*grVr23< \QJ9BKI¨PX>gCP,dé #2HОe`G,:iB { YljpjX=vSVzQJű.&rW5hpHc0 ]$@ڇ!gH'iv< Ay3@|5$)'l5ӃB^`+g+9!ZPpҩQjK0'Dl RD '_AF=si5a~Up_#ʿLJD"Hcf&TD?~5L ˗XBj,ih8ZG泞${y|/;ަZP@C8PyWOrxl R2X vӑyjL/ib%QA{2b=?t +NgEAI?ǓF!-12Rv42 ѕ|p<ۛ>1^ ^KdSTkުsGW/,e:I먥+?f Q4q]86 Mx̣ {%aa7ki&Z:b;s89XN'^#4IW7y3ݭ db:ӹFʘM3OwxUPNT&H]v\HP&+v&%{o_e⌠j9UA# iiʹaaܽ -;6kY.\_[Ʊ`9}["OD"Hz&25Zl3Gk&AK[j]bS"U6PK%8yn0T2WrXC`)DAΥ?a s4AYpKTsߨWķղ3o>`.7w3[K=-H$D>ތ1\{@il7y6n._a]A#M<í]VION$rG1l#Ex\6i6d,Mla {My)QE"QF"H$ ?Pg0o)%۶IΧi40(;Wȶ`[ᤱamon>K:uld'Ҏ,g<<մjjyFv7(LE J_B2%FYC҅<3 ShȡI*xS#ѩ{DYK_v$,ob.IM_2Hp>Kk-G:-d2WLGrwDwREDD"H1SIT2KACO Jakb 2:$;Na#zL2 αT΅Ԓp. Gs1iSOA=-q;9d Zf+Nޥ#9TwBdK QFc/eS8R4p7edqGTQDZhS-K9i,uT#9=,e>uCej,V6rdil/qx3f '36u`$`$D"}Fq:>Ϸ1<ū ުG%gr4 |nMna0?4pM<[F! RdùMs64=F1>t \ƕ|7XÐsLB:Ӈa;C6HcoӅL9t}ɤ7)*

$X"HMXVPfq? d'Ka+x8c)bEKu$ȤB@J\`ZoTlBb(^v9W_[!t6qGD|H_$ 0D"ȇe }@`7Y4%2h7mf3ev4s?!|Χ=W^ړN>oly*Ng&/MlLtg5H:B#YD/O zPJ/p:P.J[g0=9:ꂿ5{_C[4Y0?$f>P)g$(g̷-nd;桏v }!0 0D"ȟh眖#3)]%Nx!E~|sY\hRr9@=t!Sa;iP/5oQéRL>EP¥RΫh$F@=a3ϱ7izLG1)|MA=I$=\ӴPZr>m-{/C8I)\{]6i_fe&ͮ_S9QXDD"H$_"p:%ifr]Wq90IY^6B/Vnat2s]n̿<XQE6m$ťAvߦ\RD9 "^K4l*ÖfkQF~xMJ(}Iyџ! -o0yr[x ȧl7x2(JI'v oɡBc+T"alvSe ׆|s?;E" q 4D"M`ȃZ &8}lp ul\pﲐ s'lJ989tv2ZhbEt*qQ-xaL6-S:ƒK?Plg}F7"A%1m g'f 6z63)&mM>A.J9j_/驮=YjHY6|t>`D"8D"H_gD(a;xhmho4ȏ8x!ƿ3(`GoIR4O/K kx, f3pIM~ɝ@ S^2My^`VL3Ib.|>!#4G_c9e/^+\HGFC[(xaiR:eA/K'MOcz  Z[^ڋD qD"ȿŵ<Md㘰|$X@?n㳬~pXPABFJ2P<1aG/I#IЍI|`0)cݨ6vRv8oЋ&p?xa-Xx6vΦx7fD6շGugљՔR'Zz(~ZB hDD"H$re*}kmTf@3J8L ">A_Ӟ.4҉v^dq>i|dx)$I_y,'No6ht N6/(Mt#E6]Ch#?9CYJsiwd8cId= P@Wn?39tʕva{U*^boC,(P8YuYz־XDD"Hd3s֊ckE%3fq'S3dl'RDW7^%IEG!M.J h 8v`Ȥ/oGo:emCJ2L?nӃXs.:Ӆ1iJr%VBh<;94^@gra-Ⱦ)L+QF"D"H$*&CkUo| ug[Ѓ 8T.ٌbF5J7>I6{C #la ҕ,la;좜ԳĖǍC%N#unf1?t]֮G\  xyB[&Ϗȁ!#H$9~sj(G8,&:+ǼPw&Os-7 { !+&R$I]XL. 64(ӅI̡G2w2qDPEI#'b3љ|)<3̖0~?ZR-,vN` o6ĚH$*H$D"9S81L | S䶜ֲ2H>Ӗ|+&c8'Dqe9'K<0JG%"jLh2l" "#"DDD+$hfDDDK.]D ˆ'r#e5"9#ICdIt/QZ `"teyn?0  OeoTFO%#K4Jl DDt~"2'J!BGԊ%ѿDDZATHԈQD"= zBh(Q1E%H(Ȍ(HXޤD!DvDTI.JU~O+7D~pMc֬ -KRvȎȔȉȂȔglv'"mDD ͷHDo]'U-K*@ow5;LO' "7"C<[0ͿZhu%jFh`|t3 0UIYtN,JdQsѝp:{=DeK"@0%mAtZ>#:KNdGt? )JD3&Ѳa@s&5`+*,YGMcn'@EjfUw݊*Jy Th?#}‰,lHvJj.D g=W]j:նEZіjDWcgdʟj_>X~DYD8h[t6ifY{.'nL?F+ɻ]BmF0}n! !j_;.'5[k=CvJ {<5:aN3sDd`w{ |v+AZz~eRٰj[[yS $ʭg]'.~olV>"OͦCiaD~e[j/TՇ=.})j/mK([Bdv-ށ?fjpmThY aL)L"@xl1󭚙=sD5u\NTDaҒ6yօ[}s}M?בE~ZVߺP~4wuxmӾz.{ IDAT{gu`2S:(Ɍ@].e7GvM?s@ [:jUua㷇}TL,o8.q ={*LZpQ@@{wn]hqffEiV +bUu̼;jp_ @X22uW;v'mNNWysD? -|<5 믿!4wO>533Iu떲+Owoy| 2$^-+TTe-WÌdFna& Kn^|޽ɓ'/\4'X~f͜ihh9bg"uҕMܸqC(Q_hxM%|GPG_ @ R *",>±~.W WV۰ϪAVȂ__߽{VVO<^p/T2ܔvvɦb "ɩ[gUPA˫`J]Er5>VKUSrư*w޽!C?~ 4,=EVJ$..ݺe6|ڼysosYͳ*J8Ս]FE"fBMٔ? "1*D7GXTTQ(ϝ=3C{ 8‰ײ}FtF-# & "eqlT)luYJ|bx'L<5EmMWwsN vh QLٰj`Wy  T: V^6r5.21Xɬ2ZYKO"޻oں3"aD~D[:hYFe '`նwam!P- CDhVDDDFD1D3߯Q0Q{"R9O5L*-\uTgl?̲-"QHYD0:$"42-' BLkj.R=_gEZ JkW~*LekA}R lʟj JkYJ=jߡ#(01ݹsg r~ 5t0+k!Cfgg׈pܸq111 r LLltӦM?kݟF>sC KDP "Ǚ/W># !R6f5+oStĉRԩS:y.=zsļĹso/_<:t/Z#"@ #xΝ[7B-^t׶o6f8DPyEPUƭQfY,.ZRԿ'3NNNlgשcui&%*:ezzz.QQQ5z%J/\N-\]LlllVTTjƂ Ѭ]#BdAC^~EJ0Dv2aW^_~ُlll$~ff&nie|Ba}yM01:877?{ljj+̬c< LDBfVU?w'D35Qb0Ps"@ 6m, |>(==F(֭k$ݾ-PX&Iƽzܱs'7s)sLY ޙ?u(Ǹ˗o@B(KڧO;v׏gժՅ$0޽{EEEZ#~Ͷm>0R99P;W%9sJ_߀{PA eU44=wc`_9_xSTT~-[;ٳΛKӏ6m6u*ZÆQPy؝+D~DT~DMCt,l, M%/ָ^ͅn=(Q9l !QʘhG1g9K$Ŝ9.}PG"Ɯ92J"#9sc<h v[J~WZVAE @K/U~j^xp.p 4/Xک?O O*~3mʪ33cƌF fy"nT>#}H9(,,)))vvvk֬ឲl2էϟ?_~~Y=== 999#GTV l.`vd#???cccɓ'ű]r\wn֬^:uNzM"|r-6lhhh8qĻw*+S/߯C@5@M,>qrr200prr`;vh``РA۷9 `eeuV,gggCCAe0'+99Y>slkk~p€էD"HQJJJ=޵Lb>Q<o͚5̸#G9۵kwE9@53 t֬Y^^^yyyǏ5k8nܸ~I(.XgGgg/_^z=  T{nsss333??<"666f2fff2ǷnD}]]]׭[5{lf۷o;88ԩSˋ PT!77wÆ ̰RePQvʕ+b9sƏ`h^^^ywҼc׬Y[RRo$**ח{xx;vILNN1bѣ؜Gg#="hժސ!C"""Tpiii/_իɓG2Nj-bCPoذ!>>ʪCz'ҳgfffvyʔ)ʔǬp0dllx𠞞.D@H@BC9ڭ{y9u;w^v-%w7אM9 [93`ƕ˃:Zxa+V vSkE-zHHȾ}LLLvd۶mۨQZhhѢ8{{{2sL##+Wn޼YENVxxxhh@ hРsn &Z[[[[[GGGnAw^j@ pww0a ֭[gnnnmm}ݥKsW\6nܘ9޲e |||8?GՏ'J6e߲)XĨ1ssGyXZY+3#=X`74E99sghO_bΜyTTJ?a`՝ޝ;_e`I]c)X 4َ::::iS$ܸ9u!C0կ_6-]!3@_HGD mۮ}\߆u0?iӚˎ rllt`jfz.挮۱GDD_GMh7ořYYw:Z7n,H"#9 ѣ%%%1Lb^=\ZRRr6&fpO<DP4:YqCZ8hW~z;ut)vw-2sf@pw޵gysnϞ}t_~[ }x"(PЄ@֭w[d"?~qc""زy#wy"273[v x"@ hBQwcc{ A5܂˃*^HTT̆G666LKU2ٳgC 111111>HԴiS[nX x{{gee/*LLL޼yCDiiip5mT__SN D&*rk(53ȴ|»Sؼ s*|QQQ-[T(l"-Ѕ YT6*z1T  ۶ܻZ)¦P | 4[ c7CUnݾ'pK/znӧ;wΦ \d 7eKvvgϚ7o}"R4,,lڵ7g>}RSSSSSK&saagӽ^~իƍO8QEGᑞԧOn5dBalllNNȑ#(,,)))vvvk֬Qv/PaQdo wyTL.]###ݕ0 Ha +l2͢Wы^Pضu%Ja6'*9rvv6444hPvنÇ722jٲ+Wlx1܏֬YÌ:r䈊wA۷ogO kݺ `ӝ 222kn ںu+{ʑ#G|~v.^0UXpoooDH$㒒?(HO|r8Cnn;<<[T600M6 )**Rѭ[}J$v҅UNIIѣLc[[DunVa U:|kȧ;n*̩zzzfee%''w] #D [X… o7֖9^ "S^TURXM"@pQ fپ1888//ˋfϞ_ ?d֟)Ǐ8*ƍ駟|.]Rt1ϟ_^=&}֬Y^^^yyyǏ5kusvv~իWl>>>+WsaZ@%~5d[.???++klMD6mׯ_ UXa#F4idƌSNeRdf8r䈿 6lo Mi&"JJJڽ{wK6L}C:u>;;ؘ`hh*Tgo w'Ӽ s*{]ta;f i"-,֭[">Sݸ-zE*J (l OrGV&vѱ}6;,""UVzzzC `;󽼼nݺUk6YTUG K1l0VPn:v]TT/8vXE5zh}}}|>}DFF={K1jađnVh)H>1MQ=Xz IDAT|~N3.Ɯ9.{ fT*{+ޝ;_eƌx*9s.]ĆXzzz%%%̱nqq1lč!َ/XXU֯_cӕ]$Iaa!SxQQr|~aaNIIϟ?ߡC5_]]ݢ"v$&&Dzieΐkmm4Vbjܸq!!!חoR˗&&&D$ 7n\XXhiicԩS˗̻W^u>{А9I&_Vq/*j(53ȷK7gZRRb`` ܿ_6Fa)larСCU:Caa?~j˼'l7 0!#|P(tttTq/k(3I)l^9T$#0Yw֭l/&R\fJLLd7?`~W,tCabත껮Z)P@{ @Fg-CͦN* uP\\\nڭ[7&*..>|0QWW#U«$''{yys*-###88Hv?rH~~… U6dȐ͛7sphݺ2*X>|(آE۷&''o޼oacccv4 qxxxIII^^^hh9SNy{{/YDsƍk׮evptt,...((صkW&MdjݺΝ;bX,^~=D qFH$<طo_eRn ~ޝUS3}aelF0ѣGavG۫(Y>Cxxu댍6m*H,XƎ{ڵ&Mo-_+VG_bsP@РAsα] ,Xnݻw.]JD&LoK5TVSYu(;ͫ0gzŞ={Gz/|)lafQU^)k[7^RXM<@V3-hl, " y7_DrE6.]={͕>}aѣ.ָF;֪Oyzh;Sf!w;uג`ދݻ%$$([^_әPʕPPPP`@k_|V+ 8_ P6 4''۲lm͖,YXB -^XPkP``E>F;J'@--/ qvvvvF;BQQQxa |hm@]"4jh O)wwzِ!CLLLLLL%6m~AAAM6ԩSBBxoDt֭ ooשּׁoVV@ 077WVjFܹS&q޽fffV+ڵk<ڵkD٧OT/.]Ϟ=S’;P?rHeEI9֮]KD^^^~~~_~Uƍ'NX{ uJJ2Z"@uΝݢP*kΟ?oaaѶm[N߸q1c6mDDό3ΝKDm۶prbiA%_|E 64448qݻw-ҥKLw/B s?~\vL<9..NEK`D?v옻FGG2#GpB^o< cvy1q80l0"9rsz}sss*w?*<^:88˗LgΜ}'|'sssK.۴iSnrKNIIѣEI$ӧ+􊊊ؖ)X߷cmmmU *F@3@MΝFlYYfꔙ'OΟ?OH$D?jj큁H$*;ɧNb߻w޽{#FH$h.]0#"f"j2%޾}+55mLM6ׯA9r_666f 333U R$J6e܎cƌ;>##J5oUa-9]a*8>jxTڮ][vիGNJJb"@[[D";;7o} _~]nb>cbbP~==ۧȴſkjjZY</33‚١C[kƍW^e,--={'nݺEDBΎ ʍ%3fٲe`ڵ׮]۷oJJJ5k۰aC2߼y3qă뫸w鱯T*544,,,T]+Zhώ=~|@+<|p E"߷-^,$xi^8pHDLfddf666L4BD\iiil+zNN;zܳ,CDڵc?"љ;wUANNNd0mSqSy2dƌׯg?e.{Qݺub!SS J0]ſGq޽/&%%閖D$,--.RD"a;i^^^E*Waas,ђ-ښDII )sȑC$>~xܸqAAA H(:::VV^ii)sx떷;vD>˗Dt:|xRRR Qn<駟K:;;߿(22R~2?rH~~… տ [vM>Ç+zBqxxxIII^^^hh(;Ç͛7g֭[ܹS,(!66k׮ܔSNy{{/Y4lܸQ$۷@IҴ;vӛI4wKP"ڵK8"744U"0COOϮ]lo>;vʜrFlR{ 9sʕ+7o,G/^Y [ظiӦdLŋ{FWͬ [ݻK#{{{nرc]֤Ivxu;p„ ~mEk 4whټc Ǐ9meqӀn̔nݺ^GD(6r׮][OG2{֭['N 9 &H233'O&l-(lccsiDغuk:tH]ժUgϊ⌌fj":tuU/")’;v/o.3Qvp&ŋҷb? //$IյD5VTݿvƍ͛ĬIDYYY7l>`aLJ;]PXXx;)ywͽxj-w=///!!OHH(((ܹ3.@X3Dy"QTG::|9jԜylib+cc#>ڷc-[ع˱e:uԸ[^dI```h"W(PF}127/ٳ̏=4ЩC{gte:u"N>߻@n]k:;;GEEUQQQQ kηCZV\-hoϮnM6D]œ.;QN]ʅ;RKȣ4nXQTJ$4iR)IG9HJDjuUf͑O?x*o  ZYbe޼yS^{4(#=M֣gϪ.c&222KT d~d4h- ƍE_EKǛ7o.\2)iiiDdkkLM3325΄ }XPP&l~jmeu85/^ITXcԳǖQff&‹f*O\A_.1N>c===4D6ܤ}s3gΊիtOҕJu0F̜4i&;v+˾h>ƍeK@-WXX^vMEfB\ Ц|ZN:K7>|xmn mvrs>}tҤINDԺpԨ/kٳ|ٍFرc?Uvڷ~e@ p JVQѣݻwǪ04@-bO* "@aT/V@5:N4I$1%99ή٪ի C?UvիѤʑ:x1_}ӧOݳgڵhV?U۸q#& (_hh蔩S 7ovݺ]vYf rÆ?vh>e8###33Inܸ[[ZYGFF2V6VݻVUM? 'M>&@@jjG}Mx?6_}5:00铫WؾmqLر.]YNVU]T& P#@##c@`R^#<ک]vFFwaSnݺeddܮ]r1Z4JJJ~tI///>}FFFEEELJ=O?~Р70Qw_SGn۶ A @m:::z͍"""ٔcl:@kڴ Q:gff "22^hnn.S֭[E>vv7n@*TYlxׯ_ca_MDgΜA+ksx169FU~Ga+V0J| X[[GGE<[tZU!==ɓ'J+iy}ʕ+}m馦?Aj}&LA,ᡯ?a„zwDDRb"؜&R"aO2'u?DD<&Q0m Z F${ۙVZջw;wYb(79C="۷ SSS/\hddԯ_?u O`5j\-^]iDk.Kꪓ *a#"">hРAuQAꖔ3kxpW^>VTH%&=TU@yM6%+Wc} $w 5HVV/Ҷm:uk׮-..~xjqq ufjjZNv-ZHT hҤIK%.[{ *`VGGepĒ%֭;i~sCCƎ3o|g}޵k}ʽ7oifb8??իӧO0`X,O3==wSL|rnnX,yf```v=zf!"RSE{EN|}xw^tSSuֽx<++3**E 3hUdӜ77/^ 0b8++kӦMFFFϟ_`AM咒aÆƶmرc999"㎎=rwwH$x1|qק#::K.&LXjܹC62AիWkdddmm=eK,4l~+))QXϻEy IDAT=677755Qb}O?466%..YfwV|x̦޷o_}}?*"mE@uC09BD3g{뿏_}C6m?޽{4ǣG%$$ԫW=_~DTPPaÆM6ь36lyܹs%of=z+-|ڵkWH$0XDPc4g&#56l'O$ 6jhŊDͳzjcc~23bbbœ{wwwTvS,#22֯_okkkmm<|2fP(ԸVXaoo߰aC&;s "Dujs1.՛t>hLFk<{ڶmg1!LWZZtR[[?1>>B2R1م Ν;7|pbbb1̻QXXXn32 UbԠ(@5I=k"\B<<<Ν;rJ9~O߾}I&>qFΝƍDtĩwW^]lҥKnjDۨQǏx~^… s8p@ `sss"fRxDH*9eʔ/_Dŋx={*VZ%%%u=::Z$Dnݺݻwe˖Ǐgr֭[l"N-&~w/^HIIajqQ<mq[655_{w_qܛ\Y$!Ē &*D-E}ZUJ)muZmyhU,%5DdcD~5sfgn"ߜ3svݱcG}}} 'feeRbΜ9Ǐwpphܸɓ',X !FVǏhsε 311;wޢEJ=={7o6h  .4mt׮]jZS:c mJ]2&ɖ-[jfgg7i$44zԩ tT`ƍjoD(d;wܼy;=kb;vlƌh4^^^˖-e@bҥAAA֯tg С… SAΝ;bŊ͛7_rEPj꥗^zwHKRe˖q}|u޼y~aGmw}~R_< F[W|*)1A. ڳKz|B~~\hX<5Hh)OO.9GwzIzZjZZ!ރVwڱ} |BPm\#(P+H@.uq>@##cwS@1u+%$$l٢y:''^zOm*&#Gu-;;P!͛7 33C {BD@LYYYƥ`߽{۷o_ޱcr{nhhabhh{fbccϞ= /p?~klllff{u(*NTڞ?ֱcyT*;;[,⌍MTdaiE#>033K^-,,UBJڹGaaݛ¥gcccջwFDD>uBBzQ=ܐ!Cݏ?Υg^.,,LNN>>e˖&۷lllC-((rJ5+\i9$䷘Ri``3BjhbbҥKӧϨjV&77Г΅YZZzzzHzzzm۶)f}Æ !:vxSN) OOO.i4BA;(۷orZݫs &-7k$-^$ Zxy JRbBb= P(i`8( !5nm##c=PpP`Ʌu@T $@@PmT>S5ւn@$@agg,HNNqp`||}cRikk{W٥9;;T*;;uկ__PU622JP[Ur6WWHOOHyyy*!Jӱ6Z-*^-77wǎSՐ@$\! ʹa///Oc4H|"aO$JII~͚={]T*[j˯?Nz3ZXZ !qǪVZ{EEEqqq666T\rEڤk4CWxRc'j .>tRnnnvvsgϙ3oDNNJ 6EGGڵ[^"=%((~}Զ[xxx@@իW;uPUL>:QCʫwz?ܾ}Ac_/ ?_>xP(vZߦm[[K~VXXKL0i3'ǦM'L|#>>Ԩ,D uu!z-/*yILLV :}̡[[[/6|XFF~e]aae_ !ޟ7_Iܸqc}0o"66JJ/^8FFF\D@Y߿v#Bxzz+޽{ կvSǎwe/qumz[7"00P*߶m"ho`\~Z+ظM_-[j|bWr굵k  y>@>@Rg -CCC!Y~bɒvvvK>^"9p@{~lllo !?&&&BUV0 -5KҦ!Y$x_ϿhԨ={OG]J_jFCLLm6ҪCF'6i4iu,ص{ݻ7n/?{t,m֡Z[mܴ #"#vO&jSN,ɑ㜤39+/ ٤IܹSjٔε ˣF !_}-[ÏҪ4}K vvvGy睷dqc] /^OL'%ܻ ЕcǼZXXXAAArr'L|#++kҤ7+Lq;6 !.pqmmaisNcc=z!LMcB̘93>>>33sV|s zZlܰaرk+};ǎSNK%fԥ~ooO|c\2z{Ӧm۶]jM+(h_P>DTw.@K%4__M _":thT莝;dNNN-^}& `ѣ4M-YF?\0?/77FF4RNnvvv:Vkgk/h…>6g^zv 322>t^z+/\>͛7Kݔp33oF^ׯ\NNN'HF:q $@f΢P,P >J||||v㜍򜜜vu1#ԓ,5>^~iӦ7nܨ³BBB;{{PÆaaaA$3/jdNMMi׮]JJJvvvV^^Sk}}U܉' Ojܸ^ƍ\]]K'LMMsqq :BCC,--=== nQQQ^^ҲT[tt <==줭۷tc*3yyyJFs9??Є++ O.#Ϝ9s##Ν;7hРIjD{Sv"##srr+(IIIΝKKK300hӦcg%99A@MW>@F%GGǨ(xbMpC:::^.*'@:p@OOP0--m:ttrRR /PlDF^}p|};\xQ.lܸ!CZv=sL'Y,///+(gϞiժՐ!CZn=*X:322.UԼ滷k/ZXZYXZqJ766_~Ş#coJ66K.]LV-U*]QQ\ꪯKKKsvv.C'oIկ__PɅ666J˫-RJ=W{{{==&M>>2YRZ*+.jʌqFBB.U*܇&W !ի'I**??OQ_ߠdZB( !Tmi4K.v^X;v쐖ʥB==JrVQ_򏋤b~ZJJLUT8hH^^@URSS}}}DTXX,CC#x UաSKP9sk.rZ4hR,A '̄%rq++&M OgM0]Úò} z&&&SN-pٳg;&&&O K+)I%gϞر_>DNo޼sǎ^z̟5~>^Ɔ ɩ£@oތrvnw*,,B۷EPPhG'ɩ /66ۤK::tX*IHHh4mdGIOOwppv*Z)mڼyqGKOO/((}~9k5""rp'O߻w5k&ORNm͝{}Z7߆޼yťWރ|vJOO 6Ѥ*FݬYbNo~L6m⃃-,ʣܢw}-wwrdcc冀B/]XPP h-<<< ի:uvhի/^OԣtԩMh-[LgDߊsb߾`iիsrr uOkBZc>K8u!į*lٺU17_X;p˗.F}e!W^['. @| F[W|*)1A. ڳk i#142򂃃 y򡡧<==rF:umڡCz]C:=x㜪F9w /^^v]_~b} PZMKM)((pqmw52BP绶nSXXx!<ظ[mmmqqnn;u ~zܑڱ} |V_'z~TMyyRgh5]y*m㺟m{;&I=bdݞ\HuϗU{*j׾ˠAHNN !n޺%hH. #?5> ۡCg޽'%%Yh34gϟ?߬Y)S&\ر[ +Q+_[nU('j+ujt. 1 '1 T#B +u_rE{MttQ-[нƍп~;}̾`///>a;;7o^?O*JIuH~9֞=z!ZUVV={,,,,Jv  פ7~ !f̜lr KA>*ij@bqqmܸF֭ۦ֔*wٱs֭۶n&8;; !RSS=<\Z]|^x!&&ٹO>rivT*;g@*6# җ}_,@\&ڣ3z&jffK ڵkא~+)SLњsg͚9mڻ%_n/|HONg^Svm۴i >GS|4WiHwJhDFB( BH3 PF)ArD_$fܜf\A3fjկUȊۅL7H.Ré4M4~H;j4X_Ph4B!DE BZңRx*+:5Dz+>^95- V-,({{߷>JE&@*(В;9iea޽B(m4xؠP(PxXP("Mѵ[N^ɉg5#gܢҫT(X%q(В4JRs}{ՇOyZ}Zڅe= F!EE.9PS@|z(P{Oz4;3OY{AyGu$@~;|G4/H@5RU@ 7~¿LMz 4;n@A/ǦM]@ZjҲ?|K'&y掶c^"LZK'{z;wQ^ WU@{<;`}{\xA{S'1lO,J>Y /_3O<(\8ŋG͘T%]F2<ӭ]ί^U#u?B6#7NW&?ȹEK=߂?@O_ߏ2ih5? `If*Pt٩יS~cpRpi5EI΍„}+PSU(P7fWڥg˫IBFV337nNp֝fyyy\'BgVuzA~~RRk {I7r0pTҧWdDDaA_7 y 8qHaA=zwT~'Ѻs}Dyξ}qpR/k>|T8gއ?]ҼWՊURa3KD}䑟 hJ+-җ}_,@eqR :)9#|-zulq 5;-TxY~~~bkߒWpL0 5UY3§4} jf/*( QJP>4$@ @$@l@Zrի׹S-dyTt!҅8{>s$@366~mG J**Ha^~ut'.ص[1d谸8!DdՎ=…1Gt 5FIHHX-|0&?z|WBnݺ8qRɓ;uݻuAjm[uo"#{Ry^^j}҄ݻu;B?OSB'Nt֕f .]v𾩩T5͘;O*8s܋/;=:wAj/JW > NNN!+^.5kͭZ45Ҫkժ!m P~V]B;v_7t_uBxzziswD.+srr}8g>C|;t55-#''Qh,_ϗWv!F/пBFژBh]]:sJ̩R9PM$@ @$@ @W(** j?SSD k?5 hS}"IH@! T*՝;w6lH<B! oT/yvn`h+RK(mb%J+ǿ%K#\2`(uΝ; 4j@m۶M1l0y4J%$@@jj V\VCBBRSS BP$$$ĉ:nBܺukȑ榦F޺sξ}8::N:5##CÇ[XXWO>ݧO###KKɓ'gff:qD^jͻ+')ٲeB5j\k.BeG bjzzرcׯocc3mڴl]7Uvڕп={޽{̘1L<СCBӧOܹs͛7֤={FGG!gϞ522B_~ܸqڡhŊׯ {M߾}Ӆ٫W.,,\fʕ+2؝;w7oر')4hPz/-)tn۶mȑBSNAI/9r}˗//((XrG,.h>wPOhai%-$&{ẍ#Ç zjLLLn233-[֥KFGG:4>>޽{/J[?c!w}sA!ݻkvqq駟t-"""##c޼yB) !-[=bĈ4nϞ=d)))ǏB޽[TݻW G_{]x1##wB~IJވFW5ZXZ* B :TOO/88X{bR eVZemmmii|r tʕ"7Μ9?B{b֬Y}+Whx֬YB$\ ._K/hbڤ(ǔqeffɇ"dժU[666?">>^#Ft@(P={!jֵkWi}Byc[oܸ!ʃg 2̙3[͠ЪU+yY۶m+-HqEEEjLLe˖%[6d{.]tjzmwAR9tPywwwiBdt9bYo*ҊB uQYO,V'-HQD^-k%--MZxϜ9Ӽyӧ/^,²Zfnnޯ_ .\v- 瞳ѣǞ={޽{̙={jiZ]#F Ƃ$@P5T*U||恸8Jʰ0i᯿B8;;kSV!DllFƂǏ/Ə+6;;;!ĵkJn*$.]411Qz⋏Ozz u|JB @U#(((++Z.0`|{wߍ6m{)k'OO E^ Bo߾gώ=ڞy!Ē%K[I뫧a!bB~AJ^;G;{6nر3ui|@hii)bi:thÆ ٓ+g۫joo#G4jԨX,uLMM tاOiʕ+Gell\^=OOOy"Ttm...777ȓ,I RD~ h*z:<Ŵ~7nt5?8׆ V6uxGwnQե>Da``]ҬY3Ry۷o/uMK%%oJzZѓ,iʔ)SL.YbŊ+9tɒrqUtлw͜5FL, !{y7vޟ#99yN>ӹS/>_jff&ha?[w^-y!9iڷ¡ϒѮƂ1_ǍW?~Di̸ƍwn@B|^x̩~Ç}2y۷vl3g͖Jf﬙3N<>i~ĕ |WީSǭ[6]r3WsYc@Jէ$CC~}H%;'Oc\VTO+##㊼6d,СCƼ6~iݺM^ pp&yyyB !ի*cjj*?F~3f{*j߻D5D (4[])g?9AKԾ}#F>}ǟ~y!D=$-eff !L˩Ak\sȡ3{{4$@Tq*JVr{䨗23fbqk{Ϟ>Z7ސWϽA :ܫgrj>b~S陙j$@2y0ok7+WJB86iwG7ߜ4h?̞woPgϮ;w5sf9u~`ުkrrr]ڵS<,srqaJwlřS'.j[0~^F5swƌ7ijڡC}b=}@}O}h* B0 99jzԨQ/_ܹZ~磣oݺ5rHsssSSQFɛrrrOnooV[hGɓhIsξ}8::N:5##Cz ggkޠrSj $$$ĉ;s鵧Oӧɓ$ݻw700ٳ ?jxd=ӝ8 @]o!lҥKڵkBÇ;wB$%%S[l9ٳgӦM[zի裏ߴ~qig+V$''_^5`t!x~IϧT'O>t?w\yI߾}^zuaa5k׮]ׯh;6zBYeѾPϯBCB#I}yyyIIIk׮B̝;355BHHtC߻w_￿[iƍuV!/M9xbe˖w5&&&**s\)UDDիWcbbu떙l2]"qssȘ7obǎRW_}ѳg؛7oJeS~;<2>OAU[xq ^~e!DnnŋMMM_{5!<{VZemmmii|r!~RVٱcǐ!C4oVΦ+Wyxxlܸq̙(uK._믿>JO/_loo/e?ЏӮjYG)d֢R*ttl,1^%:MM͓i=#uj{f޽O>={쬬,G)88Xq/bnW"ϟ?/U#W_ !u?JY kۡzrOiLɤDYࡁ~w'O^j+Ν۳g#G!lllܹyaÆ=K.533^X&l߾}/ҥK&L}Dooӧo޼YѼ{Ur>zwlRXX8m4!.G)˗Nm6==b篻ΖmDFFHtsݺuk@@@@@Th"iw͚5F?~.6l0vرcǖ<̙3׭[wQ{{*@M}YΝR|||;VwCPlMBRz,Ydɒ'z?ijF H  H $@ @$@ @$@ 6MPk>|F@,,,t311 F @$@ @$@ H < 8IDAT H  H $@@ jD Nݻ{>| F @$@ @$@ H  H  *JE F)ƌH#Jh441 H  H  H@$@ @$@ @ 4BDR΢ujHP*EUjy͛ 6400LOKLfdggf /ņ]\ۜk6ffBP(2/Б DPym"#"RSh8S36nn "g;1Ny0,P2UY/jdiՈPs1Ye %S4j+3ԡd$@_#Γ 4GP+=&)1Q(g4|Na($@ @XLL15qlı鄉޽ mlƎ_Ѫ~ 9jqμ<=K#G¥ڵ ʫ86srK-ll>}i4a/WO٣Dž aNNNo{/Ƥ?*ZՒKϟgpB'[`KrxcRLL\j͚}rxy&?cYbߘ$|ɧgR(|J_kO&>}*_^9s/hUǎ737oۦ͓~_%OOֶM3s'Nt֍Ç~9r>722B?i*B_w8`.~oLB-Z}cM6-ǩK׮'NY+O[\}@ر6oѲy!!׿*}9slRgƤWk'E _иk_+.YE)4;oM^4h>ij'C.ZY=E:uħ|㣎\1Ǩ̰gxa9?u <_d3<%K|0o@]lׯo~} l޴2ZX:z:gj u ꊇގ9'wޚL[@\-N0-0IENDB`3Depict-0.0.19/docs/manual-latex/figures/exportanimDialogFrameView.png0000644000175000017500000021014312640746376025306 0ustar pcuserpcuserPNG  IHDR%H pHYs  tIME  %- IDATxw|]vtZZP@fS,q#2Dq ?Q 2lPm4G .:x}]ssw =-N7X9+ԓا?L&"!,?<~^^ ˲,f8¢BϽ,"\\=jxD\^^ƓJQQ)$"OOO(,d[+DHSHD&LVYFѿC9 ܶ8+-+suU Lʲ-cΛ3UO''a}dsOΰBdSS- mf:68KvNP TyedfM$-*.+x2%>ͭau$yN\Bbq9X֤)D9Dd#IV;KxV)-++v$Xd+jM4D~x;2L8p /yt).֣# O?ŒE'csg1( eؑ_Lʴ7CBbt@Ş>WZZvcy>5-#?q*P[".q|hhǫWSFc``@:QP(8e!32 F\޵KXzF^')y|}}u͖Lm:=#K 5S-k\]]+5LQFd2b7WڃA[y"|O^tL)GLb-I?GmAѪL}1hC 1ap% 8@ (--0l^oo/~abY3j`},)----p?rD&U$gfdjƍ0L|U3%V[Y!!QD.b,@ P*\ |}2F3 /4]i2loM&SF&XDaga' `u`zFdJK`l6`uPxj<)IGS^,qL.L8w`_L*#rGӽgP hrH,ލa/alHddir\]'Fc&ܼLM:ȶLaIgΞ1,P(kj͖w!QQdirL&D"1Ddtn :ϼN$3 +XX*T0 mYBuIaҹ(D a>Ǣ#u+ޞ:sjݱxUH,9ɴZjax"")oMa_pk/\'mGT1!qq WSJJJF0 $qiiYYVҕ22wj?B={shɩD0LD-/?~T@@2m~>2]+)XT`@b3&..Ҝnk_jffj&T*DDi!3S18HP%B"boHts䑌F{Ɛ\|L,*>{9> ZI)˲2׷{n^D$njqԙs/pIe#ϙ8׷㑋eT6fSΦgg,ϗe؞=y{{b@rU*hU[0L||RՙX-5LRSGNթi&I-W}zZ4#9\-<!&s~N"j8, ˿1MhnH 0˕f ]49 ȡg4DsbN@ ܵ'##VVٳwҤ艅KӍW)/"ɁsN?:_Ppqq۶8_vWZ\H4;v=Km{k4@9|d JXFqV"r,~߻9ffiֿ[_|镒J7_8tx2Tk9w4a <+oeVk||locyٕi:H$R̙Lb6"JUOO>rL-411jFUTJKK|oux[6oQQ\.7 I8'ylvUzWe,Gȑc*gFso=:ocՒ|W[x󝺧ׯO?o_7VTVi;u̔i3m ߇ >:99Ν0?qƫKΞ3_2u{ɟ}%vzh6 <~klӳzex_bO-]LD11|`~LZNݻ'qͫWE wSTX(/z{{;Qd2 eرyiSORN׷ϰ_]N^^k@a*Uσۼ^^ioBЪcκ8k~W___^_RZFD.2 b=< Aj7xP[>x Jߡ×x{{u"ͫqh&gԨyMt@x=mZ뛎hd2AݻGlܸfO>vE_ĤQ}}nezqG ŗ[6)ͻyyyDǁ1s@ۏ9w0  wפF:_;wafúWo#FٳgjW?oGG\9cԂӧַv"o>r,<<Ums=4e,|||@`?pEB"81^iX, oSLZJYiΉ+33GP`;r^M86z+ͩhUr<4S ]5/Bahh[Lkikט8.MVwyӉ3ʹJҿ????6bNh[ּ<Z &ĜT?ȡhp~0 $.54,U\'""mD7^b !Htc X"sek%JYDB9Cd&2oLDgobZ3v9{y@K2 M-ҋ"F[jBMgpڃOC9=smCFqМ,Uz5E}1'[]-rOl/N7bN>egTj| c7j;9JiSY)t 5O!k/T{yNkZ??~} 6 ..rΝ}s1 Xx{񳛛dddߪ={N=qB4=p}1%ٷp gVR9[qǪXŦKhon|Η^yŗ^Q(\wj]o?oXzaZFqJپc߳4ٶWaaa^s,(t/9@xO'<ӠJ Q,qDDeDZ:$:Btv1Xif[KvaBݢbAQ9QIil.+-E*4lFRBB:lZZznn2<>az~"JIM`e=<mmɧZKD-^7?SIW9v:L&%r{_vqqٻ+W?p ,_z觖.&W>0fD"~q+^q^?qr5Y=P2J| |=w'$TC8Ĵ c3ׂfL0گKd77|{?}O.~j.sd얯xӧ+DfX|MZZ:) 3Ouqq!t:]AAFxҐ;Դ9g0y*j%R2^jPMq ^])tev8G.J3fԘ1]{<2 x277on.ryaa~G_~eG{ ۖrD$`0,ѦOiݓ㸢B\nۻrFFx|z?''Le"vnaRw>}:tZk7P lkT|gZ9駖 2ϛ=~۹Ξ6㾀2y.Q^^c dJ2??5k;oK -,*  #ܰ,}>{G6ΕJ^mV9udW׮_9TZxq4&团lmQ݆5-~r%~t6m0rsD"@ )Ҳ2uZ 7`8.;'l6wP/;^jiX3||JeS4D:j@EȜCCBHt5zݿ)"[nnÍğԩӳU+[0niY:(f}޷w-pIv}OOgtFּ"D mS7obc6t:8m h䞹ɴ])bNg,2m:NpSg5Ӹvc;#U95?,aJk8m8iL66U[z [m֭Zii}Η_~)//oغ&Lرc69_{F ,rLs%DaUBۈ9l/9}ѱcǚ'O駟nvvvUv\j~&Bms6|Knܸ矕6#}9rJtҏ?o;wɓr bsxqw_iIQQa>Zx۲ m[sg& ulƬaÆ>,55(={}w?|z~&99bbb"##cbblӣFbvg޽IIIp¶mۈhݺuݺu{饗Ξ=yf"ZvmJJʁjo]Ӻ6gΜpBll~j*Vetӧ_xx 22ҥK zAus3gԕ!i4ÙwܖoZ'ygTqxioS4Fݷ_~'O^f7|co\xj`8`Jn۶'y+Rf?cƌ0WWj s岲2rם3gR$1chڜhXG.SmF6frqq!Ç .$"DP{`h X5r9+KVg͚e2[TG8#z^DG{E&̨w77*u/at`1ĜDnݺ={._>'33eDEEz nj5tq-^ԩS_~edw{k~~~6l9sf[R)׵?\*QEEE4]ڌl<<y衇J%˲ݻwغ% lwkZu%Aw0|nvF*d 8i=ykp"m3۪MZ{>gͱ_blDM"["lxD{5z觟~ZZD4h N7ߌ3Jm }rg BӉի~i6<.!ǜ55Ȗ-[}]bu&eZs4?Oh3B?3gϼSk`j)7KIĜ-j9~mEE_׮]U*ղelQX,:tK=l1gyyѣhz1iҤ?|˗ٳG& :TV?3 k_jʨjjGٳǶL] e_nR4@[N3dךcM0it"#.\tɢE$'Xz]T^^k^80Ljvie ]*nTQ4AE&>WUh4_oj[ݱS@Z覬̺nv x͢.J+k_yn:UeulV F*+umZBr*4tU19tB/_:-=cQ!99>eÆ &2)RBG;uQWCbz=(]vr(p|ॹ>_P`uwwW,{׮d2ٔED0HiR5ipbk3Jul6!欃#Ǣڴj5 {UOU( oxKٚl7ww~UIDO?KxK*W_}yͱ'u:'(J@KySp?c2QN bNV3MIM3-]vyx{/ye[0-?J_mWU+3ϚcSB;=ͽe÷3fJk A1'@;8Ci& Ez{y;w>%5M[$GS*Q^=ܼeԻH$u-#3i8!Ad]k/[aT֣%FbN&uk8"\犯|łC*e2YkJmB$5"d4aSB8Kn3_FϪ?ӾvBI{` 1'V3G9'O\.'RMv6Z gqme 1k;6uDʴ]i&󆝻ddd0 #J}|ӡ-/(P{ȖZ޳gI'D اxڮEUO*Jzo;w{{{q|n^^HNYo5@8f$-<|#cj.߈U[;6hO\;ݟ_ÏFך`{׫(l߱kYl۫WH___{89v :d+kvs]3垉p[.>{c=g]5vhN!1ZJ5N!"|[W_CoM'0thru[;pVM_#+/hdk4J҉eY"*)-eeybHRUXUCgDD2YjZ f9<>>5aC RPPXQQ#\ɓﮯ>ݽ{āoWx :FI L{̺mmSP]wQΡK/zuU+J+V>u:(0##}ܾ-_]]x}]2,wpY5  X#%577 >fϙ^./͞3gȓ<<<V|'S,|rIZ9u!xWՙh@H~kQmXҤ)cL7s[d&Yjƍ*cN"׷lNIISK|K>3˖=v>mmj'W^c^)q痯X=ibSKQL+?_&ŋao? tw+V~{y_'?o[<Dh@5uGl ~[8g0ؤ+ծR\`F.F\xis߿hJLLի'͘1ӧAQ:Lhl <2;~%k3t;bӯbaVFш^TӾJh۷v&ۤ}lJ "b/I:{ǜ9DMD x277on.ryaaQq/W,Ѧ/Uݻ']jZJ$b[]RR"lL'"=wwvE"?K@œb19yb壻Zu㶟C:u :tȅsL2,yղX8&qV{OZG, mH״dOw,(b6+ $ߨfSiXzlIv>&"@qFÏl$&&qDzl-5c7__'x?uL}A} v݆W_Y+߇ղD`з mDhڳwACF,Y q;o:d0wi3+zL4Ѿys>=Ͻ=Tb 8FaԷuް{U>b9M6aW*7mP32'.]aIWDqqqiY:(:.`z>'7) ٳwo=S{vVh^3!}qV3 Em.q9:p;Ȱ}cmUtě%LX^pVe.&] ?rmtǮ`tZQXβk\PeVʗ4SsZRE-Q8X,+eL(jtVV(qn8fVXQ.D*3Q~]m_JDaFU&{ !^O0x_=,\a0  `]~&^ Pw/=MW(W%&ֹLz!n$- "^~gEQ{Y{VeZhb@91qh4*7/I!ݪ 8MҼ=%K]DdiLo*$= ?S/.6?*"+]N,O oIɸ粟a݅zOl1gZ  Vb2V+wHƒPa*/aEbƒ穢xNT "ݵ|xݠqV\)_Od,/*x%vxSv@Ϝǡ99F}̻',;nPm.׽ ڒ ЧL0>h;Y*T^S*_H՚Wxjip3k6ljw?8nhT?XXxi\{5)v3 ƽʊZlHpPJz6%=3$85ϖ״s3s>.k33XK]\rHE?g%`ٛ#PWp Yr.)LёC:E!pLH^)}H_2#7_v=mԖD?<#C3h!oj_XWl"rUWmb]dE/gKʼB"R*\*s^zf}oOUnJ+/ʵϹe5 &u$X[?!E+_{e:=25}2,kqjgVEdJ`uf=6]sFu;DJu0Y'byWWD*(.6Le>*rZIJIp"7oHXxgީW}Op/Z)&"}ESVKDn'RQi־JN/P*B1qߨ&c9+ÙF @D# 1d<~d&s|G;B7g2cK8vH!'Zv{geYJsLլZ6\H+׿OD6T j%Ϛg:(/ __䟑|pW?j!C!bζgТzgX/dZ-i0< 7rN!6i~O\Oxyn#?~;p¾OٹFѱS ׳):wR?}EƎ$?t2, kDt ];>sl:m%bqN^~5C0vSsdƨn: @@Dr4z~D$*/!e5+ q \хP;uU|NRuf_V(ݸNYW#[:$8hzʅ6oAy ;78ݵٜ䑌|ێ2YLƱ0a!B:ڦws; s+?wߟGY];rIm _yjlPW?|WYx3CDrK͹)da<}i:Ȉz\O*׊%R"җG}wLj5 wJ-:O4nTao T*!"W]jIeE$<{6Qo㻾KaSQ9dsEEDWuw 9d bI?+Y¥KU 4,"9#<:)IDG]G.es咴wrVwn=1C34@V_qd,͔(};v,fMej5'5Y:kaB&}Bt4X"+U>DvSxcQ_^f6x0;&Z7oK IDAT WrR +#=lp\.%"tvJBq-7(UsܴDwh2[QyY1q$sL.լT6p (7<%+xF_|ҳLX^9dc$^r鵥&m!? _RəC'=xlDs /SR ]TT$e2K3eܼ޽{ֳ9zn }loe2YD^^EEz6| ӧM}c2x WrR4lFRBB:,븘dJHHVۂTmYYDD7XlOjfsxxX՘L񜻛}N~~D"ytL^K:zh4zxxQEϗ8/s YdmIIT*&Y,V_P mqիf9$ڵLf;u -IDǻ*i*bIslEEdrss#"X-&" 5s_y?>ϾАs/sVR͞=:|-iifˏ*1jpһ}'_mfs`kvu<~klӳz.^g[l32yxɲ?3ONHHܽsL&p㦧-饯oxd2EO{gL'M~jb"9|cQ wvŋl{밡Co)eddA'Nv ?q2644ب }b1 ۷o8ٻﰦ' a {" ETD ĺq[ U^sn-RXAdlao2~i<}$7g{9ӦM8p RWWߦ͛)ollANNZttJpppvvΟ??hРPb!&g͜ѥ*D"ܹ ߫q)l6{pɛJzBQIq`s[?lljZ.G bwEƽx ''e$o`;~nJbݿo2BL;v.^QVRrpWQQahjt_2N;!-,,x<ޜ9sكZxORRҫWܹSQQ8Z__/I#F`YYYC ٶmBO:5((hΝ;v숎^lVE0O?~#1]C[Z)D<+!rr?{もK2]d ۾s;(@ x,f(DIq'zN8煗i.]<ץv lii p;rdеN8O>mddbŊ?cٙW Y&99HEE߿۷!ݖ) LfLĹvr;stCMM-// t k!=/RA.%{zxܣ'ι"ف܉gm=KA/]6ڪ7М3i87?Bpa.ܭmw#tɓ&&&=d>KJVҿ1BnK>ḵNNN͓]5~5kPTq2)))YJXiimdd}v:k׮iӦ}B@yzzyzzPtAw]+ߴ=9FSԤ8vC;sI:k_?eg#.]fm5zȒȈ|5 ̫>)\"-5 kV:vؑҲr5UUEŎ5dIYxEI9r<ұ};/s"p"h4---.[RR%ͮ......l6رcfrssɓ'MLLrssjkk*, !D$\E<֥ -Cd>[UUսwTX*v9.;-&q\;k!{ݰ Leee ?~Mzײ[n<o}(((&ɐpkjj._|A/((@egg?>c0^n:)B|0%חsst PPqqCTjGԜ>}:OJJ;v,BHGGgժUfffnnn3fZ600֭[ eĈ"IHusN ZZZJ t:fH &((hڵ555$ _avc2OSSSd H6i4>:o!9'9Ч [[{Ŝ+ÉӻW݌ᘘ|PNN99Jș3g]VVVK'''.۳ikkd2Waa04MMMދqu_k¥ WX;w+*X99._5fܚmmmt}s~NNNQQQjjj<σԢ$oСC?~Qll,QAAAlllFFVTT477O|pԩW^<f``@"***Fڶm K...?u``Ç>]b,YUpp] ק%<6:ks8q2"au1 ~\zVu̜{Q'O񮭫CobޗO;ۍ222m۶iii!|ԩSv܉} yyׯ.^_~`ܹu%Y9g $T*5=#֦ZV.Y?L4_"%F5EEĤs繎s֒C8Nnnـ?X~ XqdU?ob]P_rNqigp=zѣ!ii[n^2̘z.WG36??ҥ!pܹ=t.\d!u$L^]Wܔ^ !&qf͜#PdBm! of766ry'߂}dKA/4[䔟߃%˗/߷oZdڵkBEEE***T*ATUUQ(lZgu>;? ?!T\R"<6,˭`ihhtiiBNSc*{*%%!u BheeecF+))VVVuXbf'_4 %B2ocыJ^>+N#"ߊCԥb\z@__|øQ]]]P}ys  ޷t^&<:P B WZc)))>_PP`nn}q===9Q/_ [n k׬Z*p@HII>sgcCݽw̘Q؉Sx-u 7o||ѫfxOиw?&`h.Ur9nAa n<!K7.((t*~pb;E n'j@ <,[,888$$dѢEVp83f̈_… cO>R>..wޠm;vɍMMl i@R?#F 9g޺u[7A/Oq2sJΝ;oT*^]АD"eRRH222]t:͛+WhiiaO{&$$ݺ?D5p}[qq1ׯIGq1hjrrr-[YYF߹)K?{Wg’WDž:.fU^fyu:ibO*-)utt<ܿ I& Gq<"))i#>}zL&399MMMׯ a9x4FIX8""͛7۷o߸qcO@fmiD"J҈AKHEEE I]-A[ZZ`oeee!&HWXXS^^MMM˖- tN9,X`ddiӦ+V@0z%n_oeee9NffJqqIqq>D7Vf~ZWW5'7l4 p8CN `5k֬^Zxݻwv}С7oN7m~ҥK/^ Ȁ^b6hlOi4Kcʓ'CW +0 r+WX{v663)A_ǻGPL̃uQQZZqǏO)o޼aÆ*ikkcoTP 朧N 6(`) BhʔIX‰Pmvcc#Mx'V3gz#---B))k׬B1mm7oXX ,YdժUeee˟O 6Y@~{^{Wa܋ rrrؿ$o`; |c|~݋p8"ϟs$'';88 233[[[-,, si~ Cg#_DD%^|dJ^d ۾s;(@ x,f(Dc7{]VVjiilkk}P__D9s:th̙;ws/.9qkkkq񻾳rw_9go&r='HR {6lu#]Cd];?7nw;wnkbXjjjKZZɤP(:9E7S9'zȒȈnuuO HKMڱN?v\MUUQQbz-o+'M噈7"##^RRdddrN$eeeB5P ZE2 IDATDUƆѐI;|L IЛ<@;rȠA$,`0 bsJD>ٕF I${kBnX MUEUퟄ'i&>M[ @ RN;k&6: \A_ 3zrF F:9M'!4|ȑ#DŽ].s8=}CǑc23_ ? =s8\\.L9=yj٢d2佅 rN)((*))GEao_=[NԈz&:_~Y&8Vqa7Dn޽N̙[WWw>snYY>ڂmnnBa9g[W2y<.BH3ITUUϞ= j>:H$>^!lُǎu箧x؇sknj"rX)/Ng\nQQ|>{SZZe vO;r:rrNt L9P__WYbeC0ڦ??,#G޼UXXH dddiVVtK)6Ç_| &N9cumlllerrrBa0Ç^}!---R?t^^^ӧOplE7rT;<+6i4F!ofĤI^ 'NpC>AaY~ Jb4 cO~݊ VNNWG&p=>4 OMMM˖-SVV.))ilu{îW̙3׮]+--:~ܹs[[[fg!v -쑈lEq\cs$D |.M IRRdH.߳ Ӧ*--֮QPP6mZ||Y,ztt]\\ r]:a///8333ۼys@@@pp0BA>a︪ &?~<888;;ϟ4hPhhw䨩EGGc \\\lmmo/찋[!2Eׯ^px<^E;+=/kfs{iii ضW<&W2=11׿_3,[p)HTVVڻq>>IIIuŴT99m۶;v ikk377|@ ޺u+B(""'77WVVV넄dee常8ggɓ'Ϛ5D"㉹իWwܩҤzޱҰ MdeD1fgeeYZZv`vvvqnnn[lAر#::zٲe>>>Xb">,km6/ϟ:ujPPΝ;;ۛUP`g]lAoQln(䊺VGR'+o3xp1}}*ikkzz#Bbb\ǹhi1>?"bb[ ."z*u99;֮ۇ1`E{x}m!v_v:s~涶vp)'3gʵ'Ohhhao}}}Bcƌihh(--mlľ YаVgΜ9E$GG͛7/Y!D&^~OHHسgOJJ BHGG5--mذaƞNttt vrNГJJJBGddd,LJJ {K?hEcؐd ?H&޽#76HtAz555ʊ45%zjNKK+22?ؾ};Nߵk״i.cg7b B ;+8eʔaY[OOϢ"OOO*Z^^.fo{P|lQ7p\.!(Ȓ$E@ʥHl.U;B!KJrE:MŪ,--#GǗ[ZƏD, 9'B͛sz6xu}}%td[rϋ\nII @a %l_WW:u6 _r܂sBrrrr6}رYf]$pI===Y{Ǯm۶ÇG{.>PHa^ܨZ/ÃBx+3\^3Qe!:O9y|AsS)vjkkEFF FތB9aoKJKGrb0|>m_&7!"8\nsss]]˴W~u{Ӧ]j!6QP> 777ڊ)c```mmuV@6owIK=zŊMMM!@׾됐bPxx۷o=<"RRR|>K?:Bx+:;f)63g+!D`s&'`sl~S+S 5)PH]ؚwɫ°˶d2m߹;AB?M ʜ?qW#;t׷nߑ7_2%Ν١]Z?N\zĉÇ7669sÇܹs555&&&^Bm޼9::dZXX`Ջ촵:baÑ#G555O󓒒Ǝ+fs:#GƍXTT uB1bZmƌFUL[1ӽN|ma ӧ \yDפi55~Y7y몪* @˜S(&l//.h4_4>ŋYYY_9U>@ lvc6rCS$Uj\U9$zj&!;wBfk%Ūfm--+jnjFyÃf`ĜFS 9yl/J}afg󂶶Ss23&N sz~M~DM ˕HRUdiH8g0dkG&zWʪ6PKKKYY9DTBD]/(x53 UUU alVTTc*ݲʥE痔345 MςHauuu=?KSE)Hp8 @w!*%4i?/{WbeeeYI^<j1?S^^. ee%2Y,v OD"jj]@ įhka6M\YYnOO|~of#~p%%dffyCFƿ>;[b̚9#fT]]}])t ѣF"^ybV GhKndd2 9gbKSUn_2}3~#++44|avv΍H, Ԥ <;lmmN8gG<#FXBwn 89_@ Hd2Y+dr~"'<{+c'Ŕ=MWWdBy>;dddN:9QN#'1p.E ӧOqg!CÈdy 3^;ؾ"58^ Ϛ9!t ])N#E3 B*+BnAu (D D"ngϜ:wmmI =}ߔD_c---%z1%̞ѓB +W D߫"H욚ll<{TSSO n[`e?#vj_8ĤvXsfaYJOM}}~}}CvK)BhpǏ^+|ot=Д)O W[[H^ZRR4!l{NNNillNKt6=&xӽ!ӊ5+XaC!"i42d-- ffXeUBHVV WRS_*XSΙ+WYZ ` |1WW>ѣ'Ty^uuIJJJ rP]'_Hr9] _=A} I[M:!$--sﶌ [Ҫ~4&~<]C!T^^ks07!I|htSD)BᶠpɓOѓ~(--wm\c,|C&W^{#feddjkj/Jp֥Y)%蛰Kmnijn6`:k -&8pz///3nA>ވҲuy3 !dhh`ee9{<+++Fa1ԤK;Ed!g},4y4JmlllkkBJ"Ϝ܌Yucc?'H[[ 9& _9^Jϸq#zϹ!۶|0G^^{T9{ԯn{A F906fΈ{D"-Xja1!ԥ~"Lc#f6땫BG;)** Frr7N>pxήs]r񒀒K,r2 @"#죄qf2..uؑ*6]HEw1}=gN5'0hn횂ͧnij.SJ5K{>mo);wlٹcxྊ6mmᲱ4 [&|^9'>L6ׇ8|" E_OOI$bN9ݬ6@W):s󜽚Q\".ǻqs-~zl}}`Y]%Qn`$/w?Ė֟4o׻GG[WW_j9aa04MMMދqu_k¥vY]$}mjjTTT475}q̬S'w+,,ihht:/..y| vFŋ̝}Ӗ?.Xl6OAm]é/++FUUU>{X\\7.au'33+35b]444$&&U_P[W'w /inn^c|~YY9Nw3RRR/~p2 Ϟ%bܾ,})~RRR$$)ζKkٳĢ"@usBӦNhf.+ 7ߦm[Öիr瞘dkk3qҴ{v wGXN:]PXx7"o7޳{ϟ5^g,X:!$auUJ{trE.G|eFUժ*CNيB.QWWy0$>{UPpiM.=8HCQ IDATѧ{q}m0s3xB}}*ikU+?zd&O/|z#Bbb\ǹhkkI^WY>5+B~`i˴W7݉v/?̘N$6n=O,+..Ϊ* -++/,|4>  vvX/vD >?"bb[ ."äފ WRTSl/r8m믒*(,{OclM=VdM[,]H Xc3t0?k&q#G8Z ;y9'Z[B"婭]jjd/EEPSSظG/}PAaANNgFWVVIǺ:555X,LtpֈGi_NNbEE_7m}'z>M0]x[D:p8))k׬B1mm7oXX IJb1Mu=s8==]**f+VTy<_9!3wͨ[];0>}9'@!*.): ˭`uuZbUvc}*Y$IEߋ  [=,uA6?̘>ͣ*vlw`o4>AYYyw#nАrxUTT#Ge,-~pńSZZ&֢5N;r#G֬Z=VULORzzZQC7 !$K{ /C$D_).y?tPqqQN]<B]]!!I4ֲv=S{eEr (+)98ث045CBhjzzbZf0|>m_.5%I#Fpp8/]YzȑO~|͵uuX[";۹=;`o5\%)){gl:]!dllt}9v^K]C͛W^ +//Gݻ_P0fSIO x O ͜}dhFFfE1CX4G`Iݩ3k1Lݰ; AB?<^S*..G|@@a8N~_ q~ָ>.rNpuuٻgg:8 w=}UاK=z0bSyqYM-` BNO b6կ_?x<޻wE4;6=&L6ݻ" ul$^E@Mhnnv1ı66C?>mnn.-+WSULMKJK9CSSxb\+.[PPNkmm>+;W|G:!ƭ?lcgdjjjB-]G ;s555ݷofgdd333ZEEJp8zzz:::" 655)((ܽ{w̘1  ??F 6^|iddd2BYYYC X4}}}]䷳Zlsss(Vf 8>,<𩿿\\ϱ@ Y˅500QSSƆ:sqqSQQIMM|rDD\\\͟5ܡ{=}G /喙r^Mf(Nq8}ApH|"d2yH+biq U+̙gŋ}||r/^~ŋ'UVV={)Sƍ7bWWh۶mY9>?uԠ )T99m۶;v ikk377|/V,!!!99YYY9..yOoo[""""|||rss5!!!-- л7`66DAAŋ]\ڱcGtte|||#t6=tЮi:`a?x̙ .|p SyN Φ q];E? BAA#2b0X.>Pݿd  ݓ6}t0lyO@ "ZZZ\.KBhYWW7///777**brrrZAAkwwwOuuu|S:L>qO… #F^x@ `#0<+**2D"QdĻ##yu|}Ο?wI~HtKg:s)I0`ǫ;[Su}[ 300޺u@ x7odリvڅ_ÌϷXj~OI#߾}!s=zŊ8m֞={N:u9, KHHXv˱tnaaa!6=Ha0^H^g,lhh|C^:#N[[[eee}}=BOÅo&>p8X`7od2MMM;[:s޽9ދ@ ;w.>>NkhhdggK>(D}ٳo>vXUVښ͘1+6qÇϜ9?N\6SL9}UUU رc,Xw^͛7GGG3L]]] V``[( ~H^yʕSNQTMMM55؈9$:3bz;wF͜9h4VUUذɸիWS(!%%%fGnݺս>8 m~N}~X V+eBy4Bh˯gԄl@ tIȖ"iii&) bHiiizS2LNmll,**UOx(lG\.7//NtWLd$ޡF C۽|>rj:.rpv~O9:yy^YR׬a P(Nj] U" _J~]}0FF":ĨC۽ATlyO)sעC$ؽq 2 8pA09|mO(}}e 9 A@ z3\|k b` 90X @ }1[ rN_@/uŜ+çJO9n֬YzzzeX666/^PVVDܜ󦦦jf>}:!!ANNn^^^"?~|޽Byy1cL0@ | sΜ9sڵ/_899qܞ֖dBc~ҥ|!---x<ӭ^``ĉO8i&Y䎎c2ׯ_o_ҥK,DJJjܹg9/U?IZ[[L/999۷!1c`h4SSSgEEJp8zzz:::xS /_d0%%% H$uz8;;c1&&8}5u?IaBB APj먢' **X[PGH Q F†B%P~ǽ''9ޢh333MMRmtP(z7o޼gϞ௿?m޼ٳgL&:{Qnwuҥ۶mkr@ @NQ{RkǏfnn`0D"zss$su6M1b}xx8Ésww'ܾ}{„ eee-~VFcsΝqQ3dȐƍFFF?[6~NUXXcccEΥ_9}N444 mm^J$kki5񟔵d/WggoINI6}؜H"޽[CCё*_~ !D.7~~~7n=y$**JGG󮮮ϗ3gYlB1cFc{mFxxy۷o!d޼y˖-U(ӦMk,fDDϩ駟0-A"ׯ[n:>|~ԩV+lY.^ !O97t+|n5g7}E0s܅˗m0 oC ֵK߾vۥ뛘ر{/AXXدqƚHeWWWBKKKSSS_i4Gc{mI-խ'!!!..nxzz6s̙T‰qn9"Ƞ OOτb333Z9|0]NLLn̍D( l6ܼzQqqTZR\J#]شapb]M֕D"RWW/`2UULL_YG&IRkkڳi99:V**fھ⒧OBFsΝbxBƍ7nU6Q6/ZZZʻ X.m {{{__ Nnnrqc10-MWWN;;;Skk:5u֭[7BG5ekr@ cW\rOMۙg=zH?pl`Ot];-uuuW7kkgϢxx>m&!$9%e\wu\.\cme_P``>v!$$$7nyÆ ?o%.{aKK#G̙3'99ڵkEEEb=033+++ɡ2g~Zm' 2--}[ݩuԩse2jMur–. ֶ>mRirr !db׏ÇBzZXX,Z҅[6ohZFYZZj7#00c._tPQٕP(Vx;fA6[ҧ2U❻CW/*BaaajjM'))^u;zߞ] #ڰaCuu\.2ă6:tgAAAZZںu(|붟ʼZv͛7I9UUUyyy%%%{ ?J...ǏP^^>x`j_~!/JRBHii?(lllZ_ rNhU*BgÈ'`˗ 6if&M9BHEE+S'+N8%x=P3p@ظ8>߸:!!AŪ 8HeTӧO=oydBall_payy#GLMM;wLm܂###TZsB:sy&AFFwEPϠ/((HKlMop՚֮I~x0)ԾF#mC|\yzW'R4٥˼|:1Ԋ~A}Yʕ+ 666?5kwi9PUUԩӻ8ڏǫ}+rNhjj˥ҚSN_C%0 \.fY[[>sNCaB+\NӛZӧ:Y#H[o:Ox KMK>la~}޸e ѣ'vv}rrrڷWUUڥBr;w=ylb|m˿GuVDDS3 lq'O<fhhhos6 !|.&9 c"Yn4m*wzƪ֐!/MvVEEE$АRF IDAT}_ߵ};xyy3skjjD?ޡ{(rNTtiǎ0eoiV.;gVqIi;S9jٽnUUeYd)ugՊLPC.}9!C=xgVVրJռN444 mmp58D__a| jRPPءC cϖ۩ /IIɧϜ:|>UUU#\xIhM([qȐ!Uqrj㦭+Q}^Im'&&}7cM[qM/`2ff<RZRҹs'555eM0K(lstC!Hx\>/ QL/JL~jjZNN :Zn7f֗H$zzYZZx,r_~㪕544֥KOXqv_hk;A^㧦L3=bB=z`ޮOOONI3םA'm =T@B{1{."ZV؍;w?Oeee>8qDFF!ߵkWsZ1HX5*j:455 !vOw&#%%0"?X#x" >Bf|-UY(FG ?66.667NHHcjjjBq|>09r}֬Y)))޵lBGkք/>mޘ1 ղ !LOdB455 w:oA)z.ˍx;r,`gגѣ5ZJxxxZZܹs>|x7mnia!Ɋ 9Ϝ;oޡ@ȼ}nԳ---BHAAAZz!痗y\.Fr|jsp0@*>tamaffvڵիW\.͚BD"ٵ{/dz0JkjˋKzU׮>C!˅,BHZZ3r߯ ¬{)-BX& Y)UUծ](A m9?bŊfV޴y"%%%;ܿ`PN :y2HMMޮl:Z{|Y3]&Lr555Nc(o"ݱ}34tss^}_ߵ};xyy3skjjD?@ Nv=//XCG63HW\Pny ۫V.;gVqIivrgz3$$ȈGr+//PуlT76nμ. 焷.J9Ǡ;flv°[){X>Q&iaޡNrNhJb‹Aڷ7x8::FOOoÆ 90_qsk9' @ 99'rN@ 9SuM ||A@ -kO | Eҫ|cೂlAsi4 9 s!]SSӐбcG=2r1L++Kި3oz_`rbА+v|Ə;?dJ8++ 6]?TQQ˗TTT++ be\UUUXXdhȥr%vZZZjj*˵QDR4&&}TV:UUU% K]]SHLuuu.Kd111]vml}uRZZ_|33,>OmNOs{0{'3NyrJʜ :]__?9%o&GG&X[[3\B[Ν/kiiQ?}oBS!/Nqnƌo]]',\Pٷw!$$$7Ozss$su6M1b}xx8Ésww'899Qulmm޽fcbbΜ9sʕgϞXRsؾ}{bb⯿znݺ=z4>>ɉ`p8ǏW;:@} ,--8 7'm!>̙3MbÆ :uZvӧO=P(\\\cccݻwa;PSS3sLǏxBy /%lP(^JJ|㪪ꄄ=שy¥[%Iyyjo s|Ҥ z,RѽxuoaAXX؋/JJJjjj"##\]]utt!Ç/--ή#Otutt,X@QWWׯ_||kOe˖hBiee{YZZJ100+[w >>>55hM?ޏnݺΛt:oAeIϞ :qL&*˹Λm[~ѽ[Î7.33sܸql6[[[ZKB444!SꚚ[(+++_{ :qFeI~rKf͚Y,@~~8u4\rNh=|>_.o޸^,ưNl+JI&/^bW#<}vdЛm*%''_vIIIw8NW(Զ\.3ڿw|-Jc033+++122"$$$46 s~~~}޸S(e2yue/q,"so_**r<--x>PMٰaÖ,YBFPܺuK&\̆YPPn:ey #fI^bZ[|}h ϼQ?F i ޶ϛuY&{2<}RԩS>|~GSXb֬Y{챳'̙cdd$rss۷ocr8uꔛ_lٟI6hO,:0޾:Efm7lג ugr X,ݏ'T޾9srQ+!D,ZXX{ט柢,33)ol={vٲeF4$zY:o|,:cڿ'&Pq!IZ⼵ODs:}L&¼p\.B[[Ʀu:pʕy͚5 !Rnݺa``1~tiǎͬ&ṵR0 -wrNhX& 9E99' @ 99'@mW}}="X[Kd6xT&_gRcGKw/pwszCL߽golca_rJLLzxT޺P% ly:555-''WWWJEEF*-).USSeٵlܼsZZZpbkW/h48USS#drX _d2*_>9W~i; }}GXrsidTe~AؑC|5ՖA***.]~Z*$he9ɓv_OuˆBbȧY[[={edKOn3 !ii}e!s%=x\cGy-Nxx555!eee?i'|]'ȫ$Tڽ[څ:hkkxkoo so,'O1뫑#ڵ3iN}-[0"?X#y%!DŪ 8Fn:HUe%!DGtt+++ߨ?> !vv}ll:޹{ ߴ9 7o+..b2KJJ !FFC=~i܄G6BYY kjjD"1{p9!#5mfdd޾}7YufAAAZzuaTteރҢh ~ڵ3zZ޶«!#055++7Qv*f:s޾ޝ/,َ FKLxksΪZW\.fY[[>sN B¬jiuUUUvP(h4!ĐgJ.~-{z7ΉFEGlˌ福E,oqsR!evqdͰԴÆ4yc}nfĥBP$z&a9N :}V|iL ~MM1Qф\555uttD"V3LBY||Oޭ'jGҚ-[oؤ^&̚9cQ3 pPȿnrk_~1l***"ǵlbY}r\v>ϔZ*<~᪕ΙU\RbΔgֶGR)X]]]Y~=4NcG3J(VKLLTUUl:Z߻rϛX^={Z* Z#l fu t@h4Iï6a0ۛ5'[4>kgcddcyOCWUXIӆXAx9'̞qJkmY å~rNټA@ohޣ7#=.--522vР <Ǝ5fOuuc""" 6~GCCC>}:{lG9rD"8997g'$$$44O>...jjj>Bt A+[kեKu7R=ztS&cqΝb?t5kdggS%O<ׯ!eǎ9K8~~~ӦMx=zرc2}qNo,N@@U !}D )}D&ݺuK9'_>zaΝϓ'{xx(?Z8RjDSSd6W'm9e2_Ցwutt:q_xР}z::h]No^_Lm{\m`VP^=v̨Ş!aaVvCS& SSӚD_^ oݺݝf͚'ͭj׮>x3g 6lyTTU8={fddX۷o;vL[[;++ArNB,jjjjBχ3gͽ1u_ 9z,ٓT򖝝Cwzg{Aߚ.Nwvv&op8?x588r=uuucccBH%r+WJn޼`++ӧoٲeلwwwkkѣG7>An޵{oh4BH\|ypճgQFF_p62g;NONIۺc255 8p@YYdס}{׿g۪uI&_\.޺u+!D*B9BMMM### @ѣpڴi&Mw޾},X@i,-,,IZKKK&bkkX|հF,--at_ݨ˗~;x_vedd*oP|:(pӆu+VTziٲ%g͋8O톇 wVNzz?ƮOoe@߯Pa EDڹ"{~wQ\\\?.!1bweBѣG<={7Ғ?>|8((;&&XӾ}{#VUUի pMo@[9&M9BHEE+S'+N8%x=P3p@ظ8 xue!o?tƝ;joP^W.Y0p@:a ^Q?~Bپ}KUee#Fmæ- NCߨK/4hPLMMiիmll} !aaav:{WZ5eʔ& IDATݾ}tѢE61O>}nsN:e([w +q9!# `RO߮NЩ㕕99FF<ӃΟ 6\]wu~[C.}9*c\ys PQ9vضmۊ;tPiFFFF[ K.eeeI$KKKj)KJJu||||||ӯ_JSSSUU&4FyoyFrvL9Ov w[=tAw444ڷ7{L&¼{P\.6>h4@r{o7>/_Nus]%q3,5-m!ܠ(WfpC VWWs___v_ H$q!!d-kw4g{ jιg<%L2m:zjEFF&gM6ŏQ\Z5/\daangקQ555 -t"|ps!ɓwSngc yj5>h䜍{g5.`9g7m~^y ť~rĄFM[W/=B 2xª3F-Q(h!۲x9'%C$',h!o6DرW_}E嬵<22ٳgo|hɜ3 ''A"lڴ&<<\E.]bӧs72dȞ={=z{ݹsGy(--Ν;/_BHT^^^\\|ڡJKK~W_}FG[[[{yΪ"P뫡H_>99͛III~~~&O<8qĪUryMM̙3}||?~ŋrBpqqqvvwÇ]\\G߿?!DMM-$$D P ,,ŋ%%%555&:::ÇfggR4#00e˖hBiee틯 眞;w ,!4nܸqƱlmm\ej-!DCCRQQIs8j###NoܸQٶ_~sR\Ç---92gΜk׮QbzJcrrr! r\ﯜ>Oۿ]byyymذZEEE.Blذ%KH$BBuL&PSUUWRRBS(hZ<$,\ȑ#^^^;w5jԩS_ԩSlĈ3f̠hCbO8QQQadddccf.]rӧd2.rq4ӛ -m???ooB C= '422 Ϟ=kbbBill|ղLG W @kMfYʕ+ 666?5kd666zs ++[nEDD;99@~tiǎ0:Z XZwiNĄ+@ o쵯h _ IOO'0L++K3رƌDXd2UPP0~+γX >7X[ipRh 88ϥ,h:}ѣk:朹xe2P%=|n0wJBHllӸOEMJIFPQ DMf LfM4..^ Ƅ$''WMMf9]IIill@`Q\( l6ܼNo,Tj58Η_~΋/ ;;WV #77 =Y52YUUښ2{'3ֽ{W\|5Ֆj's/233-^㧦L3=b`5|l* ڵk7**C 8yЫ_lld2ٲ+ǎ}ʅ߯]v8`𧻓ϟ?o6rkŢE .]8['k~m˥ g^---SZva|G !C5X >Cﴶ˗4sΪTH$֖J111۷755tG'99АfX~~~ӧOP9RbyrJJRRrlC566vZZZI$Xݞ)iI).Bh4ˌoPx}}"/.Q%EoM9 >]sN!_|S1s 9' 99'|T^[jpHzzr4$$tQcF"_ZZL&u^tuvkw >s^x),O^^^x<2ӓH$h9]ڝB9zr@SdfQqqTZR\f !2,..^*Z[[)g LT*j*X[[ӽq꜎`9o&*;IF/|c$I\|ϐE"!N7 x9gOnhjjBcB]cjGHxx:eeeMĩs:BH:z絴BrS *rU(˽}f=VWGԔٜ&B0::fqq|qUUuBButҤ uNBUSSp<05587ix---BȀ$X,NNN Ԅ'FMtB9u:oΡT].S\~##ޡ ػo?Yd诚|W]]RYYUTTA5 \(-s6FS(6ϗ7o4HҠg.^={Ij'6!&iee0pU>رƌDLXR9y,xQv^m3^x)O׻DR{Ͼ޶h"X"4v\ン6q9 !I^b>}}W$9Y]uH$BYYZBkҒ⒜\55U6MIMMձ|>V #77N_/ddUUUkGkkciO\jK#b, ǎrNo/N66 e2ٲ+ǎbRBk׭^}Y?POs2' r¥[%Iyyjo GӓNPf>2''بv5=&xW#Goo@q6dƪu u&!3$:9Ё}Gݷ,Z2zW[@cٝ:4vH&D"CCCBHFbl#ihqp0@*>t0];]_B!~u]Ti3LHx% !BaVJj*!DUUk. 7;s4m͞ p&&_wnq7ĩݺzX6{|MMMHL&m*<{78'Bl 嶅yՋ"Fh\.GYnkzhrɣYRols]r>mC+,d5r@M\fsNJ߾vfD";⼵??{$!D&Ԙڙ(bLbrً/-,,^[*!>P(^xI;v` /prVb :dP\\U>OϸyyNz5ZqqMO4Vy=7%/۷ |)!Ooۓ'1 \-C>VZSSRR0!7ewҮO ɠ=;Ofr.3ɦj555a0OE޸qW@!!!!E S q3<22LWWJ7iv>MWvݒŋ|վk ; <' h9!ZC]D0t܉RPPYY|qnn.!vþ}TС=!DKIa2++!UUոfٿ~[޽{! SWWZ}Jp:j̠ͯ~XyBwЖsikkBJJJ_}UVF:4t萯F~)ɶn叛acnjz_}yΫW.4vٽS$UVV#^W~r{cnjV<>ky!&!46(\{U^Fjbmkԭ^UUk+tDE$,3?i~$%j_&67@9 sȜ2'dN@&%/@dηF P^,1,}r+ڸ7î]{1򻝻իmu/bܒN42CbzƜy ʗLθ_]-..zIȔeS :b2[~$!NpuudY޺uzZ*++8I^ԯ:caaQDB$$)^]N'(++P7~z^5ww7FFs mmmo¸s>>^VV322322\]]Ֆ KUqfȜUYvmvvv֭FMFyȑ۬^XX׷o߰vڭ\GwoFFF>') io6nܸӧOO.XI6lhaafggXYY !L&SVV$I999ԩSuB\z`0奧[YY=w _4)jVvt$0)Q !ywfĩ[6}ᇋoOğOض[dEMѭQo !?5iʁ{ml+ܩ,o3co Se(1Gzzzۼ5r짟?n~Ul:Q s%IRS;7on~^NșkN68΍5B?~<88822_~!!!OV7hڴ?.gee !:w|xdd%IH;vIovÇ={={Bn?-;ͽ^!IZ<.B<| ?hd'׳5Ͳ+6i&re;r#C}cNv/Bn IDAT_ eA?ܬrʎ;|嗛6mbii6:~0aBݺu8:88!:tPXXN}$OU^=/GΝ;%BOOOɔB/O!$ǎ{U-92WãZ~zfffZ~bOmgg'zjjEuFUl1qsk6m:iҤ)S^_~Æ Sˇ m۶ 6kBt45:feeU}$Q>u~iIMß?aR!|5 ?+b2K,m4\͟K>Z?g/^8ΝBxl{s櫽(JtQqNІK.B +>U˵Z,BԴ6l4WqpOPN vAAAڵ[fʕ+ rz}7k4̓ijήD-ɹḥm޽z^ݫQE;y2E6O|65-mB_DvG~`mm߆רQ\h[%"Ys+JSgܵum),k/ۥk\eA}>}W]έ5 EEE,'%%}3>hР۷WXw…/r``[oekk[XXrJ__W^y%<<|̙,ӧOgq͛7 z^۳jgΜe{!䰡6_K ڱ}sNn$$7ja-N<6d!겻JJJ/ծUQ-v ذaȡ{SSF|S-S#Gּys1UtwWo!DLL~gBLSNF۫P777x{СZ"r*O 0]u233֭+qℋÇ;vثW waccӿ+Wj4TTTT~G[bbݻsrrԃ,((jtϭի1f̘ŋDGGw1&&&&&߿ Soܸ}Ս7ݻdRW 8EѦM]vU .;vl֬Y0Vurr** ?0!!A.9u6a{{{KKK!ŋ5͜9s۴h|geM /b߾}]vݰa?xyyeggW NU.*}ŋ{s}W&/ΜnnnM4)_ U*|T$IlcǎTԈvj4SSS?j6sΝ;w+V߿׮],Zhۏ3X(ʁe+tʕs^tI}͛W^>h˖- ݻwlm۶;vlii ++v-555>>^aii.dcΜB/'puu;vynmZ]|}}kժ5`{SN=z<3[twXn]^^{ Μ9s;ǖѢE ??FEDD?)=wﮰkEEE111n|tKKKiѢŢE.\c~Oe]v%???r>VZ]|9--M[[[h_׫z;%ƟfΪ?MpppBBBnwtlN:Ez&n߱3--MakcTͳ2fΚ{o>^S&E=nmBoPZiחci˹ß*--x'uXFͦի4oT-U s.Yssn>m$!DrJJ~=zUꪌ̌ WWנ@+WmmmFùs}|||Lqqn99nj-tyP~:?k׮tee׵Z7Vx}ѡ~9jW\U?N4ף|.8Y󉳓"rర'Drɓ&_⒒͚cr!9yZBrs۴i]~KA!D҅d!DiiŋgNpx#QcOsO7de:8>]ᡖ{xr$:!!h25WݫUŹꀧ$I|-ۄ11&NwNu>>>q;:0k?_\uN̉K?L:իLݸ^}ofg_ءWUIB++K!DYk׮ؘ c~5Ͳ+u4 OOOV,[ڥ˖׮]{¸1? sСC_u;vͦ}^x1'V3^v%%%j !RS,ϛ3<|zwhuV[2 zm>32BԪUz888 z=r+zCʲY~pjjW6TQǻEfϝ9\޲͙`lEQ~Xfw:ξ7Աh(Jeo"(l7R]v}nYwKKJ۴9_/C$u&Ϳ^Vt6D7k9{|EQ*lҥ/ںM^3wxp?aͪ?'uy C /(PߡbfMe++겛[OV1snOO+++!JJJ/ծUØ4B/JvzsyB2' @9 sȜ2'dN p xl jiG'x}(:!EQI p@m <>=jf sȜ~+W_ɜm۶;G<vkoggkkYPӘ[شyˎvgd._|v=d]r +/LӦN`0$&& I WW\r`0ŝ (Vן?> Ct!aKKKskAAFq-?h0dg_puuDp+>|ǍȜgΎxsd~˖4__9ppÆ!?[o e ;w̙EE^occ-8iG]tqq^g'U>KMK[[hP?xt;pKƎ޺mG_7v4P#h4nذaaaUWrpp=V]][8p(((gϞMx#.0)Q !ywfĩ[6}-I"&8;9 !>hmlccnj7fԼ^n޽z !ƌv[#|F;ǟ~^&I}/''HjIOϛU9y3f7nx 6Vݿ曻>*knСB˗/kn˖-MxrtpWؤ%%]<(R]=}IػKjTyp^߯__!e&m<<9/>^h2 P eK?l8LѸqزZXX-t7ƍ#GիW>}~wI]\\&)++'//`0奧[YYۗ>}:000 @m6p===]]$5l;b{$I=*pԩ:u !^ZړO66tѣǴZKw!DNn­vuKKK+++=ׯξԱC{gg';[˗y pO>Yt| ?pKw(111..n &8q<綊Rp;tPXXu΄$IޟwdLVmn&5-^*5ȗzҵ냇vf^5dC>T F^^^BT??k L;jӳ|w)))G̷_ΤA9kkksvkVnݠ7JBrs6߬&M>uqɓ& 2(O՚˟zɞ;w<|%IСsLW^!زeKBBB墨… W^=|5F.ZhÆ AAA3gT>}>VTw@uf޽{gSLUwN `uиqcs;wشnZ-ѣ3<ܯ_Ki_Uj׮}f͚Inݺ#Gxzzzxx$&&T^*S]W_}o߾)))z>00~H!DXXXZZZrrÔ)SVZŕoE-pႏ^8yѣG=222mll򐐐SNeeeITc<3s !$I Q.88v 7!Fsk/ϜM6x0%% x<>Nx3%K}{H/$Nx2'XmޑAN< HCȜ2'B;СCF2g۶m/cn- x~Nxܷג3 sȜ95gcnpjoSMDNRBl6x ˙[ )dN@ sȜ9dN2' s@9 ]95!5EQ| #%VWSI U~N@M!sȜ2'dN@ sȜ9dN2' s@9dNȜ2' @9 sȜ2'dN@ sȜ9dN2' s@9dNȜ2'dN@JRB,[:ȜoF @~;|pNt ̉[$N2gH?K' xW x0@5q$qc_ )!

]rRMN'iS!DFsں$'j\\3g܎,{7s֜I-]7F~sWu}.wc$$I(,F`R FLo{oGQW/`r^VK$!EaIFY2Z~ M&m;~gƤ|yAl߱1>2oo'hu힘ݴy~e?ۻ?P#ZFJ$JmŋƎJ;W1gδ2`BVKQXZZiY3߭]A1q_MKf'NNBȁž<˹s'Oп߫B䔔&%]5ݎ_HN2tVqqqp6mZWK\+}o:=V?g,&jN͂' h9%ylݼNxs۾Y*7wƍ8s;={`^dN5EQ!ˊ$ Eq+W2sh5O&23zEQEEL\OH4 O>ZacFBȲ1~fOپ[;;{8i?^#IҸq5 =kF1L%%%DMѭQo !?5iʁ{ml|uخm L*j\iWtJZaeil,m$I\/1dnO5ioٲmw)$iѝD;vyfj-~wwȜj2tʲEe+[j֯7Ȳ,d*2!c{xr$:!!h25ݫZlQ\\{g/FBhZS';'~]߸qؽ|mi;fMbfNĦ[$ +dB'=\uZ)bzBb`{Q6ƩCnAȜj0s YVEh4BBdm I f47 h4R)wgzbzFfv;;;^|żJd+B]jnn[h4˖44iVлyW_hWt]N-$FHBq*&Yh$( I(BQI\7m,哶 -;8ؗIc0 K 3b2IPB&xL { W41#tƌjM&YYSz`nNmv4k~C/ζmmP?x:?ϭPcdLe&Ssٳg8n]VV>ʪDYr6~iUeBU?n.V+rFF"55 >͙͛;_*,**n/--U3rtQ{&~UFZE+e2l4Q&dRLl8woL}wݾ;!D-%/k挷njڽ`@0L$ʕL Z.<~ݲ+}||6{vm=ܱun1y{B,BtZIZ()3&gwK\u¸1֤/v$)&Ԃ?If[QĘ ' 9Ԉз疔؞<%Jnŋ鹟}fvͮ@MO:uЩcK.x{yY[Pɓ& 2(O՚߾my*1k /_>me%%%Yٗjתݸ^~xڳ#o̕A-XVĄaI.Vv}77>\g8YZYZzo;Jo!1?ΝIP#>$m[uijϚ05!޽iח|"]:M˰j KWWWWW;:0=˳X=Svѐ 6õ !wx>[׌ kaaa^fb<@dN5; fxYQ r:u6 k|\W?ͣ2[+;۟jA!hTE$IF]$I5@Ps`v[fdgKB(BH!pSǷI_$H>,B,Fd4_lYCռJJ)Iѣ( g”X:Ϝke93g4~ikuM#jh@DDDDDDDJd9\ Kj8* """""""rp6-\5K3\LɶNp8"G`nOW7EYDDDDDDD.gs%JH X.m;ay&Z #UeԦ^Tmׯ!.edK1%ӖJ^")575$0iرm6%!M<` )ٶUq| F7E[DDDXEw0X#;/pG۾~>N>z㈆뽆V{B*I8tKJprrLJ: =`.)fш+D٥QTT@0Wa#x %ԜfdR&I(T [ِ?ǞεQ4zdbd(Kv0u$ Bl‚|NR)ۇp<<;r=ӹ]}),*c|h)0R0aCZ:_#}پa }h·v㖸[DzB} !.!RܕɎRi, ο:EuˊͩlQц``5m2NY59{Rp2kAo4~27 14huV'Mi<ڷjϿOI@p! 1鴼 =wõ-HV ͯiDp@f3F'''nٝ/Nf/l@rObZ#8F,r8l6#1$QZj& (PB#YrF?3K9F^I<CM6`=(|\d#.6.%4?w?J9ٰmy#]үoCjdž|җׄ3 WlNQa>\ޛ9 ?GqtԎ6͛ظ)x"""G _S/RZ b"(Џ4Sj6 O?JL7GFOqڻcҦE{ ~XGmI=v{\hdkxv6~GdlFJ%F]tmגkoBM,'כZ^?nbH07VDDR$;sqww0%bp1k嗬_wX6fN:zDd6eVBݹK'לO\+"K)V'7fMiɌy^|ضWޜ1Gw!!] /7 _DvYeC#s{6* ֡Nx~1ӭs{&&_@1Э3OOAQaw#7/PzacW\c2 /'>v7/>3tl6ʵ速۴bxz7UDDR$;NQↇ+NNN65:)8q:ňhjl\Ƴ+7Sb `[NGZc.EMZriߦl7g &۴ ?7DDD#=(Nmg¯JfjCY |j? !Ax{ѭs{%ȱX,=umEiV{>o[{1fPԏ=1~]]tOxIF6SiҰf-?Vx]wȥJvl6 ((,mi? Y 7X߁w7 ))EPZo'@qFCٹleRZU!su'DDD狗ږohVAv^>yB\#7/& ['>wQa]]\kX.I1eRJrF.'W7ȥNv.* MÙKe$`=Aa" ߿fi\ؒD6<2!qqd{&>}&>=-?͓3'"""s1%9$繓L~O[oׇ& 듔P$;W#Oy,K#=pi9|IKH/^PXvYebPgwO Z`\TK83 ޔԔ?rꎭՃHNT0l8[1۝H,GHYO@^#:^ۂns9Gx{\yl+9yk?_V+I{-=7?;~_ԓR\ؗg2f#|~5'u2ۡ]qvvb\<YɎ"6k)n|0Q'a&E DbT{I=ÇI? kx7;Ѡ(+[ťj3c]~A|1FR+..ncF:˅/WiP 0%5B7ʦX<=hz'("""rE*7j,9;99U''tK"9X$ggg#m>6UWDDD[+\A88W=) ޾1(pFNߕEDDDDDDDRrvvSz8[lHU9'ՆNN{\KK.)&;[+P^g5STDDDDDDDU)2"""""""rE"""""""rUQCDDDDDDD*JvUE(!"""""""WQO|Z4UeWjjvsx:0qF<(Kyٱg""=|ff&vwwn2a0pqqVj1yԮyֹU~85jxT՘L&8_R򈌌T=㽉թZ#;^+#)9A- K7Ͽ7S^S(.*.b%99pVwX~KJfڌi‹/LVvv_^kןu_eJsVеK 'w8gY,bc`6iܸ5rCt99Kdd8nn5lJfrsHK; ԧ9Gƍ׭Hnn}n}VSAAPXXDvv6aaeJz`K3[*xzzR\\ā];ңDDDDDDDD*rQ?2b$˖/?GpKフ~v,3f=oafou7C{~G$$&Oy'nݺQoߎE8_knF|||ʍ[Eqڶ};֣'e.pI c/AosK`>""""""Rmٱi0fc 7O?$WaXG<<ܫ՟-[⤗Xxq :?fcYϳbM<} ߯ځ8N^7?v NNNdeeӚu| SIK;Nb1yV4n-[n-[ܹc$;ʋiRRR]Ec<ϡ㖛S>""""""r=LJQQ '''{vaX%""}C^: M  ~>p}k[(,,b͚u|rBBE-ټe+9$&&2|P6m[ӹF^^LO_BӁϯlӴi֭ߠOTKGvlقGG t4F#fpMVXjPV-g?:,v?XRn'/a@~yQ8u-[ }tօ)L%77{~eWk?6yO^a2eS)""""""|j2c+tP  1 lÀwCشy xoՊS|ӥK D3oWe&Tnz}*EDDDDDZb:wi3),,|غu;sIмy3}l 9TXWHhqqkd @vm];1ύsԎV ,Y}JLLg>Ʀ\EK8~8[ y>""""""R-ƿ7ޘIqQbzp-}h!g(_9,[SXtѓ뮿VZTXaCYn=[{jf}d`;'ڵk7Ks-=ƞ zԛώeK ѧRDDDDDDp(n÷F͈?4^PP@jqjղ/TyHHH}_׾g!} ǎ%>""""""RmfG=뗭N"xzzݠ~ȹsʡe7LttKc.IjgBz]p/˭?WJ~wО0}EDDDDDXDDDDDDDDjQ!"""""""rU)w͎kW)2"""""""rE:+a0b8Gtf\LWv;i+,""_[^-P*"rњK"""""JvUƹW۶KXX۵{Lx{yY#:Q.nWԗɝۥ=+ILLt8ʕӧOon7=>uM߷T_Fvx{{Ѽy3rss4#F?X)/,+)Xrd)W|GRr'##֭[gL&/}HwdGaa! ~G%j +;RҎB`` )$''H1s+G&v__7ncwrss=@dd$,+f7nt芜\%2277k&Np,33GmTtĉL<==1KF7"""""""RCɎ3V"~ ,SY&1sTƍ?U6gaZhvCF 9IZ|4o;~K@@x~sr#Fd4#Gyѭ;ؓԭEA~:u<2b$wu\} 2fͮaأY|ELvү|iwJvmѣ;M4Oa&|>gGV6j||<4qnFo݈G٨fOGii) >Gv~;KLg1L$''{vaX%""8r4G2! yLJQQ*|}U:"""""""Ry^WlCGbwrˏx ҎscIF B;g>Zfs>í~d+EEŤc45}ڴijDFdZl#U+iޟ \Nd0pww'$$vmVzÓ%Nvk"##HJJh0`Kbe}tFff& euBn]0,⿌3n/.XVfL{aS)(( +;۞0III(;׷S  \^ Sڵl6ӚyyW_y 77J3|ȳ|_?_,fϙkOkINNUw>z lS /~}rr GŅ͛cJ'22ΝxuL 2nݎb%*͛7wg`6=烋3|}+Oub!"N:2L}e>x>˿61mkg}oC#)33׈H;htbݺ łj噧Gѭk/LO?U|ŧ }x0Cdds;wtK&TzodėӃP2Ndɒ_b083}1wd 5[n,D԰a4ɔWpwwp JDDDDDg8VމF͈?㸸y+$;':Q899~ѷZb60vZu8WZZJBB"!!\VԷ3D,D3dp4` @Κrkδ~*uazDDDDokvS^*UH```F###yOOO/Ɯn]XvEETgrb~W6lHdd$deeqVX\lvݿ|6-ԡ%"""""wgϞxyy+;['''8p1?Xn#Gѣ˼k۷kM6qwb2Ϊj2h lB1L?op!~m>3Zl2d֭A?@```~z&OLPP{_gȑ7Lǎ駟-_Q_N]߶m[֯_O`` {/o_~!;;???lقyc-ruЎR;ܵ^=Cv Nd+X"""""rQӧOgܹ9rs6s=~6l|)((G$''իiٲ%W0 gsA~GvW_}ԩSkx饗矙?> fժU믿~Nٱcvb֭|¡W^^ u7̓O>Ivv6۶mc޼yYvm-[ƿ/^}U˜>}: :g?; ۛǏWSSL(,,Ȅ ׭[ʇ~xzbԪUo`x7 QFloo9sлwo|||0_>̊+ʲ0L)4端&U/UUX\*n: i)WLTcWLnĘq8e#.. xϞ=yg֖Xf (%??O>^z ouymҮ];V}}~w,gggV+ :tդB x7THUX,Rϟ]6#G$77~Jaa!aaa4mڔ@FmOBҭ[7hѢ=ّGϞ=^rr2;wN:hт>};طZ;v,+WÃnݺų>Kǎi֬{{t}5|}P Xr|U_\^ /kz-w}tft:̹#))P(jHII QQQu1*b28y$899Uꨨ/q1b-oݨgNQI$'%+U9azEDDDoR7MӦMkNH3<`kꨨ/[E.WӧNkz(!"""""""W%;DDDDDDDTjcMܵB""ѽSpDDDDDX0ȕcU PPPq8ȍn :i<Գ{n4ݻwUDDDDD.*';\ wޝM > ->OM&봴㤥OTTF1^^^yxК"rE>rMTXnذ!e{8e~_F j/ ݝ|)S4?[ADDDD<:m?FpKpPGRPPb!.Cri݊y;pqqykHuM]^"6r^4p ww7 v iѼViP>I|rªO`6%Fa*Ӛ"4e֮][9ojyzKpdʠbvFVv6f399'33^l6,cPZZz~tԑ/Md挩|'m޽ؽ{&ؿ? 삳sYĉL e۶SM`۷~cϤaJjx׈5˖ah6-`u|xmTvd2ѭGOv?D|),[Nƍ9c*OEթ'N%(9#q2 𑣼tzƻ>]s}0x05 7Gаa9Zzj4;wq̤V@)1w[ybcx{/gaժHNIÃѡ}ĉxzzr{1{ j׼LӃoC1L>Z:+tu/zmwȈxi<=/11yuK7m[ w @ff&NNNM8q`fΘ=2Gtf>"""""HXD.:ӷ[mڤ1֯ر$O}h۶ ?|,_t sgdǶ-(( 58Ajk?7g]ۯ:|zڶmÎmHIMl6:>777c?5jx`, ' @Jj=F;cͥ|22Ν:y%Fv`OMqrr^U^"$8$A}DGMc4Iz<-JN&l6V+-u"-8ǎ%L&Zg*((#G`*!""""R!R}$\ /N|&bX c0ed0v<"#w73f⯗ҴiS{-UDDDDJvԀ7^QzuX0.'N`08-ӲEsV,[㔚K qָe||YDDDDjժUq@xX$""""Rf\U"""""""rU5;SYv """"""rAͦ%c0*%;No+rr{ƙ#Gz\/"""""rȎ?UfiLXDN$nM Y!)ߘq۫7MDDDD%;DDiWL_nD͕ \M"""""""rUXp!x{{Ӽysn馋ږ`ÃvJ:uTOjj*>>>x{{D7j 5%DDDDD䢻Ɏkr 7ܚ5kT HKK[n/ӵkW-[`8/_C=Ľ˜9spwwT=}'`zڎf_JAKٻ說{or !BG UbC)RĂ"f@680AE) t!F?2ܗKBH ZY랽眄d 5k(88Xk֬p~]^D'>}֬Ye˖iÆ BرC;wb)vfm߾5uTOڱc~ 6e[N{nwgffbĉJLLTzzsEh޼yի͛]erh޼L&$I[lQ= ժ|-ZH͛7n?~M͚5SzzBCCr2iӦzw4dM0A^^^0`֭[z ʕ+ &(..N}5o\_~ebsv}hܸq{NO}jҤ߯{jݺu}_~eEGG+11QX,ճgO5h@ժU+$J$IZzvޭ,YVm۶6.[_'I2LvFFrss 2pj,111Ζei{/,___ծ][fY"777$VZiɒ%*<<\cƌ?\9rD!I֭խ[7Wq1g;d4^xByM4J/9?ǥb2 #77?Wbbzu.?h˕萤hѢXy͚5eZu1g"">>Y'I]tQ.]TXX)Sڵ|?\5RTT:e˖ɓ6ӝJhpnT'|kVFV,6|j_MjtVTUΉӛ'Q۷_ofPzuT6ݡ]wnTN: 4p5&;zoȑ#駟nwmݦ%$$@ 6l7,^꒵EٲX,ӧ~9shٲeEtsnWBB:iԩr]vnh4\U{Rn+_Zg,}>Y)zU"áQsz@ydv=VwI=;H4~4q٧r8֟'>>^ߤ/$)'!.@Y ͘1C8}嗒$iFju]O||}}I5jw޲ڲe:w,I]VZiӦڵ+˗K۷/1}QrګMZ!r7)SëkjPVH;ũ{7Ԡnƒ|d$Q%&&pCJO?~sUfռ X”7ʠRXbEM4Ν;,pg]vtq9rD]<==/\g?^#FЉ'-9kN{-1z%h\&ߢhPP?h pHy:\O-GLqK:Rbώ%K;VzQp[{eQkimQC_}e>>}zw\BffL&W, $eddBCB4nh͙;_ӿ@=@)o<*';ʪF% .21jE?3iojj!E);ߦZ-U:))#O]4Q6dEuBE6MF;|bUPޏ#G ڴqvi?wiw +ԈWP :|BBBԸqciiibΝ;ڵk?:uرch]=0 +THXmBMjhdm:J>#ɠ _5>ZO4X6+|z_g$^Kc4U71o\GVaadە IԩS^:uԩS' :TJHHȑ#/.w{L&<<< RXX""jFp*88H#L*Ɏ _|ڵkkjժ6m]o߾joUNNԩ.]`E]nZ+V+Uzzs{1bN8b߱c˶s;<<\K.unϝ;W5ktűqe:Wll7nCw?񏋾絫T"$;*P fmܸQAAA6m=\` Pɐ@M4|pն cQ|T)(iM$gypբgRHv*dR"թSW5""e6{(''[)JL>lsh4)((X'Nd`4@6ٞrr]dR@`N)7'GTzf22;ߝd`5tĉLPNNCu&vIuu^˿zu[JG8;q<< ժUG~~cǎ*((XAA>-MAV_!!ںwgoáR)v^g/hLr1M&ݳKdٔ"yJHB$K""k鮻S:+Iu?77G^ -nvOKK)WGv[{(_2F6l6vM& THv\ǒ*;9|}\#} sBгh4ׯؤRQ/ /iZˋ&0<<=uC,];J~~Ք,kԨ}|$Iu꩚uI8:v,Qmڴs2 >cjݶLKV.:_nn]̔LEE+zFn&@ώrrYn d0d0uF%oI:pH?Cv]>u-ɱn͏N@//>}Z/'ák~Tǘ;H'?Z\sw]M5Wzz~ܶu> 2h?T^} #QNZdLnnfSnnv~驩ڴUSNn,gM0W.|||Trr|bRNNs-˹-S:3334gtUS^n,vzcR5˩.e^T:$;.jU֩c筷X,ࢯn_jSNN6/@ώ ۯ zv*eӃ 44 MHvt+v׮"PNJ!J!J!J!\*(( psi7BTM:MA}zl&(PTs)--M;o F@gzu1yg*,,$0PHvhJKKsnj;B*Haa&OXS>b!@PAHv\JIaH$; p^gLwT@8_3S4oBӧշås)dP?,AX@BT)$;@BT)$;@BT),= kW`0ʑp\s`!{ع2J!J!J!J!7B\~?Jyy;=`eF۶Ӿ,ugydT`O *~}[أTzudPA׻[O= B h  @PAHv遮;4*_>GWT0@S򔗗'+Fuw`P``  vQɎ9=A+AԀr G\)Jvt^J!J!Jq#@vA Abw1gRHv*dRHv*L.Y\vi񑷷wl6-]_mٲUE5TZ5~~p唩gEvϗ䃞}N>{??jܸ~qz^sU+,=tLIII Tzue4PNPJJUSÆ 榓Nj(TRRRe6+00XNeeE#Iz4oõl" 5fIfWzzBu*+sedd[ڿj֌TddTdLjWv:r/?Suv :L۶T@}g6+%9_wKQ7vKyyyZ{3!IA/7u>m޼EZԃFvmHWkۖ=aںuôk 2XO|RF~@%IvoC&Izq0}zi{ N~ޠM7S-I>loE,qeXt}ի[WڽgZjY5v;v_M7oѣ?Zj}c{ʸXBo5tTYmV޳GT_VUӿÇ$Ien ?_WD~~>g_MԲ-jܸں<ƎS'ooee$)i߭:q/_QCBB$IIǎZJKKWXX%]HpvhHӏ_T[z]0GvھusNn! IDATL%9ܧ}vj߾,f͞a/PǎGFAGEQZ5d2rM.uK.$kF呑un"%))Y:\t/xeQPP'N| Et$%% hyg%)aIkLCA=kZ{gbaǎz_?/AU$Ţ)Msi|7RSS%I?Z jB *^{v̚=Wfu)[tz uGZ{mIRjj~9yyyOiiiz7-I4)1[]:͙=yᄏ,Vƽ?^FC99z ;2d|rڵ$î}eprssSZZyM^T#^yq$ =ej$33STVmLEv%'b(F yxx\ԅ:%%%bQ5^lͦG\a#?]]ѣ -6hyۼ\ UzrPRUa3. n@Xg4U32a0TfL&EE)wfY.K~1^7߲- - `ώ׮7s[+䝪!NT<9h(5pyէsvYg0_%I5A),?xFBJ!Jqm6&OzzѨD/`:r{9_բ  2rJL:׍2ͺ$I&#GbZhoJrddҘ#/7U1G*+{c/edd[ڿj֌Tdd6]bQÆ ]%č7Wg+88}ӏ߿fbcSzq`08YXXN $<YYjڴx"jx͚Ze0$Izk' TÆ uvi=:d$P|=3X&Q:XWѶMky{y铉ꝷ,q?Ǎ֭J*J~pm٨jĀj֬6mޢڻo>pV^]vtv|}5o,yyy gҵ]:}:[Y6k\urewwkrM:z4QCxCU+W,Y34fH˯㥗9s+11ؿ?V˖,s4gaQÆZd~\LyZ*’fY={>7PeUd]]Wff~ZNAAjӺ>!.ۡ!JO?FMKnW2lP{CujfY.stf MvԪUSmڴÏէw/g$;溝Nb!ݮrNy-W|M꼽 `Qk>ҷ>KٳW=?X~EJMM$j'$cmZ)//Op8q&l*P8X7hP_?JdX4i“11a]]T@@@wޮjWo*44T4a8ur}e[3NGNv#}R>d`_ڵ1wIFc++(Wvv]17AMTXX|}}u!!:erss dUɗӦ+{՗ګ/5nP^G,= gߢ s1G _…]O-[rf띷[$L&EE!Gc2{x/e[SM4R<pY+UD?~b$Pɕ9a0% ~#~q 6TreNv@P9ݠ)Bw\EP *A*\>` p~^]/Hv@Pg3+žH@UrYCh豲ZmqZkC‰(J_M S~~>*C4{UzrP&Z&yq?7l5L ,.s'*dRHv*dRHv*d*Ttn(\Hvܫ˽.բ}+22R5\)''G*,4DJKKWhhF*=:% $8_( V{^=Mg%Kըa;Z52 Сu^ĀjڴoU!!3Ngv]CӶ;հA}edf*((P_}$~IZu{oO o6۷_?W CTvmU[4k\m}KfJ;q z*J JOd- :C`pnGDDnk{J]`0nԾ};Y,͚=W^o+S^#""BJO?D2]"PΞ4ASPɎаPnhTddڶiwǎ~}ZY&m&%SPu5`(S^SIY^jӦF|K99Iefš X֭Y͚ߤ}氘0a պmu>ܲFWi٫w]]yNosy _5TV^LrԡzbA y{{_$p-2vT߿Z:,Ţ5qYۿ/_1V\~^JO22:s~f]冱iϞ=z\gΜ ފW5Ya_ի(aիWOGISgup9 \;/_cj~oѣj,KҺu+ƫ{n=e6X,;( jP?ZnnE>^QQQ/I/5c |"g{4ydI|||%Khɒ%z5giF6M69?9RFjuժUKv˵fmذAvZkӦM. 0@vZu٥}ɤp~hٲeڵuCs̑bт xi+PEE7hꜤJiذL&S_snѹ^ E]Occ%IӦ}#G4z5 X/~c~GYXyJJչsg5ie{JIIQ``Lj*44޽{;-R^^?2'ܹsj$..ymԨQʚ6m +V(33SժU+VիYfٔMjҤI.\uIz5sLuYk@PNWbގ_Hv]M{ė^~U{|P]NxCCÇ Utt^|y-^8WƎ@K9rowYo\?3XphĉzG?h4$;WqcźλպmzwXEGߝp>>œP]%g;t""j|2L.puoNKOW<0w}kݻkϞ=z"\H߾}5k,IRAA$9{k8M:IҮ]$9Mlv~֭=ϟWU;oӏ;'Oogɓj֬b:vpھ}5.CVzW;.9jҤ fSZZs $IR𢿨 (]np8t7[jy.n=Lv3:88FFF*!!VڰaR֭Xe˖rU1[ݷXyHH|J~JwP3f~Zj*fkci}zVrJPnN.U*VfO5on룏&-7;a= 2P_Ju۷oׄ K/9l6fΜ.k׮u~>q"##/\<pU$[nS&QzJO?9v-[uhb6ӕ|hӦ,'Or+ewڭ={fFUݻup(1)IYPP!1 ھ}ڴm;(H |JfoR>yPUViĈ>|xbW=044T111.ɓ բE +R!  :~fuGrުUKMlsz ,]S41 {ϽɓznUɑ=}}5}6o.o73rS뚩~hw/M7%I5jMVֹ:tfgS'SLG}%I+W,UtڻwF[AA< TDǗJ`,zZdeA!!.7B+W,@{Б#GλkgyƹݥwqQU?3 "dB撖JfZRine@~+jK%. 38WEyޯ/{ιgySezIJ Th@O .|q\6~~~/2QQ.Dώ\S<pumw܉ys?ЯtB<S0t5u C:7']`k888 V !7oιsԀ7cƌUVDEE1}t^ݟFa<?-^ŋȚ5ko/8qbISիGB!fuFXX)))h4}Y~>3u}4o|h G租wnn\&hTΉ'9u4[~('F@B:ubaDzz:ͣ}ݛuҮ]ROQ>S^СCiРE֟>}:ӧOɓرRSSyK͖-[S/4a|('+rP-[cccC.]xGӧI^gySXUČ{e͛"=l7>zg.n+VVVwfٝuD^qIJǟWxBҒ5_fscn5鮝#'EUңC!oo6o}{Xl׮]Ì&w!%ۻB6lɲou &ۗ}*Q~\Q4gO:Y ]OffmUںƎ ᵕÕh\] ++lml_ffZi{ѧ];xi.PP]?~BϡCQeh~a~cVUMJɷi&B!BqK!DͲ{׎{vBNB%WFBܗ$!5T!DX덳|PB{;8{FMsp{=oG*iӆ> e8::J# !iB!-v6!B!B!HC!B! v!B!"!B!BW$!B!BJgct"ijD·B!Ba&HUaaatMB|͚?X}޵C;vNtL VVVxzzV##B!"Lm?vƍ"#ᜏ;n:NGܱ#FX7c ڴiCڵy'BQjB!G0~\ /_8~ #GMÈa۶m<߿K-fҥXXXHc !Dѽ{w/^ (<#2w\^ylllڒCxx87ӳ}Itpww@+ZkܼyǏӨQ# 䐘ȕ+WַIII%6lK,ݝ@^u~=Xl^E3g?.7o%K|fff3=_K_ԱښDuvr1[ӡJjZ/S F6n܈?';vܜ\Μ9sBQCј!""K2p@nX޽T'Du?W 8#i !BTN6lH-8s gΜ)vի)))ggg;w$11H&O̎;`G^ }go'Ǐ/{* Qeggamm{GBB/8:: /j.Ukгbm8;;1l`3&^ `Ҥ)=III%n_|`nulˆafȫO,wԑwJPǏgҥԯ_GyX8~87odɒ%8::2m4i0!Bpss]{;x'pttӓ B͋}LڴiS`͡h033+q.p/4!D~K.e(ٱcN? 11QMwةB!D;rrrHMM%99cǎgѣGv;w&--5k֨CVz… ЬY3ڶmٳՇ2 1FߒCܷFɲeHLLD3g:w`>z…qFuHLL SN[njr!ĽϯG}7nHC !DƲb VXF???>vt҅pZnmٳgi4VZE~ذa:?l۶M/̲eС{+BWMɓ'qssggg6oެٳ(&NX <{{{x'YjU_˅.777 /ѣy'8<666߬ZL P>mԩS߿5sLi*sz}M^B!*&Bq4k )t$''\]][}u֭\ŢD111UEeMrr2j"߲^Eߍߋ/ҘD=u_^4=>ޓssDׯo24?'''nS۷ZX۳ #F wP>{Jʘv&UWXr%jV\YeU^e%ſ~a\^r%eSd}mhNiWbj?=wm y.W5wU^5Y^YMv}Y)dE1JeEm(]p5wԧUCYK*J UZ+]hwI;y.BܛnܸڵkYz5\pWWWh׮Yfann>''H'{< i!7tMZ {Bk.i!A3g&''pZj -0Q}) 琖&m!l,B!ZlIvv6o> 4}FB!*o4AQd7QIRB! .dРAt2m+\76GfcBQ9s BQ(#66m.\ SVS11/ellIIBQJĉ|DEEyXR_~=|ϟ7YŇ~o-kpܹj{"5B!hEcǎ%mҤ h՘Y.qqU!DŻ+9s0sL/_^mdž ̚5e˖ߴi3gd֬Y:ʴ4x2wlB!Dݣyә#G=BTr;ٴigf͚5暔_z,uYqE!!!r ׮]Seggsq)87|c!!!פ+B۶mxIJJb\tWڶmK 9p5x"aaa?zu}FF>233rI=!Lz{Yd͝Okp!JFQ`G<*Bq;֭[ǃ>ȤIP[oߞ={˱xxx'|BDDK.epa7oѣ1bZɓG֭P_?&&}1dzcݺuSO=śoIv Ez 0@oСC~m6mʦMx饗:t(Æ $AZ@@=z`ۗ;t҅ŋ ¸qj+& ]B'==q'E4k֔7;-' $BQ9sssFApppiժ>&88Nȑ#6lǏ'd% $$5k0p@J>>̞=n޼}%x(Bd_Sdkk-{iNGvv6s>EMVjɑǨ[.@W,>u&s3) {{~2ON(gHV.OCn9B3`Xb‚k2q;իW177$X???ƏOFFݻwg˖-%fzԟC. 0’u,--d]ff<`\€WřsȐ!;sGm7pQX/ l!JrB99l٢:z>zkcXb>3L9ZIڵ9g\pٙ./EՔ cBQxKNNk׮ח7own2$E|iWfVk`Nnn.111 .e% `ݺu5<(Ӄlٲ0}ƎKfLt:s=ŋMGEfdB&Ve[=8 sJ4Q/9??gquu]OSvmڷkKzz:7n:].o+Wo-/},oBQgO?DVV_ ..777:Dx衇ظq#';;yL)j4mڔv1k,>3z=3fյz9y$7.w:u;i`nn^ŋnݚ 1c l߾G燯/mڴh4&z}!@ z''B$$$`fff2Ѱ7ԩ[XX~ȷm ԫW^}= v(( |grBq=;7 t8;;ӫW/53_pssQFغu+tFÚ5kؿ?...8;;QħZ֭[g)WOOOz-|||xݻ7?ZsN,Yw}5L2CZ @#C!:t:_ѱTӡ=̟˶-2xfd Pq{;RԗFBQaճ(?̥Kp...1uT&۷jՊpbcch4{,۷o/g1 8p&VVVj`ͼ{ԩSĪUL,XɓILLYfez"99٤ԩSMڨҫCQWyo,\6d ,IOOgO[pttgnh!_37QիCi7 rj999xxS9-Z<^W?md }NN Eώ@ŋ ɗ2B!QL/bnN˼]Æ qVX]ٗI":ex_fϜVppp %%7h4ޟ1CЅY3+]NiX[Yack78a j;D;wsICTCa,lU+d#Ek۶=zCQx!(}v:8;;:ո'_r 4ɬV!0Y`姍Ǒɓ;Ҽys5j$ Q-MnCvR/fB}oo*IJ*(7cѢԯgcZ K(ĝ8KXaBT4t1W\YauB!*X<]!Czv77r Bzb4+ \.\BQ1$q^B![ۛ4o./B!* cB!}ŋHCTC{vdfVC/N[U{l#UNBTSe&VڵKA!5jD:u!!cCQ;r8رe>nwO.rzZo IDAT*s[njDXX! B\Ր jtw?++a U3"EyxBjJ!B KFh42/8XjW롖Y:BjJ !D u`{}N#+++BBB6l_&<<ooo B޽Q'N(dfڢ艊z8R]; ߄e@d< K}-`!$!5 ҵ={o''>?O˖-yG]69rzΝ;Ay( Bvv6z=(3 RRziiSdUM'eCώ\rt !D5U`뉌d4mT]ł UAAA3l0*.D%Y`ֿԯ_mmƶmay[{oq%ի78;;8 ={߿T/Myxx8W&--~1`9w )iQّ^^^j^gɒ%|GL2}Ǔ$YM!-- 6nT =n 4̄ƢӛɉBj\Pf͚ŲeLoڴ3g2k,unnnBTK.駟?>օ֟;w./"xzz2h ֬YڵkhsssF4ڵ+/͍u?z%:tN:ѣYhh!3\5kЧO~;wnegg- X a,X03^:iIʕNԭcmaEG+r(]ԟ/ !*EӇo?ssBBB۷/ZW^F]֖iܸ1rF.]jСC]v 3f 44TBPPÇ̬@`uL8$9R5JڿN+OΰaXd cee%'\{Xrr2/nӤNB-{www1X;Ջ!>I8eu.P+z0˾4r(% iYwp;~' "*T:nn @LL cȐ!&Ǻu姞z7|vD-X|!*ȥKx -x"YYYkN]׾}{^Jxxx7)&a֬YC`` ߿R¦rNa2$fpA9Bz=nRsϡ vgF{[!t:z$;j)kVE+Xgcͽs̵Kc $$D}8p vvv%nw!;ƁXv-SLAoLqWӪU+:v,| hPם;wN T߿^{1҈~m۶1KIqqqdeeᡖbooϥK qѣlܸ~ؤ8vPCûڳuY rG=Hzȭ^:!ai%!p'[oItbCiQÇgǎ\~PJ$1EzEJJ rVXy饗ckkK@@ƍcƍlذ)S`fff2֖FիWٿ?L022=?~/+ܸarֳÐB^uqPEAXj[K!@QLcc!?^֭cԨQ&P !W_}E~JLgnnΤIغu+6m"''ڷo_hVZqr^:ZjjŕѣG}>}Lڴi#'Y*L:jԨϲi&Μ9ßə3gشi~~~(B.]GDDbg߾䄹9혗?Aa!aĶ[WT~CK,S8}Zfc,sm.7RK{#OsI&M$*D5M … gϪN8o㱱A׳qFrrrCr3fF˖-=z4_5֭[/Mȑ#Ylz̙CΝ-D%ڶmZ⥗^bÆ IJJ⣏>BQǮ]0`<;w`l۶Sˋ&M BjihtDE5Qp5z0١(zEGI_YYi@*Yap //O =;2埧AĽjn[[[iU!kR~} ٳGIXN:888СC YI&amm#yfu7|&M[oŚ5kԤ%iӦѲeKpttȑ#|rD;}ښ fΜɮ]Xn{嫯bٲe4lhH>{1o޼#M"u,Yb2c~~I"Nꃍ5 9:tq6xC6z2]t c3fXI =;:4>No. "*T۷Y3ϐ.8p&VVV(tn7nƍ+lժU&˳fbܸqa2V%228pqqܜϟORRM4̬T/M6m"&&4d؜gȐ!lْP||| @`` /,^ϣ^zƍn? *Μ9ñcNJ\м /_.0;yDSjP&̆=-a, Js4@d`.)4mZ rs X =R QZz=Ҩe4(ݫKR\T`ӠA4hPd3ѱ %rWWW9QBTC1dXzu]v-ڵcĉݛ.u9 [[[ R `ggǗ_~ɳ>[hoo"q[{ϐ ~J#!=r*=;So+P..MaZ>X4HC2;`hmT$ɼ`B!ӧiٲe*+W`„ DFFʫ:h4:s *׃e::iٳ2tYƐPJseQ{v \gZ D)>#o9Z JB!#2___LS}ܼy:-ZPgU ciY.`%ZʛBn!abU(m '\#p6\B3سCKB!(uAQ>u9k׮G|| (gڳCf3L !L~gϟOPP]v-4oGxx8m۶eo:uHIIq矫e/^`͚5L;uif5AFSVneXZڳ=99Ea,Uw\ PrAR|FZ0ijD·Bo|rΝ;Wߢ={u뒒@TT谲_gϞ=]~VwAs!H"?ءMfPa,PeCY<#zXYiHδ!J!XDe)s[njDXX! BT(9BBB52)ٻwoVEAiѢ&L(2M=6$$ԬMCC1YgGNg5zK6T% 2cIi!J!XDeOe!Bܑ~zg}ݻk.WY^^^V,j5;ģa,F6(eU7E}DQSY!w[L4CS7A>#d, v_HNӦbԪU ie!*֭[پ};oߞѣGcaa޽{߸tvvvՋt=ʑ#GHKKcԩw W&--~1`K*BT¦mٲ%~~~l޼Yl˖-+l?jCCs-:(j $81߳#oC3;ڑJNvRW\иF>(3BRa,̚5ɦM9s&f͒-XÇL6mXhj_]F-077gԨQ 8p _~eE=t:u cG͢EJ].\:0$5$s~|uYl,rk@mt:0CASB@5/M!;ֵqw7ɝE|F7쾈H)0>}7cnn]HH}~3{Eptte˖hXKFF u333~:j=!PLɓر#:t >>''֭[3qDϟ_Ν˲e8p]//xOΰaXd ceeUbr͝;FÄ 0aBϕ+WV78eP T=Kޤi1l(e ?}\gߓ x! \4r/iYs]Q(B֭`֭İo߾УGfϞM߾}ر# bʢK.& 2qICbԯ_u999kkkj׮]hׯ_3!TTyqǫ?Lzz 8՜ VHδFw]IP@HHg͚5 8;;qg6=f̙3{{{[z쉯/{ɓ;vLΐXl\|uk.BBBL'44.]ĺuĐIޞK.Wl=s^=zУGSN{nbcc+x[n v԰l =;nc18cp>42c 7x{f!D^gcɫys E5 v >)SpuBCCY|9iii&uعs'N"99\=0{ly&;r(˗qfffٳgMҨQ#Z-cǎxo185% !*ߘ1cXz5{C5}t:ÝVMm8ŘT=D`vc$oΎRa,zޅE~Fi Ҡޜ{_1V;cdddн{wlbRg\rP^=lmm33dy|||#D1rss1b?<Ӈm퍷7ݛCҰajuMKHH^ ~U.|;v,vKNfM?Aiޡ+zV',™R*0>(Du\۳#/- ,2]p:Wn:FU`Zϳex;v,͚5w>|8=/^dŊrv(͛7ILLVyyyQvm.\P6ZBqƍjwxzz:}4iӦr!D^gƍ3f͍-[Q.\3++ׯ ׹~myK:^#Gl2̙3Ν;Ur!D;JgEKMM^MMr;Aq1ؑ?ujp@W qaU07S!DIy{V2]a~vjiݺue[иqcrrrxٿ?;wdɒ%͛iCTT'NTy;::p54hP`ڴiB{Bl߳cTd?i(Q۷Y3Ϙ|`&OLbb"͚5L-իMԩS:u!!ѩS'Μ9CLL xzzRV-HHHH ׫V2Y~WxW|w`H>i&bbbHKKʅKQBBB1bD?FïZiӨQJG$٘C^XnX*ٌgS>p;gGc1 __ oݺW-07%-[ QV7BCVd3\Q9欬dtڵƵO١ƒ?Yi`i( BKv䛃#xa,p990撞][JB!=XA7oe23 =<xj*XZӰὓг3ԪQ۠4a,Je.H^= YYP*:柍ErvQ2uK! JZ=Y\ IDATyr|ZO;BqG6l#cǎ4k֌-ZЩS'Ξ=[Ӽys7o^ӳi3lk8ŘT3l HXn=Sϖ83f]y? vxzjS:)){6>rvN,Oqbv֭u2QޛWQ_ܛ #KDPԪֺ/hZJ~ |DETkEQ* ,@H$l$w̝=s&7&ɝsgsߓ99u Pqa/@*zHk}˱Le={3tN7_iX0aZ+a͚5t>B0/ ]w`O ߏc_LXCѬ2: 91bѠ@HSd>ѱc*3lQ t Pɳ|={8>/JJ8rs)߃H.Qqϲ̩夌BNiU8v ,$3AdFi: ''Dgkkt\}zy(cb5( C.qhk zu9 >+;nx퓳N}mH#̽ :; h2+V@:uybGff9o;} Зs쳩X-vxfjǧFe>4W0xRDGۦXʼnƬ'x?7Oɖ+P_u0p %  b+|7M7nm/ȑ#oc IIIXj injŠ4e;4QGRԠy;U쐘ҧlhoᕂ*h3xڵ04X{8$;˖-Vs0ӧOǛo^^^:\r }x 6 h .N; ݺuc կW]um;<6mڄ ^u=W^/.°IJJjU?$l-0 Ea6+gv胣<;0sFwG-DĎŋcʕ`FSjOT,H?7~ h.ӦM_رcqmy[oַ~ o: Fe˖sTmf|EhS7JfQLFX[V=5f4\~?LD;;}ѣ믿'N?K/cƌіJn #Fދkbԩ׿xQXX+}ݧ/ȑ#q}aȐ!fߎQFaΜ90`}]p k0c =ZK`\عs'F.>(F{՜t*]! þ}{n|@@|w8K,*..2>zҭ[ze%M{< `'v~ohH3A5 ώtcz }fyr(T;v2)ue@ D!93".bG0̙31c lٲ۶mE]ٳgs@ n> ;q>ݻѷo_}aٓO>aÆGƍꫯj6l؀͛7cXt)xCH~~>n݊ӟé[uuu7qs\wu9r$矣դݒAA4ɓ'k^O}q饗 ]|9x wڅT0ưqFL2tvŖʍzjGRΐ͐VݦĎ22 J%pQƤ1n,N8uczfwcqP¸|U H!hp%c9bCѤ2 ZQXX;vڜ9si&{mݦwiϜUVaxꩧi&:7pv]ر# .@uu5˵3gDzz:CCCnV@JJ Ǝkڮ6l?IR8ޜEW ~'x?ßgןq ,] +V`޽7oMf4ӿt֭u=z0-m>T26L„S]mJ>ihܺigeR>Fbю@zJ-  1,S;3%yevN2(%%6ZQQ׋ݻ @R__ti7'ӦMCii)M]"##0դ $ʣ8qB{K.)))HKKCJJz׋^zd6D7AADҰ>,,X'x=~l-^86:t*rbژ!>1 an7 i\gvt[=; QCĭ[Q^l x邚t25#ȠhYZ$w(++^+..֖梦;wj?aʕXf yq8#%IyBnn.JJJZ "T嗢u[nsٷ .ĤIz5s3gƽ{䁿1yV"D'ٻW+&Y0w`1w[ϊ,c`.zVw<0G8lI '^OAXl0C#12;؋8|\9=8㑝\L8wu=S Y5 .x߲m6K';&LZHUUL&pYA{]gXzr7cرiMM ~?jkk9Gqq1ws-C2ޜo#z?c,|ܫ3;~ND'Npx[g [ڔJd"AkW # $e,^fN-dPJAX`wn~’%K7 ++ ={Daa$_jkkɓ'c֬Y`!##}ŽދѣGc2e ~_Eow>Caܸq1%K=z!Cm۶ *_! !GԪYƍ] {ꩧlfŽ;̘&bG D阹 lV`vcfibGzJ-qni=oIne$vճ#jfG!"NDhg|֭(//c⯑>@B޽5{?*++q'޿e_9c)2/55 ;555^~eӧ>s;v @>}bVC9w7( h r 7?z믿GRR&Ms=oqg޽;~شi~nDii}"ٹ\sMLLߍE/|Dzmm'WY1{v $FH<;lEd̴q 87BU~`*ѶeEb21Vsa;zt< (+fATpQ+sN :EEEx'Q3E*̌>PVA &Nx]_~aʔ)a|`aݺuXn >O@[TLm'֮vcܸ>C5EF!5tc\.ASRC+ZX%@OK@0* JV(v1h |X~=N:$,ZSN3?  ʨQz;#ӧ }1k,@rrrDN,[ n &M/^Ygze{ȘY}==H3;T6Oǧ܎pnHKbR~$gG~F!`(cщ^c ν`P"Z^6l^x:11wc 0zDEмlhHLa*[1>i=jوT(? YpӍŌq&!2; K.ǎúu~z;wƔ)S\FJϞ=] uuuRhn78zynX4=;mSD;C_^_2Y3T`fvUn,Æ0)g5ԝ:IHbEEP&;a2; -sŽދ bŘ?1x`tv?zƣ>jX6w\0b5c7%)y뾙7gl(e,ܱlEL5iDxX̞1x$ Dh: "v5 JEȳ 4+gvYFA ?dt;wD޽#zP\\;_ /DNN,Xn };. zCjb^0 "A,(gv.q2gsYKD7| ڒءtx.bSpXdgIi0dDŎ &Ш"Ab ưzjh!>c?}A^^y䑰?fh:|[1B:N;4$fܸq(((!Cf5`Q^HKԨ~,wcA sf&vHA$a.W ל:0Ma7˦=bYp Z9'S ;hxA^{ >(VZ[n@,1d̛7'OF]moѢE5kxbWҖa5kV#sphM5(UI!or\vY^0tmAb'Q%<;D \hPj;@e,D;EoPj5A{mnERq,^AD_Xlv # .ӧOnj3p5׸^yy9:v숌 ˲`0s!$< }2-[nݺ #=A\p  ;`Ŋ(++_#G̙31qDz뭸 b/FAAZIЫZ^$'[wd(r=;evEXԎGb\3? 2Ktch= ;v,v4$GŠ.s = ADYXx1***0n8TWWGŹ瞋1Nog|9٣j*`ܸqǓ's:tP=z4rrrOA999(++~c~m\y啎ӧ}OC !CZ2%c#Za]0cfGSX-,0Afn@Pw<;H00{vHs 5kr2Pر@?|-[3ڵk1~x>۷oc ÇGRRѣDii)RRRн{Ўzx嗵_"33/2;YW ]vEjj*< 8q߿?rssM6[SNfUnFnغu+gq7vBii)233q)h H6A),{wc ֲP Nֳ6FX[Ϫ(02*c!ڳ!X캱^}[ZEs't>;zx<ؿpƍqWK.qꩧGaa!ϟ7xz*^}UW //vk|l?Fii)RSS1ydr)Xnz>(̙@I}:u*<u놂ʼn:u*nFxɓ'cѭ[7lݺ=n!2j|71b:=zOADo>m݆e˖1o?fLۍE%"[}gvh,pcGKQ2S*1̎P;4'a792IBeaNDbE2RV!Dsc dY駟nY 1sL̘1[lmpEa'İa#`ƍꪫpqZJ{m>}:z衽~zlڴ _}>cO>֭CAA`PB9nj75C@쐤֝ʪ vXn JCuڇh}m JMO*c!#q}&FX<{s!f.v$(v4;Aw IDAT^|j^a,bǎXfڜ9sp'4lK:'RRRpc… QWW7xa믿]twy8GK.Oc˖-}3fL<_=:v P]]r|>ɁǼy_ BNh6-#l Z WƄ p} ϛ7/1E.v|lXW!IA44naG/jHXp2" {"ymXK0ڱz$j=KƌaPE_1"g;z f殝g D^z)̙ ***z >afyyy1|p:t|z聉'2ޫW/TTT`߾}$ O=aرc^ 텮]j?N82ݻ7} x'sꫯED? :uqys_|/݋׿5fΜij vڅ]vVg wgG xvX J?K?`8R2lSfD;D?'7:8mˮ:-&vtgqFz@ 2dgge>e ĉꫯb馛4]vrss!2-ZDKW1ydL<> ,u])Sh"ђ zqw[^1cg4b>ZH2;RR@ z1,c?CdPl V2Oz2[5f2UUz6@^]Y= /Iqh=jl2;&]cA ȑ#cs`0<?^?m۶&gSr-xgyfaW^yE3O}wk.L:4i6N/A[61ܹ#GBeD0%ɧk$֡@hb*r.d8ѳm6q Bo>1%K`ƌB0D~ 7?w~ॗ^¨Qvڈ>K/Ejj*."tͲ+瞋$o&,]7t_~x ]`,X`x-???8qe!==;wFYY^zvժh݂A7zACagߢKzTs 5IIzvTV ?z#AEİ QFcb.c1tc -5fgM0ecHCe,6b]m8R~6ln݊r0,sv~mk'N@UUnf{ƎEEE1j >jjjPZZ={jfma>Jjji<9>|{C߾}5 "1Yr%.RqٳaҥKO?utQJ ++{aϞ0bǑ#9@/g^ue{Fx0zvt0]$$ijhP*8vbcL>v3xC.\P3;Qܶ,7fAgHP$Z@h*z6?3k6l;! jtHh"IPbϹ|;g9eey0xHhb]fS]ևCb2yv_ˁGjjy睧A2@?e@p q/w0*D}}|A$8U$Ғe,GR3rvXeqmIq2"6(<6ؿCz61R g^Dv,v 浓yh[u(pKC@Dk_h.syAĒ<޽J]͛1n8/~ ,Z0gq[KWg'yv86NuC鲨z$=;3'.3r:>1:z<캱HucIR1=gvYFA 'O=7ZQ[WVV֮]+"rA?~\L?7e,j`]W^/GJJ- ynA +vn,`*N4='"=>@3$8 \g\#T"N]3DDZRfcrVnMB =WH1zqcѢE#TUUmN:>S@VVVJgbۧ5f;;w>':T1&'v2s4H՗a-c1_4KK9:@LlPj!黱$b Ɣ` W 0sɳCbz&+c!Z h/2Ř7Ԅ &ॗ^~ /QF=zp;';RS$ jYIq eY)O/v3;DѠ793Xз5wcI2&HXȞrݞkR-4e|*ca[R7  άYb hs=Xz5*g ιfLz%N(2TZϊ 64a u2w1VR@m"CyU~=;~ C;jY^vfX5lJ؜0Pf!AdNzA[on|0|p$''cÆ q 8pFR\nTl8ݚO&6f vGh;bcڥG @(a ]prVn'3; aw)jdYqwnO<O7|AAQv܉O?{F~pgয়~Җgggرc8x rss95H4@W_=;SZ !ˊa}>ٌ>Sv`8)q|B~̎HXD%2,Q\b~t^%j,XT##b JU gm<;tvѿ2;쨮e];v`ƌ8ӰgL8 .t^^^j:AyZII kK.uSN9񾡪 ,1cSoSc0@BXA)k4쓤18ekح v[sЬc X Xi 8҅kIPb)NBbbǽދRgϞyyy(--~|ؾ};c>|8~EEtA#''1}4AAD_. ey1og}:`3gČ3On̞=7n3Io둟]& dԨQBþ}ЧO~xm[&#b v8q رc֬Y6g|(--D7p A̙cwWbsܹs.v ie,rVKgqWJk`1P<;IyԷ5 eL Ę<2zG}b2 b޳ÜaΘ #z&wcٳv x^gFNNۑEg  bw-|}ҥ+s;v,N>d0Э[7̜9-jv؝!2"i|7ɳCʹ1+*b q[;͈3;cS1w](@{s+c-YMY&,JD`"bǠA0p@@`V\\-k騫Ӗx`,[նzr >(VZ^{ }pI'\p6 O?ًq|I8k8=X`bԈ#)n+PD뜙[2;`Y1Hֳ2=l(]XDXXDs{m%Hh2ӦM[oE!##zBnݰzj5 1,Y| гgOW_r~^^> 77~:E K,ڵk mSRRGv<(++ßgL4 f\Gy-܂ovC СCAf3ٍ%AXiɸVυShCAHմό<;qt,ي4=AEg aC__q+~Ԡo߾HK ] [1 [N޽{Q\\,t>|˖-tV "{|6"w-[ /lgm>ƺlXdm_ @:^X*Zr:̏&8vxFAH4H:ժgvl(7L{uy [ϲg-e,̾ED *zh{N{^ 4AAĈ˗_~?pV\z9sgc )))2d:N:aZgyvvB~~!PÿX:}tm ޠ{k׌of]wcQRܭ&q?n2;؝~n93gvY$|(OuGBrPjCQ:1(0CԍE4@hq  ܹsaÆ3<$TH I\2;N:8DauK4g3;l Js9TBAADK#.kx'O7@RR>Cqm8̤x8EGOz=}TĄPfP8> ƳCo$h'<ëZ:g6>E$2;Ey'Nbǁ}ѳfo1 8 ZfdkbSfGX  (q饗FoѣGx衇"kpWks=xqg`fq|aaֲ^tSRPg$,xK&vcq;h~7hpe-L$Ai%^b߇IĎ.MJ8!*hXԎGrAbAAM$)) cƌQ\gk[ڮ3p@[/58ءwӍw/~r3;Є2n;t^/V0s1iC|,GE f$v5Wbs_b[fgj|PfAbAA`tUVVbј7oz79 sߍE-c70X׭gCNleyQ"赞`hn2;< -Q0ıXdٱ'R2;<;; hw|wͺ))חiI A)sYz^ 1fv -6$EE Cf 7sz6$v82SQUVT V0 !;18тbǚ5khZW  Eۛ&v"}լ1A-! ء~ؚZђvBoEnI2Hg.= *B]u!P_bNs;&L@g  O˳pD1+)܇E]nnY(ŏ١We!/H,E JY,Q J9t~ v|58v,uɚ5ת{cY}x\_s(\ֳ &<,&PfG4ٰJ,ZoT"P AAqGnuɶJKKq!hwc͸2Iw&<;gz0n3;4Ra{YSޠ4ّbG%:,1PT~܇@YY ^pn1( zV2y AAMO>E]nݺ a֭b$''#991pєf^\ا}R`M(cq!nPڝP,X;pӺ̎P7h~ n,238jj$XJJȳvXDs߮$E~憝){ɠ4dC$vAw.BoI& ׹nGܧ-\* IDATp_ G&E(;#TpaP5";2XN `Pj2I4Ջ"ZG"zv腠ffv{3Y^{W8,^.6=)"e,[ dvsj  Z/ӌ,:bȐ'w!>[]Yѣ#5j}sڥKֳD+C~|yvXX"4ؕ`b'x (.vcG3$g&ea2;De,p.c̎M9AjbG<"  "B:ߣyCAxwHEURq>W "Ͳy>QՠTahQ+D쐚}4夙+8 sQ4fPu.Lf){CpHg%uEk2  NPfv>HcmG!Y\(4Z*C;e,j'u=Ai"=u6@XmFcz _SDELJݻ9F0n4HRZ0x(k7@\B;Dٲ'AAjB :7ĒF0}~ֳ!>bzּ>8[-C7]PgۍQRKyγC2~=wcYZƁ &YĎKAY?4kAsjPvWDB~$= Au9h/ TBADUUUEKaM>qSƢbBj7ּ7;]e8e,0 3#eYm-0|Wم`%S2;떵ŵg]f㶢h.I̎;Je];m7e[$vA.Evvcb2Oώ.#^YzR`!Bj0?uc d=ն-DА١gvxgۋESa^Sx {=@;PXdk<4B J)#2BqgG ݌)AA$MyQv;4}1R4Kp١1.@7Ϣ[9̞'fώk=LE4b4QWUII>x<[Czve,8wcqcPj_k#b_AAm-ѥrnSvc =Q#\F̠T9ø+D sftYwBO.$cq|_?Ѭ0bq 0a9Rq*O]OT_0gJȐe]&-YS))2ϵ̃MdnX!zel/HbAADĎ(uce|6)e,>/=J7m5nޠ(C4FfL8ytc7:3zR93;e,6C;V멧={$Ŏ`k9W xRu+gA)"h=(4Zaw~dqV9dɩ1u+su $vAn|7vx'pR-_jpfL*6R-cb؝KeEn+vD%hyv0n,$lYƛ]y X ;I9wZ`PG{;$ӵIazzA)s0D`^kjAA vڅEO fe,Nzz7(V7"$&F;(bX.#Xyv;TS> ~ey<"akՠsmvc3(%XXu Jyv^캪h]Aѽ^em/ά'; h 4 rN: <;`[Ⱥ8ev"xvJF-cIdH:A~z53;Cw%$t2uLD e,vvdvB$Dٞ#2xĎdXkAA$JR >pe,jh A~H JEQ>qۍE(Deh*6(UE`2>ujYRr嵆@Vҹ̙$C̎@ Y(v(;׍&I2vcmX"4(Sz4l;DQ[k5v5(  "n7} )nzں JCŒUؠ42¼^Kvc1LoqkP>~sq7O>  ](+*:1CIR"{/ $v[wcїDjPjAb/~/}ٕuҮs\]I  %,e,yv֌[PM718nnJU!71ڵU=;d9<;d2…X""˜X+7AAѢ$%%9.g9@\eu2D~ivoPj_ƒ^nQ;."A]3"X ucN \ii9cz,v%.\3F2;S;Q7%]ƅo_ƢzC3=;D2;  Zy4!AAEǠ|c2ՠ4ֳcd[φ|JA9fώn=+E/xP I"eؘ[*”,;$)`(v3;Hbqc u΋3; /6K{Y驕$vAAč(wcq*cizYnGaLb mK!I⧹N70Ao=`k\(jcz`zQ2\ v2%(=`.qYkY&Cl+\)c,c$evI(:0  xճ#T0wn,otc 3$EEرzYSe,D4OeS7fX0]l  ep1ԬÇs)(RQUVɆQ2;\pvY6S??A8`? s Xg9d ^$vAAطouMk@X!L0v"`q #-c1{v pOpEbyY'"D%p kĄݘ K0m ٳDzgbuq{ ;DZZ5rr@ xvn,;+_DԤz:Qy]‚Rq%{wr yvAAI':0n*jf J2;BO .c&嶦zp-*2(UbKLt0z{HCe, ] F}]gt3$-j'$EQhHgvym~N"".a/Bc%Øuc̊2̥Vّ  :tp8!Av;TƠ4\PfmJxX\z2n,Q+ca2㔈e,n,Q@;gk_- S GbڍE$vx~x~KG:4dA2kz6 g;vc1!VɂLų5vd!  ^֍E0OeiĠmޠM숍A!3Ys"vcQ<;d۠ibG(h3|PpPŎ@x|x De,s qfmY͆k;nX0lw^Db"HAAÛh0}P0z%{.lP#IhRYs}Q&ZٙZ. DZ Ԁ-b~)֭[hCwe>ءdvo 2D;y&gvص& J2;H``z0xvײ-`_'sD   z i{ne,>kF}QQ~aW"S7/ˊYѷKjOBR}5u޳-b7nΝ;"vXsK _0e\X<cK' RbXc~"xv(++sm8ѦsOLc$v8]M bƀU@jq e,AA-Byy9=jg#޽;bvDGuuFsY[Ƙq Db@]]0( FطmX޿ͱuTWWG/ҟ:R…[3;T0h;2;~x<>QG֊Z`(2\ @b ώ⸎kQQQTY,vHgzE`LSfC evAA,vQ>vXD$vDӳc…X[}~KdvA}|0nzvɠ>@UvSc'/~A>SH >{ٴiSTXώ3;v؁ ŎзB$vp8a/SDE}毼TT<`gr[:cŊx~=xڮSlͼl58RԴ)-i#e͸+:>olCYRR JMe,Vj ZJb/yvAAz uFQH߱"2ιH,IiGE=VkPAZE OmX$yvD3k X}U1<;kgAŘ,;O١~25b(cI`\3;ȳLE0ev$2/} hMZ X|9FѣGcf4=;wtcQ\^u[F8RQ ֳC$D $Ƣ_\Ƣev"*/j^@ 2gv]8<.DU@btcxv HpNJR0>"vO,jfe%CrH  U ^{~פh3;zv,ePM=qvcd }ou jL+6zSҐa%CWҒAdh8e*@6>d_ƢAPߧzIbږ@PƢtgr+뗇'e,ء"ƿa2IR:ilvv)g2  μy BGݑf(K曱x&m?\ASĎhfv(e,\ vhv2;xvSם]⦌%^XA8CPf,c16}[BسCx&PpYDpn=붌MY^\mѩp;$*ҬZoA`j`Jؿ2; ;w}7&MUV ۷cǎ3ݻ i_ÇKÑ#%kTV!\@44(ǘD'NA0X>L u]ǎU.8q< :ѣdg}8z\|qGWcǎ8r$#Gl `l-88th?߈GN8qk|(,Ɣ),XW'vG)P9s 3k[س')S9P]ѣ z77$ai2)_KQUpfp^ ; r\|qg[!AF 8v;tErrL˺րSw&۶5`Ҥhh8 ǏWߏ|9;@a]o0kVGHoƀ8zaʔ|44Ȩډ`/Ax{H #CBJk1p`1*+wA7kj<=](=ϝ30 LϓN ))V=[Q=qRWZr$;$$}&##)esGX(_"+):Ŋdf^'=P-5reofά_8{8Xs;kED\}i(c1CO}Z `<36l3g$%%%1cvy+VWal`>lѹʝ0 DRYRSo+?aT NfYDEl6J,ƅ W *Uꑖv׭4n\}ڵrh>ρDZl8\ssr Z)lǁڹJؿ88uCm_x{7ԩ.K%x*V,#*lj;wzARJq႕ҥ/R?qqװ٬ybв}9w~x{_jYs]f;aWNcFϰfJ$&%--\x'f׷(_0>AZ_U%! Mm?霼cz6[ֽaèq-ҁdI<<~VZDEX{؏[~ >$nrj23p󘔆 hѣlbx{']K@2a" "IIgIK˸ c{n?p Rb1:|׹&9u?GmױFYXRLq7$sB)NvsFR?_=%,zx èIٲ~. lVkd߾Lz2e ZRovڑB^طoˋsҡCmۆ?'N(PǨ`1ʕ+ٽ{79O?ǏsNj<i&ϟ,44Jhh(3f`ҥ+WN b,YBXXGaݺu<# <3gΰvZ *֭[ٴi΅|DEE`'ŋyw (( @͚5 1*!"""ظq#1۷'((cǚ74TTɬߦM3!u 2i+xҥ OVݻ ֭[$G`Æ j8r)~m @bXlǏ 00u v<l6#F0ߧкukm@ڵZj9x'iР7vZ~uJ*kd54i:,, 0X,|fOUu/;:u*`b+W~`BBB8|0f}#GcTCDDD4e>slb0G¢Eyf5 3gSܼTX1ײ57oztFXX̙H"=zTBBCC裏[Vo9RhYIMM5s2iӆG`֩R uU(ϼy8t[#99pIʗ/nA/;{,={4x{{N%PYL2j<sNx FFF;wvXdIfs֖zv<@,Xiӈ0s2TV 722R78.f֬Y}ڵko;v4'$$Zzj@g.\2p ݻͲy`SX1޻qnѕ@zzz9F;DDDD?{ffbŊcͺ7nO5oߞH1bo1t)**J\\rTlѢEKB9z5j{0#((LTzIss v<n۶~={޵i޼9WօA <;DDDD֫W/=JÆ ew3f82d۶moi=z0غu+cٲeL8l6f]OOOsrʹy3tPڵkGxx8}}6m]33fо}{~m]@SCDDDDx5kdԨQN˾|8ԩSiѢ}q,?fͺcqI򗿘lBtt4:u7$!!ŋ塡\|%ϗN޽yW}ݸq#O==0`gĉL>])U>6mhѢq4k?:LBVrѣ]t 33%ϓ'N0g͛w_Ν;sRJٳxWtaKڷoo} ?a0|\uBBB0 +F2e̲'OҤI<<G"gN:,]]m[.:tڵk3zhfΜs$33eҴiSG0G2t-[/.]r*ݻ7IIIlٲ O?ժUɓPtiRRRؼy3*T0׫W,<p=khh~J^k@SaÆ1ydIOOtҴlْ(1bO<^ٲe9}o%%%_|G///Ҙ1c4TZ@<#G#/^lڷo9zy~ >O?Ԭ_D kv0ZL4cǒfnO>a~]mD*W̉'Z*J2a[wn/)ԳCDDDD$e:X|__s=+ڴiÒ%K[.WbaѢEDFFč7(\0c͔/_sq㉊2߿ׯd 84O>$4n+VТE ׿>})oJ^?mqO0$'ٜ:u^z x\9 t8>aʕ9r|ߥK&OtW^eӦMl6{ϐc̄6իW3r\bFA\\\{n|||\q|ιs^#Nl|b ]D.^ɬ_Sb<ݻz„ 捦)ZiqIOoܸA߾}4iֱDDD~뭷PB7/9oK*o_mpXgee8MڧOT… !+>>>L>fr |fwww|}}eʕf=/oYpp0nnnr&vuͤ;v4hSCIp?ci< NCοGŢF)x"""""TIIIXV~G6o s.܉m۶_>WyϞ= #++ 6 f;w.,X ؟l9zh=?<<<*Tp*޽;7WT :nnn.]|o߾Ms 7n̡Cl6m6qs֭[<{ 3 Zٳw<|~ B }?ގS]@"EhҤI \^6mQCDDDDZx[n;wʕ+>#GO @…ͼ{~l6 cp;v +\Bǎ޽;lnV^mNNNv9޽{INN&99izŲeصkGmׯ˗gܸq//_fƌ dggeSN0uԹ됕jdժU (^k֬s޽=#x5e222Xv^rtAGDDDDDSN@&M0{MmK;v9˖-[ӧVim۶1i$/^̘1clN|,Z{;w:saƍNe9mذ! ,ȵ~ѭ[7f3YVZe:"##xY:u2goϳ>kߵkl۶7I:z- ày}:=zS[;^7n50 jժڵk $##;g}nnnN", ?+qqq*`b`RSSX,N|r~ŋ&66uΝ;iԨS&;;lٲ{5k@!J9w׮]ddddY}ؒb͍8իTwժUs%bbbidff3|=##)amJJ 6C2rH>FEB $xa[^k"دy.qesg=Ƹ9~?֭[C=tss/~zʔ)kٓ${3j(?ΰahҤ aaaԭ[(qi۶-`&uƌsNZhAppo&>>>N={ƍiܸ#Ec&00.]pjuꡐ@.]HNN&<<ʰaèPG&66^{+WJM ػw/5b0rH/%&&BBBXfˉ"00Щǽpww';;j׮m.`͚5Ԯ]ۜo˗gĉf}Kvvv!ǎ3R_~%[n%88Aѻwo&L@  rʄ;Uw}ǡCY&/BAի8;DD;DDYYYL9{rir &{7@D^w-:^GD8AD$&1z#<88T@zH b]я8ɤ奨#I&UXO, D-&"1#G"1*DĈ31H "v+T`ī2B*Wh**ibFL?ޏLSV)srʲk%};ttR&+ϜxdX&Cܳ1F.V pr>οr ӏ1*$DN-ZhN枓&s"஫PB!g6!^ߐᥜeF41%-_ _f)#qLHӖ_ܷ#Pҕ윪jXޡC;/O":~"18I*4D"ؽ]{ أr@gg>R77W]|+--sws8mT*723MF@qA?q9@8IjRRUei0,D^9!qEE*UH Bjjnߎچ޿/jbQэ+#NKv۶5XnoѶ,%7nNKKP5DaUFW;YgA|k *;=08whtH[!XП!KKv]TUU83Uhˢqg,))=uG1AHIM񼷗gDxy!,յk)-Z/q1!-=#/Yh.<-=CRѵ)9y-XOѦg(3CZK$;yZnn7njQzRHRw77vm |llu'h?3:; ک+yER=X JJJ+*|}}\\ ߞq>>ѽ{`qIIIIc'3n$--#=C9dAHMːɤeei陼NצM+"ҿձC;Tzx\FR$8edfUW(77?8)@V/juz24E :%>!B[,HKTթiqF*P|B WbNL*A++TYeH$4 ŶQ*H*tww1#NJZvws>tc,ќ ehHK}.##Ϟr6mZ[C4#CFAPlV2O2٭[4oH$!-R '45SI FDf?Ƙˡ pvu\"RY_u\q`#,n;ҕG뭯=*neRiэb"*)-  +$((1@Deed71V\RBD^nD$b3HuHv:T*D"QC|2s~!c7_# A -K$4FRBdVqӉ4j5e|c ennIE7n2'bj>@]Q""u6b⮪vuu&"D8otF2')*T 2`D?B6j2XD}ȠUC ALn4h35e!j`רbwxyYc ȉHp# Jssz{{1v3TZj5cwb((0@&yy{UWgFF7|;wmXk)D"81(O8XRZ';Qդ7[uuu`3f5mA||b-:DX™Y22j''V-(5-*#C*bdm!"S^ϜrU㦡v$'*w*Q(rBT")..տtuuޭ7K8˝##;xBNdr'k7 [-L[ue%$$nDV;d[nVʽ<-NoD4v8)$岝/ιލ8*|GSUUUZ$sɤ6eTj''a¡ ¸VQ(k4U p@ӕܚHՖZ%nZ<;!D4샪dgXya֬ 4\.vdd2t;cL&ʤuDIMX,6, H, _\vWkIѽ3 EE;[. /qk0#a׮.?lq9|VpTpWt Zzo=@ 4 b3h #ҏ6`#D P"c+O@S  /n# 9ࠬUܸ8|MzaXib]K\c~]  Dfh81 x=UD$&Fktː{1tD3 ƾF6RTT'wf|ggBanֲe^8h}رgg{zzǰe/;BZٳ\w ^`W_ؽLeQPPеkgy:TfUWUHJeHN۾mcFrn/_΢wKJj}G|Sq-rGM1F}Q' /ru:]BUFn-}2(--Oɜ =1F$%%Z4''W*xyyY1G}󫉉""[=^VV>bPk;;JU]]IDU%%%D|^^/9rG[XXP(^Mj"888>#biwmzJCGzc+?x`Gwџ9sZO~[cz$_~UZz毿}WWCCCzyvÖm~yx`WWgjN9;j8}tmџh9K5;qҔY4qF\P>O<5B&ki7fq<'&ڎq;qww7"ٳG=իAΝ^6r֮ܰ[.<ۺ]:OE- 0ױU#ˇ{d/;cF2oD<#{~},]VVVvxώqz}}| |} pb yKJ*.)pw',8{'e3 N:qTB~b~O}xyynܴקUлRJQ*|\p[ w++++H3:roQ!!-##;Y4ͺ_dG"սE7gϋݫEpMgw}*+Uw.rf8z=7786h bP3F5>>peuUUC3fيvO={3rhdOg‚c/;q[N"DEuW(DԧOJ2UC?aCCg1gp1^1st7;&']qT*UvN~XsR! }uFNᎤg}"%Jp>{9 > h&j1 BhFDIN?,#tk@!sC_{ix{ {8!$Pw:6bT4Bn #8p`3eee=ߗ] ɝ;oߵ{ozzeHH޽F:|P"z9rhA k,zwٱlSMm;//OU/N+Y<;v-St+**Ms0_ee-?~iCh牨DєJ///"R*JW69DjjZNNkDDXoAA!Fn|,>>!88P­{<ˢ"fgGnvE B'yyyv"p'2XA<_UYeآoWi雿]E|y N9ҲEzzǦMXO>#F>ʫti26g>괗\!"wwVoRSӈŐ~ǝOLtEEE~~Rpb>1 AAĔԴ)&>GDPۡrܚZm7rhww't8U V zpРSOgo^#ʹ^1AD1&7C=gk@QQQZz~GlYoν4xRbzii*DVʪym;cFc1?; k49{[H&Y5utdG5JFΪ׭ߠ@DV*tLD~~I["y2KߤǭJeVJj*I$N g@򕕕D$B\ iq͚uDh֭gn|FNQݻEo/{o޴{/OXb߷3g^lBeKQQQm# uMz?4 V#8ё#>:_mF}hzoҹӏ?|;ǎj#G "{aKr5//o{~ʷ^;f@AaAppm?2&^l Ӧo?|r쑣s5NkPl=Ʃm۰N_ty.Ic5Lh1484rfADVn9caWUUJ$HT[EEE%!-CDp#m'klɩU:yyyyyyq\`UPi]cX, kpdv<FHkUU5Z&)ZyyV/IcdM )O%F4CYYDK,Icdwk>&  :Kk=|UĤf8G?cN\aܢ0*&?n֦urf=,@ !I1@rpÈ9"\w@},Yz3Mt/^T՝:urqq!*"RTEEE-Z "糲8f")))33ãSNHܸq#33S&QZZZjjoKװŋZ 1=켼<Fc髫m OHH(..d2 {^n:hs>4w֔2ܾhBC ≖-5 1V.]駟xի#GD>>>W^y#GL>=55}UV]rC'NxKy~ܸqNۿ~xڵO>ܹM&Mtȑ6m$''߿l^}G]xŋ?k΅3dȐ^zzgϞ=|\\ܷ~;|MOl;.^x̙~駟ܹŋ^R~G KݣuVm۶7n\Ey)Mv`uMnb[-BچHo_DJ"@׿=z9r…|acjjj\\ʕ+/\@D!!!UUUO޽{啜駟nݺW^}gjhV^=vp777{RV_Y;i$WWW"4hPYYYvv~t1iHsvv&,^_&"L}Uq܃df*CBB{9uuU^n=ࣁ8ob;0GW3 ^:2`!( +ug'}F]4-[K.s1l8n- ׯߐ!C^}ՒӧOoܸF-Zصk{Xbܸq{233{1///\yɉ*++M4<==Od2\.7A ɪ,Ws$A8y駟!r3n;vl$s-2hmn'nlz5 HLbb0Dqa4DSڵ{g,wPK[ Zn}}}CBB>裀pӒ 2dZ~ & :Օ8ׯٳX???_?vYBH&>4~Ƅwěs"@`k4M!݃@dd451 D2oX1"ŋ&_ "СC:bbb***AC}y iiiRiTT .]Q.yOKK#k׮}MeGj͛7Gd<FBe+7lb@z>;]]^ ݊6Ut!'$ 6c#hѢ [ʀ{yy͚5KߪJsvvԩ>FP^^>p@2Jettt˖-;u4bĈO?T^9s+oիcǎC}ꩧ,[m;^mrر{X_qf&l民1b $4 !1Vo L-s %#?zfKS4d`BOFL{0lkeW0~@j':2((p@~[B@n[nm {+ O㼶B#j 0t"Ro7Luy_o֒O^~yNNnNNGHH<7rFNNCDie4mg펍$ʨٯo,tf20NÖF#J# а1 F'h&j{m7x ""Zb Y}͕^cN vsud'N&\Mpvv^٧NN2\!x4)I12LL 0 Ո D:sOFDDЀ1;<~zJFm߾wLKDJh\G܁5I ֝&ko0 'hbDD!F FO?`ce;w*ˋn0"HRaDV㣄G/)AivO> -QoR8A?ah1&3)j"EpڥsO۷wB eVj pZg>z`!D=k?:C^t[[=L'ULUț&ˀ8y#2ݮ{cNNN~~Qݻԙ+/?YӦ^ݻoĈÇ %^axnG5JhO%Ac<$ST;wّ煜6[g*;w;=ǎ2eZ(YQ =<pjgQfg.4^ QJTnnCө kP% #eoΞ?r.,Mm=ug'<=f(;rrruP(vo:TTT]8w |~_xzzN jut+aJcM4k>RĄ+ ]p5bdn88@t!cDԻw?v-<|ŪwߢTf)J//6mZsGD%%Z4''W*xyyMfoÎH.Yl:.!F7/(,,R(&>>!<i8t*s@hdSgUH#8#00Ӓ#: "1=k4S:vk3Wg|7fq ϟٽ(\9s>Ql9:\DD.\ܻg>/K~os-x'A;^:e$Af} W =uwXg˹gvFCI/%:7䩸kZ#ZLrk/rkFT^pqY DX]NLLڵ ; c?e YN|ݟ?B2ND~ẁ!lJl ?or'NzaQ1Jp/l_F;r#͋%W˷͜1IW)4eKHTdvST9>n)p}+VؑX\+8=|3NxskMj CnO֭5h<TIL'$ssZ3w`=''.W;Ə՟;h//////G%BkӺJIMmӦMFFƚ_".hN@%hl9sZݥbui2 0]&Fj*4 .zxx|N{s»~ f;4Nuz`i V fc Cu멶2i 3Ô14XN޵ %zw@7h\ٛY< [z Fp3Qq~ Y9=94{wp`#50`^h&cBɬ f[wwzk&AmɎ#h&l]ʖ-rDz9DԸ#k`o;0}뮴{6:;C1ۨ!}/++7:O6 O=پ *{eeg7i7D"Qm-!>/ֹT*|p0j=YVi:C̖#!"58+Viɒ%6cǯ;u:a{~~Z}N P\RhJKJsrrj4ZkW9{gJ|ʅ U-6mZXLDEUeO4^jjZ\ܙ+WkIYYٳ粲qI Hk`}x w.N3Z-3fbUV%$$Kڽm۰LÇ~V\ַO 0sq_~UZz毿uv+_ϥ_骫?[I iR$Ӧ8zJV oQ'Ǝ~'Mرñ'}}}SXW25uiL hG6@1Qccxckfddљ3g֭[z:$\MOxt"C[)-=-9/_WrrrMS~=q}T*/\طOL||B||BPP`u:11ƎNDpwj&55'2;qggg"]QQku:o5VxT\\MJvZrʿ_HL^ZZj󋋋Qpo!Y92_0iT V6?>Џ~{{yyND~ͷg 6n8}ɓ'̝;W*֙e۶}ER"sc D"H9?Ͼ`^QQKWm[dgpv4ݺuy|}|Ojaڍ_m^v7^6}}pd2)UUUګ6QB,vuutjz%amZpђK/nժWOJ矷GlXo͟ ۛMlf]iv,:h6wj*#ht$5'>?ſvvjDbwiLKK6mکS~:kUZZݻ۶c JАc̰b@@N#L%׶G//˖ KII;}f_dDTQ"/L>}=٘ո<7u Z v=S#:pwanXf~֯quugi{Y`L&3qjU+^0OX|iru}7q4 _r%&&ol٢S3At:OX8O\z??ߘ-_YYYID ŝxd6Rt`ogG>6[;՗[df*Sҟ?N駞LLL/pus[ޖ$"ggj(@[mVD >x֦1N_+1k =I$͙cUGm~`hwLLf̘~؉>L2ȑ?9~c>zOKO_:ܳOWVVm?\Y]U;fGDYb uf7+77oO0p^Ң  4M)&&%>[o{~}bh"***D>DTPXe.=ƍpaܻ>oA[ǚ?f{j`|X.X{ךn4,ؾ]ı>DԽ{v҇ٽk{^~>#o%/ ǠRsr}/z85ս{Odegk4@C8L&x}<<ot>>DtWzhܵd޽ ( gobvH|1Xm,~L;Y1#h,X]+V$jjͨ~?_uR(amZv8EppVgخ]Ħ7w;''7##$qv<@G8k)hf$B]',y8G(8wޞhGGu|@`Q~A NN.^!ˉ駟|}Y FwI{n:B-e@mo3Gg<)ʬ5VVz FnoyӆBƘaBΝ"ڞh kpvݷPoLcXXfZ ,k~ #X`@V IDATjf[v߾#`.u .8k;;fbnj@?Lֶ)xLؖڴ_Ǟi,"f׺h1>FPo5O_[܎潕7YNʎBn?Hih@lnjmk i۰E>|yY0n 9 uuޙgu\6MIX e,ֻj {1b ׇ{߀_\gĶ.4:60`4D@uӆOPq maG`-@bMQ5D{#{>E;VX.B 6F@DOZpد:Aj;]}bYq_jild%rj3F`R5pDN@%8]mS!7᭙ 8c%O`:`Eº*R'6}lX =h46o]x׏Ze|p rʠ}[nG4h2Ac}v /DjO3gL7};,Σ|...!!!Rrrrb>App0eggk׮]{bŊqY(ޑ@%-Rwm`fef*8"D݃6_OrqbZdh*ݤŕiV:uh4:#mUH\<*KIe^"F#AQUvu2Tq3N-UkՕϋ2~[Y<ʊ4UOy]6s'K⤸PuA/uQQUżN+Ȝ݉si91lj*oŽʼn%Nk|UeEZu qbœ1*έqx5 'bO@3QYQ,=䪊R/̾q\K]U9[M?j؋sޭ .aZ2b^QH孑ȾvxK-ZmVVVPP7ѐ!C Vׯ_?a„C: n2|s \ TqYwC?gu G 9<8W^1KgaQڦe?j3n\.ܜq}F=73.$8{ D)CکL*}bҢ8no?L"&G.q/'I~uVJyR2[:TuQO?y<#^vgSk1* ==~qOʝ-+'gFy{z:~:5oUY#ZV*9pI3᝿tP8XEn4=6\d"@P^ª>bu]Ҝw-l>`%+8䨡aZ[9ѺUZLN8x+cԦM%K|gx}zu/)-SUV қY+( JD=ut9}Eqqv^*Rv{X=D^blQ)FM4Qc%jb`' *].G ݽ;>[TPؿg7"ںs6qpDeEylQF=v_!&@ԑ? HDP( v524024խӬ/V%痕58;'k]۷ndݷ=:yU! 3^6fֿMD?󥳣=d7_~he( @DX1 UKK[Go5?m^d5DhOHz5&^ޱY9p?o>"JMMر}-o߮_G;wsrè)t @[#FE$k*(- }$O4&|B?߿>&>cRq^ʯdk?zhJZ7;Z)zĸiM3 sgvE%c>vO"-- \a'Mbq DjzvJ]+s3ܰр>=%ʢ:7ڍob_pFVNvl|@i7nQ-%BO-XϿYOrkZ嫧ZfU7aWͪ/^o I/YEQ^Veko m?ebekrxƳMzhw'Lx-ggX7}Pp#tR X[[;wINN:::U̻Q =( -RRI&V@@HfKMff h5s0IwnV:I SGm]䣧M3ܣeh2WOL>~BD6V$9;:Qbglm+'{X9r54ʄrut늨`D%eӾ#YۋGv%6_"(pD߽9[qUTƦprr@[z( RNi#)2̕I+ H!q$b1,B 4 -zx_%$?p _!js{uS( Ì>hxanj)TX\LD&FRPAdjlDDEUJ\}웓8_SSKCٕr#CD=kyGCXB\F!WT$HHPQ.^]:xE%,]L(<.pPj6| {؂dD$ٔ˾f썀gTH!,ܱq=?9%]P8wl\BT߬=!%\6i~Pr^q1( CC(%FMxק{gvЩ Ϣb6,ginc!6-;z=_)ϛ5{ѝCu C?+6q#ܼ}|2q8 jhaݚF|^"aAqA3]w.qߏN~ O|#.KD<&];gWCSzY*<~Zm3(NW@W9=S4;O,XۇL*zEGI)-_OD?_hjhއ$F0ܤ[褻Cm&2jI<o^Ϗ 9 }.|c_.>?<7ncIO" r3@CoLD%k.lڇQq`ˎ=Q/a8 cdfuY;~ۖ^[DDfkiQiaހ>So=$ ]:xueh_ ׯ7:E(hZ{u oMm!aB w78VYϿ zD ?_ηϝDZZڸa0,>+:>wOz?s+ڔs ;f޽}TKgiĭ*ӱ̽UP~r RJTbT*e3rj.JR#2[s8>)tx%V͸D$%hikk[ L-(1"Ha׬ƿJKr%"UP/bF|K? Q 7o, ; +Mœ*!D.%D.z&/ s3 MLmrYFb>O$͒<\nSSWzפjuFBTZBDfv&9I:4oU>Q*v 󷶡s}}onOàq!Fc#TmG#t9<Z /Pw8 W'%< Qm8\ rT!s55sJ$ j4wJeb[T"*%;b4a#JcX9$7bfKDzF&Y0<-m[;λtvV3ཡ^D6S70@@D\n&Y>JLIxIr-ki ,4 +L-޹<*84U: \`G177۷o +4@# y 4SϟG2\($RtH1___'N( 9D* ӧOlْs  @иki40E6o\L&4iMh֬Y!!!>|WDc8]\=۶NzʝMPB?uM… ]\\RRRhrqh_6|}1t)obb^Kа`Qzz:#055&g FDM\D"GЀ T*MKKD 6[B߿N { {ggg//5k( Lznݺ ߿N5+0́e2ӱcǰ.]\vwwOOOgZ Pa666غ5A!F, tAΞ|p%? YQ.geg: buu^3mڴfnʊ}-3gO^yU_ vFjZ-ߧO)._էw޽| Fti%ʇyyy<R(##SKKԔd2YttD"iUy~AnnD"vuuasQQQ\!762Redd=fHW,_liiH$211!2aaalKK ו\t%+;Ý}ζpw07ǘx0A]L9sj{٦[(ŋ_h-ߺu0y~0pȆCB)K|*>߭GbWؿ<6b ;v@D 0Lmޫݒ_cF/ E%%%QFFfXXxbb\Pf+.. a#""%jr<66."" WD4o`fUSVVVXX. s*Uk pAܽwU VgU^kP(-^7hs?#-Yx CDaaΟQ=efpSֵ~3X/nެٽ..wSy 5smai w{n秦}ey3װ'׬^uX@::Drђ\099e%:x͛>z~abbҤigN355]d`VVova"Cʋ2 iӺUvvNjj-?$sGNڵkSp bZ˖->9Vgp8?ViJ.˕]Q?rİO?|%"Q=k^lN611iծ[k֮/.. uuhjXdР[G /KKKe2Yllr!6[ݷD%eddFDDxz\s" N@D=wx銧\.|9հrrظsN|;99֡-n͛M?N5Lg%VfgewЀ+20'lX$&̬,9prOOB}/_9= ]tVPE9^^BBj,"#-YQ  |}[ZYrckԱú 6o\ ?rU0̰C<鳣GPEm۶)++=}/RN:ٻ^Yk߿|_- UoX-k++\djS-i׮;woݺӧw/MMޫ?z266cԛ7oyl7mݺI$vԽ_?/NޤPT?:::lYaʊjcܹcn; IDATiii^y3\\$ԿΞV^n۾S(Bx8Lyj}̭w_r<==²Kzy%^;ޫvx*4ڮon?Np]6/ ];KKK32̌ U5؈*^b跽(}{t/_+aee?vmRY޽ED֪U+nCGYXXk097iּVhjjjy|s&D^b@JKK+87yWemݲQ-巽 |: KlmUyzz\r^p/fff7/++651QNaέj^rݺIܩc@c`))(h8 !F,1`i0 ^hyꁮҭׂE++aFjBsMgEk u+:#sAݜ=w!99Y…K~~ @D>\m8>r_g022l8R(>x 411ڥ30<{GniiY2ʄkmxȆo_ GA@7T3_LIMcrrrZniee+3g_tAU^&U+ROh[;&~4U__>":q=ߠGP.;XD0//S?YP*eddjii_ѣ%Ifʟsstuu%ITTibbRFFAflԴTSSSg&GTckk(GEEhkT"v]Hgggkk˯nxbצ.ʺUzMlaiQcFT K j{ ^+W-bV 6X)222Ѳ **ٹ&/?Tq111ll1>EqQ#g;fѣT-)9y<{y3M'x1cl.cbb"q毻wJDyx߾s|3Ν;qx3צyyffO]dB풓_ ;`VZ$::f钅Ə#ΜCC 0yZfEDΝ3{)juLٟ524d"觝ۚ7kV5iP(LKKS(\>g{ ^3gZW[Կ_6½500w\zntLTع Q#v~=ǃ!FFQ1~zzg%%'tp@ൻ{I>0ςso߹;q‡#G #"BhrA>]hɲW؏aaΟ162y΃;lzIII}>ڊrgs/|>鳳wK8n,\մ?XP̛F= I##ÇC&~4T& 4pD5/?s8ѿvv5i2 1FQ*봤j{ ^ǎiǏ]vzo0 ҹ9z_>ff-_X"dkT&"ZlYA/&&<o_`܍_ =⨑q?נǫ*aa]:wmD"qll,Q#؏FFRtH__|QVVO?ʤʧFGD;u/^LDD |49ۻ[n-)9)>>a6})^&סjK$D")**vo5rc'L_K"8 >=x{HKKM/^ayzEQ˖->9V大gp8?ViJ.삵/vm?/\0oԊ9ӌ>{*R~""P¢*@D9j99\.XNDY66^&ס*%W}lÈQc`ݚ7sb>}8nln433&5Q=DTq32-ZZZ9D"1#Pg9AѹZQ(Aϗ7p~t}V׮v,H=>=ztcO `|tqh0:XYYჴr<޳Zݬe2YVV;˔T"l7YTUQB^Tn)ʾWx =z,"*V{{}NqcGUPfAg@j`YZYrckԱú 6o\ ?nʎ4DISSBPobյK'ھDmz0PO ED;gv]\=Titmʌ+iݫwPk歠k/ЭLs33vryZzD"بLU^^^aQC+$J--- *0xȈiS'++˪f06V^ZpWc`{iii=ٵۻ}Vۃ#Pg}l2ceN>.R"aG87"ñLZSSS܁5\m6--ddVu贚4C{O:\Az8BamCjikt; 4:V.{{l 4GD TV5t.^Fn@F̘NwB-]?3Quڏ۾kTMF{[ ]ڋPB^lt[xE5C{^VC1 z8D Lq |½#Gg߾}_I x<>ߥK{{jJOO700h<8"AAAzzzLE􂂂jRO<1csGGG޽壏> U5x'Ob4**ϟ=z'|}}QXXX۶mܹӭ[7"ő xxxhjj*ťhB5|DٻwܹMIJJJLLpssp8D'HSRR-,,*U8~dvvjÈh1y+/ۧrnn^L__Ȩa6v֕yUjow6{nVXX4dH"i6eiG®߸`ӣիŃ+`b400'A:Tlْ妦QHHȑ#MLLRP(<}t˖-r1c߿陝miiyXz9sn&O|Mggxss˗/nݺ۶m;tP˖-Wa6ln*8p8*:F5uVPDD99R"ZtE` ǭrECn_w*5̎zM_w6l BD;uU@.X,n {o[QmđjWbVd}c{0E6o\ݻW.nZ&M4ӦMD4k֬gϞ]t)++KWWjRl׮]bqttt۶m׮]kggGDr|[lٰa/_駟T Zm۶;]655aN?,ɍ;dNNH$"LciaAD "5--5%ʢ2Vv6[\.tqq13{Ne9_~CUC.gdml| ̖NNʗaK:J$CCPPdff;?w_$&6qrz (&8;;[]]Za]D4cԑ#DEE'&&Udh1xMa~s =&&&**͛l J$~aԨQ5)UVVFDׯ_(**J=pf5v.2tdNNo6:X8)qqωSg8u8ݨKWDFFy||[62amaC^_CzAD1Umj5\].YBa֭6}iSeQ#_z&Mj2"yKURvԠA:ҿ_ۿ'G>|#pwksU+ EEE+3DDDVW^[2!0&W-~HB"rvn܄ZjY^6jg}|3{5Mc/uVPP0|+W mmonmCWCrvSVq3zԕ Og͝iF 0Abbb 4hɓ'޽7w\"а7VmkkKDvvvgϞuV6m\\\?^򓓓СC.\odd˫a6Psڍ^}>`~k9qtt -mqDCת=uԤ~#0''.\DD~i=ztԙ .yx{k|V Tۥ+V~UV&^b)X5wW;"ZtOng|rv{uq=xpok8jվW>&>sT:\.7$ѕ+^`u̟Fۃv> @^==haaѦM;;;T~HDׯX,޵kׄ  ```Puk͝Ο?_PPv8r*@t+&Mݤ֭[͟7.]rt(n޼u;??3o!.\b{>tj\t%//abbbկ_jjÐΝ:?4ӈ鳈'\+**UKDKNwԙ&_|F3a7~3m,D2q‡go߾[Yo⼼<"bAp7]n[7|yyyA7n:|eD쏯^QXII {Jӧ ^v|բڷoW|4q6W|P(vݻ<}+ߔU&Md]d/_V6f1ך5k~'\znݺ$HԬY3---///\^D"<~:vHCCC.'%%hwv->3\pU2x-nNNd-TMV~4¢[3m;;ÆM]FNn.5-kßdge׿Mpν'Ni*+;۹IiF_$&ſmRf~ƺZUR""$u6ȑߛQadd8tN3R[?f/ kS5Wﺳ.|пw6C& [_Jܺu]ثeQ5y]ʭ+Hfd5q^͡áqnccSk}a.]0=<<<==akkk6s999bAGGlٲx|塖-9**l _pIPZ6a8;[۔E >ɓQϝnMڵuzzƌ?ۧsŹ]v<8$222ع ּV-U먩S8u7FEEsÇOc&+SmV*Z[[eddΘo?:;7j닅K֬Тœd2v6G"***AXrZSԭ:5vW)j<~^ :k}ب*S3-,,,*sO@MYij?<7uJ]!0;%` :::kdo_P-ل._rΙݺu+"UKw9=zt|ް *lr-7|ATtL‹ٟmZܸ!n޺}?7Xƺ h^|u7zzz Pj^[׭Ыݔ%%%%%%첱q/]'ìMD;gv]\=ۭkSfU=]̻W3^?&OEƕʎ.^lμﱆdHgff:Nz-++̴f[ع;{G?AIIFF\5PCGy,?6/S*Gu;J E~~~~~i6)eee "7ܨWuq#T=Z\xy`omʌc? N>.R"aGРikk;7inՙ547.Saҝ? Y[fz6RYokii8O155=A٩޼WokSV=g#7KEEYu^\XD r]KD e÷ fFF>U]0 HP(BmEEFBa٥gE"![fNn5_$ݸ~RKKK,T*eYY%>yVm##~ Phdl|3Zdv[;ǏC0`#haEm޼azI{>uڣGgNWΜ:&Ht;*2 @D"y\LHOy>@P–߫-[ y>ejbvcRm={ }1jkllc"چ?`E5'>пI=,,N <> ?.6J"QZj&OWT P]fе/5w" B (ڙjjjqBJ\\T*!|"L&026hHDDiyyg1ZZZ=|p̜%\YvV&D!@@|6g^cܨ|=z.}ދD' F xr\(,c HWW"6]&eJI/^־~.cB$I$C2XOrL&d2C) JKKU<]]W(x)S2blM#ht RC"b_stt:ն4թ ^&'>[R\0[7k(R0w[QQaNNvvD0L[/46^P-mmx#d``P(a8:9''7FPRұcW h`÷UI8=q3j?00%Ł/pE\agG,1 0АԗDIaK9NB|umk0xH\waWtɥW\\יS*ur? ,))qvv>|' >رj˵Uu_Tzر۷oVZL4Sۚ7֩sիW z=d6T}ȑxax<ҥ}%9rܼo߾o9ήk׮'t}}WݻW  _VV*w՗x[jسgݻw6,==ckk[Ϻ\aaa~N:yk׮yxxԭ u=zT.7o<++룏>>}7|CDڵX,>wܤIƍk.#xgϞ}ԩӧ͙3'&&駟4حݻϘ1iӦV7oVhѢGZ[[GGG5FS#s֊L*-*,(.)Bc2YAA~y$Iy QO>D4n},XS+++6e)))j٦MY&++K__ӧM4qtt:$<蘖9ho~~~hh͙3gȑcǎ} 0lbqXXj+a [l߾]ܢEߴg###{=;w֤Z&-Znhaaj_Ϛ ʕ+{fS_$I~~~JJEel<Vnٳf*۸qϝ;7l0t5pddmDh~ܾsu7~}ۭ@ ؿ+"266nѢZ>|]ׯߌ3ڷorJwww7Ͻ-ZԼy;9+((q޼y O^G{8tR6@@D |Ϟ=u[ٳg{zz.XΝ;55i]Q\\lffVSW޳gOYY5iuLL.\|%6}={\vA:tj_Ϛb\غuϷm6lذEUQ&>6lXqqg}Txi 1Wmڬ\5DDDvGݾ}ҥK˗/OHH:]Ç?~|KrT:eʔe˖=x ""ΧU+22R,{{{&6o&<}444T́j^{VC ٷo}yuxV(QQQo_~[vmBBµkl٢:T;>57118qQ y'Oׯwww/CBBWE=k8_LHdA__899Ot5O^MмkC ke3Ua&&&DԽ{VZ]xtuٟ{]\\8{l"bfΜ9FFw522R~-2eZװ|Vwttȸ~etuu]T>}988§O׷m۶aT#e9j_Ϛ'Nܻwo֭G%TQWN,<OG@2ultٯIU _!k&##tU/G󲲲\===ǦQRRj{%IZZr>&(ռ[ַr˖-[lIDÇ0`رc~P|*괴4ae;gU :4%%eСWR!C 2]6`cǎ}ᇪ^|YY=k8_96fit5T#` suumڴCuVTNcIIIFF,66]vU&9ravLESV2,77oڿk͝^k9::={ !!ygJ普 "p8ʛUVquppxQΝ(**J(n+t5*=Pޖ-[ݻi&d[;VYݛJDgΜ2eʱc~I4BagWcz7o{B(444r9w~M5믕')={611LJ|gؓ*g}sM4ir|Æ :ujڴ)V!rrr] ЈcPC?~|Ϟ=666AAAj7lذ.]?~ǎӼ+KÇc~>#a*Fo-[̌wƌ7on85| gaaabb_ihhOܹfرr<$$o߾k. QQQ5yY[[Ο?_.;88,Xcƍ{M5r/^4338qul-pcO'|r777[[[ Gz:pe2;sssg```II===hcǎU[ |3fge?3"} 6lذaRSSKJJW+.Qǎnݚ`kkkhhXuaaae)Νc?nggnQ>n8DXܤI-- VjXֽ-'>>>333//ښ~_*YV؜={$%%J[lYxq~~ ˭֭[eee)))ZZZCΝUճq9s&--M 4mڔ6mڴiӦ1ƥ/**߿UV={ܽ{aӋl>>>^sXYEk7_̷zM[[ݽU믿bcc֭[rXa4iҐk YYY%7PsZzy<o@W F <}Tyb)))j٦M.gee뗕=}I&U_W";99988F+k^Ϝitw^ׄk```ppٞ={؅S ͌s@`?o`3x`fkѢݻwBCC꫅ Vύ7÷l7;((hĈM6-))޽]_}޼m۶*&ݿ_Cx3uQ۷=}K/_Pu>~888K.Rtʔ)˖-{ADD;I8 FoNYY?kZ'Ofg'޽{V.^Xuں{]\\ȞP0̜9si#7l&11+Z[[+mll222NWejj.S[)%ڴiCvŤ$eDWѱDPŦh80gace˖ѣG7i>-..޽{رcXk޽3gδ=sL\\rҫsܹ?Sqq5k] ?nktsݼyE{[ ] {kwqUUǿIAfGTRq*+Ҋh6]SofesvR3-+jdt.u.I[+,L\GCcǏ2̷Nݭ):ZڷWŅ))rpP~"#ռʶ:{V|~Ѐ%Fcc'77k' Ιպu-:}Z_/eg+*J-ZY]XHcǒMmϫ9qӵg%i{2,g*)I>>JOW~/Uث*6/ӟxEEãdtW6^`(k85lx-7h^""ԡCُjy-}֮Up0!}E,__MblGs>Չޭ#쬂h u$I+0P?$WWEFjL_6`4ܹ1ںU-[aR|nжmrqQd.ڳGrro/՞=zeMTۇiPYZU/um^ XH|R d07ծmS߾U_|%))IM*=]f)6Vg뫯ԩ,WUl^? OJ7.~(*ܹC5nƍlp+j%zyzj4xk ialѲeŻ=Z.^B w2d:[?;'r-sqq)((D 5zBC4hj.ۧp-^;o$gg=F԰azm_rWu6m̙%;5mO:)2R9-]ZR-<\{jvmܨב#]Haa ULo+,$[qn[;i->fLo%%m[k|u频#UX(I>>ڼYg7TP{K]:vyM38vIUQyԟrWL|8*U \8D;xNpU˓tޓvvŅ55EwtAuCɲ*yܴ@i*TrgRK6LÆIҦM2DK4|5|\\'JMy;5llSRӳdK]ea7()޽dC鶦撎+PR~_彪"o4GTe8*R[ 71¨V2e q\zzIIZr.%5uC߿c>T'뫂%&߸=Z\XY3=#GnN.:5UWlǎ}mLF+&ÆjR_޽K ,PbÆ% RRJXX_nܟ֭Wj GEWEEN\u9??ݫ=%)&F99҅Çu}1Cm·[ZZ։nlo+H>]7\|zQN7K~R^Fqq *-w I+W꯿4thٻ:{VeKc1CiѢpM',A+VHR^f(i[^U̙?_3f9YtieQU*'KTFV')x.jѣJOѨ7Pjݚhrvsw訄ćƍ}gVVufEobc.W KKm __I=^{MO'*0Pk{oM:^QG-/Vv<=ծ\\3ߍ/ԩjD4H?.>:}^>>j켟'O+Pnlp-[y //խ[eQU*rs+SZP\ԢErsӨQ*,,Se ϫ];M{/ p-Y@2Ξ=kmm[!#˅mXH%%`8򈈒m[r~lX۶);[񲶖̹35eժJϘ(}ݕU睼{w͚#GF KKk(+K(Y%J^*.NyyjB%:w:zTrtԩ={.WUo^& eeOvvR-=fWVժ (.;ZR:{V[ @+-??_R^^ށ-eZد_NWKacqpPvU=-*?E{UeThbQTWQ*>T.>P }pkW p՚=^ZĚ@"GL0aBE|0jvp IDATk#u+ F#\>׷5uFHerZshP5bKU©VҖ-Ȑz-\n(4TSZT۷+/O;+,L_IRPVh,]VZTH:t{)a),WW}\\y ڶM..ҥZZ{(#CNN{ձ~EڳG/Iv! *KK!}nkrO ڵӶmW]/4p$%%iSk,jl}:u҂KgB}II@R>T4^qa;=tƍӸq nEQd@^? OOM_L!//hQ 5Vѓ>5~ՌUuȨ{C׭]?b+<ߊ:ѳBPED 0ݵK)<\Λ& Y<#5l~[zU9Mt4sfɡ(EFjNMSNԡC:wNKT ޽ھ]7uy.*RXBC +VW9:Zyy¶mը02v.ïWmnS׮Upp+j%(C^qԩuSl,rim۴oSsYlbbŻ&iޒIc>`ΜQRR_~oW.9R͛5{xCڻ3QnoIQ:tژ12Ou λn\5p""!??(*رUΖ$'wr:oDUTޫ*2+JzUn%Qd@ǎ-SK JKJJ@-Y@ݲ~Ƶ6;sҳOՉn%'ʪ1rRɽmmÆi0IڴIChRwW|tDI}srFvv%k('gɶϻBoQRҽ{4mM%;VLX5*Uy{9J*Qݢ_8F-mԘ䤗^RϞĤ]dddH:xБ#q||}UPףG k`@5kGu֭?Sjر㼣͚hԼy eK}z.)\DCj L(HI)caQvzssZW_曫1]ULQ+d0ҒH@mY@21~߱ݻY|ݡV(118or{Uf3gj|͘Q|fҥ GEWHNN,SIp.ZP\Ԋ˓DM}YZRH"9‚vc'.;IO3h~MPll*ai +ww5iki iD}{ {Iǂի5j>Ζڵyq#:UM[GOG͚KV'kzٕL@(WUon6|-Ӽyrp\]֭*SRˍj (.jxUrpЗ_Kh4j ":UY9zg uERr򈑡}啜z:I=OiƒEF*)IyϖGDlږ;[ڶMي||dΜ)SVΛ/]ݻ++d;y5KGG~a֬QVQAKv U\ԢKuu<=訩S{,{k]n޼L$8X ʒ.2][z|JG(UP\D%$(3S%ĥ0쳊p~bi:8x&?[ziZد_N׹KacqpPvU=-*?E{UeThbQTWQEU]G@puqumuˏiiiݬTẉ`@s....FfϦWY ֋\߽>[y`)kU1T!\{\xH 9 IVbGL0!G$rr@"GL0*"yr@j_z9"ބ@=TA~D@z@"GLd0< #&D#9`BH 9 IVUfzgƽ{RRS6/haauvޓ߶mw4jx)'Ry߭X.J?2~=t̙sڵkÏo246pO'$$&$$l¢$w,9DFm[YY(LN>amťIxV|۰aCI}ǟukV ԓNN%SSS=<323˜ԩ4{{ܜC6:#߹ۯ;;7^NNFq“ƿ&M\ټy_;~|ᗋWY۶^7$;;{կ)A `0acƵig>OOD?9aCJ rEE5kS<==$'&< ԟnݶcg;;[IYYY&>8_OL}n{xJga"......e -,,|}|{*[ ---7oVX[[jղfYԛOҭ[WOOOF{ac>LdXP' M[nmm}c$YZ07OXZZ+ǟxʱQ7_%3XZJJͩSi9mSXh>=3%,,dW8i~}ml{\|woee2if͚1mK7qI2%/|{wsssw=e]]MxwSO;w.)k&E U#(_Z֭G[jya}-)?yeʻuIJwVr_|a*Ϊ޳~D#A <eT#G3q2#hߞxP_Y՛' @}ɒ%K>l0켽{մiSB U&.\|򤤤Ν;UV׿rrr&W/5ׯ{gڎ0`3<3gI)))yyy:tpss;vX\\[v,,,$eee为J:w\ZZ$јmZo߾͛-iǏСĉw1f̘W_}o馛$mݺk׮/rӦMcbb$/]w(pU$;//𨨨={GٴiÇfΜ)O> yN:m޼ٴDVy-j9G`oo/4@رc]\\L>>>7o={oQPPw^I7oNOO?|)S6md 0Q+_ѭt %y{{v===͇>iҤt'''ӧO y-[{۶m #jc^޶m͛v 9rdݺuOvttjz#O4i2p@777??wyߟQ+&?Lj8 ???+++==}׮]cǎ]t|pa5+++x1Is5ѣٳg-Zd80`wyI\e99s8::zyys=Fq݃ ĉ۷o?dȐ{|ںw 6ر)Gտ,@iV5hqJFDDޝ9s)S[jeiiYo޾ۊLK$Y.5 P!k3`fA5 PETd pbIYHOI$Pk55 `fe0UAj>kdWWA]S:W4_iB}f… ۵kwMX@dZ'ZY ///::`0o߾A”͛]1o ? ޽{Ĉ999+VԩO3g?~<00 5^pѡ4hPXXyZ]x{h4n,Ky>666&&f֭I&j*>>iӦƌ(igΜIJJ!Pwf!JVVVnnn]S ))ɴbڰMaIN׷ 11Ѵ{QS!a vIklo|W>c8}oۻh;nrK-5 P;9hѢPOO͛/] OE%>KGPr7n4oDFF&%% OOOsyDDyRVF XЋk4Z9Wj0 p"AҬ\Xf#de0XEaBfU$U%IpP.Ӓ+?YXZԓm;;;>7%2:׷티6!wޝ> 80^Ar}tH~tYwfEvZ%QtءuVW^s IZj$//7Y7>~6wNPƵZ98i13|;My^ W^~AAfÇ$oo/Syg };Mܹk K7\Ւ.]:sE+o=.77'*((xч---wzΐ֭XPPPTTz:IÇYXX\Kr޿e58wܘ w]L%@}<ׯh}LM?ըQ#IQQ%6|Y}˴ݵ WO?^***wQ=(ÇΜӧn萘$;WUႷnɓ,--{~nn֭۶;;;yj[vmlml}}}Bo )---λN8!)#3tÛ6RE6doo.ZRnnPNzؾ8:8J.-7ʗ"I*(7u IDATʪkԱzeRSͫzΐ駟M9 Uڞ={ti?S7s<<<9P?ssppyykmʨ kmm}mC%o9Xvw>> L ~ܹ#fX w- ;?n|Cj2=[[ۆj߿Sj}ILzSbbUk}!s͢/SN7tpb=+j*:dii磻5Ty_U;nͼŌB/5Fu_'$xzx>ЃCMtNnnnBbCÆMZZX?n[~w 1j~) _PrevKw`ZYrTƵ_ h޼666-[ @W՟[r ?'Oҥy鲔ԳgϚ~d?\PrevKwTc1殮ٕ,p:# ??3#39uIo Si11[jKN>Ѩc6VVŝr4no[Rؘql񫛛?2x@F'ٻ/SiiM|13I垧\t'ƌܹo۸fy_{Mۣ￯:yr_wK***<;nԓOHڼyLݲ;;[I׭lT uێ;Lu*9OI*[kVȇ0Q%9:63J^={9핛ygNN \wL{{空#B6lȨp!+PŪ:u|q:{RRŜOKh4m^ObGs>quu4nT݅) `2 ȴm4zr_.`0ݻg=|g{s%)} w@UkG~ozْwV|XwR3UVmٲ%++e˖!!!:t&%%9:::88\TT-# ._<999..?lٲeLLL՛9s&((GԹs'O\{8t˗S)BPYjׯ{g.\[o>}h4Sbkk[ĉ㣢<<zI>hSSS׮]TM9leee^>G{?0=`A̓$DWԜM-[ Z`ܹs~ [nW_]x__߂DѣGM6lx9SyJJŇ¢.P$~ѣG===Nj*0ױ5ߜ3&&rL"r5?-jGusn>$°#N}\iU yyy3BVVWwI@RdfIMM-wIw=zt<3Ng=;w-b+y⯖墕kל9s\\\RN%`#7__23m<>7woDVVVF$EEQCg-v׮7T^v}w|M r5ֶ][[__aHJKK $gggoo'NH,TF+8r5ףMf}߶m;L;mUזccmSʨ]rW̅_._nCmU,Ao7m!U#X•,-->པ\?J?붪W[E!>@nqwwL+ѤI(9u_:Ă#&D#9`BH` Bi`U$ EUow Ru<13h @Y$ɪHRQ< IR ',Y^{{j!!!K.֙K7IJJʺ*jh…˗/ONN޷ow}wB``O\СC/_~)gUau){Iwq7888EDDtaܸq 647ݿ֭Mw<}_occcfnoccf>tibLbbȼ;:880\iҩS'KK˄I?~|&NcǎC~צj~ǻu6iҤ-[\rرsOhhh``sLMf͚;{ɓ'>w܁h??ӧOK:tP@@QLWٸq# @sjFK.𨨨={siӦw}:uydPPʕ+k#_bjժUK,LS]w.uaaan!'ٳQ҄ Fq=߿`0$'';;;H*,,LJJIOOOOOqssKIIqppΎjѢEfL'b20L>=>>޴m0ڷoߠAJb0LϏl޼J\も>2/bhh/w=ms\nuٳ-zL I7|-[vϜ9V91e*֭[¶m6jh߾}z^zݻw/XTw۷oܸ?rHyyy_hVXX8zЈ 4(,,صk׾}/^sJ`ƍԩSnbcc%8q"77iӦ 7>~xms#+%999)wrr:w\N5fӹs 6Ը?官Ϛv'Mw^34EbgΜIJJbЁ iiiLJJrss%I5W˫r˭lݺڌcǎܓSSyzz>mrrr -)..tLgz{E3$)$TKP or r AP/_ A+(EzF$FҳXcH f9gf˼w@?23Ų=<<^;^vMlRSSUVQvsAnݪfO5hРnݺkܹ֬mڵkE WWW )))2yϟ/xwm}ׯwҥȬD=G8{>VJRRl,(Fd2;vܖ-[VVBl\kp–.]j*9<<|ԩ&L6ma!,,̶߉'lȲeDdƍkHH-n`e˖ .\n]ݺu[n=k,MӬV̙3t%RRZ 6''&&N>[n&IDz?--MUչsvС~8 #W :>>}z5z5vsgΜ}v¿M2e֭ζܩS 1>ЏoqA_~ҥ&k߾}m۶UeժU?l񉋋8XR+%)u*7nW@@dZr>}ƌ5>zhO*]pG>lذsY,:u888fh… gϞ5nnnӧOקw1::p%۷_p3gtbE뮤~rPM*Iٯ57n3<ڵkǏק'&&fffVX⫯JNN>v?>`bGk׮ݝkڵ>~2Gx;vCHa]Yv@Dr)EQ4iboo/"^^^"?o0M1~{OD"""|v%%%d2Y,M3U/;~x`ѢEv{P#X,'"8кu)S4l>'9rA#FhܸqTT߿M6z7xVZ?CVJyFQA@޽Ǎ״iI&HUՙ3gvE :t萕jժQ y睡C;}ԭ[7v}. f͚5j9ro٫W+f'..n,Ν;6kL233{n*yժU;p@NNN||"""lŜ4M7n8222))IQ"cl߾_~Enm۶bnTDËվ}@PAٹQJKp2@!#;5?wt֍^cEAD cdk׮ݹsg\RRRfffIsUUݰaGodȐuTJFbŊ-[Tʅ|W޽O?-"-Z|r7n("IIIzv% %%%d2GFF֮];00A# IDATPD^XbbXHҬY3T뛟]I&GEESfΜ_dƌZ:ݻ]v{򊌌\`q배̩SZho6cbbBBBFWLLʕ+y|pǎf9''-ϛ7o|r[sYYY+VXx- jժUVȊ3f̘1z͚5(,<|cW^=m4UU{p+c65M 6lXtt駟fggã=zԩƍG)ɓ'-K6mt%g:5MD322XBDVիG%"Ν ٳgDDDDDD```nnnTT^ѣ _P,z^:[UTE{}0>44tС޽{sss("`;wm۫?6ͷlOjժuG+y;PE32kѣ7|aÆÇ;88HPPK.- Mn.ӠA]t9<b*vEQFoܸ144TԣG'feei{Z7/w )-X`ٲeaaa@ .\n]lٲ:w;#~\zuNNlnԨK/Tl0eʔ[:;;wܹȬA_~ҥ&k߾}m۶-}eܩS':7ʺml#""l _ P~ݴiSfff||mHǎK9v'"E} .l޹/A2ԨQrVRpttdp3Cy]v `P,T-Z$Б21 Op㌠[n5"d@GFDʙ|<ѣ{ォWTrȐ!֭+)ڵk:uz7[laÆ&M:uڵ/)*]4iRZZѣGDd>O|رcW6ml-*5#((2v?zhOO"bbbΝ;7n8Qe%51j($$\F+"ϟ/<1???116ly+W:;;zyyԄ-_prr2 ԭ[6|nڵ*J10eff&''Ʋ g"tUVi&"SN0aB@@@)Ku}„ ϟ5kvF0t>l5jիرcϟ׬YԻw󟊢L&.,<|aÆ;wbԩS6+""ppcټyf )~G3QN:wȷ~ۨQ3gμ曯*?oA{ QҥKCBB DԻdƍ}]{.BFtd@EOp{v֍^õ@8):TAe֮]{i1LM6ի>}Ȑ!Æ {'*iv_x}ʲe˚4iҾ}{6'eVk VXW_%'';v0`i"QykbŊW_}u)~ٖG5x{=x<إK"eΟ?9ooF #ɔYv@[yiX5kf2mCǏs\r)EQ4iboo_EV3͛Ƅ"Gu>}k힞"һwvٳ+22rƍrGyz:{Ȭ#G<իW/((ݰaC|;vf1x(bkl2UU[lYdٳϜ9k׮ӧO.X6ǎ _ziTU4-44tذa~]lOΞ=[xj}ꩧ qĉ^zW@HxxxTTѣGܬ\|g7ozw7n\ݻO<^PP?f5MD322,KxxxXX~9@```nnnTTC=tsmڴ yVZe~ɓ'׫W/>>VZ"2zh,נIEQbO'2[߿ɓM&S`` ?h OOOtE,ẓ$&& sʴo^UՒZ3gN-LblggmK(D$))If3ʠ*]x{{jժgΜٲeիW.]+$AAA.]T? 9rƌ)~~~"_U @I Wϟ%K^>((G'NMkZKYd̙;w[n֭g͚ij9sf.]"#*I&k׮I&}>|-YzuNNlnԨK/Tʵ"0nܸ OEQVZ?f˗vH߶m[m,X0uԴzFt}TB6m̌^-]`A%4n8222))IQnTy:ooo d25jԨ>>"rٌ&M;88تϏ;-Ҡ~=;;;IOP5LJJcI5@ Uh4^*"gΞ8Pz3g-?k":jLӦM>R#E]{'NfdfL__$"Q'N{~{՚ч>;,YsC<۱n[n@D9}bu.sG6,vbIO^svm[k6e8ٽ{ݽC?ݲi,ҔI'5Mҷ-[/oDgM:c3kVZҹWT@4EQ:`||USDZ&&k)5k׭YND~'>>>""r䗢??߼}f+=ft>}}ͽ{z7ZZ+D$!!\FhFG 3zRj&VURժJ]s)s+3^NMM}mo/&%% /iժcwwm <\th4zzz}|jHʥKG>^|e,yyE\F`$@5x+9zW_wIUշև$SfjԬYSD~O_thdڵkώ goo/"~~~i~@ٔ4@kt}whЛs5YӴ~:ܶmۼ'bZ͚5?k.ZA6@QZxԉ/֮9. dNN_}paX^nC3usi^(·:v,}Ǯuz…> lެmbyi"\l/]RO?/^5jxx\`ӷ_ j2*ysf׫Ww ).)x{{n"((0.dը]lsU2#`B]WNûԫ[l>w1!#:2 BFtv­!#:;Pv U4 [Pu_O ؓt@x@БkPO x@DFQO'=Uu:o* U(t##=I'8kDk kФ*FF'ȍ{dr7ϡ2 #׽v< c#&Ѵ;T ? 'lh,2]UZ}z]&B/EF.*l܅}(TU w}őgykNՉ R.]ןGxfmLGNw{ ܷ"ٝckNe'$j*Vf:yy2dƍGgz!ym֥3ظmʹ߼sś6M?W@%:6k=vԩd`A/7%%ĉٟp7͵XUg^]N{{YN4o3#B^h3; ܧΞcW/^LsvδSt@DD2 NN)){_͚ss=عk/O{k]XgewU[7 "b4^hӈ!}n?z.YЀGGgp|aiɩRN{[d %GǬԘ]ya1r+!" >vuQ;wOt)++h2aѧ3V~}YK#}sĠ<M~;?xjKL~~4pqqNͳ$$$Oi[4=g'/3MF?f=;bٲuGҼY3Wب."1֬YA9Ywܱ@`Zev<2F$%)F$K/O?o`,{ӝETM˼xѻvmMl|ٳ^"&"S_ӡ#.\zj˗RCDBGiѢ?U^_b<#sO^VgfzϞ=Μ=;qFzgΞ[0^׮+.]M|y̝fÎ7xͳ}˳0jG<{B¿F>~7՗#y ?⒑~e曷l۷oGWWSN{ G=z^Ia+'5ʢi~ jX\I|mXo܆ ڻľ$&Y,ijXR(#5.??y?l_b|?tm\pA UUUӴI6ktW.?x`C4mݾmkW͛3ksrr܏EtO=o#p9u rW^Ͳ|ibRR~}7oGPPP׵kWg gR/_KkѼŋs&Nܳ@}z|)Tv92CUU͡"/_ٸ%o @5MZ W+"nVSb/)ZO:e5!"ұCK.[_|A$h4%$$DDDv!:_|,|_O.wr^={.Z!!/ޢ/vUU^VUUX!%%EDbccnA!:w~ݭi*<#U4M 0NN54(AwkGX|5?_3AqT,"5k__?{V+YE" "y)))Fw ÇئjB-e0o7C[m;tf?O|]FYŎgdwOlݖ bݷW6Aq"qJ- UU]㳳3*&# 2jU Ѵ 1ٹY&-W4y㍦oqh(ժ8"|[k~mZ;ph~@jj .~~~V5!!߯DUUߚ;ǧ%]rY|kG O}oqxƱO\'uCC0w5}īW*i9nnny5[>5*A腎VQUj͵ZU{`Kܜ9?jU̙WutQEj܊T2m/%Ka.lF "r/}Ykv\Lt߯CޜgᇬNի8!ϻ/>[{+??۞5[G?ooqQO}Nxx;vVm35lذ@ҤIݷ|=1 +(# 2Xӧ+Wr9"G˙[*v[,۶啴S=nw{~xq6>ܥoN۫Fu[ ۵9tйs+rCG[~=';VvP@p[۞|]*Evq);;9cǒTUtTM!>gY^uMq ӦMMW^=/^OZzz`ZFV~ӷ_;::Ş~k^ryzz+};N"R{fgg'%_Qrmy۪y}[/ ۰7'7;6|gt~|gtz쥰CZ<{c<0.c:A8ڷ@^nh̳XZՠC]M-(CɠZݷlֿ#fovf [ѳO(߮]?Ke?s&.KkAmDEG'89v_I;dgI IDAT{+\\\խS=t]?^uZ?lf"f".oTU^WR\}{[,7b&6f+WF@@<3VæktjZ jv6m~w]EhZR嶳eFq'>jo_Z~&Vh4jPY"booY_" K_KK.Wތ.J #e۶U5-=9YDǻkjkբQ ]2W iZ~~`yjP?D\+WL&Sիn&lWɒ쬪-/J__OAAA))ٴ_Iwժ+ 5vLBrW4M3 NNW._֦OM$o/+T^-##577AנI)$&%6m~Š={gdzu ڶɉէfͼ/ÑRYYDFP[R922+W C DE3\4FDb,PE+~66<@Ux>&S"s S`:2P%(QJµ zĮImkw`Y\ #k waiJYC.@_LIpE^f' TK ϗGv(|p !^õ%>$A'橚 w0vQnUCe\\hYP ;l w>GFp/"S}Y{s@Z1!##(=XeõRZgide?/L+,=k ieURNPT!wT./2qd{A~#Dd~_W`;q_ "b_HW|܃8. {b_Uc% {@s_TXp4#tAK #:5"d@GFp F"UT0ME) 8;b / "J "°1 q_ "b`@Б2##"d@GFD!#:2 BFtd@E24^GD#:,"Gtd@Б2ev'?"#P>*EF{>*`< "bJ)iGDD4M+Lm@=ŷ##ܑVvw$k 4:*Ύ! !#:2 BFtd@Б2##""v Б2+} 'G;) T(ڠR#>cEQ8#"72#3f "YtU D4MDݗMPdggݻODN<@մ:()"RnrcXCMD4EO ;5jQD4QTM4QJcOD+C^_^Z))Rh-+)\yzŵ-^cE1k7=ߟUM)-'A_ej;6:Nnz>Z7˷ioEQEU+_kן&iܼ3Y襧jE^J?R˳n*7?tVҌ2LtD+Nv,zC}QcnsUz;‹؞V-Q(Ѭro%wTIt+TVSBCߏwV5(E?4Mh(NTѿ(EHWR-?+KT^E{Jפ_we5JwO^z+m)ͭ0*2MnvofЊ:T+RoʭV䅫qU헀Rz76;RuMK>9E+OM 5cjUUGP۱C٩\XVV)-O)04^EV6Ŷ*%  >fIENDB`3Depict-0.0.19/docs/manual-latex/figures/tree-layout.png0000644000175000017500000014773212640746376022461 0ustar pcuserpcuserPNG  IHDR֞sBIT|d pHYs,,tEXtSoftwarewww.inkscape.org< IDATxwTׇ. H{ADTQE_DEa,hhQE V!X#*(JYHY.ǝٝٝٝ;~>3e9{;"""""""d;I?%DDDDDDD"""""""y@ <HP@DDDDDD$( """"""J%DDDDDDD@l """RSY +[l%"" JHZY;n%͊^D2}1 ?B)@ ՔttKm>ƺt&.g;t2wv ""l> &/2w_l%.Tݏfefg9hr-ż}|?TEDDjm(""iQ6Ys< Fp<%?s% ܿ'𿈪[63 hXi}rx8#8C*<{2# ?x#+ "w M7 \zc ~a爈8Z@DDj3 4SG8GٮU&|y(fv0rzY*x;$g53;`Gybv/=""U͍DYfs|wlf;݁= Occ>fOgtNr_G\SE~"Mp0G`+"N#>s[s>B1y\sGr;.T7ϛbiYG`6:z+Ԍ$c#VqS^<\mF SN8=wRDDQ@DDҢ هں6c_DYJ&¾qٕDT}cQgiI0`V$M6+ZHVRiݏ6UMV8=B>wY=:K#L∈M#tiw6bn*pxeS.Ź`q-:`P>FT5NHigf=pqИ+B "JH `fuR` e])Iq U'DD~z;sw6A w\Qe$f)HpyL^":ҘImED$S Pf}߫) MnL'Xp0lZplCO\ƳkȄbw%rQ}<@͔LIv Dw :OŔۓx`nEscS("}Mi ѧ`X}gTcv0UKܽy3̵葈""RT^!"SIfnIw4Iџ Mw^݋B1;4I2tݾoA2'F3] Z|jL ""R) ""%$Xa.Z,ՈQMJKmlvqcGI؟*\c F8( ""yO ,3FC֛  @П9?ZY=U.JdʄF$Z:}R/hUױU+#ͪHȧPT[hy+;⼮~]7"qϔOnީh}3JS~=ŎLSnWnŎ"(b,"""9E Gl#J5ÞC cKtA1.U_'Nʈ?ݟнsژr⍉SΧH\JHNX ;XgB!M?lNz"uQ{McN[#vހ]/*iJH0~ y p8J0ywֹ{Q bg%q7IƔ}ө0uZlOYwwOt'm?uE(""R{) "NhѼ}D$?Y(=G.);" fv 3ߚJ\lfL?MBV0E> p=pU>^b: :{<\``l_Ŕ3)m#fo-}BۛY=wߞ=Ai`nhfFTmJ}x""""R#^ % " :Wnc7ًFhYs#F2 `P0~_'r3%t}FzLˆMsfM Umf11/t)""R( "5biN[0ξDu_R:3]%CͬЏ`p'|&tmfv&0 p80^Zr/9g?e"J\Ki"n fz9`O=/>ٵ}Kz ("""d LlNktw '5U5@s"GC0 :N^t_Bb`h4T|p/ePU}8/sl(, T݁ȃ: ~ng%CH^P@DN xk Nؤfsfv Ag?/700Eq̬- `=#}NSx5K)Mdf)s=,wDDDj#%D$HN蘷<} Pb_R+L%Ip\tl"p7f1M V_0DoWئB3; 8%NL wKĘlcUuk \if B0 IQ}3s)&v` 0x:m ~WpEDDj4HZ3;Sة}Dwߔ$'Ygu#0&ohf] Ebw_j3kK0ţA9oj`""""Vfp;<ȧv3Q>!+M0{P'[qZODDDD$s3n+^H0 """"""JHJ)3.. oZ`"""""yN I 3Go(?8ݿZ`"""""( ")`f##.wm&"""""UTh\g/*TE%"""""Syl27Cٯ V" ?e/*"3+?\ًJDDDDD*$!/w=[1HbTFTt$I 8P`?DDDDD$YJHe_ qT" _8_bH"""""REZPDef wnN$X1 П%= Pj2p%08hM0%dߋQ~(EDDjMSfv o`P0 l1W'JJAQ] p9i 3eh @!H}wkDJ`w/Nel"""F!3; x/,?'6!.paz“LpD:?$ vJG|""""yz׀_$mtq$ϙ<S}lʂZg7dP$$Ey={QTۧ1鼙5#تk~ X|Hk_Drw-a %v!Xc0 xSt,ptNf`10xݿ3@߈rl"""RSi <';hz8ݷf/*3}"{44rE%pݗ%x7:YSQ`H% kW~݀ǁ*i:Һ@Uxଈ3#(""")"y!ԁxҎiKSNjA.XYk3*C0*=3۩Җw'H V5AҰa"43Cfd)KSDr\h? Ђ'{AIbS2pρбhG]jf$Q`\,`-?Vx*5"GJ,8N0͠/pp80&3="""ASDr>T\ qY I$eBOȿ'>Xwom-:WQFnQxVyS [{b3m՛;B}Z viۂ`*ñ\*Slo7/#W}CDH%Dr]HNqQCI)3{ 8wpYgچ]*Zt3N w{}@(aPw&NۮN,z O=  3;Q؅`d`tĩJrOk(3=K. %.*"XFpU;uCFǔ0BEwJ t 8. HDAi=\D:"""q( ̬be+8EV)'w >۾)NqLy ڞځ{O&3+T~?]HEEں^o'xqIT]_$l`ѫܗxM r$/J-BU-kZ/r,wD<h + 5!B郌k0KMwJdQhˀRx'ޡ.&R[{9,jcfM V?`(z?mĭ'kJ9zw 7[Fb f\"""dWRn"X T]_$B׽K73a(0`qs}H.$ h a:({$>mܽtC(>ll%""RiHvzٞ}u.dfgODn"5B[Y@wߔn9; Ծ.pdedcL@ԀIlp;̬'pV!Ȫ%""ɮ?ϡ YJ;#}R5clg-¾ Пοxs֤?„ŔwJƩ $  HM)"3U@sCtHM`fm}#s ֘w%1UE씠di',0%悈HS@$K̬U=̬m]菀+RHv:ooET~2GKC {M2*3 w/bwT鐍XDDDj*%DgΫ5t~?Ej53kA :ޝ`.$#űTW@ 1L)'eBEvI/DDDN SN*`fB I^t;Kg|:n<̬>piéЖS":lgX)3kHmiM;#DDD"sPLy?3; h ǵT' f77zA^vbnL96yϯy#)&RCԇ~oIADDR@${DT: tt,CouWRH6Yc_DϷ_I_ɬw_J_`3Z9fv8pKZd030 i-Sfv" 'RH6"/0v ~c cɦcǘ1I^JVOx3#:lIW`)}]CH?Y7w̎#Xlt&f20ݣJ0*a8eiIc"""{c;f֎fyzwR {u"UefK]R{ofbC;`+$$ ވ8g_\}Cũ/4[I瀟To>/X3-A Zd6Z&l20 RHhy@&zHx3-t3Sv/I/6+)ݽ.?tB j|#ˆeʮ! CGEvW_DD|Z@$;*KctfF4>w?W4`|F"w/=JIY@wSzx X9kZ4@$ l,pQMsO#ڟ W 38 ippé\Dl/`ю`k۵q;N3"p3_f1=C1u"Yo!`VI"Y3WSPyW#6QJdA {3Nw$<]D2U5 8ݷ"""""ɼT'lS+"""""9D Kt @"V'^SDDDDDr"df)\p뉈HS@$R5Rt=qJdV*;pOJDDDDD$O( Yp눈HQ@$HI$"""""WݳH^0&~/_DDDDD$hHK;o03JdNUS%D2*;|[R%D2'}]:H$XC_`DDDDD$( fh`NcH"""""gɌDoq FDDDDD"H_[FDDDDD"ug%%D2DDDDDD{cif(i,0F~ο"ojI IDAT=H~R@$K|3'%D2Dw_`DDDDD$?i@43m@Pq pbH"""""4@$̬#NR_DDDDDA :(g1pXDDDDD$) ^g5kZ@$w+۱H~S@DDDDDD$h HP@DDDDDD$( """"""J%DDDDDDD"""""""y@ <Hj"3 t 8qHP,BwߒըDDDDD*aj388(H-xxxݗf92:`f Xv# _""""Rm]vtؑ;Ұa("5ҶmXl˖-cժUT?wv+f/? 3<N8N:Q~)"BQQK,aҤI꫼{mjw&!ȫ <4?8Si޼yvZoÆ L0ѣG3{ط7?w YMDDDD$fDl}뮻rm1dю";v[naQoD&"""",fVx8?QFq7ҠA'"9;3?k\EY MDDDDP>$ \.7i҄gyg1*' ]tՏl$""""'fv%pܭ[7^uzHZ̘1O? DV_d+&/90$@6m;wn`"!<fQF<YHmz,_<\8bX""""'r2`fY@ ӯ_3{lz- V\Ywxvh׮=zSNgϞYOSN_M6eƍYqwΝٳٶm[I>Sc{2e w p/bX""""e;4Px?7?Pa3j(vʭСC+A-gyf X[CrDo޼y||||_L#G@~xǸKUmU%lo`X|eqg4s2d>Ӥ[p!Æ 㡇cKS /w}ꫯQn6lO=TH/)S㏇m6ܖs .BI&~4h+WSG}4}SNԩS%K0}t{=o^Gu&Lh"5UaaaCHo>3@=﮳䲜J١@~^{-۷g̘5>|8zkX֮]ѣ3fLI"`ڵ 0}f$~ɬqQTlofYi֬zCa…?>!%}\{qfvOf\""""rmE[fȑqAAw^TI&L4G}DD֭ӟɓiٲeI-[ ٰaCZchҤ -[e˖h"x=zoa|w}6I6mDV]HuZK/4뮻o-۰aC&NȀaĉiԨQIݼy1bDJc~p}q{Ĩ͛sFVHu3t O;{ɒ%7Lݫ9s7oK.yzԫ_+W2sLVXi۶-;wO>)Gի5kK.etؑN;=gÆ ,Zŋxbiݺ5ݺuNyl2KVZEAAmڴcǎӇ ^ә?>+We˖nݛu^3䡇 Yw͘DDDD$G{N(y睽3 x.]|֭U޶mۼ{Q1bD?o߾J_ԵG۶m7V9|{fV=Zh_| _w=,,guVIɓSNzꕹ_ubOo={ܸ>k֬Jc馛Jb[n5֭w{o+s!C')..cz޽ܛ6m{nB)yڴi^XXwuw֭{joV/((H^v=D4rȬŒ۷{6m"5;U:tСCGY e> K.LСCTcԨQվ]wU#}r~e:?ׯSO=Žod"G}kBaÆc%t͛׿wwۣ:ܱǜ9sq&[S=خ꤯ >XZ'|rT= .^z%F;vw}wԹ|/Xн?SB#js}С5;U:tСCG@;,c7X|yTݐ!C}ݡCFׯ_ό vw."&LPRײeK @^ w_h'p?cB0`ϏoР k׮Qm۶/;{Dz衇)...iҥKgٱcG9m׼ys<@N׸*:~4lؐ FA7T ;w.GqӧO/^9ch޼yt_wO~6l`|g%u 6dueO2K/4{H f.ډTK3:)O)9s7j(꼃>?2#֮]W\qE'NЩS'oРA(7ߔL(** &eˢqgx߾f͚N+)S*}*9g}}dFy޽[{セ|v>sL?<*G=أ򢢢->}{、UGoC:tС## W^yeT㤓NJٵc:v 1h ߴiSO:۶muO<}QQ~QoƸSƍ5W}=p@ի'ҤI|Ŋ 7xJd ۬Y3뭷/,,K.$FEgĉvGsyUӠ'Mo5U:tСCGn2`Bǎ3vkFwuה];Zk֬I-Z0n84iM߾}ƌqꫯJ c=ܨ) sW_#W?m>gwNu]'\R~Y~}Sqq1F͠AS~}|IzURuV}Ѥ}M7q'VoqwIRw.\It,o>c7^n]TE)v~駄>|8͚5\5_Μ9L:ܶɁO''5jTR~W:WyW򺸸/"LĤIXhQIC 6,s?DcH1bD:vRwVډTG$V6l*7m4e׎+:u$qgveڭZ*C|өSЮ];gr$Cy/qAEgΜV棏>*1"*R{/_η~й'|rԓt=lٲΓ@9YdVS-[ڛ7o*7n8vev%ćzhTyڴie&:ꨄ~_0o<_~^I+֜9s9s&=?6l`QmnUNfE:}/s͌>}DuL'6a]D/\_SOH)%)v+Tv|bժU֭[R-^L>rg$u9sDW^]z :t`vJ>a[n'~Hd\SGu~,Yy{gܶm[犈Hf(PMT}V d"ԩf{O|y˒UnݺJU]Tqܹ 8J*J#֭KΝ:O7o}DDDDDfS"|)vbO쨄ԯ_ƍSPP?!N8T*O׭[G<9?8p :tUVj*j͆u1xnSA6m""""""tGGϟСzxoذ!j=H|}yC+Wd;I'^[~z_t4AeZVشi<ߴiSRMƮȯ'"""""I jٳ'͚5cƍ%u/W_}u;n8vQRnР}M $u-;sTy3dBqq1?|IsL8vUzyZn:h ʭ*EDDDDȕm4fusΉ{ꩧ}ݿoQ3<3M7`*S@MW_EW0hР:PsO Fw$)VwiHJ j3zk&_2v*_/9rd[̶}yףʱqQ[}e) b{}QR`*vaQ_~9sׯ_;SR63?&QwډTG$OJ84hPT_xhk @޽νޛP+VO֭ˉ'X]&M0`@Iy͚55*2YfQUV%t7n\R\]ʕIؿ>~C6mRT_9Y wl c=˄֭[׬YñT`ʕwqQ-Z &0cƌJ}QOO>tMQxS&۫t^eb*{cv%(((HS}ݗc9\XXwQyW+RT_w֦wHJD Y:bܹ3O>$fVR7|zO_~%ӧOg̘1%O_+}mƺu뀠S:GpyUk;+~g֬Ywy׏]3e}ђիdz>KÆ Cm޼v-{ϖvԩUJӻY![qHs8I&eϖ_ުU+ǓѼys?~|9r?CI3zj?7^y%!lǎ޿9#|…QuÇ^w}wB˜{'ߴiJUXXC IgݨQ#W,|I焍;6ܷz+sqj΅s<(((ƍGx׀T:tСCw7/ V>ϴN:~뮻 $|^z+;w.guVbꪫ;v,7qW/R^bBڴiĉ3f ;sRqk׎K.8 af?O^ʤI o˄ ѣG&~<3l2sz͇~g褪&M;xmEDDDDܓ[&3/\r O>d# b8q"o9˖-cӦ`}&MСCz) Ah߾};w.{gIyȑs=,Xz?yfԩCΝ9餓6lX%^z>O>%KeKyܹ֭3]taSONNG.Y{ :M}J>KASNI>ܹsYh/fɒ%l۶Aѷoߨs^x;6l?ך5kxg8q"ӧOg͚5; 4SN{챜vi~QkT?.)W d3fꫯ Rf*,,䮻uFAVRQj\tEf{l#""""+4h~[Bt}䫣@ӤIWŦMSN27oPRZhp_oW\w`O o,S&M-Zдi`\C0=e˖2rKdwHZT=sbD""3g=\d#0ȩ@ȝOS5װcǎ,$"R烈DDDDD&.;p YHD$ 7SwH\ A`vp=3d13<Hl,oNV.2&OD$M<.,j5pZ;KDDDD$r2?gE۶mN^n`"^xN8m*}W{cH+3 kd 7wI:9bǎx㍌=:x6b 33P/\7p@x{&"9okaĉہ,%""""y*/}Pĉ9>|8K.^p"s.]9b;klȋaf;07q 6::uf'@$7om5pDDDDD+`fM끑@۶m˩OΝС۷yUDj 6b /_ŋy0aW.9p7 dJ%̬0 4}Fhذam۶mlݚЮ}^nf@DDDD$6ffWg{d9l#"""" Hf?A"T`oev#Z'[E^s9YGDDDD\JTv:ٍH>K/^Er`ݷd9( y̾!5CDDDDDFl """""""HP@DDDDDD$( """"""J%DDDDDDD"""""""y@ <HP@DDDDDD$( """"""J%DDDDDDD"""""""y@ <HP@DDDDDD$( """"""J%DDDDDDD"""""""y@ 

[(MF4r"""""R+ihDw 4@1̬>0&j A2Ew_nJ5"""""Rzżx |L8V3 ޝ[9}T&$2UIr|E 9Ñs"'2P!ҨRi>?wkݭZ{a~k]}۶} :д] 1C;BIw0 q'Hdl BYĈt_ewi1AQ4 L UFĿ`|`A_ Ϛغx5ToC@O) lq.ة!]NQ凈n1?"""""P7j w!8+3} ̬.pzpU7 xFZHv3sgD=<ĺLsyf+*3YpOv9paT`L"'Y%t15Tn-B%EJ%DDDD$̬ ry . ~LCr/ A%ߔG%fvdWA0m%]> 4ܽ'f'pv:YQ@DDDD&#p$;:Ilv}NwbfS7y\nV,3ga ;/[ĵim}Hā`+8JbݿOqU']#&wߐxJJ I)3 8 73# ۲vw`H0̮Itꃙ5nN#˚'F6/0ްx +woA'ى h#2į#I2I )13&w&YwvSY`Hu%~23{3Y-;@DU&Rdf}=fؼU&H\Z욮53x̮Y~M^LWaf-v]+T>M{Jmd""""R,f֌ׇoUۑ+G/K3;K]a03[E2 Qn qv3; :f3yK 'g&!%q> ;FtT$mfSo G;)8E ;&)u#|LMl&01Фrf p);:yjGl&l->̺$A9~"H@l#DZ@먷L8>Adw_K.$ek}REDDD2l"pv/}_4#‘>~MWO'غrPFyHwؖ?Y\˝3U`Feo$Hz,UV{xnaf :'  s2dMЙl@`*dw/CF;Д`` Y߹%Ct;kLr[iafG_DUwf+TP@r"""ɉtF0?w>*Qd M,TbZ@DDDDbDVqHџ#}{BɤNQ)P@DDDDDF0l9"ϸ&"Ag1Q@DDDD0K]"U+}cɼl*J83x 83z"p/NT""١CH5m("""` ;:tV_D|efgOFV[ًJDDE#DDDDr;:_G/"R~) """C,pKT>7KaHh H0U}RH""AJ3G3ًJDD2I r̪#U[E%""H9ffc"U~E%""٠H9efGE'GًJDDE r̪aGWDw"{QH6) """RΘYU` >R 3d[l """"YusjEQ@DDD0JKI uB r*D~kο""""e4pfj'e/*)"n \Uݗж;@Tvq]HĹQUBڏG?{T$%cf s&@#vs6iwM^kuD) """R= y d/)O(O@;%P9ML.wy \;:PxdPSEߖX̬"pp3Lѽю`畽=*Q6ٷ>%N""""e\)nNswfvpl!vG# |`8E 0771@V9.3wK}n: S@DDD2ۀ#m@wŐ0>ؗ'"cfu[6_1Zck n{1L5}j H""""e@0,$儙 JPiO`yG"`zTyK"Ϊ9 DbjFp3p9G}9*Q5C}yS@DDD1+;.q%! 8?,O Y _f;iR5x_p~33p==ۀAi0""""e+ [\$Im(ItGwٽ@ԇ'^vu#w%k#\3> Bo """"afODUe+)z)v(&dz]֢(Mrmv """RaߝŐ|j*'OTd=~tb-ff= Z~~t%6!:`SaC#׊ݷG;gMfXJFCC3QymFJr$ۓs$U# E\wTUו"?a^\!vB=5%J Rz#/Y IʯڸRZrcN_@im<h`'uZD^ZH;uUfv$2W >CR řY0u<ٓ6#!v!2 &)xd|3 0":a x$;ֳ#ّ ϲ 7R,9xnsY IʷóE̬;0;yz_G*fv>"v#N&FFM$r]3Qp'WYBڥ |KKeÞ2fV hU;*4@DDD2h!g/"_gC j65#=[<`[1OF1# ]O~ɗFQ&>. -$M*lx*GϱcQژHb; FP| ,&FO7 іD۰c&8l,GH[Z?]4TQ@DDD2|\?%g} la6Հop+[nt/w xZ^'.A[,p\6fV i(wRE9L!7V#x~*Ћ{6f/t\G8df/ۺ'Q~NX'R DV"zp{bi'`<_D?̻Vx6ͬM$I-y:u{'yY ė@pݷF<zpې}|)c0x8RU9&v* 7ݷhךYFV/3;΍:.3;l3A*Ϗ@{w_)e:Hq-Wd1$-w  8 `wf=lf}lL v7 k2.6 ,Wɿv54ayvȨvBl/_Rw_}w|UU4iӵG F, dGc>p pdpJ"fv2;npwBz R fw3ۣsR= *wm/{xͅD1*`3+hiǹtO / )+jjJCdoT_PEvv%20^ڊR`E9f'3}R" #k$FoW =Omqc{(}a)`#"0bfͬN&S@DDDxO"OMǰ='"is:w?؟`AWy<5Qik HU %0=km|g ({LTouȦP2wݫk=^rLd2C 9̊ڻ;!վ_#ؾ "?~7'XU Nw@MU %0';ffM ,t;EF'SEߎ ᐌpϒݿu>hEl2)2B i k= t^MdޮH6Jw01Ԥ!6vP@Hb\8)Nrbq1 ' QE}Ckf+W@DDD$If'8Ÿ `7hӢ~DDDDe}Žud_rH2$Tv׾M}Pyu)-}<Ϝ}RNOE>%}?MI^˨s37;.i`"Y65NiO C ^oO3艑DM:5y~z]h@ƷK"eJ$UfTfy?-Ed`czëOOU ̔P9Ri!͒ǘYBCͬ2pV:<0TO(5 $ɡEq%:,mədl,6%DDDDzH:śN^J_x/0,Pw^3NSi0UkfE>i7VIi*Z'yY~A**ItpdB&HrG*u7}==H6FY2C0 hҸ埊7HSx>17;9𙙝gflB`t뀹izbw* gf{klf\Eo!8 d``gfm [̪F>,Gt'٭DDDDr]+رrxJIc"cf6`"`9~#G; j7ia`^c3~H'كpfv =/ejWfvpOTqL3HY MsuTs :ݥɞ'\7y&?a) """x#N1Ku.dH7.)Ї[}e IFAI|SR\{OӃc_1R?1۫*op5i^3O#GAf}u:JH%bpK_H4@DDD$9%+#C[jf2>!u% .'H~I܍@4wp,\_ǺSip+C&';*z/$" tIȬs_9|t~sQU Z0FU}"Uz$.Gb0!aݢ?Ҿ5;us)m48c"1s r ɝ+GFEiG2_u#&Xd!8lrI) : t}F]4"m#0Oau+o@}wi?(O)^n7=ܽ{t,#i5DDDDW<{+-zo"GY IDATA hV_DPD!i5DDDDWYEu;Qp+% ND8t}T<`|vtR@DDD$qE8X Iw# ID$ 0f֮v5l0"}m%4@DDD$fV`!T#yo,^T""q FDT^#GGb&`'2d""""9k/"r$]4J喦$&8ݷ""?_,.`]HQIL*=[D$1,@z(P/rfloNIJ$&18KDDreَCJMIL*FJ_k$E "D6(e̯DDDHJ: ?OE0"""šHJ2߁T#""RJ$ }d")&%DDDDV))DDD)U.ƩϹuGDD)@$ \XDDDM %;S4wߚ`DDDK %w@Owߐ`DDDK %X+Hq) """RD+ : Hq) """R3+z@H"""ŦHz8'g"P@DDD`%`DDDJB uB")!%DDDD V}DDD̪yk04ለ"""" T8= 񈈈""""1T`FDD+.[""""wGw_`DDDJJ Zl#""RRHicf{5xDDDRA#DDDDvvp@DDDRE#DDDDvov"""""""!HyHP@DDDDDD$( """"""J%DDDDDDDr"""""""9@ HP@DDDDDD$( """"""J%DDDDDDDr"""""""9@ HP@DDDDDD$( """"""J%DDDDDDDr"""""""9@ P)Hcf َEDn37d;)%DDrU:'ٌKDJ3[ ,fo֬&"" 3wv "afjwxD%tp[v#27hMwߔxDDJHP@rU.ng9)7#]`JJHP@r$濓C9]{ӰaC6lH ^zfRgƍ,^ŋh"~gƏϬY :ep0ED$JHP@rzk߾=}W^4k,H3f^u&Oɋ1áH3۟`^۷{]v LDʝ{뮻/2/BX""R!HY's:͛7筷⣏>R_DRK.L:^zƍGu0Zg)434@rH=WV=z_dw^`"-[F~㏣7,%""hHbf́_s53FɈz1a.jf(Ka 9D#3ZgDSOɚUViSM|Ŋ[n#t:thtq!K!4%$g( 噙UNȫwܑ6ȍ?Yl<[.͚5J*YMSN@t,GTl۶ 2w\-ZDթ]6-[v@zd+\V&""ROTW^~b˖-9ѣG{mnѵkWz͙gIJߑHd; 815jSOuTZ72uT^{53Edٲe<PN׏-[4IL*U81>C:u矙5kÇ7o 48N:e1X裏w^Ԃ"")34@#3 B ̘1C=4c2d>`L݉'SO=Eƍ =w\|Ō7.>ۋJ7n… 8#:uj#**T^{UW]9{QhwySN9tA|wYM|@ǎwgHwދ~e?v؝:dرEv!L[?>He"e?Μ9sꪫp <1uf*uI:pGWV,""H 2G뗱{oݺA{챼 TX1TT_|VZm߾K.DHNKe]: .E1u1Ju,d*""I""eDUT{+W*$W\2O>$ڵϞ=cʕ+yW˭[ulڴ7xW_}yxbj֬~G=0`uM:<ׯweܸq|7,Ykײ{>Э[7N94i5z)o1bӦMcѢE] 2~cڵ?> pB.\SN4iB۷/x`M83gnݺ˗Ox^8蠃bz-~Wg]l޼q1vXMY~={5sۗ͛}SW_SNO f  7ܐwzڻ~˖-<,^88 7b s=?6oޜ=oȑ#9裣f/u: O?Td[wgȑuQ̘1X_ʀXzu~W;S˼yb{Wv)B=- j'"")""eU畓n^R1;WVΝ;ݻwrlٲm۶駟r 'y̙36l۶mB vim֭ۖ[|r&O̘1cϹ -[֭&M?88蠃hРfbڴi ><%ӧӽ{w&ObQ6lhڴ)mڴe˖ԭ[3zڵkQGE&MhҤ 4`ҥ̝;1c䷝3gO?;_~_qF#b}M7mwTZGuyϞ=wpBcco|ر9s~1 2{DO;̇[l{cgΜY'OtPy"{yEKf g}ץ[nN;v1;w)Zx @ѱcǝXO}Jk ofL\u-'ƍV߭:tQޏCG%tCL0`@L'cРA)yss9'n&L([n^z%H6o.vG~ݺužw*͌}'z$sʕ+ǔM믿gsn믿>qH٢$~1.e_+|$Alذ!*T<?)PRS g+y衇vPjբvԪU5j=!Ir6EwիGժU:)'Pl,osgL˸;JH.Y y.T+lܸM6}$駟V%9e'|'3OgefBJr\CD$Oj޴iSob#FiѼd̟?^{-+Hs&5ocʭ[ީMvblI?cL9zd-JtG3ޅG̘1#1S☲it=f~+pfҊ+U[MTDD Hٴ8xqAgw/^+׻KٰaC~^zOJ3|n߾G}4.Z-[>/H8LYfML]I܈~2-ɗ|0sǍdK::u*'x"k׮ͯի/*ݙq~geHR@Dlj`vn{饗m󟘺ᄏ Ĭ^QF?8 *0hРm8c_+ 1OywK,I^ѻ-dGQzn_6mNBW?S[&}Wt-fݻk CֻFd""e!XEe<+N:)nСtMl޼7o̍7-S߿;D;w.^{m[ :4n.6dj֬_1cw}7&Jx`̓#F믿z㋕iܸq/k$bvsύrJ䒬Yb3f̠k׮1#-vʨQZQք~g鿈Hݱc""hdfs=Gǎcq\{Ӈڵkǜj*|M^f͚^Vxꩧe]weݺu 6%K0|F|gٓ˗~\z^N: '?SOӳgϝ3gFbĈ̘1 &>TBXt)z*O?4͚5im6n6nvoNZWΝy^x!7t~8׏IDԬYjժsz뭌5_~7mڴ_K.1m׭[W\4oM;lYl]t'_F ws=Եի)K.N/يCD$縻9qVv`IѡxaٲrJ?c=꿯r޼ysԩwɛ7o+W۶Cz9}sZ/WZ۶m_~~ޤIWfM>}zB6lWPak~QGYgW]u_xޣGoРNm'LP+U߮G m֬Y^j՝]vAc5j_Z5c2dHj׮]_xw:cǎ׫W{^z{x=/?^bŝtŷlRo喘sMVdLyx≘s?-J$GReިQ8R;U:rk40oaΜ9vڌ?ox fx-[={6g.]wݕ?ISZ5FI'ٳٸq#&MbҤIqתU~-[&t!Cp!?)f5k2eJB[sv6l_~y:[la?~;׿hѢEz9s^k$:t ݻ7K.ͯ_bovyFb5Z@Dz_7Z ժU;+I&EӴiS ?ZL…^X+ҷo_۝V/ 'O?ĝwIFl_Juc=Ƃ h߾}R7 IDATK֠Aꫯ8 lSrezɴiիWӪU++^y8 ڷoϾ1ٳkcc#dܸq9\̓/F]\sMr ^,I<1yRwoPHs2^NhѢӧO/pAL9s&_~%K,aŘ 4Aq|ž3hժU~/ zk~y͚57yxbj֬~lj'HKL4El2*UDƍ{iܸ1x`Jw1sL;VZEÆ g}ڵ+uJLuV&O̴iXx1֭~4nܘ:{g;D)ƍi֬YGl$"KGfx-/K!4%DD w`~K.t%Ho={2w귀>KED$  3ȫ[./2:u^`"x =O,%""h Hˀv˗ӹsgz̙3[_~%;wSN w_:/"}JC?wG׏3-ZpE1gΜ'"ٳ8p [f„ o9pD NvoѢ{W^n3|"R;9Gf̘1|p2F JH.3] MZhܸ1 6daÆTR%qHqF/^ŋYh .d5_<3$B J/3F@,&"f` A? Lq!)"R( 9C w|TU'! * HUQiVPAP.?ֵ }[p-~mkw-b H+QJc&af2If)IxG9$1r?2 H$ @ @ H$ @ @ H$ @ @ H$ @ @ H$ @ @ H$ @ @ H$ @ @ H$ @ @ H$ @gfK:Q~NCP58|, V^GZI:CRI$e5 U]8u-IKze8&@%g; #l}ť4cf]$)lF"QI#}yt,\tAjѢ5k͛iӦUa@Э]VZd ?맟~*:IOwߘ(" 03t_n]Ggy맽++1~ꫯW_ߐK$d!<@H 0H l7IOK:;A>|.Rn @1|SO=¨5 %Rh2@`@MEuuUW]oQ{gP#릛n+Ӓ,(  dfIһյo^ڷoѣuyiƨ%H FNT5QhKSO=UӦM@F 8PZjY]3uIU ̬19E^{x  @tU3fБGY}f)$@ 0̞!C3d/BXByyyjРx\rJqtƌ刪۷kŊ{:u)KVZ:J?Cdbb3TSf6H7ݺuc=Xf͚7|SofΜUVoVV-^:#ui_~j֬YVD㏚3g$i]wr4UߦM駟O>'||-_\WvoV׮]կ_?7R|6lPou5kU&lA#PYْHRV4c ~ 7oRծ][W\qFQnZ_WرCRhas=7۷/NtUyc)N={j۶mIWnv]veɩ:;ǏSO=5rG}X6c:$c7CeͿ$mݺU?Զm[M4)M!U/Bé6oޜͿ$_^W^y۷!۷~GV]hff+S1n-*SvZFc馛tw?ꨣ4p@uY-Z֭[h"M2EF_vŊ:餓묳dȠ:nݺve9c]v1;yjѢ5jKj4i}ݨ>/gu]Y[nEO=֯_/I4 Q@p1fv;SLQn2vo]7|sT]۶m#we}'uuiժUuztqǥ%^TNnnn~_rD5_g}V}Q='ON3g,U~~8t/YݿR8h$$PStIGHRꫯfړ'OV^CcǎUz:ܹsճgO-^e˖ꫯ԰aÔnj!P͛7OGy/_^\7rH1"QE[~Zn+WUt[HjZH:,E_zԿȪ3 k@_IRݺuu'gs=mݒ>ׁ[oUÇ/nM-ZgÆ Z`AqiӦQ̝;WϟKQFjӦ6m;eR,Y+??_K.ƍոqc~:uA%|¨sO5msP҆ ki֬YZx6lؠVZ=E4m4-X@ .ԢE P=ԥKRGZpaќ(ׯW~~~ZjU᧟~Җ-[$海nݺG*((رc5k,-_\[lQƍժU+W]tI|W..mV/Rƍj*5jHxN>*aU^ti")]O;c6c@rw@IQx88*rH_{ܿϤݻ{C~9T|[n͛Go,q>>o<ӧYI'sέP'O^zzk׮>a„ιlٲCuwM6UW][kl۶-<3f#Fx.]ʍOtA>jԨr;S:_[o8WvG9sqe\%yvLEٲeGQ _+SƌAR 7n]w52k M^.zqg .Ԕ)S.J3//O~T݋/9&M]j„ r/}MwyG:uɓ>;tUWcĉm_O>馛FuMw6lPjL~nӗ_~5f͚AiذaUjXO<:u_̟$͙3G g]< YO?w3fn:ظ>,ERuO:a Tfթ֞?0ܰaCp >ko+.Z`ZjUnE[n/"Iw}խ[7uU״iW_nذAvL:ynw9眣ѣGG7mT]tс j̙ϣqڶm:sW;Fg}Թsgկ__?MV"^zj׮Zn֭[qZh~'}''IzG{{sva*,,Jiܸ=RchܸqŸ4> U;{jذNӧkݺumƌ38CƍSNN7>]tEſ'-[TǎզM͛7O_|-ZT%\W^y45,X\NwyYttP"ͳ V ppdS8!a|߾}{T!=zgy7nXV^7tSTfӧO/Sܧ_~嶏Yf.С%nݺ?2;^z.w_K߾}x%"|'}#`ԩ޹s焧d}<W9888vd=L$8!w?׭[һw福n)eѣGԹo喸bE3,^8>h\nL&_=_~)-էN:tR&$1k׮-:W\qETu',>x ;+>MneӨQ"U*GЎGu?$ .}=bs4(W\qEv'pBB#(\H\xQ}ǎ]@2rv)D=.JG%Pg͚Uw;v^9 /ʽ=//\nT(蠃te%ȑ#&LHWT^__^gN5/݋ (wI2 /> _w m%تU+~J,xOWݳJ5j[U?^;@kӦMQuܻKTyƍ otI'%Զvں袋NZɓurr"5k&Myx4pUQ;v*wnybWW]uU} ʕ+ۣG8۵f͚VT:uZJ\(afSO=0l.rZlYqyڵ);wJR ڷouboUG=ؤ!F }~MZfϞcoܹsvZ[x5"[%3">r2[]vZx>L}-ovNk׮T;6o\UPP~I߱M6ל9st5&@EA&f; Iŏ8ׯ_ N9He ){P֭['u؛ȄF F/bO:#VXP/kDu5ה}iR;vD}իu7}2iQLO035kL͚5GaÆ{ 7P;P޽էOH $ ڶm[Fװaè?sOQDowߤӲe˨իKYjUT[j˖-SNR%וW^YEvQz8J%~tk…]\5/@CPC=TNqOcmڴI~mk%"|dǻn->Tvr",4~7r ?^{4h D=㏓ ?|?T?Oo5k֬=@P={;(.Znׯ"ޟ|I0ꜜ} Mt~} DM5hܸqTދZ*k#GԈ#ttTa 4V*MNU]Zt衇>('($ Fu6TҿoxGVZ7[l/ .R}駣]tI-ٛQ3fT@~~fΜY\>묳s+ ՞{Y իf͚ncVj:D%R9MPs@`[U֖Ew}wW /P\#ϯKjQu_|q]ks%Ϙ1#E3/*x 7;wĉ?;찄~]*j!WvtN:lذ!jSvv-)zr۹OT|W_}6mƍKY^K~Gh׫W3lID :tH͛5vؤ$=vT֭[T?O}}ݨO͛7/GgE[hHJWMcXY TK" 1N#8BvZTu]:s=z]v%} {ה_\n׮]͛7_\^hTL{s;gΜ{%ʗg})~oT9쳣O=T{?pUԙ}f|DZRZ;@cE^YM4s=ڵk׭XBݺu5\SfRb֬Y:묳4xਛf͚gZӧ^y啸/X@sL(mK/-wZ\vwr)K+͎; /T֭ӖiӦMy&LНwY~QFڵktRz˖-瞨}Y~Zvm=ܨ.LZK+WcU޽c;bٺ գG+k׮Bb) Y"PMגBd<O}[nڵϟiӦwމ/ܩl{'*Q1|p5Juh֭/4cƌ'乹[K(UW]OWJ&5Jᄏ4iⶏ>hS7p⺷~[۷W^Խ{w5lPSNɓK,x!讻'jĉժU+uQ{ׯ+WjZpϟ_"ᓓ\۷R۱cyȪ/Kk H#w&\7jȷogyN(d~e޸q?syZ^nn _o~WI^lYTC&WO>9Xrrr>({):>`BzDvߵkׄ>M7ݔ[nbŊr=tШ~r-Q}̙p̞=Rk 6^z)eɓcc>ܫTLբ+W,~B z =j۶mB}L{>jܸqb^߮]wݵvZ҄ tW:^zfϞI&1Q4n8|嶭_nv}jԨQZJ͛릛nґG5<5ҕW^ٳgkРAir^{BwO|@ʘ{~F.=CY(dΜ9z뭷7ߨ@SӦMլY3uQ:SLoSN9kذa۷kرz74|-]T5R6mԿWyyy|3gԤI4m4hٲe[Zj-[UVڵ=rom[ծ] Ƕ`+5kfϞ 6yjݺ8 ݻ85k/({e˖I]o˖-Zp,Y۷w)j@)Hƍ%n;찄SXX)Swѷ~m޼YM6U֭u 'O>Q!gΜ9Qks1 n̛7O+.uQ[nNիoŋh"-^Xf=C{t#8Bw\ԚUQaaڷosU=F*T3fvЂ_gϮ%E]Yux ȘϽ6I֭[u7g9oƍ[kNT3H$>~tZUϽm ي@$B\qںukC~mtTKFmESK.bDիկ_?]j?f1$H@u>)*<䓺{v4h#pي B)w*inF @m߾]CՄ "H%K!"vsefOvءs9G}FRj=QGU\{ウ X~_BgiPWT7h =u]@ukΜ9 %uwY )P*3$5J|d/tXnnVu5PސtPd}.]t]wo߾ @m6=9r/_.pMY PPØtF{:uҀtYgSN@m6M8Qcƌѫ&% 5,.IquM-ZPբE 5mTyyy7jѢEZx-Z hĉZzui]'i0I"5HFJ'y>tOv 0: -8@R?I{e7"lIJzݧe;@H@Yc%*iIGsId14UI%- Z9eTY$̬l 붰?<$lҏ@ @ H$ @ @ H$ @ @ H$Zg;vFPӭ@F!^7] @t_4r @t_G$  Hj4w_*iCD9fv[ S.J$YBǩx$YB_ǩˑ􌙝` *WL َ2<+2IǸ }e4i"i5PHGM(lLi$AQ^@:Kz;L#x;K͌G"EΖ`@pe r9Md @$: ȟi H$iE0S @IE9 - ;d @$;HIYTIَ0T7ӯ1$m)+J6@oIoY J$%*K4!\l*֒t1}IzJE@ ٓ~W%5sˆ- g w#^c%#i&63$v )Ib ʚțIrz p2I%(1IK6t1HfvJyO*Iŗ}PרP2' HIZ%ZR54SRpoD :LTS7~% z@u@d_ũ{)N]wEҳbIYTj$AX iJ}/4;gR@YN9gf-%]' I%~$=_9AQ>R7)4qz*%ݠ7cʗ*8mS̆KzNo%xv4BKfV;H-T1ᡵ'H*b{qf;Ȥ^1i{nM$Q(]ҿ% ^%ݯ9M$ݓ0K\%NxKM*4@ =A,݁ 1G%uQfB?ޏi7PK96WGy[ aL r4t74wߔPcSC|ICӘ zB'XOZ >?G3<$Kz(CIb(G3{141aI"6f% @sz"\[ҫfk齀F}VEiqn^ʓtZ+ =/_Yyw_!xI3%E@0KRq>T &ixBJ$}BW4> I{Ɣd%ƒ?&_1q[Ւt^L O? ݷ&/"'Y"k22TqSId{a3Nl Ů:q$Bk_'LÁGTRw mX#@5/[pUWIYESZR%-Hax{"5nD;:wKn1ݽ0oĔd<2Dx$@:Pfv@B> 7+_6hSN(yQɈ1/x(2Hxڹ۾>2ً KLAbHvyVj6Q c?'?6 "@5J|j*i7R)/vk7T?\dd'#vGV/n+U ~$}j i]P}SC6ĔJ퓱>$nƶ1n+U )w_-v.,V[f46)J$G ld)dز-$$ ~B{-kI3hIe)b^L9];ҹrePsBw.U%M3P6I̒:$hG3-ԆejLgcOD,25%i$=kfY6@C7HeOjf3$(mf>i,YC*wvjf}hf{K:?T }HPw!ވa᧊@/>cfɞrvI$JEUoBDU-IWr$ݐ$ݷKz2 vV.mJF`3;3H %HPø6wsa4ί Ic/9,IJ%m(_af8{^i<13+]P =W" i!>>t(Wn4[%^ix.Vh"Shw%UhI+$Uh}Ijxݿ5{zͬBS*wwww+fIHf6R w`f$u 7,4銱"̬Jyf>.43;6<(O5% Iq5eU1EҙFyBɁț$-_ i-1o*4!%^"ǔ?J@@N2&[mzuefBsZ /d$0^P)w0H+0xV| }dx$-]Nϴse5PҤ w+3?H = liu UO wW IjI$c8,bEU5Le1׫h;r{4cefHL҉~Yd%*-w_PMYk"BG+%sٌ0B7 ܽCƘ~ZHjЍ+^fǀ0fET](=PU2NQhS%6MQho!(TP6)! !W#?Ad@fBO<}Il11ڹ`6E* 1 Cwߺm_K+i%W(|Imk"YHY+I$u^R^&iBCf Z^9WٌH P))* L [E<rVl_s$)#"()pB+7 {+=oS@xu$iH7 Y4NݮY 36I[#&25 P*h$^:G2[P3c@ʸZIk%IoxJ,Y^=IG^^}Me5 )CX-7fxI:ω "@ H$ V"Y{I]#ƻR6tBD]b#i@DwIj.nu1 afM$JR^[}GV=12=%)PI%՗I2IK_{~FTKiC҇U׺?㵭paYD~eߑ7\:&T"ZI7Hڽf]/OA8$)"tcff触/4Qvi (5B7.Nt~e=$^wߜvIDAT\$03%.WrI5KS}UwKQ_fv{%D}$!fvS!Y% e/i д O0DT}*iK7.iIu$ Af֛$RuJPI-&Bàϖ$.駈6H)Ua,|snc7$MqEoYBg#鸈>$lfܝ jKSLpowjIZ(T>WE]>%1 61xo ΧzٟX{IKz 1"`DS"K%&U}?<: 1ǔmUyKjv_%SwVjB182J$ޮB,jvx+½$"iY3: }oHZQeY]'i^XEO'=mwٿJHD麐*U7${#%]{77%=*l.s2ڞ#i@Du0^/I$!i׈6k=Iw ė#;V#lBs)5튜[n'NWhQHCIHz7qFFTt 'iLy73_mH bZ%QX [HIToE)%=)i%o/JMHS{ ?ns[ ,|sJLҵ.3QrD 3Shj,O fvRJF;Vi K tXN%*mLD3[,zP%o6IJ +OZ pbG wf$BI۵s[]$=^2lWI%RJ*yRIX^{E/w 5 a+g9yH'(/IIz)ϙ*A6ݩ73pBwQ(i0fֲGFmn ~8Te \B[RϒTs%V(sBG1IY ^(:>y{)J|ULݬD(kf$"3?I%MwlW.>S) ⽕ P5%xf<Ϊ' ( e+l `1A `J%l7ڈR* R-"вt?;g̽w}>M{yΝ69=y"RJz}6p^D)a0ا82N+x86"n +RǝIj# Y|I|Uv:"U`mI GY?.&u#u nAz<xAIK:V6]0y8(7(_^̬;|7"&kEYڧ_κOl2/bDݾ/3Ox"5&G*[7yE ٘TLY%[7rED,mc4Nnbs4fo/u:yvh<"%% =I"%Tt CII;j$0̬mq+_S(;O7*axM5Q{=;u.Lڝ~gMKWH3˟""bV/Y-"A1<{ntl:ڝwb|5vs Ey¾\ƯM.HdR>s#bDe ffffV%붕y ۲[dת d)OJ8wWHHF^?f>CIۓrKd"Y`ffffpl^}:-7@Fe7O[NUZ; ʼn:w+ YVxD*jyjWLps;pN;=>V<9Iڀ'U]s8IHwPlؼ`ffff6 _g%2Q䮬}BמXryIƒڽ: 7*$i"iccDe ffff ,!pj;m-uFh<1MRl̬-/Y{vGcٿ%IZIښ4\~8,"yZIIZggϑ@ Ŷr¹TM1XH*3g&͜ VKPG6:+뾲ІEҖS""\`^0333v|'ic$Edo4"ެ:,Ir\'xQM_֔ڧK J \Vt]}\^ث*b똤 R{%M;-UiVtffff6L)^$"/eIINi'iP,"%<M?"uI;'_\Uq{M1 @yJHGHK1f/TՒ'X^?#h~df(\3{ (m\9P%QY kKZW5HDv.ZC_ oFM6&*^%E9Yb p3Og$=A:Kl1j+ 'u9Y;n'%l >'"2̛R8Ҥ6z{D|瀥 ~]Tz﵈H@q.@Mޘt>,Wٺ;̬)LzO&И~/ec("MNmr6+Iq+,l1>/aŅE^F<}:Yks`*piw _Gģ˶/}][bgȱH:nҬ"b&x[<@J2Uv?0bE YEI7%M_ #b^`R\"bF5v ʙLjڥ{#~M$U.xobq7o3333XIz:jFKr4&L[7դ>oV03333R;"l̬GHzOQZiݓ fffffc`yNsIoSJ׮ml s3333޳X-q`oU/( R fffffm /G]j$fffff=Bx4? 0"^ZfV/(I[[ =""^̬z^0333333`ffffff`ffffff`ffffff`ffffff`ffffff`ffffff`ffffffuʒfJIENDB`3Depict-0.0.19/docs/manual-latex/figures/rangedSpectrumCloud.png0000644000175000017500000026615112640746376024156 0ustar pcuserpcuserPNG  IHDR;ou| pHYs  tIME,3eQ IDATxyxSUwҽJhl*l"*8:8ˍ⨳eq\]\pAPBR辤I~I4IS(y=$sO ~sLy5""""""""e!-$LfFFDDDDDDDINLNv6e۫(^}Z|~^>uM /ěf5"""""""_w:]o7jUGvz2Lr[sӻcJLH1мd0(0jVDϚ2I0'xӛ~Y=sV7?~FZDDDDDDD(X*<)I]L~y(& bG} Jdw_bYb^#s0p<{@e$i R4"""j$ɤKEXrS8IǥcjG}H <,9#WW dqમMKُ5"""!W-g[VMMőN8l6H׮M||B?az?.Q-hjl$3')>"""{R|c9jͬM_Hrяulۭ1Lsqf &7q&oر۷raj ղl3u5vI{v/RR9mX) k9ݺRȚuxwp6dSZ22MNvbU[ JznҗfϿCFm[KەVLss7x챰DiÊ+H~1{<&*˜C܎12S^{J\xM$<8i6^VYeAag^yTgWIDDUQ^Ƹég8 &5#iOv1dtb6IGqYrm@JZ:b&+vHK ;fYY)۴f'ݳr螕 @N|pfĖfRc;NgII)eݪed ;gxr -S_T=v쨮%>..oߡ5kH% y=4Phu&2řshA9>0kq<PRP_'gNz*X8l\6nRHNQȁhаùdGF~owI#+3Ҳ Ƭ9s9xP|ͥ+͝3ngѬZcƍINJbɗ >qGc6y9od7%cلl8YǓ-[x8)d7L223 +""ÎzHNNYT)Dݒ`yytF#wIUN[Mc迩$Vip5K xYi 7\{һ݂yYg̨\3yW__)TV~?u%%p̑cqrUֶ967?={з}z}L[Ⱥ1y80kn}::Df33Z{2y8b#e7yYl!]kq:lXb&;6f-[Yq ]Ea۫IiJ"%)8HOwFq2@z<H'7Vc6mI;Un\MC]+)<̻h#O@|zyQ NmueDDDdw^k0~(kjyշHKcHރKHN]Ҙ0J8\.v-qH䳯G9udn~u6:d`_?F.r[ʷo6S0 .V}4h?7-GtkDDDDxo@TnqmI0X<$$a2yyj~$93?@~\\&tޠ}Xb5vMIy5Ġc3h4%g=v*(=}KeސG} 7@n A7;Ml.ƄǓܪ,!7 ܢEqz%7;^c0h I룈\FRRL ;᧥vAq֠*IH4s WxÏj\Knzt <|pQZQ{FWJחIiJyYx\M4Vnn">9 _L&u0'*""' [f4,4dq%%y3L8Ni=~tJfd/0L3_}YeU5?a?#KHUu C5Uk1B~ɜr$+kz\.? ngkWЛYbrs8vXGA׽ir±|4~y=+c5,XTζ9xf]@yM=v 2  s5;d5A"-x ZxHHt12$%PP?rxwő=EDDDf:Ca#lS/JyM3?` ߗ&;*q,>7o')=ƆZnk&7LΪ5ٱ2?ky-M@ s&7LIGcQhnvHHoKA<1ˡYl%eUeL ;DDDv7ӔoX6QeR n'hAx֟:lne~&kְuC6MBj]KnfLfFZDDDv畄Nj qmfdܿl2lN$!! S ?#6iƻЙ L]~WWtL`e9@+. >twiEDDdPûKj׬"""׉7Dž_<48sB1U[y/́jdDDDDDDDd+htDDDDDDDdaEDDDDDDdCDDDDDDD+ ;DDDDDDDdCDDDDDDD+ ;DDDDDDDd7IwNwHЛ=^QS!ff"-[& <.*?׋]9_~Im DBB.ߤ޽|6kg,_q蘖QP'7zښbjgo7re[o|ƒM_zrssm-+vPl,DcCc].7%%p]mmXǟr6l, s}q;*+^osڼW_cbngO}ȁ-39r8n妠***HIIzbٲ8N Ljj*?YtHJJߞJN*(-Bbb;է3ƓOYb 9_S]]'MisƩFw@}} Kn7[ټgf,ukm[466|JzΏJDDDDDDD$|u:~׬] SNos̤3~? ^t)#g_`}q1/ ^~%3zd۷ox|-N88Î[q6,L8իX'f*&i|3ukz;8 SNgӟJ%Rͷs?{<nq '4kٳ?ƛ?%%%y3wwv]AIJJ.`x#suWp޹pvyK}橝GRZ ۹8h;0w<Ǝ)aG1ݸq.MX]?x>x?""""""S:kz:} RRR_RR…8r8.]ҥEcc+Vҳgn/uYf-.899ٌ;f)--CsQYYEqq1q|;oqc;4p֝yddx=B> dNʎ#s☏߼Oك?찑]ϡ#G0KۼԠu$`p҉ͷ&ƛos"V^2NǍ۹޽;Q5apo=ܘ~4;++uNvee)"""""";-h^^ng&L#Gm˸"rFwgwgq:eeyɿuȝwJNNdN3t=_;5́z=ҁ:6n!GB[ss3uoK)Mcʔذa#9tE*EDDDDDdҚ y1 пSn&R|VXxG{Bz?""""""ҩ5K?kDDDDDDә5"""""""?Q!"""""""X|1K#"""""""adȈ>)lہc!}K^aAv{{a7m5b?v,Z ?n10wlнX M!"@ ^D$"4de5""%O[ AaKX0 BpX|nPhk8 oVcGn10 a(""gED;ZsIDdаi0[ oEo+3¶x"k𹾪 axO )0X_0J`?b 6,{b W"""""""1 #hIEA18w p|T_p(DRB,x(4-FضlJн8ðRdrTDnc("Uv̚jzIeGu$[蒖Fjjjt좋/˯)UTTpw$#k{C+((?䓧p҉S^w}ȁr}޺FxG$#4"Nr >oJ`5h? c ;TDU"+;^n.tIcذTWWs=%bGiۺu+uu֞妤dn+oK6s#mWYEDDDD \a)ΈV`7DŽ |!oҰr#V`(O]QTNt?k+(Q'ʎz^}5^xiƏvf*JK@fwMɀ1uSZ]2d0]fٲ瓗׫Ml2N'C nS]QUUҥERRryqzMAUTTj#}G۶mt:Yt$33ݱnc-UAႊpAB&*"+8(&F@ m'+2! ۮ_뉈Žn>닋yW{sА|>ft }_DAo{nS ~x<vor-_9Qw'j|p">edlvBDDDD_,L?5 #hc#b0؎ݰ% VD:7hGi+EK |!piOkv<<ңGxmN>t\.wsrssv<^||NK-#f^|e֭[@.]?IKK`RVVFII .XtK.#/MXֳzZ]p xn5=_)))濷3-##M8nx>̇[W#4[D I,!u2uK0Bp#ܵUk#- |"Т'* /SN {+(-q'ѭ[iog\=s/Oc bDmuC'Ta6_׿].\n7^s ⋸Ϸ+bW z)'ĂeV.^FJJ lݺ;n%Gɭq陛Kry0yྻ:>~w&_ s._ձӠA}|ӟHNNKl%""p F 6ðzۊqV;$"poB&KQp[А&rI{U+"3t=_;5e% n!!!=skTVUQЧ}ͦ͛q:sw:6n!G22}d7ZBuX/gE [n zUL9T} =-!T]Kk8mYmwN9_Bj*6,3X""{bqXb B@?|0QԲwi*aw5 ,,&_`]+pN ~wMn,"ّL~};tL233~f6靟K7\|<7ZvXǷtCC#кKʕRΜ#""`}paVѦ #b"X8ww]pB`#\xCv B5;!\@."CDD:٦Mꊜ\Pvdg}o1M { +Vol ߴbرa"60`0GV>p= vv4HWq3aD`߆B]Î9_Ҩ.jo2XbCؽ^{W ߟ1R3;[Ⱦ-a7Z״=<6&-xmbUF@#\v*K !"+X #񑦻~^,!wb:VDv]h\9LBuX gs3uuu8ͬ/._7|<$KՐ!TLa l6tGKEЇH -mTʎh!DPEF4µ({fc'5B~˞U󟯒HNNۯsACu*V""bÁѡXB 8Bpf-H=hs-@YdxQ!"";gcaոe>mv50>#""_qlz>kh ZD{[ l׊Tk-_Cjj_[uGZ'm?;޿*UdEީ<IJvavsDDd)ŷJ`xhG&i,v 0Z"!R }[ {f.h:%4hopm:EAIQpBYC """"˲YYv6G _Ղݰ,ASZ!k}PrN{[fi[m} X,@!"CDDDDda۰mm_5E{֢6|/]?nVf{Ai"kn[d5 t_}[x_綷Щ:e˫ի+s1tPƎ͛IOOK.މ'avi]:}÷+ xmu:eŷӈ?p %=nnx }ipV"My ]ûsh:_n㡇 z'믿oSN76mDMM{DDDDSðkt *H^ab+ %ڛZ;/hʑp)&%vwpSz ۹ED<@qUW]Ennn\.-Ç-jjjhhh ++ :***ݻ7nM6>Yr%7n[n >***p:l߾7Dvv6ׯgݺudggsi7\{*++Yh =oݺ.]t:#/4h,[;vpᇓXnwpO??9¢!6&0޴HᦹVdzngs`V/T ]54|BL6Qر&MDZZs=Xc/_)B\\YYY,_^z_|L>up]wCd9N?tڴv9묳;w.Æ >yVZ?2byMƗ_~ɀXz5YYY|'dffFmgΜ9ydeeh"~aO?xFg}h}?j(̙Cff&-^wpPYYIFFs%55ݱaK|vsgScʷjDDD- ,O 6ZH)+6=(hw׾0V14%49^nj"ȁS(}xYvm<\pg}6K.嫯g .'RRRի={6#F`{,&S\?fʕ|w}r!qp=ff͚ի)((n=?0o<^ynfnwıv|O,Z[os9#Fh"/_N]]ZLc-'~4hgu5U :DDD k t:Hh!vo00xWp%hZ1ޗ}>ĎZKEߙr)p/}n:̙͛3Yp!444O?1fFٳd"$2[[$pG1McȑxAoذرc'Ofdee1a?xJ*++x^w޼{{gϞ<uYyꩧqFN=T233ҥ [l=d#^/ӽ{wHII Z#))ZdOHHHGͷs9`ǎj2Lbk=%)1_M>C}&p_ϙόpÌtüFkXE #8ؙj_; k`mZ\UXZ,L?em.^ڦ?б+9wGwy'XbEIkr.L<<_D, nۿG^^?!+>>XjU_יΆ/ȣ>?E:r'""",v`` :…ᶢLm: {P"6Å1#ReE!oh[ۆ x gvݛӧS]]+B}}=={&33뮻B$&&2a>|?쨩aҤIWRRرcӧÇOoz7„ (((g :)S>:S{}YW_}Ň~?EFo_{Ř_mBM26\HCl Ba \?Fbx(lDz&bSLcۼQW^{԰qFrss֢w8۝?~x)..ϗ.]ڦ3f` 8-铜/;v,555A=3;Zdo4A.ǘ^ݎaaXZu;V>@*ݍ%p}BFc8vEC/RuGggn ""iaGGu҅>S4 =dggwZ{"Z_[=pz-""7 |&XZ6SO|Lh`૮35Ț# m[_*905"""""{;}pqXpX?X(SZX}SK|Ҳg:ݿ+T8&sߵ:kJ.5 m?$4ٿkDDDDDm<VjN#ioB_aTVj#/᧦ރZbCj9DUv|AD0+D`Chu﵉"LV6v[@C <>z" ' F:wpSwhU?T!" n_ ~XH}}=yyxn݌< |AR# d ݢ64p\nu=vB[j {=[b.x(؅c%=ܜ/fi:nq sc8p7r3OqQGjDD$CKnWE߳%%v^D6 ~^EaXcqv &KXNkBV#" ; VD&IǟbkY/ [<_tZV]ZRuFAAfsn߾&V^C~~>Y/.!C9,vWRU[jKEh({ݺUms"J _,EVkkDj÷3Z??0cmEQMV}(cSUjb G _tw.]pE屩d2xtACpяtMOg}|ͷ,[ZҰ=Ix0`o.: 9V-5`:J`FG$N+bÿވ-Vc"xGpknU!CDd/7NYvNg3|P.x9ـw}nWEcVYˋ?Mrr2/2w}%rMtr19_ADd?kn$]h'v_-(G}?i)cmۊTQ  "O[456RIvV֬]G]].+V~Err2: @BBÆB fOvRA5:±aÆ) ^"ZтXi=pk YԿ ״an00 ]"""Ofb"򮫱(ZƄ Gҵk:)))TltLzz $&&ё@ScDDCS4BCj6kmTkTd {n.a k8l5w#,1Zw)_ $<vxMEa7'>VLrDD""޽靟ϧБ#ifΝKjj*;vTRiPDDADzh!0n$A VUpBpAZxC{Ġw~h5/:eֶ$bZTsR\\d"99l,FѫW]pkY]? __sS8)\vUA;Vnnz3N'99:}>l(n-[п?KJx?EDd毈0">$4< @ÿjXBwv t$L k5IhrDfԆh8xw(/+bϿ?)'ĽARRlw91[oCi;P{zrssN6:"r`;j‘s<н{w8B rss8wc:z&bl%""LaDX4tPniٚ^889`v[Ю1vmYfohGcQYŽ3[ozժ՜ lL l`Ge%N'UUn!11̨DrqA} %%|Fk\.-[dȐA۶Ude <~{Fu|47;Yl9 ~mm-˖ 7'Ht%a?t5kr”Syp3.λ'|"ǂ6׹`{zoyG '?_wxqw߃\teq=L8ʝGٻeggQP'l[nӧBN(t`N-|Â-`cYnmj,l % -۰: /E|iMS"]^eZ˚5k:*zNp\yյ)/Dy IDAT//0l(~w1i\Gfq91T_gqK:4L&S""""rz射uCS@|>:o))]û`-hgh=򂢁JsCyqxl&}_L']vN CYrI>}mt:6n!G22k}<0/|l}|1 zξtoaZm/ުe*K4N_ 8B*8ڄ b>8%a ӎb+ZZT;$33sәRSS8ni{Yn `Æ <+_>}$@%D :b Bwl!l-86¥V6CjH/dZ : k;xx"x ׯ__}= .[njyEY/` YxVD $753BH%c|Pha8U!r ʎ 5zGݙcbIDDDkmSba8Z54XRk %:&B* MpiqQ_Hcͨ =ûM*t0`4EDviKgX" 8DDDD6mf~-(j@ꏠ;m<.RUI,SK||"!PEV=6@Lkve .!b, w-8!Kai,SV"A+Fi*.Tch C 9Z3ADDDv/6Qp󝱰gqE)"S-xHEbmgEDaH :2ed2tܲ+=3N=zw?[蒖FjjN{Hqq1)ЏGMl6t~}}w{?  ׋{/˯oB9}AG!4xbWu@M%/0pX^!J#^" T m_ؓOO7t\:=3w(/+bE}}=Oڞfŵ{oɲxҥn[RW[o9 Dڊ5Ѐ#;1-Hڒ0CF5ko`xo6=u< ;LlXjꊈDd캻ロ/"++߬\{Uwq\Ar)-݂aGe%N'UUnde,]v1fhVf>xe9A]x .5tرcK.c'MmjnoYn=}ϒ%KشiDD` -Y( G =V׏h;Yv\.`۱a/6J7`)*;DvC=IJe˸b>?`Р\r4Eb'g8r 'h>닋yW{sА|>~y1ӯ]ivhll'ACԧ>}c6o@fZ tfwΚx8q?acgpg̩ᜳ` z_}-YLʠA#vX"?{E FDEa׻{ozSO`{rSdGEQOlT~fTHc3ٙMh>ԝL0zMyE;fG|] :tKr{Ͽd ѣGw+i۶-iiiC'poci F{;!/îU܈i/NK 3V&rfҳ b <5i&_vlw#} Xr%oVM.x<?\M7B=w_DK0Ϲ} #澑;veǎTU7IJJ i|s9?y;_|1Y_|ƃ`0ȘяF9>=gei]r<׬aW_IKk@eee|?33ޟNzz:#/$ao'~FyEgwU^}3ɱ {8qq~g!? (~JWb+@DEPx]i#~@=)z:FJXi4[ހܬWc'4-z4瞻kvrkk曬]o'6iKhb?/?w̚=Ljh׬fxõƹn t㸷ޞ±Ń9S'>O^^ׯgt ᴘE)(LMM-K.#@,ʢɯU?F\{8ڵ{?sQ}qtsP7L٪Y)2Mef?A]$C8q\'󿨛4iz+7p+Wdȑ4iߥcǎ󭷍sɼ fkK<ƹN@rK㮽*z~***xdogԷٸ̈́(}@BP͓̽K Lzm2/LHNNsg}WNRS׺核7{l /GI0M=4yt4?/\Hٶ};ڷ)fL. zO~AABwafb |ֹ‡U(xmڦ{Uϧ$lp*pВ̄,Ȅ%99y_zj|>s_W3~ӦkmҨ6#q\p l޼N"u蜟w_Hjjj~ljkky7'+t>}z>V/1ON,]eѵk?MC< W5ďD _˄t g㨪 i̛-`([XXs7r* ,XMj4OfreWq?&p{Q7֭[Ϫkҋ_v KJY2e 3ut5Um[a}Xm@ӢEb74.ZM)^CBW" Hdphͤ}1}5=`wӣDpL;nNr ꫮ?m%ƛo1p@MI= >q(`.] yMW]+^cw?~=(ǟ06_N/ȨjP"DIcAAh mr}?~k׮#77t#cfFի'xeepNJ/Fm۶oݻXjgz3>x'\\y=hlظ: :w󥦦l=n>>}zG% eK999ذqqW̠㊩f0z >~m۶J]A]q#~v\2 V$3J(KLm(H?XU^( !C;!1DZ{&m۶WlMC*(ƫΟ1id8n]F(2V\I(vRz4m#̯5KID5z7%x獨4 3N%o)EUſCD!&-=@88p\<_xtB=aʶlᾑ֦ lRwAZZ_~ O>y} EA8ĈkSW1$$]ko9"?|rO BkFA޽_}r\.WDьwٴyuu(k<?rAa\C%Cqr4NbG<)EL=5t6bK<%T֎ ;ڞw]tϗ $Jх},'^啈&P'#ֹD2"Dsի؊#"0ְabj{"¡OM %AAVFqf"/BY#:bщLq1Whڥإ?o"CXAhءu՗'7&5#C.^A4U-ũ%9PT{cը4Q""_"AA4+zNr!i% ~G mþ.(H31ZCuE CQX;uY^WAhH XC03o" kSU P,-@$~8ֵ&vkN$WA "u XAb瑏T]t|Abbf6;Q#6C/jBJ+a<՚8u#b B ꋃfއC &P`ΜԘ$hy?hX u/RAh!  - vի4,&3Ov+yxŦBM&ԙFp"b   0l#2x^NY"(ԈRv{߰;YĎHJAZ/"v  B AUU! ¥D$b (aN|xT"Aў!S"2Uesx;~m/_@FF㷿>]rFAA't]vm<7n$33 z9R.^r  8 *4 NsdɨUƞQD.%"#`/3Q&6b 7`ku}LZDagSNo֬Y 6IsOT;ի3g P8_QQA]][neݺu#  5ի$<^Ů! (㏙e]CCUK UIAc 6SrE1uT ٳ#  apҡC멮weB!.bΝK~(++SN̜93,#FO>k׮BIUU|,\;vP__sqc:d٣+ؽ{\dAVOF,qA% 45"x3V"Q? .Jм1^7+ ˰aè$==}w9pAnHII$rss#DF Č3x;v,<\|MZ͚5pn:.`ӦM1h irvԒ!G.A#l~ῒqUVr޽j[Yn=Ƞgq ?M54RJV_m@uloY4 Fs.'ԨTU"=A8gGuK.׳aCXr0|pNmm-~+:̄9޽;+V࣏>b۶meeeFy\ۍ5ӝ`j>JwPHO># :,#d1 w3v2/GI0M=j7 i$v Ex4-fߞ+W2owh&]$E`Ց (F( `bUPU}pCto%#~%6+*D Ъo^J~~>`ݻ3e֯_ϹKzz:YYYlذ 9'L HMMCRRR֭s {qe1w\cn;:eRz5uAUVB#-9T׎J_h6>=g3nQ;z֭[ϪkxO..JʶP]]S܈2e 3utNt)$=\hAV"tD "Smj.ƚ߫ JIp%\9(#FU"ƥz~", bǧ~#`lܸE~~v'e֬YCmm-ݺuM6^K穧bȑlݺ^zx⻦ IDAT,ZIc˲Xv7ڏ J\ kL[чiPU1ۓ|mRȎ~lx´MkKznwB{f>= :ڤƛҋ駵{Cs9SSS*vteܓ1ӘdggsFN=e BG,cOucXFTj죇|MޗFĉUȰi[I$CC^HΝ;۞w$]$777u_<Md^{<$erDa8;AJ0M_Mq/*!, 9M0;y=m=*^D=xWĦNEy1#͛7[R+`0Ȗ-t`ƍF[MMMv;W̠㊩f0z >~QJA8PUEaW&6hbcb,1q(SWD .fcS Qr aiM%7lKn' BK:Cmn<4._:ۖ?m&&b?~}(w%;= p/̟ dmXh1={ ))٨Q^^AUU5;vo"<:Vf޼oEGܹ+aÆ^((ƫiB!&MQ1nM]$?B ¡.nX= vsF]>S׀Ĉ̰XkXSiXcĨT+RP953)nJ7!=5GSs!3-UU6n T[׮x<Ŋ+Q|qС+V{C?_|9+Vrш?pru7rG߯9G{r' qǝw 8Oo+*1;"%Jx/СC/^_+ . A("s>G=P-[o䃤iCzF:[s]w&?x X)#6E)Dc43LCuCPh Ui# ^T(]P1yr*ɫRE;Ah{\'& zۍ)&kTWrЖ9 ߉dAֲcNv$%%Ay4F>ȹş/}?/>FRWWG0dG#?4.qk0端vפ=m*++#񧟙tty\~% {̌ymuc/Q^^";;Ii&DJJ r♕Z1AA6U%ޜVSQ'%@lAUhFOd(1AD<{S?-tlUSWPUd;%h! M 4Sxpd^yy"yyy[0޻Yh1Neҥu@=geDˣɯg {(tNm6n,v3ab̏>z P(ssr%&6&L$''{﹋> 'ȃ9AavZ򣪖`/Xۥ.BUHü^HX}D8EU""LPAAȮzx\R܀ kלqTEa)FM]d>XK Nvv6O<6SO?!' x1M0ĝgȐ2Dx_?79وAao}{wQ vJ<=A͙HZ8tTcB$f/,cMևb2쨾w㟹_7eC=oYOtLnZ&S\N|A aÆ1uacoVzaƹ뮻9sгgO/_NNN3g$;;0|p ė_~INN ,੧[o5?ݛJ溺;Ķ}+O'9)ZAAh↝z#Jo5'MT(pZ.BOI'( c-rM-7v)@OR@MJd(AĎL[yQSSömصk?hӦ C5njC.]B\tEB .\Ȏ;ᅬ#33N;;wqFmƪU wosO{{>aQ__!M>9tˬem*7oS{Ӡ]Z UuhCmm-n 'IĎȟG>rPW"Abkݘ4m۶eee,_<9| l\|žrܷ#Niz  C\.<7n$‚ȅAVpЍ:7F1>J6c#EEHT#C\4FsF彝!vLG9Q3A8T&{xǨ%))P(իXltQQr wy'^ѣGر7.TiENNG((Ltԉ"==:AAp$`jh`}K VeqZPJv׏bh9[Pq>" Jؽ{7&M[ns= 4#<:.I[ڵ"5\"##Y  ֨PXJΚbRbn6i|z.5|Ě/bv‡JP({KD8Oyg"eddPVV7 SO=իyXx1O?43ϟ?+xߦM4MwsN,YBVV]t18͛g  4%hĎQ.^3ap)#}^%Z>|p+a'x$"tlN5'77fXt)}eŊ;~{ " 4S L.q@Q  iS_@ zEkDߺgU)F w;ϡo8aHiwMἧu)/ !$D>}5kͣcǎ+wy-f>!>.K. pHS |aH.G>T%aRy;1ĮUbi;Bj63 Z>`P n@t$وVa$ء fc#RVD#駟n ң ¡nL84U;B8hk0DT?ל(;ֺ^MD'v"Hb5C#RAAAcg/Ӂg>w32HT.rK՚E }!hKPsQ^ãFh4MK1j8j,r.`S=A8CAFqmzVԟK̪%b6E,BмMܰ:UK~6FuX] Du.Ls#;B4!"v  2X!bGK)cpuJ9+G aG=ۥصGу/#Gͼfa:\/r [.  B롔Ȉ}BTT-v`.k>gPTXĉxESC\/[,tSkyX~AjDAAh%#Zp#آp7\JIՔuPTgI$?G1GSp袇Yp6Bcl{p0#i,{ϬYؾ};]taȐ!q|ݍ7IFF|AAHUz=mAK= 1!WiNU/ukN;8 כ7o&##*~'zAQQQ/ ,GEjB!/_Ά ի]t:nʺuHMM%77Xӯ_? :t 55Xoƍr1555ݛB/^̶m8c  |,keŊqWzQUM0 .3grmqFO? ~b3f.r{1&MDMM gʔ)\wuA:mWg2U(X"ᵵ쟑VbE 19" J}a'^!3:#F>`ҤI9 /)S_wutC2p@>>l͛Ǹq?>ݺu~;}#Z񐕕sO_!t$W_MzzQF?T̒%K. _8WﴋпN4sAۋGka=AQl9".Y *(@j"1f\2)Fv(wǂpj@s}5@+TxmaCBM:LߔZ}& "vj?|?|>s:,L_@~~~DΝ;SZZڵkq<& ~zܹsc]/t1F7"<:RSSo  D >iEGLH!lk8ΗKyPFCQ;*z*^&W1vs31ɡQRGWťY&Z<sSyUnEAsSTTʕ+sWzj=\B+!_}}=W257E.W+yfF B+,` _a~6 \M.,^J)*(VTEo$HH{}"sxcZ 9BGrMѬ "7 HUfP^^O\@h< !W7a,B^btU1ՖC;ZO>.]ЩS':vUW]رcok~I'D>}+x(((7ߤ|Kvv6w}!`lݺN:qSTT? }LZZC qQ9s&qQG7OAZ76[-v`'cHĎYkgpJh VQ@ H'k5lDjCIci۷端u֑Baa!IIs?+VPXXHv팶Ν;3c *++Ynyyy]v/d۶mlڴ]_Ob+,ŊD-z{XѐWՈ>$zDWk1PG",7YDs,STQAĎJZZ}'55#8±=##}VڷoopRR= ps?h]пv6=JdG@UU4?^"D/]R_蠋 ETҤh׆S߫$Zh؏jQ `5AఊfZCY U0~\CACbСtE.  -=&C;BlT*@x]͊CUH gAéUQ GZ E5%TԦVZVCdYY訷c!Axv#{9 &BA J IDATK6rZV_kdn5?U,"fACaUn{I䰦X !anMطUAAhe\CXH>C8Ef\/ska=ל2~>:ҜHkD9}a찊#oxC?A8ؑȎ9c^* eróa(,?Z-ZEũUP$ptGs(b5\4=C?갏awT!A[h^}dDj\܉>*yP{|8b{.Ų ُ=Cv!sr`$_p͋p#+^)k'h^%SC&J]sO xEE{5LPaEczm>Gr;D?A84:DhNBȾzA}G0Bp@Q"KڙZSX╢5M]pQ1RUP竱SVXSWR]E?<> HK+z@o)p$ -"-<8UVSW.D"8b68U h%4l=}ŚҔ4>~ChocW?,Z<0ޝilٺ__k",俁=jHAZ&#H FvQv)vbom\Q:.,4Dx8a3%hsR'^C hir\l[.=[/?U5,_SJzZ*8נCVmۤ<! RLI7c c~EdFZWGTIZ% (gU}dG=NefEu؜C9$c/>'%y薟XF}0dL$ylNYvyڤ$s^z-,Yiw";egѩc{vTbmiyi^ryl,|Nw$# זRWDNlڲ{q](#9ê eT|f=fC+wKd  BjcD]WCd0 MPD * s{ mʡ)汪WACO𢔀Zۡ͡tl R|# ъpC1>EyTqcڰ1_xXwvM<&9)M\.)c@"Jl%?;*xعXoRF*z+0xa֙i쮪ឿJMm1f2Յm;ݭ3p33w#\B(cn :'Аj3Yc'e%DZ"x  !yFmXy(aP*WA_aN]QLT $&zD ,~P# ]] FH=G bG+'v * ^vw]s>zetOQw<UյtL_t|U oj'i/ZekU7}`[r.f>E1:.=d,ycI&w1TnJbJlأ|*Yțqs#J]uj0p$  U J*X[ fB0bC@%6>Fqczeb‹7KzAbՁE䰫_p#  79cyOsϝOUu8cUI!;+vοO~'^ζG inw_;8q\rIxnzu͏o~At5$'yp$I]}+%cĘ.rwux̲5Z~)=}{2Jzvɣg<*DNF̝!tAAFC԰ЫX:4(63RP7jLvKt!F {%_(JgGG \:  } +w.2ز5zj>\-%9qo~\7?.=m1ۏ7_B|Rv:DE zj#<:ꃤ$G[wTF^IvтLnvhgq~u. G  B|^=".~ň0G`肈/ulB\.C蜛͙C+'M >p rG{cU4b8mR). K_d?Qbᥡ& رgXG;-JvVUq/EwOvUU3ﯓDNv)߶`(dyϙ#m6nJ(\oӸsϽaKV!?vh^[/NMj 92ٶcWOu:1_SysοN+.*AA an fU[sRE]EDUD(6y1N}J/r$H+mM9Cm]=6Wb{Сr77WD {J]}["XTԲU1|.vsxd{R!X(A D)#Es[QE|6Dv4]WM[;AAh"@#2E`F8-^EDJƚϛ#6t1FO+Xхbq'!sn={l{9qٟsr'IŽZzйs>_~ignُ҅ =CvA8HP`ő(0G`4zF Fm*4eN\40lFzʋ* D"pٸޑ % HKHĻ)B!b _m:KqG©3ŌU sDIs=GAhg #ve^B `/(Eaq F2zXQzWOO_4G""#8b_  ~ޏ D"b #nrAAc^h߫@^0 5Ӕb?h};4 O3bMײW xt ;AANc"('a6: @<{UV!+U:AE<;AA aNiяxWt kU~XG_$f/"+sZ (aqƫ$Y"BDAAAhfK(A*Nͯ͌Ȱ>Lc$a6Ah "  -{JPh,1ԅ]pp2=5hKEe.gkto0B %,lƨ)دOACAA"t)C8"C*Ხ~"> )LT|,AT5qcc7  IcAAJSS@C+jXQcs*8Yqʒ`3 XAh_\.  r]dFD5o1G1^ih~Wxu^ňQ*>Kyxc#>B lE82ū"xD\.\AA z9 ,81E%\E]( %r(y~Tz[< D5VWEERYAGXhAAZ/tVA0 clTmCiR[U13Iz_Lm"!`췵$eFAZ/ʡQW/1"F~^#M 4X۬BbS)Eog~olWQVA'DAACYпZċ|nNUWbUIIserH!Q$EAAZ0#éIbNIdNi-TH"08V1cݧ!=!  -xb] ~`CT |`  ."a^1ɣ#jM:ADv  B EU#K&by|Lg$HHdhQ]mV3Z*(-R3]P<R^[}klD3qYlYә=庯V+Y< !.k'bHg[BՏk|hLc AD1ADDDDTe0fADTZAb0QVxe1>xaP´k0!b:/Ab,q4BDa OYsR ̳L V45jy*a,tVy9VjF ciIVa4^3P恈DDDDDEJ+v_1Gn1RP@ 5"PYGl'lLr {ZА;N**3xLhgu6;W\"vf(.!"BAX;QbENR`AnpiP[KU䊍ں/Ҡ *.1r 2B$?iiF=<<0lNRԳ0nZOip)20PAf\vDDrAT,ew3x9ADDDd[' "Q /Y1lk48b)cpl",g%*Ju(BՐRV`'"Bp>,CDDDvFXk_ fΑ HEH Xx߆kAD$bU䃁KZGk߃}.:-BDDDDTĉ R#5 DYrP 4kD." vqZ B?Ǭ "r|0Onl{5aZCDDDDDDŐX+@a@h]XJQSâƴg}2CLe"[SFxR3$(UE`F)`\=SǙvL֫=Y""""balDXT\1`p0]b_hX jUR}^ϔX?Q ʃvs該չrG}ެed:hYYDd;P(8 DDDTi4չz<0 XjѨ!610]b)H"P:UZ - v9s"""z uk\(햂 l԰!O㬎5`P7D 5 * "{fQ1G0a/k?ijiF%-gfAD1P,4u1L8-Q @HM-0Q曍MR >h<._'rؽZ@E<ڴ툤d63zo]׺E1^""""7 ZQVF)@hU6Zj7+>4H,PݏV-K^ cNO?-G=wd pa@\,4lپ5j\r8w5kj]Til޴^^pDyo*V/]zC|0 J 4x)>=Q2IX558V`:̘>r_m_W%dd^^_Wr=vFz:|˗/՛}{˫iP`%""""DY`q40bZxR{ZHG % bu=unE;T#G㋹_ѣD/_R^'"F>kؾ}c1ۗw5z{y+< >[~bOpĞZbGZ[[K۬ݳ{˒#X IDAT[ojj$$$[1mڴB6kbGѮB^oq՟CժUe6*۲uUww=eHAoGppFn8y*wF˗ݻw1s4xxx0XhEfutyY٘;+̞9\ݐaCØHǍ; C hզz}gKܩ#?...{.>9ysrGV_/QA1b!62crA1F/Z!pyJHHDTZ #:wbbʕ斧FfVV2eʘ[n׮e#oеku6 ::fA^"zvۍ8\|ؾom~cX̗hgmeuı#,uQ1ߞ-(hFA"KA }NNNk( Tb3W]]]QV^/ X0̠P PjX&e憥Z+ކip9 ? h4$Q"W4? X˦0Kgι{.၌t\tU#88.^,ԩf4n˖{o%c˫\]]M!  BL\t =W kF!)1Օ'"""I kob@F{,1R*AZV.0DDf}X"O( Kѫ[8|p/0$l8 V{ 8{<ƍA5 NNƿQռѶmfl~dtczyAV-Gq2(*T(!aQ~=?^^p.={sHJNFrnj"""b0(a-a+XVjy ⣏[܊@%)Y)b<( uI׮!))9*m[f-^}*U򑶝<͛cX^[nC#|4t;wlŚ+Y1KGⷵq':uuFsӱm〇fFmC z+UE@6;rfsBDB v;utV qo / MC cFdin.\ą T|r|CXtlo|1z www@JdffbР{ҨK⧟3 $ )h3^:Y" +աPت!cY"rT8^QZ4ofts?_CLL,xn5N+oʄ Э{o^*H]]]fT2Ju(`! (s3F rԵEnV!enʖDTP =Qjh ߈]A~oI;Dw?AN/>-, j֨^z` y#` )&"""*L D&7h4bm\(PY 1#Pn2DD<Ǐ?-зO/oD\\{p ұ=вEsgs8z8rrt%7f>FCBjc_YYYP3?DDDDIVPG-UxR6,JJDT۷+^{woW:wńdtϟt4oʦ-1Kv#00 @JJcGhզڶ/`s 5ԀV (F㙎o\\AkTaU8lذ jDӦ#UU1Ψ^9NQ)VPOjohV6na=-bC/VܞK1eժ5pusÂoߴi(NA FS@DDDDT5["cZXLk\CQBDGDDD_q䖔(Ֆ-/*T ^j<^Fy v v( X>p8DDDDRC 451Th0]ci{ "*;^>#""""*䵠xF)X\ci\V. 9Ρ`Gz1*]9I """M `9#Ôy!XP:vAJuE+1 n9̡`y9cT0@DDDŒb"{%`1bi1r{4ADE z=gá{ _b{4[^b$B<}غOK0"OgI74sJDDDT)T@i`AGe.b@Z-6Rr0Ã˅S@DDDDTV jX :]"W3D DDDDDŐaGkrS eb( 1bkFaVNQfoV1 ^4S2A#@F)@Pcs 4fvC Փ_vf^2 JNPcluWQ++DDgd >#VH=&%R*{* 6|sJ(vRY窕(aW Y{gV4.cBW+Ξ6"""̞ DJ@'Tl xcn3}DTXkWΣvEbQIdm9DE-m g 3;1ADDDtqLA6Bxyja+ȑ{ {$"*L vS!WYm#"""*mL :Xi#=; v`޾b9DDaC=@xakآV%XѳfwcyѶjժa޽+0Fǣ'<<<̋'m8zp/>~ ""h4P)C `t,!"*jvlظ qh%i^z)))sA5 }z-wOrL_Qq#:DcCDDh焈nӧM1ږww!;+ W2KB:!F'YYYp"BBjI~bcPByԩ'/r,{o赉/!88AA)%%/]FpnPΝqu:ƎNNHmOH@J>Xˏ`u|{O6$l86l#G/^)0xc'xZ5YP^'{&""""zڮ]9ue=mDD,q#:m?q8|www-[V]Ѯ{&"*,rq4QIU1 zyPPt:lN' mڴB6kbGѮvozO9"((?@vݳ)BDT ǂpDDDDTz?/_NвEsgs19pww^DZc'д6nj̬LԨ^eʔCCP5=ݧТE3̞9f}:))v3 THSa_@> @MЯn "#=[ūuiK|ݙqqw[ЦmGtFbiR{Y[ݓ6G}3KmN>BLDT}"DDDDDYΩoJй:wbbʕVw_=v3 Pa\.o@nGB| }K2fvɻz*Ο?=zm_r% "Y^jӹNNN\hŞ={u:j֬[nab5F=$vb!"*=oߎ/4ܷo_\v 'ODhh(^xNh.Ss8z8"#ObŊر=')DDT2x7 ­[n:i߃8aDT)رϝ9 7nƍ328WD]_$Q1`y0i$ի1p@yLL ׫Wϳٖ`ǘr w > "*֭[, 7Rzuj U,_Ep\v jODVyKI*pWTq (%"Yzla˖-1qD̟?ۣGMDvs\O@閭۱h,ZKC6?ضOǻTyDDv2,Hi&+@ddd{|! vp 1ձa&ر pE7 Hx7>)))v'FtIG޽|rc7nX'ODաP(&M ʔ)5kZ;v^ 0tPm …xg_DhOiR,\z P(R\\r:z(qpu-N0GƘ1c 26l͛͂t邝; W\( (( DEEzVL,]+V9r$,Y([,<==q}lٲ[lo~ -Z@NNѹǏϚ5 gFvvjժx嗍N;9?nԥ&,, o>th|ggg"..hK.۶mC׮].ߐZDD%oTiS'f_EgΞ+"|ǘ01vK/~ynܼ忮Ĉ`|pBm fΜ){_{m:w2e[0z^%otN~@ƍ{Xv-;l:$W^#fϞm^zذa<ر P>wwwTX^^^Ҷš^zXxQ)55:t@zz:>\;w["b4vZFt:5I ~4i w{[؀?mF֭>yz=&NZja̘iZb@"";3 ,7k,ԪU G1޹sgddd`ժUFG<|vBff&'KOOǡCgΜe.714o+ #"ʇ \|7o6ʚϟ7DeXz5 ##l ^Fc?*X IDATΞ= ROSA{J{R_a{cԨQ"Xn=I/{YS/>Dо][}9S"ၰ!wOΝ^Aݺ/<.00999{h@QsR(l~i$""z ^ƍmРQM{Rh___lqƍ'?sS5jԐ 6mڔP)bq%~~']_,zV/V{%.\^z5VLl,ݻԔTN,ybqbTZ/X}f}:: .BPW8y!<<\vߩS0||GҶ\ʕ3zo>lsGz,Wg o͛7F7TX08oTNDhq1ܺul񈍍CZZ:RRRp ܿ=rgϞ㧧'7֭8y2(rcz3b*..qRJgN [z܎Ʊc'u:zjvRk NDVmѼe[ܸyӨ0|? _|ؽ{7&Ol5bĉfb/^u }F[~'4jԈo=5E.,0 ;{%\/^V9{f͚H]z{cزu=JW>_WqDOL) _Uøw>ѺU iS%`x"""ʷ޽{'mbcǎVnܸqqq5Dq:uBn7`ݺuСF7n91w\}*T`4Æ 2[ O_Lum۶5 _XkY3qdˆ8+SP䖱꠬[YT޽zBBBzywAA?x%&ռYskԨxxxHV#hݺ%>>HHȭǷzj k$%%APO>?s14o\zvZqzz:nݺU-{eO懖4;Zl_͕w!C ?ȯvsu&K ksp`էw/)h%.oq3"*[,RRRCY stuuŞDٲO>iiCJQQuW\Ar吜3g`̘1fUZfhܹ;wYfI&NJٲe}vthI&{/Ͷo޼!!!FZjEaѢEFۓPJСCQbE)1fiwޅBaۢE !Cl2bLqwt( 4hC `5ZD,u%23u۟~.;uddd^HHHmDFoHlٺh6P%8>c38wm7 =ADD%WڵѢE 9r@2T̝;ڵ+T*OCll,___Y<~ƌ1cΜ9ݻwYfHNNkf9۶mC УG@z=֬YׯcV>lmttٶ`zl۶ gϞ'ڴiFa֭x׍@-ߺuk29Z7JpCZg}5ׯݺK%Gٲez.X.wfǎU!_ɓ&`cqN 6mނQ0˯nnnX/aRMBnj"mҤI4RٶmhWr!4h 4(souL֭ufWP8'¥6r~}dw kW۽i{.3PZէzӲϝ3g:ǥY^>#YYY@-j ##w'*U򅳳'~|q`n sv|{?[j(N8f͚IϹdJxbЧ}.y)S5ڻfd"""""B) "*}]mN| /I "Rڕ]~yyQQxb5l}wʉ"b"RsxF9Xl_óEDTKh$Q`Q)ԺukL3 """""""""""""*Q """""""""""""*Q """"""%OX[ gq&O1c?]v|R/_cطiC;eˢZhެ""""z渌]ػOkbg0fP 4l'|^z ܹ3') "h%; pm "#OCl"XTXժU2?Ґ ///@zzw|+2[UVI+T$ݻP(9YDDDd3;(߂* <}<7KĤ!\OEưGJ.]}7gΞEXΗ_~ ?L>-BXX $$EDDDV;cոvZ`.. B㓯qu:6oތ{"995kD޽Q~21111(_<ʕ+L E>_0eee!99iiXa#\]]K ÇejgƧXf-T04z!!:=Z5k@=UV{M4ןTtҥ #} cΜ9,"""*ߙ˗/ׯG͚5q…<:@R6l{CشiS7xׯ/o^wQa۴y ڵ1B=u7`UWWh';4h""N"'PJ9rpqitt4.\WWWNnڷoK,csa"!!;w ==]v'8s .\o˗QvmLDFFf yNNn߾-޽T}:UX/" ""!!!2d u̙3ұ8x<&&UVţG*ƏRp#iۤIpIܾ} C OQ ضO0 GMEN/S 4{ٲYܥ-iiiP6i -fϞ B0;ΝÎ;CP`$"""ɥ  Ŕ)SӦMÈ#pY#P^=c֭Gd Ms~:V*{Lll,\\\?[x\ce7b,fݱmQ#0xP$%%#88NN5z޲Es:\J7 .TT 5BLL bôi8aDDDdQ6*YfMtK.F  vXjTlܹsG%rMRSSwulbՄ(*VU:L-\PZz=޽Ν޽{z4jԈK1HVVSN~09r$K:u C :W_}_~sΕIII?>~7ԬYJf͂^GNN>RfH;wC)((gϞN㧄)ҥ79QDDDdU,cYx1/^ B@t3:[n([,:w ___k׮Exx8N$$$W_ł P(b AoIc|'ҥ 0f]aÆGӦMq!~Z Qpp0aÆaȐ!ԩ_xzzٳ駟={Z?=zX֧~ |SƍiӘEDD+;vu\ZZ1bիzh$''Zjpww׭[OFLLd1԰aCܼyQQQ DK###/[ѲVZ… =%oFJEI- cӦMP(x!ԩ#caqIe zA)bpZJ2HV?I԰~}!>Wؽ[͛31mvs -@Wڜ[="Y@srljUԥ ϔ9>{?ƠGWlؽ{7-[um۶+rʖ_ BBB '""*&߿+W_~Att40(JtƠA)Z VzfuQ{*,^e˖Ś5k8DDDd.]Bff&_3g"88˗g}I*_FZ*'svF\Qwf˱~zԩSxѽ{A{ԨQ1b*T&MѣG;vSf͚!88Iz_DDDDEh""*\R}ohܸ1:_~ӧO#33/"ʕ+'{]+WD'OII%Kk.+vNg6FZZΜ95j3Gk w5ܹsjB*UÇCc]roFŊ/L2Qqa<4UFۗ۠F"sRhTgãFqAAPpDDqmTDoAf\ŅeE1@B!aISN'$\r ֯_-ܢmnCQ12)e e$''cǎx1c 0aХK߿FQF{Ž[E?w8uW_FiTc"3vvxxr2d'Rm\&Bitbǒ%K( )%L'bkbʔ)@-[n޽{Ѻukj wy'ƍnƈ#ЧOr[nΝ;ѪU+lڴ ]wƎΝ;܇L4 âE`Xt:q&9tK (**›o^zغu+^{5;{ŀsС|r7k׮Œ%KObرXz5V+Z]uUӧ x>m۶ضm>-[j"&&c?233}n+)) 7oƍݻe˖B˯ipQ{gh8Nvye6v 6}&.;vBLL JCSHSx嗑sb?k IDATB 3Q^@Ϟ^Q/*v|>_^Z' ѢE lv}cF abN>5=z@jj*'"Ha !F%v/x?%%`>;Tu]>|X{/++˰LVV~UYYYp805 >Çn… 1i$9B2@c:{S{OpiǻoyVwYKQ\\3g e4NvP$''!2'&>b!ROII5\iӦ7oNӯm9ssʼn'>Sdff/[dff. ~޽S#O'YRs*Xj6'BH;`ʕ())ABBz֭[7j/@rr2ѦMyxqkˍ3 BqwFڇ+V //HMMEJJ W9v: /~;,X5-!3IHNJL\\N'N6r*Dx]p_\2WźX~iG-BHBO@aaN !:e,_~D|8<Ѯ];HfXlڴ %%%Fhh(<@RRĪCq98q:t0txJ>}GnGǎo!1uxhcoAxxu5Æ"5]OL RJ,Y }\m^?rt萌RS{2r= 0q8 BR^$RRK!$BϞ=k~DDws0իkHɮX,tԉ,BHfAxEDVPXX/c<!xaKy8(N =9i|YD#2*OADD`==~b69AZ"o )EAz![S8 <@ !Cԩ())Av ;tIJw3g@B|Eסؼi 9) >'N܁v5Ox'xH޽{agv.ظQ⢋A!$4 c<RGƣhӦf5@ .zn,v;wZB 8NAcx0B!$puc)+l2l>BS| BHSx1sn!fvB!:ݳ:ݙJ!$P BH!++ 999 =XPZl4#AiԂoWBHR2o3Wp !ꓒ-[r"UBGŎu^;x6oVޛ}BHQ#?Μ99&!IB%%ŢÅkgƂ.!A V}9BH2B!R縗BT__(@f9EBؖ9'Bvc!f44IMp,]'Nݻw㢋.1rHNT#]سG4 |KpDGׯ{ߖ ɣ(@ aJ<dP fH|յv|' R^^o={_-Zc,]\s 6ljXEZKPX/&Qٕ@3'BL9tN *xtM:&Mo1w\<Ӧ8y$9A޳#.N|DXX cK-cq*VXB BA!#==pBX7x#+\tExWga9Ae,n,R:( 0p@dd{8iu rǎI`BdFm?ɉ uB!;S{ n#99qqq ĽE/vH nXWX D8xڵc GB٢6׏9NA!@Q| =ƍ(XҘc7(U_[Q,ov Ham+jfqԸ}.!)Ł u !4 6 ϟ>}ƒ9Q $v4̊ -'(WB6p9.%v(vR O®X^"'4(%BHPO dvÇCJz#46BCޚ!DeVX҂NxXcp6auG4O4!~(@XHmeO0SBfvB!$`|5^رcX,xW5t'ϷѣgθTLD$P`HRXZ3j %`8qוKKERgP BHywqmA! gym@J[ok֬AZZ{a͚51b?'<\B4HfّuO(+#$_z';!R-kx<ÈСC;"-- %%%xW{!!!x'nb`ԩXnRRR<0o<׏'!Sb:4P lbcOUDTXXn,z J`cII}U+WĨQNDbG2.@zB(RU VʢTd @FbСC9suȷ~9&!~رgϞEJJa?6o׶ `Xt:GaرmTL6ͫq!dddC="8{y2B! gv2;"nZlhH28L&ğ{XH};2!Bj_ ><`ۋz뭸꫱qFQZZunݺ}A3?N'2jlNģ2Hꕱ W!U^BH];2!BjLmGݙ}0e\DGGkfZ vo=b/r &N &[Cعs'v؁"<3U{n,YEEE5jFݨ !YK؞={bĈXvY`,X`:裏GmT;$Nn>WԄ 8 \gv%vy SlhH?_JXpDN7B|#hPJZcРAxѱcG1.~ogԨQ|.l2;qD'l_.r$%%C3gĘ1cï۶mjߧL7|ьBꗧz 3TP|>ti֍EY~0iPZU zV=.+ى)Fr 7쿚7B#|rh'ZgvL>yyyرc]# Ã~R!MiӦ5dggɓAP2nFIn,zSR8`+TD[]%v`4`Yn,V.T,xBLV{b1g+X=dƉ"VEEEXb~iMpC&0w\۷6m\veerssѡC+:c̘19sfc:u*zӧc͸1l0K馛0`};p믿/"O>뾌5 ׿oߎݻcʔ);ЫW/ݻװO=뇙3g"55o6qU7|[nE{o̘1(,,ď?ㄐe˖oG0,?|,z[7Jr9_bD~ܻyŭx }Q13w% J#9I$ *_nG=RSSѲeKڵ CW^y_}z!pjz!֭[w^nп$''W#n_̙3RJL4 âE`Xt:qy=}q:aBHp C$66G qBH3n8,YÆ ða c 6mڄz۟xwevTe,F!$j[Ϻ[\\egAn,zw>BQRR^*bbbP\\EniMji=ܣ  6_~AAAv m'hƒjСCؿ?[3fk׮[xkQXX+zDDDn8!d|צ۷o7Q9YuPXT#RDS,Pg_4`Nz 2m-p*6,|'sEPHLLdee~ir<434= ףGFvv6F֭[#**J33=vl6l_8E T`Dgxٳ qBH3`e,-vyVt7(՗سG"hߙ {f #x`/3;ܳBexqԒZ%Vv]t1xYZ B\{\,w0R_+u^?]j)))p82*%99999{ibGǎ,(ؿ?JKKѷoߠ'4@'NgZ6I"efջfb@}{=U&l軱4zSUtbD )C?;^ŋb M غu+|I(J{-l6(¢E bСCkZMqUҥKgφNf!Cо}{~HPQVVӧOpi>}Z^-[ӖX* J2Up7|r# NB;cSOJfvR=Bzw!(bǸqtR<3hӦ ڷo믿w^umYf᫯BRRRRR<~9s&>sDDD`ڧ;bq`ȑ ˬXyyyGjj*RRRo>E+V~@BBڵkCw7+V@\\8N!..gΜ|wϵ}YIIIÎ;|F3Nl6 u 7۾dee0ĎfċJACˮp4(՗URϞ6݃2IR xiC4=+#E!'$1qDdffns 5,ӧO9rFBB3hW^y%sKg'D^^v jСk;w'N@ТE uV^zaͅ3}Ã5i>{fFY999(**Bn 8!~Rbҥ;W =*=;E>ɠAϹ=J l~:wl6t޽NzÚLTJ}Rb/QZZM6᪫jv|=;Y^0΍Z%h{Љ8>r_]_^NnTfV(wq1`t8p 8Pӽ{z5C'MfVō;BZDn,z*_̚Pr<_,sEE@i)*, KT|(旗 BLp/c;vgvGvB{Ǝ{ݺuO? 8p?#RSSqw7q5?'X(*jd Uw`13( UO>}~ϯ-ee@\II,ҐBkWn3TR(v+a~'M J[\9&x/{_t)bcco6ѱ@˖QXخQ(Q0ePZy ' ^D L> iLH^ཌ\Q,հNr@LD>us H:t(gB!4i`ꫯ cǎ[o5[CQP2b 4Uh) bo_Ut@l,Ю 9*X<;n:3S +K"%h/Ǔ#cWK-# plKN,J̄B: )) G͍ڶ-*"n]Ƣ8O`O| eezu!Hf2(U ߁-[hA&#G6m(vq !RS֬Y1c@^zf!''gΜі?jXV8+jl6:*"ِ a;S SPXߪG쐦3q8*Sݺ2 .ص\Xy!i!%jㄉrLH?g^ֻA+[Jx|Z6Ɩ_A!3zh|c޽s׶T#.RMXj!Dxx8F3?Ջ]bQ=ܻ2;fҋAl NXZڪ+`B*/BAa8Z0p="R_gY#B(vB!OqFXCBBvZdddTk[Z¢Eci0qDm<11};GHz?rDXֳ-Cjfz2_cp|9u‡Z]Zibp\I+t6]f[- ;!R=z;Uncfnݐ^b[*ÇƀޠtnW@z^ Q=[ M|]Va(}A5<;ev h/5CQ*r bi_WZtXa;jyvX| H==;B!Çkf;vDnpM7.Cǎ!oߎ#GB=!?8|09dA=<W}{F%v DEJ5'Bx _X!XfEHk'v biH D'ısIbIfGX*ťW0P BHY~/,[nO^houoliە%)>ZƆ07T7K v;`غ>[Ϫcv bib@dXNL!jev 4(%5X!Rms7x ./ٳgo&M2B`ٲeUnEA)v; A fu!߭gu]bֳFwԐ l-vm-bq]wBCCXJ<#XjN>]@ \s51bx _zҥW_WۜJjxnfH\!}`'&bR~,zώTύCPƢ;Z M)kt 3g B!wF޽z+`Ȑ!B|| ݺukaPcgeyM]5{1ZYf>̃5?޺;Ag3;Aaq6Ngexfv:pѳƗ ̎Exo!B#,,cQtQ&:(5ý\EҷxM<;)]%uFD.!P#B_<ٌ 4ӧOǢEl2̟?ߧѣGmw\tEh߾=^|Eܹs!Ysa4ږTf H2lE?jjVRU١LĎ ώ8tHzv͕ JQoXZĞ=B!ԀG-]t邃bΝ<?a߾}ŬYc .tgtx j١;,BЋ‡ .MV١ֻ[MXԿZ*Ktd˗iLbZ6:u sSѪx-B1츧\M Y%P BH/QRR:xd^xcBØ?W1oO>Xz5>#994hP4Q;JsO )!Mᾜ>xA)VP;XTQFoabibZj-7|_ŸAvA⡽{uB-YB(vB! <iiiYfAt {/{:t@DDZ疭[3vލc…RbȐ!֭|&bqEǎɠ?JA@'bQ8^gIԼK J-27=C;, Kp/Wq:]"`nL{z:D |B=zwuYYYXx1~G,^(--=G|nDeӦMxp77;ԶBH]+vY(A `4+>-Z;gBX J/M JA*Nge{z/03oogCCB"BB!`ҥŋ R+wyXf :tP/^\UVf͚e˖_#sHh55(UEXWf˳еUE³̠T@` i JE ӻgvmUD(vB ))){PVV )%8ٳgcڵXt)v׶&O#GnԩSM_x|^NBCqUˮQP{v31%(r'v<!5CSRYƢ(ngA4a]кXz  x>B!")) 999?g|;v;tO?Y0k,㩩HMM je,̎3#^S̎ZX&Z>G}f M2ݳfMy?LмU\b~/7BB!6ncȐ!ˑl޼1n8[`4(P+V=\n,zó2`ֳ^čwcl=YfA` ib[7G-ͮQ?A(vB!8z( O:V?f3'Ƣ_Ǖ]`CHHȖ>3; .p=-IBH 03;`B4M e,nעdڍ?!G+mN,B1-cQsK؞ ;!R!еkWӧжm[ٳ>,4+=i75C@X;2S֍EojAiF}C^ J~63;XB"[HlM=JQY$ ݯ7\yvPP$;!RglܸC̙3M͛<'FT_sŰ޳bq,x=cIGˈe|Sݶ{vV [ϒπ-Ҿgv+{]o7؍B!᪫o&v튐/#>,l}h">USQ\R !הI]pe,RJӾcb.|5jyt`b2MR{q%]<u>z=M]١竌[ևχE( ջws !`??++ c@P3HnjuaAQgI֪S_b>"-HK]>B1 i>fPX"`M'Sb~.cafA!K/A~2cƌAHHZjs@hbX}B"$ET fCvcZE>G1{>V[zV ܏Y]Ζ/ʛdUZh[KZc&]WT. ;!H.Rm݆0\zزe6>uT|'r 0)**}5Ďw@HHjux(V?ߺӵ#b/RG JM~ 4Y%́8N{=oMX fBq]2/5ۖ2 ;!pf͚Znc׮]#ŋ3f۷o}U/ZHVBBJ /D~~<իBomP궾b}Tc(Rw!ĬЉhf*!˭Pm8 fٔ?7u3(U3VƢ(b!BΝ;0aBRzkzj5%% "#.(' -<;*ĭ9!,HSXrlj,*2/Y MX,h^bG.qPl*H;TOoDM쨎gֳ ;!@EA˖-!Dii)rss{Z+- XfMki)ѣG<8CHH1in,-ZS N 2JótEzjyv0(-jG²(>,=~]6&/ Wg)kx9"( ӹ&\/Aۘv޺4R1BB!9s oLbb" //y:ٗ'O"??tLh_)cQV8^",@`N'`Qy `Hx $jyEOC47?)aVORaѤ5*X&\xe'} IDAT3D̮k~BB!fᡇ¥^'"&&?\˖-ׯ%vtTfcbNfZ(H7 'v( `kai/IQ=;y,cqa7rcN &Fxl4(ͺ,,2/C1\״/P 33Q2zvB (?vիQPP:t(,X-wW޽{INNF||Ŏb!`8 jYE6X(3qhP*k`P*Zz8-vݻ42aQ] (֊rdϵR-tEzXB! k׮EXX޴iӰqFvm. RJlذ+dС2 *[VKz\(iXQy0zv\ǣd\AK/ Ta(Z; |X`kQ@@)f }6Z>pJ|uc`f) BHm5jJM_ .ضm[m8A1(unPw3L4CIXGEbVjb^%n/hGL}{Lois%%`(Ͷ "a s}bG;;̗Cn25*BnCB!Ԗo߾HNNFNp~۷osɓHIIPmnB!V̘1G}8z_r8^;w.k.v2;DXoRETq`xzPyvH7QԠNΣ[\au_ &,ª(HO'd2z)0ֳb!B{+Wbر+}8p v !ڶmɓ'cŵa @ء2"&4ӆY#5̬lL2"A gf3;gD9c_>BTSQ6CQU25+zVx5G`,c!BHY|9&O !v ͆Ǐ#??_[fĉ~o}5wX+Vc=šӛGEUٍXǥV T绷uoPn,M8 <<;1Cz@H?S;(I: kȇg7KYkI.A(vB!$`yX~=V\t=z`ժU~m]v8y$`8z(yfoÙ3gpbÆ HKKo]h_Sb!쏆8xwc b{7oAy$% :gg [1hg#4qui]b֍[7J(vB!Ԉ+VaP^j5k`Ĉ~oɓq뭷z]{x? ˗/TӇ!CV#C !W ٍ*TsKH!2 &`Pj0RugAm,Xi( GYvc!&гB!fРARBJRM,HII>wٚ(ھi>nn,@EgZJ!5(c%S.pndĎNj۷+zF% ׂuhzVTz֣Ex/cbB?:u{'N`ݺu~/?c B ,, 8uZlt8믿u޽{1vȶ_"/IIIҸ,:4 T,ٰw7W<2;6=Cf‡n,XTGW iiCquB fX̮7><B1sŶml:BBB0gaϞ=`0,}ꩧ|޽;z?c&tevVb7 ι>WfG2KבʠP36=;>Դzv;>:QC" XP'* OC=N,'ؾg/*'xHW@$!&tH -3?63;uKXR6$;eg>S2׼߯̎&M:9޷ِk=,c!;!r.x'0|s< yHHH+УG :ыLRR.Qu~z½} ˧N &ŎH<;FNCP0|QPc;>E$2;j]NGyz)O* -C2*#Fe,P BH6lwޘ3g7ovw}3f̈Ǝ 5jٔ)S0sL;v]n߾}v|(RD:^TK(`gߍ%e,2sY>h9נ4XRUbaР7)vC2;")U 'X 2 ;!RAзo_;O{,&߽`?8OZZ_&vU"v#͚AQ$XUف (L煁b:sa(cћBapI2X`sRdbG8CD^bכi|nBB!gz?6 ЧO̚5+|ɎWAy7E}m;q٠Aim6{veyQ"k= ɡ"p X"v@ [ڋ,{ }}1o^tbʠ4Tg▞b!BoVE*חWA%TYgĘ;`4c1 2!ͭgbRzQX,⵨b'4(Y1_<;I m C@!ѥKwgjWA Q-A ء~~*Zq.3;lBXV)UYbGaa#}nW+!ص WfvB!ZO+ 9ϓO>Qìg.dFtG@΁6;ׁc$mJ_ڠ48-~ZA9C\V@f<1;j4NlqɆ cխLkrGݛ7+Gs[Ϛ7bG$ro3;b̑(G?Ys#(vB!ZO@iscǎNu7=c@Y}oR#<;gF١ڦn>^ J]&CD57_,0E 7:Bܷi=k2fvTqu^?;!B*ʕ+1x`4mԶ?8Đke<ۗiߕ)v !t:@7vY2v`QL3;XbyX*ͰZl(* \KyKN=;q]ݵTv׆p{iP[|r"B!T Zŋ1h y&MO>q͛7GÆ mx 9SƋx8U*ߵKAAA+߅NTT/jD#vG`1XRI^ѲK …J@ mzmf9{J/C2fvD˘d|GB!w9 kagFppE!Ȼth4GWaHN>xRg>T9Rύ@&ֳeb١_^+c)_N2QX~3:IB@Fvvd֧@=;lAmf] B0#:6 gZ؈!#B!Qҫ׹s 7Dle,ڗ ].D١Xv+c8;gvjPjahQ+!1Д4X=J}8dv7PmYѢy-;j:,c!BHyb#>$D4mãfzv8ƬV8 'hM)cQ8Q֦82:[ɓ~^\].23\|qٗ@|~Xfv薱2fv^Xa-j>R BH\Qp t b@,I z6(v(1)ll=kڍEE.C7]P؍\RKyjgd<v}y7e9r!\.QIxƢe l=v!E,惬e,@<;";TS=^o:s|z{TR+ddPj{-ZƢdP*xrꪢu[Ŏfi鰾DB!qCNЩSv VsAtp Yuc y7;!fgެ|l2I've|zC㺜3;bdsBPCgGR{rvb(D9#2xى0BE(1UjWe25n A~ڕwXF%@&n,L ]VFSk=;DljYYs3;$I$m3;|D[Xߛ$؍N5XA)3;OK+[q({/m`f!BH=!FđPLoBAiP3vaoPXa\vc1Loqנ4v;|EƲrqpg77岲8$;{.ʒ-A $)v޷Ƣ/}֠ɳb=~ ^|s*c)4cۗ#S BLDlX$ȕ١ʂՠ4T~sa#}sRXfvfl@11:U=;dyv2te,goP N/30E۶cf$vOphRSfiTK$ϜPNSGBrK.9+*.,B!*zWƢ=I;$'cs9~:uo}Mmn,2(Ue.cQUoնԤk͐qe,Q¹VC`Pf%vȲ l8{v0޷2;XvjlX2 ^Ei) mf_qkw_A!!##?s؇XfvK ev=; ۠ԺO ~i" dv$hBN倠!jg*^8gvXP`fl[Ƣ(~.as;xv*c wO֠4!ƤL&ku.YwWA!r ѱcG燾j ؉jHbCsVFqPY,cKY١ok4(յE ./4[3;f{`fv>v0T72'RzvLx!1X&b\b!B9%!!!0g~?;~hܠԹnBu~ى9"0(u `ZuFBd9| `7ؔl\Zʕrv~qj=k;Yv[Rl4̎h J% QעSƅ\ƢzC3=;3;!By,!A 닍AXTh[Ϛ6!:2sz6Sb 10{vֳR"OK؊A!γC2ḽg”l+vH~QgvP찻gv{?g 0^V:67J|ARb>jGB!UF*cxY˜b_UXCQeԍ,ٵK $vÆ;ul4-Cf}?[|(,l5kd2;zXu];e}8zv8N'㣄;4^2%`Μt\a! IDATb!Bȹ ;;ϵ6 |VRc'Q%se,f'.!\m;byY'v",e,wS'a9 \y1b?py9g;/z׮@ÆGr[ ƳЍ[Fڍ%qa{3(P Y'">0Oɘ|P4k&Yӱg!B9ChҤIāqEQ3;\Ai̎{P%c UMEZT%iʠT}- ٦C,cu[ꂨQZ޳4C$%Cm=[Rbs]$( sfg;S躱ح8XIo0f.'+RBB!qE:uB  ;TAi`*< c+ }S8wcY/c1lnQ[>NЍ%C\^Zv{v{-A Ju JCoDZƢg=>pia b;@&S'Q:P BH!nb֍E0/[CiAie,zR@gG1Sy?n,1( #`+vL7>ryry jYe,2H[:}n6SD0B ו-n{e$)vB!TC^X"0}P;d ss!xaIBZφJ=wlu*"*Ua3mewՀ@ kB _`ӦMbxP -v2; k 2 vщ޳CzhkP*b`& $Ce=n2>Yq[L)vB!Tvoc!vZ]7e,e9kF}VV{챈DPX|9]V"->XRb-vn,s5!۶m222b"vXfb,|q/cqe,Ao.c$(v\2s'kg?F~F+bP^{ՀA#4~?h!p8|} Xd;!B B~~CHsC{O DGš;ֳ6k>GJhJH#Q(@qqmP^pn=-999!ebnzHe߾}Uz>}:vADёZ ([3;To;2;^@Qrry FegvufBUbs-.ARU:YYY1;d{CY<;,bk,vHgf!Bȹ%\n?sTbG,=;x _ѳC.2;P>1nzv%AΝ𧈃Po](Ēr֭[S'R}fvcҥ _ecR>cϞ=8p<+ N=;b`9)π߿Ƴ#puf^xG8vj=E_f6"(Դ"-ieǎt*Og-vׇDrRS$OfvHo) dvA!rhٲm`g% ,EQn,vbAUXj j^Ĺ+cP oX$Ee V0fc8yvS׈Pjp|zֈNȶe, =9df=;B޿Idn,?X2;]!Bk֬Abb"-[>}O>رY3>_dtcQ.{ս?6n JH=;DX캱3huc+/:e,BD١NB(pl]VcЍN쵈³!bG$ ϒ١f ֳdv\Y~B!T{=;qܹs1q =Xֳd9/JDgU<8X: ƕ jL3VnfADKfVYѳl!/,aXl4TO4\`Y{c lXt׻P,ݙ"A%|%6e,ء"ƿae,Lc[,,c!BH`֬YYfHII1}Xpa.à"bG,3;e,ءo*#szqR: Z3;$2Aiu* {vȶb*evY8, u9n=iK$eqzqn]"!IƿU>b5(2t b(oWk'P0B!Ղ š5kl_~x1~xdg{пW.R((,܌CB;BJJ) 3ЬEE9o_)Ë_+MہF 3Ѡ(,@1vHŊػ7 `L4kؼy3 'N@Q6 ~&P ee}LJ D%%'n6L u^BA~~6gF|u.Dyo.>>x +f퀢ڟo+:RV&S8yr6L8)*Zo{w eeryQnOGxP-{A4"Cv 9sPV&0IIi⇢:@_IHJOg=_߁O(ıcyB׻v;W_ c֬#q!.K yc|^ok+CѣqE<0_;GNMvy?ێIP OG1#BV=܎?NĩS>=Òm_"==\:yE(?)BN-_cQP|SOGQQ+n1RL|wGС -xTRR"  C=5 i&9u!9q1sEYqehԨk2€݆ e*<{;#=}W(>vl/$) éV<44pkxE(}5~{=md̛שҟ+İ{RfMv l?'x7g?Mƾk>4nY~A~\B\]wewPѤI~@.]n,lG B@bb< ];Ovljƚ޽/B{vl$'wDA B@HK;GQZ|cOQN8 !(d@:9qT 3 D ڵ7Ə?6Ƒ#@7iiy8q)vK:i,?;wf#Ǵ_^ok-YTڕ E 3m˰J({x"(J|wD}ɆE|e(&YpebN$!rom6'O&:p-J$IQoҥ`Ĉ\B!T 0dt s.R:t-Z+_~СCeLB!CB!ՂRH]v{ﵝ')) }B!!A)!B ,G;N&!!#GĜ9sPZZA"BHXA!jSO=zA! B!Z4|Wio N:`0}tgwqRRR0rHP-`ɨW$).] B-0eRb ln{L;ѨQ# <9995j(vB!"ظq#JKK+[lL:'NѣGѼysL>'N1wq<w}rpB?K.iB`ٸONsȑ#?gϞ9s&jXÆ Cqq1ƌm۶$۸ao1GB!]|9$$$|A?}i&L^ .4|6vXȲcbܹ-[>ƍسg>s\tEI&9> uzj\ /֭[wyGZx1{1x< .;w1GB!j*>|8\ h,YhӦ6!C@>Hp <w?nfÇ9hqƭ v_9`D3_|.8tGlݺРA,[ Ov x<5f(vB!EiӴߋƆ ݺuӦwaРAKѯ_?EEEMZ /q $IxwL:h4l@߁fZl_ @zz:~G@bb6ZgϞ;!Bj)3gkXvmPgPX~}5k8Xq󑑑ŵϷ|sN^`租~7pEq4SP^=޽{9xqرc/foe*j#Qϑ[B!B&M͓aȐ!ػw/Ҵyڵkѣ,NXn.,Xwֲ58x ZjeX&=z0zhD%99eeehԨu͛76mC=eox<tM&Mh?+][# Be;3g,Yy2t ҥKo@nݺᡇ1b6?;;۲\Toƍkm@ 7|M[r%Rs~ꫯPVV dw>jQ BE|?~<>S͠Aظq# ++KwժUoI|0|p,]TԩiӦG|ҥuq ˵T;h-Z3f /P=zxČ}fTzAmԈA!RKصk;l0! ӧd#s=~7M7ƎnIK/HKg53'|pw>#^1uTna֬Yxqi!0j(p /Xf 8Ips>x` P樚Ѿ{ŨQs̩1GB!Z%\bgkӧO8q.JF6m`ǎիV2o<-%ѩS'MSΜ9 n 8^{5HA3/^^Z?j=ܹ7ý[cb!BH-A5 ENN1{l̞=Y= 2'iݺ~ڎT {ԩSB!B!qB!B!;!B!WP B!BH\AB!B!qB!B!;!B!o+vZ׿ Ϝ9۶m1زeK5kO>hލ7&5B!{AaK. y!DBÆ 5\!$IBRR&L?uԁSLΝ;nVX~aƌv7l؀kG;O?O?十h(vB!ZϘ1cw^[l׮]8p2s5~}aÆ f&NxNֻw^!~z@Ϟ=l2vX|\n6@RRRu\.!SZIOOGbb"hР7oM;x mz.]Bn; I&2OBϞ=}vm۷:u{|wϓ'Ov>D3_~9n7ԩiӦY10n欉ESNHJJرc!I֭M_nRSS!@RRJ|6ofddk׮ppݸ뮻"={~a˴-[h+I7o */"7ocǎDkעm۶$ 6W_} п9iiix8#G5\y7|~饗΃vQ3nVHC )e֔m'^Щ 2sBg~s6dCF-Q>!$ܹݻw|#Gj+{nt 3fypqv&cǎՖ (vlݺU@ e:e+dYfꪫ@ dڴi+ZhÇk(..G@^,ۘR̝;s&FСQg\tE/քÇc߾}ػwv~L:?5jo}Z! 2^z%<(--ݟ}j֜mGM6_9 ׯײw0B!-Z0o|<]v…ZfŐ!CG%Kd$IXh.]}̙3ubXf Zjcǎ,[N}ǎ(**B߾}I&aعs'z-M4iRufHGW_}U TfРAXd qW-waoʘ1c֭>\s=HLLǡC0f@vv6y睐q w,_{~+W(HNN 4iE EE~|3m4dffn7|HIIA۶m5AGcǎiY#еkWW]uA!BHMG߹Bʕ+1|pˍ?^g-T߲ر+j IDAT 2  $3g;Kɩо,YD[_W &N:C7mڴB[Pkwq]v{=d%%%:Eu]jY^|ؾ};Nθn"55˗/g^Ѹqci \.4/1"{@T&/_u?됚j(GVIbHjn!B!Vv6m 77,/Ě5k<BCʕ+-Gq/… Ly|Xt)yȲ v,ݻ1#!!Auֆiz+.\ަMo0Bfʹ߷mV1 ݻmmȐ!HOO]GRRΜ9^z9~nG4LKKCV,=z4>,]qG} ѺukX hذa;wj;n W3gx<|gQe˖!s!B)СC\@ZD%|&tlܸѶڵkqw@eC 6ॗ^ŋ裏BQCXhaӦMU ]eժUi{;cY p-h)ĊO>D:.]r(((вG.2C_fsssmKP{L\.aذaUv.†> iʔ)yIHHij)!;!BaQxkϒ.L=?JߎTW P45j~0{li͛Ѹqc-74p1n8 0 }Բ K_|1o[,ygTU;>!,f{tM`+xT\\lvw"??'NĪUyf(bȮPcJJJ Zv)v^{Ͽa -˩%Pg]5C*w>{\p|7nBB!xb_gmo "55UK.AZZg-E5o>{衇:}(n6ԩS)))Z{n 'j9?v|Ou())?lٳ_=n$$$:0N|iq⋑eڨ裏ԩSto͛ѣGcҤIܹ35@mM /n77o!^/ϟr ڷobN {e]$˗[L>]~5B/4nݻwG>}n-rʔdeeAuB$YEA!BH `B`ѢE&B*~zoՀW/B!Ojڵ ޽ّ#GРA. $/qa,n[oQ_Ϳyf`Æ Xjf׿B 8@Q",CSO=>}@.]>C׮]x0i$8HHH2dEH'xB~BffU=3ZLII $I2+??۷oGFF>s6mB>} "J-[QPoDI7oAJJ OX%Ir_gϞy?\.Ju sN:7 RyJ5fۉt_~B♷ߜ;42~и5^~A~\Bb;\_2V\͛[֑ѣG#77gIhժO}aʔ)߿?ƍ=z`ݺuo`СmRΝcӦM+0`M~)))lǃUV_~Qwгh"lܸ0`v튛oD233!˲!C!;;7|30{lȲ)Su֘1c222pԩSLߏK/[nE>} I|A4l+WDjj*v܉lcŊڲ~!֭[]2>"vcΝ֭%Kb tMksZ?oxzK_~?_~Dz ׯǀpbxgѺukm۶;vcؽ{7:woVԺ 4!BbB!LBB|>^y͈SB߾}cI&''۷[1 99eeeJI,!B!|NdYFѤI|?ȲӖڵÇ~ou5t7n2^BP B!x&L0LKLLĖ-[b#F(hڴ)̙?5~gϞ v"&AB!Ry뭷0n8,XwFII JtM%xyD[Kq))))ĸ3!|g\}'=w{gff}KQۛ2`rU׽{b7{{{:pAVV{ϒ(27G/,,rwh^{LLw3Ӟ!/<<K8U\T$a3/S*McnW$fdŦ: JURRiM!G2uZ//ǔT }++l8qի5K~:tvk ڵKЅsssyZkTBqXVPP-YZZ G I^~R(/ȴ0nA۶mÖ\~h@uvrɉRRR*"4% )GTټ99<4&&]*~z2-s_$$w 6lݞ_~Tzwz~'MG{NlM r:;~R]rpZ{`+|]X`/!>Lx i&/Y|-=bD_?n/ ].2v: , пfBï,XJ%kk+;KTxKK˥VN4> ̞Zs̺qָdlC :xӗ.r~rm u޽>}5r` #{x[[[k#J##w-{X<H?EQ I/&BQOǚ!}ʕkg M۶܎/HNN:uҭ?nB#K5髿hx:ұc-_~:Km=}du38Nv4mamt͒l+L}pĩ޽{;~rA]?nG899uk-˪k #ajL5cW^ \dl !iްn'Dr +32]RLJJ mK-`C&Oз))"7:Q ̧UG"TٴTy_,6͛yyytǻf³h6`aaQm\1r_ww$;vpuu Pm5 W/9Mɕ Ƣ4'Un{wknh/*RC@5i+KG;FY)c*kK>b5?B8 O0Bx?% y`ԕ)^KY*i4RT^BrL@)]Ah!B+Cy7/k OMƆ?|1 :"(#%@5Rhʕ_&3]I18j~>fCT%cp,6*L3\*h-D ~)#-,,tuu׾[,ƆUcO&O5j{{UcCG9u^ =<<.\8`@Bf|^ɑtkx* dZ;5#9*1aU3vZ6]msch^t]]ol>_k._ikkӪUUױSrR%/Wo]JhZUS*McnW$GGP4רVa=W Wޚv-a)m'N2Z/e%`RQ%:td]] !yJ ##œB4T==r8fĤL{{;o3RXX#Hb7P(||5{ %7KK+]'еKЅsss+vk=r;x "**ۋ:53cبS=Q/i& ۭ_u%]CzC^k 0bMFs44MK{>{ kC޹{ߣ{rr޽h5>rrsbsohc>&HH:-899HHj !wޛ6cfby <)ӂF:b0Gk'Ln7\fLzy'PZa1l* N]bw˪LFe8؀^0tH2Zva)ol0Gj98a/u}Z4!̝3[Ǝ:d[s"BM3|ys{~ͻ7!EEE-ד\?IQԂ~1k&!$<ʂ_XlI>09 t?n/ ].2v:a;e82cbuk E |`*; TL Q\ ߞԿ_ƀ0>.M?ggcN8_Ttj"ܶ}R|!AT?Cbb!V]666.2L*FF>% **:**Z,v+++MHL0a':V 5`6u6A$ʌ ʘR:qV+&٫.t 2`dl|h۫W^zBnq{i/LyFFf^=lxBh׎=o 2~>`biiA)--p8awٮ]sy.y9ue˷2225f.ݴiys 2Bsąj_wm#3x3Ir&&OƔ1k~ &4ybmpּ_$#M}Acd_7 l㏇~񐅅P(ɣ-Bb73&8b4l`:׫F=bl ^y Rm?Bƭk)wyuӦN/(hHsvz\جwܬٮqW ⯨\ H`3U@FWSV}("{͓)5zg&x~\MU)SzWP5tHԁRL5AR2@ ]( vDs2=4Zj0SC֬Y.ٳgODDDmbzzzQQQׯߩS{Nk{ќXTn4֐W0Z- R] $%߿ҥ6mRݼyqǎ޺iiiN>Cu%N5W#I3uԩKi0zG# Wq oE"QWU*Ǐ[nmkkK)***--uqq!\wwwBMiiibéRSS[nmnnP(^|jii)!IIIE[U+hj={ج^ᆱRLL\KLĹ>k׮%&&BV\iӦgϞ[nu]vׯ__bǏꫠ GާON:h[}ׯ_?>rș3g?>>;z>f̘ [ o6lH$O>-((P*>Կ !z*,,LOO0Uu'BwbŊ>biiAOt3p8=HMzxx|'eYizZ5)+ylև`3:L !k׮mӦ͂ %)))gݺuGW^...}9sf~~;wSagϞfWW׏1?ԏ>fff_W=u!6Ѻ#`iiimmliiYZZA!177[=z !LFz ü?ׯ^8uViOq*MuAuRrǍ.iܸ1MӻwM۫W۷;;;[ xxx|׮ޕܧO>}رcر}p8:/^8|^^+֭vّ!440zf7}k^2Dd]M:Y ׈APSEVXoƪCaϞ=gϞ]\\Laʕ+*P\\?Ջ _5\ARRA ???فbɓ'333!ϟ?߹suAǎ Oɺd_5[͐eT*U47.&lnzw)=((P]rWW-Z9s氹"00ƦulJ.**ٳgmJRFnz};{ڂ .\`mm1wN:lٲo߾uM׎ Anܸq!9q/T2 )jBފyywV#;D"]4\^^J&|ˋQ(5lxyydj)7Wn߷.J߭gY;5_ ,R&SV93S-#* i7gkkۢEjphL@ `/RuuGA ~*>fU킩3 jI*F؊{R2@}M-̛wH @}а 4ܼyȒح{MYZ~e#9k} BB{噞1sܐsuK\G1Uk*3ڢ-cc{xCS}*@J5ۺ=K&;{?sSNiL.gddfdd8::zxxp8˗y Ey| D"B ||q{DM&0j/DI45r!ounot$4-rysg5oenGbq46Bf];vvWXv1666;}gee;dWiD!R2"xNjDB٢EsNbgkU˃_$$rJ~chڮm={!ܼUSRp)Ab@J(... P#E.^*˒v}R`nnnaalnn^^VKi"DFop04).qH.]ܶooߎx #Kbo%e) EYYY \VLfkc5#.\0o~} !3> V/Wc t*С,rAV-il4U*=s末;qŋd/9ڣ,.++ӿӂ~xɨݟ8y_RimD"u- y IDAT... ![xu z岳/~ ?pGoh. G>ejq[ԻwOUm2#.:w$t!yO'[i劥lT&J|gSCW*|>_kʺv Pkm]XU*UttBV1xnQ,wݹ1(@>GGGGGG4`D)Bx"e˷f*"4=3x7sfݸykC bWZoq{Q2vY:/f$_YpKVΟb5_OΞ>nccsBx$0!̘>u Y{j#v (7̔2BH$vD\"JXή?{6`Rids !b[YYylll۶m!Æ i=l`BHbLVPP(JNe>dSgo) iiH@6޽z:::x9ZW1o&u'lڵkC4,pqѵ:=[ZZ?//ښ0O0_2Ի; MGl]"IIIzllnnnR^PK@OܸX,izúZ0VbX.d(Ą$s&R) EKΟeٲń.KӴTFIJJ>|zHV=H׬XRRBa&"Jf%kKi~{t<Ԧ]ǀϚKGv!n&2l}N>$ժyy6Fï$$&zzzl yt+-4 "ܐ4i8ǎ֭] _Bc#̗\uJ~ ݺ|CN!e65hP'Ԓ0⢙O+eh)2q,4076I/BQ&)h)xi~w+A& J&@̧!0^|{).JjhGĆG%*%.$''BxּMw p}URRjͺU4yQ 7 %qmyKE CUYy괠qcG28y*[׾dێ]^MW;5<,y5 o0.[jիW/r/O>R2Yvyy9R +\UBT*usN+/ٸa?ܻ{-?},2\wˋljffnffF-))-((sk"">{UH ݻ[V }uڦMg̘s52y}^ޫW|А6%"|x?b}I<}\si*UYYٶ-}|}|NN.!EBiA\EBWw5lGW !/2f&l֍.AMk̫Z4MϚcf9|PV''E 1j|wiZ!ںi&;Uc#999< 0H&}rL嵒]y7⦵!H=9{_ Y:GE\Ʒdm|[oܰF,\2tȠ~}G{@C?352m>UVYzM:z{Ζ*,,// jE >x-k S۳gOPPФIBBB,,,\?w3g'N=f˲\.g,͵B[077wي՛C'lNuv4uGvAZ];ۿ5lkB! Ixyyr8,tJ*//_vgSf-_ӦM;9:~y#?KcN^-˳E В O)$֮]9gnȳgQ-[vJsߓMvÇWY_T:}߿SAA![߹ӱ'̳ٔ.-)esrrkq(J=񜫫J T)!Uk|>U={=zD4MoXZ$]ź EP:y!ӍBZr/ 4kEz1cTBWowmKHHsܙVVb9!dIwLj h0lml6mXӹsM85n󡡡UVjyyW/ ]~g.vP(vڭ^K(Ʊn1 R[lM̺M8>lPyͺ%%%a""TcHZגJ ![b]/:q?۰5i쑚*MLJxGdvv*㩩RB WmDhq }뭙]\:;vtƭ.=uNtVGKQ/7s)#FU^adZ`@sGXBj-ܸ*ذBڷos^^Ξ̒(B񨲽wjݹ>\`XD3'4 j߾ݽ; M5׵cMۻf@ PT9..΄t2B:uЩcByUw4@ }uUm6iؐѽB@WDl^K$M41d Xּ}izϞm8gddB͚7i]\\hA,% &mEWp0ZEZ"^jmeeck3gv0$ѣGnZhm7h*Գ hd76h-oc]999EgmٓYJR$&mǃ{ј ogg %ꊖ! % % xGW4.9>Z bNJƼj E9D=S'N5q,4k^2lgno4,@}J@_2ݵE'0P/S2dSc|_Ԇ۷uF4 2)^_Ḑܾ2@=i0_2 x %j@J0.NnF(a70sm%l”G tHL~|Y2 3ڌς ۿ__\`G̉_Ko@?e۶mjN %cm+pu."3*J][RRZXXx* ! "**:*:FT%yJ ##377-J޽yU˖zH Wgϝok {zz^=&i{;⎓Stt̢ǎXO_O}>^Rm g}I<}\sֆ, sG#''ǽ{w9:8T6eZCG kz!`B|2nYwz | %,%;~r\8v:%Bmll.[p8Z7̟CY|ՂS'~;g֍ƍ=t vvuBh<ΛEjj*J)s Fzz#s 6 !.רr4 #3@O1QQѻwm' š+N<3o;Ѝ5k7c6uw0rJ~JHHsܙVVb h(kMZ^^զlIvvNn= ;pnﶭZ-[vZHG4r4MKi>>IIɇ3Cf5 P_|[JF!YI`BWTJ֒`!ڶQfd̝yfM]$ J쏣?9bX,TkP(PkgoR);w%66<' %Wt>VGdBs@@cN)Y_]%[o3ɓ-^>rउ %J>Z͐- Ӌȇlv~Vn1C8T#]v>"!% g^?ϨϞLYz6-PUKJJWYC7۾=jr&O5j{{R\.ёQ p!䔕i-LB`ㆵG~>A>?}=E4xiRa PϞ9.T?~VW繳'd2PfV~xN㢅M_PѨW;?#NtmYב)Wʵ2}!kfok*x@RU˲_f~y'^o{9% ݡ܌RR򉓧e~~KJJ{g98zxtTP**;;ři-z:uP(O9jzΝ|<*@}T&> AV+>ߴIe:䢤|wC63bkm dW\|9տ̹*ܹӊK6nX{?s[RO>|+///**ӳ9;};w+11)"gQO!=uXּ}izϞm8*\7##3%%bnnּMu- 3i -vւeecûn9lgmSBbeQs\BȋӂӋį6=pk؎߯B_$ 6dQ'Ln7\>֬Wh5>rrsO޻ͷ[:w.Y| UKkeg/ Ι3;M PO1 F\ %#\.QJbaeFx,)Jrvק$p⹹ؼZhiUt𣅅E~ , пfBï,XJ! BR^\zd O9:80 3|k%%'_~nMkk+BHQQz]C3 Cʕt垀B﷋D!DEEBbضmT>aÆKRkD"RߧIƚ:٨rCDABG2R2@1=IPheY`oTʶmiC4dĦkv `s`Gۍ0Mwc-?vDŽwM1qcys}M4rÇBt{ν>nQ,wݹTS(/W5ON !d9f\NZ_ `r iS֬ݠR>{SJ5o-?l!NY\666-daGB.[9yϦ3 3{e&dђӧN4a!Mr v|y ~~wqF LM ]\\BgӦ / !I/&O֙2yӧ222oj666.2,!1)EkKQO RE}XSB6sYo66Դ/׷i_t_ΟΖes\>ϖDBBHLgS%,--!e9<O[@`yyyVVevrr4)nƷm_C`*ׯ^F#Ș )YHNquuUTYYYB*%!W/O:aBdd1j**%%U paoW%R, = .k&9jS"=wW\Ϗ7\&dM_fuq&Mqff{^xDOOϔa;>nS@DFJ4iqndcGG V.7)3tq1Vxd4 %u"2R2R2@]EN d@J(aCJ E7$R2")R2IܖO4M_.Z5l{\s|g/RyX5YPIܖ&NcMXt%!ys/ƌpBHLV\\VkW$Uo5Yzj222.;̖ ȨPmnQ,wݹ䄫 u3@CNɱq o+cW|cӨrM666-daG2 hɌS'O0ŸP_PPgnEJK !vƮ8l`{BHǎZh~ ֵ!t /..d/^$HRSO? ( @]wkLB*ߍ\dlKK BHiiY^^[䈋 ( @y?Iƍ{9sc?V,M]b\.e .Ą$\T\[ʯBz )(d?7ڪ𑣮Y豓!~ԫHV]jo E >i7xe*+Jɽ{v7mj\\vYϽ׻Qc̲V,_ŽS^mrq 'Ox(@/4Lywz,nnǏR\&ݮE RRRE"ruϞ9^Tv,w ]]EP "42x^^~%!13%%ek؎σ_㫭l;^n&MGܹqú={ )%/[بrCxyy.@J.Hօ&xc1 XHH #G| &qUYYَ)5rGfeeeff|8Z]w#]޾cWyy9Aڃ4#?b322;TJioW^pђa➳3> >jl0K&5?حaSҚlgQ Q^^}%vR(h`)x̸ K$4oeޘq~Άjls괠_.^m۶s˷aF}mD"^PKɚ% F*5bMΝrqqfKgeddT&e;8سWT2YH$(ioomffT( 222-,|>JttBx6srryz,'7ٙoϮݻ%%'?ps}7nX"!ٻ&$ WDѺցVpTj~V[kցC8Pd((34d烇.7u>ig |Dr'5mzI={//ϙ3x:ܦԈI[m;ٯ_nIAAƟH$I.?~"^͛eddJ$[n Dtxg7 Iɯ }S M>s#_0lfX̹w/{cnj.CQ<-Z)9mZݱc{?qNND#"77?&;|kDIJC5bc/Xxo"W\=rx^3W+ ٽ'Fk˯G.;fϟ3;[ND ̊[ߙ7[A~|ՙ\߱{xH ů P>3zя 5ArP)\l[],w/вe yJ+WMHH$"__NhĈaF#rbRrBB_Ѱ 62?&#uvv&*J.3goݺѣJ͛ze ÇqWeڸ3k5_Zfv@S RL&#J {{7oͶ6~9ޜ^zQo{|/N9anh{xxx𿿟۳Iojc+7 $r"9uw;DyyŎ3jࠗ ~?~Cڭ5š O߻NJnٲE8%"'2n8?Vwi;?ٙ߿+|}}YCEpMTVV04kQCnJhhS̻qq'/_ 32 gk/4=1=uڍ~ -O4 u*$4F==RZZFD[fOp@@ߎ#"Zio S*R҈޾C,rS&%'* >ZX?hlRqkVXx!b))wv"a23vԜƌ֛7ff1 Pz%߿uYz횵zzz,˼1aܑ#QNNo999.[mZĔw-u׮]dɲn{yyy "fϏf6iϞ^u޽{:v0ϔPVVV`GOƲ >zT*FrTܜbP(tppжE B<=YJgNA7oͶ6~9ޜ^zkjdHcooRo޽{|>_it0 `auc$ @ 7 jPCL-[hѢB}hrss$yWID>jgXyOf  S;v4l>d<3F~gx5~___aV.{0QWu7Nvrr2 [50Foy7z{7}x7Y3گ e5fݺ !]i]cMKO׷bʬԴ4"о=˲\m^5~·{h*--%"ek4tcQ PjY}ׯϪk׬ža-Y~2jа^ Xߵ-}GoggeKj؜ܩrrrruu]t1څw'Y[mڵ,Y֭{/o>U(Uxfʰ) yW.=fX,0Yj_;6o?AE{YQʭz+ь+?x ߱r;4ճAeDZeI7440v^la#IBPb|BQ{&/[ٴSo:APD䦟k]HHooo<< `h)y{plIc4 QH@sd+a4@'a'< aMgR2X+|H# Pog *fLAd}5K>xHFFsttɼ{ǧVC  aQ y)5K_~U>_ \ԩ\.ǹ5~1"E5mܭ[%r÷oLxs{Z}v xm숨\"QiiYaaUd^|>??@$UV vuii9nn\DTf)JTںu+>RQQԢEs.I}XTԮݳBPw򲤤[~~ ;|}Hw~V\\,yj 0hwhHuui9k.w|GGko|;JVєq]s/N?JD?-|߿?/5#¹D4qRDPPdz$Ibbһ 7aȨ^&CDp7ȔHܷn.sobqBbҺ~G\]\vɑ-00ҥ7nFEΜ1Y{M>s#_ajۈܹ 3ގlѼyqIIא.;vtifLD]SwmC`\"ZыkH윌͛960xgƇvv׵qvvף 3*'O?ͥGqsΙ9믷3o6QRR1NNNorD\QEEŠ>C._n…ޜ͚ƲlK״)X'4dNp<=##%NĔoܸܩS3g 222MǙDtL|XPm9#uvv&*],wiiD)Μ_|UFsMm!CDD]C+**ƍMDBsN݈($3ϴ=qhmw*JRxX`aP&LRTe(W噳w ~gx؅ >|x_)k5ADB.v{{7oxŗ_֧#G~f+W),,ruuuj qBAY(Whg˼[oIIJIDi8L{" IDAT.Y]YYRRRXX׵ ]rK."f:th/Xh4m%Υ%1pݻnfnE,JMK#"{{۳,0Jegq _a":z,6-=_jd74xPXTf|#N,&kLFD'%Î~! e2Yא}1iHD<o'+f 0~~u]-boo\bbR``~u{nW;u[NNN˖.D"hFV(|+++_2W^wvvv^O-^r,"bҟD"^ > 7#RnɸcE,;rU*50Lֽ{jA;yfeʰ) yW.i #G~YS'bqz!eED)n]t5?t?qRʨR2 %7vuWm #Rc kRBlԴ֭[gffnظ¹Xty9-[?wʕ+طoo[Hɍj /C ]ޡR2R2R2@#Fɀs)C QdЇZ=R2 )LC}R2C}ެѻ:;W_S(L͟R8;D:JڭDm{0ެRޘ}9;wN)/+733';|kuS?W\\=զ <n {P)zu_xB\wn./LUaZ]TX#KR"hDZc/Dj:!!1 eI$UV ŭ֭+U /:?Czv xmʼnIronJ&."r}dCQ'I YQsv7|e˶~ࡶV~|'5u>_"IM[zE^D4qRDvϞ:}so x6D"ILLzwX1 ''G^=8(vsh˿ظm` ;waۑ-7/.)eΟ.;-Hp@s gϽ}w~&?wICDF:˲ {M,|}}ӹbTykMDrrUr'''GGGnD @MFi4 8K?cf|e/0+hV]RHg}T&77W&Q]%xʒ*˓Rq~@=@s 3iԴ:***h ?࿟YerYr-XJKKe cfvY3گ e5fݺ !]e2BÏW<(,T*x"97fO8%SHpCGΜ߶1{_S敔Ѵ)'NlQڵʺu5`XŲH.^;iydWBzu3=#cʏ>]IiIiO4uذx<?`T$[?ohGڥܺ=wl(eu'ֺ{9b[=\G<}#G~YS'bq@-^VDrEPK'Hz0hj?beķ@$nDV-қ{<5-u֙6nz{p %?Zl+WW.o'")z[/^O$tl@JJp!%@,j)v )!@ÎO-qH ޷O @Jhpa'$4ܫw dBDC-rMSEH{|;9{|f? ߚ9dȠ/ !6Z9?nlP>.싋;Y(..7aҒ'm0n¤b,R@u}ΰ8lUj)HTYNLLR(> ._:;;ȡ}ܔY3kͪU֝Ky1u⤈v=ud=v*hޙp=D/fٿ/]?Ϟ];֮YɚO]6mZݱck<\z1ߌH))w"LFFLqfvv7:bPggg" Z\\Rt-/+#"7Wkĝ;6yZuЄ.JR/&Dh v[˫&r5:@ hٲ3T9@Jޘ}qq'w8GJ .h R2@HO{^! % %Ih Od$c1VcC|A]25`ɺ; P?~N6oV2^uW@GQz5唖xL< df%,7f=j֔kĄ-_`)&)d1Rշo D"Qe:11IP/ٙºT*Ya'BscMS Tʍ2"}nbnAHDeeK8Q{}doooFˍfU6WPwXDRrf~:_,j4u6t du:xNj<o'+f 0~~u][@::OXu2BA/&"ևTWHd ZvAD@Jx!Ci8ِweHZB]T80Ӹ'@Ê8!@]2@ z0dƔ]p!%h6 8g=w=G%h4̗25vjii-ҟ>>۾ٌc 'O`q"_+_ RɸcϿu뚤d"2:{&^(wyگ޵{ObB▯tqqyӵG' 1:7d,хO;ϺU_V߾B<^@;K/D$B룻@ X۳fqej:!!1 _**YJR*n݊8C)<--=;;500 [n ֮eI$UTT$%%h\.QʝԇEE=+ q &ONZ[t0v ިUCskdn' 6V\~cQb7JIAAƟH$I.?~MѮݳN9czls/6o旑)oݺ],6U80Qs|50M~At77l{p_1lf6Xwol߾ Ĥu=~i#.Q.1N$x\I̚Nډzf~븣uyg!_Z0.-]UHu{hcnj[ѠʕGpPǎr"bfVܯμl'ߺ}#"Z(ZVk4?XfquW~Ƥc>圹 ͉Z⣊A_=|ÇZ⮯[7+zxmrzj֏jahdCJ^L$i_Vmn׈16D<"ySܬ_˲ n݆.\9@0RED;e~~2+5-;oϲa v.óET3Uַ0_̘T%R5_;u<o'+f 0~~u][[3ea#F+/+fɝ:-'''WWeKD`%YY3ls{땵up5Dȣ)ڥܺy2iQ,rieYUx -(((,*jެ@`a{j`t[7jjP J%*^>8Lf{@Dix?03l#N_|"I:v[˫~Jڇ,~ œ`Dd^Dlhd+-V3>ت5f*M*(qF̄c35ɔLDn7"RȤ=C@IG2X^83;_[\Z^a'Rs Uڢs =Į|^+N*+0WS]DejsZS2'3fK&'[Y{D>OAJ{0Zd=*]ч&g,*.iءc`^*pt^1scQc[-*.Q=m)7fQq?.M4eUâl~bݸlM~cPӔlo'pvrttwHEe{Pew?tG-|#Wl.-̞ᓗ< /y<ƫ"~㕓o|u +S~^nPOVpÇ.H֖ ߺ^ElMgj5Md:.[ ڏf%k)yPA=RlNmk¢Nm[9:|fERZVADWӜRLU*,;߷[G"IݟiONDB{{4f<*)*M4exMh 0R5zeL2Yiqk?ծ.cMw{k빿W2n@]YIDB{{7g u%7Q)7%qcYv=&vzZ_2?㦙͆c{xkZ\U5KFԲq[:Qɺm~ a9$C>."ݞ ::%n.L>&j4ej]_Иcd^ ͚fd,.3-`cN6VeQ/hɤb"Wrڴ:;ɤ1/N6uG=xؒokoVAJ%/!W"Yw"YSͷ_ bm|hJ>|F{o[ECнϧ.4zJN;ϴV_oEY=lf\7mk{{W{P朓_8wֿJniu퉼\͊dL65c|fco1a^sdւ fk_4-M}Dlͺ0j3$Nwz<ӏiEJ6-3;oߞI7] IDAT:ګH6Zldž5* #Ll4:7H|"g83^16`Cw:0ӝ xp*7L\u2Uc):HWɄ͵ˬޔq.'nQ&F#%C2v24CH]l&=VZ zՈ;DL5=3M,ē|1%6gNxZq2vܸrpgCbT'S1[7B/fek)#`!"7I%f^%ZdmWn;Hɬ~,F}#%4M*[L̵Xl>6wwZl#%MPYH&b1U"Tr`NWmkea1 &|Б uy&"h'6T'3U6U}Uִh͉1s:w>]_}=_|nQ-UmXSrH "(\kRl*Z^ǘxaDf,4gξx%KKKwqaC) ]@~~H$*//KJP(|K)YJR*n݊уJ(;;G(JfVZXXtXّ۶;9@w$Bcf2,.ssbgg縹ׇ;93`mme֤g?8S'vl"l;cHn-77dEa2m8)"00ҥ7nFEΜ1.>wbf~֭-[gdl Xc3+=xp6S#&mݶ=.d~}k x6D"ILLzwƘZnǏ}~Cџy<%&%6?N嫁m <<۾LDS5rG0 ct+4Mn"Ḷ%SmT0/"a>g"694ƔܱcMXSS3nY{%^z>6P+W-]pq›S^8Y39#D0̬9_y͍:u ݽ'fkW^{O6%_׮ܿ_F/\ot4Μ֝viĤ'O?HD=ے[`Dde[l1=TfvL5ȍ0@ר]+>_1C^hbty晶'N""\vlo˯*57oVkuI < }x܉#uvv&*ʚ5 Çq8phD.WVVnt"rqq[ \Y\֚l4@'̴K LJ&~~=}G~/t/OO<2/O*Uk \]]EZמ=1?oǺ=fooA 8853*6xAA#?{xHCu%"ooM_xҲ8@'.h4G$+j̳ԹR26Ӑg=º+wFYYڏ{}̼wxƷ =#㱬}v&n]wֺ|V`ʑN^4iFZ3.}EM*ډ5=tC73k:(^5v1z6_u򺸐.ލᇝbwg]#PofEN֯;)zǑ&[-fӭ5HUZOW')y{.ظ3\P̴b0e\~2kЯa8}S2S//֤Zʬy)Y8.xd*RfD FGb<ǚx-YsHP7YjL D8=瘪=wVbFJh@ ~DvɆQ_Zl[چNqdMebSQb2SF./nVFJh(ܢie2m(Tc^5WV!3U_OmX?T2R2@ ʄx^7d.-`MDUÊdkwa*Xu48F>煣b+t 4¤ll5;5װc8EcbX;Hc0l8jOd^vv^^~Iq v"4cY+ڈzz\O7ݶv4P53)رϝ𡷷wzQ[[R8;D"\e?P4kgӜ%AaT*yyy "bYV%{j;)Dd 1V[!ΫxU[$FFS2c:[jPQe޲]\۷o>\^[6m̟ W4Iޘܧ'~ګ 9OD**W^}3(!!ա3`܄/ ~N,^/Kd\6Gd+bhP ^)P"[f[([_OqSrEa20'E\t[~ͨșS#&ѝig |Dr'5mzQjZZdԼfRR|]Kjj'Ekg6P+W-]pq›S^8O zfG" .:üy:|FSRRҿS0~ai˼rb"z;qrr|×s.7'j劏*** ~G rrroW*+)yyyDhfϙ;gN )IchO38SɘWf±<wfU3f&6PVV&U P֨]+>_1C^ߍJF *QHHgi{)Rya}}}+33uٳh@jtu#F "yCDD]C+**ƍMDBsNz!KQDZ̧͝N^8w9w,MRfhpT;cY+rac͑6AX13c]dS OMׯO~}3g'O~/<<=ȼ}z2 ru:fi42K!?"x,[wϾ99iDz!?p5#2+޾gΘp?Z~zT%˒o1 c?~Me."ZFXgNjCB=sR-vrr6ufڴ\) Ok.h f3[3fi :_|z5gyΙ#}GAs-%2֮]U^V֭{tx*x'+ |a^''"iSN8پsF7\{dS ӫwgi{{V-[uV2 AOM$$_ɦ[ mMHX:YwJomECo'l@[7u?n؞eYʲs܋WEL4h̻rEw{9}ZEE|}MdftvvɸcE^wFח lgT"2#kU.h7gzR2 ᴡ:ժE֛HR޳:qBJl}u2U mfR2k"+3V([|Oo]lgd-+LZznHfޫn . d/kj!Lu5խE6Y)TE-XKXo֯H q 2kGdld{d MU4 %<G~;*hj԰:|>kRsdSx_uY8d0aV0ĉɸcoMѹX¢Zdu2t86ll6lqQ5PFJh q䪓g ʔl]2cH`4JnAlMղl<aԬ٬{?ۼ]{MsÇVrζmzPYY?:u"((hĉ֔hVXa&_hСCG=j(_?~|˖-u18I.hAYF,,>[LfͿLD] \h4#e{J>/*)9m` 7S>2x۷S hoggGDeeeڐZ^^~̋k4LbbZ Dp'gg縹pRT*Ri֭|>=(,T sB{TWFQ~~H$T'&&) __\Pw~ܿĉ{]zcڵ˲iiipllCxx8 "ڵB0SXX'h'޻wÇLL&޴g1%d]D6lSK$;ikV+\o]S5rG0 5WxxH}.>wbf~֭-[gdl Xcm9Ddt#h⤈gI$Ĥw?n g] prsޝ5q}? ȢA Y"u-PvE֭nWj]>Zťrl"]P ($ϋM#$!@ߏ/̙?Č֢EJJJ!K.={׋/jjjIjxQ굧-!dѢE}%%%W\ٸq={n*Γd2UTT޽c0  066%---''GCCFt:@ b#Kʍ?"2&)҂dӮYsǵk7x<?̞W2o^7v̪?}!/^LMIy&@j.3ߎqܩZ5֘  =r즦/_O8ǽGC !+̾+͢HH /_.۵sێ|>~AοxܫWUVV:uj͚5TD&h[|Çƍ۳gܹs.]*lIgϞٳgW\)nݺdSϟ?񱲲JHH ܸq_/LLL޿/\) `ȑ֭vZm{zz:88lݺG @4'BWMB7g25ou^d9dӪkߏ$\vCGGcٯ322}K"ĤaC-[WK'd]}ŏ1f'rSSS%QC]SYYلAMiԉ=xW$}˥l$1WVV7ǻq㆛[RR5j觃 ۷ollƅ ֮]ٳݻw'$$?~\.駟***6~w\\˗/N+̙SVVv=jCyxx.ѣ~!33SRk/_HKKsNllŋqr.EAYRmY&yJթmܸã?>^xOu!gFz]t+*==fGFFRorrrw)STUU9so&!d„ C 2e֘Lf]]޽{===-,,zbrB zXP6YoLd{{D­6{ IDATo5_ =irrʯB!zzz<O훜\B.!/ Z5gϣϜ93e췞7n̸qcΝ-h hիWRq111|رc ֚_~ɓ;Q}b={h!SS#FO+_~ O?널'N {?xbuʕ4WWW}}}egg8PIIiĈ|>qA6RԮeҜ$_`ągg!%/YŒ_N133qikkQ|lŗK\@ݻC8oSW0\<'Yv>p k ^yFIضoGh܎$\ϐJeeDނUTT\zE===VZR^^?Bݻwcǎ]fυW@hh0"Btuu'O|qI)F:uۛdbbr3fPQQ:u!ѣGYYY”>v^z߿b[uqqӧz^^޾}Zctմ,% ӚT( K-q!)+GwAMfi|`@`"wuf̘@r 9CDSb]~}„ >|ʕ+̙b\׸5>k.kdd${ȉ'6H@`:gj2?x45/%Ӑ{*HLL%2h2,="?{A"@8p!C~-h [N]k(ݻaaaVVV#,teĄp3"Y4յL9ւ&CD&:%ev/ %t [[L~:ajt54;*ʢY4g؞&Lݬϻy YTHHJ ,).揵 2c,#%tTwA_2feɗ,%7w{J͑BP&Hʤ9c-IR2@C32if/2MjR7C`L!@!fd#rtO/r)? "|EFF rBMe"!GI~O0'5Chв,fΈFA&neJkLoFUA:L 9YX=OHʸ) @)ܹs·fff!CZGMM``4(/}\M⺺ee^z|&)!//d{`TWW'$$ 0XUtETy>Ǐ?~Ŋ%%%jjjKΞ=ŋUUUsɓ| !III'O :p5%;;;++K[[ҒN7Abg [qٳXYYFDD4a׮]!!!Vq㆝s/^011y=!) `ȑ֭ڱc҆ [YYyԩ5kPBѶnˇr\>_UUϾ!Z[[_رcՄ???GGǍ7Θ1cōw !ݻ'E fُ=:zh#l޼|yhh9sݻG}z!mTTTLḶG"""~LYVѥ?~6,))5JA766VSSs…3gܾ}/dlܸq\.799q̻wfddܹ4<5cą9ZXm۶Q1Ȩ&!!aђUVV;|)SΜ9 ?$L0aС]Evƍݻw[YY=|`Nuuuɓ׮];~իgϞ}+ݻ7!KfXKLL|}}}}LLEd dd>pp驉 4FCb)yȑ}y޼yCӷl"boo/iВ%K nܸ(HOOOZ__???ef̘`0-zW\tٳgǍ'x9&bOhʔ)Ư^jrEG4hIff͛7KKKq› )\2"2| б|ccI&-_"߿f``K/rǎs?~<77rʕ4WWWW=l۶رcN2kTTի n*ֽ~zVV]F***JJJ={…_~ÇARfVeDd !Oӳd2AAACZ֭[^3f̚5KKKKtNwwcZXX߿' *OOϰ_~SN ؾ};!DAA!<|ʕ+̙bۚUt6'NeN@r @ YQRRbX-?SPPPRRbff&?g2ҒJr+!z$? S%o&8dۨ]aii)w BVVV\E>iHUU¢5kkkS lCxځTTTΟ?`  )vA!pdGG PD /!ey(R2@w'Ԓ, $驉9ynp >mTF9yR&Cr[H|M!yN[JׯjFP^" @=.K{\~˴2zh:==%ק;wn‰TD&p޽{Ss޽Jlgggc8;;Ąvy]]]ŋ@*ϟ?_Rdvr\I4I4˖-8p'F)9==FQsrssuuuocbbʬ[aNJJ^'''[YYB?~|˗/r\KKK@,lGTEEEnn!6**֖NmHGFB}||>}yfBp?t,%l Ʃ<}3))ItNѷUUUo޼4hM*fff뫪۷WUU 8BEE$%% $B9rȒ%K$`{GF|eehjjrC~dKEQȑ#!V9EߦӇSSSLrĉٳgÇ))))))͞=]CC 6!$$ȑ#yyyAAAԝ7Ķ`{GF޽;>>۷SNMJJ:pg}cnm9x@eLOM1HK/}jFl-r{̫W:t7STTlV;ZҲ2]]]=-PTTԯ_? +bĉZ$H@zcj2?x=+;Dd@JX\^SSSSS())83RPPMnV;Z( 1Hɝь3,--{D2ȁ;9: %@Ddd L) ЁEQQjvP^.']dd$ R"P ) =f);C>)ܹsS,X`bb"i~`0~E&Kϟ :Kq'N8|j)󻺺^tIҧvvv,VM^ׯ_[I4cŔ)S`w F]]]||!$''GYYY[[ a֭...bW0ruYYYرCJA?naacee@M~+ VXXFA)A}ǒ%KowE>{,66VMM?ߗ_~y۷o7L&!d۶m۝O?Dv횯offfzzzDDĻwzMyM|)SfϞ=` RnCM~嗾ϟ?X8κuHACh/Kf0"-秦Fرcor:`ӧSE_HiP6Hjа>//+Ba+ 8p턐:Btz7KɚZz|q6ViVYkjj EJ˗N\I'M|JB@ >NMM%())1 Ǐ%\r%--URMt2551bO?$x<ǏO%fYX豜իЯ%Lm}] @CGKCi8wWZu-UUqIozzzL&3((e߾}b>vX SVlMthNznzzzhh咽"r+N6:;2%+++ڵҥKW>t萦&'<[ww PtΛ !vvv˗/3g+j'/o߾߿?`hhh~nh'A㢠bP89F{R[28{mDwVЌ۷o?ٳwF䅺D8WFtcqGC!@L߿/l2o޼@??:O^)(&&zfkjj ܍#q<+% 0o%lذnӦM(|+))[lQ}DyEdQQgP w2KZh4BJhhQX,kP7<{sJ6mZEa IDATE{{jO^TTT\WYYinnNtzhvdh(tˈ:=(R2tmEh(;:J@B_2!\'/F0KH]/!eyg{rCǀ }$$KIzjbN^Aw8p[\h FJ mr"͏^vN)9225j;(/, qCDwJ8q"jvh<@@TOADhה $̷obЬ3(t'#%tUfrУ`@R2@ FG#ܹs1O^?~w-[ ) !DdOjjjo߾޾~zΜ9:::(Zȑ#׿P ?q-^zh"WWWO^~Ÿ d|С:uf_x#"@0OɺXd ǻx񢺺:j==%BΝ{ '''n<1=5<͚[KKKKK UhƁ*%܃2"2H 0H)G-,,|=!P #2"2 tNx^pԩ/zM)((ZR\)ҥK(Y[XhѢEPh2 ~-h)#. ADv:R2R2dhdiX Nq~ -ӧ- D@Z\ H]GRK4&n )SBحH=??'('/u᩹B 4tXJtBydJ8q"jvh4ڃPslBg "tXJHK}[Q1G2R2@gfa-< v %tuH>/%gee>}ŋkkkxƍ~͙3gԨQ @gOYYYSW^r1zh1cƄ, T)ѣ·Ν;|*(:::kuu;w"%؄D0ʢg`w”,} .DE !,& dv@os133۱cj*++<8{lȈ_]7L|5/yϞ=SPP@䮾GGGgڵ@7f>pp驉 RA=V3?zʕ~pr.\sM%%%kcRrTTW_}:tPTM|/;s玺: У2"2 ڈL#.f͚XXX(޷o_z(>ǏB{FDdK|29x] ^eeeXXXVVUX"@sp0<)믿 hPؚ$pv @t) hTdh#.%_Bv8iKQ0L@J>>Z$=51'u)!IOd 4;En7%GFk Ъ0:8%O85ji7%@e%>ۨ4J5=bdZy )C9nN;fjj(:ի\.wΜ9bBe{ɓgΜIa\>tڟL{Պ+Dx%KKZᔗ2:|AAA?UV& %3!644Hk2%nٲ%!!aȐ!Ԕ2oooBHvvvVV%.&vkjj*++SX,s\cwþ}mllv؁LN=ḝԗlnn>~PYf9::nܸqƌGۻ>>~ %#0丌SN !~~~gΜ'ݸqϏq̻wfddܹS},z{{G=z׷O.Yd̙gϞš 1'Yq1gΜo͛nnngΜן4i!bݻw/1111126m۶8BQMMMBBѣ{`0t:zi@O`>pp驉 0AgN3wܰ077P___j`[NNd0o߾7o-[' B >}>Pn)=5APFD)7iҤw_|yR555BHAAAFF؄-J;ꅱ1?vneee񊊊zHPFDD}qƙ,\Ą󳳳 !Trm&Lɓ&MZ|yee%!D ܿ}/_\WWG)//_~=Ų 2"2?d,dB_~~>u!hŊvvvӧO7oإ֯_mell/vZa:DEE57`IYiQQу8;;9sz6c Y~䴴I(T\\\WWWRRSP'pܸxPVXlٲ={ g(++{ׯwUUU>xچ'Ozgnr߽|266vٲ$22277%<>wܱҒUNNN5~ԔYfEFFfddhiiݾ}d6X|ȑaaaSL!p8hhh*((hiie{4""bݺu6l&xE&''֭[3g{ɡCM|>ܹO>;w]VSSs֬Y&L8tPAAwɓNNN>d2.\vZtttYYӧO{-p%\zMEќ/\{O;W {:nܸGٸqcffݻw322v)Y@f=ztQ__ߪ*YҨGEDDYQ; #:u]MMMˈ;wRNl`VVV?CCCy<ާ~˩S6~TXbb"9rYlllTTӧ׬YCJY Ѯ_(;2'O|G ڵkϟ?dȐ&Gx7nIߪ#Ffdܜ9sۛ7o9sF__ҤIu޽`VVVTTԶm!FFF555 GnrY)+󣆍N0aС-^Q;?5k O8J?2ɬۻwE߾}%Mׯlp@ppYNNRՄaϱؔO%ɓ's8%egS)))YYYT3F[tSd?Htttd9<>>}P+B}JJ]]]ssW^I*<|#>}̝;7,,-44חJZnnn999nnnL&`}V߼yCӷl"boo/idsRV'|ߚ3MMO>$00AE?w޽i&==[Ν;W+W|TSWTTLB?E200knp܋ !Jղ쬢>}Ro$ <OCxᝲmMM#n!}x<YzJJ&M4ݻ/_&dff޼yA,((~ؘ;vdRы]\\Z?vJ\C,X0}t55DWDӅc* +jRgΜ?~\vg466ϧrsjjj##|Y( aÕJgΜir8Y}GŚO7n… MLL!|> Trm& @&MZ|95@ ܿ_GPPFǏS/rJZZ+ MrNe$9;; JJJ#F4M+200x%jjj:bĈ~I x׏?J ܹ۶mrdyy]166vtt ,..N}7~ϟ7kR=\vvvMn_%YSdB_~~>u!hŊvvvӧOt߾}b6L8zzzL&3((H@CiRwwcZXX߿z2S:Ɔ`NT\{{ظ۷`xEVu떪qh4کS>}*v~cǎ1 }}}--5Jҏ#B9{leeg}FѨ͖e͛7d_$b׫W7$mU]]ݭ[|||r?tIzjuFZfM6QPPPRRbff&e8f}}WD@Օf633bQrEm'22Y #ׯ_s\###j4p84Mtl$FFFĭ,R0NMP]MFQBG R+UVV׊:?2NF49Q֬A޲!׮]KMMܴiӺu뚵~[6k:\8ҍ꯿ڵkV)@>,,,߿կ_cǎ6kqSS#G2"2'ڽ{7mtibh K=8d. @|DF)]#."##Q@LCHQQ R"Ph%!Ša@ R{\tW?:/@D)߿P.k=|cP})9%%%11del6h%ưs;lAŋ{yy1cf͚Ejjj~ĺ:[[SK%$$9sFAAaѢEl6{͚5 JMM g0 섄&>uTIhjjFDDoҥo޼9{, 033#pK..^t!!k_2Ͷl0Ν;cƌ:sٳg !yyy//Yf]xڵk\rڴi...Wr Z{cbb,XP[[LM{~嗨(www+++I۷/%%eΜ9AAA'N>}z^6mD5a6=s窪E}-ZC־NڰaÇLYp͛7}||LMM PRRRQQ1zW^nذaϞ=Ç'=}q47nNZWW׫W R3;88]Vy\]]Bĉ>|xA:ޫW7RK=zhǎ}!d8 @֔\__ޠ/9::Ȅ.ۻwoBHXXuuu Ƌ/թLj$a/UPPPPP +\V}`٢lmmtʄIgENNNtOn޼"z2%'''+*~SSSkkk !<~xMMM.{! 4wNx:qP՝_hgth@JAWi>uV#.|DP;%t @K.**B r Lj헒']dd$ R"PH U|wpz'seddNY`Is`5*66VSSњ&fK'NɱNn***Op8岷񲳳y<^7k*6+I@=kdBȔ)S`w F]]]||쬬,mmmKKK:EEE  0N IDAT66\ N/--366VUUh=2 kd--;w~ׄ??HSSӌ --۷o3LjuFGGoذ!88A))) ZZZ)))'OO!nnn=eX͸z?X"ٳبӧOYB6nܘy݌ ##;w ۉyQDD?a!z{{G=z׷/Ydʕϟ?geeea ^@g8ui:P3 ?A~~~jjjɓ's8bݻ~~~%w&L:thxx8Lʊڶm[\\!Ȩ&!!A]]=99yٲeTp <|:@J vSb)nڵ Rsssqssc2 ۷E[{ N߲ep=-QV_m!@ .6<]#%.33͛TsAA]䲳E_.kll;bDWTTS\݇@3`B4c\rMMMZ[QSA6==â?~<77rʕ4WW)yҤI˗/= x<333[[ۍ7B\?=E:%u0@'Jɇq9IsXz}ر>>>700hӧ,--LfPPϧhGxbMLLFխNEr01C& ߘYXg%~lfa JJJ|T[[b+i񊊊]]]ѧեwGFFN8 TJ<ۑ,=WB~w8&سm CtL,@JLۮiYGVVVg0 &ի :;:%Ds NH -(#"<t(A8e7.@GiPF@Jٿ3eь8d@¾dh8]Mj/9225j;(/1r3R]qh{C"2 8 ]:#dq|,@2<=eї|7nڴimY^^^-X`ԨQp8jjj S|5!2Ho%Y%KֶlҥmYexl'eWWK.u/HfEdB3@ԗ\YYy;wLHYYYtꄄK \.FRpiii\\ƛW\\\WWWRR-ŀ.\.ϯNH??HSSӌ --۷o3LBÇLf|| ]]VV޽{S>>222""555^ezzz3g677[S͜9sW^UoAAARRܹs͛233ܿ?''wߥ2 E25qF'@-Wt|Y} s\,^xńׯ{zzy{{y{{lUZZJקե"455ո\.㕔(ѣGL&3"".:uhBHii)Ţ+x^yvyQ3:1 ?Fˡߥd W1bժU۶m077 uqq\bE7g_5WpĉF.kkkfCBBTF\0Ç9slȑTy'+hJ9 k][ 䭁#{+k?[YӏjWWW[YYihhtu'Nܸqea:)HLLL:^KKH$ÇW.Wz*'!!a֬YT RrqtM=vO>6Ӭlg0.YWWںm9ánm:::vvvaXTjw#j^_Eo@G2@͜9Wms ]*iS~qGFFbhz7Za ῟_ wʟ37C3H@WӕMsQi|d>D Č՟;@_2K``]@O h ǀp< SrW紇.Ed4/*¸dr?'N % ^')^\CopFu8uꔑGo9--;Zd߾*bX__b[3--m/^giiI-mnn޵kVXX]-Zfk֬Yf͜9s5]z5%%~:o<4 @n_rtt+Wzq2P&#@Х+uَjnڴiŊO/=g}NW8{lIIIAA---B!/44o)P߅ N:UT]]zX'^~%KlaooEp8[[[&Y&==BWWWQX,Vss>zh* L4IGGGeꢢ"嬬K% ,8yΝ;555 !ǎ[po޽{ ! bĉ;v ̛7/((3W@̞=[w)BD$)999yҥMMMΝ7n!$000!!2//%$$$x{{=Z"#// *:::޼yfgdd^x1%%vw:t*wD'O7nѣG?kkk%EEEqqq/...}w}t` 2~`XdP_]]]bb"5jr@O UMOdLzj__,BAٺuk~~wEׯ߸qcrrP(333322~O>oܸq *onggydL}IT ;FW^ۮ&&&"''_~*Pŋƍ, 27HRH$ 7nnڴ)55"####""Z[[SSS !yw ! cÆ ի3glnn~뭷!:::SNҦU _^QQTOOx<\=]j?QUU#9ʕ+&0P1uEII&=̗,̼l6*--%X,z ]bcutt) 444|W7lkɓ'?xYYYSLw7o|H?xW@7HR+m譠 'y[@\W0⢩BSxxBd[l1cԔTDVrttܺu+e@ Ύvʒm͘1#99m333$ZZZ$I]]]ZZ7|3{lzo6c @MΝJ>h֬YХ9lwqܹs嚘D"q桡...T gΜ1339r;'$8]]]WWWE+VqD"Qm&ݯ,\9**NqqqxWjdddjjb?6Ѡ~wDOV^lemMbr ˫Tz"|~x͍ `O>^Y!?355m;NW?"\nzc1ڝ_ }4{vGu-ҲWMcǎ?vލt@ E.00R@giiyСo!ad<4C< |idx^5$}hjd[ <3$c"2R2 25)ӽ .#%@D=`Ay887@=cJWR2n{\#2p /m>aK1y4;" ~..B\ % Oՠ~!hꎸ8uԶm۷ܹ{;^dIll,X,K$+}(O!~}Yxxxv"^^^gϞ};Ճ+tSFU `)`'ORO;pB R4===##.,++khhyÇ GGGBHUUUKKKuuuQQQyy37USS?5N͚J[o@<`ffG)..}_zirru@@]ff&U>o޼w}),,믿ʽ{BݻE"QddOXXX ;vlhhhbb"N@Wu v39(/$๤dBH``c!111>>>TL&[zozzzVVG@@=BݻiiiIII'Nr6onggyGv̔%KBaW;^N~~~ׯ_ E"P(ܸq#tӦMEEEt򴻻'Obq'|Sk׮e8m=ɂdgA̫5KɆ MMMC=~Ga:2.:9v>f`(r.d? ׬Y<+ikkkqq1Tdc*:BxA2fضB"AJV5LzD)<<\Pd-[̘1竹M>EWK{R)dq>=%3L7s.kbb"=6tuu]]]{)P? 2: jP?ԽCk.Zg]FFX,f0ʣC Q.6mP()x~x/Rx<^?7-WtS[Pt/tCdLYKK  +:1Иh$=[W / % p>.+:xnm;HtIbyOjz@dx._4~TyxǩP %ϩ ;00.@3F`@#FJ4/tFCq ,^{h(ܗ')nܸqV V]qҲ{3rccWXuN !?X,?~ʕ+555~{8::1LPf^ֶν{BQ\\[oE磻$&&ѣGFjwx@[]Kqrr=ztNNUxͯ:55uʕ͛6m<11qݺu+WLHHo!ń˗kgΜx"!$>>~߾}III>>>vvvٿFFҥKwI~x-u;S+++;v)Bunn.U. ]]]<<kjjJKK Evv6C:~z*[nff^[[KmPPx<]]]\sΆ1cdgg[[[S҄vX[[ӿζ#P(H!r]@ݗWQQ|rX77C8;;CۖO>}̙c5wK'ZYYikk B*RYJք3fL:ܼl۶mSLiw8.ڎklw?~x___Xrnݎ)l6[__*J%%%<OKK}SGٓ'OMLLttt:u1bނGĬYCkmWcq1.M, /_AA\mnnԩL__mnk=Yy… =K~7T0 0*40 \CBСCGNF;y.\ɺe,=C@MK__SyyEvv;B-j]Fk? @}KcO>"xy/MNIuRE$# h+j*Қ֖ںRmm-6dƌ(--U)̺ Ç kɚ9i3fLTԱ‡p/vlG@OSree%AtvuT&m 6B>ChȆ[W[z'%wOYnnhh#m_sƏ?zRyiÇyyNFSOvR^Nl Z;tP>mGIDATBCCvlbbL)+/GJdl]vr2ؘ1!5!0 jB 5a&8$LBd_;OvrrJ>uԶm۶o߾gϞӧO?zHϟߍ[dIll,X,K$`m``0vߎfNyefÇtps8+PuG\DGGJ˗/^zŊ}ݐ!C:Y+***###..nذa88X걗`mr4`vض1>Ǻ9.~˖-QQQ\;;;M6YZZ^vm۶K.O>>>'O$Ξ={֭ .2eJUUɓ'ߺuz,jkkw{nHr0wrrϜ/\@INNl*:̛7/88xرx Vݟ}3qĀ__pBŋ˖oZe֭TG\._lٮ]"""vG\(+W:99|H>d2ʽSNmwoo"ooo6bJKK{?~ KJJ455q<;ѥ:mq)c9r$QQQTH~~+Wjjj !yyy"==qYYY3v'hmm-,, MMM[[[|>!Tx:C~"H޽v}Q9uΜ9^}}=!DPܸqC&qMM\^XXHDoBcǞ;w"JQm]f ~GXWW'---él2c * :R2!8p@__-_\.'''{xxPN8rmmmlvHHH8knnboob zі-[~G@`aa1a„vꪲ(&&"++`ܹs嚘DGIu1=}ʋߖD")**211144Nyyyuurykk\.5jjjJKK̨Rb1|0quz~<ϔ0 oAh#g͚եU\nzcΆFܼ?o|_5Lx@[-ekky8455{wB_:=?PG1cQ )bwnCjwT{ % % %R2@1EBBIg4K]мGduB bnn6ŅdY)^jWTYU5~CSSS̉Sf_@R2&M`BȣGE+פg899RJJJKJJ ͩ>FT:|pBHSSsݓ:c"+**+F+z3%:u*//`ӧ=p7jkkMMM]]]ϟOYdq@ݻ|Gl2ggvedd9rۻˡ]|>dVWPO#>ߙ7gÆ駥g2B>}쉘#-3>˗fu;\ttٳgbqNN֬Y,88xÆ stt}wr@3j2eJZZڨQMvɶu޽;uTBѣ˾----#&ʃĞ=}!'//xfe9*%%8@G2 #.K=vww 9p!bIcr8‚ckkd2 !ȈPUUejjJ|>Fo'wwwD.?L #477+!!d Tbp^fÇڵ_Χ~W_BLMM|!CU9Κ.pk?RRR444d :6%%u0ǏC{ƍ$5u"[ljll$̛7/88xرg޺u… LRUUEIHH>>O<_ex3NvC2*|}'O$zzzO$19%-5-}xg%9fxzU*L4f !t?ev1sǏYYYǏ7.>>.>>~*)pժU]]]_}ǫӳǁƮ " 7<<rŀCd?R677ӿ`X>r徫\xb;I.R55ԄqN_4|0N&&ƱglCSS uuԧ՗LYv-ޚȈTBK|||uuu^^uBH||<=BϜ9cll|ȑ &t灊m۶%&&?^GG ))iܹMMM8/VccO>DeջNww qMZ[esɺM?nHg9j!tY'Ih=x)666#GC&\RSSO)//ˣS~;bĈsr8ss={p\kk5w\ ߾}7޸|1c \y0"Bjݶ)<55uڴiP4a„*)S{姺W+}< 8!d/ǯLx3- ]҅D}Z.WTTTVVRC=^zryDD+2z>,Dd8/_.˓=<> stream xXKo7 ϯй"'P`(98A`psH~?Rg[bG>yzv7߲[/Sp͇S} >_w]}=;'^;?M"V1'EܓKHS{t'P@(% XrܚL~ۗK~zR9@b75PβD9`[*IEI "3ڞST/J8"Ac*>F:!c1D+ >[IJ;$wPhLvW: |Ҙj39@k㛺2ܯz!s1?T|&؁mhXG_Ȏ<E#+'$<0QK[N)jbԃD,9LDRWhf|m_S$.1,4՞ZO|JIDlhq҆6(DcHHW`Wp .O.%S˫R n}ZNpQo C[etڲ2 x+CjuxCt%"JWe]NI2^ظ㥬xoz]]yčB4/'=~׍ηq>&yσZ[ef68* %U1VdJ0uL\qLGH A6SiyZ_ %WIBͲ!dqi6J]> /s6 6 0 R /s8 8 0 R /s10 10 0 R /s12 12 0 R /s14 14 0 R /s16 16 0 R /s18 18 0 R >> /XObject << /x7 7 0 R /x9 9 0 R /x11 11 0 R /x13 13 0 R /x15 15 0 R /x17 17 0 R /x19 19 0 R >> /Font << /f-0-0 20 0 R >> >> endobj 21 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 577.599976 382.399994 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 2 0 R >> endobj 7 0 obj << /Type /XObject /Length 104 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p5 5 0 R >> >> >> stream xm 0 {8q]8h!/o> /Resources << /ExtGState << /a0 << /CA 0.923077 /ca 0.923077 >> >> >> >> stream x3T0¢tDb.Sss=SKKKs3c #=c D(U! [ , endstream endobj 9 0 obj << /Type /XObject /Length 70 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p23 23 0 R >> >> >> stream x+TH,)I-SH.V/02V(NSO4PH/2P0P057347S0032-MRҸ,R endstream endobj 24 0 obj << /Type /Mask /S /Alpha /G 22 0 R >> endobj 8 0 obj << /Type /ExtGState /SMask 24 0 R /ca 1 /CA 1 /AIS false >> endobj 25 0 obj << /Type /XObject /Length 53 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.923077 /ca 0.923077 >> >> >> >> stream x3T0¢tDb.Sss=SKKKs3c #=c D(U! [ , endstream endobj 11 0 obj << /Type /XObject /Length 70 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p26 26 0 R >> >> >> stream x+TH,)I-SH.V/02S(NSO4PH/2P0P057347S0032-MRҸ, endstream endobj 27 0 obj << /Type /Mask /S /Alpha /G 25 0 R >> endobj 10 0 obj << /Type /ExtGState /SMask 27 0 R /ca 1 /CA 1 /AIS false >> endobj 28 0 obj << /Type /XObject /Length 53 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.923077 /ca 0.923077 >> >> >> >> stream x3T0¢tDb.Sss=SKKKs3c #=c D(U! [ , endstream endobj 13 0 obj << /Type /XObject /Length 70 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p29 29 0 R >> >> >> stream x+TH,)I-SH.V/0T(NSO4PH/2P0P057347S0032-MRҸ-f endstream endobj 30 0 obj << /Type /Mask /S /Alpha /G 28 0 R >> endobj 12 0 obj << /Type /ExtGState /SMask 30 0 R /ca 1 /CA 1 /AIS false >> endobj 31 0 obj << /Type /XObject /Length 53 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.923077 /ca 0.923077 >> >> >> >> stream x3T0¢tDb.Sss=SKKKs3c #=c D(U! [ , endstream endobj 15 0 obj << /Type /XObject /Length 70 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p32 32 0 R >> >> >> stream x+TH,)I-SH.V/06R(NSO4PH/2P0P057347S0032-MRҸ,S endstream endobj 33 0 obj << /Type /Mask /S /Alpha /G 31 0 R >> endobj 14 0 obj << /Type /ExtGState /SMask 33 0 R /ca 1 /CA 1 /AIS false >> endobj 34 0 obj << /Type /XObject /Length 53 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.923077 /ca 0.923077 >> >> >> >> stream x3T0¢tDb.Sss=SKKKs3c #=c D(U! [ , endstream endobj 17 0 obj << /Type /XObject /Length 70 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p35 35 0 R >> >> >> stream x+TH,)I-SH.V/06U(NSO4PH/2P0P057347S0032-MRҸ, endstream endobj 36 0 obj << /Type /Mask /S /Alpha /G 34 0 R >> endobj 16 0 obj << /Type /ExtGState /SMask 36 0 R /ca 1 /CA 1 /AIS false >> endobj 37 0 obj << /Type /XObject /Length 53 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.723982 /ca 0.723982 >> >> >> >> stream x3T0¢tDb.Sss=SKKKs3c #=c D(U! [ , endstream endobj 19 0 obj << /Type /XObject /Length 70 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p38 38 0 R >> >> >> stream x+TH,)I-SH.V/0P(NSO4PH/2P0P057347S0032-MRҸ-g endstream endobj 39 0 obj << /Type /Mask /S /Alpha /G 37 0 R >> endobj 18 0 obj << /Type /ExtGState /SMask 39 0 R /ca 1 /CA 1 /AIS false >> endobj 40 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0.345098 0.333333 1 ] /C1 [ 1 0.6 0.333333 ] /N 1 >> endobj 41 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 1 ] /C1 [ 0 ] /N 1 >> endobj 5 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.8 0 0 -0.8 -31.724344 389.177102 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 413.203125 289.5625 393.539062 472.515625 ] /Domain [ 0 1 ] /Function 40 0 R /Extend [ true true ] >> >> endobj 42 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.8 0 0 -0.8 -31.724344 389.177102 ] /Shading << /ShadingType 2 /ColorSpace /DeviceGray /Coords [ 413.203125 289.5625 393.539062 472.515625 ] /Domain [ 0 1 ] /Function 41 0 R /Extend [ true true ] >> >> endobj 43 0 obj << /Length 44 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 577.599976 382.399994 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p42 42 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/01R(N2P0P057347S0032-MRҸ4 endstream endobj 44 0 obj 70 endobj 45 0 obj << /Type /Mask /S /Luminosity /G 43 0 R >> endobj 6 0 obj << /Type /ExtGState /SMask 45 0 R /ca 1 /CA 1 /AIS false >> endobj 47 0 obj << /Length 48 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 578 383 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 46 0 R >> stream xmM= @ +,]ﲺC]A*bo(&<G2B طn}Ase0!eX3\GVX#Uj #RlDƥ8Lⓦ`L#URilC?+') endstream endobj 48 0 obj 143 endobj 46 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 23 0 obj << /Length 49 0 R /PatternType 1 /BBox [0 0 578 383] /XStep 1921 /YStep 1921 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x47 47 0 R >> >> >> stream /x47 Do endstream endobj 49 0 obj 11 endobj 51 0 obj << /Length 52 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 578 383 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 50 0 R >> stream xe A <Ԃ1?wF,V,DA8-|}s0$|3D oy$(h+7pw^oSw:\2> >> >> endobj 26 0 obj << /Length 53 0 R /PatternType 1 /BBox [0 0 578 383] /XStep 1921 /YStep 1921 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x51 51 0 R >> >> >> stream /x51 Do endstream endobj 53 0 obj 11 endobj 55 0 obj << /Length 56 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 578 383 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 54 0 R >> stream xm Q D|Ԃ17lk#k+"nZfJL$3Qp ٧: '][+ .Ä^p$C֔=C5,Υt0/T8g vg( endstream endobj 56 0 obj 141 endobj 54 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 29 0 obj << /Length 57 0 R /PatternType 1 /BBox [0 0 578 383] /XStep 1921 /YStep 1921 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x55 55 0 R >> >> >> stream /x55 Do endstream endobj 57 0 obj 11 endobj 59 0 obj << /Length 60 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 578 383 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 58 0 R >> stream xe ` <͂1WAp8BEP|}SGM8KniIŷ:$2.-B߻]t WiDŽ^#j2 ͵ Щ,n56 39kV4֞Y^>K( endstream endobj 60 0 obj 139 endobj 58 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 32 0 obj << /Length 61 0 R /PatternType 1 /BBox [0 0 578 383] /XStep 1921 /YStep 1921 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x59 59 0 R >> >> >> stream /x59 Do endstream endobj 61 0 obj 11 endobj 63 0 obj << /Length 64 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 578 383 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 62 0 R >> stream xe P <řMrE*P;&skȾ׀%a)Pw0w\C:MQ"^uHݠU1BJZeI'476XvbA+,ܬ BOzMX(q endstream endobj 64 0 obj 142 endobj 62 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 35 0 obj << /Length 65 0 R /PatternType 1 /BBox [0 0 578 383] /XStep 1921 /YStep 1921 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x63 63 0 R >> >> >> stream /x63 Do endstream endobj 65 0 obj 11 endobj 67 0 obj << /Length 68 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 578 383 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 66 0 R >> stream xm A E|ŭc33 XXŠj+1pn)K?ǀI0<)h+7pWloC7:\(a 1Wy$ʦUFX؛Sw$sK|R qM0/Kz wg( endstream endobj 68 0 obj 142 endobj 66 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 38 0 obj << /Length 69 0 R /PatternType 1 /BBox [0 0 578 383] /XStep 1921 /YStep 1921 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x67 67 0 R >> >> >> stream /x67 Do endstream endobj 69 0 obj 11 endobj 70 0 obj << /Length 71 0 R /Filter /FlateDecode /Length1 13108 >> stream xz |T7o͒I2ɼa2e,d! $ KdI,FjUl .UR& 8 -PkP`駐ܗsns/ ڼsf$ŰtU+Ǜ]`y[󂥫_?@.>ۘ6͙VtF/R/|¥+̽ۀ鍘}ټ9@Fb7k5O2ך75mW˗Ieي0^OF ("K Q2;@GL$#V/NVϗB%LF &xq="\ X Aod$4Ӟ("\T$K,Bbwhv%Xdb80ƏGdXbœ\lŏw&;ٛ\, K.fD|bG[!-.wr_'HqFS:)R((Íe71"!W4G\хH "i4QF'->e75*P_3( [ؒJ̶d4Q(ӗyQBxY%E 3BN,W2|T׏>8X)6RE5* ʫdɓ=dGJJLeFbL S!ѼIOmқnv$.إƀ\dCJr ǏNwl#$DL8lf?T!g`bGS ,4,47̸ ( 5T3ȜFRb0 (r MȊEAĨ'"iMhA{"fѤ7m ݢ[ҞNB-CsT=ЧR]LG{3Fl>QŤ:^N[2&~OoW&ɒlvd3p1zc@3JD9QP| ya18'dúfK{Ն{Ql6]DŠra&!ϖ0zt^[cHf좲[n;nܘ[|閉%/O(k\>qSS! EFm :o0V: rJbJ1G;'3:Bʷ 7oޑ-,ˮ2V+3ggd.e6fe~teHю C$LT ͮ1hLDתTWB^0O ze ZnT]WQhAɮ ͡+RA>mWܳc!9wǟ>pM>=kwkκ7F"?A'.-k^sCByWͧ G@oFcDX&7%Tt' I({I(o&;>+qԤ955  .b5ݵFWsy[*UU>٫0c/otGANʏ9ɇ`(H ^41)"'&'cCwڂ%\nh/ oZ7"TS8?.wf,q~Kg6Jf>E2l7HTm >??E' m@B(쉔#іH abp `1ۃ&JQlĭ"&bxL4b ^&1nÕ7r᠛)L@)D+ ؜lTMt<еg#vul3tf">d'?-CE)T\<4)m@V&ʼ6| zS+fRR,C-˫&g:oJPXr!6I6Ni'$N5,(<ŪH5qɩ B|^*1uެca,&>50c"l4fFiy< l׮8toࣧv}F{'/~5kQg/)rcɷx?~u^o\&Ür9?SpAnI Ȟd T!k42wHJTcA5#Hx'ڈ-Fx[I2RDy 9d+2Ĵ`OW㕬E4@r` 5jʄ ;#rlnNH&bu>—]5)$|]^Hm|:ū~/_ 7+CM=n.y5kj`~L: H]TM zia$%WRW*=Y4Y*,KK]=Il̷p3-۹&IݤhC;DG`HqLXȜ Җ4 +QI̡*Й4\h@B(==.L se4;B$~={@߾΍:oȪ/ۏH*1[GpML=)Vy{9Y'7mr\V|2zbd.x ;(ß =90%0u,/C>?2`.cy /6uww;zb鐮s_޹C S_q ƻ"PT1IOktٽˬ-&K1EHga?:?9͞{8 @#qx'ңpۖaRs&+"*A dbUCꞵx]5~(\J7>ƧkU;kvW6J7ܱѷjg>I ;1=1ht?E⶙SK2IDe1]-VmM{e`raˬa ׏QpdZx{MX,Òىc zoBQ#>LWOTexOQ}}uƃV6`$6v|HꡇkgF\iG|:<3ns,~wrׄtk?(|<}w>|+SL3? ie"CQ zܺI'')SsI9iGR4)'PBch%<9‡.k Ƭle)Ij1[ JIP_xS2%[20mZ7i_xb8Cь~pSTcvԩyĥS Z]0uM ƁEuƎȯLp:Z˴F}Z)2.Y۪I%II-YYɋ%ER=ϓKu+pB_VԛSƿ F/=wy-F$SDF7 ȣy @![%#ed 9 Q1=#bM?SOÕLT6*Gn:x剻o25/c`S7ǟxvC7_{[u䣡웃F&$ 2cij4=(=(o5ΙDyj"˚$8%I@ШT &4Qi1V"mV D4Q<-C_HĦ )4 [ 1Ⱦ#$2y:1#ORb}a_Fx"QMJ,NNH-F B7% N6GmkW]> ڙvDTd d1K}|՛"s]|`d9."UppN+%S YRؒb4RM0D8:6~u}8_Z`pBgokpQ02 ÜnɰsEPh_-m~fz;aa C'{kQdE&l)kE;d%MaAt hQL4-j +@)$N@h%d1+6fID}c[ ( 41BDѦ(drDoSld>QH, {Dž4|C-IH}Zb~st5_mEE=,ZRUG}͚I'ѹKX7jX$)zꫣQq$ qyI6XjT;kXh0:őN(Gvn-~Kx c%^{1d#w8Oc5A sSLHKH_,^ܷຽ_}1#>Tޡ]s_V9s} o,F^V(ofYཉP9{BN*u&U'54OT)[G#`hƳ\a}r7>կz_{~ >ZO>KcW!#, 1zVr.!q8 0Z.<X*Z#0·T ;;^z$z,gX?~cCvE k uO125X LWx78 "7pVqàe0!f ~(h&m#G`FW}'g0[<O C 9a8?9Pޛ4xx4~ a'd 5wPa $t^|c[s zO_7PiP5wG8Ft`rpW}܏Qp#l578ܷc&m|AH3i&]F-ƶ`>,By?'aQYe!ed܂;{bƕj|Hl)"8W}+,e7"2Bd#1yC3ΠKYn!t_ |Ib$|5'7@_s 9R9WZ@)Jh JC='rF%pYkVpwrsQmsKw 8>~~6%?-NRCOq8V qԈy+pCNrJnOt@^v#eP3> sa*#Lz o`2Wq͸05BGX(1)/tLIqQaA~^9#g23C0KM&'%ztmb6YG dWh1ʇ'g,sUAcTâkyZΦ]A/ g 'QR(U;-FnZz-ڧ5:UH@,ТQVZ^XuMlPH=uWtP8hR2`3r9S*+Q2~^`nְaQQF[Vi=c*m ϙUԳ1la"꾫C;xum2^Yl{F-cjյ~cؖ۫p(FEzRc+a\_S4.֢r`\`aFܚ(Lߙه!jR>.%Tx;>ήĈxm6(u0&ΨiW$K،ףBDyΤ.k*bIS+B6| Y7% A5 _[2gTF2=jXѬ,"xSX=_0<{Uͪ(9%9(~mCLmj`^ɝ Gi#\p#i\syc5[RϪ KnVU7ɶz5+uCT1KCMZTYWY3J=?&Jz Ѫj^6ZfCӌ͏&LN7+ԡ xBu~m|nD /)bP3Կ5Ct=>L;gWko hUsbM ڛ+/+N,hzBR2\S_3Ym-VJ♯ҳs]_H7`VF؁0^w%C?<. 3A濂L#VD_!Tٟ&n3, M7g4 HW ;E<8i$#g2,k@aPF1?>}.L `P=G1)X97E#p4a l- :+YpAszMsw>!zHG]oճslMf ~dmT`q8={ۃm +ܞrc1%0X dQJ"+- Hr/ xG:ͶrY?h` rO_n/p=ҴbZ QzǑsA(C Y~J?c{.C3LU\_0O~S{8wNs_pp'vWn]/F¾#E8!"4"4# a+(|m>6GFF"Dj$zѣqrFěCuE7">B_LAۨU9X/w}r=aP0a6=HuٱWv7:~  GX*)LkC4zI̲$ȣH$fXkR, ݾ )/F%g#ŒДHa|%-W8e ʭt5Ji5Ji5Ji5xyܞBm3|mI6=CښH۽mi+%m0iT!m"Et_-xHҶi 4ҦH;Qʙ]!nlGQh1=sd҆ 2'2<+l0?$wYDzm8'xܠCFC؁2=gߢVLsf#܇pO,eCSܭO,ghSX—ݎIQjXmk*Ob_6#6 Rp#-ߥbЫ3HQH1HqJ 烗8;Y;CپZ}}Q$x_}xK^{͜%B1hvYaŶN߽ [++nm\7EZϽ2ﭾAfo$N!ФAm|Al|i !,CP ʲњVYё5hyZj'6W:]Bs-dxNS>T:ճX@E̪Q1+T9&220kBm~5c=xeY-,5?T lB6V!kBd>:^[!z uE kc~Km+#ZLx6#YP1dPŶ8Xٺ<*`ъLi`]%s+ZWTGWG^!XȖ-\f4Vbx>X8 KX!]adeL]$JV@k=MApV&Ч 4^+!9ƒIeq\y z endstream endobj 71 0 obj 9709 endobj 72 0 obj << /Length 73 0 R /Filter /FlateDecode >> stream x]j0O1aѸb2 5|e ~LdL/scw?g2՞S&"'ݫyS|A$ 2<4֌IUQ=㇄7JKW͹Δ%uMMXEW90xe2>ǔG lI''{iTYjLꄭϷΨocYv|rHB PN:E9T"VB:#s[EFCTTA11@%2k WXSl Wbb믈ǸzR7à/'Φ|֪x endstream endobj 73 0 obj 318 endobj 74 0 obj << /Type /FontDescriptor /FontName /Arial /Flags 4 /FontBBox [ -664 -324 2028 1037 ] /ItalicAngle 0 /Ascent 905 /Descent -211 /CapHeight 1037 /StemV 80 /StemH 80 /FontFile2 70 0 R >> endobj 75 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /Arial /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 74 0 R /W [0 [ 750 666 610 666 610 556 333 556 556 277 722 833 277 556 222 556 500 556 556 666 722 556 ]] >> endobj 20 0 obj << /Type /Font /Subtype /Type0 /BaseFont /Arial /Encoding /Identity-H /DescendantFonts [ 75 0 R] /ToUnicode 72 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 21 0 R ] /Count 1 >> endobj 76 0 obj << /Creator (cairo 1.8.8 (http://cairographics.org)) /Producer (cairo 1.8.8 (http://cairographics.org)) >> endobj 77 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 78 0000000000 65535 f 0000025390 00000 n 0000001997 00000 n 0000000015 00000 n 0000001974 00000 n 0000008701 00000 n 0000009908 00000 n 0000002542 00000 n 0000003806 00000 n 0000003345 00000 n 0000004724 00000 n 0000004262 00000 n 0000005643 00000 n 0000005181 00000 n 0000006562 00000 n 0000006100 00000 n 0000007481 00000 n 0000007019 00000 n 0000008400 00000 n 0000007938 00000 n 0000025241 00000 n 0000002327 00000 n 0000002976 00000 n 0000010476 00000 n 0000003746 00000 n 0000003893 00000 n 0000011220 00000 n 0000004664 00000 n 0000004812 00000 n 0000011964 00000 n 0000005583 00000 n 0000005731 00000 n 0000012706 00000 n 0000006502 00000 n 0000006650 00000 n 0000013451 00000 n 0000007421 00000 n 0000007569 00000 n 0000014196 00000 n 0000008340 00000 n 0000008488 00000 n 0000008610 00000 n 0000009027 00000 n 0000009355 00000 n 0000009821 00000 n 0000009843 00000 n 0000010403 00000 n 0000009995 00000 n 0000010380 00000 n 0000010719 00000 n 0000011147 00000 n 0000010741 00000 n 0000011124 00000 n 0000011463 00000 n 0000011891 00000 n 0000011485 00000 n 0000011868 00000 n 0000012207 00000 n 0000012633 00000 n 0000012229 00000 n 0000012610 00000 n 0000012949 00000 n 0000013378 00000 n 0000012971 00000 n 0000013355 00000 n 0000013694 00000 n 0000014123 00000 n 0000013716 00000 n 0000014100 00000 n 0000014439 00000 n 0000014461 00000 n 0000024266 00000 n 0000024290 00000 n 0000024686 00000 n 0000024709 00000 n 0000024938 00000 n 0000025456 00000 n 0000025582 00000 n trailer << /Size 78 /Root 77 0 R /Info 76 0 R >> startxref 25635 %%EOF 3Depict-0.0.19/docs/manual-latex/figures/rangeEditOverlay.png0000644000175000017500000036153512640746376023452 0ustar pcuserpcuserPNG  IHDRC6ExbKGD pHYs  tIME  bM IDATxwxwRZ (U"CAq,A"BD9 {hRZVH<"mBUu]\4g>+w9 I;""""""""""""7m N~ֽ{wNy/<\1 %nج638s>="ڷmˏK NMu@E??%x.Y%"""""""""""׵~~Ёsg؜IȈ #0 Lh$''G""""""""""""7 \ܐvV9?_8v4aoիWrg3sCԈ&R'z 0",$#HN:jEDDDDDDDDDD_;32Ygm'O`XYקkug$#7nhX.*z V V#{]k{0kEDDDDP9f399fLNN8;;A$"""""%pfȱl[Cexsˬ$ΞfͳlV,))`6aVQ)voǜ `rlzjԮg%ëC=TgYoN:9;_{HKM³LY] ٵx[t8de1BǼvQf%¼8~)EyV܉ =1m8 s9N /iKeZOJfy\~73DЩC K+r*.Wh4(OxPyxzpIrr,iHi<@Fz*Tb@pڳXjkRh^vVѪI}6lE )SԤ$%Һy#6lM*8X6B0$5=w;39|0|ц``5h&uk0xyc6a3ٰmdŻ+?LS @z;N[Feq29apFe3C23Ұf[*,Ӡv-1dw5CDDDDDnNK~gn=cYz|bNƸҪ^ujTi8ɏm"F=c;0,n-;M_oΎZ %{=m>N=mq "'N[};e#ֽ WW`ՏQv#FS}n=רɉcge<{X-V F#lF#ir+tMO%mANNdQڷnB:wB,_3js:} V:ߍ+-'j-]h""""rKM>GViQ>v99ʔ-Wd9KoN{>vSFB 갭)3\3CM&\]18H1v||p6:$za݅fwѴN9$'0B%7ni՜5+OP1D)lR X3,N%مhzB3OJ-Ӯ Ma{#5<EDDDDfBfR"SFhP==4(ɣ0ͩ9x\X0gptx^99ǟ F<}L}cUBs,:aoNū<9V9ւ&5= f\r ٮ`2 l{d)NabĴ#cgĉ Z8-LQ S ii)I4iɫşNI:$'""""r3z'o9>;/*&ǟl6R֫ LMMș~6,_`+/ѾmK4WKnjD~/,nBM8b4mXVq &/ cܶfwCzF5R>''gA! Ԭ^ѓe]H[iլ)mgQ4w+;,u^S<=R7DDDDwT,S_D@ER%$/?ǐ1p,밝KZj'>yxaZ*i3)x-sY;V BFV}, xIzF&jl6d qߛh_` 29NNVe /8rd>cI)i'e}>c ORJYXOHo9+Vh2r9,yssj(2S~}=in&=}8~"e>\p RS llLldw#mz?Q`8zG͢?`no݌Wq_6nޘGyuT223YSL&}*bb1SRedcY)mSX[֋}7NKFRJʅ\n[I)yꧦ3Xr^v$ @Y??_̷uw Y)|2 B8h 4(O~$fëX甧Pqɮ[F>V7lجdgCl,<  g'+ٜZ/ܛbۗ}IuhӼ/eKJNaG_[`]/f/mԯSuk.u xQJm7֝{IJN!r%ArJ*73v#9% BC8p8ʕ*ҮM /[gᲙw%߲c~2 b`89ę>jU ٶs/iiTs}{p,y4ggS!\fOvbf8hjħP-,Ȩh&L{a!|2u4!''" ohBUi)jٹe dy99VxIebf4Qapus'-3OcȳG릹ku'?MńD &'N'V`*4/'LS}{ ~m#F.,%E˦ 8ppwwcˎ= 7O۬Vl &' ufjXMLZl x\,9d]嘳(8 ;.e2}R-%$fz( 1~@a378;ʭ(c`T0DDDDDf2^q]l5Q)_I)8mK&S ѨADDDDzqqŭueɘo5Jū IWwO lL "w. efQ@e DDDDDDDDDDDD}kNfW023+8kdDDDDDDDDDDD亗mƜ;5bbrZ&28L\7V9 Yed,HJ`5 Uh*7 9i0)` |oGDK,. &J87qSZ ○ \G)""""""""""""74CDDDDDDDDDDD䆦` !"""""""""""rCsȥGTT 4O>ԫWȺ~-k֬!&&+Wj0EDDDD䚠`Mѣ|W֮] ԩS0t҅I&qزeUDDDDD)2Yk2,z)[mϓ˯n̙3dddY)7|C˖-VZXV.]J50L̘1s?^:O $""B,"""""ׄkjfȚٳԫ[ >+խ[c08s,no+ֵ3usK\'~]y""""ڵUaZ8p`ϟ@5[&aDDDSسw-ٜCTTPrO)99RRRHHLN%!12ePJΕl.k0,v/lڼiҸm۶~гgwX,]m۶c6YݺvlY>"<БWUZlݺu+&ɉb0pvvfڵ|8N`53ZFO!F>///, L0jUpbbccY~gU+#^fcٷ?U8D9O{97Ϗ?DG&$$7~\ @BBiIRRRDֵ3Z>sիWǎHZZ^""""Wi|'89e6l/]vL0h΢EGXhHr'Nu<^=ՃÇ# IU %,ĉX<==2e v6cZ$]زuu)Ӹ;o=ot#GƐù8t0ls׿3is[{ɽݾc'tZR^,_gB wٯaqp[n{yFFwcǸ :oM>я1o:1qmߑ?#^ɣ}`ƇY=ܓII[+]ȳ|C펻HMMjA~/>@DDDnx}Qy{-Q[AAA9rwy2w֠$&OAk5S-[л#{Sb% ٳg1L}@*p*VWoMK\|}}yf@?ڷ93gr1ϟ_eܹD۶iҸ֖Z5k)g>VX'#^I^=`˯1!~c,Gd4kڄSDĞY6nZlܸ- b$ߑA/nkGصk7߭^n'9A/2!_0l :vbMn swR/׳ezRSSn """7{ PV+jsРA3r|yРuƲe˸iԨDDDDDIoëXh giq'OC͛5m´'f _O"=tʚ;w.111lٲYf{S&1w(_Α#GT_{d?'eM$%%O?ş6aæ 9_XŅua᢯V>ۛf5)SF"""rC{ =zUk/K?wglٲa ˳7_ h/0$%%內}.]2qYV}iѼlٺJw@DDDnh>󆆆^uSL_}8pADDDD GcѩX-V+3v߿xݻ'OeoU=4G 2>}!_ݽT/pq ƍYpUٺUK8qDeX,$$$Pbn$(/,)ժe /XL9Zj/+@XX7aajj4;}շmlќ2eʰv/<}8;;jeqIIocbN믿s& gr<:^&88-d7=OmڴMVf,\̐a#yC[мl^+WYf@u LxӽOf8,4_|ʙ3g0 yfDԭSysȓz7J8E9J*^ GBCCYz5ӦMյDuϟ?E_p-+qԫWAԩSf|7Gcxiڤ=8Ұa22fJ,ˤe|l:{G.co#00-3~[L<wwwl67oi&LEOV2LXVbcQ#ǣYk{WO^yu鱱qd3ujf !k֭[ [n͛7c4mڔG}yӢ pY|åDDDDD5N7I/_eF&Çhw?łjeiӺU ޞKҢmX,Vyi24n܈QF8Z/fӲ{sNoMʸ puq%5-?w3n];3󣏩Q#ujɛ6-Fz-oÿR%N9M`` ,]DqVn SO= '';w)wB-)W=ԩxwwwHHH#;ܰ {xWJ8s III`=J.]4""""r]17igѴ= Z`*lM98۶H_TQ;&` ~e233?30L%{Bb" U(qlƒm6d_9 ]Ϟ=KRr2!!(IOOUv|4m$Oj%If3+h○ɧ_*y~UDDD_,ӺuR9?N~np\KkDDDD?uw/[1f\7%VU†]u;TZ[?7ldٲTV5_ h4tٲZ""""72шj-4M6%#dԨQio ~}?zO!:[+;U!"""J۷oTܴiSEGG1ڵk9zڇ:oVjm/_ӧOkf͚";vÇpץKlTT?s^s9rDo"""rC!= %ȑ#IJJd2AժUXlذʕ+vo̚5 8seر3f8[nJ*^שSƲeسgOeZl__HFŪUHOO/܋/H~[n޷o_x{{w>"ۈc̙L2kJ* {f͚6mD*"""״ 2Y"""""7x'ݻֿ%KPbEBCC8p`@ȥ~Zn]@@ǎرc366nݺѰaBy<<<1{UVkDdddgܔWW|i[ls z/rM߿?/. 4P 4jZ` r֭#44؁ljժUY7n`0xR-o*"""%CDDDDDn-T `0? ݻw'11:}CW|?;.Z -['W^[{n֬YC m'##+aΝ[ۛEf#++'N`ۊ%</5af͚UgΜxժU%Ñ_~iӦqԩ-SL3DDDDw^^^W~|5TӦM\\\`~|6.LLLqΝ6mUVW=<==iܸ=b4Y~}MLL u%))MDDDR؞!@m.Q0DDDDn+qR &M*>Ś2b&OLq7.իWϷTI~Ǚ3gN{)dddIyՏ3fU\j!+K9vX=P7oΖ-[,0W3f0pJ ӧs-y߷o_aÆb̀+rcǎxСC'6P={P^+?ydڴiS}رceΝ[d >(2XEBCC =JfG\\\4""""P0 8-7ADDDfӧOCNXjU7oޜ+VЩSk*Tӧ]~Ȑ!D ѺunZ9GGx """"""Zråy衇fΥ.dqLL.BȵTg] n" yfuul6:ẘ+JT}=vˮ]y7?Ů]:՚wsΓEjZvԩ|HOOg}<j#!11O;VÇ#ؿ/222?q";wq8": 0~xy6Aҥ -'""""׭7xH<<<]gƌDo޼Xdggk}6ͺDDDDDJ?z@@eF#ΝM4v@ll>Lez0xpnwۛ#3t;wQo@FFcoYjDG0&}}GBMZm~c,JX瓒(io]9Ξ=~ &L`O9s&={E4k֬0k]jHKKm۶O{O.8RRLjj*,Y ...ԯ_Ϟ߯Tj7Yp1~^C|xxxo3qt~6x6dl6&L奄s&󈍍e-|rnn_9lْ{_|J*X_~xzzAYdIeC|}}ܹr'OAJgH)eXŽ=Dn=Xx oM_{_ l߾,cyX,}OoҸ9sOg wbIFDDDIѣxb%K9q"^W}۷e˖72> '"""".]#mTP1~l(ܜ9sVRмcǎ)@i7ᮬg]6[1s֧X,{+·3?&%%OOOIIMFٲeERr2nnn}JHh40g|f}?ڵojQϏ&O`=}?|_Z*=i$>Sݔ5e,]3g#_O#Gj^u6l{믿)lFF}Xz :=@\I6n߭8>ظb_={>=&D|+#噍rfMЬiV\qhѼY6,H&Mx=zk1xyJjժQn]AjծɱXE9~֯-ZkO)&?xOOz90s0LX6ODl,+W}[+Ѩa}CS?_ɓ߸QCޟ1L w;waZ?e8;;Qf V+Tw„ ,^Aŋ#>>R'|ܰuLff[CJ٣;~`Aqٳ==44a3g2h 3H[oYf4iD//Rٰa_/Yw>wrww'4$@eJ=?OJJ.]QFE-h#kV` L7שSRW-0|G弊pU^<ݱc""""r2^o "14߭cQyu0?M:ưai6m_~DDDD_/e˖z(ő\`@ͥ4 7ݺucy_r؆juW܇~St[.5jԸ222ȑ#GJT~̙zc]w^ǽaiݺEBԬY3_ɓ'8qb ~:Qԏ MrQll,*T>UZe^NG-\HHM6uֆ /wuWf͚5E-4Ni/v _!_~)v;qqq:tHo,""""!@DDDD3rB*h6nXh~AK??ԩS{{{[n9s~b)RKgܹl722իk?> ڵki]v- G3G믿^zyO?tڈ(r+&&FoF""""CDDDDDnp*wWMM&?pGa'i߾}w.VEYl6swc27nslݺHLJ~H@@~}vMҡCbwĉ y'X|9_5}ժU`0SjU.]Z/ PR%Ə_h/ǒ ӥ㥕ڬ~ʔ)ԨQX/rss+4/55YԒu-++Ko"""rP0DDDDDרQB&NHƍ9qD6l{)4їWby.߽{w=/}E~}i_}UZVF?N͚5i֬ԭ[^x'OhV֮ͥ]peff_ҥKy{?(v3fp_^</^ @nPrʵ;̏`0ЩS'lɓ;0 1^>s֓O>IZ0aǏgŊoJ5WTpez놓DAFٲeK;v 88֭[{Ѹqcܹ=zQh_ޅqwwg…lٲ@@I}ghѢs՛_nڵ|fݻ`f[brK~"""s;, VUVjժB{œO>YbԨQK^gvNdp] IDATlll/hgΜYe.*jo5kУGɊuAȵE'M4r7^ر#Zl6c6Yv-+3U?v>tvb6IJJb޼y֛4i/>/ --Taz%Ȟ={;&cǎ\sOA˯ÇөS'+Vjժ"gY@>%SL_s駟prrrԗ#ӦMcȐ!.o48p ~{cǎOy=5k֌%KвwQQ]{ǟq QшFb-$\{7cKh4C1콠ĂQl{A0Ha~֚9쳙yo RzSNMq.ooo,Y\IθqR\Wgܹsd/*iowJpg;@[}4`(p3 [59$`0TR{K%Ki${|AAAwiĈiiӦZpUծ]'>*`3g۱cG\2}?H||#GԌ3$I׽{+W.s=͛7OKkҤIjܸqBk?󉞷|hh۷K.N3"E?[o%Irvv~ S…<5^+p`sw؀E .7nXҥ֮]Ŀ=z u8ղeKU\9wloݺ5O?md2iR}ȑ#5j(+W*㧟~һᆱ֭[:Xbڷoʖ-vZ}ڶm[}˧={XɒBtݝSlYرCk׮MtW'NLV@͟??iۤ"IW\7L*Hҍ7~zaaa SLL t@!ClC! ''LO?4>.]Ç~8p@6mE$*THSÆ iҝ! 'PB:z ڵk-SP=SNիySN2szpݺuK.\бcǴn:Dj׮J*.]d޹sn޼[ɣjj*EFFj߾}5k^z%ݺuK&M{w95nXZl7,&;C(£iɤy?}K1 I4Y/$="`(F14!z: 4"d.Cn:xWQQQT:w3}sڷovm<RHxɓ''y35iDM6MӜ9s]tQ-$iРA%w۷+g;qFΝ;k׮:rMHZ71u_ [ 8jzX?g -|Ot60P/iw)SPf/i'~m_M<>T5YPuMwޕ$mٲU:w5iR!!swɴitIURjcvAK,$j…zͅGOr=߸-"ɤ1c?Tvmq:-[P'}1>Px}9~~fԪe_FjZ0gm޴AJҜ9$Imڼ{B{^sVZpBV[Zd-!o"##UN*U\~dO2njӦR+]k-}8ݻ_jEIҿ^Q\=k5jTSLLL+R$3dp]rU-7S/nܸi>ޣ{WԦnݺ[pB_U;w *00PcǎCy%K$?^...Ǣtebɚ8qb?amذ~ڳgHR!e˺ť֮]ڵjZ[n$aI>>_Ծ}[KJ*Mœ$ŋuvk^֭[:ᢹKկ_WX?ڤn]_7o5dٳG˖-7CʕӒ%KԸqccK.`P͹˗jw1)S@$.~wjT+t`ߚ6+[%J7 ^}e-\DGӲ c.]J iS&)o޼2Lڷԩ-1ټFbbbtY+z Z ٽ}0^֯_/RsΔ7pԩٳ4h^z`0h޽;vFȒF֭[[e;w(dҺu+E=xӾ&+Cnj1M;*~TŊzjc_~9U}5hŋ*]VX,mRTI OtSҥuhNYkƍgzFQcƌɴ7K.Ҙ1c4j(ɓG;C?+YVJ@ ڷUvmȨ()c+>77Wp<1-?z+,,L^" @k[[j2x5;J""+$$T=wo̯h޽{u]ݺuӹs)ww _Z Lɔ/_>/*TH Jخ{rj/_NuԶ ݹx]Nz/S4/2d  Qg"`(F14;"HrM_$Ȇ3ش پ'džӤi $!gNB*9:s%{gHN/ԙ\%dc,_sXE1$RHxb0TF$L&-ti (dAR\W.KbL&IB`Ő,"&&F;o17oZmtꤿ<"0R)d/^j*D14!Q 6biCM#v)^Z Һu/H" S B1$!J8lնm[]p!~3oC4qD[4N_FFjҡCtG}>H[AH5!OK*clذAAӦMѣ )bu@ygSUɕ+ƌ *RD1)ƌP~h"}$)wݻwճgOUT)s/Iٳg5aL&}vj:8! b ٳgUrT[V-I2b*W^y$PO#iBP"E$IzRRtnƍ뫣G۪Whϟ_ݓ$!Dqg I|bGXXXcrpp$](! K6nܘsΝSN'L@Hb ùH]/_~IyŊ3oWZ5>e˖{'IZha !L1eIRUV-Z*~ze0tus{B{钤@@C`09رcۇRN>YJ}7 ߶m[wEt9!d2RHKjĉ{Eܹsw^~ǎ|rي믧gС .4,P bϟkڴiڹsynݺ*]4V7oϧ_UgN_f$:r!>֭[tN 4c ]z5> R͚5 @*ɤݻwDI8pvڥΝ;zoFÇ'dX#3m4D@'###lٲ$ZJM6UHHHc^ӰaɢbeFѪZ)SFÆ ӽ{3f:uꔦsD1$ٰa&Nh_d23ݻW "06cɒ%>}zvSd2Y<֬Y#;إvܩ-Z"E1$ C 0 A[5w/4n8IҦMc@CO)Hhĉhkذ>⹓'O믿.Iz  P Cݽ{WӧOsA2իW%\Iɔ)S4f;w|zmHt,-6mjq r!Lsi׮]:sƏK&eDj4s_~]+Wݹs+Ў_JsQ2eojܹ:wn޼)Iڳgʔ)%JXU"##uQIR"E!C~oVڵuA.kxZ&˨\ mPrC ?2zڹsJ.-Z\_G$=¬x%%kҵV2eԾ}{[N_TzM}&_%!E1ʗ/%Khڴi9s'DWqٓI&V{6hCƒ2/e˚!$GGG9;;[spp`dTRrtt$(P T={6M}wKZEI %}}N%?^~ŐѣGg~1O 2ehʔ)2L1c$i׮]>Auֵ鼌Fy; @ 888$zn(ڒQl!Dj$/CR9@0rHL&i:/o޼+WtF?~xύйs璜K,wI۰0M [ QJ*"dR@@*Vd@ݾ}ۼ6KZj K{}E##{t$ޞc~%>LÝ!lo:w-*ըQæ_oUtir%˗/R܂\(vQW҇wMF9@K/?h{gt-~%JPppݻ')vUrAr{ᅴǏOv9 dٳg'(H۷e0t ~+V`0eAuϛRwҽx}m̑?y{Ȑ!P d['ONf24zhIgPJמ_$@NNNV2ecq|ժU6:\"ILObw&8s3gj̙|0 02O5j lH@67rH>>Zf\EGGkݺu0` ^{ {WXp p#FHtah4ĉ믿dɒ*(2\%I;wLo \g}(!Lӻwd/[,A!N}իuV-ZH7nСCU|ysSNiΜ9 X@^~eIҹst)UT)~oݻՠADjJRZ5jPppA8,pg S͛WԥK$\zռ}ȑ$ !񹻻#yA !LxbIұcl IDATw%۷\rz4%IO&lX;v4o9R[}_{4讐cǎ6,P d &_y}'{4VZ,]TE@1i>SϟbUYdIƝ9s"##%Ie˖%hXTŋUR%UXQ=z$̙3o߾1b$Ύ@[OX+B 5k.^hn Ν;Wu֕`Ђ ǷnJH2]jմ~zk.~CM۷WF pgh۶.\`ȓW֮]KHwݽ{WӀ|~7ߨo߾ `}%}Hk4cbNJ$W@@1_ $??$ UVM/V*U2yݸqCwt76}$%5qO&O@@1Hsjfu'z窇uѣ 'K/))k$p;HR`ܡ˗'9Ԋ+)I7n\-={VC Iy KQѱIO靽mnK!I:uL-[rI`,XuC+zAN#3Ig%};E>w|rܦhLvʕ+[ϛ7/KM7xC۶mի-~Eoػ?EKupH8}qW'i+ipcƌCUV9kyG 3b>'bIzA)eooo^$h¹siP\RqRRǿK=KH KXl?-9R:tPr$IUV޽{U^=ۿƊ iÝ!؀p Tzb#q7NqJ*WZ%_ɓ'%)B^u譸 !R\!DjXׯy\@"(`F@H[oȝ;y"YM=㓦sl+}^ qmk'=Cu$b6AO@6lْbۼݩS,7o-HIs$[{c)Sb߾}\gc(0r){\KkNމ./屜ۧNC1$8qBl|y`%&d6\lsY0QUZJO䧲x ;ƿE/ x PreU?KRM4u$;>v(Kd|mLycrD("@%{WZDy!qiݺu ,X@V$UVbRSwRi^_#,\t^R%+VhŊm͚5FJjXmGH-ZIc7;t 777u];w%Iݤ7c#mtߠ E~֭kݔT6_Z>}yf٥.IARKŶ>iǏ̙3uN\`5j>D1\$ҥKsIH*i!|$'I[L&֬YW_}Uϟה)S~PӮ]r/YmC1ҹ{RY~m[[W%Im+WN .|sWޛ!3K#vIDIRRTzuڵkO駟j޼yׯMa,l@xx8kp&)ч*"I?*քc+ !&kH/Ҽݿ.lڵ*ƀo>jniky?$؎B$Ѩ .(((H^`0GfB1`4S7z9cI,4a=vX{5ƍeooo?z7nLիo?beU,ۢK1m6nrqq8^vmmٲż_Z5 `S(`,~!%Ů 'yqd-w6sgK폫!|'/J 1̖ZniӦQժU xߵ\}pv|{^x;/^l!d UTQt}5jH}X3HyòqZc]]^R Ͽa?rcihHJ&.IjӦ ېw囹㒒 IKkK-KMၸck$?^rK={M6b [(U|||$I "DDGGtItRǚ^qO۸=WUx@<~Q;%a4Y؀P [g-O~zY. CNNNrrr"XuI:$" M. LpӧOפIdg}q̘10aB>of($" X&I,6lH&P djժy1䄆*444Aa֐V&_ p!4Y wEB`gRXǼ=zh6b 4H.\P 2DFFZ}-26隆 ,1@Vq%vTTTS=n{?5ky{ȑl@pqqӧ5sLs[͚5$ɔE$YuB'EBvjr9nYon,//Dωɓ'L2l@6l;&ѨCt1d%UTxӐT +X~&L` ĉm۶})HWC8/ihm???_5b9::jӦM}ǍӸq!LWJ=x@C$lR}!t&lH^Ծ}{;w΢}jڴEaiA@\R:u9s[n9sԴiS={V'O&|`s(ooomݺUpB  auX}"`ѢEN#ip>-ǬP@ڿy 6l"www6bzd2T^=IsXiĴsrrA:%/!b Kػw.\(ITH9s`CYF^ gggݼyS*TҥK B1xxx(88X}$Gjذ! <<5C`=QD+!i1xz(?\$ٳG>>> (;;;u\tb ˪[L&ڵkg~-y QF1l!dy֭ӄ ᡻w*IĐvK]IK`mCY¥K'Orʝ;\\\?3BJAtt4!Ț.H*D )&ECO?ԩSICeg'OOO/"$:b D%Ok2g}&1c$[ȑ#Yrʥ~$'''ukl @T>':d27ߔnJ@F'X5IW!%{Jo(2M:uq.^_|QG%TB%1_(@6*Uzʗ/ Cw}׼?jguQ_&I˗/W߾}a׬Y3]xQeʔsZjf>FgV_Rib2۽H22 w@zj yyyݻwM62 :ujݻw}}}S,u1þƸqd02t))vsI[jL۝Z$-\6rHu :'D(),g 1bE!t:xL&tBRre-ZH&I_~1OOO)A$o6پ~~~*_~GsGt?YĐ O3<;w-Z={fsxw;Ν;%I^^^Z~ڶmkl2IeԨQ- _K9ɱ=<}U/Uvqq5}t:tHZ|ԨQ#>Ѻ)gΜ!dq7$#x j֬Yy6nX7nK/[x5kTΝ0)::`W%]kzB 5|KGfH! dSrJ]r}I&oVd24w\޸,,$$a=e$(@QbHIRd! `y w͗H;Qud̙nN>#vv=.!v,^8d۾}6Wp8H ͟?.,hݘ1cB7 5S? (e IDATv5dO%*W"""""mA?禛nj0 n*|d(1 /_~{7*t[ljj=uY;Vf`bh H$""""&4MH5w\ ̙3z!׬_N;<'pB>Jx<9x<kW۷oK/;N>"x31cZ@bhL~P"""""mAg۶m<L81t-1袋xǙ7oiiiǖ-u)yBټy37| }XZQ ӦMc "DŽ0ଧzYf)bbHCS\\޽{w8cشiSv=!v ljEZw͗_~Y?R` -m6l?ܹs Hbckbim*āÇsyqϿqFۈ 0p8 EZNQ]vaF݊ˀ"l uBk; ')h@vrhk(  ""qwm}\0N9՚~߱i&~nw^o:IIwvEZG[1-a34M~)CCcrR{jކa}efFh0s'Ԭ8QǒR1DD$mݺÇ} 8b̙X7eLӌ묳 n޼yK4^o))۱يRwbi%]\Pȑ#z+yxf4D{qiʸ[C7`t|TDDDDB""#~wu+W'? ૯lذC'-ہqi+ >''"ge=xڵk`7-Z ,S|6EǒR8d6mڄ䣏>"++n_b۶mkر\E8餓y:TCAr.i"Q<]d5`! rOM # .ׁnpjcHDDDD"S1DD$\uU̟?waŜwy<YY?$UiN`HFpW.of 0\14&=IdddPVV_Xa?"""""Rr /Q۷oO>\.=Xyct )49iy@ĎDZ_e2X~}i1sBJ=>EDDD$ CDD~+⋣gǎ̝;kCRPP?~#~X8N{|>}X5୷ A`n.|L"wgHC} ' x2 n~Ou2P*tp:s=tM|w?@޽tDeaZX1MBiW_}/˗pr-jUyzN]//R}v+𽎯Ɯ={w'2E "O%""""RCsitpnwNIIIL4N:ѹsg:w> }>v4b|>W_}5/"'O梋.ҁ @zvLLS#C rM7QYYIJJ]zt 6, >p-V5+Vpu6H`Z4_~9W,ԬXSHx*tp V1cX~=&L萿nn.| 3f`zu`>_Vk)|*x%1:ñ E75R#""""|*tp/C'xba`h4يp8TV+i@ 3D@`b\(b/_ IIu Ãϗ`岁^AH+(el QB8K/.qߍ7rW[o)8`/T:\"VKg$ޯ<{l so Sn࣏>$""""*ā38^xgyU =z(8r:TW:CHc15￟jrss%''~n,Zkqw&챴R'poKDD$\uU[,Y3g2fN(q)fɲl)TWg)iWIAH[6yBDDDD-ꊈHv駟D;XUWg\X6 FHp(RCLP72DDDDD$""s= {;aM Uf'"Ow G14S2tIQ1DDDDiT EKwl,'TUu&-ƻڲh#iW*ā ABxX{@9 {nr^^O<C i־Xl-Rq?M;l&>_z*iEkjgHT( i*ā\ 4M>3ע=n. *8f`zk|U)CLCcRLDDDDh,8qwjժV]wݥ`ϗ(8NCUH˸AL~R 1IW(bH9r$CnÇgɔ)8d6 Պ_6M:R "GaA """"4[D$N\r%\r%K2qD}ninxX\ޥrފQV&҈ -R4!"" jҤI\{ "N-yzRi&) #a/C1d 0B1H+z)T I@ #N|IXA^/6[!"GJo _1H9}N&R1DD$]y啀ݻH2M;VkI`ӉZϧb.4AZW)Psn """"T  hկ߁XB!!/8p8p8lfшQv{_pBScH'"Q """"<*"u޽M?}tNo| Q1D&aF4v$̆W?>G`!0jwY1%UQ """"1@D$\.VZ ϗv8dZϗV T'++Çsa(^ 'xR """"T vڥLI8\;NN'^o:Ng$ 芀͛Gaa![а~0^<xf=0zh `ڴi:d+ح!*DDDDT  ƍ:ϖeՊf0v'W8Y!]&7':T|?#xի|:i+]9 #yyyw#;;#F4[laΜ9lݺ~ .@F1x`zw3>_ v{Q`nxHNވ׫b`OSЌtu |!U'?c&MqV4:DDDDDE8RPPێ?K/\zL:zS*(t‚כVbqtNgP.E)(X0x{޿9s`fAX&鐊DDDDy4MH8Ze?ӧOo߾_VqKbqzX,U|j~-ʹ/^ðWq4Ы>?Vl5^ !/wVr{+HCz&"'N=VעE:t X.//tbTj#i cd(Fe9!Dzˏk.7Rl6HdjPVtĤ^ P1DDcҥ<裭ϑ#G.WUU3(8:X!Áax3D˳`K "[`lk7T4OH""<6_|LÑ! Íכy֟9{! *T iT[1x΄Ik(!""""l*$իW-ZJOŃϧ1 ;(BCU aYTb|w8r+DDDDyT I@ ߿_/è,;NN'Q!]!7-bZlFFHS r F*hč`߾}c>#}> #5C]t&KDDDDI#xy^ Çi4]Ef]1*KQO<u+p5߷| 믧SN:$}h,i6CDD-*H=X1 _`Ӵ*iNйC/0P.W7M3UEA:5o>G#,fP_{(8vwn0 EYi.@ݲ^*t++Ɣ\#UQMDDD$Ζđz*SzwUook]4nynV :^@bX30 e)1ꑦ DDDDR1DD$Nwqp ڼy3~.ӴEh^ˋi)^`p/l421@/AZ;DDDDytDD$N\ 8p ~.ӴbTs:8N o4\H-_ B:Fum)%!*CH""qm1rH2p? ZgZX0M}_`H7|Z9xԩ8bHlYR Ht #+SEDDDDIgJDD>v۷o?g :TLӆnY,.LS#CuzE2hCTIhʞX?őD-zCj """""͠!""qldffbaЯ_?~0lذ:0ٱc;JfVkE'wKFHӕgf݀*DtV 19h,i&CDD?O:w '@YYY/X}2i$>L3 %zZ+U N$rK:SK4@Z7;M'Z1H""g|A~_s&vҥL<ŋ+8%a+//@={z/ qi\1#$A0R"w""""|z))"G|AW^Qq4!d9Vɒ&r'CzQf*43C1Ĥ*dؕ^J$SJ!__`ϗ22>OgԤ )n e57E5_"-4!""qwމxXl| [la֭]?\} 2$v ,Pq_ ܬ3DiWԛ)f!Qv)i=_5CT * iWy>m۶)8894DD=.))?'6z:+p^`ƌxUGHRXANgP/YAI*Х^C4 *2M4hCcx H8_Ht˖-upCK,gϞL> xn{}1{VO? &!""/%ED3gNO>n4IMM;TqKb ySnZO'>_UdB=.(R6:֤5h,ѭ[.]W^t5h]nnnP񣺺:d߫V0@!3d޼yu]z9󤈈H}:{?ŋ;vl`yŊ,]3g2g***[R."1DDDℊ!""܎ug?p~I'-[tz1O"M^KŐCT$[`!U_e>׿p\kܹ3d\/2nܸ}=.\k?HP1DDoyVw'V\ϗZ zsX,Uxi Jb\}7-g (V62}6(ƌʁ᝕C'AE ~6m"//ܘo3g/_Ww]y`嫯Z8bHOFql_]A7=R^^.0RĮ4R+<ҘN~P -tC$ફ 1\veҫW/^x_~yСi՟Je˖"""""I\Sje…_Am6\^s88ōכ?Į3T-W/TuT]>!& {+B9D}6m{f;O;&-^HKInȑ%KƓ魷7p0epL>!Cp8"^%r]p"MP7!`%T vTvE ΧF|˚KFu}HƌӀݎM3i$,""ҁ"" 2vݤy>|xQsg\W 6{/wvJ6gzu-FHӔUȳKg:(FL@ U}pH 4͈ٳ}X,um 4Htp&KD6lX?۴i|u meҥtԉ:IxbFE~~>6mJc"\1tR4`C<&Tb`bh=1R ^yiL7 r!G^ۻ\u$?~T 7x#~)^xai&ƍ8p s=0i$JJJ;w2x@&K )XVV+u#+[ת|zjBKK/OYD IDATQOŰDDe*i;/_ޤHHz- ஻b˖-ouV^xf͚a <+Wlo^Ijj* v '|o9!7%b۱ ËϗĮo^kPz )HO%e%!We3<{F欣2.)^4/qfff`w]8G)ϝ;WACDDĻ˸qZm租~:b??@~~>X &D(((N4My晠mnVz;LBN/׃htX= BKT1$NsFCC;0 s l+@DځZ.))f?/ C$v^X|K-$eI"hjS z"#}Uf܊!{+wSNA͂k71MYf'jj5\CJJ 'NdXV}]&NGp"""qB8G'|rDd뮻ɷ=z4o^+??RFX7lXb| |ppWO$vhN! 5u?6' (ƤGZΏ?8aЯ_ z? mGy$M^^|deevYlk֬p0~x u{ ",Yy5kVLyWo.?oJJ <'sn͚5Ӈ]va 4$ƚ v>J# Aw.@ ODR 19 (~*B'{1)V.o #p)h E ᕕŴ]c0aB൨?}lTD$p Yz5 .䷿-7x#-b͚5ܹ4ۭu;y&nݼQ?bsխFu y1M$8_v0HF1U Z4;8*ru#=X]TzI&K~i" 9 瓟ѣ/~EEEu]u]f˖- 2$|'FG[nᣏ>:֦ib mTr Ņii^bN(w2d(""^᥏?Z"6W LS>au?MGǖ4F1|nrrrx/ٱc1gq뭛*777ofshְłZ7jT1DbNC?(TeIo _1dW͗{;( NdH3"" }Qv/l?xzMFFV50PKo?_|+~;v=LuW}1MKe!v=ؤqij VERT 1 *9C;8\?=&""""ͦbH;X~=Yv-"nv[tSN=*5}ӧn{|̙3&Lc=j?;(C;ijub6[ >!JdFV^Q JKK2eJMu']n-Zn 4Kb&i}vvX9sfy9أGХC;>_Vkh1pp}jU1DbT e/RbH4݊!&5oFdPrCTT+9deeݻ7.O?wՁ^xa#??^zżܹs1ͤ{&+i !n@ʳQ$#V@gPlu3+YlV* 1cưsgw=z4SN=&⋸7o0 nvlْ0ǍiڱXPj-'%Q1$:j~ gu2=EM4e """Ґ!""dÆ )))Z#<\[9VXʕ+Xd j̷袋Ox衇8p ݺu{9 bV")*C)C'dcX;! , &ߡlbEHxHP1DDԞȯ՚Mcѿ'Gn?SN93n8~i=\.2 ㎋i̩c'łj\׫^ *4ZY% W Alw`9P0*i]o-""T iK. \ի&M:?<y#rWsΉ:5w}G~~>7xc;S ?%cBvv{`ju") @/ o.e]CL4P-D'W?*iCDD5kv x6;wr 'ļO>INN_~eRRRRC2*u[bP?$GŐh\@M%i;$T Vj*֭[ DDD!""`ٲe˗^zi Æ \~򗿄]ߵkWfϞɓIJ; t!&L'l u!O\{޺'xK^NbK ʳEk`Tʀ݊!ڙgV:>BGA$L{ `S ҺN8F DDD^Jvrss+A|g;d5kꫯ2w\F/e]ǎϗaC֗5PX"qC;aP" *j\A=C6mX ozōǧ!џ#?ODDDڏF7mna !<=W`裏zŽ q88zǖG=C$)P7XZ'f#g/T3dۻP$EW1HrmZXDDD:CDDڑiv߅G6Lߘn7zh֯_UW]sx㍄>f#CnxX,}7᯷z?F";X(Q^;I!;%&ߑ"> xˏŃFՋ|!""VDɢD}?;.hWUn /tR.}ل=^޴!>7(X9u/&SV?F"tk@7!lgHT#9(ʴ3 c g_@b7DO'"""GCDD޽{~ ꚶt]]v Z"Vgy&-KKb -\.\.Wg}y&ⵆ (J߇(lo 9)Cߜe8UȎhuuQ!)+{pV˱@b4tPWS#D""lɒ%3ܦիW7k?w6mbРA̞=;^t #t>yłR0p`6@Ur>l8S©!?MEѳ+To>ÏŚ&+p+pcX؊b~<:~m*"""Ev0n8+̙ٳ޽;pꩧ}>\wu<3Lu_(p~,>Nb\ *{)X]}6lSNQ"""G95Pi&M"))$Q~ 9sC׎hk{r7駟һwo?N8MB}d #R^^Ҙj-Wqpj!$t}:[sQdeN9 ŐMYQ΢SrqR.CR>w88uVk)Ol ' ァ<>gЧSX/rRow,vKCŐZiWm!:(*V@Nu@QWXǨHގB <c=!CIDD$H mٴy CNc_>wy'wy'yyy\qxٓ접w廉͛7okgܹGE/2֭w <ɓ'Nj۝ݾ?:˅ Zg|>}`:.]gВ \N ;{yB?v21 CRSQ1+-|1$ n> \:9V"@躻nyS$E!)VWiV诀"ZTX(2M[RT QnnF$M%B7~Q!bk׮%-}o㏏fϞqUljiZ0Bv;v{pN>!%eg?nHK3YY*8!"6PPVa(zAzulU!jFVTHz$fd׽&ꚺNfgDEDDRRDD ;6?G}_ Yg&`ʔ)Xz6[eTWwJVUdg-gg "GbHVaK@2:xz[!;VS4*$A}hghZ6mm"""@Puim-cnh">Ii/g̚5}Mӆa#^Z+T N^qsr /r9aV\NvBE ǭ"?[m_ʤT, HMkWHz$EnA}hrv+wq EDDRRD!z!Ld̙7x#2HӟQ.3f9C2M K8x-J<uw>/"Gr0y5PR .'ڴbqȲC OmCA}hW(1ڶmU"""z))"Ѩ"mi޼yK/:˗c&ӦM;*39s&~)/3gA?sQӴa?p8p8:XNTV=*ɁJW ɍ IvI[1U\h#  g2) *"M zs!P"""rtR0RtiK\q\qXGybvͶmHII_~dddpgp2rȄSOSOM4X,7*<MMSR:MVEIaPTenM`oͰP\j <}}:UAIva`Q75VX(--nݺ)bH9餓x7D2MK;Y,^}aڵnS'h_ 9) F^NRǝ+pg@V6mF7;;49:±rkɤ'WIgݺur) CDD(iDZ@ En{:cIXG\.\ 7=Gdt \Nrz$=$uеAfc Pl/ GRy*uI[AEXUi424Vcƌa'""T i! 8SYsGaz_ͫwe]-‡~xD 0ͤdY,,u`I x+* Ś=į"l<$L6 3x}, LS6k'^rAzSAsb=葺7h]m &FڵKA-DB4WUU{夓NbŊ\t)?(ִqF6oLnn.F >7 ;v}r[ϧ:#ݎi`vwn/J۞=Q\:KbZ=C"\4Y:A.8 ÏŐjAxNN;8oҧO7,ہU … x<<쳌?38>;$V_""" @Rui0ꫯ8q"K.p?g}ƤI5k7tS;Zڵkׯ ,/nt_seܹMyξM4~H7[XZemݫv!5dwBW蟑Jq %Ȑ͛73mڴ&b-2^'y{~'j s臙 IDAT<wyq?>!nݺǖH4Y""vDȲe˘2eJyN;4222x'[eC )ҿT/))1N&%"-mS^o: ϞЏ} 5n95UŐw2XBS Z >1V"8h*M82 Vɡ*{k?GiӦ1|^y啠m3_yaJ}y|X>ݻl2L4MfϞ ˄ ؼysBVVbݺuz|$CDZ@ ԥ%ƍǜ9sx޽;۷oodԩk׶~;󎏪JN&I!B(i"Vĵ Z|W]]۪]'⪻~׾(mED!HK @Bz#uL?nL23IHd~{s=y|ؿ2gy&3g=88իWXWUm۶cp8k(>ٌ5ǼXRS롡 i9;tnIe`pAyث3@ #<%B(^C3$Ļ3͎zة PڞO>$oQfɒ%\s5s:\8b~kKelm9##X?0999cǎ̌3D@]At8Cn|AE#G{ϲw^"""<"7V\ɨQ?c=11~e˖qq nQ.""{i/iӦn/.WO͐H"##l7kqBu}`rhS9T?&8:٥Oz(DvJb">dZCBFmGnw:iδֈ[t7){]{sZ*ʽ% :@!".pE;x gq'Nc?dҥr4]~(@faA A#u\/AA A dggsYgylSUK( 0k,/_ΦM8pk}%%%>|<[/_Ή'^ׅ^H\Ayyy^u;cDToVro>4˷3jbvg4tFjimv4ji=BfY꽦nZ mL?1BDwl 9MbPB)kJF;L&DefKP7@R߾};w$ :(&M<`^1/|,Xgls7}$u [v̙̞=͛7G|KKSRRBZZ`9Q(Chl=eBk R\.G00D& Z¤b YЅ(0u8۠9Rl4آ}p9Ff+hNHJKaAL?٪bkmᦵЃ@?#O<^dҤIҐAAHd  <~󅆆yxصkWѣ_}em`> d2a2uԈө͐u{p08:l#UO#P[ NHQW*j)RvTY bC*9"攔b :SGHPGdp7ڣ/PQ:*X,TUUICA A~*ƌÎ;X~Ǐwb0k֬;=〖/[SN!<hΐPwgհLU2wAduМGz_kދzt~ѣG3zhiL "03gosN*ztlDD~:[liXp1{j:.`:?ssl;pQ﹝fa=N']ʼn:v?ΐDCct vkWxD6S? !،% iv`YjY+Nfqvux϶/_y啤vΝ;QAAl"}`vuAsfΜy?{ZZrp88X`A?nܸ.W/22Ȯ Cΐc.uB8CNyzD4#R cr9h! QR!!u8CXvW01&)ڜ! |'xc|嫯:ӍMfA= A#" 222Xh#Gu>|eҤI}W^AQ]j\!PvZHgby>IP m10\AS$zI3>@=`Ѣqx&llN1&(?]ґpdm,6nHhhhm8ޖVAAl"}@!`ot@|aÆsϱbŊ>_f8jDQz`hAUSLLB45C5JFxߗk!x/P P-g,$w 8El B I9*rg|h9CF#g͚Epp0K-ęj80yeӎc;wDQyBff&>.[\\jAAUbA". DJKKٶmw}y̘1 dFF b% &SV T`jM#4Dwװ dbQɁs p3Y8C2FP$8ILN} <ܛJM*ޝktn3=CT Q`@CܨK4/Nm[pih0!MUtȍh|y֬YCQQ^x!n/>ZE|n[q-|cyWrssٷosΕ>\AqBhO?W!s?娏gڴi̚5͛7A1o2۽Чuu5z4s GQ5E{@oX3@C܈uf2FKMu>(6OiS * #ZuCjhG ^{5 vr~ \޹r9^_n㩧 {6;‰ =u")Fݑ*! D3DΧ#$**Sh"͛ǥ^I'DFFF[lW_0T5娎 =͖KE8&q4jZ HShל'X" u b)bwB038L6C5btv@[`sڵkYnw^+V_2i$mc:g<lܸUU '˹ƞMbC|wJ(sDAA7}1 =۷oH7q5phѢױa֮]#<o~bcc='c1,~8NCBJ0tg 􋊒4Y4Bhsm`1g`hkZp.QfFs9\FLӆx(h’v5jJ/ܾܮcxbmY| ixm}+4S#33^|E-Hb=m~}+.JKK? ݗyyyٳGd g P5GZ:ң7of޼ylܸ"@&fk\2Nw6ټG#"ΐ8M 'CPz!R0*\:(Rw'!@ݮ{e$ؽ2HN݄^| )mOĮe^v[^껪{GŮ]v@[?gg`j睱٫3W_7׺z!~ܗYYYL(AAH,AAk֭[ 6f1BU:C"##.n4cҝZZ 6pyj )&x2ĎAYԜDF}1ә)@H׵y`">W4CiDԴ֓tM=?I`ɟ *u>.K~ 7aÆݑ:m٤t8:zllH-Ύ\ʋ;B̙;g}g <(СC g  o4h4zj1Bs4`ѥIIj >$lIn. b6 qc] &:fXljiOm? jʘ}o$U]q?ᨪʾ}8|0FuLlx'(**↉O9Դzä8m9>W3d\M6qsg'WL0o^111>' X3Dal2~pp]wq. Qk2Ua0XZtefc~HQc|;CGՉ3bĵXb.mi?/R6]Wzd40E!:i ݖ{v9/k?ݖmcNR$&(m6?UKalWXsYgtiלb_l_+<<$AA3Da3sLN;4VXѧ^ufzbbZZ}?tkccogHp045Q5E15`d$DzҬ@Dإ G0j[1D-bMuݖ j"cB/5{ ᮯp8W={vt,j[3Z8H"STJ]|Au%///מ={صkg "0ș/FQ~_sK-{Tտ3`0`0~+ٺY}gݮFR tS -r3֔u@n]&9Α&OеP!!J8RTqj"egU;C>A5-Yyr}3{^LQJ8{w)S/E!*ӧOgr LA ;;H[l /|?8B Ng娏M_!UU0O0GTUvp[Hz܌MQ`jMeGD]l[}_PW5N )a0<jȜ&֑[ N%{7ۗAoz[ &0ԥpVz+5-#c[Ffŵ/Ă {MAt8CAs9 ^xᅣ:7@UUz1 '(?1bĀͦ4Bw⟐P,Cis"h9&.#ꀚd]ATpcF:NK$v~8c])U{k]wuv( 9nIi5E:E PtرS ؈3D!PU}YN9?~CeL8*_~ tF`0H7͘;5Ehiյ++(|`4vD7x<=0>NBKXRQߢX"|;C)d}Rx6?s*EdGQIIG8Gvvv\ j{(w`s){os'/s=q9º8C܉6٨$1-eݾۗ.\o֭". :A4CAÇs7s71PEՀ,9C"##QCB*0ZZ -+-H?@bivCoJ;qpp;HHW>2(iM[d%dDTc!uzdT> v}DDG<; \LK 7b >s.2jkt[o6\rI`t;PaI~Lnذ%lf̘O?4#Gq?[Y|c444rJ.\)Bxx8կ( " >3f cӾJ3EiSaay81tP=@tA|:mv6(Jt-w`bԓlOg6rfMsEb tO_42*NOz(Q\\ &B&}`kz)/mxx4TEaL6:6n[f|hoW +yLuC pf]GX ZS%Uq<\Uu*7zBtc%KR쮻oھmk\>q3h}0ڰaĉ1 ,[ Т[]w޽;`߶mNOm>;B.6F\оj*Ac8CA.?n"G`T~hH;foTɄd[e]\7 Z6lkȐD ѻo?D'Hg PaM"u5ݙxBzk#qԎvUSW'eܸq~55ErfX[ ֬q!Ҧ4ߟ%%%dee1f*++ٻw/9~733IwmƦMzu̦Mڝ"999~(JG(zZZߺ" s#iA9C_ |}'M wڵ.9CzBLfł:,௙ŢGt4TWQ[{0r/T3(  ۠1V:JдSB,&u5DXL~vE7R8BUm"Ziف0ݘ{* GjM:?Pr-55;vHBԨ 8gΜ^_dI:@|||޽{ۗ5fzr]v1ydix 1A"CA9ۅ't[X\He"6eD a DFB}~S|edK?ţTdxjZ4璠E |h?a5Wp#i76Sa=1`ri^)?eV?!&QFZ!Җ|PSSCnE|3{lZܝG)))ʵ@+ 3 Ras]wknwSXV۶aE\Ϯ~;OSxBC;ll6w[WL1 CeNosgHPe{b)ߛ&3ACSlF|%X#tk"#̯3dJLl|B3#(-U5 Ut8k, UW&-.qbь=Z щ[n_|rGzĸ 1Cd oK, ::Yf臉; RSpq p-p}0|%K>9k w qdHS4ޟx˦svߛ%s? Hv]clN[*m[9T#FCRFdoZ1J,6$v~j*,0ܹ{2w\1QГOپ|M7Ac8CA/%KD}}}Zn .S22\{/ڥ0iܹ..~;? ;EjjN'5ue|:֬I#G !!Z9]bLS,apDi{ TmP6nҦ3M3ptH9 2eJL /١4l--x@G݅嚚 _vG&33S ())waĀ 1Cd Vuuzḅaj4I/ \zV:zm! )ˏ?n2Lp䈪  .(;Y,h1R :OAS2k1N&rs9TpuKqZYY,h8ݣbL'!)]"i|r]4[xA% A."^>E^^,Zd`՛n2k[[Gwc LbL&ˬV+VGu&%ˁJ@_r_&45iԾLpǾt9${nLR*ho*#&*6DA}.Mdwal[fX$X78Bͪ`Kp[_;TH -/k>(..f߾}b^?}beG}T' S$M B3˽AُCa`wINn  q0JyI t'-M!:TƎU(\?&n}H!j*4vStF@VS2m`TmVNm:c"P`06n#Ե &Lq'ZO}.z 3gRV52?{RA8ObAAi9$5 V iU^ʿ -%=ݞd2a2L ,ZQ}㡮N1S3EKS[KW A <-k1w&ば&Iҧ\&L~B[4" mVxFeT"8XaB\2J4#- ]dȚ5k{7|~r=9}СCAc8CA43 /60rn?-S|5ARV=zOkQ8dUU@Rt`I,[ r!POgJ|h2a&?VΚ)mV55@N:hQzmx$4]*K"wRSSuyfE~y( 7nxF*9Ӿl2^{5(--( K,ફb˖-AA8VH,AA)=']r*C)]<l٢0r}Av6|O>~ kW]itGf&q7EAgHP xJ(=tg2 Ǡwܯ[Rc kug*[p Tbu Iaq!72GAh!OdO6؜HK;F׀03,2{l} X\\ܹs_z%ڥ\ssW\W\dŌ79sG 0pbAd"%%R&ڵk$--M 7 TF¹<ʾ} <¥Lb2S8f>G.02!$r#Ggq7@oDBXݙiPMh> rfj- Y"4;) Pe#tLivw Ld8@Acr`tbEԫ!4շSUhN>Ui,曀c^^{p2Bژ6mEzUo[ŋG 0`4Y NQQN_]zu{8gAzz:ϊB֬1gO˗kN4x9 _mwH"##{\>(Hef((<ݐBӻwh2"\FBPT(+U |(|t fȁ*X)%KtHS͐#su79" v1-F_BWTNi)&:_C3D-Dm-RU4BIS*+g5!;$8q g Y|9^x}97߬P\ W]9%?}nYaiK /99:ktHc(*":iXG4@Y9*+a9coX zRe访7#5-39v 9.vu-}:! v2JKPxTwF0<,o”] ~9g$PC`h@狸  q b}|I[{^+?cۖ-[PU7x7Jߟ2_?[뮎U\]|kjFf֖ip5ɐL=ƃ/T>LWiy9)79J*\I`2a"ARg{AhBp hM ~˄{Ibc.1U8#}pwi6op(mp bG9TI3$cbbz]+ E! E .;dܹ\tE(Bff&~iuw}wq3g/'//뮻N>ZX^3uѨ$1ŕWw8?řg>[45Ajjʦ)Ƃ٬R2 &l 1Ǯ5W3U0uдUB,PoB`7PpM|h4oKTp2^$2rb$@ J JmtvU(v*G,34 #EQ)4VD23a NRR  > ATTTܗâE͛)++_c}̘1o_u3?  ?++ _oanVعSe>?IadXjpEM46BZZOEY0`Qw0q k#p ӠcHhƍ0^bx%@PI>q@wi@sD On>b9Ɩ\k0wJ| M}LgysA&ZJ@Ġ={صkL g  ;;s=H.Fs=> yz ' or0lɣv8FHu5sN˟~3Le,=77x#"%%0cF:ĜcﳮRQ2r⨧v86EwT=@nrrT7jYz}\C G/T#ҩ+f {(Dt$2L@\7V Q4ޏq$SfO)߱YRRBQQv5\/A5 A;~ bXd /< 3:-^1&L񹯽W_}U.X~'֯j5p 0rƒjp OvoGʗ_*z)(e0AzrM@i=9y+Ͷ?x4 ķ.'ﳮwR;4T2pJZdLFeK([kZ vS:KNK3bsQwK!c(Cx{57Czz9 h q-Tj 3;U@MK|[J"4"1F y#GtI+  q pJJJ4n{ڵ UU_ꫯ[n!;;UU5kq:{|_ګV 2@1͘?_^%?~QDeZ|1(o]wiz ޸V|gs#%t3ѱ!2/7z2V0gz؎0j֢#ȓO˜1ۦCnnFspxq Ķ.@As'ԶLy3R$-z[Qw3IqW61a7G8qn $vasjETZ& bi$*]R^F z[&''M{p8bAaP#A޽{=Xf &M{͛;~ﱯCY L"##n]᫯S!7z2wøqgO׭SM7"N8wBE@ _\\/#knd/;@ ϢK:TajW<z9˶(<Baxꩳb -cnM%, fBKNR>5h:1 :d톡}75u HrJqv{辩}VPXuWTAD"0ۗ?ct2ٳ5۷{l///q)(:ҥ*+iNw߅K/w'?_U|P(,?'?yTt^rn]|x.rW9c[h?qqeC ۤx:R?%@Mf]rK!Juqhk k1 {Èe\^S]f{$Q;31Cw U>^yEU`x뭎'7EN,YbA23}wUZ3O2>3mۣ8'Z'3^w]߿_3= < yYp3=x^LF;Pwq *1ϻoA 4}* sv}=O r ぶ Xá*ebXVn #[gH n#Sz}79Cl2j >{  J+ k 1Փ8OTQ8)B% ڢ=fp_AAD3Da3sLƏch9~;sd2S7))I.jG+<}Wÿ۷ |UBC ,U`ͯs.֭gkl6>NJ`W\۶;F&y{2^T,x^y=ذsۣp=;I07&r%TW1ywߩGȡCw]Bj-s`̑> i)1"ꉤi"4X9DZe[bF-G יb<-&xcPƄo"/t8!tnuuZGZ(7hQ} )&xc#xP۲˻Е#G,A5 A67\qEkVVǾtJ\v졐<ñ{v)SwTN8Z=Zeb.SyU>^r@f7< \]HIq;N IDAT_o{N>v0>Du+ذEsxU]wo*\w]w]baϞe֭+=/Vrv^wu|]`~W̞=lϟo \|fnDWKS\ݺgÆ2j8D̶m*c^@#ʎ^Sbt*@_a"ci}HX#|ߺL iTK#9:Wu5>;KNBvLyWqx?@#2<>{tf%K=> #0tg<)ƑHǶ̴ rgHzz:ÇGOMM bAaP#ANT+>G,\7x}СC].ρ32r~=L9yb6g:6nzJ;`WصK3`Z~:? /X^&L8:!4ع.DaTqq+* wsU(,MŐ!N6m gVz'K՜Co}q=y_([oմ$`h/˂ m>? ~O+T^yEᤓFlsURRal6T~]w /xРPTwl?$>=횙O\FJZAVPJ>=A҉- ۷{n((bAaP#AN_W_}Q 6p( ֭S(O=O9~„ Lb4^2Q۽Ѧp@M73_y穼­?7 7O;n >eeq),Yo k.Bm־A>sҢ2}gvt"ży ߯P_Ć o}U*+ᢋ.io^3U;OKr>R^ا8|m`D{LGnQp裚Mz RSa ]OS¤I0kwòe*waރS!Ub&]Tm v T`Vl1;>\m]PsnN Po6lМrC!ؾ2o^p7vKs'Js֦FMC34l0Hłh)'ңLUu+rj`2vL92aEy":Um+ & \j/DfK('$9.Vq0OmL(L&M%22R ! j"0Xzuʕ+9Sgg)°aØ?>tIZo0~zSe]lzA/U>;:/^Em3k3r袾ҼV*yy0և^Yg)|-,_ {{0+:>wܹeR'^{ ֬Q -`z6my\S*CvJ~>,ZZ]de9ݻ:z5<+}pN8wqUTmΈ⾁"o供-.emjieiZVe澯/ 0Ey~8̙͹wf3r̟j̛pio֭0vƇJJǎ:_~ .vRv^B#0PpA߾sa=[п?ԩq{жFd4@ qN.̭Ʃn\ ɰfu#T`@סz$ŘsC"W7F\rsID s|9\ {SњrB̅ mxXW(/by_9:} 'mHRޓr2T'x?tYPH/'H\$$;=P}PsJ\N3fzz sBBB8) QB~iyl w^ƌvYi\uҤIfz"?:!xݻlܨg20 nY?\]^~ зG븸Zᖚ4X:sg M8|X0t¬  5//=ҴG&M_׈vuup~۵3y֭غUa,'O^~Ifͤ`=E ァ3z,U+~G<-XJzOygH}իaAÆ@m+.07>W{J{f0<8 _1LH\(NR:|b5_B7SXqqu?ܱ,F|{= h=ҒJnBRΝÃvek,2P 1@赆\_} zFEgmBP(v2( OJrtٳg={6=z6Cpttd>|>^'T'#B"~-RǎR R84LbՂUyFj| )#u 6͜Cz$'CPFRN J1CL=_Aa(S[Ng4~~gĉ7o%ݥEAn2X`2{b#ZodzϞҫ!ݥ^LӦAN6v( 8*csy5i(T` S&a{6c/A~rnUo:#FHcq%KAAG-;hFyݘs't _~)x} GW @rA>ܹp|ڶ)ð|AbhIG<9N (Z<>Tx7ްUpV-YA$Gr;!HL p H0E@,9i?tYׯC!+Rpi-{aaP@r:.v}ۉ:k+WBP(2( I߬^ESa{4k,ߔ)S5FݻǤIefy۴iNBtpaQO<:uu֬{ƚIzͬ[ӫ?aڥDt0OYqRer^3oBH-oo5̓6m,/|`R2믓2ʕjՠQ#+:ǏΓ44l(uL޽mL LHCŊŋaV +? 8v /8z0o)_5ТA#dvzuOf*ce83ѣgMF""[w5̌6 *W3gpst"!C`2@a"#+p,}̜9S P~:.;f$ijԫ.!OiRa0sxn6?qneL b{^Y!ؽ;a2 F]Kp=|j%Ə7ox/ 2:%ZOɘ{mǎ/0(Y`T :u߯:Æ ' &Oҿ wCpٳ|tNh2dE% >,5O&6c{e='O0aiqܴɠbEGuv2_~O)bP W]7E7օ[D.](XzK AR jCi&3ʜ?]>d8<\gO]v&pǓ'uZxq:z̾u6}t;KO4"#!Y|}Q#o_M3`aH.GСo_ڞFZ9>fԘf G@P# Ҹt zً0Li۶An|^o\޽8q"5aW@a;SC;/1o6-M:5= .ոx{F)neKa:w |2o}V!ާM<9αlo;#Rcu8{AVD"O/Ge%$@Ŋi@ޓ(L]w. XYv/~yhժ];Jtwo0_Ш__иu8wNzz)VM#$D#6Vq`29puK |}"8@fŋOa{1+Vd]^27aܠX߹sG] Baר0Y BaٳB iQV-ƌC&MHOС:D…4OJJ իW|B||>DgoqDP2ڦix6mJ?ͺN] ԧELu43&dy!0t`1E#11?Kz1k14M3gg6u*IAG2|[Nϴ0Yf8J;.dN7 ccyze`2RIB樾Ĭ=QܹB vS`1 qD޽ Bk1DP(o ҦMJvA͚5a_]tAvZf̘3{饗믿9쌳r(r56aG/Ⱥ ~[ ?rJC ϩ^¬Y:\oiR$MF xES$,n%ben=qUk8:bڴKܸ1ڵRc0 H.nΡ!05 {//zԦrrp\\…V=s4^S;| 4h 8P]kP&k;fx#} v2?"o͊ E@ĘAXTcbdh츜 }^.ᓣ㳯ϑ{y`` ~~~vPT2ylPճUR( PB3&NѣȎs1h -[թS'CE̟?!K.ga„ ,[ !K3ϨɡP%5 VDGS{IIiTן778u 䩮]ӹx|R:̑Bfȑr;,LgGOpHRAp'{[&3[KW9M}=2][Vng\s4^Lsʕ;vo/ha&R23v4l',L0khFV*ȁi ZHL!i;rSE@Kҽct]g۶mȜ~1Oe.^rVֽ+8Ab2ܧ\%稾8puz vm _>k׶6_R1ᚧu^x.F BPdDC Ž8q"~C3x`fϞobqܹs1"FIhh(w᧟~%&4PQ U*c>>ʖ??xISځ: G=uxBnӬYqoxa ӱۯΝ4n1jάYٗf] #GIcy _2uTV 4v %< IDAT3fԬ  e͛ t1hʔI7EL 0H6O@B2j\IALqi #?<Æ TR!ԩSqzTDEA&y渼K 0E B4UMtR""lkuFN.dWmL3\0y"@iժU;BP(! Ba't%W !i矛رoooVR%=Ds]gϞIII$%%/B(IVC`3GS\,n(oOAc-۴y9~<Mւ4R@O-}y_XdW4Zޓ T BS T!! j| ݻ-F~:u2}.X0SBФ۶mCO>D&P`!@e|Ib,Xt}&'pxmX@zyJ?9.;"J 5BnwAۊk{T ;bwF5`0Ź< … zP( FC NزeKZjŧ~Ç """9x .d`Æ os^ ڵnݺp޽\m h`Cut]]GK@(rrd(T(ob{fcGߟIP4C"_ĶF gΜy>^mGɒ"7hZcz/O?鸻k<΋/jk _(hi# 8;ko˖ʼn' W2S?S3shaxz~@\\M6ͳ9}'љyb6|y 5~fF|Jz%o?ONNN+Wήڼ _p(sQ\@`v+6P( EډBL0,Xb:t!{a4i\]]quuˋf͚1m4oߎUVe*GɓRy3qttT_E aJexyʕw:9ke ;gC[F(uJ[3r$' dX4ӠX1ͭKwd2CS\v9 R|"WJp[iG!""wEڶ5[7>ʑ#r ʃKT)F꽎4Y\a`-7o{.]׈ ???N>mWmފ/UcAU.sPD'[&BP(e Q( ;`̙>ҩO9Z-`1F/­[ӷD"\W(r#\k߾s*XX_Ap[A> /;gY37իk biΝ+L4MzpJڵ;9 Xs-͎m}S#GBxm#F@ NaӦuO~65~zXN-ѭ9YXnSj١?`AL .l=NPBuJ-֯=Qun7nLݺuAT"B$,SlZùv횺) ®QBb :=rVCOܪU+)3СC޽{4 E)1PW -a_5s /^Lmނ=ϓ3v|Q֯(5&LШ\YzaCM uw;·O39S8x;;xw7KȶԮ un4LGGS89i  k`P*,;v4mѿС:5jh/W FGQMirP!-)bp l4qmS"## wH:=.\,y BP3P(PS@)S9W3s@ժUi۶-#Cݻ7'Nߟ^zɇ$-[yQzۤIMԩXΓxnݺ0 ţu Ne =mf>_~LQ4j( ӊc!-۷uN(9sΥo׬ٛZ5~kayPFÆ0q 'Yf&:}Xahݪ΢E?rGSueeKւ0YAAP !<~]PA)8: f&7lkov F&MF@=S5WkQ!ꎉ!>^) ¾QB=k7oG_|E/W_~%3g|lIRRR E6QC`kg]\\47ow”(, 0%4}-ApPCv]꟦f>|5ׯth!pr*?fHEEܹ~%'ٻW#6F4yC4m*usW(MVrn4˾x5ggoWpaSaxu`$k4"#e&(Uz?Z-{$::K.E[oR*\4guWX5kBP(ޟBPsHHH ,,*UrG~v;>cǎeر,Ë-&NAW7HH|^`[#uxa 39a'|&=ڵl&JƗof~>u{~mvڵZjH =zfxPj7ػ\ٳJ5NN6'BlFiԠY3yРFBޅ޽z]5kŒ;yA׮pF͚h(1cA0jzܹݻw\X~A[ٳgi޼) nQBԪU+}w?~;}4 6$%%%=-v~W_XbٳgϢ:C sKMTwEP *<,>>7Z;isЪtS5Diة$ A@ܹD5_'`8gԨQ|̙39jIyIWRueV46 ƍaO4l(3nn`徒D&d'b:'0`8eŊ dЭXv~E 5Ʋ8p)OPA˖eAN5kA6a.=uL2$ Y09H8*UPlYu=S( ]^!U( ;wĉj8uժU^z 4k׮y%JJ4gq!nݺEll,_5{F4PDq@ FuS 5ǧ ;qv~3S8)S`vޝ9A #>/ nχB 1l0ƍGZx'ҳ滱""s/̙:KjleHkڵ:KrClC.l8//kWai<//8tȲ5Gg޽ݳ`N#ۺVϴ h9ѣ'NMǎ˱q([;ܠx}-n߾~ Ba(cBPӦMK޷oꫯ ZϏ3fЧO4M~[|y̘1:#**%JqFWԨQCMBQ2=\QWqcNw2b~ 7+h #k9 <,d9=}ϟ௿B4?QC>浠1oԩ -2l{mq_ecG! BP؂ P(vB߾}ERϟڵkmoذ!YfZj=]pFqرv~(pa8 RM.j8sS"pYd IpDcaW8MV-gywS|CUPm]欀n-&OΜ,0 hBbEAl^"E4fΔB sYPпIh^g$Pt*h2o?@:l0eAbb"ѹv.1q> hǝR,M,yYL<=BP(P(vիѣGBE+do޽ !mڴaܹZ3g?ӵkW 6~8~8?s=N^vvvXbꋢ1QdM9U M80Xj"D%q _kTիCSPx4I/ jptKfhih ._|P4n낁!84gOeE uGAe*kvV . ifik\~[@g 1Yij E;W%nQԬMApp0~x ;P( T( ~zۗC=vקOL7l؀]vkѯ_?ƍǐ!Cظq#Q\=ztϏsSOQ)Ȟ{jl"PI 5`I5ْʿ[N$q f-S@ѿCa4`L} BCHcȅ 0wAr!W:oͰg}iYctظZָwåPBƐ!V)ʕ@oP`:8sHkln0}`Pؾz]^œHS%K9Q;m OOO-ŋ,Y3Ȇ K*cBP(91DP(%KK/= W~.R@m?{V]֭\msڵiHC5 ejG1NT-i/ ULJ М\ѿO?ٰVM h(~i7nȴ(Y2s9p!ZӣFPFR&Mgyk(\ٳg-{ݺ g4n, X@[7KLyΟ+65muEbjk zˠbEY_ٲO;2]ކ[`b(;""IJg^`A|<ȡ0gmy$zPK_ BaBC Bl2;88n:,\iYؽ{7?cy+TO>_}U>s"))$%!q0y P 5 PH _NdI8y2n Ow9qBg<+55飸blfUfUFR9AƖCKa@zԮmw (U.>>>z˴~=;fMiI ܾmY=ey2_)OdK0|8\* :l؉D~ mBDsrƀtifc /;:ӳ46H/z-Gs=9c] {\] pc#GMBPJ* 8p B={[o3uTvBp=z_O~饗عsgy J%]u]WuE.QàE0X NZ_תV( ^/ : <_?}}5]ÇɴRdXeᩧ4Μl)m//e HH%ӵ+DFZvXBЭd2 @sFL4z<*ȶ9"~]xbSg߾>kZ݂+L}NO?57N҈SX(A` Tr}(uHv ,))2;@T4<}0髗R֭+Ѹ1,Y;BHHe'it1pmƓ :<’%k(d  N BKk'j AZر#}m۶f͚#3վ}{[2 ʪUh[ GGGA;*aJ8*LD@{WUq\Y Ŋ=|Y\aϟ}6LpT. Ujh  Y7kf6mիpUX1A\??\G|Ɯ9RddB&G|OO WW8p@i8:BH*6V/(U d6~ #!]]5Jx\϶ϟ2 Jr,4T0s&c2>Q/KNtw8y/68}֮X6(:ڏrRxim2Y@ܷsm  Ъqlǁ9_ ߷O0';3/{XƶzrKTȑ_߻ri;mAٷĉmbPi7xɾ}ʸP<(cBP9uJcZhXУ>l2֔,i2 = M@RD=8t -5Ο.]LmJI8'Oj ojIs$q6oٲ%Cy͘aw l"C{o/ƌiԯqd4I$'W׷޲ =llF m7ԭ *IȐfg^o1 Q#鑒/l[׮gի tyĘ1o7HTi IDAT߻ z0Oc^ێ-Zd}>? NSx4_CX1sDwrcKeQ(GԭBP<Ɯ;w{Rԣ{]wÆ >ݻwww:w̰a8<6;0x`>R@ZW(rfmTC`3ǁ3j᠁ewvxqF OCsV7t{N|y" icGgm`r7ZcZc5%K4~tFbN^:͚I4C9 8 sU&CC$!o)itsNZ__ǥKlXNRi2Dc>r @5  ݺil"o/ ӥ'A:ׯ/.CXEE ޅcdY$i7oJ#R' yݻJyScb:.[snHt]dx}]Mm:u`%ի$$|-_r-ggmL&zo3￟b%ۚH6'j\'NXaHC%f̐QP_̙зse ?-!= 2( c̺uy:u@'TnJ 1 T¯j;vsϡi32q\s-55d(E\"0dKL^@5W!V J]Bt.j* C 77"Eftiݧ)%*UĔ).ߖ: /'/i4k>Sš5ׯݽ...dد7LXT#"BЩi!g ^}U.;:J͘M侣G IKFL߅NHְ}Fx੧Or~'ٷ/g |RԖY9XlJcBAb !ԢL/[5,za=*[VwOB^&ƭ|yxEgX6jLfЪ]#dJ5z6ow9(H ̙c~ݽBa[mBx裏z7o?l5_>}4Cf4h@Nr~~~lcTq ˍ @%nj%ma [(W8dI8 87eΡC,@X$$pcQ8\#Fdd1jLU5*ָsLyZ?(jI]pMaΝ 9jUx덷 7?'5iHc>)؞F͡O`_p8ɦ(WWs옠Mߴ)DFcol.OH:eٳrg?6yR,cG7xU]arAٲ աe{Hժuk}۷Bu]O=%M\֭e`!ػu3"Y`ԩhQ}rn̞mJ ׸{WzRj ([61_!! vk@kIx8li "Ϗ,[Ak&kET?{YO?-C].&L .תWuABwhfԩҘХ1r< ㇃Bx\w}ի#9swr~fȐ!4oooo ⵺r\ocڵiE+ÕVP ERP;)jPXCcZ\ic+-00???Zjwgo?|Ҕ'!ApyrQ#Aq4:m2Lbqի Ν3(SFPܹ7=f53-ƒK)*UeKps|1,^ GCǎs5bceتʕ57`0AÐ9-[[Wj,\F҈"5\&Ny E Ji ""ב %Exq/2e4{Ncz[s7MpYMn0p ̘* a;j,ZD%Ch̛' EIU9<1w4lԬq4ܸ! X!!sǏK篿Ȇ NN իqPOxeӱ!!E.^H?,ύ+W4*V2ErF2D\7nljƭ[K=tFRt?IIO0hBC5T\ѣd0 ~)]RB! B)Z(AAA/jԨAJJ fb9>^ufΜogm,D!,l " TC%ivW;!Ɏ:8'Nׁj8.o79z5Sv !#FdW:_}e\\S P 9dIOl?lYOF:G 5myޔ/_//Li2\ӛo78Pg`ܹrqt&M>-QC>ƼyУeUݺ`BYS#,Aj $74Ize!zUа죋FIo}4fA QQ҈մ{EA~[O{AǎR7&abhX@0lwo),2͛Ӹy:w!4uנC_- *up.)nn%Jhx{ 'OjHF.ȾL܆A2Y| SWFBA%*J]q4I;2D 4ToƭF4ڴl&h**mWsv?Ŋi88[^z`"Y+R;=9fBHBxPa ӳgO51n8lٲr6()S{"))$KK)B8;i%vm;@]50895倂@pS 5R\I| m?;s%4FKd^q^%(ZT)[V{ ODNWW9RQYOȾl)Uuc]zKNHHt iis,sgwqqgXN@ ,͘I]FZkն֭z{۫v1W{n^U^ӪZ55NBH!@ !$aq0@&āsfΜ~?Ӹ҂N_v4)Ho[vK^)|NC|)HwdgS˓xֵo+3SOQ$y)\̜iI*-UQa+,^l?ŋ)+wgw%zӬozU[3f8':WK/Ute}}m[+W:#++myܹtzt-s~Vg.Z)9JJsΝ}sM>eSdsz=_]Zę)|td11'}olaqm[vء^zI֭/,۶e۶jkkxbe!-)u'rK:NϐlIc.TJY `T4IU\lu1Xƌq ,qM077EKS8'N5s8YKbJ_M7W/~|d5 E[~Ifϖ֬91ƍ>nuFqtt8ӟHo%G'[2'l}>i美g/U]*="i|gT䜔ߵsᅖJJBJN4}3{l-\hRNr[Xzu뿜(h^^ϝ~;g;zs w!:mnv3922lٯ 7ߔeKga'ƒٱ)9=:iŐ߶C3쭡)ٺVgRKg)=ݙBjlҸqbbхCH8 _ 8s%IBtt NDZ߅N#JjW90+U4I\\Ƀ[&Hӧ{Ojs{(ƌOgǎScc|>gDC#'?ylG_~ 5O:rrlm]˳u]8ãi/9ӞoL5f̉#ݦMzFi>,egrnk1q{8I?a‰iRRow~쳝K:?ۜ2[m~gjɓ--_LeS>ZwFY㿏~{OeyǸY63SZ^Z)]wzSN!)ctu>5kV[99jj~է={wq=r)DE9DwIq~SzbTRs%m}K(ipݝ\dEFFs9ob8{O^*fIբg%'>i ː-)^tY*’&ƑIQQm@=rr,c4/uC[_}}×>\:r9'̲nq+9Fvv>9Q{ӦYZ7SRB$tveSԧN4R6ev[^{a"p0cOyӀ NlwtVGSOlsLgD$m.} .3bEV<|Gz)gGfs?>2f׿nkg}HlYtV)*J={|TWgk~QZOwӃzC>yGŶƎYU\La=FrzH+V8y} )G:grF47K'O:^|C4Rdd:::4gmݺ#+VЭުήxw}N9'9\lI3q)!f^ѯkBp ,М9oj8X}{;vtFn;#eNѴmkdZ[:-=˒%54/?yӟlߝ<UYǜ3jcRP49l$ם}jNbSrTVvvcU7w8>O nm9sNvySh*(p[gib[LSS\+t~&\)^K*+!fp:={$oΝNC22~,;v8ӺMƨ`4#8M?|IYguÍn޽|;{ !ܬKgqIڨaESSS !K4ڈ 1KVZBP-qQUU***Nv'ɾ}tС!nV/vҡ*jg@'8Ù"OF[awǯ߈()N ii@^[_lrF'9%z~kڵN$9ٙj>w޿Eb(999*,,!:Kg9*Vvzՙ+Xol!y߷6g9XZv-iiVrޮ)LLm|?.DZԿ?7ڣ쳥Fz{KHp 3f>{0韲}L6{NVZSٽ[z![fH-8<$..NZvigq⊰QPYY{gҢKjӦMzꩧ$e+- mNua>I&;VkFts(w!D{_ |mti:['zkH 6Ix}9iwdLk կJ_K/#%zߧZq~sin[{K\0 ,*+uV{ggDҥ҅J9',%)HcvMrF$';멭u;~OۊrF(irgرczWOxW{qKϏX'XJMM՗%v6`H!Pnm)3MVbƍ!k۶maXI͛}}҅>=7vs}-rzit7 ?w-[''MK]l{ߓ.~,[fGmr-[6SW\Ly-'ǒmK*(^eS8J.SmgiiNc'w-GQ`^~e͜y#??a -+owCd@pʉ+yx$ 9dTO&-Ru 9,\4Pi"##tC*K]m#,_?!Ajo?1ҡ)~s9\iW$2?щmqҋ/J~ŇS+;]wI_ф ڵ*+m;FYjimef:_̣v~>iS ILt^tQzFpsΠonG #g*DI9>I `s6B$AcT[[j08xBURTW)S,}k&Oߘ=;Rftg[w~d Ƶzt׿~ҥ-]yk)#ڵNCQ=+/#gMMk`XqY{q]ŨEjj'j%KZFe d`rqIFdcp-Y?Q=0[=@h v?~`7n>aBbH,(ŌoE1 AprʂY b0IX9#b)Mg,0Ϥ2lq =xk].@o񩩁s8iVCMR1M A&bxf~kKb:1`+9lܸQ۷o'L'c.'P5R\Mj4~.yzDqrGp6K\cDL%!I-(&B F={6Ax^ÇH꫁ Nerr,F)J;=3HT`XTC dK@ &{zavb m>89 )Cg=z֌, ? %$0)62ljV9IX0Ɍo~ˉ,W",&#GN&'NT~~>A EEI΄PK/2 4nR`PTAAuJJD[#[R5<޽{UTTDk'?Ihơ`XVUUm6zzh1rʂF9gfSq%Y$f Em0F[nՎ;tyFSLѬYas瓴P6rab.nDFF*"yb`X jjjN GDNjjjBޛn)E`: i?1[ŽrCP)iKAgI1(2:7ƍdW^y%]tn6B!Udb0{%zr!5!%DݻUTTDeɲ,5!__/|fzOi3y21P.̔48LVŴFA.!.vH͛7Of"y]8`${I]WM$. jn8+;*LZzV+]E&1 qRv"G(0455 On499 |I'6-3$49zDb# 47*((Ќ34~(0$$$(10"b'7,qu:B*.iz ;.PE:)k# bAYY rrr4k,5!XE*"k%"%qR֨^d%EK:a)kD8tvMF1fΜ\}zz"Fh@h$˙qŵ{Œ]Ũ4QGI"NTB&eee*--%j Q ⠤Jb0ib`I:*(L[`0̙3 (gɒ4\'i<1dK^ {(Ia21Vh&83ҤB;w$@XԤF@hK"`lbH`d4!Lm608qƍGF1 !!AȐ4*$+$m')OY%[ȶc62Z`̙Cmmmjog7!PLC A<]l0,V+]!F3REEA455eM@x\Nv}7gP)4Ij!H٧`)2RT~ii6mAx^:5b'9UB'5uCPh@݅6Dq(##CaP^^"5!ee!-rc,bpe$PG$uF(&BJ!@݅)Sh„ k̴ 0futpf<"pmB|3/räC:L& . uuu'@XR`(I:D h`H$!KȨVa(d8N"8kTOjCprb>1L^ ))Ip 555 &Qz`VAVno:lr0$q(.RܵQvvrrheR^^Z5F@IIviWXׄ%&2B$\i!fII &d4VR,Qx;Vr0ٸqoN999*,,$@X@ӧOW2 Z%B'>RbJ~_(#%EIaafϞM555ڵkA(F[`tR$M WI:H &>8SitbF6ӮO.7!GF+KAQ.г9#iFtmHAYȑ#'ǣ,˒U*a9aqc!(Q!xpql %у(//OaP[[K8k0fEG31802%eBgK9T+gDH0I4juVر &M3g Q F9Uy_jژ&+4IQ:4u.TJh`B0ؿvIF1Ɲ ITJ81 Zvr0>?.L*FVVRRR(0455 IrFpْrtI`ܥxNvHN6ILM2¤Rv"foj0$$$Ȳh ӭ ͙G %EKZ/)8'uazhƌapq3t $(0B|>tPX?W\WWOhC0MVPLwQ" =&7j=CUVVzu (_qXbpe`r+52Sp>I$Ȓ䥈mTXXٳgA^^f͚EF10%e+$%%)63"M"T`>Z[[U[[Kڽ{7AF˲aywbIi`2vG1$49U &9 )9rk.+&& a&P^^u̘1fbpHɍF9Se!:hU-ifxT<cͨ(eQNz=%%%{o6z-=3þݻKm?ISw} [ouʕz &~*++oݲezaؐ^$U ZQQo}[þ? _>6Im-2u_mvI?2됆[VV{3~ղqRf|h{7ߺj*=|;[nՎ;zn֪bxvޭÞOr tQ^m ]R%:z}O;T]]C*o vWXJ zam޼o'//O'vamoii /0͛]KVAAIo+=NJ+Wu͚5:rdx핗G+(0455 D ϸHn$GK B-)RqWcn:7*++U\\LF1 !!A@TN F r{0|M풚5#QzTL&etiPrr2A˒C F&+$m#RC9!g,[!3RF8WPP3fA{{:::(Ctb-4L&IEFN-57̕e!)8LlIEFrZčriѢE}"zc----ڹs$iڵ뮻$IIIIڲerss SҘ1c3AGhv}.(cD[N^gI:"QS ݻUTT;0UFFAaOk/LCCL{w@Pc.~wGlY`29A1x`rz48'EYRZ,Y̛7OferQ544 Q  q>EEqi͙%FC@ir68WNQAfr0)++Sii)AX%˲֘& 0l-[c"55UgVAA&Lt)--Mժқo#Gݎ{ZjըͶIMMLʏ9(R 1^NA@;D,IcL",);L@cǎ%'@أwo>??Њ+JhѢEZz7!!:r#CDȍX3:I/Qr0Wzz:A۷OkL<$)++Kmwr!D>4~xIҖ-["p%I$bp%_R1J-PJ;ɺeIi<m߾]۶m# q 6:333UWW'˲z $#N4FvJѼϖb`͙3 <5r+IZ|)wܡ~X:ujHֹvZmf]K̺٪F.ޅ^p2ٶS6Z[[|GG\GH6mڤ, 9w\pRզMtmllԖ-[tyv??JMMu|MMjkkOKEE*++]2^{ֹ&IG ~֬YӧkܸqC[;A=ɚ5kޮ6Tɩ^~Is̹֦{k[^yTTTE3f m}iϞ=x۶mJKKӄ Φ~#I urvWZ9s())ik]]?>mx F]طIԷIQRW(->|>PƙYGw#顼޽[EEE~\%iÆ |{ߪSY%gS]o#N5VMMM[kNmSS >@{=qq恗khsJq'Inq�ZJVĠנAmoΝCz~kPii~sz嗵w!mw(A555spD*q-R6lؠcǎi׮]evZUWWkPcc㠏A.lٲE% IDAT<7o7-m[?o>yJ8V?)**s=͛7y,KSLq}NovUW x @8,X Iji9uWwxB71##Cs.ZOBB"""NII |CClVJJ^WۨTSSfΜ+WjҤI7ou*%%%}3IIIэ78u6%i:~~vPo{ۡm[\rɠ֑XwZ~u;G_Q^^f͚ziiiJIIr1$%%E_S>Ns:zYsvzM6kc[ZZ;俷SK,罹j=7T%$$(+iFUXX8>A2tu׹f c*{;gEFF*߹+ϧ.VJĉn>wO+>>~HO[Y %$$KY-X@yymk]T|ŋ+..v6~"VfN[uTWٳoQSxAJJ}viԩ~ 5iҤ\xvOy<}4^ѣ:gRkgcǺ˖-SVV߲---~lrciӦ=C}lsss;^x&O|[K/zs=neY֠oᆓ>~^0Y~Ԟ~=Iiڻ{}om3{4ۻ{۵h}@򨨨WZpxw_Pɺ30<"##ޮkݺu![|(Iytr$ѣ:5uT=#*//߯_:u>򑏨CNL/„xa\/$Iwܡ;C|M:UYYYӁo>ܹ34[˖-_@?C^W[[vء;v z)))BdmzGC~X&XD10B:jٶ3dN,m޼Y?7*++UUU={Z2efΜ'??|P vSL<@8%& hCF1h  ۷O6mRGG8 M6[oiʔ)g>etAܹS/̙3Oj}vG]%Q?رcZpIOy~<ʔj֭z?f̘1uO.)''G{jӦM,KsOjz5o<|>}#!QfϞ=ZnTXXxR}:t !F1*?׃>8ϿwO~2Ng?#wtR3nP[[>&IsՖ-[|lٲe_2ZJ\rT__IQ??|g]vez\g͛7^W_}5+Bz'eYҗ40?ЏvUW_M6MYrΝ[]O~򓞢l 5k,m߾G={Wh"^tmz'OT\\˼KZd y;v[O!pj3+W !޽{ !>l٢GzUYYHfeee@eB,gs9r555+++˯R^^{Wַ~vm֠E:ɓ'B<.\[ 6hҤIZh_!Ô)Sz !G ,мy-m6W nXVTT$zB"""4֬Yw׳m6-ZvRRf̘1`Һu+DEEiܹ;wne~!y_ԝwwܹS6l֭[N!h*ޅ~L4I7nm۶/^̃0|sAx |>YFWmۺ{Op]֭SUUU\'O[GeY=Z$$oN[N7nm-:-\PGa(}}LL{=uvvjڼyl7-p]O&ݻUVV^{Mԧ-p*- Izjutthƍ=O7x7pCuy晒Eɶm׫X{m.Z]8pEIӵ~zi˖-ڲel֧?i:\@0 (!j׮]|A͜9Sgy̙|Pm+""ǸppsQlllիWc3<##ϧK[{7c۶mo/.c|sP^^+W***J='z{ٶVjT۞={+!!A:-_J~۷o_ Gm[nQ~~rssue^?s׎;e~яO>dhn{Wѡ+R|۴imǃ0lڴI2e< [C7vXBSbB?%9#=.첀˭_wlٲ/4yIݺ6s ~~ov`咜){~iiie?>(=k䜔ŋ$1BtݰaCGKvO_/˲/]WJJ P7_t饗{ZJeѯ>VZ%It~wn766n;w"""ty穰0rmmm~-rJ} СC<#@||>=x%'Gt]} \}ٱc$k16:{m<#D~~nFcNMw%hŊmpe$1cnVr}ۻw>K?pjD.Ōo}[={U .{5f [&=\:-{lr>lǏ'8 {?@WOwf~: #/KWO:Pakb0o?zrN}f>f4o<ae |\pm[=n vړ?({j_0>Nu4k)k`8k֬s='۶#+gd /~ xٻwZww;t} ÄbaѺ$EFFꬳ=}^jj*!yW1Ι3`mC[o@ZcSиu}(BOZ3UӭN "֯_{WzjBaD10W__ufoȲ~z\3?_>Ճ^ߑ#CYǚ5k:IN_%K Wzz%I]t/^Lأo~F_|G+|<ʼ)]yHK<3/ҥK }{ו%KN_*˲믻^׊+|3~կ~H8pGwֲet+,_ ԧ$9^{ Ì!裏g?Y˗/w`۸qzIMMr?nI~' _}Ue:}EqmgW1(bGEDcƂ5jGѨ b슅.B;l(.ﺸ33g3p95MϞ=QH4i҄ F&!))6]tsҜ=ugw'Fcv6m 22k \ NdžQhڴ={n?%"z !""@mݺUzC2dvÆ 3z*hѢ2Vi86;w.ӊ7={M4h K j詟&۴pB8888tΜ9^oݗ_~i4H~ʙ3'ݻ#GܹsӀhu =O8yԭ[7kh4 ezL8se۠#gΜ Ù3gp9ſZhÇݻ'f a02>Sl޼={ʢ!Ppa;v 7oTܿSNll3x`8}4uGI={'NHOHߔ|ܹsʯ^*vuu375}4mϟ?\-JdJ˖-k4E͹s笪Zjcll]vRgu] 2*gK.R"""˗/gG }`VX!M rQ]z5DQ'W.͛-Zs;,] lݺU.~|Ir}6 ٦MdJ=Iywfc~rZt4h,&& ,^XҁoUVEFTR@#m2"""̝;WTu( Oq%rnLVd!!!N:aVշg)0f/44BiֳgO|rDDE5h(X ِ4hlk{聵kJ`#g#GƘ1c-]|٪:O>͆%"`BDD8} HS ĔL@rRJunN4n86j6V@6i8{,c6ʟ?-_l9W\lPOl",#C>/_?r۶m`Ͳ? Oh۶lGCCCQT) O=Ee?-Z`#P1xo׮]ر#6SN5All/aҤI(Y}M&7fSبDD"",֭[Q`ǎh֬wu֕-/[ O>Lܽ{wY0dVup(Q\xQܺuk6 agi6l؀cHښ˯բE CE6t6q!rZ\ۥyefC~~~jղZx,zԯ(8MQ *H1PJ $_|Bagggy!v,]Tz=p@Æ C|eSYXB|16p6w^5SY?e?;gΜ sOd{yy_G^EIw͆V^-_ DDY!DDDYСC#G}֯_oӧOXbHJJvŤ6hƍ ~aȑrd߿_։:VB4mڔYF7o]`` ~iy…#00P|6Zdt?o^u+W`ɒ%A0eѵkWWݙrܔ K~={t]{]@@ j1b6T$O+3ɹC7n a#&M$Ffw#"ʢ !""ʢܤ׉St};wlCQF@<:mP@rAB;r<<<$w4޿_:uF2ѣl9OR1tP}jgGŊVO=d8ɓlx5f޽{aggM6ɶٹso(W\u;wN6m_||j֬iv*-R-6mGGGو"غu4=hBdnb(YѨɓ'W^;}҇mΜ9k⣏>ž={dR%K}Q`QG8,էO}YfA6/(hٲ%F*TȨo h4'^oSرciA*V///??09>,r-z >^^^?ѣGRJAhZĠC)eTܹsF""@(9q3gNMJJBϞ=eeg6ޡB ׯ;6x6ZjzѺ'G#Gt;f>^u 7AAAz)1ihW֊EÆ y1l g!""B~Zp!PxqumݺCllѺI7n49}N>ݻ˒Oҥ +ㅇK߁o߾ " e1M4ABBBעE ݻ7+WWW6r6tȼz Kڔٳgc#Gq7nܐ/^#]S5Ȇͦ޽  ŝ;wP\9I ޽ IY&å֭[Pxyy [nr(Q:hР)00+VLd7oްщ2!DDD6nݺDDVJʐ -QFOpwwg~bC}3l!DDDDDDDDDDDd !"""""""""""`4CȦ1BDDDDDDDDDDD6"""""""""""i Mc0l!DDDDDDDDDDDd !"""""""""""`4CȦ1BDDDDDDDDDDD6"""""""""""i Mc0l!DDDDDDDDDDDd !"""""""""""M@DBH IDATDDDDdގ;x4 1vXMqcʔ)ׯFzw˗/#bccde˖l,rʨX"۸rJ믿FǎѦM6>e{ 4 DQhۑ#GΔh׮gѶy/x(DEEa5jmן| 4otqqq3fѾΝѣqyYyJ)%/H)9|0nܸ7n]p˗/˱vZ 8l""""m}}}3<, e|XbB =xSLA!A@\\x7 Y֭[!7oddQӧO-?>SWvml߾0h !"l""""N(E'OݛuV۬\R:O ̰ez ƍ㧟~‰'={&NLLdSL0*T@RRi*TɢN>-[߿[nصkh48p/eK&d5jX]vE|||/0~РA:t(/esW\Cv4lׯǵkдiS`ʓ'Oש˝;7^~͋@KAAA(]4&:vQٻ C8pZn QѦMdɒ0DDpd)2 IHHٳg3XϟN3M׮]yQޓE8l0@ݻeUTϱxb?V,oժo4o#FHˡ dq3f̐-9UVX|BDD!DDDDH"&#ÎeIRyEttM| VZ.""۷ѣGF>TŅ7YF~Ç ѣGe˃ zW_IA$TRCHѫWLč7}(޽{KO8e˖+^xnٲ%V\)+SBd[nмys6LwI矡jׯ_W_} DDD!DDDD6ÇOq̙#.\vQƻtRFD|h6mX>w\4n8:[S !ք ׂ `ݺul@﹔υʕ++WĉHDD-0BDDDDf 6Lɓ KWk׮^oٲEdͧN.usz6y&O,[޸q#o>SߕJ*e˖rfx([`020)5R'sԟҧwbŊxMgϞŬY-]4C"u<}7Y-44>>>^za>gΜ1*V{?~Izi&^,""y Y B޽i믿^gSؿ?"""2(\t)t˵ZE9\*::)vK_ /,,,ݣ ((~ ݛÇw^t?̙3a-À3H>|9fnڥ4}DGGc޽ dO{&:::CΫrʲex"""[`YL:5-gtG̞={A J,mM*7n\^~T (Vj֬ APzuL6 ={E]t jՒY&+Ahжm[ر_2۷yŵkWTISX18plW^#4 A@ѢEѮ];wurrB.]S>MNKzj~,Z(ڷo/Փztի}nqrr2g„ (S *dUɖ֭}޾}{}UDtL2EܧOCDD6-,zܹsFOiӦYU_' ;ϐT\h:"V N'+[h/^۷ol.\@:ude $+WzZG5 ͋8BE߿(Q"SovLyQW^EϞ=qmaǎs\jN::Bcv܋/i͛7/0MÆ Ѹqc!/_\62 |K>Id<|d׮]ÀFԫWOzϜ9h_uYʕq ޻w4bDF'Oq/O9cǎ#!!O Xj N>{?y5k4>vvvHJJ'oߎ۷cر&w͛`(^@TTI=cƍqAAAZɩƏӧF޼y '&&&)])@Y= OOOܻwFXXEAEC7-oܸ;!""ő!DDDDdUVKݜׯrRdTKPtiYի!g8AE-[@6lB֮] Qܻw(l% H"E@Et:<}o޼Axx8 ( '...Sm9P|yՎ~\\\TlҤIV,2c BEh'"G^ѣGRbh5j@5gСf!)NQ\gM1c]tɰi -+\]?Ŭ&u籇h͐!CeuϞ=e7%J'Ody;11C(nhUVɦUʓ'DQԩSQdI("_|u:3>6S_bbbzjicǎXz5/_ *3rHunٲ6l:uhI&_~W^aʕpS|RύʜqeiW6=TTܸqC$OL83fĉKR#|MiBϞ=vҲ 7.^h88qrgF777*UJq˗e#7n ___ٳG z7n-[KܹsqE۷Ouz;S;+V,MS9N:ZG6)S3iɓu1aEQ/SLscl!DDDDd[۵k###eO%O>Uܶe˖pvvEGG&-߳g޼y#-?G͞oNdŋW6ܱY1bQ.$)={f#D>驿޵5)Oܹꫯp)lL%W J+VLq[i ;st"=IJ=_}DQ!lN|{}Ĉ+7Svm(Y֭[^9sgyg4à)@[ @9/NCXXBBBPlY;vL<(ĉ1bڵk1cȦL-FLL &L5jM6駟ٳgU'KR4rRJmn8bj+VÇUs(}׊ϳH"F"""[`YQF՟}SO%UdI+W.C?0*3AsLQ<@I9+WF,d5dƍ3IcE~˔߷!C(>_~%(Z|>&;88šo߾X|9a^ϟcƌ1z&65bvȕ+Q%KPfMp yA2 Gd$֎R `I&Fe˖-3y ߏYf)OUG.\PuS%Ts?s,upʺnݺ~-Z 7j9s4*su7o^kZԯ_?I)`*آ4bA޽{5h΋bÇ|2=#6&۷Q5J<3:8?jSSKdT*UԦQs-2(GMYflC8}ɟ{)ի,}qT$i(BHVZFeK(tYSIa0d~,Qb]Ǐ\O<:DDdr (-V^!CGGG벹S4Ѹ:tuI-29߻5=Z֨ٳjxbe޼yرjHHHm?jߣG"wY^P (1K.f ASaTSЫW/L2zjcժU^i0X; gWzs>}\ҙ3gлwo<z29yNn kGk۷o-[9SKb>ȨL)CDDd 82[uam 9xzj*KXkDdd$wnرck.ڵ Ç79SLnɓ'bccǒLRA'bيf`1j(_Ob1cƌA0x`UVaܹN;Wvm?~lTgJ@#=2sT֭[1i$KejСCQV-T^_pidE&?ql9...]f$""dQO>~wDGGfΜ)mΟ?Ad;BE^uMSǏǑ#GLn#.]|Eurʙf(ZQYVq!2kFݤhٲbyzsYR+6aÆUߐ|WS5\-y)/^dSBL Ý;wp Y0p=evrssE#"l""""JiӦ[r%HeԩW\@`ΝRfͰ~ϟv˖-C׮]-֭[?~mѴiS֣G G؆e˦][KCuY/^V QI_|ly͚5^iZJ=`F A'NHHPmWҔM65[2soDDD*NEDDDDٳFfΜ H˕+WFҥ3\5kcǎIZOԩS1k,0x`dJ,XoooTPdBVZ!""ŋbbb0l0sdԼחҪ`fiӦEC/^4*kԨ522 4 8k׮r*"ϏϟKeK.EժU+;wޕ7oJΟ?o}ݺu4hƍX"2e˖7]Q+WZj䜕F ""[`۪UPJuG^[.Gsrd3gb̙8qjΎkעGS@ၤ$8q-Z0ѐnݺFLЛԦ:uUaTVpa}2,X+[nhU] xVXÇGam\_}*TȨlϞ=i>ǃb͚5غu;ikB Lh"ӬY3`ȷ~Jҥ Fi111Fe*CDDq,""""RI됐V\E1#jժ)ɓ'ӜPMNe2w\\pA5qS [n7i S=x K+˗/Ǐ9;;g9׫W ;mŔ)Src 0 ˟wH"h4-Zkj#.\ܹ3mۦ8(3XZ)<d@2OO4ݏN9?8z(~GQ Bʕl!DDDD(ӖL_dm۶eڹ*uɓ> 8z6jBpp(js)~G8p@q]hhhWڴi8aU=JOBgfK:t{NJY pooolٲ@rgstt4t:z=DQDBB:J*YURoZl84i$SFgZsGc.(Pc8U`:u,گ|F|k׮ صk\zըO?'""`)JOӧfoذ!rP}:S!:sri>EéJ NĉFeWVivCZg}fT~ΝL)j.kzlFm2BݺuU^n~ ;… ѪU+<~5k|/i<|DGG_o̙3io)WZ:|||'evj?I˗OuRg)(u޽ۢs-Ylyرۮ\l}g6*k۶m\w)ݻgrf͚)WW)%prrR\7zhlڴ)ǨT4TR S6((HugϞp9j~RڵkMףGij… gZ `ijKTQϔ7oJ~NXtirSCFJ۷oYPP˧ժU+ܹwޅF۷oӦMU$| IDATm ?;w?f1BDDDDF .\h;*o*agϞ}1*;~EVرF 6a8dǖ ^~-#^_flyΝA xT-|jyU ի(޽{uiw۶mA(Au H1;]~y)&)#GH Q(d=C۷o^GGG  ¶m۰tR{.4ZEmjN:a֭ AXXn߾_~F>lY]͐!C>חR3n8q# r4”E*+IՂJᔀN?׵kWu;wF !!!رc eBE~%""%9DDDDd0͛7777Y->ڵkU͚5 ݻwW\W@7]tAHHܹ#u9::"..N7oPn]<{ 9%VZ>}aÆnj=MѣGի'=0Ҵ`(IY3gNcݺuR.  BdN85kD-עE 3wNFpuu((UŒcڵkP֥57ٳR Y. ԟnԨ3(Slٲefϣ\rF-Do֬ɢռysI&GR dذaFO4o ,0ڷe˖7nϞ=ȟ?lUePKuʕ+ѲeKAPn]ԩS]tAr \]]1k,Y wU]pj^SS۷ORzTp۷/_!#GTd9o.^A)vdĈh+WM415, 9sFJXڵkZj GjbLmϞ=B<111Tsp>|Xذa걣pBujo 9d=b„ ի}׭[}/^(QqbJ dQre\/DBDDdӄ2=nl e* $('!dOQ2~/7""BiL9rjӧD pi:Tzo_~f;vt{ԨQXd `ʔ)O(PxUV;vz^ ʤ2eIy+wFs6qD̙3Gu۷_ʕ+/Gؿj ] G:uX >>>F'Α#Otvvvw|ٻw/ڶm`1c`VtZ͚5 SN͐i1n8l޼:,)a彰Ssg y:gϢtׯjy{{{htVU]?d̙3㎎i'o߾ȓ'6n܈m۶m9s:?Mʶsppرc#Oرcx)DQӧOeO ۷>'|#G@ll,DQ4ݻ7O83;v 6l`8vلʕ˗q%t ?6h4pssÄ TsnnnxsN5EŊѬY3L0Ŋ3( }V YߣGdk֬AŊcjXn+.] 0SlY](T-n_KrIL2ݻwGŊjt=1g\ ...?0ydTVM873}dwww5 ?Tv #_Rz 'O}ȕ+8 He6lM 6ĩSa\\ԮܿsHJJx?^pW1g>c={Ji0뫚7l G#C( !""DFFբm/^5kZ}g%JȰ󎈈@ttEO0 ) M%.k\r裏3gN<{,\/kܿƢkeU'vzL4Iy4p@YuHH޾}X\t %K˗QLܽ{oƾ}d777|0YO$h4k>,_CoR0 6,S{/(P@6ч#C(۱4 MIXD  /etNF ̍^I]BfΜ)B .lԩhݺb]Ep=SâELɈ-[dw߽@ѣejS&P'""""",a׮])jҥjl_%K7.]I)9ul54%|'""1BDDDDDDYBNd͓ %GfIɧVZqb7^ܹl""6 !"""""p ^˦?D2eo޼)v̙Szi&tؑBDD !DDDDDDM81Mu]|%K˗~͵ݻwaoo@*UxHhZ}_/`Q`w ,0*7oϏM68z(ʗ/5j3mx?ptO+F'44ŋ^?0DD-1BDDDDDD]"E˟?޽{Ch4)SժU\\\`ooA OOO)xܹ``BBBț.];~E5kdQ`w5Mn#"qUEbbv[l˗/Myzz"""ԩSy3Fh4Xr%Μ9!"l/J*!** 'OƯj-˜1ce/^ܦtl""""""""2\\\~zܿ<7g}۷oCl!""""82Ek׮ڵ+ҍ#CȦ1BDDDDDDDDDDD6"""""""""""i Mc0l!DDDDDDDDDDDd !"""""""""""`4CȦ1BDDDDDDDDDDD6"""""""""""i Mc0l!DDDDDDDDDDDd !"""""""""""`4CȦ1BDDDDDDDDDDD6"""""""""""i Mc0l!DDDDDDDDDDDd !"""""""""""M@qBDDDDDDDDDDY GMc0l!DDDDDDDDDDDdӘ3(FȂA@ݛv6z0BDDDDDDDDDIBYȉcySiȦ1BDDDDDDDDDDD6"""""""""""iBDDDDDDDDDDqOޡ@~Mx !"""""""""^FDE" "sQ"եI͟κ hz=\[DA`' ec: 1sHs8;:@' Hzx91ІŋupHP끤$$gdԚ;"""""""""l&q \ 8C oz<Ύ8~Ⓚx\M]兗z@Otu:8,]␟.N5}fNRFDDDDDDDDD_F|NNɑ#9*x#b=³[3f<;wlJ܏2Z7h0:쯺]/ !"""""""""qq :r A1O JHx&bkTt+hTׯyXpq)r!i!vcNH˧NA~+W.|d;^< ah޳'_(Yor+wh:wn8ԨxݹfM7oyYb5|.ƍ{bĪkn}F{K+ !"""""""""aŬ?G [vZ,chZ.}sWV8;;_3#GÞ]'H7~fve~z^{"#/^|RX׸}- "uN9D3!DDDDDDDDDD6Z3,;m@R Tu˃e?G C+^ 8iC';ANr۷o3gL!@rޑGUpԩS[ZS ut{jZhoV 9`b;É23f.gNܝ4 pE<|BnnRzCvA<݀cNyfmNx%sv9 G(Z(Π$&&JJF+U$rʅ`cDZmXl)5j`*"C_} PF()@t4>JH(":]r۶]:AբSضo`+Woɍ A~Цu+h+WwQѽGothGw'A8::`ܸ T"fϜFN7\~vl38 '= 0Yn''Gk49Cl̢oX |ѩao!4 ":$Nj')>.G)r!F 11^Ez}r@C!wB v9sΝH_ zS":bշŭ[ѩc@]pq<}Lg]'On@ڵP\Y?q^ݐ7O@TT\ ֭۸u6\\ >>wEd}\~cFZFvx}U)Ԡ~=y?6[3G٘D=D9t :|"rhD8 ph^zvx5%[P!@Tt4Dv̤$v,[zu=eggT˖mv55`M 8U<2]K_(֒7q\<_Z CLRP Ԍ=qHӧOSqb*-^\@P׮_wf?{[>k$G^iSzhMFɉFrڥxR$rfR05U$_ ̼着6u`|*+:ef}[m[ ZB<ݵmX1O+3#C/);;[۪(W_тr֭]zwo1K&J'i.y9yT9b)'>jNU^~6_sԉ) c~/hh%ZUVLD}ZEQ QBBB7v7WiƤIxZNa]/*S{Ij sɪS;(4lG4eۖ]"Ν22JJJz.VAbߩE/iHBmޯĿY.1h,Ҧ$Q È!af$0 |Xݗt06kƄ r}_-g({w,x$%F"jݼYVRS퀠&nXߩ卸ݵw$&*o$+%%=@0 B!B! . &}@\# qmٿoE`#`E`GtG``&9hgb2q-"g(l7]ym;iO{/dԍ;֞2(c+c(cw|nW- rǘKɯ繃wQ"̥8Ÿ1aM}>EHz isǏG1WLR}kynv9Ȫ]uc9qvM۵;=ż~}z|x8+ݿ?dazQEvQwt=o_v[9I{Oeo׭_/4vxS]Lk)c222vgvy!{< ~xLJ7a1rq`ƾw/m9s+#<$c9 iCYӺek\nN4Z?!:f /o!iȀڗ疐_\ϯM5.V_ V? 55.*"g&lk袉cڴ}vEx ܵfAc󩌡-""کEv`t&7]i䓞u%#?Eم;-T]M'/|"r[gaJjݴJ|*>TWM)(eރo v51ၔW:~(Ÿ]nf30zvl6yn,3qRV^N@?}{u'ߟsz51_n7N'_S&bt6:*L?BnzaEvs̎筽Sه봵)5p>o\x^1ED[[DۗCݢޭyؠXL&\n%_IaUu 809 ?"-nF' [Z\j[rn2gB?bYUCK+s~2n>U5&9w.$t#+'K""ma|msJb#mM9# `:f T &ښ O o9w*vz{7 _6ǟ~2(c+c22v2v{h G8ѲXL,o]Hމ0 79UG&3?C\]t1""+TMu5LEj4=1">*__>n~`l!ܳb%e)G֑«G1wLn1{f !u !Ը\zQEvsNe\m{K۞4FaО4ܓS{{h+c22(c+c/cq64fn Jp!y>PL&c~u} )/ \~I/"հ/WW?_ Ws]pVoSVQE` Fvmsҷd?wB8%epᢰ=+,V76oW(g^E`@CgtnnpKʪNkd>4]=w';>elQVQG @i6VTReLE esi\OGD䌋#+^3>,& "qV59@? J)d2鹹_(~~$ Ďv_nLUu ~~ rC[w=a }H3u;z|?禆& զNg|Sim;9ǧ-"""\ОdG #3 pNp_gL q!"ߞ0F`T8kZ - j!풘Sk:33/4ckL\y*mݾijv=jİ62(c+c(cw|nM!noNa]r\z=֯?J7oʼnlu?;U>hr:ٳntC ~mhx_F9ضc.WM"zcVkɞ3ѷwbk\|qn -HDŽmSo2Shk{v5 #=okv|"-"ۧ3f&7Y xYacOo!hp2Qȍ_]TGqf/3#Lj2x4ۍuE}X}8SFϑBzą^d\c/|,{i3*‚udo-"^.sim3iؐfmxCaCI6knzlMSeleleS8yG{@"Tc6#邝L(fȷ!$$C'=?q K+Yv]vu.F8{-73Hv9ż8X}>ȏ[ѽ+n\]y-bl2QTVɡ#y6x=\;u0LwHHHЋ+"Хƻkn~GtLuvvsמfA{Ͷ3l`{--"""CEX.@,2z #hoM@@en7ip_&t!KE{Vv8mw3^6:`kwTmQelel[m / *:R"=F=_gumԇv{""""-]x)(.;LDBBٲD7tQDlз >~M|cZp9Gݟ2uU.U?ދ222vǶ`kn &"""r cVvv'_2J+ϊUEDDDD۫+huTa[DDDD קCYYUMiomelQ44[P:2(cw,!SDDDDD:2HXԋDDDDDtu"""""d2`֩EDDDDDDDDD{٭'u9HR9=rDDDDDDDDDDDWC[DDDD)ct S*hy}4yghi_Zk>8h0N! O7l`ȑ|Q*&M:}mܵ5k_|ݻxWXt)?&"""-"""aNm۷/>>>\|4֮]!t_GrW˭O%_LQQ!;w`Νdgg3k֥:/'NdݺOtt\>t̤;ܝkgGQVVPCdy=Gn[,ɶGDDn=2z)˗c|9vk#m9/\p> ︃rv`=< ٲe Og0v{F%**bc;#mΘ1z͛7s!]%88>}ߴ>}|dK|Ǐw/o~ƌ=EwAzik;饔NbAK|TTLH}o=>:UYzElA} SZ*hC y7ms7I] GzyQeli9k7,f+MM+O _}JjrU9% /5K/H][.*hxmj!X{ ݜdm ص-nL+!z襕NS """'`^ հ%5b;~vK%` L]o!gP_.h[8Q[6$RdMoJ@^fmb~8h0]5\|-!;ۉnu"""ߟm#>+escQʴi6-(uZnso @=fSV9gת B~mKiC?zd#̦[qD`* 륖Nnx6mG`8 /-3n4{4EDDN=d7/d> |9n`ZE~N[cr_1u kn9mnQzRV1g2yɤ5jcnKڇ3lqz] $JN'bKKksA{i\°X,DDD0[xj^Άc(NV.vbIZ؛α3uj6-"i=|V2th>ݺ^#WhxSKQVIW@6-lϦEeGᦽFuIɵd;IyH; K*fouvϞ=71&& 6tp۶m$OBK/\7w%KQ{o\Is%w}nʫ">>+FAs:1.vOdT4>_0M,""E⮩An<˘ѹU[Q7mJn]7n%=brf)c+c٢+ [ʩ|>܇7b'D8iXIqG\^Æ'?5kְg|e-z+_Yt],ysoR;ʂ ?ۻg/v`SO2_M?s߽q7̺R.K?ۻ;v)P{ۯ%ގl6w#d7~$SD^ƍ}ٴ)0H%TM{u¦M]IOEn:ԆQV1g҇zmޯpokSx6_{?3fL',,M,""lYhX^QI"ug=Vuhʲ" $דIG }=CZn$4|XWL'Ǔ#g;,'6mE9[:E{hOv˗?n||)⊺e, B5RƎÓO>h{_0Z幛{8mڏ)Sr!yu_r ><w kzOSz"g3gSOЦԗmܗ\{%_O,ԅ4ٵRWFYVb I%A1`0τDf WSiiˀ]d:^Bwci+x}6rGxƧ}9vt0elelelmMr5Hxk[OfSph~ى1$Q6n[>fGX#LNExd.$!/泍ޟ@j{^@`p IQq,Zxiy?[21]ѫb&z5 .,ӏXM=d-c,(2 pp|^nk;iL7ًe-J[[D[L%t#rRaYyk8-Bf M;zac X@)Fg<73 F2,KO`'a!ٙ}Ci@ != %-I0_T";8a;==@ϵ=aHxz{louDDEḻGٻg7ֶl&,4нgSYMc!7<̙3=أ|\;{ӻO F'F~~>NUbRf$8ܷFL\RW\wWS`Ġb>`\g4k]>r$_Nn?~e5NNhOm;F^ǘ1#[#ش)G$W1x")׹%PVIm!䮬a23/!J~$'  7$3Xjsz&;(vU˦MddU/FU+g9X*bF;--6H~Q}\ ɔ0?JE)vI#DP_ĮF |KAq!^d e},b)8Y9e(@ 1l!d qRH&)cxh&`"Ѥ!3A*Fo9uFm0 -mv60G39~+l|ҧ9X6oĜj]55dg}6&MDX, ì,>iB+ (,\~9/lok5\3gW\qEݖ~wzY%%QPL``163HH4O@xz)l__#qGR!2?Q`q3a5lx8D*YaI8uAΑÔfd&g+C/g+ҾVEs7hzs'Qtg S)a4Y T ؑC;C¨Qp4c륥Q?q*fKRQVJb@O L2m}GbpËҴG6H&eIDD1чq$YHQL/0`o0ƈ՞ IЅ ~ f+RaF5 'dL!kzOn 7O?F0 ٩O q]v\8ILL,!!:"1]w5`6Ma$OBb˦6_/wH2D(Q>\̹y s~dG`X}[ ~6?tTRKLxAx8++n&rd+fL`#2X1cA^v7 &PO2O}8\ۍLA,QBP7&1&k . ˍIT:*z.X}|M6rqb!Σ--t)֯r <,ykB ̑P<(LYP*135k NF,~T(c(c+c|\~^ҁ/֦h>^t"0 n|%b QMW`;VR &*qH)xEUq$RJipN%lce%^$QBA` 銓2̘p*YA4' jCijb CQ^NraX:-Aթ_&DԤҌ'rI" @ ݸS~IAf1V'O~xƍwDz"!TIc8a_?K71.r8֕Tm%&">mSIj26¯~ԕ^Iy\NJ{( ^R㹷z-c}=. J(C;>g M+ @q)Nj,Vg^~Slh:!! wLvx:EC=/(8X0 q-O^՝ Tf氃\->=9y8`Ǎ@60;QW>7# (Li^`0 +R +g=&yM(p7YHkT9nzWw#DAFAVr{%!Ї=MFJp^aaW,C'TlQ槓5sׅÑ7v=P6 ч@F!6(8|Cypv$sWee 2nI$l=u)9XTQiQԵaByM F@s`~ 쭠>/13X6ϲOиSK"`{!4Fq+1bo4ZV$ܳ7񬷰~ہ-y =J(h'R_WA[]V@Da_D>ĉ0k'01Xíʥr*|3n+"YvOB sBN^C!o˷p2N|#@^Cenab@:dBtɧSK,w,ǚ|+T/9a?wz2q?0zYĸ~ѣ7F{6oX[|`l`@FRWxqv} 6oz[Dx7\cv?b0zYgaHi\yOC2g?}1t2btmooۓ"++aJ¯wƕMA]T-|9<;`oBozتT@_|?˱Q xNɄ  @:JG,mC'S `+ͻLFQzW Bjlu HdHCkmy5"h[7i$ U"yy/2HDE BxAc2u 0i}@Ρ IDAT+$Ih#1Us 9/kc0k#q|=C;(~ JV(@^ɓ'3y( !Cz_WE ԫbgѣ ]K.ts!є4W]]y^A tLW878%apl›03'p.`3Fu ݺU^rvp'fĄ'D' &]7Jvkn޶ʫnn,YVєd2fIͯ U0)g ƙ$@8F$‰,H uЦXV( Uc[ p`B&+9HGbWĵWz9=\;Vw$$( c+┾鞄Ā&`&UT҄/@b>s& hc}Ӗ;##fđ X8ô֖_tFu{9e2i=PpwwgÆ 2ɓ'{qVXqްaf 74geEA|~~Ʋe]Fu slvB =ӝê$$F/s ,IS+>w CR P 3\L]u3u !'YY eY+ɴmsDk2zco`Ϝ<~^*O^W9ќG!ȐcB>@"7q : 8q &oBY~cZ-=kohV`R.Z,cmsP&T%䐃Δ>V%3 ˘<9Ca䐃GLM=غsP(V5ϭkjjb[ ]H^|č<D7܎̚ܭm7Q{74HG$&rm_p+rP;0}| F$sy rM:DW&#e0i2đشߡ u=|p"c(A[ihnnn[oJ||J[Sw&u4Д L@{CcH?'c3l&r8[`?d}.(,n^ vtr) Ujl F]lB\O"s&KLوgrk٭GJlBbJB)84E 똶"ls־du7h:db7 "Nꦀ?r.D_/$;$˵KKs5#'"P'mwp37WW֮Y/g___%F(̄DnX'H%fهߚAMx 4%95)҈ȕ&r~y盒ؕ@Sa.I= ?ARp0+&ֻ.sH%)G[0q:&c^F3)g=Iu >\Nħ c:tTۜAw#̏0Ifد/O\ِB,<08DW):sDJ8e8>ytc+c40Z\wnUOV%dC.ͷv!6 t@%ByU=GĐj.Vs_`S {$]#8Q[e#v"cm'jyCw*XzCF +t1-M^l[.A=:'CGg{r&=cdUa+ UjlBc,0iɒGo bmK&Fۖ i ɣ#f;qt7M?MQdX^y)^,cѬiq2q׶7ێ8"#q&Km C+Ddoο 8 "} i YRPvC)žB"R+k@@#̦+zBHwVJe#vwJæ f:0;v&ӄrXd+%LcDl@rNa&y%pqi[ai8NL,-dҰDs"rjr9,0ټ;-;0lC8VZ4RyIqX&4Ҩ˚ -\a@j8s'MD> 5 q@Ki&<) UP(9$֣3 !z

JKl3ޗTw&= 0G"D!B7""sc`5"#BglCz@;<hSOԶ p'Dd,H8AE\HH%"j'jVkۘ G\s9ntېHĵ}Eڊߺ.%.$\H\7xpuiߝ?+[ 1;—R`#' |bE:.^us+1x74&m,e2`={^lOWOXBHY-. s.q tD`/VNukJr3^fQSՉ6'<3.MI#1phf5,?ngRoFL[2bM^@ KkBP(Tjl⯌ q2DGD$$/Cr!bm$D.F[v"dʝ}H`D@v,HV:,d90lS>+qG@>$ZĒ1}'kbC۵7 %HԖG-$Dv4zD1(A[=9O9@3c`s1]Ϊy'O֟ g4'ۡɪL]8?wYy>g8FbmP-vnݟc~))l_`ᆿġkuic:'mf~G@n*_Ʉ*͡/LňBsc>ؙDYŌs>fˏ#OSe1V\W3 <0RJo!yFJ]OaS! BتV(_ADg!p{$~d>aD6mDb@: `m7 L@\مq 2DءG/M=: GH^v s}$i˵#$i4~4A\HA2kŏg NNNSB3oWmSWWW(r >$$bp j{vȢH8yb{;[Ǹ9^+Rܴ 䵭#7e}ÉH|4 1f 6g8_}HkZbc3frEEK^2juFN@7Vϐ=gnÁ.d-> p*0⌙pYC!s~*$X4H[FtQ(~%TP[P"Y!1 DD 9$qS"q!6`xqFg#sXӐ!%g 颍w"CdoDhUt""q(!P]{:I@{V:k7zMrh+~ ?Yvpt$0ٗiJA+OG,? wl@k\2s6@.8K gf^oB'_?q tSܳȑ¤UO}u%[ `P@<$͉lXz}sޓ1y f=:%7tHmI@u&9''QiԘaN>uVv} VıHB3g)WN{5'f0k5?;{ 1 XM*rDqmQ5BjlUc+N#3bqjBs9sS\$:MwA{!K "lj~D}D@$z } xSG .TNU6P@3z3cH$ ;8"vv, KE0"T#"D$^Ł.wmWWH载i!LPZWX_߀ #9^Z탃+3Xk$K«Y3nN([m">fpY>qF$YOL2Giz=$o|`ZsyE97eM(- zNX rLInQOMVSowCI,\O18xY~מ?033 @0ش(%sla;pXI F^|-=|ϊXEN{eZF Ř:tʴH?VLmGKV^x0X|@ي_Uc+V5B1G;Gd98 ɡʹmˑȍǀ,Y=.#hOs& qbޣj$/8-G"JRJ*lb(z63 xNDl/F"H B|S8_ @27yr m nVX~BXp\]\پK޷G]] ŏU|W9 4`*˿щ]pϿ9׼ѳ'n?y ><'c%o#ȝwLUBqM$f2pgS$fƌrLb-, <PH3Lo{$3E\H QQ}|XtV 4{p$[㱱d'Oj2c5Ug%0 -DqR!,L |QγKL8ع8W:?BE2 38Lh;G]y(6Y1݈cI\0מ'p ͸;gcՓ[P5?'f<4"mDDn87#M]HG=cG)|1iИ<4h8?AIq<@!a<oNjutv@$ - D3< -/DuHHiyqdjubZ혁=ƦrG88P__OatGGGu?TWWG HAtڕ$JKJF2hӥk|}qoG)0j$@Vxg7o*k$b"_FzpMތjV75t 1ق/g0ocBd )ؚ^rV* kg7D zN޹ ~{oBg%JbiCS0n`|}*zq:kiѓLvფ'`p߼Crm) f37Lۂk cO gt pXV^MgĶS"'ژ2RMhձFqQ5BjlUc+N ګ<@\΀#D*O$z""q_!7!1&cftA3"DDItxC8r"x qGד[7HnژS<$q "]"l'")wvwiGDDoQxUUU9JP(;Jpp0tZ.7i?p owuԉ=99Ρyq&NØ7y,y_~ ]bz"/_QԃiLwYN(N|#K-լ&dӗ$0بpk3MsfL@!=# R|t722z95&wyl9LZov6XLJV[P5?f1HÓ;gcD=դeHS6L@D#]H.HSR`qB'$$iJ(LٮԾ!H=5ghc7ي _ 'g<]p˳?399!Cu6^+Wmsgϳooϒ%o2Ʊz7gϩ@g#vLkx҉10 zq2Qɏ q{[jm-8<pZh`ú^s`L",f71reAy81%‘29@DD56DׄТ"@ە`BP6xجf$ } ,UFOz2ozզ4) BتV( qg )=G[~1GH{wt!"f7fK#iѼq:O@G!Bw Hf$q?@>]sȼ>kqaFAі  !+h3 O"MH8>ݤ%O@ AT/7opppqxvY3ta=:FEmm 6ė#tD@{A%?Lcѝp7ǸUPxr` ȄlW?myPz ^>Dc#c+p،83+A'jg ƽc7xef[J ֌`dxqJ/;Ϸ;rړ뫜pbcj,;2lh BP5 H⪰mFfCq7Y[ӎ { p"G\e@}"GA!qEOc.c=QdkhoCCAۆč}HLHFfę izYdvqyBKy(A[P! jANN+˪1~74Ƣb>3Ξ=˙3q @t: 1qFuU.Eg(0]f,cz'uL*dQHsdzc Zu&VՊωZR+Ya43*}{` }`}DMxR~j@C\  f3]Qtd*%hIfxn@&>lE|ah   :F@z TAhW}7A3 I s'9GP(V5Bج}D p胈Hӈhm;X[<~.>E @cQe=qW'!t6nHvZ.N<џoxq/֎]vO"v+gҧwƏ#3g0n9ƷN* E>pÎt9[ӔzTRb(>[ cLC4H/(/yL$c12ĜaDI0 FRSy0@,̡ZUf'h&=fba'@K͛SZ{ט,ъt.:qc-`>ťh(kl搸\2A q/19aH6ɏ9ڏU+ B LDr,Tq4bކD<jv"E\瀇eۑ8:DWtm}~=iٙq0^D''"$`6)D׹"f?C"L:X6"*7(ehA;]\\]cǎQӼy5?w#ւ+/=gq ůOH˖,~u!_9>/Ӣ5rm"O?l%6~uI6WP{}Vgtn$>[N!ƾO'{*p҅0DD,df ͚o٘~;'z4ēhfl1b2e~# '*mŵD B QV>5Hn_ WrӑFT$wqbB\Ǒh\ݑ .0*A E)"t{"Hl퓠8.9ea7N$+Θ`N>h=t#n7;wr0mCA1Ͱ/uZ3JA LC+ ŵF B ş68mHCW\5G4=i$B2;!#K3HFv̥XGH\Il1 z"\f @2}r=Ҡ#Ҙ"7ơӶZy/"''ZqɮP~vرcyv?y?(q;SP(?2;k6VоGS&Nn,bN8 U)nVȘ1p]$n7gfq] =}2,7^$i@"jm8ǙirI r՛& 5s{JǑ93q7Ǝ .Q0TUku?ۄ*nY%d,I8 : < 3rr¯5|9ʕP5BP( Xm IA$DN^F"?^$+ɰ>yz Ҁeܷh+B+(-ˢv["p9Ϸg;@ Tk(4.OGƦ>ڶ8F UgHm:ZW 5r3\VuڵĞ<4_Fǀe ~(~T>t݈S܂f&6~Aqvvfl߱;ǎCf;wߘٳ]x͸3[=Q BCb@ھRuVƖc@Pfyf/BӠ8bNK s},=Sam̋I66T@ۊ8`ORlq+t1 ep'fkS Ȫ{I/m\BU1vv^_ٖ!,r1@SgZz:WePV恓΋ ɀŐi[ypLÞFeA8}Hrʁ;B= 4U'M-[7)~TjlBPq"`7P8A"="1"&)p؂Ⓛ E{]8CvH4H0B<51ϓq "y0BHV h"ě<868Zd1C\2(~:`B_>N"%9m{(,,$ ŕNNNY_ϫN@@@z BĤMl~r=mBBn$g1m391{2Nꋫk(ixx{ޛVzWmNt7s |;тp1H:tɷAv3,z\oMMg>_ IfO.}LqMرYF+)>SG=S_-ޘK <ࠇIDVG[rmA~%+)^+f:y;cPRR^@umW( 3x;mIO^;MPfzeYc+cBInx#6ŵ e* A8NmǺ386q3G+Tz0c-OZx;ڜ$W>;{i.~Omr9Ǿ0r8:|'uKjxY68`z?D쨝 "_B2<ڲcڵ XaecI3]l̈û1 GDmŏg [n&v{Wxѫiӆ_NNNX m~#H;{0>SVYÎ~9ƌ͚kKPOBP(2~C_hKaٰ+ Gj"f bz;L} q"%Mm:HN@k!Q%n3H?EVRԁ:eh0&bc| <?ǟLHN4mm n|GQto9ugp߽3^a떭БΝ;amm*/HMM*֌4x޻/W2y;.| <ĵ,iEH>`60"!=MIJ Ͻ a?_,V5Bjl⯉Q{E{H$} Vںk5D\n/#qZ!5}44>sNZNE2G!5ۈ(^n{5\FDK@R/EڸWc R>ı> S(;vhIaÆ2l|r+/u[$5w=<]*xE@p(lYaXA Yrr9C(y\=M6N&(o8'NBO4`s^#ܛVgveǞ݀L|l"!4m|%j+[u ~M5O>{n|tE]/Dmm-E:Eۻ(PR%@!~BY`V`w4J36W Tpd_1ӕ>qvys* c f51E$Lty3}6kx bP Ҿ' fW?&طn+;㟟\eS3mUʹӰ'Or)]ImCЂK&^㡽_; x1u |Ǭr Uc+ Uc+UK8 IDATaH#HɡDG?'D>M'!vm}ш" i<7%}[|Qx̖ B=^@"n H{D?==I;quюR:p3d]?%h+%hN}^6˗Թ3-P]'=6+++t:k?_pX<ˣ:o ۿg$kX,O4,WY*o.)e2IEJ\zL0AG+H1f C - m2#lo+ =p͔aNnc =>\%WZp F\_iI+kP♀X{ZB"طNyBPf*BP5BjlUc+ɘ:7r$(o@`mM18qd;" "dXfE"FN-ҼK_JًsI"n YgAD/ ֈs:=/e<"XW#"Cژ)~v zjf w Q)gdn6Tb.fA***^>}J՝[kkpppPoFVn`Yݲ VVTVV|4=?oO^ɀu$cdśZک \Cv?M`O+<(:X(xbщ&'G\ 6-$KX`]X;Q|n 'ǾG_'[?;v 7NMmkBl46Er9G0WL%IAhqXkL-|[!TJY8R DЋ2Ťn#şUjlzdc߃8mHF*Ԩu%"t/Eو`"_ Ē bxyҊKLc! M@<"7@ !&$xCi9G@\^$e^@1A1VRԑ,hq6Ct/wicؠiٲ[6F]p*d\?]h/FM8KΟb۠v=p'Xk^E!lJMD!i<\qBf4 w?gR+$a4V3P |IQB9EJzw]Iٸ Gxs2,M6:tkA>wU-  GK7X!5,D0`&Z)Uk/]|Jfb3CIR+?Uc[ Uc+v)ɓ> 耹GhzH$GS5IE\d(<=7g #s ω8Y 4"I_#M%lڱ{s!`=81!"-"oCHeDFPv"Ȼ[HMvUe%.gn_U}oxf UUU?gb]xxyMee5Q?򲠔>s]f[ɍh}7ÒYg;АGg-1"%dxJ&zR|,E/2 ,.sd $6pxn(ЊNRLZӔ:9E%Pxc/~m7|+cЪ$H2KKg!NfHP1wCr,V[P(Zt ^8u#BQ٣/8L׶+&#vD7؊DA@'!&JDpv/q sȇ(R-K|Dߊċ!D Hw*"w@rO8#M.ۣ(okkjx1oo]\UTa4 ` X[[:TTTVVV8Ar( SC'(p< iPdAp! NDz-|#O<öӏSb؁88,R3'P{:]Dtp/VGDh^imxPǏnS`nj6Dgnd;8OG8Gk؛ѩ@=:AX:I&^- ЮA[]MCir=FI5Cj(+̤Řzo0F^4m ٬YsYݩdaA Tu)xTP5BP0h{M{kD#oSDD2G>ۻD$"j{"9{;ɯD27s3tl8=$0E\HSH=^NcnHI(MRs"D2iǻ [""$~E ڊ3ccϻ!mm5+Lj%;nS( 8X] Z@9ߋ^ęQ#,i`-Ր{ f]+BGb d%TBW>Cx}g۷$qFJJ|rVvZLD5X5{ZІ$ R|]!f(8ko@bXH: (!L+o‹Fr`3y9ij')tDGJoLZ/Le>gzeeQL> YYʝP5UP(̈{ٝl]ȌHOi4g?db{"q&'\l'!Umw!5ڳ03!ZD`n874"Q$W+a2ž]x DHR|E=EJ6(~|~xn6Yv-cxfƀhm۷3v8VZI;>K.ӫm ʇ|pGcnܸIѯ_?Zƞ^)ȿn6oNjgw२5O.hb|SAVcHqYY.( |$Xosljw:wn^~v/;;O !=,b7fzxS+oo/%"$:CJU-*SSZC=6|vRB$7.S4}֊t=G wfݠlNJ.@jj/`%&-򀚮P(TjlUc+ !F{#"u7oy?q/ ! @D$D\ѻ q^4##"\'{x!z YdSfMkDDgw 0iswP$ % ͯ3qs֎)"~Վ'!. Ŭn#EV@Wg L^f̘_u%Ky,]U{| /xSH'^1㎶ы?'zP("^Q`pϧ("8& Mo0?=zRҎZy/5Sޙ&Auk#Aヨg]`4n>mX2Op i&B1| f" x:6]H ZK=S@/eg-tǏo0?''{ryo_"-a pfeC:,QZ6'P &NN3Ώ^ o<1z<;IP[ BqaH\D= z4}!Q#C1/0q]?U .ǣX9Q툸B3 xHe5쾊D#&]=xD_{vHZ`)"dww#n5]#ym0V(rh+Dmm:rƎy 凵khۜp!:t"77 Y\P3'?Aw~UUV7BU\E2s9YMqaYI;G6!0.O9q]G^)P$.0-ɔepaUWZګ:_r5~jBq5B'iTL<k+h *vuPby{`;L"uiF2J{™>C~~%'ѱc&XѻH /b [ .8oݚFH _q9K.ifR(V5BP48,E4VjyRsӴ*spiʵtD7"XGo!#F (p q_끩4&X#"h7DD n ~D6yA%݀-xø9^tBIFu)rh+X,Ϟ=s1}t&O\-_QpppѣYlm:m>_/GMC_?FMaa݊q;;;jjnN17f ~o Wv  ݺv (4ŧACźێỘhIlܸQl ߀^ #I=i.")NE|ol2VVTn@Es"yKW1,ԗf*ҡK9MS;WfE"/zA͌h[8uC 2W ivkD0Spz2 ̋?><]&02lv] + & Ct7 Kp=9{$B%-ͤP(TjlUc+$"N띈ixBD`b yL|0.".g[DT6=ei1⪞O-fƓ-!b(yC\F$ۺ)v׎>(7y "$9H;"/E%$^Qۈ3/ BBQغu+[nqql}!++ rJzO?]Yb%>8DZ|Ŋ;Jy=cԨQlٲ.߲e F>1:… =LfΜs̩9m߱6m @ӦM gm߾#F`ggضu/UOxnc{RRRxXyZh- d-?;pssu֭[ٳg}9pqyi8^z_` ܘXя82jDžtbXLE"Nccn71Ylwvs垨 ML\t>Lb5#c IFC85z=W^ŅRg5b^>7KLw~i;/OO~a=^-Gʩ lmmocŗs:v ˵ݶm;<7ZZh7^SH  hl rU* $PB yń䅐ȏ$~)f3`4R*/!lC5+3.avqxSA6L:{( v[=iYhq1q@ru6;7q:fUfg4%VA7b"|)..IL߾ᤝ>͵kX|~inYv666xxSTaa5 yͧp$d}˞yn*~URO)Sx%vtLUh+P .B iI7\Ѱ' {_Y}`Gc֦]exs># ח2RN-ʷF~SI8@UR="&=iΑ#Ġ g;rن8zsg!ALS|<}OWn8Y(?Ʀ\n$BjlUc[ D}膈;tA# hĒ܏]ivƷCHV>l8 jz$rĀƓ1"EMz֙ڏk1?z!l;m"M) 0O .HHVBQC[Q'jk >VZرؾ};Z:666T9Q&LpT>olذ[6e}bd-:W_qz &''ޜĈIcǎ#,, GGG|s&?yf|gw4/m8syac睨\ǯTd6.:p$hd$ǟS<ߒ S½ڱ={fWGP[تV(B.BDČFD0 r"nB!sG?M~ <<33D\sZ̺0Q%"f#|dz#uS!*c!Y y Gktqg bS@6A-mIvR%h+\mj\ Sq+++vg֛ڵ_n`kkK+g۷g?nLU̽#xb۶bwt>vONƍ9?x|WX]HHmcogp40VVV<[X~lFsd G1g׫nF}g_21  I Wr4)bcJQAA )fyek:dxĊ՘CI.{_= Uc I= s<]D?0" fHѓGvP̵̂|olB`",$l^{5NP 9Ѐ \6'oH&]cVL!8ƃ.z#G(Ο0s@mcx_(3Z<[ƌ+z5;GP[تV(阁hu"N>#"Hw5ƞmCۦ1`ĊkznKѤ'~Fj)HI54" .34K{8N,Pg,뼦OBp L;U@$-Ҥy L9|qmEPn6ܡMos'81`;Hm-jz777,R\\)++Vu P N-g /Q|ى _ۡb78&Cx/ $ ;t.3쮇9wpz<2Æ,8R-3KþWIK2?@ Mߴ~  :~)&ف `Z)"R8#IbNLm0^=Ka <=8Y+NeIE1%u:t:t:u( Uc[ B0#O菵{?">HF!"E}pM?adoAw @}D>˶:Q@D?8ěMV9CؾvH 8iHek zHpDSzev=*Hq(A[Qbb{nl޲#FƲO3 mll(((C]D0rqXc%Zy>>P_t0)p5Se`=`KR]ls{.;^櫭^Pq(I:pti5ba 1e0~8M$]p҅SO`(Y]Bulܸ!.S%"ÊX8pٗI‰r3]Ѧd"d";:>$"+XXZ3 B Uc[# !o-CmF"?LH|G&q Z H2D6v"k눈z~u.nZDґDڳy,H$E!u?">Hđ&%;s${LC?̽wv"PJVԱb sB:2^ԍesb3:o, ]rL HaL,f;͘ڵe^GB0wo3{G2 \l֜M5mol)@31-gq L0 =9|`.>#p, !XjuǭެY4a' JpOK1jnQO-n% k׎#oDCs"?X (ʸナ՚e67`oyO6Lyxc.# 0lC]Hzb;mۂ?>  kBjlUP܂;Dө#"LoB: nD,sg3uy!ys;+eDш8W&)%X.Nđ @Dl/D`kD`g؋׶rg+%h+VkS# B7 isxG؟| ?3}lJ(/&G nOmBYyY/i8D7mqp2c"4ɡ%o]oSe[e~@pC Y ~]IK a= hq |Hi'cDF Hȩ|X~ /ͦw g:ҢY HMUBP5BP(nDŽ7H^lXU$~?.Z d ݁ !{j܆yBD}Rs/⠾R.Bw.=x7"VDӎi""խG1{}]~8[ĨuSHLD` % #N4BCr6nUvLaz "dD\ٶ:mS~"Fܲ\ ڊ;7 V4hА YOO+̿!P(f^&kEk$g;ܓ@y^K2:z[ _s O & =ds%q~!,sQf8;&Gs'm@gWh18ߏ~t{ muG 535;؞DOO?سyvL>36v.yZ9 ++vgq#%;cۭV`Yf3@G:ԑ>&\]n1芌pTS dQ|I S&ֲTA֧&ttA9E<a(p56&XNزZWo`G3\'qO9.,f||vm8p "Dz )V5 ωV[zN(,"l'ː|Ꚉ0\x!8E  @\Cm@+]$ĄvH&pbMH|I'}<6ҠvVe <[isFDh]DH ڤ!m"GllY派 N*k*++)++SBP%2qXъ03Y3d j0[Cs|24 3(.ns%5l0B> D!|;Y|pZ3>fP)L!ۚ11h-\QCshg7dǁ ڏghé gQ`>OHfr2dLisM62peU{Hl,ض ! z!<ܢʝ;[jlBsUfgb?DsǶ+sx"Ջ8 ČGGF@VWiӪ) ;Ub;A!)rxiY lCE'Cu>8Ԯu9"WGݯAm 7SwMC&({J8P1qz4КDQ+4DžHpĕ " E\BsH.7"d !#"ts`6F[mQzDm[km^ Mԣ &*z<_ܜt5ՍPiNs򱡈 bc;B @=gW!͔ƽOy7%*Li-7J@79d3ӎRHĿڣ m-qAolM+Xc^W bĸ7f,M8JK|(bu{H* 9@NaNL'GH'֥iΏ5&rx=DPFM2#e?5jS`F8a2f u`ZGl%h+V[jlOp` 0 |*} Ek ~#쇈H@b /mKP[!Dlv@VcvsR㇈NHCZE6\ e 8pTOiQ=Jk !"#b(wzzyA&(UUUr8m T7D&3լ nbăG)Wq1UR#Λ+Y\08ė~rXo^`J3|zћ8T}mO{|RJ9ޞ~&?Jb,<ǏEo(!K]DQF8!d&'m0d6Yңby8ڑiH%bjU2/[|GQXH+'C&VS6%Ӄf+c@0iV,&OGG).V[jlEi~!.]HC"[ZR{5D8mD nDS [#xMm<s|qCjZ}nѪ3H GO݇D|#/E)#2W!n꧸-P(w'sՕJtK_3+V,aN(|O9~< /KsJ IDATs0Jϒ咽&N8t(EMwfDjX$p=QF$,$ .׊z)¿Ae<4g7؂Ղ|ⱄ>sI܀,C&{C|ZFC`B#GiO{t(Oƅ`,IaV%h+ BتV(n&qRluZD( ɍ>s~A3XdmDjmH 6Eӧ1hM֎ h؂zr 4q*ζЮ]]ď4Ӿf&0 qc;#qd7@O#%fi:d+ ]y˖ [Ɔ6kg7ll_k66|DL%D2`$oNPPJ!. 5I茁L%\4`&b˔́9I3ё+HJ+EG`(nEH IhP ?Ƞ^+.ࠇ#YnEאt˳X2>M}ik:ȼQXw#5}q[R\EV=!dMŒeƞ"q#(RP( Uc[ƌoP$`4| 苈p ҈Qt# Hq< R_ەO?2qٻO|#W7} Iƹ"ZךJW+5{|:1[lǞaA0Oie{.XDM6ӃR]S#{хgؽ‰dcn nՊ$kY:4pz| R_R1H4RYƑmx+UL$ʂ4P( A< S; +#وH<KkWaD[' $ybDȎG$ңɽS5kJ0Q8\iGQ#(Y=HJdxFbde6$ĂjMvL1P JVijETUq`gg'[[[*++ՍP D*9>9QE)pR\Fv,x#D+.k]ѨSqcL!jCBaB`:U|%D| V-ZY؝4[nb$:LypO.w(& +gqPV.F@]qkX4zA+t.)G+u<LJpy͠e tJV(V[ /cq$fa@&ES88"Aھ3܂ $`tCq$c"LjUVph$= R.kۋa= j=y#kdu$C{"oLqVQU))//'y=B^^!YTtE˖4PPI%y*QP YPN)Coө罔]ϻlM d(?$m B@o v9li*3a= 0B9'CQ%;[ț3M;{:i MJտaO-AcTFHS&5 bZ9gޖD9#.ӆn.L<=!}b3kGH ϠcBn\GVs\`Bjl /3"E\a{ECL@}$CFw?"|#1!hc,mK &t/w"btV+#"HƷqޠ݃gg$$*6N,8"Gh}=JVJV騬K$%W^444NݘC ;oގ bBY8AȲ!89&<#f:a<>{ x f0,O߉kqXh'LqD`ook<x|d7,>OWV,=OZvyLK\"s F/&::U)IשyI䘲 <86 L{ %'N8~WI.`bM)@]sᢎB D;$-P B Uc+4kC2E\w)[}Fr"1$SUDĞEZ${ڄ[!DdܐN,4DȞB˴~do7 9]{g2^bim1)!nAƐO/h׫W666ѭ[7{=<==ڹO߿-%j׮>tchXݐ&Z`g@]PUoDl#8Q'6G=RtG@Bx)tԊ)&RJ'jyKÄZ' YH&^g%R/ݓ=Ek> Y90¸whsŃ+ +IhPlneg{Y$궊#5qzО'jSl$xN!Vd˜vʦ.I`t)M)7f5d L;y/jM~S I&9@JzyTjl ŭ|wv$"xo{K&+qq YӞK6nĉ eR!Bw!2 ^k_%i2< Xs\#qThW tkġ]R-^isM>=_ξq{7CR&w۶mV^۶msddd9p<ӧO+S} >S&Mƍo޽{'NPUE^^. {_PA,yPHJ7Ћr*,N\51Y x \MV/|mi<½-R?pbޮRY,; "b:,n9 Z!\UQc lp?^3Vl}a-,w_`lb36s<Ɵis.3v; =FWà"ʔv.P~&,D,k`xVUV[3cA"UjlUc+?FXԶwE\"很cDD|AEAHDX,@0Đ4 G끃G.cم+lVoGrGx69DlCWy7"hy|O!wЮ{{QFϨQnjpqF6lHÆ ӧի׾7LYjp})K*i_BP(zWW >>jTtiqL"-@}u0ʇ5'go }3Uf1g 4Ȃx6L(\|D^#0Tc2,"6d$mhԥ. m+3)rB)8B-qNkA%#\?(N;I˞\,4Ώc+\6òu$kŀl" $$Cp!y?ڂNMf ǫIAتV( Ouqa[XL Dp.Gmgq1 o pC.G/ ,afD@A;BD';#qu/李oՎ#. "!}(ĦH?~C'u+F]XXW_}ŠA}6k, ĩS5jfͺm„ ̚54L‹/_^#55_~7|e7ھ BPi>ÆCG7Ǖ&Ӕ0ӆN `t1=(]NI+Fod}ix/ݱta&r0tG{SH!96,b9>0+VRH]:!8}K41,1OZ,r*tk6EKЮq!WxDJe͐v|;$'C0H&c4gPD͆qQ$Uc[P(?F$^m纈i謽!x$B;6S{Dy$fd<qnsD^A@ͧL#{V[6"(zD\#"čxLDm@w$fĂ'p[Ƃ{ĉ,\Վ [[[۷Mh}_ֹsgiذ!!!! 8ˍC2u;TUU|bwmMӘ4#Ius +u &Ƒ֍g:_E4/rgi q8:Ϲ@?-=X#O!bX `ӟC|"ʠFTeҮ,IH+ִ֣QFC+YY RӖmq]X7xOt,"^J%>=ڭi*FkVoooVdgXBp2d<cDGF&iTUjl=0  AE{g=V 큈XP"@O`"TDvF2ADcHciHSy] Tb9awmޝRdaym[w\著=DP?44iu7 i" C~\wŭb>auݫW/nzG\#7:2~<䗽FC~<<888M@@oKNNK.=z˿7*Э[7S{|ll,GfYƥ5&v9h);9+;velEK).snic*vC!MHcpƙ E #)pzdM )dldr% Qѩuҩ.xfW%l `Ngʰ9Pa?È&ykf\!dPA3>eRP c4<к i..Φd ol''Rȕ!J"ݓ>W(h[تV5߇ čAqT[GY$ KWqRۿ<2BbA#QS5PߩD\,2<B5߃M݀@{D@3@!"Ǣ!"u$2F;G>ڽW(nW]XX|zBt:2xyyMii)^; IG;n;"62C?$gHoT|{BVpv=Ԋ1lsQ܄ X\G1LL(1[FتV5BPCkYK f0R貂/Z9V:‹ܯ0,˸"?}y:@G2ib:7jROrf#`uLf PALArivM~nlvl4#zm@WڵiSa 8޾]S!I!"fPQ5UjlUc+[LHFՎz$VD! g;QDn!w;-8v"pE3NrĎ)&S$\Bn~Qyw#{2"YڕHv[DFxQ݃@Njmz XAMl;Fg@*ـ,bfgWcGC޸3 f#x&ܧcJ%82yu_|$kV&iv MRaL0iFGҗ-g 5jǏ#{ȶ`}B4\JbMZط_`[[IWXȂNa9P[jlUc[Y *X #TA\ԟ PD lBZM-" z6݀ؑ>$ߺzm)XRO@ks[? .@my\F&6>!"*a4G(\ 2\ۦP 1sm۶75o5hР?S׾/ny_GUUYYY|7|O{G-Xt) ,˯;~81c0w\ƏOll,Ǐ'%%8ɤ3f?vӰWm۱s'_}{{{za֜w~v;# 6W 8@= FFAhǞ-j縔DG Nxa4Afw3qpb # ҔsyQffѶ)Xu?NEd~ͥK lR` IDAT1s>ܧx .^<4 dOw#h!dA@=1KXk ~{O1L|0 LB8Dy#1vC3,$af-XJ MMq~d]K'J`XS y,ܯgeOBF Uc[ ŭ8'#nhwm@Dnˀ#c{ "݁/$S=A:F w$ؑM3U;Uоħu2{}j DD,$ne-ʶ (#xomFh+n[u V^-@\8::ҴiSI&22>ׯQ#ׯ0?..5uƺuBrƙ[3$ cQ&05(VోNyj3-[xm~&NoGl+ =Υ u#ŕ:DўxaqwDi0a‹?VXgG͓ !;9=8Νa8hHxp<u;GӤP(V5UP"NDt8܇D$!.'pm<7r K]1ô "D<MfFml4q;s% xu!$~/8'!M h@2 bvv!"} X\~!"fEm[^ş*hF]aJ6l~y~ٸ_ovdggwoZqG1v# 6{6mD``}z/㯌;EŸQRR{͚7o+*Mcxzz땔mZx2/oO049TNHd0`&Sy\RɉX)qbf?h o4A|84=bO¸>vo,eD:G\4i#a8gjra\,>X=452QDϠ 1s:ҟb1>miDg4Jm6Pcu8ЀoǑq"plہJ}s|ym1`%,S dgK] 0 wÙ371) Uc[تV(n3R!B@YG\zDD#.F\"t+)ԪIH,H$d;Nj"jJgxğGr s|0\\-6$W{!#Q߀DSiiݗm*Oq;(A[񧮶nxp@.^>en*|OLW}ɦq\roaÆsɟҥsg6m̐ٶ}]vk.mDC0ң{=yyywFӜ)La˨嗈txÙXC^x²8CbvÝ<׋纑SGO9@: ۘ|E%ʺBe+:>$]m.^DN80|4y2чy7%nΥ4E6@GlFՁM4ϽȩX_D,"" "xqW!չݝ&!f`?ǝ0 hͧv\D^O1qaG#םm$fp CƏ &3]ծ"/ƴGيGE(6UTVݙpa/`>۷'RR(+/gɗK}=?w :&[;;8?"S_ƍع+֭gڴkۦO%.n#w$Xώwe4mւLĿQ(TRY2If~yI(hr!#2eEĿ YЀxexa0sX ӧ 'q&=y?,le;ΰ ާbҤ7. ;;;b..4y'Q>lɶ%_D8s&((,ttK"yqPQMxRZD^YjD0=`F/PFM:No=W7%2VO+BC6EqDOQ1L=AY+d݃. L>]AI8yѻ(LDZkq퀃+d#Mk]ltbI4OER{pz/ظVJؑ'7|xTlR'RF&e-dA.< VP@(%f+ Uc[P(~[D>  qwq" Br yTY~=ASoi}jc9ɸ.BqHT?PIb !9x!"i40"d"ڛkGk=x i""WcG\%x\x C{ԣ m@DޝOnN OOǞw kl,_fag=JHbꄿS>ƒuρcE{)É34ȳoؑie:Xc>Gǂh\ZIf6G.͇62)ԙ>aQFn)Dp} >je  >Y#й;m=ۻpd]e[Vd0|n\? |!,#FIĊFW#ԣi9;ĝr&Y&nTώBP5 9G6K9 ݁ z.A|-iDDZ`^W@$AevI dcCw} n]c.e5֑yZ]&v2K~46G㰷x-@jFf.>yf|N _:v}Lc4y8I驓ҚXqvs!t2]2w}#o#28rRFyc 4cQkPTLތbepZBqQ#x4K86,, QBjlUc+ (F;17qgG "v'ImEש}qeW ~bJ$c S2 k"Y&D?F E[{6PCs*2Re6IݐgA,;dß\\dVƂe>:JHw>7|M9gOQ(BP5BP(ncc̾,IL,]T%DQEU*mm}jJ颫hj( c'Cl,C"!$}>B[ʯ<9|q׼ވ0 C@A"eP_E9H:o#^CInFD0D^ EK^H RN `/"_DӁ:a^ѻ+9p&jc=wCt~vO=>ߘGk0gv[WgIxlmmbggn R[[ mF/01yrz,TóBP])uͥsRʫHM@}xy.Ҩ1Y&VR՗ J suxtՖݴNcK!=" f %Ւϐ'R(Dp x.-Fݜ|m'TEvOrcӽcƵQvi^RK VȆT.`$e&f|ie0Mh Xb# G]\\ٳ'>>>tLjP(`ֶk<#`!pqBW+H䈄;H;0-u?"D#!@0₮NсV`&bDd8HwvXkVsv"d<"V_q6jO m\z~qa>pO?pq혊^O~n.M|qቍ¢PnCѫăły 8ӞΜePCta6gPsȊad"1ٯu;Ҽ҈ iNa✤c͚o&NXؾQL'RÀQzXa՘p uf?ߢkh֡_u8`!i}w5IJ+in8LKORj20DzlGtć|N ':ʽtƀ #X3k4y@Q!@k. ܹ_ %%%,Y_~>][ y@+ 9s HNu7` nL$-k]cqD~#kȤqP@bJIc!Hdz$ADHFP CF ))*dhoF28xp5FCf=tZf+n۾(*w:ƵS$cNO=n⃭1zrs?|.]nBq _c*S)/JUybp?Gq'8LXHdbN'%щ : fRO⼗3QQCѥƄYqkIm#ΙɜO\N&jRaAQb#Ν"D=9,aٸ NCޛW3ej7.`MdһiBwNG<,bV6ɣka<:}U0`'J{%2JV߿?;w`տ(VڵW_5bڴitM|VklBÄą bl ~#B3"!O1, )8#"/Ztl ܃NHvfm_?vD\D Ysy Hww$j""ʏG򱋐"֮Dp7k%ڽzMUBq=E!l7oʨ^tG/q$yS>";su`P=#tflF_K7wq;ckg?:vEEބJ͗;;to//]M갵UN-\0S1`̶$QE1%D'jKxr` " ˘ڃa3 )S 3f)9?gY.$Q]΅ru;eR4#.-GعzҲ=\ݜXW 8BP;?r%׭$fu^1Rr2Y+wsLI$Ee苅scV]@7o;No9?^N à7L^yQ߿?WEfWpppdٳxxx2vX@C̙G}Dvv61C~DfΜ/̾6rFPklVklV(+Z^@k, ECbD8GhkXĽ͟"_G+wD 1 !EcFZ9ڼ |#Rm.;@@2[jislAz@ۄdjP pG\g4rq{Ӌ9[^lF1a-={lk&F"8)l+ddπqbccPSS~agu34 ѹ7V7BqPF>?ġ_)0ĺeaRFA.2J5~L#37F(w^1P֗0~/O Ҍ Y$^OSm6kʹZʣ۰h:,{Whw..H4%2ͮ#!Vw4E8A V4Bq‹ &ݒI1@$ݓd} 3 lPYSNI=/?'$jl1\V\IdddYfSO1h ֭[+ h\p]v{nO΅ 8w\>ƌK/cߌ>[[+}^mz/;/%svQښBߓP:{L[Pkl`FQH$#-~ލDxL@SK]y4նAJT&$G;G\Ӂ ;=$`|7F0LBÐLPuG/O;v]6ڜ[hş~ڴAO Nn־ZLiDV #UzO~ t {ʫq#{lC IDAT+ͼ]OiE/sqzg݌>Ξ :wwBwKa)n "Gؘ 벫~G>Yȭ$f2ƾ8޾Ŵ[ \!S(nn tnQIɞJV},=GV1p$l4v1|mcBt(pql.fPylm; wIR`'t  <,pƝ\0H up JK!iv1 6cK1O[4w8I1iGB ,%h+\ pC Lضmcܹ7gٲe9sSNƍљ>>>:чBjPV̈q""=@k v@FH GR=tމHHp0xY$x )i8TX>!'!czѾ/S{v-eHQǓI$B)DYDxHHH.x8"+1[q#:Vޖpѡm8Y̡<6乿tQ??璊)ތ>nB_FE؅L?>Wwr"jŊ?I$֑} OO '˳O, [he_sTl_{ؘaND)L]k Bdjdk8CѧOƎSO=ŀ~SӸqcnh^7B O1 ncHnW! (DEbFR_1jڹaڄDTj鵗))ܸ )xɺk>|#"/"HJ#Ȟ]c6X^; Nz*nD;֙}{NfhG'a_SULߎ>?:_^oϻ>mP( `i aтuzP]UUe2p"hY",r ;i9o0eL$'-CN%xx1w$c#= e4 H`ߑ$&Ǜ,c(N0 :ZBLe*&/bp#q}>ow&rx(KXif/UѬY3 .xe#zN/_ ^XϕBsiş)f_ˤI(..ow9N=Xtok\JCP(bFrqH4 $fA`Ⴌ9C1{~E + )HEӻ8m{[^M>,ZGQ.A'\Oi63{}y?LkP\/Jɾov1G3l+c*"[҃),9?=2v"Us_k}(A[P(7cLfwYgV V·g|l` kOh9P-Ҙv}wxE0+](%9LQO]?r)G„:qx$l"ONo'=wupǝIMXħ|wGS܅F%p9>d:/Їn9<B0e @j ؝mKGaUuX-, ^Rݏ%2(y[oQ^. ӧOZlygW^ck{_gnF BP a^B̛7 |č$$>BbB? +b- 9qnmK00`;%ɰ6"B,Dt~/1 (,Y}E}:'1~ zU܀ڽ}{PTUHO>Y ^[~|&7|~ҿ=jƜYbCmCP(a4b%LH"d6j^QV hKjB|b+^2;DsÇ7|~~`(v7ڇBP(76 ">u?q$wA\+$$#M{MFD}k.""ùpoˈljaLm>D!{WD4߭ͫ"XnHxVw/pHk3Y7و~e=m@D>VX"9Q }Q[łGY-sDv'%ǿ}( B5 X E*+? vdZ@++abbpCbŞzJ.Zk"NSA0X. c42,;H+)[S%QsiGxU\*3=UCs +'n[[h22MKpg9ҝ<JL.q#Eޘ_jXlw|3P=*HJK ?^4lYi)l Kvݻ7~!=zCP( D4ӮYsu|)ZtD\i? 8GHG ";k\B%X[H4D$K9ġmDNE\ :)<9D|DhtqD~i~́heޯݳiP(}Q[Ŋf=|Cu3P( fĵ 1VHH?`􃉬ZgOj33ibht#x)rn&ַ"R0Ca{12K=|X(H;`%lNgu6/,rrK= /!{N0F͉ca@ygJ?՞R8܆&;DSq٘|䧐QOBӁaX@OO*s=3hP(h|M~iwCP( $:5km3vH/#"Zm}Gyvn3|gHvvp"oC P~8Q̧ G c$)"\8|6ǐ5x R5D_ԟkm_D qg bTQHōڷ\r> BvAnzVC73',OΤłCe%u 7`[FB{b蛲dxX1R|#weۤjCGm\ ;9l{pl.z^'XtyW/8cpos-ͣpkN>`W ]g(\兜8{R(M9#G}( BqhDl""n xD;G 1DB4DC!$$0yX[EbI (XL~J{]ݝh}t ;W3@D?gynA&TvmBP(n"FawBjj1Q5-0/99m6@"]`[5įp#o#c[ @̄bh?揗YKلjKdOem-GMp 3qaȄmGoꨣRل؍P'e _6]wᑉÚvt#Fj%=2ضX`f:Ra0}&,|^Zs$$@ZxHXDP( B\N4"ui ׼<.D5"nNy/"Dz! y "'@onwm|'*Br': ʐ[Dh>ew"Cr?AmwC@P({c}j^n+Aә}ԟBP(n[o>{iR`jRB#TQYiJf!sD|s; sewNZ\GMFvH8bzmwz|U4X4ˍ4e[xtKtb<) F /I9Om999_~ӻSo|FOl0$.;豲Ee ܃pZH"9Xy?Zv4T_N+Ƒڲ'Yk ʊ3&ܬ{9 B_ؽDp@"v C!=qN#8$jd'OĎ@D%@#$یD4BbIK:jײqsW v,A泴kVMQ\'( Bq{`A uTs< aXF'xG]Bpg*zFve j^g`G% І uY:9k[ETg2w"s-}ii(wZؼ kHjK!9A> cLvu3/v KgҾ;K1|AaLCYt"=c[JY_~!\O#l, ZM{~Br( JBPY - x[##/#b~!QDE\H,N_?D$OGDl$}OƌjH0xq (`q; 'gycC$NJhm>Gim QbPBP(V / exÃ2LqtR fP9 ŭ@ B31qg5H,|$qLwA\sC >vC\͑_ ##@D>3v$7ހ=y{H#rMę :k}]Bt7W$im4zڹz$՘ |Z_+~JV( 6B}Xgxx0[\LA#F:N`y!bgX,YY3g];/>Ԛz>)uI%ޢaa3֓ce1&WV l#7Dٚ_Sf꿠r9"сt ~m"C]zfp$0 E;I/Ȏ=MV4&eDVy?z3TPmBPI B9LM|fDdd#cRD(DgĮB :Zt$.I* 6/wDAh7ֿ30HJ RKg?L@wF&$q_;[q(A[P(o}d*VE\YFn;IL a.tM#"<_GbiL4ChBbi"5X Cd!gwð"z,ɗ1nz*aSUIS}a'Nfkwsc 6sBkz }4}!p =!J&iWEW`RjK }: g&3^> r H!D聸=~H+ 6xX'#yWYmh?mBP(n31 H"0n{qq3/cl~0{gCb )pp), $ "^ a롵R#\H%;L tPG+>L!E:I8;aC.[ʹ# xڢ& \_IR{"#V' `86䌬rT@&ϷwxZ22pX!QUs̝E3 dE&Q(n?ߘ߶}˄؟kyoꁪZJp0P(߄BޝH Ax~w#%c{9W< ؊_!!j"u#B|#=cx蠵HD܍3_FO!!n,a2_1D` ٗ? X{ +%h+ BqSv'eXZ6g7en5k}=Q-Tg0f!Cc 8cthTWښhmُqy6FT+h,r|ojiN?=SLh_ @PâEkbƷ8gf6&ls6.2+R:j3`ed^dcI(SA**\k-WϊBq+%_ц9+O_9׎`K捹?캠 BCDFHFt$R1m\k["wkqw4"4Gw"HG5%q~E 2 E"7jsۊ'fq`.!1#mlGBks>}^8-H>~ &08 ھQP} "Y~Z_WGE BPܦ<;P 9= m|L&X-e:sw)Χ+F`|gkL6rtnx1*JL{H" Kf4#*)q8Y (NNM<@֐ Kbb )L|tIޥG"}+>JoK-6Rnafb?(F~nn%gEURI!qsm_QU)^TJBP&"،# 4p/bF @&"/#="`WuGs4"7#ٶ }yE;~'#c#  " 2s`8"w@bL *ZnDxjoF"HʵkA0FPBP( a4C0CٛMdh(B#ߞK2ÿ)vmZ 94N$ֶX> Ye^E!v b2ܚ԰`UMt\lߏ l!G  V:8q[ V*a˸AZDF˜1)YDid_zS\5 <|#>Tq|vJJ`z)`x53ir 7t$HymP(nT?28rIβ̝|=yS0o7<{[jϛ҅e=ċ193 6"r w^L'qugbD~l?͈ si?͛2W3<](aKI.hhE5` {WsܜY<.HP(K;_["\ͬJ;?)xZ7 #j#čD'(Hv `~qM[1>- /##S2Dl D4l8 sv=VD̟Dr[#y *FE(n%h+ Bqq%o "f[0︓Ig9R #'|FALf,]}qcNah-=n"O IDATXH*O M ,DT/#P-)xOw _ "HޢC0L;~qLAQN!i RJ.= /ƛ}ء] tҮNTԈmBP(n3P=F;${ {iF99lb>ї+zVL^΂h#SLYG݄X",TEU҈ >&f/ [H{Z ˩$3ήkpH&;VHp{zWHYZLO]iwۄx2"9#H;} H"$ = 6Cvgx[+\x4t"xãPdkjo'̼RR/YydHK2TP5ޞHHIE5[ꚺ6*fwZ0g1@յl=EP~TCnHIy &FXt"ZLLdT( ŭ€aPDz E"[#HQd W3׬A{$"g Nj7e]VfU{!؎3w;-yBDNyW9xLI 8Ň!"m=R2 )HmFh$2 H@Bq(A[P(ۈhD5Y0ac_т,&}f%D+;0:plqԚ}#%kɵBSS"Sٽaz3FKMb}:NG݀j ;lG_g*"E\ɾaLUrg󹶟F./WymIY5@m쫨]שP([x}g% q*OG~8x [FkG<ww0"X/z#bEk>}*\>I fđ98]mKHq`$d2U~vm”#.+.$rqwrcAPW[KMm- vv٩m .Abm >&AP lƏZ~ϕwƓޗWMɢ7,tšTX"5Mpbyz9ͤ`B\fbyr]kz1;p.K.ŝ\poP"+?k)r GNMOt-)4]dI?UgG x ڂ]8x4]C NRrg}i@KBVzv[їK%K>z_ۦG;*jqtxIE ΎUg^6,PRW_:x] B0@$ #"qjVGȎNy/R2PčLCb?/"ECXT-ĭF\ӱ#qDW!.a9/E.D>`w擂DlѮ;)WDC\)@Kzl7Z5(TWWy"OokkKcƄmK MW(8-=. 0b&\ q~f)A\J`#3Dt1P"}2EJa( OFgm;eyyHO]Oһl3E.m\d@Y>҃[@fN@#_q/W˘VAb%,)&p^E6ĬD,q %NpQH{S-ޏJ w?x97 [A[ƍ8zܴ ֞&4iDnv9Z3$.1-p5o^=Cdνv +w'=o BǠ =@$(" Bĕ$%)v"@X^mA *]>tH "G E#_rHCFkcն$E89`mEkc$ IBDFyZ}\߃֒ñcG0`- - Tލ͛&P(?00Sc+0lIwGk+,';{3Kg~8L+Cyьf۲),Vϋ(&'!cVs ěJyi2X!N[ʘ eȁ#>PY2xMOL@.4&,pgH &M;hGG}ӖsPA%z)j(-`HxlEЮMjcꏳt^=@ MDm_|z@:5u?>hS[0S`Fgft݊1w5'9ʗ) 7e0mhk":7%f:wu"WT&Eٞd-h5BP6 ljU5W7 QWzvqCBb@"CD硈[H1Ȏڨv#T&21<%D~)Y#8m.;Xĥ8ڱ|\D~^M@ ڊyjjk9q8anyKpppUP8P(',jiv L x^D ÎB{<)w;y&PL~̑:9atx ^xc_7QN$k{f YpьhENes*񦉄RI{BGtycs!{&ױne""RJ2Eы9JSxQfH5]bj0[^ĀDi$qDA; $$aB$iA{YE**6UP\E]5| B d BHcȄdRHlꮫs|sy*فH?6ƹHF" qJG2(aN#MӍʹ4"N9Hb 3D<Dc[8$DvZƼG!nq\\45t^ &/~11Ҝw^QK[ g$Nsk3ő4&N 2 k}JkY\ ac#wM_>MFzÍm__&28ˁ ܾ*de0 (B Ell%l\̈T{,#1:Ϯ|$.!xǴbyDKj6?f=E6[JkI-{ "B\o;*L.}xg/.Ɔ ̒'9QXθHr/5j("yֿD+7pq("Ñe$z- "ygD!;"Dv8 Ln$28244]H74c,f'cG q8Cm岠//_ 7 U^QKPđaFg$O/3?rʉG$Vz zխgZ|P[ QZ@Ml%O"-15ְxXxD.Dو܆ԫcDې8'm(?W@QEQ~}I$ 8AW\# 0n̰s&'ǭz̧d]ٖH;FA<9(((=j$34`s>8Mmy'8'*!7 h(8b ,;xH@/+/MNs%OE4 Ҫ,EƊS wٞ^]w`q- IԖg+qhNC)&g]Ě2rJ_(ʯ7"4#g+Rnɸn8=CHݧ;U!mG+ \D6x\#xD 8 a4QoCܴa!Tcb$^̘ H6ea14Dnn i%PQTVEQ_Dr/]K=RP\ݶ]6/k%8JCN|&>Ϯ>vfw }I؅3TEx% DHIiP2jA#> XT\ʹ'jhJ`7Q)+^6);2ɴUPLQf\bN%QٶRr-oM|s*tJ 6C T1[Q~ԑ(\G5HB#"bWCYHVv";[t"!ycpAo!n i0 pq3XKqŁdhO0+4`f0r$-#@- u&c((2(L|jisshGB1#M]n1oe(r8qV|AGQHgY 7˻4щӁǸPu3L xL֊'yku`8S$ƤY|a$~IZB6W0?cLB2A4sWǛ̈HK.7\6455GQ?8N] dKmއkiߖi=| +áæ(q'~^':bWdC9J)v`ڦCJXQq*X.R5?كDa/^\TͅQtL\8B gC w0XSaTTTq4?*w3x?}9 ah `eU5SؓJJ53;\ [ǧOǟU˻nAVɄ.x5 n4S:FmmDAXWby lT-llHqԝ((s,F>^F #p`9رqb:=i&鉸_3ƽ؁&DlE 4%DKDpo6 %l "FوK|ql"J4jCdmCDcޛ㣀Vdi+HSS/EQ~Tɮ#" & N$ogc1j,=X׽;u/* kg(;ȭ&`5)Ix+ޏsx1 VD)U,LdA'dql/m|G{a#&4est-~-ku+U5`L` ƍq|gCٺ9,g v7Up: z83cNLrPjkQEklEQU܈;5x1 "wC"@N}xҔCD <C2~U[8<6H&(-ErK9XK>"@'Ghqebqn"xqh77qG* _|_|+WMQWCT1$ػd0o Ɣy#l%"{̄<ضNS` XAk7Seg.oX`{z?5 tfYCFTViž4mǞ$ؼ յ^Z~NǏ _W3e2Sa0c5/B3QDfbBg]Gܳ%(K|©:vH!~qxJJ!âb(؊($'څǷ n히 tFD!1CH%"hDDl^`D=@1'/CX}@W"E HDОkˋیĐHYƚ}׸'[n44T ʯիWsС>x:HEi峤r`+z-]QBIM_Cؖd]j2뉤/6K'S@@<Ę;+x..lc6y \IN)%ow3 0Z>t5ג4 )s~ nܬbf+ kwwcևFQEklEQ h}dԖHεBK]b鉈ɈC F2#qSI -܂CA;ހ8Y?[t01Fp'2ƸTDt8j\7ԘW "{q6>뤥TExxvZv_*OAm岡ϳlWzEU`YI3$%,a&3qfc7o!t8δͼ5[dž0qF&3`NyP IDAT$~2U.B+b#M4fu!^Np:zŮlbd#Թ1 U?GuI7S 矩#L>s RNW nL`&2$1i ˗ I|#t!n㷊ڊh5(c2ߋp,ψZҀq`q"'7 ӈ@= X|xi9bF}de7 &!%/똆/!FdW i0WXWhGFQA[[l755+^~K\Qr.ɋ]!F8#.})Dƒt08p0;QSVU+bśq `,FSya6v=[Lk׶lX&>_ExZ>ZW|!g Enp=;Ώ-&ۚd;9/; M=3. " @;WXx71eps۠ST H!I<yo3c;k jK7\*Hd`r#. Tl&_HHg Csd6~ (h5(R=7""D7 }`\NĂ#y`1҇ Nxc~YNF1i5}7 xGF=HDF|cawlkq ' RQA[FE!+oOW>*rYl3zanHy=e|+3߸rQsIJh&eWkä_&\ɸc;krqx*a}_Ƚ(ApKo7GEQ[Q凸{N$n# i-!Xsz 0h!]8#܈@G߱?Io(5nJhzU[Wo/C$BeK}yk;È)+ýjݎjx9صV.tI;8a e@9NlN6l4:j6 ƹ9G8ؖដIWQ6h3y^,bqc K7W1 {4 2}_-'Kq GS,oT(it#(Zck(iyg ĭmCfx"ZہHLH1s$ >`,EDOt$ F"ېXHI-DQMmTqkO6!rkD4G<3@D8-ho};hsH姡r?(k'(ƍXhD)Wpv0pJ5x-&zΙ;xzKA䂛RQ PC =k|YN `sڜo,)C8f܇xwG *f+?˧nF-EQ%ZAG2R[Wbse1x|@iCCJ>λ3t[''>,3 ត)ms`A$\Kחro`2x` g'8{x{QwUqt,Xb`e$Y؛y%$gsV e_AP<jAH$/ve 6aIrV}EqhK3EQVEQ~}}AD kAHF!BbE\@; Q{c|Frm B$E yF8"ZW N/bBl "ېdcxfH:c_#$lGmr*=(oa:`L G`/FQ <S9EtvZ<_*<vH=8Wqvf0Ethmϱ*Nbure‚F.PI=Ϗgv8O3tEETdxswvU˵^"nn>[s)ZnfD2"?H}y3UXxla-[ #&=ʰ@U  -E[klEQ?p? qL"#HFz/;l@HH7cDn\q)QHSb|YP;`1~ Ҕ #O= YVwc4glO y)"knє˧nb[QHO+c7"(ґS#QBr=_۔lΙp B8^xnU>3`JV0^??Blt!^G3iOz>r->V Jn}(UkD _WVTp䢧pWk&2•|e*.j/η= f#ְmWW>VHZ@gQj=zPb+^K| aYaxОfA)~ _5Ìջ?36l-` Fj+YQEklEQ3!@Z;w! q+#Ѹ+sAF`=injAAJ7 L'jhqfwxYmƵ |k\46"'o#V1HI;ĩ܊srdAvmK]p8 mwEQ.M@з$c!L_{ ~7p%ڈ# nܜ$ L PH^**"iDw9 J)]X^h\\Ye;"0̪c:̅*7d 㽭5lyC9zs#@>3h5(D"މGc HG3iFDfA'0qC"k@ y k8{SGu-s0a!)2qv +H'։Hfw5p^kyɘ_2g!.ݴkm TTV.y<}rКIyY ?oAEk>}xEQ.=*p;{6yN4m[uNR_J]>w?AD`& xj΅{'LMGy%MWY s/[lF{K{$y OȦW+ \H؁V NLeECglN! bG':2`޸{ 5T gsy:Kn% QƊdszǸ~V( gYe k Q!`s;jkĶwP ]0K91j58U+8u *+QEklEQxDxv!|;12 iD@Ҭ2XEc]$R)\FE'>x{Rي\PjF( .b Os<6 b{ʨ 0jn{;Xo⽭XiVSnR_/:K \u\|G)̬a}Re53+[- KЊqUH99h:@ C1-:8AuQJ[@ wj"z{vojv{g΁&;%(zd 뮃8XQEklEQ  ɲf$"nC8'4&$ |ck"FD*$mC}0PsG .^s1$VZDk`/5OEm岠‚9uHkzILNMWDB#̋A< jIRl7?Q3 8Lμ@[ >cap ߯D,0 \2ψݸ?[XCiO.veN f(It"F`nE^?y7|@t4X.8Oz fw#СzSoYt8I|<@mOM683 Է!KBK!]̊G$PS/S(Zc+k,z$zbqJ#(,ރdUO!;͢18eqx8e~%sLfː%BbG4(xdWf8m1>7iq\&##L>ߟ裣\464Pr<ꪫ5wg/Ncvg(렛Ɯ<蘺2)vUp6h[nևg(.z1Vl`]xF2!MF'g,~7xD\6qp.tu<Ÿ%"BIBhM.zYG)h=~ݨ#K5O³3˂w!LzqC8Vm#vȧGߓ3CIrU k+YgIp/ RQVEgh^~R['1$H^v'.D0N4Ϋv'uٱnD w?N!Q',)g@x$1<4t#9!ثq:֗a@a>-Z~;[Qۅ8C+OEm咧C8jqkХ[|Hߵ+r yV6X4w8X #1_/Cݕ֭5EFYd]A++㗰^"C(_Fvz)v%}n,=#?!9瞦k=)E)LMbDJ9&ln`"WQ8#$)R $.qs/E.% amq:ORQPUWg/q||H\ǧjMd##iӿ@{(> "E[klEQ Cc#DA@I$';p51B"<+0؏ YסHG<ǕLTs6!r; q t8"l73i>՘cmDϥU"v3y.cfTV~:*h+>MM8_cL 4'uuuhEQ.=iv'~s8_g'm$5\3~[,~D<\[ٞ)єl @#{GQZ*z:KBv,{p&U|Qgji>MUc&EL8KP9z-YٜX a|M06bƟL`Qk>'룣(Zc+[̈{܍e߀8c"8!hmXDCH."x11O&>e#bu۲ IDATK|8 .لݎ8m McnGK6YNBiƸs{[Q[TV. E:0444QEep )ٔRG(b2>kWIƌk?ns7%5t$eЄ/kkgMɑԛRq=?KsXk0>Ї-<1t$}O>]ic/bv+Z=Сqj7q-3zyZ 漚{3ԟڤݤ,C< i0؍H&w#m㘁J1@!}4"qt#HnD(w"kE)((2]X ѰD/d4(AQE,۱% l .ue ,on@ܹ<{SA8eajMT3iѦSX<=c[60!~45xn:`!,>FN26N$~nn0LE^$a'=*89YN"L rM1<$S '`uoGNc]\!MFwEQEQ`Agrɻ8XjDmHCK8>8#.@7c@9L>Q}9N!{ cHu,p1aEmFk"D 4zoFPN6 "b&Dx1"4nD騠((s1cF v;,_v;Ap拒.vz⺞ӶkE<9af?md Bk0063} 0" +cۄԪ5ƃ* )Q 9ؙf%*T8A,& "adl;$1q"#-@;L ].x9J\M Q|(Dr^#@H_;úuϐ((X :D݆a^""FD܍Aw o n@٫uhAD"ۻC\W;ם3ހD"B}i8$ĽFvE"N  eCSS)iPSl ^p.ҝN'A)'_v5 <!})ƂaZAyqxcg@L8$}q./ӍE*Oy_#&x~t%*_ܦo~󽏿uJEQ~moWJ@\hR)M5~G&`^t u-TN~ߑKϡ[n Ϊ- LG&i[ϑ6;cD+_Hʨth9E$3Ie If)pwK1.XaǓ@SK/IH*!w0u*ܑ̃XHY}KY<Vo}g-"9dqA/c]V.oj*$ DV#isH龮5q!ױ;Yi`; Q~<*_ -̙3W_}3g㾄vM&*reS'q؉c ]e#Ç63SB)ѐzĭǘE5ַ2&2M+ѴF'6< vUpӉ_mO_D;04~(=v3:6= EY6pCrоɦNg|q8- !u+±]0 acsAzrsϨg*u?DQEغVE\^k=5~`~>'I{wD$s_ƐrD 8 Գ84!J<B)AK DB:;#4Ђ | }ekFb;)GQ~*_ ~>///.| }O?)rhdPZي*+!TYJ-tfK(nb?T;Fcďb󞓉ЎDMb>bjajRD!7djbAxW^9{,W6d$9F'!)K Oll3QQucgp %˜n0;\DD e H~xƋF h5g6AHHWD'0$G>x8~2]g݀Ԗ"*FR\'$mH|7( 5~d m嗴A%KRVVưaØ8qnEbbg|IpKltfzf3](xi  _؅ny=HNw:TF3"ǘ'_Gb;f.n*+Bye]%; 4SUB `E4 n;H/'EtW~ VTxsp54gq/;68^E{hO)YpG"ㆇKR[QEغVE>I#x r<3N#z3R1`"=#Ño7h 鿞>8l`<mgj"d? DdR} <`$K߆.3 5Mg+?/g#  jrDQ+Ör|:5 <ܛ<;Q߱ id+b3. .ROr;<%,σtZhq$@ZCqBk=Sw;g[ ܌ j!@&@X)(b.=#< c@PH[݅ks9=3hIeÉ$>g ܗE.Tu#3vEQt{lEQDŽTnL@dn$ގtP/rHW əHRcWH/N$M=X_!r9DEnzRF D4CR!HO mHaci}~޸Kfw{ɸTf+? /hF{[z]s$## (&>HQ yTg[ydIקSrE,e9D (Cu^-v#~>"d8q8s"L6,{pݮ{tBάx+'ф8[( 9 ]0f}طŊӁE~p3.&Ubv5B`BCJZv)!z$}tMCXhlul(=(?s;";PK=_#I[u\6Dv#A ;p3^ } +"ݑeA'QH)vF($=~ָT.#xR#Kj Hl㵺V~,*_^G@$+&GEK4 wHe\C2atIVƘ^۰|Hk1Bb /Z7y ~ 3hVǀl`ݺY<*QMLbs%xS]ρ;޼gn%Gγڇc^'}(+ctteIoxxf`e 6cm`;@.p 7pnex:,N0mn΢=2x@YEQt{lEQIodo6D?7 2ю$c.J$R*d:ø ACbϑᔏ T3+kX$#twOv$]^$ (Ǎqq!PҤco IlgvB?6O@l~|==u(ǥ yS "j! P)>c|LaGg!}TH"$׵PR9_p0ߟmw1%,~-&^#gf -etͨW枛).[ta$AF5|  :vqӇ&}DH<Q x`![&<7ea8CCvf͇umƌl썽tPSE|c!?߁ݮ!EQt{lEQI|op7>$#bwϐ4;RQ m\`N1c>MR=Yc,A #Hw!rfd}6]m\G$X7"rۄn+s Th+AEQ-C(4őS2uqT| SCsol˧ܚb/h l͝un+XX:qgy1*vdA smꍷ˛wKoWH***9ɞjv>S)r |iAsh![r,MI"^ʹ%Tf$Mjl)<ܶ_QwFQN9_̷4i}:NWjb.W5/na7P*E=(o1!8Dv~HH+2@$y"zz܈e+RqIa:`/Nӓޔ9t|"<e-$^nϊ̃0D6nCiA Dkχ m嗳nͶ(ʿ)>Z[M-|E 4HvOɁE)5 d ITʡ!AU"l{ BG8nqdo2b9{.++H=0l:';FJ.p c:r$ey0M SW/呭;kl&?ڀ_s 78c |raʯ(n(a8(Oر!{C1(! IDATf){lEQ_bFR,nG1~IR,G$$jyQ`W.k!)" v>䛊]$pɤ??6aCg~89CǬHHj`R@M V~^Th+ݩ<7\QJ\I[ҘO%/95QI@:2)UD *?‚;{%~ l|'eX9VB|LJ ޷g} քѓ؛<۹ gI죁ipe'\]gyQ|`ήv6(o/oLML7Bʉ%jr"dXp:n {N<%R.׶W6+Tf+{lc+|?U`.x r=5@p "d8FD_ej}5n'H:;h" z:`g"7 Hj$Xb |8v'Rm%fD|;}xN:j]iVqsd2QyN:Nppnn+_`dl.?eOq#"dvRS9yGh9((KD%C䐛z e;(+ه$0窝MTYl*"!, Z<i$;6҉KrжdPDOpiw+?Dݜ}{hf9135x2S)ɱ2qlJ Z?3tb6,y8-N&(.0;䍳jӟ(=(ʿ&X$l =sňxFj9*[$m 2^@x#U%0YpMW1DRƱ.ua7[g\7@:22G0$=8bB*H׸cQqݓu wwmm/'{>b%).幹Vº_{3 }N10;Ū"bdn( ?D "8߼# s3 0ۣ OZE.[f_0,aK~GQ+שɘ2^k*\LJ~?+pޠo #`%+&obb .v03EbRbM\mN`uK.Rq?_NdR$Nh}(=(TAz ; ܡH|`R$H7v2 2ԍ@o`&R#֣yN ݡVsc IUW!"> H$3Hbfj?8fpѸ߄T$n4ā mwwt`P[SŶwCAGo_}E37SW"10(fQA& l !@Wh"?IUV9f3]M0>oҚ483;_r{7уV>c ɚ>,x0h>Cidu\ dB063C=w e׻)#ɔzp=(<4 gq[<\! {Q8tNw`!xli6jmڡ(u(/ESH^Dt[g#BCHZ""]gw?R˥ARC28Fq܎H?pCC1GRHH_۲Y~$5H'ƵD$a:يl?$En3 Ril7Ik#DTh+ETT qwsMW忒07JjX`ȓvC;-uL.L;oP::]jRQIdȃlM8L8}럇 +8% No:қcW~MD/lxˇ]vad΁}.QF?~q4zpth#Ӆd6kH@y&oWd֥ZS-;9_Uqh4U9quVEغVE.C;zPd8\tiwF-XA: Rƃ.m7D^!={鿯i|-"}zȠ>tf5sg?uL{s.ARXH* -z@dv"'ڃ tJE:a8)?*_ ^yz(=AtTB7P*!Bbi]>ӇWF$I$G&[C\X1b\n' &G_z/`ދV#~uycޣ#M"5#Jr=x/>Dm.ddnZ7B#YU˵+Kd ­2c($۫0ip](!mGI3Af`r`R+}1tCI762xD+`KiKV?<[QE^#vDfGR;MmHv8"G&$ l6o!9}D C\$Q #2z1(}HJ 2ν"2|z Rr{9j6ޓkmω mEQEB();SWD=z2ֱrʙ˦Gqf)el͠փ59o&ؒC*)eԳ# (}xtnt,.O>EdUM-c q/щu _ԓRǗ {-5w3HH$j~͹|*ElaIt=߇sa1 plH`o^Mg+((4Oz"_Fdq_$AT"^m< <B[T!H!@ R FDz!%))Ǐ3qI^_g?Su=-y>5Rr I# LƺITdb[yP((W.df^r:Ό8"eoQgfq[ Yy6z#tr Mˠ'tuW/ ]vä xTRN i 0?})1Le\,#K^2ֲ)$ ;*?/[)ã Hz3W8̸ɝ,cjB* e4(([lHJفHO l z$M= 鱞MHHKXVDO6^)"ېekV r}y\$7 eG"&9HՉ8 I߆Kx"z@P..B*ڊ(r2,17ᜣw<̴݉ef{ !N}BQ3evɫ闑 ~y=]3934I-tZA{Xt/#A03AL4Ј _ 'N& ;/&3_X \>c8 mn5΃);31y2+?LƘ͑7qϤr>gc(YyA.EQEQiC֛\D.A` =""Ņ~t5"#)T`Rm2..$U=XDͭ@rX$~gk*ydd2҇>pGD*L"q7ֽT?&τ mEQEl{`6*.2d w|Nش~7y70ݜMҮ2låm<-轼o]@sK.J!vvp<ƒDSnÌ`9.'ؘ~,>Me3Ʊ3ό|' K]0#t>~ 8({SK+T9]j jS'XXp6h2C);S⚩={((0!=ܛa5#%G"! u"/#"8WQH5H5A.w'#ف oVHZ:I}EǍz~:n2~wuH:|0ٵ*VD;ڔ)\N'IӏP((WӑD:xӿ}3 /9l boǹBoNiPnt9^g)/nƩ {y˛\AdxŐYo 땘B=qVPS϶,fdm۾n7xaCUn< t `pB(_,G 6^WQqZȢ1$7O753_vedn]Έ/dn]`̝L;JU{%y?!)2, n2[QEQEC)z"8G!U"Cr#$G*G2ן 8IA6I8H|)Row`a0"c?!`o\çHuHn~Ȑr` "# B㵗xź{CI$%t9EJH$\dwTL>ث۸wH$4ej;b>-wlN e >ԈOY(={EYߗ!4r$Zz`iz'q]ˍ 66ԁ({Z9GJd PVhFs\,b((34HB:iE0Kx RK[ >GzH% >@DDRҞHBgԙ6!t7hqgu,2bd#HMa$!4E!@'(1ԟmMQ~**EQ {t D-'`aAZSX2`&/N$:F\fE| [҉t":7x7qU]H-q9m\EIL#x$ZFc^2|&17^xF+1+ ;sT5rznތ' t!Arxt\} v!ROxn057@4ɝlbdĩEQEQ_Hꥈ}dbdÈNG$wu:2HA)ӐDjBRٓ4w2ee3~{8ߗD2+H8/"DcˑmCFÿWTh+(FG< Q,;gtPu|IySIժ*k΀2zƭZI?Nk`t3%\o GF?2:`Ǔ:Ɵyk@o 7^nv eT{.BxWm|#:88`\_\K\A#(cJ:P Ď̥aX!ؓ0s-8v"]|vsI ķqjL1A0)9MYTJq`fiغ8,S6w<-f|] ;6 //hE|Fڀa[u XB[ioЦFϦ&H(((("U"ሱDȀjȐZ`,IL_N&aߐdu;~@F"#;H668PC=@ 2n!}ad$}xZe@"{׵ XEy0"Sܩ(?ڊ(rav;33tݙnVBsƝg7=0wFƲvpؿ [4/c@7P1 R⍯(e.d'S39~fvxzIQt,9^ Cb.%oQIوX^$ PI3fASo". Zt-Tsy'3aysXt>f9w@_9GzGn%uX6Hմ?K1/6ޝ9ƞ=ޟ&`ӌ[EoSg8qm8܌+2fCyw EQEQD0: r3PH2dbRI2 xG:HudtDh'DLi=Dp kD.ۀH/n,uB;һblɯB*G@$ȕHR1 |IӀ9Do\[~dڊ(r24ل^1qϮ|G4CIcK[EOh 7OȈ,4WMq9Zb}u7܅4ͮ/_eoB)uzS+e\lmch1 ȴdtz A &CuH,R @̴#H/w'5 6TpDc9DqH%J "uoVEQ+ uHc! Ds`O=@ n4QP_K;c $^Iԯ)Ӆ7jqcy\X]YG$Ion>lj^P\FM+שׁWʤȯMXc&K\ꤙfдU IDATPBym??OpW5X PUW_Y5E.t>Dzd^~/-6(&3|ZgFQEQE zN$Q=tƾ9$0/n@F %s\$noXC@DuHz("{AB. cf$=YSHȥusB[QEQ@¢E^q1~BWoO&3$*'3ln/w8ɁRH@Eu>UNjޙEY"" :&:/iaaYiJԩ촜2[LSiqES\PI\EFEFQEñs~gVykgg=$"ܺ^7̳2`4--#m(sse6^Qm PGN m`p&ɍàpďH$?s--mS"9`Oru?_ݘOc pGOEQEQ?Ӑ]H][xAH(d(c݀T\$ACFD6$N4^k< fr OSM #z(BDbFdPd2"#iĕ!ƭv&xH%Im;V~ *EQ*a(N@_һu; N-3)YB#Mײ7pk<kv®} ֐p3- M@9y$Tԥ%~Z%^(ƇKOQ-)퍗c!bKYǥD<ذacY,5U'dT k ˨D[AxF%4,M"#cePrL/摧lEQEQ?6!=g(DlolUD oFįhԙDG?_"}0Rr{jر8|G# lߊבvϹ>YՈxS}X(D#w*F$rsk֟@QEQ.Jg9e {V<.,/3-^#HCUYx7 !erjqb+PL1+-q*{_[sw9B0funK.zqOHb0ab(9׋>|v8;OofÚP:BDJۓK.m-tkL )]0o𐛚˅ x#H#\rIE/TEQEQ36DF!YCdDd'wqdnn$xQ{ =_KKD@D|fG*EE "+4 #wLJ` d0d20&~@k7 lO(W4((W fkzn)d|3(2$ 2&ŷ \6O΁V'rЅq MKb_Th<ì5D1xC9%G [paV.{k"&Tg5NS-l)9ڎk81(`-iN#30l n'2<ʬ|2mEԺk ˆJ=WEQEQ ZL@m.B6 ߵ\nV;D"}NR)R74""U# \?$!')HoH%H2;-ǑO>V_ mEQEO +"1~d6GB˂V! 6b"$BԟyඇQ4)ɽ5fUMfۢ4"8[:ԒaQgЙ#iEj9x~)Nzh95^"0^NnX$hwaG/ulN69pXbg ..RCG"!v;ddAhl=_EQEQÝDr$ҏ]T{܁Ԏ܉4`C·4Wۈ2{ Ij!zؑV4@-A0VX]Hz,ME*HFu/D\g =zH?xb."`N+ҙ~oE(\EDX`Bxܐ$,䳕cY? G&nǟ+Y>ǏO%|+'(3"Ӏ@"ė"y9"mƱTt|7_e/+"b<~VEQ,:O2pk \6fz2YK<..fQ Ytd#/SE-JN0Q'Rj%ݣFq뺕~Gt9&{Q߸ W*sH)5x焫'.$?FN=ADX}e98E73s<|X;ƿfȥn;rp‘ 0CWPmEQEQ qag: lJ+HJs$) 32 |NDt"' |~׸#z"ǰ[87!¼IwFHH7v$I$;"n_D23 *I7z(#*EQ*"^1͌YaU2(K(kRW-K8A^&'לvKGb;-aEmhDw'Q qM8%4*K=BvUs~g=u%Ƕ@!/֌pld(rnYYJ[x_h.8zs&> ɔ/~–U'`p 􌇌yKG+((n Ո$7}ڐ0Dhg" ٍ@$=ݸF9 t\GjBBԛ|m07y?"Ӈo"!VDvGP!|sW58V3RrbgM g |m(EeMmEu/0& יkri6jpۨl@jNkوQ^px\è qdى[nXpсץ((EHÄH9nBD9I t)\ q!7ǎ h#NlP bm(;5{\:UH{g9l}iOQQRC98=B\K85tBn;n8{vũ*66y&_vsM* ,H~i-Ы֣ y6O7ANDX=!/aT8C]oΔ\QEQE nG#ҷ*>kHA`&RM#b-;n"U$# +i(A3"`WD#&5/75RrR $ΛkK$c{fsDΟC;ڊ(r᲻zDLlZ!2=Xd>&JV`A&:t0|kS'0*| IJqFZK#K{%G1Fdԋ`Y%ɱ{r4,_&3FUg5wxb8 OCF&#]d,ݒ޶Hn'0`#XV}/GGC*q2H嶢((?$C$"!"VF` "v/ {.0ۥ>gW##{z "b29m3{qcGRY{~,FI<3FǸIv詢NVEQ.::C|I%i>_V9yyn:'Cm}YP=2AdM8A-+A Til+gO>29Xa7{-[Z>,+xq؇x1fhrzJuZag* [:X ǡō͋ӹȫg_ٜ؍$y((;@!"C) /"5$żN`3" rH"`$"w#u {@2p`}IDN\`X '.$x͍d2>hDcJy_/Zq<(SQ~-*EQ*du*8 lt\>mo'?ǹϠ]&:14}Re]KPY.}F&,AoG۞n|'g)qH#6hڛAUح+Sx#f=e:*8B1s g1X,2 O0!32Y{ƗiInBWB#$'f3*vg+((Ӏ DLF #y@:c;HO5_Sd:`9"#"I]7 ۂ\׶ ȕP$Y`k;Db"R;2iyk!iRDXDRH5עB[QEQR[&DILQ ;r-.k 5 &/ a8#Icik͢shHn )~Ϭ M0x=|솄>!J'[e%xrQV 6!f^&_͕Jp._)lN{?;&9Hi71hv(>}cL.70ҝ)K ~ ^$arpPEQEQw9P@ "yO R5R&R$ 4F`Dz#聈F:g#_ '{#4"f1yAc&2q"p'ȠjoRrѸ߈nkKޜGDx9}oC(\AeeLe$!xaΡ}Yӛ{`/ɹ\:ds p>V!Ci!;DP.zYT[ k!}]P-cŻQB[st؋P5YMFjȓ(šDGGRPKK]%E5L %zػ͉a~U}; 53YL:) >fh1 %A!'sEQEQEϤ#[抎kDas)6@DF;BjLb "#C&ˁGZHQ>鎈K@Dj |I5nmHbmd f`#e \I[+6ي[Q((W)$O53b.xxOd՗CfB!?3]ﵘXp:g?H]6l E.bɪ*YN aػY3<]1'ʏ YU?/τ~gg,z+Fu`%{`vxnZo@Bj,7g0L2X ag Z߁ʋb.p@q90II],] ӘhQEQEQ?`F֜A@!<ҍ}+"،!WA@`!"Au~bW_!KDh/2q FDr I\"UȠI32h~7 kYL ɤJ~>8 E\`2=dHe3/kEx.8.}E5VEQLd\rҘFwOddgFrϓ9|Ϝ L^f,s gSp* KjarM0\' 1N0Ìc-8w/_³IOR!;nnBf[5((H D8?Ʃ CC^\wGdt6Ը2"B1)d6 @r 3{2T2x1!$?G\XG*L2nƁn3"נB[QEQB> }[ő#>PYB7C`EyƒivLJw5dm %JˎyϏMg+((q 7$@:|I:/C֡{ף&DRARݍjg1VHJ{ f|XBz ~Z!`DEY# <$ğEdu?v3@WcAdwN+H(ڊ(r! !t:\_v{MՃ09^F}ܐl">kG{f3bfa .4"}XK7&:ש%dݬj|p\bikTS +%<>kMe1)6uUΑ)L:" 03<~C ƙ3 b<|k#dBmp>DH5zTz!y ^%2SR4((ʿd"!B{qYHG IDATc>"gQH%G8T}GD)$탈^Hv"9~0 , "5d(e׽;b)^݈aSNFړިVEQ /$KzSv,# 08Hf VZ,m/#%)(Fk;=(_ׇJ8mvʝb|ƊsnfL|f ִ.ə 991TTerd5dr3 gysf}/l[oK"\U A TC+Ooμ:CCV^f"#)(ԓFQEQE܆绐W|I4{Hw튤Y\ 3[!I4RX|d|6 PGi7OˑuDN/Gv"lnl+e}\t<$DTh+(UDBBT&?=#K̕\l"n/y1 w ט"dwXK^^ 2(3sO0 [Š=+Ecr37U#,T2ʪUX2\2e\+XAg:J(]1Zv.-q9D=({ً~pa[BCM;Rwhm7wt[A;Oʋ1iT۞HܕбUArrypNݞO c-@|b:&jH%W̍ۡ] UQ~Ud+~$ZzRvaE<\/?geBNȮ;-`j!nhT>l8ߺ- @۠@,18NކTEQEQ&$a= I@$e  Ha{`6!H Dr_4$/3?#}$ Cv8j*e.5>Jm|.8V#)H JBb I@+ olߊ$Hb[[P((W FYonM[G _Ϥ7uTK,U]W1vo-06zڠSyl 42=4PSϫub2kU ߟҋ\cYjctK0qacZ 5 p7%iˏi |tiiuVV.̆+!5!!A?9,fI$rT7ʹ9M*թ=qEQEQHlDnCx-uR?bBR?OyH"Z1H"#R3r=bd -@`$RL${"N0|DB@K]oSODnG!)H;8voDt")8Ŋl ګ6Th+(UB]Y -}!\ {Ub_O^;GLOM e<}U231{:%z {?rqF-)(=HU2k@7<0."A٧h#ۙD5n@}$S1ea+4Ttnf.Cpɑjz[0c;NdT'E!XpO=le+=hh$(((H:IYr7I=uHWHv R)E*Ij B3s#dCHcL vED٫FDHwCvDG#&!g=žbic_~2?`Hy~V~+*EQ*Z̵Ӻ.'=q $y6c J#p}x:$o/8*eKz1uF*&LtɐcuULONLx3%v擷9:kjY| {e'0-t^̔k]@ćxp!nzG;suY=Aak#bTdoOUx׬ZGa1cAZ*dJɳ'((?h3"rH}HyDXCwC DR R`/$X};-3ynR72G$]Ԝ=3Kb v@Т#\XŗIS-8yQV2"C?i3ʯm_Éc0 c8s N}G$Y(7wɘ(ț: lUG$< N}悉\>^r322]Kn}>+XgSa/#hgTèޱ\ >ѓFQEQE#S$}?!mGo@&sRN0RgHNÉ ж yxlDq~ Ry2I^"!}߽H Dk'?Iviڊ(rՑXb'p{2\*r<4,'N  !"$݄̓p "``NfIr':J %T=w^Eb }Yb[2ɇ)p3iK[Zҕ⤊annT]'50Z[A/@Q-_ ݚ)C98X#J >"GQEQEQz& Pyh>@ /kY}؆B֥Hj!d@c})HZ;|$f$H_mo1կ#?dcWJ2d`WnY`7=^;B[QEQ*@&fS@< /erE(m&x NxTG9Vqe.ُVoѷmy>miHBps$TL(q* w7i3`|=-i'0a4HM о*668>|d]nbtʀS⡐AZu,dxUL30 s/5_VEQEQ+!P UHEH2|уAH ""C#7O!IH":聈@9pNvj)+$;9/1cg.pgM{/HҎx WÞ0^Ɔ껙y'?=UCa_cw͐{絢E3{7g9^q**Qyyy9ԝq3.~Q%rI? e0tfgҚ9ߌDx$ͽCO7B[QEQ"<s0QDqv 9nL.sO)t#/Ɇ'5 I)Sи</^69awYpӭP}~XOxyE^#m~8)yZwM72v$ ě%1K!2G^qX cW͑syR RZWɱ*"/1Zd2ZK࡜Z h4Q/;9d>D;KOEQEQŽ$37_"_D D@[ T!!DN[N5.M)DBLDs0-2l::0pSMhn\`"+9%t_FReZTh+(UEw-QK0y aDC\ccZjNj`x;f>o<30&{."q9cs Ճp"wli{!Am1l^|>uR[7v^ {Ѷ#)AL eS*SvSI%p)^c}:p[xzŶ!M`!6٘7qv.^|3? b=AEQEQ}~sG "rAɯ#r"_F$+=i€HOkH:xlF:/#u!1~8`9恍/clVc<.\?e" 72r)FTh+(U^4`eyc#2~,"ς:"I aÉOqSndN̎bO4ز1!%^ 2=.].D}f=}g/9|}s|GG݌^?ZpOiqIN&~k?_3ul2)h&ηA>fB@kO)pa1YGPEQEQ~"D8#U炑~6Z@_D:Pz+үDLdh I1;hГXlDPDD& LAB:! %lg>"چ |xNEP((W!va 2v!?OߕpEwmuM\+WZBBXL4ǻŝ\țNnb9hvXmɷmŹPd8a th|2ݰ:pu4 n Ħ0F;4P;Ћ`$17"M~w7iq,H<|܃b'~jnF'eHBN$Lyƾ%#٧? = 1#޻l 2A$qD5~ o畿xkV~*EQ*#, ĥ"grtuO.M0s&?ZGnbp *ޙEY"82(k.em-juN娝NvN z̔ru@Emay~ߩO}^^s1 \__{ޟZdPd`2s}͍N}L)86K8ǃ+/Tor]`E ڇ[BhZږh 7MlpЯiӍV%͉yQ̋dhN 88f |E-].TAQX w-)jjJ:;"ƎiZ()EQEQE|tVUH#hN7CDFH=98|O7Df{1^CJ_Bf1i!u!.W|$#R{-" B; \` "_3 6z Hby~?2[Q((3""qӯzk ''/e\.YG'Ї|F$;iu7.a2[p s9\4uxr $b`M @S: ʲD5P͆%M7  ]f<\F"#ybۂ=ñNrI$sxAaAA]DS9轢((kz5Ȱ!<I`o@zo@$etn?Ԕ$on>"}.F'@yDZ_f9'4Grm0p IP^6_ ~4@&ӤoS 2ϥA{dZ rVEQN"A^IpSЍndGd3oQl0i~؇'28d/(j)=ٖ}KCi>Ӽ4h`0 -nA .`pm#=pPw&ӅjV0V:Rt~/ '2 fCJkW$3_A(([@ Zv$HՈ(0"Hz~D\7317eEÐwgD7s s 8Lk6wInN@x<29}RB*f^{QXPpCbd; \ɝM((\4DZ"#i$t,G] Տ!Mş#I#BۊTd/Inp9Y]MnH`%㆙Q*g IDATW6jd2r0@ׇ :u$Y~clHEOP((C_N+63z|jyF'Q'J켾Nd!}[0ױpuM998q<q+dUQ%C-}w!FX;>D$2o(OFНnY!le섇rQ8EN"! Qg/'NK,LUl(/XmR((ruHt#8ғIUoVU!={2%"_C.$= x#9+(AjLZƈX@.Ie! tDJIb"_2! `k+>E)6v`b"jSVEQ!E! p>bŊeL~Ǧ۩ՎpI64a`*G{.ph@OHN!1  -ETkzr'vX=!EE.;&.KhVOqfNsd- fDR0x)"V-?ƴR)T;q3X]AlC]jyOۊ݄S g5XH"nV#_KҢG?xw3‚zFo:YP6inH鐄4:gכe/s͠SEQEQcC:v#CO#)$5ף-r5/=HMH "D%$|'NE"}e8")a07 A$X `yޱy @<I_!z;1FaHJ"3Qhm\V_ ڊ(WaǶ|^oO@ѸOr=;&MYl([Te8I{ʽ K8W Fqw >;W˩(=),0NF04+غ j{&2!{W"$dfJ]F3P7iOHF ϷfO#y-@8~;\pB:Z%4B6AH"ZtU\Cmm-+mEQEQE HLAt#`#p#,"wm_C9FB2DTX EdK0`3Rk\#5lL.yR. ԟ#NAϛ`^_'ہukaz:=ּ0{%GE(]ˀ۝IM<=?_:{ykٿ+IKKN$;34vXQ8SX 'E-g .rPJ @g8Ա='C µwG 6MIDff2kH 6<#// ^B pZ䫕8n⧵!a:dA'+9OuM-555z(((WeG="?F"}Hy$2+/p둮NpH?$]e= eH:$VG:?DqYHo8Bu@WD_fH=vDx@$Ǽ"9pӐZ@FĊԜhdeW䲸NEDg2+=KЄ(JͤSP Rg=Bŋ#H" ʳe>8ٔ` /?*nB]X0Wj #)X˃i L lXv+ |! I#G2+]oEQEQع2"nF$wp""=Ԏ G>"գUHGvR/{:"_7ϥ9 F9820̿Ԛ5kJ$Qy[%F#H}y# 4 @^V* mEQlV~+X3ywVY/|W`k*bn գWQVOmM95:o :l^>d  Niʹyh9l t?a1e ~8RYkXOsat 2ͻC3fE~ Ly^p"07 mZwg?\CZH#~|zI$"MHG 0 َ-ȷ CċF.vBP!I=H3u4RJc AhFM,H{ RrI|W?Ap+"/| ؂$ |O_j+ ڊ(Waú?( F-h}5gv͂Om旲 9C QB#,3blȪt\[MOz nz a{hP݈ܐuuޡ((or9(GjE&Hy2"/'/~i} 4>$IIWCH24> f3a1NқÌ7͛Ȁ0|ΙI' q_Bށl+RryRb sm.KnEOQ((#jݵx<~Z|I+2 ` vȽ|Zz<. І ,;IAhݝEURQhH }!S:>37V${Ig^ 񏷎?ۇN K3R>s|v0<3'$w"">OgۑZ/E(UJ\"‰ yJWq:8bFך 4.y @5 n֧-6Ӱ:42:[9i,6q.G+!^42_#wᲶ9 ^؏]/p2ze?ӟBCmAԚ..Al.;4xf>d@7b=E&d S3!EQEQA3D07H80D*@@3IeFЁ@LBDf!sbmDR +"y!=EH`Myt~` 2 t2q%:RP((#bc3f ֍y{Hc_y)^Me8||[r6 @q'ط$/Q@ |W2=TF8a }9N)lߓ/3t僐̈́tǵ_L#6A D>ZpNCͲȿ!8G|ؚ&6U\UO*>] p`֭r 6Bv;)Ayy?E=9jA ܍_ڊ(;"0FD|7LcܺKdţh~=4/:&{$E~u71({&L=DZM߱/{ڜgص;E(h5ws7wAJFt 1N. d6=Zl.x 1IL7ؽlN& ;!K-5d,^]IŹD>slNpkag3((?<\Fro` "r͵lrdl>$Ao Sdۑ HG7⛑!~\W|`"9Hҽy^}$a,d(d"1ϫz 0 QT4u*_ mEQEq,Y:.>FomkG{8~J[&xD!ʺӚnTĩ?aIq %<佋L2+9x+I`d.zSL Gp8]Uq9FFꏷnjГUDtb Bz\0_)'7\OET r93+Yֵn=m:ĆXRh%m E-`,X!)N {7((َM ٗKH);2r;0 uomnsI9/@~H<"HeYx9D(Py\ ؂i|א4H|82Iddy#O3JB$\ P(rt([%9q %k"ڳkS\%r!\C$`6ut3se4ބUpb<NWRl*t.w+1H$[De,[lnɞ0L4jZpE4V3gEغ `z5жxeA].Z7ANm8̘cxp.6lAMEQEQ埓܎ⷐ$:}шlپ< c} C";"]cF!hXS^DPHgvkdewD2#hdHEOԘ4$bE$kz(!*EQT~Ըk~0+? &=#U7dc' *2&ʀoӸ,b7 ͓H"wc.sqd\A)X\7t=C33 Ɏs"Ibfg;p.83*c:5{?h \'.]\';/E&W+Abx 4L]99Jojn߇R ۡ((ϱʙ H{%G1ހtW/#KgBsۃ-B;!$$>~o8e2Pϑ\#!MhWb<`$?AjB6!DG#)lsH D""ߚ^+G WzWx9Y()*EQwFcoaS(uhÌ[ЏV% ߅ ȸIİYb{.x౗C7]RCHEN}8O+IT ܍Tl3w n'<@[_ mEQ#o/z,snݔuҤN:l fȆ~_M|Y%\;&-ںV bOr*rw(14k*Tq9-SL#p gM}89pS0ɦ7Ŭ`O GQ-ʼn`{!_,6hz1gk a6 ص? ֊H 9)(I$9ڲHFQEQEQېAyT$-"swk껁? ݈\T܌HI(" H7#D3_O9G$"byyH+R/rYb>Ih;o~v6 x<@xYz6,Ud+*EQV(E,X->ʈ91C&h<1bp IDATY`Y8$29]H˪y{3t Tmf̩ڕTQ͐5` VٍHNlLXj:r/]\仰!lH;zISߴw]ּM8B!YA +39M6:y]QEQEXij:k@5Hu݁ވ$0ID?"x-ϟ#!s.k&E\4_6i^@B##ˑ/9Sy疋$D@-aDvQ~%Th+\Q~'~r< iBX$>ȁdggrr9yч:"9Nd3x.2.v !D;{4)* ??}VrW<s\w,$- ]Ƚ%Z;o5'ؼk- 8= :؃,!(/]\kzXw[]glqIpnHS!iQ2p2%!uc2`a&3I$ʼn?hL.((ʿ \Bz/ x&p[inoC= hhDZ7N"IJ߀U@~I^o0I% :'Af#<!{n{pX kk2CDE_ ڊ(WA+G"N "Iew Un/mj G8WS7 =PJXtkbB[]@UAI?el zH֮lЅt| $o ú3؀#(“^fm5o7#$f{ ^XG]y!qؔJ?8l6x@&-Ja7p`8ͣWo`d\\ ,Xa Oĩ7((oH݈PnDD𾏤 [:+R Hq+"B>A*G#b{d`Z=湼Ԏ;u4]@ȏ;IbG#}AH|]$W=/G(p9\Tp(zz'?L"i}FV4Sf!1U_w, zX[Sx,cs)hGhiy^88;~+f5v*EQEQ'.{<d "zW汌BRY~N;>Y.E+ ͑s_=6TтspA|q:#|yCjE"$kX'$y?D?faG*WnV~9*EQV(U:v@!qv{SaG I 1zn+tͦ8m?헸)?Rr*y‚B "9M>>` Nxȃ{); O@I S88x2i^$8Fd;7K"e(t M"-ހ~240`6k,vC <lxD*((x 靎B=.A:Sk 2!u$"6ߛac9 #dE #|%Z2K1T`O9R^z}Ɉг'gȍشB:SGxAcv:> 2#ÞE1T*'Bcc1D oEӾV:ȥ+q ibgt-N$%n;8T@|ڊ((ʿƊw\@*:#2ID2Fn hw"fR?\_9"r8ncRGсJ$ë󼜢AJ!/O2ipmf7I!r;E_ڊ(;0i܃|RI)n'x#;O[dFڱB%Kl[-ql  <$jt`ܹ66aħ8\}.7Cf؏Xi3s?Ֆ)oP$A-G9== M| ͣvxTI#7`^vc$RKKͿ-@= qFH )s!KI,yhIsF|ˠ7] + KO⛥?Rږm<,'XF1 r!n{-*Ѻ{u*W%y8;ooiXٯef>]ErrP (0`nZ`h5,|\@?ogs~ܘeJr8$;v )|EQEQ7nLE? `=" >tތtJ?uHI"R7"CB.~,ECV!I$m2hO*8MsH3;,vo_#r~ ƕoLAa~뷙K*V_Mh+(X*X؍8mˡǰl@bVRBQE5V0fc-oyNLVޏ<λ+[/y2:Vӎq$2єDdR4+##ɔґ 98 pNME64hb˶0npܱH+HEQEQG `RQ nA;"ֱއ~Ib!fR Ir7GR{Uc%Әp#+2Cx7"(pKAG HLF2[xնVE ڡ T 24#c?-y EGX%pZnadB۸H}5R~CtB  #1i ^R㬫XD=/ŒRK2C8C5TЉ>0f&JO0nf ;0pdA6X l;RZZlŬK{)McaV ne?mc+7窻q @@+/쭢Xl* />+R`NЁ b</=a悿"&Ξ.0[Dd^$cEQEQ Eu~E^z^:: ,sHA D;m rIz"[}Idbo_1ϭDz-\ o C5HY$m7y|^a~6H&ʯ mEQ#o `tl€4y ziXYl 4,tG: Jk>wH"ɨ1,SI%0. y݌M uYӃ3 dEQ 7)̴lESbE:YJSXvV2-qIŕQTAFAFY=vw=yyq??WETVL`u$[MZmSh&ZCu} OٳrTA:9(=S2u`m#߀ caA0Űal߾7fnc^EQEQEG$"U/!ވ !sN*DߎԆ܄$#c+aR~܂m\&)ZREc"uH$ Ϟq!|"?6~v"C(d5\Th+(ʯ-߫wAxno9ll6n&&$kr'51|ڍƆ|. Le c&V¡#܆jDZضp,e3[FJj]DUԁV#1B! 3; 4Lb_BwLx+sPzB0'jfc.`W6UEQEQaE%.nF*;:#i0D* >Cu,g`$ GH'#8 ҭf"! I,s^MI㱞HVc-%H;xL/"{"c}r9P(r rD?FpM{RLJ$KqMp~3)/l.Lts5-(b˜E-Th+\QD !_#;yfk&4崝Y ]ڲZ2dڇ._}y"u3o$)\> "oh"{N,TPLzޏ!lfG ?YeA$HPyt>Ӽsbkɇ+|? A"fxk{!L߈kDS_LXyW8Tρ $gI,nD((?I>TsI'|BNs𨉼OY @)͈ :AXV:,$mzztֲ8Ѝ]N~ٟ&!F|G(' C7ȣOihԑ==2Fpps?2<` &鄹҉d3~ \vCmloJuٵBDlcfQRBhcKoEQEQr7Ra E:F"Bs(/T"5'zSq!U$\LQWY  [ˉ mEQK mJe.΅.֒LY;wtb=&%,h灕N} d'+|Zredf8Aj!Ǫ}*c^PNOm/2 ~~ du"6 ~)082M~>| ,t{ p@BJ}FV}QEQEQ!HG"D(!ۅ YCn82"}E$](;!"v=! IDAT$xڤx4R&6Dۑs܎$b8@%P ܂t{ߏ{c[l׈\_rQ(r rD\kGGzф?4b+. b f#mvvRqҀo@sƚi҂Ћ=zzLobjF&rRJ,w Z(; @G1*j!^x9OֶXp";OC]]? jCCu3gBy9lc0_Nl1nEkPEQEQu H{DR#TLD۽Ǻ#CGq!Rۄ \-Rd0?bަ'qM@xNDs1q$; I` Rx<3sӌTE˄ mEQE҇>t \SD PBatiw#X᢭ Rqae$dD d&~?8g7n֞Ƨ- $*FubRB)+S;,=ZitnD1Eۖ]ʹ-d{T35qJhQ}OE<3v^si ) v7BB9-R |MTv뽡((Lwh>H:8<Hjێ <h4$Hv8RKD:auKBX xA4!6`>"kz/^I/ fD;$m5S@(%mJ% IZpӜ &_n f؎OVҲy1yYv' 1y/l9M9^TG2xYj݊[Nb"_!G;t[)(O8+"0LŎW_(97Ky" TEpfNbJ~;{w䯯?+ ʠsgp{Ӭl((3|7#d`HDL)WPA#MdHuIDX46-@=Hv6Hgt&"Ok EO!" ")0R&?3"q ;xͩW\.[(ٔ(WXF?J4>Ys-i!$PO2E|TX{S \<.p}7mTGN >PG^M-SO^dҐg/&cc"zJ_{*#jk=_`[  %QܞS֎X^47APp/+Cl8aK=H38EH|>QEQEQgLPA26w";ţTkHy>"~"rRW  .9f{DCDr m2L$#B X$[JƚwEjH"4?ckP{.ܬݽos"Ѕ1l.ۼ~ߓMٴֵ4cC(ӿ"#i%(;4bedHv;{4A$u[j,Nh_ }z@ %QEQEQ.xd C 'Rq$\n^$\Si |$?EB~~F#FcmeDxq%H\h6֞^@0Id" ?F^!}pQ^P/B[QEQ~chGz=ņ ШlXxm Q<|0;;<`bkOa c' p[Fj'k~ϺuiNFJcF8u-|]>atPDW8G(IX̄g~?Wc11m:ΔUKRٿ'x 0e/ͶxRJC4(Ž/WlW+((D.z 1H]G6~Hj9˹`x^+2L$ &DZ^~ <$_CߞMa+6̜e "y#R)`"ZV"z0pƚud; A` ly;g`X<3v:±l" Ȅ~r,;P` CTdK;EQEQPdHH="wkGmCdv" 6߁ a8$Dݍs:x_+q|IjBu,BRQHe; XԌtO@:I'w@DdC~. mEQK)m_E/Vncu_h 8qČnilͭlcudjz/mj!]T۰gCi0mmf+lY=G‚=N'8q&T b[3)%:ӇAV :wۤ8hmk~ӡZdU8LBlL !{&TUA ;EQEQELC D<#琮kTf$1 Iw@ȟ GnHr{W6nB耋rD"y +Bzˁy HUs^HPD\cSrQ((:vdzQ6&ڔ K } wN/e[\ q8If0$VIfYC$xʡusf\=`܋̺ɗ4_$=qzu0vv'Rrs9m dWhV” a@h 1^aęH̋=Ke-wHe(($!UȀo#I3`,ҁ "ӑtI4 ,@ן>v, L2qRbCSZ5Cz5>b/GDx?D8xgc%Dt[V(ڊ(@+G+3]i`ˁL0C`o}ߏnΛ1$r^[o+b.$p#43)ǃ^993vøs RWt,W|EYL#pAỈH5O7h V"Asu~ހ](c85tj NZXU []f,3+d72[QEQEQ,Hr9 X$W!C+!<bEdND~w@dJңFR@g~=H{+RRm;apӅvHXC?)A:B*L&" ˁa cHvqOp}fG*˅ mEQK#Oja҅,&J"x e,$,5u! >[xa0,Q՟鄅ohe^ Ŵ oVf1O5'$ԅP t\r"|/Zmv uA*XS9AX^~w,?|"*8u2״#l_!/LHx6~sa ee9%E((o`Cj{MJbB5y/,yJz>ӟ>@~W O9Nč4YβZF̓{x@*ͩMlO8 `I3pG7fN ɰnQ)4-^RP[لw0qwaػ,2r1;?D|-{3Ž >fdCo8ܸܬ(<⦛VCaz(((4ݐ '2HByp#"w {kQ "j-ȐI7R{翆HHDY`:7F(J.8A]lIj鈨o#)D1㚁s8HRQSTh+(ʯ ']8p5:#I[|e[B F $݌ԕFۥ_|d\c.~*8Q.'*EQ.V(W*.'O·s0xDZ6V^yq9\Ix햇[% ?^ȍ3B}›ti0i@E|:B ְ-5D5eLEɪb@:tς`IAL<8Th&g7E^^477͡((\Hc\KuG_qX_sHz%""#HRF`%b)X~%^D` #bsVZh P(LnXK.O'5^(pQsK QQݛ=Y,`EL8J 0E= 5UQZ~/=čKQQ%I Lel^ø1iy[8$((ʿ4nb`:Rq=R1IS1W{N1.RDCׇHMH{ ^j\YvGZyv_Oo !ӑkc}Kk-HEHʑHHc=d8\[(J%t$$yu8Q8_ !]`l4C 6[ o>.{ D&ˬi8l9`p2L5?I.TI`{|ɝ6<9ga}fe|؂y(>Mte(0v9דqV|!u®]~xy^uJ JLp+3$V|l6L9So EQEQ Hz9n+.lD(HG8RU2ב@s`MH/A݁F$e$"u 6"G aBKlƹAdBYtv/1!U%ڮFDw8EcezkI mEQEq|X>9h 4З_m =̜kgrr?:0& OBq 814Hg.ArBFC%J# mt?Q$?]@zFi) rYrLd[_BE7R ^\&sƻI0N θn2 GÍk/ER#ܴ"b{9dWk[>7rd!2u#C(%J匱t񄖺w\{5)"Q IDATsӴrr`m#@-`)I3]G1,Lb@ Zf"ϡt$+܃ ;H>g%aoC(h̀Z`G1fckEϲ H~r3yD*>"p) PQpQ 0-G8~YCEL]cgһ9> á7((/cCٯ"Ry@"Tu"2l`? O}#v!$$x qޗ?; {p6o]ґHy סHmPD25x H;IGGu$b=o OQ+QTbU o$ʿ g#B.?Fn(˔>@>P9 fqFg+hm*ePdc>-$Hl1Sa:ňYt&2șDY o702<ɳqѱ# __sA)H\$de>n bk̿?Cس̈sDEQ'V$À@C$r8"}a|~8g_DdF$4D? <h-̫$pkI-Q\QHxn@$uTi1^L;7cATh+KhoܰN9EQx4\ɔ|Mm9S q)y#2YpGw5,G^h>fp95|̠G kPk^yLѕ;PGC"ՖXP #kC;y76L Z( t_G9 [% ߦ|KA3c>eY `c70&;B-%>4#mE,b7irrUw#=}}J6vH#מ\kN3ҩ M]@C-sP9XқDEQ7(D#^$?\7 A*z $E$fdL"=!l!&|ToA=(}}s:NqcpHtu2M[p<xpz(((3#iHOVD,Eo4~LHH:7fʋ)^m???_[QEQE}ЉHyVC;I*'$0 w E󁩈\@*J5C=bӗGif^s^6~$S";"Fu'Df{Bo@/MH} EQ>ݟJnm)!8p+/D?Jͅ]dZbNHKՅ5Hɸ0j$'Yu/-lVQl`\d$M^# ##LLf2-:7آD }|X1iMgq76$瞣-M9J sC)`VONmv\4:W1a¹J5Wkk+n[e((wـD _HAߏ$S:r"#-4 bXF*F.b]\>1#|Cx 8$?Evi+Mh+\Mh+W2aa,O kF~_*G :Q( BP\9 sbWsO$}ij!5"ԕ$jFzG g3px hL[& b=91}s;1c!B|\>t@fANV %&P( ŭ(,:X-c.wca$(#fhnDr l'!8 Xrj:9Pnue4vK?q)𮵌Ouˢ!$ue/a-8GtXC4D`N>[HgsD1u@+ҽRl}l#} aq=crx`61#Igr'7X:(H1DP( Bq GB>^$lC둁 1$(bBn@ g2DrR7x؇~ʒHru@.$EA;F ھD#l `vL_hk\C4HJ}Y;g: BQ5j(&c\]%LK&=-\[˼}vlҟcK/VK:j 'ӂ(a1y Ŵ†r:NtZ؅|No lB\Ǟ# =qa8HZY=܎17A{i•pw(ϝ Wl,gic$0PDnot܋1y_%ߍ?i&e8{;`f EP( B8ѿ &dXd tJ?0V p[gz/b|hs{:j D8izx < 9܉hFR@ Ę6#1{ u!??Hv| I#aB;U[1'!C* !Q#2 2E% ƕX ٖ̽O<ӋCcimRB!$[C"@1<5s$o#ˈg6Έ`њS$2^Nb'xn Ə1q BڅT6w߾O!xҁR=mOa×~ݑNLcYZ&{22ᐃV!<։p:Ġ1!Cg/$`O6=ɤ96Sir~BP( _ŀԆ& o7ԽߨԆ!='jcH]Zd@䫀??d=!rgfΎDOf`f1# NA; t Ig ,kv\g}COG3#~ IoG{4Ռ2 2&s؉?!?so/>୑ xst`,r6w%DқZb62j׋#1.~HzMK?D΋ɱX03hȬ/߬1jO$Ӿ[*web2\3h;/q&D37idU'yM1:{"ie0 y/'Xr֏u biy*sHt! BP(=P1 &b@gj$"/5~T[İ~Hq$ dl#=133{ ˑ!HB$Tod2bjOӎa; piE\DX$W(eh+ Bqa`e73ЛB@>?1"hh> {Na#W9Œk+ n*qҧPA:Ё L= ݁ ^Et&+dI Z=ޕ>̎GVjFwڇ$H;x r)1(g)(CRٛ#8pX鈤Mo!)YHIW$m}H0Ġw#f{BQ\ׄ]p 51yƍ3grl)1imT׾*VTMZ+@nB`2rb8>k3Ny`¼(`"(,}ĤDqS4BP(3R+G#YԈEw"]u:b/B# vWK[W(D3z)Rt~|@"tFLH*{݁}Xu-֎ ࢽ?rX$!a>7G*XjCGu5ssO|)ÇM8;;so^g֬F~ooUPGeґ}x 1 H IO>C s+@Lq2#@z}FD!?!i^ںMP ԒERj2Ջ}udΝI@Zj;˩[/֭;[ Wm+WY[_K}}0w<xX,ZKP(c Cy{`c@|\$Ob2Z勘/xѺ忬j&̒~7Tx,&M826JCxld62fX2p@O }V;ǀGs569CY(lۆ ܠSz{ mCsF|Gi.{rDG-^7=ĤOJ+rBqQ[ilBPD1Wjc$ }=FL"mɨ}(A>S8B\ څཧa4 C )YsOC W]&e : n87" lb+<6C@7Jc+P(YH4"1)|1CLo#b>lC!#ҡX0,1kL$\bזQ399!)@wm$$R9dRيj1-|=kKroS_|1G0ptteKi۶7((ӧ ÃBP(כ#e[`&Wyt`ngGG!QF@E!lv<БIgX(1;zM[NK94=x(\#`Ahg/]V a?ѫmcƉCcL3a+%=F7qŞVlޗ qI<  ~[ięAgt,$3c8q~\Bq}Q[ilBP B=du 2$/E:msy|b#Ilm}uuޅۑc@ھa 5jq#f"d0eĄGBʒT4A}T*g#bރ L"wVT/R9ÏP\\?̼yso,[tsS&OG^z#"zs-?x￿\`\R(7rDQ9H7:iD'$~ٞTR ڟUGg4)"82xjMu`Lntkl~OV;pg/pڔtdl\#N%yJ<^500c|zME`hKap<Քy<1*f#Z:[0 :gփ+!_euxfrÎloNx3,}1 a蘄MkDqQ[ilBPԜ>U"hb^; Il#i'H>HH9`>b`rax6 <@LPTbhҿ?:uW_swu^>>޿Ik888`фoU<[KiYeeٻgsujbSZVƢE}UR(5˪|P 1q q5>~I'. dJV4 ] qaؼ* <#V~SqGw~8 GqN nT7Oe){[iΜ9SD~ ?OZ?~71lڰ#RXXp*nz bhg!2}q} ܜrSlXX@|:nƱPj ܝ]}qʫ!^z~"woz;?Dr_4i{Ӆ.x֯xinđQtX0dj}b 3yKع?4'QBլf~i^km(6m 9LqЄy[t? G:餥kEq<([+]ӯqf"Lӕ h ګĐ^tM7D6~tWW։Di^BRߡ@bu"/f_H$}حyHxn mbc3p@{#m$IOR>T( EըmEM%, 񐟤'iY; ")Ttrj~g.[Y`1+Ě>}zL^{h8Aܳ4i͏[c5O9hexQB vQ;4ϰ&FФr|A^D )uiBprZ{}ʩmذںaیl),V6?fJ:B %H#]](=*WQfBPTV~T>6 C ~MG<]Y?zt/b?ؐHa=Xmbg '1ˇ# `~V<F]9qn3 Ԏ7-i4 Ig@qCl28tK 8&eh+ eX켑}c& e}?8b(.(XrBVaJc̓0~| u}5g:zs(/ף92,2 ՚K+ %XBc?!i8G1iq\عMӢH5nD\V Vq?WrM#-%P6ͽl1ߙo"ۉ[ Ҵĸh2+|ѷoc/UUߡ(vvv$(n}c.y\+5/{N5N,o)͖_$22.,6_Kr8DoRi[^c_N CQ5Do׻nDrU+<1 nRJDR.)< 7Y{BonЗJN4gg648@*$.7H$LJ&bjSr"@LZ ]̶Gœ!)LR$z-Wנ A^<<(8z(@:$wRˌvuu#ޗJ4+FTϴ65*+Gnt5ϯT?_/g+O1"sHGmb V3>L/bW OɈy7C[_d@ 4 tGL:Qx"3" vFLonldpcH%`bt@Pf#g#|xghǶ )s7ߍXQׇlhSojmu.խ%E|)+UV,SuOF2lw, ܥmO`< RԎbܠy@Bdz L>F'͉(9ʨSL[.;0/vaC{&aJhJHGSTxa2pt҂dPSNP)-!Ӵ Cٞ즋.zWcצ24qZOlIL&7Lж-LyU0-;ĿjS$bp ($;+{'Qt'&LYMPlSK*=J#󧴰B4ԝ<̱٣]&K3? I U×/5ξ5P k-ͽEE<) {Pr5NP9V01/S6Αܥ= +[} 3X aw &c ܻ%wDe!\1 /aɆe~kE6&"Fю)TZJwSѬ*=J#OaR9}#@yX<1 y0'@va1H l\0s*w:  {tzsN뻁Xtapel"(О[Ԕ(E ,,]h|d׷nW wo2),kEqQ)Vcynpr2趏󟶀]'O`7٨ ~V/0 v1g1ΛtGB(@ YC{29]jeֲ*wqXbLa"/<`ɠ˳jqGY{3$/),,8&}:1?k.| S@)zWV5GҐs n C7FTil U9:f=L.ip̾0~4̃2'KA $ k߅'0,V˥pQ*=i |v}Du%3eYD,*f{~0\bXHw;t Z060>N\EkE5Td՝'G[ory-_]3Ft+70%_o1n4HIVg?`ףG~/Zxņ78!zEaPd- t4XoЀCBr=q_>?A+augx0NE̳1NJ&0{ ːEnx1EI0d=Y18l.8ՑGucO S,sGt+nm4vJ +Q(}{B[ ..ީ"C(0j.o^n\_vfX W q` |dlyl  b=p!p?#cad\J#_z^\,m{˖.QF1xCܑ bQ`d|:}GqYl=9[CwB`,$/=ډY8xf6|^Ya)vw < e?ծն\> reXƮ[iarDqcD_{k[T#5z gk?8# !f? Ln?Ao{ )T1Bt1LdC :C>j ޳`\2 1w5k[nB?WM51﹇+WSOzjo^5>Ç1w\zmf|)o'Nyf̝;wySoGޞyᆳ=Orn~])Mawb4cZN^cnYi_O BU(n.˕B^˪ќѡo`aCp$aQe|q^EՓ99l&!/d̀\^e)x{8;8ÄH51DGozcƌ7G0aP3  [Z6,kr,V),Hj>^Nj)#gk0g7!:r|b q9A^^]V(ήK^st@m0  ,Al$P lG:P} d>1FN{nm{?h 4C 4;-% 0Nf vaIGk%i_Hh`+<)H==[_y1yW^Յ!cW`h'F]˯ظi]tK}W>}xaYwww}3g\c#Pܬ[|iR4W;:̕Mv>?i u j͚CBHځ|g=3Ba>$!C`ev64yH%XGlcĕm1ޟ !"d O3 wqQ+  n(*Kbi]L4vmg-TfV.+bb 0 - 7{bfΜss!|)ݖRGy-l!0=twNR9''ۓb<8S@8OʥcOhof6˂ Wy~ֿm,ƾ5;U9:Ct.|$p)igN}06O7wӊ;j`8L8]g=fxb.H{h+V;f #neЪ Nf c< )rM1$ 9C87w~~137a>eD6CXJoggA]q:/گ-:s9x{CVm?^4Z _+Vh}cٷF u =b4;uRse^Dmgd"ǖHp\Fb IQO<6QFxA;!Hb6p(ER#&ye `/ࢍ |sLHs.!HmUi58\zw^>{+8p}%))@[Kv^l< VR?SBϺ+ `h+}ilQ:lc؇L F6HGK@@,H8;;3G_O#8;3#}-ߠ׳2O)%Q#7^ ʷܿHV|8:]ք_ F1d%p93=S\X@ nOGo #ؤ"(HE`Ib :܌ L]· {;R4Ԧ;)`H@(#b++(Hcݘ l=$N4p,-- -̀ '/K!T)}ilQ::dvF;&Wpw@-Ys|`7R~*#]wEJ4_[ /ŷڭ bù؁Lx,#A K}xG<ǣ2DGRW:k&"Y6ؒӋwҏ]@ri]#8^~93Cta3ֆW,`ur-'h*G\BXw^$=Ls:y FtBGCFũY)1fvF# 0`H 2Hd$kDqskDog3-|⯢*Gnξ+=nf!]M|DR5/$ݼ$+ӵs衝e=01*D+tt f 5%Wo2Uw6QHGH<Ĭߩc2QdRy8ˤ];4k~PTNm۶,KuīM+:սrFjX!󭆷&  )E8zBe/L*lrC.}ҟdDP:bZ 8Yssaf4toOR3bg$LbŲofgJCX^ _2aPwx݁q1b2E+ ȬyWDSc[C%ƃͬYFଏ (?',pv"0l ͎J +"C_t۱fE瑊sHGO tANA V$=鲞׵\~X~ָi)Ry`FрyrdNmg(h"SARf1ҮqU槨jKB;?\?#J܂6|*7Jȍ|H>UkJ4:dy`xzKo5\ؿ;CC~s1iI>z=vd&Ds .6BA~|>EwYKt(f<4>Frz&-)68sU"L- ^{oX1[f/e{o-Lvl#A`XpB#Oowti k֨BqkhDmHFI~|l=WTgJ[+bHzي$"U$+Ib =۳ QbL Fmz*I´ߡ'L>Үc=!7ChqEZ5`9VſH1Gfdvu:2YDDQ\C[QoCJ_O?EK4ߨJޔ6+\5?"  _-1M(y\8f`ȈFjvtK4 D 1eGNb* d)ܗpx2u W:yd?3PUĄ/<#?v$39})nQX38AhEVHX ]X^<1^tߓ. ҈д> I?BqQ#T_Q'QڗKI9x1S3:h|$H0m~ČijvBLm5ԧ;;hi *iwE@?%ĐH?Ŀ@F#fy_d\m󴱁_ELY;~PeoЯQLKU׆O*G7B!$y .a&lHGn=<#!6d]9 w'DafēH"p7%'8vя$ʗ\J#]^OpHq6ōЌ\Lw$m0Ԯ`=bo@R5$.ڵ5Q^Eǝ$Ǒgf#~4% Ā'ٮo6{--=~V &}voGR CQ͡*=.prt6횙Y=a46 Ե nh "#wHx5HHO2i $`"f$Սw8|/N`X6A ]iŝ\Jqk&1 n Ȳ¹tFX@ 7pp3;0Q ʺ=]R;ww}'MY..qќ,E2[gH:UHX^@aͳq'#!Fv$9-rE Ki<lbb`fyyط: 0$6blcنkiDoq3haՍ*G*=+bOB\݊~ \tiEjA|YIL#@#f$}g)G<9KBÆicm bWmA ..RGRtIhco%s?EQ?:՟ !wM,Be#}aQTma˵'rD3p?yItr en = FP0G9W&lr<ܭ3X/K # =b8v::>cc&v΢G8 {c{28&[CEP>{O[ ૹZs/$!=aQ 9I FYFi E]k'$msdQ&Bqk .(-P\c}(z-@)bE&S| 52! ;zF`2Qd$Ev H .:AmΆPm19ژ4 |6bf+U2oA^@)P[N0x)Bc-8g|f]@ç~%݃Z{w!8R8 d8nʁ Ȩ m /A|O6wp@'oLMb욝g.r?F^)C\RJN%쇆d?RpЋh f'ړ0Y헉F9$`\:|20FA:ODYDJ*P( BQTV9PTȳVhG Y*Ĩ}nHT`!b,oz"I FXDTƗ%Z(h{j Ɔg)qғ^ttmf&%{|鄕DmYJ53S|s0AOZ"tx{>r,ñ ;sxR7#\2̓; Yه6A N䓺6Ό`cWy0/7FS`3 M ߜ 5`E k\쎘K1.o!"9gzҭL{4?H;pF) ൴+4# dI` ^T{  !HʇHr1AJ1<eh+ehߦTfj$Bq%U(ՅJ @ hX#DRL'FGrb=Hߛ Kv&F3_=#n-glD 8F wRG|KXyBV4kD3{ݕS|cC#oD9ۀICEfk9{S'tɇ'>+]CpՙbO6g+]xv}oMꯑEN.BBq 5Տ[(ĞTyLB\@ήad\JF BN퀤O!^LX 3~!tv"&D.tc@ⵀGxvPhIfK8ؠ}ƁQT!{s''':w;#:"zݻoXP5ѭPT'0҈E4f.SXH\JA52Wb̯ )qoШqrrJi(o#D0}g2R6Ah8}Q+SFEvA?E ddyS.Q@'Ynfudu~z.L0'߳Yر> t`\ȯi'iX- L&@7___Ձ&[PU9XSي@AHu=$ 4G*?Bǐ T$}Zh^k؋'6t8S 1'! ҤR B!sF$G:wiӶ?I{MJQBr]PPΜ9sՑ/裏_XԄ7 ş*Gc 1h6Fqd:NeeaU ӒI n:}Pl<<šP :Bnb5!0볐$c_qe5oZOt$nݘMmJ( kh! S֕&0v9 l2aQte "[aMh:>L Bnk2ιT(ƮL3+AU( j nĨs<L- 4B5>If T$=1k#'iI;Za;-9ntsyR!I]Ҷ |ثI$ Q <ԚBQTY别+&MCFܹsٸq 2?FU(3f5Щ}i msJ&_)Y0ӕx@1t~-@_990 ܜϴݔ0Tؼ6GBRՌ 9~26h0oϤ{_Spr? 68 _ Ɲ}cFq $ -ƇF7;ˬ HwNH] ؿJ+U~PTBsbFiUtM;!`İ Do!)CC{_Kz˶N['I{$_A;ׁsUBZh Hz"^to/GI. Ƶi}66&Xfh$!UGjTkB*jV)//d21p@4iBHH+Vח/;Ҹqc֭[wqYnn.#GUV|Wԛ1~x ƍ#?? sv3ִMMMv]# ŧtdwc@~~c`JA-<.Qwp ,X[ךΝ/ SgP݀  E!%zp%6 M # $plۡ`ÄdfS6y#g|c`0c&D+-}ZZ9JvHari䞓Yo\`d;H1c1=CG= S7uɸ 0Fc{Ex V)s1V谵8Pp0x5|'uI(n*rssqu䢓#U EryňQT'OYÀ6`?҅X\Ĩvh4Ş] .ky=nlB; } B߽%IuDB@SҐ=UfZ'Y&$;;Yfg]\Э[7FSO=E޽6=<<ϧN:X, {boo5@ %֯IXIc^" eP@=8=gmerOP+ES?(g!|7_&?!O̴4+V-z+#45u.t}tۈ a)|»`[ԧ6g6~28r1h|͛Q#4LBҖv3(NqLE?뵞!bZՅI(**BWVJ*7 ]4a fyKK`umx5Raо!I1HH2c>m"H u+Cǀdmǐb;MgCG#@kGLrׂ*$?? i9!Cԩ_|_VY|9%%%|W, ѣ2tPu5B!#q 6muaVc4.jNI MZ +L(X[~ihKמNq}3~Xp)!KHci,,v{[#,% 4:ṗ\1R]1dҍn/lx1__,>zf4F.aWb~'J]4s`7zb՜;wQ([Ac_XE&?L 5)RR1!3#!÷o:K?Жq !D:mH6~B#7`FdnH`d# _kbf{#uBKst``:"PdƣP\ jUz-|Azꅓ.=<y;H"J3[oOqie, %l.N)Jrǣ@)n@#fJԅx2e ?<]v]CP(nET刢bEjGSʑ^4v<Ԏx!1DfA؈Ñ; U#!IoOD*@汇S',@oW{d I#"] mk}u;hLBz U(,׈NOOk7f˖-2!C\|>y?\DFFxy/wݺuY|y92K ݞfenjVGر%?їB/gu1d Ċx-ad3Τ-y8ߍl71P_W|b1`.Ut7:} '>O-*nt{'Į&n6;r$"ٳaoM8WH] -)VAt',sG@`[f<2\SDG>b?p\]Fzzz^MClRilBGEuƬ}mj=Rq'ҧɳyq HCRГ!~8#; Z[#ČDIQaAO"m#Hڊ$"bbAjG`mýfk R ]*j݌jѢ}]ve…tI2+Q#O_'F&dNS&(:}?D-A8|> L$Y$7pf/:Ĉ,;[𤩀\|HI'ܺa@~$Nv6p;V|b#n6Ns{LD0fZ!w;1Pxn9KCf4;^X09Ġ"S,KØR̘R2IBn'ĩ CP(kQTg <P1x}1C$wF@`h$EmD!H]I,n$0/HH9b\|z#BnҖGfK{"bo^G&j3Sqam EUqSᄇP(n(rDQ] =YDXv;2GwCp7!љ-$'N!HXII{{, Mtq?.k7`"X ȱ K:}iYoudy%[yIbW$8fϚAzU Ĕ7krnI[ן!<#~vtޓNĘH[f3Y`ZYq8,5^گ *;P( ŵBU(;*I$՜@Ln1b"A:_ԍDeÊťHvs G{n`+)g? USSf هq` IDATK})}JK ،T!F~b¯ƩPT%5!P(Q#Ng°.$%1l؝82 x -BH8r I\ͩL`>fL_ptklCgA`ݹHiq&0!D=m3ݹTdWF/#GS_: s$yt`"(2oOA%97z91BId$-wSAܕP( W?V( y n)Mw}7R ܏9@>=^ ! 1>C e#CHĄb8ĄD"u4BS 鿎z"tImWkE mRY۶2ׂZ( _ ŭ Gޒ"ʤ s }YzrH$aAfg۸ǜٻ B %lPv;cG{,3ۣ'9ac0]);'r/ui MBrpNhݹ&DFʼnf4p%S\ds11da'}mNnka!~DX 6 s|uq( BqP#肤}:X>H*9RI? 5"tQĴNжuIVF&eGLsb"j(Ҷ Diڃ$!=ޣ5]Ԕ?{1 | =1#=da^0'"(eh+ _..@( .wu&3-'#!c"g8?eMgXu & ¶PBl3 %fFfGpY!$D79э /NpG;ƼcC$~YC~_E%ׁu#?CCXJpqugmg:N^=:pYdԥH±X{f .] Ga=r# BP(FrGaM ҥ}L{O2R1Z{>F[/#-GjGj!܋$m" Q[͘1a#q6-H`¡$Ę?m{=2mĨEuH_hoA&4kEڊF BTthoߺPImE:uo?EұuV畋>S_tCaJ\2ذa}k6>|Zk1pfx8x.Kh6z'Q^8zԣrSH!r ;Œ/:ρmoD@qaэ_B0wz@q'h6"Cu6Sa=,:/EAAT7>6v7f>}Mu'X6^T\LŤ_ EQEQ_" 银 c=n tFV`Ita@` "2q7hneB<7SdHA$G`q1NDQ6>w,8nHjj(?*EQ~"[v{[7ߞ=D14WW3%JIsBd[ٜD p[c6?2N:a,nndҒS>dK+LA$iWHH]c۽v!kl?_"G}pҗz`q>)|Hw 5lle$oVGQۉ mEQQ4Na,\Nt-̇rWW.fp!/2$x6ZouEP(ď~C:gLAߙk^by ,)u04&cV=0 b_&•#PTIeU ݐ[-_,o]]havtdc߾`\.? Q.0p|N_ nCQEQE =HHz"`F;8oc"=Oݑvߐ\)"@8ݐ$o|p~?؀jkPŒ筈,@١HJp7"tL$8/hB?Dee%O>WVzʝʆx0}I=Nr|n>kKH2}[8:$M bjCgmtCܖE3f +Wd,Z7xϝ;ǎ;عs's9 **_ȠΝ;7TQ d,Av}fL+)& +C 8sK&8qVHPbzPJ^^'(L2( dg-6HG|dsI!8GcƷl1'ɤQEǐWՁ)(`B6[5,50$H `AȾ)\mҠ K+]zոuӼLEQEQE癇 M\HhR3y6<ҋ]`k#H9xoĮRd6fRWtr bH.y64c1>lv ]K4s~HQz]`MQ{I/1V~"nжX,K1|p.\w?xyy1j(]W' (%hrg@n2'&3PB)gv]aTzp״넜I]H%\sL gº93Kp~[.BiHl 6v=hMk:d[B ydOy4#Iࠬ޷ek鈯-iT~]E d5?tLYe|@?$`- L4-hBFBڰnEQEQh7v y|?𼯱\ݍ⚩-^Huk$} @DA>!%Bj?}܀ :U!f&pow_c_Өs^Hwo= $c|.㱷9L֌D nh\DI-B=W9hfqԩo[Q[7~ξp$gBN'_CRfd/y<H$}@VZVڹ o_g8z6@ɝl/i.ӊ\eOe2| ]p a'OqÌFdxcvX4:COr}O!U.4\3b%bq"SulKF'B2[~>ɧIIe.ӈxYQrDQEQE5V ǁ4D!M? "yH}G>Bw/"4C:K*q }_אoDB77s ?сT1Iz"u$M>s\ 6k= n5ڄ#q ms[d___0LzeoEqI.88\8of2[pE|y..䌥' t2r׉r"8P R'lx؝^[9bNqdp SJ&OI)\) ;&AlOr7bӧ45 2كl  K0HJl,MzO"; Y5@2gll,B!/ ))QEQEQ~&"}_EdAdVM"Az'G+nr`:݆-9dvʐO,G+kB Q%Hj}D|߅݌cGGjG$}+saT#D?h\DI-B{lذS=ܣWYb2[QED4qr6eFC_} 2pӸ gǗǣoPp,[v͉$f!&|A;{&^׶ϼM[qÆőћxte\|,$ Ń8-}6eBC"{\l<[m( Hl،%}4nCDҞE̙ɟ"'_a mEQEQGQ#\t"^ t!L$ GYDD5V,֤baBjD8H8CpȞȌ DZ7EPDc~CCCF 2gyҥK*G+G;3U15T_h\K45( [ wU.oL p~ Cxu'x w ,|`4(9[P.^*e%,G%Oxv]3Y|)nv#a <Y7$+xG4aU\0Lg:KXŽ-<]E+xm CQEQEQ8a i DRHz~$ c $HfH1o8ydžY4d7"_ǿcy8f O""'"޷נ CPHE)e}sj8 uG߮^/Eϡ#ʝ?4қŅ rdnO uqf՛.i0\ `gzGLaXaLT7Y+-ޮ6ۈ7BKckAgpbBRȴ$&LwH`1 0Cȭ]_EQEQLmY_ozvIowEJ"y^D6< q4!\J s*OCO|*`>"A*I c\Cz͈ߣIWۅ mEQ@+G;d6II4k܂?ɝ-3et4' `PE:{gH bkރއ8HY8%mi p1 Zyҿ~2sbK73 g/^e+ל[O;.bKZSJWD8Bl.."N-N@<`KT ͟xy``((((1!2{ldhbk㵣HD6("O"u"! ьH?pƊgDI %T! ^hv? AG5Huh6H5Jpӹ4'I@Vn*EQ~QdL7sy~Ca H+wѳ1uA9vӊN^_<&jKS`# ?y)qy54u'㌸ײRr%L'%?g`8L`V7s9 *[nLң i0ͽ>t(6Vˠ9VRQEQE52D ȐW lChDF#6EdY x.R1mE u 3%QHs ; XŻ""}"S[+b3>z@fw; Gel+mvB[QEQ~*gtdKqbVi k\KQkp65Rr3;7s!VEQEQnD!bS$ԃD o L# Ԗ1Hp$87O..ě8Y<<Ԏ(5b 4i 2>Z!hjaZih5"c+I_E(#ʝM06Nb_>i8D./OӶ;-96+ݟnPqNt",|@QDZk!NTĈ h,MJNrcYlNrx~`s@64!6y;\' F28 IDAT 2,;va @zfǿY# 25%((0#דZ1@rG>DށnexMH9Dz?; B:奈^f"Ϋ@}I*^ر>`iH;Lx8k}:"kvEڊ(?V(w2^&+ixGҚ['"b:poeM>:r/?s#IZq48l;AIza# #$x\8itِ\ g@~>Цdobf2^'؏!척lГQ<^tGRGwO{p1!ng:o5$6^((( !It5خ7~:uCB xD2F:Fkdv <g4ڲqC8~D`$S-Tܮ#1WMkWB Q((0̄6 1"yزiؘ oi: ~= Mg5ϐ-Tv|<%x0" 8RvW09r.$~>ݛ) ǫoKR0%EP/L3xؚ1wYv~4( .y~7fg.S66ffPd' z2/U5NJeaNVdL I׷^^ 'OB mEQEQ ecX3D$e0$")Hx 2"R/2I:"Gd0h7et:ҀtcsE46n^.yvx*C$M.A4 jU&4wo ,6 {E8-N*e= [Kb[h4>ߥ EQEQr@z5mR5r}ڏZD*D*E"#2q9";" \'o6x&u(HRUDB;5mCHR<8ǁq>86D?1~'9,P] $JSݣ#z  $;pӜ e`:;N*2+ciqՒ\g{vɟ^}X^Iq,#_?GBJ,DmO 0It3Ѐ(( IU|HryR5I3Ft""| 8EHj: ঈLol2D)#R.jD\7@v;v {5U$"#3GR-JD׈H ]kG͏Evb(rG`\CH $n }0L̤.|N6^.!fSJ p=+3ߠGҌ'UuֲV hEl| !%w?WoxRN<`.u̞Q2%: 7++6ؓ/N@,V-N/SM9^BCs.+" t3rrr5(X$}]TxlA@{:#2$I=IbG!׭HBz*" 8v2p219DGoC 7D$7H7v5$ "Q@ү]Hill?8!hߍQZho^-EQ~QlMcNJr'`#["9̇}+^3jNx7FPşHcGDzր#}ۼ~Xm@N'3IPA_,slmu=Y/{bk緥 vwwR?Z?~\[O, ]锟KMԙ`lEм m縛7i`kH)#45E鏀r^(~t((w& Xޏ$HjĆ c ]]#U"ӱH'wұ鲞`lEX鄅GF"$S4?`5pSo\V$u`ۣ~0>9`80I6(VE4`o<ԏ|K*\’܉In˩X >E6 ړ.,Cl6UE3:YHNeln0ݬM^~7?^#((S ;YLVBxgi1p ÷):/"鵸AIA-RIu#Isr*\.'JW13,c-FՏm1DAZB{rLk2ƎؼY*XEQEQ@7R3 l@D)0. By݁SR@zD"i)Ҫ\)ND1x! t7Q|ՎdB#?G0@rNfo))>'){I)K% .2A||Jhڴ:(((ʏ'z& ؄G+@:rG? H{/pΣ3HBdJctD;~0sW,8xDB;.H8<"?AR3 2$X)1)$ nѯrQ(hB[Sp4 ֭A`Z8t)ݘ\N-cE6/V4NUםr9HM_<čMў2% NgC|.'i܄S孹~?1Lo[oXCAޜpmb\yV١ ĂD8䒋'<cU`6> qt?EQEQV!؆~| @$I5Amg!;HeHxoT\> 3"o\%X|"_ M[^327\7=,Hj 1{-HZۡ_6B[QЄrr{àbF9u]#UC|=ә/`gH1l@:]䋤$^-!!F\5AN׸xԸxNXK{b%SO6<2}Vdw<$f>wd҅yr&9FD/g{$E$SZֲLe^WTeX d{ qvwDQEQE5&!:o}x<IG5DtOEj@&"]%6@K*!0d` I<J0#8%ƾcuQ$ v"2;8 ҏ!lj{kޫ2[Kp{v}~?č Xή@V@4e(Ľ[z@5\rs8iFcKzCr4*3 ?IoX~2U;^\)c(:ޅ QS;.]hтzszC_v(\0 l 8I3#ºr&'92YU׼ 7qKǩVgNJ(DŽqָxTr8yt~&"cw;!AHyyH?" )!zPLy$U7c\3Xr>N`$xnYÌϚlFC Wۉ&PXQQ;csI6Ʈ0X)/f<]} hj||\Y~oSAbNyxU1?} p+0q *Q^VLzXbtms˛1A lyH=>fGGKv t;Q8%6La Kq6%! ]Dl"m8JSt'O g S%TR#O",#FNJ(OCC>=Gz?CjIf##3~@a!D@7FR@$}IFWW}"2Og1 Jb !b oqlIǩ ty?O3|֮Rm _[7rƍcEQv3xOyF> i;nrcP N hLpBCfur15Shs ~r5O6$xR# A; +V"xT5/ǒ1nf<}A{L nx2 z62\xgG ;J6F!{:oa9[C|oB̾tiVuuv2`Ci.+sQV溥NJ(ǁk1xѻxF;AHH$p &y 7z)sc6qaLQ}H^C`"C}/@#b H)z (HY> qfIX$mFx?jThBS'N_nWx ط*rx|Q_ƛXWXKbZjIŚ `{a#|SAN$OO?*_?FYzjYTՖ96UBAFN[Ôt+Og)B^M9|.Cq!l޽a8h9!h><&=d6ٿ^382('A'$H ʈJVJ(?V((K>i9C$o+dx]ap"IL@H:hԃL5Ir@1/YQ\I^Dv`q_MԵIX?$Ͽ~9>DLxD!5hr{ʑ_Z9(E[ ';!=&4l~JII*/8VP}=y[1q4󅣁:alf/tGl]i7-tΚ#y;9 747ÁۓNAnɧh^zl;_=@,QLxnlv͔YErDQ 3"H I';#Cj$)Ñڐ1 V Ew_DRmOC=bo:QT$sik;g3#7#ڌċ3~SnQHv>"iȀ7CQn'*ܒs}(^!$$]!#LQd2X6b1//Qɨ ^л"*6g۲H"hG"L+L~-dG zT0aX%9D2)-- ˜˨.x}Ii cHAJi~wߕہ>VEQn?6$m2SDs7Dno4HW($qNd Qp~f1Fr-GTǚHHuH7D§SfsHgwR[2XKȏBd$ mB[QEQ~a{U_:)&z'zCWDqE*+bۂH"(,@0ȐP@!CʄLswхy͕9=s>S{cޝ,9f̴q+MRv Y+mu]?Ӈ6'\afHza"r tW.6/..F t-64 Z@ҼlͦArL$ lN1q\nui4J IDAT2%41|8YSĦHaZ63qIrV5 T6ȵ1P( Bm/hۜq TV׭^/5GHHmH\H( Dr#㽐KdS>m<#Q&OhNEB]cyH|lmNo!"mN .yHŭA B/Po ($&? N`at _ƣc6ʗ`|hБ}Y]dp p@{vq:fAc2){ɍmO@}w!*\cȳVAZlŘ 4EﶬƌM,B@ٳ!c23lHvօ~w3B"\> m|u4 kBM71@? sP( BP Ɉ_7!w mߚ e$ "7#|Cr#݀|5nb@CH\H qP4A9Byh}#ѶMBr7"ܰ]Zro?sP( şPBDb%p*],fDJ}17ɀ\fGO<'/1l{/&)%ZidNO8,`kV 6p$q WRICpF X \p6nmٵe` usKp)Q6L)ѻSaW$A(Xz;V( ⏃pG6 ], Xi@?D$T# qy" K.@/2 qYFAU ƀkZ}4܁Di@&ĩCm|zj Sm+0W[^~T*~Cj[}9ȟ˪V( ş L62o99U,D<+;)6[@"lLg<ӛG5pY`VΙI! % 7Dw =OA2eiܫ6nKIEGeXÙ3b= ( qJ |"u))rφ3r(n/TP( #LI[>T6Nd׊D|8w"7(<xBLu>&Dmo4qo["4!n.Hι@ڜBv(`,.p~ ŭG^9sR( xҷv 6O@Zx82.i!~/¹s/߾Lm a|<(0Ex63Oq$+] ~V(n%7k_z]fݏYV&L#OH~~O_d)!9i |4_|9Ѡ?׷]zQвUk>lOwsS( vï42[-Gl~ SKn=2n整Ma>At ,`gCyU@P@_NP_ ڥ ο (3}p3aB:_pf2!V(#lZF#|:w hϰžޙN3:Ѽ9 C`z/V5BP( @@Ht<}h]gs* ɱ LA2ÑH-ڪ}<$d{҃8ҏ$ i@ #'DͷaW E;P6"?DBZƪ@?W }~OԼf zm|M.]Q;Mzr23sef̘iq>_Ϲp" rLzrs8u2P( ƹAQR4[8ݑEk1'|ڀ~EL q0ʑUL74pOZFjX*8ÆhJA^bO:ө3 Mֵ1|_bBGW^. G[T66z Ji3U=vH(*,i,Q4lMδ I&deAt4;YYyP[ B1!! ɚ^8 Ժ@BGGwt ,9m߂Ƌ1wP=Cَ  zi=\+Hϙq8}f# <3@?W ڹ|~ [mU8::2,l[mè[/ۻwoo޽{2d0𸿆3psscᔗ__ ;""f Bh:l1]bHfT=|h$sd2҉iNnCo8GՁw;xgWbq;`@XBCI%42WxXGh_I޺A}rsuP":JOMy;ɰQ A|'{[0BnfZB[PߊUc[P(w>V=lA⩈8|J]j+[=A "N ɵ>DG &`5"~@l{DpH5 (A\ s6/jEv{}"x!1$H߁uڹcߴiZDm\Bqp_077 /;88d<ϖcȖQt5? BhAdC3>f&YX仍Lg:z1pQhÁlbdcƓ#уkeoOZv& >D耡 cq'pu'oW_!4 ه&׉0 ,5 =V0ѱ} 17Sd53dر̙c!h&d.E BP4D%:"N>0\,$#"L= i!jm}MZ`42}(Hi܀" qY .D mDm<F4@k/`6H TV?>u ''_}wlEii)k~}?@ҙ7JzGדssS( v#l̋2 ] \c7 _/5oG`r*til!/ANaĪ:t|B$ܿ%;srX=AG:r|Oӽ ka% Pe0u`%.V҃\_i**HhEe$[pW LYcц#:F~KIAbldၕXlWض$;Uc+ BSqq1 TOB#Qۀ̏ !:qdEHND#s' C~LbDKc'v MA-57!޽y*oQ݆{>mŭVKnr,|*vcƍppp^=/nhܟ7JذaZR>Z MP(ۍ{'fခe4".՝cRui$ Z Obfц4CC" }E$\2#)|K&+F^v8BLYn|/BDZ" \x> il=CuŃ%f !GŘ[n`S$̙%y%zқ0}L8cd,y.Uř=Ց]qgjlBP(n?ʐki@'NFhh'(Z #fuGaI/ `yxaa:"NW{މH>g2V+NHb ~@0ę~ %f+nܡ=d:uٜ[oSO=iٲ/[vc}#{~:z "~}ۿs2k+<,^~/P( eākfuChw-RyQYRePjHQu5gmnU[ɶX0I.@]C5ClWt:3TaAXʣx3/]Oavٲwv1llDx1+'Sqmo/LX3yl_ K9L":Q]Tms:Xw<˦7hD /0p Mf_jlUc+V5E8>!bEe0y "8z,BGk*$zvHHKc_ě"|Ϡ}"Ql$hoݶOy\]]y/'$&"mGxxM.p1rrrԫ_n]ѴY3u;dcS]҈eЃ?+^ijU?.n+=ԇHMOи<;I=tL2 '{.I04v%xx]:W%v #&4a=B [ҏ.8xRw !=c~g`y7s;-^9;>=!܀CdغRWsEC]Q5NOT"EfHD_ ?Deg Tjcdu4"DbKh\j8GhhCT$1MkqBDuVĘLD\!!9"g; ߧm⏮ri+n%I~ԕj+nYY9xp?M@j(Uldeeq~\iڤ m;89h4 ` I5^4fɀ,GS@nؖ# ]kX00ww2Ä.88 |C>^6!@74DCjRi˖-\x&`RWLIu`{s6CO|tX]3LĆH")Q[;j=UO+TP(\Q"2vÑHCRlGخH&X@No "<@f;Dwʑ츋C<9h2#Q":`9D_@=RDPmoDXHI6S:~sHqqz+lW`ZnMee%TUUQUUEuuח`0=&<.Bq3.e4vs9O%<2o,t뉏_1}`e0/fSj#escNVК&Lg: X@¤8@Z8 iv$`IY ! Bbr"6lf759BӜzmX%G(  - !_ 8Ljh^e,cEC21jy9DSbBP( 7cF%6ACD@!bo "FGb' HX+HIdZזy X`}IFlAw "g!n&3܆4"Ntz$%h+Iuu5...TVV17,~+߉bb+ &`O"l:cTt@R;׏ze&Vlq%L|ט1ц"7=OT5]a¸-t CIW%)M˙/ bv@*hJ"B..~g )A0Yxf|χ´B* '5Gg!. X@%H%TbsP( BH@@D4B[_ĆDr!" HNv∾i:ވmVjL-~@у5ZO>syi Ԏ樍_U< AEHTD1A(lŭF WS]]MFz:}|P(D,b8mCa`;D•!iT10ܜW5SKI kA6 Syb0%Al4SAGhlI60l#ؑF}?0)sTBڟt,a nD+`m2E\ TV; VT.CP( BjUfS`5^@kyHtE [' yHv"<2Xz' IDAT'!4qƈԾGhZ8$ }DڲU= [ ů'|"M06WEnF7k&&&^b*;sL= )| ']9XNd^_ÀaEl(ooXS <ȋ4栱L( BP(~5V$>DM@6"&9:O[; d T'T ١!mEH܇4{l2yjsG2w `0;JqG1  N{cq !~n+>ޛ]ɧa~ b1BP( B_ⅈڻHTAĥ4r ixLO}L|<i"9x _FH&jcMPAsb2H GHphRU|\HJ]ānDGݕZ+Bq3QBa4pqqT] Œ'c*,-VN ӻNOWˢ2.Ȁ$%n0c=<$+LFhF3P/~OR ]V3mx"nNe`8dDgH= 1в%5Vͅxg .]YcTgg~)f&֡xlH6!?=s}/&nc!.c_AP( Bq# WHtǗ dHDv釈HΈsI-Hu&PtA:8`%8ǯjHmym.U? <x t~]5uxxӻw>l)ޡt҅gq1ڶm{}ɓ'+VZrĉ~> EU(_Iqh t5*Pu*v-^!4]2 IDoЂlgbq< am^əр1ٙlI0`p /HWX%%wLѶk$Zb0e |o)K5] C7RknON&I}C)¬^TQuUP(PD@΁@ 0"x +^ $(rp=e 1h3 MyP+S jm!^ (ߛxڷ/y}\~{qyk)^Xӫ_9Lz"T]joU{+ ŭ^7#nZ:qX"Za lF_Gr{ rL ؅di#"ss$Fd"4뀏J|HǦ@c`'06kf IO Pp#sc۵₈5Q'APɺ0m;wTwPToٲ'kUQP(P6cGT-BvGRoLd*}9F'`7#0܁( [ٲ^CHzh6W ۱$m62H{{S|BUNN|G),"/0RJE^1_Jn:l8Ǚ:i|SAӜ@@t;`g60q5j LKtNO"0/3YχUjoBz$z-"bmXdY7Զ]FG.H$+"B8vRu[$hVqs$+66P$JA1sH5m.m1LADH@$ |(wVpehd:::\_w9MF\1***hժߪո{޽{nML L6j>S<< ?H.!``JSS陸M:,,b߮EYA\yJk}*z9@GfI4bc^OVStz+mGh)kx;c=N8b-Ζ@;d}ؖYQ}=j#> LLca,.EG:ۚRYQ@(e,7.R şUW[ Bqٌ7$KG;#y֡H # x!g-&eƒ4Wg%$vd/A#шGn1`?M@}8"ȯ*G[q+풒>c®Ǚ>yl©S O?Mj깟裏9|0ׯ㮻Bx뭷>y6ѷo?M{d><+$::ɓ'atl֯_ŋprrfu={)@rYsGjjJ+뫁ÇPO'JCL5XDa0De悟;r 'SNS'%Ჿ7v[;׻dJ"b[|%.l;ГxJRy&{8%$35&4%I9>.o)#r@^4νGO38Afr/ "⍻I__@@"-l?>V  QHt>"wE"9h߿G È< [v}! xJV_pV+اc&)n <o!푦Kos AamFގ4QLW(nw掝ue„ |G׷88fϞΝ?pʕ7ƀ[:gK/t} /9r$+V|͛~i{& Ug32ɁMd=0dSpc(2ӳ[Cg&vv{:: Pt'2=BI$MlRUjoBqnD_"Ym@A2O n iޘ-H I+퓏ggH, xH67$K$: 6;@>k_;=DD_-܄4\Ulŭ]'O>3wͧ.dP_}^˿8p ݻ˗/w> , \_nBSQe C69Od1m< n0PN(UJ+Qb_OA5N` /Et%TzqPbIKHs,rל6 Dt3mPD~\2;2KSK >/3M2*@PuUP((Dժ=HqPz!nJD.CCxHVP$⣦wF؛C@Ž" TFԥ+,@>NG"Ge"Q!s8 Hfu@$0>" Gq0ڊB𠠠?~ˎQ|FATTԿkSӦMIKK#..m۶C߰fͷtԉCر#GV7CPɰrȹ+,^x@IL"&BI8.rtܿZ7hvnE\ 面pu qtfϲ' J(hBYl&o9G*(,2b1^ϊS(JR pMѳlGLs3B=[k4g$ظ̦ HvBjU{[P(;!MHcWe]Hm.cSDN@.@K؆8s ۈڈd]{!')f1!ڍ!vNwm>%:Tw #b&Yol5xki JV ?ˋ%99 𱷷',lu{]|}}y)?#{Q^ ggʕF(?AD ʼ:&/~@6CIL=x`Q9FW|킇K_"r ;Cp-ĉ~x4.DsaHId %F].Aӱ9֌ Nh@1p}߬Ilro2YMnmFa6sQn du8 VF& &zrBPuUP(=yHeD@^8CzҘqaCDbom6=1$39p H= aƅc*7QuwEQ)WܷP+m{+eoVj-ڊK.).K.((n( 20.e.e|89sΙ:׍ HD\qzdiE&iҶA\G\`9q7Zi#vPCvrsq;}cfٵׯMN_wq1w\ΝNBWV__]DN`QB/"#.L0f^m8u mŠ? l%: 'zG qx yN|1A\XρS3Ԭsu+^`HĽ`h s==LB(#q/$091J\@Tg y8 CIFT]PBP?Hġ pqRGu Adw8jArk=8 4f3(dh l-8'hmKm ѣÁ![<7-=`PNBP(>,Qrbz M6be41EA |ie2dhdN`r(xmq9h95 K6‘zj=[M0>@O5*I$!i|`]Az$`"&쒯q)&}5x!DY BP(2#1],D<~&"!č&Fx6i˺"8UT`(qU7@{Jiy&[7#nk'"´#U*!{ }9* B2Yh]  G@?̬=1S{p 95nZA4y-" `lOԦ6t.4=q` {a.'|fwmdC}؁VԯΝh X5a\ق1̚[y,th݋LL6nKNB[ 1'ehF/!)hcL׶^(/P( ſxȺ yQ#Ɗ$|o[V5zk01tZGF>j'c\YShk!؟N+B#%a0l1Ӊ8{6# q%587{b zrR3wF0@$QxȋFz)NcJuDT%oBg>`[F1רg WLĆ6-Cu#( BP( ="D҅`mAވP<qaE,ti, "*"&DX@ մq62ɷ.m^> !&$1"?"dS$?u'.m EymBqOD~W˺NB7#q#Z`ή%<\!;l/YAZv [pA>1>Ƴ~Zܑ귀D8<Ҷ) Ni7`VFKā !z{ }Rޥ D@i뺉6 1/iiًW(0$4p =1x#p5K(..V'FaGKu\BXbr.*Ղia ̥$4qgHp.B(.[ғ $l 9)Jn]WN]=j' #C$c&"]a*ȨOA?gdFnѡExR<;[Jf$JfW6E8Π+t=1e!\8R/@Tx{rLYŬux_}6#@B %hb&a߾8x<ǺT24uc9˹x?gg^]oVdg< p.G73 ѩ(Ž`d &q3Ff8ˢ 9hfVK=P( BXXረ ¶`#bzGCqQlDlvӶ[|p]b$zPܹLm7A;vD1'KY8'"s6cu 9(_P( 9P3H4B+^m..c#Oς 185w'%P"En{_N&hLrd0kRSsv4"dOIX!$% oR%bT,>_|  zP+[kϢxG8Lje 6xA 4G5:ٱ8:5!C}á$' &F BP(ߏG n&k o+9Y{Hf((PHD2K:W#؏#6펐OGvQBSڶFDT؛-oH3{Ğd~Gu6_+0^BQ(A[P(!:tF%|p rc95)?ᣳroXѡ<f+؍np6&|٣uDMs&fB߀c4_pqI&;25s8X`xx@JL:NgTHcb#3 FĘRPl++G s1J{FR#/]a{qf DJR p%h+ʋ%h/^Hu*rDg`ed:3<}b*fTJO-#+i1#哖&rDXB {=0NIAG=(O~=bHudvINԉPսTnW# ?ݩgΤgS-դꂺG6ȍ=:Ǯ!7 J!c' HK? 3 ioJy^w6sr330mH*PםRi;ٳy;IML%63ೱ`ʐW#/'itDAVADC1ٳh;5\+Q5NւLu"HD5!M!!!6y$cxD|I$5".B HSG)HbE]ح#820 ,#B"`WB3=skis.Š-@eh+9P( ſctĞϣ.vGvi<5!>~, {6ks R&,i\]aWMC,d<+8{[#Rێ$3Z^Bdg.%)W A9tz=GA}jSֹҭI^˩s\YOAY.<ؒ @A+I ju@r BP(ߋ ɲތdO=CquN`uAF,p\aڞ6-dקdBas̼MI##9t@Ts0D.Ҫ^m bTWRSOE*OcO,W҆=F^n 8;*lȳ@圮l9ڝZ)9a8qL QI;c>d&@mpA[T5krg+ BP(83 {7 bq0wD.'@,E3"|ҸÞdfAd/$dƃS$֓E@O$dO~BD/n`mBᗁW<@{6gWDVڊB BP ѣRS@camB| " @D;ӎQ}iăl2-8B4zbf"DA͑ve"x?4܍4܇b7Bx27"-OksVe[blO ܌sD%i9pt6H>_PŹRbjLs[u΍Q;M~AV@nR!AR)#N>cu(|ѓ~{_x@8Ʉ>x#>53i54d-, G" BP(eOZ<;.~|}669H3ֈ޾َm@ΈQz7Gu+qx# s:OYqDde7xsĹ=q|u7v>o.;P-n\SNѰa8EK`pqu3Hv ư6nHI{<-]l#G,3Qh޼y'$$Ν;s.\@9r`(E(F˃IUI +ՒOphF #ѩI;\+4߫%G%Q"P>oHUޖYvgHb,tvIf{0` *CcOߏXbY"#] ʞ :r"{{<##_K0)|kD%p9Ҕǀdy:u(;޽;O?4ر G'ՍeUex;βeXlÇ|ʔ)L6M B'd_B֥5걈TF"Bw(":AC!Q!+eqt8#HeXQĵPC] Ҏ=k?a\)DtF]owH^3bTQ#7P4h-beit>7-2e nnnꃡP(rOˆ^ Ws>lCBX \l>Bw6!8!cl/Dq:!HBQ^ؔ~ A^T={bQ /nj N8APPеeK,Wfwݻw'==3w\<==$22͛7r<{M6888G%hٲ%?]B L>f͚ޝG {<+$II<8Sԩsz[nTZ+u֭S#j?[&<}7ncժUZ ;;i6uTM>P B'qPO3xH`<3`FH`"6菵@U Q[qNBIE`{iT sC|m?a^gd"*{+!1( EyQ&ogߎW^y+W0tP&M=qFuFŊMG!!!WN8CrFĉolj>cڴi#^ɓ5jԯoZ=z4MUQQQw 8:H ia`,l]zeСL1=9F t7"[lvXi#Sq=#"zL23m>XRV6Dq-2Աqlj&&`w7B6-/0p`}2a-y{B'B)|?< 8x1Gґ3Wq(4>I8xV"`i" 8*Oq^e]5޽lO߶Ƌĉ#{EJJ [oF~no~ݻwgקOG9/ٿ?}BP(ʇH']"hg  MMqcW~9 h" TÄ 4fdZAG\/hcFVdiIQWM^6qJkEyRc+xg\NQ2QX2orW]vQTX4ZjEbb"Ν;ԩӵ{1ϣ>zܦsӧqqq!;;^QBRSSVّNkHAA~w=pvvf̘1tm_TTDݺuB X,Trӱounu<{AŊ7n۷i|~_5Dw&ΝN:dffҨQ#RRRn{yٴi~Mɩ1Or (*.X{-j~!%Zs *j/NKVV&;mwsGN8X@p|p:|}`Tq+!|Ns''G~ԯ9t4!_2#bH XN9:lΥ(`d(l^j^V*\e3EJmVOb||b9~0"[eU8=>@K0y,$e΀Pй¦H,12@<#53fGG>>z_ӿNu}jիW石i&֭]ͷgϞ?ksaٲebI4.ş ֬LUc+1H.Eb;k"%lr]NԶ-Ehw`<qS;y# Y-UH4c>७-mƕϣkşK9 3Ү= `kk]RXX֭[;w_41W;=''G[^['-->ƻoxbBBBׯvvvܹ֭[=K17K׿_`ͤ@:u~xksZ|lll2e qsJ)*)(). %%"h߸\}-R(>f9U Ӝ"=)ITGiՈ.>͂Ovӳv5\kAbB<GM#pٳ!XS9<{g;VJ.& WÆu} 3GhGOURsi/if菱X$Z6Ӏ \PZZe~)fYA&M E籐hDcrf+K֭˹sncժUr˪ƻzv5oHKKv5jm벪ĭj?`q9x ;vٳlz쉽=˖-(1 Bo"fOB8܀bK IDAT:ċTFo Q~HSQH4H&"({kC]wC@ qi@ݻx,DkcJBAn@5q} o "1>8:c[(+2A͍䛊Bݱ{n6m]mj}11un5}ҿFEݺuiڴŔ_4dΝ\zEѯ_k{g<ݘ3xn| .dҥL< kT^擗+Q,a)Py+l8ƪ&Zٴٞr'x&k(Lxt8x9FOs_3'pg=q֧SneETɩ]lL#/TJqPVgg`CuvE kGC$k0, F|ߍ FϡU;;6&3k'sٲsvaos Ym?Bqѭ[7VZuyfï eU˶}%88'|7|7k_ŋ&--oY_Nܪpqqe˖k׎O>u krrr1cM6m˩X"UVɡrݜUV1rk;v+ۈ#8~8/ow&.yyy|w 8iҤ +W+W2еN61qH^VTo@&یU& ɭ;CqqƘjDX+j%ia̧ȧ!mFȣ>93p2 ݜ@>Ī nz+)%$U!͟AJ$⡋?M`#|;Z)H OſIh <ʣXcv9OG@nԫÆAN{}W[?yXt)DGG/k{ĉ ::ƻ ૯wyoQ_~5/s+nUңG>󻾾v]T{ġP(ǀ ¯ GLh=D\عH uD^ֳu`8#NCmWL$8i8Dm\=v&2hP4Җ= L>zw&_nE9 ᄅG}W_}=sdt:~-|A^[g޼y1ӠA֕6U 6i_ʹippp^۞>E]s8ߵ M_8{Qһ&jÃ-[0}[gʕ̝;gggԩC~~m ng FB94=ҏy^uCEؗ9>9LtrGb981GzGvgqNA<ӟ-^AanMweYb":gc3C`1Xj'=HB $I;:ґxRE!$Co<v &q1|9ʶ{KzXb>UTaȐ! 6k{ov̜9(իǃ>x_]鷪oUV_)={7޿U* l E\qyGCaD,.[vm? wۀi8 "b+H$L2Il]z<綗Vkh0k9DCj[< qu? F @FmDח0Abia4 ō)/)RXS&2+Æl6ȣu9DROݺ}.c[\6L,)-Kcv d]SqX>-B!)1lZ oL|2I ⾯UmB;Fyq|B{:bs pNC"=l'yd$j$EcWm@ONaƂ?肈a8M#{"1h~c%""IYLAJ6CS.#t  B;Czq*:GqeAdLbR+B B-iI-jџS$$w*cqe 0p( ]e%~"7(2%i=B[YC#"иoMĠLx=sB)5^9\4ȷ@P( BQ.X4L@UD< DEB39ġ6"G!:$J)$k`30hG=RhK :".kv|/R>F2w K)e2ګvp$@ Bb_A OH"ǛCܢ0VP.>xp+mRiNKZnLn3ժdmn Xg͡IdXgM;(<&M xSk1BZ98I[c#dNȡ&ݱb" Hﱐl` FMRSٸYk YT( BP!ffD~q"/SqoA:H$%#bD F;"Z9Miߍoc "V1.jE0;C0HζBQ(A[P(!zҁ5zn O廲ʁkЇxCAфBt9Y"{{{+<v;rx ;VX6VQ|X u=MI~4 m183XdŃ3 >ɨQaoCٚ 3}߄5)ui_tl\PI?[/"BP( BGqBwu!$; 0y>bШEU19qIG?#B "v <mڶ=)PG>6kڲ7qFc`6Dzm+w4| w2 B(}1)XV=Ņ}'G-,WQl r=lKVӂw-Qa C~pj+!L?`td$=ֈ &Cp2CR W-p:-ۀ葖ںK@ `-HG/D< d!hYm4tLCq~3PKM`h 0;!F>m> P7K޹s:s+ pVKsɦ/qiA_ֲ\@ ď#@$ jcBx_'Λ1D-`&zhmS?t(-\ϩYL3M ocŇh܀ƲyX\GG>x񍅴(#"d"g@õHSj*K8J vrg+TαBP(e8uF`6#z%b$?P{ıqJW wS,f00 B`ބ8õ@{mg M(k E\akC"B EyN:3+5BQV8:Se8~: MyaE$Vn+*{\:v5ULUn311&)$%ҍNy|FgyyO^w5?(8Q</H?#qDD)#Ѻ l>)\B m̟gB߾[h]c9jG/5b.GP( B} H_$1qU7ҪUHFq7^CQإm; {@ $$qqy#AD),AVDL)j=~p1ih^~80mH+G* BI5_1@.(>@.z=OX ӏ|4'}囚{X~>ڵ֢g2 ~QҚf3lf f3^_ { (3} ,%$]GIO eV3F8a1hόoˆ.5vgYl1Xq V16d:"9_A3}TʡlP( =[nc8C>_~KCƵ¢$ ԙ>z~,cfGbXɣCNs~48RlH:G#P_S"\0b5S:XKBϊS8Y=83v6͞=Md;|iIbnG"9l}rD>F@!wHVB(BbEjO#K1 b&c`*~&? r!e!t}$>d~iW)'RQ9ڊE eee* i2 Xs'yTj bl_7e-\uY3=DL v\6p<+>w%|v=9f-&0AݤȷB{ľK2e.Pnqf[7~=Nbl #yJJA~K;Nb e6⾘A09:Zk;qnv_ 8>a1Y`!xu+( BP( ="6i>ʯ=l$'+""q@$^d-#PUg0vaƀ:xmFO~AӵA8ҤS ^87.l,@DV(*?{;;+~YbQnGP(k1H5G0,ܴ Tv#"Ņ<WӆYtbsᗆq|p.19gLei0SH^Z;8{ޓhĉ}Cl I@D*@"u8I#i<<" ݁z@ D㋑Ȕߙ^m(*;qҥK3f^P(VEOm7IÇ|iM})3^i|¤` Ov3mcWFꇔС= 5 &mԧ.o&#ͯwgpLEw%TNYh}ua qËqu7<јPGX&"?2;5SBqw2d֬Ys{6lUVlܸ׬Y+}L7WMVK?_Gjnx֭[}Ջ3gp4i˜1cZWP6VD>4Sl8Ok^D#  "Y{uFDwy Pa ڊӁCQ@- /NS 2xk'Kq[ONjbF傷Y; grmFvcvqY8W(*;}!Ch"F][FP(& O.3@v^gоI[hށ x%n$Eڙ)u& zH ?p:j:թF5T?'ﰙXĸgi"}eѿm .0~-VRa#?m1Zx #k4!P7Bc+"&C { 6\5k4h_>K7 !!!wF鯺,ǤIÃR̕ IDATz]vBmB$ɯ^A0$z?"VWGJv!㈓{-T{9q9Vq#NCAm$qեYm=DDμvY6U,+C … WDs̡e˖}B߾}̼bSZ5zsnЪw;;;>SׯͣaWg޽o|||oo8///>+ΟE~R =VbFDDDeBP(he 32Y;T=B}C\X9\;,H"twƯ :ِt™lW+׊`F8}<c Aa,P}s 8u 82ȑ#tjoE{=|?]ʹ&[nٵϨY&5k$22sqnF(O-.wuj+V쌓mڴaǎ4;;;fΜyE]7:Ǎv|nxkf`q(?ufI0`A<Έ;ڀDLnd]""=r qpg!}{/"*1`Dp}y%H\.>x4,/F#H~_V(Չ<==`ԩ1\ƍԩS6**t}Qx>gbb",]ߢWSO=oAvv63gW^L6ѣGsbcc_?$77#F0mڴ+>ׯiii8p/*K[P(W,ܭ ) D맒8^Çoz bGu4FKO[faY͐ p341Ǭ'8#.08Caz6J놐J*{{848G^K![\u jȾSq#ZAsq@J7w> 6@F0* ݌c_0pK.͛7-r͛ٳgy*[Yn<;tIII7G%11?wypqnF(%)cԨQ|2}tƍwl6ǏgƌW[n]st3n4zeZvה7aÆQ^=&M?q(?/$fDh tGHFvo@  q:׶1q|3XQqLml1 b.`6pA˂w[DԞK;V?WIϼu'aɾ7kx]QpXZ};;;V+x{{sqUF^^o8u';;Ү[W<<<7OE.\-nݺ;v NǙ3gY:uHNNё ڶmKrr2>>>L&zl۶={^CEwzߕE{:>/-o{0dHrrٺy \^5M1T+3&pj9fGiۥ8`ׂ@0!OY0q_Dawf wy4AϧxzgR Ƕ1{ Eegj-[tR SO=EHH۶m#<|q3H Ejs` tFAGb?u$^}oq|(nr[3f \tޝ'|F]2WJ}5 .dL>w;;we˖[fV{\op񄄄`ggǸqnNz-TfMmFvv6seNtpshl侼5STTt_^=BGyY, q_#n<.Oj; H,CTD>9Q$P^sSTeeA4֎16h?!&o ]*|6Z;;\v$dw\^bcƌaҥݦ_~\pUV],7EEE,Y~qrrbŊ3k֬sll,#Fg޼y?>_`bcc)))!""RPRR[cZF) BP Vzuxa <ȧ,4OV6~:mrQOY(Iè |CN0#?snO*l +t1b51 /@ϰTl`Om/xe+f%~~Ыv!GaL PtsQ`8PdȐ!_Ai^wj{Gr;ZZ^7Xڵ5ZlɲepttFWoN{Íqtpp t;kʫӢE /_Nii)|G}sz Ϟ8QlGҍA΀dkD #7{{3= qI# "HnD*đH~>Λ < 䋈=鋓G.gb[&}ؑW_/DTQXt)C aaa5^z^zhѢ+>[.^^^㕿Gyww?o#33ux5kÆ 㣏>bW<ѣٶm|>{xGhԨm p9F+ Bq}0'; 8hfg'a4k\9n,uG8S1kO|@A<ju?DE>F,%řlo^z]ET̛{H S$u8cKc1v-xP GP/X&k "@QdLY$S77UK^~r}W_lNw;Vb[0v{kFkBCCyGqppB:VFc}z>˗/^͍zٟhժBq !NH`!"6Ajj8-O| AJN!N.:_ۦv\GL҈1P"M! TiA{œLDčDkBWzj))hL6m2oM!+6V"rQ ki>NWcH3.TՅuт*ńFE/RV`#'ŝM['S|"+/ֆ$]`?F`*VͰqQXqJ?vMЮE8I b,wáY3Y5f11e.،(c_c# ;< yyPYlSH]#)E]zwTM!}/`>+KwD2!-tMn TNh}|3^C0A"B⁥HӬd93ƲveHD\D-:B;"4ڣ9mJ\ GWŋի|_>빴pP(ulӯ&|ޙ.S3>YهywwbN&`/yN ~ANY_g1 12 TmF2mtBa 98~oafypMFwu Szs1#(@OaI>D탄:㽉" ≧y-h,6DEF]P( Bsgܹst֍ WqlBP"݋ٽ Ci^O&qa_Ft*Oa+ Osr^}b \|.U ꑶ0xΑ@*MywhEJiBvMN;a.CC;^܋e&?^%,֡U\((8 Ά..4fOW*}BP(  |`CIH3~+HH>wiH!$#H;VbQIEGZcof,ŽhWۑ @OD^4!bBāeGv@${"+]'h/<<7Q! BqkCGf-N> ߇;Nu6M;K-ioݼ $&{5Ud/r2xaL63in1B=Ӱc>Aqxx,rD$'fP0g',=`m3݄=h2ϒ<\$}6,& 6 (0RX]P(-kJe4R(="BtyFW ,A\iHLD0]__#BL =R&hʐQ$*` n$'b(Dv851"[XHv$VT.ʡ 4BPt ] >b7Bk$w?"2xqhCn}؋ě@ΈC{+J 7ᝎĉ3 qG!$ وkk7h4|O>O[!GڸU2QBP(0zSsx0c9D˞ |un g1h6ňs('O~Hx)~ΊˁNl$|]rKjh&3a)6<;}ˢ'6("+/&kp$"hת>%bzAHcfHi9>{AP( B0S?^D\1{g"֑;!n"<ޟ( qn[!w(b]S2hēLD͈P> 'a8qw|6wOD׫[AQ(A[P({:\qTNѰү.25ͥ -10·_Rp@GRH՗ݧ ^cxI+B.p=&7AR`&?Ĝ0`ID؊ g_B DX#%3)m`ZyF5c"flС%7W BP(;w ;!HP""loDEkB."ջm."wqa@J;'<#BKk۷""&i?A;Oz].ZL6PTJV( DPBWL?gO+vO3ۈ'6.I=p$-i2lzb _@c;B,6ݡz-ffOq+ٻ ,6piKcB?~]+#)~6ҏIH@B+:B RVǬ97;[P( Bqg D"Avh= j7r)=U+ &O||r @ M02B qPw} 4; sZNyX;wysvhRĬd@Qܖm6u P(;Cf͕.18Cؘ~҈@Kyi9K:?T[Kr4oGoYo?䳁gq,ELkb kSPmAo!䁍\RI|h0,Ly'a,d@.nж g@0x`̃V q^;d9!H#(,jTƟBz+ Bq4w\,@׮H ^johui"r N,ƈ8> ɭ>mkEt =^ۊzXzpC\8phTSHEr[v5ԕT]qBP 6(~ъoYÔ}8>f5i$q)t ޏx%׭ZP=OfڀRIA!BO{A[@ v7lΝtzWN"Rms 0Z4$/ "*ӾR*XPbl݂T=PuB{db7CD@} qp7ḐD."p2"*F{cP;ŽV@O):5n<6Di(ߨ#q]Eꡈh.#WP# BPܣ$LjgVFǀo3[ x"4 ߢ'Δ IDATҘ|kU6=hiCF/GWwWw;UAʍl03B$Gr8/CZׅĿ\v _2HDlэ):s~ ~~"1 ڜ@;CqI`Y /P( BPH3!Hu 4d,R]p}LpYH v+ic7j Ǩj۟! 4qr97۬#PmzkGP( =Vf?iEƕIxaUt|;-&M,#IorC JLC9Ev$0X R*Nh< .k؏ J#`~#{sO_dKߘ ج[BP( bE"Gy) bx(d?$:#¶ ' ?# K@S`-W &Z?Lg"I EWEjv^6'"E2>[}势%h+ BqbDl3xK(;Ә-о/x ގ)!DR $}5L"?S?(i`22g+1`C+|cG SKS/`MFvBCL^ݬlOK@T`+i_PZ"tlbpg83.&'jsZ4̄n/G*aS9y Rg~JV( BPi\ؐQD~Cm#Sڟ@bE;".죈4g3Ж1|i=+BF#܍x#yDB뵈>S׌c̈8e[+PBP((fA)}x:WgT M@ NsLJr>Z雀-XS/scjJM[0HߋmSsdm>Do9L9[ýee-I?1g䳅89bO2Rzه }9bHI͢nؓC%@o#MW@f g@u0?BP( E%1#MG!!_jx"~hćAw$_D4m |r "%=xp^ |Fɥk,`Al="Z'6X\9 m^sG JV( &zPqݫ/,@`XX>:^̨OO2f~a,:uaO`˃.ra cw?DZдɘ"H<8xm&y!79"Gyr]v00t@w?$XO3gZveдDƽ0|8l٢wBP( E ~ |qix 1{1 #"oݑ& L]FƓ)^a+śc0X#Yd[<3JwÅph%Ϳw }-y41|X::"DIKH^ U>NqcctWFN'Ԉ]l3O)ͳ!f$& |ldR;- v5f̬d%8U[ ;#+ޘMP( B4@!K#HCG␸bm=f!!M! u~0Hƞ΀")D#B0 ׎˹zmcֈ{?r%f+*%h+ Bq sf\ذ421wy4ގu'Òsp"vYE(nmiEidp5O?%qcӧ``YxŅ<07RC:]6qŤƃAtf㼧#k>ǒ;3JBqƫ@lCX8Hc`VW2G+ÙOJV( BPqV #鍈c@6p!tDBO'#'X$g;R< ED/=M@'x#y8m>":xLRQ(A[P({xLd$# "w[ż/p6ͭ9"W+YϢy DL}[ƒ`Qd.1ntl3obN"^C;x_o=u q0q{xsi.>CGiE"D4}LArq -[ 9LP( = qQa*?oG7q c)WL$ x6QOl](n9%ZաJ7 MŸ!kKD`4榣Q##Ωx/%īh} +h4&<m, _#[w׺rbI>.\")'Z[4&!/t֫b[P( Bq1#.WS"B"n{vC_! $d\>!y)`+F]馝)^}!|D6k:=Z4#@wW(*%h+ BqE+-Sqȅ.Ҙ<㍆S(Ja:/2e&\ ;}ADvOQbcuc/G|@CIf; ?4{XaLmt9;svFcRCu3|a.VFO@g|IDt "Q[$jD|W( BPA F we+Z-<8>^B,A"= .[H?8;;[;^y! O8=z b!{9 BbH"Yٵyl@p=b훥*ÈQBP(0~~&Wa*o}_kJW j*F cZZjֱs5``o|!7c>fJZVڶkGXwjSxFg)<_t$^b|Me0We*TG%+zbsdB@/R9Xb[[8nBP( E%T"W@]/"w=|؊‡ڵ+Y xɺ~ROg$*$ %:ڜe,'`4"Ahvh}]]Gg="F n.Dn6WQBP(0:A` 33<&fbe$o,(!^iQ8;OQ!tjsۯF0^`zgT=DMD2[&cwҕı6.p:~A@'F$Ŝg ;ulL3oF _J>+ߟ8<]F BP(@7ȓD|Ar7 ^ĈC" C i4yc@L7Dӓ:8Q f`VoF\=Ϛ:p ;,xs/PЄφYH t ;)۠I/#b݆~>UGY7$*W `U&WaFG-RIl6ӁXrxjJtl L,*.dr ͞=? $tؚ,wSݲ9$gK6,<Ӵ͜(X}+Pk ț |-X((r"[BHc},xa,#2DDq=/DEGZ#O&#aƶi"&ֈ;~3qE~i: q&%'ƶ(ד z EQ ?fO.Y0dIaTyPmS=W#I|u 3V[Q3lDt}?pPF*,?7E |MPGܸsו;̻qFc6r+iE19F;@8v<д "(2 \Hq@}@((51ixA(DNviXt1;ɯD~Lf ؐHD /(Bӈ@x8i~k lC\uiir4le_ Bڊ(r  Zu3'! aGrp޹xfο@[r{y yӝ>s ^X /8yeĆ,GDu0 㑦9}CИg(7EQ&76c]TJ\EǏD[6@;<9U _)C|AP-]+r2 ipD`;?mJR;րntIRA82ߙKCԦՋ;2xi?g߾>,j so DccQ:['{dZ$V%v/Jo!gez^9((\ sw6D^ĕ&Hn1`3̮6#M"#QFw#¶ xV0yuXbl/dtG"uo$o1ሣ{"gƾӌyj(TVEQ[,?\r 1g~hr4-sbN&bOyGE\[w.>`<]vuw'{KLP ;#6S!8J':CQz>e8oxl5TTHb .knGwc'`P\oN¹whiA0~VEQEQ9"իA6 %(^A2/{BDԾH!$p%mFS@!#sH^SĉğD#.$gYz.AabF(45gC8ʪ`Elvo,ư$08JǮ4~>M4Rq^$byNp>ӄ:gm}Դě0Vӄ>i­TZiV>!M`qfyqpNU HQ9ښ9B| +8hvc20{4'|C`5G1yW%/ C5\C*zEQEQB HF2o].xqe#Q 1{MSvH qK7C: @kQ"t7$0ŘK[D bw}`G"HUd1^qz uWEQ)3pq$>sW{ N$ .Oo<@$xU@6hQN@Kl yhm׆l]DʂA8b3Ո$ ;6O)4#U.Zwld3 pVk j3U3&ds'W%^cEQE8c\nHxiK9;~Do! gl[E2!;#Wyc"AKˈ37?R :r)HHƶqk w ]t+wٲe^w7WEQ~ >=P$ _E)t,I8 "\~zr$3Km8:.܆tqӺgCG. ج2qxc Ǟ`9;a Kc`~14SL]ږ[xӠ.r/dd!ؚˎ9Y w A_Qg6 j,G"G""wC$Ұ2qwߍ3((4rDQEQnQũq5: f+MhB!t+'#SI3fMG?;^xS#yMhIeYڴQѓ >vzؼ9&`:_x[8lKG*?H0-CT SmYTN$$I7!ɹ0rGa݊((ʵƊ" cmEHH1hĖCHG 7r/Y@uHӔĽͻz1iD`?G).?I847% IDATf Ĺ=+6r](((YŒK&dH`!,嘹t9]9xes^_wWեͨgÞCSU ,b~t2<ϥM KS1:HgScbW/`Rd;\T(VE@n&l_mg4a0 ,] v:ZDmhvEQEQcFDz` i@%mC-F2!B$d2P I29-Wն9D*oi*9֧!=r1Ď"O.:1و#;87D^jĎx](ܢz'lAħɸ"8c,Z.-U9> aWx 3,|O~["S(4x< X9(gSX9Â0OMl*L0mG9av[:ўEs}OXcL:!- oN"Sي((5&툸"l@"M"EDd1؀M")\^jl =A4NDj63,@Tzw,3D%[y˿JCՁ9k\oT/w[VVPQE UB9Cc![K\e>6s))mSsعD-x 3-4l5TooȀV>yMԵqO/9SrZxDq,uY8X߉ ؞8~go"!bvOcQA[\3A{͚5ۗիWӧO\a/H(o] æ|q [ŹٓjAv3ϋtSm|8iۥ?'v5(=Ν֞% o"׉TH~/%n0kY;8#K9ZҍcLL *DO4C[Q\3A{̙DDDgDVEQ&,c= 5_9C:H':O;gtNg?R[ G2xGڠ{!^Mfor$SQ@]`1\QOxN$/%͔0f;a#xOzH';;IlhkPQJ(aꊩg LOIJKV>V4w|ʕ+IKKcذaTPg}\~s9((7!9֍_<i4 "[g>uqRYcp +63<`?CjHHDTߌdFHNU.dm̈ȝQn D>u6#GШQ# ֫{nEQ嗰"y~v 2l zo&Clڴ OP8Lf=ɻޫ3>uZPs%$@Ь%Ϝq$I5JLT*x;LTN>'iM dzK;Hj{]|EPe ~ vóO;I&Hжb7pMҢX;_&V7 rsO?<@Fx':˔ӊ(2D읂V$d;-↞\ȎE\Wqaۍq;!M .@ (D!oL\ĂD#Y$R$ h |4lKhj(es:bc3*~E`z 1cg<62 fwq0He ! `LS2.eݺu 4GڴiCbbnCϞ=T=zڽ{7mڴˋ ̙%ٳ\2;wٳ&w1i.(ghH `"?CmHˉcG##z6"6E=NNj8Y@".Kx]Ģ#%c|,8X]Զ$/{1G3(7?,h2{l""k;rH)--C> 2 .0rHOMMСC,^aÆ]^>l0Mŋ0a#GԻ6QEQ~b"aVgvZTo?<$Ȳu 3<i@(3cmphwkw$'0i,~yŞx88s&2 0ec^q/AzbA;T r)&́{1vnM\]@)7ma` gÑCPC*71iiiX,,%_… 2_^K/qyz-ƎG||<_c&!y&`16#F<'eb`9y/CK(3"vD"R#ys4!3 Jݛr9\OpHll,գqqcիGll,CN6+r}W^y___~//ڵ+VAݛO޸\qnEQedV Pu.:;fC3l`k:đq%g؁S@A0)%}NU4$W[N2H!tCM Eov|cBz؉a(Oj1sapchǎ%9 9Ac*\'3fAy71c?|وǫ7Ç7~ZO+(7 9H o mGR$Q$"ppq\P`wATi߹oGD||1x5-H(41Ctw$䧖ʍ 3gd۶m?)T,L&>>>?,Xׯ+Vd˖-n&QEQ~uP%SR6>Mts1,80;Lv Smɸp`0]=P% NC|wyAI![ZPsUsv\Ά6b>c/z$Vn(͍~9) ؁Or8;/>[H<56{2S`$w`㼉N:)A)WǏiӦ|˹Ws9*Vx}'$%%a~/1L?_;SiEQf܆/"5 $Hq$ge, iÁp$@6]7@" #˾@רּ}BIrm#x#$EQn(rɓݻ/RVVvUPPf#M~9.V%?Zoگzlٲ3uT?-PoEQ 0d78]*v|Ra4Wk^m첻WY)"epqVg59Iqt?Kzx,.3(0.t` ρrP $Ic?! ;!, KdmiHF2_{Q4뉊)**\\^קOyGYj5^ 2{2Ԧ& qaCiw`G+ }I2-g_d|eӽ^ P=5$7R9"yub chBz^|.'%E `^ް p9,2e(7#< |-}Y^xᅟݾw:tرubȐ!u]L>7ϡbŊ,_|&M.,\\1m.pEQE@/` "R뷁HH3ɀ/"AѕS⌮dmiicCAӝ a5!k3pD< FD\:iD+vD$s[Q7;rv׿ұcG^}5~TTÆ gk׮̟?77k,"""xqwwg7W nu((D6d{<ŝBT5iW¯T}Hk|q@F wER|[Kn΍}dunhl#_EVlm7;m˺S';#7⾯?$A/8dY!{imS:cBe*S<;= Z̖0 ;Ay? RlILrSӠA.]ʸqxGY&/2CylٲP>sFAVV/oCyF???~ퟬ]6t֍s^1m.}!$$/j=(4َ8"M+@$[{1iY ixǷ?Pg|j̥1Dޏćs%{ Wj3ǘ#v+7-hs_\_J̇?i+Iq+;NZFxs&} ԆC{8f&P R9 ( vzw-bz˓Y;eٌc 9lO bV 9[V<ƒ(]kYmë`2 CorӵkWjիqƟnȐ! 2{7?EEE?/Ѷcǎeر<~~1m.+WzZQEp" W!Hv)P+ևHlG"␾d m C@@9MHs20A^BA!q%pE#BJt2ؘ_.x hG""|oD趡lC/7*Q7([rȏˠ7>lhNv@(&u|nefp8d=XO֦`;e$G7q$Ѐ,*Q0NF/aFHJT2{IKtq|y: 7BT}vb ǟa^d؇lWEiEQe "R!NvH*k8D9#%$] 4xl803 nq|Q;2ir7p+B@)>8 g`ŷ([]avpDFog3 &J8hI nc G9X@6b3RDX^8w)ɸ;s.,;&2 >}1px_+T] )QE׉"H+zF2Q 0esli,(*:G59HSh=(\s,`D| tEh;0 8$'2uI1"tÑ tFH숓 K\m D"R q;,FymVDT/G%EQqX 8 bՀ@П:v&N(͆pӧmXL&ޝwb5B [3y)J4^Ydž UǚAf M90M3׺.6Q:* m1a#(k[],A'\:wW;m1OpE\FZO+(+":wlDP>gTcǴ?"6:!Mqhg{ofńgǕ(ʟ BQEE1v<<Y4Ӈݶ|x[I,I'wĥ.^Wƫt޶m=*œJuJdO}{3҉ʄF4mѬYS;hTVEQ[ <3Uw'Y 9|dV_vaQKa[1ngrpE4 4c[ħjўZMk[\DxD;XvW|, F<ͻ'tk"L΄NSۄ4,Jfp'md Aa jq0ӓ1>5O%'tL$%J{ڼ Tî((\؉Dx#q^wAaH6ivK T@r+ &+ <`7r9i!( ,q!HkƾkwH,$cn! PXQrcQA[QEQnQRlf.TMy Mt s u<4"w/DM8f=dRI^\:ے=^@'N%ȱ‚4=8DM_6/|8Ex|qGG d%^4!ݓ`q q|ȌAC̅!5'((\{bu:"l7EnF`* M#'!f䝁ׁ@{".C}+䑇 vt]A8Y̷Fz8$;p*KpG%;Sr8@JEb8٩r|N5k೑pdÛZt=L.MnEvP:nȦ.GE+|֯pN[OS8g92jPv>MOvF IDATJr}.$JvEQEQEؑ>/Mm q5C"<*X "p!Bra D>Er#vͣƫ/@:5B:6AIS;8q!v1 3 #*_ >r#]-[ uWEQ%&3  m;Bh<H3Ljd4qyӁ|P]vSx*8wH"͌NA|Gq6; ͘XÅ 3$X0]SXҦWA[ZO(\ʛ4.\#B0QcG@ ʵ?€9HcwYfҗ4cD>gv""NqUhds"HԉEo'.]oPSZr0!Ɲw +skdp[OȰCRX0j؈͠ % .fwo{x2v$oNv~ QYLZZ DM;Rt` +Yw2:qD;DNCOB % t^"KFQ컖<`!S )lL288(7Zi=h(vD04blD="`"o_(Y p´q+X`^^P,`ۂO~ y"9K;,ʺV% (tzEصČ71l g#'9mTF:BS' I4^^V]R3!Xjys:Vb rh+((׋H)b#HVHH;ɹUcԭ6#$(VӝFu5mdG""Ġ0X |9l^KorQA[QEQna\NpmuxsRǟ3mbFqMFa/_q~ &oʑ y|<>JF+RpPZҐ8ERX=Z$x=i5l&)>Q%M{ O^){3LF(QH((r=hDCb=F"c8 0 "u#$dlԯ b@M41l"xB"d[؍׫(.D {"p{##hTVEQ[)+L&֮-z/|8|<:ʍ DQԝ7Ј"*];rF05/&h/}3~y͊{+wS|z ~E>u΁W}WLh}?Nq9m$H#FԲ[HR$l*cƐL2SIgvVEQEQZC=Z" ?B,$/"&HGE∎#y 4yaH&v`9+GY1@֝YF`'`=LH&(ʭ޷L/(o.5su/ dXucČaB'0xqQU,7YĈ!9ڵ)syŞWcA8iG,}QT3G/OOO/_зo_0 :3g27p͚5f6+(91RG\=„@^gNt쿰o7I2|粄%lrnb}?uoJATKĦš5nT{LF!@&R/?VGi>n#{gi{_ HÛBbslZ>u}áC"\L v|7=I_ooo2e5Z /EQE-ؑsucrz+so$[QnnI]]4.^zE)SРA233IKKbG27p̙DDDgYQE((\|JR W(m2tEJ\ƚ<:C"^:Kn4c%&"}և̝! )1abNXO2~|qjv<0Zžr02:]P$D ?$ hQvuGR[:rapy}jFI$@:Pnj޽;?8999l޼yޙUY"AQn. ii[.-mVZb5YTl lr5[( * GA@69xqhN5ٌZ3ݟsyy=9߾^7xC?EQE/4"Dȏ3I{`+pIk"fą}k퓀Hc_[Y"`7&r#uhI3!n#HIc,W$l7+:F=z4+Wd„ TVVx\\o6gsJ"]XD"a$̦,|8鑊z$+,%G]\6!{+)@lEND8Ѝtg{^&]r*v~mPVv;+vE 5WfMXP- 5 ڀg(N!C۰csf Geĉnݚe˖1c f͚(α/!O#nX?w!CqP # ɺ^do\0 4J0 b[Jv 0i8!"1Y F~Lt+7kgРA2h .spp୷ޢE#ό=}ݺu#1r٥onݺꊿ?6cƌݝmےpE_VGB f(FD"GLHvĵ9Bdb8 GlEF_KXG.N0cł=6l 5@u@mVV[d=)qxoG8vqMs2n86msνxZZɬY &\6%w6Νj/_Nxx8ӦM#::jV+( 3ޅfy<8)1g,9$MG?*d*Sil/p1f p|9;]PDP|2q!l>zCi~8 f"9WR/lewnyŁ6G1aa\* <B եqppEBrr2wunnnL:KǶmƈ#pvvfܸq:t芶O=?ZoٲvQNFŖ-[t2EQW`F@:q4"u !D$#btX"q!H_sG@#pv}ucVᨭsX#oF:H$I_q-akPfl;[\ 킂<==pww"r߀帹PYYuҥ޽GU4hwܡlEQlfͼ)N_A.!Ҕ$mOlIq9xEgpm;t`݆uD|Os8nr`J&mڻ-OCJŤPd}&6C<Fv\w㼥  gF CdSBE] P]QаЃqv*`ݒJNˉS*u%|23@Bܻ:H3:uv]WQQƍ/j;r7:77yyy8;;_#EEQZbB@az;"*N" R;QD@@r*w Q& NsG>cݛ <<qnaqW  Al zTr#7vSRR _ƍXX`Ξ=K`` EEEOOZzz:WWKiժ[QE!$ fN{3\fA|9í1ّ59C‚z hvP'ˡ,2fV|[Ǭ} dkx|mਉ`O qWYCjѧ8k|w{xIbYhF3ޛ^߾{j֔\R:Bh(ؿGIsꕖGNglܸ A?'22=|p¸{y饗Сåsbx5xyykoEQEQ5D0HH9R B\֋1 8uD۝~⑾u,baHVwoxx/!'[epi[}GQrc#C aTUUuVqFLš5k~vtRJJJ(//gڵ 0zҢ5k֏~裏jqHEQy`%7σ\{7҄&,Ǩ"HZԊ1p;iHC< 'L>̅>t\)v&07ވP`Zqڿv`~+9,f1ӽ_1SWi 6P+x-.Τ:@F?SW0%"Ȁ|@*p і:?8Wf͚SO=udƍǭʛoyE#Fc.\@LLU> Frr2.\ ::޽{d((ʯ$x >DPrƿ"NC@)3Rhǀ )8p@\ab #9J3|s-’HAȎF#{;2 "31KY+kFpMڑL0rh8;;fFΘ1'ビ@uu5111~޽{ /#(ʿ$ k:gK,)P H*Lه(!,p‰ 9=}{s3IR { dr&Օ74Ln iߗ6tzX8Gpꠍ&x8ñN-it%gZDsQx\Yh8=ە^޸1111(F{ ߲$Й-7hРAu4gIn]xL?ɽ+wq1nܸKO<ĥ 6O?F(A;zw! Ecw@'O#!&E=VH՛ cܭCV!L@/wNr(q9 ){xH6-%.3{EK_6FiZw=%Veb ))89F}a`м :fw;)3Bs k I ^ʼnIL h#77&T8u,Dv@Da.Z| ewt7"|wF(HHL6}yHFg\+X=ׇƘ#bvƽGr+#yrq7AEFF5EQESZ 3xD #*H#HȽc| C  l}RQ((`<k;Ex i'hPϞJd {m|ݗ.zxCטM{Kxhf(0ya "n6m ,{{Ͻ9 F7)MI!,JiwaOTTST;I\G&PAVǻLܼ+uEQEQJ_` R[D^˱|w1DEa?]yCqDs ^e*܉3k#-T qoO+}niV~cTVEQ?0&[K|m4cKgʘm+㘭r@ v|Ϛ7vb:fl4#,33ϊnsX^vOSv[rHʮxׇ %0ֲ+6 j8؂|486?̦e!贍, ;#>[K(((׏؎{|n"NIb(hA\vmG*"] d B,_І0~xh %Ƹ€p6_G\&D odt@DZ3kF(  qm]"{)tȣG9m TrڵY#i+Jdm7a߰1&FɶΖL|l?\x3ưVlۚԗSsu4ޅ M VAcsqI.+c__:;x6ȉ $y/-$(ȉ*((ʵd)gz!Q0m6^vāmSH\.@'r`#E4Rq\Q;xIER y}.[Dt߈K޹s~r+(ךL+@Vc&/qdk r,\42Lt"%V,$@{|{"8f~M.nTǎVC/ydp='2Ν,_ ڊ3VEQjHH&$]cw!ַ,6 MpĉjP$oO!YڡF?'HJQ~?=1j\âӮ@-A_~o(ʵ& >>B,[PN~2G5_rhWnIq70#8ȉH!|6JVCq=G UDZ+iO$;dӻLKng%MXf2k*¥=o$v`X )[c[E 99>ѵ(p<)B{&R0r+#7s9:юGC;6.TN)" qa G5ƱR=#8划H ʍD#GEQN@Y)c dӝqt #~ZQv65 qq߃OOH"MBRIaÂM BE$@t< V6嵃=N$X'pnt=-.ϩqG ے$LC!<猣g]WűaLMMp* LeFsv9WEQEQf$V$,Hn6+x1݃[AAl~`("P @)Μ1v\Yjl =XdnG SZv5ƎAבu+ؒ4M~V~TVEQ?8(JOߑC%REO Ǝf0w/Sp'b;Inr8cq[8ZkFosԜ䌦- \r0U}o.~|G_Է/yWI֤áb*V VbwXy1At)fo :ߊ((Ìg#"%Hf1`Hq?' ! k)2"ƽtf/F@">rQ`$Vd"`ٵ!.Pcш>CQn*h+(iS'cAJvCݎ>,&LZ4S/8pMDc J+q/($5HARSk>9.c!l!z4TKc]Dwyװc'#3?G>p I_P'8$|U&_ erqs3\ "%+((ׅ8ɛ8C>21OsH#$/ c}!bsHDae83}kCbL4"DC\? ǃĜ)Jf-( qpp(\A>Tcu;];hb~z{ؒѭr(H0+.#ii-RL`bN[LcKba 9g>Ƨ*z~GXgg|(?Mn[!}67M6ka_/A?r&EL82-h%1hQ]Ќ?EQEQ U$vDDf'`'bdaC2S;;)8 "{&N4҇q`_f7"jZv8ЎCs"k*f+7k'||ɯjw+}2bիdb?_(SiN՝eS~}SJ'Qj-x, ӑ[IUiҎ +$ )J'iӹW<23`yT&b~w"+I`:`"lO B^tw< BKe+8cb7+(( 3ⴞkyr'RHlt! xp?Pqmg"nNF_!3;qvBHndP2pRc{A3Hq>Fv8x?o58f>p(C{ҥl2~:uD^^ޥ߳ӲeK֬Yŋ?>oo(_tAlb/@)+x(/F~4#lN7q"rX(qAӃLHplIޙ-3ahJO)l/҉ h8Yɱcyw':BįFFp{{έOӡp$\6ӻսyY%4:iO/(((r=(@^D܊ďT@?hgÁ{!m' p9KZ/^`"-ʸ:$=ni"z صy^c;2QR/dž>Vn D>s ǏӺuk233iڴUxࡇbƌ1_k(ɓ};|~uɓIUڜ,Hk:PbcrHa}H9nqKR₝8[s'% 2  J%71' o}#r۶7/G%[7T\%AD[203z=1ycG7(amhvp-<MͰ:((ÊD!9ĵ}+})<帏 1"#w#%  َD\V<ac+GDt?׍vhHDBrx(č]+h A \s9DQ7$r$**I&ɓfc̘1Ӷm[bE[ɓn؏!Cٮ.'??AʠA(((o-ZŅ7dǎlIIR*f+(_CWWޟ»{ёx-^H7?\BYe@RO=1eO!#ȏ6ґә>lM}'ɪoXwT)i@F߬az F̉Y4xdZ& ~~Tk q%dY69G(S.=iyf<'ΰ|M%;VEQEQ3H.$ڋ&!4^; qr?ĉy):V9,`Omw!n }V.`oGbJrCqR ;"B\ۊr#j/_NxA6mTWW_:駟fҤI1|M\C_СCxgXp!Ō7y]8Ν˸q(..fڴi̝;iii$''f&L}lKl777Ν;_1њ(]H$唓K.⤋d P a v\('º,CFM&(oH GZLMLqT$\q: |1;yr>~R 16~NF~v,iix'u.wc]Ӥ34x e1,0 EQEQsx/d~OC`*0ۀf_zH!Hmla=qݥR3(1 D8q!!!?"đyNk H$INr3.]ݻ$6hЀ;\~U梨xV\ @^^ΗλZAOOOݯ>(//t/L:VEQuEJQM2pvT3x!$ByӞp%tc \Zg{|&^hW`7qϱs;p{v+>Ig]7JƆ8֮O;sAS^xͩ>iL]83cf#MPQEQEQn&D <\<|}Q {!x>"o9"D7E#9:xR|r-N76p0cs- E P΄nH~`e)R28'-8#A;==R^^jՊ 򢢢s~ 777tœ9sԩuDTʺBԾԯ_sY(**"887D+DEQ_¹cw q? yx;D57Cl,0x,wKujK)+`9cH`vlk 7S}oNbЫ3 FyA]GLGon |!v6LI&H9XpJpS NFL0O&,Ky *n+((ד0$JqF߉dfud!`.ض}Dx`я4نpۘB<m- qU څjPēCq~1v/EG#QQQ̚5GB>#F`ǎ\p+D`'''~aÆdɒKٵp:dV^MUU[nϫe,]Yv- M&*((G=uP5%؏ H'Ĉ˜S-9R D85e >|@2gR3[SDp9x@L NfRI$`#:F˙ r0H$'T?gU|8aCm~6@dd$&MbΝjժodd$&L"L~ 3f`ĉD~~555RVw(K<л#! Iܞ˲5xLa5,~<`LXJ3:" ?K d #PFWq[ERP%]?!i_o/a *}ˠo|g7hЀ#GаaC>ӟ~HX??;9\{+ ќݺvASilJP4n|vBtEQEQaEڌjD=1{1P[խ.5r]mW#$clAD֣֥0s4wҌ뿇;/ E'#5L@#ހ8 )r7?Vw(r5JMmM ,R>u7BpI`b^~6G)}}is+=A#CQC9AYE 0ךq̓葖{Yodvο2,dz4w6/ &<eI4Q`U (((vE*$j$=q8QRv&"שݞ#0cJFy@"ArF2$^$qV>"B{3Io b(rt()DBp97WzXpJ|1憔v#?>;cӈVw*OΓzS1u, IDAT>dsh݂xX' ŧc%6w, a6CH"+ٵַvحθ`Нl.y]g6 &O<ȊB*lX9bJ >S:ߊ((6vq;{1;!H>u$ !׆]("@ 7^E@mF 8/#b{*"0Fj8M6_ʿEQj0 9(8CY[ PAu`+(׊.>Ivxl^8G)5*⭟1 1EWt3b%잷[`--)yGW^vf%\q<=i['%`Ny`h "P)fgi VPB@|M 'NLK=:h2Fғ\q]wMʬG9ρ[u6O::oL,'W^JKuEQEQ l.(8#b 6!E"E"[#N-0⑼J,X4E׏."3 R1Xē<xo7`qqOFNT+*h+(|K>|HLq`/v/0BA"S \q?JۜIH\(uLJ{Xu'I a(L5JV`+[XmZmaf[mijQӰRGcb*(2* Q~oRË a׵w}S\S߀{Բ`-KsE&rُL'ĸ%<Dq(s`KM6YL4YvutO7c1,&>DY`8Y-xv M`RJ)u] ?C!u$fd-x K92@Hc)|Yd2w At8Pl<78w"0  !AJ%VJ)kW {b^c@/}]g)M-\ `H?0ŶX/ƽ?uXrw0y.Qoy+9@n@[u oƦiNg"s2j3=_K+ ^p8GpoW"Hm͝8B@J)RL?_1 B ./VCG!# <2Xm0jNiˋ0x$v"U"Uƹ,Hwo\o 4C:W8^[ o߮[@J)n_crkWh 1Y/6f1"hE+ooNyfur%:L=v3Rcz;ksyJ'v5'Kv׀4 2c{Dy~9ٖ0w.|CdglaEíO'8sF\)RJ8f /݁`f 9㵩072} @dY8Pd!mڒ@sObqZ;2}':ұ3ꒇL<_nG_ҿD6cql0$)F`!yƱ ~6 V8ln lGjJ~n*;N.]O+GRJYi[OȻa#$,[C>h6Y 'AQn9iDۘMXuZAuL" 9^_ 3p9bqڼi{afh81q&)$E#@VhAP"@}m*j6λ[]Dh+RX@|[@|1f^A(KE S1K3TG?S^I;淘#䦺 h ɍ\`n%.Am"Z頨wGzy:#w UhC޸)9^f.NRJ)ȴ)dH|XLV#!2Hl #%.@&"ڡ\q 2$ҌHHL@6E!o!7dqtF&>[dh+R"#o d!(, 4!|QeGJ<$<3E|N4At~,7.[&l(̬a41ZHa}s,c?>~~6<7}_t%쪿.Me8;RTEg܄MRJ)YjG@+$L=?ԁ!ѾHG:0 e<$iہȱH@lҘ$P_m<1Xh|2c< !ԥV7J)l|zwTY D;[TVܐJ*&'N<}̄7NdbilY; :& ?fV2C_[&q ny[Xpħ2I<%]RøЁܛ7l@jō#[)RJdVdE2} >LB_#SEzpxH fo [)oC& CԊ؍kJ1I3ΝԕT#᳐6ywu5~NRrB[I9B]6 4`Μ9nnn7db={VW^)2XIlj = e«^<2$ђmL1OC^hdcMqJ9lFhyϯ62q*!!iѱ3q'>L&$ G2j"$p(La-`73-P]dRJ)uSA*:w݋NyfIHH-PR$@q$qw!#holAj0I`qR|AuMR Oion_hѯ_?ƏOII ۶mO?eܹ'^9shڴ)EEEa6ywuRJ)'L^@u 4 v»[4~!0.!xa>*A]_e"v-;2u"LR|>ݷбke f8,>e7爍<@!si@ ]@ҫ^/lHN@;yf.RJ): So#A~LZ~th@oׂt`*{$~j"u97ީEȄv9RԎL12M 1[LV7ٯINN橧bȑ4oޜ?{g}@{g'OӕWJ) 0lEq̵-#QLS(!)7ҍZAQSyI$#92_ ,N [32E3Ox[3j\ <(SDp6BsB%ҡsEqg<ߪˮRJ)n $>ZȦp{roWMG ֑O ]+GH6bTg^x> <$_Z$0LG}nn_=_2tП|}dddn_~x{{ӯ_?\&nnn̙3֭[s?~aaadff+R@ld$]ژB< ϝ>]M7!{#(x1g4+e=LO@ԴJo9yX졑Gފb`bA0\C)qB*.ТSg2`3<_؛LJP3XO"ZĽ:Q@!zíRJ)nz `92bA& "_!!^sׁY ANuމL_;0~qo>8W.~ʑ8p>}:Æ &0}=/=k׮}t6.\ЕWJ)u3)=B<)M:\  d`C8iCe=jр;;m`C`boN U wƑpOlbEjS}]زp9*LU\궊,2y\$ߒO%%)KpfgYM4sz"OA0P3>J)RƻV!4@&F:=<$czF`d3Hp9ydi]@ҕ}ěR~p攍HPn2q{* 6w5ywD[dr͍+WcҘ;w. 4_V~ΐ!C ߯'[V-]yR=Gy9v\sdo/B^TsBqG/܇r!^^Ade%C5'U\Չѵ3"$BG9{ 'čؠ )S$S0q2gdpk>ʑp&ʫ\^w6m U_Қ8Ly;H$O9͐aDfhp "S=tݕRJ)ԍW GD0 B=I3H| @W]qo 2]I_+YNkUst~qĄ6do|$Fn_uM4ԩSly5kЫ]\\L@@rs~.ܾt>>d2+R՛hy ;.Uq<2α{iAoo#IW±͓iC9tG Wm8y=?]c/ tu֎u#|OU)QŁgW=vPyFfbC0{G^ϟiCc'ٞ41Ҙ\k '1;=@:*߆ yyJ)RƉLD As@?\H=(E6tl88h,C:kO"" n`W>#pC6ܽwg^ c\ssG#&kr[W}e͚5? +CBBp:R^^NHHϞgEGGsY4iŋ֕WJ)rJTG4EqXX:#&@P-;r"N*]<]'((=py_XlǏg 0gd͚5ߟYf۷/|3f̠VZX޽{+Rv'XԟhCZbpÛ8ʽĒhJGΧ^ɓ~,'99dk1 ,iHږѫT7.LөuB,ԧYI/s]8p/qa"._^i,`6Y9204hvJ)RƋpҧm7~LE_F"5> Gco3>ic0HCLJg*/"Mc {܍kx r70>TeW χfODq ;W^8p_>^^=n ɓ'9Yپ}RJ)3v6mQ{ֱtY:U8IF=6iKۼL6[ݱa+̔XgJ>y"\e4#jF ᵤQVO8B5 H,xiMJ͡H |ɿO ٶ RsV ]? 'tRJ)͑ $tRQS0_{cH ?1KEs7><&@ 2S#)H2; 87ĸz)$> suSHuiݍRJ)u#"]BZ\hxWVgO''I@ ?"A`#KxijB?ri,giʸz@2mJM;3.[h]:1IJidp{vm[z+0Wf ^X`NdH@=Efv$~i<ֈ/8ESNIȦ zq 2k,3A2mB6@-$pnT\ЂN*0~fopd92 mH`mGC"a6su-RJ)uiiʈ:[+D/jӎ3=a uS9gfJiP)+8YPCYR;y/=źπ\ۄCa6 ֈza_QTrp+Z@Ϟ6>ԜI ,x zN9̦M䜶S=-[PU0dQ;ĩ RJ)n)H8dȥTt;m$~ ]{#a.iw.#S 2@8o|8K(&g3RDRqm|7E&G## >в 2ET\a\!]nu hRJD9y^{ 7>pl*xXo%1)P͂8Uc%@;K6 E2kwm拯?Lޗ%+ 8(3Vq䜤/ 0/03o(M*3ݙOvZܨTMuy5dF8J)R*BE^H|vGvi;sH)9 TE`2ލO! O?f^2pl0ނdJ$t_tq: {tf' Sqss)u@)}efV+| S߯RS·p^%kb%S[pTpq]Wۮʹ}g'GB/ָhJi9.EWJ)R7\<6w@B dԈ"!s #~H|Xl$ TȘH3`cWiy)$ E&S翊Lbwz 1=i{k;gin6 RJ\ Gtzރlۗ޽? x4~GWzogg "MOF.'&f OQUF_HppO_?]a\naN:y0&5;6Ӡt .ʕq.\ j,{Zo-de0VJ)R7V A1n kjOAtmۑ*2֕c>OcF6\* QSFXD(.WEÒ@ZN|~=} VjrT7ҋ-pPV-<^`вRY)RJ>HD*GG&-tvq)dc?__A6DȤB$ !c|tޢjs[(\+? AI@&MH` sVHH[sdܦKnQJ)ns~~Х~ Z̄vu,er+8iA*}(Wr>=9¤Iߝǻs]P ?ѰtMVɯ)HlmNBB jnGC2/1|n;`ZgP^9y䜆2Z #oܿ[nƟ#)RJ)Y˸G=r\ l1[ atOGjG4 a? ,QR VJc=@:6j! $R[@mR6& _6ję\ZA`0i'TVՅ؉zRD6|OhV838)Vw+ȥp+}VF̆8bBq ՗a߁zTT6q,Q4=!TPT@:0tzVE W7NxB lCޢiVJ)R7Ac$LV !pZHuxNdz 2=Ȯo<'x }G/3@{1+AB<$P?to/ [>= x ikyK5Hˬn RJ\y9>Ձӭl\]uã_>rR6 15GR.J, HF6ٿ>5@9Hy2fUcH"S, |(? kI%w{M4Y::0N>) {Hs8xq-` wm7NVT+RJʄgGzE[#Y@9 4C ƹHo 02?lX8WxՌ8 9F䝏^uv0>_z#O5uK`)|C))\&Qf@[)%_~fP,Wߏ95̾L(`^<\6Eя X# Vg{񊇫nh7gZ8z& vBDCbz2J5CE9l[Z,OB|9I:ذ(o@`s!Mcj)4pЅ,]pRJ)uC5F6R|8LYz9j܍lf7CB{FEdqbJwf0ăz$>/!@2 >RS)2%HFBٺՁ5559~򘧧'˗/gȐ!jՊӧO Ͽ@vܹsi޼VJ)B׮PqxyD8léM)—픲і:a #pTJ!*v&2X dё2 f3! ώfeS^bKt,31ywch'hw v!/d3tKf4Ԟ-Q =ͩVZW å RJ)nw`8B6|܋ߟ#H ۑ.2=x||$wpXSEdz92  e}H Jqϑ.ҟHC !xu.EONh8 _f cƌa2Ԯbȑ9sZkcذaD6mn논x"s%))IU+!7D:#n[nfYy7;POFQ]PNYG&SPQ@bBl؏AnX9Rʸ HpgQew(_7(aGDkJc+` Hf%H:Cٖ{~'GJ?q$ɆJ)RJl%aG{2PtfBHw`  Dϻھ6D00ǀl31dqsU_D"$AHp~``BÆ4j2- ws孓-.ܺ\iOv.%눋(qk _6-<{!&d])RJ@ji'XHҊ$ /N@[㜞Ȇz'R-8FHENh[;84 =x~>\wQɀXeysds!rvP'GrJs:{Lj#_ކlfN3GC1X (K)deU ]gRJ)u@6X"Sw9$!ܹH6HP"87n| D&;s!!s!`ycNd$uqeŸ3&Lp"IveVȯ1azغu<W5*q Y k)%?,ҩW B1cqS0SBq{9bM ?AŸr!B^UjZ|ej.6 ¶s?a-|9o왡=ʼaY$כc&jO0۲b:СLijL ]QCaJ:.]tRJ)uC`H} $Wp!SϳCde+`0 -@q p 3V 9@7,QꞍl$L~7&#Aq$ނp_RJ)u0qYkiE.Y` GQ %nݘxc,.z@P+a6n1)5SJ55-V4-ӌf0kJM.)YIAYeqP'-Ks<۹/|\|>mZwuh@.aCYIzˤWD2"&CHvsT1U'.OdXn̫UGE5ƧNw:ń3G=FhEDDDg´`z_ c<1 `qL϶& :L >X /5e<ӟ$_3x+ DLe+(ĴDi { ӣS=oW \uDDD^ i^2Ϡbdڳ#0ӽ$XfAt_{wq{% """"3J+1vL嵙3pY fb`&pގi213;'9̭*bL^ ܁)XyOb Zl`C*k13I|/S IDAT \ EDDr~~zU,ZǛI#R?QZII"L{;'-8pd>]7p9iX:C q+.zHk-AfA\Pqg+[C!:`]y >[IOj?UwӠO1HՂGv[.""""?0t3vb L%6϶HL7"+L5 }z჋S$2hs 0W;AL5vK'tLO1DDŽU7ہ ]jh\rs돝JX) 4-<ddk8^ـq}xKAm!ēSb-kKw-AϦ.'aa8  :r%@29yaś`ZLThB0pzyVuR{RہuտT-mƍYgth׾cw_J pm>Κ8$M9zqӊfikʎf7>oH"y+9~$B f΂Ca+ n>X ]_ T a?S9|3\7MLpXK ӫ;S ]1S1UcRkW" Т"""Be%!=8 aoGp}0yş lɆp"=KH" xs 7$n[qWDD ~wZPgT(ra~/{۷ڌ%Za&X,uH+9L</}H#LL+bu;肩 y y@͝ZaHb̫$L+oĄu0C=&oeLyT-"""Cf&jՂ- ݃V9'0w| p!܎)2S ڛ`ov`=صO1!L5k]z""s),U 23Ͷ]KʦxGbOZ'u2x~$r4k@;d$lz,"*:qc-Z:HnC!k'C~!$ܸ&cBi< [A4۔K]HJihH.b""""rtń-^`1 4?Yx10@q@2&̎t_L z!6'{{y:&ûSy `3Cv|L8`d ƄIj~Rݷo_=l͚5zr?+""?EqoM=d,W$5p~kgӸb+Tn$$Lɥ}pV4ea˃DEىyaX ̭ũ [9Tw >1rAqh;6>$mf K}vW SMH=Lވ|a,* 0RLE{V 1=0܉7L88L ' #͘#=TU=r?a|e!r刈Su)ؼ:O'[ ȩh;yM{Y`6"DPXh@nAék,I^q'87+Ц TT@j*3-e70~u2?b} .$rI)\VLA1H`0&~s,o64v`#UH"TiôysajOwY9&S ;6`$L@wL]i}0s=-U#Wm(Q[_"CrN֯5((̤/'o x?1ǨW983qc̜yg7v`PFPFQ#vp}7E3CEp |QXLWW/Ф9577d9SP%mo\K۠0$cj-"""" pbb܀Y$k;r 㹦sӭHmL0ALuc,2W~cB 荙͈\I EDDS,Ǐȟ5p]V\l+_E{ = ͬ8=A7PQDGlݶENM>e0xs^ݔ>2q >7{EiBHېJZ+xg eP,qSuAܝPJ׾U@B>.֡*RPDDX܇ jm]at7KJ蘓Ñ431 $AhTxE>AxQ< ѵP2EdeEQ^~Mc~PKsزϛVozS:BA'p|\6dvM+(F*"MpfsŠ>؇1U5p2-L3<088Qub0Ls1)`g[ 8ט=  EKh/_l2n >4nܸbd를֙ h߾=bc ED/ ""s2v.>7>mB˾Qf|2݅cqsn3+Czcg 3hK7G7+ر[X817ޚ~Cz˷s7gRE o%;Jzfu{ c9t' `nˮ Il}иcH09E,""""OS`Z $b*3 s^1Cr],=Äu1cB폁@m? {yt`5o5r]@{2gΜhwԉGVW0vX233#"" c#YƏ<}+a#аN/fHXƐ-9_bc1he yiv=[*8dt"iݿC"coB=WRI>P5VZ" Kj0$^f]N2q;XW߇ЁhV>m cJL8Sq!6yL|&LaHLx L&ĐJs6A+PY7 S= ӿ{f0u6b{;p#MȕvIbٳg[&;; :t֨6`|M-[V#W""C:1ֱk]x [m`1ySdgM'fTi="boFa>=Lu/-!tN!Zn @~~>ח[nºa:N!::^Yfx{{hѢ^gԩtرF lnG&l ܜAضŜX[$ イJ , %xgm`@`bzz21/Qi Sq (,ʊJBR܎w^2I#OJJGx.гYC/c N78ox5$(l 9̜q`}? d` K6){vazmc= o+r~mbcc0a񔗗WO2n8?δiӘ0apȹڌ 4?+W2h ?/rIFԩS/>L¨Q8y$&L`ʔ)g`׮],X1cƜ:UQh1H9$7|}THŝ ˀ ;1VF&o$ԭ쩗Gn|~ ou], ?cy6%$9*yzyzo1–FVM~D+e 6ͬHӇyܑO?Hȕ8Tbډ we;#ᡇ &B\!Dv#jjyӥ>յ;,7 D *5l aBhr7?ߦQl~݇@ё 6uq$Xp؃;0,֟@TDDDDx `GsL_0`& S=c^ ŴyAL;:?'y0uUhLE.Lu{LXnThcb\϶=scy״[={l֭[~ 2#Gۯ_?ƏOII 7nѣxyyUWv ^^^r ((W;Ȫۯ b'";7@(bJ?8&z Ӌq°P6-{vB6̲턿{kATwiۨ1k(&o9E>i%PBW#+8a!̃52 ZMq*(?-"""" {z22#0#7̂@gV`d*cL: C=s\ Gm\XqNG~/Cƴ!U]\}o!I=#0=s4r]T7|Cqq1>>>ۋiժYYYDDDDIIY___vʤIԩ~~~ srr /Dpp0nzQPP@ppf-Yl!-Z@ΰOС[{Xrsx`8ߚU \F+// ( n9[a(%2&(:E?^p: '9C6|BFXR'0 \JផhsvBGLCxڛ6/哏̞i&A9 n a1U;ô ٕy5B!po1i4b*×a*Ǵ 0tUTea*=z{ lKppQ-GΝĉTW/9x`VZEYY DFFV[vm=z0k֬Vİk.ʈW^td:uO?®Ap뭰73WnGʎs]wvSTwQ-Z0=tCIQ*0i2ԩ=LWkLжrM]l|1H.L V;-M|_Mo!')\"m8m\;3q6nop#'cx,b椤:[DDDD.?0SY0L.Q^kJ; >DŽ4Ѝ]d[L~x; ˋ/]wСCiӦ ^qz+1117nk֬!22?7..1c裏ү_&5Yeeت ןQI˙_a 3Ѭ-4*kĵ=D]Kɱ>fgʽDC /jY:~Vhu"Acc+`8|(u5B87w;x28K'`q$\S@ϱoء1 ;f7+ذa+5""""rE0m9T` Ǵ NGa*;a Zڅ c1A8L 4uC2gV%_x/Ŵ-h c o0-L0Gb[rɁvڵٹsyׯ_T4hsdɒ^l 6dʕtgۨQ#VZǝKl) _(ݝv82Xw;Xpt{C 3`M@/i ZŞuԵŠY%uY>>A~BdSiR$2 1xrK0،~S2`@8y "1/*qS'/8 l@SLKV@9&Yq:%=90r 6`,=k>Y 2s}?NWPYL~2TkΖ+Av*mUgȅ =~s#Ot|e{n.6zD3;-yo'1X.x{.Q_B{UIݱGĽ Mo$\~~pF]5GB -ql) Hٖ빞䐤jDDDD Hفޘ3`4fXL%>L L̎„O{B yy  kThg`饘*mg(YRUK@WCm""ccF}KE s4cԂWM F$QlW-{w,pq{3MĬn'(mm]"cs|$w7d'R; _f4I$N:YY0H1-l[-""""Six"bZ| ~̚Ä&iW='ӊ|b<`xL+}b}@.yզ!_5Q1L<7uy\EnR6Jߍrl,Ȫh`2;  IDAT^Q!x?Ԟ ʗڹddx }uF@+J]w^G6Ptϸ?t}Y5t9A#[vqCi8<]XXXO ) EDDDp`` G<&ǴX 41!Lh`&> b*H#p'_[LPsoߜqN.&l?& Ow'TW'#re(ЮT-""ZMnܶzܼIE(X3 z!P$p\w-k%M;~G;wƟP)ٰ|oXs0ɼo ei$%+!Q۪'̯ckapÉ)i@7x-^ezP{:dw'""""ryEAӀ710B..L] |]#SS%}S]ӃjhLcwGDaB^ tWU]wTwb=a8N(L["""iŰ~9ݐ_MV*Hckߪ %1%`Hqiv#4idA2Pxr3j7iڕg^*% eۜF<,7ߍbBBlAln_+*3}Էa00=aLA{2{}+fQ0H! ;^ -3i~c|̢'Zn\1U5r( wy۳u+Xg\ }OKIiEZZ?&-l!--ΝN]0@JD֞fDIon`+e|tp^\@HOpS&uV:})9kZ5$@O6Sz`ISDDDD.?;s0}]0zήnLл&\v{zq d}m@w`6Z|gPL=P-P'MZEaڍ/qZ RZz"""򿮙ݖf1lKT{'}-OE sLկ>v.+W~IiG|tF= arפ=<} w~^ަ֓Җ;z„k~ bF `l=XoRt=Q_jf}k Z5""""r9~Ğ 9uU!`ZtĄM0=aJ΍z`N$ /|`_L@2&pZGykS.EJIk֬ѓEDrG="2Cm)\N,q3e\z čz6ؼBC!{2o؞MC([ 8pSS w <И]:94upee7Nxb_ʻXٷEq.dwH,!'sJMQDDDD~a\8dg  x VJ(L+Lː q`'RvN!Ws={t?C'-"""Mߖ[8 | |((X= m91ZNq(S? mBa`(K H>ump"fM{ʲ67Lw>E?   #GBacgGР>TaB L=, C0Գ8u1+W{IӆnLO3}Sq ^q{%ϥa_"""rAI'f~1³-5=?GNXf'֯#eOr`+T6*DQ)!~:O+}FIGpFEp`w&Q{^G.OuhV3N'\0 +ND>kyu!UP1}q\ S)mń~@7 sWx7w(2{$wZvL^K͡@[DDD~F˓!ދݎ:,mY·s`Ձv,Kp*,ε/Lʅ@Q[4""""R30auUOO<άZ(E8No9vq:H,Aa,$NMM'`ڵ3yd :bPYYoߞhEDD.R|E(!!l "`sig7f9 8IbZ9}0BI8Pp#8/Dcȑgm֭կN'M^^9}Y,=ba̙tם:u*;vh\R8]=r;G%!"""""?R{*_l~f}FNDDDDDDDDD*sсv˖-y_>#G'd^zs^[`cƌkm۶9LKq~m۶oԨV: :nᔖV~yslj/O-= hH@[DDDDDDDDDDj""""""""""R#(A EDDDDDDDDDFSNZffj=j@o߾zrٚ5kVDDDDDDDDD~rDDDDDDDDDDDj""""""""""R#(Ah[,.5,Y,Zر@ݺu=z4W._Ϲ?55[n???Ù9sH  p]w75jra"""={6̙3;fzj{=^y=;qop3OKK;>K&M;x v={кuk ?رchݺ5scĉWVh;N!::}^{f͚`5|pN:uAǞ:u zU ܹs7ny̝;}#GbpىHMvI<?@PPoٳgn:,KǺuZy߿JJJ?UDDDDDDDDDfBvW_.Z//gg*5oŴjՊ,"""Yhڵ>fŊU/y=;q&a=E?>ǏO?eРA}Eq]w`syꩧXhWŠ͝;'f3w\y}QwN-6l;wdĉ WɿLGEL%e<+_ɛo'""""""""% 3f >(I9sB///,Xy=áChڴY+++V^^NBB7n<|^zҲeK>c&M{7nSO=ѣg'?]EETz>WTTPYYAII9.:>3lԨV999WՀծ];wwIMM~ݯ_?mۦg'"""""""""5^-= h[d gms\$&&ለN\+V0xȐP;?ŨQIJZ#""""""""?;"r^{5:wLn/O=-ұcGpDDDDDDDDg@[D.?j1ݻ7fNϞ=1#Z#VZՋoBFDDDDDDDD~v*Z7Ufe*׬Y'wfX(**)//bቈ%}]fk֬s YTavUG݌DDDDDDDDS9[bbHMɞ锕}ﱕppKL 4 ZjQTT'$r kF^7qz}[vm4h@n IX,g[DDDslD4@Jց}_.QeYUִjϩB ojPDDD4pz]9\hGv{2:t^TVViX,X, nv%"9%q@DNس{7' RV-շҡS'AAz """c"""DҰ! )\"ctZIBDDDDDDDDDDj:z"".yTADD~_}FADDslB[DDDDDDDDDDjVhtDDgswq,ϩwDgW=>c "#v|ȠDD;";"#G-GDDDDDDDDDDFP-""""""""""5mhH@[DDDDDDDWyhڬ9M5gBl,GIZ|9X3! q!~sC6O^ޱ1Ff_2),,˵Qgms\q8"6֢Y?߷?G|);vpSTVV^o߹ίm_{O޽ٹ#;RhѢxt{#~[}c<կGq!nT]y;wۻ۠;? hA 864N'Vh,-mj}NvbH}\4iM a&1EL&JcɘZ&,Z5AA5c_8nX]Pݽ=w΍TrJmLdYm!oŋ;w?p>;'GU՗*?/S^~˲hyd*%%Ynnnߺӵz3?O >/&IImG0憮ed2{hq[ӧOҤcB{q1DMD8nw9={vZyzzJf͚/vYvl6Iҁ]m"zh29s}yBijjRAA";SWW34b佊>CW&njδ}v=tu O%]ٮ$1/WV<<<ǾC);;G=ӸHR}}bbV`XnpK딕iJxFWw)pƍ ;VAcjǎqm+3M|I^\xvV(wӑÇ]I UXXhϹ̬,t?L&}rU|=ȣ򪡡A̜#Ռgfٳy0 OvÏh={voj)1WJKO$ζl_(88ᜫ=3fjl6+#~ԤM7+&fyѨ:$Y,/kƌw!UTT~~t?ZlV\P L֮S֚5:x(n{*-a<9 lI2 :LY^zL g55",_%XMJ~. J_oQlL,{`BزyԜٳa>ڭ8yxx(*2Rwu{ǎ9W{h)4,LqQK?^ ںvnnnOKKöُϝSP`˲2Rʕfȶ;~]FNk,3 `s7:%)"b**+u%ۊUqgB۲yܸQ7J?l/jٲ?vX?üJᄏM~~*((ꌌno#4,L%%ι(TpJOOӊ?|Lqԩz9\9T\TLVhhm~/X!!3f d&M #ogJKKu` k.ZK/|ۏE:z̙;O92L]ǒd6Rjj~t(nWm /٪;PHQd&G K'=uxZe^ި^!aGۉ6a6k„ ޱa6n575Pyy1ju_zvr?l;LhR"IDATHMMbvdZ٣Y,\$BNp+OQx>q/qqiB mm !Cw`w`E/|/1+;6rp[`Bp[%@7^n_x0z=MۺUIENDB`3Depict-0.0.19/docs/manual-latex/figures/compilation.pdf0000644000175000017500000025004212640746376022477 0ustar pcuserpcuser%PDF-1.4 % 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream xZK$ ׯ{00 f0[3cu^GT=^ xYE'Jͧ~i}ɍS65e O[f!ѿj7bׯq;6ⷺcZnx?.-Kal!Յ-T~XC2I5d/Jbc7úwN̸vF TZ :ulu0))흡];id:_[C޼&Dɸb|X}X<_w˷ۋ~ 'eW_{ z!b^^{?Wll+\s*I3-!m92ֵgb#mղfsބTaD$}yҙq-V40I94fj0&XU[oc;RL'EDV$XGQx9>H@_жnAc!T[F_+btdmU&Z ^6#-ӋnK zs˴5msz_E+! neivaB`a>Wm 7Q2)yP)+(ˆ [29,ɤj[1έ˰bFq `uFu.ld3i ElRxT'Կ9!֬pu9tlrtо#&1=@$t>">ڦI>!;eU]ȘO1;Oxnfa'<X 8 "܌9j2#b6HH#&!Wd12YE h3O4{|FR@^7|DݮyouIjҦ.?}ktU(Uu5 K0k4z&V<b$k.4 7lu Zϙ8 صj3RT%mInr,+F@9􌤧EmJJ9Hʰiƞ'['rF87|XhIxž>+faRXv8JߌtL9<C8RHOh'DY4 l,-hY ОֻXkU=2`)VUd:8Tr,U=&Q5Я$:4M#ǻysrL"=! 1 k/Br k=((i7ėHf(jRB( C])Oʏttrt݋ k%d4gz(<[)jbq9cR" 2wpE T,0 Q=V~*t qB@TG _jY$XYTR}S!4XIʫ :q`bۭ|v}]6Wv+ 1aWKi0U K'r =c*GcJ!+PIxv9$gr?= .L[8(RwggUCXIC LD% x#~!\DP0 M 9ulPxɝ6wg ^5VU G}?O34TW/ʚv≟ ~OPlH޹Bk(qʱ6 F)!.yVRyN(Q|$n& *r\ xm\Æ$5@ںJ1(r|ʧYso&"Q[:ꡥKS@h^ *H<;=;k<&9#QԟhZ e4Mű1a Dr$B3ZGΎ~*RKRLzlC{HdFص.'tN~Oި & dkr*R,&,U9,9Lڶ]XdAx` PRFPcz/tI>PA[t1wf6mLSD5ը,4UyuS[@}U0M .ޟB-_?pڕ7ԖBa\KMε.H7WDbIhyɌO۳e}@i3]&ͧ볏*qѱ3[+jYiT+>2x\/YxxAъ8ZDÅb"7ah|{渑ONٗE:rRyiи5\Vk-t>gWetLX8/$wf]􅾔;4 /G2,i&ǰs#ugue@!2"$^VJX2u<Ï5{Qo7h n nrTpGjp~PdBrt ҍ0h}]!tR2TzoM+:\:݀f:;E8?|`> /a1 << /CA 0.26087 /ca 0.26087 >> /s5 5 0 R /s7 7 0 R /s9 9 0 R /s11 11 0 R /s13 13 0 R /s15 15 0 R /s19 19 0 R /s23 23 0 R /s26 26 0 R /s29 29 0 R /s31 31 0 R /s33 33 0 R /s36 36 0 R /s40 40 0 R /s43 43 0 R /s46 46 0 R /s48 48 0 R /s50 50 0 R /s53 53 0 R /s57 57 0 R /s60 60 0 R /s63 63 0 R /s65 65 0 R /s67 67 0 R /s69 69 0 R /s71 71 0 R >> /Pattern << /p21 21 0 R /p22 22 0 R /p28 28 0 R /p38 38 0 R /p39 39 0 R /p45 45 0 R /p55 55 0 R /p56 56 0 R /p62 62 0 R >> /XObject << /x6 6 0 R /x8 8 0 R /x10 10 0 R /x12 12 0 R /x14 14 0 R /x16 16 0 R /x20 20 0 R /x24 24 0 R /x27 27 0 R /x30 30 0 R /x32 32 0 R /x34 34 0 R /x37 37 0 R /x41 41 0 R /x44 44 0 R /x47 47 0 R /x49 49 0 R /x51 51 0 R /x54 54 0 R /x58 58 0 R /x61 61 0 R /x64 64 0 R /x66 66 0 R /x68 68 0 R /x70 70 0 R /x72 72 0 R >> /Font << /f-0-0 17 0 R >> >> endobj 73 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 488 261.600006 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 2 0 R >> endobj 74 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.913462 /ca 0.913462 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 6 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p75 75 0 R >> >> >> stream x+TH,)I-SH.V/07U(NSO4PH/2P0P0P023333T4@.A endstream endobj 76 0 obj << /Type /Mask /S /Alpha /G 74 0 R >> endobj 5 0 obj << /Type /ExtGState /SMask 76 0 R /ca 1 /CA 1 /AIS false >> endobj 77 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.913462 /ca 0.913462 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 8 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p78 78 0 R >> >> >> stream x+TH,)I-SH.V/0P(NSO4PH/2P0P0P023333T4@.nD endstream endobj 79 0 obj << /Type /Mask /S /Alpha /G 77 0 R >> endobj 7 0 obj << /Type /ExtGState /SMask 79 0 R /ca 1 /CA 1 /AIS false >> endobj 80 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.913462 /ca 0.913462 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 10 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p81 81 0 R >> >> >> stream x+TH,)I-SH.V/0T(NSO4PH/2P0P0P023333T4@.> endstream endobj 82 0 obj << /Type /Mask /S /Alpha /G 80 0 R >> endobj 9 0 obj << /Type /ExtGState /SMask 82 0 R /ca 1 /CA 1 /AIS false >> endobj 83 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.575305 /ca 0.575305 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 12 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p84 84 0 R >> >> >> stream x+TH,)I-SH.V/0Q(NSO4PH/2P0P0P023333T4@.A endstream endobj 85 0 obj << /Type /Mask /S /Alpha /G 83 0 R >> endobj 11 0 obj << /Type /ExtGState /SMask 85 0 R /ca 1 /CA 1 /AIS false >> endobj 86 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.575305 /ca 0.575305 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 14 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p87 87 0 R >> >> >> stream x+TH,)I-SH.V/0W(NSO4PH/2P0P0P023333T4@.oD endstream endobj 88 0 obj << /Type /Mask /S /Alpha /G 86 0 R >> endobj 13 0 obj << /Type /ExtGState /SMask 88 0 R /ca 1 /CA 1 /AIS false >> endobj 89 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.575305 /ca 0.575305 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 16 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p90 90 0 R >> >> >> stream x+TH,)I-SH.V/4P(NSO4PH/2P0P0P023333T4@.> endstream endobj 91 0 obj << /Type /Mask /S /Alpha /G 89 0 R >> endobj 15 0 obj << /Type /ExtGState /SMask 91 0 R /ca 1 /CA 1 /AIS false >> endobj 20 0 obj << /Type /XObject /Length 134 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p18 18 0 R >> >> >> stream xe;1 Dbj ĹaeiX!)|# {\Z MWڌ J3A$'R 93OT0f$I$N}b^ i>aF}G;i_g`N c5A endstream endobj 92 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.21519 /ca 0.21519 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 24 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p93 93 0 R >> >> >> stream x+TH,)I-SH.V/4V(NSO4PH/2P0P0P023333T4@.A endstream endobj 94 0 obj << /Type /Mask /S /Alpha /G 92 0 R >> endobj 23 0 obj << /Type /ExtGState /SMask 94 0 R /ca 1 /CA 1 /AIS false >> endobj 27 0 obj << /Type /XObject /Length 137 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p25 25 0 R >> >> >> stream xe;1 Dbj 'Nb;aiXH$)' \Z6Glm_B\, R TKQ U4nT9_}XuԹJᆿ6w0C;75 endstream endobj 95 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.196203 /ca 0.196203 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 30 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p96 96 0 R >> >> >> stream x+TH,)I-SH.V/4S(NSO4PH/2P0P0P023333T4@.pD endstream endobj 97 0 obj << /Type /Mask /S /Alpha /G 95 0 R >> endobj 29 0 obj << /Type /ExtGState /SMask 97 0 R /ca 1 /CA 1 /AIS false >> endobj 98 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.227848 /ca 0.227848 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 32 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p99 99 0 R >> >> >> stream x+TH,)I-SH.V/T(NSO4PH/2P0P0P023333T4@.G endstream endobj 100 0 obj << /Type /Mask /S /Alpha /G 98 0 R >> endobj 31 0 obj << /Type /ExtGState /SMask 100 0 R /ca 1 /CA 1 /AIS false >> endobj 101 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.227848 /ca 0.227848 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 34 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p102 102 0 R >> >> >> stream x+TH,)I-SH.V/040R(NSO4PH/2P0P0P023333T4@.͙h endstream endobj 103 0 obj << /Type /Mask /S /Alpha /G 101 0 R >> endobj 33 0 obj << /Type /ExtGState /SMask 103 0 R /ca 1 /CA 1 /AIS false >> endobj 37 0 obj << /Type /XObject /Length 132 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p35 35 0 R >> >> >> stream xeK0 }N1kN|nG,>* * 8/ӼOVt[[5SE#w46 qPxWVj *|!JQpK$[Goņp3 endstream endobj 104 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.21519 /ca 0.21519 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 41 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p105 105 0 R >> >> >> stream x+TH,)I-SH.V/040U(NSO4PH/2P0P0P023333T4@.k endstream endobj 106 0 obj << /Type /Mask /S /Alpha /G 104 0 R >> endobj 40 0 obj << /Type /ExtGState /SMask 106 0 R /ca 1 /CA 1 /AIS false >> endobj 44 0 obj << /Type /XObject /Length 136 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p42 42 0 R >> >> >> stream xe;1 Dbj '4M> /Resources << /ExtGState << /a0 << /CA 0.196203 /ca 0.196203 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 47 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p108 108 0 R >> >> >> stream x+TH,)I-SH.V/04P(NSO4PH/2P0P0P023333T4@.΃n endstream endobj 109 0 obj << /Type /Mask /S /Alpha /G 107 0 R >> endobj 46 0 obj << /Type /ExtGState /SMask 109 0 R /ca 1 /CA 1 /AIS false >> endobj 110 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.227848 /ca 0.227848 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 49 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p111 111 0 R >> >> >> stream x+TH,)I-SH.V/044T(NSO4PH/2P0P0P023333T4@.͚h endstream endobj 112 0 obj << /Type /Mask /S /Alpha /G 110 0 R >> endobj 48 0 obj << /Type /ExtGState /SMask 112 0 R /ca 1 /CA 1 /AIS false >> endobj 113 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.227848 /ca 0.227848 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 51 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p114 114 0 R >> >> >> stream x+TH,)I-SH.V/044Q(NSO4PH/2P0P0P023333T4@.k endstream endobj 115 0 obj << /Type /Mask /S /Alpha /G 113 0 R >> endobj 50 0 obj << /Type /ExtGState /SMask 115 0 R /ca 1 /CA 1 /AIS false >> endobj 54 0 obj << /Type /XObject /Length 130 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p52 52 0 R >> >> >> stream x]K0 }N1k$Mz 8BeP: X>37yٶguWQt[ƽQdDV(i1S2dghL2(5> /Resources << /ExtGState << /a0 << /CA 0.21519 /ca 0.21519 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 58 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p117 117 0 R >> >> >> stream x+TH,)I-SH.V/044W(NSO4PH/2P0P0P023333T4@.΄n endstream endobj 118 0 obj << /Type /Mask /S /Alpha /G 116 0 R >> endobj 57 0 obj << /Type /ExtGState /SMask 118 0 R /ca 1 /CA 1 /AIS false >> endobj 61 0 obj << /Type /XObject /Length 135 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p59 59 0 R >> >> >> stream xe;1 Dbj ľaiX $-|# \ZKuBcV( 5 $i-Uf JQdow7.LTTk}?=6_.wroj4 endstream endobj 119 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.196203 /ca 0.196203 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 64 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p120 120 0 R >> >> >> stream x+TH,)I-SH.V/042P(NSO4PH/2P0P0P023333T4@.͛h endstream endobj 121 0 obj << /Type /Mask /S /Alpha /G 119 0 R >> endobj 63 0 obj << /Type /ExtGState /SMask 121 0 R /ca 1 /CA 1 /AIS false >> endobj 122 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.227848 /ca 0.227848 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 66 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p123 123 0 R >> >> >> stream x+TH,)I-SH.V/042V(NSO4PH/2P0P0P023333T4@.k endstream endobj 124 0 obj << /Type /Mask /S /Alpha /G 122 0 R >> endobj 65 0 obj << /Type /ExtGState /SMask 124 0 R /ca 1 /CA 1 /AIS false >> endobj 125 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.227848 /ca 0.227848 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 68 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p126 126 0 R >> >> >> stream x+TH,)I-SH.V/042S(NSO4PH/2P0P0P023333T4@.΅n endstream endobj 127 0 obj << /Type /Mask /S /Alpha /G 125 0 R >> endobj 67 0 obj << /Type /ExtGState /SMask 127 0 R /ca 1 /CA 1 /AIS false >> endobj 128 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.745192 /ca 0.745192 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 70 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p129 129 0 R >> >> >> stream x+TH,)I-SH.V/04T(NSO4PH/2P0P0P023333T4@.q endstream endobj 130 0 obj << /Type /Mask /S /Alpha /G 128 0 R >> endobj 69 0 obj << /Type /ExtGState /SMask 130 0 R /ca 1 /CA 1 /AIS false >> endobj 131 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.745192 /ca 0.745192 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 72 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p132 132 0 R >> >> >> stream x+TH,)I-SH.V/046R(NSO4PH/2P0P0P023333T4@.k endstream endobj 133 0 obj << /Type /Mask /S /Alpha /G 131 0 R >> endobj 71 0 obj << /Type /ExtGState /SMask 133 0 R /ca 1 /CA 1 /AIS false >> endobj 134 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0 0 0 ] /C1 [ 0 0 0 ] /N 1 >> endobj 135 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 1 ] /C1 [ 0 ] /N 1 >> endobj 18 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 2.386323 0 0 -1.289162 -7.690562 173.760407 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 31.113281 19.007812 0 31.113281 19.007812 8.660156 ] /Function 134 0 R /Extend [ true true ] >> >> endobj 136 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 2.386323 0 0 -1.289162 -7.690562 173.760407 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 31.113281 19.007812 0 31.113281 19.007812 8.660156 ] /Function 135 0 R /Extend [ true true ] >> >> endobj 137 0 obj << /Length 138 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 261.600006 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p136 136 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/046S(N2P0P0P023333T4@.- endstream endobj 138 0 obj 64 endobj 139 0 obj << /Type /Mask /S /Luminosity /G 137 0 R >> endobj 19 0 obj << /Type /ExtGState /SMask 139 0 R /ca 1 /CA 1 /AIS false >> endobj 140 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0.231373 0.454902 0.737255 ] /C1 [ 0.176471 0.34902 0.564706 ] /N 1 >> endobj 21 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.743954 0 0 -1.189232 13.672273 192.349646 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 28.089844 27.203125 0 28.089844 27.203125 13.566406 ] /Function 140 0 R /Extend [ true true ] >> >> endobj 141 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 1 1 1 ] /C1 [ 0.788235 0.788235 0.788235 ] /N 1 >> endobj 22 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.344021 0 0 -1.344021 24.906281 198.989742 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 30.9375 29.554688 30.9375 35.804688 ] /Domain [ 0 1 ] /Function 141 0 R /Extend [ true true ] >> >> endobj 25 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.344021 0 0 -1.344021 24.738278 194.285667 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 31.113281 19.007812 0 31.113281 19.007812 8.660156 ] /Function 134 0 R /Extend [ true true ] >> >> endobj 142 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.344021 0 0 -1.344021 24.738278 194.285667 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 31.113281 19.007812 0 31.113281 19.007812 8.660156 ] /Function 135 0 R /Extend [ true true ] >> >> endobj 143 0 obj << /Length 144 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 261.600006 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p142 142 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/041R(N2P0P0P023333T4@.v* endstream endobj 144 0 obj 64 endobj 145 0 obj << /Type /Mask /S /Luminosity /G 143 0 R >> endobj 26 0 obj << /Type /ExtGState /SMask 145 0 R /ca 1 /CA 1 /AIS false >> endobj 146 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0.956863 0.85098 0.694118 ] /C1 [ 0.87451 0.592157 0.145098 ] /N 1 >> endobj 28 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.059086 0 0 -1.059086 33.267703 194.127574 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 29.34375 17.0625 0 29.34375 17.0625 9.160156 ] /Function 146 0 R /Extend [ true true ] >> >> endobj 35 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 2.386323 0 0 -1.289162 -8.270499 108.827351 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 31.113281 19.007812 0 31.113281 19.007812 8.660156 ] /Function 134 0 R /Extend [ true true ] >> >> endobj 147 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 2.386323 0 0 -1.289162 -8.270499 108.827351 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 31.113281 19.007812 0 31.113281 19.007812 8.660156 ] /Function 135 0 R /Extend [ true true ] >> >> endobj 148 0 obj << /Length 149 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 261.600006 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p147 147 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/041W(N2P0P0P023333T4@./ endstream endobj 149 0 obj 64 endobj 150 0 obj << /Type /Mask /S /Luminosity /G 148 0 R >> endobj 36 0 obj << /Type /ExtGState /SMask 150 0 R /ca 1 /CA 1 /AIS false >> endobj 38 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.743954 0 0 -1.189232 13.092335 127.41659 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 28.089844 27.203125 0 28.089844 27.203125 13.566406 ] /Function 140 0 R /Extend [ true true ] >> >> endobj 39 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.344021 0 0 -1.344021 24.326343 134.056686 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 30.9375 29.554688 30.9375 35.804688 ] /Domain [ 0 1 ] /Function 141 0 R /Extend [ true true ] >> >> endobj 42 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.344021 0 0 -1.344021 24.15834 129.352611 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 31.113281 19.007812 0 31.113281 19.007812 8.660156 ] /Function 134 0 R /Extend [ true true ] >> >> endobj 151 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.344021 0 0 -1.344021 24.15834 129.352611 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 31.113281 19.007812 0 31.113281 19.007812 8.660156 ] /Function 135 0 R /Extend [ true true ] >> >> endobj 152 0 obj << /Length 153 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 261.600006 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p151 151 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/045T(N2P0P0P023333T4@.w* endstream endobj 153 0 obj 64 endobj 154 0 obj << /Type /Mask /S /Luminosity /G 152 0 R >> endobj 43 0 obj << /Type /ExtGState /SMask 154 0 R /ca 1 /CA 1 /AIS false >> endobj 45 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.059086 0 0 -1.059086 32.687765 129.194518 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 29.34375 17.0625 0 29.34375 17.0625 9.160156 ] /Function 146 0 R /Extend [ true true ] >> >> endobj 52 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 2.386323 0 0 -1.289162 26.584188 44.048391 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 31.113281 19.007812 0 31.113281 19.007812 8.660156 ] /Function 134 0 R /Extend [ true true ] >> >> endobj 155 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 2.386323 0 0 -1.289162 26.584188 44.048391 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 31.113281 19.007812 0 31.113281 19.007812 8.660156 ] /Function 135 0 R /Extend [ true true ] >> >> endobj 156 0 obj << /Length 157 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 261.600006 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p155 155 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/045U(N2P0P0P023333T4@.. endstream endobj 157 0 obj 64 endobj 158 0 obj << /Type /Mask /S /Luminosity /G 156 0 R >> endobj 53 0 obj << /Type /ExtGState /SMask 158 0 R /ca 1 /CA 1 /AIS false >> endobj 55 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.743954 0 0 -1.189232 47.947022 62.63763 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 28.089844 27.203125 0 28.089844 27.203125 13.566406 ] /Function 140 0 R /Extend [ true true ] >> >> endobj 56 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.344021 0 0 -1.344021 59.18103 69.277726 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 30.9375 29.554688 30.9375 35.804688 ] /Domain [ 0 1 ] /Function 141 0 R /Extend [ true true ] >> >> endobj 59 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.344021 0 0 -1.344021 59.013028 64.573651 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 31.113281 19.007812 0 31.113281 19.007812 8.660156 ] /Function 134 0 R /Extend [ true true ] >> >> endobj 159 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.344021 0 0 -1.344021 59.013028 64.573651 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 31.113281 19.007812 0 31.113281 19.007812 8.660156 ] /Function 135 0 R /Extend [ true true ] >> >> endobj 160 0 obj << /Length 161 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 261.600006 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p159 159 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/04T(N2P0P0P023333T4@.w2 endstream endobj 161 0 obj 64 endobj 162 0 obj << /Type /Mask /S /Luminosity /G 160 0 R >> endobj 60 0 obj << /Type /ExtGState /SMask 162 0 R /ca 1 /CA 1 /AIS false >> endobj 62 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.059086 0 0 -1.059086 67.542452 64.415558 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 29.34375 17.0625 0 29.34375 17.0625 9.160156 ] /Function 146 0 R /Extend [ true true ] >> >> endobj 164 0 obj << /Length 165 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 163 0 R >> stream xe; A S yZA8[+N B3!c29PRYᠭ)ksB^nBVi' Ƶ+ށyU- u[)h sLd,EF -$˔ }. endstream endobj 165 0 obj 149 endobj 163 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 75 0 obj << /Length 166 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x164 164 0 R >> >> >> stream /x164 Do endstream endobj 166 0 obj 12 endobj 168 0 obj << /Length 169 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 167 0 R >> stream xm P E|ŝcҾ.PWqC:`!$$lpb갹' ~Nnjḋ]sQsc9FCQru ^6\R€/IK]/Hyɟ}A])H+ endstream endobj 169 0 obj 137 endobj 167 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 78 0 obj << /Length 170 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x168 168 0 R >> >> >> stream /x168 Do endstream endobj 170 0 obj 12 endobj 172 0 obj << /Length 173 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 171 0 R >> stream xm 1 > >> >> endobj 81 0 obj << /Length 174 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x172 172 0 R >> >> >> stream /x172 Do endstream endobj 174 0 obj 12 endobj 176 0 obj << /Length 177 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 175 0 R >> stream xmM A S lF,V,DD7ga& 3D,V4M1U{N&[sM9(Q߼qxcsYƅ;L`܉HZ0xJ(U0h (f93'{@Gq/ endstream endobj 177 0 obj 150 endobj 175 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 84 0 obj << /Length 178 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x176 176 0 R >> >> >> stream /x176 Do endstream endobj 178 0 obj 12 endobj 180 0 obj << /Length 181 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 179 0 R >> stream xm P F<7 ^s7] i7:p^N[őMUnH/&JCPƙ2C?i sNB,~ @\#_GbA5=.fZzs+ endstream endobj 181 0 obj 136 endobj 179 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 87 0 obj << /Length 182 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x180 180 0 R >> >> >> stream /x180 Do endstream endobj 182 0 obj 12 endobj 184 0 obj << /Length 185 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 183 0 R >> stream xm A D|Ԃk66`qb! 'rW9,,> >> >> endobj 90 0 obj << /Length 186 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x184 184 0 R >> >> >> stream /x184 Do endstream endobj 186 0 obj 12 endobj 188 0 obj << /Length 189 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 187 0 R >> stream xeJ1 }ycM G {Xo/xPBi󵙜 oK43OZ\_*bx9iͺ[[۩ IM1EFyh IRԐs3%ej0a],NI٪ w6)+-ll{.=O[QnA 8cx@ endstream endobj 189 0 obj 205 endobj 187 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 93 0 obj << /Length 190 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 -0.000000000000007105 0 ] /Resources << /XObject << /x188 188 0 R >> >> >> stream /x188 Do endstream endobj 190 0 obj 12 endobj 192 0 obj << /Length 193 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 191 0 R >> stream x]A 1 E9ſMۤ= ] ^mK 9'y1:v;OppӶb5QAɔKșbD؊> >> >> endobj 96 0 obj << /Length 194 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 -0.000000000000007105 0 ] /Resources << /XObject << /x192 192 0 R >> >> >> stream /x192 Do endstream endobj 194 0 obj 12 endobj 196 0 obj << /Length 197 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 195 0 R >> stream x+*T/6TH/VЯ020PpW ZzN endstream endobj 197 0 obj 35 endobj 195 0 obj << /ExtGState << /s199 199 0 R >> /XObject << /x200 200 0 R >> >> endobj 99 0 obj << /Length 201 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 -0.000000000000007105 0 ] /Resources << /XObject << /x196 196 0 R >> >> >> stream /x196 Do endstream endobj 201 0 obj 12 endobj 203 0 obj << /Length 204 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 202 0 R >> stream x+*T/620SH/VЯ020WpW YJ endstream endobj 204 0 obj 35 endobj 202 0 obj << /ExtGState << /s206 206 0 R >> /XObject << /x207 207 0 R >> >> endobj 102 0 obj << /Length 208 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 -0.000000000000007105 0 ] /Resources << /XObject << /x203 203 0 R >> >> >> stream /x203 Do endstream endobj 208 0 obj 12 endobj 210 0 obj << /Length 211 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 209 0 R >> stream xeOJA S &d@(P=RA{(JXf&3k1zzx.&5Bp#,/PQW7Rre Sʂ@{ ;*u*W FXKENFkmg2tH!sh4+b>l]f$Fӝ.UqVG5 3>c9;A endstream endobj 211 0 obj 205 endobj 209 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 105 0 obj << /Length 212 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 -0.000000000000003553 0 ] /Resources << /XObject << /x210 210 0 R >> >> >> stream /x210 Do endstream endobj 212 0 obj 12 endobj 214 0 obj << /Length 215 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 213 0 R >> stream xeM 1 9Ż1mvbt)."bpD !|I^~& m,>(IxҶ' .dajl5#H%Ljw\%pڒ3bENb ϤĽ=:ZaK`drKZgW9`^9 endstream endobj 215 0 obj 161 endobj 213 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 108 0 obj << /Length 216 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 -0.000000000000003553 0 ] /Resources << /XObject << /x214 214 0 R >> >> >> stream /x214 Do endstream endobj 216 0 obj 12 endobj 218 0 obj << /Length 219 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 217 0 R >> stream x+*T/622TH/VЯ022RpW YD endstream endobj 219 0 obj 35 endobj 217 0 obj << /ExtGState << /s221 221 0 R >> /XObject << /x222 222 0 R >> >> endobj 111 0 obj << /Length 223 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 -0.000000000000003553 0 ] /Resources << /XObject << /x218 218 0 R >> >> >> stream /x218 Do endstream endobj 223 0 obj 12 endobj 225 0 obj << /Length 226 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 224 0 R >> stream x+*T/62PH/VЯ02TpW Z\R endstream endobj 226 0 obj 35 endobj 224 0 obj << /ExtGState << /s228 228 0 R >> /XObject << /x229 229 0 R >> >> endobj 114 0 obj << /Length 230 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 -0.000000000000003553 0 ] /Resources << /XObject << /x225 225 0 R >> >> >> stream /x225 Do endstream endobj 230 0 obj 12 endobj 232 0 obj << /Length 233 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 231 0 R >> stream xeOJD1 +&M/G OP=,{[aJe({=殝]_՟E*oAN5U7ӣvlˡ=irj_ft+CpF1( x"eȒXvEVN =ձX>auqP䤤}$LG%v r!m\e3+r?ɡ.B endstream endobj 233 0 obj 210 endobj 231 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 117 0 obj << /Length 234 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 -0.000000000000007105 0 ] /Resources << /XObject << /x232 232 0 R >> >> >> stream /x232 Do endstream endobj 234 0 obj 12 endobj 236 0 obj << /Length 237 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 235 0 R >> stream xmM 1 9Ż1I'Kq!a oGR&u$T gAʮ s ‚ uaj,@&ST h98K9=;cmg0S,oӿk۟OSO/(;{ endstream endobj 237 0 obj 165 endobj 235 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 120 0 obj << /Length 238 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 -0.000000000000007105 0 ] /Resources << /XObject << /x236 236 0 R >> >> >> stream /x236 Do endstream endobj 238 0 obj 12 endobj 240 0 obj << /Length 241 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 239 0 R >> stream x+*T/621VH/VЯ021QpW ZL endstream endobj 241 0 obj 35 endobj 239 0 obj << /ExtGState << /s243 243 0 R >> /XObject << /x244 244 0 R >> >> endobj 123 0 obj << /Length 245 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 -0.000000000000007105 0 ] /Resources << /XObject << /x240 240 0 R >> >> >> stream /x240 Do endstream endobj 245 0 obj 12 endobj 247 0 obj << /Length 248 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 246 0 R >> stream x+*T/625PH/VЯ025TpW YH endstream endobj 248 0 obj 35 endobj 246 0 obj << /ExtGState << /s250 250 0 R >> /XObject << /x251 251 0 R >> >> endobj 126 0 obj << /Length 252 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 -0.000000000000007105 0 ] /Resources << /XObject << /x247 247 0 R >> >> >> stream /x247 Do endstream endobj 252 0 obj 12 endobj 254 0 obj << /Length 255 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 253 0 R >> stream xm!0 DQSF$-9GPDgXߕӵe'ueeքs*,$:k띩xu+@ۍ endstream endobj 255 0 obj 96 endobj 253 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> >> endobj 129 0 obj << /Length 256 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x254 254 0 R >> >> >> stream /x254 Do endstream endobj 256 0 obj 12 endobj 258 0 obj << /Length 259 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 257 0 R >> stream x+*T/623TH/VЯ023RpW ZL endstream endobj 259 0 obj 35 endobj 257 0 obj << /ExtGState << /s261 261 0 R >> /XObject << /x262 262 0 R >> >> endobj 132 0 obj << /Length 263 0 R /PatternType 1 /BBox [0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x258 258 0 R >> >> >> stream /x258 Do endstream endobj 263 0 obj 12 endobj 198 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.321677 -0.244058 -0.244058 -1.321677 33.281839 202.953362 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 20.660156 35.816406 22.625 36.21875 ] /Domain [ 0 1 ] /Function 134 0 R /Extend [ true true ] >> >> endobj 264 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.321677 -0.244058 -0.244058 -1.321677 33.281839 202.953362 ] /Shading << /ShadingType 2 /ColorSpace /DeviceGray /Coords [ 20.660156 35.816406 22.625 36.21875 ] /Domain [ 0 1 ] /Function 135 0 R /Extend [ true true ] >> >> endobj 265 0 obj << /Length 266 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p264 264 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/023Q(N2P0P0P023R(JJ ` endstream endobj 266 0 obj 59 endobj 267 0 obj << /Type /Mask /S /Luminosity /G 265 0 R >> endobj 199 0 obj << /Type /ExtGState /SMask 267 0 R /ca 1 /CA 1 /AIS false >> endobj 205 0 obj << /Type /Pattern /PatternType 2 /Matrix [ -1.314029 -0.282345 0.282345 -1.314029 98.974752 204.69218 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 22.6875 36.390625 21.410156 35.738281 ] /Domain [ 0 1 ] /Function 134 0 R /Extend [ true true ] >> >> endobj 268 0 obj << /Type /Pattern /PatternType 2 /Matrix [ -1.314029 -0.282345 0.282345 -1.314029 98.974752 204.69218 ] /Shading << /ShadingType 2 /ColorSpace /DeviceGray /Coords [ 22.6875 36.390625 21.410156 35.738281 ] /Domain [ 0 1 ] /Function 135 0 R /Extend [ true true ] >> >> endobj 269 0 obj << /Length 270 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p268 268 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/02P(N2P0P0P023R(JJ a endstream endobj 270 0 obj 59 endobj 271 0 obj << /Type /Mask /S /Luminosity /G 269 0 R >> endobj 206 0 obj << /Type /ExtGState /SMask 271 0 R /ca 1 /CA 1 /AIS false >> endobj 220 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.321677 -0.244058 -0.244058 -1.321677 32.701901 138.020306 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 20.660156 35.816406 22.625 36.21875 ] /Domain [ 0 1 ] /Function 134 0 R /Extend [ true true ] >> >> endobj 272 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.321677 -0.244058 -0.244058 -1.321677 32.701901 138.020306 ] /Shading << /ShadingType 2 /ColorSpace /DeviceGray /Coords [ 20.660156 35.816406 22.625 36.21875 ] /Domain [ 0 1 ] /Function 135 0 R /Extend [ true true ] >> >> endobj 273 0 obj << /Length 274 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p272 272 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/027R(N2P0P0P023R(JJ ` endstream endobj 274 0 obj 59 endobj 275 0 obj << /Type /Mask /S /Luminosity /G 273 0 R >> endobj 221 0 obj << /Type /ExtGState /SMask 275 0 R /ca 1 /CA 1 /AIS false >> endobj 227 0 obj << /Type /Pattern /PatternType 2 /Matrix [ -1.314029 -0.282345 0.282345 -1.314029 98.394814 139.759124 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 22.6875 36.390625 21.410156 35.738281 ] /Domain [ 0 1 ] /Function 134 0 R /Extend [ true true ] >> >> endobj 276 0 obj << /Type /Pattern /PatternType 2 /Matrix [ -1.314029 -0.282345 0.282345 -1.314029 98.394814 139.759124 ] /Shading << /ShadingType 2 /ColorSpace /DeviceGray /Coords [ 22.6875 36.390625 21.410156 35.738281 ] /Domain [ 0 1 ] /Function 135 0 R /Extend [ true true ] >> >> endobj 277 0 obj << /Length 278 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p276 276 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/027S(N2P0P0P023R(JJ a endstream endobj 278 0 obj 59 endobj 279 0 obj << /Type /Mask /S /Luminosity /G 277 0 R >> endobj 228 0 obj << /Type /ExtGState /SMask 279 0 R /ca 1 /CA 1 /AIS false >> endobj 242 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.321677 -0.244058 -0.244058 -1.321677 67.556589 73.241346 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 20.660156 35.816406 22.625 36.21875 ] /Domain [ 0 1 ] /Function 134 0 R /Extend [ true true ] >> >> endobj 280 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 1.321677 -0.244058 -0.244058 -1.321677 67.556589 73.241346 ] /Shading << /ShadingType 2 /ColorSpace /DeviceGray /Coords [ 20.660156 35.816406 22.625 36.21875 ] /Domain [ 0 1 ] /Function 135 0 R /Extend [ true true ] >> >> endobj 281 0 obj << /Length 282 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p280 280 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/00P(N2P0P0P023R(JJ ` endstream endobj 282 0 obj 59 endobj 283 0 obj << /Type /Mask /S /Luminosity /G 281 0 R >> endobj 243 0 obj << /Type /ExtGState /SMask 283 0 R /ca 1 /CA 1 /AIS false >> endobj 249 0 obj << /Type /Pattern /PatternType 2 /Matrix [ -1.314029 -0.282345 0.282345 -1.314029 133.249502 74.980164 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 22.6875 36.390625 21.410156 35.738281 ] /Domain [ 0 1 ] /Function 134 0 R /Extend [ true true ] >> >> endobj 284 0 obj << /Type /Pattern /PatternType 2 /Matrix [ -1.314029 -0.282345 0.282345 -1.314029 133.249502 74.980164 ] /Shading << /ShadingType 2 /ColorSpace /DeviceGray /Coords [ 22.6875 36.390625 21.410156 35.738281 ] /Domain [ 0 1 ] /Function 135 0 R /Extend [ true true ] >> >> endobj 285 0 obj << /Length 286 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p284 284 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/00Q(N2P0P0P023R(JJ ` endstream endobj 286 0 obj 59 endobj 287 0 obj << /Type /Mask /S /Luminosity /G 285 0 R >> endobj 250 0 obj << /Type /ExtGState /SMask 287 0 R /ca 1 /CA 1 /AIS false >> endobj 288 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0.976471 0.976471 0.984314 ] /C1 [ 1 1 1 ] /N 1 >> endobj 260 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.448954 0 0 -0.448954 165.89461 188.40424 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 130.75 88.457031 67.503906 166.601562 ] /Domain [ 0 1 ] /Function 288 0 R /Extend [ true true ] >> >> endobj 289 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.448954 0 0 -0.448954 165.89461 188.40424 ] /Shading << /ShadingType 2 /ColorSpace /DeviceGray /Coords [ 130.75 88.457031 67.503906 166.601562 ] /Domain [ 0 1 ] /Function 135 0 R /Extend [ true true ] >> >> endobj 290 0 obj << /Length 291 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p289 289 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/0T(N2P0P0P023R(JJ ai endstream endobj 291 0 obj 59 endobj 292 0 obj << /Type /Mask /S /Luminosity /G 290 0 R >> endobj 261 0 obj << /Type /ExtGState /SMask 292 0 R /ca 1 /CA 1 /AIS false >> endobj 200 0 obj << /Type /XObject /Length 123 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p198 198 0 R >> >> >> stream xmK0 D9ŬY8ub7-*φ H/ص{ q^^a SEqpkAR)`:M(eS.Z]ܿT3ߺ){n~w=sҺ, endstream endobj 207 0 obj << /Type /XObject /Length 124 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p205 205 0 R >> >> >> stream xe9!s^ѱVGm2NqX%u߈8} 8 FH"W!'> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p220 220 0 R >> >> >> stream xe10{bkϿON"H,Ѭ4F}}6xG|0o ރf*MQ> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p227 227 0 R >> >> >> stream xe;1C9kI2b9*ӰY@cғܲ彡uHEoqTP "پ4r|;0IS@pP ˘Scq%U07Dg2)j endstream endobj 244 0 obj << /Type /XObject /Length 123 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p242 242 0 R >> >> >> stream xe;0 CwsRXEzgiֹ?܍Fm~VԆҤhuEX"L =ib<#f>g3%*{B>Fh⬚q8!QӺB_*a endstream endobj 251 0 obj << /Type /XObject /Length 122 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p249 249 0 R >> >> >> stream xe;0ާPM- q$zßm~V0 ܇#U,bdB-"*ؤrbσ59U>I4gD8xo'wq_,| endstream endobj 262 0 obj << /Type /XObject /Length 119 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 262 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p260 260 0 R >> >> >> stream xe;0ާb;-Qģ_!w,nj!h ms I+>Й9&I|R%̔TOi?~څCx\)&y endstream endobj 293 0 obj << /Length 294 0 R /Filter /FlateDecode /Length1 18812 >> stream x{ |ExU5s;Lf2 @#$&@8}$$,rEW/XœKVXWQseUP㊻F]dW13W=o:^]]UB"jF g/@&G$}xwVAE ܞw !.2os9A}=ssN^ىPv2*,K(r%+V߄(w.^6{&bа}P>d= ܰo/5~0>D`9`Ap/t=qlDȥ%3,])+/].WJ /,oB~]E2ۍ.x')3,ifN^绥KNU㩤RHOճD-DzzQ ^/ dAo 02Amix$ i_+҅ucb˨^`&Vs,l'ƊR-3;XO˒I8-B@M|\?gvIYR-)zo 7(N:e"l H'NO,\M*$MVPk8?c3T^`HI'/=G{F'{sFR2 >| D~v8$tZ^( %D'G&6;eMsfO6}ƳPH@ZXߵ}nR'6,"i4{4MRĨ3 {:dt$*b, l!9 Bp_¬ `oLS./']j{QII/ -P-Vh5$ m'H='{H^n(oyhg#F\= Y89b%5q>n/wc+ 1>kb (&QgI+ܽwK>HFgyJ*C0pJP Z_9Ǽ/ܳXQ@ N>mDۭ=֧m6kWƴOXhy.xgE^rc#l7{K,A̞ˎ\Q|<%qc[hI``h[;::ؿ>}5 ]= C L/Rhed䨳9!0v5,`r+ f3CAޮ߬0e&Ƅ;MYHA5hP" #kyMؔbL(Rtac|7!崀}B H`Oz!Y^>)PRwXwAu˽[0\)FXӐ9B!(%\&^|l_˿ǾӶ> ÛƉX| ,Z|^Yn]`@4mN`HO/4 Iߔ^kM_hX^b!"t g^" igWІ԰\.D,ՈM*pA3rfHA$-ųg}wpZ{O۱8ze)??? VK?Wk 4\RdsIr{Nj-%ie}v9mdnx~1SՋ fNgK(),0؂fuW#7 B >\[n؊S4V[:T4ʱU\ہ/I{;⎹Y>>5𳴲 x]v&0GJsS%JF@xAk8 + ATZ7 ={z}gJ־? Iס3/0ᾡv]RDv;x̄I;Bp0*ZZfᏔ;d[rfmiw*BD+,I4AȺP*qUfNxZ:b}.:BI &> &6{.Jќʼn$ћ A:S\ՙMHIx Ϥtw6+[ݝMJI~c SL.A`\RÓq..lcx\p^Ltr5tYfXn%u`Re̒EJ l=H&x07$ƀ% zуR"f='%R$P7l@9ukK "1ǣުԽ#bʹεbDA/'{u9oZvݞ؃SGxwag0 ܑ ssb7*X[3m/"/6)6zف ǔ1]錝WR\Ƭ7#JNyRNX;NA~N{ډ) zK.S\4F!hlИm##VxhE 5wuzc{!ǮڧAr)) +%O9>M SZV;EW,iu IX"lW`Kkwe{w5;Ӳ=ӻ_p\qJȎM^goCtm)퓈$( *3ZBbG Qr)VK>{"()4˕tzƃkhD}r5 -k,VuEKZ($!p6rTޕᯣxAl4{{Y2A_0uTSAE?~/6 RcٱOyzm6f8<XΡ9_72CD\ap(*J{4<:19}"ƒ&d Dh 9.8D_wݯ][[h?$HN!I*!o/tD;Ns׿CCr/&i=Xw˸W{bIVHm20{ aV!lC?܉;o'T'Q6WZ/aA* &7x_*ffM 1QM-eҔѩj&ִmVc!BRSn4X9M\[hXdkwޡ[cXcZ'Li nfZt -{M) M)F{<g`J2\gϽv4P2u?:l^13TY=m"'gQЃVnZ5UOTX@C05 kl&ٝl8l'v\'ž1'&oS"Y^!+ѝv!%l'Zd"nS)k~F 鲓R !s8HrHȓ"4p`ApSuw*sANDJl0(05ĝa׆L3'f%ќȤitcj5ak>(N==Ƈd}[In*B1JM+Lk$Z)ddpu>GHݕt2ATjBRWua^%%'*,lkâǿ~<굏qc95K |owSZϿ5p߮'y$uQU?:|x*yE6R.nn:}hDgOc iܲßi1U5*WGWB%`C jrl "~q?NxW7[Gem\Rhɑh_ߋ ޾fcA]'`-U?QC*JU5!7ެYez`;km!R+۱ljڛBEՊýbmju1µ$iReH nԠ@5f9ѫ!Ckc^Z!O?>u6|TvTKxW 6VE2p:;@$7o3gf4:71h]R^䲼^k=Zc:"!+c.јB&lEyBf+8MnifmE<a0e:dMәP!՘fJd PvfC̃g~_ :w`??^`/\z- A%pZQzQ2!+oEݤMFYȂb qQ`0j&SXԀB p-m2՘zA4,c1 yrh"pn^3N""^&I( 3^f^o>EIS:WW+j !]} Szwht q[֩K 01)KBRq ]vk]-#PbY76U ~`HzKΌ}%ue&'X Pќq6T't֎4UPf%Iz2یDw&)#8$%{=!'#3,9G:Vp%RNΙb&g*1U+Ÿ{M?R/TRe ='=n;/R7n<{@=jźN#^g7̺_Zz{B0{δ=0P }z L}[!p7~*?M˘ vXxcx:[8we9׎a ?PogVg/xC櫄j:nuzk,1 Kx^j5Pj4A @|ω pY4l'6q@J@VO;!JB`m _iZﮀJu-ƳAk5xEf$j5< R &կoɧ־êWǺ (6;EI|%Zut 56;f+VJM'VII  OOO(DW!5T8i'pHVo%94 WNjX8} 0 bѤm֒с3l1]gn?J ת`+1a+C?Qӝ٧~2Tӎ.ET?o],E /R aYS@BQ}0}:UG_UI#M 퍟aPm!C5Sƹf]@Ih"0,F:qN;kQ^tH0̋Ƕ6Jt%EEP~/s saܴHp=wLu#F}Qg9~-by{1J*cVТ ,KNBqȭ.ͭ({qlc)?o`~,`ޠL~JsWns"3t=Gþb-9h9'?r̠~Zd9#Kׅ&ŷoJoؿ1ŸkCvxwg`3(|1h٤ۨ_|q8UN4 ,Sb猬L+f1ϊdP̊".-ab S?4S2 R✣2RZhDDو>ugb&էh@CNS;f '3!Ӡ!ڈwJ*~Af[$^)ե{t{2zt+7h '40oeٰ?=m{| qJ2Gk 7sk,k,G-_\r^$M ,ւp'Oz6׭L4n/cH:jh!# (z2,# KH +zz' 5ǣJ[mqXQ<ӏo-(])uW+Oϝx^kO$҈wrm/U=3\zA>,P|h|ar]*^ZB*@6]T^w$e^A RYO 6^k?Kҧ4hE #j"q/&2tg$-]YLB9 NfiNG'wL{jojyѝʸ1&f1s MΘ@bOz_PzA/{, *CLrzjQhp87K kTT\WMoK5pĒ?/yߦʴ*u!Pjḙ2ᴃ,.jFP&aU<䑑T餞4d 1&&Ig0L=DOϙ+̏pXl cJq++{%f0D.T ZapHxOSyD~<)cH" ~0p*ُupd(.!d/B2p96y@Gan'.rף6P^1Yly ea}gJW\3F$eW5ہA/LL x| -"B [уx;݇rZzbOdB9]!N gCwZa"DY}ʼ?M^fƱx>H:56;*<1x* AeY?Uj@=05N[/x@OA @o-O&hgĠu ŞA{b.4Zx~%8~ %|oF@B>"/P;pF~&iaYf0F956iCb|XDcQ:~-phVFPJ+ZTX=8+spP0%}I^_f%ѠׁC0( # ;3b uFODS?@Ϲ\%̐rTi@&TA@UN5o7ereѫ淔ՕZuzq`juA.4bpf|^ *E\R:,9'R9ẄQ"(02b ](5~TDP_#/Aȭ-;%4.3*̬0ὥǚOExeTՖ[=LKsL--[Ⱦ U7iZ] π{Ipt]hxv b$F6UWE&xLgBg_}-#u4xVC.[&WOzfՆZ&Rd[fJ8a[pczS\tD!"lFR9Ф.npWdȂvT]TD.(p@wf)\g5hÑt"(XSp70cU' $UmgVe~t*h"e!%3\!uZK|uյLhBLZ6(x{Me-u-Rz[.bUxHxzgZG *S4j GGZ7u.ѻTmÌ^φoa``'OkiM8Mˣ"h Hf:c=H6vWӟ΁Aѵȣ[Zfvƚgd)rF^ki(8{<۫Vq@uM[a*NѨ/R)>8͓4@Q x4JB?HE?PMMh =E7O\Jۨz?ymFȗzrͦTTP8'xyhcfC4ꞇe_Dˡ-CŴQ! ǿ&6GKaP'd@HZ d!i,Bb,[YcBλro$yAT.me?P  ๩ y`RJopB`WWa$%pK}>WȈ21t  3v~fzcqQ:ݣxV-Z&qMnEnsՃFqjF[vƎ)&' "{$ac hf!źf0gI\@G%n4gq38|֓@M%{pS)e p "@>T"ӵQS/ cH%g֟!5;Km/>f™_?g,NN|v97""^<=$T4rf"<sm@0>@ @%itmv~"om"S񛀓$%#G,΄v=⋍0c@%3vInC| }gГ,)Qc2MBE ^yo({H} G!GК Ih*$4g!h6r4 UL$WRR}_M9978_$rTTTm1~`k?1HOԒxgW%e#ƒpqXC΄4{~8#LIPS%3\\ hYt-pOJXfpER,#Ŭ1wbá/ҎВ h>׉j H$.@Mj9y5"/ypvw2|]H:I {{6P!{m73;5Ps4ԉujK'ծ6]- MPRLiR,<+N{{`x6;4>pJ~'d*B"d _ Gi,Ic5F5hF)'LWwyH|Q#VO#ݳQ,9reR0q8b)GGF Blb$?\*ojjNU<44906oCqڦ{ӾYbn.]_X哪"'VGi&X].?UWfMN5}}NO07jf'2\B$Wnԟdwv6M 7pZyGø}h"4ϒanϬTK#rК\CJ[QMm2,0}Len޵r+*r|<++k2F}RyUFVCv_> stream x]j0E -E5~5 %xM4N lg;PCǣѱF}nݸȫFg=7z>.ѤhVonIҐ|WZ7~ҏ<6Ov!QJo޲ImG:^'vʒQP[^U qnCߊŠ"kl̖Kgw> OCx/J|\,+t"(TPځJP@RFځE"#O:,1HIg ~$U4JSïkY*| J:%4*jURSH?JH%~9BqF\j/*˥HVpFZb+aKr~]ίc)wmOx?^8Yo2/4 endstream endobj 296 0 obj 417 endobj 297 0 obj << /Type /FontDescriptor /FontName /Arial /Flags 4 /FontBBox [ -664 -324 2028 1037 ] /ItalicAngle 0 /Ascent 905 /Descent -211 /CapHeight 1037 /StemV 80 /StemH 80 /FontFile2 293 0 R >> endobj 298 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /Arial /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 297 0 R /W [0 [ 750 666 556 222 222 500 556 277 556 556 277 500 333 556 500 556 556 777 277 666 666 722 666 722 722 833 556 277 277 556 556 500 354 277 333 583 556 277 583 556 583 333 333 610 333 500 ]] >> endobj 17 0 obj << /Type /Font /Subtype /Type0 /BaseFont /Arial /Encoding /Identity-H /DescendantFonts [ 298 0 R] /ToUnicode 295 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 73 0 R ] /Count 1 >> endobj 299 0 obj << /Creator (cairo 1.8.8 (http://cairographics.org)) /Producer (cairo 1.8.8 (http://cairographics.org)) >> endobj 300 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 301 0000000000 65535 f 0000079692 00000 n 0000003558 00000 n 0000000015 00000 n 0000003535 00000 n 0000005632 00000 n 0000005185 00000 n 0000006521 00000 n 0000006074 00000 n 0000007411 00000 n 0000006963 00000 n 0000008301 00000 n 0000007853 00000 n 0000009192 00000 n 0000008744 00000 n 0000010083 00000 n 0000009635 00000 n 0000079541 00000 n 0000025670 00000 n 0000026861 00000 n 0000010171 00000 n 0000027091 00000 n 0000027534 00000 n 0000011432 00000 n 0000010984 00000 n 0000027865 00000 n 0000029056 00000 n 0000011520 00000 n 0000029285 00000 n 0000012786 00000 n 0000012338 00000 n 0000013678 00000 n 0000013229 00000 n 0000014576 00000 n 0000014123 00000 n 0000029600 00000 n 0000030791 00000 n 0000014665 00000 n 0000030880 00000 n 0000031201 00000 n 0000015930 00000 n 0000015477 00000 n 0000031532 00000 n 0000032721 00000 n 0000016019 00000 n 0000032810 00000 n 0000017290 00000 n 0000016837 00000 n 0000018188 00000 n 0000017735 00000 n 0000019086 00000 n 0000018633 00000 n 0000033125 00000 n 0000034314 00000 n 0000019175 00000 n 0000034403 00000 n 0000034723 00000 n 0000020438 00000 n 0000019985 00000 n 0000035052 00000 n 0000036241 00000 n 0000020527 00000 n 0000036330 00000 n 0000021797 00000 n 0000021344 00000 n 0000022695 00000 n 0000022242 00000 n 0000023593 00000 n 0000023140 00000 n 0000024491 00000 n 0000024038 00000 n 0000025389 00000 n 0000024936 00000 n 0000004622 00000 n 0000004830 00000 n 0000037136 00000 n 0000005572 00000 n 0000005719 00000 n 0000037886 00000 n 0000006461 00000 n 0000006608 00000 n 0000038648 00000 n 0000007351 00000 n 0000007498 00000 n 0000039411 00000 n 0000008241 00000 n 0000008389 00000 n 0000040160 00000 n 0000009132 00000 n 0000009280 00000 n 0000040923 00000 n 0000010023 00000 n 0000010631 00000 n 0000041741 00000 n 0000011372 00000 n 0000011983 00000 n 0000042533 00000 n 0000012726 00000 n 0000012874 00000 n 0000043224 00000 n 0000013617 00000 n 0000013767 00000 n 0000043915 00000 n 0000014514 00000 n 0000015123 00000 n 0000044754 00000 n 0000015868 00000 n 0000016481 00000 n 0000045549 00000 n 0000017228 00000 n 0000017379 00000 n 0000046241 00000 n 0000018126 00000 n 0000018277 00000 n 0000046933 00000 n 0000019024 00000 n 0000019631 00000 n 0000047777 00000 n 0000020376 00000 n 0000020988 00000 n 0000048576 00000 n 0000021735 00000 n 0000021886 00000 n 0000049268 00000 n 0000022633 00000 n 0000022784 00000 n 0000049960 00000 n 0000023531 00000 n 0000023682 00000 n 0000050689 00000 n 0000024429 00000 n 0000024580 00000 n 0000051361 00000 n 0000025327 00000 n 0000025478 00000 n 0000025578 00000 n 0000025991 00000 n 0000026314 00000 n 0000026771 00000 n 0000026794 00000 n 0000026950 00000 n 0000027413 00000 n 0000028186 00000 n 0000028509 00000 n 0000028966 00000 n 0000028989 00000 n 0000029145 00000 n 0000029921 00000 n 0000030244 00000 n 0000030701 00000 n 0000030724 00000 n 0000031852 00000 n 0000032174 00000 n 0000032631 00000 n 0000032654 00000 n 0000033445 00000 n 0000033767 00000 n 0000034224 00000 n 0000034247 00000 n 0000035372 00000 n 0000035694 00000 n 0000036151 00000 n 0000036174 00000 n 0000037062 00000 n 0000036644 00000 n 0000037038 00000 n 0000037383 00000 n 0000037812 00000 n 0000037406 00000 n 0000037788 00000 n 0000038133 00000 n 0000038574 00000 n 0000038156 00000 n 0000038550 00000 n 0000038895 00000 n 0000039337 00000 n 0000038918 00000 n 0000039313 00000 n 0000039658 00000 n 0000040086 00000 n 0000039681 00000 n 0000040062 00000 n 0000040407 00000 n 0000040849 00000 n 0000040430 00000 n 0000040825 00000 n 0000041170 00000 n 0000041667 00000 n 0000041193 00000 n 0000041643 00000 n 0000042008 00000 n 0000042459 00000 n 0000042031 00000 n 0000042435 00000 n 0000042800 00000 n 0000043126 00000 n 0000042823 00000 n 0000043103 00000 n 0000051632 00000 n 0000052864 00000 n 0000060985 00000 n 0000043491 00000 n 0000043817 00000 n 0000043514 00000 n 0000043794 00000 n 0000052954 00000 n 0000054188 00000 n 0000061430 00000 n 0000044183 00000 n 0000044680 00000 n 0000044206 00000 n 0000044656 00000 n 0000045022 00000 n 0000045475 00000 n 0000045045 00000 n 0000045451 00000 n 0000045817 00000 n 0000046143 00000 n 0000045840 00000 n 0000046120 00000 n 0000054278 00000 n 0000055510 00000 n 0000061876 00000 n 0000046509 00000 n 0000046835 00000 n 0000046532 00000 n 0000046812 00000 n 0000055600 00000 n 0000056836 00000 n 0000062319 00000 n 0000047201 00000 n 0000047703 00000 n 0000047224 00000 n 0000047679 00000 n 0000048045 00000 n 0000048502 00000 n 0000048068 00000 n 0000048478 00000 n 0000048844 00000 n 0000049170 00000 n 0000048867 00000 n 0000049147 00000 n 0000056926 00000 n 0000058156 00000 n 0000062763 00000 n 0000049536 00000 n 0000049862 00000 n 0000049559 00000 n 0000049839 00000 n 0000058246 00000 n 0000059482 00000 n 0000063208 00000 n 0000050228 00000 n 0000050615 00000 n 0000050251 00000 n 0000050592 00000 n 0000050937 00000 n 0000051263 00000 n 0000050960 00000 n 0000051240 00000 n 0000059693 00000 n 0000060895 00000 n 0000063652 00000 n 0000051609 00000 n 0000051980 00000 n 0000052329 00000 n 0000052774 00000 n 0000052797 00000 n 0000053303 00000 n 0000053653 00000 n 0000054098 00000 n 0000054121 00000 n 0000054626 00000 n 0000054975 00000 n 0000055420 00000 n 0000055443 00000 n 0000055950 00000 n 0000056301 00000 n 0000056746 00000 n 0000056769 00000 n 0000057273 00000 n 0000057621 00000 n 0000058066 00000 n 0000058089 00000 n 0000058596 00000 n 0000058947 00000 n 0000059392 00000 n 0000059415 00000 n 0000059572 00000 n 0000060026 00000 n 0000060360 00000 n 0000060805 00000 n 0000060828 00000 n 0000064093 00000 n 0000078362 00000 n 0000078388 00000 n 0000078885 00000 n 0000078909 00000 n 0000079140 00000 n 0000079758 00000 n 0000079885 00000 n trailer << /Size 301 /Root 300 0 R /Info 299 0 R >> startxref 79939 %%EOF 3Depict-0.0.19/docs/manual-latex/figures/exportanimParamDialog.png0000644000175000017500000025642112640746376024472 0ustar pcuserpcuserPNG  IHDR[G"k pHYs  tIME " IDATxw|Sjn RD(PQ^EYl?7d ^eS:hLwK]8C3)m&'s< '" !xL BeINJ˲>|dSꓢbT @3ao'^XxXq "h>DB@s$2@nbT&UqG4^2UY^.H*ʒKw4WQQx!Evv>&x.\31#ᷔN-{E1 Geb"U̹+?l6n@(D 4 "ɤ lpWL4G0^:K01cHQ>䐡Acq++;Z$o͕Μf<=[ Vh#ǽ2`je eْRgg'{VSZZ,LG*2ȮYVF"F N+7}dUTaTUY))ʲ4T= Y9"ݭ0=#3'7 ¢JPqź nq$2w/.!S}dXGNCD!m_>!1me))-Ϳ{e` 4MZzR""7WWSwL[A\S28*9o`-#\=Ɛ\*`2\FD KKSTUUU:::vѪe1?is8.%5=//_òn!|!׮Ų\ppEBa㸴􌼼j]ې􌊊 "JO|*:=C?OK l/h}8;߽[T*# RH$.Φ"~?']*̖p{\ߎ|=S v;(e V0A(VVU!rOGG'Ð@ ȟNJKJJJJ\O>vqqiiA1 q\jZ^Zz&""J$gb22B!77+#3ZIDyL7>JT*3-)(о]H-qME"aLR0J%HZDe?'ȉʩ_:U~&=$DD$q#Jʨ#8!'T2[n2PTtX?_D/70 %$%)..V2 ӣGWHcg')))---sp/WN{6S(Wa?_;;{Ξ[RZ%Q|w[nb/\3%Ҿ},C&okԚ E޾UDQU]hղT"# Z}9=>0A嬢$% q rdz0F"dg/t~Bw}%@* k/ "T6_tj,Uj/~x{]|eYOO]t #ԅ SStVZz/77/''W.tqv`)g''"2-lm_[^aoo4DTٵnȏl*0%5MTsww3_}}X8g9w:\ V*$eT*J{{;@ qF$*L&3]ɤ`24ADDj잳_6nZ<# Wz~U{KtW]:5C!JR3 c'Ij/"H#X,6;~އf$ѶtU.[ߞƙa4IndY[DWCGsNqbw7ES8UĪko_*h֮]'S"K4#Ǒy1CX;qpqi().F4D$/8j0LREgɷo3N5 4G4G4G4G4G"3?p(==]200СC`"z)uWc_Du<}{w8=/?A&Yǝ;wh"2ƣGTٙsnnQ{imo`nݺ:sgd*GAAO{{{痗j+SU]U]#F*Y,!"#8itW>\_(m'Nnc.eۏ{"sYڗEEER[&>>ARXzྴJK}G2?JUZR+݈/߰)!1mh(3ee[vss#ʪo"bY6//K.rtF[XX$ɪnBo3iIIyvf,__gO:ccxSO?lſFHl.-=}?+V6-vص{vݿ=;hS35xv.^zi(>֮?9]zm fN7a_zyWmv+.t>gϝ=g1Lq܌sGQt>;Tjoa?y_h_~6{0~83sM3g/YZ#G߫gT(;~r˷<ݺ䦧g8w>mh1ADFv""P333-kc߻ҥoksj";hYGɩe` J(c{[]LLLd2oaԴ;)ƾED ÌV󃟭:~$gd3'ϝ)))MOO8qsܹ^=#8/-ޑ#^vqq&nݺkӸ@};;i49`݆M-;wbYzSRXP ɴrm+B*yݿ8{F I޾377]DZhIYYؿ/[l8cOZZrOOs/g~~u2"`???e/]d+**KJ\]\(++`2pg.Fxy̛Ξ;~]?_7W^znݶ].lժeTB~짟kjA۶8=/]QYYID\h4S]]}WR lo6Jڰ[o[+Ft t-:'\YYg>~@Ϟ[nnȀMw=Dѩii#" իWTWUwгC#\l7zDibfْ8շSԩ'?yTXxWG[3/g'#"d"+B&GV ?j :mƂsp.&)&tH}ˆVTTdzzxيZNKK6z:;[O?ng322q4[N}{G|_kߘ5@а[jO&@GHd1ScgjHtƜH$QWx0+"Pk߆vw$ݺu u@2P `U !"3jԉf~Da@q?"Oq5K}ӫ@m`LаƳ+4i1 W ̂`%L@"B@cfhDc1.tҧOo"wtpdViwG~噁[TTW⬻}Cڗ:t{O>ˑ@ ?@]50ş!,CYYEK'M)//º Pd=pLE(((xpoo{///<~ mܫg$eY"*.)QT%99ݝ,BZ '"??_||J ѽ_ZZkggoz9w,ˢ"fGGnpE2LRŇ;x v@GJ˲UU-|S˖ӷ Y|Ys.\" ==u۶ͮ..,Nhk!m <<ܿۺ/k󍛛[||YǼII8iP pssj岾}Ke=y>L^Qȍt :?}\޻8hD1 . "@DK/L>}zwҷovmChԏN9G OS||eLmN8vSg.ƜJ޽{ڒw;88>򿙳ګ ̘9g!EG1I>ńc'.qLaΞ;?{<[c^7Ƒsgp_{^WDc'6gxU++] ~ѰɼΝ7lRk7o""WZRSӈQ~䈗W|Bqzl^=|)iwRƍ}1Nɩe` J朳?ȑ]]\L4n|@et`O4=waCj99wuuq {u[ͺ ӧ}6I://O ۰I[fΝX-,(drqw|w9;;NӓbD3~a]Ԛ k 0V^=233H0w?yĩkWbEEEi[QQzT_~Og>T>>???e/]] ^QQQ\RxGnl<h<~۳ "J:vħg:dvvv&rM4Yw\@Q {30jx ":vBթS8yy{%&o Be,뎝|z"+%5bqǰ0t5xJ"8.&F 7HRmmSȍFNQѣs,ۙg.[KIIQkK0=F1Ϡ}ɓe?xJT^D4qٟǟ;w;|h?Z=l萫׮Qnn;ޓJNNNyyy1usѳwAa;Flw&MVþȓNpٳ\&dPC da Qh䘤ě!oWUUboPh,QQQIii`@4˲Y*t'U\OgFZ%wrr7S]V@7~bpP9[nN<}{wu>''WgOZn鴏tG KԉoOH{ڄ#F2U}xjl[7Foժe%(-:2LԺFHTapu<F_E,svҽ{ L>3 ֊ ZhX"Tc/++dd}f&xzNo, 4 ¥+ׯs"P?_]҃s=v}0q ^}P3 X%Dsp 4@-Zvo%$$ 6L(zzz&$$|=ɓ''OJD_|ʕ+oݺվ}gϾ%,;jԨχ{yy9rdIII_O?m۶qƝ}.]N:cǎ}]r2XhZztP47nO= UPl[~V>ŶU( DBp!"̃&-[y攔8nرG;}~;v؊}*d"? 7׍7>|?ڵk;w$%Ko~/_޶m-ZΝ;GMNN \jK.]v-&&={6˲'e0؋/Ν;_MHHرc ںU+6mڌ5^)=ƌ[>v D?$X^ĎaB)Hp9Y gNE7lĜ?yX;.HaQ{ `ND@9";`[-X_bbܿO>8;~F!={ _~%4@D,?рߍ7"eٴ4"JJJڴiGJ پ}_~'394&[Cvjy 6 |76C6@L}СC|sc=oݶshn&#ldt `y DAWlͥ38CZ4\޽{ڑaY6==]TC Ͽ{nppP(4E "uxo ?cQMTu͞3O~ uӚF>jMh.*hrj_#A=S(43 o01p@;v%4DDBokFd8::k*_r\n]^ѣx\-[h1u) 4n8@ 0 p:A QN*Ǟ#< Zw:  |3>#δ ,Q_\@n׽hV+KtD1b|cF;#>AVg Q Q$9 "`AK0@`0[\O" n?kf7~BmP*Q\},˝9s땕~~}Dn qw5_a \#j[vCnkO;WN翺/هp<3@7:@}E>6@p,***f̜>pA9~4m}G `݆#l72Bw@5H@TITF${`  "1m\X @n0q"kِo,z:srrsrr\]]|nT*UwrO"JKOWv/44D,ǾoݶmG?D4A~u ?}h QQK\7:kUUU#ND "GGGGGG"Zl~~~Y,W/Wpvv"Ohr=/g' 9{.>!avBh4?bL&,qO  ՈDCODD`#p'%URk&ˉe}˯4q)[YY>O&Qqq"+ 5`Q{Z\xAgu%nƏNۘ>'wM(у59F 9"ta]ZV^~[L/:>{!ͷ35I/ L&{pooom‰H4OTE_f uss+++֭S>+LVk&V ,(9 xdL@WCAhpB!׈-:P#LX"DԣGsfϓKb"KPDT\RVJKJsrr%dzI5;,\'Tm߁"LRCBG2B[ZOg}Do/_^^4@}/s?7F+MaayPrOQд?Wo[C(Aa( `0=ڢgD@W6S>pٳϜ5ˁ-3\mewiۿچX`ZΤɯ1ꕑ 2qd@v'%ue}Fq:th9s6nڢ-m :0{1oFD.\z)-+*w˯tጛRM\9X5㩵VH#8#swՋ0z%#@u@"D5Js'C|<ǛXp'~iO3gu;L_sgϙ?k^pf̜3t?Ϙ?R{"~=|a-vpp8|3gyW99{{N0~qg~k1&9cyZW[\6i3VF}2/!: DvUU5y{{;svҽ{[Gɩe`H9BqzSϷZh:#񲃃Y^^_ZZP( 1{ex껐:9KƆC |vU$E 4"YYD-'I};p@WW`3w|w:;;G Ν;l垞2j#vv>Q\\,JnnL X:"6,bh׸mjJ1DHD`A[gdd8qڕf{QQQZzF0wD2Dz #0|UTTnSSpM4@c(Qg<apw\mGb*hXFgW%%}c1ogD$ YU((--;YoM$n~=#{,^8h(/2%ˊKJ]k9:d^Ҿ햖42A]ΨGF~NԔ,wΨ޽wcaoO4lmƟ}2W4NN}{GgN5🩘g?9ODMh>&h z>ڟ POGf3g:NPN&Q.WGƏ5_# wwwwww[%L& j]Bedd|nŅ\Z薶M'zA33 TQLmGv#DVZ\xz:Fә vhj]ҥ lҒ̎Ϭ~F 4GC-੺2j;Sl3apk ڄچGҖזԹo2K^gaIDwDޞ N#"30&{ږlؤgkmFж昦P2Sm醝V -FK#""̈́N(F`ݮg936;%7D3g mGAZսMADf8 c7U|Bbt__d2t"IeZ%LZx+W}|ۺ.53~»GH[ȦؼA^k3X窫D8]ެ֚xoy}/={ ""TVV߸98?l ܵ;>.~˷xjyyyazTdv: k @0 a@  8qt){ߧh 46''JUZR[TTĿRj}+/._p7o][Qq^\\Z$D""*,,*--pS\Դn8K.gee.:WFμ{&ݹp;A[;4Sk @#r{ti΄q۾~ĩ淿4|KzIDQ}_ewiۿچX7'𑋳Z^붡&vآP(,,,";))'M nnnwRRW\ַo76F;ADwR^9G7CϜ='?M`\,Nhk!m <<ܵ .^?߸'̞5}ڰѣYYD$J[nխkd2T̮V9PҜu̙#32 iu#pEFg6lV&|::nݺ֔vyB / ݵ{6"`д>sV;j@a?>kgLJD/1s?mR,--$In͘9g!EG1lJh4f~=..ǽO:s1TjODpfΚkq¢N+*+nSxBߌYsG Ϣ>,j6#2=Gn>(SUN-_|a贩[W?AD/^ܰaÚ5kj°D4嗎8߽7SZzZr /ߙ͛rrrSˎ.]#{u7V(ׯ3..>..ϷZhpG#Gwuq!"c\]\jHMM#" Fxz,//ǵg';?1)s?5ϝԷo'%%%zz$~{iiZ.++/..F}Bbfsm ;fƒ^3p[0T"Xa/[>gd,uɓ'?>%%e̙,w_b}/3X_  ^DS#9wάy w#mؤMӹs'e H?1{u[ͺ ӧ} PI^] "O'''FT*.YԚey޸yuV%%n_^*]֟͞' jƼҬX#gG+-@@Du߬ؿxӺoֈbK;vXZZڤIΟ?믿֚^V}dd2~Kdv#2^XX%`b>>>&//ˋ22Dml˖,?p]Ͳ򥋼͉O劊KR~:]6mY]dOD"Z,]e ގ+h;/\QD1&cjkʚSypCW ;SΚ) hX5`1''7joXZ˖-<8g;;ZG;T*W\6w,l;|6(Thsyy{%&ohбc֮8Nan]#耉u7zy{FXtEee%qsQaM\ EVJj*dq]-?8ko{qY7[ T6z^ML_Ѩwڝ "jDw\fg- pf>x&֢N_+}}H(ΘaVݻ@؁GϞ=vL|^QO7}4'?yTXxWGaf_v=W=X땕U;wzꪪ=zvhDK8s|嵨yI͟7G&CCԖz\pu_qWF'"P'=K._|ؿƾΨc?ڃϙ-g3lz5},k 40hJ6m\Qh_OEgdd|p"ҥ郃ߓ÷ m۲IL&t***sr==<\\ Mo/r\]ttlVvJՆ9t%%nWW6[rF)(( l!ݺvURoE"{tdMglt~뵏cՎ8 a`cR>t@`jc]BUˍj%ɂZkV[2gԝo۶۾8enDpOO܌L"Emۆ,_))),m~&24>cvFm09c j;YaA | HV,\9̘9GjoPPP8)R^Wmov6̹9#YՒ7[g1=u4r*3s^V-o\XX0v"aU^U0;6T&@#iᛳZQ)1{mi&nq#E `|}|P3a,|[V$L9.[cND@?P@D2ZV09mlێ5AksoԀ#bZkYΰ+"`%Fָy3o3u;)+22 y UfA#1n7:{c9KZ™]K6Pwy0<ʈ@[)hN8Jhj^ǮMsY4q`gKLC2*M읳VF8 BsįMU__\XbKkm}y IDATz7HmM6[}]A~Q9F䬝5YX,J} 8?&eDޞf8cpnV#k[#ƌ{diC%,ْSSG#Q6XP-*9S0t`+OCșt03W,8"ͧ351$%M((`󔦛fkrp^+TWF̩=gۄ!(MF+}d'IӷֵښdrBwDDYx;cY;v̊E 7ZXU "0oNպj3?g mNEq& P8#c "5<1o:cv^ΒT5gsDG~d"rtt {glR 0Rϯw-Z5Wvv# W!/rs u`>sfdT:4|DĉC K&`ر25O8+[ZGs qڣ4xDi Խ~hѢ"bYW^YjҥK,YrQf?zu =g 7ѯPwhk`-GPOVh)`ieee_}UN<'>}zpppffJZfȑ#CBB)TVVtt͛7KKKjիW f13@\rM,w HDТB xEYj,"h]9V710ц7e.2"RSS;dȐӧ;::J$"Dr\>'ݻ߿ZxϲeFUkDGD/bff/蘛k0rџ7JDh/DE5gf~?ڗ*:55aVZD7]Wf"/?1u+ci4d,_hJ% ZخŲܼ oܼٺU7W/W@}Fk.Mn5&o"m-lQЈ"6p׳,`>}UWWJ$e SRݻR֯_cǎH$bY6--cǎIII6mjժƍ, W)G[f$r֎vT+U?)Ly9qv$W3ezX]dOD"Z,]ez n+s}Qy9@j7c0gN.:Š9 FgMܙ@4c~8wRRҶmۈHPDFFhѢcǎC]v~u999,^|g!iӦu޽C~״Yf̘q!Te"@Y܌"[1IBw'@ޝ&>^97ݚ>>@Of"5-GTګ mѨwڝ "@gFӽ+Y-خdFH:UŚ8}|#X8|۷fLJثWtRhooo~UV͜9ݻBɷzWk2z]~3bDu. ı#`Zx9un9ԛR?9h@ז7sj8Ϛ!Z'J 0Zx+W}|ۺ.?~»G(\QQP(tuu_DTXXX]]mp\K._|ɎN~RhpL3֮POi0gn.f4 5:9 &N]do/޲P(rvko?eh{UG?(Tiخ"FֈgoA~ADD7m&BZ;w펏}m,W捃\.h4Do6FݺvURoE"{tkh<@ɸ:ug[gazȫ 1 QI?5Ux~/-$@һSv""G{a_!sGNܾT(;O,h4<=zt_0KvåW.\oh؛7o]]d8..>(H$/,,*--pRQQ\Դnũjeee.]ڀ|۶ DZ,u':{zzۮ7''7##bQ۶jKwMߗ4It)mii`J~ qUQp2+ "C(B -E޻I  }=sȽ-q=ouݘp?U0--P(Њ:g[Nf|NnXp'^8}?ͅԢ*)~4!vr(9%eKurJꖏ?'@ׯ^n/{Μ9zgϜZZjxdd_[YZ<[TZzЋW. DTYYi({.O{ug=S,pu1 #HL/م]=Qk|>:@kF^~3My }}y:HGdJ`ED~(?<\~}0\j~ yCkȨ5VRsNj6cڴ,-(++RfcFrww3`ZTXLDdƦI,q7+@o٘FV1E_{ z/k|=)Jo#4j]DS- |jhuՆ_xw?؟pv|!Ot:]Ͱe*7;v{mmmW\>n6J "OD Z=s5y2ykkU07)lPY4Nᅧ_RBe/^M,}maYӢC<._Vr:6"|v "zg[>;Ɩpp;@:]aQd;C]y"#ﷵ9rW={eGnfO:u̙< fkKƏc*WV7!S?((W_H@D;wn՞jDǎ:th޽#K,9xE<==.]r۞SQQcu 2 !:hYC=v8`?w\&QT111 x<61??LVGEEV+%ɾSN >M1e----550ST޼ySNRJKK{)UUUݺucǎnnn6[FEET.]jg˪TH;;;4B@8`<`8 <<<88Z(CuڕF?FEEmٲeɒ%:xϟHJJ=y$QF+44T"DEE9r$""ʕ+"֥KK.DDD;V'r\[[={3-۳gSN9::_~ԩ8F ̠f |'j͛9sfdd۷G9|åݵknܸo߾7xڃ֬Ν;mڴI&}7o4&''>}:))u˖-nݺuϞ=k׮QQQr<$$Đ-,,.\8qĺu뒓]|Ο?̙.\ϟoMݺu+""Gi_^B|if<+,'Ie?zڙ60HU{yU<==333;t@D ,077'ÇWTT 3mڴ#Gڵk͚5!!!\.W*9s&::\\~Pd޼ybqW^yAPP ,fu#RSS6oID ֭[}%Tc*er{S;>_UQQx,)η^eIYW3m#4HMMe/'77p={F զDTUUUI&M4N>=vؐٳgO<933s,//ϐgB0w@ P(le''\fddp8>d`\#^*]vtkldĊKd=*xD..{wYD$ y*6  Fvvv&6U1-%%%99رc֖f=N++/0rFӖWXZX'i&^j7n8h 6:Р?ѣGSSSMLLt:{I6av"Ç'$$L8ZD`ذa˗/dDϞ=jq8iNΝ22-7,,4a8^λ1ѥ9qʴʤD"# І'<" ee)iy鍩gN&cLS= jq q ' ˾QQQ999 ߁N255l9++ЪL>/JMLƖ-[֬YSRRi|n\gPPPeeo\yPP֭[RftLƫG]2~7gkErT9|9zMgܥox<m^^^FaO^g2nH>IT(BThT(/ )43;::7FקQ`/\)--+--2=%5aRe*4urt0ۙ糿1J2++G$**R) l(6PhjjjZPP?d3ͬmN*}R3\] "q |21ẹgTԴtj>bb@MNNN+( j&,l@[333$&plIFxU DŽ|ap?L^B}zsy06/9%-9%\W'O?`@Щx9LTm|*NBҵѱsr x<3gCu/C`F+O<]T\2p@Թrsb%1199%=^|;\t̵=e[WN˫$pJzzfNn>Oḱ#\Ts>3+Gю51yofm6+3+GR vfv!3+ccF'\]R Յm-"Ъ 9:嗖N ~>&&&1wk;$6%%DЫ![aءj*ڸhX ryىaHLDjaV{kYY9ƣu5a7@p8"911=deesOLm#1F dػn~% "ТmۆNxCZd;I]nQU_[X(8=^U*{mDb%uojJ0^`uST)J"x aJ%{a\+0B|3C k|U5Dq\Br\.b8b?{y7ׄ[ C6!Cp^דސ1f6h:t-64f&^_,QkbdzZ1tm %SBe$gufz**aDz!2%ҫ*>rh "OK`_wgkksU*Wܸ;~~ot옘BD.R'a|~II7E"aRr*p:2, DPRRڱLV+t{ZVVNffVrJ 7sZ~7^Ke(^#"FSZZ~gsռo&S h~9ϩFT)MMM:QjZBrwTm;"OV.Zc0=E$Un[ IDATqj 5u#!QI"ճDybZ &d<2|==<8׍[66lGk7t:M^# t9ZLL]Ia[ʼ<;;[{SQJr*u}w6[$33+33[RWuQr7۽ uC蘔RPXt܅ޝLLL4 pN]0L#7ֶ@{`an^ XKXOҊ2Je*ttweR***%k;ц^~I 1N?xYY@DYڒ^\T[ *G^雛܃?߶w =hm4hKrr\ \ts5b?)[>RĤ@?,"7`N}VG7o f]fjz'=o@K^1[Ggg WQ^\RRLD#FMNJLNNTRZ  fw7eٹbFLMuP^znj=:9)|܄)/KKMļ{.(ȗ+) %"aÆ[B"Wߠb3RU%gSG\ܝY(jڦe9ƶ޹d+*++D"\.{gml{?r3yywt!@D*RRV9j"3vRIILVikkqW+[P,U*۫abbntȱe</7'; V{v?"m7C!Jyɩ)I?|0DVwOVvyĈadwnÈÆ#7^ i<>'HHūjoo/؁bHVcc㼼<ٜDT^^,- u[ZZ ӃXZ\T*JQVV@D:.?ގi4"O/(e_ ֳ/|}lmqL4fxVKܹǴ{k?JD))N\rG 6:4'/xa;7郏>n䩿Omx4hȈjk^ 6_8xXRR2E\1a 4u{ZؿӃKJJ eeeQD lQlbZzzttZ6_ݹSUUUs핕T*"8aW=TUU 2^N}~AqkhKnۯ??}{pwsuonA4+!YYYQkV#"gg'RuΝݻѴiOW X,5jC]o4ݻ^fiiO;ga&Mh&G\hvqDGq'{Ύt:[˯/.^fNJNw?޻q=Ujzg9;~^>셅_~b_DG'1^aZO R#"FD\իǃGhGvҋ/4HNN.=t:v;ჟk_6,J>Wۿ_+aֽz ӻWTTDFfff..R cp)r\޹`(8fHSSS"ѽۮv?=u2x< "͋yE D`oRM[@D"hAOt'O^j-?_YY+/={|S#93 "a;;;t>xgKufffOs3&x2Sm~A?ʪ~ilݚ-><;8'oU_0p sPX\RbxnԀ&xG B^ r0̔ɓۿ[3C=٣J~~v=v̨y9W2G6Aӯ]զHWbKG 4=qҢO+++a@;g /,<>Կkgf![7+=!O?ܬ7<}SGv_kxD"!;Ar_P߇\.WQfV֑6C@۾ܡP(H_i882f?zҸTBQu=w@_B~ (g#d?Z׺ܫW'<r<'7҂M?z\D׳ƺ%w}gX:dpz L_xF1|&հ76򿉓899~vzrѻѱO&t51)ɣcG" Kȁ^=q0@{_!xz%%=>/koO-YtqJB{~/iv Rs+F/(X[x,]k6PZϷmh}|vAj g:z6#!"!"!"!"!"@D4x;ў^~\c+)!NhwBϝF' "&8_醗ub„Ǎ%_YjX/(0E"Qi|qqgҢZG!sٗQQ7/]2-x}묪Rlzם~:Q&8xǎgfeݻwupp0\d2vyK8ժ겲u:mjU2OhsB/}nكo zпuk /J4juyYynnϓH$y\\Z2$^TT,jullD"IMMͳ021%H<<:r8z4u\\T*uvv2//JZ-T*\\Rs]mSՉI0^< mxc6޶ZG͘lܟ@D S^k6au}Z+tzT~~@ lYZĄ~ky9Tx77W6RQ^q@D-zq33gLfsi蟝6~rJp9kk-8x@"?? /پ?z۷+*+_(4i+o.ϛ3<+W,p9BDz~uƏ}}kDtk<{522c,-x5"^YYY/utt "N|}G],8fz /y%^|6Fdv-|s njաq۴Zݸ 'z "k>+Efqic6<=Q괴{ ZsC~_ ؿOر`+a#:jqm\VZ6$"uZI/>αBۿ^b>=J5vc<a07wsueBacdeeEFF /66.66ITݹs}wڴ/VfiDdffV*Wvj[ӂb"/H&%%,?ܜZ8-x*;`>}|:PmiiII/,Ϧ/zܼ7ri%h GV7iӂrG9kƬQIoI8OJzٙD{螒@c`@R`Ҥ"ڵK/Фzrrr9Ύ5Mӱv삣w;]rqcU˯>R,2|DP( E"Y;;ZhhVK/,(rwt"/(prrx#7Vk/yz6p8dȠ^+o 3fTٳ=vbqq?gH6%ƧzNzwa>TpOzg9D-؅j_a^.;;;t>xYف_VfȐAsBoDiA.rfSCQ糓gdfC]ejRRBaO@3u1\9p`=闯\M 3fz>:St~= ٚziTXΝNpR~A}`/ z^ӧ7{m;YY*;}{r:.+++--R6v۾kNݯ~;4k OIMK>lhͯ]W٠mާwc57fuqz][k/5o7@΁3OiU̧[FQY3׾L&M]uSOz4o~゚u˾[7_v~ RCM䑗ŗBy~~?(>?i3RgF3q7"i0iыK8yfajF6cotqa~ѲW\\>Zlr͎2~%x41^_СCji~Lh O/?y/^V^dkK-]b~Bϝyc탐9y66<|5tZd.ce\k^+Fnoognn^k~aႱcGgdd:8?V~ACm#74Ik}n^ۚziym/^f|5DDoŗ;EV<1FDp\+H 35G|~c1=a]ftZcz Z)+hv8'=FOh@O?ۂh0F֛8a;Nh0F=BD=]Mz4:\x?>'ȸ hK0F :رcӧO?pСC aj)>#Ȟ={^xqРADRbbbx VVV]t1NY! >|Ŋ;v`SRSS|||8꒒L@`ggWk6ǯ~+((4Nqtt ~z M}zFqIukGn\TT\233l" RABؤQ>yj??_6ƍWˆe |Ҕ`"j6Cm-Mﻺv|68p!Ќp]rܬ," h4 СC]vt3f̸r势AAɓ'oƍK.ݺuP(\`=<I }qƮa`sTM"/INMD*eg8D~P`qDk.N׽{wV;o޼3gn޼^~燇߾}ĉ"SU*U\\\Ϟ=}]"tӧO߲e|[l ٳg5pןuZ)J"p9vvD볲2:tOOOg lwjNsvrrvvb6ۻV-Q\WV[X|"11iٯ.\JIM~m6Pj H$Vx@Kll\jjZ]ǛVKKO+**h4.Ri. ژ@cʪ*U;wLGGp8ΝvǢ IDAT;s~3a@D1ϊ L駟ƞ?Ͱj*OOLDV?iӦyyyYXX4~ SUUI3gDGGk4ׯZ.549h'M<ѐ8?x*ظ5oeWl%sucee[>pʔI-!ÞBDqq~wx[i ?wmui<-xꩿOWѼnxM"jw}{ƏOGψ(/^+>ns"ffe^ԩr͛cynsrrÏy<==zeȳgOZ677o>>:j;g{rN6y>b;C]S8::-~Cqq铧NjG5Օw٧R(wMyIǵ^DW(,,RT&_u7 "݆D4""h;okk;r?8{lYYGr͞:u̙3yAG cZsΉb6bܹsdǎ{,Y䥗^իWYYҥK[tsrr***p |8 殮֩T*o޼٩S'TJDqqq={٪nݺձcG77ZjT*U.]̌˪TH;;;3 ! [[[k4BqС]ѨQ[[ۨ-[,YZArCϟHJJ=yD"aիWhhD" 9rHDDDYY+WD"K..]rqqxwVZU'Nr{3f [gϞNrtt\~ԩSq "W㏛j͛9s͛_?~xx80Dtڵ7n ,x Ddmm=wiӦ=zcƌֻ֭BD:n[lطnݺ%}ٳgvR*]t Y`-,,֡#F0Zϟ?̙6m"#G̟??99 (ݺuAŶO;m2  4;@Dϟg_Z333CD`sss">|xEEENN;`Ϟ=ӦM;rȮ]֬YrR3g5 E͛'h7n|WH -Xښ֭[ǏPHMM ۼysdd$*[nۗyZq;ז.ǮxB%%Ġxv暘ng/srr؈Ԕj0iҤI&ӧǎ2{ɓ'gffN|8!!aĉ"Æ [|L&#"^YV 0F bf޽3gtttj!!!,r?akkkVj{q#Gʕ+jY\ԆM2e</;;{5[xT*swwz*>@Dt òoTTTNN0w೓LMMz}JBCC233|T*51{زe˚5kJJJ<==ҍ 4+ ںukrrT*` =ZYY`x4ɩyBWt;;;Ä#|}}cffТ0<"n0Fm۶Zh0F' -^h!#!"!"!"~1 ѯACZ¦9ërS=HY@DZ7~ACt܄)nD$y| _&l*,4?ݩP(Zp ZRV;z2<660 `#Cxd0@{5Jlj;qJrs:tp?j2y{w\รMc7Q [bԈ%أ$k]+ ME~zٙٹa/{ي0U Dݺ}ۧV!7twO-@@qus[%Ŀ8‚Ԕ䀀`.B(5j싿 {g" (.*Zp/_ԋg]>I4/|\QW:ܺoAEE{mg5; x_ 073/T?|OceB"=Z%RYj4=qYo޸Y..*:QfRY@D޹"Jz}nnN+ZC,YZ6l "2 ,/2r嶶v*¹3 /J9 \y͉r} ]T#F1""""""""""""""""""""""""""""""""""""""Ց+s<}yED`0>=EBZOz: k\6ht|,"6'x6iѾ<@TQTVaZ|`og1773#>*TmjZ:'xp("8rUP׮7C |>̭z7nj>>={tIo:zS)r7c'{5mU G =Ϟ=&v27;pu5k;}.O<} ߰=|!E??ÿO/g=5,HkX/ /^ħ[ZrtZm~^~ZZ:c.HL+XC^~{!A_8~cGPPdŖ 6/?DYY|>_V>vrL,^aP%pR#3f_v)!!j֍Vb1M'LugVvdۖ7oOHoZx/? B(:ubv_ۭGK6 (ַnDp^7o޶a#%Tی@`j4q!q'oڴuꔉq;ZEςRXXH2y…b@JTSV[^]D5BჇ|u޾s?bo|հ:;;UxLl\6@C T+я?),,u>$X:n;ڷk* JEJ#( U*Uޫgwؒ۴fMs/|1e VPF@߫^i˓Z[Uxv^~\6GO{Fu`lUa=6--Mhk++"mܰn˶k׭JӦLر}d2BHrJ1Qed(tTj\IJj![>Q ^KёP1eVAY!Źzefη@FJ 8s΂6LJi)2Zl!X,6kዩy~68Bqi"JeƩmڢ֙[;^Ury9Tmc"IgϞ}3y?;;;>!jw3yjxEQt=nnNGkڤ1cBS3X ++˘t))/S[jYeG@}1"FoPU.@iu*Y @ s'vyaB5%=s\M:M5'bj5!dNOc9|I2ƿiCk+bً{  js>9u"%1+B11JrS;bu4Fòf˾4u[ o!(o"+FUL[JWN} h4ymE^[YD@_$ZXٙF ܈ZyyM)^ v儐VSܼn:(Bm\cK>mʤ)5lеkܹ%3I穿Oj6n6*]?ӑ/C[d GjڼA%+22W>'xuqZ^2ɑefZ6OLNl-oEQ,2O*"ڌ˳ZR@lƱ`f"OUrNgz@ղX,6ݮu}NfQZ99" IDAT6BFiPV`Y"u% s"`Z%e!>x4Q,UAZ shrbBHQNc}<ݧ$c kEy{!R*)FQ_{ۮOgM#uyj;߸|3E3M8PnD`=;wG:G~rNҹӭw!#Fx"(##c|>!da3gݽ7Ӛ۷o,]`".[TոcLJ :20@r'~֦u~_edd|7wm%OZf UzՌ]+|ŢJTP6ݴZZq8ۄ4kXyЉ(3e_G;ɹ*^۴s>t[!Djc}GGbew.]۵p[EEȳq*I5 !z˳{dJzX.^/BJGhjPhRӳc2MjPrZڸB$X+ Vn8}rM/Yvsq>~Vr}.իש TR۶oPy6ȿ鋄BeQVAcg,jt(,XIQbd䅞>XBשYstbZH22j^]ٹyjykܴAoڑҾu`[5[Ė~S\^=fEX;0~ mqaBC%qyBӫX x-7#alFv>!/ $ E+5jf(Dk'9'C\. )q ~ U!;~ոBv;*a۵ &-EsG-|Ŗ"BHӆtz}Z7UŅD]L~=}fuO!~HvrwyϝqzL~q|B1ͅfx2H$DR$WTlke*p8Q % zVS@Y 6V՛~U.+o<(l^_po!M:s}-6v''MnO f5mXw'N70uνVo 6ΞL' XߔE<7s=}1w3'oڨ^2f\EqyqyYlsn0'c1~ !;[ s2LtBq8fVBafZ$+2HjT3Яq~AaWF|Ө~>];lQxsh 6wIIs6\Hb)M3]'2Afoa!?!/^?9X,U2:|/?|HOLųXoFoS{{{+ObQ4MkuJG,ߠ2#>a¬^Y!Y~^=r2r@;i!!Gje1X&HbΕefV1~MgHSwXfܬ\[뷸|Q"" hƳkv)[q.8uqS|K ߲m6q;ۨWz0/|JYEZ[? f/rnn.yg/]ՅFOV7kTK}u1/OJ!X @q^w ^LBeƆ/ /frŢ;0Ԡ}(3E=&bSو?v S}MTޕXiZ|D( 뮀 [f¬ܼ|Bȳ[_^+r -vףs !ZTEE]_FBe[$ToԼYf.XVR۹fN(0 4iX嵇oięӨl,bm2zY.L-ҳ nݭgbKg䴗c s2ԷSB byaM]ڵps z5ޅoi,oܾ_TzpUߌmZ2=Sm vPffY9:9wnNkڡ*B_CIz|wc Wh(S>,XDykͩ<>i셄 g:]4'lߌ֫"OEQqa*G}MahVzؘY*O,s\6|ֲs&}1%Sǎ:Y|NNOlc &"p32 @y1K7:mU߅?vJR[Xp+Tw ,6jwK^=/w+mc:V* j:7mXIINM_mg@6'7;/27g_6}܈>'*yjM-m~󰋓cz4 q~F匆U`εrPSW4(.Vl32nvꅳj:lwvSW&"@yauU9iƮ<fl6ymX}:AH5D2 }tͶs&rXVbQvN@dN\"^Wde߾H݀bpJ/$2De13cଢ଼<^d%5i6M=qhޱ/!ɻ܎3vVX)ss5vX8B2 l:{,yǷWZ9Y\_fu*L,Be^.:Li'[++M+IjAcg,8\.'+'J&qtqt5v] 2ߜԥͿZKEQq351\Jj4kjfS 6Y'|WRHL)lwuT©r持H9wlAQ< \}6veW]ZuV,H~>iX&l?Y:C4!f=j 63#˜u}r/m\.&")D_,x5uZZa -]:Mڹ ;NVG#9@Qj6j;qb;BK+wN3f@DFDpy iM `0Ɖ(B+Tr"=<E3ss^rzFūw?LVˉ۞pq_Z>}E/2pyD``y9zNt:M6hBE(3m6g6=Kt$^ -]![Vb@ 23瘙@`0\EXb w spF'͈^OKF=S#G'$$ rH$bRӣa8t3bVjr&E(¦ebPxy?)9Yr94iژCpJ2y:wꀈ@Re#L ;@BD"l6{qE/ z/##C,sܬl>Vbc;9rGcj^|>Fn۾A_H6%6)b%!z"Ζ(k4XWW;;;Bg k׮4z}HȷY,5>8AO*H!"PeQQgW^ G@Ll\/]r y󶽽'1|(!#GY,kkg_,[($$Cf|oڟ;Ħn=,]y` i}FhuԾvX(&v呑Q?((, {,ORT*/>>͈@XrJ4sUsמmH=tO_~5}NN;w0q8BHdd"O}WSNwa*Y$66ؑ<o&O2iEk4;~W'`mxt|&z~7}bGcګgwؒ۴fMs/$''߹sy`G18::՚խںO+TH]y<!ϷF8] 6x9o{ӷ߷].gH7ɤR㲭LPdXu_a4x :w9bh%--rsp8Z>ߟ;_ަ %\NNmժ#MӋ#0}Dk?4MxfmܴG={t3MtBߧ#_LJn);7>bIqq1!`0DG_鏢& t/)^^>Mj6n+"вe .Ӯmkkkڴ:L2slmm !˗/QTBڶ7`%b`ǏpR`Pmjyj`jP95l0k$;;[P$dlXWTT.a`mfΘf\}|dbbL&ɤ9rʆ ܻ{øh|sFL]|eMKop8|{Ol+#Ҏ=nmm#>Xop+W,+ Pm?pŋjP(j8}1b6oZr䩌 ӧv*ݴjuťF ;qukW7й@9)S{L^OhZoo/.z~~mbc X\\\Q{ 33s333BHVV6jxyyH$dD^nMƺ09zyA~~ڵ/.15k7g fɓ_~54by}än@n^NOKKp%I>܈U_ufe?,i׶ ,/-]uv굑`d׭{Koy,s1߻W 2vZ.^ɤacFEFF]v)!!j֍LXauԾvX(&v呑Q?((, {,kLşc "fΘfaa>cvl޼->!a:rkefhD9Wٸc BsAA&`0ܩ !Qg̊<աC#\<0sמmHf jz~jܹ{A抺~zvǍi֩S&2bc9֬]?i)&,^FЩ'z^^c`A6ij={^vIǗn.\f.3@#OwXj-:]`Q,VoLINNsnɏBjM\\\{kŪÇd"!WvvD?~P=xИ{<d#p8 <TJ* xxF@%>6dBZ<5boߖb֭~߆ 4Mпo]D7+o_2Ը?33˸IlK95pjMōXJJ*!NVqLë֍pS"o`wb4e:>sttizqf?SN~;p~}{WqSbbٳoߌ7Tl}5j84EQv>}i }eoӻ@&MF]6;XtBg0^۔fB7c7JrJ=fiNNNOص{\.|kr cJi?u؉MvqqifXd*#;w|)EQ<ѱyΟpݺu͛Jr,C-ۧ!d⤩+W,[|ɜ9sefev"lق5LÆѫ\tt*5Ƙ69x`oM0r࿉l߾=---((H=ztРA߰a'#ӧOߵk}LL "m_J! 늊Rҥ66b1Z*,T״ws瘮9tuiFwqv1oa0.Z8߸l+ט>H 5q >ŋ2f͚,RXXRR)!(;;ɉBtJJ#x5k=z[n8>>^4+pmZ$D"yy xv]U]w}ybBH۶mԩ3eʔ/2UV ,ԩSfͲ !ΝkSy󜝝=zDtRÆ +7?! qX\ ]~̂1115"DGG߻wy{ٲe!!!O>W^dddZ"##[jE?nJt@ {=CZAW:|>!#@:tq\.\jUDDNu!D$EFF<}4<<ӄP ʃWTHHH 8::2M]v6mZNNX, LzhhhdddTTTPPP۶mϟ?wUDM|||ܘUgϞ;v,77W$B ӧOشiF&^^^#j srr_>tݻw^肙M'OW(;v0BCCsZ'dfffff (P#֭D}iƍ}Yl...SL]vopAݺu@aaa֭?ٱcL&8p^d2,++  |b^ɓ'+ze˖xxxlMqcǎÇ>GT@U1ѳ2BD:2CϞF'|V(I' " :r:L7L IDAT#@DZ\@§!#P!"P;wJ>HQQѭ[n޼T*g͚C>I#}cǎU>}zn6nOUgh4>(vLbFFP(jwusssqqx{dk֬9zhnp|@U֮[_:bz1;wЩcBHB!|~M;w>}"|||ڷobNP#7nٳNSTW!m۶~~~gΜJw]lYXXG#BT[O?߈,\p4mLa 1#G}ŀ=_پ}{ZZZPPR\hQ͚5Ϝ9cfWA ׯߒ%K!Gz!HS%{ l>icbbr/--E^uu=y<>!$7/O姥s8ĸj=yvQo%7B6vR׫׭.o_㻻쌌 fuȐ!ΝswwT*믿$ !m۶7>D"{ݻ>|ͼ@pgпo'_}dz 6p%ӧzz;u>m2!۹>3 (HZT*W^maa¤/Xɉ{^lYDD޽{w ,0`… l٢V֭{!C0٢oݺemm}6mDQEgd(D_eR-^=sh|pJsrrt))!A֮4 !ww&M̟?i vttzDVB233 !666@5~f,L*5.=6--Mhk++2n2F \!DRlܰn˶k׭JӦLر}%wdюvv }ݏ{رcB`^RX%˝;w_H$[6m@?#'b=@EN>aXjj׭S`0gkg8;;խ[g VmڄObxʔ) .رc/_e˖zʔ)~~~nnnZW\jmݺuk޼yJJڵk?'=࿉'V}fYzqfΘ6j䰼|g6Uf6. jpuu~RJjVutp0>ZoNcƍu{L7yx=r C%I+[d:" 3.[,<<<''Ãf7}¦MLk_|gr%o@D*,XD"1NJ,˩' ^_d7k˭Uj@D*@?|BBBOg^+((oڤqppsBHB!J?5SJݻ߯~Zmʬj;wԱûoߞ;wÇ !<8zh\\M޽}}}<'NyH۶mJS&f>VZN͝Sŋ ">u2rTؗ_ ٣[j+TbRw>1E;o J=iӆ ,7k֬su}E``mH9tЅ lKL?`)Sܾ}*|L a*..޹s !yy:6?/?--1gINNINNH$5/Zѣt)F~^Kl\7rΝ:W)"S,p8L(AP2阘VU ߾}gϞgό˖-c !ZZfMŵ2OUo۶ϝ;עE EBZW>=fAx iUʘ\o޼->!a:rk3f_v)!!j֍Vb1!dk׺pL&UT)))պ4m}f gR;ЮmHT^ͦtB֍hKKѳG cXϞXtQHHPz`Ϟ=LbP\h/^tppQEeT~:v{nD࣌+a |>?NF'|zΟ=%[vyظ͛6i\Ǜ2e /4q!q'oڴuꔉ̦;w?v֣Oy}gLfsssDݼi}5Gٝ;u8a!$22jYQxg +럐#MӋ#ٽv/WiJUUP U.;~h=-[(.]t"Y^zoS ̝7s :uj_v䩪VA=v")9 !'1ǏܹC!nj7.^ ]Uӆ(..޹s !yy:6?/?--1gQNNNINNH$5FZѣt)S̞a\5-!H*؅Fuuuaޝڵkq8cz=j^Gѷ~ۯ_+WBFmaa #" 0|>Az̉W*Qa_~1gn粒%vWbմ̂iUʘ\o޼->!a:rk3f_v)!!j֍Vb1!dk׺pL&UT)))*޻iٰ1"#E:]a%?]rydd EB=;y< BȳG cXϞXtQHHPBGEEٳY֭۠A^ڢE ʛ~Dgggx%cez}LLl0y`i=/^ħ[Ž'.>{QrGGJeLl1#Cak+c~ xbn>718y&CBkxBLp%p!4M?yӦSLd6ݹs{}*Eq򕙳e}1DꕷظcGx5kO<}ʤ }h:tz^= ;w0q8BHdd"O1HOOW̪P(2 m0@FJ1*o}z2M,//L^"6L 4M0^Y66m[6r%vgkk[b轢fxWeQoӝ\zQ, j},lڞ>cv\[vvD?~P=xmz`._R$ruqay<^{L~?&V8!4l焐;wOQ !A5hPh!x<&Ο=N* iv"饕W&7 =~rk<SAwCɿ1{@!|_>l`>fTCTفV_C:v]:3jش6>?33˸I&VrGzpӲBli,p8.k;BHjjZc 3s"T!$''ǘ$!d $$o-"P:J [:n;ڷk* 3z.!JRP$''3(j.3<0@.wLJJ"(pbbٳoߌfN REMKUlŻx%GGGG,x홌\\\nݺHyJjРF$I|FlX"6510`  zxÖm;6oF$@ SYYqӖSɰ5RԐ122$wd:rskhhpqcsssmm-ssQA-ЛM{"/g}# ɚ%ǑNɰJCzqD ( tX&&;TOr|lmO~|,vMآF\_M g+l#ڬiownXNvrǶ|b@SSSiY붆R||@ D%@ w&Tyy3 UUՊ߬' vVO Q߯[X=] gf)++?^aƏE|2?1? 0?ztx`ςf&P_sG O[WWs5HDwE<s {XCXX?}\B"?g;9:L:nL&ЁVVV!~|4// 5.mm-hy͞+iii[ֽ[(++I pIK<MJo=RSS7}FBio622rrr/ydҤֳxr/IS&Oz'qFb(Mnn?~`ooOtҽ{]<==>;wܹs}&">~. w&o훂RDbOӻ۵y)`Hɧ"Y,54lN0P$RiCCcee!}bgguc1K/"w+ _ʼ$__lݰ_,<ӑ{\ٟL /a-FKHJR_yk?)xªꀀ?xo^wAhvxΜ/++g֖n+a%% ɯ| % IDAT/9ɄzB:R$ ?>ekk[TT4jԨcǎ!Ν;Lkhhh_w֬Yp݂>xC&R3<^RR"33/_?ߥ!_0x.^|e岥!_\YBPMM !9||X9 ^b qn]]ݛ7|s _Ȩ=uuu7n2Rдi>ݹQPۑ)7i4QN"~D7RRkkk555=y5mVVW(++KCT@544s8tz3O<~|9}teaa.IBǏ߷o_U}===,Xpƍcu >@ofbb~NVVw۷B, Jt%CCB555#jjj藗#vtI,t BHEE!Lm#yA?tuGvNMTE 351E"G8BH*kB2l0`!okjj]F$޾sˌM&GG;sGgׯ]M9}DOUUk߾52|⥦FtOsNΈmG9#g>pQJ,|^sKԩSwbGCZZi!/B*:&庵 ! a***zY3g fӂ%_8rUxO}Ԛh4Z]]׉VXf!0 [|_8zהI+\JJJ_.9J*߼yãzHt@rMBB;w^xammEF#8-{eWB6x@Wa2bKo0&x1LPڪH"++;j3_ ׻2p%%455=xwYhs^SFoHYE,,ڣD"QeePy0oQ7.p򤉛6oKNv.Ἦ.!'O BLa7Ǐ6g,RiPP 5_Tj}}3>+|o hAߋ ` І?~ܧ'\w 2;[{JJJ'}z!ӵv"YjAiĐ%v~XOO?e),^8nܰCB|~=9NWDVWU)++X+d0S&zLN>͗2,ZMCC]EYGXZZFRgr;i4L e2ٳ|~RR47n8jԨzvO:}e2dq}5"x:ḰѨ~SQQ!,H33$LOSXf0u  % 5>>ކa^MM <ܦN.57ESSݻ'֭[');;ѣ".'"p/ykX,kmm п9_VVng7\}e2DaTVVM믿|ݻw]]].\haa曕+W•>B5"DWTTDFڸi˩_&(J!KEe%&1L\CC㕅[ŭ kkk8J4 Q&Frް~M5R$?蓛9}:]uI$|KKs--AII)J/& zzzg.ad@˷qwy_oaHHŋ`4%0{yD6~,B(? 9sbG~:H/ܹOd_)ɒO+ۼ9sn߾=vXHu G$RiCCcee!Vgguc1K/"w+ _ʼ$__lݰ_,<ӑ{\6iD@w74!ݺuo6/׭ g09ϝVQQkϚ9!7,;柷֮X,PVV D!lBðeW>U pA g ƾW ]w;IS|.\?뽦LZ2PRRruIWH孭FFFd@CC @\xeK KCzBB(''W~G#G¼WXf`~F[WW?<,|Z-8ȍ7oB~ګpSVQ& TTTBD"QeePy0oQ7.vX1K,iD8!'O BL蟦!;؏@ݰϟ#JJJWG跶?~b:s/-_!-^ZVV\UUMnRW+m"N'PTT$*Q 05B\SSSCOD1*2ʔ4DCZ}.|2tEz ӨLHmyc{VOOK=xzJtbBMMMݯðo!|444\Gkii6lWS444%/\z[^WQQ_kdc3x׭H${oG0 +) hY\׸8Nwp n6wGyҢƆPUUBH[[B̙3g߾}AAA۷owvvoQ/M7~O'Nd;uZהIo0oɓ'nݺu={\zb~~~qqqU.BMjmNo_O;_$BٱmK7aPyi'y[k9k88q d,bUWW#֯_oeepX,ֽ{? CHL8&=--\BHɂ?S_8Mrkd)ɗqDLLLYYKccMFHO%988m6x{{/]؆pЏE9ʯt:㿦 x‚ >N\%Imm-ϧ,TWWay0@KKZ&eggb[[3]6lSbYYYQhLDmbb{vu֢`nnhiieees3vxGC h%%%!OOϐд4oo_~(tR{{033y͘1#00(Fӽ{o:s挳3y=ruuukk렠 ]._P^ppl2eGGǚ1WX1bĈA߿XGO'=z0r{)}Ν 6̚5kȐ!MMMퟜ߶mƍ3227teLLĉl6</000///55<56$mٲڵkϞ=r䦻wfffƮ]ð{g cǎ?Q$޽ښX?o޼FΙ3.Y!Dӝ ֪ӦMqrrd?B(==="""++ !r[ZZrrrV8NRRRnnnCCT*>)88XUU!XZZ*6W@Diʔ)aaaL&'bٝI,tA@[ZZ^y<={[ZZNz%Jݾ};Y ð>׆$>㣥d2Md؅=Y  O @8?xLŲk-MRqpڹsΞ=;sL;mllaؑ#GJJڐPXXx…:b,@eegϺϝ> @8?;? >|a9Ǿ|a{njj*%vss[rett ׯ_wuuh}򗔂aŶO>=t萉ItA'<`f x"pqqi㥦ZXX9\fVZwsPO4i̙ܥ?>dPo:KkGiG"$ ɗpQFu !daa~詾~bbP(zzz} O322rյSIIl>t@D1L++q.,b}w76 ""lJh7qƍcB;r˗@#>60 1y^ϚM4q`9@^%z8/v"7nܞ={BYYYÇOKK3fLEEYYY666 ,PQQ!Z[[m(/88x[l2ecMM ٘+V1bDxxAOOF=aذaÈ999kS2''';;Ν;6l5k֐!C ޶mƍ3227teLLĉl6</000///55<5fmڐe˖k׮={FFF޽vZ ^㩁cǎ?Q$޽ښX?o<̙C wuuo,YNNNkUUiӦ899d~!TTTr---999;kCIJJmhhJ'7"KKKbq:}[O{2eJXXrz6.Ng0t:ٳ'99eԩ/_R۷Ŝ0 Y||||,//'7abf@зN_:w\rrr}}ĉB'O^px] ?sDbٽwQξ;wٳ3g$9r$ .\#TVVBBBΜ9矛?yd@  ћ0w ?sD=000x!aٳg۷ݻdmʕ***8_~ՕFCAðb[[ۧO:tĤ@:>G$.F"B7!,,,0OLL |>_OO O322rյSIIl>tٳ'N駟:JPUU=}tppŋq3gN```DDBh</# IDAT#յٳgIIIC IJJNJJ?~|]7w!?TTTl2k֬m۶=z6...88Xm~wH˖-KOOwrrB%ؼy3B(!!*++C8LU8b>[?pիWO>=.. ! nܸAfnn󍌌={o߾~mҥIIIAAAǖqu[hϝB<} f'NJdvڤIf͚: QVV@{KKKݓttt\\\<==-[V__Gv)o3Bxs礧)ׯAY "9ccϟwVP*"$`X\.w׮]l6Ҳê>tw M@TWWرxXTTYy33#Fl޼qLߎ38;;D'Ni wE0 Dd HDt㓓e2YQ>Dh4ڥK uuugϞu &t=qĭ[lӧOM...***DD@(}{o?D ! f>p,7uvvvii)BiN.O<{/Gg7-Uըtm- n:`0:{ڿ3A0 h U.70##|EyMフMz&q8p#\l ӗ"d4cІRa0@GND$Œݻit:qaH*65]׌5G~ 'kO,tWQpC;^@; ІFUAP߿ѣap C2.)x]۷@suRhBRr*J7^1J(vFGbEN+lx[27o= ѣ2 TDZ**j> ظYm̺:cX̔H{B*e L&vۆM=]K#=NSSKKw},4e(3EW) B8c8bH!)Fa͎2K$ɠAOSSS%6%2z2;?oOՅK1˽fe5(*"SSZiF55'T颊(7/{G|="(hv7! X[[4;굤w}"7dX#U=YKA8BNaH,C\hc#cccfՠ+W>3b뙳ׯiiΞ;dB8]x1ΝKNN744tqq8q"Bh .}wgϞ!LMgg̘w)--UUUe2=;^k38):TViVCt "#Z *d0n٢ь㲊 L6htzYVVv|6f2bDPRReffJ;P]],J 8?Y0 {eEEe2,?@" hܫy'8ZB[ܝ(-vΝMEE!4wg!KW,_z!|k_޼?_n?dD $$̙3'O/_^PP߮2M6=:11}Vx{{/]χ m>FQ)R F0elnU8;prʏ׭SHa8.,/gonn>sܖpBHMMzw2F/^ԈIC]! ^0t[555 ֮ ,h&ByQ/C =+ܲi[ ШTMME;w6|fG\?6c?)3Q߿? T@(}@e0 o0blHW_un=2>>덛"퇌D^rݝXa|l.Kŏ=P(0`BH( jjj 9#7nϞ=Ç3d⬬, WD>??nt:(FRSS#Hjkk|>NgX䦺: ôȃZZZJJJ!L-mmm##<m[FqaN Wǰjs׮5߾FRq H Pqqq$!'O%ɐ!6ֿrr>?a˖<|8s&;r׬5sB ]mkkm˷T*U&5558zהI+\JJJ_.9 [/!;%3a*3 ыzE* 4 ( e%A3D2t|fL&3QH~#o..r}w5X,0)))#F4h</((:''2rHMB7o޴!Ch4ZII B3$$&444--_~!yzz.]>,,,>>~޼y3f tpp O%**ӧ{ tggg=zrBAAAĻ\|?  { `ɈDjb1` PVHHD80 d T:^OO[1c!LqrH$| ˈ~FSUU-))=9//?//@Ur^T7sx PTٌ#DR)T*BQ00$p)d8pG 4jDP7jUU---u9)TDꇏhjjΞ=ԩ;w|ֻwfffƮ]0L6gΜN08ZRRBL 4dȐ$by]w=aذaÈ999kS2''';;Ν;6l5k֐!C ޶mƍ3227teLLĉl6</000///55<O>\zDa.d 8.SRҝ:JPҟ:uL$ %Ҧ&ˍ&&㗔tXKoPUUUQVnhg}jii-//h,| eT*C;#w솶AHdDeX7e-fAmSe}KucKH,Jq G)U7[bB%|RRO Ǝe7Z}Zߝ#pqG^zqqq4 !LDwKKKBa^^91,,ܜ988$%%iii={l߾}ҥK:|cǎ?Q$޽ښX?o<̙C\]]%K t1A7N6-&&I&􈈈,miiqtt|p"LFR7hBrL;Ճ7mٴNp0M&<|!!$$cccnBy#%{/^vq,2Dȯ0[Nr/ҊMH1\T!J444"")IdT$0e*G %01&D #|eh8P>8@M:uԩk׮M4)..n֬Y!gN<`\VV;E<_ZZjddlٲ۷o=z72eJXXrz6qjjj t:`strJ7x<={$''K*}vSwbudWNP៎0'24|0o ]$ 8Z*;;+`hh(JBDIbAwwjkk{xxX,.k.6miiaU, ;]R4Ν;wٙ3g! ccc Î9S@ωz60566zyy:h---mlkdڻK~.{୓dg(MT"A...SK5/_~@?tuu)B8B4:ۏ{wE쌊ڭ]WW?eϟǛHRo)3> [inuMvXQQ6lttveUUWq8zIf[b8 v_&Rr0tg">S"Fܲm].ϛlo4?+aO |@uuC͛GWILL,**rpp謼و#6o}cƌ!"ĉn"vM```C g:P(g޷oݻwSSSnnn+WVQQq뮮ݏQ(y.$|ލdO&;r ٷ~Xd999#dlI©^nnMMEEʙWV|!#W;&Siii@all:rd+Z6T5}{yy@_Z&l \##BbrN?}K,cG744VUW,֡hjj*-+VWkӿ VZ󷇉Do{w5eRIIX"124$j ̂4ҥKڳg޺ukE) gzzzO>%'STTtqqQQQ%"B6Axxŋ K=y<^jj%!fVZ՝D n~'+Vhw+SiɅAD1116lLCCׯ'Xpȑ#kkk*]ZH{µkƲ ūWp1kXtTCZ}N~~1]qVgfjJZZZ&&5_MMԴM~Aeees3S2Ы( fC;r:BH*J$T*d2YwFʇԭ1)))|>_QQ((#1AIIȭKKK)Jgwry]\%eS&'''PH<|p5H~B¢'&& B>G\Н@= ?y7TUUO>x e˖;992Vl޼! ߩ4#G\X,kjjxxxL> _,Djb/^Gc8 w۩ -\u\-tV9y0KR{]=Uj5V*JR4JUPPh .#i> 0Ξ~?n;&iee@jw cE4H! $ruu:tKBBBzyBJ9;2 B8B#j&&vv uaw?掫L&%RDC< 1R4MAAAAa ST@>wԷFG+HA"&(**222z\__6"J5***%^?d @ C`0 L=DC>Fgy7kfhJM.{__ߒPr ^>eFNNNQQQGMW䰁@Df t8Atul @oܸq Aаr44 yD`رFo6NGr{98vChxǹ,"^ Q Pw#'Oz;=RPV Ξ=|ymݺ57.~~~qqq{ݧbbb&L{ҥ<F//C?СCD1M>r4 mGWQQd2%Ivv EaEZZZJJJ!L-mmmL|=b8++K___"|:b144k[>,X"_ysssNN1|mo6-@A#E<==Ȑ3gDDDe=z4tP>f i4NAA?SÇ_rf777ݻ2dHtt4v"(&&d8!,X`r[[ۛ7o޻woӦMaaaާ,xصkbӉ111'Nd8xÇx&XzzzNNν{=zdmmqƌ pB(77W,9u2==/_^~}aa!E*nFf VUUE766r8iӦ899d~!TTTr---999y?hСfP9HMMMСC/]?!:O(/.Eh }; @D5xbٓ2uT˗/T}0 #l+,AW_VVaۚ귙bB}ׇT*:^Θ1ںSܸqcBBB(77?'\t޽{.ijKmN׭ܹsussK?q4kiaV4IF2DވڹsΞ=;sLEEE1aG0 |gJv8?5 8}Գ'ڬI~-?흷r IDATs7w@B={}޽J466vss[rett ׯ_wuuhmv700x!aTj "##LMM-[x!CCîo=ztѢE'>>ɓ'޽) lBCCkkkݻG|. Pcc Jm/MRÇӧO'^ꑑD!4~}^xe׭sKԷ[KMM066f[YYiiiZ|j@^xxŋ KM>>>N:rѹ~:9ܷ3G ڿ?$'@&N8vZ"@|;vxaJJ љ MKK_ׯ_766^r)S,YbddTSS/bŊ#F4hO:N )BuˆgϞu e^~ 2y丸8@1/_&9 JJJ] B!#fkSBhԨQyyy]t}}}KJJB!e0z2AeSTTTaa!QSS ā0@/zX,n4hZff&qKȦA̻AJ[nW_}ܹs;{ "ӧ/^~M_wM. $$$$ܹsŋqqqN׭ĈAɴ"=p D^N[[[p@0@#&TWWo^]]̯a6""BY|ygo>GkF@ ߞ Jtuu7l@kjjKKKY,g}־A.x>аX0@G!$H9;`4UTTNgoaR~Fd252l|>… q۷o׷;ezPL&k? ;nܸyl!]fffc'OR(wwwe#AB!s3r\̠x+WA ^zgezPiii@D'9l ~G9qIOO_z_~cc555ś7op̘12OKK_1 ;,k]ADQ`]{^h&jQ ^cbMbFĂ!XCtvct~?O>^}i(3fԩb3f(db/ ,ԧx뭷֭[7cƌJ*999u}џ}WRSS݇.Iij"HMM]n۷ׯooooooobܸq+Wvqqڰa< Å,Sg(MSvh===o߾jԨa/]Mx. ={n⢎`\I=Jի{xxlذaرVVVfdddDDDRRaG!ĩS&O\2Ũ۶mM6m޼9:H$IR5ʮ]BCCիw'܀-}b1gggO *R"dNrb"pq)цȭN:*UZzu>}L5j֬rk@)8tԉ6z86|/]1 DSD")*\[lt:]&Mmmm,9`OOϷ~ S Ow%rʞ={BCC+U4hРVZe9*[QOaÇ>K.+DoÇ7h w֭[īeJ)S6mݻQFo~׭[%عso֮];XRRRz S2dAAA+#hCɓ''&&;wZ1~/^$)&&J]paÆF*_a/:99EFF:99i42YYYիWwuu-m}堠Oo޼YJcBty2E}ԨQLP4!Po(OHMMݸq8@!I˗O8v&Ǎװaɓ'?Zرcnnn'NիرcU 0.GhbԩuKe[oݺk׮fffSCw] ONqKJ98fϞlٲiӦ}WsȱʢE-ZT@@zkݺu3f̨TSGme~~T777wwÇKd}uݾ}~/ƍgiiYre++ 6>\2Ũ?++k߾} QT7j#:wӫW6mڨsm _ה)Sj֬y<7ץKv~ٳu_K [4>hժ;v9lݺa ?999VygH0`PHZOO۷ot5jKB\p{1|wqqQG 0.czrJի{xxlذaرVVVfdddDDDRRaG!ĩS W;?L1߶m[ӦM fY6mcz),˃ 3Namm/1b̘1$y{{{zzڵ͛۾}ɓ'רQø3>>C Y`5k2335je˖#F%ԩSݺuS߻w/33Zjm ( zZh7peTZ$Gaڵ+44^z7oޜ?'|bͽh"__'svv6o1hР")RK,-QT֭۳gOrrrjjҥKׯ9rʕ^=ņN Xxfdd\tM67ݲe>}̞={ƍaaa׮]3\?eʔZjs 6|B;Ι3gرBssmۆ 98ԦرcGdddjjjڵ 9ϵ1jԨQFʸL~0@"cƌ<̯!CL<9((1m EQ8z4oE3Oh44!ěo_!.\мy'Ov!G;wܾ}޾^zdLLUVVVppp]]] z}ppNkԨUm׮ݲeƏ_jܯtWJԠAeoQ]paÆXYYeff^xvBׯ߿yI|rPPէg\leܸqcƌ)W*-Z|={_>j(&;xhR0?;}AbĈǏ׬Yƍ+W>x𠝝ݽuG\rpp߸q!!!}j+W ٰa?ܛҥK}||/_㥳g8bŊ۷ooܸ͛f͚;w?'Noٲe׮]Ν{aiiY[vLBn}8] v]RH%z$Iٳ-[܋Bڑx!zް]bEZ( fY6mc͛7>| WWW???KgΜ شieYVڵk۪Uܢʕ+oݺ3rȕ+Wϟ?oxiĈB]&''GEEtŋ_pAꚑqҥ6mt˖-3{7]vp7)SjժvGi aʗ//ر9sƎ+077o۶mHHDDFFVRE}5YXX zTYxvpլY%/gkʔ)VVV9/<<_~vvvVVV3d蜫}HFc<~۶meYo ,hҤԩS K˔)cooo !DxuC322%Bz"11jBBH GkZrS\vW^5(=ܻ3l{{f͚͛7{}Z7nP,˫WV{OTnݡCΜ9Ӱ%;;;22IS⢾*IR_ ц_u!ĵk222r߈QDzqY$ѡ}(<Ç2P<%)S,wBXnnn]t8qbjjBQOy3gΡCBCCէ5klѢżyEsСfM<@;xf͜FDuɭ[nРʦMիggg7iҤKNNVJq?jժaaak׮}_TOIIQΜ9^zΝ۰a< 7{yyz{{{{{e'++k߾}^^^烉x< ?NLLU؁rpttܽ{wJJJxxxժU)$v_~pppTT$Io1ӶmBUV=qiT^cÆ 긆ʕ۱cGdddjjjڵ 9:ujQF5*wUeg۶mM65n@ :qpg)BR.*VVV{:::/E/}ǠA 'w.YSP ?XOQ>[W8@j֬rʂ~2ga¤i&17)+KG#$ysOҁ190E$"L # ?~6zJ!%DSNJ_~J#@!ժ[@+ ҟpϫ&{'#)"`H0E$"LDST&/{ݽ{WaiaYfhPm۾#.6EZ5klڸV2RMֳfNBܺ}{Ӂg^oV_z:jKKKNZjU!č4offf6+++,손:k)SF,+LLLy~DsVM'!n޺5qZbŊ7o̷c7#F5l Y[kC\˗$X[YuE9!ĥW}0Bl>33ok=bCU7vW'O7osmƐiO,Vrкy钒6lYV-E޽<>fU퇄ݽbM4u |t:^z?SsIBٟΛm8IDAT۶1g ͚5Bl۾+9Hp3:o|,Y+9^U(BbG[~ؼEQlիZjxx Otu!cf.44i&BYXX!ZjW_{yy !̚5kz-!ĝwoܸ=jd=9::w߶}gfMzgϚ.(`s-%S'6MQ,+"E,z%[VdYt(`uCg͜0{g6GEEk4o[a(ӬYY6* cefqqZN]^j!DLl͚9- Pٵkg!DD 5,|_b]0K7~,/ZXTz>&&J*B#Uڶ:|诇ݳlٲB''$7:@1X[[;o۵m3-P3Z(䬄ժ4jΛ;[/Uj: IR~}7n?nިwvvzj%4l~޶ď6:ݢUE)d%$-|QPЅwlӮ㝻w/Z`xu?skF fsZF֮^a}rJ66ؽkpfM/5<]0V{vodo_xnnaWrF{<7@ɫZ<z얖j(vUT)7@@D"kĿ 8vv`4Ih+4ҍ0E$"ZuaJ}+Dxnyt (y}3$.g1 k,#.^(J$  J+KYjs,eZ Iʥ~w.]57ȲNK;glh1?]{=g{?vϼ{9{kp$@)pqwփW"", YVdY^_rnڱ-B(2j} msho7ڲg ,pW[P֝=z5=:ZhF#$_FLLz,{n칥)32,{`{|׾op$@>gvNA_v^EJ2!HhʕKIvs."Ϡy r#Y8m?ÞΏ;~%U[$)˵Bv[}ذ!=N??[wnftLp!-::LԨZBңi5 XsԘ;+ׂ}ד5tĬO !}-1y(3aƙ#.e7C/?ihy#6Vffg;"OIL4 ||XZ^:{6]Q11zsvk֮m:cC= }?޷gGʕ%?>YQ`iiuz6Y+&&P_ku,--K22uKwd]ޙoE#!F>vM]=}?95oLoÊ:n_3uƍY tZ6!VRN:i}. qxiZ$GEIZ,[fgG/]8iԩιJVVyZZΘQ.+\YQRݳ^]QC%۶!BT`]i3Our_+ڮ]F=bT&8]bCO`!ĭ۷OTˍ7}~ڭ[n~oVX[>iqq[pӻE>cz1;{M{o.snĻC0~ u8}6S,,-7mxǎ4_VNaff^իWڥs.c8To.j.ݵkׯ]䘙 }v(;r.n8n ڷW7Xc.Z7;ݺ}bÿ eY]NbB,B[33 K!Dhh#p$BE"Y՗+Wo_$ipszr>+KR4af< !T"ptt]{c>׭k[[qqfB̘V[޸hFw+ K5k"@1Vfom'x_ rZeﻞo5!?o=~iq}B 5tfFe3s5DxE4(ZmEyZY3]||sΝ8bV._׮-ge*^u׮=ZQ_;v"\z-@BB/NNNz>""x,ˋTZ_ݛ/Xu` ' M'm=yu[ja_1^m1zH߭v=揄[yQ]!:%lB崴tkkkڵk;:8nٲGG*k@kx^/dY3T[,ZZ-Xq|ƍ)kn iBBREQWVoOMM]f}Z,B;w姂w٩uV }gdd!RRRbbcڵm3t5?~BQժgGC:~ޱ:~}{=a\y[{ؽoĐޟlPuPPPe Նݸ(Jݺu% ֵ#S ^z> )>>Eٳ"))Ӧ'>\AK>pYWؔBBkn.9;[._}ߟ~IwjٺӁM7vrr|wãQ뉻EZݽW7)XdqfFFv{nѪƓsF lx߶6ˁ?;~ ;=hM[vu'u\[޾311ϵhѼB ib\v}sQѱr@~kx~8v_zw|ePP,+KB,<HJrVM޵<,Îæ k-, !ۯ{+Uy8/?m~÷`q?]hv cx v>.޶mrrr322ԙw: ƟW9啞аAҝU{*ejfjg*U23unʔy+bfV6##ò|d[[ۄĄ^sppHHHl ]E4 YYYj@ ^y5kTwrtHܴG 111)));;ƦM VVV*XW,UrZ5==)=-9+KPA*)b^* 7I,,,,,,+&w꜈Bkkk!73SGOԪ8OgJC`H0E5<['HgȔog %G"`,IٔI*((ңEB$!$vhG# IBQ+BBHJ~y <6c}屽$I:'VbiտWWmQ$u?Fq}/)mm1F]u%p5PG=џ;х(sH$ !IBV͕(B}2/[OVrnHڏf {e-SbMBy;pm'm9VQ>\o^!yx:gƫMHS~HE!?oS)[);TyQφ475H9)4BQ$?lDYwIy )]XS3UvIY9[Jyk/Hw5R)Oբ0ߊWhRң?}z@yXT@)?a?&(%AA`ާJ<=1+=_DƕѮ- Gl;'UM}Jw.JϜ|/£Mh6jFROL%^3w#q|AVȓNQ}O]_G1M2Ro",e!mIENDB`3Depict-0.0.19/docs/manual-latex/figures/Downsample.png0000644000175000017500000034655212640746376022321 0ustar pcuserpcuserPNG  IHDRKsBIT|d pHYs%C[tEXtSoftwarewww.inkscape.org< IDATx}z}ͱ!J+YT 1ĉr9IO* _rʱQ6!qXH$$$j9xMOO^ZQ553=3=}_ׅJ) @DL~׫{>OA|{i+Ek .aQA\ $MdA鄃(@A$qј?nݺh XH809M 1 K   4L߶m[r& c 7^z)uu֥ӄX@c:?i' m۶@;i} O^6ׂ l}+$  A\?_I`` 2SAsX,6 {zziV^(  AWy==qll krr O 8yd}9-hQ .h1`BA\(H 1kÿ7EF$.^bQ8AĬju7p̙H<₀ҢBEq  B?ÿP(q_~\((R @{{{úUU >d28dٺ\NB.UV=(.ą@"AXpbOgr9l6rlF˲Pe@VQ@ Ƕb=ϋT\j*M H ԀhJ B@A t9Pr866L":mC\Fm[Z MD4u]0 #2=Cl6[  ,RJ=!o۶mJض@8Ңyu]BN[G@ŀ k_mGFCCM0<a L&_]AA\☦ j>2 Pٲ,,KisrG<uUwwt]jT*NUhА@Ăɐ< !B.H)a}0sC w|oA@AB hjZ$ hc4M%PAD"@*Gc}SLF aBr.D .$ :q 2,414AJɤGrΑsA c {9׺>B sR*)qu]0 CI)@2B@JQyZ&}Ƙd)u\VUjUY5g bAj !03cR)}&D۶rQ)ł @0P1`9研&zׇ d,+n\ZPJRJq(BI)UX@V*AcLڶSi*KYQ Aӣ>۶mS/[&^DDXH( sf:|r<}gco6s])в,&D9 `J)BR1D! B @(; $ {S9)R*ιBD%?KDT(}WeID*qDVS:@!92Par a"(  A3뺑_0I)1ͲjZmF<30XL) È"¨F@?A1A$hᅯB_J)!i a}iYTJIumRJ)l)9sŢl&uT @Ă W/˩.J|1 Y) 8c?p:BFJuu(Ե'Al5`R`JPS!e' BWJ 41mRy.f+ZZZXXr,L8pRX(( s"@z迮B`GGG1L!"RrDdYa(a!@zHtHwQDP$AħX4J)R( RRg ^ )!LFV*d<@-u$Eq LA?ڶ /0!Bp9RF380)%-0`>=AcL1dXOSdrJ\c"SфR LӄJs@Df P:*Dm6:XH bС]<7M}.08u"+R*gYIwm O>:LJ z0%( E @B! BbZ Ms`ATL&Ba62B\N>|T{b6 >a@ļy#?G- 8p .}'''٬gw]0 !i}7BC#"26"7^K)1@4У( Oǧō(?L "8"R"S5N4 0  }TU0 CdV\.ưX,QA x0f㜳J9̲,מ$~p)hH)3ƖI)s`:} %1qBϋmygAą'>f(>.uο $" ~DR ‡PJsAqaQ]! @r9 @- X( s\.GXd2s]ɒƿ E0  ەR_@OVԃ%-@ \DA\TҮ{Ax ?{<{au0@ !4MЭ-5q(ra(J b! +ŽɪsMZ-%4Erh?6-N* Oqc!J |E>- @7a!9R>c, |E!<a9AFPAE1/dۿA`\0 `2]͟1h?L &V^%+'HOjO$͖VJ{ 5|Ws9W(u\UUed2h6HB8H b5[9Ls*3MA+J)1f(LTZoxīc5Iώ; h S> 5S)6R!"\rΕt[)d24M566rfY4 CY===@iA, 96Zضm @.L&rlF4QJɤ̶m=ADD3MS~>9HY^=Az|`,#8E4 uY}.6܊}L;,ٶRJBeYhY9 B4ѝ bPAsYu\.v䜃q"r)%׭Rj1" Sרo^oA|zIFś@xЯRPLWJ"]`8_q%"JD(]eJ)%TRJUVUkk+dYVP(`թiA E  ]!Dǃ1Ƙ!0%{I[d|$ G=J$0C?&ÔP?CDF,VJ]%TcRC@,b }G4AìUAKK @j@-T yAA̶mॗ^am9CPJ1SR1ÂLJvqW '6CA|(LޞDLJ) gq y4M"3MS1ư\.C{{;@XD۶Ӫ yCAYc4MmF0PJaJn "\Ji96d%!:%` >}4V q?W9m$t):cCApp0"24y,l i"8X,O Ļ{p=BħXtmۆ0=ϋ=c1>7 D<$J`A">*MDzA@C?A$:c?<:pDk/^]FaRڊ: @w( wū 8'H b`WFAV-˂ X О|]YK)9"sgh  5άutSJ0 EXJ ߲ "r0c !P)”r IRh۶:p}oO R_|9@\F1 [E, gc\JĈWof7M# x8Bud|T0MQJ2Fu"@x?4MV /4 <A,($1/}]\n>|X8 w0}d2.sAQۨ2& ^ b "N3a9]&F DDRAx p9gJ^)d ]˲\.cuu{ņ yCA bKK d20|8@0  m.1x$\إ2&=܈Mfӈr+Aota?׳H ^/ITK1RbX&j@ގ###P,Ѷm0~G8( ym۶.P0jC?y ! !RI);#/L Y: gӚ>T`&\)'ܝ\ݹ'eF~OK+T[|ð0t@3d >PADX=qprrl}wGHڨg05bR*kٗR(-{M1sA,$4V& R At30 9؞i۵ Ps0 n9 qfĮq%pS tQآt?j/r ׉mcX&AĂ@As"X(混yfRa@Gvb@TKhY* bǎjZ22頓s2 r9e8*ɨL&LӜ 6GFFؑ#G<qԪU.eJ)<O:O<]ׅ&Bᜫvz )-Ǐ7VyUWEut]nf(\jhFGGqT B58'`P.O';00` R%cV&^unZ89(R>LNN_0 8!@{j5B|,M}6N& DbF=Gy%P{RF41< D 04MAX*p߾}/l >)7mT b~^P:D|p4z|>_411uP(s;.4k6gX|жpgA폢Lӄ 8(*8p׭[ڹA\R@ĬIڼy3 ATj5폊۶ T'"|Gk"qT.SnZ pѢEk|3gXr'x"sW۶e|PMP0 ɨl65)٩ BdL2c>C1T(wⷜs`5Gk/s4 7ǎ|>?2A>k @V'BȐCq82MsmJ0 П\׍Qam*(q~+ݵZ +JcJDl-ι sZg^|V%:G~Džys}oqU.1MT*X,Ѳ,䜫9 ầϯKB))%j5(Ju]TJ)4U6LF:*T \L T i*ABP7P(@ZK GӆRdz ll6.2y7?_*pppuvvJ=LCr}ay^4H6 C9VX!n.ZHIq;bȴQtRq{|(Voۦ6Lӄ뮻[rpg)J_7Ϝ9å`&,_<ؼyoYr]z-رcF`&][fd/'N0\ׅH$:;;g>o͚5APPlViC:}R;wΜ9Ex@wwܰazj.|dM6tjEg0'lVk'''qddڵ:rVUOOܺu>ff߳g]֭[X* ߿|RjgVYxq*bC?vт7"7:o Z8Bt f@ĂP,1i6 E6JզMW_}r]nveMg0 !V{]v-o|MKq+Vmmmʲ7@<0 XbEdd*RJ(&388Xg=z?S9}GG+Wd\so&e|'gF B\.C=LMjO?c&,??o_*<8s 3~azkCk֬ 뮪/)ccc։c===%K;})$[nmܸoooW ]WCgϞeꫯڞ.=ͯꫯZV nZoorCJ r|Igll,:O6lr9NkƝlٲjE3jo7*/4z[T0O~VGŦEg:6t ]0N#X>e^ `X {0ƨIX.:NNشiW,R4 "PVG?Mgt4XܵkygGFF0oDL&uڽ{YVSoC 4#<g:;k?={Xr!_6Lgϔ\*'?Ivxx8Bgy0?pΝ;ʹmەH_CJ O>sAc'OW^yŪT*67ߴҌLkY?3>>^gx6߂ x oX:|{4Mhy4g"QO~;g<O~ܙ3gf{NRaδ]cp׺iN4Ds\4q b! 4M}?J 0MSG3S9 .+BC?&<b?Osiᰶmkgl$9s"˖-˗/Sؾ}4#_>y|~Va^~sV[ov"{5W^o޼ٟL_ٴt q냫J);w4?#~^I)'p,YZJE,4:TAo&1[pו1_rM8tPñv@_+t }5%|MW_mt@__XnrJa }]c޽Vfo27i6i@/` J:Wa_b ۷z~D uqhh/ZiF7t{ 7Ҳ,qF̙3엿e6~L@]%KNd֯_[n^z%{ΝuWZQ\hQ15[loZGG, c,]T[.կ~IOqhmml0DDfoj~onFwBWU3gΰ m; Ҷpe[;vSwomiiu{UN/|-R044^y[n{t-"miM#  8Z8Q xSadBy١CFq֭կFmېdD6U_rqC)O=FB׬YĽ:wOCJZ,JX*XRA]]O] aĪU}kQaafU6Uw}w?a.߳gf͚@SJAZœ'O Àm۶y"k&X,ˊ~'qV~]NoXn"__U.reZ@ݞowO:ow_V']]d`/8xM74F̕+WS\OP(*w_..J%ܽ{u뭷"htKDygoa١C6o>6O~|>z]wU>hjRU*T"*U!^DR Isy"eY*ɨ/.c vU' 5\S=4}}}7ŋmJ)˗/W6mrMT]j:*R T pYJ>mu%1(b?:*رNGs|^.[Lu]ٳvutjVݻw7T[lzħł4!%@r˲Tkk,u_9zq-BAydi PP(`K%zUV%KT=sZZZKO9EL [ڰ^n]0&tuu0;9]1kc2ͪaE^y?RѣGKhЩ.ru4cxb9oHi8] ՉiNbK.R$"rɴtA0EQuW;vUdjg<.r}k{ .uH RT >P YrehP [XlHC(X@)sd 7{Z+V@ ZjUpvر~011bJ'r9FX{VMAPg,hoM~OUd2Olٲ[d2*۶0gܲXaһAyzZ >C~k``ɨ9]8rĺL!"BZ\>Ӳ1d2jʕA\8|00̩`Möm511N> Y7)%Elkk aÆ`6LTa9V++Vkx)Ѱ/###\.ץ4#djZ 8nݺ A'K@q zrS7j `K:<<0asPZex%m)%s ÀnaY;z(T*u]ܷo_UTGG꫃ )buFW\rYo6>g+$Izu5kֈn{`jȑ#a!kT>Wx~qhABJ+ VUVpq|ddEVfg?aFDVYd18Ck:~\2x딇b8uUPof"-abb%d,4-_תsF#2MtKݘ<޿VZH Y}eڴ ;$À|HB7p7p{fC~pΡP(o}[ىi$CCC_ƍ-[255‚X,qtt{g;<9Ѽ 1"y %BctvvʎYESq-1aB8(L  A CCC !ň-]0 fZP3zRJ8q aRagϞS6my%|>bZb.JoV݊ض\rǠZG,YD?s駟v~ms6J)g/?޾}{7za?ӢKRӧO{, ]`m! a9 "u )\R7拮O*:^]eJ'] AJ Z ZǩΥXXH;7k۶a"i$ݻ׬T*y={O9J˲T6U˖-sEV.}(Jlhh˗.]*CCgAz{{__Tm6mKs?APTѣ~ѣ2u.ŋŶmo\8x&j5[R]m[ͥ8!qqB!A@1-RJ,JxĉePڻ[kZåyIkG+wvv~)#v]g\. ÀL&6mTWHP]9s!{֭ޥT)[3MSyh"m6X,ÇCCC,^O!wy\d[<݉<b?s>;tttȥKիW2NgϞO=wrrr)BH<5k7x;ItN}\*Ǚfcկ~v3Ш 4m^ IDAT IA$A4%N O擓 ƍ7x0P(4'&&\LJ ̒p+`ǎPprrI)U_.uWibOOLV޻w#x㍺0hEG޲,eYՅK.7pW.qbbݻ<|1>>бW_nr9@D(38J%HݶmwW\N9l˲aڰQrU*k|=_ FGGyA1+c}HS"lFӄ8uaҥC6>Q?c csA;QJ)Xh+͈Ym] O:$AۻMLL O0ꫯra Ul[P@Ag m֯_?v_hN:<ϛvI)u]|,%Kض0I(W\uQ/gϞB0 cVƠ&vy@ e)۶>YE4Md2y^4M)lʕJByXVi`6 6A!$A$R7N:`,[LU;C>WaԅWU`-a8E_uvvJqڪZZZTnqW7zl/ >PAڇ|{ONNǏ'x"\1v[5Y1rJ(^,u{}WE wynP.քڶmqF/z-31Xzup q'z/9oq`脀<0x/q1.I|y)%<裙!v,ԧj ;w6K,3b)v,4= GqA+iFt|A( !|9sSN~~Q/Z{G2iҗTkiii0NtK5kɁR |ѣG< #*W_}޳gOyʕA{{{jpy 6Isr訳RW_;/FZO> JTkͤ`۶1hkkc}xTBQZпQTphh=￟D8Krrr~aGwHcTӧOzȉם2mECʷlYv:oyYVRógoal0&D[[UE }|bbe =*1 7 ڜ:u?裙SNbgWU6٩[ou"q0,"ŮBħ @ysJ)+<Du4<0[(f!uL :ι;1!QDIS/]يphKz%Zr&UJb>)'6v%ެRY[q 5DzejMJMmHb @{y6/ fB}}<9a___Q <@GGG?~wfӑ??|;L~Ο?/Oa8"z9uTo}&&&|\t:͙ǏW|311m'~>8oە}cm4?rĉҏpPvѸ*`W^{kғO>Y~w͇>!DZNMM[nEQZM?a/O}_p \.kW?^hn?yϻiJ "vQ'F?I|${r;9ߖ3rfDZMW^ 4MON8Fibqq,,,A%<={U*'>oYyh4.i^Nɧ\|sA~io}V׵^FNGͦ4M3hzGZ՟MUz]'\s\$Ąr>c3gŁ u]q,벫ҒARؘVtlK.寍/kg}6|񋋋fiiikXMN߿z "#9<33<`o|cettTWo}?efeeEտW(hȈoZd1ժ>CmI _snߋHm'&h%I[Q\5ݿ_;g#__xϯ+Xfgg즏E;v}ZmӠ#0550ĠtP)l>jÇӭfbmw(={__mQ?hPUdu׾?\V{_|7\E;wΜ;wnӃ""SNⲃYٷo7|pn`*ZZM#/˭eytt?C|;^zi?!\qm'?x*v0m欵"`_W[nW.V+{8Oܫ(*B'y`:11/?t.%w^o|c宻J,Pom4:55QD8٨Zv{oB>ybdѺl}h {q CU--T 1Yݻwۓ!_׵T*m)~T҉ |3?я̬k:Wdō7|7FFF|Tڴ꠨+ڻlt5'>.wrr랋2}ej~P1`Z}Z]S066a1h?O~g榯k-}y/ rY#<?~ZMӟt[ou###{7~駣4M{]XX0ϩZj˽c7xgtrrҽ6P5//$|S9r$?ܜ[nI?u燆t).ab||ĺT*trrlON<t:MPjU?$<@<>>/799O>yS~vq]Tұ1]YY^*^y5ǬYtÃ>O>diiii͔w\־ǨСCo|c套^O>dy~~l6"n޽{݃>ؽpǠ_.ulllgVRY/p<^?Fkr+++ZM1::3g\p?bGD%Oh@1ajEH0D>K/y$Z-Y^^%yWw}4M)J:558hZvI`9t@ZVuhhh]ݿVKM}ȻrgaA~ft:$VKFiJݖf)rkVKݮTU?667x۳g^k\ƅsˎ,--OpnnN:)J:22o&755cy-..v U͛y^yss7 %іMٔ8{IaN誊v-ϟ7N(h4VDZmݻ=#Fћ}`vvt:>\fuRἯyWsΙf)*LKZռAv~i*+++N$͛af4l>=]Ttxxxtqy?MhhF~l:c믿nMՒrnKƴg///Kސ/{A_ڻdSND:㽏E$"w]A ЕerYϜ9K裏>ʓx"h Kra{!4^ @o^{}1Ysag4˕c4 Cž={СC.MSɻCAA3\N!ɯT*8m6R[F:<._a###:<=w mtG]^~MӼs~\ O'x:N,@xR_vrqtrfG-smyﻃKXH*O5@ٗ%Z|̦:):%?{,`jj<#kDtIN8ѻ~ri7C~kVȒ)b"`%_mUDDtmrXZM7mBU{+}Xk{׹  mSz~[>1I|~z/΃\)o+&h 6J<7xA5Y['N9=8}Vij9==ǎ]2&hK.T^ٿzI_8F^_ɘ}WB>5鉈 QP[75XŖ}1*_u/F'mdU^xe.eQ֘/l2~Ϥ5 `V48@B\ox7%"*)BDۢnkV1F8VIzUȽ|nd@ocaE5/ ;ťhc^kVu2۷ϕK^K EZUUͧ /OxT*iayKm6Vt쬎'݀ "(>({1LOO†g*T*$]Q_89ʿ.P_௲zC~5?$@Č6bddR`uO^Jit-Y7? `AMa) "s*"HT @\V`ttgΜ}avvv۞0^L%;|v.,,h$Z*:OPռdxM=->wr%e$;*`hD{m?A\(ݖ]Nϐ M^,ew gj< Cj5ӧQ "\@DefffSGGG177gY:zKHsΫj2`d=Wm(^ vZ0 a?]cmk>ϠB_|.>}>{(TD|4MT*!cǏo&݉)E"d'N}vqiLLL1F;&IQjG5;Axkyp>k0_ݰ ADDDJ&bD"cu \0п`Vٳg111ZMvѮmIvsayds51F99 W|&?yо7z"}VY{XUc|7oIhDZAJ{ fU]6&h 'J8~8KhFq%4MI7=ʯ[k:ϒUFP6 ?h[o)kuK^IUV" IDATǪϧ{}45'czz:ﹳsv &q:==Iv:a@vZi" !BJ/4=ߖ\%km/ce^U}>McLlarY1::n 4x.Dtfff066SSS277jڼ YcN~z:Uu"au9.VP,"bP\82+ϔ J;T\]ۊ6;_4M?+$+ 3H 7km/7v Aٳfv)&<azccIDSଵ~B .}ވa_<?U]NJ4y`@%Z:RVl5ŕpzMs!V-,,`zzz][.Dt٦uaaaT|5cz5 G. SqΉ1F?O8/+Ag>D򜊈D@Yߺ}sD@1f9ι4JIxk@8V[Wй9p?m&WY n7 I͛:Ji%8Y]*  9U|dA}Xg\5U\U&Iݮro!8 c5TU%}A|y@UbR'Np?m+&䊫ikhUv]ؿ7o|>Vװ σ5S|m?9"t/U*Q@;NUHiq)j1{q߷o"]j'Nb3*rv-* c9g^`|{]y|ΔW_? o)DD:9Ekm>޻@ƥiTw: P>T*!o6طofgguttt]?`.I)_ `P3 9ZDZd+l=1Xxa+U} W"[ _@0ۆ>wyѮKwT5>cS?64si[kSIPZ㭵^DjiR񋋋v7+b?ma.E@ @45$YZZ2FC$:,VGb]U1p [Tl Uv""~ k{K /8չ@jM$]4uR)MA8vAz}>E6M-J:;;Ӛ @DD-fUXkքa[24AFc<~?6X1j 0HdAd@4`ODyy|֫jo?cLo6͗ާYR?Jwѡ!T*o߾ ?].V%J@ѐ8%MSɺ\9g {kX}c_D,7ْ?X]|v<ܷ_M{*">+V7OD>o:\94uZg{sj5l6VZ"I m3 ̙3HTs:66=Xki/ k>bYBfAz7%e{U=vcL/Γm@^oլLy"e8眳ֺ$I1ƕJ%$8]WVʊa&o6j DtYPurr'O|YZN4MVK*OȌ1pAD4I|ADc,&k'{).-o{7E<""&j{OCS-PNp|>= ֺnI>ò*]YYQkvhZj5+JODۃSOi},S*ʚιtNӛ "&+FDlQUK45yRX_hw)&gUU;bu_GVTի؜EQԻ-sZ 0 }\kJG ]<, 0::3gάP.%MS֚< ZIiL5RɈ8O_ Wٌ8#ys|{MQLϲ%4z&{DQ4UAEg u85"rw: 'Nshq ]ݤ~v"255gΜA C\VijRNǖJ%A`8aIӴȃ%ww$Is;s}$ A?Xk֪۲`_HTEgkV j̓~q//^U9iw,'"N ˶Y*ɓ'U&&"Z-[T{oyT*Zyoɫ7?Os€hwޯ;j$@m\J1Fݮ/J;c|VQ୵woZz7 Ǐ;?(&h[\NlsNsT*IVqAHȯ[k%M5ף(sn]$ny_VZU99JgjsN1'Iy t:_YYX;ю`M! $‚j5DQ$8ҒaK_$kA I\.#IITJ4/v ֝{AnY:琦i~]4EEjYnZ_oۚZ̀?])@Djв333:==-sss:;; 2??0::, 0N#AsNHyB@8 -!A t\.<>DDKi:0P9A LAE _ jU48T*!I q$Itrrw]t:M7 8jVӅ 9DX@Dj{j P.T*annΔJ%NG0n+zHq,@ǨVNDDThZw{,M^_.5IJE8|t:mZ:44Œ)]XX@?08?$&hm5 ɓ2;;M+++ʊDQ$v[N#FNG Od7n+Zmۏ]=6/*JeJ%rfrY8^_4o4zYl`ODWD#j(&ПV%###hkF9DDD|`5ϣZ*t]|􏎎beeE  ͒j G>RTI|+++CvN "Z0??{zQ(jӽ~,ѕ %|jz`MebRݻn_dV sy]k~ 8)l%ߖW%Ey`3s "k_o&`X `P`?]yLfP5y"\˖%rV~nffz~n;. 6'ང'.Ç@?W #ڠ`ODW&(&%rE~?]] +nf A.$ ""d~A?6Ճ "W'.6A@DDE>U " JO}$1'kDDDDDDD;@DDDDDDD; """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""] """"""]DdJ<Y?R;FDDDDDDDۧ>z 9""۬OTK;3DDDDDDD3 EvtOhlܥj@DDDDDDt| Ďιܳ{ADDDDDDD;RG}/hG]L@{7vhw*͑+DDDDDDt.͹98wb_h\t`|h\"""""""RC\ s+DDDDDD.:ٳ7o~s L]w.m """""""Qx _Ďι;'DDDDDDDc.&-U;'DDDDDDDc8 """"""p?K]%~SU?o_;DDDDDDDD/ GDDDDDDDD-?x6TUew[JYQL\""J/ގJE]hCLAc"FzQQ">m"b1L ׿ m,}1yjnNfSpLskB3wqտFeVX>hSNNqǎDQ`A%DDDDDDU]Sm;&Ͼt:2,vf6e2˽uvzkWQ=##+G{7"0 z w>8r?h(&'Ǐ+?DDDDD0 SG=ss:7g$QnOۦS`d86✙/cT;_}#I2_* ]Ljj˓pεJ%_>xͥ{Õ[ }kd$n&푑YE j"w-IӦ|z_n{d+I$Iv 㷂vlәYNunǏ{&z)[q옌ٳfDQ喿VFGܱcմT{Gz}XܷO>uqlzDUAv|@W4iT)^}uKu5ɻiA`mZ\~ٯ|UC/~wɟN䭭xk>F H`=> '1H#;CCѩF>u(DDDDDt`;&l_xƹ_9?N96VVjDǨT*Uj=SY΂r+$>گyUTQwnYT^uuzi9m6a]`##v(꫷T}ϟVw;6^{5k=6TJrJbcEJR!t0L?Cn;6Mlkݷ$9feT)INw8^jAd^DDDDDt=`f,/j~>ّ4 /<_x>w/>q}宻ãL,??]\@{mY=˨8rgp^+N~Ӹ_ :s&\ڻ{c*bm]`y?&ƜLHr IDAThy( ~W """"+6yQ3lF#/| ~㡝|̗^>gyޥ[??pчLt~;H~7Xz5|ocb|vjj7書'Y]i8~-t^ J۝zðsk ADQ3ss&׃4K;*OO<nGt=#^΅w>S[xp^>'Oionxׇ1T.C T{͘G?0z{?y{|Ol3p&_~9x6U15/ҀHdmY[nAgaO ͦ 7/MMm(gh4ފJyE{q /tV$i#ø۟<_9ZrpcT$1%$jIԌ( X5(?o&?]Ә藕yhJq=x=,<;t3I_A@mDq`QLJM᯾xgxZׄPղjLDjLىT15~-wBkʊ9 1I"""""fq ǎI07'֝w۽܏7C#' h@;m} c|`|ﮬ/?/>ֵi{?n x1 xr A0h6+6z?vtu """>)S"Sy;ʕ!݂ O>]nOxxׂ;ĝߚ7>q"O(e1ƄJVWZm +IDDDT=Ћo]}"10Qsspc={my a I6*KVVO8Dznn >pV{#Z^X ՘H%ZkNk2衇&"Jccc="""E4"(?衇ZoGtyݰhC/A)\~^/ a+-͝Ech{U=Οz:l+ж>浢w/Ξ5={ $`L䭍l:JT-wd}_~WD[qAhHDDDWL(ػw/`qq?OO=Cd5`f:1ݽxۺ$M[ob!IuwٖKwR1x׷9^Kt~j@"Zcە殩VD}'bODDDWa{rm${o»Et]b`7h0Q}PU4יxYZ\Dsٶ˙o |8I08uSvc䭷"QccU$j"T*bX^H?}DDDt:t@{?<Wz7L7ݏ.pöo7^C- $M' ~?Aلv:}y7۳+ISԌǛgg^ C zU *`{cN$͏;k"5 u]0x'JvV{*طo> {wdIn &?7K<E %1^NuCe |:زe TU~Oz>=BVB .DRR0Zr:&ː<!p! #;H{ &X<ȧNjU%!8hgF2ks%ģ(,ˢTU1ɲl՞YBM,+<99۶m!I|ɮ[N0Q !2mF<Vak B~^!J뻤g( Zu%!8A"07s@7j qJRԲ\$gΜiGJ20bqsNZ[[y&նۘJpK("mGc~d ZX_,{~ *! VO!B !;wukG`G" At AF?"b 5ݗ_@\ו)/G"q OFIB5 Ʉ.q#By*PP5 hFr\@5t;?!dB'ywE`G{1i.8,COz4+1v"ӳV+gA,˰, a0 b۶D)-Bp_B(BU$J!1qye1M?E5;eBȿ&\v׸yd` Eq=_"iAR5lۼe_@zzzVZӾmA4pa4MP!ty@UQ !Th&!ַgY\%Rse9a09Z|>4 u I̐B(V%P---]|XQ?8H&|%BH|s5jh#Tp㦍)OCQd-0<1SȖreYQt%F0I!V9/t:p8n+b>z0 r9jyFE.R)JcazX$Ig,H$[RU!tT*Ep]Zy6ϓ07Bp2&p !|ÀCoo/fff I} t!0jgP-XMU9}6+8+]pٲ;!LuecƲe궧oGָ_yD)GiBP.qIu,R]=+*oYѨ722 !TUUp. !<sP(dpP3(KqB8TԎM;B, ]]]3lBLyX[!˲`݈Xi/B0jf_!*ks%03W\9r e\N:ޚɃ&Ӹk1x+a$_xEVu pؽ{atwStuX0616qd oqO|q%hʪ,S tO;Wu]}||< Y\BKqQG("ǩ@_(jAe1T*!`, EQ 23 I( S*t]rO""1TӧOG 38RommU"X,gffXKKK5Caר!`VA5p~ LNNz)9 ͞pdzyF4\yU8ope*$-Ufl`r D*~K?5C(5܆K.߯[|P Pm  ?_'?oY˸]o~3hfB.˱\.sZ,#LUU-BE)D"R*e @)!pQz }<#0 F@uBh"4$Tg"2LX,FTU;;;UU'Ovn߾=S;D[[- r9N+ROTwָX?@BHt:m& Z48iLNNr5* `YGpWgIvҵ.@];/G+Roy_V^h}{n 3%L&̲ؾ}d= =k* M'|pt(H;ykH'Uv@{}HҸ;t5G ޱ rm݁[V4i,\~ DÍ7l*P,:|+wT!jyS8(A& Jt;9L|J%0ƨm۲$ITe!8M(TehNI,ˢ6PA5;JBh\.:b?8J9A.!^BHh%J֙+v~hӎ $f,?> 7ބrs\'1tu_[OTP,\9Nn;s|YKSC4Dbe$!B0BP1IJ,Z*8J²,R3D/Oc^`&0eY)aNbQ, !(\f̲zypʲLc!I~vgB |;BE_`lZ-x~nhdy;e8-b @l;C!ӿL]evUR<}VD<YN"_5$b!6Y)Nbwvv2LG4zr?cEX,j.YjdY\,5J)BD"^<)6ꯍO Ic @A6!J10 "˲( QJ)u] /|m!`Fu]-q/j4|rlBeYHdpp(@jY[Q^iZ{jP?c ?4nY_n_[ېi=S*=1_v@`l dYW];.{3'>SFpE2MA\QWde%Ee(.NUL/!o;4 w,vwvB1MyՅ,띳{0MvV7ht3'>{ !zЬQ}O~-v[[[y||NQ!8(n=N),pn5UUܬ~4210B@$%q*0LDC5$BE9s&9eYFOOqС.lL #pӤR8 \2a }~ ?BWA]PJՃ7@09G(lYPBa1D5 !2cUoȯx >(N4ٹFFy%Im)‰ [:/Ap4J.+B1FkzpBSEBu]g ,&mۖ¶mK@`4u뺷!eJ%i``*lZ)⺮E)e,J)$ p~Z^J9QU_Z 9M $!˩&\#!R\3L4h:'''<~$c?4˘B+'T !  L)8u?XHfy@ω%ñU۟r>]ͧ$H׎l\]^0<1eSBbYVtzz:e۶ (jP(dR)s.fffbR1/RNMM6@B~Yy$BqR,)4,UUm9ۅ뺒$IMy %~Bo4 R!L&=0tJôfX"DiʶmMy4: фX~$wrpz/b++ƓV֑{!J\W !?/Fi.T(X-iQ =&gx؁twh,%z< cB$oZ.4J1˲BaH1b6"u]Ȳ Y8$IEEj$Itww5M;eY"#_{UUy>uJ%)3!şXOhcOeBEJ,zrJBbp]b1FYR!~ق(I{zz,!3 .,ˢ=ܬhsWWq 7Lך.fdz)XopQ`j/n 0.@3&`q=mHۄ[1DeǦR`d7:RwNyh9ْD%0xY`hAK C,FfƀRI`SSL :C?`>÷By9IHTiPUAEA4(u3=\.+%}c¶m.1F뺤\.Ik圓B )R UK7( + v >Mp8l P4MX,rY.JR ÐڙD"q},eIaHaȆaHiJiʖeIX̽k_uѣGӍJ`h\|:YQ~!DSQ 1W{+=7q/hH4Hg`cxy /{gw?x~Z /lY@ _<  2D"0M Ӥ6_z?wXQ"gM  Nu]es]. À8FͅsNC)kn.SA!X lqpιeYp] IKhڮuyK8uB!B)mZ76l^Rzzz*_Pqo>4MS1 C,K;2.@@@_Wnmے8Rę XBEv%g(bw>$Zs܉[ pHQlvlW?G}Ovɛ?*!wg$."@!oAj!ycOEWKB(ӓkT߫P|bb鹒sٿOOOOرkQTL4Ou7==6Ms#}lD\Ma8Cz6 j=A:;>%`:]%!a4z&@.!SJݾ>۲h.KeJ)b۶d۶Tʒe^tB$HToGk";Ji}|vIy,0DXPGQ( I IG{{tsR,|>yG]ץcccx< h4r9UBgjI0\'3gbO=T LWr" p8G?я>}:^k lٲo|   |d} edY&$-ʿI4🜧q`헀Kcč0=&̥7j@z]o&~оDø U}ʾWBx G?PJ%_d.@PJY/I&J>O*! fe X,&艢(R*!B!h&(1&8BE1IQ`Y`6)J<Fy,~=~mܟ]PMEYPJE2],ՙo ض-3(H$(1( <!L N)t]7E1Qx# <̦d2y3Q<mmmAD@,"087k@*+&ʿfSM>ؐߝ8cʛt]ߍojPo˷[,xl@ܙA"!H$V,JM\$iH&u].Y(BD !DeZ,X,F(QU1bi !4Mw_bX,R<@UUL&0~7JfLRJTUӺBAaPUkOn߾} Qѧzj[xSMrر~8JO?t>Z@@@@@@@jpCF#06aGޫH_9&ñ6 wϧтu+#-NWm pyMW(=4ur!@j88De( \LF4eF !rgge:S7! M`dYKkJh]徑P&T,j({zzrX%G*s!e2"Hxmu$Iu]躎H$B"}ԩd__jykX3u̝Ph(]םt:l޼}?gWeBPS"8dffF֦\. 5xTNv%JI-眜>}:411===;PĄ>11ҳ٬( n*rmVX 4GdYM\ץCCC|>&IgӦMM6kfՙ5˩pdryK/u譭VGGyW!rd-j|^uR);JٽF{{e:u*411joo6mtVimxx8( V#gjjJrjPP4M㽽FKKŕ ) G Ð͎{9#kIAD#06?q °OG( ޲/"Lf*g^ ȵ7^* XYpnc0` G 5BͶ8RЈfͅRJ<#9!0 rR "20B`ajjju]5phC_'_̀ }ĉ뺋~PJUW]5u뭷N.%v>zsNx㍖cǎ%¾fw}+BBA9zh&Cl6DܖڹsgkB+˩?|hlC"S۶m[p~mҹ޽;cKcccQ_oݻs /;>>M!u>wꫯέxWu^Y~P0n喉^ѣbjil@UP(~J2ƯẑW({lHwqfppC YEt]ۍ۷>,?ϻ900P{ƖG[ Ø߼ys/ ʾ}O>rzcdY\rI{k6iґ#GtHuNvL"pg}7ӳ:Dq!D#06OgM:fN9mܯ\ QgO 8r͗u֋/PB1 CfaB$˲lyR4k}#Pz19W\/cM"N|>:²8B|ɯ~Ǻ5 Ð; !G?іߍG{͒$~g_WcdU^]8-˒GGG㣣ǏSHd1/ bJfu0 N}曝}H+=iZRTRGFFnW^9=00P^u.d|1` dE*Ռ{ Ddy) |jԯ[~NB +fI G @G&''Ӝs"j)1FTUl-3TUm:{.~V*VO} @RYRIL$y2eŢj cr !emX%J%59eGFc s(YVT!IO2.(*ʬ/7j'ݻ9?ޔ/r_[[588ؔ?55=͎Vudd$/y,% |Ab眓g>QUU׽`jjJ{Ƕ4{. !Çguo (|u]{G-B=4v 144x7[ w}LN|_ٺu)ǏO?~WR$_sVVD#\sM7l2---f[[a؅BAd2G}255UO˫]$,$t]gh%Q.x---fwww%H8LF?qD1K/~8ڄA%-&(UUeҹc̲Y^|ŮM ]]]Fggfyebb"499>ydJOo7qcMq4u]eR۶ϺVm|^;qļ$I۶m:b}DZ/|ږ/=D"NKKNX,V*T*)!j#htIK/-+vTgR)?vRșLF;zhrtt~>55o~2_&isR(s-J/N/YHRֶmO6h Jh\ٶ--yݶ6䜓T9a(O=࣏>z$Hlp85OyfD"ycQ4b[[%25?BA{nօP5L&3oma?M}8j%oxW뗰h?JH$v6-˒ Ð@)E܀W*5(JYaBĕW^h}g X,tM6miǶm:::>ydwmomɓ?pVd.s;fmmm_?99=ӛELh߾}mo~K/4k˵^;q]wM??cs#mmmDKK+yk\xc7|sf1L<j!`׮]N^ꪫ5kkk*\sMghO:k^{mF~dGG ;w,?d6Q}{;|"͆d?C{$In馛2s8^:p@=[Xn|_<O8m6h!oԧ=z4Onqv횺曧;M ݍoVB/9WtM[l)8o27ŧկ~uüO+A^&06o( &S>|7Yڵܣq'ܙntգ\jBS*ZEƚ 4I-"9KiLsR\Iy !Dt,P(岬D)`0 Z9F@3$I;k$IٶmFq{{{g(?T*^=նmZ*RJ%̙3ϹƛiLu=4JegϞF .X$={L|S߃;w4E;3:~h_>}=5kƷmV޶m[y˖-~zp>ҽ{x~G>^jBGG#{'65F_wֶܹh=Ν;g?PmZhD"+_I_gg7U G|"Bp\=wzS\.ygϞoqr-@i_ƨzwwDFjϞ=V1[add$zCD"ao\c箻?rH#ຮ4==. EyYx`,ˢ3.³>;P LIӌ1F<ϣD]UUXhOCJ ^p cLhEQeEQi,kޒ˲$s];>d.orKfb15djRZa?LLLD۴Xۺukn4؅ĿmtjjJBp8BY{{,.ϟ/5oǎF`n'۷箮}wz1Ci֭>77ۛ\:;۰>Ś;1?-1F_֢ Yt:m 8kE2$K9d)~UW^Nbۍ,*.d2뺴vp8*ߣB}Bh e\6xe9q_{l4^΋,k_;9*I,-{nDNg \.6 AIfϾ>c۶mcǎ5Pg``}>X̻&/39tј Te_IkkL&-9a3>;-\NrB5Zz͚)Uk7r>Jv7;s~ryb+N3QDbbQSSS>7tSp B]4ذ1eOA&2TI%te.^[컮 E"6g])og0k0eMnY>!ϣU!\7Ƅ$IxeY|DYQ3\PTN! Rϊc`PJW_=uM7Mm\R$Gm*ɏ/v_L:ujVmma_X{j{1wN7o\޿癙so?,No[-Cql۶-nv<wɤH$H$b17yX_|ضM_y;͔ }O} B9J).U*#aqz#\"beIι lHnee2hff&"4 1-"er9pι6M3+4$I&fIu|z"W\Q^ioo\Azs׷f``LYC3>kD5a@32==mvvvnJ;V믿>RJgff9qĂu]7Nq/<JouvZqbѺ btt4ksn:;;+Ya100TӴM'ΘF[kx|fk}"I7 @k1_c2f@[\ `6󌁱?P,F8p`|c`p} DD$SJ2@J)>\;jL&,۶g[1fQpuӲev8,zυi=VVeY}f&7M:[ElPdY֜&Xjf+Y^OcTLy'uǑih,Z cfY pT6mdنeY ƘOD!cLn$@>iot3zjh~4 O  Pb1:;;dYVZfj50VR*hhfBm `ysgUk00 :q!%c{N;k {lx~I\.yg׺yf=aXMG\$ 9'x}VEӴk+[N2-tۮ1ExϢ8Rd@g F* _RUdk=U`W}D@&bD 9 eIWJ1=uͺ! tc0 L16`~>4UZ^6~fYgz.㱁J_szz.WH!hbk 瞓9'4ebVJ)dٶ;CBfj\& {{{KB[! u]y=Wzͥ=ܲ}SO=Ԝ1ꪫѥVA.^wwwԊ(xVkkvo0>>ݻwųtVk9ծ&cG?z/yȑBZj^㋑Ro|گZzg{_Kg>^e FFF2+G1*cjjiejllL/״fR+|u@hLDmּ3pM&~%~ *sRgy ={*8p.sFBq, (I)cH:elnBٙU!,1ȔRD0dsާ2L}hgc sf {zz!a0 aYlпXB쌐i΍b1%,T,*K h X6EÐ\%u3gzz.7ְv~uꪙ%uOtM7NdӧvgO{{{$XkcEKwdɿ8[&ZXTUczzښ1R>~x!}o>_{95.~g~ύ+ ժѺsNwP___`JkH)c2\rɢVZ8qVmo:p.bM[ofo.ލS۫NX! hɶ 6*HEbC#Ui7k‘`aجXQ̤Qȁ M#Xڶ]oF.ȍ(W.sAp0Eb1,T*8$Icm<E ajul>f֢Gf$1Bd -%R3I0|A8YE/d2Zf5[N+]Y|ɡ__yg獏;[>oƶW_}u6̞={$&''ݑw׮]m3j 9ku뭷i"‹/ jzzwByR/Ç{챋?>}:ka[GpCX;{s{luǏ/g\]]]ZO1twwjַ糟m8tPԩS:i; 5ظ]l} IiWvys}.p}p^b}<(4M0E(R HJL$ |ScǏT*9qaqKiB@V3F[7d;^Ϥl0lY˷LRt0 2th[gz뭎vPTAEk]9vCu<裗nn RǏϼ+_ۻwhy{;g{VTrxݭ5tqYit`qx+e.` JIV`(۫Q B58ϔjA,e~Ӿ[9[@0RN'N tvv2FGGyRAdz SJs.("a,cr0Mi`1ffR3h~$-i ,4]HgQ1 c6BqL&CL\ץL&CD$@ت."o߾}sgyfy.۵kߺ]czz9qĢ|/_Vd'''3_׆}_7?b1z?~ۓY?|WJƱA&ժOuKs-o=4y 4W-:thѕ,q}{?E-OU*ɓ8tPGk}C? 5\S˦[v/:~xZn]j~w9r@A`<ϙqڳg4}kp 1arr~׊o?8fcs]Wvww@y`ya60>>nɥRJ(fW'[gz/}K}c^h'Of>~n 'eYo6'^{r9qDpyӧ^x~мf9GFF+sdxa^3ݡ|s+ةS\9].r\>|T*9~pgKTN>ۅ^{8{-wﮥ]3[pT80z-Zќ4Moj5cffνGFF4)900`)0 o׮VSb-VD桇+(]z饕={ԕRĉ~;t>sNw}q4MNNNڍFc9Aܚ/Xؘj%FηyOj~J۽{CE||||;j5yvjnG?zK_Ru0 }hiۖ^^iA>q}wN -5R> %^\5}=}l;ȁ# GE-# 6<cn> ÿ7j+>MDz7X\vKt:?q`WWjE m^ϙR.'7}ࠗf@v4M4٠bQDQ(<<.Jsɶ%&6!81, Hb GX,špG !b!DLDJ)=4X@\666]^{#ȜO?}K=~~ތ:uW czzzrlo؎ʧ>#裏曋׭㎓iT*Uohbh!ZBzzz}so~e IDAT?|YkMVmARnћ[o:??CBҽ{ԩS_c>kgpB=묧??bV{s* 8rzzYl?~. ?ϼX`\.Ϳ뿾biho?|>ʅiwww;v_b1?|;я~401GoY'xbO~[kMx୥Z7 ?{a1;sȲ,522|+_}u~]Uܻwo> V3>==~#ŋ6q86[w:NВ],O7C7o2C>]w:FGQsWJ՘R5(UWR60( m%'O, DD3 3Mi?!DöٽtFi||FLxvu{9\൓Ά︑tpƲiRb1;O.wbpݟq[pr@>vB7Ү]~o\wumln9+i֧J=o]y32~p` 7S ,"!\:'1*Bʪ"OpZVX}ߖ1X+9 ((;OB2M!5K㪿cͮ IKRJ%TQz888Lg[Vpa8/6F챈(MxPhݏUxg V$q r0 OQc@f pd+U[7|JK/tsW^y*v޽{+{V5ڻwox{ppp {ree2cرO}SG[uN}ӟ~chhh+w_P'6at]w||=yP5h۶袋wu|?;;;׿GiJX/t*@zԊow_g`7K}ک_9Aɇ;#ØJL •BJόFPƅ.y,iöXNOOwmaYVHfE!OT+|hU L&ONNfRltt4wtt,xc̶j]cqΙeYma(A@DR 01(eY2 NZߒ< Jg_[UUhg2s4M2M3J9 (\sp[շm馛XpB =/sg4 s]7߿ꫯ. !HJ.hꚽ.rGGG[Lv5[SK1l5< x%SBYIbU*#`׮]W\Qٻw/b[oU,JnzM[*_N˹+*_|=\Hvjj}H_y~glVpן9#hyOlr]wgE]TC,K^7@s//|Ԕ]*v WҶRVb ]wDnV7xXi(/}咫{ݻw1ǑYVPݹ7v5 ]yu7_7ԋP+PAX?w_џ}ϟQ 8b;^?f*uzzff&xW}p"N>%tcLD> BbZ+r9fy\yu l6*̶qJeN)%K u:+ "BH*Yӥ6 ef `UرcE"B[/8d&BUDAVU q~8f4h4y"ȅ /h@|ygX*~ͯpwкIdDۿS#WWؽ{Oд+|/G I_ıpy '$нsV-ؓ Ƅ[FoG\8eFP6°"q<(*s)< ,¨ѐ{{AJJ ܳg$ZZޥәw!( iRc2c< SEQ=3îB934ax,Yy8bqdu}FDVctq3 d*% %'w*f>_pF+]I.v] c!1֪1 V:z!Jf= J l6wmKj4[֮1hMӶX FWLOw;;7OAG ?g;@9oNuVLbw]Oh˧EWXO8.1)KBsp #$z2JFٛy-1fX ÐFCq}XNZJŪVquqX4M2|e10\.39 Kr[^C !}>},R|S__J%VYɲ}^I}d2*s]Rz--H# h4Dd]]]sV֯XsbbbvpOOϒADs<<|PTPJ!FFFD"Nhi;Mwuj4mg+ҜJՏ?LOZwpO}VW^+BOЃS].INeD!3FO818o8ƙ3 O=c$7SJDdOOO纻 D,oM!˲T:#.daBS)%:::g!RESRkRJJ%'MӜ}p1˲("ò,EDk> C~̙Lr.+A, qj\ץ\. khi2 C]r%37xЊ:^h@o<9F;8y饛6s^<{0&-g9h:(T?ơ f`wm7⾋? &׿)q+}zRVCǑig iΥ!/0vc=0!">m܎Ov4&;GD|%A5` 7v \ vPWvJa[-w^"# S\S#"Fc 3 R c ^%J)4==}߇eYp]Bj5fpEpqhٷ$e.Rht, i<Aо9lۦ.955%8f[I4pR29q88H.c4/T? Ӗa ɐ8a2y.s%8}a\zm7i*ogطo_mǠi v4#:7<_^T hCCi/( @X^o1ǎc1QE#,ƍFdULێ/zuXT*NReӎ@AQQeY̶\.fU亮j"qu Ğ0 Jf9=+c( V< Cvӣ,ˢ4N4:َ+y911wwqޙt%BB("s P!XZQJ%]&"g5M4MӴ+EؕuO|bû-T2x׿um # EFJM8@^hl\)ir*U,ikppBK: ,{|,ˊgffxE3qຮ@iu]qj:{4&" 0 )%;s|~v\ɘ)">m`;RlrrҭT*i E g 4aYa(ˌV)۲,0x28N[ZiiJ'ڕL:zW=~z]Y3u[Vvj y5<($WjˆIA 2y%h4W_YfHqcqdWaT*"8 gy|0cjt8FPo8s !E-SSSsƬJK;mRPGG* l:EQV "TUT*9鬿z{{\e "cW5M O:pR@䜇BXZP4M4M֜ND3 ^Ç0:z?@1rnm7ޠ|5}/ RDL3j Q% >~x={|ιy뫢Y^%b0 ۶ \Nj5!l]~>$8hLQ2mc̙3BVw]mCJID$ c !j=ǭ>iaR)#c졟3$?CT' BJbe+/d癞휛L&0ͶVR Mjȑp1\@iayii+X$ Q//jW,j__6 ‹+R^~|\33q~č7>n DR* úF\.r /f4yT%ϞU j5!f+ 504Ţ=66p(Oy!2L=͢T*ezzzXR1*"]-В80ƨX,6b#ch4D\)5'feYʲ,i۶d2eYKn 8]ǡNؽ{w$ْ&4M4M4m# /0K h`maŭ#9 Bߟaβ,JUJiiچ u6yFMnA ^nWyẼnۜ1R2R`l8?0> _o baО(2UQJǏXTyKs4m !XEA`Yqav93h&bL),bBj5dY dŨVZ-:;;c|gA4MҊa`vޣ}e!mZ#aÐUUf8E 5M4M4mZ!/6g < לVYobgF0ٻ]3s(È׽%F[!qc۔s]:31A~A|&;xPc@rΥi^3uDDTT%\2 ,7c ضmdX^g1 48YǨJJL&҃iܲ,!8h4s0`Yrj59gF `I4YF!c,J޳iimXCsN'[+|i  ۞}9%H!ZÿѲlz&o:_j (zzz81PTcADq#aiB)0 IRjdd gff89\.'0 86MDP9ʲ,58礔1L&qPxggg40 T*9BAEQv)3۶Ԕݭ5M4MӴM%H]۬msF?5ŀ=}uq5GhVzzzJ'Osř3g)d;Sz i0 8QӲ0 Ӳ,9L&r+,+m[j5叏J)9WK}~Ӻ? څ] IDAT;c۶-0 e S\ Dww&5M4MӴMa/cjmہom1[;V$"ueM=JVO; ttt4|G6% ƘjW隣mV(䜳1ZbppPh4fq1lKF>hO~y㤏Da!5 B\E". dV*Ւ/OM4M4mi+(vo߾:6P9oٶ-xQ !SN\וlW7D0000 !F! MӄiR"7MBضML̠Zy\PJq}Ic,fIXK)͓'O `1f:iim 4m5Լɒ*cLQ8888yԩ~۶VѾ}*D2ƢcBD<)'zM(p<0 rj5@>М#cE%] dEf@k@۶818qe2^op1yQ(#T20 C\|ŕΙiim4mZ|Zs$"y}xxx^g0===u><&"9'4MeAs9(d2\. j4fNBϯd.'"qedq2 UURmiʙ+Ig$Ij& 'I4M4M4mi!d"ُH8 - ,4R19G,Kj5( !j1dl4㙙JR_AAPOOO4M1 !잞j4 B@J8qzj ]iZW@4M4M6_!i/Y L4cUky~ts0XE,cT*Yv4U**9Z Ks !8 Ƙ8UuQL&#]ץb8[(0I`-/_4M4Ml:iچh'4?A~s)0(", Lbjﯠd(JWJEHu.rm8sYp0MRxJ»TdYVZ,0ݖ iiiۂiچZj穴@.1#c.j5Q(tttJTfD'-W(jsΉ1&"q4g: - l6;8NZ2DqI@4M4M MӶ"(ϗ 'rQ|>uttA0q<2 !y|pp9[_c~gg4M155dfp饗Eiv""6Z2״m3J1)%k@ k%> -ЗT "& ι *>(Ź\|]&7M{mY[!ҟ¶y0DlS:iK MfR v'U'O)@DaRX_K7[˪s7c+}f\+~mt.9Ɗ_ecYp*affV3=iުV{>N;yzLj蟿o 1]=5zm#D1۶#q -Y}ٯj+][l>ؚ6\lb3l߮0m۰,<дmO|b(Z}#횈 DG>!GnDDDDtST?83G5m' }csgΜV품^O<)8322򛪪ݮh;"ھ_D~>"=t۷%}e={vu;R|FD6'EQ9jB3<ϫ ƘBk#ڎwq rYd``iv:"""E,--6"?:uݮh;c@ty{pH!"";!sXk?m0Dww#IVUDDD2cw>] ѝn@DDnD%Qxі cǺSնujcNqQO&"-_NᘌZ.C(%ٿ,[-.g N܆iU]W9@ڧyj:=:PP ""9 h3ϛ138gꍒM_V+6VtuPb(Q5ܪZz;.ũBNճ8DQoa@DDfzzԌVpThGUoUq6z'^L^Ҵ/aʀ`ƩLh{Ր7h4XGO  z""m"r#ǎMVh86/#JDI[lƢX"F ^-'n@j0AERX_&\Ty<,O&#'OqW0 "޵?vLΞmQfo˩h"[Ӹ$.D"%$ LP] lw_ӖbD}' }nM#V孪b_yjk|ADDU 7e{q__m9IRnk\ \\ռFUgl%S1@'X}XU^x3DD?A&ԋ Eh[nz_\^GU^54.B"KF4kdI~1 ""ꮨ4dϔU*IG8dG'#&CFؾ`rg b 0"*h&b!E-\b)ż-9ϘLȨ < 3hD-"Kj\'})ڗ"4R{9fG:8@DDyQ׉5wY'R+Z{ǿuKEvTZG>7}ّ} >3hDX|&v+I]Ե.&+eu3T-719YP@""C)iK&@(^56y_zOɟW=78GwZĈBDT |Q E;KRQj 86p l6 PQW':oZťrg5y=_WwDz{~7?gi"zQ/.GmC\+ɫ;{N(o ""ѝM:vL &DپEDăF5 'vjl̜:v?c@DD]s؄N]!oyOLGUlI+D!k.,IJuŃ }ftzc@DD]3:=-?FTm<S Vjjm`Q[!mDD-RNfM4+x|=RHMJDUo`>oQI"ة 8vDDD""|"r djzg_rw[~~sƚ &)rZDLT ֖Uv o ""X +vJ#oJYOQA]FW=`;f.HlW D`l(+&zb0=-'DDD$vDDtg:==-~Iins[ع{>X乃*nP/lj( x c!:L(LeC?nHI՘LT3!|mޜ8‰-DDNͷ{Qv=k!b0s;FP ]RRr<"v_ΆzG?3o|{g @LƦALI"¤3I0[)8ѹ"R3DDD83xxב>?Ib34AQ(6:&v< fvEbaL$ÔE"Q3#srȄ;ų6""('$r'v1/RU{j}E{z ZJ%J%( 2乃wPH#b"ރ+fi` @"IT$lS 6"ZLDD1 "Mw؄=}zrv?Fcljy/p^) ȲZ@n\{'2 ; D *& (+\ӆb@DD[Bnj(PƨV{78ngX\l.;q,s(*H֖Q7Հ(?֤*"~9:aêznDD%eft}kT Z疺Pjci3) f .]b!tHҴ+%#"-NUDD cD[> a_R՛֣іp7P/A__?(jr{ݟ{vvWLhJ*pO?mɕp}ꕏ_$"E' xXU/m~m yޝ-y@Rj& "@' $/tKx=&DDD]|띻30c,: o/ hROxb%9%"?+"׫[J&DQ ɷ`.h=Cj{GDQ yl}:7sNDFCDDrr &DDcJ/:("?#"9nf]'""ZWyw[3 7}"rFD|FMn# ""z%~1f "; /?$k]^8L[q19<'؂1n&~evnɈ4lNӅ`xWDDZVޕ~5IJc~iUsºJDDwd['y][H V1`D>l`,T[-!";'08 _E˹&ۥ TD  06n850zڷvafBKy9{9عno,weDDtgE|x܊qx|duo@^A*APv&=0Qjw?ϫ33zO>{k.\oo""5"rQ;8mK[:8vN8 @ к n&ϗ姓frt5/Dll9/d?}:W݆&h;anr+ 3:R*H%l^oHDDwj=a v/kk#""}!lE$]†`@DDwh>r7UZh=R)v ˜HDDa*%8Γ|KXrV;} ";&7#7?|r""ؚ3[0!""ZMh=FuY忑 rQ84ݞgX!0 "ml ]忑W 7[z gn[unWWFgCWo ouU-6""'BiGdy m/wmF"t҈'| WW~}?@ k_! hU<ҭUp?"" \]-~@[PF""s OH柈 r@"".n7ru]^l͆sk5ya0""BsxߖXDDe֜؎[hk{˯""2p Ɔav9w< ݁k^[cv166^l;qkgDԈ1F1L6""Қe<ē89 .ED gO״QTDQ"ϱ&Ff^ۘJuQmc03=)j5]oVWx( 6@\֣^\Q%hg[Ef=ru/T\?b@DDJU˼5Yrps3O0.spD6R@Qx[q~k41H# >οVVrB4\&36H!*~}zdC"" 6q@Kó ns=U,%ؽg7ޏ[?>77h dYg?I$6οVXߡp hh# !3s(wUDDDuxz,+r\x9\x9{qо5oAqp0P$AdhoދOʮP߲Zg&zf;kkh#0 "H_~j`hJWēá`׮p=Wxq[ғ~83& eBhؠ$vP4ݲpt柈h;.""~T$NEɹg]͚qe|W'yҬ,ٳפ3<̳x?0هZeYV@C@l$1('V\ݿ>[~j0գ˗LoI- .Q6DDDl{ "*#_.g)c_} f*)P-$\Ϣ1{z_B`/XI`Jnlj*=uJ9ODD""yqkXvI5ڭ?ҿ}/oG׭##Dž_0y{9y;m?t`8"" GU5'jnWCFoyx[FX\>k\1'.[,9,"mj)6DDDuq@m;;Rk?]v:k}1k}6|&n.nɄiˀiw?m8DDUvMouMO0|?t٨ȦjfEkxz=}t@DDԛQW4m6~'>.r+/}D;fe`2*q޾j}6eC6[ `f\+8""MN_>g|[ӿ4}<)+q޾hO%Q/q o_˟""Mnu \=nDk_s|;Uc/ERgQ޾fnƺb\ͪ%x>9DDDN#x%nnWD7Mo?w5YBg#׺ٔ IM%;?c@DDCU#v/~W#w" G?Af |?璼|R,_JU볹JX[n|Qnq[QOhqnD/wo=+_y?[$sI}1i糕fcV9'""_""9"rIÍ:{ .^P?kvZ_]/"[\ ݨ!k,.vG<QoZ @$[W]hq>/#or|#/[_,hoÙw]޷m9ߪV; .pu""i""T'K?ȹ҅1\9>/wm$z9 Z~xI(-gѥr\m^DNy\[-]^ gOR'"" hkXp19x387M'r~_0㌱` `T [P奋?[k@_B#!` 9BmMd8!S P|ADDֱ%:vLFezzԼ~L/zc$5\&Z.+jA-jZH)MDL@ n-HEtyA=` dF,a),E6k7TZe{ߩAUvDDDD)ՕݓڨFI$ޖi}>CCAeXTꀨTPPD@a AEwMP DLҰ"T1s&lfu9;;DDDD=~(&VA)v4![> .Dr'v^lKQldCUUx(B"d) Oa$o&Obx /<g]k;EW[i% fŽ.οj"ˇTCjCo݆oo$ w!$4%74:9T   0XP9Q#Wp"WF3(`Xnxb=fQRU)u qdlrbs2;93޹[=PR n1P(BPBg\YMmۙi-7W O=;;[J.,@D*@в*AdAx- @O<$""" 98K*wٞ'7WG]PUhPx QF`s78d WY53&"2%*$Ћrh*,V#msnǹ6 'z6-S<gܟtMsDI[lV륥Ď};o|=H"@^D_XW.Y_9Љ 偀DDDD&N]W`Y7⿿CC[kO*qf\ӳpCZ(*oJ_oz~q}iέ """(EIf(xn """zHʿϚ,IOg_7]_w?hkhq50uǻ0{Հn6x 0֘ O/ZB*~@EN;Ee QrR<;̀ zYOl٧ixt{Ƕ~ E<7dEphMsSS܏ɫH@YUaPDD *QRI5={fDDDD0 8rDv s7b~pl߮-7\ۇΡ}}sg򛝖?z_93x]x~>8m 2tu`zg6`߽SDڹv5QE@T1 DꢬR|w3>zVN< """"ZW z@gdssȳwށ-92N07j=dP2c f[}7|$vXe()PW:[Vo z-|%;DސՎH@QZP9)q3*[|h=1 'Oݻez\.yx.ǞUܽ' D`זo԰{x8 s,ƋP@<*0T]uѽ;1siB` '"U@>H$q\g3qdBzVWy ]篾oǞ[tݷs_ ^׿ʠΊ T=\V!b` 7(`M'Bx=edfL@-XTTŘ5R*,4Kv_x7Dݦđ#lFhlJK% 8*P Quf%xQ~muB?W8LM^bb 6d Ĺ'1JK h ]9!TTL [eD{3{Ѻb@e ٳrk#ܷ5p3PPzbuKX z?F:1bFЬ7^h{&U{wbT"B$,bJ* xD]vIlFv]ϭR(pԳ@PTXe5~WÞwb!Z0EzaV&zul~pt%` PMUQR %Q$@sh͙Y`ODDDDQN>[o?vM* GlV8tW`pfe9[mcZ`XAg뿪'508WҹP `R1H7qRz1c=hka@\,{j.·/<.?;vx vd-yaAeGW{YԒ>+".HgCO2؇²`b@BTo!1APCO"""-KDDnױ^jUFqʟܣ<<%0` ,P/L\wpߋ:;XH`e#u(/ "/n|`a @ D"6ΖTpYn """:DIw"c"Rv]Q7)0qdB& zk {;/XAdc#V/nհw9܅h`Ŭ|@>@ u ~,/ :UV+ # g4Kl6s >`VDDDnuQzE>Y_Fw{ ld0<$H"ҰSy4Wa0D, :`ib$߁;=t7$ 9!gG4VYrʥ8e)[qJP.YbI9N%T%تRFYgW{ιBPh Rc(&c1n~Y˯.`W̓gr,g9\FЖ6cl / 4z" rŅ.4Nd`!<=%c1ƼoKtEu!p""٬8t;b9y3}a{R tC\-Xl |Ҍ#,F\/%c4|}n4ʥ xp**y\$?5n1c]=TpGp "TD=yĒ|v>'ORw)"E@ AZ"V+ ܷp In@RaqHzrRtN%M7cY'Lt}unCb٬u܁!yN,MN@ p"®^W+`=di ۙ-̓HB БC'/. (w߶1cI%6HuP~[D|cxoDg5n1c̝}NNn'kƘ;ǣ%~t {f_9R SG{,%llg!\ĉ[*tZEUA(~1c|IoȩZc>$YBD;֝@@^e'g'ϋI)EQ7[/7'@RI\.-71cZZ$Jxl1|/YΥ7/0ߣhʟvK?[ɱcǂN^{{q d_';YƶI;fTg $ t][8!dT.Dҭ,(P7` ""Ӡ o8ѷQRi) ;#G^1c)^ )N,no;ec\ 4͘x{gA@)dJcc%s$%igpG|XX_8w"h1cm |#]z۝߽c> <䚓ei'aY;H_$@\7%};E,'Iߨ(5 z4d9*fc1Ƙ5yTn?pDU/m1wfJ'yc0J?ȍÎOi4I; 8 '܊fxPr8d(" m<1cYu |DU_SWw,/g2rIpU^Q(\ $nW-})[p w w{KuZˁϵ=z c1[| ɭ&j 0lpZ Lɓәg~0%GD8n:%T.s:s0ppq93:˓>FvlC{c1s;e/T8n`8c6҉xz5bCGT*!wϔ,$IJLP97?@v; 34O NEx[1cmSN{]ρb1ĭ:g#RvK!aE' |񹢽6֫ 1c涆ok?@,7ch$ř9Jx8!QoUI3O;h6S͌~7N"\D;eS+leazA{<' %1c˿Z!6%U]ZUc֟9dYF'6o5N_%GT [.V,O0f"dթ7< /!zUVx4h1c*6ݠwM{Ƙ [,Ni7;MiS"}NxZRR#evr={yrD>Տ;/ >ԣ @ԡb1c̍n3߰fuӶ1j,NmV7^:P.Jax?'ˠ4Z)K͔ʵ*}[" g4߆snvZ,`yJ&d0; Hq@wac1F"wx?'!UݧMUN ƘvӔ8i7^hRW*RC;vb<r]s/q"݊EJO+_|qiy^Tx 1c 79H1o^c6ngi'hiys׃j@.kv'Ej4غmz=d`r~EedNV <S.1C9iڴ-fp9|JaQ8!U=YI8h2:٩napʖZ5Zm[rPf꿲*م3n4I-!rv_{w/Wꡀ8Tq=y)y0c1%L/O; q+l3?9K>~l:DJ_J:̧;9f y8am G*E_8|6 eC{\p;I) ~~. r4%K3,_N`@c1ae c6^ɿ/JvvId~foghlrB^&#(iH; FR3hfP*l߽z-Z (]/(_'}Sp @4Cc#YN$+fc1Ƙ!KawݮIH:f+3_~C*er@sNLԢ$픸8ٶ}z_DQ0t9gGOV _M M/aqf!$!MҢ% ݊@TD9.,`1c0s5KZ1qMѤhqy^xS3ga'fL{IQ$ ,bnrJ%bW/QJrä['\OLy9 y 50e^{Uf&Ҝ4NI,Iӌ<ϋj1 'ˋG%1c̚16+gdiB;FRv/3?>ǿ)F y㔸١lnwH㘙SL_@_DRDQ@%n'ʗx ]\ w*pZ97QQ>fjuKc1Ƙ5e c֑U7ZYrNCkIkAѢO?3UqJĝI3ykٓomvvep\W#ʥb_:[/'ۆ]rs}]Ʉީ[ λ* #C|5 IDATS? |Es˧diF_MxAhTJ+W1c*\nW> dvQ־4z<B$DP|wQxipY߾vA%j&Q #p[]N}M&ϊ{s8pePzSoJQ:_w׿s|+T)wdw' \sh1oPQUQPΫ%u\L#GX%1cY0f] pA[Q>N'2$:.)K1o:'yOuXw~2siK/\j#ſ i VB*?MbJ Ҭ[/4lr ~'/K&$\>ޝ|~})E_zd9ͅ%MbNA1ywH*7#xQɽ }vVJJ:c1cޓ%YO|e~ԟܓ<͊˃.>ϙWOx')Wgz|2311NQ QRuGU_Df0$c0$K .Ͷ>ě}oxr:!:RH*)*P͊ ?Ⱥڝ^9{fyW3ss[> d{pݠ188Aןk&Ŝ%qBdd魿̤qzO_sY\?49caCTU3\Ѫ A26_=CMg[?{bhlkeLVqrMUkq{񪚋H#IQILE|)ItnhP}1c̚1HUرcrd1uY_춷I1I೜<ҌKo›غsO| JE a cht[Y 3sBFcћr鶟R%P|"B~m{w!>q7Y2c[qAZ$A '2}+ursKM orT.CRTt@t˕UH$ NdA*_2|'c1n,`:;r/$Iiz-Y^YFgL]q&gJ_(Kݠ?!nwkP<@kH@浪x nPG)v=;O~竌}~0 EP-N5,'] sdiP|D_z(۶{ӯ7?_c={7r+^3|7<PH(kBG,"yQeՑCz\͑c1fӳ1L"ZlN )vg9댟@R'/=;r80y~}uqԥ+l߳IV%s|^$4>ǹqR+38'l5\r}~=>ӳ{ />= Kl۽2g;aɀF-P=hg"iE4<)sbUi1c5,`za_~e~a?^_›gy[L^R2gC 3s0qnsϧOYCI8@jvڼyA ,UX~$ד^`e @ yTx`s'n(0xɇt?ZMVkDZEo.6'Vww]oqin8k!Fi7Z\86~E(x zZrBSp "mv4KDc1Ƙ5e c6܏%PXY >Q\?G:B\>{=/vW n(H:1S/}v۾u˷i/nݽn0?=]8K>j9};LMEe NVz~j :PkP(ePeׁ=WZE&KLDq׮D$*tH MԵND9!#ǟ8xP>Gn4c1݉U;w-7ҊAvr-f\9?Λ/ŷ1u<{ !{ ?U ,X9k+ztD˃>0 UĝA- 8]NQ3HzQc1V #ԗ?/nX}λ$o߷};QU/MrǯZ0k!b /e`W$(W}9GiNKQrH%Eȥ 4)ob1cO*DDgFGybz玶>teʀ+S,L;$wb4_.(KasJ՟'\G҉y-ygTws^/{ϖ㴵8ؙ9r̦'"'{8qjϬ>\F^^9t= p0Ƙ;% DD9L=}CXn֜^uI+v_/{7WUNB$RR=]`E]Y9׳*rIHW4L>9&u} 25,B!>}Ea/?zyy,T?{$ʑdWKc̝Z o0cо_/~˭*zuMat@.]?GuVfqd1 Q"?~7Wq }v+qAd7634,v2^ON}?z=~Y"c,V`""3?{"?ogiOy8C*%wS(>蜅Go6ޮQo~7:[" ) 5$t$;gH,SI GrdR&%d YO^*2sǰ c6NʛOk;SZ5mz?EXg/>ț*2240RgrHK;g'vodVu?4E8^&Z%SJ=0G$ HYҥ*Ql61 ,Wn}4ɯ|=߿cډwbO> U?^vIﳹ0(-UN;H>2;MceYh  }yDSWB@ uu_m<8zEQrQbq4PX҈Eq,҈bZavN/"bIcٸ HDn"w}zݻ&s8'Ͽ8tF@%&|Hf4DŁ{ѣG4jRAy.d@-1,!UPTR" USP*^ƀBi ,ze s gyF >&;E ^ό1fc1ӿ }B{~-[{_ζv8wYT4\ֶQ?=vprS"ձ%F|Ψ::e:AUj@"aE YE@B*+t4TYR1#i)\;e,U 0d1%'wE.z{I]*o?MS eKnnWɧ*;|-35Y%Qj&-Su*#ab/9m sfk$9ʆg:J)N f)+xpEBfY< 'ȏ!Y 8Kyy̹>t֑z(MRщ$,OCq^eFY糹Y10jVo6Aq\2>JfHGJת?;e#3/+^G8@>omR 0L\UJ.LgG4BȾxboX ;POҧk^]w>+x8 Ks߁o eAE/:0U:A>Zo6#A(W_"9I]y:HKOw;UKw^{V8;L\_j}XX0[g8pIU e Md `1%_җJRO\;0c[ bZj2|c=m;*yST޹fV\z3KcdVSD5*혁=G=ϲvfgn Vj/GN$,3\.!\*!L9X;.UH$VcX,`D@;&]=;ÃjJb,jn4|~&l{cI8 fIJ|9 Y NT f\G,, 'vc/;.[&sr  ;ޡH4U1rAs*\<iLlDьihލw_|ld:b(s gBÀFHcgLLh@0Ƙ܁z-ǎWsY|NĕHsQ @u *yB>{0$z!=z䨕Miڠw~G|ldfgn}NfdB1paF wU8K%"&UXhezUzDm1l02pA{)33fk.@!Z5F*nSv fŁ>7tnqP:ם;jD]1qt6Xk&΅6s\Jw>IϧyRo<*΢ǹPjrL|0Ql1l0CຊN2ꡧ"G9|cY_0c̚DD}WW+3k%sP"U@UP׀*('  1Ƭ3Kc1}G$ד}˫7Wȓ\Y yABY(5wpK;s1ƬKc1fM"܃݉ 0]YD(z"JꨠT Asc֛%1!KgW{7KgY &!P%hDA5A,`1Ƙ5#"r1A|xvG_ŷlyf JIJw"B G , W!褸Fr 4Ƙd c1Ƭ3{82껚~'жC6|p`qi2pJ>&1A=BWc֛%1NG=5D5Wuit&_5m# *@ A:b'c1c\81D><Fz5ZYS * +! zc67Kc1f͉V{?Bo8~A+/罟ofkEr@ |~ScYo0c̚:˷i)^@%kP*.Y__ㅾ_gKzG_MlD/%HR-y9A!yh1l0c̚5Zݖ`0pۀķt7.)1"!kN3K lDH\ Hm?Ic 0Ƭ?E$X|,`1Ƙ RO{ѿk\'ݠU #L5iQ|/khލ7[+"@z;$A) 1""k"2zl^c1Ƙwj+<]{Zam أV銠՛,3p)\5& s$ E U-:cޕ([_TD~Q򼪮8 cYsnYmgO݀?YQֿb7? @B( Bv IDATywXnT>J$" h !Zc̻PǺfEOWokcYs6+!Ow gm3X: A *t5A? X).86G@c>Tg΃:ܽApD$ʢ˒["'qԔSvMfLdfIRvkfWyvHoC FDDD<' yT8BzyӪo{z;[l!JED֨:_wRWSX[f߀눈4V?cjsp *::nLMTXYFzjuDDDDʓ$qX( i&✀©&z_/@DD֜e.,u4;O;t-B\cm[ٖo@Ny>C`a@qa""k ,Ш5Z""""Wn8W߰#zo5 PDZЄ"R hd@"""*!%8?H[xOlP/"r hr`\XwA?Ѩ뉈`֦Q_idǡHV>vp9$ A1{9 ܋bP59]=z-Dz?/aw1/?ǁyÅ'6P%U36"""Vy{ ;7b}?Sר73.eo# Z}""ga~#yqSfI1 $4M}? 6\P/Ctד{D "rM0wA^&gjDDDd J2k(Q)1$v$.S\$5~LApq_P*9C" "yxrP,S5aG{ǖ~aqhDDDd1xs/ӄla% K'+˹Ƞ mɱ >*x*A"GyFiKT!BffU$-E%6B psL,q{@D5)UiDi?6:""""WmE轫>>L ~ vlL8 YV+IZ忘-$Wi>_<ۆR4%uCmHm)eFƵÅ_,"rX  ^忘)>Q\1|̴bEڶAv, l6(Ш{\)_U~ _#"""rRk`KV Fg,=  !DUk148_Xd׼bS!લ.8i nlԒED.3_իӈcEDDD< ^{qapU= َ ""tYDDDDQ$wga}Xᕶ/WaGy.UPE]$_õ1*,zNx <`4%ϽT{C=.ޤ2I ;OM_Ê,#~,9Х޶_;[l} ńWZy;?µ:DDDDAtTg ; %ɺ_H/%c > 3e!ۓw0("rmv{GJR23%Y}e[/B_U\ """"+{'L^$qVb.^XU`z2d0[O6P@DDDd@0s0IԱ|\w'caڿw T!*Ce%leUo'jn ""V*6d2o>ʒ ei<-MUD:4nOFu\zRo~o!B _;bı'2Gb5G i6s;mt8֔oZ_|,}ok_FW3UDfTqT2JR˖i9·{AD:iG/ǂ9ߗf0aDp^?`Pw Λ.U<0g@ьr5E-ƳĻ_DTeả ӕv7;S=:dz1cyaDŦgm7ij4{f/~O])KI.`+{]&_)=1{fg>u1_Dd5po+dm6;i,7_(Î`֌)̆PgDcD&{/"l*0f?Rlv(Xc|uiY``Lg`.R)Mm"u*ȲNk fx#}bm8v3&̹Ll}xA """̅̿tdJ;>sq``f;fiᳫ/": """R{f#Wji[^{8cΘ sA@9h_Dd5R@DDDA~5.rzWo GOƹyN<Θg܌iET^B>*Ȳ/~̻?YQta7`xF=LD1s R^"" """ f_do=\f(,`!ɥ-߿/n=|zsc8Q3JT)mw(YmT I"D˳r\CKPxз_n{;x81g0JTKD>DIY9_}/=xO# Zg]J^So1Q 9iӖfܧiia~f"I$33<|?=Vi@ef%g3|]pWK;_~1et͘Fd)D|x#jYTPx~=RJ.jgmtCb 7S#C]m} )4sqļ (r4Q_W/" """MXxC&ލzk;"a^\)O0Nжy7Q:'0w_Bh9Ր2U8T~ܟ5Ai"SzN~8IlLƖ(oKiՊqR#qW3QHLbBja U yja@TiϿڠ4aI7h7;Ag;]xuK\uA-..v0>FIucsQhEx »q Dgo"֪ڤ v=Obۺ"҂RrQ-Yu\t[RK>ϔ~&| m7߹VED&DDDdUY,b1`h_Ͼqa;6<'ݔ$I?_DdmS@D:dfZ1]FJb9\v-|Ȓ~k ""׸dݻGy'?}S`*b-UDڥ5h1ݻw޽{!b}6<ʤK5K[\K;wUi" >pwQ-c,$paǵj%kY械`49ܹڵ˫ """M5la6<< U })*LbYg\8#rqLeSx;A@>V!ys{s]š| 晴RJQ\\ʷWPcr$dUk-TX\<޵RV"Z-v-b1ye'K8004% 1o؈ "o0_|{"s 㰘ʸb%plU63"""R@DD.Qs٠F5=0 :Nm6Qp, "Q?*\"3K:yP3o8LOi"ʤT-d&p~٠8Gef7W3Fv{TSsn/˵[3AV-fAtZz\t[e xKpPbވp>P2F19?~§1hl*I͖2dڱs:DDDd@Dd9?`5*fu=D_-OM<5;e<3T{0<~@.]6:2=lo3SkOuT͈YdkY;?"%S.;A>>TX Z p׮]NFS@Dd 13۵k wFDZѷk3=qΗ=ѹSwf|w?N6goękvלj\a"{ E9|*Qdh {?g}TP@DDDB5b!)\K_KL*y|c{n{ZtOٟ .2zbQ{a>v[=ջ{3oUqV|>\9CS|harx"*<G~c"""r °zԭ[w*31%Ww~_?3-[n157_9.'jå\%XH'}6:L6. Cmhh$<iu ]Ã.;UIU,JcVO~zï:\ͽ|tRyxdb𡳠j*USըGCL;=JEDD1!TDd ޳cA*lCUֻW#cyQȵZd].^ ]Xg {:)W[RKc_C;! """]\սL6^邳!RaQhiv8J!hes~;_=Ɩ[ɸsyKjf!T"_R 8?yIuUS*罇pCLPNgӏ?O-7f/>C;t<}K_&74Q6WW8~0}l9Eaz-^j;ڣo|6VKч۽{ @DDD:DDV̠;4Sɼ7n<3:r{!X+?Rme0_&30n˺{0I;3o]W^gZwbfxG̗〲Qe (_O>.:YTGjȱ:dM6JG)2slx#3} [7ݾj.let|;{?*#qKs IDAT D|~~-O[b밈.#[!,-Jݡ{EDD䪬_"ED\ff{5&'S3C}?۾R>z?1poM> ~=y.Wc$_Z|ɢ !^z>m@Dyk'EֆBDDs$"""FUy+O7oȮ_{O~z:l'0KE6NI*@Rhydyul'iu|~M~D:]^~'|'vQ9"׆w6}K*dA """W-DD<۽twDJ:y :A>?C4tsKG%-鴑NI˴c{Hh99OWIz{atjN\/+53fn+E2Q{Z-ͼko8LJN """WD""ݻ?{nLߊ;Oq@k38*A:d/~u?={3OW0$ֽFu~\~ɰzEP% #W; -bk!jt- Ν4@DDD ""Bn+L;lV'233@&ŀQoC&3OGIu?֭ϱa6o~͛u|q P06sgV-6]vhstcK-Cl9[b+D`,rm͎]DDD&DDVEgnisEl֭x@)ؼ eƗ;1Wqnt!&9@HLGWVmwμ̓“-y Q&c749bp@$"""r94@DdvgїYrA~cV}Y  #<~ɘ x7%`9z{F>od,W{CBo~1RejOv-ӻ^Yɟ{gy- .Lw뺭f-"""k ""Bww{+v9< ?KN0XL>oѣ'N:::Ν1'O9zl,Nh(Smo*#X*ƹlv~)Eqd \e˚ t]`w=K~""""GUl׮] Zڧ?4ش{$bnT*b.:;;T"^xagL34T`ӦڀLOWylr!GW f{K,mSAtv09Rda˩7;șp0lpxKO;oblJv{ΦMgش[^W&S:uS2;JhF^~y0wxإ8 pQnc!*w^?|Ǧ;;-9%hm+L afNKU|[Z6B~6> )IΐO8hmcvp!ѽ$c~~#Jrѹ>(72k<2AJTv`f YrV }`EDDdR@Dd'iYueo!eVk%MI~)6, s%8)./KcɹǛ y2@K5OUʰ\|gbvR;ǎEM>o wy^xa"W|e*y&&Z[˦4m;Orw5Jxy0G򟀀(vV 6_0V3>V UʰBʖx _OgN^ul9gΤ)>]fd6`Tʆ /3:zl$Q1~&f;S  s*c_DDgfMi٩@DD(_lj?zq--DQHTZ13]{RVxv?-al< d;ghIۍ """}2P~8bf{ߘDDd^F33@2>*7KVlH p=9O\EO_imnV-""rDxFJ%m--F8r5 `vSy̒.Lhm /K<"""r}އf?[O>[o]XT [| BFNGı-nBoobH{r=AFV\n\nev3m> .9;(\936kpv f" |#l=@g|~C紴SSUlPĉ{{VGN(Jsy7WTƸ"7w <oOw?_slf//{d"":;'^𴶍1B0jгnԩ7񱏭w@CӓzØ'JcA*:n'&񈈈*pEn?V}w,87%3{UۼFDDV |%qӋd2ɪ?t:{3L;:ؼGWu_dSS'㎳qؓR:sUTWQXpI:p|kf?`DDdu -&p6;*/@غbqO.t ;WV7HNhWS3{J:u3t(J,--ŁcÆSQnwغ57޾6я3|WrB!7@>P.Wqr9# 3mttLQLNƴJpl8MIDDDc p>+ШafiDDds8c-|Ri],l~GP.o~p:Ő9sLGG9R)# cٹmvY!+XXjd*OhT 8Ҡ뉈HY*dEeO.wP26'SS[HdrrK;@{ՐbqCv[DGɵƶcqِ'$syL}ۊM.,uI\ +tg?oQ^'ݿY1}x/%-y\nH#`s[ccA^$5OǽG(.!.0 WV+@+RQ P6kSfV(ecW\[}}5;lʿ }8__tD죯?~sw@ 3u~=0 ֦?7K^'~*OI/AP#h}@do`MRǓ7o]>Ȱ .e)~u?=35;s̆S??[$ޟc^ ""k]-=J*U=oоKQr9dF)Ym4; wkf FikDDk;ϟk_嘝TjRi! ' yU*u02r;:N30:QfJU< 1F'+$~DDDI^~'~8'`4_x{K]~<]9Gdg~'"rG~ԝ8r/+iSSI*w.~?P9ݎD8~NnԹh(j M1: )ΐ'-2; uq`}ʟYЧ}sѱJfoHuGF]vy!@DDd٧?ivKwzb#WV"S?J׻29~k=Lhs_~> C! :QcOr3ˏX1~v~+DDDD.dUH&/kn}5os7-~D?3z[fgvzޘsGO=ʍ;ȮȫEDDD2%˾1_y{{wyF#""kKx7|Z^'(躤klovϡKeYDDD48? I{_5c徙o]=YDDmq%EDlT*>}#{d{ǓLQI]D"\an=|'|}#.3 |)KDDD_ H1{C!ܒKJED ':o=z7/NM<7>ņm0o q2Wੱrg}mO35\4sYo߆(yyv[g/+c%Ne*7z1 |b=l?v;N|Yke&5໬US/"ryc> STEss2gg)eT%B"u,N7ceQJ_aܻ罼zUNԳ亇ɹ^km$%^p!*LNo[qk$S]{œ51}2Q"#-!bp\/UQ@D:Yl\y;E2EBڲc%c41iA&HE[*Aޑh/(zSESiƬnzɢ؉eC,"9E!9_/F eɊHQRzAY FTLKcc sMgjEa={-Bݶ:gGU`#U>;0c!^qj]CH 7$9yՄ< ^CVDDQAL]3 'qb0N$[/ # C2UATN/%xmvz]asAn`9| +˻Y=?oC4ՈH"[j7 4xK[75l[K#X@;ýb5UߏqO'v`t BљOD 4GvE( 1@-Ur Uaq1 "juObdal:t(" tͩ T&+($ih[+ 5^",ETp~WW,Ժa=vߋ=oߡZ81){f6 U]y.1m<ɶ3P]bE*@'XOu??iZJ[1wW)hvuYT .ܔ5Z1 XuC(>}qq@EUȨ ޅ2U1߂ɇ7pl!u"T P)"̆R.ɉCS”`YK[tj5(xy]Sr!QTmQ˨ڰ*NX]~ V욘ݒk?aNcu-8ےF]B};뫽YmXdQ`8>aM>Xſ\#idE1;ZADDD"UX" Rא:~z7cciw\C Xh"_7WNĩΗ-6s_(o .wˠ~ ?IDAT1?\ҵFp9?@jjԲ"0tԫ5oVDDDd VȄ֒L:3=+yELtb)\},fDW+u/:+>C.%r,:f,c{b`@-{>*Qq˨>|ЪF!zuG7pkήWH 4 N|O"""wc@DJEʦTf_/;^05 bz>wb+앰8\<Ԏ1l߾LQ<'n j  @hdG7kK٪V"UFUu߾}!unR8O]@ Xe5%*/ףD><;1DC*&P Ą|S;b/DDD,+d2U˙-JR 㥋@@̺3(P!aj%2]"ij! U2$"""Z"DD3n  {ְ57^!l -v4pDl19@DDDhض*v]q,`cyݑ TDʀU[Q5Djn"""Z{R_Ws{ X<6ķԦ!7dy -!(FQŔ`2`W| #$iDDD\ V=oLnM8Fns [s1苨KKPc[a/!*0dr?-"Uj`p@KZx)]>Ժ-7ӱ ?'6Ñ[{Úi?xZ(y"R*vNaѲ1 "Z6,[u[VRViD(T.gSQnf7ZuFlE. jj䭆(Ֆ""".v g_{ەRT@nusLEqxLٖIcET2" !41~@2%wo؈_Q u8JJ=6 bH+AlkYZ9XWK Z˕165K?q?-"U|OOڽ-nRuG7G-@MXSx|^5ǟ<߀ӛnYiGO Y4maGp$gR0ebB,$'UDDDD\ V1Mܯޖkݞ}}b0}0S`?:4zZwsY/ba}n m ȴO`G})h5挥9X,,,A)pJaѯ>,"""Z6aOo>뙧'6|yOGY9 o N&1Xx#2|qnl܉;܉ٜڵn)u͸zx)z:4e9 vCCCzp@"UnppP旙kݖ/7Għ iJ^f@b-*nƞ3Ç>-S;ptQFZȨcm7,Q? """n@Dʉ 3O}|MZ; iB(TQ r"eXk Vt.Ѓ}m5 +LWK"uWޣFcFM,bX5_>"""n@Dʩj瀵Yz +P`@! MXu!fbP S |wgX Sf*]{Ǫc6ӰeYɣ!(wAxmѪEֈ?ڗ:lE$M+S۩"JLOАV""[[mwm ,g0 Nwl2ϟq˖&Xȍ&"ۤm3KsL;ó|D"""e`@D@ >d5>޿lY^tӄNw6L[ 3S_ԺYbgnRWSjk:rI +k^?0'""h QUli/z6|EvU2N~O>: Lt:d]s;WN'H$"""Zi\h QU|Le{ϧ 5u*&q`[C?6ܞTOO3i˕"f_1,hqt~k{RWI|]WfѻUt`;?M;.lDsv̞`! ul:L/z'4DDk_zhte wZ>a̜ylguZm]P1 4OE-#6_AOJͰ'""v>x￷;ޖzV]wۙS8_/>v~ ]hbEKa`b "u$H+IyQCK 3g6?\퟈nDDW R;z|qB>Yk,qԒZuqO &^Pfbn. ϭSDbJ_"A%mPA?L2٧^"""݂dK*#lZ2ұ0+fcy-[fҐLSvtjOGӉ%tX? "[XuBQɤOs WCGk[Ϫ/}tܡs?_ """p;?IENDB`3Depict-0.0.19/docs/manual-latex/figures/exportanimDialogPropString.png0000644000175000017500000024304012640746376025532 0ustar pcuserpcuserPNG  IHDR%H pHYs  tIME #p IDATxw|e6N-eQL(U~AQ?'_F\A iE&t7ͼqCmH'^.&sw =?"ZR6h!@h_T8DDg@n,˱l6-7nTR]]& {8C?V$;HSDDV<lP"%2X oǜsVY*,nJ@R[UUZӗqP?u2rTbzX-29XSs1a8XNjːB!z:2asݔIB I0VRSIB kac fJJwЛu)/h4DBo>}z)|}0 #IC5bvqܝwLd &ju&I.~˲^^Bc6VYY%s^#ǐ{V~njVc!G #Rm{1H|D?7jʲkrsU DB·em; ˥CP(`Yl[ƌv=8DOIJI---e1'͖ID=Ä64%5"{6IEeeaaqYYy_1͖5-Ds|;LoIȰ '8j2mGN?OeV;&F&`tg`R c_L++~l1k=&P{ўM%[ƪ* ݯeO\h D$Fa EK>Pk6[u|o/'2 sBm>TӍO/&:2"<5-sRz8fXXXӋDɷOlu{\Z6jdZG7Rd2ifB,jBsEE%D i]dd?ze2qt#`XXl<&FqNp؁.((K>u+kjW~ J$eDTQYw3)/zZ bF "jǯ?a+*OED"H$gYw%k"@V3(4^' [ ih*ӌ 9 \IϿlNY'}$%^ J6ˉ(pD&,-ͤ)"OG g`25-d2yy{^#bj;w8jj D=p@=wd0LD$×CR7 j q|}2D95u8C5I^kp#Ū,kRӌٿ sPuX"$DD$qʪ#8!r#,9b( RZZvUpX"),,`+SjR32+L&30Æ  TRQQYYYSTho3g ED!`o.aԪ`TZU]}I:*880(0@&s#䔴=B===u1D-_ZgM>Mo"hh|R䠥j՛&77݈(;'h2껇v6yI\$C!rw=IxYW!ɈWw\^.4X\^^_ȿ4P+LGGDr|ğ<}>Mf 8}<˲~c9~s F&?'dhs 8(P.,,*((T*Uyyz֏њ QGۖa+ذl6I=kOztde檪j·<х4ߓlE 2կAm}'Gh4nR7TҢ fdvsjW[Yu]"jM=il&\zOEtl6[eeY֪j//&4?5>n{rm4|hʛWk󪍎N\<kd2L&sbCT*JgF*H%׉`f#fG8lKDG!z{vڼ& ӭ\ ,# 'H}WH =qH)kX7ڸ(tt| @'kɱn胾ǜy'@cNbOEW]>Y#r[y3&DZqN"Fxxs/x!- 054# ȡ k Ĝ1'.eVh4{6m)EK7NYDtCj5wϼ?x{{9^T\.[T?t-.nX,'5>Fǝn!C nb6$@cq_vJJJ -*.qUꔥ癌:il6VcY9dſ%kpm_~Nm;:ۭN6kwDm6rV,--Nl)%22C eWYYVKnפjTVTJ$bBfθ?~+2_sȱiS';X d%ZcEEEPP ,[TT\9{r\.7))i!!jZڌkG./gfe>yVͱn?r䘫}[nm{xޣA|9Z/~tђj~Ρca}?x uZ`N:}׌Y|iԘqDtiw`ƅ;9;g^|g'Oq@qrV/?4pUӦN~b":pWdNĜuZڽ/{ooӧ_&>[ h24z>1ÓU`ɜҲ@?as22yٮ)o599?6u#}>>#F W(7oQ*wm;^cq@^jjxܰ׮%"Nlc2f[tt|HDÏ>mpÀ4'FVhp점Ϭ6@ۺvL;|xgoqnbKw; d:IDod4>fb _n[avauk^Qc2~6>3w3N,eD4bD`Ehumͺ&/j+/E˖.v\vɅe B??N6bZsrJ)&Z Lcys'O=7W၃\ȡ/Xzq{?h=#묩i}r<<_c"(<<=XHM+Ӝ H$+8nBmYVz52dpPPt1't./<:ڋ]9ixnC5a J.5<" #""IWIDD""HH$ 1WD6"ៅJ)Kd!2Y3>&98M)8e:@Zt>ҋ#bF>Jt 5ڀN] 8!v&FȇH9&]8h!DzbMǘSP̹;s41'3ʉn߰k 5태T/U: u >C͓:K"ծs{SUUUAAAc==rΛ{ۄNl[ZZz~]jfϞӦM:e2=h}Fj8: gֿNyWl+]3\//UUU 7J-**2fc,.] =/)+]ϼ|}}S[ADYY . YonX7f(":uǖj 5aÆ4m,\|߬qe7V蜹=vBtvhPUOʙ֬;MfڵӺ@ЩbNooc'F98vИ1{$/;z?g?0s]|'XHD,.YO7?i量;pL&s#j{׮~pww߻Ϯ\?cfųMIJ%Dt+?x7TKΟ7gG9{rj{Ds^@iԜ +xa>)51 j،iíwS.c\saӦ'l6~ [?~lY/^DD>Vu˗_eg==3vww'jjjz}b⅑#'%%'%%T&9555+;'#3ka9XU<=C5L&kN+J%tC"7xޕWg2pxk4o?V":~"y wSYƏvKJ.QPP'm-l2eH*h***>؞X\R"Y*х[ R?DCna]w+ܵ)k+/+;bqh:ja]_[[KD%$X[tt|HDÏ>6;ּBlҢaÆ k^/7ǎ_n֩S37]ZZX2k&q'L+ȱAu $8@ <|;ۛl,KGAD {~1}}̸~ZeZOz|"=1LYTTK[_xa\.Q;~0uk^{d_cm}sis7Xhh hK={/]k[[7oљ“KhNkfs[nM݆-y|Ѳv_6b8((P(6WiiiEeF(;`cY6/?beg0 +VkN6 @`h@+;oAxX'OGE)((t=zx'6ёC^,=5!nd4vtXvx}ΡŜ.*(9mxoͺͭ{&S( J@Vr<#pȼEm!G7~*kǰ]תwބ"@s-ő -9_Y8엩;p7g7b Ś~ww'!GFF7W_.~n@D2b6vOGh~й0,8f7lH$CܱwH"R85~c?14fvz_ڡ5>NbN6q> UTVjusA\zғŶ?lٮz>ݢvuh_G>>O"Ω; :y׉Ngog9q"~37w3| "E ʓEװcVS zN`nq(bNhsͶKot[#aZPS7ޫht#̈mu_¾?OHHhWWW;)Sv܉]ׁ޸BĴɸVYRsD9b-[6lٴiӱcZӧO6//xKD&8׬c ?iiہv]4{@i?=\o-!4 .Ç{K. fpl۷UWWF"2 !!!DIJl^^Jiii:ǧo߾bbt:TT*(''';;[T1:WTT\p{~<<<,K4 ħ7LGϞ=%''8P*6!<}61 6$pgx C#V0 ՜2mx֬Yƍsww_z_答ӧ B/rҤI^xqvv66ltR>}?~w;| # IDATY㣣[ooܸoټyܹs>o>B|GyW/\o.^N'N8tN 4ȑ# … ۶mϞ=[QQ/|!V}gΜټy3^:33s7ll[ӧϟ?_?s,oTi,^pԩS/<s…m۶&:@1YSSCD*=%NϚXn0?~ϭ3N7ef'm0"Sn{M0Sn?msө.CcOu &RὍZ0޽{;@ (JRܶ-`Am!й[u:3b]L;ڷ!1ke (vТ&ٶ*AvbհOaZ?]2$QbNh2ob΅3;N|.zO:j37 ıM1mR. :7&vMnlv qtȹ]9EX;v󉵵*Uѣzn56=qQ}>+m&Br*8EH9 `0xvUvv[ ,{g=n8H #]l_7Gm37_\33DNŜ-zP @veW|XT\OW4>>>F 䲲rLf322jROD9ZmuUuddX,]؅OpiNVɴNoHwQ%1vV߀s6Ø0 ZtF{=ԓ 'zxxxxxu'^PTyWdD?<=32^{cO$Ըܤ8Bť-<ҩp|ō?s2QNbNhPʶX{j(DIJ܋/.\0+#3kOܾ+Yϭ|by~?8u$J袧 cuƌYi#u!( g(m>_l2G*Ϟ=m0l6[jjIFD|wIDb8:67i!A2d-Un0Q[ޒ 3f1'@+kMQ~AA@+xԨ^^2' %NXl6+c%jvҳN}ts%c@ UH:Dy+//?>>ar9WctNϸ:W'.StzĬ()Ӆ]bΫvG2 4(88[{=dh;mS&cڗȼN _|5Up̙wI ϻv+ʾQ,f|\tnmk^͵B<59*q7Т[ 7uSc޽gdd~mof&,\ZTwe:}@{[SStD@5zկknz]N~}z {Yx?>s&C_shE㡔ӗw2ᚼRָFltWt5knaC_X_NO^nëȯzB !jTVTJ$bB`Fn/JKKe fnْS,Kdd}R\nX#"g;ӞjINNQ*U=J***P6V[v ;G=zdqqImmm``TzI'/~tWUU*Ϯ/>ؾ+} Nm&+ݹ)x̴p:LgKzs+qss{v媓hh>7g_h[]Xƚ]G.oY㸲~YY . YonX7f("3w~TTN(-͙;_)ϭ|f 'O/z|iFSc0 2xw=}C:ҿJt $h0,i-}s;Ե=pf2-D\1' dX23<Ҡ@"bYv'?tO=eGfθߤds>~"U/~dq܊gWM:eK+V>o2%&^س{'~g_~}=rg{G̟7g}M|"{V8fi 漊FOHKKl/]jpf& h"kNez}bgYLD*UdNMM߿sόTy;WSSS\\\YYOa;n6~`_6L*-vjca8ʍHU*˲o]=iST*`(../i,{?:uTR]]c: 7$.nhgbNj0,kV맟B!˲z}^ddDNmj5I@`@jj˲dq\V X#8;y!B٪ժ׬{՗jk~~~ks~o*Hݹc{^DR{xΌ{WUVu',?_o׍%sNzk /"beeYU9I'\.-5jB\*l]hRJjii-ŜYW>س{E\7Ϟ=8DRz.c3(gXsn^=ۤsڳJK4vS_H$dYN `Ξ@Da=BS26[pFcS2JKLfD,V(|{ RW16~Y,Vm_4bWQWYYl "mlH$o/n t:f~-˧pΚ9q٬w@4T0iEV@;s&15-3RRJntsrRIUUuVlaa݉z}D"E9Z]zz֔ɷI$b~mh4drd&"=((б2C<|4^zVaɔwߊK"mghɤ2l2r:wL'TͭrV1#suyylnpl_fm>Trݰ]RrZQH$ Մhuf9;G0"HB5!"QGꂘ 9GTC5)@DlCٳF{27l,W@t=qdfdfP(.KF;`2=<<1/&:2"<5-sRzRiSbсG SDkڤR}/VׯLAAQm].W*MHzzff6מ Oǎ'hs Ba알CwaGk"RIDS&F |:}j4q|c nfugfY*7 tןN4{b8T-**!PM?1g'8aΓ+Yb^#j=݈\ $ڨq0 >{*|3 )uR 2H"V bF "j"$"T*!¢ sT"H$ٿz<~S[ZVID9ACC1 EDf1aڋJ,d2PV3 .w'"0f?yZwBm˳1 sf6Q7pX,j*==BaӟLC!f̎dK)Jz%bt^?|FJ[*.,'8//@q6b6Φ,>Oo" uqlf㸤Ԡ@o\a4H,3&n4H&K?"z_U#\}KwF>/?j B!1tG̵8aH(CP6WSr(H8㈳'kz ]M ҭ_%E͹` 5Y,xsv_f(:Rs,YB{&YbPBU{]qN./tsur)-+/-+#"“t>aa?s>Ϡ@??>MP`3Y;H2ٸO$t)$Iܰ!*G=c7P'&=zG^Bu<Օlr%Pо C*.|^=E"j0#hzif3 /OC)$'_UfM*]_ ң&+;l6WUU+"^eK#<"*##?`IDK,~t# $q2[-yѰD&$N,m|VfsH,Z,ryl&*;qCP$tJ[m'j&4fz""ZUUCA?5z{?8z#_ط)Fɇi|lqE~qOFG'._{ܖJ$R[ 0NDfD3bqRI'' {n7ӟy1M")h3K$Ĝ@pqnǡ#F `jumlРĜ-lq]]AbN<i"t:椫3,sv=qD^-<c0q,g8gQUUNn!l]qݓ6#@#ngdtzE}@ .v~"  4tbNpG D4jx  %|u$G' lMsmd# \s xK_N.ARsq` *1'@Y)ma/{ZFٳgiNLD-Zj_.*.pw.c)9w,((0?R.ȿ,*.,\̜qXbؿw}^Z0a\ϭziqǍő 9b V_du3+*KeEeAAD"V(DdْS,Kdd}R\nX#"DTYYr=Ϣ"oooT:ޙ%`0L&___"5VTT˲EEJ3[QqqtT)?b IDATL&8"Oo?I69# :+?v˗_?h oQfV퓧/j;#G)̝ʫ'McΜ=gao/3F2N f{fMƌ$Oc0-mA+}7ޙeeF DTPPx!;;e-*1Bqq 2Gxbq̟eԴ//o]IeLDӧMh"ڊ ~h4_M;9nݚADѷvK2dF&T#Gv[{zzzxxQO?%~4ˎ;n[q܊gWM:eK+V>o2%&^س{&M|k$&^ѣF*׌5! \ۉ^':sS+"#z:}FPyh''^PTz}oHgzFktԚww󾛛+W Bo/V⪕Æ q,_o/s3 Ŋ/L6e)s>l/|=T_=KqC3 qww?tPs2ٲe_PPpYfM6Og_2Mo5}U=9T'&^9bxRRrRRJl2SSSwgF'N?fӮ{fl9PQQj,wD<80bxM>sŋI_~~8f̨nͻ߶ fdfm'oC_ymMXX-?t|ؼf݆ }M￷٧֬[o4K[/^ĿuaC'!п_qq^GDgΞq9":{ܠAn<yxsرw{o>vX{ ZgMsyw(11qǎ=z4K.1 %t:O߾}ϐ.]4~˗oڴ_T*{_XZZjXt:T*U*ɜ虘.ߢM ?0˲rcW$ΜqKxaʄSfi[q'|}}=jkTUU%^u;d5̇SN3={.3+`0l4n͍-3bqttmn.^xGCɜuQ"巌ߢXeKS&s^^z}'w.l69N&tyo~λt)+О1cعbŊ 68pβlm6C=t_{9s9s毿ڻwoQQd;j(ٜX庂Y[u.UcРǎ9rlqb ]^Cl۶]@s}k/ٳg``O>;'===))駟<3Νt b{iiiD՜POZ>pƍ׮]kZϝ;&Zo,?#16z8lO2|ͺ͹u挻N9`Ʋűr[# a.oP(dYtzϻ~iAAn|Q.q'g;ߓnv9z|[OttXwbcAm~p |dH+޷vرNl;ugyCH$"*((Dk)j5:t׮]믿nݺYf]7VKD*NNww* 7qLVTߢl:k~ؾAwT~&_P}%sSN դ^lƲ%/>=x˘D``ȂAVmq]O3swޣT} :y[&G޽{(X/&&=##G"ݶ#ĜD\IDJrkBBBVk^^(fee+$wqu .nqԢR*uTܭ:먻nnzeX++7\ ѣG=r-[Fݻwo ٶm[FBBB "cZ!4MkN*Vlr% B'K5U$S&[\\bmm+jOָ !sfkW<+;[bdTv%ȭM=[fg+KC[ltRZRێ;ZYYx-[du EIII~~~ddq<~zBe&%%u Ǐ+-+L_ahhhkkSd {;WkIQԞ={n޼iaaannsNBHjjm&M?7nܨgii9|paܹӽ{wBݬY<<<{=bΙ3̙3C&vPzئsU9-***==( vdvrrr?.:ֲBVpppPPP~~vڵr_MǦ^50i7T;ћOk ~N'%?qrqG(w2k"' Rhkk>XW/"{m !"QFz98pP3ϟ?׼;s\~M|T*vzxxX[[׭'N}4o\>&=w^m*0zժ Ҏ'7ǎ_v/Ƌ7I8 !ݾmID+M=k׮%7j]veJIIINN655uuu՜ "**NSUqqÇҬhDe_k1۷kp\˼<̂BBQTXH$6勍U( hN BB$HS2226trXiѱ&l=J"66R3}QQqLL%[ee2i\SkkkڦP( E8;iV],I@ :X;U@ye୺Y.Y|Xd!pؗcǎ|cbb\G.]211 `A9;;xyymٲ%;;Ĥ|:/b|=lmmۦR1}g3 !Y:'hcCmlkȄi<(~#6מOk=͈BvGnR(*jo4#w͚6nr@ y3̚ݪrw_3g P/eκ%͛7㏿Kkku֭\RT޻wOSdرzzz]%'''<)>}zu;vk5O_OΎ)ATvmcbbcbb,e2y||&4mdDZ 7nުӢE3aaӿfaa˖;~ݵafgӧW&N٭kCCPyKs!R,7'G(j_255Z135Ω0>';hbennFζx-A2JN.;Y?jvԱQChիGͻ#?//ReccgڴD{QN@.y<d29v#~_s֣^p}ajm6gg;vL0!)))$$=>R:%%%:Tv¡+Va+++a[YSY:СB8ۡ:u/^_7E m077/+++(,dѴLz+55sg mPTYYYl/^B,-̫+^Ejħњ5uP]U>pj1k^=i8r?B}@39ߜYVXrIIIiҤIBB֭[j9;wiӦKֹm2 CӴU[6W~@Vߺٺu+B:::M7V80i <bgg۸ ;6oVݔ;))]xW>plҤ7-]amhݪ f+J{|uAȨ2Ju[MP}డCj2cԏ={t>jJKKٲug; @jSN]f͎;&M4k,B1bĈ7o\vVVVgϾqy/ܳwMw͚.M[/ skkGV633ˉ^VV7hwO?o_kk+Rٿ_{VXĀ3*f!5+ޭ0\.7++oV~EQk~.YT*z55"W[U(c!fimp woN|>CFFF;U6uJo8k{% U^Xegg;99q8*xСٳg?wO 46\W/VMgd=T0LZzB~¢";[ T*SR%WAŋf5gYLMMjY\&JZݽ>{YYYٲuVukz/MLO6yۘi}O655# N<Ꚕ|E B'5L@ӴͫH$5{Turr|d<6UꊿrD .ǎprrsYv#o!pqq 066޾}{*n݊iؾ}6@rssWZh;,~B>04Boɇs/s~_DM9{1 r j?jU֯Zd,/^//9u܆ _|XG=,/ˋx}\}99X[b7> ] SS_|`4|s~hhcdd& ?av@ P(4MKMJKJ+9gMLLͺv%(p88K,K+kT*16q=:vA5@Y=:ywKJ|y&!}N:u=q&=qBphթkLcd27044 9u}00E"qii !i|B eˢ99B EA~ޛ߼PTffQP(T(l^&* JٗeePľIID+yԈ!& H#D70Dr}|xvq2;F,I‚|"d>_i>/U*W jp1 4,/?Ⴙݻu+bC ګc@6Jޝؑ?q3bcckd\XXـMij{,]aggѺUoW#?ʪy ***ׯSIilJ|ݷ5}aMYS[^^ZD>(ҵE~~@Z^~ɚ,ϻwvvoݺR*:u*.*7Jϝ=%I6koиqs'FyW.V9>~5سgLl͛ǣy9R[VZF;oaXѣF| &;mqss}WMz;maG._}TCBHs2*55"ngãy_Y; +/ rηr9zMQ%akYPͼstsΜ9WsIiȍܜL22۳CTBtxTNCwn)ҭWf-DF܉~i|,[xO>i;|(;,gT?䲽ܕgddԔVSR_6pp_z IDATLV0'O%ooAڴi=~ج5ksYok0iiiVVVEUf333kš9 B__O(dffBLLܷ{tg >z&CA)(({jcc- *T7to11)mo*<%77OTX[~-km>CCWW&ųZ~$Fi?@VkGϠZBԏ?Оi /0svǏ& Մi?vP3RB%r[ﷶ-AGÍy >d2MӍ4,@QGBJKKm$::>5#?bӧ N=v11AFGǰxx^ܒdN^5`gooA,ͻtDۻ@llh7y?͛7~rgg'CŢbBȘG-^4R%;+P}޷@7r#ˆj(&6nϞߵ{/!5&&V3'Յg*/R5Q7ԼYְ͚ kTfv[|PPP0pυ?.Y=w!Z~ol/lN8RడC.q2mSk^5aƆJ&ʴ;99ng8_ε_$BJJ !{hӎrB,R?.^ҭy˶;ގҴI)'+++;~BttСwnٻۑskڻ@|HB,**NLLqbeeYe3|cbڵ\|IͣrvGg]Q#!q3ⵖԻW@|EQrrr !gΜ#Ӌ=tekks؉gΜswwk'wKKK EYYEK˥-džTs`Pٗw@*VBڶwm_lmmnߎZhoU&MR046q|| !X GҰuͰZ oRSN_PP0y҄Y3:`7 _M 2?N<'9EY]l>>槄?.^zeII͈[ODwuuV_kpxB⟜9{Ol>Tlzu&&?~um̴XL8Naaèrs*àHutth7puorimb^~~{Iq_;R#(Z]djտM<.P DTJQ 8BD"!!D(Bx<!D&Brrr!*re&*ӨQCBX,f_dlB.{ͪ+[]m4̂-(^.fgg>ycӰu+e xL]Zu4BQgZ.)..,,2 d-'CcKٽZg?915;Dc.CPD޽zvWTC]u{No,⥖-? \[ )T~}G3o{ٺ:y #n\ BS<==] }⥅H$2ybuTWvyڬ,TfggKѾS3Y@L&M >Y'|x<['-Л `rNSdT g3a-gDJAԄ)ZMq8O@ ><ߤS%/wؕBj6lE$2+dj5C_``BqEY1(utեR!TS)Ui.SVt%\]! K%\WɥiFz"OGettvOPKGWi"sBylMJRg.WJ5EU(4vhSFBnAaqBRCdP)+o@_|Bʴ =)"h}c~՗z{Nɖf:;ڧe _ϸiR^ng[؈p发/xB=qx%˥ļƄS./ֱM[H"--V#u ͵sQ@ /IF]7e,P"ڤy/7}ȽsVNnFfq]:U*9xj#g9~詮4?+6j]щ3iVR:4EgBtFҒ|F η8W iBZVH&n.ƒS/=Z4srw/Rӗo )*eDp](iIJ! <]BX!+ D&x|E iRViXb)-WʥjFE4d/2Փ\\F xB}M+ʊ*EXB'jB{!BH㥥EaK˻u}&Y"cf-EKB> P4U%SRMTJ*cT*{#g\>l| jTSHG ofbLWV4 |hLyvrA e9_ię~|L$"^DddfEa}lF=oټȘdV pzj)/R_qygݼڴh~?jme.x%"@R)Z6somcޤ[#BQ;0v˃7@_,&>1$ئ,?s3\<|@WsiF 462v+qR=bs{iia#kIwFe_&|=Po[^]j^6-rr tl;y%y3mr[K+?|kma֥k匊pkYqe89nIsi{l<.#6tNYJJJy1%h؈!xOD"*"(<<6ڵȑ#>-yxxX[[c}ց7?B*B^?aGd]JKGϹlq"s/g,|LY^Ƈ\B#<:p̸VٙՁc~yM6_-/.h؅M875#+qFvȥeM5*Eꘀ9g-[C/ϖ/]+.)Zȣm-mRR^~B7l5l -7u3eάū6z`61 5ڶPrruu}|/] iyIAS;KE=qɳsĴ^(7ųmR^dR G{.˪HNZ"*EePW_]ywHHСC>ID+M=k׮%7j]veJIIINN655uuu՜ "**NSUqqÇҬhDu+As40BeqQ4 64p~ص[m[Ң[׎mna.,"?3GNs<_PΰkB㔗i}HRZ[BR _d$#!( Us؛obl$(0p"FtnFrjfzGQ΅YnDB!a"Yif2S났-ܲų:65HMg#>ܼ3BBX( lϡfvjѩT*,:XRZ0:.hB E3KJhaO4g4EK9'ݴÚ$ 6GGGž;v˗MLLΟ?/H!=zt钉ITTTppp@@4ٹk˖-&&&CYPKa ~PՄQy荻îHM7DR*E1K |]M2ízQ\AS-KEE3Sc\[i*7-k۪EmZ(p٥Ewe蛘=}wPB ŅkB;YYrYYI'Oڷi4i޲r4/G;3T(Ej5Dک)EյG#O97եw6O~K̰k14'BRط×[`okeZ݂VH)"#9sYzuNLVPPPZZ~z]]]///velllCC\}+22zzzG;vɓ7ngϞVf&ePU3*R^S3@uJQ֋ߋz4)Y.։ܼ|B}\c/GFes+i:"pu"<.,*4^TT\ҾM˿AJT*Ւ jWu~`ŝGE%v6v61 f;x\TzN=!ޔ1vIUA)p8BPCVWo] ǻqvHa`ׇcE5vuqiP>b=!mUF5Q)LyU (u<{M!Z}̓'Z69igcIS͛<}ϭmLsuO6|菰k=tJe4 jُ[Fݻ g,Z9gO2`(v.W``lqY68S4-.+3mB.#jC$jMf\!D{yͰPwLLȥjk࿇P[v yz&M駟N>6;==yN#\MQ;2++K,+(;; JKK7o|…]cѼljjJӴv2Çք؂O>kOV^^ѣ WlJ%˛4i"4n+!;w3Bŋ{}#G|G"Ll&@s'ϗJ,,,4Ö3}M+WԌԜ. 9᝱Q*iiiVVVgϞ#PUn={RPP#NLL|RRR=0۷og (š@ c˖-.]i&aێ;+nݺuܸq愐SN%''{xxp\aRRR4iuVm؎;&Nhmm}ĉO߿B٥K3fܹS$p///uZ]x)b V-?ر=!$+;[,F^ N>sK;;DEEر>>>T(ڳg͛7-,,vY˲ٳ666fffƟ˻wngg7k,ww޽{1 0`@]\\FaÆi޽{-,,\]]%̙3+tq7K/fX,jؽx?01 [[ ?q:4/''G&22ӓ?bkz9Ν;vssJOO(JNhuuu5j^r˗<ښs#  wrr>]gIIm۴+\fMRR>;2""B3SJJJ^|innMT{Ε8pםkɎa((,T*EE<{pjjZjjD"qtlyNnnP(T(11f&Kik߮s5/˺8I$f!Iϊx4u+(\\\*755tMT7|>ͭib+V_%+;mkvF ]nEn߱yΝB]vD*iyeL nߎch`5a?).): B=01CFFFIϒW@9sܕ׾["R:ľ0`1cnݺթS'l6[?FPY:vlߪ^^]5$̚xGּ5d 6i|%}=={;;vX T([,ahr FBx<^ΜSSS< zfLL,!R&7olԨFMr"Mّ9^C׮vL~CΜ L<5##[."0''W󖩉I-gԴiIha3|N' !4MoܼUSEfom!!$??_3&// .ڷkkmmKBMQ^x~Hf_)_hJi?pUTmh0+Wl۶3@ P͹|j=<;jnsg|5Cv /_Ҹ}G[YY7hoO߯oujz~Y{TڦWZnbj5C;s\`WWWkkkSSӻw޽ s}}wKҌL sZ?s5SΛ l{:uvJi۹}k1f-Z4uGrՊa3Sӭ[6gdy 褉n"%]]'N:;;k_B 5+WN&H$[mɛB(:96dee-srNF#}jA^s 9' 99'X` %iW/b=pm-  wp Ԓw7sk7!AFQ70ӦN?v\1rNN^v:"$YJe<O.knаSNqԩS/:uj9~݊1ڐSd*ӦN߱cG7oܶm۟ŋsZb0 Wf͚G>\z? 2dŊڵ[reǎ?޿3v=rNE޹;c^]ܛe欠;w7iӦoܸG?s׭[8'O.[K.Q׹s7oj偸@~NJ]~3h܍6eee̝c ̭OS<\ή>ou̹~zӛ2yt0@1qă1bݣG޵k>%`򙐳-3ŋ=|aÎ=:lذ/l\rUj:!YFFJH5ty0hyNV>;;G'Nx666'N|qvvU+x!g_999oռySsssݬRJo6l0dȐݻw9r_Gm?tG/_Æ ;vĠA=>yBV'~{Dblyɂ"D<'Gw^zb[zzzn֬{[~I۷kp\mTPX\TмY!/_:GKuttT*ennXO90yy H$F0;=èrsbrNe,pΝowwwz톩IS *L&۴q] 7vy &6nOkBC?~R\R'>t@ }弾0|aCTل622JzzWhx'֯_u֯ݾ ;:zE^s#ع.u|o~-dvJJe||B߾}BIlǶ͚K.7n[3z$!3!' T*O?~}z&!d7K-8qEQS6Ϙ9g֌V-9;d̫2Z='hA F 3w~X$)S۷/~ [2}vá*|d}}g߿[I^~0.y9'x,ɓ'JڽYJ~aCItɓ~1Z.B &MѣGǏhƣ0 }9>Y% waQ?wGR 6Db]cMH$FEcoػb/" iqw lz|xvfgggOCCGDiiϟMerN񓜜\fkQ,xupŋ:uqݺvIHHLHH4778Il޼yԨQk^0af7#(D*Bp.WU,sԉ_LOQU!&Ms NBBB&O\[Nu/ytx߼KUk+**H.?J=|ӦM;p_8vu>[^ֻ֣צ)#l|C%/OaB"$Դ⒒m4-YٙYiQ3_V]hHpN{9bĉ'utt_*--9bDϞ=8hm5,+uw*,,~ ( ٲ;wq噚3?$6o޴cm9yƠSFZ,^?0ߧݗY|>2Nlɹ_*ӴnwBEG$;vtU\TlݺdR\طo/&MSaD4+**}%!@ Zk.Yt</'''$$dU{\dQmݽZJʫ.X2661CH+븯S'Ըlblc\&MtqSo۷|r}&zv]1?N;9vD;|@ӧOߺs/s= ]1}w |?}YP)d}oŔIffϾ r*|UFNMMMWGs׺/Ȩ]}4'bNXA8>enn&J$:J81'@CګFks_w1'|n@z:s1'|,ϒBN@ 9sbN@ sbNש >:|XDddaa_t䈖@ $ɪݻh⭿o311˻xm**5_Xp'ʶmz:͞6uz{߯oirw8x@q@ Y_ (3>^[[I2eѣG f?oI>s6''q*(br;u$"> yyyP 9;Qaa=R :::Oh߾]Ttc/jܼ[.˖.VjjjVUU%$$VUU={X,涊L6XdmmejjJDS^iӚ*]Y1sb533+33аYEEEIIO-,|y5JeUUU-Z}h1'4n[t)p&''EEE9::ڵEbj|i:Fӿbff6}l=]]T*~ߺeLmqkFZYZ40߻wRh mL=~2{I~m)9lAʋ?uu펋s|`[,QXX_hh( 4hm~/Y;f4]xV_OO* r>xW.\,/ܲm^vX,8xK!ÇykΙL&9kޮ]{?y)&6ٓzzߌ8K7KK ņr|ᢥΙ=nܸp[7%0W G̣DHW,x6ѱbihhCiiϟMerN񓜜\fkQ,xupŋ}TKÇySVZ S033366[. f"899|p#CC\KKK"ر#soYf kۼ];SS|A>QlkjjBDytut.rE"q]j>eڌ~}iij^"2167a[=C{Ls|`N:L^fuII ݾ}vvvDTRRnѣߡdKK {RlӦ-Nq8LEDiiGP~3DtԴ}s]\:Z_QQADr<8:&Vj~}FzQQQ[)^ IDAT݀e~ŕgj_Ϝ:1'۷]dy<^NNNHHUztɢ6ܻ{GWmm]>'ellTc6qUܛ5 b LX\Rbeiᰫ/_f(=u"[˳sr4a@ >TT~aidTVX^PP`1`ǎ_Gamq\[fo\SSӶYS\رcGg ݄cyϟ>A9r9 >|ګnr+vmXgɏq 4yW uzĜP\ F̠_s@2sFu7mhT؎ՈF@ Q#2&h<П>, JJ)'f<5ߴD}NKJN)ODue붌2ݿ/c-T*̒ɤuLĜDD%׮ߘ;gsD%%DdddTۤth?gKݻu}} ZZ5*J/\ jٲŰ^:S{M 77~oۛI0bʴVΝkKs>s)C._ґ|6n577kժk7 x;hT%yW)'"RN_T[ 'O|SgDLVM={eoNǭ444l֬)w욚ӢJQq$''U544T.dͺ_KJΝ9EDƎ>cά9/aXA.%"T&LMMKJXPP)U&%=Lu:Ar 6-9thQQQ۶mztU$q?<&&VSSs6:իeK)%|~U29lR"}%2\Nr9~~wFDC<,((lEjeb|ǍpՖ9[x郇V/ ݩ'f͞®yAaa&ܽ{_Zz_hjE!gϞiL||/#""<u]H twzZL=~2{I~.]ue_PvС=b˳gσus_==zÆ99r!|e"i\.'L.T&H"#T.e2jӨmS4iFRUU=w>xqLBmsfxD$fΚkI~N݇w54ԉϛv7cFMUUU+'6kT[[g皟ﯱظsgOFDD~3n/,--ybRu\|̲ 2LOOO&>~V__?-=P"X"(9)ֶIC\6ݲeKXryfVVfFqS4:3/3c;vt`ЄD"5D*vd`NouW]٧Wt{CC.]\׭>捿ZZZ<|w~B._;֭[D3H$iS's8ȨWQyy˗oD30 _2/u޵{UUUGݢ={hiiY,.kKK;*/\$]\HSCZʁkffv޽yuƕ̿>KJJCxYԩ7ctuu(>r!㾙;ge?-7ܻǟR^ а{[WPx;a^200YxC<VTTtNvVV6 :fLEj)8k$[̹cCciέii&&:::gxs:4S$zX$23ZKKK?z',q}۶rbIrSL̟; `Xq?o΢vvͯ^޷o着;w+z'|=ii}wv,zm```nnKDJ)5mjCDZZDibbBD̠"H*Ι@y<dbbҭ[{ghC66u9qb"H)8kR),zVx`ffBUUUR-Bo|all5m ¡Ò|ajjXgH,))X\ub;ҽ{W >?#3s%^^C3ㄋΠ_~}D"vONx >;oihhFy}"b|~S X,EMNñKK.kk۬u Yݻ׀/KҟC!jjjA3Å,__y?uuA0}ba[`^VVsSLYbl6p8wx7* :xxAj]!,--vl*241#5WY'N,;9uǝL)OCC}8k9ŜcYTQYT`z?55fM=ۉSUUmjceID&F3UޠN/kO4P:::n>VI$br;u$"!5=}lXؽJyŜgsttu׮^YRR*˔驩jjjDIIO-,|"T*KLLjNSS7_84n\7Mec;v9?[noܼƵfĤdOnk.**3}Y'M /&Oa R^ykX]\:kjhnG2s5CsNϞ=qC=m|vծ6x@J%8Ukޭk":r[&M WcbΝ=͸t/\}9gэ.^rU ^}7w(S&ϾQ>3kI> &>DTQQyG*^>KOO:jNhXfffll\]D"qrrr=ovm.>@›4ibY񒱑bH a[=C{LVl޼p1Sg^=jӱrfv޽e2ٺ5?~^M֬iS\7ٳG(zxx 2a#G?X=~QK\訨(Pd\?k>y0lrgrssii}ͻt^ƿryxCTSVDD 5owÆ>=rss|>jvvviiKXpΝ;\?ʇ-WjjݺTٵ>#Ǩ-q /[c.ԱԦGB;~޸q#YXXL>}ڴi ~S --sJҸ8Xloo$[.00… "//O[[">>iӦ֊b'OX,V6mTUUO>׷WNOsnMyU$,+P_8tX—/3LMMLwlZ^^kԤ 3Pw\. wV~ژS*޺u̪رcĜVVV]v%:ee2ݻCھ4ewww DennND/^ " "rsssss۷o3futtp:}l ѱcEEw6kz0h/AG9gl xg|pcǎ [fM.]ϝ6O>sݻw\.}+DL|"jҤ ڿAAy3e>٧Ozxx9::\d˗/ѣyZZH$jѢuttd@e;;/[^waD..D$JZS.((IIIVS^iӚ*z9XvmUTTT&)驩ն;hh1h)e7mA#tx>ajjzy 'Ox|>?77Ç'((hҤILAY@`dd9===u릪efPP7ǓJ666ǎ#Lwww---== YYZr8B"Jyb6 E׺v'"~m۶yic=z\ZV} u"xzT$uS-\ckW/^wCoն;hh1]4_1,P֭ⲳY,g׮]bUÞ%AI)9Os7-k|I,VT:rrEK3{&ݸqk%n\eɤg444l;o׭]%rRa^RZ`ʅ=}|/W:66>sGnFo4Az"UfywL?ip:mmVZ۶jjj[~=̬Z ͶAkCS~V*ET%W{U.'XD?lY[ ;|޵4###66nтy Ddnn&;thOD^^C444q->>Dr:0ӟ?O9rh?S$ ~kfss9R}ODo N:а24Be"i\.'L.T&H"#T.e2jxYtqaa_O8fnۡ^1?Gr}8\H$&|A>144dMMM(O 03 9ceK?D}&7fyȑϟV˖- аG.// K`ϦM85i.~.ޜp} zR+00p޽w s⥴;w}:ݾ}{С͛7/++suuݾ};3}RRa80`O:"w(jjjF<,ؾ<;'רI=p?!>.RvJŲm gwamm|&5r)B͛]]]~A&1bk֬a^9uM&&LdɒN.7)}}}W\IDϟMII-֘ 555m5}M*{>s۶m۶m#".{%>Ϥ7n<~D"DGG+6?~۷4;;(55bf͚DDDdeeUYY߹sg*Fb 퐕;)x>x~#sΞ=~~EÙ1 1dCCCmm\&ɵ+** '+^|f7H#b4*3gml1vϞ=U٨ՈF1'x׮]͛7߳gɓSRR.^XTT̔*J( IDAT.++xDHdwV>F'hgӛ?իbL&KKK#gϞرZ[[{مiiiLM&O>s D$oݺ%J?UD"PiEID3f(//߳g󝝝۴i3p_=|P(vss7nb=x`EEkժy>ᳵAAA>>>Rظ @ݳ/_V^-Z+[[[zр<… -,,ޞfffeeeup<:::**J(.YoEEŬY¬Fc"5j;jРA'OyĜo c'''j*%%eժUEZFe…Gx!ܽ{wlllHH.3W"n,--}2=<U}oժUDHD)))ղ%%%yxxp8## 0"## f`` H*++Ϝ9Ӯ]gϞmڴСCڵۻw/._(..nе_\z-[ˋ{,,,VX`ڪ!Fym +WOh@ P999~3fS}'9 6TUUI$m۶1[ݫ徾ϟMIIQSS;v?M6722rW\Q~"""bbbtttN:5~iӦX$x 6lux˗>FĜԞ]ۙvm;wv pf8:++x}};w0,X`kkaiiz!Ǐg۷oiiivvX,Ν;ф ^8ra\]]۷oү_ahhXUUqÇT,1sw%QD[FK6fEL&QQQQtD]c̩ +**j,Yx5VF9,''j8;;oذaժU<oڵ#GĜT@7i@ߧOiS'AkkkL{n?vzD"277'/^lŤ\o[,'Ҕ-,,jX,޾}1ckhhh̞?O1r' nT^'>5O>s D$oݺ%J5krJ\.J/_ޣG&377[[-W={233ٳO>iiiDre2zbκ:rȵkO<~ĉ .DDF̚7׀UT>AAA>>>R񸠠/=x`EEkժy.((<ٳgDpK.ihh>"ѿ[-OXXإKݺuٲeymtqqwww lT#Tv_ߪUKΝ;ۧvu߾}>>>h IӄB!˽k("9'_i@rN+̂222LMMQ|uqqq,Ke׮](A uuu}ڊUοk.ں|Ű@5Vk׮bʊG ]863qvUUpvRRRLLLe==׿O\pJUUQ_?Y!mmVZnff1Z֭R 6mcc^1ga͛7M9RDb;;eOOŠ.\]]?9Ria3$>7yV$ m_VzMNצMiٳ75GH$>>>&&&˖-Pwx'|H*~7/^rb>z̩YU!d W^_Ĝo'N{ѣGe2Y~~>&x+uϩf_ǎ g DNVYc?t-Yl"Y<&0 GyӆvȊ8^h1'&xBh欹-ٳg 8B=>$]y?\lh,1'|(hh@ =~ĉ .@YEEŤIZj_>zm۶Lױc>9:wӴi®]:tmw 9|+]ZZ'П{dRSS_oݺ'OJJ ~zyyy"?l޼9'Ģ/BMMd2b,CCCPӲeKUUՊ lٲ"Jbvmըoڴ%XզMUUUEӧO3221'vO7:`ۧ"$">/vu1440..رcϟ*..ӻ /_SEDgN222֮]ĨDT^^RYYYmIII()) xݳZbł (22rذa̙3ڵd#G~۶mɕ+ Ml-4^>_{_p؈KΚrSgCńBmۆ OA|||\\Ç-[6zv%%%3}2GQ\\| &۽LLL6l0rȡCFFFFFF8prwBBBXXخ]|}}_vKHұcz{{>zrѣG/_~իWcbbN8bNקe-ZؙJ"hC2vX---"ruuD~-$%%1Ǐ߱c:thʔ)u,<555<<_~VVV?~}tuu>x3<[۠?qR g544|khCmۦWOWEcbb555mC# _Ztq~}?Ct!iiOw9>Roȸqm"WSS`p2eNڦM@p޽{ױ/_5k(R\\\d29y}̝;W(2-|-RܿȹgϞL":{ӧO=<<5krJ\.J/_ޣGss󴴴d"r210@9/\JOOWZYY]t}AhڷySj\ƆgjڧwO"JLL:xHbb2>|wNJlNwncjȰ1>__X\\-EEE^C^. ~ yH"}Q;͛>{Ddfs"jݺ5|i#7x`uuՆp8aaacyzzvMUU5++k˖-̽͠ ooo'Jmll1233ݵk"<}lNNCfUSSCvH&O͘Æz7Ujʕll$R@p?1]3̌W\T_>ػo# 5+W'w턄388t6u򎝻#^>pxw}z _/^es8sWl6_ elv(j/6ܻks]\:hkkFu*]\\vRYQQQRR2uT@rNyxx",88,##T}Z...)))|>_1,P֭ⲳY,g׮]b::wIDݺvYtbPC̢bIUUIqINN.-JZS܁,((ԬJHHU雈RSrrruuuZc?XNݱ9j{9b%$>H(&&% LL/5VsqK.+VgΘ,̘>ѱeee̗˺͙}}3wLss~[6o011w?xsߊ &CRƢ*̈́Y>sYr_-^kݺ;ZKv555fefffbcc!cj&M>j䰑#+'޽/-=}/lanuʋL)/Rյ;kӦu?;ŭ?L6k蘸v 41ܷg'XNݙTۻr%}o~Ĥ/5=xYVVrgNGxpWOOj|FL[jnaM/CGfeeQqI򆝝;)~VM&ijj2î0lDb>_&&&ݺu w|98thjcSBD$T)RՑ5sZaaWE&&ƟL֭[ =wuueOsK`ǎ]cfݽxU./\}9gэ.^rUWllܥg9*cgwB> aj#j()--W-ZtףrM:ox\`ђ7TҥKCC2jjj[tjyԸjuQzrR{=P wmG^CxU0ՅBaѫ"P3(CCjO[@}sZM8ѱb544Ifffllܢ/D"qrrrhM'H𥛍53*Û˩üiǻvq 433bƍsڪ0RRRAŐhkkD".ˌUήyll\1.*һw~)4/bڵ:a[P88Wm\<[ۿe6##4ԝ"USQeHCCC1t޽|k?k۶m&fG]]}O$>}zUhi>{.xS~ms;6x\&[S6Y]wZUUuy-ٳQܼ\ 766"ios >_h;poyyy"++K"R~6кg|H0X=v T Ú+֬^nS44'Oh,Sc㚺? CFH0D@7R.jE.``[-8JT ŅUWh OEQ2M_<@"*z99s9 z~4dӖ:BD"GE9{;;D`0#]ӏq7nZQYYXXkwatZ2t-+TTT̚n ]Mks.웵uc}pPPchS[KJJ?_X]]]SSۢkQw>dA׮yw⽤nݺ5; x7vwKy&nQokx~..}Bkkk%z=zЏ? w? "kd$}K^;kQv`=XHS__No?1dXƲ+Z=r.pv~7""|Kݺu0oae&i};-t\ 'O ݷtɢWށT9{̌زq̘Q!'<RߏRe@#jY)|Z۷|MMͱcN<37} MMM6M8q U9s&"9'CVmEY[[~駟VtR///cQQQuuuj<<Ў9'@t򷘒B|OkwۯZ***tP(LMMe0{/_޿gϞtfѣ˾c\,''' B{{{zb"b5+++LMM E"Q:s\>_TTr>.%%ܜKj9'{دYOϘ>sNYUUU=za(jƌqqqvvveee.]"$$$L:UGG>&&O>WW&''GGG9sݻZZZqqq^nnnJJJzzz?~|PPPfffHHȑ#GAKNNޱcǒ%K!nnn>>>>>>t׮]kTƍqϞ=WVV'{uݻw]P 焖{#xjﵵ**+;x}Ш(___@Yoll|~YZZ8qR\\,}ޒNAS8:TWW>b !O3L&S"|~uuuqq1R>~X^ͼݻw\(;wn޼yfڷopkR77F}_skaaNgeeoظk}:xLfVVVII9jСO> {699Y 0 G"ќdHΞ=[]]]PP`hh( СCҚmMMMM6>>u8ιs'NӃ=Ƞl'}-PW'/9֐!?]ZZ#觲l}6g|cփ˫<# )RSSb~ y0ΝBȠTRRj@vqYnkN>=e bF] 3g,//HKKۻw)S B&&&ݻwovxygqջwo˗7+ɓrȑ>}DDD(}s!AKXYY]~=>>GaaannnM8;;G9ۊŋBȈSYQmǏs'"JO<|䘳p++_ty׮HK{tٗ]h_&^|e„U_rEa.]:5S1,X|ܹef-֭[onn>gΜ߿dbK ^]Bh0l=zԯ_fT=}vv <==!7ottmX,Vx)nTx+@_0 nYYلeK-Y|?~&%Lq ?oFgᯬܕ_.3{=WZaۖZ[[%)))))I9W/CCÞ={nNo7KWKLL,((?n7Ky74^wٸq#$())iiiɻV|W̟?_`4Bguuulwi?b???:lJqqt59iomKflpܻ-!(*pF%%%i8>hIess3BF7oUUUB˗wՃ בnk.-Q9H5ZPt3wyӯrmvMF]7 PYYoڴlݺuƌ -B\n~~~ 6;]!&&FKKkڴiWaAr6Cv6*M琷cXվ_>sQ*啕˕>*;ۚȑ#s6nQM yyy"hhhǥ++dwSX[[1 y ۞~ƍ7n3f˗/jb2?P#,"m@-_xq{BkU~(yamm:m|ӮGjժ:;;BP(sķh:HT]]]^^~ΝGGGڵK(؞^II)<ݻw< "~? v޼y c/V,_ KYKNiii}KSSV*vi4:87xi,zYGM5y9r$!o裏ZrVwiu~|}}Oh/xZEEEII- 999^J(J׊BM#Le^\_l.u R,3 ͼu+|; NO"~ `Emvٵ;-Ѵ#/M?mQҦۚw2>-Ѻ7۵൵eKUSA ߞ-#Qtt ]^7,^ òR@GsM6{0 б{yyL4kn=z$[2lmQ-X? x]tӲ%,}sH1{lZ #Б-3{5ٷ]~۷rNx MN/_q압_|ի|~qq1~@ >03uvƕ+W/oosUTTBnݺblmm@9w#^ЙXX/_EOKҲ=rs|}:w6]CQT^mFDp&JιlJċ|Xs鱪woxVw?WWWWWW(""_~;%hiiy OOϙ3gB<<<-!455l6(l6nܸqүoݺ% ߞ>}땕Çm`saÆsr,/^"AdZ !xJJJ555QQQ{NBغuMllEQ[ AAA7o޴ӻt钮n(""joP ;W$544x(Sz ݻw[XXѣG/\ѣG:uuʕ+>/)):3--֭[͋!7o"""O^YYyU}yxxoݺuueggZxx8EQ}MMM ں{љ;wi&Om۶ﷰÇ GB6nܘ}ʕ,SS;v4Uvq|S$m %]gH?qt~BNsW^]PPbhhHB055`[EE.,..aXX,x<WDd333SSS"gMcǡݳgOXު@:)555OII2dfY,]\\jkk9K!8;;;88\paĉ{!22ܹsUUU555&Oiii9CMv̙jԩJJJ;֭!^/^444$&&6{J   *ϝ;'oyrMM+M84~hBBԩSuttcbbC4hPdd !D kkk:::^vMOO/99yǎK,iCE|РA_:O0iR,&Ifaa1z興 -//OxҤI-⽣UVVVG>|رc C )>ʎ8`mmmffTTTϋIÑT͙:=====,$;6ekeFLKK?%&&JM%~رUUU*|>̘1+W!H$ׯFո\d''/^}{5ʷ !NpsskaC```XXXTTW+V066~֭[SgϞuttlڈH$.//s󣣣wEQVV(333@' D׭[hѢ; '.t+++K蕴 F"}|^K紝Ç,Xpx<^II?!5k|gw>c##gVWWojdС\WWŋE5w./M+5k,OO\PhnnN?I֎+((PUUx;TA˄;v|W喖I{H^55q‡]-z^gHQTVV?,;x>ٳ>}tsse˖u֭j3f8p ~gGAvvv111'O ӞI4dŎfش+W"##mmm~blmm߲077o+uuu++i\__%oHna5N SPMMMmm>haaaүqRSL9qDXX622ӻq FTTT\\144̔rҥK<[fe_酆?~Q3=] 9;ٳb:}|@ɥY[[|( 'TWWo߾!""`2}kǏ޽k``p6`.l;L&xF%A “'O޻w^z-\wrqر,BͶ7nیׯ_466>|~Z9s̎GdffB ]|9((h?C}}ٳ^={ĉ3f̘>}zppUtuu'O|M6EDDB!3gάݾ};vqq޽ݰaTTTdNBHllldd)S̙wȑfqwwo4yu^9Ȁ&'t @^UU0lذgϾ%KeFF[1qttx*ܩ~~~?߿Ύ2w?ciiiFZ~=}bZZҥK !#Gݻw/TQQٸq#]ܼzȐ!999l6Û&--m`ƍ'TTTCW!:[o޿BȐ!C'9g3FO?B#FBbqrrP(BHii) IIIvvvҗݻcǎK(=.%%ܜKn ܬ"KKKcccB+O(((ֶWQQiX744dff;vW^»wr\:$nݺΝ;eC:#M8333###?nhhf߿b :O%6m$FW畃/{5qiӦ=rGII榤~СB\]]e~ziCQTmm5OWWW{{ݻt.?~@cEW"xyyyzzݺu^1\| IDAT^^|2>>>%%ݻ҄3wiӦM>>11֭[/^\n]vv.$ɜ9s}ڵQF6%\x1##_4iiiVVVf|Ǐ_|IqF\\ܴiRSSek~}䉵M:622RWW(j۶mzVSSk:TDJˢEh<`EX#F}"rٳʕ+mmmsss]\\LMMSRRmΡC~W}N6M,_y{{B.\ ;wlܸ&URRҒEމ"hΝݻu) 4qDww~kTSczz1fǏ_O:uԩbRUU[nSNuwwwssk:QF|'fZt)6fi4W֑7QF͛7oĉ}7n\FFFhh:(tJo>c٦'O0-[H899Ip8l0++ٳgٳ^w*rkkk>~ҤIwCs[p!) @y/^lٳŢIII֎+((PUUxҧ !NNNAAA<Ovy]\vĄΦmСO> ;iΩ~EVVV~bUA|VL& @[`va9;;7} _;BBBex 61rHܼy谰ks޼y69{x@;%[2g333y&n[OOϙ3ghG:800LJ榤~СS5cƌ8;;2K.5266{n@@cxeS SNihhӧ!M:F rNPڵk-~ ܹs=MM~{ś7otҥKSRRtuu !tD"ܰa!̙3^^^ٙ/^,--֭!ŋ)>>>11QGG'66eԩ6H#;W6͛Iv^^^ ѹ-G>%)))))ԴN E"Ν;322!ݻwoMoooBÅ 5` LKK+%&&4{nK"skׯoZ.!-p>ydnٲEZDQٳg7mpn:c mkP5U\\,}~i@ 011yrNhL&S"Ȗ4]JE5} P(ܷoߜ9s&L@%˓=4iA^S EEE\.C166~ X}}S/_TP>x@:(3fʕ+kjj!b8//DŽUUՁRl^XXH9uTFF_yuM8p $X,1bD #9Bۧ/رc *YÇWÇ8U(*,,trr2114iݻePrww6lٳC'6ʫkp8ٖG: }.^lyRRXMMMtСiiiV#KΞ=[]]]PP`hhHgСO> sM999eggx<{mZҔmrr@ `0|ʎnll 433{,ֶ% qSFFFꜝ[FwtBBB:`S9`srNжw͛ ȑ#K8^ kk}:zSNbrW\9}t777܂˗&&&G67\zuyyݻw555 !˗/:u̙3߿`0uttX,!D, W^^. X,~ii)ͮKII177t-ˎׯ&mmm{{{BHBBٳmmmmzT_~׬YcmmgBK?~wl-ri~&,LMM -޽{䝵yf[[>!!!"".OLLuŋ׭[Z>|(  ,X>| EQ z]/^Ϸl2k֬+Vx{{D"܅s&&&O9g]]!DKKQVmmk5MA… opxLKK?%&&J*=;vت*@Њ^je!"hӦM [˼yv]^^NQԖ-[>={",SiddD˓-DEEE"Ñm .Brss~U\\,}+sH]]]~2i[6<<`GDDl۶-)) 7bXn ׿{C,紲8zlc رc ! d6Z*ȑ#M266nhh(**?Ѕ z&9?RZTWWׯ_?܈BMMԩS>$'sB¢4,>>ZbBBa``,.%ᅅSNeddt;vidUUUPPPtt7l Hb#yQyȣwh\= _9mڴȵkу7n۶mtopYfՇN6j{졳.5eʔ'Nl###==7n <`DEEq8CCL"@7;m֬YB\UUUC~~~NN\v-]>tд4Fy<^_tYզtmrr@ `0EJ555zZŽ@k朄ann|VVV-ibھ{ޣZ^;;;@g^ !67oD^&F ]‰tXX[ m59* FN@^ kkߝ={ܸqCaaaLk}Ν;lقh Z455MVRRBϟ>}"Z֬Y/|w@G־;.\x)B"Z~ݻw;wP C䜝о}좢~WĤlCAN.ZH,ZZZ tbx]1cѣ]]] 0@ UVo`4}5rN<^|YUU BӧO !=z`0 @#Y`+͖##**? !eeezzz @{AN< {k9' @ 99'rNx?pM@ mbȑB%/@s<结{ .G|Çϝ;=zL>} rή.77Wə?>* 2i${{ܡCFFFΞ=ah*䜝;~.ഊlXKKkǎ95VlM"Dy… ΝhiIxB1%VSY ;ACC---oߎh{N:h_l+W˻s玒)ٳ ֯_h Z#""=z N,ϝ;իr.$>>/rpp@4ZEQ^^^iii׮]B@I3@y}ޣG~{{{>} (z)d2/C zwbbb޽{י3gWSSkkkK!,9%KH3m4FGXsrNs )#͛7ކU.{ #C͂9#G"mp"]DVFjW /9ߝ0 ѣG>}Z(N>S<<<<==gΜ۷|MMͱcN<` ,]PgD"iZ`svR999{ILLE;E TUU!t-tqKKK??| @W0(8= SIQ9EQ&#_$;O_K$D"HH!VFp9ge˖>}%.\$0'bE'xb899Y(۳.ݻwKWZI ܡEpE$" WOzݠ6#|]bJrJc5Xb "m~9' (z9bĈ.㏵o޼iaaw%]]F4(22Ņ"LLL˵ܔ:4~xDG@%P97̴iEI(XMOSnWKU`2v3)_H1^6b~&-ax>rHCC!ٳgΝ&lܸ1;;ʕ+YYY;vha3--֭[򪭭[hɓ#""=[븷aJN+SS늋L&a2 !_}ii.'.{Ge"0 B  %!"$"D 1W<;5}e˖SL9r䈑ј1c!<ի>|ECC3&%%BLMMSRR 5#f|>l\1fUԕUlHQ5Y[ZJţnj6lݺFPujkkML]ǹXYl/bI>8S"!7~^H% B$ %! Sb)RQbD"k^S?]::Ç ?&'iS= ptn|444f̘IȜ2e_yyͮhaO0ʲϞ=322B4:ܘSKo/OL/+*)lh͜I!)/g06nT-%!N"|lٺSzz`%qaaQaamϞ=֭[Cѣtt(RZZjjj҅bѣtHԫUn:`0K6K݋?n KE2mg!JJq;ie[~^_544!Λd˿\.yeWp9'Ç͝;wfffeee333O7bgg3ydP(9njrʈ Dr ggg&/(:}ITTTy< n9NOII`  %%Eukh(6ZfM֭jn]&$}33 p~9q҄ҽ&4S'::hkiB}GGGѣo3{!$'7w/^011˘윜 (1:::9;muvޡ"y?ypL Au_3=_Pfe%a(,v7AU֊'Sl=pB I IDATNs'q0]xԙoر=CWܺ9x{{]VիD"ѬY⚞?~xGQԲeN8A>|x㕔?]0$N>]GGgΜQV%H$BQH$ZUY|ceɔH_O4BD"H(wQ?3M6@:MR 8MAAQQ(FʩJo;EHh =$;3?6 z>滳·!7iR)s'p:-Z4dVQ?8+i^ƽ=(Ϗk޼ٔɯin7 qܳ#Eo[˳pծ5Su\,G-fCX͊I,uC&%lfDP@Nt:-[4g}||~<Μ[m_gǎwpdN\CǏ?~|3f7.77aÆ]*l2))ӡ/=,,lEEE!!!5jԸ9ɓ'srrBCCo::uݽ(~^bE'4LJNpVRd!!}+!DQQK~dD$ܹt\?S-Myaw݃ s\74EU0 M"/Ɠ&y~MGvvӉM{`)G"֨tVtP^dddUִj}Qg&o۶c]999Ig0pMRREDWnu'~jk;ִ(..sZMxz(.U\Tå6_ipEԩzڨv"rGv-g1EQٝ3Y)&nhZ42d2t߾E^{jcR.?n/;o~IIӵ֛L&]SRΉHbbK]y0m۶:m{NiQQQFffDDxv>uzII;#ڵ[p~a4j[kTmw4[[7apzAԲLhdݺ:˾Zb{qۃb^ njfN]fuNp}4y򤒝m?wtJǎ{];gD 7l81DLVz7gΘ9Vyy: /=Ġ0""ro+i[o7mN!9ٳ};8(h&z{Ρ!!YY˿ZR*ٺQ)Zف& :nطhE>@rt9ciV'̈s_x=-@ƚjW1]fgOu#3Y]$'g~]ZZ Y?*76kzQWݣu^lyz/*;C<_PPNʫ^ucz"G㰰 c B܋͛nOMKUzE_-3m搶o.;zK^nQ"nUy{bzJIIq8ujx*vb;y sTkzLQV}4S'0 -6"{pؗ.5DՋ:i%;-W5f5lP:f5cm=1m"r PEQQUrE]6%2'b!ӡnIIzYOzu~عIsW+]kԤ:zyurirm.R~VUTUUTɤfd2f\7U 9۷opmcЧDU,XܻM0 CDq/h#W^V۱UˎᆳT"K(Mtiyj2&l6{=f٬ilL9Hwy'EvDr\z=[olu4f۲re-M y*%-V͚kBDEQ/eIdt=֤T?o6LFw sPIIɹԴfM l""O6ljU\V戬[lP9UUVbu0 a9dRM&(j np^^^  -jX\x[aCsss \.f 5bPS}4y=9p"\#Ã(/jI}"dNcf@q9~{P pM"PdNHG)@cy(p歠ޡdN;mdU8 EΞ,EȜ=PӀJ dNu~W.GEC԰qӛ0Ea6@x70{X(N#=8uL8zc TAP^?s)wC;x%Y2'~5sI5 9NJ0~n\#sY?YL^g63P%2'\g$5da..n{^z%)7OjCLJ'k& /_2'\S$u?Q{J躡iy֪ݯߦ+S' 1 |nk_ذiOٴU;XLOq:ۀG)**R4##ȑ{8oRj."O{٪;';y̴a5dNr|utbzy͊;mHfyz32rt*O~t]fI4~IH8; ~Qk׭z+8=IUp3`G}}ns ʫӉ|0{ZZ"DmYL8##.;ˏqMOqqGOD&yiz{?ae<;u+O] cⰘV~r.%%%00AOi6;;f\cǎGDDUzRٌu놆5M;vlҤf PZHIIorGƯ\DTEk,´{礹?qo3ixL uߔ9-7yێ?|$==Dx|BpppƍK6nvd9L&(%du˕6kVؘ1/_PPPN'OMjttSOIUkԨqoNܹoR̼ܬ~4ϖ3yx=Cޘ<<<<&ʇS'&tFL&__ߔv}\ܱcaee޴p|/iYS?\7.񝏿ٵ??];,li߯ϫsֺ_zFsst]w7[, //ǯ_бszڹ‚y 05̜aHɤyz**ַo޽.M3ҜN4TU,㧔%""&--=[׀o-++)$[Z-"RZZa2*sUjR4_aڼڰԈOǢb{hd'YdO>Տ?pᅱx4KD +lx8SDTUubKۋ)@p 3iaLE^^'M9曎'68q&MSEtQ#^ȺViϞM޶m3srr^a,ᚦܨS'V}?Oxüg,CwxGߘ湁?^9^Įxspߥ_~྾/ZҿOϑ>x-"^(//O1Χ_]___uF-Ywaa`n-k95MtдRM+h2ef;1eJ}Žz…V]D1u2~e_~=w|m?t&Is"ŒeWLDDx۶mN^ZZ*"EEE%%%knWaSF{Y=m]չkG ւ<={uOWk ~ |Z???=<*=qarr4mzkt.ko>2///]=<<*܏>BCouT2'kr\z=[olu4f۲re-M y*%-V͚k^ (--3BgvVQ$a9{lHpHjZjPޥeV9(CoPMɄdN7si9͚$&-زŝ*&6ljU\V戬[laGiiۻ0 '7͛deg /h/:N///wR%˫AzaE ok7lH^~~nnnAAlZ,fXtN#4$T׵5 ðGM{S+(Կ .VUD|}}E/-:I&f7pT Ȝ sk6vḻ wcߔȱ9Nȱ縟@9 sȜ2M" ː9[v:b۷n{5fQ#>q,p=&2'InR~bȳ|jظɄvlĐg àȜ2'dN@ sȜ9dN2' s@9dNȜ2' @9 sȜ2'dN@ sȜ9dN2' s@9dNȜ2'dN@'+s/LTEG)90=&s6jܔ3̒:ٍ[ V.;vYTT6rh _:9EdԨ?[|[@N ̭\+dN@3CrL6NMɒ%&sN*'Wi>}/oҢJa!*g\YB&OE:ߞ&ee5M0$'GN͕d,Aq:/9!An/hOLQ<ɹIi]'v]⡮KBl./9 %7Wocd׮[Yvl&vTbꆟ}&M /ȬYn[%~*""R̙r̞-h!gwԨ!.Ң|4k&,7 ,۷KrԪ%7J`|L.ǏQiR%4T>}dZqYPHn4h qq2g{G%"=z_";vH`<(KȪUw狿|l5o.Ԯ-{ĉ2v~^\o|36V{Lf8Pbca)SOW_={$6V4M{L|P#G{w4H C $!AFe_>y:%7ɓR̘!"2`$'ˮ],X ={Jh $>(qqs| $v1 GIDATyiZN-[$9Y벣r;|XݻeyaiBn^]d>ٹS6lW^S.%vQ}rpfCAyak%#*vr /9v'(N$$o!~+gԩrɾ}""ɂ""&""gȮ]-ȁR )edQUI/;*ooΝLFZ]ZEd`Q|-e [U}3Tmnmli2fLUw&f"*m2kʴir""+r(>>^AyٺUJK=+*S]vuKIYª4:uD image/svg+xml Application only runsonly on the O/S & CPU it was compiled for. Cannot be modified Computer program written by authors. Authors can read and write program in form known as "source code", which is easy to modify for ( int i=1; i<2; i++){ cerr << "Testing" << i ;}return 1; Source code Compilation A separate program is used to convertthe "source" representation into final program run by a particular OS and CPU.This cannot be undone. Computer Program 3Depict-0.0.19/docs/manual-latex/figures/interface.png0000644000175000017500000104147112640746376022141 0ustar pcuserpcuserPNG  IHDR!OsRGBbKGD pHYs  tIME *7]tEXtCommentCreated with GIMPW IDATx]w|8GUBSQ5h46,1=1"jI~jlIآ&(4޹F;;}fwfx3o{ٽ:H@7 x^7 z^7$B#@>27r!"/3{<`!>(D /( yQG Dy01(r-3x%"p"bA fPK" CΘeGL:(8{hFm<P/LyH r7[>r o,7+bTǻ:yCΚޛ* B+$`P@2sHP}ppD@a @YG_^tuϻ@  , =Ax@$|/IE %%?DLJL<5`= H:|Q˥!S[{GҬ`x|}oe.V%wS`[V#g#O;Vͭ>bIhD(k8YOw~8'>wQ΋9s^p:PP %ל@~7 "՚~b * xC'RjRQbn@W'PX)@B06>K4G'bǫ<2 L`\)|Z%rKF'g\ BEct)ٽs][Sꪞ883-'u7,@KWG% -$8\;a W=T kG͵DNB:8H_W_Qs{ЅEE PXX@< ?~(| (,<z%5,7+PD,o%ؗ,G#JVU6,XWON94r"2%M(Yڒ2@y5xڕJ}HRdv}fs|4Kp3xlhSk ]s}m?Ltbh#<@(b~c(@Z_rQbuD#k,Ϫf&%GagXOF3 u˳bedXC% $(;%*-ìm5KN‹Oen[OD 1I8=bPWWR@'z4|+ |YĪ!Hq5WpXV0,m={61 f@·~O k/rD{$5el$$ϒLP&MO㬂 V82^]]ǩb'Zg'f ir(gxqL5N 1[6r`g*n̟u'=?L2.Y~I9hW`˙ZVuʝ er~aݾN҈'~/Z[w:1zܭηf$(`c&u7+@B϶jcL K1KLgJBCH'><_Mx͊CpKd(eEAՒ I \,Qbb4@fR7!]95i4HŬr7蟯m|[Ł&tw =ψhkjbˁRVX ?ƴӼFIfvKR{48)g5{  D`fV}_P=ʮ!U8vf*ggZsZ kE6X;)G ˫P۳?ov\9v&(U8(*/%_3}-z`>VI .[HI)N0@=[&˵.潐r*IB>ɭ'|:;3O•<$nO gʢqK e~f}C1imu):%`IYզL!u@ bZ>J.j6\‹Ob76S^ΈEh@ӉPl۰/o,Adkd[MVr 8Q | 0.X !I|*/1c&&3g)F$13,Ǝr݂7jH00Ðl[`K #Qd@G,ʿ\{Ntwݶ.BMC>lBWPu?b5_~VriIW,z$t:ʵRtKwغm#Z[t={EuufٲxP/DRTBqkɒO1z[Ϭ]C!4S-gO%`HUrddj9\XԷt@ 0D.I!xЫ_:dFq5gBm  FgF4t|^Jzp< 1VI'[蛚+6d:U8g&=A^"$I.)On! M :C0 1uX ?bJJ؊[+סa(.[UUWW-{7۰`247F~]nj1%M?Meg/@RL]B̐QUk6Kc֚~?L-(d Xz1(GWߢ9xעe3v*(Mxj?qOqBTxG灯8Ms_gARa9)s}?:koחZl: `"O[e;;aZ\v/]`[**qS77nqu+Dj:lXkq'v܌W:TWFkgaӖo~~_zGMu/'Rځٳ[n@0@_?EEػUեػ7G}@WYf+L+J+F0x%mQȼqjÊIg0V}߲w7Z[w0ŽWUFAHF!PDŽZszēu,֎3G݁/~s!f tӲ +!GLlZ``5Y f O|a s'BN.55G˱i t8<S|?e/oQ@B;bɢx񦋱mnߊ%eؼ P/hjދw^֣oƌ.@m*o~af7}q~nŅX~^|a.vhĜ{o܆- ĹX ur$<D%œG_deڏ&y\'kmk29E"kj̜uƜ{Q R`H:?EMM;::w0НJq͆Piy{ GAAl Cww+^#Vy'< B>MqׁAY2"Z? NP^i Gω!g,+DKs3z=^xػ ] 4zѽ݋K}ph<<C!vigL?/6n؎>}Ͻ}{[Da{"ؼiqgc477*WC"45F}Jw̙Ol e;>frV4c6jkdlF]Uq&N).PudξA*GdKDfzB3g]{y `֭ߏ*L: "5c@M ] ,"0RbӃ?Yehx~K?T릀&c}B:_G(-.8]{a5E`ŗV'b}Cix8x8ck6{0q4)o}N?:845+/o'\;3O>jP:[6ăzKK)$em3+rZ-<0ͯ!`_t9ʾA<Ÿ{<3/q70gy ̺Bvп~X$(?Gx;u|hW_@qvg،Mzp j0~K@Tu$^<4EWI߰A!Igv61'mQDǸv$(@f:9'ھ<ONK}([K|j# &a6tVP(ׯk܀۱}f@ss;$l/=W[0dQ _Y^}ަ) z1zx<FMMo0H(MWY[sAY7 (n2'Xc7=.cyRg!п0̹1̜}Y?œ{EÔ`h6jÀ 4K6(>tZ5Cۃ=[;()-E&խh?8?r\l?Rwjr'}n <eO\{O]")[5Gͧ8=xi= ϝΙlϨp(//瞄b]F@](mDaQ~w MP@@ʳ^AGG' r`EE끾Th5`lsaj^d,n OL6GIĤ B !BKmjvGEE::gm; wi`g7ξ8 ѽ{BDttR|8(yy-uI) \2ʉVKG.]Mtl'(MMzc]wَ^ "9mx[~%޹k;lظE)d~j|g_ CBu࿍VU̼ ̙(#Ac뫔hUDG9Ё]flZ&<8\N3Z v1Շ3*`>-ul9%IYM9;0$ .wކab5GaA!Cyu!5mص{ SN9P۳/B6oډA/jjz{lcZEcN֖=vkUӽm݅~uڌj46Į1lH%!=1KdrJ 8Xa~/():8]pbDf#{}<oRm'2n6[/<0sYW`=Jz?5~)Ge?b ѭüY.Z|>2 4p=-[Xu Ս*Ss*Kq"cׂ '뜎g,_r4}VJ)c"ۋAūڲUŧolش6< X,1cbGwa+Kгg_|R)?^;O}'ސL=/{>_1qEg>@~طU* ].ƙgGol F\ru?{cv(x<޸ͱM70RS+(Ę3vc3b|cV7Ă͹籰@.gc3!y5@SS5Pt@Eis0n9-;jtR7UdY 4A25?+FsbDlhYVѿ<71p-{"ل۷C~q:&= AlܸO>lڊ JK+u&\tTYj3^xm +AD+[>@^Cquub߲ l҂_n݋EN7υ/~Wq\|x8Ԕuѷ`sj$X8)cBn?wy,!~ e)"u/`~YY qW_ hZH`" K& 誫~Y\ZA^ozɳn՗\C|zQiߛ0y"g:#rb6&Ţ7"KY&q(Э( !!LW?'-pxk8l;g?UEO΀[sBP'צ ض}#Z[PTT޽RJ4ߏTUDyY=ؾc3񢤤 @Qa/Y7͘ho?χ>}P]S*w3f"]غu=ѣѭ[1`ok36l\P1bX/^`ZGR00;ϊz6#1r"YPDC|ԉvC젅I}٥weډ]jc6K |#'q[(`H5jJ5lBF:LZjG1TQQՇ ;la.cL<[]UZee8ȱ񰝂r2v cg/Fx-!AZwCҖ5MYה_J~ U Pi%߳' 3 Rj }?ȡ "/۫S(E9&DAA›!VԢ',[ qebj1iG8c.pt 7Qbd\I4B5Zo&R "8`|}8nݺ1PDEElP%KlJ|X[0V/HlY\\=DgFN9hQ?Jq?ra%S|93Mm'v0UI?njgƘSR#eS|ɳ %5XbVU]_IgVU9SgF.t.j2 %8ۮ/|rBnx IDATG;sNj:SQIy77y q-#YbO)- ʔGت#M? 5hT&_g $%WLj* hO7[IҐoȎE6n"wG%id⿕h;9Efv}"q;JlxN~* 6}sA8_bʳ.ʙAzZ~@kOcs`j4 C jRv...`aPzEK_HXٞfu)h "sI6<9)T )\'iC lF(rS_5oKcxb&rG] |PZZ@T ߯ϑ1!4{)Acj_\5yϪڟjtW)j+ŵM- A $ZH`S ﬋ {ZkE }X hFe L#ȉ\a@_|+?ZϬlC -$w'@-{|~Dn+H Ne9Êtp-Ć&~dOIa@c_)_II ݬLidzv'1UuL}d CK1QRsXDSе8PpH$H Ah =^%;duR6 " 1sI$ytr\ l6X)h?`Z I UA;r)ʉ .H@Ҍ߳҂e5ֳH'10l,Q:2٠F:JtRVpϾDe|K-9| 4*9:2>f\l^b?A k6=͹7amE+Z Ah;J ž`-ik~ZnSY4R:FV\@ov MaR XA GYEb JKjf[#kq|b$804 %ay1z<#3C ަ-`ʫҸPQS2Dd`Ģf}7҂7ƯW9'FuMu/c&@q:1ioņoHxñ/l_O4iH̎%e:Z ª|I<#H A&8J5:i~Mb(N 6?s C-VF^w7+k'O;/YHػw/o_GiI N?m*K Ƀ AnWMо81 = $HRrYk30/; =_+ yQMAZ(W>9oiiy^>u .Ck^e:}P _0]ry<싊<<<a^1QXTw}_q}޼piim݋K/!~jݻ`ɧbrK lܰ' +FG̮˯a"u++I֎ϽG~{49jGAև76G.ZHm42,"'-Gg5iXu@GCqo}gֿ&)Al<϶!/j!7 WR%CåEҲޅ_'8SqDL͹="yLm~ Я:{1yx,dVB%1oz⯥EF~GT\1ㆈ?yfߏ;~<ӦO91q`G b,Xᣏ?18awQGCދ)N~ fG ,Y K>3Ϙ߄{e[wQ| XRr=i2kgjYwtЄH!OH-!$HɎp%Oq #?Ro`<੩as?M[i GC=L puWoFj8tTjr"݇_-_4Ӧ*àApʔxy`'h!.b|B0y|9&嚃di~wϋ)S&㝹FEE8S޼ SO)MHa$SA{{t.ۂs9l#SG*đC"ȬlK}8.}~%FjD8x߾}OΆ, }>tQYYѳg]#nj<x_t|M|(8qOv,_.L4{ҥveϳ[{LXҧO-=52Dl\r Ve٤c/1Rp@NOS+ $HIO߈73[0(F JlWePRR hoK0(#QyyV}1|>nCGg -gM63~IxcѢXk݈0$V1xgǞZ+MSO}`yQns׋&aA\+p[qT&0`Ͻo{R'N<}1;X,S4x|M>a<}5.<|n~ x?c-/qX˼H5OxAن?+͍5ƂvYa08!qxm?v-Oc7%LSLۯȣ2K׿?P7p<ȓ;Y71G0KXl9O>#:°'0c'-UO>GΘG*pg?܋Î8?4/'M8{1vL|JO<>vX<Ý?7l^j1IXB̺zm z'Pz$(\ p)BJpw3 .zɢr+ A&TȅXuy3Z{p|&VVVVByÈ֯hB*((}y~?|t\{W+gY*e䬸R gv˖M 494`8DA T;^n==䶝 A< $H 8r6"=]/l^_ ӧ]^|w@0D(B(dp0C!a;vkCLۣ^`<~ݲk 0L~P- 1^n]q}y5 a.K'N_4BXm_a|ƶmI V5"\ p<  #3eb kU# +4H9U6֓<kAE0L-3/Lm{W0u*686TPiGKgc3pof o`$D Ae dK=nAzyJ(*(H*wu82㭣?i +BJc-J*HP/N+'tpk'H43 aϯGkXVw@U=e~y\I/ #"toN?fޜl 2c' p} ʈ!G]9]Dno&>C! 0+cVuu4PUY-:@ΊM+#ik1nu-5Z)> 0 2O&Li ʈXlV~ۦsFJ۟5@ܼ qO A3 † 0nZX :$>q.%iІ'M~H"LjbY*Q (HPv76]u&^6tU^96b@ Abrm,ПLw#f/uja$9[9$Po@h1ͬ`f17֑3( Z|CS95=ɺϢp$8 ۾lkjwL#=֨,[۽sȪE`{e>cH+ P dOзg׵f3k W3"7z,-k> pM$H Ar'Lp}7#\! -7RW3Phk@O~Z?6Q 1d(+%6B '`Uġ?e$ru@S(1 !&OlNO' skC!UH!pΙG`Qu`aN(-v fRڹ03"(0A $(f+#CWa+͵ }7v)d)-ش}4 4Em\{'yK pm'H0k9u5_Tu4bel@2NsM§qȃ`0Xv?ǹBS ZP}-u+9"KZ4eIgFUrø@{r 3+qd[=71~DUh1\GE $#y@W & n+,D$qMڭIݻ7r8 عtM^u|ƾu 5 E]Ð1"Gtk*pdֿkQārCT9$_9lɆ*lˬg%|ޔ Njr=s'v ;=lsdjOɾC *su (ӹv5Ύ4\7FZZZ1{o~_gcN_*L'%y۲ql*r|'rk !lLBќj$7 r`Mw.+uZ$7 xTVF ` ]-X!}a,8{M}_DUUpIoljPSss٩d姰RVe:[$e :$`㷉wYA)c9Se|aY߆ AD8.@d?€?dmm66|&p({J5e=vѢtTa#3JϾٻ={7`)xRK!@!x--ࡸ;ut |~h<\]Z[ZKG~_Qۣ)|8d8 O-l3b({yL_P~ -# ʮ%2K [,2}EF&js@h-aǰV g3K@B %UwK3825ڝٿ2m|Z̪k 3G 8䰣0s֏W_NJ+o%]qM3e:;~)5o3o 78KQUlB<ЃKݎo֮g?}tƉ'LIJ%+l~FLyZ_]܆/W-iM'NҲ23k O՚quyչQ0_2 Imąq=}vv7`h8E|pu=lX̐Y/^>r<9 L>\['$x*PP<zZ}2; 7rQX|1P[[y 'g}ş,YgB\xhimw|`L9D,dpituI~ 2^SNo#ݛ;wu9(((|-aƵb\ <>r2y]LAii)ัwÏɓ0z벤 &nh>[MYHX3]] '9bL? }N)]OhDJ#^Piꍃ)+,dηx<{1{1֛h\ru޳>$VZϗT{qE_ߋW_7:~EE. ^׍MII7klj€"$xJKIitW\ χ} G1܀`~ JgfM_0T}~??b)]Qӳ."}]fP} [ve IDATs8Tgp" e *(e_,V.F7rhfԷn0֭Ynҵ#} 91ix\ q 8Iҽ*ގ_7.2be=ʰOi_ vFZEdRyi}:~2mUe%K/j,^ KۥMFg۸ƙs0m)SeKb[ty6H=jtq?Η^I-'p8i"32x P-HP2~|4K0Im*_S?|]]]؈#4^~Yu&?n,zQE~cMK/>QU't֮ `9qVSNz@t׫,L< }@ g}g{'M9 |>Ҭ}U =$(-Ef)spu72ojj6̓M fef螫}{s߾ٿ>q xfʉƴEjᆏ-~e-"cdcig~%ZB!y ?.Ϳͯ~+~p-?c}YS /<ݯFqf_Z475c3񃫯ţg/5ވ~!_wfnOO~|+Mmt 8IjM8O#0,d ??pan q <^jKArRj_:Vz $ӦMAW ceٲp~/׬AEy9~Y8o ؼkg>w\r[q)B5l 蚪tSp~m#{ʔ&TZ}8/F /UڣΜ<GƠ:زc\޴4E?oz? +@˾}غs'^[vpTo?(w [{L˺z<3g`z駥G~F6.FHF _׻<?xt?_KhG``?@^YU\s n%[`HJnSl1 HPrv4P6m\ _&<κ'M>/*~a{V]0,bO:ͺ'8/7wbd%ࡿ,\8Zw]PC9T>_w;ANM9+zV^.Jy(#[30DbN;?*53^{}oC{Gn_B^|mS=^uNï;1D]o]N />e#:_&a/|ʈbnDy N¢B|ܳjv8i(,,ķ=-{Mqm7pd] c.FG;}&;VdVsEd$k&bf/v!C&LoNo>Y`txpi~„yc~li'Ts\wm3Fi] WgȦȩd_|d< r WʕLill?OZ%VXύ#~6aLud|,'ӧbZ$nIsSY s ڪge%*x4t+*|bnNmXr\/sOӯu1 a߁w ټ>nR\r;ǼE~`0>~:` X>6~tւ8!a78Zv7ubˆ/|{hڳ ԒŽzeR  eϛI+=(w%WjJɽҾ $'MN"N׭=*У0`g;vI0n ^4j87f4uw wVUNj&TVU7h_~a9J|=3Hv$yiX!wP(a|Jޟ]*)Ɲ^'+yqWӓ/,>}\ʌ|5??!Mݏ>@Z$ˆh>)'y8)R;`Wvm߈EA͗B@phVIŵι\fրs!=(ϡ Zwe((DQq%BNEҮ}عe-_ƭ-1q7hk_P_Mc0 7̸M-͸k9td=x|Ks 7܄fpu747z+hŠՅ9[##crnmC98 I,+.0o!κ:i }\ݏ>cƠ[Q8CvÆYظm郲?r$>XFG[o{K^xA:}y`8uD6pJwvݰoΟ̝@0(=5u8[.\[g֭Wuy9~4^;wsnMh֫lG)6V[0p}6M}_}܃Ֆ|CY]]( 팂:kI Euh޺}=`W;vnƪ%` гߡ ߕrC.ܼ -x%=`ڴqml1ӦӦG~p!&,O;vt+[ @|5 [H;F)eF}شZ4$A nj|U3@2Oλs?!nٻo-XO>0ah]>9>BalXL3 vHZҽ;F0 uXt)qGZ(s䑊#=[w>c: ՅK' DWۙ8DӞm?dsD&3(řQ^B~dg!-ҙa4j'*B]jkH9mX9"?x}p$FwV./ 9!]dX+{0"j^4`{uۄ-$=p&{yw] `jiW8:KSAL;8&dّ9DS[N: nuImv/i$>\Lz!C| &0K߽ƌ-)J%%o~jЀ+/(.ƈ}#Pya<ŘQܭ`矣݂,G_5o}d>vJlQA2;))c2[ Cj'A:OB !m i{ q(-Gk6yVqt@>'b䇑i*ՙ0>U2C1):#7ዹaRGL,iZ[w(.`K+Z\6ol{N8;vup!(*,ĉcy ӟ4v, akEaVoN?jݿ=})v75F/UUӳ'~rU{>FL5 XGG;P׫F [2Ż 1_B23{=~J_DBc(H)X~EHdlj=͖fן&)؈rpT馫`o};s.Q?z4{ ޱ|hk?DŽ1c0jذpMPs6UHP=rQ̪O=&]qqqq]wE"4:]zyB- \^A i inO{Hs9qml皟1C("W0ɯ0^@#) |?.,x&`|92e( }2m6NNOb:|;q6awN;՚w/*9ώqʸsxocOHi˞'3яG)j"bNė?̘pa\_]ѵ~=<.LBts\0i Y(eY`W;S6:1Yq- h9^vs<[ߙUMLA2DvSnU+Q:۶E&3ol7Ylw-)ʈ96 |)`unQ\(]k hko{2m*-)I^6mߎ7m_XP ;@eķ?hE8 ! VvQ\"n_[]qUYgȭa>J}]1655&˜ vh]mh?  `3B<Ci4[הw{h2؟lz=ƹ]fWM9.@jP0pC.穀PjV:|OrrQBO/ֺ (#'JES'MRܟ.駒 nC>cPo= d] ׋#f`ܨQy#!Rlkfcv.6lؠLKK >lTUUBkk `ĈؼisXJWHXQVD[^C>}лwoL< # ٳg:ҥKq)SQWW: YozI'*iK/G}z!PS>}c裏F}}EڥKaڴih߀#Gg=O>?p~x1o<9BSfKK+]tZl:_{kLw+;/qR(`HoH.QFO=?6l̵bmEqiV @Eb<,A@byj%]@'7u +R"P6(:iv ^n #2õ@~ww!7jtٗ_ܔ_H<\&\r F{cԷ@Q]S|/kw wy'v܉s;L"ٜ#;KfEQ K)*`8ӻSOwӓTOT2al`3{fzf'm"|>a>999XRm#**ڃ]|9F7O,,XwPR|,~?.͛yӟ#?5j4>|zVZŽ+NCͲetؑѣG3eKt%\7~C5j'Ov 22 &`wMTT&Lj^U\_~ ,pYp110[n%Kiul7,\ȸxϰɅM! 9$Xj\&BaNT/PmS*Rv QF<Sy=)._1Euʐe5۝!cr0P}r87\w!ݻq6uS_0J8?=7Y-4>1 ˻x^= (j'ҢK[B/d=&:ch1֪mxg^#xib"pilؾ?ub8ʎ?t3ͷkb~.SGd_$ gfLDv׽;q*Xݵ+wII*"V;V_zkW}v8 NAN̛7Sl޼^{}QYYy7aѢu,LF/YB~}=qϛڵ;{y\wuLF>Su哘|]wcǎ瓓ILt ڷo$$$зo_{y3\`rr K|唅?Yf55kC㪫gxp7'bX㏹k˶'Z ʕW^}ψ#<4=>!-[b29H~;?h;MDƤpx&F؜.nrtAm| N4*k@>$AYRV,WIIP-P[J*իJ '=8h&Szҝi@8WAܑh|$ '<, "L/ ^}]iF^J#i3j)=[8}iڡQm ed0KKs@Uyow!I1d1gO.;n;:lvl{ܲ{7ǎ'#5d7D@UToLo>}Bc_*,$",Nm2e/h;">6wV[:K}=⼬, Ѣ"ר_#/\¿6<tiKy?3eH羧 w/3&Mrft]d`3WʿKY3g1s,~JJ _xQ5ܟ#^@++: Xvx7N:)S]έL>h gtO9X<ߟ2e2SLvfr[:d>ɼA/^B̅Q^oש;GuV]np}4wF}~jos9P tO^Zi~5_~B_WX WIʺ_H{_;BOAo] '<)=F#Tgg߾( '77oʣwxL]+>pDA: B;yxn"8 uz`,HjO~:XzL*7\#V;ȏaV E%ն*qήu$AKd68?׈xDžnNY,Dj?o. 2aoDHZⱝ  /Rq??te(] x`}JAiXWPhp^|4F,|+"LɡR _WwbbTmPT\LtFMLL_ϵ0MS\t?ނ,tm 1$Z#Nxp+⺅$$wLb&5$i<QO+M܋&_c&\k^ͿFq:@"tAUN<AnƍOJJ =z`5,[W^}v1cH\x!i=ֲA1j$k%'u7H 90!S%^"pzj^M®cSoJhԆ! lUF :~ޗAO@{#/scF]_}Y&geX2X,G:oW9;ڰ g M-/CҒUڿg UPd[ aCX!N_ G}qgtV-BIK{t@UA #P?ߟm8QƵ'Nd_}C&cXϙAq%SPP@]ҹ3;wb/$yMi׾ϛp ~=zFEѹsgbccY|9/b{1yro`x߿?[nX15{槝HFT%VHT60i~;5dr5b@@0Pu8H HM"LcHqL:-t%Eƨ~-Ew`R_Pj6T˿?P0Ӣu#c?w_qшY9 !9gM "_js nܩ_?kcgZG_$$g7VR]8Jdr!lEQA覔I261o#3ޏfwf?DUgtT5846z_mߥK999ϧ.]+/iǎ1kHƍ{GG1nxWTRXXȉRjڶh?fَx_l1X[fϦwޘRR$! ];w`ٟ˘+r\4/|g\l_mۨP~lr«NO0ڟ"OG#4GW9 3VS>0nC``W"0r;diTC:# DSz^qS^q봻w-8$Fp UĂ= נY;wF[9jZTp8], Z!}_ ` -ti= oCx 4Q07(Bxkj"$g Yz["g1=k#Hl$BO%8kj@?ʿUIp@2NՉ#DF4|(g/m!..O+&D {IюsB*CYG|`: h!={b4(NL$l6sm[l]ġ;hMuu5Ru '$eb[Qt ;D PBgZ)mr5XW}a@ b' !I1 ۻh(z H48ӒZIO;Vppy/kՅrD@n xPF-e@9iaJPT5 ajgvYzu :lYx, ؀="Brv l0Ebd$o2jY{0"P\!|NN}2 qzh'NgݕIr.ސvQwEާpܿ;\y9$I0 Mk < 2o$52&[2@>je<ОnFo?oe#q>&&^={k.MFކX,t Laa$&&R[[˴iTi2lR4'.䡇@v/-Ee}L~&X}Nee%Gѣ< |٣VX#"().￧\fͺ[p^^Dʎ;7nzB2H(MشiEźY׸y` Pv<>@!aT0D1h`݈Voi?v0v؉Ċ ;vHؕhZM *`oCz)q̮?h6`\}':ߕp: T2hw,P5 µ4p5p4 : ujͅ9T4#;|Ly-3oh, P弹|@HZyOZP_-<%+m{yk8 *~)A__Ѵ ]J+").SQ{| UT\2!6=.`({~ɴK2j%mf.=Oz;:cH!Qm{ݻ='h&W5B>V"GMUcbo9e5kӧ_,YBjj*f3))tޝL:wĢ_lVe'N{NVVAZb1TTs!222hDv[$c l6/G$I\p+*u1kLzCvm)*.L2UOlݺՍZQ(O +>̀W ' >XA`++)kq @iZ ״Fԫ`_T!c†6, Q##J(˸9y E8( DJ<(oRJ:V縉J%u@.X'mp &kD'^=urT27'4E CrvH;D[niY?lٗ«wlĻXu Z~ !_'[Ĕ$w FN(2X}nztkrfk~8pXnyǫjCG\΂n7{n#"2'|<轌~qk$ ^7A5X= ]&۴!//.]2u*+/Ҍ rFW^g,.DnNvv1}{VKJ{m(**⎹s[o]f'mPWfϞMAAaa`ě3[=;ށ>[obgdTVVJuu56n{?#6DIt҅2ڵoOff&,_ʐC9yH5Yy{n~mrZ[qzt׀U0jڊߩV-0 9|uV7dăCQbJ,S)P#0 0jvF  (PPsulv*4m0dpdEF&[O @ed;9NVN/jyJj-E@!9Oe^H4w*m8IA"g*)tjx{22]rL=LB/Dh i烡nHy`Z8sNo[d%`Vוƽ %%'Hy闸,_^| ]6[y?1j>x%o;?|6bDi o}iKGkCcTSA_XuaY㩩&''‚rvmt҅yy_"kjj3 #iiDtHަ|'\vDl*&N"|ˡ&G1w\ Ə#Gd9+1 btZv2܀dZ@f$@074q| ߹ /$wя3s_RGIHΖݚ}Ri|TR,{o_s7f8O>[.7~:QQ v!x' {EfԼN|(NA<Ο\KÉ_ >OEhFfذaرK2{lϞgńoX,bbbظq#999x1yfQ+VKd|9f5z4OXV~gƎC~8| ̜9/Ȋ1}t֭]h? IDATˁ;UǠ . -5z ݳ+fdNXŷoidž4 \zQQQL<ٷExG1b[lGO]u5eeeq'_ʄK97y*Q jvPցB_s32LV Fq5~du]A0E2p`m qޯ؇i ]Uۗ +Է!!aNmi/:JlCw+.c%d{P`.  0HBGP$CuXT%/(W |M :@u\8@ѥ{x'fG P!ẍ́P4w *471N3T?= "5ⴴIHB?$!iCӡk%ƚQSUT%ߒ{0p@!!>^IqTTdh Iez3М/yuX9&\tETTT0tJWmƘB^$Y SFfZV+= <<׏I n#d"::X9_`@H1u`=ݧ_`~ٶ!.eBstЁe5w)KBifOy]Ym$'3dPjkk),,nc48VTΐU],رʘ}Sɩ#zE>Ias5Ehbt?]/4oktՀ8n}uF4`i8ͺ IN)cX4+{׀ZF,Wb%rh[sHVl؀ h 1 P؟,Ѧj@Nơ%Pj&PI?">ökݷCŒLJ($3DAWQ~ .GNp-pZ} I2 !iBJ&Fy >' wCHBO?<`oVXJ'9u„2nBrchwx14Ofݻws!jkj֭m22H:P[ˮRl}ο.lXAt!vr.7{=DI͆j%&:$uVXPڤ#""#IIIaԨQL4]2 xG[#gϧ?9^Zʭ7&Kt%Q3I&q7ƒ%Khт,~=vޅn'**Ν:ӭ[7"ˬ,|r!ó6l;t;D }n_v,,#NxxT #w& {aR][I7R[G*6Tߢ鵬:詂iuڎ a*'rˌ16a2na!0(,r$I4 H$T0 hop_7{!D$ @P\uj9)h㨺@~FQjZKꌨ$"HF 3)IhP8{>9wЊ~cLñ3T!$s>ڄ.6>9#Cq^x vM>=wlnâWQO/BiH!QՍ5wQU_C/@p`.](,,G!_?^yUl€x^ڸIILfequȌ;p>ZiTmLUf& g-\g:~!\x!YYY,`"K.r(='Nž{?|W_͞C~Ա#vf //o(rF吜Luu ]Hoӆ@<ıckf3IaTאB#!ϧ{ 1!Ƴt=ŷ?BUw5@BD ҡ*B hD(M]Q} 5$am6måԮ~Ne1hv¥9 ؅]#1ie@UFB$fcoARH+&ͩ^"c),ƎL937zd #aFP/|1/khJrUM<;RH~Qvωd8j ؜vNISgMXRs N"2&ٹ'e/XCiI7w"ݬT7dvq~KQEC^]ng0(C&7cH/> So䑿W_FǞxI&y񰩡1 $~ı?tpN˔2tU6L:k>}ٳ'_sa)Ƞmf&Vb{e%cnj޽ٹs'vXa111e3#GRPP@tbc߿?I<p1HN(/+ceߓƽbԨQ >,6] /ˀ駟رc7`Μ[)(( ))~qڵkEYm K̊0J@a6% ϰaHOh4ϐ5 6+?=Zz#XJ`Gp-}8"!1*)@iB0jj:..@oUQ=:B=BұOf<}1Z©18JTJȠ4*E*՚>DJN_ I& $RD,)$xхzIG0UST[4RSگhA_^t^qC!RI!RJ!%fL9J%R#6p!(Z^j $9Ө%IĢjDj=j3>ɯH꯮/ƛ/3uʤ_t3~yhs+-TcKЯIɦKFf_Z rsajgOx9aY66(-|oU5vVٝ j S⟛KINNf TTT).)atʢI'rÔ)Sh۶-%Ǐ#RN:Ett4ii/#&&.u>{D6ENJX,lݶUEE@_zx9cU'*\7?|lVϧ?믿Z F>PHج6ҿ8qɡSǎlvdY@RRR٫?ORYaU5\;~}J6GEsMSW;2.[Ŕ /+.'>CߤXDm%? P@t]+2H) $@5`5سu܎k Yk9GZRРin#IgV ũrMD! AƨS[D2&|PF6uF'肝IS@$bcvN# *%7ľ1 =vp_>wDaƀ()t =C (n"(AH7;lPvI\{Tw9QV޶e}x"CNroҌ+Ksyo ف?ʥLgk+4 G6m!CR\\Ltt4̞=|Wtؑ;%w~V^M #snٳg& _ dea29r$?YCxx8ɤ1t0xW3jNI$$$UTYU}p)uwJt&>"zR@Q1c}T>qM~f0:۴cN$'o>^5شiǏ3~8ilݲ$I""2aC2oSTL0wH>MJ +(c؀ 1ʂ_^w}O?Ldd$X7on'3g~<`, &_ ; ̸}^.nCEP@ A9RTgz8E+x HCO0B)M[r?&^>G ǍÏ>ᡇ53dyInw[pcnjO>GeU}nAQs#dˢH§#|.|'<_<g5GXkVŁ .]ʟk8`3(MJQ !q#%A{(0ھT]D"%%GUIV\Iee%j 3i Laa,k9>!6&HINNfL &tЁ 6pA!?|) K}=DLL il>JLL45ٓ7^$I[,۝2f3vNJx=| YY]隕ŌWSWW!6dPV0F#Jn%G&**~ F#~Fǎb%PW:ܟ/~{L/cC? ^7(c :X#E%9] šM^؊nWAꊦрz& i=X/t͸: _G@2[$uy_A&MG\ /-1Ȅc!Rw. 0R(I$jCijPNyb^(<. Ah/1`c147W(W97Dž^!gt=M}ΉYfSy+Ai.t2\}t+*}:e\9r**+]\xйoWرv Ǎ%>>ATT$Ǎju+V~ǔɓg~|늡G@ɯBk}x9܁`|`ڗ?;AuM Kaa!B ={qtЁիWGs^I})Sٶ-wΛ9#kۖ62dP2f"##  d4b20p a&Nyy9/y xwzf3uѳgO,  2Œv;Ȋf#-5*9ۗN%`C) #//qIR9ۉ'.6:Laalܸ_ itGS[Wb!"Y;I|\<]Od~sf7#IOO ;n\N@ '"DS0uS NB@ 'E@0x*¹RKڮ+VklŦX`W4~ Za*K` Ɲk.InW\Oo$mrg]o~'AOF6ja@Dp=jY|yudұ҆:2tJHXʈ@%rZشa&y@?)1'D鹃ފ$$! IH~a_??Tq|J*Əw޽;}TTenVS:Iݩ:6o'N8JJݩyaڈ!ݻ:u*DGGS^^Ξ{钕ѣG֭۷'--Tv!C0 Ȳ믿رc?nSNe֭31bݳ[rANv;E<̛7 +r:%ѫyPS[CX{ﻏj2fVgg#USCV,*+%++W^y4h q{|ٺe /{nh/[mB%f ~/ A&\ Z+*cK*gWAMIɮB!^UW$WAqMPq#µ0@*@4}I@s'۵YLGiNH.BTA c}X#.eANdd$I 0sLƎ)).p^vC; !CpݘL&mȕW^o _;馛 l|}|k~nnQZVd2nrIJn‹TUUgsmFQQII,_"|-jk)/+L}IJNgfO D^^ssq\7YP-PML aD-DnQaMª>*zaRV!l٨>B/@ A]8@P8a|:A*, *(6RhPPhApM@nO AB`\ \ `ccd0S!`Q>^{hn MIӄjл * W.fvn FsiX a$O=󯻑jn2eyJX]wo_o ++O<{;n^w>w叼W*]4֩DɒEx<ʗjvxXj;_- aÆ1~֭[GLt cǍb DDHO٬Z ȌIII  %% 6';;n))477;/>lt>e唕SSS课TWtY(bPjj*uuٳ~aX$<^/N 2Ҫ|K9o*KV5~ʅs璵s'>7;{l2ѣG1 >w^illgFo=z W]ykN'4{Xk݋x),,awqdgg#[n؈A ˉ$|lzAwQWRrM=/3^Y%ߑ(%f9ׁb@IZ7 emuβ#UAVO:aVY Y6CMV!nC@ XtS{9 3I G*9"tH {'> *| @B0ȵ*\iW@B8@(j#TէsMȨNjmBVk9t0PlC 4MdnWj9ZR/=B''^]Oeu\~yq򈻟7{͞}o k/m{939iWNJ# *Ņ/ilL /ou߷w+7^]q'\*']ePx;;<+PREk.=P-cEAfxZ.ɓ&# mFzz:'qP'x<J薒y`-}{n㏌>*+*H+&xbݼk1O^ vY\.~ F6mK/i`}>\cC0_7ޛosUW-%ѻwo<}ejkjg=G$?aYI/Lnk6P_ϖ-[7w^ŋ̞}%wfFAKKcɟa2|0x,l$ž}غio=,}ssYn MM7YXZc#@U@8##2FY^-@o= j-L JuYϚWJ2Lʱ%@AS"vM£ee42"JX7hdSA c1RHi jKG !BBW!$ջ(&/65іyt3KU?x9e˞B#1.`xA]oje\I 2. j4dL3#}sYO?zv=h^01jps >$B8]r A|HOd.(+/'55bh2soo*%{cf ˮD%&qִi4773yd %r*++9x 11\V_Oq|F#fx}>5/2~X3qD~eNe]: hfbXHMM*~X O/Wzo~9D1^˖-l2 9K0fg̙DFDPS[dac2INJ&7?(;pŏ[гgO{Ƚh٢ȠR0#c FHl }W\MADK G4* l,1A ʍ:Ӫ*I7˚(`Td.T!״p$8]hPn:Qk2_ ym`Rddl(Wq\ 2 A%Rieqf664?Rua AA[&Ӥng`/=Jڲ6+KIibb(_Ȥ^DİG0$&$(.. 론<57SR\LRR> 3ٶu+X- U; +o)gf&L<I蛓C%6&~ܱN;+.#Fd  x;rk2x0B@M 5@  Iv֗4ps^"""ܸBTsλӀQ=^l012mSR Bu (f-+PZJ;٤Ze eU%z 6ǀRYg7lmojYT%9YZJ-ZVAE0/zc-h!z #^@-N2N#Տ܎c,[loe_#O~,VRp$^n.3 @:2oҁڦSeTWݻf2hA x»w\~b5y_Sơe648NGZZ7c7_T蟀hdk3yF'3)i x+ض=\ɧWչ1'%X\\z'EYȲB LUVz9GG9,ː[MaDB2i~,DtQWġBI5Uh#_/Z!ԕe>3u<*1g_=`_}-o6󯹆iS{˖-eСdffrٯu&? J"0ed+=5ʭba 4?jGJCCkv+|]xloc[`NA9}BSK( %}~uN5,3յvm\c4fa ,9-%TMHN3ӓD5PnOdf w^5w(it$|͵o +(F [8^璭Ckh:혳rbcd85a9~$ F"c 30M$R-QpXr܋CSCEy*DNTa#]w?t٭أ;#ؽy[| em .GGNS>ԪMfCqX;s Օ-n=F[(8$VzmԊ(n"lnuAW}]pN_e"VN&RFdY/ {-|AS7| f]gW";'`7 5](>h7i7H'(}VM'7+ YB)cT ;8v mw~akiNؖl&_3elX?F~)=cW Zt;]Q8'}林p6w"qIHg\YNLhEL80Ԯr*ACZE/>_[H 0=yoPquV#ڸC6j[U}iJjhôU[t5G 6VP[B_gBq r!]#))9tS!W47+2ԔQJ>lFƪnWϯskiȟ Mr@:R`Z#/V DT/L3PV_@ Wקlݬ hQ " FFZڹzB_z0>AZszNBZ8C}6cTB# mGm͏]&Cu&0x9Sp(wwblz c\A~̖#*(#x\Tg'AYY> 4eGL<68_n쟂[>ɄXe!8 tQi6<GǎyGSc# :l(&0K Xp=2{߃0`}a׮];ՋdNߟF#Jw~FN;46lIOO'?? !7x#QZ>$6n?O1 !x x= <J^^;v !>6E=OTWUc0!Xh_~9EEE<\y啔/Mcc#fl[w~\.&#7nbgr* Htt FƍM|%S^^NzZ:?[̙gNd2d) R9r$?;CJB<㧝EdT|>vÃxQ7?A^^-%%k ӦD< ۤg%V9Fa[B`lE rF3(Qntb%Ya$BUkFPt0*@T6(WֻEPGi`BU[LFu1&#[F¤삙P,BO# # dSi%q|L7 MGAKy"ЫnTtR~ufu? l6m]V "^TZTT cuAM>n]?N4Z/q (j+*~o#Ǻ1#68nʠu@1ꓺ`yW91(Ⰳ7@,loXP_O8J`/PCnqEQQeˉ\`2q:sټ}>RRRHJN&2"u1o< H/4x0d%!!B^}U~u0p˖.T& e]Fݩ@ezep:p0a"#"歷b<{&&ʾ{}d)gL![2EEE$''$'%3{l$I"uU"Be'Fg^vFц D܌ǣ(;QR =zP޻7u]C}Ͼ}7o.qq(؇dDll,?#=.!22+m=k}I^b5"p  b1t,+4Az$5!@oOT"( _? kVuSU@P\ FiLi(Lͧ&~aDz=r@01Wp<Tp/B#ZOp?](B0[W>¤v?,*UUA~zZu%$@ 𩿛x; :~*}oVϧ3@hI{Ny]dN{js.v.]BɆ Cd$EEE 0K=%ڵD@0LDDF|2fϞfǎTUURSS̙3).)f붭K|4553f|>MMf+&>}P[WKEE=3_zo þ}3f MMM82zf;nǕP7"o0L :+cX1b-W}غu+lٲ:p:\.zee}6t7 *z"*2|Oy5&

/ppiQXXHEE%CZNmN|>QN IIi3vG!77݀%¤V@(dU^lP|Lڌ7N 0 -6j[5Kk&uάOAK:-SWkֽs*-k?^HU_i 耺Gwe^/k" B6 FU@Hchd@Co!BaBQ?Q"*!i jy Cmb -M!%X8э'xkHSV IHlWݹ؃cKV->Gu-v!6[#h{Wd}Kn?.?~f^ Q\x#lni/sfjN7Ovj^\z5x]B4_~7"$BpyS[W͛$m۶IIIW^}b,f Jvwv26l8}DFErٳgxzDDD|c2e͆/jZ=zV^FΝb߾|"`"3+s8b8}{"{>̬M IDATt,fa!66H Q]UOB>ى̘XE%"U A6+N$[dL aՁa >tЄC [QnTAOE}e0Fg4-5?o$sh)$P샀[%&4!@!chzB7B@R 2@Rɯ|4! `P $5?(̣vKDKP@YGhH8!n@ī˻݁4 HU'$*` kT -ͭuLck:0v#X,'ت=Jߜzqw l51늏㔷knz; XeR bku]AA^z){w^H{ݼ .B^{M&ML=߭4R#_/<ģG77‚'ɧw'd:_8L%*D3N1tI;⻸O[{dU2|餦R_QoNj I?Vr 70,7,HHL"*:99Ej~M&M3z/to,zĤhx|R?P𛑅T HMAhT8 $ZtWovI+;:klX9?I!$MΠ c^145}  T /I`0hsz>F~3 Hc$xQNbՖkL@-h?800Az NB.uBVB^Z@n;%Y=a]sUF![:Х}*wvnk:'/}^ׅOb0T(vzT^S]ÜK.!>.FÞ/2c(ܝς.E0Gӗ"z\,HLJ"))%KrAĕMM8|~ :$DE* H:vqBpgc qv.[ɷ}Kbb"YrrX Amm K,ad3ٳjdF|Z477SQQg$9!Iv;w+ilj>`ٳe`N=s*[ମYgSYYI||fv0b;/;~{[o6b2hlj"woĵr;r׹ra߾$ÁB6Fn.^F3I ̚5UH(*j;tXX7YSqF~0)B~НO/k:OFc(]`hB9(CTu@*'FWf!MzBu u 5,ճUg@uQ@SvmyG%$1H` ¬ݒآS!IW ޣ~B"(lh,8˿&vM/G@"4;`lt[ˣwuXq\(K>f\CCx$}|?qw&3 ʹ [##=ҳAVud]Ef\.*;t.f Y%+璕ݟˮ5u~|J@f\zfcY asş8vkks=fg}4uv#Y3330p <{:86r\q(ј-f Ȍ3=z4 T.A2Rz~+BcCFݎ,x<ͼQTTĸqc̘1Aq9rXV6.wߍ[yzS+ٰaQQdg`ٰ$%%z HLf3N*VݻwSYUI]]-11㪡CH\+Vи~=奥L>nSHKK#))}%%|rV@iY%%U/QpEٌHZ~Nf͊dՅD0Mjj$Xt!nPUuqBe\.xjP EOb5K^^B6 ա]¾ZUE^CC `g(֨~:e9jzE)+/g_3&??OwcFfΘC|D9Jб###xE?C?o޿I|o;?n뵫yGM23/e9L2 S.ad3~%>A-U~޲pYngKI&QZZt<Mc?\.v{@ݩ? , xw|s9XVLF#VHqQv$ =Sn{13|YЧOcv J^j݋":&h<țoɵ^ˁ"֮]GYY9֮_P]NMHIL{zF#)1K.E!۵+Zv9bX^X,V$YvæMTb |>veK/3NoDL}^/3}s2qD<JJK HbΝhjnbkX,L:EMM Fz23eEEEeMHTt8ߴ\| uxFGI6˘-̕W&0^4gL0u ˋBs! dM@M'oPu|[.لM˺^ty7^®}a\Wsۛi M TzG/A {2/ @@ 9лJp - z9h)%9áq7ިo- `S: pD[wBD4#k kק]@{]OiRS?]'Rkec^Z渝k6}W_ckYb!dYfʕ̝-Zpyk~ 9)(({jtږXIP^tw+?YVXŬc2rd/[q{g#=>7;wr\d zh42e,YͺM=wpLu,Yo,Y/׬ebUukc8kڙ|'Ve_d!+Ϊ%j"V-[eTbDN}p3,=qsÍ7ȈC|GPYYIss3a9r$u^sGV,)Wɓ;v E_O|~ !,p8FϞ=ml$vjoWmV+eHK#91XmV237x0T$w |U9@IHHr91lݺ8w I)..bĈ|sN'TVUR=xXvYFKLf#O4z/ 3ޓGpCٙWŚuT䵇Vji)4 *9\Yc@@-ڪ셀gQx Ws׀ lހxQ-貎clV=yF0UnT}IM0ҵ[b !#/(F>} @m{pn.$r'' m|:B@k# CGTR׹u9"h  @ !Q@} {M'8FC֞Sw\= cXtZ>nϗQkB˚g3jHο+V[bs_Q#x+n^W\<9r$7of%k{7X0ᵅov*jvû vϓHMKddDp}Ee9HfQ vΣzdd3h(=seְz~9Tq;Ю]ۊJ|-wϏ[;k,n7Im/sX>#y&_t1_|B4 a󨫯l/7b@@鳅h4p8p\SS[lf3`^~=na())fŊb)).a7~FF[Ӊnd41h ٶ};Mll,VNj/@~^x䭷|<܌foNnNF v#,1nXO?{$^{5(¦zA۷ 6`XbMl߾Ʉb|'0j(n7$%%QPP EŋIMKn.C`EW]5Ǐ,A0 ͤ5#[|w`4i45Kt7q66nkc@ .-D䄌\'Mxw/7 !Tt*H*f ٠m jl螌 x@nR uF( $hhM9_6ꥠ6)oAFkrhsdI LY2Ve( `с~U$dߦY5/XjX@3j6Zf`F>տSTikiÁzqB]jm[iο{bZ{#Ggf 1;"ĦG_bnFގX,!W5ø gPT\Bpp(p]466G L:r~?񟧟 _b2uL422oַ_lL o*^˷֜cGiWUߨ{M?lc`"#"Q6nFd:V^]}I陑m^4fI9u940dvIIlX&LgϬ]+%S|c: DEE~=uFE][ (//#++ ɤ &1F˩##=TTTpa6[hnnƪVU%#[r2J˧GZ̙-[;nYYS6{6AhmJBP^^NFFOFje1cތ墬\9/īCNN/kiBkʀxt!3 MzF:u+v~|vÇ "IAAo/g̘,q 5A_⠏^LDy QlW)-WlBe A PY@p,U 'Z@(A Ôe"W8OP+K(m)DNhҬF5RD/<(K*`Hֲ й} -FBȆBkoAW~A7ZF̄ƚBJxTQJ# zH(J 4/T@ ~G3"<9O-FK4yj, ']'5teS5[,s<ͨ#dԘ a|ɧL&:,Jxѹ#vV-xW9}(|23S~%n^Yx!3Oɧ_j0vW^}<~>^UAwlVsZttپ?.yFH||<=ҰYx}>ߨUR]]M9XQKH`,[l߾^{x^Yp!oI&bY)g0Y8]N1vE]}s-eժU<3DD׿?/V?߯>`Q]Uƍ믉OHh2aXz D)Z$$$˔{pL6oLVV!GnttƏǝwIuUn=giLNf.+g,FWD#0x<%c,sWy7q:TezXmv| UdfeQR\iion2th:jؓ_Kie焁5-O>kd7NY] r v*YDH"(TSI*aP>]#HF5UqtA˿CSTb=˨^xC?Ke=`P %=4CRECd]K-Hl (Rp$(ĨU k1^QmoimW rCqTIh@fUO(PSPD'XT 3p5cΌQ5Ʈx)-G]"/ jg0ooXj'Lg`Zo0y1[mA`ڴil4c4U%|K97͍t8m7yDF@eb~77ǨP[?}\k0~v;nwzƏOUUR@Gl!I2Ya?|z2cQTTT3~xΜ2@@~Ѐd<3i$&jl65=zп"۷e<ȤIId"%%Ȉ"UO-E,x]QFCCc#={GTnS%t5 IDAT׿&H?3ljձ?!v^#;;΄ q,[^CM].&&Npql7552#GکoYC]+;صO} \e=ݨK;@8+iNׂN@52rP]5AJwhT:*I}8AlԽAzZJ- Z5@Uj .3~2OB60`].0BX=8@ :w O)@ 9;b?R:yИ ѕh#YS:U+=7\ VUԋo/gb42,6׹.-iSgW(._? ˛^iWShGT/ a/qu)~ dHcF'B5>=*S\eUO!4zu^# !:P|!+=,CP-^ K*p98z>~Ѫ{!'\/@%=@ȳ%Umn~n#Ԋa:C"TZ?nN!)\0?.w@w\yPEL(zbajE@N=N!TrSߍ4ZC05w 臂!t_:"{j[nR\|e0v)]7ąm'D%"Icc3.&.w$p؄餹CMR#Xx^>|o|'HOfc'c 5޽Ebb";w$:&ݻXm66nݺkP.)" !E޽}|ՑQ(..[nՑwͅ]ȶmۘ?o 0uo'NdmJaa!?nߎg455Yv-J}e˸wxչ?3ތe[-7+.`L@ppi$ܐ_K.-4Cb 6ظwE޻*f~vM<Ξ9L;|~ߔ0$'H[.\ݵHF Jy9+z7h'N "1x^Xwt`4ytwwsĄN'MG(#+;Çw*{{ VN1~n7F8 y'Yv2Jgj"hkmp^9􆇫8 e QoŚN &&Og箻E F+.YŽ]+|deXJ{Lc(cHJn%% 5[PGk|-A0+zqAYPt`Z /`]) TBj||PV|McH!WRatWAw}() PG굑Cנz/@"0>8ղa#MjDuB XUD#\">@Pb̙w!b =a"#Fv#"nsϷ+vIkk+555LVdI/OvV~̮]`ҥ̟7z233y0`4Ǥ6bD^{5/b TzKKq8{ lWg' $W\qE_D4z=ƛDEE HCߚt7ô2zhjjj;f & ͆l&9) LDx8o&fQ;T:O Vسg/cǎ'33)S؟Ml#ݒ_ zbnAb T_ԑ @ :RFO3(*7 8Q h" 苺xZ[98Rת_$#`׮U8[x8տ^mO|r̦Yݜ.1ȿ7Pe\ n<:טnNn>ѱQ<5 ^) ܾuxgc?1yힻW~IƍO~kG'AO$W>+sZ6`s;5 lV+ ?M6`BfAOO[n:Іpc'HHE{͌2?;Ì3t`馡$+'xuvOOjj*lݶƆDInt:p8!=#_=yGeElܡȲLKK uu477ꫯb2puuqwC{[999t~VW^y%ݼ$%'Eww7iiixNgf?j#+;뮻Kz}|^nvғSVVFMM ӧOc'vADd$ uu cU䵵!ezsr^Pbj FGNHN"rx'HtxtV|jZy/xW@Eq :@W~A Qt} @;N/' |r' *B-A3ˆ*ZE-B2:rCvQ M'(d}_4S}pc&%#KLVO Z*qR~vǵUυ>"D|2Ex/ۃ7]K9>{!oϠ{@".6*?fu:6?ZdD8k?o#~q6W.oD./=m*ͳzWv%㮻>|XQ^⩬۸it C5 ;360u4**IHLxG9b0䞏Y+4y2qq`Bظq#|y_''dhfkh-%ypֽ.W{el۾ߜIru2Yda21 tuuIlL,(f={ؼy˗/'%%O-\HAAsC9tQ&MBAh4"===HDccddc(.>=2l>$p8DQ䪫{eڔ);NС8#ٵceAl6`nWu̘N}Vȑ#^:] >nGf *D={9yRϤ9H^au4>mAK0v_ *0>-&?!};50|I }ˡ6^ 4_KʩߵP~ o` Q]m3!xJZU^L:E$hxOC@4F]n߫{\SտN]9J*=9~z}!;ORtLK魮A@QdDۥ! .qΣshD8C}pMҏo4Fip8#UU455qF<Wݼ__[n%O^#)9Y2<Ć.5ߞZ&<<3nY 1 |>J>>j+_A2Mkk+MMX3I鄇c01c cٲetvvo`ZĠ( 0-shNA_磽Lss3Csy,1}T?@Nv6v7ښZ֬YCNN&L !>I[0uO Ώ]xꪫ0TWWS\\Lqq1<Vlv;C^~Ȉ#EںZ9~'?G!KJ1m]lrNx}2ݤ8hma2wȄ+H,\hjL`6|'ea&}O 'sC;ZeLr(jB@:OO֑zLK#:*U-!}*6("+v1p\ju ZKgX}A Wt׶w D]9bٯz]ߵ_E)@<*# c!)BA}Zf_ 8[zz[uɺ6zXgr.;nU?g1/?i^,iАYg>N_]ZJBR퓉@ pʅYK-k>v `pR}79 l.]JbByp~FiY`.{nFTi/+{ *ݻۀ< #<<Ҩ=TqNYߺ9sʻ+3Yd ];w? ZbAEN'---})Z[[X~=cƌ!''HBE,OWw'O}v&3,<3ܼt)#F "&pDQ&rX$KfX2MNj/z0@C̄ {ϋ񻈏x|=Ā۷9PEnj ->\./^U-9H( }@TVu4ki}O+EF\2@<_AE]*Bi0ЬקFIǃf7S* r%<%ڢ?@6P?BC^7]$ߛ [Y a 6%ִ`Z@NAje&>=ÔQw܃S%. .baptg\V޹맽s HtA>E9.__8u!{A}y{oNݻw?.sI]}5mo'x%~d [q3FsrkyT#"&6cb+P8+jev0xrB#dqe(w܇xv.6RjFKK lN' x4zl6I(f׳fs'~S>l8Is4[wP@kk+~ONN&_]|Aow8vp8&ahfϞ͑#qwr$&:& 70b`0N||$i#OWy.-=VFd2c4ϧ0'^FcޏF{IM&!1I!!!k*Z[[Z=+򨪪jG}[~zQd+=NQ+BwKIǎN& 5ՉeTVUEll {{1&C1{6\s \;zp {K3QG y%K$""rf͚$IL&LFUUU\.EanNfb۽WUA=d_ώE70b$OG~av;?ɏˣ۷SZqQ㩭G7:ѣGE r`3f b}+hia}Vq~1\=|"c8 b@1ld?a^4^y,I!CAa^;}$&dgKTT(( oxIO)g [oyYR_ϋT@i*A1be ?AA%T@WRCB^΁b:s؊@*'>My_wb԰zu*h'`]P˿^PFy\! vըpxAw}hi_ oRt@7[ڎ`.P>ugp½dӬ Sl9-d Bɡu-"s|pL["F8,,_vAFdY ~yAe8W IDAT<=Q"G)j%CzWj\,H~0M[~ gJnn.#oHZ'dQtÊ=I[u#e[ҥx(lPɅ%wX.+n%33 ɑ#^R1"'*nWQDcjx  $JHYzǐkbv: 2*a 3H!DDSAR%\Pd/2RidHGvj:2/MdyDG> 2= @ruè^S<4 ܺjhT?j;=Rޣ^#d Hࢭup ?F`d4hz?zYT {,NuWNbgi>{KfCg)w,3f>p0>Hb6JyKY |rrr 1R9Yz/L2*22injfĈ<8NOVRQK|0g)))L$dy=7wo=dFFsu4\tvv шdFtt4555l޼!9MF~ӟ!"?Bk[++ )9Rfu1sLzz{2 `ٸx} 'piESS%9%8'sͥ}GFFFĘLt2l۶ %KPdݎb{yWc4b?z{2vAl6ԄE%k Q`q&q%dMÇfI+)dLd_~jHFl祗_QXqM| lgr#!5'`o={Yr_ƕ)G&j֔|̡/? ^\uNjH+_ < (*);@T _?7)Y3)5^ z(X0jfɯG+Ch>YWNSyhu}K! ]W r0QBdL*! :@gׇ<?sWr,!wAGTFbhZf@8_7M(ҥnp oTrs'/0(wsHw~jO CI~iir:>kJ7* =?nP%`ÿ EF]Ws}~sILHÁ+Y2^xrssٴib2#SHJJjahokg1|o0)+cq$'No0֮]˲e(..ETZ"N_'ÆbZصk|!M|_g߾}ӓS3v,DEF-[˃>2e ---5z-¸rJ6o̲n:nlۺDIkkկ`2;;nhh4`ZOHrCIw ٶlcfn*6nƅ(`(IWjJ}Z3*7rjCay}k`w</顼yQa{#I}ySMF0gy6Xl#ʓU_}ڷ|L*j3[xM?u.ڟfB@u5^^~!˩#"Dd L|V)] u\slzB@' @ AO/Toj@=J(Y2=>InLK7^CpC-!UrnX]@`=?wz=jz {hziM^'6.'\`DŽ3.r6OК_MtDDʰyg`ʗp=pN;/xˋ7.oQM >!eK|Ȗ[CUgCr`w88|ˮ}m69ʄZ1MFv;uu42qHWvӇNUUdΜ9tuwjJ~G{u#EXQXxHYj%<<3O?xEQ^^ng1$'j* f so>JKK[o%:*EdgpÄlݺL&9s~޳UV͆W_%ubFX,q"""ذaSQQU0?4zCΜ9s}{YhIKM#%%T:;]9R7)>L0}^{`K.ewvsߢPJ/QшhW1J&!Jc̬YfTF[) _Dj\C1JڥpD>z zC)y1􅌈{3NP@L0]H8\[uvI?L?-o1~J<]EZz( D^Vuˀ`AgpW.ڜYR?`:Zw_sQsw`G/{8>P.ՊYp!&'22!Jl>7|N'QQQ8N}vlv+Wo]34^9rsΥ&l۲0'ÆHkk N8~=̉"<ƞnv5˗u63grw2uTN'/̛?1|8B8@jj*FE蠭xn6ˉa… E!>>3vX.\wyN8Akk Q`b4Q_TUUj*v;fp8C 22͛71tPlܧl2Y=ulL y1>{+{xdb5yÇ;0H1Vȴ&0GEL"0$}4 u[/:P^[RҽTHNp8D4 JMw*o)Aإ4f"CRwH\OՋG`/` S$A )zxo 9Ē+JD BP7<TB2B?O!+!`4tX_ .MS@O_ dۼ>u`\SG{OWfc&5>ۗ%rDZzz%B%ȏ^Z._#3ܺv*4]w-A\L0H;8=^i;pN,.\2T}. bAゞQgR?P?@ȸl,&}:]PñNdD$nnz=^nDGruR|aaNz)s͢Ep!4ZhZ0^~+ xKEe g彗ߦ%w6Fmvf^ߏ餩 ܹxש#11qϗHfFf{/N|>/;v`q(dDEEQPP9,KҪRnZZ),,jRTTDC}#Fx<= 60rJ3tvR1qFUn]wOXZϭSy#i4*~OS;pdf:zSMܾ2R/{ɬ/:$C[I:H?l`  5E(M ~,i.d{?~fO'^2c$y\a0̍5,_8'xY i I]8$JJX6n ^:hMu>\TE{U1_50OEYô18}` 8VOuF;;,k~s {Lu)z?CYz%WwZ]9ga}_OhǡB n(\SMP:MX.dpHߤ:v4osdW*`zs!VԝmgPt.<La 3_Yn98jw'R9Ce}ʩ&b:d*|8ö ޽{Huv67"$\(`,LwP%An+/8 =]g9orѷ-=3.#>ry@~^Pgp;(||ٟ), y~Wϼ(ܾЋ {;U%~QR=ƌC8z4's>,ˤ())_ .¯߿rpX_;w>Ǩ*?=?HfAbΧÎwa){/cǎ%66E)).a䨑lf$iTG%l"^8zKczj:!)9 ͊,ttLCc#۷og9A{{;ɓ8qeK"J~wWnz qlw @vv6+V50f< q9CHNN Wg'*/uK4D;4Ӊf㪫q1$dYE9x QSx-}q >ltGS\HsXsӌJϊ&3"O>!Ci"FȉgfЬSb)f4®Or*u }NNkar$ޯ]+ctᢡQp4ލ|1==N>{滱yWt+bO:櫠$K7X* J:֫5~EK d EGU"@ AhĀ PC0~ d4uxP3*:AP<ͪ- }=/d@#741;9-^0 #"ǀA폦1ө=! _ 95l@K/ ) z_03 /8BwfN~),?>߅y"o2v\ ,]VnUulS!_`%S.WszvgFOOf۱NX 4440rHnڐ$(nJUU5~L aa{n BYi/?rsKaeKIXGͥ=B[{;eetR]]MddKR} xWr=tP_]Km]&C`͚5\9dVn:g>|N:Drr2111Hrr #Xr%픗o~b aСڵXK8M]W2660} JJy'())fȑFyvb㈎&#=YVZ_vEh 6&bbcؾc;n.]DHJJbNVvI* a79rӦMᅼr0n?ӣñ/x6\|n:ηjڈ/bt 5L:C_wiTs@0HbϾ\@)lTl^e9oM ݺ4]lW{z=iK~O,"d`~.Ʊ zN/y.9%B@|J9qgHY8`*!`cF/c<~:ulcǒL]mǎ'2"S] IFF˘L&V+ViWN̵+f .\=.Ԕ0j;f,a>|hGՒFWw,S[SW( ~X~1fh'[naÇD1i$VXA[{Hd& IDAT-DEGnXoC^b֮]˪UX,;zlaĉf D F^/QӰ;8|0IOb2jp#-DEGÃc?~6NfR$Qh4ƤI6xXq<*Çtttě30H&Ode{ Wf升Xu)j|9:<VD/yǔ.L%d Dr͎_pwT-R 3`d!mao3dEG8=DMLu~z S¹]\ ; *puMA]): zpCY{NtEt}\/诳-|yjanwXдskL<zf&`osMLw֕?3k3y'Аr}؂cFp9NݼWġ6W ng$i٥sNqLJ9Ov>hnۀQ8wDEGK˯дh'Of x^22yu6J4*&zhǙ={6IIƛ,_ԩSy75zI`$֭e.\a2v49r$(0} |^/ld2q?̽Q#1̼CMM ?O>l87~FJKKyt:L **7mf^Z[[̜1^;F{G+Va 2nZ]e/AB{G;,)!)9bȐ@po/>IINNfԨQD3$bZPSN\U8q^&N$'rwf$r*zdAPD nN`8L:bcRShP&0=W3ǎ8LDw l.`6p( `bf&E"'89*bZޞ jvdi>ŵ ZV&CHaE#qr $/VXo}ws;iH<@8weE :>C$GHht# ) .E@>A20G''1/ F#xU+ >xA~?W}/~(H A'ho~FC}`TIO_4 A @@^/ ĆOT?ut)#ϊ'ѥIL ĥymfւ6'|1nqIH᜙/*ÅKKC%Gn`ܴ2 `%dBm]-,Ld 0F/@8g}~/F`7pG&ӯ͛=1׾NW'9CfnIiV㩵g{=f͚Ŧ̛͛7LKK x`-%'Kp8rW؄(tw ,\.f:%)4%5\.555degCoo/^> n[u$( 0mڕ{).>j0$')S&rt8x_"33I&c hjja׭#駩LLWQ 7䦛nt:1M),fz9YZJrr2 0}===&/o$Ixn-Yj91~cMC$N8ŕWNrY@;47Гԍr' RH(ոhyͪwĈ,dKX[*7_&6ՅjKL5cˎ=̙cdvh+ '?OR-N⥦1[63uՑU4HьFNCxi*^!.R:]هH=Rw<.~Ro<̟|O8~4aݫ(=lET\fܺeJQ)e/T_8k5I]}$Af@^#!" ŏ(U} ;(gf"'!FC jUj[ZkZRTo@>DIH}l9cw0\j5dwf癙y~_[ `\' w`ܹ"I HICPvIu͒ P Ɨc|!2!&65 59J0BD #,DpӦmiݪ ?/Hl-wqy, .?{T{ +4;}TU:-'$UQ~W$F;wyx-YϠ1ғ6Aׁ9(I$f'ط#| =&:tjkC;tăNyg{sQX6гWW]u; /aEJzUWc6//#55M%ydl}ǡ|ebAjqQ_Wφ`{i<3U͠g__&Q{1-'ʩia!u=1c(.*bĈbٻo/< =?Oڬ,bƌCii)njftYv-C|ڵr|>/v.ÆQOaNcb0 Fv\Ø1cڬHUu(`.K|qx<^N$Aff 3\'JH;***Z&n[.$I| :/z^}~q\q-VtJF!1(pF3F0Ex= B%%%(/͕h,'1tCOxx,W6lǺM{ݬS WESױ*7ׁϞGIVL8nyt/Ҭman쟮`\_ zܵukH㙦WH/(Wo!b~Ai\Pg ӋB0_QNBp G z&h5 ! = .t`/i<BnJć(aZ^ U ֙˨S\g;s_ bzx:bCĄ֞R"|STzQCyTW5a, $-\Hf~҉!_Vs;,ׯgi;?~nj1koFEEK\~-mm-ZM(NMv?2=(P1=~p6~ʉMV=ʅX"i==?\`߾9("ٳkJض-#GFkb޼y^!Cam0( ޽;qhz/`t2x vͱcHIIź[oG'[ӋQ]#?ӯ`谡88Zx@NN2UGSRW'Z)++Cs=ʿ_aƌۗ+g^ILL o&w}Z 2bV~zXltLff& hGa.[dpB"gDX$;6nv{n8pe'NлO6n؀l&>>@HBAA ..'HNN1gLc"J"KQ Xn:tz/NK-?1q60F7n,Ǽ{7]BVMG+wIήqo~ ^g)"=,\n Z5 Jm (!m-hz=$,Bv-rPP*v+8~ }*,.LTjT _F|[d&>VSX0"B^FMV:Z&N> iڲ q&=kQ?y cQFl28 2rd߰a7toWNWhOh~.0 RɃ($%[(hk#X99d[$Q-HhyAdIuR?lPT7\#cxJ{:-fpq-주|ݺ(;1у f3}y: !1l)**"55o:=?^Gq \.nGff& [쀍s;'> =2d(e|c. YVXn7t#nX`ہ],m[neࠁt I>}: d2QVVԩS1I(huZ=29S˭ 8ۍFVKee%nؘXoǝOR4-C Fձi&)--okErǃh4r|ܵ.E;u*f ހ(̟?UǸ[8ݲѽGwۧ}/ IIII̞3];wbٸKq\ III!˨<gVo~&ײ q%ߗ%P݀@uLC R>0M\!/X&#H O4úѰ!&(P$}vR6n̎Xe1?"ӊGy@D~.>Gq "j Θ,Jo6cL̨(`yM2 ` ^Nx3)dlȔrPaxlQlpRp6 A ZCP-n: |P?9HH D-h_@R7\b@X_(j9(!JH^n[e 5* )xュtaU(_cܾQExTmE: adPmVPF) ua!yjAd1(˅_՘F ;F.|#G#Gvj''tL'Jt$qŢ#Kv}TV:iioqkFBZQQC| ^/S]LMN {4DzoH+Ct} |]QhRV'ASc;키Ỹ c⡿QYY3̣O>ɠAXd yyyTUUQ_W/Lnn.UKל4j0Z&@\\Z+W2~x}@RR"Cɨ_˖u "m66I|^zfeD'_Ρf 'Nrgڂ0 K:V~_^wИgذa465ebcڵflssXRLffW$ieAXL2.<_ѧOE> :&ShM̟;o7~ǎ_h}332藗9q]X{\1c}a@[n%++ ޽{ڵkP"tc|Tt~ʯ;7חndalpmI+3VG:⋬eODԤbl"֕c7EN>STqt5r2 jieWEd 7{S&Xwd?04}8hbh!;QKۛO{C^'W;><^zY<3˟ݬ_1$kdX&O(mqG-K3I8 [5!%!UD!d1~@vVǑA#%-O! 'A X4m<7iUaxA'cMH.^nSV9| CPHы.x0Ibac7Vf-mi rrBaU{xT`^VO(>࠽aDhN17\]Eՙ_8?C1ݨQ#YMΝwK/ěoTNRA 2@Su{\|Mv7NjXt%DP HbI} EGRkr28>=1LuU3NMG| {táeTW7lj7\$3:>Ph_XH]..?F*+x3f`/s/)D=HMMke~F0~xḑ%к]f]9 VGE}DVdt:=={\Kv%)P(++ttj@Qj/-%:&Lii)3g$%%'Ncqۼy:V6oĀj!2:`Ʉa455!I;wdCT4) ̚5 7\n7ݫ_ۙ9s&nM7sN>bb6ILLb[\8Bʕ|0}\MƎ;hnnP \>=èQdubҥL:<\n7InN\4$2F܌ΣedR56[Z]>ElbzZ"*pfyG~0;>:F-)4{QHJ2!f]!>2Qz35>#OA,Jd! #FjoLTmN?ו8V?ǓP$81+30N`c&}\dhL"o!mw5SB ZmQQ` UJ 0K ]QhBRjE| m.`B-ہi#5>@Iţi(ntxڬ!zؐ_co:p}G{E7ٸq9r7H6(m icJsK FVjVb04XNSaϞ=dvdݺ$&$2flC8u즦cw=q[z~ZfDL`r,K37 7nJ"'/{ IDATaGr/P+xo҆&>I$ʷ!:n<;Kx m#Y_W6u4@ww o^EDۆ(`PH7G"774Kmzt ?WOkq}GT}G=J`9h^d&QQ`6;xE ) j T;"}2 T@ 4 >]0u\ "" J]/BdA!=Q (J[A0# rEEV,!.'h-!AQI{?{Tl [ `)luh N&3|*H0UD6}i? Yݿ"Ί8czUoMed /$/W|E%A 5J R5N]Db"HI-ݾR  y;ڱ§Z.)n=;&N_wpRlrһfq3]wدS~[' = m™@N>P2.] cC1[*@4eО4(AIE>EFȰX*i.':p5Tרy)BBS6r.۶?qqpNs%tvh Q >Zsh('-ߙ-V][p:׻eD+n饾G&;;;!95L) ,eǏ~v8+<ſ}mMw. L0 8ST:ѝ)gt{ہ^Nӏl؁̟kp gw$xqFo۵kMM73r%wB2j(jkjY*VZEqq1SNeŬ[oAScfg@iihZ݋A9@?@_rXf-! zP__1&&Mĺu6lIh'~~yOO4e?"SSSC|̙CE dƹTVUl6=E߾}1b8:h^~vΠAٺu+UU4\qFv~IIILrIMMjٱ}䎯vPZZJ\n7vFȘchiiPf H ,F sƊm(bܸqXV - POs#̉!;;y--*.?*/"t3D.z}3&'ǣpo {5Lhi xG[Lzp?Ɏ,`=aڄhˇTW_[19X ?SA#*ϰqr Kf8V?p(1fD(FnXQ(¼ J뺲kҫL㦛hp˼n ^#"r/?YyFCs(=GD` /JtrڑC!ڭP ~tA8IQ~YAETbzQ)A>Mл܅,P$)ж(": ~Y#\tCqj`l懼 `@U+aV= .x_8u/pŴgXو, T[ jMhAd1Υ `ң1(h-h"(6:0u:dE@AD>CH Yij+u(`H@ >Mk 48^CzP IjS  }j_O@O4Հ8<` H !@L fQmzկ8P~HDSκlQzz#*Hyu_&L΍'5FIn}ŷ64bopWHJ1]vhrӽW*|nєN֔Y ]z\;(hPd sok̹f @Jj&˯2vܤӖC?#kL|_~9}ן,_⌮I8Ud1aΘ׳/\ƾtnH^?uuT'%2}{1n8[lbX0.]t:}e˖QWWUW]ѣG @l6+U{f%iW=Zm CKxh-`ڙKq2"vFe4Ç ( lP6v ˿%>StCʵY51lt~&^}4$% iw2;̚-=Owi!xӻUO+.m[<MW.e,^,ң'̘) >ËJ؋;m̆ L;QnOmyZ2AWQu`mz M"8-(ztW ~ VX ]#$56JE0%(&Y'"ITE<~pGҦ/h@2ˁ!n.V ׮5R Aб: hUhU7]!y/GZC\,V ZdHRu4I"4LڇCB Șm>~Ƅ*ʯ-)<\>sZ7g׷PMXaCY_^}l]\~X EvpJd{*Buu zSO_=Ke;K3ԓ()i])-9zfJ'Οo 7̙+ٸ~M?p_lb)*<|^ǙSYNگszB%;,xߥߧmi$!Niqt,+dK/INJvSZVNc HLLo_od}>>Q tНM :L 80O7 󯞋kbСՋRl6$xعk'qq"m+h4^ttjW\w5$)1 Qilj**nY$&&w^ .t:qb0سg?8fn8؁^c괩c;x,^_}Yӧ .Do0Fk`8'%..9sЭ[7+*X-ZD=DVCmd 6K /eAkf5dIY7;1[H!>!j̕b󕴝EB =dSqP(T5J̮d2ǃxu-L19]w%B7bE\[ IYU[KEy:fQ ~/5={| k&XTk'V&-'v=+oħ(l /}e룩IgXkO\@\O%6'|J6f.g35h޹k?VRaA`>Eֵ4ς*`W?Z]•?ؽa(Z j BYV=V@ L <^ " vP| rpemE!x޶b0& ܊P ]vWl/m cA2ħ<"RdD{=u\.jTw"ߩ2ߓ_O9|-&cg{)g^4E:&HIUo3yDzg+?'GD&Ns+{ɓ&cەخ%Ær*;f ӦNmG# 'Mz;?aA9GtUqs*\$p~`Cɮ]82}z iiin:Hf54d)+phYR)--kVWtIޣ10[,(yW:t(M\zp!"""kٲe  {'l6ӥKinnjanDLt4wo  3ė_~Ivv6rhnn;={6Yݲ裏6m "&&e˖s1nyq@vNW^}_ODD_~9yJJйu¾}زe G`嗳{wkic5`6 JE?A+q7r/4>LBbHE&B)--,~Yį;h+;ŷYy2?pM"?1>#z/* 1(bs(׃qoB?G7S K=/9WCQ$t&2#s9bʦw!9~/i11܆I1x{F^w.(P8mx=۞h(3 $/ _ҠKŚfnj[ȧŭ>=cOx"6A:. p|d + "h"$$D $">@z?EW" DYFS@l +hWhL dڲF;l!r94Gzh/-B!--m^Ri_ϧUW1N-i{2ȴ>OMSA`ͽ?@" $N܉uSšy?0:Txkq)SmN3)"|N= g />,|r%|wjP[WGfVDI:e]Vsr :wq˼h5Z}id_qV)PqKdA\̜98JJJ+X.Ŷ?UU߿뮽Æ9^rmr)JB2ȃd,b/GRI)"҂&**tzQQ_ k P^QARR}A8NJJJHKM##={>}b4zIe7 s0,hb}fu(_'N0h`4Z (2lذWfFQQ\}5P~̚0Cĥ\–-[`ASNߎW"!/q;Kp8b۱Z԰i&Fqvj6LNŌzmo\Rӧcq8Z, ]IO-*M{r '/B̀fBCQb{GgJVnb|,- )l{@4SO%:A,AɥocOqqۢR&aq2?TlAAF&%dL!bl*gf+n Try >*QW'S_9gIUԳk.2GơbwK/̨Ci C̖8~Ĭ%zi(JZ]!9_ZE=Hb ^@`r$d 3 (2" X 7*@> 1ZZGC 9N( P뺠ENOVggwЖ^V)ԤzlQjmu]YCmhsT.Xwo@FJhLT.@ݼ|\#SYzK9WN?B)1hd, sKo|/ NgmUU:G uiEALDee5</6 nc&4m2_9jcMh'b[pݼ||틎{G)3pI*w?§;e[l@bR"&MgM5?۱ Ň|Ƚދ6ؿ%wI澟߇ޠ狪/ȫCc\)Tʧ p 7h" c/Hnӻwo,3SL!:&65qÜ~-555|'DEE駟r/Zq\FͲHAQBl0|Kn\""8NZZ$DRM IDAT>}hٷwwfccɒ%̚uK.$$&ү_?4Z-n g]3WF\IqKFn>}0tP~q/on_ (/?wt#E&Db}Ŋ﮿3W~5k( 1+hhl(Bx=II:f(S&∧ZP̺bB `cF)Q-Yn ]lXLteH]gq[9x5 wfmQ|%ɻ5KELZBM-* e7~9Q.+YBZLeG+"6^'̞-A,5 B7wC80~IۄE\z]|dA~h^O=aZ`\V2tJI"5k] HIծGu{ ! 3~06; U$z:k')7lxS Ϸ]pwAN~^>\mnqM,[u۸9\Pe[o3c5BC t\nĩ|'HH k֬A ֱfF#~YDZYL2nS??K3{TTc79p`?ljr.}9=r >:=_>-%sүHcΜ9̙3k[0;|>e2W_[( kݨ=B‘!@>A`&.jU_(2mkIPI4?U=7E3٬_:mY6A4"Em  ]q0!JgFL)/)ktMXCF§)e qz/z_LhyyC92X&!.AJ&9~H`:@FUO[ڂS?qxHN|L2hhYM>Q&|Myi6+'=?dwk̋3sȩ-xS0eO=-#1 mϋ!5ŋ3qD4 lx VoZ`ɭO25cn!!1|/WĘI? j}zr1^|E8@=eh"""hv:AQp:٫DܶGE\JX~_aEE|-zN'{!%%[0n'*)KL`/;v,~)ID۷LN'55ًG!2]^c̙߰:4f0 hNu{ILHa@wKqB==DF`lBbGgeJr\$Dll,iii:?{&EOU0=9C,H0 AV\ugv5VU53 qsTU?zFPu}y设9=q9(+!.n"[+T$>}))ulY#++Q&U&MYj`:bU"K%=o>N}D"eoDm5bJ%{m9HRX!,#Kb`JOHA:[wZI`G!8'R3Զqm)$P\nx}!D{%Z.5u1fIlr2A5”XM+[vE,dv3Hҥ8&DoQ\bj6#je/)큤QDkݠѡHHm`N"4IPptK[*W/kuys yV{IzgwL%GN) өȁ1Z_}˿W^YV: Y0; ͛jh _4k3 \+ Ε0\fVA߼Cj@O~j%F"!@wlU{}%&Ƴ~͊Sㄅѿ +.8v7+`}v8vؿX识 k,9&t\ _BXfJka]l ܹRޟd"++ Qo|N$L <%­Jٳgxb&L_` 0 PHMVt:N$jkkq8T*z=9=vdeaEinh4rq8:V+[j)//'77;v0G]ty0zH2 }VDNAAW><*L ˼7xjLmn)`!P__>d^XZ&N²WaϱcͲUJcy#}#X_x.Iq1N~viӦafdo^bcnqx=F zƨdd2 7p0js }HzMtítRzǹdy$IYAffcqhޔ&trT"~ lzfSZ3)q1REk}m, za#db2 lݦf) XEgA-a;*t81p4^@jDcK:eEE>O(./XU*/} ߋ}JO "u|^2O[2~`C¡sR︘m=zЊv@8@r@ Ё@<?_&ȂW.E-9ig_缁(Q GzXw"PcO{gXNNOR?gtbr$piٶu#1 bDGGL]غe+;w$22XJKJ>J՟=]wމOT:%/e#Oc붭L>&.0ciiqR fc=b ,z+*1 Q,Yt#}ẍ́ߦ_3,'4"#HNJfw1~xmϤIZEC\<W4zr?D۷/m'oH.ZwMHH{"Ow^vʨtbr1}4K+II4LaҤI(?IZ-M7@S0FJJK%m{{QTTF᫯·d+[*0_JDM,aO*gLJAm8k lKleB?Phi SAZN~L6d$BMQt#bt1Ԑ}v:HBa K\+ofZiE`oB֏Jdˌ0us2؟[huCRM)X-C\`V+g͂D%4Ey ,N(oHbIaQPTkn7,9M(G3&ؚ%FWm ^}A8-R%t4)n(j0hhs8dZFF5vkd5P>Jk)|Psq@Q{zj5x|S>ƿio(㳳*k gS:X/@~uOk;DBx]#4x-bsr:O YH +sv.o?o۶m 6연E>w!#:'( IM. (_"},>_C#:/ޟWʪm"AsUWckgl &88n]QZVJuU5TT3vX6 W]ѣGɉneJjݻwtbkc!J)Nw@bB"f F,=rE= II""$ ʕPUUEDDO<X6 TVVayc.j{c޽ ArQƍކ[T>l6#d9LyE&SppH7o]U]΢ڻpb )u߃sk)3H#xeTZaa|Ӵhԋ8Sս !$~nntGT5 )r5=VqkHwa-;yR|A+ePYf5]S"g~Pik@sɤ`kVŒLDEXvL 'EU:I5 6XU4Uſi'?"ur%Z޵1|aF|W`e^rSW1ךȀxϏ0Y+uV\bOH0dU| ,$h+`Fsw|N8nĥNÕWk3a1*Vc$x%l KC8s' |I51pET"^`'[q"j'ŨBpr(m&Zj ( Z y4>(B@BHĀ;@^}_[<-3a+{֗u ,h2HTՆij ׭@5 @dghI@ 3P|0fPu4_֟sỘ@}Yz'Ofҥ?=ÿ7qw'(EAQ<qS~oٴ /ly.Ԍ PY w領.L|6 _?fGpKjl6kILJ$;;F"//UV̳ϐ7s(=LXd 7Ie|'$'ðCֽ;FJ>s>fҢ0 =z4n,6oĺu޽:Lj ذaӦMCǞc|D/ʝ\uTVV1D/G,"aaajq6h77. ;8&vl6BcB..`oAAH>%"J"*+$jT5Ȳfڻ7j?gf!S$a %18~ze5 `U"*1 &z$[t0wgh ϣ<$A(Qn4+1fYa,w~ |.SnB5ʟ⯉R( z/# P HX@j( 7}1?oi?(?$@ 8H`\"\gi:o ^fkgoV@\\3f;B?%!22ƞ3/ytW\y;nN'J$QdQ޾xȾY~|C6~N ^Cs;CE!r AK*&<"={`X '"2ʊJtBDD):fϞ+ʃ#${~]ߍͪ4/GQ+nEVx&}ڼ2k}V1U}HXd[+)'4A6gf.2c Q|'xy޽ ȡo,;qOj%#ji{F6(NHRA#i/~z/ET|_c㊤@@qgڰԁXvEGOH*ೇw>8?-\[nw} >{yfL&3MÏ\=2rrrΩi%0 μ:4>o($'%bXxj<DG7L<={w= J±Ljtƍ4hh٬ׁVMFQ[wG*Z+cǎb( .B֯\Y @> #+fn7X_Ʉjiiϙ`V_|!# PS[MJZ2ZʽS IDAT.W{n@Q_\$'iaT( eeeCG{7B@mm-AAlݹ[oCSS#=9=EP\L!S̟0pgQTS#7An&0EIVlT q!/_%vJJۇ\l!BLN }c1wNݮ`lJVy>JgMۉ/l`]pwGS.[.!(*+!F߆U˚=4+Ty;?Mm\:*S.ڄXΡ9^Xgu)E(x> %OOZ1!$#>&f31F|I`e`` `Y2f;R5JA2Bq: ApH}QTphDAq u 6ClA81pEi1AOOx /Z0p~v-`S&f;'_-YTWoQkͥf垇N}eG}ƍٿ?=ǎ#$$z3f(BH 3p>Anõ =(sEfͿ5k&]t k yGY2nr%l ݄Y^ƌFa+h8q|EQX9ߋOٰ7dv2W\GVZx1dՍbcTeqB̚塾^ g[˧tǻȩ7huCX6X6Ph0W1b:n-V:kZ*f`p"Ԡ1F5:ƁӡGɴ 8=DEqepJ^Nѧ)}E ^~ TZ/Y ^)Oh./PhV|b*_?ї8-Q ~ v__}Xj%@x~U '7㬪?Cx5$H/~e_Laa!1M$T\GaL<nݺr<1n&MDzz:9?إ@SYQQ~ V5&橣c۶mD3zh8G6t(|+K-e|vkv㶸q!  |uגABCc#$ߗqN}~#NHH^{BCyH_m,mzJ-(-,-^YNpB>ɉ3!w; x?}ֺV%M41k(֭ = a׉?~b =qTU 8c! ُu'n"#<ۙ۞YlA]r v_X2{dM]w 1ۙ>E!61JDG)IwAqմԦqX2񵽩GalF3:a#dNd_ࡑ1R؆z˥'`V jT m q*ٍ#jRcw<-.+ˬޘ6CG N%_̿þ>P,n㭯> D(nCr:ܠݺWgUXg 2vVv0;D{?!!FƯO*Μ%@ 8WݴOEHJcuwݹ@R m/ ޽{s۷ogѢEl߾^ziӦw}2e /toڴiӧsl=qD7ӹ{ &N1Cf3f W^yoӟZfc„&]}{ IFԩ9huZL&t[C"a֮EVqF 8q"bQ<̛7rlUUk <[ mam`0HMK%8oR5. 1y|yldj{C،`OIzɥ'!0I@iɔEb MBR0h'SO0Q!'ATZȎk"8MGh5apZő XV<5 Vq=yf\P=Er3i̹ēdl~ ,ۻ8{47 t;hlkGDJ$M`5oOvHKeaqzUSMN|VQkV h@h0VXdQ |J+NE<eK>!z_;'ǗN{ ZU6U>P_ՠ vJ7즽>0csHBa t -_9|*}?wpq#? _#A׫@ &_?T]Poǝ" du۷s?L}}é~x9z9o uuu9rq-K{3^uΙˍ7ވFa{0.P* ,, ,}&HvY~,QfɪiU3}tzCɓ{vS1mֲDUΡm"Ow&S1^R-TnKIMdSz==UjBYEoF* 'PzIr%ԕ3.4/~w']n27$pQR4!l`.9\AB} ֙{|&i[(kۇ0l79a4Q8d)ѵ?:KP7p# =]Lhib_z$Dג7lWܟ<^1^C .?@h >(GDoTp844Z85鑜F(. AQT7((C/v_W8PD1  ܊sUςݎ d\,2Sz8sD{>dA%ڋz:tO~N3E!-?Jгg?{fkiw̻!f"##O={6mmm\{ {}={6v{3fظXb?GfϞ}VVc۱Z?YcH\`sK}P_sY 򃽝'3޽@K/҂JK l¢ $ԴTxhj=*50F"*kd8PBCCEG(*."**GؘR+R)|BMM-K,{$&&ҭ[7=K޽1LTVUѫW/;FEa)9'8x1nWf!!!HLF g =L\\V@Vy% iˡҒ̄ FA$ѕ 8x<&t>ۄf">7h9 @,&ޥ''M'Yw99v,ݻ96 Ʈ$[@ɜ߲ ts<{Xm$tv ּ#Y&L&XIqB.gNUA |'ex.fRn+ZYG¨ƫpkWЭq0lѮc&Lz_nJ@DҍpjlW01d'·kFR-+hjS{a_x}Ϧ;u J7ޖ!nˉÉ{H"7_ Ln-02-oX 3cHdU&n YYr5[hm&2̚5 FâEXzG%:*A\b!!Dwky=wq;hZ (}@7 콿 4Tj*^}5ߟ#3d1۶+-FiW.A5~7[B?k4СRIL`2hn8&+-eH:GPq%J=ȌhFq*7\^뼠\n_|UySM'-ɢW PO^R@}q>+ 8ej48 IDATv`]D euެ5;g0 sjbL})!6~a;h sg:~?vgR?nS;7ߤ0MƓO>ѮzLL,={d+q444p]wk3fXOaa!Eq϶Rς PT[g3|}QkO.ĭp:#sFQ.^\JiA@Ld70fJqW5:`M&VZŗ_~ɜs aa7=cXJ f ɱ;0 ̠A.#頩&i_#X'x$84 FTf͢| IdžRۅHgR[[+̍pqRnwU׊VuN& ^zg>ɫ_2y@|f<פLFjX_dK2q'qu21l" Qᇄ2-[ʻ3%ۜMHNHH$:&(s$n$Dm3},2z29n2ʐ!@VVbE}ǧrL<a va]\֎Mjf!zҊx,PIDv}vStB-MeZٚZʂ1b'Lt]48!繮.ީKh4jY}-5p)$Oyh+A,PcMhcj5DD)+jK&"fv ]ײO_ EkרA |^>Ь^˾Z/yd? N#+ZGVUW@wzsgVW:d a hL5]W``p0 y~gR0\$SX?(>f̛wZW]u%W]uZ4NYha Tch'xz|t~?{g/E~τ_DY~^:Cʿ3(I4^`0i !!HMz YEAqw̳pUW3 /n# 2Aa篃5?޺y). P^^NII ݺu`0xp݄sw̧Hc75Ͼ , ((Çӽ{wL&N o?naaa Lf3XZv !''O|*87`?5- (&wq޾gfZ^,[]EB3 $$BHr @B H0q]$˖{p.]ygf{?0*"*x N{f:;ysߛg.r 9y&&&|{khhnbS ;ߧ+W9rC9nMj3q8TfTK&^1ɴ%NzXiUQ;hbYqln  E8U*fhg+q|('ģt:Ȅjb}nO4A.=WhH\O4J\f_T9x;G;ˢqg) 8qw '"2R-T ea`_Y/4b!n 07ǓZK'Q:;Uѷ< a.8wcƹ5S?N/;q 4TɍDIT/*uG -g@[2G{PEdzI%&+h~;6=kA^'?O_\juK訾 ƌ#Ce$u(XcDĄI   pkU:?o@*_m s ◈%}ez+\*hwiI/"I#A< ZKotX `|7c z 7cuyqlg'|: (Ϟ j2v?3:eÿxZhG0ц_!DAj46EN'߾:DlַܸMM|;oDS[WN8INN?Vi#➧&<4D'x1lY9}.&S8]tr~º`?Nr{9(u_@S `(N#|N'o"Ѩ믿05 ^t-Ǽc>)$0 N5,z);QRH_KeȬ9ʍGIӃǪGѩñ a'43<ƠIªѣ?~_7*>?Y җ ZAF  ~ JD=>߸t#K_㾺x?eމn<mǸA|RF]SK: U=A3@yq(c8ӈ\^Y'hd!vCX> 99Otg#􂯀- WVrsFe4pdoxדIDD==H#([@^Ν;8?TUali垂q|d%DEEϳsNn/[F}}=YYx=zz{?a&GDLZPDŽ_GGե絓ɮݻhkmEuSs/H'9 N'C8 a`D=Hホv~S[֯],tvvpc 3FC^_oPI͓ g ķ{11=V͙3LV!t@OXU?b4ذzM);Ʉ!@Td$gbh8_KwWDTpnp_? L[8?bݺuӧϠQv[HGQ [.FRIWرYP+~H;p˿r7isKBf4HZF%ADVd$x- eLkK zJS!-r m Ma8_w?b/z/ ؈c_oRk7b^Y1W$jD/Sf-CxP|[>y`{6ϲcN|A)iArfֲ_lU1E:b\VRNq|A@kgl,Goxo+ \}q $EƮ9D{f?.,X*nƬMXU'1*h{pi0cZ0@mf"eyV 'h.u9+iSMi\@HjWSKː-"hj;G7î@6%2OQH K@IpH() ~55>G Wϱ Ц.8?*اg%|o\>JЏ1¨Oσ@@5xG_]GX(v肜 uWs1K?N/dӲ1k(C'L!̡8DC}==xfOh"ӰYm>θ5$J 102HT$?ˠֶV222 >>#Gx+0[,L4.N.`00i$bbbHRZ0&&NqD% ݌Ϋcppdn7z˅ uj""VĪcgZl61-u:z^P'1-!%!D;pgظk^ּ}-/Q*33grBkoOrh+`cFKy`Dx |/Ϡ֓< Ű (t$wgGí<_VTԲϰqA=GҎF,(E1`(qzίbw۩C7% ͬ|]&ob@Dhy&=#o`ل0/&M,DBQQ H+'^W_#*q (|E(c">a?vJo~.LDN|?ku!)ky=ӡ1(|]w3avP^& ].TTP\TD}}=kjʢ@MM 9Ӌ0QPM`Y{ xqu&!D&<Шc0ww<[\4{*9}0oIJJ6+Ww936}wo߆-PQ4A|ݞCtOFL#zj0>]"s]k뫣ȠQ%@+JAQdQs _\d==`< >OU * `*8X\HZ#|Ҩ ĥB{}XTAw6~Nk0BQ>e?vʟ`H! YӿtP?dk^1Xe0(Q@un^{5**+9 WQ:VbcciS{n!LCD\-z|T]BLL ݻwh(Q )..k%`iii$$$HLL <ϑjM=M6v{x|zY9vZҘR\*;;٩I} TlNar22XyiRiɫƷۙU;դS)X x4+es搖.q: IDATҟfcB"(b4ٹs'#+\$>.?FePo:R=WD[Ǵ :|lW͙ '5 ,p.c}5%C& YC\\K/04pVq22`aaZ> zn"p8jWqd,#oN' c/{)<**eM IJR8c8*@j lWFD/pUŁWi:95LfUpjQhTqU̝NZU`ÓمӧOf0)/CJ;v{}S:ur?j0)\Z0-^ D0;p\2dp~RnZ?*|+?*_KTb1@h.A @Q=V'FA|0RTc"xy9J>Pd+qԕ3 vxE`\}O ߿r2f3"?m넢I! PBچ.vp/|̒|u.Q?@ֲX,5%|<=z{{ء#D 2JTYZ;֔FtL4xe§+V`n\∎FQ蠻~VZEXOd2qAf3s妛nBՒ}YhfbŬ3e͛G||<(v{jlNB6>8&Nȉ-M\e,O~%YVӍj%175k`6PkTVV+ߎXiyn\Df7\jSdy0';ĺ,Jռ}ȽD#f*ªXeIPwO99ᑽl۶}=6ʅr*$!!JO%%;ņ/YXGJTUbl Ε.ڷy}D*UX EP6t9/W;Q C ゞE;`{IP{qjf*0*_eVѣts%ߩ .P`>͏ǩ1+i?As32u۾/^XË!cBZ5H@Z].;O{b[wбUc,Kn \,N^_=[9 ?[ΨP{USN,tI ???<@AA%Nve,B0̼twrJtpyvzI>hCMSS( qiNJrh4R[[0:uXeܸq"Fbb" #hFOtt4\@qq1^}5.\`#)p#Ne[pxrX?g!$o1 K̬Y,YFeRÓOqpS)hNiBVӶ v"bd K\3gmQ_ …S +RV5v+AIq/;\#EfUh+_36YpM}M#OE"h,g-l̋%ߴ|(g#>`RJrG4/r႓Z%(a̟Cx-" r Wr&R0x-avٰ<8C(0[TE;rZ:vn0S48aFBn7mv$=+9X7oy;{zsf]5w;G i{J-#.-[i~ %{"FTz $z,'Mi,m( %X6N@v`0ލ)%Lc^v,HgJ6#,fG{VI{T>}O_%2d/E._ z+>‡D>U2"% *. sp,h~hS1bD^ k7K ˂!<3 Fa %9 ?X|\g:~^v*qC&! 'vFSghwb5JSS JFΝF%&>>={pǝw_=)SG;PմoV(I^Iimm>E׋Jl2SWWǜ9zӰZD <TD+h4ZdXa ,cG9PpzYY,ZyQ\Nj/E4P=4yC9&FKr!y$b,?tVzLu CsyKʂ+QܖX [o&byGx/qYL6 ϼT. :ƤN%Q`\FZ%1w)+鑱6xxi%*V]Dݼ~. f ҾҼ4i1f g6c*u-c L^x+PǺW}wȢ!s>YVXKȈ9ob-AaEu943-= uFkpfd:qK.uy0Dhܾ~ (,r_$ZD^/ߋ}h."mf_/oW/qayFlq_;P!"fGyi#n?`uF_¨svAQ6?z<~@S`z%{hU 4A /?F,Ҟ(p__?F) +GCxp{F7h*.vG[ :tLxUr@/!OIO|Oc= ~o}K zM8[~go6c=)_snN;^B~rW1ujy~C_˄n J8UQ\y Fҏ3U@ŝixrnu]{qu9j2Z:D.[@h4b.>ǕWnDIС8z4gy[L620_`\W\qtʛ\WΩ.#)yɊpfYJj@=(=6F~&Mㆸt?A+6•3#aފ݋H$k-=Wz_)Uoe)߇kHOMDCKD^9on=т19;ir]Q+^Y%0ㆾsfl3OgDe 2HZ\AW˾L?_/(>!@hGpWNp %X["^TP@TO;՞ DžwԶQb|_B`wr$w&`}x\1R |7 z/ZB,dPG8_,PBg/F7w.aZ¬?-8z!VX E[koP ʄ#J"aaahZL&*eeeA$$Ğ?OxfΜIzZ:>$K}?Jiw꺫0 F<^8['>w&-6z1hH/~^ {qs ]%i=G8•+:Ù3gJpb0h)sDҪ㾯1qb>vV%V[Y|yTMͤ<;$wko28TxB+24EЭ4ea72<:k8ƻ#i<+#8r>߆rUPpڿzП8t- SGSG<;>M dYڿ( şmϞ=oXB9,dD]Z`GOs& LZZ(^KHNI[o1ooFAuP2ho?H|;vÌ3HOOgݺu_6'L޽q*&OiӧÄ;-A&V[=ή];12t:=xu%Y%tzN'Nj9/;Y,p>Iڿ(nLN"?} |AOc!c /FPq CCCXV"S1[ BwW ձvZxc#qq,](܋tj-os;bR%!!ӧӗA_tvqlh0gn:J{555,_~.^;ڛnvS&1)hiTr9p}6wdgR!a,9M=z7d!`4-NS$]Ƞ&Z"k`xoLY^jd21)yLa$Dn#yK5kнtZ)e {1c--mXzQ{Ě5T;Q 8w~o&ۓowiok+ʙM<$QY5sgTzƳW wŲ,YG,ߜoGߐxL`ۖ^/,9%vtrpIt>ù⏩Tn(DGC.}!^qA? >TvNs}^p7/ wE>\<&A{QF9ĠqZ_DXg:5j۱-wOU/aL,d! YBf)_?ұ#y(}dј~3f\Ƶb l#hr8w))),\4` 1Ywt:N:ʼn'Xf .(V!^ͮ[ySs{6,]\\DWX*>q R2B/{{E/hj䙘g0fRIdLB߉hIyU6qax#a-SlK;IʄU5O7 A<#}u̙V-pvkLqsk9Y"2r)s:niHl3fW*/x ޕ,&-,,e{8{&n1w-;~̏2fl3K9ߔLojdbb&4!497 {3{W /*|vKE r뮿C匐%^QàkFABB?g L>>{9s Xg41/=!˹QlVj׿?N|"#a{Q^QA~٘FΚŊ_dlݺR Sbe5KXr7xLvaZ9^OuZB7k!UH%8$3&fLFiƮ+Y[h^I.\h AW>k+4H6z:ZWkb'Ŀឃh4Ȱ&z +y%9A9'7_%X5a2N,l|3wۦ~=Eł$%^L\Ms(͙xOȦ~BCs,{uA:bCtZY.SX[8C(1fyLj'_&B((r7%Q\]?߳@ta_NѵM w{f{,BD1\ 4G9;쟀>#;_a}Y0uQW䇽}]C|}'m)^E:ājVӧ >\x=ǏgʕFNNs<\~tGYYY׹ܹsٿY2dyuq)nB[j/m$G栱$TIJ|}@? g5% 鱥oҥKYt)z=R @[{;?(..&++F%>>+Q3_<6pF#ɴw "r \N{{;8k GYf/(qR\R̈Ù4y ǁ"$)fk,IXA:bPy.ۮ*T*$IBPb6r LHh3 s[OXh~! ;kh0Ӳiz*꾇P0&&O,I'R*1fݸx^{y7\)9e@"R"s}1ƙW%L8ن!2G!PT(ƀaXm&Bh 6P/z,ه98Snέފf#˅dh[ ߾sD̵#7_C vOpF% .0MCOEy*eDEːˡ"}]v^_?Wގ`¢hUio̾~,vhmtF[DLb?dr͑rXSecKEכzWzd<(9tָ[EX&&vQ%ՑAbRz4@Dnc@ԄJLHHt!J"NFttN#I闞Si+>asGRTTDvv6θȏJ}`v,~[73.j,E"MY&618 BHh(7/a]:gwPPHD{{;(#獤:y'N?#FoBBi,lFAYٱE1Add "BSH#rpaonXA/ΐYY~g5+ ʲ!"I@o$#5Uп?sK@mѷToOA{_" ͋ 4(k^(͔(x ΛV} ExK*SdXI``AK+lq*Rz *4ONY]1FE,o tƜCH֤+S.΄ MNQvA c\C s/MJ6|BZIF$qXH긊C.`2avmng5h[BPI,<@" f}@1!z$y oĀ9:.qz7ϔS{]>w3D1`}Aw![/;?2 @O ާKDwo4s7_/{b6yikk p~饗lr.po]bY6xnx0 ^z_gR\~=]Va0C#ĥQw5/5ɯWz[ns{tnmDDD4`bjRSٷo?&Lxj H[@ jO <6Щ18hؤ x)mLfen+TiH!;?\EK-<W@chY!4'3 L~% d(NRt3@VkA٥Έk #{3ݽnW8hO3΋g}P!`q=N?} N|8mm$%%a2ض+L&xzm ¯~;V+&#J-%<=iVKCWڌkI4IhYMc>a+/~- =$$#F0`y EEE444cqqq,^+=44{ꫯ;}9rKwy'QQQt1rH s=`ȑ#tq)Q.EL%4FgE ZzWz ZΝv@ `@8;d2~TLcC*gpqVod*jȬY3INN;` h\<]&۾<RfnKeiXMD]u5555ΆN؎Jq*oerNgtx!EVĖe+23ӕۓG XvY!h u]΅աLʟD# f)οH&TahK햱ܿ`;H WcB>AGѣ;Iӥi#X/G}A>~{yQN9SѾ -+riCe'ޕ#+XaŌMg&_~9mjZ2]7|ƆEUFLsL0i.Bʥ~Q=ϥ" \5vDk7~ F,rR(:c8.WF!b,vácWP d+ԫ(8\[3ʋbY'%6VcT6Y(]YuLIaQ H27'"xʾ{Q+G0r@. CIXs(;ɭNBQΡL"` 7L- oA8 *%df7 {;9|)xJ;"*oI} ٷgϹЃA t'zs?@l~< f~yב>fyW{B 6cƌszM|C1cFmG] F~s ]gΜ Kpp0ӧO:n֬Yկ3J:bx;ag}`?p 1B20~R tttI\\`ܸ]*3fR(BL~ EGGV+IhZZP~[oOo):w8 c6A)\:O`lC,gQ^Z'|w܁Jbݯ  KC (((@Ehִeh:DZSQt=f^˛͚/P(Ƀ64jb|)0-B>Gv1Ŝ '"@w1-h9.EMFkd70])=SaO482oiq7cQZ0 :fd=ӡ&(9BGh~ v$c,̻?}ۨ6W]؎qa'a*#c^_Eɓ>h9?z)[-h:rp5Stidq3=]18Nն‰3p4;latj:yE#kLҌ8/ 'VYA38[&]*꩟~#\LLSn7e;g)ޮ$}Z+nٍvb&\'MGIN}4Ϛhnv£GHމXKȚea\fJ[? (CBQgrl^Oe7qQ'P6J*',- T oO.z=^@*-z gWx|ly Zvv#sX_ =@dr|B$6G x$Ng|%w /[?@vɮ 8o{YGN:uv))).'b';;G]\>~"}c^+_0\] cmT[R^܌446bX8q\i?TF6640(9ٓb!11f=&`$ PZZ[ABUU$&&G& dY2233ql޼Nn>M,)̠BV={F0ο]8=4'BNr+9a#5|T]cy+zi+3nG{h`Y;1[ٲ C<?ɅK#ۍnsF>Pω󜺆 1Di8zxMߨ+I~ΌKI4'6$&?n I7Pwr(̣*z#<}s'd|3WX T.j"j#yW%YsZQQ f&~Lp\dC8ylBy9(ݴ ~UVCUF{:"C&ZSGo IDAT:xHyt,bz#B'գ?FД2`/8 AQJ];7rj( ..bIvLj:b~*| " *2 S%wq2ma&l3E॔F<&ÏqR&%ep'6+YЈTސ~P7Q+_]t'K`[Mpu :<ܜ 78#ts}7tOwcF {?6/7q"5\,+M=uO~>;NJw1;{X+ Ŀ{bځ0<;q=L&ٸY%kzm̘><H$'Ҙ8q"L /LQɿ|D$QDR)JTT%o!,5AqQ"Srt9yW.f3zhpG3{l <^]'|B||UWo݋XÔَrtq:d12"A"LK灱L_vou bxB`a3OCL,a6Ֆj|qy$'% yP NNhO` GP I, 55\Nlr2-#'ZƩ[(7a9mOI񭫈IhlI3#o)rEQYre 6}{NK(*bٗ[kneY2L (Bt;^-7[I*Ɣތ-Y)`pgmZa{=Ӎyv˥yZXN}<`RJT/WH?Iձ,m_ "^K3%\fYt̽46:l"SfuK BBb#dQBjswR:d4jG%sȍ,Бɐ}44il#9ƒw&-QߏdO9$pE(x~ޗ}%E?3rz߿O͙|_>3dv/p&ܢ wH '?25u[}7]..E?@f'<^fbs{_ "E ) a}Ǘl%PkRZhDPv+u]򗿤={`ZDEEa4Q$EŦ&XJ BfptAdffRQQ [< %Jjjj8v:\)1Gch00fX}>l8a-'3mP':ȂNp2u:a 1"?Sq8:ͮ];EyEI*R/sJ8EOhxgOjSRV63y2_#P$C sX}-oO=zt:ID{,5@S 7.`S¤P4j;>G :,?[Ѣo9bWa^O-Q:*[; qBbb"YBJd0WxR3# ֲ(c ߋl:DEu $"ĞD}h22d{y}MdKe̋N爭{RLs. B, qn>, 5Oaح,|?;Kz?N^`* z|) ZYrbi2^@لxran` q&@vg'd]~ Ô,&s|N@>Ϩx-ϳG_?3x|ߥX|ͲnI.es[^]|qY`8ޥK޴Wz6g_z0 $<.LJ◗gٲ~ Uyɡ;w""!!!$H8ʏfnVtTVVR~8'>洲[B/C#(**bqr]Lr I n F󩚡 u+G鸂+X5eB-s/Uw5y1P{++Y$.$5ȐH ͣ<~,F!kǘ2F-YZb)O\@{{ M!N#pjh;}B JwU6}(';w7ǦsݧLwѦeO΂#Ox8y唳1&rW-~Sj%[:) Laq6y3қKxmu@[,493)t帽 v㔣8آؓ4d%H_(f&lY'1Of-1-`:L2 {#XbC1a>"ca <:D:q]m|Ux;=}8U @_=㯥{XrDdHpu1rI#~w6<)DD'8u?pmh si>Tн ~86D78o\]_jy/5GZf;Vh6oe8k" 0< L+l~Gi ql=ɚkiXg$71* T‡G6-SߴW4QEVfgG i[( 9LۀHvƲ ` h,޳F+'hrR[/Ϧx,|a `XXE*na*NՄ:JЎOakxOs NJkr[!#RY+{'&2rлv>gB@t{ z(z*tyTK )9K xUnz!:K[_hC|i y|^*P{x"=""|EwIr,~e%^}c N.mJdd$֒_555dff~#}~>~oazY֭_ǿ|SxT/bC .;J|y% rihofHNv'GqI?_w ,Yk׾Bii)@rR25E5IBBM]}=:M6aZcS<)S$s^)%G'ND'yGP*%::ObhS`2SYadGlN;5+PT) !(Ma9Ld]X"""(C>MNᇅQUJ17P_~>SO= SO>믽/ö^KA ?s4BL&fʁ?Hi,vCJI مp8p:|~QQ4751uDIbk:FmBb޼lBBen,Ú/pǰ ?jM.{ޞ"F 1Bvr>JCrubGrGe2 \2hF-`eu 2J*y) *~p@PPCvlDQd}&r9^~Ep.ĖLqSLeMr©j==nnG4aHD6SMee>LT*N8Amm-mc2LR51:<i:V! tN}>[=)`у]MC=ܹ˗ɭ-xօܹe˖v%}K (.-=󹤄.zaC `t;:WzFp[;?`3 8CX4u_o#1dla`a!bd$Sذay7JnLFD 2Ws¶+PNg:1}9 -ƨѣik;M_WQ/~(pPm@~Ҿܼ\JR~*K"dq.gn\"D Pptr9OQl,dCPʤ4O5kP0r$.Z-[nEGӑO3¬X6^4( k?M]F(&m".7م0p׌#j"w?2ͮmd[(N 85a k4Q ނӕ_᜴H !S;@Tc [}9_LfL0"x>{/} A:2\~ t'~U8Ve B@Di/2\$}t>?1aO9}t'`,=n'8 NwY|^+‰ٻ7*`PTݻwSPPЍ/--t*++Xt)cƌaĈDGGt:ijjbܹ_z0_wa̘19.wN]\>~SL&;;*!z_}ӱX?R;pCWzB$م߇i/_#<ێVW2v$Z̖{a455Ce߾3{ 6ZI>:biV$Qdt1~\_^USד2!F^~>>Y̢ "; u%Qw$1m3[PPq97 I|$|ʛ >uUɶ)˩|Aj J[E]]V \Nz_|%KO"5wb f̡z+VL5&"S#401L DsC3"gЯB0N-?`l>^O@Vmۘ}|6Z.\G3V>e*/żD;~xPO$㥐sM_*~M^/ yEƯğC'99Sr秊P<GW??.ٌp$O]鷟[.l"K)`ߠ0lF$ ),,d[f ־kŜh IDAT- &n0a+_`0q6#L)101ؑXFR$bZP*obCVI>?deWӘ;nˎs37F2b}F!UYdd_3hD $Exn YK|SIռ@Ce ONw[iug f/ $X=Ю<LJNfL$O>A :7[2\lKD.4~{69)yXX`Z<]#07Sqj$ g$WԦA4 K1շDjQ/d2WxOB>*b2-sHS>śf9 &3>ɛ p 2JΎq3/R@YbLMJw9ϐ}KXȆFfb>폂7î"ꘐY%ث~hJ|R?{[ ^w `|H(pe-H vWXg{\{pMdxnX`p{w@!P?ǒ].\}`" (--n:DS>::ロ^z ?B6w\֮]!|}"~n/Wxa(<~g|Q Ǣ! Y>a|x_;h-1#^L@۶IY4~J @i7;{o<6$dI.))9~ŋHĖOxL}^EB"\IM}>(EƉIG^ @X1r?| )Tpvb; q w+hG>x:@IDe{E\ND|w[ŨGب /O~,X ÇAR)絋.N.V+2(={6iiiq>8y$twwcXƜ9s;zR ^?ny^?`Iu ~N@Bep|@`P-P!Bfs:/h|<̊#LFɉj3]ؼ#R]unl6+ݘN41}4g`A"aHGwU#{QkI,AEu(/op`~42 q:4'r|3x|O=ދ;wj'4ٝ# dS@ zրQ+i Μr6v\mʊɄgye@kSp{&W??zJ\1zP8\ZEE{XYף0\"#6N0Xb.gHMC؛+*A ??Z.ȃ3?~'hor 9#'ya>367hҠuq%e>g2\wwh}a)~#_g>#X83!B {A`,X@G!(++c~ !|č-#<ǿd2f͚ŬYc$bU({?_tQ,d!Ὲp"lp@֑~_{ AЎ׷HSS#aa͈b6P|]20-̛Wɓ %M:-AUo )x<Z+TEek 8rss1%zj4l6rrspAFQQ溺 GE7/GK :=KW6R^Z\*TJFQE֒}w6aj?rW9 = )+-e]:{0E^MЎmlm ;VS#p s9>R3=fbj61mgT9;W3bi_qh%zryU.o7S)ht< CU7cx1 wQcf[>-=H}>>~ W^2sn.e8$GKBb[z%܂7ܼg` I7ʃ=A|cvҺgl49cnP:exr#\+gʽFc93:Q0fuȹk։I4fҨ&ӓh2t[n?7VVrrl,᛿}6q<7ww/]s4)QFQ,ºz393إiصsy;IG^ǯy0 bPj_Ϗۇ&zp W e/|4]_&S1OT3 b@8flAAN|# C|_Ⱦxcr>3v H>_m> KBB;b]$aÀEwi @q_j "JYt:<W;(~9~]?MBkܗ%#Z#rJtS);\tbPxC2,Dz"ٽOaʔ):u}h4a V8VP? Q4y2 ՆY0X~OYռII©4US-0&#86&?"S?r_BB/"^_S[j@ "V=tB4 }!~ǂ X-n:nO@&AbҊoGT(B&2<v9S 2Hfw7D0HǍ]fE@{N5EGT~ǂXɓ //+zRS),,ddgg|Igg'٬ 'uXlRm"(bJٯʢCv 7Ysc!nDrh0vf(eRA56Sm.08"q{̴O9aƄ?~mjO}Eʢ 7U*[Z L.Jm2 #Pw .9vx})zM#ۭf*s0#i}kcz)¹FIs1q,8:qߡ+jXf$#GDF6y33 J#8"@"eCd2zܗ )~D~0XX5Q<8%A‚cj)A 0dv/W,&p.x? =~qDlF]F>FgE1/*]%: {9Џq^@L,d_V' y:5Q\',ݿGtLܹs:]EY,DQ|jkk9~SJo )ryJRVqfRGXXȈTZ[Zh6tI'WdH3Dg^(3$[^^H^۹b5bڸ>]Fm\ ^w* H.&Fx^xlL1AR)XF h`;y?[%îݻ|c|=Ci$'29ckvГǷcqe S$ZbVʷ^ƒ nBfcXAY G^;JM%蕅8СOٛD]n0pWZ^c];yU|ҺKO'Img- ?(!%r.]`W ts̯nSۏv8mny o9l+n߁.ZFWE5mA.O"~8,\J|^˔ˈwDӠwվk]mRp gqv~ HޛN?C !YgɁş 7d`ӁObh+dė{B,d!ZO j`; 4w>ƧN__V+ #&/"YϯֶVRSSh4heZ{or&2Mx}'7 66+ƒW_LB:;S,k%9=U!/rH5͎\a0h@+6TOr4i$ ވ<w&wdôJ_;K3Sҩh>SACE QfV sz3􊽨4* +HRs/cV;&p4sy# 7sl)kƛة߉Tr VDoԣ6*DβτG 1c sZvhJDG]KSQjޝNVI Qa6ّyEWM\I0'EwQ[3zinͽ{C\ xĠw t~yfl$Srl#9 ێxb}_ Qg$XgYMN?+g;.~!?/¿׍G)]^pO,d_L'Ei2߉l4`}B :@MQ/[FxDW"''AOtL4m8N>ܹsy뱷Xf [%gC:]Cg ߠL fь{zO=4{|W>K%d{OVV&9q9ѣ=L oBw f,EPzX,*%9bKPY]ln`S&4Kin&7dz"Ո"e)$u>#G8vK*XZDP,jfӪ(>ce'ם=f]sp>E rrmE_g| AN.FCXX m'=iӦIgS?r5Yüz*)N}H4MeG ]DoF@k4;3ov)IBn9B,+.[,?~;*<@ëEiJNu`_;_ -Jw;00ǿ eld^v=;?7 _iVU ֽʄYY)t7!m%ޟ`44KG"U șxz>SzG&BႧ6 '!^$p{7=P/JLT ɿla 93JW-3P0eȾp>V3Ư L4 ,d\-rz{{ٰaTUU188ȻヒgL*"ᔖILJ#x9y$sW-mv/!ݜD5{5DHf#q kҒטGrr2G֪9~8щI%9Ny^]+,gɑ H b 6 RIdxƨa%}'C\iJK! tӔ5‘@µ\n$jjY,Z[6'SVZXRr߄bg14%^2;gt1rf[nnijj"_qO$~,F*0Bub!5i,6âgeR|k!QºqFЋzN攣8܍ڌ> <'YQ!z`>Eahtw%PG<w}D +9{x6 9%DY"T4xRT ՃH8늂u"_唗^Ix+ v GޒQOϧs{NyS 'Cv;\.oq\'^by%+ޠ]tqpp{ 5`QJDrg^-T (doh8/MG$ ;r<NAh|`46~ĭ V|)M`]sD|)qOC2Ĵp~KH3 xE~з}zv?{>bl߃ !W NQ{]ߗg-\= _K?V]JU$evf7 !|ª `7h8LNB'>d! q*|v'&AX<=AwǨ`6Bf3. \!lVfbT=XjF:Pǩ9pga7 GVcZQ*,^K.$KF(XFbbSi4v0g\}=EɌ>E?W%|!j~i-}TnmZ%u%ff1b ^^>*sVq |v 1h{ Yg 45p",_ɤ0*`ý8]#MJu |,^,wб8_GS'S(bg}>njCcEC+UD%"nl6GZj{vaOZ=ͬu1UYytUpv5L$ܪaX2L-gCEإy29yA˿fN8WIrz"b9)9A.3ESQ7jKk"©J#B"Ӗc39rP{Ք({00km))?}l&o]YP۸,8{:u:J3 jYP+tjnG&Psm8]M)%J*I5-cvg6~G>G,%go*Q|tvqHi"4E"Z[1z >vfq-*8P@pa0p|uWJ|Pw`t(,H#Ex-pihJF<;ϪI7S5uʟG?" PN :R}˽q~8?(iQ}7Q'HypǨx2 ߩ\P㋂Jq]89+2?/ 'BJx`h``p槝Ѩш`J#@=_ DC!'WB.!AtDыquBBB4vof8H w.z_Z0:f,aӦS2Bt H=PG /s slgVe~_|DBNNJqĈs9zػw/ӦMCѰb l6###L)Fr{{PNQ&ˌʣb^x^,]J8N?ll6ߢVUGߊ^E*cmG2K[TUWB ^b1yY#t#H< uĜɟ~kN+N~5C qx/Zaz Gyfvr0;mJu2)q{&F75Ilsr.Us\qN7s"iCl2pn9Rxdb7ǚv 9+(Y&y8: :[ke[ןNWy "F˲VNKfir wqb{MM8s4qj*QW聫sh *5KKx{~;%rI3ξnrKǙI^S](6Q290uj'(hY'nr4#\/QbC7@ :y@ y{!x rn'G]|c;p2`"0wDO@$/oк;n7)8\L_s"~6+߇#OK9οш  F^ߣ)7T r&l(℃ 'p4D}%''+P$jihh BANRRRPqw~ !uktTR.]7@6hb+W|s9΅sng%u3gonT1TAA$|3ф1o_ `?MۿRSgpof,qA W?IgR7_)|==s9Fw4P}.] mt"yH͝:! Y>[Pq`6g>酦E3gPXPdƌ$--sdR"#"hmm%?%RAoГZ^*^2N ,\`8kFf,Mf- \Ao %5ɿ4t޺g0p{n6#"(*vp',%MW@-jgoaIYT8xB} ڧSn*gʮSĮ9rW(TP)<\Bwwcwei8橻(+k1Υrb$ |buѽfX+Q*hn`mZwWEqGRJR3y'1m)+s+mf c%\~ .5?j6eRXGq8G@`>Ir F6F3LM ~ȋ?T%bOc?KqE]O<.;Ξy:쓕:pE YBs\L4b O > ӦM#<\C\\<##&>BAgySz=:BB8<4 f!wq"]}˧]t(30gl, 8}CJnLJ}}=cW(4 t 7s#EtbDĺaV6f̘ #3>},7>WnDD٧$i9U{8qt$ _Svvw; 9~xU/,w첳~9/.AрǍ-F$8zLo4(lkWq9~nx0y$dMIqQq}^dlڧ Y ߧL&Bb$[TpQ sxƆ ,D$k߻@=QT)^p樗yك?/`cRSexp""|q`X^#Ll`?! r D"`PxSJ1s|.J^O\߃Yd/>TJb4vjma߇,d! A'6b`* ׿$¨p@u;@r9Z+/uotnfm7NG6L΍7F1?oc2b<񠑧_dd&390i$ۇNU? 6`F 8$4 7Sɖ')H 17cO&ݤ,#o=A|l6AJwfJSމT*e7cɋCDDg3CZ/Yq۝flpUi*'Lǎ刴ΘNl6RSS:\g3h+-OתG7f  bg:lxem*%2}! ډjv=ܾ2ݼWѫV4Y8!gN5te\:2?{F}iK3_C~d-쿆WGOg qIe0Dcn̊ -la /?_.BKs/Қ}ABZqp\fΝFƝ;G֭4!5 _-7m5wVIaa N8ҩ$^O0dLHhMqt9^>M[qEsDQP0;T*Z[x~,wzpY2՛B&|sh3=:yv3~"?چKw 8t`?(֨ill$55b{NcW71Q?I|]Faa6izzY]Լ^ˇd~I,O>ɓ^GFFR̊98p@lӕ2(zhmZVYϳt:..p*.MVKB. :0ޔTZF/GV.m|g՝EDA?BKfv&g8`k8[ kSQF~Ny=YYSSy?Ǒ#ҞHq`oo!?G$?IEAjcZ4ԲtlmDsFF8C 43ja( .=S`l.T/F5يUeC=OHD3s{; 2FrHX 9Gb)$.-EzP0 `@pq0Do5 Gx0Tӵpm"𹐟>Bkz[O ' ̐W%,O IDATJzD2$>D @ ֭[yPD-'=~|dfW.ߑ#sh}2V+ ].zaDqǛ›pa(4&y7c~& q:)i/!U&&MSx,4=LRt2u\_r=QNI'12%MڻֲļkҴ `Ԩ  4w6QoqqHHbc9*)w,kƢƚïI^ :'.M:]-?қb#cТR*`}b +yǩQt]6QKTUo~΂ޭ:qLw6ʆ6ScuwQnScX[ƫ*'U-J hzJC%cLTijM9%Cb8a@;Bxx>`#Ngs*u<@VEnc"sVlhӀƤa" G5{   zހbEqr y pCZ.ޗ @-]j@iLb7lnP/s/@1u!G UW5R#}, Ȥ胁3P~ P0d!c p^N_zi0Hk ]+EžЗp9zLk HePc-la ۿHҶ x^z@!B+Sh8hA;5QŨ0cPiwxo`WeaaӇ83jyfK{^dyrfWcH1dn\ Y*v1ԊTAaٲ=yۿ)cIr\\huPNUٻZE r%r80SSgGܴ8rlUle-S2[sf\NMW !-]ƙ8w9l64ۚɈ8N#.7*ߋPl|Eq5vyѤ7jzjMx+_GLf $.MH:&PTnHKcpf4lY)i7C8D =(z(r삝tuQf]r@P 7</G@x'P*"~ %}@N{>ύ-'V)۠5o0:;c0!T2 P Cw! zQJ€~AA_@ @‹/*D(BfuA><7dШy:q AOo8`#}J/\]suCp4I+ɸiYXa [ED`.04 P^^Ο23̢)SPv+o! zǬ|96^l4z Mkk7#FomfKT5CCyOxd} )7KbV+-#"Ux b%6Q T(6"W(p)2Q 6j5ӈ(JC Q'N݄mtW_- n=:tZY :N^XvMCj"Qt(͋W7F9E?zc6ө{y|wyd2"&D|Xk=/ xZx։Lh@IUuƑڄ< 5('Xo΀!?[(_%t(,ŷ_'? :cGIT%Mԑt2bi]4i0-6ȵ 'v,{O?NbB"}Z#eԻɍEP`Ȣ!Ȑt dʳ =E?9sI44"'ihy wќ:Vn7wg$+. uIId3oHaa!k2D..Ec[9C]*: ZPD+F&l6ãm_MCz\d}z]l\#C9$$Lp(hlΨ;5#(?44*c*|!ŞEMeӑAr^ Nέ6Sq(Tg_`#eNE`{A }`/QQu1 tN+y%ϐ".|!p r 3CCC =;x;$_ X/?)?˃?k~CC~o)/* XtӑБC5;QFd2 Q4**d-nD^'gWFwFE->Orrrv"d:GiylU'q8nV&Ŝd);L@.QWWȅQ,S,CCI7Pm&U\SdCUb'ɉf0vY;?/qɂɜ:Cv~x6X`#v]LTo~Å SRŮ-*9eE+0j" Sh[NaŒl|5u0@UĨ621Z @ڶ uЍP- AqPɂY p qhFtWrcY}M)-a惣pzibHߓʯRNn2׃B2JkCݠ@.oi5ho`G۰W $=}zPP;C߽ t! QC(!Eoo#Ypus5ޟ{6l(6|rB|y񓝠pmY3>_Ra [>?@ɇ._~D꥿A qRAii)-&_Y|3|t D fu_t.qa\U ^2媛mšCX^&ɤS+)YRF, #$3)ڬ̚5 ߏA/Dw7U![M+KQcK8Fcrt L&gL2h ݚ2L&ɓl_[ogXr%B-LYY},k]DuKΰc!Kkaa:;owG3YD )=Y}%-a$[aȹia<̘Q7=FÉ9wѪu  "^6p$6k6b j6;@bTRha FV`5i!W!SAoh G]wI;H_&gg.3׆.Le]n>.lmT::qj3j|pJ O> +81yyZC'}߯|'lT  %_"8vT1]q&H8Cf1=QQ{ɊF' nzk@O6HcJ b@ B~rQ,PbDYC/>Aaࢨ#y{%# J>t "J0~G[Y+}ij"9oXOYyD}iAvCv9s:ˎC?C /A0 zS+6hPH$T!M *j_=ؑ\^66lZ")FXɷbC'70LLIMM kzV̼2 嫮I(ɿJTV=$IĄP:TpmN&Lэ[{^:/dvb8d(2,n]8I%\"x/V]4|Ԭ1u%Lb|8[(ܭLzU`„ UnZ[6[ývP Xwuhj,q8wFCOqĽ0 0֢alں)NE&&4ya2z6Rf% SGҡ&|G֬!B2쳝ܯ>d>z zVL>4S*Fl|W3~Եף譶s1Ϸ}2Fa356hC@ݩnOu@Yv#^"OtwY5hnmC+a϶x!L=-+lpcKa; +%~A`_JP_#]Ao"!h*S(*i;EO9[CC{O|e_Q`w6 r~ \9o쒀+-?X" 6D'aͅUy/ Mq[mSǍÌ"9V [E &Ef WA༤GAr/&h٨ /ۅ 455c4%OJXί-ƿOwG7[X=<9/ MDE17:;t(ȧ$U=Xmm4'4S&DE6y%ԋ _]JFT e ϙ_7)$33-CRhIlvq`L^t4ҊXtsj.ٍJIܮhoLKiJ޲N&QjtԜ'55bɒwKJp#Ez o[Þ(YjYN#!(AC˅I͢D?䎥f|N,M᳇8{i5iLvv2͌+t(v`s u:0VmY-q{e# -cXKl ̓Ȝ27,o^>Ξ=N0r%~,MyڛۡhDfXэ1>wzw5p'9%,hO4G:P,C]|T lM7s<}##A@b߳%=TTb|^xD~OWJ{_LhEkA?@ "hewT/z >+ҎU?ۅR$!!ݎKփ^n?qnܴe?.?9md2n8:i=N#+*݌G^DQP,/DK&Ъy@r 8*N0l0TV&QQ|prs"mQm]Fb)SDӢf8&&Ne! հI'NX!1Hw!vp *iB4؇ ~ZlI_j@E` ,QT;>EU>v{C!KT|~0l0e!"ChKzxBDN,=BsJW\pl<_b 힕IyW*mS$yC6|mK+"$K!;'k@2r/:W_}|NIÁ$e&n&i:zU7EEzғ2'+WzujrzsmmvKyEMMM}xF-oAjAcyn)笣і@FEQ| hMoEjS wxhhܜsϵsÐU EvR_) 1v *(G@tt>R}={Hi9 q4SkIyIG~҇|Suܢl? Rq IDATIUyM{1FcJީ5c8-2wHcJogRTE[yC C}Qñxcxjfxn,Ukd-v3,fĴMU/~<60n94IHhb☷U{;W\"]Źsؾ|ٜ'dɦssxyꌚIN&5J4k.@m<ഈXfF45Sd$ZNu*ҋA@wh ._tg0H^!jC=~iLQ@<@7`Z/0X7G*`:A샞``S:7gqu.#o= _e3dds| W)/]UU@Ro}_>닫wakoBV?Ƿd~%0a@z.9`&O6NK{{ǎz$Na$-{2AƉf{%I2w<șmdHq*fO`7x;- 930W5qV}EoVr3 0041(Q+)LΤΣbi0?kFʼeO2/޷=TZ+ӑ4q%ΡFW^bc\gWoq5QQ|Fȶg@O/w8}89nL:FfO<^JUԦ+4myb%/1o[w8M].8nF@"O}Ӥ1G^.45HfZC=Nms7D׃)9=t#G3ߣq,q9Fc,3R3ho ?}!nc,2R{ڔ&fuSՓ)dGuQ .LG[a/ӹ(ֽƅB.*b {cao vi m*Za\D }~=@zCPA-!ke(q >I0-㡰jp" @1=E~VEMJ"<\]e. ,ÆO6W9NvڒCSpFE?KYlo71O#)uGPƊqwG!Ɣ:ټv3FO5*]IRxKynwHL=bGZ9r܈Wew!UP,ꦴQtcc8a"UeUEtu:ZBa!6w&.:U3}e2e\73(++#9>H v:?={h5:qB=Q Syq4V9'6#8V?<17DEVFEo;5&ֹ1 ޸;y=u"gGC6 ,10N?fxvtO]NVcZjA>J@oӓmv448뜁>6&^zkrA$wJ* ry퉀D-i%hNj ?N!-;Ke!1((?CIF_=pFpЖD~/}`?$bt=O?bOU!7lרv ^^\{tR߾_>?w.ka [~x݄MX @G˴ *Aj$W˼G9aӦMO/&>*sڎHL%NMD5kv2sL4Yjz XNhc2rձo1^D24k:zQ'oɧi F wE5 j~bf,: `Dtvgq8^S/Qa|6 &g=5Mv.43G%11܂\G.R&' 'Fq> "0G>ShkŅ&d2r D ##y%'uJ!7/ZZQ|<5jjvq,a(d7 rK`Vs`^h.89P=x( FGqoʅ TuVEG,e,n1srha,q֮_KZ}Ö"q;{JylNیcd PlUXl:qߝO ^͟DŽ C|.5]҇ϠAD?+EG|i5}jxM~uC5_׶n}?A(LA`'TxU?P Gii)yh}>OFړٷیw6*'~A6;>rՅ:EWH?VYƤ |Wc,yw}RI8S./g [t~CSE $6s4(^3HO$B; >>pH~=I(JJ'GP ;":NsT;.t :bPZ=TVʸ,Ps#;ș=xdxin,#d3.6AKO%SQ l<= g2r~x7?h!J-9vKQ8Ilo{&te9{O >ѳ dK8a&+)ڞq{s뷢ѡ7aY餉Gjg' .JFt;IJ{d;(2rWXCF+Q+vjldg;v3i;>V[fAm u(`X+DE^t_. ~; %W@\: .4Ҿ!f ;#a|Z7@FPTC?!z[L[$VZgC}خ/Qk 7 _gOrCLR_DY2la gok) .G6}lhUCri1}j"(\*$lDi`S[WGDv__EQٕbES$&&ps(J4]:r}7Q)npa~Yc\]n뻴hMd0[i~SSЏ@[9w?%FII?~;v0HIIh4Mc-x#}vBgQWWǣAǐ||on!\Zi9®?rxj(-Us7EC]D'Gw"#کذqH<ĺQDI&1*c)&N`hPV%o6!bIٓTjx|*%SfO畎r0.1%j .FVtikw{IKPǝ%o>fdJgw3[Z"{[˱u"3' ˵5ad54pOVΞPrr'su  +¬$+KTpy⩭1]4m]a${OC>ꪪWhwFZb0IpC_7*D2! @bQ@}c#4瑟  Kh4K #B#!Dhav !˝ңK.v7?j_ /aǟ6Z]#< l^eŠ_W+J]?Wgr_v=~؟pwrII<<HO祗_&U=5㗌Nq1D !CPXX֪vx3brOaZo1#U(lӠkm5rf1QN# ,rn_/mc]X{zŕ$BGw&dKiu(( 19FTJk$3:w4iy\ OcdA%jJrU( ct$'ss\z-46iz=(kȍ lVC"; *[@GB{G+#N̨ ٭YxU>No"!455ɗ1&qhiI5яѣipuoJt؟=JՓؖI44PɍzhZPLɆ~GC)']6xT7 11$f߄*ƀ&+nӛ{5&ÔoW3Z]]?{.C&v6BB((p+𝍰7(iqj;C9E @ZxKK_(^jh6i̹cCaB;t?d?yg;DDpIo`%/ÎxQPK[I>? 7w2I1Vh6әdlhlFeTǢ6>GV|)1Fnr抜Dp&=3O,햳4%NϏY=h⛔Om7 R)SaY`ģ"cW+T_nGBU?.@ ЋT4coKujCIHqA:`A~!AWп_Bҹ84h' . "^,A |?qH{@ @Di0$a4W%y79 5a-"la ۧz9! }@*@ R @yy9oyg`YI]YY?)++Ⴑ!V6ڵ$'Gx.f Ϣx:^L\C Wpd9}jSQ-c2\. {٫2XN,%-Ɠѵ6GٹV{F|cI\ӉlE0FƜHLglD,e)0 Dpf*LFlU܌F9D|~?dWwD^c㣪LLz=$*#"*[X~Ų HzI !Ozd2|xםsosy>O1u"NK\<Mqm\OȮ1#.ei9aQN3(ݱ{PרYq3-`~̩SHRV %_1WHd(XN[xM?'w2),0"! Wrý7jg 2!I7ß䱭GO8<.Orll|Bs/? T64B^JKxV,#&_-ev%ObqL_("W%A" X  J._:L7fߊ Æw9 wbܖW<ǽ|u>-蛼C_Oӯ77W`lF&yZw*4_*L%Vz>K߫WH{/v->|/eqŞ|ίF̿ȯ?1g~_]ݛƳl՝{ > w1t%t =$' f/[9a 4:i4>}Ս.u0ұ0o͕Wb0D8r-׳XЛ2i #?Lw԰tu'g|P {(䓄YCjI2%-8ȱH bGТhi7yX(O(gy<׫G.318{07C ->ى4G!B8aܜcOsZ6;>`Gb FiQ#^֙2L8Tkj9z-!P#dYA?{}ܰ8 7ܷA1W ɌT*md(ҭeYiރ*HT WzBD_Oxb9L@6%Ϝ/qwYf .$zKH? Q"mu_CҽY}{}W}Zyۛ<5q_p[[]`Y.uHp{=!)m+>ȿqK9^^^ߗ};^<ѷ(_%?N.|}*3$ˎ |n.^~_"?xdϦ?^ ϻ٫ ]o~xm1WDz'lY,ϟ{0~eF䎠UVQ[R%++e˖[v"ĉd4)J"[Ylk\Cħ؍S`1c;QFBXu@(bE* 4N˞g2<ô? .d2XqNhPn`U-+งÝ8!s׭ߗ; (D>x~<ך=6==GZ@7k#H9򴵞uR?_8^S(΋0DLD}5Ո_|]}߱ou%0hP{YMF!s~|cJ 2`VUx :>ʡ]O8Kr'"""3`O@ &9# @A$y]"0uh"6+^5njFV0\_d IDATImy k֬G} R/D-7a6}[SmHB0&+Bh7cN4(0D#{8 Z71|,5knD(،a !QETVVb ̮Ɲ^u-ow~qdA̛/do-&I`ˊ{9wkEs"WY[qnK%M3'B3"p㑇xVS낸s] m-$8=/1cFyyy]KneDUPDBG-ŎX*F]&"fx0G,aO__杉+j'67gQ-8!AXN&PJaab,,_?-*1.w=W 476 ªU"P‡6TxƨbD?/@.vyho5-ctn{C}] 5( >4\{s{y-ݞGN|T~f_yV)Ztٛq)$R1 *aw^?#I͛Mpd2NÏٚ)mp'_p[= 34Ht|6 p8q5,U/-˛vVjeth^S0!`ERcA4n6<&L@Sc#u{uN{Q [6c+HMcɵhGpNv*&<9:WyCg,^Q3@[WJP_bLDuLM'A[{v1@5@A "KJߍDm6+$c\0o^qO7sߓ` &|8wQA:x#6?rh6Em}HuI`'oy 1G)M 8뮻WZ$Wp2@!fF`.}9b Mb Ɲ ̅F2kNۻJ.!mHdGlrX0~fgn&+e9Y"g@rxI ?A{_;_g]TE>XC ^qW[/ s((k#qĦAEM2JeaihHGhAڬ$%Evt'XBVry$ !mF[PϩS(g)yS) #g31yec'!Ihjc@29JX8,"h1ƝOrkFۇn# Gf"VPPa#6Y:s)7>8y,Pt8 .(HH@l :ʝp  E0d2~HixX OnbK {NV MJT:)RYՈzk.iǑHDT? /~ UNrQɪ8'C{3nCwY9P_ 7g!<Z%PPݢ : Px>{=I5zmm^{op}qAg,q|^oQ X}6d~N.\o?DEc,/EGe?Bd. /~ǥb8z ) 0cT.B` 66Q5k&gE@7O#4hqX#,׈QsFF $:晀gPHĚHul3IGxxƍ`W^: H q L, "UKU&"E0hyTNKAӦ{0N7J:N(V+SmD(QX5Jڧi'tF(mQm60,aLލ2Pl찯8pr"L( b(1&Dﴠo0qqcyW,`ȵhU .1ad2?1/bdGOg;1t* E(u! R|:BJTRŸ_K475hUi36z oxl4ʱPJKٓ@-? kdx;]nC |.*no`gmP\}FVx-^{]ӏC q[< glŀʑC%"<73yK=. @%*rO$e ec~HqP>kc_ flRnCD}߮ނ1Ba=܅>EGGmh~ZAVU?ZP̥iW&1[l&{&@}uC;={znf&L~^/ Ìji n "^c`X7Cꇒ&$y;%?ؚOQs5C ȖdӜߌJB"g15g?,|CBTB(!D cϰ[pejNT˒C8F%RMN&", e|b4j57nB."er9 -4+AAQYd1y,(h#,L!~l1¤'1x>LQQޕ<%%}wQ?ޫ-K|>9c˽Rowӣ oQnL>/#P!OہI!pvU~Z!ʙl_MǷ Ƿ1'!?c $~<kgr"bϱ>(,,g2ҙղ`%KnCߡgH$P 5!UҘ;Zdn\l+NB ]WZxSF]Ӊ 42i)*1̼=-\s]tviBZuD~;y/7nd2aU7m)TTB !LTeWq[b[PNF7QBEӚXQ]f%0p̥&\N;_p@^"!B!W9 ""8Sp'A{wޕ>VsToU8h%U dY6jk2>fy.?ڝF1L2!wI.y1fF +H^;!<3;vpZIEX1yX]~TKgstTk3C0m5םGdT#E#.+S|,NRqZJC 2r1 ?ǺJ]pLdx 3[l`fNPZE]v)9)5vVP-TQ6H`\a nfXۼZ09J]jh-בGŝlJN['.#w|lNxnvVNJ[EՉ*Mj\1.Ӫm56 jNHcYj41^m$}]wYX܍B,֎#:^ 5 Yˆgo_>Ê)zn?&q{Ü%ϱg@2lnGj'UUAU;%W}LDɽ0` Q:Ce_.6$d7( \^UIET \˫?f\?_ ѥ_WoPUU~gbwu { {{}o>2 `9) AY6)g7m&sAu5=}Qĕ1n8i}'mV)DGC uE~m*4ZN`c<&l)6ȹJ`Y|DY75cE)15.$)LM"$%DjʟgOVl6 ng1ܔD {9쫛 Cslߞjj| 9$ _ATlUti߫?u_e('٥}*4x=.MmwfvL( %S% 8J[k+cǎEA3\5)S| "v-žBdJdވ& KJH'D1bqJ{ec B) $oNy ))0 X^:up2L䰼{Hkxiք\QN5lK'D爘f&b (t18noNQXퟑqDbAkҭ!̤8uQ NĆ}p,cZ)Nً'+=߫*f r_؉Ŧ$@Hox -kF'xF;GӐ@PN< oAA+;Oc 7B>Tʪ`P{$F,Kg glq5-E}g5NP&[kK)/L:˰r}.Hu;֎!g^P̫-=:?dC5l="%%3ll_m @ %PQѧs_) g=Q/xH~g%@ofv7z赁3etvbwpGd Aty6?rqtQ>J$U~cW${΢F?~5?Ïˁ2`1r׼bO"`}g@κJz97kL̵z##GtYq-s1=}:ۋ`Z-#F )qH6'y&&tS$tTezI4b4&TװNV@X)CRQscͅ>Cbg(f Mj`|l+7 <EEܰ ԡ-2lõܗ6L2>#G (Amٳ;g0!nY ?V k͘GqI&"E?b ܄TOZD$N['Qac,O:\bi*`WDj`1yJM1-c7b6?kKX%'ѯf;z"Y~rTVBKK MȼhSoVRAy/F}kLJU ~ Wkmcgpy$S$ȿ<%8_[`@4?wҿӟDƨp;VkΛTVQ[%( %0*K*XnR$*%Iʤ65j34ճebbQP:I]Y" g{v2㲰TYi5vbьX拮ՄQadiI3&vb*3g7Jxa(Bc) Bo#%b`'+з=2 )v.r3[[QG8Dvf8fOMe5 QT$XX F'ϭ`8?@GD-m-(3ٓd3(-wN\H\LS 11sWڨXzE8!Z߂=Ӂ]nGwDGPiYAWp( eGɄ` -hZSҚBw"X-(!˼4yt 6eز+pŸ C =/~TL#*p 7Aa-D 1xZo]8J܅_*:.?b˺(? Xo"ɥ|}gS|$}??^`X!3.L/x.lEJF p@)<JHS:1Vd2NLF..*xW9 x[ ˝;gDZIݖ#'u;:I(rJHtP59$jUi) H;>9XI3CJۉV e$OIfyrN%$SJ9.O6ȺS`] x4/x*BxB4#GiKOg)uFwt%cjoo!MLxp/shU t5ǣW/8xqn%T-쐃íOBPC$a(j-BF7!Zk$U=i>ƌki'"2#`& o~@U qʜ8]N:9)V&&zz4~I$u_aoamO`xOϷ@kT+u89/dr[*({5 g_-|g, ůA@Cߐ?QVAl^jmk#&:my?kOSOކ{{QQgqnkko':*ʯ^'o~ј7 ]k nX`cV D I2kwt3 ]2ncsRiI{UYkV'\4PVgdØv]u5)dw.Fh`0\8QXX;(t ,V3xІ 9x yfEߝO?|a"E;pF8in63so,IѤutR@?sN!w4h15_̟"LTũy}oڸw V^KJdqk 8n%A=6`!ʝ^]⯯{_UŋM%7Nnhy?~s5;`h;;/x/mBn/ ̙ә>m*wu;~9]OO[fgW]Ҥ$:'|~-`0 wć,* O^@QiP=>c0SE`ĝЇVq-bB'նp%ɨ&ݼk(-Jĝ":>W Y`#Fü){@C ҷeH2%8&I]xE#Nl. 8&]E㕍R+edJzY1B#:5ʐVf!6.vw`iڈh %*V92C>#l6q{ظ{# ,־ή5c6h%U(c% YdּApyʄ /Yʨ& TAj~KRȺ hG&21 .& wM"tЭti:Z2@nY$wp=P; CԌۆ_MV~~ǧ>xKkr/zYHVKٍfB1SAz-F3r9VlhO;&x*!*@G-=-:BEx6_DFR]NOnStW: ٺ{+z>@-–dC \@dJD"V(e#{C5mlZmlmG^{A,qsVX)@}Lг}7t`OW_qn$Y2b61ydcAxPY(FG$kl7=]Fi])Ąk0 {z%!pWk"C w 5g袷0Ar\0߀ Gq˹G>9 6mBZZ*g`!TF`)3$Mdd#ig]l!(tUѼ['MˁfLefLH݊͒tth9x 99$=Z9ڎ!ؾ|֮]ˮ]l#& #;`ՕEbI(#wQ$m"74wb҂Eݴ ,ɛk>CSM KJz?b*Lfz*{x- m}2+r^7<uЯs*)Ƞg?\M4W Fw(;s! nw-Y/, 'آTxbAB9KtkXն S0R`*TVt8I H%pO ' I]|)nAUxyGU}3I2tRI!PJQiREW}-k}w]˪Pt""=IHH)d'>q' Q}yf{{.E5qY|Ni> 7:u -_*qFD7Ypj|ko0 9c/}OFFfӧzmkL>}.z[w Pk46.bе~gLf`I#Ɛ-uL : A,_Vo#z h=df敛)//|Òp\&`0@ԨHƟOUa5S*/?@w~Q?U1ߋ*D ׀NGYYTkSm%Q9h="s"ǧQN6Ɓ*NOIuC5J<bl/H?vj`%Y+[d.&hܙyށps\`)868| 22r幜: <%;wPkCȚdj9sI8 O>n] lo$q = 2#8T :ɝ|wF膱j< ^k2U[s%// 7u%c.g'w6¥ sc„w;}M۱^l\w+Vrftݙ3_PO+/,*bڴw JbzzB߬'(EӪp b5Cy@Hp)_ W$Z]]/N^eD&7t*LtFe?MdURHKKCѰo>Uןrr^}ߗ.da5r7wAAaL%Lw'OnŤ@ND (l5##OK3@qkih:>>dHie8@F H~lĉ1]5t~ cqϡ嘝gvǰ*X&,ñttLkp5a'8a$bF#C( &2 }6pE8##8*X QIT?(8ucTT1p`W`iA_ !h(C|p<8o` a^1,? J1)``J]N)lPS#к")~nEX"8NWηho%:(,yš 1B~D%t"[yy|M7>c^ǪkP(Fr9ul,/ffs?G+)lܴZr]`)6~\˴iSlڼ;~pz;nv\cr3Yn ??.xHp $HҰ>dʃK.R ,Hh0HMM%M((Ήo)\H&w깫.oRfV&M Dur ߎw>󿃧r_oc> y -aŮQUmz0&`v|s<_qq-KŊ z+4[`@qJR^Na?@-gԣD!^,tj;"`*6wFP=bLx?8鷇8dq s@1/0r:Q4%/É'[MLT?ͬK_4C(S ΂9 Ũ1|إPZ`>[<ⓠ/PT<'^jp@S/=dRj%Y 済BV =(#szɓ&axß0aSL!2"hOԳf_>_PD? jᮠ,| 鸣0E& Fd ON7oG fCEe%GG ̸f&fNNJj.QX,< 2qD L dS5z uzs8s}|/28Fw]ǐ]wղ`Mlf_-\ zeZf{D%B ErxIAKF`oy/#G3fĈtUO $n$9 !2zq {Pv~4Z]+s]t:9~jooI~8\ߥp"Zwf(F$H~.(.y5ν+od7}}ק,9 g*>z }m?YzGaIik.Cߗ_$bX"9os %qZ:_ӝtrى] Wa[Re$}?^'(fz5EEŴ9x ~fjgћh2f7 IDAT;I}D_Hd# 5&3iv3Ӄ<'#Y@glO^PՒaa;Em޼e-$c6RVVi GrU975Ċ+X>2B!؇[ق]p#ˡz_Q1d)O~ "Tez8lk? N7'2Aĭ~[MȘb@= s96mn Ar@Xm Lv[#5kJF3nu@tMy"bfde&H]Q=--. |M7먩ƳœQŒI;5aaTk^=_ D/,ByҸtE[~BܰM"BtKyeYy+Ӹ+p5IRߗ A¯ev/t`V(@\@_d. (\]s), ݄ —}2Fw- xd Pgb#'9Q9  u:'#Fp21ATDoZ4?q555dzVd[D\EfL GρOP0D;G#=rm9~u~D'DSSΞ=Oa<4V}͌33_eU#EsCTqXzkk7ϝdA cnD "8)O (^^8KhFXlEQ@j#SG !kU͢4YU\? qGfq F;v@PXX"k5N>*A$fc,EL X#t8.wk1~t7Оt"$#C".Q̾ĥ-e/^ɺ_rtާ"wJXC[φS~]E"$HMb?Yb!9.+\嗯 J/2 CIa >3B[d5a[W5Ƹ~-8Izt3?Hae!F5`k"xm8 | r*ctt,:UljPm2S754q(n6z~Y]ҀfAGIA>j|Da-3Xb^3ICAqa&N~h!d=IT'R[[fC*O<1[ۏV[,XO7sԀ)DXƏϲeBkwOtddb.h L&f3JT*pt*m\q?gp~4dzfJ/[ՔNO! tdfg9-S0Z@ np B0P`KEϗ pVγOroYF3αD%\,T_7`N#;󓝱 KDH٨8oK\ %d!n)x.bn'!]6t ȊZV͍7ވ!ny q iSOD 4n( YAƏH:T%*U6M˃d"q@욼ݥ2vUɴSi,o\gyR3I{ܱ"f? 3`Ղɽ! f` 8 48 ~̬.Ѱ{C9@`fc?۪!iVSԘHDEC+7o먟Z1L 4dGQK\73I`؄ttVk oU3& deB vDuZZ::bfI\&=?oo}/D7p"$/,wwٖK-esY P/VWu'W[!w0 $H&"f@C5(C[?wEpnQė(mzޢdX+Cُ)ނ]wldd*7f1v&1b:kj`bC-)_Eדg'8sL̝ 85] >!0D_/ T{鞔;Y̑ ܉Z%AA JCcUrJFjr?w񏯘u^4 M-e^j)r,x_BkKa|4VPyTKKP:zƘ1eNL9WpoMF>]as둅TyvW'݇j*ML10nFCe ,<τp\+Esdw *:SVAwp%MOpkh:ȇ&D%z-]N{%:6J-DHC=asM'JV(I Ay%cZs7\rwz2M$f94/?bnL4`R`yꍧy>EsT-Q}ٕMWYC9B}݁&UATh!F6D'W30*FWwɺ0 ?jU4ao` [M0) }ɜ'%hSG3>{)OU0d؈F >7EG.ވ.2jg&Ϋ@FN]@(w= H_•&_B1aHIF.+A \du. `0p! YYY<AdzJ ϟٌg)."dBbBыa9h&kآٵAsF*?$@N<ˆP.P@JR 5+SXVV> :bVB Tu7q}5M&և3j6/LD̍`c,>>.e%^Rːz8ayiHLPO&ST< :纙סR(`ԨلQb(Lyu% 9nrG֪pДGmI-#g؉o8J>i01t~'V[MAPtEIPf@ =]#n .R\B"@D{V(0ws0$/*dNFO9…VwQIR A•h_|EoHߚ# ˗ԓ dJUU&MbM+gᄅ8ah4ߑ_~5(JJ5ٰ|g#kf5@,@z.ƾ~NǙOHF3 7JP;N nr܏qXN w.#|aVgffὁb„ɝ ٝ#ȝ/4&h`g uǟ3\ZC1 ?Ip?T+ ' ??45#7 1x@0 X;U\Ja|-B6xS "w˯hnn"iD5G1/N-h5pȫ3رFMaa!jD~\ =5  @N_K c=ZV m^-ow:ƻ;*j?B5i3pEߒ ' *i╈ihJz$-Ly.Q ps(BHIIc2\SZP'җ݂+D^wji d>ܛ |3Cӆ4 _:l d* kaR: YP^K%8dNZt`aAZxQxcY5koN ,"CD[ad99URVWcF( c5zr]VOi$vp*Tظȉm|5B@$ߟ)S&~(a 1R#EAM,/$&NHYY+W<|{.ي?1,y6q<w"ws\J5hw?u@7Btps}72M•}ΪY:y&"xdN7|J $\hB' zl@ǤQ \Pp@vQ -[`ǟ`ݺ|]PGOzI5=TK&7A_SNƂWÎIcAMÄL c).)&;?rC9Fw5kjPV5;wrRS 2yUaԭ/?zSh==D PRD]uY+#wx f9hi?f;<}^MO%JY:ƌi͝ 3-xr'2+rw//&!]>/? $\Xbe銛s;]?s.uM؉`0yf2  s^rY_dfPƏ@k Q2Rw(6%ɐ9d~?ǝ4k!{=TgVڏ[B lB^3'؇5Է*%Sc9ae #M<>k*BռSl$$<ȞFFYy _?ǂqlLql# &0+)QМD,3XPo'/7 J-?Ě5kQɉ} ëH)xܯB]ݣ(SaS[3j;toH\*/9,q)>AWh Ͻ_78jㅆxU,ҞZ~ܳ'ȿL/e=̿yo >D7$HDb.e W]7[gO^D\u_8.u:-ԙyf222(**j';Lv tt 5Eća-eQۃqlVl¯adC/ +y2{ %$$ !(y@@ l';DCQw mnNx-* o ۈJ]Qin 2=ĆłDdݽya`9Nr>c5#Hڙ|Ԟ% 7o mN7̢(\;Qx?187p ss]f9Cv^*kY>?QA  HW'ˇ4'fmbשݼ!֬]KP̙"TթH0&P(/䓝`4"s ï݇l٬A3(*ĒD!\,y1Qҁ'wY ٝR"Zоu_^)FW!?T @%A"C_ ײeOm;S|9q(sK/V˯Ңn=+^#>4 H۳w]23ٵc  iH A TTtFNκEp.xh.)AV rCTiY\55#o܀l [hO P;`MMTN&erw:dG0Ah4` w waɷm:[Ojba&0Wr&G3Jt 1 ujB`}ƍ*q܃GO7fzP)a7Z`%'99  j.UrQE4 c*rvE-z1x^mR:1]z ~=<$|A4v3?x3b<{܊ȇW_%F^MIt~s]wKz9Uޔٴy+[S&vGR1wm7ĀL6-6~uqcG#{hkSDQ3mNV{1}TZ-  Wh!Q n]/b4#R\4J W ^ӹέfāi}0ך;GDnoh?Ȍ$0~8\}e;dB FAbq|Jd3q9請 2Yو.A@%|:+21]C IDAT* v};?MtckY0s<̍[gJmx}0l6_pPmJ`, PBVq+_][8ssIN1ks'Dt.#, sn'c'a#WHK2R$0tixyͶxc[ٚ1Eb,b% e=S%MFH̹7̕䣪TVF=+WUu| <}?̎_Ñ'BY󁾈A%EΡ[l4i>ogr:3FK@jÐd`00 "(mngp`4/hĿj.'Wy'Oq0.\HLL,YYpb DƼ\=H7!; gb ! 1Ous)b;zR]!]KAʏ씬zꔰ"']u-<%/C ._p!xk|QFqzhnVKV62ۑCgȈƏ˲eߞs k$i. q A1LXe] EtOiI;ցmy[ l?H@>߃cTk CzkYB|@Dt h`0?E!!f̛` ])ʾF!rĿVA ~Q yq2 뛥Mѽ5 A+LUI뀬|?iLVV3cƴ)S&_`oaKNj9;"jie 6olλK ۨ/61H Aě/b6=:ֿ&KR6^c<3a„46OO$Xq*O4YX󦑿' ( !xDAe2fNᇇc\i$8(Bm!`5xm#2*ؘX"XR`3p\ԩX6b*^ɼtBY j|4rF3rǼ2YӧYiD%!?u4+!_#Q@d$#|IE<~"SSAL܍&>Ѭ=m "z\Czv{V?<-ٟvWmNgAĿ5_"$\z¿i@ ja ?2l;<rݵ)m_YwcŧpSns>xyy'm+{ݷˋgyj_ ݮ*~%A3xvegcIv iC;<:)]*\_##eCY[;{{J{jRHkHf|5MJpqq#Pd3Qz/xoG}+fn>l߾ܜ\ E@̻e/~ r1:kR׭D4n!`mb3RƑΊCh]Hy@ aGTJs&w&QWo!p6lG hZl6?9H}#{`ЄA kKMS+g9s.?+~xKtw@| x+Yp}uK(S:6ÒmPpüh4,X nM gS]]XL:x0OT?*uaC7o)qukAjTv/N=V9-< >qd$&6?YQ0ځAO ,&n!7bxöCѝĿ#] O"@Oրށ̋9^@yZR,qVi 8 M[V>3fΘz]_ AEoLC$Hp:VsM.A7):eeP^!q[xJy.0 'g;*81 aݬu.c8r(>uT>=ĎOhN|6_ =! z~/PnY CSS fv= p691h!vUˆ/u8TG`a %9FELuʠ*|rb -X]%*,gy/9Tk/amĿcnvuw #7"Ma F*Co #cןw `.¿qkEI A?$D3“C6b@ ,㗣h+vFZT;Noo_qZB-pl|&O+ѢOφ?GU_fAlOX"€ -ʗ#6Tq9Bp[P04qs<)1dׁ*<l x"P×GM5Nތpgi춯BndME `"4_ \ϰyUt_r^K\ z%Gܷu?[[.wh\L'C*bUCm_S4nuMYW ;QFy܁rMaDF`η`J3AyR9;>LcW|ט}nHÎuy,Ȇ!Pi#wGKU^I~ZEu6m  ͆}==O{0o$RRRXln Z '޼-ps g/ VX9;@_'F^ yH_.Pߞdbrsյq_ o@@/4aP"N\ƶ}pms k[dn!αȺgvd824+$I Ab{įxd7N=8By:>vD9uJ@`O@Zj#NQ8Fc#:Ztr~a@DP7FC Q쭯z<:GMB2</bfh"r#!ӝ?ƎKYYCs0 P-׾^ n8|[j`a0{ ?݊倅vhnB¯Ώ]v!X"(sB$+@=x:W&iՕ e[} j$.H2:.V_wD$H IА ABabҿ.6O+.+:$CVe?~# T~%/m|ɓs~47iȠ$>yHQdSKKX` ``"J@O)&D&x` AAE@ȂHX aAtWW9s9.lxݫpK޺W}ģ9D!/?)`Ԫuhoa%# u2)t֮]M9ḫ& [y&U-p:0Cl?wX+!~2 6!ʆCT+Rd:/S'1ݼe x׸uA [mԦ/Xi}->YGO˳v^].'žmy̘1UVx3j[aUUAC;ϦZ9i)6XoPOp * E4~:b:)J6R3E.yn/J/[ 9rWd Rpړi @%)E:ϏwAU,gfTJ !t6PnK]0jN}lfhK ?=n :_ Onz]d!tgu S{6Afb |dl܁SA5*RcϿ",^,)+s3v4̭HJKQZ|Ғo$V HH"59: rcA9v N$wM7+уV-[b ,]Bºkזo>/ |b:žhxUCe6rr ;|^<; A[Su)B)PZB~so'hKt_ wE0$ޡǯ LZ5*R7^:fs._E_Cxk6{ip#xzyԭSPW!͚6cݺu{`^Y|ک*JjQ]}~q˗ùse/70Ⱦ@9>pScڌ~_}wu{z%ʁM`NnIB6ldjn"E1pI1iC{,1lKl(lbQfQGJp5 aTJEnA3?/,LF1pCCQ,^|6o}*d'_͛7kgCVZ>_~XԩڵZ>]Kf=3eԬ*|Ђ-ցyh!C^APۯ\ERG/g=^N XV{5d ;=~"[na2j%t NUgny9@/v7K eTVk_>*h6ۦmc1i 4C݉cE'ppvvO ,ٗ@~#LǓƯ_`Ś׺wb[CWjГZV%'SGQ{цh3XNW i9@>T `1@pӬME:_V"E 8'Bwk;kIժ_lٹ| _)CA,@܀4~E4)*n=QSewU(A[ؘJLiʙdJV*lNWLQRW<`MR1'bҤ+nv|waoMM̃߫᧟v0m|lb \~H5utCjB"EK)ԟ_Qдp , Equުu!VXf }[bzCխ^DXQ!0C;:zn>G ·%*Y;F 4: Gq(.ͼߣ<'HpH-H4PH~J.(T\T- _ER<3n[:?\@F0p &@NyX+^?-UA#*C,#hoF)R?t.V[bɊKQ^=fj$S:{y!X]nnһ9%Ta+`$P2uL=)J fП dUJV/_7'}%jaߪu5)JaZ^ىeh}J$a;*6Bj"qGw̿ͯZ}6ĊEůZ1++Kdff FFLq#6\{ͭ_9 ?>*tQ W' 1~goJúo?E"{ V\1Zk_e IDAT7Q t_,.ֲɀh5Ҍ=Q-DmЂmMVB|ʰ/ ʤHQj*T&%_QZ,2?/FÁ;FQ+o<k#md WH"E@3,?g%_UrN\ZS/c94i֊.+8hoCݤ+h"Nj~*[`\\syoěyiTNj֊Kz^7߮P=EQ)O4!m3uUgQd<3{f˕,#(SH/KeD60f9ro09)RTGX~Q Sz5ثOO<!ןoo%m˅:Env%s5lƱtWL.όyG~@ޗs/XYuN[A c#pCkGwn?v-/6?חoM-mc㏰y6a%`m*xٿ& D{EP~iSbaW:+ HUd"t3G?I@KbO"E)"2.v[H? $Փj99jZ0y/Edefѳgfv'*@=8~8ɲC .Ydeeѽ{W,Xd~Ini9,X%K '߅ ]w1JN(6ѢEҾ}Pw9Za"l_|_}@0EōE_Qg) x^.P 7-(Ս)R6hQFo;vӦr]_pl>޳o/urPnCNiՎ0mi}4i֊["gg;N8ÇpMChw湬YOҰɴ;=:c^*U@k[ qniy.kV+?2EJ|?$@71_l+hkA`WYJ+!d'`BJ4$')R(B׳e]>_ǟ|{._䊿ˡP~Z!E2dQ\sY?GcGsn҈uK5WdǞ=>eɴرnl%@D+_ٿvU나&rp( L}; hE%w[27L=|Y~ӯHK[6}G~枻4)WÇ0![lذb}w*w.333dECJ]iyi{I^t.YYTV?(U,^v w=vKݻws1^|ɺ4cdeeies3)9,PI!Z~< BWXӤU8o p6Ec_# +JDPQh&sR(HQBz`tpIƼya¿ۘ{͸u7 miެiH91F 6j FJ׵Kg:'Mz.4_̹/ ].Nt$Cdml/z$'I$ZE O ?g%&xA,~b*Z0ICTV(Uz믿Z1++Kdff ?##7\{ͭbӼQQ|StݯDfy)B|g yc\,u3\d?υwgX@ úo?E¯ V-9ݾ˖:ؗrsY-yJ=ks5׉HR*%R,UohK&VHz8Z6aDBEbMn`֬uLK}ZHdM&);llW=zW&OsNQWQoSM}x[w~!T${h1K{;-]50 5h0}w^(R簼_$'=2LO=9Agf5B}45nI?udEx@^WBˆ(=[Q/soVnx94",j01Et=ן:"EE,{|? 8,J F 1$ cYxGX v~HL9.tna;ݳ;ױqb&-Ȣj:4=BNrJFlv*@I =!v/AT*K@A<+Rϊ+ ǁ[L2 ӭT(/gxeoQxW_V -T# G.UFO>ɥ, E|#)qytJ0F#٥HĻWfŧp96EddwH_(#k-ͯ!tͳ_ l`_:*5d-wH`rU1&Eu.%rHbw6ڿؐRL+` %Ln"6~7U*_Ոi@v)\>^3bD{fCfD`yyf{\[Ű=CCM*pJ*֓"Ee̙6(9KzӊbY529Hу/IZ\BaŊ% 7V_P\;=[qiyɨ&pM&,GMFw P(βSyN񞳂:jOxDj"]JეP9.%G(-. PDq!JQ|u&KZivv_(E@Jfc9>Vg%G E[QZӀ)hk+A$c*@* Ҽ + 7@$e=5BRò4oP>S5G@JI-TҒ㔖&53_hf嫒U`2N"w3Yg2DB(M3[@L1DG@%Q:q)JL6RX@E<%C?!R*O_ER UX6ǎ쥴)%Y*Q\KsgiƤ /ZuȧUe_m"L7 ?: {`S ҢMЖ g:or'4zTТfI. ( Rc58X`aao]7H Y؇E נ"#1Y;)K-):~ĕ o%zH~ @ +{\?@@F *= 4XWeL" v]< *,cVm2RaEԫmyo؄f7wľe FA\xQ4l†-Z pE]\Sa7lp@2d &`9ڿwnc[ v}ybXd6NixG`0NKЂ X\^xK;`Xlko(kgA>l7xԨdԽ{7[`9?BzP*d[hX`V~ o FoW,>~2D_PG\=+I`~^D9? ZJםUѣ *0˯Q}ϔG ck{oQ@׍^2R22$)))*d4c/}'F h@Ԗ(nf,?R_2dYx-/F]!v&RjS<$eR%^. #{kTX ,A+ ~XEII1͚6pf2_~>).Yx̛AIΛwp=oBJ2u*U̘g/JW=2h38j5ܹzcGDZ59/6ZRLz||=.;j{|Axa-峸exaʕ+Jhz^=&}̿"%2BZz}?+gҲ@_ES:-Z ;~px}bإY%Ohf=36ADxeQDC:?FQz(&=M2F$MF#xe!)j2:=ʤɯЭ[~'Cnu撞}v}v%]y%s6~Cnú?ӳW_~V|EV~=\ҳώ}!6zo/-N1F tڕ 2kXp!]t!##ùw?+|ڵے>̳̞c}s{ή߲./-4{# )Edi)ӟ$aܮj-;\as6)ٷ~{9G`K*8~4\6kyQ,,#ߧLuo*#:[ybH [0[왤iw5-#NHիGf[o~y y vv{vǎYS[ag4c=itjiqmF[wG$_t!Ҳ[G7$皩]"6k}?Ow+y%Y>IEƩc'xRJ(-Ȓc%Ň)>Ǐȟ݇ǛO$)):D߭"}}킛 oRQƶxFb?_͋3Cxh?#!0E5$._"R+R>h'Kw q #meOyc\ƍ3i#AVR8kS{i6nѦ4>_ZjLqBlHQDJX|9;vlrN8?|(F݂PڻwO;F; be`lD?@e-$BDeQ(*e'l\9 Uw A@0ܳ/5>G Bί[G7AX.Ucz C)K⓱1tr-c~(yTYK1^L O&f@;֕<"f2=70|i{Lz_\IQ.bF+T :1N( z_˖_.$o6^$C?DNYoӹcTd|z~BWg,K*n)\+4 +] `|^2RcGPz5nt36ms#z lI|Ox_ )-@\KdffZ]X#V-\QɈvZ{\`^@'F2d̳ct؁_ԷHח~('ln<)seO 1ec&r8&'zЖ,'_2W[22-[.ҹ7dz k~4|5K)+o2{W]qkU vWΟy}InY)->07x._)O#I60Wg\ː%*p<%]xvy|p}KZ IDAT~ˋR-?(AR}R,ҒcQZ|%MFp^;v uݼ]L)-б~f*kb+-%Fѵ3s2WJX<ԁ+'JK ]:h&h&Hɰ5w_g֍̜3fŏk#U#y5HOaX5P⏌ZN *lO%y>F &QCMNdzl (>v87Vk2~N䮄h|Re ^?NC FVW]0V%R˟lզs#|U \JNkUQyF\-' $=R`:Cm?$ ?T 4bę`Bҹ.T09?3dlwL'@Kfց'8W&R&8hmd[{h08Z-HGV_Mvu!cTaD^p ]+bm:6ڿe)eJ=„Zx K}FM|3 Rpn" a׏-V`(m~RTi#ߤU"x.xXLjKy@~E)EʿqFpg)??1+/{,YS2q_Nė%nH n [H ᶉZԽq76G}y[E 7 Cq9T @[o-6|2ȨWFS;"VOuee)6(>+ӻَ҅b" wîx"(p)OK&¾%)#1VY"U'RRWHƣ~"i3f?x?S?u1EeY 8Mxװw0ݮD=58%u?̴Tx&<, X]ZX9L% AiF)T3,}htEP+k/: ͽjHγ"'L-׌L Qph2nob_yO U?Xd7>ʀ EB5ӳ\5H֠EDG?Op ؖf֏L -NhoP<$xDg,e22EQx}p?B ϿAY&/ r@{W82Yz5iٲeo^1XbvEXRg4O^_:S/dM0o~ׯ Kev.gU-E|uצ_ܫ'̳ ݌ 4 сѓf:HjNb }C (TS2m,!Lb9︌ =gBZf %V2qQ\YQb@"E5wgoѷ17=Q }i/{Bo3^:=Lm}_ 4ԏNf2fm&UA%.EPD2 k >_%x?~ R=(PX- R(,[e廦(!f* lkP?묿4c$ӏ8 5ΕeB_'`Ǎ8KO M\):{\֠/Mp?pnH%($&6IG$b^ENмħ@J=ˁY f)-hR!&If+ vff07KD관d 2l@Kuޙ*7bN]<ҏ0٣U ed_FƣtrZtTw>"CB u+BLU "fj?+<t}1mwguQ&RAkW2X6B0RB^ƕ3i:JELZߪu{;\G1Eؤ?˼_RTx)2:w`NvM$CdcSN &QY_z BB Ft}s#GPr%0UT ]) $P<7$f[)w{VK^UMT|DV}l*dV)i`vD~dT[xbC¼/}ᴏ~Cx0DPl.Ck?"P"-j{=;a6 {zl웇g?[ Zlѣ`v L1*,J?/mM\r"<}H|]HBIe;D`/Έl _x_a»Ǽev_ E5cao/Rw({>0*ӳ0gI l\Aq _ .'gpp)Nz8/'L<T4i|f9ޣ ^2=N[{Něb{{?*06xwۦfUjD}+MM[:clۅH>{VNYd}]FŸqRRHG:v옪MVWKZW2,Y(Q vf~ɅWis}iՀ4FLysm܇ ,rRo%@AAFMݏ$kA]=VƲ|2Q.2*M:\ >,ZV^JPu#f#[ˣB \|juΜ9QL2@EH8? 6/l/ϾZZYby'/ww 3aodҥhт7xCmEeU.m1|)/(v@b3 kr ?}c'כb7Y&̒tsc9m);Z|wq;wDAӦMXf o; L95^(xϚnG6{ )vvtAf[y4?oeAjժ'|"Et}gʤ 8|@޶.[e 0 7SEA e\pIeR ]W_}et%6mbذa~J@c1"Q*P6G!*d̳3? 233-"ÉkŠނHf3.ݷ'6d5F)R Y_\OiRˇW_A~0rƀ}jlviׇ,w Dl.GH~9C?v줠`'/%vFAAAX]#tgáKݥoÄ6`o*t"Ѿ!7.eϫi8xƍPf uїظ1a3,#~;#"#;9`"EsZHu7_s<¥Z¥PK8\^.N E77l?sF/#maaagѣ;v0}tf4OA0Px }#Kb֟?r.Z_x-99dffRzu2?3)U _ fyI 仯تz"E  z"$),3v$f8B M*K0;QZ .`QG WEm^p! [N_m)|d~otUʒ(z[xj`+u^^^}RokfˍTyOgвkػwѧ<ȵ mvM|͘%F<ԁ gef ]2 e֯H"E"^9r 4.kgZi9Y̋TND٤A\ %l 8, 9crkYha33^zE/.nc~ꩭ8rB/š5, |3W?nٟzjVYWYfzjcy\yF 4뮻w}N'*7t'OI|)З@P[<AHᨇ}T0s'x1|y~́`a2>3Ϋ4>?[E>s/y?3f,֗uk۷ndW{oºq}w#í @ )FNґ, l?&JW"E) 3atYFHn@( lu"ȰLn4G N@"=nϢ͛7gӦMI'[os4ͧim@y_= 77xʢExǸ[}~;۶m3}\ﴮZt>>)R(tTri]=~n{q:ē Zym[>?Ç2O4kE^9c޽P jvu _bmwrQK,r@(m G!lBطMl!_aɿ'}j偠HH/hopx}|8;wpIMkkb.B9yq[Gڶ󫣥Ko97w\>C?|=N?tmƔ)SXzq?̮aDwSߤl>uu9(mw.G46OPaݷPM?}Fo-덼sr):Vdsês~y|}r.G0%_""$|xR1fW_Œ2$JβK˖-SHll"7t=-ZqύrԨQ!L=yhѫq"鈐VTV!+z]ZM;nV$^x[Q#yϼ z I^^K-I'ҽ{7|yZht>vKg-N۳`bƌ}.LG5m7o3OQ~v"V! IDATI9^fߞZmrŖ"XX KTE۷WHQ AIyp v@>qv5lȤW^$33xbm~aMxn9rZI/RfM$p`Aq7˖y+/M ;* 8p +rcqm:*r[,yvsSxԸ/~'7"Y}Wxӧ7{5hӦ 7x?j9rtaUs9H< '`[71sLNg۶(''5 뜩^|N:$ǖS\9?Hg8EB׀O>=SޠP!5jԠK胖sءָ#ù{Yͷ4kڔ'z>5>n44acMJ9lްƶ=7v4w}/CĤ} ) }?ElT$A=X@ 'QHQC $Z»8)l3+^?!Cҳ%t؞ h٪e\r%dx1cy4o֔ٱ$όK~}y̛{xfGmDd_5Ac sӥGt t@>0FZ4jԈ5k0h 5j+rrr8x ? dDʷ)Sfggt4 r h?Th6O`#O($JA2$D! m2Ή'޻o|nt#7 jd' 5[Sl}-OWP>=ӧQި%פ~3!NALWCnX)R_,!&ڴf`+/Qvmz?۟QN*V<~ŋk_`!͛5%++ݻ`"ڢE_еzd,im-ع;FJ?DKS.HKYߚs3ΰMӸqcC,**r}IMy97c j׮m駑sGu>*,^af}t w?A p*l}%Fyk6WagϞ A?)VQ_"E 7&ۉpa֚B3yqm5}ƌkIE&ƈL졽I4lܜvg0ٻ *CX~X ƁV @H!_Ϯ]/l=Czg?77&'51ϝ;ٟ;`9|f{{<2cΧ V:ϴ bD.kvf%Zas>P8LJKYJ+RHQ RI YN;LY*jhݦ5U&riZN6߭,0)M׊(_IN@DOd °STfSOmЕ۶mU=oB[ԸKkFӣoLx2rssyqm-p)%^x!_~qy~@9m[ykRF9,X YZWͽ{[l+zCIIIʇXG'R4Č{h]'~rDz}~y l lK"O"btغM'ۜkpJWG&54)-j?b+To?J*q>VZVAseȐ!tՈ)RPPx"EJ6JPN*ڵ+NyKA:tgп,wKzx#w|6mEL>?ƬХ,[ :v`Eyy([@IӍ{ֹ7J.}A@qq1M6?y8.]wevWի>p׃K.87x`ƌhׯOŊ9v옱b,[oeҤIl޼[w'r5P~}3e˖3gg},)6m]뮻Xng϶GMXo ofƌèQҮ?~={*HQ C o!=XhSDvF0xM |5k07mڌzvvp"L|SHV{׀ vĸqX|9%%%s9ԨQ)S80S>O?|n6W2yd~&Mz%KpgҼysw믙3gf͢N: 2vӧSOo>%\—_~`ԩSrn<,]Gqпe4oތ'|?FMSbEڶmgl߲:l~jժeIyA4WPFPʀ1]d=.AIoNv˯4h\p7x#7PJ3;;q3ZJ*1tPoA޽k׮eȐ!Ԯ])SPfM8-ҥKСԭ[QFZnV/_yǤI^:ChA _|Ann./"ڵ /m>gfXmgRJ 6}1i$C1SO=/ݻ-< RJN>d|I=bo{((/3tLL kX&g㣨s BRBT ;!"(XPJ/R; H4g5$fevwfwfwfp`L6-38u~!9C᫯ A.^[la0e)S0a\pݺuӭ+\ə%&O]E>} WSNE=p3#Gʏeyӧ`߾}1c>$%%a׮]7ojŋؾ}ݳCbɸp<~m|j(أ.\_WN!ԧ3͔lemE 4SXJHGcG.?7{ɫLLG3UU&_©vϓUM'* : [T 44w߾}x'puy](Pi3ܺuim y)… ޟ;w.0`<8v{B+,t6-A[g5+`Rlc'I(xt_IIK#ew5Z3zRV*k}ˍzSRI"`رVׯǨQ7YUfmI۵NRHg1Px48s=[U7q'piAѕxgoX8Ǽ˚;Xd$(|XpHkr вeKGݾ}[DbE۷D@9EV4KE"E DZZ)"… &Ç(PPzy*wVBFF~gGU]Hfa+]w./UAmHndi8Wip'ߋ eSَÄ|7(Z(ד6n܈Mm)Ti?/#rG\߆F1[ՋJLos{bG9cUo7wł bڵHKKìYܑ̙3غu6m~k$Zl5k~Avv66mڄ֭ZIzm۶ؽ{7rrr~z4m:_l Plذ=œ9sT-Z`ݺu AѢEݶB#3Fk=N b-2.NEDgRd K%)ZȘ=mC\t III8rHuo$%QTjoڥ(b@ >P(2V>|͞϶@5BNz|T-u^~އӀ  !V&^Y6W0b{˗/GQreT\٣6mubɒ%0qDL8ʕ… eM0WFJ?bI7n-Z}>3f͚8'N#9_ڵQbEUO>cС7oH?k֪QI*੼\ص3@[IwN,%|Ec>qd;uyyEm5Li:yQOɿ^YCɘ8,[ ~p_<şڼ>륁U`f|8KI, 1G"S稿 {}E߾}ݺuý{ߖ<Vmnk.ŋ㧟~kל~C%?>s-oa+WtgǎqEi;YBB[ btlnXPO09ײ}``Ąl0cKT*}KPh/g3V/m>詈*T@<^<\RƸq=sfjspߺи9͖y/~"7\BײrDnS?bcc2>j?44zREbV sd=~dZ̕p01[5(kN`qgT^I(~MH>tJǝj6Y VLd`c1GiCY|W0rbEc;-[ йK}vܽ{[xƌy;»c^E`n>Ox:&8}88ZhٺeXr;k_CMУGܹ B-Ѷ]-ڵ4[>D;Ǭq~ӿB*T+WP_$(DEq*<__ߍ22c̬MNx\X;ꩍ xW_{d*Tv@͸_b NVe HB]|LB;ߧlQHfӬ0m++{;ff?د34L<7F&QV}ŕAǭt8qVndžkpl50 ʗ{ =oln ?wȍ᫅uql$n>n 9V?fF8K}-:륿!^Lx&fq`劾ik Lr6s!Z D UvP%>_͑Ǒ5Z0  bcVX Oh2ýsl~'}`$̇]O f(% h͕i ,_!ص{ w ,k|vY\ YG~[Iv8;DR}㯿Bǎq%^qe杧OV-\c O a"M}IqO gm~E;n͑gWBE,XӦ|!lV_*FZaDwN-&Y}C2 IDAT;ҝl96QM8w|"qsCfʹ1r.s`K99D4h AQgc+~u|yyvq UՑ-Qِ2e(t0̞nX Q7+X@@^=il%Ƴ m"΅ZpIZ&~i){&S+@!VASCTatѼys;wкukFF$&&d2=2S$4QS+csg?nŬۭ^\}gh?sps-Vu Dז*=T@ })dֱ>4Ľ\Mq'NٳgѤI@RRfMoSİJ]Jkxuc\#m)ƎyŊKӼz1|p{f¸q0eET\E'IhPӞ"dSd"ߢmqWRrwz~1J܋3/r`TPχdٳd3@PUr߷/ii_1%4~RSq" /$d3̞{lߵk郘w ~7Ps²2G(kuwi'8>$n)'Ó>wxhѱsOo˸߳?;#E \ dOp wF>} HLL!H"S$'o:c߁2TfQD { ?^s̱/U?6{=29|>i(Grg\ bb_n K|Uj%H^\]*v22&Oۣ R$Lw '`ƍիu?ùsP\9wLL NyVsCm>{€YrIwa0p1{/zUXQT{MsFO ^\}]y?N  NYKc5 ct)nd7*!Ug͚`ǎSO3ܿQQQpܽ{ @ xaz@(rܹ{M8s.<6Mw/F-P7)<ΝZÑD%?p>v^dtSӱcG<&Cbb"6mڤf=/:ߘkī5*]Asė\?{ap b %Gݱ`ƻ_رcHJJ}_R2yyRTzw~Q!@ވ`$7U̡啌/ 5 7w^EAzz;33 !žsJL. bΨWQ`XJ|0})ߔv8z$223qxn8{>LʼnϢvRx {l2FׯѣG*&|Vd'N(kxhO I]=eҺF$Ǯ1;!tS,U?K?'Le?w\4j9/?DJpMwJJ `IT:((͛G̹V}o:2ѱ]s̘ITT$ʗ3`QR(J!RyDDK+o..萩̞=k֬$Ehh[m@[W^]+`q.)ߙ>FK+cfĤv +)T4,J%Ŋ(SNaϞ=ذaoߎ3gΐghڴ)/_4cڵhԨ ɌSӰ}~WвEC~߿g2gӗ;L) pj+UV}]L>>}:۷/:իF?1x`*kyg(.c䩟ϋolR6&NB.]Igd~ݧd*)o`6l-[J}ŏєٿgAYE!hAEQa0C>`?ڥ8¤y%Uڵk۴i6mP3bժUT 8Şꩴ!+ehټ~49Y[cؾ;sիcoexm8q׈J0# `jAh/W+b˹S*u-9Pf XgYo3F#@ p:%[VyA#s"zЭt%]lLd|P䞨-垌n@ 8SyM}͛7a2mpy? eVg\#zx~۽,ĥ9Wfc>{jdMTO $K"^Opes ]nk@6h8 O2d;Q V|,as0H?=?@ Zeu&sXp;vd_҃[tV< &ȼЎl'}/C̟"ęyz9C7~c@iBK:Y^Wb^'mbZ! @P[c~=ޖ_˸4kLɈ8 M}6؏)Yt kl91N1-Tv O A:22xK}g1x9;|{Y3Hv"&Dqv)P8. \J<ޑ.!{B H4`]4)|Ap \0j}SV U;' dc.I] i{tYIf7k+g|K6lHA HW[AŐz ˬxٯDJ⹊juG8J8 &L_ h "aT/@frjܗPJ\[ k]iP"33u:8Q20/@  )Av#p) ZBu9ӱXRNJ=-g'_~oŝ?\[3'j8SO $Ԁ}r|{qK-< sA -&08av^< `*܇c:"\W\-S/ I%t);=*f"7F {sȣ;.FFݎT+z2eʠ`o܏uI YT %*2\yᘧӛ %QuRAMhROsG'OD]舢T)TŇ_&29"S07&>s"2ٽCmddd`СHNN gSXP\t?Nk߳9mY%JGT`}gIY (4+ )!saرT oVC#F 昁;#ΗI(9FIy8UVU ._ԬYzFժU uX"k_jÇD}@J׊:1{i[?o8K+|Ri6lС?DV=zg/?ͯT)"## 8 h`&d21ۣn}o͐o]ԸN\߶m[_ ̄]v[8?&LUk?~=4;ώ \K}_ptY|/`)T!-[޽{q$&&iӦKf"uKf> JEÛS]`Oi4MlX ⩧ԩSѠAR!S9|X: Zme+BѱprCj _֝jmBe^Tpgo _X5JVZ.T;m۶Xp!n$O1|4o]{~Xĩքh;rpq/63/I֭~c"44CE1̃9[zUVVڷoO@ gB&oйSl-l6?6sR"a9, wrWh$ޓHn"y'~8si` e6Km/[,jԨrQsF*Wg.hۦ)BQL)mß*ܚEoOtR СCѶm[?A޽Qi.´}P5yW\ 0vv6rrr dRU!?>tB}@ ^UKDUZ "?oQpCalҲ~^o(Zu:E/`+cpIϿC!Lưb ]иqc5 }r78OP#!>3 3((H? Ν;1j(*a@ D[(m(i3&ٗKѪEcl;ts-xV,IF`¤ 'Lx [6~/Čyዤv+K?3@⧟~¨Qp%dggd1Z&իɵ+(@о$Uݻwi&,Xz@ \bt 99&Ѧuiس'*BDD85lZOWǞH<| ķ_q( HBB8|2`υgժ=8q(W hSPuEG̓@pJ{"@-ڽY{}p8{p) Tzս,lڲK)+Xhf♞sEZ{֭[ш'=?fFvϮ_n_k Wܟ/UG i0.^Z!T]<|C1у+T@PNMl߾?p~m[7*Tii bƀ"E MDfFز}0羾BG Jxq:tbuoѢE{`ETTB+*#h?R?GjMcAǷZ0epn 9glĸ2Q^]tX4m\Yׇ4_܅[ahXs~n< BPPA*Kc:y|}2_4 6L"E cԩmJUƉ2&eF'cΎ\><#4?{O _:|VVg}3}wʔÇSç/)Qx [5x7cEt mt3j(f~%&OIkl[y--0KyhTQF=̡?qHϐBe^DBBcLۇرclJT P3FCػw/E1<L4k87gWh|>{ snUO;vlQSze,\Ϥ&5_իʕ+.͛7wJu=_OrjR 2Lpp0"""PX1TX 5Bjf\b*q: 9'ҋ/Z| cRnj#8(j .PlYfBtJ6lHA %r`1k!%1fGUս3?tw01}'ܸXܼy*LLL ڷoYf9k߾}233ߢwB)HNNF%X_+糓Ho]֋"55W._mP^=2t¼?~߰dN 3"❋D A9ٿg!FzL͗j9PYp7oĊ+wcʟP~}p={3 EfMuVٳv.] L}Ej{*ݗF&T@PP^{ ۺu$0vZ h?@ h H @ %g )B۵/3fO?EPPF]PB{ ݻw?`ѣ,X.]۷駟͛7qE`P{[ p &|"Bpgaş}GO:O?Ǖ+W0rH bccQjUL0FUT0ܓ+fz\n%'{Hd\kK$}]FU1jh<³mn󇩙QHO t^S0fq\?'rTLsB1kf̘Gn݊իe˖vaf̘шZjF~|1j fB"Ep3~.y;p˿Ϊ\'_$nŗ.]zj0cذaV M6FÆ i&cvf͚[nlDJ>515ebzþ =&}=]p`~\pDrРaC4i !!þ=cnj190i4/_a+/K3%k2o^ٽΟGjj*""#Q7߻P|mxݻcO>Aɒ%E~6{6'&7hrhĝb^}U9K.|=z4.\HC 0 3Bn&&`iWW>,X^zaӦM4hop;B="|J6 :2wɜHHe\! Ma2쎷cr2>S!55Nĩ'ƍxkpR?%7h?;:':dTܾ}ϙ[ӧNSزy3>115u _Y>{(35%DO@fsNшƈ#e*쟰 pI]f`.Y7 K.W`ذaW5dA\}^XW95+V3Ufys /ۆ]⤎%Jzk6eUNJ#oquN歚!)))p4;o+/cx )22ժWh, IDAT3ْ3O;u$222k@DD5*f`f:c +WsC/dggPBTC?22RȌS2S<) 4yRRR~ٳ="V=7Txl `QiiÆ5E@ly*@nM4)mff&~'5jzтH}@chޢ/۷namظ~=L&n\8;!2&`o fA\r0VWr7npז{{TYy&TZUoW>~{w.a T О-Spat s(\*VWFܼqC @RǐP.^9suÓql}PjU(XD"2'I\H}v*e?Fff&&L3fxC RJG#bHڶS$>裏Yx|TY*bbJ:"Ԓs(*M/}Ic+\cY?ߍ4qiӦ1bbb?ݻ(RaJ`q;o3V jiqg-1N%%u۶³+UBdd$רcII8sO2G /q26k?~`B?\xfˆ#+CK J(x`zʧN]bcQjU4nDwKܼqC@1X>?4կ/Éh& Ñ#GTOkׯ ߻z5_iV IG sS'OZPK~[_ k*U G%ضmf̘ŋtT zyR?<:'N8'xΏK.غuƚp)EW8q7ګWiW  ,_갖& cik-8H8s7?dqkpp*i-ZT055@3Ǐ $ CNN ,~E DL . ι@;&_^9!**Z,7ޔImg Q!۠mZ& o" **J SRH]R8˛ǫ:㞼hRɽ:Ą0-:OKΟwy }թWr: <(fV:u s)-gYIPL9L#'!rM "@ hJ%%`ؤ̆e@z0k,,ZH|a8s: &IlN FD/_~YYY@f%iݽkӰ7;S ի5@Y^|(jqT];vxZf}cr29{v?>p9:yߙ6[M O P0fkd}#¯ƨQ#QLԩpM6TvJ]/ռS*%#`<]%&yX.V\Sj !'7?Ϳ@Iu+pd;[=CCCѠAh-Z?n`Urd4o^ y SsOC=o\\+xb0.ơH͚{гk[zn!&& Gj rT2COf2'(dL}'L׭[z*LRR:v.I݅`@t]bi YMj+o#I.lr6cvlۆxQB4h 7vhߡS'0ưuܼy!!!u^ j%$ 44YYY B X6y4ݽ ŋ0%(^*W-[1RjwV}ۦc3>Zg94p "@ 2@YRTk Ň~֭[N:hڴ)~wr\(S *(^4L;=M}=Mse^S Lr7 U{ G CR[P+Vh?-- ]ay.&cGkT+/qƽr#"BnFkkV`> G~&td 8񈏏ǐ!CpM 7HH;6x:u_~xubÆvq홶w_$ۚʋ^OrzrrnKSͶMI\vbW^AFpa>|=|Ms/he"99k׮̙3ܹs_;%FCʕcg*e@vma0PLYأ/,]JrCDsrm\jq?(Wt 2\p!! _ȑ#QjUI6@' $Ʉ:%>SSz CfͰeTW"55M6Uk` :M58JZޕk5BYo RG:L 2X_~݃n'xΝ;w5jwnذ+WFHH:u 6P E㥗^رcUM@ ѣѪU+g[nuIfΜ*jժ0³dO=n #@VW(ݟ{\N^ȷuƕ˓%$)>[z([M(ٿYfƍc޼y źu됖?Y۶mqidggcŊСdbII,ؼyso0LHMMѧONA0k֬pN:vᅬ *7T-۷n@JCdzHOp9x;S@[MfI}> "@fDBǎ@ ,K/'|*UreK/jժO2ƍCҥ1|̞=j[f~Zh-[+nݺrˉ;r)@ `>>Fkעf͚#/ŋ|Xx∎k _AOjh.$Ƚ]~f/;ەäIۿ>?*J;@E\cL!88W¸q㜆U_… O>FNAƫmo1*4ɺ&qp YHL"2)HiXX)J~ m~ J\^ÇK4a*Wׯ߿_пEMN/\|ْ@Աs7s&W-920|G6}8:ȿId!2/DGG¦$>Dpp0F#F#ƏEc„([s4˝T,<<.PPsYӧs(}?Gd/?͑SOjLNC IǙW*4js,_i9s1,/H:.\K.9|ڵv[ 0wWr['y)vE^ÿI>'L ȿψ7<5?)'AaJ/t=`̘1x7q5PC ̙3o9i]t{ѣG^Zpaܽ{W Q2,yM6{"p9u5eM |$dO_3ÃZ\L |#]IEԯ_ UVv0 V׺uk=x_1,X .˗/#(HHb2>nS:sەS6\⺬2'ɉ$ug@ОHg֭CΝ)ÇHsؿ+WlzQb܂`S؍ޟRIQ6 6g8}@fuK1 S4Y^miŋ… '[/]4rN 1'{JmӒZLr $ȩ%IݴMQDJ!JEcFʘ3ۥU#N 'e>߻w;F:JfLO+TC AfͰy&IYXWEr}֮]:h4bҤI.\ҪU+:u L2(\PEx+yF՞RbC/6}A%j+@sfZ5>Z@|1@Z{hf6=j+cLO=w bŊXhsc0 8u&LRJyMj䫼Ocq|eʿ7M+w늺N-@г$./J—_~cC3+BÆ6zV8в?# qkی;jM+f_w'+v#dj?'mbD ǍÇ ":zd- ͛[w%ߦ^{s?˝.`H)*BLՕ4}mM+ 1BJ5=[qQ=SO=BBB1h(WMPg>/+a>>c6iY{u)0@y'1|TV ŊúugB*UozhԨw[n=<([,{9ܿ_xvժU[YErËK B`3ƼS`{vnFF:j*Fku/4hpuU>Bj=]6wQ~&$&<*c5A]߻q^+q#?" "nCʞ#11˖-À:F+W`ܸqcŋbذasر#RR߿`,Dr,M[?'2Qf5U#޾mD)u]Dn~˜fLGݷ={FZZ^x|WH$''ƍq7$#( {%kA8@ zK~WvnݸqW1q$ 8oŋ/^zXb2N#">SУG4l ,{>gddd`۶mܹhmڴ3go*\b dgg>dp/`KGNܞ me˖E||<>h&Oub͚5hժF#F#̙~c§d&.K[[ğɐQ5nVhgy[wUFLְKy@7>HpdOmHq_~%ڵkRJvϛ6m|WD4i&LcOgcǎEbb"ׯڵkS+2;8I]{O ATxOjgF<5ĠA0vuV̛7;wT,I: g|1qaSX1*U9'(*T0!)W6gYrI7J`5"t&F휒"ݽ{wt] ߹sо}{8-+^8V\)vBw {A-ASm~!GPO%Uz1wqRS{gҥP "(T *( ,=񩀊+RTiDFH]vB:#LI2I&Sv>a'7=sGR*^п]g$==v(''^7fZ^2/ظffBڗ|}#㡠؄)>h-֯NEfa9ȉS< 8KF=o@"'N1rw8c'HH`ٲe8r$vƾ}d<_zj:QL^ZD\=խF\Zm7R)d8s:xshI@?"3?'Nsli2{j~TNq ɽ$9;) NÏЮ]-˚)tS^_ lPʺF5paLxE^͚+k 2_EB]+2KYDN"ϩ2Sk!ټT 0QM$ڟn@U͛މnݺ*ҳ|z,켹6\RWu Pxz"~;:*?ac٪+ڜ-g9qω1;,Fu):0Yy5'"o߾x1} 4nEEE8rAg}ԅ,8"{PZJ brdT/P\2%AALfr޶Dab}ӏb2w+ @ܰ\2RR'8()c 壓SIGڵqڵ ?s9Q'O²e 333qiӒ%KH61M}A癳2ZD r2&dTaw- aF;7*Ge`yxʼ8{R3S D0`kR|כSdX&ldgܭ[bܸWq-vܹ3֬Y|۶m ~ШQ#w޹Xk?!CkԨUեrG`"r=r)Z[:@oދ@+j=رr^t\'8UTj`s1TXSeNy9.>~ҠApcT ׋%K׺ukɓ0tx1vKx7S!pv#1rChdώ>cd#n7fqc8qw&hBL[ G;.E)6i/ 7\N|+ի]_qG-ʍ䡮@%;ѻcbZ jG}4~a$$$СCS^ФI #@,%cZR.sWo|Āƍmb ??K9WS9;v8bﶀ cոꪫSTbblM:fl3 (\_͛7Zjժʿ {W\qn֭Q`ͥܰYevf/ˬ;HME# Yz1QLW"1[{`ՕYB)Q* ~dSd(3`W*@ػ7ވ͛7W/7|,Ӵo',Y>}zcѢvcƍ ;|Nǎs'0{'Ӵ6_IcPϵ^LAڿ]6 t Z'_@6 c@ɔT]l ~Pa g /zP(N: \`<cSnaР{M矏ݻwwSlYoׯCᬳ}IƨZ8y2>Á71!6L022ڵ0bW;,[۶j(&4HlP9̕ 8qB J  I/dkȁ */ߦͅطoyg[JoM7iӦ|&@FڵkqX-s߿rwcŊm:'yT\_ rmQE#:d?-Xil.L˗/[omnWRf7fͦ`YHIA^s%}45HA ,OQ`BiLI 8A ؉6mgkv(g=bs'N3=z2WRffs!7ny֭[A,Ǐ֭[đ#G?о}{ }As>q[ d#)ɩYdMMf}woӦ vک_vv6 E(O|5o|>̽W*-^o^PZ̷(#gvI+|`jMQrR 哟oիQF iF~v 7`x ,@M/5jGa_ ڴA5f͚PJ/J#{2U,iڝ7lƑ#qڸq&OG "iɓ2:SwOp$P\KY eͪD o: [8X9^.*AG@vK9yyy[PV-S~ztu9眃9sӧ>l̚5qP7l3f@6mЦM,[ +WDvдiS|7@@_y UtRKo^0w\ճsɓ'1i$|QnVrsay+*)w&0?jOwg[СC\~yt蠾ztHL+Z^z\)!DBYY?HRX:oCcٳxp]eXնpOK9g8wyǎýދg}V{1|p>|FR=ҥ olڴ)x;w܉uaxױyfo:u* _RWf~z\r%-[cL.ƍpy%<y7@Fzr^;Tg Yv~9>&ߡ p< L-k*ބ G#_{Aj jfZ.WGk2UZ $$GiMW&KU0je֖%ABDOu+m. itͮmDJS4ՔSy[o#11=z#?C}w/_QF!99Ç])QJtM:t(,Y"ߗ˻8f͚ի̙vڙ+ N—_~'n4o O쁿UƑsJ}?i4<6~20PTfyzJէ$QD{dh^ǎQ*UD^ wW_q+U!ǰf)];%EoaHq䈺gMOE'{,+۪|Y'XAΊU2*6E}???UGTj7n\verssQn]?N:@qN:*Uv /ZyyyXhQHVN߿_~^ N:oQ+HpW\՟S vt1DMG2x z e,%r=B$mkYscd ]|J"A,PSz16Yú+..oG#'+e];1@N*UN> (,,DZn EEE1o<{Cvv,pH2==gΜ zެY3j #F["U;"===^,+e[ߡ@ZCnS3$^]f2%y*ukx:5K@~BD􊊀5J͇w˳|Т#Fl%8)' Z2׾n\Guk6mޞS#D)~#; E eK ]38qp ?>^/-[qo߾1uT{7|3fΜ ׋wy'<͛;޽{o4y2z-?;phެoNŮ9qw95ޡp0X{@| b%+Lݺu,k+ɓRY=S,D_ߐ ;h!Ίqpw,+G?R -? \;1'NQ)))HIIAjj|^z3ggɓ}AGѾ}{\z!Wׯ/_J+R׮]%(CXvnXϞ=K7n;O?vZ\qC`oE'Α9U;2R#kF:^>{b1Ei[Қ54AUـGZAH}Nd+, o.к[U|: JtPS'a 6,g9q!za*zJ۷/+?#իcު3y!''0Gʿ Cݻ7^~e 2cFyj En|2@K,cƸ6cp`Hw80[C"5~֙nř6|'8LFjmxVIBqii>0ɒFxX 5}rZ5Vz((PjN'B{aզḎ}H;u&p.r9s[n ob[ hq%0nmX19ŚT)\U jFȊ ([>1):ADg "!+-GR+4 )D'D_ fVVtѓWw+'h>+X/ G7]c*a l#nEN8q3Ϩ4Eƍ?g+ ! ~ S 0$'߲ b, ĿSm;Sh$%HN0os'Z D9~IM5_Ѵ=,-q #[fZ QOĩS"oPΝѹsgUƁ^l=N8+b8gNigj3Uoh+ Ƃ!*S%QN庻33GR(Nɍ5D*5tg^x< ի՝r@&%'{ж;w =vw,(p r](VRzvQ닃Ǩ] l;=7\U~udMNQ9p`hD[c5~SKCo8@cF N 2Ft|/{!z𩖌=L$X\ȵ)/uR|CD~lR[Z3[~ rƷVƗ) :rĆOy׾a/\'cȜ WUsvZ:Xdc"'{~24\O|&Tބ,\qt&U]po_p{ PVw͗!fZpeD;-[z`b9T4>-UmY _֩^F8B[\oՈq+MKRxQcR!/_a:?iE s!'+eT՟ t2q?Bf‰SK(.qbn+Gv36Tk` JcPWfQXBzzp좣 IDATF)MLfv5K:%&ڕN H9!Kɑ7U7 XUYuknZET6#Kj 1xxt]dI2y!nM;>|NR=z]p!\O?-`v…&L/]*`XAw* %J@4k.~_-.W]0j`OA˪}^aP:E8q{xÇ W{* *`pG?xiB׺$)ߎ0X$}0dy;^c~q֏'?l2.XE+b,qիW'pS`PJ:<\ǩBvuJE\J:5iիWW=O7$~d ЦM~v_vx9u~睗6m D&qS# @~ [()HNnE#y`Ǝ5URi3'N06l#lh|iJ˗iiu1zeZW=rD|7·xe\(Z-ce ~1m \ (;N1Q:nN!WU aQ pPpı< Me"Q^p\_e)+|_ Kj@J8ݭNKGYY-[1ݴ1X E., 5kFKA{D@: 99?=YG `)zZ<>p qVNNC9Miυ wX0>o97AKFWGm tgv<>W2 G[W[S$7vXU^6f*+"08SЙڵkGdUj2] B-dV&ll9}CvhpÎ*7(< XXKHg@ WfY|^B_ ?$v-᫯̝WW`I߁'|Q{?0{3Rkr}êU w (+Sۼdh1spMf'r+guٷnWCH;wJҺ0."h`:|G})}N|٩0l[DcxJdgE;ou68q%)`*LYaȎ`–P1KCkqȑL>}F߂X@ӄS }о=q#:0CEL,X : 8u dزu  w bf b1_%,_{.a7 h,Ӟ4 !ԭK ~!!bw{kyy6Ja#{QwHZ5=zۚUbȐ`Kb[)kJ;e#w$4ls o?{;W G0#6m\rwx؏#|s[.f1s& d@,@qۄ~d7n C* ~XPRg]'&%H=}|E<@Q6VAڀQ=7bn6XZ΍dG'زS@aoԬM1?ZZ@ Be/Aצ#'$ oYQf9Ur0DODˀ{II{Ÿ0}t+仃ƌ3н{wWE]wv ,ZZcѨ_8bquC75yM FӂPw&+y)>vSX0Np} |n]RW3SS `M! t'$胻vZَ7, RjGU3w={}-9iŎ} +A-r+3};ʥ$ٞS?189UD#޽{c{,zгgO$%%YrϏXg5zf%iH,Ǎq;Uup*d洏,m <|N"CUp4h eki׋OaNZrr+oh|L;iҲ-Aڿ`MhOY3W؞pX(Ap/r(ǏO>S'NWFףSNW;<̝;WNvڪ<222_n:y$~hM6Rpп4k Gd2#Կj֬qTPP 2)5j>:ur޸̢a$S< 0F#6M` PRB8pƯNJK6ؿ_cj}Fk0t7 xQQjr_<ʺϾB",]*誡 6 #gw 7</ ҇Ǐ X^ ;q";|g^}$O|?T [^ }ևuDg0}ʶ5O?__,X ?ze6XHܹ_%}jSA#=1[kMX㤔:;̒UR^AI3/l/ IU_O<ó>k+l_=;v,ݻw駟9_DϞ=w^u]xuhmcZ.c5ő}|N{M\>UIn8"LKJRRЪYGqYi`RA6&+.ʕѣѣE01oa6 x0z %eX,l\)晗`+D[ byy<1!+av1}B 'ǃ'|8xPLh2™ g7+ȉVӦ X>,\(>ۻ7lW0ztpΜ-[ļ:{NY;M}1$c73{O/6fJK k Bcƨٌ~N6m[ βe dgƌ24Knj$5%#~#0gvӧ|CX+/0jaԨ@Zsج_6m279WI, Vxxy`plL?,ʿf h| M֔l=𯑖,]{.ѣGZt_nzTE4qY|9uD+W˲b ?ɩ"^RRnF,_btMtp")ctxϠ8YXevo,]1sexy x*1\5j ׇ*TA+ޞ= `$ĴahڔA<-!=]@[ffa2$y=''+ CZVHefM>8L LJ. 9;C$&))}Æ2lɐB6h?ׯpY+h4foޅOl&'N<]DS?+1VEM*$)77M6mƶl٢# n YrssY4k XժUiiA?ӂTZ|n{0ԄhRرC!*;YE-<+'KEo~?ʈ↑&)f0YPL,6+Z#s/uAψϽ<,\HP dzϕJd"P!SSegmꪭ17ʺ aN3gZb~&+I!xV okF GpZ -!)*Τq/Tz /$q[p%EKf͚%?czOХKww܉>}ꫯ|x$%%믗or1%B >NnoaٲekΝ;ӢEz|r\җΝ;cѢE(++e˖ovK̢1t90g!B3f|q.'[ݐ<ӓ!@̉StƎIhP>z}~p.XXHw^?W u;yR$H$Uot@)gm2/ a!}@cv0x0+_r=+Ypgn;k}Kv:\%R\z`kZ글V{A/]7vxcMBƉL}/q ȉL6GzόŒB&i=#JH_d🙙ij.1}tKW2220i$L8Q7I&aȐ!KЪU+UشiE]$ nݺ]ve=z4}h޼9&L*Ϗ_~IZ^$K 1ch"H^PX2:u* -Bu7wӊ^$q%Y&ӡ!s[ulo޽+t5^@X@<,$Yn.YjD:03+პKSرeͅ5-  z՚w׬Yk:ў&`tY6kU$ ˈ'/m5%%W_ $Xh A/.~"Ga63I'=_fͰ uעI ,@>}ЧO_-D8  ,MoơC{WL@LRvT&.t݅~Hf`7bGs=,pyh<1': >W8V~}AuU%07@H0RH^鸂P!$PSi}Uxv j}J@i3 XށvGO|r7lk$H& !VAN?~ 0%)1̍E0!*?tԊ#>kޢ5{RIHT']gˏ/M!5kfϞ۷ifѣz聶mۚfokS A)sV (Z~=5j Z MroM\-@:f?';.t\$^jc) h[$Qk}By-#PPe+h n ?斄mPMC*0VV[!.(v]f#N^\*PL7g~{NTɚ^P_.Ao t::%"|whԨ!z)lٲ^{ko'|bQ [/HwCf Ԯ)TN#&GTW&]WgFaƔͫTQ B`j+zZf;Z;F~P G ̬EeP3ft- u LqCC[ w4cRp@{%3|Dvj Y¼lAeot;7HqDˬ`f>|z+gV@Se w癋0(Da&C| 61x)5YQ&F֭[#55k_4 fa!CZN>ǯ-hLx0uj N.A>CNNˮ|> fHF~aB wܱ ԂW'N$`6u\dgŁu 6PB>>|)\6/n    0j BxPT$e{t̜ ǎ:^rPNPXPV&lk#>zvmI/ļNbР b8x aРs *@DHIT@Q1SCm7O‹/fDtJ`|Y+w?Ew9lbtT/)P>gOb,))%&&^u]w. ^)M)1%& FQ`Q(N'XlH(d~hEWU ZÉSl@% o9Lޭ_??{v(;.BCM,i$l(qOWz ׸p{ "++0 E]z>yD%4g@T5DNH3$'J'55 E}QQRRR XYO_ڨۊ)dRRۘ) B TQj2\"ULqU:&jG?<:g55P@&I4IC>$p}{2K6)'-D^%6"?R$(Jqi>|36=>nkJO=;49k,;)h`8sgfqޒS8c9%ؾK4 n/f !2|>x^TWb4;9űw.DI"P@/d IDAT਋EꈥCí{}k>)54*G.Ԉ9l%fyNVy cжm[!)) 7n²eKm^4?x,[GPD"=*wLaQ闀U|&h`F@tHkVhذ9%&&"???BܠJ!)#$`PP6" 륭?9bbc:YQaYP;Yĵհ~N>f7YA/+0s2d߄ Fpן=9X5зo_Z V2;&K*c{~<Ӈe6U_aSyr3sxg%)-P$zM(1QL/## tAċy_j8CJJ),*eQQ1"`(V!tƅ ΂ENF!(2X' 598sEaϞ=ؽ{7/ 6l矏n -AS0c+ oSE.T|0N+0h uek=}Lk5ٲDŮ Y޹7\|d7I:T[*ddi/-ǵ3.9XβcΉ$\=֔7si8q %֭[';7n1`0V4'" nΝ;&L?XǎÝwYɀs\)GRň P;U :u㶿Aǎ6#~  3M;5( ±P3+`LW]uK`&9EQ @!`f-\|wkM,dXSSP(Û6mRx< >7nBÆ 7-c1*߯  .'MhҤ ^/cGV2L" ҥy"nX7˃*{񵠇*-O d!>> a*)ʖ<rgC#2Y ϙ0{x)YSb̴ȩ Bw Xp!s#ckhO#/m2Ų .Ĉ#{K.A~бcGx^,^' .(_+SX "]-#~8̣ h/Qc`/ tk׮M.) f0*j% D~1wi1]@m܌!Y?OJЮ`1YXྔS9"5K,Tɾ!rVlDR"'d>\Fjɓ'- bW^ݻw@x R ,5v\qr~yq7*~}I1?j)6\A" y"Z>6rd@_O@mO3D j/[Y25b,873Hnx*nKe@E2,AB) nh%XQRQ5%JܠޭN'##eunzeڹs'6m8s wQUN)^5b ]prEL{cv˃V@t@f|#iMebN}'I5I;}DccBbB;CTZlUl)}bڑ!,*-+ ۙS9[%Ndp {!ddYR0=z 6 S`_-ξ|~9看'>|M4vTᎍ*d~J3avh̾rbI/k@M`@AxFD\% T; 򕒒Ubv0xNSO\wo '}vFaK},%/̫v,ν}|+xqۭE8:t(N?N8-кuk :9998p Z8[v 08!UP5fs03 3k,ËSd%9op8>۷oZ#|ArcwԨQJ8e2Ŧ GœVA~}NYY9 !t_.!1}"5JKKQZZ̙3F a T?85nWÇw+yY9">"7ˆ0f򞒋2WiYxO*tu6kVjԨ1 rfה)SYm6ڸi#մ)Mcc4e@Mbشi:u*5ko0HS|JmDkc,l~fqDmbZ?dLWRSS ;XqbPrE_SyɿԱcGJLL$"InדјEY(>C6/+.aڑ B&^XDl$T1T~UtJކ ~b"]7p׻wo6c 8NUר8=R*ڵkGF#0 船 {:oF0#WdB[S2m練'|^xn+&LtOO EA˯`w=~Wo1lS\wRu/ԭAu֥ ddd?~߁&M;'\fK âUc~v['NvM5ﲲ2TQC7}{ Mؾ};`޽hڴZFF1\[O/|~CC!o}o}opˠq8t~1.gda)VQݱcG|(..ƶm0fh 8*Y4Ύ<\|q[$#;;}mt?صk7^zi,nv9" m(6Ujo>u| %7ޛ=4 grk2Y]B_gI{ uԡp1~<yZ?6 njA1o6{lٓZ4k֌]xᅚ. 0P;v,yn}>3+?~|X3emPn 0f<,(XVLgFLe"?qU堔TL<^?!%5& HIMK $ .$$x>o)x+e>1u+d!g1b%䢷OݻOXi@Y|aԔE-)sXDqּ~fɈ 769xA6UV1DDzB چ?D޽)%%w}7?ҥ+ ʕ+Caʕ?z]ڵÆ hW>xtBiO=zHa7PPbb"n&|9+nFY1*N??'k}ol]!˗'%x<" Ob  )rxu⃙6W+ZYc@9H[|3P Um;-⌿ KHvɽAO@?֭[efYK?blذM."8q֭[>moǃ:PO< c;›oU`n^4h ǓpW m&d: ùkNv#ee5j^{5$%'PFM %5E~Gj֬bJJ0^i{.3dO3&݌m0;FU>@PuUtHg@ѶOfߡ!Et@Pʠ|YpĔՖ_:8%n$+ff&ܪ\ŋec~S0`5jUVE֭iʔ)좋.B͚5m۶F۶meZڼ[lɶn iirYڶX28w(/FIu\5kb֭VEߚ0{0.e$-MdsZ|\dG]W9W_}Ç?ЪukYggO:VZaZ#;'G>)j^+MI=&w M..W_yjԬ./Xznv]&a6$]Q9w0ab5!P*w_q#wV"^ȪljD ª!T]mT|X;BYQz~7ŋ1x`Ɉ拉;vP߾2e]vśoI:ut 'OF.]h޽;$۷eeeˣ>t΁OѠAv[px׮]iΝzitSV ǘԖҠƂZ!HW <0GF֭M^wu'(,,DII -^k`b'ÊKhb1'3ijwB1qy}]^Xcų:Nd`?g☩"~堀j}|΃ANW p}I5,;.a.~u鞈D5okߪ?9^RRsR޽,9xjԩzJеk /sL/ڵlgѣFaCĉԩӬnݺرckρ5sx~G֭ZQrfπoI-)ZB峤 `Jym#";;m^'[{!CHHHWKK֭ABG ^ :[1eTECѺuk\OT ޣn-_ƽq>WpDa֖ \ Y_XRzn PHFGH*P_TN_/e:k%n2ZѿRPhP\\ׯn}Q9nvC=foЀ-ZȬ/w?p&S.,Xn;WU^(3V,7(9Y$P~,Yn<1l~XaaO x>O$UEW0X.!u=`֛L_=RRR3gΠ}xgu>sصk'ґ2/~5kbӦjժ]/bIXr% |r] >W>=B-ͭW>i @ ZjE{aQj .MFo{ުe K>L;pNᖋ+=>Ajdg_Y^75^YQTN2p"Dǃ7_+-> .Uʢ7`XCSWVhf}n:/{VwM:U2-[=Zoٲ_֕}= }No^sP%A8e?ؾ};eV]> h;!R?QV0@H :ŷk!qf&h:+`(ec~+@`>Y\.wz* 23Ap =X=3>cxPvmkpUWukSLA^Ν;aܸWJg֬Yx{/~-UxFF|>3fLի#b >G dL?B88hwEZ .Pmhdrnd-$wMިNd!/㸊i܎ df ]1ڧg qd c:6&"2_t|2 /L  [6pw+Mnԯ̮d fU^V۰aԫW/5kaGaJjӦ }膛寥?DbZ@>P\\-[͛ ݼyHLk׮lܸQ @D>|%>'Ue9ة?K@H^2W,Q RĘ?gl=,ѱr\NVfN:SdG՟빋,ȼfoheg$`opΥ=Uԡ=Z8q3k8Xpڒ &ܹss [nÅ޽F| O 4@II~رc`Ĉ6#U^ .Gf=zT|jՖw~ k׮?L9sNXpa]?3F/ðuV4mTu֕5 j֬}&Lqi Ƙ1c3> R Μ9o|{3f9"š5k믿b8ylW^C=da,hzH"ihǒ8 tdHM+Y̩8MDezga$#$ekժߕlkvY|鮿)2lL?)n+vw _+9krѭ_ z\[A^yY},=tZ9*vߒOʝV 1f+Ͽ/SAFII)j֬|#ORSӐ_{ h;Gf{E~~RSРACw~{)S&cΜ~A@wdfG}|$&&য়~B˖- )Ӻnrss1`|>x<   e;}L2EH֭[1c 11HII عs'իN>3ǵgy(GE&PAn1IIo? .۷3Lşx^L)kbԎ"{*_뺏kN5 K @)`&BNCx4 9΁Um _/@䓌%L< IQ!οfԮ"VHҎd;'Ng$7ňx_@ͱhbT8bLT'"1z8qߏPTT+~;-O>ƀ>ŻテW_}#F0\̘15k4kW^y "K[z)nFc-;vLnTCNN&Ů]н{w]~3>(eseJQZGC6}n0kiũ8VAo.#1\q7kQ6hԬ8E+]ˍ*~+ F$O+umן,JeqS$ռIyWiݸᩖ>ov[|d4heA."*'Nƚ8#x ѿO1||hԨ!<,X~#_/?I ??CII)stw/.\3OۋEa_`}xg['޽{7:,Lt vU)T`ڵxo|ӧOǸqʶVO>i4q'7㏛\r ֭3Ν;o|%v|kˌqjqLeO+TUWP_Msr/>ZQSpiRUrLԋCՌ>; |x* {X"  -*DH60E]Ǚx!iFH*M' '4 s /?3fK}wwgw\-fكz^m~ lڴ /͛  ;R3kbE{3ݦƍ{n۶;.`;3}E?x70i$r-83[ﻺpuסf—eYlٺVQ8-}Z:CO8f4M m\pݮ!~; Ci5=zc]ܾtf;@.y3I-V}~0أ*U{^H~g7iZ9ZFڄN4~X!1>Ѽ#{o_lݺӧ^֬YyaL>?LcÆ ذa2 n_{;v( /6>hLڎ\nl/|c~?vmX|^tv.QG>sKq^[:Pڢqy 0a6Ӄ DuXE{EDԘ#`$= Zi]КB?lIJjy3A68" H=5pRkpͷ,7b{Ȓb 1IP|Y\3HmRE}_jIH7`94,\gIvw=ǎ;ӃOسg,YϿSbӦM8i4ivޅE.M7݈sb͘6$)tٲeXl^_f̘^ӟ<&L0P(;z{{qQG?0ƍ+Vƍс38'Oڵweca֬YǾ}0j(ݻ߿ wyn݊5kW^R 7p;%mSC_Ep񤒑 ۙ+UYXa;]C8zy0tLr* aF/&Ϛ%x6a@) ~&R zMH@TJ%^ KҜ`#ӟ< / 7|^M@?c VT-H50P볏EMrRW.^|'?yҾޣ>x{^_~#|Cgs9sp=_)WXao媫rn޼yuVp7luWw^YVnOږdG"2 ݵ?)ΝKbڵΝ;sNL2֭K> FEl{{x5~w?+Y8^7WPY AnmZ͊g{=l~ +xvP^ZLs:-bAH#d?Rvŕϛ5(Y򴗵v*ISFp*J!!=ں/Mf;'k֬5ktoZvJ78/AD]x_%@b-Li0 ٳH-H@iY P0z t4 b0 QÊU#ʽ4!Ћ&ߓ,e~=%{;_r N,T0r'o Hcd ˚i?},*%⽔4 =9=\oRV|q/؟=oogWhPIEdQC/ y  9+g (FUM؇qKҥQ%:`͊Ɉ?ȧA*.TdxK/^|(@Y"8BEg=<ySOT[BHJF$qWx )>UUM1U '=XѼMKk]m, :Ճٳ8Uqw~G+zK;2 Pb$ܣGԽdXM'-R$bT.#@7E|=Gdޑ=Rt/:2@قԙb"}ړZ:ß[έ*;?[[BqP1 #8Wt]w\Finn1eV0kN_˿\&{"ڧPZ)޵)EżYq6]AgZp3y)wl,m9}HEZeXފJڊgx)WQ"}{8{q)̎!]u5C:tz$&dy1k54j%ojẄ‘rJ%f,Y+hFyp̚,5kAi,e|>yG?lqUVT)a+S꾯3W* joi#>2 R <VPȶg_VWd{Ѡlsr ⪈WUnCSHjv4*|#,)4;Ukgz¬It:zB9lJt]fNVgW;n2?1P*:n3qѵUQ?+U-vЄD*puW<D.׏DD_ǍeSf*E)BR:r))Q?>t|,\KP~K\՟r@) p0g,X qn'"Rh1y7}1+Pj2N#@(U[ E E$qQo`/v0mVGCMe4U/q"RY1߆[+R]oִl|Fk`O(pNY@@kt/z Xkk4M3ſszU4ЎN9~E`/Ы%]T !@+}qх#v"4KT9rN819u|DVh[==D2K c$&}HP<\cH|g3 t]i4.atw+t|3yi0eZ\wu_LPf7 A.Vʏg;,7ɔv¶=2!LaGxR(1e$ ? |NuAi?`zxVYz;=D4B9j yk4[*m-b LFHRM?j܄p)oTŃiHFb8G򹖰;Z%y\Q(!3@*_Qʾ8Wi|x8s1nBϭ]r7 "Pt]wg(@4 GU׉4J/W I±9'bPQ?éizEJGޜE*ЏU{ `Xs߂?ɠP(a4M.KwW(Ksɽ5IdZ֟}!lUq=5krЈu IKsVY4)et7\ļy帮RJRc|fU鹋k kkV0 `Fz]@ia|8J y\8 -8E -BMkQ}`ߟa,.iLhLsy1pu'tL%U\$kxn-;ů ~a/^R ٕ+WJWWZQ ;;{=rQ dȺ -JV 02!$N1Du ˘Y*9 8UUjwT6//p\~^6d2NMӤP(@ ZP1ò6[)WyŪEUŸsBH 3& ]H;mKR\BsXzUʺ*uIS.%7Rgkn."u_7 C4뺮iZAs߾B_< P_OV7$Fj2%4'BȰ1u*MCLFƾ iF,&5l6[Q2W뺮v?QJ` _Kj)V@J$9 H"̓VI B*_g/@?tTBժ86<(?Wz^G6!h|>L&|owX2Z(n]:ʶ yC)% @)2r` R{Va]Dl(UsL !B'5sF߷:HGBTxJdT`CMHmLJ^-L&BZdZ}V1]C;X{d2].p!(i5ʶH326tۥI6[___ْS1+AW!ŸUN[1Bi9!vqT WJ@Fel4Ml z(uU)+ĺ!VduZ)Z(2" \@CjB8w0g@Z}]3MDgC τXvW NB!.)ZK;{v[<Xl4!$&E:8dzL;5~ź=w}̚*r rh>hLbN8!.$\uehwTe}/ّ^٪R B!$X&!1TV~LT?oX!B! Gj k˾zq]E?xEB!B5`j8WT2fkB!Ҳtww3!Ʉm۶sHѣGW4#GwwwNVB!BOFAd 'u^Cc=E/k=`1IDAT+s\2PBIՀ34~PM6yHЇlHH\70E>!B!1Dh2A$Y@޾}sC'B!|B%#@alC_hU-+#D0޸KoO޴ !PHL?QH!B!ddSKL:/jk$B!BIʧ̟IENDB`3Depict-0.0.19/docs/manual-latex/figures/camera.svg0000644000175000017500000004151112640746376021436 0ustar pcuserpcuser image/svg+xml X Z Y Target Camera origin camera up View direction 3Depict-0.0.19/docs/manual-latex/figures/externalProgCpp.png0000644000175000017500000041213012640746376023307 0ustar pcuserpcuserPNG  IHDRDD8hjsRGBbKGD pHYs  tIME%Y. IDATxw|oЖ@)S6%XVWAD@E/x\W+ pQdLA'K@w44mڦmR_<Ţ|n~*,1!{YHg2`Χ$[/9y<뾛-P&Yi1e})rsl]fHtAĭJ_^\EeeZɨߪꞒE/]QZuI^%]_b'sK/YċO;;Vl(j/:)Uơu|ECCPqs/o!Ik>)wf.Ϡ$™Rx^QݢR~WjFIR _JQ$y5.A! pm!,R38t6.E;6~‡v ]? U;ZON$uJ!¹Isܕ@åklv5KuC*E.p%s<Dp I[^}aKrS՗g9ENwv1p)PFdrsS'i(g/׸ 2j>t;e# y(wV'@/rVk}__~=g9 9 "JxPc~лۧt}V!Iʮ=خgPb@eH;Ĥd2OOlH5}%I7noժ mi!o{jU/h"% ,EDAD;\WŅ/$0M|}h?X!IQD99.!J4B;tg' S|z>>.5H )8" 2Ȣ(J5nϙ !N uytf-sా}6GŤh'b .s{!=5NE-ԼI{P+ݢĔ4u޹o*r6Ց.M{M|}e  ܙQL}vWZ #nSΚلUICC@-|m|\O}R>FJ?%I|L8>ߣG 2sl(1&FLe/ubjjT"j^I$U[w hd6lٸ6U=';ԡM2Sc+>%MU8ٟm6$*&egPy`μPornvÈKnv\ܝCC@Q^9#D5VDaN { K׫`W_E#DC@A (koT]::uLLܠFOl+ hoOFdesp-K$ygfvVnwfy:~VSj7w_5O=fpQLS1zbE:M'IPHP5j6?dMT s UYȝv+M Ux}7M7֥6ur!!e!߄2 eA2˜.ܠ4U)!g}VE&)BYn7ZlTTq坭fjQ/IUM2g?f,;c.e*8GPu}9u%+%CN=g?eYf%%WKJոV|0HZ.\o_MtoUKmC[A.ROMtYW6ߧ$r!! pu7_Z3d> fmٚ&otLY2 JK3*- P:͹3PiչD9&<ߪ,!n3"T )3q%IUlR]ڵ֞e.]E&QYrRE۴,{Ԧ5h4Z;{N1'0 2W;KS$kO2syv+9C2pcJFI2b,Ȑ22K`HGmm%I~CiEﭯ_e0Qud>+4`<,M};kBL|}5FtCWC (k炈⾴%im3WfT;*օnq\ [,h'Z_gdd|留HX̕m(BR^fLs@fsH_r? RFF:˗AM7ym։T/$Pqvi^.>gOG۵{_cÈuEC@A9ksTI-zovv҂88Q5ԣM[v %]H2$IA~U[f$%h4ϿԢAL|y-A٭CI|b-u^nIm驓Ԡf=?g*Ce2t1-SzNN.a{2١]uؽSCU{!:kcݦC6vÈǖ>Gr!!!._QNߢ}>EL;#$OIY2ԡ^ ~ Yj}nB^LVVݺ:voIdT`?c/j}jP/DsMo騦jlNǤ(?jinrq:6Eܡlkؠbh0(bӪ-GTxzkٺ.B$IoBBBxs;_yr7#& /o@P w@Ѯmhrڵ FkZh}C@A9s_>zaq>-Ue2]uUTagTz^^^hƼfrw77 iSݿJw5lPOս>ܪ Re0XᡠծUKgFKRuߌ;,<=GG999D "ֻ֡,)PˆmZAy~EBP&][YOk///5o֤ȶ*00:*naN,ufҼR"y}aswC@A9Dye!\m,|PFlժe,\]_:+]5BڐCPV!  00@6Q|r\r\8韫):.>{"pn}y6;+!%3 kTj>q(JoXIPrFIM[OkOMyxTŢ2?M L22*E}.I"CGasyHEqpLZ+o-օJUdЯ>$CJ \"ϔd:1]~ۜZnzf_Lt/T"2W*sAIy&>'1"+;חCon.բZ$CkQ-6go_Mq9whgɽ##Zp$rs#]*.[ U %wCgɟC0Bp!\1U!T8 fvy{ z k_tttӪu222T7߸_,/vq˳-!R)3Ν==wM9^[^[oG^ ֧~;S`ݗ_~jժiСWŰѶ1)KOA@Q2#21y$͟?tŢsid4TvK~תlwybRF~oFVRRrd||F:J[50`<<=n:QfYÆ +POaҵ[w:uJtAժ;wJ;ݺ}j+ԸIS  P.!!!zʌ?Ϟ9]h9_2EM6է~/_Y(,T/ΘYoɿ0@!!!R"Ξ9mpWӦM榁hڵN9mߦԭ#G]>owꠁ{Jݫh >DҧOm$iM7n6m,IԷO]i߳ɓ&S|֯]! TG(n;{wfũn&w8Җ8ըQCEAAA$_}LsՂ5g\=أ6we8/={Oǒ7|d[,vy-䫛{Tfrww/~apPA pfV؆ ~uY!u()1Aժ*+3ӡ B ;u2pyU:˥}$h,9/ 2`4l`Y2/j5enkVS~ݕF @Al^ǡձKWխW_iJKHo* ]8R½. Yt)dI.= "rd0HA] rK f X,2\l6 )fUD @Al^:!JKMUZZ*=0TrͶNP }{.7T81l6]Yb}p 6y@C!T4_'zZZ*N:u7xSmҨ dao߼ϝup=F*#/*$mݢSk(1)Q3gd&Wkbc Bٶu"uz쩵kjƍ I;wjĉ奈effZ^F͚5 kX׭[n5JUTѤI9,؛$j$ED C !!pc66եKg=أUzn^{]{unnxs5o{ڬũV`y:wͺIRZʥj$U^c\ZG꾪UV9 CC!\-8af͕jm۶JII)tѣoWjjFm ЪU+uQ͜1Coávֻ)ϝ Rtt5 (E'3꒒D%''iɇhܸq;u!! " 诹sرcT\\-Z[Gnc2'8|ݺiѢ6oV&I5j+!!vtS9,-]L ceee魷vI?Ƣړ_ip:t/^ǡ+(֑CC! ">^O<;T&Mti>EꮻV||~)NDr p_[6kj֬}|"B9^dRP2M:A&0gg+&:ZK}UFe2RwffNKY&7o !HNJTǞE<u?nؠG&Nm>7G#GZKr2C999٬gϨfZV bəU|u>%EFfyVv٣ݤF5vjjҬL&wm۲YjՒ'o6*!b씝P!YrrS/?w}8x]("8u~쮏;t)RݙF:@p#CkSyڸqN3gjʔ)?5d˒޽{$mܸQ^^^ڲe$T߾}7~xM>]Gգ>I&IlJc= &zꩧ /[Njǎ?Ə_d8qB6l(mQKÇm6z7o>m޼@9!hPKaĮ_+*R/^'OhϮ YK]TZzw`bQX߶GCrrpsv={ԇ~[׌37̙3էO}3f6mڤcjӦMzGO?鮻[W=n:5h@7x""" m׆ Gɓ';\?,/// 4HYYYEc=Uض%iҤIрowr Cp,eddM֡:x`c]V;:w롔k$mXCY,-RE2/]fQefmͻ>>s^>~NA~wp;l @An(tʔ)z衇rJqqqjРdO>Ҵg͙3G]vUrrvܩ حgztw]_~ڶmkw۸8}G:x8Pr׷KR@@@Z>b0*$)Ykq|JCb_gk޲$ [:u3H ~222on @AAFWZ~}K˖-+#㊊RTTuO5iDZn-___jܹ UժU/RԩSuwڦK5j,YRrJ/v,ׇ9<f֡jѪ:w)2e?baN{j(%9999@ ]Uĉ *++K+Vаaìz9s(,,LԫW/-^y;%o߾ZjL&o]g2g}} 2D]vp9RT%QT@s\G)Ɏņ,f쇵(5~@AwWzf?iӦqZx^{5>}(11Qz Tӧ:^ujԨƏ[O:u5k&L={q,E_EaHHͶ%} %.|ǃE-{" @AܜUPTTTe#Gȑ#'ݿm۶6etnyuQ6l>y=d 2wm(MEm[TՑuQ}Xr;6YC:l+11!!CC8ntj;w= 6{ Pr " sTP)Cո pհ\CT| d2̕@P FD r!j% `4v`E[ק"qP/ʧZ5ahT 2.;;,{ p! .Vo{UܫG0{q蠲E@.?󰚷htە#G|lk`(]_G5 ҵKr99@ix*jެWF@ ?sIFQ>>>jFxzѤ6mm[ԥk7ՔhpJfE1vzUQ2Ξ;zXO<>Io5K'#Ѩ;BP1CyJ>e ٬f͚uh`Q $ɨ: mF{v$e;ih$_?? U`@<1r͒Mkꭷޑ$͜'R||ΝAp",p W _u:{BBXn0\N) Ի ;|ek!I?m6mڬzGCDhOyf=ON9@8#w梬k$ :TI6ydտ>{[Ujʢ$rgbQNN>kd]ڠAsOHЧ~#GС? QF I9sJ7 pFݺvYu6}dCOPjjs-PFa- C<\@1n6}t֬^:zt߽X믣0 \:^ViT! "l(22ኢKu>u I|a7h't߽h@mf8MO=  ieD!ǭ$XGFFiy(v߰^tR74oݎ+KE|:uO/dPΨCO[7>뺿,:vl^Ç{nZh&Iqqm,p>rDYYYZt\:e˗+==]z3  AJtAD@`1vZ0"""gxp:wƍm:sڴznZpޚfxgvZ]߱v"Yp* ! "9H oyg<ڬXs}JINRff&=xuM:bJNN҆?y˖9$ [:urrYg rk eddjߞǛ :q9:D[.$CC99@y\YF4?WZZ}wuFb(>.N;-[! 9育yW5idĨK׮;g6אÇ]m3 ls6o$C|Ţ̌Ledfb6W O,KIN5`4]t*kuJʆ99@IT튎Vv6W~.+d2O͛TMmÁ+F@RPCW9PyCTDdfd()mg0PuBZDP>SM|tKԉǴi P͚5AWhL */r#*rPꂈ mݲY UfCT jҴLFoۦFDb!٬gϨfZV^*kwh,tt;\`Ou_UCTͭ;fggs7pX,[fddhڲeSL&u+9y8:Cb_/6otњ>uP߯[oC+V,Wp5kxl^{yyGWђAdTz!e]hqI :T>v[wz%1Z'W2O\lǡҹyY;~x[ (#D0ҡ**))I~N8)SGZ{iۿ_;wN̙3 v,Hw1hڦCgff*""PCG\!\p3tq=?~|xR1BuH}R}L2b#_]f:11Q:uB4QJ46̛7_=z3e:U;X{Ѷ_~i×_}͚vpEFFr!!!bpAPA]Vk׮-6~$m۶M˗/W>}4a„e˖;HƌCK-sh9.uÇ3jbQtt̙XO6]S_'Oha1cfuiwE' q9s :ɓ'kGlߵoxƎ_I:tR;G4'Xcb999!\ "k\p .Ԉ#f׬Y#Fh…Qa0O:#Gɓ:u<<<4sӺ~PzԸqcIRƍU^=RѺu?薛o ~_A  R`PMp:W_}ź~5j֬4h ^в""׷z쩵kjƍ I;wjSĉ奈effr_{~۩wjo;5ۻfx0@AArZtz#Gbڵ9rzK:z饗ݻk=z4hPⲖ|D~i/%m $yyy)>!bc}N-P 6믿&??TvԼy ;wвW~  uǘ;լy ݻצN꫈wU  |.ƛ0 \vl-7߬_}ͺnSh'|Zt_'ѩ!!!@d\\,9bVXpIRxxVX.butNɤ40b޼yKOKݞ/Rsu{V\lxƎ_mڪI&6ۅmӧM՗_~ O>ыӧgzS/ΘTIҴiSUz`/)LQ, {q_e_I:tR5dp8qRO>uM5h ƾ}Ou?۶Oz:999!\̍.$b6G*ZlfzK=Yt*rrrCDr!=QCO=$9#|jA(Eyp|}}uEUTZըQC+V,SFzvƎ_;o\S!9c292dY7¬d%'%9HNVzzo*Zfӆ^uE(&??YM&@9qApMAIORwթK7}z?O[׽}ӦM[nt֍O<7xcU̙޽;cҤI@ev[:V$I$Y!I$IҮI]QEիW#FTm;v,#F>fرU.RƎ̘1cꪫv?ϸYx1]w֎$I$I!CH$IkvŪ#.2:)B$퐚J8餓jR7Lzz:'t7xcվc=nݺ)KR'gy&W_}u+5tRcpd-7ׁ\I$!$uI$mw_0Q:th 5Pڴi@˖-k{K HOO{Y|9?0n+5aJ?MZbL8o?|SNwSj.xu4sg)m$IڛX!YuI+uO\tȐ!^SnKff&W`ڵdffVС=/7 \p=mڴ4[QF׿uȱRSSQQQ(**cV??O'R$Iu8VjjCH$ISꞺp֭w۵ ԩS)//gСUSO=E$!+++VlӦM+3b w9꘧z={V2lطyꩧj_'Unp|HMMl"T'c'UVFD"N$IԈuҥ-[2p@~߳uѰCH$h"~мSt>?_5^J ,_}I+-%+=))s$I=e̙ :t1cC ١kT&^/tMeBu:aB$IME/Xcm7FyeR쟱ٱ !i}/2J,޶ǶQK^Ur9f͚J$IC Œ3ر#3f̨0ĦڴiE]Č3|:uI$4Zn+BJcsY_Vpח0}hg|»U4~ם[ܯ8u@~ܪޙ1"5Jַ/sfʕTFNr"efrXء-ZpRWEIaȐ!L<:ɓ'=̜9"==hߡ̙_… ◿%FoW_}())/fѢE3n3D%3vv :uY$I5%3R6-9O|j],|ze񝣻P۷i-wם_< Î܏9/ϕ0r`ͮ_Ύ!5)))5KgϞt҅ ԔқѢeK'CZ|9m9$IImCb1.]ʣ>ʉ'Xg?^{-'p?8~)3g_K/OÒz+~:wzCaB!$IM*Q^Qٶ;FKNa)_[n7-e5ƙVk7T2\pB}Ж_ L9kWcH I$-ViNTb%+Vx{vD?'D$i7˸$ ѥK͛7gذa7j̙3^y\}5~FV>|8U_xn7oΘ1cxGxu1dB!I7h"@Yrt& 6$CmZq!ݡwl8kWzlXA Xff]x{o)))dmKΡѡCX$IY"1tPf̘Q'!Fu1$I$I IZ2#I1_\W˫޿0-_}ٺr[e/ׯ~Ύ!I$I.EEEm֭3gάz?bFQ/geeڶm[q;;$I$I{&!>/>C#-‰xU!I$It!$I$5$MCcF!EF4>_.Ɛ$I$I߸qXl}{d I$I&}iK)Xt!I$I#G2r=>$I$I I$I$I$I4@ğ '.I$I_='CI$IjҜI$I.$I$:$I$I yI$IvI$I&j"B$I]f B$I$q I$IvI$If@-cm2u}׋+x5S_+b͆ @$II$I|hNw婽 vkʡ]s$I$I{$I$I Lm+f*[Տ_1ʜKy$I$ioa B$I$֒:n#pI=yݥ|P\Fmӑ^/~ܝ*_ zt)h"st~m}Ƨ/Ѫy?N-xaW:Kսl:N}Zq1ӹ}K֬`_+}%o?{s6G5+[+$I$I :$I$I KmKf$ vzst瞧gxng~X,Ƶp~U=4OOe`/,} {}bf3}=29%3^ aGǜVJ9fWgL ~~](xyձ2[0nߖǼKqPv[/ I$I` B$I$)lۘ{k-[G_qɰ^,|_X1tI)Sf}JyE9`0nm+~c%s?ZW?gCy%*f`NS}[n7-e5}` U0 -bCy%s>Z')I$Ij DH$I$50umc _}/͎ߞlu%1Z~C1`cy%U]3e:6}+l~Ӧe/ZVzm912l[b>$I$2!^D++ _%))D"D"Ϙ$IƧ_׫o_[};1eg;|_+iaJvCE+h,*h*ms޼_7/77pهm>CX!I$)T)ZCIIIJ9`vNzz.I$Qٙe~m\sӮ9_ ѺE*vv{ҿW{^_CeҪ0 /5'ٹ_ՒG_eszu$IRe BRVV믙=mJD"uzr>-^|HZ]Zא$I=ԿGz~FyE'^3uO/`'=/qeۑ{1 } ܕVϹhASf}:m1^n*lY$I DHS̛;OG^rtC$k^SNlɗ$IhD7G6ϹEU|VʂJ;4\ocV]WeʹkJ׺EX:#7˫޿0-^s[e:$IԴ:T,FI v^ڿkWJWP^^K$IjdZcGqHvER86mזu$IReIu.D𔖖Fee$IF;2χuI$I[x@$I$ailZx)$I$V"$I$I.I$IҮ3!I$Ii 'A$I]d BRb~I$I$!$I$&)$I$I$I$II{\,ov"$Ij0:$Ѳ!IRCcBR1!$Un1uTnf̙ S2u*$I^:$I{!XT DHڣbcǎz$I{`=)$IuIꟁI{ԓO>ɼy^ϝ;I$iDxtnqj$IRaB:#)T**ʩ1Q'PXB{L5H \4I:$I{v;DHض|ꩧ?~~iΝڝ$6oe$Gc?qJ$5X!$I[X{TO^@F73oeIv ElަzD1eL$5P!$IjCH DHfOogysY$^h/8VH ,t$IRcB:=@VV2nܭ[=qx~$IGю+#d=ЉPXJ:$I uI{NS >$%/v7/$I{Gf@Xl (!=X> x$I uI*,E [IJ|-<'^!+U^W&*I8$5D!$y"$ՋX "$Ij`EcV@s 75qp9$!IRCdBҞg BR=$5\*"4IuI. IDATE,f!B$I$!$I$@:իu*Q".I$IRfB$IҖTRRde>z˖՞T]$I:$I%թHj}f՗_RYj[YW(_}%*9Lf͝xI$I $ITj$Ν9o_Ιͪ+FHv0:v@-xI$I $I@:BZtzI.] uRSRHKoF-tI$I($I@zJZz3D"8ْ$I$5q!$I$@:W^^Nђ%,xJJJ|TڵmGӵ{wӝtIAFdg΅$IjCH8d=9N:d BRVV믙=mJD"uzr>-^|HZ]Zא$1  7 ɐ;n Lq%TEe%%ѳW\#=={ڬWԩ-[v%I&aժj9Ǝݱ@DǎХK BB9$I{uIDwPh"v,9>FV|) DH[%%+ڭ{_j])}rZ:$0r$|P\ #[3T?i̚Я 990a#$IRaBa408x`($%fˁokcg BRFD"bXXZz$I{NgObƌa͏,ZIddCz:u}69$!IRÐ!q x5BXbS=Ld6D&0h\ \OvI$χk!7ڶ #!KƌG =CE 0 +vdpԆ$I$Ij| QBa4[уb<q'!1HD@Vr`F)a IJu $IơO>cLޏXƎ `Ԧ 7uh CWa[a=$%H$IƢ!|I0xũ@paϛh9@9 t;!LBWs%Iv$I 5*x tdgB3'<&? a. aM;= JlzŰhQt$I$I W&p!;B"Ba!R5S|B" ,aM;=#Xg II"$IYY桃HO><N|BBGl ~Soi@HuV駡uH\ CHeBݯCM%&2N )B(8X!@|e@ !]'JHs I$(+ Gd\}8<8͗Kl\èQ%/cGghZy^FL>o3f"Q= !I$IRBGCK^\Ej6_"5\FX B??C&e@'1jv(!ib~|g[}AAc@JJʒ'zc@0lXx_~G $ICHdgm/E)e4>~xgɣmV{ԦdءGz#sKn$Dq?RIC=Yf\wu~;np$IE>pп?\ '(* b8pppPXڅâE54@$/?n׬Dv]s7 G= ],rsr$I!$IjX K`'tn($~xXbDHOΝa24f`5 N>t,I.,S[(b"8/>=<'ܐ$I!IRpp!1!PJ& XOX&#-b9!xaI]J ˀV#t|(~Kل'W3 "Cx&@z͵7ӹϮ_5;%IEFF-̝ wa$5MNz)CĿGzz:W]VƎ<$IjF1cB=:,mѧO2x98(+ ɓãfBCDdžOzeeТEFddUWr˃뮃#, ਣB"LGYY2(sdg$I!$IF %,mѯq?+XBƹ^iϝB9AF1С`akEakW{߯%5 vTO(ht=K/qo9$5e[7rdx*QH,ĉ>pYЫ]<6h;/522ࡇם0!EBnn99!hQ\++g+ICHdme_ClC!!X2#!)%(~ߞPXgķu"th>u!,W ( Ǖݙ_'i!I&NM!Pe ΆABH!1FYYޥKX"qn c (.NvX̓6m² a[~y]??\oذp&ԼvFF!!IdBk"5)T($B =}QߞX~#qq_qğ:G /Yy2ZzϽfkgŷC>!2!~ X+ɴ4 $m"ѥB7D8<1<':,|ۦN HYZ }χ㊋a,(.>;7DGree~м9@eedNJ7L.X:#HFFB֦a I$$կD :2|\Mq (%" ,yq_1I$?< rܹٽ$B0\e7@sB+^Kg$όIj DHBD $I}@FFCNr o#!̐cƄC$,th:"h:w=zDzxǪUngʕ!Q^HkAoaشKEvvXdd$I!IҞя$ 1xB?GD-!p&pp|r,sؼQB2ӁÀ14Ep]*zlyIIU$Ց!o de}?<@۶_CghZ K`TT@84o͚_eWXF's۶@Dqqr9Ĺ$I!$IKWdS3%2 \E~:GD.նWķAF\ 5pbC1G@gBP4~nBb-g(~,Bˁ#5 !IR])+K `<:4tW4)<;g ჂR& a/N,q2p'!41hPXØ&ڵឺv ><26nbРp&%NT/22B8yKgH$$^$BO`$0*|BX8oB>ɥ2?_  ?,׻/"txt?p2!!L$Y.$C.!5>"$չTV^M$5^S \F,92,[!dPV]г'<0y$  -ZapW_xu"# fzjɎ!(tiXcѢpf@X"!0}:̟WQVV3!81jTpѶ-TV $IuIvD@`4S`!(#th8#*0I,>^!,ѓ<2 LcP^?@WH@!! *!4^%$ջA$'37ԨTRRde>z˖՞T]ԨReeaib:5{@Bǎps@!vmXڢ8to81L(,L22Bj0nBFF:x`'[TFر΃q`͚يúuaYI$$~gğ A?$,kх_:I  toɎ I.?;p'0_|_[BPb^27%;0,H,DQ#D1%~%5>"$թHj}fqtg_RSSheK7F4k܉$ujӧO@20$~z:|RIOķ%jvBw;?=e@.#|$5."$թH*;gsX߾̝3U+WRm#]f&=:Тe '^W'ʒK^&##6n !BGaBwG ǵkhXNcRh³ܹZWCz: pmЬzŷ'\I1 2GH"C t&rぷ !R²Sأ}A=gOA> ? xTRRRHkNϞ=ҥ b/xތ-[:钤N۶!QV~\n.~!$@pЩzx'pa KUpo ⤓B%KCB>}B׆RBp!qKb?H8Ř1ޞyFMF<79N"4ѿ?Db۶gH$Y$i۲RB`~ C \BР0Ǐ}d[ASLJ)!2'NB8#/ЌJgOr`U|[&!id BR*-݉$e'`aKR@a!|eO Ѯ_B=z CV[!(q~ JbwԨk`L1#&9$&"’"lGNp}CĤI!pо}e,]># 3>lV >w $IuIvlB(F7BAooA06X Iq!>Ə/_k8p0k ²óɄ.sH.m0~%%1cCG;ın=!,!0!I$fee!Ԑ B#/KU@8:~;t~xÒ˖A׮ЫW4Ѿ}JTT!PV ))ppp 9\r >\ ?B?a:1eJ{C͛ìYS!g><2t80'3rJVB'$I$iJ A_"$I$I1'װNe5za9l6!l\FOR$! #3Q!.z:? Ou4a>@rp;Noϙ 5EWFӀǨlF2! DH$IQ>0dH誰fM蜐Cdg. |IvZD`plYY%Ǟvt\v|pOBHUap/0p w>a鍌pkCϞ痗S&W\B#G=ze5&L/.!e|%hˎH$IԔ# Wa@b a,BG~m3H=$p?!8! ?.>^ar`4#XU20UD2R׀}c-&~e>s@':~5댎BB/#~B숤@$I@` .yy!0uj#dda"MC0`Ԛ嗡woX:|/ p7AiiKĂKDFFxp1aW^$m 7=>KFFrɋDa֬X(< ar8gODA#õ jΡ$I$IJ#tIאpF|DB 8%>d [ֲ}_LBb-Df> )J (&t{LL$h?\OYc/",쉐H"1d%5|"$I$;֭ KNhH,[Gw} IDATSsr =, C⨣mk_J&M =:^װ$E~~ڵ mv<<7"28(:aLܐDFu#EU U,ib]ԥĺ hjEGh$a3fBY|Ls{_\>?~)WL}@.pi0uOf) X7dTCC?ɯ?40 0 0 0>(:/C$04e<{.B ݳr$TB  @y)xT>Ï;[$hDE\7?_cЕ bkkv7c~S@*wr}x%n>10iaaa"ӧCWw~>`BĄ=Ubƌ@Sd(.՗P 99pmJ_`R#`} r]o_AA)!<^}Uo(mbj\ًtZbe,/i_ 1Xʾ8#^e %aaaa(J4DB`,:/CQAD].1]mJu$G9k(S` 0Yp{0 #Ewk?ЭwJ3 ݁HkntsNidI j=֩3a()aaaw0:]3e!pQY8 ])EƌqZ#_;P#@0~Op  H8 < ې asJ7& }1!0 0 0% d_Up*yѽR/8|ݫPR~$SR-T VTbCM )1bx8 A_4TV#77ACd$ǪU0s iI&aP ]@slNϙs >@i +V|ZZ J" 0 0 0.H2)5d';:$>>H0kӐltD(ZJI%4^lw].*H4J}X%98u(%" lE `% p"/ݽ  |"Fڭ"LpA Q`6&D7" 0 0 K& +=RbCU2Bs3̟zI$XZq#FH64HgB*$$PtZСpzgv8`sOӟ`.qlNwUb%1lZϼ<8TKl Jfhhг?A~^컯K{ig-᠃4{^r>\\)i^k9S6_Tf0 0 0 0HH"1We26*t@S\IQ$2 )`{̥ܵkD1 /Rq 䳌7uԸ~֜tm|Jtrq7rP;7QZVw@r(!(2O y" aK$VB0v_L0 0 0/tZ% i8x ~^^0c<#!b1%A44O~W_-!鴞#$T N;M)O?=/Wh0k3駚ω'}omF,r^HT΢gOx JxUU齆  6nԞ2yyP]r>"N~~aaa] II$"\㮙e22)t$F<~+,C P875(a_,$#i-X ErnN#α,$[}7y\trsH^x ؂䉅 nHXT6=I7{実Œ6^0 cĄ0 0 k%@)4Rر֬KHH~X=Hl5J|Bi~^BB,_6ee!|)CU_'&ڴڴ tZu?{"88>]RB}=L~(!PKH}O{7goW\ʀQY=0 0 0 PǢCL9xqSl*Jo%Gpk%&ߟB7ND7HfXwd^GFDqt\E]ƻH(p8 x΍W K3xݯV##&DZa&DaaW@: =P 0xB a䠭 b1I[gtEp]AD,}*]c1H~C^As,^ o+!"JI4I ~Nk%M<̓Ν!Q ̙z'-iGcJ}S9TCϞp ~CSx\s0@e4,z5z-CsɁHFeW[kvټy18Cg%9W"^ˆFuᢋ$|B͜-aaaw0 Sy JXLhEJw}؛lI!?#PO!/o=p3*Y!(Y1EC#!Gvz PF7'\?tcP$B3À$D4vm ,p}5=y(cQbϽ$Qm cƄ0 0 hh:wVi/HK2@CdAT3aPxMPR$NBP\2}ϧMB*i1s&lڤpQ n~ SS=&)W/X*xi=ӦIW ŚUc8p疟EE*ױ>pyp꩒5z2P(Cٯaaaa|H$44fotF+~!TR`*51ݽ78x7őD0r6ţ"TB8 %0oo .("P X'>"HBl r(1<7Ϋ@ۇpэ 琝$Da'&DaaƗ&J?D/u\|+SOtak:@:rd rPaaaafJ t?(B.NTzTr3+ 2GB+i/,&n(1SHVxڥ4q8JY 8 ܂|nTݘIŅ"$7H6~JvknۏcNn5-kKk9{aBaaa| +2ޗD`N ֩4E(6+aX^Bޒ  +.Qଳ$ OK8d8hNĚ5rDp8H(-UC]0i)G47]!7WBǰaJvJ<-S%yiN#GJF 0 0 0 @!J@ С~+\ulrTb+JR!ʑF@7OTb}8PFp1r1nnHͮRR$.@r8Di D@lx >YF`$D?Hދ{cQE 3 DŽ0 0 HtzO"!1YҁOH3((wQC(N$HDR)B,X_f1pݚC<>jk { '%C_ؾ>Tsl^i/b%M \B!ϔ8Q[ Ѩ֓HHk/hnV{^5JR 1cUW'1JG(6&Eaaa6 6Y Ќ$OQjD*E1 @B {w$x͍u^ *$4>Sܜf'2OPzFTIK]'Kʐ  t gw\Tcۛ\8.a N8ABA'Oc_a޼_"S۪*HP#jSWw]arͅ[+ JЪ7iI0k; |$KQ`*ʁ@ W=ܽ$A9@r+u}FucN.B2R7f2.wL!=&"uD$/c1^{߆aaam&DFb &RPBkHAbD/X잕#!@EXDvjEɍ; X5hT" zPŅ(!Jt0<9HaJ(X_މt$QE/`]'Hb }0!0 0 0b1<+X̙A:2@Iر9F%3B!}q%̙w,ٳ,'WYTJ3V)DpQ0w.\ MM%4ZܹىH<W6I0ڶUɋj%<뽺:=+*Ν$u\u!?_"EcگHDs.-Uee5 0 0 0o;qPR ƢtЄ$ @ PsPZt;C)Ax 8ʍ)DpRd硄֌`WHj""\m(m⿀:~`ۃ[o!JHxčH8̍맜 M~OtMh^0v/L0 0 0/|]@vRC=|!Ə!~}+(<b@DH$2L8qa$ǫ͛5~$-SN]UbI $GWlGedм78hxm 9?׼N<:uG:w}OMSJDIʲea_U9m No/pwp!HDøqJw(+ӼKJ4Β%Z/֭amܩ6 n>{>\bs0uĄ_Zח_EUU R 5a,[d.qZ{ARR)7$JRp%͟qB!gdPH2 JJ?FHpv"qaHÀא41 xY$LKQ ĀQH|D 01 En-k1 gܼp=!񣌠tH?$Md fg=&Daaƿ/Tb'D"z^W'sg|DY%&|3觪J#F}ENKص ;O1V>}~Em֯WdS%#Jvx};Wk FӧCp]z'DBxe4HCj%{ջd&Fdŋ%uXaaaaƷ0JbrC&H0ptAd G*q *%q{ T~&"i!0$07}F)R wPuoG]DQN0>"SJ1 0 0 0 IDAToQ$HP@|[M!~%Hծ}f_()JLG"OxhFP zMpV[xp90 8%BLXZ 6s]?M(yb,7nO #5%dxl"qǻg3.a aa/ P#$*)!@-|N$/B߷/B!/Y{i)<$<"0fPC…KЪJ]ÒyO~xuSrěo=HX:s4rTvُDBWe>ڶU_47K1%GT 񸤑`?$L aaaa|9zt_ rm|oQ@>H SBi e !$'\ <g67/sA0X$&Ɨm9$e?pJPjŝtOARE2nKPi$*Cr!A~$+ 0!0 0 0R)9SrKvزE/) ek@'@vァAQZW] K8xI55KcZg;wߙ3aR__ Iu-(LQ"ֽ&86lPzD]]tJ.w6_lh\Ye8>TBE]]^aaaat0?85p߈째y@`0*_iӗtF .A/@-y tNBI sQjD|kDe0phVW#^hrߋLQ[<!#N 8 Ee4Z&kDX7OD50v+L0 0 0#tPXdN>9(q}z7SzJx1aF:_:_"Yc~N:IH];mڨݻJR zTri%:bcp0@c Zh$X~,({1cD:%K̙ g kd6yDHDDzfBaaam kЁH (ASP/B,$I(%a08xxX:~^>@2ğܼAH0m; $L`[8+*tផ)HFrB?lћdG­S#&#$8ǽ$[cNg&D aa$WiDB*eqг[~*]"S$rM,`h%9콷JF46ꀿABD"v޽%f <#O2Ŋ`>F[zN$>H/x'74nE(b1md(=#>M8@BzQK$_ѽp[H(B宿"}6JΈ> (M"@ &)#%|cBaaaIuȾn]הVTY%K6IXuש; uAىՏ2`=7 T cF uuJPذA@U~.a|  c[Ae%~*-UP[ ViɤVi\h|46*—i Z{^ݯ3Pi^eePvGk? һ>ĕ@:1 0 0 0o#ۗxW{P2gJfxx (31w6"֠ w M3xF"aiٽWp_)Ir)erkF9I ӑp"{(ER+_bç=$uH34҄D&7hƚP;Z6/z\{gƿ" 0 0 H"x/Qr$;x"ѳx\}Vk.%0mrݦsB^0iR-V2@C0bv$bdRZ {Sm,x`H?>JqWoؠ2 %P$* UWi|i\#GJ\H$`,8zX\DI|%C뮯 iUU14'! 0 0 0o*h_$!0#260^xύ1õI&EyNFr@7 (q!`*}{+ Jg @'d$p9* ۣ'xq?"qx ݾ߸Jl@2DޭM7Ř a&Daaƿ@ c@n:?P546BNJO\ [0sp !;N4t EE*AѺB:PUN(PhWUInH%\w0'%0&OVK.<>[]witFSJel}$Q 9lڤ4]wiKP )u`ӦI 'Ν6yN?]%J|0m]?+aaaM%E(UX>\} QIFt?oB%&R^(&$D~H0) o_Jew gGrE+GrB cݚtFڡruQbřHЈ"IͱOr}uuNpkUj7)%3|ģsa_/&DaaƗHsJ mBJl((P9ug`hK$$+t=gKgP ٺ )Qa6LFmR18@AeeN/p8;U—%@tv6OJD4FmָhS3|?֞ROnnh>' ?WJIݻk?_=XԇOۗ* 0 0 0 NAIHR 2~"ʑ%j(qNT2#GCq4A )(!dLPI`?$ O:Jؒ 5(57私#{\_ Qivl$S$3S>1 䈟(Wkf) _@-ubBaaa|Iw~JK .4LJ*()a̙A _b?ɓ&qJd\"HfNT /SOU֬QDI :TSQ-=D"J((ʋaaa7I@vtHg3{e0T&_맠{0Aq@*'W2Qo=x25rd18 n~ajݘ#ۀs ucv(_,co^EnFE2n_zt@/$[D_^C%tf9`Baaa/uy/ЪELK$)tT@~ >o>*K&d mƍ)֭ 3զN2ĦMJQ ^\7knRpi^hnpړ}c.зAIWK>FGR㔲Ы̞ eeA ~*q%_xQ#35"=RJŐ!( ").V ۦMa8DAi+W@s?^bϑGHmRaaaa}ν&thFX Hd ؂3| qR $= BDe<Hhgƍq# ƺq'吝)QzT7I$#!= PEH#Sh&+Z(q~\.HH`ba|aaa_rݻ+ E_U3D"64Hhh3[&D"pE(^xB99ꫩ)HA(Cju@bAh I|Lr| 5&dRӦeUTbB{$HD+.VYRȔS|IX,;cUd8PGN5 0 0 0Đp4JJǑ@@[t`FBOJ![hp0x E{?N@m݌\2d̯)c>_c7E"$0t3P_u 실QF>%C Ji=DkEa|maaa"/ϰf r3?ҁ~2 UKHf()}Уq57K~XT2/1gN e'3D"n|̝}??_}Z:zP^}Ub/ HYǎs79ﱇO%;B ڴg^yyA/dRK/io'OV E"kj$Р20 0 0 0)d)P>  eStвG!A PɊG娔Dk:<>1'3D3!(au .q$1%cXaQ1)wݿx+cN[ݜcN@2vtTY]"`-)A:FGk5K_]Z0!0 0 0E0{jj`(8<^rt_Ut.D..A PrsU^QG)a੧`Ŋ<䯯" Jn @e+|Be%~:l(v(((|6nԚ_ X JjOVN|9e}P9o^PnN> ҽPz1y2TWK%X 0 0 0 F:d&J$ <$?gGw(ap?2%,@>1!9 񐿆 !$^GI j Gwn]zG#1#~^܎J]s힟djQ:D'VS4ב`skP)+a~L0 0 0ȑ:/+ӡ>}x^m ѻ{_6eQ_|nPY &>{Á* !RJAGO[i t<MP\,Y,H%^[B2ѠE:J< /,Y! HD%9ڴсJ^(, /T?|~THDʕнd3yr0G/ 44jG |"㏕>k('-w|D_ P3m^}U3~. gV1|8`Ʃ[oSNQcjo^{-(ҷ))`zxE*sWDz"IsJJش m OEEPB$Vt|?k%D]rHZ80xM0Ywi/[p'*qu,cd%pBY4fϞ?o^Э{ {J9RRE2%aaauF"C }FD3:!iH5*[q!*s1ɽ;](]-$ .Ce)|Q)H֔  u ~@={UyXDOQɐJr8=/B$- \R* !FQrGfPiOwcpk?)1 ń0 0 _R_X F dLqb$V=t߶-p%B$p v쐨J Ъ<[G[oA׮p!:_zR2ƍ*ysPRb x xycJ >"3-DbSi;Jf)eeA)Ν%^tA`< g6^HXD޵K{]*72p 1B!3FW?{UxA!~Nz쳕z5/OBd% IDATaaaaԠ8p%Zp)(\&T Q5? p$ GE.JgH{g vw]0*1]0; t;N 1o@eAv{^ iP/~侟lsy ZJ }>c[qkxֵ 5Y8:ƿ" 0 0 㟐NÌJ~I d}"i(DPH&ۂ RUUJM5JI J-SBN|9uƪ#>ͧJ4dRRHhժKTvb IRsDBܬ][ Wҥp0x|8,Xm~pr}zBsH+V A1f6 0 0 0v?|?HDX~{ULD8s`Ay8yxp\ ^C @{vJd2TNbc"F  ʑp Pڞ8Hu^Aƾn~9HX+Cn #QͿ]3Z gVOAyŮ3 a{1!0 0 0x"TJrA}CXNK 2E!H0X^ :x⦆F(1xQW'"R/}#$(?t$$U쵗j4x\8zǂgǎ*ѶMO~37̘H4viOO::J_xAiD"m߻w g$ÄD$Lᇫx\{Z\=o0 0 0 ؝{I$ ߀r  ((d4/^Tԃ`$Z lt.p,u`$gJx yьaTncJ8ոe'08 2$ P>2mD}8 ]K#1$߾?&|J=d'a0!0 0 0 \%x9bp22)iЃR.D~(꫕uJGuW0s}RAA*%a\8\2|ڷWsC8 k>}$.D o~ZO? }7k4OH%'JxQx@* Ӓ% #VYSچQQWID?0 0 0 ]# Tr%} Q9 O?( p80 {ϒ&`f WtQiQBMF_!ѡJx7Q !h^H]ٷ@ۯ⇗Jmyh$wQٮg˭)N0 ߋ aa?OW{Q%RVtPZ !sp Mm`X]?(?HD"CUdU"u+wumR/ WǎнZH 7L1oti 6m:5.Hx콪||2FsASת~m^P4F}=\wf\G(?^($a4_?tZ?aaaa#eHH䎓0k" 'T0 p~뫣kFx@ >B2vƸq'^#1 7n9LAT2@3G!AƋ-*R0Z~{q$PlqsµɘB[CH$َ$Y]%^4e.BEn/|Q"/ >?0" 0 0 s>@R1b̓Sڵ:UTȑAɇa%/,X 9 Pًt~:C}UdG2bx]I,ʂD]%h] 9BMlؠ1;u{euw $"FQ$HDDAG[(T5^ UK= 5R5[Ak(hE KpQ(2 dA2 wMDszL֬yg{fyKt`,r8p 4̔C$|U_/k AU[{1t0 $^uaĈ`^/:yEA0 0 0 0"Q(>TKPq=Z 8 H(Cn#G 3dGdG%rxǵ8}\4`%rps#7M r b Ɨ*Ґwz4zg 74N>JfOH:mLF^Q3rxX,XO0YLaaa DT͕@f}4,^K#s۶UlØ1xqðar(.5kLW^׹[x8>X֐%w tOcGyÆAz"=QI##Cay0nE 3R?@aaaafPQ> ~"`!pp" *(<\QA>,0x NG↿O! ȏ;Ѝsk7c@ H\?Ӑ(cp20 ӵO~($v("pݹ9|( wG(j ѭ7/r=? 5 ۅ " 0 0 Tut @eKT?\xEilؠϗĨQ*Ϛ{q^("/suA:y3qIХJ$8Ջ@ QAQ qQд)TWx Kx#KF,&CUUOy3  G.5k$*PZHq=:;9xN8njHe`|bA֬'laaa|Eea9*h Jru`{,G"<&r> 01t'`0Q(*bwU ڜ Ben\aC@>_Fb@HP tޅk9A<s`L7kQ H$ѭTwNU}H,Cc0 |x [ " 0 0 L"{Vb/AbuX^oۦobdH[ 87zDTmq9$g WKDpr((@tP@0sfpZ w߭h_5kЫ@@'?7/OpSt"kDeڷn͛d u\R># D1 4kZy,60 0 0 0w<j=% > @`(cn $rv#G A;p,rx,Q%)Lsc)@)+T2E ?] !nk[- a($6??sm5垽H;abJ$L)ru 똁f&0 0 0/ ,VX^$p(sꩊXRBeˠN>F%1eeCQ #Fȁ70nwgQ$0(*D9LKlHH0u*RkP]DgD"[Ib-R)#;n_ykgg9 bD5k;ƾ}ㅿEE:x%8E g Jt#GJPH 0 0 0 v+|m0wEk>kz40q1rLX\ n~Cݱa!89L,!GUdS[K U1@ sVs焯= m((D";Qt??ttIOn v!T$ 7*0Aa_a0 0 *+Dždm#ԱΝ% ~c> YY*%% >=({~Wb͛%.hJn ݻC^o<.DBqfЄ6Ak`rTR+VHq뭰hDg^X'(<VRa`P਩*+w Vrs%C>u"Mvz 0 0 0 f)0@p(bPEOFP!aEa \HQT$dڥ+ۑ+ũHx "Fk\V'H&Fb/ZFc"Cύo "ͭP5\dDpp,u:͢`%ύ9@׽nM}AG+ֽKa_=&0 0 0/!'Gq>q4xa ;v](6b2S)7~"7:u(`@@+T"`9)L ￯koG9xg 5Ѭ<8\Ag~Lje\?^c~)66lмx\kpiײet)t\$:v4 " 9~E**> Byy53'GbuȑZtysk-}ǘ1RL\?Z0 0 0 0S >F5] nCPѾ nFqaD$>"3~$FBQDGoGM\ˑh/">+Hqr[\ \6cȽb;=؍3$VAˑxCwgppKٍB:]PD2wߞ^wkQg5/?u0Aaaa %>(-|DFCDvHl"*WUIжO=W]%@$B*ʧR*L: BG*'ڵz{7**c Z"Di),Fm-êZx\T >9Z6m4b9\TT(VË=Xbx $GյFG˖.#ԏ;5J~ 0 0 0 ]…n (!9'LN[j$JHCB%wP d wrlpx X ``=.Dm0(A3|w>d$ J5fh>`ӭpc$h >B"nR_. : Q:(ssx )#"0Laaa_BI99*GAEFoNR*<8 G,8lz.ءR"oH}~ 3uV)ntᥗEh o)!Ć  *+5\X99\lDpo9GˆdR=qpprغUaq随Xf:oODVUUAHeeSJiOwaQ )lghLЎӫ0 0 0 3 H#Y1 j\ZH0sw"1Coxw=a|;7 "aAP@q*?\b!G< '"Q8`Q5x EV#@SCI!OtryynOwabAcB$Hmhd 0 0 0 u 8gkᬳJheeAA( $aJ6m$ػW r9R‚-[Զ{wXf̀}yi/A}o06! ݺIth <]8b<͛+>#?_1sYB7t,#3a_U睧s!Խ_Ax'gȑrhԴs;ΔaaaѨʑ B.UEHP]䞰 h1]Cl Eg$x"8\Pt g_5KW9M%R>5r_ r؇ 퀣ts?ޭî 犘k]7rH]s$(9\@cw>0AaaaTL3F睧^0b J0b z_V"дiۘ?_Bޒ@BUO$YY$6+D2IHLM<ٯ3nB4 }vM N׮dfJPQ!޽Ьtu3= .vup饚[$" QP0"Łmf͕PeWDiAVԨYOb;VݻUx}2DBPF'M<'BgʷOF<_}U󩭅wokm‰'5}$4i#uQh$k$ӿ?L,F2 YToAh 0 0 0 ~?@ ׵>&To>KX`0` p9<7h LP@.K](#׳1ύ195\"B:!Aƥ##r7$Iu<|׼umH$8"M!F " 0 0 A2)1'R:.(t}1GJ]e%\r l).TNcn[nQC"y˕TO&%Y;kx3~>pJ _JM4|vx>,˃>'KHD1z4#993l#>wSVD\wΙ?_+t|޼oUy2p{5 0 0 h$S\IBP*ħ5o)*#Plw$ FT A=+O`_>ē(7*$p!qv8E'r[Ed#ŏhF$v_JJE %Q$g>v8XC>1AaaaD >Ha^#^-U̔B" l劊x95*M\wOЬYP:T>v+aY>@~#?وΘ s0wڽhӟ$T`'QUWkv|O1!YYrΨFtZRÞ=ZV$L),Qqq H>/hڈh }ӛv 0 0 0  Q? tABH8P~H19ZL@|@F>tӐSůC܌\1nf 'wQߑlj#j .t[@o-$*) YK#u}b0 0 23UTCx\ҠП)qDF-[|ǎAk鳌 QVA``վz 7Թm(0~sv`sL#C >ßsO>CƑGj^}UC%wĸZ͵\m;v?8c9xx`UU՟V@ͮ%mFw7ȷˆaaalT_\ ŒB1yzTЯ}`T^/@_T~e$&8>~7r8 $z] !ҁk,i"4< NEj$ )Gi[" ܍<`hӡIg)cnW_-G?Y)tɤhJ.Gu+$F2}zѲ(|rxEGR]Z"G4ot~#۽6#6aaaJbGn "b+@#'Hpiԏ8}mLÐ` jPECB/0 c Eb|3-c{$X$H}u˵M1nvsz8.t_3WlA}7]Qn@(ۇ00 0 0 Gn*R)E,UUp*R:o94_>x\ϓ&B,Ohp9p)ԈF駊8p@ի%Sq@}4t9hDsp ߽o%7%Z r{>\ŚqA,&ƾ}rÈD4dRW|F]`?^ jݪgO2NhX!W{3~۶'|?$~)Gwg(Jjamaam# @䐇 z9r.Xb!NLmL "KQ9*u' {H1]Oϥ|%|P+D3g1/uc/Q⎧1FY@wwe|4m=sK;wCDaa_/]7FB$ 2zCL/Htd@ɱc! ߇ bB.09$Cn㳠'Jǽ>b(f(ƗCd6NCH} Ǵ[k[~:?%u9$GA\*֒_)̍k3;7TBV:m.0ÊGfPV07˂W􃪭ԇ3Ua*H텓&AޱA-}[4 WAdvARH^Rtv(X$nk\K2 0 0 !M eе7Ly+x5j[ aԇp`xmo !;$ CǧyD rH EA0 L ~Ӻp nf/ m5V+GMCLnCc~D}߄#`pHaB:ҢZ#`]6pj'@+ )& %apF&an v7>Z$ǚcbca42Laaa|3ݐ\ ;5ʦP$wAE@li{!VmPK|;uP-S"ǐ-xL:tKn>PxW{QFh9 ]PIsMF%1H~( &@j 603 %j Ap?rԵWYRH=KklVsWdaaC|ۘ==!Q^z&ڞjs^ZM+<^(!4OaavBX?Z0}Z0mp<:pW}Yh9wҠ6 5!5L| PSkVڎpGp&6f'Q+!Y>(SaCW9?D݋5Gh\5=+ۇ0oDaa_/B)Q( +Tg0(.(2zRIϠsgx"C yӨRC^nrƏ1ck!7e3WWsɇaNHL1ZR$EI D_y0[!o?s?Ix$^#(X&SLe@&0p=\ S"Z= 0ʠ4OЪV_'\pߧ"3"q2FE@X 5"0 0 0 ۇ6O(wO s_ ` P^SQy bx fzI. )/:@[V$l$4l}U0aָ[pk^#q|KmU`OzǬ@߭})Ndk P<* %A#̰}b0 0 pСPZyV }"BbLJ4B6:7$FkWh?\yеƍӃ~ïQ %"Ȁφ%x:͇ɰ)AVwo6|نsVI'Hi,5A˖gwk~UNyRTee+woߠ{w84x/ѽJ+lm#5H"u#O*+H&wݣVQQ 0 0 0oyH$> uZ`9*7$ā]TOwb@7?е ׈ L %!丹!dw Inp{47/@sК|&!#ʴ8G{'^ha4BLaaa__Bs΁fͪNso(.Va~Nش vP_K ѢVUpjwꩁSA^^ $pE0v^}WVsu5(1"1^VHa4RLaaa++ C, 'R)vCpr680>;lhL4HQitBF\z ༜ Eusm4  oZ'͈xFCN224޽%!CS$93Cn.< ÛoY#'G-ͺG99`:q #0GvM$Qn 0 0 0Fr8lעܱH8QR$*ҿ#5AP@%cm@"s_绀{bx];.ʵ|N>R#Ld{խw3D ;n\bDBq$xнxݏ?\laa;RrqHTLଳTE}VY K@V-qCi>ᆱux1f΄^GL̟>`>غ?u~]] F%8xx|fwǛ6"6-ٟ Q`M5R IӦMСpqpE'Ѩty37St75ׂcBeG 7}1BzԿv`hm6 0 0 6v&TQhT*/8a M\_"}'{Q%c%pj׷ C(`Oo-/B}щw5p;62>xҵΝ^ڢؓX ~ Xma4BLaaa UŒ*ƃ"V^E"pj_Zbɑᥗ~x "HZݫ>\I& ѧ|;XOݻ<*c38mDE8ڐJch]gz[,&ªUwUz(wTJe`ROo"#$@=;˓{ǪU=VwoU\ ^~^;'G6"աaaa#KQwl@T D"LFH>peǐh_oƔƻEJ|}?F‚ :$8h Cq Ly)wqkzqkropxm=;xC 9l@–Bw!~/CDaaFL1BↂزڶU4E]4o89LJEBgp≐HH#9rr`DF(V>#C|sA٠C#c H~n?1 l+f}kqX6oüy%qDzCOԟSV] b@Y2)7ΝaqF0O?/CU̝+1EfAGCrrUU6E:0 0 0 Q C }rZLPpoDB^(Vq$ A-.F~Q eiGE]Z$'n _>Dh \];+\;r[Ci$p K~ lu\'Huq;#~w|{]γ}z0AaaaPDF4*AW؃ȑrAPС '+3I+oCgK1z4th ?uKQKtlx7> 3FnEEjӤ\#/^_~|-/3v{ 33>u$>B@n!^7Tȑ<ڮ^~5HxyCFCJJƃk%%Ҩ؆+ 0 0 0FC b (GzSuurY͚pjsmDWx*z3ϔ3Dyy0BS!F",7>Dk8,[Æinj;N5>3 +**4DB^QU>h6"l0 0 0 Q^ aD 9?tDBA_BX}>GB*sh \ 8 "^BgPی93EO`ڝЍF荒кڽ.[($9IlCb<7nO5ne_ 5HGrUqgGkF#aa\!WCZ YYzpL,z駊̔CCv6>z] yyA`׮ B#'GJLnΩUС~JJWi䓰sc.zҮ:~;*؀h49Fڈ[8,}=Eƿc,\shm;ش {LVYi^йõUUjW] ]U7]SX"(j %^4w : #EclrQwl.Ӑ&Dl$>꾺O!  q$ {G}ȭbp230ZrsKs}($8ŭ@XLO?apj_V'،<8|Tsz&fAt|v]cB-nD/~()u|qDbCanx-X KЌ/e~!ĬYa4O]Z \4zO<8).3gj aCA}1czqZsPUUjgzeD"0.0 0 0 h ȕ`x9$! X"a`p;a^!*'P1? |q={? EQ| q$R/G⁥ 79!ƸS" Zg{9ȥHq4rkZ9ed9OAKyZ;?4a\a4BLaaaHe|!>Xan]1=z(G5l.͊xѠ!Ѳ%,X+!E8 h [e{w<;O†Ц qƶbI1r)zbRяtOUc"ߴI#Q*#GISZsjjqIdZEtTJ||FNN3Iaaa_5ȟB ލ;!@&bngGO{ JH\$E>. f(r$L>M (\(F \_r ߇""1ű8ޭh41#|n>^ȰXб wkS讽 c_6REqwa|u 0 0 0)%((Pݻ $*WVq9頤$+UQvЦM*I1ht~kk%#TCA\ҥФ$FW]+ȑдCw+:#Fރ;TW/G?W0T 7WH]ӱ&MtHD#H];80a:9\IaPQ!@nZ/\ D*Zu?qʉꫵSU)GuHD}VV"$QCzaaaa|U8Bd ͘ 6|L4&Td#Q](-q3A?p DC? D[q!xGGQT9,/Y7C"w^B)qHp|ǭ6 5jnDq >ۍy[t7Hw<t"|Ͻ]b0xRLp ݗBa_)&0 0 0 w HTUˆLZ!' A1}1}4~}_UUrT̔=G*JP\"}aaTc$}8Bb/8}Ph IDAT)(`C |?#Cn :~p%?%;["Pb%y !~[bM޽ж^zJ~]W9ŋ冑}:˖i]#:JZS&7k_Z*'FuuoD$\tDKHgx1FaaaWM{P:^N DF" 9O!ArpCEBT @Bv!"aPA?*& 78N?5~-c5W7ǣ:sG ;- Da&P|h&5n]c[έsO$HI{2F]_F1$h\6v̻Hb= c0 0 @q{/\DPU%1!y ae`6,PD2}{ VS]7(W@H0`lW^)gaJpt8J$hG*%SOXV1(&MEm}995 N: .ukE{uF5ryPt =cj=sr$n(($+KdRl&A}VϛnXHlD-[ʝ# "OXmaaa_=>%r ϼC{EڐD [\D g"C"_:p"kSO"b#0# ȊsU(eUއ9J)<H ! pkQןPly:pk?yǀƧȥ5r~ m"wc⠻g߇#)'p1 aaY.7ܹ\wT3x@bYȈFGG?x]@2@. C=1p '@F ddHiDܣkIH[8=}Wp(Q?$"!o grgeeaW. Ir# Z>'rmh2X,gk7ݤ[MձhQQRg׫W?BI2Em:JVfJ3 0 0 0*_XC?@~/wn EI@/8ߌ >h!aq%AơY!H)C$qLt\Рt$6xPHg%Yn\0ĐkD!x8CO=GqLJ `4r(B<q*1~ @X 2/"W&L ~ԆgW " 0 0 }Ty tz~psOI4-fpyTTȥ W M,ZkefJСb+OWUDԾRU:TE~$8}I98XiiưaohB%X"Auu7qĉh.hTw]9cHESt颹vO^Żgnhm5SƮ]pj_U9߯qE=F[uI"1D ^Wm@ˆ]("["^A“g0a|Ә 0 0 0!OJe G|FT>;[E?L͚Ic9@&:u#aaaa_%7#ǃ8> Q7oX{0iuHx9&x r> "y(AV$`k-hl v~eq QTȑb9rx}Ĉ!E aԺXͣ1t@HkE iHkS\;m8ï)HرL@" ݘD$x - ܸ.ow? 1Aaaa !C,&ׂR:T5knF33aS@̰n EE$rѐx\*J 42yAڷWHt3g!#CogfJD裰mD'~l!%%:?/Oqi^+a. R4BZ?HDF%ط/XSOUǪUZ/Wuuˁ`;dfʁHm1QɴiذA[%s &0 0 0 0Ҁ>׽UH@ CEZ1G8 \ #9Q{?ґ3H0Ž 7^qcn܆ q!vw] '4$sͭHp*G@<1ŵ[ N ?'$Dsgﺹ݊b.u(G:Ӏ]n56_ ~Et%b0 0 @E"*+~ >L~Pq$87OT > P=S!gOSxmx"=<߯|9)xGx\jsr<**4ar q\#}կнD 2rrt,=`%Ij\?^c{IEк yDp ȕ»H"ިh~C͵ͻœ4EQ#a| 0 0 0UUW_Uҥ linO[7hRQÇKdE GKp1}z zx\ ,;JRjHu>0r/Q=;L… /Tro%~mZˆ;ph9oE*._n &U!?_j& D6lCZo_x24MH&an 1tiSfm+E x ݻ%ڥ9'Xb ;zԽOg4+߄aaaQN}Gp!p; >gsh>oH\S Dޑa"DkW\HxS$PELđa zb#:"W"е&! (^Nd=w!'_u#/Ţwn/ !]H1ݯׅn\~oFkX2׭#no? Z0AaaaD$,H&ѣ?U_@F%{ݫ>o]^ _|W\egKVD];Ke)σSCIX5 .3Z?DrO$Yb?U$~304_Kb,G ,P$06}צ*O: !×RA$>7f"#>@Ee)![/mۣRdHsC(!"^x n^؈͡JhĖ`DŽo$D̞aa$//(MUL/%%v'* f&Mᇃ<:TBB^u?+K}O$/D2pPZ*"3SmС~Jxɺ|RÒ%pX?ĠtO(+{~&tJK%:w.XW^z]T~Dnݔ,3ڿx ᮻjQP*k$H4nq߬P&,[LK I=/֚?T^b}/WW&Dw0 0 CP"J! TwRPkǸ@(*3QJV]TTb=5ˍ? Iǵotgː\-J=Lp2JwxwO1=Ja|Tin;(! @5{62>pcf'~Kv׶6HXCE0"zv0 0 Hԩ J X\"a6L{^|82I+ !LOWEEa]URA rs4)S$3xy3{65J„#4Wݺ)Mرc *o^vP`B5t(\x$7PBCf#Cr²ey:JLz/[BA jWRB!t|SRt/)RV&eP%Lh/,PR3ݽ,w0 0 !ƏDOFw p0 !~>IIi\(ab JXDPE2<݀ $$Ĉ?Df r fH%n%($6Dp*ڣ 1@hA !T[K*JHBIG:殍bًDJnQ)* $^ a0O0 0 ٰ!(wQT[íJТL$!^R(*U t蠃T#%Ec|98T* 1t%GL1nIrwBjzO% ['${?@vW^׽$Y$$(1>XE8#VUsAH WWy/TdѬa|u,D4K/UΝp?}zz"aaa` :OBS*D+=? X'!JX\$"G)+;5t`[Y8 1_@>@]Kۉ$Hzٽ+|l@IՀ]H8hD2C}|ݞs>-$V$=+ QjD J|O q0!0 0 0DqqXLJ$xA][nQ) Ĉ/("%\)1U[H%0JK`%*23Ub~0 H?lUHot=8>T)۶IXn$^x˗Ð!zf`RkK@8x㤓׿V n-S<6mQ#xCE21[Ѳ%ԫ֕(/,pzqcOBOʒ2csʏU\HIK30 0 0 8R) =JS܊D5_ J>XLw{tY5-A#PR/I ;(ݡ;B-%[dD?{6J] r?o@Kh#(}v9 KΡ"G{&8]یDOEa!]p="|7^T$| 8aaapX'rAz$իЪԯkgK8,Ι矗B!{+ A][@EAƸj :{]:/-XB"-M I  tOH37oW\q5kUѹݫQCb^o5.]JBBe%m '+!Rڵ0u$xʴt%H̟_%\,gٻw21qbŶ&Caaa " @PxO䁱(u2d\ޯpv@>`9f D*<} $[;H4k\ HP}"$$Ņ IDAT"iHt?vTg(!=!rk 勨Gn_Owo_ k 5b֒! bBaaa8uؿdIpmvXFպ IJHNK.5vń[z}qd DM@j*,\]J;xyc& ViCm^0;TDbd5a*x%x ERz̘ċÕP_^^RjۨQiN4AJX|SCQֺrewpڳ%QtW_ _g5pDw=[QѡSrr 0 0 0 XS]ۂdD] (bJ~ *+$J (!HwI3ܽu{AH܆J]ɢ %'d(e"L v}JYx)b{?&}woE2AxͫÃHiJS,rF5bJ8<ؼ~N9E޴ N?]{CII\-#!A_>AfeAn^c18(QT$|K4Gv6  =#|F %h4h>۵<7 4FPX$TO|HKkzjMKHL0 0 0 05>`K8ĀZCx0%I@@n`;*n3*˰rm];p$%NZ#re`NG+~ċbLq}DPM1(`9 sϏA1H=%?! ڌu6D2H$?ucYnnP/FA/vM@O(ahA%  s]_\QCCwhP <7(-!ᡁۣݘ!)a0RZv^8>2ܘ쏇auL0 0 0~b#yJXԫ?=p8) v!)J!9S@(X &MRAAAAHDײa`-+OrMBgV-%*,\tݻ/ 3S z.VĦMzn2SGi-ZhnQ"ΝJx=%A,^y za"ٴ _BVDlr=}$ 8Td(.UJ,83GQRE$"d OKOaaam#R|;"!8lHpF/(!ߵT$#ċQ`~ԸVG%%smgT_ACx`Aٌ%.D@nno@qs=7 $Avk.$2|4rrxaP<)=ޏt톹$Lq0!0 0 ѓ *%UK¼yоR@^+ OSN 'KVHIPV}A*vUlzJK'N(+Xк5 \vIXD}w{qв>T^hN'j`@D(+5zuwnd矯G*Q#(-U_d{iSaT(, $'C>z4IJHK^-^,i/$Ht|aaaƷe |w4~ Jwwu_#“z*=?Qq/"1|*5]HX{1` ĉ{& UçWNp-Ee.zOR}p}Z1 I>︶u@ą$0{%2bA`Q^$aG" 0 05t%K GhJt^\ '=zYPRku0]zɒJ?'t ߰Ċ,At'"$ 8PZbX > ^]s%/48r"F8,ϕЬW2J%>W/hU'%E~ǂ,{NROk *Ѷ -[DȹjOԞkbv}m|VVI;a> ,/b2aaaq4ID-P$DB:a/7 4qG# %+pDP C+c'IāTs w/]{ Le7|2E ~}bE)* 5 T1@8 oD@{Ɨ)Ćt77V —H$W򁗁%$=v7Z4&CƱ0 0 GM,NMԆ2'*QqJ7O]*";[@pt_*~}h\AZ.[&I:))ѣk%IT*yeK%ORRT k^K,_.A 뮓<{&6l:-S9}L*_J8x >} /D"p*Wsڿ:u4 ކ Yú$%KW%ft搔ݻk N:I~*aaau{߾E2O݁  {>( ]_ D (;xDT* ("C"ÕF[HI3~"a  }+j5ܜ'o'kO! TExMލ9,q}D7KNGZ 5Knn1 aaƏ׾}{ge}F yy0>\r[ t_\KJjP5R}Tt<,L^^kJł2II"WaLdkZG͚ÝwBz0}:=ĻJ[7HظQcG">,]zux%Vj$"u8%,ZݺO:TbƀjJزE/Ѣ" +&DaaaGi_}"*1 5 Z*A9| F ep>%`|bD'P2$D$T,{$JlG9^Ae%DO(a?*%T}q#nwQDcc/g!JȈ!c{'Jx@$3QE4nrSXÄ8aaaP.PI e b`<9Y(,{u 'TɈŋOuc@|YGNP"M7$+ #'⼽p~@(+ Dp4$Rء=DqqŒeeܱhJ]$%IH=s W{к5 "9# 9SiuEEeSOAaUT9O} 5Ff(H{rJ< 0 0 0 h B%fi vPV@JL_i( J Ls}ey_@- HA$ѕ h$!ֱ߂d]@0Q9>U=#i!? a{}I!ס>'_ "?(L( # 67fkBy^D ~ 8BD ٺ峣:͛iԨWY~={/o??¨'%%娍0 0 W+ݡqc }B,&At){w I C!pXI ݺ1/94С0xDٳa\瞊CBj|)A6!\R'77!JK+z>) ֭|33Kݻ7+IbL%=B*WѶC%7 tu=7^yEGjΜQN-+ު$KuogUے%J$'+kWHk((x0<=}aaC'4E W@ħlG3:/%5E!lwmwި$$- Cr@p-*1 CbAAAS*Jwc ! ׸٭a{}]OD Jwvh89n% Ha sTBbZE$~ZR20lddTENߴPHrInJ(/+Y38l ~޵+\6MsQ"Fegx ^|&N_a{0 0 DX (U${ЁHP1zP ?>~F~ @ Y(5˗ EbH fH|v^2mܘ'qM*UC4J[tws+Js߭8 ,u{*,!H{w&cܾVָ==bQ0cUغuWɧiT^ zHqrGkaaaÇC^J?() d={gB EE|i4Ԋ F5wPɉ1c~a0=?eJPS-qE1&N ֐ =$\>W) PWɐڵWIWk hLii~g9ߡC5wطݦUH.Amw8:t>[#D0~aaw J%J(GrD'$1 wA (S$<$E$s G"׶?J9Xĉ$B Dn 9$[sFC*E(ia@C"Ir N9^͜9$&{y? +9sҦMC'$$0sV}w ⋓h<}/a˖-ߨ#0 0  KeK%0̙# --(Á#?U!| 3%۶I0i" #|SsiJYY6l;4 JYh>3+K3Oz^l;t1t#dei|a1p]Tԫ'a~?_0@"͒!TBvRěo*cBx) a/W/ͳ~}%J\)yeɒ}<୷Trd(x I&z>|"D$Ra-{0 0 @":DԯF{TvP> lB@w$'v?($FlAۑ@%J7JC Vї4G+w P sc$]< ?_mc^CB) 0nR0 h|-@(c*1"ǵ$b7f믭0uۇHj(Yf 96"p̦Žܸ0:G%!n ./O{+0y\1s,nv>(x[>~K.u1{=V0饗(xϑeaa| Ӝ9:,Tt)St(IZB:ӽrn=%(UpШb1\{-h5j(a:՚[ݺ϶cX rsէOXV՚WP//DzLJp*m*%EILXJ?XBICI L ӵj4D9s${L.42 ~]>Ee䋟4( Ry*HJY@k! 0 0~tnDcay"*E}}(1@߷36O!:ZM$=:~"I#@ K|"H8".AC*2dLk;/z1=_sґ< m#h;W : ^D!0ݨw~]>EwcP [Pq"z GR>*y,\;]veܹ6oN^=K~;8;CݻW#FPF .ߟ62 0 0a^p~)+ 4n,%KNh( VB?xnR)OTiS IIeep+'G 5k](E("С_@b+/׼V"/h7ذjյsυ{ jҺ~{m[c>I Cj#5Ӻ SٍT;y2\s t 4`"@:4T@Cn.<Ĕ}dplr0=aaxKO"J2 ؏APD!p.Jx6FCV] Lq *7@3q\_߻׻40 %-yEPyDOE _hE.( :JJdcxzֹAr\`}NN~RY܌ IDAT}i]HD悛si8 W(ed$h.z4w[*P9*BĖ[?l2./&}J*U15N;͛;vyx)./vl߾meaa|7)+ytoz,CuO\hs㕊իfgK6LbyRRtؿsR&RêUz.9YeeOQ^JY2D:0~+WŒ1>쁳RI @BJ](+Td#eeAAيP({CaJ]<(%;i;x=$kUk(-C8|II;rs5vj .V~'$1ڵӸ۶ʉv˖@1 㻇}aCaa(A}Py_QZ `}3:xo*HlN{v>1_C;"$&#Iwl׾:`JQӑP IHĈ/ q[ SH?I.n?rܼq}dY(I!nǻ$/7$uTGe4q]؈J9/W璃Jj!$aw 9nyKbBa 1ht? o_ԯ鯱o>rs0XOެ\uZ]tgnuV6lHyy95F|uaa=t^\,i,8(_Fa7h޽U"!AvNzKK8\<&N z$_jL)*>}0w.|Jl4hvKHH|Q\~:Ks--Ui]ޡcG]@~RB`_RSy vO>RN$n}ޙgԩFnI}/bJ[Z&VUCJbF,&c" &kppy*R柝 > g-(2]Ǿ! 0 0dCB#%>MGe {$bi"Yr3$Dԇm07G-vtBî#H*䀩(ݠ3s P< \Qx4TK^/mwJ$* CIrm/uƟ~Ƹv}Q/n>^AFč9}F/dƱIqq1rV.< ڍW_#!!z*Klz~oV^_h2Ͼh2?q뭷]ժU9s&{x'ط?SNOߨZaa#VBEUV2Aj*Jvx=o,wbH jͩ¯2 |>2o_IJnػWbA8?Q:'-˵ִ4ZarX-iӡRH|ٳaԨ@52رAҥ*m䅝;U~~|5{,SG=Ζd2j&'k_:u<).Vƍ?'GO^{ yDbIro0=aa:8LE%Ei_PD|u$] 7۷_TKc~Gp {_zE(++=xuF$?M??Gz.g zjժwHnLm޽;|z7eaa|(.A%%HD 4 f /VBAf:uӺ54i"y᭷ Ѷ-4j-Zo%1)+SbzN8tسG2rs+꧸XL6lЪwޫTԈ:u* dfB׮*/QVwٳ%k0a񆤉oVI$)* ĒHK?9X_q?PbäIJi0 8 n`Caa?T A;TLGPfÁ p6}_Ρڍ1 &6nR*'T$p 7S@]Tb%*QyD *GraHEP>f`kۗ/y9H~(?E(aVx # S 'PRT,bƱn'm[T1{k Zb;8p˔[>O0 GLժU)/?;^]CeM0% ؂3sm"4z|?~%n|8|T׏/< Jd{*%aa!*ĈI,PBq1\qyf b*ez}q;$ -[Ba!̝[K +e1>'J-]|ƍ+KB0p }6l X"ӦA7.H"AKz iSxe%NLyMK0={tz,\OK|6SҴ>u"aذsJOW:ŦM裚[e!"-MGJ1 0 0 0oK0 S@}J@ .DBB`9:Ĉ$lTc'\O?$+ 1 zGQ)  d \>¯3"D"$u\|HE!—X~D ,lG7gQY] s^Qy!)rurC02s"2*}a=L0 0 0 ?? aK=R!}P]ҥP#rs%$,_VQĉåQP>ӕJQ[1- =7Hm5nBt)Ý4He@.O$I!3΀+L%S\|1+Y$(4kČ2e'Vy:cթ#A/ /zPg˖/^dg<ȲewZ UL0 0 0 0c4t:pPQ4 =PJX w,"H9x]+Dp݋N蠿=*e(""EcxNA-]/C%1-PRSV`6>OoQ1k$*8>·xѭn)! q{t7>0ÿ%D̞fZaaƷ!9Y  +K^ 3f(`ޭx}xׇ[o7~ Ub< ԦmؠU.N ~::gZ\x9x0!5a8@jndfj'(yI];WAy('>~[&i#3t^xAh/kwj9s^Ri,81Q* iaw! ð! 0 C&(L/hAQɉ~{:-H᥇T1)nNvkP>?IBQÁ@#2mb@P7@H Nv*ݭ  ;1an(aj=ɯ}\~#Idk[ ia}Ka20 1=;[:T=brg [7旔(/t4H;oܱ$e˔-ZHFHOKj=$RLSRR4d}2; {BZk ! W Of r$a˺{j<,Xpϣy򴿙)St}<]2J&JHN~WV&A$~ cCaCa?f"@SA`-$$@ .vnw[]T@/xsGa, ǣ$Hx %0$E"%H~a>p[,$&^Fe?uH4h@+57AHJ@r A1G}ćqb6R%qY:a}VɌz؎Əm[&a?:B!Grs{$,YWU*A'&JVu5߁z53JEݦ>PdXF JsrСRE-Ey9\} B]whn'mċ3afhZe,K`t !6f ܩ}F!5UsUh- Twe=^@ϙ6AΝ&(()b0 0 1\ \RQ'Ցā(9 ls!!*A y4ZGQ ?k-H8$aYHZ-R|rQrw$F"x1T:'gb]E| !H*\dBL;;xdW|F^vF7露=GG*;/rmJqLuؿ7Zaa|GIK  ԁu^ @}6Y* kzRePHBj*l Hx;Ս7E(1:%K!yd,7}%/"1 < _x9е/^u#R d0._[A۵oaaI偢"̜tv$#_{I$ :_$(!ҥ/x 5U 0x0(v $]pJ=^R/ۑ Sj!Cz5$$Tc,,3}G{) qcx]XڶOV?#h?=iˡaC8p@,U$=Dh^y22k%;|KH>WzH޽JW/|}ypX6ng|v~am ?0 0^xO@0:t^HS]J:ȩ40l$6][䞿 d% ! kNHLHDAN@m7g/lG [ 8|}!Eڶ0 0$ )'&*m`<+l٢TH$IN-_MZ_Z*+?|V~v0i&^zIp5/O _~~g$p ]&G/3S k%D F# zo٢{yypqƞ9Ss̄/[v-4ik.Iys]F%j>W^)jU7N <֝ _ .TVRJr$+$gIj1 hgaq'(O D`#I R(N Yt?@> <\PZt IPas$ n2 qk `|Ϸt7pP'n-]ϻ}x $@$"a>vG%Hw1X]ڤϰ 0͍ᥕI-a,!?i??0 0b%)St_T4ݻ~ӦC gO8tض : N=U}V6_~ 'Iee:K3UeKx&H:TBBqG WWiw߅E~>^/̝ m(w5PHI 2 $ה [4h}CÆ[gUKEZ(YbV?^Rtm%b,Y"b@IZ>h"33H礓ז->}V.0aaIT"3$(r KP @CB@I J|*߯NEoQ C]ܵy #P^tJy8ͽusگ@]nQr"9ĿOts:ď5H(=b%[vCZSFn?#a<"0 G(~'$y=3 8v!VGlkN/ҵjfܸ+n{h_Da%6m`TK%5&Oa/3е+_?<^ "J"BIP "*jZłC8XkVZ\2@FDш6Q82wm  y<9^VATaݴ?sQG EjAA~h>:ڦysFԢVV9S?PĊ eX@ß=PVkNOckYamup0g0 htu몥Œ% jDBs:^"AHOɤ齴o~n=Z.@7RHh DJYmfff=~OB}fT<`<Z-Z^ޛ+^t8X g AWTm! ~26(QUHSЌuFkR@`hN IDATCck8p%a4mۍGh. ﵮsv8HS^N9fnq D*f[f"+?j,Q9=n؏MT{ϟYU୷8*AtHagy 4h}Cj(-5uGѶ](q}~=pNdf|yjZoѷs'T! CD-%χ!+2 ˗wz:|*H,XFN0r^ }1v=0Đ!.T`D /[2fL"TUVG,U(*?b mjkת kf@߇}߇033Fb ZD-/ڃ*E!éq]Bc܄ zk:jTaHM%o}q#j)UXyf}> 35ds] ㊂%hU(@U'JP5:DO".{T#dq50Hƅ=0?y8kQaf[Vi!gm5׌|ߖmC2AYKE>(к5L99}ѣ_q [rk̙q%:u$8@UfxeGVu?(־EE C~8v͚A>aWU84xAU8<zmXկyGF I]{?T6 EEiӴСڿ@LuU*-(Ucb= Sew =}!l{BFLh*4AaZAKT.ơ-Qh!Z?#džIυaӁKUu(@a%(PP#Qw<vJ  ǝ,lT8Nĕ5P)c( yCH:p|Ԏ#/wV8@%vf[_E~f.G~z>< 5K4Ge׶,\p{g?g;ӿϨo?6gy&yyyj}%W'yDs|!wȤ}L&MzOӞij'yZ=w5lGӿ/LтZOOW\-v U}{-̷n ݦ B^pęgB6pp)йO=m:@a!CJB /qu蠖Mܹj;ѹ3sنBT![7=o?)/wUˎS}i~wiޖ/x{Nsp衪pyjѸASi:TUM.u"E2DNB$Q[<[7>C>Ch=a"T UztG+Qk'Pňh}.lsPZ9GY(@m" ǫr/PkH6H Am;ø?* {_K؉±3z` C*\P>a2ØˁõDU:W@ƟuM=/I?9aޏ>FCuDUB:0|(fuHcaڴi{<ճ6:̟ϸ'q͵r 0rH:3n\wqFΦԭ[k+{}6?yS8/ȍ7Ȁ(yy3dEō0333í*ؐDrCj[dR Sŋ(Q(?~V/atr:^vB&(+z| ]de)Ъ @Y&7嗫:ŤIg7C*8lY\c{o]G2qQ%pE Cq*e];DBDĐ(cYYz-ƌѾ:wQ<ޟ9rՇ_|*~Yfff {K*W1?E TⱰO*5SV1' @=ZEy3QH 'CS(C(p1 `"dUUr8)D])_gTq! 9&DmFZm@cԢ#8 Ǹ!kx-qiض$Y1 xU*q.DR` q; 3I=Xƌ/L [+.ƍSN[nS۩_>'Їo߈.Gy$=/ Gqf{ӬY3p4mڔO˚5k̬VQa$-G Wa4-V?^QPVyy: V{.Sƍ|8DkR77W͍%dgQ0u&MXwֵ+:o0yNVV\YTE댪cq@4oEa!rK9 'ڴѹf͂[-5Fv6LP^^xQk [iu8kVUc"MUí2̶/ffffI"0- χmr FAkϠ0DZ/F Q0lKT"8@჏Pb@8Ia QW݁%q+P(pRxLra\pפ\CEĔk,%Zk! RƐ dkQ`bNEj&\w݆p=/o=z څCq فիWo6҃s=>YfsyYz5 6dҥ1vjazU۲o5^9)>o޼y 6}QNOmrrNH&6d*=@nUVH =]5h |N~8̛Dv6s ?m۪رzޤݺZzT;?V%HY<챇BEE<1y*hDU 2IhN?])**CqqߦwyǎjyrTh%5Xaf{C>C>Ym D=i( `U98PCa㥡﷕3߈033/7U5wL79$ȅ.]b~o>TaSNQe?TUq()С 8챇֩+hI4ޢ"*5S5!QghJ">D0S ˗rr(+ShHOWo_?xkV#=r^+H\pBÁ5C3gcxzg~H".{"j@߇}߇}33ڪx}SU@-:D w@& \ %j=U\ Cb@<(AU"Ƈ^k,rc8jq/p0$R=IC%pGxkCθ=@<37W!E`D_KBXV: 0Am7!86U бGYoq۵sT= qdfQ5d2Dq )jڶU#?iͅ57ee }&j[?{L9u3=}!|jT Z@T$` 5  @?5d2#88.QE+Ph?0xf e)8;\bF`O⣄/tETa@o vE FFi(19uTa# D4 ۴&OI gl_6z̶ Dsr˭~mےGqO޿wktԉo &Mp.<9M?7"̶j#X^ k ᡇ`B-ꗕ+̜:nqq\!: CddG(XK?yDn xG'zS?ÇZEUeepEއVtm7߬äIqŇMk@9veezJKu=оQ㨽It"'L?ת*@ŏ40m{C>CYm]mF@- ܏B uP @ Vׯ EQ#j"qh*xh Qp Ta.jLxM@2(Ԑ c[/:o1(:)¹Q{P(#ڂ7+@G)kU &<S0*x O˪&==ڋoߜo~s7ѪU+_ռrɜr^x>x_mxooDmh!~!23~uP[Lg*/G q P|=Bc( B2飊k֨mGq*@,_C 9kΟLwx:Ef0wC8GW}*P*Kt +V(~r(H,k324 󐗧t-k*Q̙8#GU3[uԞ>WGER+ٶ=!|!l{-F{`ƻ*}Ph=//3uׁsQ "11\?Qs%) ٖU*Dll<׿ҫW*ߑ\lKț<9իWmxlf[O"88зZWLm6eKHDFFZJȀ/VbPg裡~}N?]-<@a_R;l>\9ڵ>}$ Dcͅyb=zh7ڷf̀+f#- SItJK+WrH&ath v ڴQ ]vɤ-#C9*VCgef{C{!j40~ L <_EÀ36a4! >L9>N DeiCTYTAHrU95lWBi) 1eGZ6A;=\ DŽq?B(dpp-pZ]Gj% 88 x-c`7)jW.ʁ٨ƘM|QŊQ)f[M8I^{s>733Ro<&֓HhqukSUt!χ{TI zvKO Bcj8Hi:g+ KJ"=]l;[W_U0G7]WY?g Oҥ36˺ҵ0úud r ԫD" Ѽ4i?Ms0İ|ƲxqvU+c8X:ڶUТHTItIP)/#//C^afffQZoZS,Bm/Wnx,e-w@W¶]i^aCKPaL8o99UaHuBQ!zGy2lx > 9HZ1EcK`PZŬ^9 XDH  2_^;#"7 %kbX]l먑 a?3ʹz*ٖVV_~`DԞ*Q2x8L#}ssU 'oHU!t6ڮ,nQX* _|W_1o+p1z= #*8lCϞ' p;gz;(d <t3:~ԊKS|{Ls_XSTyg׿9O&?_s5x>ETy# E4m+;ZUuY33}(*|KU$B %@>q!uqzDT jqU8a@4(^!1D}:<UTkQ~MbjKqsCy-n>6DAaa΢[PՊ sw6& DK.ICh#V"wܱѱ++CD)Ol@y<ff[KUՌb]sO-+ ,VRDqP*_|={*PZm*8 }ܢ@QV&AEqӣBVQ 콷B*P)xIX.d$awU0|O(N:Iײh{aUE:t\4omAU3N=Uc&m瞋穬LͿV]!F"Wpk 3!̶]| BP@`ZH*EV/qh?UngGVc%(qrV{x+gU x8>Dcp ( B( 1U87{.O>SjQŋay `& 8)\oQcVHzK~Wߏ5YM۬@'ioO6*Ͷ\UQ9SPA2]8P&MQU㬳T%a]gR,fφ?z{6M!|U|X.XᇟLa^:uLj99q0!=k IDAT]/uJ:i =T! 1#C 1=:ƍ[y@xi_fGIWˍN~}mLj3rr^=m_\U(-tSOiIQ+5QX̶=afaf;,*oQ{1-!jCn8ƕhQ? "o+0=%;PՈbT-ZkR[q p:F@w` d{cWX$ܠSQ( (,E!dx}8jq~R- EU! Dמ]& WL2œuB-;U"jf"lRf[_"hhֶd" 2d3&&fʹ_ZAU<n5>׮*(0p*1)s*q衪cq[Hb#9JKR㣏g iv*/de£ohlz7zFn z…#\ Cn]x5\LQ!CTZi(~饸Cj[bx㤓9~*~.^\lfffahI XۣQՂDIؾ%dM`K\!@CkQ"(㩰ߛ-D[2ס~ |i( 2cQxF ӀeƱa0NP0cwr1 z!(\w9stw]իuԶ:GaBj"<{נּDAA՟ 4k3fh_~9{o8::lffax*\Gi( p/ L g2Ay)7mB`Zؾ'~  0'pOìp?q^@Pc v@aava 7/BAZOGPe?I;^d%pH"V/os,cJ^_t94eԚ̶33ǥ*Ͷhq|4-BNj?ۗhVbR-)$0fKJT Ta=a}t[nѹ|XRDB%ڴ9@E2W_ok?9]1c:8, 8PѣRW*DYH(PXŲeЮת$ 'o=z(:V2-,Zv(Ѷsjqy:ΐ!qFzSn SHYSOi&MaC}&C>ُ)ZP a?KBvPX 1ߍk/FUj Q(xUHCL`WTbj-1X޿Uwi7WB6Q`\TE!'XfPx#9{Hʾq 0c>kP[Q(^vua.RNU$.A-7a@Y-Rf5'‹/*й3fJB~NgTpO0ւ}QG$ -ZBN};WGjܶGxi8^xAΎkתUE2!r;DBv`$7WV{ j1c#^=?_c+=3GOOUhTsWN~@5I8x&LcC>ٶ&-D-4>EPh`pZ-F ϦvhmCs7sQa G(В8UWn($0*-7\Ô0FP`6Ux c ^2+) Q8EQФ8 X<Η@+FU&Ƅ}?f!ntG8ġ T͢:ls ̬rJvO>UZً }(p챪 Bf@B@ွP}"@],(A-.ҁPk3_Pkm&n4\:8V;m8 ۢalg7k ׵?V^AzF>6K AπP&_?F"  @(vf51##ON"UVкZC$9TۈU60!nZuH&n?Zt "P(h++2|ZG ϣ(D-' 4Bc~ ⰱuǩ(XqBxEP{R"[\C.)׶+ +ZFT!(쐋*8a*R}e(|Y8Sa.  cjϠ0G: bs0ُU(--xŊ<\s5w}zj?JshffV].UiV322#ر"zqݧNUhaJqFT6THQBUBD^yE WH-2R _}`jQRāeeѣU\xm0A"ZPņ_R/W0aL!u]Wn!ҠЮ$d<{L',}>yy}FeePPym33߇033}mI& DR:cP+<`jxRmnh %ZH*^WŻBCڣ<b=PPi8>E5nHi\XV 2*Hvu3*A"> ;T͵zz< b$h8I:/; D6 3$C((U!5 LڇU0孷4:U>Cf ..<Qhƽ(p>~}UH/Ҁ7P!;1rƛB=QeOPPBE(<+n,#/elcΗ2q(Hq YL~T68QR3>rUԀHE(`02J`1SwKA[nzMڵ+Ǐ^FF<ݺu}L:u{|<Õb.[N;LN=T/_^+'.";;{qJLj}$=ʂjbzVT&(4HTn0o^m7Ujx==/.VaCsOUR8PQ늜ַ ^?`UFn/6k*)ZCU:Ǐnnk}‰'j_Z)L>jcH|ܣs=\|=](hL*0~ν?z.-ո!C^K.eРAtЁAQ^^^ ;2߇033߇0U0+Z\?XZ@B 4*lx+jKKx(Dp; &NGQ*B!-& GAF@sBE?ZAH(^P~QLz-GJ`p(_r=Q #3 ԲdD8~ɷ|umW0l ׯgѢEdFQ\7x#W_}5:ub|x㍵nsj2mffVM.Ui{q*"ԊqU㏇I'+(Ѣ*:<,Z`@t˃K8 xᅸĦ*'n+עѣRSVϣĔ?w(-ϛHa)1sf_TAv>*g+tnDcItwäI̙㕯%6ꄙ^#Go߾yUJTHP@.h R+P dML }Uv( 0(O7]Gx R^zKhRΝ  @%fˀ)ewE-= 1 0o'&S;6*D0;s9h~P "rCF8馛66cƌ O:$ ViK.&MлwoF ӧsWӨQ#)w4yFEOʝwY+fff?KU8$p?s^Eď6(+OP.,\XU:UիUaqn|UWx&Lи(mo}6P(+S+TV0DH$hݺc|s3}iРzSl~>Ym MW$h~Jx c6:~1+%@C^/quM=|:'*61sp/ Fmb@| X-zq( QQd q"-\sMj|nfV3~P usq뭷r7R7PuwN:Mʫޘ@<~8}|׹*{jafۗr5k@ƍ+ ffff۳h>R Tv؜ V[$qG3i$֬Y /1533ۊ\jCYmE#F駟sL0k3kff^jCffffffff[CYmnݚ󟔔0n8ZjUvU=y>pJ3333333)afffU]OYRfffffffVS|j33'4TfffV[BY-RfffffffVS|j+"j!4333333fffV[mVˌK{̶.Uifff;߇0336>VDL}ϖ߇0333333Z}y̬F>m u=fffffffffffffffq ̶;Dvǁ3333333333333338a^y4mڬ>63333333߇}33333ӽtg q IDATJoL}N;,˗fϔY}A X|3^Nj5ly4fffYx|߇0}3߇}333QSbyRfffffffV{>fɥ*!|̶}na\ҬsJ333faafffc݇p RfffffffVS|s 3333333333333338afffffffffffffff۝j"vjs?Wx…?En<~|afffffff?fUXx7~R߫G_cnfffffff?߇0333333bXd~a[m{|DZU{^K}S$==OȲe*m}saWyɓ'ktvٵ-Gu4ww1T5?@Wvmɓ7tR{v߷̶,߇}333333YMܔdj)u^/~uc}Ҙ:err9x(Jǰa.n<ƴ,d1s6>jԍ|I̝SHqqqffffffff!|ج@ĦvnӦѹԯ_}z3uڴJpBZhQ徇v=/2={ǛoTca4i҄N85klxgNF>|Xffffffff!|쇨['\d ږZLVV6y7o}x~V~SOLlfϞ]n*__hM6`]vfffffff;5}´3w. 4}[3Z'0藧2w~qUV,[4-ZTُ!v\[BDzXdɆדcڵ<8ݧ:yIԫWVZR^^^n}z+m3r9yjw1l<79<`wFݺu563333333afffffff:>.Y\鍩>iEr2֬YҥKֽϓafV4hЀ˗1ۯ^ƚHkfffۜ%Ѓ!j/߇03339߇)dꫯ?ӣGOmaffffffTm cEtޝgOmaffffff|@ivjܸ1r ]XEff4`-v/WdG[ohѢoݶ^zi': w̬}}3֭~4+qi=s5lܸ=fVؖTiϫ{l/:cu_g횵z~+I>s3U4jH1333E}xl7j2/Wz~w33ynwYY||v-֭cݺu_UVmx^NڴiCff&M¹ 4333avj5krP!Z>Y֓gfffffffffffp jӨQڧ^OY@mW֯_O'8`fffffffffffs ̶ׯgN.;afffN:3333333ff]X~= (_fŔ|CfffY=affffffff"lPX8Ogg֝*XP'lTS`ffۃ]ڦAگYnuczj6jW_~I233333333333ہBmvmκU*u]^=5jU3-LOpuu j߾ƍ{@iii ;>s~\]tw- a4;D*==M3gԁ4cLz4j(IҞ= VZGbf ggg͜y3qzO{ZM/'#1 MCsg;99Z}W <=귿S6{cǎw2GS:u֊VSݻ:;>#}K.ٳӝwi1_^S֤I:vR?L/ЪzUb^Z5/k^֦9v^۲Y[׵}6 bZfIRHHe4EӦM)JL ]FO,ݽ˴m֒^~{.]?.WWW{オ>+S|iiiΝ߿$)99l{Q/NK.$m۶M&S9::z9pqq}ݧ={hΜUTT nݺǼJJJT\\ m۶UzzRRRԦ{lC@S`;Qz'|-[42@SVznEYck׮ӧO[&TPpIR\.:uJn~OGKTEB /#}wPTTT񢩾 EEE]ZdI[qњ1c"##⢞={jƍںu+JQQ"IӧueowQU}FF⢠ eff$ <2mΝp{Ǵ4YJOOuO~~~ڽ{<;V>+=N쬎;ZeKoQi6uw6d2iׯ_T^`GMnZ||I+5ɖ-[ԦM}ݺrJ(h„ оk׮U׮]+iuTs}Z}Mll6۴;v\]]ջwo>}~ts=ULLվP[EEEj۶MV x3wyGƍ6p@}G{yk:,--MÆ 6o,b՝ȑ#+446U)1͊W||\O?͛I0LV-ϟ+W*''GZp!Q аadŋn8w\+''GSNܹs:wΟ?駟և~/B=Y2e,X,-]Ts̱i"""|-ZHSN҉'jlm_5k(%%E˗/c#>>>9q._kUOIIl٢iӦIN͛7Ī+))BO8p@!!!j'I׮]ӫxm}'e)_js…ҥKd1R1W3xMjuPG[ڤdu޽Dcuޚί:/???l1Ή^|E͝;W?^|EVTt8u222͏iӍ_Yַ4?w&LkYVWKUt-/CJNNRSS5`%''#UHLLСC-QQQ=zƏoity{{Whv髯R6mݻ[0L|U\\,٬lyxxԪoOYEEEjժUAÇIK[dRff<==]Y;Uvںm_*7oǭq[S\pA]vUVV~IHHʕ+[5w\-=M&^*//j۠~W_}UBBB4g 6̦6o˶UVݽmԩTڷUKuuvY<<#˺r~ajժUW x}S:_ϱ"0tƍ/,֍F:yZHeggػG4bTh^({Rm< TIwiFIR}nnnJKKS֭\gCuޚί:/رΜ9vU8]1ʟә9sΜ9;SVV$((HsQ^^%#..Naaa>м5D9s}{7h2JLLo~US}OT}m6-ZH-W\R+ݟ/ٳϷla~Μ9cU/S6mtwg&.奂*_|˗/`kʔ)ZxqwC:L2l0[M;x𠢣z~U^v픒bۻ j/뮻RLLLڨ}l3fl٢|=su~/СCzbŊ ]UL/1k,ZJvui͞=[k qR1chӦM*..֊+E ȑ#:z׻<*t}Y0_Lh&f>:0 HOKoladgeV(+KQe__r6la6};vgϞƿj˗ 2RSSmZ>l{|Mwކj*zvmfX~U?Oo߾a6ݻwt̔նS١:jZOuWvX1WyNuGa:trR6jGèy,q0|t+u5фSu-;-}|$5tP0L\4%)))>|>'իWjظcڡd0Tb2nP!7 0 ܰnH:yZHeggػG4bThʮNkVMtͻ}w)Y6n$ `ʵ,H8M&ZnBCC[>{{{7P@@^x 2 ڝpF@HP#ooo՞={Z>[N<\_`2,j(龮_ܪm^Z"&);77Cdd"##[@Λ͕M  8eDZ666uJ:t(-w%&&P7ou@#3!!"q Te àvw0LVCVOֲ k0 A߾}ZM{e2g~ & IDATDsQydFiĉ$E}YM;t~_VۧѣG76Bn0,,L۷oWDDp% ^T|r:tj}z˷MCcT"˸dիկ_?IRZZ@[ͻeiFw}\Rzdڵkյk ,=N쬎;j֭6Փ{GZFF⢠ effZ4l0hֹ͍$C_+//Oth2 C/^$>ӠAlC|r=ز.nՊt IܹsM:Usεĉ|Ə yϟWRR*\Qv{L (++KK.՜9slg…ҥKdrJ(<<\ .* ???4w&Izw%IԈ#$IG%wս+GGGec֬Y-_Auq"Զm[I)٬Pݻj%Ku֊ŋͭ'))Iƍ&M ٻw"##ŋ[-gWNNN3fc)ۿ&MVZY%JԆd U`oƎkylÇ"I $D\FMq1Iz%DxzzZ^CjuJIҥ$ãBYmxyyٴ=zgO>6seK:t`U*,$Ve~~~.;^}:yJJJSs$鮻ӧuu{ 9Q6F ݼDjj @ix*˽u5IRnnSSS%IYYYj߾MLKK9Ryyy 8{_ך8q~_2ɓգG !۶m-ZEzj["5qDU9Oppvڥ"%$$XYWAAvء￿zf㕗e˖y!Ch͚56/7fmٲEzBBBbm޼Y ZnӦM*..֊+J xTޅi׮]e Z=.Ö8De &ܹs:{eKL: a2,CDDo߮*珎Ν;_]V*ܹ|}}ua-]zΝ;wu^{M&LPϞ=իW/[lԣG u/_pc=fS=>>>:v오#m۶Ot===u3;%pqqQNNNϯ08DuÇë܎Dp[ˁ&;ooo8p@ׯ_ /!Cm*BВQ֭#<"///}Zvmَf%rjjԜ۲3-Mp#3!!"qBm@8m mCb;f9Í[6?#| `wHv`wHv`wHv`wHv`wHv`wHv`wHv`wHv`wHv`wHv`wHvǩ. r|1SBСCi[,11v?|Pg$/ ML:/k *E`OdҾ}=ĺ>'-a6ؓs)((H[VNzj_hLIIr"6lؠiӦiƍ*h Ԕ)Scǎi۶miv h q%9sFk׮G}m"DGGkƌz쩍7j֭4N9iiiZ?1@S &L9i nu½vZuUZR||,>>^ZlwܡǏ%07ƍg5m裏*?##CrqqQPP233-eN쬎;Z%UT{(]Q[lQ6mtwʕ+6״j[%hQRR-[hڴiSj*))WsUxxrrr4uT͝;תJJJR\\""",#""|-ZHSN% ޽{U~Zrrrr ZʦL (++KK.՜9s*P'N?~,X`rխunE<wBխ[7KԫW/uMw2 ޽{/^,7772= @ zw.;d2Y\gWNNN3fc)KJJҸqI&)##j٪b5YdZnZG[_]$ha?~dڸqcMOO$Urorss5zh_Wd؋nݺ… V k׮JOMMld~g}VK6~WUgu2rHˣ69Z".>rOOO;wIru'euQNˎPRRRL׿Uey8>\| ?cQ~<,,L̙3Gs̩q?&hh歪Aܑaj.93'yVۣ1nu1 !j 9 v`wHvǩ. %&&r|1SBСCi[,11v?|Pg$/ M}ʤ#2Z5FhFL&S5 $=-FZG2Z95wωreuL&UVrٌ 5Jj۶|AEC5ǹs֭[SNZzuk4azq&Ȍ'qqq8qbIWV=te%''{Zv-= VXX`Bs| u@M2E:v옶mۦh$9;-4Z.aaaھ}"""*-4m4CӧOɓ'YصRV5Uttf̘HgϞڸqnJxQ7ZMHKKS``tKdڵkյkQ^XXX/ս{wxv'гkܪ@K;hܸqV>2~) 8PرUDffƎ+WWW[OkΝPpp\\\L:!Chs*<<\[osj˖-+))IRDD LY]\\ty<PVQQ|:)~~zh5xLeTnzMiwAm<=ճgo7xˬyʔ)_#Gjǎ3g?Ix EEE)..N5uT}駖e?c]xQ]̟?_+WT߾}uV-\P hшChЄ+&&FfY={UŋVj0 988X@[DQaIr}Ҵe/߯r3ё7 oЍ@$I!0~nH2Y- Sd72ݬB2˪鍊 ðNAAљ3gr%PooJl6[[9Ѡ ޺vڴi*ot(O>JIIQn$IYYYӧhq.d(`rKf&ŕܕTjJl x*::ڒ1rH{z@KC\ˣn `ڵKEEEJHHЈ#]g||&NJˇ  6(77Wz7u=! aR!͚5KVҮ]tu>}Zgּy,$%%)<<\C њ5k5j=b޽*BBBbm޼Y -qTTh;DDGG+""BfR@@o^zL~Df),,yz!EFFW:th =z護??j߾|I=y^{5M0Az'_r&NPK۶miъRbb飝;w4qN(<0=zʏW:tPbbb븪ک-dm'=-ƺ\"jUU= * @׿,Wxxe}|tΩˎ4>f!n?C@KT^g~ļZsא!چ^C^$DZ,www7N}b qh d6 :t줱ի7,{(ܾ}ԾCGkAC胓'd@]LZHX999zmVҘ1.h„(=Ӓ~դδ|H˗/]?3g5:[QP= O>~oS|-]Z鼇ذ0f֡|{W`0}x$qۋZl͞=[]uS6zn 8T^/>OիVrww$nZW32|{6lxUyy0QzL'CRHzܥ>>{VWu펏WzAw0KSu |͝QFKehup> pf!^"x%&&ݻ_… xQڵSŋ2dH\ܵ~:͝7O/}vJ233)St?tzl)Iң>#GSΊݴQ _}FS_w ֫_}|*LKOKyifo=rttMZGK0!CC '+Z-[6+2r^ۺUԭkWjNԅo7멧H,yJ˖.U޽7̳jU?-QxxۧGthtmW>P<+꼮eo?Oi!CC!-Ӏkǎj׮6lؠwݥ;wZͷ`|nZ>Yۿ_{F[y砂d6v?AZ8v`wzy:5>*J#-tYWZe:55U...40 n5"!Te à:ꛯV֭-]ζ/--MVv,۶mRNf'@448wp8ĭS]"ۧQFi޽9r˥}q`oȺ$)##C&MұcÇ_[6U 9r^у.o(22jUVgQܛojԨQAA_O>?Ò`?~\yY4:ඛ0y*x} * hC4 6hڴiڸqc߿xSիգG]|Y޽֮]Qh׿kl_z;Xj:g?{==deeEou_5/[ʖ.֭Uwвe˴iKY϶4>- qp;4".]3g諯RϞ=wߩSN6-lӺu&I>}z&P2 CF=& YK5sf͜)ͼśeJyݪ[֏_F?ML8&LXL;VݻVP IDATNy֗}={o$}7ٳiۏ4YJOOZڵkյkWjJ_{vO>iK2wBDIIl٢iӦIN͛72O<(eeeiҥ:RJQc2FCI>#FHϟ+W*''GZpM9w\+''GSNܹsϟ?$)"":233-w$]zYttS~ WnԫW/IR^ԭ[7߿2޽{5j(fO?ސ`IҞ={Էo_999i̘1ڳg)٬Pݻת|rssSXX*0 98d&IL&e͡-A44Va?~?===5zhIҕ+WRz4e>%I2͖lMHHOO$Uc^^^ϷKaaڶm;CZz!ŋ:{ee~Μ9dI7 jU \W֭-uZU\\lS}޺v$)77W޵>}(%%2>}N,Rvd@KTX͞=[V]\\4c JFGXwJ"pttTjjjW^ш#%%%X7o֠Al`ڵKEEEJHHVÆ ӆ |曺{nKǕOt(MQ%%%ڽ{>J?kРAZdV\'*44TzҶm,9R]tQ~~~:BBB$Lf((%&&O>ڹsM͚5KGpC=HQCS= 0j ;sB>*===u9I8P|oxw޽?ta:zhU6^CJLLl!est0 @#y*yC@^~8hH`"'(JQ́M>4ht!@SEBv C|G4UBvǩ. %&&rm1tPZKLLۻ0zoA*eJNRmT[: 6F-k/> 5iS섶?'9hdejii}<2p`?̉aaz]׺uw}ugݟPZk@#!hs$Dmi'x"Æ >쓃:(W_}u[PPGU2rٳgƌ+Vyh 8,8,/ʕ+hR! /BJJJrfժU{sM7eƌ-^}Ї>W_}5/B9̜9@#?/O=z߿իWk׮EEEy7<G555y}8'9q ǯ|U>޾j7;6|p;F_?׿?~{.b#njԖ7K.<~k"[qoODcaÆqu;3NMСC|>}lٲz4ѣiӦ?>LEE]λe|p-_k2%qM>]$<hCMm͑9"6GBH @iWTQQ!r{ڵ ҡCAn*ghv)!NfVQQ!@t3oTVsB(@KdA7ǘZNBm֭[ԟ̺*eh$D@ԟcI΅IjjRMv}GuuJM>^Z!ݦdAo:O =<RvBDAAA:Ν;|}TUU_~[ | ]tɀo}+[liұuں&:{<@K"?VMMMϟ:7fܸqywy۷o/_u̪UrW։#G->esљ;wnƎ6'tRLҮnѢE={cǎo2iҤ\{MrʔK.)))Ieee̜93ktw=:;<W#lWwwWDkubstemv_ŲwnI"&M]6&LȤIg|̟?ޫv7psܹsӯ_\tE?I8m6td}Mdɒ7.5jT-ZTɓӵkם}_gyߟ9c3w\ڽM6fӦm4u몲n]v}MQYYnݺ%IH^zxS^2dH.,]4w_.r=%3dFդ {Κ5k$UUUݻw[^^B?֭s쨣[o%8@d\h4!b7o^p”v9묳2|SO=5ӧO_TWWgʕ~3YlN۽{Gۻs-m݁K<e&|uIMM?S\s9 Z5%3ZeJf\ڧslYUVs;718;wBV^]{Ooaѣ//Y=.Gs\ƌG}ThVJf,!h˔h$D@;˯}nwv{wy3M_̂S=_tiI\K/|ڿ}ShVJf,!h˔h$D@;UPP-[4ފyJ:uꔓN,[vo>䤓)7o=~1Go~O}Yxۭ@R2e1@[dF%!ک>8/bc6mEjW^]d-**Tet޽޾;Y~}/ēJOp-y2%3Z. N}w.s엿/^{}~=RUקGW^ks*2+_E}IhVJf,!h˔h$D@;5srug…ٰaCc7kۜʢEysϲjTߣO/ҥwSǎٳGVЬhYCЖ)rIv_~|1r)#j|KpѢ|G^֨&G9;|\rWR{c|8%3ZeJf\vN";M<-HjjRSS$=~T{>I$O<$kȇ?[oIRjj}wx{^#NͦMkػCVW,JGfݺmZ]J8DUTT;_@sQ2$5ۖP.ؓ-\FAh/?{o5ƫWⰻvD{i:w6@s׶f@j9Yslckn%3Y:o%,X=z{9oի3jiիwF7|>jofܸ~ퟏ|ywx SYYSN9%tpnq'!B dر;m^T/^eͰaRŋKN2rPo=),,駟^KCqǝ?ӹs\z%4 %3Cy!h.Jf)Mu]ǧ(gyf:W^O?=9Coe_ڿ=`<3Igy& HZ*ÇOQQQ իW7W\t%%%%uj d̙ׯ_:wsW#l+޽gPW4ew2ylٲ7x#ݺ$)..np$9$۾>gݺug>~Gݥ+WL=R\5`J5믿FQ?+W$yGP2<0adF˵ [l 7ܐ'&I&L믿 ^7̷L0!cW&4K.Mu])--M\ve:uj֮]\qI&,k׮̈́ 2iҤ:},_<رcw;ڴR$4}oFe؁nsW^Yfm*z䭷zۼ>,]zgVx%S~/~.ٳg|sumF5oGCz왍ӧO^}:=M `:_~yN;ݻ_q4vay'sgʜ9sl=P#J_2'xb/^}k_u7ȑ#s ?Υ^iӾGضDr!k}Kݾh|)SΗ|Sʏ|C}tҷ3tJ5ÇgYI ϝ;榛~ÿP)Ss}*O~2g׶vwrϔC_no|9#7:$Gs qj6mX y0a=ᾊeV:2Un2VB?ٰaCt[= 6C /}W^ٸqc6;STT:*_3x>IN\x$E4F޽f͚t=UUUݻwĂ:I;[=?g9>g9vw>/\tE Y;.=z0@&H8S^^^؝wޙiӦ;k֬ITUUwv+W4rvBE]ӧg޼yY~}z\|ŹKj >r-:ujz38#^ziƌSfڴiӭ[̙3'ӧO͟??cǎ;;ԩ)::th~ӧO-[V﹚F=zt6mTGCh:H @#!hs$Dm͑9vN"{bK 'p5 qZ4%36GBH @ i> :wI']f}͘1cjժ6?p;7QSSS{?~:&EeĉyWbŊ7_mwn@ҩ_ѣ3w܌;66mO>Ygʁhdk"V\t%%%%=WPP3g_~;-nGNuuuVWWgϞ~`WZÇ(Æ ի=h74!bҤI)++ڵk3a„L4g}6˗/3v=sy絋+((se]Sfڵ)++W\@Ѥ K,ɸqRXXQFeѢEuO<9]v}O+>Z/^+] ^MMM۶,X?<:ui xntj*++ӭ[$IqqqIҫW=@6mڔ/}Kя~Ν;}SXXX߱cGvڍ&]!wYfM*{n~|n>l=L<9xQ'6m]=b͂@Ѥ ÇϼyR]] t,//Yg{~ҥ3fLfРAFF˗g͹3dAhҒӦMرcsEeС;w.SPPP]XXg=s+`555z`Mǧ" 7@ &'˖-iwh1^~v9p;3vm͑9"6GBH @iWTQQ!r{@RB ' rͬB܁V:E ͑9"6>|ߚk"/^,^=oŊuwwkʾI']f}͘1cjժ2p555@{d gĉs5׼ <~K,'N̫+Vo߾Y-Lx裏駟΀K/堃j}W\jOٿꪫrknU25h"?>EEE93su9z~)..az(߾Kw gy&I3dIUVe)**ʰaòzF]ʕ+SRR.]$u̙3ӯ_t9곺:={l+jWزeKn}I &OΕW^;&I.Ҍ?>L0!?xjjjRPPPo,]4\pA뮔&I.L:5~xn\q5kNsҤI)++˒%Kr-dҤIj?Y|y.]cfӦM;6l G /d7rQG_r}٧M6͛77޽{g͚5I{>s=7'O΁"(;[=ںJrK.u /u]$9rd-[͛7[o͠Ajv1z1"fJiiic˗/͛sgȐ!Çg޼y… XK.͘1c~cޝNR [lɭޚ?\pAnlٲ%SN͌3R\\*7tSmSN9%}#F$y;ӦMWgƌkuӦM7ߜnݺeΜ9>}{~sN~|LAAAmoVړn-VslYdCv;vѣGx$~ovv[m?CR]wըk}ɲevڮw-z0gwygݖ={dժ)+t:ڇBк(y@{3s|OW/<ÆϑG}4v 6֡Cf͜O|59OKڣNB:5TC СCfĐ!=%In*0퐄V ;֡Cٸqdv:JY~{ϖ-NHU*)tO~}-\-[mǎ~O~28ٲek :Cy-ECК{vѣgϼOzΝ;v?|TxּfUXXC ȡ4>555ٲeKoXUңgO4Ko֏F:re5ܹs Hh· g}պ6bd|,~_N61N/Z3?7!kz3y{\PM=ܐSYS:rT_ȵ\A?X>G J ס(_š1:`O2> 4kw~ khn jD'ZͯanPuuu~|~! -95S hsvBw!:3+}^ys>^WjdFЄ|^W^hJfm͑9"6GBH @#!hs$Dm͑9"6GBH @#!hs$Dm͑9:{E |x9^ image/svg+xml Range Draw Plot Ion 3Depict-0.0.19/docs/manual-latex/figures/Downsample.svg0000644000175000017500000027003312640746376022322 0ustar pcuserpcuser image/svg+xml Random sampling Downsample Filter Downsample Filter Downsample Filter 3Depict-0.0.19/docs/manual-latex/figures/quickStartConcLayout.png0000644000175000017500000052716412640746376024343 0ustar pcuserpcuserPNG  IHDRX pHYs  tIME. IDATxw|u?lz'!Q†*ra:gN( V~nFVDq*&G DE}֗+`"`dHNC֮¶ jܹEp։(@C}d11 pBa G=GBX/3""Uo1bs%2Aɂ x1[Pӣ/ wnǡp75!,, q o[7nj,6 HL^q44ԡ`/wLe؈'"""q76q񉈈68(k%O -Kؓ=O@ߤ(+ ٗڢO4;>9ɅH!&#B"LXa{<vsjqt?j HN뉘8>u"""oLqӐ- ؽwp)M=P\oII 45QQQw{)HH!cofknA8t}3hnhY:[έ$f =waϹ;iDᱦFSjF$D|ښ T*wR3!$Z5u<9?WJY W0q&Cd^nԬ데3sH EJxwm7Jqp9dwuD`@p/EΈܟ7㕷:"i=)&"""@e3uؿ |1GÊГ!{ n7l6p3pb !@L\dQ]y^q IH `۝2R{fn$#953 K} ͆Ȗf*+AMaMAzVݹ :Ic'yge#[ *Q',G ӷ\y(?Tz^4=? wq9J5^w%~?m2]w4_WqO>0ٽzBXWm74h VT"<,,UKQ\eX$E'!) r &$U=/E3{J4yi}`R.ŨR#ˈ:MkC}-xߚzX;N:7bLV"""2pH47Iqx !>)I()-Y'^C }{a=b1عy=? (l޾~}{qgfᳯ՗LCRBq-~ۂ~!64`p76#/oNi- b#=%Xv"!)TFcUzpN¼GFs]t zʵ.wѧW&w'=4}b\BJfӶ*} ֈ0DGGO(*!Z…naڒK /cbaɨt W.+5#'O/Ȫ0{>9. mw9p1p((ڏ#b/1ih$%&rNfa{Duj4TbCsѧW>21EpABQ2M^vfOP1`Cx\ f?X\¢=E"D&tGWFW&h Bq1MQDXX qh@7 j8nVf ֍&9kn[52W]|_=OHAiP[]tE{1.ƌTb!{땁򿗑8L}Efw#&E_ARbNTYHn{kU5؃T֒I(/o`ZW_,w]Zj dOj+mnBxt,uVu"` C%"""` {இ?6.?\Q>HL˴;g~'ҏ,ivLBc5EOL)(&OLHn0d/b,Sx7upoFӈZY27rCdo "`~@dD{nd9^oL04Ezrn?I)X3r&/}^|I)Qy܍=79kODR;@@kO\NHL_ ~U5 }{akNH_{3Wbƹ?u!":@O~AeU5zenê#W&oٍp0!QV +QAjUTe-olKel\Ӧ^f [1ii\_}{csHO?}!-z7̞H[6Jp1c <|M@$8)x57MuSMBADEǠb}~\ϼ0%MDDDAl6uuuק7rNhƻ(i~}vpE%\~;K>îƆZ{I̝u#f]g5;wpe@~ق;"<< [vCTԠkbp'1w rxL9c<=XBD?AvL~ m;PZU A`GF5.zD3f ,cVS} >c,n ·!+Ι7g1_ c r&O;f_ړMc? 2 ZTWpʩ5ҼlSc=j+kmdtuGdDDDD܄}XTUנI-. 勪hD'#,2VsS*JnI (?\f3Q}p/]l6\|-kGlt U 65 6oAUeQ G?"ij@}E b"-)ea뎈xxQwM,DDu:T$Ddtl/ٻxC +m57XqX [l7DhLXn0k}A#'ތto@(Yq!P_ݑ#ClO"1^ vDmɲ!,[TQ= Zf-,Z^/dos@DDDDDG܄ƺZD!LS݄zczvlW" @禾w4F^DDBS V"""c{`Df4ؤTͶHDDDA!PjA6CGF#R"+XT4Ԟ/ֶl8`yXyJ H_i*aЩw$_JNt)+m 0`*?uܔp*F !Y>fDDDDt|Kޓ@DDDD'akG2AD"؈ gWs򋈈~׋H  MkorKaoZUWF|L` )""""""""""^f5o675,""""""""""3Qߕ7O' t g~Aμzv#""""""""߬}mz)""""""""""jXډV"""""""""vb`%"""""""""jhϖ l,[%.`:?o:[nxY^8///ŗ,]Ġq,-E|\bcch\|{Ƹqc}7pݘ>.irr7L<}BK>Z޽0ztv{#""""""""j`/PXTUVVSO yKKQ[[77¢b464xQTT Aŗ=q+,O<ӿ<0**+u?|R|ʠy}^r;] """"""""  x11Y۶m8Kl_} `o[nÓO=~FN.8%K>¹FBBڟK.{'M]p/ ]j3v pŗ'Ν>/dq2X\Ak|Y1pq/]_DxV^|8ཿuŬ[n,˸kvރ^.󦟋| > i?nl)..:VAee UV:dzsqK/FRR"` rV:aÇM, l6^xI xFxN1n)Cee e|g=.^ray0~V^dGጉȣ P]]~ 됱7-#yiRQZZ?DDDDDDDDt ?ZgffEFFF:TTV[R @å^Wƶm YIIA?l Ʋe_ n}DDDDD֔vI/J+ )+|uyz3ܖؒ(-cc)C1KՙڬQ=hAE%`)U2^{۞^FԀˑp\g+̗FhY@Ka S###u\&""""Kzg]]Qv_p(Py?F%P! 7(|uLXqpm9WT}^RQbPPQ}\o}K4 *ZrUڐDɿٹF}(C{~蒐E՟q߃.2WkRU?kIrBv m 2JDtZ__w}o2&**+v %% IDAT@QQ1f ݛHLL8jl۶YYYpb۶mp z(hQl3+~g.`%(jn0nG]7 Y2 eǿv(Hj.zj!ѽ{w|Ǹ`Ÿ;x HǪkͷK=ؼe [Rͷwo> >>>.qqq ǡ(**ƍpغun݆̞hllB^^Ǯ{0k|_j媐>_111mPce[R """"җ=(AF ZGm?zPC-k.ϷRU}_ T |Ϭ&^\KuIKRPPc4V7jAWu\u]VvB=3ICF[kiUV ~ 31ksϩS'c|ٞ]˾g/ɛoEI=u uKB\l,z /!55wϹ ;J" 8x l6^x)_6^P4--Ç& G4?TV悈_~ HOO}(٣M,-E|\\Pi""KfL:(E߲}64`)TCH!Qg?*ټv͕w ?9SnOݖ5h^nk45xnmU Ru:sZjԆX_/DDtDaa!&۸o_!n%6Pˑ_ĉ0qn޿1{=83̄?CEe?H[\\)PcSB`>x)J`7~w3.8=JuE:[UluS 2 ܀ \:Z7[bo4FuXE(@\ Vju)]RުAJkٞd_V,Ъ^ZPc X(XO[ 0x G^Ak)mKhBDDYVTT?e^oEE1b8 =#yy;za׋b <x(**F EDD  Yz21~X;wΝp_ )))߿3J4ݨBIDFF %%""H^6m K_~I464`Iv ,{!.x˾ 'Mg#uM}# ": 86 ` {|L'e㪺dN3u Gkp$DIJ. ªfG<uη:(ږZlY@6{T]V[F+k`tgW$i;`%""k:DoGFFy6mBSS x߮555hhh@jj*իc;v@aa!uaÆ!""p8|0 4@~~>݋4 2$]*++i&_{D||z[NpR/P޶}%PϢnW7Ѐ_~cǎŘ1c|r`׮]x[o?Yߔn<쳸0h $&&5++ ˗/͛QUUf_r{3gDBB`ԩK7kA\\`ҤI?>n@TTƍ۷[kfaYE5\{O?cGXp!.rq^x(,,ą^S@tt4ް?ƢHNNQQQhhh}W_5:u*^z%tg}6Ґgy=zA 6mM&8N\uU>}:`6w Viii)vede,meeQ8g%P?\~?b=2JDtQD齉#(Щ-%{S C^=ȁwPiVT@ !Ut5ʦkY j]`7ްJ{~fe*r ]'pݶͲ|YzcrĠ>c+Yc묆ϟקOL2wujkk}_d~-<`񨭭[oS]yk="##azZ333믿7zܹ$Yn#K{Xŋg_D`QIDDD~Tzb2r $Fd&CQ);zF\:QOKvEɰ?AΫ2jzcP_YٜitJTڠuzXoY}*تCn|hhS1kU\U`իf͚eJo6ѣG 2)))={?'"..Æ  `ʔ)aܸqݻ7  .=òe'";;s1cp)`ӟdj,j{,[~[_o>?xŖ__Һ'e齿>*tʎTZ1=uN ,) jk*cE`KM]@_TI۶%dQO6C(WI7ಚȅˑk8D J!굣̥sQ_kw׾v`%""k:D_~ޢEhѢzO?555(,,DFFF@mQꫯ^wy!k2N0eee(((@SSuN[n =܃Çc ܞq"::t7ƍCMMM{JZ{~[_oPTXfk""KfAMQm@˿p, *"Μ Ǣt\D4gV1dWM@Pй IDAT6\@;ڒvXjg^d ?ZcȐ!ڦfC߾}tMZZ:#a6cmG <ҦDDDǗ`nTmS@%8!6-rIU]g1L`A8͎Ǯ ળqVI ig۲a\uRmRu\Z%kT/jT γvbp[z{p%X?xT 56Nщ K{q[Syr{pz)VViPEIm3N] (`U pK62P՛\Y ;ǨNzf .Q^\ownE@֨\1XȚpNщsKHQ T3)J%QB5(4T%U;LZ6g*W؍uaݪ7m]:/EH!8Z@oܫZ=-ٴVαH0k\5`%"""":!Aey?IuVo+%!WoJ b߈vy{jj۰JLl,8s\uDYw.jњQ;^,`+ej㯶g=3a x2Vx9,|ͷg^N u-CPԫg<_\u%NWh%m-R^> 5GT"`׎-A"29 07gOcvslq$""EI XjlbޜJo dhQ,VMf`Z]j*#7`%5hަYfcU6j==gAgC28ś :\BaV\\wVon\v|5eV""VY9{DdHNB KKW%%PRRnݺ!;;6[>\Mصk7 /(@Mu N8oVd!C[k:\"`ׯjOMu0Si[t_ѱPkǡ%.?mC$vQۦSoCvکzٴy0ug@[/E$K`%""k`t^%"S;6s444/9wW >>> 7!33EHꖄg=]sqHLH]Ïm{jkk!::ODS Kz ^k3S26}n׮zI|qF^W@%T -pJYL INN5(mY}fAhmYeAAW+[ ܊\5":Q% v Cdz 7Dzoi+ƻz9v_Ftt4X? ۍ˿;~~sJU\ o3s <)Gl] @ ;݇R"J[zu[]\8[w!tQ\U2s%Qb6rgee AHUF(ssDhkDDd DtB8VK452Z2UZ{yy;ݹ ::pک#q"""0t(ط"ߤvz/ЭXxIvD @]`iW ;ԦVfir$;UKɵY&rhm9Ѳ(kf5/D9{4ٷzٖR mіy6N)OODDd DtBVeSS}uR =x{Jbӑ>pNBB爈DFF\@Sc? DDI]ޣ6xȅlNUT?TP=NYl +ݍ2,M%v!dfF1Zjo1*C3Лwq(Y:i>/f2:DDW,5N1\Xz \ bcc(*.E]`$ A٦*Sd[rMUwFV67wWЇ&lü7pRC(CU۟2"Ft-W: }rXߨJY}nڑ"20JDDr-/^tϗa6wzuuuG4pe,_~ 7r;>_<[]""#f9/_ɀ:Xw +@aQ>3Nv7EQ ~1h,CzVX͚4zjz%>dΖt^-W|Wfe=SnrEDDִ) v(n|w󎏢gvIOH!xVlw **X';NdA+`SOk=$"HHH(i$[Lfggf6@W^&S6C.|{pдr$5W_K.Q^CgKOOq BQQQ󏚕kվC'c_(>\ ' 7W\>7Jѥs84oOxAK."@Qju)".. .{Մy(,IbYCs_+[sj(uMuδBMD SXk`Y-eU>ZY">SFY pG'8S&m|v:\ȣOg߶Wl۶ yyyի'/nó>;&ފ߂/,ۦow_}{&o|'oMpפs޹.\~Tw}?x|uv\??ddd࣏IwOUW^M0)Mp4MÝ  h%;Cp%_Qht@~N?nm0Ⱥt=p݌hKqVv99qUlZi@H1+k!/޼m$E=\d% pGo)**W_//Emm-Vd%ؒ{:fe{nq%Q__ʝF #  Z@~i^.S*$h"[L3,'+m aЋY陫@>HqڴӅktu5f 9@m5TT5k52!_b+" ҷ  `شy3^y5|g^p۶~bӦxy())1(,*Ě5 񸺧]RRNC<'{iii4 ˗ 'zgII1 i?uu׿gGAA2hh_@s,6BwZQĈ\0+&fܯND䉘){U\),ejB`<X/N莌9vqku-V11^0>@dy NֶD|-з3 v'^~U r|*&2po5#N> @$ŗ^=׏qbw> t<.jW־`ѸoN>g= 8]O03pu7/ HOO  h% ۬']d sy+cLęi{_.Sf{"XOb,sƺxE]1;͍%@]k[ V?_e`EQeJ*J89r V1 =!-;4Hk \wھ $H>;MqX6+o۸"UU$ fj#U1D6샨:u(O`t9Kx5mH~tk'JlQ.pOz-9o̼Ĝv})jfXOeȀ bOfuS!Aġ~9Xn$zdp  m[Ȍ_–.|1NNU{%CvWXY9ed y5r3WX'~)+6ey\,8!GD16bx/wd])|@*ADóWiAmA<  m֓U\5TfaиFC"JU "6}rġun1Jjl,_F坷^gv:]ےu`l%JƠ͖nc\jkuX9̾5gUr5ᓈ*uQ9A V  8lh^ +J )J 6ŘXUeF<~_51SfZ bF5KTues95ߺ̌W̌i(D㹬Zֽ*Xq{Aq(@+A>&|9o 8xۦg6<*r56B b݅,Wpuj#ڙED" aYߤ(|>CXemwxDh5DӮ};qSU!يnU29BJ = /e?… GגSQY̌ xN!6o HOKG^=0x%44ԇ7oХ 3q7+3N  v=裐]dJ We1&@Ӎh?faRR%Cs3Rw͚SE@[ UUT$̅P]nLHV쀓0E@H 'z[v־f9NAJ<⣏?AMM-tGBJx\sU [o;!ǣ(лWOsz]1/@2~v&233UTT^ Hj⮋~H[~vP@5h:VG`(Ɗy~n8BGq9V'ܖf<1+(S=imBTJcP3Cd.ڢ1R%:2Hl%8  SNȑ#1j(Wٳt!nuQr';"99 QYYBٻ@{Ey$''!//v:@зOot`Ob6nęg+VÌ~Я__1{n^]^zC$j#`2yyyvt6n܄1 wMM ~FII GAT8{ \@8*]ys@(*\:a[859't*o޼h55uZs< CV%S{tױb_/VƱ8uq7a[qb2 qҟbƵb\4=1g}^zC00Ƽ1rBCC#8lDԨޮzyeb=vo9+l7_+>Vy_buqoݺ |8wo jjjPQYݻw7 #AAvEyP\{m4U✲_j.ā_uU^R%#UKPRQЩ@ޮ>f;wvy@jri/ڹ`{㶾{~3F:ݝĒz- 6 9XAأ_/[n>D<;̙3Ǐ 7܀ 6`ҤIFN[,x :u˯4ouOJJ;ヌcƵr'^ EEJtҙyߵS&ߍj4<Âybrx<̘!mRo|NE3;'ކZ]Zخ޽{r'gLAdee! <<{D8Vgؽgrsrkm۶awAG:XYHu Q0. Xu;8+j\ &sUB])ޮjc|v:g⋇9Ǜ'k5QU vv-UN"bJN 8IJJŒµKpq1駐Ԫ|gشidY_^{- ~= 6{LJ8eiiװ8_UUӎGi[:wP( F-[t.rW^^}x*N;\̛&Nq20{dY...vlgĈ0bIx7ppꩧÁ?4MC>ÏGO7E~xr?#cga,[&RS##xQDAO0n5!qZJPU4hZ ?ڏT(h'&~ ԘCNc%E ` 엠Gu gv")HӵӾuZBDDW]`q~ )Ađ E=YYY<#G`4H?ݻw|ɓ'#%%ܦ-FSS|QL|#Ӱnzc y߾}?(fǴSXT5k~1ܤG;34 P8T4W7wb3 0|؉xǍJaٲ®[RRlζmbƍ""BӴVu,q .?5g [nMq^uXTVDV,BA̛["yFF:' LTң,Յ3#.G0ongPtuHkl-X4DX3jW],qunk^\% tJaγ⮻ߚ`83N>D̟&:&K8ihhZÏpww ^| t,^%Lc։vHBatZczB5Wa1o>qLN>j'JJJւבlٱ7BZZPQQ/(> W]yPTXȷjx^DbvVUa1c7c /!//7pQ Y+ xj۸8[m+@[o'm8ՆSέ_E.춀{.) HX @Ufp=?gy/b˖((GFF?~>{{  f0˗Čw S'dgw4={͸cv?~V.__oG @q.1⳵]]<뜜l'xAABvB~~'۷kCO(JλaG1ġHOO  DtkޛF<#bi'pI~U؄ll }9ey)gu|*U)~< dsd\SMt7ur&"^fqyo V "1(" A\^=ztO8Q\Mt3F\mv<g G.G_iØ3g.<P^[l$%uGC86ޭ|lذ0AG.zTv{'Z>XBR{ɯ㵋,0~tWj\}yVu.v|*3=H -8zߗ" `%^D@7<4KѹKgL}ȯ;wI Yo4UW]{ |3O?EJqġ(;EkQ)E*|Ƀm\%Hn JŌ[bC 1Q6ט=1KWPVlO6a,FZg=Sib9zSvkzb>fH`% V 6bٞѽ>7 UUUyyyƹAe; QTT/-2AtJ~5:Yh5 fxҭ)\DDR)ՍhgɭG t-]uTꇢ4_TJwl/XP(kUQŽ`Knb Q' H  8ԩSj|ҹ3:kJAiofq ( ,SGB5z.&Ҧu R;[k}ֹXUXH͌8OkɺWU[W;+[{*rEA$ AAqX6VU"+ gJnwz>Ud vV^ ЯZ|9ծPcKy mymWhA35eZyɠAd H    Ê6QUHRszW~-irW׏%@DE`nag _Ėoa]zNS׺ Zb`Gc# E`M\$q-<X D!   + ܈ gZ5&R&Cfw5n&XTą5mΧ0 0*Iʋ;ms O$vo8$ \*]ΊT8xoLLX ou/?*/J@AaVIb;Nٮ,w>QDқ1j>%S߹D|ޏ{5oa'gg<|,&6*J2WJA$~ Ah  bh;՜jo9~R~5;W}p[pi\Ug&"`Zݳ~E*SV'WJ%Zw3ee_$@@~v*AAD"Uw >7럴Ae9 Zx  a6",Uq,%hb)+30;Юp.Y7VY;Q]8qe=(bDjyEx}1fM`F$ %ҷ "!Z`^V84b1 8i;O69U,TQS$q/ !޽jj+QZ^nփ';͘fQJ;pWTJ0+"3oN=?/A{VQ%HAVBA"%$,} 8hR% ؋^;3gr_#*PW I&eݼU^V(5gԲ^e_ˑ#%5HUs0|Vk{٦~ ?uʄ5\¥ QRh(9oW:Y!"~{ծ1y]D3'oc*[[rA   Æ61}eyenD8eԕc+0@s&V!- PqB}s;XduϪmZ |xfFƫ9z`^kUlvqJAV  8lh[UUh˴ s֬Vs;_tu E"Zg:6!b uZα.3ʝYJP6Xvrݳܭ 9X X{@ ݻmۖW0D}}voG]]mB# [^߻hZA(  d ŦDp:d2>Y.J}q!Ge-o6E$VJU(?J4VU?CX K)*4%Uuk~7% `w`% Z6X/^ѣG;^h"5*t؎d/[}澼/uSG~/! j̳U?5ec-B+Oi Uϻ۽|O:˗/E(SOG.Ũٻ;fc߾|ظAǎ88s4vUWCAA<^Ĉ' "Zh{09lu_}H#qC≾͎qڭYfRlޫ t5gce}g`=nnCebew0 =mjYǏ~UUw1U;!劯'8z:~ Qs I |;</rsQUU o*N; <[ %]ECDa /<5W{&ߏ3N? 6 `PqGu}a %D*'",rs6-[|"'KsڪsRꨚ EV,evڵj`UpU%5FdiSr'f}vw@b(ײ{v9s5.nֽ.FM+AឃRJYGݢU}@RR2:`K{.dg ''qˮhllcÆ wn_g;tjQ\yHJJG)Cġ~HJNA<^~]UUzZd `-@[Y}iEUýbr3JcVǧuUq b]-}vkђ[}` 2F|=X t8X5 Ȉn_lވ@#ŦSgr>{ M)rذ~mBgdfmyy؈@ im}kx_6!-ًT/-Z;IwÖ9qF=CoNlݺ D=' g^`5svn׾ۢON筕YPY'Vk#ڮQ@Jj5qsnby9ֳdVbd~~H[wFpJE [K\}PU3x}]<3 a5+#m݂m[11jغe?{FmM :⨣Ź6RSODǎA@}>|O[jQ/r2п$Ce㘮D=uAx*®]Ցkښ:AhiObٚ8خ贞H#)؋܎ "+@4L{}-vn :.a "ֶ' " jV/LDhmBjlS>H@Hltr:]gn_l l\\w9 МjEw Q7TX H?__>l\ujjkh".3`0&g૥_غWp,p,BPWEMm <֯6~y  g5]@kALSvuF,n۳3Æ[anqWr'g{0嬎Y7F:] #bE  `mДRC kaAa|}%&yN= ∧mh/ldz^OnbOOQT;Keġ2nqYa8i0@(FYYknweի':tH2*WUU#==@Wo㶣q&@ǎYׯo\w9߉.8~xp[i̙B~~'hf{JyuTW$%uGC8v̑& >R I~E/*P[WXh\ڹYbxcdDsR%9qZkuïAAl)!v<g'^9trA q(ĹC 3كTd^'w?ߌ$lj@@j QG~Hxx=bxG1r<=C֭߀^_un 8_. g}1ͷߣ_>FNy1q+VԿFnn.~=w߉N܃]x)¡0:w錩꼕ʝ;qפHKMEFfvM@ZZ$8i;UUU(R$,fZE:^Xdf{8 ”QjmGUP aNK7VMj>nnO}Bf` AV].9={.ڧMrꘅpuF_WM/ JbDZ7VX JsB!$#{L7o߼tP䦣K~F[$/! {֠/21I1sq-,\w}/-@ P(iSiLJlhΦ͛Kbjkkcw ##}_L{2rYM]ݻasPUUAyu濍;vT@0DQQ!A❌_b0c:A"fڹ_ym*q[r>{c|$53vcc֐;vPU *"E9M2O!谶zAqlGJBUvw' h]ڥzÍ*@A6Qb.{S1FͭlNk-+NNpRA'G+/o95'9 $Ih[Ѩ>HPc Fk冸`汙UU禋ǯGgV =$n_/?<)g/e{A$'3PCa 0Rh kwb̓lãOigy)#NF8cLK)j#(..vlgĈ0bIx7ppꩧU  -xhu3H>h(dlOX⛝ʻ.& f]^U()f]/0^s)~.~QUܼ]߸G/,Ś"%kD29UwƜkv4OV uā#5v)럕q F ȋvO][ˎ~5W>߆dw _((,,a'GGCCCmMòe+ ]ضm~ņD" 8Q{ 8TynݖF{H1"~Κi8Ij`_JZ{q]5\y8 ,$F[JkE;eQnna!ɑ~x.FK+A#ꫯbݺu }8sڴE]+_~9Bĵѫs&?DnP7Nb.oh lk:۵\^;\sǼob1e8qHt.*Ϊ())[ ^G"Wkgǎ ( iiiBEE2AAm] @ q+.Y}#n:Z# r[H'Z5=)ޥog5l3MDbX  YwTIh%^vE;H`% .ŋcю-ZFJs碼#F@]]}Q}:th:t(JJJm<4 z`kU=౛FՅ?ιe8kH',LGk^Z+BEanNl?c%Ϳ|(3P__;ߩw{wK()))RRRv*z1 V^v(Ot_r;`bQ ~_cRC]@⹩$8E) _2rZzNv Y ٦ge;xǙٴ AD"QFaѢEǢEia>jn7{9,Y_~%>k6mڄ??S\ cϞ=/y>jjjtRlذp[n57n?Vk8t MPf.2({)Rrbcs>+ǣFᴡpׄƵ٧@ۏ_y͸6=={W[ǃ%%٣GJA{ngm7o17<*Kw/c<^^۬1bo炬AU{Ye2Ⱦ3q3DpvnUkAbv*rEAD5 رc1o<5 /5ի^/**0矣W^Xn#//yYgaСϐO>$Ə ѧObȑP矏qaܸqqh 6K # i]i_:a `k1q)!o % žʃڻ"P `S-J'ҏ6xXm7[xuZw:]o#f{<$싸l-ܺE>@r9mۺ%v- pO`5ǏO?*jcc#vލ:_Bjj*Fi6mv ;v,|I<#5+Wķ~,,X]w?!ǽދ;Z=m B4 ]g"+%o7lϯG8g!uFVZ2a!75bm8gP:u)))HJJE=DYRZ Rշ›$>}`Μ9$ ׯ|ݻwJ[UݻwGmm-ѹsg5kZ (.jm/ƮA#<dggcĉxԄ: cӦMkBUչ{=z4nTWWcӦM:uj׋ddd ';PTT.ҥ3 9@rr2AAďVSprDCQ)* RQk̉8L%]TE)J6{IZ{`6݊ފ<V<XǬe_؝"%Ű Kmۮ~8CAG:s7c3gn&L8CE=pW믿v+qơ{(..w܁ -_kGAAN;ڬW/bK,xk Ts{7W;穝:gWl&MT,eyk;[,Fܡ"{ ɰeE$8b9_k2cxNTQ)(secn)_."CUW GGDeesvՓO>I&a׮]ݻwヒ:55Ν;7~7еkW#[uٲeAAq$So!R`q#.%U21y0O<ܾSe{s&<'Њ:=u' byntJ(ULh1"G7X׉x6?wZJg'zp, w BVEXf 㡇}ⱴv{DbAA?^~5ivE4*~Hq"mF}%gxNDEIkVAܟ]?-~DKPb 8Yu"#bnsW"n8(W #$}ŢEl2t gȴGG~! PnRԽj֮"g4TqNş٧bDE_˃s,ZRyk`;&h7bumLx|#ݸ""2"]yJqkVn *AD{6cC=e]  C`v a v!d2DL6{\Xgwɯ9FVXܷNssBV\ vuK엠F-ϏƼVz،4~ZjK\ZpA   K  H\9y@_CBDtkŬڎ4犪\ESbRYceɉm-lWgcmdMc3Bdd1➍m}Uqsƍ5<+ 8\   K ZnPE㓚ݛ_$]j?+ԮK8Kɯ6G{O3TT((j\uLq#)Yv`m"WB+_GAu?ѣ!ˑ<;wѣo;w.ϟr|0fhZ:{l|+ЋAAqH{z6WuԴDⷑrovy .0o7G؉v}X^UR]$F\.ռxD`<[wOlق>77!޽زe ^Wcծ?9lقWXlYamB!dRd3Djx mMIuݟy 1a[@,\+jM!t_W J7Gړ,su毛o.J]Wy.p4oݫr8AuD~_oǧ> +V+^]vV\cϞ=qg.bu}݇;[nw܁M6!c<8co} GuT~ϯگ&N:$q}CGZ˙g%K?ig 'V׮꯰yf w\s ? B!eA/*y꺡ThH0.K@y&A2^sщ:4'Z9;/šU5Eg͹5izDK# `:$A|r!{[)8X6'B #F{݋icફW\-[GxG8?[?A\y83uV# 2s͒cYF03B#@T{o_k'? N>dUW] .7p |9;<<装wbʕ=gu򕯠nךg>?#vڅ_g_׻ޅ;>h5B!ĎP-^EE]8Da IDAT&u`U]0t=br@uVVU2_{+%/;cQ/+ х3ض ͅ[3<@!3Yɟ_&`]B9?moߎKbժU{"_u۶m{B(RA#,d._{)} '^^۷o=-|O?kV5B!dUú+C3t1?sHPDuYr;~^X9*h[aZW}T16pDZӥBbz`%2?P`N; FmN:$߿O=T?_ O#I8p7p7QT_֭~馛ƲQ09B!a5 a}Q++ܞ:AO scұVq)ƕΩ*T7g?ࠗgתbP-'ŽqRFvx{Wq$iLooW'>a:X !`o{pw/}KO/'?I8~+p 'x_^*X5 ^z)?|,[ O=:N.x~_Ǐc\wusg5sB!dXv.GBSZU,K$%V*DJ#NK/ť"t=$.ܫsrP߇ء!Z7uz> u5UGϏO];/. U\n0]kմP) XUI7~9R{uMmWtB/`% .`)B!bA8XwHG/iITku_*yaZu` V'U⣈;HbVkv|xq6]a!u{t*Օ>t=5T= Xu5g۳6B 7B!XU:#=;/ޗM4@Lb!{U΢~t_>&Rh9zUG)A}檪Ž>~gP~tB(B!x&zV(riFK ai2T euj@P]J\OAq,N_*u[0:AU7Vyy k rpelB B!,Z_03Q \L {Y;5Z@;k<uMݾTicUuX)tPuS#7E! VB^ut7B!VMdTYh*T%d [ (Fz!ør>,2ꎳ֪ U]ls#WsRuK>QK77[+C+!+!cdG?dc/ 'BH lSYdUW_MjY ЋPYf:.SN$i|Ț NPg9χB B!,ZVMldh&Į^꺔߯r`'rbl噪2jQ/ݘb-t Զj]u`]Guf~tsJ!dx(΁󘝝M7rRxx[ߊ;nbsڹs'9~&-%ruܫ"L}!Cu~ؾ};^cҗ??-qӁOO=v͇G!rX0-cAP6q$əue|3 [V)[«~UeDQ꒭Cf(e?Ѓ'=/SLm [*#By߈O|$I׾~;>я/|^|߇8xի^e˖׶oߎ+Wb4pضm֬Yqc}طon݊x^V3<-[SNGYk?SO)Rf?~k֬ٳO<SSS@B!,(&*)xs^MLU\^rܖ:3SFnnWgBf՞]խGwLPxJ.(1b랎YQ\[G.m6|X_|1=\s=_Ulݺ7x#6{64 ޽o|+v8餓1>믯 /׿kpcҥҗćO!ՏSaO'DzqhtxN<5K[Uʉa;7@5Ŭ[E?}!6?7nƣfƪKZ_ 2XȽދ}8p|A/ફW\}ckx;8N1ࡇ1/~x;߉kpWOO~I+6|A\w."\ve8S]b\x8o|?0z!~!B$@Pta-JxB:VU$I\Elo\ZtK׮ߚcՋɾHeH#uܩX ! 9'p|;q17c׮]ضmvڅq\{Pٟ(uଳW\tE=s|[gysVX!BȂ؉.L{Տ=$nV =S'iVW罺Wbr]d\*B1|6=S(ee!FVYU 1pC^}R`%2~9G>n oqWHU.]U_m۶cwq"~~3}8WN(^z5o^{_~9v܉>{.?B! UK8a#P q\T /?/jG)djVUGr')6A]ze!s$dqU8J,rE!d0"`|8cb -o9眃O鿔8>[N8/Ep k֬)2P8nVu]8sN}^z)?|vixߎNOFy8K+W7!7 B9v+ۜqغu+mqJgu|I<8p1@~}˖-Gq$_}xq'cŇ>!|Dca͚5xK^Rko~>K wܕByo}n !BĎWg:v&TuY?z+ shh6tB9!@Pj=2¥=mn+@tMx˞545%+!zZt)N;^l8㌡Y|:ŲU{^qs!2&` W<"+4Ja*av1rzy 6GU :u$~^" SԓP(Wǩ l*6Pק !??ϯ->:V"2 dBq?m3u1BuVծv3E}#>P*7W(d*$zaABIy[Y^Xf c,]@=Pp<btrjJ!dP`%dݻ n-Kطo7B!c`/LMOաeI,j_FGa aɅLM3/>uImBf՚tϢ0\X," tkQuth VB!+!@^پg.VB! u]6qSvk>lS`TTغ,0¦n0m<"JMmE,ź2hmAp|]:X !fr1W"uٲe,B!́GȮD\ = %<~A\L*Ny&:<ڬغNO)U~ P4K7F7)>Կ<<!=P¹[;qW/a6g8Şx9=k=tB?tr1W۶m]%n!Bp. TL;#unӥ)2&NRЪP[:?UG ܼUWy [/Etrh/GrIX"WBVB1v_qͳ>ˍ"BAx`f%W ( rQ3fmjWB'P?ҹưsꄿ*3x/|/F dzz0 UULy5{tB?X 9Ĵ{57B!]Uǒ8Yb["Չcu;TTS# :ˈg"" K/n?LNu2V^^wi]fB?X !BYԬȹ7Zי&;. &ϔnŝk0 b3R؃_Be&]roU^7~:X ! q BYLjT ^gYE<_8Wŏ=$4| +2R}#}I.KmyR{qyM.^=P>aLb"MV`e+B! VBD$!BH5r[1tD yHmY:ה{9[MZNN{B٫:ǩ5[Lk6==G+!C+!cdG?dc1B!8z"dtǽb'L54;IUVuQ\ Bi7n0 WYsEuP7@SO C^~CU1fB(B!hpd8uE^~^BmUnts9_VȇRBan+lnzi%cֳ<_"V0HXGc;VB!B!,ZvLldj:-fv{|_^U˶Ng<-]j[DKOuEBYP`%B!dѲcTSř-^ rT%aSiO~{];}A䄊śF{6^=VK~ZlUclpݽB~vHa2XEF]8ܫtBb+!B!1YhIHPg' 0\d]bi>׾OꞈlY>@9w>;C-8dC•B٫\lyrḈ͝zD6:uBe+!B! bUJUiTh#$ S8pV2ͫ^E/c1/^C@6agPRULk=K"j n`]>GGI)Bb+!B!:Xőm"T9^`A"LnX/Ȁ MB^!7I~tWأ Ls8!j^5&a"%KVMo-z8XA+_g*!3- B!d2YURN1&/JE$)E~q\WmaU2a=>?UB!PA:.HSf^[R;T!^00Iz(JSMt{uVG`={9^'JnG~7B!ĪÄkT'nڎȏy y(a Ztb':=}-< bJ̵k˸$F^ټ zB`K! Lbuw7B!da" b,@Y:tGRUu٣jjgs6Yj"D" dmm䅦A)ݾb~V[#ڪ0 yVVts+}`%B VB&w=.n!B:X,6'fj*%*؋v*J&N.]߫S]n*^@_KU}]\}aX TLϼh:X !,`%dʯйJ!.G{%Tj*FU':`^nDkץ1W+>uŦlWU]Ǩ*8V(J])vˏ)W! U?*!B!,z&` CI4&'L@|\, ugu}J2kzaXSG{"ϴeUks5]3Nzn(vixB:X !BY.BAg&6˘r7ks{TmꈇUDaCq)غ63Ba6G]].+mSCJ!dB!EQsUUq3 KkߡWpbm뫎G[zLc_V ֡snXCk}o{ܯ6:X !X !BYb3uP)+Uw_G`GWT\KwJ! @I U"Ml9Uei~{U}`%2P`%B!dQsLEhrFe!NG᪔EQrUmLT]Әx87DEZ)'{DJZu 9UDmNVPAP3a "<:V"2X !BYX03[E8)UZp.zg<U ݴȓM(<e{O_G>/#;vD bf)?ujDg0*؜%K+!E#?s!XX ˅=/Cq40}O|KG.Q@v_~C.r+.ZIw/P e1uCmoCZtK\w"Vb?|i?r!ВB q BY,ko+S4pC  I49EubfiMRN8:/sL_h9Z7uNz&ct:S=iuGuۺpU*zHy'ڸ`%2P`%B!dQ3y,6:!qK"*@WFT$ku kF 㾭g}KUs-'9uEL{m+en,rE!d4XB!E` ;fo*% bmz~9ǴQtܿMUWt=GTrӕk Oyq͟j[3S]GVB!B!,j&/QPuu¥^hS."?TlApɕsǖ {i8>QЎ+sDlu]ku3X !X !BYL>"@0:8PEcG鼘jQw\\t£aQKB#I8ݵfX ! VB!B D&cj M)Y\nDy,7.BpUMK! ǫ-KVןa_UDTcċỳnTY4ʿUi m"W]mVF s?<@UoX ! VB!B V-؎X g+%^VX SC7z1FZZ|q^4}K.n?UL0?/L<k)pD+D 24X !B9,Տ=s0g\*VNulŃdAVj͏E}5 3K$ ְ,=Q 6Jb>^~MMǴ'R .;T?0555_}`%2<X !B9,XV[(571EBNLNR)+%8;ӋCݳ "\ԧ3\uY ӥgc*Hٷʵ B͚D^hf<%Kj|B)B)n!B!s~ݦbWGSNq)e*"GV/ bͰX ЁjUlQJA yE!#/5MMMs9ryW;VB!CB!ÂC`=?@@E{U(̏+b @P+ u3 ]//:%-nn2߫'=Ϳj]+?KY|?FjUF>`%K VB! #!B9,X>#1U{W|N&#w:w:n/J_ӪuZ1w1{U' >z1WG5 w6r-z6H_Ө5`ژ![kau*:]v#BL Xt)G{ tB:X !BYej]7L Vc:WBa%Q>R3g Uk]c :l92ٷ^}k.NMM5 ;&:=:IP`%2<X !BY{`gձvU!\VQu " ڵxq?k Btg\[a.rk:ڏd[>Pj \z;SX ! 3X !BY:k;x3gܘrG, «LYB4OeQt0\KNݾ$n#TUN]sսuR&]EI5ޯ Q3]fH*+\B:X !BY: f;arMV'./9=mXqimUf0=UTe Ѯ8::;G+!ᡃB!ExsWCQ8)[ 8fRT!4w*ټ8*9h☺u%n߶84Fب.Ǫ8!ujN74@cɒ%~VNi 0sF B+!B! bF_ >dBs ]즬6UÎ?@)~ {iLa~Ʃ:Mjf==3F2 WE@^@:4σY,YRlKN85DW:X !X !BYOe/{ d.t=˴eL.5)x%{ǧ5w UYJuVBhafQ\r{S쀍$@!d`+!BBCNuƽDj{&T!<;֞Ⱥzʶs q?>=¯x"+GuBi C LɈzdש!I4bۍ"+5#5h#t]4kSWb-<ImFUX^^)B(B!,$0+6:J`oxyAu /@\=Ks faM]U+MG@Em~@8WU],˥СۣBa+qSXQUu6*E.M9F"w-kЋXrV)B(B!,$h+$Jjjl=۷˖-3^7 ~ o` D̀h/GH;t8yCWS8;L&AW?t+n9S (!٧BPťڍ|W {$!fFqБSQt*jEg"^_4ѭYلJL}7绶~g0u_ #!J!P0e"Uy۶m>}>~WFmtT ~F`U !Sʂ',wqꮁSZO+m5FmDQoz yoJ<8MyMڮցVjρ;(L%U}uT@K̸ހhVD"xsϵXXikR4! B! j~W.WE\]LTG9oo|&my~ٽZ5QN䂊Ծtbꞔߓsy_v˅"Q566p_@N|~ I璬fl@跾ȅn[&z(ptpr6j4Mؐڮqll#~nk:m8"aSmB! B!T^./pX54Q|s̶?ZIqrMvR6?_s<8wM?3j\JkbN!d12- BO(mQü牕U j6Eh+]D6Ye( HT$)CnQ3nK:^-y0u#6ZST7sAY.7( IDATc5ViӴ#mB[ ,#ܫ=wfbmZ9`zTBVB!C͏j]*b3 fBԔYq݈$ ڍn./I؄ %tGekme#=BFgn3jjۚ6XrԊ XZxHjj\,?)Bb+!Bȡߺ&qjca$Fa6`6uRQ-AYT]L[ۭsO*7KM`IBNpVVH~ZQk8]e!Xuvf[f&ZNU؇%St*bm` "W/^0p" B!oX]<'yf=۷o{[lgPIBH˪SH(Wݟ6n M h3Ot^j\4QId'Fqluv[x BvPVn\R_Ҹb^Plr#V¢BH"B9T%}_=KUN/pkB;,Td Q*F%7ʇ4ږYQ'yL,H&I(BQ,,DfX oIm2AWE!)QsUHUݫQ19WuB*UR vf}], ! 0wf/Tm7BA=QԱ~mAYevh:ŽY-*%]4Ž8Ff"sfo ]wz)eh 2F[, qVWM~͖Q{HYM4EhisLmnٴZhw ZQo[C+$/>ZAqfB!XB!dܞ^͟}C|#`ݷoXEl 6zt.ɍ~gF}ڄ ، y1,T$ 3*Qu;fU[[3wsP{SNY(&UX:qUZD-lhg/f7ͥuLaLdUfQ}m7"Ѯ)J!d~B!dGR]?e/ U| DѪ*J:pê\C),֕c3{Eoհ9 Z竓9%7"lt0hh_Wjϥi{sjw*וb Tu(oAq72LeRha=ݨɁ"]T tɟ m[}fY B B!dOoX:|=0B 0ٮꟳHFQ,F6{51zS}ܲ @<` ;/"J8 ׁA^!F({H }'ϱ- FW@$dTmLK4P)oU*sFif4v@:1MNZJ@BP`%B'm-K'_ArrX2B`tZŴL*ν;IZl_X ű6sBUSe*See.@JBSݜTH c$Iam#?@ PY$Mt. 8o1fD}]MTw]QFKZDI%S p# pi&B…+!Bȸy_UUvBRJ_HBi:dE@y92snfԄZU[U熤{2p*uuLB*W{GW=_Ax9X)ܣIlnHI,lN ܅QbN)oƑUn^y]Ҹ~07]ͳ Ok v`ڍ߿ƈX !X !B, ݪ*ɐ 1@",nE!86]czN<GM:JQ,<5"@i\B.b UJ!dtB!_#Y'#"Q}+ +"@o=]cBUG>IRW݈ꕾQ!+Cݨ4neI{ZQX6^z^T꾡^sԉA/Z*IBJ!2oT'ͽ"+`wnESeuBTŪU˖B+섕sME|8?|{mRmS6 ni޺}頃6ڸ7 |'-HޒVZ{1pU ȂB-`}&4E˪>/VB!VB!C'G1NWq_d(`ݷo-[6}ͨ\bKv,\䂊]A(yLS'ۑx|u YqNv P=;3hbj>,j6 4:dXD z֮^{$DO1}y©pFsݸdR`%2: B9TlD9*@L  j҄HnD#(j$dZY8oC>ί#hEf,^YP(JO}sf;3ؘt }tF,4e,ڬ>Fٕ[7@td jWUNUA BFVB!CHO.5X"WUV #UWeNf!PJ\RUW8K;߯±zGr|]6pRv"Vn[# qXZ$&o~(k}4ѭ i+acABB+!BȡtiKUwVK+\@Iulڗ`Su[fLٺ^jQKZvtYxr1*\TIEm-;}54j9U5"dv,hWثlMb,rE!dt`%B9|"uVr@_2YV(j4MY >Ӕ՚F7@#sujSSb檣݋uhgD?ͨ^Q$L( C݈p f ~Rvm7"_~=J!dt(B!L :l@BXEd,UZJ.$TmnK5@?f4:em.T]?b;(+Q.UtQU O{sv4:bc0 " W푍*P(dRX;<"2:X !B&ͽQhRq^.D0 [YPЖݕ*G=UՍݙmњsmvQ6w*NVO3Wjg، ڹu]s.ZZJ15y>mtB_(B!,ҼgOeUR`R0j4G*ޯlgL7 .PS~33o$R WAP6?幫$IpX!?{VTrV:m0ۙlg&ZMBwX !/`%BY(gdJb~˖-sL؀ZEnAh!B 9FlEhV:7g*&;، 8;p?Ncr.cv)ۖV<β.~vHHw$L: zp[t-^@IqS8E+uZ; t p-(QB֑ :kמNr+979{X>]Yo!N,`gR\ƍgǬx+ߏ+!VB!5Llj@I!593WA% sKNBÉ 3Ka " yߤq'ַO>=5@:f_Ȭh81-bn O縰ΎB!VB!#k:v։UF|fW$qw # AO *Oz͂iݡ ӶQ?<[x~n3@TM* ׹wD,3g#'lwR=H*JlN]"x[w>5_xq,w=qi)F?"! B!ۑE(5ݛʺݷo_(h8" / g# aʂV&a}=jfCº' WX=Qq]n"R!u `y7=#d-MlGٰ)DgVs]I/G!uAB!dHB⋙d]xpϦ5lU"YY +NWid'=Id%a@=c>,2g?6!RtwoocaLkd}]b?B@!b2d2(BZ(B!lw})b=p@㘋(v+c\rdY_JM^dŸ4+ŕFfzЋ{շ& !fD^V+^zN4uS~ΓRqfWK_q1gV׭ofC؅a뮻nP`%!B!SǞm?,QuOBLva>4^lQ FK4? adY$IXp.&8w/"JQqTs}t1&asW" 3AM¬,4y+B('hTya5AQh1p§;f<&sZ Ц yʬIeo=xViEȖ E!. ͆z3Ime|zQ6|XM*1ap[kaҍtBY B!d\uyy'pº_ IDATZ^4l8z:lkdt92.luk*-pQRm MӍ=9tᅀfaqbzZF 3$@R^LJf;ΑbhkG!<1 ZPx8 'sL+J!d}P`%B!_gsA,NOk"cU @j {XW,@҂*%FDnz߻WGz!q6HTE/de\6n{D<jq 5-"dE`a5sEZRYO-\;K10d ~G7z X !FB!2U׌Ի[Y1Blc& +f8sdVS2bs.=ivQm.ղMUj>92PZC..f0.ۮ,ԞTsVGٰASͿ-`uXBB+!B!S!l VO,"z-. EV "X$0VDm&/ဍ1ցV.<7$d>mOpA9޸/]NtlsdA$nU~#nϵb\Kp8[Mgk}, 9fN{a5lfX&OB B!Lk,.bY V-̊ `7l6U= 3M(T0Щfm乚T@Sx>n 4EAh۩ aJ`)G3T9-V_92z$> +ZnBU8wpKXw5k"+! B!L[+`ǎk'!"5Dg1lbb3g0,]I/&kqJkۖtnQjOA).a#ܚtba]{$3^+&.Laj" @81.,g#' 9-״O[U\J]Lo˯M7)J!VB!BCrTXj &J3ƶxoIbX\n0Fj92 Tlsk9\- DtP;4oq=fV@" vpE$Nf(j q5m*tTO&nNUWs&rSdc=+_lnv*5?ÕB"B!d^\j]a*+EwBd6BL1xGj,aPM oWCBOt]]4F ]YOaMU*GuH1._YU~*rUTB(B!2Uڶ#s"^YY sbbIEJen[p y=*U+ #*ឱ6xsK耺X\K(#+ܺUՑZѩ,aROPk=To3\;5ZB!u(B!2Ul"WY p,)/( *WA>3M(Xwsݢ&uUpm"+U^cTp ƺW1E$2+C:DБX,,ܦqjaWBm~v\Rv5q)3 amˑ)spkR̔~jNUENUX !dZJ!BT5MiNjv9?=CO *"W ஍6Wf35<pW.{3cRknv=/b-p]Q/ -bc1u\TI˸-KggsVd֞yݙ~{nSԎI#Xmap9:ASt#V!qHp"Ţ:PN8E|ZFMgqb5rCBqڒ^@P?.SnE!JB!Bxu7Sꢙ?sZT@@۽$N <kW7`ID5Sȑl)@JMTga;^  +tSLX,@*Hwbcݪ^U= 0A*\Bfu\~3=ےIGORB}:X !B*W|߳mFYm̊ PFc[;1b:d^"{58@ 6 ʵYQ6ۨH/sh㹶m͏ ^Hq g+CԀVѸMeGGBw< R4wVB(B!2lueeeK Bܹ86Xvz ٫*mYj n qR̐+rM4sbXqgÜz'Y +mře+sY 6ִK|^_`^KX YeLZ (SBJ!BȔ}Y}]"]=/^sVTASw kB*_<+;8 E :z*aˈVZH- LM> FDX,*c.F}ƨ,D6s<ƑMZ*V 2 P`%B!d*ٳF 3Z *t8j&f0kX1U'lۮU1j&a=׫5ڵ:Z7JqB B!L%(U4Ųjkr5c=ss6Н[UOQX;  fff1-# cZGx.FԷWY2Esʬp㚸 RfЩX0~ܹI6w+!2X !BJzԼp;NXM[F,qHid.%> Ե0ǵ^|ׄZ iv.al$1Půl`uOk. IGX3KBJ!BT{ۍHUr !cuFid#+EP0)$FLT yK@N~/•E[<0 K/ {SmmyqU}85>КzqܺE^?U*DGn|XgdLy^Fz|(,BYX !BJ_ D HUqAvS auR5͆1A@́lTc?qHP p_Ézc{/-5.t4=ҦhE㵌(ח>fśQRF@Vw};B8:"NB!B!L%oѹmscZ֘v1@?HO-hQ53QgU/UwiűZl+YQ)9K@iRӘpbZ P=]`m% ^ȘsX !l :X !B:PA=M\ż;9)FF-Guw?[ST_*F̞I[\b9Cbi8GgX S6 UYH,Z ,b ЙQ ez>'3œUݺrJ!dJ!Bq[ vر ?!hKC;= )X9tMš 4>+<0so' EHxLsąb/UwMq EL2تZW-A(-Zȓ]/UPw( >S'DQ`%u0"B!8qUhEeyÚU4TFL,ge1,^a(hњwauE|u*unӅ1k0(!G&UGdEbf0"UVf0l.ԉg/TVUs}\S0Ǭ@!dCP`%B!d8FtB.j6r٣Zhd#Ƕmj1޽ ^FbY@)qv1lӪęl&H]1kWp 8ؽ:!L*XD+4kZk:X !l% B!d؞V PnG_h)鞀ZeFx!RPlO`?=9a/"bl@m"o$״8WPA~v깪|" 6[ñtRZaFչv&-Bya!Lmy7i"WB B!LS`ͬpG/v$0ZR[yBq6 vs fd5O?!/OVJM$Ķ5v 5>gtBOY;ykBc?ecb[]iB9UuwuG"A4`e#d[[k7`%1J!BԱ=&Ɖmy'&z]6M;E3~ \Qd^AD. S C@MSY MV#4>ZVJMkqI xu?ұj㪧fgΚT6 ~u0"BAB!ж,852ۊAbNvZU,~7<9׭V." ] 1ȐYRSM83x5#@ҧ_#Wid@<YWl1۶mT`s%VB!B!L[`ݱcǚ`Ro\[dPs6@6JjW9b\va5$ boSQdV#@oӗŻ1@snMsHV" UUBڕ*n~3fC,僆[.q++睈X*iX=\J!dP`%B!djٳ-G59AuTx\3OjHkpҽӕ*[ڟh\W]٤mXm]Bk,/*(/*5ڔ8"k=4ɬ }DUIݸUJ!dJ!BԲ{ۏLŪv4Vw:zo}_l9\eݣ^lk'߲Tەڵ~-.B!fFT¸_5JME\m_'sX !l B!L-j|ķ'jfX^Fb zl/d,n} խ&d#u3JLj+y\ Auy]U=]q}=Sev`R`%1(B!2lnTjYaKGc]SUeЩlBV#0̪.'ng&ַ.WUGLOfb,v^Ȥ ʕumێyɑs j0XԣDVaME"Dm"uP`%B!dj٦vx/#<-4&UjrKW^S*ߞE~j)R+sf@{{!1ez,bl$+knY f 1pENKrC̖fsJ!dc% B!dZٺ ֕رc8pHEgXX(PƪENN% j# xO#ڔ#65Xo^6U<9 I@Bt ®|_xv| .6F1<+ !NHM"Hs3 C<>Oftp0o"WKBƠJ!BԲE+N9Z ASǷ%)ݫRV ?T@` dVVDx\1LH@Ȁ nܱ`h:K&DuP/&%3V٦Pd!敾\UF7k!TOy!Ʈθ B6VB!B=wh X4sY tF|q#=<7 ^\rd`REWqbzglOTDPBʣyäRd8NN3+ xFNXV~. @5*5H]QSV _O!+syn^Gr\]+!B!L-5#pB0|!2HuG L;iMԸS;ꨘUy/$h݅1N\]Zm+ARJd]a+B![VB!BϠ.4fV@CsjUqyxG9- ^8E.l,l։V,1 Դga'K,. t(5x& nN3f+B![#!BJVؖ# \eVR [<@G, W]OD@ȕwR`%J!BTrx[jRʪsmm0^MБeZ {.mIeu[wzqr>+B,1ʆǪp J\'in+ƹ~=M*i״>0#9GBؐu빂B!+9m=B`,+ׄZq-7]p F6E<0(^ĜsVXbM8ul9@7if#YΉ)d!T&XjO . IDAT+tȔFЩ+P}Xٵ4s+!nB!B-luyy'~*>aD%6`oo- !ָv$x=>מwX^p&\ l3ߟsu^t;z3B#j'B{ɶUtb>u*[~ *BdHa`,CW-&@wU(VI2Z!c]듞W !BW}#8}(蜰jW'P! ^Lؗ%vL*;vGz,Lu2bC^40h)W|}@"dSlOtnغcԏ=e11ɬp){aU Dc# z._y tB,rE!BTr^1 5 bN9, q5λ`M/QAT獭>}iYZ;d=q<+[ֻcՅٕS+Cv& g~Z2D빱mfb\w2 T:Y5"HB(c_vhxfM6B!E!BJw)hR Su![DصZG&Dg#EE׸M{|#R-+v4ؔOLh i[C+\ BS"oPd p^5ffUq0Cڣ& B B!L%o**Yi\*U$pŬNUfl 93WԹ`gEw:Gٮ^FB9Un'Ҷa * mls,(wNdbքnОEɊ,״XϢmk.*~<h8Kc.Nα^ B B!L%ueee|wOѤ2|[M**뢜NݮީY -UXtc𓰺qo[[H'^`JD6~ռ(:Bh@5% W鞀NL\\l6 V|VT5h[;X !l=tB!2W m]=w{R/,&@߆-K֣{˜EA/ze<&!2'&KU@+&BmӉ>urNT.T Afek|$ a.EvwJ#aY̻C)EgY,>Zx^̦.kNysYMX$E B B!L%s[PM>vƎϰ x'eAp `ѿ joӤbMB0 ]M92[a5TOW\ZTY9|0ȉZNB ]Tyn4VB!+!B!Sw@X])zRlۊ1, 8 [ a}mbX) J:!x`\ tŴ֚i2e!p[o;g2a[-u&ɵmg3#B)J!BTrk}϶e8RX[ZE}96,}k-3N,'RBƩw)zFJ^kݱ:\22X r` b>9_y>32g-WQ+亶8T"HSkZJ;66k+X}IEBH VB!Bs./o޶b}+NjsUjRӈ#~HNlu.OjfeIe3my:.vT ˜z(Za]ǭLkR{MBE!BjU6Rs0 1rT8-@>}{I CӸUu^šLQ)^ N"Q)PARk[6s|+LghW4slcl6 BCX4 Xv@^o XJ4[UJ?]aRu3\nWB!B!L5755-5Gd]$E@n[ gܞ4(WTs q6_9+-I\tRxb!6E,]Fuݨدྵ|p|-׮mv%'2-P`%B!dF b>lԷEv!3CܟZh`-e~4^3cϵ٩u:Rh>jKh&<:gT`N"RwZw"W;TB!%kXqo >SN>'tn|c?a8YĩbB!l?'`߾k+2̊qj(sHԠ1l  3#.\Y8b|y/:.g}'jP9Rc JupF[;ʆn]RE\&eV]&R` $IYމnvE7W޵fz~٬2Ƨ?M%/UKWc\?^ gx#'!:kGVB!=#l~,h Jc{ܬƨ4S/օZujš~T!zXXTϖ񼤑4&FiH#}M(*G872˵o<5ѝZZ.JST%ifS\<-t$i;w(>{[om替N: w޹o29l}Y5_B!B{SqVW b\IBmb(ܫpy3l|9|0};z^Υx3[Sgw;6͗B!m?BVĮU,A̫(M*(RȊM͆<FfϸS ) =mZ2_}+ cBZ=zyXiMpY|V:QUON\ aDȠV4kLjr.kEBȆY^3 /?ūU?\8~;W^kZ\tp޳+++xh=!8S뿄R<s 79_B!B,!`8MRfm_X-JFՁr1  $[T dN Ij*rݝ LU3+5.v`1WǬ{H25A{nl9Idtra l)F/X~a&8k1I>".n9_V[Q%ieֽ{>{eoG>/^=N; G{}?rm߹۵ծ]`yyyCN;Go>s .knk%B!cזN8aKNFmaҿn;o"[5ZoPݗ 5j[/P ^pfF(T` sn_ϸB^j'D\\;DEJ$2Qaκ~Z:  i`"^>[nv'[o p{]1ߞY|mwmKƹ#GСػwƿ3*>o]mmtB!3ܹw"wvxkyGo-mg1Pշط"[&eqB`\ "Ꞩl=djg+ǽSUUB7ZHmY+feR Q d^Tlmk!L"~ħ?|ߋWW.5O|w >s~ ? "I=p>8Qw;p҉'b>| wUov]-T=5mc Y:eNj9hܴ?@*}L&Nx2BY7kXNG+I\N׾??s~c<[L݃n2=k~Wq__¿Ms/|EA }CS']vUw __6W/!B!ۃ||طlsffa H`J{f]T=)~ +\]Č]q* lݕk8_X>*c'nOW+vɶY0h\kg\q4vf,<6ʆx{N^gh3#!v֜˯/r/x/> Gӟ/C 'x"vڅC8餓z-?o+cMpq'^| ^ / Ϗ]Pٞ=e}8p!Ş={k~cK!B`;X*{?j}TwY.WTrEhR iȚ`@"B~hSAdr]Hˊ؃X$nO) H krj@ Y)QӱE{3vfWm4Bȴ&Os^brxc-ͱ?Z| _9oGW/ke8رr#0\O&v>'|2^˗O<[7{TRq%B!d{w'T\1Bd0DHbWs?V";:ۖp Q^+g5Pzj^eƙehHLkR PñC8Ŭ`:|Эn뤛6`%~N?t~s 9 $ 9眱{xw܉^6͚/!B![=+4 i +KF>j.' 3jC] ԩ fl*Pr[-ޱ;i˜ Y3X T\{c%: "6j ։mX92P=oH$Yս:α<7鯼w!usx gy&B!LdVbGqd@,yn1Zh{[*[P= hZ ՏsR9$Nh[-׵;|QTc3\@VLHqջRÚjrd"mk0B3O}v_;>=Gy=`]{]mj4fCtI%0KjHv8: s'N@"1vM&\tm^/h -bqϝIHkꝧ HH]],QT ( |k+!&ŗ+F<1\B!GV'fV@> eR>Ҧi|&i^;[g0lHjTBBTGg_ Z಑kCZ!$I(RUKHB M*'h Yșm>rfx)H#x d5|4BIF4A2kf.bn͓Us`%<:~{B!1zū;«E56\Qdf1Z=UD=a5`QB H6Zaul,=b$NR:j{4ޛT9blͫ%UXSP{"\ODT*ʚzl6lm z/@^(R4/`ejkxΤ" Bo t8~wZ?FGB!例wX Ri2Sޒsu:AW_=0g1^("e}Y3+yV'&@qNQa "Y99o}q-n @˵>Ni׶eq8W4F@XXZƂ9fݟ5B!d!B!t|N:p@C߫pR6n-La5FiX9ct**Yaּ;Vmr}flF ʑ+#_˙BmJSZTR ѾmSiaY^8R(-ڨfZ 0;6gS 18N dIzϷ-` PZItO`X_0'\g B B!L=~m1(SܝY坥mbQ@kRJmj -'yxFO SdV$bvHN- 'f¥w {4WZ}dRXYɢRN-WkQxP2lj֞5\*`OxY#BΦw}w?c_ K8]]vG8B!lz<1Ӵ"U^(rUL*a 2g5ޒRQ6DP0ǦI%FvTGřЩ^= neV:'iZb_ ZW~j|bH]f i.nCcǵrd`$``0 k l3gBY;`̓ >waΝ/?c: j\s͵X^:p?p9R`%B![vu)޾wNh SB)Jq|_= [R۪嚌R,=$G-Ɠ:j,ݩuquiM)@Xi,aIg~tԍ)K$TO;'}# ~}lL*B!gSc=ox_]7up4?ڸСC8p替N: w޹o29l}Y(na{(N:xϿgqkN;TܹXqw$I7ވ=ػw/`_mފ'O!B=||LJWlY k*5؎.DU'J&!Cud)Nf9'$R<6"1`F25=^a5L*1u[\HhC~׬&OB,Y# L3ܸ:ɯX !l6S4> pMx3^)x^=gy^+_K/_ .y±~|7IOz}<OBw/}m5xֳ7Ox8Ot-I IDATu8]x^?|N×no'?)ۿ}~;vr _Ax"AA!B;v+/VY"hY>Uj*9WjݶhS5wﶽl$ؒ$ ȰgJ#a0twcA :8+gO Zs(gKWքx@U=h䭢Yz<B0[wOw.W)O J\O6y7B!{B`]^ȿE.bog#ֶT)lfV8nD3]W^L\uO@ⱑFml#bJH# 1hN*t׻٪ҵE MuZE{1@!dlsNye,.~=ٕ~gN7Oǹ}LgQ'3pos .W?QѣGfnxӟK~uک;w_\ݹs'. B!ؾE<8PQJ4]dy>z6bH(5@\f@Q*$cF hBc<c2+ Q&XnNZJ$)ҟ$,ʾ{-PϖQ X" lj'$ȘsX !l{D`}>W~*'>ַ~?3OYgGCi<x[N:D,G7|3?ɄB!d|,v~$ԥR$fe>X>MUY*sjR MERs84Z/\%B.`6G9d<ܣR 4uf3"Iů&t&[(֯IegJm!o=w9GB9瞏wOq_yzF+w]'׾d}Yxܹ7;ps\w?ާ+_pW>4_}?PwL!B/cM`UWƂ]%@fp8-TF1Uҷ1*BR1:ugfEK1 3fFk}=Tܫ0+_ALU= \W:.Ypxe=gBYS=?߉'>q8sOهg!;8:t{kg˂z߈׾RqO3!BYr bk)u|F:'+MvJb,ֽ͸QyR+uʩ8唙 :S}׏9SS0x`{1DDDDC1zMvfҞ>_)<1Uc&$m$`V#TЩ6 -tM/"04}X@tj]E֔=T(81P V 1  Y7% օR@%0hp;MGتΕBXG6v*Wor21ڵy^JDDO_160OT\1J*T"Q5 iOv}2d! %<4d[,}nҹeU"Z$}`Ea5eEm!F9!DDWh l+Ξ=BRn UʕgoiE[]`{f>c1cu`%"[@D4׼U"MTvy|\] YQ9^PnV`J0[+O12KNޏ|,A]YkNhdvKo4tBgnd[lݺUYǀzG~+<Ӽݴ}v xq]wQ?aӳٳYzڗLzY9lLׅiv6E纂D58ݘ\J>%Ipzl#KVXT lPJMv ._uOUN^;wʀzG-~=\ncaĉXz5n6"S䊈 V<<%Mgzi+L>(RFK\S42 uT܅heAiBP!{j з9߫Vv~Iԡ^&NB$WEWUغu+=P0`%"b(zݻwcŊxW<ƍ}v|X|9 =`͸{M$~>DDd_ XTjР*Qӌy PWWa)A5>@w`裏 V""*UW]/+Vw{?/#/2K/Gŭފ "'䊈,}Ss`ͷS]ZI3)Wͤ[=< E;uheҩvECV5i#t@ &TӎpUMKϴcJDD=wHNj*llݺ4i? """"~s`{~NŤUTGZ}UϪ& " `pz R6?5<4L`@*r됪M޳ĸamﳫW5 U7:LƷ?DDԻ8CPVM;;;*n2۱c? "~I(T{z+^-[t&ST* @StTW։π^6a8bitP9pDFj&qNf}ݡu$1݋dJ{:€ӱ]{u'`@"`ػw/6l,[nJT+Xٳ{U{xʽH!>u`4B(Z CEhX`K_Lz&jROj/LG ̎!0|oSfiWPgC޵ϘXZ:UUADDE XNj|;A&}oQQQ;k.l޼nl޼7omODTl W( XUr8g1ߧE+u2>XRw2)o89Fyy"+Qݚnl@8 $Uތsl_T߀9D{o+UNW=,(M9z˦\Ay]5uDDt+Zjy/ĉ1ai'?]# W\qۇ2!>IR-=X-[ UuXy#=ԀS:WGQD6J]*?uq\*B&GP'H9@Kc7*U|Ru.#`] Z`M&i>}:^ytvv0 L8ѵ~Ŋ_eÇjk\s DDDDT~={`Ȑ!9Wʓ"EE 16b)u"&Neފ$K}SQQߨN eOx䖧u}|+Z:hIqq3\߹tڧ5;pc$LV\ŚcY٣h -//DDTz*LtEDD%<6h( WcamWј6 \ymuzz%=Ɵ$O׶*sA"@=G:]Z1B{u~:S})$0eJD4[@D4>l@D4m0D&ZYZ$ULd+2j@P4&U. ;;nk_U*ʤoB:!4!5U*CڛV|+IȲ \;٭tbqP9lT!h&l>ooф><KZɎMsPN \@{rb0̔ BQk*yL90W.o"/X1*իDDV"DDdU;wbB{z֘i"VlBah,vW;dĜʹh@4^j@DxOxg@4T-I']~깁X05YiX988n% X-7.w:}=Xjʟ<r+"+р;M jɠ*lHBGuє!X:x~ͧ8 V9QI{c+ LQy(WOX\b,{"_%(upG 1!Xn?|Nޯ-rYslWͪDD40`%"WkWf h1Vg't X| ֑꜇@MOi(Xo%Q m_Wuϩm=/WJKݡkjkN)VBTS\ H{aS1+V_TncNS Xwx|*V9@€h$WDDt EOIN~vuBᄤUʣgʤr=TPƗ QV;3rMJ@oʘ= ޛ:>2SHV 0Bz~ům@@W!@h;p[&y DǧߤOrE@6TsZbby`z!թ1PzC^qĹ;Rac Hc+r1.NOWWW/|wrV9DvDDV"\ET T@36X6pb](v*kUsKYvrP*WFi{w $K _Ӎ 0 ] :5\:n{PzALZ\ܭ- DW+A{{?{U`*@I8a%"lkY QҦ'S'ɞ2r4u\gqNgU XUOrz1;TF>O:8c-z|r&Ͻ9QhcJDD1O>`5S&R4TNPǔJR]h% WFb,K]屉:20<ˮUzf2"uOdmCc {X;[fQOTI p䊈ٙv܉!CW^X# FPPWyiL0\=GEh>tu<t0SR&H|@V{),u&/8 [d0 hBsXW񛋮BY #40bajsg"}ۯ}"* """""ہ"@7!ȾLtU>QiQ 55=K=a$bNZ'[nG`&MI{~i'rMw1IfJoϩ XE^k XgXJD4q+""r_cV5`7/S +B}w/K0IrH}:w}8h{94U#IeߪնsBRakؿX׀cرցـUoJDD3`%"؇Jw IDATUNvX<2)`LIoũ4Pʙ1\$ؕ~6IO(ZPt^l}Q j^q&L +L E:סCj `-`p1`%"aJD41\%""R`ﻦ tA;TTUPؾL[UaOg\btrdTb P \n/EWL2ZheM,tZ̀8ǒ+ c.yLsC0.秶0IU}UDD;qh* CQsbBaMG7/Lr8N!eZL:Gɓt3D#(G֍u V_D}M]6^;yU+7 P}߃5*ᎆRH.Gn(U b+{B_zSny &!nB\qҦk@scECVp,u]]`鏮5"cV"" XV\jۀьf2 )/,6jhhҾL& []5.Baףr2cSB,B4u)`eXNG8e4:UV7. C+jBg5VM6`W JDD=ÀlCKt\Е&5wb|C|i;Xn8(d\dWr[Ja.*T9R0P ugiɾ.US0P4TԔ9Xmh2`OUS7pAkqXkpEDD {[nͱa[;!։>j/ bp*t])V& %NժX'?/G:}D?G(Z^zۄzg:L'E#e{v] Ex XUbyϭʕV""o""""""lpX=v{Mg9 C1bg9茆j zS<8FCIaWky-|ј6JU{WQ|w[\lPkOPKN/YjV=_,zT~Nm5P_~F@6\/h]2z"DD3 XF~B;}P|v2lc&r& UfEy2D](]*Wf2MKA"ҘfBP0 CH}2~fCռ$.Ԕss}5mh:a}>rBU0Xj/+Vj8)ϭQϰE`vegh0K;P4GyYPѹhp~ DQk?;?먁Z@%zc_u,PV@=ߤV"T}_F{kg'Ln, rJj=9 V"""""UZ j{y6wVK^ZSsMeO%f:SmLN 8N&4aP{vƴk%cկ V>_4|:رclz ~ߎ~͝3-Nf5,=YJDD=ÀP*5wVzV^rweњ X4R@sn5Tcۉ Dh*BJCP]EH/ƁCvRX:D^zyR.QY^k*hC9`t3X0-Zii@|VeV2`%"aV"""""BUɚ;W]:s OlT܎ J1)D5)O7F9|L7!jVV&3 Qx mX4=`'a:(\󧳕roY'̵{"m) ͊q}PSh:/4o Tɫj*er^^mSU `%"PJ2k*TuJ\9y;n/WT5j N+wr&Ēp8fMleW'Vº&*T 1"5vWII\-: eՉ^K{,RsV7@{ELft[jp*V"""""Bu{;9h9!uVl9y9`-F4prj+N=]Ei*duI:b Hch^z6M>YjUB;eoo|l0dϫV*LVr+""`%"""""$Wb֛u/DW56TXP:dd2V/h(3 1jN!*tg I-R)|QEꄜʬXfD8v&YmCzŁd+V7&u".>bgνtkE{O9G%׺jPU W V""DDDDDl6LeL f֔y Qy?v7lf=TOOB&:Dй$:YWZ珥M$ͤ6T2 +w[f9Ov |/Ts^*`n2`%"aJDDDDDV/1Z֭[=A.k3kސl>y8?`XZLgZLJ%M%&v)3 εzj^Hߗ|+Xz+IJ9`=Lt֭8N[ڹȽ ͝3-`EO4RQj&MMc N_%yNE\eՅ_5 {\ߣG.b*`eJDDqoe~?7ɡ_g?k͝3`hh!/z~0 z 5m00v,40 Xca';DC)2 ƍ.Lz&NUSn=v٫1|f2=)o k;~֔[ϯR=f,z ,o=/`%"$^G:@s ,Rg,C s=/W^.lkˬ7#Gna[e^Qvtuu9j,mb*fX8}ijTԔ[zѳXn d#jm08bu|+_8 D" VQ`JDDDDDUW[a](fg"UB`jM~;̑[N(?FfQ紪k605iDZTI>xuC6veġf?ֈk[}oz(? XHrLr%K$@$x;G_}+(lՆ^b{k}S<s]؝K Ϛ\9%dB{E~=ldp lDD7+Xs!^:xuū@k7w#bc)DT*N/KT. R!kxN m(Y _**R>w'ilwUU{PWP_ A.EwjYUjp ""ÀlW㛆^{ ָw6 c9{N+ݡz;ly{1L0X&" Əww]A"׶FOkFyeJDD^x ȲDu\ V1ԺB=jDWS)4 uAN$AkmϤI0i$TTT\kףz=Vކ'5398qsD[*o AHH ^osǫ@aqzXV"""""m*qoip[@{]'WpXHH$`T&_9t1- I~^AkFZ>8k +X#-@]`Qix*Je\Uvzv~n˷ENDjk- J}r +}JUTޒjp ur궵W\WrVS6D}kn%_Ūa x@zCzUW? hbJcJ;52""""JJ޼=BAڿI1Wum.b5QA3 vs]H"mc'š\måezO15`TJ7CV"+9r2""""Zkޭ01SNokPk+rL2jUy\Rm$yx/~_Ӭ* /tR XɭFQ+cP?VGV=i?`U6r+Γ$\Mw8N{ʓuhAuD} X[|iϗ NbQV"""""Zg 3^pȺ>4+8NA+ZtoU&վ&j3čװCϯo j&ZVb]C\coEo8K?*VhaJDDDDDR`:>3EH|![D`=bo|/iMh' WK7YK&qf56aQ9rd\nLeD|~[{׶FjPyY!զ~AiB*o+Wvw)ujikm "eJ֠1ȓT@5{>hc譈u]:3:5T Y3}hTƿx)~g? &dZim漏FT%u1閩FDDDDte<c[ 3=^q"T{D^CҠwL-8vU?3ޫ  D8a7ZeNCݳ}}= :~8`߾}Xuٳ7U9[0rHٳVƴi~7| =t ;n9${I~׍iq~鋗Mk=XuL4 1m۶ __ PQQ7a2 4(瘉~u<81¢]WIDxp+5;zU7'z[k[\lǚ{4Wqu լX_}@jXODDTV?}R|鋗y=O?QI4|;ƺuF1x 7o{߿nq\N_3ʎD+8sۿ_B㦅-8ӇMA׍iq658O//ƍկo܄+g_2R5sض};>sL忾;,pDDDDD+Xkמ=/ta^^w\ݺ׶Fe0uֈgR)ΤZ ֶm4UVDo"TjyFZgI#WDD] n;ﯺ_a /]/_U n囸|\yY3֣+VO`ayfm- q^׍ v^;~8Fdio_dp˭pݵ\d23Qπ )^Q⭈&9?@PD&~$\ƠZZi$R6U$A3pU i#AղUʦHMr2h%" X3}~ĈtXrBZe=zTQQ]vc͚5O\v%pv݋p`.b5 NŶm۰i&|V_ީf5 zՕx%9LDDDDT:E{}OWVaPSǵОĭ NJV鴉'hK$Am} YB@Y8q$aT}*(8U@RpO}^ӣvvAa|Iؿ#}1q(g-oy䑸z̙%Æ ܹ ]]]1b/ƍkDDDDD*X̶w(ZHhu Cj$ weg: fz+3Қ6Qܠt۷[z,_j`Z v$\Z9˔mzT,h h%"OfWdd***~s0a&#>Y|sŞ={~7ނ/|y_߲BTTT`شi3ʬpuo5fQKDDDDUT#՚z-*oO Bk[4}?^ky_ZwݱDVg;f4 |o@Q(ؠ>لXfS=:iRN;u{cWW&^?۷/c_|0d|d`F^W䷬&US?;]~73Q ֯ۯ70LԯbR\UA~G"b=o^Vwk;_YmVʕFmG0S}=Xeu7 5_ƭ-#'}cEY&`1i$_uۈ#F1cqF|߿#G@Ƥ[Vmws0ax\sȑ#n[c&""""* Q:~}hGMR~z!A`&ոn.NHx~mk$PHwouA[7b[G.Z$5~b[@_њl;pԶ (t̫6A<>Vc?l|` Ww}A:__V"" ŚMk#Grn;h L4׎<,ֽ&N~qE-hDDDDD?ZnOI{jD 0*LJa2"">:{1xmokӸ;p7 }"ٯ+՞&I*X ~DP=\c,1wuOmΣ;Gu|&>+XU*fW""uuS)=3f3N~]{ET$s7v'~xo#?"":HmrzCя{ u՜*;Gԙq+ÿrU>>=S*ZcY|L{?;$FdV:oH?7i ؗDDn_Z=AϔJ;Zl7|{aDDDMۀCF=V+'UiMXk=UmkiEwlBvDYq\)b+VQn=ڛ_QgJ[ΪU""6އի82h§nL9W\}3V;It-XNom$ H5Pj,վȱ^ XYJDD^JDDDDDM}|>1ݽvDu uTsR᩶%[y @KAנjVYkmܲj[5~F;:WlZ~'CSDDCx (kcKWG[dSԅ B[Wǜ~qyO9&\HTGTj?769dm∴<~dU `fNR6 ]ȋDD-[kje ""^?~m/uHkyLT9QQ- i#vqutu鮭{^b)X@6XeOV""bJDd۱c'6_FcN""^=OL6W*OFK/zUQ(؈+*׀{Xh *TuIJ̼VH$]T\iV^%""=DDۏވW^Wވ}Wׇ{ VUNBb+h\mryP8 f:Yu_p^^O/֩p\)UpJD;w܉gyֵgwyh髀X}X~@Uijx&PLCLOx['cAe 4ֶ8p7^pMտ[,:xϰ1`%"߾A*iPigWrzߏ.߷B_7|ǐOB뎙O8*%#N\1j{=gh %WPՀeV"";(bӦ#F`ҤI8È)S^~ՅO<g~ ׺?%ȑ#`U9u%_–>o~s6o.@Dkz~'J$@?(UJNM>ȕ~LS:v1kkQ\\[&,wŪ.Dխg?V"":(G%V~ݳH<8O?i)#G5g>X>Z]4/cu.6o~۷m%""Uǣ ˧zoR\ȕ-D^c$"I@5eAqT }? o>2P%"`UYN^76mƷ_&yo`޽3[59ܒ@] w/ڠ& h_1ѕO ip )UngM X'Ng}zxk}r\|3J`ޅbq'ލќΩ]]] m۶aذax{ӟ=_Ϭ/Qi'OD(Tt_O~ |"N\zY3ž}bui&|TITNUV[aUp%G"""tܾk 3jM %^DNLUUX_d[}D߯5||gm練V:NX>:VAٻ}6m_^+Yi+aׇe?Wsg|8 7^X쟰jj}z|qݵ$~ZZ?oXb.B{h^npх0hР A۷oǂ/Gy/Ŝ? Zܖoj5Lmmqu܏ʺ]:A/+8Ç ɓpEp [lE| 6tbܸq({<ǚlsB2XQ##G#VC~o_)~Ə駟O,i˜c'iL9؂ {o޼o>\_g6nbJDDD}7^8 k`m@SN&Vyl3j3Dj-t_cW A-;"U2( XO;m/ ^X n_vaCu{crLK%_˖ /n}Çc۶m ڵ|DVOaoǎ0a?"""cŮ` %quW~Ֆ~M\6Eg,PTŪ_O~JT}e_VJDDY =z4࣏>~(vރ'}s91zh|صk90mZ+VD[ 4=Z}'M;[n_۷o{ O bWɭܕG[c|:簃ZDcW{瓉ՠj|mDMmT "` 5Ϫ.Le e D<Ӹp'sVt_: >s7ٳaڣ-7-u_6loB+laÆᑟ?;{rg1c`sQ?(vc%s*K5(La>Qq\~s4n;*@1Wǭm&:l_xYY D%"b̳2ǝ2_ݠr X2nƍعs>>ݷ-}*~Lў={8a"Fݮ]~5 Gq$nGoxOqzwi#?/\:k^;se#""Xy8HǻX’ju+Uy&M&j`nU\|S=+DW!o^z>֖^ŪwV(xJzS91%"h Śa%7Ǐv@ړ}ߣ!C`ʱU:u?*#x,D" v$X\U~ZLK_X. Wpucծ6*&Y- """""bHcNWH$4ީ2ѳTw6xɥ»?W8^ ߾~mV>X8FvjS{Bz`b7ɕ^XYP3܋xsU}5hEHXTϩ*'^Z3Em^~լ^ St!VP`*cJDDDDD(^zz{7? 2@}Oeoq4Kx lf.UPյ`+cJDDDDDME:9?ԬU7Y.T{[_AAPFuk,Mu~wwUʡz""bcs`LnU(V#N^% 8AGsm['_g]c`P62]DDdaJDDDDDbUd&ʻ$W@&F V{#= a@-"'vz0梆 W(+)Qzs!շUL{V @# ɲU:T/7SX~aiu@DD91`%"""""E1*X_owQJvX-`<&I!j [w ϔ,=`=8'krV淜ToH>d +t K6A+@_w~'>m7n܈ѣGcϞ=xWp裏lٲguϟ/~6lʜ}vލ+VO5 #Gto>+ؽ{7>ObѮs]ƎO~2dHw؁W_}SL1&\񖕕|ݻwcʕ0 'pk6mr]w{_Wp{.nFOv}G+Pij=NDDKدT"D: ߟ$lҌgCA}q;_=q7G,HO\tE曝}(Nw_^ohiii0|\q>}:^}UgzݹD?) W\ADDD2ϼTBDpiif4T~!DDWz.[ ^{kߏQF^~ec̘1xDZ`\wu;JPWW饗ꫯ|{se2̟?_~9,Y7@:F2ƍϏ>(^z%aܸqX|99\z饘2eJrc9W]u.r::̟?---0 /WRىo]?LQbx}_JUXBՅJDDE`=z4&O3hP ,1cg}6n݊c^}վao^z sVX+V裏Ν;sϞ=xvZx `ܸq38'tz꩜gΑNj*xζ7t;JTjn ""֝ ֣חx*Xe'-A+@V |3Xhz9x>ecǎcN8woAᮻr-?S~L<MMMhhhw]L8w}7/}r9ϕxsw!:i$VuQGUJTJ?_Ă O cذa>}:oQ)+p{كuTrl @DDE X{bРAdc9C=;wvލx<+Sz뭷p{pprɒ%n]oԨNz1wqq!00Dprr&jԨqqq\t4\]]iذ!ӧO… /_hR+>9UFHHW\AQlZUYJ[!بYa|B! ]qkkkVj+W,Yܛ˹⒧ B!0<| :!B< Sf=Ta:B!BQJ2͚5XC!BQTYB!DB#Y5ۄB!BIQ\BM2B!Bq=vB)cE?ȹăIUHT!B!Dqz: ժVͶM1txF_N`OYv} ؽg¢$~.qHKKo!44hK4i"*$$Ç3x`6l B!B!smԺ ^lITmK8 &'OsekcCFFK~^JDD$=%`-Qݛ4TU7JÇӰaC<<<0`3f̐!Y̙ IDAT;9sgh [޵X%B!Bef{VG0Ĩ֩9;;:|ѲU[6o*S+FƏ``aaa̚5K"\D}3sLƌ?qsGH֮[֭ۉ#,4Æ`[QgܲuV!BSZU*Ur,\vM[oe\) 4i҈E?葃 Џ>kIxbOի=z4N"\zvI׮]u]t!!!G$xd gܗ1ۯebv͑ΩS9u gqW!BQTX5|a*zYW.#Y9{6RSSyя^7h.FD`ffF TUEQG:ȟ~gϞۗ;JtWJŊur% <6B!ISSaѰQ3z*gӵ}SO+SssG:ȿKn۶+V믿2p@zAݺu%EPd7o4Z LsgOdjfzڹ$S:_h ~sg B!Hqtpx*tTAD$Xo߾͐!Cݻ7 8-=zFp)ܹ / $$W-1dXZZRK6Ӧ$XB!B6`1bnnn|?72qDƏ/Q.ٳӧ666|׼xxxHpDJJrx˚iai3iS!B!fϮNf f&+Y$lْ]RV-t駟J屰ɉ7J`!Uޙ6'6u:M!BTp sHUU~};ڶm[oذ!)))(Q%KdDGG@B' gB!BӂH-󴟩JWI6/LMMyQS\HJLd떍y>޾ 8w FZܞ qBx$XOFTn B!BB̌6m;`kgDžܸ~RJJ.ۻȈ ^U$lJPWcbؾmS򮎽}YoDZz#BT\%Jp蟿YZZaV¬P?`ݽ[ō<,n޲M ٵHY !B!8;;{t:b序(4oњ 9|4yV_Jޮ ֬$##uѲ9rĄn=zٳcXn%8+xۏ|-^P_ziit;k8x`NNѱ߮\QdIlJF3 Ο;WUI !DNxVc'1+|xcMJVX;{RL!B!gbj@Zjj.m9k}&))3ddpJ4Fz]89~4;J47n\bJ^ըZ3r>ojϞ9Ejlllt s*V{2ۗ4‚"<⩑ipI*yρExVB!KN, PT\ IVq&i z=z}QU^I翷] KIIt:,-NxUTi|'&X[2Z.e]ڼs'}V*ꓻNGo\Dϕhc`-U=zɓ899p%zɲeVD5+Vӧ;vE;(BzzO!B!HHMddd`ffFj>$%&qB8qqԮ}PuF旷w5N>ArR*SƖKxzUܼd}V>TX gg>keLLLؽkH] Kz#׊scڵ۬_ӵkW:v("oalڴ.]H@D(B!Bȋ6/yIsߙvoSOyc0 ֥ V\}(S n9|OjDF\0JBfYQxyW{~LJK©SVY[[KB!B! 2ԌĤD[KKKT ک֮4Zv*Kۻgg^ʡ3k&'mKߧ]Á{qB|?빷n٨qBHɉs;߰WB!B!xn$'='*zO5ukܹsM6Y!yxٓ !B!bb{,Q0tXٲe)[DUP%Q%*B!B<܁re D!`*!B<+Ξ4*cǎ @ɒ%quH B!BbE"G$$$pmE$d%Y%Zlٺ7nPӷwaTrȬ111‚SJ0B!O$XE.]ʐ!Cebcc (p\-jzÆQӟ֭slmmquuFMxN*nEJ8ʖ)+bE̙CJ$*B!x 4zjh11x`,Br\tܼz \rD_ֆMtR XW/_Wli+zc~\N u{ddvΝ;iѢM!B۠!C%ϑayO'B$Hll ~ZD%xᅚ_9c*+W,ё+VP녚qrf#AǨFPQRN-)Y"ܹsB!IB'b@ڽҙ{jjL %Fʖ%((^e9{6KKKWJPQ|9>}zsHfHQR5h TUQFl޼UUQUOOOmy0!B!DB'gn'6IF̝#z^>f̙;D !1Q^n`j֬A}'1)ԓxWxW% B!BF&BD2zoSDG_lݼKKKoq9:Z;^ڬMi''GV {{;*T(/Fz WB!B<5`B<?̚^iߖa%~E{d/o Wqws#e6n܄vwu̟t]r5-[4qu>^*AB!B>vp8w$Qѱ"{.,_oBՓ!o ى =[ĉwgh433/Ν ,bj֩-dffF׮]UC!B/_`mm/rKNNfذa߿WWWmۖc?ƍy7\Ѷ]O^u\{F͚50`$`B$$$R|9te>hņ طO 0ҹsg6nɓϴz֭/䯿e˖,!BQСNߟ5kA˖-Y`]t)^d 1114i҄ƏOƍ Wɭ ͛)]#_fnݺԩS]rm֭[iӆ7o2`Xv-~-;vzO=N-ɎFS!fkk̾a%W>={ɓiݺ$kB!B>(BCCqrr֏7(m9--0Ezꘙiۮ]5?~ʗϜwSvmͳBhh(nnnTTޢE {]6iӦZiiiネMpu͛_ɓ'cjjx߼y J*a޽;zO}N|'X7o.bdBKQv%Bd/3awڵkbժU6EQعsbB!*))%K0o<*(9rݻwΎ ܹúuM6ԩS={`ooOHH+Wdƍq-lll8p6Qp6mQB 1~xFkĄ˗/k׮]۷LvXlY0qD̄AxwcժUlݺEi~WW̌3ؼy3:u5K.e޼yZr5+o0ydVʞ={zKJ!a>vm@!._vfEI& 5ALLL7t<"i2\ڂε<)B!'OFzrGӯ_?2% ڻˀ8r6244ꫯxי4i-"555jrJ}A={utwwGEa0x __\aƌyr=G\\FׯӇ\aaam7Kرc`BOU<$fχO>cҦM:&Rَϵz]vX 8KժU .qP ;cB!xJRRRXܹs:uʨ4ȑ#R QQQTX~aee@f7n4lؐ3g=p@cj֬ɖ-[:thxb6mDBBIII̘1jժi|M9sLa{= srϏk׮kmllrlƆ<⩑I8t-[‚ƌc=-- /"65kF>}߿?U|@RoAU([;z85, EbSя ]DB!DT\9 ܒ111࠭˪zD)d&T-,,js]\\s_}UF5(Q"z * GGGΝ+Q˖-cĈwqq 2229Ӊ4=v5""e˖6 (N<ɦM8{,eʔgϞ9B!5???mjNRSS E?)10$>"7J3 NBiŻ? Dr:o, +5t2s]Qk P_LͻۯA T WdB!D鉇 M6q *AttxqDFFf[СCwppVZn*_$!==e˖ѲeKZhA@@@ VOOO_[|9ЪU<=n)))DDDd_4ij+4hcpssƍ4jHHD!(JEAQVXLo8um}84奟Qm?5!u`mOIf5QJ6P'怹=[;gR/mm?^΃5QEM466_zyq]3PwG!OH!B;ӦMcѢEL2E==!!ӧrJݩ[.&L@UUz=ƍiӦZ2-ZMJ~zر#K,+k5߇-[0vXIMM~.\ȩS8|pmN2 tRTU2kŎ=Ç?v:?{kj駟օ|r,XOl\pօ ӦMO>!Es&\B]~DΩFn=&̉T gXUB[[ϻ;OA7*Q F싮Yz9{|?P˷F !pu?3v8)J *'jj<Bq .ԍ-J)t+B`s!(>/–n3:v|QOF~2f+5Dle9(On!B'''nܸA6m9s&tRqvvFSreV\ҥ 7̌h̙KDDD#AU~>j*kڵ+%K4:ɉVZhѢѣ5ÇSdI1b_~3yx ָ8toM߾}UVD_H|Z ;!Eߍ$ШҥKdxaS[Ptn5>o1*J#Z@Fm=΀K[ jJ;^z8荺)4Ůj澇?(9ԍPD)(IQ#iEqz=TU[Uy7Bm~(.MQ_^IWPI*.Q_ZۻvjIehpCʝPJ+b#@+j(e|sLZ=XOB!xftB.]|2baamV!!!\rEQN2Ն f+uǬO΅ (_o&GA\h8&\?{tںez6Eiօ+`{g )Rt^B!M5ISA277ZjO5䇢(h>Y IDAT|yUGGG>3 (0^>n;wɾ=J DPvl߮g[n[̟??65kFAp}pljX:{':ιQmP[C1(r`@.b o"Sj烺\C~$OF:v9x7ƣ QZR7oj_JPe;|?DqG?a} ݘLJæVxݾPl.(ވB!f͚=z"ТE`)SF"[ zKTT3j-ܒ\B<5kLYz5*_z,X "^#7S@8*hIB+o5Qu(5+;o<"(\ѵ[A.w_Zɰ޾O֨/.0E P[f&=_~Z#Q=5dzfJOPJ, BQL̚5-ZH zA{=.]J͚5%ŀ``:u  (pΞ4*U!ģZz5Jɶ???z){ͱH>4>2X*Z=7]6jJTl *תs uTl5t gɪsoe[H&(U̽]ڨ]zk=/s#<Bo <<7776͜X履~b}\n݊GΩW_QD FK.=BQcƌAӱc\9Sfeqzl#/\E 3(yo/R| )ݔnP \<5 SQj}N(N Q3PW4 9r$ӦMjMjՊ+m,[_~QJ.\-O0US>#mgϞ&W---texW{_̴iӴZ7ӧOˋ_~K.T^; l5Gg0܊l_}ƌWdhޜ7T{ eg??#]taJ||C۹s'Ǐ~w6m ,{}RF RRRPxv ֭[yIs+#}@!Eʕ+QUݻwi&?ξ}PU &nw'HB!`PٳgϜoe\!BzK35C޽{߳F{$6ÇpmǼyڢ111t477GUU8@ZZGUU-/fv ar/Y8CAph4mlt*U罙ooo &l[KTRG 2l-Qq;ڷod1Ν?GQ8*=] rڱcG뷽R[v lǙp1y !I !xd >oJwoػwHQ)+Cp+\!sD7000G{G]}Pvm6lmoԨ9d(PS~wmr4,¯cooϠA$ @ΝϹr3dՏеD#Fonx[F<-Z@7h[^jmoدfiq|000z*V(O`!D %OfWڷep_a3{<󒟰z? ADDPr%LMٹy3 2;wgg߬G]Zl,ָU6:^! [H,xB}Ӓ 4V[ɓ'z?d9ru>$%% /op|G$x cǨUV)s7{֭WE/75x"A/)_ {\¥깕nhЫ97POtlamCF3P_ВOB''Ξ$*:VYHܹs-[G3JX[[k5N>çTRzzFQZUƆswֵ3_NɓUL[)'"&&FQ<'w OJAV˖-K\\gΜ &PNe3YO=$''}vƍdh͢WMTH܊Ө Cf;JP=|i1ABCt3sS&(Q4&LkᨻN/mE28ocCf(6~HD= JQ': عs'ӵkW||| m/_r>>>t̰aؿ?l۶~`B~ ::Zϧf&Io޼\Zly7&NeM5serGf՛ݳgnZXŋh2cUHf\7Z_/یcqO҈%Kjke ~/Kj F4 u5ڴi 6SNl2x hrf=خ=)8p;6UEHODIrVUE7aaaԭ[6mFpp0>>>x ׯ_'88ooo|wX^cW;ڼysy#wTZk. D!QlYhݸqlmmu]w﷚YPR|y|3Veۃye y\K^Xb!s}Ϻu8<˗w|~g}͛i߾=&M2YIQ;vGQNLt#낢3!,[͚5###VZ1am?aaa9Ϗ3gbwOy?h*U|rm?0rJPUjժoPn]ƎkԮPX0sLΜ9шܬ:tHwNh4Ç`ь=O?D?/K/d4qXs,ظC^ R $,Y¼yg#Gн{wΝ;[___ڴiC:uسgrJ6nHPPnƆhTڴiC5ؿ?*T ((3r|]/&&&\|Ykvl߾gggڵkDzer'j>}AikժUlݺE9vEBn8{= VsÆ M7p@mt{fͨY&[laСyŋٴi $%%1c Um7̙3yykK I !IM4_03oOّp?z|8}E>q_ѩK z.LyڏcO(Y+k+3ôIBBs%$XR'8%xX!'hJՁ( ͶiݺutM[ܹ3Zbǎ7!rk1&&SSS/+W-bnnQUsslu]\\s_}UF5Z5t슊N.\wwluX6l@ZZ={|`]v?ijo>.]DRhժ:u,rBi4mژ8RRRprr4_+K~(-0Z.QdP<굫dgh~h( ֞={pssv+x@ލ7:F!#QC|J=~͚DKQ+t:^^^19sy+1zyyM5U]Fذaqqq\rY"BJI1qD|bX"PiEe%<3G! qoXYY9pvv~bm|m(Nʳ2IK޽6n܈=zPpn߾MNN:ץK d…j&Ύ xg\FGp1$86q)t_3 !Ob 33`WOї$ Bt((N!DѵkG^$K2I֬YaÆ~z<<B<]Ο)0*U!Ŀ!00ƍ'xi\g Y.JV!*իWrJ"""};^xAo-]J4~~jrG2͛$%%akkW#$$;w+Q5/_̷̞=C魯"(ed° G߿Pn @tt4w֭[ԪU 7np…B˪YrۣjYfM:\8;;KRR$XEy0*U!ĿYfR\g_իWiڴ)wn$22ށPlu?r+V '']]] zsiEQh4$%%/\8.]7|/:l$ IDAT0~WBJKSVuܙ 2fwNÆ 044DreXjUe ڬ,.\G{ܹsț-Z[ -p5k,lllh֬H{IUI !MI D}! wNGFF:k;V$P PZN_SC4:KLΝK]+@NА &~ CqU}>>>2jUQea̘1/RClʔ)tЁ ȑ# (Yfѷo_llljqO0KKKlllv 6رcU-|/fff$''ӦMv؁G9I_ޝ'&&CCC*%i%kBDŽ|?~˗_\k))ի4huiM kkkL\V\ɼy !e->}:ӧOϷ}ѢE|G$''Ӹq|I@ǭZʕ+\xKKKjժŌ3VVVܹ4bbbQ'eHp]͛7 |1]{VOO {{{ :upM֯_/󫊒i\I Q)Ѹ}v,_s8pxxvqqV^͌3qzkL0 6rU^{5vשZ*YYY8889u^qKj44iBdd$ƍ{M10sLΝrz;ՁOFݻw/7vҤI̟?_BX^=իWT$rcdaaeTŢ"ի|`8p\R Z\$*JƲ3#do]?R5k&55>ӧcbb‰'022G̵kװf͚?UVQfMٻw/111\ru֩eggDdd$Ѹ\궍3FM &W?Β%K044D3}t͛ ۶mcڵر{ǫʕ+cԨQ4i҄7xI&e˖BH#!B!DE/o>4 :,rrrQ6+W, .("Qy(N` !*iiizt?xR5{%55@;󳲲xי={6weLL zadd@HHިQV;w.'O,U-Huoܸqdff2btܹSވiӦѻwo~m<<<055~hѢlٲEoٳgy&k֬`ʔ)9R:!j !ׯFC&''ZFyE~.oAh[b!D)\񯝻Qj?ZT{vJ?VREOt>GP!D \MߛnhK yR>>>Z*]~.s{Iy200 ''->[,X3?>[ ~{5_gғslRN~'oH!D^xt:.?˯sQtu@ڪU_HKK7L8Ql4UVQjU~mΝˍ7hѢoV.G 8ȑظq#ݻwW,_\M8Ο?pQ ,W]߿c6/a|˖-ݝ$y.]%y ؽ{7K.Ffffb ޽;{o鈉ǧzyywxzzruBBB#JMղ}v8@ZZ <r[_~E]uHOOgcgg޽{]~uڵki޼9nnn"WB˩NH?KE a7$Z-ZxƏϏ?(A8r7K !*Tƌ~t~k=z`ժUӇL_NϞ=IMMEQ>zM\\޽ EAQ3XfdŊ+P7ojI_˗/;FFFpMunXv-UTaٲe(BZZ .d(۷E=*UPJ_(ܹҡC"ˉ*J)2Do !*h=xJӇ{r<\^r,--۷/?Sm7o;w¯ o%XvGԬYs7T~ S!º7\jdffС "((Zj=: ȍ!*]U85Xv}b7 3g\!*3gΐEv =&77c2bBBB8}4{KowXX;v3g2j(ZlIhh(yf ȑ#zڵkjnZ0;֭[ mÒ%K6lC ĉ&WL`{.^X!,r%B -P 3i$ڵkWݺuKk~AO]]Wt(V$ BTde'vʎ;%ODݻHՂDEEwgԩSiܸ1111cǎUڵ+fbҤIFDD^ޘiժŪٵkܹs%K?~Sw!*1kkk.]Th1!!CCCիnǖxyP^ޜFFF[{leeEBBB?`N1vvvTZۆG1|ZjŇ~X#Of͚B'޾}{>LosY_K?Ҋom3f7<33[I'--Ljlݺɓ'3~x͛Ǚ3g?)'O^(uY~}C4n8O$BJ;v.TRnݺ~zt:]?\}Y<+$BT`(t(V]$B2䄣#7>-999ũ okkH|r%)^z<38::K?=6ӴiSƌ\#'X/^Ȕ)Sm_͛-#>> 6{R=7..zm3fs7mۘ={6oРAV.Twĉhժt]M>RNȑ#zܹszK/n5jTBQ&77#G={n:7n,P u|z)t^!(s-bڵ,\t5xb6oތm۶eΜ9t:rss5k]tQGڵkimFdd:}ֆ S&m,m/3f(Yfs 9EHHaaaz}}}IIIaĈ@^СC={V[d dffsssћ777`9 V%%%q|(뺔'gƍz*_88p'O]}y&$''Í7}YYYZdL2Xl._}ϟQؔ>̕+WJׯέ[8xZTx"Z疤?>}'O2t+99C7x9^}M۷WWW֭vӇD[Q=ұeGۻȻ:Q H8*q]8`!ʜ>>>Yccc[.}(?H@@XXXźuܞt '''Fͷ~&<9ž={ʤmÃu ǧmmmy7+`Gё.]n:u2d&&&x{{s!pue޽XfvX~=z!99SSS"""4hԭ[~[n~~~|'ٳ:u*@֥iѢ111ٳ^x8Yrޔ EP2l0pqqƍԯ_{ /&**e˖qFZlɺu8qČ222غu+-[,;waVX>SSS>̬Y[.,ZH(a}O>iӆ}aii̙3133cȐ!8::F׮]Yr%7nPOI={_zra eر RRR011! 5j5 ySxxxu( gtM>1(88OO֭[%*9pUhB9 B} !c鉧'aggG΄(N {oի͍ŋ k.:= ]PMƴiӊâEXhQ([ocRRvspvvvNˋ#FΑ#GXz5^^^0(N ȑ#]u)Y~=?#ԪU1<}4~~~DFFo>N<[Ծ̟?ggg>SN8ueر1N>M޽]y3gΐUU?ɓ' 䧟~b04hǏgƌ;v3g'ڴiS>Fhh(ǎc̙5-[JDD%;877]vQvmۖK>֭[mDX< )݊`QD NQ,:H, M6K*_bQ쬗\}G*2IKnܸ+++zv?e˖gCpppu%ի!!!`ggGFFFi V7ooou^ɮ]ҪU+|}}˼.ѨQؿ?lذAM7dggtRu{/eff,"<<>@6uT)wT-Pٳ'?^9K0yGqqqԯ_}zرԬYSәL4I}cvss#"" ݎM-bӦM3EQ~:uꄱ1͓ 23!*k69ރJ0N׮]l)h ˢ5k2l0֯_֭K]iÃ<<<077ؘk׮\W^Egmwss{ܮ)N[YYPu)۷/w=߂aE֖;wd͛% ,`ذaE۶mzXLLL/!!CCCիnnc믿so.K.=vV-iIJJf͚zź7_ii%/DeddD122ۖQ~rmGnn..,xd_ѻwoLRn3$!*I(E1u`!*e˖I ò*ۛ=z~BCCٺu+޽[n#oܸ  -f͚z_~]=Z5k֨*n\ 8LRy{{ӿ>S5i^Ӈ>}ʕ+yׯj*t>|xh4Ѭ&N/^СCrLLLpttdƍteooOZZ jUJӟHHH(qJ$%X7nXvcgg'BGm6:DF裏hԨM4AQ"## gܹ,^ÇӾ}{ x$e'82Q!D;Ϡ!BXiʪΝ;ӰaCƌCiذ!hZ5IŪU,EMfeepBu==zΝ;y:7~z'&&(JvZum۶ɠAJ]',,L6{v}/_&VJ۶mj(RX[[siu$m۶eΜ9t:rss5k]tQYhk׮e…j055ŋkk{{{w;͛7||O]tĉT(5yo.:ǎ+u[!ٺu+DGG3qDCÆ W^\~B ԩSPP#T@*]fxK0B7EQ6?9+ ^Skr 8P/1vdgggF-BGoV%KͥwޅcmmTː,q]4!xvuM`{C hs'Yn9'C/T IDAT3IR*g:tffZ ͣA7N*B#ў2o!D{ [[T޾ة9_V`%?nև7j qrrz/T͚5{"u322ץ**F2$JʪT{sKگwi̛֬7O>΂ ^hٲe^ǎcN-(iiiуUȻfڵ(Qvj9@ArF2tFB!(C O 00:uf He:88kmruu-s$*x&MʦMu ͕# 8P)ʜR!:3t׏ԗӄ(tORD!% V! ggg,Y"B`ҤI訷}DFF2})Op-$* q( 8&qB{Z۷sppp`:/\p[Ņ޽{t&O?vvvݻcsss-}?F1bÇ/_B!էO oŒ5MJD8Kx"7u7\KMM{L8VZHٶm[ زe |2:tƦb̭]WP%#T!ēc4 Ç'<<<+W߳j* (uuB@w$CQM2°PϚ5qVVgϞEQ7oN*U}ׯ_ؘLN:\9l޼;vDJJ &&&PF 9-Z[[[={6SN-U[Zljmڴa߾}XZZҷo_~0o> W_W_-@B!xrWT0tÅ_$B<W@!Dvh׮]2vXFAHHOwxyyݎFhh(ǎc̙5-[JDDl޼Y@9r~~~|DGG-k׮EҺuk8v[n- K,aذa 2'N\HLL$22I !zw3f aaa~VZSHHrqD)P"֡K#D;<#qBkwPG$**p>uԩS ֛B`ر-]v%33I&`ddze{{{cff>UVׯ {=,Y񘛛 3i$9RaE;wR;B!*:uI-yu[ĤEqΝ'V.]Р/JNepeyA"D<ys \ΛҥK~LHHАzͯ>|իWכsȈ ---[YYP0SbllUV-iU&#X޽ILL|]jk֬WBQ%&&rQEAQQ,YŠ+x뭷$PBP<х.`QfK (pttdƍckkKNNqqq궋/˗=.Ig1_r@QކʠL9sssZp7` !ݠAXdIo׻H pl !B/`W -ZڵkYp!@/f888жm[̙.:k,t颎-kתRm۶H  S&m,m/3f̨t}LiӦh4kO:_RSSر#C AQ222̙3dggʨQrظq#꫄3}qy_>3a"up077ח޽{N:LR2K6k֬}cL2SSS>s222=z:xᤧ_bll'?gڴiTV>, <ÇY~=l޼SC:͛y0l0^z%,Yᅬ9/{a޼y[ٳgh5jYYY&$B!&-O?e֬YzF~%`P xh):hl{Jp(KPYZ !D鉧'aggG΄(N {FZZ޶իW;/&::j׮]+ruzX|e:hт-ZeF JpGwi'JA"/mnӦY֒Tr@(jBpr "4@ !CtU*'9 c}XXXm y=z۷uVWNVV4k֌SN =:@\]]h4E+))ųs|&MϞ=ΝK?ѣGB!&:tϏW^y5k֨>ٴiON&&&ra~> `-]Nx2*9/qz6.t۸.nG#3h@=J4o\BYlfffdeerJ !x̞=Q[njrU0i$ NP 핲};bK=%Kv[H8 }w8BJ呧1c3f(tg}Frr2wI뭭%!!+++TO ٰaԮ]cc"qY1bXZZꍨ-\&LW^IoӦ vRk4?>믹u)))XXXPZ5\\\ (dmmVeÆ dddrJƎK֭޽HT*s[/ÐJѦmY}./4`|*shPS\T|"ff.:[G/S<0O=zYv(43FZz6ӎl,tk xakTabL:rEQs^JZ^.{b)y IᏘ쾒¯bcsp*)Vuj{~H[s\I#W8BSljVjZ.%A5^JSW+:XW~K `7NyCBT򦒼yV!I 3sUZ;;*^B( >B'-\eq|QLMM'X:r^hlVb]KO_Vt~ZFtŢ-&FbZ7]I݊H?\Ei)D#VЅȳ86q!uۚᅰ3:uÇmժUcѣWV ###XQ,E[h:}Uaq95~QHFj7x?*:akKM<˗-I5wk\&e̖ CBVGMC ZٹZ:xE}l&=|OkP_NK=kki:M̈́#W뱸?8{I )xm u0烀+ ewyE'ۗ/pź!*{U!R$X"Ba…ݻk.իԩSڹsg۷-##={ -Ύ ׳_otP,:T&t~ M`NuTשiUo@U37Ai5]Z[J oFܝ,^͎MR2+iSkPۈG[olˢ\ONı\"k5ԛ~܋[\BTx\( B!۹7Ϝ9sʬ j*{EԪU N&Vn*D_G }ݾXDjT.ޮjYrNuX[_΋fO:Ќ#@H^r0}'l՘OZ?pʕ3B<=$B!x\F?+pvλ5vjZj+WPF ^{5^}UzV|h "uJ> NwhzrujúsNIJ|ﵬ_豽lM}5.nZldFg3Z֩N_05*Ƥb(\!*NՅxI !ѣcƌQoܸvѱc744֖䇖ϒΫʳ>ݻ7>>> 8VKYJ@S]ȗc^bKoא ?aVPv#d7lLƥ:e-keő-16sy.. ~m>"dVQ\!BG~NɓYfm߿__~H'm1MN8Rd<`\ u0̌ LJVZ#||NUؤ5 Z<&Uڶ=طwWkҴ9u緋쬢 )޴` r-!NǍ׹SjUF?6tUkW|lֿ.u5))I^i\S!ˉ'Xz5WVuܹX[?m/݂ݶm[4h JR'Xu&JСCrMEB]vt:\]]9yCh4,^ҵkW|i567Egۧ, 1|.vAQ9A+ ]* V]9tS rq½.D}*85iCzUL%33Q4 ;˪Z?  9i9dGT`e6z޴̆W9S'5S4S$IE@TDAD@Ax~>G@Quqճku nn^ˀ}Jn`#ǐs[[{JJJhӦ ߋ VVmi֬ؾ21WbccǵkXYYqusnn'GCNN6(.*"5샟_w]03\bϜtW79z𷻶gOwg044£}Eo&Wo:v<=~)B8q{{{222xNYYYtV$ӦM(//ҲÇ)//A.hp֮CLCm˅'S|y>v0p0*[?69 v?!i K4.ggU「0`P9vH0`۶n֕hSVvn4hǏz7 0is\6lLIIz IDAT v|r,)(ZvFQrsi0a!a!՞y昵6u,,,*|R}y(-MkI !ѐԩSIIIO>'55V ָ8,X A:J'҆3Eٓ^Vg'Ff> 8<ј:B4)5]ҒYj ss vتv2:)iʄk*ӽ_Qdeebf?wVAfF:9k̙315g޴srȨFF9L^sq\̼F}3z8W0KK۵F)/) V!BUr=Cbu3ܽ,$jU<{<'tz`To֒\Bj~Wс̪_O/vRԴ{ML}651z19L PCM\Ppw\UUIOK}hA$X׮]Kjj*zk:n),beddPPPPIII6{I !xٙZo_i۶-YYY̞=[WNOxxm@Zjĉ-hJ:(l:GױRNdRXB2ҥM ^ؖ=𑏢~-I;V椡/%B&\ c\铔add Ove (c=LQޜ={kpvq9Rh c朊x\_>vqXxp?8xYY$ж ={$[z"`С~I)++ nܸAtt4...89ѓBrr2xyyUKLNN111|Mii):uDo^^QQQ8;;W:B!tINNrv⧟~Q{.KKJ'BիW)++ lvPPnӹsgvޭ{Srr2|DEU ?vrr`ffٳgy7$ٳ'=PUUB!jdk`ʔ)>W|r>|O?T/*/@OM%>mY{N~ q4Kc#OB0df?yG[gϞ̛7߼y++7;v,;KKKLLL*.lkkΎJx"EmGr%LLLd;6&KZJB!Ųe_춿3kxݻ?:u* .^dgg y̮jԬc(mk7+),}ܑ^6&GL$\ݣi^5kfw:լc7 FcG,x$fU<|IIIܹ<˗/W.%%QFUV˪Uppp?!!BrssuI|"+BMPPAAA߿OOOiӦ F7L0[V/88`ϟG}TmδkN.hx/+ p5=hg#I{I/u^>Q\p RE9X_NvvWII]344D꒜ _Tnդs3z*AJKKNGmtBQsalܸK.q!add޵;vuVٸq#gΜ̙3|3|~Q+++䢈~ 5?FŗB&HmM ?\>^{!":|;$W.r%m6uŊE+nZf w<ɉ9sгgO\\\qO?4G+7n8郑|WyK.ѣG100`ʕ=-[P^^_Wv-w-nSUQgU!Dɿ'UMt;wҪU+*fԩ|E=$q}:vyR;ç>'SwUTpmݜ#Įxb&uݬyeQ(7 !$l3/ARH%r7yz#/^̻˕+Wpww,YBRRnZ?<<\;v젰Tlllt dqy̌ p%TeBݻ](—_~yr_Xb۷ogرUY~=Z}JEeT`י,3q^wLGS?;SG.cD -C \mw B"Axt^MCi5:t\1z;111K/zޘRC2zU!D}UUuuPU.]ܵ}bhhȸqPpttEQ>}:x{{KE|ڪ襕*d$^:¡1xY*Lr: aϡB޾n+!F#!wR(U*Сytg̘/n>LNj[$kС\z/\ ∆ob.18F$0Ɍ]ܦIч]mYAbg/ $!*jPB $*^q1EА0zꅡ!}5W^ĐΎ;֖rjTk85GQO/ ^ ?9oGԘ)KoǺtx?VS$@Bq IڐҝB܋m۶TfMMMϏH<+Wy饗Ԧ:Ю];8aXƆCt6Qk\q/xZ G| Y#EDMsK!{{{{5k &Lĉ}v P,< q[J4I:s3k·~lMC|z~b%B!`B!cddDffnɓ'%8B ҏ/8 :K6t$i BTW5]E^ղ}v8@aa!nnn?;MHLL*aذau_0سgOeϪݯh8vL:U`BCC)--sbnn+si~Ν;G6m|RSSuKKK9s бcGt011'OK.={<066tLqq1111\9_ @TT~~~>|~/--%** ̪CNNQQQxzzbdd׷rJI&ann˴jJ/W\!""SSS^u&NԩS9y$D۶muǙxbyv9:`nkB<(T4{T4<7F'..w}ԩS\vg}V.hpN\ơBNۦ=QOCiY$jE9gAz;-듙 7\%j nݺq!,--&88133ȑ#lRwLN ё,Xܹs____ HKK޽{eĈ_>,\;v 3gV:͛ @ѣG / /p5֭[uUX>ˋC1`*^9XB@-^WpB.\ԧO*Ȇ8wĊb:x#c䏐.1YsZi(*wcfJ$5piJKK޽{e˙1c|̜9@?(MVO6m~)WN:LPPpN8bСL87OzjZ-]tѫ?&&333|}}ҥKqeee,_sdgg_붝9s*RuDFFV8̝[c9~U$5P\\ m;w.'NЛB`ƌWOII f BwLΝٽ{ww၍ o&K.[Ҳ}YfZ8Ǔ"meee<3mۖy@B!x~bqΝ;R?DG!^YFW?5/^&jDM;Q,W)gsBG{2sl?E&waoo_vrre233144Zm7PPmѢޜ\~]n[[[vvvdffָO=[l!,,\fϞ]e5bgg@JJJ}7n ==]oArONjj*;wYf}y7 o{y7 ._ W!###FAQ: !64Zlߊ^z1f*}ٓ#GrI x-惮Um/^z% Rrؙrb7~M BA*vyݾ{q{1%%VuZ[[ӵkW<<*yWxiݺ5ݺu#??_[}夤P^^^Gf˖-KUk%BToJqq1VVV|̜9W^y:n:֭[ǜ9s_XtO<֜̒LkYӫp5uDԫ|~VKvv6999EnNw^]*ŷJII!99kkk^ĄN(ºu֖r\\\qѧOHOOo%طo899xb2111DGGsQ͛Ǵi%::8*e9qTBU $ XBCCYr%P1_ƒ_>}x{{Gqq֬YS8!Modjj P!K)Ѻ՛ǡH5qT=v Gj\iX;3NE6~CW%Bq<==|*k=1yKOzQ\]]WT?Ҷm[V^M.]4inRϲeXheee8qB3fЪUYfn ҭֿ:wݻ+/9 IDAT9pJTTQQQ899qubbb*?wgϞ7]WQI&1B!DS^vWW*ݛ H#ežxL1ݽ=;A{5R9gggZ-V-u'sդOFo·!_qppнrS\\:t}!77W&)qW/^ŦSn:| 1G Dv$_a]!#랧>cٳ'hZ]2!!_իWFl۶xF]37ڵkʁtݝnݺ' y}5铽=NҍqB!tu_%%%zVr566XH⡘ʊ~tjUu+C ;Ћ9'%j2: 8č{+ !xdsݻwH۶miӦ ӧOg… 6 '''̙CϞ=ر##G駟Ə7>}о}{y[,~z KKKz*P+W?Ү];\\\ѣnM;k.ZhA߾}kBqoآBjݹlʴ=?%ʴ` =v{iK𛲓 }Ҷ}?c֭Gv3M.uSs!IMMYf888`hߪ/^̻˕+Wpww@(m[resdppp(<<\;v젰Tlll}ϟ'!!{{{۸[z]i$ݎB!ɓ'ypv>?{{M#$D}:SČɜK1qQFoA&p( ҞfF;L|sBfJ.BGJڢE ڷo_~kkk/x{|*jTuץO+B!DCXNNNXZZFPPO4ybT |Ӂ-XV564!j~"??8Y= j&Z0݂mM!h k\A!ˢ5#Mʁo%nG6-ie!f-3jA0x\$mEy遟zdz EҊJ0DB!F`]l\=!B*d/c'ۚ66)^AzO^r5Pv ޖmMW)8W @B!4@TЭ(B!,.]$.J1vcH\|G.R^: gAoT~-$IuB!tIzw8A;wgF87)c$r1m1ԐQ m]Zn /J %I3!{7YtiI]i׮JԫwL ڷiԽ`|xKΉ:)XtDq V^e r6'CYHl\?!Djپ};777ƏOmMHLL*aذau_0سg˯Z 777 Ti)--eɍV!B4y_Qx7?Ox4v*e {,C.QcRf K,<hgƥyP.I(((`РAR";w&;;Am۶kײe233dʔ)5o(ZhvƍZ̙3r^~erss=P&FBƦo߾I DecGhfw~%F#  aä .SRm4 Kc(OBFoΜ9nIMM}.--̙3(Bǎ122ĄN<={<066tLqq1111\8(8|0_ZZJTT>>>UهHo dѢE߷vM~~>suԄnݺq!,--&88133ȑ#lRwLN ё,Xܹs___ HKK޽{eĈ_>,\;v 3gV:͛ axxxЯ_?֬YW_}+f&LYd!B4jO<ƲxBӯ2s6[4>h' /vao<"Qw>P7~|׉(TѨ>}Rw^mrf̘A@@QQQ:uaÆCtt4Ge޼yL6 ___`9qT^VK.]ꏉѣlݺ>,])S0a?^er ;;x砠 6l@YYP1_~!((q=CɷB!Xݽ=)9lecO-P9_}_:ajᗔͬY }L+JBfԩkN!Oggڙ7gCױ0Ou"ڨ0%KMjn޶84cVh\_!DԾ}{<<<ذaCe)++#==]}"%%immM׮]Y>sNGtt4>ڵkoo۶ [{ː=-[wt=4Ֆ7{UBFgŬ^/" Xd c*̟?~FիuRm۶xF Tn]<^Եa|ze틋 ӧOgРA4{ަx'&yzJeKKK"::7nʢ|:ą  t \nܸ+WHMM˵:G^^qB!hZLMM^m]2|=Zƍ%J3_`E?&Oż=Q"^M z/C1hr]bQ3A=}rͅرcټy3V;;;ѣn:9-666$$$f͚{>qӧ۷go%={oaeeEtt4/W*R;zh^x^x,YBBB˖-cÆ f͚Ϗ{bkk˼y?~DB!d6oLff&ꫯrGCҶm[ڷo/K6cCGUng _ Y!a#L>Ӥ9ء5uxW ¸q7niiiD-t&##EQ*͝zĬj],YBRRnorn}{{U*7oXw1f֭[ǸqtF˙1c|E̙3 y;Fdd$?!((3gOٳgn~#<<,--姀Bшؗz 7AuZ˪9~`}}h5:m4}Yv-~-׮]OHH 66͝;wwwRSSu PC ޤ9s='U! 8p Pڒ9=zhrssIKKcРAW[,%jlۊI3buzc6 >R/ WHU+b&D:nO 63DvmMh&7ֿ{^`JM}Vfaa#={6ź_xnkkkݶIӌ ݶ[͛7Fm9n,BghZrssٳg';;V˾}jT[UڲSY|T\ǃ5'D-hA5s-ڴh֠⣦Bc{'~5!?CDs#}A7{>A>#c3kHh?,[V)&0(('|>H:Mp}uhV9noB! Zh?^m!C( O.ĽR̮ __G7/EgųWJ\>Gk@q -lPcVP<EQZڣyyԼ8E[ p=~Cu6E[64+7AբaKT4` eR #6E^6&lΓ! ĥus$⡪OžUG6cW u">ho\n(A`ݽ" Y9Q! Jq1e@诠/{y D}H4V]QϬ-]P܋bק6WϣfG ;rJ0֮ )Uc =PQ\9B9(hٮO#CP9C|2q^(NO{a0 (fue`l);jA^ Α@BN:U([lmm)//Ņ:woG>|!BiȐ!k`Æ Ֆ[bKԫXG>&W+y |^}V3@і?,';Ji(~vyJrwI[A{FUE ejqF3忯+_B5뀺c`mz6jn ]G) #PAu4ר%W mt02A9OxPΡG yŦ4G4C-QZPq~;ĵ>G6eow嗔<:o>AY!x(%RQFQXXMtt4(Ri.Ԩ(͛7כ <<\o޽Vs!ZlӧOgϞ=,Z7nЬY3 yWXh]8VRjI6-%]?='Xw%O|;Ρ8 Brb(ܛnP;͆CN$LkZu?֦\؇1^|s;bΜ6tDBaήIC!_=ѣͫZVƖdNY0^ݚ\U$WuFH皮vA\FU_^Ỹl)31N!|!QB+OS !@O+~L.H@B<0`B!>r\dΛml BFJK!)K̿ V!D53|M!⁐DU: !B4UkIؙJ0hL8č.H0B<!B<011@j])$=I!D#0ՂoNg91)!}jپ};777ƏOmMHLL Vx ɉ={ܱUpsscРAm߾R&OLYYRZZJΝ ܼL$#XB;{, Q^pm\!D#ߑ}lXWAA ⥗^sdgg3h m`۽vZlBff&L2QF UVͮ]ظq]˟?9sT^^^/Lnn.Ӈ D.]غu+;v̙3 &uzAjb !xTӮ]; ҩ"edIWV3Ofe;WBs!55llltϟOjjsii)gΜAQ:v숑n_VV&&&pI<<'FFFz}N`` -"&&___ݻwO@@sʕ+DDD`jZ3_gĉL:'O6u`mӦ|5!999rMEGB᫘K__'ڙK0hd^iK>mٕ}q1,\'׮]cڵ,_\/ `nn{L8 ʸ~:[n%Nn8tDGG?LDDqZl;SNHDD ,`ܹuꋯ/c޽2b֯__e.\Ȏ;?̙3+c̈́zj<<<ׯk֬᫯ҕYf &LАuֱ|r]r*fСC 02EB!æ\t2`ш=lN,yܑn84#IpӔҽ{j˔3c ԩS 6@cbbѣ̛7iӦKtt4qqqWwxx8'N 44>CԗիWjҥ^111=z[VۇK2e&LǫLdggĆ (++*W/qJKKѣGz<==iݺ5 >B!ؑ[6طj& xӚN}:^a"""rضm!VĤ2N/*r í#CECD*% &MbŊR4hЀ-NUhnnn~4iw'0zh~6mġC5j%7櫯*믿`0rC4evɺu,c'uFN8k{yqmClKw&~i9 T;g}ٳ-3w\VZEƍi۶-ӧOd2QXXȴiڵle}gI~N8XlQW}X~=U.]ШQ#FIϞ=iԨl,Y˗[ƫݵkSLaĉWܽVՊ;w.f'$&&Mpqۇ;ׯٙqY+CQ~$%%ѺukaggGNNWѣӦMF >|:u~zC=JQ"""W֭~j?Μ99}4<""""rsٜΘz4uuR0Dnqk;zO8~7V@DիKk2iҤNep!V^ͬY=W^y~j!CgL8jժΤIx7nse/_N`` m۶I&DFFZ۶m?g_bժUKW*߱c3fg!$$t&L`skhg5K.K@р}!??{{2ˍF#:v&L`L0ƍGjj*[ƀGƄ-~-fdd|rrss-Ov޽;,ee<֟H:Nq`T~5Xzܽ_cdz Tʕ&]2Ot-9::Ҽy1^c`FtMn#99d̜98//[[[lmmXnlڴiL&L&,ʕ+_>_iDDϷײGFFZ%Dcbbhܸ15kִ$W/""""ri>@T1tcbL4_N iQ#"7nݺ0cVuW` '44@},gdd`ڵ6m`ccs$BBB;wnmر'''ѣ͚5… \tr?wiiia f"))_!G>|K.)w1)e˻!RSMyZ>v^V㲊ȍi jWdztR… x"Ʉc2~)O>$6l.z0L鉓F9s搕EӦM ' K(~dd$VR[X{{{ah4z}vPGMBٴ[rR.+bKB"""֭ :E3ңG,X~Jbb"&M]vI-st֍[Ndɒ%ݛe˖`4bOT9AP4A׮]СLJg2sLGyxxhha{R: nDzxפwM$1rs lm/ogGGDD\U.?:t`ذa$%%QhY7x_|SN\\\b9sOOO-ƍWl*Rj4oIzz:ԯ_GG+oL0-[I˖-yҥ#wj@5y;lahV4ƿV5FDD,l=CmmmiРU8pCO`v]zΜ9S]4rSU~Y՗7&fwZ H."""rj۶-&|y?\IIIQ@F1 ۸ w7y3ew^_TV*L Vi9(pZjԮ]@߾}OXlYiٲ%-ZP@?EgrW0D4žwO]<]l{Q.\ȢE*ݸ8*Ǐo9)[ix7XbE/[4X^|E֬YSIIIV7_||<Ǐoy'+{wkV=/?}Xhn;h }6lX?ǧm322HLL$ c,>7|ƍWȑ#yKwxr1kd wN/Ϣmy<ǚ㑦-;˟2  .`ޖK_ͥ~;;<PΎNc:*n5ngCRfqyٹnS~t^5{l a9~H4rveMMu;'ϹGRY:aԪ>:'4?qoHRV>ˣR8q)Я6?LO^C_D䚳SDDDfm6 U[ntqqO/--㙦WzJKKZZZfeeqJGQ9Ffs8*4z| U޽RGVVVرRm t͛7WmAA6mTB + 6Tu*6>> Jo,99RuqJ%:׭[GAAAwÆ nqF+Wv[l!//Rm®ϳ;4lMLghm>b~B?r zBk939Mq7_t$h"DtZ.xx^H3if{ӺfD6 ȥ}xj6gӂj^ X)6əq@@MGL_d9hRűcok˼PΝV8G_~Ŗ=j6Я6)~oD֡Ժuݻ)εHgK-yl ∃6ƧUT s )"ct,;wLJ_m 6CE<|}DDDKNNzl!\+dK3Az^!lǃ10-g8m lJH ';uen|k z.D^aC|#޽ :֭F%!Bt I+o_<F߆sqg\GRh2qO-0qΤt|1U 'pqT>òO8BIk߻& e˖qtB^^k׮Ga|TV,Y¡CXn5k^/III30jԨпoODDD_EqyժUc…;p;E뺝1:w'gdGhF- i`ǽ iD2n{BecEfؗH'xU}fSA̸ wρ~Y՗oS86tFSߝdw\+$#+]=Y՗BώgmE 8GL|N~ jVg;[^aϹL2 1&\#3r#8ېOdj65B:NEVR^!'r#95k^.aVЖ\;xL-_t Pf'|K= .DKlzX%''SV-; @vv6@8ׯo(((h4V-@ƍIHH׷`'2o7//sUhҪ[s.]P)&ݻcgW0++l֭[~ٳĶfiiiL&jժU )Yjj*ԨQò_{Ξ=K͚51L5 '' ?gϞw%V$))ロ3gY}e888X7l[[r&hun⥗^b%79sԻSyTKJJ ^YdffR^=NT?~<'Nԗ'AAAL6g}sıc0`ԫWcǎ_Я_?fΜ?}鎌dرO|V5QڹP7_U湻dYhyߟKW?sΗZ)+"w;{/@'K\n֯_?5kfՃѣlْsөS'ce짟~bܸqPzuy 裏J7<2k,4h`JPvЁ{{ (Jh5Dd"88֭['`ccCaa!8;;ӪU+ ٳxꩧ?ٻw/j{WeΝe^]0W B֭[sfJ|+Ͷ3n"y,_1&u*5 6sҥ21k,&OHJN4_L& A,tA9}=_VrKEvv6ڵٳgsA|||oooBCC9z(iii111ٳ2-jرcDDDfK/oI^.**BK3f̘\Y9UVss ` 2d&"""""uM:u ///N:Yd IDAT0c3p@ԩs슍EfYj|k/o"s̟?ZW^WDDDDD"l/^L`` 5Ȓ%Kذa_ǎKl/BXXo&L(6M5ʲ<>{llcSfwn___ +V֠A HLL,;y򤥬2˳KDDDeNXb BCCk,!!AA֭[rڶm[ R9ϯ]v)8%;vlϻjƍz?Y5?? RSSٳgcƌaժU@QW^|lT^`(bUsa0޽;{Ǫ@Æ qpp`Νz!-[,6 |ر#Wvmי`>=V_]ϩO>{{{ {/ ,`ʔ)Vg- PDY?OOOhd޽R/$;;5kF:u4iRN^xڷoOPP 0m4~Wn+s?'O̺uprr*u˗;r ˗/?ÃҥKK\OyWtEDDt^^^tj&e_~`$N2{8pxJiʔ)DEEQvmXr%k׮fΝ$%%ѪU*+V0|ڴi]wu,=0۶mKll,}111ӿ*Z\|9GZO1j(nʴi,w}U6F_V֭ 9sXx1<&vUy'%22<}Y6l9s֭& ggg~iN8Er&cnذ\<== >>SvmK… yw2e ckkkU޺ukN:ɓ'ŅW^yRf:uDDDDٰaC6oŋINNaÆ 7oΡCHJJ`0ۻR+yB0:L&-駟ZЬY3yxd~mFeˋ$V\Iaa!.]Ftԩ苷G!**&MTX= 2oZjƉ'pssLb;x`ׯOrr2'۷׉'xG-_loݺuc۶m|^U1 ,Xgyƪlʔ)V1?~< .䭷޲iYL0+WbccCNNU )s駟fر^ADl:;;ӬY3jYhڴi䪙\tuu%00В\g&*)J~w m)bf̘MBjVV-TmΤnݺEcO>]Zw*U.V* 0rHfΜ `5y1cT^s`oooY6h ^z*wyĄ 0 L4 X]ݕ%u ݾ}{Zjey/ڳgNΝ޾}>EDF!ٳ`0PN+K8:qͷx!]]]\<.OJlٲ(J `pPf*{2󄓓`7'X/O$V%*|WV3' dufC{Nj/H:uVcJW%]vqf̘s}|}}'"RJMyL:be<%f+gN< Ym۶g2zh-12رcoU6N{$X ܹebUdddݻy7K*<… ,Us*,,m۶a2hڴ)P4Ixx8|)))Ug>lmm-@ڒ[o8ܴ["##ݻ7ׯ\4~'Y|UK*,2s/f͚UaʜX qh4oEDD iNUuЁ&MsѫW/;kYnYnggGUgd2YΫ{4Μ9@PPeٿ/K2ZDD*O ViZ5koѯ_b `׮]ذf*M0Ÿ?\eRN&1+z矯yRW;;;˘G{M:J'**-[Xۺի@RReyzz:Æ ӛg02d`݃۷* d,.::ڲ9z95)"""rzGHKK^#>>Xӧy1חߊl O?,3м|LȪqi&s=gIJl޼Rל@۷oŋ-Cя#P4F9sygʕ@L'׮]&ӧOX&|lbɒ%ԭ[2`94h`3'GQbe!^[n`I>c)q/"R>JM{ח3gҰab\h"iҤVN __~$CBBhӦ ٴo2լYd8y$ϟO>Ӈ_ p2`6mj0$P4w޽{qrrbΜ9̙3RgĈ|g8::l2DDʡ)z $66ŋX3n8F# , --;vXo?ȠAӧOϏgyj٥K,c?O?aƍԬY{J~cܸq͸q=z|FLL *3fЋ汎hOOO6oLhh(&M6j;Օ!Co[Ȗ-[ O?geU\Zh-Zgر`㏙?>'Nd޼yz!Ξz1KD˭#,,ݻ+ReѹsfJ|+Ͷ3n"y,_1&uKUUϞ={ۛ ڴiHth|@K?]Pb`{q|f4դ2ڵk `$%XEDDDDDDDDD* _` ///:wLÆ ٲe .]At26lCՙ 7GvZ?Nݺuyx[Cd 8*]˖-c͚5$%%'|?>(999?'|5kҦM.]ij>k)o߾=: ́#%%N:bŊRٳ:ФIF{wӔܨ$W=z`޼yᄄ0i$>CΞ=3yyybƍXF=5j 77s;.777(,,СCѲeKu?"&&wwwZj;X_gذa̟? 0~xz)Uv×ܨAAAL6%K ]wiѢ/;v`ٓ3fp=LJJ aaay睖u 6$"";wrc0m?//HVV_0`_}{_~6lȎ;8v͛7楗^qlذAg#.Ox{{WbBl- Dzz:wEDDְ{n"""_'Ok>>>ԭ[W\y.]#22;]vqaԩ@vz>;̚5nݺ@tt4ҪU+BCCi޼9ٳkڵ9r$C o߾t҅~Ѻus9rxѸӥKL&FbذaL>~QFCu&?[{ذa%'''k5&3:u/[SO=ŁXs|4jj/ӧݻ76mRPEDD`s=WnN<{3ƒ\w,XYfQPPpqq}Jtt4SL| ϸ2de̙3ٱc?Ʋk.z9x >>>paE)((ݝW_}:枭ɉ\DDDn d2Yu3f ֭cŴj (KϏܪz^~Ky̞=MI`5>,3p@8p uٙdKyHHԫW.]p]w1a.]ݻ܇M6ѿVZň#JrJ͛n0k,:tU#GOhh(%suu 55jyJJ 7|Z-?.YIJ|رڵΝ;c4Yx1O 5tPZm+4iD&X/^L``=b/ŋqqqܹsDGG[ꄄGQn]z>>>xxxPݻ7sNx ֮]k /F%KFqFQF͛UVu]]]at rrrnr4jԈǏX֡CC۶m_ٰa1tY OFFٳ1cưj*Ra4 **O>ĪNǎdBBBxw… [Vagbcci߾} <?]ZҫW/y2330Llٲ \k&cDzcV\h\pRgٲeǏ< .$55ȬYر'Ǎ^."""UG6m4iO<@xx8?<G}R3&5's.]`!dڡC ZjE-Jhk֭8::Zo̘1VumVΜ9sY?OOOhd޽ӧ6>>> oߞ í888ХKjԨA˖-kFFz*uݶ_ Nݺu9r$3g,q~gΟ?--_~Ivv64k֌:u0i$  s|Ҽyspss]}v֭[gyf͚퍛/iEDDj0aSNM-7oP4̘Y@@Y+WZDh۶m9s& b֭c(IOw^>v @dd${$nSRR {ٓ<Νk#vҥ{k׾eN0wW-.11L4ib5\P~ѹsfJ|+Ͷ3n"y,_1&uNZ~VȵhUj2JP컀yٷ~ab\gL:XѣG[o޽;۶mjWZ5rssqqq!-- (k2%..ooo6mʉ'Jܯ;wZǼ`0`4-/?CI׉><Xs{6_W͍M^*DU'Wi֬-\ˋ7C.~_zubbb2e ժU+|$aaa6枥tbӧEw/",\+VX}@"""7w@DDDDDn$ ]v~8uvԯFϞ=pUeJJ O?|KZ5}I {>C_ ?ubH޿sQyqDDc͚&gzU'Y+jԨczᇟYzyU IDATv/ujժF6mГ'׌zH]T)0{J5ɒ1ݷ63{w 9w< ,_={%::eaDϞ=KVfu}a[stRH̞O>5U0ob>䩯t*G<39Kd~۵-sgϞ#::gH_^ zPVioji@ޚ)/&??h0h⏝]ŋqc?-˯vǏ <<~}X-nϫ db}?ҋΝV888PXXȹs_ )T^|"#퍗>'; 8tҐ֘NwVEYTW2uG@ eȌW.yX\pcf@p0 dyB󐐤sEƐ‹k~ɋ>uN?Jsϩ /_LZ4kMttOu[RRpx---2v{8~~~ӋpQuS:IKfɧ3UW%a̙=SO %00ӧSq<n7k֮ .^F 4mڴg1r4/cKs|} 55 EvmX,j &XEDDDDqտf)&a[lXڱn3Φg'gSOt{gvm5c2 )V˖.w@ńkX!z&.]:s𗄆ƌS> #G2vDZlAqQ1ݻ>ڪ5DD88y*I x6~t񖕹F3`D_ٻ_"Rg5M"GX{lx1iǏGLLӃ-\n<fې0q ^^ČS ﯭoO๱0JzF&˗-o>j$&XEDDDD^ͥ\rs}0 ^:!4)ѹ4mY3r0 k2[zYG%labuN䯻wФIӦ`ďńxT{];]qV#ÿ$**xW0|3t믾LeJwԑ[QH*((z5Z9GSZR? ?пL&.ZJko*ؘ\.3h߾O}u}d"i, IO8)Ig Rc"""""R/& /?o=vΝ?ٳď=lhNJKLX4;fn֭$=#Ac}~C&MճEEE呑yާIM&F)`ҡC{>Oץ3|+W&9yVkHRn42 [p\f޶???:ہ˗7>?AC#a u^OgII}u}{VVǎw>өDEERZZƙ3g=*"""""Ҿ];䀘<Ęq <{xx1N@n^^vrL?rsNbe2sgߞ w cX*R~*fn#//x zeWr_ץs Í٬oDaYC*r:T:t: ZkM ~)s;v{v֬=t`8w}G 9윊NvVO}iu}{nn.~~~߸R !*"""""76m0 ˅EDD`c~*63eDEF_k>FۗX-\+ᠸNnk.'de)^0G~IVv #*2R YDBTT$RRΞM{:5^Y)'bXH;sخtGZZݞ}gjݚf7=NEEEvYeyS_ ԉÏ>f6mr~ԩ#kn`W#.6~KɓU)..իfwѣϱm{7~qE^.quעEs:vu6z^\TG 9O^ɢ Xrөi? bccԸE(,,իRXX7-[ n+&[lSuW4"?sDDT~w'N2}lܹ3dgh)׮]p P#iD%21!ʕ+Wlڸ\\ĊW0i pӬY4Wee 26Q\\\[u6L&6}aZ >ǚ0ѣW~x_ٟ=9rssyilMMa-Ə{I^`wX,g_֛oaHf #44?Gڙ3E? i:C$%XvX|(;C$#3yxn-.];ӡ}VX޳/DGGs;j$ml?O$Oy'>iDڴߧx__fy7`Mn^&LW]˜8)6u.X …y7~{;[k+w9 I;""""""""""""7m N~ֽ{wNy/<\1 %nج638s>="ڷmˏK NMu@E??%x.Y%"""""""""""׵~~Ёsg؜IȈ #0 Lh$''G""""""""""""7 \ܐvV9?_8v4aoիWrg3sCԈ&R'z 0",$#HN:jEDDDDDDDDDD_;32Ygm'O`XYקkug$#7nhX.*z V V#{]k{0kEDDDDP9f399fLNN8;;A$"""""%pfȱl[Cexsˬ$ΞfͳlV,))`6aVQ)voǜ `rlzjԮg%ëC=TgYoN:9;_{HKM³LY] ٵx[t8de1BǼvQf%¼8~)EyV܉ =1m8 s9N /iKeZOJfy\~73DЩC K+r*.Wh4(OxPyxzpIrr,iHi<@Fz*Tb@pڳXjkRh^vVѪI}6lE )SԤ$%Һy#6lM*8X6B0$5=w;39|0|ц``5h&uk0xyc6a3ٰmdŻ+?LS @z;N[Feq29apFe3C23Ұf[*,Ӡv-1dw5CDDDDDnNK~gn=cYz|bNƸҪ^ujTi8ɏm"F=c;0,n-;M_oΎZ %{=m>N=mq "'N[};e#ֽ WW`ՏQv#FS}n=רɉcge<{X-V F#lF#ir+tMO%mANNdQڷnB:wB,_3js:} V:ߍ+-'j-]h""""rKM>GViQ>v99ʔ-Wd9KoN{>vSFB 갭)3\3CM&\]18H1v||p6:$za݅fwѴN9$'0B%7ni՜5+OP1D)lR X3,N%مhzB3OJ-Ӯ Ma{#5<EDDDDfBfR"SFhP==4(ɣ0ͩ9x\X0gptx^99ǟ F<}L}cUBs,:aoNū<9V9ւ&5= f\r ٮ`2 l{d)NabĴ#cgĉ Z8-LQ S ii)I4iɫşNI:$'""""r3z'o9>;/*&ǟl6R֫ LMMș~6,_`+/ѾmK4WKnjD~/,nBM8b4mXVq &/ cܶfwCzF5R>''gA! Ԭ^ѓe]H[iլ)mgQ4w+;,u^S<=R7DDDDwT,S_D@ER%$/?ǐ1p,밝KZj'>yxaZ*i3)x-sY;V BFV}, xIzF&jl6d qߛh_` 29NNVe /8rd>cI)i'e}>c ORJYXOHo9+Vh2r9,yssj(2S~}=in&=}8~"e>\p RS llLldw#mz?Q`8zG͢?`no݌Wq_6nޘGyuT223YSL&}*bb1SRedcY)mSX[֋}7NKFRJʅ\n[I)yꧦ3Xr^v$ @Y??_̷uw Y)|2 B8h 4(O~$fëX甧Pqɮ[F>V7lجdgCl,<  g'+ٜZ/ܛbۗ}IuhӼ/eKJNaG_[`]/f/mԯSuk.u xQJm7֝{IJN!r%ArJ*73v#9% BC8p8ʕ*ҮM /[gᲙw%߲c~2 b`89ę>jU ٶs/iiTs}{p,y4ggS!\fOvbf8hjħP-,Ȩh&L{a!|2u4!''" ohBUi)jٹe dy99VxIebf4Qapus'-3OcȳG릹ku'?MńD &'N'V`*4/'LS}{ ~m#F.,%E˦ 8ppwwcˎ= 7O۬Vl &' ufjXMLZl x\,9d]嘳(8 ;.e2}R-%$fz( 1~@a378;ʭ(c`T0DDDDDf2^q]l5Q)_I)8mK&S ѨADDDDzqqŭueɘo5Jū IWwO lL "w. efQ@e DDDDDDDDDDDD}kNfW023+8kdDDDDDDDDDDD亗mƜ;5bbrZ&28L\7V9 Yed,HJ`5 Uh*7 9i0)` |oGDK,. &J87qSZ ○ \G)""""""""""""74CDDDDDDDDDDD䆦` !"""""""""""rCsȥGTT 4O>ԫWȺ~-k֬!&&+Wj0EDDDD䚠`Mѣ|W֮] ԩS0t҅I&qزeUDDDDD)2Yk2,z)[mϓ˯n̙3dddY)7|C˖-VZXV.]J50L̘1s?^:O $""B,"""""ׄkjfȚٳԫ[ >+խ[c08s,no+ֵ3usK\'~]y""""ڵUaZ8p`ϟ@5[&aDDDSسw-ٜCTTPrO)99RRRHHLN%!12ePJΕl.k0,v/lڼiҸm۶~гgwX,]m۶c6YݺvlY>"<БWUZlݺu+&ɉb0pvvfڵ|8N`53ZFO!F>///, L0jUpbbccY~gU+#^fcٷ?U8D9O{97Ϗ?DG&$$7~\ @BBiIRRRDֵ3Z>sիWǎHZZ^""""Wi|'89e6l/]vL0h΢EGXhHr'Nu<^=ՃÇ# IU %,ĉX<==2e v6cZ$]زuu)Ӹ;o=ot#GƐù8t0ls׿3is[{ɽݾc'tZR^,_gB wٯaqp[n{yFFwcǸ :oM>я1o:1qmߑ?#^ɣ}`ƇY=ܓII[+]ȳ|C펻HMMjA~/>@DDDnx}Qy{-Q[AAA9rwy2w֠$&OAk5S-[л#{Sb% ٳg1L}@*p*VWoMK\|}}yf@?ڷ93gr1ϟ_eܹD۶iҸ֖Z5k)g>VX'#^I^=`˯1!~c,Gd4kڄSDĞY6nZlܸ- b$ߑA/nkGصk7߭^n'9A/2!_0l :vbMn swR/׳ezRSSn """7{ PV+jsРA3r|yРuƲe˸iԨDDDDDIoëXh giq'OC͛5m´'f _O"=tʚ;w.111lٲYf{S&1w(_Α#GT_{d?'eM$%%O?ş6aæ 9_XŅua᢯V>ۛf5)SF"""rC{ =zUk/K?wglٲa ˳7_ h/0$%%內}.]2qYV}iѼlٺJw@DDDnh>󆆆^uSL_}8pADDDD GcѩX-V+3v߿xݻ'OeoU=4G 2>}!_ݽT/pq ƍYpUٺUK8qDeX,$$$Pbn$(/,)ժe /XL9Zj/+@XX7aajj4;}շmlќ2eʰv/<}8;;jeqIIocbN믿s& gr<:^&88-d7=OmڴMVf,\̐a#yC[мl^+WYf@u LxӽOf8,4_|ʙ3g0 yfDԭSysȓz7J8E9J*^ GBCCYz5ӦMյDuϟ?E_p-+qԫWAԩSf|7Gcxiڤ=8Ұa22fJ,ˤe|l:{G.co#00-3~[L<wwwl67oi&LEOV2LXVbcQ#ǣYk{WO^yu鱱qd3ujf !k֭[ [n͛7c4mڔG}yӢ pY|åDDDDD5N7I/_eF&Çhw?łjeiӺU ޞKҢmX,Vyi24n܈QF8Z/fӲ{sNoMʸ puq%5-?w3n];3󣏩Q#ujɛ6-Fz-oÿR%N9M`` ,]DqVn SO= '';w)wB-)W=ԩxwwwHHH#;ܰ {xWJ8s III`=J.]4""""r]17igѴ= Z`*lM98۶H_TQ;&` ~e233?30L%{Bb" U(qlƒm6d_9 ]Ϟ=KRr2!!(IOOUv|4m$Oj%If3+h○ɧ_*y~UDDD_,ӺuR9?N~np\KkDDDD?uw/[1f\7%VU†]u;TZ[?7ldٲTV5_ h4tٲZ""""72шj-4M6%#dԨQio ~}?zO!:[+;U!"""J۷oTܴiSEGG1ڵk9zڇ:oVjm/_ӧOkf͚";vÇpץKlTT?s^s9rDo"""rC!= %ȑ#IJJd2AժUXlذʕ+vo̚5 8seر3f8[nJ*^שSƲeسgOeZl__HFŪUHOO/܋/H~[n޷o_x{{w>"ۈc̙L2kJ* {f͚6mD*"""״ 2Y"""""7x'ݻֿ%KPbEBCC8p`@ȥ~Zn]@@ǎرc366nݺѰaBy<<<1{UVkDdddgܔWW|i[ls z/rM߿?/. 4P 4jZ` r֭#44؁ljժUY7n`0xR-o*"""%CDDDDDn-T `0? ݻw'11:}CW|?;.Z -['W^[{n֬YC m'##+aΝ[ۛEf#++'N`ۊ%</5af͚UgΜxժU%Ñ_~iӦqԩ-SL3DDDDw^^^W~|5TӦM\\\`~|6.LLLqΝ6mUVW=<==iܸ=b4Y~}MLL u%))MDDDR؞!@m.Q0DDDDn+qR &M*>Ś2b&OLq7.իWϷTI~Ǚ3gN{)dddIyՏ3fU\j!+K9vX=P7oΖ-[,0W3f0pJ ӧs-y߷o_aÆb̀+rcǎxСC'6P={P^+?ydڴiS}رceΝ[d >(2XEBCC =JfG\\\4""""P0 8-7ADDDfӧOCNXjU7oޜ+VЩSk*Tӧ]~Ȑ!D ѺunZ9GGx """"""Zråy衇fΥ.dqLL.BȵTg] n" yfuul6:ẘ+JT}=vˮ]y7?Ů]:՚wsΓEjZvԩ|HOOg}<j#!11O;VÇ#ؿ/222?q";wq8": 0~xy6Aҥ -'""""׭7xH<<<]gƌDo޼Xdggk}6ͺDDDDDJ?z@@eF#ΝM4v@ll>Lez0xpnwۛ#3t;wQo@FFcoYjDG0&}}GBMZm~c,JX瓒(io]9Ξ=~ &L`O9s&={E4k֬0k]jHKKm۶O{O.8RRLjj*,Y ...ԯ_Ϟ߯Tj7Yp1~^C|xxxo3qt~6x6dl6&L奄s&󈍍e-|rnn_9lْ{_|J*X_~xzzAYdIeC|}}ܹr'OAJgH)eXŽ=Dn=Xx oM_{_ l߾,cyX,}OoҸ9sOg wbIFDDDIѣxb%K9q"^W}۷e˖72> '"""".]#mTP1~l(ܜ9sVRмcǎ)@i7ᮬg]6[1s֧X,{+·3?&%%OOOIIMFٲeERr2nnn}JHh40g|f}?ڵojQϏ&O`=}?|_Z*=i$>Sݔ5e,]3g#_O#Gj^u6l{믿)lFF}Xz :=@\I6n߭8>ظb_={>=&D|+#噍rfMЬiV\qhѼY6,H&Mx=zk1xyJjժQn]AjծɱXE9~֯-ZkO)&?xOOz90s0LX6ODl,+W}[+Ѩa}CS?_ɓ߸QCޟ1L w;waZ?e8;;Qf V+Tw„ ,^Aŋ#>>R'|ܰuLff[CJ٣;~`Aqٳ==44a3g2h 3H[oYf4iD//Rٰa_/Yw>wrww'4$@eJ=?OJJ.]QFE-h#kV` L7שSRW-0|G弊pU^<ݱc""""r2^o "14߭cQyu0?M:ưai6m_~DDDD_/e˖z(ő\`@ͥ4 7ݺucy_r؆juW܇~St[.5jԸ222ȑ#GJT~̙zc]w^ǽaiݺEBԬY3_ɓ'8qb ~:Qԏ MrQll,*T>UZe^NG-\HHM6uֆ /wuWf͚5E-4Ni/v _!_~)v;qqq:tHo,""""!@DDDD3rB*h6nXh~AK??ԩS{{{[n9s~b)RKgܹl722իk?> ڵki]v- G3G믿^zyO?tڈ(r+&&FoF""""CDDDDDnp*wWMM&?pGa'i߾}w.VEYl6swc27nslݺHLJ~H@@~}vMҡCbwĉ y'X|9_5}ժU`0SjU.]Z/ PR%Ə_h/ǒ ӥ㥕ڬ~ʔ)ԨQX/rss+4/55YԒu-++Ko"""rP0DDDDDרQB&NHƍ9qD6l{)4їWby.߽{w=/}E~}i_}UZVF?N͚5i֬ԭ[^x'OhV֮ͥ]peff_ҥKy{?(v3fp_^</^ @nPrʵ;̏`0ЩS'lɓ;0 1^>s֓O>IZ0aǏgŊoJ5WTpez놓DAFٲeK;v 88֭[{Ѹqcܹ=zQh_ޅqwwg…lٲ@@I}ghѢs՛_nڵ|fݻ`f[brK~"""s;, VUVjժB{œO>YbԨQK^gvNdp] IDATlll/hgΜYe.*jo5kУGɊuAȵE'M4r7^ر#Zl6c6Yv-+3U?v>tvb6IJJb޼y֛4i/>/ --Taz%Ȟ={;&cǎ\sOA˯ÇөS'+Vjժ"gY@>%SL_s駟prrrԗ#ӦMcȐ!.o48p ~{cǎOy=5k֌%KвwqQU;*₊inᚹ[}5e.e.jf_,o̴,s/Tfj.)a/ 0@Fay=yx眹w|*2kΜ9\9Q^{-yu.\'x" o:uX˷Aw -۷mֳt"0P d0奈,Kʕ+k߾}6= .dxç~ohѢwŊˑy0F*KmUVed&˧4a͞=[[neH۞>}Z>>>6o4tL_}]m6U'ԦMR$QQQ۷oW~2f,3˗ה)S /HJ, nnn*W̙=z|JgH-$BB rrt5Ӻu%cZ=GV7N]tQc{۶mi2?qL&͘1C&LլY3Gcz裏̙3V޽{UFl?u~Kvmq'Kv!uwN5c[.K7dM>=DZRp m&j"D._ll2k׮)>>޼htt]/{gɐd۷m&!]%ԩS[oY }i˖-_JRٲeբE nZљ)` Iٿ^iӦlٲ:xF͛z6AUǎSXXN8 }7۷4ib"Pٳ ٳgu!***J*UR~sܹSׯ_… uaU'OαOnZzw^͝;WݺuSxx}]{S۶moK.qgһ3d L&}3H[!P08P P g` r$?k Fխ[GO#c=S[mInd䴷~[ڵS3>NNꫯSҥ-I҈#q_~Y7nPPPJLg„ z'ԿY "[߹sG?Vύi`+ڷo6nEO>E'NG:+2$Szzվc7m߾\;z^zg=0}\9FO_ݦOPkEo%3gѣGc}SK.$EEEiѢEA%J$%*RޕRɒ%#wwwuEV4Ok֩}$%Ԧu+9rTGWe)44_~}S sRŊڵ{~X_̝x $9;;}|;wbvmwr:w$?ܹs5{\=xwܑ$J'&JRtt4g9, 4r)o>7o{1ܽkekΐ{w<\xQ+W+WbŊ'Kƿ7={P\l:u It4g<>7n+_>=f._SNUt)ڵO nTxxʕ+-s$ ,رc5|p:uJ&Msʕ+KΜ9UZl3xd(2Kx aesӌ34}tamذb]˖-{n0te+RFuUu֫y$nRԪe (QB7oզ_GUX1I{'~x;wmۮ=Ku9sUղVZ~٢̱_mݺUgΜѣ{n-_<j֬Km۶ۖ-[&N:qw~-bucz?8eI_&T=e0t_9:UTW^Zx>xH˗-2QZl}→ŋd2i}zrt|4/GGG%&&…SWgΜ?3QTTyzZ~>#OUV4h ٣I&) |͗G}4Gy&<.KŜdȣv1>^P;C..q[}4/U>g>oکRŊvT?5SxyUgoRK٣ >`Q}G⬶mZL29PGGGM81`~d45qDUnK/7|3Vݺu9P2)':q.\8QUC`Tz5=f*hޗsKT\9*a޾nTm~a^QjUyGIllnߎSr4ٳ'պj:} $qʩ C Z5}ܾlٲ*[l~ߵ[VZjꡇA>>>EC_6b,YRKi'@A2V!s>@A@D/$8p@/|AyzzQNNNj҉'4eSL'OھeO8_]M4Q"///K+Vzn޽9rj׮-777)SF 4иqlofמk׮ѣհaCUPAŊS%Tvmu]BBB2'$$DԾ}{UXQ*]|}}5`-\PqqqV{zVBʷyS:j}-6mC6Q|`,NQ-fQ:z8UZ I1k ɵI9uMxM8Q|-988(!!!m$)11Q'O,ј>+VLO.܊>曊MMǎzjyxxd ?~Ν> M0A}ŗշ\ڹsFi#~WM6M۷oϴ.]~8iKA<R辭"//$m/>4ŮmL& ~!01cN>Kھɓ'ϴ֭[5tPZ*zO?VXٳs~w1bDIktϟWNe˖t"ٹ.*aaD2_ aw  ϑŽ/q;whBʕWֶ={ 4믿:|~nݪw}WG$-[LZses˽DHN4n8lRʕӭ[sN:p$iڱcG_ϝ;"g[rt5mݺU9YcDH5bG 6Tҥ/ȑ#ߵv ;u~UVZJ,۷o+44Tׯg}pF=S:y򤜝Ӽ>ʝRE<,&+sjgk߾d/`0YM=dš$iҤI`k۷o[=zhʕrqqIU7&&F{֦M$IK#9kɒ{O'ONnttZhCIFy楪wy{{+<<ܪW?=tQIRڵuf)?^zֻt:tcǎI.\g0Y۷m.Ak׾3gDz!?ڢE ͘1#,Ytʕx4$WWW-[Lו+WtM-]T#G}-zJ7"Innnz74`IҞ={Ҭb s"Ě-YDWXXX_ڵk͉777_^urWre}ڵ$N7bvF&CNQ:~E:8i@jcǎִٺu/Śڵkg.?>:Mq+SƌiӦe5#GV"Vm۶5rߢvFRԓ (7(dִ 6ufU>K?3W=4o<:*T0ݭpnݺH2d׮]r߾}s,6!!!{n=zT7n۷=^c]ˆ Գaȱ6avF*Uʕ6)жsKXxV=.]::NN_&&&Yʕ+6-sz/P[<@}ƌ%KؔK/QE<,Hd-ɍ'A6nvɤsku떹\D -Ydsr󻔯;e<[vDFF+>>^]vݻmnw@q| 0 *YQnk^.qsEE&`\~ p`O)P}ۺŲ n}ao ;wE"K./*::Z 2L2L)y 'cNU\\:I:v4DFPLlOHRt*T͛7%Iϴͱc,Eq{衇2m#]R%K>0.]j.OoF͚5_m>6j\4i:$yX1:P@Kd5qPd ڵk~IҡCSOef7n\>cƌѯ+WJ< Ǐק~#ݮ];}=zٳgk63qD-^X7nPbb >Lׯ%I7oVÆ 3=9 6  8`+6HObki`вe4jԨ Ə?8GgզM>+fzܧNj! RN8 ݱcO?lٲ T^T|yEGG3&d2e+a0K[5kF _~љ3gtM.]Z5jP.]4|pժU/RÆ 믿ҥKrvvڷo!Ce˖:tБ#G?jڳgtm/^\*URzԺuk;>Zn͙3G֭ShhTlYUZU]vUn]Q6lЂ rJrZKT˷zvTNN`Çٳg?}t=3Vk.! ;y}b eYj7rL3FtY $C ?fΜi~Μ9ڹsy_UT!` N:̙36Yr͛i;J|u=$Crom۶ԦUV={ҭ3b5mڔ(pU&ɤ]vRJ>|~w=V'hܸqA9s=jZ;vy}giٳF#FhRVt%IIC[GeʔQժUg@@@*$Crɜ9st)-]4Kg̘6m_PUVMժU# C/^sI͝;Wgr͛7WϞ=5uT @6pgHY`ƎÇԩS4iᆱFiĉ@VLj޼yjܸΞ=e˖ʕ+c=p <jCnݪ[!!!ںu>֭gyFSL IDAT! ۷OM4a~M%KTk̙={jȐ!2 *YV\Ip)!9zZ~L"sڴi_JXӦM3|t^Z۷۷3z'5vX a9:Ǝ[n\ĉշo_̙3G?0@H36l-}2LzW٣#F0ҥK5k֬T >L&ǚ5k4Ν;չsg4 &`g}6պƍ+111;z%Ѩ^{Meر@ !pyR>}bcc-ֵnZ1cF)Iz &R!קZ[~޼y }?Irٳb駟&( Xrlz ޽[^}UU\95kfnVZ8D2`WGInƌYo(oo, 驿ϕ+WRe  2D&IժUӄ ԳgOI?ZjM6l e˖S ꪪU *|bڵ͏{ZU???999iѢE`QQQN:;'d5jԐ$F=쳪U\\\pB6!!!ܹyy˖-:sfϞkd2UV]v8YDy!>>^s=]vƍzGd0, 4Ȧ~/_k_>>U}*!!!wyG*URHH$iСzgx3ܭ[$I7o~+..Ntĉ4|:v옪ή]D}jԨF$CyaÆuI?ѲeRXzׯ#sNjvx,W)Yf %I P:u,5nX$) ???O_J7o 2(kf9/013,82yJrE1mȝҔאo.׌<#%c $[gfXa4,skܹ5j$iڷo_>s^}i= @ sjҥK5sL}g|Aٽ{wuڵ˱U5meQŊ)闵aaaXbŋם;w흜$rwwWݺu-OOO ?XmI.)9Bdȑd&Mp`l!/ɤٳgK~wCZ? *jժjܸ1Aɧ\]]kNDFF;z:u$n էq1ۚ/_d [nڴiź2e(<VN @vR_t8u{N7o&52e#@ Xi9s IҠAT>rBu ˗I&Zh޲b)c$mI\C)HuK/~Z/%%M>}tE(ƍ)S{N7nԺuT>⢺uرg#`۶mjf͚j޼݋Ivcf]n!i5I:244\^z TZ>@6 XJ(9s[7oؾzjdg)qqqrvvNUDVΞ=a_`w۷d6t;ajf"d@0a&L@ 򡠠 J5kn i]>zP 0+*V(777uQQQ֯Ue42eբN||+FpMHkذarww޽{u =c۷ ΁Ȣ([lmRNFE@p ҥKԦAZ6oެ5kJLLTBB`0'̵Q8@?~"""{)9::ȑ#V_r*W+]zuUS5 @G2|AIΝ;3[vm%&&˗U^= 4 gy&˗/OqrrO?i۶mZx6nܨ1cƨVZzǎW_}E r]^$IOֱcTn4 ˻vRVҬ۵kWIIj5nX3fFA`;Cyx⒤~[',,\Mc$>>@ !\tq $CyO> vt>6ﮐClX 3SN5{iӦYސZXl$I&H[o%jժ)44TR#K.>Lqqq5jhX SsTn]թSGO=$)44T'O!Ch$''' TH򔿿T?n1WHڵ5w\;wμ… ڹs{`03o߶m@*5j׫{3f}Cmڴ!H;CvٳsdU-n: 4 MժU d}ҥjϞ=(ׯ'TD'm SPP*1 aÆiذa ҈#tt 5jHK,_׵ktS79@EDD(<<{Μ9+ڵkjݺuOdd΁G>>>:s挮]r$=y_?7)SƜT$P [ժUSj$IuYj&'<==!$_Ik/v3_RWI @^c,)o!"W {#"ܷ7nPppΝ;G!*::Z'O$)w$IRPP%&&t!(x|$N3Aؗ Lm$N%a!bcce4 rF r"B2ؕ g! ~gyA...W2WJ#Inza+:::ߴ_Uڵ Rp`$CPxJrԙP Illm |bI<<yd+WWW9;;9Q? J:xߺ=ZX&ߦլY&ug.\*U8K64)\򱈴-<&M%E-oBv^WKmr1+>q^v\ 9T^ReJ@2tԯ__Ԉ@䲘yܹsm`XaV7/y ???xrNrI+& OHH0{I \A2ؕ >^'NԴi4l0)SF:pٳgUJ"e72r2 \tVRVX-wo V woj,/f6mRufr]mڴ)rG`!(}Rs49ݕ%?ǖs{FٳGm۶Utt>s&k׮UϞ= l3SRe7Rt!tޗeׯp$U+/KW^]9W㿓N]gEz)a^7II m̙3:z6m$CoHa]h4d2~%'B$i֥O˖-f9"I򱛶3hWL^޽S yvR}{SRqǤuDFiv2Rj(%jժU}6lؠ#Gd2Sj͚5 v"GGGH\\Vϧ_o㹴׏n m|I \Jry%m#GLwM274!OJRLLڴiO?HUs&Vb^5 -aZIe'NgDIݫI.WVo)iB:ŋxbژF%{8\T}Hrwn?c`rG*gW=oK{X750#(yfI҈#H!z ȎѣG^Y)kS)~N_5R,jIT~JcJ.'rIy衇,9` a0:Eص!wdEE &d+WWWc(Vի 1L ͚5KNddf~>^A={_|iӦKo$qeC21cHt",11 *2/]T<6nh~ɒ%j׮źb󥡿YoF2kKQҨQ$Iz[oҥK*_yD2`7sѶm$I-`ЁL97$z*!PS2LJtX9u_~͛7\z7nL@HGdR-$IM4ь3L*&:aSN"*$Cž={h"I믿ɓmI% 0I =  RhhJ,ׯvZlC)IބH___EFF7ސ4t֭ L!˜!9ф v IDAT9WIWB`/$C;C{Jvޭ͛7BE9㘤`d dR-ևvA% rHI |*؋!w:u|}}!7%E,=!EEI:';?쑓p pThU,yU뭭'^Uk-V*x[rIA9 97{ l=Bx̃;ev>~EDDZ!"".P]]ϰaxmźx-q\?%+b{w~~!Tiisq+!ϧ>0IQMADDDDS""n6 o[|7=3(P4f4b!C0mڴ}zi\~ۗ9s(Li,CͶC"mO7+H[P1DDDZ!Š+Z 6pq*Tٿ|@bH^pL/P[1CDD:%K0|pFEFFa49y^F/5?,\0jݨQ1c*˖-cڵi,_,'|^ҥKYbpYMM ,V(QO1MH[""Ē%K1cOYXr'bw}wE%,կ_?93|[HٴiS'dɒW\ AQR;b*D/ܣDDD^3DDO#-!NK#`ɤ3n8<nۍ0 @OMM K,! {RUUh˗/gܸqZN=TnFϟبQxկ~9s8cu u0>O}v6Q.6yw\4T9T i'y.FNʥ^JQQ>{̘1Qcu,_;Ql2 f{[\Ϛ7|>z6s?0 ,+dҥ::׋Qb޵]~S TU M͉W]uUT!$// b&ӧOoQ!$aÆ/b&cEEEQ]P0 ~.Y-nРA1[s]œ~C\( lV """"mA-CDDXΝ)--,⋜}٭:::(͛;ɓm/2eԩ\.޽;,[&OA8p Wfƍ/_\ҋ^~n54_}iva]lK.&I*. EY}T iC>hҥKϟox1w\^~e~_pI'E0o}rFvŮ]>裏06wqgy&7o2l00gx}bw 1BHDMM v+nuL@-h :)!""md…\yp {uyt֍'۲x)S0a„sYg5פ)ƍ?fرACioa2 C(HǃTb@b-+Dr=wb4u-"""N1DD!XK!dI&pB>^x}qDZ~znᆸoۤ ! 0Q_ ,ҡ C$"NF+D2 /S9$3IO-CDD@~;v,~i|cƌaܹuQ{ۗc9Ɩ}srxb֮]̙3)((#rMYzu `&pySD }htRJP\1CDDD^*ѣGX`A~Gy$| .9[#|T ͅ" .""""혊!"")K/SLQ~ݻca0d~6}M0 0 i^/GAH48H1$n 郒 """R1DD۸qcB/=x^~m;t6gʔ)ر#nŊL2?*k|>5:EDD`7U1$uB, """R1DD4h-C=qg4Z7m4y.Qk;:tEZb[ 6*DnO7+\h$dOթS',X|!úu[1MsϷgxh~M!ZHl5553D3F; R eQ|TDDDDZ!"")0Ʊ9sf|Ǐ?鴥 :x<8N!" `biMa """R]4m4JKXhQ|#33*u]Yz}ksá3DD:>(W#Ă y0r{""N8NzP(~Nkjj|cfǗ-[asOl-&cZ`!""d&) IZ[e~F6J MH8P""Aŋne./F'`YEP8Vb.z&] ;I:Z$ߜ*-ki۪Ess1QQQ#;kLTw\>O}rktꩧG[p!cƌi;1aȑ,]`0_T`DZ.]GOEDڑ/Gj?vwb楗^b֬Yӧ]݀v>vY}ٰox<!B_=֍;76 Tذ=ڵk$ܚD쐗 sKvh޼yL:u 0:u*555 fޑ].Ei jTzRo#8̞=;j}-C.^R:\ ;tLV)DakF""""mDdSӧOgȐ!\~usߧ-]>];vBO|DC2$ѩt) Kg=zZ޺u+ FUw+"Ic$@$&6U,!""e]ڵk{0aBw&OoC裏Xzud/ O__\~!U; W]u<&ppBM?O>S݀AlS{LI\Nr{""s=<䓔e˖ʕ+m_II %%%ֻ6Y5e:c.$3?+ ~qk~Yv-:o :uDFFr}S|ڵkr!'̛oɸq馛뮻UEEE 7p.5Z4 v"=} ^#THU(~PIRC"G+SE-w} 8{O׎jIO䢋.gmA7`֬Y?桇믿fС5z6k*[u@@o#@7޽EGH˭2Ibǎ&F |Q>I5 $V'OwߵfuނQ;xrZm2,#gB2e ǰax';~oFŐxJ0!bA(dR{7'''n @xQ2Ҙ!"""b?CDD:3۬7EMDDڎa GOvn̙̜93%ԩSo0 ˗{סፌʍF ۍ"NW("-0{lnF~`=\|jbԩ{z+]K‘=^o߾̟?n16Br[Kcs~m \.'N$77.]ХKN̙ywK9r$p/~ɓ'swW)xu|:!#c "P(r )9f?Λo[_fɒ%lO88xn'죴O>p80ZZ<r V9`T'^aBr{""νJLy&O}{<ŖSOqYg1qDw. .:ZSl _[ 1 3(5{0cQn_T+"۪\dE; ǬkbIFz@DDDlnDDڹŊߖB0a7n0@zzh,bAL3@(PD}~T TZ40 ZoY#ipXE~,2DD~۶1ctRƏ.޽Yx1\r fϞ=Bv 4"81 >P`0[HSV -Cn:Fcc%)]GvbȐ!e߇z(1:d~'; xu(G{!x^\lB#-VIBl2k@(Y-y&*B=g+du7 mQ+u%" ST y7l~WX^kmp7XY^꘦  {tN.%$=q9peq饗6Oh|)u{,?RX $"""S1DD8cyꩧꫯ1c-}SQۥ p5Xo4ݤY%"O(TM(1CDrNog֭;2͜9_'c5!_79"nwk\ӦJX;IDDDf3DD袋xxw3f z>ﯸiӦ)Xh\ َԼgiᰗ4Dvq8B FZnVR.j'&|.i`hkzv-0/֢B$U""]r%̝;W!++ ;0l=ҁj%r]q83~x_*s~~AA˗Iok1tzPFe4] FZ'@] ɄrHhV "JDDDd?И!""mݦȰaYMw3J834:-+pbHG:t*z!T(:stMA xhת h`6NU"|@‘lW b.X[A B, """R1DD;BӀ*%ʉC^/`SZhj%m6+itAD8餓"yyy< 2dUSSܹsOx71?[C>jYb@hFv"},Q 5Cb:!Hʖ*(.]GWDD:޽{ci2w\ߢ=Srꫯ*`9Mw>&u8QJCDZ (R b*`3@=\7V"""b/u%"Aw`…[oU6W ͲѬbO  -pXK 伍Aǯ ꆊIt!"AxwaĈL :auWiie*H CB yKŊ!#И!bJXGcMH8q"nHoZD 2q89e^#U IV b`bH_6 DDD^*7O+ U[y7TD[t"ZF#gs5I=ADDD-"".BB6mR 6$v1~7۽ G  P@2oب(S lj吐zLJ @vnaF_*dT1@-C2ʹV!^ǃYI(e*nC=u`U9uNUuADDDEDڹ8`ϦZrڡŐL@ZL3 1tVRS[!l7Y<XĆc &~/ ;; .L1%}L$Jt(PV"""b3 Iq> *FB7en}8ՄB!-P$#atM{nv &&65Jcu8z"ŋSZ~(՟VBz(i*6lP6(#v1$Z@U NeO  ̦z}.\Q$="5~;,X5\SrB  \^no `=:)w >? P#ȄW,!""\b 7jEFdl"=}udvp+ IDATt:1 S-Ce6Pq-#>|x􊇰"M}^}Yj' ˚$oR7Y"""b?t yyy\uUtܙ#ի6mk֬_OVq <|>Q1F`.\Q^: $!u{Zx;4yqG*Gѷoe(+阈Hj+))~s9sSN^SNQqdmpd0B H"0Pإ<(_ \|UlzSRUUԁۡLACDDD,bرϦ_~z@ a ఏ + FH7[|z{l`!1BcMsI T\""1{lxyFkjj1cA5! ^κb`!a})t7]y$ ةq8}L'+"""CD8?slCԙ%Jh\R1DZ߿r]G";݊s-_5w |Y9jF* @DDDbH ZhQ…  3cW8d1Bf}tà TTKh0P(VwF{=HqTO8r[{2AQ$RꇵeADDDbH j8NJ mF{ @(Q73$LrHՙઁplWG )W͇$POgQ"""b/~)"w8̒%KKضm[cBĿ Qw,fp#nӉmn;4O .?pe*&kR7ޚ4x0x XJv@y@9UU CDDڹ7[ۻ(WLVV,uRR5\fۜ l(U&v_}58$FF7w5;wF_yWz僒 EY}tADDxB ŠEŐ:P&3`*K)ڿ0»H̙μywto3f̈,r-,^8s+0(Qx逈Lw%L/W(aD[;*>{!k S.,Mͷ~'?1z-O[g}1c踒ZQdGr{""®:[# 8P1dP(eçb4/nA%1|՘X5]Ig?ھ>"Ja%$qdN""""&T IASLaժU & ;* 31`dxG!ͤJ,"B{3D쳮VQ"""b/]m@׿rW(v(yT(&BbH}N!*sZx+!Q.|u[$ETV+C";Cy@9B-C;uR"""b/]m FBH+[jXԶ5/ @2DIYg՚_5^ObHyj&8q tADB++,,=6bH"4=F]1 Z-E Lӥyt@} lU.trgn Iz"yUHtH;Ǎ7ȁ0@NG!> i:1pdvpX$Ng!|{@]u*kPuX (U t[Qկ$˔K-CDD:;튋7oGH"Pw~W~o1"XL;zAffj\IŐHL Iȃ5$ sK-CDD:EaAկ~# Ȋ+IX-Ctk4ӎ^^a^Y%И!w}6) :楗^K.;ۿ+׏'{) Ȍx1S:'`U q82DoG/H}sRǵئ>_nj|XCz+DJk`Sr{""}ݜuY޽ϝ={6'Of֬Y f/&"5M'?j#Vq: :yvww<ـFŐDj?$͵5 Uq8Y5zDD:ロo?@mT$م!V1$z(y׋cZ"d@r@5$҇w2:{Ip*d帡gr{""Ar)B:/~`mR5q<^ 9fG~H3]mqر[Őd>CRN"-dLDDDDڄ!""oBnF>̙իYf K,ᣏ>/fȐ!+(Xc;11)I1Cp:b8ju@I63ݷX@bH"k >Uwb}E"*`ɓϓvʕ\RHKS""mhg„ ?iҤSO=%\Y뮻lmq6a%~^ 9 "j'PHK3=UCw ǀo;+xCBc$zBy@9$(9  ;ߣa4PS2}s{=Lm^z%:&iMDDRZtӦMZ~GIB1Mtw ( =iq:+] p8Seɒf{!wG:gGDZ@ښ!NUtB.] $}SNQp_ׯ0H!'xg}N?}*ƈtt*s˖-Z~7+[o&2`B0xNp!.+R 1ZH8jQ6,Q \HdϚ$Dڵ+isNv܉<RZZJ8j ymѫWF75-^+w}%\Ϛ5kx"KII-*s֭_loaa!ƍ` *WmT @]dIЫnZQ\cʒv;C2Vê2 k1ЖjX#3dÆ }|2へ'RDD$%""p @ݝvzW0@WyvZ)NjjC:aua/Gt#jOW٥ue[{+XE!XK\*`]r˓ɂPUʡロ'W_5z,GʹT""T i<}w`ʔ)m_{5:,.RG~6{]YYYt">|36٨ ep90B?D"u,8v*xHX.?IAC\a4z &MM7݄i7z7ވz էOȼTRDDڹ_Tٴi{s#"tP??PMov*~5^cU0fRx3p86|*/ɫpjO,5JV W x8@i̘1A߿?;v '''> }Svn_-ʕ+ヒk ̞=\&MԬ;k,: Xre=O5kT e6j [e #i4CYgHo{o!~(I|(2DgJ9OF2ҁ<@Q&Lp?2I')@IWE "]}|gvi+Wra1x`:a.,,OlG1qD=i| ٩L +dm5eʡ9d۶m[7o\whupHjo̿kիc>g͚5Czz: wqi<^{m`b1n%2s pDC\.Wv[;/h<8jK/Z>1M32ٳ*VXA(~oF>}:~B$nV1$[TWODMS(.@ K `G&}kECl ֑`CE>2Wr+7D8S}Doq/8vW]uUd78I "A[vao|I/}γ> Xw}јɌ3_ڦLg<T q7x̗3FK"Cj.WRU I}p*I]5]y9jv*d[`s ,0aBԹܹs*Py8Nƌ1tգG>Cl""RT `> x~I'1gΜV}U;4=z4@TqAE5ٚ@2\@cu^7rXLjjz]Si:֘!>S 3$]k1 ȺXe5_jl)uOii)LQ3gr]wEmtR.رe˖EZZ/> 77+VukԓDD:w}G}+2<{mz^DUZjݺ =_ӷo_6leظqcZ%u}#tR ! yg 2$|衇>hלbH8ŏUt5JGIKۃiz-mG7Sz襌bY5$EWOYQ4cblF)@?E/*Pk"""b+ V?]r_Dmn:>c=X Sݻw}_{l6W-lL40ba8u$VC$ AZ+2G2c_(UӅ̴JfoVGo6|5Ⱦx]vq72~x ÈLcҤI|駍zVo~+5zjwnаe*IBrl`M|3e$-SV;9E}kO&zelfIć iC*#GrsOvv6N30P֭[~믿_O?ͅ^f{ݺu\ "n.[}5Ւ$pw $tCfYn@wy0[eRŐP7`Q9d,wngc&.7P lSlb-"""6S1DD ,]?%KPRRBEEp$~~)5\XU۷/~7͛Ǵin7~x|A^u(Io/䐺UHGNgp>($1:j1*tzL!!]o-GrԝtfKU&oC“ :&""KMvv6f4MZ3|A | +VpqG4M8∤o:=^n|@;aOR5^HA|>@]$R1DBNbȖ)(şAQu(]Vw*'>1ݔM,AԕSc,MT i'pB̮<s̡W\x7,A1{lL4MٰaCd/o>O}$kaεۧ"tb8>A]Ėd2wU*T8[WE!]Y:}Ԅ7LT*.{K6OF-3;zhN9By7^{-apM7z6}=U$_ %wt&~G .bK3!{w- *.@WŐ ]nB?N+}6!6UP8@H_6 Rc#!""mdٲ^/ .l}}EFZۗ_~+xwsO?t>3 ѣv[* !;nL3 q1 ֍%b5j"ɩ̆JԤ+X6N_:X(UӅlWy:CrC '~A3g!""$CDD {9w2 @f5ٴiS#<?;{N:;05jTR-d:ꨨoΟ6}VBì[:nbHRa8u$`PJ2|9!%X;Cp+ķ=XQԷ Yuٮ Ba5˅ IRuP$oJDDDS1DD ̞=;2ߧO&Nᮻ̯Z:.ZO<1n\| \}p IDAT wQGE-&Cr=M3n\.WT10BHP  C T7> K EQ_72Ҫ '5IZy5LED__&aȐ!Yf~zƎ<]v/mgIrl($ΐ} &lSNM R ASvu3Qtq2GWt3Ϙ;wI!""mO>̟s9m衇ݻs-pM71yd\+Ovb,]4~ھ x24HEbicCʺ:iP=M T mN׵Q174{DXQ=>F-EDD$WDE "۾m@޽[=Q̝;F~g9{;]>S dFjeG #iEb"h&nt,5i(0H1$ lVsq;Q*= 'V=E";a},Y~=nIZ㢡@`rF늋,|<,Z(҂>h I X{8h|㩻vo G~#k+!~TAT.l}7;KN<~@ê$%# j|>>OA$I6TkֶqVY LFҥK袋8׿~)AN ww707zlA~<\ŐXVKCB;uX͛CǓ+!U|30%h%Y*rKs0E ^ O Q43+Jv6–zKgL2)S!A!ID A8¼G}ovdC:+o?*î!mEӜ(/\QT5biB%FF+@_b`i7);6zHB縬֋:?WAjQfem)R_bpab _qv10g]:-A,A8L4UVpwp///2?uC>(W]u .dΜ9ΰa(--eРAB / .cSbpcQ K8&;lMv4rg" B1Drg3`Co&>lzxneee 4MӸyxbh%=v3`;i$0;<^t~&It|& EZv}MX"47C~s _ABPtk'm@Zx$b#`i\ ꐇHr묎)yh @tUB_UXx^aǧ~SXXHII s9l]v%%ȑ4Gأjm Lg6cϐD R>s~o\ϫ '"FJ8nMbTzlG-2|wƍٸqBADA@]8,YomYd g=715m.㥗^;#wWH-4r!bE~lӏ ~ߖ%X4C 8!{is-q T hK b{bK6(r4eJ#8>Fӏ,{[6G .F0yd&O,A$1D 6\s5_|wXv z+PH&u݊KP H# Ӳm [2_d1q|* e}qxc8!ס F|1E$mmAG3Cbdذa6lC B"ݙG!D8سgO=GWǍ9?]י7o^5\òe˘;w.wq =X ѻ s*NgLWZ4;K[X"u=xdb6.'Am^G]ZHysu)f"@&$ &ki&Z=$Q撛+A$ {HtPRPP?>+W{葉rv؁ds)pyqǛFSNeԩG끮fp`50@Oh#G?ڴc9Zk!FpZ*%X_1>K=$skL (oBI?vG'sbx0d#B9T:՗ ˗/p Л0Y $ n***2@`W<%z>oX~?`lA=ivb`0S.Ntp6ǖFlU^98^Ce>0ϡTbG!JfPHt~AHy$;1gEЯq=|t RUդ%$4Ex62bNزeA. Hu@|TTT}+WҥKâCEEAm{lݺƌS|r~PZZSwp7 d`Th?2ь[P’f+XuhcE0ږaFU3PF (1ǘm0Yn)]π* BH*Ŏo`OsvI69~?3DJդ,c^ԓOxŋQUŋ( g}61w\Su).b  te(D/u,1T"Rqoi]vYx' Oο^oiӦ1uTA!ID n"yC?E1UVV2x`^y#lܸ(ύ 2䠴kEqwrs1DŽ?RSSs9Qƍ㷿-6m'O?=vkdj:Xc(HN'Gd֋kn<@` t~\~#M*㯷S9Ӏl"5;u~hh H^ ݻcqM2yX_E8쪂'6vዶK?~]VV2LAĈ"@.ִ(Σo߾#~mvF-kW\qPc˖P/o;oEus%K:l{Ĉ{ s`bH6TܑP I@0h8>@nLy;"gsZ|1;ceWWfccxb-c1l86ۂ/C% zG8p O<|r/ 5?,:VpK)}v~ݥ^^\[ $"B7ٺI.tm۶1~~UUcǎEUըnŋ˰abB+W>yL֮]}=n߾}Q$qF|~oQQc *}Đ&As[ 2QPPE׭2pzS-"SdVIh*}bjAFmč hn,G],{: {bx0kg?YVr9_1A~}:}Q5kn%%%|wW 41a&MĪUɠiF ={0`It3:(ƙokZJB1DQbz rM;} v{eT b@jQ:0$fRڍUր iLI&+67~.ƊC Tx3վم0N1ҎP0~mKMT.Ŕ)SzAdA&7D8|lٲN8᰼dժUL(..o_n :AG_ o{GAguV_EEґA!ID n Bp6l֭?FQC>/"'t=FcO9\.W !/MHOp؀LҧCԄbH"g!ngjCL8d%Zq5BCB;J1\ӄhsq䫠`*q$zJ !|\uu>vDf[نܸkOJ: $H IDAT $!M$p(6m駟r6gΜᅬ̛7}_ddd0{Nwp 7{p,÷!硰}C[;B!z0N:Z, hC`ǯj% u}sCp"v`O{ltIH#nU%jA +-he[}R!T&NfΝPѣG3zhH $" &O?|\~大'7IʬYXzu+c̙Gs4 ͛?eʔytO )AA T!_zc'%hj{D\Ms{P YWwy8_RRrX?O況&跡PzB1tFnHs"Gf'1K!1I["è8<ҞUA" D>Vw&!0Qx:qR?C1Gonn7۶m ou+65:_uxwcӟ&|s=uĈs1rm B"DG ̙3ŋ)--kV[O=~ГWUUQCt/:JP(-n2$D9 aUǔbWm:}I[$gH${,S`@_G$Fy!m8$)x?3Jxp@? ˶r݂U ?v_k1ҩƶdddbŊ:t(>^[o5]\_ $"B7!Di,[#cnQQ?0=Pڙ?>pǦ&HnB$X,h9íX5qld\*82׍"l~hʔ@+߄Jp="@mw!8-C- lG- O^t9CTUEQ]b?bZ :< {#>ϴh<:L:EQ¯۷t:y8ѵvT1AAHn"Ӆr ~߄t#''_׌?9) hBG!~?ƴ٪┧ 3oەn&+3`+X{DIܽe@&FثΗ?|h @joHz.^S 뮻7n\LyMM '4PZ?yb W.pBK,AUU~MյNcs9 :GBmmݖn]V"j`WY0"H1V/75vZCA "ݠ5y-[o>;v,'NdժUb,EcF08 dC}bxSv R!6-p-4e_ I]}!R 6~ݷh-O^T D,A(rDIcV'qUܺ/4l7վrJ{ョ l+xqep7bW^+?kd#-NoLwDQQ6M ! I"9CHh>K(3f̙ԩS OaaaL gիWKBYˀX1d AtlT,De= {uݎ|ݾϴ!>X,؇7G0e 내u#٩ox8PY bHs\*D!OM7[`s=Zݽ6LVk~N8W_}>Gy$\?g.]|_rh涇_~] UW]E(..5kvu 3B#l6x BA"Gk׮夓N /Xs=9s$y뮻6m?-:tƠOB\sV.~ Fv,#:'tOC׭(A}|j3 梪/bHs1, 0 #aї`o!va5u.4ԄbȤFΐ>WVbٺuemcQjj*ӧO`ƌpj;1<6t@mgG?P+{^aW,7~S`0 E4PAjcgB :P^$vi`ꀆ}ΐ.rbU;P}6L֮]bGR\w\4"q7Cw$BQN_'-YŇ姢<'s>T{ Ŋ!>EQ5j_~9C AQ:,L:ɓ'- I"b Bg??(-_W_}U >Bg(!~TtJ3` Ĺ5ODa*&p Dž̲@"?QpE|~{P jDL>ߔbZ`}j#Ӈc=yg0ȎhpZDž ;g`֬YhFQQ?Jx%7QcRܙ_7؜!YUFuӘ;R'vdLj~UțL0yV /Oc ]S+5_x В;kbD?۶m;j?rk/]ש*,V\tETVVi?w-[e𽾐i}K /CUKȫRnFΝˣ>d\r /r^u& I"b Bo>8(\`0-"mT.;JnFikb?]>?%erd-nV%8[c8׹eu} .rӌYAmԵTkŔ ;;a{՝uMː… _͛W~~>r B"Ù0XzꩧFœ>{p3fqR.B(wt*t݂&A ǠOIيߟgXmX,sbj3n3EА .5ʪfYNu#3y0,b?hw1nㅚNPt.l[ !Bt)A"<5ʺ5eFk׮=*?9sf5ɰ7b۾{|xV?9a#Fx7{uZ|9+VLAAz2GȺQI&xb6m[nwa޼y(%\ȐDG3cQ6!~j[9T߯9j[C_-]YzgTlK^{%)x$^ydUNC 9aX_FBSBZ]tٞb冷5u֨qy\s5 ȏ-0MP3KhPNgmp .WwS2eA!IbAϚ5k0`@ԏd$oaȑbأkcC m6[b-n!Og5wl'XhN%se('/1Gui-! Xf4k9N y*ү4_- ;ѽEQziY6ɇD I{w?ܲe D  tx  x۷V.\(BHhR"..74H]6 ]Fk5;.(hIS w@>Q(gxz@?UW]%!d3#˥(D4ѩ}Y,n\~Ұ٪֛^ iN?O~ˠo 8[FpCq<@`MlX dp昐+wEWEl-b7o}=v5RGtӏ]kL ŋ)..1\ADA^ƕW^ܹr)7iӦ1j(~muW0<sW[<ʇ( t4{bOLwرc>~3k,ƍǗ_~ѣs:??qJˉV3x|6lwa,[͛7{lٲ~ @C HxEV~'<Gӌq˟x^SAW^y%W_b_}U,Yƒ>fxzIk-G !iiiر]uKp8z̟??FAz." Ġ*wuvh3P,Gh\L|xDhZ Vk]zO0 }nh|ͣbi&2eu :H^=?d#}2S1B5&Q]d-4 ȮӴ&jgaoHXp bȸq "K`bu 5jFN5ڽ-DΝ;.C7Dh6N.%u"Z+Z|>_.KJJzgȮ]`#F_sg}646 9Gg]ӧzÞ^s駟K/ BGs;x灈P(UMjQQTGfxj3uP!6dgFUH{n c.8oR8\wdQR0JLkbprK~4[eMEү"Z$v xӏnVƎիeWfرBcUC \|Y%(܀O3ƩuCQqjSO_~#؊+zu(V1K"GTBB k=?xxi ᷶@A$rг½T.~ srP(C1fu*8躃L݅Bj#1eu=t-m&#X00X1 XF˓fZI5%ulCWBQ2#U3LY^r.imyh^¬DEڋBm#SE;gԨQ7ߐ1_|AEEc\2e SL鵟邏Nb :4s/_΢E {x/:#/ w믿. BGd p󩩩9(m~1h/TiPykOk<whF|B- ]O1iN%quU8L ~b]xgw0؟3$^dlȁ-!%+ +V&՚8Q[]u+ Vn~UUim)JTTg iO @w1obꩧd***z} &t^xK.$nk5%߿_: BGh6Đ@:B|Fѣ1cO?4'.Ybt~{m{xgŸ = % x袋`ĉ8] K~KeeD|2\v̙yYp=5>_>iikp:8OƦ@Iw IDATxE8e;4Vkǡ%h0!怌ĐxȍbWpѹV I}&_#BֶSGD5ގŐ NA?.^ _M~ȴ'ϰATQϔ1*+Wpp5׈1>;fϞ͛o~{s1 BGA^^E]b{ ,]3gQM Bҥ ӧlެs:wb\g9pQi 73jkO!?^hԆn7iWдTbHUAdMr*#!hm7iJ>0C Im43)u,^|;r!rݯ2kWML|Or53bĈ^3`3|ƍ;=~ΝQAz6&K/ Ό3Ę&at#\VIB( Oڮ9oдT}gVMK:7-miӔ UZ %sNH}nu+8Pϴ&j cS :#,:,kZ{٣C }; KLu&h9CT{seJ@($\H)޶m[c_cWȑ#ŀ =CAz w=\JOOg˖-bT0ay>u+r[r5k'p<^RS7uxO|Vx; v(y2TUm7]մ[Y _rm7d]: VX H=3(jDAWb CScCqW @lt/֩%A@*oB|vIii s9YhQcyyԨQL>] (1D:_|qihhn t\u 'h8'z[-yjժ/Ijx>r?EA b  t@#*L￯3zBnN}X:wG^oc(nn8Z͗ _]88˅ 3  #C6ieNVjǡ]ƫ [eMEV@^;H0D8S_o$GOĜBtHzEOQQs(W -XEQpQF:3x(**sg?Sx<?w}N:I: B/*&Al޼CDp ?SR3gڵ c(ym)~{F kJq qv{L 1ēhNX͗OFdRfA}s>ci|3 %6B@%爦}4.ksKWį](l,bPz鮻Fb+P 5"{}!8T5ޏ09fa'ڢE())[7vUW]ŵ^sLYYXtgrgo`y뭷HOOOqgÿ B/CAn'l{9X1D;̓KUXlIM * \E+vW?{oخAQDt{l='$d74̒=O33gfλsڼ/I}С2z$|eVEӵZȤx%+_8KBee!)UZmgr6/J1L<2?:ve @C=@z`Sj8ٴR2)bs)^{ѼK2~x!$IfΔ3$C"0u$Z]JղF$TVv/n)- p51Pam%$ ޠ[&B@E PDwFӢ2 ov44ie6=Co~e"jbd&`!4zmhk!IGBq`[ױjHcDFFrR*e@ X0 cOꫯ  ȲիػwXm&hMTptO=ƍcHDxx87on{`'dȑxpA!tAZGeQQs}Lju]NeEɢ A5},gb{BQki݁;d0L: UT9B`a>7 :7-A n:?OϟmVU?f_g&TuH[N00evPF x0B+nU;&koi3m.4zCHfle,=+3LEq&I;SXG7yZvotwAOFΓy `޽eR 3@ >c}Y{=yƂt۾!lllڤ M{ juS6V9}--B}Zz׫˛mƊV;v꺃Ŕe,I`$n{%CYط @ɨխCRByY@CPnYӥU? &4Z.&Ǚ@2%?pYd ].뻽2L n vcy+.b!$KiǏgܸqeRRR@e@ X-OM/̮l~wc,>zz _hI<ɓr+$%]$I뻏Z2fkJ ]2+, #$( .tm!k@ J|Ey(9.jqAN2m~W۵`XAD]X ^T*p;S] *.2ulCW\$NY@&x9չfժU|B@ @ ~Gy...,Z/e˖1b9s49fx+WC)Ȳ!8;G=89)30CN%7L֕d^Q0vJJFvvh8)/uz̘kϟrI,;=_u$SZ*ӯv`(Ʃk )3@b wWC1v" N6%͖ɪP,6:Cpn߃|2+=]Rua=¶ì,d L+R]eW&ZmDbMkkkjxlq%,! NZZZ⫯ӧO#2ZGyÇ#2F`ӦMM5}w u։DhZt:] _ҷS$$NFbJ(/ '򩩏7h]99̼XX8[$ڦ^zR]ݣ*-:ɹ[B jl̀>}IAK\ASak%%#IMʔʪ p6qTTw7UUŷR~Ը\㤼/TZauzzDip*+}.Y> !t׮v^yEwA&'1Q*2@`/ tȶ1S=;vȯt޺2Cݕ\~)1_'h pmT^F2*Pb/>u:pvn̞LPPwQ[7zTFFq3={!^&[b!@ e@ tun{ӦM?;zh;fivE` 4o58;"+fnںre®,738ҋ}mee;O:NN[}It:O ǐ{%i!豳傥שVgӳzJKPQчO/)9~} >UT;xM0TRB,]V>ee{3D4|ڕ2b'|֮z+ݰhӱqm2&Orq%z6dr./R06kF1|+6M)e߄@Bϟr_ ?~xk>}d4@ B"]eE fjձJ@ظ8,w?>jg<=WEEW=zlA5TT('!2Wp wM&)lw_Gцs8VۇkQ^IB =z:'?PR~_-43gVtݏ-7DwIK{3g~ *{SQdQx=GMĤcŐ>7+&HM҃Ċcq1ߌ5V  k]?u ؀jh;2o쬛W)PVAPeAE(Ck9P-Ceg:zl̾,pQ*׺MWJéF!rw"y9ss A@(C3rHZ}ltt4@x ,h.bzO~騮7pr:BV"t:OJKѤţ)+ '/o.,`ذ89899"/o.M-D QT4̬>"3s1zM %%),Hyy? `eUŽG\[D~ dg_˱cLgeL~vɺAu &cFNW˛.lm͘ h~#Mgaaw嵆A"<1))2Я_S% /ver#ck }HFHQLpGQ4Csx2!"ڮ9?Ē-|T*2u)$A qy4HsT<-4ơ%n5{)/ˌ@ekRKۮTM‡Z_4>Y,Z-ZVL@HH}PAWkIII:n2dA^cG iћzk]@9s}ZB !^'i>ByPU))0eDA.sٷO`~XT^+kܻ4LAђ %lzl\'mDMqESe1tًl_}VlQ"^$vqY)+kY? mlJִ=90`oP!!!Xu ;;b0@ tO2D 8NNBff&YL:իWNo3g4YWnn~w{YG! GG ʪy,m;?RZL\Oi0X[|~~?S6w%v+gg+Rjjpu݊۟NFI6%8 pr:JZNdO?~IM]ڤo/^A~亼Ʈ搒GMB«dd]WT4u1:NVGN:kIogMe 8:"'\M^&e_CRZFzy{odL~>TU[T<򈞛oֳcaoJ޽fLP'ͅy=7Ќ&CAP;3oyJ'W !IܐZ[(.:9sUMIU  K zHdk;>XnS=yycz2Zbii2Noٟ ږ9e+bbXWAzkzRpoA0f}:emW '_ iɥSJ5d޽ݻAKUy?L"M8!\s {/;wNII!""뮻IرcASO=)6ol?iҤn#35v4t6J?i \\"ʺ[ξOPsGpq9V\z Ϸju[qwߎa a¤Ww),T[ZG(QUFFƭut _; z!!K0**BTHN8-?2))G88DRX8a< (p}.xz@f^ErbSZ:}/$RR[^?/Cԩ2vI /9u IDATÈGp萲''LJ]ݑ2kpĶm*I#G`pHNNo_+x8xPeZN%֯.NK3z۶IaǏw58{VFïbF >MŊbxYcl;#CY Bgi[$귽K/XxjsgEf8纔S`9PigQD|Iã@4VNIT^$}q0'b-ƍcܸqqssP%aÆ˗3e$I `„ [ɱW\VT޽hb=J9WmzRV6Q <{TV&|СS[M*Zmo-ggqҖp _ z{wacFQ;}%7x)-F]NN'PsAhȲ G(ھtdf^tbb> !-BC{LJJFPP0͋r3 M}&'Cdg/ -!ѤsM ]QQp0~'Hԗ[X~)2'VL"qVGv2~+q_,] Ic0l> [gϪXDռg՚݃%ܹݻE'cW6 |Rb&gĉz P'"&FmS,&C[sAg}]t*##cc`W+!\uK ;ͷ(XJJ98ߥ埘ƌW4@,d(wRH‹b9MvUP.- k8@Ae6C>u\\-#33L"M,@=@ Zoocc޽{yᇑeI&yWq4"PZ-:cЉ?w:G(td{Xe'+V||4/o).AXe\\QUNr1_'33('͝ =OU#%;{vv4hk#k 'E-m ;U3gܹ2{v8x^YXnY/?Vhe{V%^L{9{Vf%suiN+>Cm߾AN Hd~ˮ'SRdRS%a\A'ΘJ~X g\Ag lW]ԂǫjT .۴7Ι.r% ĠA,?2| @ B"EZZ ,0 _i3z&^~#UUU?aԨQKMN0A%@~XGz~ CF}|V2d1 _o첩F :~s=MӉְ{^;omOTtG`?(/{{~NO6%-$DN/?pDU̺u2ck=L@w;aP ())S̴V 4 a$'+W^ p(<$'x%?ɮ]2C?). %3=9S_$23߿+e|Pb><ѣ%N2^(J^# 6=0qba%ɂ|9\w] F~g֍70Tt8!aDG˜:(hÆ zL.WbK)ieX++>Ή-ݛ {2L/"bo֓cdf?_TWCPEۅ3v1Qa,ڭ@{H~aK&#.#I# 9x q1j.@1e@ X֭#11^zaoKrѢEȲ̒%K~0=u7t?<'O?nݻw@ ="'7w>={nx~נր/8wN_Ty e k?? qX2XSEU0 iiO2)ʲR9nbz&OٳGb|?'̫4'%Nrۯ@ ggEQИ᯿`>=O+JӧrGK_d.77J6XH_oy8gx=> 2oOL.CYY]j̵o:$ ǹUua-yYz%6]+jǔPItPJ!^]VYiE(r@ gA?.' $jW]99&,g- l{r2oHKHF,CђX#,,PC gemmxP%Hrr2eeeȲljժf}~}Y>ȤILO :NGuuD7w9qp8ӱ?+Tz$B, ҂Oq2R5U@K $s}v-+uyDŚ5ʹz6 Lzacd%Fb:x!%8SO)}3<%~EM+ӿwO3:f-<9~\fZ>-3cpıcJo88/6MٲEZq[n1>f*a=pUGR/Kl1hKuzMMžC=˃/rl;t˗@ 2D ܹ_|I~o-$$IB$ W׽iu?S7އ k܄ W-T,X` M<&^Y6xqX.kvtwܡ߫̏?NFDwýŠJ̖CeN=Ǐ|U}^|Qgd&q@>P(+W^7P+ʄMX[y9=S2|#bR,kvs2~;p l SU^^Խj}Eٳ0gch$%5-=2K b22NIlKFz7K+ .4dz`1X2K^2nn&&%84:,C XAo `A>͏i`!c:."b [liir*JIbb"I.` {gIo d4@ X̃@  xex/dYnW˗/'BX666BM84 H>2\^ŭ&^I&w6_7;]G+ʏ|0c kp*}xð|nnVCYr EqֈS"XèQ0a9s࣏IEѻq#,XLN&{"g%S6aaPX|"#eT*(*2L޹SaQenbcwaiiM'w쀅 ,,h\k :gN o_x5eB^O ZPモVnoa0w.?[ Ce\\$`=_~ ۶՗_ClĜ9e !cI3 Y96m.u㓁S'NXхv Ց@Dj `ce.矗s_L qy6 '"ƍ8 h?8D-Y">ReO1Uu24ږFOc`q%5U谱[cP-3}H×_W<9Y0颭1] 2{7=[ﶶow /@>&A_;TO 0pK_O4]1•zo ؜b6Z&4tJ V`ccyO‡Q΁LRJKKk'Q B ,4 $!IfĈݻ.}ʔ)t~ x!lmmM*BSSSCpp0| VE A? dS⃌s!^УsټYŜ9* &xyXPQ^ <O?-k{#ȼ",_Mi0ɧd.u硣#xzΝw\WnxOxn(0 'NjPȜzE0WMVŮ y%B wȼHSEɔrqʻ* ٳ)"o$X5x062 xsWfvNdVҋlEcr 9I?p6צ˩~@ e@ X"~)666L0I;wJxx8k֬5c *+/U^hׯ7o4Ȼ;ؼy-FB19B -RZFWCCQCX"Ti Μ͛$ayG%nIĸq2=z9*nz`'H]z** 4Tήɓ9}rsf Vo{xe$82osN&@h+z ʶZEā:u**yL}l Tw%̙3ۼ={&ΝR-(/lǏwk02(2jY1mo ֍DiќQʣ~b8FKNm/ ^z!p%3<[oզcϞ=ˢEeEu6mMҗ/_#KEW^˹{?>ZV SmHӭ: __ Yˁל+9#JIDFJ&snERu^CPAO)ְO${裏^K 9YI3Hwsb0gN *kkD=VQXfB.%[|̘1irxX;Sy;3g-|h @XEEHCn&>.s^lWٳg*B.p=*dʕ޷ I@`Q1 LEzL^89:*MOcg*SBqIeHHm$I'1NU{[(wyu| և`F7cI'O\t6orX@F8xP7?..+szF kMUtLe%8:r \$=y`oPI^qpl}/0O@@,c!I۶m@Q AH9IB,Cf(! ?n~riRޢ"##9QO]\F:=Z:.<<LP0cƌQ4lݬc{$mΝS :XӉq|+YdeM% 4ѳUu6Pb핖6| E=#WI *R6SSS4@ e@ X [n57n8z->L||<yg V]^? 0i$+~sHJ%^IDYN 1k;)4 1lc\%%G@qBԵUk&ȩz|||:Q_U0e X XLa=3gW_5T|=\}5t 0\VX8h?LCZWaL@QxO|MJMZS~~:mEE<`v9J[o#+˼3٦idߝ||wboM>>>z\ N̵4HA1^X;1@ t)9 IDATfSC+!u' !<|h.T+%d[J%#DDDw^vF1siAdtj3M B"7P\\̨QZ]׿/dY]ꫯ#o>nVviX.tkB 8bIsĒXȮ+Ga}!CLI\~9̙W\!1sR9R5W^y/#G+L+yo(nr *& $eE"pUt)<\>i$LgZqO֬ћ%={`2xqw$θ03ԳzRSŌCeQd֮5OӼ%yXdƏϸq,EYif|||]A@ to2D 8[lnkwG_`6bܸqٱ|rrSLiuW]U,҂H dYB.&ǁH!.CHLiei}jx8bZ84TNTK'OJ 3""`𺑚j"Y@C %m{?Mf&<( N??:qdnΜiY~yHl̑#>bE^ ĉh\JfNKYh۹ >3kKde{3]>tX5GlCS.y|Ѣ&dEI/;AѿqPAW*_~ӧwHAAAL8C7o'N ::sjYzAV;bj.8_~]F5Oߚq|Iv>~7Ժ;Ç/ GΝٳJڞ=f<`$Dx>PZp4I71(~+VY#1~Seȋ/‚Tg:#Ϟ ?$$+=+vv-L]}͒YeZZ(I"7RR,sQEHÓhދ,i={֢F@ <2D 8GW_}5pq,C.¯JRR>`k **lmmhČn4`4Q,<@x`4 s7<7nǴi;2QQ20p2!ʼJG o{_3n\ _~).ŠA4)oAޔK ncz+ //=>+s]0#Mge) ;f\փdB.QSεHKk%Drs- "00b#SHS7y$izyyќ4@ t2D 8+VHzPXY梟W@@1,o֥UGÁB - 1PwS?u^xL/V a`mBF93!w}U Y x@;씿#UHޭʪ!Ɠ{3FWwU)Sǎ(/oK|WY!!w/:$n,_Xky8Pb\E`(awx8j٤ۭH@U3޽.l*?j=VrO(NbϞ=DDDXL# /MM)"Nm[de@ ty{1@q%\X9hР~idYfҥukcƌ1'ŀs bh CT*~5Cj|S3F̙` +PĖ-*5Kņ Ƨ~IƋ<ϻ\< GKx{g- 4Vgφ5kdƎ_FgxPP9ҼSWggVĪUaDBDbLq1l(QZ -y !ݻ-zMNN&99b/F:PA*^nhhp+kﯬ*//'99!CX|yy1P,I$IB1DL4NhtEE|P8gvS^h/6LLw#wYZ7Iߖ)b6=n~G}"vw''Lb5 _n~Xh Lb 8C’%'^dR}O?UTNpwWH'NW4poF1iݻLP112 'J8(zj~ yw1]OfjF3sא>g66lгs'|QjZzE\3Ѓbz$ώJqWH@(CӿyqvOfС7j{899ATT*[nӧ3w\1@.lllt (ޝGUI$HB!MeQ@D\`ZUZ[>-}ZGkm-S.Ң B@CX d# HL9?>萘}d23s$uKUeS!p |諭~[áJx`d{aOsx3[h!`@xmvwOჁ/<'>j$ /<?>O?yYtkf,Zb 2إʡ$c& !ii.\~CJ SHe.\7쐓g?3/L,^ӟ P'bx?+`|x/!/<4ڴi"3{h67TSsn.""if͚ڵk?~ӯ_?N;zŏ38.#ڽ:u*0{l~߲rJ,W\q+DD+ԚRFҨm r=[K|>ӦMc֬Y7q̎[`*.qO>W] w bQ~$Oy`h4 |x|{p<-t5޽z%!neJmX6֮ui~s|s|ee_~Lx9sٌ 222Zs&vrbOm۷RP!""-C=t˖-qnv/^|ܟٴi>(ӦMqN?trrr\_>?{CRXXH||fs=㪫 - wx9۶w^xx]Jy=] p "_bs/~pU.n4Z<-y'l2~/}T$},Fի@@`0 $2vI\v( o WR_l~j?uzo;e Ж{y{Bu;և_/wfLKTc 2xRє-%"":CDDZ_o|3<76}][n {F !'N^cΜ9\tEֵүY9sDh;bccQqpVh]j!d}!(LWH+{nB!ؾݥsg/q5r9srs]JKa Q`˖?cc2ټKJ l49~x_ )3b߼y3U!T iAq>}:+Wl}Wfu1mڴz_ϟ?uW_Ϸm{=>̦Myߛ6mbq=TW<MnsV+ӥ ÇG% *&/~;/sυx%%0h~Z?! `P|LJxwqsJ}8PKo΃>}.ݻ;|Qwi.i{@J- N>}\oSUPM_UU'('2f y)qሇ m#:t({&ɓC̜yb!xBN;7|[nk? 4zǿGSZwȐ!GX:X1BFhg Q1X(/@??}hF}Ν0rddo/7@d68|쳐&''%ua63Tg3nÚ5.6as4tZm`ktXhQ>ypa~äcoŐ \u/1q)zx11:tpHeON 1a wfZ Ν;ҥUX*239ҙc)DzDD1ia?.?<]>::s./b%KK/lRR\r ]Ԗ& RUU $2EFU ت(lc 8T6p l CDI[}6n1{;,[2fLͶovf~HN] 窫`ܺc}I| w̓ .hx+@ FkL뮺332K|[\0`jzC6xa+WXn,.֯7=뮃n3C!s]0f܅,t6yɳzý¯~U>X_Dp݉TTйÛo^ȋ˳_:v۾|1wC\s^6ED"MWEDZ3f.뒙ɇ~Ƚ˯k/^̖-[p]J.fwqǑ|,^O55qpGAHdDH[ -/Uo'2׷|7tg&|):t2o˥:6|o3yKIY*2KqkpX6l}˾}7`6_"cHO$PPRXݺAYi,y1"Ď.>ڵ6"2_sgm˖5tVΔ)0e8nX;w¨Qg4fs ֯%˼Xl/vܒ% w x1o),^|/ 6~7<[βe*T 9M0_Mr[ ;9s&&L 77ȌW^y儮eeP}TDj$0\1Xu:+/*+?В/H(_*Æu;;t0Kd%'ɓ}|}7LBlKj/'tbsŋ]>0Ļ·0f>sX.eX7%0+=z8$%Ai~0`@ICyyݲPARÄ ЯS(/7ހ؆|Z5, 0y\ar^֭3CGԌxa3\K}\zim~!~:Diiƌ9m]/jn˾s<+9>$o3CC /!o{|4 l9m![Yl\.VxF=~%˖2BGwh9=R 9֓O7HTb)ldddХK&A޽ [زe yyy?)_= Z0] Hjl* 1ӊU [Ctq]'2d ߕ>|GϞݻW=6cG}g=~3ᥗMRR6m>5KZUwgil cǚ^TWAàApMpG(+^0%6mnSRLQs&M2!/pf!Cvy1o|Üwu{/<81c|B>RSMvɒ%Vl2c }/!!;Ua`:Prs͒^W7|{UPi~7CkV]mFG;Gvv;vmm좋B̚0#/UUFc]Ms=~Na)4i.rHO?wf>Db)lܹM~SLF>}{[ou|G|[q}#{@@`0 $2r|`ئ0Kd) 5{Q];*Т 6Aqo{+zukwҫW/.Ǚg_?(MȑuOֱcM孷\MI^3 !C` ?헓b9mNO? R,0zt/<~LVga ?֭>. 5t 7ȴi]dcYFl(,t3_>}_n7K:8Zr!.uu,6bâEǑ>#^weoǦ,[Vd LK[)T;{wdeLV/8`Vq)(0n!3M(PQQ웈zT 9=rgus̱^nڴiGk}eΝ<岲sO1t`v9.sfx^t[|.))>G+_pZopMz) 3f-ln|]~3!3wHMufLlwV_vIMu=!6n=L'Oo'> oo;<8p <ؼ?!>{{bT'3\ v) (GXUԜjϪq+Lj^sM̘cƌ;t0;7$˗33kN1m |眚5 -*8TV{߿?ǜg:4ƏxJw| qqlk~mۺt2j*c]|z`FŋMݻݻÓO̙aKB\v….11_죨(Ē%.'(-5s_2ˮmhΛ?!=.99.}:<(\u<[LHm#+ .uկL1ejSjXe_͒b6?йíSڱ%*l_.&9 :GPӱg騉7<х?0œ3LKxX%#vDU&v饗*c|@nݬOLLdTWWB4`0HUU=++?rKF֜$mU"g8|5Bt|o 7)Kh K5X7KmRD$'@Th7e˖z6ĉ>7yt)rrgmvo2]>ԥgOvEE>JK}<ñ<3u:cH&n]sk ![o9\a|[hYF +?4KXc:{lfuC9n6Lvm.?\'0nYflJs^N)H? j:v ee&_%=bk323K56=',ᖞugVcnYĆ]VwVP`Űbː!>HbH3}?9bʔ)޽u 33~O?s.R\\̸qX+Q; F$"FaHx@b *v2YV!MŢH81:w욇z9.$'a:;>L2ᓓMwÉ4ǜ9]FjF]f]GuLLV՟2mt ߿tMgHgafhqgtKrKrM2~̫1:eNdU.s'HMu9\֭sxAs_;wvy9\ӁQ? ,&L'!2ť>ٳClr: R8pt<14jTpS9Ǐ#5\ѲLwO>Yw~A.YΥn]~L-#å |FHeDDW_gǾÓz9眚 F+!"M PA (W6!Whf{sMrrre"M!?Y;Oݼ978&>OH٫hQsSx7.s}>ƍjCm~C_Mǿm80DtbXu3F'}Xy ¤IcOdfȩBfpם:ubDGG3w~ Yt)~""T1X%՘U%'xE1xt8 {NK̙3#zЩ 78RD~M^<xgҤΝMgCv9DsQg;yrѣeԩ.wq1¡%%.r ǐ!{#+%&#fdW~o_MK3EU lII ٪5hþ}.%Ênft<.إ[7S6"G=a[eeu_ahGtKt۾EQ1DDMUUÇgY-8^xj];~_iH ҷC}9(W V@"zVOz{͹0_EH &ΐ9Lnv(T]vm0@}XRRڵs9 10z@.;ac$A\**?|sr]F0Ccb?n?twyg -s EE.fcfsuO^Kuu]|{˦M.iiЮ)֜{.zvym;p8pn}u< "=ED wol.^3g)q}qg|߸q#Y$ Z_"/)OkNbuZP]ۢ 8OB.Df$\'ܜmۿO={ǺvASP}qYue:> 2_gdݽ)v3,%!1v6%Ԫ1t>ܰ {߃M!W/ǡfٰ>ؼDԦbH3oۄn68'qqq[bt HFjc=bcca!j;I1xڞБTF[ EZƃh~Ik-wѰaHOO??gS[#m3X}ƍ|9!ۢcW»tm۠a3vYZ;̛g!Sx9ژ1fMZ:@n ocPx5((pٽRZ"rQ1DD>mKNl3.-2]{sf׿jc9P`UVEU ^jU׬ӬV۷ogǎ bΜwvke ;<:up4u`?+L/r~/_C߰c@L}"#'L^{X䔧bH39r$g޼yz?y.ԩScpD$&&rM7ic9d9A"$3_rLAD͐VKvA Pd K.Ut:@N ?غեrUfAՉs_ªo_X ?w#'GN0g{dxƎ5 .3/钝]T kܹZޟ|zw5TUU)@;`ar|џ\T T( IPV'N<2PM6MXkտC ={ԯzs k1*G߾zosxejx;qC&5~?9utȩ+ZHKy~ohM)m ǩ#t)Q`U l,%a;с tԾk\ڴi , tW$;0] ? }:<۠#D{B S!"""Ҭ~?QQZ CD16o`J+u Tlk׆s;9rfG8~d8""""" A1Xm.(]P1ăXIImˊVX3ălW0r$ f(DiUGDDDfHĔUo@KE{; ń$8\l222P?y{ mi|:BDDDU   *@`¦4e?!F]Ə9|XGJ:CDD{a%&&FA4`b @OEa C<}VHBP(**RLA!"":o^!JU[ N1XQQ ekՍ(..XAXݛ=U-%""oh7)o'Zɋ5' R6c?U\Sh6mDrr}R˗a}l UUU B"c80X1X,$UYVEᅫC- (++V̙3Fk׮ BDDT o֬Y<# B8zDZP1!#͒]fĊ^Q ^,,.'fWTW&"""""MVr\~(!Ҕ}U皓X +S`ornRftCDDhqyӦMa~y"-*`bҠyoʀ5}[T@;dcvܩ ,:wL||-%""Mcƌ\wuk۶W$R6кk?yFifYYY:tHA!""tx ONrr2޷~` B)iм7jҰyPvx!`bڨj*x7|b4iӦ+i׮ %&FE'Wsl 0[QD!mPVzunJiֆ-*""Ml޼yEzo-$"T VMۚOLZ%"xC1xtU\3ănݺ DDD!""Ҵ.Rڴi;_ td@43 V&3h~9(UC W6_nZeff88^DDDiK/K/T@`*!^H (lUjfUxY1x1> >(P6ƍS1ăѕ.""-!"""ҬtH3XW)".EaVYń?yVN V7n5"""""" $2JˉyŨ1**J8T6 Z&փ 6 DDDiE:(Ma.ao)/AJNN2YO!""FHs]-"h]0BR5r7LĬ.]JFF(-- BDD""""+ j- &tT V+ ䷪ AVXM0A!TTTPQQ DDDi^)StQ V5' o? TXbQV6mLADRSSIL=Q1DDDDDZ @FvE@g`{i`P ^F /::Z2335@]DD_֤7K1XP^,)(l&$i絕\>mPV}O> bС 4HA!"""Ҽ UU*Ҥz@bbh ׅɲZd K.U+2Y"""dzyfֳ^Ad8:S"3AS V/M$aR6 !6J9L8Q=#..NA!"""3x`2PAd~(G0(DK?yq&jEaI5;fXMN)\C<С۷W""eDDD‰CG(Ct`5v@}hV*XT 1&Ŏ;SuMDD~UDDD\W+͋P*xTTVQ5)P.4E~faBҥ ;kmH}rYg)Q1DDDD=h)}j0L1Xc]W6}ڛyF9bB9$'' ,rrrXbCDDDy((x A1x֜$8bBh4.]JFFٳF""hf43 .)",?URQ)Քf IDATXM0A3C<!""*rFa G.(l\43*M1xڞ\׼+Jh,%@[Ea5VdYA=b=hC<۷/{V""i^`*!埼D)'JEUU1[1xʐrӧ`ƍ$''+Qg4/qptD(`bJ+}ꚓ!aT*/ Pd K.U 0@A:CDDDy~CIuU7`$fv|?}Y.K('3ă"B!:CDDDDDN=;\`P^%iUp5T6EQrssՋoDDP1DDDD\AHYlT V1t/@>p@QؔT+/'/Q6 tEA  jDH0L1X%՜$x S6'EN{+ҴL9T""ٶm[٪ NXbbbDv4z(V V`E3C\dT+ 222ip  DDD!"""ǓF ) BDZR@1:G+WVǏWg۶mw(""*Ձ A%ن1EQb]Q643.`I 'fWTTbtYA!"""Ҽ UU:\V"$;uxSYR\Qج+~~6@GDU슋U  DDDi^8Zh^" fƃ t@46A.Ea3"* fn-U 񠨨WF""VfuHS;,YEU6h~ xS1x14jb V\ ,̠A3DDDDDZBb l) C*X( !AHt~ذa BDD""""OKHh@7*Y.K+ӌOOy)B9TWWS]gM߾}ٳuH A!ZsFehՐxX'p>*ZA*'' U^bh]^4@݃LAWDDDW0JAHd Ub:)(+^핁U;`b *X~ux0d@DD""""qG4l@d`~tt'+/>m4@*33S '""z*"""=!%@ZQյ=>P ^LHj7nƍS(Qg"[4ܦ+M1XUd‘!-k^RhQV6mRg;vcGw("" 9lVMՔTp`$u:)/Ā^-ʚKX@r>ts {;w*QgtؑIHS; (S6>G==@U#2VX%''3ăÇӵkW!"" 9D:N84>@o`MS0b7prYt) bl۶MA:CDDDDY T!6* tQ6;jfx^QXzC7&L"""!""""Қ B3C^D1xQj' @QUmJפyP(D(R""eDDDyADF;E0 ]1XuPb L4&⚧U 񠸸UEDD!"""q MDr(5Ei)Hx}2Y 4Hdif~(!ЌTU`U6(lF'Cm*u%KtRaa2333DDDDDZ@b Q V]`)P-R ^,*[a5qDux0`up]B tQ 'C<T1*A1xq^ 81\rssž}ؿ_ßDDDif@`PdEZ`b(\ހ>\ZUmV*(JT]_fKLLLJJJ(,,T8rkNGg0L1Xu I=WRG8YJl?G{ xOkPg8"UZZiiiG5ko9FJJ ݻwW';d BDZCDDDkIKgɗpl5l^xQUS53Į p1Uj{jQgUFFGTWk:͛R'(h{VG#DDDDQsavNQa$2 aTo*/Z5kÆ #11QA!"""Ҽqij a^ qLU%p 𬢰riEQQ!P^^ DDDi^8څ&EBI+C;bKÙ!Ҩ(eU\\b:t}{)""*Ν;%WAd~(- . x`B{TT+MyThTU m۶)u㉍}#Sh25Μ9o>|o7??&vjZ\\LYYYnnI.0sSя~t16l?n`5]'dڵM|Oٞa]wEaaaUxg<]vKi6GyM4߀;wr} sOwqG+q:t%4cݾ};fjLW\yLlrJW\d 16r`Ҵm@/-p]#ߞ^x6˪UjcuH󊍍%&&FAHdl6*"X1XhJx`raΝ ¢gϞ(Qg"#!j01%%hⅈZv`QaYffGu***ԅ,""!"""""rEI`$(luT4{]x*իWՅ,""!"""̂` K9m,5EQRdD9Z٪ ,R6m|ڞի~ߟD!""z{/""ͯ^x(VZٻ( ` .DM&QcM%j%jb ѼXb=*U Ҥ(ED`?xoggf MYuys̰gy `ccjժFF43"Yw) i.'f$xƮ0 p(#dj~50ʊ3Cp TTADD ˗cÆ zMIIAxx8 88ӦM;z*ٙf%;)/U@4 3 @dj4^P1b5k֖ADDyJDDo۶mZ*֮]dO>,X%"2UP'^pP]aH2 n !F3 ($ rww;;€#99ADD Q*S  g}7\+ h4B#*P z !?,9o@ )L'f͛7qMv\q,""*0ݺuÓ'O/_nnn]6*U * &&믿SNѣGcѪU+ " ` 1Ć]` g@ĠW$꤇ cdj%-[7ʕcG!DDT0f̘'Omڴرc駟樽;v`ݺuE dg2%KD>)))U ..111D~//_vڸׯ*UDFFb[𞡎zwGի?mO\p@+*k@rr2иqci(SƘ(VAtt4QQQuǀ, 5H|xeTV ˗G||<~S3 mHII{mǓ௬'5csԫWn:pm>sHZ*Kz2f͚>~E:Nx]GΟ?WWWoff&:w,Xnz-lٲt+W޸ ~^[[[899O uIo»ヒ67Q |Oƛy #Gt,Ya𸦱 E>}r|nnݺjU+_>߿TPA߿Wk?^z;wN:p?DRм~|YҲ_ݤGrqM+W666Xb>TkSzWֱrʡwިR:ʖ-[ {+T;;;7' J. [[[hB>WRRR`cccwpVVVb"?j"""""""",*2L=q^D\""*ŊëWPlY\x1 4P;d !"YKl<~͚53~GřݻwvZ8;;e˖b5jH QXz5o>@LL &MI&/8;;VVVDff&peuǏH""*0{s{JKKCXXLn\r *.EDDJ`yի̎%""""""""U Q3f ѠAѯ_?h4q-"""""""""5\&^ {{{퍄$&&Ν;믿`mm '''Ʒ~6mڰ󈈈$ ke˖#(_p,"""""""""""2k Yc0sQ;5m%$$ 44=«W0j(vp._mۢN:BCC VZ"&667_VZvy?4L>|nVX!~_թS'>}:ѽ{w8qjժx"zp,"""IIIA5d5___m%&&B TP9MA;v طo;LƍBI&8w9WWW12zhYZAAAx3թS'|犁G*U`toF6mPn]*U.5k'*BVVVtv|||SIIIx37uYl'&&Æ ͘j Μ9e9'Bd QVu۴i]vU84}tXv-VXL4h@ۯ_?#3j*n F@#33{OHH={JLLĺuÇ>c4kL~LŋΝ;@!33;vԿy޻]n݊5jԩSZ3fQ{@dffb˖-pb[3)/^[nҥK .hdS_իWCɮ'݀!thBt\|W^F7 #F7=z B`` 4 ~'I}oo=;; ~S'""Iݻwe~q ۷oc٨U7n `ڵ7l03?׈lGF6m$eJ˥EDD ((KѲeKYףdɒM*~WY7C/@z$eK<kŊwJ*'B"""Sw{ [ZZJKɶC0ٔgԩSGވ#$J.\ѣG%כb{5l/_' cǎFt74@}6'2Oׯ?^,CBBη~ ؼy3j֬؎N<Ɏ7S+WA̙3%J!W^_Cd͞S}@0#44TEM`)///0*yv!vTҝiqqq0wy\OkFUڵy$sԭ[m۶[ǒZj$''xi]]t;w' Af|R@Vjժz^4[֭y"̄FAӦM%y$''K~ oߎ2eʰӉP`0Tdd$cJ.?0O_yB aÆ8|d{:|dcǎz 7۸q㌺u׮]Hfʔ)qzǏ >}HgXz^kkkɶYNTx̞=[MɁŊC׮]eu֬Y#DsP "88`=k%K4: 6d@V0p@v8 Qh4K)IMMl߿_|(6ݵ7"B{I^ν{$ۆu[ˊ+6l`Ph'%޶mlAh0n8 TR\hkݛvCq; [iӽDɓ'uV/; C]z„ cϟmbŊmvr0n8|@֝ ׵)%TW[?d[ѰO>c{zzS(Ǵdʓ;Iҗ̏v~-[w9nK[n+AI;ݻѩS'$$$[nDN k}igddw]+W;wV3֝iD2hժ;rG8qRJhԨQ?ȑ#ED6m +'HݺusԎʕ+'ܹb2_hԨF/U3f ڵk$B"""zm>}*>^S]Gt=27*|.^@ܹS,!:t cɓ'&?Oeeqqq<f& gT\c۶mO0Ik]vlٲh33tP`n ̟?_,,!%C"##QZ53ѫW/֭CF0zhvժU+^:]}vv[.֙6m oiiLhڴ); +6~xTV ={ ǘ1cd,!"*83^cmllT'2777Ż===e K*Ŏ63Æ ɓ'7ߠW^xwi$*\Ə/^O=zP}`2ƴiӰ}v,Xݺu%:6trJ1?Ҽyзo_v3g~w̛7m۶U]IY~=f͚-[By(A_b˖-={6:tbŔ0`b{'^KcQř!DDDT멫|27n,nk48::gϞ(W]&mԨQl3Y.]$ݺuɓ'%e?#&N +H^pvvI0#wj_O OqI?($۷/._,۱cԧMpqqr[S ršGbx<_I&ʎ?>iiibٵkfjذa |Lj˞={ӧOKrM<iii\2L$B3C@M4 +Wuz7j?ѣ@HժUeuxZq ٲfs]Yڝd>#{o:p;LK.>LϐеFdd$;VPzuISLn{L#M͛7ݻwQBIٳgǾpCBDDD?#2qDL8#F@\\Ο?L+V ذaBBBĻf۩h9rAccc) UR]Dl߾vtt4;rX\O_Z;6]GEZ+mo2d}=vpsI699Y|ܦM\GH>#qi\]DDy"""*ǎ?x zmr7oVݗ|RUVӋw}ӧbRkܹն\Hfoo%JAS(aaa!ᅪ:n„ Xv-v@5kJ4]|y4k֌_i.iղeK;w{wELʕjՉUlYk@Hxx8!$acc#>.]tW9pT|""27BDDD*!!AL:zj݇Jv܉СC%e>>>"J{6H^$>3zgΜAU9@vQѺ\^>[ٳ!!!puu[СCy~RRRˌM_|իW,ybƍx3TX1wΟ?_=uTzKb黋 KKKի뭧=Ȕ$\|]x5jPqˊ"""РAٙӧO\' AZݻwѿqӲ:ؖv]]!!! ૯0gΜ}\EGGcDD"""sZBTT 33$N2Eok֬ ;-[YfPu &N(s XYY^jժ)WJ|gqI 6 <<\^hOppp@ff& A_KꄆR\r(,, UT19͛'~!;Lu]NܹAdŋ'""BXxN%7obS7oB٬ڀFƮ]PD طo8H^tiC=!!!Vp]v=C(OnZ2c666Ib0zh@3dd>ڷo/+YYYAԫWY&dydty{{ɓv^ЬY3̘1Β`˗1g3Ѯ];Yي+$SÆ M"88بDC AÆ !?.ٗ t 'OI0#M6-Z 3ښ5k&+ kIJex2̀ҵ1gԲeKs+11Q)VL6--  ⬢3gΔ,9J^V6uT ΐL0`4DD"""S1_ɒ%%/Ѻukq=c < 2m*|֬Y#Q[zz:cǎ ۷ŵ ҥ ۇ&MȺ{{ٲeT\zg֭ׯ_Gpp`Zo?lҒ[fӗ#{G}7oٳŋ賳XbAo+Wɾ[nСCSm+..Nu)@FAl22'V]+33 `̘1;r|~~~ߗ/"z#cQ^eZn L:ժU3;N<ֹ}>^zܹs)33+WdnHKKJ,i'O>agŋptt;;;ܹs@֠xxx8ԩHT\t @jϞ=s'c߿ND!DDDF;|0;@@'^My3IN ".EDDDDDDDDDDDf"""""""""""2k Yc0!DDDDDDDDDDDd !"""""""""""`5CȬ1BDDDDDDDDDDDf"""""""""""2k Yc0!DDDDDDDDDDDd !"""""""""""`5CȬ1BDDDDDDDDDDDf"""""""""""2k Y+. """""2˗/qJ*)SǞ8qgưa0a爈5k兒%K"%%OF򂕕<==oznݺ[n!444_?G^УGv>y ,,,h_̗ѳgO;v̨.}7n7 .^///xyy_~ȑ#yh. """"Af͚|{B[2e`oooT D׽{0gCT/A. +<<VVVb ͛7Ԃ $ӦMkڴ)5jwΓ@DDE!DDDD h4h4\pz9r$_ݻ _'gP~عs'APA@6mrJ̙38y$nTPѣGW^)WO:u ==@ֲKuaǼ$Çׯ: k> 8q'$.EDDDD[FJJށ~˗yԻȑx(,]3gTgggSN4w7oƵkЮ];`JrrX{iwy/OmڵX| vܹsZ W^8quFݻ#::NNN<1DDTpf) IKKC@@@=WPP222ׯOkRJǎ9|0~x1V^]vFF۲e &L nGGG3[hd/,ڵ+5jQ`)\ ȳ2&kڵyR^ҥK#))ɬ &`ar&Mɓ'ej;;;^ld}aذaӧy!JGUaܸqb&##!""""""RSqƍ\?OTT {1OJ;z(}||vZ}UVq]tL-Bd˗Kf >:ubǼ.\ +{]ׯcܸq ݻw>|ȋrlcAyfvJ!9:qy$""* !""""ƎX~DGG_~E|sNv(m>w\}ڃι}L?gϖloݺRH;v̨Ԃ.];vI"""""""2H_~ݤN ߥOnݺxYXx⾟~)ONx|/02Ytt4,Y")O1{kʕLl۶'!DDDDd- _q8rm'&&"$$$ Abbk9 40*KN%%%~T7ϟ/{]~F' &&&_gTT"##ѣ99}4=*Y'?{tӦM˳qiDGG㜼$%%ѣsŊÇw&)))O^Wz$jDDD""""27|}jN<)끘#Gz =z􀣣X6uyf A`ooƍC4lQD AӦM7n {{{ @R'_cPti\vMq䟽=N8aݫWdɒ R z)ӧO_SLQ,oԨTϗ&M b?*}n~UVqqqA͚52GGGYc={UT h߾Xo>)S 7PfMuvhذ־}rϭZ3J(֭[zQ\tIReѱcG(Q jժҥ W.}G8}I^r+J*vڡG8}xz۰ax=VRb;ڳt5lPZvQF ښ/lFۯ_?﹇{UZ\.8d~!""V]@DDDDƨ^:Zh@پ `&}yuFEE^z,--!)[jV^[nf͚۾x"5k&)X"/.Ij;vٳgm .]HIIFqq@jS7oT_zĭ[@,]4OsuU1bĈ|{˗/;vO>[UVhӦ;yyyIffoڿ'qqq5kV^mڵk1blvA-… ea᪳ի7n}G3U& &''M6` $ۅ w2|pI Xbp233ߓoVr̃ 'A@ TYڼyb $ۙ3gTL;n::|0,,aɒ%6l@ҥb }Νy5jT._\|ӣGh4!33Fv}Z ˖-S}Uϟ/ d;v֭kpIIIXj`ԨQYQ9v={bDD4 ~_KjիWK].W$ 6`ҥ蜜 qtUV; Ȝ0BDDDDF_>*UoF3ydq>}lY";nOOOIYzdKtNjk֬#G3;w49rD4ZjHNN WW^!,,L+,,L/11ݺu[~dYw}s΅Xdh4)SFr|FF/ױҀ3lذAݻ76l///jJ/RoJ|}}ewϚ5 Æ =}ޒXK?/?~,++U\"nYF<222TܸqCs1c ,\3f?#[N6m$הhr;M6Eff-b˗/3fPL#_rE2M6Xf 9"=tM:^^^شix ,]/_ƱcTӷ}r;wT&M[Μ9x葸}ӧOǾ}hycf7""2[ IvڥСC|J ?|Pn.]PT)IYRRjcǎⶾ5N:|djժuNIIyc &r #WuZпWA˞Y}qWu9}ᕖWl`n>};ngܸqh4 :_d;44TvO0A}&ҥK⿦MJ'&&JHw -Rlk… םtTajL_wV*##111BZd8={64 |||0a'O,-{ҏ?gϞahԨw+W"66V񸀀՟ɘ(͜0R.mݺu?}jZF%K:+W,VeCDDd. !""""nZu?4xRRNNNpuu͓׵}vY JcV}G5y0Ɂۦ>g,he4k׮lO:Uo'R lٲ%_^)}3F~~ĉ1YX%צ4+22RKd2V dejK ʇo67J{???޽ӧOH{A6}9tM8 A[&MdeCif_FFڹn Z[[Uؖ:uʒER1vĆ 0fYyRR_.Y?ƍM6V;f`ҬXZZˊAe˖wުm/^iii=z`޼y~Ϟ=wy獻8wէOŋcԨQS'+KOOWO?G5p|J}d=et߻r\ £G0h ^%$$Nn $yպ;wrL j;xIS  !"""TݧD h/MeL~S1񈏏,9̞= &]V2`۲L4l#GT\\\_զF:^^^RlMq)Y)nuE<9 t9w]5kرc lٲ^R r@Ug(%7W vʞooog痹sJʕCppIetǏGٲeѷo_ ǴiIJJBvۀnScM(/ѵ)d TZׯˆ FS Jc+׬YSO>loܸQu+KKKYٛ{`^!RSS%iiiJQZ2]vzyO^x!+3FDDTXq,""""ggg-Bz%^Kp9qy<ݺuÇ1w\`=z4lsŊD:u&ڵ+$K?={ cǎ59gH^ . x{u]|YVֺukYǣe˖#G_~y^FAٲec,%% য়~B SL2be˖᠔!((ȬM0j(Iٍ7Pn]~͛7KoԬY3IBCC{kV낈!DDDDkި_⾉'7mڔoaɒ%@S^[h-Z3f2_0`%լYAΝ+z͛7_%nnZo̗I+..NVVbEc5X6mڄ#G突#[ǏO0AV޽{ ʎ9xIlܸv*>15͝;wd1cp;ZJ=|Ǵo^YW_xRǎѧO|F왬1DDDd";֭W%KI&Z0{lI7o'wIR&K.ŋU*ݥ.Xm۶HKKS]R޽{oԵKr///9TR[h%J(86sΕ1bsT\:wׯ5*6{nřFԄJG Ӆ)~vz<}t^åKpY|7F~뭷xB,1BDDDD6f?CݻwkU)]c.]dt3Ξ=ZI&s(jC):o̵ҽ{w5onR;JwBgKr)TPᵝ+V;===cYIII@ff&4 p)ԮR2uh۶mZf,%%g988c(](͚PT`f͌:vڊڳ*մiSC>իYb0ixZBb꫰zxx 4ccc=E'V\iujŞ-!!AZt?PV~|9Ρ>j.SzdQFmBo+ۼy3~<{]vŃиq;4RJ&T ]̷:h[lQ,oРm,YDYPٳ… FԞ>z? ںuu.]*^hQǵneʔYƤ|%J'88XVֵkW~ """`)^Ng޽FVoڵ~=JEٔsЦ04kl^''')STz{{lo#_λBw{\Ǎg믲2cӧOUg'Oƶmrnnngggń˺uTFFF> տTu׮]3jyKUX1o( Ӧ6;+$$Dyf~gR...NƒdJ[nL (ڵ+<؈XXX˘<%}~"""`P]xѨzXu*GnK;u?.+_lbr?Ǻuf;̞.dIIIƨQ{nOVQ[Z+88 Ǯ]ܺu `aa! Hw3g}T,W[]/JԩS R/ȭeuURE\iMuPtN.?׷o_}|ʖ-5kĉFTT8#FVZh4b*sKDDdN H7uoll, qF~^c` 8p部(ܾ}[+Y$RSS%?f͚ǸsbNcȐ!hժs&&&J&vvvƤI-ZW_KK$͋/ yf8qtYÇz;c 4n;wV|Ν;yȬlh4pvvFLLlɓ'!Ǝ?Pf_+Wċ/5jܹs)-}d]2)QRY=z􀣣#j׮W\χ1 .Dll,كϟ㧟~?zIC} 556m¦Mj'jժZpuuU]rСCs/(JkJHZBN-AT ڵ+݋uJ ͗iii_Çs'jIIIS*.u(4h[[[HSLUQ$ٞ={[" @ *UJuŋs <<\N֭O F5$e NUqI$;t`rhSuI|֬Y8p;vfD]tԩS%GAٲe%3pLZ(/EGGO?U.]@͛Yfӧ\]]!xbI dɒ%PU[bرc)/a|ll,;1_M6l"re5Jq<55UuWWW̲/&O={D&M$e3 Nj;rΜ9# x={&.ӊVff&>wbb"{}jo +9mkի8}=yzH\#Fо}ԤI"j֬ps= رc5l0&MhϞ=}/_nݺkdTUY*ԯ{@ɓlӧƍ^{8~=~'9sh…Ŷ5~"}Esww^d;I۷~z%''4M%''yWbѢE:|yfeff4b4bĈR_ ׯ׬YZ֯__fƍkھ}vbV4x`~ Rbbbccl2߿ܡEӦMնm[ \V$I۷/X5kTBB>C5eʔ?\9_ߠA.뼘AȀ|^ڔh˗/[opJ{ku_}y"}^} jkƍLvjՈ0pEڵk/ONTT$jROP-qPnmڴq}ٲe (kaow=*&&:,,̥j`5h@tԩ:\sU.]( B-Yز!Cױ"""T^=IRJ).Iڼyn&n"ȑ#l̔$=z) CM4ز &rʚ;wn=zT֭S&MԼysIRRR\f999z$Iviz8:u0 I֭[S50YfSSS&"ժ YfjذeeXTvm8)776i$]V-n&Ho߮`IR֭en fvwyvumLTTTvܩ+>>^yyyŶ?ҮڅСCT|Mn&H7o.ժ3f k^Jx㍊СCgSL+rM֮N:.=%Ώ!+F``>S=zT_}Y`iF?'4 ecdSV-*44b124CK# .04CK# .04CK# .04CK# .04CK# .04CK@ 'zWFF\api K  dX;E]iC޿"\A6_õ]I& 4CKg xdwRY+cN!pKLJVjxߎzkrYoN_Q:iփ\Tߞ?>%Vz0T}j9ydP a\LԳo}м%zv>[Bg9ԮE=T]&sX/L*{??LÐ󕟙5i됡j1~,߄01YٲYrF/}ڴ>ы=kOt_aZ ;'Bat릴={+dA!Gժ74T,Ѷoo$ep I=W?{XجV5}ºu;W5y7z{Sd)bXQ^ldȦ_('7W/:t͛Gv:ZFmvwy{`a}{[t,0Z,^v>ە\TN~*? P-ZuG njQ}g(4u21Q)jۺ}Y9ҵzZ2e-YLN8_ݢ3Fߔ>99EYYJOЯnQJJ$0{cGCڼy[-[*..غm0\T%;%?Ok܇_g:|gH~~"G뮻>ԔJ;XǎSfv~װkn}n:t_!xH*idX/ C^J:UE RNz{1rC呗'wLUv1٬VY9Zg{4M_6~ܨBw}.'^Tg5bh=бOmuAY_&랐ڰas11z0z~VB~Dk|\yV=]'wҜ5c?Y;/ 8jXVo?>3k@>}^ {@>X~=:蝏:뽙Su ȿjڇ|ugZ6IRj (5xeەz%Imv=`lu%iJ!bLSdM:p٬VYMSÆIqq͕i2MSiJTJpb>U6M]vEծ]"DةKO[lU^vʵ~ǎZUih:w_$]Nuk^}unƎ!*Pf)mn-_HZj 2T=TE-؞gjx9.f܇KkhX}rԣ;oݣfN}kӏt'V4k2u{.^^>}Dcy)<==Uv77^b0 =wB$I)0  C!\q%/Y"7OOyy)q2= B ÐQ2վ?"w>uRЧ_i\t$MC'Ijٲ7n6XXرSwZ{޽XS99ԑ#GۮzeKpf׷ z6:uJIIIe/&FyjG5yݚ2g>qBՄ';OOtҌ9KԧGW-j}>|uiF)76$yyyJ*Ga10 C23|hޠA}լc Y/nӔ:3l69<wDg}2 SKTz>y\?)""BZSyuQeXԨQcd5 M)T[[u^5@4e:Xi*fIOO55Jn>>:8qruȑj:r6-!2$+r|-Y\JJ -.mm)z{`` ѪQF/766NCqU+JUֱ/'T3>[=^]ohȓ!Z7M| 1B#iƿ?i@0͙D]a/+=W*V͵yfq.;_7oU秬IHRPtootUt8 F8v8tbE5;V6//Eە;buvwW իAYYS_~,PZjժMTvv$ɓJ,4Verbd(?_}>|L =:m~~|F?Yw>F?Ywt /Q34wU鮯$CؠlYV?oփ*DJ# +WST3UWOáhY<;uZ?,#G')c*fG%l;E_{UVQַj¯t?n$woy UPA1|WkMY4lp.ԨUV--^4_UoO ~]nkի+9%Yޝr֩{ҠE[aʿp7(zmXFO_0Y( t4=ݧ"((U+wTnwiݶhTI :67J+N$+%5kQ^n'%8WRj:סYoYJv9$DI?zufII!C!)nW-.N7ʳn]kB{CѦ{y_Knn95ח$33S TJgӥgxq )OOszeb]3"|pu6M^yT-\67iZ19l6)(i |'dT~^^7._zZR:6~Y,ZunFTơC^ @ 4$y*sTE ڻWj"Ǯ߰i?= mZ_///__~~=ڕuK0\i˓jUVV|NiƼEǓ'㫬Ly(7'G2 CnnnE‘f~V})i~}$UU;aJ?|%:-ZTzkVDsi 2MS9٬Ȑ'M;Rv79k(>!^ժVSdUTQVvvZ z;})7\R}VZbujٲ IHE4U8F/(H5k7lPNtSdٸA/3pAinwSvv+*%5E'W@@RRRTj5r<)_?_r吣UKg%&&i[к,>>20dLC_TɍvgUÃ2" Tbxyy0 U\Iyyy QCYYY TVfjR^^j0RLӔNK%&&* J?tX^RAUqz߲"FU:U/* .bL$_߂&؅^ؿ%X3@'O)D>:T+??_^^^UE5/??Wvˎ0s`X)OOOUVUGMtVJ\apiLȆk(WhBεÕ0DCKTk+aH9I ӧ3QB!gp\C΂yY)pe!Y%)?7JRXhkzWAUNeU/?/WbԉHRmM\,^AIENDB`3Depict-0.0.19/docs/manual-latex/figures/generic-filter.png0000644000175000017500000017055412640746376023104 0ustar pcuserpcuserPNG  IHDR[zsBIT|d pHYsI-VtEXtSoftwarewww.inkscape.org< IDATxweuITH)R~*(eUv˺TT,+ 6VAaQ@6YZzvx$̜23gzWa2侞#M @]5>O{HEDDDDDMl~ x7Mߪv,""""""#%V*3,ffˀT;̾gfP3#UGDDDDDd) } 3۳ 3X^XDDDDDD%Qd|ȺM@K `"<`f'eE9]"""""2)P{~I  |h:̎tr'""""""ފ3? 2@F&2NJcd9NDDDDDDd( 'rՍT<""""""2:g3ለS@ XqG2Z:@s-fC.bfN >v` X GQvxjfvHH*w{B<'&L':]ADDDDDF0dfSh݇-qcf W*Z]e~C1L 8JOe_rJl+"""""R2-ؿ|f)}Y}x< 722fv3{x ͤI3k̆2F0(?0}Pf |7NJffwa>d =$}Sā{jlfM#V$l~bf=5HC.#|2ϴ&si{o8PJ.ܽ^ |$G  ,lofu H1`Ok"q;o v}'i*C3Z: x>lB3 | +=q]DDDDDlp&}pzȥI0yb8`n!v)~\ 8;ҋq~wظDDDDDD=$+{ l)e09W.3[@3pFw.GT9EDDDDDDQ>yv ). ?w%JLgEݗYᤅOE\޳DDDDDDDi({@ሾ!ns-HD ,EXR#G}VDDDDDd&#<2l.%ɿRDy}G>^RXM03sIDDDDD%$JcDywTw`2<섀!9 }4"$"""""㏖HIL/W<aaDop߸pT1QQU;df L'޿IDDDDDj%*0d3l/g5:;,Ϸhbh"""""2) Q"˚`fGG~HQ̦oegړM^ئ 843%| ]7YfvpwHDDDDDj/fћ>\Lfv `vqt$vVaW>L4.b( a(,]\]}7OOqN3;*'`n%6<y( """""#D Gjhf0? ,#?q}jfmT]ǎ}=Q?xC!̦D\{{_ʯ[ݽDݲ>*=/7sK7카 %KƐp mC{s2c:`ؿlpv{g~,fȰP@+ J!v{#._Z`zDH|^Q=[fQ3 wRDDDDDK_̊AL )I%AG"ʿTI JfvO叺{&GE\.v )+{lJȰP@0PE 'EW= ;Xppjmf5@l>pP+"""""2%13k2/=н,G`fGJȮCfvCDl37Y"@]9 F qbf} x OsoJ 3;9\dwa3Z G&>R佷+lxpբfRTDk%Em& Jg{Kf flfkef 4 RuJ1#ef>6w>u~ #fvlOTMYk_wbc- oߨWg42ߋ\|ݷm\, i+QD\nB|ӁoE?r6g[v]L)TRַ? 2@< ɰ f>`}Zk+}":X2X~/;Hmϴh%x9Db`F@WDDDDD(@z8?w#@0|a}ɐ{ټ"B{z2ݿ|gvN>.w3"c)['k|`?wTXf J>-"&.+,l'l-0_DtiRZ0J 'Hg ޮwVxP?3 }fflp"bjcX١'s)n.!>QD""""""EQ@ M0E~ Qwi6ˀ{ oG"X!,kSDӀcO$s-,*%DDDDDDD """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2$H9̬! IdT3wv """"""%3AW9  '߹{C4@DDDDDƻ8Ref~ ݳUoDD__ՎGxr<>,>J1D \.7afqbS1}1K ?&5¡m=RL&Cgg"RuN6l6 0+JMrh"""2Ne{Yl-4fV7ifjf{fV; l9lGDdP466\TDDDd|p!! Tnf ,"8BvO>{OQسcf+ts>[HL'ӁdH`?R%S<ՋJDdfFSSG>QDDDddwC.}ݯ;f0p%Q9V_~5O~}6{0]ʼW//cŽz/"c?ǾQxDDDd\4 $0} x !X-3^A?3'( ܡm>\NkE&dY<[RԂj#"""Cḿ#.[L}PFp|b3$P63;`Cm 3;pлHMfA3UGDDDƏ_T`p}k5@;0M@/?u{}BuLkkH=`{"`cZJHKÊHiZΊ(ZkۿQ>JbfS7\z>>ྈsS JU|QTjr{u^ 4}WHY7 YN^-E*g|DH=טzЊԤ|>O<7)w ݄|qޅϫ =mf]Jg~<ʎٛzK#\cN ԴB`d1b@sX*%ܽ xJ#ʕ(SJHM3lv5qc"aFt6 L 8E\窶H-S@DDDF@=0f ,N,|jzSl=E N@?*" U8DDDdܘ4f6 ؟`Pg7jtlfoe3gelS!agfH-< l-#3K@0@l=dQRJ5;̂_kn&  """#쨈'U?Ӈ*j3!/H;\|k2cDqH&!XdQ@DDDFر̎%8>k;_&9P5f8n4jBPW Bx>,xw7EdkȌX"aXCV_%x,4{HB tH,q"ڟֽoO>O60/א3)7,gzxS>?4qw:>[&wvKmJ\g'B{g'xoDxCf&4 kj"$6w,qmf6B:HL~ r3qv<3=@j?Ә@-N6o&~=|9իtr9 ka3i=SB"A,#LRL}GɞSs ?e mLtbcjHY>bfgG\^ |Kh(LJԪi с-YB%Ͳu:'N Hbi\Kdظhg!C}&C}.GM$̴'38+Oi{8p|Ϲ*j <7@ز W,ûlxeV6׶YX;sxټx>O.w,#o p%<\Q~g%3En{f8:RxWǖIS'j;4Wz}Րs3VvΔKJ{&7ݲ ' '3ಈwA8((Q~XnfNXg'-[75kn&V_ Y""""2,lpfO0S#ʋe"ʓE#g: qM2 Wk k?̺^c݂5=^^vcA1GcUzE]|&qQ,[yq֯'=s&[hmś0%DDDDd/ޔ;L]Ef+ˌhž)o(^Dۨ{6TůPE2 Wcnc…%mh%0F}b{ cȬu~-g|Yta̙Y9}WO'N J8X}=L :f6h .(2kn&z^ofVĉ3c]DQE)t @{s'⋼ϗnժ,nm&NmT ߶uO'>^xG^} QϑK&zz%dtrh w [wݥ4r{l OV׀0At4C/#XOAZofB._Zlnfw~b3pःe*wϙYk9.<)6BMH?ZPc=, xEb$p:wuۺOzzzX%'+wyYr4hD-pt>>tE\\C0~m5C{ /}EU_A~+r(^ ϵ x)Vv? JbIQ /9//< Ӓ fӪm-Ӿ5::&ȗp2͛ɹ&|SCIz+r;qǀ8V>5$wx "C,щCas'h x(y}w@Ef6X%jLnr%͗n:YKt!t󿾟֭,:iٸMOdGA lV3DDDDd ,p[ܽ7b[82xR3R 3]DLˁw~PD_ ۈ)>1t躝]$qG6gٳh O$ds9^:YO?5cL< 0x.MEDDDƗA7i]S__!xWW`6fp$x;[ۄow kfvpp>~}cJ+ >lf7g1~O\p;fp`GJm6ww::~Q?]n^] +_]fƤz4`Г*j IDATҝͱ\Hb3wqVŏS|Uo~3 L>w'9{6<FTKK ֙ՎEDDDf6x 6l 6phbӁI:w(f DptDe w_;Aˀ44 Hh'2i2A2$,Q_I?wFQx"""""Esm ވs)} CO S imx֍ =' I_~`௙?""""""R` 'kCؘ˳h!KDDDDDDFc\Cc*?ak6 {̃Lfк}ٔ5~k23;FK苈$%Ƹ>Y̱*.[+rGÓ,<~olkkxn9=Çߚ^7},VN7ث$@w.Cۺ95> >|gĄ ;'8>CADDDDDD)0c1pMYFns/cLv pN'ĂmMg!=/.Kw>yp:Z/"""""2Ԕ~NFH֟||[X2s W|#Ad h:8hDDDDDD~e4&63粦{MQ2~6GӜ @kC $Xűcg^m2ƽ&ͰE%U<-`nҺ.`Jխ̷ͬٙurz ;rli}#YGeOFAcz \}H_J3kDwA0I$V`/޾q̛)3[CvX ,H$%jI.OӝHӓ^֗5 6Փbq|{Y58wOGW7ZK-|_})X! `'B@0lhR~]ӻjlHow<:xNeQ;1Ͽ;o/m~+{UI)@bXuŰX""""""5w_&:'E]#h'e/|3X~m{Ba߹$w͒esy'NS/8|="lH؛%C,=lٙ5&Q_?xl: l54`Rf'ʳr<+|cS*I>?tz^n9L342nmĀXYh>,4TY6Vj!""2R5f.y\/+~ԃj~n"ex~WO U׿oi!1q"b+ /~DŽ ;̙Ü9sxgwis衇RvAϲyff͚5lwVu6U#J okcr97Х2uT|I,Ď^&Mڥv """cȌ?_*>fǦpC,~ <ֺszuBΞq(4x[hjk#9u* !=o0MMM$ :;;CwvvҲؾT@DDDDDZQypY}hQE} 6ٜ< |wΌC!`uӦ:kn63Dٳgꫯr-ɰf{EDDDDD\ro}+>=WP>K<0ci93`uu#_~:Vܩ"Jqꩧh<"""""" ZfFL-dc?ZZO56B2b0_v-+O?4wӧO/n㢋./g {%I͛W0DDƂ :(m{4#L}SN%x^:ml1C+$@m ;h+"2)09g0"""a,WTձfv~6G LgafyETyQlww&.O*RJxq7;pw!^W6o=Mf68G3[YLݗWp/Ŕq/D'af+!}\ofKbcpg888Ӕ)qeD]fv.w`yJ?n)l{(C(Q59y3 0`#7SC!_]A""RasL;̚KB.u2UH| K X |̶""2FĪH:R~c%oAΐKYwˍIDD%DDDDsrD-CoC 8PDD.%DDDD6_O AߏEy~ ""ט^'"""E`85{\zan4ʏ.]"""v5dAD43ݣԯlnlXDDd P@DDDtaW e8QHM5 zիW~{0 g p7&w,ͦaFE* U9,{u#hGM _|ӟ . >"""2T+0(%=\JRͺEtRZ[[0j=nRgo~ï~Cab)aJvwry[DňbyT{5 ]g7=c|+_|"coIRs) ,===*HP__] l>K+\"k(|~{pS! C!K-}m+wy0`o_!}aӷ^o]=@,GԽ }}~uBkWXZEDd4JLtu#ԴT* d2T;$Ql|>OccٕT[g$f@0(`l!]&2.P?1Ck&P =W"DDI}$RJwII]D_] {ÃwyOߟʆΩW_d"c{h2\4yT@:wկ8rdÉdfֱDqb}ܽU޷M)GJ&B"y>Y{_|>#}: ڮPg{u;QgVoO-]W_ 'NyՈSD}KbJv>xOOȐrd2zLc[o,d0]ryAsAu,|N&s5?] NO?Sg($ oHdsmf4pPKl/w_QIf^V{>eThJL!NI$nfR[[[_H8p駳sF6 1`i@KK @wjRz0qNz]>]anfk{-@*2\L&ShDdqw٬%8.&Et '08Q>Q~M)#`//f/ۯ:GF~R"RloM X,%\… q3i 5R+r>O+WFsa > ƓSd c=+陼"""2zG,(?>Wb<ٛ#.ݗڧZ"2 ?c;a%~S8@DDDd"?jfs׮1YC1Q䄂NT0`p `l8k,osG0wn)r ˮ oDDUL-?"U{1y"]LWYʍ= |̾I0ПAZ`et }/v3k ؗ`i{ l%xWǀ;=]J}wuH;@ q0j0`.CCC_7 }i}e'/"#JKDDDDDc&( "#%DDDDDFfȈrޟ9 """"2f"R9j """"""""NcvQG `Ǧ}~o5p03P2@DDDDDd(P9;<;%F yax Űx X!!DHEUx>L|O\O\:gykk@,%b$'a8$X =(@ |>xɐ!I:MOgLOl&G>ޫ3Vxo1#Sא1I}K#ɖ-@)5f?!Iv:6ӱή,<N3ۛnjD̨Kt)4dsMh"P) """""R%jz[٥݉we&3[#Ru /B!Hut$rrN$iȩw=I풅B!Bg}'N:^O;7pwcK@!Bׯ_?ӧO<>(wNuXLk^oB!+P(ď~#lI!B!r-PSSÃ>g}g}4,X%KXx1)@/fw\yDZ16q B!hN0׿ub VbժU\.f͚Œ%KXd  JQ=L,ݑd8FF!B!wwrM7:bٲ,yNMƒ%K/~]1ڞCFb9]@ӍvB!B' Ϸ[uV|A0}>QDPXwH|| !BMZk t_kK:q⿶tPwL{chOW^nx<`&4Q27_&F kv2Mիvx x KXd z$z1+fuy=NPB!jСvuTǵŎcWu [!.z(ZkXTB$i8lܻ())2g .j/^Lvvv'FZb0F2@!i'8eKh]}Pê)hct^s58@5lkKǟvL14}:seܹL2&wĢ.o#5 B!v5\CYYY3Ms=71c>y$ЋUUmK(e[ܣŤ(ECqB!mi&կRUUJ)ƍǜ9s袋9s&e$ ^:Y99#a)كO5S2L!B>' 5{OgϞM~~~7FسIZSQVʦR~2n0rr;i`wb 5өWi;B׽&B!8{|D" HtΝKaaa"$ӹھ RtEᅌ;ݝEc&J;hÈwȄSl/hÆ TWWs%:!B!իۈbdgg3{DԨQא@g _YE=T4*vnbg̘浻}캂|Zkшh/u#:Re˖QUUf233?~ٳg3fF͢Exwa-ZĴi())I:_:Ǐg͉}X{s= &0i$>bXޯB!o@t_ ~Wm;yo?ph)O<p~oˊb70 E._h< `dɒ/:t(<{/^k61bq]wq1Ĺ+Wdڵ|K_O[x'4i=-o{B!B$) ۷tlǏٿ3j! %դ .{ߌqt,}t/t?׍ީSRXXkJ45_WL(K._fΝ]wB!B$zg$&X'RҶvNJ;֔`'#Ӌ?ˏE](etDuN<ɦM_|ʼn}֭# 1gΜ%>3fpa>ロ%/70b( 2_oٲe9&MeY|'p}%Wyg# ~rJ~0k,rrr8p <ʜ9s5j^PQQjB!BFR ;Z]9?!k/NuMFhzO1m8AZ0&f}ǟt?~|&Mڵk;p,_믿 6l?Ϙ1cFܴ4~_ke,XeN_vI(b,^_~93gw@!Bq6PUUUZkM0Lu,# Z;}~>N?ğR'==DFFTr&}q {wa=B!U]]}7H$B,k'l0ȟ0BPJ^Ox߰ܛ c !B!D8KtWUrvݍB!B B!BB:!BF! r4Ç[Isٶɑ#GjSB$Bx x!###3 &hm BW~ȑ#:&!H%%G+,,j ΖοL$//߯_0(,,ꘄ"zħްVBWXX80xR|NaaaFBTIy 2n8J~oߞꐄBau 8;nmQgv}g۷Oٞ&=m;-C).)k֝Bt0zp8| T#) vڶxˉ;y~th;Onw絉S}ﭹν]%+ۛvRm])uxxBuu噴c7gB4----+~I!()9af7FtvSJ-oدn[Fb;zk:l'SwF6ڎamje}'AmݦA թ Nni[߇ϯnTvkvl;;=GI/K)>Fli 8W* !J PeeeK ]GRBt' !_7yB]<4ݶN?m!z#vRhB3Iz.ࢺ+<:/Z !ax<;,^Ouujx4ܦ-ma:<<|>̙0dȐ.8$ ͔R[֟8$_:thZňbXE0bvM4h;oC"v}"FcNnsbֶcnqArOO4Nn6>&55UtD877;ds5k_ pnO# !T!gԨQ\pvJ6oƍyQ !DP Dh4uvR~OYwtݾ5 bnvuGs=3TS +\˚מ씫8ܟ"33[on )OI!h3Deee1|ϟΝ;yꩧطɅ}칅ʮg>qzb#yn8}* ,O\{)q'6XZޮӒ'IIMӆ7jm,Ο2/~i) ,vTY&񗣷O_&X !D0~x^^yT#gӧMM0=غu;XV0 ??2e ivb=$ )wlh04~֐R $ TVV80 ^/^y>k@ O?ɑ !{7曉0`g̛7.g@/q`Wu; 40i(e<B/"Wn84  <#F0zhfϞ#)//W^銐B$k׮F;n3g&:Ǐ{IRZk8#jňƢl ˶^=D Pm=x\n.7n+iTBc6ܹ;wfn&ƌk={'twBm85z׹[Z> 0|̙C {&IB"˶ CԄk CDbV qꪮ$Rnmz>||^?0dJB~)wq?~k믿;W$rكi7(i@K@ 9sO`eKhV`$DeM*J+˩VF9v^G:.4LP2]xL7iY rҳN"`$ZOп&Lژ1cXx1Q՗ IDATzlT$hk7ͤOgΜj횾LSh&calQFbAnƱ C/Qh$77P55m' >Cr2Bb1}Q^ … % zWoRKu@BVZ??Ƽy ͓@/Q߲-B!ӄ104R xPFk(;Yɣ'>v$X˶qW*^#$j!H׿r뭷&3f GfϞ=RS2fFAFFb1 ޽?N0uTƍGNNnjjj>cر㌧6dff2w\9 I(" RZZݻٶm'N;mO)jS~׿2eW^iw"Et/8!D#G;N$ $Ǣ揿N7x=]מ, ۲p\nW㎶'fߎ2k > v:e ?-@|^/Z. RY:u(m6m?cǎmC[omONϘ1Sj*yv?_|9^{->5;z"鼋/o~j0 f͚Ō3xgXjUg(?E]q!CsrCԖtATBB~.<.,j5!"zZH5hG09njPt@b$!#n z X ZڰDرi-1zh233;Ԯi\~׏{Mr7x#_ZIfvR̟?<z![loƌ|[jcUtonm֬Yb[Sa <|ÇB*IKNp~];_kMeq9{7ogؑ0,.c@8å =tt|\'}?M8rS]*TMF ۋt$VZk[)uCu_(k'Zצ*FhJKVV#Glvd׮]޽Ǐ)((g޼yΙ={67i5֫e˖5 Xv-9r0zhf͚ŴiӒ`m|>nFCvZ>3JKK)--_~qhѢapUW{QYY=se55^돜?kbeu:NJWHć|}5i]ߞ9N}e5ƶm\ ?i--DT&f©f;H_(:op!j!4` {R{RTJ-_[Cm///gŊ~A^zF͛_|q}/eeej/ e..&==>rFZ?{oo}[g4o\oDT"]E=VT]mQ1tFGj`[6|TSiqn\wp|cc;vpSJBR]:> K#ȬΌMt*M,:yF[{&y(..N7l0rss{2iӦvy ߨ͆땜dogĈmjkƍ`ǎ6 vMzzLZ㩎K!!kk9m_5c۸݊,ۉwN ZcEWQ020 Z' ǧHoplMii˅kC Gk/zwJ7%ՄBU>[sK:x82  BFǾsصkK3MI&o'9QѣvC1qĶaL81M={vҾ1cp=c6mDUUURʏ?Lu0t,;>]8UWG닻rhM2?žG5U|@RgOwn&}g?i{Ϋnv~kN/$0hРF~m/5Z -- pB({a|g^!-@w0n_7mw5I[Y=c;X[#D6\R|~Py8G4?P:u$Rg/ÆgX˅m;af|> h<\G TWW{~CT-wjU?_;Sٕ<'Ndĉ\s5;v[e6n_aG!?4ضE&ïq L ie].l+FJfB)vyLc43jwٚkc'7tÆ k: bРA\z饔Gj*9! !cdtź|jtp <PLlێ'lnwC6@"$lj]s4ql[ C5wdR x Yשn3vFߪ*>Ӥ}J)^oҾ3jжmv_5 rss><^Y !dmq w9 ='5em𸼉{Ad@?Gd)@!DQkzaG(ȑ#;x`0Zkjkk:nŒ%m۶lg}hW^yW^yaÆ1}t&Mرc[L@UW]穧괘B-sՖ3l61 RJzN&ё(TոMo`A$X].[ PӴoQZձbɍ7!Bdgg'*&ʝ>  6:fͼ+gvG!hÐ58^sΥ0i֚>O_>--=ڡ_RRT ??Cu~sSNe޼y4:~ѢE8l*T\Bդ@g[6GbPxwx=#k ([ÍCnXqvhowk Z(ŋ۷ovjÇ'm+=zto8QFuͮo>^x{5zL+qm /(Ʀ:.!J2/_}>z]JAV@ceЖ<*U%w ^AH-|{\m8 u#x=6qV[|9&Mjk}5JL2z4Z/'$ۻw/%s9ypUW1n8_vcѣ߿?deϞ=mjq{1;DU rrr̤q&9ج:Wk7 !DW@f69~q c* jQ5+TTs2L좔?- &|"V^y| er2c  o͢EصkW!ZkvٳLdҥwkW| _h? k9ۜx#G0f̘{i*]!7Yq֑)}/bN 7dE6ryspHhGmmjB6ih,/ߚ^7PQQQ9~n]1 2e˖5ڿaÆ&_*O\uKKK<ؽ{wsMd9.Qbjjjh0X@+>JۚH()a|v%8(Ԕ|Q'fay-]\us(9c[6%8h& M… 0aB?׭[[ڵk 1k,jVvCJyfݛ4?o|V]`]vYe%ۺu+EEE <8oԨQ|_駟n-.}A :B9C4 \<䨜|>iii 8¤a۶mO>dߴio& .Ljꫯ&77{ʦkG{| 2$i$' i>O?;ǓWXXw3}:ӧOmܸ{šψ#1bDbRK. .M6駟RUU&??s=I&59~ŊMoh۶m \wuIsrrwòeؼy3Ǐ' M~~>3glrIp8Ok9(P!zI1քCa2bt/n;&TkQ\ĉ*PAS !@7.\g2[*E,pJM!٨իWsϵkmm-<b,XD"VXʕ+K/+4#GdȑmN(gΝcY?8?O߿k,YMmA| O .C5XCyeG+| q]:Lu? !/V4cR P!2%%%?g/s=#Gp++G}'OM;lxs>eY?t ^Ou Bd@j| ҽ٘}5 c,AwOsPB;qP-,8/pQ,,%"LP\˲D"D"*++)**|l۶Ӗ{ Wt0(GAjGIA,vaB?bhbD.={z2e C%33 "Hb}8x`DXr%+WdСL4233 a Ge߾}۷m9êUXjCeĈN *=ƍ;w+8!2 ƢTTg'3̼l* b؎C4PQQQKEY5 swrO/"T"F4> @G,9K\#+;aRP!Ru=U$>>v:ġCκD\b_kKRBt%}s%TUáqy< +' i0'OVSQVÀ\rd;JɥqPណvN„ɵrP, GEc6\T!L1vX  !ID WshgTV3zxsq{ĢQ#9yXĢpHy9>. 3Lӄo!G4!R  cǬOm( 0 #*A(b?JR+R7*:(!B]&Mcĉr-<;v,aHRkC˱a5!~ ꇣ5Y >!C?:wdAa)K( :uկVmZWVA A 9?nsI InGx'$$9}0c(꼃꽒|;=VO$[ٳل]_5҉ClRlr+ր6LJa)RH @֤TJ|TR;Uo.?)BNl6?|K駟0h RSSIKK/j9R@-u 000{r6*+:|Ң @Xd8:z*i IDAT¢}&8@ er'NN'a],lFWSXTՅSr;cstmhwn'"6 ՊjuyUhCcR&UJjvh5|[lr0VS;udS@R3ŀUZk) !ڬJ;kucB4^u`ҥ۷}ʤIHKK#55d7Rh4tB֩\?ZoFN#)+, 0ɞ*M'W +N{%g vJ\ddv/u+^W( ޕC,^n#4**I79C<CXD8vVf#Gv K0Y̘f3Q *lP \@2nVl617̣>J||| mmɝԛPUE"c  cDXt8AY jb6 -8dbڴilٲrrrXp!6mĉ1h ~aZsCx'x9s o$$$0sL~yc ,`ɒ%dffJRRRz+_=?|嗜9s\5PEUoOvBFRG~cB4Qc)~bXIKjٌaGJasd:sw:w<ӧױ=zx dΝU_;ѣG ǹճ ; t٬ϩQ޾7  :<(BBZku]\{z>x 8p ))) ~l}bG?o6?0ӧO믿f֭\53N'gϞ%88>}k-Vߔ4XppYs&M۷o&]?p@HMMeرn]Nӟ->-1\ʩٵ]"c $0~?<ׯgK/%0ݜ1''|x>Sz޽{YjU#''?%KЭ[7}њs, qqq{+41/>ý*iݻ !D8 Z隒y5뷽@;o.~.a`\;Eڔ4≍&"$UGս{w~?W܍***kpO˿P;wd͚5|\zקO{JKKk k`;%vpxBՋ-no(B јРA_!FN X*ϖ4p;+;;q1Dh l2_22259ϟ[~=Ě&uLEEyսhn>$?IZZg֛$B!(ZOZ9&!D/ c̛̙7m۶n:y.hw#x{ˢ0Eb`_N"n5XƒC &j?[Bpp0=?O?4/fԨQűb ^uƚ5kӧO21cgҤI5"##6lO>$#GkeٲelذÇc28x |'6~" ^PPPpB\L3fL9tޏRJ#w7Y)OeҘ(sa \Npڃԛ%,8@k , &Z=7n^ǯ N8޽{=JWNqglBXf1!.ܾ}馛'<<ɓ'4KHHwxm*..Zkhř\NfeRZV 5C-ÂCIJL"&:ƽ`1[0L¤܅\?Oغu+6mI-X'|>cv@GtoĄG6xnUpʍhJOquݻsmHHHsR!U\\LQQO G)7 H!ZJ~iA_5 bw}߿! !` o[.F'1bo5kV3E'-22^x;0Z)5Ư!D h3j٬X+?G!DѳgO~l6N:޽{ٹs'YYYlzϷZqL2"o߾̛7iӦ]pqHtBfrxWHIInsDB!3<^={uW_ڄ&LӉxl6s=ݻ[-'>>ޫ,(O~[ ՜7QсTVVt8mR%P,hjJ)z)&MD.]Bv.gϞ^4_kӧYjsaΜ92g)Vq!^}UcYYY~:8̹7 ۸Y)M=wB*mkr뭷;!W\ul,\Ql,^pM:tD+,,$==at P6gRH1A= qԑ;r9U~a!Ѧ >%_CBAGHn%%%[Mٳ'9bҤIR8n}isߴvG^~?~~!8G/A,vgw(B!ڡnݺy5u;|p8شiGk׮MM@ !D; &ԉe5EGV!v*>>ٳg/vBkR?l!R3Wbbbݻ7c())!++ !qqqj\222|><<={Sٳgٷo_ d墤<9linQQQݛ())GRQQk׮DGGDII ߿09J)HLL$66Aqq1Gٞs!E"ͭ\.iR/*B!Xn.۷@(++fBYYe1=z`61 cǎk.VZըƸq<?5&L`Ɍ9ׂGa֬YSg0m4ƍGHHyyylܸO>M)EZZ_|1&44󲳳ٽ{7~)'N8}0h ^>}:'N㥗^ǏOjj*Æ #00nΞ={|aø=mذO?o&F]CxT7dVbk~~>;wO> TnݺqW2qD"""^رիWp{gn79TWKk]wP!htl6s%B!̙3^ٻwgm[n+Ĺ6D>}ӧ_~9k׮<o[~u ,,ロ.{M޽3f ͣp'b_=_=^5\øq́[7|pnsHJJbɬYux|nΕ@Bg 4uILL;d̘1 Njj*&MbŊ,^AAA^qo߾󣣣= 99{wC6Lĉxwjlj?)&MP-00q1f֮]ˢE~^Kz؀O!ڊffBCC7oCBю8qlcV￿%%&& /pמ7?WXX^{-O?4M۟,229o_۰axꩧ0L(x衇[LkKLLGsIF}.r|I5k< qqq9Ϟ7l63{l}=z_?_>Nn<^/..jkoݫٳglt҅.]Թb̘1\y啬^i~appi $99Τ}ĉ޽5k4z꩚eѣvzEJJJrrr> (Z7_!hL >>oÇ3bĈFUBIJ{uJ)5k0i$fK/'ɞ={طo}6PJ_o_ǎzo߾|͌5xϞ=yW|!>>c-[j[&L஻Joj?u|[nHGwA=;v,11152dn俠uy]cZ1c]wG"%%{wsz]o &_?e˖g}j'cժUlڴɣx1uTki!C< JGaɒ%ܹӣ!arr2g/*@͘1뮻̟?߫OCDDsa̙5F|B!f GhP#ZoPJEJUo_թ矯3PJѭ[7uӱl.]ZgN7$33;ݻ3`z{:$%%1k,cab }:{;wQhB3zSzM/K=zzkۺӧn9|;]2j*u5fB.[>1._;vx'C :aÆFgnϽ_tE>ߣmj+((3%++X}5;رcy0bĈFߧ)8Шӧ7gH^oިu͜/Ƒ#GzM/ܒ.u} !0RBd>Es'R;RsRSR Xd ?0O=/fǎJRt^Mp}U{jӦMcҤIM_\\f:g54Nu1t~ vk8|0Ǐ86dȐFtBϞ=12 m~l׏[[fIIM?B6@B4Zm-0袵Uknk&;wXDDgn6c999u6LrA lj !DkBF'~$jjZkȴ\s _~;00n+IOOo+ɜ4i]tiste]u|ÇpUW5^W_}N QQQ;魱-aGtIvq,%%뮻{$&&2cƌ|\@p?B$!> |0HZߦ^>ϵj*l6ӟ;kr_c1x`eeeZU&vb޽"##}d2q=qlݺAۤfڵ^ǯ:f 5jTE7{M] mؙ\k뮻Χ[RR=P.[>ؚB$!1 (8[hYff&˗/:nXkxט3gOƢ={6#Fz}ڵ'x%EGG9ViWbȑǝN' .s {{~zN:q,((_=2|k#GY\VWkvoǎ|BBB~]r%7_~-d"))Z{{+ !8i(gZ )/^LTTiii^qmq뭷r?Nqq1Axx8ݛ^zyL+m֭,Z8[V\ɬYQ U{eN8u]ǤI]7~.5vb>|X8fΜYocF)4މ'x+2e }kdl޼pOӯM!:cDzpBn6;^}U2e iiiL|M6qF;÷~޽{s),,8pkAAAAad3gx=z5m1:NVZ1"ZkV^իIIIaDDDnq] iCѹ;ŋs뭷R^^Nnn.K,aɒ%L&FIjj*\tE>YbPmðs׽H .CtT?6$$o1("..J^^gϞm&X9}tS;`ZÂhϟ1Kfvȑ#;)SZ4*pQ(*n4*A%VXLV B,#` Ƭ,If!m\ii)ǏG5 ĨQضmO~FϞ==8qB UNQ!:#zւrϏFyof;v`ǎkDEE2q%L2+^EB|i/%v=UF#Bi+)rQC1 P(2aUYˆHL`2XBX%E!۱cGl6۰[np \z].^,Zgg0D'1 ې"V,[Ɋe+yB=Ù:u*7pWq@;chvP*q12y:..Dk7@ۧ,KSƢB #>;IB{bj "H)x|Bĉ9}ٳٳgO֊!!!DGGȈ#X=]f ~mk~[c>aNfl gZ3Bʤ:b ӧMgԩJ 툡 Te);ɚp4w% -@/'f<SH^( 8Mqe.bv4BU$P| !.RsJCJ`ֺ¯ !ڤbVoZ#99dqF}Q!Q1$2!:yy(.h)t||<1ydH;)]T rN9oI&[0AP98JÆSW1P ̄Z#;,!ZzR*Jjj*]t$6OKY;g[)VV$A{R9QB>_Fnvש]a~6;ZѪ֥Aq~;3~])aZk4\(` h[:ei8lT6 wI-=}SwǦD 6\fM!rUjO;!YVVhЖ)@kJO;{ o e8tU _ngRs4 XkA۝N<3m-Ӑ@WVVJ)sJooH. 'v. (Itܳ&Vu{vr*\.RBt"Rh䝡4Tkd@d?(>ć誼 @Yܻ){mabp\{ i(D+SJ] P5Z74t^`Be=I!:)qO\\G nĆ\Zvp (0[0YkZ4 #ƅ vh$(>.` U[q(ydWB.-r.R !D 6t~FxEGt*yv*\6p `5 ,-!wZ h)JّQ&>a2_꒮,u$4ƹ&)sIJKܽpf vp&x4%T%G]70ʿ*OIIy=BrPJ5X):!mc80$ LV@@>=%2^ΥV_{S.l|;p8V?Bt:QJe;!hMβ8+ @#P^TU,Q5)zCKDZZ*MB$.C!I D ؋ 9,! Wܳ\e:Ck;1a,*+++mg !:2w_!4YTu/ρCeo^Fi`B*++;-nʒ%BNE 7Be` cW."T'-rYt$h60;!hmR Fss뷄)f~&3׸*pH/hYa[VVV8SYYwsS!T hϖn糪eBtá].(h^hfeew,BڤU F%E e )!ZLVVVJ/**;!DRXXX8i^(sSkS0X,B00~]VVVp8njw,B IDATRwB̰ &?gA+j!|Uj%3 0ʒEBNI  5}ZXw@ @qJ@ዬNR"h֜9s0?gee}x_ѩ4mV @r,voG(WaUQQ%''L !trRñɓ;!'-/8n rgA``EFK$B4FVVk׮vN:Thh9000d~. ^Z^^nhcBhnPf4PиtU  脲]v]XRR2,U)︄ma_BR F` }oḾ hS7!B2R4N2Sf~09W6k+@p{:!B!huF^Wm|Q܍M؈P!B!DH@4½\ Y~N@{PrzhJ&Z?!B!h< @6z~g98~h GeAHaͳߤL2]]B!⼤ `6G!%Q.({6ΤC\&eƬ,XޝQgُFGY-y_06`l0ڄR&&-@ hH o&) WJH)KJi 1.b7]d[Kgy87I\ge<ɓna@@`cn fB`x!wj5NlJ ~l', ez>L =:ڵ 45jTK4W7.jMu)G3Rh?87 4N fk#܁ed1x /aa +VH$x<9,:jk۶y뭷ӡ 0h,}c`@.=ωi0n1FD>&! .:… {UWW󊈈fmQr>qzå?i] yg@Fk݈ &G?o|%SUUŢExgرcZz+]w_W"""""" AB8~-Pt?иj߳05YžYV酮 PG,.??ꫯfٲe]ӧuvڵk|"""""" mȋKZk&'L "hD|؞|fUIJ,J֬YæMcn:2e _;wn>/2wxgxN8"""""Y, '!ES]΀p|-7d+&+ `L6tM  ?u-[pŸˉD"[|s6_җbڵbN d"""""pwK;w.~?e=3Țߠ|iK0OٶșFJ &I%K,3f|꾏<kL<h4… yG+(.._*cƌaɒ%\uU@DDDD8~?>(_~F0dܹ\ve\zcva.=^.*b|x6Fb=6>?yb D> cj*~m~_suױfnVFujkky7+>oV{_DDDDd sϥ%Kp}qgsW}5kO6L@0 k/@يT3UOͦ$4r}EP 8_]vqWw/ggg#p-8'mҤIl߾ Bկ>իׯ_`.r.a=ϖ 7IyXoOu9l  ;d {s4A_VV?L(b̘1bǿnmm-HmTWWo"""""PVV>,gƺu~A{9{9|>s*P^^SGC2>{' ̖0UrygP5xr|E0&m+yQVVvB{ё#G@iii*""""2egg{BcF̞=K.G}{{L=2`~OH[S]ҀZ(=0ٗEQ`9"wg?Ylܸm]Ǝ۽4Ypm<a_Ӟ˦i|ѹOc ]|rk84 qiq^50O^Do~ 7MNM6i&\..2ϟsw(Qa/}}iy{S]R ,"~O_!Y<flST*,,3 ٸq#SLoxꩧx1[^~]\Ab\ ?0z/w'?7>|ng#T1{wRA1 qo=סG5믿>|0/fXyǥ^e]Ƙ1c y,]wlrK׿D}V0qs,2ץ''dc{ 9 3j,OA+ Jʘ>k+ ''˗yf~JJJ0a#F`ѢE8Cvv6~;EEE)f~uv~e7Ke91t{9YG^H }7Nq]7s~pNWq8Aȉ1=; W~aSD"Y|9ַ(+Ņg[a֬Yx~C 2iLxgLCk{ 8I8TwR~/^4<_0 s4{~̙3 B֍57x'x+VԩSy袋zyyGx7(,,o{7Nu iЂÂ˝=B$#-q>’wq}%1“^zGxc;]tfc6-[xw932e ~?%eL#ߧ /_DDDDDR^b'}laa!]t]t램{(I`ǎ?y; W^yo_9'O S/m8O<x饗mMT"""""""}{;pSf~?eʔ̟'u`&ӟx &t?? .-m}IömVZEQQQi`#li"@aۛ*DDDD$MQVV22NkK/geKXf 80?~hi׿uƎRDDDDDDD2ZZ]iꪫ뮻R\HK9 ào~i&6m?<ӦM#;;;刈 )iRZZ2DDDDDDD@DDDDDDDa@0@DDDDDDdP """"""2 (  DDDDDDD"""""""Àa@0@DDDDDDdP """"""2 (  DDDDDDD"""""""Àa@0@DDDDDDdP """"""2 (  DDDDDDD"""""""Àa@0@DDDDDDdP """"""2 (<.@=qz`ZHzR0DwqsL:10jc @aS\ D'$#"0}20-21LC %-.@D .b88ѶN<C 0 L6=> _Ї/x=ѹ_f܏1T~S @<%J{c-ho%ޑu\\z0   Fl?^2W`H&S "M .N%NV[^KCm8NM@{Y`3,^DF." 0M"""j@ 75 2ģqZKoU$uii!a:T揣xl8"+byJX@C (9_rc]3O|W3;$= Yz5T, ti4M\\DDD2mMMMQ0|EDM4_* ~7*8o>}N"٥X/k """j "DdxF}2@׌-MSz1a#oXk/q*co{ѷol۞3罪%z$NkM;5mԷ#w2fCO @DGϚ]{b;MVቴaxu_k}߼NuݎqNNE'롥9P;Mc '5ux4WDaXXO47?|1T8bwP'k7'rhd%;l VyS^`X,ōYzO'c}6fVh.Q:hoˋ{p]PDDD2΋{<c[#h\l۶ ikƩ} _ܼ*Fcu]G 0M(*ފPzۈF!͢:N"A=FK[}m Db>W*Laea\bYD4.`cg)hVDC}1# 3j Zz18~FV'J6<hliU\ۉ9yN|xp5DkN%Itd%G k utxg#yS>OGuasHׅ;Ԕ``Gʪf̘f :ZX(vrgo'rn0]Z׭~Ǧ%ނs'H;$ \@ deYKDDgE۶P\5O4-AG˚5h֭gݺXi9L6 0nfzɛ Hn jvo?Dk:nM8N"jDu1_DDD2mMMM9WDd {]jJc܌=j={mչWG4D Ј{!(?LMM[q}o3'v6:kA<AծYXrwn5q\'v~9("""\G[[9aeue]1ػ{/hN"yނڐi%(.pb|r#GD<~ݺ46WƱjΫ0v WR~P"s=.Z.HyӲx{}m.svlEwRyɲ(\MQZ<(--. cYx1]vjD 0zF#4*a♧s;,ͧ7vd1_iGs9}~ϓem?s>eܾ='uקg{4)MX V Z\`!y-r;,Ha\5_CDDD$ٶ 0@ Wi|x^:˟ܮ!i-J)too^Ȏ'/'o怒huulքx1F,DzT_I$ ;>7Y']۩^bN4GRDDD2?ei~> hԈo94]3m{'S0Z6PAE;>uEqF [ {ikIb'Oe۶t Pm~8D$ѳ۶׾ (߈f/D=oo(aX#F˫0 bj+uhX;.DDDD۶c55584%"X7mQk7QXVx0cF|P\sM9x%%իwqy*{hȶ|sl{&bZ{tDRx""""""r A 5/kݘ\86onc >2vnfV|L%%k0ػ,1!>F^ۿwVH Q#Nmc >L3,&"݊g@!"Tq E ߙ(Cqe~{o0jT#k|8>Ѷ'&8'F 9m PA&hoimk#+vy:ONyg\h9boBDDDDDDN!.v$D4b?#A6<@ĭnH ArfngX@DDDDDD!.zf׏.8`{4J]TgO=E!iS^x"N(VDDDDD$):jZtxp+i=@ݲI 9VF~q~`2<bphޚk{4.G%̸)L˞jEDDDDDt.@R#V&p~-6W%}z4؇v VWC)ZDDDDDDNz Dh 4oLcaVm9…|~CMY똕fssA,{xk5r sj87JNS-y.c1+""""""}P04xwhL}+6}Mn;XNljZ:G'Ç+h:`m7hFqqqc. 7 x8x=%gbxvlawV*3r;;w4[WC+&ΆʕugTҨIDATl""""""H4v4#kGw//aψ-8^_q~n%z .fAnf0pa?PDvlæ O䣱kx"nFO_#oMZ Iₑ0 =EDDDDD+@W PSP`}5zhL=u\|>V3.8=iX5^ pMk V_Ie$fo\@ޑd$C 20M3E """""r"|]|Th;U;KX~VmbMeP~-D\ LɼXegG-Ι; c428i|,`)2_;JPz zZM ~8@S0~ww܌z2voO޽HSQ8nbxL,11-:DDDDDD2iede1˚{?`3uY ȫ!Ta Z6RK-&p;ם=qV#>a4f4r0L0=' ͍= \ЗY͑Xmlf (-Z`L,`&h((HcaP^QF[o/|\!VX~O=`…tttň#0aӧOg~= v@Kj:mI S  {-,9WXɓq]+V/0|qJKK~ <) vnq OJل{,@`ď/` <w^nhh__~ 7o니i%\ ^cxJa:䜍9,5lSY5@i#  xz0X">(p?{޾n: Ǐg߾}[… 裏غu+s hmme͚50~c#>3giÆ 455q݋H&S ;WLpf ua_NV@8=E86] 89c&q??6a9*U$h, up,wu/+1bv_ioog,\66l\`ڴi7ԩSyWYf 7patn#FlٲyH 2Ƹ 扷障yVC,̞mT {ɣzU)?o7 wAEBya04lfڴi8pm۶m;;+Io Y`wu3g$''W^y}k< aOڵkioo'H+oeeeTUUl2nk>|kvDDDDD$(apm{_c SZ6^KFp #!D(yG iZ6c֜˃DF Ex''Dܶm[`Ϟ={}Go|7O?ƍ͝;k2{l ̟?UVt`ʕLj|bҴI$c ܷ-a9k&{x>`7؟y;zp3(#20Aۏ B!ڎb1a$ ,bΜ9<䓬Zٳgs֯_-܂_qLdʕɜ9sDDDDDdhQ! ݯ>ɤY6!`f{3{Psќ@Vsd@py?9fE87/ ݻcZ(**+VSO~zߏGsxXt)2grssO~>}:+WdԩD"}#QͧaSJbN4eu)`|/M+& z1[ztzg,Yu]͛;Xx1˗/?g̙^_cR^^Μ9sz,]Zvͅ^807("""""CzdHN^'(m夺~u$^;o%8Pn@_Ѓe`zz饗عs' ,:G?-{}_C.yy뭷馛⬳weҤI mO??lZ)@Jd3i$ncsB^~//M=^|۷o`~Gᣏ>:j ._~F.m?!s^{@O-F! Żhiju\'՝P8HrBYILĴ ,´>~_*,]h4ʎ;X~=/2eOO75n8|My/PUU =rWssrl2.~3f͛{NEDDDDdPǦit6 LRUd5H>,DH6GuFS[g~|^벳3gQVTTPQQyMvҵ>T@DDDDDDdP """"""2 ?g? DDDDDDDԥMh"6mȑ#h"""""""rf~ZnFzV$""""""2tMS"u] 6@0xR]HK9Yf Q<.UD@"u1 \NJ""""Qh4%ŁT""hKu"""""&d©.CDҜio׼}/[?9eiD"?Mu"l۞ZDDDDDMZOhYW^yexiXE^^=PKxiXEAA< H$刈d4YDii)W\q5WDDDDDDDN躮KKKKJ Yv-dgg\amũEDDDD$ݤMӧ!+-@DDDDDDdP """"""2 (  DDDDDDD"""""""Àa@0@DDDDDDdP """"""2 @,ET """"L0T!"rZz|դteòBd=>êSYH2aYd2d*IW DdH@DDDDCz<=8 """"@DtPDt&4@D2[ϰ=CDDDD$]mv[^"L Vڶ]zDDDDDQ#']RYH: L=>t04=`T#""""L۶]P/,/""""rbzNa"q˲,+U0m۶tض SVȉ0 .pOIw={`4HZ YKa{GDDDD$ݙ}K` v=""*}|-刈duݣV655IrN;HFI$^HOeWٶ'ed>Ok_m)mLQ9"""""@SS\R]""X's۶H@K?IENDB`3Depict-0.0.19/docs/manual-latex/figures/voxel-representations.png0000644000175000017500000374453212640746376024573 0ustar pcuserpcuserPNG  IHDRIE޾(bKGDC pHYs  tIME +j% IDATxyU}d2Kf:{2T5A ʗ\QQ "ܫ"*Ӂ$$u ddTwuWd&lzt?}ԩSSNAn ضm۷o?4hl߾m۶T+Rt(uFP+~油C +?7o!Fe cue 54[ݦ mR( BW˗x3pM{>4Ad`E7& Ы AzFJJ9ζmۈD"Qe9n  \|^l Nd2NlY~v2! B#w =\$=H"C a~6m$s$ni*^1A/a3u^~|mS=/7y^U˦<LrBIdgghOCi ǀRNu'.% B#" BO/s{ܹs'HaÆQQQgÆ r ^#YxDlqăhx-[ ^GdkHR;0fƕW]6  }d$eeell "H)ki B;w]  :~Aq.=Ilvƍ(++cԨQr AFu+Q~,?%&khQwe  : B9" @CCH#GRZZgr@5D my'ea ns  >" %ݻH$BMM %%%;kA-~ GNm㕃$;]=U$+/>R Wj˦]yWv2*.,JܞIssy@&igAǼtpAY1AAzIAzIG$a̘13~xV^-@&/lWviuQZ:!' І[n5=I><*'pW`f~]OA^EDArEfƍGaa!'NwޑsN(ۮ; Ŀl>?Vl&W~E)C8/tIR^^IEDwp~yɱvH ЫH" g¸t:tUV1amYzy2mPnqVat*ߨ.kc?ԈSӕ'~t 3ʬ_{OAAzIAzȅIbs~m&MDnn.SLaŊrF,xoܠŕH^(6^9Hsx P'MƻAݓBr Mv̱E@'PG\ z2ۢ.D)O=lMFVW}&IHW${졸2va>{ 0X!(me{ߟa]" лH".tXE1w\~?Pp8LggvgNP7'h^ 9ˤҳ3TK_]6B&F8Ml!i@y[$8ߩ0x7̩C_ݯZOYWY(erpVc2s~NQ]Oa,_R+6OD:/[$" E޸#AWD':.?eHZ,aYE=%.S IAb#u)1T QԚ/.ﺿFfDyTw,Pqegv'w%xha$rN/oT$8r1-p kSd0 $> 0Kwz>$͈#HII~?矗O"" Bp8e]FJJ ]v/v;t2!m㕃UσkSMH9HA\j]6Uc8ֽ/ަ-6ݸU4JaoxӭL2f65ryk"y2N ]VFdzvvuB,-L>i^nt3W [N ߟN'ΩÇSXXHJJJ?S:O.v3`wL8 5TxfÆ}oyy91 YD$Akz4Gٳy7iii9mNXVUogbu'ܕ $.O}wPF/j7?/$8MkaKjaKZ9e|Q8ZzwR(&,H$dl& OGS2Lu7Olz$iN:/Iaa!eeee{=c ¥ťA~2z HoݑK 9A:A>$ =bUo0k,Ҙ9s&˖-kS,J2!AUԍ<9H>ǕV{VƷ6 0vw~2!(X>JX', JsX_QoI}╃5NHFI]J+63D?E6"ɾ}!<In>A8sD`YD/+"  $ =bdf̘AFFӧO筷ޢQ+$Ne-/6+GsN@V4KwَSZyA]/tQJj|['4ƆtO 4Pf϶DV& M.b*g$B+|gloukՏw3ғUK&d=JnQCxZmqلL"J#)_?x{rlqSH"Ard}p[  ." /YHztRMFVVSNeʕ?~'dRyYJ>'+Dpz؂-x{szG{UtfSE{TLrK}Pk;dta.|jCTAb#^*v>ҹRU&q[^}m<&y8:^y#6C[Cڕjz\" $璏|OAAzIAz@_I/_Δ)Saɼ;=z5 P {հ3ձy-}8,'ﯩKPDS-= _JH"cb>b~y1*:aYzbxT93v[-V9R%% O>0[V?akMweeeܯ^}}1ϜE$ٳ8p >t " "XI&ĉYjGS Id#6&-xa /9HgsHWLAFuz?hLhu̴Gdg^CscI=U/+~mHOa&𦇷FH/Y)mڑDȶqwнmkc\ eOIw^FIyyC$y-Z:"A&.?6C R忨mY#G}n0}C;cOx9~_mV[QRLC)<`smT j1msOF()gy0[ך"I&$8~8^\se YlݑK7 Y{It " /fƌC~3f uuu۷eNQXsd䡰9HgU,3Do-\i50TCQ [bKIZ5TaM#)לq̐ (%Xh*;]<k=ڛν[ jlZ?OȄ4{r\X ,㙡}l,Gpdy"y-7( g襗ǔe6&媳nX ׻C_# ={ˀػwyw+0X~> z곸 $ QF1`"H$eYLAz$ =i쫬[OMM ~1}Pce cg1*a#WaVW;>Y岙nep=AuX)SMKjcy]yLJjv[8E"7cH~D #]qje*za. pNb̓ռEőh_sS!SVet U_Rl+qxP5lXZ*2N*y?K}PzU{7m'sTN\n!3ݚo\o>ȰZ %^9HZ0ت@7سi7ûoOg/U >ru Wq!p6vD$wٲeeDON:;;Y~=qHGG O8wIgg'=TA$ =iD0`#G;' )$5HIlON5`Aru$N$BnUi*vk|$p )dLjjK&+ ;M{{|zP TbJ-˕J5޲uŞs|fP6!W߉ )+U]ضAgr(AWAt^8<騰ŢP d@z Tg\W?#vx؄T @3z;רB 5&Cj'+ peXvq,}܆hW^^FY:,~b'w2HVZq/Fm1Z3/& H7\K'>6 [pO;t1hf = S*bzBpu<~vHvvvY,?Qmd_z?`[I"g-8-?q}Yŋ;v,whnn{W " [$III9OٜK6nH$CٱcGDn9?Su2of|&,6wL2xꈻ ;rC] 1WS{lAR`[xr]f'.+w>^w/5?[ICKjW`NB"P~gȟfF|3%]/lM˞죡RWkH(l]z*&x ?-)--xS58:nkbH{*|:5zܞRPm 4E J2^4ݭ=ʹJUymo k'Ync:v#ImS{R]owz˕ىex#p#93W~SEH)%c 5M{M-fi_%rkh}_p[JyyC$y=9X''BW$ l/sFm B_`Ϟ=<$Vo{K[[lذiӦEzJ \H"p:@>[nj ~[}}R՛zԗ w8jFͬM* T˦(I)80B99/{baP&̐4N¤yZYklbH>m/XD׻ǻe ۄZw)cfۧ4 ̊ހe\K̂7^`ZHˣXV) J zIL˥5xnv{RLtI~IFH"$~5T49HE?8xx*{pQS!1uaS IDATLN.!%PTca$ym~p`:@V}:M[W$=VvGEg.[$nrPK ׃sCt~mS 2-[HG\B aܹ\ڨcE"0" )))̾n۶H$ AyfsX ؝"6jI E zaDH *M ats)L ~[^v8b!dLP+;t=7%$w7;LytTb3K[]J˽/ Yb%afLT)؎zni M5/#6w"GCQqkkqpQSX Q7̡>Dr{6BWe&rUZh:{Ey^fc 4dxO-KlO} P>୦]/w>xl2O7ímnn&33"pb)$} ~?~?@}n??/q#OJ%$ $l߾H$!Cqn}9H9-0v?!uFPs|8gWX-\aiojU cu[Uf3j[z.0k^R+\jUree3Q4zIcb=1ļJ6m&XZpwoPVV|{n***93h 6mDQQo锞^Mۣ܉'CFDAӠ$Ν;|LΥIeelVIUϠz0CNq\!ࡘ l9Hl|owxUiQ(=j#YYz$oUn3mQUa(± ];Ch^V|+vvKUeSZXZL]4iz {V!`!4I/sxG9VܻOW&4">pǚ[?jk]&CBh^'YVLȤF}͙k3ԾJˑE2y@lICnńUPwy5!;5ѦI m9O#_N _7mn ^Dh~ vU}UPzU4440x`" u@>=m S;79n$gBYY&P"t"mmm"&[n%33o᮹ꪫ(***>Ig E$ IIf O# 6,lqZ'ߚ?z9ׄ&pׄxyu*#oemX  B9-~`$67ʤy2*|[UZ rbL-pc##RnPg A?V(G6F'xK6Ic{Rx{$?0ZF3hO~ mplq֞@$~$?YBoرL8z{#?O7 \H"p:}bOÿ*.0 PFl\(V$E@^vR5P12Ab#O0)Ch7˿Pa.-֓ܟtC YcV& +_9nPVElrC{y `;L4~UJ Sg}#B:c(E :ԗ3ėLK`#,H=7dve3$7O1ѽ=q2mUXiIv'bxn$5n& ( Up+:U mM,G>f^9jƆhqx>~.s`XDxW:JAZqŒ:Tm:cT/aaBqC7V&,sX>ʂm4R[%qaª&27XAGa/D?9*#+_A M#={qӓi8w` S\P" E/1#><\"رc/%Ir MMM466r0ֆϑ󑝝MVV{/>}{֯_'LI"EDARI"ZL2);q5#^*Snߊ1ǹfh( cl& 3j V:w8WI?O'I&$&'IEGrz6'~N駡W 9П ؟bMF^p2YGU5/}]Ż+b $j$ʹIV?Ar #~(σG:+ZpEO|Ku9kd64,#6WX!V;H-.i1IN&~QbfBh0{OԃZq rP1lR=Ȫ;ũp[-L Q̋%b鎹eT_C"{z'n]C ]8 ޟ^es0 5V ǀᶸk fPDO4A * )@0! LSxL.|v/p[477I%a{4;vhmщ∽g߾}|>>Xpxg֮]H["ʼn$ AIy G3M^J@L8?wPKg Kr'FOmZVg8;X%{wBs<0j%ʔTg16ݦ97|~/j?Y!==/vfdϏ;sY0 pʣBӘ\ O)>]< #Sn縷()mlq;_V+IY2Q벮r=`<?d{4u7z+o^fwݶA9t?k)0$T+a=n% Ucc/5b疠TʑS'a%C6[L#R0LJD5l2^G;K=S %%NO'"|  ..<ťIJmm bWغ5ɓrS$9p$--ꫯx/}9r$w廉?7שիWi-lTg8'yID$+H-7qzyKӓEN(~P󑞞N{{;$\(gٳguV\az|+_q;ĉ$?w ,AD4C4v +eSu%qj TmfVTzj:TXLUTMN)PIG{һ" L2y| 6A8=%*+IUP{2`C=/w|ҾM G&J8y]ME+5ܣb_X*ғ)7ErX是Cj]R䖘rkc_jEzp+|E2R;PرB}P&-SgCC;WeWPNp>_\f[#M 5x?\o 1coۏڷ!|a͆}cyx3!.g:pMB]́p6n;oE #r!xҌ:) eUo?CwbVM4X[~lvv5*P U -m#PrX;&L]BE,x}Y'O6`J(c9Ȧ&''ey:F0F-uXr#Gyw0pAsf-t<ťI5-g;wR^^NGG@ cʕDʢ^1ogg'ge{|ߧ{7{ypq!" igEj ,+Uڒ %Pӧlٲh@*9ay?x@)'yV7Ge=̓AdR̦$Mz&`Ya^M`6) ӏScU:Ŗ齃X j&=`1 ST{bmSll$ RDϼBB gUBBxPx !#Jd zGCCeeedffԄgƍ;{++ωI m/D|tvvD#wk " 3Ї.!Ǥ[V̓a/G[19P~U?\A~^uWR<kuEsʌ $q&+e'f)U- S7CzrCt,vE=dOCudot}k@l a)a:tѴ:ULlkcX-ܨwSEr&'k"s1}4yH4-sM磪-"{TsE*#:a*2W@ zR|Av.Nx_/vo鰥aRi 5;m'meZ_{0IVRZ"]mDTv'p/,b-P[e4=囱ƴf'og 5fTǹ=lPxbvǞzݾlU IWbdUP3rz-pP5}TT̗?ywB~ocWBS Pw̐IV^ 'ҩBw=_5Է`C+K_Şx8B4ja\M۝HlDCTOMeĔ6>Ũgt- gU`'M%e:lwy&_-Mn X2MMdf`Y`BomR0S ` m!d*X`$e@7I^xDRKB|>WW7V͍͟w^cS0 BYXkT~Cxbу*6ux6R@ 7QzlϒMȠ!mB#2xFXq^"_GjcMEN;=u`I>ňTc,-Td<6,ݐ5S{ LPOM\gBM i뮌L`@S? s|t g!%XHXf>'F[}<@w}n y׺3}ʼn{ἄ< 4ɑj0cC`+MD2v~CۏӶ$dH~vS XFi۴*&Nl-b! ?ơo0}N' +t(͇{$L>')(&x,TuL5'u1 'پd@fZO̓a{ Ed;`r@ee%eeeF$Z8N'@~Io[ D*MI[Lh7_DϫEHIty[zo^)Hh{zb@{^p%|/Ŀb9>ریh']:ic`~s,]6fZ̲h3q3G"#dOe> l9$6rps$"OHٹsgT$##]usN '5cƌ!jժjIVJAH"p%&Th?`=Z-dzkAr]D'?U(5iJ"XٿT g~D A$4]HFm 2T2|Dpm@0tRM%IPL,M#OIcO#NOJ٦Mqw M3ls:ŐjGZFR6 ,aRڳnkI=$o@IƳidezyD/o@~HKɜQ}4?;&F&V*3U5좃܊%c9 )*ރ{?xKl\a+nN}>*a;%|sFUs%}4Y- 2AQ0);uH^EWMi%+[Kco+y`2, r, !qԃU,X+]ˊW@*`Ra:SŠ1>mTҩ E9)9߃ZGd?E[~Z}^Ӥ 26l`}2Z I糇vR8I*h#&RI'cdFGLEb BDg^~#ce.HGl[mbDbuq߅x$@zD LLدzh:)e}c>/_‰tNId=Hac~X;Il i|gu)--%//G}6(//z"իO7|s ::bmŇ`u$v^{[I"}IAN_$ k<(<̢XaJ;*1;XBjkt-wg2s\:дz~̝ o .09;+>TU1\>Š!>i~& +@;3(T\r#L` K*v={\w|K$cgt, 메%h eSp a=_t8mӢ¸=Vf+:<3y^=~]Ňo;X>At~\6  7=,uk:"h^ږ$-nW.mC0?Gg{s(?=Zcx%h+XVl\/P!brŚAu91ܼI+@b4:0신3AL-M:Hh.W鱗iDA7p.X)H#~:BA_B&'P-/e,W' SI t◧ '>@'@:)DH/C/Uok^Nq)QuС:v^:SxoQϏm ;~I ޻Yh\:3~vIF pTIT:ˠ<-nXu3)h$٩q㴽p5CYڒŁl3.W"BwŭJss3'Oz)9innz~#{7@b#6 +KRSSͶ6sVn=7tPYYY$"BADANθ&&EzYfTQ~dZ:f>:T¹L 1!,=8x| $Ѝ}g!E\dqeޖRڻ9 RIDi$Sc&{63 hjvZ:q8iV7ݴM}z$mRΉfi6Mqkkrڱi-Nj,Kd) } Dʱ8yb0ˋyQਅd;DnT8Gą[m"h':} 10q3G­O$-sl,k/hą$H``Pctڔ !V΄H7diwmzF\iq!_2̋ݨ I:B#բڸfJQq^eAMF췝'Cيiy>KUi)aMR/n :;-ԀI ͔Ru{42gS qM42`u"yc/"#ߴA $Vs6$BWUl*!5&ԘJ!C%5Fy41\.t.!H7ƅLT:5& O:{?o-Ӹfhx37J2^.^&Wgc\ҮLȥj*DM5QfJ%d ț_p؊~:(11!T`$z(%| :KIR>IB|֭r{{?v7_Vww7555Ȳ8Ν$#ɥȥ(%\]vM{*Aruױ`u0 @Ă W?,Ă  "v<}^gg+;nNFy6QTSC Kgvs-r;fP! p FQϾ)e %EeۤX_><*DZݧ #03!6mE醩D9*|N+Q3MHhWum#oߵjFcBfiR#~AQ`~_9D@7 5 #_B|F `Νu !lgRE.Rb3GR}@3/ܾj[1)V]A NIQ&^dgO;m=e*|?RHVCTu\=DL%B@aѦ($<{4'OFz7#z}4G[F"L顩Fip![o9n}-](v# _-}Uϰ&nEb}wxOY 4Z(*5TIRv$^2E寏$Yr%3<3>2 'N$Gʏ\.7Y5 ͆,\<Ư+Ia466BrԩSM"RmN8륡V'`a"I,X` b$AvkܧdKbQ8d>#N).|'QrԵ wF7lΝ;E)7& [xe144aÍunbui"di* 44ŸUawUY,mYe?x};)lG0e' T'Rƒ` BZE{sTBw$Wwƪ+a.Mh6=a3^,W ~'0(_?=I,ں<33gM2ةW=h_o[5G7DaZfjSB%͂G4A}O;>i Q/e4beU&ȫ|S$FkB_D4RK(&nUZ%k }dZ6mjr Up|Տye2IGn!6/ZzfZ]X|=H'gY}N"faRf8$6@bJhsg4&Y}"/.)g,3\ yɌU UJ] i).Ɵ=IFҒ21C&{ k^]/"5jQtH%ebIP8GYjs*B!meGr Y f+gS9HOu? 1z"0s9 /9(OfEa$z'8H&Kyu O/ jp/p$$$Eۘy^ L`,+I$~ag^-Uj"d 6c22G4c0(L"C l%0**#&Rgp%Z[u*$ QbuߗX$_W֭[ijjP(P,y^mmmA.`۶mT_O%IJ9,X%H ,XxeYJ^/sL Ȕ?祰2M0/jq(̉y[3(a~Poq`."4ly񸶃a@0 4?wiiQ%QX8x;4;53k>xY Ļ&~}b=nӾ Q,׾)^H{Us!}i"4 3mU},&l6~< c5U;ۄG'8С)Dj'_Uq3)۴`Y8VQ,~ORIx$X, Hd^K1G< jN17&~i~`4dZs-4 e<~$h֙DHҔ ;v7xLѴڜŚ %-K&ȱ-]|Y) _ӆ57^lҌijϕTRyΎVE={mx(&s8^}1A/6 $]$q^;tNZ}qHwkr^ 5OY^+W]λX:}Y 8?†3As"K(R%7C" al\<>J¦dӲh/J}'ʜ:\sGpp8րpF *'4ضA4ss㍤NA9hz0Y/8e{{{{ihhON+Ă Bn ̇t4J]!Me Cc. bٳ={vi#_ S$,Y\z>P(޽{/~ttI2dxxIGBX,.X$ ,۲Y${|677z.)~R6dAoO,9? ¾R;AҗbQǫh# s&>iԏ`mxDHm!k{о w r 5Lu4A GZG|l"d9F-j}pm3LkVx6prĦXZ:ZC Ajj8윘n=bphfƀ=3a$V9j8AX2](zJˈ^S&EꛙT5 b} uՙ'ufB5£y%. V&f' H۵dxjwr/:# OQ<.(EЬکKzC:ctK"!RQ| y`+Џtg [vc(AVVl5lDU/Rºl-N=?ӧ(8Σe続ARl/Óc˔ğ $JO>K(0FJz$7FX$_* I$'Oq:T*,2X$ ,Af%THz*U,Iz{5/fmP( ΩXPud¦8<.٪Whf"!иDnD&IZK$ hٜX(=C8!ՀR9 wPXꄌ>a:0FT#`d \l3Ibr߆]BC\g~JNF^0Ʈq->|dYpp8~G9rdI[ܲ`r*$7t>U k֬! 9{,P__nGev;vo|UKRq<O&N( p0ַeu f!,Ă m, I):D8Bw'CءF3ZD;U8p?iӦ* XBNayh00>L3$\|]d' Bͼ ܶ &cNpU5-m^SXYIBq2mT{Q\$ ZnV'x_Ji(.me_ }k]'fp~m?wnLX Q\xK8EH{kܽ]!:rH!wM9~Y]#FE9}}ʽI8~NδZI*89K Ri!\00D8C65]uNGS׫G%@tu(>ϑgHo lp:fN3f1{6QAڄ3B" oʠ6؃E\}YtӎXx^=o]04q/fgk]3Y2C^=L$"Ѐ" 36-f)Ś[]/O_GN$F0pb3U= ݷ9)~'b?8JAfsnj¿ dE$eҺvw'iI3wURUfiN*ЯQU8*I۽2bpz9 !1PCWHA"HJyQ[`5Nf ̅Z\BSݎ⁲D Cj>^p:n7(0a@rB(u)Mj'/,BL /9vO7Q((#[)q "6$#R^!AQ#GQ? CIr1ZZZ&I_5A2*)-›>}j"HV\8G) r9J,fHww7aN& 188: Ib oYITl3sf'twQpBF %wǵ|h/2kA8;wY 8ǿh|w{>`sm #Vv3<7jF 27^Z֞Bӄzd{e.,d.>7zߚfks{ٯ_y3ҖQ܊&8kB]"u ^о fA4D3Ζ!*N8wȪs3pú0NZ uVsOZyy`̼@YZֈiϱaMPuJ (Si  ' 9S ]'(޹QܲLAkpµZ8aqqx.@OMHWGCCP*! Rc|%u,k@m6,a&WMIsY螩M>jVG\jb`MBlZU /{=ZG-U/q:/YԌSC~u9l6TxB>8OI. cqZQ@u>ҝYFx  m\/])\d ln> 1`Y~M%Ànkgkދ/#?0vRE ؐp-P6Τ(b QU6mkڗ9H HTdQBccC]6j`Ӣc›w!浸P }[ :QJiXo  ʈ0F43L!FGP/qEd ,WTr81$D)*B0V&/ӧʴ-rBrJƭ wm0\-v[ͫWS,) i $NUrϟ(޽,RX$ ,۲|M\D%Y.-ͪbN}k]9D kg EAjz q1p'04KZL6;uvh"HAPucӶ^"KEkA{j;>(*~Z.M'?ǂ(jggv)(jwFMHuUt'S8h^uSF^ȯ8b}sQWrf1sbAn 1n"Y`ps8yA3 _;~dhɇ$@N"4VG^=%`s>Ӹ䀹]욻DHѦEDzCkV&żx֟:kAz+LH;dp K%iD'g>w7;q~TxPCjZ@^ g!SH' Su Fze)*O?S/SFr+>}DPnСůy.%>rzɎ>2 Ê٥{j!OQCa`PmJTb葙8?'} B0-)pvHmv^xȻ9X:JR̸E*d5бr#؝u=.>я{O/JM.lC' =V`b(pjtL7-Šq\~А]755! (-$[noX߲ևoZd.i`C@*T4  $ $dᔠ(2I 4Ib$qD-_[J\JٳK/t#POWAf"RB@>Tl6&IرcV`a"I,X`ޖb%ɣ{?P~;btO 0*!{4lծ8>ӪKihsԾzU&I'mB7euq r-l+H!]KiyFWJF(!rkPN!FLOF?Ў=Vz%?DT'GSdQ|FHUXDxʄPcl<BJ҃1 <OzlJj5&䳐0IL!^W $ :MQٞruC!"tufHB<5‘$VL?8=Gl5횄<;m8HtI X'%-yz"J`D FPBm±(]U>1-Ƽ"`>N(s+LP`j:/ژ(RFOi(,Ndj~sy&qby”)sU++{C N`k\@AMjyH^]y=J5%\#` ^2pxp 6}Qd=vC̎N&@Մjaj'V#rB|׵"hX`#yiϱE"V{ &m@sqj0TĽH!|k_:C|aˋeou$|m>|ZW?w˃PA -w@pSkEJxCVEa ӊH{2; uc ~8M. ( MBz.L쟹s+dQϵEJlyݫFIE`Nns@KU58r1s7āR׋o QՋ`vuՐh0o7kndS \CRțoms)1sL-3}eCv~8 n\(mÄ>/wi;MfBp짊tgB( T8U[*>vcU($*U5GQY fO?zeno<*HZ?$.r\HW}wkb v3{q|x,kV^du{zq#4D->Ks Cq#z ^zhuq6& V{ cC.tOʞ8\ #\, B" H0iÈKN(9l|6v?$x "&Ek0J9d<%HZ!Q߽)J[I.mo~SRw=~Zf3p9 \nWj:bA%8!2xydG2 $%FQ,HicHD `˗FJHRCW≬h p8*7yI&dYq )JӒ$&KViYsF{y,Jt^)i. RPD|-wAJYka&*-v8BRKQJFjOOiOAm/D(^,퓠}]{;<"vC1n^cɿy9I~Dq1]W6 0RAP[qPXh#Zi7UBB=iK |33+^? [gfna |3t. n&dsT.Z%O\$-,vO9w?X5pd7y3$i[<#98cN9*.&MvTS F<2eMCr+D([xT;rۍՉZ$:{SabGSz[&z{Bv6 RT]xBM&E^)O%2\&LUNj ؔp:q/ 't; uX'G_8}?&m>7n :`mKn xYN YYF 6 p2𳜰0D+H. L[@ L<,U,?P ۽4бlF$%l}6_AF1+#58na g6Z(;ޤ(bc/v<:9`c ꐛ5/#hf#H1~%J73r -)VJz:~6Yd|9 ~_ʲ^zOf6 Y>מeM"{+twidX_sY*~__91֥#%dNƢ )͓=UG8ĭmn1nc /ASY0wu)0 H m/9!4ͧesΘ'#%@[$#ǸGOJjϴj)6,s%+ZkgVF#aSǎ 7]P Ly4VJqq3L@%$"K"WCoks6%dyNJťȪq1b<9JlL@ʹa[AĺY>a78;{fY e#yu)4Ns1waDY,#jx򵗿|1M\F!3hpMNUjY0أNkƀB?Q=F5 2y8Wl^SYpw8G#qMUdR :r֣T( c{u1bK( |/B p0N6 C9p;a~ ʼn'.0d(;41FdҰ1E0QMe`Y ֥kB'd)JE,%o7+p3F^l%>_`pP0 G Ntd 3APx?5M7?d @I }_ yc҇_#7M䁭pH"L( CcCo;ᔛpq:P[#[~D=7%-}-ωx?$494l St;5gQR$+)J>ap6UKMN>i_{CteIr.c>ʚU\\`ԂUXJ\XeKm"p½gNmz!VE:Pq ~B$DUqeX!? aIg-: *RN;9 aeR+cSܓ yPqqi#hLٕ)W*xb I(vlc%lc%L[-I嬑(!k60 5~$G>֮];YLLLGww7(R• ֆn "'f6/ZW_}uymmmE2 X I&IT$B.%Jr6 ͆, VƑ z ,X`a]Hyձi߁ IwWnk,V'Pj=RoЪ!P !On} 6Z# 9 Zdm 47NLL=DŽBZPikCQE,Je(6:E-Z#m)b;TjqusˇXp",l__uNaՖ% k 0GJkbwt>ׁ|r ;V=4;׶h )s;(}d{fIfHⶕxJזp}Oba1څbg}8`ijlH:uq`=Cr+Hؑ)pffW P"P!6 ՜K̠FA =憪 a+܀)`  \HVŋ8ϓO;A\fdžPh i/]WyΩ }݌XP/V݃z% iSCsPrUy$1QG с\)Y7]/Tť6Sľ<oMbJ RvC!PBD~g×X⪍yX~6W,QuPd<#CR7'6z8qL800@f`ؠ#3!S@t+% W/}k7A$ד#PS3N}4MS0xy\R T90$G0@r (Iy dfdv $H9X i@skk+ݻwsM7^jM-۶m\X\0UQ,r ?bS8uuJrLLLg}Q˖-d2ny/X,f j/%a`A]e2)?}YY`H ,XxØ$T[>4_t}FƉ,Ǎ<(2gjE{4o /vÒ;^g=Fw/YBHvk|Y{O&¦9q\h}'H-[ȉcv[xl8$/K2 i$eLv_i: _qn?~pW2HĪDE`}:z>ydP lꌐ:Lȧ~E sP$fckfYrOf]> !AXЁ@Jb{EJfV,ufwvDT&q!FO w7Qh"mv]ļƵO6z,L;T"[ T0(aPFx}lO2{Fnc(D)skۇ'̷+b/-.@TcizC sUb?.DZ狱Z1|솯Jntnr:~LDXܹIr##t"31u>eJO0h_-؀m~.K#[(*|gDhҰs(EѱTa8: ` [hI*Z#iHT$ub %D(ۨY0t`/E0s^OJQ t\]p(:׹ !W (CI"p0+]ϟUMPT@çN r i$y9~^, yeI]ǪK8`YZ% tw-ݕ4ՑHr#}' vQF$W vmtfHTd[^k_2Aχ$TeCm R8 y|_G麾Ywˆk߭%Ih&$Ih&fOi|ߊŻ?O P*oX≑"# A[in{LA~bf[ r<7|)NFKNQ{&xk򸞷1#=LWY=o;%~=+S'i?Z b>?-sI@9p- CT0'0<;D ʖCw4Y6 /]' ^lH u;V=363@jP0 6;(E8])6ӝy7rlf;!..sc&c#egDz)\lٜtji`F~h|Goy 1al_f~4OKnHC4Gx0 bk(i<6" `]uH~3\F{3 lQ.FR>O*;"d0PV|ޘY\SOyv2s(X>JA=l0zr>bv ˉ3K"fjLլ[_R$"~^K;|햍ꊒA->JJcI A+¤dOPqR*+Ӳ Bub 9ZϹ%υk4gii'x⪷]N%\.M6111AKK \1p$ˁ^SRaiiy(KKKsBSX,F+-']iokYVʱ&h╍&IDM4qX&IEyU&Y |m?&"\N4Lc3fĹLqAm ka`~[z#>sAUxK70!8:IJ2ܷGs!`ZQb鴞n罻z[w]FT#a0:dxu[ǔI ᾬٯ30-L/g͙tZ*e|_It}ۈZ*{$ǟ92ȧ +>h똖u"2~>FGfᩑ++ ؿ=:Mz+ە>&U>]Msq0 Iv%l~{[4 }6$cqC6̞L1t=,: &UnЪ`|n\+#adZX#LBZ0rp1D 鰥AE$KbB@|s=!H7<4g^Pi32 1e9PKdv95I`L"-"1 O= ]cG aMGF粽eI)$T/;z?{ErŜK~VSa9:ei}׉b$N3"֩FJQ^Rɑ/q; 6D50?UgH9%(q:;@=<=՘@aR`&cϗ0~٧zNb|vi:ըJqs>tp&'af2}E&~v (c{7,LNÍu3W_j 5=T#Y DR]KD}ODfPI'UQUMT eeI b2qF4`}dS"M"dd%$IR$L M_jLX C^E4<%_r>Jj6~Ia |Ȓu5^PjuxmciiqKȑjzi.R7s̙3DQ;s=+$IbÆ ϱcVCVX,8+$뫏΋eOTa. 6Dkm"h&:HfW 6hp$d?"HHCm MLd\6L@U)~T&f*W)h.2m oaBn CGZgwBsmfrit.M^&ʓ  Fk7 LROdt+?N nL۶h' 3V'I6d3G+2q, ,L lOeN$y}Պa؝tfovdQk`[S䆆 dE;G~۠b2t"ۓyP ߇j Ln ɳ'U[(4kH9SlDm|H֥Ff=oU晐J5`i˖Ј-|/yq3)n`H"~=fI1|b,/zQϹ;x|> ©r5ܧ'Xܗb#2?O&';Jfc=@ ]FCPXIPَEzȀ吂/c>[F1!.;YBqqzMFg@/`Q@ӖTH0p=x+5.4hP py?e%L%*Hb0KRFGkP_h*H^E)\c.!!d8,?{:󘺻\V5#: Iy!@S+:H$MYQEY ¤ʊ:4^c.Wx1W;wd~~NbUɋE\/+Dţxj */7nd߾}$ 9?䮻ZW_زe P.qՁBx{XӴKXM%Iz4DM\Dbl5jrC -p[DkK  VsQd/mÊ7Wq||zTE#,̳DEUψ )8?y-Ɛ3 !#U~El_{oVD\{`lv~@+7*upʃƸm@f3mOXc];?SU2)%w9pw]іeA,m;2{;-NA‚.kF,E:` Yc?uI$DV_ߚe7G32_gleH]veϖlԀhY j)C:*ǧRa(|D].bWkG(H W*8O}.,3ⱥIg4##Os #3<"ؑiL/Mid\#,b_g<镞D$h=mD, 5,LDΔc+ E=< .&BRZ7슪ka EwLj9MNN^ZJe>NuR5$umsL0Р[\S8%JԶ[Qꄙ/?"qڒ2P--,)D%XI9_?i;aX)yoRO-/!MOyC)b;%oM[iԧ@ 蒇^pRIhUD:5YJc8 et+߽ ע" kx-ݕ U1thF,R#sljGFDBv_DH`]Z*'c.j]Ir1!<,ȪHFCMF؊-+H|.!K\"n˫\>O5BRannW6_JbZH/RTW=:}4Ͽd׿T*E$V1??Ijz$IxkaaMӨj78*Y&Jr\4Df4DM0IG3sL]4SAVEP7b*aTIT{Hjîې;<"~O^:݋lqJcͽ|7K6(wmi0%¡sLF߉?dQ>u@r^໅?|U0M2[FFfghgfDPfɬ f$bxV5y*!nzD1!sQC$:!報ܘˊ IdG6|P(4ڹH| !԰7dp øʭLtuua&P4y_U;蠟￿y6qMp5eio_znlܸZ8NVu]jZzy2-&*%F헴פj&$,&h}0];u} [LLD{y `!E0O06P7>FWaP;e+FJu_yob2VwMBOno^W>)Y22!l+3;wIʪbjh u:˟muǠ(\l8ecnA9q5T<ή'7mйA891 "FˣEt$Eha1۹HZHF0r `@gH;4tl0ۘ 'IhpvscgKqtAݰHE n@Pw`|a ehs^Ret E u XRLmG< .'Gva s8wjܷ1bL{s{M8ԽGZ0td소P }LM-v B%6 $i郘%/3$s$Yۤ_GY-kZʢ0YH"(0iHGz:U9Ƃ젪5\HkTO}%S4ťF i5 /t9?A{ċh.5} j <1{ a A=EYD¡xtlJ &ad'ןY)膈Q%H(q++B˯/*zU$@' #B9852-(<<i XA &_w]f sYIf\krЬ(Q9N3O%wa~v5"R}gwjDRt>2reAJrBwh@A¥uO8L?_,-ӳ L S> ar @Zz组~yoX{Y(a+-|\K]LJc Xn":U4\d`MR<6E ד p]ו(~3. ~>a}xNK.+I"uXTD@gm-URDs_%Jd 䰄0T>_lR$pQ'Hr t[@ZNj @| %J X/9iby +꾚DeJRAOHD">n`ttt8u]]]$\DYeI$Y'j&nkA ͗M5Hs?__ M 1K LJ2+if']2o:O$֧.-iU$u!fejxOI%6wT6*_fux2qSaM| [2#T#t.k|cɼ#4P2c@Jd2`O"8{..urWi M"ރcAzSnXL [- 717RgS_zpdd8 ˮcY ͅx,.!c-t`&q,IDm6XE)?0Jiwp0jJ.5}u]sT&!hA\FTPc1_aԉ)")@x<jB}bRAB'ב6–us"lgGGU̡< Fo\&ڂXܢOQ Su1`GEGƑ5¦Dp+H_'bk֡7Q&4cѯEyDn7}9F i !H>`N}$_1qVU*jUZUW//{腐DɫMKV1)IJt-ѓٶB,%+$ **eWCk 5EŗijC Ƀ% §) 9xD|L\d?@֪62?Sof穧j4Mt D"СC/1z{{]!HE,:S,>E, 9=It^!R9BaQ˟@\ dKa8H2m0Swٔ.នL~$.:jr &_@owXJ7JW4˼şM??OW:q Ie_lbu3m3E}$.;T5I$eZ &{X8 -@̲~Q +s)``E!.Y-%-R tB*<HbWǷa*S4S%SUTsS y$,E0QtJ ù>j* bؼU^:$ٓS-[U'*1;]´;Ҝ@P[D( 0<C© tmMJnpPa<4Ύx),+'F­t2c܄ |ېΎrbᡆZ!8Q 2*|@%))ޗLbVZ1Y+Ůt:̀ 2Nu}X2=F] m51uh9:+e[ڰgݱD>k-u5/1ǍQS+)ȔdP LwqQgV(aR&T$Dn׊2=3J%$ZP:R  %atݥ5PgS̩A8%ݥK|8ϭ#h=!|܂ުⅡ8U uVcbyV%ruH$_=<=m\bl]+"oC{7 7I?( bQL8 LkRY] 2FA_ %1I_zR_IBDz7aN4T' ?]KtwI J1$9%BM1*&Va ARP,+T4΀dY>r{ɵn"Nߎs=|_&|%7矗 EOOPVH UU/I:\+qˑ#XVM4q%4I&^XRiW%IIyZw:s}+KԐZH[l\90SQE8N1d1o=wQڶ*ߩR*3 Rcx|N!n߳D-ĕf]b=t0`=O=ϗ¯q?&| #wBF! ߅ij"a E o#nS_P*& /#K0|"&E7D=j,Sèö́7bPS2Z oS0\#Ts焇P Zi-m>0™3(hS\j#bpN:OTNW;Wo,5bD5\T f ^"$D8qbvfIwvq>D]Zۡ,u\݉A~vd M5*PB\n 7A_C$|LI|>D>b~> T%SL[tULItkRv 򡨝f6WSS舉 P󴲄sυh$(ZKc>JTw|y iI&qi%UkȬݒ8wt٥S\; MʹGѷ.v+HaYbɏ13ҭczQ̎=ED-azcdl~ntSC7=%~M97-!3.=Wm ldܺhD] Gmq@f/3 5 !5cdx;m)u?q HFd @fPx82y4+%ZE(X!: nŧA_[5 beb! VP&JW\>F>S̻IQN1j*#HӢS!R; P3;h [MA`) \i̜Z+US^1dm(0/$L\s:z=+2\6b0}mE/LnL4dKfNLV )7rb0oz¹Z]ƤՉD ݔ:alNPwA hi parO1>_dH $1!} 0kӧA ;c(Kw>:D_!3HRL"e_A$)ȏ|G#5>4mw]rUuOB#!*mѠK8nv_[. $Tz޸qn32|oIp T8;X}HJyf|vcO-﯌\;raeRd_(Ija.ѠTzdy,%!F{T*He y> Her ^,eY&I*tWe^ ;uN@q:~M)ГӖ(/-1J AHOVpOR֩LLPhz5h}$XAh IDATQreZdYa5/G\^*|(-9I)^Z,..L&V?HVٳDcccum=VA:zj+je,˘iAZT*]ɒI$i&~bYM4D/ W3>@8O,ᣰePbJ(ߚ_wp!#&Uhl3JȲ}|{F*(CXicu&OpQv]wgܺ5WeIdv;I d @hw:CBiXytCx,y/@p:Y <'I-K%jR w>Su1q]k{tpjw_pDJX˱)R<$ 3*yBh)$;Ꮯ2:n.Б >pj|EȬVp2Ưܻ g;̿(҉(?43O{J{$3gګXsTF r͜4}T Âfgc&h:}]uy, %u1OsĪ/c<,<ʲ0"NZp1Vz,6YZS`Q:66.<Ġ\\Za8X]k%gj)Y2t %5yo`t4BaIez ݕ{ řZj>_ YX7::77{8YR]URƥX?|vNXVĞCx}#hjs2xG<˼k[W1+#n 2\ISe[ѬmndYx{jD1.4F:L#5C}Kw::%+m]J:(Xi,jd<+clWF#+#:rCxuQZi@&vǒfB]dIPi)9 +wB4TYI`XԺ( +)q ,k_5)Ը")1XR!Jb Je A@,4- Ϧf}'nOu]' uM 8x5~V-[K vZY.E? BJKoR 6p ǥOU$94BTm;VZPщT@1T )DWo~ߓ.9)n+I6Qo}{'> _lX=t">ZaVH)iEٳLLLt$B0WjQQUv i$ iaP*eY1t=+C=]Wb'fLXD.Nu}F2!yJlQ  1QEs@_ QVAs,Y|aQ}FwdIex`RCLx&>͚BTQSt G!jACd#)p31PZVu =-bLmW<(dlK.odiJ`J~ƺ-C#bo<%";I ."\[Ht7))Y*١oHqYg6a$7PeT Ѐ BPS@JA[fG ùy~}QmN# SL'ds^+(F8]-嘊vyqL>3) <)I@' L.3FW0I=HlE$//Ky9(-$F$ѡςA20h!jR$e/`s xrO6]OmKIn+R4BU'Tt|$PmRV1 "d1JCIj1/taܥ&v?4(MU{XfKPEh04tbݤ؟ߵwWg`D6 RՈ!>ßc c<ρmI2"U>03ʡ;0[ad]w4{J4xNtSwa/F';ҧN[e%O;{UGNx ;Qޥ%o\ x0K?#`(Z&V =vq~"VչerKZ2JU{gmnb&(spC.l>*!Z<՘!d}&%-w^?{&Ƀ%k8Nt*XTXFcTR lO7cb9 jRlifLT̢ǛIrbͦv2^n3VW9[PbVf2mSCIӢ)$ר~>X{S $W;c{Ρ 8~ f dӅϱVx%)U%9x j}C:[̓_ы7v{є0;o~Ğ"*rVj4D@&DPo.~Dtl+%钢FhDBf,$ Fe8Y4JVɩ.$x"\reG<*|[;_a-ɑLƒ$,lP^i>k7F-l<}> C4Wu>֩t:SӛOC|$izҝMHJj,D! GJb!Pta'|OnbZcMQzV;D,āX"bu"131{: _0s.ϡwa4jnLSؑݐ!edX3af#,+0bMO+$jvS\k;Jb *G$AIIv|{\IXYܺsv{yE/vO7 c|cddvɓ'?| oxe:kkk%D!DBɓ8hFd2";k8NdZ__qǡP(000 }g>omC/^F=w!^rӳ fr*i~XE$1DhhO{%}FZ΀2\FF57ɵ5$(dư5jg냔͈HEhwD_܆FyI7cecĥ' g9~A 4OBpF*86~*ݮ=e:9;\hDdU.lXe ?sQ?I'x&)@$˜t&U1IE=_3iejtLK,23%E.C:h_į<Ο?$М=aK&tw?K|7Cw5r ~Ro eozThi[ lݠDO̗o/*C-I^&**fWaR.Xmr{3-`s6S,2<\-i3S bF&stOk17UK[aؒ8 aAa9grAjuR 宅Ϝs‰Z]c,Ǣ42 =N]g KZ vgJQALِۦ tjĵI 'V?S涵]'O&jZ/{\٨m*mַMGXKw3{9Bj&Xu-,$)dDh2$VMn3,†t#,DdU-oYĊI@+"\IH4" c20f6Y\f I+!J $G o%1>I<&q2z%\G8,RIŭa>zaj>٤"VdT.2$d`!qxTEYT<8If`;;N$%!01oH{޴1>>l4Ňx%g1(>P턑 |tO>_x2 c_82|b 7O 돥ʼn%v/̤My* DJ1jQ3V0R1턎gw D4o=~42_`/zc#,CfPDHz^HkclHPsLQbZ $ :dyFˆ~B{#%Q#9FW\}h4T9 뷥~= 0#`d $c*ϵtt0U >,"Q9YGY cv`u"<Z[3XnE왊`^]q_BIotD@؅g1[T:XŔάk,pzt5+&10QiҶUMu]Pw?_Pə"z_\h@JXŐie5AMDDfoY($j(TI p֬6(*HUЉL4=3uO_Ra5 YrC5G 7|z-1&!+ P%L8tG.r݅3s5I$SFF,RGE4(H%UH%ITKOO݊'hFBuɘ otZDP5Q lX(H"Z"ab’3-?; wTHTϧ ZM*)H0c3eGI|99_QeG v^NBejovu._~)/ŖKnkrr<ᕉy}4'@Q~~!m=-BejMMĉ]BJCvÝָJ50Vu$Itv*e]v[$˕Fl=ϧ69vFӧOnzxGC=y7#595}J?^7)l`3TBleIrIyVwbN %fͳGa0,ٓ)9_3k9, |0?gZc Spg4(0I WNF܈4jjվ2iQxʼn+bͱe$ IDATjH <pQOP id!:XlnE3i_Ϋz[G'k\FLKɱKYTƿm#,ܾ^ P17Wa6pkSrYخ4Y(fN}T6%by3%CR`0 / o !uA Aie{.Bw2jHHUe䷗P1qBvYCc`2JE0stGf&d_KID%q,k{{D.)CE">#}L^4*1*QmmB,Ԕ$$JT"~ֈ#6=I7#LٴrTbQ.U k)aA" FA hc@KFd|;F];UIIrO 0 *ESiiAI4(/Dd&E*m ¥nZXfF S!Lb$s;8iZJ(?*1:ao3ql$qJtvɍh;ꄔ &Gw$mmYd'%M{-R@o{$+[dN0 L얷dY>Of``q(˗ Bn&ԩSH)R.iq%,>;[TUlݖdq}*>HFQ:uKv4Dn}=M^ lSR;<}Ϟ 0zR9pܚݳup7O ?`"i7dkZ,=i/Ji WZ-ELW)їlTD-2pIgpNrŤKi@zpdmE1Hݾ"ENzxFѱ6}7pW9LaU#wnGX !"д<4Ho.H$ascAbKI@҉ YV#0 FE1qfyme$ ĐOHbaLXՉLjiz2{j bPJc@ 7N X9N|?xffB%)A =%EPR$&QQ3)A"2iA+$u6MUGQ'%ibhfD4z'D3"4%yA$zI|[#^Av'/o!S (d\o7(NMWJ孒X:_d9@|dCb~$QX.S_(t\FS#T#F=?ҟ #TI"): R&qWI!F&1J6)Ep\l?]]N$)I$ː$yy(}EyI/^djj ۶{W .\HA-Q/~o|#_k7q܁H͎'9 |L:HMuANT@05 - Ķt , 8 6dk4;:FF!?#ר9jQQv(>GCeq!VUDSc.M ?U1!wȯs)2-L)k<.eK\t8[f&>5&3@#TSE?.K:%c6%V'wyۯQ1G XN<) _* yGcBD Ao0\Γ&y'TUQ9>-L@EcB|{z0_4)TT$Wj-H2/iImu `Ab-=$A2}b[O!VtqՈz@"@7\|h +\Ǔ\ T SѰU$13 RmlQs,$ ƌ# */K5%HлjXl)AuQH)DH~W#A;Ic4h(FCt7Dz&BX($(w~F"Fy-$m.no_6`nY~j`'mպJdDFli$N,DY~/˿T,lPP$Ј@Hp5] QEKPUZ7I;RIX!ZG!z1"$N5r%Yrr37QmGӾ$/EdccUU_oq#^2TA={>~"sss(Z v%IBE]aI0]׻!;Njdq5DQDQDE躎i)GUUJlwӧq]kHC=#Iz衇^lBz m&`wFm: , L,:wa(+lCQYHsLbTjv$MT<&(%%jv URߝ \ t`7Tɐ ;NGkcfȾEM%{)dp28C"2N /kⳫԗ UlΙ9`/DUc > "Xj>*#y,h8^jUihj:h4 " |ӛ4UI P&jHhXs'1c0%JHBb ՉV356zhRae".]! v @dRՉ5ir)*RˀooW#ipP]}.$<<^0恬t[DI(+ HhHdKKP]di|S{B p`Y0c!D`Uj^T /(E`z{o!k3di1( MЈLSI!2ZuJGF퐓-,<4%3$?_#RTMƗՉ*qJB!FH5Ѣ5Qʔ(ٙ>jEVN+ $ߌ9tG6~yLPj6j58\Ră>]w݅}oW>tlllt yOtYK)x" s=]ag}:鲶)%]m"ETUcqv[VʫNd$IUض}Q$I (o՞+2=ë=zE`Jăi \&(B=p&fL;\J$WX &&J{ ]̓EEQK8c"zΤE~ּ^C110Us0GegLeD `@*8㢡;=/Mk 9(a{MXA0GG*,}C+ L4c [s)O<<~sCo (ƛnQnfڇy˻!#uqyɛn*›ޒލ/JO{Uw1w̤A_ӽ;/2" e}m pΝ9]*=c"‰-mF4ИMLJA1! Hh^@˳0PMλ ,-hrT6 pgqR^.Wq^,-yhjDE^Z_ Q::m-XplE _w=QG_*ܜahbSȀqeB\tSHlL 1Bl %gPDˇ!<ܕ~IRmQj0 "7;?YYYWW9G ax@!S\Vd$(Y)/Ek.w^K Je6a!Q$%HDBL=}Uw]ydUuu D YUYYU2usa) % kEaV n[cd1)nB{?&OPщ2Cd8;gǦQ):drnK1BHֹ  XĀ_qpM@* +6O{ g{gYKv0m"RAm"!s|#szsoX6{6X d &=x0P2L$jI8"q- +%X7f8Dk!lcyw"I`ebn8L]%ә;ޝr'(cW), d#;ix$3#Quw^fxO_2E*~?P5'=4y$!P*A"@LvqM\{R/Ž]0w7 &q.:T(b3˙N,GwoZr1c GGFLPi x9F_֩r",7XXĜy"7fdTqٳ8ݧ繥L{٣<ժET%Q`Y&1,NjFKV9 P=;} "5#НqqʘdBQD68A93jP^@TY 1AFO(xMH6 ^KI5B,lZ %mvS b%fZ@ڊF/$߱) 60(-6O6w` ZbRatE6Pğ]]c Q3ʈ̛/P22%)åEXdj_SfEAQ.^/c3] ):,52gcͤj Na$fdx9"G AL釷_i([W($ak؉u!P#ݕH G&OJ1I)S#Q-zV 'SdI $D)l z\^)Qwmurz"wU$%/Zl3^iڠ>Lv ]s2r$gz.kJ()Q Fbi( " ԊVtXnG !W )R,D)?}޻2INtH(ӸO4 Q/3}]MO?Z~ ÐǏqRE|;g>>¡C(ްkmH)9z(J˲jȑ#9sxFE|v_  äm]r&!}Efd3AYE IkÊm](_;x jjʧ?v [JEla [«#$+>{{ne|$kDȌO5iecaR:CpF n`L3a %xfn!&Mp҈RͶKhm]vȮ9Ŝ0qent0Ԉ˕MȂ+I]i)43Fvp +N(!M\W_{Wv3fSMlXy*GV w-wJ8n v` 4+?|Gg3+`;W-.Ymr"Eg#ff sI׸?ZS+d ['33& 49ʼn4iט43 _p~FSgYuw#̌fq`:I9 :8ہ:QFP_cLn=j&x`ק@0.&&M7U)N4K%D7Fhc6S`=Ni0*sT6洤 v喱[M%_dVEӢhfy$ V@VۄMlgD@3_BY%uPUJ^qW6e`Tbeh)˦xveBPΓaw JM Eb* @+A{V/YpkM&@h:$d\T1rb⬿4)`iLS*Z K}x*R8<}'羲~~U2k-vebS'!#M!hķGn['Jܷsz'I6OCj%JqɣG}>O\񿞜tĉKH~A?"_)>)NDZ,kIG@{gf5/9=P(\$N6G6ӗc5?4% $I6H ZÄHkiE]nk3Q3p]wcm/EٳB0-\"I-lUj I>ƁûY|Yfe.9α$p"Pr;0E<9T٣5פXh v 1`F#Rby ͊#vHPMI%X&q`(Gd΢h %IN캆KZ6 {0BiY9q|$"4sy[[?e鷷Qb4~{|/W'gw!2ηe˒i#mC6BDaAȠ9h6R.7/r@Շ#):4FM[0BŔـUV!E&.$-J(%@>A~?w55P\r/8\ #'`wV92bSzO$XtSAN@Y*,8D$r(Wh``1-(  -UTXf1b"UecfNGW&EIt`)ڑ$ V湀DT ff{;Y[E\:F T@wG)eHTDu4g)qUHqf-rRnFb;1Jn+~Wh98Bb4\2ݔYl_}e$pd_.2$7 G{bwO};8auJB zV7%{r'8{dcK 6ʓeJ "$$D=%Ip۟/%&&mlL$ KH֢lj`datFe{1U\IcIMqMqg{M  SdXchEfڤZmSx ə$n/6IM0IA*ֳ)`9P'= yO:2h"#YخTD @6>u PY`No.ZFv0Q2lôW +4Rxa잳gn8֗#.0DQD.dlZX,wYwܔ-la WH-la [xIa}Eg ?:F<1 ke;/\T)|$yr'@6\2TpYq/`7 KTX@J %L:% N5;$2&.2tȣɉ!5Kmo2G4z}ssL :d8FNC<.17Ds[YNІ ,o,<일e<b4Y5Jfwn,sݳ AjMF2Ab w yED&զ,y5o`o}|!c|3u&-Qb-tȰK%*J9RRU:=$w6:Ab$Ij$@D&!ܠ2H7Ow`Y!$KO0`eswF@m"PN)ɆnVzi؎'Z#:îH|/0-r{2::m<ï6^ , 5sssZ-(ѣ;ܹsMoBJWKRJFZevvZ5l}H? $}e4, 4IZ7p=z/{6[ma [zEla [«F?`ۗ]}<>?G~yp.`3Qy Ql|H!bY⸂:4sDŊ4 hrfvRH,1 V5 F",]*I'0CEier"`<]dw4OHpBnadޠj nb C3U޲m-N+O)-nI!#n?u~q]~|3NdIS%>ʣ> 5Aj8G[K%&UAR@&ׂ& k\M3#J-6 3 jXe4m&;07GBqJIA)VJ+0pe:,//Eq}2a3&&&8w8^bub/H>0 VVV6ݐ$?gX1 3}B䥦vΞ=K>'c&f%<䓯߿Ela "I-lU/Z[ُٞl\玥L Ưehϴ _rzB gkKfĩN@*pv JVH&Ú;/ΘTx㴦\ׁBYa 0Sv ݔEJJx)F9 <#gGw2_D)HRWhIP\j;HI}-Ȕ#ù%(IKכ@KDXP&Iz$h@HH"41.m\$>D~ g$/ ٬2y0/L_P!ZJ-\ͦS;=Pyh-p7 peJ#B)+$|>Gz[f(12%ɰV= H:xt%GSUʁBdXѵA;ϊzMp9˽Y FXk(V;0E7Nx4V3Iw)Ms!f]FWa }DIX:}m*Q,_hOqAb9n__ ) IήdzT  ˢ(VpלBC'`"&vm:fGm702BٖoHy&N`ۅNdt%rrښrpb*s(B"7 &h$XU,1 ChI)m"%6ZB)/# ptȊ$<1r+HnHj$%q#IzYh !(,oH]D`u{$CLIr\[ EM'{(kBGe7DrgK%&nަk~am^ Z`z`Pɂ `ABqu3wCofL7ڣԯ'!V;@.2HaOq VASld6톉iiSG>?N0*hjgVp_ q&EPbJ>"N%+s!3YvAXP2nH39r<ˆ>ص IDAT"-T1v4^1eleh) 9m [KN% t:rtP2VyRi(JPiB4.ΈE۰0ӌXntW <Ӻ *t|~]nд(V pa^72ΜYM(IwZ`xKBHniI:+!5ӂr)SJ]޶m`4O\3Y'$ZV|la) N0DM9=ˢbF EV-40U βZ2m4iYXz$[Ėӵ]&;YM$ Kdv5JKBme$Y/:-͊B,*D+6EK.Zȼ7ɼ?҂/</b\DUMï` BY߇ogۋIbX_RR].ú9O6N꒤&B /wƳx6(yVaX=+n Ɋ^]M>ꐏZ^ƲR-9yI$2#uS >$Ɍ$}|W_%Wl/ a5Yjk`Z{ 5ҳ[p~&6NDs9H\mlT$6eݡl0./^|>{Znx7VEϜ?~CoP.mKK4% 0 R{ץQ)WlMu]r\n.뢔ѣ;wnp޸Q"c+^,--y;_hرcLOOjYI-|`$W$gP>Ŵ SN$3硜YݐBYS%L"F"lj*IY'j Ո<' M]@hBr2#,c!.e  cٰB[0"ӦhMU tRA Rk$ܞmK"KA%hU]Nq5itdY`~B| )ּ _)Ԥq DbHd 9|83275g1%"F BHb݃0embNJv2 4)S4vJ߽sRpg7ۜL@yu(N79D ZPkHHoE!iT4dVx(e0Z̊/㻎;1i "W ҳٞKɛ32ȓOnLUM %m0ba2V54nt1ݘTE(87$0)X1+u%Y b9QS xQB,:hnÏ[5BF AI&H`" (1q{Y!tYZ@EE4H X#J)!W:VP {4aE_4-ề)ೇyp,;JT"HSL#yBV:7|qQ2(Hn"G6$\R6)w>pnFLlV4& !yڃuGY@.aM@ `"d@&2IRD$V2oc{1{,4$ b8-K_Ed)ƹԙH+_n,>+6U 8LIsܽ _^Vo hM;eE~ƏZ&~ZHC1P91PD&eX|VK&3f%eF^>/w'H`sɫ/_l{w=vkV5Pw`&A ٳ2_K&FFFfDkMs=aHAK }Eɫ)o&dʏM˅o&GEJ)oN,,,\BhI۶N$ImOfzzzEQߎ/Vla ["I^:v&oa [$z$M^R ߐ;+z Д Qu.#c K::z^ӥm0.? @)vq"Ib֩ޛIru#:ju%amk̘1^x< nj]vaXa53 ,lkv0<;nja`,#ld[ΖZueU^qYY%fb=O<YjqJhZ"}"rX-q<⪒8ˈj}m<]ȈԄeǔ\GK؝fK]cC l?B]BB , A,Fj@/qFDDĮFYU(n2u"C[nI!ΐ`(U@.j8c1)L5PЛNlth m'y8<МvG?N":PeqL >xh:ue ]kD%0 2qvKTiRUԿk<go֡7#hiU"(odf)> ZP䎰CztNhgPxr7YgY& EHl?^ m1.؈HRI&5X(xA88LэG-唘a.ƶaBPm -"G"fƗK7,-#0VI׷&g ڌr ۾Ywڣ99"=VBI(PB(pć "D9:YfpoG9;JlO˾8W/e/i,CgC0"aIXa;<#`"Vsag&IقKAcy,˭iʯgW\a~~{g$FQįM^O}j$""N8R:Q…4(=fZk4 ~! 38n$۶|;;GN J7`#h#MTz)PB2\}|\FJhjZZY9z~qqq+ʶvemtu-֩m__1Ij ^P٫:$wk ,o)1$n8gQTc8iWlM3Ig-0+d5L\gE/i7GXL8,Z DZj DD*e,/]Vij@ӧaC C˷9?{,Fp9Z\ke\GkytI\q쏗xS|&z/jbP}7lzK8AM t,?cWs77Eâ>>193P{ L jq[6 )` dcAu0WYDzrbAwxSw%3܄299̒ҠKZZ#XWE%6:5fH:D7kL=8#f\ *j.y%FDil"t$T\=l"t;aށgTU7N<Ǥmc0OBj!Vxҧ 4rez٩cd"&2*bF>|faў'\$ R.̰GprJHҐ#"-<%漥1gaݣcz|}6w"VqRb&P8@ai-ݢ^v8&"`R8p[-DF3&:vPu}bpD!h^^;W'%JYH᥸3<(}EGșb#TM[3$e z-p_nuhW׷w3 z<{7&{+Wo>?> Nt`0 Ix *~1JBEt:fff%wgZk&''w?=zme2^J)LLLw!G ơFZ%MQ|2t V/w#”P1011ADQ|<!z}۶y>Fi:r<3FJRB'OS_:駟~Ŝr{W{Iv*{Wt~Ug^ٷX}ı6:B#Rt 2$Ql&avB+&Fk$`7,l~cPHHbﱡ} cZ.eݡ#Pt\f Z3LM9B5BւY 7'RW<kr B fY>F%X]j&9ǹ[j4$x-?}o#/Bz1ygVECCM$T┹ݿe1{DF+8㒜Lq |D>U `MN(G[b* !@3tg ހ*5-O $ЧDo_.İ"&qxp# M8 zbMs43kէI:| ћhb(SM&=68 M6u޸|Q)VN<>tC_T\S2$`{oHM 0^CP"qNhP+ysm^  ;~lUqA\#yq|5esnL:HR"kkk,,,@@ R*8J@9,//8(AZݖ"(2#8)1fܑ=WUp155EVFƧq=Q#]俜:}4O;j }m{`ꕮkNRFCE YɕulNjf708D %nr'dEUh$a,I MB5:z:8{?5^O,Zb@g?}Is٭v%3nn{g:A.BL~r_䆿sNQƎ({>^܀L7[&N 8$r7>ɩ'~hP2+X"j3\{nn1Q_a eITdV7 &~&W"IܹR .tREWkDC\H;)eRPX:O=dޱ:Y!c !-8g1X "fdaMGsSim"< Ɩњg)}<=Tkjރr+13̈́xJKAH=ueUP! 06|蠄# -AIb aˢŒ4.jYKIɠtȨ .nRS?2Q8]W]o0GfVF{CXֳt:"UgR%TL nOqcGhGr5,924s%9{'aVǹb6_M*R# ST-@ڵB80A0\Q 0ѿs)>V0 t7ݤ€oY|:e+ȪUNoF8}'/~Uʊk_s7ppڭlik^f ' jQwcNߟӗt}#_JP>@qx2Ivnm Eb^+I>qU,;rj7a!-$r-c!6ͅI &D⼢ nqay_wg[Jb IDATr.64)>S>ӍS>2ҝ3\_߬V([ 6F( R`x̗zМ2>1D 5eo;Y@LIR>(%Cp"ǩR8- gBsһ-ҹQG3,hiiEF,b07L yF֡ O-0md˅e>eGA+,緈D:-|.F)t dlw$a:@Wj#a/Uozӛx衇ثn6v{IY[[nJtWgv;6r:iGv= `/Hl6G$ CN8+WxYYY[naaaa&K @._̡CBC6)$9T*#QqX" MS] m V/!BQύOYm1/ARBݲGyR0 ^,$1ƐeǏ'MgΜyɜ+${W{IjjT9 Dx]fѵEi:`%Ղn,܄k)YR߶ (VnJt93! l\mN"%25;>6s$ Pdwr"S"jqCt3UAqK?I$7i\0æjprbq.Ԛ@ªj}]ZA˄`Ү3 i}|T JAZl|[bT+$Vh+fy[,\| PU2*z Hrk@Z*щX/bCbu_^y7?j8MOKu7$wtU$ȣwXci<DŽ`D])AJ%xC"c^MuO:cv^<4Ϣ9s:! `UP7MsPtxy!8&%V5 9Wf%.l$'Qewrkԣx.Bs:,e-U1lGc6\ [$J GN׽lxW$yF.jzd׊'k5J$\kWO$~@LBlh/tg QQ裵!9>|L$DHgK&B/rFa@1/͈׵K/wTs#/Gcf`r.,F1l5KpsxYs:6ӡoږdjM?d\䲘 #XX|蓯VrMoEnGEK'Bx,W$HFnE!MHɔPRQ.G5SOiBd")$;vu}{0h!&}t8#i0. pnet-W[9O|=NϜ9˳ͯ݌Qɓ'ݯk~#ҥK#Gij>FG"Q /p:wr+vv}$9"\իWxb?緭0ޅ#wH @ >nsaA"Js3% ٫ګ=HW{W{Ixx|J!Æ펛xt8y4Y| JqK x񄃯nb'?ɍ?A[}f\<@3!f\e?lfjuaILxW7dok]*`_¡+Y:qOWcj `P2CELMTa6 H~oHRnhMBbͷ|m\ QJY^mȏl>`}ߟ_X 3!M avڈヘrh.3~+4c}S|32!QxH۵Rs؀@,9~J#oBn% ڜK<re&sde-Dʀaw50pEVH TT੧(sfTW+ESI 5i6Vjbx-P#)Y $9j/\N hy0BKK,R@P <#P X~6< CӬxm&V6rR"Xb5ZlE{DƤdZop#C\^I.dǸ''!FK˙W@ P6iMr=.t$Iv,r%c7r؟Y0r@ZR  qb"BV}!JJ,>d>+W ׁ݄UKON֠ LcOՙļfͅ'` K1ԧ$1Lm:wZ|E@38OW9p{/b0$9Y>; %`g*FuVN=LJ)'7Zz})' 7 ;t]hu6X%q:A^X+N෗5ZƢX:ĵ3\/#]MUD܄*HtԀA}.vfIFK?5+w{o߼$e_d~ra{Iz5&z e\:],1}8pzy'dH.RˀL)9 ɇv=( x@T]3IvyHp^b.ҥ(I\0rtz!𲘄pH_Es.'9+|AR#5zdH>I`@BW ƉaI芿7M~Sܽ{O}z"nQ%c/$1lI#*}>av[+55… ,,qZ k>MD/2s"˲]v{snc%2 #@EW{&''G@KGt]H4?t'%`0 ;$`;;nU~Ǥi:jVnKMR/!j(Fx|*z(UiYZZp?3!Al˫-jn$I6HRntF.rÑqn`镨Cqҥ=djm^^A|Ë!\N( K3Ղ`.&m \ L*)pqh}FXatH&"AtFeL]=[2BU]4K&23OMQs.Ejvp ZgJ2[Bh1U6J]Q="!q]d}MTBnMxW6)B&"ʹ_䅃7[' bmҒ*F.}}kW *:0r| p(T(hIU (nd\}#3|cWt CÆ0Q %r fQƠeJn6iThG#Cѧ: ㇢sRE:G!(-&5N|2*IR!6 YB' Q7(iiGBb$zpJTbvMDkG篲J`IC+3ҫzB[^-2ۜqBb~(pkJ['998 y' J2t mɓ5ҨFgMQ/|1L)쟾 n&z/P;-j=ʔz\?I(*Fˠh# Gl_g #(FM?on*S5Ѿϲmcd|:{6R9J[V>O255Ij0^^$Thytw?Lxhsb!=ϝ#Bp:Wx=M$E+w |B[S\r8fr0\VT+39JJ l&%*9J |鐊Z_TdVsm+~d!fD&N0+Wh6^anŌDHQ@׃o<7Ni'|ƤdZC8f9];ǟ\VJfN5ͻЃp_(e\Y}*k>SJY. kU /!D 18YK>3 KDQ8lJXR1jDŽ`*[;?A+px[8'gz,"{g==|ch83@ȅm>?k$?l1_'FX˚bC=9>#ϐL~:}Jl6 FF21Қ05gէLuƬEvaq^6xlH%QT8r,l4  1K#ģN%*,U'myUu 7ՇmB賢uP.)Z捵+-:3A cQbN uK~m#wȏ̮>S(3N |*&Iw$e-%x֊oF馛^IWZox?7 Jի#0;;{[I) )!`0&///"2,,,2.$!c0ev7{^,p_6Od'4)id8z$YڅC^71)]7Wb㭪ơΩ|M0 G`gndgmnnEKB@fܞW^199ɓ'Ij ^_jwI-[_ oXQxvJEµ}# ۟"(,<~ 7Y0j 0; Řat/Y *DF1e|?8SvzHEe7=Y!۵,<Ȭ\%199q,?Ȃ^t9H7nvqi0hMVgO!ܐ@Bvr)\O ie?\~FKQo*М:bM}OLT rN+m- Ug3l #W8~+z:H:YN[A%K%d I|DO8oP=KSwmPm&h$Ӕ:\5,aZ+}%6I }hkXNbfCSB%F &C7I;v.{dGJGWb$)$ee#ksv;<ʩ$%(-ȭ4&0?oה.Q;05|m^+"%&)aUrC0Z/vHVvkbrlKfC2!qHk`DEh8/zC`bx)f0yo9«2|H 4/?juv1-kJřyqstJË_V>1j3511S4T&-C5OEq|:wF:?-v΢Ljk'#󥋪<sIU1n8+5hxrl ;/h(r(\#)?P_⻹Ir%z-ۿmu}q)N>-?v͛fѕ+WҥK#zvvvkv ;EQ〤$Iŋq[oZ(h\vm?#0??wߍ1~M٣q(!ny%%)T*cF-vvB;LABZZ`(pnmA`x۪rݻ}6bLAE/nklh9zu2in)gi3^5J޷?~0 zN{"^Fثګɞ IDATIR}M0 v? Hpb!Hu #:dH_^~j|4 Q!xȈho=|ٓT&4Er@V~6>s^ho?9 @ hbDhA,׬1N ңB h:RyM!"q#Ϣ\Ns{K*BV j*cCKnS:^Ip(&{+al(2Kn\9 5țH 7ѨuIE>B,J)n٧3d3j"qMN kr8Lmb^Xc  } 1[\W!hax@@3d +\k̐ɘlšO%ռ/w,,]d­(5F*d#&A0@ 73Z1Z_Xx)JbF3&zp 氥 dOny1Z %xADN+Q@qDJDT=#,N&t_40rԏtw%v@ uE'Sx)*͔@-/X BQ4Ţ\X|XȏJ h o_pS/}W`1z|x4jcD<"{+b%= *$B7# w$ U^5"3 qMO>F[j0-I \0d%UFRsH8p}u˫芴-mrP$?o\hoېx) o2>,@lUהSL5}qwߪ|ux3HeP7sEbKNJ<%I*=KKKuv(+7677IӔ0$ C>O?TzyCq" F+ouZ3::Zʯ/7 V䀤 Iʀd;ZSViZx2 d9()Ê ZFѠ033%#.F)+X@8l kXCH2a kX6^] IJusi̜ϙ }k0z1ؤ>X7w4$& ԓ1858'o>O_ǨNz&Sq]3&TTv4t3W;BbK\# Zfؠy>.ku/"v}&€К,}tUH4i:idh%&qq15F&:Ѥ!EHB:) ˂8ۋq$`&ڽ@.mđH"b5RpU SRWDNB IRh1%iy(c;:%$ٓQDzCB.Qv$F>΄&%D+) ql#4 sy6co]ĵS>fV] j)U.NN$mT5FaŐdwe֜gwke¾셄_~DNlʞێ($.'G /$ٮ"Yvcnr8{c$/r(I*ňck`~:(` H}bHSNmdQ=F&j6Kv[[Lc! i=A IiLRcLl٭͋8EK,az,];/'$UeExN !׿ ҶwHE4Gb굄J-ůFdaړ$C(Xk IqD儝Cc()I@IbUv},0[CV_pD bE'5ʂn94˃ٵjcD Z#R~ Bx o΁K D-T$FK q3dXHI:$w HHg:HpL` LtX%#"}+3]D:*~o D :Jd-g8[BϟqM7111G>ohW\qLNN (JNvM9 ȭʐ$o `{`߾}[H>"ꪫv\q8n]qɑHqcNG7InTۥ H&~ HrpEQFʵMUmwnKѸ,(z*I>,AlQOV I~fy;$)+vp1>U!ְd5a}Um;KkvTc X?N t? |%N* FC {=J"RT#uMK""F B5ϛf|uI(cYc%GA'}t1> 1^5 ŝ|'$ @m6I_栍J2B%5Iz3|b<{ Yg/'a^aI;F4d 5a`9ʈi*L\+j $nopqfw@"\Fش)Afl"58`׉ /mh!;JmycpUw*]c-GجqD'#LlHa,^? +cXP"85v ueob\znժDfxv̠Ѷ0'(f) U!i5@BsGĩHǫu!ۼtKcB!(K):#̴dg.xI(.VLp:)bvZ ;3.w {C]}̎O_̔+NءymQӇn*ciKzSԖe S8{ـ)W-+IB|TH|B-$d$Tye@SMvƵ#[n6DCBHBd l&(Uפ5M* ҤM$=m%6U:3Q18!? Xz·bϯ}'۶@|_ddvfzdUn3CO 5w;x%JL=HTR@T "0VIIRO. X#LaIpD+O,EB]c![طFt"ʖ`lnMʡάiP9$1B*ޝ#=zufwsjŢ>55# ٮ|خ"v D:ljj$oy>-瑦)^NoWW7𷿯tH) @ `||uiZ[Te%e%N/`INU()?`<˥ "vK.(6_Aa;Vyy>.( %IZ@mX# kX|UASe׷bezx\Xw4#̌(F7X6Nh-٠Zq8{D1Q\L&]@!}H4Su op%DC'FLb_x"bsnd慇a~sK/>w|lYoᝌ Æ 6'9o&Y?ug"$UXTx&" a_꞉6>}kWRGmB q.)FV 1bqk@k;W9v$S\c"AhHcX a>6rC`M}YUt ԴώB.Ie?plK)1k]YCHA,@kT.u:L&+ljt*pqDIqqzn"$ʎZW& | >yEm>3|#=r~nFs}DZ/،T::dZ_!Q=̨υ]|Dla$8ܯ1#ƏBj6Bk9ڲNJ2x\͜JglavT!pcªM}jt;_m5`wK·꾙;w6XúX3O2)lmjG[%gk˔))Wɟ[$HrVYIRVv[!vn^nKc; ɳ\Ѻ-6?IT1%3p DI $ $$qdTfoC~q_1PE@(}"JHG(.=z[ }>4$ $TҧF[ Y>g<\ZwۏrސSw*nj <³V[9 O[`e^a?V oѳj+}O‚l˹#C#p;6rZ~r۳ l^ë_j/b㛛8ë^-}OM}yk2(x"RJrGer I޸ߞIңFRS,cVk7nw.J uI 4~>6&JW{K@["qqISEU%-4Q1=ݷGE L~YEˀГ)}җfɻ v%-ľvJLJ&Ɛ`'RG.#&$ U{6.ie߾Wa\iL_(eYvUEd$~a o kfϚۦkk阤 tؾ9)`m3HbtIwf 9$UcϣN&h~MAFj L%"pΥ9'H1P(е۩/Bg`Qo|תʌ#?kRW5B噈/7Q7m#ݎQ1e(Dw< 6]SL/SHa[Qw%~yGEAOOښFkr<͛??>.s~~_ELNNvt:OHmvH3fwE^)6qΝ;ӞB "}=pr\ۡy4 Rr9}Q} JVq| x$޽V1r뭷fkdd5nw ~s>vjܗ!kZFw:FFF QjddfIѠVߏp$3oLɓV[`8z(㌏|IdXba kXֿ"HrW7(!Z6`KM!xzVsJ<>˅G.pQw8-(}T=v9tfDDDɛ?nf#KZz 4839iSD5Ugu+\.y _Ӧ봠ݦl(.9(RQ3=&+UFF%N1Pyܵ: M^M>1:̾ V\3M'y? وoWOa3k v{o|)bLDB.)$$F}D?Nlp JRSh*"V`"$#2>Lɔ'YV093TeItR JPT@E1<)*9x5HPF6ӤɗS S~K WKKYw3l-pvrph IDATFS%4U:tD$&ۈ۟A'0h .h:r11!Y3L4)i" =N1"|V)2$igUƨ>k W8Uz f6ט c{Bڱ\kl9Iٳ0?x amLu`GBX\zwτX@?ه7nTgt*IRdMllq +Mʊ!LffG+Rܚ)y_7@[,?WMNʶ[:l|B"- EE0^ 9]Xi BFbBgs}Oh/AH]K)ɔ'b`?TPUt)=ӕ]ѓ1=Е䥍r6$iac0$qII"iХI-7!oK(MH-S1)'7y#d"(`5Q)CL<515ݱAY$Ie{IǶ#\I")҈X*#Dn9 /a-BӓJ x[Bziu5Z@byBĪLb=Җ'ZJ+rva!GD :|r8;ξw(/kwk_/ꫯo}^Nԋ/n ~2$ΝzK̔L/Jr% ؐrLZH)ej5Ξ=[ρbٳ$>V T&''Xk,[?e`]%:ȑ'H.5a !ɰ5aukKK]; E#msfn'`T}&a<30yNq ! R FM_cw_qh Ĕ`qlݕRՎTK\T xN̄IƗ99:iB q8sמ/sS&溌oe yck9yKdS"Sw# atL,qn6/$'sTqJ'PoT^7>˝qI01!\q޷e|OyFKrHL$ IOqrȆok51N$U=DUa$Z6(af3T41UW[8s]|a[F@o2.1A¶ 4 jcK 2w4CoE#¤LuF_S$X@6&J}i g6mM|&ؑ{#DѨp%p#$U3i.բ s82kJ 2Y6JRB5eKHe" .&<QwD-gYeQ_VۡlS晨P&@Lqebt0RRPsJ=b4~f7&?n-β$!*12v}L2"(DYRUҘ{ړeueAAH<_ );b6b6mhc]~ c K@/(.(TFdyeF YsnS@-*@]hT"C IachǮ6QԲt,2>]JTZ1 <=,FͱJQ^k@x_, IK >p'KQ[@BD5˜qsDl%KowS%N:uIynn*3g|:x`aɴ=n`~~~O8~8OIF\ϛه&N8Q@k||3<5{)Bү-<  nt.$0~!nP1==ٳgy](V/ G_y_!y;Bo266ƹsz YXX~. RWJEzrEͮ]FAxsg=W>D"WĉO*I5!$a kX_Yp1ȝpB8p% J'`gϜTxxC{E7`T L>zƨ $)?V{ ؕ,B6em]z!biK5nڳ劙M¾3KׯbshMfϟe l%sUD2=QO.•WmjB# pdDE;$V>Wo~/Vcm?^3 b%.gVo@M&8) 6[DޕT8Ґ8>=3m"]61g^= NRx!Ѹ&JeR#h:H%#"B6FJ$\To/kt@ zUksЧjv$/5,8Q;̧ya1pr }>YjM/N2&ѧOݛubw'TEj+GxC1V%-$(RvOw+,'Lu o찚6Ю`ILPu񜈖 2N&}֝QIQ)&J1R[M/rܿ$Ze忷",ht$;ϘXIT%zqeAA>h+c[$EuHya̖s EFB0-FǸEEZg_i~EJ,9ZEu!mo ipLR4n'M P+^bKBZ+2-O FgVB6([2XR؝eQWIA,\2^AХzI}[]+fnkW*'gxnRNF%vQ 3 KmyN-Tע,Sy4*>2(%Hgs[?Wǀ9(B[ȖD96]h%!b[xy.{;,`eis\+&,@&'Y(Hn>FrD }mϕzd(UI^#<-FvEs%Z.H^O f"!255FjxWc|pE~k@P_(Je 2)Ê2$I~:Zk*G)#9L(C  Dye2@؞'sWrwz<`cc5677yֳe?v-"I:jf$kkk[DZk66600;;[,sbbyKvKrP8q1a k5a kI3)c*WT{\^IY:a6uOR8-6+=\ȭ0O{x"!׫qtmaIO>/yϡw-G!F͘\/rjc8&*Zԝ6 J(_m>upF=jiھS.݉kgyNyMn7OÁ>B6֝1^&>} '"k-Wg1fu uZ-`y+Gh0|!iMv4"}Ox ;T))\ŸnqƧIc34WzS/\UHP,]h-d*4ZαjE%)S2aQҋ$JyrMOyBa5X4B='MbNxGŢUm K `֜J? AAU?4>}u%odD!YwH6 S{YkAzgǡ$B}.{ֿv^dan #kAJ;Ikl2FN_hk7 Hizrxd4ʐZah\Pw1P8$Dxhrv{{Svsܬ$cl٤# BR 苀Hz·ǖ_$!} mf ߼9r%MY9×vГUqR`r%ּ?{_"fyU o">$9}PK;B(RWYd   > pWa!WkuB Q|, {l(+".մk]K G=nXaJ,]ki L9:lZ7oc(ˁAn0}ܨ ^~O^ ݢGb $74ۢzϋ)-;x:K#$5tt*!"VF%i 1@4"bS)nnDʰDk](n*J@")Okkkcؿ^~y4%9()oVdm5a ! kXBz]kO7+w 3K6PeߜbMXYO93e^&fQ}E5_b 9 tŁ~JW>eJL47#-<!nrtVt0p1 F#z M0l2<>Y>=6Gh_E¶|TM#bc1(mBoQuziQ/lHF`&:8CSR0FZ۷X*x$aQFhP$#& |'Dp&\fEҜ5{YO3x(Ze~|")q*=W&dS4x}?F0*. oC;Bap!MlrT!97$t8OHv(4 hHL,r.E A+h"G#`W KHHViL m"x\6Ou&I'Ntu3A< UFۄhiGͧ(bbrMԺPfe@ ;DQD$<'6?]4xNѸ!>s:S:EB܋S2@CEHҪƑ PE v,[2kAn*:&n,ڠ@&&$*r@RLFIٕY5eظE>F(c?/pH%S"-»EX:Ed"H - K~{D`$$BZ ߄87!Z`+DRRyzJ"TQU *MVHW[`A ob1Wc& ?sI_%1*NQq5b wu{͙i_/Z1ƞϹ̄k_Ր.T56-Ӟ"[7|3g3 Ux+xmI4-Y^^ll6ۨV|K_}~gvK=oj=)_w%ya2}|/+܍d;v~^"t:,//dvvȂ)Ñ.Z95a_r+W$ϕRJ|:y$f B!io^%9j8p`J J~vH)_<~033e!U18SM677aO}_ a kXC0a kXCHիgqÙ&04 c0U*~(*faI9nۛPM:r.GiMyNkLNbba $ܝH!5S*2W2m LZ2+TO>TݝE6h0[#mB)zә!(Fhk\da6| ܑ c9+X8{?8χҗ8YSoQC8c-1ko~?=+G{ G%_0Û ?>Ua~( GWp>9˧8b+ Cj`ܬ#~Mm]1sqX "v8n~~lԃe8mc*zxaml"t4K!&`4ܧs_q`4w QG+YGw$N`1EUYPGHoe &QҚ"zlm4_q 44aF.rcyµ E02L7HC[72z6}+&2` kL,Qqؔ [fmc ׍נ}]WX_QÑAЁ~ 2=`} F},{@mem5?qwݸf:†n4m8` ZJڳMɮ 9 Ga枸2&Uj춴cAIϐS =$ڄhMcHiN\3PJ Mn̏`DjPIzZ*p1rТl+ml#8j#En+/Bʥ 6ss;+LdώHAlly3QV)`犡b/I RGa@(c'Yr+C6@28KRd `Y~~Av =ǁGamJl^ ($ Nd'භg@,_|Ӄv`%˝XmꦯUP2P$[osHҏn󶷽׿߶ x2oxx[m$fw[o`'ΝO:f!MBQϛvÇo*7_җ"(_W3??w}7JvA@u]4G+ܲ~p);NEDQTۛBjj1?~I()YAv%vPRλG?K^-[Jx^wIpNd{[fYb^ɗO~>8T' CDQXˏ\1S~RIQ1R(X[[677DI$W kX IDATֿ-H2D@ְ못o0 ?<ٮw77cFwY?aEDu >Ќ-Ĕ8b xhw Қc$39qKef]-@ a`clam<חY۰{3 cy03` {<`;IH [uuݳsU]- ,x01B`WýT}l1$W5E[؛. 3<`?yyAxi9idSFul;SP!X)R1Oz&[q̺#&Ex5 M5,bIӼg9s>v¬hYd2Zfrcm7rwi)b;YDg%~%D6u:᜞*?,Z#uBդO%Hut unĮ~uJTqL4DLYGkzЧRXk;;B<OP$5:$kz Q&(*!#(tHE .O8^+̌A̧+IY2kDaxOirH2b7QK*R+G4B&["91JԇZ?w(Kikۨ R4$ENH٠@J$޷Ubggy;!Vi&T<8ȎbQF-4-WH8[ ʠjGEP<e/W<*HhM(gzY5jπmoP&#mcSƮJ+aT4ŠRT(ѱ@! 6okwR#;ItD'DXi"Cf@KcUdʔYSQqnVƆ/pb$2v[ehx_X!FƙEW"1*r]!C9mb1Tp$(VbHq8$O׷n7g񲗽O~O˶A&Hv$$<"c(b0\II.h?+5E?W}:?{uѰt:Q/ I|-T nn*|߿ 'e'HRn_}<$RVr$Mqn TȳO<>1 .f)C4n㽓Kfsx?F s%P=,PX. ϕY):[D *X:ڌQ>7z؇T N}0 ;܊,>=13f}a}"CX|,]XIP}zZmWl9Ķ3<>lDŽK1ɠ2*JCf5[c1èmlP$-e:ݾv&!Nc V"4mfNi۔ zWD it$+Dh_mhm I3!F4D0nRMoz>կ~5GkTΗ7Cޜ ?~E~KG<< Ir@*F\Q[kvAa^OIl})7+HʁL}[ˡU=eK,0ە!e~1T-CքaXjA@2rN۷;,mvz,//!fz"(*þ硌^ODQC=حڭ]H[[tַTANKF~8F/&eR,Lُ^*-/kYde-["ؾ%l@o# {v8bKs _  '47fλA&aelHU=ւ1ʖǸ>S%4K/xjh;wX2]Cr7=\0De޿ Z>:*A{MELm~caZ NH3x"B#*<0sL<Ŋge|=W mrm%&>6){`XhH{KJtI6AjZjJCCFZzp#nuw/`M"Ѽ\NdzxK]vi#PwV*DˁH\WzJʈ`SQ<2]BaTl.M w{NTeS6YW t:o IA t/"Vfy/Q ,ޥI$MK"=#T&d҄Ȃ K.n9k\pS=࿭i촄 Gתhnǖ /g¬pWGibfg3M-"$# Q"&)Ty\! 87S,݁ЧJ:]i"g"=Ams_(p pprXX3|s^m w4MĨ*J˨G,(IJv[m¶[d3J| H 2JtsaCu6%P7P5o7ČFYKǀh%X)T =k%+!mσddaNqt̒jRXڣOb\\sP X;C%~X9qsͺ~T#*5J\I. 1Vٖ#w,[e KϣucV]Vkۏ?{Wn]"=Nd$Uڗ4s}nhd P A\aI"3md`v[C'k\:tN+_Jn_o$l@=bӜ>}K.89s̓߅oɛJ"}'87<xc-WӔvj<_Cqĉ'#e;i)jmR$WxP#_?˲t:;*uT*W۞ZybS$۷=;\M+)Bsknnw$E@[ Iw>'O2겑}1 5^ᄘf0 }+L'`ў& Z #'٠Uoؤ$%?Jc$gp,[ mDo'4j22ϹκѶdkcMn{Kn6^+gṕٯ0uǵܷvkFbs||? Ex8!R,cĴ֠4gT%ƺi- yNcr ׉Z4]T5j *Q3!4tTs3Ef /|  XQUTئW 8:B z׏i\$yٰZ[UY}^~-+~.eSb)}Dۤ5e^h`>qu@ ؘkrw|^/>ˌ($lWG.Pml|+A82%H[ dxQ,Adh$$"*DG%1ӈVf4 .1 k{$6j`A0fu*M}XLp1}pbs`[DQ\3:9y}Zg>W-<1$)F„gMe׊pl%LDEGr7P[{ g7W؎?RiuHs BӥNGХΦna*j||.1=vwDKb )0y(RiZ*o!~]]/C퐠 پ O]h)=5-!Z J9Emm"8[H=l~[ZH%.μ[sGۘh]l)o_`0i9 $FMrߐprlduĉo닝+YeP$KX: "=W '8/PJѿ;5!I,˺b`$_;ZVa,..^TyllllQt\vP.,OZyv[ۭ]^'RoaX(&硵Bڭ[[kz;OP4zN4XFZ-$ @ӷ-el ,Cblu)[`c-J `>Ϫ=̈́}vsgrq'{8ۜ e9-r\/(F-de$Ymy:zqTŸॏ /jТ]4wbɟ /WXm r/l\{1nASl<{kxx̉SH4u: wFqNTcsh ڨt^~qKIiJUDZsCyTUpIz[RKգ.;:gx!b=^3.Z &K\!qλԺ}cU߅t m F&}SZ-|o#=FԊcQ^W匋5$)i*oT+6{;̷RlK"&)Xl ꢋ4u虙:au QZ"P ЩFؙY>]V M,k_h~bG)N`mP+a[yodu'ǡ Y▿n΂z!LOwoi8ɕ@́Ij>Ծ\ }c4=dpˍ&BIYLC-BQV3fXk3fBQS=|cKH[d,v G MH }"MtuIt?i}Zk"ҧFπcɔmA+K8>͟op,$.]1ǣP[AevXÜm9oZ!4a[lmy3LzZ-)m_b>O6Gvkv!n.$o`?_w2{837Ns1cGͯ\6㌶Fy5é#5 <_t >?,;e@vF߮ :v//8U;#iСܤSG?.5lz1CXl6w9 ^\RQ}(!M`&>g?,#&NP٬56P6i#l8M.@EDS2 gQZ*AX$!vm:da]hb_TGBRz)5=/Ǒ:շWWfin퀻ϷyCWߏuz FF'H,Z 櫗Е5PdS4EVA!yf9t45CBr$﹌W'jftUju$t4h9f哊Tl& lruZ̮eYL&pḍȁ im.ӏA7 7)6{kxF,\iʭtKdY?%Est V[0)=p;MtSQ+,r8Qtu0 0y&B!3":C{0Lm@B6?;gI>6Wn b)?&H۔#;*-|-Zgj`BKfark%R~5귨1Jj 2UP00H<J IDAT8$)Va&_@f!KnKcC2ʕO?(;/l++$gT+ZY.h&2l ɀe[A!LvYc0[YXb9aVbr-Rh)MDR`Sz.9g U>5T@S2۬DaHpq%)4̮]xjM{5/.~wM׾vmOWE/=> I$`f?OHΜ9=#9Ov$)7DMuJAy K^>Oo7ۛ?<8(,_ԷZkvkv1nn.$&To#+wM^\6=W% 4m4ƀ2K' ~Q pj1~Ҭ4HqUQ8"{dNYsk=ƕ!,5su?+/jI>5^qɣoO=TjIuY9XlJZhp d)FYޢ45#6d~f9%dFiH BiF ay/'kŬyw0&;a T?=ι*j6k݇Y. E?JRwX;1/퇶\xi40%SEAk&[5Ir9_;{pY7z7ŶiTLzf!v#-" @tImj+9F_VƸMblr%Ic'Du$˖tEMiT 0t}+&HJʢ_O͢14!d(+ $zߙ[Kb!mi,0\P$~/d8;DMG~?=knFA5>M$_K[{QgZlW lWl*o9r$>*!wqǖEpxwь|{r%Ly/6>!I²,Hʐ$W$[|~N>}(nyO+kb'8^ 9 Cָ9rH8/f9q^z)ZmG_ӻڭ]H[[~}N7оiqzݵAr sjNc6 80'YtƱH9a+<:6Si\XU8\eoDl&TMov'"k<صYaզ6j.IO"l5*(vd.FT/BD,6}5~⦱(HC pLQH MQĪ}QNb9xJ*N>+8!yo]LK4v,_3g;<|nNWSkX¢ePL>5c8:z<7gG?o_jfd@lZXDF[jIv;ԓ3`vӮ4 A%6cQf:8G.f5W!Nqj%H4 !F9PXwZrHH>JhymasK_&.8,b OOXs8} kĩt{Ow:4*\}zPR2a%?6,`bIsXMϣ>*TWҝ-Q4󚪃M R^ZG$BhF:<|"UWh{MwN1$Yo71OȔ>D1դBV82 g74I5lf*.\b;CկLq6Nh u4*+T69eJ8Pz; + ഁ"<u k0Y&=mh@LkF׬?|'s/M%[.IBIb(x e;C " ̾&)+RkHT& :IJECO_TںI[7鉚 k/YmuY:jTĀ!1Vt2* I$\.$&$. Ȭr-o=>`b*-c{=Qh!1v$!N$LN Y=$DqD< |:g5(&[-D,Pdv[YnNH* 0(M;Yl|L/YC-Eۂ{O_9A }Ȼ*ɧ1RkmtQ&sG8Fѣ'4P5SB!"nÒW`pD;fy | cX>;rMԲicn7r0o$jwTvInmKDM#+/m_5g~~Hfff,ho?9(N^ 8.@W_} i4֚(zOeHɯreY=:,[Oba~xNj?ǡ^L̕\AyKnUT|}ٳgrBqQHR LyxnR+@ﳴħ?iz|;2Zkz^?8?ï٭څ$[[[ٵw,4չ `b|i*+bz+;1o6A};Fp?DecMV(U룜v+J RSMfH"*#g:'+x :Jp#Gh[Z#BbMU,,smz/qIptiHtM*'躍uYkq34.Z 8Wiw7VVp[T+P+qs`+ a; 3X,Nbk`.f~'<_3ÁfT 42aL!0pmCK\;g:Ҭ*Jz23i?95]x Z1 @2!`Bw!n}rcH$$X Xv NUa'f ¤Yx:!VN}M|i8{o%d@fNfnqG_M'OQ>9|_\ T@n+cl˨B㕃F 4-墉sȲ2 BQCIrp²,&F/??cVWWY]])oK)=Ж/B-$eaaKrK2tIӔSNa\iy+^wMR)㚦)E{}R$W*Ne|Хl犛2*C\wu(p]cuaNujr ljNg?fcnnbڭڭ?:ٗ\KkH-F뮇:L쿜;Wߕ<-VؤZ?+<ӓTG]uZU4Fy&nJW8짷Guzca}YB#xE ԻF*}HvwC%&c}b l"-TC@0=*VAh3T%8IPW1GH*A)SJcڼ&H,ל6^3ҁD/_Zkn,/-A \a_o O} _a'(kRbKT4qsQn!I/ Yfb潓Xi&9iK(<w ӵBIS5%D5Qh$I$^t ʾݧM frP cj_eϛ;)IMxn9,Mťq<״3\AQ{1pD')L*[ޑ\IR0͕$;AVeIvo%EhEZFs]@ rL<%\SC9$qI+xPa-K$f*ĩJ%qh, eub#O%33.Y 61QPzŘ2)" 5"`B)LfMJ;dy6Z FLVhrQrKP5R^ʙ$;)Ib௳/ ҶJ %=v7~ͳ ɷkw rՇzKNOy\)E/J9>;; w뺓u-J /JR4>vzR o_+, I>&W^y%>UKܾ8pnGzT1In>ejJV+-+W&ncc8 󈢨eC7My睅uH) QyrP] DA@*br`G_o w컵[dwvkv;4z*8?ӮoSo}suËZ07GifO&L5lcub>^@WQ `.= gqExդErx'аB6Qjۆ>298$^GpuXf ,OM*h$ )F/xݐ/4)hA*e*Y&{m'D =%OG93 sU& H׹@ؠD;wxU]c}t }_K๻r VIPeT_U4xGLOTϱuOwԝ,GhؾL› LvLBAC4\6.Ҡuq`WVIRK77NmC| 6|/~ŷ cӤ/qJ⤨a3xQ.wny_db߫u!HW$Bw]OҾH7*I%W۝!g9ydLפ ̃>R9ZV|}&]N Pl${_'؋ Iyh4صkKe[BxPnV4MF>|gyPRW2sssx㍜>}UiZ|~/Pu- IDAT뿾$iZEE$ niF^I$s(ҹR=7>{9Qs%@R,t],k4'[V~w~gߏ1N og쌝v;( |ݛ'/g%,΁:L_)-E+b]҈S`V68~ yCdrX4n0X+13ۻFK(He@a52"p -:i-MO{)KAފ@)|`|VR M؊r Sh1IzB7saeD(Re7|~e ș9vv+\<8R.LBGQ2G} y^Ch nRk+ +p<^$wlOt,4&-39z.gߑY:8TF*34/u иVYM3)3rw _ Xe>O.CeG}p}Qb A: Y봘sxLE{Vu4%{9ANp].Ч3tB]U\`=`e YO\O!J˪F:pwO5)+Y^r؍(JM8(3wj[+Nȫs{fca2Ƣ('5L:&t 6&)([ sL98>6,§~B܍]${AÑc1 yWIBcsGF9F~ /%v x8g畀,&lo﷨fWJ(8JJQqTX)dl6k 1)1r #0 o1%lԎ4? ImLf#NpV?)PdyD)5C@IuT^En;z}89.dPB1 J4Gݑlx>^];}[T?; ZΛT~QK >+|p.ImR*(*37QMwRU> o*R9KJh}- 4Pl:Uۄ&vF$Zd i]YJ,RSP, 4fI?T@N%ڣs:T.j׷ -@Xz6-(ǀFoƏk Y_Z!M39;I2L>-q[V:rKN+eSO177۪ɻ_C֯P?O }劘t\))U'KK>32~iyIlkaA*'ɕ\$焓.!DR9*Q]5f(LMM]&w]4~c $ᰆ#^dgIM:x&]GQmWI󍅅$q팝3v ;cg{q`fpkk<~ 3#G H COSf61+)x832H E80,߳̔#" (QQpYq!kn٠%7a Oyu`,9nq,! fȠ@fCEvK2$Ў48Ys,pi) JZBa3t?B9#9އU攡Iź|gwV (r ɐ7F_+?ǝ; nA stQ~<_2+m|rHmu:߯Rճk^?O݌Ir0wHZkp=˹C|\<2IR2PD"6b #r8Ou]GBr)b|c0/. X ^5h0" "^`N"xWԴ!9s  +|&ي4;$1#g>{LKY mNJB>(%R`ͶlYMBlhg8MKX!@Sw(% FX ZFÚͫ"pȁefcnN\# (p49B4̐ EIDGieW r4(UN猑4WrЦdF{98c]tp{1{֩Z^̯\ mu85{]\DWP!Ё_nSx6o%p[~/],"gxk<@ gIhuPB6dKq ҥKS6b]G6a:\[ui}105(1-jHR9);=6%- /΃<}_B%M,w/#"Uz),mvwd]^uL3yr O:jHd^:']O>)cp P}- uj@CŒ )Ц ./_BJcfټns2n³~{@h%BN >_6$YaPDl{oMr8vަ 9j6($p)A*zp;ÒE_w|19c+AkCMoz׍: H\ 8Iwv@4E)E CN8AǼ/h4pL: ࡇz y^ fffH4MAPnEQp fffZ_JFcK1n~<9{-/{mZ%QՏ3 x7??$Vc8\s \xz !8vpx+8u/{Oc섫D)뱴TGkMFiI :nWc ~f$W̽Moww/4 ]v ;d팝3v x[&n\ *lu%\ O:l^8%G/ Os{n#=%A7Z,`_q~{aQ̃I7d2+ SE$W'9ȉEZG[DWӥ#p#49 ;;@F$n$s ]NLJRqwŷa\&CYՒ2I@k=d>r)8+6Qc|z1tAnXE b6;I*GDlH*Lu9.vEKQ5yq>O|Ez/ޯY}YwlZ?ȭ" -pdz$i6Vm/9@}b !!Fhm9T6gY4U,^H3$*>lHňaJE3!ˢ;ʌP0;epcbN"^fn3 nr!^BGq9Q9} pj^uPʱ+C5NsnZOl3Gʣ}1*[|k'%fXe8hbA/‰҆pxj(}셐efG|yC˦[k5CwL 3,b088Onf wpFX>}ܯzǠ ?05+S%rD]yNa~$PϋWlRwX +Rb~"-yN!$bD"F4ŀo'$]@8I1Q)*\P{u #W.yB, +S)JE`$#b Uuw/{7SsQG=QD!("E^tUCH6$x7C}nKe}*PwMGiWz-k!)rʈƌdB*b'M4RAChX/'^G\] ƿ!dQڝè\ئuLq$wn3yH⌨.lUUR[2?4NT=N[ρCP`" %6$;$?[}{|;_ jZJy{񿳀rhAPvogW0?y12̰O|x |+WGe'9GMozǰrAa $],U$YuZ&wr]$h1[æJZbU(|dI3v$yu;cgHu I|? qȃp-ptXg5]?{C!5q&^ٳ9TWcV\"2g܀]QNb$hs,l<;_(؈:K,rYf^_ %* m\O\2Ȇ \"qCE߹thQƊSSj%}\WFC%|ZuYƺks)fН) )s3g( C&t3 ԅRsѵ=.Es^AlRr2}*0JuhPʐDC ;.]8CCL`]"nsFG]8)dF"D- ͂0 $6G@;I{tPDQ0$#a.+ryM9? A?;XB ЌM@YxaA!fww,6le/.!-^suHwA+SbG?ZBs77!|y |D)*Վ['P2y\kQ߼-cEؠ *܈I??VJxmK[ږ5(1But[*r}f !J3QAs8@hLDl62[:FĤchZn:I @If}sɟUJ0$ںsc;( &$Q-kAH,KiX XE$,=$)tPRhOԚzw1ugSAHak5=p'83܇sC7mv/ssH3kG]8 Ul_ (]NA;H%yVerZx0HLFN#w$ 9VuL IDQ`0Ȯt؁$;cg3v;||b9`ȍ@Fw;{,G1HaiM0݂BD݂g{3drHGa6~r?vs#C.ݳj P,#"RcE2q֧,$Q`Cv"SbG0f$R/:]F?,Ѫ`Wy+ L_>C'MF̸JxZ\ѭ$F\n+bAFWyג)80(r+|K8!#IVg`H프8`Wqsfe%9MEȆ#69 'Q)KzM1$B óHf/-Ҙ%eLHu3O݈V?$DE$L{,lB (R#K{v0mҥN2Xi!=%I7{zW!]_.@ qخ\Ui!9cWO~cieY)2p h r%|RNX5xȈdCǿ(l6}ZLJ)0(֍ 8@ZKbFeJ5$ֻ ENrNwSjqij착֔ZczU bI"p-4^E}#̼Ʌo?|?/~2dAH' &A,x﮽u>;NEOtbC_ F:dj߯+@"23.!I0^1#@IE&M}C [rT9dI8z(G_￟;㊀dSyoqAl_&ƣ(o4eѨ. \wu|K_gffz} axłx5Abjj4baa RJs7|cOU8?ƘzU13WWG_UnF$eYr_$6b&$=PF#5t|_&d{;c켺3vQZz?1qǀWͲf0_?KGB) =%֎0B P"x-!O@ -DZ'_D+H )5/Y \v$1c)!Y"xn"ۉ͈]q^ 4.6쐢Ru,Ɗ7j_բh$5,-3gz|࿒'D6C)0 9UyJR Ri֘b8^΁dI I.96hv @C$Spd3+QƝZn\\#w?m=c91vP9I _bSt^Xm|E@Q_Ul #IhYcUYc51S h¾՝$Y-W& WmA Y=.Fza|uĜ/ '/Z"f]tX3ޡ`-I1 Dyƺ력X13\p ^U$":RtE"GD2y^0 @$nW*q^_Us|ᮻI'v~g>AIi* !#0p\S$QyFh7gV mK0Ԑ$.SB6 q#p2N6J&JȝtTΌcO:+*c&+?:'|1^Z?-BR*M)5 YxҗW`uܦ՛))TL{HW-uخ@5Rh-6]Bl8D!#%Ջ?1$z CJ D%$;}';K~?K!UO}S~x;x߿gO泟,HeٖuUZ Z*Q?maX=G?-+ údr?#բl1[hd77я~~Ӧ#UYI?KKK4;ag쌝3縭Crnex5SEf6}Jq]~,h).t,+XPh Kn/t9vCأ̻K"?h`H>pE@#2#yNH% C,R/%kn'9.bp,OʒŐK4C β J(G!IAٱՒE{#3=mER9@|_3CJ}|PTJH* Y 0Aeq%|W it:LkDXhQ_} w}) %Ln^l\y1teh7.  =tptwSX+FbK)TF3#>{%8Kâ 8RƉL9IЦX „&tXe HS*(A0)!A I]㺜EPwDeFpߋD.D6;RnҲ2"z;M_֍ߗ WhTfP_En.F{H"K%vKeTv)wk#箊dZu}KDX+y{>D\ EûyTcd55G`]v~>I+߾պ 3ߣ՗zwIXIDf$$ ' I6^*@ROc(NһW z׻/B@?,--!ApJȲ,MRk-.TR $oOYa?~R ۣ&u]z &ad/vSNՀd^LpXpjrO\ Xkv/$'c޽{k-gG5>[u8tLWΘ$Ih64-znwLoqpl裏^}9a I&amvq??sp;c쌝3v$zOi/3beadgT4kJ: Af9+&":]E{BI)ӒrN7/Z~ruxHiy1m9Ipr/qJ2 Yb|/$WМ. ce4S,5}n F2"(C0(cw%ײg+ρd{]0(n6(V,@*bz&K0p3׫'y|"`HݵUpyuJ(H3aQgn{'")JIsj H?1ݯB8}O\h82+~o~N'))@Hm{nU߅l=Ů<`e%wp~q'+/Bn1\ ɉI/՝ Z}dl)Bcr1gKy;ɧ1e֮{$8vƔ#4],6d6[\#|F+`NIq$$zc s:U,Oy5\A5sqq"%#þTӚK~vuUS: C(r Ty]XS* *?SO,.d]@ZʢeCYmOcD C{ɫAT$Ѧd_pXbC. $=B-˶LC~)_7H(*a>qQbqI9zwvsB4 2xFș3gXYY! r]nTDlooCV+A I2(;S*_141Z>OZk|/!U@R+*H?SfffcQ$>r u )eqOMsE5iM5iMk Iѝy\NyG;XVG ^Vx,xZ|Os &r/YaREK,uU0[72ofʼn}n(Ex ސdn٬71 F rG5D7ķk2 @)9GP]źF=V5bb{q^E,iaC0(l&6%F, 9VH"5|,/CHxq cԂt=3}6I LX$ܻK%w*: sǣ{᥯1@!~<8bOf@X2n"+{u"' kRҠϪX^#V."p IYapEEE Il.߾E3ZČK.[qAE6ǙN.5R*HXOEDPI<HD*$AR]sxsu[-"<؏j[\*NUb%Nqg@_&")5^]d AՑ9[1|KO\PY"LgS0N\Z B; 2\^K!Ew,$;-TGV#Ry8f.L@zL; _G;,$՛>?x;x7$f_5~|U5L,xlBqT¯ ] TIa`9Ҏۅ"Ԗ$:c[\Fq_CWWEVB!{{^|AvT IDAT<_EQH)z* &B5`fHTCϟ?O/sⵞnXfa>oKe&%$zϻYM@c G?Q n뮻8s y3 <'Ns4Mmi4AP,%B4sÈPsE#"hv$?&/}/_XvA]yzx[;ŕl֑_ȣ9-*K rR&4h<[CbNkZ\ǹ:QlE<"> b"F`kϑiRě8Zyv:s+`J~)-;ǒ@/s1oӔ)E^>5l/g&yCwGeakbaPi͍Wy$G~fn<)A,}Eγ375ܩOJ64D4N%b뒀 NxYb (a1 ,4t1ג߲624.^#4VJf}'hfUGG[f&n$1~c_r}apȜKY|Z@B8p[^7tyG]Wnp #d(.\hGR#-_$i摦I&vz7)/kW&p1c%I.oE.dܳ)d+Qt-$}V$V!I@ȅB/L| sz D?}S4<~4pJ D"AˌI< HObg哔SQowHSwEʱl-~K]pĈz3rPZEP*h/:;/EN`b|mo$},:*aT^תB΄.?so} Te[R*,J5He9s*]Uc-#\P}&t 'yErQƌE'!P8)ekKPZ!lXH 3$GQ7CjfDGNMsd4щf~_ru+Y9I p`> o$J KWqݸ}qҥrX|zHUQ4 hh4ʦt5 9ITaɅ &Ρ* b=qWŠ 8j^Tu{VlOa %0CP׿:uP>˲r?V]yJ[2O{6uADͅz6lv?{}ѹZ6IR#]CHCK9keYn2\lQԈѠ`DN 0}hb.Hj3q3֒5(, #BIG*| d# B栗8{$!8]BK.]A͎8jё]s{Ŏ0BsIC9p6D ;$>b4SOu`s2j {^]zk 6Pd4Nٮ)3LG+ߣ+;"=K!3 ü(rkΙP&Ʈa Ϝ8 {) bw1'ggCbs GǸ0s] {36wcv7bCxD]l=G4j-ZS-ld];<؈g6ts($v󻁕Wqjn(x4TvGv5hQ\ HXvi\X?oD"r}.QD$JNhᙱU0*r+ FwkgTX)V"W u1t!OBQ!E-By}R镐ƨTTandUU,U8G  +eŲk Ȍ̬DJM& dV32@I"sj 6Y|*$.$",/;"",vYƀdhEdck3 fC" =RJI^ |@7"ύq}.l: I5G@gҥKO^~Gߚ^|ի;FH$I2(䠪 $^Z6VeSC=+^ |' C/WëT`6JS(I QLo{G> "FQ mNXZ+++NכؖLJY*bZ!y: Hn[3U:Ҥ+ MWw;ܮa]c;rMNFܜaptZ1|{nh:=ifɛn#mqn8R*oD {w^Hn45?GrdĎ^$RuV@ͦ05ll!ML- /Q6e!D pDVzGkDB#죄f:Hxn\ N@\"U$a)]0qs ěqFo <(I.m̜S^"aae|͟<g?11PHi ɟ 6˅D F=Ҭ /\P#3@hM]'$4t0r[In͟"C`3dO41B#R g^EJ^,CI(x&"inOuN>lVb6}D/\ c'df(:|TyH#sK=w3x1p.*b_%5lbN_&gI)-$ p[e&fmYvA$9YP0lIM?"6#zqX㎽ǝ=Lw4OݵsSs򦝏SSCbN'<̋Ṃ9NWضd'orc)૷1q 1@mG:[h{k" zxxTt(wg;0kM~[A+ D}x̠ d tǿxk"!|dy}u|J($/"/I.煺ٿkФhjqb? 2.; Ts?]s#H'rDZ IcuV)r* XRBL=C<׀_H |/.E`lM@x+]Iaeh HS,,vg Ajj&sd@dsD2_&a?6RѦW(鬵mYSirg8q\L}@"+֫J5ԭdV;$}"BbTy\NTx*S)FK*(@*-,N#jn.jDaF>I 6 pe954`.eSXo -'? /n!a1~ a$W3F쓯p{طê{w>~|Pc0HHJ*)Zo`fo_Y+++Vݰ ;/(9~8;C֘=dT$$岪AHt"d8/|WեJڄ/@jsYr0ĶiJfgg]яT׳wۿiMk I5iMkZ߈[y_yԊz2nmn_u9{W_YAuaS3NԷ H-bTFЩC`hez"0P# S\;>#Ԛ=T~l I̛g/#Hzta`%͸9͐Hhuvr؜g-\BJ"՞f\CCf1q{?j eJ_5ɬdlyzaa GGט˶|U pS s5ł7OmqKSk̈]E_ؤ\o~EMǤ+\!O^ d͝UDH?j|7;9nbg*K#rph25CFR R!*NIv6G{/rRX;ϭ<k>fOa M[n63^B +vlUh=/MsHFSr#HV?{P!kC~Xu\ڀzD@@58.epw0x߫(V>+?5@(W =r,.e1=GΖ-5$G5ʑ#0ӧI czJRm 6/pja-3d(Rİj?piZe:B*V5=Hϯ-нOI\;\x)]K\:HjƓE6F&u9MۑWt ?wЍR7Q şR}`x|k2),<&i6F4YkcT&RIRFI'xl52aH"D%^T F^$ic2o TnW!]b&aq<ꅡ*O.>寡B TQV>%/y _Wo~ohVզoiMk I[7iMkZS!ʺu>}YPgNHϬ[YZ٤ܶA|u±%h07t@͹>䜸pg|[iq]. Rt]ͩoh=֏/b۟"]R%! 3.A¯c/ 5bTf逑_m|u_'5ӼhaBsIbHH.h2@ 76C%bB,nzHDO&4s`ͻ].4! ;ٓ-\'כ?}H,|ɼsɣ.qL#e-=J>EP!|S(cuިЄhqYgybưK`co)(Ie%=fLz,+*u1r=^&xɜë^$.AI4)z)ήOwIߋBc$HyӽIIG͌V' Kw$,ĔKiIW}'>() 0~lo|ư2:t;. uX%$i~7~;… BFpz|X/jh{^HR4ݫM*,)`AP",RXRe0d{{4/&c 'OիM(}SdUQlsHRQL?!{Z^1@pB]$iNh5RUo$)i^u|,--sÌyRh4bww擟!R$ IDAT_K8r8>I0,Aش5)Fִ5i $WڽEw-|qe>}> <۟~e4gV,u /$f bjDm%E+{1GAY$7F#ֻ>}kݲYqq^r~<#0Bq~؏qut5bfM LOxFeS.p\%>*i'% <'r],crp\f!]#њJ-1 -= )55`S/LS9[x>\xpt@,E$<,c]@wyHc}Vs˿O]@/XɜsË|'Xo.1)S]@;)K:/:t] }b7{4.kͣHng铓KuF`-a ͸Fx [<)X8xyAlb۴Yȕb !S}/OHhr2h&ͧ E_M^ psh27FKn嘸)`nqvgtT#HEؚkjߵ0=d\' f"<ŚehאZ0(vIt0 &34\@*A]⑑%nV8Ƕ!uXY""l ^:_ܸ&6Y!/2|lj Pe#Hg7X[605YaTT ov;bzTm /?mWa?nb0qkFHqJѣM de(tֲI?ajYARu}C"#u*LjR IDP& ?^e1,IE2;dlЬnJLZn@I8hУMv I2tiIJ`rn˙qĄ]†1su(T,I`ɾP?-U"w*!> 7$)_~֑:s`+$I~I{/{>5/^=C^|j]ǎ=@A='lvhlWש)G=z-֥b0jUBh4O1DJIe <1 C,+0ŴyHqv߂ S.w4?iVU\~ (A{Tk<B%c9qKKKBhLdT[|2zիJAuA˴U*ϟTD9{OkZӚBMkZӚBm;13eɖ]Fbv gμ 9CugX`?ڴ,Xd7cԍj݆c=9bv5b#lBf# =rɈnAb0`qd(^-4ÌN SCɎcj6NlE:ˬ2'vtIR e-^a1j +Q-DJCVc.N5Ϧ]TS!Ol湜>z~lۍ\o/"< H bne,cԚeԬHO]K__s+yXglbϯЮ23K)'M0l-su.q7-3gvmvj'+!y I>-ĥKH+uQD hPYhkak{3[6Nf@1/S v;dnl-R<%K m˃:Z';ɐĐC(bNp=љs|Vnj٥G,̢<7qDatc%hr|j(EZZLHBC*gŏ0c-_eEy#%2MuIMȤFٜxu2GScZ]x,moЯcS0f`8 u;]5 iqI2f+j= = iie [Og;H%(f} CQG]; ;u^d!ٹ|H 8V#X4چĸ!h(~d+c(*ڲlGj^{+Ɠ\`/Ag^TfCXl2K P(\YDen Pi]?v|u1% h':ۣE$B4օցḯjC&1e8ykg8dT؃IkMŐPD-#CQ/Af51n'x6u ̈x^M"}ڛO9/,b1xPGLC"eeҭ2ei?t˿YwƱ4)Bd߶lJWDe3?d&&ʂÏk5"go^d hLiwUd%4 (X,P&PX,L J4*M+K4Yݡ'1#q};HaxUԀ| ^$$BcccXJ6&"h@`Б˲6 &cǎTIzA@Rl[2x>xBA2iZl ˹%$jtuZOgnJ S؁U?33֚/2 XXX(N1-J" C,+%Y\\DkM$7T$7ڧ?0Wx|r<'(:H\tcǎqرOkZӚbiMkZӚHL5??pd<\{$#` :e-Kui/ =CSf;@ZإF ٙ! ! D>[=(j/<u/!!A&QBkuI-Z!2Gh {4Qpwɔ!l)rR|fŒhQU$%S$ݥƈ0-=rr#zA 7{ o 2Cmq.~7Nj5k"%x6!`׶klpdpk,|!;^Cx\6]գm' 9dh6X∼-?AÌ>Ɍ9#9;|V8e6~7u5$=7C~3p6}g9̎$_9n0mH_ r6P'Ǚv/2[#@*u4fȬdk&SWzfr`gP5lQ9"^rΓQ䬱57/2H{ hH G1>V MWwYtDϰ}t!mCXӬnoSt [xqt@k~ 0HNbTV(TnPyH(F쎚22Ta'=A<9N Wwڋ}겑;ګћe8 h',n1hwØs`!׈e7G yөd7A B& aqSD)pby +S\3V\gVR3V,?*/ Ƹa_4KT:M…K ITD&5V5)H-|5.WaQ#>5TO:@] ˜&}jH]F:j h{-2޳)Z#:Jѐ6Xf(Ϥ&qe&utTz w;a%lzyDEY,CЖkGU@; jDep}_loLO"a%~.LY4&%/T׮]ѣ`թ7*lTP{y^sssiJ`W }fFA*@|3nl6BRi 2O ¶M/{`Ysɭ߷^'=m^$Kmݦi D C@h1DADY10L44rtL/ ƍ 1X`%Kdۗ^3ʼyg<]ʺU9^hy*^z p:_$*넀 ;QX<K21+:g8 I& ӸI$NFګEMV2KCZ++4BM/Nĺ.1>r ONspҘt94.Nr&z$&>"0d1e9\ӋT7IHk] g6_bC\ۊg۩x2BU+kYƫ)T $a|۝|S緿p/2}B$Uɷ7Ǿ}<_amat<?2+? WwYIǑ)20ٸ&2oRtS Ifc~ nULM/A@}4$5 5y@j$WGP&#rB/+: 71!.qI 1>"MTpg#|5_ʈ$sqt 3Ie8f)Xhb%HDjj8"Ioj&Am٫B jD B "ߣ,) =ӡ5t$hM긤RsG-N%g9c# eD+Nl8q%ui(Z3vW!$;8JOG؃IUrX ) YYOH xI@,Iu^]9MG0 z݂sSj#w@`O!V (pM.aL`RF g#/w~))Vbe`+!R=:"iXBT8Zߪg-:6n)93eHq$EA?m^nͥ,$Ǒ R&199ȡ 1-y#:]w+p0]=O?O21}51KEX%;;;BS!ɧ?߲*gI8EC&YNJ ϛ^xB9Q9yhjt: "ǤhZ7$|=`7}& k0PTx8<qdYFRרyvJ4%CSh)+MK8΁u Cn1Xr}|~/ԧ疏Y'y.sRAAJ___gii%zZя~}c/5׼5Hw~~:o շv6ېMr$y naeJZ&lvNI,2I9#uiz M֜S!= levqk21ᘮ|t7>k 5Z#z?T̛kŽ ǀe#Y:^qK Ӧ1u1d9ٖAlc;;Jrvֹʢ\mawT8K,uV-&:E>R Rps\V] kң&sDf( ]Z֭Cd,8{P81uYfG.|;¥Dl~x/%\$Z:B9OdWy 5#L[V%wuČVVl8yvyri*תlxw֢GE` K'X!B!DzƓ'`xFe2iM/ʮYDMg1U4@>CQ'.p}l:2G81@݌ mwht*WpuEt6˻[T1kb2\0EM"is6(`BAG "<sD_常'm Tv|a=&?)!gb*TJi3jLsAI(2 llͨEn-$0c07&NgSJ| kγtwRR bH_8Tiø#i:pVNGa4im¹ l\ĩIx@ l]䡯 (lq7s=90jt6$sFV B\=a,w)oxaD`x<O]7iHJ-l0Sڏ. BR j^QaB`LosT?'WOn$vp}kўǀ^SFT1t@=Rb݂,Z)Jh<kdn ^d%(CEb|U`VIJ2UN^)lA6?]PJ.S6P=ZuybFn l&͟ci rF"(^ Jf2:S;"i:?q(_SFvX98LI"0T(ehx}|RR0 H& (aʑlf>.-H8+F$>(5}NVzϲd\vp_(ɭ^HO~r~r5I@ϕ#x905@!<ࠬ x'YYYaiihą XYYROth477Hfˀ$WGp/~{キXf<HP(UQI;7ۗJBcJYbq2M]ʹ1ٴ_/^w(~)+@4 },,,e;;;Bfiiڼ59$׼5yO7ۏMMOXzy>{yCutR+ګ\xʚūxk>mxe3\aeh_+A$YDKy~{ &,4I52#6hA2P&~vm+uX~]XrįOQҦQrq.[3-µoS3#9 A eWwRF ꏩm8")hSUNl_,H&*ZJڽ"H8m^.WY;q J:B 1H3oi"SaR0nm+T$+\g)"F01t({(ʄZL*\]YaƎ@|l!.c,Ba]$ZeaP BSDHĔ&]I@L:~[+c|nգ#ž]^텳8jd`e[.>t}}l&&y;m6io+)~d~m̿(}v>oE<$)L pG&+<vt6CX=sÈ|iJnc~K9 8/+vb1j112Ӱkc qf_{>Ǟ@rWS#P:+NG3SOl_(cJ%HTX@emWL$ qe8ajUa3IFj*LNHMCg$,31LV;{>o/c$;Kr PtL;>+Ԉ83O:J 8w # 1 \IxѻY}JCVMR.:GPJ`ԕH%ԯ9ᐱ{jh,Bp"TBT|f9b{o6x'@Xz8DyVbe=gS8aY&#͟͡ tvnJE m]'Gy|l`ApNɓOb5o߅`W.О7pdJ5βUr`CꄠuvQR6=ќ^ɘ.-ވN_Kl2^ȵjfԑWOƚJ S)ɲf%6\cݎcΟ@t8t5U8JRAT\( hKMKcLmYUF<'IRVnрnd(2\vEM!Nפ԰$>T\74A:׹#1ƣZϱ8ܢ"hIbD2Px9nH ԪhCIEDIPdf!܅7ͪ070B$<@{ 8&b~> }?c!٥FI rLMl@XT̄Zpd8C5P 9ȱF$R 㐦v|$#"DݙO]vl<: r{2aڕ8AR""XH7˘Xz*L0ceh$ lÇDX+PAHʐ#?)I27,1> Vʊ Ll!Inp$$jY>9ƞ2IrVQ88y -7$=3L1"?Iwg_opO>1EP71E0@R:L?'5GYEiy^LxGVcii0 9{,jhK)v,..k9ǣ|;L H`/+'ʐD)U_s/RV kʙUVYYna2% "~v_:C7u ɓ'1LTU*v-I??gԩS:u1ApaMY2}Vu@ISFYV}4ȑ#sH2y1¼5yHrjn,p\9~䮇iȆZ픣gPdayJ]!yۊ=$c01sumI0`5`m q*ӈ[)Κė CFf.wFO%t:gI2dkB"udZ0"qH5%7#|R62Ca/Zګ&]IH&5Q dB1 ¡@4W$HQmLS|n@R\z?w?kL`Qyiٻ.ӗr 68g(DOYHc~@:tDOi!T>^ޑ>>I^*dM^i2ejznCsiC&TB0UZYʐ&YF|wQ5# %]XD5IWvxO?G-! # BMC&H6 f7[ L`*ilyl%6hWf(a2T-i8 6R:C#ƗDL\AFN+j i cQq2 Z u~ɠڤ۵ \!*X1X+W8Syd8ُAc$t0v'4GYx!@kAA fXI"kkiT nhJG|/I&ͦ|2)!j?=6{CjmUh[a Rko឵ZS";TIFPFm;6}ˋJZ<=X03>,qLZ[-=Mxdvڵ!HDV!QVI2~E~ǘ}HB,BV1"BȪ 2v)IYݠȡCzCM_lWh#I4]{eRWLI20 r)>f\RXx֖L:H KR2ƈ#0PVhb;GV)4Pwn>B$?00@<]LA@1’~L*xuٓTr x&*I  1s@,3-ܪL15+hʇ>!>OSOaGGٟٿ~a}oXX"8"(C"ɁB^CX[[jټ׵`zNE <+@H_\\< ;? 9)|Y$0,Wap8rsUK@Hʙ2(oy抐$IjrP$ ay j|?j}ƁL3g1aRJRXY(9w]ק?iN<ɉ' GHroիW ?L=bZP$AIbyk^sH2ߺyk^$s =>W{ulvdNʄ 6 04D7l## uB06;Yo9VJH.NِeEVUV|"ϧ]myAIF^6 .d\GE*dI+R"*=omB˪U9&B~)dkьGƥ%$8 ӾG'P%pMA![/95 :5٘m\ڙt$ӭWqz \F&,BDnџypIh_Oͷ|ބTx2ak&OvgZAHXiq=Oe%KNq zܥ_w!-jV\ 0M! irNv[ . ?ܭjcD}8&3ev65;Rh*#]„tF[vq@59&/QRC: HCh*l7,!i=bD|?*KI#R⎋m>'L Fe4=8;n1\k 5ːN-Xg$eh sc΁3ug.c޴ZF3p-6ZЎ*$^K`4V>Rq{e^ߝNꥲZ~u<+57ļ2y1¼5ynn=}q$y\+6mwayjۡ ~I11a< 6wn`۰i~i 1α'8,]޾\Q,{}"J)@f yfmHIk˙Who':qB_>+3jL8n5 D\2GCS G#Te{ta@cSC -W:`\!vy({ߣʈMf<ǣ Q= |& Ш @HWQ#!9dUŮs K v}p$CQ'_JtX{'8'߱H]%&aB[qܝklĎ&qjl_sW9K Ѵ1]ͻ9utI8_+%mƴtjYۜ挘,l%luNJ't:WQFb2C2hf}ԶY*(NZ:} 01ĸ=t3\RU8^$ui&3#B nq$hdJ`2#~W&#U%E*hn, i;TBрB@mf{CA%%E)WrڱyRj5*јTw$y$ !ړk3Lz>eV-Siߌxڝ J"]px57AgF8*8W{P]`l<7 )l-0iH6vܪ}`R*<_<;;rgyvB憔F >Q=0 x#ۨQФƱcp&Z㚄(*bG\%X+ PL煽.6/fDRC8)hHp E@:R1Mh-Im%0}Ʉ aϧAL'=O0UkYE!\*"ʞGsh%m~<{RfID&1޿'ǤHʮ:,Z0moNcIި*Cj5O񙉩Ԇ-`em˶k͓ 66pf9_;V$DjmMLIpdU% Kf:_*ęrP0fs43Pf/ 0~~ɟO?|Dߐʕr: f|vQ%,)/1 VZFR)T$A>hs8faH9 eu3>ʠ$W}(s8NJs@W̲ )e9L)90,ajs ɕ$?}Ñ$IFJ|yiZ|S/TI^zN*p$fyk^sH2yk^$_yloG9b7 ά@ ppJPYӦG‹`EoueFf[hb2B+۸EE>w6¶@چK3 xz b7j*+NG6eKR9 [ c5H?'Yb LJ hY 5)k'ֈq٣XTM"|DU#fq˅=BF Qŧ+:~a⃄CN:Fa׶ tPd!oe<뾉8J * :\fUooxa\BrqoMKGkpDJ(+L*ؼěj/}7^M I?>>$ؽ c"e@ RWj4U ơ18EV#+49ے%+Z7 #S8ªNZ`-:8h|"ZboB#Q!*GD§ʘpD_!5kdȩsFSk#M:*~.''F~HtC؅68:D'ZJdWB&J$WLeuI0vu}jrd!I1FXH"Re!R|Q#:0v 76p<=Z HO#̦^iJWYH")"15۟t?v~ ~~q1IG#.HecKH_L)#m@x)ZE PoACU}Ѽ$M0U|&y ^1ve .!PD$d(`Quw3q]+r]'H9d`E`l>>#jX0t"FfTPQ m _~.q2$K%uGO(AUU($ _{}m{PJ|__yz!{E_*̊dBeE04MI$a8jnPt]~`@Vu] n+IE$I`0 )A:>a䠢ȟ&9$mrPR"U#lUO92ɭ2+<{^~e9R|*+[rIedB+3&ۛÖ|+Wuϟ\1Aǩ^Ck^ dsz#eۼl/l6b~h[ۯw'@߮rߎ4k)a$A;qi6:Ե$^ ORaLG ɝ,Uk|w:p .8 hq`1ΦY'<๘]pbl~ߣ_̐.-Z1s a2BUxGB=<`AB v\yQ "53ϵk]@?39&?ݯ۠+AĬM|KcĎs7rx/uU\g!bYM/̷ŋxw#:ǫt Y‰E8*.rng3XCf/M]{ၷl}o#Ήhcj 7 y-z'kM"CɌt^oJK1ʖX&cXEkռ3\AH(/l1c/#:zʥ ǖV%fO.p]?Guk66f(W8mB 1A-i\ d‚6,&콁0(pwBgI;h"܈Xzx2IR?4N4 ,DD򺾅QcR\ q4._a ss JhR$pzehƇLJ4!u=L W588ّ 2Rs,r/gԾJM6 7`8e'DcH mUMBgoۅ熥W[[ΙV[ylsD9dda6/;n)F֋ٰj)5@Ô$Ykr|9>CMUXh2;oBEE)C)WGᛨX jbt`,\)$QJ#oc$ ULf,90hPNt4:de!")-{fE[\g3V0‹czq\?wX[(IY5{㎅#I BDTgKyWn Jr`!gLa qjD+0P)Yh&}EtEP(rH.^}RGoU3\c5Ix`tl=L̿Ӟjx?FsfVICY@R23У ?ʀ#3e%OOui ޔTz)"X )Iz^aO~7}c=?q~x~arx| kQH)<0)C$I KdB^Cg8!Qjx"+++ !x|$Va J\q` 7vUJr^J${{{B\Ir 'I*Q1&Ѩ^z%o$4 )C|t @ht`jqbagJ P1׮]q59F׼5y7zps ?fG=f'٣+kؽ갺QaR 4kk#f:\\`mn 6K;IÔӕ׈!7Ƹmi$#L0B=:hEWL\BOh 2-|x,P5tαZϰC b<9'X{x:6c-*ɐ$vM>B¸BKEO4U$k1B2i%^mjq§.şy߂7Qfhs^nr-)d4'}.9W_'r)ZaLJ(e1{%5,^s#'i~i5&A\bb̷O'^[~'?vh \ŏȃܹx`*lT)Í& mEѰ _UN EJ;F =6c4.G?BpU!pMˆ5TY%Bc2Y)(ML#cdS,%V8%0Т_ʖ1J"!`B,:۬IoF]Dz6x# &j"D|'-.u*b™e.vCzeWO:_:a+Oh#8195xlqZg)ZK,eۘHł#$1K zȆdٞB &R4`ҷMMKr ڇ*u97j@CNH%]sW`/v8׃YۇjYaʀB0垿y'ySWYU}/62> {fs1Qk~GH{3,ISM+i|%6dI[(cG\<%ܷRdii}y,]9'Onݺm^O-uZ@H`Ӛf4 3=6L`ny3x$(, #$o_~֒sS7kb4GЁQFdi[As%mIDaE8&q0/[ȴ*xnc |0CtBZh! N7~4ŀC:ɱ\8 aÜJfeum}!+T?#0eBxƀ^+*<#r E`g0 ϒ|W_"j X5໾l ͣW t_ h ?l\6p6R߉iJ@o`PF @6|dV`,${/yk}͛O ,$墵뱳3vIhTmqW62FF#zRJ@Euٮ%Z;0lf3oGs#{?ƫndnkm,v|ۜ{" x!9`A4}6#[5b@Kڲ[X+Ec}C;@5?жY`X3nD2A+b!ɚ $J=^0w^'% ׆L\+K&[oA03& ;p0[j~|RUsb.VyQ`[ex|wFK+Dވ*<ωu[Rz$-0SVNgd`\U=D(ݩb@B$r& +%/r/"C[}q_ ڄ*-<̹6?pgX%BZE =g)vtz|GG^A^xײ"1TW?[ m kFfXZN{~uB*' 6i u¦Z!m񼂸ḦPI2?qOMf5{ֹ`3@`2ސ! vP&S =( jٜh\@)QDA$rȘ]$DJQ b\o!2yDjrdSx\+œl( }CkISHZрOqq-̗ T9_ $fDl/-)Ճ9~HM? _S@ ⍐~Z쾩;1/wbc\hו| $g ;-Ik{v(KրW_7sy 2:_/iЛ8ƉB`ΒlPOOIR|4 % z/}ߦ m81S(W.#3 R1VX*aFU.>9M\R}v0ua̭q 1vIk(#6۬"El:GEN荡O0uF%ij(K m:^߶V ]aA2#E\-?34 pնߗ$)Ynpc+P b091FKEnX +>SIhH!*Ƿe=F?%"(LF! 4#5!PmgJI$q[^h )xPzLv0HpcHf=)$9$D-_oW,~w~wo/=I|cN ,NIx(AI7ӂ{ 9JGG(&aX:,xWo@zQJ^z^:Z<4U ZY^^pY[ $ .vmUQ}1$1loo__upurKKKϳ>{$\!{{{KɓxGRʪLL+#FQYÇ uի}vwwgfIf3f6 I}Ο񟎿b|7* )i?Db9~BZ>/ >m^,MgArTd$~gxֳx 0C7Jcp,T]`@SmeC6I〾n `~!#RѓmRY.WIDķ/3y: <JrMa}yzWXlC1dB*#5>[#blp -}n3gh2`ئuȒCe0#Y#d.$pP4K(i>g~$(M2Ibsr5pO AYgٰ!xBSkJ)z~m%Nsm `2-4_H OCG $ ^ @@Lmr0;h`vൠXw S{Rjv9Eu>렯AbN>pā4+p4t;5']JCs)C7y䗈~6ԻKW'_{? XQ(3a)SFI1$"!R IstX0BjG>q1O"#uOT Z[\W^v{t.]Q?@(E`AM`7yŒKW$o$D6;bIe~FdBVFP4Đ&(4Bp Pwю9It^U} IDAT-wWQ%Em$wfnu;?!I5o@1j,TkoW*)JȬ$In$eD]$/a&~P/U? J꯫LCw%$)*up[bةի.;8=vMݮcHӴ[[[cuuk׮UԩSg> `Ԓ9i)RJ㎪SΪgNDqLFRFmllT, C1ưGe,,,R !hlooe^年f63H2{ulf8 ]?ypr ۾DDO.hbtw2ǸH>h_̕5:yjзMP 12jq=-:eK-}EbeEn['dDC?w:H꾘7]YB;3C?ha`u/lld+hJVLӶ}^UbF\eS dRQHE(Pa9[ n5 YCPdU¹'wl6HCoW]dYo Dq tbo ' +@`[yz1; VHP4)-HZ]JɸB4J́QBxU\.<OKAzy|1F<' ⁉2Ի;N8O9ϏfςH68p-6>9gZYH`T\K4N:<]% J=^we:* x}vv O9WINUk w[~ y"8 { Pt2pNN(.pnNu+-6,'V:`/x_߾ +ѯa "mb\.ԨuAI] /@UF/c_b&vlRFOD,J/:| E <:Uե; XBRb1"JJt7=UH֥mH*QN҉ ?=,FȪ;K+rMɫS> F+A#A+V]tt|~ێ8+QF{E l$p:X J9HȘ]bp=MVeEuS MҵFpQ[>^co׫W~E^n&\v'*7I"i=I*Pb ZrLѿNh#ӷM[OwhCYQS9|5=)NYyJ)i4ލdP46Yz(bx!>S!GG˲^wjr>bk`Wmq"Huq-<aU^')-;,фq2c.:!{h j|y>IubHm'^ɜ'b!1r\^@K/.ӵ{L H8uTDy-SkBI|`ѡ93iJ 3Z1|4NJ +cVNDǀ_`jF?l1#̇N+`Rh (ƺqae6[!ƒ(드N^ }8. Uh]:C`ahP Ajn@I5rms}O,;I$!Lsذɤ/ƒ n& lN`gUnZtQW%eV/$R_^ ku7(Y\ue"BVK22JDڪH(W 2"i5ZIHytԯGDGAIje{" 1n1a U畈FdL"" !!$MXq5E^9{!{r3}skʅ_2߽8`)?70*x@jC'0׸/8!컾$Fz)Mx^0w{y~ J,b̖ݶقz4vZɚ.- @ 2<$/"|T)޻1~\?\&Y ͈ФŨIc(sq[e,>|YCRBs"Ev<;y ! /N&s=Z>WI G0dIʨ%Ԩ/%1 P/cJ w+M\_BLj*d2I,JY\؍F*F~$EQM4yVeTQ׫z#F%l+ȲlBÍ2]*}Ӆ7$ewHyyG;)/Αu 7(AՃ$ AT16[9? oǡ/H>W\n`0(IeU|0dwwclnn2TCk-ᰊ:zDlvQϽzKTO>kkkH)۫Iݞ6JLXgY]]emm'NO~rlfa6lfDW Ϯ9era!Bz_@7 3CrpDcn)6WC~dgC -z;yhG`#, 29 Bp ϧ})dD?|RFpaxNY?4izLӁjڐX Y4;l,o5AH(9{P\@xp,[Dl♂̋HE nhr{<0`$ bZ>cSZ6>CPĬɊƂr?};#7*zb:qw5^=nˎסiG+lyHaqQos'}vj<ϰ`A5s4dgviF Ϲawc`t*[_u h\+ow?A4ǂHay`u+Q{PĮ\V[xӪ{}%`'ȫgIlHk1N䵚|ퟱh(<MBلh%X"uh*g[G!c]Q4uB XPS뻽bu]6F(KjJW),OK")"~C@6)s3Yq*{GʉͨTAQ%Ca,O02ozkQY27kZ+l.Z&^6]Z>d8Ώ_q &{b ]ZIROHB4WB)>t&_{4Ek]Xk 9IN>ӧg*'AyبaQR.R /R.,#^ennOOiWH9s< G!I/H9sf @eyY|^)җФ,cSO??V^>: Y^^xHJT_'%@C lllh4NsCL쳙 ^lf3u$.w a;@A7(KC]Q0n ̈́D.k2ҠZ#G#./YRP}?V^DD9a4"HX lAςg)BeΖ=Rg RZrV[d !MF*b_ؒ {--2;b)O(<>e$B|Y}5P4ۘFLI2AG.ʀ =%4WaN߷z0=a4%=Zbg xH&\GG.tmEn]?6Fӱ4M}i@&#\n>^ L7}X9z'YYJaH$B@p|{>;0t/Jk9*J*ZgXٺN.BEUݢGhRVu5hAQ`r(cloLI;`zX`mFQg _x% 199:8b@c\ '!)rOZh 5q\@[ՄV˹HݡՀV:$M8Qe kH̸Ɵt| xrS:C ؎*.H[Č$ zUY!۔.? xc+Ky~ ,uR6A"}zw#Ehz?|Ϲ*3sԀAlg[)rCj,^ZTd2pTa67w~WJT$D&!4)6f2FJ$c@bBZtfM iF6$|l&A0K~Ax4;\vIaҌT;]Qr@ƷJ'h)IoB&dPD.9@Y#7+mΒRVJUfo}+B盷-ՙuZ[EHջA )ERo|Ŀ.R/.I $1UKEJ뎎-)%Fc~R/#%ʕ+7D`%^i@2 kc}}p8q3~U_7uXR>f֚(8}D{a IDAT|_fee0 yЇ>T9lpiiibM”luPҥKWpDJ˗i4DQDөʥ( 677Y__۾X]]X@i6 #f6lAkiu(Nv 9WaXs>LEH;!$HNļF !G^s=fftHUQ䳟i`3-%֕~أ0'TC3-'!pqGU[(:׿Ī)]7sʸ[9 ;S;wdJQE]|{y4c[1/IDĒYsm:f K G+? ;ꋬu<4 C`c!ņf&;Or7w[v\nb'4pXw_F"y'&c-,uDbwn9xw=`Emt5o&yt|}_nkR{h]޲^Ǐ~=D[W]ӡ&s zVy%0zI[5 SZSv c1Dj* $/ ፻~9A'́:vJJ/}R#ur@էR"pLˢMI߶(BM3ֆ S֛,t]9eIHʩYZ \QV L()( W>1B#~}X_T'ԡA^1`Uټ8m*ׯcg Es~zy~yᓈLH:u'8׈M:ZEȜq[X^$mQx; B׃BPE TG9q2  av$AŤG. oÎl GlcX%S h$ >:d#v{""&Z}!>\E"a8q&h 1Tew}5EфcKnR%^υ *R)*/ ԋѧCݦ}L(xzOJ~&exy:$uPRwIQlmmU}+ jMzW$ٳMy^| _p ԧXZZbgg'OriIS_oT!4E3ͱ2Ξ=K`qqF 'C%9rH=n=y}{gfIf3f67r6֯qp}O@s]'?t^.QBB0':3z&깔Oa rE"}D۝I0(}ZluIi#=X20RUJdVefddow|!*/^~>TJG]o]aQc_hBRC,ikdOYڎ&pI\8x(` -gp_ã+#x׫!kyg3Ω#'ghA|UYs.(UDxlh)OuXiLt .ԲqEƵx?HdDYaG]# `FXӱ .x|A]!|H4B@8q,h6pd +W34.# F$5Y=ZRP%Ju7eE2볬Bvȉ٘$,yp Dž|4,댨SDrxҿO<}]M|_q1I_صcYdD3b/ (CQU u!/WG=ogn~BEh='7km{zB\: !, ;szRh j1lyңG|" 'A MS?^<ơ"C?dsɅ#res3 h&oK\z>Jby,PG4gްW78:CCҟ=57;_yuwI1Y88g.`YؼfcAn\AQ,0Brg Wi8c#g5:M[nSN bDx$g{'cۛAiIS J٨|8"JH# #AD9힠+ȵGi2m3p4>ˣK:076[w?8(/QrDx)x^UGGV3S#ix:c5i &?hg =l@P ]#歮0~*A0:F G"1h̤g>;3aSh[ ݱ$^8 w /7YJFd0. spmū Uwۯ-]m!jWi>vȈض }4EKr~weV`FpHv HgD2 ( ˎ1|r3$!lY6Y0=!ZN85Lq{9HK7MՋF!d@12& :v۸| Gy 24SmTx$ z "cT.6$H @s1PqOd/`摒 x4SiI&]"MQb :XvtK$;LDqqUܖuH. M{%B 2HqލbҡG7$D/N ?NtIMIRu쾮>-SUHȔ$$/4^67GOl ϜmA.hͶQr.Hl!𜼜99'8 ?&!`\`~^AwD&mtq#e&@Z#1}#jxrm:Gx˻/ш'%gIi2κFskAxf:z1?W?N4fsScB!Q48>cFWag8%#@Lx\ {7ax;C<ț @(ňSgLEȢAkԥDA#mp4Z:aU \2SxYƽ $阚8}~"_! /iwã ܢ B Rʍ]Ճ0k 0n5ґO Xq>P,"UR b8 1 7狍@;qb.ZZTJX 9t^Hn"" hPDTT ӕ'K$~>l,"6 $O" p2V[Y v$B}tؾv"ʘvf{"6 ɭShpA ϟ7, s'+u-iv$ilDBi3v/r[hPѻ,yp75D+KLjTyLlXsd/^*(qXd$J]Q@ׯ6Yuf(fK8琻M;KtRyBOO`a$եZnAEU̶bq„R**yݐ vC{fI}|ߧN7M[^׾5RW{I>e7tӞ۽y<[vT]$:)%333*vaC=ѣG9w\zTaD8x kkkz ڣbvNH:ȡ6۠8,;,JvC"5tROBf};G'lL˜Shex(6< ẕ3 e>HeH\Ƅ 5D&CTϡ[Ԓ!р7!KxY;fE((*QdBF^V0`_'fQRT1eLz/7Qƺe.H!&#x*#|󷠥1&Y08*Ңmx|W4"% lWO-|CߊFpG/m}$K_7-b]7qubhsGRo. : d7IRɥ{ix|Bp;~OeZٸ3~Yd3D禐]'܁fT>|hۉmDDĊU}2vJ>f 8tic.MRɅC=c[*2|d !q0Uzs*m.z $*cQ= n -/@( һ[YY%Q@׫H"g8/ tj:}{_v)%/rSH0^W]$VXnk\UHb* c[0vbSoa7Z0:\} O}ScloosmMX8{]52* C8Pvx9qYUdEQy[xn]>.\V G gyyLr-DkC=T}*8Ruq(ަ9Ap8d<V]qZB|ĉ$IB$)iN'{c:Ic:a:c:c: wi=Fx\ u};Q5|W1ܣL9"h~("0'ďzw:grjdanhA7Ӿzqc9F9NYiTJVFgy+Đ&MuIBz 3,Un>!.u"h~G. AsBG5ob$u[Ճ4 =w3"rzfԀ|8 q},h)-$ 6E 2# 4_X~#Y.ْs ,5"#7j4 3G IDATqn5Y6ZKԳt .tfEҠ^kA৸ro.="Ggw;3?yj7]1që&K/b!O0qT DtɤFd\HZI=d= AD OM*}\m2Y5=!g4ВDۺL'繸 f2Eȭ'8(b@D{ͫ-YU kjd*/y#u΢@hE@Qyv'f& ޹֐S>|[H2z5S ce#"^ B!$jFF\%7C֍E!{2 # Ma@ c̅nP֢@%ʡRB ^"f~!hȭdXwLF$Lʖ(̮[`^I Xd鐰K[*"VFP+i,$NiC$et[}*0' ,Th,#FW8`&Uw35\@KmETBa ɀ&n옱"esH IleLhbH9ą]\ pT6J#G6KńbWȜ2(LƱ"b+1ER/K/Mq2넫]3g&˨0 F?*[ګK)Uv{}2baXBq`!yŋr ¬(`|;&`}}!6>.$~Qׇ@3hW`CG@L%ǢӸ:'33q>_M .]|Rʙ]stsy%"$>ۯ`Ɲ Mވ'_")Q hC~/k|g{5yu3sǂΫɣ?~1qt$HǶ7R`?^.t@$@3_\e㜩 /-'7Pb>bvc6|D(O?g]f|%ۗͣEh⊜nQR$Z1u6X\&g(Hr6->Er19 6eGF\/3,:ϱ 7M3+n@Mi PjRBC-c-AHțrKd렞.0N%;/vt t(R_AcZo2+=oóz C>R>DBZc Ww={C+m/'u(% QE,Rq$ehlࣅ0K’rVG2,5A_Jƹ*[{R%?FT.PD͢qb8f{m}O(m$M9@X?F"0; ."v;H,,΀&-kW-%LQ x#ebU|~/3ï#(XV%i$)*= HxNz'v\͂r)T0k(C 7 Ї! D9ދx\8pLU(O\*)EnoH WǺ7.Qzg>](RW.[K\ym,{@{Y JY\[>,Ї_o :Po PUQ$U@)aRR'&Y!ƿ<7^= 0,pv8yeVXXQ]JYF7UVWWן:ujTh6$IR'FyN՚A[[[WŠ_v$IB%0ٷoi8Aui4eukZu'Uv/z4M'I*-_ I<'cz!VVV8y$nw51$g71ӱqQ#g'׳oYrIN  i/Bqen6Q="`E[!p &WZI `qŷ{N8C^ӱwxW+oFeuZ6Y@Jf6=##Ufho;ؓ$cak@*<+lYܣ0hГs$"$F&,._rŐQ*55"I6MF^@s\/fƜ'2HpBpV_+5NA RA+ 9[?NB䚣9#eF 8t-("7Z2+99 a6"B+}:uܸafp 7A/l.<K@M@bkZ|I_WFm*1d5q EV4Eau(B1&K8B7$IFΑRreh雨wB:8@#꯰)h7:Bow7!Oˆ&3+:jWgqd'#[ 9w_.N @ì>i$E1'S1|mf[|sk(AA+s<"֦9358x @nB s`_ hfȎ# _+%!P=ln @YPթ|p '-fne͠]ǀ{yqe^_B$aeV$$VJ D6B钨BrT!F0Im/FO,BƲfbBfϥ 0RÂ.{3v/nXQQT1x뤄%ɴ).{BDP.y>YeT2j9(x%QP];B F::=vmY}v52 , .aDZev t"qujp_ci9"BJ@b(%$3 1rF)0"z sa8.zhLev/3h#KS,k/Kjt&l̎Ăg{+}*e\[ST1eWPQ%$.Q@\됱(31\:񩧞ӟKh4b4OOI>{THU"=$Rqq9YB)Y__gccn/*n#_֩Q:QMNn\WvfYwK@b{vTQSwwT^zӧ'7UtX]]e߾}X($IR:zmW-K. @Ѡ^uBfAE.~<}0;;[6n HR]'O,]6ItLtL1tLtL|Y9^.q2>= !±H\M)z@v` bwZַq/z0c"Y|y͍:*bEw` {):Iq#q"ER#g =ϑ,-woOqx$MDԀVu2r#\81Uʹ\߇ C8 됈>9Zu=\ !`V@*j$2#110bRzRr}̨,L'35 #j8" xxK&B9[#Cc-_sl-͢|EuBsP*g!`&fzM㺸cG Ys~x /uoa_Dۯ_sn>}9o f3#򘼙.shw7YuCZ %u~ 5ef63YųZ==@5yeD_̚uLˎ#S/&ttx\) :,qyRYVҬ!㊖-7@w.~7j-g $zq]%IRì_n H1vXTeqq߃DH-@ O3@6:Zf Jߖ+QDJ%: bELyQi]n/%Ta qu' tl3/2_Ο&xzuyt~9Q`>F`uXg/Ibcʪ:Iq[<}LSgDL>;qTuzQ):q[y!G$v;Q7nKvgF'@ %Ť5'!\;c0%BЧEczd vdܖ$XDn)vJ64ƅ'(-!h8GGba㮪NI+PUPRRˍ WcGdWu:I*垙~t|U!$yٳg_wO~x177h4رc7}{G>]y8~__}o|[ou":+[Ha/W2,(F&]rw B;Ɋ{$s$!":_٫nk7(㸼>MSΟ?_ H|_.ĉZo#VWW~o}'\{n,t:eGLae|YǼoӟ{ZF^^5ằ@ݲ>}. Hvaװu=!R{u:Ic:?L_阎B:>v%~ޝ˵4jfz֐C,ܸMCuut;g0o}K#VBkؐPGJLJ:ЄySf!k_M4'{K ̪.C9s-:"\tWˈ# ,5rƜ:M %'yOd0,rDg<]g 9J| I0hjz̫ }ff4jh"/H9!e@F$#v~ ,e8(-hc35@{d2V\ZO bO-W;ԋTO-\ %~ڑDhM7h!s~W>gLD 36V1 \ "׸5~^+T"ydPzwڄͳV8:,qQ4!>iySKBr٬O⊜,NHm{RH `KIN0Ǧ^']hG_ƫK2JnEx*"K | XM ٴ,)_ٵ&E4 sCdO(` FxSdCLIV\# ^W8lLj!*]8{K h.]O^? (H2(Cmi;ᤘ@ Hq[9Τ$%Jތrdl0te -`ٲ[w:,,^.U \ P:B\3UI #n1Y.F=O]p/A]UDMtj:[llz_2ELn {޺>4b'V5q&&R+!&(aү4nunΐZMԤ=v_` #>y<vew$_e666>wZ-ݎ(ʝ133?A<{;}{C{}eU$Ib!-\b;+tW8'Hu[U`}7@yBxu $IxoHL阎)$阎阎Hr'ϭhB;xD|< YXBF,5偵F K8ux&y1cfL0xĄ(l; 4'Xus fyԢi  -!`_!L+щIJsuPB]'r6nF)rm%' erd'Epef.Bpͬg'9sjyol9$4Q%᲻-i]&<97Ej.)97)9>l$NHdb^L'AC'̏9 ,$)}'eVn7w7(mÕfjd1rHh''BgSsrAC_or87g2uHϫgF#B)zbFY;^0& "ls dp j"&pc.EXEa}ZұeHFkqYAQq| Gan0)h}9Z&c0ka:֤YJK wz\^@K ~BW dls5N8 ̃7H!2nFEfwTHyGฐeyhAizHh"BY 0"`*"a`kۂƝbpTQFvzha\"׽9.S.Q>Y*c" UzMbT8>'۲qCA hG 'Ou CNisgTGo("JXa!1kN@*̨s~, J^(n+P;N ,@τK $VA ]$=ZOX:ID~ IDAT*:L H˨Irظ2XC``MIJ2 *)(Yc?% # JE),%/yQ+i[2ҽ1~y:&L#jl䢷)F8]I2Nk =fhѧD:$ց$I5$.s/׿0IJwRc8W@(qI:cvXhWVEV\ 4Run${uq߹C@ww\|LSNֺ\?vVO?;N6 ow8wqGxlmm}P;^ggPLbb6ngWp)jVqUv=v I8}U/H !$֕R$qb!Iw}Dɸ=876'O5y iO_G}Zsԩ 8b]%A}-ݎZ=.Rʫ":0zSOM< B\Ya!c:b$vgqqq B阎阎~$v? w\^fC}t|zgQ $OYe/xEZW|fM0l#eUi7'i .YаQ#VqsS@ ñ)axz22D\24WcC.~P/ gD 3AC6a3<߈Ђ%@}<o7quhy$a^_uv̛1 0 H %JT$1(ΑJ,Q$˔-NJĎl|8R,1bH ,Y1[Z۽7ܪ7IB'"9uUu} 1>d5|sW㠸Ŝ'pK:hal8S&( nxhH"hNpD\Aq7q,} Whb/D9.rŽ!#yvȎ?GK { 9T$n̸\S9 q?s oExk2W9\8{ O{rMko/<3xypvUa~Γ<~WhwK1P!mXaAm@^\9mve,%@S tD#:CB~bN̲X9\WiJg`v0`6Hq<װ.zLcƊCEz>×x Blk4AA@^p8m1L˺Kd ÖoLu:8X-y?6 s-]"nɶrY2Qp(?:XPeV oy+0pfI%7GFN;cMc_!nu>3V]䂻)N!,4BO2R")Eb/U8S)5coD#^սQ F:Cj!*.Q,V>~g0*MwЦ=.G7Ɍ(kflߍK+Ah,95ۭR-/0Qq$v'7Gi2`( w"L&B_M9]F@/E֐;fh`{i>Hj<ِ$F.Ah`=O @i#JCAc #q[($J:dKxU$c4b}exq @L ʶv%:usc]gżx\Ay%$ɤ?_d 9 I/$'of1ykG_Fe… ޗ'Jٳg9}W5lql燔tT v$v)jSnQ[Q,˗P 0u)IDQTGQ1tSF.s=W<}pZ͖w]4B{/r >$I3J y^ 3  ([z =㸜Ǚl0{S}!UB$]!Iq.BKKK,--Q8s GA؃$_{co썿QuA?"::aG8t Vp:v{~I>qׅ3C!VHwOD 6L Wf\1y={j-^KO57@i߷b#io p.1H|{ A RM'Y\=%#DY[9*f7qر4 Nie]xPGs߆nh^q 't:S2e 0 㡑8:%KڗmйcCtH@k؞ 1P='6C4F"OGbDػvň9gLeE"z* f9@"i}HN';wսH^D.I\!o}MLɿX(7pNA|Jv-m(@ҎinF ]Ch 4n3m*֚~9$Ǣ͹Xf8dG-g%67P)> 5zqeFˡ&#fdRj*"Dp{zeZ~scΕ,\jr<kȧ yVSh/`<1!Jh1P,0I ɬ/|p%ptbHWz| =܀.kZMױ.i#"MQ+Tn^DUMh4->v+a5 I>Fa`5#aJ8 &v<%7:b\xASS@8@) I$HiHaWc y|$HxLy*==M%@ No6If(WD#6ao7;L߈0Q YH Np:j."\.f(=#&{uub,9y/BO?+\E0x4`H `d~rOǰU# FB}T-".RK?;vdj-h. k1cfNn p`c"yO:N#FD1QdPzh)ɤkIS<!V8ZȢ3N6Ȟ>vlJ ( sQݝ$.&eתƈpEk$)D͢kkk-o(Wb|-{C91 HfAR-CB/* m%u5~$I֯lnn UPq{0#VJp8YXX(~?nz ֹ 7%UQf4Mh4z)|g<zDQT۰Y,--M?$)nQ[Ťb߾},--h4xx衇7 {coׂdB!g>>GVx;[|9:ucCHR(%ԓ!lmH>Q q+R?u;0/\hVJ"ͶgS#V>ZQei(XX7,2w@AznFckR a"dlrr`9`6pesڌ3u3V/jDhl#\Z>5=&S.[,pq[1zf/Z`i\w-"T4QPcTC"}j1d15V I ~9N8-qfN0 DS-ƙU!IU$  %uQ-oǧ,)J:a]>*҈\/Pޙì!59&pb|72_! 2ABEw_ .P̳M[h>`l4Lg('rk$(zaɷq[p'$xw!Ga2 ;8%ոݦnT](TGtz0s]Y2U1""ŋKVCFtH]_%J~tOߥ ⳟ~ٟY]@j< RBBL$}s C |W"V{vF \$Pj'HaQY@R8&4e~~;;;q<p 7E*,$1ư1ZF*nr6l]AKǓ`$7O}S26Ƙ/INOT~]\A)"FS/+ {d퍽7 W|׼ր<)nNq~=uyMNv\Fy+Ha:0~#:u'ɖ|NMC9BSyG|,<|p`c0wv_ V,\G*RBM'4CMSz>zĨ%"@r>.c_=". 6"F7lӡ[#ns/a3'aaEoScjNeU}d8HGӤh\R>JdEŸn^=,qA[nlޣcv9o%21FT0m{0ii(mJr6|yeai;A2q 59RO g- «#dgoq%ÿ_qm[Q">ޣs<ߜeNCKg<뼉+YO.e8B1$PeF2]n~J)>/*y?PY~ou t4+Ľ^M#q+z! l\漿ʶY#w"_G^Lp-A .{ O{q0'⑰6gm?.i2s QO \DἘky; 6* A/σn!5wBbNd!C xƳnK V p2uHd2-l׽Ah;q|gbΟI"\PFNDM ȊJ!bCVC1~V  )pLR겟UKIRjuU(ܐ L⻴jm9zZee a.n8ֹ;6U`eoG11x_$%\e1Q#6R['6 @[~9C'V++Rh| 3 b\zX]$9IsX I3{Br(wIVf!I c{ [$LTGor cIy r Hy)'޳v~B"4Wy xݣ?ᓰ hu9— #1Z3icYHO( 1a/'8CI_T[n (D i*\iF0\gfBFq1zUhS@5!<$@J3gp8/gnw|w|MQx_IaXB#0_\ם$rUeDUX^`0@)Eӹd6z |^:΄I^ qKR}${ JX\\+ŋaHdnnFQPYgrjrBEr/\P:ǖX\\dkk$Gacc~#sss%*g5$E, 1Ɛ$ e{٤?m*!_4ҵR0 eΟ?O,..o7{co썽7qYxϽɚ9?`$c:.nItЁS{A7nʠ|8 o~u1m>g OuQwbrcH7_͉ rt`]9At`KɅbѨD9ZY/:'9ũ ~pRVX߷q >֯08}.]h)4f :.|3ʮm 2G=wY~gtf 3~dHhJ "stb`}BV,v BփR%pB4^'D$n-bRy5Ygm{w'Sw LI}NH I7q&DdhDy߅0^]ehBO{ZۯKۘ/_%x׵Nuh-y~IEQD/%ZJ2ǂ`(̤t\e!#D!yS1"!562*Bӆ)hQ}WG*"6N*maI>Ђjcv7X$$6AaWeܖKV :Iʱ[:`#>dhK DH$BQ {&;9vĜu aAuH{lUZ151$8P7`, jfLKiu1wl1D?J̖^b'NbٲvAf$ÊdC@aTTϣ)7:XNI}!%q]Jq`0ɥExQ-M,($G_$ gϞ$㏿b_g&RJ~~__ },XYY,//sʕ2,MӲnΘbrB)zscjkkkA֚}{coAw7_ː_qH?t]jўtCԍ~y0BLnSEم-V\ÜgsYyn~Bnŋq݅~8y'[IqI#xoCd&p>>aX'M ҡB6&f: hF|-pꌜ&F:ChH>k r }0IRc 4 N :xz 0Y' jxEDl[ h/OBf@,"N}"ék2.GP<'ns3ޠRAjej,F8|$k(*NJ101vu(Hk/N~~g[g?\|Pz-hG1$IڳC?@+!}M } AdXk0C^h{A2җs;~A9^crQ%0w ϲ8F +mz`shǕ 7jo kp,u;3ib<`-h0qg{g]$:vsNٲ߳❐ \=[@A+`BBs A@ o)Yf#\ /zPl5K<ʫy֘Ry1􁎂1BIzJw L:aog,sљ, 1@(C $ȱ.JXRڔ=2w.8FMa;&ʻ+BP&2UNpRnrY#Q)#|x2;wML1q,Q±%ەBT[-pyD< ϙ_dD*ETIbESN;*{3%80B},xea|rs /=mL=sd"-d(#& st֬#C`HM$U'yZ΍$*! ƢHygvXҹ#1e$w ()k/uMqq;onNo>̻o0MIM1u3'd2=/pOcA[X$ o2ܡw=.{릻<ŀIz")j\+z P9 u\;u3'I>z&˚qd%./8R!㣶m%\vu$IB{Q;ſ|ͺ2 8V"ng; I!/H-Q`0nw*~f[ɲl !& C*(,SN!$U`[1>1|2~j}}Sff )IJIVz}FqC<`0(ϩS80 }]A'd߾}7[@JJYݎc (0k"wdo0%wɳDHtp09Mi vP&`@66p,ub"h717K9=ٓ4n2 #HX6|2}/54h/l \Cq]֡[pȱw#\ϭgPVx{ k'~<~><'u]qcTJe!aE[Rӄe-陀*Q,u~[` $q!A@+51$oEřO":Ѝ&?>/u.l' lfe+G~S5k$6-odCR,;;*p*%yYtRm?蟣3qEÇ?Ild*KS4O9$F 2%s\|A/ƘeM4Ϥ6V+ZKHy*=%n ƈpPB!+|Tx@"D%83H$ų,X?L=ck&v-n_IRwu#'oy2'51* Dh0;\)㚌cA Gh[.&g +݄򦊳ܽ֞sv[îU^A=2a_geg e A; o-#\ȀMg[y!8 c%1h[z`5Dc3*l*EpWxՐ'U%N>K:^'r i1H}|?eG!>'⛶~`o$T9:Y /GC25c9SwpT^"6&!>AmC&|6z R @K@F!9\@6ɧHY7NU<ϫ8eZDy^V<7x!nu_"$ad:H6g~ռi:uP-bb|6W{x PKvJ1Ht[D b11HBovh:II |Ͽ@[?gW ȄB:1\<**9Fo>/+a &QbzkD,|MBKpbJh6W7$:Cds QK㘃/^f>P_AGuMyih@E5`-p`Y !]% nLNB:+-VOyb\/@P%*uPAg##õ0!1Hc%Vv*RjQu;\z2˾#0) Hb4r$1c imӳ[&"_HdH*VeH1R~Nbba;L 7-%~_1?5qk1I[WTyQxSo']kh \OLS- G@{s7:?\~]br;$Nb gZPn_Sg`ei_7 յ3b['|o~3 p8  4n-}NH,bd!L8[hWؒy2pbVp$s",qjcW <=w~ I9H)w8#E? E"+cIR {x4H5BiX)]@CzJgCЈ $˧฾ :~/KBK#Jd2@ih6l?#GPC8ȅ6eX,/8\@Ehu5C-uu 0[3;|ZšUdbp} >1ۨ1ox ^e>| /ĵc<駹!|ϻ_S*T롍*Gn(ԅ /8Z^K^ w'گxtms^w%xK1`C/ͥ0ɱ: o̱a1b[d6ƭb(o`_G9.2' C@[Wؗm_ȗ r)SԒV A1@ a xa,F-Uw'\2?Ic#nB+ `.[NJPg8,2"F, 9^aO&?T^_|.>A.Uba;@Db!E{Gß|hݟ#d̑1b2}zHM 7ː+'vhO\J'&ʡm&.IH $1Lw8BF\W IoK@,n*$['K @5ޠTo6(bii+{ѓJƑN5$)D) é9UHR$iVFE+wyX`D &\zZ 8ݿ(q;dW7 u63jV$>zqNVxڗmpl9΋!qk46!b!$ƒmlPۛ]1ӒH5=";hpC$6!1Bz8X$˘,Iio<<;_M8.|, qxjtA I1UT,>L>Q 1Hdӛw5"M >Fַ3p6&ռ~/c4&q\4{F !tt]}`yb\zD"C`]gѫsm>2<2ef:r6=^+y/ ZJra`twD|q&ΟWxM}X|} $5gUDuNt0AS E0o.y-q-{ wuCuzԾv Vn0,U'a^o8=˻OuH#CB[ h>u="qS ILdދ!=Rdz{3)s/:@\-$pPRD \RY )P⠈E@W d2᭭?}ٷZQޤsMO$!Hqu_¹,#ĤWd(C!20 lATBv9M(7 {z~;bc2ܲg)bI\w1[c+wW 0f;F"jƞ^wϤ& :QO ^grq=J`8Ng'Tz.]beTWӧmf c W{eAP'IRx\nbb{]z5G)]̴APKIlU'Ju:|]6QVl5R{d퍽7$|UC-:w͕ g>X]e\уP  2g{oc݃$29G^]mI$Kƶmb`13ޙ03 ,c`mav6X$fXYY^fm,˃Բ%nUss͛նMqUyVv3b9"Mr `.~sq ؒ!*tjd*?|ئI]\R IDATo+sM0@_uȄ>C(4 3bZ,{)UOC Bg<~UԡٍX=赗q}K!#|bt/~(7ɐ yy`j"GH 0B][f)%hV m@ @ msAD4oHtF&RtH/ XOȌ8 R'3$h\S.%GvƂ̯1wu˝8'~ ~U;x{@ q&_ >u[Z$V `Ks< :Yߦ8GqӠ=f.D1˃ wy|Ag_Y}m?wh!uJK|͈ o[1?ڤX8dV» KXu#C^lտɸhCH@=`*\;:w?3}]"umH[|."<(( \52ǔ́޲.A/$bkOP$߅qP %k54h-ijBݰw V,J(ǂr_i[^RZZIuzNS?߶Hq WL`CSrb$h-V)HlNl_Iʢr!'=*=߀G<~{OͿpS\!lLd^LX+K`YW${$0!PS1b>-LCE EI{T큘KH^j"DsSں£OeoCkiڠLu1M1 C DXS 6, ~F.\ qhcLMud{"䛈ؾwͰ?>{bʘ#QqJ~OiSGhkaŠ:F2 M'5HqrC#SlPKV[97U#|> tc1LOޯZ~>U@2ɯ$~ƺrWe xEa~u|Vf}}O|*D=_ GMJU P텀= FQ +++%( I1 U\UH5(Q嫠DJAo>0$I>^tlooEBN>͉'JTVEVq/"Yqm+vZ*oWM}(R4[o{Ua\"IӴt;R]x0lwݱvkzT?@%IjbdO7D f!lS0]p=(ZsTKr$BBoş8)ie,5.{J. NSӔ=mr섃l^GGqĽH*>w?W6q8z̛ >SK<i#u1m+fy"㹘g>ő;B l?=x"bA@HY4MxwY8OӪD9 MRH*ْH}$-pz$0K>֒v@~cL1V>;GĚAF+VT%Kp ,;]j]"F dܰnFe&o!eU"A7Ҽ& +V3 $ژ\3[[N aT&-7;l7S3cdq[rXeX5ROؖ #N"&ukʌR,(Q}L:G B%Xw'7NϺL/"RqY`dj*NGXHR]H%?g#ِx)ЎuSh']~P|/[Msk .#2'SU2['G=*% kj\֨,nK l/1jR2_.IǪX{ڳqh2&Oح$!բΘcjDS%S?_eRc".#.cJ> Xxe|~ qbNj!gPN%D&A%e̠3z:֩ed2 I1!03`> I揟1+E0qǏ*@P$:Z㑽16EQ E\t !,5Q)c;#U@R%+Xc\-糓Xj8Oݱ;v!cw߶1UX|>y}]'Bd:xJPg!\|7N{)J'Ļ "8y*}-sr@b\Y@ Mt U P#L≔r8ưq^OF\0]!h>Pʮs&n\1,/&bP$r</!qyJ=ccueEF;%~[O"D`&EJ!rK'|qttJ!6sj`U-@|xC1J1{-0` +Ll9/r2lgv.nj_>$np}^BZ#e\0eNcDz,1ogN k*cc< ?8"M%*8(fd_& S!^/ARܺ,;?߶ϯ`-xhR%ot(<= di!29J6A!= ̃ Y͵>kUsyV""bAf*`/pCxd!؆0=d&їa !_p~3$ hL8?N/A2; '5=[ڭb48I\$IK(Nj0t$K͌1 &\XalKb\i@`{䈌'X{ei8}lRE +vx"uq)U82HBlmQ|!qd.I.gTH*ey2I]mTȗUPS L&.,Bp D"%id2s/ݎ$^lA-%Ϥ͒xYL!lx(N9I"lȐ}Z i0AHPƊNT~"W㶤Ve wD:"CNmd<T2ƋczQ_FxB 9"3DÑTS/5HQC;9 9N12ӑUz^T!I8ӄ3W"HDxU/G:1\)?ߟf7Cj!| o|;g%_&!IY~//_h^?C?lk׮e߯v)* ) ɝwIŋ7zfcv pnT㠊׬{ Rȟbqqq{H)yJ34$U,) $Ɏ!/_CceeSUH3MmO8v]G @RrQnZFst` * QqH?YqKFQ㋈`ސ VYa-CUsswen6N##IQcG(O H*UF:O`([0P#ՠFĞptwE֘gS,qO&ׁ#G5ƹNEĆ+D& 6ޔЩDODKlsE Nsu c ~S#dv Ѽ3W|2dZ<;YFce|rl2uR{afxe]ksC k nf:1% 01 (@hG*5@4ٮUI"{Ik6^9B_ x||wK/`}Oo_`uѐ@EH:+jc$߿J3Ƨ>G>51܄~1=|=#pB 7֑n]dL-%ƈLÊDMa7.GuH` _}{ϐ9t{0CDC+i7wxȼ8݁,/m.1B@KF c#u"@T/lٚ/? zm`u8df-yK xZ;GBs cjV \PS^-%7Db"ifv@@7w}>HѢϟZݦn+sge$J=q }բH< HBG6I[HRBzhlv-Py:Ó[1Vp02)m/RhNtOIb1QF3N%Y$.vJDΖw>0òNfHm,P㤈+^;,B#mwx<EWT{auuu *4)wr>H)X4MzSDžpzDQtKPj4խqU}luФeSDI+I%n[Kah0 X[[~ )S]bA:&a ]#%`9q]'JC%XՐPF4uB|^A  V.Qw"֏w+W%Z !!L7%1.cNJ 1Imeƈ:`ۅŜg-[+qDf;aLFdJv-R-z"t|ɀx@_61\r- {{OCfJ09Y3 {HzQHY^’Mh}6>ϝO_Ih/xݹl~ ,=uΎ^쳧" G1aj0sk=FPZ!^oώPF#u~9Cd1Wb 9@3Ƣmh|^1LAI +t06 Kzy L- f/gy`&#}tj_[|6* /~.xخ`|~?H/50'!SL!N|.Ayv)pd?39hO<߰?GpҫIj̱KF}%Kg]Dj?{3$ n-CVOuF1F.zILc]'Erq|v_ &-#g##lC,EIyKXJRUDM*M$|"i()& *nWة}QLT$BKN鯙@[sJ[:؊%(U (by0v p:I2$=o$j,8 D+*/ #l&$#IKo!tq\idj{['?)%ooU/DjVPLOw%vx1FQY0۩QEđ<7]>aNY8,//s{QsQ 4Ma5eQ]~_*2cd$ ~b0d'R[oS4t0X:Qp8n.,$wN"λ>i~VWWwŏݱ;v!ݱ;vǗmT~k]wsk=jώiq]cyɹwܓ5Ήq,E {Rx;ʣ Owjl$e\{G%3#^~ƣ@Z IDATk ΁"qVv9qP/\,kj8e=6 [WLDSÑ٩*VU ^-\u5NdTW㢧j$I; {・;sU$\-.&TY]YV;B{)S1q| Z9Z+}~S #8ߪB' rR}og\\:p$/tz{| '\`<ԁ\XLК/A쀊rI-}X­Q '߮vtՏLʔsxa>+бČ:կa"A$M`jp ω DX_ݯddOt RK1 D-aqEw/ٝ+~""-KwHa p9mѦ/Z.,]B=2gK.<e1BX-,XYe2x-JI+%dΣ2ʝ.|K Qbe9`(1# %ñSfԦT Qq{E"qZ GD%ruR8Ǭڶ#w~uUФ .VScl%XF!#&J'I%j`Efa :^'IH:FF)D9 )M(Jp!B3yw~MSUriʭÔ#ѳMGgUN ?|=pO5 I2WۓYH :Iq[_W/yȏ|{TTjC!DWȬ]$UUUPR4#QM}*:6 QLfZ6HX$IOvK@RLU'lV9yTNIPB[{̙3aȁ<)%N,$/B =J%df6" jZ @*zw]8.""KJYF=t::Fbmq^k׮q& nc]H;EZݱ;v.$cw]HU8D!-.]䗸1lzЋ!%GuЃ?^#txw`ħx^_A;l]`]`kt". Wy逍/_t^ÉS쩅pv?@67ly j+O7qH\b!G8mSdm1&i9czGlfz1zuRh#% 2-p;x5b $}"Jgh$0%l*0!MJ;#%*F rQ k't$.&4mO{s*,f; E[2AȕGn"`1tQ7@"}Zؒho{]DFHU̾Y4f2in)vJoK%uCk7pK#2NʗQ{vޅY}_q2끒η&+dzK,Ǒ>MCkc>u8;YHeD0=AO/G#opQjɻ^8K8 ^o˳p֐ޥ$y}&CX]\̅Oy/ֱqeyѹrY\.=}hNˠﱎT"Z?\ECb2{_ ׂ@np}-N" FXwVmS$a ~i .@x'-خyoMb.-hܝr8?_'ri#ǜ> PD$&Ai I$@#ց"=Bب.bʫmd|"%xF U"CfCJ@xP։"e!&ƂLNT鐸.R$%ʞ-E$uTbP%[ VoK`*D9 c~°d5p]Dz<6* 5HeFإMR[#mW!aHmI% IX`ˋaC K`p~>Kw+V9f**ƈQȌ?'@h{OǜԹ-:F":Hc8MTb]4EH̤=H~xOʱSѺ$) G?i7l|ܭ @2N;tW0eNaO*Z!{^~w>_f0pԩWeNb(>I5*]$B$=%U'ɩS8vQOU )t}QnUqno$I/؏'NL9I9BEeOJlZah4$/^q,..Y~?yZY__' éhhU_Չh4J8R1WEJ^'cVWW}3L H 8U)̂1uy;V@©[ATb,//HcwBݵcw쎯aHB(t=W{t^"ɸm9Pu (àDO+WnOh2u\^טX Hh!z?Yy 9 qϹt7mKT7`axqA_1HBvsN'HcR0252x~!6L,&P7#Ced/,pZ6PgAq',Mk#u٤=4=it#N=gԛyq "y%uç1utI: (2b鱐n/zc A+b@ȆcMAl1Nw6A=m~s^v\FZ2)y8E9Dp[^"+0x1{W92mMJ6X%inŞQp;WkF'|{y?Bث $53mj<-0K$6 zDWpQI*[L-*Bo#t^^\,20\ 4/$xk+j-Bn8uˆ.b]gylW.oٷ}؃fQ*&KpJR|*ЬDt$°OwU sc|v%ڕ"sRfC\o&NZ!b[];QDX&ۢMOtYc>53.PSN %TBp;te [o8#d^֞9]rĎK'38G`;ڑhΫmPfK.}}$e"MaE"f.73JIZpTV 00: JP:})#A^I^E$A*Epl"SRhSQgqzti0$E[ХG-Z( 0\߳}xb{mcr_ i#JZD&Kq }57n{M#RId!Qw)]bc&TIo<@f~Fn:= P8 0Q@wr+#jTk2MάSrUlA4|9F'{CK|-?^ _ɸv׮]{u1NIRyǾ*>7~c )}Nq[cR.JP%J)Y.IVc{{qJ@277W*Ž=$(՘1}Z㥗l,<@njFoE, 0`DC26*-' K>a_ItmNi<$[Ig8;8-tf [$W~ )">,Mk50 ҄E*ᐼNHv2@fp9IC Eu~F8ʪWp~Wcџޏ0o6@zK}nqxn6myj d4m|7I/xt^e/h`e\>q }GhX}>!q(mD:828qed#xŠewzxk }dl= Oq"rLZ Ob]Ć}y8g-P _A;@-(D6  VԅX5ЮKQl(f)R95ĺO 7i c0LF e+3 \X z)fzN]#0 nHCpH.iHj.iC.`M ä7$%E(C;÷Z&7Q1RXi'ʒnj#_N !fӝNz0>1.Iѳd@! O9I~?cbVƢVƦDv`]GL8(ȰܭS,׷e6=\|"c%xI$i$J%cZQf<BTOD*$)5a~2Ao$ӥoSy݇.P]^H`4 @1b*#{7=^3q835C+^qo6~~/IKZ,1 0+~%{|;/޳Bυ`EMܤlh4PJ1o]*`)ZtjeI0`~~\Q8;??~|JPWJ^d(2 HS?Z(8UgD\v_~ZF^/o. Au=_NA0l6^VФh.ijJHOp)@:Vt;y^ח/(AIn$$I8s O?4x;v<~ 7ccwtQ_{' ##=plݠ6Gk9rZͧYn O0 lȒOHF_2"!##eյNf $"hsU801?{o-Iv=ozEHjjm F>%1`뀑`{1G M ل`XF$VWUwիFDFf*Z3Qs|e~'Bbْ>ELIJ^ ?R\7#65*cDc>Tu+P#\A&9*.3xH_rrE@ԱTIh~&ځ%άmSSIL|J='n;* ݥ&RUzF_%>z{>CW疰uJ=墑.bE)u;إFa'x.?O}Är$KiG.]D8[HK=YV)7Be"iVo'Z.>MZIS{^RRQ{"/s+;^g8$WƼtEGsGCT;hˏ 7QjNlgxm_Ɵg,]ॵG8d}מeNn 8q}Z K(@>Tc\h <ѡ EJO)jP jxtˀ|H3/o7 54EӘ\t]P!HCj놹0O.IrБmlmsQ?+wH$7hjVq%v]RF;hlm a"N""+}*m2i$]dGd:}<"jz eEU$yU"K Pa)$x!XFqnJ8IuzAj0TK2V8,x"*6vuڶowTɺS*lb^zϨrI"nY:,Am pWr:#'I1YU7MR,SܖBk)֯qͱDOh:Oag(- ˮ"Cj\M9@+\1HK'S\1^8 IDATnEn$Cj_=I'IR$$ *LL:.*- tb>x>YO4))q0?3 wÈ=~/&exQvTUTObUN<-oy 'g$2(+\O9(ʕ+X_2wēUW$"bp 0 XXX`~~~,KŋŻnqzٛqubcc2j3dr>s>=zt5|2A9 LV۳=a5t:e'I-ׁ{\Gn}#EX1??_KqBi8/| }݄aHV+6St*(yx8Tb阎阎$t_gd}n,;DYYiÌK> x@pq}HhdX!|* zg.k!p}6<]Ѥ2.jW)4/Z@e4l;je!$@] vs\"x 6Xȷ}%!!ö4Jڈm il\"Q׉+oG-rHb٦$wkdP@:?Չˇ^q7" 3]_r , HBC|G\2//1|c@5Ε?xiL?krKxҷXEB> @5Јz,E`=bzJc 5p5A^3ϯ1#4N\2&" * <_f`ogM8 \aܨs. HnWFN`/BmJI*.ػ=1.˂yLہ x4ak$4gC'fH\H]{t}I=$s-wg\2",%Ʋ2+)d4*Z'#cIґ-vh%戵K zx T-AOEaH^9V#q^T۵UP[,S N #Wyp6?1L[U{uC)$2%~A2ďB("xQFIXc/pdIS{9IAM!0&kF5b Tr19f[DV^gdp )*/qԂBx,3gssfqnp#zCrH2 0\Wfsudgg\>!ƺ2uܫl6;;;V>RmRL/:΍ĉ׽~mEW5n[nٳX'|t:\x$IȲ=IX!7$(fff8zhy}0{U^eykkk>|^[__[nafftتnCqVLce) C$K_zt%")޿lmm~~阎)$ntLtLy #+oM&iT*avuQю(6yQ〿"r).oF=MA,ѫEH[o3ul4-̰(w9&8:#!ZkZD넆 'B "!RR2tvoqK%f܈VA p#z(P;H[ ̒([brC8ᨔ52-#h(6i.O9w0tHX \:yYE.) Ll%Z 6:WSbGm9 b/s(#}QmçXmrGU]8IB+7/fvhhm i~gC."#naR[Fػ!%b<.̨f.Zkf?o>4ZGK Â}/ECf~=Ih|Pрg[׿=e{Wq;1sҿ}9̰ǡy!bK΅S8Fo^ſwep-רY1 FҮN. JȊ+He %vl!#2;])#, "whS hyvk+6@t(i!ck~;_a>٧|CIz~RFSmة$/,jvp +]8"}d]CQ+#4WNKøH\'IrA&mb$IiҥvL6&!)HڔxVENղrG J F Q۲ =<fn薁C"a9?ҝG.crDu3*W0IkO?0}&ދ$żCD$-F}_Ci9vlH.B.HJ"H! )}c^Hj q??[:h PR=<"e VedWy_I>@ ӐzǏCpHm0 M Wo}u#DVZ$E/dȍ晘`whxU/AtjO~T' [$|!F1W}rlHfm\_Nueq_{mU;Iċr2[GfH&铟߫mwk'N`82i6c@:Uc&@]0 GEu$~t$IV'OzNKKKlll';xt>{m@)cST8$_*$\I`Tu5Lr;ƅ Nn#k41@%ȑ#}$annYfggq]$Q"<+ar?yEҫ_rguw A|6 #ӂnh>*/ZdtH[l mg%,2!\*Eɂh\ 0~l[dB"bT&.XKU (:>{ >sm Ņ '?|ά+z?  JQho#pG !2땦fgJ:;tx8, F_\Š>2r *+.mQ5~CD+኏J$:dҔ=օQ++:&B P-LDV&CÜ;=bRJp!֩yB"nxYQbCKP8u.F EUB I"z ѥi sl3[fĠ}9}EsI)`ar>Re̖D4_>u:ZcqM10]<*I`sJS824pwR%6i )ASRɏX|Ab}6"ce%$'LК RK4h@=S h㸑Z!)q[1b%4 ?2wۓΓiI'Η{mw39=mD!eV*˝$vEHzɓ'KC!>Q@/t"B0-yQx{?ǟ:u2h1 J& Uѽz( !t]:N)omm)9r  Z=u]6sssް뤈f2 &8ey/0$]wU.W+++%vA>,b&N~:CEceZk?^k>|N>=vi4$I2eHեAVT5O}'Np뭷[/x$InI4e0dnnn!˲lE[uN˗/sBd:c Ic:c:/Bg|A^?%@H`D׼fm$h%,ЧF߉G-_0ݮq~S\ߢ6k%HmH.Mb\8OOjl=K8tY2`AlIKh #qግ&Fnܝa̸荈A=@yX:DjyWݔh0mc)o^$^ v-5z sp|1*"U~2' gUq!ɗuf;fan@ɄcZyl[%ls wv2ߠ5+$_ӈ8lwkaaY\h]ξ8Ak ;c3.\үE/mdXqNV&oy9% :Dk:=|9` B {\xZrS34":PsHgf}f|g\!zIFL!cU7EH` W*c1bL<zDT HaӁj8h6=! RxZR}S/b` > -Z("-j9:%̺@uEhs8F@7&A>|LWj ;.\R9 \ 8onhE,Q4DE?Iuuu^}/BvDB ̊m~WS?jg:mvh!At@e*wL(X_]0"JqQD7Ɋ{S'#˷]5% sLc`3GRNgyF2SDࠅЊ51Ub@r!2uCb% #gO Ӵ0V.Bhs[j3(8ohc門 Y l\Bz7Y=%(n- o P}}Bu(\bH{4.Ocأ9ILB${.DL8DoR}z i1.$Up+ < {f9MGfq$XxYZZ|'[BѲ3yG^}&`0N.j׍B H*)QȍIa2⩀RJA HzJ),j&R,H  J ῀&I0;;KQ= Rd/ֹʪvLb:sssZ-fHy**aSH PP죢@_+++?~콘GF}sկ.]"qcN⹪1lqfێ㔠%~ Ko^A)ާIHq GG)H ) Kntky'RuF/LtLLn:c:﹓/z|MT?|ngP^am -| ޲`8%e0OpVbC;ŕCjay3.`kP֯)A8dYs]jMmCСO^G@`H- x]ౙ"WuK+Uւԇ\pr%d1nQ"D 5nF7th02XF!==ˬG6V4-ԏ*$[bUQ,K![],!ÄF %$;. 悝>T-٣aM츛8rȔKCR& +FbB闝f;iyk$iB#q[ vgXczڣY9K̺^z'Np1p` F}:)h ζ_yt&"4vl;Os>0<{^7(l%m ~A?r F3f羚E=on"RXI5OSSy SNd.x$áO+!<6" _-Ԉya Q 9,;s(1J`igIp\~?H ƅl9Q^lsp~"NF/`Dኘ*s`+l}E1hH9*DyG@p1UD?Y2$2-cZ/@CsrJ7EOHAK{>hJurru\:-K͕cfB2򑏼`ѴEltݲbbm%~Jnoܩ E$R!ߨ]A$7,m t:.nVU:,+$U@$ضjFkMV+_fSW$!"vvv+{5&bLL:JnI{1vmeIё>p}]zqu %ة5~;f5/CGDQD{Gy* "m<8OR4M,nky*Ϛł^D+FLfuA}R%&>g(2x;G{]|~CʯѤC:gC rşaRi|#-<*twGsdfHFPg7e(v/@C+FeœEr=L o_M^M>IcMLlH"wr#Kf&Cm}ExCxW,^}Q=OV%y<.z>k?;F|{tFlk^t5.@н 64uWQ K ^A5Ū[kt"3 B^8Hσ9l Ax.@ցG3m/{Ej@1)0XyͰ Bw= R|Wf? F޿n_p=_&_!9߇8XfVvv>_ob@CtgQ8EHb G1F"wd 4}]>=`y6X( ̈]_D; Dt4 Ӻ:B2Ò Hq#HRcܲp>ؤc@?p<t8:Q9$QfIY IL20=tWo+$JcOGHUJ% B7°t&~Wx*1ZfMw1P%%Bjno< HJҫwV$RǞ?eOM$* KLChq.>f G%(%M`x")lw+8P\_Fn3ޱM; Rdq̹!n$ \w +O~F& ƊM|`ĥ/\WیB(h c/@Rի 𖷼v}ȿKxBTF:ϱ. MSlիcAرc(K1@Ef`0(EѿQuiZ.(,,acbR  ߟ~&u\__'={^|/HF x,V>/,,0??_n8׹MbY?8N*`0J 4M.S v-ib8 @"$18$)ޣ8S*阎)$ntLtLN7 g_|ج_r[ԛz̓zBolaP HIlVE "^{E=}>w(i FB-"lKiIJX˖ N dHY`x pdʣٝ\rfv;88G%y,h؊Px22V7v%5.Zdxm(#,vʡ{8.α8@6<}P1gmUt,hl\K/mnmw26Bi]zi!5z/#,2-UDhK"KCfVuF I-[ g >;6)VHq$hav5~6Lqf3bc׈jkހhwRMKB4w[d)^W:0xg9W`W>Ł4EH)$t~=}oah8!/4ll[pzz3MW2ַpvA? ? ]]Ue#{t ZtFBc9D]༉ʂJ$ \WKDbna@qHA^U`Zb1tFT|Q-uL/I+p9Kv,p'4HǴ`P>\HXɋ9$Y!50W9jy?HNeW A;!T*-_eWH.qEL0A O1('We׀ȸ{X*3ɶR@+bm@| 'c%3$E9FHW!`g^a[NSUjy֏:(%ޠOWnCp)vicQ~@}m/3^uUCPgC2)IR,=Gl,>E(rS~"=IZI.cjW8[3< LgLD6ِoj||VED̉-A/ďǢw̾DoyY-RzlK\tW']͑Xm_ :QDk33BlBkc>_} ?im).l6 bW3!X[ȗym"3 ZFB\ uM$,R6v72>8> 4X68ÖtT ^P]`H_3 #5K3Nd^wk Li/£pysf}yΙ9,4mpQyzs^Coe4Tt SODliS]N@:}# ]&]4bI۠eWG$V¶R,i,τR`Su(~JXbΔO7PDh% qXĖ[˜0h#Kp\*E*y/ #@bIͻ~v˸V=f~^P+:E(P uޢ?ފ/B_ªɾL^Y?>bx{\DgeX}II$~ srW^d "Ҹam"~qE7IQ[īV \F%Qea!Fn. kLNU'IUA~M<6:uBY>Uu 8b˼|7$gϞu{??=y5g'Icduu=ɓТZ.^^u:b/HRqVqs̙2*"MӲAzZ= @g8nY1aCJI=U@tƺDq\w]/\t| Hnm<+a&z $m` }3eqI&z$$IQVuN  U&{cwb/xRd7KE,W9Iu>-/$U'<41SH211{}Pr^ڂ rbҎa> KyfE-maH= %wk*r9?:813 9^v^" JxnPiy Vg)H |wCpm6$$2&V F>EV€:HLk%UJv=RPKv\S:pne5^*L,($CH|o0pi]M,\ &9eHz( q<ТaʄO |eJ2\TM,8"5>ƏjȩgX .wvo+:!y龳\mxv"l Bwoy+giXpD_cgʷ wĉYfvKom/mrLBb?o}Omr%Rl12!d[j;#>y9.. &;K+A#I\x ==u 1n"|^M' 0X=RvKr5* qՔ{.#M/QN AkYN23@!wVfYX \v?{HЫJٹdEK+zUTNl Υ ^{EnM|2?th3\qO␔[!uT*K1^S#d2}*;Lr*T㶎Px\USuop*"&!L)ȓNp#H(bnҡU^ JqT<8iB#t^nUBȲH4s83Q{jXYdD]$Ɍh kti %3"QcP>+W TOc'F׿N_eB(JKla\#EėEV'1@9g7]d8IBڈHc)N`G)vb(n*sE!QqB\6?l`I~x8w|q}0fz<1:Pcg5ؾr_MI/[/SQd_#_Ĩ-]w_N+W|͏[ ئIH"d8ҞWGQO>.p 38$̴aRll!2ryYyB]_>O״ y\[&6ݨ]Ozb5~Eْݎ4"S lq,;͜ئNy3lòKl }r lm}`ڏS4!t5YjȬa]@&,"b^.iV;hN_VK_7ܼݗ("\- 'vR_s$  Mkb!6}'?>w o=">mA-b"`[q_FSӑMZhfݐ4$f-T[B!;8*(BǠ< XroXs=icK܃w9ڃum?ELxVe~k2mpOlט/ ~OcŚF/$}\>}4 c:9R>X;0(/:&I=s3=2nDyYb PgabPg@&6K7G:2pBE:pbmUo@jR="8Ly|٫f G22>i. F.I~EDNYc2 2 iA?9xƈqr#=&YqR\L v< /?++. 7G.;էN:n+ $!1ӃJ ׯ,;.bmz.2QߩNR,FkAD ue(~[Y eJѹ a̓$29w͵Keɒ5Ϭ`^fL` fXC<)=^ `eKF%Z[RV]kVVvsޛ7ۖm"䉸ٹ-n~17G6䒰H{Hr7IJab/thѡUYʝ*Kd/ C*`ktD GL/S}j${m*)۬s eKR:+- JE&rHJMٺe]+n9 Ir'B"qWg //?oT*,"" Ih,..^#"aO 9(펉?,\^E\r Rbv1)pON3HSOav!_o=*׃$`AL?8Nr\V2 V?^Gjɧiri>aP#i)׃"tp&ӵ>\%eV~O$eٗK$e}ep)$B阎阎Hd,k}ݵDioaUQRw9ʀFժ]T%a baen$ gKrB #>A}Ff%\OqSE>AFA;R ڸ(i`ec\Ðl!e!vLY)dc9)=fD@T|,_DʼC/lPS}Sګ4IjqRpl:kvYYיM:/h|Bdq;?4+⚃Liϱg5qEĮc&"BlZ3i)#Mzg5X/sGyoX_c/A#uxDZO7< aj4x,f<|ra? s@|8S$"M4JB82#%̃7 !!0FFWcK#ĉ! \&ޓ=g^+yXԬ>`Y1{Ϭzcsuk|=7TCiPe:fַ ~{2S3&ӁncQ#BZ7CXu,/*K&qg ֤&l"M%*3?~3i+-DgF ab?ҿ",97ּw"wB6M`6j`zNqA$8Et*LWFjx=rI($Pv50B0B_(a\kE8(H $)=)[@HkO,RaXcmblO#RG[Di! pJh  IDAT0wiT4eVūC(<JO3Yl1C*x+6W(vKkˈ~q[W ZQ'w >B'M%Co""ֈX:I epPVp9I$5Gfͱx2$a8X,>|I8UU|ֺ˂A0&ǃ (K.]!e=8ԩScIp‰ q_/6$'xW$I&8vXGjژ$!s7Aź4 /bc|@r-P2 ͮʯ'Ir{8|N5QJ9Vr_%Zs- ` Ic:du11i$e[k@ !T)|89Z. V-^ y,|h:?s ˧Ǯܞg{aiOh"bUЂC)'OczG/C'=-/Xaq#O.qbx- Tf[!6(ׅTZĖd>siLl*,BmZrؔGxվp98.=HַR]"\* R!u$ssڢK;kJfOҲpnOH] 8u35HH<;b{+E+Al/BpaT ^7=/=;C~eIm'\x m ݔݻBT{?1!" 'z ً@?cKwGHֳ)2V{p5q7vt hhBDg3A5owyW#^nFX:g"[O .>rv; {6읃g :E߇lOP&JPI q`+R"fAՌSDcFS!2$p{B&@&Kg_btva(_<0PK;&K'\ʺ ؑ)`򘜙̑3qev]j&)`Un@R` |ֹZ`[!CbΎ"U=XR+3(.m$x D"@|Cӏd'C*֐IX:BHM>!1~yv wH4bԊh? 'HuѹSA"5AB+pd0Lj "pB뱾|x*4Q"drLWpkMX,/=& LXD(K@HmbHp tX@WGx:! / qȔg[rWxLwG $JQ%Q}$\"ᢵBKxI"̄~|Hc.C&uߗYEC?H_5{?-,=c$$Q%Hbl9nVedȁdyG`}tsc%s 3qQ 4))nuK@۞"0ǥ'@dV <4}V#DAXW}6_y~~5_$ggٽoIOsĉk>sQ6vg}o9^8rH;IIJY8Jrxoo=/rGD_<ϣhn˗/z!~7Sԙ0=fx}cffyJ}ź^x}&9 R$(IPz$!IQ*? 8}t&MeH>wou]^}թ1111q=H8m2WpK69~3GYq=VWy"0%F#׹4Xb _:) aKNC3H7\mcT?᪹XԊU"#9.(XlYacYU8 ѧ 6*DHBAQim_ u0|Ƀ_Ar8,7r\E):]4>_ %Ug`N-E(f٥sa.:6e(T[YFrL KLi%yX~˩wD1{B!_UKqd!yxb,Y.ɐ%a4# A[B gY"dVzfG,.ɣ + }n ,:obaVxKMSӇ:oopvV4Ck"XoNEFw@H:Zm3/џo_w OhiyV & IH % KcZ EVjYhK – N9 Q!~8;!^j@c,1^[,\-HB #AHiХ&"’)Xh@D%}[w_TO>Tj pZpY+ƀ,&G\B@Ip[%3rILNI&`"iO>n򔃘 9حdࡏqtcdKޗruT*V\gʽ+3@[KX/J `cM@'5C$"2B}QJ]>S?Syۿ?=??s[[[(hۜ={oŹ1MgΜ)IR&$ɣRqȑ1a8r=R0_wv]?fAmۼaYV8qΑI@RvJB}6/Apfc RWvH,GodOQ)OQ5./~ӭG8 GM\8 xp ØKjLGh|.{ZI"K ^%< ²v2xGS.2/4{l8byNbm`*5D`eCHq&8uG n۠ PҀBAgeعfB dB~hM$5TԶc:9QNjJ cCб3̄U`e W$٦F$DƆ $GԢĸ$ q LEJ~!KTNqi4R)$~b8p#;JLLj[~X1WF"*s]&Ətt_#NJQO#BEhGr¡A[')LީGKcO"A8GTȫ!]_:ѱYP$A"GD[٭(]2OѥA91TOXHqRA-rЖ@XGx"F?aVpo\塛~pp BhmFt,A?9lxbJ oGʎ|2 % 8䷁}`1b[N$'G=E'U9}I:,QgNo?2ZvZZdԖ7Yb1eIzF.b~~~$_:g_j~.|9 ҥKk/^Ht:}=#z饗 ˴ZB lثpP,SNך8fww ~ĶmegA$X^^fii=:mc?cE|WEdW5Zk\-Ϝ9S[H2 )E9\8w\Q^q]4Mygoo[ɿIA[Ƶȵ"$9)/Bn@T?}vXQXxON7~!qDiIKw@qg@a78qKk-:Nn.\t.343/;c@xg`!~8&?}Ջ=PnG/7I \&Q|.@0F R{ :Lo <'1pD W^^1fYʞ3]$ꄉ;R5SoG:@5s'ٕ͛։L@@yT $D%vmˡCX.\JAc ;@غؙ@TC"uZ_( IVRg+GA9u/i5bdFTL%2 H !Hmm@D$ɣrf FxC;MF6Aƽ$M&r -ı񭠈TZ&*w(oT!kBTY(t5וGeo #_牥b2q8nf '0D!s$IA8@<$Od]%"2q^`$>?8w 0H ,Iѹ"⑓H "5.iݑ1or~'.:[.}hx):'47IȀSQw>2 H7<2x㏌ e맳۟g%q=HxܝX=`JɢV0wXGD cN XOB8ێ<˙'cI!F^t fޗ Ir!,Hez+(uo|#jCWo ;xbǔGlSn8((}q# BEk=VWH8NJ|j5 (> Iq߭y,ˢj9`rH~K[ENx~9nmt#caHz=F&IZZZȑ# l.\@IPVygr?~1G#@zdr]7|t#AI~?]u]Rj1X["eqwg|Ϟ=?11$111$r=?^krM3M BdWW1?z>m>3+u;8h{F':7qف!QyքTWy˟~)_޾, ^BW+ܔp8.[<ӣo!XWPڈt/[O\}%f+y޾ !$mUŲmu46JڤiD/ &M.sԭ l(a1<l ( Cc@Ye.oY,6&'͏ϞSe`gG& B̶w9WP3#zx+SliRRV l9+ZTtGԶ0w-D*X^Ahzt%:yQފG$(d]!?x-gno L6'NWQ#!8N"a}CaBI|FNG=\ڎpQ p7G_726@c&PKKK,--Q(/u{P-(%ZXX`vv<ϻJO*ÒIHl6馛,3(mS>Hk$Y0Guבx7X5[.`60Mb~ \Iq^O0-6 $21⿂mg>M. &3.B+f={=6E4~Y}g 3@> nOVnpW"5S |qa{cǸa.J"l6{9л1Jiֻ4k~oQO|&B_L.,K 9&<?EdRMSe~<>'8d_SXlj=b+"HXM-F@99:|mg6?gͲDmP }4DK@}3 ̾qQlpg/!8k^`% (&q+ݗ-5 (| Ѱ~1dq;{ uʿQX݅ K&P%!%a]% qB3 HQ8I4 v!ccVE%w)w/% ,X SPw/w~!4eۻAW6 G$Ѻ DK4r((ɗ#ce =B:K$*k90yLo"t/}@V ~$ ``SZᙫ?(֢ I?2ܛߏ`Xv%S,R@H{lҘ.h#$l<`LdDUl0}c7p$¦VɁ٨8|,h['(QE_2QBz1Dd$1Ǽ}FV<|4{|m*(xG6e_1rU K: Ii%at];BB]#@ǵI beHRÚJJ8eBi?kvdI$31N>.֗Q~?Ӽ= z/ϻ/^H$|sqI:FfIR)DE2$h9{lQ< PJ^= Cbff"j0pyǡjᘃCJIZ*SV҅cە$ wqKKK=z@?_2$%C^3&仮;,vvv/Xr;H(bffjZeYt8= Cqh4Bx}>[[pW\!z]ԘI0 &AɵzI^(9yr=HÑo_\)ѵ1jDQtUL666G?:=c:d:c:c:{$錑>s~3&kQ4B|vH{}3wO`v`UUF| fq$ :J \_Mc_| !-,[(a"uK+ʚg9=O/-",V y}.߷D=fb1k!KbH)}%=ɶu]1[\U|+T8E0f,ͤe'TGH8Vp{d[ |*0bWGJwPZ¼fb']oՈk `G=fΚfw;FVbp-7qY?BDڳtÜy3xJMB%y#OmBz<}W5D Y^o&z4A|N<(E `,B\C ۳_7B4{6}fOG+ڃ,)vnS|Gg1<|B Nk\P@r " .Htqp<B3s@-|<}(#r W\=%_^^VQX\\,ʂx9P89rHӔ0 pL/O:w}aX̧*_KJ8E'J$I 7PzC¾8Xsn_%j1EPVq `wwfyV s$~˲馛ROoӧOsyZV>p(n.\nU.\/rkL:K'A"_JOIف&o$ZkFљCk9H򱿿_N4ʕ+lllA5qܜHc:du11SHrX=0)$DIe1;~rmqU[qhRXaZt3֞@CZ^.İ@:TxAROp՚(T(z~So7|.Җԃ 2V 2q,Xe])a>D?J"\ak#P ݤ*]ECDAk&s~.oil*T:b^HqhO5S ?B-FQfH]w[(ʮH8ޓ7/ 6\e0{>VbiE,PF҇H\4'>y^j[VJ+MET[P#. ܽ\yF|ӧNJ7}yKmitYKTŐ=D(nX{_oZ 4Pk!͏i;Ny'@{4 ZDMجW[`ݖCXlagK P  dCxG`=:ZX\"B<"ܢ0%2nJtndn"ےmCwύmT[%Dc@[A)b goE!Ip$dC*J0ċb.̅(j S/IrzIV1pD@TuLm R`G'd*p?}\U.͔f$\V*sb%.P{=\"m8)/x1jրPp8\'6L6. Ս{=H!:b[).(G^@I Ͽvj=!j2m87Ak_10O%rWD@TaT~oqvkϮ&TK""߬UBҰ΀B^2A4MMm\7̀}|LmgOxx@|r>|c@;tY3I,7XDov}ftB&Phz} bž`Iّ e.xpj_[r~#oAnd&Vn} fb𤀺do -YL5k 3FF,ӫq}hج䖙1Uכv9ke#(l@@t;hCddxIH`kzU-cǎl1C2 L{N˸{ђLVFϯX]Qr~Op)fW49Q-[D$*I+g6HSe~#!Y}NFQ\tcXAI4W#?[$X2EZ٠AR8&k4i T啃d#_fzcbac |F[|p!ʅ6img 9$曧tLLtLtL\|ӿ+Eex?r#g2`631(.kI.̟,~GQ@&K~A-~eQ*xޛKv}s{oޛ}0!b% EH4M9͈)QK%*ز**,YPdJ,U$DKhŒhѤsAn0Yޛw='{n7dd}nu^u}g9wǝ#X() ptfo@z\g:ws<ːzbuw?'W5wd9rq"BК(Òr0لB&$ϭTCj R7PP@(H[8RἚ! 9r*tΖ&nԜ,7]G讐\;\F9KH*'U&&~'#R\Ќݐ .o98InVG]о@U+ICT H]E@\D {iLSf+_ېkW/&R$ӓJIf[˷(FhMGM?|G2QZ X8"+{hlA{o*m42]RWC0_%YLMZ{Ua$ …q!llOc Ĝru;?"tn޻vy{mL%#MS `7A{6wtO}S{cMj|FIjZlujgW]nE~ԔÊb1шvwwɲr.ceenv7AfYH)n8K!Ajߊ?zF#}'| nIt TyG^'IMaFg4Q4MY]]߸뒦) AAvxA[+}u=Z6lTA@e)?yc1cI[ IDߝ28YЯwѸpi1S!6dH\{x+la+K@ MQsI"##L]3|$sш3wGX3!.GZAOL4ȸe6=~K1>B㌀aBrm0Gs:PYK+w2A1>2#weG(| sgGRs8CC ğ7g*+|.1K/⨄_g)1V(rR"MK2;[ZIR)Q@4)w^~AAK̏o56#g+QW$;GQ{)'As%S|=NESh 2b}i%Xr TLM_>xExȕGs 4N2?;/rb rG jBtBG@@A "]ju6t?Y7G֍E6+qT <:SNbŻTjS)Z^3N2&7q!^8TA82B!Z1E/A Ciy OT. IDAT p\{HjQDNRE)Q$)$IqX0R~i3H)&Nt!'G љQyp_?fPk2phG Y&H{pؑH!aE zOqu[/?| qȿy%] &2O7;@b:;G4tYy|.- ZSNLOU-2EgL! ,HI9/\+dpt ?I7͐2%0{H}E4bM-DtF9co1BķJf]&E4G|'OLS ؏;(T\> 'fw?5[tUns急lwvxc]'Qn=Y$V=p?#? o}|9IE'OhETyhKz:8SvQZ-8._3gy^< e!^>(_}st-aa@ј¹GlDe Il9x׿@Y__ĉ(ϼ.$Ǣ* PΕ _dx*&#pptg!pq<تr[~h|-9TYjbYh7EnrquFGdβ瘼(cc|9<;!DO)J㫔 |Ü#Hqu{6GiY%y1OSk1*'W5Ԣ޹'V1Mm #`=0]%s~_%?<lRSʌ?K!୐DLi\/ĩׁ B ,@WE<?\H}eQ:^c҅6>\چۅ̰߮\\/} Via!lK'g 7W@OG|a] SwA_1p DR Nl. i"V193C`W1N[^=jPһLȎA7 D׀u講}ZqgN؜8ނ"Rh{z>Pݖn6ux$v&PDXBMIMw Q Hli$24O8ŏ(ƋS$ÉrD\8I ]1u]8b, If@ɼy 31 H%8H2b633˚$U]VV|< 2{߬{d-΁#UR F'04PD2:Y$BCJ;2~W~;^|Iɂ=&MSnYO~#VV!$2._իW4_ɹQu8C8SBYxo\SS0vV qIkKw73$['$wwx+Ɉ/_qJhפX"&dipc,e=2RYo%hpc_gErPVʨX4GxuNv{!zHLKl\vnvpZh >`;8r"YKHz,4=J9zcR!9;09hc9M㑲-B9I¾K:8DkT:cvgoF#8~Vx*!/xFKs/tD(E~p y8x5C38 `#<~uF< B &WOAKschs;+e3:vBBʌ'Hv#ׁ 1hCσ6&eJ7[F*J]/%hM ZK AFhv%!ޅ.,5yPrx ٘QS.B~W7zwݔh"/8-1*tq@FX2bdwX=QlO!dA@Zs&K;F2 MpHO?"e_&+7𣓛 f9pt?")D)zZ' '[oz;R#s$uFk)ǣ- .0b)napЏF: _$`Jp* +lFh/ RI:[M +pITxDDEP>QEKFu *$*Ysy6FQuROBQB;6iHi|}N15|R<rۂwRH5N' A&8ō2qr6&JqQ{D51ύIsbutyp#;3f$9|^ܗ;n˩pн ɬdC^t$ * ;YfV@I(K(&: RJ&??ٳgy?CSW"^j؎;)4M?)!IpũeVcuNVw]`@*ϼ>nyypH,M򤔼 |,Ei[~n| +NU{6dx6N`0I14MS`߾}%u677}g}ܯǎM4?dyy&׍O>$y{` |Y Jc1;;;۷o}a i<%(c4!,fc!Fet}T{I]u(8ws- X8 I[XFXXX$k/j88/O}} Ν+vɗqoh=ᛖep~djow4:a+(~|mz4|ɑ.]NY1jLWH 8qfx:'1gh׳ r$u5b8$l`f5 x"#Wx~7J8Il+RXQqU2}IIrGmP蘘|Rڧ^,ȝ6yBp(!1Qc xN8bCnNh)vSTsX#x A]pH.zp:\ˊ}A& qnΞn\!Ɏ8gF"TQN.E>QQ}C%b}a9prR7 O]G)(<` Oǎg&u^1hu NDM}@<9}ިƪc w@u'"70b[Vf?ɬ:@>oR p%42,Ya7+EAtC؅v3Bbk n`J᣺2lǞLs_7`l'>ƖsN7I$)=I.MgG*+Q[E'[*#f ISv\a]H=$=I1'Qxnp5),ÕK, 0_Zq׀"z Z $ K\ ]:ZlԖкРpLϔӠ/ȅCHDMQH~_Ƹ!6Z’֗yi!L_#P4ǚb]`D6UqƺcKSl7ne'I?%$KDtXHd#St&M28!"G9(89T|cE@(ESNd$p}eR05W(V:I 7NQ$^H pPޝ$90h-g6V˝7uefEt#5n tL*0U% XLVx#P$@~(O )}q:Dž"+?rǸ rT~z qB mT ~pU8 F!һ ypS{',; -,i`$9D",7a1TJh#B/D<%&)&9=90o+6ˊN̸P(0R^r\W {s|#EQ@*DmFoB6,v1efW~Hs=8ImH 1NDewAG,Lȥj0L^GFUBNH8"7XřM;) Е U1^Će'IWMia:I3Z`!qvHa&KۊrU :dY+4©Dኌ*;\~*/TɵSDqd͂{]J82{f씯oI2>ةv>P1:mQB-SCeAq9R~Ib_:~aL" "b=#{@$f7[ܮ$́$1OǤ ˪m v#2e)$ʲzyL1p:_..7.D%z@dl+WW{&ABLA[P%]c|G)ŏ؏7=%xG'2j+++Sq]^ U',,"E,X]]sܹ@ #8VM9GLRʲt}bw[}wp)H;;;m&KKKj54͹0g4ѣA3<3M&pw$[@x饗{o%EnU)pr\ǥľnl{y>C4o9Q$I I8p˸j? /pԩPr\$ H$[XX@|]M$f:7+VcSV`?1aBZD/YfCFe9c|ZY-/f1$QA1+dͥ{g)F:8wFL )W/\}mѡ/zmFF.vWyo/fG/ My~)Gܑߠq)8(WÉ;S Y W0Uhp)Mw|]#&x@s 7IunDTqG \AqL1|2Ew<Vw0/#TY˒%ž,BB 5=/><5P$ h'ѹ@^9ӽ78* W6~JO 5P#%/ hH)&mГn}bRt wb=ei@OHrgr? `47m(\#8H>LĖͲFnⲄ %1''gcO M@ (툩*@:m[uh ΧkJ3BquFt^@8#bqDc4D 5 @ˁ^qM On+˿ N{9I~}IV.2EmU`lw-F[U㶪$r!9hT/E IuNQ94$);jՔ@ItM @&zGeS>1~>p>O|o7'Iܸq(?=c6[4 B1F#b5-\* S]*, Վ; p훺/pwЍFVaȍ7tJ)fsjݕRZ瞛ڦwc? Hf gAI5> 6zke#fA-d~>[V8)%e,yO#,q8 {H&$B,j[}H)K'b,b, b,b,b, 85vƉS6 QC4F+VDѵCAe"Nd֯-qzKw}7c 9Iɑ%^/Ɖc|rjlmn g5<hI;BSGkM:Dz3^I=K6l{F>Yqݔ׾$.4BQ͈f'.׉*be IDAT\"U4T͈#-vjDBѢҚڗ#ӕ{&-?-Q,]ݢ;":VᒣsSvG(>$9Ќ*eΠNSƸdH?geҳ}h'5M="!JUnN?˔~7!±9͍F$Y]#"Yn^! h\00Q9&)$GAZYA~}]q `%x*tCz$ 7f~_ee}}û]n z\$yᘹ_bzV_qQ9FNQtotAO(\*"/oyȊB(0qWඌ'nlACCas>?︦$Z.U]NV8Y qUFcjzL=rޑB7D"jpTŕ&Jq H:qHQ^*!˿#S"2b˺Y\2TTi].P ("*!+~ק7v\`#CWyq\j^bAJ>] *@! 1dIqtNM5=Ɠ՘Z<&D SQfAfUbUU7wjT}^9+fȼ~y M}}'@.Hz>:~ź| 5{#*,v/am>fMb @5jHX;P(y[~q;}+C)EV+EoG<{!KKKSpV(B}*ذ"A+n\$}(5W\)"zd̺#z>(RJVVVxKw^g^|]??%}jh4\zUn6 瞻 F>|nӧ裏  n oJq}n,YMb]9׻zԾX^^.]uT7Qcw_86NUt:aX; C|gggg!x,b, bc1c1a)=tp5v , z,2i:aPĔeg uCD %% Myp3]풥qD jྖ823W5\w2@K{_ n.4@K#b8$vD0z/p8hYM# T\-SZd (c?X5K"+8v;&puvNڃci h}8ʾNMUDg l(7O\mhI9}.aP0m@-=#yinQ) q {I 7נ) ".:4ȊeA Nl . PrG h9tЂ V8ka^&/VlINA.-BC#S(6ZC~Ld- ܎K=7D@b'9{xĀ t7X8P$UuBH`@xDN-ZӛRYUTuT$ic^+~[EsmUT\+UI݃.ʴ1}-YOWFE:$#, 0c,h G#Q?LpG!uk oؘj"W# &RS8^.t18:&bC q1 Q;u>x|9%$e&\r4ݬA^,-+8rq /B| d!|knSdp]M DÀusJLMFp+nvMh:Hlo6 @^JE(D)!(<q3k0%?%fdaGK&nDB@M݀"%rhh?=C捗gǟٗnN.-zD]h!Q>yBxw9SS8C-)!ԤDҁbo@4@()7EխQ-pF'q)HG_`rIr=: fl[@㓔nU-EReT#ZpelJC^;D8yNQL)fc=ƄtqIgˊ tT^9[\z3N*O8b;P O\%UL!GΏOZ0)/%xbn]Onv̺dfE()Q[qhn(P|RD q]#) PjdN7=MHo0V.Νz>q4-|qU@R$ܚ7qYVȮ6imm~OSdcc!X02+Z_pQ9uJ)$)u]>vΝ+~kk}vKHEQ nc1cI[vu'+օ!˩Y;.<:hDDp./#qvf?JD@G%L<"A' K".N"] MR֢m 5,Ok$'{3k/^.6 kɆɍO2V谤ďƵYœ٬2ζ^bxAݣTrųG92,a,C{22ϸoE ƹpCGvSHDpM"%7A?K"ȝ%'n`3C4v),4G(S/g%ESLpmCrpp (#ҿڗsfpKf_u(f/#O3^jKQdv)uU 9֒;E߸ S6_=::6Rԍ6c/c]mp+pBBz<^w_m8CXLOCuR!3I%kZt6H4AoM[2kB,^#~+I׼.B`Z/LAtsD' @e"ܶWxQ>ĥ /:'od-~j.םS 袓N*$Ц4ԐOG$qo\:d%81WF*sL@%.pH2a@q|z=2U:I4nDMZI Hi^ \$LIY M˵')}N\>{)0&*TΔO~5;k2azTdP퓐j/K'M85#s@m8&[w\8IdD4*]هU}=V\nƘuN k <K(1]>[? } \ЭfW*>ڏ@@3M ?><1> g$ierwg@j_S )-ֈFĺ!ow' PyW2l֬*> +[ax-{rS_Ee7Eh9agZ*xL$@H5j$$v=.]Tvw}7JY baC=lnn78{Me{+. {6)˲$YGEz|SA,45c8r%|ߧlh/}mwES1Yv]&A헸/xCP5* mJMV||eb䖂 Wv#H<;!d8X^7"V*RDjv} %rP a\^ 2:/ fe :1EEƚ%R:78;W=G A4F&CmZZ7BQ\)B!/-q.WrZd:"ڦDʖIjqc>wd*zPJ*#^Ϊ~x7H ep6R»+h]ꗠ@ xx0%HY(a,;-{ 5+0kŲS߆,%5h([_x[@< B* p@Q/f.ۑ1ԶYZUR_tx( e ċϲ;xɖ0.<{2qxyì#fNn1*?3ue\1HCZ"Py`tx=#26R (8 ;IRޫ9meB~tYŔ)}+^sj޷{ImUA@FDJ\v}Cw.$d ɠW&(RWJw01eh!5:: st3rdKsvJܱS\b$G}pV"NsE2Z`.e8H|oc{Y w$T4%cKl;' F7]+Dj o21Ns9f[O7`+EM WNtHoxDǏs뭷i64M$ q|m&?) .dYVpWTJQۇ R2btvev$> Azer!R~;v$#Gqex:Pƹ7|@2n8nz%%EQPJ}0 ž 9wrː#ڹmF!s8I# ác~^JǤiZ:h\|QzEMOOsw·2rk50|r`]$ΝqwtCQ|k_cnnn3H1H211HrQ?\`ay{\z||U,C+xz{!(&[4O$XC%98ں\!J0X;ZeGD&ҚTUQF6C/xI0#y?bJFH;K^01짨`iD"g!J=wqyj?qXuM.v}gjF’QAvJNDr9Ȳ[s$*z"*zdM?m I${5ԮQ]ȽiXQV~tU PiT\21%"ҔLEbbz6L,nBI ]@]i`Ft=#N%{@U WMkh,2Ё+l;#W H#HΨnu t@p1HVȓmPx[BBE2U~J-MAՂm{7Œ3/+s0^GŸsH4Upܘ 0'f|ӧrc`7& PAfAwH{ e\4}Ɓ`!+PSI. jȔ'~Ux%5%@e֕(? f@c[=+d671&FhP Juop_Dۥt@k̰,lStAi̸4KrE\|BZ Tjml#) Q  NDJgo/=QZ,jW&@M9:ۮP1>(',_^_e!t5$+]4>#Z0ۨ.n+(crB("` h )ɇ$7eqeQ' aב@{Ox̛YV`dzuq[l=j4>k6<82 =KSc.]L8H"ǼDO'+״+N>'( 7^p]wh4__Wjkc}} +덍 ,E*{?{>3G-POya ILpTq qQ[NAwÇumSvcc< H|`cL8w]$ZǥSNϟF]$-$Bιs8z1FcH!p:9<'MS۷o޳g{$z}:8GJ2:qŋ9poz]}r IDATӛXYYazzzlVբR4v%sǾRp0EeEܜfɘɘ@MdLdL ɶ4*54g֊6oDͨ- )͙\{!}ԸxzG$i:d"BhM*k"z%ئtARМmL}=l+ĖF6b]#[ɮNE"88Ğ>uƔc(j4bK{5=& x#$O#]$OdL3pU线#NPdcH|ڮy($ gK6iD Ow8ۛCt5 K == I:3|IQTh6͗W88;#އv'8&3OARn4MK0Ξ=ˡCʾq9=q!q m^J)J'~ FNĿYdv 8.<C"$sssc?7$u&.ͻl޽,_]:3==MۥZp9H1q|#!˲n!ի%9??x}_`7>>(I0( {)& ͫ\o/_H4o8Y^At <AP(  TѣZfmp7uEA)X.1na} 415\0%YR~RGȌ! ϜpF"R.9mC U( s~;Gȉ7S6~zVq٢vG$W5.v5КW+5h։iS0t R1>+T7g5O}k?ُF EJ)iT:2QV&*M t ~8#  i g4Ahh0OAO%N6 Dt]p1 gua'N?2ZtgUD҅+k̬YGKn3[dT\qzngd*o/HAe؀; SNGADrLsgFX oIm,I.̣~Ӟ`& 4ELnx\y6`eվl)z'7^ZV"x&g,öԐ?p2'"+㢪tIMdD_V*= }Q'Џ_!gœI_z :zfN~/{|ΐn'LĖ l9ć` {Τd8Q`xn24{߭/ x3Io>|H;Yxc]k2rMwjhzo9$pb܅_x"+ >|Plw(6I ɌݷF!39I1$ݹGw; Ir}~Ρdz?#IRS.Ц0eBhM y7xJ|7~7~~v!t:4M\r%> R/⏃$# 2箭!"(*a8fvv(x|ĉ7$Zk4-֚YRuj=Cjmć#n(뮻^ .Js=|C*;.]*4 DFo7ʕ+qXEe7<qw.;F1o{8}4B.]$q̔qrBZSSSy^vvߞ8dzz@h4jmnnYzZN38&c2&dw11Gߕ}_w(?;F!iѠI*bZ! zaVSDAF/JzaF.B3goo>{y bSEr9>(M$,B "&QB(DtQ1ej Z7EJUvmEMt.'Y%ð=ۋF*\*#> Ha1}[lFa۲ m'g#b B}^h^qSJGE:lArGcpy vNCh~9~y }wVϟvvHG2\iz0_}qc 8sb[D_goLf17G _{!QꂢdY*7e[` Y؜E[rZ5⩂|Zg4a1Ă}.Ws>pdiZLS t y%ɋZ&Y_gFn$AJYR"L9R+.~Ht_ߣm,X@""EPӒb6˞|hF>P$!ˏy^)Lq7vC/P SrzWs[лnzG̯,LZ B=$/Uez_0PH4|#1 Ko:) ZM~Um_C>o1>͛mVhV29z)dw !&!&F}v?q&~y{WQ>['OrQN>=t6>it:RuСC\pNR JthrZY333\ ~g EwuO>dy)677Y]]-1!^-znt sByET**J F ȑ#9s* ^w#C`OTw7;9_|{)> ’AR I?t80 F#4=3$I6>$ٻw/׮]#2bX>|~?s4/ GTաvwf$IvZ閚ɘ $ɘɘ $yVS9w} gr{kOVrZ & פ$4e @RoS67"AżP]"2#i:3DGrm$f3ME.1ϿAl Njȟ\`&"$IT}S$CYDt6A&"e*`M*bv:ٷ+( )J#7q3-=dΔL[JtOmP2? ,3:H@îtgkmՎM燨@J!Z&DyN^HjWr4JK2O@NȞȶBL Di Ll[F<-\U#+UӋ]Fj{B+^1v⮉bfb6?ޜ{H~~4MCf{Nsqr>1)V,nZSVY__gkk )%SSS%;~xG%ܙkqpݜ7r~xOkT+&k,ۦM9S=4svsp)F^\G nMF[T!CɘbS[%Xzo?֠Z}VAޔLΑ MͼB"ʻԄϏEDs FOEGmF^Pc=lԺQ&^g;u@B-t$PS|dg q_5_ ʦ]=C4՘qa}<:`;)"h{H@pKL>A @jJͅIAׁ͑\J*$slj˾@햗%(6ˊR0B]Pw Z@џ_'[džpgG@u_loO@{ iud(Ke&MKC鞏\YY+;(}Wg-Xg@' Np ^[QdVH K_uLa\]CHq1޲'x *5dqmc,0kr 5gBxc )qԀٯemzt+g(7o?zt^Nmψ+O!rb#Rx`gp@W-=_$5<$Bd#AHJUES]%i)2QȀ"ȃ"mP D9K}u$1(ReH!#u)~H⯰sUB4mIET4#V׹(@Qj8%)+QJ㶴b;q"',6b+SgIyBFuUƈJ!_x ]voiݾhqT!wBN/'s!%rcHx71$x 81$ߗzpł^fO$9rL xSC$*:ID$#o&)35nLOO?aH7OO1;;;V9GKGynٳg9r{! vfe;۽PQJqy8p8 ($t:q/;Vv)' IDAT9x`)Ha"N{q :/K?yrU0/~1o|?>l),˨T*,X[[=21[+_{'8t32:{r_wsEmy>wPm'8&S|H;no. `ANɘ $ɘɘ $yNwv>Csah49=^O Bx٢I4;|k.rQx||+Nɥz8+b!9j_SL(\$4 ¼jfè* b zK#+56;1b_,Ћ  y NXE|#g&.2#$oHJBM ӲM_i&6OVR!&.R*y" @C. UVh׈vwWˆ`S=5'3gcE=b G*=@.sen-VBHq\HD""@ *kz1Vt8}OP {AbY+,JO$Is`:ʷtn>9m$.3 f@<6 +K+u!iAx?fPn|cp(;0`wS7 $8tοaD@@> k g;-s!̺19[z.Un q ?U e;Šԕkɗvu OR$g̺\Nj;a+OCc o'`%7čF8\Ѡ 5yP>$. #"2z%p[(ENK-сh)PRsD8Gʖ6HJ)mBJGV%$F!u)6 Zʩ> (T`n&ggSQB0  eNd:&MbìIjdWc',$RP' 3PE0mp]^ѱ:ը=$)"6: #R8x"!O5XR{`d? ~>F#ґu0I=~k4ngn?F{W}7$IpFXoA\xG82}?ַ~FHD׿ɐdssF);]b'ܶm6QqX\\,vs4-;9.NrPD7B0???(ɲniI*H"cP7@ZVQv s:6G(PJ.»?N$H)'nx.l6]_Vo HH֥?nϦH,wpKvٳg9}t A}2$r{Q@t >(qЁc6 Jm []]c2&cI&{711$Y<Հ=|E=|jOsS5"{sHa@IOW쩠=-@:"'=3T>QG#<0C&zH7޴1]6) (!6(N(@m@UL5E"`Sw[` A)n3BۂpW.@h# Jg+@&ʀu%(6]0e#7%8+Gc0stb۲dSB8m:yޔZܬ#K-h<cן\y gdgn {{*kEL;-Kf3xm=b y]̬W"ϭ+M1XǐɋLLϾ6~<2$&⋧,|g~=X0`yʺJm7O"nK * 2 IudĤeayLJ.}*Âh%tDRR¨z } "2bR*Jq>ݏ D1$mF)i:Tz0(9wq[&b ЅHROP"Z [fpebć$!99!"7Q[m;myq[Iy#PǠݕ(^ W_ڃ{Ɂ>N\lQh2dE2eap>A]cѸ-5Z $E$$9:;'Nn/S}ED_=fy| Q,KR;3SN$'y;Qa;ĸ[[[[lmm h8RZl6Y__gii )exgjj,ڢRqpj%6͕veJj"I ^N0[nT*Cׯ_/!DZ*w& R$T*|CzVza $IFf[9Lc0tApVXv]VWW p^Sda$q6Fe\:9ghܹs>|R7[ʞ?|-}5ܔ׳6՜2 O<{&U_P;`bJ \`jUq PhEz($$ JP>24W6TəXi*ZnWӱy#m}t~*$OoPt[ $ɛ4a WT  \C}R +V"ڳCAxC#1q&ZSQ}#<TMĔ c3t!oAi¹D,ho ztZh]r'KjP|]B#Rli i om_/D t͂_.l1^Mިk3h5 iB?,fev4LMj9!0,ڬ)jOb`c[ ĘLH{8%n^ɪ9fЌk$9;YK-4N ;V^N%9!<&'"ψJ@Gr"&Ĥ̈(t0=  dNMrfψJNjGQ5#2PpG0vwfFQITyAKoߕTBs8@ߖk{, "2k!b#%~s.tsr8DJG:%Ю/*2k[dAsáFs:2| [>Lw3 IƁ yl>v,4nU[f+ ǏQ)2<<ԧ>ŝwII̙/9G#_Uv'> 9~zdYF(}P2;;[).\`zzׯk׮rYNt'St:\¾}e ?o4Ίح?0 @nx_ aR 1wo0Pm/Y‰)arz a%\Ɠ0u-(ـ z>!gi@rо^*xY Vгr. f ACM[μ bVmZr%5Yne5:&L Q‘OIji%o\i }QA^{F_ r-sz2"#qE DEl* ˡxG6ChLL3\σ$g|QuBK;8 2玡@ /tt[Hk"3<0pq{wl3A}-]'IMwC h7Opܔ1vf#-F>N⺴[ԘeaPtO#/1HFrxxN &$;u(w}7nr4Mx帳MO_!(E|(8>$|weׇ% (I4΁qeaH%!O`7M:Q]7nvy^(.\Q> xb<חޫn;x'"dLLn2&c2&cIF{ $aX,.n_jlQoe7>O6ioH"_U zm:̀J wz?s^* L9O읎/UNu9qtA6FwkF?'Z:M(A{$Ea(@U*@ 76stȨ &`&b;[pH~] TCbBO)f4)sdȅ ȃ AߜZ!Q'iShw`)jhm䝈.jD݂l&d^#nԯwkSg-8gJUh22C6j*yĝAMP" [m,7yK*3NR{Ұ0h厩;!ʰ3/f|N1 Fc-#3=}!o;{wS!{ Ԛ?+=CV+{98햠t<cw9==MV+iʒm'tWUYDNb@y[ނ}cCZnZ\\5y Ng[WEllll$~TsM\@ֺ$;$}Cͳ];.ߡU:;F$>Oǁwz \0 H$_?c݃e:Z{}yב\aɲ 1`$!&q11g0\JǕ O Bl-`˖%Ktҽ{}c~?ZW}PЫjW?Nkzg_/<ׯK.{oi5`RjmammIGןǹ;8Sm\x ܾvH۩[%Om7F$q3됰̨>3 ;=Y++bhhA愵VCEx #t+!<&XciҺEh| >FxS݂,ۉ ֒2YǬ6~ɀ ބc?lʂ9kEd$$lXkPAZqR =MA56ra <2 1/46-sZҷ4ֺ(v31ܚ$ L~ _W:DEjҒ*ϩrF i`Յ%Z T` a($:6Y^I 2ąVLpaȤ]DB/.yK*C p\گ5ਸ^ۗR. /V‚(T1>xށD5chƤP '#C!iaYŢ$MwGD{nFW ʌY"/S%~wd> 1l_jHBE- S VWJQyNVtwL$nONUUx%ٟ⃤c>]/o]?a||RZ@Z_ T eU,,ʾ-Xrs͉ת&EY#V!c=෽m4MzYEF8zEӧ׾V лlnn fwx^;u<wA=77.MkM/7~mu(YXX$ҧb IDAT 2V}ؘqnmz6o6$󽛷yyCv#XEtX.~k_Bj6&,?=H$չH(֖etU9fuX6Jf^@!n5)H2 ʿ+)T˜ ȟ `.sEbCu`M"q11wi ;2pRE*%MeM!~=o,2.{e`.ksQV8]&Ddי(R+BrSɃ(MVL@ϨRnn ɞ2$^r{[z 4g#9{GT렆vr7!ػrL52 B{4}HmVYm dy<@Ҭyc߲am^|qqwE k,_r{|;rxey] ϟ?O|N+L' q:^^'?o}IӴh4e%kxOlnnrUkƄ~rÉ-~(|Vcoo,˸ pq\/r 72H}ѹ( .~_D2!}k'Iu~Zgo RALHRE*x)'~B7˗/}9uFcqv#?s?7:mdmmyng*.꣟7=Fg.ѹ(Phb>[kː$4uNIQ3D{psf*W$16i 6y%a 6bOkz* GՇַwxkG9wiwxUwq+tK%գyv@TN#CKHQPhѕpFB)łU.jˊYAFD | KM6;j) OC 693܏̼TN+0fwX+ S F44N@! iDMnHφ[myzX <)10CybVhPM0:<0),G,I8o|a9EL 4, ?쒁՟ fº~jzVy= p^ ]-mJׯkq %xx,V//C6MM?~ s.ȬVς9nfǾfsCV̱ 6`ca钁?@A*l@`gQKaْgevLF O߰sahHX4!e3s xbrkXb-&o%=- X%`>XW#Xju&+ J@÷۪lP$@gHtH $ DA CJJ|d @77xDAј`q6> "4Ǡ!&(E#@Fg X#=leFLDf*Q7#ep/'FisMt_A1YY0-U"+cbb"f@]s}*H'лmtZlUύ19Qک<HgUە+W&lYryyCۼۼ%';~ѱ$oھ?v˼IYٝ'O rul ̬{_[($zA)0Xq=#|:*: 9GC/ WᇠȍZpO5m:#rq.p fG`vDAx5G#TnjT>䭐[4wtbn9s\iÔ^ۂ"2ȗ5o>0 4G3~lBM.5Fij D\ը#v l%@hATZlG@ ,,=A+{ϝ[J"&Pk4BHdi]ZzhB0 BAXH\ }cj]Ă'-%-zs8g+N^ R j^ ;דĀqxHA 'VOkjcxp4Ô6aq޻٬صYv[0zgք\+ҥK1 Ȳ'OniS!ɱc~8 aF=:oy[x饗'<`8!xd礔FR z o )( H)KӔM #шn p8r2!ς$Dmp* >v7C2 r|;1wj6 \ˍVY@  ^UL!Uq=4 p8O@Vjn) hT;P,_UA{鐦)w~xwԩScVsaRF#wя~t.vۼ!ɼۼۼv6X^+]`3rK_+:E-8Rr/nMXdCHdI(Dkǚ, ьt'FBy$[EniN&@d#g";XHiPM# 8x 䢀LaALBP Pq+$c>x#_l(3sil5I#Ftj ,K&9" 3(_(rC!rcDuHd@|n ʊ^FӀ8o J[`PRY[@ӷ~ k[MZ1Ato(xξASDbCNo-,"/OذVP@S oپ}DasY:g`x ɕ)-yB'6!=lj{ \V$<K-[c<І'^,WYj1,7᷏{$R0 {uDnj'Q@q3h>VP3[ETLeXU}G7c[^,]|kIjǕ=3a󗀯Eښu[nֶ=Mz(LiwWT`g\ljl5Iy cssQV:@{S)>a5 *QHedTjғ-M(rbJ"Q`BW(>C>nkbBRhJFDDkSX$&$0%MR)Be,[R:)SA'pd "F8p"DiY.%!2d`p(*"%dAͽE]7A"Ç:!$iZpέ+[uEו>?n?|0-Ezx݆+:*ԙCbL>c=v`Y6ƒu|LUl?qAh4u{݄]kz+f׿F#4-3>,| O>$RJ92!,;!׉NvקAHh4JVMIX]]eii%v 29s RZd}I#:5ae~%!4b{ R* j/_o ځ )Ϗx HxNNr%mk"j=A.)vFvo*4QYD'EoEg5,]#Vk#Z=cϠ8)L:4&3I`V 0Ba݈@4E8K J۪]k iE6aח@ FNDZ '$u-pp g* Ċ @t7}nqھ݆K{rTȎ֌W t-Tp`+LGl3]f@x茶ȇv'_ ' 4 ~S`i ͈Z9O'b[A*hաl|_#YXEкi VAfƲelC6eǴfMBcUs:w]0ayɸɭS6}TFb_SQq$ƢU.{Ey.K-'9xlAv~^~VD8[$гHҤ.*/Ie(!9g'/Cݠ]H)1` :\u@z Q"aB)5b`!S*\Ȭl [EB‘@ ZZ?EyO눾=B 4ͭ]J_TK峲' &&+:R{{#j}uf5_$ҧiL*xJ\|ʾ6C*$)&*8PD/e޵зiǮ kfZ5^O@W ŭ#-IRG>_ٲ; 2-;;; rF9u~lt9YZZ*1Mn?~|bjww#~@JIEpa竂rpӥ=ו+WRr qL,!*,|jE4`r-@p8YA_4LUϼ>k[>ty47Ggu-PC)<i,/oiUETJֺU }V9 yCۼۼ! n<6Sej)65j.RW^oluX$@, Ĕ,>}Yh x;h4g4 9#B$I4- )-^vGۚƖI\hR-xcЊZrgH8@Y VA\wJaAkg9ԷFZP%5e6BeXMc'v%Ō`M!:%@}ahDjl4PQp%dXP1ZM[ hx:p8`TR{ ʪMk44U2ZذtlU&gD&4f}ؼF[M`CĂ<6KV0bTv:Eӊ{K5n- 4U6b ;\ S,$rku"3`)'B22h/R>X; ^_CxSaEv{hĬc&焗L~r.< K,hd}ޖrV98( Bh$u)b a+!ZX֢\(dD- \;14cNh"X2j [v)<1=bo %9M*o$!I YUOX`]wX0Ofj۞V q;g0iوR1uÇA!ת(^$g~o+rCg&ջ @۝$$IB*Z $MSz).^p8diiDvi2 Z-0daxv^p=H,--(ؘvreeNw|w K/t҄ vyU~`C_UU2 lnna($q߷p!o\ LNz\/K9NqϴN~U!4S0a'6 ~h@DPxiiiU?oimamm޼W^,>w<}l>ztDqF?f\  9~.^B5l3ɓs|#.oк2 rP5J%s:=ZD2-x!ME񂔈˒<漅%G$9Wu%kFC*ـ͕ݒ""GHZti^Q䚢`^^F%P 9<A趱b OXkFm%q@t\f+5@II N#)cUU81Agri 7h NcMq-BkLxk7K^* nxDj9} Ć x IDAT봵N>cTg\9!U&䧍Ys2] K ~LEa6=3'jF_Z!HP-h}xh.lËp2Њ`K x]2_" Mۀ<`YJhՠFk/B]ZP4Js :i IDf).-8@j! r%Hk9gEۼsoB|ż/>Ndl3@&nYR7bzb&Le`m-yԮG@ww;HWPA FQgHL(DZhS-j$EuҰF@*!B!BhdAւL{LD|G~p~45CQgT3(H|`EDY.~tI%@Й(FDD j)d(8Oxk9#x^92WB!r(2!"$>~ML ʯP? KA WI1i$*!^;ށ' C9 -vdeX;!^ D쯲|9SSΕkLG|+flCW6ks퍣=uӿ@x'>oIT҅A/Mm' s2`49w,..l6iZ,..@-eY9pKߧlBar뭷r̙}?pm\F._6aiŴ UݽƉ@_0 lmmMxW-O|Y0 `, iۮZoo\xͪ$ωQ!,{u)% %su.|0E˗}$J)뮻aHɓxvMnϹ7S4o6osH2߻yy7 ߫=t {px|l‹6"d;kFfu99|"eTӘ.z98¶-R ~*ȖƳeFI!/ ɮ'gb)QӚaaR@nvRU % ISBXa`2SH@4}& z uZ;}{4 ق ?)R"P{ vGRl, #v aZ/;FDwcC4"2L&ag&BrgB=mso?zBM#U*pd8a!Hb~K ^Z4,0+l:pXL%+!ȁ-Pρ{, e 3NiMi] *g/L@چԶ,tm؅cGڦc,_;s~P({c [xh?v_[Q2BY4놂P~bZšw nR j#63e_B6kQj_TtMn wYs`r뫰|:._!60(VBcsQ H3~+I@XHR#A]9@!8(\`IDQ4A1j֠;٫M@S3"Fa,PR"&R JX՞VJ(v߼q|tI:Dqns  .eN!RKS$'*e`=.c zȆ(J}8k,-@}߇T~-[7Iׇ*%ԀqŃ_1c3Q>ߧi%voazgۼcq}xg?^MUj $/_^$7N>KL{00c[t9-jhT=_ǽqN7,˥4 o?0^gRiqKarQ4e4sh4&3 vG"`gg=3qe$@,@R̈́EkmEQ8@R(7 "f*Ns|3d_Us#z0zZIeY \4-w^FH.4%MSvvvh6k=g>}chss-("r 9Q=󲼼<#ǁw~~o.rۼ!ɼۼۼ!ɵۧ_Cݐ{}>z9G/sބ??;uY@//:]vYV^fZi.65S'8^)Tm'!{~D.h&==!\ y.v"vqVe0ݗ!a^{OLB{?L€K]L?!dB/iz^f\炔C(5A=Zꀄ263V!T`Ik~ BPh]mY^ؙ'_%UV|2 DW&v;R W&DS4͝),UIeA.XR7u;=Jp}xЊ>#f;ZXF QV,m͑(r ]A=m2ҊKzd" bt1j,Ԣ98n'_!6TU o; 0˰܁3 p}鏛m,1pEuh @J^&ROa ـX˴f % s>X:؄ dž MQ-3y!y޺ x3ւ˂<ħLɲ6-cǁ9,YPRNlʣ~6.[۰77I<$fH^Hr!BJ8](deHTq%I@1Q=//9 (]€B\c"5BMXz'V5jwD*/~h>Vs=4 `?5}[҈\P|Aynj^J4r2v]W3V`i8cVBH\vKcwWZ{>WÑA18?C HydLoZ/@YO"z ؘ0o6 L[f ݁=~A]g>}`7 kwP%G6%Koo$ ɵmm2d.c]ۮ\D4Q 2½vsd@S ٘"cW*B{ o~]?`s:O)t7 ?1i Ί?}T$)<( վӫc\t}nR >x(_5@ɬ`tg[8 =8REӻm?~km}7nv&k3B,hć>!N8p8(HVMTnL/vkJtq]q*˗/~[o6Onv C{9"Ɂ!Diqa> 2T܅iZe \AhfWZf1z<%vtfk݈{wΪj0P& vˍW]2 ̪Fr!VZVVTɴc?c.??Mgh`Z*XP!~!ɼk:3\~럷y9$k|7K$Éu 2ۯs/M5w&pCV)J:Cus0gG}%,, XN7ZI8kYl18,lD|fDf;WB1՛䃐ǗT,^$d!_1H^_3iNA0Ƚ6PPdkRhݢ n)z},ȑCk FBBA8T#\84ǢAu+ˆcju~ "8=1"`bp₁} 4u .v~ql_ӱpzRf_a*Y4&]zB lLIy4MkneѲHo8EX"؅i,"yIZ`=\t%vYR)6|Ix!X:l`翄'o0ˊKa1(c V'l㜁#|&֦+bx5v|IP+Flxjf\HrїkC2_x'&]贍%|$KЁ7`p)WPܞ}$ԈDJ 0pD>VOMI3;3'3I\~HLBL- D#Ln,wD<2QϬ&l?mdAZTOt0H~>rD 0)K.^=jJv_9A@*Dw C0⇯GZ]4OkȻ*d\]ß?>C/ ov[x]ݖV`C݇$ P2BgZ{xxR IW=*}V$yexq v }q ʍU Oƴ ݆3QZI__]5(g!IfڱcjE_y;YζZ̚[م v(^-naaa_&/H;H3pwr~￿ )> J6IuQMӴ̓qkcZoU}ݬgT[CÇ Ki4~V,0W A0a5 \k;FAA@6[~^H$VpYnܺ}Ð~O$4<~g~XrŲʇs>>-?ۼۼۼ|m,㮫)lYXɽaPpryՓ}uȮlI6Ko5%AIֈ_Mi.[>w@i@Ε h\i!u!].>~х'ap4,mxJMա6H[>)afk+ 'e莅Nrﭛ w͘Vj쨴2BP.ꎎ8Њ:JEm?'2nmۗ%{@0/߂= s7 #W3S aܬk = (@6dx@N =bl̀2A;ų'6%0.n{OcprZfby'1|, 츨C|6jA `T~ƪtX0)HQR(=ȕ&DW+Is[X?nm*$M+88R?W-f , skӯ] pw {B$E !yuRRD"3Ć:76Q ?-Є +$$qDEHBlۉHdL_/͇.FȬOE*Y(Hv[.C~w[IR Hq%I-̲ 2QYVcZ@r{ [ m EMUfȀ$θM}!zâ$~J2Y/{'WSAzPB0^+0({W-翿'bej&4k.=c|8C?~&jZ5IKi[k䍱+6UDV7~۲)ۣו.\pѣG'l:(xYXX`0g!RU]JIe{)'K)y駹YZZ<<\? LXq۪ ~?6aVVi9+^60dkk$I CM}̀{eپ`kUcU"Uɵ@ɴH)-v$4.Jry><}UW(J I1w: ð+r;U :7vu>Pqs5~G?:?o6$7Z>g@#?mm&^5ݎźyDmE~`Gt4rjYJfq6FB f9ߣd0jct5\CMIj{6l|!ܔπQF5SŘ.*9bXЏkR#e_ X  *rLGlZW(ǵW]P|V9) ;3_&\1. YBYSVM(-TaB&TiV_UdlVY1,˔Y&2MH"и"/uO޴pa4;XQLl˶Yf9rzNuFQ^;vVVVk뾗ʁqǃ#ZuT{,.3 *U>2ȳiiBiii{? SGv,{l#p~OX.'o851?ǃ/˩1)G!/sPhsDh|-Ѡ#PB@'%7ku2J >x=!^eО"VWR'낗kAKgJ辖̈mU2EKF0ЎuhVRzd;d9W t`^,w !ڡ7ٖo盌W*Պu;&Ǫ")#))uISƊEo"AdaE7MV/} frYmx^p޸bFpB9^!ۭ`&v{F2 ikEN r|ijJO]pk7`B܌w ߒ󟋜2eN"2~#~-s}O[!,b|D;&=1qCzh|ɼގP[I9 `Kp[`Nt  9K30&.x7}yl!)<)Sݘ`"g$SjYBZ \Є uZ|oP+CRkOJiR^]P(ZPsr!>)9W`?/K0%+Gˢz,:֓9 Cqc@ m}Wn k1Y $ଙt8X?crFm}=P9d#I_[찷6>#VY5%hSCݠu7/Wp;();I@<679$ RvرKcw[}7nqUBG?Jg0|fɧ>osk۲YDsĉ -B z(X__ll69tH:D창]REz0 q-e.{pؙFnf8_n+ Il az?7F9=n{h4cݖ-TvT$UUkE1 p׋~^_ze\'mי/#8~xHVWW >a2??Oݾn_X ,D '[R R;v 8yޮؼ!Yp:NT䘶iBiiiBoWa^ݔ-'s[o+BseW6 Gpmy8|5|zةxd/i@+K<.ܱ5d`IM^5oleIL;͔x]d@ΌGCmua 풑yD/5)'zHTs1G%³e"b#H+)8KT<h[RH#=+eDJ@3͊qu) @0!:f[arHDmU6>:d"쒖 #j uQ-BsGg;;\1e2@Jo:w5ǜ>?dLj6]cWf{1>n94"o=ޭ] =+<<0g@IRb+J6aVɱF>'7%#G Z< x߅Yڷe#<.-$<_IYTIƉ=1,YF͙dGb-Bpl||6  ZHo]h]GO$vly2=Ue0 aBfyD%@|m1q N Qu+i?Ga6RL:6l}R^ Bu =hhܕЁgr9VDep:@V݁ ]rcueaU.7}$MS^{59^(ņkUJʖCr{Fh4b0I٤^j?MξWJwWh&-W\ne9BEt]>UI^{ӧOl6w?Rcn*@RvA+%ܾޱu G cq֖X-qC֊t:(r\ₒ#mڵkloo6Np,q\8'& (tkkkz=ffflJ-lHxXgϥ*e8reͺF$˲"HkMڕc}ڦmڦMm6-5m6$oB{W쓻ry(_yQ-x2s©?`f9أu yy&`L˳Sk7֨ϱٯ%A$=aPH'DwnJB6s|fll2 f'&/^وfk^X CJ }1|e2&>K)nVԾ%#`!Xia#l 4yìHj&FA"5Ԛ‰n#YAƄ]sD,R! ) x6SmSfa@Dm1}Nn!.S8AVW,B}LlKi !DKf&P 5XDMqx`3gs?ZNVR桓Ro憜g wKN Kfߚjx'DӸ @/M1Fԇ#8&rqydOOVdH& MsijYB KQ&ʆԳQ6,CSKqxcH{ \I& 1$rjI$ԶEBեzLlqx3d[#]5b\z`*ZGJU A08[U]@G?u1YNqϖ v@u5rPD4؋30Yo?'Ps @2|%Hؽa1t;,4q[G u%\`F[gƅ*j.wl6{'=@}} _ҥKU… t]R{CUi+!t00 NSnCR8p`}jߏ=zt*rL۴M!ɴM۴M۴M!*yepCg`ck <}§RCILs,nk\ xtm&FZOцC5tj2o Bn(Ȍ)$ك-i,Q&H҄z6Kr4K-IJ>IŅ",1^i䑨F%N- ELNp !7]sksD\'P e:.nZB&s,ЫbLr sgT:$ɸZxݥ(A!RݲQ.|&K~sqmȨ쪕`E9]T .w~ם>4f2O3?,m]&w,\#VTuvgffvDe1}zh",}sssBb^0]ʹvAtX^^ҥKիWpDQDV+2z^pqi|]VE J2Wʀ HU.~|l6 6=bRۥK<]f*qmWnk~)lll)ǎ#".\H-,,.]b}}x4]-i()ME{p8),pL8Ix|vv^7`v[GoK.q=|GiiBwm$i)$}8a~x~2 NJ@No~5?^AdVB*jc?!0ǿQ?bSa@w&J\І*92%rct~Da׻D1^ÈFJ`&B`,n5o3=Fh҈(L) 5rĚP2S1y )e-&t]SfW(2Lx8G!@(KPi6snS߾vGWuA [ P;0%>-V%̞Kr-ӗʔ&Kp6W:)!^ !)M~]ժAySLJKJP6[҅qOr0QcxoV7A1תQwo~4& a?s x5hcm o@ܕXi 9tfv-j3N@)ԍ9<)eq0yRB/7IkZmdJzE}0JHGw<gkሧ|M IPw;d$q qS'{fO(CkEx"Ͻ"@JB֪P97tFBS I%I)S~F{r=E{pd6ר\ KR*:u:J\v~#|mQJ~$)+<ݹ]?eA <*5րkd8HVjS\$wƊ IF%HRcE2cӖJ usmy%@cNJ\&΅$hBEkMp˜>}z[J0 E I.333,//(=TpD[UZhėeZv4M9y$nNC <iZd,XX 8>OJ@pîW IԍQQ#vg-2Sŋ P233sCz}FD%7OmaͿ!ql6iZlmm1??_dXr% zbAGn cq:HeQfffqqȑ]/s^ZgڦmڦdڦmڦmھfkCl˷We=C/!EVO`bSBΐ(9Y#! ܆VX aAٍ-5‘f *o }Kf33:g34iV@}m$e b:uh@eԻΉ k ?k:3:L iIEf|G%MOx&?n~T"yb#)C3AuTw?/&jq"WDo "_5y% )RVZ+4D3#6yV9fiT arT_6\7Œ[t_5V\:lE8BX2>o幄|;4£W5_.m|qH/A˶x/׻&aAnJC+3,Q ,_V{ чV[wjs}Ks ucf2n8{nCaJ#@8{Ŗz! aAJsn[n+F4fl|'OI|BMn\{Dz>WADd1(x#u<||κnބ W.SnWX˒rf];Ψ"]${%q%moN;LDžs,m:疰dR9Y Wdt@@FKaNiB j5n68xbBȿ Ld8j5.^X$Izu$IBt: J9]fssNÓO>u^B Jl3H${A7 C:zDiF}]wľ~'~??/ p8jh6E+[`MRW;,0+?5ocb[vw{ j׮]+˾,h(rX)HnQbLJ}, q%ieeeO,}>8~r3M۴ML۴M۴M?4HRKxNg#}",]#r.?/y<)&h^[gu7oyucv9! sfכz}/<s;i? dx r3dǤ$@$, "Nz&y#&f{F6E`S)54zGE0M*rlxB #t2"cn\ ŬB·B@)&-un| H1YVRܗ:ʙݪZÀ`,\ZDžyX(2ƳsPrf xp EǺfȍ:Q!hfL7B)kdXIy1)DY5d]G;y)[Ys,0 ax ګSʔe\ `q:Gp(k]68p~O2Hن7vKCxb_!Cs܁_wMTdە],Cxta!}Q$q~돊k$h's1XqJm`*}E±8Y^X2$ワysme DOxڔN uL=M8I3;}[=f $I4Hi# M܀ 6FLHL(`VyZdDɐF21P%05лޡ#֜[d51!g-eKlYB ߛϊ&3Ht]vw q3ImWaDv7 7b.߹{1-m5"qHolWR[%HȬ h\Rupw]bnw!aJΘ7|8sJynw˨tnKlBbI kl|(@{{|Cjq癟EVԄ?#;V_'Ypԩ]]>'Npy.\w94M+Wp SN!nZVVeʢ Wz zԿVt.[FcB/[GrΟ?Os=y 鋋qڷpܿmRVU*h\ w%eqs/}vMfnnXfggQJh48zhC RUl/@Wk9e\D]ȺH۾pAsUsKM۴M!ɴM۴M۴M!$זX(BInc\V. mϽFqJ\u[D7B2:pZ=mҼwo@W" x d_mF ,%zԁ ]?(K)dF ~dF\ik2#YdD# ـׯExSIYW l DҞ^"(y*Ǭy۰y@S5-yhajNG02}}W pLψzN0}l_6Zy;!0#tO*1rnꂈYY, +4b|E7XB&.k|g`rMbGP4)ȡ[kbaX݆>6DXA} -xFÙ!{r^YX:k̙saG NrO᎔ 4۔Y zI}X Zн$ha 9w?|ya^dLjwnBݜ7ت[nYűYgB9H}}<.}t@ B&W1heguG(/) \fi}`iy5`(9SP;@VjY 8 g\-CUY".$1@-6߻ u2ۀv|\`tkG&ok׮q 6c~~__aqq$Nx\kvpC{կ~n;!ֺ˹s瘝e}}SNQi6hg+~3mo{[>O3 HӴbw~{ln,uQ z=vvvmq}Ψz~Ve\FYDee}|3EIbvvX\ȱ^r_1cS?< DuA|8qzN۴M|Ϸiii$Hm 7e@fsIl^s lK>!l6Fl/>Df_ggiZ3!,17 #4Q*Pd,[U `0,oPާ uX 嚸ܬ{,K4a8&k]@ M%c`@CFCH I %h4G~?+H+%lk @)~$ZW@r J]=-UܒJ~[/f8fݠn퀐=\S0Ia񉠀$nI8ĉECmnV!ƻA.,{.Y]]-vz q /Zk>Os̮xg, Fܙ뮣 ֮nCmRjVT/H .dnz^u/ghyP].$I~O{w_/WZ-}eǨ JʯQXr 옃277W2E߸,h6t:N>/LӡnJ^f p)а83qӊ_򳰴$e,iE )p3$̹-F4Eij !Enng`ei7rVPB- |i,QZ , 5錈G%AfM|qfTf40 h#uA2N#X-/I_(SB9^tF ҾW씙n},u#8r.+ܚY̪=:'@|z9<7 xO*0:`g3Ra&^3ܚ-B87D!ǧ!xaJ!XS^b@Ţx %8ׅ"4<X'#g>y0Qi`1Nν cbn)+ta3^꒧bg/_m.WGC9Dyy@d[a f,.pv]`R ǀ8$cS 8dm&;£ g},fw9ə)>#|wH2GgN+cq鱀=!)W9F\[znEV{/+]:2r(U$%e>Җ0cdžL&*.0}B;uƟItX#?;sssP|1{,ȯ1 &$UKVȑ#|gss3gt& :sss޾+DQ,;;;<**䂒~_j É > w2׍䑔A^b~嵪ɺ5f*R.]?y~p؏XAPrB) IlS!pXbK]oT*eoĺH,lsaAj5nV<#I8`{59 پI(hZU={h4*j\[lff]iiB6uL۴MUsᯚU֖< ,ًRnkn)K[Qei#Mĩ#"Dtd!zRGV sHᬔ!jCXK 08/[|lҺpmOZ;'q!7P/4kWn;M-?|-y&Nk5 8Đ`\M@ N@n-:=Ex|QfxIIMj&eaʺ(#0PZTFla\W՗Ctd{$%x#!erÊ<=)D&\nbֲM/D6S&#PFUr&ω-'74ȝMoEUPW_xW D0@("Z<0 `Xx?k~O92%aMxpy=; 珠`i }y?/CrS Hͫp2!,2~6)_3l8ZRi'+y@ޣ!, cDA'&p }nP,R+xr͛R7i m&2IL@`$)ADI&Ͱ($Y._ir<4,@y>%|3zJPK ?|#aƩǐ?ʀ*' w=rP{<9UeƫJ(@hdґ AHW]Tm' Fε,y/0YR|Nr[eR>G}r %a{bjTJpزIHRk/wؕHW!9 $>х{֯ꯖ D8tP13^"I:D$\z`O?4'O[nSkkkhn*@.y}"<$шnNS8AmWPq̎{AU. wY IDAT$Ih4E?%BpzUʕ+|k_xG`y^ q$v~8~"m-" `bcWE*C7a.(qAyo]܀e񴺺bm>[[[9#{Dz@QJZp UJ<7mڦdڦmڦmھ BE )7a餈6ca;!zq1'0ͶwDI" 6UtsRXIh; ڗ,:MwQ]L_ [Mp Є3>䷀WL#zT6}Eh1x'^ۻVcEqΆ6mYrosbh QYEr}oʍhdȍA+e˔q8ВTѤ(0\lɭ\D\KL~8 wMLy7=4׸cV W&zh ^y}1=mU5˸׬-Dt˔6 N֯;gN5KΦ.x!Bw .vYo5}3OB'YA|L/ y˶4 ~AJm=W_G^3`iSq/ |"hÙ">._8 c8ВB =XhX 3%0T*tNRw2F5X SGO_9mx,b]$f;I\K&Ib$8IfO2TB|bxA>vBPTvLIFI<){ySh_GL.Z&&9'`@rY_qx/Jϔ~{g*XGFI746J!v]*(]ׁbP=Qh10$eSTĥ_YUr-ݥ5*O1ڔa>+Is|U jL`ؽmsX~o/!](LT*=zsR|,..ou߿'eQ T+{e[^Pd7F$I. PI$nڋ/G- 3a愸_I}R\IV+2P1۾Jp֔dTƽT E6 A^({ {=SSaq̲lb;^ס*Ǝ AqG\pFooiiB6-5m6mI򨽝A Fpk#3Ɨ4t.0eu#Twd[ ^#npm$d`}f_McZ=HF0 8BW# ̝_?JtUUh]!UXp[IqAoklmE¹baQqJ@ItD|g:o1 u&َ632dmԍwٟK&[~U0 uYoul@u rrjFoЌ^xv)?fo J6yNhr=9j~7e雥D@4NK2_q^Зcdhʃ%2Ð_23HF=qlg+hQFJJy6ff_CdKy0׀}9}q|Z?N@807`6_> ԂtEX j wI0s6Ӓ$>5.e#.b-hqE;w ^|%mXfayyM^cM-M1ѐZ/.$%2Z2FL)-+TcU@=u)yJ2KjTSR5K|'r"{R|$U3y g=) eLߵngͭ],ʗQ;Uu*C[%+++Z-~PHٙp`|_jkZ!;v~_kkk9r:$I 8bNSDOw&wR|D.ĺH>@Q$@"I^! r#o$ąe7 ̕^>nplN^N򱺥ު`֚XϥiZ T`0(4b1J)VVV`nnO|Scڦm Imڦmڦm I%rq{!K\QrSrjйODΎV-p9Q | }DdZ"s"1O_#%D]hL֒LE?{$u}ν=3=]b K -ʕ(%[]r*Jvu18J%*TJ^*+V$J*qdH$"  ݙgnߛ?~s۳ ٧{zs{}# a& 4@@tIK$da(_bMb *̷cy˹Grl Ͼ CPރ|..VT Js\UXm{5Cnv)&M>QkxJE%hP֤G'={!ߋJx O<ѺsHboVo9>cD{:/'Zp(xs=˱{yFg]\ w%oAf=:}Pp$`8B YNO%cu!Vs.q!߲0x8 ? N?I(g 'nh1Ktļ=Zm;;;C⨕.ym> ׮]#,mς^}qYqn@ɝI$w}L>9낰By[ ]׈vLOOQ^~:1|ϗ.F&Rf n[1G[ʖcbCܴ;5 ,AĶvs=7 jjr| $cb@|aw$k$Xв\"4'96xmXSė 0q < b6߁xWW!D D}݂r[uG] IlAEOғWqhk~Wp]EW*v=$5ﯸNdQ_nFӂdd+uX %B;*>fj uv呉AFʄ@LE8B*e{naV R}}YB_+pEaI]$* p)JWDԧ䈲2龺C:!y& ۛrY_>Êt]~o/AԲa-d-'a:_.&XY!*yF-E0onAst V_|plNuE#B{'<^cE?7,N:e'(*p,!*C>pUe]r98}?,ե_TJzVK[)pjVme Ҕ'g[|p%- gcveE.s ĖrAʲϰLkJw?r ]qo,"R=qxb8爊O~E e:x:cqA1] o\FaAp!{$(lY퓍 %|P/\ض/[`QBy.u~;occJ@ʛL.+q8??OSNO})~y*=zM B&Z-2Պn)EwyaEqPn_jN%\00ܩ̖ns87[nF[@oh4{]?۸srHt9`A~P+$ut:sN׆/zT!r'cv\|9Z~nK>?8f{{١<8߻._X{ȃAnNVEdzz:n-дիW38CӟDI@III@o '];*,>y[F_\' +\ֵ<4а__`4q *֘AF4X 7hj$/dd$;dpyݑ}"BRH'Le 6srxd2XR>ϩpcS7EŒ%M6te`caqaHPS4TA}S7u;6z K`lC*ت"S7H,h(xE3\UM}[:7ީ%X'EC琖nI#0o8uS x-ÜwSP XHU3` ̖} 2y ̻上נr` &W0k +P{p,7dbN}pfF$&D 8k0uԃƫQXyfV)0\8fHgS(Bp)!PH|WJg!dB]AqXDu'v-nF?(ǟ: ;dǙ M:Iq2V,jwDLIcue N}T2e^愂 u=]E9NCu[g޼#5XCg]TgO$UVK'K8JNU_+z.mjXcc七&$Eu3`ảCQǿ~5qH+$HK8>HBӗ+ג>(;%ւRa' !dX`T2> ~#zZjա+p3aT v,6tSHKs P".J{zUO+Gt6٫\ZD&kpiߓ@-e嫃"߶OJw:z$Bl$m)#Ni?p\#\u[mɻ1$"yo?$m{{^G^' C~O 'Od}}k׮I4̈́M+̺7/(T*eK7YHb$$qunZ֐s$#,{$/d>vk1Cd eel)w 6 Åect: f$aRC4Myf֟. t:lmm3ԧifpntX^^U6ݎyv١T*ej C\Hn-`ss 6f?+4i6iH2i6i6i}Fg?QcUد"bз*ܐ --PU 4*P. d;R~H@ P? ;evۚg <$["HI;IEV',8l/]u7t8K6 "3*-\bP+NNEKU&F]kzb켡 eQzUXmJs4xsPJSĎظySHnH2,ܥf II)vVJFD, O!bsbҗ\#PM* w'{Zpvcc*7́S' i9b :D~x@[wy V^sO?Kt~EmXj830=Z [7xpEP U9"89XR/J_2>G$`ޔ lI ա%*a Gنf8!mtXWr oٗtJ`S>kg&HѸe ,\$=F!* >Pa [P20']=75H%$8G8}w|`LA,faqþMQ`ט10|_os$ rPK)\.h(@?眛|1c"}`8V+qWw.f΂g[;^&l8q^{-+e/V5RVʕ+d峬>0PVG~?ޅir.]4ty nN 0ú.Jm˃ yP(P.zj&Hl[p$ | F+V=yPc$ TVԸS-7࿙  zVyPV uVGHg 6O:5H,oA^I8fnnn%vJ22ܤٔcdk IDAT.͖ ۰PWW'ƤMLڤMڤMڷھ$O𑥧$s !2X}A[VbvkPnbGְqI\*#{u >, K"5k(sm^ f#.^_ vd}ʦFP^cT2"\'M9`A OF6; -z}9+y*lDlGWDLwr3:(lIUsF=ؕufct]˦ܫ `^Е [5-16샺#R]*TwxtÊrMc3?[g]5uxXqˮ-@ڔ"[Y&mkf5+bm2F)(P1 7@[[ѫz $aG\[uѬA=wDpn6[mGSw6I8ހC;aar[~ w+$v[(p$ hHܖH m '.#F y$Vٹb/V ȝ0CWvH?K?d3\₵qN~CI2Z$߸0(y_;v \댲ppٶo*.>ʁG]w R0f):.$IX]]=5<o&oA{{\~= ns 曜8q" B@n12H>(p.JC4s?7VeY VT[՞JJ8oa_/c!JGRlT*o+ I׾5NCH٪d5v:%|:c@T_ 0v̡kHck) հTżN54Vuc0ڧ U(TilrciK?Wz΃@;W 8n"+4 2Ivw_I.:*l- 698q?G~&I pC|G;&9(|Cs IpN}02ns>GEF3Z8_xF#S*`Y;l2 vZYp` y螻?UXCo_}x2F NpKzB~AXww|۷3ƍllldb@?nt"n7[ſ7RZ'O/c27DVX, qɓ'y饗x P(-yǾ&IsL() Ht͂o/dI />%n-Xe ZY]esrtݡs߿Hz{{{)=͖r0<|3@bAIJo/v; {)c V9eJA裏YNT"Mӱ}2i6iH2i6i6iH2=,;|`|Qv14* -2wI\S+$(P!|q">I@'W Hnn#)DԩrqSE=wQn-o _#0wbrt.`+e6t8ΐD]oi[caL.!; q3*B,.,~Sϻ h[ .8фdGD@$6@aMyIq`Tjb`n(iM)Z"E=<%27MMů𲈵IUaQ4pe&]9uzC,~=o 6 =i{߇_!I 7OH>-8Cc5zbߤ0sμ-(> Q Ǧa/߂AAUGx<¹|k2L"A+uXśpf38V,³5}W@X`X8,V=J_Vҥ%IISxs ]:I$\ DHƕ ۏBkuNeq>Aqst3I TI0p}`rD>> g<x3EkGk TIVL& yz>GE~{p98tCƹnfk (,qGq-I9%c.lo0p~CF3IRDεaq-Wȇ$̙3PtxWV с͛,,, A+[@a!|: ؜ Iz&bە~VHJXT*:\_T9 >eTq~p$r۷oAW`#o<4j|G}4 K7&np HƁ 7#($4);9J|[> Y$o\%z^ \r#<2ART㡇K\\.vs!I^- Hlv:l8W_塇 z9º4rOr's ^t:"fC}ߤMڤM I2i6iHnN&GZ01(,k٦E".h٠L]GQ^/E%2P yY^c$)ꁬOICJǠׅ/KIX3(BLȒ\@6U1]o!噬%|I9՜(W}]T!1ۿ6\ D&1w8;"a|sXA%S+BYavOcRnjZ, VX7dւgeVJ xVm~/ֺ#~-y_v<3=.á=(/݂{gfpɼ'`[Ҩ cTN!$?3Hr I70Qxsm:ܩ8'I\7ŸQy`6?n,`8 HRp 7Tf.'Ohx]@cތE, ,,VZ||aP@n{&yHX{$ɟ!p/۹.J{<!q qEJB^$o}+z=x^{5P7E\%y^:Fpul2[ޅ$.< VmA7ƽq+yn9/y%ĉ㘍 j{{{\ͱsȺFn>SSSϲgӤMڤM ɤMڤMڤM ɝyɿ?>YRްbT aC|5.,Hfe)o XWJ_`USO}DV7 9B$Et*NC *BHܖ iC=B)9"pBELbe8<7H }{^T c0¼n]Im!IW=[~5-- 8B_3#e `*5dknn ]nv5\>ccn|{},h:I&@B` `u^Q\ƉU9xN@ѽ_v!ܧIѼ}u=MY$Ȥ >:L"ƙy}%%e^*i%ہR_<*?Ӈ/uhY,r35!ŧ$(ʵj0] g/B d$p=!,y@\"ጆg쫰|@@G1XX=X ֩yX-&,!,C X\}eBA[ $nww]!:5ܟ\ ~A@w=?+.`0 X|#ʿ?h.y2Z˺3ޭ҅a܅x,j *[HzKxօώ1A  u!?pE\@}g8[caZ7hh}!3$1c }}v^!9vj('exK?0pD]}yf&ZexMn߾qCP/fm[a jb 7od}},(n#cZV.(a\XDx+l%`$|_疭rWq >hy ^y{>\ mZVȸW˅ }Xzq3339vwwNJ!,G泅ܵ#G r<;Qv#}NIJQG:\/ߋU8+@+ ySž{R+9 ϯ]s^To9mgߎL_෠lR}W8zb+ڞO?_r"<}@y"{nt=ۻua_1()1}vlc?r^~F3: 9u;ck,t?3(q]:i4,דm8^z>$s}sr1 69{οpapy7@ԛw}.8\i\2\U~O׹ݒ{Ed7rZ۷ȧdt]b~0;I׮]DP+ fYQ:Q&Ad\vmHmG$ %n߾MEcsGvY{w#[@Z*]E;3 cLaVYuJ:as]71J<@qP-t y0q%`-fKeټf:^ز.~m|fo\ZVV & _07n I^:Hܱcl޹c$nzN೟DИI@6)5i6iIpQ8'/`y O2A;C]A n1o hy U(R>Hj@Ih3lI9vQ/'nbW:@%KJj5( FO7 h+@ ;6…_~|BEe]+n헽6&}_UAa!5M5wy| 86TQwIHx\$P>V1-M:?6L>)9RaCA.*5_p'+Nj\Ux`PK}{‚ +[`.AzI^}M| A'@+(\2GtΟmG3ε@5嘓T :&d r,Q ]]8O=j:J.,plUn>x$dA(R o:\G2qq}nApJ,8>xSL?2K^T7Rv\gk4jt|wm5zJ9pwIPȾJꮚwfW4®u'~FzwC9Ipg=Oyq za $guާ9$ld Î C~xr!?=|QGF_ qz (:{[%ev~Z3-o¨Ѓ0x}]7&^os[lק |_ -oNą /ߖ~$q lKuU|\gj;Mwock$IBPRd`R055BVp&{nA]j[LX#p뱹B2Aw+Lz`NplE8tx;]T 򕯰:lmme\`؊=_ &+t\'zjA \a݆c2d;י㗦r].LjP,[TVRYyP߾몲`gg춷 xa^VZl6} qoSSSC. ploo8S~'Orҥ!@:I\d=!8ך&ZZ it&d&m&a&m&mId^ZKE}+YFADP *~*0/Zwq mTKn DV* !te8'UPCT-Q :^QՒGs3*N-wc S#炶Tw!@0pC"q\,׸ $ IG˂ IDAT|abjriSni5ŐVa=ߞܛT"C n@XTm)})IF]UcAm 1}=XRiKY)c MWeN<\gPŖ橩(5ԿwW5J[籺?27Ԍ(1.31 z/y yBԇn *%Bnsڟ}"y(=9QPRfԐRSnI+kNK]Ҝ8J=g dga_H@ HR ^ٗ<Rǀ?ӇaiBXZ )O 8Zy9!xںfS1,+=EXp} ?|%bmpVy\AZyO!x'|` dك$~a t2bMKYds<r;`Y^v>WbFKu]ՕQ V 5Ib^'?<}N;e9EdHr>my9EA7+'ιn޸c{Ƈ$.qKmmg%9R7"D|~M]wـ{wJB"Z,\.n;o"-h42 ?!b%ao}}}E:RDT^S((O~#0n?cX^^P( |A677Ї>˗ۿd+ć$Sn$y*y!Z׹IfAc˃n-Ȼsߞuʴt6h/GgsO677Q677G ÇN6'dnJBZ=yO. $vd?+溟 4My'BƤMڤM$6i6iH-s*X{Vo*,Ym%2嫰kPz""w(Bu,~ء Z?hAۊEq>?Sg"2lBUH$$}+aAI9ຼ't!ܐݐ,{@ p ]7Mq.!(Z9M04@ MH6YwA|}C I^;P #@KVuQe^%̶dH'GAYK'zTt3ZJ|DN扊@i_Ꮊ&Ve5cNGGIMu1Bۈ"UYk m[H5GL+]E2֤,VBqJ u5veݾ-'S139I ,霘T =ohPHڒbJEH3Fs/I}RҎ`2^?IcTO߃3 0<7%4?$}p pðu9T.0״1P/Bʹ6U\T.)XgtF8rggFr<e$wD*݅1CW+vsݧhIDh<;c g\%ܒN溸HRJs04}r(I,?iߍUuXW܁';Ͻ|k;⹝-~0z~*׉JuI: "\w``0 9/H<<@32E~H`zvuqOJhCVlqHq`߀Ga w*+37\N/$?^IPR 瞅3K0}'%闋k,],* 3هU-W2|+K*ف*]z;42ַ$U] 5}/1\fuF9〮s$y ;rpN\ 3"/w--{$vh1crduD][ 9Tɷ JlB(9 bO}S"xX__ {n46 I0:I~~ H+!.kA#Gg[+L8 &qAP"rd\i5ǒ$Pнܖ\G Bn IjN&iZY%|0۲w]$n?@%cjٹXג-Ò((ﳷ8\.p$>$IY$.w\ψII@III/VOmk \@VŸthnA-h7q?p(_x]rChH"$7DkJ*I&U2%BjBև#(Ku)+u7AÞa"⊈GtE@/*WTU(a],ȱMC|8X+II3A*:@H!nq{XOoH0E*J"Y) ݫ9EU(}ccL!D3 032~-Vf ۱ւG_]*mdv}mpcz ^,|*e(ѼT]42%ӂBQS/6$L>5GTk*ڀt[UTev~NJpէ\'u?8H"E8NN8o_wEX9,+p2k&.?TP 8U)XL,FR˖=[ŠӔyq8<# w{ .0`(8iQׅaW*\pveFKwrݕ!a!N%Fo@J='~fXws 1 yS̞_HV~2{n796[Ҫ̥., Il^V^sv9>۲\~c؅Wnx͇~KCl׽^kn?isz:B2a\ sga qa$ /ɓ'M?ߊ PP^K>侱!$cVcww7sy7=~$ AZyb7 1͎{֭[C}䎗uPDž$~X= $I+H2)5i6i/߯$%eXU򃰬%ŁR/3M].Bs=G݆f yP?By bRQF}GV/%݁ R^(ނrMr6$=N`EkuUuXl:Z.lGD6Dso@`&D̈́d@5<^/ObvD뗤V207bwT7EmF#"Ub NLAJeqq"@H4暼stB0ohd%7&C`կ9C D5#1 % QqCʚK7 )հb + )h9RRyo0 atR[)+1_8Ӯ˜C$KsX˸][Tp9Kp 0=]y^>~V>$Ta&3;0RbX$q=/0=o4_cGwDQ4 A'?I Bn#_t壬[mv{НJ\HbtwK~5${V滥Ɓ<(['IYn٭;<8Ƈ$o߾JU*w~Nlf';2fy玹1&$.s퓍 =TA$ Cvww`uT*ni3Bk3cVVVtTb:>IӔDИI@IIINAB}sgWmb }>,4m4!ق[mBH`H%du|H6II eu`,w PW3"\PRү*}OBrVĈ2=V~T\цxW8R( ĖޣAN:=iG3~tTKSMxdExY_WVA" ̉Jc%swiq!VkޖJʚwbtdi8LғGpX_Ws\J[,i@7*n%5-V L,&+ 7k q:2fiqj|IjyToN $z} O GKX!-6=|AKg3-eЭ ]9fl&L,p8c99>Sp柄L1; {!l X))Wʩ.NI[/0pIV;iY0RSVAYp=U7)}S pz\[2uD Uf嚬q]mb]=a|G|7 >'s<>&~.7k9G >JsnM-*Qnr _ό:,eM|{s9?@xcf!x oAxȅ@}\0Ew:ψ>8p/a( hAKSp!ixo\ca 8[p, ,Vq4"YGK3pZq9fB([#Ssrkyـ!0w9};$>CgLW]xnS/c4hv 4b\K1P3VU{} >>ٞIÐ;J!d~nEIcIuoʴ3Z^߸-$p,Eo۹Wr:Qs䌋iԱ/ޅ`I?g2cy׽庆pG`!8x4$B7限^KCzL-j\eulRa2- ߖk׮q4իvvvL%waWJ J%3(-+u7a*$JܲJo,u]\B$:t@@B|`1M]}w"k׮1??O ׾#l.-b!p硽v?~RmRn)˴Z-bvl177GV#}q#f!g9j3]\()vs.r@p{\}9ުU]]I5CdZ,=V,{(p]zA,%@ 0i`jHWx8XGk櫻ٯzߛ?~sԩ[՜HuUusnu|N'zހX$4MjZ{V^LʤLHIII$oyҠoPZ[a6$@-!xmj~(uZ"'" ,JU=zS2JB-(>%dM%n9 =$+ ܯHUJ ?*Bz,85Rpga%bJ"44sb@bITMhƅFwO)ѐ:YTeUA!ema=M%\%]t&[R2sL'CY J:|2GD(rnda/'Ylg7ᅇ ED@PZ&` Dܪ XޔߜPZC+i0M& 1z߸xou൯\H+`llm{aߣ@]0p`8@yl=yU$};fqP,IWY6mCtI\+S<' 9竐cr-<]I)-QD{'`W(BB(B̎'rCиdYF74#e]BG:*!vT= ȗ2,FB\INh͓LVQcڐVB4P{`(#ύڴY3X+ "c%mH{H%ը$y KچoU@r҂aMQu\rΤQ ^>,Z&yJOZ~-j|y]q* k8/|>p,H-%R7ȌŅUXspM8Y*NP x'? g/8`Q RKp1Q &6Vz;⏙?iF;(F<NR(y2Ii}#.i .#9n!ܼkgUR;nCoo7`Pu3Ru_i3Nhp?\2fNey%fwLyH;g9CDS.q?;ת[+dPI2Aq`Dv#c#|uOWl.IOygugwSVį }/'ݏ'.|U_?ƮJNH l&1Sl%6Ye{K{YgQIvJVT;;;0]*yޮ$0 iZnA_hq TZ.;?,S<Q2nW <yvM~\D#5\-nsT|N\Ev;εsIr// tXQcZ׀@up,|9[2+"dz [Lڳ O i!u0k]:&8 >PBUh^̬US,ࠒ<>лx25'BA~e=OG\P<^(+ LyS%g0&}fI@zOBp]<>ZY̾!暇b( fnۙUi0\$Œހ (!PpNܴ:ZۡM}-ּ\t?d|9ǎZلt*?a`zc1b_b֎!R%?S } &L8uEmDKL%܇qU.p|^4TQhQ, pwvSjf| /DPkuX,Fpb?'+b FQN<)a/|D~J[b V_/qb2K7V';*^ :'hQ$Dɩ'k4PFm% C6NSb-!ϲ5q1TcL;$I Of6Ko Zu<$PJpt'rx$k1Z>ab{!9f##k}>)@AxĂ8T>ٶFQ~%#9}ey VOMas^W9^StyO$ϯ^eQz##gEI$X Y3Ӭi֘>1LqMbHb)I%ۼ2Ò$oW\UZ}(MMMezX Zւң$yuĞcsʌQ$``b1Vk X[[СC$UH:[ne>|x$IZY%n((ng^i6[,..),q$T.vݵͲvB%2"% ΛG丽:3hEceHk!m|E O IaJRD;{F҃Bbk}%L@ʪڏ}BЅkג&ҿb,>~OozL}nJB&ӾhH-VV1־@ {Ԫԭ" قH9R(`g"$%ྶ5=V}!@1$5f[ޫMм +E!]+@iQx+P/!HH`X |CDIWrH4K¬ͨI$Wx g %ZJ '_ ,nԛ| {8嘆שdĂN]u!Gj,'_Iy 8Qg*I]#f(.xOwV9` Zw!JTT< {_ǺXrK-T|-͓[/GRq}\*IF-;mv[-H Pq8]o<뵶g;S!9"Xpg3wMA4-}]6zVW\1d^iT&IIzcx$Q`2dڝv0SPd٦DbI*I\EI齱YXI[lZ$q3@,;555HGSpE W2 q?a{|b7}wVbvvvdIQbx[n޼ӷurVlq3===dff+InKƍ:th@MA'H{v.W>]E;. {|+Y+G{c ^{5n޼I\Zm$fPX,H677):hR&eR&$/nkR&eR&$Wڌ.߄PFoj%8iEn%F tk@󶀸eW\#VQV`Pڟ(z`C5I[)BzĪhH o 0샸Da yP(t[t${$3hY+d <!$B_F&yfi-JN\ SOհY 93'ܻ*J ۃ(Y7xjĚ[*̂,$rIe|zݏ,*`AiOh<KVo#Se8@^zQxy/)F 4eP% !LC{V0ܑb*ZKAbH躙=UUkB|+ZAb?> GaaFl ,uw> q?$h@e꛰_@5{>(=x9XL ITPCP{bµ8q%߁zErN Z+_~]ݥ{ߺ,7oCI8l[ 5KUi <ܪ8S `n^~yoI&$u*:qPWI)}<Xe֢Gm!}ekY婉&p [\2댇חVRvrH!z خ yup۪퓗ixy#!|֒10cHqDI޺ʙ~{VG>yDޘߙN/dW~'^XvPᦩrY֙ED6!M i(Ifffܔ!R* )IJ_W|J7U{eAEQ6ߪ+\ĝ}osȇ_nX(JGRwHG49~8<xg4dZJP~<4^¢,<ZSȔjGl^r/zǧP H<ӌ]{*7Ga&Ar#;Q1-yÜW7$eZ]0[=u$I]s/'Ծ:Ì!|rnUX_~; ܜ'@x-Ud<|f$-eP;$/qw# cgaJ8f,s +01d|~OMyp%ɸ{>a0sUD:FFNTflQ"ÐhzzJb,gmmW_}|alߝ tI0D]B'H@m,q H>G=FYomK+wͬ, %~H˂܃ #駟k_ڐ_ 3GP۲Eͱ FB@\!}k0lK*6,ab-1aᒠ>6(ɯn4^˾ؖ,Wh{{;Sܻw8tǎ2)OL$2)2!I޿rY? 7H]~ ,'U!mk \%3 ܅fP4Dh$:xCסPAfs}Ć(4QT"!A%.(-Ji]%-QdDW@boH@T*Hj=_qY4D *Yu-{EAQsLİ8NQ3Q恏(3QR aDȌi QOZKfZl90%vfw!8Yz- u-/U5h{!W"OzN^C͏1m-i6hDAB הl>fڐQ%_z`~GvLUJ%,6 @E!غqYlG ٱ& \g!T(u T?7Q8ނb,N{PobEDn)8wL?8,LdZp~ |PxNXo-P@%oO }$MY@ܻ&KCFWcA`1c@3;]Ek,a0]\F!9Y^Y'i總]Ps#|[*[LFOVDZ}eW]RisO4=EȰWdZ:: vq~N>݅C15thѤ6E6)q-˶=($K/  Wv[>p*+@w{n7 G7dٲw}eeeWb䝒&@k:!rdL qe÷@NC5ݻ)?V@rM!A|zjJP|U[ 7!9:}M ~e, [Zimg@i X(0el`pGɁo8Ꚏ}H}R&9#OПT5pSJuN]?͔gGlXs:U=vzCS!/@fN6dž-o Ԥ>Ӿb>L J[+jͺ_zmRPŏ 8{WTB@C-N~@QJKJΜ 'Y?MC }vEޏ,BI>Xn.Ok( 9Sa IDAT9!~k\ [?Diʗl0'$JIje@nRD Io u p$yڰ0zɃ^ O>䀵Xd9]+)Kn, wIb8DeĐnkk+p٭]K+A\\. _E8W85^zj 8;n!"8sՖogZm5>Iƍt] f{7oEф(I I2)2)^f% %JFI,%4WaX`q fW* \kzWlu*dwR^M9tnSj:K,tj[P9%J= A :Ìd%, Hf!ا8, a`D+2a[I;j`E%m +! mJ*QbJt;,}_6K#!بESr8%D͔s8L5喒e  R`^)cKL3x53l(`Ļ|أ,!$*u5HWt{m? ]**88um}܆hJh>M%l6v.k*G}B 櫲oOk,Xz!~;[b- ve<Go;jqà}zA82[<q+1,Tؖ wE}T|K2jPU򏮄/CpT!%6umx:,*JM8߅ BQTX: )}^xB2@H8EX52P/妌SߑvV߳g/$iwIsHÖW.>9dGSi9%VIdcgIG]Z\`qq(:۷'$2)2ۚII$"vA@.,߅.'p5%KaV6>TM2-_B8= 5-hVFwXA󘀤>$J棄>4_JU@8{ִ' X@ mR{\T#9M};(6d{!ۏ*>l 5*Wl;)Dpb/,߁S3ψ_}F㚑2+!=W/JOSVG70gC0mmP-=vbJv ɕ<˭p]ˆ9~{C~ٟO=b򏕑@7i=7v=]EC}7o wkfU$v\cb\.qc>oSV.ݜh3 Z*ncr:93H9?H3+]IKTz?Xf;"ML}w3IzT4ecc# Qݻ#I(_:ǃZQeAb-)g8V!+ (lfȾ}2߮ŵv4ͱH؅B!>jEdsss <|_2 @ʄq$Gu([:}}6Z-#Ȭï.ULOOgv}Ԙ#E\dssl\MMMee2$֪H|۵^G GiZA@E|3P(`իlmmG? 1)2)aR&eR&eBry/,? P@|sy=P+  I e}VUYu]z*=3׀o->h P](Vz`m58TeIڛwaB$(*Y2 ׁ7H**j67$ DI`uM6Զf ̚<ӷ}S{*_ɿGImH䤛>v`U%{ }KӪ4q{* 9JUAfΆ^sQDbW6* r6/mkҾhƊ(x6Lj$ܯ$U0sLk^s'l Ѿ[.k}SknVm<0~cXAy|pFs}%pg\@gd2[]Qvw,W5ZO2Ėp~JϷ`y09n8$~|UL$ kɏ!FQ`oz n*rxyɘ{&p$SW;Δ|-1Z'˰Mo_fƓiߖ~s\n~~,jn]q$.j2H`<W0ʢ-(l7xcl {, vI~…2Xi6lnnfYn r?=oDGY5YKPey&Juf]aIdD(B͂n=8|0Am?]{9^}܌kw%#J1vmRܺukvvv{.Q155EE`A++\tI8jpE]7Mۗ-sss ${M .Ij2-ke_g~g( 6[[[ cR&eR~IdR&eR&$WN<_sI.o:Xz.ò\~N`i%x#ϿYkG!ޔ,_e ّ*'Yǐ$nq$!ERn )LK5dKTB ~E#lzkӦw!KdU($u DP!v+vJ(W uZ$*Bh Ufr6i)RRHGԮKgѧiq;;1jI*!dj?< a|] Q2dVzJYpm[uZH)G {~k>}+-p' hHůR#vhQxTbVꛪ]S!bn@ QEΑLCȠROҪ]bS@7` =zZk 'X<!s? } <( 4f'*BBQT:W895 ~Q,pné-81/!JNLé)8*p\>W#I\qvE.QbAB*:DnGm3Aa|xʰŖC<EA=g-|./JN#?K~Dѧ8_ΌVds?u&N)a$W /{L_efe慘j$##߆kUA+ᄋ!"~#]%$ W|xul;3H|f._˹z ԻۼbrnμA% LI|ku\O?믿 )'F[[[J%WW_Ϳj vs|f z+ y/XBr $.`Q?m^__Q,Auڐnfd {$fXR'{QbǟJ!F%yĉK wqqׯlsVWWT*z(qSkA 6q>IkqEJNg`#,9wab.vdQqܹP(S창eL2I&eR&e"LʤLʤLHwT]pⲮ(I:SXޒpeܭ? )XؒC/h”@oOR<ʔD >ʆP< 4Lm%тX_>^($j jXT8%%"fXoCZc0XxI` dC:<D9(ywΖ%!=Z\Y`/pC-i"C-wjS#ߛM%ϩ^m<ր7 R@8cO3 6USV9 N}u84eDrWnk`8J:BqGN+I_{ ̼튪B` i ~xX/[rLӒ1l@xsJ2XSb4Zzc!^tY{-Rtx~]bQ2lN>) Q pB<& *1/I=880"( h?QOgaTp KAX&^%[݂{R^3Pp{X\F̮AWEb $$ VK?Bo~& ?A\kIet0A)I?/-JQb,| y3G*^^StE˸̓!5,pk ȸ:#\&(qɒ |REO)G-$%I(j޽{m02LFK,8z(׮]R6PȭqDy$([]]Ν;133YMMMelɒn# .k X?G幸ʕ+ 6'Iص ^z c >V+#H;62&eR&eBLʤLʤ`WC{/2<ԧ>+^ޣ%P_yocԧaaGʣOÊ=ѫBPH&CڅMbW rO"YA[(QTOTԍR! #S4.þ615Xa׼t?6bS2uڟ;BdDLZpMUI*Q*> ؖ0z<ưQa1yU۱I2a({W-,SUڎYׂyJ }9~RsWf^ڻN`po8sͺItmUX򀄫'wEcjsǀzdPA#f!B-(^1DȓP:*+mV)VE#2vϯu.dق,ɟ '`10R(>@(ch`>-UiJ*&>Œ;*",_ VxԚ_弙~&G~My|%fgB° bXO&2: Z;C0 (>X>ayȨrGȸ=캵PwO <6S|#Jw*ۏoD^?#;gΘ> CSQjQ)$ ck\qϳL䧀~[[G o+I: *I\Ϸqyv?U8G$BD#v#Hjʕ+\V5dwGReqF}PR(ag8;'UW-jj'R3BVoXJ N~.n=h Q6Ce!]@sn=3lQ^C_f7;`{PU'_=pҙ'H<0 y)Ɛ$0`q ᄁZb(E67A|Ov_קZNm嵣O~Ƿlg9}p`{xO&Sy0;9{:O|ĊOeS$Ϋy/޻*Iv#I3%* Abgwj ZXƮA@lmm*I,=J}ǴadG>ϳ ?]l*%H[{}TbQ(X\\$MSY]]rm-ygVWW5\dn8'M|CTlܹپfyDI%HގŋllX5I"I0l `$e .AbmƠ?2)C@LʤLʤ]$rO*Cdڰ[P~}Z@Z֛/5~d]/CX_i^uɬ #{x_Z[ҍ)C֣`j[=$$D b? vXVy.3Hgp\L(y#_lp1])EAWțG$˝H ?%pZ/]? b,apFqI @ Н)QpϙI(zA"3^hp[' IDATh|w1kUAT"DO4p}v RQJje^j%2;wYu2V[JILjBHv*D KZѿ^[#:;= [X vI:PЀiBx  \[BUBӆbCӓe|CX bf18u8=ϊ-Ƀp'K=trgg NXMC}/, _= O*g$B=N&k92ES'`aH6X-g7_/8uq {z$6`]0>Hq8!JBx㪾ʙ^Fc_9>a0l]O_:#z}nmlb E%y GcmrvF#0QV&MSJafjӤi y;,Ò>A%n[A&c666?VWWR?MMMe}5 -{6(o#+++Y bq-ih|(x?=TB@<cR&eR~8HdR&eR>$!2ɸWa6 q-B\^Z$K0,p. ش , [. `g%l< 0sQ{X}\[M9jUaC3 n"~ d3xRcje; .VX'QTQƪځ^N$B?,9, {_䶀aI~w4v)ԾIC0ۊ3P\\ 9ƒu>'&cBBZ$ py xD@wP@1jHx|d훆[iCGwn:D7`00o|IW'`f8թEisz3RɶD)F㽐8ނ2k~lVi+Vi /p IKBWpHDMTJ؃)c;^ ̺/AQXsXjGO ّ{[@M#E%ժE8?gNT]Bad=n+PN&v*H`)r'.Qr܅SQ IRw2Wt qQd 9$8"$4 r>P}s#HvːVպ 0OoRL At?$OC;: &qTUrSkGZkq,dlG2Lc,I{@-KɌyH2^Ypyc"D-So"Vr B a}SbstLFgm%:E3# 5O´\w;5Y%?nJ?gOGhKz=QXJ${oArUii?3 #PG?>h;qȶ:Nf̓ y B U تZDABTRE8W,nJmK|$m0 H.? gWd F^oWUΟK=#9om ṯsP^fjm,h}W9ZiTcH<$H} gFk0#>z#ޏCs3E7%IXko|Y%G8dWs>5fXɯ" nmkavU'I$#IlH@Qy_$ToMiz7Ɯ8_f8+ǽ|Rc}۫ej?0'>j&@T}(&IT$X%eegg{>Q$I<OtÇ5tT*ʕ+_u5v"KԸŝ;wH)y%/C\=ULʤLʤА$%ɤLʤLHەk$.oOu%LPy`N2 j@eJ/3@*q| X/olsC[лЍ,="u9  LX#kNІHAWf o*F6*RTِ*łԙMM n B" lӟݪ`F'e!sjVHFPAU̔^ۭ!@R:` HRBuWRb 6m$!܉@iO<6AlH@]T"Plo%P4iSҋ},iGEui M/6$ fKumH7)AMJ* cb￶"q!Z-̎HIQ/^$@,:Ibm%3-C3ϊem sDq]Z+5_ssPRKa8q3x!^MKƯSϿ'A(,Qm_g%R8uI">1.AH eo#$,9mcmpC$lko13]so|`GV.MYb$_oצkCo}+(g jBo\s;y)?pH##xmMXcn>k[:i8#IIxJ"żü/?w~:Ytp$J%P~pa`Xk0Όv[Ւ,ZR?fu7,UYF޸Y4ã@ 2##+2ι,˸sNς s'<8 s-J9p1/2/<$ɼ˼˜$Sq-ܚާ) .XM-]!=]xT@Z=0v}?3'(4b v]*i`]KZIeU'):g; 7$V?$.y&Q>C" F*:%Ql:]a]gZ#Ѐo;(cR2&Rǹ0+s=i8*Rgb̈́f 4ĴAJwq׌1 I4^CdAxK <c_F.dqȥ !#G cKl, V&ړ !@Gul+RH_gCL;.`hѱ^dB7R d1WKIAQ7ɚ iYq.K&cv }! j77`,YǠ}:fb3ep|6xa(JN_Zl* X6PCO g3 ";*¥#?S+BEvi8Ibyo~rI?(*/\ u2U8X`ix*G/=W$H2?k6'$II0rW?3?87Q ]pe2ta hf쇑[BI!`Fgͳ N{FLg$.y`wVcF16W.ِ8? `;y[ύo Taa?''Pf*0d8Y,//r> r~ދ m͵=I$Kc"J89x 4Ft1pΝ9bJYj ezj#]*Z1h4"BhK WAr/~/STrU%lK* vNXl[/^qY-$ik3Kd*3oggwdn5/2/sd^e^gKXnv[M0y ֍lv (@&c_6!\B} vූ`؇6BpU0f*9q4z'6t> @,⾪AtHՒ)EyRkOa;Rc|t pP2{)@r7{F@wB0W4PǯZJ ^Y:7S -z`@v 5x=nkMUܕgMhx pȐd ca5VL`o1'xݱűJ0sއz%uH>9@`ϓI =coB U#σL,q R Ot\2!ֲDa-TU$0|HQTĎؕm%5h }~o?0/^RXEjܾ}|;S$  4MsS\ fɭ[`Pe*sɑZv_O@/Q>۬Oc*Omggl6g%C\i0H`aa!^9msus~έ5`0`ii)߽߼˼Iim˼ϣ(I6?KkجjIO&7;@ L[1Qpk_#a-V }Gc%;=!Dӝ1ԌCKt@zg{B$wB Pa6K u%]Q2e xve#Y dHjĶN`A&54OxI"C Hm:o-,jxSڛ=%R)o3_c<@Yc>eLH BJG I<*Q^W7EHm xX밨L&j *j1WpSB%1ڢ&0RX Cv@? EbUr#*^U@pI , ӾX`W7XqCnGxM*Ե $(ͲA4[UEPUTp֞/:CF8߂SMQq'фk\8uF^z6/ N8~y$>̱@R| Y. c M(I?-5&_k2sg%?>v4GdJ,QpyR)!ZG6?, Ϯ|%uۑ0)~q|nv&IY'%Qn93>9 =rx|K:gHtxsvwR6 $os ĻItRn I,Ң$mj~-.]WA$^\\"G,yoto3Td>IbAnK<%V1.yO=ݖOT*]~{M>Q$ v;'al=!}*z}{=[ZQKT*"`qNu/U0il6Y\\"H<70 s5pz,#5X ĊO˼˼Iyyy$l)r^0u:#X_;3)l=[нBڅ>t:Yqaq{pM8,8X$k(ɰ~'W/ IXkb?Ģ2CV~XdE # v)նi xD4`Q; u ɊAT}L`z''94cA*yNc0'xVA`bO$켪#RQd?hlJM!* &/ =-@v ;~=j /hPy8~ zāN1l…7X8NL,֪PUJ#Ϟ=38SaRH[CC-Ăju8(lasigSUUo_;\luNj3!F|IYC6Ć[">D)X[B׺]`IPE jιɘ5$qvE%Hy8}ozLTV:?#0*U>)Iܬ+O,ʛ3 J˿Q5$=aeaY c(84*VI{=/|D۷ݿf$ moO ~[ rdzܹ3#HB0b) IDATWȯL^/dmh4PtaAVeaWF:(qXg%Z/!΋|_/%V csU~@KiQ+Ujp>{XFGłRms^*7|4SFQj]. ST49b pp80jua0Waf~%5\%lʡCrUdUh˼˜$ [Jyy$?r|NwFu6z"YC ae݁DA! A@;cx߃@@'8^Zl/1 ^~j ^ >9 d.pX@ٛR yVU#W͎@ځ0P:!Xdw -}'H5{;eALW,JF R ]hvELs *pka=z9eD$}-+eiYBVdbj &‡4Z˔UL`,{JjeP!}W<3G)֊fҸj[{{򫓀z2'3uY,kRѨR) t tiナS$;T![PC$HfڪY@(-uj0;0i}-9q{L6v_x׶mfY%QT=?իW9zL 8"~+줽y&ADkZ {${{{cXZZ*1\r%'A0(@Oϓ$aqq1!~[VR IY%I,`An$ׯ_/d"J\Rӟt!*5Fׯ_w|++wu+S[p ݋ j%J\:KVY̝xm>Iba8[_3mҒ$)(Ic\n%,ٶAbd&u]|8 }3 Jn^e^$ɼ˼˼I?a< Zi:о![$4N"paW)'F Sn 0Ҹ% Q6l,C'M/lr@uԖ%XGa 4MBvZ poˊ ĢHz]`8!+HMu0cCKseZmWwEpK (&UFJ<Ƀ@zP [mcC3TIYo23+ %`gm8QRG$0I*T$Bs ߿EF1X:GDz+-Q9#L"@pɂI+NE-\KX Gw$$Ss$vjLr\'d:;qUVkO,qAIv&Yo%KJ}33g%sY?|%IG;_;7Oߖ+*]f/ǵ׏OܫF#:nZN`Jc%OR @_kf<6YĶѣ9Qcĉt:R]1&σz)rߖYZZb0.H}?$ݺٶaX K_c=v_$ۇg@j5.wڵk?6öLEbUw?~eD;V9$ncf)H\nNS1˲СC4Mr%I$SʔqY}jsm}6'r2^#|$qsLv[2/2'Ie^e^$-ȵуL@;2ʾWkFZ"VZk $–#e!Y14ب 5Q!ٓl2Hpn-9GtKlԩ CX{VFKKIȃBHxh$8&#L lp{pKc<,@i(vuQH'?d J42m!B]5JdXm%8FB d7&pXUl{ گxwyDl% ꚽ+KQEڕ MbdC0H!Ȯ6Y *u? H8 qǁ#cj EeV@mO$WH|GԌ]a $9ūǒ6kQ\n+r[ڛ>M85},1d.Y+}F$ ,y[UIm'Aؘ5r(3RcxWrJ!:PՕA6l<:e}&:*άjeo¥OC.IHp;˰yN^bղUgp=~J$ xr {nj~LqźkQX(Sfv'DnuU\SpCý$)dXѣGi64Mq֭R0KcTU8_g<SV p8g~VZn%䴸K:OFք~ M6"ztK.Al \X;$u Ԟ~%h 0 0T%ax]C, ɼї %莀_UaAҗԸ(ąyM'E,hPJS(i9r$BYAU֥^7 <W0-CW{SAKrnK> d=t'aa@- +0nsPHpX쮴)3U\Q ﰐ7Z=5,o5 {T캲SXnA FȬZLY[|Xl #|O6B:yς{i k 󙑶߈$]zKWg)}Q2,U+Q˴\8RS*T*?\6la uO0MX?[].kɇ[ւxgN*H d}y6!$zMf nYgDLg: j=={[mE^q3f>-C6aV}~G37LRhdKɪ|KԄejWd}3+I _ERJrU4N^8y8 /^;W^) wϴpOVgvW~ct >sG-2y\a~@l_$ fѣGя~$V`[FĄK`w9x aaH9YY$İm{./gI*)^{-I$ /2Oǽ|$jAi?\wy0NpOEڸ͒V!bWrرBs*I,fɑ4MsbgֽSswQb??~^jsĒ#s%ɼ˼'Ie^e^~]I+o9SG}-]s2 lG?A cHҫ6Qj 8#,NnD1T lF9 l(80w`ЊL_ <̠e4*Q͔HXgEkT)X`SaYdZ83H*JX$p3ұP%yD (OSʂ(V_T9:fAS)yZX}wH[;1k3FW6s7, -31M pDz]t/# TB2ү(L&0+@ $$Xve3`2Zoc0j]g@Qrda G|t 2ȱ)e%VuIgu$ g JK~> gbhEB7§$ILP v3I,Bvչ{#I1y@HwɒY$U\/~+z$ gԷ;CC&kuUT"K,3Q m}P\o7W![wyn˪Ӗ@# $xќ'%)SvFι!-!Rb6K Y'Ds{myrI#|"2vƺLZ Xb&LYjD1l*VI.`$0{v5`q[AP,~2%I^Ɉ(җj$c2z}fٱiE5?(qY@:zhnrYBΩ  }6d^e^$_2W˼˜$镳3cyY *U[p __5EZ5*\xxLMXubwnÅGL8Z}UN.pq uo$7Bd@*^؅CpBWC=HR '4<Hkk6t.X8NMۆZE @S1@3R NZNiFl?k|eQ2dwpWt/(x+_LI͍9+]]=ݯL ^u+)MOY9 ɸ䷩ !X&!ik.K͕W1v(f/ cJLH*cWpifM" lUak[?ȤPmɏQmZK f NV`.;hy6ףաw%xst$qke^_+IUg+;VA q$v&d]ϵS:t*^݌_ 1tȵU,$H>H,$ehnLt`E G?ϋɹ>v[JMI dd/,t:2AiaWyO#],;(ݒ$/^DU,q_['_Qb_`?J .+++h4yfN܋ڏ4pwWcƍ|_S / [9n?cssӧO$8Zv{_&񭥬Wbg{{ X]]瑯pW$DQD^l̷m$!cz-}|aY]]ͷjh4IKY$REy&?]DeKKK,..4MYZZ*\kn+!G_8/2/s%ɼ˼˜$y ~C.[4aC~ ձހf4@oEPlaljX`u8n- JS":@|]W iv'${SLj !'h8vq%Y%_,*R98cmXjD0J(%6LAӈeS_m~ @mgOYD,>d+,+IoRnKi!I騕Ԟ¬BMlO 9v %Ùoc}-p[]Cwdq^QDo#^!`4GƼ |Sۜ@e[7(vU?;~ɖd(d* e"6?qjkhe6%Gugz2Y鞪lDr,P X>U@:U3 ?*et2Ui$y@7DYsjcUPAhl+J5sWS8\$l(V ~'ҧ`:l--FaQM8 K׋w|=@%ICbw &ʃs@Z?F ~SU0us3CFX䀱5=V^eʦ E+"xr?{ReVOeNbǘTٿ,k}䆻έD,SY+-nH@}DQuγȩ=^VY]1Hf۵9KM1.!DRol76%VI%uv۾?=oWV~[XkĞ#oƽ=F#QM*!H2Ă>A^Rغw]0̕.$I_0kuh4X\\7 6[RL]2pI'ܵk|XU$IB^{fM /2N*}%jOLqm\5%I춳Cy.OXUK\FA# C>||los Y\\d44M s~Z-WcyXccKۻvdvؠ0 s%9Bv^e^$ɼ˼˼Il$}9"j*`iCv_3va!=I62釰V 8>?Xkzo IDATԦx0$JnFU? |=!͆b}4@p=p2]=N%hd b%;R{B&ѮdG aX^!6 Y$z"c;+UI]2d'Tg~sE吐8vm6T@R?j{!SK\U6sXEuP-M}c0g'ޒmZVt0CzlΘXteL>w1K\E +rY=|ܾjٮ<pk,l}Bt$Bt@a%QDqU94pUmx$瞖jMlXSJ6V @lo˸$$ % p:'!VMQ#p&k ŒIw27a}$V|5K-5&#IOe7Y3_rv>GS: Z.P30<{#tnW}1t>2u~.K*$)rWuw|e@]m&j97BTKv\nRcq$z&)Y_\K+©\~)4J/D\SpH?|şKcg>مV%8f:KW[w Qr- ᅑ؛mk/V]%0a\2>Gt%i8$)#~$ ,,,-Vq`lHI%,jWI|~Tnp_sW[b‚.Q!GWp?.nEFN B,۠[W[Pz]ro}[3XB'L'/~/Qw`,.A~o:@\BYI܀/r: mΊ"MR $mD#&` AC3FBn5o=Ě摬)=IdoZ~IF> ':l[ǯ CUyUQ> @(ł/Ҟ0 UPu/%]1e"hDe/cYzHEChz E$1tZ[߃)yjs9|_ԪbaW6NlqqMBI? &`ڊUjoL쵔 9!PЙ ~&B´8R>tOs}ygyEuootH$]%Jf$fMIbI^}0<9ۚzITBKNYR~f3H7‚])eD =Ktq .f7$q/݌#Bﳮ*ϞqsgOw,eQT2ܿS_ܬr{!~ƥlRAv33cZ ɧAWUaݭ}t}}JJRP,..rHR vm2dOlllLKnXdaan;EAĒ4My&__)2#2<ȵk }n~|ÃV[uq`e$ LAkƘ->lmmh4}va(r˸4M9t,,,נoNCR:[WfI$ܾ};'|鰺4MKRWIbUZ^^Wϖ,te^eN˼˼˃b~9Zzaqr߲v2۰.y ^ڍ%d2tnʂݦkG E%^݅;'܅t\CxOG\?kXW i!A5BUঐb#.. 7;rl2cH %$ۂ-Kbu`VaAsZD # K gxGo=qTl[@nLLd<tx0=G~1Bw!jd\ҎS`hRRW`q0Ԓ>~§piK{0uQ8IY һtA J{Q jNڒe3D#.qڪ%5zV tVkdLP|\f s~IJ%{9}Yڣ8_& ԯG ~J#D6߁G/} N"-Hޟð,JZ$jSOهQ}ݖ$Q9IIp#B$BRʞDS`g&ulweb`pe}#Hj1)CC (Rjs#z|~mE#Hd H3ʬn&7|ϝ)#Gt=7sI W+Ih='8YwuM3xO\.C1!T^+5qo3>2$2L d/x 0[pHj2W^ݗɲhT-AVubWoOZd,N K"I,AEQAAbžfm }fqqq$m\ՎKD67'>Qr͛7KG!M1$'Imݾk?jz*F(xקH0 x"'Nujڔ=%M-I%عl7nn.Az j=KXHy9I WJyyy_v%(MXP] ᢵHT7HBCVZmؾAXm5BYnWv T5Eytv`uRqj>ZE&5oށ5 =Ɗ1%cx]27p@қB$]q, PTeA ?.4 ;(U LEV@)Ȁ(Zy I:7Q EoHS34=SUF({d( o ݆U<$߬d]ɀi]%N=9n*D#[J)JD Wh.H 4i* {  $ۑzEn-LJl?['y5Y  4O!k `#VhDҮஞgb魉햱W Xv&{ڰ Q8XHo9N\AҋWV xv] t}mnjah / rDU!QO=/EpI8{N^UXž$od8>z(%g-kAc0SƃW0,{0vIG+6`h&cfg;$.GYj{/M en~EV;/yI`;L[?`/^|41bU$eJ;f}g3?6R\+20WVԛ{cg.}9_Fdۘ"lVFN\(pؙWea.ISFʳe" mILk,_?g e|0h䀬C/^8pÞ6` No [p U/l6Z79bI߾ȵr{ Y$~x"aOO񘅅ķ5^F\|(>V8Oe9U5IHoa{{\qdI8s>RF9 zJ­[ Ujw{M%Gl)A0}YU0 Y$N&x)Oo) uys-HShWI԰7\n3 WZь!YWsNT)Z_ewcȮ9M[_+Շq/!{B Ct7+At -p$OV6d֊u[ˊ5&t ~S'AeTz!f}=Nm<{5_uBđX΅Ҟ,TT6OB;yH%p'w^, a9ҿ+z!HBXpY!̶v`}Qֵ"+pj6IW`-8ٛ٤SnO<0yHyXvYHKVAa >0=R#/ 2ޡr\剫 kC.ccol,`)(KL[t)b_7W÷r$1nH}hVyї=f<]˳*$`t5I!W3 sH 2oT'Xϝ_ ,Ht3qb tɍ㏽~MJ}Ϳl9 H'I\bE2E=/2n~?pU nK(z}ݻyз[_ZOU 3vjZ< C>k\;2;.7ƒ">a 0 s˱0 T**"ܹSO=ERɯWw ð0,+I(biiIbb9ofww7'\1 r5r=k fc`^e^$_2W˼˼˩5:!7g`+ %N$Y0p%K~O@2N@$5N%9مvJH<" $P o#j %d/.w sX|Re0ؒsGmjU> ٷ`_pUW="9M!0& 7ԷF\W5Wbq*9@##y4ׁ&|gEU ]dQE̊"`)*DD6 -[Y W_uӑfa6/>T Q2&v8RuAIoE{@ӳjg/A;dznTaνUf(Hp]?j4IE"(g#Jo9 gV`O ٢pP,+#.f3qEqoB)!}0и+T_( BJnTa4]QlF$e1n88YGިV fN)m8S#2-&a/SH$^K`bd_@9lJ 10sCVT(I\53ga?$I#|XC(X\%I IZ曌pqAIb}#>5*!H/}f!|1*NUU.n"nAŷr9#E%K[&q>[ĉydNݣdd7۷ӷA$R0<_ߏ.>Irp8MSz)/~ݩ _-aˊ7h~2 q* Z-_pI v8"H ,۞ȃ},ҥK40W9[[ܺuNCZ w w݂2Ǫʈ2r^D\d?ϝ;wŽ^U`;u1J/| 9a &eKFBv:iWTr%l_Yǵkt:~n{nܘ x衇byy@FU*~ߝ$2/2ge^e^d7" QB x6(HnC 7ʊo ⬏D_KaG^ϴ/,jEh`/d'aK8_ڋbC@ud-K }Mԭ- y @WG|Nje&:#KVJbDm* Ho J ,m±}٪ Q߆@u3VyH*V+H'ϒ9JpP+j!e'JjdίGkMwpLM rQRkR z.JLWU4csH;%dpkL7YɘfxJY$m"Ϯ v[3H7|}ARq>+J){k\+-5}JyD,B,p+!ʒ4"$H\ʕ+3ƅ:nK~/SKmеO}-3J$W=v`~R)Ul/#Kʈ,7^ʎY$ݮ^{.~V5u2U}d6~?oU}bA~K̲C RBj;EH븮M\E~)kkkܹs'9cVcoosjj,i65ZU*._`03oq cvvv y4SO=۷sd8r>?߼˼IyyyyP%I_J3s*n}T@Y~Fépziۉ!5`ZG MM@d,ng8Ѡo $'xrg f_=1PK"Mbx0L %$Jh;]AuQs !A"%[!D I 0N!؅e$+"Eߡ+D&tW"c%M7u1.`e 6[ p5L ْ4ஂ|>5˂EzU'= 2+).`]r m%!@/黐t~4BZdFH\V Is`YCsK%}H+>דA ִOױT,eK0@ #7> قk!ꌮ! Rmo&db Te=6$Z*vu V \Aa ?Cڞ"tr7pf !#8)? [ YۆUhKׅ[\*Bӫm b0yYyx}+m} IDAT,?ķ>qs?K'xCR^?]&;LVܻm%?EA+1EU|oڔgZO0+>|[1AnSFyO~|O\ iIʈ_i 9C6q7)|b8d7n%7G E,__qxs<mgU oSFo&׮]coo/p{YlŮ/#HsQF]2rnqvKVyf*cLnv2V+?],Įwv9#I#ܾ$qF~6M~`h4ns)bLE3nf{{;37og$e>aBe9\UVMg#K,Qbϒ8ׯ_lK܍cu4 c]$ʪyt70 $ǐōXi%~׈PXpڵE`O²"0%oxͥ]r] 7 ]]]]Lo֭[Y5 ̛ެP{Pg3s{gZyH">(+b`U9)g2ZdzG 4EL϶yjGFR{0m/wy<2p+I[ ]m c5MJɳ\gc!z #%6ly" ,rFg!UiȶL E 6dKb +QdIQ*ʓ&Pr.dWҐ%~B ldC85߾:wC[ۨu8KgmxrTvgN副j`H$6.g/7czViqj̪1޵Ŝ`kCEXth5?@n6a dT?xꗑ.$|Mn}l\$w$H>ǘ g2 =P~w"I[0?( 8}գDa2o|5d1.WJWDe*Bow@|Kyi1! C n@UH,=ƍS_y]Fכao(HR$qÞ/]4chU2O]gNcY{( rŝ-ma2VMzO5NIZjqDI-&HxݥR׋ c V8ZVmEWm'R|-Id}7|ZY唛$F .kkk3( ~W|3cX[[c}}u eS'`y| G ]wh\NS$Ǐrwo~3R$JURT$"d VK` ?: )2;}ҼD'Y${@zL›7a7@B`?%$ UHwuHV]lr`Ж:DA*=mr$! oWT3Dd0؀ن;J|㗄bp Y9zs{P9mJL5zE e9|_MZJa#tصQ iMa`yΦ@tҫ?@Wfx%r.X!zt.A?/lBkx?\q Ų.<} ArfSډt˶=g/NwJҤ hu$e@qESV>1~V8 :N7*'_"q>|[_%u{ڜHצiD; abUwyKR=VIbUdHkv<!r&)G.a?Y,liܽҒky+ m/;,q_WU^)0]e?O:۷Z,#c\R$eK<EAbs\5oOU,#$v;?d@ƭ BMb `՚!I|hDb4M;7XDwm|$ 'ITkC=T|UlllnA`(/-m4-U7~敲6m\-n.cIye(#J5aIKXd<}cU8H~+B|.H(^7}bb%tx n;nK Ct:9?<_+ *UJ$JUR$!&̥&`vmDE4]RO%I"?RMhLvT[\I]63)ش`DN2<gXoeA?̓0)2`@  ib.:8@SB -Hծ4PB qg2?R0&3" U,{I_*DEiH{ 7T䗄/V2dY$c".@#VP6|<co(&uWel}g@ Rpr j!B Xٕ6UnL)>2O>Gm%<2oExCĂl\2|u@Ai}l[0 $^bN^+s˱,l\;LƸ ~F\j]7r+$C;BH1"4BtO8vd\nn>L,R5C8ۂqL *YRB$wF%,[`od$6%F|-K,1 vAyDvErTYzH,2;Yq2%IY&[Xx +$Gb#J,I2Q8pX6)[EEXf"%`SB d%fFq`fbE~f-119f6%ӳ9ČK%9$)#>'t$h3NwIJbϣƍaիWgw־4 OP"IҬ 䝒$>HHA➣KX;Mӂ  {BQl6gH[!FPNJy䔯$9<<$WKKKE@m_~zv] F#Ft)0 \~c [[[4 Qb Y7%y%}C ÂFiZ$'I.#A]_Gp8,HNC[vUJU**UJUR$靖]| A\@2'Ϲ wr8,I;PH2 Iǐ/9!+?%ΙQMlݒ1@r@. L҄B lDtY}  )݆$UE(SBguLcAzpQ΍}T0ThGH 6[h@<Ć SO KD`6ωbC}L9~[1!MX^079`:S!c۪Ё_܌ -i"d>U5/ Xd- .1,жW>ë`b&n33]ab-fA>!=Z_9H~V[+2& ,I{TŊU4ku=t&; 0u%ni[1&ݔ-0ה Eqj$"m;B h |E_O~(lwW݄~BHQ;_'2TY+pAxrc%a U8{N$ɻWw˔$nPk$Cf-"$VEԥ6pë?WB,RJz%=ق.9^WY/$VĶ$!2{+JʬB$RVW'b_H#(W-hn^NtHL?CDH {dbGj 2Zb[?3OUFD1WdNkU,t:G]Jc8<}'$J>ا%J,ѰU@%(݌MĖ%"cɵ%Jvڏ5*]G2A:&g&FJP֡}(2-^ކ/…iD> O.Ù`K iG l{$)~32:l'~O=da.I !4f[Uz߹Cu}C{9ڲj&wp0_F@oի:uh;WEb\B*gc 'NڵkK:uU8.n[|%Jvww1ưYJ<̳ښ^GQ}:5аjyG=UdeETui6EoZZX.QbK$u%6qI?'\ׯW*T*۪JU1p򧷜l/+H :Րס3M_!!:`dݴ@KTH6? zQH!v?:/ &d LuH;*A,fGBZč$+q_tƄ̏3jOr1 :yXNqWD'^{֒ A*Tȗ R"~bud!dɶ% B䩂UMȒ.%Y,ɰ >5-lUR00Ǖ0ٛC{6u}U@b'p \k5%  QLQ|@yϩ ӹ$n'AIJtg/l+<,%""B|^nIr֌.>c5ɪ5L5QHeL:R$vKm;j]Ax I[uFЏ!%t!A4*tZB(ZM8!$sp?Mh= [g I"Qm7'3 [JS ͖sI\$q\b1Yr~w$Yr%&*T0ux)2oqkkg=瘾L1\emSӕI?UvDM 9=XHyGJ!C-xL+x~ \ɝ9$ L6B}+8$7=c,Sxn!㴟HE$`7Kk֝HOݭLC1: :$Hu8 AbeAi'OdeeO~|_O:Fk9fbiiPMܺuk.A!v+c666jOc @,^/ $F2MZJK$EόF#/O}0$I`UBeKVAeYw%YDI8As?կ~ .Z,kkkmؼ1f8S a\j5$9D%6\ 9-c!I1qmCq\uK^Z\3UJU IRT.-qǧ#C]ryK:z?Wt BTtW3:c _7dB?@4!zXoM$QI%?(aMq!|';^bfyGBpTgH}ա  ݗP k"bB5GHBHd9d벎[C, PCPP=jm+;P2pJ>}z#`y~W]AOui Qё12^0shd.Q02&y0׵/ pՄi)AT~ȮLr>\qd'o2cʎ.jyu˼X0Ӹ)}ٖ(rcb_U|ƀِvˏ)~l3FjmUU2ķM&pI5%3'tOp&FBF"` Tu 8ބdټ4K0DN_Z{PB-O| _ i'k <|!^dH* kv-ݟ=SLfjl}z>`6O]#_@Hҧ$?ũxnZ] k*ܵ =njLf%r<#rYt$1%}EN2/>3|Ō{5C>-h$J]oS2Q8% ڨ1uKX@jꚲ}e_0?Wo kgCzM0˗/ Ifg[0$j ;-wx"lnnя~D~''T6aii,˸}vAy縷˗2>,<SX z^j%ࠨ*FPw=}e ?O}SqTl"Žh%G!?|E9Jf/}K hZFɓSAeˢ~||KDQTȸJx[[[3uvAb,IbQlَOQTATJT*I.#z{GX*!~yܐ IDATYO g5סsvnM )NƿݛpV*#U) 7eV9K22@j;c N7 W1d7i(H1{@A,Cd]%+" ?dH̉0#FqRτ`?9TҡlX e`$9+BQ 1%R10V'Y@.L>^%#yK@3D`^Q˩ {skH`{<( c!juWQX`<+~V-AĀŮdP[-+%z֤~y6x@^چ9yPrNqxk*AY,! @OB1Z)4!Z^!״cQAEvC,efB H?J2Qfz Ҷ}d!NA{Q%H]pZo= |}ngO(!cw"IE_en6քmއ FOpAv1QG[.`^f!TrfU bg·J#99k߂Ȫ1αιX* O̴֐Y;I?Zx};b2!8;J>;/tl.`,,mULdoo%$o;!oLeWX~CpUi+Io+lr| ,?w~988`mmmuC} 0$]zkkkF> (bk}<`h$ N``0𰰻E ,˸yfcr.$.G* AЮ 9}(л{v$[WYk=a ` wL(`tr V2 x)iz0qU,kbdj1pW~ d*Y,.dL ]"J,Pz("N_ Uf- s\63U,46d,=uYBL'@e&yCRI@wI>o]׆ 5j kJ%QFmGL_cgえֆj_+`]ҏl>BDp SW^[ fd |[xIsW}gzVMRBV=Z(/j萷G=uԲa:)lRGBɷ4k'B+0 ބ }#> x6=E g҇eh`PnV j) SXl=%Ch/~\w׻$YKR6 E] y9}`kY]`fȟ^6G!E}z|#.D O=`WMĴ2[pඛKN\WyW8,1 H-#(otl6Y^^.nܸQvI[nbyyT"vꫯm|2YQJU-Z~m)Tsm8<< syV1 Hn߾p8䮻"Hܾ5ƔZWӠE)#`ck_UsIk׮$Ilmm'DɼwT"ǖ~իW}6zzNGگ[me׳{lWQ浸+I|k$JUR$UJUR$?rޒ 7f^Pӂfj<$dh6/Bmf BMH)A>iޮ $ ĵ1A 1&5z"6tC&y d(ٚYaskܧ ̄ +nD1@lʻJ(^i5?I' fI=D'19&ALWCd1nUQ|,)O@:P 6[6״} Z HGJ<#Qҏ -O!+a2TD$z[Ez>v?M OOP`=KF^{Ye?S__gV$xK~o<}pn )ScL2W\ķG{ I_6f4aKue*T̹.2o[r-sBSX J;$bϊó ڬ`pX %{QqʀjHKKKDAa]eAcM4L%,Ybɑ2"ۅcsss.Aٗ$aru6*#o̔s$;!yRT$O_JUR$vy\I/ʯT@C!!tn[Jl~%KH0>6{/A=.YQO)h<pk-B*!3k!iF"jrN*nb%/8xM2)W_62Dw3df-σ{0ͪKČ,syϸ8fʍ?pX7DQ+s(0g[@o>o"1(%cr#vBYB*hXZ->?>@lzeO!XA2T23[}}=$ӼY6>\IZMI:(:=8~tgV$5h5xRAWl& `: I/9,mhwAǾ`$1ӳf$?as2JM]yl$^-&v &vq]ok~r SF^߅ZR`,3#\ +F,dVA A0OIb7>y%}-~0K!j%%IjLj}\$c8u 6tYlӉΆɏ|x':["qл^J$ŖSIqD'4 ײ@k aXJnܸ1wn[g_r !n8F)A$l@˗9qDadm=q< P6PKYY;%JQ|;ﳴh4!GܺF#]VX[mmmQ#AqwLk#z ;mz=>qcɪʮ,*SneYFT*U{$JURw-M߳~' ݥ'/9xfKv&5h/L  `L`IUg$8u'GP6!&%Sߣ rڜB'Z"R P<@kr@@)IBGx `/!jAP\(AF&B2 f, Ui:J, A̖ DiaPeI dɀgveKhdn% E9Ti{ u7ŌQP3+ib5o"y!juY:)g/fM 䐪>L,8aMWB1k,9 <@NhL?fx[W'wT3c8վ}]P%ݿft$]BJEĞp@NЪM|r7 A+q<\T B2'u\tMIP Y;^fOpQ8wYI&wg`x`9$AZBL>ĝπL 6sc}kOW] `A {m U1k/ Ié;88 `0xǶQW^_*'pH^زs.IK܉?}޸Gtxδò}0p'ۯzY$sp>M9>,#IBfLvS3b2ׂ{cm32 1Mj!JLM,#?%we%R-aV>@nKF /Rq1JU,C%oCr5͵xD\-}r*l?,a2l@'mľoa&$v )Φ#IS{'bƿe^p$;!qj0?;@>ӳfk0fJ\I9̀ u6|]t8ud]Etp{WdkM&Q\_.7Z>1wCؙC ~|e)!$ʲKjYENy?N9f3RmYĒ|,OW4IYZ'8i_pW\it|43?f8\.AByNOq&+RA۵g9wIRfuTd<O)Jv]F%HTn|;vH$]%\KÐ~ ^^^֭[3W=߶(^xhT$fв$ۯeEQqu6Zmxe]d5vxxX$AR?W HZm.AbŽ옫JUR IR)IRT$ɏlG "y罝dt` f~~ :2I@QNL=VS(9Cn{p [O,i ђ3Y05:U;ඬH?e@'OR'zl,&3c㢞~ w}TlHJHסkaC`0~ 9z`Qp؁z #꘽G I!\SCPG-_[DT<֚˨+AL:ބ~9}GC`t;塶y~ S ؁bk]je'i6T"%nŝlġ2ְs(?υ03,bBvK7{u؉Vh jKBJtZV|~foJ %S%8ᣐԀ ׊^iO&&A=ش?(U]!yf;01߆x -:t'ކ8|$qa_WExwKDy6 ~Q?`o$͙ M3܀TٹYP6d1=+>\^,_% xINASgx%XM}[1?ޒA ;Flz^dǮN]݌ KdU?z穏*q̹ J\R8ëOfSAgq. ޱbm\%N茉mn=~+-Xp.rUwfs2˲y*-Uf?x.h[iJE?-hEDUXp'I\K"X sy'"bZA[e%H,>m#w9ŋ%cjZx`0`8rpp0>,">zg2uFԒe'N`yyfFc kF\{+++Z[14MrO\,ƷK^RaHAbh4h̽/%IRTٝ_URG{$9q[;oG2L"G^KYl7Bg] X݄Φ|~sݷ IDAT:[po Iй7.`sR_ቌ<>U|9Y >vB_ <0MEuP 3zV /A~ gh)A}Em>ʮ@|J H Eo}DW>V`,|'u [-kqGfN uUdzA@V@&ݦX'@O 7$ nF,* [m$u!gV5J|-Q_7wVD[qM7咓;pv8ɍ!;*qgc I#*xMƌ p[|τ:a[\,5/' ؁~*M !( QGGV{$ :!}kT֥ڈ6khۍu\(xsK2 H\cpHL#>S2. B7p}=t!~O3%(?ȿ)fd͛ -l-R .r@l=$sZgt|ņN|J\ 2gtotAmӞC &E_ݒcq@s@n9˘iH,#fC]{(7wӖ[jLoֳ40sH&r2O}X/k!T~M%vGϾ7˔W.2_᪽w$M=/mKsVO߮P*cC,[[[?o2p.1%?Me*J$vE?QslqA{[GKk1Enm8I0, BYe}J$4M d1p+- q筷*+ (*!^ cϦIyW^e*Loϭ<~nՖyۮшnK$S3Kz/RRT*;vi.ۉ /A[goJzn'dV PyA!t s]H8> ?dS輄dd$4п}3-( T ?Ml,n\㙎~t.*cOB1 @zB4*"2%Ly=93!T0 u!]CCDgb m$-u& ac7%ge=H]XW5i֤ ɴtxG{Ld:20x؀%oC(YMv\Dv6o*蚉j&{ ޛr$OD êCLD`8w1}@@ ]W6!oB֐6 tQ@HzzY!~ׅ T*R2mC|X{q(D_w>u6;B|Υʗn0*Eccz{p=CX߆Ӈdl5GAB|Zq&#;Z/UV\)xSǾrvgǻ .zjE< X78 g99aIKZ{kZB$0Kk7~Ib s,We[b69ϧ_=7!\%vwm%|H2x{jmLR,Lje)<ߢ?l>Pn_Z|ٱeUK%!:ܡ{Ls޶](lF w}ɏx{/q~ba!nxY7Wv)>\n!F$IͿMe%PDAPJmZtDY y|@>o4SvdQMux<&K[h|mk;v&8zdxQTCTv[UJUc%r ۗ'wބ߀$aN3R0ٟ+p:9}ۢ"'$b)Y%h_Ffdd+X/:mK|d( C-'[6 `P 3P} yGxS!nnDsEqA`}. W ҌPɅXTfW䉳&ɱ\'FYpJvxnmӆznb]K,vsfZ[옜K~SߤZG #9̂i4hĪI3&s@+/h^''ظi6#(u9'ӛ`9AST+Zukz\ Z/j;J^$ooʱL&8PvL!XUZiup[1w5\( .;:ƙ@=$͞p](ɾxLB)m^ I..Μn6#! eؾ~~V3'a;v)<{7}iqqFWynx ;Cxꄒ7 `jAӡNky?>W8}kt#Xc,<y?΄{ Ps.Ibӵ*ʝ:psBBT=ϽC_\~-]Ɂ",b:L5dCg˲7\_">jgU&׮g>IbLis6OKRs&S{^MgYr$Mx|/&I{k$#Iy: f$?b%s8?[Dž)q>%\zXFQA0KKK3ˢŵ3ę%z,//$LW*UO=IRT*?/(zOق;GW^ kp[ޅla3Cr&F@r+j5 xEg!iM2k ʯ@HG|ԀLr9r'Jip\A 2}{5LEy @h(;p:(d2KZ5dQZT ),{oMM_БcE#%TjEрrb ^oiBpL7+NBǾOG*9FI2ZRRhD\T|Iۡ818 ɠTeOj{ojLd\|Od+*)rSIșp}נc)b u̾\#k.xYh2kBPʕ-H2t`.5jyM2)µ?Q_#A@- |(6~&<.c-I(|}Jkӟ18$%'EǙ*nX/]]࿇~7gfH}7%qʲG><7q$YIE}l˵9`u#\LHy{% HvJ Nq㵃{VffFc;t, *|Ճk<6u9c$_}*GRﵜi|zUff\*Jdg57m`ZafCy|UOTI.hkA+W(; >9#6(\  HK3"(B̑2&UfsJˈK(a(qI Y__͛$IR$n'>iHpTjZѯ2vGXKW{N~חL첿NMк!e-z^t~-RwHJIRTGUދApgUq>,i;p)w!.f 8!7M&4zs-h) BՔDs cgs+ K¾_mLˊ93ۢ hy` >ktK; ?-&B#{K,%|UutwY <j&;1VaNď;{(V] !@`U.:(Q@C&kmA3Vb?X Yݖ -`f#7Xk&mdkf <*c ,m2sF]olHM!.8>&t4Xf&`I 5v?ɛzLT ߌ ,9!= ݌͎~nOֹBpQu,kٚ^3u!UT4DFhIlShxI h#cP6ۧagv:"n*Xp-;Choj^w mx`c7a bDق'7 2C0N˼ ;X05s;K)͂evD]O4YCFv[@g6!7dȴՒ-]mܠx,'IlVSwu_qoW!$n?Dߦc?W_%F̒`>/wkGj 7[ƴ%-yyjG Qɒ{ *.QHn;[{ZbNjHz_|en'H$x<.Sw:j.aX-Rܩ>70' :FTA2AP%G*%H(b<ϩVxrI\e/]` 5Ē$geYaeW5l<'%ݾׯQy2>_Y1g:|ߜr {~ڪJU#IRT"I~dÙ_R% %}I,NPnr Ċ+{ hƉVg(0Ss6c3CWː$ XR$$!Zc!pC f~D MHd{A(yy&Рn='-J Db"?P&J`xIrL |6TmUb_U.A,9昒hhBaM 1R% oI^eI0+ځĢǵȉrBH9_POOyƈE-n~Jd8S Q +Xf-V/}c,cdۼXy$G%}&%k`ي3^ߒ'1DoC!Zi&%DʎهcJn3 sRڠŖUl?9vC$Is/\H?[ҔuhB ;=v2bɷ#9)J?{$u}ν3b/ MTb)N$RNQʎ*'˥T(.RX[G iIW1)KExž=~G_ݻTH"TuuO8ts{)*(چ8ftUMTq7F+Jg qqX(̃B*f@R Y,i?lK aH1 i0.d]yldZe秛 sͯ7FL[H2 bLrvc1;$bČ(/><7_VslTb, +I@{_?YĺI ,=d$> X=!d^w k JfܚU~+/%myWJ"[-2fYjN2(, Ex&(xus"z$3$wR^SH,㥗^=aa_ `4M J#w(rx"O)2Ijr̂+~O|K_*KYL^%0ۿ-mmImmG J3F euֹIA7flЎ!_{<{ID1$'!z\.pl@ݯS0q ܺ"4#*D&#!! 0)ڐ? 鮈 r.nI>r OI]kٻ0lcƉV!} ~S̝:ek Z ȉ$!ET: X^˰q:Mh.^AٶgoL¹,h?(y8s>5ewn!/=3¾!7- 7<<rqS?GzTgt2βWGLǓ UBp$[8 'ے[a:VVŅ U T UeBP2YB},7fJxG6i2 F?QR*ÃH^~?wz^.фL \NdxBN"%va{$LAGŸ 8qk"6ZrȋX p[F$ z1y7y7!:T~(BnS1dw{׊!M CDd[C]WcVĩ>qS@Dv15> dp?eQ-\K4~)09(^@$"%$ժQM9$@dVŻqH{*Ix},)AB"Ekɧ5 lQw(xI^~pm 9jK_55\erDwCA>ɼ(T$r /-("bB8>\}E\21ӻ#5}0Р_W2б7ْ:t%y K^>G2gk=$cZX=Ik/oHcb\ZV>ނ~GE*z=h$:\As :VĉLrX|6tׁ l+ރ6eluӲ?B? g? OW-C2Q'IOo5F ԣ@teϛLzAqlqU{U{:'B:q|+<}RTO bulᏙ0YN* IJ$y@>693j9PޞMBoUc`=$e\۹BALvc)R9=I T@e%@%Lskj L|9> w9ҥKoWn+,*0bk4]ZDQ5޼ytKrX8fRZ~`P9Wo?wBX31׹zĶNߞrr[kQ%%*5AtU/">DS΃89|08VA?g `>yR IDATO`}}VE$ E[E[@E[E[E[@?t{sw@vp洔9.: y .akE\#[&d{H% jCwR&@a/>l@6I,6 up ._Hk?ōqCquH?\dOAC(GT8^BE'R#D)"HgCC2.k9sVqt &#NKs+r.EC@DT Muw LPBm?#:0~)C:Dω%zH`x+ H{RR-q rte6d$ǥo*N贴MQS`1TmM[ aƙC u\ @ ĝEChSW5I<Ѡy08Lztq&%68Dd.2>f0?"ēo5Ҡ@QS.e :Hd'% a-5$[Z-U}60jT8uW~zξgQf MC}Ö)@ng+?99rn -6a0)ȃʇL>,p{d؈iO?Bw4)1V ubEJmYwG̤ $5O+3/7f7uP͒}G3qn\,SgϼqnZYyU 6qc J-3΂z3L;\\2,#zhČ#j<彩Q2Oph4kH= Ybm@$&EQ}DQ/\ny'olHӴɫ˜qgΜ<쳼O׮]ߞ(;iR&^Gw$ ,0|{tN#,MjZ?ݏ y e. ɢ-ڢ/!Ihhڇki"%nc߄Kʛ[R&ǯDhC'lϱSnCwNh2 MyXI ՈrA@Hb=W@dқ"HDM3:UG!ė HkƠ.Y$HEJ8-#ix#CQ.zwT,j ԙb q'RD 9V"+XMD:Vòhkp}Ov+b_Ӳ[ X@%-AtX$o@$ęP_b {oCQ 6H#q=prYEWP dC)U*v´o"^_;Pa-ᒟHsF\c2f!^jS gl4%@Ցct΢<$t>]9.|/|ɰLː_@J-!GKI6n@wթeb:idѺ-ŘqE)_s 6>]~?4Q8{~$?|'%8F |ۥwe!I|.:2Bw-#W[p\0$q|Xa î Ib]@ c ! W(R6#QٌST@0K# @WQhCt I&q`}JveL;f|n<0=MSш tí+ĊYO89|% }fp`0(qe=9^ʭ[ Q?xCx!kf07x^wVIXj־H#09|0??Y'OOFk?~888(oF (]XmQ1'e*d" ƞl5>%˲vx?| _(YYYnO(dmdmjL[Gl4\wFS*l]M Ԡ[l݁"vV C=&w#bwtO3^ل!uE\Hۿ(b;m#e)B~K@Vw eq!+݁.^]H@LNW!_1_Q@!|FE a}<iXAЁ :q&kqu\ZuԴl@C_ ZE&u͈S~eH~ {!KuEIH^NV;- LaoAqEK뫋!:Ѓ)S SPp8 !y!*#vT'8EH ۀ9پ@⤼cQ1Ǵwx(qc/+fI8Ђ΋d z0 3r!#_uG=@@ x@ASf\cTau8n@f=w<$3~ wQ8s_w IC=zx?M 3Kd?{s.r#7 Q @+@> l +gbDUN++ yzE3!I1n_|NUNJ`Ru3;$ݖn=6$^`A\Q1! 2|.*3}.(Z(t"2t KN&%r罇[ҭNA+w/ra^ԏ=?TU}RE~fYxs)kkkE`0(Es 6S Ru޳ɬtf 8| y\$uf#.{2aU.2zs(l}?V~ ۆ2!(0c^w%98/$)?G[b,sY^^.f Hhh{Hp,ڢ-s0嶮qkg_5Y[wY`l @B1lF xPDN{)W]voƎ||Z]ٮsLf[ŅWTWHrCniPhGX6RGM{[ 7jv}}iW4+,0ە{ >7E9%^j@xK**3#"kоэGDL~T2d{"NaV{\?,yCsEr\>RNJ># qPmny+:>@"WrU+:l薌u+߷1ru-UR ~ ~KAq8ǃ~E/uCP@8[&áci d3:q?s#vQ"ǑY7xa/QǤp^-'}aL$Z]H#O$`1y[`d%'OפWQLoƚU҆ p :ZۿB O3O0EDR goωR||$mx{EI샮 DXUn<$>@&&_n~A}L9rLN{P hT\@ƬȖE+vU·{Vɯ,<6Y`y H^L+^';IPs H<}bߛy<6a9Ɉ\hu'\xe&$d^ -_*eF+Gv<'5ur=u=#ࢸA)yE'ԅLrN'`cUG Xix :<g=8Z-rqf(Z14`#1B/»\] "g<)܂DL P!Z?z)&Wˡ?$1y$g)!$gY嶪$E0~މfoc-rl@$T;F#OROqn({P<7!k03bwG%Q(CKqd`^A9!7 d9P$^ In'U! 0s;vcf=`Ƈqcjߊ% ĻzJo$aIxj3a퀉ubq:Wz +<<ph4cgiii* EQw[x}-,e]=~|~s!(bKv/Tכ$I)jJP$ F(h4.~__~Ţ-ڢ- ɢ-ڢ-YV[p)l oo $a߆"A&eHcj5X~UWRg+0T?a)XVg%BS~P?ZҽP}## T$c#߃c=`h9^JECKyd ?}髬 d@[<⻐!>&nC][hi%njiBQ%td>耻(]cYȣ7!_f;&ʹՒ$Ul'_1}@_gby} ? MVįJiphD\W(W$Zjkc;.H5eqDIA]{I9y0~Cw_Uh5"˒+D *7O a_-usu-hMqIR2l33YM-~$p\ΩcԎasЩ,Zf'Ӑdf. PB1Y:"n)aa Ј@asEl_>tnƬ_B8.=hr{'1u߿bUmn1]n+ΰЈ֡0&{?cKOq +QnaS_O!IXfVQ" ]$$f.~DfFX.dɓ|j(@nܸsfy~~?A1u$ї>e&82 :HNDo/wJx! P淄JwH> KyPrnVWWK@FUhTh4[O<ĄCj$y2p;=$n KBwS?7mz^C׍F,R"(症s;[7Ţ-ڢCEE[E[@wfM<~*ª|xA uϠPȴ*E&M1I?!Z q_wR*?%*H}0ދ K%)#.p[zfұ- CC{%НH*kX^u(tׁN@˜ ȿpU-.GJ61+:}޻X}ёk"w9ٍ+u^)V u'2WFS%))z!LVqE5- 2#8aitGm--9D!_Q\ <Ƹtw /@cMJjc:k90.w[HOק?+?W[nK?}|!^V #Jf3 z* ~TmcoEϨ}&3Zkat& ,`HxÐ,o\Xzk?[XfKsޞY;';2䙯$wkz/1RU- G}wpn:fs@o0y_}PLgU?N9~ϫD_[NIĘuu=Z tQqpp@כp TϖKsYG=pFҰ`PB;y ˊU;vV!u+6:jNm0<(F w*i[oMd? ]Z|$!w R\~,)I9 hܖ%Y^^jM@hD$/Յhh hh#pMg3y=` iӯF}>pXKՀM]չQ@'~Ɇ P/Al*"G d*JݏYA>󉴔OT\}~G\>e hZ IC].N2p5DE(1WTX+J]S ٽ̺ؗƒVQo$SU^HENSf;妈ٚVfvq&%ȥ4>䇠x$P#_!ۀ=6(N!}U^26M_nkwZ.^8-NT或Zױ9.;ڷ/PY1ś P,97%y Be2}QH^rSqu=vˏ܂RRMP_ӂsTlHK+]*nd&=%\_?"uz>q Mh%D7WeLNhyf]Hk !]!ԡɲ~ߛހ=dU2s/ߟw/Y" c"0@cEq)4_o"̻,rV0Nt0cP95kRӌ4/R Q2s[/e2CلqLjX`@ ~Y227?{7J 4rudL 2aH>DC%qሰ*@1W:J4Ml+WP-ڢ-,ڢ-ڢ-XD/7lDpB}Sٗ/9Ae"z&ƛFCpEK453?B4!_`#7#%A=4AևhrF%-لJ>hz>UFׇD).N;\.Yb MAԲv"TKi;*|GUt Pl][M]1ԐPSeDś7RRQ2 dŷ${=GZ>pCrY%ʵ5u$;9.[]S3p0\o,At yQ򘌝[U\yZhwS@䁸B JѮ 4=m[ CCa~=$dKKd{UX:)\ߑyN( R/M v #Ϧ=vT\G/Ԯef!lfnq!l|Ϋُ_|\68{ƤͷUWُ%>3*\߼-Kh9Q벸S)jS K|(ϧ`d̓<$z>+4B:os%f;$m3IIq;kI%3k+џ^$qT0tIBܼ,h$ʙ_M#KUA[B̆a 43,23lLZ1C jx1vH"ZV)ܶ?AI(n wP$pd^xv/| f$$gZݩ{%>VWWyf%F,--ϱxe9Be>EEvԽ`] ֭[>}h=L8z(Gü Se_.+5&5k{{}]66u ڒYv4 8&M)'˗ Vjʼ?&MSόBXE[$YE[E[@~7$yc[%'RiI7C*/{<ׁ͞|ߌ%2eHs7C2N.sėQ$ࣻ lHsgY"+pe=oA~@ۚyHx*ʷsIiڐPYOr .@Dې/\Aװ%y\H𯷯ῳh|qUDup{&"{Ѥ vxBҞs-K5-!*_c]皊 #6z;8#+5Zj&+Q*|E^l;]W yÐwxs⼈WS'%Nw,Jy)b/IS0NK\%*4TíyD =auf=uwB[8G䐟)A.bERXb*;dL xMƻ+ײcx ݕyL"ךz$G .4 DK} {cpM)9V! Oc8y8 8sDk+9_+pm8cmۊx}d]V@l+Z Z1BU9KB8n['ԘvRZY:$$$PRq HRyB*.fyǵ)}t`DLpwl@A>,f˪m]%MH,$0ᢋ,ytN’VkKkg|cf|*vYtTen2;Vg8"txHy0ۿƂ/!\QJ>Ccv4X(TuyYgYVJӔ~So4y*So5V0묭1 & y>n ?w< Cm.?CX7{l~pNFQ&_'Avy\φ{h2\Ǐs֭۾BfKmlՉdccp:;qqsExTeᩓ( Ţ-ڢCEE[E[@w77V 0yVӇl5L)ljrwEĀ!w> E1),{Rɡ/y2_Ozѥ|V]lp /ŋHMpGKSw\ quBOV]&{HBt[[ocH.|@D$w3tP@w7w(N" Y 4N\<')暑 lABk |MWф'Gԡk?w[o{/ecZ,Q].6FS2/QJzF;L!scWY@;4K\s>>fi{,S&]ldq:zbmzGr3gF$oj;HȂq 1~kˋi HbˈY0ɻ3ޏ&0~jn9fLgoy`9a96s]jVhl6Ku2|[:įͯjeOxX`AQSAVS1Yp"l7oСCS#DS"h4x|3_2> '_*UFˇ{aÒvw6\ݻ^<8~8ׯ_/}$)!+>#dXXaװW$KwpLC0RoF J&~z>58ÕcG'ɲuy-rvΕB~V5y$ Ga{{{朱 cyySNrʕ2xfqӧz !?x銩?`+WhZ@nK̏?xhh?dmmIޝuA&]R1Շ[`3kCu]{ܾ8N^eE?{~xN`H2GzB7rppQx Xc8 (%'.Cґ3䈃bJ)xH|CrM v!9 iMR9UFPJtT5`;K #U$'%ܾ_(X\NKX7^3gBdW`kLZެUbV[K(q_ j&Ti8:|ܤf\\o!/d]$}r[Έ +lG?C`Q&F;J9ꦟ|;ft+tر7vX2cV.$v8EYB%IZ}NUld,7O_r@yFm(xNϷ4uHW[Q?$^b )♐$teBQւYĖ$U^ DsCΏ0J {uvvv&!#a}}9ͺ;W}A 'OҥK:t|O,@΃/ZA2YZZ*$ ܂sxUKW%f9BX2 lmmA,mzAbڟ??'HӔg}{$IT΅ZmZ_*j[9W:hZ}FJ-7gΜa8ruVVVʹ?7xE[E[$Y8ImjV=RlɗK"~^ކ>leyKE6"hп."Oe2 L,vW ǠyG{snIOJ \VGC}՝;XdLW櫢C4TPjV <jD,Mv# s(+7Uz(VE cۗ?rWKI8 FR(NA_S\o(>W5-v4c ڧ>ݏ́f"*q6K.Wh+ Q3%RA ɒzE+qsB܊fu7 u \Q @!ױ4E'%: v>Wu(vh,bLeq=aK_8/(vܧ0`J\Eː|DW'0, [P|@9H^—)o1*eȴ~3/)RBA .釾 ~2Dz3.oXuDm Kx+FuktE5&d Z︓J$BjpXH$n#^ےUaGRT &P%W fv$t $ɍ_ ^$by^q]UgAyWџV}qY&e> Ԟuݭ$Lj"o-Iu6N4t]~5̐t1.j*7!GFړ.p0&>5y,dUМKCym<dȉp_<Uu*dK~ b~¾g^-W$ߓ2G$"G+8b>P?њdi[ށ4PjS>T^#GAt\uȦfP :yM=OƀUL.h0)@'w Y[E#UL#%M!Vༀq%eQ>r0dDDQODb UOQl +B@KEe@HAG~A3i"}nI/q+|!uೈ%WG2H !aCh+ꆂSDEeJiR"[H$f$N,q\_1xUD]`\Y3];QH$%x]]'턫mSV05!O?NWM+`j+T;lk0RfDë4`x*rNzy]B Cq>=FeؼǍF|nggVUf}__zޟǵkX]]}V} ˷}%(#vFQ/xW^y$I&}-?oߟ8#Gu-ڢ-,ڢ-ڢ-v- 3z^™`Kl&"lN=B=بi@]J[eNG|ڸ }hjDWǐ"@&c51tp*P/@,*v8-Q{yu99 AV7Z8BK: E$7-nͳ k;8W ]G7s Mv7Th[YdTWPt#թQi>HsBv ?>Eȯ" T)|4T^!,N_ ; %.'2o>- z w$!=.kH`HT(( *NB1PUTV)=RH5[(Ω`f*-AtܒkSX5園=HWsΡ>)߂Ԗ:  0o?V@ @/_Խbگp$E,% 0O$C\R⢼gŒB,tno׬[%;HlPnU"xA>]8 ] Z”4I bs:&~;R %tXqܞOd#&C<4Q0I8%,(1G苪+.qB@OAbۇP+TBHs pP IDAT){UDz杼$^ m3Y"*!Jz^)h///h4X]]-0}fmmn[ E!IU ؟;6H\$I\JPbOE@s;Pbc(YG jV`0H$,pI?$U?DK'ܖQiD^/҄j0~^:Gch|O:핟-,E[E{@EE[E{j=@@q?+UMB <Fw妖Uj`tctchCmg-+^TIUXOkR2+݋ Exr}Uhd* =%Y_4T+ u2<5U._\K/ k"+Eu0 ,8PE}c/@ZV˻P>@GWJx rk$ݮazZr>k"r|/*%x\BK#9&]pۢ\ՌA.%Vd|.v!Ua)cy7 &D]D1+PoBt7u Pq{]ջ ܆m&&35Q0#,X;|y .}_5<}̹l{UY?ewT*橽Y 4u.6[^1-^!P|,%d,@ay%< >Nכr .Y|^gyy܇-Gہy 6\|5zPrg1c$y(C7_nNȝ5шK.MTm럷:I,}+ f7nԩSsžn7oV$t.//'1=zpXZn9e8QO?]h$hhF+oĻF6&%`%0:tbhGpsiKÉ452t* n6Vr:1r=+sDs59A^Ĥo@ :t7t%!=L5z5X=P1]E7$/$5e|г {A~ⷀ@fޣe&$GВH)sz~Z8܋|SBC@)J[꠸*?ú߇oEAXG3Rs.fm8(#߇e3\$zq]3MnU# ֠]ueDkXUPP)Vp$} 㥦]0a͐mq=pr(֜'}yl2$aEћ]Ek]^98=ђᑎ>Ȝ<QX xHR&3ݛY n<~E|%%M຺]RRak}R".ݓc}0/t\s.5E_ |2@l[@V?> plu~$EY+fRcخ3h7.qA Sj0:i E\ [$߭P~6oP@5$&n%xe[V;'۷G83[>( s 02PQ9wiS^~Atw$u:Hbwsn@6q +++%o_@n.ǽr/B7_qu6h0`Yw:Wscsɋ/X9 mE~VU-nr[jn RWf./mvE:N5-X__1wse0)qWXPUۘyy{OAyy9$yzk]X^1| V$ (BG{q2#!_K49B *t.^fJK~IV1=4A0C:-\ʚ-h_kAٺl;[SBpCQs^4l䒹Q7Ai9.?Q<~_ETtLNLn:L9[P_mP7H,}:ZR{lHK}o0WUKK}Lfi.Gɸ%3ݓ>m)f] pg q}j1)oUW qMש(2ny w8>9uS rVWL1y0CX@pL}@.L[NBFY.b@/JNvLaS"kR -ӌhջлiWƨ8e%<oB~HM;r(i!]UX@wcKVZmKљ?N?Zm™extc/H7Pn+1M3G3( _)oEI8)Iy'WtE:@ₒ:*U:uXHbW5g ܖ} zbvC}+~![ɆXGEA?epb~[??znRf ,VHbR:~]-7\ϧ~y?v~_*-sun?-sWu碡>I ܛd~ޗX'Zqu<D{B:W`OH Ix>onkN|(#t8<(+r[H`r|nA@J׺܌:x; |;qX?VOӴr3I#s0+z܉ F7.}'EԗyN3O^Zzl=(NAzsX]ݫ`QSTy`>.@Y|GoT@Ѧ#J{oGly=2?i,S8(%¤P pZz?WScsHp]Q x,@r"uLܚ߄IDNl;t_!6dn'\ MZ@ՕV…_J+p7ݒo9IvȰ3:$=3X)>cE`L)KaAQfIbOCv%=A}L[jiA3e fgd6춋¸?}B|'@ư HOT@G﬩rFn~t:Hbj:'(jי1GdMbk@IGqP-RϔsL9=C)~ O{𵷠f oz ~p.T?v/Jth?.w?~|J(޿PYPć"u_|qOӧP6t1fs\@gy>q(Aev[u.-Os Fu6  V͂!{9lunݺU3ԂDPnW+%iNA@ kƗWVVÐ#Gtp.]cVVV׵v*eڵkܾ}&SjZt*B0 yt:?~~k_\y$yyCwu "ԃ. ߰,C =Ƭ jt ˳p:M?\<[A@ femOdcBU079߄Q MUA 1]#$Pއf*P28,ѫUX]`:WĊ>4.-'%*PP+Ԓ_5!q6{Dt--e"(iy:{ mFJˆ&U(ok*+%jNh/+H0|lPˆ E#G&.` RZ*PrDe9&4=}% `0I͎OCfp FDUUS3vKvҋEK$*MW 9 udr.:M!YGKL@ ⁸7jؒȁ!*eI_?o e&V$Ux㶃HIk:ѴC"B@֡NYBt$id MS%۫`z!el*IȣP '{A:Pu\;Ie}EK=rnRʅ&}HBr_l9`ć"uwa" z?/\@z@׍[^wn3;\Hvۙl .Uz@Ƈ{:Sxdt{]& $%;o! w9t?󮃩m$AwI=!I ]!}$F[,=ô[ZwݱGlx[6ɺG옽B]avG,|:UܲM~i-+}o?Ӭ>av rBX@Vr]rF#^Z9|fujqLܱuⶺu;3(Ð%po_c f_S@faO~)ׇuDq<677 I8惽}HӔNS,yyCyy9$y?>ۓ[|HnWgk6r:0u nw"zݚ2.znфMIkDeHy%(L(Qa޺;ZTĽt6c$RŘ"Ya.MPŤh"I6DIE]&WDz)|d ?-n*sQʁHvpBu8(4՝aD*Q dm))-u\]#3e2v(dfFFq_kulSJ7*2j}kx F] l m? Iٰ)RdArp:(Vl (x*IR0P1XXqLQZHFg9rE2>o6oIH2/5o6ow<N@Ȍg$C~-pmIi`o[2)4bBLI驆 3k~ΫMK)q l<e@q +ZB+8Oʡe8.lǑ+vDi WFy+`*pIt7syOz@h  vݫ*?/01ش'hF 'A!9s"4 dcgȱwܡ^1(lOؕ`6^|X8n0˲r,|/ " cc/19qK- юiύ_C-RJ!PwJ)RBsD  ([2n]IN` IDATBс%mգ%@Rf'Xpj wA4;erNF (숮H07C ߘuH)N2,Iϫ8ire k?Va8I=g@QAiloHZ)ƀI4o il3a)nW.C)wY̌%? e fgSVlX %ufPzv;FUph%\a)7. (s钉*/kև n)u%c⻈"o}n=ˑg anV LC.CVn_ςRf9pPt~$~{}h TSW\;lq9) +x8Be!Q>5-uׁ%ͦؔ6 ڑc@8 `Cd$|ۈS'pQ?YD벫 jlADx9 D8 WW$W#U- yٞ̌J*њ`T2G^+nӼIM؀x_c Aqg!=HUM`D2._p9)iPr85Q|q ,5$)K$hsL|sD1$1>р@x}Dc{L0,Wfy:@{lI冚5@B> f2~FJU"{0y,u .Y)犌\`I ?X0>+'-}JԹ\( #5+eDıąoWL6R&ZGNg]0?}2)-:4]xۛ]w|]g遡f:{܅=7´ӗy;A8⃒'O^A__6+z@LYe}i4U7(*$Ǜ$I-0۳l:J\@7#2T =|X nHItzs Ir[.e$hL oFCɝ;u;$iZԮ߂U\r7nݚZ{Lш^իW)˒GN~[x1|LZ| ÐVUG\@(`cc\Vmm6wۼB|nVAxɦ)݆/Is8YN2g6-YwR%]Lkf)#1bbSƩ@slC\C :q*vY_7I2yujwߴ ~Fc3#lILJ+OiC#qIl' :DfZWWÛq7dIe`. ?=A$%`r5vC(~`;L{rHdAP>s{girfF #+pGu cu|:$)g~@IQ9"g}wσtܩssŇ$.˩ҙv"9$ +_|wD<n@bG+ۅ$n/';S@A_h{{vg0rwX:Gx]$}ݖ ji$Ɏ[㥮֛iV]FG ۲Xɬ^vuWoqwۋc0֭[S,İpڹf]>(}6EQpȑh4F;`IS.$ Clɱ(JnʯN Çvy饗կ6o6$6o6o6$oKjtr>!m$ (.hM D=]iW&DHC *lC7$AR/Bz_z+RSDdr]$Ygd,`3C`E2[ KQ P-S: zqI+xNʄōUlHy04#2@}xj+2\MjuGV˼2)U>()dH(_T7s6b{Šd=)ǸB߆fwlAyHw Zl{DD|O%zi١2TC%a_ t>߹I ^>*)JPhٲT[j-$+(IFmSf (d1MTT+_1Yc3cTg*#ȟӱ=cacyS@\o2e,cQ8"@#Z~Z2In =oq8GaCpGjz:+pvvO>@'0'e4cb3ɐp@{O;荫*( ²]_퇘}$;ޏg /l)mP,ARf3(']9Ht,'-0\ cHΒ^<\gXJfrcg`s {@.UxsɅ,'I  tmuopނ;g\Mtz?}Ƹo{6N's챻uzn*9c_B?${^Nw>+– K=Z)w]%׭Ö9PĿ_"&\0"?kp N8Q JsDx ~W~e1+݂;Wm[,;oܹ㶿*aeo0@;v lllLqrg & Cwt4U%,ȳuؒ[6?lV~Tb:oݮ1o6o6$6o6osH`(\˕2d=6d[ffy!y)@w$yu3XR6 ߙ AtÂm>(݃nlRBzSE"jtTȖDM$S0@tYKGz3!KuoR֨h+):?۪]վS82CʪX?J&bW*x=R }X^@:oE*L H]/cZr)z"P})c"Y \sJ71+Z^giϤ\v7ı)H%t)Y'/ 'z"' =C 46|"{5}=OCoݞI" x}cvyN:_<IBi1ͱ> Y(Ü(8HDŽiN;3 r- ~#P$*7a_js%Il@%$ի{YuY(..,i6; Ĭݺen?&IBةQ_c'KO<>:$ . u1*fdN$Ih6y嗫14M=ZuO$>qKe<3 t:5jmaa<.Z-:N IܝǏW%mmSd^nkmm_2O/]v\\%`ݣ^"l^&؆E AK*\G*HI@ 9"!H\G}'UpmULxIDD O QlBJ%㉞-H[h9 I5|>H-ZbrOCv.,m D^)(^_h~T(^E瞕k !!9/)d(ӇH26mru\HE5(XVZԊ6Z, u&'"³1c"f?N\+YqeKF& 6FK\d ${8:tJ-%&3)0ڔcHGйS@FXL)HR.B1/"(# :YS0z]!@Z $7\ؐcr-H^訌w8?xfJ^sh4HB|=츘9 `% Js|8 ׯd,Q>&hmZfH0N@ 8`x^ -;@ )<y8`$v$)v?nޜqY$:_w7.eOEJ%`։ӷz]-_lI\G@$ 7Wŋ\zu`-.R]~W62(Mem? @2NmÚYi?]{9O=T%+Q8<{mz3sˮj H_&N*Qv9|0 Ð/}KSh4bii%9<=Gvۚ& F#zwiZ:u. F9/5o6oIH2o6on4{u_kJ?EX[G kϊc5ӓlu뀸 h"~&"I$CvZ]t7t6Ejs 2&"q'񶄮3"!7(hAgIrÒQ T8m^e^ѝz<[AXJ*P,%[]}\F%!!\WC5ZE8,"{QWC6y%鉨MYWԲYM9`KD#su*5@K6aT e%65z-#(6C\A! (čԌ$<0!K\K]O{eCp$5|8?CtY,KX}1rq2ι`m"F-Ѭ6oSJ Ӥ8s$ D{ͳ^ʟJٸ(%ټ X3N"cuH`q}or7DryFM hCDҎΙ#|#>,-)yXα(lIUp6HFpBF{^wund;xZ4?!CD1m4QIg4cpDhEav0Ęv$n.cES{E|] t\]xw{U3lECf@11EwXh:Hr,0HkL @݂]{k[;+Jx{nES:$p[6]{Ǧ#]$>(ctVʘi~Wŀh>40$q]F$ixUΝN"Ss|4<yq%<۲:u@:I$+ߌ8:1~9`@/<;mEQx&(xP%6qLכ*o?},Se|ɷIgW~Sa7g?+k@85Vk׹_(G$\v^7՟b3k(@.gVXb! Ð^x{v]wөu,--U%v=vI,*gAR䛗ۚy$$;Imhr[p{΃ռܬn 'L_^ (?jz~Gj z]aDq`ЇU` o5R F$0 JAxHo[*fT]"楾l"A"RrH&W1l,%XDxn˱ o+D`R QccV`E)锉ºD#JU&A% FBkb *|*䕑|֌ތTv2B o˾(L } ܐX ϵTXzc.(6i˽R[ޒ(_0VnkLekx]#]coANH)2Ʊ:? +:q@t i鵻!麀E~ |2n pAqd}`B@V%H 8}+ L. LuO Dx:]ȴD^t>t"u֖>B_4!ܥe-g!뫰U4" I(Kqd9 ČH ;jJx+~|<Y@'cfzl٭e0I9!Q˟uLI, ;-z˕]Ho⃒CI> !ǂxLǵsw}gNca7It bE1gf}c˪%,01oە̭[X^^fiio}[{# Cyz : IDATZϣ>w)8fA0>k~s'ɼۼ'!ɼۼ'R8-8ӂ;{Eĉ52GX=ʠɐL%g$K ֡!:A>Q_s**+7 {ɢu/z8 k[h> C}Μ=jه̇I#߁~.0Chpkx"/ہ錊FLvy42E)O|ϰ[4pv]wݿZm:= KKXzv7'Pu%atiNX8 =Влo`'k8c.3Ll7#6s>9sVe`.I-M8U]`̻ԬY3 *tG} ӧs{k]A&AdچM~FN Ya]->r7_G>7$2!p ̙3jZ !Ouǽca#. fuZ U }͛7+@|x\0 uVU~nhVbxxj_lPEܺuCUlryyCyyy{ [~[@g3a-%VmzTE5MCpGA@ Dvd\JD>#"n dI~*zR("GCӕqGC PAH)p $'ʞsC~$9 Q?}$D3>V-wl0݌E,7j%FH eR>V,R݆W[W}*"5'” d7&œ`hrCYLMs LGs**Y(rQ;&q f!iR&ʂ1X,myTi;B&eQ? i(_̽`8鯨 ېޑe"hYv V-. !(>`ϝ7ƨhң2]=q$/JHǷ""<prhSC//OWN[pWԘJj.*tfufWĻn9Y, ˉ@lLz*1 0=˹QW=Lg>%LJFF;}CKܫMbLgxf,f'$ kGTֹg]YLyO}7pĿ_GBﳮc<:IU62̕}#.]6M $b^N ٳ+J4M׻w[zuB6@}'}XXX!_y_Q/ q! f }^㚦)irޞ?3g7ÿ}|+;B֩QIf՚5]':$Ix㍩@s7ĝbka5ofii'|x6WYam]zk)'݇ۇ=SßW9yotNQsuN?^|9Ψ9sv:j8 Lƻsą+/rxs"o|l, YN_r[u9RIT[JDhHfKOp\v}Mmw& +U'p$L(?qE{{+P|+_$n5gqLY8R[?/(;>| S3v{=ƺ{VEQ699I666?mImmm6ĖMZ;ݖ9ݓk:$\Kb\i !AWJqD{Nn%q.rEMU苈-Aҁp.Wpwn@t7d!AC"6J ;%Ȏ:-Bvl )B GPbd$!BD嬄_(׫ Hnq+o([ !9,Yh*4/$!DVXc ۾HɩF5H_. HϣUU? ln@tD^B #f7 CpGwTIa3<4%M-uֆOS fܣ:է!^H|1ķ䵪RJ&N>^9j1)(R`P8W^֬PܘY)'.Tp YU١"dG"'$'GF]A)_쐀HQHnOd qQ%D 91 / m:i&'qKΗ;D|URɝ$J::SP < $*'0e %/ŸN :1a~փN]9Buun!hɬe 30JL*49LQN S+57Ls$x`?tՖ @6&pH%9/m߿ ׬y (19giw]϶L@JڹPW)`gI0=rn.\P`gwAޯ֜zW4$ұw$q!s~Zf@vnY;#c;W8I2H!%uꮜo:h6WT~;!^9n¬/4zFj}h]#yEQ]?{nnFA"+[0I$ 'N`{{(XZZFSK`41wt1A u9\?ɝ#~5Mp5\fc Ql6yLfZLPr)yαcǦ\nw4MqJʲ*Q@ T$uQ췹:G*PEG*@y: }ÇqFou$lFnooO-g{߹~f>7o޻Xr}SU==3=L-R$5]HY[Ʊ1 lDc8'HY8 Y ]fW^\or93G}ԭߩZ2 >N:Ukkb&m>9d&m&lD'qoo 'ޓ4dD3,ɶdh!6bV_?N=+q7NAi;"Vs3$>yi ID(lM8RmȦԁ1%}$V!&M I,"s`B)ɧhxWE- vwW$+ĩci,}>4!3ڿX5|_Udsd!J܁t["{9)Dg]~UW-my].hCi]X>b>? "BT7`zG3|A^ϴf}gAUr$,T ӼD̳\ OWɷt163/s65akSпAn5um^^ϼ's3Z'[tI,99 @*ЩV!Y\2]!VA~IsFց SΓ Π~ ES R!<7~ Tm1DWWap\\`p5=ݪ@ ڋ8GS + m) >h$21 n{hG49UaםntQ{a4@CJ 完(X IDAT?;SQdyd;1l2!AY=8ڒTᒖ X Lh,(ر,^P!eW~|t  2],5X`R)9Fzgau=0##ϖx?4ƚw9/o&ZmHR\  (ˏ"g8'sR@RzNR$a-gIPV)ueϗ:p@!ooosajP%T*c>wW*:EIj!p]DX̎l1..\ Xgw7R6.|+WX^^.~_XX( q应{, E&H<)$s{<8fM⡪c@ϟ6i6$6i6iHBwT9i^mPi#e] \J\$hVOѷ sz}U-)5 d{D2]^鈳 ;-ek  /礿j*N8/ڗk*`;e{耫)le`-'⮪K n/yH`D*Y|HC\A]t5|\eYZ'`"PwX_(᪒uCK;Rٯ :KMrUΒo k]5m ݯ6ĺo G_ 2ѝk_1nK`!v?i ")R Aʤ](sNi>o5 ]P`҅Aqp$ek.DR}^Y=R9 C%8hкh>Sfރћp8_$)֥El߻-kBsYv%}?#C|Yi} L?@. :v Y ڲTa0gmy% W:^V8kÎ/Hȭ%'9pINXV0c2a8*@ۯ-Nw髿^*ESF_ϛ}烝;v=Ab̀qk]P'f^1xu,;;Kz@9IWVTXSL^3>^~Ȧ ͅIIO $ۚI $>8/{?2M쇕*ha_g~h尺+9'ц%ɾhghm NR6v2| %./R'G_R#K0<[_ qL~Gu峮JQ)|}uL(Tcpϙ*c/3k}Kܤ}(gylJϦ_mrMELBX"ȔL+m w;+ fRz7YûnU2ǚk$¨D`r^8ἱnͰ)D6MqSy#d}w]c[}gl_Q s?>QNp{rJ瀛/\_E/KZ 'c,Hn *OC҂T_t 6?WxPMl 6_SZie )h]kpǪX'7z쇇0GACצ'G܏9#Vmygwڱi-,%#B[H7s֊1OFTF0}s- ##IKIwxBrkl>1{at$%~sb{@88>ed]Ut~u J_Ṣ4Mi۴m^{}B~$LMM%ZjZ[9rddK~sV1??_8H|w΍8H<( <(_%~mlp[!0)sLOOkݷ$n ev{DIO$II@<KRf6&+[w4$Hъv$rt^̊hZO5*D={DL{Qo[J\ϣ!s^{56{!SSSC4Vh4sggmvvv\s!x]$zpVU 1-..6 cj6VԔ\|myߧl2===zsEn喢_e2Pb3;;[_isqN0ău >i6id&m&mI~t_.~; -HRXf8Dk79% G|Ƌ/<Ņ庬 z9`%'gR"AgDJ.C>lRqTk}"&^`dԠ=lH[-Ð:95"t*$]HI9B-ټ!rZ g4cI z=gE zUq5Aܣ,RT?lsM|7L|a$;"d ZBD>KxFQކB #s ;"ȗiBerȮHL~U 2Zyu1K[Żsc0nOJY-= 7[In'WXxM:wChJ%΅(HC 1jNoTv2=q.FHɮj. my }xG"/<ŋRݪYX %>6dSp$u}hZ{)5\o#8/k. S$fP;lٝw@Էel]P!%}r#ڎ+CdAɍB,)v¯-`q\ m_Vkd;YlEЙ€u%X-Cfxz0`󿭢5 _\0 <J[Sv2s_ˌwB$̼*Blmmۗ쪔u4D0ㅿ">/Qa'Ra)`T{R~X9 Nr}@v-4k8u1]lO/ώi q DvU,Ut/@ՁT_|A:B2+"08kɱ.)s=tP(Jː]yiMW`% !ՑUs߫sو4HD&ղLA^H32"㖉TmYDrs5"8Pxi,'.$֡W2s]@]٭;TQh}AU:|}9TGW;ŔzԌa&Gð: _yr7Q$)$g4ûa$Q%o1be!8Q(+[&|]aƬߊ?fDExd10ȥ㷁?I <5x!oA$ Iv!!f]9`I̿dV51\>.Q1ne},cswp .f<$a$Znזʂ0y՜Ğw{)} 3tT{=Gx ?2'ɍ[*㡲HeeBa9 ?PR&b_r"nmux$~<>$ $jb666 aC-"z,mll ^WI666*Jmae"s#~.} sk,%|)&Y8Hg;cH\x٢%qki94… 4*#\AIV+PvVuIƝ%[n˖ᲀĎ8ʤMڤMLڤMڤ'=MZM"Y} lo4j¦ts0ӅtUdS^[;ӧ*dT8yUC65ka ի"{2N'~ 4;[@BgEpE$cYovH N<$K"rGTXi.HhI#}{FHAKrnuem0#9S)C p8˜l'"x }辛3) dϫv}RKLY\Gƽy)Ȫ"Ӑߥ^ݯ 3yEeP*DO=P먓*ߗ2hPp`( 3rYqtTQ !ْہfg1ɷjD̏h׍g Ko&9d43 Yq Ndx^}nCe$.#zR^w}$2XEpCgT*Яz#DTûO޳:QK;U8Td !%@H$TY_5|\C~^cԡR)Fɗ> G>$@O3H?%#d_oݶQ!b|E?\,e"q A= V赿g/ˬ{ARlƻ^fHh3Ӵkr[2I͛sFW;-%`7+# s#( s[sD%y`# Ƥ,ys0([:[x%MRts'C81p9hm9h4CwOOOnKSZ{nD̽9 aڵkFe` Iͬ?SS655U8Bqԩ!@)n鶀$"%㡟m-DZI)R0;;\זl6 7EC:;qcuI}fCXn?͑$T*jrJQ̖_B@RM<s: n@ &6i6i(H2)5i6iHmM_>~'KɛuXp*]hM oÅ4gE9U|֢(h pUpYu *{EOn40ׇd!=-нCo v$E}LLC xR/`<ܦu8509 muHN2ڋ`q Cs +`w>M{ϛ>lC*y-@|CM"{WKpmjEyhEƎC8C`A-A~^(dI4V{$$} jp $ y/)kY3,wlI CN W7f /A<%nYXv]߬o ʻE1 nNۈCGE{wTi ̾n Wt~]욨ؗc-]PX%5: >٭ "enЖmı.p:N9rPG=9Gzs%xW MP'c ${_K~|qTK`N[O'}Z0m8O~Q9IFoC_౩W;@; Cy-g4%:[v+K#@0"$#_yaHdmd]{c#UFKo;ec-W<1 `]p+ ]* es ;IAǰ g]pt~yKnu8WULs.4--Ѳr[looPC@!8zlj> O?%V^\\q[Z馛F$]B@8t:?T-/8omm>Tn˗n 2(C2sQy!B/nMdAI0;;;yjYZZ#p^ڪ׮]+_W⽳#"aM[(`JÇo333C^zN(~.&{. 5˲">\hI $II $CIA'Ί O+?l1ܬeIJ.J4Isd"':AKn= ׌[1齐]2ЮǺ\jN:<|do~2PޅX%b8(/VX_" GAPЧL$cZQwxf@wźRb9aѶn`P͎Wv,]/",™0[d].pbu̥[E;;!70q+sv}|؞@<~)vX$f$IF ɍ6Ilwj2U]Q͑#G8s%P1a?7X!8 8vX?, ?\wLMMBwEt!z7@חT*8p .",+2!mܶB'-bCCC WĺG$~BXK|4xX|k_9W2@"esljZ9?4pQΟ?4׮]$͑oFqNϳ84~2i6i$'ɤMڤM njX[rS:Cq' 7Ưj) HAhViPO nAv1ftF~?R($"L3wܦּ (5EdE QɅQ-#-!%rW)rK.4"!ip (A"bK<(6k"hq0C$8(g V2 $=QpUq "*@粮}k}Sj m" :}A=?(w,nՉ/!zO;oSw/́;ܪ׋kkTCB֑]CΤlYeHc<20s5۽s骊a!_3mN!],cːՀcɵV Cvބ]7xE"́Cp \f.fwUݏG&9@գ 5.{ ??Ow o> z}ޗ~܋e.RXr]9EZ?z8pxJ6qw^yP!KR) {ޮ%8vT* LŜ5>N:Ucqj:I<Km&umU]so]V~7~!'8(A$;g ݷZ6,n< pi.^޽{ٷossscs?\Z-:o|c|&m>d&m&mI>dԟ`;Օ6PĪ[t+"ܵꗀ߅[pa wXk '_z VeV '=v|os8Bsc ?N[ Us޷|3p?p]Vj(1@naIjgvGSIQVf}J I 3B;aPR s-/3g8X#g>6" {oG~V!'*}@QV tpFvN[> ʝ!(q*st @8m;6k; I0 % 8ϟm>0sn[g-y[~gPke =:1nDƒJ"'I677 `R?FmN6>;;;B ;cE々"vl677JmyA.D0܊0$ ju@2GIqY-)Uoa]$!N Jy_<~O_7zꒀ(&m&mw 杛ۚI}$_6?/'W2p! eى aH& PD]70 !ŃL(7WN![q\s0E)]DFgA޵xPqd e; ȊcGkɯ4T-7Lrw@vN} ː~JJL9V,T$l|Nw!zJC;Y>/ k#,CՌ缧埬SQa'CJ?e CL^H[B~zDe$y^U7o)HY+܊N *gs u9qי*NIfL_}9TnX׎a27 ϫC77N 0 js#!fOP 3:h{ay khi xhKpEY=fMCAhx]^_<Z9<<so\[|{~}qeIn27d8$|>|oYvDahvdrD,談!a3l9&Y$%9^-~XHZ1B,x.|JA``Be>vl 9'<ϋ; eƒx17M"||$ $"~x!߇P/..233S H|D[[[; QQ EY{r9IvmJR)錅+? mxw"8 cH!xg$v}܈Ib$hd\>v s9s& +$|!IYɳIIO$II@5͊$;ȫ"V#ʗ}w;$h;THG^ϫ*9%$!!ԝA"kY∨ UhJEvxZHB}u&y<SKKuLwwVĚA~m 8*z߬% ND3YᐻΩSp$ԽM>,DV%=Wn]\nN {UĹõLVTU[K.GR/oC.@"s_ ]ҌmٯېLAz'$d/A4#.BޟSo+>w匂;T8$ CG6r\0doɜug*I3dF/B6'GF 4gr r4$g@\~9`>l99[K F MrIbن3:^GptNafE:IƠI2. +fwxu=X| GmGC8'IbCC|x`<-e3I|_8Jnϖ mj5ybHFPh;JI|٩C%BHbcdvK!IE;looTHfggjC—%]Jy/ZȁK2c~G;~^cBxxEX__/@n!`P""Mӑcb\ ln2f}OXb+Vkkk8XZZbaa$$ae,--q9XgUj:/AYi(у ن*0!9 X}u',0hD-@_An4E8 K$6~}~y.yM-ZWm˗~D&]󐿧:^l qA)"HLפ?+*Rq(zY5$^E|qr4 :p&B0 u".³s B_PrN8ffnh{L*EjxG_ 5Ȏ@4~@`Flepҧ=T4d5ʾ‘TDہؗRZ]4%*]oBnq7)п,AٯTH|ܟӹ`)LZBH{drgnJw:r3֒H?_7I`R8Xi>VmA&u%;^:YH2@b3HwπbdóHo>ؿ]ˀ=phyXn+ N % IEы Ҿ?_Kd&m&j.#pr+ hE*\tw:w ϔ̭LGsrEE+lpgtOCw!^DvZ"MMWU\i٩4D˷E"8 y_˾X{m.G p1+/}˲-T3dpH^lK'puSz@TN2`ùFF3CKc8<_ҿXYI`=~T.EU5^}-/zl[©z,Vt_gP.qH#{gXs?!++Ug-$g-H@8HR.$*9Wl1)R%\uf\vZT sR`ޙu<8amsl|}R'"ċQ<)\/\06z! ]%Jm~u0%<$)+]|_ 077dLeBܬ:Oyk nJ )J|OًD_u@-<~s2/)pYwA_u\|A_N /|BtPAW?վ8jz2^\mUꊂ  hv)_z Ѻn׶@%^U039y[Ϸ7W첊sZ*",~KޗQ]2\M$ 9rAF5=ZK/?V IDAT=([!6M9mͥ?2ɜcx 'cAEUǴiٍC`?j4Uy͏Psr{#.73!81>'*?a{1`ݹ~Q;B.kofe%BmDa-5@>2 ލ#s_9x奭draUb36kHe|_yP'7}G%ly2<6w(F0-'*&Ih!Wb%?[tI0G@u:=2u8 mjMa'SYǴ"\ er[iʵk׊rG>WL0\&З a ^b~%IT 'r.v/"I 333,,qh4 ( e5p˺nѯpCm˜>ޝas+WE{Ronit],+J+DQ7\ڧq09dz>;"v(`n3hZx3===y,FJy^ǹs[jTU~o~ez1:sڵky{|ɸIIO$II@'89}|a{$3"dA]P'P <ꟅT+5G9r.k63o]~ Io`c.*B\M 3R(ZԲR~%m]a;p_h.ƖvC DjoJY0 ɗݩeMSDp~٢B!nJΩ m+ּ)3U+Bseeew*Rz,ZU}gWS0* V$C%K$!yd|B_$@tHL җ= 3 D{tn*Ի:^2B;A\F꾪 C…˰zV~ tM#^/@wXil3൛jMssPwh/7I~|Rbڰe%`˜CRJp_h|s 6b\)-7UNJV/IvLvtZ7@l [:A&eÏuguxH ^rʪS3^Lvs?wBff+lZ׉-]@$X*w\cΩ0Cf sܯf6mAJ<; BIc3|Y29vpeYd ??==bjVt:jZn d3I,$B$??ࡇb߾}e<$r y~!IzasR^z%8榛n &ǧ~4MjE, Y.׃%!()kY6}*-esq#'vgymΜ9Ñ#Gu~k_gvvv` ÛW*ɗII@III#/kp|N< B?qT7kj}V  XߓDmu@4H.HsM@sY?Nҁ- t7$КK*\ܮȔ$=HDgHnJE{MEY=)eh- lp;cOAY}]tOk q-GP{6uFT$)x"SKq\\]*xj"{a0)XyYʙq}qnD*9%xڧ gPСei$>}LY&߫y:ץq oKq)S~ZEm ?~Կ3$P@{C]?ocꌬuv .n,A:a-8spf8}|=r^CSs54^o˱Ԩ,,h$汁;/@2 eJI>mC$LbK?u@2>#[*("1kp`؇yamnaDq 1vh9. (M6;+[v $v+X0ïN?fD R50ٕYg e' 0szDZ+~|%"FgdWts@*'Mu:f~5mZC9 SpxqCz^ C<K;}@܅4M㘭ױbNNÅ  j+((o7੧daapp,,,SҒNq355fv_|q,H<$ $@k>7F$v/ xa! H٬(X^^n?z) pfk9v+wSz T*RMtxg١hVNG=䲥;ne=}&m>$ˢI $8@ A8 ++y*j V߃`eVDcc64#y\YLfc؀f N4,OVއv|ss ckt= g> N7kg*`s]KuC_h( 3 4`}[suΊH"ENʆN Z~r } ?GEFqRf,3Αy$yy&牂D9[*R ':4P*o&c]~I# 92Ny,tzt1*`rtQ\Ճer400": 1E 3|6Smx@cJ *|lmélaBKऺLL_G[.c^Vfj@IYp; n=rT{P]/I?g NI.TI".zAgݏ9oΉ wKm-虿9 ;I. >Q^ʕJ IPGN H2DB0¹g$Pcn<, FB8.2.S%aK?awl9t Uv ݎE>_$no'c~~z< >kuۥl!ڻ!x=$^*\$JZN 6770ta|ZEyVC^rxqL$˝wӧy駹i6/..23334;wQxۂ_t$^̶%q.ݜY2bKGywspłƩS>޽{f++ȨOh£af,kt;!^ @PPQD- 3qHsEh̨8UՑݙ ((< /:uYF겈͝B]ujPj N1^Q5 >[͋(.XMr'Y(Yu3@Xq2s_fùYyWp_lx!-!K!k鯾I_0SsC^ϑB#fjɑ=6#«v f]]Ǥ IsSޮ Z;܀YSPV=qK=:#p%r.^r)8ã@ Zh¯7#=<qdfdUVUV*6d5>ԢPSR[3֎`  VS ,v׳'ȅx$S#jb7}dyɪ̬Ȉ{7LDddXvV.xw qp!gf}h`c%KFEmiL.w$6Pn5x8۶U[B>"xKz%w~% ݜ!ĂnG$Ƚ7$q/ }nK$9dۿKtz~$IKs@dVp ʕ[E||umic^6ر+1H8iZByJ7lZ( rmSg[_Q$Iڶm[v o)0[gˣX=i~wy' /~;Vzy2ZRDI$6ٵH,=333}l/`a6eV?~OM$IrI{%d"`bb ŋٿ?aSRɮ "ʟ<&OIcK$IE$I⢃(!~|l EGM V%U<ܗ}SM$|-c](p'0霂~'mS4M,o1H3.LxDf0އHl̘1b랁z;{>I1^'AJ~;Ƒ7}=NtAkT'.(:~RzeVǷX:1jw.FASP} Y"` F9́dzQy*N$c8K)"6ČoZ6v~j"0 '1c0esyd|Qh\`7$ePMR!Ib0K3 9;Dt$QRV$ɿ/91 )SW!JfUow95x䴅=U $ _SK* n`n El䔅$D֑ 7ݕ$:3{޹u=OψgFE1|$Y$j."I|N3ϊ8?!Sݔ׻I޾]ƘW1WL;'e&'o|{o[/_7{; R{1>!xwbLoc|TʆaB,x'(*x/*m NW.s/Z4J{[S@ o=RK-f?]RRDz"_tl~B3uڧPA ~CZcJ6T{b) !wF>fWR(zol@gnx`>,]Q$LIr$C/*It+k&.߅ t֩P8Qwok4rMZAJW *c|XRD$I9F$ $s sCvt~Wj} $i{ B)!LҖy_Y8m隗F^[Ċ ו!m] $x\uRI4JMl:^=?[ Clllt:LMMŋ3!0Kcjs1$IӔ *KFqʕLI$ kkk}u cccAjwp z&s'Nɓ2]diĶ"H,Iasmz>,\%6qw$ `(d^!O>$癘l=yF%/^ɓl۶md?$Iz뭼Y,QR.3BϪ\nP,,Qec޶&hlZ$9Ib=Y4iWDEFAQDE|Q$mL{~cL[$@sM|=^EI1n!zʛ,O=H;$ p.t6k]|2$;p@[ Y@S <-{FvE BOfNUH6Ƥ9&K[v#D/5 goh~65ކ 0 {[+P~cȋߕbE!BG@1ƴ~L~l3C1ہ2zYon_v};wF>{'RG V-w 'R 9nU}݂UqB=Rk_dݸIQW/I{O/I[~"d\VeiKW갌!$# _6`Q_ eOh]{G$1xGGO.>L^1]*!eQiCC.B2nZQ  %85#r\ p'4wq\ݔ!}7+Oǔ?+ B}]ʴ!]oZy!0҇wYjda/'eIG#s̸gRbE[[uO͜;)2SFQ;@)Կ-绬 `%ӑ{2bŒ h}YM!Z<pdz߼QJxF"!n7v-ތw!IFIF|^C\a.)u0=d#|8EH6X~ҧ! M!B6]&u9#ivA9_Y漭%.&r vÞ:έ$Bx}4Xx*VBqj'e2%K%.%?! .a ߄O2\ J'xy7VQk_sU?] ۝ ;dc|ŃZrQ}oe‚^eiw.)9ĠA?_u-O9eWCafXz@y[ӿ:=wdR$!?;nx7Me*!t_'n[ƙ}I$b7TsihM~Ϛr=cKlDy{rnsҥk*0̈(5QT*199$;66֧аV٠y-4M3BE__R*v'Vcuu| .|+}DN<$}ŚZpVAQVTQ}oL"4 VAJʦVY_|P(ԩS[[=N5Y$ vns,kƎ;&MDٶ*+WbTT2U%GngҶBk[$EQ'$)"(H"%g!x2gFo/py[Ƙy霬iXhH@3U L9 j/@) Q8N$z2$Ȍ#_@tw y ӦX'EuBp*BP,"Wʋ,Ilh?CdP/dPlB.$c4DHG S*~ xt t.,Y.h3Et^9hki'I[]h]e3=8"I!՚cKo‚\8 !,>XW`iw߹KL[__2_cS]`T%(J+QK. >M̘IoRc"oCz1 0@ZND@ x}K MWZ4Dpd!!u%=TB7N}æYZWQv_d݆ܡӠwY~ lӯbU; B$ϒ l ;:BGx m>l<_U@MJq&hMORΠAS6{9֑FIRׂvrIa*IW,$C^@kfsK6kl kyT<JQޗ.눢([~FYk۴Qd4A#:.]O-D˪` hǾɡµMi:Skt Ń֚n ($Fӽ !qCm ÐN坐N@|`ʝp 7,,d) 9_7T!N~| M:8Bn2]h<]xLEA4]ɸ h&po&)C cfICCj<4aڬ~٘)>ĐcMouhDFɅon@*x|,D0X2,-w`~֐>Oҫ=YϙGI\w5~ *7$#&`CH 1 )QLm&5M-hCAR)ש~]ɞ }^q0)4q$ǎ%IRtYSȩ$i)ۂyfRW J9D>ap1| $ƒ cJ.k+Iœq |WVx\uU}~§OeIs޿qOÉ IgI+$P^G)65Vuy$]Th3Yr]7?/laAмT:[T=uTMhK.1SSST*̫mLOOAF´Zx T2g!`6wU0>>NݦEcccT*\\ϒv5,VR_}?K{nR0=&FcɎiKVhD_ HSIb k/_l߾ݐ(eEQyq?N`R\0_8$]&0J Y \ : 6߂2T>spuܤ 57fp߇{I%0A}0Y=jJaRʞey{xj[<C{|BY#OpƲ@ZX7m f? _@-2jR __&5Vh}FBCoØ80%jcR2ޯ X'S`!$Gy.,Oq$,mJ Atlq}^#X$)}0D I:eR}LbWľDaXCRI"HorQJ[ubdŦm*"w$KZ46NwSP(׎cT.j@K; } zEV][{cFZAIGJxڿA]c o}9[](p Yrtcii/ѯq,M% `EG$v$4l6p=.Y?(ڂkkkq޽{9~xĒ#{ `VhK^\ io'Ki//wJ%._mPQ3<ç?uSlY$;wڷVUh0|ITзiٳT*6Un#4ݽf4Ab@䩡X"K*=>0dnnw} }emߒU˅Z#hP.?UEQ$EQDE$uk3t phRqHB!*|ͤP. n"˾!/<\Rogf> ÀgݐI[=Masm=sr:V!Mr'K;#Gv|zfXKcMz뵵]eP:zߦ+o]8:z6~1w,]w]BuÌrYH|_rgT0+_WV'ǀ:xD@ ]N8LR Bb 9Nk$ȇ ωGIV 0>zfXlbK]noba L=(o)kFӔu-.6-3鵱KʷSi'Z4<ǥ$Rr[fdۛdݹuCiiG4P$qה9oDy-Q ĒYgHԹm|$I7I@"Sʄ"ţu1AU/b[f$;FM䂾i-Y;Vau.0h$Ӵ#ud4Ib$y)4mef{O:Oߒ 첧 ɒa0%I!׵'ϿCWv% *nbyD#i#{+L^3H1~TH?8Sy藲ǰ T"Ϯexl>;^d(Oo~WH_inn_|FL^˦:ݖKϰ&GyEa\weٗ/`V,8q\&T>xlztO;e6 1:{!R֍$%`xUoZڦmi! `~ o[ju0 ,\+%FMcY\5p+ z> z@: G{$T9S9ap=J\2+O)4lȝG}9;?s4-=%i|wdMMV::h:!:qĊGOM%9esC5X(r?";Բc$Nn8s wa ccee}y.]$&*JЪk|?Zf| Ft!=g!gCUh'xM9xD=P8]]y1 UnNb 5SLFA2'ƫKM esGx*xWR"c^ $oȺ{!~ԉihȑ4~O3f ]NGj䙭jwO~h?Qf0s;2qKSl@{n+0wt|A2SIT_{Xf#O<i*U/gnMU/P{~W~1UVUcOOļ 3zǼkȾIʓAUT⌛͜6ȳBMѯ**2L\J'B#~򈒕2'N… #I;DzMA֞9sf|$C^9 6:ְt`[}Z5w}@E;vovr9#0F y~4zM=_Ze||6J_dk.\BȄ$IdQi3_KӲ2, Kv_5,H X Km04@H24XNvِ8\Ш._0@s=R` x Cc ' .JHLC =P')PN,> ;0jus̴1/ӫLr{Z"uHw$SOA v!2t='_n3$߅4[ e@e6BlZ* 쀸/B=1HbC4 z] sxy4fMAuΌmzcuvd^.?oCc_W* 8 } rkXPߨ{ǫE!}!r?ֿ.e8IY*l cԞ%UyP$cT i: R *?tZ#M #`0Ӧ;q6.1%U$C;N9RU \&6Zܠ$IE1~p JB[S̋. 6՗%677TVVaIw:^~M=X~ 6./cquAȖg˧dF4?i@a~rIUǫd #?1q-ey Fis>V,A i5f%q9.}լ^a/yQ -?=,kgڦ K0 K.l.,0,T4 Xz݀ÿ'ȗEaɃ9jf"e!@ 汿'Z碙`a?p<)΂A}#U mPXګoW 9tNȡ cOK0 &,,|EH!D \"˗Ӱ,wv x%~WsO1dZkOL l-ֱ{+#{ $!Ja^yUoٷU$Y+>QS2=ߞwc ʵB#o_WaB3k"/=Vr@C}+[Y+wO`8AY/o6gLȎSጛvuq+2e'"ət5/r37T1Ǟ{>}<" zMmW9p}KFy0,=Oq#%?/`--Y b"(BM8StKv?{MGRdj {N3@}*sz*ݛ%9,%\%H3maD8Kdme޳UO\ȘnK^S ]0%ɵGcmD$i%X˗799#<“O>Ia4͌ c&H./_PqLVuq0ҥK4M666Ðz=s[RHOQW_-(c"ME1'mE>x0߀:UX/~"4vB /9)4b฀?¬GR48DkD5g@芀uxz[E`;!BX_Xu@b8tfR-}q$N]do eSX W iI/%8~i`B}cTC9C@(osk*)4WMzm1 9A_o ҚIDG#?|S5uLcxVTB2e Sm/\ͬo'iHf$UX gntv3x5457cByNCm en v{M2ʴfoCW;w$Ŗ?2o< +)X |}`>y@]GkMIF 3~OT1~ڴ['ք(Zޅ*0)*y\|,Z?2=f5H|7(AǤ2m+D1X6,;L0Z8 p?CO@=Ͱi/ ,p$ƱߟnΤU%0A Cz>v{_$%$ N}YF*t[kZa#-5^,z⹣`n-7{TOI{{q~%Vꜗ:zJ087G{m]_q皸vrKj2p?_n[#?xN;}6WxG/ٛ8c*amBdЎ{ c%B:TcICo cP/oҧcj­.n}z wwo@sjϚカ14ۡm 7+L5?Ugy{Cۊ?WI篑gܮr/g|Y$$Bqt$qa%#o ~6/џJq7 lY#CPAN2~YO,q*<"Ch%%0Ʒ)K-CPd xS\6ʟ1jTmw@ GȎȸ)k!׏=!䦏WmbGFm2GQ<ɓ:$qlih\.y) Ȧg^癒[ylll䶍mYvїf.Ab k|?*,I|{7(Ħ*A[IU>/]ŌϪ4y鶕ւҶGtyJy mʭViK+p ^23{#H'EӒeWUJU]ylL$V 0@ؠ8`qSu6ܦĐ](]\lNgQe^[A26o)QIMO&''VT*^IMI;k}[Sh`\.V+3.i4Y>e#H0@kct-f<%lt>E&JΞ=G0@yZ(H,.1 H{ML*T4n}6UQt1/" @s|l/hޮG@yz"65|zU!e#uʶ p.˶M|=Srs Rf>+c +p.+RuJhx]֏a- &ߧ p2-חmޕ>@/?~M,maŗ:H?ژҾOR+ }GضgK]`_xP14#6nw}6VI x\_fWD{m)My?:2lTC 2} YzNɕz䥃rI p:'$]_ts[+8lH>ArmUVh.{-?o ZS=o]wy/ViM}^;(=mY}!L5ZcLj}cI,=v4iYVz`jo Р@J&hr-s̙?Ct.d>+Ci|.A|^[[RPնDJ(EeHtrZdV{>[o7Bh5.q=>3ðlHKXTzݻws̓;==n{ fM $zXҥKGHO/^d||HUDEl9 "(üɆҌϷaycᾲs%~ mplҘt#h@iN D ~# h6P/Aq,Ax_v$ ~pW$ t=St?x] UHV7+AZ%=ŀyjxƤ-"Ā̤4Đ*⯙.. g{d.ϲpJ灿xCONJ1d!CRA44pZY) [7HKL`Ȉ/2!g,Նt+ew`o+1cRd mcۭ'2^hw'Аv0)H?rE/m+Ҧ3Qz)aWޒmmfz4;#k\$In"I-mp*!7aT.} ;uRaa.ܲoݴ_z/=f0/K߃ p3 v{/gyZϒVw^@^3o[XٮxWew]>@=кj Û/@CkD昿٥u;J̊ZMYwUQ.I5I}֘1VVh@tm%?So7A8ׁ.م8uj]S؇gjCfȂBfZÐP #C4$pAt²1o ڄ'L#cF1s/$nW2$W IDAT6J=hl7O1B+-Xx6z@} Cu\7'qeȊz,7Y]gy8 qd:,_4`'Gf4<~)s-X(^ӧ/.X`a۳khvY. }7!\"Uylo?%Z-['ZgzzW211[NX&S5]T*t,kF<QDEl% %IEQćE/,zg0 YXs |+6§9y>#ߦGX^Ƕ/ }<& Co`(޺C=59+#= K9k8!t)O,'F, 9:N )D#!G,/{!p8d0of2766zjr>}pH\ӟ4RBa#<,r%Iyu$63of~Bxzq vcm\?o,~/tWoШCsuaQ̴A?a4j|Ф)jMetڂKCs-ЈYݒ]M̱/<Ʒ*<^ZW]3HwS&EAu?t栺:WdžzPu6z>cU#LZI*@ut"9cLZ tbNC=Vge׋M)vٔZ Z5eR\u.s4$LՒM5V9ӆ=II`}lyp v܄y]tjU &uXg9SP]1;1=h첤J\9 44ށfM֨`RVyK;~i%[L]px7| f/DܷK{.)XUKܯ%hLAuX^;F>e1ukݫMnJOy\d)|BW>gÝ}e]@sEd,>Ws;KzO=8 Iߛs9vwnZ@ F$qi1nt>RL3Rو紏dɒj[m(J$D &e};_wF8r "~Ľ]OPCwv.' Px_hd$gΜSHA"D\>T*)lǺ%uz@jصkWE~;gΜ$fRB%PwKn8(ɺKjņ􇫰N(7OE>8zCI(W7 %( ag%?iաpĀA A~c/=hxt΀ qۚH[цMhʶ܈رXĘg(âx<寯Yppa([У 44xL_v4* `Kj@Gc3ꗼ/VmwvQSˆ\C *|;`V$k0KBUة('pڣ` lU ` {ކl7JҞj_fU'ԳU)"Z5}*0k"H~ahݘ%I 81_WqXrwTj\4lyKijXcv+uq^&yC1! v|[`t`NƐ+gUXGئyWp,(pٜ;.sM1 Wo1QYA4Qz*y*W2N~ *$3:D*I\$k};O鹔GmMa3]4A3bO;'sxڸ,GO{i އBԸvmDB*"I2P 5B`^R "HxsOM'B C0_:wV$.(zjH.,dnnnb0 `:HI:>EJ|߬ j(jD%VWLv{̟fcc#p$?GhDҁ )!Ĉ#j^]", x}z=z^BعDfVVVKTUjazI].\H/$ŗlc&f(RV%8#H LMMa #<~ #<_n.#<F2 ¸\WADx2z:哬)!t=t #2MEpI#wmKqwGj7# Lz,s>p(dVWIV!;vg?W0i6HR'&);jrɛlKN_e);j\ݡƓLU;5[ӆ!u("$.=uM)[(cHq.Dq@Wd+"@"g3\NT2ݷ0~oll0jA-Zwy'SNOI)!|ի=zt[EI1#?L"H|o?ɷɥ4p=3z6|GHRa}}=U~:u*IKx 5.T*T}{^RniYjׇF)dl{d;X,"HDբU$.M,qERV0(#Avi<<cDI4f[ou? ٽ{7Zm"aGy{C]p9.н:~ %(uf>`v@=.kRA+$kD"E|靲0#_ wSszifw1v}l2TG]1}dj7 ;F$n"\Zy#"~rp'LqV+pH_LcԶu2/Qu]{x{C[?qLM&HC6CF$IOr!E:AΰD;*щK)s:ӬPEْ$7G-Iٿ9Q7mJį_$|A9¿W*E vM|M>$ &(|in1%V'[QL:f§@ Q%qT*$JRD%c>>w666t:LOO^U yؠhh4T(mXV_Y[a2 8|p3~b⮧r+rI5 v+*^hbaaDoZupA<ȡC8|0kkk9IGyȕ$yG1~=INȼml/ZYvr:^'wljO{}:ӄK322 }9sccm%~~t{XEm; KNj%k2Ϊij,ÈHjۢsMP6~tx ~&rx-;_ym==/=|\v$^Gތiʤad+L&H6i50"I\}n2"%dkMK_~Rd[7%FD.~͹q лiD )hcBO64F~ >% v!M@Bx;ve\Sde߸;e52Eڔ^C{ ڒ6)}ARpqGDcz, !2+k *kQj\aԹ4Wb wOkI   q뭷ra:Hs\*|i({K?>}JQ/ ݜ3 $M&[V83qQ!Ν\.RlԺpw]w޽{_5?NIRo oGU2P]J%fggٷo_ZEbr~O:rH*ŖcJ֋D)z'jJvzDQJ;&SRaǎufffTukHEw#dnnn[[98GyL ]$#9¥K?c BҗLMMMl!HO8juLJ.BzD=l6z ARՒ4Bv5:jRDNM&r?Yua2>8f~~>!Hd.N5 R^4:GaϞ=4y睼cʘ<#I$yGK6̿fo#r' IDATqaA!kHy!%_S{p/H{e\}ER B7EAhl -t(ײ,>O$oO9vioYůQJAS`.!ҤCMUH\:=dk݋3?NM=IRKȼn%MN$,12IQPm'BR"I yh2OH>K1n#Ҟ&}ArLYuAlzeӼ3l4lPKL=t(4$Bh_N4k/^d޽4 fff+_"g.92ۼ)|oG^{Ÿv.f+hwFuu2u{~l-[U.2z[1H CFܑmjןZ3ϖ TuiW0EnEA>hm_,WgʈW=2VHZQ~q飿HLD:L !jҊ@eQQ\:^v|W\駟O>$'}UD4.Q ̅  4R*~,\$$}ޗrK_%$;_n/(bǎ{DGSH`@ڵVEe0Kc}GyIGy?;yQ WGB{$q_ 0d #D/ ;d:?OZ!z[dҩiDYQ"pەD45ɚ4c41=~>sxIOpPmU+&==e|}I2XXVY\k\b]߸ry$.\… TUΝ;#a& &L4$N+.@ t[\R)EdK\lל|~$M|%J  I1~Y__#0333Fa-UH3Cv(s^Ggjj*!3wRru:+JaHK(IMd789tx$=Ky* qSY]]o#<,r%Iyuq3D1ΥyG:n'UEPp9{`R_ge 8}ϐVTE'LRVW%/ٹ&m43'k](D>R|p(P x?>8"'\%\Y 7L|^(ZM$POy|!,11>;5 SPmFB2K! "?a=߻gi~E,#5X6=OcFyeݛYYYrdT*y=Ac0)NWHSBhb%K40ا$>Rd[\MhnLb.\ॗ^{M%:V#"pI)DILOO'cѧ(*+&IK Cz^oÇV FkoKGyl'r%Iyu,BbʛU4h !@V@!q j; ]"f\>{ lp#:P&r;L J0ᳫZ(汊(YEjfn37X4AQz iS3\D0*(xlݶq5r88GR!I$N%DK?,R%%N] )"7LtqͿ& k,@xI0F&Ghv}%o [%JiCMA@ZeeemYɤKh$ C.^/:=z'Of^k_'ߑ0 D\r%>0>ZGz IDle*H| ϾnT*u:7ْYۚDZ AIpH(X\\L)*Q!e_Mر/RTR=Gyl5r$<:`0HQ%w&rgq041׊c#+^[wX;n[mIkPv[%.KhUO%[O2#Yjߺb~xNK+IX^ApprF0%#JI!WS]wP{[DgU]*jAgHvg5i \)w&*8[:T1qt[w[oE\N ؐI("RNHJrr#2?2arw${P{I?)m#Hjp-f/L  spZZz?~LIVKvj-(JH1. .iGOO裏n̯SEZILܲ_rd$>.B I,ʤb:kkkI3[B!A>߮>FHbHZeff&!7\ٳgٳ"ʕ+D^ٌ( !Q_wN]tiS/~OIƥxz^Bhauor(ZFTb0$333 ܹsɵ{\./?,Rƹ Ze 0˘TM߃ @ }TkVL{U( Ck(^[@}ʔwp0@]jaA m}*&Qdȴ]( h9%" ömH{.fdBi{oW vAgT Atƴ)esBQoG!UDg`Ѕxϙ2 9 ,Cu-=`n?s,o%`]XS(C(tކUX^'~`h?|h~)nɽ7= {\vSK -|r^ePM%o U$q2C@)D&(OroFH "x:{c= ٩$Y鵊_4Aⶡ&I\?iQ{ _w7nJF+|J_-Wm=TCFdV WM"Vrmf>T㴯έɡ>~}NH}nV|MaUĂ@Ant_I" *J EZ-z^]S X]||Щ\I&>+,~q4u!j5RD\Bt:$(@t{IjM?2u0Q܈*0 T%YdBM,Dg/(VWWS41*J^{IƼ\#8fccKƘW:}ץKrD$^uRfGyl9r%Iyu$_-;'v⫰|5`kS 纰:?,0 c( `]BCnX䫳f;AK  *} boda aTcO(`m. @Ӕzږi E0m)FV!m[ަmt Δ!+˾L7.sB{lg >m@x\0m>hs=sR@K*-cd2c9w}(b<#ߵ!okAP1};ʦ 󆐠\f˼;,`/.s߳m̙.  =o)A+)r]SvL^@|lV@NΕ"p;%JЈ ^0¡5?s< б \ƴ%U^ށ+nq{_sϻ:MAx!K+JS"rʥ9ux.O:͒˲}) D p^ $V =8RG%>bsvHb$C1m,I0cJIxjCIRȨV2}nCۚ&2>|cwM1i3u{hjJ%jJs(́g| 3>ʱq a3tHw}^|g=L}Vh%I0dmm-5A\#"&Z"'>/ET Y$\OWuP^V%I+^:- ދ2:!+ B2ITՄўVMZA@ףT*%%N.Q; !)H!}4IT*v3}N._LZM!| '"i6K$V>$#!~Dtkj&|/d]_oq crV(Hv6>%4Qf*xƒYr%5*`V?}J|.7dD&{>n x=nkr^=N&I\^<ü]^]]#z.DK/C'BN;mll&b-$&6\$KI"ďOM"$Rq<:V1 h)rDoQnjrd8rwNL˻IPHR$m LT"G0 S*f%H\%Kd1A$8^R3gPVBRC5AFTJs>#<$<:Ena{G*Iћ>`^OڛD=u" T^,7;%*$䜟P}oY@ȩklmZYuu&Oۏ W5}'/_>FZSVA\3r252"\ʧ,q#Ud֊.nϐ6Qؔ_v0,rM]w%N{D&ⴟMbnJYNwbJ=0lfS"$z{q[>OM*#JHEIɇN3R[I[$\$ l IDAT$KUn+>5QnSuIImPd8o߾TaYm;>rvV) R-Y̥0LG:AzhMUTU:NgΜIQqǔ)[\NƢNK[߾GyYyG)r%#B1o7\s^e]ӂdn֜V 1s9mVzYJz<]Lq Q !tPBXK8S [vjN`MkpܨX/c2,`-_e`c''J,u&HZwEiRook"@&J:>g)63H){.]|}U4 ,RNZusWYrLOEٸ Y O =3Tm_n 5_6I5 gN s'v'I\rH{P&\OE⻏gVLf3r۝|E`sDDWG˗/g{H0 V¡~3|$yMi(;fjnKͮ$ZYS;[Qh&8t-WI%zy\$BYWJtLOOo:44T*-5V0IDI$(qIz~џ\,DI"fd̋RI{a2jM'R6Qd$v "hDsF'\Վ>i`/ɨq|N}-ߟQSU$J"ےxteHCƉ72Ux4txsI<V|O m(`$T$r]JBVKJ=$ C* ^/E^Cu|; AӎBld($(zd$rݬs)moA:wΝo`jjjKQP+P6p!|FBvMۥT*%}#n]|Y_^_,y饗2 9$J_ $Ds%+קJ6f$HV}um#<$r%Iyu$q@ΒxI,= r7ۣG/koxm1or/naoʷ| c;dSװ\綹MkJox}y _7:n! pTE6oA+QTt"֩\o7՗N$DKij9O]C6v=M oCowq!Є2〹hrmfS 6p~l`q x&h|~7&uۂIRUcB慈Tf2\Mi:%7})\5 d"I1D/J%!#;jjʥK9VƮV[իWPEjdMzFʔGy䱝ȕ$yG)r{Xyi?γKl{fqwF/}nm7ZZwñCfqأ²-O,˓NNlFyz"XncӰ(Oˁ=&&1Q_aKv#x`q'Є=.3?Hi`2߲W[U0h-p&k͘z-m_4mh_\n*,= X~۴A8O\%K--rN#u1glxBIS $'ID9Cr>y AtHM={̯wcXRgVIO RaMg/lʷDͧ}\zsNt>tcRhDFD҂ff;#Is5Ɔ&Ɔ&t߈%(֕e~mfggeff&Edŋ A##<&E$#5(^6 ^B 0 bPmnfkU( X4 !CEO|ϴM`>>j<7e JFzuԡ0 pa@an~fD/Ca;ǀD{` ͘~A>+\ '&=\ݜ'z>O:OyjC؁GTN\]!Ӧ v~ map :(TO':A:wmhZӇf.g{JЩ@%X~>!4~𜘷ּ]$YB6 dWxYXIn%wլƌ&”V*I"ӌJ KhHqvqJ% S NDIvfMR#$p$%Ve} i?$U;f8p]MhoݏEpqVaxmKt 1 {O9Ӧ&J|ʗ"It. E0Ct: &KbpM@l9~ee8ѣj5hZlllp[ !<q'4[r !fLJq D:u*Sq Q}H|)A/_NHIJh_|6J+aȒ~rGHO\410ɸ]w$$yYYY"s,!-JDlll$fY"M|t'VyGyl'r$<:ü*ϛO7o/M& Q(0η0o$֫@3 Z 34F>^BdFg Rd@@| Ag!X :p6FB-WF)OCj 0LwR Fdj`DP .-a1N- ֜!%ZKٗ\Lq1wL[Q^(-P8mA-2zICl!0d+h(|[x,5 \@pْ?E ^ }i }9M0`7ۧ38!&~ U{]䵊 Β(h75Cpu{E߁̺Q[m?~ W*.ۦ=;vVm=>~GӌEs`/JJ){0Y ebinK`fh*Ce`??V,3PYQ(A*C @˘s|Ȩh^*(IQane25tmڪG 0A+io>/9 p%*D.(Gk}ZCa^U D$A5@m/e$Zi1O" |jT2( ABZh3)[F}iϴRe3Mh%fm49FMBp$I!IӤDߋK6w2tHjHw7ӄU彮$7͓5 мgϞ9"]0W{l54qIfggٿ?r .]bzzDyvI_|yJ'q'$#>R0 $"A4/: |Fjr9I6(*II]WdIKjibD&!J\DKTȲk_}`Z1%mu.,,BLOOFT 昚J&jQRlyv#OGyq"W럅fZ)h>տ\b7`Ѓ*{>0o'+PCא Ao@ЅT4t\ 8-~ʐa@hx i߰ǔc \Gy F3}  [mv{9EYPY] kOcw .FVƒvgMgņsnϵ`{IA2= ]g[oȂZmYxz-L7u fŮh_k绁CWmumuW%}C" W4(>g~* :MJ|~>}]%5`]52ƾ&wܔP)4on_w*7qڢ?57"99bi"?tkgyh~UpMW*VqO{P5gU=$cJ7kv"yyo1"|[DAzsM. yU/B JSV҆3~v'ٮynd"I$]"ʲb֞Y8N=YFvK!H\%KP\t^7Q n!eJJ%׉8Q/7峀Bn+SVRP.SElGIJ_i +JA0 WUʮ@@UK֭*_V;ҶJj"H`0ZRB>DZ((o SȲ[)^M3ܮZ;)_玛N)g|N$6wg|)~Ŗ~=v% ;>”=eJ8}[e(~r["qS_R0<{44`8Co?у*kWsU2>}績 f'Qh6~ ӄLQ|quKhl@\^E!ON{Ǫ.U^;fnb6/JrI,wrhD$n77Tj+ C:~L#>عuIT*JR*$ZM&I_tkъ2Mt6駠x0_ģkYk]M\xl]ئ4s?Az`8W%^Lr8V/Cp.:Fj}!Pe,^AgU ΅XKD Q^* dCoSYzٮمucHUhP Ӆfư^+l x$2w3]p5.˪as =~ѳvqoI7kbo=wƈ}DiQL>!Pc2AיޓYU5\`0$@I@n)ֻky,!ްñR׫:l[׊UXh" ($ 0LϥouL:uVO('"2}evyO#(uG3\-!fP"o?%[lZ3}~@ٶed@بҢ&Jrhɾ![ |{-U>~Z9IplcX[ٌ %E^a(^`C+%-{KLߟ8p+++iv3;OMfU$~lllwh)+DEC#$z*+++C@j j_*àdO=.*1^JTa5$5/ݖUh{z[M5*%n ٍF!J4ՖbsZoSVe$IHŒ$y~*l\q(4^" 06VXjbb"#R 'K$QrD_1TDE[J"((Cڿ+-7~ K̤܃O6a6G,uhޮ:Qfv4Gx$ a∅4t& A߁Y֡;!'>h)m"s^=6erc{p2hnA~)qߕo''mǐV@!@V'ob9N5$6sZzfm;/ڢ^r혁l=ү]jȪc)i# yI)kHF,cMHYq%1H!NmӇ5/cK), u=@,K+ho;CMX| r/G=%Ql- O>|faq  {?LJŬU^s>ws9GI 9ÄU V1փxI^ 3|%Ih?79 eDڷ_{CϞtZ~{>Wh, cg$xaCʞ1y.jQ)bvڎQ?umЌa'ޜ IDAT}o_`@h}4z}^h.U !^ W\a߾}LLLPy_uVnq4[bccc,JrL$\rW$ Ν_:aff;8aÿoRǛ)H?Ke*}v;RwZȭzKշ*I!OYax%J Ke}E(3w[$I&c8ybInH)CSD%zMVVT*$IBRR $sIAVZ l䖯mc"(bOI&("xkBJ& vy?>/ovGc. Ax*d,nQXl}$.>]X:@-B0? 7̾ Ԩ30aLjqkr>vW`宵%3m!(,̇r۽kjԏd5wa~Bz;c4#+0iƶ3|f>N ex 73ۇ.[rſҝkNÓ0;KRŋ`q)]0_ɕwo$yQct:j☧~{SVCg+IWdyyWj+1aqzz{I3}͇D)t}cccg^|Cni٫dD$:/R*V#SoV]%_^ą.kkk9qSvubb^&rqSY__Rv૸TZs?s$iEE"((G_g%Evl]iF'cvX5/{kZ՛mQ+,|?[?G >f5r\ -RXWyM^կCɛfaVEbbcǠNC|F ͝AGf?ϵѹq2t{ihWO;E;,OC mAt6Ne9 MhLCQΝuʕNCu :Uҙ,s?r;U{yz?TI:NW0w7To_$D2:sڧ\ 6aoCdi@}Bc܍CO x(&1U5g1!_{_b zǑ&uhZp=OC|khN%X:pDAQsB? urui7K+?f+b$a8 UhN}} {Qd\O%2һj;U%wk{D%xyG&Jp>_$6m鴬{F!|yOSua=Iw_?Xʣ ׄAZ8m[{n}S|Bun{^$oO O)K0ɓqrm!??K|_@du~y_ d*f>mYRb7ʂ>QLMMe*Sx8حN@E諒ܬ w _!;yؠR077g?,%LRRloothZZ>U~OVcffSNATl檅b) C:gϞ9rW^y-92doSY83{[:afil>O"("((*L $XX\;!m0? f{ QaVIШ@s N]!`W8b`͒s}7C'@"}>Vgelqۼ#cy('p?~ 8$D0]I{\|prx/$-v e5|ā^S=t!(8lvWaT606:@,rǗ+ Ԅ;GL0-FL%OByfg!}TJAx<e(aJZA'm(-m;] dP:5 @*Pހ5z\ k0;P18 )S=_u₻!xO@Rmywt d:Ү!LMBnLؼ5]S0`kp9!ii8~έ1}صs}NVgW~\{ s?#_1hnBcۑ40WyNL :w @ u0DѸ}ȒRXzi26Cߤoܞc{<öܳ!,A3$W'zhW61dd> KTQ#6}մ(ܶ9wkFAˣzlLӤ 3 㯏ccS$I|u%I|$uN/Np8?-x{ Vؖ$)} j=XΞnO?}kU/mUWU0t_{fOMMea<+?y8(a`?={-R`bb"S FtRrvM٤t2\.<7%NIwyG{TU>RBU+lZ-#@Rc*[F]3zhZf"JRG~mK-Ijn&SSS;v2LWo|x$!HUDE$IEQDAMl#Ќ)a\ujUɌ̔!zƁ nC w=!H'W Ȍ aA5 -H[!c2~q J.Ȋ]=T`' W]ȇ . 3B2.VrYYrN4AS2!nc x~D@R0-`ΐ0?)>n\@+>,koHR;OJ"mfNJ}Ptl{lzIWAg/-xn?Y?ؔ[:HSOc@ߋnWr܆ ٿ/c.1fvW.Wگd)۲swRؼ.&ws="*~TaYtWHO$龊#^G͠(z- |,yz)-Ocͭ4 :+a^zMMeɝQr<0_3lneo_ȾeXz6QiV*X_Tg0JnhJ\nw-)/J;J1o?UaZ/Z/%{(}+w$O`'q(OQi2u; `9F}k=2F 򎟘V:3j|0ꫯy6^1SZA83rH$~Y- + v+(6.K<4MRSWQGϭ(ISc:JCRYoWD>\__Ȉ,-%6X^]}ujKIR݃X%,I$:>|D}[}l SEQĞ/P׮PQDo($G,̶:į9UG$nh eH/ , &~H!w$GmB\BIfw/9bCPಀ%ґGA59!PZ`S@.8M ~8BP98`K@S/A^ y}Q^O2*#2)tr=o#atié""eDJ#hRnH;?2K]Rئ Wv*>: o G|Bve郴U(eQ9ó7L+vR!}KH6&-;r.`̶x/[K;rrr \0e \@&N@y^ $CI)yF 楕i σt^Ha\PH@w9=b'a4J͑gm0 Qσ^ی3 +/v]U:Ā+n ۶ cۦ},mFJ_JO'B6zzXB*4ҨR偔㿷J7~N6bA:2%Il>O%c4N|J(`h$~S$њFt& jj5&&&vy UIb&2$~|O^}F,)j #t\ mNRrq֗;nWUvkL?SV2%H "c677Y;~]H4ng)CAp١1dT{GǿzevTii[t^JVeO}*)"kJ"(ß"?O';pJSiq$/p e_pugY:6d0YȟJ l10M^&(W¾9Neپ߀08>!NbG@_IZeq鸾|>+>9uJ )~J-y~MRQ]Z 6ɝM쐚AFRyذS)O:a^`R~]'Cʚ4-!2 R:k#*:1QWTlwq:X]M 2RTa`(3chnҖ#OIGMه,v`~f+Of K=X _''8l1C.o!]RwԒx10<0ޞTXu>8YVzJ2f,HQaU>yUqNp䬪 Ti`ˬe6~ӟ!$ A~$m+m/,>bL4}7Fx%#$IIYsKb GWV v=OG{Kh;O*A(YKBI׿{yDg[>Qd#$I (IP 7 \[֞WOXEI\ATP H[b,dqMU.:Tv(V|$J677'IQ:zV}.JFv;#T-b  2sE\QӮ}IUX\h{ijJT8s Їv"VEqQ$EQDoq$ޢw r UY߀F-[M N%D5R0WD@X =P>%B%@yh*>n `~cm0@{0$&mH:HMQ'>(t͡9Yba -yR_Oa3}ԋoU(6#mc NL H2 8I}X^N]Ȍ[RG44Pllz_:Rfۀ=h}Gdԑ s$$e />hid,< ]?)y/^̟YQn-˰τ\#`X5ό~,| f #Ae9L_oFe(s|S<¦JUlLbjuۨKx岾%O=0=6< ԥ#j#g:S?{mmGMXfGĎv'z ]|%ehMݭoa2뿒m 30 Si˺6}0lPrA>9JXDוyU438)w=z$IAfso~FΪW2’y9d G>/Q- oĖAs mtQq={X_ t |2A`~-U(DQd߾}ٹ}cQaܷM5[.<_$Iƍ7%&OAe۷o(e%H>Д[iTLb}XT* MEQF{;"VE~/P׮HUDE_c>x|I G`Q^EIa{ 0 Xހy4[!Ac6}~׷gHhM)ՁFM,!MIrFAfs던a#>4%H#}J f |m~Wé]xMÓ7`n7NscnFfJ)Cݦ~ lt%= >:"1 ؙ$w!RJmWQc IDATj qɽfh61*D!l&PŁou72@CBߥ]Y n=ٿPXׂp [By74_w] 92'nra3 `fEi,mIn%K+(i5KS(@$~BaX",c0<7`5! O ,|d)ߖ~yX>&b*Yjo{jα]?T)&6Sk7`y?Cxw-H$ $K0LPo'd)yQH1^~ϸ=;7O(ѲZI .pf P7lE ;{_&1iIQg8pN) kʭQKCd(0>>8jIH^KJQqJtv/J,Ŗ\.s…!Dɦ7n/`DEwh"(6 %M?dFsy8K|Kn~z{}f ,IEtAuG, P3̮0sBfR` kQql2qFRFThi 8\~jyoفKWR%);#Ц: b0.7*DmT`L_$kc I#," I70y %(C/րuC9Q A*D B+܂7\9r }W,D-f@$oG$f͑ lCv/#j@uCqQg .A43c8 mW )W\Mppq ~ZH24P}p;̖<KOb q=R7`>w_śc}~.j+oIs@O1y3-]xz jʘrl/5b$C7ׇ%>S7}?,$?g~CD9:c3fH/XD3D}ʒ;&t͸?4^$lmm$y3U` _`S )E*%KČ%OT=AբV199I^grr2[TtV#//~)I$/%M666yPmqbOqLբe}2 nilj*?V^}WK-uA6Nv=j嚡[],Qnr$j5#JIAdjS6X[4My׻P0Sryxg(7"(-$ykba{y!';Xt>MXw3[0P!hFauyU( 3׃1I;~o8:;@].mй_/o.:9+뷻L̪Ǝ09@F }sBu] `wlFpSHp0!4\J-G A'!8.APː~ ࠐ BЀSP`  (Bx&Sr!5(L~n=!!v[*!<ȘT64`Sn*o@ AEIUCZ6i(} >[4|"f||7$"ZP+52C_u]}IƨT*%>d_-QQ"Ɇkv ,//s]weBJٱ2==?$I,m_EQDAQDE$;81X5#nfhA-Iu:I<sD8 LCp,\sw;0d.X|)*0v`fN:29: n[C؂C2 '!X曂Ii%I)'8'4ݪJť? 6P9-z paYޜA MKO/( p 1f\b⛲ |ap]4_h$μ~AHIASjY8R&`Y aU&䅤2 D=(lێ@` M 3Ȉ hIY*r2>&Ķ_*eb&} 1SqrmN B8)exj;R+-!\]xNν!ϑ0૎ TbQ Hܐ-GU] خ:b AWpåu }̍ \u?}\kz 2 Gr*P{#Fv G)IFČ o.JTS.wL+*Wdt@_H~X󠪁Oz!U#_9?l459 M[5j")%C{ r!έiA`3YLOz߿9a&ѽU~."%'xo q2JŔx]q6,;/9䫣w>QzS8ޡ$QWW [nHu[(0a0 i\v! T*\w~wvkܸq'x:yDh6PT2B_ΌRiF-%Pz(JZ-_ɓ'w %\>,I׳`zLEyREW?njll, 0*_gQbI~ --OZ^z%>Od*,%T6?3??'S]DE$IEQDAI>,_l1<\ّ^u顪̴s|G-I_5QoCQqt;}!\.Rm(!^s`[r#i>Pv,9Ex0T&p z Hr@ڹ&Oj@#M 'LRZB29taLr>1W)C(zGЏHcJ 'L93YLrӮ}9.`Ӯi^`VدB:V!vc8!  gSuR}R ̠\JKt^mM)UB*(4;,rQ9V-Gp[cIگ) i){(1D]|vXrL& kz"{͵G5%G}i#fbnІR1<(}[ lV`S+E}Z`6 $|r%4yg土j:1`Mە>QzX'ywLa"&W-;31U*/} vLa7l[mW0ߪYzabOF8FlǚM[Ҫ0."d@|YR2!arK'?{ǾCTշ,VzD VBBQe nfۿ۷~9e崩!RKz(x)gyq oq} y߳xL%H8y3n+KvkȮ䇭já6/^LO8qSmc[U92ԟ:(Q3w+%|W|RD(zYE߯&yDI2Dmg]ǭqvp=} ?T}+"Q*"x Ilp7/#I #.5d(pEr͊[wtإ 6d҄-JtO]t`|wbj68c%n-Nn(m 1}V*vJqR~x^ǩ?Rٱ_3W##; i5I\<% 9'^Ht?(e^L\2w^EUyz~5. au6uB8+)Zn4n&um~Խ,ߏDiX \{sGL>xskYWDŁb=T8.FI*՘2L|CRq>,2 tiY]W.1o^OyˊX;:yB,) K n APOEEepfϥXYlfG+I|*-=8a6dulWHa`;"? ]'>}F,RUA蟗S#l|cX=$m`B?.JD#~]~KD[䕶l*za_g)Ho9v'IʹF%_ן Ѹx"G}K[DI 4RlXqgDI(K3UW~T'H@gmg2A׶ȋUz)[nJBT"c67ݏvMݦVe%L {Sc~nŋrřkAm6t}LH r (>V=y$NSZOkY uʤKaTx,9逦T1 ! @I4I 4&mK8~pu 47ri醼_Nr N,pҖK.9%B:K!x1H.%U@pQ R(D!34e,ti7hR5LY#9 HϺ!mX<%eKpDJꝦ rҞ.}W2 kawm |)Q0H\zR;೐ap'zؔ/dEGRc D|Ft=IGSK'=Ε*X赡Qjh>8oݶG͑ On:oϑ/X $y]J$Ir@\< צAQ cY{UD _1d?%ȒACT#_ՠ~R{?(Ē>)~c + ?.;u$ퟋJaPI7VFOhҥ*]2PT1J7K9^LSi䧙CS'vl{hr$̹O@>ioGnu|o,1J }~sĵo6W, Č!3m](IQ.JVbnwS#J}YΞ=kkR\jItQ[%H@s?F+ϣ(/g}tQF6nS"%lbLvY)Syc qjvƶ;.}Umn{cٞגIo6]UW%4sEq];"(⭍BIhPM)]fⶁR;22:}"z_lx'q$`=9w?v3ҵ2Ybsh)$3(K8Ho/:o1i͜\Ҵ$${ʏ:B]9  \ayCy>\p{q)n)C.9+]a6Wy_d`| @!'NGrx#@BpU <eslRU NP۝ H98M?K]~N/ɁJl}.LBOLӛ})9HTIq {(阙xPf- ,a3Fo24aiWga~V5DL`>_p٪<لeX6Ny6+&, O웏{|x3UPIR2eȘ[׃]~[p6oFUl`[5{ᯫ}P;## :[b\.E^oȌ[ɀ{nAr35 [w;wzEDQZVJBג#$K,"H$*J6端Jբnz*Apرe%Ap jڐZ(:z!$o۴r>Q2+Jn{hT%ZVvCi,e$z?/E"(7QDEQ$3(;nY|ÁϛgǜE*7p `.u̖`NC M.4|hn0vۛXo' C #ZUX8!RvY @}'̨!1@@%(R6 P)cI vo045hȹf &>cH9eA42Z7 Pq<Jn*q1X#-BW1֯'JC)2E* 4J6K>?8$U/I .^S$b2ݘ9rveIkϢ>OZnfOd@Bh~ rvlʯ8>(} +>GpRܿ` wo_3ωÃ|Tw9V0KO ȍ{m)BkfJl`og*HV]0fQ"陔 |Ԛk:: R%|aIxHrm#m3ϻ4P_m]8.=WMcUyE IDAT ɶ$KK-gm_ct%|W|^~*& i{LO'M~8?MHMI >WI:b/鶔$s~$ymA@RuYҥK# IVVVÐSN}EܸqcO>AbSoLASP˗/nڢZY[[˔6M\^-?ZVq%Ng$"l9 "JLUUKDž$P65U]#xr)xR ֤^ nKfmmnKӟ4OxE($EQDoq$@u)5/V_E1V]s.cԼ_YK0l[l%0? 2m&rRfCxŕ 8$K5͞= u̪F,: 4)sXCґG a=ś@]^% !XuU)6DЖ?,qڅtYZs 4r~W.==q(`ּu6(i a$ܺB H\?-Id % W}?+RovLw_pLQR+$_L(~8߰CP:eHjBĮ ᳮ܁cᔐFG&\v!S:ft^aS e`#B;C [0@}ET+W]9D%x&m\q`ޙ=}ra:߆뛋FqX~`vcМt[=̟ي+RW mIbm dn~*-rY2>XYYnjT*;|:f38x`nJ<$(٭y$^qnVzG -IbO>)xO -~,m^RƍMբh&W^ի|ߤ"( I(" .GYrD'`9иIdL,`4F]&0+l9uK\l5܌f1g)WH<;Gcj~kPo87HKSg݁ħISDDZ(@0K< 8#A*D W`[SsTegdM3eFopoCzH mx+ۤ*PZK#Ā5O4$:#+1E(-'?)A隐 ďPK;J]w;'R+rU$7\*.i{DŽyk n!RHs2+$yTtu׬B0R]_ru!b/A}YT?1VR 喌[B.>סzDuG$/C\ j)7`jf.^u$faT05lFsp*pN!X~Y.3z8,^q$YT3 ɿ#;A]UJd`ʰ(ɟGhٌb.p^_-AK͐%x6|0mMe.Dn~2moK*vǐ$F[6V| ={W?OT 2!E7Lfdпs,xB|~;&Egu$}k@=9_W?ãRB'<R&Gȑ[!LnF1J1j FtܣT$g`:rHfή]6*A(ۙDn%J{Q1Z-Z֐UVѣG~zVF\yڬ d{{;#F%y^~tݛ~n}X}rrӧO*.\M۬S`ee%g9ru6qvgC^^LIR׳i:"(bQ$EQDoq$ɭxCN1 4&57}Xz .(,M씛ulُe639v  B\v`L!M%U/CB& tu(@~p!MC1(=#xEH "2O6d۲ߘ ^`!xJne-$@ ց Ar@bd  u w|EIﻀg!݆u@ڝYP,),C|dpOO@ JHW +~+-`)SPࠉ+<#_^##Pm^ v&SHgD .Fwr {h:{RkB ~ғu!z!UΫWDG>]qۂeGȄc@0,)?qVxؑ"S)RoԔ4c HȠBDTBzwǗc8~eb}֟=o %1_ 0騬J dvl{\ #MG%7r_0~y`6 $>) a%GŴutM! ȟұ} YHs vy7d9S7#_>?L6Fϊ!JV6~1gSY32cx̱z S@Fh f#g $J qϥ%~rwQy[Q199I\tn&#G,Q2J aU%yXU677MEZC[W5^ȅ-4T*ejKڵkٌ8g||j:>+z=(ŅݧRTv} Rę3gQ0 zlnnyjZj5rm9Pzk\Zl6w%AzF(/oss%>ɓ'3JӶFdn~i4$Nkkke:Bߧ011yv__?EQDA QDEzìWaQS8eͮu+|D 4py|13;10f{`ѤKI%y*>2L_tJBnVY1[DDS/ 8$u!R@}הM]H'Dpg :.W y dg/ZL2 ɻi7y=ewH*H"u3m"m|mpPȐK@RR"x#E|]BT ?2~7 :~wɥzn4$(lQh=B1>"3vOQX^CpфHˎEH6={4#M@%(n R՞Uwn~yfu\b]=̼)2A$u7*!B1 ?Ҷ/ XmMD-*+DJ}g]UD,,Z:𼂗YmK~4^K$x]Kȣ?HP[IԴo| Aq `2Vxz'7tˆ1LϏ]OhI1cvH$ְL^.(xi{n}ޮ>!i}b,]Q$Ӎ qd}v J츴?R]g2PyZ˗i4}0,^iwε[vww9n޼9H H21R9633SxW*U IURZΫƹ=8wXV;X9+f>|dU#~ Z!!aO_U*"o!30=+EHg[2 oLzd>/@NEz r&-KN@_ﳌ繿IY>Y/o@pڈ{ę^Gg;o49F ſ"t+oKD ]Cpꒂ+;}3rkE2x*J*Ua'B6oB؂p}M1NmII-@LvD{mJdB{_~ `?վ|Uv99\D6 T gu*&:3oRHߥ@Sp/ AA.\Em-G>#1GJoX?Ne<(ɺr ܉[H2$$-I^D?ORuc:z 8q&fr'bz:CYHCָ;?rH}q@Hp\1bp??4½/[(S\ ɓU޻8>c/BS"Ôtr#?U6ĉ&b䩝%pz '@P(6@¦;ru̽zǞ@ߣ~>,$jZ4*%Gqݹ8W~}e\(.+i'^us,IL%Hzwfy$ɝD]":oߞ$8r7O$ɲ`0fP< r1H"Cz) c0֖֫ \7\=l]\sHR#@"_Ap̙p ٔYevqaPa8oWw EH٤^S՘~XP^G)錥hs_*>`N aaoo!u2bAp1n޼YVE/}[u|oFu]T$o}mURT;/[? >("nmY7^Q! tV<23=va_$pZW 9|[oOI86?9OA..<|Imm x/mw]zJD>Ud=s~`3HL`^+V_xQ#9{_it]r]'鄼fڱ'~nvǥP].'뛰5~|=ЎG3x ]7j;D[IbEL5#FHW~dļ%N;kc; Höb6ϘT2NRbh}&,$ M|8h q(I~46b{Z",' 5[ā z:/Bd%HS8c3nmTR> ="ov6ؠdOfafȫ=pA)~@/2Dj/wGXB4My^[@Xh,(H;we2eme!Q=>8ФVkϵk@ɴvNnq>h<d;j (q~j IcEYt]&/~|j$۷I\} 9*mZV'c-offf$.]^\$I*گuUR T*UT南Do{h6yb]"Ȓl䌾+ JA{* |U SE a^oG:Bh?@܃ ad:,Hz1bg  i\ yk Zz:O3jھ_RߒxX䙁8=]G#/@jQ:7U4 i[Fd%KYQ%=G5ovpEuGsՒHs Oj F>۪鿩\ә74mW'b=htxP_([ tvT0ᄾp92p,07{<+"Z1 ]ٶ| qKDmErB )؈5ʣ;|Y-s puh^] 5~:w!d,MeTt۟g<ڮ31*-.SGn$|χ)57iZ: S+IdS]=I, q&AWlyC&#IN|oc|ič u]Sqe=Jr"Iw߿ߧ1,hc+(%nه2."9*ݖ~>.o\J9ڻRS(_rp Qjt:o|b8`#]lDm-|@D?ҫ7cw'G-^z16ĭ3(܂ ?ݖݯ]F4MuFd:$ "EJ,Łvww `~T crfgFTZŠ:R@Zm)SpX{"@ 9E|BEBlCk4[/B<=s t~|>^O ? kp#R>Åp~֔rk7;@{@ IDATZjFfɺVw]1"~hUE !3#3&mٿ}=I2aZ3{ o }h Zz"1;{70 -`mHG7$(7ix"+A9m(Je3~qZb|z^I}m¹Yg4@Kл;KrOs^+8!xVzgΟ`:m`)u<9on}I4u±{Nn';FD%% I쉷gώUj%_Tq)b4 ?q4c8F|kGgJyQ܁';3wZ$I$əVT[.0Ry K`.@Is#ƍ]Q^d^%@%N{SwlԌ, _w&  Ȧlbܙ8;HbBcǎ="qcZGw68B&N*Lۺ(;y8ʻ?" "E@vQqsUfff:Ht @q̙R_(8vXDCvvu$Ÿs)~pu E䈃#.$w a ÐSN'n, HbIl[[Pƽ>s:,--]Jy]T$UJURAw<|A\Giu`5kzIxXmi`-Dv`}G~Wr CNOEe[$ zz=:4 A>r HUSܜGp"å{@oe$ɜ^38y`]ָyE  ZByx䨴RLpenޓ0]T9SZR!>Ox b80 D8* _,,` (muT{' qYyWĸKY[(m;^)h pi$6*3_|5%pJSA B}HUpX0^;X8ߕֳQ$q3???Z- AEycdY<@am.T)nm9XR\sYqE$`,p~m4IVVq-N8Q=\!pF YP`I* B "%y/EyĦjQ\k8HARIVVVtdh4&1~i<ɓ,//sqǵ{VԩSՍuUR UUJURA(YUS}8? kVoY7| V[C{VoV>T͔v"j"3>@A1ӵ' !`"g04SE, /)dWUVB!VgOJ7 ft Uő& Snfy6Ba(~UR\ޣϷT{'`=IAkm(P"HJ,C},z7F!v@S8`rsCHn@t\ļ+ kbDMHMv-w <# KB-} hx Az\!{GԻ A: [#np,'5b)]#t}ҳs 1Ϛ6d7w&z2 wL R7jn^ExO?TMP]1ABnKTp?#4G%}p_M}i8v?-&S6grV"yJ;2{$ It#Q#E+e~yɂ'ZD<K}o~̴[6W Ě[Ucq/`tOmӇTK#`QⵑޏvӠHlXE 3*qc׏ 8ڗö_Y4~lSBpʖ6_^ǿ6ӒkQ`>&[/2PYB??RHrʚ'In)?/$2!3hvw8z=zq3;;,333`qw@̴ɧE)ݖObˉn^łZƱcJ>}H(~_>,%.ĝoYe}t:E$=(rm裏r lHS,fnnhz>jͿ>aǡl^sqnܸQlw Y^^.E8@1T*$JUR !ȃO(y>|ė$V58w%X hciY]/ޖI,mXi?B3!ꁊ:F\!#!t=E_O>dq&<c˂ j HɮiFG g(ݣdhò.u~ޕ4D5>Ai 9_|s$:< !oA#1AG O6Ŭ`Hҟ@Ss,<ܓlBg2vO {aA9d,> );BL'!}NŨwoKuullX CvE G@ nH?fmöc:ƾ@f ZD.dDЗؾ/ (ojp#".' d \CI\{YH^*SH$Һ"Q+qq3^)*,&o{MfLM1{dDf7̈/Xh0iucEyX^7/( C# )@Si|Қ ǷyY 1h1(B"b<"Eg<#1w`SS5U͵iad-Y"XTaS͌2 "vݯ۽-;I+kHi}3 }wyvWAĄv[A͛9v& ĥrP_\GelnnC8acX=f ֯, $aoo?[^TA]z^ViXt )A{i*{{{t:"Ħs&~nKevv￟˗/@c8FrI\RԵViM,`q.噅W.Zc GܸyxxXFXdƈ-;`6AGG$/ MӱuJUR T*UJIZ8ⴞmX}g)`Vf`VBXyz4giqFy.19HËa$ AvUF<}Ȭk"~nDMՕY.EVhj->-# 6dOt[UΎ$rxIf[ZW%cpLA pZuUTPCԺ&hDdL[Tv }Wo(/&,yfx5dF=nkvxH,ūR<y>BrR"!)QɃPWPA]ѬF0H$(eIл*& ZC0U du_e`LМ]&Ϛ[܃5&#KOh>(B},U^koe$IdYelDO쁑شKƤoG';fCj E #MfI~w}3Fi|9,$Q6a )kC=Ɠ_Zs'=SgtO~eɎ2YC HS&$>}zvMf~~LmZ" I40??_|@~vdlwSbEkWiq=ץ"b}cc^W¿Ŷ,y37iy w2nR9@>O1O!p󜽽BV H [߯?v$IRw}t:aџ&K' Ca \Μמַ$^d.ޓE+j}RgC-cK K C:)3$ %.hJ[jGڌVfHG8+$4ŕaMpiM"Ny[@U {-@'A-\2 $!ȏfx:N]>kN#bM5@UYi&i.zDӶK_*z+5'}VQ?kzLGe밧g0+p.OeL{ҮMhc; '+GH;ZSgwA/I-#s"f:vQxVFam؀m8TՐ!\&X!C)OW GAPG,µK0E(OIW1}v\MOKʌi!)ܦEhx?,itV<>k>y 7}qu2HƤ8(i,,,}_<W677Y\\{j«K]o2qwe͢¸(GIpuK"!!ɛ%"~΂z^vھl2h8Xzڹdoo eeoo-O柇~|uDt:{cQGȲ`@ETmv`̇oc7,(۸hӶeYp8;e:Ǐ;7$JUR T*U۰T$oT@;f܄X$A!$I>iT|dU\ :a3#? 0"XLIc!$XΈxu%H6E<{"g)P %[qW!cy$ Y]}Xꏈz& !~mj+S8z燚(wB㺯#i⡑|[E*(Й7! _$yW`imW؆j֫92CA./髹3yuvY/^Cr 4t; k|ާEo93$຦JUԥFct|:\؆KОW Y{AM++.>}օ5M &d?Ú>Fd݇rS&#IVDS+:}VGyX@{B9>_PJ,-i ~F]x>SUpȏ$@h@XƣOjfϺ/{}gq] $$xj(2Ft ,w~$ִT[GUQN>`,gϞ-3ۚJ\y&=D g?YI oZt1ĝ%DJV&[[[9ΞgYݦK^/"I<(:_#d&$EXPrpp0юnׯQsa>n*moo$#ſ]:3֥%sAHMpuǾ;WML5cǨ$f*UJI&J5*UJIޖe')ֶEX]2wE4:!#TC;jzN( M<Q!()%_ ?4 ;04:znl5~m1էOeoᝫ7LmU$zWD-?S_8q߀$rHBHa35p2!%ƻrMYXX;^β@t:w8 N(:st~#ngkkR@b#1R{-hE8p7vZ66W\*۾ƃK"Hυyxrk$lllXBiʭFθmX#c0h]jEnE@i{k4SQ6s!89ȟ>s5dI!iч2$_fŏ%T<jKfeGymYP.ˡ3$#+NBNj'3Xe4*| .Cu8/<=+iځ TpzaOހHz,$c* IUR}vU$IURTdL)~_pޙ#*#"*}) [pNE$zJ9n1C-7&܄4-+W/'%UQȧ&yx:6QX*^P<Ȁ>F|@h]Fkl'VXV"bޟ7anNFZ.ӔNԐA04wuɁH|`+$"pg@Fsq9 ߀K C91kt%LG{3K#.@vYx B@GΘ e{CI'>"k@E0xE.V" ?+:&ڐٽ*PKvS`q mL)/قC |y$Zk]wFc C2>4}@/g.SǷQpdDYx;rc*UJUuUJU+$ysǍ^:9#^T@ׁYX=."q I"% }_Ht Hxk bh(f3Ēz(A*2 1+J"!捰Ӑ{Jʫ:UTO&ǥhz\_BV]r_Xȹ5'y6 pCi\#*VqWLuԙ֠,Db< ψ {>/#d# MH!C6:gLd_qvx|^pBtY 1u: !>x8O8&!`@dPw{ m.X{@8$ٗ6NR9+0lr>4k6Q-܄Q. 4%мqӶCRtx N\A/XU!yht`%+k; wQ6y[慑pzR"±ݾf^;X'OS7vM#+k}ngc ۮ~ %_z*MBOw0?̣Z<@0了sM}>]4+޹Oݾ(}vOEG@ T8!96k!/v]! zYٔiaoÌxAMD؈6ÌM 3RIrڵ ɢ 董"֝ʍ7HӔcǎ>eN?f}ivH^jXXXh)'N`0`EȈ} +@ΰܶ|Y]qk4Mh"ڛIC?d̹eZ(Ip.ˇe T*U IURM˴lC!pGaM X8?3pAX}Pv;x&8nùL:o*G>l@< >6X>h-1^AoWuM aG ߹.NVoك V4!@|THUlW(Q {W#@Rg}jvS__uwFJ)\l}P kCT)0' n&ѬC?!F <_  Ⱦb|B}_жpB?yA^X MhIr輢=hrNeP? ׾87*ti$}+njt)Q@'!d{5!I愜_xNRAr vdgƲ:nVPB AkE"P;hPA{aB/ߟv(`.Gu 7oOx\kYSyZ2.6hKto  .dE!m&5ham#':.}7s'&% `OHZ"Flj'DFi=0"rJy#:8coi2V.0Qg{.}LFir#X|/ Zl1?׏0X-/0ic9c乨(k]@Ic&0ߟrZ1mXck23/*/gΜYe+H_ПHpg$&H %6h6E'pӧDk_oG𐃃b9<<$"$aoo41zN^^Gף{2C2~~8GhzMbw !˲XAp8,S~dH(/Sޝ-$IR-J +n] 2/k2(eXT= T*U TuT*om"I<8…}}K +_R@mXقՁ˼0T(N1X(O@bVcڐZֆvH6$KbNd.)sT)/A'ZYjb}C"z$dku g+"ɸPkNmb.ɖSMc'= ٻN䎿)3hP "G=H?"}ѫC@$$>&_92+QC$bzٖ:}ryE9˶-C'5!܀Aׅ(MBX/ṛݝ%]TFBk[^6ΏKE'o7HJ a"X&A TP>6yCe ҖPNM,H%`WBZ1,termY9h!K-i씀ޡC8mHk> qg$fg Yf4sەWc~hQ/D8zXgywI&4H=M|5r#s+H tX9}mz=c2-}R~(?,Fv>J:~dH8pRg2Oe!G8 (A뻘ɴU9_w< $ nsssc^{en8' ]EJUT$UJURAزeF)1y^هC2CD 4Q I{)3]ڍ5V( I ߊIyU c5-\ZtUB\iUv5]tpɌ1 B0F9MuKpR嘆IS/RhI[E= 8F!!JJ4CIWR=9(Fj:-C (iF\f}g1d@gI!؄f&iLǝ2=R e6h,iWHkA6o9;}$:G!I1ʘ :s><\x^޻Όg.ÅoN/om$IQ ~aAAwXQ7)cI(CYDg+'Sjb$g2*_\2eqT-- r,$5~ ,r6 oqP珽oW2O|C,Ì%w86eWW+mˤyQN~*sdf˥v/h*k!04צ+LJ X8dK?dccӧO’|j6EzNK:*;vvuqRT$e$JU6$QU ,C&3{ҽf&Q <C/0ۃ!h.)4XQ!&ŗGi>/0CeDCfnAoQ{DiF/+W#!BFzUb5TRqd_1o6tRm?TA7U#e k<fO)l9*X^O0Y{QR4!P0ۡ\-'^1Y7}}ItZ L0lL߃n8j7qH0}sY1=k^F[cmqJ1AA0gnT|¡+zS)?1 26?W7C dgUK4ۆjHb Y_a\&cj!Tà'& gF 9|: La%Xg' \? d&ׯs鎞_|I6ZOuFlXp9QOU+p_J+54o=RII)%e$3btx4{>Â?X(H2d2ŐӓKਜ਼' sƣiH|pnA/re!ER8H )ltEY^\{}ߔR{B 'yu1xڬpEK ŏ-o6KkU_>F8/x+pwXI+n*$K3-e qiӭi'1`o6(̧.-Q~M!Vk?4;^JjZmN*Mtx饗ox'k(TaVPA}]g zea߇G-F樔[~IٵCv ZQzפM [\}nB=RT*oT*UJUʏ=X6_5d9:x IDATRhv /p!.j$ZaGSufK38QzW 3"z"h=Wd[u1.֣"<*xd*6]kxP@-5v3W@{XS;P`Kq)N1pQ5_{>&c \j (m>?=SV|!Gee ylHyJ,+Z#l~ȁH5Xsmtp3a2=t[{r`Q0Z)NvA~utvVn}؈ܦ*5!iXPfL_oao/;E)l(?u!#(Olgn+Ʀ$%dzuXƫh[^&kBIOō;e~ ^;/rnllPTE&8uZ7 J($9q`PQQ&ZPh `oI▃B(Nm!333心wߦ6Ֆ#u"tt:\t _o/ փĝ'}ܺ\TUW׽=O"9ICI,XXuvcxf d`7"1g7YY{%K [/J(S 9Oܹ龷NNwf$~@U9]{px[|fA8.8;nNI-c7?{3 >g)L*_0nGt #qGHWVGQcS܊2T|{X6 lovS1pcB,Ipx\=ɾ+T{*K<ݟhloSud[oMkɭI_pxhZG ,)(XQ3Ǝ i> 0k6l@QB Ԫ%uSj2ޏ*Pb7fИu8[VCWכÜAc6:FCݮZUB!ێ7_ՙgnV$&vY0A~d|s p9%ȶ EH" ُ@r VԦC%yH-VHKrP"I6P9.UW~U?k ~UzUVwN-H<| 'ZJX&2$I:oC}uuu{S#L}tiUJ *3ߖWb,{# '!3d%ZTs1*PEk]wQ=.Vi~;o1OU/則?&$7IU]*f97}˷Z`Bn5d4)[{|5{ Oq!+Kǯ{u wbV5wYXX cΞ=Kʀ qDUU\|yju}xYo_pp$q`#Fyu^hDSv]7o_ZZ"I)| pzcP|gg^w{_5m%EQ`gkJQXkqFmԩI yO'',UԍټsdPEO}cǎ +89WrWYSc]-,,Le7TSM5$ISM5TC)cp'Y!lq;7]:ҡԸ=$?*n(^E  %[$jjz%`W^W%B;)Q5BvTF-?[&H<۶TKrzv$8\F'+GBpm+`^p5Tje dw*e*%|y ڂ꼌a#Yc **KͰ*GGT#wFBAqYDO6j QEN؍6dȔJ ` _ĖmxD7s -92tː41(?g!G!A&c2TmTғpvFb9ԳPܧuOOyGRm/Wj L Q GS̳ 0̪Au^GDVDa܉KB}>#Fn }ܘ}lBX&Y;))G \ŒZ;t[OO$, D_ԋ# mWAw>櫥Қ̆^߷f1y9[CwfU̐$6 -fZ\\O$qL$I2gwy!I{j; ,F&-,'?3>Lg߾}SχĖG!i⇮WUES9#YM}\N$Nܜ|`qM5TS/7[5Jjd4:+BTL k VU= s04p[{y4ȔmK X_&يN ,C `>E! D"$WXA2/\bhQ I[u*`i?EMW; Hy+嫗tBzI%we!`q TWVmdP~C/aIe; J/r@EBdjQQcs* ^V%Զ+HfW !KDzّvՒ̭vL y#-3'+ԂjH 6BԤÿd E~%`/@Q ֡*ayl@ OK=]ڰb\:/`uȆGhP܀ T tXVRKua6?л%!R{mQKgG0Gږc8{E"\fD&P{sWsQ|qTrIs;s7{uE%bg&I>n5TSM5$ISM5p5J%D'ܑ+p'`m Qdx" ["](Kwb/XCٚHWPr"8 ( (^u0G|G1(wBS?(GIX;3L6VP&@a ^oG.@道W`x!dX] Xa!?)Ng{ hĞ}`+ѳ5Q<+Wm, A4M}?ݽ%ReA1ʛ8׿>c8w3ZIm8VAHʈz/| :k'v9^z~,lmmժZc3@cYԞ~ z(G_?,Z zYbM@HGt}v;TnB;sÀwbB_@GeJ$Xd%Ykzuݪ}voN> Sqx;)Ip`|uSc,e}DkꬶBkì¿Pof" hci%qnY1{JҀ/VγvSsx#Z1E>G%,gf[a?Ke'ab W1m7rq_;d.{Xߌ$$q|H*@w8 AHI[Gԁu*Pqs_J|i]?Sea{{{|\{Sԑ%u?~||{}}}eY9ׯ_ŋc`w7xLKec{XZZQ3K([g?;x _6$뛰<̭y+fngKӔe,K1Ing$ $j<$IcTSM5$Er w*0HpYI/w`_xHvd{1x%ȖĎ,,cY}h@yg z";-e%\yvmߪSh߁'S4GKjDUO8z8/*%WU!q>]$}V cv gQ0kz@HXCam6?8pVv|u.ᰴ+SJ=\QiikE{!PrmwT""iH{ڞ/UYth/{Q>>@\c7*vv۽X|a!dv+ECaǀ5 m3c!zpYWekÔ^<4[;u͛?P('Y,KfM˜X;gL1I'fUCJ n̕P=mgNFX\@o/$vj0>aV1/wzH!YRGۑS!iNI{mL-O>w>(gqZg3$#dGznVȓ|Z^b 1x☗-c%mVbdQ;}3[j9het 0 q}%e;3br~F2IH,yy#!X/r(10 X^^Q6_ SY$uJ$n \CIfcHty%6ш,T?]VWWǷ˲ŋcuk.}^Vk'w=|3?~rN: fa -$+n%' ,cyyy2﷗#It:19SGEQĻ[ꏦj$ijH:ۇK8e ќ3tW{YLTWfU%bEa JxJ>BQ $Uf+X9՝WO#HK.Hp+p]MVdUͮ K v0_Q" ]cbkC%!rDaPvY}  "zP;)Gz_,\BbJ'~QӖhu97:&N@:-έ -1WKzOjonm*B0>u#wͭ罟iE(&xP|ۧ;Q@:!h nr(hZ ׁ.x>A/,,`akkv=^ɏ[ɘQG%B%Jc%p8d8*J慠שI"YѨVwqs?řk{ݸ>{6ij!QRG?햯p{xW$I՚鋰~SZ-4%Ioy١v*$Isf}爳j$j!InRT1VL8}WW^c^>;i)W*pXE U ˭(f6R$ږhVv,Eq*NbZ05ča hόUP}ۅ$r]C[29 rtB4ׄ> v4^vHw~dNK~>zf%DUpOΎkIID0}^!I,l hH\ߒ+>~o2cM y/}~6g~ꉒsC|Re{UMTn8PCTU =O}?4uHĴ z.]&XӪ׾UV<}Z/2m[V78m$%N49_M](UH XxysM Yc r@jSO=uS`Q29I[l$I)$qRBߵ'!c养hmgUIjm8R8Y6;)OS$;Q*svm'JZ'InzˑBܸ:{_Qn5c//qJUWY?wYUUڱK#~ߧn"khj{sMmXNMn%|qgp23 ^hK~ j8Đ %N,l c~e \T% ډ kRL5[S0|^ݟ⧔X v QD=`cɬ`H.#2 l}\V`UF*ѷ*y1r@?N'>%c$7øUW~` . Gݷ[9d?A漆{-Vۃ䠾7nm$R)h. iP-IIeèE50J@ "lrbVn#ne%V8RKA !dHc@pt:&+ o*xL#nGa)6[b9pE]<X=(j*Qٽ:мdJtk𓮅#t^=2y鶜/Rߌy}_LܮEQr< ݁m~aV<+D^[a '1֪ '?IaQ0>Vݹ!'S˻ni˽r =?HGwI0+nTfv*1Y4>_R& +2 5W͜ʌ aD=)&#I&@,-BZZZ  | $looK//10OE^[!HBPo;Pn'JHy[SV(q7B#HYUhFITSMT$ٻSɷxpk`϶H&kiEHpv֖{dQ"BPvVB2r.بJ(ns\`hxQɔTQ0(PE"܎D (-ĺhGJeOhI0LaA`h1vm?c żF+cB ?_U뺍.DwHHS(R#&.&0&AXBd2 z k C %ݔq(v[ߥa[]Y o}b4:JlJmAGU,-8"ɲyXY0J/sڭ硌AMÖ$Y=&=#Cȯ vZ$N}YWAԗ̏'e}nBAo9e''b'ዷwPܴq_r$$3:$T"+pVG:ԭ/0>n=0ZKvHȇ$U~K@'٣m Q1?L>$$J,(I׿F8LA7bZ /7oԓ(.k[RH`O?O#f jټۡRGT~2dMwRG zQfq4M)~vl䈔[/G[ W#KT$q7<5_)"H)H|{+ kɒm9%#)]O4upc,byyyy+sjj^5KjހjHuʻ}8dag^8]Xf Œܧkr. o)xvԅ ]$@Hy&HHp( t-rhw 9rض+`JAVW_tQZT@2h[/%*`rUX*UX4kvI|8 LGHhQwg%QD%Ɠ_*%{#Q+sVcLJgp]$w}.@тdA2*1QŔ{X\B%pG%R`921 ط iU mI@n"c= +[\1vdt{6TMDQd2X-Wl+WxF2mAz? E%/0zPCWUAQtI X|IIvuW4^pqgWu1Epz|VAMrQ)eIAlB^f<-lZ۽]yW7+nnG2[q k}@bLP}des8 Ӂ~  ntCeek/0Qɖx3pďkǟyQl&o UdabkIB@,ޱ?|CZW:ui9J[_>1K,eÔ޸:E7Cr!{"/}{\Ffɘ%󈼈)I^Ɉ(|矟 d}5 ?? ۾U÷U0GLukʯh4EAݮqge+CB˲hDv{W{<^t _0uysL8D`AuN}26I%DD^(:Ql?v'?I>ݪy+}"r?D /B$TDD HwcDQD7pfa[~Z\\dqqn;ppc9Y Y Sͧ!&PA yUUlllͶk|]:9}^}zeɥKiJәiScTSM}m5TSMՐ$uR32րmu7a-Glw>tc5Tw$ؙ 0|$C8@uJ趐^vh GdVC5BpXNه̎ґ87#W ̈.KF`\%hi1V,Iaij;iQ-#(aݢfqUD>@VAvTx HT;@܁."\?'cjx"<^l? 9%% ";glB;$U#u$קfsLMcQ QڔqՐߦ,ً )sڽבX{?/gq/U؜q$oÛ, v'BV_pa /L(O8"!\3ʲGjWP#}!I⏧/G?qO;I믿>Ye~V*UwVl^}BđՍ;VOsɩHy> 0|dj|4v[M5TC4TSM5$}e/ YpN|/c󧟇. Qa\?#\<3p3O6>A]j#ԇ|6?.+γ@[2E:1,=ͯ IB]<>y>xJҾ 0%`>I!RA/j? U;pX-^}'j;| Tn[![=dӕI@V**HlSfG®ixAr[.x`aE!3l J\Pb+t;fQ[XjɆa7"U^.`*(FC鿦8nc*J }XE<I~>+H_͠!Ec4'X Wh&U63驏>U[<}O2&{ď)`6N˼˘Ruuj3g kHt sWrU#W~_>K|W|-gg.qs1jg>5ѕ+WƖHu[5c7hړ$n+ێT8w 1∅I$=N1$Q>_+@ b0q{ݮ%H߳EA3DQUjP{ m$|X7nFEթI]6㺶ծv=g3"qDS8( iۤi:&IfX릚jۮFITSM5FlWgu=ow 8 k+}Tq xĊ#7$/Еجx{TH# ]淠{\28,H=[,#]Ґ"Φ5.HZH,FQJ`x G !З|\m"7%%UUԧ~#Ay~3(pÚ{n}XIOȊ-ɔHUQ a|Wi!ԻDiADxŸURsD$mV| ؒR/ lDVOKI8FJ>TPdEI!*PP{łfBR}mz_'.ܯn! J/*)n!Fx !`[MbEc'J,*&N#Mc%wJu`cE*Ay.P}Z*)` Q86}>6M8-`ZqQR'vPI*$>DK3߯uC?RMUth;̪@bO>眜i.CkN{oSaP1Q<0}U#5~^U_l?D\*%wl|\=H)`}*p`|2I Sϊ#I,JV3"vGH|y }#JH:8s` F1? qHWZ)J|E3D`vN$>P k>IR$翦NM2llYm΅$IcߩH666{%2~1AZUyOlX7TSntASM5')μ rV\.n Pn:@t6<%t/ ardl6ž+C: | #K޳$ T&Y,XW(DUPPŪPHA Zn(QJ9[0680T5Ŗ灧^&#\δӋq]e 2hU}!ٯYt /y%$%VjU!D8ox k$4w*tX3Otw I_rJXj8"NVSQQ['>-!zMS]K&`V p]``0d^V\JAJ+#VRB첰&Tl B6R[q=Zf(Bk'^ Hv ThUXF2JVs%n I: -Pl;&-@a IDAT­,c(R,I^/@Q>@oGƷco UGcJɫ_H*/XZoR3ԫobf$X,7o51ӹ3uU6Mev=B9˰a09dts*]-ctI9c_9` P"I'sM] C4R$I-'"wہ~:WDO|%{pV[NAR\NYI{G͈:=Tl mBEy_f?ߑ ш1 5 ㈑Ź͈ ި#J~oBXjMᔲjV>}-svwwXu,3H~ϵkx{;erQlnn[[[͟릚j!Ij䇳N=uל-8L'@đDB7oXleJfYG-s WcJGZz)Pȷe@r30^*bv!zIlqQrD/ absQ%9P֪ۤuӶh}k1%1_91e,}sIDׯ'X9:s^~0g޹F!q5{'\9dI="s,I׮y:$ U~o u<>^1w ;V_TnXnf [QG5&+(z ñj<ۭ:+"Fe IAѣSud_?nj춚j˘SrߗoϾbh ݁G"BtwI4=w!["] @jQrZ:돟"`N_ ]ĩq"eSB4DKPWB%@C0_(jـʷM`qiWJq+V^ L"$7S.,}E!><FZo}SHhIնa}]$ʥ=< *F,eMy) qbEmn踠g$PZreૌ+Տ(0f kH5k/*'ʦA2D4c hs%/v6T%E5:@)b'(jv =jire.2tO)BH6U M"?ki(vy@&֦vw2Xۿm@cR{"&๩ɑ xlÓK'WNO>_Ao;֘iFUJ}_Sd[X_!/^M*+Ci"01s n{f _;-o1?WS$Iw? QI,--ɑ<ϧ,3Tq[P*`,@)8L(emFj & V9߂c&+}@2>1`BT|PozsCRL HF UP͕5Fӫ#UŪdڂ0^ ]-["Ł Tݧ6^v;jk|n+U`oHNvd8rlf2N =oCIQ&*vuɊXu.AqduvA_ W Lb! lKڜU:ΪڬGHV/>$ S;+)ȝnX?v[.۷rxI>k WߝO]eOTEwP-܆"=Oj;FhUV6TsDoeJ&ι{4lu`6C$LM2+Lj@:N`FmjHPIr]Kn 97DI Bq)ȑz|Q|}CTsr<`0Zz-Xˣhl?YSՑ$Z,#Mq{YE1&GҥK<3 `nEA29}ķݚ܇.!9Q_>пdnǡɷFy>5f6Ht~n(YnO4jJ5Jjq5$I}:9}r |Qn7Ӊ]}]:p35P|٘(*aD(w(#ʀjE.pS[Ab!RX6+d)*H#HR fQjѤ "A-+ӡ5W!ѯ'A$m+`r_N@&/XRkbLEyaO+%xe*imZ$F7*;DZvqxSv] %%-(=lOmPQO$ ;.2ęUJtŅZ/j(Pʷ@ ]})UZ\SR H0W3W'f,ұ߂hQFBddF4ۚY ; Z>( K iAt7B@W1Ñ%ȿx?$)F?{ k2⿅Kjw589/Cn>t$"d#NMA(t}2&xym]> $5L^w?|$<vl=R,(='[V|_`br)лch!9+B|_mnM'J~fȨy+Clp CCbGϙS$ ,$g?{w:6g[סd[?VN#Kv%)TO |m ) s)DnܸQɶpjYsU%n{Hcā>9;u 0Sg}okW~<T$~{CaHFHn7Ž ً k0`h!)nIl?"{H0a`0`4)dssWiZSY>~{]\r^dz>"KKK9$\ },"fY^^fqQ̿ۿnk(Ij5_:"t#%8:KpTD7 YiwO ( pʣ) K,`fG¡܁gu LEynx^@d +m!,v@皒`P;2,OTIe(?_?FWt=}Kz|V,{~6)l7N.h!|W^U9pM (yoKc͗?-cwxDpr/TՉ}P @*!%u8{{.G<}>f+d:w[}{`t}$1!vw{\noTEglKϘοpܿ k0L{~NcЁ'_?=pi_a<ɹ~lm>Q AW8>i2ϿNj |_gh@z)$LM_}'$H4i&'|Wq?G;i,9~>ǟG)Kz>g7&4E|3Ix㘘itB8vL.u9~ȹc?$ 7w^Dė#!FVk4wwH$q|<I¼OǤip8~}sGnv{.T-:=I k AR'Wׯ_gkkt:cUEhns,K$!)r].7h߿L㹱KSiB}$;Hj#}(rÕy_iXm5TS ITSM5Ր$ovoOTI2' $İ9н-.mHP I{3cbU<.+C U%*eT<窐eWUه~Y!p~$!P'@usG&6R rJv$DHzW%Dgͣ$}[Zf߀AHpH4Ex"&VST$[ddEe-5ɉ")ɡKȴ-YБc#KALLLwWw-{[zPuϩS]UV~g ܷ X4LLj S"6X?sas9 oy/7$^xz$ r7c\c辫ŻTypRAn qbNPF#=88l\| % 8˔O w͗q|ϭ-U{?gk$vogaI7|kGa#E<)U&98zTEsWv7AQI(4 ^nI=% :/lTC *0fR:q"Iq[R.8݂ +`{J,+a nZq6_j¾xG],~tS.ńk{gg'[^} ҹ({i9d\;s`j:ݞ@Eb)/PB3 ^ܹs:t貒N= PnPI&C[HZ I JloF\$ӜW|@T4aHl<48RF,m(bsswK0 v6 R]4^{-OKLdkk"QEnuM%f;mN3 yӧˮ,Ja/Ʌ X__ b޽{.|Y__[7rJIE~Bjl>lsX^^wi//gc6fcIfc6fc6fcXrD‰ xOK.no/Ǵ:R:YRCa=JЂQlYm\lbΙ3IY/9[4M@qd#7h2ӏ:p]mz50B;׳ yCґN"rȓb.3ImDvBgB83M|Y 㜄q@ |)M P Z}].b(jp WVנ+sx't"-H+ yQk!/3Q`A{Fp\ǠyNGJzZ-V Ci V (L z<`[FRw114瞡L@~+vt IDATنHC#Sv|t;nt=B{hcg>h_ ^ү>>WA|Ч]n$?w}kxGe?vvʾ8AOb\m!OSDI*hBw-’*9dt]6^mߩ1G?dAlR+T3^WD~7iR\Bb:u!wW n# Tp]HL(TbQ&]2I3*\&tlzqTwihvf*#0 P>Ry(!A/G^'c, ~_'yqpሽ ANi1QdsssO81;JリӴ#I4-$V6IN-TAɤL I7=Y:8E~װ:cNR ñmo±8` ([aKHbuܹr}4M178v[u>CfRg2{$Y__nȲie5 N*+yG9{,4MO%?[5;٘$1slK(}Mwx)@?хCX4F+!w@=h!րtEE8 mߠ _1b=a}!0 dDM-H㰨kqZWx57t@P&nJ%80Ɏq:&zĆȆv FB/@tEp51OXz?hʺP1zW`35-"Ysu8p}a(Mi}]u#u5, Hf-(uHO#B.uD?ud< 'Pe;u@4s2n#8}`ݙq=Ma:ߥҢHtoxnPEDœ2.Q9!gIhw5RG Vx2ݖ)wgkN(azure0ȋ <3N@OxW:>,:- Vb9q>7uU.Ӄտ@{y;^{|bv/43ia~K B Y50fPf"TJ*D5rAXq_UkUg.ï<*>UWDl{d;UBxY_[Wv]mLt˨uqpc/6,\[3ZrIl*:X&wLq!I0lL,B $XvL*Tv"Ur(M?b~Λ80hl2ש&GO!|П #CA!IT# Co2$$N+AMw;BI*$n!kcRY2H0, J$U@dh61e#8.SuNZV=ˈ*V `].l$\:莑-z^Nuy1<'MSΝ;Wο%vm7,d(݋%PvKPnIqX*uŸ:v>:;٘$٘xō:LNi!k#&p^7(DpО!Lgcr#G#.*DV YQi+q_,x@NkׄIcD(BN /0E96Mi#4]CPO8,#vsFikGv 3ˆԑM$8nGև_1[Y#>Iċuz~HxH$~V nR#al@ ?s-w] 5.'O$;DȀN ]G,!3M D|t|QP1[N. I"Ĕce.Dpp;2iu ;.&XXaNel$qI-UU>8G=[2ꖱsy]+>VwuT.ae*RuLsiMbIb 2Ԁ$!y64 4no#YH)K(kSū Jb@;;N<ɓ'q_Q^[ H\Q%dR)]+$;E\7{HFA CzYm%47776i r4b}sTS\e $vomgbr J4EJ91ͮ+lẽ=zxgyk\7RJN:_,qa]ՋUɕiJضO !X^^f~~~v<13Hrcvll b7 n JNݧkSppI[WH6(KȔ]I3Hl爂<3!W1#Vm ɇɋj:!H yPbwB3J S9]by$V=B//q}hbX-J= bXA2ki1唋@\D;FZ8;vӛ!7ԼJ@\]g "LX` #qJ;d`z><5٧]zƵc8mzzzyM\& xe$j8`i` ңf;R^;-U iMe淧؂bS/O#0m _Jޥɕy< ќnZ x5ȶ(sF ڵ"Aަ+uszlo"tm!8SI 3ϙ0ztϓ Jx*ڂATg6}COd|{?|ۣ'tzt>8G_D!(G^H1A/@yJ"Qx}1 q^Ms 77K^Hajn}NcӜv WU' H 8oׯ̹m#m;m7?U%nG1 xd.PL$!njU$' P }LVj䗻?E2fG;"{E&A&{{)"@I3 w _W ð|oiEA$N?̓?$Ih6 U@鳼OO}hv0=13H211$/g2r]_?>vM"Gt4h@{][!(ձLĐu--%=-䦗$Ҟo΢M(&K2ᒛc@ Q}yRIߚ7`tM(R_GM))hAM r*{nmZG-t7(OM6tLHaw3:-)QF{с%$I=1|uٳث9]نYK;*2.12gGy.Sϼ\y/gχy2iW;XܻD $Drqo'w:YkS>-+HY / dE@!2/$j 2 HQ!xדb{l+Tøɍ?3$G0v/nY}_x /ρ*eGm/Η>AɠINE2I2u|Xݕma_iObvtwU Hl Z5pm5sz⽪~.$@2#쵌8n(`Tw`lk>#;^v왰oIU#@b 2OՓ8f(kE4$1N< )o$Q//N q\Gxm7fڥ oB@2^tTK"(%Wl$@jq+^11I  Cn)7MmPBp8\ȏlnnr%Y[[vY,(d*n`P†[ou,kE~^iNYs 'fw P `nn]v?wuW Qcssssh޽ rwQy,--1)9=zXK=2?S?ůώgc6fcIfc6fc6f?ϳ XP`qk$u֜Wk!"1S'EgܨatmWAާ\^/X71DFH nvyEGa㴼OhAYΛ7QV]Lēi!LAʍE pSȎRZ+14g 1$x{xd JB.brzzwc]+ 2]P\ Fз@ 8OŠ Cpl#4`&L",Ԩ-Pm3߅ޗtmNzϸ\6|3jm-)mDrDm< ~ :[z]xhM83}S8#_Oy x)Dj (E?ƃZOТe&j?669pُ󰐭#!bo\$@HD!ոz˧r 8pS';Z9Ƿ^Rq[25/c%\b` ({NZjIb{ܓ jlG6n"G*T.ābF](C&wn7.0I0-+[”g}7N԰W;\ܞjD[1g{D`rV5nkR_}w[Ve-5mYP.h.uϏ;ufWIBBd2g?x:Ygj Xq{d9.kcjZ!oBV*Ww^-z'?IS6ݍLSƏ@}QNnw{cYya!Fc[1įBZE EБNӺ#C{:C;mJdB =VX`txNӇ 7AcGB2ԅ} 7-~ Nck>/^Q% ģz5?K6H߁$Â0P=u<Ȋ1"&֓HpXQ[T:~݀-x[ow!L?ƽ}"r$@=0Ezs~7IWug$zGp`G̀y?o(vE8{mRvPcMRAIbQq{""G~^ ^Zwx$mn]Qk̓%ԧxߌRݢu$jS˲my`0(D|%A 46*R㠝5u_dYFsEujG EQ{i4EAe%ڵk~vy:2B&]wHӔn[v@A`Rմ/~kIą\]wm|$Iʘ4;3`@Q2qnn\ŷ{|5~%~٘٘A٘٘pVɣAst> aX{aiSK, S =6u tۊ 8x'&v4HϚ&NtqYL{0z7DrmVhA]hȭZ8/7gZ`EwRf{DW׸,6%x/C=_^CGZ 1a%KHϋ1OtjnZg!7|!V/[&m! {RwwM}"vk׃ӀH6 i/Ьv{;ͱfN䂹?J@g0.x--yRwTl`QqD )W=_R߃`Io IGv퀹a]_^9o C/Qß;_Q;ϣCz{yyWFeO<Ѐ*X3!qKUT#ww8rUA( {l]??ysO+?3uϙ$ߢN!t~/~  v܄iF1Q}?WܳՎI=$ō1rEˆuFe.IRT+>o3=? ܾ J.gugHx߫~|ls߽q#hۼ"&0a{gQ~!׍)˽ w /aA5L1Eb{P˛=wT$ծV]$uT3T^ŠB91%zBncn(:*D`"0ר2fKחɔ* ' WRyH顤 sS IDAT]w7eN]t$I`0hl6KuLrs+z=&v{ XD; rr)%/^DW_=uT]1vDQT^AMΜ9S”}%#6lRLڤE7*"\$bK_Wny[B|+=[~%n7 ~w|&tll Οij <1c$2!2((ۻaqK[!H:mi>-f6NJ)b]NqSFRd/plEs5r1EaʖvqAdwU"3S~50()e™g{җ9VV]-242B5$cde&2 Q2]'Z}N7BЁH00S/kDzPזC] iƼ0#Ej@+nZ>gWL*Dh'2A2`ۛr]0pKw(qy^a<&ɂ ^E w_GNQ 0p{Hw?Tn0r,l#Mrh]pƅ/="P 9V;G6=5B!C2!G!=Ӆ_/G@^!n@d^H\T@EDB9bKE)z0 ?M04Zm.,ܱUW]5V=:%UH#^Wnٻ$B &f(x*)YZ CػwoKW4Hb Iȿg}vGPb]Dnp8V1 -s=$qe~3\p/!Zt0$ nnK$9r$TQT~Rʲ̽ggodaa)%}{ Ð:nwdTAɤ3٘٘d6fc6fcI^9Deq;? 'QpFAU腥,fA<*QaSnDd)Zi_.0b:HL8u鸫RjGI𨉈A(Hf tٶ'@Lź_mߖ X611ώt,n{C>B C5yFGe)I00b ݡQlB^`:@wA0`F[G${%0LZz=+3F(xgW A} A 0OCxh;YrAP$K'&[kK9SqaV. ^>Yzb&G(EXRqpס:B.I*?^ttZz[GBk̑ A }I|$N\xmw{1'tzO^JnFt?J/tܿIj\xΎ}Ջvx^KD'%,(Op@3S2!"%rDM!"5rW;2 Gv#تX&ߍ }yʰ5fS M漖^TiEu]gKա⺣IszZM' Mj*U>y|I2G@xR"C12LC"REx$f7 |~H0 O}B`$D$IѓeXgySՈxa [sssnoUQ_2vێvXH▭e`0`~~FAeA0GsP I6v[_wIer:PDH|drX7IEQG0,&.0z=.^{m y9gNp>VMra]Ggyy(hc C}>W,(sݕsq9nmll ll lqn[`r=#IͷV*rm~#]HSalj\AɈ-RwJGhq9jk k8U-=9^lĢ}ll0Ӣh'I~q t^Ώ's ݨEi^Y/bqs64·g%vM..k r%. W9~|aFKA}NR7 &6bw978`~`6"ٺOiq7S:eYKE(!ψUDDI;R ^DL"b2R$"Q/oԶ|ADN$"Y h4cTF8K@b xXuݻw ~#$v7 <#x㍗ugc$Bn{o߾Tv6ak׮1QޞAyt:.,J<ۀA5b:ϙ3g>M\y:qz[[[ee‘~ϭ:1UX2 TwqL$bMiZ~FJm~C] T8yMf=Ύgc6fcI.7fq[11$/Xb6' AgC M @_eOiڻ0| 8 ɲW#ϕR%+jQuE ,lj+5 xRyh-:o F隓kq{74Ea@`א@)3 FVV\3gJ! 9ȚKFdo %kHc-+V;0Bu cF1b#z0QS>NFg`@=ܧYLY.q7W̓;!/ ٍjYƮus踬ٹz}`>~ߏ!<u >% "3J;LuTLcsvuvec+pe4ozyy@~z; C;S=? h0?2Zh ]CDLt+(O]1z_27sm ǩ|7pb@ qNJ/z5^9DC;"7ѭ5XdIRN\ # I]?5$ ,r<%X7Iz)59,$^ jR 3X굘"S' q ɨ,=FG$ ޵aFb^g`n'm9a9](>JW?(0-8qD,{=4㐂)pIV}}9x@I8s!YgHIO@bet[a[7[ =>"Y-$GqDZP$55D*OK ='ICFG$~BP_Χ'{ 2w :}Ao0E\EFDIJ 9a?#f;x+ `߈- <ō'zeg!qؙt)%I ڵk$ ;:IqO?ѣG/[L$nV$ݻwLܞȲ1`r]ΓRB|/H{>U3@ȍrQʯ&^ Qsr4ݱ~c.V5*lԋQ2rB_#JB1:;qh11ڱ̊&g@S cKDctDy@sGG)䰠RiW,̷^"I䝟}Zm>WAX(_Ro;oX=r-~-^gKDYHq[|H=Jz4!QNzIRc{τU-R?s߫Kl tI:?lDb{r $8b/:;H.`YN q&E-u)¿7Aį.R;@I`v<5 ƽWB?{ZLl.q㼪+p_0^.l$+gNe[h7H("bQLeے ^EkH1Co 2R!"y [Ч} WZ HU@'Y`+'4:}kFDSapLI< d%[3h׽gyommn[aCgH)9s ,(q9h믿~U0}c˥KJuk;_֙!#A>T]ח.]*A9AaA[$| _)\N*H`w]ˤ-)%Y}%g?v>l>m uZy@Iu>|n_$cN:C;]um=11$;d6fc6^ Ehfgk/~2h)tjSC ivvȻcyKn@#YIE:i< lAAG `M RjȐ uJ"H6g+P04%i|){`Ʒb*{žfy$ҝ,8$ܼym١rP@8#~L<@FKݷ\ \$[EcJs#d8fq=S,  C§2T:j[@%<\u 8e8ׂ2\8ןz =yW%bA#Y~ @׀i۞stL))(f[x8oSov}{^OohQW W_f<>dy.FCTHvy=V뉆7Dk*eϑs ܈ƁD$>,C ,žCz§RC'x Z_^W>̋/'vrUFm}ِ eA:n/F$Չ \(;@$8DN-;p@ 2[6n5P7?6/'eS{&qJ!|8(qC{G1gnd Ibraש]/vqAm_҅8vr{_ hNqDe۹۳nH\/Bs>>A$> mW!7A? :^?||b\:+UDzl >OY֍ qۼ ɤȭpX>ׅ"ٳc%x’]v).\$nwD9F🛛c}}[R:u/뤘z&I^$ ^{-yyX얝 F<^x|y>QpB J;Iₒ롺UہEdmmms`@^3Rr}=V3??_vs=wI/[[[4 :z-RXLj] &Fa]'f@2$11$11/aA v658ȱ9]jxԂ,JXzkОC?7gzSZj3V.^'W{MI{]4ҹMC1p@Ra%N M,`أ`^ WfOC̓zP Vj/ZpDY7Å2g]&ENH#4L2gY 5|㈰h اcS@ !my;Lq0`pҬ#z](#B7!Qއ,3Pd&lSJP}XՐI ṜagH2'Pp?_@<z)`U*{ZDnDOe&F˂] FkRMTyQSL &z!Gm.=e'k!5x_#s[|Wd>{p+#ix[ HSPD[)j^DO'['#yA?b~4e{ ð8~grȑ>*$q+ t{KKK>}z^]8f8vi;,uxӛ46Ν&:I^ l llLmZyn/\ཿtEKM}>N$5-p,KO)a ,p}IC {tH| @Ag.-N)? Qoxh~tm-D_e$@دJ?[4Nh!MwDi#<[4:PB`Bt="bd\-Zs n4ǎ C0= |>x ~KCjX8u~[ϻcvkoy}y/2>48$H=)ڔ(J%KZtxވY؆fwfc؈7b9;#x,Keٖ "eS @wguWו?{UY(ӔE/"#|2+}R uQ5@XN |FKBu؀꿮x\KP(:kL IM+Ggy;-}vF&nT)<ԯ!1`qHۂt4gg~y7 `We$ 0$Vڽ%wQG\ڃIN.k-gz(q$1.Q@H;bm뼑[)ER"#s}-\7!fN}<Q8zzH+K~>~k%TZI"? Lp{9l2,BJAS ʄ{IR\bDsYHu"\RBHe_zN6d m$k},56p<|<<kkk|/.K. J%<ϣT*122¡Cx ΃z Noۻƞ>}'|Om%IlPUX{*kuZZZ"" Ǫ>lne|5]IUZzLwlfgye'{mXb̞vHXڠ "o,$IxH)+RJ>Oh $g?$zX֐$l 5a=~Z $O:Ϻ@E2cϣý`ljo@˜k 0{q PP &c=P[^Ѐw0c p-p!^ }krR@npw{ENjgבB[`S~ô]OSUJrz [Oxɐ"*( ^tVFCr C&EUTA5}l P@!~ *Ċc-Lh̩;[Q oX7.W50U"ЀT}?S:;'6cV b_={ +lk?]A=;v~0 ¨x^s Kfˁ< A-`w"mI{wm#^ Bf8hd-yk(5`Y`>X;lg! rүigkV4Zy'YNqȶdlQ4ǧ@%O&Z .[yfIiKde 39)Y[Z{ѹ"c&8-n* } Di-Q!ʴE@CiQII$Jxi$CH59%3LN/;$8| oŋCb&(xa?m'5I8(@Qw; #QRsZe3^௦VmHn Ih4y]eAGyXT*q…W}NKTXRĆ%I*~2zDI^gyySVb Vh(uXÂS˶q.1`~Xe:SO=Β%HB^w-fff8y3g ktvyb$8OdIdkk 8NC=쳗݈_OCKa kXCdXְ$kN= )s4k "-h%VlV8:`Y ``]^UpGG9Pv(|ܨ [ M^Hj'.7o4ϝ;#QʉԂTn (Z;pXr^ *f]Q$| m_+IDஃ3m1%θH]8(OhJא2{u? QlVB$T؀%)S)Rb[.rۀlFI4!Jm:_ɕc텀}ZF큤-^c,6MnpfnH|Z;zXx İ}]HxGټ~\+0I 7̡EBpa.9H'-HTl>FU vK+G;%ly>LxS!iQv J݈OL9BBږpXvӥTך<h<$LWxv)#7t;?LyE) 97HܠTjp+?={s\_:x!5ʃqzmst HjA֟' yV!`؁]ze"J"LlEطJ|({8qrʑ * kca9f'Ye'A?nfH(xjiң} 7kc2@:Zxǐ=1m+@1 *qq#_ /uɎVCъZa,[T 0*5+Z1s'g 6m1vD! $ %p4FU!^p{V2nz#u}, 9Cfs }J@-!iޚǯ? {P ڐY4&6L= :cF=|V\2JC8By"&p*g{NoW"Jx[etq=ZǫRYN0SorxI^Z;T|aoq3ϥ|{(opTP $GYyM)ş,z@݀NçWNrJa;34$y$F7g &$y̆2ycCydɶͥ|gU YE@:<>J Hv#J򪑬 F4bK MM%iD_KC}Tfn fX$זRvgDY+0A?4SVB?id?o W3RJH bHIf PR%*W|!RMd$BH")Tn07ӷ RLVKGHC,uI*%B*\# 6y!Dtt2g25qZ_neA<)}nFvJ(AYĪ8><]VZZmWBG$Ix* AtȬ;΁D m.Kdם1DZ5}|w-|?KVb;&HnU<;޷DٳKϳBxǖ{߭mn纵f}}I.cl Hq}i'\Ubc?Xuz E0! j@`RM`2vㆸM@z >M$e8.8F[ LK&~]ݬ s mp: Ns A/h  XK]0׸ˀe` o[PoXV?`Spne&}iON^xG 8|&ſԹ!y\|~Ҫ-ps.ܷGScPhE=wn򗛬lv3 ] d:|5 vo|M_6@mB81 2됫)\ <Ԃ#PCPj=ݠuGm38uȪ^N(MINRg-Y%t<4L? Y<'" n7z$?8R8"nǴj~u[c3Ƞo.՘:˻#3sP˫sZY?g U\W!H* g nn};e]9o~I6[RЯ&$VYqޒ+D $0ϣϡ_r}/N vZee%;P$iNxz]H|P}2q^ٔV$6|$IiEnN@4)bԗ(Og+S}~6Aw*uIN>% )S\SH#(%(" $8BJIC,\R!I .RR!{x`xQx1N TI>KXv[/| Z- <$I={I@p$ݜ(<;/b-a!%SH)]BdBp/}iȞlllt?uɾ1>wqGvIU\M&˕ʪIx]ߗRLLL\wu]R"7Y%HdѕNùsh+f%Hl]xtëɖ_ְPI2a kXGAs<͉2*Y` 5>6}٨H}ki5W`,Ej :6@Nm%hKGR{5ib8n`4,u`Հ:`Sߠ3Fogp33 xJ(s^GHA|8d9mÕ~_k@3M-wxQ(hHnn̈nRrtΈ,3ޫY}u!F)(ү )t@_d,N+b۵wrӒ$AJ{ƹ}CYD/ԑąien\AI=/Hr{1:'ģ#|:S!%tO #I'MpUQ8$8$D@(=b HSHz!RuYۮ.0l@~G[Š{v2 Ij߀033C\gkkz# gqdI{D=ngzj}߉|d-..b˰5a Ia kXjCf=@&R`8^Bc=cjgΌ; 8?plv(4P]K֗5fGC&dAhs<@[qI;t⾓lµ?RowCo>uHNOFQQ0dnuc@?P_>2\Ha%侩AK'AʙJtYY ?u {紇zk맒bGc,"k,1A) 4 6mK%(CJ)7bEڠ,h:,Zwv-t@Mw%ti s "@J)Tދ^i q{ 9j:?@zd4^(aH Ͱki=`R@qF[9҇/!QihA(G3/U wSaM{+ĸiBK %RQ"D+,SGatK+l%EfT*pBR Ŝ&? L 'Vh"~ OǠz3Ij$N ab-2q] }P)I,2@vL~];(!<")J跀2$$ɫ`D̿z'b?1>O_"{2oTd, j IDAT5}+iYu=VMm9ff/Jy;Av[#71$)GI0¶[(GJIH=BH!qiNIީeI# RR8*Y$"Q@)A\:Γ)]o%OΝ;7,σbq%E,ᒵV*` cǎOw$/^ܵm\) @٤lvm// 7n\Vj.0J.d>6\.S*뮻AdV}1A[i^5Aruu߷}9=333hZ5T kXz%jH kX֫TCu+4ØRMfFMs̮~-[P;c-cU5s3k65j1goQ"ƉLkջǐpˀi q]Y7`~ֶe:Jpx ʠ۠64= (MOג"m G3B:ݐ\h\ &0S"ғM!n8;6mm-`Wk -Mt@+ q)P1*C2&ß~spH-og4xS9f;<;=m~עﶒ "y֢e"q<yk"?D;KY*^AVbɒR֎ vZms36%ʾrrT~dOgHlu3(͜r3`ؙ 2$qw#eS*~G6Zoyu즨䮵$ZʭnKv$%*u VzDIGH= qGD$SG@*QV O3 /Bc(d$ t@ B A&IhR#$$:Ox2ub\7F92]M[mr筡.f32(i]˭NsY2!;D c!D_?zmƉUXb$Kd Y!Ot0It:0$ C<<ϟٳt:W$n|w7779vLKF~]YZZ|˭Rc?LdAR.<Ձ}e+I.9q7*IRaxE-Kd_XXAkX?m kX֫u7$Ij)p\ë0;f~2vmZ֫ۅi?x0c7ls!NHX6) pho@kloHWt{`Wto/j!(02 >}:7}mS \ )o9+Պ}cI[% b!TЙЙ-.L3:so)"1؋C!._bĄ"i *q{R z\q '"l1B o^h}-~ ɵs ` .=ф=pqj-%en f=QN~;y;gdAU%cv(bVd0|nȪDIގM/k" 2|N&ێEj^CgUd3I eaɐlPzχg3Y#-^r'oe ɶGeȈA˒HyuLH/>{y_py=e>D>of%|z:׼$ROFX)9!&.R$8Dq$I)t(  ԣJlQ!-/W+B߮[pGO@ҷŴ6bL w*ܥq'K29o^#Uage(iZO`qqtm}]B$ A0uK,AvYy{lH)q]p]f$.Abgy抿}[?|%nKEz%CH'ϒ]<Ȏucb%jZ谹2m9i> Ѯ2*HJGGG{-MSy˪矧lb'ְ$ɰ5a kH|W3'ugT]%E09mHf~Mb4>0vf s|X% /ݨt*&RHWLr[K[hl Mōieh˥p $Sl R8 !jĜj?l&^ȒgmUo<d 7B"/~ QRσrSH({҆GLzTCV}T[ 8.㐴)ZU@|iP__]ěeY-pIC> zm-Y+ڃɐ6T;nOʺ}<2Jy)A"/y]u5u>&zI},/`.)[ @{!ѡ>PR[%Jvn뷎x m #,C CħE7Z` "*|nnj=G+JIZ1Ρ)o?剀@J_h2}spj[o%)k[qYs;.1f=1Üﻮɣ\wbǸ$_xYץ漣D!C[4A eD4EU8n,(4U).)H{yoAp{RfC' ::{32A1$ff5-k#g@UUdCM[JVm}vaWvO YEI"1(^SMBoof7æ I"h O'T[n&YĒ%+n0WN5|=/s]TA+q<R-R!GIĸ3( s+≐Ɨ~|}pl B1S\?bLt"lvH4IbB}#V~_Ќp VJ桭nIJ<9mnG*H2Ȓ$#8aeo% |vJ/ aHQ>ccclooSH%HFvX2fP|^h4bv}Vx_SO=vɫr]Bw|8p`W^JIn)\qnIϭNyTTpqSK&}/#?+.7??zX֐$l $ְ$\͵`6,:}Lhm RW!H< @ŇxQ1!`BFy5MA—4Y^`no78^OjK`-}M@\ aI´g-Bs/aU sxQX¾?Z$*n9b͟56ao-&G?X7 bVA.! ܢ_r&Jz7{6-H`% xt?p̀rkz?vQeѥZoI%PlXWxt r{1j8ϡ;!l-/?>=T9,&"]FۂIXZ9h:0%$-zk?ĝore78̕]syd=áh{~v1{dN8sO'왝2Ra|e_JAC-V)QD*&PsG/$FyU`!:=OdU YGʡ?@ނVIV~ż|i?eböۂQ:U$h`y\:,Ny"fMn(ٍd+i6eeVdqVdC?ea IǢepD܅()5$Luz6 8#c<jB+b\bZ9Kܝ D8$Ce  Q&(DA鹣R["IpP>K-S h%IӨHSFXW 6ޖ=*r^ÐEnaV ;a]&c.\pU-Ir%?.i`w#GvSdV 'Icƞ) ZݖAFN#jqҥuGJ=^݈z5D%zb3A/BRvmj0 i6Iz=F=*Lfۗ%HcKXj5\>NKKK]b$ .)F{yOZZv5a Ia kXz-^p%ru*{2 'F P4pPi, <qVLt"!:%Mhp}on-[ԞЦ"5 U׶[iEp*7PmYݑiEJj v5yS;sVď<34u;k 6f[.>cUj%Of:Mg48- .@ZIKs5Zf0/x#lEIطyIgc{&u}(6zMTDC{gŏ@ iWG(A֑.#0h->p&R6a?VN! n]7{ F 4p#8cZz$>!ugI¦Ns 쇃y:+ c5'H.?. MFln>W$$C8mx@k >e:L&H"%Z L\vf,CT +{=1cTU qȭ[Oϗ=T(pӽӌ4;mv-S@[4! )OZ5OiHԁZ^Ϳʐ$[(P 1 c(BFPRB[enFǩlllPT7ְ$ɰ5ak$:% ̡$z`A%,MXxW0^tUw=&܆vEAl£M(0LPw9ACXJu}sniR3L@c=Lu׶OsQ3 <HpLxMaBoH@|E a,Ĕ q Z;omlvk?4JAݠL .`͓pG1`G7M-bJ2+F!Jq(.{q&q>p*1^3=:wZk:{.iFV8cy5x@qU&SWr!y!FQ?,K[\tn `*< υ8a9/("<̃ $1\ؼqTTV:$ !9L)qtU4΄ -L}+hMу>͝ftK8`Bb\FWd\iB \߫a;OT^ HbE+sY0|7RiQNCj%.M (mb$ z,ȇ,V$M)+.dW96ȁ]LG 9!G\ G.$H BA*׶vTB[gz687~8*QH# OӦl)Pm*!0_#qQ%½/Ԫtt!u?tQ'IH ]Rp#shB{%X!ԡRj^F4)=n*l$UBMoϾ_kYݳD=n9d JH/@E #l弶J4G>bBKH*:H(H=]V9"Qr%Uz*|G4bK[lɕqQGǕ$%(˄a%2$tVJuZFGQ'].#}y{6֗]֪$A޽{B033Ch%v=JdR<;FTftvjWʅ}K,E8}l,4a kXCdXְ$?ؚ^">Ms:}.SDѶ[c&%g ]>xia L[pBk~"4w`iFz+Cnh&g xo6'썢w: FQD·gߨ`oPK1 [rF⳱)3_cKV*~m3@xpoVDش(>=xĴGF fTOr{NIoĎ<؟me[%؞alڹýst;kP?=R.an^']>QgӒA{a"ZJ<|nvTY%b9wT?cw_I𹑷`&Xs/a[$Z2-J+I__DZ!,aLd6\w2-A8Hu~^FAG}h0"0uED+N 6[$+'a$;yLSe",&''al}h4v@pɵ, Ro"JʄݬƲ,bX]3Bp뭷q|ӟ"m?gz~ZkN>=GR>QS*z9';j> \ XrBvW|`ސRrE'qn>aR*F*h^~v& qu2JG}- Ð(vUԼz;>;N_Aqk\$߬+I5qIr,A [ IUB3%O1Ӌ1o^ -pA30\Jr.m0%| M{MtiPW1%VJˠ*&>O{~ `Ր+QR\)=EVԤXu-k y^ϐ/26xxXB}wAO{ Ba6-O|٠}FҨ+=U)mGz5u.)5r֌WD=g~SF=b]Q)Xz)Ao/6_c|K}JV{[|i.}g^qj\O, ̎eDPmJag68Ccڝ-LP* MKa*Bl]Xu$1!<ܭvO9Z/-8xa@ܵ pYUxZS(w)R<#5qB2ŨKO&tʵ#\a(\Je4)'-+X 3('0h_7687]M"$IXŘM80M8W@(\W'p˛pNϖXj ^a_*[ܞnuP(ll.B2!]c [Cwt/GHdau~̈ۙ2GҡOw9Y Y3˔/YH;]6d#še$Icxдaw%np풳1RIm,\>FGSҮQD0!ecGRuuK@+a,U:V:$E[|ij[ĶDDFCD8T t)ѦL*6<  elۢo̵=$Y\>c%jJĖ%BX(GȓtD*&>rCX^D3bdE@_ףX,nܼj`݈rD !K2么 \&FE5`YYY뮻< zzz=w}߭nKk׸5&I5qkLARKܐQp޼" A#SOs\[_жhՁ H+wq $ 9B⁆Y_r6zM8h "J} -`n]4  8 V#ŮH6z>Ilzw_t U~Ab!1S\dfmE7̲Ѡ!Z`HjxxYcVz .L=E;f?dĸ:_6devO}ʀW4!>Iu/i( m 9/Vž^EɧU `*6VK}Aƍ,x%L&IG=(#B 8 6\w.xs PEX۔/86 "$+G(mAwrRB I-.< zxghaQ!%:: ˔y),-("">Dϖ;<[1Y8D I"ђz u&}{jv zYAň<br q/%8k3TrI!B"l(s+6x-GvΈz"6g0"z>#gZyՀˠUV)qQb>KċΘA[̒(#pzu3DX\K2Et0Q,iA>d0a8|t]>/nn6rD] ugň+4=۟Xj#QqMltIkʠV@ۂط+6q&nıMĶfJ# Kta.*/vOzLJ@X{y077v%H ݈5<5Wަh$_O>$z+J v(!<#W"I(F*Vy!D|8O0$Ɇ^$y~B[Vz衁v4 P*(˔J>4=)G[0&Ƅ6oͽGL<@4@sB=r $,,/E` eAQx(VWG\HGƙUI-n6bƛ~' mwiBK5wy[ cchxh%%{S tOк B*֝6L@F4hkfLt 6t\?+S"*tlDU 6$@1$1̩5\С@ E˫kP(eFUYK()sҹ "A޿ {. /5f'7sGX9aَ,Qh,"%𕕛X>.ޘ#ҀZE,{.}W^Gpqc|phqCfȰ|i K_ .};$G`TI2Mẙth7Έsȃa{ H#([RisOa?~ñ[An9kgFǠX~q-+)y1=*dRk]f)pm%?4xCD`Ȗ8Gd$ɯvDZ;>=KbQd#RX1UUN K##E2$#Fz8}r6hPN J^OWH>A2@rWFhuI_"(K{6a#p/p 7% Vcc"U2$oz_0_}yW\(mq(88İj$S;R.0 w!5&''Xǜ:ujG%}T~< EdJar!Sv|_}N")>>, ضv>O`Ykkkajtf>H`ڛW G8nSVy^4 Ð^kIӡRVJqk\cd\׸^5)q N3p|˼@O]o%b&`y݀6&|ب6h]6Sʎh!4%KJFKf'K$?f^(_o Ar4D>\H7_hGװ+ u$Xg)[* P_J1h,Q:FI` '6rOqlG@7p3K7@ E:Ͼ&^ `jy}O^w/fBđ# WZ}ǹvӺ!i B:frrnܿ}~9*9hUˉnҔmP]'4dn*s]upW"Բ@Y[>Jt/L%L+$Zq VF#J]&Onw$o>LbܞB=4g6RaD BKNL%Jl-eBAL[I#Mn~KL-rm55%fWQ]#Uz@Ndsf.+'?j* T<, Q|xW]/2Y߇T& xJG{5ui8͸Vk2."'@b|z1$Koe`h tH'C v j$H^+ H<ɒU4|IWFxC$I]rBr`U:ji{!bR' /}c˽_>Î]U;о ,1'I>z`Oj|J$Ωۤذ5M۠-cZ[Xلڣ tt?nӸ:ɆI@ %(l4?|2%rj{nfJd(mfe<QbYVɆj*} LIO)%nE&''j} \t3gpI6Yoe뺸;V\ $$k&_79 ~a>x;x衇$[>C$kG6orrBw-"8'"/Ot:6a3^^,u9Ν;7?ѓoO;`kHK>Lwِ#7mAZ@Y [.po!sxTr6XnX8y=Z1m:zBH'!yJJID/`N`Q4U)A-5 Ob;${XR!"l D $.SxA+.rMWA#.5A2wX56[[|Ḑ(rFCĊʑ"v[龛` Kdo傶EOlV O[h -]U * .Bb>HGʨoqJlme9~B7R/2#Sd"Y{awt0Nd7d~-n~܌oVF䉒LaY8/^z.fJO<{<'z} %ÐNåKԧ>5ˇy>Mɓ'9yd/2[v}̔Uh}T IDATjXuRBзˆmXT+(a{zN&]UB/+''e/{Y\׸5o?-*90׸QIFQ>ĒQ,:PUV ؄#P_Zj9ls .$Q]-!$eQV-hEP dN[ʆ")Pw) :df_cR[PD@:eo7M4$5_)vYMZA#  ;΂ghy[oxn)yG[}9vT}$f_NB jVP>ۢ+tSSL䡻'_Ek؊ݔV0^4ў@ʤآL $>/v#fN4 Kr%FicFSƍ[}r}[.GAK0 )"a?@6!*&^kpe^D=ہk jbmM8joK3a/:QN #b^ YI8FP LP((Ym$K8,G6"в&(7SXc6SG|BZZe-A#(41?(_؏77M{Հ[\8~}l4tjU6F-vGyd?n= {u揿l/rYa 5>츮Q-^DŷYIb(ңJfi1K4 DH%Q=ټL^ypXйq~]B$5LnFr N !,Z)HTaNFQ2;} 韺[ drvFџQ1$]"aq(8E |Jb,D Lxi%? =<Qi, )&W(F[t{|Ϟ4H ,@ -h\<G<r`Eg+%~7FT|[$n@ !tC9H 1qE'H-=o(E90vZn18z &eHB`6ht9M(o|)<oV_aYA qے=y.llp3gwip=` oɸ5?{Rd79~-4%2.ANI3nˣ+-(@:`4r6Xinu u!r+Jsb/hSn{* 4rj@+=({Rx,mZEYQbJbT=vn,XX? Do*9:e!E'i?oyKX%njIps'p?ط!LC 3&׈]b/!nC(m04~+z6PvxfMh+ʘcX\ n5{]"0O9;l+ud g*`"ޤu|[ m!y@HXug%JN],pH&; #7Y{J|2 > hzذk .ؒEٲ'HFā#˜ywN ؖnƸ.zNȴƵ\+M/lr{J1x6-!JYLP`x!"ǥY/LTt5aܠ;bB'jm(jإ|^qΝ/ omLԾ-AءЫ%!C8OɁc= x*Q*_$v#ȑ^$HL]2FsС Xl+$kJj6[i NQT?5֘F!>?x~VZ 2Fd|/c>Z~H>|^;@p `ϓ}ϿG7C3i=M{Iӽ !2{Ih~[kjK)9^ azz>Lɵz+ 0σA"&LR}dU*\emm ۶{MOO`m{dQ228 ><*~JRn*$Iv֚(}>noYQnܹsXwߍvdrs:6M,\p;.r=x;ɟ韎o5q}s.׸5$+ g_hBp ,n20 U M YH#0faqXLKs 1,O̚ZlkmK4N/(CY`4fr^ Є/= {ҧGmH|>̿_3d4Kd6)zCf"A)Ӧr ͘Q n:4 @Lf;ym 柺D`Xo3K&j3Kdl5i"Y 1mYUWPY&O6 )mn\Em z)[궙?{=Kkm轲lr̅,&!pd[FӘU{ &[)\7efV5y"yB aٟoT+P>Ql={H\’OEm%W!%㠤']ZHXd]#%~ JA7ma[ŷCU VV7O5[CßĪ(mt_VAHm",xdWW(U}[=)" Q9biG~ş|rZM`Хy/;{B}c:~ǎ16OT|3I .!M<4@#v=Bo[dUÖRb!`]  y`è 3F,A'߮CupG <^g_M翏A3>U4ֈm6}vmhZYJEܳQ=iƱQKȒ.Ⱥ' w~8vetfa$;TPVF=2)6[d ^b)H$ ɩL,jcёNp郙iIv#}JЮݵ@.k:˚`EnjzMMUgoI-dϑHj@¶>Q0ɬaR"#p}~2mz;*JZ8Nٍ(=XzJ^JɁp]gFz[7td9!BDAEqQ_OƲ,^#?#5;a\׸6׋$#8XQWSɝ j1EO3mHo%]_ݰYc-2j&I==[$eOs Y_Nt ^C H(17=ePXj\~8|_t|#2})6ЄכU jN^Yo؇< MbT//<h)^:MV2ݍRDZͽl^7K8E6{""w(ù:r'{;iy`sW3%H;J yBSXvL7&Ю[h e_K .r+(Gp9D9y*[Tt eK|JC{KPy8`ơGә,CNp."V@c,8$DH&q1٫[&=J꧈*.ec!*mob%9u%X= wW-3` 3S ~~^j >G>ȠC'f8 ׸LƉinfscxVwK/ʿƵJťEʄ4 I$ݖʏE~Ewry<̭:y jw& E UWmDZy#yʩS,o}{(ʇ#G35qUp\׸5&I^XcX 9~umȎzz3Nk%,L&Immhwag"qe! XU;M bP1mߌj T+u`‰'A>QG΃?M/gW ~ɋ\ȳ `kr t@i '[ {wف*p[!Z}X o.#=(bī6zMb4 ?ݾAҢ`n Z"<7p>9T &-d]:/+&~U37N!6넓>S&+{9YӳP.T ,u Z M J.KPMkrK$FբǽSj_AaȞkP6X}RҢS(`$hb-]nXCԋ!Cb*亝CW1&x`rD{ !2#u ~FmsSsOPcHK!+ !uy[v4 pM[k` 11 F:wFIBS]F AsgxF UD:5NC("|HdY3 d a92/'\MS_Fwn L 1BpÄx#5ZiAQ n( s8ʀ794Xj ("GaEP7Zi Kvcc Rz!C\mV+wiWW~:oTh2~ b3k{M]eKއk"/%;E' yf%-\2Ӣxl)Y*xԞJ[EQ)x;xo HǶQ/>\QOx9JrUSc0Q[YVA#|YYY2}\fy(eUU2&2x۷G} Ik^^vܛIMjRMj$Ԥ&5W^/:M!@:iOM<.h| GCH0 ]Cx0ow)$؇ R`I;Um@5b ~z@ʁ)ϏATsMo{ -w?\0&ί#&@=Trduc`mޅ̮ 8}`c."WԅM|.(zލ3F [Uu+ׯj4j{fKv~Ԁ9]j3Rԑ!17g&jԜ=vH 1ZlB O5 !_}tx9Xy>deioUYx6V3庡kX%ʧ* #8b5jF)׷((DD9RX-2l՘}aMU{G#=UDLdR! >?K\ 1tpZR{])r/DsuMzoc31!gCBT` EB? KZd]RKq,~Dxҵ3 h5Mma@-5\G|z%0UNjO26LQ7xwx RIbd(xlXSt$b>3 ( & NʏݶLϮbgFV{<]x8@5mDЭW;fˮ&,z」uX{!qU a/PymV <'c;3n+jcֵVХ2%ɵ&>=`kJ+U!-+PHY牱형r $EeAPd&S| _xrnKm8R*ITCU816ڭ/1ழz1PU%IOGBЄ AߧV$eA:tXLy\$`KUsV9%eTGTRb˶ֲ:WW.X/= /0,=Vu;J@SNo?sKMvX}^k6dYF߱_^R>GnzoBaZQ{n*]//r2O81>^ZXXDQď?/{ڭIMjR\kI&5IM7n4*,h l@9XLᙷ(a#$-x`9!N²))5̰FR\C!Up+ G(+A֩&-bNz.^o)<ߨ!0cxz4}&~&@̺f:C?B*0hhrQC,h6Mj kԝv]8|gt~#gSi h,ϟYqt` Z|Ōf%8+d| T r|f֝KjwY)")˛oBE zmOjb eAf1Ӄk,9A7uW!dʽGO 35$l1E23 -Gܺ_i=un8M:&5;>5uJMJ@O&Kv$oy!U?pC@l-DhUo$Bѝ̋UYT|jr(OKvh>o?Fn*vDnceUlɂ"a#xlOS-?!9Z'2~w3>|f{߲qF}Zx ?_JI E3>$}ᓠ)D ' j"% ,=>j?ж$U Q[nUeFkU-; zU^v[{N@S*6ll$y ;An W뽪8$mCnr3|m%nEOʼ1Ӿ,yz7]t&]I=r@@tF( )ǬʲSIac$qv.Q@ 1ͅ@b| /dx7A#=*VjU$;O[9ƀ$! 6go*k{z"q[XlQ/Up{\mUn`q%U0R$nJ5YYYC*)u!RJZa HP\^u<L]p[j5tݛ,^V 5B=˗ۥCu|o>{C! C677 Ð(Ð8ɲlo{꼬R1xs-8 rczzw]|Ԥ&y֤&5I5${יOY|:Uίb >v-3n /_\~ 9ep i1XHp:gO52 V8!1 z$gk4^>&΅[S\uZ~}<K̡-ihmq# OM5 x)`p]4~Lz^YZ CC5iIwa@DpP"C6#1Οōr1s Z`sX=E֌(CYh'{nDA!|?%Kve{ 3Zx.Y.g6YśQu}ݝD]&XDžkEɀvE2D-La<~J57Y|Q`jЛj!FJ<@~QCk>r>Y]R|xJ0(_}dahH&􅇴RX͉!R*:z F(L2L_Z[N - f \KgހFۍz8IuA 'Y/ oi8bi42|?g3 [̮tYؓo j[hcH?x Ca%1SpÙn{Ymelx\LxO9]JFMblPQeBQBHF$R"!LSTBUiW*$ *@6vWVnKegжb`~p PQ+xOe{aH5=EJP{mxT*|jmmr9cmةLtXc5Zh=vڳvhEBÙa t&#Ed&&H;rYT@9"" b}&>JNW$K}:1JTMTTj{u>nȏ~mL sMH p?p۷_|&pS)57 "?h93"PB"$6!A-*f7b>rۑb]sPq4Jóy2$ )̊u(&Ob m3+rBB#룇ix~A@F ii6G+$>R5\cf+EC͹vb1g$γ81ORgNWBmM0DdxЋ:))W#"#$yjК#9 5?~;U†FU,73>H]i-%;v ;$UHqsn(U֥j׵n$){,{ulgTh؛o[< <ˊ4$,"GH߼Ӧj7(#*Qֈm!(drFI+'޳R hSaǏ#A>l`2"yFI~mˈ"qBYDn>f8z0C$A@쇤oR"3$1ɍ&7¨u͌TOV8E BYi=sT#+g> (Si I9;V(pNg|_)2CkRF>IܴVmn-sssXnu;9w`@o~3ffOO7Sa__r%aexczI;wn@>=jKoi:<Ԥ&5$/}IMjRHSX(l}J-svX\s@Uh[6,(iXd)PtN5ԛ`sœ9bո6 u9L{\CC@nA_3fiAz5mAbڣ3]'iyIZl,3jmZ6Vl,ndr~Co9CJ0|'G:̘R8qą<a0͌[<&#j!/]w8bt&$|$u=UjnI{"&u |ߥuesl 5lM( kԟ_Ķ$"dީqQ_gc$}A K㟹)25֥-"A3#l&hh7hMJ@}Ue]33}QCbG*ZEYأ3ld~?c) Zö iUWϸ[|S4&sd+ppi3_9N2Cݠ'X ba[ kdZ` }z.3LFC5HVz5.>gЅ[$I1X7Hی;wyZ~]ZL"]$ȄGS+bCqz7+?? IDATCe ɱp犱$ QOgo}+nwG^vVʕ+=ztOUNPLɋqE$C?COĞϿtZmr&5IM ɤ&5IM _B8g]ӯw[)wS85#nn c~B/@pˠ;HcHoiÏG] z&.gxd '6E֐BP{ x{A?N7"/œbFѩ5{ucip笉63 ALAp 2Hc 5_X_dY!?24N1ږb!rFWFjMhcȥLƌfbr&S&͜*B={6?M H=:kٲ%ܐ%vrPH W?idJXerγ]0%ob4BX/hEF3BBg CηZA^ y9%H|2V,m8yWӞ#(nH2jjr>Ғ 9-FN(b0]F h:fiȂI<t qۿjDI V?G+ڷ9> @5>? k:]v`7k(ߖQo0׿ą>^~rCsD*'#7>fW檕R T*4|H#Z"wX JjH^!ռ^ /ݑq_S]]Qm PE`p0"]_z>mߍ,ь(#F8=j֌#Q6#A )l!0BD*$bS^V9Zh/GFh,gKHa0$4Y)|+227B;c<ܾHR>$ȭ'c@RJJXR X#8(CDF:e{)2B1(#}lѢK X+@g [wPP($,;߿DbHDo GN$f1{<En{il$I}OxСC;DioUf  o)oohpuzޞ9#aE~N{˗/^Ω=&}B)I??O,WfIa~~~b5IMjI^~Ԥ&EQ友I3فN{kD2lŧ:,yvl>й0a^ :;fv].ng 0рo p}xWpnzЂ~M1-z0b)#} KH`0 LUq!>kVQ 6uMC-RY5F6e}pȿ0-6jq̯,# u k>1x80ؚi`ښA>h =2 6=ѤIMbάG\kt97)*L]ds/Rs`4dȻQ߶I{KA7' M]J(vXk,F*>KH̢=N@;&m4d=:bdsnưgm5^74j}\ Q!Zg"qPKX05oGD€_:_!0M d# E]тsu-HGT,(yZ#a4d![D Z2C6| j Ҳ)%= +s>$ f\q{@E"/HfOo&~#_Skydcqei!^(YlpྸO{+ϹY/8{ S$,cTe :]Ф:*H"w}+Kaie#d7m%^Іy]G_xE-ĸ!- Υ&CX"dEv|";u e10)|4/r*hYd!Ij]3~ ktnV//D`ؾ)L(M$a@$~@X%eJ`p $ENSxې$"t@z*NQ3&a _Ǐ Qb})*G5#{+ISҧN&]l2-z47r}PԈ!y!hr2a N2YcHtS S^C߫.EHdn#%Ig $)/f`q5%eȋSNe=؎VD)|GA^<Ǫ}FkMQc{}$A3|gy斐d/߲&ū ľ&NgI2IM^%ɤ&5I?&J3+GY|QW؃,,w͟v0'7&CݷCp}^x0?D61?aI?I-@ۉ(_ }΂kt;ϸ|}^H<׀JL+~4Lh۠<(8>O:x[yH>XTzAĐy_{svWv)\hguny8b~Y֠3nJ{u|2,BL0AielCp "p sJJrDV]p*tۖg6ݎ[A#JPos}ǕWc>i}5E Yc91J -fx7Rv(DVfٚϸڝ6o44V)>C[H{Ղ)oeS&24I9ym٢ϷɅgkHiHZ12;PavvYW1hp'`F| &H cNiE4'Šu2"<:":T=$~ (-|57W=ȧ%<{|\1|]⍧E c͙ 3  jys!ؕ$%TRMbps*ˮG Iv+IںkwW>Onli' %~b Ŏ$2`jH}Yg khsy}Pں sm}-sA A^ i a-gЈ0}/vY'V ) I`cA S'غmXDh4s^RL ݹSmϻ !ogH ̯]%ٻ0Ww 5 ͈,lBh|RaN} >Z8_>B)-<oz8e)0wE\?A_ԐD0IJ۫N :/[QYuh~mXR$v*AeW0WUanUHBuUYmAOI*l.$w#)\#;S*$TjUMgUf~dt_MXU,Shr|l<\e\?x̭r$:[Ŧ7ź?C7l!abHTaQp8 DDHO uD߫ tkZl%,;tॐ)D&YQ^ gdeӊm!F]}RAvþ>n882FL4̰jf@\vzI.;OdDO7آrevDǪ J2Dw>mN>g8$Aa[7Cx_O,--qU8( $Vhsc nwO@qW#bcT_SiRrɓ;0Vq <#˲1)>ߪK.ajq]wQZkYYY P-^r ZKgee5VV s$Ԥ&Ip&5I5$/]gO7]_gO[-6~ w5 -h[Zi޴k|[0#i(XXH.AyUNT)z0SSr5#Vox@z6\||5;5; b\C}'i(i𽜲Y؝n!4î?#+4|黐5 f5 |1[kN1-rP_爾n f,d 6b֮S22WÃJ#5SJ> RY4d Oyj-cJtQ`H}Ea2+Ȅ:eC-1.B.8UcXE*v Ɛ>Z; \31ۧȭOs5hrlp,f&٤.qZ/^e5|#Qd HBJjYEk d5 *49[ KV0YaB[RZWp9.+' 3uqbF~Π%/4Ig{y #s BK^|[p*L%qŔg0\[x>?g!ʦnH2%ZpUo]SEV[%()U+x6H`x u;QbWe&I^duL g#dr HT7|{V+MG@m:ͦB% 7/'Qe! iwN[aSs#%?*-&Z1VE8 tJ5o`?uGy'zF! +X,(JI}흦T#\C_ZZx6}:}B`L 2#n2.lwp:@ܒs8Ÿ̱;IF4"7zO%-:Yg lBti]~Prc%6BZ'[gݥp%s'(*IʠvQXD @$&HS0ߡ$!^$# jFc<\)G?= IkP*()N0حA^N=1 Rrq{5'7G_v1(9qI}#oU^Ñ">,~8C NjRDI2IMjR@7ԨΜ|-}fǟ0 r8,Lp *MzG*[8u?ll1i3! rL&aֹhrZ$I=hK'bydAb=,Ui_,˛M`, [n`3nt40sEc3n3*lY,*U%ȌmFDfdcyƅ;/}O'@'cuHנp,|$"%{"b0dB B:I46Th h鐢$ &X:rR B \ VC< ?ϱLoGJq!\(0*m: R[:xf-ySBF%5DeE ( \'6&)+$a#u ]&_F:\;sӕLMJ_`zr efm* J4S}M,fbOf)^8'wquvwD-a@+0U.`EI4Vh0Dh5O~ƸP8{E$Opd"F졜!ɻLV *Yrg.#0̰̋e gK<?S%~y7kLPgRrl %C !ls{ ޛyW (#DĦ0ߚr[cF+X>#2i*T}7 X_xN 70٘( =9M$ou$J{,t:CqfllZ-Jg˧>sY|A:w9GR]pe<3}~oFao FNFaH@< IDATB"۩l0NX[z"ԞWx2.`<$ gW/J-0cQ v- f%a9 s8?ߝ|3:?usK7Z /_[#Ks8AÐZGDPJچ@G;9j 5I*tgt RCVv ZFO{는nEvs(W|Hɤ :B@+_.A+r6E {ęmkqx$^AOWXkQ"̵.ϊjp15hH\t;"Ub/_{ e5uNپAHOVK^@z !/}'LIz@DԊ9q8oAf$Q_=Fweww᧚ҟ7N-*MXx1!) ?CsNs7<>z+_&[N "I^4@Ɇ )dG'e"qJ%‹9ww fW?m>|/}[@̉pUV}-%; JM8qz'D= *tu5|ީ!jmYHⲡ$ ~J2D ۖ/SUGEIHhLy@8G$􈉑"A»^_ Mc|9 " WC@ADFN_8Rb]sM>[~$u#wdEؒ51: -|,O?o>6>9dagd=jM cdLSUBtN 23 _.c(7hh! &[E't SAKUHÈ<)T@4FJg+$Pfx{kdԠtZJAy{(3]vk.t]:?8ssst]?ځ0(PWCvk8ɕNO|ܹs3·&z}xDzmFw$#0WJFEW` wp,j/!.>,yn3ۯ4n0ܼ#ZG&,-vؙTj 5he ;V1'@{8,X/az"Z\XfZaܬcp#G&2t U)!YbzLXf2^RVC6:e$0U!\]Rv׻vbqW9!N*4`M򶨓vQ+(MC̲}fT1+Q$ψdAwШ.JCTQO,HɬZ"+C6=]c1/5Q'ŋG+/LdOhg*>3Lĥ.ΐ.`fiXh33i0$"Es~Y$f o6R-=1v;whSzˬēutd&B9ۏQ+9Q-UP!cf~HQR +gʢE*袊E&[(e*NHV .qLZV 54]Z;9s!`Iΰk!`fi(W|CK,o޷MЭͲ hUN%<`71sw79|C? 3MF\'({\\v|O}_#nq-:{\qE纓dI^HL]BƶVKBns;D 6HآPaC *6YT`кDI G\eѰ dn뤔{[Ηin[h8Dݡ*tXuI bF`Y  >&Jm2I~wDaJ ;"2ap,?xCez$t9-L.K5 ^hr¡H2m|ؔ^@5++$nXtNmRAÿ)U:xw$'N6x|'c̭M9tr|p` -J7r{ 5Eh,v:o(tY9Ԛjԡ h螓kU(ȐX_."I"Hk L1s⊾ ^XKSCdV'VI_To3H,(/w.\77y߾{7??,˘Ak=H4& 4M94*0t]Yz "ا"=@i757n}T&l≿>EoQ59TF/[ >ڬ1Noz(].w*mʋ՟kwVQ 8ˮK<{ _,% p,N M!8!2BJB#38C[\I@ΔXEK)4ˈVJz6fHS b!EjǙ] qs+i8SS5Z j';Ty iTUދ.ȭb'HX#%KV(4M >Y6 ZZR][\22Ad4;Iˀj#-0u༵8 t7,0'y% ]fvuC/5Wx-t&]% "VdMg6?wƍ _,tzܖžUͭaJJ@G(O6ˢ?rYNh PY QIaAAArUe@YG>Y]s{ڀb8 ï2Dw!Ps ≆tD!P ePh,d?/" 1I& IlARDF.<) zd1%ѶGж."@z׈RAw"6ِtw@朗CD"QxQClw$H㠴(qmWB@$SRPu#ڕ1(/St"~eT(g}{GQ gFX/b5Ǽ?$yOt*2 $λ LF^0Q$^DlFt66V`[Z!1Ra8zQB$:$yTP;5};ɓ'DŽ7f+ C^lU:ΰJ'))RFjVZ^^fjjj$ٿ?wy'Ncǎ cFa)|?F{xFxNa$[:IxD $](:vF@~{% 4`fafJ83ŏ29#aQP7oc<]!N"Kb| 9(Ձ'-%2Q#cp8StmX^f&]C@JtR6$=RU3$kBzYSKF a%,""^9K}( |ОX^SC!Bp>T ~S¢p}BLGc?B < $N*'.yfK[.JYqBGfmBr̸%,'xH1as 0NbAtTUa2C['R2FٜP=ϨEY%#6bs% JqE?n!zRPpY ЫUiF fE4Y0#3,-ƨ3X%1UۡԒe; %Pe2d`<ܛYPa.,S-BHနm1~s;.4dfFkP,ww^{_&[(:'X<[A=sKu͌ >y!wΙiG޶Yst»C pEb PxaDBUP^,{_ć|1iE0̉(̈Ô(ȼ{9FHc-ۥɇo]Yz'IAs͡3ItX#;a|,tîB8a $U5IFDWmNqfηa\GY6)ЦD6!!E[i0Qg=d=Q[\ 7GA0N"'×"TP|?;m$$ DMILE, =SĤT\TlmrfxL|) ]Q!'$ Yߧ*4h0}%BzHPAf[HtVnK5 eNT.="yJJ378Wxwsv#km DRyϏ'V4JB%dAH-Ny)}{YƑ#G8r7e?&c|ibVϳjFA^ԩS,..>/%~~?? geY>csr~ρH211ӧOM,0#lhJ#0UH$a_tw7nEac`8UXa`X@d}V%-K+粴|D#fcv$t fVkpH sdf%Cw$ ybfν:+*kKԲ8>VeRBU*qJIB2f%$q)ӬYYcPEУJ}NJ!R[Υ;yy /=u _NvQC|a}stL|,b,ؠGLEt)2mYf8 ur[̈2=yv'R! a#nHGQ@IR!c,G*c^av<\D:."RN]@*+IV):TQ1n֙/X Q)QB3-sa8NN #o$VX3ɭ%wN'x 9ͫz?z<LUNDqh7z Qb&Zt|z"zm̂ ˸e#p/y}KUj KrdY.<ל$. \%n&_JmY#")3aO4tUJ8HIt`BhT),VKlIb+$x'۹?ߺM:9IE%/Z֗s ;Ŋm/^(I" $v“He<(D@4w| D ]xp΃e xBz9Ojl \㶔6ҋE{wME2'BD#U!9UA@@\)LAtw mdR:c),Jn:TtJ31S|oϧQW:;u LՕq[P(JWBj/NRM'^9F,ZB//++yg|wUq?8piQj[cΜ9Nn[f>SLMM155wgFj`T>#p1ICpߞ/V2-hLق/#K H%$<7,\D̐N0u8%gOiՙh`.%1G;p[8Q 54OAu.~K`9#2g ͸@{i1G\fBɗi+6mY `'2Mz23Ƀ2t˄kNq1S^$Yq=8upK$Ԥ">`p-hb&1%X- b'_7w?tHl$2hʹ[BK,id6j1Q+)J$ E>d%$- ŬrV" u-FA)L'ڌqA!.j&$t1F 6Igѣ>9h]C:蓱"RЦTHAQӬa:EĔX& 4I9AڶJX'!em0D ?{:!eʭY^NN@JV0 ^W]L4,:r"4O88 yCGCV礧_<:IVwnؤ_P^W  #"l1 ckg0b'iY%tdRSmJ}1r~,Т1_{̖l29X2ImnEiyR{CT|ֻˆ/Fz'N)Z^ wLsK.a i $ jZ-m#K9 # 8kOo: !U跩P/ mQT} #i_r\?;G^=a{JxG-nKlqou 2c 珳?65z$"G"ū|Èq"C']w-r!xRDFC0$/ ";A&w. ީy/ ]1_I21`˜4*x&Va|Nb7"l:uwdYFdYхWwIW-ĉ߲><8pZF~F*9IFa"F"WǛm/ܑC@0[C B}qp HT ;Ǡx%u,\ Oszۖ>֢}z"lrSԓ dvz'jqôk5.ԋ wU cT6֌ơ<<7Yq=JW6܈pFD!Z{kD\=KM+IsKEy*oXU} Xu@)K.BZTlŻK:AQMUzH-Q#w!4mHC؀C>$9 ';,xzחNsAG IDAT##yq`Ğ4g ̸]Hf,߽%"| /` γ=eڮu%r@LPTNΘm!K=_ k2<;}.jp"p䌣qrarmfJ8NfQ'v)p nW_bƬ`E !'BKK|OK r}lH/ף{ihJO_Ń,U\_-=n*ܑ\R\s`N_/?4Ccz8EȪ,]s-~v,e+'d!?Xf?αtǠZ,YZnsM?]C.9{Ο虝$ $}ł" 05bTOx0[=9)-CA@*bQ%48-Q&۔BcDJ-KBg˛w 0'`Z߹0I$y"Gp, "vcd"=%}'IA0tl$IQq]WsĔe*p}E8RᬏղB"iAi0"||!<9߄ ٟ@A'sB "}8rB۝GOslu r, 4[֋] DgU٠A /c0W0">nM;H@?v2sZ3HUIfTeq TxA*%1`.DA'/m ӥb$Gb{oo |%~DF~el=D4M)˒CYͷzq}lll DkM8ɟI~tp5G炢(cFj`$0#\EDgم +LS B͒5D7_,r虜KcSK(sj56K,[d%W)dJgL4p*Z/PZ#pnNyaNTҒW*t"2:RGTF,NP-O`JSKhiHR Wn`>' 9ro2%~s16Ԕ"gDNIe Z1 %T SжR uB:Yc O4d{%mAeݡo8ONn%@γ^9S%DV7w"3CC!asT$<"`Mu1uGXH NA QE%2\Da$q],,f0(6czc*mBˀHkMINSא'8I P n-cMtœzK4jBGag‹S/ hO7Qe$Is 1 KLckc.St Bg4@ V` c|v4$MJ$49ėmk_>E:Kj|"cF-Sy0*ֳ K _zɻ^_PE-C8_.lc/yXsJON\y >>yѼuSb [SY_Yx_$7xΑŹN$."ɀxѐ/$hEy@ H -48kLtERh[!0ij0Baf(]>0mo4HI D /Dt,Rs CށЏ7Co)$2n+$ A_ą&G|-ŽB+JL.cb( b;'`l#>%"24P±MPȷx'UYlԏ ;7J`u[ ڄ=2%Ǵ/wO?ix^c̖'Vof޽8x}nYcZ_yy\{y>#0U(nkFjtHz'E%aG+w$涻=*?#5DHN$]γIZXo ##-+nFJLY ]-k$-g$ A^X+5"U(# gj\m7F+E@L̺Fs~?>^3;<eZfY"%f7gIUc[E|o/a9 qY'rJCZLse0U5C8TyiΠ0LFT{k'<6Ghw(/Ӱ-1ps)޾JJS,KuCۈ_PR8-/b%+gK? /#w%2~/EGfyס\(x06|kj[ ٽ {=G|ⷞ Nϻ%]%@$ ; [١?5]mA`9tpliJl\%2u%9VYBBK~cȤxUv U=tduEnPu_FzD.I ΊBnwuK@a *l(}aRa N8pRlI c*z4,rFJLx*8|L֠~hrJbہy\y{pa_7#0W75|;D],Cr< iAZe/nMfY& &-%CxWb&e\ 7hVbfkXPT<\5jP&!)oqfeuꬩq%k wGP lCd32!ɑ,TpVJ xM+8>g@i˹~{C=Jҧ+8%FD*ǖ` cz|4Nj\,J.u6` CwB֐y}EyWi91iR`Xۜx O cjJK>:'qֱ[cE%+XrBV8J&9(x1~tn7;B 8||vβ^1)qRb$||ĂsaSJR7?M#VycS2J>!,94iVcU=ͅpe. 9%z'˔+,q;Ʃ| HӬnπ|%b1NpWV*k>h_ls=Jo%!בVOr a%3Ci#[%*׼{?KIP ހ/ ^^=+Q)1dbɇ>hC7P[ŽKXmaۿxϿ3wx ov&8!|1,dF,S#&d(6;(("pVC!:ۇ/@Km/0;'ǝ#~(S3?[IBɕ"IBo~e6L퐘0\/h*y>Gf(ȏZP e Fv>?,}l˞ ɩӢN ݡA [cBɕ"a%t-3>ngEU=)&e2ج yGa| _Ty5$czQBO'vaco]?;jnf(D*;^wŤ$JMH1f: GKٳ|~)V_x'x}cW=$8B;~}ttcH$y`5#\M$#0W#㣇oܵy-<,goUqH1aO_ p  g)s#ѫ|y}z"H.7;"+ 2X(R&9Q#.Q/{o%yPyx^Jj-"vOYlfP34cYð4t3c͂ih0 4^T6^,ɖT*mY%++X-YU}lYqyEfDFEJdJw[4 7ѷHuIP#=\e^\FE8xU<J*wS1`Q6jZq)v< P|4!ޤ(@%cfy52teG P.^L,C}t!+| *MQ9sn 5HzLBx0OwșM~EV <2M5ү$?[Z&027E@d)qBa UI] ,$4ီQq=3NXs=%!Pʪ/gYʼn g)*թD2\qJzZId q=зB*&l-A(ɲCש{t,̟bJH-h D8Vc}{5}yqM\׽28, ǵ88:|}m#%~-lO5?@Wx7ÒB zz81\{߹̹{]~Y81:>߿z՗u.zIw [sd@\H΢:bl{_ヒH*'Va&"R*(-Ą" aDpHJM4 " VYR6 qy5d\J(oDZXp:18;:3vok$&LXaopEazmĤ$7V"p!" W_ˑEr$-4m^ͤ9"p1Tp Kه9H Q;o.Td\ XpODBn_$/(xJ|?bVƢ ~"Ib@,.a%%zQe>ܠt]]Gz!FNF Jg7Q#ghЦGP77<z(vN)>]ڜlFZ59?#<#/h=9sx)˓ pY92INL0d &ED$CG9muxOtZ6š=:\!곴Lc؝ \tAD*qХNƦi\u Vδj%e 3)[DIA~G,$&J0EYS` F YG#~g<^{"hx%=ڇ02D#g;(B³W/sFk\b6;EcSY?4Q]Ⅰ+| :=*4b}>:WU[MT #ˮ<'C,s27{4,}nO7RF>{>{{ӿȽ ?oWYnRwxu9ͥgmp7±ܗ}yI$RyM2pX=6_ZGa#3(- c(+uNIg$>%DEULⷝ$ڛ$f_ԉ.kwݛ8#EM4*2)\4 E+M$x/N R⾀k{8$CB7JBʴoҰ-MP)z$EJ\+El ؁H;v7`G}I*1baCυq[,|(;l7c "? ]"8G =ˠA͕ψ}_G-@bp!j3CD "H`+'I\dcxx1 nNztDc3I&` &Je.LPL0/-LD/ > 'ٳ9f0ս<|:8ztkR:ӆ85&3U7q: IjӻQ#7݆K1nrJkXEUMhE\ǽ[pP5m )-gڨX0ExNfX+<% - 'Ƣ"MJ"m"> ; hdyRbN6\:z bw]:-#sG$lV!oAؓ&ZA :Nr]44R$d Q5ver J2{>DhW3XuZHeQ c0,VبNgJn@w :"AJ.-HHC 1d.\#D>C0^Q+֙fsTee"gEeVma G V04f'³.rQW:Ǯyj$t*&w1$d5NrhȍQxeEYzt52J\3gP1X"֖+ʦtw j be0">tO|u؛5ONGX/(WY*sϷx]O5(V_rj硓;z9DH$V 9\spI^IS#9Z B PoIFT RmzOC'Il`Rp-ⶊ.G 15h1ZGDnMV (9R#ˆ q;b" ~m7?1*F"I2}ƫ c z!:7RH$Ŋp\ │X%&wY8TnGBcH:kD)Ot̲֌[;8ǦRA IDAT:륽N[6҂m4;ah>BcZ)tmx[eO,ܠA :Gstp9Xdu_yI2P" >~gdpm1r)/u%@BHJ2 b0n+A( $ڙn_Nj5"HHڸ(+Uk@`")B8(!9)G". /IΡvaQ,-L0/&L0K 'ɗ'ܿ sL1h͌&pzmE ,'?9| .b6S^f3=bZ+U'dո?.V?LϹkh ҟJ >MKH͠ćĬ=8\/P&=Br4\y&q= !y6̪ 7oC8 r@ >ƕ1e2dgžK, J3}TJ|\3ϖk7 H DsuTɐDu& HGS ֛Davs}ORMAt9蹄e4}CռK'@%3V@-.C K"R3-Q=dg8UXi5gٿ|rO 1P }P3M:i1En8qMEr}}!-\mLҠz2ĥkrFDoR%]QCHHjR"**m>!NLD:F2g>sz/sKr+jT 4,qKn=CgX⭋_a t:{N N^p.婿kW>|Wtz*PyB_q)8-*o( Ib-gQ'ǿp) PtQmwEmo#8,x_%T]*Hz:&c+ΆqJ8ymEp|1>( <$nc&6*,RAVa&ti 5W",##mtF]hMDj=R #Ļ f9-2ov /rT PÅEQD%uZb:gt1^cB>brʢ?#tގլ3%P=`_+D*]jC^#G ;:,r11|0/|[[x{ O<Z>O$O0EQPyU_ȑ#<쳓` ^L4O0$_J])fszR?[KmPѿs'P;$m |@%%̐LxM!$5jSBb" %0 ]AXf'pz} e4S9Ɍot]zI[A9R]ǡ0N[PuljwUdR[2xB~rڡq7)CaW.I2ᆕLj]NC.FEÖk֞< u$"!B s2nQivZ6uUhmit7K .=$,rSZ V;DLg4"r^{2DJpB3h_HP5]eNZHt̹")☊ =M0Sl[8@ |3PPe9<91NhJ(ofڧT0>'C fZS-j)(]4<(@"`.xk( V(r(=pR<>%pq؇8X9G][mNʦDkx[oZFNUqR=_!==\Ao7@_&-"?xϱY~vsF,e$ .'x)0ZAiR6!J5<wBTwJ@K5#+!jnH@GKCIfTD/8R}p|n^֣#oRڛј(o){% v]"z$",EE>v81O} $^k&_A`2| $ET.;9vykԧ>5L0W'L0Hqѣ{,f/uڸ::MeU<W)M#g5Ug8ݮ3Sk!*&1,Kשw6ymJllz5<[ ҃s~HUL.%RV""d1ɠbd /$s1g؟I% {o! Ji:"BR <${tc|+Ay*8j@u%=C#,3\DEL{O={X{P!CD.K<ٸdTJ=*ix%v9xOt)fu&<>AL *JgP%GnKdĵt+e~nTfF1hS |=~*: [VyJ"^oh&Zje WS9I)ӣJADXe$߄}_"oTBe-^ W$ɝFJBSd2N, E-繎Q0* 7"p1zWbd̆ŌdlL7O2[tF$ub№X/W6y?Mo]of? G| ,M)gS,;ܣ6S78VsC/m'9#QBEH- Dc8%pb䎘!tJ^b{p a0h\ܸJ' 'G+;:'$B A{C#H\H"."َpRg]r.Ĩmp 8"DpNH\b$6QH䠇e( p [I4H8A>?~cpxDZ C,Qn$%+{)i8BBGHWsH7d- Z< 9<>DH*,p9"wtvތX(>ދWU"-c<Š&H$^,tn_uw]^3mFRᮻ{ _#7W \.S뼛nF1 &૆d &ED$ya}#<{L3ww]qΑ΅(ڏrkل jC4̶Ҩ91km8ʊ•([T_y4$(c=Ӡ\0pl Q)tp$dH@L/$ LbzvyAL!'xvBF-wl)E+L pZ*c[)WNTeT cʷvMs 9]OUqƞ2T}YV͓锪V- KiZL]b[ !'aPPR3i&Cr8h6-Q/LDpTmLl)R`WS;seE1)ʾGHE1tEx^wM.ׇ<*-ui~bem୤p@;h.9-B0(8~fg׿`X# Y^Jo;wmy碗3$Ct #hP A$I$D)k% ۇS"$rD 1hNH1^>@|}Y2 IƣXXra8<$Ģȉ)(#Dp!(etr)F\$ ϼ_^}ϽG۾#R-?s k2S+Rd(w1b@%Ѹ~muȽRoODK .BۑiXZ?".#񊻧B m'v8J"Y` >Bzn 54b+O'9̑^H~[,}2%>%"Lb 6InpƏ jW~Wٟ $_ijX]] _"I\->(` j$L0/".&&x!,'k~s%ήdf=wr[ 똎Ɣ46wg0,ڻt<^+*S]Z \fNqùQFF%q=z<5썞3rr2_@E)y|;??HDʑRb}jbUS)ռːQ>p6mQ#IRtb@ M6G (O&c:J'li>(^)f:GNzIm]obHO=fuj5UwS]VvBn$!D/,.âR J´kRoA٘Ŕ"*uJBC, kܓ)ahN%WѢ5@xG$Vi O DYjt65Ѧ]j;Y(EПГ gnmtO7F#<%Xy TzknD;r)|?-J)[9nS08!5sV|X8nw> Dn˿wm'A(I} ^BGX0nc= XpQIS28 vD7 ~G7ُ1^vԖnDuj\ W\p5ܖOo&'=fXNУBJ_*8bQ)FPܮU3-Z,c(l楖E,nqm!Erm_Ue}8(H1EAaas3 Wiix'FAQWm] \Xf>As~!op._p[xȻǤ) ?e~ #1~&y}7jTUTM'|?},kEKT%xGSxX_p㯎..!tVèĐ\.F"pr[PCn!k{/BbI"! =ϴ=|Kv(P )Cd$1h2J)Х6D%;V0:\ˆU;n^(PGlI_qA2**"#p虇%o_ mND1rHg)|(N"{)\Pv+4E .'Gn.HP`'+a!G`(h4?Va&'v#DzGnڱ~8™;~~g/_WS>؟'__x[?@\;S_޳gϟ,//O{ &xQ0qL0H$_$w}-Ka٤!?AZtV)MWpjJ~2bU[d$h"\\!_]VڦteΚYiE p\y<\tJt >NeG_W# - Vmse+ϙlQzdE~О<3^ R5ď2fչisdvq"=q}>ѧw%`ؿ,d)h"#[:ϐsrQ60YA dfs{Mwəؗa<bdDj"d$D(e },:g3A #F2.Ғu3aֱtԆ42>#8I<yV}Y=NɦURRpRZJ*'+%9 &bέcYj"d,DIvA#p| WCXO?8$O],[ra`gu|us~nv@⦝Ni(+MIr9xHow3gRAҔOquӴ&X;9^ӽUtoy|'7x>OРV<[y7u ĉGaHhkw`4> ȗwR%~PJC(ڑ8̜wXwtMkRѢEz30ȫ {HFcJ7! .U>^=t\4H_c/ !߽|Nnv'XXX L\$̹` ^:v?eIlFc9(2wUb]?T!IVi5Xog79,fʄ<-x|+[ C\b4֨Q\G9\]%;O-D%.h,Xs\t%ϔ/GJq9঒`Iasp4  ݀TP駚hr-Z kXWXsg_g [B]X3,6_:O T/brD}R"$।j̲AYl-st Ťl8)(uh {))UDXE'$)$Zy$WaKDF.vwUխւƀ،==26cxX<co?AGWmI)و2=t(sׁ}ZR:z>ť(|jH7X!6h+#qpXqсG RxA%?.~Z[`GH@ꔋ7ŹLb@hc\Ɏ'}gd?Lah:GMi#&%!-~"ЩDe< >=ie񒗼~Q{wܹs>m_L1?t 1O%N!bCarNx5+\R{E4 il/+|͘H eFe@KRRǿg TrIĜ{;;xB鿊fgd$hYwdȺ+; FJ.!$=c a,I8!~"c K ;ϒV Z2ciHVVI,y#m\ሸd1a-ҁxv%ҏ1,SSv:2ZjVƻGgXfceEdUŮYאk|TBKzu0cd(#\)pSՉq2$ :}g5uѢekxQ'LE\VCYEL e) I|^& B9!#$AنLBlKTD)$\< !HE2%$>TD)"x~B.UӡW(%!I[Wٽ2m&(h+2r55NKi:@i:ָo3L-*]zdJG 2,1eJ*\y46,u5/eG#lXlT*=Kp['XX}EҌrfSM~/pcӌO/R#l3􃫼8,}S#Scgiwx獏stYa O2 /}-&Gm 5ġ̜}VUp|+"ӓ4PJsH)>*T#>q12'.DZ`x)okR 7E勸>τ+.:;T:2Ydz$#Jȱ)FO%{|ۊ*t#~C޹; Dotk@&@.g_\Mȕ~ܾWιb(捒'\ 2 N=2VWX }G;?Ϟrђ(~mJWUXףhl6e# D[ȏ>1&+ I N 6BǙT[,Scdʹ sL|h]osǫtǫ0T>`I?IuHgN@Գc޳eeVm‘gdRWC(v e4[vM}4ݗ]b/'I%YbFQ"VelPBOm;j*vQRaFn7ncM>Ȕ\!e&CXjx .Q'p,>11>.Ó)·2`9K*3Zg:n2JČK9]_GGdyQ$k3.X N۽D(a0@U#a6 b]b=6ZGV[<D'91q1*8=Ń%"1FՏ" !3,UI>@":&GiRJ,AQt+52莸5;")6I =AQx$tSrszpOIS_w)u"rySv&T.*C&Ʃ|qRZCfi >H<|5;-˾w/0{xu(!6qY~e\Ut^~b>Ce(S ϒt᫏enY+O |瞧$K%^{_}v}SwgSp>wAT>R(|^ZzAfnq?B05hsY2HG"=R7  $d8bJ7(46Fp NKck1QD).Z}m7p|ƾXb?䯕Nڹ \DFJSDeRnLXDDOO(b '*y6!5a2'9'{MNTU,Ħu̷۫_&HQX!h%# 4h"*[Dbmoӱ PQR3ᴱA4(QpR潏kb쪟Mb4ƝL ~Rl""S{7Jߤ^'>>t8bJ?|g֐*@ɁMJ*-4{EhG$=k2u aBזˉmh{UO`Z.;9煦d#rDX QJw[Wf U 9;:/~g1mI$8һ!` k8z!<d(Q6᜷f<1JK܈4%+j#-2#)H {rAf e@yem"dha2VNo*mjI_X7ܺ} MBǨu@Z+20ĥ:V}:N= 9o3CN@l9NڡfA pm*w'GX#9"R혅gSO_L*(Iã2X6%y'\^װ&_|gV1^My"5VY>]7\ݳc.+9B|6'>o_|:9Ix)IY+!Fفh#+}9r!LHYZDb;ŒL+RAǂr_Fb.$5B%Xa巼w~Ǧh\EϔGrȷWo{%[_[""5Eܓ1%=r1*ws8aŸ́r!-pT|'TOIT^y9dHl&i_(j_ 6 K6|㉄?|-$BYJ '/"rwE9z.= "Ѭ)}.\,!S8"s "8w{oEn7X=i.ZT }abI($ H'%t2;T;H}-oyg$B?7louN|:}HB4iADZ|ƭV>bQ%Nܩ0i5 $mBk0y p%"(KXR|`WI%&u!2=[Dq\6>[_S/8R39I$xrCX&!Uv.>o7/}`~ ƞϩVб‰NLO D*qd ػ5.ug07'3 }e7Ln6[u7ƺ̪5\, /R.EBxXLddQX)HWj%$xBcC_p`V%W:Dj!BNFzn? 'øoaw___jx0{IS?SZV5^{p#|n! C'C 1Su{7Ii$|3po0W助 A^ H ӳ1M7:62JDT+AKtvpt4 J0c9"$t#Qsvו0AR)z$3cRy\-'mDㄙI3(y&*>EգdbMAK/:մ~H#i;ݸZZn}jMYXA'-euN d݌eKl!Kc$)0-U8㍧֧I#~Op$T6*1 3cւ1zB\MIĤQ=QaEL254dm*ڽ@,3E&=\#gwu-MdJSFdTiF84 ,œp;nj]9ʄ]:("|jȬDKØiBmcRAXc6i"JI’K>z2S.G 8J5ZAࡽWk?QY>p-hlh+ +τ~ͯo\!\ASR[!,es"&dbR)'RsJ@b7#qnAdf)J$ADZd,( CJq$Id7&Y[[Vۿۼ.oyM?A QbZF-j#0;4X %aB8b1J6`7!X#1 mu;E"L5e"3E:MGGqp !5Q  V? hL0ogquژ"zUB[(;eMRl,HTѢ4|Iɚ)w$h,Wٯҡ2Z$"ct)KS0SdF\sJg4U.Z, @ZO-kxiF&wTDp<ʯbbe ;;_b:TT9M*‹Bp>+!Ҕh>ᇮ]bίy%Na i;Sen\S;*IHa3>}WE~GWԘ0Kı{ڌ7.4~jb-aqpM 8|R+93w]-j&AW(VЅo$` 1Dl Aۄ)o,pWF˧"rd"ǽEHRDb홋גq_ Zd 4pbHK7$7gd{ܕ2Γ5>&dEV$iSM&uԜ/ >;x}b\+>iO?j.JQqHk8,ĘOE.UZ8+6>؈0K&5ڕ9HvC$In7"E*Ih[\$\RS#6qxLظc'EozEVa rSFWV6>u%mS~$:JØL)<0s$|=p?}c1Y%MЀC1@fagw!Ez9_F={-~gĠ0$ n8vxFg~~__{ˉx1b! 0t 1CesesbE-|ȩdZT.|eb#Sl;?+~x^9a\^v;keF~1i6w? (c0?79Il|ݡ+&FI2H}Ej4Ig Ӯtg4*'j=]gѥL#bΏw+׵Z^*DD"]3un6'xӛ>|.ae,CJ8x r7 /Bk.8&Mo˽ _¡H2C OH2C T[C'—_"2اg^:n)"V]QqE0戄Ź.;'1Vn(87&hRVyP *ZyݤfSa\YW u@Y"*zQxO^$ZS[ߨDZ[LB)LVVVPJΧ?vt:Zξ}x( 1C_Hb{x!x`(<1!Gf}zI.qAgn,R1MĴFJ4`f^ns 9<,Ց{=Y$#H3G,$Two"VQytƹnVz|~ xAn04. FHd#?k*d-IdB jq)C.x;2&kH`&0!)BIB0}nh iiQC]&-eqjr ka8 ֲZvUI1Qy`p*O~5=ρgF0bZ(HdNvʎ9d9C(K:*9R&ٞQ瘡eG f*hRi+MC Ś7NFhPٕe<] TAFV"uyB_& GWc|HݨwmEdh|Y2h?.(wl]-F]"Je(Ժ$usA(Y9:4 JG~LJͱPB$/OQ8;&&@bdZhSR3e"ZAb)FYf;`-#M|$B!LF*Dy!"zLyj(%]KĤao=r:g3ǖ2u(7HxY*g1qeh7:q/3TxOOm#OZ='[ss6z;`遳lcf)$BrzsZr%%HIjY:gl/#V{2K>{؍o^w}H:QAO'wDOGp GiB/[Qh */DC倨TB)N0(_mSs:n'7e6qs'Ioc.E,z-V8I.H$/%$ߗy _fC]\p/]*4ŔKz"+a. F N2[ Uȝ$֕WLęzq92sXw,C)ɐA%n ·dFa(8D!DDBd@7"Z:~3I~(Bkm9c(JJ%^|m-w} 3Bt::Γ^7xb!ۏaqC 1SHCaÙa>Ǩ^7y&:G ftZ2 v(k!CTg IDAT415 lh Ly1C[  HFT#.e[aΥrA Cx#Y̠d":GrFRe8<&$cf> j}́t,K\p]7DTp$DUtMjt1B*U!J@OI잝8n4u5"ߪuN-=L 9!SYdp$"Fh;JHO}&!U:\?|0E=jTzn_[AyX CRXST+qϥ>=JɲNveg!Wi^X/b'7qb%v{Cn0y}7U y0?{oeUy-V}A cS`b c7^=GiOxYp@ӤȴAE^:xh8Mc2 Iykx4=£y➀߿99rA/ t|wmUQP>KQBxD߇ҝ$Z iITrN~  @ b/Q By @^6(4Hi ^P2@`3(u4S㶞*ԓ:R]ݿE GdٳēMA&do$΋$IC 0mS%ldWVO#{_=C|~"q XPEoT-T(vzߩEEh*wN=/$tE+R'r˿d"f$.y[|ܼK@b/5đr+$ uVIRIekf{WtP0?w?> UgŦ+R."R0H6MAi>ɐQF$yh4hN٬Vωk-I;?%~;Z~ԧ>59xD $pĉɊ` &`$` &x0I=\YnLâc.J8\R>SL?0Y$}đ*H; g TWr594u< ڔ'Fo4?|;@ ci1" y{{@W LJ{s.v"(p%)\DsљqyC("! إ G,FD eU,,#уēz{)#)6FzQcO̹紋>R:u$JD)L=4Ęe'I2OXG,׻e,9]MkEB^)}}4]wbDA䷀}w㕟+sS;fdžYB~2w YnfsX5fh>Aͬd`2&)djOs2K&iPUWON +EIԎ 8wjwvz}}`@U8/IH )$:v/n]vYT) iv},Gr Ő?q>NI\ıl7bj-G;$YcP]Er4)˰*vˑ!h9V=]C4bN)Ys %@Yγ'UnQVC)Ow)]Ji,IdCKX31Md>ɍ$w LSab~ B>{ WҜA69գ>"T&sb;i阳$tmF6)Ca="=< R.ĂF4G8(nɈXq:@xʈ} "f ]"Px'PѶ#daqҒV-"ƢEҗ'ݪm3 )Dy25L >-p;ʹ#\+(BXrBVVB~w?$V)#D8~?૏ V1֖R^G0,d 4ILnY[JLDڕHpV3NCF9cn|b-c#8ʝ[_£aV[-  c\6l X<>[| rwT Q.uB5Dp%6# m"tzHV >VK(?>PXBUjTШ\ EA @ɜ†AHaC$IU4즋DhDʒzaV9n[x y\?pM^0(J,DNBZ*aN&ƽ6&TIYcڹbXcOwl ,I;\FwDk?5}ܖnN^4y2{{t.gMaΉ$gvU`z~?~m߇ľr)Igkx@pH\bo09L$B9IW{r{猛G Xol$~ БÊ~3g8s Νcmm{+GswT.ꏸ{ 6`@ⵯ}-_^4*{ATіd &`]L&` 'L$U'ɏ|5Ws_-'ǽG`U{3 jfJ'b3k]9ՖgQ3:cst̰t|PV7aXB,OGlpeQ_. VrWt!`v|QXC57%C#\=JFDOt2 -jް38V'~\"I1GЏ9/48C:||w}9!9 ̱B 뼊o1?k9A5"ii8XcT48 m.Pz$j#F}l\ob.G%b7"yR0 ;ӳ`3Er <;b)K8䞀aGt V Bi#aUWs ; r*HF6)fw51!8#8vw=K%]Cv:dl?ե#|d'~1Cst6G>?YC.c7蜤H@^@^XLG2ZmhܢpGɑ{c^}E57JX?fK;;MupFJ>qA'I:h!*rT"IEW"֮% aŌW}l̩ᾺWBc&jTDuNTwklu eD@f7H=臷}|IR[Smiԛ7|˫Ji7+UHb5دWY螸snym X+6 iq]k_O.Ld['R^HoU1nDm$q89` &I2L<IBo3]kt_ $~Lk<Ӛhߍx'C+MN]9IkeϿri.> mP'eعqS){cn @h'gg-y$q"nnɗ$eVˬr}PPKOY?m!-MZO) s1R8Je(g<^RX_e'ɕd$؅s(c2.eY _Ɵ;#"iӧNr"F4 &wЕUɼC0e$ߟ3gC|~Y% 漜FL Y#34옆Ӵ#>9z/ ;5l v%H,3z)(_z3V܇ N=%h2u_ D萁Zk0ox]1*U<@lt ҳBx<q.X}!+:upɟ-x'{;>7Lp1qL0ˀyϹys jkg/Z c';,svtpvɎٱ[M!@ v`B2Nr 9RFo<Ap t-w3b1(YzCeHhES>M!%ҙnr{K9d1 Q3@r!0A%(S o_`$ f1:B`mt]<|>!c/(mX-,[VYx"Ea]?|7}Șk%Yo{/K]vàEbq>V*Z>,;\—fk%! " Q)/e3^J9 ݖ"TG3xzǏ^m+&,EMqQnȔP0KB~\D3cZlP“!NˁkACͨJJ0(i_Cra0c֗M="1)kJYwT%+p*!nl*ܦVRZmbt^$QH"ǍiAbSU^,jI\ i#<&!C/| ` g}zz\{rጙ1# mu=|”ݨ?!WHE:(+W& YbD1ɓZᐜa9!p L1"*cWwbKpѥȖc P `@$i uYV1V0o5E xL_ND2 h ӴC'AhF!۝flc5Hg54bP̳Ƭ^@8l .PB3 .! '5.B|P䄥ر"Ph߅,cz'r"_luR֐ך{aWR0۔@XB鲆fmy䞔Ct)/ FC圾,8{tt?)0.꓅Bn$p:ғ,QHdۊ㫨x[gV\-|_GNTpW"I$Dx _뽖Ĥ&NeFͲxAM;㜮|k|ɹN-nx׿} #TQۦ.%.wT/^@QbJd`QԯJX +]=N"q(gEFrBY JI&cHa}njtB&Eudm޶ƀՑnSu`h|GBZu9t!댤q^ ˪kI*Q5sxW$q( L]HRDXUX#k1,MIM70i8o27#^̧yTO|C_[o}+yON^'<et:oOO'e &xAOML]d%< 6b/5be0S;Wəq,`aL؞'[ 9 v!DW IDAT@ba\A1 +gPhNLJGqv vs-iB58[^0r 5( rp9$=#)D8]]$eAq+C mL`5:#]9?=y XAߵqHN( KjZKh!Wy64@J$EM²~ ̰B@ZvK}pC% BFBaå)0jaxbe kZ 9aPX'L<gE e(uY%1d] dFHI z2+oNdi2NфBb"Q°%6R8)=kX;8fhɔiNOtC6WO qTbAbr&ev̉,\;FF  SZW\w1p͓}$lzdǾNH~~6rUλfIvcf4GoCӐ3 jHY$.}ç55׽kYRnirիtwظt74p!n2±Phzy,s.$1Z`hB2 )0B2@P&aB[FJxBEWS"vIl?#$6%ehJ$6eoT= IQ%>r8/rH4ĸ,SJgD"#*r<#sB]@.Pp[r=LvU֙B'%8Oз.=ŊÈ9 3b5FA4 L1\fԞ"J{HiIt0vp!Fi  c⺎q~m6}B s,!k,3s:I)IX>øm'2 .ƨP3% i0-9`-qT]^(gv4s4xLD,]Bs GGEL^g@&oZ .M \9:AHzĵ+ܝloJXk}D 4O2̚X=W]VX y\p= >c9S4<5x\t< &#p9G6vG;+{OWۇ95=DO|'4tΨa0yepsK+qۭ {o>Uwt[9R読N hP ȼ-}D\HQ;IB]9aVQhJa |XY(m?p(5"K*Tq[r+YV_-;)I?O$Z?i? Zh` K[ *&;yQ;I1vg8_ޖLyJF݀J0(pUt`d!e9S,Γar{Y Xy}%V THYD!lZ&t9cw1 ȉТ%Oz<*3'P`qXrC:!W0c%*aF Yc`=\0Ol`;Yߠ Ǚbkұ뜔8cq:nH5 HuqAd첈\F5ٛ0pYO5=6L`3rMd\{^#Rfi nn^εcZ8+ }3eCv@ sY$+y4o<|s$`-l|q. FEXzMo>@s@)0鷛 %b_;;zvA^Hl`,.?$~U g ݼ/{xz||o۝$$!0KO 7ZHLJ iJ?M"XQӄő@k=[$X6$eĐsiU(Xf8JHiz5UT w4Hn(DSu&:jK(#q4&% E˗#7*[@esHj`F9I"bD 2zrR$@2.b׋ SC+c?YUh5aQ0-UڕeU$[;oZf-PԗQ\D ⺳UUo{EQ(ۿ5affS׿uON.RvIyx<&MS>|Y7I&`"&L07Dy}p߭k4 p{|yD.z?bМM}Np`H$.4$|kxKLX,'Ƀ E &MF@ץ4݀0AK (j4#$i!cgɒ7'R#ُf d!)aqȒ۔jD`x: 2gl8CmGt88#QC!"rfY#r9Ϟ@[XV9XT8dO((I72ds19sqf=?"ŚA#9N/^HK([ N0"Wr!+cqVi,U7m֯L>) pG 41) \W2 ҅+RX'F*Usc2=NF(&MWqK2we{3aAZw~J֤tQv8KJ~phzYƅe#Og*cFۂxѰt?oM:G8]> =7]4" =pXL30%hj}|suvk`UNp8k0?"C[c>y;|wT}A@.%v!1)glG#hw2T$$.ןKQ 1 QQT >: )# Dm46Wm-,Z60` IBy_7'<.])yj^e>PƖ}NւU/[J N2v (s,80$u:>n̩e]O.?qF\ÃL9KbgdNs&bvqONf_vOqfaO*aavLJ! 9ңp3GÍR?3k4cKbN8BJDR,,E#?L\ƍH 3Z(g +MS0/wm. H9] pdI))I;3n5(+#pӭuSsaHFsn FӔ(eeFBJsyzvG IZK.Ǽ2Fh'16dY ]z)ǪUGqƐ-gtDq-ِC uL(41),0>8`](g+Otq;n &r(q1`EL fŢ*tv ͽ݉ O25Ɗg.=7>1uGh?|٩6=`>&{j#O";:%'!)WvchfUYs.-rF3Ӄ)޳Dxh};Ͷ` $vDkDc T4yi$BLh??s~..ڵgu}ANʈ*Id@"QH@2[2_Ы8+&1)SzYIWdp)pTli/`%] $8RN/ee;UFfq{U@UT!o Zh1D^/N^xjWE9!h2ȁ[rQ9^Djd?77|CUcE[kysHy~';9O\{nkI5]tM߿uz_''H'NxdžJ$BLD &d &yD$cvƮO=psXfVʑ^{۽MkgwoyW}#~iZc6&>?sc\vMz4b 6t`΁ |9pj> TI81 c3e(fj<$)XXλ,t+.gH V{d8gx$! /3Ӝ%FD:9AE.&FK&69Yt!&* \ȘLzKbiIt~(ya`h d--PhrE~ 1M E MqI*1600Gn7q'0$C/sk)d@aCfytU4o\e$mc-#Mc0N 0c=͎bՇǬ\:EZP( knk9\zI퀮[e5oQ\UYK[ԒE+x,{fl9?{α{37l??y6xj0ڭ^k=cfdeu1 ,H='΍̨̊d{ oq[6pY]xHvoX.hs/qӹxmMcKbd`uYاE|)W?o6x7c9N~ຑ\VW:xMmPBa Kȿ<]c}{ˇ$g/@NP BPq?qq{[jr[A971 [F;6FS8'|^5^ ɉE$)˿l'J&d['̞,uɉ9$AAH$u\l<ߠ;.8r@ĕ@oU%H\"pFrF)p`_}4)AnJ?j Tn`@u܇)jvi w~{o򿻷Qe +2{3bmA .M$ʂ F弅2Ib1'!$Z[[q.nDl!o$QҌ =Tϛ2e<(oF D@8zb.OO!{fD s# x\nY9k 9ta&)AHplfly Ca}{:!9evsٹ c"Ϗ\v[&uXh,Pw=|tlQ&P5/^ծ 6uN}jq EIxL.pwe/9 ^10q.8HT,1٦(mFM1)bPD_3oQORa@pL::KA"媣3(g (g*ѐ(}:6Xa6Ԙ(_A IDAT~IP` qI9/#-H_wN`;'dID$_y (\Eh(Ja* °ZI( $` W~%oiKc\fDI2[F(<8A2{?brPz JXEOiN+_J{{%9SwMOjn멁r?v]J)⩈)I2SL$cJ|}g^o;e,kPknzx7t 3ck +(q\ҧ]&sU  2(5X_pUه1 襂(듉QJKl&Q9D~Ԯp&`XBb!D;81sObH6Ĉ:HGO DER@80kTut2 A?1A(Zy싯Fq\F|2~!HyJ%kbr;ۨ>H lX^``;M=sFGUc0Wb) "Agx(>D"Rb@2͘=BaI:uaI%u:+y嗹 lB0gkd)廬jx@Y8m9}y\kMWۄBKK"zn.4t4+x6CpME:Z)Ο0|Oөϰwə|k 3Tf 4mh!WC3km _<hA@ .@qJPؐ…6DۀV$QRhQ&l*>J$gʢŒ͙|_sb|Y/ΒtqmJ.zhb jeRȇTMzYjidHodC: 0BL[kVWH*4ТB -*2c:oiV ̏j2U/Vx}dlvIF<&R$$88T B2"Wo/7C{۰VO6X%2_Bĕ(W8}5I6 -9+hv^=~H2#Vo*%Ӟ(0-oy k8{iHI"cSL1SS)b'SV1=sÞ͟$>c\?_¹VI"!|Ӻ<3|S <) (^H,_=oMT2Ġ.#%VMk9I9-q}ov`PjU@*$%I2"Hy:$Y9N!;3bo_Uq$IB$q{iO1*Ib) o0~-s,o7yW]e9orjaRL6%ՌA֠ʳjݸt?/xr/uN %,s8')C:( CũQ8Q;lM F!Z MDPEH0Q@-`g.bP /Ϡd} ]`4=@g"H!F 7F*.s[-EG6 I#g Qks d$D# G%q\9N3 6 GL]g=v(]_\ | i|bEߝd-"dCG*$H|JmWz ;.,6\aN qQ{ ɩYGXTC}v} U9@[DTYB%lGBa\#j~ 83BcI׆T#W C\{$c>A-*TUyZaT!#"lB&h Ӑ^qFʆ+KQIqC7VA9=ʽ] ̷Qz@p{qpO@S=Idct[(9 RYMdWy Fnvc42|>x5rW@9Cl364̀94ph^eI:!|d1: H HD2'rx<r\LB-0m9/k`}3wo;$)ə.;qH_Rĥ)%0)2yŗxj^Bڔ}V{T*lRJ$asE$R b?xOW( Zmdq<@,1Vqgo'򙜤o FZH;?+We+IDu h/#Tʟ2> "$5CrI&+dH&bR @h:7یd$ FD$" H5>\FsbR$?JIrlL5;Xr?G0(zIY BWxdRII2 nя~I] O 9s}"k'B%1I2}>b).ZS{SL1凩}g#8'6~>>0snIҦ9^>$E'3LmfŒFqkܭoBW+ *A 6GFHaW@wnaI D(RaHU(4& z4@ GզdQMEt=WL(bozc#z!6ڢG A}dEHcH %"'(9kvUy30E>uo,4蒻h i,HCᐢ7A"tdHBqBJQ=;@b 0ϳ͐nD ^vY]&q7zA+R8z(OilM%`85, a-OڨPmxc%̱Y#15zlcYv g9m K] 0Hg9~OphQ8x8?ZÊ)@ҿ bR1}}KdrV[kX&j̲95-fOgaAс/5a_cf=t=5:ؐw|k/{%/LG.bMYcY=zH,2r@,H0pB`j)IDV=/%XORnlW |^< mJs̼g"[f^e,X;%i@nj&pnuD2d!aM6G Sv8P2Ch ̀*KcGFp^/&#aNpH_B _ < AAPW1C(\*(ʗO1#U!&a T $R;W+. Z" g֒$>ڐtEk8M9`ML$tA)M"fhQ "kqxtLvD\G4/05Ea1I CUs:Ȁ zqg(`9l+td o  bMԖ2jGC8$w.&y**Ea Ѵ ӓ$2e]\TD51]ΝkBxD E>ȹY9˯Rd]춝vpӆ^w37֏SmuF`5iz k~r.Q1߹Ԁcôz, t;J9 T9f@Vs'4vn%P%!`N(Á*+u$AVЇfPa. EIy&\JhÎES,EA 5JP"@by9H}p8OREq3Q$''|j n+"k'ROPKÇc ]Ad) *?Tfp{ouc"$&gpJlL{Pu^ yo$ 6IiU.dMi 1p:=jcRo2$Q7Wƅ࿺#"'&ȍߢX~޶ 5.{ҌKrAJJN42$ɐ (i",*ɶ$C&ZxA--_>5urb|mP,ȷ£1c(>m6@ z =WvH?,--7$Iv_nzNZBl߾z3 Ї>4}y <% 70~DQD(SL1?9$SL1œ "p3\v9EQ~%c=v-7 eIcu5Jpv. WԽwC`n- Cҡu1cQ&"pr$M&uV~n'$+fd,k]hє]i"2c>㵚 CpVYf'-j u]fx{wAf}jB[e*'(C[5YU{P²`@ ].9z8O>l\@s&`iW3X'y`*o=EN i|0z v^/3B(rPl ah6E"~Fb s:<,?ja;)p8L*HGx8|QoT:'vpAlϢ[e)~l,%Z;:?KD΀Y/< a|k=9àFC(aR=*Mcg/׃13o%.%p&v9U;n{̘6sE3`e~#AqBA8.BD>5RB Loy)G-3pUzҠ,fBk2[Db.18>qg}GO C6"K%ɀ*fhѤT쐪`DZKdGJ4 . r"5xq}2܎$TDIlV)խX49 ɛY*38ʼM['ߤq<vn $,QM%T""%U Q*rϕUc΍R}[oW=!Sqoš ڞ-߻^O_-z s]& 8jN!%lBJ6#MIRehc"ʄf\hp]C$rR nSQ\`;A@„U(9s3S%4^Aҭ̀B/5NHkZ:A](TX'E81CJΰ9ѥ0$N^j! Z $z)N*"4-7=wфm$d6됡a];\h;=& -=5/߫33KGـn`^˟p_z"kZ>Kxodևw ug@:ð^]wI7c8wWn?*x_Ev"1 ]'sTfPW?!fUsUN5WNФThiF)Zt"@lGڏX6lC2q8r].%*wڍ2 Fz] IDATHJVUoyx+|dţ˼{|L<2â,h6C'I7Joq޹ẕ̌`T)7X+3"ٜסz$.%t&B 5X0VEmqoeFN$rj )Jɶ$>[ Rkx?8.ƫG9_*Q@&QY$. ld9Vf">&=g;ȩ2wd_̅)u,ݎMĀscmddSxi+vy9'ߓT*yؙǍ@XO'qV@n* |$sT"IgQA-[u:pXZR.WǩQ{y$KKKXkj %ɏȏwwR{bҤӧ1O#|J{nyє b).L$SL1Oޔ$1L|`Fs4oѤA6PyA : Ng;˿D\-> mk փ U\u~RC-]4EcQ1kz1 W<# l-U2JbjJ]HQQpTC:A+>UDHT!J"XFiYN"r Kk,,ӤT! z91hv2"b,sz'. G6M. eMm8)H]sb):`HhGMjr5ံkr gN*|2tGYk~9 V~[">!*͘6ZHB+aNV0 sZ 8w$Y>燾+d~d'Ӝ|c%TPwp:Ph VN o?Ͽa[9:Y:<А]}^"cGq}ϓ\3\LHB(piʩ{^=-45.  1i]tyY$pH }h,'A/(yK^ 1Hpd̳6ʱe[qeINL̂O߂Sco&Jrd-ˢ$Ab_>5$GJkɋ̓cc%Gs^vCB(byk"#ˠCΟh PP \EN5l, BUJÖU3A. UBmO~\G K%tCpR^5KD_bJ-p "P)?K"5bkj WG^i% MQ!N&HapB\BUu;TZ]s)ZmN.DFt+skHj v d]@8hY< E!2aƢ $&1-f (ScA3'Z@ Kf#:GǚX*yw ,y4̉6]eH$âz 5 `7g03j7EgIlF5l *gkQA+9+ S4m kf_Ċ'F/B\ \&2Ǟi^y/ @`{u[~ƕ>ȇ[,:IpFٽy?Q( tSIbR^̂^):+Y  )'bKi#fW#frZY0"[ue\Y9K%ںМ;KlZ\'fI1lgl=_pDS“$b;oc ) ed[Nex].ȱꤴ*1Hڢ|O9ѯBxU(~O*O.. 1)B; TdT0dȔ@itX%)d]ȱ$pzN{k0a11$'B$¦2B } %t8 2b:̐ϣt—?[Hɂa跋Qo>|i.VL` x<; r>@_BPS̘w!Ÿ-mBq&ǘq$|fn|>kS$<7\ZTrjSXBA!8'NM0&/{JAYą9rLL=Ӗ$XWnK!-ꑯe[[)f[Η G>2)M`)I~ܛ*I>/W\{'[_\f' Չ5iGC0'Eh1c {jV`![ty7L @g^J>ULI -͊s۾f+󂹢KF.Flk CV]d$U'E - җOlSaq̱FyK1FH ɣ{>u稐ـr?$3lP)<}|LB1z<2TE%s:ɜYAy9CpLx'c@5UhФpH_p6 `\}/uøSg{ -"4+`X uX֜Jq|Gg%mfhXa=Wcy"T*pu7Ojf9d-7? ky F(-XH;U˿H$0<~3, ,쿅O|qJS?+ߺ]9ӦnkU,w$Y`VuHf,&Lo`s7̾HTlFp.;oB%$ 6/X;X=9Υ[*q &o[pESSRB[)Eo MA>c >ҁ9=ضTÛ_G~|HV52rtW?"JVa[KaٛJY[Jh Cb_'.%V]~%G7K6 J<(BORX #2 '~E-p(81 &1x^> D]#FL#{/bǠ.`He 96bB IuFI"]6j2'Tس?I,o>w܏l*1֤BBԘ BX]"nm%.ܺy8x>IioVI"TaM1SL:L/SL1)I| ?!C2<VȚb;}O i$9M_Ak0RD@6di}hzKI=Wp ,IC -I^gyV  dتB z{!B >FFD&teD.6FEt-hQZZ[h Ms²*YБ3R^\`@3]ERpʃ,ж,@$5B kW#mΜnF 1_:ENȪBР  9}UG5Di q :ǼY#i]JHP0(E5*Ea#@ӡ9J8dfCN CVQQa^wcd@WPc0xޛYvu<ݪnm]Ko7#Y^0y<̀3̼yLA`aZxa"&cl~c --[RWwڵݺ2ܺj Yoĉs:uN}ބ2¼C1<}i5-GhnY<>)2<3x~h5ڥ *I/F.&H!{^=v*.^*َ+mɅ17GYݛ _`i2A,M0Χ9mMwF<<=ħ SW^Hӷs0_YϐNt튢C{m/og\ro P){"{] n Vv-@1Lx /c؟i~^zӀ$BR"bt)%#21eEIE@&AwO $D@QDǀ?0D' Hl,)T?J 2Iч+f9-`bJU°FnRC.eNM2r]l L]0}(#H"zD[+E0YPw "V$}wߣ'0VDvè ߇mjZاܜmj+3MA`S1~RC??!xo ȲA #+$]lA{~^9nXzD<똝\.S*Xk͟韎tF:Fa2q72|iޑ3v| &$繆rgq A9"uHQcFEQO}xێl 2d6l8 za@* ^#`MK Iux/7_B(A4s29R1&âر4gյLmR( w~MSqZ.{MGc*!0N$51`^T*I[F(K\XI,(8V"ӰuILq1Li6kn'lH@FHL90NafЙٌ萚d‚`î0f5>\Zed;p ]LLĚcb) 1J₨ENhSJi…Wm9eS9="Tʎ71.A}0nBP;:FfB?i2Bc$@L}7t^oyuTD|k`/qmq|֭; WLp&gTgA򜘀#W%V] J$9)`}}2\skr:>9R]Ƒ%oRp`y901&u"ͪ/!+H=(NK4uume5=6jaD(!,1 [cxݥL<+4u#sW|.{ 92l6|Nɒ.Ua#?%zIaUư$'!GeX71LBv[ =ݺ"5#{_ii5_ 7ʖ do3|A2s$Ig/>2$gsIR(Iv-ⲥs[ҹ,'Ǟoz :lll—dK066_z>n FGS^{>_$aFx.aD0#<G U_7s Go> Y8cdIqybx C2u+Lid|j _F1'ȵ Z_;8K';䥫Ex2R !]S!|d^r^`M=Ē`1%v28B#3Yw$ֶ |2x Ҕ8evjR;\t2Cirs^ O$(IQ@fhqkAC9%ipǰBP Z6h<̒LZyTz]r<ڦLlC.c|&tCM+=F(=Wc1N9E*t.(% fIC6BXr#st*-Ԓ&_-=r'I^ҥo3elvj,fKl3qĒA.JXniDQV=za dC11՗K?H|LgM^;N^ ->m?2QXtE#xA&f&y3="!(ݨC).hK3'_įF%=YHgY%gDv 2K$RkJ 3ܱ ',_{1^=Q=]w~^(| yn\ FTx uJ#ُ͕#u*oowGajTliXF$IP.HmPFf.Z&H(Z)0| u] ,ZGX9 ~8㴽}2( &cE[7PMWi>c_N ဨΐ)?Dɕj|^%%zTi9  ۬bS 9`w5/*s dAZ05Lx]xs+vO}l'yVTCe?}(5 ƧB(N٢JBb<$+q|A?nG#l;$I~??yP5#0u<{3<#<$^vŌE<֘g(/R{ڥ7بq䓆AMKudW KԳe%?{6͈BK/KI+*MlP3%BDARFC۫,"bYC%+^0veElh᣼[Ũa  5zrm!/s#$6"bRMw3h`BKE.] ȈФH1][& ['CQQ|ᙜK(BIV I z1VҏW.(WTXgW@6Fq{89=̊g1}&)u 7nf}HmvJ<6_ģcױjn]{F֙c~73䊅+t LGvYz:8AC4lgp|e""ڊ$h1E'Y|j(|֐k'Ho]CB8_ aǷH 9K3ݾk9^UIbLa-nJ}I2\$ή MR>Pn ΩqJ`dtuG>EBo{-?$gRsP%ƭ&d ÅVf}*1 W~_lG8""8y~n&$BYD< ;] IDATNɷSDqdV lĔU " G*1|AԳ9MVSD6 1*|ցH/6b9ْXD" 2ȉ9l]UA\UER,Sɧ؀W>]J+WT0-1RG >:,TXePEH4rųo0a1R4QƑ#G_Jꡇo|M)S$#0Q#0ZQ#| |Kss-'^<'X^ (qSzp=9cnoP|)ԑ!htMa QePb;TZ s6Z1:#_&5a P[x.1h]K+=:*|T};-j.loYQ5*EyͬrRPq68Xo1 ; ~osNgUKUt`l*:=pevjNeaI^CKTeb %sU'KVA$ΎFHD_O&; ZV( DJOh:bߦ(augw6iUt`t*e5cA&J=!)XKtc]`hK]8U4Sh!1gEίA+JaNGUk9>_ 1sphs+f|}.ox5e;Krv{kǸec( iSJ"u!]HnUA@5)TeZAƆgs`39ȍGf|Γz(~c \x6p(Bϋ- &$ue }𶇟_@^G%@go8@X#X$1 IOI%;٦2P J#IF߫j؈$(֙3g8sӾ_$#0EGaEH9\;O|)5.;8q<uٺ{(SC2^<0}(#/Ι7Yg+rB0Jhe,0|Kiy<S ^j5r:^F>fi*kgP&"LED[[KȨ,0쀄C_4p/uϵsT{-^_=s7c+WOI77-[e&N9$/㩌Q]6fqQEOgS1W>MtjoR B F1Fm1 J!Lw~)XRҙ-ٌCVmr n?ҡ%.5CHr! -7ׇw|qtt7c<\lFf=&cs/gXCca)˸g)&7q\5#OrX9R:  ?D׋Oqzޠޡslfuag-mI2=)RY0O-, g:>QV(]JSg[QNmDH!7zM|ߩ h.k}m|5A}39h7 U8TG˸W$! OQthħI@]J4إ.%}M)Iȑ=R7c_XX g$+u<Fa4aFx~cD{\AOg}Y&x[P?7ӈo]@Zô+vRw5h͎Izs>s7'Lvʗ7;xYX2g_|rUdK&~ȯR<|(0d""Ǚvb9,81+\F.?Ϗ5y;BiC<^`Dixk*|'>ļ^"V Ofp =_"QmWm[Vg˛љ;%|P$DKZYY79! ㍋LOT([b%stj,E'38ev ֪ <"}Nx{58y#T6,c5!7$O ,o @An#OieQJ;e a[H&.3#4ܺZ8%Ooq6Wp>PLNE0x^$̕8&/kZs)$b^PXO~Hکc+L)%:O-8/\z+rT)yϿwLȥGJ@,#bҁvA   d.&C|78I<.T\)KpvcE@IҷM6 I2#A 3hqܵA)rwNNŃS)Kq> %IAARaXP(I ӤΕab0C iEzr@';5re @ ⳛGlQb2;h!M@=oIG>IRd>/9Bwϻ/T$I2 m0EHFag#wc}S_#:q/<:iID7ھ9.Вkj'5 ʕFs0]7tQz<ѨC]𣐩fvFn {)5 ]|b;x5UlZ&M=*M+/8aP6g9a5Xdl+¬ 5(6>@*IR.ɽ${\GRzxxvXB[EOQh4LMKb",Hw)KgRڈɫ jsy)!=YC\F _D [e3:K"%%2I-usBE.$MoP:;w?L]u8%9B_ L $LHiI z6b;0m|'1*eX0:lTgm$vz؊S-ye ҤDGص_5:e6]klS]?z_!! GemGirJgr;}ߜ1{"?p>L SŅQ߾Sd a WB"S./޾ʰXŽw$=0A3L r $Cc-*Rc*R<WW(#G 1i d4KG%c$y^"&IF$#0u|}10-y>jg?Ʒ|'gyB~ %r>+Khkh_ϾIvzLuT4l.#NAKE7V ~B@n $ʔہT\)BZmh Xs),ʃt2ٲdz_]/"f[̰ag T̵t(16'<"o\Ǫ6(ٳ.dgl !_n`5Z@A c:J2Eٜ9b 3n6!C`QmvDӜG{|QjA>YM*7=(10J&oO2&(H{ڼ̸c>^fBYFL%l,/P:ql96IbBkXQlk#q;vWkؔC2t4 Uۡ:WJ`DjCYw V6{?Җm M1Fb,e_^%Uܼ~1r3M^wR#1:A}IcEiiqNl?J`4{yK,jICչo$g khޥh*fPfvZ 0Xc0ڒsu;vYQ7t6>)T֟3K2ײ[v &FrO0M~.!96Xީp3Kbys; ef›7hM{a2I0T^o#Dg]ڏWa 20%` uߟ?8=| ;mHq'"q aiH~r\X<$>][i6S 4{^G/\.ɏ_`Nc3gє4XDdС2D~8G适`8oܕ_ErDZ+yA 쪄X#$uJk%Is{9_粙DYM.<n2|#|r)̺(( #mnC@JDfp1 G">zww )EПJqkZ@~t$Wr8X;8MTDecCv:Qy !ڢ I 2d)1}ݜ:ujxz`yaqq(Q#0u0#p#%$_5/} ^ma^ XU$maU,Ŕ wJtpACٜoD%U#;rUo9ͼ!9tSv+-o},=(qZK]֬-~ɬO*S _L \) ~NX+.HpA*j`h$ܧG&!-"(5 Gv[\t)=1!7A7_{nK}aI I "oFṈIwFxnaD~<3P1iwaSg_")5Gr9}]n |F2fG-9Ɠ̈́2R/|&nacۮş/ 6Yf,ߥOMQJX͆smm4T*]zmCr9[-ӣe5*K#jTr+,NCbyI%'ܡ/bi? Qz@ʁ̑[X~_9kݨ+ (vc~lxH@JBHLz^^}3ȩfsXBS3(6Ϩg0ʙT":d?V$ɖf]ϱs#%IMD(};dǛ$S5RMu@^D{éZ? ևU"S2LvVC y*~8Do"k\Tb6,YalTwT\\AB%5Jj<#!WRx.]H^*? 'OX9)>US}Ph{낦2 /$i IDATHgշ|~WKX)׿|?FV;k;O)"Ǚf+V ޣvv@܌pOOB)z׻l"=y-vN> u~E竒̙3&I#0s1#0³I# y;U2*8;~6yIL8f,i4˭E6^'[ʁ#rQwX[*qt8n=B% rLzRڔj|Yʶ⋥;xһW IM| d#5tM5C.$1eS1M[ E@f/Mj|Bedh!Ye+!QX2GV& FȀHr/"XKgg3&CΉIlHKVԺ\|i ݜh]1P P2 #NKH ,ʪx@SmNWPviy31*G<PU*L2iCI<=A a~F4ae趼7((ɔ#%mYa;f+N?~?.p] Kb# N/޼~ڐ>O%XϞGoݿL3'Yڮ+6_z9d-hxm!ٓ\[Qx@bxboe6_V-s?cSX發/ 9p3XlF.qa HJc@4%Ǡ;Z@q; c:aO&`$zTD1dZm=5 nT̳ L8{pZ|ܺ\:MAZ\ wY]GN+1Rd~}J"G ̟{E,b_~7S2A_$^F~%;޹RSYYn | Ko^A I>ASGA=?rEr J~sm V]]|5srs`RIlb$n0Q#0NmkD|xe5K,|@Pa7|0+S 1OcAy7b:2-frN.Uo26MG/K2GeL(;R3yaH D$$5<$6 )> peu1|jlN4(ѷ:f ZJC;E@dXtl Emhkv`G)ӣb:H2"c'dLzqF݄,%`nVBZcygdURpa5fgb!= &g'f۠zΡ6ОdE,!DVuI-)Q7ᥫBpBVC.# T>IdbQ6ZqC]w40nmW =U[z@f};Af-pE,=)eWPbkN/T1f [Ǘ ]}_Y$;f:'%s }$B!r2ٹ"^1&_` 9's7li Jpw8 ("؎Kx/%rpĀKXy`10b9ɜ9äޢf:vt#E +hDw󾂜ϩ] ;`[8$9;OFN_> U`v1Iu<~ux%2QM!2} l؛~N0l;x Wv$R!_N$1n:rIwxGP8ql.λ!2*G%+Y9&H;Ir$w-=RR2d\$z03+oC:R q;N=&N92z}ሢ8I-N믿FuۆǏ:C=418c1FE o}4weᏚfHɩ12\G N3%emy7*ha'855'#g'd.d1 $wjz ' =Q!I\Ft|>kbI&T QCa0b82VoS)Q`^FXt%tyz' \(Ielزp@L4F>qC% 'ɓ~3ï£"I B=V(X 2) R?Z-_ZΒϗENtȔuu7֦${8~P j C;Xb4 zsH_\K26"C:AB(wV% IS] jRI.ڸ(*et%5EӔɌPb@eP*aS1dR!AHںfGW*Ha NW[=/jߣOPrc]II*/W ?0 r6KWX{eE3)>q ʀG"<2D MiW35MXϤh2:C"s1QW;GYhqC䤒2v##Ѡ<1=N7h q@H: Z0AX \*l]T622x^^ŧx~=ZPKZlu=^wnϯUb"4\qfmД(> Vb(=Q-)i :VZ[0++|wqc|ae"Jߍ Qj_=vh)mM(ޥ'+4ы&wv n ؼ~+_dSrMy8I7'-~bc}2ȒFV4ڒT8^jI`4d7^!U9a#UY=*$D>lZH۽'f;j++b]i{;|',e4YIcEI}c2ֲ_㴿@HPx}-#@N%хbv~_#h!RIJTZ'ɯC % ?1 $mQ' $ 3/5#Fް8@̞_F h)Qd4b+LFEјQGI&ʝ9|m0; 02e@tؽ?5F™;IrD[R[.S{~ E4zVPHN'8lX1 C>qACdYF\qJx+R"`jj)%:-oyJy-jxMyt1{b_?<OznV51T;Ic1F$_1h#ۏz<mRU ]n;iX\C*4\775Ldgq7L5ٜ\畩-3S6qAOpW*9t&괧Rљ@63@^_|w~x7οfy;)#l_{fidZ hN%Feٶ@8f;\>&mhܰ=%;GvV&#%3ۅLFI @+R]I_љf:TQ:T:IRZeø-㒘mĨFc'nIso:DCb3W1qE+nmw2 v< 0EWQR=KI 1bzR҃"vM#_r&$g g;I$92W6!DF\;I=m$ᤇ%aP""8"%G{~>;I4]1 X^^u]\E0DJIT⪫E??=o~wwi־p&㙃jZW}C2c|}c1iX$qrp TzS -*RH5=&̖؂#<*:v-5* VN3;/x3ˋK&3)X0bxeNkSh.ex5XUs<b;P顄f56TcΜ4AqV0gs*2D9*b8ʎόG -W/Tf :@qW"Q>XD ɤɃܲ!$!넲L"\cX1myaD@UTLV:A{(ː=T0?8M\r) -0\ Ѭ$?З%0eAÊX _DP")GT'hf2?`v/~l:fSDs9%B'rysR6AvY1M1Ik/z3S ,qt;ݼk^ҔSVtoK>J>3l꘎c(T&3|ǜsjxR TvET$dCI&wt~n~h&G[yYy_JJ A 'Wۼx"ű԰P$Ōg>>{ ̶s DL"@ ś|YUvG/Cd(d%=$-U;|WO4FI2:f>>$$؎fV8Kvh9|q;{yIE,/z=;F\`bj155E\f~~Xu]枱75`:Ir# }c1u|b$c1Y$_znc{I8wo?^tȮT>!BrJ^h:9^ߗ'T_n'bb;dt3¾ TWWXY8^>D,sL".dA4j>Q fkk|>:ĄPgr&]̝9ᶙH[ f|J~.ˈNWmޚbB96sq1" {Ɩ pe$mw)6p:mD g5Ǔ @2,km7˂s!g}dF,&bW5a jH)3ecO&P2+]|ֹ ɘ7lԔSBP]aP%3,ᔘh)SVd¡ i'\3"lR. &Uc'K.n8w\yij&DP5Up'HA ՗r':L;~7T5PTDg9w!؁X<[{Χ#<}v^@wq[ m/goR)9HN[ڒ[g\G˝b(5sbr:_n.~ F e#iĶBąh0J@ 3m9"qXF;IvއF2!y[*yUޑq`ԁQ(C'҈H%x#|sq<Ǣ OTS%S J mxy͎cbC$τ]v?WR_zO1cc'c1ӈH@3!jeFg)$ IDAT% $4Cy'9㊌#ҸAI=KY^l#)vO!oa"&4 YÍCB36l,8 jZ !13bG1&X"3S4Ҋ#/Ll,K(/e q)ŨXx&f"v{tu-%eӼ$IF#nsJ0 &`@,=6W88&"zT.ir'/p>'R&&>z,)9#H 76^&1p*TCArS. Z3Z uhN6>6(|N3?cXr.kr _~e?;"z yMgqp_3I[b1t{ ?ۗ,;ny8p#ZH|bZmZM}kD~P?a)XX$ս*LE J A8̔|ʽPl1 xIԃi6&&kx̣eE>a{Dtןe=^vUMñYjg`n0vY}FJg 07|HuFcX-i$asGc_GDXhm{zp&YCSpg'oc|KhRbAQ۫ڵYΜ9~_e=[lmmwI-?۷Gwyy/KD]~ᢋ.Z~k)JJb1)1c1ӂH!$xw>ve[;σȿflDcF0|aV,k%y PAOYt.RLcTè"@PD)Y ʸ:HA&2R*KdAFU#6Sbtю$xҒ&Ӂ$c@ d8 \ H:) ͘l['Im=$u~v8nS)%6 d~G>e(ФF! "f70>mF*rQd=2z?I\cFa$+L1@ |FOBcǷ^1hy׻u]G\u5rPTRS?SӺNqx^oo}yMu9=oT*2r~Ϛ\ըj_:p] "c1SopdlYc1YHS#Z)5L_A<0a>?zi\KkL ~҆ԉ7l|Ʌݔ{DU@*tnPq2/ X>F5JcאG8٬4-Nu6ݔY50LѤdY{ʴIGIHiɒD7mG.Ԑz]b찜%UFFmH`KC1 G棘SF*XAS45(i;P6)T2I9kEVZӓ*&8&EI zv;8j pN%D%LD%Dy6V+K$2DZ}3lCPCߔ).=*\ ᐐ)apM@pqJD(i%Jd3D4DO}Ǔ}KAs4eVy6I.\? ? {0o=A[#80ًoaHvj'ky۵HMS0jT'nCWh21`ݿzI3'N`F0i,S=2 sҰ8. iRŝ qIxvW&dHkc惎9_sN}o5%o[(RKXx 2wMRCD}%TJBn)Jb\QtQh)IK)gPNbJr@w:BɅ|p-=t\1S<'Unю|Y۱ӡv'c1[c1_3E/o}ȝix| Lm˝ s@:@uyLK V&8 >]%bIHKiJ\QGB;ZjGP6uB ze-1'ʄӑUNb` 6k`/`6!\) %>˵*DeeRi\#㉄Tr _aHDIKDxtuc\4U@,r g$zGe) 3(9^Z+>n&Rh| KmyS6GX.01 =U%6F#38UY@@X2e]DP'+/}\Z)exbߙp{E*z8M}G`]AWy0+ x?^ded[,մ/KN_N/p0Ɇ^#੽w9a$IJ @m$?ڜ#E$yC[rGIPYtHKb\9taQMd'(IÑ )b߿v > $& ǵ$Ep@e^B_)ӢĀp$)s<)p"qaYF ]teNv6$ՎW̆gb*GtP}" )+".ħ\,ΨH"B79dt=}%[=OQ#jK` 'I2tw#gO6qX)`ݼW2Z$Ն@x&չ$CS~_kt:hQJy')%Z !z+X={0jAMy뭷b~ykarrz>Nn1ģ> XBJyPV~XZZbiiIđQn1c1z$c1_|c҇zYm gN35|!\V, Ay;[-߳yeaaTcP*qHEp<-duZ!~>tOy^GA 2RZF+N'[Cm"c]2ݴw\QK$4 6X _c?ͱ݂]) )R‰Me1\CRdHOPS$"F"Rŗj{8uHWRIRצ*czDϱtᲓg KnKO yp{(:a'׫@:SԙǕᧈ H -I> _q#~i7$=H| ;A"A ZJ+b{yޝ,P$KVV$ҵƒkS=+V$y-|2%Zrb Ӳ‹:!!"3xHq[}Y?3* GXDBH*Rfn-uɴI *:I%+lR~T@eNl麠S'IiFҤiDvGZɢ_QĨdT@xQlOtNy9 $=*żOxiLy&m?Tv\d9XgDۨf4$i"}gы3N( 71(p]$IvL"uA[[[dYV<){effc aJozӛ0p\wuhvLMMcpex; Y. ({O$c1_oc1c|1I +X;jG_8y%?E-AseXa#}& Z!X x5ž&ՔV_o|,J]/ T̔ xLU]1/ P}dK3Z Rݣd E\[;eZ?ECm1W_`>3` Gc#0e-E=Qà0(b % (M*<#"Ci)qhJ:$u}&e84QVTʳ-ly}+BlWؑ~<~kH$zB\9-,q7;i>ƃ\!a&]  T.K{z=IdfPIFEȒΉ>ϙ>@eCw@l=tA躘Ic 3$\-_ЭVnCMը5&Sfflef'K9#|֡/tcEi&ͬhK X3wnfVX<}IXzHy>ƳlH ; [LqND[1H5Fy o{JҎx ؾJŦId£+l)6M hR}L!3FKIZzD vӼB`BFuID!q\Eid/"ۑ"lyH@X8JrgBd#x;<.zD|_G (de#DQQ\kU]]]]KIZ 1~=l3h<tۻ#%$N ŀ*e8W8V|9o:T@'!|B"4qwC*HEL$O\Qbk-N~ϡCv#%Y2NvH)f0>Zk<ϣ&˲Q<˲93 ~G#f}}}dB׿}Cߒz+___(%}Apg1nrř÷(H{&`Jme!d*UÉz4GS4#!QVNPƱhKp|9V(GYrِ3| 6>I|XE#yA[SM"iE#sIqa xF)-</0s{Ȧd$Ed<ܸjb`Oq>tعTf(y ء Y>d-%}r$43u"#d-daD?o"s!R!ˀkjs-(r* vF먅CfQxyicU8NC2Q>. CLNL`yxKA-(&6ʓ@M/ݶz vv&_<ٔH~='.eL|l14?L2 E*>}i|jĶaVlGJpDBXhBI8nɄKН?>HFxD>jRN[1Bې^T)N(Ϭr(,5Iy=}!RJue!;NGմ e{"A:Fyw vWV0?9x*g<aY.* c3~߲LU8!{&CQE[Ef4~2(LK1VY;Gأ֩7:Tld=b:L(g@\2%K} (Рt 7q5iX1EqPy"$G+D#GQ`.4)k}c-d "[iD]X2<;WXO`cd0"D4O///8P98VJT ^"qQpHW$de!rۧ0)Cm/;BFʷ!qѼ&D,P֌Rn)F[DbZ :5F g'#E cRл|7UbG$OE΋(s-U )]GK2Cb$'$m߽- 3?!mx2&1HpF`FJiLaU\nP9x_o >҆KȖ)+栋J#E߷ $AҮ /`0`cccGF:W^y%ffI`cc}c0DI2LL| Gc)/n:^`*,%kg{-}`З 5=dB";ugGv^؄ Rb1=оdLIEZ-0=kE>Qəاkgy$ .[E+<^0'!p뢥ZaLX=iPpMBƿW0CYT< q.={&59!b:/^B5tde jN|;~gOZq}T2״'|ݫX*11˙ӆWqcT <" o9d6Xo]ʆs͙bstRrV~w P|::5o=J&3T{wA/"R<m$I"йjLנsEUv:&fFmq8Ӥxgu4 d8N5> #[q=b>N營U MnǣK>^=lo).f%F!` 582U9kpq3H\3s SR>_"x;-^Ǝ]td3 7pRʶGªnAD c%iAK^.f"HTQOG&]Rm Ƙ"8QRVZ[9!;puCRrFE,}<*(X>.Қz~\@:P6ʐH Sŗy.9h J"Fۣ|2rDd|̾l۶miNjh`1TozG`ys¾jEVP| ̶ Ld+JHILz dh7'AJrsc8qqQy#/X D{ʩz! mfXgr.T$I$/onn>||.)e!l-B첂 S(0,$J$nZˉ'pxk:[Jy_5A&'HƭIj54FɧjD4Mp&` (I&` [{wbK56P-MZ@hhk g69zq|M uH*>`Cv`]]8y͵T?B`q^v'Qb&"-٢ uMR'> $ 7ANFG&S *n5JȔ#[OkɛGa1j:Yfakr:x@ǛԚh`&S.J.8I>1qFI5}1-Qi\en,+٨Mqaw>{^1#DQ]$S|9'eaDlảst21^~k𰹌~rh0t+˟"p$,)zbj dq a Vgȩ'HF[ܥ=8N> tŢ`9okoˉgBPg9}vbgZ7p>ȊbuY8uO1^[::M3+oxo)rAI"Vh$=<ڄTHG%p_Q 2B/#3c `)DW!Ap|8SK ]XC) {tIe)n?K=SSU}Ra\c4! :4dȸ II( #IHƕ ϕDGz!A2TZEf4|lv%ˏ[cͅ"8lQXG Jξi $S%!Q#.PD2?Jл0"I*T:gD)$v;d|t)Uq q.TyG:ߏkz Wd١rͷ0PG2)PR4:J_ Q*O'Քi rEAPK[m7[IRN8G>N>-9=jJBRZjF#J1yιsy~W~fsp x_?In8 o7.=z(VkDd'L0|ͫ &` $~ח2X,뗵B(>lp``8Yf&LsLn w=-]E^3uU[J2Beo6&UTS V8E ]` }-ݽG^@csX ypO u}@A wtudE2+l"L=$ ~}(~(Oks ]#X I9=A7Q >LhpLŠwT lTylu\ 92\̈uGY 2yD$"lHmt"[sN AEuiU%2T(ӼPHa PArɫO24-$Y$ \'ói*h堝apXzD ۪Ɣ$%* F-1H~KiMla~~ 5"~mEHm0&XdlA99y F)qr!k=RRQ_'[o1T$E!IϻJ**?y$~(BJ뺣 vuG϶" 7|3n ؿ?=y>"NchZ IIcx;T"$>_S~]LZHy 23ohڻwHE2!H&` .ƻvL0bB|xp-/-eYCgvY2[?sZ.lL[1P! \x+3GP~ r쌋Wt,j"}\XMT|tp,t a32%3 ΋bpԥ~u BQ(['"ِ('k "R`xխLQ1(>l eB]3bS2pP"FڜJg@bqmZ H.8I5"+ XMӡX992R|`<\RDN^ B9B;.%)pAz0Sa1 ?rkg0*'}w(w}i?8FDŲ*[BE.yOpQ?ʀ}+9t?s>jQgY!e'yŭ$Qĸt C[ [S=O*lb*96MpBʚnI[.OIkpDvw "qRtAmS)=dfPyot ņE+q!0Tr=n5nɎ\]RH)2nULEQS CGJ$v>e c$ضz[JQ.BA_&*3)oGɕ"!TQ"rYe2n5)ƶɌ?_P|5U) qIbV  SHaFF.QYؠ$XTc3Q(I" *e?1JjF"2"[ ")C rJ1 p\/y$bu5>Gѣ#D)rD@U2nzhGDf(#ey$OH>=n _w &&` &囐$4Xf|`q,ǸUYzUD<@*ֽˤpuԩѝm@Bl`jX]6ӾE:ه 3Eia`I\E= eT5+xY0D'6o"ǟ?TEaLSscb[!LgP&'3VdB!ImBI bBZ@(ayIQV>0ϲ٘S_WRd(̼RburO1$'|:N5p mi@Ol)@`h CN%vBA QGf{0P(ӥhګ9uZR=p`8-|,;+zt=c@`׿1=14-N̮/rp/z1h\R2G-*/ePl=OW R6=l H & IDAT6Z(k=ŕ&,Y>̰Tun5!:Bi-5RN5{-Lc,:JIe=K-Z"OR*g\+LՒW!S,&.8u%[40*,19,/³)}<:4،a*pv&[ +dqxo #IaE ~qǡ%} ZA$ҭϞ%S>mw98g+^ vt6Sf@:hgs- []B*H ;G2RK8@$XvQ4&m PЖSdBq9'2b9qR09V v?v#4DWOh!ɓUC@(|r㣫( k`nTD┈Y9z,]q&F/8Ku%׊`SbX^ ~u#4o9ԃ d@z sK]9bPu RϞx֍S8ř56"v<6`өss:kryVRe6 “ ɱs)*u`sj9ilHڛ u{Fzm\H9t$s:.Ͼ|Q%"G V T ')Hrْ iI7vۢk8-U$d sd8O"#) PQ1?EWXyA)|+.vgd Dv.I9֌ױC(댔,^ט]xma5ZfisT7J"4F &[40%6iE.UD0@~*jG`{B&`K1&8~ o"(I\̘j? rĪBYk^j'c  wRŕaG pq4͑^A m}EzDNHϩS5J_Tp_ MBQGE DZ K)}`=cQe^ox}݇ysI%I٪*Atv&Q8`eee?3?wwͫ^* gg_kr`w?#^ /EMΜ9U_ۿ?Z#|w3??$H.M N0_ϛ(I&`a;o`mO} ]J 2d0:Z7t׀`ᠠ?x~^e_jXϥ:g=NQ4R񺛜lZm7fp1[a#8)A4-;+89ug`uv/)PƠ0%N{\ÃxYƣ  }U2DX̰Xұ2%r+k c&d:-Z1{ܺ\=κ"WXT8OOjd>Z0%73*'A&!q OX s,3kϑ+)6P}fX/2B^mCEh`EO+EÂJÉ(֘Xg/Ϳf|*K$CVN$xb4m_ٱJ#-T#FnOk LL`cG90 1R"*Q4)@zx8R#Ut 5 rOx>BG5i >JDMlOi7>H D_gqKƔ$zW&!Gq9~8PmaxlY$ D*ʈ8(?VVVx{ߋ`uI^Q@Q[0fH'q =aՠU VѰHMPx-~?v'iA*}B ۓyWb#BGI9, kld [=(u'ShE4 vѱaO5׭QgIqȩ14 GV5l:1J|@OUYM<=CzEIs&*t lxs+mo~-s-)dNe֜C)z3Al9$.^ֶ|{#_or;di.y_`}2 ?Ro|wWinFI>}??կ~5x;_ow5OO/׿l[I`G΄ ` .&` &xn&$l°RmRH%SP#Kk)0?{o%Uy~K.U}.@lB MkN֌Ox<==>cʵn|?YIQ=QW$I$eSl'ICܫy-Kkl:.cp[P9WvhUK*~ YZ` IQO^'5I=cjb5IMjR?I=TT/pN2~ٝ+ZsU`۫E88;r$9tNì:q Zuz'@Y=(M.ҽ?0}#wk΀ z/߅t0{hV{:Dc4ӲKHAk 7b}#BCeH[D0*.!X-Ig=.VJvv0LFގ}2br, 9"e-l+ł[aݵޏ i"מƉLdU1Kh=985+Qޚ@9J=#g|A2yq} ,)o.'.F8Km|,}vƬcRA'-ﶜ/J5Py8to^NXbjb0;O{{gijMe{k HxiɔYPZO:M2 +&KT,9IbY 0̀DtfOXG2s/ٰ Xg ; ƐaZ퍑# ؅|e.YbSp&;my۵'_Y\ =;x2!gj{8Iڂݕ$![ʐv\nvۮvTYi%Ն&c :m!'D*GhAmeX !G- 20L$D"?}o'#~[@xIcAZK`rB\#B!5 FU «/*HEٺ]sJ$ @54[]pAXtP`@n@PHL(υ#E1l4-0ɐ}ď" &uzt|U$qFVs WoˀL* 9He2m '"H*-gG !2ITjsV.pZe@+i`!')4)?'#e2tJCB:u@GYYkEib9oj9"MS49ERm$t:s IDATޮ ?Pd1iJ^ַ˿|JE>Op 7˿z'RFk-nmaG>-oy˓F1y Ԥ&#]%ɤ&5IjB{7KJBa-Al:$% S99g@{dI=sv:@֘k6WDwSK<"ZD lok4 ԑ!ӂ(`s92 u V`eu|`!gNp9H]H"4XC[2 4dU9:]z&(,9\B"%6*} En5k,N( X6sgV bqyYYv^HNE2]qW=CZ˟E4ӺB.Ny(Pt߸rH,~ Dq7<^K'׃s~ol0P *W8|f[&A\D3LoI?S*XABLu0';ĶŐ!1JZ%2BU:m:*ZZ.=42av\̀BQ²0KKlnpZp@\DŽd #\#6f[:WׄCp%F}A$K vFܱi0Kx2-䋷|~#¤qwRrWNz$M6dnk'fZȖq_] 2«Cik`Z !51 D t=-ƌ,nnm^YϾi,x%Ih3>ͻ\*U eDeUفjUu{Ay[dyܥ_9@% m d` œ8LhF=ry%Bbd GBQB"D _I5MV8sl*C 7ϐ"g:W=޿qdJYQeAVcHLnHTf0V15\ UAP')NxU|}w'$1FQ$$j59u #S˼]HEJD*"2s2(ƈI2ΈP1q$UE`0FT더&;[ReWe(ۈ*Z +++xlllPըsQGJɯ>c7^bh$1n=^jfM7ć>C>Or||˺GW)~]ݞh]qdRԏ|$nr'5I==ozQ?u]ZkuJp,K,".]NvMY=&P}@̏/3.*}I(8q:iR-YV3F9B P$pp`}+ $G:w̺R,u,1^| sJ `iqog/_wtiR] @kノmv eV!C^DS CQc*f]w 2Ȳ@P{p2hӄ6a(cXHTLdMƌXcZ(-6huN!I* e z~Lۮ7A RgDA83ƭi=O{b"'fi 6F|#H5 U$gny}[OٽI2xG"0q\RT(rrJr͏|jR[k!B 6%j4F <^]W{MGDUUI^oWX$1(Ndc|IPfĔj1n]5m#KƇ9$* =,}߄qQ1 k%)6`P)v[APl)+ƎMEd$Ğpȉ` w܍D[R"هOFOf`ɈIh'p'lE%AD0lsd@m b+!FD?SPEZ%tPL ٢#ڬ1Klr֓$u;`lR8I2ڈTGv[OO-O2Ishw%H*bm'0*2"RvUv[eVf,X[[ C6$ COpY__geee6UIRell/𒗼zNo|Ho JT8G=r^H$y_{^}_U]tE I2IMGIMjR3nʁثJU& q ĥޚ+JIWˆ;?^6 d0 `x")Hց<|qg@5.ՆOc/S,LQrտ*4m]?ںqv%ØvJ2bT08Tr',?Dg0Bq|58S-nt aIY \FZ6ΑMO𧜴nZ~fW N)M"jxAb_-]ɝ$x*-IY"26dv^^8hTΑu#h 0Q¦4e CdFQuYR=.2#h. c05聵"g[ah1i~36 Zקb5i@`u^5j`Fł^CLӈLfNrH{YK>@`v,?g3? spܵ0fAw+a=?3=dV* | $^MR)HݎJ+"Ki+d'޺^2"X2P C(pB`ܖK1jn+`l G%)I1(c ODV͗`iu ϫV]WZ7춤x$:)Pr.s=FxBj RϜw/{pd1fݕ )gwwO5{5pm=kx8f6IMjRԤ&5ﻌ1'P( ε16)vV0б>5NBeu~\9 n C݄:kdnpբ3ϡfrrXC'C *29q~$d3~R50h 6/MbV :s\C2tp6vי!v)bYit@TEh13ua$ΖR@P`.E3:Isq~)^Hؤס' P%v *&Fq)/ YĽ gJhlO>pO(pӛ1%~7afT" vC')_fngD$d6 yq̦i#(a}Y6<BVH- E}i(r]Lxң͝,E5A `oDzHW0D%IE)ְR14]D68^V̼=K-Α@fB:}bac>Q` ll%!9+_'bOɀ">ߥ6g_ 9,3*s|'J[J3zl[aUݕ$Mco|l;[ʗ!" E̖Ub6?nVčIl. ׾&.Q}-*&(}1x++Uda*Jo̶qcgI R;F\$.Q3 l,qFrKyHů|6•(F)C syٍ @v) ,v[geH)GDI~T%N"c|y֜>}x#Z+A2#v뭷WV5׽u4Mx۱'~nƮ˖Rl6GUzxK_-cdgNZ2F(o|%|;UWbd%'Oy{wuV5IMjcRԤ&( 0'p40gxv @ԾY|4`|f;tHgр@^r+:Nz *VY! @5fx`?C[0rՎ$M\ 1-nm 9N5ظtZګhC-z)= ?B$u6 ,c84߁!l6͢ {u<]j<[(P \2 5A.dPTNS r|Ѫm")!jro^A 7ȚQ c d9L|O\+Bn/}c9 zJOW"ka\ug):}}rP0+}6"*"43$?0 &^1cjFh/Y2z`с\0p1A" 3?"uk4,{+ZBDAΆBd$Ep \j֋):Cbysja s V)NiV<3hM>%^{)(db>M4IXI‹&/n'I ];p$bcrfDZ(kػ?}Oߛ<%gњ}v>G\gDzS,*`xk;I0O !8!qg)uC@"=Q!s-a9!Ev;Rvy H)#@|*UNUv'IRBNdFl?u]GnV1555 y.ǽ}˽ZJTs*W9_E88uFZG>ڼ/"xR Z_p,,,LnSԤ~dj$Ԥ&5v fck=6iXēUȏ#e8y@ 3F+b8>ĝ~x 0|qڿ|LV< i˷|; >\V:LtDKzuK@y BxW?iiE'$2FYK<*<mxUΔv R #Nfl/yk. ̩50ERryɷ(6_Bq<:b- W> L #aY`]q{6v٨.^,Sn?Z.a`F&-θ=L7yaG9tAr-1#٥|)?I_L"'8Wk{AotßA9 ' ˼}\d2 Ys$IF8 Ee~2(kp/ֿrKDj&#t2L6Nѷ5dUϲ)f Pp!C~y䄡!1HD kh{?T2o ^ 0(H{B-DEw~ IDAT?KڴXFyϣW>)wķڞ%O( >Խ-=4 'էΌ_Ssy&+I vK^6~vtAw~fv7Eyx [Ie=ud6+RD +J  JEF>C@(gL{`TGJYXma}D#P+|]Ni8"qOba,;ʼn출=0L(BM뀠 \I'FIY#)VHQ#cڇ[ﱂ2 tP "o͕X$ Vy$dTc/2hPLd۔$㤕s[$Ium\r$w_f0u SCOSYJRLx'7Do^dQFʢnkB+j }0BTQ"}`N%Iy-*hA”b:IhS*m$)[B-%R'E!)fk{"'+˪nF1" 1jQET$ F6[#HxUIE})I叫Fz";*u>$:w vg>_O%H*ULo=GMr%$H-f\Qep윾RI)9~8F0 Zc~7׼5>|x1x ꪫv]_>!I&5I[%ɤ&5_MH'V+%IrK:*yA9\=/fpYADBk+3HBkYۄܐx/ dG'O(J¯B@E/bR@C MP@bqJY`/=R,@ Hd b& YЧP%#MDES `%<SbP@: s2]l%-;pRZ֙Ejϣ׸p廨$AB  VwEI?eꘁGTXx5]oRȾ7o ڃu~=\|4.Q7d_r| ¿-ų41۟_b.Ӣ \FJVZ)tD*08x"1|^?hz)$qM#=he.%*R ː2lw",Nsır@b[|J7hK0v{OO|hwc_)} }=]'HVhZ)Uۤ"XV jn=aDh:ŭ>złR,PyAL Rx p4ň$]=ICTmhW$$.(#$^ŐTE uDD6Iy0] ^ꉡf)- DHe}G.6HoU֣L#ը\IpSJQ8^]EF C JDXF]12޶)IvmQx%8IR<_bAtFcWHUDrȜWS+@YI%)!J\_$wq$XGX$SC4c b\J\PVӐ2GdDÔ=i̼j R,+KO2cWH^69gMMP=BM)QMzAԬbO G7IdLs4[{8Þ A8ݑ8m 0`f[KX΀tee.Gi_隀!\o~~ ϐ<]xTWꋯ|hkcuꎩ=1c;S@7plj}~yB䯕M Rԋ@(ܨSfyJ!HS;A2^ޗ7W'J_1ݲj+ #S!HTPpR\8No ɁooXڬ˕[[J{h[po~m 0HA`8MV7Ih7bIX@H$ܡaƴlY@,kxNgaǮ:y>Id Zvsj{Wڿo}_ ,/TBrY%ƕmrw)5b J*MFH._"Z撁?CxHg Ű!v+$RxPF sZXFd7/H=hk0$3A!IDt/uJ:TjȲlWJmcTJj7&I5<oshphgT1I_OJ9dk(`ɝwIWMuƎs->]vw2s&F>l6 W=雾iާWzaرc;v.<w$&1S$*Mb$r<6 ^s0< G7jwZ-Z, ,`$2BޠY_.Y󉽸|{WZ|g:FhMnA{M5E(=jh@Tt >O"G-P?x5QBφf>"T>MB"tؚfeZٓPXId^N4^si`h(f%ə@LKHE(H&ǻ$ABL_M',$B1Li3ݻPÜl5<-!,M4ϐH4E}47Fr .Xn[b;M9V(?]qװyF]O$2H Q=-wӤOX"Ybiy\œBMFR8$&iE249X"I tF7jEc~LGOw>z8FjBiXW\ea,zm(IfIl{Y.0%_zN'߲đL*$^8}-(chr+2SJDK\^_n J^/u%$)X ~3K]~[Gװ]~fƌƙ$¨_^e%kalYg%@,K/(x)g<=M6cn{Ѓ}<e^(ΓJ>+B{i!PR2I t9 v>J_ !|r~-7l_NVc dcԗἓĕt#i- "p(Mk76Tl |ZIh᱑Ζ !(9u@ȼOݷ}]%*!HX`GIC(Qx9.i=Sq (ϣ`k= "-"ph%Rأ9$dA $Ry鯆`e"y@nE@j {1I^(8h-Ƙ+V%]UHϕyv`0}XpkcI5.ٍu $ٍMRX꿏WvnՁ+fֲe_U87cx{޳׿DQA|$*f;~847$&1RI{y~)nΓK5& _%Az7>9{d,:F$ 64z 6$| (b IfI&!>a޻$meEph]] $ dHl"ᐁe dd19^fwR%o))XZ h1siva' R#cWY< wKh[\~\DXG'$gCd ^bN5vV ߼M Q\{bs5/˸ 3~ؓ[x ?z7]'}9n\7irc@r>Ĺ)C?ӖD4Yfkyp/\hcZdH`3Kb07 R*9 Њ 5f蒪25 @hG2!MA!`(e [.&OX|㗯)lO0ĵ = C<GhltGo8$ ㈱'y[8O .p3+ 1,)_\)itl 0635IFX-DK~yI3Iv{gy<G 2vK.yA"ZKU E"۶1$i4DQ44sWlqvE3 *; $ͫ$ǁ(Z}Mvby>lNQRVu1Z_!oVnf!^׿Q'r<8#/Ȥ:pg4Xcsϲ7=k~s?/!q<-$丙[3<C&  * ""Ҙ<M* _h%1' $UjYHba~~ DJICPWJ$D|P%+j;my\nLQSoN쑺73gql6f9%貓\Y]z7  ?;$W|1s0oYZZ$q$&1|LTۍ$&1a|1cEzlOr jɻ)X)L5J@SgrM ˳p~3LʄYRKTFҸݕU闒Z LM~s}0ð@t[OIցr|撯~&?RsR׃0^]eL(_fyeMgLD k IDATx@N׎& I& 'P{PĆH:=zZ/qR)=C#m/$7d6{Ο7{L4;ZN:}uYDط&AN_g(B1}y)~#o¶JI2"<{{7mOu] ث,sqF{h )ka?ܞ=,uk,Vei )2C;!}v-=Iw!H0Ts8HicJlqyOffPB PIY2srv9C*"p#q8I+$8JY;8iⴠP# b#ZEí ,I`ia\#^l%+^\S>|^LڙUQ1& $;cْQ1u+?p%[d'Hz,_ xczФ$yW?ءg]N@R1I޶J+; 'y ^(Y}]-y;%9^7<nװ]K⽓"))9ŐQVcHk VO,&UյF*X9<%x&e iWɏP DEea!AP>RR(Ea:"ӡ J'x*q m KpN,o-[#* Q.<]^x:IvJי$\NP6Yk%EQ\,--q+$~f9Kvo*V 16ڍ=R_~'Y8h0pa8P8n5MMMh4X%YE6d\lZs2Hv!w>I 2HglF|.]|{e葲Y.Jh=Ah_vrdTqo!I_7_{K^~EpR O"q-o8@w"[YέKO`0VAoc6cjqCb;C֟=nN+%t.f>pŅDlY0N#O ^#?L!%ws6h<>Kc=gse-iy}s wlp3ϠE-ւ,tCڼȖ&!)\Lӥ<>w iC>E$27^$Ki3 v=69CdZB Lm̹dO/L;G]ļwV^iڛױi77Yo' =zWMH%`aJ0Mhpo>סhLVr}^YrVk o^Wb "\gv6"}1IUY~۞bz+K'$L]zj܄vS>}{[كW$$b F11I*DERgT;ɆQoB:DX$y1s(W&ID b9mq Q='`ܽ B(:qWs`(MeTv"#4E<+R }֍@r^b0liNoGuKEa=HSU7<@ m/x O, EQ(l.4^c&+n_OQ* /= !P9%ooWxID /KfKSܗRe* d9Z" 1M_h^{&0$m$wVo?(XZZ${mcTR6Pds%뫾}.(+PN_ؾRH1 ~ QJESSSCMBJIy>JꬒQr5@??G?QR4 8h 8_* 0I&1I|7}kRLJ#lv> p ncA/9AWs"yEUOWԿDs[DSlلM"OG~z31bZdb2bV^fQN $:z,IdY}!a|_w4U>Su-.oy[<`t=H^7nS[lqg=ƹӿ>cD9'Y(l^wS_?Zث׈^l.@X6W M,H)fy*gƍXغ@J)4Ic'iLهPV .%(>k8N$3Z$/zٳ49x"߿|7!ȃ.qM|Cb:n48ϐР}iHWOֲ45,dL%`&K&Ô'0+1?k'n֊GCO?,/KyHiV"ǕI\N{TO/'bg6"F#p1펚ɸVIkG5U$"wH$ŒC>$.%ƶl&) :ZxHREN0@QRJ$D^3' ~3!$Jb3o:lA@&Kޏ:d (W Ieu.UkA$NySRFΒf3gq`~$8K-*1 Z_PfeL&!&}ۤhaDN(2_J*}g tcv7j{yvPd 0 v ӐȦdMT[`7jqA4> X]](A ىA\c/B)E$v]#幎n'RJ C>(h\x<χǡ5 `djj8G60c p(c'yjvm@zGS"uh 7>34Cl"5IL%/v|>7/V$&J}c(x=<IҬ%d3IM LuqÿN>qxON{ \q%$nY{RF=v8 BwY =zʀ̆ˤ-=S =|߾#RηE"y_FO[Dߣ?as]y@y{Y?'?![`ful*x45_:Lpf*ةO_s` )@$鶹)7a%ӊA?$l[)(0y $[E+=$!kb vWOQHBH[A3ߎHE=MvڴÄK=okcq5E1Y݄}s$QְBmIia3G=͠1q ͕cxz'w$͏F>9f^1IHV4WBX:x~bvjSe^+ehIbFyvV*Ay_o=yi'aϞ(I2-uuI%p B񋟺OAǣ?wo8 q1>*Ct`j(UU)Fh4"@;C|"?uQ+s@CDS{i-:ޛ t'A Ka$_;3;ټ'48PGr[C%zP r_W%l Cv#5 IӤKSޛEIFD:|w '}!tb@lDMDT$6#9uTq>i:d%)!a\VdZh48wܐHdYF$CI:@IxMbIV¸N}c ܨ[qܐpç?iΝ;7U4M DQ4dԧ]u( fW2x"|CR{Hnسg ^=sd$^j1aLKD$&q$_ܸ,t&x2|;rn, .O;e|rhV^=|-`CH"ӠoBߟ-}G]Bs0AlD .eNg,V@Xm]%9.aibod_jq}xq@fF"Lwn,%rD,I_؊&}"Fz?,\<=Mb 1,KU1 (HW% ?y84p$};wƜ }S7zM5o?M7Oof!Sw $E ZpCuև0s#VY?pzL+9~ 4^N5sn?!GY׻O  Ym,cN%zsAIYUB"B |Eu%3aE%I9!uN'W%.YϲVrь%ήn?˘AI0]QKo3GGp>L;,+~ÖtN0ID]r&$3J*P=IƁjL8`Ry*Cwu>W~" $d3R]ϲ{uxAv!PR%ik;>[O¿-,QmKUf/uARj5nWS߹3VI&1aLh_Xܿ1JM3hb7KhBgOǥ]&gBU6` P,Dkd3Fd)Õa\f>$ц߷0ڳ6enRnS|1l'-}P!,$}i'; \WZH, _c5~f@Fn)])4# dz?g㡕L~ qͧw Y#DJ{wt"~ G!Hg1Sojc-|KzqɢĈ)ŀPd%xc LH<`*pfdEĦ!RT+!BBhsPEZv$@7`lgo2&Iw,ϰEt˂ H%:blN)X+Hm|9B=DΞ,be٘. jymz_iw7r4z??K]*TnIR$)#+j]&GƧqHvWi{}=_ݨ`8ox}+c2$G}<(H6|K,SF_kRhE('k _y# eN.=Ȑ\D6'FpHiQ@ J6e{4Pe:G1</2bOW6U^-Ael!!0\1;ցe 5hklNdSdL'[q:7Uo+$JIK ȇ ɶ$!7>~j $3U(@ C/Ԭ3p{ ' Ωx3I+0tɵlvTۭ$uiLjj$}[,F !zok'd':eiR}PR}h4`Y!RJafvvv(U-vi4Z yN$t:vXZI=vHo=zt^lnn=pβ`@ǴZ- | vmCe$1aL_I|5DŽI{n}LFULpϳ=x&+ mF@HZ\serF/͵P:!$6"e֠=eK12r70= ݗ$dLA%+dmVljUjP1J(*%/3}T6`b8T,E,-{aGH]3{#A8G`v-#c]tR nt<˸,qd( `Wd'pZKC`0`uuoqNTWU xj1jSFw˝$WgI$ojWP1v `fffTc@®!%;$itt:i:dh,={` vHbee_qwniZ;p9~gy^>0$&1ILb$H IDAT=&36޴> OdUwҋ$'n-@aPKk2|/>%L\2Jrh/YMEi^AAg:& e}L{'Bgi4}ib3`7x+sedJ|s:'`zˁVnS7f|][ k5-׭iV.E.⣜{OA\暀&g_Do{~/远C;ZYҸ%8uG>{!0`y@foW@>#|ה Kd9Nc|Ϗ'ē- TPoُ)~ewc*5aa_v[0,TGqԟw1 >3HmR]dp` o]ëO%iX$N@̳\ǡSҞ頢@ >v K{H50}cI.ԙ&=r7V ANbcNo=Oqыg-ź?\FJuOJVI&$WI/eK$YH*p$%3FIcow0KTN=R#VO^b,^jTm믿զz*֥rT>$|r9>Sim={X$[X$%H" P9NzE|'{qv@(L)B 5N L?Jy4Q/X5Av?}4쀈H2Ck/%n/W2ImgK,Xod΢(̷݊`?qi-xp$sB!I h>GΌg`@7$heO 92OnWY4VJo,$N 0柩dxEKNN+(v(ud7( 8&x=WI,Y uߎAy1qh&$&1SK>&N_M HӀe/ 90g~B~`Zko{MYZgS[__s ,=W݀n|=F8GtN[' ޼Cwgdsj6fV@ pqn>dEA6-i 2uNc.acyj+%fh}p/vM>M*Ciř̦ G*f-l͠q<ʹb{eX~H;I81u\P8 q6@L3 nkD )!m-h>-ovol 'g։޽whǟ~Q+/D+ׂՈQmch%~\uR_.xaXںu9 /[8C6_]U Ӳ_*"auU*&MQ.3.]V}FH3VdjQXTrx]ƒ(bEPh)B sACF;d\h1]lHʃ RǪ>u`WA)Y嶆_ "IZ+'¡s agE0&(  HS T8;bpFx-gʃ5ZR[Λ}?͎bXl4je7 :: dN/Gaep}V NI5@yTNc;5Ƙa.;["b6[%:Aw#h!iC{dO}r-nfCu`$xmx)0n݅vꁛ*i{~{Cۛf_|Rg'=C%;a}U[o]pΖ`O5XEGSlJC#1LU8!)X..gf31*^ַ}lþEEi`pĶ\1Ս!08}_¡>y}|- c9z=Gn3EUR~V萉:|EL?ε[X@HC,*v Cw*F `t){T8so|*nyKiHm3,MFDl%Һ6ET"!ti $"qrQYIΟ覄sd?EMd.࢙#xig3r[Q"|NS/j;Ml_TO}*iCT(T@7JvJ;] }We$IJz+{>% #`ےFY6%{v3yS$/UT ~px!=?\ - RY86| (zpU -?txT$HvI OWSB]OnQuVJ5U3HfJ;E=z\e=Lou_Z?4ge*:^*W2(Ǎ`uVfiM.ZiE(%qxY$y CPH`,kB0R~$BlWr\MFp?`94_q88IGm•$ɑ:5ɩ  FԽ՗&s黺ozХNYfKK` Ax f_l> %"hB ɬ܏uH]m5z 5- DnH 8xM6WyBn?G8IJ~m@zD-K4; s2!C9x\mE;YHbd@ѝ W/3l\o{iM`EiLvM]l T3ݿD8s)wdJMk^Jd}%S*I 7K"!&9ךl cnѲ3e؈U دH,$H^]/g~ [z$B[=224%l4&\b#%}B,,CIL2?f"5AN$qdl $_s<1&rl!u9 9Рl{ۂԲ2!\U LzoI0i]pJdZm({MRhd/Q$H+%>|0ŋLAmFf|$ S`~&AbYЇ?^]ꪨ$*VqxaN*`||uin"O*D:k#5lgo> ȯ`\{fQɎT8FH?-BpgB#rе!r6V!Inm}H[Rz""BҤi7Q鵴W-}{ sq~v]رW`C 5d9CXZF)D{K}'> 7(=Hb 7;RIW _H'2_%30u綹gFNBBl@O|XTogEA*mY{2WGsd F'kiƋ'8rIqJz͗jDo98?d F9ܽıK\o`j#b?M<7I,,vH!5;d'wi {ěZ/Gimg8iIfl2o/=Xˆ5z8ܾ",6 ,2q0gټAj5Z | W7 4e/ V_{M-JXItMEaY}4Яן@`1P_T4S[F<~I`*zv^ؽl iFn/p-*˵ޥ$)f|?"$!J_֘)`'Y^V;c ƇVg(oK|߉ѧMc}*Iq4續dϴg`|>O<"u6YV*1':,>.RבʎL ,iƮIcYE ,&jKM^SoYx-Y0mif^FdimQZP 1T$e:M%mR$K4ipyN86uI4WfL#J8fmmmei>jO2(*_&sI$|]^i2o|e'SepnӇzy6^/_Wn}*x=E$*N]݊~5b帚+` p|ܩ+H rt*E @yXQ)X~(yh|ViTa^j`nZX 05pg>.a)~M*N:dRLAbm),O#&If >YG]p{؄lFb6Y(=QĬl+!J5ɜ8: v$dE W:Pq tak~x*|Ǔ؁`!N|ӈ;ˈ*o~vRK[#DK3Di¡|"qaisX$J<{̀k|ẞ%=UhIBɖNbGшZ4 fԧ!dіh:ر[J Tpdݯ4bu$0WT[[[<ض+7I_$͋j rAש1ɗ}</g+J5F"K denx t E$I)Rz5`Cn*`f|B|\Mi#JY+`<=*dv %G25 jiVJz^ڰق*,i26ו#YQ?*U VTz/mȻ$W 5+52쎠k]Z.K!:Fh'" llEؖ\(R^-x(0d4 }.5t'Q#54bжրpe Lp$IG 0'b4=`ʤ~ U֋mez(*Imۜ:u~?Q?ϩSH4'K4S Itf1333pH}[rpZ~eQy; )%D{L;:ݔ&!KQTT 䓮^ѣGx'^l4h4&in:~jtv.<(HR_cG "݁^ñ6ΞH6WS>PkUuD"V U|*6"z{4R2r cgS{)w"YG8,EAD'nJ66``Nr\nn@}4$0 Cgvp7a&Wn=6K2iH/Aopg ,w?Txiogm1*~#J|Rl^ Npqt1A?hcwrlEw:+,+ $ ebNGߚ˧o5 $Y(HFFjt [S>uI.J},|Vms3'  b&X%uInl9:RkdhTip αH$ڿeAmըǼId&_~d|rr$WxHI\  Ѹ>)l ͑$e cԔT5wIҏmGܓS6댶[ :NWaO$IQT2q('te!50^(d}/^RLYlZ- jw}=;wӧOez˲JU$Q$Zhdgg(,}:V+'Jʈi%ܘS,+W?fI$d)oګb2#9s8'ַmfr̙3GVkh2<A~jYo۱m~hyy$UTQ-t[UTQEߡHo=V<>iΧ@@8T H"\ԝz( @ZuhYKH%T Jm6JeCBGrP8jkp7yIÍ`RyHH̑j-B0ԒXL#9ߙ2b!O!>YU& 55\NF2)G/E4A;R2Zg憪=怣RA݁߀oSDq󿗰7:?قͨFfHeve?`J-"XOT8i^>ha <(k3?ŕ}Xp^Ɓ:POJ$/kA3KI tg2| {MJN:clWSCuwԃ2J/YD¥3"!kw}ǟx ^,.=%X!w˴i,o< NsRl!j~z4Oz!u`lF'~MmO uF=|cn-W$p.%U}cԺxr,G`y".9]lrym#dx] o$i`7e\ג$nIk^IWL =r~Z*0 /ne*ԠK8x`i]MCw8/ٺ{サEsq̙/~JAǷvo-#I0 ussubHj5zN2$]yJ;q(r$"$ 4`*ILEǝwIlooO$0 ',I(ʉD}ӹ&t{8f*xE5\*;Ij 󗁺L@*Lv5w?('i[iU b$IhA #H}#2 +L59l]}Ap7m]'[A _BUJUoRjٞR/g*f0#ȄEfiA uHSR#82bQ(vQCֲpReT)CۑJ^(=wNG=$YŜgxq$wd݂gbi9䝿et~_ Ο9ɀ:A $#yDB}tT`tr o5]AuI$ |YJb2M4>MQR{Y[&)e!m1=y'<%ޔz.aѓYi15 }vN"E ܂ n'IW"ܲŤWZ|!d6 t![YU|)01 Î+<&TBhPYү[$Eʼ5n?m>-`.˶ד k_#cKb9f}t]ZIb#d4UU~m J4h$ q  = ten$Ievv6/g0fEz}"q۠LAb({XL$Iъ!ǎc0ϿvA0@|[h4峣$:N>1&ڥlIkH'NH*$Iu}b%WI_T ZI%](A +s\o!ɔ<5HM8,}U=  $_6zIm @v xN.[]*o>ДiR,#+CNϫ;z6ؙrMR.}&'UV)`!mg`=M>bYd+ 6$N)4`R`;O6ܫ|[ǞoG~P't9@؆><zYÅ@huw/ (Z-2X ر#Odrc>pQ*yHYɤٽm I 5𼬻(L{F1؛l7Xr 5:)>>6: !{ dfhECm奃+pX>trI@jFhIęݓ,ި=ǥQXhrW+e}A ^gɈ!Թ'Oc#f-M&@MW\LwMQc` 4Te+bȈfdy/x)Ӊi>z2 5qW׿UܟG5 0aJY4ן*4PS]?Du'L*T̹ml؃E׶eJGۑ*Pv#YyYc&綟d zk!,uqmNf NReA(IAƵZm0V-[`~.>*9taI}5n_߅ϝ;G9 QFETdY{P4[Zjzǹs8uT8q"7F D/$3(bggqVAF#\Sz= uҲoF}Nt³$t[ZIh4&RM.eҤwߝ1ш666Ȳ,?^GG~G\p ǥɭ0 i6ҴiIO>$.\o~i7*^OQ)I*S`xT+ƣKSXMA$J$ BHn_HȦLxc,LXmhd/7ەM3$4!HBUiL,KJ\1T $(#ЫIfGW5|M}e3& Hh9:@rUlFycYT% !tC\c}\?%}'ቯ#Ȼ H+|,C> B.3lm>0VuQH/)nCCOJOTk%B"De'd?9ُl"e;(҅]`C/VW;M"_Ex_JqF{,Z<I05yR!NiR ˜읐 ^8-ktl&qܻsm6{ gv /]oiZ^]X4n\a+emrFv^JPvC\ s W$b_鿿JpcǞ?;ǧ26ms`0 0Mm&"8& |I2a8dЄBȫ157qc3,حȡN:}?hdpn̶דVթH #>=RdZ/IOb,JUXdV˖d9 !G6dj=ݗ|=}PJ mbBܐm(ZۈкҥO )V5oM^СC9Aw JkPWZ;zvQJR@a(DQ4Al2n9jZR/ ɲ\=r!KH<p8,DFǹz$ rrHa813"0 A4AbzLb 3+̦$is`YN,..rUz9I!pb+:Sn}ӟz"MS}Yx;Ae9rd)˪*^]U|'VQE$y5_WsFC$ϳX ȽBp I"ڶI:j=ƠY( |C.K:<., wIP>{)5Ēv/e݀YBU'גk}E2's[UWO9laFp [%"TZp=P* FYz$r,R@\"K$ZPT.I .p'ӝad+'anV+ b#ǎܦT0/7Oz$偳W$HRm nGk3i d僸Ȓ `lC˒* 3n@җ*%-@ڧRd!*}FV4s]C=ԃ5A)OIdŌfU=j{8aLr}Xk6oBcj;f.W6G<w"& z]ҿqTO;.<,O$ǿw9˸SoŔVE@Ho* n-$E73= 1 5xQ& I4V 1UtI1Y([z?Te:Ib$1Mw䵃 ]Xq:3s2,)ǔ$z a1)& '}n*C&9AmO+XS&ɺCio9}L*xMyts6 z`Wv1jq\SYW3t"9>p$m0 (ʕ{V2իqM$YEe9a:*MS0… j5.\RJ4L8IMhgfff+HIJikC&JʞL;ϊ }fD]׈667*2nn$HsϡCx饗jyj5Ӏy V+_N)wPuuH!l2eEz)ٝL+}2 a,2cBdZ4"VҗU_WO %m*/%휪Δl 7|9ev)j3>\euZlѠH"I^r> "[:yO^AFO<Ö*ߚ=̿}\ץM?ZUoq8rqqA^8\N! M.^eY4MN>g6~F1Am2(v帮9I8q]˲rIE$&D~wvvp~`^4g/p1UKf5`$3fM#&I$q}L+As$I8qW\!0$jZަNx~=Y<ׯ_gffft_[[['~' }3*o4|IՉ$y%XJẂaE5w[]:% ݙU8L/Ղ~Ѻ9vC1KHE9z rP$  JeIloZ4j&R~ˑߵ/*|M݅Ҏj~֕b*D+Ŧld"G4ԑR4'*וetR;&,ͫ2ДB\W"Mֆ򻏼[BF1aJe +7|uN,u l _`^HHUe_4Tz7R=djy7-v2,)@0SI՝UdUl)C! ZMId݃S*'&؆ =m|>3jt :R-Xp#F,}", }:'.FѮe}E@޲,.h()S%r{aa(̧pHq?]Fq8NNɣ2D+L x}:4V4\U9AhI1Դez&ac?+$&IEGHy^NhBI$.˶mVVV&I ]ǣGNVc4lx IDAT"I:ш0 0_t:y y4GG'R:K`*o{o|RE/TU|aIdU'l?}2BQ_PWn&zWG[vT*;ݲ=WN-oh% ڽ3,;=}K||im#w+uZ6E3i"EEC=v{cKU?8*X_{`n ӕ8f{';MXQ"Ed*_e#K??[ISThCѭz6wʹ /<: {;[&[qIz>m%mSiJBeqܹ~p3jp9ؽ~666{5pB9aNZ U6EQ 7%HthL9Alnnm4Mlfyyy7ؤ~\12hLc~$<0(;0Wq$fyӔ$&Jlɲf.]ȑ#gnM3"WAMKSi:ayj rvs5| :M ` $+Ê*Q)I6 UTQ͢"Ix齎v`e XeE`*Q7C؎THd][+OFfHD?ɬZg$}Lpt_e`mK[D1vue>,LvOڟ"UhJJ,R +mnUlIؗ+[!9/IHh[Oo=Mi *đʰ^!åx >7j5YO2ÑtYZ,DGd;J];S>"0:'YVJG@[Bl̕%֜jg WH%uX1w"SjʫEjdYP} ͵!y?#Mͳy/ g) -=jPlYn@2mp!O•uo؏PxP l@tUHVϏk\Sq.P$F8VWol0}}0n*Sm&,_Pocf7IS#&A"`zr)Il3ThF{TIbzTST ,sbz$f&1(SvAq^>{6N=0=IFZUvO-#J=cJnbѨTWm>Ih3z kluWY,3_${Ʒkzl+̧G|D uYZZbmmmjeE!^qF}$ѓ&J牢f+(WJi`4g/ۚ H뗥R+SpuҦڨHL7ʖMB@{+SM/_h077GE9<F$I8C,,,)AIhEQш^M+f)҄V%*xDETͿ{.&gs$qm 8"c^L[q]gs5nT5$fei4Q$hbxT[g:ک$+">G|_Ia}ɲ'$eS3&2SQr&S%} NV0unMYƳ\٢NXMUŷDI=0HUΛ˦Dr|j=??ˤ|'E5IqLqzQ`+V}Wz}꽹K2JI$f;$$ELR(y.,S+tz,rHoN7:Vɑ(*i^=ZI.m3 *at݇WI]ר*Q)I^xX/wTZ- `uGʜHR@(NiG@(^1P_G ~*kBms} `6Q&HC Rղ~ݶT (vT%Y¬qEUKT }+HA#5bKA\QIi(Wİ<yjXm\zs\8$F2uم`I/c@N=8^e]>ǂ*kl@83JE P#W%A\W/Ŝ,DȴXoxG(5--,GTLVaON>d[Hn2V'`"*}{qYȔ /@ eEGEE= |EIr7Aas \F{2V՗1A쇶[~^YCLy)I &ȯAXb&L@rHXhuX0Vd(؅}) 6x'&Lx"jgρ\7& "v+H􅠨$1Ӣs(YI/ݭ&I]$Iy41_Ѽ}ZOmp/$C;oǗ#iceǙPxd5DYY>:XdXzzW*o?ZTzũrqj#:GҥKS링2`y0e^&vjI%YJZ6LP_N#eDͦ"EBhdZӔ$z^HhE#qo7Edzh{m9ɶm|Ͻ^E$z92rD$n汙ǨD4}jZ~>*^O]MS[o2cQrWQ_HW$F|  ~ .Gw^T'H 2B9B^ (Qh-1qAo^˷5/"%]^  Y$HpkT QRn%2U{ԍ܅$QEJaH5J%7%(=Xo $::d!amG-O0<GoZ]_ _%!j:PQI Olɺ<"Yu{u݀vƣi^"ؚ9}Y)Yg t8Rj)QE*c A\Q{!dJbFm$܆$ʴGlB2}MMfJ s/H5 e2R* @cC'dVu\m$>Yt'QhW$mF7y*{HPU: 8ew+)27o4\^"%0ɑG7>LOG5mNVv V i~$ Rk* 6P*+%}Y\ccyHmEʸFi^+ݖIL#Hu{(I{,<>Ӎۋ}VJ$L*I)(C]ەBd^"#!4;!ai(=J!9@ׂ~ ~0f`i4;#oZG}$G]TYۂs4k3b }[DC(mHdE ϓ@9|lY"Z?%I -[a1HAj#[EvJ2I~* U;:n1\w/.U]ͮnV7l^uzDJ$jZI3{~6``@ c^`ma€H;+G֍KZ}̸̬̬?'"d$'9}}<MߔJ]iSm `)!KUҫ5!jZ/2q)هQ-ڋ/}>|Kv^^x플i5--a(ug}HERduTqg>Μ93Y?cVWWY[[9 طo߻"HvSvNnB/]D@Yivy7fi=;=q[YȑY)HfK1[f\(ի3`۱q$3r QbZYn9r0 b&7_*w~%~&bؠVv\*>$I З]VYws⢬Ƀpܨz6N_ Ѕ0Nh'Vc2Vt; #U! Xj9@4n( iUa,wp C*;v/go@o0|Oш"P@=~H"61Ū" ج(dG9 gsׁ *p).Ӏ( #ϧ`^FXj,k*7U}i Ǵ{{YG&߷R*,R1@ڜy`2w'ڞ`j˒tt%$?"HbC|%b{5O&~0Y6Wb/F-k֏FM%W,ʕe& vW׹[~ `E\w2suIWyxN+I$ &[#k1簼 vLqv y7j`< <ϣjX^^ά `_DPt]Ξ= E { OuNdɭBgN$Sg{E\B^gqq1[hgH X^-$l1ʒÇs5.~^YeqW4'I!~?nMϟ϶cò*J%IYeU(s7MYNt=:FjՀc{Mh-(f~hX^*=CG~_D }o(Hr5pr+(4}n뾆oRh>$W|8nWۭU!N!4jKiq QڏB+"ůj !BǁAhu8¼bPAC<#8IpCTYσT0J︎paZGaẒ3XxsM64b3`4b]v`*̋t Μ,n̹j: !_~C>*ۨ:(D 8(aAsbu zθqQ㚂A9@1]Z(+n DÇT rMGH@Ӿ _AW DSɥ !J.O7޿>VS)CĿ۳# 0 850QcݟY̾"6Y#=5v)1܎Qr<#[0Iq-"IdN ݕ}\ c! v|.X7mͶ3;b?5FggfF՟vfq Ƽ˴!eZbmc(qߏxam?n,V7βʓ$ q[[[lnnrM6_Wi4W>% CXli9: DMmOGl'WK!#+dwEH&ˆ%Mo I-pC:ad|MrB'êD]Pr,9';,b$QEO<ayȶDZX%<;7 ]5 VgY"G' xSH7뤪࣪2yS o_ka I2sD!TIbmeYLdNR#U$D ǘV$8L@vܵ/ IDATo+ ym@̢sSH#Ȑ K9&e ̶Bgٮ8[ 7J;֧1h aY|ar ]h]W`dSFcrj@e|o2/%tz>oC8.$s)$mTD9y r(7ǽO/t7L;'|h`9fdABg8ZՓ^%{\3MW/d|XG$O ɕ hՠ9x}i]-[@Vr.*蘦vS`Qm:.ɱ&|Aǯ!騕X aQD!ܒmO5_A2xf󒌕X9 sy%r I?N ؕ?GryFvBH뚭Z(X ste^'[2<} oDƝQhW} gq0)azxy<꒼R(my`$Fyiv+ ɓy2Oخ0~bL$a82;m%\Z~4$I^a rg^07fmV%His+??!ӖQPL9:GŖ9Sc:|S؞a⑈"?>v, f<6cmӬQm6:) g, T6{u{v>oD,"nj\XV 0E-:rhb?(&wF@Gs5QDUiG$za=OGAˬQ"~W j4d`0XAצWb=˰n]Mބ/n[@& Bp K?4F?=M qPO?(dn 5h߀%+d"xr=hcj`.Z}VXx7A(рvˀ}uHjEQ^TulDIH 6dL4o!pI?WXJ| MAfaքIN"4$q/Ӿ=QRᦎ"3E2g[ _Hd:J=b6cߑvr_싰 <D 9$1 UPM9_aöŌ|>¶=W&BlƐ ʹV;ʓd6OZ!O@aNYDU~+gP_fm$QRpy%amG5)=0M6Ǜ/غՙΠ1M{{$Kٮ$:vּ+HX>Pn3gmp|8f C?϶$"IQm|f(m/vnSꑝH 8p S$v&^14}d[Iagϣ"Rd'˶YdIz8pZf6~Nę0 y3ңhLaE jS$h4za-Fc[h|~I,OieU][%IRVYeu$I~u|,}Xl:pV9Wa \7_!* ?D)Xp6ȣ9(pG,qM(^[@r$*$ e=ץm# Q@^xm(pL_W\ Zy! y*xz?q5woEuXZ-<%HriW-p̅ V:xHIx*lGko&Bw.vmr0PPn^CMX^VON37;IRp5é8!iPl@[j rNEȓ#D-\xk,j#.)N_3CHDp6{UB9.uQ%_Rkn6S4a"=^#h5aU?AOlºkjNՇBIv[amyblø~ TI;68i^ia0gM[znw̴/ƨ!l5IlVVT$fLYa+9?΄PK)"%MvY ә=s^blŠH+{ES:ӛj}ֻ|[i. Hy^_7 pt82Hv"I C0ׯ_祗^ӟY;۾ a8p`0`0ܲ]i ){/"Jn֬uվ}ׂ Ȉ&C"H|;ߙ"FŴlHyTղ1r\sss$$I?VVYeݵU$eUVYww3>0~jfYoN;jy.uf'l\@- 7L9'GsAU _~(OB _+\AڋCX'`# ΊQ>4? ajQlgI4.KO| gE;a #pA_cP'CO#,Y`Їn1"OHVGex/?  pn^3x. } lK?^TDdN0z=!)8=jCGIDPܽn;dDž8GXq6&/:r#)Hjxo}R BȼwD28ӢRi @Xu )#l6eD'!(Oz l[Cy22$-XEz9rطlblIh-X>*8jP¢>>3˦+&3LۅV\1OC]_0m}Tn[D1E  2ijX?bxQ,h_|_O77vmlR/O@a$ǟG ӊONFv@`EWP{o[߉8e[eeؿk&ǡhEkkkYCIRmb"ƍ|穧z/pk";($$fCU;ѐF~0 o9Fn5FAbHGQfMe{%(eUDZVc8fJ%#c~Br,g f7Sv!H YbHXl[|F!**I*;P>t*‚56|n;Hy.w$8m۟,7+0% Y/Jz[,y/CAP p@㊕ȇ%h 4ڌkb aAm>H = 6U+LO1pևB4SpuBQ'M sU=+pa8\!wog?6Q5MKnʣ~O6h]X&c4xJ7PfQOce]G%GΊ K_Z.$U٦{]s;)dDk1~Z ‘* pY&Hn dGl샥$Ɩ$`H'v\8u~*ES/ yvۙ#S@1dn]a6F!+cNgς?v^dT!*$1&v9"C{`1dP׷e|CUI-|mf`[%yQ&Jgn:59F{ZG~SNN~5߹ө "Vu5 r f^v؀Pv7 ~~0l{'ENbkXYY<|mh( Ujː#}z3Y^^7"dQ<)=Y?Wթ^Ajm$7ML&Aj#Lmly`YeuWIUVYe݉˽$muQp֚Ln:aj]_/B&vn(bLo =h-AQZ(s AUI x7D)C)Y$AZ.* 2'w@KdIrA Axj@zT-jw Ζk @?LBQ6oM_xԈpa_{aa7'*<Bh%Qyxa8au, _<Ou}UXTH8OMM*8هc$T͙fqڇ Od O*U}gn;,ܣ?ȼ j$} nUHy߭T\Fj>.$SWò w/p 0݆Im22wCIjBiro^D=~b:Xe|C=˾ 9)9o{>%IhOsfmO3mOV ]/اݦ")o'I<ch=ljhZ7ro1M}v{Mmvi6 '|R>gg$2M#H-uοE9$E@x>3cPEgϞȀj5$mUdUTm[}>ϱY!JluAh4͖ݷEDIVXT˼o"W^%"ٻwC`w0Sd߾}AmϨH(2F̜n$OҘ%EUxgMMy[[[I??ZYeuWVIUVYe݁*I_o6wuz={7 QLw~[AVA"VGSQud_1 V8# B DgFn6ȼfWx( B*ޖl;r^?&-಄GP &J7+'w; '9 #UT6a g?5ŀx\/*Uj eL"G&kCxjKL(Dux>́x0ݔEw x! bC8yB,9G8oAi DIj#@v{@-U]6=*}`)H*Y2Ͽ:/eܱ9~SKO؂sBEe/"+wdEIXuyπ|w ia$O1kg Q0]]>2Ŧk89mlK.}bCL[v\7J4׵7 !'kێ?;$ó6oP |m0$<߯~{;,_l".hOQcO$|Cbҩ냱wb}vli_(Ql%cWi$EYn SשXce4cز]xYIƺ$Nِ p8d8tJZƁÐ-6 o~/}KG s Q}{Y۫*ZJElr,R1KIb^V1M'Oxfh4_oyWxh6'PHs7ߜ٭xpN.ǧC*@C ǡuY? H!6aA{ZO5$zpsY20eQ0Va46sUΊ%(x}uB,#Hp| uJ;yW}}t %1^׾,XӛbG,%(VŅcsP!Ⱥi͊~[r|Qz`T.W B$}$< iQ 䁭-HxJX@+:<^!&}$ddm(&Mɑ(9ܾ'%URK$0ڐpت#H.7D*vzXEH; 4Od/I{BCrptIzChm@ܐd?&|Zm?&ar*^+}cb=eB*D#/׼?9Ɇ||iCRN[Sྭ 9,0 ֛Ԭc,"4"Ͷ,0Qcul'5 lW$d:#+I Q'~wLuv|s&MS]2,ڭڒ$IFҧRd}la2}~\L=#I$)*I*;qW$K?hpPZh6z Hgu,DQ{Բ밂bWEMep, /HFEmk}uGaUUDt& N&##L Opēq@*at> B_&P9QzF_|FN(m5dCbL@rLm 7t;w o,bMOyR>kjlŋ_4`()R_Iλ0m}h-07(IhՂL"vNǒ*$ ŹeQ?3b[CxKJL}ԴE|vrLɨF&+'VygD(;E[%abwCj+O.d8f d<ʶq*TI6^Vpi/MQb\t~k"R$oI|.MJE6Ąd4m#!fYotV8\믓$ f3S47 Ij`JAcga4M ÐxLDR^EaYi**I*;P[DZ{ڰւu+r!x yy=:3AuX#v' ]U`4,nЏvt01Ps!B@6Y|͕ UXhÔ]f( FůJCBiȒ8PUڜi‹N| Dya@ԗw?$ZIPx:߂xK&"$̪]@f"9pp,݀ty;szHGGoP}\q MȸE j({b\au]ړƉ \dI,/ UҀ $;(WE(QTX>hb ');52^̞?6yzɑZ'J*͞1G|O>oC$}ږdX`OQvOYW]۲|ۭ(v4M[$I(8[ Ab;vs<җ=3EZLq`@|vu=dCDGAbw$ `co#`DkFAb?ի C*Jz<ݳgLLAb$HCiÐ0~yW(iJV>W*I*J*N\$mx|V0m`EVЪ)RuJh].h ;Pwb| BBLizi؆&ȼ j!< \`/G",~K?ѝhqH]h6ayJV)$s.B{=(*ܡX\ftC_#Pfs:/]8ҜBڃyx~YJM@gϿ -*hچ%]A+c6#~ͽ࿉0` 9Q_5QHSŇU>{mAt[ڷ-ŷ:!()qC \"L Ɇd}8$@RWϜ(ATA>bgW"#DJDBDWd޸ B$C2߇ %A˛7/Ll*uKu9rSjfh맯M lZt 赽>xJ) Ĕݖ!6 mL2lۡh2E& n3pnn.<`ϟi fZ!һ%M u߶#OZiͯ'}Lȑ d;r)JwX(G=VJqF!-1ty RbameU21XEbϭcfQn}n&Al'WYl^+2DCx[ra7H,'b| `%6IR<ȓ$h&Ia>o}/Qb[oU*:ŋϬLH/ɒ"K>pMh|'9Q a$0MU`6AW'(( 1 I2K7X O/E4wNJRxI7!@uQoDv7'UN@d h޼&20Jo 90@zɶq }G5Kc;i'&86p٧w ا mJ{ǀ{վ>8@1`g+G2,uǝj#3s]%k}@?GIr@ ź˭ .Bp],9}Q_@1]Q dv3TE.ܒSK~R7u}VH}jaKMV:79>AdyK?#+=h34Llc0M4'Llr%wmUuۧ2=)fSgnݚ~_f: =%_8}JT4M&N !s>#dY<[a)M}nMW?c+OJ ~\{g3椟kM`m#TrlCn;uCD {n>oGZ"rSiAݱ_Wesgv(iZYpDnIn̘k~0d~~f9am>E!B6#Pu1A@Ѡ~0e{CH˭Zx<2??!O|$1U 1߿JYb+b?OmyI$)*I*;qW$N"Z *tzˀ, ~Q@ZhA@L/31pCUe^|_m&QWG5U)U h@f+/= ~_y$W`yDOi/`]o^[+!mNR{Z@Q׿I ) SGkX%u6זiYxÜ_@n)60/!O%>b7؄gԓ,h vf~ nxRT,GHu] Z]Q ;Ⱥ%lt,`8:u(v\ĺ,fTuZ%[X3< `_xSEz,{!Z꿁(e}UEM5Q`@bOqб_>>), TGUk3Gkw#gU5M6wz}?yEa6 _Ho4i&Pvg!XF6Ƣpp,0-zKB-jޚ(] ]@IGU dhMrRHH! <Z {%qF$*^9["ׇ *G@B[j,_~ &OW*`W2 lČOskL4"+ے+o'f5bw Z'JjY|QNCa0dmEH<ʓ$E )Yu݌ 8^~;UR͛ >ǎ+/R*J*N\EQ )rz'@N.]ۃ5OU%W\i-h:Kj$ÆŴZ s!oyF, X+j-$M W (uH6e[>?dl' +-h& `Tk>.}PX9bd$Qp p;.m@+p8<'߽߅`_VkFY.V(`-!$)jqgAS}9MsQ6إ J6^W׭BzXȆde3PsE7%U.A$l=GN]%X';7rJ; +uW گ\7DE (6B fwxXU nyPuuQ(yS(( phrzng#+'$elAwƛso~z:/r)FlW+e< AqV?tc(tVؤ0,/|Xm}6$>7V]}}+IMcSJCVc4ʉXj=l,3cS0gl$a?ڗQ ObC&Y7~X_hݮ9iu_W~n'f=7 k2Sl$osvay2ŋd*,$ Ì@1A>>sWu0Hbuٞy'HŴ!y^7kH Wf,:~Z`0`0d2DI~Hw;~75wYJw,zSVS;%yb󾽽grLl6F9b ;,(21dOVTU|pHEv6M);ZfVSPVoln޼I,..}pyzBEIj&aZ}3"$"1jqXɗyZeVVYeuVIUVYe݁2?=+U%N?9$ٷL iXA_3ǒuVoEi͓~ nK$ꅈL,i*X^d@Ծk.,'ҖuݞfUlRlN "+U sbDLH5xM8[5ZRx'?5SCȁ$pn ^'> 8!gI<m%W+7Ap&Rx_y`?Ī:ѻSO-]}o,P#sMMwX%UH/)(p}TEҘ)18Ln*8L3dK tE3X'M@0PaKt N#V@6NڮҘ:#}IJ߯)F%ɔ ێ: $bZag: _?5 VۡCqw>kdog<9c}Ck$vߛ}BjMbމn=kRkhT;;$G<{r-iwȞV?G[`{gZEE[wslM-];gmdJFCd'(v"f囼k<ŋm*J$a4QVu*qgd IjJSy$ 1`+Hq4]6QbofJDŽaHRe0x(|M$28I=UVYeU$eUVYw̝%IMcSc *֯ qa bCk?\DZk^lC8'plI! y!Q! h;JXTk/ IDAT-H^GY"%Q -8sX3hՁ%8< iߚºmx]Xأ*tNG2΅i`oÉtp &1ZN[R"jW gUQpRQ .J 8!`N*cOC ظ=~RjG;D5d~Dc!Q18/׼J䐨ZdnbetT< bV6QM@w؃%;<c08A/i!>i'MzP(yuw+>$>@&qσ y3XwI`+2!v:cx V驌yNɹ.iE$1dQ &>bֳIOVؘiZXb]يgYngJn,"JE_7ORVQC[RDT?41b:Ƽ^a{gm۟-j:ݱ1ꫯCl696-<9b]t۔2I4L1kU ovK-C8e%69aGQvy~J㬟\ץh4#fNe!_%FQ9qgy#=yoYeUZ%IRVYeuVae:&k] U8^Րv{]֌hp rw)b~,k@{0&,@/ 0`p F _`Ea_HvXP+p +R ! 9΋R^ʼn' !voʂZU9H5W!¨~7<<qddVUVUVߗZE"eZEe{,ܙBXm`X]Mw=-Բ)(Sev`W_UYUYqy#|3l9#Ȍ?tk6G p[$e9@y=M2/Ua{\|@6 ђoc6MwH_%SKƳ$)CN#ȿ i+gg%c^hGTG-CFdqLrk,ƃp8U!~,Ce4ķ$}7 G ?Z!_Aa<Ҙ/)MS̼,}KqX3x0 ӧ+b{{#$%ɄkJnaPRH=RصMeIz@J]_)Z5LdբRj<'p.nTW\?p}DaWaHDAb3T=g/Đ~$笩~d@wzKgbK"~E{|&%,+ٽOSivٍ(60ڨ8 rKr4bUĆ&,XK\5 `vDn/s b0m,)[t;;;)HJi*;.n*{*~wegYq1;;;d48iZEiRǝ?vD;Gmʮ4MFr%~~hܾ:A$:긏Q$o}݄ӛpzy t9 Fƣd:#XNkLG@Q$n0:^ܺPão^sP[@ߔQ s(0 |4Rx&S#WaiD~)`p.' Q zOkꏃo}8:.Y)PnI[7>k}g?6olg6.AO7Eɀ-NKŦ 4_>/0iE0 TLl_K\^o'|AL*J4qRE< T+I48[alZzA+G,SM] p8ܕ|DUUu9=\ui J}bc =+TbX}:ho@3hI-\*pJ_d،;o h{P'mMa8I In5'IdFmGo9QUiIi:: اoƤf^}>q9  -:pE5}}l ꓖa-LF0+ȴcRG kv$uT*I5k*iǐQaGTx߀kT&4!|C.8!29O _1|p~&)ڐ/w9!!iF,{[b(?O!4k. mIrW q$J׬[sү@k˴!/@0ʙIi+ A#\HÕNysrNk\O J yzȮc$]P=*4 W}߫c,0øyI]qpӶ匧d;0 c'&UUF)K&sgGv93!Ԯ Z%F|0eL#H}۵%wFQ9nj v$Mu9Y+}~6FQkh:Fϗ$:I:ꨣy𽌳f}zN N3nVڰ"g1^=qYs!? }e&]:p(%O!2B 1g6~8@; /H7Ղ|e,ա(YP9xNA~sn/Ԣ_ ^<)Xx(DxS\beXv)&tÉhSxЋ8@kRAtT0Or>(}*!k2 Ay2uCL3׆磊~WLDU$KUkrSPjz51f%T׻>(\h2I$ty $~\oTmRyd ]%i=cӒyp{vY?yr>t],H鵽ʛ㶽QkB^˴tGUJXMW#GO~ )z߾}xc42*l=nݺ5Fhp8d82 ̽56~_ӈW Z,ih4۷FQ$ZP'hg,--98k~E V @f13ȯ0#iuDarAac%W(kOá`>,l %U<87Ml.,|#$LxiK2aQ(/^ <{@_R`GJ:b xe`[$ pVW9C%K(/-[.My|]7WmwQwYIf M$͛Qn;!\!ف]\fV9Lo+ rEb9thP++,x<׺N2n} -&u=v Dk@]|'L6bT'A`xW%EΔilj qk5.^m?f"XADzcj?Mphb%I$/cIOW+eʪT̨; AQkJM3owXO#xqw$4M܍RdTg O3Fۻ۹4xGؿQ2??_?s? %l;~o3ATMUhrREh I0 h q=2, a G4Ad 86Nk紹3ш$IgŋwvhD*RrٶV%It=nz.ϪΧ0 H9W24VGuFMQGuǨI{קw˫a =FFuڄǎBm6p 3vCBi-Xp9XULqˀs\|<7ȹ Co ؏IߜrnڬT~Wӑ,5 G#|pr„~?? J_ 9 ) }aQlA(>-^WR_qҖ駠aH_@|((Do!j~eG0 3Ot]y Hy `GmzƗ y52 òM,w_bB lJ`HaC׌0pSxYhȯ n@-U3 f#(^Hf^GMɺtKൃQGy v.}|~Sy';5֘O pr(cŸD=顁y(#o1I_kUuC_?%lPcJ_ H$I|vO.VRU@*TmKb3?%Dwğy4|xbY6) CsUb }(+W IvvvG>Bc [O,dD {FիW`0&H|ߧ!i$O]ƶצ U`hĶ+},~?FF S{wn݉V,..q1;;;\r%$٭\333csOϩii9aJWn: a87ۿ]_ꨣ6j:>FM}q{  hY@d(37bߟECX*>h|MMKpC(LKn}Cr$ k>˳&͖C_w_i!6/äJ6^5gIEj'6'BHz: rXpG Q`Mo󛰱,,<~6cIف[f_2!) ]p_{x˂{.0jG,_ Ȇss$%'&bՌFߒ[%B$~VYXXp̷`t Y6 4fmc!5ąktdoi-d<e!*|0ɀI+FhRk4μi΍M|o|X{<ᴳY?mVg$qߐqXrZMڮ7}JMէ,61O#Rwg&3J=~@ybU.JW$abF8hP *j0y?MEhUHYZZb8l68 x[Ն&Q0,m1;;;wM25ѤR$9bo$UhՎmQdV4 XY#t󼢯L"`ڵkcDIǻ$0N{K;fRMS'hUZz_R.p, ׭[8<_W:ぎ$:긏Q$6NN^߯܄}p,`>tW؆Nx Ї y>I ŋ K?: znE8oր(#87ͱ4a9zm8rxB !`s/f0s'߿ks8YI$@^ <_~Ĵ,, {NYShnB\MQSaٻ5A>4 y]9"k57r_=&J IDAT{;R+->7@0^S<}0SS6ac\6VIՌJ02o!F$xqȏ`9) s6ChEnAaNys&M r]7B9&}n^ALı~Y@*x\Ō^?l9|>r<}oA\_O *_?1xtHf$)%7x-JT]N3X}$>iU,4ĈNfчd;p tcae?,mx6 רO94zAO¦!^tA{ɤf?0՛"Gasbr> /\SGdPx=ıRXF?;Zsp ƻc5^Ӑ_æuo0?8~=IMӧotc!oqgl1 zK@5XQh Qd>1r .xY.1a=!Ɗ 1x߆#} u*Al‹O]H+&D5DKKoמ,)'qy^;wJL .A%wB&|1N6D+!:Tո3߫sR2"Տv 1JKLX2B{XA4M0XOT{TIMhePHGV-*#7L'j%V!zeQFv$Ɲ*^,REYEjm@鿉oC2DhJA:ZAb_~ƯJa-w%*Fd߾3سgNg[kƱcNJq%37M]|$MUf?__ꨣ:>bYW0l2. 7IMet܂t@lmdȋp10_Q`/pu8t:7!!=lR1%|˜30ri` |/?fV݀llù[pb?,BjÀ2 &i뱶VITŋ9rTKh/*RXZK[O"$IuQ5IRGuq&Imj֧eYX>juƉ6Iq !>sr:{%5J* ݀޺1nglsrY!"H[py+ 9d(78w:\f(8Y(L6#  IINP#_~o!20-xz'=Lztg] ")@\('ƼHc4R s]̘{@.) hC5{S_.]fY` /fE,0pԤf ;!5amC k ,V'v}$8SqȾsXf>_Gv%Ig1Y:ܔ)$´E0˞vU*]9({d4>g&P*F?C% I N55T}`tMth%IU;pj9}g?NJr~$U_TPܵ;kK֬Si,q')Ctfu^EAn\ 36 Y =Oڙ)0ϟ򃘴Y77/+aUtZρwZGRTY#J`M%eQ txBXbnq2R,>!+x2iVWJв$I:M.GwQtcjY0”zO\od 9&ŀ2=Z`Aa O `%l|q^vr=aTTH;R6^jv7P-5WN>U`|;0*OT\8c]$"JWd1= 0CIXhvԞ&psSB & L]Ďq̸JhKbVS6ZXNRO#JQI 椶I{9(pGe2tOd ĄϘ+IKX"NU"v#J4Ibώ4D$x0 Hd *iDIU[mYw;.oac$I}:ή KhZ.ՖGgYh4*n9y^A z^1~w~ߨ/cuQC5IRGuq&IMv^N$"}yX8oC [r8G# ۀsȡ}xt`e o!j AօުQ,'NbK+[p1/&[ˀ<^aReC`I̧Ks"4HJt(/eE8ՆH gaO}DWe1P &P*K/ćlڃvCQ 3LIW\wު!5dL~Ō2xBDC>Q$!eA>oC@(dLF9uCW܋)? o\B=j y<`Ze?C$؃V(s>ūf0`a] (L,7׍aEwSPg{p$ TÂr̵O!/XvL'IrJ@\cU> .;e}Ip,%zLSDQ*g쁳 e[vI(;irJpܪ `DIӯ5x*I~ٜc鶲)UYhDm?ӤKNU;ՊK1E:˱"dHziGϜ0rϝ) =nhz~5k|"L@]? ='^"rpl5¤ki->dH1W 6eW! !R6FjǴk7JN"HM:-oƸ!( Ӌq*Mzfokt'27eIYR3ޔoߚiu mv]IP$֓*IdNTE *񋋒)$M!D BˮqKJvkOY^zmn [2&kҖ|fM[Ήixw}ڮRDM]C7I* eRuR1 j˶ck@Iؾ KVYU̪*H4Ӌ8Ibs-QK*<gIw9%{$h<рG) .G ܂!@6\ +ׁ<& *pF>Fq=ѓ+r$oy8n/'3:> vo$owc/=e6 e ;HFdؘB切gl61^!9le!%&x3 Z߳&/ "8}>:iPrlSVL-6}fG 9Ķ<ůä YϚ2H<>ptlTQou%<`;pe8׃'s!La#^LWe ܂U _d8oS5lG$59:N'e=(2JK$פ%"\ךФnD=KXj|3^Ui`2HUp\lQ $IOeSϘR*|+)W~_B gC5_M:󦎻M_5@_ew[p7LM~vi${K6X%al6'|Ht2MrTAOn>,'Ț8ZD$w=WwAuQZIFݟ' _mxCIRto 92:.7=XcDY-A6H|'Rfܤɀ_XB^yyZ8iS0X$t?1$'䦘T[K?GF-S~YQ䐴! ![lLR>UO`^s {88W~!yV̫+@ ?Qa IEdY+!,;tò0V怃: 7qǏC9TCQ*!W0)ȤԆU } ]5.[$I~רMKTe6T#iߑW@BTR4 LgrS)M#I|A糮sPg.i˘T}qx5k̘<S׃dZ0'I\%IUJPoQMMSMK/f@VdyT*r%Hs" eƙ<{k%IuEMQGu QBxD=/)Y|: 8$&௶UJ'mǧ Ij@5Nz9 6`51@J 'O཰zV^6'DT  FlB8nRE ~,~B2X5ŬY/%IPx#Af ˀ)a{ f!5Hyx;fNɟ1cW%M/oCnC!TUOg}7 8V48k^Ûfq\勁\pkH`>K.2#!"ƛ"5 KHgL NۆN ZvsP*ISf;%oἆ[pbƞ\3@e Oq.b/zei^7&2,PnoҜ;ZSvc4p}+\IU%V6WgTx|Z.=vUVy"- g<͘L} J_ fZ)sGǻhq2zXs@§7oIpXIKe IDATF#X__/R?Y@J fcf(vIU;R=93cL骈ߕ+Fά?6V{}1h4FAE.lZ-빹7cUm0/2ymF$IhL RnvM,ZEL#I9e 5$ Y1;;[9j%Iu0EMQGu/+Mk%[.bY"mr_M@¯On1<0y8'#5&tp觠`ME5hM7o[:w0i bRd0S]itYYI 'Bʿ QCF4UH@7qɇYFXV<< 9% ^~YhC(>Iq`,+s3gЊ-)e^Zd%l˓:v$TyR;r䖬71 EV,ZE1+M)lT'܍(Q-߶5?g2N^|Ҡnxi:ITٶ\MFjۥr |ëcݓDWU{&̰c /C&:m`aYM%5:MɆO\6T[[(S;IWWGE" #oM}n>o ׄw^&̻-IM׳ISlUѾFD%Iێ~/rbɆ X\\,-ZQEfP[X=m Qdq\IsssIpQjex~K_"scnl>4M(*RU$)Iڒ$7odvvvbnzmZ5SuQ5IRGuqn&Iqvyݫ7S{>\g|: hG|X[)70O ]n/S k!M^87\xW `!gmUnߍ+% 9~A:CkeW7tO=bk0@B#_H 6dY0 Q2ʹIA 0x{[EӇ|YjRe{9dƟn@1TvG' iJ=| 7 -!p!0ʒ7̾^$--1 IM4RHK}' µ<:7@S`ZWű=IH!F1a}kҾn ۲ٚ$S}C-a_?:LW.2q J53͏J]<+/i3Ljxw!g~3Č&J\I/UFCG>%qɗ5֒ fz|L'UHeFSJUXz FT+I|u'_{hZI/jSv z=_yc]5Nu/c4U" 333$O)*5I%Y}__*ߖkiz UWhDiY&W^eqqGN)Dۏnz҇)Ysy*H\3 H&sss%Hv#J7A)EtyѨ8oljj:x&Iꨣ:-_ /4ciLj/ӱ Xtսc.r3_ɍ *Heo5?=3l_O1,@<11'o҈тv-Z)RdC !2d<{&U9N|?ya0 -mD.pXo"μG+ཝ s&AB02Joʟ:{m=UTv8X[CC$1r#FM ltMbB3gʰq}{U#UP d ,kIYnhΑiyH?d~ ŝ̖(5۹TdW)I\l)S&K1eڭhp[ҩ ݌۵dD]UDi홢;(%K$*%4?YYdɾnHyYŬm)2Oe\%FLSIɞKC5n`xjZE&ͧ4 _N#Fl6 IȘ7V(L*/UdIbvvy7qI؝(IӔ/qm= `ffP("M¤ OӔ}k|ȑ#Sk4q&InM㥗^bϞ=Zf}\_#Vx׾FӡX:,e$ܨRQGuG3|V? 3phދ)LCC܇s 9sr/?Oog#8 '>asV<,Gw!,D-Q" [ːc,#Cj{twXzboCc{%f?(^S+pQ@׬)gۘQJRd7Ty3Fٷ!(DXڧWϘTsS4bn"[|+fMVQw!%qb磛*(UTi2ul}n2lejao6w"zܺu< w}f Nx ޿UhRMeY2vnKkJf AԨLX0;Fa 3Ak (>|i[6L =sF6 mB! ډrJ%5$Ȍu32`aQI ]l0f'?5/CG'ac"/Dt?JKh@UXPX$-_Iz n뉭_STKZ$ZQM=UWꈪejo3TX_;ߑY|P  e*K\Y_:M״eTqqIE]T).BH*0RU%Il?yjθɘi鿪.UL{v>k%vѻ"IjpěWlnnyr[3MXp8]t L-)c{}aSXM#IJDUuUZ&%ш/~|Q/[v=F辳^tR:^|Ez):4Q%A1~Ѩ 1nnN??ciiPcI A FHץ*%n+A%Ab ˲i2x"EZ7ܩ$uQ5IRGuqp$yK┬f&p N(&=,b( gl5@p;xa 1^{..CxmX؃IQCփmXك+F^ϻ0w`^3R uCH y9Ii]<{@ ]uuD0àza%cWξf rF<\(@!B ,AlBul$[*!p@akL0\pHU\O8X7}]p YRu?b֝yaWdG "z4dUh1"hYF ~=, Z[i׃.-+&YFrs: J[3bg?`I קHUW)%bJDϜ|>KI4a0Nh/KkM!ڿES+Mxc+NzXOKcjHNHmNl{|'I1j IQў9bտg+$I>{RJOkp>*nVGT$wZqA;%JZ֮ʀ݈pE>O}5;;[xYuJ r*'?I80;N)Ƞ$Ifff*n) Vz&pk\fjHcyzX| B h=?cy$)F-$2j5IyH: ?l%yxx 4's aЃl8,bʛư %.. (7CcH$ %&AnSk`nmq{>!pDu*$2üϣ XzSgČ޳|}}!gdG?4ߵl>DsX2Lh$]h.ÒmzmLXcW i<,i漻Տʪʪ̌?7fTdup3 Ȉތ<'9р!8Tf0v[yi|{=`p԰-L%//eccc}cg`C엿ԯxx[UKE>Ҭù.  ݀64WT5c.4נC}&|&\@H ނk}xL tl:9xnZO-^mn66 _u:BD<  oTk|Bߖp` 1/ Fj?߿Hޏ'}P`K{Q,v>* .>TdiStw:y^1?­dT*sa W2dbml9a\B¨ ů"ےb-#1Rn\ &;+)of[U5un20nrTLmhIbȑ"kvȸaEDNnĆG{ A.A%mWdFb{A$u3ܽs+gqy˙-3I޿_9"JJC@~ݐ$Iq #ذ{QĊmu:6me}ٞȦv?eŰ׿"`ߚbq3>>Hc06nXeM5H(1g%!JluCtu] e>$Etxw9p@ q+4+TIUVYe}P@V$y`߱;arBLWaԼAH 4Rx|R¹ gAb0]y/ g P1LLQiĤ7]Dk *]QZShB #$8ۢHGL Taq?n J P6 ?B&b8 ^C 8v-pBŇ B,Cp_''l'rh QxnQEqcT%z.!U JH \u4G!L \B+P?پ}TV@vLm ol@}{3?PߕZ8!Ά>h.d<`}pIhn.ZT;-]UJH+gEv Zsw .:󋭘+I>6mۄH+OL4n@{};6n'O,$]`*Ry cWa$<`& ɇC6Iu {s҂1r ߧb'w~uM6zU%T|e~{GEiH|s}U= w%nEiݦF:wSK~|.///}=!̼1c2di!;$! I$ ǎ״ʹ3Oaww Ðqz$!LZ2ESbW^y#G *E+Q->lU$eUVYP?O-c?1X0'_a?]>u|-a';p*B8.K*omL `V[6|ԂՋ2#֩ jw>nC h0O[s]PԦ :-8w KhTLNkS(jnFuK?ǿT/)ρm a(J)=!k  |rS dwS: kmH"Tӳ• Gd{{\ y\DV%8@Aa֤۬Ү7_gmw-enĞX1 k$WR\a蘿_{b,bs?҅Dx vM+Ѯ1UV][VVBV]~\R |8$$'%&#l0ʬC˭0y)?aVA(sa?[,YZ7^G[Gz%xy& & I1L2C8H$s} =>NOI󛚧n+b0,=*8^C8v lS8.7XѣV $+v$拭$q>0}Ӷ>}~J}99tVj7E5 |>!;bw IDATvlBn+Abzː$Èލ"[^ YRV~{J CZDÇ{fQj :W^%c|޸dth۽ux="f Qao殽8IA>u6G;{l@Ab'zLU+??Кգt y[Am@_R*%j݀'TaOBUl@U sVW(R8Im|z5 GA)\̠Q?b! V )9#Ҷ i7Bk(*ӆ*L*BsPU t*o;".Ű+oZs ȠXV&4LU7iE-Va ΢> ;*gW ΄)w )CJt-0 ఼+30o+q;/<i.LH~Z]%3By͌ {VkU(v5DA?߁;aN@ڑOC8H!#V̟f27 ןƺU=VS#`#_I$ E&UB3Jen)S :$UFn+E:U`?<쳘K`H S쿡86a`H^^BMY]luE %)R؄QzZǐ$vPޢ~nuck[yB>۞iAymr?wFIdvUu枭xbmL Y u>o%^'k !s:ݷ-[ɤ0@]Pzȃ {UUD+Jl04M{$ Ծm+HVIbײ)Ojh4􃹿JmgkkF#<#._̱cz6D0ĐHԧ!BL_ڶ[61b[u%IB7MS(RT$=[ZO~Rۚ˞7)TIUVYe}@Uh|jis+Ӱ\5 R5 wц'!+-h{p>7`$,L| 9ƚ;p>n üCQ<8UYjsTt"ν ODShؚ ֌pΚ? ʫ(翢M@w _/FqㆂJ' JmŅn NXW/ YwL!;DSK&ݾZ'| ZB5#}ppDMy]~A G,M3 ^ki&F'9(}O Ph=ۈB\T@ognքes-v 5_zpWӲp[Ƶ0e5_Oʏ6-~ӅI|hl,>Kyê$1f 62y]/L-:V]o>g^ao8ܝHσ-o((/}U^iܫp< 8o_f@uuzvV)q=0HnjTU<D܇$7~&H>b [\{m$7^};hݴǾMrca$$c/ec}nbcw|5 p^,l&IĀ蟴FFFza}/eDI^P(q߉()$Iqʫ0}v ._;CHSV 5Ǚ^D?}% n#.׮]cnnn@ER4_\vWrر=0$g}/TIUVYe}PJҒ. O_/յMg 0 @#{0 󊛹i߉e5n]r`,Q6b O(޻2{BT)6]mr bU8T!{G)iY5tyWMwe^kgPqL*DeU!}O'9%Úm]$4w&d zp%V%IC0'3I ^]B{beχn E>HGQLIPgvJ<xJxVC fطól"Cz[Օh }fikmeYV9^(7^%o$)X(m<;x{v󤘽9׷%[R"$쬛<'Gl{??jmޔˁjޢ P|?ʐ$f)_\pCKvi21[69b/6`T;W(IAv~h$ׯ_gddd01T*=d}}o[dIs[{.oM0r>~$1}0X*"FGG{cwՁ>6Ve'N}>-$eUևJ*W^Ys_jQo~/y/8kտ 5LvZ 4]8[M6iV` pPB@sը/?8gop~kQM `75u=eup,U}V)%1uɆXNסzA3F6zT5aӐ0"~do ,ēpp TEiػwS sq iNjFIbgKRQH6,8DЖ|PX\Da2a2b^8c[1!ڎ,RF|BqnBPlbrLm XsyvM1X OU -c Yp M~Ï(;]QN]AЇ@ZiCϡn^6*B.iê$wb%uRV۰pja]"hi) $ސvEdN"މaS?-!=L7g 9v+[L.`@y0~1DS TY>ڗ/^9r/ߜK`})fW<`m+}:M[徫h1hyVm$*{1)Ec{7`{H<:::`AEўvyg bEߏFQRRn[oc6/_n%%iv $yduuF nJB###=%MdA)I A8ːn+AB'@(6_>G94RI>ά3\jjGxUɼ 7jEhAmDFeߟO&4ٷ`~JXFLـz(> A;>JY,y^QzɃRV%] CqPUVRɾҰ7zMO'@L=em[ k#eVW=9b]]JezܦIo#ՔMr5ag +Uxg`~ H@,[-U8dI+r)nkFb1_)[I' ƛG? 9*H/Cת8i+I\?}2H$d[JQ* I^Yiw^Q6^>, SWŠ +{㶭ʺ͉}>lL< u7ʨΝ9*ly$*W՞\o oĶ۲ ܹs<3 [`ʰ3<o/]DìWo4M  d2Q$IPT9C9k?׮ޑ(ɓ%Qd1} jJ=r% Cj(iNZ%E)GT|Vc` ^~j5Q,yV/˕/K  ڀuXހ_qjdzW.]O2+x`ymgUh{e}(gpV>Ub`L-4TPӾ~J(i >XJY ajI[jSJxV(T r ZUuLämQS4Bh[چb؉mQ,b{U4<2lTKUQ3UTSࢮdH*O3 +lCM %R5㨬o YS:9U3& p8S]2GHsHF ,+o/m`\$Qo8KljS0#wcydÀ|G>ܐ$Nm(" %-BT2 cBwE)7Y"xEy>ib ʐ=/M~F:HސX)8쾶7Y6ɖWR;6S2ɺO蚹jB5OSIm>^n:־ J5=woE 0[###J01}IbavN.\Gk;qغy%! A.ZÇs\ iJڷe؏-!t RV؄ϰ`$Iz14sVvUdeajoH&ݕD ÐvM<\|y cnW 8NOeb@ay*+>4U$eUVYPʞo5u@ p>,TDAfǁuWXS#PKYW:nU}|VM1MNHvP$.m2Ȏr~W,aFGT[B,> F5Zs ʝ~#mHwRX݆Up6(IEl;4C I''@jBỳND/\!BB8 n&mnM~H"k:]%mj++ą#U I0TB F@RUTmKTC鄋M;33Q\Ǫ2[m^W"$_q$=T4I;B3%9\Q@7՜;$=vuǍ[r>. ,[mr~0Vd=AaqZ߾V}8'~n(zeVE_)xLov6[6Qb=۶Sʫ,Uȋ~Hlf 9 |vz2}mϰZ|F~U,đ}\S0/*V-byL-*=m!s9oհ|[h݊wiV#wP)/lN] m@/¨K q~&\ȃ&z-;vGrdĢJ"&ILyˏ$1`_8$WA7M>{|v8me&Jx{+Jb>40$"N8AP4A#J̐ .7n`bbb$x">ho'N_Ig*/*޷2?Z:+b}Gx 7\ISp* h[,p"9#Db!Ռ|U2S$ զʇ,o% ЛlB ܀3Gfù|{4yC |"tD.FWaMtSgx[+ʈ c]lDjr IDAT4UEހIiEς*s!ϛw!3Zd d]Q$mvO3Ă'C~-I_nOKBjO!n !]#7O4f$i8 5kB?d +td_32.uV߀ږd* I]|7BbeNAbeu[5=o-H3iI?$4Y<(b ^l.<8WIwS:drs#þT$yr%oe%ÃCYkU4|y%+ oۆɱ{@zlO5bG{5y)Cm5uSfPAc|7E*"eX#0r$?6}B$o}V)RVlm~wJT poۄIlnn}w:^@xgW._︯)R)2|g||| 1g[s)Jl©nUlmmq9N>=8L[}s[>޿{}۰@L{MX9?݄k |\0ն p6Swq2b+xNA\ͅl#*7%$tpmx ODXpUKC(H c!8UMVVt@& ΌNUs1Ea\V(SI W9 &\_5u!4 ftDV۩1![2x0ȿ-$Sf54~GB%_шdø]%L\(2 ,pbG!8*d㤐5DƈNEcΒ16+˪Df3 mɼ7z$+f\vg\{7<G6N!TI݇ޏwe J,(bPc#]vPO4WVVUJX\<@ҳX`G>v[_/o#d +my& |,m}ԥ'xճ.o,_d5<.RE6Zţ8=9o1<5x~D~7hvq)"J2x΁Kgژ}GA iX{{lcx~I>%Od%J)IU7FS[P'lE {1*JÇȤ(5N[|[gg \V4Ɩ&IU1a.35dn abc(ۓeSSSqLZYr[*Ng`=[oECgܹs};;;͛7KIYe.(z^ c-!!HVF^kIU%K tn| |'``ªIt A2B8}ƘϏֺ,Oâ%)̈&,Sb甅*,'+'[p>Ä iGԿ xK0hz~-Afթn/c'/E"  6FH QU)`NਵzŷCbl Aȉ;"sBkOiށ/C~ !uZCXV%EC y'O d16aŖxQcURW| qS]fdflH[:DUho!] 8?0wRm;64%VYA{[y <,s!D۵%ve0*`XZz%U8B}\0vRvMjo;8,@p0jsP m"?Lu`C=8~$B~2o۪VdjʧOR S)!w,X10KBl#~ڪ|[Юa050%IX$Ŵ917|`> 1r$=HE(`kkk~emIF1IӔ¬Nl!? AbMh3+01.$B܄+7Ap&y9!   e4t\:!Z&+ 2p( , sA` "NL*j,t $U叫}џe7/tFܤcض׶V`0ߢƃw(tQglYJ{EEWen,Z'8"oeymz.sZwd-* 7}h{\ @}`L?5I6Sm"&!mOEH%ܰlT&v[e0ʠ>7JzFD]S$0n_lk%Ivvv#QA|m4MiۅIt: {%f `W7H-F$ dllȄ#MvwwOG\n%E5Slll||3߰ω{2d5}bǾm61+++\x]|gjjwj1\^bFEr c:{03>h6a8@xUVYe}4yUVYeuߪ$I1֥c'Hx!H4t9e pخ\uηSïoq0 Jm !$v < U Eo $sWmWP3Nw8 ϝv\_ NuX98 WP 5p ;+ oD~-d3]QZfT 3 ܋c]Ry_c$]pNk]V]z71bR'dTO]@JdU5߄1i5!kݕaYIUȽ)q=|2@I(t|V'^XO93 Bd]vy65Gq~W̔&nJ;pज़߅Kи q K)\7%"oN e G$jp0l%G6i ;kb$UHp byn JDR*BKap4Ȝ6r )"=qp[uis\*TIS-Gp 87Db^ ( s!Iy j'D N687! '\/(%z:]XqD&B^[SM!svfD 8qC <aQ2;l :ٸ*zXh9JaLC[Y ܱ$Cև纮kIC$MXxBGXj7`R,#W`3>J"-|F`HbܷVhm/ֳ ;þU۞?'}j؅AE@|~$y#_$o.8~ i0t´g[iT69,T0X}PCmW[ugt>q0hegm?@~lB_WX$IOz$GRe7Ҫ(IRW]q(~@ERl~RrĮ7|sԟݓl6`R1Z- J%yO^\QRDl'fmh)e[AeHaD!.]͛7G=qEuDI155E\v Vj5*arq^{^DI>;dUMsXw_"q/rU(Z~XYeQVYeU}RIrj Q!+8Kb 4׀u8|We o58j@M,cp:j&pKP\B' 6 7->BgN }L,aq£tuC!%n8PuWBqv+ Оip'ySΣ,e >Wt|` %0=-`[vS61b53B*8Z18)+٘fU!%ނ*+[nHd}ķ${I!݄ \«˯ X݁ HtP* $XM BiKM&[BzI\W-_{v"s5QBė9(DlA+G26q昃u 5 Ud\$KsȿJ]b۫&I [{ P"G)W`aHrˇsۄw)<g+r nzAN9e0hQWQb2C*&5M}΄Gxav!I dƣ }4mz~0٧WͶu6岗 "$of>ﯟ;߲*Idu+t ]BZa'I]Uΰ~"M=W`?^sLlQ&Q벳 .z{V;=Cp;0-Hb^7j$0&I QWu*J^nY dttBjDQdT*T*y!JWIJl8ܼyZl9åKz*n^n߾MZ'(OaeUGGYeUVYJ_KwM ZJ7i-  hDr*PZW/(L^R܁tέs/)ׄ8ȐsLz 6D@K_oCcGu-\+ YpӪ8.( RG@)@xI1K%C p۸"r y>S;L:Vn(DM$]ANS .~ v IDAT^m(ǁ pnCv !4j+DDVLjO%Y(ĊB-ٖu:YuLmW1Y! C8vPtJ2BX9s 5!U[bŎ`wպcu#ޤ9Mk6ӫgDWsEb`\W?3&=RU jFcPWqG_q߂m̡b}d$؛Dn_a@z$F Zh%_o;")Rn־ɵ'0AE:' x%Ir*v{EyFFEbnM;ao^L^Ib$vHĠuYKٳr${\ΉQtЩTV*BHQT/Z˶ʟy?$xMM:ʴȊ'~2#$(0C](E @oh\[v߳2 n#1R5AXn YhqV#IzHR)8fmmm@3==̞"4ۊ-?g/ӛ1ݼyk׮yܺu q]._\*]$IYeU$I[-[Kz$,&00˭oHbBx]hWEÙ@,|$W"qnxweޛHrg~82򬬬>dZQgWvЮ+c-XѰ(?2ٶjZr48.6WUVVVfddoFEVWë'@ |7"#3}tOH+VjHB%ퟁV P̅$Z\hAp5L8+}%"9} 2!xTC5~H`4S0dW 8uO sqz sDbos*Xdl#yJ}Om–DikJ62ƫA~$y'P,D о{H!oS>w,O5Ⱦ!d, oIC {˶jtwW,T"$h`|*MM3(Δ(>I} _܄1? 4U_é&݅pPPgwk(OЅ@rHV 8WUQ 0,|NwQ < J[`i,8m=<:p"`r` PG3K̳ʓyCoXp[Ib38l^ݑ߿8z%]2fȎ `&ʱif0Ub7ν&M`$ļ6g5ُ' ̶~s;˶gl?1k?&H.$-98Vz1ldn܀ЯVP_O2I"O$K&IY?r"MSvww ݏ֛QQLNQbCE^`eϲlMb{) ш|Ǝkޒ[^ApqȏalԐG`媪'HBo7}U,@R܇b7EO. Uxq%PRxж$-:Uŋz.NB͏IZ* #v"Ln{ʯGÜP^%܀`kY(Oui\ k+|LA M2It_ p$<,2g%>SԕJ,(dm2i~R3pZU+ pKP" ^ڱ6HCyO? %_e T 0v!oy٩)V"/˄ #DeYU #n@gj;OXt|!S‡$ӧ;.UL;ji޾^Wg_!d%vQ|%Y% e ~P?Ȓ|[yk'OdssswCP]˗KXYe$)z$RkǏtPSu֞:;[L ';-J`M蟂-$D V$# 'u[ D&.0?:!W$~4El n3>ք14!oQ H[A?!r<`ՑnG.!1VXp+BjlI݆ZojE]lX~5Uxbf{wUT'ʼnu@-!%[S[*b3 1>> PsD2d_CaFǐL!P\m"&@+Q[@bAmA*BnD2ά.?+ LTxU'vGKBjg$ZmkzCt"*$Sˇ/CM'1?PrXٙaUƷsC u tm!5nk5Lgߏm%{{J];7?ٙyĸ`~٪s{+YB[ޜ}Uv18WԶk 3eyMTrˌٌܹgG]?~{߉ī1٫5T@nG Uܸq'OοݧBY#JE$΃Kni2<(s>ʒ߉GR;ac{u(GG&Eovx7Y_Viz=>E>jf9 Z)Q!;;; Cvwwi434֭[3䈽q8o;S^*GYeUVYo//t2^9C yMx}.-UjaԂ~.߁[piVp#0~ ζuM8ҁ$!30hFOA~w\xz e(e^U'EtGHc[1qեc(ҷE%R@i hA <(tWo,Tn}q%1bS R~L89.G3UحWzuv:ݭn^B8G.IR$Tf7 L|Ҡ)+eBM_j Ty饗xG 9;ɾOgX8蘽cme29-pcu/ih$&?Ĕ!Jvvvt'WBݦntX\\;\$!avf{{J2_r1 ɟeUVY?~<*zU*IZCfw؆YŢ5̐~e Xeą ߄Kp6Zh= . $, y~< {:_3D.ߖ_RfIXmk!xקUEԶl@:[mj׀$Hy!Wm} p(HS.''v} %@'ClPJFlzQKtĉ >ObgX!< lU w:Khzj!0uhնkKo!N5WFf:nI&l Jl;}XA)YVXyC4DNSKES71u߃7Η0$y[,(D6J ;0gY`p}d-nn;^}c5CBܶ};OdL "(3u ̒V{aM2K3?lkYŋs?ז4ݧsc VaLò?"xeƿʔsV}3%P;[pEjMnI; [anJ77zw* v|F{!J.u*/M!JLFe[-lH8r 'O<9r/$~يϕ+WXZZ:PdAIhڷ^I| %_Wi4 Ar0}|avyA~XxGZɓz=vwwz$I>OW^*e$IYeUֻ$I޶Zsꖨ.@Zeyo%8%X[ 6cu%m8<qz*ο~B,|x Nʶ,Ē1VFB85ŊJs֓ྤu|?$ ΜHmg>c*?g4UebŐ}Y~US#}ɤP jk)uW׻8Bn*3@)Z2YKˏ>+Zjeb#oJ}j=ڊƊf=1 *\S+H8qAG/o% DZ/@ JPv3? W\ d&^qE-\+A[]qVYp : ug=XHa2,$Wj' 8VbHYM}Y$_OBL[v_Ua`7ʉ @[̪E@綅#fsK\ۙ}ʓ'y"%oYY,f?AR2d!H|?B0U z/ )[D]9.&{ewUݛw|[>]% ,TqXdrT&3"JCxmHF%'UܸqNsh Dce+ Ĉi(7x|'Qb'?2J"JGetXUA|y\fiv}~mqLh4jJ}Ƅ$j,--jz4M&^s*GYeUVYoJs^6o5}~NK8+օpq%X./YCdxd`@S%HN٪d89)lFpQ{8ߟ=v]@l /6 gmbقN~W)؝Վ xULiCIDg!L!+ i= jY`sܐwT-vG9AF! _1mB8얄çCpC TA#;vn,#Y |ŗ B z-lN,AtW&d2> ]!kP!hjQO-!๺^)#E!an]Ʋ%_aa tRhe{#gip@+ k]ɼ!UJw-"WjB.(N? 'z`$?<^|n[W l |ֆM2yFV/w[󜹟~A>wq=/dʿ6rU٠~EM啭8)[R̒$jۗBC3UV)ֱ7;-X\0$y>(IU~OH{ۦ's29q٬ЭܩVrjܮ0z|Q \SmPEɾwͷCVT*sɑ,$IzsۈnKV!3" $)jȲlb8Qr~#JǛ! Qbrp)z8V_ׯ_giiJ2. C(b{{ܹC٤VMrm8f8l6'bZرc4Mdj>$IYeˣ*\%Iê.iBO7`1ߥmf1…Gae( yӃw v\i8ۆNz/Nx80j ~]R.Q.G:&3;BGt]Wi8XwC)u u!OZjcuCff#'"cp2=V;"e;}٣zGٳ,9i{%$ ܡRrR ?&}nlOr Γ&@M6a[o%>-@](۰ L%}(7F!yZIX(4>ܺ>$]r㑱?Wg90튬9?\[t_7%ܡư]>Þh#RIr孀$W"J@~; h]D A$E簿Qb#> ;#q._83^닲I"Je0x3DGS$6eH y/STXZZ" I8LP+BdHq]w4MFjuB4j*띮$)z$^z=4dS=yuZ2+#RhcIl.Xڣx.pWq6'VN6GZ-mC\ OHƃ7PUƞ`2} . AUL4&Tro$T 65;S5].${|pQ2Ŷ]Pe&m!Hkr`1 ]rQ ӷT(@Z`2K]Z8 rd<%u mg] v3G%U%T44 D/=0{ IDAT5 +Vidql)(XQ .RG,Tr8#c!U@bZ1]mm,VSkЬ39SaS2|8 ?[NCU&#1tфU^5y$G#^I2!G/kmd7LUJ_Aoy%y5 M2Uh$nn{tӖ}͓wwؘ>cXLu`V\mj%Cd|QdeOC%I~ƫ\̣Uإvp'r3 ]#(t]#QdiINAoFa@q((&ڶu]jJ pϏS>= 1cdnn`0$1cl_|gϲrw,LQo^n\11ciWΝ;|_L8g^gWWWu<2CuRDQ4Q.mvQVYeU[*z2K-KXw}jG l6aÁ]8ԙ"xe%Sp?j‹wbh ('*[N#%vI*"=80vU!C N@G'eoTw(y5Qy8{KB&djS(5ŏJG{|XA0P-]6oUɍ&TO8N'yr*<1w)唗j{uܦnrqE<U@P7QeFEslsXCݦ+98uo $SN@@͇qQ9(=߄Гy ޕ?]9_ch,݈IFH'+JlD XA爀;U=]rv 9/!l, []f0׏Kgn7Ȓ6D+y|m;$EMaxZEP (ޢc#En!nٜC1a"c]fU.#f!Y$>F홼u bՖn๧]$[be^vMWpޘsi_6.NKcq2<ָVp;q;iGi&$e&&ݸqЮy t۠%oLhy5 IaJBE,,,SM2oa,lPܷ E$Q'N9_y!O̳{QyW;sVdt2+ Ch4&H$ɲ0 >p8daaaٖ'Jye(~0\YeU{J*],cOj Gf6_aՁṆz窒t /չm8& !P۰ Ar gJ"U#YG \X»?o<חVok f%\ji_a^[)n8ՇX+K"jʶbzTA!&Si %_0wO}.IȎ76+Zh 23)e$_S$H%Y+j$3)>:3<9%CKZfRג*z uɽ /$l3܅B$p5,H͗^sԒˇJj trwN  xSa+u{ӥMă߃i۵ZTK?'T ȇVIr,Sڀs,YRrb8/"?OHEZZ&KG98K$n>{~^+01Qx͌:}?ΫL]Uۺ/Nֱ2VF񒷻6F_g<yQǘ1- O(VԭsfQ;fغMC{|m%b1ǔcF0FáGUV؊zBy :Ln'_J0$I&Y"O2# A>QMµӧiZs&JQ(rj$IַxKTq5O]T0A(Y2%\8sc'ǁ1 b{#%S}#mG>.Z }Hd ժĒuTEa(d}\܀pEy\  74d[lXN֡ƞL"X AgGy#Y>>v tW:`C~O\7T%DAbyb Wm=] +/R@wJ(`vPLF ;t|aښG؊د4 <0k=eìV[O\oPb)-8y{"U!xQg%ۉrin cNݙ!94.M>?  W?PAf^?B)X3FFс@$m|+ Qw|G!6vg%ٹ5}u3bH@hG@ڦ*X,iMdP3U٠T,gUl c PuudsT3ZQn"!#/G[+xCn ` XԑllOac$?uAB{'4/QٷDM#SR%k-k$=uZ XLRC{ROțPsqmA!I ~_Ȁ@uAn: i@,toئQCJVrCH yzCsV޵$sa6!aܷAg[MWYmluA^i'L_ /2K(0㪄U^$A{ݧ~t2@K'zR&ct ?o;q)z7ސ_(A'JLU*$6Y83(żj;,)z?VIUVYeV<:\HXt8 wamck7ۆ^|~mc5nC.\-q8;XqTB7C!a.<cw81 gN*ʌ"l5X aTS.Qn +'Wd]}BN 4EpU2+|܁dZc\[D!:ܷ5$I\@[%]0+&'ebWt3cJ c;_Zja$V^ZSzu[0 a#'X-7&8% H!DH!?ұN`o˯1 HHםI0Yݧ3kY0Un  @- \_WVd'sC~MNKjqُ3wE3}Tɴڃ *MKkO̠,WK{f&K|ruP06OF0kO?3W3,wq c@l}DɇVUbJAz;;`ǶC cߦmge7kn|ėG>9 ֱiJB}_%TQS)*# $ C5@Yf]^'Jec_`d!j ;V䉒eN>ެHs*_%keo7mg<OT{}ߟ$ JuMy|If~?**yUVYeuJ` T]X{Y ν<1F֮/>Xps \d߱@߇ .\TJfG28 Nmt=$O!.N#^G;4 =BͅN-p!#@f;bx@mC0WH($BO?)O4=5V]K*2 OoN@=dvM%,)Vd|JG#IvJ扺WS633#{ikf| ooZ .-hךx!E$b01]SHT@-V1 (pTh7r-6]s*Y 1bV VZڷN V1XQ Ws^b+Hg6X_d%gdvۆT 73*6Y]s{ʀ-춟iݕ]u1!ɜzl?gV =dS0~EZInد:hվ2W0$ɘ*C|vS GS}!Kl}UA@E"$OdY yۓoJeB؋M~Pԧ>5!?,vM$cDU`DN~0 z*T yjKEb[m9r~r>a:h;>!4eyyzNV^OǾS-,,i4i:Y9)~?![2d/[Tf)*yUVYeu_U$Lm( >(yt{QgkJX\hCG hp8+"%H*p Jl6BkYXs̟!HƢu|O)B%$A;疀9E>#e} 1W$2!?$:ZE]dZaqQdG*8*{bE-yq nW=(3OȊcVv` `s; ;!hIKwM^Xj y#=V$_lxd6t\_׾-CL8UO",hKV ݅19oH \q4(Bں݁XCq4*X@IE&iVLH~ޣ׍ZIRa;L$AeoLB/_%B>Dǔ1r4E";1sdUD$arqKS$ɝk"/gKRmmݸq'OWj$1yYo .//O|D]ݖme+J ~;w(1C^ay3x~ۢuv &p88YosILy}ۼa|_=l_2l6vԩvMGޞY11 f!J.n#{{{d۫[6!X-ޯU$eUVYb?"Z;:}#kk~F_fr:%H2D@(x L3`ԁpl&pS LHd}+CPAa!xe 8iU(KDmrHW䵵3ۢV`^U8TD0CU'w⦈!0rCx \H|cǝW{ضXlk%Yˬag|v{MJk_cVMbH0‡UDXŖmdڰ|yc*8wmI@^X`RD6%I?yĮ^?ͭb3r~B)X(I2,;C};=ofH7w?#El$J t:ts!6t 1iy>ؗj:C[m$ɤ6!1_җG?( }VdQL X<EEDQO.{{{t Yb>;vlAR8,9%MV-gf4M!IlĶfHCiJߧMf9٦01xY\\ _B糬zVIUVYeU$ooǫu贁̌gU80z<(Fї7dp}JЌWaۚY#p{pnI%`|T!M6] IDATfJԮ=_xqA'K\ 2`"iUqUi89֬ܬ!RzRȘAҦ! pZ2\X3gpƈ-X` WW$BB} !w Pڕ@t@RGW#Xfۢ`|SEU6 %x5*qe2m%|LSke38l3+K ɲ-ۮ:P8NJl@: HkN nV`iy :bwLګ@ahe_6*_#."o70sI`noڍϗJwvdqh"1%(AJGަFs?soB@f !Zcf5cܱ ;$k 6lS42S焘})I0]e< .dn2V22cǞn{:/cI"T\/EdN9|Ac@\$U8 I28Ow:,zjFA'I Ci 9b/wyG $Edmdr ]KTj~z=ZVǏSiZ$E}+W%J%m6OU<3Q@ aٮyQ%˭rʹu֭]E Iػ8$I$OO?eUJ*]$ygjm ]?7/`C3 oISl«bխ| Jt<4N M n+pg_NpH\JS)N$|OC_ o 70x]sGu:CꟀD- 0gJՁ8O302oّg+*ZeQuUdMTx Qz8= EGr#pRJ<$Ǥ-Ӳi*u{JvD2QrTǒa\ӚhH'"! b4sVb&w{J Jy7e2o6O Oj?bˀYq{e8' Q$)"Kn޼Iݞ!Iw$+$IӔ0 kpHeyy@^J("JWK-"j&I2V[QM$v8$|v3}BT*h4hL`0֭[;-$uWA;B8؅NIIjupS`5S[)RJLT'CTm ?qG֝T 5363󺡨\Jk: ~uu]嘥b3>B !x=Α ѵ~%CjT"87^^,qtDZD,?\,B &{Q < ?mb& YaO 7D!Gl<L{Aۡ^4 i^{V7*1UQ~Y̫ar'knQnF;DdcesxUC1ccG^,&I1{;c8f6'Ũy2M_ԺMP^!k!y%A\˒=sylPae@vCHo7? "i * ALdooǏ%I0smmPD؏ +"H$mu߫Ͽ?O|g@QiZhq$ a#I8f8NhDVcyyPDAݕ} ۡ^ f[g3Hy5Qvٜ!Ic`0W_ȑ#,--T-~ yUVYe#;W p."1lİk?Qٞ]9d_uW RGA@6b(ysbH5$N5Ce!87g49 8&^-_uLAJCTAU]%#C+z\q mm%E 9#D C!?lG2OXJ.K yC{PΗ~jKMmyUv y¡nwR, Na1Ha-51bjRp o9m $h޼f}OS$0 p`@¼ѣGIl%KJV}hx<֭[{~v IzpH^ljh64 *?{cyrT>}{.Mΐl%ѦfY:YN!$c0Ma KYX@wm,KRcٲIH)qstK]:MlB[Uun>ϳ_e~pOfyy WMUW]uU|o—&7Ɠ5A]؆ Uz-CtYwsRi(vSѣzE)m +ć|Ύ  ^$m=P#F>F9rBCv ك'$2n]o H+*m˙dx` 9!`hxaҏW$Hq'% 8 ك+Eyib,TK6^I1c2<DBO7D Kh}xcaME>P}2ks[CٗOT&wZU$w߶h$U s?gWM΃w9ΐ$GLi 3!K&Il"%ax+,:[uqOfaa8y?y_EO(pxxX(L, -f(f$h4h6Z-' snݺU"i4Y݃x\"EWT%f;l**EQEMUد1k(N'Nni%e<2Iz:uPm몫z$I]uUX5IgHm6o`Bl  !pRӟ9pzMxx>8h_-_C[B z7=,Aؗpr,eArVAۈӖ&6E# :lO } ՚ r Y*INAsQl"iK{Crq @/2*m8[l( 07e \`!8D¢I!BPRp'=Lw=k M oAxY(}y/Lw~RDUAْ>$$0H!^pq^ߗO?{ # B,Qpߛ[5e^'a^]ߎ/98q>lQt!n…5&2ar&I\hy{UxNj3 ͓g6 YD66OPr$2Q eb&\%k_i;7/ǫ$eZs e>q&$<>rb7a$ml@`;tU$Tݐ:6Ұӿ69pݪ$k\!:`:G'ﳷ\"R&3H`l@}w׼]d8NۮVU0q8}4VNy$_"FDlooەq3$GfY5"ĻjyW}P(> c\JQ_)0IbKb$I80z߭Bi%5[nu:/i#<\oJI<Aa4rrꪫ>U$uUW]c$6Ws(t? 0…*HlC۝+z AP@{M dlԪ 8wXڞ\S݇&L?/{tN"ÆgUIIbZ`ep\ڍ}KK;0>gB#$mdUlrĴj+LfV{>~[Cd`!:6m\7Mgȱ 9(PÊ1הCw (;1ՙ&HPv-^3n{Z6}Z}`7դRas$p<^oAPm@biʽ["I<-uttT "J~~ 15R, Q*C6XsDz-;4 0#MhBP!dSOjՐH%aa ]$cœ>cFPK mZ.)^Cޕl҅e&NٷK2{JV,!o1jTxG}OɧT57 d{/*~_Y@r Ik֟9h*^V`ztGk?jҧNE!rm) nVK[HNMؐ`G.[ =!G֑N$VU$/ 7LU7(!FI@ڿNxQa]uUWˣꪫwTe8ePGA[{p5xޔ!yMo <$2!@/1ІsDx}}߼<  ! BG1/(eضI2uH~IV( 2YiKO=Ԓ)!z F| R+!l]^$|N@i?l*֤Bp&䁞S,oQ)Fp!XiwF$ 㿩=% E_; IDAT+T ד( @aL3z-c $sO2^`i!> ߺ\.rp?k>W~/vV`}xDܝQM%ee$_ۂ LBe0ڶ2Jf(Y0m0`z[`ڑ2Q1!GVU%6([fq;ݯli1ڟ1?nffd82Ha&Is * )rJݗk{X* mGi9͙Wq}{UV %AP (4M#Jܠ*¤hO|Xp8,ӧOT_ ߜ۵ ]gUmR5؋jY\\,$U>H+_ U{=vJyDQBM><<,B Qb9n[$4M rlr)VWW+'IBy^:_ ~sÐ`۷yɲ l%L=yUW]u~'?zg݃ Y\a!$?;l\I-8wZkkwU&pnڡdd!$/ԜǨH9$! p|`YS? `U!Iy(ffo G )gƖE3!@w3l)`XH{fԄ,E*O/;*(uQ6ܷ-͝!`y6+t:25;2D5FL`Lc뎫I(Gks#g+L؋}DI3]C)Q177[[[Bm5(9::*2L{; CfVQPegg5?Я"ޮYfeT"J( :y$sssDQ4?80[IbgxDQٳggM`aa ArƍʾvsQf[]loojcvԩRq׃!z,czDi:E;fɉ' F"&Jꪫ>U$uUW]cAԳoރ0 8Ux 3+>A|SI2gMFfO/BD~/B^x:5ak] +e0 =6WmV!YנÐ^O #JBV -lb!/AI!\]ŶC$?/<HvHb0Tiʚ)aE: 8ϯ3:e ?ܫ:yɒv,B۔YY&InoH[2c5T'5oj߄Bܳ}Wsc@%,슅Yfly41!z/P̚xb.t``r܂I`. BmurnS eМXmљ nU$i0Fz0Qcs-foh 6 0Yb&}UsYEd7o$޷U?/&:4$AE&o0:3ȿ9me7I1cb&D-Re5qVS؏9"UJym˯XԺk; O}%ɼ;JA@""(ڵk4]o??7:ޏ؏MW!1vV3D|F G> ]cSnt:%r, %!H@&4lLF#FQqNF'O$IA :k4_5IRW]u>aY$?xq%ldGO !z߄хO? kbWD z=l Oz{=8h@pCkbH" <[_l^Ч_UZ,:.{Pe_Y#\ir\AwUis#OINGH։ ȗjH@O ?33Wem'@tUS00;[ƶE,ܛL6\C (Z3Mμ1xBœoE Oسx :^V,D o! !Dؘ uAmI} X>7;3:.=m%09;6 &mצv&n愫^f?s匉*4w 8$)]U 6nȔ*MTw24z@ ̌QzV9kk bȶ2eFoGYl/]TʺI{lhK/vl?E̴=i]uUj$yok+ CXm q"I GԷ`^5\̄ ٸK6 Q0`+֛A_=a5B'Cș% lO6I_-|bϥ"=؄}T׷!\xW5uG^Q@CxX "5aj6Jʉ[zY"{U;)b5n*57`GrEH>?T{)s s4E(# 2گ(H`rX4ĄK TQge](Mg~ (61dx'2,^gQ*f i1a`B\m-#d.lz#QtntA2g";g`};5w{'[Ϻ$v;,$Ê%~mH{ƾm޷lZWM$9ؠk1 I[ 0fyɛS97OU 7jont & 1O9 g-L{5rd^m[c|6TH :7ۧ.f~Y$Ɔ|w6&od'us n]I~ tCyOOP "J0$I n4-//ggǜA z-bxo,l%M:VA6ARE6y3EJ_m WUb4- /,% 3m 7Aلa$b}\™3gի\z"&I 1an_uUW]_uUW]u8~/jC_\0>l(Ht\ OAۄ|ꍇiC+ غW:C7U ˿?f [?-VzpQBX{_[rH%W(歃Qw/ǐz^fek&Wl崜Wv[6 !? `7 ?C-{]S -ɲ]ݿfٚ \A˥FYvi<8ȎBԑ>6&{Yl`͕1/߇QvǀU {9#iC'cf2#Ϳ]%qA `pjKp^gwGk d (uw|$VUmc5bJϲrɑ2a+w^Ss$ jΡ>[ej(1|3; }ms:`VՏbʪ(L@ĀKDU5\Նݧn6:Uy*?}2a*clu\%/w I*_=S!;0$sJ*v{huu&2!&V-_ckf>̲2̖h巷uF K+~|<E"0L{Od8ʨA%ĄghΈΏ`jG9Ucڕe)vXP߷LH@4L^gg:  [z;lA꾼Eg-{D=bAx0&pQT:}7&B dMFZ܆/6k26`IpYxb.]+mP.Q s3>2/-}|x!\TeztFkcUJp>T|g1;o6Y2bZkR& 瘆l?/66׶P[&mWu 뵶97m" w^ׇVmŇ_Mqʘ r#x}Бvh- U(xݕTbs Y]]e<EQ7HZ[m|/Z6$IB(Sl~ϛop802$mh4P*mYdhrU^ -6V11Sծ$zuu|K.U%v6ѴՌ^z7̽~^~eΞ=ɶ2z}UDyUW]uWM n9~I [.2gGC;D)>:=8kDjٕ%5}}W@هd[C|ʄ,B:KUkb-Q ^+P9$p_W"SGx󅱀Oٜ^E*fTx'Ʋ@3CX4T"Ag^{o #Ď灿y[ZFznC!F~&LlV =v$% {8!6^^6kU\W'KVզ!m9or<ڮYbB|b}blx,mQ:. QR1k*PAdRC$dlM^~zg b3G_ W&Y$c;34V~6OzX0&K.8B&\\%HUXmTEU q6I]O DЇg}n&ۚ]j@q|l`߾*&,3O(7MXf$1m28舲i"(dbeSEPUYU$Fm\cY(ib+IL> IbB&6eEӘZI:~G[RzB-qxxa\ݖ (ah$LlsTH٤Hbe IDAT$Ix>aү]J7^]>:3VrVD}qAkCp̪$IhZU?9::b{{yZAl6 +)CEQb8Uq#<"ãЇ VoTYnM-C~tI1y78}t%Ab%n1N0}]uUjNX$I]8=q6UX.t27L,?0$ p@280 H<x!#^oW E >ۆ|GAMW ..1oBQiHXDdPuDW B$=9DpStQ(ёc^ ʇl</J!) MxLKaU)d=@_&P u䋐uDMQnK')}ocY DI Fc6?Q2fQ5=\ɜ)0EƂkPɢ d2(_\Qsg'c>2xE Lg jǃdkq=9 O@yR")1PLT&pTٿK$$^Pf03(C3-}J$x)%|^xLQ&\{0[d!!eʘ|^_uIpzd[B{N*Fׯ_祗^buuu9d%F bϬ׾6Ȟ9GGG JJ{1[ᰤO}'[D/7߰UFIh4 ĵ2y&y裏Nʂ&Lׯvm@Fae$wnNS3rjwwm<{ƍaXd$IR6KUb3}C=4JG>R5hkCfYVR$=9smN8ASMmM}>vيꪫG]uUW]j_oΧ.pnmK;veX>"υMJ(YoBg!6Q0e[hlB7WHbH!e]hg@[RKԐuOpuYljs.MU˧5R@.%XˎX s0JcU~ %`]oEJd$cUd Jn J^-U2҂LH/#Vk[lAbeǢ|IGڷ ^%n믂wd߉# bBsб&[ J,!@g(5)d\v$e6{x磲Xn :pq&[g8wНC&ԚNʱ/ם"pM$I)ܶ#2[:cX|XAδRFadT(l%y?^׭Sdrɏ1e۬dF[l ~ U)@VhT-o̶߶ܤPɱZ4(I`bDlEmeVv$,%cKX#s }f|CtCsk:::v=ɓe~ 0 KYVhuUW]Iꪫ;8?M>3 .\s?kF؃ [p%8B*+ہB/Cq/U0jXB ̋cNt@y؝N#hBj(&䟿1d䦒# wO!YPlaDѐ?J$L|bCwHP'b/6<\dO-Q!&C؇>e8$&8ט硂濫s<‘\sxȶuyM{]=_ XP-XG2kr6MX?(bৠjsw>m.Aճ!-۞Ȅ`y@6??yoLYYH5ퟦLz%3MKOm>>\ȝC69b+2\VJ!BXeH9ŵʘ(H"1<~\{n*@{3&Vd!IB}̱*m_IdmfyFPT~9!VΔqs@ʖk>:7JŔdϖN6IFIHb<oiK( IBj}6H01'O֭[\HpX?8;&CJc;;;E_F#<S$Iab[p&I2'jqҥ.]D畊W9^ * 9\B$I 7sJ|_-wDA*{E)л me/u_(ɾWLɕAj37sUR>xY3}E!<)N+k9 10ȹd9:9{#6bDu!ad 0!‘rX` 8k#d)Q_d+bm1?VX9!K h B3UԃHU&ky d*S%m(+DM`Xw 811Z5yT% kEhdL[d@|SJPoKf6Z}y$. )mf *n`gFJ$1DkL|U,Ͼ܄p%rK]8yR$1kȔ$I;sI WA}f͢vQ䐉UQ4$aU fm+0f~1$ کŌMX?VEsPI0=G43RL[1nV)ke1v5͒!lY\z-ː$3 J6a2 ׿Ne4 X}̰%=pfh4bkkӧOT!IЇ>ٳg?br2 8<<,Ȇx+Wm|2?cnH!iB[q3??O>N9~v] w5p!ysLdJɐ^l6kVJꪫQW]uU\5IԦ-|7a}ZIb5 q<}/}PH?P q乆pK0e:1vO/N:CgMh Nv%?XȉL/~Y{j@$EQG҅-|{硁QI؁<+bGfaA Db =5+38H| J t%,G &OH!-r,5r #!d3_>Cc7$=R2J^.\`A-@ yMѽ2m$3"!Wq]5=^ ,Cw{;u]#@c;|:G2氙[D]w?wQp!l6_2MTeJj$1~l(#ZM3met~BvtC\ [A3'>7}# Av·[VG@!UW*f_(n.9Wo9+ E?:hgg8%H 抔> .CjľK/}_y^ay^/H  2{K%"fREj(ðDt:4ի/2sssE@՞˗/α_VΉ!- s&f;^51iZdYFö  %§*{1r6pm<'秈ZIRW]u}Ы&Iꪫ5IԆo==l;ϟ~2ڇpa6^: F=^EX;+\}˾+@:IaEc K5P݃Lr{yB xѫ/yZ=0y[{'}<w$> B>9_-/ H-CpHAT$:I*䇪Q0WP $$_/Ti AS_y,| فfmCQm15D3ئHX> ЌGd|]DG3{j6/`&$ !yT#*X CPw65잵9vY[fpQJJV<`~tޟwg0J;99%" O>Wy kˀ8m$:Q&H\p}ipw лđmdvM!\O֛· &{uHY!b.~YSkb#gy4- ҡy,c:&vƊj2ebw8-GmwkU"IfC1UA3$c+$"JΝ;ŋǼC(1dBIVL XŹ ÂiY٤0 x9sLA`y}FIk1 x' `aa"H7ǽr Q177_۪}>aH].Q2+4%"zSꪫG]uUW]j佯7krw/Ə!tnQ x0yyH`4C<mC+0xD8>&( $ aR$ۀ0}UliŒXh Ok\@ޑ6($"3y(']e|A!';T bi'beF }iIpz%Z+G;`,m!LB T@fxM%/{y#{ -'% >S[ PȡdMdtLv87"xn=ZEj_:%GayU%-붷nKI$0xUݮ:Qľ؋ѓkLl˷SG`CRe$l}QgǛ, ct3!l";jP`!25 .QEV0䀽?&BQpzN󮲆CD̶)&vNjW䁘ڷ!2!v=|#}i5f0MZ`W}d+Tg/zKlCXqmM[I2kMRV@u,%I]w4TVJiZpFz=v䮲2 ÐW^y tI*JT&<^<+$+++%Ƭ~MӴ2~V^ǩShZj,V`0`ww)duu$+ysu'?i,LY}N~V[n̴&f] K}I4 qMUW]/ꪫ~I.lzCll3Z=~ʷ_G}Xl HC8א)I@PeVUvBZp i v|2VORQxb6&7TI ,(Q,Dm|!:L@DC}$ <2U{@S <,Ă yo3!.)dt/ Y"@cMHn.lߕFyt^!M=ɕ1`v(Y'GfHmB3mCmBZ<%U_/'^|um 4d$<%*cyJAĹcU$9;7Ţks iwg]$1y EmfrW73 nHCC@T ;?l? [Ipµ|ʙV+f:އk2A1] {- p}c/̏ M_+Xv=1zӐ2Aw{M}v[*7u-ϲ(s.k*@Ba=XoRd,yrt3lAA*A Ї$V,AlSևSS`:aSŜA"#QP4T_cU蹅-% ޛ牭 >j5M}ySsM KwE23 P`_!$ь=}%rr!i1ν2= ~[Ͽ)c%U8Ag}O@@ \= ƐJ? *mס(dLѾ oCҗvQPXn%susH²h^!=@bBxN^2:xLB9kxW`1tw׵k Y }EnWa]EA/*{pW+I +zmNH,Bg#xP'Led h]Nr!M$~R0u^ $n v" ,+,8o/ք0!Ln ,aaz'U͠x`q./j0g݂$3_^*+=) IDATz= Hኔ(hCai2P±~dؠnlk2)B+"Y $4TwWWeU:A 0DF%/'ʪCH(y@ܱL D:j >sUS96>Hr=:-YHX!ׇtU#j,w!uR%]QP&S"'qw8,tV[ \sLAhC\N ُ5k;MX DQoچږUfǺ6z8ֺ6Pl1QX!"skSUMu]X\W6J;O0#o& CZv[*&,H,%iYm|v[HjdqkL3o2IjuńFBpv~cxHFRwO99bð 1f{zLFa{nv(=Q fbޛGaHF|fIe9RI4W >/Я)REg{{sUCUvΕ߳U$4)zsI(޽{y$IX\\̉}Fct:hp֭rUW]u=U$uUW]5Id-,`O {{+LŻ_|Ţ`?kj8)=Q}f6ׁ;E+ ξ,{=ȁ(ERWH(_AJꈱkr\`$!AnKFryEy%`Sn:\.d-ž Z(Ɗ9ݓ~Ɠ8 FbXueٖiXJ%]qMZjOb%i d$jC6>+#RDِ u'1न>\CbฒOr23;#jMڦɸxv&}͇d ɚI߬<֓WdlK2v~1Doe_k? B csߛ*ţ$#&(4yeyS3@Yϑfݲf;̓r:Sdz=E>OW]r :_Ku! lLuE$/?_A@ucG|$|2dDE2ޯ9S&WBJ*bŒY^}ACs"7U&ER0r0*"1$CVZ|ԙ$T>\ QbW~ IP@ۀ~9` 2NIFq $MSv:u^zcfIbGQ)I(ʉ*ei󃎿$1Y&xf,rY In˴&IJƋyl]Ο?KbmFn" B(ld<ӧeeg |[U)67>~}_uUW]u3U$n]~.z_Y[k{𣟀K&u!<"^|}.9X@ȅAz͆Pu@_]+!Ca=띏 b(T ?(@ K?w$+}%Mr> 8m-I+A6MHԒ+o3B:x? ؄M dosB 1$_dYYWYvV'}LCOJ{=5XHU$E8d2 `MۢVBiH LF[!j"ʔJdbsa-`q"⌂/I-[TrE@;|4{9z k`nz 쵤 Ϋ$BH=IbhcIdI [:7` >@b|L&Ҳ _w*/fՃ(5f:D(bQ D-}EՁ3,{ a>3;*3$$WTLݖ"Ib1&'槴}#5fL}jHnmv䈭<2$g[9D WDEr neb3\^k[y0 Qjie$o ome{[=b+@-w_VϪqUf9XY, 0baKM>YJ>b%e)>U/zUϧ.ЁMQ y,8(De|)Oi>G-$޻0g LWkuDm8- 7 ]W` E^J8 q[& # /%ǜFNSXT4 fdrG1|2M!ɂUuQ`.},dJq_Tr'Rl)t]&@98K:2k_e)^6c|g8SO=Z(kI_C \uXuZe3|K>kE #Ib*hg`T?LIb+ oF~%-9]u,&c#QVǵ 4D'dG$՗?O?6C2O*hX=ݶɉI}]RAUd=!}kUVߙ47nmEuKeDe6`u媆?F@/k!E}~am~Uݫw"Q!J )vy5vyRuQbJQbOr;$Ȇ,rl$Ae^,caanf&l ;Đ%v& Prl8qby*/˴Hl$In߾ciJE8VVVF\~|[ekssߑ@ꪫR$I]uUC.[w.}}mzo.=D}lgZ>\܆۰1>O`)`M+ >ᖂ9":@(X+LZLdY߁y7n (#e!Bbdi$~I o"=OnT[+SH0߁uCȞWW0`O+w"`/dSl2AR\?1v@wUrAl3ly,CN$ݞ@w mwFbQpS}Gh蘿eҗ=p=aم̝an_λUw4)Z,Rr@A?>5?6d9Pnh n ~CVzgoHVr<)+޿VGK?7ugfGUu+ˬNf;,h;>)flߩ.kO6R11i9ƥ6R{c& Mb!gl2|q*[HBԃ%wNyia+'LU%UeE[!JL$98o23!h4d!Gl5Q0gaNɒ Vm!uTVl۰---U.7@zo}v] j!I4emm `2pԩmf~HYIr…*ꪫQW]uUw\5Ipj\S/ I1 >/=i&%T8XTMYtV!*3@0 ' TP˸q uޒw~?ך\&IH,+F9Żm{# lq;cTnCZ!-m Lóm@{Y`+-( qa$~!E@n5ma)%69Y}N$<޶+&켎߷VZL(qej5UTU5/<6q*,X.+IbmS~_yb=<%I{Z5V-T66o+'@,˸~z޶5C̛D0([o"'u nӧ9}"d`e!I=]lh:v]PhY'k "&3S,VaK1e׿u0$믿419Qb[[T$Y]]$Qꪫ\]juї-@Vc Q+.%ކ.u[pQC#jC_` ɄpTCONDApB3FrQ1Xo}&*%>KDqT ($ Fw'[ BXTp3 sFH]! A<`~A[ɀXJH mpGe;i P3ن zB$+K JJJznB~Q|$7lAH-Ig4zM}K}p~.+7-Q >e:] xҸƭ9XQ90(GW}T$bd8TI9Q2()Lm(+ XYYaeeO&3—IyDEe C!QR$ܼy3_̙3ܿP>^ohC; )-/;v쀂&9Vpwɗ6 `R^+!Y?ӹ*_uUW]uU$. }HA'p)t\KR.p3 v\\Bq{ 4peQяB˭Ο Hn0 G2!Qe=7᝙ n־` 6$=$C}+qpIs)$ M!G@Kv!V^o (ŝZNciW6 $ж~:wms 1׊!.J2$OTqdt81# `Y.8=q!u 'T%鳳/K V\T2 VMN y_6}t<}%B޾-oh_]! w ( XЁ|3q~^~^h!%m,Z2ޕ6U6\V۵xvaF`vmT0!d2wV^QQS((\ oO)B6hR )~mČMk[A59d+9Ƴn3uMؓ}󦤢9!VU$Y}53 0::|ol7(~gY}'Uqz 4}Hw @j5o|f\ϰXf˥)ppn 3.eVڄ61L"h*vqQ,fMӒ}MNqBzW i HނtAB9 f]yd*v\Y[O y6,0ƚkn< k%-*_"'.pVo^1$Rl.0ԀcDidc+΀h}lCxWG%RGlBEu7V}mBP@\:׶\ ׊ %IM w\,UJ2ib)EŴɀU"<0P{3/|MKm$nm̏ yVzlIlbT-Ϊҿ3[MR&Ly(+I eH/#`)]A6d_|/< ib\k[ p"VFbf|jɻXonΝ;9shR=G Y(q^{58رc9y^]R]Ej=IJv$v (c C٤QA{}Zj%ANa}NC 21boא*Il6L&5!J; )b$ǙN˲ꪫGj!Q띯:4]B' ]`m ̬fi{M*Sb{E$ /i{v? +ªCX݄ȃΪ R! e5maqQ{擬+_ Cis=He f4/d`R2Q qņ*Cf!呮(*g"6X,e o6{<-Y+0@&c+Ɇ*isw~Xh۪eU,6] Oʋ%Gf7Yʥ}S\&zૂOɹ@Ur{M؇-Q'=qs:^V[93Oʒ.psVx=$q!]hC53:*F(I0QPp&Sljw_jZR|媬X2xtu y PML()oo't| }f4(οX2"%mip͜k#$qwB8pJrj̖ʾ .gy𘗡ai%$Hm%IGᅎo^c-l%ӈyb60lg?Nnj+!lSx˹#qq*!\65ݟ6f[Y)vM۴tvf6!gH 䔖,Xr?aӟ5Q׻^L8è1ֵ79}>;;;}|qt:ImCaHժT%h4b8)?vt2Ă!~Y$oWIR8{JJ{2Urh<-us˰wBIo|Lt:KTwl6sj:QGDЇx&}Q)>d[ )ؙB L=rJ$mH|Xd7!oCsc/ m}!Oڍd?^ qCKbӦn?i6h;(H8)G,1V[#@QIwDrή!Бf_ҀOJ҂5u֬]HjzMX5n'}1[{+IruB ki6(, }ݖynUTvHvR /ؙ,蹿$]*ɕ煮sfH@O9\+Z4j&8|&pkTAum/e6.\ Z}WEU9QRߘ&VVؙ9yJ}ju^X{I_c)QcRY${j5bpWx<.a~Ogwwr9[IREN&P*rd2h4b4,,,th `%G:2$eG"GT%㼭G_ ߇{UZ޾A[Ğ<ϣl6nsB0l˕KFqyށܜꪫ{$I]uUC$y/ji^ u=V[څ^:4 $! o|ܑ/&_s5:@C K$KQ`,S>7ԲiܿaJps]|% c 4Dn4H0l7|Z nxOkfǒ&xtGA@W$YϿ*N%=By'hˎAP !yLq *EZhWlo0 X~JsjF&WDښ,jߜ~8„̲m] *u' j :#c&~$E u4l+9d?Y>E;B+=`ks"u׊G>Đ z,2Sz.R0aIgcc[jqLrm+;OĶcq8 n*ȽLjbgVP*K4;``ny$lōT\ | CΓ5+KblR!5UJC/C('+Ĩ.(\Vsp8jUy&Cgqr|aa>Mv$)#posaa}U]-ds+/:ݖQRrTQ3cU!A?vng$U[-˲<ƌ_3q+,&*\FvKT]uHUMUW]u=5IPj-kKN1=jVǗ=~NE= aw]) ~U}?DՏնd= acp:W;ʞ~E c Di. wM_7Wv,`' }!'ܖK*qJ/FxDsLߍ!= S?ΦDs⪨I]IB.@חPX <΂DVEG[#斸=PggO2VN$9)<,Ye0Tm0tY!Guiwr P, OƑwܔxœ/LV4gS'27tkcomݚ6hƢ̺9;ˣV}̀l%ؑ9:3 @me|^>ӑyjZg43к(6(-3-bTneӲ{*D61cmwf +sT`eqXV6U湝bg4&) 2sܳ8U|jx}Ō:2=UXʼnW$x;]rQcqXF^&.nݺuh;l(I$@h6,,,i˲px 6!1h(6Q1X(׃$v<(ױq(b2nO #ōM}P>' 9h4r5M$.Q1N+>} $I RW]u(UMUW]u=Iwu坃x[ۃ=spi.N t?..BUI5 |? 돑ߑ?`%gr>G*% dboK/;ꆐ99w;l9d,πN*L7E:Q+ HHn ԎvI[LUa]:-"#ǒ eiK 0U:%m9y!jCPd \&j=5$Iڔ)!q{Xójeꬒd=ͤQ@1C>$ gDm99 s%◔?jBꇡׅ]XM'y%btV[6'{Q(ILȹZYKd!Jŀ;QC:L9yZld۪1ݔ{le$F5X߂ABw٤ .S*+nU d2Ud<~F J?o{.E!Jى+锺_XU?NբnkiL~;dx#:䄳'h=σ2D؂h =$6E%Ibaxː5/+cgyrJeC"ʍž39_r۪1a~Ij]J&sS*[R/9NU3-ʓmVVv[sa>e;OڜVz~%5}CmCJsDzdĄ Faƞ )*nޮ$GF,HL|+_!97'T4x.SJ:2U 9TIOP,YEMTr25KeKB2g̏xS v`ْ)@9(F҅HU!H%X`T)ڑ݇e~$ǸvK#Xj 'pIϱkԖϔckǵ⑷ۚP]0v7뇭k 憼4Rz($RFU;:Al _2pܞ&9?PB:fĦX-x:vJyrK?Ɍ:{}+O$3Hb6l}m9?S$ZhA2+tn')Jf_e3 r0!$ه8],sQoO=ݻw}26]Sy~=Y2tr @FFN32(Ilۭe4ݻrd41}wLP&9LiZaڼ_k4Ǖ-Mcgg'W9U$e{f9qt{.^VEeJE,=vwwg/OuU#W5IRW]u&I7a|iNmxN~Ii ! vB5|Z~j CpZHQr$KE'Lb{^o(fʍ BFjA w8c(vWYO-K6 4HcDu1d]ڐd-J[%Bzd0AW@DSC}wZ>AnGwBCIEq2CZeqQD WXIbn(T2#U8cV&aإBS=hK$P:> _A` SY=?Ⱦ q^>ф`wޞ~@/:gV+x= `e_.Fع%k#n(?xʉc+5lI f>FmflDR 0!C&Ocd"| );,#k6oOy9ۤu,!3%j!lmQlběmʍՙ$5nv\DCV)U (*lXP[?A-3>UY' ^mZuJ &=uBGCMc8i3[!id57w!{Wwʨ%x<o#&I)JLn!Xvysfoo !`0Fnvi42LHӔ4M}6ul;v(MݐĘc(%/ުhYZZ\c9qOCۘ]Clp]`"o&z=|ϕ5f\s.cvvvw=\}iɪIꪫ&Isuy.$(gOӲu3R.a=6S<$sR%<#Ɋpf4m16Ct葍$yG]wM0!E$$":j$ IDATSE bG6Ab},lnnjKT]uHUMUW]u=Iw. = > ݴ_n@zpчpK- 6zkIW  'i ?Uu=]:.B|ZѰH `cb &R!pfP~"Y"38GCCE]gQPlDX2>L$I`dA,S4%䘄ǀKIo Af%UŏI;À܊ǟB6Zsу-Aһ\(Ie,Bj EQ`&7f*y|vsWӾώsZp^ޘYuH|S XŰ8$r)@gWEsK|c~[zw<\+nl* o7G;* f^n{!(0?2)Red#n,+Pի >۫`2ddkYú67eZJ Kj3FRTSĎ~O G sb8*9]$(|j!t9*v?zp,+Sc3?}L[~~DUW]T$I]uUCȵzgN.ǰ˟? ‹{pp 6r+MXMȃ_{Xt1E"achBǂkN@/JL J$gl3f!| u_kAKt-p긨Z_sCGR; V2U 5=tD 8kM}׀Q ,*KJrgfbЖgEp.6Ha1Bn M0TTa lgĂOޓ&c+Sgwue&~GrEcUp8 F@/j,[ݱ9vd_kojx*$= h \:^>k޿FT[}L7.Vy )fY@ ,92ξt0ُ W=.O!~1޷>^ªl#P83&&PH@?}! |fꗉ570n%$6`Q׿zc眔6^zl!f(Z5u!3X3eY(Vn}kpH=$,MPK!>d4#j%;+muTr&Iy^VG {YAb5ri4t ??ooߧh!UDɧ?B;s5ʃH/}KaX95q+Qv_=_ l4f`c^K3.p4!4;c )D}^XEӶ8Xᓇw,01wLU~<~_GH XigMZ Eu'Z6f5V< n,ּ 6@Ȉ9JIb f]\*l-e?7 Sjg}҃^!{WxD(+Yݖlb·_zyIC#cŽ\N^cNlՍi?}ݖOJM`_:OksPIbo*oŐmj5Ix!I Jnr@t !zF|)t"C}Jj QupZ,[ Zy(q߱|p4P={"˭/ebzJ떩޴9M2U S%KGAX¨@@Ȅ(P>R M3X>xBb ƺoD &Hs : 64Cs'=$0QnYP-'Dȕ_է <YupD1s^7هŮumkUrddN+ po0e#8U }q`m CXSU5%bk{q]x3IX$ :5N*ɜl"öWrJ2Jy$ɟG坘UHlt87yJCAK}W2m6D!d -lbiHT0Bv`ǿOrlMY2eJ*ĵĐ6IRs{_NXcP6edmb&љѩ3mFNx24|;z+~ǮVht26Hn&vQRL1LX\\$Hlp~{{y&Ip…|Q܍FAbȇy7 QO}@i^&IL8q`0cOzy_J*ļn_c5򾰉4M9s wܡll6 |'I^0)G/MV )eeFNnݬknG$I|F6GA0,߮/MuU#Y5IRW]u ;ˇ z' z߂˯SoЏ}ֶ`U!UB[Ь&Ћ+KQJk]XQ:0 u|Qq1}߄k* 㐝=)x,hvS9 |YdCGo  V[Œ˟Jw֔$0C NO֑ӊ3jyN(iB= ̑$M؉exW;ܓ,6$3%t[z@(R6^ <1{ ?rغE̯k}SJ8@1L[{CfܞkȹoPݏnwwHC3ꐃ{$l6􂞋0Rkت 0}e@|+@V< }4v+SAheY)2}#ڿcIb+R\}OmW|WWX 'fSSI;Mq&4I#uce_t(gO&6DCYEb&C@9<*q !f2l?3>OJ L&*)3JèIL2رcA@٤jDEj3wui6QPKΝ;,,,jh۴휬1}I`ii)߯ |?]avN(T):3$WiҬ_zT&Iꪫ#U$n]w+߂d$j4 X4<v5ZɆXg{Dl[> |]PP݂Oޓ&{Y1;ÕxgzO(鎂EX[*ӈ(LA<(Z8qL$ Ag//UuH#M26=acFqcK@g0ecLFgYck,K8ƸX=ؒ,bFKOWwW5/~Y_ee47"뒕}_~U<<@3a,bh8йVo@}!0}~ ƛ+Q!YUQr„x MQK2GMܚI$}!8me=~d@p{e4AɜWeN]B(\jJ=uU2saChFDj:櫅57Wdگ#''IC@QIdjl! 3id$ AT)P[oh;}P̶&$C| nYqCg}G0*$ʙ1 iWs,,?_x:kYL͕99xҏH;*S'hO:ǒ}m>ve3} 0 )mIN깄Ҧ b`Im];vOWSVIbFJ⅚Gؤ%%=_Wg%/"l(JҨJ GdU%0D!JFJ!7}C^?ϟ?,,,PTY#$ TmΝ ^'K]zJK 4 :~*\L[MۍZ&[6IbpyS^fJ3Ξ=[* *:$8&B,džCU/j؄VCY6n׃\߄cHteV5,~jdHeS+^TMeW MTh[A`]G S>RD !fZuHzB$CQp4 @63A]$hX]]%VǴ#Οl-׊\.>qoLUc/ _չVҥmUeW]ol"ms27X0r!agyѐ}!lځe0ʈxcUY>#6 CָN'ssGWqY0~6dӶDފ& ϴ헟F~vy?Z-3>o#R$$VLKCG]p1M¥xu$&׈$1eŋj5*J Ňf˗T*)%JLe$g}uٳgTp<]Yo]ix&aRIEVh7%- $y'{~ia I**HVi4loP<'pjVpb{+Ԏ`V{ҫeW# 4A*(o=Ud sO#}2$O6 s# nlR}@+$?íz QkJ}N1/*ЌEeE<<=bN]s?@cXs&އM_$q lYϛP-| b$+H1^9 xT;>?{x? \a=?-V BzȄ0i-gYrînKMj 0j] 6eɒ<'2$-;܌W^V$ R^GכR$ 'v!dN>"籵˗'_D#1 W[o]t-߭i6=!P<%HvSd7y6$Gl|N>*ꆮ$)^N~qJ~1kI=Wڷڅ͈%mHWM ÂPP8 4@ۀ{`u D3|N-H`vk> 8ֆtUV䚤jD#SQR8oڐ@uBe9Qhִ ~^r.kxvWln_R;ED'$#?N<^IT )e{>yem 偨bqߪx18j?ʚrϥDz!>f*o'Tqj>Bi2 |j ]f V[4_箪qZwVTm!sګh5aՕU$+ΐ0쿣ƣ;{'n7V .eL WQ>%>pD}82kZ}Dcn_gg"S'^ە(%I + IDATƖXf2IYmd JaB1qn7Nr, 6/k oʏao(a$NIׇؓb 1Ju' $=-u]VP+^a! #0e8$p8'J8 ݁iWEف @u"1 U~ :1pk Ao,e[&<P]Kc96neW*95\mC5o%CCMk]CШj8 nNjH&0zlHQCr#KdُcĂGLd$$ɪVl%hxJd`dI{% I1IL$ ceN8FAgUaR}%Il-[I82rHUG}$; .KI%{ !4#㩫KO ti&j9y85< UA@h#4ss6xJ_7YfͩqWҸ,-A߁#mKx81} ߼乆#^+J>V]XЫ2]!J]s t\n_H4_䴎UbeUѯUdɷoCUښbZ=p"qUp<YmX]/?2sLĒk,B۩AvBx5mXV v_)XVv`>hXѭ^pbOܱeq^$1#UUdoÞh% QDc8'lݞ.<[[Yienu.ė)FX= [ ϳ2=5;D??:)w.ɵyZn[af$Qtmel%SɏWd>QNkM$3Iv[G2əf2$=_̟I3Uw$$"!+;'۷RĹs~{`\9oq +}gAQHuTq+S\ b$q_Ab@uCUFJ&IEp8L1+Jy%F=de~JaH\N!/$;fy$XM۾0%DI|1Ņ hZr +KdFc ܬf3ς3vEUTQ7z$IQEUuRI׉]^[h#ܡDCf0߆2U"`KZ1hȊjUh dAۇ<-?b)x a)ƤvZt'uiB꟫ЕE|nOq-^XTr(%.Cr+pNq; n$2$_/?Pm[(W~l%gr(I,$nkf{UYrqިL8ƒn;Hv q >R)C>Ae%&ӊ-C!]MR>jKA5E)y!I* Ir_=kLDV6ܓ l{4y&JL|W[ey9'yY$ vc3Ib}N9a2J<0!349hAʊz~$8&0̵5JsS)GJ :?$IZMd$ YDM}sRySi,$c>Ow cW.SʼnMtTbn>)Jv It:F%38nsȑbnI^_ IbHZ1effHBIRTQE,U$EUTQI$ɋ['[߆P,V5h{`GcOu`Z@k?p%؆~ǪWGhޖmdCuE$4j>y _^O]孊'1o 4`7HwbBGT%T-hȶ$;] .K&ʙ58C' l O@vĽljzQ,A!ؒPrC\*.br,,k׻2~^ N -[2jAI򆎯.#dWr(; &HJYSW:c0-.{Y砀bG4ƿkgǙq/Qr!3ԷmhլKLA+u9a>qu}~ѕ$C<i6q%c0yidI l7+#Yg& ,eJ`k鏱258wĐu^5*lM4̲2v[a0Z|eclHG&*dg:URd (Z.etCI/%cU)1v(q&ezInRGl']Jgs,p:T١$CQײ0{O%caU,E!v666^Ě(UvyʻA~|޶#\%fNÕm!L{l5K2OY.<œ.mM*`|p2&lHߺgu$$ ԶVevW\mƲۈd'J9pT$`KYcؠv$)Hk[\k´A욲 %G{;$Og%BUEiJIb^oWX\eI~. IZ\./DƧ>)xRJ1 r sf)1I^R/ IbH7c%Jsss_GQ{wӾb(Ea{{;v`*z$)^N~qJ~)jUVpBHqAQj*0vc&^!{H,y 2P75JP@͋Vk;"OCcDbWCk@I(_dY1FFAWv;N;K t6rB#1`;8H6!+qZ|r&I(1r<"%r\יg=M^U)0MbdmU `({MxyI?f_6`$6態g+福vq<8SĶ2Zick0BT#itkٖkCR\O/j|+ҴM#$=6aϦ ZdC![ RK0\9s Aj y'^Ao W>瞵 t\vg5KMsJ,{,! LgVW T=J,Q%yHWqff)I쏼}3$Ce? ]BׯXSoƱ$؂Oޗ$qf̡,3KIdII0H|kyu.`d.ejU IyOd* el"ŋi[[[-S2c{B +b@ W\kv HDɈ!1c|!kaG+'kP_oR2ؒ/~h%vЪ[?;I{ڟsv:>?:? % ll$Y(day9.ٙ$=ٮ!Pf)I}L ( g!{LxlϱPBH$I+<'(dk[7gd$-K6e},Oyj$If\wZ}T50c')A48QJ܇pk^|.$f$ SR;駟1kim]-ir9R.p.%)ŃNÐ .p9:Dصm1n,A[D!v Ek3byvl5[ec#fipYNXoe"FEbVhf=ug'IٳgY__8h|#)NMEU YIRTQEuTA4uvD{p  X@4]8O%gDu=h4 h}Q~WAQV e.75U$$Uk;?IeB/p;%_R+axwAC`?2ÀbncJ(`Fb5|D? Q_g4G"@BQ׶<>|nW"H$Zr)fhx+^?~VE9YI>>v`0Y$tyI]j+nX㤄MYĔyT**+[I퇱!mN>MVPxeʚgϦ92fF!s~'~^GK $IЇ>T*^ /kY??ʧ?=N}׻5qEQEUԋQI>?k^sd/酌!`4Xo `W'|hrӁ+ځV K;?% PɄ-@b:qc!Do#>ysՊkQKx ,VYIM7|WBݒlTEn"HyٷH[#yB IU@ !VԨ`K/Xp$3Md5HgYJx@ := w\`IznMxNd?æq[nqōCPAB, pb7*=@4P(/%(RB@n!LABKQAXzxplGƠehEW/@kZ1|J.)nFEN_BIܮ46M6Y@?aeZuwޅ0dqqAJF|z{w }?]/Vs˩$/<(1Z$OQb%ӟ4o~Y\\>o;I0Ӿ{WYT**^Xk?6Y:1ruΞ=KV؞ih4b8"gϞ"GL{(b߾}z=n#|8%UTQ7tv[//O=.H*E?!)Ŭ2zY%;oזay:m"g*iyño*!8}J/AcGp߷8#V[4*4b@4Y`/:U#[xhD4 wJB3("ź27 ;>:ܒ'U<%ur?[5X8B*{hPyTn:./W۵-D3GdM9uNM/=Q%"D"u*jIiN@\9AĭA+o]}IYT6)9ǤenΟ΃_?'W&s8 j161׾11R"u]ƤO dLfsA~Ɍi zooo&M`$X"IIusA!GxɎ},;ˌ.f[mˎ=ͼE SԋP^Iy^ze .w3ڿm q+\ y!Kbj4R ԯNdZpܶt:\|ubYnMJ,I%JH<5,J:6Ql6gn*<${<8VQRըVA@ZMokkk44'';&F}a2.h6,,,ǽ*f\.OETuIp94 úY?˵>a  -#eLJC:m$Yl|%1dı$yk(ٛQy9%F o}gn$L^leIbcRrVqɳRu_$a6dp| N̞͐'' %k$(ɾ}뮻_oxxs-G?QO+_ o| ??/7//`R*x.ϵ|g3N|Q3LrBư)P5,†;}H7eyoDžݍdhGÅpK؃Nf4JBNĚw5Wd$4mM6pHBDM#)!4^y5AW:H~=G0mB}d8" u/sV3q RLJp Uoe^oߌ0nK8aV0;-YUt3!b/KJlzIUkHjұ*jxcٞH y)!_ӭ`,%Ivi dCc0L6|%b{g&yCmgy[=/,y>җ?nqVwEcU:u*}뺩TQb$&XeAollp!JR.gĨS̭VV[i6Lv|_jbEƾ,onbs*FZIbgss_hq>~p굣GrQ~>`J}I83*B^:LVB+>yH@ɕ-O~/o+4y錀Lќ/5+ @} n+>]ƶKpX1!ы|-J]T#o1H冒m=VdM.k} < Q\.rEP"$8g H\W{ e_m@t;1j{]fCHҧ(wJ=ʇ(̒ BX*u\M^+{ZsI,瀨pq&B}O+6߲~&eޤWW}'|Qm dT?IUƥ@{{ Cha!#ʆoe{ʳ<&pPo' ,;&{3 ;"&&LvXfI#;}Ĵ]  ,I-ȑ z^$(]0]Vŵ"?KMTtCϳ=WZ65oc3 ښP[J?ρ&wIbk璘ٷ*nZd޽OTI v˿˔$ɟɫ^~R̙3گx;s뭷ۿ}>ۿ[s򶷽S1N.]3IֲQkvƪf4]6*AVGЊ4ZU͒mvV/}G9c>-`v{C@#JӪ>!lk!)iO.ʮE _8R*PilS WV5݀WА8{. q ~OkV PUŦ> 9P^@e[2R?C;" ^rZ+DBR`Ӈ{?hz|x;bm}Dؓv$fC^(B({ذ^|ҫ%-p#f2hEJ!+n˽M۷#Ƕ?'y7.KL\6bmjiZlA@CrwC@>nGB243vWÉ|ynZ%Րʻ߶$;l$Q{l =/G&IX/1̰Oݖ$0,gڝUM82&Rvsfnf$q$4Jl߬m0#q5DT6mc̛,g5Kɑ%L~Ǥz&L[lS=|%TQ/B][% DM.0U,JE9[I8N@G}_^T%WCd3cg16{ )AbLh,䡇-oy SYj$I8<.\`gguT*T*rz߾}4͉Rt:G!c癟Plnn2 r77J$ɯʯ`PΪ IZyxzH<:VMVzUuq߃vڂ/jFaԢ$@9 y75D(i(Xzyʉ26ʼn@ } ]%jm^?VRQ"Gȇ$Rh$k.*I)s%L"')I}<o^-|Qı\ UNkPsP.I;]O2Xi{Bď5c^LCR%%g,Y"'j:8hіJJ2P rP߃CY r?mz^W \D#@<>X<خ"daaAURljn+\?K.r[%XŠVv`yZW_foL&4 `@$Ibj0D,#C2m$Y2!#ko0Z!jN(k2Mnع)4<<[)&JWNNGQqc1cƸ8l䴘1U=ʑl.Idʪ|Ŋ2ۏfoj H^zH[q5J{Y!wnDy!-3wRF,e`yQb-OQru xSRP*R(@[iGAbٳ?p]w T*߿&xzG%I0LIt]*Q177b] 프3LF}+춊*nZl7*S[V@,^(iG> O4 *6 )k0ЃPPg@^6;=w{GڧAQg8.pV'K2^s @9hF}P)`N 6[q"DI\=A< b!@3V6&+q=s"ėelcdB_g̓$O̪{H10IDΘex?uԯ2&ITI;>k;~Pa➯ir :.O _ȗޘ Q4B!υTWGjJ@%CזT#N\ uHQ>wy$ H4%j;vL#uJVűcǸxk_;t8Zl]ݢ(عsg]{NCZj|I$iCmKo}+yk~3g??qyի^5֝wY>?өɟ  w_;__+R9zhs7ԕx ؐ$< wVo!_< Ǡ ؠUX (3ftlP+؄^o P t2CkB(SH:]C`FU#+܊m-ɲ%ݾ:h%^S~!0P1PtfB!L _4v; 0k=$ż Ri[V+ښ%'}EBKZk%PR%HBդXl[&w|8-e`Cv+B20׌a c`9P.zTkT*" oW%Qr#tی rDckdIH6ů HVcs=p76MKSbv4)/˳pM(m-\]6۪}Su#&m\ǶSgԴ%q[xzpZĆk 懌DIAf൏[ĝZ*~܏B%#g0i5f>*a˵m3F"&ms ǰfP. IlN?5g|SM]䊩Y0y `)R{-~ŻIl0#ypKC8VH!w]GeTC{]jS E0۟D֓zV)\sn$V*'8G$0R'- HDa8nu sv#ՉnzJT"R&i cPdfleW:B0,BU k @F-PwVb0䦤l7!p3\Z'Dǭ28P@1%M6_&'Ʊ[ wqRš ZEɓx˾c: Mۈb |f ێGp⌼O @gL0.u`5empDGPO뚚ԁv{u\eڶ#CVI*H\od?jW>$gI0Tɑi0IJݖK*Pj8"#pC݌߁V|Xcdykι0ʬMDq$y:лLS\7x[/~{|Ӕ$VuWm\rN lǽ $nCgϞRYQGlEԝG~&4*In.~$IDQT*IAhZ%Qb7OO+v\vinHgvv9333O|Ⓐemm;v077Zr(]$k///|d4ԕ] I _IaYX Gr,ܙw.@<)/f iC2+哰wА8PkPvCz+@"ۋE龮2 HTh.2=qz#/RZ54<_y{my!l{: LcSrܝDd Uk< ʾmo"1!H¾쏮_/$S>(DC6PI!R v fufX;e%Z Z\p@BQgbEIBgu %mǐӐXU[=} :HynZ$#XYuܶKmX28ˌ% Uokr[=ַ0 5:`*bӶ0&>|kdAkO*ԅ{[僒:차ff$ U'$[)H%2Ƙ+w-[):c醶t ~\E>IN]Ib2g%?lSqZ Tu 'I(nOd0\Lxυ ɲlBq%U ޻QWFRbiD^] -F CaY̡CJo;omonnݿk!I.oT掟?:UWnYH[ݽYނ9qEDYg${Y}4tQ}{b N9D7B7/Vʃ\H_]/D]{!ZOS*C ni݈ |! r(rILb !!3`σ6D*CeAb+IN<<ג̷ܲj9Vo>Qeϟ{-IhTUkk'6Nq jrm+ou{ *{w>яvy^ΗK֞$2O%I~~||//y[Jӟt93 Νk/?y#kЇeF„VC@9׀֐r 1z8np>Q!T/ VGfL`p>eSfy `~ѢbO@ˀew^dy/=BSHnFCAUN5}]B~ǢIQ V i#7D?9 g'C`\ nn6t@B3a:-W0tΉ!9 ctYJ[[/kATu㊿$}B:aQ'$fEKxspnXu%ä5}C88:w}xҭ|$-Bz*`w_[[#7gI j(Rx mՑ+n.%,\%LfTO,QOu0{[#?!?uK6PT8ӷ0XloU{,Kb}vfmRT|]GOIr1dIS/7^ѣ,--U`B\.mAVE,1_uJ"f]yuʋ eZdZ}ݾ,i4 *M666Ju9~Ueqt1qr :-<ڊ(Ibewފn/=?l;oV= 7PQ4תM5vmE*{w-_[[_rKI:t~aȯO~2/K۬,8t.o}[jvITSW~5<g697bEMJ~\sf +Z?&&9o߂}j'Pl `(ߢ(Lktrׯ;1[* TFubU,k8Ԫ&jeX\LvbBY aB4ą(HV#X\g7!݄pJ[ib!8XR/ xd;dlLd^_J[MśQGc R >a-N6.Jh֋Sh5n u˕P d$X#FȻ䩜8$S- ebag|w[Px{u~^~Wyzcx}e?KFVS]v L$⣨ߺLwK]$LPAm4ȃ:"{h4:V'RM9$JO{ 8jSHl$A ۠oS`0%Iki*wu$zIlnnV~]OUNg}+0vm߯7???AϷ1f  (2gڝYv\cJ<3ٳxiz׶!Iy׻U'?yQ>|$Iw~pːR>(_ ?,,,p~O_277yǧn?^|_k_Zs7ԕ~ x k5K%d}ﺁka9Ǒ (dr}Q1X"aa_ >,Y!;YЈ0:?wgX<3qJ%U`6+1._zM$99iK~ZcnwE DK@*UQ :HOzN13 B܆h/X0%:")9`4vk{W_ڀ^pBYq6LTfHr; HgBD2U(oXq@EQ91(ZJXeQA@k( \2[şm9[]̰`UViY30qIiJM4eccu4n3;;[% ,ft۟$IeN.R7ع1ʡ:ĵ F8ٲKlEhX '[n?2Μ9Ck춚jmSۆ$y{S <_W.j￟|?n=>|#333|C⦛nk>яO?r[O}SISM]%ZH;C)ىY`Yo'[q ۔C\ZP@#flH[r( y^ڎ TO(n vt41;_: ~ogBIAU~f6kB8'cxZߋK߭l"d2=sOɑoÁ8 %}\ 1<',Qgiow.7b7[SX%]֪SL8SW?c"0I¨n;'M *:}Q$$ɍjoxDoUԴaI}R$jSm$ Zn*I1a8UQ|Tvs1*JkbUG ڊ$ǩS* :UJL;~_ݷm7p8(Xi}۶W*Unکmffiۭ[r'GFO?4mӧٹsgMaVwʲTnɲ`\6TSۢ.Us3,oo|nwwsW{//3M5v bqX PKp{VV6wmlkŝAg(ɠp2pC 68A8IF {h[Ojg;?!~,YzK9&aiWjk9\EVI1R"\̿g&wݮ} UDê!c5۶˹sӚ8Ts> pdpIJ%F|&H)VX8ǐ3iu!-tZлwN|M9iE%I,+JOy^'KmV+7$qA(ÐM0jUN/dCRK ?L=2..g\dq4_ceIi,$yJqԩ AOzYBPqv0 'JUj%_Q/ڿ???)'Ӕm:^`J)^ȁ.,7³ }@,#ώH@78J$'ۆdVBQ}Nʯt.!}:v+[j?UM:?Pq%&xAq{6%9b2rU!Hp{@qSÑ+Hgr'(@SK[J+3yy^l avRZD}F ˾'TBA P9`9;)2( XO5s=tE,XѶO%".Qvn.jH'nǚ=i_!֢fV+6DЛ )!^"y%7Zb2 eX(]%gҡX5TmY{Zz+W#n t,׆GsmH#m$qI+T |t.搸*(ƀzlE(iyp W 8@#oݿ*yĂu.5ӾS,)( KBo\B;r!wXqxGYn狾/W0iQf8P3f_=z8G?M.=IfXWshT$0uAua-y`,˘)CУ(ѨT#6.'|k!)^זʕiu%FcvY[)AFsw%HHUvQK獫*ipkӖe<WQSM5-!I^B)Gm:aV*ԋ[ѻݿ=^q,_]64;dqY$}g{2ceqOׁ.mh{$b5UCc2Ă_mz-Ȫ.|rĶնGqQ`väWL]LgDHsA-#oMi"\ӏk$SOqNfd%Jbʷr[5{g[c_-PGdu$ᐙJ; 377W!("I}N ðq֦jQ2qI$# 1 Ab`OqUleg_=H`;j+|\.k?[c]{}MΝ;G{WQSM5-!I^ E-sW4`{SM5uQz!Ԑ$Ƕ@ Rm$Dk2\)t /pn75檘!ETB`C3$^-M#& Vb4C;} :4NEa +Y1?Lso"7ڦy0+㼬eC ]J  D+wBP@bUb%hLŬ,o@{1 XIy!&"[iѓB0hȰ+Ǘ͞*9J~J9oٗ~KDLT8yMs~StxMMuonnWWiպ$$iZ.H^{ED:\XQRgUfq̏ A+v]UGLS0mw4:duuE:O {P%IeZv{$f. qsPrv;}L(lZ?'L:NEEbun h4|5TSMmjH:~ַtNSM]_QT6uyj*{3]\ l==皮1%1bspb_DB$ |9$ 6-D]B+CY$Q{ E;!ѪU& бلb`l Zhur8q`H&N%-=GDO\(N#kr9"<ʾꁎm`e^leZB'\) L(js?jOLs*xS%=溠pZ,b wHdj|b$1=D=b?UU'ZɴmW]9ψ};ػɽ˽bzδ{ND9aVmLqUl?;;sݰ.1+l;|k* ku!dZzIXˮ(عs'EQ?$}oK0TnŬ'>Ig$y3ˬ9ZVy|v-+w$vv=7MIr7NJA$"qsgeL;p>+^x\/Z]];'?tHSM]e2Mf!Mwͻ5B3˙r>{T@|-!=?fb5j_:-k4b8\Vvڨ6'?.K:=MږJ Z`Ƅ˭Z`] +W;CPŁaa* U nDUw-1w% KCHH,ɩ*W|t]֋ow8nd@g,B6iu985y [ߩe8KO; SA7XEeʃ.KS! dʼn3 "#w;PA4$9mHV0Lev 78P-H+ Q |@lM5$ISM5T IrԲNWcBܙMA֘X1k,hmQpzOh/k(|.KyZ}HO:2c4c^"GņXOT @ S@'}iI@F0co)Jb{Utxp(C|3)Dkv(l"Jv"$<(_i Ād A]=ׅ cDQb+L^XX\Mya=cdmL)벨8V *>:k:n.\K)gob9s>pɉ.,ۮ;Ԇ^2XLq%ĆMVe0id3&lG=ws@qע-XU-7UMW((1]AmrI $&+Ӕ%P%OiK ԩfmmϥɜc$I}r__%W]VwzXMT׆L*wu$q@h4dԑ~ERW3g0???w3Sm,I~t+%(X\\fdYٳg+>DӴGo FǪywyh4b00 Hh\EEb\MN$I*V]=YϮ]*dVY(b8N{Yb8ȳi*{ Vu3M U:m[?C?ӧjj[UC4TSM]AՐ$WV9X'7,tf4:^ 8i:cH"9 +u.5;yzj>!0 rM1pT^ 9ڡ?*N6Ӗcd0"lK3Kuvgi $9<7`?. #rȇ9dOAKoJ6J*hAq#oSZ GN ?)s:ڭ1Hhɧ`h IDAT]q/XmJr%M %wFFl{!8tH!$t'q{+DX~X^v>nk Yj˯e;`fLd{XI" fR,P Ѷ_r3=ݖQ|d8ݮUtWLuJiB͵kzKٌ/$.?w|I% o!}_2='D|n+ƪpܪ}l_W?sq͕x!G,I2p^o&rIi^8I3p7J 4VJ*EQj4M9q'Nj1??_(6l pA:XXX(~`0دUwBVwN ז($v$L|[1l?^*Fjsso~dYƏN(isP7ز,+B$WVV*-u_\B?þ}jj[UC4TSM]I_MHe:=5X:U߼pBYXqXz ]-?)`ezg;6L@Vo95)Qۛ4R%v@|uԨzE"˭YUr| ku_se 6 o@\I[c1;dq"fmN^+C0HN"my) ۄ|$ v*6"O6dwǤACvYHO;6iDJ ȗ,٩cJH>t($:r .be1tu3jfMHe;+&f-='rHNxS^ Kux(ԣp`Jcppғ"4?;on&ٿwyj`E@x#^A`.Isqsm\dwə!cʔJ60INĪG"*V^wpբ dbaŮ8v .93}NiK|R=T>R!n^k:`ԙfpkϳq_[E0O_'SaK_Mui:Nidm&ܻ}GvyFQIX VUTjn{A,.n vi^\\Tm%3)I)X?KKKS*#ZQS_yj=r,XLgfff‚޽-VݲBx1[VIt&c>,nwS$ O𖷼\n+;j,b |ccUN8<__g}}98s <=*=g2%#_>3~`ܦZַfaiC mF3,x^ YWmbHVff<Ur(_g엤b Qt-(k/rˈi܁68\멼PEGXhBix FQMA1#vi(t^y^6* <"mC h<&}S$=IBvlLo)V2΋K g!?y0F1t*b{5tC%sZsJպ \&ǺPQ!@l.' yn6cCjvB9C+ ; 0$7$7}+xa!2t<?7]!g C0|'yOJ਒rkf< y|wɎ{^7~?pn˵m"d%<ܩ/1tyخ˂m ~~|#,w Ew0m(_,8?㭓S M/o>_O.g)ʙ6U3KY2c1ѽS.YKduRM]m>h쾆>}SgːzN}Ԑ$/r]vMөl?D^D-?77FuVT $@(qpXYnnY\\PG$Z{1?%\>x `KWH#beY^G6-,,T766JdssB1~7r7åַ RV}S?SOo-wl|kaaoowȏW8ۦ$rOWZ'F l`ʴWz\}ay/Uy{36m߈XAY +y,zOd퓬Z3޶|3!B\\Mc @\>"Q$m ے+B? @цh^4vC{'䉆+)er/ |;D 2H6Й:~9qRlFmC1cHMH5d7Ր!E<00wB,d"4!9[2Ϡ`XS=, @Qh6b ore-`Ansz>~ Dcd(!Lg2Xpp%߀݅g Sp4xY9lܒe<Ҙ,I&\̼$^Hy;V_=fbXEG?pA%:v4{9_ i;,!;H_cT11`Hv`F黎>v窐r.i9Cd:uXw+NGz̎۶GĤmY\/nll{545 Pޚ`U (q\ɓ/Q[^/ZbAb+c{`LVdѨwm~v>C]󥽖}[%/mv.K,uo;ѨX[YY!%_*6k!O}2hK,\}<o~˾}g(馛¦jje!I0 Y\\oMoz~a>pw?/Uwn;8fii__C??߹1p 7?ϸ; ?'͉US IrY 4;O =Hnuly--NxFȹK6ֻ$ mou6\iXznӆzm( fSÈ<4CBI4dy!^H6B0ByC:cc(!!ǐwB̐14i҃H@sDR(b=5fIhToQR(t:fS믿܆}<,,,:s ϦjR*/2Ξ=ٳg׿c?cs=mo{.I~a?G:u}c$$IsrwƧ?iw6$ISWU5$婃[}``* ˩6K6  ِ6CVچ|.d-c86$-CD3T#c |܄{ @O kkO%`XO|1y7I(qp 3Tb.=:c+6p0m#[t=zY£܋|$y)Sc2F93&g81EFw-''eINɉÜ4od0ǜ49=$ΜV;#椣ZF`T5cmZΉMGwbꇾ š} at\ 'EϑH2J@{^,ivpx61蜎B@ȷ(T',:}!Fain'd,E ,G: Y$pD,?rݰTȌ7},͜;݌ eA|N˂{.d$qpWIRgndT4\m}~ȹrIIWpM.?,J]Ҩn=%I y1}cbUm:,K0&G{ŘxwUw|8ذa˪j$AG޻Grw뱹װmlH*0)R0S!orڅ"yCec;xڋJIQL_yգծwf4}{yZ=ocsE:&[ER&-t=Ih$Q׼_Gt!I(IV]Ir$$Iۦ|r]Otfy񤷳sN̯$Y2;;:'}?޿yLavIflEFrL&I4:wVRvhgifc[j!&2;wX,i4QTb G(WZ1u\> w]w<|s0pCpOrʂj$4 TNxJYNdCVHb!|@t*eBv& k># qL_@&CQ=GVSb ˛' ~QT SW(R('IfH Œ)hj,2`σ|F)N{ut(9,s}U#ej)]OS(;5G;pJQ&j]p \ Q#6NKmϩsŋT s쇒5_O@.a:06 <]m¸csjr?T PZі:Fmҧ$SN(r `%f eUfNCYT>$I ^`:TJYH*5Ҕ$Bu} :I$@21d)s?37M_?VR Ilc-rER?S5dZ]%3A49Mc,mk0FY0+X(yo&LEhۏ5q */G/T'4 B\.GL%J>l|?l$ttS(~u#JI0 YjUՖt<ؽ{whQ݂6Q{&PenKB~333C^'*Jl5699ɚ5k:c);6MLLLt*ZQrȳYT0i-Pz˲lLҢKO S'!߂ym2KSrJ8Xq!Yj[˭W.cr&I X,f%Grf$r%gX 7r!I4aV H{߿?~Dəgk׮҈dFA&ϧll6cL&) 8jI{-X}``c0lܲl8jK$9aÆ'x\.p|߹~zr\|̻wfll^W+ ;o~}ldcǎEˮ]kk/| ٟXn wnWĆ}/Že]uU&T* NUV !ʍp`! H֒Tu2ĄS` 93eS99A7,5lUə BF΃Sg*Řc;:>7kK`]Tmgڿ1n{׎lA[h&Z̓3o 8}rUjg6X0&O)T˖jseF}DWr&yinMIEY's咊gfnrnWe:im,os>LuI^T1ׄ4huZƼCcQwգ(kAp 0IY\ȭ0$yQXjޡ%Gjʑ$fRAGՊ> X}$&1~fZov'۩T$I[zL&&6̶0Yj\|>O.'} mcVաaaa!&G4Qd8x`LudR Tj.qF1f?T*122ҡxEbD IDAT s|0 kfo}*nݺBLIhg^WZIu\=c_?0?Olܸ|(wyg|'Ktx}r-<??׿~c6r ^{-gۿۣ6΃|fhhzO~<\||3//R788w֮]?'> |P=}eWW\tE|;gvv^<#I,go"x`yPD.rP1[Qp*ܗm<;(*93qM+UImxW I&bc5H/[8pB;qKǶ xNu*$O<m aW͕gV,2ڥh@/ƥ0J5&$%j}>8 )}b_~_,ء RhT*R Khjf>j VCNKYσ*(+(2/ TH ܽP>5$Mqa\1 :QaΨ~(.{%XUeO0 n˜bT6Яυײ8=۞ޮV|uo|,w5$YcJ#:LTXϒVa-S4H wwa枘fyxkT؉y&c`IZ};|3]sh8<҉վte.Ve)hZ隖DTew|Y(E0g1gvWAm%9%sLP %$ŧ;myu&INAI%WԠRJS}i23Yt;mey G'InfaZ'qbR@>|0 PPOvM<59d[*1^388Om333l7nafO MtA@uX=I>333zQVVr)1)8VCEbYwqG֫^jEqMh/Eo^_*8>N=ï֏nWhg׮]|__8_wuz<\q{w+~M6-?a6lSO=[Vz<?> >(g}6]wg{WZ=䕭[* =CK;xB*4b 2 t(e#\mm"0HlT9J;:lY.J,r,Z9֏lZOYw=FF|GWݯi*_ʻ$m_|_)F,q?#ʌXm`qP/: `7 (5ւQybju+IvY&qt۲S+>!'#QTrhVy&Ѧ"3X$ tǧ}vleuCtJhb:ɘȸp)c,%Iqic19i&Gz=U՘Ml @Do^2 ;by9\}?&$$K4I$9bDڛZE M@aIDk[-$!c~MK5NMFI@\ ˲ZUwymS,d2vi2ߓ"SSSq0-ng͚5LMMQ՘cݺu%s3WUVjwyGrWU7m_8-rdZ-رc_׏$Y6l?i*]*%:h4TʴmܨzΨn9m-wFW@6,ρ3Ԇ !&Y @`6Q4T;b-T&S^~VpT'Dl GZ,Fpl{%䧅9O gC>ȟ!| '%#$f,/d}WQgFU!^S̹GaJs[Wϗl-ʖH*ujJMTTJY8) bvK0 ʫv̫㩈͍ >eoro|W`~r\Vd& \ 3?BLi[=jΤMԶno"G( 1 RIR6YT9)8o3Fgp,,&L܇$d!$I1d_FrIn>]}7il?i_cܯ{\TClWߠ+ǚT\ 3bl9[9f[y4Jo*vL(W E2$%TtTniXL )IfhGv4؟dR L=UIrDAd`&4Qh4bE )):M%&Ib~v2IST}7$bdaa!&t5UAikzyIsLZMb$/ڵk)ˋ҈o[nwSث^jqM^f''';>/J|#|'{"aM>,嶏ӥ^^Pu]8 p 7C7g}%9(xk{;jeV$ye /l_苂d~ڹNez-;^IF f?Tgܒaۂ WC 5*p(D@Jg{ %=Q Ӂ)#Oe:S m`-ļ,4xc̅Xݒrmeς ܨNKnU2l@Ж:D /%([WB$"k|?lZOOϭ T=$DUQWp ꘢95# emx<؊AE~_AX _@jvlVĊ#_qKTDI90.O珡bAbWVu0c9uRh'5aE*I4hr(ئG^MFdSIS|@gÏ#$Tkk&YZKgV\z31mL+ ǔIIt%C{`l88=7i_Hs_6ދ2}|i?J^m¢d9AȄϋ /yބ#G:98+(Pc=0=6771m*si@~R&LFε^caffz`aǫD9 ǛVIՄ& |ߏ ) wSd_6}}}XDARVe͚5q_}6eٸuv^]Z:U:Zzz5y%$IqnYuB]Uzu,긾ۼy3=\ƍR,뺇c:$dyO?-޽{׾M7qP/]יJ\m> -lV^-i^:㛎~+CFlTq<?WJ*UOSf7nxC{O) Uջ},e}MzZfԗR`4'y,?Rw>\p<״q_rD2:= w ZbEBpQՁePUBm}%O[3HgNڇ C' sFTBS`@yCF{QJ Ov،(D"KSb!@B-a,y/e}Ddୗ4_kP΃~q*xPRn iXmd\zꜝujYp6 <6+R.W6)Q&\J k@+IJtZ=i[; "XL5!TkL6Hׁ@.f Ocs 2n;#DBYF4I58;Cbik$4IbDI0}-Z4 ~jT@X "PJ;|lIFD)ˤ}~`1fضݑw' ஻Z25 H;k1CܵC&fĈwZ{̾HMJT&ھ$t"Hte$&i4Y.~:R)&ů~6gf;D2(?9l6???Yg|=PJǙ:ݬzի^j%qMo6[~T*~<LLLtJSrCַ߭׾5.2γ 344Unset~lʴBK寁8C=3|"(Cϱ IX U_,jRTpnjP9e㾯ꩧA b%@(S* st_-7A7=%ǫuW4v.;;Mض Wg^51pkhMaBr9~DM! -7]p*JYCSCE<8M!D6hj?yy">*),φI(p vqu@I QjGjP5E7ӒYA8 i wm;G r Ypgx y87oP_)&xPͯiɬUȼWUmv|'JN&A0%b5>Y~}4 F_و^|E^W[z̞z꩘ ׿>&xsFa)' egWVK.})x޽{wYg>嶏[f͚2;w./;N2o}[S?~ƥ^ʖ-[ַ̕W^ O?ݻ2$\`bb}ş2:bT0ր$ S *;" e\ N w!GvJM̀/JlK{]:tN 8R3:۳B `XL 6`<Lv&YQh -nm ֱPzJb!p3!rN!7)]T>Fg~LXԱ9|Qe"ÖK+{ p!\-P3>l+/hK,qaFL4X@W,R#U 0f+l|pfakl,vWJIB*QmeJV[gw+QIݩ$qZ+L-Q-۫ca oW5ea^L7ڥ4ՃЊ)3#$i-tɐnfiV[0mLEl{n"YLC&$N5 b ~“"mK8ǠZ1v&&ڔ$XM`ٴRtX6Lo7m5J܇!Y\Rf&g-){)ѫ#*L9~;=!t&gS%'I$IH,~wrUW*I& Dk||ݦnm}2-imu 9fq\.wl$A3e9511iMIۥ6IL;z`BOO{^W+K4o;L&+_JGn馮:bRDV[4lD軕VZM;qwe]'?I\.ǧ>uK/O~x1X,r7y۫=ԫc[o|FR> G-QRIegT NIoTYN>U}[aS޼ʫjhzvǣ$qN_}m$tPnפ4Jf#$@LX ]V268kg۰3`r=/>!_W; lPA(50 E>FUYsZ>p5?iPު>W_1v!A=B'%ISl'24"qmzuWmcOK;Ru[3IfmEy šU1PψkU8FS(4|. ,, HNmu-SuA5+p>k`[!J-5|>LfAAIf͚$1 (}}g$i yFFFmú< B2ԫ^j+d2 q}u]Y{%v\r bիW󶷽=]_|#JE_ʶ}8_G^vruS_2۶m_d?d˖-  [l{墋.Zr?QQ,)ose޽l۶^%xᇗ\vKa̸+zz,񐌒 JPĉ2jF xx.x /x_\ a=gZ_:V p&pn瀠r{uylAS xAT dFxtl߷! fQSu<UC)G-u,_&ۆ0/mrlgqS*D?-oBԔԱr*/pX\չT)jET2;1J1 {B5ւaY X b=PncPu5۟Qa+wCm{P$l<)[P j2'5hm^9hYDpQ8Eñòǰ>9$&! HO)_ѩ0hiդ33AN&:-Z?Vd^^ޗo0x1eygO~? %- z_c%T*Nhq IDAT7 AV[%^l\cl-5Ì2\/Vowqozӛ~~7sQ&ɡ^rFf!_H('TmqH>\(4 (RZBSr]IS#ZІ(66Ny3'< 2^C0^WUWO8?)Cy?pyUf(8sAܱm |8v[VbϞ |k˧(#fQM w 0O 6M[̊mWFԍs.m\{tCnرIX9FڴDL+1M0$U7pyBk~$I%sW4IbZjVe\l?uߨEЊ2,3dG5,0  ;'E2M*ȳ@fOIr/ V>+ZbcS۷~)凾NG$jun** m4YzիWuaaYǎ;x7\?яKy[ SSS<|_{^W"[o%JB>?j>n%T`bbG}o??\ 7W_뙝_"<_=333O;<>qR(rllo}s:o{uT$y*pyg&''S+u0Tf1>cyؤovZ0ܑrNMU܆wPFS:9@ w3@vOb+uGSk-,3$RR"̢t}(_ Ag;:Ľ1/"g>aCe$9T܁"M"hKGT!磬gV`0'@bbc"J՝MM~LG 2vҟ}ngV׻uQX(C@˲ld xg@ #68lgB)TklrFu׭}8tZ䲏hFae*(233 xl0A Q2O:9die >ZrZ) <ץn$Ql6[6Ib5܈ڪ l6cX2> C~p9,2ۛÐ(ҲIt[zlE,(I[P5˲br$Imdi\ץP(,ʝvϘ dO sss l6}i63??SUzuh=cw~ oo>>n9yJK={|$u311__.Q=嫋/ZƳ>[gF!fUT;a k jޏWSz<xk%d8<)jba-80Bɖsׁ1X `Z(~`ӈ P-("τkKd3Jϟ+9;!A"=FH"s@uؚZ"5#U%ڪOJi%ѹyuҶe]wm Ns@LcJfbՆ%Z%!ۚ* +-I1ek>4ۭۤ$f}IN$JL&a{Lm-'ۤ`m6khۧIG"0LrcPE0YDB X4qh4iqR//骚xΒj3"-$YV+ ѯﳰi4['۶4A[F-~5n|gzzbHQF-\ 0I=s;zbD[>J% ~1[I$fhI^EQYnf3&QuV\~j5 Qf9x s]w.wUV\9.UޏO|s=aW$yysύ=uFrj,D]Pl+^g'f;MNnJᵁ)7>'/XXsn665Y`?/ߺ_+bWt=0Tw#VPXd-f{P~kc"%ޝ~}nqTvI~64ռ _m-Y0Zn yXY̫mʲL @i 1~Пjn6YPZ[Csձka͖QęEZHYi rرZWc9ddԶ˫SRcFa_]kP2VJ:h聓}|6-hZrh2-"oozEY7v!l̿f!OY,ݖuU~E+Q`lO\n9$I%OK>h;P>[8m-3GFݾ&Im?ݮƽ`,g»t8Yc$iE60LP_b_kݭ!viD~dZiHEEhL=%ɱJT#q SI$ t7nD6}?~vm6MGR Ap˲hZi(AG^oO/3$ "h)rQt#FpT$jgJ{u߹K>'w?Z'T$uA.DQjP@蟣^= B/ ķն<:jƦa!JADM)IYʰrYUU TP)V[sdeJeR1l$f+aoghh9hJ*@҂Ȃv{: J^)D ,VhP,ܮ9-cģS5)bi6k$s$It1$EziQ['+V@W@lȂHHVf \ftP`*cG#ξW.'+,I.w8@3$}:Yb%_Lny'333s?y"|B$ZЍ$IǐTK.#3(Ta4_Z0`g{e\*0ZCcUPX_$W}n(&@%VtiR^h/9׀{Z T4j) K-ĞK3 0|d *XDS& hi!9#uٞ7w>9 x䈵*=?9  .8Rj(J,!,(r sib'ExXP RfFQTR&~5#RV~e);,B!jJMeTut>"}7K&y#ftO%ƞi#[ObK[^Z9h ێ\t>R2Cjk(JEO c~IK ⒜TN2#ie0& tݖ'*# KN`k]&e$HdוwG6f&Lۆm?<$-L3?1v[q< #f=CW/Cs൲n @LPrE#tsILI$ ^k@Qbi_:~}zE|O%H4IFk%$vM4 8&r4ŗQr~!":SSS OR.Q0:Ε ~"2@[liu~չ1g}vL$I0 {$Izի]=W:̺?ٰ͛a\}q;w:WGTK6כfسgϲke zAt]՛ e nu6? TrQ0n@aHհ 3 X#~R7Rj~!#{9Zőq"#-ʏ uM8h$ںilb%T2,=3|n_[a۷u琓M'aێ04%a% PcD&$i'3b$+%3B/ߚx1d?coc~mWM;ZAdy ^c31̳g/q (Q ̇yQ+r^ `٥^>[}~e/-\?$<ĊIyslLhSҍџgafe!lq:,ʒ$yKt9rC{$c199"Ot9CX4I2Tʔqmj&'WeWՊIҫ^f=8jB ` PmXlFCOx r9d*ՎRJMBhzlժcVY &Et;<hK3^m;QNe7U6ZmG}?Ğ[ 9p *mMΖϲ4[)UIɒu~E(Kr҇BdXиQUEDPkjy`ʶXm5`$/#V[:ƴ|9D P}V$[<U($1T N^tF3MW8AX4 >6>Z8Q#C'Ph6hiFDM%1Kb;Q[5I3IĎN',m%5N_{~ӶL҃(f>GY3(=huLJr $cNi7<ҟYu6^A`hf5Tf[uLe/q0c:,0Ԣ$'uŦk;%ɾ}Et 9O#MLs=6i.G [%ؗڎi*s{I@ISO=gqݗ;\$-$9-jeY8pVgAS5k֤$i$$tm8ѓVO$UzbGWqR=TR\V<Ȳp7t=ڀJCٸdP4 ? 呥@0q@qK*Q*6Sι0+j:Rd|?tgp Ux> aG~;Xd6liư"Nʣ,'_ıCn/1mp, _'ꈢoClpZGS0P_뜭qc]QT2O+_.rj끫Q%p<yP] #jۮ6U @kw7+(RT06 c1ZJ4& ʀmBTqގj9]RnNX-UVV[̑+Ocha,ˢoQK=ZQI׍(GyzwUzbGWqR= J~FqX9S" ~l`6<eUŴQ K y1@P昏ṙ9,0Gguա#$9I *NS<(H)G5}bnCZ&G(us.;P*$Qr8v}ߏI=VQ(( P(R }T\,Luވ>4I,"J^nٳGWZ#Izի^8Ir뢋.`||#ƖZ0s~i0N6aw2&Di26VN;0܍/e}ǒ܊PW%NO0%rϨ361X( 7#/Ds e>~f9bWCό}4QaY)9W?P;ܣ߶PZJ7%քhj}5cߵ g, 9K<ϒR(PJ m1{L"88lH?9,8|_Xs=9χ4v AM8> e,fj6(=HMöZ@kIKmUNLILwdI+LUCUCj`G\G,x|d &^׸SqXZnxxp8\TqH;Y$LJc&&(QPw-%&3ljQd O6OeN+$g p,!qX&& )q`>%vRby1&էUjR"fO@e>00Oyd"H?:{vc]Fћ_QNAafz0ɠ EBݙɗ>=#HʽE<H~OL;>*m9˥%yS{inNeeUYuJ'E-8Ie/-R6qL&.ޛGԫPaed%SHYAz QLJFLȸ-~*|iOD橯~KY@'P (q~?Tt&8Ȉr,ǃ#Ws֣D/V\'gGIze3=DQ=y2LEy.oeJ3 YYlJS>'`6sG%>d}%anG Tzb``.6ns=ڵkIRp??rM75\Ïq=?1hkkK,᠃c}Yx}ܳ>/:&`JJnY̛7p8 /0W-nY!̉U Hze&P ĢE6Zc2%AH}` =-0"bwB~I% M_1*QҚj_⛁ 7(NTX;8;6[,u 8r$.Y/UoI_;pz|g `(ϕY&ܰ S&3baD1kIR@ d]|0xwU#eżG--YQܷd%Ð4 ҟq by}CNF!GeĘЊ#~' l2SoD1H 4 S4{|D|?3|Lů 4 QKN@Hp$Fr dp&e>NJJ}F $:JUㆆ!>hrf2r?qc7CQaB`9/V΃zr 9OuŎ{ E =DHb!dЪ[).D^sGp(=+]Dz*V U %:= ۀbQ8oCl(gGx'?_zV9Jljir[  1m4(`Mٹ}&cܗ$ؗ%$N$4#= (q87p 7&I$!pAh"oqwpmq 77IÏ:Q{ \SS1"?+V1oܹ̝;o۬] /}R+VvZ2I&'6M-%/^xK!?du<z){Fd(d A[$ :DrKS2n `(AAD&Q}䛁2(&'eUKƋL8&̗!'/<;TrV uov&L(g63.0, (< ,g:H?K8]w R)Mdу4h Syۀ]I)M0JKаطK|XocJFL>9HtA< )& IJmrb˘O^VkӘL.$E-d k3P DYb4yS*U;A%PQ P RYn pTG*IYmPD#)7W 8_ݡQW/"+ਧbx4d52lG:'ls9R90ۈz "Bnb_O>lgo0RDM+k˲1c%=(fRl6K 9j; I%]viSN B#վ>&.Hn1}8D>:>`=XoO>,[O?}Fؾ};z(/c۶mL>=?a ~;k׮e ̙Ê++WY|yUJĕW^ 7̮]1zV/nL<~? ,`֭6 Gm 'B((&bYB\}+ F [9IfU„%7 1S%dWHjx{N($~A˂'堦 R>+)B1'` %Z`9 L`-M;^` g9^sh7-0%F1@pR^0F Y M Bb5KFNAKYI5c' DC :cjYbZAoN; y"1Lb;8b>HvBBo~@ۜDe|mX)TNh[? IM{g:b[%׫< A!=nbP5t0OH;ҟf^.ߑ^QzZTj% ,s X$Iouww300vNJ>nJL4[jY&7p 7Sw|K_bÆ |[oD4ǚ5k9s+$=\{O+Hi>K/4YbŨ͛Yb?0hF2S X2)Bb e `HԟhsubD=TC/̔|~ɘP,!@KhÌu@/NVF:8D/@d$f AWݱh"C:(@<)!~1<ǔP P$C(Jf%[=r`bLeޤ>%';z d-|Z(O'OM&C$&cf Z@0k幜S pc) h<ʙ$>_GXN?>)JKy8"?EIb!@ՍU=Tw2IQjS`漤s~R \\-( R { ` $m}bbtaiJHkPϐDNP $TL&æM8CG#MIG(Mؽ{7drL@g_e˖UH& T;@6TC9 GyT3w2Jr\ɹ1Q]vpBBpݻwhnn|`TYp 7>3կ8׿~@.s= PSSCww7ztttT}x<|_fժU}ֲ}v֭[Ǎ7Ν;+T/o/2{,_җϒ_җhhhॗ^7u[Guw˗/C%+=oQ7V}8,[UVq'܌ivs4_k<իKrAaY~!=s=7i /D4~_K/+£>ʹ7MnF{]wŪU8c+Je555/3k,~q饗NX755}:ٳgn:_bgk/| L6^}U.$ӧȗ_~yҶ!=VCI#m^0 ,8 8Iu٦EB,1$L5RK1NҐHĶ`1II@GyJA!-Hveܗho $t^_1'Bk>QlI5izJaB3m'A%`Bu+xaZ+tZ:ϰ 酖1Sd?Cz 2A#Ri<ĦN $^q7o<͛ǷI{~s=.c,YGySN9i׿f֬Ylذ.lBeg?˓O>iDQpB.\ȅ^șgƍ3dOkjjs L,"s Ė-[DrH>%X@$c:KBWsMHD .H2dXB)Dn*DbDq%A){›HPQTSHJ#pTx19rm`ܡ @)1- ^DD@"h+HO[# ~VHR-^*aQ˱L4}!*m8_ 95C0%c]]d0t-H#m ze;$(&c)Ġ ,sN=b2!:,DFq[0xo*Ͻ<$qBϤ|ڽ(mHuSbX O\aDlɻ=xD IDAT$0Rl01j55<&xLMp>KQ*7^W, (`D7M=ӹ28% KmR:PT\IIv`yaQ"|Eg!FaNDgZqƒ<^rx_x(Z}y`0HSSϡ!;i4o=4 s]J@DJV$qF{y9'E6eܹ68|,iYx^uk7P7p uޟ +!RoKkk+>,guӦM# qwm{-UW]/iF$!piꫯģ>jkH;_F˧Ov.A9bfMsb=b!^K9u=̩aNMfZxf=} ݒ,ٖVe.v1"_>4 _2|>LIJSm)4KL~?`N;AG~(reIzٸR 4\.G}}D"0pH$Bcc#uuu9pj{ٴiS2|T5ubFCCuuu9 'X3+ʥb+9QWWG,#h'od22Ly_$n幸pJƧo|c9'|/~%7|+d2ի+msglڴKbt{.]K/Ă ׏}}}[s9o|zv5Mop #m޼믿m۶q}q3L|q?ps2pB@0trUDD"<0VϕZVv;ٰaVロUVj*9'?UV1c ׿týgy?Ova|;[n1⋉p$㏣>Ij9nxZ$&oyqiwrpvIH%:VR>k#2\AticB &:e4GG A0a^ZL/hf-haJCu ^|&~a8J}?ԁ%LE}Sk&2m LzaMt~qpI! d2|UH{nz-ϟ_QjkOܫMWlty/^<>Բ9}H*;cp8l-"@I6P(~zݛnFweCj@w}^e˖Uח$dU s_/+Hps9rJ$QR[$&8&dnah`N^̙3.n^㢋.⡇;G\tE{K_"?KCCC?_bEdc|gz<Ig϶YL/>GcjO 6@b22!ޑL bEry@LyHDD.釱[ʴK% Dbzn̖I{ vJmJ[X^#U:<)!i&=")!#RVJ sQ ghczA*jM3f5QΚeo:u,xp,1NFY H嵞Zro,c&($Q\vGү(I[eʳ`>mr}P"J &ALbaIDZ,м&"(H̜4%# f+@']yچ1  %zo2f]Y0ZOpWYݼrL]@0͆1 R3=ݥRyl(]M>¤b%hpmA!ORnN<ƲjjʧxxKt ;v`̙ylbOwTr4Mz{{+.|TVI G$`p#Jo2L(b(0H*8d2#TtdBMMMR^U򗿤[%V)&F^? cx-\d쨯g֬Y%Մ~OM PLt'!EJO J -hɴ8B+U A|NT$D2K0eCI`]4w|dBq_%-)N4ӳR ^(}xFh@r*! 2`cH ٳ@4)GHEFhfAVPe:!dҸ+ ^#61inޘi0qqn%Dvw=G㒿#&H&KiV__1{IϸmJ)6',d2i'SeR BMM LfڞA&iC `$ X… :+Op$~*T~d!bJM1u@d167 7pcدAe{$`|ը% Scᣌ|>σ>ȕW^ʕ+>X3fΜI{{;x| Ǜ㰧ʓ];t:UW]ܹs??y@r ?'[o1m49q$Zx7F]7f؛ec<h$cQGevwwdmE4hw` n#В Y"1rX|Y)5Ul ]$C\2%=RK\&C2W#e'IX@$tH" Fcdr0 fh2 BP]I솖`9x. Dg<2s`YP{0XZi?Q!{GGto`;c4!\e6ZIK1 DB/LѾ1SK`Ku]b@("7IK$*c:hr|Sors5"Q-Qx]Zݐ9$GM0g[/9Tu/ ?Du)ƙVA$ ^'AR)an!!O KZx{¤Mg$py/5M(b9K&r /p߬EpڒLc} ^L<% 3㵷6̀ERtJ[͘A/[B !qT&q@yO{mdu828KdDK@iQbȾU27mo`{c%L:,۷oU%s0/Q`0hsyLP`~(Ʀi\il (8rD1%[% LɀNBϋ&N*9 J|AwM\QFH zhZ-$_iT̗g`&~O/b5gBP+yca/$!A.y_69q0!Hf mH{>|"$=fn͠ˊqӛC xG̗2rPC$~Qp3J&|yG(")?Vxcx)P x \ ^Hِ{m0cYPtQt ]zSw.cٿ+QvAW:xz'NfKR 烃|Ğ{Up&UNpܐ^鱍N)/DQ2e ;w$P__?iȈęsjc~Q[=d(Ly>`Μ9nmaF|%/_zh9rܨ^4wr/_Wxikk㦛nkp9z-N5#R5h#r[_.\4(x>學/zddr ^ʘ1֛|g8qoX<0p)ʢP244?~P\.W*dz;0$QIyz68\FӴq*ɦ1KU<@q$,멩!W~NFvIww70S˹dr jkky 466F)Q(7swzQ>C9P(id2{JMwwʺuۙn'SO塇q;yN:$nF֭[G=د:֭[7 [u:= DQRGk֬AHT}FUU8{{SOSӦMmnݺロ~<#vil޼ⲇr<~om۶UY~$I;8[jǖRѲ[]8#^]]߉uI2]YV\UtQh7vCl[AD1?b?@8$xf}Xۅ`8ȁmQg!&2R,ڔ9;ɽ+IUe#kÎؕ.`gۃu%/@%76~xӉQ4]۳0ea܏62L9w9x<rFIPIs͠] q6%؉" ly%@Ǝ(!۬5Q,ꢻ'QQ___ ,QP4K@@EQt]/Fd2l۶ o%jD*rdǎL>6j7 >$<,' IDAT_ł \ 7pccC|sQGowg}.lćoM<O+VKmm-g+GQGْGpp8'̳>G|roٲK/h4:KdyW헥;c6x9466r)~zVXQuݱ;aOcoU):::?d헌N8_lܸqR}^yf͚k 7GI8& qGzj:::={6/bU6ȑGm_l`zm￟C9dBeپ};Gqr)rꩧϲ`:;;'{/[n娣b,_8Kd_oC va1H&K9VH{=ۑB#C51 @!84`!'~0^Yh h[| кC$[jrB⩵ f=iB7aޕ@1 Rst+/̼CR~)O%) ,ؚe-00MbGW:3up|i1DР6&Tu1`qN!fdrA+5HCr k $M脎^1$TI[ґmp_HctA{}v%ٕ$ &1>&#)I^ƻ?bw W Jws=%{8Ӵ}pel$42(>ر2oɞǖK 5'# l96@1LFP(D(*)1bTت!c%~Ĵf臨Z(d>F}~')k^i̞=}d0 t:=p=aF!JqwSO쎞nnL,<xBCCCvm\%>O)TQ[ꪫ*gkV2馛ƽ=靰V[OCUM7ĵ^[qwoXͱݻwsꩧ蹾h4tR^/AɎr6Ux&1l{~[ jB۱w<DI~`X'$w!X\l[%i)M {eM||Q{eIHϏHM$Hy 0 !ꗲR&0Yv Ќ ^̀ޒM@ItAVf>$<D;!%ٿ^9O IzH2 @ /zbNׇr]H,LYx4`6C b'Iٳ`^m!?$7rfc+Y*b{vo+cG)SX~c])џ;Guu ܆n|2ӏߍ}wT;*'0>j$ՌΝKssmhfd2xL0eʔi-ɸbz5k]&e_nd,Yb' @ `6j;߆aKR__oΝ;) ia2 |3g[VܹsuA~mB$6Xvmɺ~]׉D"%CCCӧ <˲J4Mz{{D"%R̪| o{r 74ر6lڵkλˢEK8sX` ;SOx09ꫯ_dժU,ZoO<7Xg7ߌ'\s

Jqgl2.,Ybhر 6,9Sٴi_^7M8-ZĿۿqE/ .{guHK& ֭[ǭZ}f(4ijj{NxJ7$*5S`eY%`ږjc5Th4ir{>&7nƱ?v?MxB?\pn1il2xf̘9s $]]sZQў>[M.ӾV.2uoOxIjߝ5Dx!?!SoI1S$߈يzV\.w>W2C䷷&L"^^A0/M#*d '1 E.DG#^ѶI E~5RÂN!=f tvn) IeC*Q̔}#NIkv 8 ^KBҌHvnv+y5R YH(XRw6H@7wk&i#,`C}dOmc&-[F>w# 7式n1Y1x[k \]1+{u?Jyχ,Xfx(&eY6sB10T ot84/ZޯsP [DQ=PS4z/ hO,ò,Ѩ Tb8:lüyF=&c&$p+H)&VQG{|>O85pf466"8063HӴOS6n1MO>Y{{o3 ,b>XBټU:a2? Ph!XH[l9J7iŖi#)=oB0kD`2EV\wdpx$pel9)[~l(orW¿Slj¼$|n#L}a5`ļМq|dJ&{qk{nt R[$ @Ƅz)/!L(g8=GN&p=N<]bcOIF.|WL4;/l,WDK9\ƙ3gjnn @(jDEVgzz:2Lf֋u gϞ/Uq}=ިs'܅GsSJN:EOO5Y+t:trh}L$ I2 '/| D !zũ |#_:C;*exG… 7Wh灢qdyw7U; =h\6c Y7 П| s-bËFLhMF&m/X'I-2زSq W)_>b#.!pe>{X`l3yH6 ?iD̾dZ2y`~Li22}6flUA/F2JN}2e $x1H**IJKješL@pڎݔ|3ݔ o]#6d#}'I@ٍ4D?GQ҇exgyP.V\ϕ̪SEC;$n p[X2c"Z &A&$T6;]wUU(iiiY1`T*199,5CDE'J•&jJe({VS*xG¾tbC\xؾ};9XPri2L?'s'frhQGfffhmm ]BEI>$7$B C" MdpdfӶ3Jt"xs@z)5*R3Nlj@#6g? . &N6~ُvo|Hz 6HwV4td[DD;TK!OIco*$/SׁDq~;ts+c^:[,ۘD"|G3BEIpaQB!tuuNMFD7x-{IPRˉޯ9S I %w'T Μ9D4՜sssRͶm>uGP`\zD"d@'I$,..rI(}N%!AH$Bc&8pmLđ#Gb4kvVgm&g3$X-+Rr^H`E 5Mf[f’Z!3;" O|{06`ոIrBFf#Ndl򐟵n+rB2e\)\L7"l i0k<09`3A>C68&~q8-l; q` IDqcMgg'tּyH$>}:#p!B{p { {5rr;;!2&ői1}7((~dxZ^Ғf͚>F6`2nrVP~~ܺ\nPkr}^7kI,N%qiHIJ5/7e'Ȯ8r=PP2 KR *8A"~eؾ}{w ܾ+ %GF'.] WZ儒gT%. Kth5'^ƒ\Xs8AM_0ȾԩStuuUi"E~W~E"!I" VI> .\`tq+?׹Wϳes'Iv^ m}&iR\0z7 @ vS+HV(3Npu5AƊ֭StBf8N%{y0&`E3kvYxO,Sm=m`|Zl+n\(ɋ&O&p04<=4i7H;"N`y#~~7 ~[<Fu9n'}ff&vzIlC=!Eyxu'HYik:t( % !T*111v CW" %}sܣھR.ù4.c9T*c&^O5HyObXq<̓ 3?ZijjbqqbJG[[###l߾j?9g>]& D!|y٬>|0ކk \ a Av0P,9 #fPܻݖ:q\dx6wd(F0en7w3j@? ٌiS6@|f \#9۟;2b @ SJkClĜtBqE$QH~ cI#W=*du6+X#s ʥ͂iaĖ~Rasyݭ|~Pqr32hנ.7Doehauf^!픞oqVJTȐ!֟OP]$I(:n,N8C$GQM$fb_.qo˝AZ $~JꢻpePr9P(YXXV5$>/wi W"㛙axx8q+Jj$l۶DOӺ!MD"B4[U${BK/p7IGjOYLgyiwGց`ә4j(8 F43 Q32ev2_)a22fŋ[fdr0k߻S;8H`?C:U9xV4m5R<6X\Z*L. [WId%Hq% "`.d2;c%?u`x A,Ǎ{ wu?&78IjC7([Yh"ʸ_$oZe^BN<޽{C8⦵ʉ;GÅ`-G WAt(DK%Q*kDgffd2t9Ix"455RM(qH.\@{{}̧>)]v&#D!(_A; $T~uGںL-0yl@)W S60Ud3E&4d6gc YH;2\ӱv+:VLI0|6 Y$MIq"dvSvi4EO]SQ9i2r&=am/=п`9`Bׁw) ؒgS5#RI1yȜ @;p=K??KJxKYK&Ioo/ԡ @lV;H!qC%& IDAT[Yϫm-ϟM=~F"q$ J$Jd2twwJψᄒZrBP) ŪSW+JSSTd---HAre.\~[\\ ŦGor#$B@l5{0I 1Oی>+4}H6q$* Flr.+( 3YμVB€G:ri2do1_5(A5nv/uxf >f]16!y+q_NY2m6bF: POc~n[Kpn2S2vP2Odu\`׊'Θy>|{ώ m7F}^z< z$eN.Ic~eвmKiBow}޷V"Z[[+sDiRKjWQM|Jϟ_~Dk.&&&7NO&q4 3;;4cccv{zz*J9ܹs|[eD!}!DQÒ! `Mn55^g5Ӝ ;+6qLHjE &+;ʯJFz˯sG*EPٗN~s%o̊W0ݶBnG{~Y*wgLtFG|Z$WFe>jP.A"n-OcDO3.€56qɓ'e'LR(8pKD:::hooܔsCqz %tV:: Wgggdff~FFF㋇OLLo.{)WˆBl$!DUDmF=a{pj!W!0d!p;Bfv4cKL9ud[P(0g0e\sN~?CķݗJ3}XX~*`\f{ 0nOGH<cv&yܝ}ry >=Q>8x% $!{ CL&iJ{\2?L/GϘ>>p2& r3¤d=/qsI`*CԑؘCrocs7T+T0jwm>n` 礈L2 F.\0uDٹs';vT*N{{{%D7rhY0سgsss\v3]JW^L!E"B4[A$ٶmw nՑ wrEȎq$yƀyR(Z'<;!7ӌ1gpm.4>cb| l٫.[g)N< BkrJBe]EL|u%s}0k?)g)U ,; r>:!\h.4׌[k,C}Ȝ33% sݼ7c0mԵąUҋML3mw!n Oc<I_ ET Ixr[2$RGUH$hnn*tttp5MnVǙ#322´3Jv."drIԪB*"L)J|; 7]s8zBlL$!DD~˗/o/a\!{rY^8P<;F~m@ ރf:\LlyQv޽gŔU.g{pE8Jf3L? &p>3[HI`޳&=к?W;츈ݯ m2{<-€|oAd:67\OÇ8azt ^eм<n27a"Vn#wiA2K_CRąZG"6& 2 Z?_s\`4*RDqn ..jT+L&y뭷*D"޽{ðvlj#dp?Kʲ@c!$B@lvG`aa'6OH W[;kz?g1 !϶7~' X}'u%vlócCLj]}\4δۃyS ;A-adn#\2L0~LX(¬,b% &po9%SqLLq~67mFoL)CYd#G^=ir!6ň$?rqvToV3& Eڵk϶-?㴶/d2ݻ+D"A* W. L9S%*D)JǎӇ@!IJH$Bb:Izzzػw/ǎ2q ue `(‰n`x_SF*;G+ xD!n.BM`\'[f&,ӛd4{/fxg+aDCNL Y#x~ݸf\leE(.|݈:1)6t.L^>[mDy] ANNԙ[< ?>2H(GWzc=Ν[rNI&۷={0==WU2 TjIXz"D"AX\y,..h(R) B]; !X$B@lF񠹹xW 5| 'Gb+rӐY~0XQKw,6Bj$!DEi}f>y`rM{[*hp-@XS60ev iXaseG&x߳yƩ2A؅l}MylK1R?aS0|~{yhbQXz'' ˴:Y>>i7޶cEb3yO,-5'I*$`BkVFyB4IL&kn> 8gϞՉ]5#0f œ[ ^jȉ V0xL,P(.p~`0EyR$Wug4 vFTM#wM| ]4dEeP"M|j$[GQub1"ɏ`~\+kybkHjK(B!wB!n1nPyÊ$ᱼ:@&2bS7?>q9 Qfe1k_cwAAa߆S,_n(5;MeLaB魈+ W{σaځܫ&_$`lUUC,s=duT$:P:l+vyղN$!:Iinnސ}ɘGGՉ\g|*J*ebۦur영rC/rW筋$0sunnkÕ'߆dz (UW{LT" ++Z'IOOSSSԉB-'~uV[:kaz !>B6HwoM>׉\Y~P?b 'bc`MxXyP8tr,mOWn/KLTC1nE`rc;)Dz$ձZ'IwwwlD}](" \e.tKQ#|EBQIو"C=KIV9?t~f͓w"|,/YƊ&Ǎ÷3m=+mS{} R+ȋ;Kg bU,H^P' !O_H_^ąjvBB!$Bрl4L9zK%f֛5,˷lϘ''{֮WoݶO+tXvt2Y_Z-<'Eub 0"ݘe]U2\u!B$Bрl$䮻݌~+1N{)2zHΉ$gWKJg#XOVSnkvSR$:OE+'P).!BDH" H#:I>͛o$$ђd)*%&ZW ^G`"Ble$!Dh"yl߾#G ! ETt~]&7lzsGB!تH$BDL&y[ ! $y.uBe7װn5'zK B!D$Bр4H200.]Bl)j9I DiBsֹr6A"B#D!FIq|IN:"$:L!p 8i|*)p\r!$B` [kd!<$N$yK&UqngO?EuB!nIuB4Iw^z{{xWt":ITG !IJ|N{< ?|ZԞXf2!b 'B4B$;gzzZ'B!$)T^!?uG|vZbyqev!Bl&$!Dq+DG}1Ο? ZN|C%vJ=De A֣J+m !b3 D!-a,r"IBFB<I"ÇwU !D Vv̩buGګ4F4?[~5'B!VB"B47Z${H=zT.IʤbG"v-UZfZzr![$B`Hd׮]044B.8'ɀJ$BvksfJjA"BlE$!DqD^|'uBtdn"sąK$ByNJj$*=J+l[!{@!BpCrH&&&}_-GjIDAT9Iy$Pv8dX%u2s#^KAB!VC"B47I~BJ$IauBߏ6DBUH" z$ ^~euBԁI:;;#s$!X3M ۔nVC!$B`HxwQ !DD}IG"kw>okIj č{C!$B`8#0::j !D$\ؘIM;}3wG\c-TZK!$B`H&X!XD",Yx;7I9]"B\?c"2o=m&=r!Bl6$!Dr="ٶmGQg !Zo`||MQIyN?n$Qb5nD*kٶB!6>uB4&drMuwwo>;FPPg !:I"WhauB.vכCBH" Z$MMM<\p!R?_!ZH$UD딝^R !ĺr"j*UsE!$BѠE$yS' !uH "sh<!X?~*ՙ !:!B̈́D!hPI^Z[[xՁBi e'D!X?y^OZF#ˡ2[B!fzONIENDB`3Depict-0.0.19/docs/manual-latex/figures/tree-layout.svg0000644000175000017500000002373712640746376022472 0ustar pcuserpcuser image/svg+xml Operation 1 Operation 2 Operation 3 Parent of 2 and 3 Child of 1,Sibling of 3 Child of 1,Sibling of 2 3Depict-0.0.19/docs/manual-latex/figures/tree-propagate.pdf0000644000175000017500000061066312640746376023111 0ustar pcuserpcuser%PDF-1.4 % 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream xZKW: $qbb_'_::XEԩWWKI/_ԋW+i2rR8<.I{5mI}~>_~VwT_֏ VZo͘es\e@fxC-tEV"RZ6ʇEOz˰F: 4K<\a(:*Ii؍6!uJvE]RסK'h;V̗|96%~2,i(헨k{ٜz(:avq KCTIe5`p!DeIS3ٙTsg/`_3ǧb=B/IF/\tO gȪ9 Yd*k64->m4Y7(vŹdO]RסL'v.{<Pkn%!Av>H6MK#['$A<ԏ& Q[6./VETuKh&;J*>iQG|Ft[EB$^?O/zFVM?^#?͆>?L|}[MRz17.iF8O*ǶMÍ-Q %? r stE h~@p8q|#hJIs4'HqA&%uH"V7ɢ_(":]R'$1b""!YD3Ngmß؍.s^J`]g, T}هN61Ca#=GR^Ħx^yS4m̳bA .-) cdEjIG&Eeў3P`Ï% )My1`Tg7lM9~6ŒB \݅%d| MIw(CQWFdm ee$3IF.1E 3!fp4P)":`NMs չNzln 48[41ɆA/<+@"J'%\Y4 YS/te|хpZϛ t; E =!# a:P܆KG` Lmq|Uº$4 fe/Nϣ>Nc t|DY@VVc&380 *ɣ F"S\p ׎!Y΀8@LU@.a~.VWMS5 VwFExzR(=z\W.U8^`TqgYHԥ4xzt`3Erg^|%,.A1v-^1#FpgN Av{,vh* 7+ `*kע4;!;NB&(vgx%J"6WձDVE6,\ W4 rGR*=E׼ؙR7^yC,[ЇJ S+²J1./Q-²SAsNuРA9/Lźr, D]y_MɦY endstream endobj 4 0 obj 2669 endobj 2 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> /s5 5 0 R /s13 13 0 R /s18 18 0 R /s33 33 0 R /s38 38 0 R /s48 48 0 R /s53 53 0 R /s63 63 0 R /s68 68 0 R >> /Pattern << /p7 7 0 R /p8 8 0 R /p9 9 0 R /p10 10 0 R /p11 11 0 R /p15 15 0 R /p16 16 0 R /p20 20 0 R /p21 21 0 R /p23 23 0 R /p24 24 0 R /p25 25 0 R /p27 27 0 R /p28 28 0 R /p29 29 0 R /p30 30 0 R /p31 31 0 R /p35 35 0 R /p36 36 0 R /p40 40 0 R /p41 41 0 R /p42 42 0 R /p43 43 0 R /p44 44 0 R /p45 45 0 R /p46 46 0 R /p50 50 0 R /p51 51 0 R /p55 55 0 R /p56 56 0 R /p57 57 0 R /p58 58 0 R /p59 59 0 R /p60 60 0 R /p61 61 0 R /p65 65 0 R /p66 66 0 R /p70 70 0 R /p71 71 0 R /p72 72 0 R /p73 73 0 R /p74 74 0 R /p75 75 0 R >> /XObject << /x6 6 0 R /x14 14 0 R /x19 19 0 R /x34 34 0 R /x39 39 0 R /x49 49 0 R /x54 54 0 R /x64 64 0 R /x69 69 0 R >> /Font << /f-0-0 22 0 R /f-1-0 26 0 R >> >> endobj 76 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 1512.879639 797.825134 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 2 0 R >> endobj 77 0 obj << /Type /XObject /Length 55 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.325688 /ca 0.325688 >> >> >> >> stream x3T0¢tDb.CSC#= sK3cKsKs= #SCcT4. E endstream endobj 6 0 obj << /Type /XObject /Length 72 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p78 78 0 R >> >> >> stream x x@ b2!QCcMtCxDh/gR/1s:nW; endstream endobj 79 0 obj << /Type /Mask /S /Alpha /G 77 0 R >> endobj 5 0 obj << /Type /ExtGState /SMask 79 0 R /ca 1 /CA 1 /AIS false >> endobj 14 0 obj << /Type /XObject /Length 140 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p12 12 0 R >> >> >> stream xm 1b"{_Y@+ /Xv,ķԪ~?-vy:'1_ܺ#f̔ #k@ +p %4" XJՂjU͐ 8i#f'ϭ_> ; endstream endobj 19 0 obj << /Type /XObject /Length 140 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p17 17 0 R >> >> >> stream xmK DbN`ClEsiԖ_"Fycz,(Ë ,f{uXHSDOf OtɏxcɲY"E3nTSh$)$D{Υ/9miS&>9 endstream endobj 34 0 obj << /Type /XObject /Length 137 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p32 32 0 R >> >> >> stream xm 0 Cȕ,E3B`si6QQHx$_y.}E|&2,7Mxp̨JV(8),BlfJ:b轤S%\ewy ~tܻ)|8e endstream endobj 39 0 obj << /Type /XObject /Length 140 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p37 37 0 R >> >> >> stream xm;! D{N1'06`0HB4Y%aﯤXX)J⍬O˶]+ZƂVq.pj8JQ*Z!ըpf%fR6I % %bҦ9P͔m9-~4̻[8Q endstream endobj 49 0 obj << /Type /XObject /Length 137 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p47 47 0 R >> >> >> stream xmOI0~$әt&'T˅ h/8!N-鹢nw5luE\.[cI!YqCW\H!sYhFSqHvJ;aQ%.<"/TF&"[}Gw-JϽs8M8P endstream endobj 54 0 obj << /Type /XObject /Length 137 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p52 52 0 R >> >> >> stream xm 1 Db*p؛OP*sadhi,{f=~yo(xԲj9Zr:OdQD!ƯHĚJ= ;b遼r ѰGv̄l>7 endstream endobj 64 0 obj << /Type /XObject /Length 136 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p62 62 0 R >> >> >> stream xmOI ycEu4jKr$zx7eٶgE/eԲ.jFYőb2<+)kL> X`EEHԾA{B91OQۡg%`?3 l77 endstream endobj 69 0 obj << /Type /XObject /Length 140 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p67 67 0 R >> >> >> stream xmK D>O`p ܢ=B4jKF ,|2`ޚQArlb|aWB 6C1hy7C\$ ɡXd$:IX#بh\ƈg aT> stream x흉;k9یe2=K-("mBJMQIZ^҂X*EI6eKv.gIu5\}=]ݿg47F5Jpg ~ 9'NȂ8q"!G4 dz"bc<8&[~lHbP LF!> g$rdFL"p2r,($"&.!)IH1(?/77y iD>a1I)y%eU5) *55UeE9i '@|~  ,$FUPohddllˆ266624ם$/-!"=-qD^4}cYsgD̳k9{t#ݩr1Aφ5=NURfh:{KX꺚jr'{y3MTDI\I돚} +IP\FICdݒ.k7xl޲Ǘ}&uW9XLUyl0GEOcDZqPuLm/_Ͼ>x 9|`pP<9;.;@KEV\Dd4 *FmZϞp12***y|ęGCiS=u0e44vv"IHR^]~; pjSRRn3Rn%ވuTXpjFSEܜ,v>aӟ;p9>YYOQYYYO2=7Ƶcܝ[ɊyFAOw.m2go;iO_/((,,bD~,3=59!ܱ[t.'.ZGRfjsׁco>~*miyEeee]ɛiǜ b<U{86IsZ}O7S?)z[VUSQP_W8?;+-%.DEd# J(O3Yg߱q)rޔVkhjimkRUT* I͘3wmv0Tb!wGPRI?}#ɫҪچVjGgWWwww 8yzOW{ )|D6@#DZs%s|*&1YnIEmC #c0;NOEԤIo=lD~19 c}O_Nz]u}s[GW/r}~:AXF6>bzVN^ai5%zIJYXC1oSJr2şt8IB[PRYgB׭'.JYT^։#3 mnݸ;ܜ5@ӌ?Rkڮp4f Nꥡj hO\ YB_UJ#CO1/|4OG?@ɗOnuY0CmУ"K(Z+8o(z~?!ߵu%ؿ =xv.!n<.jhڲ;WNnYe;]SN/*e:e[Й{ +Z;z*;]ƚ%Ft[jBqtu$:)#ʎlƏ ߿TkУ$"ef=l]}P.?I a0-*.d}h˦G=eZBD0 /'~׃WXVdPǴho+Lw[j,A& =,wD~q%]s]GaZ;{vQzPjJlk.<`C\-(5f֠p%5Mc~ #~Ϟ G@fA>'?uQIOʐ~dB~ܙ@VX}Pr7iӞSR_?Ouz;[>>uϚf¼^HZd7ֶSݽrL L8HE\8 ^Kޛws040瀔֌Ek\-w?EHh}aB>V*DVh)X,ݸTfqgz[y9GZ4; Vl :{==C _}$ƪwb[4C $=;hv4x6.&.އ.z_Q_}${PkJ^޿vr;Lzp!Ityp1[vL*009u +KtxPDg/q 8qLxHIvg#i^t-6O{RsWYnqX mƣ\pa C tW~l3G}AfC^H#“Dt̗z=:g &ShW'8IH߼/NSW=})쿠у 8Jzs{E mNLtOk~ki!S|N|rTŽ+ p^ S50^=~&}ă-_Rzl3mi~6ngMOT5ۤ̂Jfo'w--'‹qhu82\^j!WNvwý4xco2tS{6:̞6m]}BF{wOݸ x!UL Ax%cZxau6s[yLC׾qGO1E{:sqx{{ЇI_<[f~?{uk}ցCЃ9B*Q*kd %>1OL'hiRsMoqsw}xZ6e}kM5̻ꉀ4Yй9t܃lf]57լ1n5;jyF_f-/]:l)u˘wsƈGZ]Δyj7} lYm{frp"\>y`;ދ+Z8:z)%3 X$; m`‘zpΑ4=8"! fycK-%DC߳qg, =cHc=vr"{XD\?xY\@;,= vWLKNC]}JvrZv.ۂ{VXQ1`KmyѭnK-a๑dz= ~!o>.nhC>?S8ۚЋjNYDLJFλԮ]\WYRB Ekc=/mc1{:Z뫊{,6VAahb8/ ?4>z:[Kr2R. `)O=_L~Gn>|YTƾLðf޹~g }U)0!=+xz EYgBm'.JYT^joY"9YkȊXG <ɬ$a5%z}ckG ,pO\WUχXak67Rӌ/al74QPZ]LbXjom(ɼ!,yLe RFi,Ȼ;[K3ĝ۽u0fo9y)Jf6|OFH|UTZøhoki({r\hW{ ) l0Y R*f.tboJ56Q+*Cuۂ{[jȉ ?F K8۾7,JbjƋܢU5W uWWzy&E2== و|"*Lٲؤ^++f4CUUVT}S21g\`b=zv@/m2yo`虨ĻiO_/(,,bP~~صu,}uˢ)JZFvn ;}J­۩i鏟dfe=E􌁄(+Iƣ&߈8~pb+3]5Y}~$$7z[xjSRn3RRo$^:wHp'; cmQ27`g# ˪j.Y?БϞ}y|Dcm߸f¹fz~n7U,";v5n;>^۶l޸~*'{[j2 7ZAz<;,,)1v+WZXGZrysfi)H 8Xq@;$>>/YDBFQMSly6Ϸc43ͷg=|@&i>:v >'*L304266XG21622ם6UCMY^ZBDJhy$dTTԦ3TUd(Bd7cG9\<|dAa1q I EQEHJJ 𓸉4 08I%P&Td2??,?̎YpxV6vNH$r1D's!px<+c Apߠ~&3'NAG?0Y|F?p@B endstream endobj 81 0 obj 5705 endobj 82 0 obj << /Length 83 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 253 /Height 200 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 80 0 R >> stream x][SSٺ_껏T-T!D \E@ Q[{[A.r͝$hP}ʲ/p7"ݭB&5B֚c~s|yI#oP!8G=Q\g3}c$SU[UUx%vΝ38{--tUUMq^e}'w%˗wUU@QޕB:beuv,7h퀿[`78?l3.]$J\~ҥUUor.W˗ t5^Zcű{A7q(3Z cuuʕ?]*oWW78jb_Ǻ;l[tAoc{(ż+tx"^G|3C;lelrRXʹ755 E=l8!C525;n%ONbt;ܼ_]v$«X޵> |u _ l R`XM+/[W7N4#0 DJ%]~6<, )KA [aHbPf:9vf|^az<ΠmF\!l$fmCltuFE Ȯǃx9ccK <601p41,޹cpz8)}|M68M ܼ鑘-_$>KΨR2nz^9w-sp[7nd@vCU :69a |EdݻO_vLNsA |<7@CC:eߎxyX~&H}Hhw=;K4VY_@r>uDQwwz k{wTnjjNM `5XV}7:ϨCC` TAf?ٙllδsfuAmV2Ϩe>yC'F{d\ 4  J^9/bZ2f|+`jJx0==7#_3dz?dp:J Ob~v_z K'`F"!_RH #P2|Aګt!lP(ww'%P%kd"yJBZ<w𵍇 NUWhhi)ѽtE3 ͣ~n2Lz3.vm׮AiCo?|:D7{ޒ\8\pl7 )SYk)f4?x>Tk0ĉ_tӬx#)?0 >TVoҒf43Sh-u-yS(  VMK&$=6y(E{=HYUzJx~巇_~׿Nobj쳞*WyUb+T;F5 ymVDK;pۺ:Hzl1l<sipfv~U<X[y 'z̑{lޒX3Jmo[/UGj(C*zjBWn܀j[9(o oTÍbDW&[ukypP8O(UeS#:7Z .;V\C?5o0]w$= 8^|!$Ώ?Χ~=}6]nlGGʵ~+LiRe,\پgm=c({A+Jwe<x^L]'|߽xQ77)ʛ bU|(+F51'v~?t՗I~eG͙_ځh"eyv畤[>p'{Rg(=y7A`u8Y`m6>$NK`wKj;p!==lGG/|>h^}ے4ԋ dRuP0j9ˇmc8oPO,URgl _# v#(jxP8dٍ%'7XT SL4n_U77 XS;+""etRg#9΋M}~w.feO6KD4)VT mT„߄2We>Y,;c:`ϣ ߱3 jslJ0!f~dƼChNbΘ~+Wko۹{w :%ҙ po-c)| d/ aZVc˗eۭ>KǭQ/ -AOL,xXr Ny<+58o|(|J-|6>|t!iEYKe_E2}aeAZ½Ggd~bb~rR7{<7}"ߖ:4Ҝ-mSTVvw*gctfߟ?Ŵ emjJCްm NT=~m)yLy|hp0 dy6gI& zoo;[i?䰅tc㎕R*8ՙ pf2`<rS+?U|*xf=<`&_ϣxww&iΙCQtqюS6nlGG296CC?AK5,卡'oU߹:hT->mc{®56/L㯭UgN0b(E"h`Iճ̘zχ3e|@ ,MLȄVfnD)1#>ל*}9e1U8H/ٮnm:JK"SZ9ǎd >hBON.pԆ6)v8Wt ‘ 7v::)X}9ٯ N=B5tf>,4u*ulu&YɖC[G` ::;:6K,{cX1_{1||AͱEZ\:|8H9+US]GAڋ¹p_ GnXT8T82fb)ST3~epF`gjV.RW&DWW*Iq s~[%,U y6YGpOVә%28(KBˍ$ccKuП5qW+SthTn|''*vg0g_kɅ vF;]<^޻Wcʹ478^0=˫ՆE!/B&,,tҾ,z)e 552~BDg^66a2'5Zl 9k}>N3J^v/\gYªvrh$`~/f+*anWW1L0d/]2{^x$Յ] Ų}}T֎^nมtcc-$3VJ{~~j~0(ǺONܽ{eA{C{cGY*Hƴ$caz_qlH|2⩦MMͻ>S]vy檒VeªNys%s_mش4QBuiWWaSH6,|Y[us,h%wL9iYFCiorU'6+Z[ե̜-^&ke9Ih EőygyL081쯺Ke*m-„,O'7>٣i_xQٗhm#9}}R62411ϫe+ç'&Zgsat_ـ]]&osn[GU}Ci?0W~vBC3789FRĄPHi•+<^7z.ZC{ns[KKg,ڿ䜨Dt pi؞S >nm۝&C{ AޠahoP07@T *C{ AޠahoP07@T *C{ AޠahoP07@T *C{ AޠahoP07@T *C{ AޠahoP07@T *C{ AޠahoP07@T *C{ AޠahoP07@T *C{ AޠahoP۴tv~2 ~?TWW͍C{i812:>0׷oB9eKߤ۝6EՁ塡山 C{#hp핁5>n~eKoWW}_~dOO(=/:i 6}~[WS]}(ߟ?W36=l[[6JZ8C{~O? ''AxooϷoy}9[皛At(Kk~itt_~q'AdŻwX~&`p5;D xv5,'eH}*9VJBr *ʂ`>Sۥ͛Ihp8 9۵ԡi}?e}<١+gX1L#H_zzH!{z)]+E{N9XA\=N$pڏas `0%D88y&Р& U&8#^/΋T$~֭ej0M}4H ,JDWWYR,}Y B`N6HCޯE˱ز̷Z# GE ;,֞aƁ\eY`N ؍~6.xڕ9&iepLPGдgv;L82KkIz3j Fʜ;w݌78v5UQKYL530FV%Yz) sZ{۫RVbO&6>,$fetp`W-a?oЊF`Cly<ɣsGxR*}ll ==TkEMépJ{vQ9O'dYt]sիdlׯP( OyѤ߄yes4c ~#^.ܻW J/aOO*IB54}]ݻrk6iQ%\YuS-y`Oo%g GC  jqww&Ƀ> 7c* =FnwpXFEeSuZR<_1 TcМۅT8q.H:ʶÈ{k)f%>fY:G1#Z9|~Y_~O9$d%[ 4l8s+vYa?saL)@ Q2 86F jLulMj g@):TOYl S<8(Qҩp^{ojj*f>B@c:G[NdCGG2YgTcBᏏ/ێ|2z87L=TΎd * ]rZ£8Α󦦂כxRmm`P1oZCc1|-T0 s4qsGb82!-Mԇp?u HxAw@燼RHd:G(lu oL| ,OwzRA۶3 R8nwY Ps0[fYZ ul?8rm5uǓm > .Y~&wcf[Z2^iw4~y+x,G(p8%N\dJR M8L"eM= oI0Yk+SR}\8`K+o~gιyS*y"ϱ\9R63;VdoUV.aӬa˜ٌ㴟slVkSS ?+ uhh|TX#u 7Os0{p4#E8==AYqzCp>.ձuuT$[NGH-h?݋l=\ [e'h˶<8׷D$"t)ԗ3y joOY|[`cjm G<9K,gvg"3zz4o<3[- ><ל})aR12rj"{eop88i γrVԏͳ,O$F>kvnQ0c~ kt#dsI`&O]'%sDu&'eߜ776y=dy߀ZkتvQ {N3e3l^F~*vؔ!z W*R*&V&qV;:0P߮q4-[VouVm=gʕ̏듊"_Vw5%c?v[[K,#g{l<\gx3ê &(|FKlOM}9-c6yqsN("B5 )@Z,?{ ?TW ռ?T:)rzϜZҒcB~!eƐ7ϗ'yaJ`v8$V3#e_ŖlDu;|*5kJnN߉k8Z2]exvJ=r^]S#a# S~ab9> ںX"C/o7yL8re95WDl~W-J7猑-ݙ|*Vz=  N5#큝Q;+cheR=L%v߼Lp$a!FaMNIQŋ_DJ9vIrj- D${ Jsf'"/C >Gſj<'-xRko!'9FuKg`` RJttH ÕykF,w(ElyhΊGc_ #lc18Ep.S,P, \rKl[ʀh4Lzsc988L0u-#[AqK2 Mk5Xl~ck2z|C*ҙ_eeiljCf`!ZD@+ PϖdzuuWf>ntssΪONsZ2N+Q==}}wz1wecXX5{ua,77<iU s6SZYHuryucgg>~+vafxmQ8w$ @3ι~9:zWn N1r >b0wr3̻J8Zytv ay8y'ˆtcvm-(=oy;ts?ݩ_ K9\}=~aIfARAALZa]] PKZ ^;ʭ[uonk*CnJx3]]3P  [b^& E^J>N2_u~Gk RK % Pn ?cSIh͛ zH8ʖLwOHqC8#Łc4`0O#/^/#Fm\Riv9IjTS_T|R?J_?OكK1,h3 {J#f0Ʊoɰ]]2=B!1pI ڠAx Oį%4'G-p 9͈-c(~=H2Kɿ(eO^ f1 | eq(08-% k z3^5-)pcv'MR!بFTK.qkf9ɲ>~I5rgu5uu8 ͱK VFȷdߟopzik(Yr_.!7n~i޷VA&׮AN u* ̟9 x>0S55x"'*^|jbK 60 G/R)]lpZ\85M77orWT޸!n;YTIWU{=J|E;_fw-ͣ?gCgnlmh4]޶08]K)Z[ 92FJ(n6A\-{N#?m=:_dW^;J}<&6qcHFґ)fp *%3\k_Wzla-SFnHޖv iP' "6މ<68E+M[d#,xE!sjUß";?o< hI ~U3UU9ʹWC(48QTOp\SO۾v(s(=ߵ F[ SǪw,h>˿~f;?}x dxg%^UTwCv8β1np5qa>qwbpVq(o endstream endobj 83 0 obj 12582 endobj 7 0 obj << /Length 84 0 R /PatternType 1 /BBox [0 0 253 200] /XStep 3338 /YStep 3338 /TilingType 1 /PaintType 1 /Matrix [ 0.801594 0 0 0.800126 1150.4 254.549661 ] /Resources << /XObject << /x82 82 0 R >> >> >> stream q 253 0 0 200 0 0 cm /x82 Do Q endstream endobj 84 0 obj 33 endobj 85 0 obj << /Length 86 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 232 /Height 179 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xOSgiKK[kEeDc0a Cl8ܢSLa#es6%۲ [ gtqؖ935i˂ ([ --Pz9B z|9O_=9D H2"R7:Z% ().->ٱ5S|VAFZJށhA6cp~ciܨйJTv뱹F@xh.cN{wuغj Sɒ} 'w0^ؤݐ*&/Co,K. wX:~$$ c=F58PwEf!YΛED2#MVqrzM Mvۭ˖M\,Sؿ,~u{c\`$:P0)?{I}j80m~f`ioSf.?jr0W§/vCNJz%uҞ+Zz^U_,4= ɸ]sd\S!xc>["?@gB'47 B`G %}s3c+ [;:oxJWu@l DXQsv ?ΒjgYyw5=lCWi 醮+reOB_F.saQ'C&w;| {yh\=̫2[çu7t!hBo\HBU MWN;aGwە:*.W Si*de7<-[ p+޵[ͨS:^^stC0:ڽB KF>`ڨ=aF7vQ5p9LW=!=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=az ϗu'}"MEPWY}(-g3,Y_\xP#IX.gcz{<ݠ:/ S]:-ڃ *0^햹 ohǓP o溚WjsEQm@/xqU\{gMX ezҏ'okڱ.}.KWo"l\F=\*,0DӍxyQ4*&[g4 _t}_(&{$opy8nfdh̎FA'2?hݑ/SBgɊӏ4u 4/ }6Zxnqiz ih-ڐS"'_8g2j^4fYMm[g=e볶MCJ7F)0c}5DEsbc(Jx(6 endstream endobj 86 0 obj 1571 endobj 87 0 obj << /Length 88 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 232 /Height 179 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 85 0 R >> stream xWSȍ\dqQVUkjVUVVr IJ.I.iz|3]6V_VUSéS8pfdjWa`/S.'zv9c;6l>hmiionhh I/+y3R))$^f$  k\/,쮩hlDVd O޶yJK&lKYuW;ڛ#÷|-|tgC+\|mkn/x| FcE„;]pw7mPUEJnV5åcZZ;%묭ŎY>83uZXH9ښ\rypnzaf&[VܮRs;6M}wJq+]ۿ7́,pNuv'~hlR);κ:·gÜܒFc9?3/TUM[}2䏭[;FY_QNʆ_w@ x̪ӍffY_n݋3R_^}\~A\(> wHeOGd𙥡-[k9 Eؼ>stXQg퍍w_nU*\<koj^X \| _$$.$43pq2&f,%oUk3.=zIn~kmi++c^_Cr;jNr{8r tAnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[Qpn#s;5V_h3.;挏vJ(OLi b\>[JU[hojK&crP*{*+[fJ{c`A[*ͭBw{9@(F; [R^[Rr>6P, CyynɭK.8tԽ po&O\lnebk4^VnI;O^U{v[$ͭDr{6Rr>6Plc+VL0#99~|ltUWO,]O }|9Zf[skWz+*z~"@ӁɭS.(*V)bq# & h@eOӋ2mnU|s=UUj53 XSκ: *R^W:ʾq[Lvc^t{oȢl8;ZsKk6l@z,9y2ѝ.q/TU..)n88\R^/,DasrAE['m\mj6_HH C;; /NĮAp{s;88>i֬a܆˭H$= /-TaBˎC\n?>n[X|qVd6w;7\prKVgKb{i߼qqxpTϓ#ln@(8I 5Ж-*Dь DK%%/.L"-]g|={^XH6v$++Tc7NDO/PYy3XS4:0HJoof,IF7l,)W ƕCpH ls=at xjj_Y:h=a0?[fƎ^} h"!! Hrx,/-OI E=}qr(7DCt in=^|{\hݻ}_҇¼ٳ#G,bfj;wvj(`>ڛL`.Zvt}{6TVfsGCGNOgH54D83RII:Zio|e˼G;|m~N1D}Ж-vyfiKj(7)sJ{SMȑk׺d2ׂ]&)Q^$$ݼԪӡ ;kkKYoll^+zbJ5uh$ƞۉԍd44TU,(xN.WqZ&l8B1ykǎ+_MM>$l-,n_S׾Ϗ>zLqX3'XD'ьͽ߿q#,V99]KIIpdNUb> >> >> stream q 232 0 0 179 0 0 cm /x87 Do Q endstream endobj 89 0 obj 33 endobj 90 0 obj << /Length 91 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 70 /Height 70 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xo@Ofl%_Be#H% HTSqfSS1SQ]QSSlM cw? ܻ{ݻA vDx94T'[`8:;:Wo l<}vKV̀J"vĄXYi,Gujm%N[rRi1>:!$Q}K0@`FSrQPfq7U5(*ԔtrJ2H0Wרv"ɬ~b6J06Tq-%ݝeX^Y$2,[TbgF&x`ZJ%,`=f]$nqC̍FOn_|bm[u\*O5r #yw {3$MRg iwa-m0yC-7aJ^$&25yOQL> stream xݛKk@!o!D\t(EJ X7BXk!jyOӈ: @ڿA)6׊< \ /j0_5EXN̓pC-t]G'TJ Ev[5hZݮ.QDd^@6"t\NFWP) :0:vo#тm!BeULQj]Ej.@ܻz=lŢhTHfS輅ʌDuդb[\@]@~%(L~u&_+jKV Zm .WAeTM3, r,R|zw{'C~v-'MPk['۶Nv &#ꧼMvlxhwk;A&~JvGGu칅IdDhq(O`MnB$HHߎ3, H84"[nbˉVxWDxNQ'Mӄ-<[ag?NZtgA?.r+#7 endstream endobj 93 0 obj 988 endobj 9 0 obj << /Length 94 0 R /PatternType 1 /BBox [0 0 70 70] /XStep 3028 /YStep 3028 /TilingType 1 /PaintType 1 /Matrix [ 0.800244 0 0 0.800244 1187.2 332.157768 ] /Resources << /XObject << /x92 92 0 R >> >> >> stream q 70 0 0 70 0 0 cm /x92 Do Q endstream endobj 94 0 obj 31 endobj 95 0 obj << /Length 96 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 72 /Height 72 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xOHQkwH4T!Lq qGpLx[%3hpvbkҧL&EgQ3csLgQsM9y&d\a \"y$D|Ba qVpQ'5,Y,dm$gɉ 9AF8>g2ő4#!4_Nue]nvs+bNa?/|wGT-Wo0^SAW~eDz#}LH}N!>k{%In =^[I0عC-Kڇ*s0!r6/-Hl|j5eN8|c}PunX-+SL됳6Pg25?>@{WJ%kf_l Z endstream endobj 96 0 obj 617 endobj 97 0 obj << /Length 98 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 72 /Height 72 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 95 0 R >> stream xݛoGP!>ررds9rkonihJ VJ)w r PCj%TKwk'`'zphyoE^i-ZEVr2L S's4ΒK#~!#Bn"zB0bF(eo>=d7nw3#5O~] ӪRVx⃵[ܶӡv=_źy<{[UʬO; Fr<+ Ta*+s~nx2ʙcOP¼@MB5?M4ȧO4U?`o<0!-> %HA磁rk:1RXצSpYs9&PՊ de zGy׾'OH%)զä-ii lix킌h2& 'DL!Q< -8WXAZ()N 7ڃi5ȓ61O& (*7e}]6;y]RJ]x%\m4hQ穤어-̻ -H,[gJ4H0g+/4W3;ERNV $:'o7 nrWȂoV!ioDu5'j|~0lGQ2UT#2^*mŊn;cJAs)tˋMEqF;%Ϝ.q١W# 2hF|E9tQIԈ.Svڑ-n|b,$}_:M{\2hp:Lؗa5[Yk#M|Jj tmvΪ\BhC= `0D0q:~) 92k,6e 9,!vdCFjĒ@[irEĒrumy7nkbpآ?f%b|B|㥅bs|A>X-WI,Z*ۯ1ҿԸeO$?2`JeZGG\^s_?v%+^4>+MsnTlwD--ѼUWDTWN z_-D"G{ޛn*ʓIB0!CFiY?}.fp2"00D=OǮ{IkGM ȋƲNTKf& 2'JG ,F4뭃yd晇u^FkM3]~SF?!ja恗sn#~3Fib鵔VZu Qw 3w^&|ߧu0$)5*[՘BpL8Y^8w=1,?l,pFX^Hr4xdKm}9Ŧ]B̿\UiBV0z&@MUް;\B դ?<!*LNDh@VVj2 endstream endobj 98 0 obj 1845 endobj 10 0 obj << /Length 99 0 R /PatternType 1 /BBox [0 0 72 72] /XStep 3015 /YStep 3015 /TilingType 1 /PaintType 1 /Matrix [ 0.805049 0 0 0.804825 1184.8 332.627474 ] /Resources << /XObject << /x97 97 0 R >> >> >> stream q 72 0 0 72 0 0 cm /x97 Do Q endstream endobj 99 0 obj 31 endobj 100 0 obj << /Length 101 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 41 /Height 32 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xc`@:Y^z#9peo#1U1E ^58EG1u@]y1ne@Pu5^u?Q(\@@OAPK"c`&FLlR#8u.$RCD*Xx"'VbhDU/SA{ BOQLgD[NSɃs #+Iy_>VRP؃C`21`e*f%! $ endstream endobj 101 0 obj 268 endobj 102 0 obj << /Length 103 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 41 /Height 32 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 100 0 R >> stream xkkP~+@ Vkcn묕9/xA7ͮ\ԭM\&iRW01R-] 9P8n-˲ Æ2#yB&I+O4UT3(-Ut+ݨ,S,iL]Hӭk3" 0 Yf l;>7?Ծwz!ԫ}jEoZW Jgdu]FF)҆ZFJ$'IjEuXXԊja =o旛k+Ii5'.c6R{bPϟI/vO20e#>BN=F+^4k$2`~%|zMs%'@ {;qpq0]w>qKD8nw؛a &Uᓻ2Q0/SQ/?H@dHgvg :;6 yʇ 0 endstream endobj 103 0 obj 523 endobj 11 0 obj << /Length 104 0 R /PatternType 1 /BBox [0 0 41 32] /XStep 2917 /YStep 2917 /TilingType 1 /PaintType 1 /Matrix [ 0.806954 0 0 0.823896 1196.8 361.810169 ] /Resources << /XObject << /x102 102 0 R >> >> >> stream q 41 0 0 32 0 0 cm /x102 Do Q endstream endobj 104 0 obj 32 endobj 105 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0.329412 0.329412 0.329412 ] /C1 [ 0.329412 0.329412 0.329412 ] /N 1 >> endobj 106 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0.329412 0.329412 0.329412 ] /C1 [ 0.772549 0.772549 0.772549 ] /N 1 >> endobj 107 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 105 0 R 106 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 108 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 1 ] /C1 [ 1 ] /N 1 >> endobj 109 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 1 ] /C1 [ 0 ] /N 1 >> endobj 110 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 108 0 R 109 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 12 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.516955 0 0 -0.516955 1193.794292 331.324368 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 107 0 R /Extend [ true true ] >> >> endobj 111 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.516955 0 0 -0.516955 1193.794292 331.324368 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 110 0 R /Extend [ true true ] >> >> endobj 112 0 obj << /Length 113 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p111 111 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x N&-dB?#_"սh 6$e3$n*63 endstream endobj 113 0 obj 73 endobj 114 0 obj << /Type /Mask /S /Luminosity /G 112 0 R >> endobj 13 0 obj << /Type /ExtGState /SMask 114 0 R /ca 1 /CA 1 /AIS false >> endobj 115 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0 1 0 ] /C1 [ 0 0.635294 0 ] /N 1 >> endobj 116 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0 0.635294 0 ] /C1 [ 0.4 1 0.4 ] /N 1 >> endobj 117 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 115 0 R 116 0 R ] /Bounds [ 0.611607 ] /Encode [ 0 1 0 1 ] >> endobj 15 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.516955 0 0 -0.516955 1191.710063 333.408597 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 6.929688 121.070312 6.929688 8.960938 ] /Domain [ 0 1 ] /Function 117 0 R /Extend [ true true ] >> >> endobj 118 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0 0.690196 0 ] /C1 [ 1 1 1 ] /N 1 >> endobj 16 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.516955 0 0 -0.516955 1191.351752 332.374687 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 31.5 63 31.5 12 ] /Domain [ 0 1 ] /Function 118 0 R /Extend [ true true ] >> >> endobj 119 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 105 0 R 106 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 120 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 108 0 R 109 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 17 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.516955 0 0 -0.516955 1252.115846 354.390237 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 119 0 R /Extend [ true true ] >> >> endobj 121 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.516955 0 0 -0.516955 1252.115846 354.390237 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 120 0 R /Extend [ true true ] >> >> endobj 122 0 obj << /Length 123 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p121 121 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x N&2!Q#n_m&_ <<$IpY !I<T6\ endstream endobj 123 0 obj 73 endobj 124 0 obj << /Type /Mask /S /Luminosity /G 122 0 R >> endobj 18 0 obj << /Type /ExtGState /SMask 124 0 R /ca 1 /CA 1 /AIS false >> endobj 125 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0 0 1 ] /C1 [ 0 0 0.635294 ] /N 1 >> endobj 126 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0 0 0.635294 ] /C1 [ 0.4 0.4 1 ] /N 1 >> endobj 127 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 125 0 R 126 0 R ] /Bounds [ 0.611607 ] /Encode [ 0 1 0 1 ] >> endobj 20 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.516955 0 0 -0.516955 1250.031617 356.474466 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 6.929688 121.070312 6.929688 8.960938 ] /Domain [ 0 1 ] /Function 127 0 R /Extend [ true true ] >> >> endobj 128 0 obj << /FunctionType 2 /Domain [ 0 1 ] /C0 [ 0 0 0.635294 ] /C1 [ 1 1 1 ] /N 1 >> endobj 21 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.516955 0 0 -0.516955 1249.673306 355.440556 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 31.5 63 31.5 12 ] /Domain [ 0 1 ] /Function 128 0 R /Extend [ true true ] >> >> endobj 129 0 obj << /Length 130 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 253 /Height 200 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xWTW/A e`(C3"T)QiD ]Ԉ Q) 4*((HHE{g[k9 :FQňQaݟ~fmb~oBp3, !G4'qx<|ʏCrNK$H$>H"/0 ts' HPDXU EXHHPM? ȉ|dUBJZFFeMh4i)I qQaA~/77Lt*}d$U!>0M;0</ EL&D2UKGOȘedddh0]_W[Sc$iDGOXg8I".-4yXXZY[۰,73s4uU(sN z'⹉*&s[/^jˊ..XO.+;.]hi>HOs(X8 <|dQ)9 ]9 -wY->>~,'VnVt27>MMF=v~a*Mi6{o۹{CBBYO!!!ݵs:gEgNפKIx-;QPDJ>pu[|w;v3碢cXPQQg#N?{*Mԕhp$[TdK&]c5RS$ğ:i4$ ?/r>>Ӕ8q߶/Dk7dyɾu7+c" vs^DWM^RD陞' ˪N3gwOȉIӳ>/(,**..aE>+xavgXh=[_]A [mbl'ߺɳU5,ʊeϋsӯ];wEf5!=zGA"eڦv>G/*_74655_Vd%Dd-=r9 DA1z}G^J|UCSK[{GGgg(wښh(HRqȬeO ʨhXo+7?)~YSϲtwu57U={z1"4v)B$.@#qS4gX8n M󠠬[7=]- yY/ L_m8Ţ;  |%gmh{?YTHpoҧ7"8/C¢y#' OR>wq)+^5wAA o~gkCMYÄ́;66,ϤizUً]9EG{ ~oW[c틂"mt\` !0gM/,ib9H~}M>SAkO&HS ;l>x;5{}ӬnuY4SKYԣH^;dŠW ~4/3)M-dX>J=Lok*ɽxڥf2"|ܟI<7 ]oB"d4uUv}_Wk}Ea {=VZLU4O*h8{xaqUC[weG@ogs݋w¶o7קD?Np78UUkWXeG7=%n_:ugR?" ]N'}Lfjq v?5N7y0Hǟ~^FUmǑشgǴǾqzbDH=8TA^׏p 1mz(* `T)$}@R1۰0H|aeC{ϛxT=5.yN1tIq虍?{˙O_ַ!Q#!l)yp=%35GйZF~7QZr./ &7tma }\9O3/t_>__UZgƒ6?#^`<c<61x 1x 1x6c<c<0x 1x 1x c<c<cl$ 1x 1x g##}<`x2]_zGs l7)sCߌg,_O'h=q Zkg:^0bl\*K|n;K|?\X3>71y0]p [/zx='Еm`gm?]6bYߒbyY鏗\tM5^A8Z8{N\bUSC[ȡv=VB_jVt)٫R^6Ky1 /e4;>\Z\ jSGcf,&FV>Z=i+ ]mq AGz<kKA#x.4T za*h,t: N}iMSgA?faAXxytf K?mǑ֮1m| N8TSQ#]}J`]<O|X\?v-u/K۾&0;3 zs9w5#c {0}[m ?Jpꩠ[9m},.-+%ca$NC3ӥˈ}SOVљdOЩ +[(=ƚ'G6-4R"'?GS/(>i|!g<*EcHM/·t]4K[YH=IXRIiKK*_#ޘ落d_x:;sɲ`Cz'xEi:z= [:z޾CY!:q]m=f™`7G #  !"sGS?KSnn;0<.%qqū^'XY wJ ݹT #g_AhzߠS2rk[; ;?YV0o{ڛJo&Fpw^4[N@g4>hJfX:n KJXPV]f`-kt4Ԗ<ɺyx3}59*a/yDeTL~x̕[OJkZ;{z{YW}}}=]m- uUeeş @]^B@U|=p-QW -m]Ύ֖u/o'?PCQM?d|N."Y\cjkwXIr J^Tտnlljf]5556~U[U^ZAFZB] "<_2=3s&V{8x\|ʭ{<+)}YQYU]]TjATWUUx^8;师{}ݜh(J}$$.e&]>n.vj(;(v?LOQTכit{:{!Դk,Ԕ+τ ٴq\#-T" Jӵ X٭\3c'Ne5bΝ8{=^e|S= eY0?dê+ LUVםaft>v :x(8$Q ($$Ё{wܼaтYbda$ET5tX,ZuM[}|BB+mgh)Ҩ"רه'⹉2f 9,_uj i e,2TS%p@;|IBSV3ty ,mll@L6Vfi*t!~"7qGǎ>O".IWO7hk dldh8]_W{$icX~CGIB"2*jjSYN0*tU%9̏ô;J! QDũR24,FI LGq' HPDDYMHTYC_͎39qx7/H"XV$Er>"~N'q`h<Q>~rpp> stream x]iSIol`MdT`܍'pCem0F{TʟfU$h6`T Rɛy>Px wů$:#Bu/^k]T2|w#3J ?: }ww7C BKR]һDO9A3^#n :K)/2V2}k&=_ B+n!lnaD[yFEfo=&-+-nXlW{#FxVx06Q{5wc{ЎA@Ci HdKhw"lcnc0O{ZN~V!cD.ϧVJX+OJA<.ǎ Ej hOiYSɢȧ)J5Zcv¡VGm'2!v ~+I#Ƴ@\ †.wd GN=B'"=#^6cƢc,T>W6cT0 7壕KsͥX5bKVNh /d 0!Wwڇ. kK@l#IC v+t/,iiUŜϻb*kM*A;ּcn"hhŬkJbX`/:8Vg /8oL>4!$vRծɕ?#8E~[̈́:!8c{>ss9= kPf\sfNygL7UiI5@]_2w޵fk,6>t!S$a`w튙y8#DiG\/]3$E I@ԑY,KN{ߜiINZu{3'DݢokxzT0y 7 akXSZYDͦ:mbXseS@ޭ,IWI Q!/BKW;2V)9/6!f*oJ%IHNJGd7c akXuaǼXm(\ 1 ~Bxx;,U: !v<("?H OG<%- W̿,֟qͶ3)bPu~*?$T5>&n{xp@H#MEsa?-^# /"-%-hfV~PO4Ga֥qdgd v Z!MDGHo%z։j~W(pp1MFo,uy.¼йV|$:SAKzA"3Do 6m{%VO۰h/2d܈#l㐲Sr{!`ek9$R W6_JwҘIKiA๐چ8O@C Xf/[S?Bn>Z K#@?@ߴӃv~hf~Śc CXPFNQ!!IVl~r*'.S9|)8aD[o( B۬spvA<XXaa 3hgڙ,14+d?ifZ?NdӬx Pi ҡ$mȋ%X*s\}N{|؎~ mekn;{T"s}C Xk;NZ!=- ! ~rga?,v*Z7{+3YP &R6ӼrqJ|U:DxI'G&3Gh%#p`f~Dfn%>]p冕:hkԳ$Ĭ+Ojt><\N'(`QKc~(o<7M C$6"^W\Z<RS^y6๐3MG[K(3w>H|V.\_Zk,7vH3Q==sی󗋩<2ܬ$[٥R'%1Ύ둤G>YvKR Qw#V#[Sփ:X¹v% LqٟO^s*$UyiH O.IJ tIW o:D~bs'GI&c8z̘L nD]r&m3 %/(8}(og#擇k#UR$]$r@Rܔ+uD~0ZE8/8,^ PTs{-)i2݄g_RRD@H~_=LJXG ˜O:ۂd& #"Q䋠* 4'KЏoOJ,sEv4K=v8p^ x~ؓm>DjB9?NqkƒvɡV|ϊwx IUN~G~荬%&76Vkn,I 8=f;!sJ^A!_ 㓟S9D1.P;O""VQ&cv9oe?yONz+ %JS56Ȳ sB &;ӵ?^`>?9fec('c̣{[ے}~'!q5~F+YY]SQD 8*8I'w2­GE;0UC#v<;Oz8 !s,D%Ĉ5 A~R_y>6JQM3o"9@aC.[rKܫ($L˅?P58=PfPJF椎 ;QԱo GҘЙ81VJ/zB:HH:ԣeѡ??Px3Í`[|PFK [p2Xƙxܖ|mסJJlzO+Y7J2Vo=%z=d3էJ(|% ~:D2<%E TC2S|c[]۝_)“]*dzzx3($&%,S%o QFum%̗cPEv=* c ̒GO MsCOjP^C]=X'U4:XT6i6MR<&f+z̕ "Id~JA䴜F_R@ocX3mU}vͦ^Rw2 _ ̟B!`7Q6#s*plwcӥpY C@# :d1އ}Ik5ӃL7Ah9N3hEG(b$&ߜS^l'}/OÉ( zQ0⮹T$)e kC7ߘTxۊ _ [y&ÃVz}(35sȱMy{o~uNPhA2\}peXtG:&Iސ'ޗ#\K1J(|  ߏE Yѡ x;h ;֎yxliN朏(}ʽ$=Qb ~cOCҶƴ)cE\ AʏW /@ ]uk ;~G.~ı%cEq9"b爝҄ BaY*씍2_&XB2XZs9LT`|k+Se-uDA2αf=Fr<'Lpuvy ØQa<`gha)8\P/Ν.LeKkv2uAYA$$C5p]cC_͜Wp&>l1 2)U$ wɲI;W;cfGX f鬖dA&t}J,nUХ1_A'd#4dAA gP 2d6C<$EH -W Lx+*zi{rI2tirRC4U)p歐6A-%Oפ'q" TaIDϢ^mXT]{pz21v:J(\*'A9PpL7= YarZUdA^C˽~y[ܙ+#g+apy/ӵ9r~"$+yaT<$g1o(0CL0{Epq}V FPARwxD|7=5cQ6LZEk5 DdK{Q˚0b&>)\>{Yrs|VV(BPE Wu9{8t(Oq7"c 45ts 3B? xa mS.9^"t@H0K,mhu?!< eqgw}%ҟY+NjL96G9< ݵ5L9;h) Gdw0qLqbc%rff넃92Wˣ(["YwUCgakm+zI>(K'j 2 5 8|•_&k5_䍱Q5Ҳs*cyFc=A{RA8,g{"e wʟUtDh+8Wôf\L}젣|z'^>쟕Eh~>pE\ nzkƑӞ h J{ip#T`&eޯ Mnz$ !"_&^EhA hhp%V!?t…eDc؜XM$c(T{.YG;+J|m]JԆ&?s1od.Ffyu]*E{+A„3Hb'pOH a=h/+5ةL<1ri~/•CafD-hoMՉAսUA5a齽VQڻDu rJFܵ+SUsƴo?=)9VW|Dˏ>okXFr%e98/(3/\{׽nKK|] s? iadIX0B{k9[͑O%;EoaY^l\*3.On-$X49E65L{Y~)^*+\=Fxqx?㊅\ڇ=7W0rJHޓHERW.\H .t ia~²V/* ׆?=a%d#n( }E{>BB^hЇPWC(+! }E{>BB^hЇPWC(+! }E{>BB^hЇPWC(+! }E{>BB^hЇPWC(+! }E{>BB^hЇPWC(+! }E{>BB^hЇPWC(+! }E{>BB^hЇPWC(+! }E{>BB^hЇڧ֪c-ּgOw*+\/鑦=^'=k 0j\)Z3i/4pJSkT{#ڧǚuBgڻbl,WբlۻӾJ<=u<M{q`BY,Wh/xEuk"Q2s٪9U7D{ oQgfJ[u5Q7b/8"V1Ӿ pk_DDIl%-%3D9^HK>}t[^*q鱆OY׈U$zEi!ڿ]#㈵|qE_q5kc7ڷwan[RW|HgrY2@}z&rNԬ^@]p{<>"~ӌxN%F2\XiϜц=TW.dng"π(+)ϞBU_.# {ɣD슽^ggg >9^<E zl,Xu qzzNoKhp%ne-}fe=ɺ5SsX*N*^@pr'ퟟ=q^f.\H.cNydkV8O^-hhp%}3=N7xÚi\Z"Wj*H9xV hOD?~4]hv|H{$YLЖ)K}fT-Nc^YFzmEhzD!wZvfpz4=cjVBY_r*AmnO+Hc}kziw?ɈA,}bb~gOxCriVvLA@{8׊ WDI#"g}+Mt՜g,D,E2〃T,xr<+E}j,bDKjIPC m;i(B|` cMLWyGwvbE75Kr"¿^Bؓ\XE̺ 퉚9VG@hrYhн¥"B{+ӈ d[9Uj\žsO@i~H"vD'zy-ę9+i^"/`=yw@"G>F^EnBP >H*(\*v -l"nyTŜci]/lDN#▷>ފT9d'<=QW"L*)+KF$W`Кd$TG}UDV!pͮ y¹uC{$j_{ be9h6{.tZG/rUa6L2ВC{ 'J{zAt'jeJ_DJo{29 h2O2W\?K h/C_,xmwBݣEk bu{0́ZŻߐ3q-?z@F/U u%.$+$DsU[=h S$9(Y@5s#]up9n0pmZuCRk/Ar-x+*毅N0ǜ#5u[ ^(Ȳ顦=@Ggk 8$#a.GZ QZ0.R6=\itJ+\2ƑEh,g.Zl0N<êPJd2'RБJ(\HE =z.K ΧS*f&dJ{"pO'}ԫ ҂ʜ,Q eMy鈼$QL U{-s~)t9G_„Z> wy$uDAl!xh@/Aޣm39.ؒ ҐF#?*^D!,K Bן x(Z &;6\mV9~p, Ø+|K GV!I:Д{aoZlNUvžU??%tw~ N.Hѩ X35QERA=:~Q_[A:AzChFSU9S3]#^%0Q%b"gQag}N_vZp418 gLHk*v4#߭BРƞhh 9 8DK3^N=0b/{U2Y:ye93Us,2D{b6{]2 W#4`ƞc8Q5vWx ط-@ cJ6s]K>_RLϯGrA S|3d~'c8H΢&FDEe_jiYeV꜃^ B,[t_I/OJdP,ƠMb*c8bl$KnO9?Gjqf?aQ7B+]p8µV5s~P̌ f"T z[sho³%޿;n97/0h(aFc*,o;(਎YHMNS'w(E :&o0ozJHx8$쯘" _*` Ǭ豪>WF0k(ځ1i`֑|upJaS G,T'nL{EzWCsBfKL?~ɐOVVHD 0QNAe0&"6Q,)Fpm>HmCv^rRCa#.a~咃 x32V>jI[$s-OX O;DI-Xɤ|w?kP\B60#Sܚ V 8-d!S?_3*aOxP%33U:x O0#PG3?jCtΝj)?#>B~պ~&|z)$>M1,ke7=YY#;G >J]O %\K<#U[Uj 4X(|͢=m%[g$<ҷJ3\88|y!LJ`^*d#C5nBleh‹aϝcι(|s,+\]1 -R6ӣMxWm;b#9/֎1X+1I: 77ϿZ5[b>T 3?BEeU!}Q/As Gi#- r].|{pGiK+I 4[5 ]/S,?HD7ԇp7M(>ulۿ?5gjTGQc31l͘Ᲊ DYŨ=M+!.@>FN54PYH…y\c0̣6`d>,Nqc7&M£ĜuJD_uo_i?jʂ8`g)טVە{ўQ.y.0 9Bc^{HU" _;Fb ;_9汤ᑁbA"a2"1.Y_vyYfyyato}G݂;=o /pr+j'-hS:Y O 0{ g_3B;URa ǽ+}dsڣ#Lqv =x&x 6͂\8^AԢ5Ҫʕu͙ ̂c18RV}Vx2?mx>xouHfN(篠Dr u|̹9O]-γ; po,5\bVС^,MYHe%TT.縨`97ii/1|+ׂLYoEܩJOgӛıC ,C Vh h]@^ fv#D 5zwoDrdP+Qe\vRk("UpͺkDzVDͮ32V)rB旸SHO~5{v ˯!ņku>, 8y*6]#.#pt%dl0eԴVJ<TxAnb^T.w3_ RN4t*ڧ݊<*(H$J[h3\I<xz$Qp`kG$}!yC8œGcc {|H7F>ڋr83? GUN>&mmlg8|?^#~ HN+%$C<-922 OJ>b;·h-B~xpI{z2\+9wi9zi$'Jp :;iHwEvo#ȿ돟}A]vjO|L{aE+s ?AJ`cc%B#s44Q濾"Bˏ&E&/ly-w|ŊGNgYG 3yCZp=^t~A4Q曽l:/^?K(勵_;ZWⷮU?Ί endstream endobj 132 0 obj 12713 endobj 23 0 obj << /Length 133 0 R /PatternType 1 /BBox [0 0 253 200] /XStep 3338 /YStep 3338 /TilingType 1 /PaintType 1 /Matrix [ 0.801594 0 0 0.800126 1150.4 20.149661 ] /Resources << /XObject << /x131 131 0 R >> >> >> stream q 253 0 0 200 0 0 cm /x131 Do Q endstream endobj 133 0 obj 34 endobj 134 0 obj << /Length 135 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 232 /Height 179 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xO[UmK)-ЖByݘj؆MG?fFf,2 1{Q _,8bbDf8%q/J(!9a奔@K[ZZ lOι<< R(E)UKh\&  S-94jN)ܐ ފ*/} N$gx!zQ%A}M@V8Ɖ֣Nt& C,4W}^EAb͕ɨ̨C,>kp"ܫiꖅA e9PtujmXoT~V>n鸜 שKo?tBoR }5 ^j#IWz J&&Ar7#4bao6$2oNmHkXjY;1sEph@MZ4}=QfdMzsYQi!JiK?N7fTA4~CEGx4iѴrW]kK1shU QãҠ )oGԟ]+&-*^_妩td|,q;owy=>wY|OkHEy:F8 QV}kBo9a*Tdn GY7 \GS\v\_ڴ77TTK0c}5D"Q/q*4,P: endstream endobj 135 0 obj 1579 endobj 136 0 obj << /Length 137 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 232 /Height 179 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 134 0 R >> stream x{žz23]=ӝrp@/EY,G!AdB!I+KIO?SySCȼdII]$"bnD4a,)o歱rpՄ)'4tjk %-+8SiRX͛F49%WFES˻=kaZ4&XwE:P8[\ag9=t+ M,G(w6~fQve3d"!.вGY$(Uٍ_'{WY\U w]ځʢP9GaEjLU*u1<@bYhS}1D6hQL86K,SKv\Spͱ1Lu|S {Xn剣% +v&~qc,fvs6eclB]^)aԴjOn+G r@7ظy9$+ Zh*oy׏_ `Z5ZYFuVlU^67L6{Y)/1xhVcIZxSS{.|UDQQ7z[KXxMVBWj8jZo+bC S_?j\f]\z̏m>6&LNhEQT^{Í;:XXt/xmz[p8u6ni%b0ԩdFb9SS|oyJȒtm?C8𖘮n2yGX!Q9{i꽳+X4<8UB5=7\6>Q}汑^6$Yw䕯yҫ/zOkbY*M(}4UX_Tb7:[&Vk25"4lk3bC-KNZB㭮 kwr=V:Ws(brk.zɬ8Y߽!7+bDi`7ۥR61!1uY8?O_`2RM 5lh]*q2yEhrk&sGO*S}&}BU=gv$Zl QڕFj̙^WWPkCfqk}#w􉽳)Hq$NB{Կdn+scX0u=5{Eyש:-!V&*/Q#q6MZUMmwTZ,BK.B[n\aq%+YR8,zޅĦfÎP;?#QfgzEzx`X+T%s$gCۡw`ZKv #ERm6m&eKkԄ335ө1"fqkuv9WJP;XKW+E 7CiP7Gs?Nʱ&kx-36UX!zB։AvNS9,zx36~UcYZ$jTOkK+TK[f=u w!Mfs3Zʨѕ^*At=)C^^=@n5G'C%Vn,vq30˭א[ (Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!ʭp s;r+QS$Fͮo2xxbQ) }ɻz^`<:;B],;m+T$w ƂSP-Q$qFYj͉ClFcP;)j]V7fĿ͗Bb+֏~buo}enע\\eU#9ǂ0a·.t+T 7 5no*Z|YuX_m[h_C[kr[ ی`X]0wk%bk^F4+n(7n7ٜUN7r;}DJ–MޒXZZuBUZETDZMNtk-t~ Cg w!4h1 ?Le/оCg 4&Wdjqns4gGC[)|K-)'I=έUjB$SƃsPb:yT,Sav38%Sv_ jʞmk^z9+ c,:[U\3m}ƭͅPTʳκǃ=j^js[Zw{Z-}ed Q^+e-Dw.+iv0Md72ٕ,uYYsѻz- (VD_ķ& aݮ~nJU sKd)*@،\׮J/ș^ r!,[{\e@-(xX4;6r6ئ9噝nzRQI~$7ުh^13Mm{/xװ U'R9_eIV+ǰ id5*T[if8kil `aWI6ԄF\r]Z١ǫ`|jO}w4δ&h0Xh7]"SuΡi2 vVl-⅍0_o+bCͽfnY /1 ]y:D =͏n-ae LK[Y&-o(lebSJ /}&Yt[*{.) Ξ23][b4SYQG]x}~_(mhY6y!97%L?xѻE]xcTmbcuӅ}:bml V`N~taef=iI. DQ͗Ve?^Fjfv}!.yG?-H㉣'ZcArbrOo†YsHˑ'ԸpAKd{wս,X.{;5;.wg}nf]IRԡg66 pJ KǦlϞrɻ;xjb5NWGr󉲻3(Lj+qCdzD H`C5<PAw潕omv"ͅrH +ZxKlIBMZ5iɢEX\+ٔGWK1'|iKӶHD> >> >> stream q 232 0 0 179 0 0 cm /x136 Do Q endstream endobj 138 0 obj 34 endobj 139 0 obj << /Length 140 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 134 /Height 92 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xZv 14?ݕtpY` WV#ϟ1gc80f85!e `wf0(((_ā6AhZ㺎m*n~%k *xa,;I;&`1m?JEu85U-@lv\\m]BGea!6{^-P5s^:OU~8 @y 'VC:zK76 *qlMCwA6CĉCƘ27>)$ƎW b/٪Agu]RuFvĂ" Wۃbe׷3s ѾA0ZeB:bx`Lz8c<͘+XQ |4qn}aFPhqd6cFR&ta&~?HqMx 0I׮LPk[ĶsU/'G%RW~=2\q I$CjEzF-y$kG[D2dL/== WcJkq#,Z]"BYi]y\.ADͶmelق$ɘ%`=& :oL|<\cWD

ۜtՈe b~Dr:q^xR=qh0 ,)v0V5OhcmsP7Bw|ߝ6LOl8 XIMSP'^8AD=/ɲO%t;"G x~Ԇ.6uÁ}ު7Wԭ,׵ҁ4™:a( 8`6[L>!VvN9vzzҏI(<7W1vRBDwz XSg D޴`zm筘*Oeu܅{i4 U:c\>N|L(P?_d lp{0ʧsSC+\dqBj<{F;3CDŲEΘuT7j:wk\us7ПKԜCh0ŽAoWB{ -fnVy}'lMv!" ~G@:>>2`]QS?fYZqGAϯ<,!ֺCcO@vQ4Fϗ?Q?Q/{^BЏr¦?[%,AKEn j 'M`f_3xj硥6כ?lсhfK.< ,0Z .9gK. Cet*;n/ aK.7`vGExDY3\4BN I(imC4M7,/Ls\4Bp7y`<׾I{IVe,&Ks^V5b" _@ !7ޚ k,r_,"jְv?[@\EH8mSWE\=*,-CzQ|JBziqPY3m0 <244 qy8*> stream x1 Om ?x endstream endobj 142 0 obj 60 endobj 25 0 obj << /Length 143 0 R /PatternType 1 /BBox [0 0 134 92] /XStep 3106 /YStep 3106 /TilingType 1 /PaintType 1 /Matrix [ 0.801818 0 0 0.803475 1195.2 59.855181 ] /Resources << /XObject << /x141 141 0 R >> >> >> stream q 134 0 0 92 0 0 cm /x141 Do Q endstream endobj 143 0 obj 33 endobj 144 0 obj << /Length 145 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 217 /Height 171 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream x?oc:11+1 BРDPiJ.MJi&ED!CȔ ty6kxZMC4} h)3@8TLfD,X @ 012Ɔ R1XXY؉Dā@ $";;+ 3ќ-HF$9yx B`ETd.~AaQ1 I EJJJKKQ$%EEx9ILM`8y)2򊳔U50LY) QA>n2.&f6,5M]}C#cS3sy`7k\V"',u9& m;8X K\rVi*SD9بI2U7]`kn[}|}a)__-^<֬r\j5PGU"II)'"5Sz9r8 >~,$ȡ{vxw[d 7dT."ۦ=L q P0v|g ?q$yL)a^P?!\VݼKLy'5{iwSn]OJ8upJ2|䟐MpK):oy 4:ʭOr ~AܧY\~4p2K591~2@!20A.ie= ;7=Ǣ}$yiyꚚZUSS]U 'ijawxX4WC^>CX*z73 jookmij|]] ;萀M6Fb `D.!)e~G.+Mg۞>~,y\_UVvl-.6bL Lh0F; EIoz좊QBhzŰ}.6F"<$o m02L] {O9/ۻG޽{7ւAh{Yvޫ UPF!2xE̖y:WV;8?SD>w#C EćmvZDmU1BdfQ7ZfGpLrƳۺ8 `oGSw~߳BWQ[H-DI%+CW^ַ ,>M)66:\<օvܠ2$a$Q G{kpL5*DΦWEowB #8ՌKyRZp}\@0i2?Jԁ-+-ux?& &'>Ko5o44HPs7!,c 'ۗ)C%$if1(2)Us:Gg,қ)K)w$ v򴼡odl* `wKUფȠM5d@&#D6N0sɏ׶ 1Ili;\Aʈ?K",5~iyM]:fcCm^R }K+YPZk%uo|!B6{?:T RzlEQ"a>us*-ry${ =Ɔ{k^=X2a:8)v!΁uؿ arR.:[j sM:-}C.V4%a@RV T:9}PkT"3Glͺj{q04e˲o`.%jq D5^],/ CS6Z/:h-R+bK{g7 CRβ%Fv_ jq@!qimj1F:_d^\k=,(e xGFQ-!'Ycy6pOpDq4Eay݅“;>&Qs;F-SQY g#Q*/h-"n?coFg-[)(f1\~7lƟ)Rm~qߕ4P\coTQ[S[q)tg0 ^ϥj8QW Nڲd[O}V 1"6~=~\<(jWC ]« OQ3s .8( ~Lgzbse.D' -YtQ]w&ϯjˠ`:Ehُ@F[.kPx($a:'s]4+4=0rܤ MXg}Y͘C[5dЁ7Ji[:=wiyCg?>RFMXkUAzbX:9J?(΅W1Z'"Aau+.6/Pw/uԗf:{dJt*A`oO;p1j-=U<C@JsWS| u8J߈=RG^du|yR6H̍<A.h|sU(weL)3Zd|jN9()ږWl^a r$d IMS#m[m[BvYQE]H8-] M>r.}~eM#ܫfąۏ[Z)Y@66s]ܿyp3כըt,6 O.inV:pԝq m{]~aֆ*Rl_% ]H`# H*/tڲ/RjvquSG܅,t݄5j+H ޱv7[ KU ] .eC2~žؐ]̵ľUGDV@DGo{GFa-`_Ogk'ĄН%~sC(HWL^d72r+;  a,@ۮ7 e)~zJ[/ex+J*j[;:WWWgǛƺqw[)K qYY/el) tܢҊ MXu]ueyq~v}>kY.aUd gs9zlz&Z9E/J_b'% r޻yܩ#^.Kt\ ,V{:}!efeegg?PY3fKy%>&nwG+c!n+Ì&DeuMluW]t3_|5D8@]^BwAg<E y6n|v ;y:*:: ?yݝ.0VeT2O^@LFIk2'7O/~{ ڇৃk \l-tU%y?'ca' I)i[X-Yb5k=<5.Nv6Mh*HsX %c`bf#q KT՚mhbn`blekkcmp<ӹ:JrQ2; E\4.>!1l=}}9X@_oL9)qa~2Z`_HD\RZFN^Aq&,? /+MbB~N"s  a+?/7'ezd`dllD{ A"*#XhҨlLfVV666vb`ceeaf&05m##"`*4FF>87eÁP?> stream x]YS[_y*.C)6BbЀmh%Vjc6^Hc23lpxJ ٦6.Ñہcro›f Vݻo K ZB3+nʲH !poOHխ[@mׅk|ivmm9;t#C %B`9*V+樵ǫV䄆D,ki'by y{9'p8F,x6&07{zhppUȹE (>. =KpvcE flR[ PB"s0HЉC.]"Ojx1q:% !x4m⵷Cwv绺Ǔx >_->z.rǃ8xF,۝usX΢1'n!A$$/Kb҂0% Lm`+E{p\כߟ9P6@@R7 aE5b(0-XYh aS!!yԳ3!~I9EVX ]]%͆H_^`ѨAi C!"?/ "YDoil yDnCf)`ywU fNFLTB^q%}CGG& gۛ^oK: =Iѓƿ М`ozl<KOJG"TeK^M E +pv]tZ|}5~q*drHnqb F& q:(-߾F,$̺HSif9 %SdP'NA_SNj Iq\nd`c2 TE{̠`?mD""4SM{;r*M 팎"rpMK3@=Hxz¿BH^BrI![,ѐ6nFFVGoE[En$o܀k~XA ^HVi# .]ɩ^UkI/ [ԓp $s].7Gӄ(V)ⷴЮJw7`Jg`OOSf~ E h06.ld% w@Es76䓅$T`㈫7 B^<71?Y* 0qY+PnzZؘH:!_e3 RQsU wvH}}%E]-sW~Y y#" UxxGZ8i<iut9/Vh.j5mbI,\gzŐ! ή hL)|0 CzaA4ԉ:y8LY9KF=c*c> GT ~7חB8>N쩩u@ҍƊ͕4σӤmPvgfl|< 7ߟDΉ0Q2z-u͵z<"iDgv+[욥AvW~>#I#iڈ_N c0x?GjgUv٭#~w>̅jC,7$Rˍl1β "8@:hOcwXowgv"'6/FÂBuSCC&&tI, *4_@=ڀ0np<~oo6,fNW_rE2Z99rѱe7{gd$زѬ$_}AR_D 8viԼܼya֣ݼRCw7~^0HlXu*,Q!ta\6׹1:qtV:f~::s+%1CT4FgNc+CHő M1ΈD<Ӻ;(\* eeҫ ;)ޞSQz;D;InϦRz-Qi+I8ƸH-d&Orw08c蓋|w<;xC%DG3S EZU+dyFؙޙ؅yM=7H>֭'Fm6:Eёs͙P( |Ve{W$ڢZcTM6aT:7>|AؕZwMI&Qa\.\ydIG"Ixg.'Jt#{$^wp #EQEXi() /Ԃnw*¼(Κt|[9gwXvc-lӁٳYIⵆ8CXuTZwbwCNK=c-H&KA ShhJ_"7pG/,lC*|ه%]XG\*1sYbHEҼ@ G]Fi|o T W ? |qo".YMcyT^j< MZ^ψI>%J&JTG6$]Lfy&TJt?gznn{N #Js3}4 w<|j42b9]]Yc,ccTQг\MP0$Fu.<$ *Ç 씉7ql0RɁTyAYhʨ4 M?չfSTPE%&YgM󶩉+wvnQ eQRE>d./>N;ތ^L4֛כsNltna4Ӹ;dB!iAYyheUst pl,5< *AxsD˩g\8y<ӧZ hX,aӤXQQAǩ~xG"6ڱ1ח ~]t:_֔%i*"|V8b[Rcc[fJB @CM *w4isNgUkK>g졕6XSGM2EEEUQ+<tK;i*w59[-9 t$=:_*TT FHiQr#J;e?瀇建5mԨ",dxrՒ*Է.hrsΚP:Kƽ`l69Yb?{<{ڰwڀ~`Skqa K3ivNGQeAA- #LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LF|0חTTT$|;Q? *HEHbƍJCþI,lYG*ÕCo+V H{ЋO0rQ.#ɪmzK1\ OF&g9PEXrbPE]MP0t*"W|9$uHR##PhvÌp%HPx#svND^**rZ?G&Z EV9v.g*]T}ISQ,;pq1ZW}Sg0Ѳw@E% * gJ,t k Ni"6gf=LfTK ϒ,ݿK;T E0UNi="ssBL~TuƲDF ΋(ɱ1}F.=gѩ";рlQd<ͅU-ɪiEpۼ3>Ţ:r8*\Qw.tY/ӳ=8Iusq^@-ٷFgnޮiǓÈH,y<9N6ۅbŗV+9rQDxEb4TTGuE5:K%QL~__i)B m=Q@vn -@ۛ as_: #TQ Quɉbyd8}}PHzä7o$Eiyt <hg%]ma  â",<TDj 95lInl|˓".WNZ! Qҁ2ݩ00}=p*\N(a0TYbO )-;0e#/]:p1zx8)"|sHXXqM܆A`=`@^}(:T\b{v)54*U Kl&3f0~YH:D$=DRp@֌CѹGܒ_;jn2/^o&LE##0G;r2ZQjJp tFhJfJƙ&޸\4č& Wpt'!"}Stґ45 랟F1˗ -4We<\\\ASS܊IIg bXal?0Oh0/H/j-99y!m>5Fg q&4*[[ٚ}EvWno [mx޼0ϞϗoaB(##0l ӊ_tnYcqLGPx<"G%t| yaut@l[Qj0b$|@WNqM(S% `JȖԏ'b;?*v&'w F3i BG|7ˆPqC.1t67؈H{Tf*9%G5c@lթ2,˖ e $CCCtz%9\%4[y%Ox0j\^/ 3 )f!>#Sjטl΋r/VTXႡ@`S q\yTE6Q? ?a!LSn]Mǐ4)"1 # $,p)yTR+Ċ:$G$qL=xؗiw30 <@iЍ`Zlש(!^t}=(ǵ”< !_ $ȁ,l'1ij'n[. kRuY̊"Tggz%&'0 =s+ٞYvF6욫\8M߻[~ςO#M@Ⱦ>p(B̷8dKhɜ\wˤ W^il䊚|-c̓G2 SC $r">T#4_$\!ل2{/eh6T9IQ{ff뢔O^(\)ȌQ_IV2 3Ѩ@4ϭᡤK/4_@Effa~e6665r8a5|kcZ>8mN66''|.[l%I@A*r9X&ɄX|O|kVzG(ss31Ht5 xψ]$GGbZЩj]8_5$TᒑO bm@ o,Nd^o.qd,}-C!%ac+٦&x!ʁ<)2NݼdZ$Wsx( #@pYx}6JNgu䷸:ۛf"ĕB3rPQQxY?T8 e%C~+mmd` w) gzxxy.[ h4)lh{I &@CD*|no8pTC5@aVw>4D1OJM,?/`c]9X-jV"W©v#-yEوL큖~?uV+\`6eQi/G#""xۑA eGIJ)6"8!!E[h<?) $, n88}f,xBW.ۮǣp%%(r>D#Օ, l,YK . ,*ۦ OwyX^ kظtNQ۷_sUk.ANhf pRy [[Kv;A dݻ(OVΚ䡑v=O@òmx*C-_\i K9?k@=R@D7II_Tr E NHyvL{Ynw$ANJw-o^,+h,#<)TE(35 Ihs&^BII\ ug>ut73Ǖ*0X,M!X/Z0'6Jh6NCW_*,BN +\ۮX'#Kܼ)jdV\@HLPT1`C_2L,!N^x] o?ߟ , endstream endobj 147 0 obj 9943 endobj 27 0 obj << /Length 148 0 R /PatternType 1 /BBox [0 0 217 171] /XStep 3270 /YStep 3270 /TilingType 1 /PaintType 1 /Matrix [ 0.801531 0 0 0.802516 70.4 531.744678 ] /Resources << /XObject << /x146 146 0 R >> >> >> stream q 217 0 0 171 0 0 cm /x146 Do Q endstream endobj 148 0 obj 34 endobj 149 0 obj << /Length 150 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 199 /Height 153 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xkUNfmm* Qji  5Jb>b4/+R*UUb_4Pbj(6Иm;Ygw;f9gs=KHxA(, PlmX@ot<}b?_'NQP0' 7)%|/#E-E_ w;$b'y-wkۡg:OK/$s^Rwn-snY JE86%qi}AnW2.]Im&H,us/ʆv/}JFI6[ļثMsENzp߻0rj{1-3u18Ni`,SNP)VJݎ Rl kZnGRFW#MYI9vӰ|Uש >VylFC܆;5:bHW (c@Eave3ѣ"n'1#A.NHeZ1.FoTƪ~ڇ꧆3tg{A44 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ai࿄iiT5}[畯+m C>I!Aȶ|{oWF4K 6W*tz;@BSrA j#&*JwG8$%B}sgFʟ"惘Kgp'GbMva=Q3`C~$3}s?235qcVo^ΙLz|t;&?ꛙ?&0~[~rа<{9ԑmyt[Gx/Z'Ւ\NlO>_^U\9Hc9TCb;xV]BzXu΁]E3P- GsejGo+tCW2>lqGocn7@Lhg*mҺC?ו G^w}I*;K}uC3@)բ["ÉJek]08'UBy(AJ endstream endobj 150 0 obj 1246 endobj 151 0 obj << /Length 152 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 199 /Height 153 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 149 0 R >> stream xWm%:83Ԍ+ȓ8K!8 1 PSiI>q"ws|q_.7yq<u]uݛ ŧ=Z;+DrArk4ⓋS/'QT/5jg*nvoCǏSRH}uueg3jFFF9эXߗ_NLAi`t߾nEWrLy. cQ^{uI[ee 0X*LzzMyDmw]\--ηnHhǾ}壜Hԝ#GRqD}GELZF_ę.bχ?XI{>l2aFRM*C|~t20%ӧi<ܽ[TÉjAub)jTVbgrlݻ`J;#'2?UZe`HfljQ_Sǥ LnmKt:| f&Wn/}jRlxBDˤ򑘥d@|6EE+OmO"E+Zqz`c( 8t)*L, R4 VU4g@ZV}W]݉eDv xAԲJ3 DlKM J|ݭ_'$sUV?|)!LAnny/}/u չVyW_h=\T :Y+**-h=+!{vE̔^,5CkzjeW_eXUW[/GVT^淂'޷+ ·m 1p,Nm  5]oDAN6!Xg{`U<{#,J=w{ 0e0NW-[~,/ǶuG>tQ*gSR|+nno<KQ`VOed\&FK?.{iWԟؽ]mB]vӧ][2)*+Oij3qlOK`%u5%7AiiХN%uB!Ts۶,)[$^lt_va|ieμ(Ow@oso L錌(ͣJz/66B9/_NV+4ڲe.ϻhgu;G|[[K+:_],aD ˵^sܕo*Z_6 ;Ф0L KCF#R⪔JīŠÜ_d endstream endobj 152 0 obj 2509 endobj 28 0 obj << /Length 153 0 R /PatternType 1 /BBox [0 0 199 153] /XStep 3231 /YStep 3231 /TilingType 1 /PaintType 1 /Matrix [ 0.802197 0 0 0.803499 71.2 535.639563 ] /Resources << /XObject << /x151 151 0 R >> >> >> stream q 199 0 0 153 0 0 cm /x151 Do Q endstream endobj 153 0 obj 34 endobj 154 0 obj << /Length 155 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 60 /Height 60 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream x-L@BHHF -eY% @0˒mP#(0C`5335ٙǵ`-{wP@ًj*{R5IF|>4Eѣω+r-ӭx3.ߴt2x? ]+P`$w?0ig$/u-tKiz1[7bȮ}0/θ}ZGX۷i nhZtsK ,uPmȵ>XMJHҔ9B5PɴBFc&XF#5^Π֪TKDS |~M5:11fr'^ =¬9JP>N@g9?!VZ ? >Tymts97u\707yl'p69N_KMJ˖;ނW QԔ:aCZ!!&'jR!\I7;cCy=NmU7v#`NB\) ;Am endstream endobj 155 0 obj 555 endobj 156 0 obj << /Length 157 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 60 /Height 60 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 154 0 R >> stream x՚])Q4N'/KpWa45RRT<ky1oZT,`<3 okV+Ͽχ>>G˞z=v9}nwLXaX, ]hX,nOZE6MO>]cZCk_Z$6Mn=txX,)Jǐ$K|-EHI^c/5J&4 .T:6K4:g̔U:?J8vz р΢'9vf%'XكE3&<͐g"hYdoPU.)I4kQ8˥,0=8,ǫjLaEܝnbUDEvx\4W)´H)E0ED"fz<ҝt~:JČ71a(W . rrHWG"H$Yd2^sU;3E<N:ÒC~V|~8u]4Hns$RE4(%vfvhGE"Sh2 F4  UDSDs6F:]tjU4e?xNj%0f[jV6ni~vdd2i`YBEiڇ${jޓKΧ0_l5? P/;o[HG4][-`8Lb#EQMC%.2N:" a2q#~bbF96 endstream endobj 157 0 obj 853 endobj 29 0 obj << /Length 158 0 R /PatternType 1 /BBox [0 0 60 60] /XStep 3006 /YStep 3006 /TilingType 1 /PaintType 1 /Matrix [ 0.800709 0 0 0.800708 102.4 598.532352 ] /Resources << /XObject << /x156 156 0 R >> >> >> stream q 60 0 0 60 0 0 cm /x156 Do Q endstream endobj 158 0 obj 32 endobj 159 0 obj << /Length 160 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 62 /Height 62 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream x]HSaghQ@Kv1B}@A50 x] BzGԅ1%+&2P9s~l~W},9g+>[>pdӊ?)fM!qNVkbVu[Yyju,5TfRs_ F vMF51)Ԛs`5a/raą'#q>#"`b#70kYOPu@Px>41:t=yNY]DџE[D~M;BzQO"#DUD DFV_x]wɺZTT$-Tݙ|ix(5 L_)}m ?v-8X|ji* ȍj3E[C̚ZmqKs[ֆ700@٬&eb,USVJ@q ?UR]j?ytd]x; BSWW&ں endstream endobj 160 0 obj 532 endobj 161 0 obj << /Length 162 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 62 /Height 62 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 159 0 R >> stream x՚oUL mKu[vuzYutl"T""(( œ8-%D h$1+>wcuۓOt[~.s'I1Rtt^Ѹ#@"3{dt". KWnw44H.jX.2 >NLs^; rB۹'"y .7C1;+5wN5y^&o$LYr#R$l ,[2ؒ#SMޭSx*m2lFO6PM.ﱿ9Ґ@?Rr !U.h$^Wшo ܛ(xR=x"OgsM+CT+C)ͨ 3n>n0<9 endstream endobj 162 0 obj 1636 endobj 30 0 obj << /Length 163 0 R /PatternType 1 /BBox [0 0 62 62] /XStep 3007 /YStep 3007 /TilingType 1 /PaintType 1 /Matrix [ 0.801804 0 0 0.801581 99.2 599.276854 ] /Resources << /XObject << /x161 161 0 R >> >> >> stream q 62 0 0 62 0 0 cm /x161 Do Q endstream endobj 163 0 obj 32 endobj 164 0 obj << /Length 165 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 35 /Height 28 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xc`>}p,ML$Q MERdE 1$ OXUR TB;n`=O UiAT?' +yEX ΀E'$xcPSA+QW fP4$ٕTqEx_`WHT 5#Nx F~ p!_AH endstream endobj 165 0 obj 233 endobj 166 0 obj << /Length 167 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 35 /Height 28 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 164 0 R >> stream xkK*A>UQY`&m !(9cHQ/ũ H 7^|۷٦JN;cw`싙ij2)5MSODV$Ye. 5P%`YA׿pƱ* ay!5&)6HRbB,`-uB:gjmt~.]f*3]f^S`=iD@&C9Tjo/()q7)&;e{$-ĺ ͸j>lYۡ q+\d]qKsH !?H>2C0ٹ:NN(0q#=[ C >jkO`QfzM{i?>s5ĺ>gs] xW;i%zڊ8pQqn6ߋ endstream endobj 167 0 obj 472 endobj 31 0 obj << /Length 168 0 R /PatternType 1 /BBox [0 0 35 28] /XStep 2918 /YStep 2918 /TilingType 1 /PaintType 1 /Matrix [ 0.810717 0 0 0.80755 110.4 623.963441 ] /Resources << /XObject << /x166 166 0 R >> >> >> stream q 35 0 0 28 0 0 cm /x166 Do Q endstream endobj 168 0 obj 32 endobj 169 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 105 0 R 106 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 170 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 108 0 R 109 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 32 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.443361 0 0 -0.443361 107.494377 598.070442 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 169 0 R /Extend [ true true ] >> >> endobj 171 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.443361 0 0 -0.443361 107.494377 598.070442 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 170 0 R /Extend [ true true ] >> >> endobj 172 0 obj << /Length 173 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p171 171 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x N&2!Q#cMtE'1$Z$Xn7) endstream endobj 173 0 obj 73 endobj 174 0 obj << /Type /Mask /S /Luminosity /G 172 0 R >> endobj 33 0 obj << /Type /ExtGState /SMask 174 0 R /ca 1 /CA 1 /AIS false >> endobj 175 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 115 0 R 116 0 R ] /Bounds [ 0.611607 ] /Encode [ 0 1 0 1 ] >> endobj 35 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.443361 0 0 -0.443361 105.706858 599.85796 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 6.929688 121.070312 6.929688 8.960938 ] /Domain [ 0 1 ] /Function 175 0 R /Extend [ true true ] >> >> endobj 36 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.443361 0 0 -0.443361 105.399556 598.971238 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 31.5 63 31.5 12 ] /Domain [ 0 1 ] /Function 118 0 R /Extend [ true true ] >> >> endobj 176 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 105 0 R 106 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 177 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 108 0 R 109 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 37 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.443361 0 0 -0.443361 157.513301 617.852658 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 176 0 R /Extend [ true true ] >> >> endobj 178 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.443361 0 0 -0.443361 157.513301 617.852658 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 177 0 R /Extend [ true true ] >> >> endobj 179 0 obj << /Length 180 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p178 178 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x N& b2!Q##ǚX+gR+1s:T8A endstream endobj 180 0 obj 73 endobj 181 0 obj << /Type /Mask /S /Luminosity /G 179 0 R >> endobj 38 0 obj << /Type /ExtGState /SMask 181 0 R /ca 1 /CA 1 /AIS false >> endobj 182 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 125 0 R 126 0 R ] /Bounds [ 0.611607 ] /Encode [ 0 1 0 1 ] >> endobj 40 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.443361 0 0 -0.443361 155.725783 619.640176 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 6.929688 121.070312 6.929688 8.960938 ] /Domain [ 0 1 ] /Function 182 0 R /Extend [ true true ] >> >> endobj 41 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.443361 0 0 -0.443361 155.41848 618.753454 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 31.5 63 31.5 12 ] /Domain [ 0 1 ] /Function 128 0 R /Extend [ true true ] >> >> endobj 183 0 obj << /Length 184 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 125 /Height 98 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xWSgǽ%,BX@wcqb(.e;TVVБbYUփa"R,, dyo)uO3?<|yAFOq8y LR4΢I:0{xIpyt&QlC k[{G  l:[B̷/_Rw'k6:uhLc 7q:Jܛ;*|C W1F"z&r̜7.dQ^N3r yOVʤbOlHK6|mpB+&%nYfŞ)p3 OǦUرӇEgcfn"fr_ %UG6/6gj"Rvip,oRaH3n ~[>$ô:(ꫤ?#c|5Z0Io ¶YVBƘ [w. 1l+ i0+w]Q컮㚼nȥt]}fs˗`{o$-2'Y, O7#r"[#YV+# &q%f-XeqWC%v؂;±ݝQϰό{{Yf=\{aSҎʬ@G;P!!omj*71Xh@a*10!R|zA20' J̩k5papbνNHw ޗ/uZkZkZkZטxgYgbo6ŏC4΄Ɠɪx24q4n>VzJ*QD U\_pϮs%8:me?P2K >sy/U&i)>ۆ+#\Ɂ^יo7~>p+uR @СzlLs /T9@"tUێ_t/T zJ.Lx!!$6O]CEPILO u_Ɵ%2 $SJ "Bjrj\]'eϖg PvQtrJDQ(J﬿{d}n( 9g߭ j{G&d29z&F{Z~}d)@0 ^V70(AQ-uf|jƚH Q| )9[SsSc݃0fl P$ 2u\.+7 E72O߱~&{v{?M>~Kt&=d>6Lےw:o"#> stream x]kOZYGSmU@( UK~zQЖ^7i&iIᔩVm' ۬rX^Y眵~r?grVUM;χն&ӎgg0YMkZ;pw/oxc4zq+|۷#<Ø^ZZΧ==r?jL>w0|^ G7\5Ňc_jRXJv{8r8JNgІ4EiB*)n/,@q(ACdf+V⽽G}}%(nwYUZtKO!E ~;OUPU pX ѺOqʻrm,ehjVk.Wp8dp ُFh#ʎw ݚupTOn+:m+xf++JpXݱL2{ݬVH$A#U8 - 'nas?ZAn%d^"A_`rrgrrkjjsffm#ޜn>_Atj wS)pC0 pHa2/F5zGa`*D``0Cx'5Yݘ[\7 )];??s_UNɝ;UG,q +9) c57`Y3|b}xyyme hkǖόP =50@%gQf+l#0mOL* KKMton=k%Uy60yeN/'׮aw'MÙH5%Vv[ZEc-gq Y"1(b0xvXЖjb 20]Z6|vV`[W嗖3ěS/, &w o6vɄ]ԏn> ;D,;?P&E[s5 ]\!K.Zy]l, _A:#[c5p6XC̗lߍ*[x?==tLreC!l ‚M?= |8y*l~qNýU~q UmALB7ìHsQA$VR~$5EX߁d^+  waX?V saŁ p܅r> H|{͛SUL ]hDd EY<3;;9AeΝZwOtKZU!3\%.׿G'FLH"Ѽc`6C."|;N(̦1_;LMeƠO4tZu,C>@B=n `әd0-%3o2|u GKf{QNA=./KxY㔺hO3~4J}hH<(Nf kwĵ>ֈҰCFB.h>ߑөWLg ;k~p`]PomS a'3,CCfGz?ň.ʰ=<٪z#,}ZJ XB锰K؛$1 uL.aoK[$1 uL.aoK[$1 uL.aoK[$1 u첰x ˤR}{foD'(96Ƿ]0{En6G.Fdr{zZtekdIjQXwߑ/HY, F"cc[7  vM/7Ǎ{W]NѼ_ؙ{-? fN|i9d.{j\(D}8KԻl\gw|yWI4=o!tXU+ś7Y5v  jX`eC-nEjo>ӛqSeB<>7٠N>2^vj9ݩ#Fj7>'} #UTj}ff@H7fg0wFFOKv;}m~ yfR_egҒU/bz$nOLFH m~jСu ?^: _aa s82G];kho{XL@Ycz9HssaݎB>ݕ!o9Rt:s^oZoqJCgQ"QS;p8޻5n?*&$u𢝸FXgujT59dZP2 xz(l;4~[0'B"87!K&,5URmT#|~**'w|eTINH1_ZtzAvipp2]=yㄎLECxP&*$ uͻZskYHՋЍrbq&BYt<8HG4@3gfbւĈ1|Kq̣Q:{J >^I)E$h::{U0#M3-ʹhp-$닌G44htvr2!4bjE}g n$߲jz60PN;`- 1⑩4k̃07Gmnb^* 3ӳA(TBAvWNm4S;/8[AC;;Ӟ>NK&&mB7\Q^w @:B(ˊ(ExtNJ,;WͅBȳ4,["-'ߑ! =MU +}}(H.罽PVG b[|\0UY,HZ}/x].ԕfRj7"<^3^X,He\VQvn0\&:bpW-@λ._@^Qqӓ{}}֬֓;w Pn L >S Q~? îē9k{T[tzQ^r.V1/z@D<뫁**\׶>A9 VHh5O#hGiGSI붵ǜJ?{vʓo endstream endobj 186 0 obj 4073 endobj 42 0 obj << /Length 187 0 R /PatternType 1 /BBox [0 0 125 98] /XStep 3104 /YStep 3104 /TilingType 1 /PaintType 1 /Matrix [ 0.800375 0 0 0.805466 320.8 370.039199 ] /Resources << /XObject << /x185 185 0 R >> >> >> stream q 125 0 0 98 0 0 cm /x185 Do Q endstream endobj 187 0 obj 33 endobj 188 0 obj << /Length 189 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 114 /Height 88 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream x+Da54`$ I4 ʂVJnYecgE6RR4Yre8quŘ3y64{szȔmg Uyb[Sԃ K/kVyWKt9dy\`*3z?-1Xȗ )A惬0fZB\@| V _c`s%` g"`gߔ/\'1 5c@ykK+: ?w1V zܦKo}jw-A֥(E)JQR(E)JQR}`Qk=2h 5NwOČ,s Ƃ CEjOWS3){ODHe@Q14?N`CTto|<q1 j1ܟKɎ^|c@:LwWDt&n=jS*H D〈װhE^|O[P endstream endobj 189 0 obj 507 endobj 190 0 obj << /Length 191 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 114 /Height 88 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 188 0 R >> stream x/[aǛNO[eHCiE,~D"n!¯{B܂j؅Iv1d3vf8=Liۦ}D '{s ey_KSމxݍޛoj o4>DL-Jt=0+̔^ƂWQb9=VB=$s<8n7:EZX1 lBB.+kmE.Ε+Hyz0?ڙ"`j*xujjzɄlK+X}o-ɵ畕y`1+yJo=tECy%a^]]DE ׮u#>= OؔZ'Rf&z؉ossѓf\XGO d2Y%@V*+U dY%@V*+U dY%@V*+U dY%@V*+U dYVГF|*y8IG]OzI =,X/Xg?0t@+l=zxQWhqkC݉g[)xuuBOVu{_>o`ybq+ĪTd~l~S\ڡ-0P2AS۷:[L(( endstream endobj 191 0 obj 1038 endobj 43 0 obj << /Length 192 0 R /PatternType 1 /BBox [0 0 114 88] /XStep 3074 /YStep 3074 /TilingType 1 /PaintType 1 /Matrix [ 0.805477 0 0 0.803558 320.8 371.861706 ] /Resources << /XObject << /x190 190 0 R >> >> >> stream q 114 0 0 88 0 0 cm /x190 Do Q endstream endobj 192 0 obj 33 endobj 193 0 obj << /Length 194 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 34 /Height 34 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream x-0K38 df!"(4 01@u: }K/)ghrvij}[_hNi3kk.bNo` p @G$S]j9Ft,QMxc4Tlq@ endstream endobj 194 0 obj 235 endobj 195 0 obj << /Length 196 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 34 /Height 34 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 193 0 R >> stream x@E/`$ES+lB$Nnwg=6i<0nqUU۾~m){>eF$/qN'N"Ǻ\.} #u<:4o,:DEQ؋%#xQ"zq9rw5V]=B ˲z -GAtʺ|/E ۶Si4I+(i(niiL4u](Q C0q(A O62!gwJ 9#z>0;sҿQ҈^oEE ov!>7DݔWiA<7u=\lέ endstream endobj 196 0 obj 353 endobj 44 0 obj << /Length 197 0 R /PatternType 1 /BBox [0 0 34 34] /XStep 2911 /YStep 2911 /TilingType 1 /PaintType 1 /Matrix [ 0.812775 0 0 0.812775 339.2 407.740506 ] /Resources << /XObject << /x195 195 0 R >> >> >> stream q 34 0 0 34 0 0 cm /x195 Do Q endstream endobj 197 0 obj 32 endobj 198 0 obj << /Length 199 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 35 /Height 35 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xc`@u`,1ҿo!߻-1T]UE_TH~cxd8CPM?DɊTJne``Sz0\įf) Cwx Tخ endstream endobj 199 0 obj 312 endobj 200 0 obj << /Length 201 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 35 /Height 35 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 198 0 R >> stream xOAy6 ;̴K,-=JJmK TPxF &jxDc0$B  F/gQ )Rq@AAT*HĤlSQ%B܄fJP ,~o f2D%p hfm =|wiuq%$E`؂D*JP0w^`z#> gW|ny8YJiTP)#Pԗ|$% rU"T%w S\<6mFysn?TOٕDh12ӑb)N*iBA'l9Bk&f&eb-SHsN@øp FD?ސC|.U[vu ;K&9'],0"eT1J‡ wv]['ɒjV7.ĐMf2IИT?.;,1 %\tL]%E9馻TWd#E|bcS \T.MW@aԡ<.ו 0d8t_c?]BN]IQ* > >> >> stream q 35 0 0 35 0 0 cm /x200 Do Q endstream endobj 202 0 obj 32 endobj 203 0 obj << /Length 204 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 20 /Height 16 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xc`ɻ|<ʀ ˔BZ#_e@!! f`;&U0`})B1N>Kb0&4葠?(BA܀ Ѯ|6 endstream endobj 204 0 obj 130 endobj 205 0 obj << /Length 206 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 20 /Height 16 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 203 0 R >> stream x=OP` F1~0.Vʤn.vibCd&.E^ZzLL=Zcr'$= 3RaaQaDp?RJHSiP脞Ao7~4 Xڳ!յexrE=n lwuaR B^+k <;*ժƎTwIy{ى+U^i3Zڢ]\z[B*#-+egu/e ̦7 S6_ g3=5~:G endstream endobj 206 0 obj 286 endobj 46 0 obj << /Length 207 0 R /PatternType 1 /BBox [0 0 20 16] /XStep 2872 /YStep 2872 /TilingType 1 /PaintType 1 /Matrix [ 0.816077 0 0 0.812889 343.2 423.168628 ] /Resources << /XObject << /x205 205 0 R >> >> >> stream q 20 0 0 16 0 0 cm /x205 Do Q endstream endobj 207 0 obj 32 endobj 208 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 105 0 R 106 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 209 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 108 0 R 109 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 47 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 341.945482 407.6937 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 208 0 R /Extend [ true true ] >> >> endobj 210 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 341.945482 407.6937 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 209 0 R /Extend [ true true ] >> >> endobj 211 0 obj << /Length 212 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p210 210 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x N&-dB?#_"սh Xm!Ijg4!I<0;T65 endstream endobj 212 0 obj 73 endobj 213 0 obj << /Type /Mask /S /Luminosity /G 211 0 R >> endobj 48 0 obj << /Type /ExtGState /SMask 213 0 R /ca 1 /CA 1 /AIS false >> endobj 214 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 115 0 R 116 0 R ] /Bounds [ 0.611607 ] /Encode [ 0 1 0 1 ] >> endobj 50 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 340.91729 408.721891 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 6.929688 121.070312 6.929688 8.960938 ] /Domain [ 0 1 ] /Function 214 0 R /Extend [ true true ] >> >> endobj 51 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 340.740528 408.211843 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 31.5 63 31.5 12 ] /Domain [ 0 1 ] /Function 118 0 R /Extend [ true true ] >> >> endobj 215 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 105 0 R 106 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 216 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 108 0 R 109 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 52 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 370.71668 419.072554 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 215 0 R /Extend [ true true ] >> >> endobj 217 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 370.71668 419.072554 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 216 0 R /Extend [ true true ] >> >> endobj 218 0 obj << /Length 219 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p217 217 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x N&-dB?#_"սh Xm!Ijg4!I<0;T7M endstream endobj 219 0 obj 73 endobj 220 0 obj << /Type /Mask /S /Luminosity /G 218 0 R >> endobj 53 0 obj << /Type /ExtGState /SMask 220 0 R /ca 1 /CA 1 /AIS false >> endobj 221 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 125 0 R 126 0 R ] /Bounds [ 0.611607 ] /Encode [ 0 1 0 1 ] >> endobj 55 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 369.688488 420.100746 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 6.929688 121.070312 6.929688 8.960938 ] /Domain [ 0 1 ] /Function 221 0 R /Extend [ true true ] >> >> endobj 56 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 369.511726 419.590697 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 31.5 63 31.5 12 ] /Domain [ 0 1 ] /Function 128 0 R /Extend [ true true ] >> >> endobj 222 0 obj << /Length 223 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 125 /Height 98 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xWSgǽ%,BX@wcqb(.e;TVVБbYUփa"R,, dyo)uO3?<|yAFOq8y LR4΢I:0{xIpyt&QlC k[{G  l:[B̷/_Rw'k6:uhLc 7q:Jܛ;*|C W1F"z&r̜7.dQ^N3r yOVʤbOlHK6|mpB+&%nYfŞ)p3 OǦUرӇEgcfn"fr_ %UG6/6gj"Rvip,oRaH3n ~[>$ô:(ꫤ?#c|5Z0Io ¶YVBƘ [w. 1l+ i0+w]Q컮㚼nȥt]}fs˗`{o$-2'Y, O7#r"[#YV+# &q%f-XeqWC%v؂;±ݝQϰό{{Yf=\{aSҎʬ@G;P!!omj*71Xh@a*10!R|zA20' J̩k5papbνNHw ޗ/uZkZkZkZטxgYgbo6ŏC4΄Ɠɪx24q4n>VzJ*QD U\_pϮs%8:me?P2K >sy/U&i)>ۆ+#\Ɂ^יo7~>p+uR @СzlLs /T9@"tUێ_t/T zJ.Lx!!$6O]CEPILO u_Ɵ%2 $SJ "Bjrj\]'eϖg PvQtrJDQ(J﬿{d}n( 9g߭ j{G&d29z&F{Z~}d)@0 ^V70(AQ-uf|jƚH Q| )9[SsSc݃0fl P$ 2u\.+7 E72O߱~&{v{?M>~Kt&=d>6Lےw:o"#> stream x]kOZYGSmU@( UK~zQЖ^7i&iIᔩVm' ۬rX^Y眵~r?grVUM;χն&ӎgg0YMkZ;pw/oxc4zq+|۷#<Ø^ZZΧ==r?jL>w0|^ G7\5Ňc_jRXJv{8r8JNgІ4EiB*)n/,@q(ACdf+V⽽G}}%(nwYUZtKO!E ~;OUPU pX ѺOqʻrm,ehjVk.Wp8dp ُFh#ʎw ݚupTOn+:m+xf++JpXݱL2{ݬVH$A#U8 - 'nas?ZAn%d^"A_`rrgrrkjjsffm#ޜn>_Atj wS)pC0 pHa2/F5zGa`*D``0Cx'5Yݘ[\7 )];??s_UNɝ;UG,q +9) c57`Y3|b}xyyme hkǖόP =50@%gQf+l#0mOL* KKMton=k%Uy60yeN/'׮aw'MÙH5%Vv[ZEc-gq Y"1(b0xvXЖjb 20]Z6|vV`[W嗖3ěS/, &w o6vɄ]ԏn> ;D,;?P&E[s5 ]\!K.Zy]l, _A:#[c5p6XC̗lߍ*[x?==tLreC!l ‚M?= |8y*l~qNýU~q UmALB7ìHsQA$VR~$5EX߁d^+  waX?V saŁ p܅r> H|{͛SUL ]hDd EY<3;;9AeΝZwOtKZU!3\%.׿G'FLH"Ѽc`6C."|;N(̦1_;LMeƠO4tZu,C>@B=n `әd0-%3o2|u GKf{QNA=./KxY㔺hO3~4J}hH<(Nf kwĵ>ֈҰCFB.h>ߑөWLg ;k~p`]PomS a'3,CCfGz?ň.ʰ=<٪z#,}ZJ XB锰K؛$1 uL.aoK[$1 uL.aoK[$1 uL.aoK[$1 u첰x ˤR}{foD'(96Ƿ]0{En6G.Fdr{zZtekdIjQXwߑ/HY, F"cc[7  vM/7Ǎ{W]NѼ_ؙ{-? fN|i9d.{j\(D}8KԻl\gw|yWI4=o!tXU+ś7Y5v  jX`eC-nEjo>ӛqSeB<>7٠N>2^vj9ݩ#Fj7>'} #UTj}ff@H7fg0wFFOKv;}m~ yfR_egҒU/bz$nOLFH m~jСu ?^: _aa s82G];kho{XL@Ycz9HssaݎB>ݕ!o9Rt:s^oZoqJCgQ"QS;p8޻5n?*&$u𢝸FXgujT59dZP2 xz(l;4~[0'B"87!K&,5URmT#|~**'w|eTINH1_ZtzAvipp2]=yㄎLECxP&*$ uͻZskYHՋЍrbq&BYt<8HG4@3gfbւĈ1|Kq̣Q:{J >^I)E$h::{U0#M3-ʹhp-$닌G44htvr2!4bjE}g n$߲jz60PN;`- 1⑩4k̃07Gmnb^* 3ӳA(TBAvWNm4S;/8[AC;;Ӟ>NK&&mB7\Q^w @:B(ˊ(ExtNJ,;WͅBȳ4,["-'ߑ! =MU +}}(H.罽PVG b[|\0UY,HZ}/x].ԕfRj7"<^3^X,He\VQvn0\&:bpW-@λ._@^Qqӓ{}}֬֓;w Pn L >S Q~? îē9k{T[tzQ^r.V1/z@D<뫁**\׶>A9 VHh5O#hGiGSI붵ǜJ?{vʓo endstream endobj 225 0 obj 4073 endobj 57 0 obj << /Length 226 0 R /PatternType 1 /BBox [0 0 125 98] /XStep 3104 /YStep 3104 /TilingType 1 /PaintType 1 /Matrix [ 0.800375 0 0 0.805466 314.4 118.839199 ] /Resources << /XObject << /x224 224 0 R >> >> >> stream q 125 0 0 98 0 0 cm /x224 Do Q endstream endobj 226 0 obj 33 endobj 227 0 obj << /Length 228 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 114 /Height 88 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream x+Da54`$ I4 ʂVJnYecgE6RR4Yre8quŘ3y64{szȔmg Uyb[Sԃ K/kVyWKt9dy\`*3z?-1Xȗ )A惬0fZB\@| V _c`s%` g"`gߔ/\'1 5c@ykK+: ?w1V zܦKo}jw-A֥(E)JQR(E)JQR}`Qk=2h 5NwOČ,s Ƃ CEjOWS3){ODHe@Q14?N`CTto|<q1 j1ܟKɎ^|c@:LwWDt&n=jS*H D〈װhE^|O[P endstream endobj 228 0 obj 507 endobj 229 0 obj << /Length 230 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 114 /Height 88 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 227 0 R >> stream x/[aǛNO[eHCiE,~D"n!¯{B܂j؅Iv1d3vf8=Liۦ}D '{s ey_KSމxݍޛoj o4>DL-Jt=0+̔^ƂWQb9=VB=$s<8n7:EZX1 lBB.+kmE.Ε+Hyz0?ڙ"`j*xujjzɄlK+X}o-ɵ畕y`1+yJo=tECy%a^]]DE ׮u#>= OؔZ'Rf&z؉ossѓf\XGO d2Y%@V*+U dY%@V*+U dY%@V*+U dY%@V*+U dYVГF|*y8IG]OzI =,X/Xg?0t@+l=zxQWhqkC݉g[)xuuBOVu{_>o`ybq+ĪTd~l~S\ڡ-0P2AS۷:[L(( endstream endobj 230 0 obj 1038 endobj 58 0 obj << /Length 231 0 R /PatternType 1 /BBox [0 0 114 88] /XStep 3074 /YStep 3074 /TilingType 1 /PaintType 1 /Matrix [ 0.805477 0 0 0.803558 315.2 121.461706 ] /Resources << /XObject << /x229 229 0 R >> >> >> stream q 114 0 0 88 0 0 cm /x229 Do Q endstream endobj 231 0 obj 33 endobj 232 0 obj << /Length 233 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 34 /Height 34 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream x-0K38 df!"(4 01@u: }K/)ghrvij}[_hNi3kk.bNo` p @G$S]j9Ft,QMxc4Tlq@ endstream endobj 233 0 obj 235 endobj 234 0 obj << /Length 235 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 34 /Height 34 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 232 0 R >> stream x@E/`$ES+lB$Nnwg=6i<0nqUU۾~m){>eF$/qN'N"Ǻ\.} #u<:4o,:DEQ؋%#xQ"zq9rw5V]=B ˲z -GAtʺ|/E ۶Si4I+(i(niiL4u](Q C0q(A O62!gwJ 9#z>0;sҿQ҈^oEE ov!>7DݔWiA<7u=\lέ endstream endobj 235 0 obj 353 endobj 59 0 obj << /Length 236 0 R /PatternType 1 /BBox [0 0 34 34] /XStep 2911 /YStep 2911 /TilingType 1 /PaintType 1 /Matrix [ 0.812775 0 0 0.812775 332.8 157.340506 ] /Resources << /XObject << /x234 234 0 R >> >> >> stream q 34 0 0 34 0 0 cm /x234 Do Q endstream endobj 236 0 obj 32 endobj 237 0 obj << /Length 238 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 35 /Height 35 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xc`@u`,1ҿo!߻-1T]UE_TH~cxd8CPM?DɊTJne``Sz0\įf) Cwx Tخ endstream endobj 238 0 obj 312 endobj 239 0 obj << /Length 240 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 35 /Height 35 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 237 0 R >> stream xOAy6 ;̴K,-=JJmK TPxF &jxDc0$B  F/gQ )Rq@AAT*HĤlSQ%B܄fJP ,~o f2D%p hfm =|wiuq%$E`؂D*JP0w^`z#> gW|ny8YJiTP)#Pԗ|$% rU"T%w S\<6mFysn?TOٕDh12ӑb)N*iBA'l9Bk&f&eb-SHsN@øp FD?ސC|.U[vu ;K&9'],0"eT1J‡ wv]['ɒjV7.ĐMf2IИT?.;,1 %\tL]%E9馻TWd#E|bcS \T.MW@aԡ<.ו 0d8t_c?]BN]IQ* > >> >> stream q 35 0 0 35 0 0 cm /x239 Do Q endstream endobj 241 0 obj 32 endobj 242 0 obj << /Length 243 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 20 /Height 16 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xc`ɻ|<ʀ ˔BZ#_e@!! f`;&U0`})B1N>Kb0&4葠?(BA܀ Ѯ|6 endstream endobj 243 0 obj 130 endobj 244 0 obj << /Length 245 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 20 /Height 16 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 242 0 R >> stream x=OP` F1~0.Vʤn.vibCd&.E^ZzLL=Zcr'$= 3RaaQaDp?RJHSiP脞Ao7~4 Xڳ!յexrE=n lwuaR B^+k <;*ժƎTwIy{ى+U^i3Zڢ]\z[B*#-+egu/e ̦7 S6_ g3=5~:G endstream endobj 245 0 obj 286 endobj 61 0 obj << /Length 246 0 R /PatternType 1 /BBox [0 0 20 16] /XStep 2872 /YStep 2872 /TilingType 1 /PaintType 1 /Matrix [ 0.816077 0 0 0.812889 337.6 171.968628 ] /Resources << /XObject << /x244 244 0 R >> >> >> stream q 20 0 0 16 0 0 cm /x244 Do Q endstream endobj 246 0 obj 32 endobj 247 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 105 0 R 106 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 248 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 108 0 R 109 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 62 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 336.115914 157.022292 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 247 0 R /Extend [ true true ] >> >> endobj 249 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 336.115914 157.022292 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 248 0 R /Extend [ true true ] >> >> endobj 250 0 obj << /Length 251 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p249 249 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x {xGHZà7F qxl{5 >CWQQĄ5見~8 endstream endobj 251 0 obj 73 endobj 252 0 obj << /Type /Mask /S /Luminosity /G 250 0 R >> endobj 63 0 obj << /Type /ExtGState /SMask 252 0 R /ca 1 /CA 1 /AIS false >> endobj 253 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 115 0 R 116 0 R ] /Bounds [ 0.611607 ] /Encode [ 0 1 0 1 ] >> endobj 65 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 335.087722 158.050483 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 6.929688 121.070312 6.929688 8.960938 ] /Domain [ 0 1 ] /Function 253 0 R /Extend [ true true ] >> >> endobj 66 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 334.91096 157.540435 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 31.5 63 31.5 12 ] /Domain [ 0 1 ] /Function 118 0 R /Extend [ true true ] >> >> endobj 254 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 105 0 R 106 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 255 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 108 0 R 109 0 R ] /Bounds [ 0.946429 ] /Encode [ 0 1 0 1 ] >> endobj 67 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 364.887112 168.401146 ] /Shading << /ShadingType 3 /ColorSpace /DeviceRGB /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 254 0 R /Extend [ true true ] >> >> endobj 256 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 364.887112 168.401146 ] /Shading << /ShadingType 3 /ColorSpace /DeviceGray /Coords [ 62.984375 65.015625 0 62.984375 65.015625 54.179688 ] /Function 255 0 R /Extend [ true true ] >> >> endobj 257 0 obj << /Length 258 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134 ] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p256 256 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x {xׅ0QBGm&_ ' >zu%*rͮhtE?7 endstream endobj 258 0 obj 73 endobj 259 0 obj << /Type /Mask /S /Luminosity /G 257 0 R >> endobj 68 0 obj << /Type /ExtGState /SMask 259 0 R /ca 1 /CA 1 /AIS false >> endobj 260 0 obj << /FunctionType 3 /Domain [ 0 1 ] /Functions [ 125 0 R 126 0 R ] /Bounds [ 0.611607 ] /Encode [ 0 1 0 1 ] >> endobj 70 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 363.85892 169.429338 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 6.929688 121.070312 6.929688 8.960938 ] /Domain [ 0 1 ] /Function 260 0 R /Extend [ true true ] >> >> endobj 71 0 obj << /Type /Pattern /PatternType 2 /Matrix [ 0.255024 0 0 -0.255024 363.682158 168.919289 ] /Shading << /ShadingType 2 /ColorSpace /DeviceRGB /Coords [ 31.5 63 31.5 12 ] /Domain [ 0 1 ] /Function 128 0 R /Extend [ true true ] >> >> endobj 261 0 obj << /Length 262 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 217 /Height 545 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xWsa 09)R%HP\{ ^K{f0$O?;;+hT6_ﺰsc|,s\Ve4e\ZuS8M'=.V)*Ӱ3+@m>\ B0lDefnbёyQ6LDcX<F#DyI9h,H$D<F2ߍڥXTJ8 M|8B.b3aIKK LRi樬I$x5:#b(̮ e9 YN52p$F.3WrT lG r˕jVK|6Jbh`ɴjAի33j1|72g%eUk4[v٨UJLJ`cJFݥ:-zd[nnx%FIXRouz3xZLt$9\kvzh4::,0jƓx4赛R!k1#ZX/[|z0֯Y(.fZFvbe (X*iMvY/fAQ),O?Vc\owf9'XaaFg F2R[mvnZ03sXcakiMG {`v8w%` 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0z$c`eD0ΰFx4g$Gra|206Y, hR=laMf73x$dфtH{*pmX,ZLD#!ML߅)ǰÑd>+4t2Н ؖ`q[&kVKt|qBA iWkXKÎxG45Rx {^N+>Y4Zf2dmp8M Gek>>ڍZ*dL:J&W3izh}cpzNwYeB>kFt^Oق >=???>>7t0*YD|.50V pq}% Ǐ'{1zfZ)V\N}F&6KvfĒa//?tXL~h%ER 4o)}0Ln bfZj6zj?bZ@yEg,noiͭ4讨ao̖x4N&hkjsȰ,|GC୆ո۬DAnW´9Uș$Eb|&f\'7=3Zgd<nh]DEF!Kv 0-vZ-܄>ѐiu%3I^}۷'X7wǧ<2=ank-3,Fdoz1>{{~#܊>|6n+%gdw؍>Y\o'GǛ#;Wm˱o\{g)szx5{]OO?^^g)i1&YV6u+o]|x v,Ҳl*UjFpU [aS}#/d9助w -zd.Y"1sTTkzt3i]WsFv 6\`KrR^UPzQ?{dM\9_]052[3#\,*~⟩gd,C'd3L3%bYo޹쑹d-Ng8CL;p2 UyEL. ?JiF )vNs 'q"Zf Qy9K^aW{~k"dziӼzyEdD#߀\[hK/5 endstream endobj 262 0 obj 3002 endobj 263 0 obj << /Length 264 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 217 /Height 545 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 261 0 R >> stream x1n@DA70Aӓ$I澼Ӥ7^ԫP4}C>"UE=;QVQQ:Q;DQO@\ Z@r(jQҨQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=ׇvm(کhvj(ڝhGvg(ڝhGvd(ڑhwvd(ڑhGvd(ڝhGvaފvd(ڑhGvd,ڑhC=CюlUUaP}y8c{I> >> >> stream q 217 0 0 545 0 0 cm /x263 Do Q endstream endobj 265 0 obj 34 endobj 266 0 obj << /Length 267 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 219 /Height 33 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xWQaAq?JzPRPR$bqaqX%\rIHQ@?\>}N[0 0 > stream x1 0;Lf hFT-C*!ʐJeH2RRxȌ endstream endobj 269 0 obj 67 endobj 73 0 obj << /Length 270 0 R /PatternType 1 /BBox [0 0 219 33] /XStep 3127 /YStep 3127 /TilingType 1 /PaintType 1 /Matrix [ 0.802647 0 0 0.8065 153.6 392.760352 ] /Resources << /XObject << /x268 268 0 R >> >> >> stream q 219 0 0 33 0 0 cm /x268 Do Q endstream endobj 270 0 obj 33 endobj 271 0 obj << /Length 272 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 234 /Height 77 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xyTSƋ9  !@Zj[mھ@"Z\rk|gw^{mafa^AF9uu QZ:(MM uG1beW BA00Aj54_5ԒPhF#Cҭ)%ShFtS3903516QWZB&jH73dZ6l5 b jP%ˆurrlHadk_gH)TWF7st===<`ʭc&*,_ʵk`-CH,T)`;cӳsrsdixadha- OQrkO E/R%J).+7 '3MY o5t R*ݜ&s &N6}RbZ:AB&Y;tX SK1fX;|Bb$3g[P[[;n̪)JF'x619Bl̹u MMM˗-Y8ǀ_/W͂‚nl'E(Ud ACS+[gπČUk׷_zEc5ӧN(+J&FYȱEbs{$@WSPJ3W6a-wѶmkV,_R; ["/k s dp5@=zQœ7oܶkoնeMa֖eIErk‚:D( MՀ8{Feg,hhnm{G=rлھeJI`mFN>(-@Wz T#s_x|j^yռ[ww)#サoώڥ UO\Zf%|/砇1P(TC#ˎ.]~? ~ Iey%gAJjTחoϿ<|ýk?8+ͯTV!MqX @WKl*c )  ĈPpS 8QR育)owT_Ǐ\H,8 af4Ilxז0@v(S C`H8<76..^q*;%ҴܢqS1O"?x'O>}_b1gϜ#n&Y(Ϟ>y;,=bB阜dQLx/і%\۰\ĩxEU;ep8{Z\x|oh,^Vvkww;<ٱmXH~kLGzֆ.I:zc7zP~若X0їjc7 &^V9w-{vo]ĿM13B׵Uu8LF`m'{v'XJja{A* 5& e +;E%f`mo_W^!~)7sέ(f'b86Ύvlݐ+ IT|JGo ?A 4NVvN`$ha q?4+oofYU̴$cǧh[ FEP᫭CuZ,X74.9Vmڹб~=щΣ=-__1(tF =»H`~wy=h)G.S Qgۙ!J/?m֝?qĉGQx esUd&lQ@h f4TM +H[|Mk۞: d۶@|4C5{3@]r<񯙫)b67AX\JNԚvj ;Cr7s<}Ǜ1XQE8#E5 V۴y۶n޴azlRt[|  FȫP4w ƌ^P߸yuk׬^Ѹ*F̐@_/2 G,5Ҟ &e)2cN ˖.F8L 6:(\PnکvWIhbFy͝]=jʄ22L'$Zͤ T NqzvaS++++L_:$%uI񽕡mֽMgbiRTBrFv~QqIii|PITŠr3*H)1…"ijFYRqefMߗc`p֫+"""#B@%v(6sh[u,;GwO_l8'yCLv:6δd;x̗yO7`Zr{-nAW$z ^0,-D2deӾBR ԄYUa}֠4C b^C[0 30üRj endstream endobj 272 0 obj 4056 endobj 273 0 obj << /Length 274 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 234 /Height 77 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 271 0 R >> stream xwlVeŏЯ-]P6-BQ!(2FDąQ0@DшQSpD(&J㎠APDhPAe!9ϗ2z?=4?yy/ B!B!B!B!B!B!B! á".z}/@$gu*NP C"`}>Phjɩ@9~v:GɁn赒+Şg|.eoX \ \ t:1Q=5fOס$ƞOJGA1m~_ ׁǁ H`=sX;1Miㆴ+řéCoX 9FV{T |0yi`"0\8q!Л6R\Esz8&P+U(ogX00 xu>fÃgggepy8Ӯ?R,_i7 Kk,3@p6.K4DɽRiPJmgqj3= OQuMgOwsFդZ~?;ӟK»7׼xic,£Y=_{8M!b.qܛTIN&/T)S{{,E\ʼnD?N:2ӭwK ڽɳ3pN 2@Wv=(p/+prF@㥆k2 Å`GgkK =++ `isxn@;鷱-e!ƒC ʬ2't,Mnږ׾u"3,ݛ$Wr<_ [L.<{ѽS{!N.-Xfa'ke<OqɃ.%77˵Q޽{B~f%\B[Bnxw&o{- sٵYGٶDciAk-zZw% S8pa8qNZf{m,3TuE\|r;9(aj`9⣆)w{%0+8mj!(qBn+I|ے5\uXlr]gp?&G0Y/n[Z7k 2 ?hjO30->%wܡemf\3+\{{4P (#jCLsEnLooaT̨Pto۳oe؊o+U\ȱ:uѷnw*ݦ aw69;zݛMP=NͿt}T/*@lrڳAC{f.'4762ߺ'- /hDçUYoe造4"@-K\XێX>|]6{f9!PՉnUL͠{/Aen,ծH} OGb-o'>כmƑWr |#fXo i[ KyW|Tẙ QEtr_B!B!B!B!B!B!B!H#h endstream endobj 274 0 obj 1927 endobj 74 0 obj << /Length 275 0 R /PatternType 1 /BBox [0 0 234 77] /XStep 3188 /YStep 3188 /TilingType 1 /PaintType 1 /Matrix [ 0.801789 0 0 0.806319 952 285.288271 ] /Resources << /XObject << /x273 273 0 R >> >> >> stream q 234 0 0 77 0 0 cm /x273 Do Q endstream endobj 275 0 obj 33 endobj 276 0 obj << /Length 277 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 234 /Height 77 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xwTgƋ@ f+@"3 {-:E{TQܢѪZgb[+VQն9j[s^.{< 2 2tôutmmao:d5(R :uI$DAj54|=* #PFC*lPZXbBu (4S@75162ZBfjdYVl95 b,tΞXYH-Zuek럽 R]fd;nn|Ԛ3&rk<@^Єa<|n.N\[6XkB3Dvv@ŔB,k.?X!D@?oOW=Y☂v7kk*ዔShfNnށBqt,>!!^& \[kR:Y;*3vtxZ/wn*c!RCS3P$IQ4i̪ںE WϮ^2ᭂ`$Z, pukPXЌ]R\mr~ECbPD51vt M-\VYStꆆ+-]>uآdY/k9֨0C5Pkj$H|ШĜIeUKW7nشy׭^xʷ1kGd&HD`a!?!}PЀ\Up*,0jM[vٻwOέ֭^V`.fma^Nz,Fn-QX{oz~u MMa/jGwԼ.ol޹9|=;nZ߰b nb6%!ہn90-4@vOf dCc3+ť,kܲp'NxΝ9U=ZjF\,8i%lUJT#4砛1zŬП3inݩ <&9tvʦ[O]|k׮^g?9[vamnfJ|^X!f&Va]S7lβ@U`e/XslN.P&fN~fٻpʷ?\q?|wWh;wknj>3fV IOE0&URlA[Z٠9A*`%Gg/DU0lޒu[=}7~u[?߼÷Wbd NM @9F5#\UYkt->wuuC9أo\KqIYpVӰy._;ܻ_Ə⧶e{+,Ŏ,V';k1.UTѧ9Gn^>~'>} RsFCPym׮=z;>`?1]\;wvYYtDkR)$]-MeS9LH<7/P0 C> aX82F1p〉՛v#޸}'O?z}^%1 B/,2(/3I2<Ӆk͢u ~6B##z"ReȨ,)-;*_PrRz'?}ӧY+ ^̉h^Z.+[*{쭘&TJ: &ME'Ho:)YBrZ戂1%H鯏~{ǟ<pfX65Zt\ANdx#L%NRK4x E1qRY||K!^R2r ǕVU(yǿ?/Uh{盘_=yȁ=1e%c3c!_$))9%5=+7hew?ZlI瑫Z65,[4wsDA>1ԃRSo D&{I&@jjzKQF`c/IaB723-6vPq \\\<PᏞP6w-}xeo߽l hײy}^OvfdVJ|84B^wi TjT[Tk c Vh+|#bGOqVkM} *ܲqwgiow-tmHN_iTC1>tCWbNBT+;,P'ST2s ;|t:kxkĿQ`.0sʥu5U3g8Ȍ uKfػ 2 ;& 01A/VvؔcΩ[q>o^z/?7lij\ ̄}qQ$! YqG>)p v2f 3 )(h _11~ZMTcb];~ZUi֋64*afU|݃ЎYh@D3[V?nec=СmްnRl,u;m+/՟+W'3{P'6Ph]8nڦ-wnٵcks\&.nS,k.O^w]o`kE|ʴvEӒڥ֮oڸicukV,Ac]-6i!~׭Ŧĝ<DoW-Yrժ+-^bAfB@ cd ,KҎ'KFOv CR :/T~٫CM ;x%37`taaiIq**D R=/T#KJMHOKIEa6c@/$h()Jb#Ea$^Yu sPbLJzwvC:aXxx0$(Tbs쫘e{DӨΆW|>OwWy#3С:8\| ّy_@iO2Xlk`˱f[C9dW$z#c:ɲXL/LBJ"cOf&4P:aPgPd B6 uck 2 vƴ` endstream endobj 277 0 obj 4031 endobj 278 0 obj << /Length 279 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 234 /Height 77 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 276 0 R >> stream xylVEŏЯ-_[*EAkQDTԈ@n,EMU( Q (%"J * ;V!3TR˃?99sB!B!B!B!B!B!B!qX3W<* *>\@5~ ~*UBcPV!0}CNn@m&G)cp }q#UԳR"5C7h ڸr͢u2vDW6TZAAOfEbz#DKt4\<fӭ,'prqO:# Ïwh㾌A)>8 h uZLDƑ7"#<MwÀ@ hj܌6hQ6M'WgB`H5>*ޗ2goOH`(0;p.m܆8q1m܀6v8u8<`荪clu ?LAEwd)np#T]ZmLU^ *vo% óXg<|p%П;@gDsfF.gGH\R{-/@  $6&'#qGM;QrttMmgvr3 wؚ=]w&ڲKܔnZ 8}@MA$[ ӍwّxxM1,9]5vD}B$`7&*-!:E80wLn}`: <Re4-yʯ;kΰ[o;TFldC[9<{x x8p5#ą짹<j[auVXR9Y.F_YWL LƳ6!܍gp9׆ֲ*S!eiB!B!B!B!B!B!B!h endstream endobj 279 0 obj 1926 endobj 75 0 obj << /Length 280 0 R /PatternType 1 /BBox [0 0 234 77] /XStep 3188 /YStep 3188 /TilingType 1 /PaintType 1 /Matrix [ 0.801746 0 0 0.806319 955.2 62.088271 ] /Resources << /XObject << /x278 278 0 R >> >> >> stream q 234 0 0 77 0 0 cm /x278 Do Q endstream endobj 280 0 obj 33 endobj 282 0 obj << /Length 283 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 1513 798 ] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 281 0 R >> stream x9 Emv!5!hGd v9SB'f0Zq#+5FŅFkP&ī, "K<$$S>MnJ9h endstream endobj 283 0 obj 92 endobj 281 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p284 284 0 R >> >> endobj 78 0 obj << /Length 285 0 R /PatternType 1 /BBox [0 0 1513 798] /XStep 4622 /YStep 4622 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0 ] /Resources << /XObject << /x282 282 0 R >> >> >> stream /x282 Do endstream endobj 285 0 obj 12 endobj 286 0 obj << /Length 287 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 401 /Height 401 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xidEfGQmTiUeF}ffͬ]=ϼ=q[.r.r.s~F.2>%.,>{⢲2y2x_bً*co@b:e9˰F9kq33\L31'w3GgBgcT!9([GcF2frWΐF验31ГH-+h4Y&Mh- "qcp Qn ɰF1Ц Pn,(hR<&C69k5bXaơ8A2ɑcȗgݓə8:z͟HN P&5E$&A&ALΌd#A82iE]9" "Q"'sp?ox$CQk?`@&s$~y G!,/d &zrIHx9H`( z'#T40br!4 B(D IsH f!Nsx?8ZU"&d$a5CHK\((`b2Gr׻sx9D8@b0෻G@'dB204kH W]HPB*9f<<,Ci a/t~- UL ɣcVU!0B#&:ZG J5Qm"IJBr>)G ˰ $E2$znaH"9ȘGsV GYt-Шh!?̡ PPbbHJ($7'꣎+Ve2J8FF@ ix$P&CT%ڏ.2AţN+GUuTFF YzPḒ%$bl"9/GW2˴בA( hPADD\-80$۷$2!ղ\xZCq,ñh5LD&d*!YDycy뇬W50X9`V) ` xտhQd]IKܪ!QcTQE!nb\q%AR6:ʾUCR-oBdCWPb\x8H1Ŀӣ]2TUCRIpۂ"Uk9GW, IpnaH"wFp z:rE;0Z@Q *5#ry:qU+2B!-8E Kp t;-v!EWp9'nVWABCcMhg1q$␼[tGl\C7 d\eZU8ZC`xbHy'X]@}J=sa ĐԱ"o F<~ :D< Gd*ޤviU";V5r07p(m9F!:%'s[4L4Ej o료+`Y* . UHy$X~3F֜20oǡ5kcz D-">o^# .X:80Cc gB$zne=j$x-X(2t{9VX*C$uݢnE^ŪPCk  oߣԹWT#Ј^{ [*$0D #20@QǕ5D(MBc D>"}įZQSz6wp+,BiH±EwD%Uj0$ +x@q9v(9 -؋4pCkl`=0JO(5,J@BE˖W-W#8Y2b =T{D^'5H5 ߸F5K.XscEc$08$T$K+DK"Ck(`5V`^8vp&[, #tbo-yYR#G±FbEE;v5ODWB?̂5c$j ]V4 큅RwyZ8["u V-dh彾 ,X^]@Xdž";=+XY@3^wx0՞X Ol@ʻUN"7ߴGfR;/9>^d*"^ nM{]D.7_[kfяMewF@F?N;#*"З.Ϭى)%V,崆=Ѣa|mg1IJtycޓ ORC9"wYͥN1/\U@NcED|m*B߿#fKn@6?k}]כu?&J$*Z~=Հ|""kg~&VJ׏y{9랞W<WYvϬxXQ˧X'||>K>y-o0D[/'H;"gV ү$EoۙY}0/ +G~:,[$|U1&JdB+ Hά%2Xx+^B`bD<ˆ䵮g 3cюL=y{wZg=ϚZ|*gBҋϱV&Wzbb@F",Yjn+ݱNҗoPbfϳ3xKdDU_zVh*݁93KMoD>W!X3+ŗK$`uϱدk=x]]"qT=yw,s 9ͬŷU" A|I`[SѭT'VXbfٻaY|ߥŷY"]AVBcbԈ~}$>bn!{;DqV} $\NoUX'Ξ/pgM{t KBj,& Jo"q|GKVZx2U\"U׵D¯ΊZ}]p,{ Tȱ_3]"]dEk@*锈j?Vwlr+KdV^苬t3ViY$\n%+t|7+_"8+j5\='Vhp͚~pX{TVYͽw_KuTհzо%"f5ad߿! ~§Y{N u |{^d_/ f}]z3֛T5i^Cܣų^f5{o;!7bz]s A̽0xFlSkǼwqg\ŽNp/ԏݩz]Dyof /ѽ0dO2xq17Ñz_zO V/"yo> \O"B& /g'A%<@~Hn]"tUoQg8 RޞEA0g'Yi]א<{?>za C OdQdW5 A_@@ 3i?§CO/ ͳ dcsع!c739 |t2,kN<\dۏ^urroP]1<T著!HŽ{onW._<5亾 h ")F\;v* KI|)07mbq|u/~ ?Gv7ӸvoؙdLJYoi[Z+^?qU?o?[uQ 9אg{]~p@uf~`0H"dxF%255d4׬%y YgnkYx.~H[~_Yi۫a"21 YkZV&r3+HuO'Lݯɛzu&3W?TAz_U'ro%rC}XɯTH}oJ~G~ҝXwQ>7kd"2PR>VgY'^@‰޳YBAZ%‹:7Uީ Ah53K i, 9 %vz^"qY|?~;v/Bc5&hJ$}O3 UXD$xEkd%,bf7E4"$tq+TK>7-̒O>"s'j-=^3K)b9 4x ϱ5.nHۊ&EU:}{4&ޙ,a H\9Vcu&H2y_E c#VV89,[ٜX+ HTVNytfgTb]hu"١zK U8&g?Z F譀J/OÉ5vg m+8".u< wy\BL2ϳdm}|ÈxhmH$yKWLjպ|kD>7Z1v`·tu i<i̬ӈ؇Z kt'TϬ cuѽeԃ}$ 6MW֝R띈 ,| ˃ekGE׷'b؝75]:H ,xwJX HV.D|eb> ȪYZ"Rh"sC"I~iCyw~Hw"l7&DG@p`F/X& R*}U3ZqRFiG@.6"}5d,.y2=FjGDE"p;C jE=+/OUz27/RWzhوH =X |Qy@l#RN-O=Щ@$ z}_z -S#=k$#X_؁+oy_ W[5%Y=j[OXqDuZ\#ɪ"OCrG켣+|DD:^F+gE&=@*wtjX_@ #bCz jD{O$ݼ [@ڵn#RVߥЂ!H.!E"GP b`q{ HV덈^_0Ħ%-rM$c*7z]yKz<%"Ro0CAHBǗ҃<\X;d0"AˡUGDMr? ҂{f`A˕w_ k,Z C]#]$$$t e 2Z5"rhPZZ!g&= b7 w H7"aˡԈ\~H8LmU Q ~Dꋗش3-W#c"iHv4=M7Z Jh {HGtDL*ϴD4DHHVн0o u㥁U Nd$ZfjM$&ῑcXw`DUiQcF%7`l J' =  DoXQˀE$uz5V d&O+(_ϰ`4#]FF]>f9, -z15N "AګZLjd)vj%"Fr/<U { w ]}9"cXBIv7>/a~bR)›RrV %.#F.XD.&23q‚ŅNJek/Zix̨E>"Yih3JC (d`5}dumDZ -[:%d G<5z%k҉-q=/y0V(- !&W*MXCpRp^Sk Hв5"h|Dz$d x%P,Q55rxW:AH#؂nsK,KI1Q(JaOx-*FXQ8׀beRFǣ?q!s+&&DaIN X,00V]я=H:%HdL*iOd ` H)xtE$6yLJa: @X,$ѐJri%Ѩ x$"~lILLЄRWU), HXH p48Nq!U"DĚHR]FP<0V̪1m+<+CH䢘 UU d~ RQ'UUc4Ic"MU Ku!{HX0pf% {Lx,PHTQ)BaLVxlÊ"1&T* $Ib = x<61*tL R1?kX,#ԘH(F)*a$% EVCqYH pؼ"i ˘ClQ0"ƣqG43(.@֢`44&8Nģ!HҘ T`AmcH, Xq2!IHEd6Z%1B.ƣM];@r6F%*H4F9Nܒ$.&TE8GFqӊNC y (E5qVh@AbQ0=3PY8$pH"*"aßH# ǹr DIk("]ڇ1qIC!߳ƙs,gĚeEA#q+$ġ(8o=j0Hc0gñ?/7ağ8wtH"F*KOBX7c9=a(&OYHYs3ibTB1r,'/7&Ūtd~#7c95(ȱŸ 8௺?ѸiI^ oD>O M('}A2iqшO$(s.?clz&)JWZ.p/RWeUiV;tcot_5.#÷|P4̱OL;cй`l\0x.<mVr.f1+ endstream endobj 287 0 obj 12516 endobj 288 0 obj << /Length 289 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 401 /Height 401 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 286 0 R >> stream xQN+;DQ?iS$$]쵵@lw!I$I[![]f#&N=1b$* E$E tjo|U,EoEk?IzX;;Iߋ<$)i/q8i(q1CRcail񯃱Qſ*H_uHO5⯝eH,I:fmҁ3,ِBwΤ?W"=,Jc nIxHH?Bm^ aWVB;fp -\uI^GJş\@ Ep%U?U@*CËFc I Ns? şQ:Jz(_:Tӕůk_4,CgbX+~$QZaa:tTM[;ů6׊_I/5ؙT=_&/~A Vj{K~7ܧ!}I_͋?W;?|{?ve?p?pM?j;?d@k?^Xk?^p?X$?R<?RT+?Lk?Fk?F2R{.[耈4?4 qY]ŏ k)~PO b~#F^|Q&?`OhfcƚV@ɦ?`9ŏoN* )~@ (b"& b" b" (b. (b.& (b.& (b"& b" (b.& (b.& (b" b"& (b"& b" (b.& (b"& b"& (b"& b"& (b"& b"& (b"& b"& (b" (b"& b"& (b"& b"& (b"& (b"& (b"& (b.& (b"& (b"& (b" (b"& b"& (b"& (b"& (b"& (b"& (b"& b"& (b"& (b"& (b"& (b"& hv"& (b"& (a& (b"& (b"& (b"& hc G& (b"& (b"& (b"& (b3Y@;6& (b"& (b"& h_,ZiZ񏂙ſ/Iſ$-SkTҒſ,'PCM҆ſ;JG30!$V݇cKtA/` i`eERWѰQ)*Jқ:I:$$I$ endstream endobj 289 0 obj 2064 endobj 284 0 obj << /Length 290 0 R /PatternType 1 /BBox [0 0 401 401] /XStep 3686 /YStep 3686 /TilingType 1 /PaintType 1 /Matrix [ 0.801442 0 0 0.801505 -4 430.771453 ] /Resources << /XObject << /x288 288 0 R >> >> >> stream q 401 0 0 401 0 0 cm /x288 Do Q endstream endobj 290 0 obj 34 endobj 291 0 obj << /Length 292 0 R /Filter /FlateDecode /Length1 4344 >> stream xW}pw:ْell+N\@d#cAu-YF|X4&vRB q,(5a tSLL:)2LLvRt )`oO2f_t~cvn 0H0뫟VDWlz_Z\ #NGogwEYuO<1cj= uuGcO0{Y c(?ݿp){Q~艞MQ>/,vGk(KO@sA7ufG丒)d9ӣSrmqg8,xLՍZ`4:hr賦_nFq&n"4hh?p;VM8"pqϹ ׆Vg빊hkŲu^ñ`\e&M|y$9ycڜ9h)lM^ 0PaCq|"XRQ, ss7nhmrbͦtJY-_"otzzi즏 ^:bK. ^ŋ|ܜBs0|!o* #\X`V1l\$f)U2rXX4"[3ݕ"/­[hpf}v88/?5z@"& tl2~әZ=ǕCs@EITq#Qœy֙fYwjKwh]#Yi+"/XНuXyVN٣rivW=j3N^ \\Iӝ>38;M9igHU'aRnpN;)؊+x:j_ZډYkKǏ醦7xƷץX6K6M%6ʗZ} ,";Wi3Xo2mb <M A; H=;]+1ՂQ'S.Sw'{&wC WZ"_TW@T~%-|lrُܲ?,rќm223(RHjIDKdr4 JQf&oeJRkIDi,++~X#Kc>k䰤~WjmDL(8!yj$D${+`P-WJ!a0bӈ-uܛ +֠K2L[+Fcj>䭱9:5[TPTjU6a(4&ƈ3+&ǢC*E8:GQl4Gޮ5^ɢ'pKEYŵh>7ɒ/GǒeI㉬x`ƒ췩ª"K҃ 3[B*-I]QDlKx&]j@"`?FԁPJ`-P\ΰJ#L3>mb)]hU.&{Qu`#TȢ}9i+JU]lJ+EMȾa%iaX썤OwcT;SSRl(y.Fp6hӧ^*WݝOwsCHsIj"^[zHM*KwJbd;@U*CpuH!CU8a9f ssh=1h͡EDR />FRapɩRڸ0H>lU3p eKj"649&mrOEq6Gؑ*eRc`T\1 FlK!]]Cll4jOFTO LM'W仢uݔZgȁ8 .f^["Ml?˾(nb~'.mr],.7iiʁ 4Vˬ*!} khゴ1%:RN!\e}3~}ͷ!3g(;.:cGG\#nHH z>n?v^9J80WO ӾOğ+ÙFȑP9DC1D4!Ժy>)>Ar b]A9_/h?zHCz@1l!--BBT0#iIct{ә䕎`ljsH;՝]i _iۂߴk--,m!m&כI,m& wN\#fÍpy}kb^K^9Vo1QǕF[t= wO^?i~OnՒdo-YZKlI{;BM܄'&'aX15\5u?z#d}eI'}$+g?> stream x]j >$M)@ٽ?4SQ1搷-t@7ߌ3_{k"* Feex#,<> endobj 296 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /DroidSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 295 0 R /W [0 [ 600 338 577 588 576 258 338 ]] >> endobj 22 0 obj << /Type /Font /Subtype /Type0 /BaseFont /DroidSans /Encoding /Identity-H /DescendantFonts [ 296 0 R] /ToUnicode 293 0 R >> endobj 297 0 obj << /Length 298 0 R /Filter /FlateDecode /Length1 12184 >> stream xz xTEo/=%! t a f$@HBQQ uwq脀!*: d`1OnPV:NmN:'64CߍX{U+76/Xzsƾ ,1 w.llvj+,K;rpc},O^l^77 o ,>l&\#(9CQ+9"KQ% ΈttttB_)!-Y`oaFeQ. zN>Zh^lURm4i&4J(-a[v@5\LRwiB/-9( IDzHݥ:$eR-#ki4\a'u5VhH~T@:Xm|E0tUœ_3g{wny`æNj%[Wwߐ4b8?q<\e08znK/ьTg7l|\Ap;?t:R)hZMVW544M&]0eC5++mj| Ojx2@=;YԒVEyW8#>h-kˣy!$rД~HL“s岓ËS2bԻ|T{1һ\9He9fK1(&y/o. ]7q-Ș8N- xS`~YGkh,G\j'|7}&j) _ubr|+_ϣfBIn4Y.;k!+0$S56PdXU?ݰqG )Of=ŤrNOUܡ(^T3buKiع>U9ڒЮ+u )'GSN]?cs&h3մ8[6 %fz 9cgOf.Bsu a9- !C  کitШg/|`+yR>qKUfv8 %PE+ lckgR}c\4J$3$x: <g>f"zs73b\}b8 +`[ߋwTJϱ(e`fGpUB&|:16[ʦ9'~媧޶\~b7ڧSOWıĻ+BPfwFòT{S;kLve Ѹ}RBB$nĢyDJ-y5r9NiZSmvSy8X9^?k~9hi[G4ji# L}fQuA}*rK&>BII?Աg5=?$򻧿!+ > L6qf75@JJ<EW4:"^GnHRGP(+Ѫ8A]imgmjY,W/ܢU\>1SuY3gB!Øiʰ؆BfFg^W R?T}' Uj:^+ͦx,rw|lF(fղhX"hѨC`0&SDaw( (-d Z,^EJbbޗvI2zC3QNo{˟5>Ѝ7;ZNe{nKU3 nȃiYgjfx7u!qn=4!1'mvqƜG)v,lA 4E==4KOKu\L, WƮ2kjC UF1i-Aa E I!O|vsA 1oz|M]YǴ>Ç_w|% dP#k8.U[By.I{:DhpCM:CۙN.9 d;IMn4D41T:/@ź_WZ(A9q1mְMo!%)u,(PZ B汼V=gj7U=>|9s{ˠ[2'WO~޾uS"ޏ@>JIU_&dy)y#RQQ:j=MERbQ=ۧO諾K;+e{HBDŏfI_Otf#gz^i-QmMkWk>ͷ!1r>RF&|$񴢄^EӒ*B76edɎwnZyY^gVv/^n2eK'/=2coP+·-Ahh"!GC)v g~fΧиR.qHrr.rxZ욡 )eQxaZb^߅(S~oi EBgpuBf[,,4HDlbĕ-Lp{Xj]S jKS;1z{Oд]#QI=^̛Ր^^.4  GS#>{_L@)H"J滖2絴4$bҲ8,fW"++wCO1vn:E?t5L]ć'({7\t"&/?nu"I7s֊GCe_tbfO_9કZW|d zQp2:Z'>HH44G}{[6Mt$3=0!Aޮߨr9e&D Q ̶ Ia'*DLAcWE|ea?֛<%TK^̖WM T)^Zӻb2G6H(sWD|E2J;Rκ'lJ68^8ERg(r AmA0fh9m.\ޠ%%MĤEsLR:%'qQ]6qȃ({ĘxT<-N2V R%+e؜/Ůj$r$bs0\v9`J%ҹKHfcፏy[-}f{ـxfXc%O|?ȯUZf85) h5D.[Kʿ/3Cˊ'rq9jsl Gv-?2䙌eg_:{c'|>@eܴ[AJj]Ov.݌ӡgrA{=;44欆Lt]y6"W<3#;KFɀa=`P= C V3(xM@+[ OLt]:MSlhט [鎾䎞2m]'1 6vȈ1"c58KPA^ayV5^Q-@0b+Xa3RoeQ[0O; {y#*a7UCSf3L$`}x D=Wh`=d||%~=x I[:5#$<7}+7t27?~xΐh6,:f\$9J#8z#|Cd 7Gy"C./BxzH!MBm|B$Fa5t!L2|B… lwQo] Nز Ny.Bn 3p`ϯLk7Qxf^&mx>'nnL:.x7"8g$BQ===?_VD^!ܩLZoȇK:Ρ/}bX sd M5d(=4+sp\+JnjAs͟(]1 N{Xu~ +ϸO?p ToZ,̄.#^Vm!=hʹ XDz1-ØD;-;~=ZwK5vHI*̊? M0q/|`/:\ixs>#Q0*>ӏ4Ei` ^v#e-P3>sa] g#>k)g>%O4hyyluJ40;5 3# /-qtrd2:]t}tٕQr,\Á1cr+~UQjԵ<1^a"3^$\ ʀ;Yɬ)HSc =A+i;ȕ΅r˕QWWp:Fl!s;c8Q,頠6b@Ee`+qʆS++<~9/071SDa41ȘL#/b[%[oq 5ls筈9n=[FVoukt.Y}3׭~ؗFշ©8PS#pJ*@%ocz<w{ tg])Oce@MCSo9ʮk[fwH`;$7hڦP ;^,a+ Ed\Iu4eC}Pdï`|]{MZb±IӫCxbQHƀJa$v}T@^o@a*}t{FmAY-$%36TOG:iD=O'H ~ߟ/$l*f.*x2#a(Ᏸ A& ?zUدL>A,lq8ڣI+1\9@ @? `Ez3[X׆QJjU0+A@'RzO`p!Is!FP)|fZ#(ܑFt4-S bmR7ڛhG9ҳ(Me B8g1 >29 G駘K/lesgM>,*;$ % 'IXyoO`>(N>>TH}ԇІaB A}>>b'>Qjz馧:#|vo*}Co4i>(a;` 8ʁ/7#(9e lCP#4sςbh'|q5D|H1el;Lae;bY-H,|:X^ )7!Ų9H,|q U& )(& NZs-E*zDڢF^U*5jPۺg8T_T"64R-ƧƊ"U1qB`mM;&qV\@y=37SSN2gexTſyy Y5:ljM,Ԛo\8LPMan8GTV &3>ߑ5 : d:-p//i4RB OC5B +h/2] endstream endobj 298 0 obj 9021 endobj 299 0 obj << /Length 300 0 R /Filter /FlateDecode >> stream x]n <ݡJHfHSwal@tH A#uҐ釿c?(, U%ˆWc@2cE4pꭞYBK+<+^auhk9%:Pq/½ H}b܄um!T9]I '$za2ZWЪq~&ۨIΣ,KT%:iC@tLTee(ND ё葔tfC$HD#"r>$4@%2Q} eT_SԪܓiۄ703HSo,_J/ endstream endobj 300 0 obj 310 endobj 301 0 obj << /Type /FontDescriptor /FontName /Arial /Flags 4 /FontBBox [ -664 -324 2028 1037 ] /ItalicAngle 0 /Ascent 905 /Descent -211 /CapHeight 1037 /StemV 80 /StemH 80 /FontFile2 297 0 R >> endobj 302 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /Arial /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 301 0 R /W [0 [ 750 666 556 500 277 556 556 556 722 722 556 833 556 222 556 666 500 277 333 556 ]] >> endobj 26 0 obj << /Type /Font /Subtype /Type0 /BaseFont /Arial /Encoding /Identity-H /DescendantFonts [ 302 0 R] /ToUnicode 299 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 76 0 R ] /Count 1 >> endobj 303 0 obj << /Creator (cairo 1.8.8 (http://cairographics.org)) /Producer (cairo 1.8.8 (http://cairographics.org)) >> endobj 304 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 305 0000000000 65535 f 0000194700 00000 n 0000002783 00000 n 0000000015 00000 n 0000002760 00000 n 0000004777 00000 n 0000004313 00000 n 0000027383 00000 n 0000032948 00000 n 0000035340 00000 n 0000038559 00000 n 0000040114 00000 n 0000041176 00000 n 0000042390 00000 n 0000004864 00000 n 0000042836 00000 n 0000043278 00000 n 0000043869 00000 n 0000045083 00000 n 0000005338 00000 n 0000045529 00000 n 0000045971 00000 n 0000184308 00000 n 0000065263 00000 n 0000071504 00000 n 0000074409 00000 n 0000194549 00000 n 0000090198 00000 n 0000094730 00000 n 0000096909 00000 n 0000099846 00000 n 0000101318 00000 n 0000101910 00000 n 0000103122 00000 n 0000005812 00000 n 0000103350 00000 n 0000103683 00000 n 0000104273 00000 n 0000105485 00000 n 0000006283 00000 n 0000105713 00000 n 0000106047 00000 n 0000112947 00000 n 0000115265 00000 n 0000116623 00000 n 0000118535 00000 n 0000119718 00000 n 0000120311 00000 n 0000121519 00000 n 0000006757 00000 n 0000121747 00000 n 0000122080 00000 n 0000122670 00000 n 0000123880 00000 n 0000007228 00000 n 0000124108 00000 n 0000124442 00000 n 0000131343 00000 n 0000133661 00000 n 0000135019 00000 n 0000136931 00000 n 0000138114 00000 n 0000138707 00000 n 0000139919 00000 n 0000007699 00000 n 0000140147 00000 n 0000140481 00000 n 0000141070 00000 n 0000142282 00000 n 0000008169 00000 n 0000142510 00000 n 0000142843 00000 n 0000148886 00000 n 0000150409 00000 n 0000157164 00000 n 0000163893 00000 n 0000003725 00000 n 0000003941 00000 n 0000164676 00000 n 0000004717 00000 n 0000008643 00000 n 0000014542 00000 n 0000014566 00000 n 0000027358 00000 n 0000027675 00000 n 0000027697 00000 n 0000029462 00000 n 0000029486 00000 n 0000032924 00000 n 0000033239 00000 n 0000033261 00000 n 0000034098 00000 n 0000034121 00000 n 0000035317 00000 n 0000035628 00000 n 0000035650 00000 n 0000036459 00000 n 0000036482 00000 n 0000038535 00000 n 0000038848 00000 n 0000038870 00000 n 0000039332 00000 n 0000039356 00000 n 0000040090 00000 n 0000040407 00000 n 0000040430 00000 n 0000040572 00000 n 0000040714 00000 n 0000040853 00000 n 0000040945 00000 n 0000041037 00000 n 0000041500 00000 n 0000041826 00000 n 0000042300 00000 n 0000042323 00000 n 0000042479 00000 n 0000042586 00000 n 0000042697 00000 n 0000043171 00000 n 0000043591 00000 n 0000043730 00000 n 0000044193 00000 n 0000044519 00000 n 0000044993 00000 n 0000045016 00000 n 0000045172 00000 n 0000045279 00000 n 0000045390 00000 n 0000045864 00000 n 0000046284 00000 n 0000052286 00000 n 0000052311 00000 n 0000065237 00000 n 0000065559 00000 n 0000065582 00000 n 0000067357 00000 n 0000067382 00000 n 0000071479 00000 n 0000071799 00000 n 0000071822 00000 n 0000074089 00000 n 0000074114 00000 n 0000074386 00000 n 0000074703 00000 n 0000074726 00000 n 0000079992 00000 n 0000080017 00000 n 0000090173 00000 n 0000090493 00000 n 0000090516 00000 n 0000091958 00000 n 0000091983 00000 n 0000094705 00000 n 0000095025 00000 n 0000095048 00000 n 0000095797 00000 n 0000095821 00000 n 0000096885 00000 n 0000097201 00000 n 0000097224 00000 n 0000097950 00000 n 0000097974 00000 n 0000099821 00000 n 0000100137 00000 n 0000100160 00000 n 0000100587 00000 n 0000100611 00000 n 0000101294 00000 n 0000101609 00000 n 0000101632 00000 n 0000101771 00000 n 0000102233 00000 n 0000102558 00000 n 0000103032 00000 n 0000103055 00000 n 0000103211 00000 n 0000103995 00000 n 0000104134 00000 n 0000104596 00000 n 0000104921 00000 n 0000105395 00000 n 0000105418 00000 n 0000105574 00000 n 0000106358 00000 n 0000108612 00000 n 0000108637 00000 n 0000112922 00000 n 0000113241 00000 n 0000113264 00000 n 0000113966 00000 n 0000113990 00000 n 0000115240 00000 n 0000115559 00000 n 0000115582 00000 n 0000116011 00000 n 0000116035 00000 n 0000116599 00000 n 0000116915 00000 n 0000116938 00000 n 0000117444 00000 n 0000117468 00000 n 0000118511 00000 n 0000118826 00000 n 0000118849 00000 n 0000119173 00000 n 0000119197 00000 n 0000119694 00000 n 0000120010 00000 n 0000120033 00000 n 0000120172 00000 n 0000120632 00000 n 0000120955 00000 n 0000121429 00000 n 0000121452 00000 n 0000121608 00000 n 0000122392 00000 n 0000122531 00000 n 0000122992 00000 n 0000123316 00000 n 0000123790 00000 n 0000123813 00000 n 0000123969 00000 n 0000124754 00000 n 0000127008 00000 n 0000127033 00000 n 0000131318 00000 n 0000131637 00000 n 0000131660 00000 n 0000132362 00000 n 0000132386 00000 n 0000133636 00000 n 0000133955 00000 n 0000133978 00000 n 0000134407 00000 n 0000134431 00000 n 0000134995 00000 n 0000135311 00000 n 0000135334 00000 n 0000135840 00000 n 0000135864 00000 n 0000136907 00000 n 0000137222 00000 n 0000137245 00000 n 0000137569 00000 n 0000137593 00000 n 0000138090 00000 n 0000138406 00000 n 0000138429 00000 n 0000138568 00000 n 0000139030 00000 n 0000139355 00000 n 0000139829 00000 n 0000139852 00000 n 0000140008 00000 n 0000140792 00000 n 0000140931 00000 n 0000141393 00000 n 0000141718 00000 n 0000142192 00000 n 0000142215 00000 n 0000142371 00000 n 0000143155 00000 n 0000146353 00000 n 0000146378 00000 n 0000148861 00000 n 0000149182 00000 n 0000149205 00000 n 0000150083 00000 n 0000150107 00000 n 0000150386 00000 n 0000150701 00000 n 0000150724 00000 n 0000154975 00000 n 0000155000 00000 n 0000157139 00000 n 0000157456 00000 n 0000157479 00000 n 0000161705 00000 n 0000161730 00000 n 0000163868 00000 n 0000164186 00000 n 0000164570 00000 n 0000164209 00000 n 0000164547 00000 n 0000179987 00000 n 0000164924 00000 n 0000164947 00000 n 0000177659 00000 n 0000177685 00000 n 0000179962 00000 n 0000180281 00000 n 0000180304 00000 n 0000183441 00000 n 0000183466 00000 n 0000183800 00000 n 0000183824 00000 n 0000184059 00000 n 0000184463 00000 n 0000193582 00000 n 0000193607 00000 n 0000193997 00000 n 0000194021 00000 n 0000194252 00000 n 0000194766 00000 n 0000194893 00000 n trailer << /Size 305 /Root 304 0 R /Info 303 0 R >> startxref 194947 %%EOF 3Depict-0.0.19/docs/manual-latex/figures/Screenshot-thumb.png0000644000175000017500000012572212640746376023434 0ustar pcuserpcuserPNG  IHDRGeԼgAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDATxW%Y߉\^-ވ:"ʪV==3B]_BaiF; 5-aƇ%5U%* YnĽݏwOI|1$@H 0| ?ޞ;"ғ>`cBmT(@ ķ$X@ @p /H'ij`@<x  Oػ8=˸v{']⛺OHs7ąY}xAݱ8cIr- \r80tlOz_9@<`_pgۇ'PBny^90uLf QUu]$I,K$OԿۥ/?ے}k1nw=s=W#=ǝ$}H6[%-nߑ,;(o8@.x.6}{G~oM.?V{!铫}6_'98='~>8z;{ɒi榥X =&*88=UUR5 cC)$? {byo!dqWH}Nb>%gQJJs/1>O ۋcİ~ C.;dY&;4e[CE\-5zȒ " ccYKO;~#O$^^-@&ifaﳧw=xC'@Hd$'Ҿ#[x# [F޸ q';dIʕI$ܾ}ryO|r&4EQ[<zpM}Q!DA*3X{nϛ]b3ssJ]];}Gn/+'їeZWv,ڝcf MUتn1>>&7) M1W؁O\ȶ=:5 <|Q_Oriϱw%֝yP#ʶ>;{~<}U0ct:@t<ts]UIPv@Ve'QWdo- FFLdi[}`ԣ?,`$?Ev/zVvoH/A˩ R22A0d$7weNi؎kWb mW]{ܱ+=ڟ{lGNԗhm/WdEQQdYV@Ii(*$q=޽m9(yFGsH0H~<4$I I6"<,í!{5[_/;9[+jǢQ:=-TjC4GZqc31G➾ x<5ꭝv{9#~=9WM:UœCuoci{sxxQ6664r]!H$ӧjy2 ij,kg4 FFFjt:}ػT** d۶v`+vBBD"DQ&&&\.3??D" n9 m(m$I"y^ogY_Rt:MZ%Dbr9YsDhYXE*|ul8FADA&T*'( #(۶q]d2ɃppgX,F<_(8(C$a&lRĭ[mi7Jng"HN*f%{t 6q]ܺykG `~5b' 2<19.S,Dcѝ> *d$.|L$ H$]YmA2$H˒$ EIG*2Z&n_tOlO1l6+%N3<@0(A:l!FP8L&w$FKHS p\-ˢn CȒ W@`/Èi۶TXNPfEQ+@o UUIA0$ l6QTl6K\J1y.8e }Y)W/Tal{y5rch~MOx蚎J{caןqL|DʶeEzo  p3"K<1 )( fM|Os\YR(Pu_ofgvCI=TU}0_}7/JD"*{Wreٗ*M0?l P/iڎ᫿qbo#! _63@ #쵶ohp]wr7$)Aēqخ /dNWulޱbeLäP(033C ,,xr @W*/rj5>1ʲVùa2 fP0B!>xydȗLOd+InO=_<Ox\ɲ 'gF K0H0!aijS0H|p2  IؖEn4GTbeyv 7;$SI* +Z-A0DB0 ?PQt+]yѣ`/Bɼ}| 4UBR0p;<6v 2۳ahZd2}hk댎 iH ba&S.} R_EC^_ǽYy$Iu=fnϻu |CEl| v-|1ȍgK%s;냣 (4iJvD28~t<';?Y jNT,M΋IC2?{?TeV>㨮<t*Mf(Kj"+2gq\]QOn_?c:wu.zzʃpk댌 +2H*!ĩ;izr!r:B@^gjzh4c;4M0Tr' 0oOfGuyxTDQD"#4 B 5~IU'Fg6T)I5n 2/;֫,-.&I&&&|n? *k\:6Z-ܾ~ n8{,NMXXXj#Ik+kTUT*q.C/u|$I6 Օ}afI^{=;|rO8> $6^LL뺸n_ɱO:%ڟ/%Ծʼw ' jmB4𰷷خ !󅥮^=P(i4[MN:i۾Ck9LOz;;3h#]8,t]lF4$D2A,# JQ ,VP$eZDQ.PE3O}|iͧnmn'iZ-_^K}R n۟@^# D!\k|OwإwWTbqHzۋP B`Xpvmcvfl"+躎i>7(= KwI Yq}p}U]ǫKOf휂psWFdl'솰sf;cG !x0`G*;NGX,;uyWXk_<#J8j5f&'i{WS$!r l[A+Ϟ?v 2&U`Wt0Mߐu=ceeEQߗB4MI d~Y:C,;Bl ˶OI}4%ȿ\OM {۶i|E֌.粴Lr$S?!(g.$vs![#ICS'\TP13SѰpHzNc|Î{>lBq2Nl@XNp%ySS_LO'"5`)>:G.+++<|!7,nݺE8h:fQ?0'S,D"Bccc aٍW`_=_1Ny4 `-Wq-xAI %{=F\!()J]VUiNZ۲X^j"D&ZfX 9f9>ǫ|Nᰒ}˨tH/5H@\4t'Ɩbrl~HT 7,2O]ꜾpEf<ܰ`c?}ȓ^w /wVUtڟ5d 1|Y6>>>Wxi2 񄇦k e)F= Qu(ea9Z^mpO29M緍[Y/cUs <u8!WB0;EMrq5`Ά8H3.s0)Z Sݰ0HesP$ݍ2x?݂B`Ssz-œ%Z'V",l$m]>[:7 Li2B(C ̭`.c#\8C'i[r՛!h6;RR?)iH$}A x\g\ץgvBET:řgYxg Y5Pg!9>$j![] ݮ? nTMrnQEXyzZjds<*tZ[s-T(M1̕NG<9jyXDU[A=x-Vd_Ok/ӻ[ n&̃K!mt+Ebsф 9H eސ(cӆLL<5*Q,K,hl8)ڼqY Z÷^\@-!sXܼyZ(|' QV{.XR8A6Z:^d2I#˽P[$jCHp$@Po֏~ÒPjI<; ˈcvRGtkhCMNV7s!K0QU6{A!T>Z*Ȟ2|ܕz r+lG\1R+n#v5>34!2i,8tS!{2 \*2H +( 4[׻ǚlj@vD4)٠pI"jteŎ}SYoșͿ_r왓Q9F$~355/4Mssslll0;;KT P*0 I^㎓ <{|WvȲLD=,SoxЈv\JJyNR?ÊnÊA:g6"j"%~Kddbj:_(!Lb7(*%.D` !л谥ؑv>»6^;EyBe*;Dn " AMmAI΁ႃTX<ĭKY|jVS0T<* /^$NSTOh@>xueO~{xx8DxX.F R!챟N,`ʛ"&ƗɜɼdV fC<.Jٲ{wְZNK_L "6jǢLm'LD.H.Z$R '50qk[)CqcKlnT0Pa] nMĸYhC%tJ>:n_P&oxz6 2 wO5ַ)V$Zup j:}F2~IIFnK}أ5D^`Dݢ\`3. rx,C{%pgh#i#R&LJ5F?YdNMpZ|dqʕ,7/p6׷h`,Z$}BPԦ*mtޭ4 -hX)I"8pizhm=NCnkn gzKp0BH-BBĢ1,d5P0Da6$dOJ;(^PT,@k4wZ{'Gb'<.jAڝ6i8k:a;1Gk"~ qr<>rRoY6UVW/F;vO Qn4jғeBaZD"'m{w ?NYgI>{oYhAE`0xƇy 3 ?&Z|A $dptm!~9K7wwڊ~3Cp"N.ҌNxd8k+c_Fq|zz\Vb+ SUv$GUQ5jESE3p*(튎'lRVyΙU r g!Dۖ {h!ZjEzad31"[&k^pA %Ӑ:gޤo8D4 *.7´>y*`h8HF_XLqHu ~t,>uIR|`uuNC4j144D:O?ellbeYz~^(q.xM륜:uꙆɱn??sdL—( 7*gϞ!2X]]EUU<ò,FFFH$T*̠( Z McEr<>S<|;3 LJd:Ǜ'Feo)܅xsɅvʏIg&\BKP!G7 oaMކ ^e4RCTn,/j!MKO]FIܹ3Os0y27NJZ{OqΧڤBPI9[G3 eq~sG֝9sb1EAUgء6T*Y({~vvXX}|k| ''G ŭ:D k\ͅ'< k) o >{j=lrI8 (EkAX+F1Og7%b miب B!:._SK8L 3y)Jr65`G{ii×h'gp. mW-Imc۶ǐL sZv=˶ܾ8sjM-D@cte3 ɸ|PIfIT2 g#S8fkxzv>GDfA]w 8lԚ3*>R[h$QEf,E5Vqb^~HY`{d3%H̼}gR qX4jGC="!Eg99q-$p?JӧD"DQ $BT*$I4M0M] _ZaQUUNL@UTbZ._/;^HFB޽FK:ޗn=iFVXXaf#uɯYl NdtEL\ w'9NȾKh@,EKH޳TT<7AіF \y٫ڴ{[S oki,ʭ8{jBR(w),~QG9Aq'!J2$ 8;Ÿ.d![[[;0~ugz~~ x7Bɓt:iZ(B" IFcB("`Y?f74[M?G?? ?V˲$vg7W( 'Н&9k6qd"ilnQ ٬.:o̘BQ$l[ZNmm Y ʜ&V BLh~cJ;,\FM6rlzvãӱ:J* >+Sr^ %=Epjy$a~1_ZK9>s'@,Ȳ3-ЯM< 2H&ÿ ľ,< &B[Vt*MRk06ufnRX Bz1J6+9+3o8UA5rGqAq cT=SS&PJ g E8AtZ!:A1'|J xoF^NQ}fmGw/H(}EukGn.H)yp$otd`&ݮou}'ڥjQr;!8B!&&&k=.ˤR)T*޺aȲoFe?蹨򋯮;ƶkMO>Z=_$t(u Cfm ho̠,2K\>/[ Jךe@F'' ìiy>n*@d:Dz'9GJdž%htI\`&Iu0OL"-nfEvym*qP3ңLe9OӀ$%phY Ko/{}eWxsGIYvZƵkא$3gpݻG^^# LA?,~~`0HaiisDhZI 5ep<ףS{~1e^L۶ e2tcK}'GM As&[U(q6CDzP 6 d.qZP[NycgrW5KmlV®As92ta'DUnyxa҂v`h;=#fv4JKhh5Kds7 xj'rt:}Sjy{..]ڑ,^Jƒvt]&d5\%d?:9nSUV &s<^v:uFr9jB .jx]w]G ):3W!c-c䮆c4ŪC(tѻK!HLPAo"L$I;Ôqj6NeBc 37Y$1 ظ#!nqϣ)a΍Sӗj1.ّdF$V$q~8:;Fxyҕ~q'+ӿYL&l"2###L&1MMu]\%HA!LtD";+BQeBqCK^rc}ЉĐ-x:i&蓣%4Âhlܶnژ0⢋5lr8m-R3rzT51Un1 (S DWQjI<٨4Hr&F.Y[h^j|rGDT™FX̶|Gzc9Uns<2 C6%˪299ވz:^+O&arb.\Ɋ`ҷjvk^zd :4(fji]4&R %M :f`6vզSȔxN8F7/ЃU'zF<)1*ÆA`l/T'v+%G5Kmb aՁdw~Rh'I&k4%xb|d RI1E>!kG Zc-An[]fFMӇbw.L7؋ D+A".җuJ@gIpox\N{s~QV㰒l/ {vKU:dsSgW$JlD&̛7>2Otjö@g9_bw拄Bf4G?q> }[iX[yvKxSeXWp"p`SGw/dB$SAK/y%ۣ`>ANoU|Q]yϟG޹\C}:>rl41֋Mx$sAQeYwmqǃqAME Ef ,FHA'7hFdJ' >T\N`.F7"" 7|TDOD)/8s"i61$ըar:EI0"W~c޴XҢߘپӕ=})BF:yGY9<^)Er<>t]R1[9ʃ+ >10o#um ʍt6#iZnvpdk<AF MR1&!\#5ԄIBE=h r #Ӝw|o#0a%6 3@mq /̓C%@XW-|y[!sMbj4)1<vz`A7RtS9g PNI&˴n~nrjF\ M݅Kli{NJtkf4 Mu~9g~h`'EgX&YRVS]Ѳ,ֈb_`n 1 hx ! "qXxQU:K+'Hkb%x_u7#XZגnP e]cΞUy[% ,!O*#AOlV_ձW;B%~ pLw~v%|-f2uq7- L@ L+oJW!d\yz_)n\|2 GN@e T*\vx<Ι3g4u٤N{..׮]… ma0555p~e䨰gնmcX(so$l>lzk'FX[o8藃D^ٸ]|- P) IM/7"#GKvFxw;Q-B($SX__qt]ܹmۤixC<1pWly1XVDuNcH _ҝG6sjoNFچI-'N3\1Fgrk$o|]4Rf5躋DL9F.q6Jh=k ̾K<$F mh24=^K!elB~-ZM< pkDf6;9K6Ɨrzv8tc0իgvj~2H$¥Km8Ӄ܋4 ?ǫVtc]&r4_ XŸW Ch$;$-s@(͹PK~!v_>3V?>+|a$$h,)p7Y&dX,F{>hxJH y륄$msstdX5LFr֞*AZMc+6ԝ:)Ӡr] ;Ґ  jtJ2g,VD CɆ E(#1b⏮4e1ɍe9J_b*[^>+X1CtJ,FhǐcӘ&KqԣR}/sđ=PX__ݻLLLy4MbjbBCCCA677q NH$a!8y>Bo ?WΞxQ$"BAt 3ɢ(ʗVlw;2:S@bӒ8w?X2Q(36NHS-i)yL5-4"qÒKԣp?Fʌ%xIZߪrYZ ToH$ʑ8Z"v9y93*uv~2L/Bpaس<-"`U.kkkElj56668; w܅dYFB_uq~JOR5>ܭV[®_q2vjU=-=i> 2).Xw(@ e$!Qh0# PRA,6l $2`h0͹Mj-)[4ZYdgFC-tHehV"Q 7Q^gڤ[oF?F&8աEr /U U ##`+KH$(|+WP׉Fz=2 @zٳg%vd2B!0yi./8*ϣDiqPOzן~T٭ 0ޤt ;&̓'GǣkwG6g$g:換.֔;Y1 F͢(r%Bl}-F/jQ9tsQp Mu Du͂!t iQ2' sSzVbyazJaM, #S|OT\F-AH)dzYp~h4ŋqSNXwҥK/?5|Iq?#Aq{<ZTc̒I!R=Hɹ @OT U nfNy \A"ozl*SCEvLGCP,dHJ} Jbô>*(iXhS ;iI[&1VNFr*2^{k]d#3q**!-pw!BJ/n[iqB֐eEQ0 D"AVctttֵf_yH8Iߊgq$%YI.'>i>OQoTxE3Qye뾠s7 HҰ*SrHCtJG_{Ung]!k`^pDvLۗ8 Efy:jwEP(`wIRh_;pq;n%G4s4M4Uebr1v*SG(yv ƥ0-H$yC`>fL,v(Ea67F>zˡWvZ''̱u-O&FXpdwW0Lr`\h(OU\w֟ʘ>q*ZE<ɮAFz>B(;5bRԋ^ ,8_>.T<ӢY,Ye-eg5\ԃ\EZم 6A=S&mv:<%"#BT:vȠhp!6 u\1\=ץ[C &_蘂bL`.hNDuV/'—/UVxϟ@i+)_CRoK.{%G]rwKf%(xH\ T"ĄJJ23'D!R/xo}+ Rgvr\_;xXaa( yI4AhA] g #ɖa=7^>kQ#dxQ$FFFh5D=_^T%oL~F&\+Q+Q+9sEى$i }5 v ŦI!!fL"E Ij`٫q;)ZjjmD3!ӛspwڐKaw:d! SK`n=0+s-&:o9***=ݤF_G;}K@0䨰(:115IfYΦ̭!wL##9$IBeN^:Iev؈IeLMM mVE:fss9˂ u%B) SҙJݡ4d);Ba/Uw)v~&ﭢJ|I|M(oF$"qIP̃XGӂh Hf`k ;Q"\y|- 5;=H8O_K_^f%/3f5Mf$5D*3lM 0f!s?·A8ac~L|{(M`e!NaVH(InY&`4H6̉ WYk4$Q-ɻ! 8moS⮴ӄTI.ND XkHKT^&R7-!JVy+¸HQ)\h&Z҄ttn~G=UBs\j?_ep[pODNK2~(~jIG8xᓣzq21өcOI+3:p4AD 5k05Z!1<=I2gVGJqC>FoLEBȍtE_i6ii-EuæL ] ^׸{L!Nsw~4AB8CX!sJV"E0RWv0%vVتlf%rgTD0}{1(Xln9EvM u&TCO %ȳ8z@Uo$ٔM6W6um: 3)n[jvw dBBrfl':ȚJGX\Q%cNPU!7NO"2 J"k5c]F\Ov\kr)ԭ cѓ)EoSYݠQd|k&,<: G< # lB ϗuid{=  2vyp(2ɑTQU!-. "̺nQTYZr(rHݫ1n:dYb'Gr,-hGIYYF]q1"fҋ&2v+n8./ 12͢I!x=#:asoym22mqkIh1}3~mqXH:U'T0P@ƨ 2}3E'G/_a//J0~FrJu"N#I$Vŕy.%/0%ϰ>G6N\fE6K۴u<'ĕ7hyRAJq ?\ rN s֚a["ԩUMʁ om˗](T ıxf'{ 6Jy}5+4j ~cVP6k0bxDf QyXi&_T!Wr$j ]-clwڮq%y9%`G B \Pz+Hm5jNp6N}3Orj<2m=~Əm(Udu&[͐su$RLV˵35j%uOӧi5F4g5DTptlku5Dz*ZK&"kAznSŇ?F.OR!zm{nk(Ƽ.CUǙ  qP iI"l:dҡQl: I0dš =ˏ>p? ~2wz^ؓgum4Nu@򀷜wTY<⒒asM#{,'8zs.Y'pV{|B:V1UX$s놂fKDHXmȹV>t"W&,‡k:3JX&hc5x; u`,)IА.H~S^ٽo[oy5n7dx8Zl}kQNɌMv\JWs i Vocmtt^i9B)t2S4똲M+5QVfK):׆ѲیZX57sǯ&i1<!V}i* [LVm_.%4?CYB0nFQ"8d2$:xL;PrsUl-)C2j]&LE!ބ+2dg$ iA W /GrOOu.U13[8~!Zrc)ItUjO?iv j@Ϡ:TĤ"jַW*tGk,j\k|7[ $: A%Th@3JKЁRMn4hNdьrOqz9F`MvQRء2ZEN Cuhug&ٴ48Phv$ e'ºYMYZ$[yG)j~%vmO~b~BzWyyO¾2 ~ᰒnA4lp\ ʐB)Y"ZTm>}XsL+kvcY6F9ˈ2BTԭyz(E*$ 4Pxen՘[g2dS82YG%Np2:j@r׏VuJ[0@ 7ߤW"Z Ztʭ^AUX+ JcyFFz%rN eB,|S XnaSbTs2*VI DR+w X(qUj)YK='b;1jCښ% Ųtb\JJ RȴtMo >pn##3";SA &79[S֜ws(_^3p "љ4+23A dW7ɯtDjh|;G06$X`qy4+)p\X\@?2,x'udǢ?wy$È 2z'ZV˂ TDW?ĕ\+$9mp8!l+" q'R6ĩ VnRB&\V6:XOtMR֯+E*-w[],TW9/U5anPʸGBKjyj=yKbBe}JjC0-06#uA<=8Iv&\q:PtV9baZxI,؇ກ/w9ٳH`= "g^̳Za EIOKe(G`p$]rܭ67X4!husi#cZ HmƴAZ@Dh*]ɢB3HxVaZqN0k2BWJV" KRXǒQ˃#eyѝ _niQs\ M1%ȃUØ7=?WZ[.O+:fpV=ϻQq=8ƒ?1^5Q;uFR:u+nPo4İ]{VS>M΂x@qfTk -1) FZ0m_BJW&aV! |?>쒩T-H , ;lw\d H,~,ШCnFtK67lwIOY\9p+MϓYoʉZ .NPNQԹ;8ܧQ_MrR6N)xS*aǡՐ =hFmAR NKp/op]v@ٿ_6HH4rAί2p _;Sl:FOX[6%|p_c<&%("\&2T;:FI$ر}G MrMaf%A#ft4ʸ I%zzSe M~L 67 9%p&H^&X# "CxG!#d.Hx O!_ԾB=‰ϹtBz!BJDNѳ1x=(8.r4! Of9v 2RDH_A=[i$ݕc9y%Gb"{GStN`r| '<PB]#=@4##%B;b;-PB4rN*.1 kN h4! I@Q%ox(rU$_i yLfLbe?*>}G| ǼCm8˲L"x%'# ~5_6~~sT(fgx [.J_96p-|D 28 ]նLO -Z) :"==hmC0كŞv70§|r; B'|L _NĥKrsAaBae*2h F$ڂ]UT\:_&(f_#}ʧWe x_ԃ ȲL*"8hP(DR Jh4g) FsuG8㻚x/aGʃ*39 DTcgsf&>\F@"!'xTv%[,&Ne Z68:7]ߗ?~?_lo3{xG̞EUGs۶Y>>1z$ $cc;mY eCߕUX˒L4}Eq39|v7y!7ϱ;d+xߌS.<=Ds%} OxTdm|?b7Ă a,{2 $.#T?t LlC_xv}8@w4UCo̺̓@_O xB<$ҬWJkQX\yr8=Xawc9򎂌lmw%ے%#R%A8̷dev4nt:fxSQ<|BNoiDrE,BUhFKS >ͷCK*5p ֺ1MYg{(ҁ>~N_B??v2۷.^} |"nzlLЂU(W/;cH$uχeYhr+'+Wu@ @[[eQ2J(Bq&KRRq1=nn@ ] 8ޠ vKEi*XI9x[[(M`OK{'Qޮ Gi|J&e``~9 9r'47n@J(dY?8dj>聬9AΓؓӳNVl }ov|o$H;TT<=vWfW K^gY`|14bP$DX@/U GEQ465r ]里 ˴r&6hK"\~n֜Œs]tڰE[;$Mult󩂋x["-)Jk{+CCC!=|drwERRlFT⪢ߧ( Um -}#7z@넟tpQ,Jv<'7zwD6t a5BtZ]"4666)DT,˺kK?_P4fH.[ ;M6z0넟+X1_9eK.P-q|0Fei^b-lpNec-4_z,B*^}pr@ #,#(RKeiڦWQ,[)jB5L0BxX8־IPSS Ru|~7DL$iڒ4M~kآ, mx@XdsT0 2 Ll&^V0-ruf?]]j0>>NP1;;lzxMP(DXL&a466RSB hniӖ7RJ JI&N+[2VbQ2CZxM\6T)#J1::F$!01>A*S,BQ|>x !ӄ!F( H)QVO]T@tx00L\.h$z6' =B@&2G&Nz&Mm˲"c&OVYVhe?l;B0<4>ziko+ZZ8r,~]8!ׯ]'NC.gtt== qO}}}457!DcQ,Pdtoioo_}c|?p}{n^ug?OS>{W4pFq^u=+BSSRh4Jmm-{WvyGPP,6˜ijjjLNL6PUΟG@0bݴ;;?#=H~>|͛?g}W^yGyݻwK/$dM'?W~~/ V{H~?1 l6TU0 TEE(Fwl;ߘdfž=yc"RZܹWK}}=a0>>O{SGdΝ|G?a~ױ,Z~׉Fٞlh4mmmm- `l|.fgg#0 ^~e>|_gΝ|>~?r9>L{{;_8uO<i:L&) f, G p[U/8؞1@X: [s\sc *v\h[LLN`*IDATZpɑ⡣G|~O#)_枰,466k4G0  0 cŀj@cݻ^ͧ3t焘H)yPUӧOoo177/_u^|E/^xǏq~agvQWWG__ LNND6 UQ]F,ѵg2P˲|2۶m( e11aiiJ%EA44Mc``Mf4uuub1un4M[eiwZ6r D"kR)GmqZಂfUUٵ{ҲH&wQٓ^qGZUg7\v~-.33;+yI&8ݧz?3  ~wh;'!iu?eY|DZs RLMMqBdrR)|  Y~?ǎ#N( ###(BP`ffݻw3>>N"ʕ+dY{QU)/ "35.:a`8[!Ћ[Lu("ccw~ pc ӠT"W`|i9~#X`\d**8V2 b\.G,#N|Gܾ};333$ "èJ.s=RJjkku6ikk#P__Okk+CCCEX[MK_H ^*( hEX]?ұXA8@mS8߹i)K6vjBQm0mޱcsN;,PURyؽ{7188Hcc#ȒJOGG+OTU%H( l몱/;6-sEXDQRb4r|>Ο?J{.X֛4MΞ:(ڵ'OR[[K>' T޳[j2sz/ini^U>6GCj]]]KF;ªr󹳳sEU[IU.֋eՖeqM&&&d2H)y'9s ϟh4(hEQ(J?~|]Y|KNOOD&L&gffZn޼Ɏ;imcvԔ=I2==޻k{\ضm|=6)%tM8|Lp8Ζ l'NPU!irn.;TT*E$p8L0|>OCCJ#ljD"[. !Nss9_zww7|@iؘ[)Y/~~p|Bf9wd`0H,#111A[[ ~_}vt]'fMӘur~fxx˲bL[[~W 4᭵rQɲjǻn88p/)X[m޵FQ>^zH* ; X^=v߾}%w\X:655/|oM hnn~ཹb ]lg;nH&P[[Rf|3::JPҥKhF0:;0gppd2IhGS8B3Hd&3::JSSR__SSSN4EUU7|=XV8N. M*o똦y ЮRtWqZKR~ *UBJh08>>$rqΞ=KSSӖQXŕ+Wun2!O&kunTU%QSS B!XSSO?!RNHOSSX@ 옦 033C4Eu0ԸWGR*F盟-| z_)(+ziy-v#GJIP@Q4qy5.Q*?s2 ?oݽ0ۛH$aX9Ev5\{zzp8jN,tKK )%Xh4d`Aby863dYi7n`bbÇ`0/^l6KOO1>>' uݮS>AO?eQWWG>gxx؝o5J:@0"Å,P L\ koiiis>h(bsU(ʂJE:o!+}qynp,{%/233zISS|3gά n *;q4X ٿ?VMέ@P,~m{{{ioo_>XYcq +W'}0JKjYg!bMֿr BM$ٽ{] B4," vL&C<_v6ƭhk\/066T]6͢쯹2ccE7o$L233^Ff*b||  H:Ct~ߵENOOoA~G[QB/Puk-sСk[> tpXT+!k˴HܔjAT>(}0FqaGqV,PEQ\])R)0>888hד,6(}(%T*D{{yT3wc[3o5YPk׉Mu¹\R$>"Ay;۷o쐝vv:dv8^j={wAikksN[.שhccc?}PUU4M+ZNBD^.q|roccq*8q=bڂ]}|)''K8);.@ww7AG\̸Y,m嚦6 };_wc<T*uO~Q749s挛[}Y,>Mjkk-H8pIɂ2[ܘUyfksB RbZA2}q8&8'}0S(6A`(([~#)%׮]sÖJ%$144D<w w011cjK;mZ+ڷ 5M\Kp(eR(FVJLLL?gǎE>X__s˜9A---1==H$8--->ZlnP{arrXnF={2!hhh`jj M:~]P H022BPp=kBZW-\}}}|K_bzzg}^xaxu#L*g=U⤑vrQt]ws/.I\6}0JqM4M####nP]]ݲ 7}sfzqz!Tdҍr(ݻtʵk&?OyucǎϒL&9psss75rff0FviP`ɭ8dԒD-SRӗEl~-RS5ѨQnii!  ]z<穧bjjʭ ݐ&AѣGDQV郡PF"emL^B ZzLLL} )%o}}}رO\xQ $ B0tymqu~sE#gװ,OּZn߾}A`e ̧9#N+-هæJTUC(E/Qio+NIeoGXt8T7M7ڿZhjjbzz_|ѭ k.&&&W[oů" o߾8VÂtf5)׈ +}YooA4yd``}U .u]ɓ *}qvӧݢ羸ihhSY5~GreŢ[踡^x&׎i iUw^;7n :F`0A˲u-lY/^t=@YRhtA#;9###ܼyX,=Ms=%P'ѩ=55EMM[ ر^:::V>4-kv|3,[r[L^Z>ɳ(κ郕>LKK˂ttf 333H)@4a&VX__!EQ\Gf:^W#GÇldT. +o/A_JM(|>gxT`Xc)ݩ{ 6eNN7aAZ@0VQUͤY)}в,VOŁr#Vڼ`Okkk,kH1J^͞o-`vnI0pE'gQ#-&chu$LB*sŚ JmVYN%t:'xbUU#|\fZ-lu쀩.dsYn 5 %f`Kd] G0v;w$N \ǃ3 sn_\7*_& /|aنV'RzzzVǽ"+4eL9ѱ9bՖe**D|!i"yPivB@Q/6սW[=;7 'N  n޼ICC|@ bۢ4 se4.\ gϞCF_+;, 5;;.u k IG Rga,)%EH G(JCa,B$ZUA  =S(ՖͭV5l6իWNanPGGbK 9/M$i 8qwG?x=6?ׯ_2sXҲ6Ar[!ʑ,OW'|HӨWI i>[oEGG".^igΝ?EܹsG):[뗊@)Uɹ % qI1o2Mlv:bFi0}[-wgϞ=fxI{{;;wwS^2y4%禩TP( Ü={zzzHR0=mtL .H$ch+Ȭ@*v\%$RqMmsjxgx;B015 m][,'J[/!s+ `pxmvzОl@ @XPdVMF{?1I&o6388K/,O?j7t p|1 ֨ZpRd6ѧ\,6^{V̭~7|AoN.ò,?9pmmm W9V |觥l6P(";#4M#L nQP~,djzrrl۶zZ.\9r/=ux7,btU[ȗ "xVbEou:vdYٶm|{sb:'xeS:.]"˹]Ȝ .Ǐ`l;\GA__l**rk ˱m6o3gg!H} UU9zx>|- aDYY@.u4-Ix',v p&''I$n=ZBb1BЂzk+lsu" EBxM@P )%b2o֨0 tKǴ̪:O!GY"/xg]S }YVFYqӚ# LCo ښBf˛!<{~7Lcݮyo ǎCJI]]ݪj !˲дLK]R f3}]!`.%_̣8@pZ=ΘJ"mmm ܲFߪX,&bÃ' )ֻ)\ɓ:H(Ǿ`l9{fs wi3slUz! Ur(\S NH$u" ͅ0a|םUKѓD>@4(,>Yq=h)j=BlB'!~K$o$j6z͛|K_c``_|[1/ a Sj% Rd&l MDԏ=~q5p4ز' |n?X,vG63lm*r$˧P7Mb'OgY G30r! ovGEuð=,KXGh4JCCT7֡߭pk.200~#OW쨁SCX_>a:;b (d(J fU HmlXXVEo!))j BFMz?y?Gb9ϼY,LNî6VV:t;W?[ Su)ɸN@ J:&b&AyhAab;䔏|J륝+Ԭ -,j1-䝚QB>aco]~ uyJ-eÿ_,.w^"iͫ)1Q|FsiȩSܪLsx?Ak"jA|h76?CX/>D{ "$PU!䃒iDʒ>e¸*>ҟ8bwd"|tXX]{Uyuk:W{Owa0Ok\VV?=֖Çsaפ8r9Μ9C"pUӈD"n߇ ASq("f gM[R ]ذ C ɜ7;a@"w˃J. 7¡&8`d9冭=4D24;00x.b. s%ۙR00?mX_9|ޔTĞzĮ:[߃2c,3;njj}sŻ; DHm!P!<;ǐi䏮AoȓC`v!üύ7,zels-XV(ܦ_Z:ϟ_ lJ.]ZLuΜ9VիW3˲]ڵk|o)% *K)qƒΟ? ]pa2śV{3ׯ_?O.ɓa~?\It:$|4Q\. BLP`ppb a``K.y._ X,yz{{݂*v7˲P˲0 .\f)> ƍ-Hz*LfA0yt]gbb>b[Xܹs63MgR*vNζ6ojx nx<Ç3==(~jjjhll\P) IWh4J2teYqlH$FoζDFζTjpd2iq;O=eMСCK}g|nh![ʩwiYЇPUuAVj嶏>s[B7w>а__hmmɓ|cMxWy׻k'?I G5!߿Na322Nך`0 :ujͅgnn\. twfx1>Idl6K[[ۚ4M ,xG!pOӄa8++#[GU^BLj֧_T" ,|>O p)|t:M8vz8u_A G ĉ|[8qOMM Q*PU4QUUUgdd{bEqM]]fJ҂&'R4cVT1؂V.\}N:E677ҥKp?3>{9+B}}=/o_?z)y8ccc(B2dllC[oq>Om帯4,p؝\ G BUU{9SSS͛7x"P Jp@k׮dH&oM?l@ '> oT*ʼn',t:oV0: 2,jtiMCoo/@~2 /^3< <,d^>O|}s\t^zP(0==|RfLMMQ,Ʋ,mR8PV{xl}Qz!(b{Ͱ,dHRx 8f$ա( t:M"~0MMtFUU~: R)|I>OŶ|>OoZ{cpױxHRD%9aO&|_D4tN:u4γD8Z0 J+[|ޭ{z3m۶;F`W0NT!0U8W8Zڮ!FF@S8a= ?;s92 ΞB ,XX9̲, 0L~Tu`V U{'Yũ]Uy&@G?߫UE=rR(Ż3kO]g `@M&=2NEwUZ+4p%tEXtdate:create2013-11-11T20:43:12+00:009%tEXtdate:modify2013-03-22T18:31:39+00:00h*IENDB`3Depict-0.0.19/docs/manual-latex/figures/quickStartIonInfoLayout.png0000644000175000017500000020002712640746376025004 0ustar pcuserpcuserPNG  IHDRbsmR pHYs  tIME8 IDATxwtTLPH"&riit@^EؐK& #(D)!$>I Lf#2!$HyfIyQ8n!B!"4>j,B!B*Va7ITB! )%B!B!B!BH"&B!B1!B!DL!B!DMz ;{GTp9 DPo=`՞ .Z5j:?%%^~ajjR* cc k۶gP[cGƍ?87* wwMfFnneq7!B!I#snX+))}pvv֟RY7RT{cb-|FKLL,ZP'L痃+ܮ1,YkhMM-vsBܲ\ϣ !BV;2gL})))XN|Zr3E~ii\[MLLL {~iq"77[[[sHMMť j$&prrD|4O&'`nnNnn7nܤV-2 !B4ߘ}=~+<{e,[.^U~_/t1vܛ|/m oͷeU}:uiݺw2ؿcN^++"VRΝ@CuFX-~}^Bx$򾧣njgGs^՗_oF!B̨Pؙ2k\#J<_1}l{ g~ȱØVfΞ=Gs?6阘܏?n4oN)Ӌgɜ:}G`~Y9{.G`k*Nm۴&>>۸淳4淳xzzpl ۷DFGGW=t9woں.\{Rv-B!O հeffV111\D\$77 ߌ9../BAxD$a3z ȂrرgNNoPqys~;HjjQQQL03۾R^TL_aAcm]J6iذ'NH!BLPOSޜ8ţT*Yf-j+|3͛''%annn0ǒ/Ďѣwb~X%N|@lmmiݪ%:`bӹ'˖.ӣ'yO P;R!BH"V\]]j,[LVVwSS 662JNWim8?#_Ù|V^8umϏ[ :bggk͚lܴGG֭X1?&&]wB!x&<:۾,';;(cxFSssss+//w4iҘ/,VYrrv"$fnՒZ`LڷkK-7 ZŮ{}}۳aJXHHH#DDFҽ$bB!B*jrrsrhۙ/U_/]^)O[~/m;B`~|h֬iuM?'Nħ%CU|AR%1h` ؘVZbnnw;thOVVVs2l$_Ŕә?oNNN)B! А=v#pVVq 8mjDFF_6qOĩ7^^hF!Bx9beNpW)7Q\{ ZpժH\ZۺvyV?8UfôzB!MqIi?6mZ"}B! MB!BgRB B! !B!SǏHTB!Q%b B""B!2RWcBPVY%"":@)ģHKA!w'q'B!,!BdnBH"&B!V9J󤧧BV-ԩ#*WJƍaBR_JJ eX[(t|DEEswwӋ/୷'lW} !B!xKK 4iLzz: .0џ_%&&Uii4Zbbbj5E߹k7BtLD>8;;]*UvB!BgG=blٲo6o{~V TjRӈOzuc%&&;;;<{w8r,0&&hnj7Dog5{~{%_}tv^/_X[|#X!B!>[b)_|)l߾>}λh-og|f|^+x.5l;"""4(?h`,,,۞LT*111\D\$77#" ΘѣP(RPʊ:YYZ6h6eB!SHݻw{@Aq^ۻ' k,IJJřkW|z L>/DĤ:99$&&T*YfZhV%9) sssyYޟOSޜ8B/m88.K,BT{+* LMMqrrU˖ԬRzd]!Uݯc_\@Poߎ\=P߫Bdm9~~ZfOe3xNVeْ+EVVwSS\lll.m( 퇍BsnTIjZc`,͢011)S=&/B)(ݻwYv7 ҬNN,/9i6}X#"066i&tB JQ\mߎEK  FѠjyIuG4eO3nh +ӛ?.] !!7&VVV$&&2o2Xj9ṣog\IJN͍];PTc1џ_B2t N3&Msi4ˣiӦXZZANNdeeBZjRYtxMiӦZΝ;DGGcbb#DDDHÆ [T}KMM%((u^='&&biiZ.r|nn.'?&88wsabbRX !DQ]˗*x>kJ%BrJ={Ҷm[=Z%^-[rI b֭ٳT9{,Z!ҮM+\-̱{aÆz7D BQI*eK~z t=aÆquN:_ѣʢs@@@>>>跻vB(T+W8x 7o\tm۶xb5jļyx"6m`…ܺu#G;+W,{.\K g֬YhbcS%垿 Ο?Ϝ9s1b>>>q غukb-mߚzu_>C !3#M0!UsZnM߾};w.}Y|9/_ݝ/ڵkG۶m Ύ0 m;C@@Z׵CVg1h QFmuss# WF~~>G3f VVVtޝtCT%QFaaa@Ν?>o6&&&oߞ7n9BQRI.QQ;F"/7Ą'>N?"oBg'f͚1}toFTd۷ uޝgϞr96nX5kժ޽{OYh...,]!CW_}h^}U찴$!!NSSS^IԖ{lmm_`fff0'Ą2Z!cllLs#>6:IND>4|BӠA^ufϞmN:hZ6lPlQYf GGGOpqq˫ٓ={ڵk9r$z Riĭ[ؿ?wRT*LeiKy%BQy(:cKN xbbx ̘+IB<*_%$$ 9֭>@\cǎh333޽>9OE_zj VOʕ+WHTV VKdd$[Uj\J[6+-֛7oO>ї)hB!cժU  dggBÆ cʔ)zaaaAӦMXFFݺu+z111oߞڵkӴiS_|_}8p333pwwgԩmۖƍӫW/^*SimyXԩS8p@~y37m.B4Q\-4ӫ1a7 17"s222`SEhZ]?$*;w鉑Q뫈RUk!ē'5<뿮 ~??Į#5{.11|yCKu=C{7$0QQ^Ғ VjJ,\GGGÝ+(-[2-]\B!D)!B!BIĄB!B1!B!@!ijFqtl\]kҹՕ!x<ZuK!D:ybDDFѣ{W<==S1m :u !x,]/SR}U*5v=cRwwwΝVv 777"#=oo/%B!*uCzÄ Uҳ%999rL} ~XZZd .]ՕؘXmdrj԰i?aeEhX Bff& LMM$B!>B!q y+<: xcpZ~̖ g`1ˬPռ>jG B1!Uq =_qtpVxYYYh4BBnҋ/`jj @ظi3 1M4"m0!DL!ģB`W\|r/z{ve\zB~LL,111Q ϻJZMZj Tn]eӱA[RRR03+kk4oV21KNNZxyy2d@;'?_Mp puipLo䈫+*KO!UuHNQ -3|muM4f@-b؃dһ,XY3ajjʌ9w"ku[[6mZ56|CdT˗-.Ly1џC2dBNJp&LH֖[\Ν=f<7ptt퉬]:njY3֖̚9 ܹ $긻E6p4qB!Bʴt:?,RS+̜5a܂9OFFFhZbb vO[DHM}SYTov,Zl`X`y4M\͕۲pRX-8!B!D~Bm<&OEղ{6:v W;b?}z1a8N8I 6Le*˃Xj999LЪ/.79OWYt~ǼP(~B!ɦ Z(jLk,%%Դ4kȨT,pںF^,]: | <{f%4jn"o$0Q2+?,*T&sss<=UIÃ۷o굼| !KĄuxQ-7L!$bz'Sʗ2IUZB?SIX߻| !$be3vdнdffY?B!D? U/!BRJB!ђ:%ze΋B!$bB *pdl\ B@Q^}/՞D K =}DEE`nfN=tRY9,X?~5fJo2l`^]>B!$bBQq_}섉>r{ܵ$UZ$;;֮ӣL߶}׃,--$FdefɇE!x 1!D-XǏ4~=Mb{h4U$t:wSSWIKM#>>yj׃|RѮ][ϛew\;_0ի׸|9%Dw`<xȑ`ffFzuiӺUԝ9fffh! 4ZS֬oNS߯k^p~r۾c҇;v$b%:e2N1h`L~Ӧ0wϘ-vZ^^iidggw?PzuڶiNc݋& @@1c j5 yrN࡯[OdT'N|iL0ϿXXXpЯ̘9Çy.(/B3degqӷ4ie<ױ8ga~E B"or!pSǫ)ثa*Z=oY>\u`^[q }OÈ$,Ǎ{cX^F||B~ܲӱS76nkٙ._c߂׃quInn!!!%eРX[Z5l;""" 74?tmOff&*J>͙$|8|_W|n %44a1q2!7C'==DwJB"=bB< ˖."1Qs۱li7ϸqgƌT^\uر {{{~q~1?1zv%022N (XafM"ˍ̙=_Ȋ۶Rduh V[b[_V3׮f7r6}^~%:X xzzT*Q i| FC^^K/ӣZpUխTlmldr~_bbbؾ} ӣΚ.B!OcccVN (O7o/?ظRsQ"##8q"gϞ姟~*W|vے߾][إOONN6GP,F!11'vt 5]KmK/[^l۾N~j,[ggrkuϯj-?);{ģo/t:Dղh2zt[oN`xr6pϝgߞ ǹehBD!VVV_%;~XYYUuԩ={6&&&*p8yyy\9g_K,$,~HW}z(X q 89;rS;Uv-6m NFϿMVĬ,7v4Z#۱hrgGі~\K'&&}2ݴIt:]b!fһoS;1DDF1|#%$&*UV5hٶ}'P! ,ck U###O/P;v8{|}۱}N&Mԩ3tJ.=h԰Əĉ4ia#Q(e\t:ηQQ,_\sض}'V-'7'vbZetrYR= <UޘήЃEgтy|s~3 %%###lll:: ;MJNёs9OF}!Frq B2BGf 9u2۷qttB?< e:Ϡ"QBBGsq6mXWh9Ν6hoVVq 8cm]Cl9ݳ>'GbiٲΝ!6.Zk͚IrU>H/;::hHJJظ8{ жMkڶiZ{`RڷkyB!ăGLQ*BQWe122n:+XjVxz3H*RI-77խ[긺֤Ao6}-:Vƍi{};cj4hV888V+ɘBID#>|4g/~jtaP%%1}lLM )))O?yĈ,[;wӰaC3 BIĄBU+xnw6oZOrr2 `O&߻8;;FYv-eo߾;=Z>y"K?}|B!*إK;ǎC_/ov_|7oرc߿ӧOqePՅ߼ycǎqҥ"uuqQ._Ç2ey8qk׮jSRRPܹshT*UeB!O*إKmٶm]tە###bbbx"֖|rrrصk>>>hZ ٳgiҤ * ''':T5nܘ3i$VZcƌĉxxxΎUV?6m*B!BJI/+5 ظq#Z͛h5jÆ c[=/r>jժhBm۶ݻO?EҥK2dH+*ѼaiiIBBBu:uՕHrsszj V[j j5|WlݺZ5Z-4mڔP֭[GݺuurZ-JLextH4!wi״RA^l5T֙^t,J\*BVeeޕޜUflX:'yى 2lQ!DєOM) ;Ξ= ΄i&bbbh߾=kצiӦӇ/-^+++j֬СCj\xQiwwwNJ۶miܸ1zbuL>`ff_Ħ>ʏ>AC3c#LqwAf0-S^@|f5]w?ī .(%"">G JHMTR?ȪM>۶ :`_ s B"==b,xF "..BXHJJ"**mhVjspG[sj:XХ&Fk1ؾc҇;vݾqӧ')9uL&$\\ jZޝ4S+lPN<Ә;(\NӻM~cL!_āF1xk+y<+3ff(2byu븳yzQ(ٕ5_iڄ{w@:gg'-BIĄ7hNdYٹ켈NC:A^Ұ!\̆kп !9?&{*ىrf(kzZX[o{RnbWc fL@P7q,cc4Zj-&FCh|6 e;>Y~>KmIKKo߮-w2HoΝg1l޴[[[1Ba99%YoGsI.QJII!2vc?j_|0勞WWWZ-˖,,ae-#BǟLBTijl=LCW:753ns3Aõ|~<i 8zĴ9>1w$?IȣEylu҅cǎ1x`mfl?~7!!!4hЀ'Nн{w9DDDHÆ ~NLLZMPPu矸RNbccquuET2~x?+Zs hfMn?ЩEm48A\R qI)pa='l,q/:6}?>+@QnbZJ%UOzU^F!9YڶmAUI؃<<<022"11Qo̘18qp{ IDATppСC?zI۶m9z(rJ_>tܙkעRpppog*?EّEvQ]\R3srFs4CS,fj*+5cHs~߯g{ss=9>|x'r{BO36cM!\H%`ʳ`0\dk&%-|?UK5d(r=z4}YlRRRHOOO>ё:Xo5zG:u*u۷{n:t(Fl63l0^}UƏb'aJUă^jUy$''[NʤIpaaaGEEL;::ڼߟe˖Y,X@ppٯR-ODDDDD*|||J%K8|0ѣ;o+q]J<شaADDDDA _%22ի3c zYn)*FQ4h~Xn)* ."""R4X-g؞1Z'XDDDD6P"=#VLaadeeL@wј*Uh>|HOKc%:I""""" bKr̂XrriE^nxyyf2rL9:A""""" bwOOO,@ʅf2'''L&FޤZhY'7T^ݛS06^DDDDDDABKׇ`4bggǺ+pu$«7"c=r~7oIHP=<9|h?aDDDDDDA2 ߱+Gİ}Vm?߅ŋ؄?d2Z+wX,"ܺш`-U'}4jMVOeGn{js& OQjUl_:Xl&++:/##gglrbWl_:Xh 8nnHOOSDDDDDDA]tgi~w+Y["1Juki׵t ` 5-_ׯVDDDDDDA^f:%~3 3#fL1 - 6+FuJ! 0rIψ((H)3b7ԈjQ',-ߧ` >5(ȝH[M֩EDD3b"""""" b"""""" b"""""" &""""" &"""""" b"""""" b"""""" &""""" &"Tvv6j1U !DDDD*j)k| ?EDDDh27o$%%qDDDD"R]1QÈHY`!III3^1Q)999L|WL&5(+φ]+1QϊH+71UXo '5ܑ1) u׹xJDDDDDJgQ#B&(((O^Dmӆuj1U ADDDDALDn%Ţ'""" &"ڑl_ RDDD*# !""""" &""""" &"""""" b"""""" b"""""" &"""""R>{[9lnNj\EDDDDD ֡cWHY̌B׮X""" &"Rv3OP;21r0 ]"P""" &"RZByq<<|:L"CE*ӧ YKRR2~~~7u>6Ӿ>$'-QY7{"`P#ܮ vT6lbH3\ϟSuڷoG0L|?o/߇ FRh5Q#KӲ6˖.[@mpvr"+cΝY}ş>m;@NK\W=O """rBl.\`c0\~.,>r9q$pU9ͱZ*5bXrp fN0?K'**D<:Y{V)_Ͱ)}pgΜ`?q.;E~fފeyjX}@PP Wv̙$F<= '''HJJ⍿f}Oʫ3дIc.~z\|0'i<5IYzcƌfذk ̐'b*@<6`0UT!))7x__9iݳސ#1Tx!5B`3͜NHd2C*iX'dFp0UVͷN^^N][{>ܗO {9u*??|k:^)M1lJwltrEn' ۆ |3h$8(Ӣ@p#4f˶',vYZ+"""""N=VZOr x_k3/}H"бADDDv1a#ǪD0ωH+In4Q7 `""""$鏳GگnI){F5(TXUJa^_|Yx3H ,]'O2AY'Ѭ]j$+,şNmo$hy7vFuOyodee3mDDDDDΎ&e~pV&ťK-|$%%Νٙ,!88@WUԯ_6OTT4kˁ9p dgpJy"4nDOK\F>prru0h9i.;OmV ~|`ޓ˯^݋6YfǛ$$$b4|͚5l6WړKck>1DۻWfl ';;GzjM,qk֮g@Gϋ]t|:u$00mpNPV-z~iQeNNd]u[stA׳ؿη8s k׭tܑ@ڶwޝBff&m+ h~m+ǎ^5k`2􊈈(ױ88`xzz[@<6`0]K& iS➶`Zj`T AIOO?fh6ov;ѡcWԯOHUj&~ɿ"--/pW&rT~~ZABWQ̚ey.^U니lڰNu~j?bk%ţSU$DDDDCf""""""87TK!W#1@DDDDDDALDDDDDDALDDDDDDJO3#""""""0Y,ȭ b:vUoH)3b"""""" b"""""" b"""""" &""""" &"""""" b"e',!a <QcO<QQS먢&)<X#&""""" &"""""RĥVpIy!!!X=׿t`ԳclquqٹlAu*h޵""""""Rn#Ӣ,[֟gr]M 4Of5` SA=6T:mז_{fqr*+ErM&.]Db@^^d2QnMOԹsqvvd2qAì]$&Z57 JFaT']|~6v^&YDDDDDĊdӣX?{|f'O2y2 g9z#ш'GgѡC{"al_||t{\̘/kw4upyW⛙_\[`==iڴ [#ӓ|:L"CE.dee垞E(*bNb6yݷ;"`n۷}vL&O+R֩yHFFg";Q:_a;KϗÇcQAAms;Ls]+R9v8UVqFX, CʿN+@ڴiۓ#EOɧ""""" VF7ѨpiӦ=m;hՖM)rԙ3I<@wLbӣxYQթyI1t}`0|:ȝ{x_ސ#1l$$zuݫk[L&888jaŊU7l޸u۴aF%Ju\u6,nb2r[*LXZ%h4Tfrqj׮ͩS/xn3Ū(I1$mDEEM0"""""rAljB4oތ͛)tP "" by~̋jr?ԹJ&"" ve9\ j11QQ11){n?,$9uɉ :''G5B xyk5Hebs̯A:s"=œCt\o{8p޽.RY ={ 5H)+׷&sO+syM<<xۺmZnŌ[oa|W?Ξ=AYl9/^b1n_ڛŚHOO̞;hn~ vvvDmդq# #6?/Yw7`K=ȍ\C/?SINN}^ڵ8p ^yؔGG^:A""""*=b\.]Jȑlm0|;{|Ԩ̶mۙ|e}7{){ IDAT?W]z O>A_ 77QόΎ;wf:}\ۧW"77’aFc>4mddd0GǬ_ҩl۶^ՉJ[b+Vs~n3] vEFjسg_zɴon"oo`X{r1}\ݫ'S6n܌+O'\i}{ε  io={;;;m׆tZj6qf.\NHyb>>ԫ_GGa6l1NNӓΜ9KuOwZBpqq___ѧI__-7%KqsuYZ,X5?{Hyyy|۝IJVAm{6uJ6mbCr˦8880n$~^J5b],bѧHʝ}zyoł+,#\H[/N_GO'FDDD"quuҥK;rrL,[̷WWWޞM}ʹ?b(.[n}vIҧO/222=wĈXQ+ީSGz(nXn==ڽ̷Kӝ;wݽM}'Mx wwNN`Ky6L:w߷1qҫwXZh""""rC} oȑu픔DVV6!!5n鶷ӊy~̋\HRϿd".>?B&i\]\^;;\T6cȱWڦNFN(d*VA3n"wUR+4988PV-5H!tZDDDDD&)*ۭ"N pX eC=b""""Ri7$,a' &""""w#1 ~s(BB&zFLDDDD*]DDDD*+U(Tי#1u"EDDDDV۴aAD$A쓏?T:""R 9V "R bƍ"Rin];iX,ADx^DDDDDDALDDD*kזY}aE^?##ÇӠA|A )sCDDDnٳgS~}x2)uy3f͊+VN f6_IKKvӇF*[À߿? Z:`(G_DDʓߏ`aÆT%%%d"::PBBB -kḸisEzZ~W'Q[SSSԩO?4M6ٳtԉŋWƸYϞ=Ypu),KDDDʣ;vNDD AٳǺ[n hт'R^=>Bٳ';ҥKYf {fܹE(qظq㈋cϞ=YYru+;;?:uXCIIIy888&33={PV-j֬iS]!..7nl]~ճc2pqqq888 [QzW Hi[OɉZBiղu+]:ӥs"w9qrr*q2d `ʔ)5vac޽777~GʨQ0v]?CL&L>XuA,==ٳg3}t၇pJR~$77,-ZD&MWn6mڄ̟?%KsN.^;[nٺMƍfΝ`„ 7ܧlc֭4jԈd|}}Yz5p>|8ӦM#66?sҤIf͚eNQu/x{{ԩS=z SKCDDVZùiڤ1̜-M4f`08w<E.o˯ӯooҽ\r6nh7aˆF :777tBjj* ES8N""%U[GNN-[,t$EEEw^x"""ln۳gl۶_&M͡C7Qdd$vbͬZ^{Gp{eժUİfv?P`'OL x7رcf*1^w}+l.V}DD4ov/8_'M[#cB7r%6.Kjj*Iɤ>TR+(!!:oGGG233l_: vKJWA\I?~uބ صkͭC סCygpppM6:tȦCiݦiӦ\d2GpS## W)*=+&""Wh4|bO02艡9z y…xտ,QL;v̺v(u18~xJҕ@u%x999<@VVM6$&&p,]M6ѬY3X`AfV} """Y|%:u-3ͼ3}v73djقNb0rSԬYC0+KTڵkӢE z-, yyyw}ֿ9nX'Q#<<:uXG*HY^I:qD"[n\ . /0x`RSS nGqũOiPo\g~|yYBk >..'N2pcy1``Μ9lݺ-[1jՂ8ѕ[ED !8(v9tٳNyx])ulܻwozM||3g\wd2,KJJ"##6l@rruޅ ظq#|8Çl6cuV5jDrr2^CѳgOСC|o{cǎ[ǐ!C0`QQQݻx"##ٳg;wO>ٳhm믿?N&MСCddd0|ko6Geݺu9rNZcػw/V"&&5kְ{n~m 0yfk"""PR{x__DDJ1lْ={=/X8&L]6lX!C@g6mp!AAA_?w}\vUcd2G@j8~8tڕ( !++={TȓgDD"1,Z1c0l0yua5!!A%H b'OfIbb"UT&0]R?_;88䄃ͼ,t^0a.\WWWRRRT`.]ʦMh֬aaa,XSNa4ywy嗭?mڴsh`\DD? ֑_jj*:u駟iӦ={N:x[R={pB )UzOk 8>}@-=III d9R2uFn/`tޝ5kb61cFeQa""ەt{eƍ#..={go]1 4lؐUZ%&&iGBBAAA puud2Mhh(!!!?ą z9&&8<<EDnIn%TvmZh[oſof3o&w5ATlĉ4nܘXKBCC'ΦnݺӢE f35kҹsg^|Ef͚  6СC 5 6aꐫ&"R1BXi[OёӺ5Fcc"==ٳg3}t၇pZl7|C׮]wԨQ .Anhݺ5 DGG3uTFʹiӈ?fܹ4i҄3f\w/[Ă_XW9s0`#44f¸qhݺ5L&֭[}||<=zwwwN>ͧ~+}#Gߟ Μ9Chh(۶m+Ab+aL$T"rkتU͛:uj 4h@tt4  |σEEE+ymڴ_oߓ&M… Ytv8{,'O$''Xt)iiig [yp0;[fw1vhNc'ES31 xxxb1$''wwwz ?o3-=wEe&55:]zurrr|\lƍy&L ,,8jԨQ:t.]j}ZW#n䫨Ǧ"bU; (pPCݺuKtuh4JݺumB\]]_~ aHs h4rzx~K̚&gFs;*F;7'Ng^IQ,^PϥK w1ǏZVQGow x Uc1 *z&"Rqsb&43箻Z>y.fw5%9,3۱s7aksܹnV䋀'--^pԩܹs -v`0w&%%%1nݺrJ.\ /IMM-򱉈(U0&"<^ן 2彷.f]'|7<nMggg6ΝHMM%>4 dǎ]]68S2sLLb SL6 fX70XFXhpyt+ϒU`` {ĉ>| _"" bw#v/k]}c""rW&v+_~o|ₓW=ݢع]hڴ1[ *ٿ -(Ջ 0c \]] ۛ 6ЪU+`[n???bcc5k7|իWD͚5뮻U'b h߾=iӆ5jиqcza3ȗHQTQTl`Ҥ˗{pt[Fj())Clќ?/ݽZ??_//O]{wǓFHHNNN7iӦ}0`_#G9V^=z{ˋdZjŁ }fVZŎ;1b~~~dddk.vIzzzsr+V`ժUdeeѲeK"""`ʕܹfnݺѺu"e֮]ɓ'qssK.<ZDDD q$f>Ǐ[~zh߾=vvvݶgϞ U?8qf%uI"""8s =z'2o<9x` tSNwa„ xxx?|r~g6oL۶m\tϛ7LzHJJ'dĈ(H]yNvޢX־ky<<RSS? f͚>}=Gtt49994n8__JJ QQQԬY{9r$&L`6}>S-[F޽mwgW^aҤIs=jՊ$|}}ԩ~iQn׸qc^z%1Q;َ;ׯ撕ŢEhҤ ӦM#66?sҤIf͚СCٸq#kȑ#x{{zjJTڵkcggGRRuލq嶺_~ooo:u*G`Æ ۗ:uꐖF/HNNۛCѳgO~-=py^zYرM7|``РA؍nիB^t '''{۲e ԪU&ةz~^* _/""RW{î'//!C0`ػw/<X,&OL x7yTudY2jk IDATċ^6bT3$^LIJQ52Q1pfHmr+'HJ)"(E{ *p~|^lj`Ŋ;w{믿ڵkwyy9o,^:0j(%1};v'OȦMX`z*L… 8s Jj4 ~F^ϫJhh(Ǐ'55+W^d6lpWexx8| 'Of֬YDGGXqqqL:3x`ӛǑ#GxWyb˖-"+2"&BjpDܹsիYYY899Yё}q^JUUIIIM{Æ JPҾ}{vڅc R3f %%%P\\LFF2:R5k5sq))++#%%KKK~'^u~HHy̙33g...gyE 066ؘRҔ%Kcddĕ+W0a/28rCHB1!B4òYbbb 1___k׮XXXפCBBX~=/_f̙̟?DeqT:pu 0777XecccrJ ^'// $f{raLMMhs" 0M@pp0{gРAA%o&#Fʕ+XZZ6ӿΘ=&LhѽB1!!uf5ȧ1zAUU<}uuRܹs|+Q/_Vonݺ駟Vd-Ņk׮=萋 zFzz:׮]P .\ݻ7WHZSTTĀ4ZMǎ9< UJஙN@1!B!sss'`D׳l2z)%0޽;?#z###LLL\p~ο/\]]}̙3wyF>\\\=z4!!!˗{yyo9A"YBц<̛uT*bcc9rّl7Ηڵkfff<8;;3g B߾}y_kFii)w-[jqqqۛɓ'RcӦM\~{{{C׮]={6zJŧ~ʿopuuewYҭ[7tt֍nݺQPPШ[rAlmmqvv^cÆ 7*vz聅}Y ̌nݺѥKk Qg^zڙ[ozcm@AAl*x>Ӟ~LymD{2=`jR| |2EEEիZ/P233 ү]FVVvvvt twuTRuu5ٔ쬜W~իCyyyboo_^ q??!m(w5uO͈Ԓ>HKKO>;w~%K*gaaquڵk֤R\Vѱagg'B1!Bܭu; 11kkk"""#bB!h+Axxxxn:B ĄBHF„ & !B!bB!B`B!@׳w~'xrs 1!>j %o#)**&`R'7H! B!s+]Mnn.w`ccz-\ wu/LL׀B:vHUU%?3tnxWFrsܹ{B!Bи~:ݾ4:wDΝH  sgt:Hh2`@$K.,\^ zY!I:Low5X[w%:r<!h@@X!B!@/TVVҿt;̛;o.gET*NW;ܜ=|/b_&K:}afk׮B Ğ~icmw}'B@}+/+sη-s!3_=1JڴS=`077`ahZ._%UUU|˳ BYBq n[&r>tUIQJoScooO>c3]B ĄB ..߶=:K.)innv'G'$O$HhZyB!BpZ0._\~cV%"2wɩ=ʇN|`'[632h׮}jem$2*FB@,""ԙsN7؆۶m'B*_B! <ŇK zQ]Q^$tNǫʲel#''yw@uuu7!?3?3>4?~<6(k.CYYh4ڷo/o(!S5q񔖖_yf"==TBCCs%))f_l``rQ(//g̙Æ  ##DyN:ũSpvv֔ʇMS֔ !wZFFM.\`Ȑ!8::޵k8vÆ nh4[KKK5jׯKKKK%޼y;7tZ:t('OgϞ2b6oެ]'bggYn !O377祗^"::___h4T*rss111[nJӚ)ѥKߦS755ƶ/^Ȉ+W1l0zo+Ȓ0!mɧ~_ `ԩ_K@=fƌu[jW\ĉuΪYj3v&;w(KKK֮]K@@111,X+tR B<@ܘ޽{INNfʇYUUtbMR͇N6 z !0uTNzt8p/BI;v,=z~VX̙CQQP#kkkkݦ^CBIt~'quueҤI=WWWx'X|rpexꩧV>UTT(kZyyyoj t:hBˣ`VVVdff*joeРAӣG>裻r}Z 60n8%-<|޽{ߑtL4,ۧX1m4ݻ7?< $BՃ0!YԽᅬ3m.svv&))#FJYYY3rڷoG :vݑkh4RSSٿ?J^qq1EEE 0@IStؑK &b^ݨ !1R/6uM%+Wdj.̞=F?Of̘-111*{SRRիWnlRxW8twFדJ\]]cccbcc)//$BH &b0&ABQۢEHII333숋SP_={bmmMii)ʆʴA@9ԛߡCK;j|,֭[ sss^ʆ pss)}JvoU/rڀN \K J&hkiLy FD5W|p/S?hZju~^|+WгgO[ZΦ gg;6-RqoȈ}N)!nwtMjm*JFb$@!B!$B!BZ&~wryB!B<$XKS;ɳB<T*;}4qqq˸τ JDFFjeKKKIJJĉhZ.\ؤߘkٳǏ3m4욜/1!f-9jo V\ɗ_~ɕ+WXfA^NN%%%wcǎ1j(OZFѰtRx:ϛ7?{{{~ZRC5Th4ӟT+j(_v1!-˽o(**bǎXXZKw>C-[uUVϪU^Cʯ1}tΝ|!bB! rI_Blٲ}Juu5vj~u:OI;v,%%%=z:-jFRЬ|!>}~Zy~~~l۶~õk <ر~z۷3k,Lo͙3-}f/Z(i ĄZ߼Mrr2'N`|\t]QQ@ ̔{^]fΜɜ9spqqiVif7^~=.&&&  O{M122R>Ξ=Jo߾kN{%,,,ԩS| ).. !!SSS~z=<< 'DԢ>x ...d̙899QXXqwwG)))J}oooyG3gLJ-[{|رc7oR'`޼y<##xoc̝;777v)S0a 26Z-111,^HVVVׯ_em={gggÃٳr|I֯_饗5kVAX}ӓuNNNNN\rEW !DWYYɦM9r$~Vhee3IIIJZjj*eee 8w+^O޽Yz5V? 227/hZ4"V^xβUUUL2 *ɓ|NG`` 0c 4 ǏWF9IIIQFgj;|7oC1N3|yyy8::r1|W!00pdʕ >Z+((PF)))ի`mmJjח퍷r888c=` jv׌M<s%lmmk 88qY ==T;ܹsիYYY)SԚ"AAAt 1cPRRLe@8j(-[̙3055eذam^~ީݣ?0l0t:6m ##D8uΔСC2d+VϏbtmR~Gig 󫵦Ύ1cyE#fff'$$bL6MɯYpellll !$3m133Sn``MW/5u7o55A @.]bfff&gKݻwWwkYcm}H/~z8@YY2yEXrAÆ C+_z%3d g&hI&j|W;;11]CرchZjO?ԠԩS:ujk~C7|!}=zFPvp5rss`*--MѣUUUϟWj4CZf IDAT_|#GdL0g-[oGGG\\\ȮTB !*=Ly|/g+N/ u|NN*t}O?ty׮]`=^kk׮cool!h]r?3k7 oXQ?` ڨ2ez_BZ}}SőF>}8wo6K,UAL35ݾӧu޼&&CBo}<###.\L0Aɫb۶m$$$PQQh4>4999HZ->>>޶3g'-- kkkƏocCo%33N:1f^xe{CKKKIJJĉhZ.\XwݻdxyyɛM6Udrww~#::3gk&OA!xddd(_lڴIy} b+W0rHz-8p ۷oo߾=cǎ)gcj4 ֭mCrIzIaa!#F`͍Ϲ|2<&&&LݪSllmmYxq-,,pqqȈ~#G0t&_ 5kaaat:-ZqB1!; yVwr#Ejvp(@ee%M9lQQAzaaat:&MDVV}M߿?Ϗ{ &(_C'~z6nHYf rJ wòg!a'4ۺu+*IGXYYLRR#F 552Xg^F!55k(Vt: ppphrZЙJhh(_~%xzzH!k遛B!F@@Ç_FR iYb%+Wd ={6ռ+:tݻwGRamm`^gΝO]vl2ӧO)))ի`mmJ"-- '''8}4s%$$`I!} !B /"̛7:t@II g7lr{-"%%GGG̰#..NOHH ##ٳgjnd055|PƏO.](**'..]`XMu ˗/cccæMxw3g|ryцԚ˽/Rp^} !hs6~!^LҢdddPQQAϞ=.hZju!k< K.w|.]6BIFĄBqPT׽{Vv;;;Z666țD,B! !B!bB!B! Y#&BVGsN***?~]d"##j{GٳǏ3m45avbϞ=Fs9sxҰf WĄٵk];//r4 lV,Y¡C3<< .^%$:: FտVeÆ 9+OFĄBƏOii)_57o//wHѭS FR~̙̙3:x"cllLii)iiiJ~CkTUU-/nt~C !Z !ՙK//QQQh4T*] "B%)Ç ">>b055ݝ˜6mݛz{xx7HN4,WkgРAB1!B<,b޽$''}V ggg1b1p&?w{fTVVݺu(mj:vԩS=<+&MbѸZ߁%+Wdj.̞=jooo\Օ<==166&66rq_]]+¡Cؽ{7z|T* ۿB1!B*'''V__oI~ii)III8qV… ]Vf3f]vgD{nvMee%Ǐ˫sϞ=?~iӦagg7ԾidDL!ѣG׿ѣٱc]رc 6 qFaݺu.y1vX6nҥKkIFFW_f̔@mĉ1p@֭[RժUL4=z̸q㈍FÒ%K1k_t}Bl_߶յ}ٷo?Qbׯ]{{{{شiѡC&oikװ >>cRUUU?8;; /3|?ʊΝ;Ä nb…deealll{BCC9yr u}ʛ\f1!B*VKLL /6z8pرc)))ѣM.| F_ff&~-fmmMIIիѱcG.\@yy9Olg֭bkk9W^eÆ )u}],,,(--e̙,_M' !9bm[]~ڵk8;;+lZ-jJ-oj)++ٙvs%ԩo_42"&B{]qȝ*PTKetn/hY#&B! !B!bB!B! Y#&BVuV~W^{5,--H˰a5$''V__o(h177 ??ZٳǏ3m43g'-- kkkƏ ݵk{졬 OOO4 ۷7 !İdV^msСcǔ`OVhXn]7_ZZʨQX~=XZZ_'33FÒ%KitCɓٓBFap`ڵk8q"vvv 8u !Z !>|8>f2i K._9G3c :t Z+Wp :vx>}:s%44I;w[[[%k׮% @ |,Xm\tɠȈB! ///Ί+Z_Nǁ FƎKII GmrƴKpp0EEE9rZDGGR){k0HEEښիW1337(B]2"&B{weȑ̙3={Jyyy䤤YXX`eeEfff7joeŊ8::?zjaɒ%uNljZ6l؀NPP/^Ғ GdDL!'>>>,])u (Rc7u~WIJJb̙֭33g...-ު*eJŋ)((cccJKK !zw0`kjM,,,TRΝ;cdd?:u^ƆÇÇ ">>b055Q׫4iYYY۷O&8 cڴiӻwoy $oB!B!=#0i$-Zj3IIIJZjj*eee 8o߾=t:vu:ڵCӻwoV^ͪU[߿Q׫h4Hb0`Vر#ϟ7 !al2V.Hxx8EEEzV\Q]4|C>K.)헖O͡C;w!j^y:^'??lllpuu%""B ccc)//7LMB!=W{*-Z133Ύ8%?!! fϞݨ kkkJKK5؀׫jCcjjJYYp@lmm177իlذ777y qTߚ˽/r҅B&jLBzmP˔!TWWkFբVQT-.P˗r ={_ͪΦ gggڵk'oN!!B!C{w|Cݺu[nv7ST8::C5bB!B!B!BH &B!5bB!gN>M\\/2y~~~3a%m۶@EE @ysCDワoחIKKښ3x:ٳgǏgڴivZeě͘1kkkvݻdxyy5 !<B!=rJz->Zy999(\ȑ#y뭷pvvfl߾}r&{1 8XѰnݺfo(С׳qFڷoϚ5k޾[_qgD!BJ6mȑ#)..V~vz;nnnlٲV֭[QT3с3IIIJZjj*eee 8Ӟ^Gѐ?=^O޽Yz5V? 22\KDD>>>t ĄPvŎ;OOoL}!ĝ'#bB!hU_}|gpttرcu # Ç/RHLLdУGF_C`` `iiʕ+>|8j ѹח_]]+¡Cؽ{7z|T*x{{\[nn.DEEXXXȎ;/k}?iii899affӧ;w.!!!7C !_5Uvvv3:_|J͛GHH:tٳgo6-ZDJJ aggG\\@FF5T|VKtt44CSS:iM6ammͳ>[g޻ヒ̜9˗7 !9GL!#֦檮&## zi֩jFAPw's% P IDAToB1!BWT*={#muoj{w 666id!B!@L!B!$B!Bq1!B=zt;wRQQb۶m$$$PQQh4uTDFFj׷Eʯ ::DCߒIN3f /Gii)III8qV… o{{L6 ;;F_vm;8Θ1C^qgɈB!Z{wUU?~} "x@f9WoV (FꁼfRͮTDZ!F- MRq Ae>p?XGfPb-~~XhQzy摛 [xꩧFӧO.^ج::u 777jlذח^TTȑ#ٸq#vvvgݻ7&&&̞=@%=00OOOlʕ+kkjX_5RRR{SSS qB!z|}v/_G%!!~)EFF2m4222077gΜ9*˩WTTseΞ=%'L !!!@>ZdeeU߬!חrJ>sbccyG߶mXp!7oZMdd$xO?͸q >>^ߙFa>1!B|Q@L!&^^^_sNu놻;x9M*[Thjj5ҫrc,X(T888`ooOff&'NhpϟϢEppphs $$??? !B!l:tiؾ};P j9_ݺu 55ڵeeeӥK&]sssk\Kر#Z[f9i$tǕǒ%Kشi-Q#Gpqȑ#DGGب{sә9s|Idz!B!|}}qwwȑ#$$$ '''vÍ۽{7*A59h41l0)))>m^7WӦMXu76G}J ~j WWߛ`&N|AϤGL!Ç̙33f F.RQQsLL o& ,hV0k,`0vZ3;v>hkZ>3__TTĨQ0 +T~~>WJKK䐓CEEǏرcODDP_Urssٿ K1!Ba|}}Yt)^SRVVF`` ,}pBVZլr-[ƹs簳kkk8GGG… t~}鯿:ϟGtܙ"BCC޽;ԩyyy<8pWP*U ِܹ3O?|1xd1!=Ge{;{at:=zm۶nܠ=;lnݺE=hݺQZVVЩS'''=bB!hT*=z/yKuH59bB!B!B!BH &B!9bB!x~ZZjҥK]I+//g޽DGGxjF0_pHܹ3^^^ 0dknݺSO=ſo4 '<<>}p_'$>>=z˰aعsgN gggZ-6lhM`FϦjϱ;̜9{{{4 ??sonz۷os1\`VSSS)--eʱAIBBj{ҹsg255U !B!T.^NqNP޽رc=#|'<-=YYYҽ{wZ‚k׮5W9ps̡_~ 77=<<\FҥK5j2G$eٳgYx1 ,C,yCNNtGGGRZZO .dժU@"۷oU]v,[sagg)8p@I&%% 6充7hKXnj"ϟ[o*m tݻ5k]vCܾ}O>''' *Dc>bB!zXV>bUQQAJJ :=z<),,Jsm퍶 hhzNNׯ_{57٦SRRFM6GIB!*=zickk{OoNѢMҥ ]tiֳ+!ldB!BH &B! !B!@L! N>]ƍ9s̟8::VP 3gB1!B٭_jy^'55U#%8unnn@Z 6SHVMB!Duuj5eee$$$F8s ߰"55pqqUV  ??gbkk*ztWظ͛79s rJߟW^yO ĄBW6~x w}G.]HHH`+O<| 666,_?ĕ+Wҥ lP=SLٙFɧ~l>/0qDZn|xP=ztz(ۧd֬Yό5JxB<24Q!-کS'&&0,Y`Pcbb8wL<5kpU9•+Wh4_AyҥK9y$.\HV7DGGuVZ-EEE ͛G@@O&11[nEii)ݻwWj,,,v|x@GL!-/fff;|222.xѣ\p۷oS^^N\\\y&)))JJ^#44bbbxwEE4 %%%;wsss.]믿\`bN6TIBH &B?m_ZZJ۶mdU1=<]Ѱh" B>}0a3fhTvƏٳQTpð0KKK.\`@RuV>sw~Yl...aeeEll,}|1xTI*>سW\HMDžB&dG]@r-P{ŏo**Gyy9jlٳ'[nV^# ڊammMNHNNssl),,h9bB!^DLLٳ= ++&]{pqqի۬XyjhӦ -ʗP ĄB!xz"**:wLpp0'N#@L!~quueÆ r#,!B! !B!bB!B!$B!B ĄB!BH &B!-,_/B|sΝt1J%Sd#&Bj8::*?o~( !Ds.T}g>\| !-MȖ𛻀 r3Z?TTTMBIB!BH &B! !B!@L!B!$B!B!B!BH &B!0[ B?` ""( prrbo{cƌN˫<&O7ӧOoQmgժU8p3..퍳scǎr5;v,&MBR0{lfϞ{ˬ/Ϣ"∍K֚Ç9}4?nP$$$m6 8q" O@zĄB3f^~e{1rrr3f 믿hѢjz=#77<222oqm[x13f̸gر}hӦrQՔ#F`0`iiiTt,--i߾(%$$۷/jbrssS-))!''[[[Z2[vrr2>( O9ɴiܼ1g̙@ff&:u]vJ]322CR)/--ٳ8;;+t7o'P3859}^zjՕs)?_H޽/:tQ/^D(/ xb8|0 >7*O6^{Z=#FP^?0em Dtt9##ݻs-*V~>}: 2"%\}1vX%I}yĉOUVqƑ^ktYRxgػwQ;Ϻ*۷oGRJDEE1yd%ӓ|~ge"B!D]pNǠAj=G3k,9s ϟgܸqhZ**`SNOLL aaa,Yiii(رPQQVۛDٺu+Z",,,ػw/˗/ԩSlذsαm۶ZΝ;7noXΝ#!!'O|r^xGBB EEEJPR_krqxZoh='=zpE<==~嗉8qy1i$BBBصkQ駟999\|X_u`Ŋ|'Mο,JKK޽Q`haak䗉bB! W\\ T~&99Dc/&..4 cǒOFFfffL2;v(]XXwΜ9Ù3gh4(TC a͚5L<+Vw:EQQ_5;w[n7=5k,:tȑ#)--ek777~ntڵgm TijujĉF]v5E?Qbmԕg]ϟϢEppphrt:jCMMM4UB@*/wN`eeT5D0VZiZNƍI&oѪU+֮]kTS1d Rg:tiؾ};jQT nOcuIwv0555 \ڵkGIII|֭[k-y_~<ɓ'3aONnݔu49rǏKdd25::vڠkK ͭB1!Bjzꅳ3;wdĈ5cooOyy9JV}qwwcǎDDDΌ3N 专^^`ԩDGGi&6sor{:t`4ͺ i4 4{^ύ7&##>gm >((++*hժ5&;F!..aÆHII _&9(Bnl۶w}W 6yٻw/NNN 8z z=WfĈJ SJ̙3 bhZݝ7xBrSTTzjrssٺu+w7$!!2#3gd̘18::4=ߔ@N6;w1bOy6` <<\ vYz5vvv(LMMyꩧXd ӧO2}}}TUmի6dƌʆ*+++:uDBBĤrWYY4Z0!!}59PAcee7nܸ'u/}ٲe`gg|gKO@BГ}ZNAASSjgddR/+(( -- kkk9WKcS^^ίŃni=zt2}"77jݻ͛7s{sCOOOgggT*b9bB!C7y:ͥVoi zC;nݺs?Wɓ4]熖!B1!B'Ė-[6%"sĄB!B1!B!sB!xv͕+WzO?MV-o <TjJ[[[z&o'Oۛӧ Vo||ۗ {5)+W͇~=+oߞWҵkW|sss֯_oGژ1cK<޽/+>>>,^'''>\?H@@&L`ՍnW>}Xz57ܺe0:u*Gfݺus)N8]v+&''GI`` 2h/gXkoʾ};v,m۶5ܹs4h+VU Hj*zCe_~%C5Jx"7opizVWWWΝ;WsPT<3ݻר]~~~ϧsεו^'**ɓ'+<==0  rNgt;v+Wܗ bB!*--͛,_3rH%}͚5\z#Gp4 ׯ7ԩSCXXK,`0P^^K.ɓ\p"床 Z-$&&֭[ja07o>}Dnݺդv>NǥK-v?Çsek,?ZӧOn2O?e^?~'x∎,[WXn}DFFၗiii(;v666zf͚7gΜ7V[m; 8~I˗,O8y4i!!!JXYYYTXXXpڵj'J8p9sЯ_?Lrrb@L!n| :uޞ 6a4ΎGGvZˉ3333ƎK~~>/Tku)))3gp4 %%%;w$.]믿\`&Grk%eee|Jѱcץ]vyfrA;w/zMzzzA2kȑͣO>dggI׮]3fLnݺJlll>w֍󰷷UhZNƍI&2*hE:j[RӺuf}gG~ʕ'Lݰ //xnnVU3gѣGG sssVZŰaøu F1!BYYYuVٶmsի|ܼySVdff*CRRQ` 88腶Jrr2FF6}[nw8::R,!Ət|駼L0AOwjժUzNNN3Ù;wnKh4Gjj2﫦rwDDъtؑÙ1cS^^,믿*iȨIsqF1FC\\Æ  11Tj$&&w\t:T*UMD!BYht`0de8]C1cư`rssIMM孷2Jwww7ޠ7^gϞ 05k(/N喕QPP@^^NϏ{ *>J@ٶm[`5rxWxGY#8}t۶m`\|'Xn]wW*3gy뭷@׳zjFf59y$#FP>:thoRrrrEKrrrɡ@xx8eee@BWr|Рf͚EPPyyy ֮]СCqvv^zcǎg 999ܸqC?<<\ƘҥK5jT !/W_m۶hXhC O>L0QXڵB?~,۷gʔ)FC6k2c (((0:lBw[W#""xZh4hQʉ'ښdBBB beez+++' SSSԩ 8p@J߲epqq+++bccπ9oNJJ ʵw#ХKQJNPmypEj:.B4![>o.h+~~sԹݲˣgϞro>JWPP@ZZ6.++#99[[{>瑩rb0v:FS_ )ΎhL6ѣG3|qիջhHmvsscŊ<쳍nGFF*|ݻ͛7YYYbccsO6ެB"Z[`~mk*Z6#&B')8@RR...\z~+VT;OV+֦M\]]K*.Zѱ9r۷ڠ *7'^n]ڵkޛ6mRh:y$~5{Pp5y@L!իQQQйsg9Le6mҒ={4'''l٢|9rd c4ƀ{E&bB! ʆ F/lv}H!IB!BLzĄB@۵jhIedd`ff֨%'O7ӧO1}\rJ)}hӦ GZZڵSVTLMM%%%+++\\\hժqk=z47nT>_xcDzpB6mڤ$$$۷QQՔ#ƨ˗/}U6g:tPk;۴i`(t,--k\Wcqq1ΝG888{k77|À011!77:|k2~x̙?Qj7ve~~>;w5z=QQQL?3QKt:coرc\rAy ĄB!^ϬY̙3?qơj?ZӧO5kz*Gʕ+h4֯_ >NǥK@Mbb"lݺVKQQrͩS'&&0,Y`>|˗/7^c5ˋ[nmH駟2yj/U?OkR^^N\\\#P\\LJJ 111̙39sFCIIQ/fff;|222?P ":vິk___6o T.(sN^~ZIOO1HUs9{C՘G}>~88;;cffƔ)Sرc۬۵kWӕ'::QRV=8qI߉V*//LJ]|r+ҥKddd`eeŋ/($B!cdffbbbK rxxxxb077GV+Cᚣ֖~VZvZ)?nnnFCU^\\=_}?#?8={d߾}ϼy8pݻ]2f̘Zoݺ5zqݺu#33V%11ss:tTf#=bB!h8p ozV^͈#w[[[Ο?B`0"99YeeeǩSc޽oPXX@EEQQQ5:$%%жm[`5U^y{=ju9bN>]mؿ?/_fĉ5[W/\@QQW*3gؐ['O2bC*--%''GY$''***0 SVVT.Աzjpqq*} `֬Y``ڵ :ggg***x饗8v{`0Í7Õa,]QF5{8!B!DT*BCC9q666X[[,{<}0a„FUeӦMѭ[7O`ӌ7N9',,blllpqqҒ 6hջ777wN߾}y vVygi߾=SLK.u9c (((0:lBw[W#""xZh4hPoM~OHH0>>>zRLMMSN$$$pLL*EGGsl2\\\ʊX>3rq۷r흽<#t{{{jrKNPmpEj:.B4![>o.h+~~sԹB^ T*UL&//={!^ammݨM ׮]Cӡhj!eW_1rzϟ6mGf<իWwѐƊ+xgݎ>߽{yf""++\lllPٛUXXsCDk o߾}CS_B!Dع;U=ZV5FVpttlrGa6(͉׭[WxvpuumV7mD~=y$~5{Pp5y@L!B<@6mҒ={4'''l٢|9rd c4ƀ{E&bB!ɾfGɍ:B!B1!B!@L!B!bB!B!B!B ĄB!B1!B! !B!bB!B!B!B ĄB!B1!B! !B!bB!B!*?R|(IENDB`3Depict-0.0.19/docs/manual-latex/figures/CoverImage.png0000644000175000017500000121633012640746376022220 0ustar pcuserpcuserPNG  IHDR=EsRGBbKGD pHYs  tIME  IDATxw|e̶FAPD9"MǼ:/""""""""N1~Aч/]<2HDDDDDDDD룿B:+8t̋p6:&˶ҟޞU1\5=q`t\&}r9 #/GAa\k4اbT 6֊BMpZQ1 @ hGGѳȝ#8:@kFG:}jo 17OAGp$""""""""ϳF`u1\sUP hp<{р1Qxt}:z y"""""""""ޜQ_c!l17`c=ZQQ2}8]G69uy#Pɀ#oG%ltۀ@#ikp5vUI;N۷os6c |ZV A)66NsԄʎ)Hf"""Ge )))?ɲ *MMp[Ɛ*%S޽ 'XtU4ȓe0 2EEp˗sV+Q. 0Vt j޽{: |\ zf,ˍ,K>( Dt:d 6&"""$15EEŨW^lbAIIIlͪsV/@L)˾<@>l̔jق S@AvN:3Q%kqU祥t)fyyyy].=xپpt 4S 84hLd0 K {^xλ$:/*1 =0vi=o^p9y%n`_x c%Bp^o)Zv骻#TaǕk.ޟ<-ޟ<_s/H#4ǃy?'crW8y+`yKbPw{w^vnnۥeUhe'\yW8lk^V{<.H+UV2$`d?y$\d?XvtW(b9ۘ+u5$''ܹs@yD]'a<ꀣ#4en_+ܸOTA9%xf `!qsz^1*v\dc0@> NHnޫ]sS{vA=ƒ/w!שR]2)rxE}:B 7&""r_8^VV;Wy^u2Sq`Yt^v|}|~Qr󭐓>v%e奲ܽ/w969>_?e%.}uX9ש:հNiWYu*{-uSߙ ߟ?l+>祓ykNɄG9>C*أGYu*xz|LǀA+P$ pRj_ +x&k nTe*.Y0d%a@P%ayWQ%G(,-tS ݵ *A _usT#RӪDBBe\jBpT~u9)uz^gPQ;ADDDDDDDDD5@g`1,U:ةS'9&6F޷Ѳ<&оIèu䌠Vzb+~/Q_ %&!-w9{^V|o]ʴ剬4lsrEe GA])O+HDDՋv& S8Z~!_6p ^o&-kxS^@T45 NJYeˡ{+=hlVP5_mЯC;ܹ#:կ DDDDai^fU*U}88K~9Mx&@(,,RVfYK :}"^oy轆Fs%C{l^mEIsK ȷxTO'AGU%[1 G|W jOCZ*[BN+‚?}T\wgPTp邚lTg=kW݇{#(%堮.QYwDUeŚbm(-*!/" Yҹo?|u"jݗX?q ~$o&Alه~3f3~j-3NNAd@59#~Hy2/@XpI(.Quok@qE2 Ee̼]V+%R e߾ςc΀c7b˜Ixa\sU+8u&s.cݰX,0EEщOb[3q/hԠ ^xU۝ko_ߎG#7׌[sOo_!@IDDDDg1z(p*,x% Xg] XH+t>il% 2DѣǐpTJEC{!- V]@V F{Lym0IWߝZR`kZ—j:)'Z9)I57$@zu [d)9 @!6Q#6LfБ;u|;X-ΟBB\9l ȶ~_vnXJ8<oIb뷛[px﯐%O._|Aą 3f$P'K*jPCKWMPu^-iU> ]N-]q՛D;$ +Xk*7 xI@ШwQkW+Q!رc_tDQ(dT||Ǝe˖>C}ƌHXG}ʐdY,! 38E?QT?ۉK!Z+;dQ _uN1&(Y{EPy*G>)S)ϔ ݇B-2{ZSeoDAusI{{76n]\'Y}j7i,6س{o-P ^I!D(m\GGGC%Ck@TDk[}8Ry79l.Yeo%}8VN+3߄!P5ˀn6+%^Z~W{lMAf)^t J$J/Fll t: $I@qb@,nE~)!""\\<^+p 8ؿs>?/eeE%G+SQX_>|G||, YXDDDT(.ډkAIe˖UZj8z(V; %: '(u~Wh-0`bZ5]* \+mU>զ%hzr&b]UE(!|NV]2}e*Ғ#Tr%9!`Tes}F5}WJ^EkZRo*3B'u /i cF w6?#m={T%m:`]\ǎy_~m eJ習Ȕ|Q}OFЧF/i*GGU^ڗC}K_vu{Ņ.ˉZp8ovm~ >o*cǍ ~8b1"A (,,rGm9\A@aA-+ f8[> -[qc _z-k)2O\F,HE:pۛL,~!""+s7&lں/gQxt?oh4iff> ?ZFBhʥ端CRb26Z^)>f*7~dhܨ Ι-|ON49l +qG.\k[ƙ3(.)ftR\ lܸ1ƎKU *z:u)J2NPhb!7|֘˰O_ZBI G7^Zaj6سPɯʾ])-!B;BJgGčnBbB"N5_#^`nH8r5^)leaD\JC;qo4OgHHqnӽwgqs 13,\r.ۗ+`Oˤ`PX ϼ(y\qG[]ÀpdQ 8VU": u$¼Lz ?ҰEY$2"*ֈ8s}Yy%M`d[-=/mZ#&AEB~NbM0^[VbAQ~)⒢ J-(.(Eb]ۜKKN/aP?ڄGǪvpx GHIґpTդZG_ϡmۉQNWpHP?Q*NR:#n% `(y4v9*Nnv_{@a+N1GH1q&$Ccd)me綟( u辭NCT9ŰZ%AXvQ1Fmۈ#t:6M^.$lwl"2X'Kr8(W%j~|_IN'(NZל5ֆgྷr1+D1 ^Ja0U?4M/DDDT# 8mwTeΠC|RLP5FaިCB DDDDՐ_K:@P{U\XUWY\7Pyi r\)ŊDj q%Wtjr학!kkUP={e$p݊ڶz*֪?PTDDDDDDDDpj@/m#"""|&Ҏ{E̗9$"""""""""0HDDDDDDDDDa4*(lNDDDDDDDDI"%fDDDDDDDDDuGVp$"""""""",SפG"""""""")1;6&"""""""""p""""""""QրczzuUqN<ԩy[:5k`OJ2j#"""""""Cf`gCպp 帮._v&tEz/+8p el޼w-U&5@RRfi-^{oC9K,,t""""""""hUpդ6>>w}#..R+)) a <9{>jΝ(--EϞ=ݖw `˖-+VX ZltmpW`ŊJ2==~;6oތw}|uUCaZi?z!ׯn݊|PӋԇIg <]w4Mj.2/^#G-|nO{E׮](..FΝ7pּT[۷ǠAi&L4N""""""" Ԛ&=zpիN> Պ۷W^a='sѣ6l؀2,] c툋s9:ԩSgi޽֭Ŋҥ [ɽ{5/ՖŋQRRo7p%!U dر9/IRfJRRv\Ydw}>}ڍxg`2кukXr%Ю];\ 2J2%++ uAfff%bܸqС* ASaa!Μ9Çĉ1j(;v EEEv=err2˗/M(8JOwF͡0x`{z;v`Сt=z$ItjVqٲe?e˖_>ݻF@ZZͩ.QF`0`ؾ};%A,}뭷裏b۶mHKKìY4M?Р1 ,@6m㧟~ή]f֭ͯ8r6mڤ:݋߿-& j IDAT1Zŋatڵ҃DDDDDDDD՞P O-%%%,DLzzf#~F& N")9Ǐ7(P @.L 'e H t1MUSUW[M8_""""""""W`S$[pD"""""""Ȣ$fWDE0jH3R=lؤjuGVp$"""""""",SפG"""""""")1;?#,8q\ξ IXDDDQDrb2jqLFSmZa&QգG8uG`Ɍhܨ1QdDDEaQ! بXȂl s'eǃ|}wοyY'Y%>zϜƵ\B$""""%B%pP^]3/8s iP l0JN\?h=vC,<"""""q"IuU%IbF""$YNԱ """""0(DDT3{'bHߙ\ԯ_o{Ӝ 86 k:ܱ뾮ϵF"""""""""(>7DkZb ||gXdƍx聇ɊOMA jZWݮjiCnGl\,DQDBB~6m&ל[˶6\#7g6j+?[rJ2>^1&ʮM=~Co#Fcu1r<#Onnwq m(w;cs1l0Lv: GO5biq@ޚ\{F3h b5&M蚉TgO[lŸQ؝2M]"ϛ3i#Ұb 7 ,tlL4׭ƈF`n;u~SMWg;/y O_D޽tusq/K_^칳>rclǺĤD@JJJdXLDTtHǬٳз__Egff^zH"""""(#-dr.(,,Ԍg5f/CHLL칳QZZm[a3<8,d9,ԩSsd8oۺ ӧM+(xǰ;sNf"Ԯ:t(~a1NzpuaÆc0WcdmƎ;*YDTku]%9,i 7Y!eX I$Y B' DvLڶuOYg9eӞU-›t?QDVVRN<ffMa޼y VM,eHߕ֭Zc}u,q"5;^Q5O*Ya6qsHO@) EEn۔()-T/0LHNJFLt FcHuإHǬٳз___z?V/_(!mjOn7` l3ڹr-܂[zUرcy#UR-@Uf#Q!)> eeEqՊ,t 5 dII4];vEVVvADDDDDI8J5Q &C֬)7(B\EIP\R䔰?%9%Ő "IunRQ",Љ:HRx:Q`*Sk8QD5zVi&DD 90'+لA"""""ZM(\ه$DDDDDD)RbvARe‡'""f3̹搷K.oVT㍌QM!1b)amy 'N@^^9998qlQ{K'@LJDX%+DQMJDDDDD&lRMDTZ4o381\Z9יf+(*.R}%6* ;?#AI>Oˎzg3:*/Q7.oD"""""q(Ռ7&"Z\Ytlެ9`6ߐ6׶ )k:naQ!o^_}>|)I)ռ΃AмYs>{Nr.Sڴj¢€]Ʀک\=7!xn4!D޿n(ؤ͚ʃŅ!-I$I y+p*-+Ebtb63'"""""llRMDTI(%lz%ЬI3(NjeE"6&"ٔ6iD)))/a(H,\""""""M! p 8f@DT EJNTyDD$K΁[/PjI`^;59:6U,V2+jܤ5Ips`ۺ@f G""@  0[jCDT9j"3}ؤy@'2} 6fQmAcj0  ǀ#Qm2`ht` * T)l5V ޏaZpgϜ⅋ӑ;ƛHlht<lЏEDT&2dD%MD``H(Srsa0Ab-C,R&^Oi/NCL65!اQh^P[@ѳ)$M6"&7M6Arj)u5OS$R%4j%LQ0Ң œgF) "Āۯb o qxGo3HDD(i< @OfUXT  06m¦o6#*wy'80hX!bcW^E L] EQcK=wՃN />ﶬ5-1cGݷHHHؿŀ7N~˖,L~r2ڿ^C9gLG{#"Zilt4vmB#@wf#Q TTD0zht:Mj NeY$I()-l^(Sԩ'5khΝR'Q(Eטy) 61j(vMw۾ G8q>^bЧo,p)?=^ 6nțj((6HAGn?Tf'QMSG.++CYY F:1Q1(Bw!Bk]y}o=n4bbbгWOx7^7baQ-k6 V;ta5fE"~smXq4mԹ {wٌOɓ'+111,`""=(ƊFM>QM)1;EADDҡcICXrs~3PR\7 /DDDUc<Ѱ5.Pb upYLDDcfXj v|%8q[~s^{M6Xz-3i|j6:J_DD)6&"iب!y,~1͝d g8z.Yz1_siկw?lݾNDD5peI@AH9p ; "j۾->?z;Ͽ۶6- 6Q1`&Ѐ@1`j::tDD2MrO\iSѣgEgge#9%Yc;۴ιPH(t(Dc2{ FFͯ=g4c1QH4oRKߕ9)LQt|聇ɊOT_uF"""""Nkt`ͩ}w@Q5T+TSٯƚ>ל[P$"""""[ o.ܛU(@# jjʣ=zbq;z ?86GMM]FV oM3??ӟaaQ_/Vc҄I4p֮YqamC+ݹ.77< F=kVjΰ@m`֞>cdU3ITy͛3i#Ұb 7 ,P<ٵm}4pc.y O_D޽tR}0gǟXL6_\l2>^g'"""""t.`_Qu}Y\'F# |MlCIitޣ;7 6.QQQjuۻ7 F7?! -xEEDDA Ǵ4ԯW7(f3^5222pדmٌ!q΋{L666qqq^d *: »DVQ5)ƈ>@tq@qI1/}V+qqXg-ɵֆfBB l}Afgg'"d& KDDTip7a8,*""R,TJǜiSΞ9{5?p^Ef$&&V+L횊fW6Öo`ㆍ;nHޣ;6m؄ۇ܎]jxA#rX>o.wr ǖ2Kv111,,"6mlcs"cAdcNϑ(0UG5D\k:m*z\Ĕ'ב{mn;r,V[p[xsxmk8\ 3,\r.ۗ+`OE~yz)o+?[62"1:,33<;|t<:<ֹRZ`W`mO&TÏ=翍_L!""02Oo#,@@Qm3=P㱞J\^DDTEJ.5e2HTaP${*R-+*.⫀Bx `DDZj6`}\2Pxl ߁J @DI €#Q4œV '訆TԡаI5QmW+!"aZQ' ˲7Պg_.!Y*tvk%"it`+ESPkXr@ڋQd`(=KJj՝C '$_{k'F111޿w?fL@jT?] 6o2ж][<1 EiJWg#[*yMaAXiox/6纵֪Js@ff.QXM-X5R9lry@GuCDDTI5Ȩѣ%Yѓ?9_Yx>qu0v xx9هac~z @z}PLJxD5 zj{:mj}g:SMEn]ysV5_q>zP|K~U :Vw}@a2pyyBDTI5Q- #53eYdB'x,8ժ333qדXBL73/N:;לYDDc0f bA=xs)r?lA;aWTU㑚j֭[}ne ԩ^\򃈈0HNa4&ʓx;Wk~1X8׍7O>0ӿ6߈G:{63v;D5b8mSF왳qѮ};<3V80 ظ~#]ز,ٕ0IhӮm]a괩 j*g#m;['W'whi/LCbbb4v؉WfYѼEs<:QtЁK`tƍI&W|A?ϟDZcܶׯz]v HT o#U>QNl G߁pQ|. Yn8QXY~p4^[{#I u `-i&E#[;E 7b+1XpkedgecЭ{7%/ ˕ջ.Yqqq3o[S쉓&bq̟;\N:-iS1ټXp1z7r3-\TX~-z_ނʌWc㖍5f^:3(,m%@ZZq4mDZc. IDATWخ}:t(7ngMy~}`loV*)mW}͵2^0پ_?a4ia }?>eٗo}'iiO#_3DDTiؤUq sϡS犝{̜9:uBNB>*aMpg߿g[0{铸Uw\xH *)Jkߠ>\&ߠ>SxnwFt?s{УAӡ{xxчuCpvaߞ}hԸR׍ҹ;nL&7r'Mt{ F;`wn4 wČ% #kQELĉk]v!##GWʀ:>(} 9ǀ:lRMDDA]q܋)S`̙9s&{=1sLmSLt:&V mD wusę(~zt #Fƪ 8"::m\}<۴,cwn,`9ygg0r(6g̗g/AchyMKxAY ~>79Kx1kDa\Pާ#E5k8k6sQ߿T t@׀&u\6""U"$fnjF`4Ŭ0sL<:vC¢Eжm[<ܳ0 >ILkpS<tjmnXw%:y ׭`p./--ǥKP^=} "Ġُ!A@=oǴ9a'ˡoD̞;ضef3z>`lNkmИ?AYJQ1nFִyظ~#@#}W:JJJO#0ΩX,طgvQǃBaA!wꚊՊM6O*J~&LŽv@!>HN]:9}ҥ{bOvKn: kVA17nÇcѢE g ҳСC1yd\{-kkrrlLR~*XkOߊT:}S^B [ߓ[࿟-S@ T:BDDDlRMFV5`PP㩩OٯСCر#3(@DADkcHin V`ުᏢHh,Y5! 3sߜumoÔS0rH)QQQnۥvKؑczjWYvᩩOϏN~3@.a20~x65hz~iE'7ct:m*o0g{ヌva)ne':\L{kSgOt:0f,Q@y~@]̖v W_܉8<[ HGmǖ-[gϞ?>иqc]w~ǀͲ22 `a.lI^>7PV~\ _|k]>#ǽ'"ҐPMO~r˶u;81QT\} 4dS򫕸-( Wưa`0qFY9Y^ZxO|8y8$AJQCbбhP!t: ѵSWۇKXϚh0ĄDl۹ ׶]SM6,T%dvS2l3NoZuh4ѣHKKC~pY̜9iiiE!557֭[nMl3p,C''xWqp:js8"`ۖ-HJNJ`e\fvJa:oEywE}qj0Rtz.~oP^L=,5[`#)t}::fl0h^VK2`mۢqOhҤ u놜g#TeaP\~3q!]t$"\lRMF,*[Ö(+U?{ge>gT\Q\p)GCMt4sI-,29ѩLR;JT`vUM+1\ƴ\IAa_f~ 53}w5PH$ꨐۨR:6J%G։ٶl=z`faZvXM+S;IN-~[AP12+Jk][򷆺Tj+S=[ӑH$MYZ"s-k.6D"FTW% =եC%Zlڴ (Poߎd"00r\Ɗ͚52KMyk-|czh7\r]TreQ BRQemTpRԑH$uXpHNH$I##12t[Dz}0ӧOj2q!w P~&NٴiGf׮]QNUdc΄S2][bƧtEYPG"Ȣ1Ie2\\\<-H$ɟC`\FU )JFCll,/2&\[,mh4R%e|uEBn̥zTrmc]Fr9~/B8/ H$)yYW5; W6%qiHJ5o/_OOJJJ u%qfFYT #!!>}Cqq1eeezRRRHNNj.ec-kD8e8adtZĞ2YPG"+$߿ۺҾ}{<@VqSmɍnGᢨl6,Υ PT\$;[SRi9תn_9:\JJ9s ~~ÒH+1NBc VH7aaat֍Q0L?x_HNN-ia%$З+GUT?Fl͕#Z?g2}>@uIng8֘^]r0p qȂ:pMp4W^Ux;#Gdl޲YF:Jn8FIY ^w|y s9tP>|||hӪ$. bs$CXX׏'/WF-L& *ߗQM5@8Q3-8ԸxjKuv4**KSL R!-B:~qjr\.#!܍/ײ+ETzAudqü1*eA ISL5jL?3@P46 Gyy9 Am۱lK(it &;A"\(me )u[uy(JYn&1W_}EJJ Jt}Y9ncBF0a`o̡AE`xȿ&?CDԯl Ӂ k EDepӹ5)8x ̽JF'z Rq pc?wշȂ:ɟIL1cv',Ɍ5VvD"H+)9aaapN n:ȴiNǺujV+&#)kQ:s*_ј@`\A>a`A-A] /pfPDvc{x2x;,QHV+@0LV0\JY2<^~E:`? #LW.BJEՐ|S>@/IY0*~+-XaBxQ VARug!Ȓ/> E :4bpM{ x,; DEe]dx 4rf]7 =.-ך7疠 'On:z=JV+AAAWWKt:C}CXczD/S!uPANy3 :OKj{ #!ji _LG/y5} 9]1Xc("Y +B6sArrJ΂9K2`x ]FAB*ntlZ#BkRE^l6wڶA\ۂ7RUTtHb25M8#d[! `'lz twewӈ䧣,vי!Bz[cLN- b!e*XWJU8M1Q"4=)**"ۜMѪE+ k .pP(dI$IS!9Bۚym:o\aT*5kd׮],Xaa$''d"**? xIOO)Ս8ūl@{4 0]~TӛMwթA<1 js…b,nwl-dS՗k6Е5(S$DoYT*oHS`+`pQJh 3ĜZVbэ+ hH?<\ر 1_*G+F';:l0,}U>mK%h4dv=:uZĨ;y m?NHNJ՗P) b)e44D1bVP}'ltƒfSTv"zд@[tz 1m yt`C/T um?ʩC+yo{h1ګJэong̘'8!"kɴq[CHC7UqTinT,Gr6h){_~%u8ZV֮]Kdd$WNu^ڵk>}:˗/*ػwo.^(OIa(*.L4W7RJ$IUtk:*I{xOя@ d(JRRRP*zyH 8F=W3i4.m)d FC|T^(*5k)̩3 j /؏;#G~j,; m="ANB,$2 ie#@DDPܘ=2|Z* IDATB1!AD6.=b0XNI@d9s6(~؂u--`L`u`É\TASW 8h!xn ap$ >z%&sCԟO<*\_8Lmi`BzdR&1V[Nq"pK…P<<<rs`0_}j|Eyvo qZxu^d„ h,h EHM|S*䌳`yy)N 8/{{Vw+NJ%SNk}{X|9SL7geeɳCRv l6)~/ WD(|?SX^_Y;ѫZ999:uדBNN$&&b2شiJd}]e?AN\l\w:?G tRrLȌ\BNK}B<fP4gz}>UTD6Slpx'= سbƢըk󠨨-wNcBq)"-+׫hX0Xq1iGU VE߾HLhN]lAc`~Oq @TRJ/h=A{ N7г@_}D`)Z s\<܋ڷʒ%_sp ts܃oͽ#9a+蓫qSAbb" ̧GK5N '1SՊű fb?*(G ;De*:J.Jr7FgX?E" S%kaaaI56Hxyj)+/~EEW`Ν :UVѢvڵL2NϞ=Yd vU{ʻo>"##9|0-ZW^a̙...bɵbۥ0'H$ -,54z|X|<9vO=j5kƹs(..???>3phQm]k=_kY6I,l[UTg~THz|/d ~@/D_mtGzS(rTDEw1,6Xƒ|;I~xA،ZJwQl6s1Ν+`ԭbBguHE۝Ӧ2RۇFCLbt=9CTN@tt/p9.(xwA2  k ڄ2iS8&csCi֋Lv%Lxj ^kOT`lwpK7xlԞӎl &Mo㉋@rAi߻}a Q`986ss"UZWUB0iXr:$78M1zԨQ,<6jrV30ydoxgc1)SxyGYv-fĉ/3n8V\O?̙3dJ$K!D"H$?",ot%:߃n:FSʪUq4kJ``5,_7ܹgϚHO%%_aqQHw']&Ub.4.DӋ"9 T խL$ ګ `ewR0B qEHk1=f=|EujU1`3%]R^3ytKB6jmA6)[)M>&Lj(df(n p~o'8 ΝlۖGXX04?5Y{v4S̜aD08}܏&g̓dÏj̅b brp>DONז`(RR*ݎ-zt)z1b8JEEZ, 4UK<JN|,zkIBG]!A@^!J[a)x&W=F|e-{+l3DqC!yys+ GMq2bTטHUu4LyISIT(\vÝ>^/"zՕ&LoY9=>>~www&LO>Y9mذalذΝ;3vjpر3f ""^J$WŽp'H$ ~mۥޭ?Vk3ZBnL^ZNrr;vSP , mۖ`d39iCU|.Bx},Emo`DD̥؝+RZCrxiTh4*3Xwg 磊*ƎpD!Rk3 ׍sˆvT 譂p!ʯAGrT,-FQM !>,t˨~2{DG/̕g] oQҩrTs"t r͏l[|D9_<tAf~tZ0gN[wa /i#-;#Xw/Pǽ<2k"f-kU 0WC){h_T@ Lt4BPh;%@I y$$\Ds{[N +S0/ObbJ 7{(]*Յc "1 Xif,L,wz|/[!DZ 慨/]*6p߳Nx!8 E|?! hx=J!ƒEmI!v;O+R֘fXO46I8<XgVHxwUhtJ.]_b{/Ǐݝ;vЯ_߽-/^СC zk+17ؽ[j zU߷lœ0|p޶)9%AO"H$?ݺu#((^~+V0*Y_`&s}nBO%8't+\R҉~*{LKk^'VhxBb ,% *Q<om|xA̝ITTՀ{Rl*S cS? +޻#8:! XlNrl,$"Wov'* n0ŗ-ʗcDD '*ږcveܙiy饗10I So! ʉ !r=TFvnߎ"-MΈ39X[ː!Op͓h\UF_'=DNF!4 2liI؊xyuol")6rX ?3֋<$7qݾm%|K wu};AiHLb)Fc]qK8CKFR8>15NՅT V>'&qΒG6pˏٟpE &vI0v+J䴜D$s:u1*Pg3b!U"Q{mfE4`8G1.1(4Ŕ)\Kx9z(>>>ץ#7ojߟ|7o^9- ;vPTT˹뮻8k?]xƍCCK/ѳg:罖ɕ}^R*gh"7|M VԐQ2Q"H$MR}GXX˖ \ѣT*1Hz7(N2ʒ=/z*َ`(=Nkk "#*z3 DoUAx11U {9p=mo0C08»oghb4ZѪ?0PJp fOMDGЫW/[M\aH=tBV3vg7υB[%,Gy ÍKE=+V,h,L8[vX1nնF[p Ud+Ҟ\c#u8sZϹD+?ˮnPH]G?Vsv܇V{Klfު΄Y(a`Fӎ'XK+Mw8Qs9DFmqx2O9T"e1`,E">z$SaQ0#`6VtX܀l;w瞫^PpE~DrҬSÌg0W2FѠ$H$ɍjh4j<#%INNŋ/ZaMM=99t+/_^h̍Sph`.Eg0]!qriod1%p!,t:7T}yNρj!qAțb~(_u Ht,R06; s+̒/\q`]IGfƹ]  qI, Vb!|*X+4z ٨71z nT!vj'!6[k@[>]PuvEvAdR%%G| yQd-Xەuga_~G4<рնĻ>pn3;e3u:ti33 tnN}'i|;QJi-3ÇOE;,rB-<<ˮ_αh;ͷ-\x 4NJ:%%ep) }~ |oȱ@x>p*u p`)1) iX3~lHv.'~<@?RB H!XHc1^)1Ɵ,%h?_󈎎fʔ)< 6˗WN[l<(j֥uwwgs=}'L6K.1o޼j7STTm%kqoZpe)ܰl57ŋQ+{p,=B{| 6ns>[t aՆ7nw,Z<#G6J$!P[z`ݺu$$$`Z;v,gϞW_EPi&Hhݺ5wq˗/ݻP( ڴiCll,ViHa,cW\2 o,hxAqx1ȡ]xEm<,;mܬOlLz66R3wtRTCh>Ǎ)R!! qY"z2͵sb 켂 ?_(v&>aQJw<  "# at0p< .Bӹ?$$Dт`̶T& Z/z \pU9y=Î$0d΋U5\ l P|\y]9U^}omE^S1foeBҌF>2idAz jAӣ9+fo9Ҍ}x*[2@ gDј],T4Վj96eumxzСC0={v!0vo0(whWY ,YE8$έ8+O` !J \fK P\?&8mX X;cKAD:6KJF=_Dw|' ]`pAC;>(Ɗ/M y-4I8n޼V-MxU{zjժ۷ouڭZx]ɓq;mgYS?&[swtUA| TѧFFBj<pY/sAR;D !S-]gr-- J%֤0u|5)t[yx 4B%EYpx q*$5=*~H%4єZH$&fDЪD===t,ulog0|p{=-Wm{\bٮ8_X0oNrF1r0t:usYD"\8v7nfBXn999t:^yՕP?NHHH##,]f臑欢-O2 JEAvRYpqaˈmΝ93b`b'&f;s,*Ъ;.B`ށވ(@a-dž1^^P>bXqI@C0Ǻ0W#;zvDF@T.^VV{$8N\ h"ǔz>Э aPK]g5 f4P~vBr*Ƀ7V~W;:xSJѡ=:ٮIJJ"))%s&L ?s`% nIZJf~o?O|ŭeh F|c8޶T1[`QxQH8Eo#}0ivaTڗ"\I4%pó8ڝx`6/\Ný}`aI\6 m3ZC6p:~6&C@ CUŋѯsĻSF\^Z̀l+`)G 4u:Tc$7>W5߫}scǟ~L=**:Q'H$ISk׮̚5 6nʕ+)/D!}w ϝ [Ec:p0Ɖz%// =C_yܺu5H 4G`pd{fp4V=A? Z'n\ڱ3>S;"R$/zD"irwcŲ ƅ x^]eߟ-۶vQ$fڛqg vbֻ g?J!L7sp H-*,!RY={ie.cͫ *_m0ܮ/tH\te2:2cA %0Hmapc]g~bŇVn~ڻacHlc, Tl|^ψQK7-/ֲ~}C}dpO -ˀ4۽[^vOC ҹ;D}nfEIckx+ϢRy`0Xp\5btYJ) n^i5܂///9mna  taPxb[JՌTUyCo|Ndے o#+:uV.]#+0FKb6(}-haCv㆓\2ȕXz9R)G3i[),l3@3P[ Lbo Ḣyniبr!Π:}پP@OpJ8niC׵ T3 : 8z> }vBr #RRцG[QV囕k[X{B[Ws/ r?^ٶsO}Oa Qm_?(""""`sJ o)<'''0͸RZZʺu0`/m8ݼɵk0L ċSyQ%bn6*ΔӦb!nZoZ8n$hC lcTOy jiU _@=¬"7R]2C%4BB5F`xd3@Z4PſzA;0IzpeiDZ'ЧSՠR X} p52i&СK.[cfXPOHAv 䗁_)XGfϤ4' xЌ,o 7n !8 PtZ!7C@p@+iWPm)ǐz9Dhjx D}bӵ]GT-@$[ѝvcҵ ɉOIsy$Kag,]jp7oؙ`^s-YjZ3N@*Wp j Cg`V?557r&ZA%G2gG#,֭Bt7Jx!@UyQ8O]C 3!Tpdzr' """"QE䷣U*ٟ@۶mpfݻS^^Nii)W\\Օ ?ם;q tٳGȯ   j$VȫG ZASqC%%7ob8],ޯ7^^xW`)p xx۪ u۟M@O i7!%T3a<; VBZOV =B o@m-D+ rO%Ǎb8V* \ 7By4%MpDw*yav0eՁ /$x|-8 q΄(Ohpy{pv:gAܬS0~OwTѭnG:"O`1})izܓOFB4P^ OtIs¥`o\(q(jd|.Ԫb jғ5O 8{U6na4AC5D4BF܀(ځ b_1ZDD?bK "NA׮]yg())alْUVի#88@ݸA]S3fPg:qQ\\̕+W1"kM"K,B(E8&k6Tf򾲲=JF1êaZ̅3w tV"Q|tv` Κ^p3LozGF#mJohAz2V$~VhP BނฦPUU{K R-T6Cl&~}zn|JhN/F Dd=TW;56ovT;ĹN1BY{};%A$ n*2B̻Z:Z-vіj lଆ/Fʼn\ky-j F{ZUA|_U60-R=:X|.[B"ÀT-]ż8FF83g+:XS\=j$#"0.k Z*PK=U*XF};ۘz$:q)OLVHOQnxԦ a倛JSOI-6G$57tmP]UU𭁖zCAz/T4XGjM{8:cA": OZ==>[ږf BO -$ x_ˆ"cEkBIA@ʏn_Z0 _mtV;~8n8|}T!/^d[ҽ{_ŸNcժU̝;m۶nKER5\]\DaRj"""1CeW̙32x`Ν;ǁؼy3xzzB@Ӿ}{\]]'00Jj5$&&>% >mؾi_yBP`fOnO{G>p`W~@H:}ÉVUa}cD&8 T~`-42G9pi-塇[bMǣO,C]{6iTV ע1Uj] H9DwZ9 G pۻPaqإ.`Pߤ BLִW@a=CX@qN@g@iVn杰])cIqp7s*пTjpDIk IRuV(`ٹ#N xH8 \,;zv05ܒº! IǣgqBZ;R}')MWdsQj p-vYW6|'@ `؝:_ +0rVx+oC+WwP!??c_F Q=2rAWP~ v nF1p6W0TQK!9 zpt (z$Aud^J!:1~t8~Tq?J(6>!ݻuVf͚ڵkO1ŋ ̝; q<bT'5A#/jRXT2L]h:WWW\]]3gFDT*lܸId[QFѡC^~e~W? &AM> j~,`аe'Fs:b9@fk |A~z'i ]jjXWZG]J >a6VC]U7M KE\> 9e#znÎce}W֜7Z(C,bHunU«p򂍓\mJfO[koW÷'Jac2x߹U[G:a'UP/&K1aҶze} =,O]  7j@P{ϲQJH !A~#y( \Z=/ULY9@ Ah{p WR5n5_ Ä9 9P(⡫;H f;!C@EPV9J|F$Oo{t(2Wamfusb@U3Sz %nJH #;{Bi`l}oZUՐC/eZpgM%&ψ) T?wڵkOQ~?bggwO.K.1{lb$RaHX2Rȝ ,X!B՟h3.PR(e\Qz'MSB"`|pg,PһR%|A,:n-@UꦘT'D@K;z d jeV[Fu:z_4Km?B8m-"`xR^CLXj4$&- ,˅45 ei-Ga-I h^Յk/>ѨzՕfoQ\RSXQ{C*h !@q]8I@ekKF""ڟ IDATW p7JHZr2A&SH6sL֊[2<Ƴo,"\MlX7ݷ#_lKA#fb ɹ0=4Oˡ izk{a "}g6~3sP ZZ 2ƞ5f 5ABp uPN4 CJH4*?~N" "g Wm6lذG}y.]ʰaزe /O#@^^=z'xF᧟ 2a&MĜ9se ^ʤ898yRHR28"""""zvʌ3"11۷3k,eٲeѵkWrrrP(\~JEQQz~%K?e$m[ 3M"YDT$r&( a%?zeuByz% 6_,B"3,Mx:)ah;FVA] `Ĝ|0X%aOaReKپ0&&U[l+:#-O>af#6lيUs\Rd蠄1~)vEcp.]z9êh9Hq(J.9٘9iW>JPZ]YɅzVYGV CL4ZGШ(0a=́y@0TO$؄O_=IqK P,5\-MxMag5D݀ kan`W#ܩ ژaAR(ǁP{&<<}lMDB [tOAd ,B#r)\e'\f! *UёTW ֳ{X]-M{wf^Zy0i#u;Ŏ:͔(89PG:* ֓蕭0'Vq;&>I,-yV(&h aU{!ֳYj69kM}uxaA԰[1_Z ͛7cggٱcaaa\z}/SNёuQYYܹsT{g0bf:@{ߚAt1Z3a6ײ`ACF krh=kA#F/0[zoHGrqݏ6DDDDDDDD4IFs&LٴieeeTUUqL&XC\.'++^zy&7oޤqB q%+UJ-`4SH餔}.<={Ȓ8ʁlq?ʠ̲ܽ^>i9]x*"-FWʼy&:ôNZqs#eZ֞Ws&#ٛBkT'F%(:n&ko=Ձ^o? 9T:BF c^:Z3ڞ1x<{#0dKò᰼SDg_.`/ LGAk7 ]B">z̓C[x˙{L5X7hK .鳭莞ϒS /Y6.U ԶL͜%u|G<;1ƾ^U.f̄hM.<27[ P8Lj D#f6*D-h(޸{.03,e3q3)wmsQ{լ3JA#,zǁG gSLs 92oC1 b!Æi ޝ=AApX۶ǓV&b>z v%:)7@i8G+ gO}95EN|K! <WOJF*%ijZEROMK )d߀;*pF&$>͇/ SO-yO>Y+UP{; eEF+}R?9B[ ­D]+ZSi?i^t c7 [TMo_"Կ~%n"p/_^ׯg… eؾkz)É,[}FLL R? QkB ,, R;YYY;v WWW^x Fĉ9p׮]cҤIlٲE rv0oG N|$_q=muLC|x}R8}qtFpE>!D e<8Ji6wq=F,A:ud ًyZ;|$RjI)~>P %8U  3k{WT-Echh `W %4jB(΃|hmU7rxn)%Dp &jQT9~x*KwzQh=t:I#mBqV@dspuBJhy'#':uI>V*n)8^¼u\LLũ\Mrre"&XRaHow\ oi ʘ L'q2Bgplt9Ӯ @32?|Yn< l!""""""""߇NC"vZ"""j3p@VZb!33:uVl6 FC@@{ //OSz|>$Ҍ\fe<; hÔ &@.n].f)9סTVjDAHʍ[Ia- >ր],m!輩KRk#*sGo6!d Bmu t4||Αw^//JݸCk"tpiK23pQW'?WkC;;ČC}Ξqh,0U(⥇ȶ|-=3#mSA1W pj|!5DuMxFh5Ck; 0T&Ap}AvTjxe8@ |2l^vgxTVq6IObZ6p'sUPP!(ob]>}M 츚$]͞ tEpVH=Puj|4ʿ-wns2/΅wp[x(*"Z8S9v' ̳(u l! K.Mkpm9WuA`+?5EDL\<l޼}ЫW? iii 2k׮ŋw̞=O>___:u;=z4 @&aoo/oEcBV7=Ѓo|ǔdNFT SC*F\@ڜpƦ|N&r"p Ruvf u*U -+ğ_XH4!E<8 +z-k?A!mV(28W0` S+Ma[?-%G+8 pT]@ѓp<-aeHڎ1}atF5K$!7ƸA.2_[@ɀ-TLvVd!ZNX]6 "S``àsݏIF"qv/v8*l21쬡Oi>=hJ` =kҿu}S4K'^O:;wa(" GT[ȟ$8JĈڵk1cw!&&7!m())aÆ ̓HwHbb"2<6mNn4oޜ^yƌ7iiiDG.IJ ㌹B-$'@byO>Ǔ}`r>W ҡS jCRfLӘBb`l>}V7bVd3@:ee#[W54kHhLBF=t@s)̵D+2r4C+]#| 4FC<$06`)cF^H[++Pry|ܓ@Fez<;Cer2*r Pez' nN YOnDNY`=d:A?H&4e8O{|z ר>]c9&ɕ\a%$n@Mx^Ĥq^0e0(lg̠Af0n(m 7|ˌ00I*U]}5̯%RF r˵qž#6 7VxT 2 0 N“D;bíMs9?|@J7r {h@~4\+BR*60DX+Όx=sN4RM#~F  'A{/uPZzI"Z3kvbHȓO>ɓO>!""""""""!22qơx&LՊaf˗3;&)(( ##ՊfcΜ9lݺ q"3<{Gۑ=Ƀ];qst{Uw&3dL&N BRbErr]TD^DZB BH&I&^;GE={.yxY{^{= o1$)b|P 6k{.?4N~8:vu?^!Ӛ׌|B^@W / ho$fXܢ d0'v8 'I_TW;` CD(AEMc t<&hSE ^NgлBm8ߤv| Bθ|wv}!("+t&%nQ,F0i-.,A=`gwBСcq)/[!p2>fT34ً7Һl W0[&X!R/|qCma;*#Pbf:CaAX pJ~;\𮁋YkVKZE/U?be评`[ 謜*c-g*z6JaE=H]`6E\ETq.6t A sGo)b5)"""""""""""JE\\2Dd2t:1<;P~yE穫+& R\.GT+N 06;^N |\le Xok`P!DB׈L/!=݆9MJjTF{9px j삑,0'O?AKΔscnc 1:qyN;&epC """"""r^ĩ?RTTĚ5kaꫯRZZ''Rػ7x7fY؂%@##xZWpfΜ /@qq8׉ܥ8X{'$8V6$̭mx2d|vp|jX˔^z<-! @H_9 3]aX/h_Aګps=4~[+qka[*G(_j-'8-&# V7[P *a-Q[NiN[>ft%fCZlp=~-pK+/lhHq5'?Gu.CnĻ"+'`tи9K̡~b Db޵0 30s,>Cߎo IEE ^dJ/^ޒAA% f0٠Jj@ 3wIFNBj;7BʠM3l]B\Tl'`GZPʢFE±.&^C ,T@pt Dq='ka LӉxrMu%{[(."?CLn/]EDDDDDDD~?t:өA"лwoZt SP-m4:f̘1fT*t:qRL$Rt<&,XX壙8dz/E]yq(j}tt/cuѬ;f*= ÐWgánHqeOJ??%}x:H̫aQPk]g1o}vۈ֯怶R50ٹv ۵'#giU8]䤸ۈV|+EB!Nl\AR3qm聫~%4h b%p JRvdOndjaqP¶H`%?, _ {; <5`)7vOk5j0zGÅG7…: dwX~i; 2, @3/$=͍W2@+gK cr t^W K)ۺx HbMc&.*`ȜHY H7 =45U` Kna*>>A"hR?hKcgZ v 7xm'kV1❕tGonfCapw8.vQz$%zx#ޮ})q+#U?ɺ! 1χn'ADDDDDDw?n]!v;NNN;vxl2ԩXb /p&::;ٳ'TWWb$h* 3M$nm`3ST~d#=<;=/8d{4L7$nO^ i00 L* ;RTSh_3$oz} }GBO3u: !C*|&6MbQlTw@z;\i!5 gc"{, ֐uj`O߹qqa:)v%6,Ӕ\+{BP OWxb; ھЫ\a >{G$̟/h*[ RGCzyǪh;B+T )vܦI%> \$FE&(a]裀AQ-01*!cG{Lv`.EV^< s:IT0<zgHTQ#S8CavF~g7{xAh+`sLC{ pfv\8:&}Ot Dx&H8P_.3%M4ŮRJ3jd9cR _UBSC3@PoQ]ZnخH dEz3= @H^#'8Y-z'_(llzj ̗ uca}U65;`Lx,B )120*: +4Ds75V:5:(Ki2@l s!h~ha6B?Ú/|;ED~)ڔjLNJ‚pV8ӥŗ⤫+A!""""""":9FG | 3n8V+555dyJ% AqYJJJXt)xyyuV1ۅ_Tׁ=DK#%jHhԫ<}F[&ȴb7`AT;H;MxW>A:\UC}cs%SqYF0 Z<`lFAoB+B $'6 u@''AhC.#<'yǯZMSÁ\H.8=9̕0\`x z@মfƓ.yۈ(;GP%xd`P40ڠ|hp}-}>Gċev=!D]pZ!@ Q>p0 ~ J7tt^%-G^Ip) 0wu9fFB0!>|QW;{ԯoLPJޔN3w>{8P[P5ʺ2U_q5ߜ_ zSjY^AI0b_NKRRDwVvڍjA!W;7ɉ^cʸ)lٳE!"""""""";~x{{cXcYR3<7O/{///ƎKmm-Ϗ|X>Xp0.ϠՕPzJ0eŘQdGh:BK5g݂xs)sՓ Z:OtepӲW<@_o(86Us'./%ìVw8gb&/އ(w؇h$.ЫAƧ^`.7H,zL)t*z=:7ݛyVΌf0ր󡏛0{`V(вs3 XqWF5(Z29 턮cro+Ĵ>,D 0 Na@xԜ+`hz~El0 #cVxGYJt Z8w28ϯ*r.@>nh1 n #%%0&BeHyB4 ç0eCzHc$hɂ^xu[,x C|ya8Zh%HqQ=Sy*:!-rUMA D~0C+KIӫ!Wc" \p!|/t?~B <4%`9Al,bt]##chP(g3ZJFE:q*/Wc̤Ildddb @HH%%%qt`xqx J%999QXX(ב&)Md^B[:c嘁%O:Qiu´Qvav}ah3ǮBpE[ ǚ}R}M+x:h9 w}C`c #{|f[Xӛݝ\u 8.DHta:%a Ց{Fؿs< a耵 1.0 GFA̗Rp՘h܂Im4-`Y=\jMm AIl%kVY/ 6ja.j x+L 3 YnJWz 6 s8: Ag ѽm̘Y‹yz j%Od ;k1mps@EޔT8{(xA_nwu wJȲ@NA4!҄uK.9^,@;P#8 /;yx1mXawYaA g;Hɳ"ܞO|, 2<د\!6a r-BJu%{['."SNp29ݎZ+0 8+?&6lf lv?4"lV+vT"II*H!"""""o$..sp8cĈLfN_>O`` FQ?k a!0=|>KCʖzzW;e-v0tCsݲ f[i9 qzl7U(f2o-mC>R߽ wp~ IosPDYN9A(ٽH?% :5?.@0G 2lis-68`BB)xn/I GHy>0P^-41Й6Tpc8<0Ay+7Vs*tM, qo2>3}aY p_\0MS> 0NM4g 1Fh|AlJ?C)0<z{? !&+72Hro窽;LuJ 7-/ )v%yE,zILF$Šr:y`h-^bfX ;taĤ@B'9 sgB0xΕ߶)' 8LIEU>|FxB'Ih&;MA Leh#{G#n*+ߛRt]:r={RRVrͱI8{(ʫlSI=g灝B5RSWCxX8Si&@@T8+g  )nuO" :v FGG 899]s44r.R''~?Ã$IOO'--hV^MHH~~~L&˗;'|ªUt8{;B>>V bNRX%+Bv<BzP@m8 %k,v4\v¶sOB@.Gyj<`B`GKV3m0\=%ב{r.H/ JIzH$ɀG ;RVe']U~Y=8ja3P⋗I0x`ؽX83_j$&y8d;R5Lxsnr 4_PԀb]"UD \lU q)\N9Pg1+ֶp$A~`NFpK}Uz@P=, f;g<9n;A/FKE `&g]A`A*<'CEew_xN#tI)he`C|ߍ=y`v ? ^x1Bbn߁FAєnX'CQ;0 .al%.&@qcUa+^IۡL%oo|?FHqwS8`+pO"wNp2S?w9y.Cިgݿٶk?Z5~iͥKi_䏇fgI%00u 9y9(\DQDDDDD߄b"|.Z޽{T*QT۷UV1ef͚ŠA8uo7߈y#u!r #+ %\C*jFx^nt/X) 307UY&hBF} oP,Me*D j/nJw@rm"u]xL~1QwyuZU à %v(xnv(0% Uvw !?G4I &e6}i4< `'a#Sy\zq0(tTb.ZŒDLq̎t"^1Av`p80PV6X ZX`QGd r zCڽ"d`YR(脼Y\8mp\⚁T_%Lp^C3<x 06]!; h/,g'YV>q^Dv NpnB>Aܨ߅/LJ}CH;m(%>i%b+˾7d,oy orh (\.,u(U "(b؍%F&XL4-bMbh${QXh ( R.,,l1ygw^wB]|q Xjct0^+8?SyJbEP$bqy=I_lh\\tqqrA`D'""""""*-[yfͩoDVVÇĉ1qD .FZlmmx"=I {t2pܑey#qXFƙCZ+(VOգ-{DJ8O^G#fܔ)i<^2$|eNɱ𚅐?p#n.p!\ow>l=8X+acX9`W|=|x[bJ yQ77`^ ay:CPKCT4\ <+3Ux˛ xi! |?"+Cd LA>3Pt<6`Y[U b็k u[*X8<G7C&t+qO2AR Z>XM[s 1pN !m#}=>Z]:^Q P9rd a}9o#~ZSfB 1.@IG bȟ>VM&$\0H$bUs'Ei(x 8}4ݻwgҤITUUyfؾ};^^^\rҒ#w?w"g?p콠;6_pDI|\pJ0W,[#e*_FQ2"sWPjě*"d$umq0k燃I|UAZHtAQBEZ-M@[2&5`찗ĕo{ \6W3 d=,a}Dp p8I1–D7u_qj/if_A+Q}LΘC5hva-.m KL 8V9 t-L\?*v5߷ w8 >/8rhL `3j-3_#grjiZ`Q#%_n<8ߜR阝+3\sG+\@e *PPr!Tp6}<0(ҎOX x 6³0-UAL9Xhگ^J+^Uqb?kȼJ#Ga(\S`rNt f@ P-><E0V–FrܯW^:871`0g9Et7#Đ꧐Ŏ`z?} ''1ELGR!88{{{Μ9C``  ,YBll,rwrS,`n;19v ;G8r('BtLJjfL:og!n@*t=#h9+GՒZFIa%X lBԤ*c zzkcfRC3G:n+Rw`+ ZQ;qhJpDK$0 no 9!ļ\ /ZAu [ߥњTE9Wk]"1d >P`:{(K5[=~h-PIa ؂WO(4(;ɾ|I|d)PzEZ PX=cs+gFO9>JӬC_,&Ӯ']-w/xA|& m@q*t ڦ0F}9UxGX(l$?B8^N(mƓM]8,50u ,7aИ k`B JA0o x7A8X20\$AGsPHah{[!]wOOdfs_>щ3QpHLMگ޼Jthq0wzE\t ٳ'deeѭ[7a;Nګ{|{2)wxA @f ZG0'L綿3_%x-5B ):hmOs1!~]l4EDbHDdX$abGe0a QDDDDDg <{{{Y`6m0j(ZlF`0piLN妉L_l>C[`M1ꟷw(m7h>xi-9E_/'|]q|gU ͛ /[cWa5rP4%/<҂tqYdoK2RYO0pm n:w5ViHS6dTQO!:u V ! l{efywt/"{\Rг+4jF %t{EF?7҄l-x)ӏ5sr*?PAiq=' +gNSzGɷi8͠X:rY]çPu}2諬 r nQo (;&{&`lCw/4W` FS8()BEmo)|n}j؋N.u9i3S#`  AG !_Bd'$*R3!e_3x jFx8 ^~3al>E`}yeU(ĥ`L  TF1Mv%|ؿ)9jR<n,/g<#oà 7VRi9tV!I0$j-PW.)]Z8vr c/)qm֔e-qjM93.DQ'<)?NYxj@UWa6Zu =Hк%f v) F`-XUpj/;/$,S`l(KSQF-P}8xY9 r},n VB5/p~:º7+3a7t.f|#Pͼƹ1݁ 94 Pww[Ҷf8J?G?}[f4qᢂRniL\s=| S[nFQy\D*bHmQkZ͢;w[^z'OҸqc̈d׮]h4Μ9CBBz"##1LKj1#]38%vmt?*M&%B|PX+j}V> ѱCh:ߵx|6^7׃*ʞj LL,<ى7KÑ(qk$! XU?v>| ϑ=@I[+$\{4f5`v{4?B1<[n:IhB8]  ro8 ߨռ9Px=N -?!W_Pu%p@|I"N@HC{E nh"Pd5@<oPkek2?ʃO{\QJxn=Iksj{5ax'g X؎ZS|"8%< 9}8:5K6|ܗPhEx:T1璣%vSTs*V0D;p: C =ȝjE7~+l <\ ݆ρ& ܭL젵57zK&p2@GеlW0fjQAe wMTgé Ȱ0ghx]NS`^nT=eߡ̱Aai?لyoɻlzSg06`r`ÛʣE|tc)ΰɴv7%F w+$>oT9Xf4av%u;6*>?@c 4I9,~a#,ahұKLp!  t iGP aF6^o1ېi [1)04I˪ٱ mX]tfeB% p9C,("?:Ϝ>Úk޽;[4;NDDDDD ˋ(r9qqqQRRJBVSSSCnn.3i$PT$&&y_U*SB6p!}ҦᛯES) v͋`XW =ҖQaT81/fe,5Ja|touhX]HC_%,i?t*lI'p~ T ^_AZ7]ǵRґ.ѷXTGt3lk$w$~Díe+[{a~}EPT?#8cZnJXBm)R4h+s\T  'r!L :^`nuP4>x% a˥# 8`=`_rɭG4)nHW^"(T~OOO,-- b ɘo1M]k>~?/"""""ICػw/!!!((..@***ؼy3˖-ԩSSRRqHh\TJ;?p^h zȓkps:rrY{"}={:u=Ga5t)z'oZcA!QU?\O!kE2E]q>ϐu}1}7ˠ%V3č' gص9Zo00!<` R%$OORM[~#L5'~ԁ#r# ض,&ǹ%H6ucWpy@=tP܁w7| xfØnyIy0Q287p1@NAARR>iaMwQtؚcnÚc5CJ)#InÈx r% &^Geƪ:I NDAf0 ]IQ/xXC㚙x=R˲0f`C}>$g.I5΀,%Hq#hc iE0SrsX-kqO[sYԜc"3 б"0ӡRDZ­"/ijieܺ!} f~y%9gWEի9߽{7s0amڴ!==\RdѢE̙3ŋwc!gp83i޼cCDDDDDDCRGll,}زeؽm۶K/aiiF!##oI֭ihhfR:;leZF?_ʂ:5p#-uF}Lkape79-vQʼn/7w)&I֤Ufv-ܛ6pぐpҖ3v&V2z JQup~R\\m/\Y_˅x-SR ~R6KE.m8 ӂIT+O(̇2Z6?lCm8:cvRp M>دB :6e߁=P }8RNNy%91{c߈ 3R-?SÊ6v<%|Ào\B-\|%5hO~;AKpG.U[~As/Ș _qf&Wذ 4va00f։M{PЫN OeƪU 'Mp4r܍?q6,鏵$ """"""6AAAxyykTDDDBYY5552d|MzEuu5eeexOLԩ\?<^o˒ˠ*8*(BAOc|pHXK<4{>|f~I~c8sw}Wa2 r{֠- uZQK{Gm؟ r8kOu:o4F+2Ȇ,  c\;tB#{c`\.Cs.[VpdJQNDbD`HOqT $%ԯS' A ^ 5A5ݤx_6r<Αiu هy1[-9xM O+th>`~ԙ.}`LC'к ՞j sUBXo#ĭٳj^yӒْLdHBִIA"r".ޞ߇/Ӗ \:^K:5~f< x9>; *bC\<[#qꁑ@J%"3%ӳz+l|=N XH1PVeq\wjsXqb]1)O`T,mDU/ K?'9>Ԉ\ot./L{2avy:瓟¡ӬIķE?8}t Fmm-ƍc鏬!==#Ff;_5;vחɓ'sARRRfر̜9j,X)SYFNNׯ?ƍdee/_̃9r$3gsXl 6ٳg?ɉ˗/I:k1 lXW]n?q""""""",r'7pEls=ٵk?;wDV# СCՋ֭[# 㞯/uubg<2d=G-D t(>è? /ѣ;w. 2NiӆwgYnQQQرm:t(VVV=GK?>rs-&Oݯ{޼yX[[3j(?ta7o9 Ï2dƝ%33W=w("""""̰a?~VYBC3mtBK dyZxJO)Wae Vˤfg2ijZgڴdFɧn:% J Z`rcP| ;j9-رk?-Reg)=4`l  NשCЮTflMP,a5pnU@Cn-RI|bF2i*e`JΧ *S@DxMmI ;@2- ; ۠c10'};!P.T6ԩ=ξ0NAWo>U V_rZF;۲p zn_9Lqȓ̿q4rs}j+$:9/SQQ\.摐j\D"!&&f͚EBBÆ 㥗^דJRߧuss|s~ eeeXXXZ*>AӞ@ o &67n1DDDDDD?Ů7b̘1ܻw4bbbF=}][BBBd';I{xzzRTT$v蟊o0uyTrƁJrãF bcI(h>("<pz)VVziB/GM`)k*D-[൱X Ǒv\+&e8'ғAu{Z,oL_*"Hi6\YLTSLm??RI֭*SҮ#\ͯעZ*nhL:&!,ԂkpdfC` 9&P5L!\e o@g+hq?s)Sc`?âl]W>)u:X XHa%鄂2w}GdH=\{-q$GRkMޯfWLdkU#KZOnw UC+L\Q a܇$&lT޵|8E6S;00fŠg髉\q *O(ѤaccJޞ:W;ܿ󋌌'661c]e𕕕ѸqcqwwFNN=":<87mQDDDDDE&hg޼yX|aaa 4  ϩzZ mV.СCb@co0??1 7[4>R  `pWl"JxqIb@Q͞l ?l!ʭ*=b5#4HdB|P_H18$й%HkNLfb{:EUt {`FyU4U'"{>JNP +ȘM%UQXPP V%0#C_Kσic`,ОAHg(4v 8o.D*Z%++9浸\.ꔕ p2uǾ8W L 9Z8q,/{A $[ U?GăZ \͆Eu|ethH[4K^SA kp:5B"Nee6EpaM#7:CYr;F] +x3!TM/,%Y,X~2LWtm(R[%Soo ' Kb`3pz=| 6J\7-݆=zaD`!D~^1&Q(HSHsߗ)/UG}oEqygYr%wEQ^^իy&==aÆѹsgV^o~Ve׮] *kLL` P LA| x`~)M|{7-hSV*k?a/_ʘ okoa|P?OeU]oƀ(]?\\Ť*]8p.Vk؁ă0ܮfhlJ$Y.*kq0qB%?lPM##-5_Gɣ܍5|<?JE8>gӰq/ jGF k~rK0`wr~ABOgh{J};XyGUI$^H#=ХHh H "VV)*ED@$F Ϥ$ue]}3ܙ;9s̽{vԂU0<,Bq@k| {95 C#8<4^WtA KEh?"\ v?g#XCo+{x6?XA(;#W_}sB"GYr%Ǐg_~w\OXlSLaժUʤIXj|'L4j^~mڴŅe˖|m'Nĉm6 [fDQDDDDDҥK_wwwBBBر#ͬY///j5/^ĉiӆ FŎ;pyyy:{O{N+psx5uFkM 4? y8?ۭ"!-ԗT0}Z mF'E[PAq \ׁFeϫHtSA[/ FR7Pm!rR2#2 α%8U&z@ !& &JH&&X $㠥R| Q +%ߢU-/d d8EB5_>z\`- 2lME`ݙ%M9kj`+s AxT݀wHKKa5#]!Y7*!ִ !2:'{#ad%Gh2 5t\!JLprtp&ȫhշ(>qʤӍۂ+< wg [X Rxd3< B.ɉ5rB! >ǖN @VNp>j},f3C;^X|W9,hpc68&ˈDSѝ;q󣤤3g`ggGnn.Ftf̘}rc/\ d¢RAS8OFBc-ʂ;!yr ֛xhնPr|/vjk$,$ 8 .3Ew&:ฌ ̩Oק L0n5R qvXʼnzs5e -KQ`,菂flx9F.[ZJ󵄍1!s6b+O;A.tk `(D]ఛ Bcc@ pL!ޞ].o`k%.FaJ(3/ wM>&R!d:"ٞl?97aw3#à!$.U {_hS Sf>;ږJŋi,֏r&aY 4t dku4໘-1]ܾ ͐U^-f 4{d\yKY*Ρ9 cUE^ɠ$PG䠓x[ z !`LiPT"sf1xC7BgY)y7@{$Đ.*""G"j&遭j/"""""{ekYaalm ޝΝ;\.'//r]Ftt4TVV?.E_~I(8'=KAĺ,X h# ʖI,3 :{cyO8(GV ֝vaj~4 9#mo >IlKg''k7@Q 4*@Y FnC]=p t6gTp@zǟG QdRe6J^_?#TفHEmkq SoNBax` |h/a/!U !5 S .4J! eR?!7ї@Ђ/kꗘsloL6l' ZPYe!Sfag{l) 5EzJ1D*RP۩5T"EWCT!DDDDDDDsr  <0}w$@tt4(Jz=0n8<==1Se0c2qaNq0=j2d@({s<@$2 Jm`{w`T$n}sPwa8wACGNüt BUp@0C-B8SR^¾ Na(|Aj{xǤ$BZU@] t U O9 bGC~ԂK@-7NBijXQj2,42` l h{H Ep,4W'r2nN!t޸7bi o tM92X_:KP(6^a(|N>"|>7gWǡ;XZ`tݜK]J:.獷ѯ7)! m!B.@(̽&+r#@8Yx_*O|C!ӑt>I̛{5 [WrSVհO$urϪFc{p|͏z3(:DDHRŷ/j+fuZ puuE&/"""""ҥKwNY~1Fbbb|2!!!tDBee%̚5+VxŁ{{& -_Z\0a-DINw,N@N?7p,b^ާ.(?@-3;lp#%c8k|z @Iav.0HX1e[8|& :x0Fc}#]w H[i&C٠/f`4CPrNoeændjR }j?ڎcVR笡BY4'saB>L-X{#л+`F;kaju; _:DJ $\,pH mMDhvQD \JٙbﻛU"RprvBT!eD~X 33 rq'""@zz:T*ܨ ZMYYeee`?%2x1ܷWnF=`*H-eƤ*ԣK\i%5A~6bq=i Bi0S,BL40=_KpK0/ \%|uNJJ ^N{Mi@pyy}w^8[24\$&@'Db,<f~Q08MA1k)+9=2:[r^2C{ \z[`]p!mgsko3`wH=rZ96[閘X$ct2DFv$Qa\1m/Y~AV`a-DC +)p"\ģ5f=t ҜmI1дFQלPh 1S~Mq,pyْv.`&!yq/srJڌ[#liÊY` x('i6E_2tBsi7+CE \I!R]T%Q6@ #>hcDPڃ8""{( 2)6*_-)RL\fDDDD~gŝ[1ӃZgϞ1F!VTHn`l6ȗ_~ɘ1ckkkZ[[r YYY'=? ,XF *AIf7 aȮ" S\Z p V=םK㦅ZafBdl$R@/s'䴪0lՐm7[ TXN7 O,!MU >%}-|pL^d,p{/h d:8IaAp=r2)VX!U{c 7\``Cff^V 6&kf8bdLΛ*ALznԙ<"C i+8ybh+dj-BZ؂e!ٔ4PvK5d*| hbtJ 埁7NQt`.U%_AU1NX_[qC'ApA50rs3l l׭ u|# om-|<;/d{–3|iqMp`{--РmMdAE˃)ʉcDH!ӽ{wq D8XZ:% HX,!"""""P__ϙ3g(//'66'Oү_?56ܢ[nߟbbbd2aXprr{RC^JhJg"㜠M[hcCu ž5:BmxH:ZeZD N}49FXv fL򃍐3 zf?j;G38xNv{}orVˑ/6Qjbud&-Չ"zN&̑G]8[ʹ CBbp]/0mu'ôQyeKg [1D &=7&Hnv Ζm >?=[^ΓZǮ H7 ⩕?vyro6x؁Qu_fhHkf`+ 0SpVw).T?XL0m۶=44*!Jk 8"""""".]gϞ888Wy9iueF"i&FEvP(|WҶm[n>eKa&^-(#86CWqQlˠ9&6L:&"dܝ+X9v&n/z mL+"<4a`/:4!^X -k%XA& >_7x QD6X[Ki^JR6Rs0ߡrl%h%7]%D_&8fSO=źuDQwd:u脛}ϱh2 r RL&q=T䧩'Uv]]WP* :???~iXlm۶d2R5k2 RQVrq8w3;!GbagІ틋xh !@ cւ|J6/s,#m CKY>Xr Upq"8n=2R1@Zop8OAr6Gx9\R4EHӷ;9@\2v:si4Oؘb"T7 <hO2pUC Jxv=~jߡ^'Fp6CHs$$-o+p $ڀ>;5v *:Au:hTo ǒp}59QC -Bʙ/#9uCyw?F$m{3,Pc+QU_ {BOfZnhghE߭%nV&YA@v5Kckwa{dAH/5R)I 0vf 1 tz m ~{ G !4~w9 kq{] W̓"< )*pDiֈ=H!LF*4JSj17Ƚ;~YH8K֭[wDӳgO{=y*=&d2QS[Cט8`/dT;]cJ!Q\yÇLJǏS|4FEy*O?-R, 666HRڶm@HM>pIwh_~Fac@yw_H훜N6P\8*Tr^;*^VxT|Rpr6'}`g+a+lMʻiӇWa24<"E:e=Cmho44Ak40A: 9ziI<˂yQ©BAzdXCATȌL}q{UPho{uy~B f=tN ;4 :DCՑpLcj BFxR[]:B7 h\PFV-S.j@ 2LZFA^%=XbEc׻A(gN;5rnU-\FH=H uEA689$>C(,N&Fa,-3{mlq˼h@Ԇez܁¸5=,<!:a~}n ™d*R]dd!|0^X-`rBh]+X״re 7ĥUى!ݻW;1bjYf cǎ%==]l_b g󯗿g~4"""""""۷/7oޤ]vtLaZ=Ʃ6:h&#GPSSÉ͛$b}׿%]/ T0<\,9dPxwma.L @N6&P=+Ni&۹cR+֢|2EBF8ҍ>}xmћ h#HB%isNkQ ~zxxXvo^,yP.!^o?x^m=`WзZppJ&rDqELs;de7Sma/ų}$LE5:x:_=A T{?LP{ Cިr!\6ۃLvrh,? |T :L%7 Ehk5I>+xYhDbB[-qJm Q [aO |#z0ar>=zbn2 7T(D`Kv!lv.]W~;tY4蠁Uy5@K}0p4fWWX t@;ښT1-x6CPr-l*I5n1Z䏄=K48$?ϟ?_ڔH$h4,X@^^8"5TbU;oZO>ҷo_vw>#ndJiEԑ#0cG aaaѥKq0_dt)MU3&J)|X 9p*\H]w||$]'S~!`a-j00Б G<čg= Aw"Iq+/גy,j;x,-|U @S=<^ H !SAQ`^Dsu0FCmm{hja@(,oX: J!,=JSTe%cZo'O3( WJQ 2g6q}II&/M0]Dkk+撜Lqq8{.<@W=dހъXM(_B^ž]"»ۈ7An~=!WS 0 ACnGcP0&Z֗ z K-ǂZCTKi؛C^σC=ٵb ֎Cu3K?d}P4洇`X-V@'Ԅ@ڷ4\,ʂ`Na88`Q0&WgyiWTBeSeל$u fҷsVzS4&2cԃW5N ӜaxxʞKn9.MdUtt>N 60`8%b\nT j=@mW̞ť0k48~;0킐3rc6lo p>ɽ4!Eolٲm۶amm'D#*?>|ƎKCCӧOgvNNׯ_g?.\?Lii)?|@JJ ,`…ԷUV1|Xp!V'~u7rA6r[݇Lr\Q{s+(jx^pNj?_8 3 굖wz?m,c1Ul5P{n#4˟Gkߡqvv~ɉzill_>ꞏNYY^^^wd)pss 77{ۚ5kիW'~.QDDDDD7%66k2c JJJ)SRGs 9uR{#Z =n-y.q}gB8p : LP5|3y<1GcUKcÛ?Nw'R eQUĽ* * pEP7-2J({+m$?{ޟz^ϓ9|srҼ~>4aO8 J뎼4u3I$]u0,!%< /a;#RPCY8ePcN\Ijc5QE2 .Eq.F}7{ɸy⯣K8dn3p'W[uP=ƙ&u~$ӛ٤ ;4g& ړaă h4 zH R' (ZaPiv.m!+%`fR~&vb9@ @v0)3K嵎_TrW r@ŗL%d m2吗ThUl4r-Qd`fLv f<9,س;Qw/˩ -5Ty[/[wb27ƚ͂`w7tbtbA 33ҍ.(o555Xz#G䫯`0gFu{B >>f,Yr7n7ne˖e˖ʡC}qgΜȑ#?~7okb2xɧ McDDDDD~sYF`ȑ޽իWs1С>>>,\#G`mmM{{; (JZZZ۷/vvv9Qp?-%\G4vFMx}¬pvm .\yp}2  hJ,a+| xpu!+ƿ3mt4L@QmՄf 'C-} iPv=̟ IGeK hNЁ` cb1q=K7gB_ӣ.QXh:?>ZF'P@4Y;<N#8+Lh6~fU :z_ #qY{_EkK`o@RC$+W `2@"/VQtMK!1;Z=3 $2pOx P%8\Ӛ9E,t0;l0͎2LJEYFF9џ>pI ǯUpxsRS]6(w: IDAT!@FYO0{~g(y8|mZlA7O=W+i;l>~4t`ȫX٠nIgJ) ** SIޡw 0tI@=Tnӑv)R(7]1%ћ$?r1cD~oz(/lݺuH$8991ayW\ɔ)Sx8pX[[tһҥK:u*;w+q̶mjΝQT,_9so> _?pӟ7x'ϙ;kHKKc… ?CB&O̊+P*dddkƦMS~p v 72 +UIXKV3I`z(kp^޴Ey+<)O#ef7`{=xX(bmʻ({ղcQ:CC a aYuA|>9XeŘTeelHR&TRSs- zF<)F)[kW7%`/sfH0r=Vz Y:ŌjH/]]j6:PTCU(%OfXt2ʋĿjW/?F! I'|`—xRJPA5nͮd [c/=<00_K V G㷈TD%bqƻr\\\8~?~:B 证A\@. [dumAѮ OX94 T aV`Q]K+|T-T`1Wk9]nUSTy0BZȪ91hFZ Ք>i#tu ¤m ٝGnvX{M~=߼UB~G7@C|)*Q+l"/oGYY75S`kUM!1^K+7 nأ`/6gC`+I'0`lN~P q?^~*bm7b%y+* p ZP. ͚W߹CX=BvGz`[ɯ'Wq.v(:.˿ )4qW|2 P-gb`ro2}}ۆWQZZt:8<ٓ-DՕu@c'PZ@s uהܘCU o-;Bk-KxNcaç/,$ґRjdsm@*F=u;]"q"L Ga Ujj ΰh:,]v>N^uóQ0Sa޼'3+]j đ;)AUs=Vt}y0mr bm!4N'ξv8>9 2TDΊ:5&V Զenbfx%Z" p7 r1n366&TKk]hi"!Di 6`=\)HZߏ92TJ`t8?E{]#fCHm]+^D=)X`)l)ZGRW@L['Fɖ@3bkCc~+/xӲ Rpr+оs.ZR a,.^&`{J-nFziбқaru>덝X5==Gx8|^lfdxx+31рKI ѱ'@T/#@X6mDEEwnn"""""""ٓ?cA}}=z}ݮ/h1z;Mt}b$\x%2q"OgEɻvZ`p1\j{ ԧ؇1p AR /U+ "x *Eg4Q'Cu7@P중?C |X+exp^#%tmEz vR`!m@z/Z9߼[<=C/33k{8Kn =syS\sV8w0AsegoJѳURsn,:%Tu5Oq*V@t|eBzȓ@h%<:2`}$ʲyv- ֽ lPUh88@WBG` yWq~ Lh.&) 訛wxZpaG1ohiP4s@u謆0atoD;ҡ\MV~h&&e!vL$/-wg&QJ Ap6x>9B0GƙG_9^bZDD 2G}eK*QEDDDDD~[e;w3grqdҤI JIJJkkk< GGG4 3kY444ˑFXu&LP2 b:N -'ҙES/4 @ [)T!?d$4HAC_d0 t"5޽>>[!L != }aFYYHR;tfBaHSZׇkYIʊ dwR)qB 9ߺjd =3"&{k OѢi@ 28-"RJ z<"Eĩ5Gh-WC6 `WT&j;~ 8B] @w#X:|/vZ fWam pVeIqqm%Br aT1tB::B /pu}y 6]ZJ/6GW$^nᤥd9I /k)d]jb Vf@KṉN|8Ƥ\]BJ"ck;RSB JZY%v`nV3$g G~N05ƈ Hȟ xׂ'| U"h'ZDDDDD7PH.]ҥ J7n_0k,\0f:{_EFAII %%%x]u Xt/@Y ~2Mp$~PR < ֤'P} NdW9\m\>EnwH)\OU`m *8R `|%^ 619- xL*.C] |2l̃rDVICqyլ^Fs k 堉͗C9{i`l,lƦ h'AHa[x oyp@{AP6<9#%b VtWGeSd%f (h- V٭g|cULj0AhRc qW/()`wH])<8!e|x \a&AxPKhZǖ8*FC7!B+Eي@n=pџu3[JE,#V*UK`__x4?Aa Zb(D 8f2^U#x1]3xG Ȳ8*/KZ-%Pfa5? \8lz),Օk%e*'F6a׫x>/.R=6(w1sVOx)8W ШL)C.*B4{{Udm ŗan aNZ†> ґEGwp57| K|{Up-x""~omCEDDDDD~S=zm1>>  $-- \b\\\ĠT*yMH<n|?~7 ;k*T3TޭG=_+8~rd&4OG&jꡬQj'w1v = `~KKVPr,zn%1npVÊð(n1(k߂ 448;4)lВf_y- T\DvEvD!9#Q:76)7̓B"g4\< PE%:7 HG6`bṕA rBW7Ep|/?!l<ƶ Ly(w'o  :+GKṤD9ˆd9cg1i3: Ԏ;~_BW( 9:G\Q Bx g{4gѢ@. 'ɭ A1y<[&p5jD9'prZCDC`ɠ,{pRRvߺ@-o ųB|!t2] >XM":n$XP9*9&tnϽBԎz2߃@Ť IDAT܅r ̐lͫf/DhsX.YgǬH~$grKwn͙+~}> fp[nnT<:~p[qgaA!X͇es?v*k!TvyXTG0BU3xΰ "= R0?4Dɀ3JvjAL8X B3.3j`kCy|@5~\()ȯ)LCt8Hdz֭[f"22ׯcccVeҥ,X~?Pj}*Drߊ)Sm6Ǝ+xk2;mJEAASN%:::DLL ( R9~mQR#տ :Yb.zM[ d MOc!(KE[U[5Pv!`o goaLaaS.u<6|aA,ze>K.Wj Hڡ2T,Z7?ɔ|yGrFXިc uxЬMl rWsW M+%pˋ`b&<@5P!s0cЦIAݦA$8_#J|͕Ju<8@(8g$Dpz8Øl>U^Hz*#b!N5Gt XX! 2O_'Ʒ:*WܤCP,\ Z{)%.CK! JWꅨh(Zf8!6`Y6p FNgUZc!f@(S 9&;. 싑0A' hɼ"~/DDfG)@tt4[n駟fݺu?*&&''c޽l޼kk#ϧ[nX]]kœƽ|[J^<:nn_/"l_,[nV f|+O׳&=H]fO1&Cq-mgCMa^KR( Wm'סV`_]܅1 0zAl$cRJG ? z(ňiT|َS$́ P%&94]An6#Pg" Le0b'z8J:.I:u6L̰^`az>SBT L//e6ضA$By^U o71bLk `DL{ӧa ot`X$D sEH7{#kBN2}xˡO+aT[Pң \ ;Θ<~`!(MOGesؗXEm+;G[ \^qZz8 wBj;i, 3S$V JP)pb{u`uҳwpUꦚ|Ѭ[~;'b#/˗/#BFee͛%&&uΝGT*<<W_c߾}dd#KoQmߏ_<1U#G&;7ޖRąbB]Xp\93aޕôG ʿKT7G98 KvC=^W|sC:)B60l҇ 5d$5pPnc`Gl Dvp8|}a(xa U&jŌćm|N&?.Hb/)fH7AB \60xޱKTBA|*͵/KfFG OBdm/؛/ğrG(6B-H nQBC<8}!Wa "{&>6+.̇ (bXpI%ȅjZÙЭm$ c@ $Y%msDew<' cGPA\S M؀ga@ l#QJ29YřQXObKal{Y;. @LwIQX[.U m P y>WbZw=z-eGSO??ۛ]vqʕHEEqqq˷?#t:/^̜9s#2mooObbn;rss~:۶mcʔ)O25k‚ 9sTkk*L1`bcc'qw1Ȼc \7:[b e~ĈQV\%|lVG]h*ܟ-InR!k+fGGhޛc vc7l[A}g[& ף̤qL[hxA#^!k i)~_nAl[^рIZG f{@xKϢ]ufB7Q>nBNMEHuRg_HFB`DK8ـw8Ǡ[@c}0]'Y6WWW$;˓fz${M(tL\\Yς2/ Q=`̰DWx Os -j+RɇH9ԍqDizXZ":zbA>;{]|Z pR",;Vh ؂@YW7҃&0aZX,Ա| 5#>2`$MJ)<-U6e#>b1R33# 22l9q֭ĉl޼iӦcaa>țoy{o_>}:>?vq_kǏ`0^>p@CΝ=z4&Mm%$$f ?/O … !66ɓ'lτ\.GRHIY 996D"ARZF&:%DDDDDD2qDXbsaȑ( f3<$%%ĸqx%8₷$wD0 PT#tcE5[Z0  tߟpCV n /lk_۳Ô ;\J0' :vQf>֮x@Z>77Z0P 8a  A}l|/q^lZlUjbȻ'HH3K v~wfDb/5q>pNÂG D`G'A0LA`TYI_̡H߂7|!MP VVYWəpEJzA@*揅nPi@`RMQރgE ]H u 4EEz^ oGgaJiL0yudP^ y_ 'AY&! LPx/ '"2 ١tP)讦XYyV;OגpUˋpwxSe?IIt]V*{ QQQQQ_ *dZdeBPN^i&m ^Wsi}_4<[(ksad"T&B` p`~ zSc!9^/;;p2H~h:o-]?{_pE17vx?'N1TJ޽; .ʕ+?>[^\YYq~öoθq9r$r3gбcǿW]]=*spwwId1N"P(ʤlT>RHXɬĀ TSRRÇa„ 8poooF&akkˠAhii͛tڕs9BӉ]6J5^G=ԏ'x'#&DX<Qi&dàN*|&Ak{_sqKגBţdutZ~t5\nºIް ڻp<>BWo/<zc,72ڸaekEnLsGtƢ+ c.j.Ʀ65;]#au\c cBhiw'e3CCnlt`cRpVeGCog&1,=D_SĕmGBaS1R23!_c qO5CU {,X;qB-`nCO(m !>PF/vZ! '7[(MvNP\C"%""-D_8PT(((X7OOO4 ^^^?=?|pϴix~k=;gΜA׳m6FAi߶uqqA@cc#...|%/C`ooO\\* N5 7o3gΤm۶< 8KT*=z4ÇV[b8XF1x'"6xA$o=Fiv%TEx}m1<a3@mv Wg#8|zz7ʗ*ԳH`c`k-pz8cl`|'$Hg%!I3x)A#5j9bLO12 J !dAUlZzF;aumΝGF%: I If?djR7WAV (U])y4d1bP=Jy{?X[ aX275-g Ma\0F,Eq*ځCi5XػmȮO2sT|αTTeptJ:xbU`]k;3f1d h)o3d 4;Y0r0gT)v* 2fH34V5Z~}wd̈́Ł{<%}{=ş[B %@{XP׮Uf¹:XtZ< r6X#,`6ZJ3k+hVp7>DD7Y{sEį!69+WcFa˖-L>CNDDDDDs$$&&j*BBBu>>>HRt:;v`ܼy֭[cX`…( jjjĺ[ل=;koQ($!ua A.WĂζ+m@ϵ:`MP] mc$7?P#~ XݛaOO"D璯ܩP Izv{ޮ&6sV_£~klO\;"}1BOF@.T[;w0)sQ,^:~łWN$G\HN9X(o7ۂI?@Ne#ΟܤfdW|[gO]Lb74yaXR[pmFlnj} $gPh.160[j$@M(%##1`@+> Aq.L2!hj-FO-5 "taPP W7Xn2Rz ?_CiJhtLVj"Bf[xBCLs# @,\!dno`w ,6S)A5[}|?w% իWtRtBcc#uuu899q%ѣ < Khh)[/SPT g1n ilQ"!d!7q l mP {)<23g?+4Zp8=b љjSa(  ڲ0V`WfC`_YpoZp7Ѯ=:7R Ʈ0Jmf3|T0RB43[b hF^9 ܉䇳xr2|֭}3hNz"""""""+b_l{{SSoR]G`0Mee%ׯ_o߾R$+_vZ<R6+}T\p+8ÀdzRv1B~{P2:!h-n ծ X V}2HfO0STnXCl ʛڽXm:N~*h2Gl`b'ՃLj)B ¬!G{Iida3vN@~RN)( lA[Hsv:yaG8>:z> r1  re?잊}+[6MG%*4ckA  "b |Z+䗡Do^;F†4|H|݈_}9 U Bg$+.֮)!LȄVJx\Fp^ Y 4 v(M>Aij ?=LM茴Vj_;f(/3f( "-4=B>py s:5t~%^> u^H \gFpju9xhB?}D4!TA߿9{ IDAT?=zSj*5]*>,+p: .]bԨQXIIƍbJ5Pp=DR{ >}MrO{:dga D+&pyhhcH4>Ƅ  F}R^|,7,ľ[[ѥseZ|T }i.}jy P5#etu F3T>Ep&Jh1TAMez8Q_|owf4A>t:u<>OPv'U  .!`\Gl:JS\2K eP xOt'{&\ځm+pBv\Y†D wgg3Dh';!8^VKZ8ARLRڻ>̈́F=5`p'/ZƵOgVMMRT1:FMUI\vʨ>gwW剫0ѕo˪,3EZ?E, D=0{{\o@YYIBAbL {0a;v$77V*zNDNb%^kN)4e=]:jjȬvlwz303x9(V-p LC{KHOb(llDǍz_^Fx!Ȝc!jBƚ!x;ߞŚXz fρ/@4p!~/y;o ZDDDDDDDDDB5l=}cAFK ^|nݸp^66)2gijjb|ۣj`ΰx7ʼn:^EmOAуhT(Khv_G3x\0[DGG#uq!}{.PRRVח={*~JTZZZ ggg4&r2P.b)tLHr OaĐRBp4rGKbϳ]8 ,0Ckᠽ_'pUAy,fX+ty>W33P]M8т׿]?eծ /ϜxV6F8s"/){"9N*q rGk t@ 3suĤ6RTm Bf[5#Ɠ#V,u[bk$8<&лC|1g3mag xZ3Ue5qX7@gp)BY$5%إA_𴅞rxcLM|WfbG5lk]u3fRW fh8Lpz(O  CaP@s{HWCeO;%< #t e7[EɌ~VDG~A9ơ#8tV+W-f>uAHTuz>'Qr/{8<0ǒjhSE]]DDDDDDDG'..н{wL&nnn#ɸu \ʢ-z{{Ξ=K>}t|$$$ٍaW~0b 0XjkVd &-l_ae sw1~yy>?FAl:)v . -@Ds+;wvP@?T=r%Yr6_#- >HǶ`0YeT`ʘIfFիyuE@,#`90 OΧx<|഼^YA 4J%maw>[LUqƔzTJCpK VaS^`uD-p:cZH8 }B,й%\hTF0P8hpͭj!!++hʅ~Z`ghm ɰfC!$ DK->>ݛ6m`ooJ,MA$ tܙ 58qj^P(TUUoT5vpJ,V(c\Xnh%6mcPW{KZ gJ *[3uVOoyp.aA;Ш&`Fr}C%g ZCOH,.Iژ܀w 2DDCn :H8)~A3'Ac/ps$j]Ů#J-P; * z/4jՁ~im4A0,zƀiԥA^*k WÌ䓗7aq0퇧fhm Yr3ٙM\ʑRL 81l)#X?c5@`  {\@L(,sA1̩P8B; \!NYX  3û} Kz/%]dӷľB3j7'~uQvWӶ/DtOg BZ[D9%%%\|VKRR 8f7amcCu6ZswAY6+TYAM-l-2|gTknM~J&^|0_=/ R0+,1aK e]WZ ;L"KBM+D{Sv5wV'Fzs%ZnPg| @*8m'/#|񴞀/"zʠP@ $܏:r2mȅN`A u6d@ 0h"Vx54h_1X7 k.ހ2Hj"WÄg R\~8Qܓ@VY<-Lc/a Pn4yoaFE%S Ph0.4` @`4þBΓ`f"ĎGz! %Mɷr z%HYqܙxӊE'$݁ 2X`zh#Yrjߊfgo^DDDDDDDDDD7ĸq㰷'))t]'*ZnbÃ^x둺š5kjn:1nKYXzmzx3pO|#y5w h䁵PkIXՁwj80p. AA 8`@';Wqsg 7Op >0$Jݳc8 *r0`yjXHN f頫:{&N >-`S bn8둿#10h3t5dJtfnVgkW+PLƽ32\Vtژ K pECڷĀw!;rSL =Z`oWLE2h5FȔ:]ZHMSRxu0nRy G9|y+>B㊽Lil}7<́ ^B|VWC&BwB?}_}ar]w4FL8ܹ81p"""""""""޽{ON ֖۷o:tnDbbbغu+ؠC/0'-+] gf 8g[nVgL y+*(l;e׭+pQv`e^y- E~ trFI起\o 7P}OH.\^#Bi,L!` 7UN\XрUܹF1Э7]AγѐVyn /gA>~f .'R aQ`̙< 5aN0+ք)?! dG>˰3h.+I\J], Vpۑ/A9O]2NUs2sPf ٮc|(ӠSg ᭴:J^pp} -ǁH`{mU0$,KLAalXgkOrl&\\ v i'@P9*̃)Dυ,tىux=ePazlZ 7[/jsMV 7 Pǀ+b<P <ۙr/N&\wx?Kc) ( TcΝ̞=u]1tȏ$''qFf̘APT曤ѥKC₍ O=[nM64T-2 ͡8W-(zZpIOД՗|ݱ 1Jط{&h@RHG hgC&62'Rm :%kH̅QuTՑ{neNKdH8ԁZ) ^TИO׬?W4&5oTSBr pAS%X #^H.Jo;еU.N7I|&*z* sϏ9XUͰ5(x +_ODm#V,apY (6K};tÈK.AWsK9\؍-p MEgj[J}oߊf'UV/&..u1{l._|6Ql~tKbgg̙3 """ܹ3AAA>TVE*ʊc2`}l!1_qACCV"lLF%:}dL9A`=;{@^ ,w׽8 8XEY u u)A?@h&I oDS_g5t"H8RČ7_.?^L/w=NGrZX=J~ r CH\M{ t>Q ."?sGt?X$ fϋ_~7!FMc/1Q V(s.Rޟsk8[nx| V*(6TfTzh2CEv.&l8^ ¥JKi;8vcV7pbG?A|^:x V.B薣#܍Y -nW  !Oj_=MXΣ:ZZ/` <1ᇉahEǼT܄i͌:3Յϔ p:-;@h`fL"F肅E$dcѻ uW )Y[G;8@GN)Cث(`Z:JmZm$[(U7#|'ԩ rb5eh&Ķ.jQDfv./e@ThTs,< mBwO|~R83d5aՓS端9ea?zaӶ0 {{wB;j+.O˯OzGTM||va Z!+Y:T#`.N;%H@2._޾P~}\3h BDJ%\"X^dM=Ȁ#x%8Um!Dmhm.bӔI;jv?W58 ԍRM3Q/rչĮzv&zx/aPUk$qHmfl7Ǝ3lo{]8 Al.@h ?jcMFZ1^soSPPSj<3rk+ZQ Id޽VSvtPZFqTr5ifxaC[ [o+AYFRw[a8J^h?BXl4tPw }9?܀k0H@~k&6 ?Xm_/ t{,_9bK?(6͌GF0 J衁pb9SbP<_@:6«!^< q,Ǭ  Ji :Msd#CJ2a$˜Z}pCL]t۷ *9v,[E EtOR^[b`sRqhqaF $0?k_aTEwkhZhLNE1=Cĥ[e wbi4ߜ'*>n(pjIOO'""`j5MMMdggөS' 33233 cСTTTpm222DFq xÌx0 XZ.ђ{z.8*o GS)W%ݦGx![LxEX1tP/x)LU- XLըe#`X4!4d}M~p ;RC]\AamPžmG6k{OA7;o\бogDTbZ+\6/{ {!a\;OWjr$ ρ+و:*\QŨ&<3\փ'M4\qLnT_!>3[C]  @!o>XT*,/D/&p|r @O2[i\< '.V2)]r1S 4TCrK.K#-P؉$ 30BG[h̀%B؍x.~O?@4)UK1seq0+\G@<ϗ p]ס&݄az W"ԊJW5xa?t: <6ul>%fvj '9T*Ju::[Hڏ3|±\z/.61]}a]\lz4ؙC1 Xj=omu>u(_@G}JPpqpUhr kEuAC6*'GTȟ???틿?7n_h4FL>|ETTRgѢEtЁb>t ** =\XYB%PF-P%rMS\2{`/- tH aD1\F!8Z:>[CD$0<!\sQ  Z AFD,("hp5QM nxSNj7A`;QuRʃ =zCHAWWItC{9r+xi 5/R1TWCK]΀,f ئ)șyN8 0RcFC9C`(XA= nsWe: u,-~NZLt@Siiʾ <4C:qޞic AiXk ק+_TG}L[!+?G VA1/""""""""""-- Bl&44GFgd2ڵK.Ohh(]tAPhD/¯Xd}El4@ Nmk0:Z &A;lR Ih+a@ecYp.0ˆ'%BA(nt,$Rq vvqAL- ^,DWF3ܭ+'hkds /2nT5bu:bL/:C/w8c0N9eNb$ZC &(4 QY.ׇ읆1EF)rQ4;8z?|;ooo]FJA<#77BAtt4d2\]]h4RXXH~~8U%}$}M@м%Aa ,0 /Ȳ|%"+jAvw]]%@5AjD $3p45[B\/uWTb}MKP5蚠"RA_k``T&=}OnHKہ<[j8@TuKC+Ps#߇gep RYyX&Usy Α=Pۿèi2Cp3h!בNf:YO)OGd{/ w7qf0 ^W2ڹ@%x NP@o7t Y} ?,QpVS77!ZH詁Nad~/61jR,5 `a /܋Ƣx 9x;9BkX J&}j8n#t0nYuW#HA8a հt)f=,'(Ԟ +'nHXi+'cv{1E pvn(d(~""?KpX l?"~~~T*1\zZmѣ:t ^ϦMx'Lkk+E߁\G cw\]7Vr2g:fjnhB)`XYp.o# ?ho 9&S5I ZG.u'4`7D[CQ:-$>NE7Z`2͛%3 ln;3B]\l fy"F='A o*vPoDQE1X {q<쵹4|;ĭ[i7l=6%Ho_M. 5/< : e'B#aR5Af%5Cnhh[@;FEj `⡿Dq%UCgl:d(,r*VnZX#8hŰ4FLc"jEǺ`֎Q Y] SҞoOq45k&3ƃTZm+m;^~>%C%Ba=TT5[REܗ2H:#P]]`M6{nݢPIKKC'Kj5Ō=׋_~#z SAl dC=wV2n*1az92Ԍ,`xX3d߄aP")2sO*`p@*Xb5[u=UU%t\G 0!b ` n^FoREGhFt6~0 rƷ .3jxe?hTтC<ܤ&;{H;PʍG &#R#IR#" [EשׁKXJ@i^XM>p.s7ps:xlVd OR~ʙx E0^ jl/q:Y0(T8  =k*|& TFFhj#?>VC4 "SFHR~W#;;+++BCCٳ'AAArlll8s eeeJӌ7oooĉ{`[x&᭿)xCz.Vs:>ן"udbBQJj5 L))͸ZMBZ% n4zDD~N^'""""""""""777C@@rN:|?OOO +2 ;;;L&RF#NTs̖X_vLfL#'?w1@mjs$# :H(x5j "J@%> UM`{ "th9|+|}Ōe3jL& (B+>kѢL 8___8OpdIdlʫH > Ü`P`y8܅tyBB_P]9?)/ N!WhV5q M&{>`5уMC>Xu;O }k VlD@u nP"`;Kzp#M\R4nb@jhPAhGTe{jʙ9ja6"+ Tʏ`%</.g  S!4zTެ-)M37( ƽ mz AU %3/9pe56h7Ux9nS;x\wvIME%(""""""""aڴiDFFbmmͳ>_|3gXt)_~%?8III̛7;;;qrr"--ĉP#V!^dY@jfGp`vИeXg [0fFoB"_OWކLI:%JR]`Ie)×5ml '^%RCe#MjWNRE%pɂy`B'ݵ ',6~fpްƑZy71L4[@xHVL(+fG\Ffȿj|⪄d*V.2$pDWh *[2Ap_:O ȓAm VDh=pΧbD?VA NzώO')6(0F:UApY[ d!( PZI':b[2ϱ7:2̾PAoӦϱ4%oUl ুSfF2Eh,妚}.O_bؗ#D7}Ԅ~RAsU8BIv>"-rQ4; ȿ\2}j*gE}"""""""""IIIۗ3j(j 6h87WdժƯ7'''Xv-}*+P^.NoWAhdw(Ĥ-zAH5myyi-qHxD'bFt 苋PɓCXH!&b#0`V*ՁZ?$@?jXCEy`E$fN;  .\"!:*YF*OK_VDLmj_뫗ڶʦ~B~ۺȳ޶z*ꠢUXGw"բQϊ(8HIIaɿ۷_qG̳X,jV^ͤIHKK_J.];v,JĖ-[P(9RƏB(T*[neƌЭ[7>+q"%gsai;qXgy]@rcp%>'$4uOw_5hDfR)XН`_! ;_ ? 6jTd00z²lkA#!Z5[& \=Ptl `rlFAL*Q@9}Vaz=3|HF&(B;z~=HoApN$fbiZHd||U S=ap{i uSt5C1=\8;{Ah*__$~gX P`i||Fy`pFI965XGe#ŽU#Lx:8HF vxJ Q/iJ0Ar8gu39Wk0}$׭p A ¢Hdi<7:vcqEDDDDDDD:tRINN&M"68}OVqtt$##Hd2h4r9$馣r̀܀ 8]%BxPӠ[hn13ReE^BM:+Y|TgX, SwyX㹏HVڽp6-8( T0<[pe_ Taڅ`=lܹ=j('˸ UB]CB$ X,\:Ya8b*gHE sM0L"@>l|6J+,Ι 9 UV}@Ċ(\H{>ؑǚt :J535\dߋ[ڛHb٤&J"8UcUp ]!Y6 –Gq)B'])0,p p.H% Q̆KWiQ"A@ۍ_0{4 U(Yf^0pU [3P8ľz&.o{#I ]R  %}p(ᏢY/şx֮]˼yHIIKlCCC~!K,Z =C .H$|gbgg޽{qwwgÆ v\iiiDGGDMMͯۈ#8vd̘1b 77}ͦMjnsѯ_?L͛7|27oTUUO?Q(o^pס'ǝZs-w{ !v}/=R,Ӈ!j$|{`a%4p+bHp$l< nsmOm*vi *I;?18o_ˇFT*12 nnd7DI0<󥖕C!l#w;Gaئ+ 'x+pVs᭙v<%2xŅ<fnZ;̊&ofF$P a .A ΄R4̃P9{4kWRZr%ndqrc0D ɯX㇑#TGbTwrBV T~J3M>E˒P7fФg l:2 2]>IZFCe7;wݑ$bJA_Ae$aYT -`XRsB-lOZxgȭ zQ = I֞s;QpDx|E4i̚5EkrMv>/桇WYT^z%/^ƶb -Z``ŬXB\H"""""""S( &L@bb"сєjޞd-Z ݻwo߾,[TrrrJ$g'2}g}ھ9뙰U!0 6@)Hx7Vî&1A n%Ϊ8TJց`RXXI,tV,6,L^ɒaQjB@wD ԕp!J #YL-,g(>O⨱( H׌xe\RgBba3<*mqZgnwGkX:>cT R4|Oã_zqZKq?Qn0; k!cO5[61^Λ3#%h9V2Zu1Q{y_j2lj5 @>p:nQ}vz&+ 3fv=Q o»Lj @ P/N*ۈʈm^ n"ؖ/Nc无c|IooHlz9?.mO g:(dװʃAD䏃s8}t6o8nȢhضmӦMwUe̘1diDֶmD<;B Kv5 ._LI6~$H*ntoY+@~:Lba ܈0  aVUr X:?w+~V; CH4ZBCN2*noi|J (5wn4/1KX[ 55̆Pij[u(CPhIVk(,3H'}h+q^훈ߜDgf T@'8Rx 1!Xs:ݜt(ֵ ? nzv/^oEx Aݳ2! hVCさ6STyrP?*xK *8t+=NMIU1܄Z(l& _!3 CpƯÝ,m_Ő݀- p =_ͅӰY^]! Qe,p v0/=/g7uo%˩<ݬaϭg1R-gĦ1r'OM b2Yf#o''{bvT(555xz }}}uWmDDDeq񈈈^nSY~YH~oMnݘ3r'L'%11|O>3,_V+NdDƻG# _VHu+BGx/GB3f !'$Zݻ#2yx*˧(Pa۷\ "}X ;[6]ٵE/|6Hk{gD;I}I hSRʾ }ѲG\E6zTD@YDE,,,Rh)J7}_6m&M?A=;ӹ&̼̼3{'py=ʃ&ϑy|z6E꫷x [a\ \VՓo 3E> Le/3jFl~/02s (g %(<9LǠn#qR2 cvm䂨||㞢r6ʂ0Ty[% [!TeĮJ*,0Ɉ^nG(0)v'Aś7"ٓM-ܼ5~%=ٶ"~0r0̊©A 8 ɛ+^f  $A X T ?ކ#,Ɨ;rYlX5ZIP!: 堻9%P{^[WB J-qPD3n1mhd{VB{'c5 ^0 mMqp!?JJk<[fvK/G!/ D_޽{s--s'''''WRY})((뾜FII nnnhZy6oLٴiXGDDDDov%1Q%0C'WW;:2m4Ο?Obb"{FTӮ] (+dR)>|uֱd֯_/aZM+U?pnX|~G@:]P% .wo">2]udf)h)<#̬GktQk b`^уUqu(21 ra tD1O+ʩoCȵx]L8=u ñpj<> `LԒ.3d3)/z\ T" C}\7 κLsDs<:]#hEMY>7I"p@R]NJD\z5j u dEɉNe*#̖{$_$s7Ž H]JoNą %D3LDŋveWcQG.-YFJaY H `kp2W-J8w_ 2`.DOrt=3w#K_%缆Ϲ1>H.wgk 莰7kP@4I*jXwqEbR֭[w_ő#Gߢ9z(Fy\.',,{G~P>s k֬˯YNǩS7n#m[RRQQQ>}HŁ#"""""g7QXr@S[˖-[ΎSPPdh4IPۗR077H:/6ꚴ˱R]/˲ߝ@2j ^-2iKcP> ]qFu>۽EpBQZZ^;[sHL{ paw5&N̘;i){Frm#(;ԆjK[> IDAT7UCB=|`~_ @\\ ޼JVُ06⌼/@#&Чd2VV^q8nŽvxcʍ n l •[腜uK{Q[R#&l`zN|m'ukCĆH)#`ljZz)Nk2>~7]LCȱx :Zkx:;9ʂz%sb$L@uTHx{dfLq8:^d[ %m ;[p=4DIoI FCGP+S!poO5Up:<{/1ZMTX;ِ}%NG xjT i1X)"r8Jdbv &LG}3e.\ȠA On,ckkի=W^ԩSiݺ# !!!ӱcGGڶW_}kbaaڵkYx1ǎA6 !њ0?E7??!}Buu5BbBBBdDGG3j(t:dggs%|I|˫){A$l ~Pt|0ѽhnWU:M5j b;y=~O!TXa"E7J•%DKGFwBz:HπX( ϫ{baj1`'2j1=4QYBmD OI3%̧\.G&#-V2oP!J*crBRxo ?6\CpYDE=j a=,m::…Bf[`z!Y~oG%? Y&ͣ{ȵKFP'D0E(! ʡXUR3LhaE!:JA=]7曻9q27t㩫?}7}LӦM8vߵm??>|8ÇA5yh"$]٪,X:9)++#??,f͚Ł;v,uuu8880l0ٳgSNeܹ;vCRޏF}fh>(:6- Vx*4itI6$kph? , --wRUUҥKիjR^^^d2\\\ԩ=zv?~5&:6e*0kgE`$0qؽ_$9!vWn˕ZC+[Hˆ` vв`&bx7N1(`a[(.aIxDֿ=lKN̲'{חMFCs(VtWRҍg îotY8j .8  :[D/xˠ\Ƀ B8k9|5d8i9P*vmHϬ`0rFȓ X <_XTUރc?R X:9ۀQm:[p*i琞 wo`ݪ=7}R18Kg dp (`3I) X-&O~@ זO2#7ͣ~ndKxś7#63&yk #!`Hװ:Xɫ0\FWr{.+_\?p$$.5g#UD BE[Ssq&Z=KZu^U1\N[^ ԕZ k<bH3b?AI6('Fp8G"2>///qrr>CÙ7o| 锕MYY//_&//YƂ0M]MCMê X5eQT58mPB(osρY S0y|2Fe7L 6@"YU<VP!pM{F ໯dg6lU &`6(!A$ޘ)ۓ 1۵+8.iM[U ru% ߆N`g7kZ!vX];meax6 Kٜ.Z`oŃyfչ o_ɡ= ;s VE 1¸y,h u0ɱ@%-|ҔRu7^Tjp N+a!NW[tlnkg(}ay}AqRp e[yࣰ Yc 2D6PtՒ j|2TqzԴ!x6,A`h(O%bL2YE/E[Ey8 8A 14R4/Gh tD1:tmbfy_ՏpjDO?C/!""""""""͉"QDiRt5?ɓٸq# >  Hhٲ%AAA( <==1xyyzjvũS8|pPm|H{P|l nFQDh*Vs4ªT n9 p7, %|+P AyD\D8?ugs꽎 B5KIJT!a7&)9?R]spত2:%naE,Zw>@Ny(y=l%s:/\Hв^ˎݫa0pV9t:1#^He\ {lklZLj+CQK%m'Ak %j!Z9ԁg `RrII]l=j2QDu5+&a8)\M5ru~_Mp.^NY:ܡ ꂟvp!¼t͏n{6 XJeK`:&TA(RTo=fAWvaj|-K(![KT|_ڡ{S*G%Ly'u*!D.x!T~s71A "A^ }`unR6A J؇Y\|[ mq d6У֯oz5=uE=7+C~>S iNp(66*+'kGy%[{0N[{`TJJJ ammͥK,(`ĊW(q!lhشan質yhl" h?ش4 @!$'a 8 {v4Y+.y NzF&²ug (G@ fSEEPz2 6|xvF g*|}=j ރ1H*U/3;=/ۡ˲=z 2)s_#֎$epd6˴p?.>X6v5PF})VLIDp܍A]@iuFJ2Ы%B + MJfoT*sAlK]L,cxo?,[Cwk$VF%rD@p;A' ·`E.)`ya ~*SHshZ l9v\iŰ5 9JOAr! `)k{L)|f%B3 $J6 8ztΪb|tr<>g{s nrT*c]g,_Ùh-3M 0jZΧ0g؝j 7|R!Yе zX[_%,+ \ 1ˢ{"CPfxh^>iNRՎd-})kiLz=CV4^B;$ lEyX)8悼mB~9} 8yCn3cDWCR-"""""""?N6Ʀq&hV-/gΜ9 HI\Bln.iiiE޽i@VΘ/Lhh(7ndȒ%NlOڃbA}~ EGwHu#I,Ç&ӗ=Y74\c8\ Ep~= >:sn24/'][G05Ewv-L0q,@p8<[NRX!^+B &da]E0r]ȕOᦓ=-8ER5'VR;4Ͽɷ7GHp5 7[C\>r'R&[i_"=? \c'` A`)p z}pB*)̨SvCQ}{9;m]S;n!0ɳ?Q'å hiMXf.DJ(b0v'A`[pP; c\6L1 BV{@؅3׹] *,c;RM8x[p³h90%׿b&) h,x!О tL @ݵ B=#oN7B%`sӼ|h~8t4|#,+eHH3 _iǿ ?/ܺoz:J%.3f,(qj8֪tޝ~ WKW6o̡C#$$YWn:̥Rcơo 8wshL#j@ۓEXFp5.9q3 L:h",@j氾vy8&SzkO1DcTc7ip:x%x t BxzR4)L&ْ0$ju%O!^()Ud$-.!qwtNV5nޞ% WCpkB]e2;S{.D7-/@QtКݹؖj n,_8@,,ZB>)H78 ǸV(bmuJWF,#1GޘNzJ%kO1zJ܏}R2Sq<)@q5/,Ľc) ^p50,T)\%\uX'nPٜ1q3Qϻg:z(ـ'aZ+9l9}㰐׳WZuz;L5Hjkq4:r,CO1+'KRUo»{7*'K] 6W7r@fAQ'͍`zM#"c8REDDDDDDD7=;D=ƇQ#٪T;cQ^ \]]5jWWWjJKKٸq#[nzJ~Gkeyk~tRoz4 v1/e^ 6 /xIkkd3 BHL-A]eƟ1:8X{= cV&XA[K0Y5{$~;({'7[ȹ~ 1!J@WhDna}<5,jkz9Ru?/ YCY8\5ByK |utr+؝yZ417#2)ؚc]RGApTZ>ݚų  y*PhɎYx}Q;FYF}n*랝AȳxqffiD/Pᶉ9_ n9{e_c7"nt-anҠ$87ErZ[򞓑hU= J zߡ1mDGN߯.r! `( ʋ< H1+_&EE[ ..g9|wcF ןkꃑtvO?27u[ [_ a1c@4w2G/ޢ /m8LEDDDDDDDH^ƦIlD1c՟Ύ fΜI۶m1cid,Xpͩh4RkVĉ9~8zbf4f <V7g<**㗢cMø({X\waK-:X] 0RD}#di6^vw_Qg9C`rό(9XCz3p d 1R˅/IJ ~gZ89`d~`Fˆ`[۷M[dAi\0H=ՙF ޖrF=4?sP4`+d ]l|fO`01} ye{d%t7ؠ!g:pi{5f)9|h Uxފ y}~(Cnj2Z62r+ٷOvVc5Rr*~- _Ŵu&rFa&IVp](/ f$pUKRTd72VxʾZ* 5dH&iMgo~Y@A R` efpM ΅i}]0v8p6%E@Et3swh?q2LEwķkއ,czsQivRP_ ڴiûK}}} Orܺu#F`ee76l-"""""򗢱NHSQÅ(goY IDATŋlܸ(8u~ j1`^}U8˗|2ѦMVZEppp3v5 Mr%PWB18'Z?p,G)A[W!?/6W靵Mϙ(Ɂ zTPC_S5- I-oB%(ka20aMoJ 0!<d W\KEKs͂C "4Peng Ϥ8HU"Vl2w.}WEم~#J3 ejg? y6F|ܚL(H+GI#ls/.kt>@;^fCmo֠4#z0,pmjMHA{KK%o\NiXԜ70x%Zԗcz ^_SՔQa9nfv2b|kV.E2lF[=AP,jÐ 3Af;䇫wŮ`;34ALp(ho%@Z&PlOZw豹]E`3, 3Ⱦ\}ٌSˠKיGA6QSա } ñ8It76=m!\Ӝ_""_1Q")͛G˖-}6555\|rVZo}K 6~rΝ;Ǟ={شixEDDDDHJ<\pl*:cR^^D"!!!}!Hxe Kbb"eeeеkW =HR$ YG!ڢajWB5zq>̚.w?(2A ֗ S&8_x ^.`CIsnZo{XzQN%\R8D-T fB@EZ|-W_ySw#]  h I΄ -7}ā1R }4HBb0֞J:t3sPU"+{:Cj0֣PK4ns-d&@LS Z&EtEYr 8LP=}8}kˋXyCee%&M"//ÇJKm۶ݛ@Z-6660z4O?43f̠f/~}syM7Jw: ` &E`~዆>I&A+iT|< ^Ewc<:_R z9\J.~!Gث*[k;l xi֜8>&;fn{R`!Jh9de@"W@'F;%KW ?dw̸J0 sz[Fޔ\T + !4+7<5J6Rq\{$G֏/f:f8N82,3jYd=+|ʠKotUmUutYOIU@W9xC$Fs'gcKIH5ܕvAv-ew7Yʺ<03V(2к@;vAW֞^`bDFt0"+tJ\v]qS\OB;A4{+'fL-dUAY$%mL X/#KWH9W>"= x\E*Nvй T~QsL%o͗ʐuXv}! ;wޞ{y9KKKFZ}V0aִk׎؟k:m|a:v@LL ݻw///vHĉL8׺wN\\KJJ6l 6҇[=z[EDDDDD0<ӨFa{"btNkr5jk׎㩯͍ZyHNh׮]ޗxx1AwU~Yg8OH K(V)G7,CPYu2zxS [hM׺m!.ll)1J4ZEbgm?/|6BJL|1p', z>[p.-{(#ІB)KRɎx! mTkVST)> [*$DrF^YsW0z!S~nY[O)`b+%I0;̶BoBTwn(ݙbѪ43u5W[x~VdwW܅g)Tc9ꃶzn.ޣ;f4IFqy*< !0<ՆmH#ѱ [<7m| v%Ħ&SNc0kZCI܀0bro)#~9&_9g!;N.Lہm}%|SU A"ȯ1vV3YEW]HDDK݋ .СC$$$b/RXXȴix~~}Ŋ[FäIXr/_өweΜ9L?_xQ?駟^yŋ?FTҥL4 FÜ9sXtCzziYDDDDDD%0-XК>tR\\۷>}:aaaئ ũ|glٲ7x:p9dxzzjwHSWÄF k|PpF@p5.aޫ@~t]'/e~8ts}15tPeoPeDr 5p& A ؖe _cfdGs矣5:HЮ;PU j fʎ`9t7p:4)<\PvI>`k~?ɡ4dGsT2Y )8˄V:PbQ ?؀t%v$LC-4ם fn%:A=l;40<ZIxEt]j/\өU ss8T°S0ᅾ(MRHWm13wA[AR)%<鐅4NEGGc I$88$>09@NQ}60}uH-\p1 ,0ޅ#X,QlB ظl㺽rWPf.?'PXBDܪD|ij@2)})>vnD19<=V9tr{bf9d& \ TU|[ Tr~*AߎlAPjt%?M? ^0BbTp#UX>=pC2Н:zƏOC 8KY_8n&JK|f Ȋ]:"3jY YgXTچ{#{7=X>5͘hɉ1Mb{ذwSTDБ>0}?6(z4su5g/fm3XdnJ0x0렮/b(yXǙza|z0yw/X8fEE zw'$9C\54!ô4`+p؏:j M0`;he&PD99bH+Pp݀ c LoT!N^PU!T(Hh#~@o\ 팠u|TzP1(ut F1' Ǘh̀kr9aZ84ݚf'$-%"BPiБ{o﯈ߝߕ1jy]رc,[RƆom*#""""" b# wMdl*_ׄG_+5^GcddNnQg2h jkkYb͛7DDD%~Gy`5G&7Z25<8 {e5!arsLŒG3Io~dJ"G)O__PS M ^~W͹ϩ-sXd1`V*|.p+w{@NZ2~(;@@е~h/$a ^}<0Tqk+J(Dpg/H-BvCQ0P:A̔")>3)4@W[_ Up >@|BzqI^`e^堕,Q@f)Dc a;gc#Ks)#쥾Xb2 BT@nE%N0y D ^1nk[&iS ݌W"cCR JKp AA(s =Y,|Sf ].p"d=8x:-)˳B+Qdz+8sȀ&6q1i )BʈQ̆˷AyC:ȗA  h zeG1q~y8#F`Ŋs>3nJDDJrr2lܸHbcc>|8111ߟh"RRR YRRC+99orFͣs1j(nܸ+~پ};ӧO 2}R;4h~8DDDDDZ~ /ꊤa]&I^} JGR"0>22d2 Rٽ{7̜9PV\I qwCkG#Ǧ9͹uؽ !a-{ y ĺi&,Eٽ093ZT9EKieJp|:@SPgľDkJK F`b.TD (Ь5ֹ "/a_O< ٞYH UK"hol()8 rTdbuZs@]yDQ4!5|`y+qwVu`2S73 "l|%1PϦaTthb6/mbeAxֵ/W6Ű;Pu^܄z+%9{3eIHI6LB0x,3|w|e4K' oT ࠬ m~ojof6W j(`V|+V9P 6@p0| /ہm=Ss=O23(6<ŋygY|9UUU8;;3e/_~_;OOOxꩧشi-[ɓ9s l۶K2uTFIPP7onذaxyyR]ׯgʔ)hѢ߼?ڵ ƢE0a}}%_oiO?1qDXx8DDDDDD5 Ͽ$8>CcP`M{75a \f+H,~p+L^CWk =tj \BzHA0=cZBP3kL>=v  %@K[nBFIEc>}tti 0y}wN\I) Oiߐ3r:ƴ |nMdFZ3C_ f9:-d@3sy)D+fQp#6.Egva yȽ`T~SHAgC ނ2Bh E 㺇 j wx`BpNܪ#x5<& . GM8qW۽kȿwttȑ#]o߾oY8~xƏwW_}dӧW^}zbbb~Ԥ_j7zh.ϝ;7of BLx|P/lO/ aٱ0U5jZ!`Hh66ֆRXêU$:,HLJifޙI]4=oLP1W >nl4JL?k IDATփhlpГxo71k\`,R=f?'*e ɬ770~y*FL;CM(|_ e~4I :$CA~7Rq"8 z@ Gِ[\E.tu _birwyrm &\|3 L`| PӧA$0ޮ=1- `>.B`~:8] iH^(s l@pΦ; Pؑ kaB! ZS)̎1fpUހq-tā~N#]++ %A:z&~Bs8ysǹ(mv Uy3 am5S7,h6՟r{&zHl(6A$X}z1HZYqdJAEêGm(H;8* 0͂NҕJx¹9./vR^Qp'`P(V1`P˓Ya:Dȟ!"""""""""g5Xߠ4 MԔ_>?h_1 !>pevZUae 3Sz@HCA凝W0\=]0=.iNZpU <pLP5\nAU+nbJ:g؟C`T'C~* YM\l ?a4BSS` PPmz)0!T;_f VS=xFo7Mx[G("""""""tŤQh4<~IxlAQ4y@\ׯYH)'@ #GDTby+9-[;GѰf̘AAAD~"T-EϿQ8{ M#Ϫ¸7)3yf:M.hg݊wz] !oZeK̪HFjt;݄ȊסRWӳ7^DA$?$ٌux'U,C0<50- NgV| ܱq@ma 3 %i%xi/=z) l1JF= ΂>JL ;=a '\b|yk@+ST'>7As%Mc}ao |QpKr(@Oqtpj4`v6 yKq-aPI$P[S7Ȏ;ŋlUdž=Dxʮ] Ψp+d|{/ڟ,I;%AdƔb_x (yP@pUKfByP|dfL Eհ1N/u{S=EWѯH5s"O`Ō«o_p~cR"|wsk38.R w:P _ng@x30'ܹqCE bH+ >V=C/ښݻ3p(>NG||<[23YԧZBj  22R)8!~wn 9.x~q:P< Jt1D΁,d,PskH:!UB8TS1{zq1i!^OEc K]k؞cBI[@Lj!LeW03h4]P tTlFt0FTA< BOg(3kZ昂 Z(PX C*Auu ҌB5Yzha' NApxX$e;TL^l8p@TiA]VKpO7ROS8\Q>EgK9zf ݭ$zw+o.nl}XFPm \&4 Z{1sp?w C7 oKV2`%E:Gd+ kNUY>7$$$fx)R#ɀf) fU62t4 2x ;p Sȿ1ZDDDDDDDDD Dt8Q*rRRRHII!))ӱuw'<c"ݯRZ}IU"ԁ];8R0Ǝtr-,kP8*%m}>#8®Ca X$W6fYP“ XZIJipE~F4H8܏gPp~+s w](x^u%P6>7 4Ldp48b#\kkPaes3_t Ywx@WFy1C]ڝ>Ik38¬@kPeiBå*!۳aHAJzm\9GXfdAJ>g/n@DgB GLdRo ei7bW{:I&Cxx8|ᇬXcccJJJHR)п[^GaV>̙=ɦuثvdժL=!:Dxn"^t'.F\EQz +a|sQ@YDi`ο98] |!MV@Kp>dY#5/i5dzφU3 (NB4vcw5¤ِhk 0u÷#U=ya=̈0g5X)8M =:LӵBq,Ȑ 2 &Irw/&VlA(]>K] \Ip)v485P 6uG5=yh=m5QB][&彲/ 6ƎIWjHoʜ1غ㜼 =C0js ~Zg5`=SP^l@qR˻ +ߠE%t7<+)*fJ^j,4*@a-A|*l{g bFQ":EDDDDDDDY40(g3f :t`РAXYY!HX~=|lmm۷/TUUၛ "..?~ w\JI go2v`Yް5#BYj]CI9{ Hby2ƼFxtBȭwA~.+$0Ӄ5) f[Z+]1b / cfIIp:}@\ǡtqdh~ )] iƕsj|_ ~ට_EXBxs`#X{BTX8$X;o)he&vh|qSp ŰUmkY?F :B6{qK[EZFRqJU9@ ѧYiԑ ѭ!]ƥbZCT$TNiӧ8{Hx"j`'8k/BFh+ F|i/ngXKnpH ܑp'6Ea:2C|[ !LH,`}fuoka7X2䘀qz?BK٠|KE(xlX4Rdʕ̟?۷?MTTSNe˖-(""""""FiƐ?%8i JȻxxxСC ?昛#ԩlݺnݺIJJ"%%E<^0wѳ< ڶ<7oh<쫶d?6ZM5otcu*S2Eh|U ~,R}/`4 7{[(2=6{PJ!Dp5:TWsKCm_@ l^ sTZh׳/7x:'積d*AbVA{EGw艝7XNIaPe _: GaY0jh ZDm t@0ҍȯOw+N4]ǞB j ]jhS+F;Ō'seFS|M?.1僭y|}j .a=`Y 4-lۧfW}ej=u"`؇6f> ]5T3kphF=T؀9[J0:v*SKx:A.{KGگ]"\1WC?߲hLm!g|Ͱfxzz>ѣٲe 'N^y4GF.ºs珠:Pj 0/A(rhs ׮a1nޅ,^| ^"gЂEn :8^1V0Փk tB^ IDATH[tޤ"+z㡯7yC`75ȫaBoAl~> mCf(r1_ua0淃n@;ʆz𨯀w~eEcD]$T 111A廀ѣGhă%""""""ptlìErz)Spvv 6 gggrrr033lpt JEll,o͝˚;PƊO}=o+%ppOHj \C(:aBn/բ+4Vn@fJfG/V{L7Aq`v-v_=$!L#Ņ˅8Uѽ勬{M:j<՝}AX^G7P5p /䍖!0;أ.ko&1ff=ck!uzAzdӄl 2{4EGC{{j EfdZk%\>59pKMP l6ڞ JxW?CR-W`0(**"22#Fs@G1ZDDDDD AQo ___prr‚ (++gϞܺu TJnn.'N$##ssslmm}c/-?;Wjy$g1; P%PPf JKf\ QP"n߁b&e nŪx:2= 6pd7V ZB&o2ܪ_(Gg %@ڸ@Uk.%àd&2w>~,kO^6oy,AAL8b6C!Wsx$^RFP S#c,D]q&68Y'6%OAK`_hD ̤;rRx ؐYuL,#׾N7ߢ4fB?j  㽵kxklt|iE9I`?~nIڙEAqi!y'琠ǟ5w+uZIXdP CO7pˇava}Q&?1%W)i{AnJȩxD~r;8l6P^%ρYAt8[TXܜݏ(0>`0X*T?Kuu5EEEz:wLzz:֭c8q+Wرcܹ3W\ Z;?>>>7Ch+ s?W Զ3̙^~>چg_`:CzX f6< P,^ʻOb  OH@E1 N6:w8pe/ i Y55<L/6Ah19 g5ӣ98s!.,A9j\  Ծ,.UX?ss(CY 2}mTC6j( }0΂*hΊAZUhv`~՞2_O !XZUMQ-,.RQB.GLL^~g܌<]`ZM!NCԇI$0^El-|GgAN2UCKU}>x;r$Mwt/Jl!E"(2T({+ *8@!{7-@iiJn4]iw=;s<~]W$p;ww-80GlP8h ώ5_s6fcWcWpmit`` j>DaDXhv5R+`DrgYrtl6[ΪU#H$g>V-?aӦM,_ł;fȀ;w. ̝;N3{Eӡj "77WNm+3m.V4$>Ɖ G<DfQ78IדLp +H`㝰pCホy4b %$ (x ؐ:xD /W]Sh.wxgv1/p8&K :8T%"k g0čߌhh•~م\h"{Ȫq8"|xXm𞣆WBd q v1>b=i70 b' U"С;,jνM I:FNI4+uՒy:Qu."'W,5pz1_'n܎]ٌrȰQ)Pw xz@ @v65hI! %g`AafjLںιKQZ֗Y/c蔮ky@A}CH(^Wqrd_ #ՒmJ%cƌiӦe˖8~۶mj9qD"H9IjF~sZFX,\x@^xz)(--+WrINII GpU$'S AnoW! #fyt@TK K&PyK9d J-IZP5ÍfMĚ1qpIWE:Z u^` !kOyk ˕TNCK+B6 lPSOCt# @^\}0 )DHEgNl t>Z{ !掮fJ/oynфqڞn;Nf J.~d Lw~.7䟂ػR dWFݷ e+˲ptp g,tOjx v~ rߨij(fg . a;? `<A]pﰁzU*. maH:M+q+nXZgϪsui`Pi. "apx׊q>o[*5p0b:fFXW#:Xp;6~+,N?YfQSSöm1۶mcҤIlܸQND"H$[$"N-h4"##iU^ΦMz*Z^^^|L6 ^OAA2qD"##ݻ,THX?h{̙^F>`L-?AAuf*,in,/iي 莈f勦W:n05B=t@%1t }U5 =6vx[EDyy"۠l,F'[J?jᄙJ1{n@U JuvpmQ ^19tY[(!~w #]3̍i*p[ 50 !l-Ǯ߸6Qs7!&FDV_Iӽ,N~%gr\_4)'J,cZ7Sr=N|qIsw3}qzOuI| w:Zat-Ԋh!{ä(Q3Hzuvp &j` P[hC Fr_(EFN;Y?/#Fp=,Oa,kCd-CۋK~RM:8( 5b%?'ii{QJպ4RsJj)BtBë1܍s~0;΁{U>fBao1΂V^$/B#z3Fڲ׺akO aϏ*!d=~]Qmˊ0~fK=k n MzæD1b~NYAwHkpZ5to ]{+r++y8“OTZ7 @ !VG?W6:_ɧFj`.;]I VMWu<*;-fۚdKfע,M0N _1^O O!VW /x5,)Aɧ8K*nR J_t,6/ݥZD"H$bDŘΊ+ZrY BUUgΜ!$$vaXwrkqVGBijyb@`ᅄzN91f9ȅ]_=L%O3\z<=Yc:è`Ayiϯu· 0 ,.?7 2R-H$D"HnL&ƏO͐!Hss3saԩѡC._Lxx8J^z(ZϺzxa~0(?ȄV;(@*s/4 y?L2wϯE<k(sqi6{14QJ=>2.BhL.aB,Pe{*X.Хk{qp+ op< p! sJ6)Ϣey;|^֥"p_MQC+Vg[ȑ:-%bACC>>q,~FDŽOJoԣ){܇ jzAy0a voc< C:Ny[ %wD. Q`nsh 1.KxKf\oУ3xST9`TZeYnm(qqgA-GA-=B$+T|I9ӣ7Շ B4ӪX<1ڳ va3ׂGć8 ӒSؠGǿ]NabAo֘lw$EF%D"H$0DFFr9رcsqE:u*ӦMCѰl2t£>ʕ+r FQN?ɭ5[&㯼{T ]GB v*ミ:7U,!dt|>z|9GFD[57׀C< j C IO8hNؔcfV)Z(ʁ!08txL9̟S- Gޠk`gB)-J),7՛GcSHdÅ罛_wY/Ngc8p ADm3[}P@pp=Bᐕ_EwCtEJJͨ6-Z{`} @ k Ǚ%#12R-H$D"#tܞm5ӇI&l2yK. Qƿ=f͚|U8uXXԕByp':2 CS;G`Oy4loqme:=. "o$zϕGD"H$!55~aÆb .]ʕ+Wx={6ׯgܸqYM6QVVKY?:O2J6H+0,Rp)Cn8Fў?{8VË-*HF Q ؿYt8нmu #70 zeB0P XET D-?ՙu;KVp~;5FZm$ uf4@lh ?LGǀ/U4p &\[e}:%УhLJj.b`0L]8vi/  8[@ :0B~DO,`86 UGX{fn\hJZ20_&;~<8h"T_JX@S)yPn=EP0EPZxpff.8R܌ V(Blp)9ḑ/f ИJ|WNCSסšDrUzjyI{hfnK$ IDATxBG\5T7gn ;yoƎ&t35 U}t8r>I$D"H$wիW7o}_}IIIݛjJ`` Mx<3_o!?}A7Tp9Ba*Th _Og]8L{bk(wB>x(J4 q<aD&@mk5 8Zzsx6O 2@jM4勪prM~ xb [w *6ȨS5@wfǶDwʓN 6{JtL *g5 D]X};f̘{'`yv0 H {x'z$ xdž2fByP2r/^A3&MзLaM!E 9܌\.l#HC2+s};kInc.OqAap3__Ek!P:*0"ˋ!"aL4\J6IGT=D.p~~FU>6HBv~8 hM_#:9#dZ"H$D" hdӦMxbRSSyZ\~;O?+Æ RƖj92n㟡 v s !@_`=3p)(!%`MW 222ESO5Q[>P γp]iѿmKd47)!f`WZ;h>^@KՊ(g@yNHQa|x^i٪DXwB\X!/-<[@ku0Aijo;F*/g+dlt]ddR{[:ÖL ~M{+UPh':K!X ϊE =U*^eiRrdt7AH)44dYNL?m뺵,J\ 0݊\kZaԽ6GkO":Sz! Mck(H$D"H ȫe,_Q3yg8cu5?ȑ#G1bFNGSS/bo[s8qMi!Z Z7|sQ-fA *WRhX`| o e!'] O{ X:-O"¡cW3&=4654׈x ļT0pjĘ6Vͮ=Įp-a"Sɾ ('}w%wQlcUTps 5n89= zz%&qvUŪ TPZNpo@w/'BG ɇiVitt GmjZO=ua-0|<6;iXE=wZ|KhRՒM|+ɵ؀WG^uk(_wn=ЎM`3\z8P?l^ lBfNp- B l9+wO aw͠H$D"H4QGCPUEܾ9ֳ޴iӆcoo3aaarqEt?pc^l@BE2ԙ\}v!ŧ~eNpNą+;*! R8ay& ,Ű<hXvs h a2^-ts?57/@JB":^)lu#\sA#%ȝN~O}MiҘ(.E tn Bt UNıh'Iճ_@~U8ζkj>Gp4; .I#X)Rە. ?R`paf90/+ SQj5 MPlk#pV\u S(* SOc-9S. AEx,3gүFY1kv\$!NPUN`-5PkpY4yrRZ<>ׄw_]. sEj7J$D"Hi #8.r$>>sWϱb F#k) :EEEL2^zV1cưΎsɹ#e;D_\=2B C~=hu ư7-7Iħ+JXong@DڨY_&ӻK9PWԠ0* ʊzq7Pġ5%~}0# ']>V&ǒ畱57/sx}T QS*ۨc h~=ҕ3p}:  #ĩBx5v>#F%FXwƪصifw.bek:ڦ,%%wUt 7j@{l9p*#Fp l\1MGGx~oCU6spg qyHF[ȩ?eZ"H$D"s0,_)S& GGG4 aqillԩSreY ~/K~/DCO0&܏?7n@ X|f״P~ Sq `iѰƽƸw oIuDDr]~Zf,o`[ WX% pz3ŲdvÉF[_$8JD|00N}*a@QRb}'aC`g;3g|+ 0ӱԛH~q;jCM(MKȂ$k[֗ [+Ͷntڐ!+ah lU8Ymp^gH+ḵ/~9ʓ'~GYaؗA NBfr FBM][A`8 l ݅~).!f궀c=5 a?\އ!6`t.WM}k|җmor`Ux&յ,k8Jn2R-H$D"Hn!!!c0HKK0k,{=g( id[LMdffI'H5zpKq EG\!E7wpm@4$ُ<"7B; #:qW_.C?*aUtCq|pOo]DBX5;ز60._#X;>md+SݔMlEG?Ǚ*hD~DoDse6 Yq7AsΆFmr \o=3ӧA-fhzwGGA{^ϋײi^ahURPNWaiǤSV1f"-8߇F{IT^v7mCOr95 j U0Lc 8k(l~!;<'6Tw`7"|!m+8?|M/AAf'o됖"{=}(kF{b8':K~"7dZ"H$Do_:uDjj*xl'O`` Νh 4 ӧOGF!bbbT[P(0L<$&&rqE/ pADe/0!p< "8DWD#PD}:h#Ig(UJru6)#j >D gC-[\̕Mʏ~ɁWw2 t{!okdbOJhjOk/7uS9p|wCY j1u-Zy\3 :,*.((j;aeu*M[N u::v2+ͲeKྡ 2 6:oO>s\׋I3\s1#/~ϻj;ghvjuAH[߻~#RQBBBBBBBB'Jj֯_ZFT lj#pX+`0hpqqa?===àAvϽC]wv:$׬=ƌ3jT*ٲe ՅQS)ӈPb1p-nRHLLDӑE\\W5`T*% m!':n)gH4*"kn4Cpֈ3 )8yM#@8_}Pk]f/A5jKLv?ATؗCN>XE" dYbN';iVC1 ȗf!Sػ;YƋ*]{Upcp'pd3#\P ۜap"z ]0 GKg,!^y-7hfZ= M]zB?{CJ7J;ү68q"/++k@EDD0qā| ]X0ajˉ4۶mx\OGGArr2 ZC>Umkc dCW}=466-vvv(nW|c\\;` IDATm۶묬,nhhh`Æ `0`0dajj*YYYhv4e0 e,À4omF(<Հf!!#R^C2- Q2H ]Uc6:)H2 v:ޖG0"mCrP{ܞ.|C5#uLdyP\ 1Qe2'xx$<}fnv3{~Ս+0g&Z+̃0]a }i(M"c9;)7!mX{(38/1ie-@v]n?CtS)! kJlaL(syt~K!;;0^M ,A{><'`/vBH #*P ť^Xʩ}%cp z„0n7{]x4W`iXflک1N-H[=&݂Cz+HHHHHHHHHJBՒOj5(JZ-fbѢE1m8;;}#""҆eV/رNOe&22fŨQpqT[ˆW_cϟZDUUDEEagg...DEEQU1 jKnn.)))hZ>3?z.̜9RZh@Bj%(Q[r(ЯJNHS3W!^%By#JeNmq`7 $Pl-d8%M|A!.=4"u`"x G`M"mHWi?}F©3{TdOgbU U xx{LA$' =ZP]pB_{Ox_CKho"]w^P’fq@t9l̃W!MFmYHskDGj1> Q`G6p$;52,ND:Z *C8ȂH+h/]'_U+8Q %uc\|g)H6콋Qq:! 6Y! w3w+}u7WZCx(]P|Z/ BӍ]L& z.;"%}+SK/0\H#fRdDDDj*Z!`0`Y{crssD.t:qqqR[[ٳgDSTD$###t?)J%* Z`fРAr)222$~4<=y9zz΂ 8r=Ove%3ydpttdڴiɈ#زe ?0IIIdffoHhh(ǏgRTT?&++"JlBI'%/UFrW/M:Hb$14p_e?'KLqP z0S8Jq#!Mp',  "5d= k/'\>(Ё topkY\ inH=a )Yқ,w\B͆1 7C̓ rxCˈ񍡐o/ (ivXE_LD xC Y{C6n'zU9yokhM|/ 1Z8ntimj; ʭ!!/dV5v>+,KPcіڑYAH/ 꽃CY,;q w;"5\:B@emu?1k(p-]T}o/OiZBBBBBBBB R?K$ꈮEYVK\\ǯ=(F=ԡy~LMM%11;v_09ujv޽{QTߏ-;88`ccáC~J%l&00cb2:t(vvv~$#zOә`21fʧtq1Cdȑ,\\7dffr?22GGG Dbb"/^dŊR[[˶m7ܹH.8={%44ѣGRHOO*QEp?6m7ׯ_oM?+e("v=xk? v4 BP 2!>d<c ddp>"x+HIX> 9odr$4ŇY X=>S8+ws1"F&aυ]@ LY@ˮ""Yn {ae?| (a8/1!/YAE"ģqNqN51U`QB, 0t`X~'579pbn-;iI4P|C(P­A}4+ap1rVDmv=ʅq [^NۏiH~04lA?D/\`p!r!Dm2 Wc"z ]B4J.! =HHHHHHHHHHoIJJ _-~ B0 ΕW]f?nߏlf͚5Jf0a5xafOƚ5kh4L||<111ͱ5iJ5z  &&fpww֕Aٹs@̙3͊Ll+$''h"11ݻw :O;bgg'dffb4inn>S2x`QCff&===?x7v9vm駟rၤcT*&N#ƍ 777Ξ=J"$$3g ?[jmo}|~f'M}7,,AޔCx{{HMM mmm4$oիlUEHH{%++P>zdᏒ\M#...^ $$$P^^6P*xggH:aaa_Yb$*{ Ɏlܸ8ͥɓ'ܹs=z4W0l.Z- F#o111̜91cưyf8|JmTqqW_z BNJ1L1h 5kO?>ZH&M79999ihh7އ Fnn.t Xee2o'..g{+یT*_nic?,smLk a51>'Y /m"]|H>|DK?ie9[~} V௄ kؼ6_f=`{l;>_BQ@4؇?mkx8t W$sfJt`CĭJ0Z2arv:A a |Bn>nk%|߮0yq$ԛ4T'; Uxf/$W`,d.vNr!:YgPn+F!8T{=`'LM xy-4gۆ8]¥{VS]qѣd~-3`)QBN?x4֟Ègpy h[ʞzG14 .OnhxlOoj'RK/*Je˖Rعs*஻b۶mF:fDM#4BI€(<2< 0fP9+uSXXH|||9---dffF\\HZÇǬYڵk\xYY $AVVƒA__RRRB\g'!(2 6>HbD"ɢEءDv{"B+ 1>MM8#S^^d"**j&99n,Xt :ロCAnI"88RHHHϏX;t:*H-[ŋYv-c̘1?VKww7177W4{{z"d…ڏNLDdL7ԛj4qq7NPZRiTXd#?bZgV73tã Lp0[H:Q[x&qځn⣍2zwa b4ݭ| 5\108L q@yuy8) T#Y'`+ H?q ?")l BǢy p;wa{抝n_A; vkiGGJ7iA} ^^ FC5@X~"~7?;h7BR4h#`Bg/t}{zz!xd}$x@ 6__k(ΝuCS?o0xe毰 <W`3<)CwӠpv?X| 0_}<:`wpBlllX`jTM$''vQt.aH|2oO~@W{MŴ0.J;$66~ '?? J[aE '::p9y$'ΞeʂxzzIKK 3twwcee#QQQ4551aJ=H2̠w}wwwL&,\97rN>Mpp0ǏF`HN Z-Ά:;;`0PWWGQQSN|rf3wqšT*v|hd21r$wK^^|j?tĉu]_'Fdd$3g$77{oA3/sIpw1hL|M O8[I@Fn/6Q  6!bA$ޜ7EMp>;A'0߇,/v |w ~ KۡPoj}oZiPwUIVpLSbauChRR PQ2">ce|mi#B֋^c;U0r4@ܿC5^K0 *߇mϵâ)˻TVVHgHx7~⹄80w2- OʋѶ"}z`H:A$Xoc&*!*`B1DseZ(1\$!2Җ`0Giry!0rH!;;>>G RIXXuV=3Iiub0lqq񇰲(ΖԙGTTG!==`O^u>>R^^N~~>_}z &`4ijgسR7 ((cA0Oʏ^n$wWeĄx@ܹDGGo>IMMFѣqttd2QTT$ o:;ihh?mĥSRRBPPv8::lllD3f2y&''JL&UUUs=GUU{)BRǘNaYNGIe˖-466b 9r${T\~Zr9-tm}}}DFFꊋ #G1L~$Ϟ=Kcc#j'RPT%73xw[nBH"E6Ȭ) qA| " M@;DͰsjVxiQ#<pOLҢNm- P"ڤ[XS cX8l/ CVgF58$^kHL vnƝy$ {-P}.7AC'{DN:XX."U釐i{#4ZڦH!v`>k{k"Fu2CF5ZI<(lYoW[D² nE0jzJ#vG wiq/^iUy [-ϯҴ|?;SN(_:K7Iג;7* :774ȳ:mm`~J|72R5)NJ8JHHHHHHHHnp5G"I:1TVV… >|8Lh@ "||P [l*G}S?8 mj.HNkI);xfcDFFbggG?r($>"z\N__%%%| ("I9Ƒ[nfv ׮]"##Y~=*Z466|bM~SPPv؊ NmLڙ3löTjDqqq̝;oFG.G.T*>}:_n (hkkʊFz{{Yr%֭C.OtRt:Jzz:qqqXYYt:,X$ԕ QYY넔stXQ:m'O΂ (//';;f̘All,}Wfj6nȘ1cHNN… ={p<==dmf߾};e?,j]ĉ7OcRR/_fΝhW~T|_!-Qie}p2(,@v ,*z &l2')hmBY[bn]E$umBM$O[-ic9 Jܪˡ-]1}+"jky4fɱ=[SW&q-$VI-$iFokl<"w ۳j}rۥe7}ɟ;!)!! G Be:NNț܆h T*ձ M4V΃ DD0؁l`'lqmr²Nv`ptPy)8a  5ePZ'/"cQs)<~I8 ] GiZBBBBBBBBjD b?+xSF )KSP/@n 7f38880zMԇVrnVۉ[OQ=y^^^F bҤItvv\.ꋅD~ 6eS3wX)8q!C`4tbE XDD.S__$''Nz!x{2///<<̙4ho .dĉc6Q(d2 'Ofذa?~FBCCQT曤_3<[n駟l6؈72 ZMdd$gΜa̙\rD UUU|͌3~s^-[j© [u>J%^^nh(PAvk_h.Hͷfľ=`ŵ{y(6$DV.aL.$ʡ7$0< *ྗ4+p v#`WQ̌{P6L+Y`h:_~.`8PUx™d—ї |a"Y/MM3xB>0N(u`bm̿‹ e+賆'ݠR#}A}c0tT xء]p\<:,uB(z {L`E OHf@<0?np ,.8S\zEJqZ$­Q<~"p!!J# ӢXx@j^I3xQRT+s7,]2ߙ(JT*:p }~,]?ǡ 'OT*>|8FVfGw,#Jz=TUU>z(chp{&khKH|JJJb„ xxx`mmM{^5 EҘ\SL~=Fbȑp/ ֮SENdd$666TWWĆ xvKWWcժU7Gbv2Ar 6)^< ed0踉P`D\`|cͯf}c%$]p"!X, b sNVZ[nB NQ*T3c2d2'x&$"(n$;v`cG]6ϰ跖3OHKK _~%}t75j21bhP[[`ʊ0(8߅ ѸR__{˟#@+#u5F! SV\B*++F{zzHKKh4xbh4444A@@̙3JKK)++# kkkBtWFiW)%ٜ|0z)|}}yߟ!Cg򢡡1麺:&L@aa!îl&ΜF!$$vy1 ^ &`ooJl6Bxx8/˗/'44"JJJ[nAPCvB6%amFC{{;&]&xmVV YYP ǡCA_T_:D,"[ͻsQ]xN[߁>d{ kN}P"(aORw]Cnn^?Q̑0nLq+|'?"Z:,"Fc ^ (y uaINv h(FZ=3Z/CDka/^u lafoj1lDd O~77,?q@!oӘ?U0Λ^O`,7Q&vLP9$l2힯FUҰvt% -%1 [AU?8^~pϞ،Ͼf2s&S{w^_ h XS@ZF fdfVVP5oҿ0!u3<̊XW}W:}t [[dux7򐫙zꂾn8^ BxE@;T (q+y{-]Euuh$h!=, d|Έ1et+"]S 첇967LW956 `5n9F蛠A<Dr4"gF4b 8NX\0rnľ{-)A~#u׉?!]K'9;iZBBBBBBBB=w^j5E`˂pƾw/P_ݑ|=\.o"6<#G%gfrqp<5V׬#??-[0iҳ٣#Rx zoٳG&Ѫ@-5f;+Pܩ/VZ^!=r5{.qFLEe"'R^^ۉGގhd}zL{fǎ̘1&mRPP;;v`ĈP(hoonڳep\JbӦM<3|dff2tPd2%%%hZ΄&OǦچ`ܵq M5& ȅ jNښ?gyB,X<7*q0U*@OO ] 4<ڀ)D'Ȑaoo@*Q+~=dсuuud2X?w|uLf&!!]@ vQ^(bCAJiRB Ht{/:{v==}g> 3<5a|&=ZLo%P(2j(СC!1XPbɼ$ zCv+!W9yy"wQ l适qq&,E߄Mݝ0o_ \G$,gѳ2-R/Re& e+dB~;J` Y:!n#7!yXh /B 9j&!"zqܡanbc,ZLW"\+zrƝ;p"kda*H%:F#&0N0~PV=,4!ďwR00v?xQCΓo]GXX5NSS٘+H+rθEѦY|9fVKOO477ùsg0:s&!!ڊhD˲eꫯ[yb߭}ڷ2j73(..F߲tRiiiaɒ%deeFLL III 8_R899pB @\\ X۷w$`١l6Sҿ7Za`Ŷ0`䐛{-[gѢE={q -l:ӫ'~;::6l+lق[MP|-ƱFFpi6̘J;4-} Gsx`p,}xFY'ͅc3Lخ晐a/?M"q5-ӈ_DB 8U?a6.RT?i>$C=*̡ 15Wzaey\aven{6o1aw9vZ[ke5c)JObI ڻq#eRR2*XZH#&8;"z8Z#6a9-zPP~ѼuJ qY?!jaGDDt;0&T=!”`w ȫ-]X0%"hj5 lNyBf 8܆;,(1CE>"Db_Pl09Usk |oV<rI8UИz$;#~p5ʥ+ZBBBBBBBB⟏#NcByt/2]FR:o;@kB+SSi043s*æ CVGGGCz#C`2fҥ׏?$$$0o9sP}&Uz.n;Lgw~=TEV1m4 3zhzzz|2R֧:!Tv..D3h ȸ;`H.L+bni#e[ 駟xIMMo߾wd"??hjj|7)HM#D2-^̝;|y>{\d&)ݟ;w]?5.5Ierel%/MHwjĿ/Pa*}k^Lo=4̜T; 9H=磊|Ȩ2D9p߉<h|ԟRxǨzmk~nR.obe .s=^FPD:ŭ쾴7q, j2+(G|xc00 3q0d=tD~:t@qH9edeyΈhVzuH+DfíFn!ڜe12lS0G d 4g* :Ó P.*`sd`'Lzb@t")oQ/eqo,!+lۃ?MBbΖӲ6sHiHݟ-ҡ7q6IHHHHHHHHs ` =o7ȑy&z ii9snlݝ:t(T*֭[L>nx lllGX4*f222n_~{{BPPw|ٗ$۫&44!C?nRIJʞcȌ(._`兇D g5MlݺKoaccE5>RSS`0M=&WV'˗/gXx IDAT'o0rHn@ww7?*Xj5d2>c(=wNKϟg 'ۇUN{x'9v9s̡n|||[WԤDLL 6T~ EbB"qH+I,..W^!11t{9\\\h4j"zx틾DOG\Æ #g0#d,Yw}x݋]@s,=W9:J<:]s3Ja"+X}KNKoEdb)11Đu/^}6/8^26ʌl!Mȯ#44SN@.]Ȍ3"uEr `ooOuu5]g֬YO}:SL;9˟"3>>Æ &11;;;FŁxJH75rpqf锖LwryyG466RRRBSS;vۇ1>>3gRWWǵkطo㚛Yg6ZZJȜhllښb8qL&J>+AgcGcGݾ:jGI}֒kihФEo;ઁt&Nϧr{pwe*5Q<랛)ϴ_1grVixy9/߱wa571]`w ؄M#&s[/j%wb18z@m(ѱr;AX9v7Pjxfr&ڃND㢅6{ έ " 2 ([BvBzIdErυY/A(x| H)?zn@*a 6nQ3| PCV7T@c78XZ+1Ż,Dfя:΢& p~75\-Pe8-|NuKr S,7 9[iI) ǿ}KB⿘g'= \/8 >UUU\|P |Ijq/F ]eM<1<<=񯶢ӧ$22oJOs\.'n}?>ݻw@CCd2|& 1)s[7AAAsuÁpETR0q"!!!S]]l~Rh.81ө/VVVٳk׮;,rdkd0NoϾ}x1L2m4g֭455Amm-鈏LJ֔V=ºuXBR~I[M{ֆR R /@{{;N:psscРA,|L&  E\@K` <9v1&"&6Oc[ V,Ql[!i~rhkk3lݺ3g0dMF!))dؾ};s[\m-oNff&sC=Ă XbVV;QF"RK viphh<ʕ?D"9 xڒbq6rV Օr)UҒrڃ7 \@~(Ndl,$ 糣& ; {1;Z-ZD[[7iO,BpM rJ9Buu5ImmMNҥ$Qq#k׮&@NNuuu Lgg'\zDbccYp!&4 JVL&#(($6'6..&..Ǐ˭?Rz>zhZ-;w RSS% tYN]q1FV҂^GPン3f??dr9&+]Fm܏ə=Qϛ?<4v'بT%D"s%GM4@$p!#Jvb)ډC,K8mĺ;IxTO{[n| FHTi2AV#.F?U. Q[{;fP2X8 a󎠹) B4:DNIU(A HEH.DӖX8EXXse`c/ 181x02`k%k0$(yKۖiyd9RM0] 'DYwe{]-2*!p5]|~1B f X:rkC򪠭IH&DeYEzޑwr]H\%$ w7J%$$$$$$$$% ?g`ѣdTVVۋ\.>˝0WJo宦 3Sxꕙ6VANii  <R`ݝlh4̑#Gp@G##U#I۝Ɩ#[Xr%:k׮1uTfϞM}}=lח$Hd4gV\ɡCq#!!ǩ/'`ꥡun;cPqu2h 8wO?4]]]jlllhmmٙ#GpCλ{4H?N){SNBzU:'L/ #v5sy{s.nHg~羅ϰ$*4jkk4iNNNٱcZZ<} ؛Ln;=$#xq0[ߢ6I)Kѡzw{ٻw/dffj)a?~<ߝB]2s1m4),,dٲe-ّA*b1O%@AWY*|GDxyaM]b"p( ?[r„ l۶L4 sh0Ɵ][xbnfw_J~vU{A ;ϰ=kٿ38. 9-1ANY_ z7nTJ`Kx['-nc9g[ Od~JF*w Ǔ'!!!!!!!!UMe T1|h">sT]2P-޹&؅Lat|ǾHa7j!t DUTPSSC}}=tuuq :::8uNNN?~jN^^Ǐr0޽܏;j?^N~,\h%$o>Lew%/"?}6蛚R_x/x0^GAKL|n"%%%j Drr2///|}}5FOTlmHqwyeRv JV\ɡrڗl/""jjj ~=E ً26nȎ;cUh4kf͚E~4>>\x++j;v,,bgrΠ[#&y'}aL9 qEIyI1EUamm ȑ˭dUu6ceeUȭ|5ib g ؜w>\6 R[Y}LBD?.O˰1qް5lC 3 L *fd;gAyG􏰥f?Ƒç?`}pZBvT2Ry+x[|<x>!q[KCp4k ba zG9 xbmljm`D(Ai4T8xpt [gF y 11p6 Mz3p[O-1 6>Plq|Y &Xh(~!&"z=j˹<=t4!&W7,+\e]үf~p<nAǿjޮ3br,?$b |UPpI35 -+u zhR_n5=[unnϊ,PPP@`` vvv{9r'ȒSKصk?8]]]?%zí[(**.\2~!QZZʣoCV7͆ oogxpd2ijjƆO?+Wit'&z=3Fс?x1'0zhqTD zKbSOy󰲲$,YF[[ _v"57uP*TTT舻;Æ u Z3grqj3gg)UM[7= ̥G)..`g d*Bo&qqq444`E(JwpYuZXǾ59¤ y4D~}\яݿ 'h\u0yHyb9. YED{\&9dDe# 0T0co:af7e-S`g!σ$>|9o܁1e-~6`lj -߻W㷝0 ~iӬMfi<˲/&@;.FPɠWo!7- g!J?G=Ch\xX/@$E4: ԏ!Fw8[ 0T qM0 ҕ}@MBB#yrh{Ĵjc4 Q:"&B$'-Q-񟹻%$?wJ%$$$$$$$$Yh4z 䏫w!iL0CbEgy3nشwt(zk.^;,Ws·Z[[ٳgcǎ`0ܝ|Jnn.eeeĵap7pmj5f}:yyy ǻֆ-{ϳz ӯ޽ :+NۿR=Јq/OLVj>oG=s DŽqb!SݰK1}73 hnn"\ĉRE5r9T{T3:r4G~>|=N IDAT b˧zesz*Đݻy4o$::Nǒz֑DV\IRRu1u4v6b50l=5.>thbҥ۹7lΝ;Yf ָ77~'[n_YIln.=KKK)..fꗐeBN|6>,cՄ؅w}O<0Y F[K2{ \ŰzJЏܱؾ!^XCm=[=8" g<{,;ъ?EK pCE?zh{LFt+|l3\]5ٝu`az:EG ~fE A3{rkM8b2%w+ŀAit ?b5"E8(EHYZ1A;*Jcf^m9˲ۈ2gey"$oYyz(v3AZ(>e K= 1ýp ^"#GX^ r1:QB(1d 151[͝Fҡ_} 3qv*ʈAK~q?7ZBM}S{PBV؟_lNb?ZF~/]/!}hٶDGX93, Yȇޟb}zEzs" z{{eСFww7#F.,&Rw8y>,(m.ŋ1Bl`2vFO[DLd"DEENc0~xd2BټcQ("Ԅ-'K8{yS)++CTP(puuET5j#F]-)(+Vjz.\@gg'q2M 劳32s&O.\Ȭ]JGG&UU 5kPSO}Fgg'c~`Μ9Qak4c4… Ύ!CV#''}p%Ņ+VΉ'8u;eQL~G%::(~qŋ3aJJJv1=cX6k455q%yQTDDD᜽>OLAAdffbccàxfƆGHN^xV 2M{c<oZBAtt~~zΝ]uO|[gи:kpzډA~FEquرcZPZZ3Nr8@ItnG'e좪'>{} Օ2RSSioo'88GGGBCC^Tf,pq =bMooo\]]1cFo<~bȤ!#uAhh(={Nt֤feZ3Pw>zO=$?s++)-).s7ھA`/%.;yѭèlFǺ8ZGfە׸^u= O/^J⣎FܾW\B_U_(wҥKԐŋˣ 8rb]͹Α[ O>!`.NP3.gQ Tҥ˗/y!FK ;m*QɜzP|!NGee%  wip%%%44^<xނ]##G F{[)oG54t7nfH3:t᭨|0g Xۊ\{/jGxjZ6=""paWmY1&æ|9`{Õ³ OEVg^|T5bHM{cIV-*wn`JRIH#@NN 5& %!PJB `L3`^**ʖ[ɜyYsZ^.kkK{ZzBCi\nCdLI7| y@Y!)#BTeyv7 ٲ&" z+tDJY 'pP{k_YJp !-b!Zd^>5l3Kf&4gZ Ҁv=V }e0FU"X UP =+Ȼˁ UBV[vhAb!$ԑ?r~z0 2Vd+A+Χq2üC!?1(""""""""_4 b]R|lذ>}챴v0j(pssmN_q#31ZXx1 IDƆ}i0–TVVr(':ȶw? E3y?p9삝6mpaOJJ x}W`r9^^^<ݎ9a=Ϛgůяg{R7P((--ex{{3tPjjjHLLkEqK?'P>J۷эW{5zիWT*\͸]Lj<\gh5KpvmhioHKR݋Sc׌rϟh$!!e˖0|nqm5:)֯XL-݂7v11S7nׯ_'2e?I'r]{YŇ8K𳯳x~_6ڌw٘.{O8J[A.m/ttbl1oؾ߮\ИH>R_UcKc_サ8z{uGQx7g(u.94^A Kzig$\t| Au-|AެU3&{~9#<L9_-;d6BIjsD1JvLAGԤ#p2gB!$+] _ OCmH'oBZ1 XFwùF`,/@!x7+o<Ǒ#繂P?>S |f'xV{M)Dp`n T7JCBsKYCb 2Ⱥgwm;,  fpR2>{H `Q0Ysb e,'Ó/&c\n6B<5C], =O-0wkh /9Z}J8o4Ay+|P̷FH%ys#=0XPi9>UwV8ցҴ&c \ Z0ThPnqdD(""""""""~Mv D$ ^|^5GZz?enO};À ((?",w9ӧO\\\ 8(ҮR_NVVmmmvs XpPEظ0YbĠT*Oɝ#CqFux)//'((VBBB`瓰鶡^ŋdt)^(.c׮FRRֆ=&M֯_Nx븹ѤjӎMgzxA^Za$D$GI?A3SСCqvvFՒŋi@vm6D)K/cRC=f)uhkV ///4 'N9T*:p* sL3u!rss6o/20/-[iʖJHGwGI_{hZ.]+ިj9Q=iiXgy8t#u4X~=GpRSSh4̟?ħD=z3S 6?Z?udeeWSYCw&q>OYd^Ŷu.Lʤؚx7Cfb5bgyWn 쀣9~B%K((Mh5:`Pl"PF*2u6ؖ G>] $r3lV|bAm0rU;iR{b&'RxP :; d xšdlU Ke|d!}R,B}=Q a* u?Mw*m-]f coR&` ܽbTvӍ"lJàTNRN}(ŷoP=(iۓ#'ű\B?'f6or777&Mڨ&t ~X* "ݽHk.#GNa̕KvBN >FR) B`.\ U/pu*++y0Ja?ڞxVx)S}CVϔ)S7nIIIqqf^aHE=Нzf{xiy>"%< !+\"x &##T,_@ykײuVRRRHMM%SυAT|9M+~~~V CVcooO;2聤~W^ 'ii9R⇿L~mƒpʴ ]H i&"*^^Gpӌ;͸DjCSm.~Mt|lKi3@&gzq~ԗY܎(}9r>@S @+Fcj>Uxc`K&h~Gypy#V&YY h_0/bqDZ v/_gtx, ®az JaÆ1x` ETb0xm +x{2#a{%~4^^^H$KPP~ri+Cٰa{!##t1rHO&SY@u!NBi؈呒ihspDi' ackkO= l}?@p-CDVZxzrݝ/'Fa+JqNWF!::  Nb_7aoovH׏ZFEzz:s[ZXsr"~sR@nn.7ը̻ԩSQrlllhj@)¯F/KqǓq( lrP׊{&=lN8{HQQ*2lajkͷ c ۀ1{}0Yt4r<®/N*o/ȳdƥ iNK7li GBL;47 zr'C\ٶ&O#b˙+i|y?|)BboUMA] ak :QXMEu.t,\ yl3s~B#Ⱥ0mnaB( Gk 4k2X>  )-q;0vl(2P[ iJ  ~놊b2aENaNBr# didkYbm ),)RO#< :"D<"p-OUbZDDDDDDDD?  VV[Mpp060s!)qptt;=IdwYf]rW Pk2\ӎo59Y9lLG}i؇s 4Py$A.}?>|WٳR2|2軥/cX[[C \ʸD[[IAXJ%大JzZr(}\-NQh ==XOfL2\K/Dxx8s94/Lv 3caIH孱 DH$F-[Fnn.lh=nNxzzRXXdee|X~ʊ23QT17&Uܹs8 ekԯ[C8:2Օ/m)H<؃(3w?[,kv[9}:ˀoD=u8pS^^NDB~,ܸ,233h4ʺVOtXjgG|RƎqrJ)/u?VHhEtRkcɒ%߿YIZsP[6~BtP{-neIrܸ 8_i^ɏH(@nS/لuE|֟>\*FPvG,{I=.e(H]׋ÖFph &)J-=ԗC* ^*HD5cϿ[v6e !67*dc'(j tz_̥IJcuB,҈pXGz7NE5*_ @U`yHCOA+†+7 ߁"kJǁ,t|3| ;@[ @>aE`o;FAJ TAx: ",B1a-Iw\ۊ<]NVEl],UU@ڂ\υORVOefKq< h4@{{;/ݝGh11d8 Χ޵fk inH#Q*("x{fƝ;w2e QQQ,_s}:2bgfGs Dy+6n@\\j\444PTT͡7Y⾄3fPԄR}y467o׳a@RS>ʙIM nV%;;Nzmttՙc *Z ++6mߟrD[eSh/29pk<< Ν;ٙCj>a/(\ߏm;}ߵzx(5t44 鲥<<Rp ?ʧp"8#GRQ[]̄C0][I{rȥ=SQھ%|`X %Hɡn% :3ס/hF)}эL/ȓX[l@#e=TPna |e5ׁr<!~z.{owR7p !wGkB5(°.= GV9s/-owPa\/~myGG47є#KMTkvn۰C O XhV8£'X߅~@>0@Eق4d|%yB0$ h)5஀TûeТ0^ vPLFh.y !(,g)m3mt-lWc2d9WT# Pͮ PGTR;ΩÊL&ȑ#TWWNii)L&N<7B٠moɉ6Gq`\)´iӐ( ~n`꠩ F4MDH"3q1z &b}S@KX eiՕr,~m/Tr">ARm}>%K0qDؾ};'"m!p6$+S:Cnș3gP*PWW֭[\O盝D܍`ćk(a9otgn"*LՎh4r j8\h}.)h,#hQgD1Lqv&!!ÇuVn߾M{Uy@B?=y<51 $HM3Z?ONF{v/_BwG& w+%x$!neJԿd *_)װ;aK3|2>*hV-.Mp/=,ETu?8~t5P`H33!SzxFƗ/ަ9Tt83 ߇T)'̓ P* ar&G/bibYa;\1BO.og)V%e&0YxF*䎰@=z̠X2>2tl':lXjG? fA2F $?/!ԟ lc BU( %;]I q"kn}4%%;ZأϬCVlJ6C3,BCXD5C9D!< W(%xوp !ԠjMJ.L0{z:﷖c.3TɺIM:ʕ+in2)+Sj@,TWWpӿ[oQ""&bRXA^( uJAA`6I.Iƭ׍VJrO˅dwq8}>LO1ihl On ذj2aee:r1oRL=z4[Rw>}Y[ik'4 3fbcc_Yv-2-[Gnn.zx#_x}I(M߾$22$HDwGk%7NǝO'55dN8' G- 0 k`RHz$%X! ) &CeIևݻw3|ƏOss3j1y,~w5c`\O{r"pҨh݆0`:~cnnNڄ~tH"sT O fV? }1efl)*`U xYý4B6x+L^,{SLFH&HX5Z +]הyRFD8ٳד$ >ץBW:WC4%BA](NGùu"Ue!)fZ b8(azOB赂vHα%P2 VB~4 rG pou$BC2sX1. +y:ͷiiTGVZpt֭[ 2\Bbb":95\l){4wv*; J ͼÇc0(..f_>j$5K޷K33gΠ뱵޽{`5}Xyg?}'kts\=wW^Ʋ%*Jbe5p+*hJ̴z)#IUj gڄ=hC [iD ?"argxaq[KR:=N8RW%c[a`ŸVdJne%c k/GoL./@}%h%eH:1Ȭ7yQJ{m/_u [G;'GH* I` FHAL+ "/؃{+|T¹NPakJO n^УEH0,g">@SN[xlRp4ar|~u<`7-.b֖{֬)ER IW:B:S1lugT2''ޗMSSM J}jVUhivlf2xrjE>1kkF.Dbb"\ s̡d81~CrA>}:a=m7 ?aSaC_$͛R %%zt:.]bT߭F7)))t:ϏN>} $=)̼5(VNɶ3ې8JŻw:s0}ٙ׳ajtvvdQdۍDy"n:6oQTz ^}=&F|S uCOO4xQ :٥ۅՈGaa45Q]Y͈ɭɥ,BWy<6--=,~t(kGgؖÊa^Hu X) Un5ClqY@i\MH /#_+0VL9LMp RAQ`9GXq?" TZ2Y? ~0[=tncWƹk[AC7"X'n}qS[/Cj}ܵ40Z6  `-Qpt[ yPv}N^xCVKpp0{$mtڄ'(F5ǎkXC´W2rHn޼'F"lٲ[[[Eȑ#jrssYv-o&666tuuLzcZFc#R)X 5AT*mqC"z 0rhmmESOagg2HIT^Sڦ, fnFdݺu< Xj6l0yN3 ej5 7mnR__OQQYo f=c#O8HR`cENfQFYYYgf(:T~Z7vtSoԑSAh8/Q,dm\tbiHz`:\|;8@{{;COc=&#t \abt:vv+.DϤ|HO7۽ܼw[{߅sCy )QL73YBmȿ,b{Oڊ\.'`ZBCC1 DZcLjK"JXx17n`ܹ؈SLwN[( \]8H|e E74o BN3~<_}n&f͚ERR]v1h:ϔ>ݻ93J6XJ%*_}666lݺW71ǤCc~ΜիWSUyHm1r"RD!U`p2dk+n 6\p tnjE5;om+Cj(}3)^̔fwVfўJi3߂|)&ӖQbSmS2ocʔ)455QQPAt\4UX}cEeB%N3Xഀ} | LIIq׈΃ɿUUU: 9K<"!t{xDEr-к2V幑2;X@h>~t_CEg^5 f`=$Br NE3J#JvoPe]'m/9p3t)_>{ *=Cؐ-m94E`'xܬ"I3*s_5%x=7n2ڂ pX8NS5JI ÀŦ.o(jlh390)_9+`Bs#Hw\~ K´h}'9> „j+4BEK+s2 WZ !鏐T<0(Z 3>Dhja\_ҍz |#$EK#Ąȿ>Rfa9{3 S EU+4c֜v}\ի7n}ZuV_:Nb8pzAi/n'"ggg\\\Xt)14g؞ՕPTTw}L&cҤI3`**(k(98UXIHH ""W2rCի9s nnn޽D8u۷o@xx8 "!!ttQoUil~9Q`( TJog Q$+<IGT-&-8v:W>TN7d̙j-Q5s@!8v@jROn_*$Q+ nuZ-߾?477s]?N|D<]VȺdh#YFRsˡ[WAQ5Cߒ0a6m WN}HY؄rvcMB.4c9H%[1`mZ`g]t<$ >E&牡shQI|3s皰T%=j%"` k *7u:)V@@-tXA:Ck5L2QHv0 8:vLƮ*.)= q#PrN#x4z6sqM S`8k`akMKU:+Nac Na@\`t1r!LxL}9'>F"oº`'X;i4%eY*4غRxFogsSPrs@ "-~m<ZH d-H V`;8Z 2l o+wD"""""""""o8 wȹvRy#'nZKT舽=L^1jKr9$>>g*._`̙;f+po^F^JyJBVJoG/vs=d ggg,--=m4 xgy:t(&&&瓙h4XX`?`-!v!lÇLOT*"##d dL3f mmmh">cȤ s?Ae SD:GbauuuY&+hF 9,&q^}c}nϪGp؆!5i$b4ZvxYDSA ; h|:Caf4d__`#c}l) } MP ~`8 8З v\k@ MqE(.3 H9DwpH zWj+ǃ'7 != 5C1p6ՃN!<3J~qR&Wsn.}Bx( MwO my($^78x.!c0I:['/:ū_MFF- b,>FÙ8::燍 k?;]33 >*Qlݿ?'?oN@@K-=6Lf^<߿^Ԕ &0n8gƍ<#;ӹku5%j6W˱cܼyg3>>>HRdd<4''DQ`U*Ž>Zݥ=Ȉ/GpWsJKy,7`ڑl۶w]G_ --XX.̌ZI˂i/h kIeP9"LFWWȶA~D>'t4ih׷Rg…899b[qqq{^.AA4`(efL>6\ S1-\Β%K(**b֭FjO&Lrssoj0;;`,-i*i%(&߄z9= "qF1xyLt tZ쳩X˧GY45P~:*/Ndk{OLL07?޵+\ɲ'=ѿqX>?ROs\-=/3rmSaWIpw6a˖;ul3ta`&A/ !(|m G$eJ.)AI芙Hz-HvhWtjqr酏\“ͩH)CNH@o_AD~ .e`i]Jȹ|8F 軬f*Jxs G4TbbpY ]jy-Z}'6CsDts 6}0Өo"gy77JWqT!LC((8U(\QAZ'aR `'|BZ|O&r;ؗ^bI$..`,X@pp05=x:;;INN&995<:ĩ{bsciBU=&v&(PZܛs)I(TSJxJ8Oh̢OG~iBɩSP<Ǝ 011a轄ƢEзՋk+GNҍ$n݊sȒdx{{SXXH~5\\]ZC]]GƕĄЀO ]:ty:iYi3F枼 ?#>YLhj'::A4׌|-wܡ65$H޻^z/FA\J+En/'TJZG6#&&YfўN^JJJhhh%74tb!00<,rĺWWW}1X^hͤIt_ǑSPҽX.$:˝?)(>j8@6[3q}W-L*L>T'q }!U(X/ڬ/G[i . Qd<:KefIYLS aLmnqI2:]EE:b;aܜq20\s{ Chz= \Af Fes}ё6V+y%;?^b䘃A(Mm] i _Ȏ;Ja VuzËr/S+4g,9W8COȂ/Pv^]Qm`WDׄ x(ҀQf0G#er!;YY'wPm gǣ%ظTiB400-gvmlEn A s HGӉEfn}PK !h5BRr4NB+KRWSg܇ߧPȿH8F/S[DDDDDDDD"6l:іzΝ;qqIj;j)~Z9yȱǺQXYp,]]jE[/بlWx] $~r`8H+Kg ,n]Z8к;vƴipHff& )bdu!~ב$K"??^ҍZF&!JKEc"i(sQf+=dǪUHLLs S >>>|7,{},+hӷ2Wd|rl>qq^W^y!`s{\quueՔywz1%SƆ&Msv[7pbtQD/0*Xj #lغRtRv.KM"áAh3zث7T/`xM7UqTSFvpUpWI`?8V+{ 3f;Bb` ΍OB__RTE̻&8y^@xM xRYIBIWxb YxH nצRdQ^^0ǪR'L=8T5Gb7X2^m5ɸ8z ^ul a^] '&ssCH)CrёJ2z}r׾5v mCH1Z݇~T! (!"]!l_+8[ʿC±flhEDDDDDDDDeާOՐE?$!!T 898׉-}}ZF)'*RS)m31w"jQ(1o6ǾǞFF|*}PըjQNTz/3gp jg5.}Rg$1Zی1$$$PWWGii)1d`mW2grss/q wdҥձuV_pP8! )~њ˄3uTj5k;G) 81~1C[?PC|gL778p^={p8ޭ8s" ggg cPBw wM "ۛnXdzc'''T*8; IDAT_?$"t$&l7ySeJƇ… c#OΤJ Jm. F$5>xtWw;a&5 ].eSx8-,_]b =~-} 2G&cf?[gTU-,[ۇM꠷4"5a[4426d&Ԯق_8("uX;Y%|B ɴ:3<ɹt1Xuh,qce_UҪV GP]7g6 La=}tVï&H u|HKDH&: T·ݝ[Й-B1)< m-# } z(EFr CX%X@ 8807|,)g{8o(.K=Ǭ($9l0N-0<.]BH[۵lX:38o"(0q[jJ5~)b(Q/=ЕM<"ToXRݥ(Y|DDDDDDDDDgRԑjbKcsl%fl [QE_gM>OYkS"|#Pg'..z ܭmT< Pxm*++I1luimGsKC23ww^<<}e"۟0+WS!DW>^g}|:xGVwmXFMfD5/C)Xѳq_g)HN NluJs ]ǸeƘKpذǬ& }P`e̠Ϲz[$6ґ/Mcb$1c8mTZ]VgHIA6fZTF6S* 3@BL+PeK0hgUI{Y`^ BzLK&)L醹?.̨0^NFiW_"x,$)~ <= 0rkXhz"UnN*l ŀ D ؃6]DES ngc]>gED;TvE(""""""""32`0{h:D_ 5j5SNڵkdgP[I7ݴKqww'??O)^B#53Hn/sL<777@ZĞ&-~ay66(V e47,c= R)ǎcѢETTTyfbd g NL<O'GޙM ('$2 K)t)$6VH+jWQGP 7:hnnAc|{`]h!%t5M185^,k߾2kȫx7I] +?%fl'Yt4(۫;FBy gT6S)HGl髦WIU}:s +2CxЗ8, ͔i7v5JtA:SQy'v 6n )ҡιwN`@]](  ahPyRPfdد~Aӝ1lBy0  1DŸ-[l%D\:Ih:1r5u]u$%%!J1̔E}ЅG'0ʣQ*09fBߘ>Xq2_s?(g7i>LUhՊS.t݉920E0gld;Z?-*ڢۄۚVh4X:8\+FhX_KKeee7Yc.cؙPN.m < ~>3in%UǔY1Nʬ 7]qRCT”^Mvf@`n]4ptΙSSIIN 33&HrtBci/oe]"өSol#XwBػW /͋SF Dz!^x=AkvAoz:{^eyࣃ:(uxv :lA_IO %a>xcQV#$@0^FT} t ܫWn_:=mcNr0*f @&Pm ?DLA3b$BE $e=ƿd o®b-LNAT ^MDD"ŀr_" (΃HW|i)r.d߸BGJzJȺE[eM֟8͛7155D/K/j1c/_GT]k+o}=g4~}H$hZ9 Sp%}%nq"uEEEHRgYL$@*RUl:IVtn͛)0)via^Cz]EB&te%;jzSzE( @ȑ|""0o<&de Btuִ0`=^Gzz:5 `p,Y۷IJJ""VDpMwmSci ߴxD蛏RTJgVS03gK䠄OBVŘ U 2}4hrk%%KeLa$&&;PDiF)8Pz#4k7Z#/`"cJ4J eiIl@P1aߤ߿du5~.;79iC0յ~S$2G{ܯ MI'mU9_GWNO}5z&|}}ꢹDz1њ`bHr%BOqL0۷3p@Rp';87;>ĔʻHR FYqY;Q= ^ʊ|Q& ٳXZZk.<j&SdBrqVnӫI'(K?ߓ]ܿ?N[w&quu%&&|U>^^:ZHPUS7/&K .M]M۶3TVeqp,,$3$d(28t/^xx޿JČR9}ftdwsxCeK ڸGK, UJqrvBvLFgyNF , t Pi"ld2Jc&'sQ0v̫1o2`5]Ǝt#Czm*T`̝Tϸ9Mft̆?,O~*1DOcNOXT,l(~<;Acj "j `zkW3&xQ>=O)jvBZLsr}y &g'[+(d>%),4j86adXT_8ϥPT iA-VCZڠل@] b -KHDn0d'BglAbsM4erW\X`s;v30DCk=b2„g 2cC#JЎ(axKtI`I:L0#խ0 }5BUEЖs`2xg>Ee#֮Ν[P ^¶nz ._R@*iO3*U,FZDDDDDDDDDH\\EEE\sV̍Gzz:vvv( }^ʅ Pa]VN7spA|#I֓8<>}q\;x 8=! :up,$ ΅p xZc[³yǰ'`֭d]ZF4'I @n_oSUKll,3fUY4nG[V5d*v1t9uӃ9]V;vfM&81--d\`„ DFFR{vv2=_T0ܜ#{~9oseɄr#KZJNCp N[S9I=P(Xaf6Ldd$F΁~̹ shb 隡JT@ϱ!{rMOZbiiIC<Ʋa;F녨c\>d~gkl233EfQD,**AfA#q9 fcn\f߹߶p"dUSlop-~fx{y\Swڷ/5vYEARmjMYԶvtSbmUi](A H!p!$_3oyf{s}>|@INN~'1W}3tS._ϙ&=V:OXTGDXL 4;"6meHHzY0_eP,nZˣs#DbH?sBc)MQ*|Y7ۀP.Y&.2q&Ʋa "zXG'8WJRէ'!,S>$uoZk vc^eH7ݟ4RҍMc;]'tD@IkEB4 O*wVD FgZxrifϞZZ>Ζ<@=_걏`V4| 5 1" O3 m$Hs0+>z޻`eUP?vn;ga6 `D IDATpKK?md3*:MZB죭7O(͆ 8MYx$0a8cы E42$SpjYf {vJf=ױ-L[jc(7E|BpqR'1DHBJj$ҊONCOiw8I ʳ]DyrPU!_!۲}{ (4 q aZc!(zXAR"X8ว>qd v䗣B# G+a //jP7G3yP3߿GGǫ >0wܼ΃iu#KubG={kȃՓ]?GXcsI^#L ,IOO$ܚ\c9| }8HMMeʕ R{Mlw0 2ƮKQD8y#d˄CuM5DDDpmggꊽ=n6:gk \Hל܍lP/QUUEPP===.ԕcTJ]FŃ4HK/Ve4}Dr:4FBpޝ1>QGt~>GӌB&zx$柛9ABA,W]L%5aK:Q >Y=i@_}]yp`o06U`.78B풒n HҳjP[S_8k 훾9 W/82@[G`꿈cPS &05N|;ì7én z'1z3LG;gojv6wfC ٻg%0S'ӈɡS 1#oR)G &3a?| B58e1+|lrD/Ku0r♗` Xdd2gb(3EZ!`X``]MD}&ǭ( j Z}NNٺlU:+6Sa'0,0$aJR˗( fΜIhh9rab'[ǹ[2P :!2W ,8 5Yw-= J<vԗ0' qi8茏 kCԽ3PT?c-#1L C ?DGU]B))5<<<8< P|K.1tP9R{!a~)CnXGIL NvSf.Sf !&F2JPUUN N 8>ͽK|B7ѬP(D9pTT*IHo=H65vVƵq\< ؉HJJގc9yxpH 2q/ng T9跹P5o_C=4BBTyAC L65jLյ\:Ps +UP zz@Q[Y3fhc$|RpW*$"x>_O"%V qX x1:47 <bM/p&)&Dy`e322oKeddddddddd NGFF o4mm"h^APi{Ǔ~W:B7#{EӤ!lMtBJJ NNNطcm Q _ӵ>>0cbt2RQ@hh( ,@Rqe˙-L2___1 1~xfϞMFF TujyЇ,EtZ;1DM)QRZ91b 2Gͳ_&cv?ja8d̸uuy Iثh7壕q ;<%wln}ִYi@]r:5f! "Ql´58SG7Sfns퇰ж08/2Jx ^`= 9wN{ÑKeddddddddd6`1D̏gHp,Lo/_݌"M3?ݾxs*Hk&&&uVT*J`b Dƍ8J|B ۱o3_j_: ]* irߢx;wLb]tY&8yC~4fZB}<kYճӟ5'|GXAgn#HJu𶷞Q+A:j i ƃfR!pbmT} C Q)nVx@?: @0=iid=o(4m&cH%qA=xVx~&mQ>,W VՀyʛ! v^v _yi68+ =m tY@ a>VpvB-4؁vpFG0CpJz p3;V$/8 xlM3wvѕ_wk;c?M̪4.cX=|/d;Nr317>w2]NmGOZa<`űԭz0a $Ae<ֽΉLiwCnBB'9-@HOKT=Π ax L?#I d/͝V@ 7}bY;ۖuLh^XH7*Am}ک 9ed.hl$<pSjxwfW ]]0 a8 q(1s5 hHp5MĮ:H&33 CtoZnPbn-xyyP($NqMx|8U˫QbZ:\]]I,K=:4 ;ɎIٙ~ogIZ-Zv;O0V:l/>|^ãÃˍ} oWpfvId2$-!ŋzFn>d<ݽvt.ȮgGgF'yqy !:j&`0C"4$%С{~'t@xmЪ8OLV)HII= P~gU*]v]twA(a#c3?y}УPR8 AY| ~P vAQjq*Q?evAL>BW/u/qzM {>9d^%ͦUᑫש2pQ"zb?ԝNS/M,P1:D/lbQ/JD[6"/j=Gޢp;^&@%x<b(l;rnaDq k8Jt)`:>At k; 'Ag,0 .[ElW܃(^ U}"xſ z?do;t?ĒfAj-Wd@Ԏ6 &'XKۻeApvY*]* ddHtѢYHhw,81T^!3 ~l|8ՕiF9ۢ& q5ѥd_-)(D̀IiWMZZr]C:"FN%F X䴗) d2T*bӏ՝jq c8t:NLxA }z^ݞ>QC >Q0aLFmm ՔK|2QL-)B\\K,aS&]1T$hHNN ZB 5%J}U=݊}'LH$= x!OCaho&HMMJf\goU׃%1ݠdŃ/خ}~ZI۷ 򁂻 >ց~_XB׉O(yz^)x] IDAT?ǾB-dzgm9kC1MD=QB >f{Bӳ*iJ^1"anWiwa&W+0.l1"OvJdWFf(E}QTI:Q~ʑ^{ <[l~w&,#|_sn; ahNiO'Yp*J `wo]̅jfSkmObPfG Dxj(ޏs?ލEr;`^F5@;|bڸ Z  G?W<?7SeddddddddW3 1J"&"4!3F#3554_I8 pw/NF'**n8,,wa| ErbR$C ffzk{3Jxx"{㦀UQS~إOB`}vi 9AR*U2q|=kPOEuG5M-yF__eeeSp}yt:߭ \ls5hvDGH$ GJُrt0cfƃc߾}YN:9y$Y;;ci3 HII!44ZMbb"iSeTzWH UsˣaJJN1* FsMb_ln-[hͷkT:r$ :xͿm9zhqtюyf$ ]AObX9&Gam,>wlx*o"=l[BZ8<=3wph9;hːqdYJyPXF#&\'$Z SN4 kOox֑hVPgr҂o{.j] wNGh=b&bJ,DuavL"ayzlwT_%t:ztl77m7>0 >huzS.~vv3Xv~ p3aa&hpDg+kmb}v/̹{`NF6^P J;Hw~m& ښ{˩e7qϾ˹"#SuXN:`+D-uKHP(D󞆂"u'sIrb츱5zXG/4U+u7Ljg\Z\>b%r2L=u먬\=膷7/_桇"-- 7771&9VT(tzv"K~T `玟fd d[i ((7=7VGKK IIITWP!A4s#C4}luHK$xzf͚=|cAN#,TE P!!br yȀ|Z-DEEA?\[%' PPCj$IdgkʥW5}ɨ(7'51$ԛ8aPi}*nI'Eβw2g3?itd?i3y>ZSʞ4[qZw4Z5o=lu(tEˎ~;BELnG.i͹za'h mSN7^y) G&%ՁæCs\R-########',RDX mRj'b,k֌ĶِЛ@HE閧L 3,,n>ZF22F+ >pBvNNU68x ,=mԥDP Չ:IMm05~5ԟǧՄoL R'JG([]Ff;<^WGbܥqsu Df0hL#"PQyjϷx?5jZSĉIKK_GBzz:!!!_pɻݙ3g$ IZXƦ~b1\͵$LD߾1%_D"?prjo'[?B{cC sR_@6eVQoQ :P-7?vz48u:IOY\B0)AW=T) .IKPZv\l{XAdO]!5CwWg&ΧY6ʁS oEW)/6yii} -q Jp7\N02A@̀!apcZe@Ŕ& 3@Xl7i[Q޷!Y>Ŷqxl{߱t VG} "`= >Aick t&@ /x2FDb&ځӦrm_2\[K%n>KU/#######vaB  / zϱЉ+%ΤY~udtfs׉L#"FF):_ĮpQ Oz={1,6Ty*!HS$Qy(6IHɵTg8=DP{aQX`b.p8!ri/X[ƍ:kOG}\aG)h(axDk$ DB^km _ʋGiGLpp#1zA6W˞MwX7!&sg%F?at$`qRg{ ẒM ^oIo;Wڵn=ĄQ^8$~ucOc%׊MwlE[Nv-s!o`dP` (I1pWugr G?=\ɄZqkr$%IppP ynx#Е%q'O=c9J{r}TQ0BRgx:ak8=TF?0vջ,T5z,+eڷC';|RuA|D g:Bps<6/t2ՄW< i{QN뙵(̘Ex@,QhCC'b ŭZ p}b%"E%ʕ{2-p78BX} t1LX=7 =,ْ~v9Xa7Z\!^ NCkƘGEp" HV$xd8; AAN0 r[žLw-S»`v"Cc+.׏,e%222222222PXU,s IH:ZQͦfXs`!5|B]]n]R)ZEJJ t*7; (hv1nHQ3fPPg!?ouDJ6FK㼽‰ [Żby4BiLyu ߡ`2Eqm/,ZXڏlw` 8±/}e@aJh(@_tZ"RLeM* ]H l_V/wWB*PuSpXk3,gG (jڝ |Kg`I8T3eh\S9pv8=qSa# ôB{3(A ͵[w8}@XAe+D5dg0;zxEħ \ -̰|6d-ȼ > W)N1?`!} \. Z~Uu$\](H$D"u~!V]n}`%z=eee0F3Yf#:™a7 }ݻwsE} ˗/ l#/5xPVk^,&-a6tTwnNII [>B.]ldpH|#YW~_> )q-[PE* ?vE<;5&&2 > -p/BPæ@6 mV؉Y+nӀ\nC 3Drz/!(^2i&~k7`PDr*\ vǙQ8KLMm# JRHqS_k&_[kY-|vO}IJ,'vI07Ma+!(u@8~!1=7*ݓ7wa.X=w?o|Y4} 'Ly"r@"=:qOSyML9P$ /E!vx|B6%4,CA] 4ڀF 愶 3VgHPP: nGy!s-"_-0VDo0ӢbC-&"eUpȳ@"{nP@EwBĨOY/KNJ@rӡ) t2'.g OɕkGKe)6JN:%D"H$%|P~LC7--P>1ARFdd$))"[B!]!9iK\F!ek e7_68TSvsv wdJ =YDzpKsϐQAt֔޾{Hh)>pٯoemq,٥,8HajL~$@RmwPO,(z)(["$19O/"VcRD1:f&ClsRer`@p{ASF/XaΟ{t,RW_zo< X_|>t02΂=щpډ8}ȩchZV@y Q`2W,4|q ,W [i\4A^v;*Jl!8"OBEg_aR }*! bar N^=V$n gOo Vhlh.@-\!* 6KZ)T;qi֗fn$ffYylo:xfAS(n=Cwp{-=&* ȝbl knĥJv<`u^ٓcP`"N^P)O~BaAp VWhwgqZ}xI8g3vVlNq )2-HV D"H$/9_޵Z!օs=PYYIld}APBEpfF5waNX@bBXoU0%R;pրl < F00>έ`쯫HV_N֜Yp)f|}sYx߫_ADF,\94͏:>L%`Ϧ'h`N*nOfBnx6B=@@v၁dg[Z1Ƃ0vTp@ukJ ?uցлk1U%5vq>u <𒧂yRV6G~bqn4Y>DOC[˰u*l B+p_6":gXꭀDjMLH4*й4"¡L'+;# yٟhTsQk H$D"\eKAz~սeʖ-[8s H=BQk}!9Gk4"##E{9lj@8byi11yRuquL&\]]qwwرcTURݬ|+311FaÆ 鯤c~,g4e|ɥHpN]Rgf1~IOX?7 YNEXH ߻2WElG-NE.ɔvN| =@C6V&0DtS>|<=#> Ep#ghRl1zͥv=CO(Kk l*(j$)H8 swuBװŐrF lV^& fE|m tg*_Lm;X8m8B(2XI{2݅D~3uZ; Bl`D#= -B+C4ijUZvx%@[hl{h xs$.aD'Z#(x-vZJlO,h>e"mDا&E:\O=xj1V&&1+FF%D"H$k_ꦤOEOz6lC\Qm9&&%K] IDATeqs z뚛 m޳,5Ի @<\\\Q\ۓ?^')I \XW%ffN7ذahEV3*Wyz  GXvM|^/HO_y먵.Y+@] N^ܔݴ;ݸ 43 ΍\hwLp ΅7wEBD sZ!}m-0LK\D &nfb[w `LQi3˺oZxDdȭDZØJ02V-s5%D"H$ @j=+.K ⎃w-ߎ) INN&'$v}[ QfSF`r v˄xANNparrrHHֱizF܎@;7vcNPm{v.4[Tp ?l` 60 'b`;nd 'v&:9]pB!uVqD\>"v=LyyM׉&FɵB DF%D"H$۰oР!&93z=ٌr jpӺEх'11^LmiRSQPzPP𽠩^Gӡͤ['? qDhMPT':d__#50A à I"N]K *H/stࣀ'0Fpsfx[+'ECe+ 7B!FsfطEgy5~Cw.˟0Fuͮ ![Ki$.uϿ'vFy G #UP^0$@:܏Wx jp,)@iW9Kg磻ױyC *3hݳ-?-bMiPioW g"^;#UG}FthhDZk9yyb~DH.H$D"\E.j;RQQǘ=ۋ^zaX:u*]t)PMnKؽsf.^>]zðrz]8)ыgD >Ʌ)oZ"ZKF (;/¨0%=r5I hmIil`xjF֛ vSӚy|CflhG'ISp}w]#ڑ7^GݟG ){F:ٕFhvoo;Jk#v" QukTEP@m`xLq1iSFJKv= Z&\F&j̈́_y3$`s%"|h?o;x"ˠ?Dc7LOfӺ3}i<'|{Bv&j8fy'HFb tO#բiM_` "j= * HwcZ"EoARH$D"H&ipn >>"##bCdM"(2N3ߏ!@DT Vrz1Gt܋  30<̋IAF.=?nϛ`f8B[t./|~;}) pwK$]u56(9gSBSrU*(>.x݀v*QzCn+/ŜA8>sޜ'vެ%NCwA86n7B)|25GC[s 3IA8-_߃`fz-b;<!q#ԐU`'Bx+,Y~Yg3 b9w~m#*}q(Rd؆Q!$ʛ[s sVA"n=P-<@.tA[#Dy BF%dzCEF%D"H$d#9-ר1*8k"^崝mcRIԏ'&|`|2z㕽##^9kkРzpB'`廉$5x{;A9\D2t/Bƭۘtw%U hm[5iڬ˅ .[Gr4piϬe 5T6nj02Ҵ=YO◷{lX1SBCh8JɌjf< Jқl{PĈCB`xP@NѤ}(4Tծ8WcҸrG=h@rfCO_Pñ*x5mo+l*`w(TC`lv*zG 5tyHD8(cpZI#UBT@s!"p(I\+従H$D"H61lw8d*Wqăɓ'w>ju=حߍX AʁQ%|orHf@԰bȔnn7/Vǭ-p;;h"8 ⊡ ]!)ֿSD-[wD"Ă? :u0ߞ#|04E#Կ.8:.`_rn ia]>Rkw/7B[)ANhX5t9ׁ!s< Anxg[=^}9Q`S# |]:x!`8 7#be&%f ;DSvP[ t0BǗuvn@] "۽ak54PJ*b!{O+m8@5? 3j8U-" i KH$D"VEYE iʰb˩rޗl?@s 85n8D~z>:iwL#2/+[PH$F<q^'*P$DHQ-m!Fg^Ƕ$p}{n'BNٹ-nYp|J^=`R8=< é7ZXpEDAH70VB,BfM@6چػ4zūa#qR '|QfKǁ/3@0Ɂ` r:0c4 E_`H]h(l9ZM+>q~Fޕݵjiaz j/k9u > ۊWbߝS@ڣ32揃6fE`4*ٽ! MgdӰ)[zLr"݊=⺢WsBsȗ~%U4;eGVޜ%D"H$U$%%^vuol?E"vvۉC^Oyoll<=)_BWaߍ9=zO|_b_ Y?Mx < -9н‡)8tRx8x`;E9_ c'܌>v=J}8Fajh 'ai>N-Ҍp["'"DԶzj5B;|Px8{I.{|) Vj=v Pcz'hU̿h%"&|謆~jȾwch]:_,#hTΙLv~Z'8pYHGFV1i-bYf<-0r>XtFfC=͝DD;|plyH[fFy ;웠 vᥰ ypF"IA;/D=Q3" vbkZ=p RBƩ%Wk1R}iRqH$D"H&09t2V풍ϗ>9ߌM ]t!,,\>c^yDDR׹mIZ/ }~<ⵉ0w88kPfCCwW0 p,N\nCH}Aۓ0T}^a FVMcp洋&6">k"؞dI *rH:u}(` [?/uf/Dz1`@8Pz fw{ \!XrHwjpM6lD"H$D@Jv uX|-8;d;fs,}# fhPTkU8ws&ao)騿1aÏv<`RÜPQ0n/Eq٥协uӰztX0j;/"YM}RNXʤg7tv` S8Yp x[ l`=@z+ln-1WGJˠ;-|!0P~:-l{ :6/2dXwpqҋp|4U{hhd |ݘcӰP/o^fH5@m |PclnHL,tc ZG!O2Շ,ȊEu=HYvwB`|4Ra]=Ԝ@24pU4kVrD=ԉ.&X-_4 j3 P+Dgb㽈^G4هl-O+Dp-;%D"H$Ud l|XC |j8-:ikk7^x}V0)sci8ހ:[-ˋVGdtp(C}'/{\ǟHG;J@ &ϡunz>Ma40qq]KX,rNqᲫV{K7 Ęa[6Cy|(iId{&]o!\CG-s?EȍЩ&Ї z:"aF=߳¸1|2jm8p}ojg̰tU ΠTbO>c  ~,Gr>v0ZR=1m9Kz]$'V4炣 ΄ nf!>k?jLR%Z]0k%8-o3;m<1v_gDYda x{D8 9 HU@OHQ֣e1 )4V?W THjD"H$ZDc}m1e9TQ:E#vvv hb~#mp-.!isoUjGdJdx棼a.8j'z6Hׂ/RCvڵ2C\i<^,g5}eՖtgw}Y E?ob#>gqRu7n/ A N~ƏW ࡁoS6f;zl/s[wt1C>7O ' kLhaJѽPǕ # d]6џ=Az}=[ HA08r/֞"?̕g9]z@k >D&b,kc|; jZ MDvKoEw6yq=":)" j[ x;i!Pwxڀ nyMWK`ID_\ҙ14B'L 3`[*`+5JvpZ<[غѨբGU`@]~f|`VTC2Bv|ǡq '=,>ouޝ~tZt9(&pe e5bɈΖ횁.N0ZaK-,}"yaMUKI$WH$D"zںxnv;g`NشCp%vrAҺ% ΍<`KX{4{] $2km_mwx@$:(O5pE5x W3Dfp.MFt L,'eڏ`oE)N4bFX!`D;_݌Lu'bhr@HǬ3lJeu<=1T0("L="v܆Aq<m+4F2梑14'';$mqx]9Sǡk-[J (01@s=hjh@NXs5 )CF 2O\V!t 4l!T!؝AJPB'S$@ȟvׁWxuV [pov`I ̵>W+MV B'"#D"\E<DH$W,KVӁ0 qZp*).5hs/+5vLKơ/"SvG š{ͦ+|zF_qO~7ĂVDUq*ҋS>y$s# RNdBFL!7, ۅNEιwhʄJ҃7<9<4w}B P^%p,ƻrl9@+0ȷ8pMXN`ղrjŶzg೛OS/7;7Z"UOW 装@XX&>hH̀jH1AM [n8kgiy]U ^[  / `lTDGnL40'1[+B8? fn7 .F8|xۺG<8t 3]9&vy6z <|    o"CW2R-H$D"o.b$&H?YQLBULMa+#&"8엳)-E7xt7C x8Q4gwW x-E%4 .y6K Åd\9qwLuN( !WO4Ӹf1͕;o[AZ{CS!`QhԖjvs1%pA+f$!z"v0k3xrA!*^ Y7e)A{X(/?j7ӷ2 < X66 \n; 34WW%)Zf|{QqI:_z٧6RJ:U`ESS)r0+^=S }i[FBLy`y`bn'|Kti=GO)T58sJ\#_}F֒[ pЩ!K8$!06H#9AxOG.""""gATR MnEW$F>t"W"qb훷j !2ʹ L%sz4/孞YXܹpMCwrck7EWH7G'hyYKc>^mR#OBCmӫn+bNcաGVGzFLaq &f{ACwCU;jͧm}*f :w>X:=:3) 'W V.JUpT +ٹ,MJ׮$2FMMrnJh|f>h\(jZA+VWD8 N#B%B_pe %Bt5!93]3V;1#^{Mbc␧C) Ѫf oah.?*\}\8]ϳ6ܧyR3h9e1VpK 8:J,kH?w딸ome__Kmc|c`sV-%-k\HĄbƃ 9y2i)KU$X ξT*f4fߐՋ(/R֕13*7'V^(-5⸃{ZPR|(^3|D~ /# 6DR:7_;.S7jA3YJUBY x>txge:a/ {kf2^i2KdqoWX'iT6fk;bc-?fDDDDD"R#"^oㇲ u' Id~@AMK5>1cM+uQ5e\Pn"~08!ȉo`||㖝 ȝA)R.cxkF|ұ&$B9^#:ל,4eG'hֶXz4nJKcRk+9t5[$2 g^3I2^dK5)\w|B ʎOE JXz˩An1/$lJoeބ#Vqm J2b-6f<p^!;rD*gzY j[Ex]q"顄z֬wknN)TªRK^?GDʪ+a%>mQIQZ!0 ]\DZ4bNI{s}-"y1wUᐚ< q,J׮8a<¯u: v$ mu[Z7"n >'ӈ,k׷]͖Ƭp jKzr@M0Yna9[FyKJzU^/ɜXi۲hw Hp.Hۓ&տ1a+)Ibr,Էzi;%x1.qmF $^+ ]w[h^%e'{sxz=^5Z3Iwx5U{}pc1%rD2_ӈsp dp_9Bf Ѭu_p{)MpqlHd{\ݽf!YE([qR7׼BǙ8Jr-weEߖa/ǬR!*"U՘!OpTRm"{ڗR@܏%I޳Y/R+R?9fL \P7B98w Hh y>`) &98(F(!egWxrjY˙:H*'!{ soy.UqYh34 &;l=2c I{5(GDDDDhƈ=In-tƐ_]X҆ V%99rzgCӿ(]?S0 co]ɉ6`*SgάUJֺ-_{ -[WvlF..3o29A[VrQ}Mqnc9`[R]^BS'MrP>jz>qO9T]4uito;U}7?Zm("ڷIkOs[cQ^¬q#qԥ.iTJ";f<w*oyG !' z~WAs?F\$C!< Jo9`|;֠ Ŀ X;BL{n@}Yqh7 Hr=)<(^م{ r#6~#'ǃUZnF@b|}v9e[Ȉ40cOpDDDDDDDDDMLqGAgֳS8?Sqb:8g uvڙp'ZɶC,06KtsNUʐ5Vgl!opZW7^QYǹBO NqeYjb܃}\XLzpzz e^? Ӌ憱k%`,n>Bt31Vz#x6t#6ជ;u}==2{򭘽,QYz!PZ ǍBˁxO Rs(+4ϱjq(W >.cނ+#yQּII9ik2w$9cm Cyx:㼄4) B(z$emAi{oJsn{`zaCq{3:fut??˷A(?'𙲷4"7ӜX7ӈ#:""""" c9#" ǗQ2.@]Ƽ;ƘcsϕSߥڵsW{駍9O7{LkGcLy.m}C }툌3dMvFLC4 Ykb|۝:'e6jp:nP  JM-qɵx65gYZׇW|2둄yziZsW?WmpҰw-pYzuF^QʂG̼r՗9A[$Qt˨ P _ε>"YD8)o/n.Qk\e =U9ݘy#]Fut?fw633O\R3179έeա_neؽq:B.)GS*GIOi/L W@N\қԝk=֮ځK0{ n]F9ͦ. EvT:*.X4?i>Hl# _ve]G4mPC_JI-MUrQF4]yYfyM<'߸$28z<_^[ˈېu8f`ޖ۞(FC,MdeM cqGmOx+J,QqZFcO>LzO}}x7Ӹ'? B^C9r{~멟ϡH]_m\ԦѼ1qǏˌO'6>@\cN"A`ůj>^N[Al(8$bl=?Е eT/hӁ*MiՎ1GEԨcҳeϳԄz Q)AzPۥ-+˸p;Ӡ:U}dqUj30ظe!(OWMMi^Q8ܓ$r8{H~d2?~V$رq[$F?ꈈMenU˙gi֬Y3LAy)ԫ_OFRRso|_bF#sW2L(ޞw1)q_nw* Ĝ!S*F4PC9G:̨g ^jfM0rmB;ӿn_HZE鸲%AzÙ^JϣB5iUۨ .E˕Zó7{Cxû@DFqZ,Hgtɧlӏ;k'y;fjrlSaaD$ 4LMNסX(j_*|.J_>3D!/W3 z,֩::{>hoq%^%?_8eu+g0#pH Nlg\gPsk p=&}<8;ұkOa;'/d _g '?KC=Gin+L&oх*~ZQD{9ꈈ:c':""bw8Qn܍|D ֳ;oy=9~uS?sӮq;.Xj4tgoy(No[gn˴%՛3\߀(kG4n81`/At>>+\2OZ*'USgCOl^P+CjUw2ړ >&}շ/Ѵb Jy\s{WdqÕ,%[pBOg )3=[Sy sj5tdɚ\koTT+T~7V69戵JtZ?''9#e8oeUW4{'95y鼜5d'%[2Y:%Ĭ8 qE 5)5<]ѹ_@im|U5]|O|; IDATwu!5s`:/~-83]Cj3]ޙgd>8r !A,dM/U; vS_[lgmxh>S#"""""~D{ݸ;̴tR^yrzzejx|G3ΐ:Wξxm]կ_?/YfEM\TJ/P!N6-̺\|u x|3VP}=/udWVJѪ-ٚ^r-RX\˩UʳwjT*f.V:,ztUC>vT ʛGBKRK* J_*s4A7jMR]uNw`8i!y\8 פIe|Rn6;S\ ʊT k-6mL$kip]h%eVĺQ ~vUIAf\?8f/U\BN^cI/\0B{ɫ i#5kۧn\Y9Fc8 }7pެY ɟDz > >'kyY;QcBmDa'B84"b&Ώ:""""ɖH|e]vlv7r,7d7ROֻY,QJ#gVPP#v9oﹾ;$@;م+ƴy}-'~|. njfcVY7eGN;#bjн6/1xMHl+JWzL)K4H^Wȿo&i Su*9ϡ)6A\S!OYPV9_wUU?7xZ7g;P+sg1i Qw#4um\5yd^(oQ& "dz Ƕn%,DǗEBdq#1KN|DDDDOHdDI,j%&壉v|2sjpM64ӳTwdT徛xP\kFmS/ cm xsnnK4L受nƫ# D:W/SEcLWdM93KZFr>\tP;dƂҶWIYW[fU"41X>K7w}&Y<ŁKY~~۱F-4ͮ)ˊyN}hC{Ԑl<]ZpZ Z(kטE]HR!-j飦<B)_H:ORSi[?+r{8tO8%#Œ\ϷeY[?Wqrğ}%FhvIpq\1@wDF :5GO41evz~5z]^E:`|hwق+~& 5wҿqlِNL?BfWazqN)>/2:kFWyq#J8UBGJsۛDzP| 5jŨ!mmpH.o} Ͻ:%56wS1JЩ6%)' 1su2:ez͚dU$j ط1"epBn:&YIo{~PQ= |C'Va%RUArB(KKbm.g_EB*8Y(,+ּUsۤz`X}S NhoU &j^f1ˤ c29BYh.yPE1)_qx(Т͏Y>CV ,񟳍Y~EzѠEDDDDJ#"v'qwH/=,H{Q0=#ߒ?&=Ϸhaҥ FdsHp${f'-.|[Eyd+4N+ec uJx ^{/IRH *CJ2i$8V7ł-,AA?]V5|ړ#B9qN,MU6f$'%'J۷lвJK֐1BmLIR9OX>OKX%EY!kZpڃVRƊbW>DO뎂7>E͚,s ן5sp^qA9>ߍgjs6'aY2s\ *P<1t٭'YF{8hʔZT_Dף}wҔt 1lԊdbrE6 ~-wd4 7ԫ],!v]'gW7m+\>c̢?߳s0Klv҂d/gD_`8{a4`?ꈈA I#~?,^1A :C{K"+rJKĪh+jDcy0~F m0_pV7uۚRTp6nz\'t̟xy~3obSz @Q]y!dݑn_rX2cJq# nㅰ0-cgs|TOc R&0j +Oqo#>/(Wh7?IW:w9ˎ Y8d|Wm2W$a+Wq\3_e:I:UkORk>g+}#h1O&'JӅΰwEuϯ,tb+\>*1M3Q=/CGx4 G3b*%l'itx!֒U|Loʫ *B3."wF%?u"1Ǟhai# Kg.&ԬېvhLZep zטfYh0w#6KP :v-=aK}-c?_ m9F`.}Q/+&AP\ܒ 8BɆP; |y:8ľSWs9<8?D+.29>+(w'yv4sGpxe Mf-VC:p\k74Us\^v1'AW1"ؿNu;P=,~гjѢQ%~S[InmV.\6QM*z. B^\ak$+~~rc;'vپ&3(~l+4fKqg#-Ǣ%~o?wV\?ߩ}=999=v""""""""~zd%MQK'nvN1Ϩhm+{959bOh_RVlz?L*䂓Mw{#Hw^ Žu9&24;E|~WfrjrW &p]DO|\QB&kpY: #9s'q?8>]:j8n\hRQEz,%5iэ¢LW0 CrX|3>ZdV׬){I9oPo7O qPML`rQ2į .j] D'WBZ)OFwDKA,6?UqqO24A/O:^V-ڭ.]xםz?=vվFDDDDDDD<nu?N8t#2aR:ë/&pڰA j=h_7  feonD'lyսoƿLk| ^\YpZ,VL+B$xy{yR4PB=O?+y+oNbR"K9 Kw`)]-;Ѣ.CWOW͕-Ly]acX;@NY^E;ԛ;^RivvvoW5*+/GakVѾ-kt* gСY&)= ?xE4hɺEal[ !9cѠI86D.c!D`V cZ*oED*`f1/\&b7]k2LfKfD;{f͜媁W9S?ѣFg~Nu+M2 KwT=n8͚7KL41_6ϟxF}]b>WDDDD~C܍{IGR$Ei~pske_ c:ҮF;5sjZ=yXY4{swmF~?^IH'8 WKqn=zmVpsyp:Яz&ri27&RmOD^hğ0.֊զ<*HJe%SJ朞F A`<1{mxsTXwzUھ5;8 m1' k󣌚*C~RcKNV?' 8S`a&ZhLgESٻ&s}SIof1;񺰌,$̇̏+uBtcA}Kp5[d2_ቡ }.wgsPOsf;1""cϼ{;_yQ_Ï|wח+ovߐr[XBշu3 8#<1ﵝ}܍D=C-JLlG{•A7<]cY v;Pܥf]cncgJNjvO\xa+L6Ʒ)ĝQBW*Ô +ofV0R2Wޤy1st v~$qnXĻke)]"uZ*.Z\]YQ8_j!*񱗙7ϵdF-i|l I5;Fr4^zb=.a/G NɅss|>gxehRd`ZšGf}lqИg`tG#WJﰿqciԸuuXþHn{0}ηJ+٫g~{m}܍ظ'؞^@ f5E HkOzGoTyGRS+O \:5.RlLRL   [d3~Q[{ŝ6Ɨ^mЇjJJYX >~QK64R)ettÇO2<;;-9\^EBV#ҭI^ 8jSy#?z_EnFh8oxçǢiҊ*+z|ғtj][BRSY Ed6擳M~?>^NeL,J G"B)6\z0Λ,ߝ߷>polḣc!*챒kzg;߀s:x{Ιm԰ 7|uiԸzTk?sEDDDDDDDdUh8}pO>g$7x ~v7+ž2dz-|fq 㼶8I6H)bms(\i6!L܈CWB/wrW~OC3_ҧ\S, "dKڞuˆ#89^XHӪT?Nh$kr]^/~~㤡Ӵ;VPV37JÕdPU,/I)-Cx>ygg^k'դ,KFXYE,x be]~s .UB)?)u(ǿ~.dlq6GDcm7ߦQ?jժ!w{_vzw?EKt;6_3.kck륧k2jOSH/|1Vsl)-擶R/J[mI2WWUoy~n'ڛɭGmY]Ǩ nN< #K:gf_u_~񓜜.cH#${[H$N#1ʜPlHfvfG:Ͳ|ztz@W:5~;n*Xk~5:}C/WΚ,kIΓsGo}_eT A8p`' 7m|OH ))LfPfm;zgf_ۨ:-\=~^".r$5j011ڵk3WDDDDDDDON6{R"wd8=J22\7F$!1x$V bÆE8nLx̖dI, 6wےwgV|EEvaG߇k+,LDM IDAT{Z])+>8S(]>dpx .hY[.6xYܙXҳi*[C2vp&O@xGiH^^ʗ?2*gZiƩSzgJ43`3S˂S1ԍwLpL([#l9Lry gpVtk/_sW]s~[RRnvs/ʛlUϿ ៦<Ѐ_Pfֻͯ}ݪT‹/6uuv߳fqݸVd%/ELEvFP-21b *ŃkZ|P_ 6ٯնZD5Paq4sd|91 k0ѲXL:L ˱m^LNKhAh^zLѤ0 ,ʡ3`3gpCЃP(&|3)q!?YИwv!ׯWO?O~|N=qkx{;5vد}k߶}tP#~Ƭ2nS-BWjO(< xy~jpdr*PS/YSG[ǟek9H+q!eq<_J0ے:@Z38EZZee}bau#CNY\E4S|SW;&$AE%BIv p\^ UP-&ٻ(M @h UT RC ^RD "*#RH*$@Ⱦlf7$ڙ9gΞI_NjԚqrN 1 ;L< Jܵژ`l3 >@F;r41?~ G}N-֍YyiAF!J,8ejHЋL?Ik7pdOZ7^Diɒ]O2wu73MSV8O y# k `$ֳ ,JnRgL 8vLjrRS8hܤ1Id)2Y2L5Z?FYᷤtƔ ]qjD8F%np6i "9׈֍@ S$A5OK0CI|I%tDYq6A97GٕF#d}SS@3?Mμ sF%պ5dGl3?7pmps'xj1* 6"tFaۺ0tko랤Z!Z!S$0mP@L&c 2Αi|GۻdquG]m 4cOr1Z8Pn<唤ZmHZd+(%L5$iC.ǐc+zyEH{ #iL2(lqG[Z8 %tȮ8 ֍u#3d m8f\$FctRYZ;{:GY\]J0:8IuNϮʖ韦I:ov7(@0^Wf /O>-^~jH́prQZz+f+3TF$II²8v|.BΎu g"k9 S5|lE𾻓Ƹ3$FdW8ZCn[a(wIӦNS̍Dm~u#ichy-2ܶ" e2-ɸH~n<@ni]z:֤IR YZ7F֍3:Lj?$Eoξm!r(I4e2j2M;56)},]Oy#;|j1Yʕ*ԩS2?Tִ 諯R8.^hM6mȯZn(!;.ԻwomۺZWY cl /Y3gܽTrZnT *RBCCslϡu#_X;on`mLѶݩ'I { +S1RQOxtv7;HٓR'.dc9kH|2oUf۷OΜRN5vXkژc4a]|Q!!!zg;9zl>/o/{zk[Nӱnӎ;#ǎ>￯ZBu{# 2#fкq 'nnycfhu DD.o א${N x1>>>Y }+05n.o|cv˷ִM7GZjM7uq[o׎;էc:9M,XPZґ;~W[V\\\ܴn2a)BOKF2ZL(rS2wWɡu#v݀czO>|"""TvmT.ŋUTIEEETR4???͛sȎ,\rߠ͛3[֯\(-oǺuEF ikLmJj-iLSeqi *Xr)2W+Oii?>^ 5|5Ji֭[ZbZjiMkܤ;X-\P7]-ːaC4omTrWSu#15j$ȌHy^m~L*BF>kdj |Jd"ΦNr qv&Y0F%O{HG=||Mkڸw1o|5s|<% (rӫT+ڥ96 G@nDF cRb9(E+\Cn@paJ0 Oœep Hʤ..]pL2zU2뫾&zb~Zjy!;rVo;WhEkm݉#Bd.d )RMI7?$n>LntMGlQ$͑%j3I^'Y!.ՀL4Qllϝ&͚8-[֍@Kh8O%Lna%t !ʘ_/8I#ܩL-Q¸)g^ 8Vz/O 5)p)Z7cL%8:oX qݾ@niT;:1e>֍@H &f1aF[s%}$9=G#g2u~Z AdsRmٮr,yѬnϖ6dptzʶ#vsxc-Z;"w:,ӟٞ7&Sbw;>5>]cyLFKk)-%iLJܢi,5/O%8 1@#L|@ XZ7Jn2_L-Cd !&Th##2uЖL-]j4RLmpn~'qضu# vd'֍̑0Kbʋ*ȭƘ_1ހ<(8:!'uu4U )m2 X0!+UØDF Yl~buQ7o֪U4b͛7OF1%Eܡ1L- 'kTa$AJ/?Cr6=XV,J_W4.3rt8ZZ'zyydɒ ִiӜݼy>͛W2(RJ>e+P22LA$VhK3HzZ $uF;-f_JVOI$Mt>9{沶4tJ뭶LC`Iq7&MvLi,L-pLkOpJKpoLe Z4@VSŸR[akOSsneiU 79yRZbOTyZlz 6؍aK.dɒ\5]҇F~.ڠKL%麤nNਆLJՍ.~s̯$痤2YzF2JbjT/J};*GUi[Y)Si]ֹ{bbW?g'NJ3 ]ڸ`SRp)dPJkyKd )O,3BiKKqz)#M1/d?5Xjʚ+`m)-o[>cJ[GLIY=tFQ 8NYm cy'[Dَٞ2J9hI V^TC6+zeDz4dͣ-/]1oQfM|rM>>*{oY65m ۚZlUnZ!+r/<{Oێݗm[5muk՗_u} }kڵj*FݱB7_Rۖmw^]uvc~G{Uۖm"X ԑ_$[98;'ugu$I׮]ӛ#T]6 .sO2 *&;ݞ?gz[ׯVu`cfΙ7FILХ8ŭ[ٚ$}mZ./tS>N\sp:#IZ8jᒅ:{# IDAT17>M :>_ުU,Z%YŮʟ?ѝ;wR0sl=_y$՗_; )ׯU9֪SKa[V}n-˔-cGkՊU\GM?A:wPy,t]ʕKQ֜s&DkC5h ^zlu™spp;O/]Q/oooݽ{@>U[s`5T@b o p]ܦ3u 5|w۷N>mYf7n>mܸQgϞU0p͛Z0oޫk׮TR jN];+7js4 Ϙ?6m((I~j׮7JnܸA LD%J93vZMtnܸ?xG"""ԫW/Ud4e4uV=v^J T*XTH^a[}E_ x@ GV sԩS ￳ //UXSFWÿ\bnմ¶C9li7nطƪ]v;jbnXbnwsmS^}ul_-֬ӫ/*I5x`mVݺtְ\, lH?SN^Z?3[w}WFQcǎa#)|[^z%͜1Sө;v䘖X hW{kժ[OH7gjڕRw}|(P?*_yy{{VZ:5QɣjIK*X$i朙  5j܈xP̍7񴏵R2eԶ][G^-n:-ZHݺuKV^= }7.%I'O?^P*U}ӧO̙3Zhz)kn͛۷oVZzYdwnݾ|N2:P]ϫGں?Wxx^x=vy_ժU˺m)U5k觟~%I WժU+?yf>}Z  +=+=];~ׇ}A yJ*)I׭"ٶ::*Z>>>nGݼaN:?@z{۪\6l ___]~M_R}LTb&޽vܩ9s$hߺu4m4ڵK)VF ]|ٚgҤIʛ7VZ4HvqnZ'N?h կ__;wtz+WT.]J>}u릆 *<<\TfM}x $[nI֮]G}T'NPÆ 5uTvRPPP̙N:)>>^ڵSDDcm }v.]ZTpa+2 ۵kqiذa:y hl-:8˃ܹszg+WN%ݻ{|+-N>#GrYHZ5vZߺs玮E_ӆ lho򕊋ӎ z:w޽-a>d5F_t]ݽWz%!HhuYի_OO<6nB.d뀣w%o/^Zҥ\Ydk*?%tQ?POY˕9su]%J[Tk֪vzKv]:5h`v_G(VBڅ董T8M_wVV-(QiO?)So߾vF^~e9sFǎSzz!C]Gp :T ,И1crz%I ,ڵkUZ5թSǮ;ŋ}vmݺU3gδ;mwє)S{[n]]x}Wvԯ_?Y\9N/F*Uʺ_~Q%h4h4ڵ^3f-[~ak_|M d!=zЯ!]vz﫺r._%ԥC8/%wޚ3{Bڄ(tm dMr/ UH}k #!YfuxP}Gӳ-w/ p!GpwK7]ՐiӦW KkIR_֯h sL8A7lTM4 ڶm~D~:vڡ-[>5x`}{5nX3>OO>S͵sN_{ >H~Ӵ+W`0hƌē 6LfͲgiٺci׮]vxkiϮ{nO/5jԐ$͛׮5$ 8n~K׭[W .;cĉѣnܸ)Shj߾$˳ :ci%j .]RŊ,]-TlYl]g k)V>VYn>^|sZZcǍuѢE9TgMoM+RO͡ =#ִ}[6n;X]~]͚7KKW.Uv.Ӑ¶re$_p` sT\Y|N%Kheܱ6lf_y˗O-[w[ܱS ooo5l`7Wz'O5nXW.l^h 0`dj*ѾEmO4I4j(>hKNj'zի_~V-Sf^x aTfMuƍ8Jn'xtp "m;('Ԩq3*RL}jںu5MծS/EDŽ} d鲪Pm-wRV*UM_ ΝKRR%Uf UG]UįJ*C+.. 8奪ժo߾rΗZB}'vyIoA_"##UٚzڳjҨ. rU󡂁/Աcǜ¾k-Y$eڶޓX;w.U{wB%S7;wh$ׂvZIcf}N3}kݺu/aCe~TFmWgOO_ cۯuklZzw5|m޴Ajի^ө?s!Ձ֭ZiaF{6l4unղ?ޫX\Zg͐O^ԫqosQm6ϗߺRJc/22Rŋ׍7TDq"Ehw[ΚXH&. {ztmu=Q^xe/)sIҪU4|xce˖*6Rdac tC:gGd0WT;wgLo߾me˪y[n%{￯;v(00кoΜ9\D1yrڲ% m;)j$H֭נ!-@Wu]ݹsGׯ_O˗(ʿ*Rpdɒ3odV%u]{f}kN.Z>|CQ@U|yEDDh֭v8zfڵk GK1b>#߿_cǎoaG_~Ep9KʕΝ;Μ9 xXp!IO?/KcжlնݩSs>`14yʴD͛7$-YLwz\Ѱi؄$9N S|ϩSeʔQݺu'Ow}؃vڒ']zgNtQYƺ϶e<԰-)97P8NWH:vt;HZR-tNhJ.޽uͶi%7SÆZtdԩc|֭[z']ӄ!!!{]ݰaC}ݺu m'MYfZl~G >zr?yZ`s=3fhʕ+Uti`j֭ ۷.0 mwѺ>qD]WZem;vlll;߽{n… x@8ލqISөS]o]o͞5#1H1 F{R1*YD63دj Qz"E/tݼaGB_ y_`ѣuQ?^ .1#GLG:pN86mhϞ=ٳg_>|xgԵkW=쳚:u${oɓwݺu0`>SKJ܊GGyRvmn4j(TR}`0`0hԨQرݾ޺,b ի'9s~ xQ@ڔ-[ֺ'i &r*Wza%2.KpBժUK<6n(IZ~^~Dy.]N:,믿+WN֭Sɒ%SD ͍=n2cHH BCC'N('*~pELcQwM|d0m V_Aaaav:t`М9sd04qDq`0h@S*88Xܹ+uʕTw^h޽Zƭ[-[$^qlA*Vɒ%5c uAw֦MtYm߾]7VիW/UXѭ2OG=zЃ>2]v<)˗^$]~]Æ S``7nX^zUTVqFfg"X~)zyݻ2@5)Ǝ-[($$DӦMӮ]$믿ZCM0AݻwWXXO?TRBwޔt덏ƍզMIR֭aÆDI?^/o'{.W}Io7o!Chǎz饗4aeOjժ_}UM>=My%7~c…}0`mۦFMT6}to^k֬I2 nE`RXqۯ2V|֥@* / ֥`-+ɬ:M gIM>}QXB/5k֨wމfٳ˧&MXuxbG͛7S}.{U2eT|yIRULDS P l\j֬i ۷. XZ5޽[Rڵ|re],c IDAT7o勊RbbŊYzgԢE 1SՉ'c͛7zԩ.^h z,XP?͛'x4}toՈ#~De/%ʖ-gyFiʓ 'OVbt-(PnNdwjÆ vajǎӢExh2Qp\l1Ak@Nׯ_?{Ztn޼)???5mT]RJEzg5vXѣGkܸqV=쎩Sڵk;vH27%;vhN+^z%Y:G5kԜ9sM2j(}zw;=|)U@uU~5n8>|X}]k+qiɉ5E0$hTR%$L{nuMΞ[JnLo܅sf7[n] 6Th߁S]u pl艣m۬rbPʕ+:t.\ 9YÀ/ǏGKOMI7$EK*銤K6hsb%5/F%YtȂvZh쀀#@ԼysO,R r}v۶m\Tl<&C!UiO%22R[VBN:%111>.=HOq(J* 6m*VWΝS 矧*.]ٳniq`c5iDM6Q[o+j$ GK˗/S W޽U`A.\XS7((H~aK4d;iŚzl*@aǟ~I+WVFt%~A~hڵNz衇tI/"}I=Cʾ|7nŋkܹ߱ҥKUD$@wqUP]ti/;zh=):.=Ґ9|}}v:!*@aӧȑ#owI=zT˗/WΝiڴ$I}|}}.IoԼyDǼj޼.\CY];vu$@ ZϯW*o-R|\z!xV1޺ok!jתwmߙf!۳.^(I:}괂[cI.}A2dYp|w?~5lP7ntoر*X{99ӬY3kq֭4hu-[Yfټyu&=:9r|}}<9hWJ oo4uHCGW^UkUVM|]:jR7͙5GTj:qXSOʗ/~WIҏ~>>e_r%UݻWڻw>g@@@jРA RPPƎׯەe˖$˝<Ҝ-2,8qD Sv\^f4i$I2'8Qڶm/RwĉҼ Bpqƚ5kbbbtmXB 6Ls^wK4d,A\>]ڸ1$Hoۺ@*W6ߨ|P ҃Ԛk`?~*6]tI[nuXlݺU퓏@J*%K(<<\g5{4ݭ[Tn:nZYٓcƌ֭[kƍڸqJ*I&Ytnݺd9qv 86jH= M0!5kLW^Uƍ%7ot:~$M0AޝEUAvP7Ps^5QRQ .hUBr\R%L q\*~U255"08qaf@@_cz}|33gf|SNm۶ի-ZુԌ;IIIhذ!6l࣏>Kp+"Qer CvV6;wǥ:uђNݱsNtu ڵ+DطoK.HIIomOOO6Q5ILLĐ!C`eeLzaĈ~sgddǏ>}:]flOOOj=7͛7k=>1TUKQRwQ^=Ik. * =z* ]vx|zp>|lϞ=S"<5[+k㪢^|7#//0e|3͚7vsLtVդs222еkW__uޝ `""booj[[[@ܘxxx`ĉHKK._1c ~~~ؿxL S-)˱sN <Y{0b,>>pqqAPPRRR$O6 B2P4urrX'M)\[bȑLL6 nnn:u8:<}&Mbbb84% *ߑ#j5Śk`jj k~XA!_R{`/ڵoб߃mZqI-`Ŋpuuĉ(DDD/ٳqA <K,q /I5kֈ,XѣG7n/_ƫT*|}}6yaΜ9:RZ=pISлwolΜ92e 9T߸Ҏ????>L+W,8}bJ55֮] Xz5>=z~Xr% (T5p$""">Kn:z ""zm6̟?BHH:$ )<<1%隿EmVZ}EBBwi8;;|ӼDuDDDDu nnnL:D2 ]tA.]0zh\|}d=ƍ,,,$s3c׮]q]BسgRRRzYYYO>ⶵ͛ \zbܹs1k,̘1FFFXjΡo\,[ 0663i$|ޅWɡiiipqq&edd6m7KĄ#-[ĝ;w 6;j="""*c9** fff>dggKѠAdeeA?NNNرc9ѣG~:$ |bҳ,ڵÆ йsg`ʕǡC{C8x֭[`ږY{{{899i][޽{QzJAɁdN~L8ӝ;w ދ5 NNNZկ_?,ZJT\x~Z?mqKTL.#22CӦMsCI\ƍd7N?k,̝;x$8;;cРAvY+JIbKGll1iKizB~)~aΜ97o/o_.1|pu'&M+V۷o̙3Ų#66^^^ޭڞSHDDDT'|J̙3:u*n޼ B???9sED/ 9,zlmmtRqÆ ða] _e2˼o+++DDDh?|Cxxd_xx8Xs2HDDDDD/@H%""-~z1fff9r$֯_/,5x@Q'Ow``_eAX-[ v%ʕ+bUШQ#4jQQQ8tՎ=}4x 6m#G???BHJ׍caa!6l؀1c?Pg_+9944C1fj=G!  :w7oʕ+غu$9yu="˸y&V^s̙3vڱO/ӦM/^Pb̙Xx1_DDDDDTGUPՒpܿ?Zj(Jj ccc!&&F1hݨٳaii cbbԆS簶ƠApEL<VVVj^rC F4cǎӧ~]v|*jnnn ĦMT*_ܺFN%)) rIII8GSV9=zO>DI̞=[.rz_h*t#V- ǵkĉA8q֭`aaׅ! HMMEdd^ S(8r%5jbywA'ODL^0$;`QTHD 2VVVdWFuyeddǏ>}:]TnѠVVV˜1cpEIyf'j?Yu`?#JaҤIb.صk_Jb$o\///DFFj ݻwջ,/:+W0tP}_EBB9Xo|@?FPx{dQ;8DDDDU!Զطo-L8Q2˗1fOxnyFGG&&&TK|rܹ+u֥~L7nȑ#Ѯ];qNbӧOGXXLMM&YPjm0h 4k BЁCl""zJ.CٳgV\YĔkFkkk]zj|8z(rJ 2QQQz%VTi.]*s>z022?SL0A*={+n7nѰa2P<-ZRD۶m5׮]SKi{Сz*RSS1uTIj_NW>Yڌ ̘>O3{<*}dIdI _|G|2$s8+۶makk(!}ajj 1Ypss ĩ*")) vvvb-ZNm` uի=y$|M[nHHH3gлwolݺU9+`8pŋʝRp2ϡOLIotqqZj### bӧ SSSMDDD8vvv?Kn:"@4nt2{߯Ģ_- &ν;0<˗,g;8+J&K.=z4.]UVIz1EEfK͘7b֬Y>| cϞ=HIIKII޽{%qeuҷ.NNNp222pU8::esEnn.f̘2e7t;k\w&MիWk]!\}' -- ...!N״iSa^{M@DDTNP,rta IDATiԩ8u| Q\]^_N)xXZ7I?THKF?E%/2#77+\G눋ʋŵkcз.h׮6l؀Ν;X,ʕ+qaL2ϡo\iXfoo'''sSֈĉbY KIՏ C}#"iڴ)>|(WPPأg00Y3I|ɿJ|~1r05ln\'"RTJ5r9"##q=( cǎąܺu ptt%d21QKtt4$?011!Cz9j.w#Gıc`ddu떹vyT*HkXa׮]ZOLy9;;(,,Dtt4Ə/!..駟ypM_;T ߈HNo8!xd_/ضum]9E]Eݺu:wz녈ƿgQ/^A&Lz FBjj*>CI\ƍd7N?k,̝;x$8;;cРAvY+JIbKGllaRZ^P($7~~nnn3g͛x}KDEEB_i:S^&MŠ+۷c̙b ///IVm)U:l""t&NܓN?c['""@HJ(((]ЧO6p$""nX/oKK ߡcZJ9Æ'""*Bѫ ;vTITUY1>>[MDDDDD_7"RSۆ=zO*_lj϶& _?+a`CQ9 QO)"""""""pG""јp$"""""2$*Lb‘*M$we޽-"1 +++ >QF 5{'VǏK-++ -[IDDT(,DDTcUKܹsXt)~ȇܹs>Jgj%Km۶x޽֭[cŊcΝHOOǝ;w Vaذasr016acQ "DDTUېj???Kc|:vBBB`ii kkkL0N6mڠN:077ĉBeŒaccSXp! wL&C]k]fU롞u=e>JwƲDDP2@DD5V꺣@`ҤI#""_|O _n >kDTm]֭[M4 4fee!++ BPY/dz ]u5k:w'7jGyODD5P'zdeeaڵógФIx{{cѐ^?Փ'O`kk[㒒Ε8r9_9Ο?>@r\ٳg˫'FS]5y6۷ HNNF=/@P1|M\rF`` Ut1fffxXZ |'@TP\xYYY֭['}sw꟩|^ Gz,ZaaaLl޼֭Ä ^ܣF}ݻ={TZ±2hu8lWWWy>1]_yu@|z7>>)sJZmڴA0n8i|FQT :t耇С^r zBep$ Zԍ;y$\]]ѭ[7?~ze˖c͘7{ ƢZc8x %KqZŋŤ5k ,ѣqa7˗/p U*$Cy0gu)G8y$ԩSݻX6gL2qqqxw`7~w}=2}\1rɭ4kkk]zj|8z(rJ 2QQQ:TşS}ؽ{^^~aڵBnn.mۆzKcli&ʕ+1y*۽{Zԍ ggg?~ϟ+6mڄ}ٳgbܔ)S#Ca`[Qm۶aETTBBBp!I\pp0LMM!&뀢y `bb///dffV.IIIC--ZbnnWWW(rץW^b"ɓx7Ųnݺ!!!gΜA޽uV76oތaÆi}NNNPT8{ Ŕ("NHH@V`dd}"!!A;}4ajj`i^jO8@;v,аaC4lG}$6p,_VVV0`Ǝ>}Pًԍ*ڵk!ƍWI&E* *@ԝpTɸ5$L.]`Xt)VZ%7XXXHfLOOƍ1k֬2 kϞ=HIIKII޽{%q׷.NNNp222pU8::esEnn.f̘oϡoݻwqmIR,&Mիzt7F_%LKK r9|||e0554mڔoZV.eKJMDDUN2׊[Ϟ= ^E˴ݟIT1)))С8~RS`oopttӧ`DR5 0HJ333q%qhРРAq '''x{{cر✀#\~qqq066# ?eѷ.h׮6l؀Ν;K+WD~~>:PgyV\7nH4r=={kkkݻuꨧ4hK'cW^ņ (&`Ŋ_tR$''`TǐJ`G]r9"##q=( cǎą֭[pww#o.9F&!==]zDGG# @ 2Dc24mu)gϞؽ{dF9r$;###ԭ[̕[hڰfmZa׮]ZOLy9;;(,,Dtt4Ə/!..駟yp$""ZƍopB899aŊ7o߿__m۶ݻcիN 1c^ LמP;iuFo„ 8qww]r1ۯJ[V>L2JQ%եqM4A۶m$ܹd$FY-Nm/ oor]666e,,,&n\<Ӌc‘ ґ#GB?J%z[[[ei֬8ݵnC/ *aq?WD5RAAvi\0HDDDgӦMP4nnnhٲZױm6,ZO+[jǏ#,, e.LST~‘ L"0L& *z .4!G|DDDQ- saҥHOOWqs *aÆΝ;K,A۶m#ܽ{[Ɗ+tVTwQmӿ7/}/A PXp s,hRQ{q)++ ~-@lڴ JF>yB%%%A.WH\RΑ\v+y΃j/}b4i_2L#???Kc|ZXpcǎ!$$Ƅ p)eu.#6l Vzڵ+T*X%TuCdX T h Eqq1[Xn [,ؽ{7|}}gϞV>֭[֭%lق'FS}/jK8b}ׯG``dӧoشiXֿ9r~$"͚5 ;wV5nZnҤ .\SeDMTTBBBT1!2tYPPX[]*Ղ&AHLLĐ!C`eeLzaĈ~sgddǏ>}:]Tnߛ7o]vZc͛7p ~Ֆpl߾=A@rr2_~BPO?/0m4l Enn.fΜŋ$"y{{kܟKKKq O>YVY2ڦdggg{?xsqqc!{82PAVF׫ 2p$`ooj[[[۷Oܖ刉&N43f ǔW_ <==r;wxu)- <ܻw#F !%%Erĕtmo^c4h:U4>>:,00=ͽʕ+2d0j(šcǎӧ~̼[LP,TwQms}7|D|[||~P=LDťBS g z8^W@a8x %KqZŋŤ5k ,ѣqa7˗/ U*VOy0gu)G8y$ԩSݻX6gL2qqqxw`7֭[8t .T%cʕe>1隿k׮^|= wwwq?\C ATTTU՚p @dd$RSS1ᘚywA'ODL<U#77Wχβ:Ou6K,ڵv+dDLYn*@(㒠RAƕ888`۶m?>lmmiU:$ )<<)S 44T9+MPDm IDAT,չkkkNj^=4h /9EUjO8@h,߸q#FvکMV:}taaae*jرHJJBÆ ѰaC8p}2hn=Ou6_9!2T*[Z@c #u\hf K5\.Gdd$ݻBtرppqqߺu pttۥLLTILLL0d^hKi={ݻ%7ȑ#q1nݺeoÑBСChҤI 9>1۷o?~X憸8য়~%S-%hB-C^|С:t=uT%WmTvvv-+}ˈj={:uK.i1c ~<' L?21LQ qPUp&Ledgg%q77x ̞=[?k,̝; A!..@QrS\JqqqXn:c3fǢ. ׯ~).\?2 xq ,ŋgzÇ_|B15i$̝;ΝC˖-%|?~<ΝoF]zNja Fn,߰aFa2O+wk"^4`cJW±fK.7l0 6Lm;S}WزS2 e޷"""4䶶>I&h۶ڜ;w﫴WR֭bŊ257yؔ:,tSrk&DDDd>3E+W=Pӓ plh A&Cd2ёp$ ILQ*((]ЧO6&Ƞ-]T2KYK̜9phe8@*@,LB i = &j(///tQ&QMDŽ#z=p h %?,D{ ~&mf='Ą# >|}}%0n8dgg~&%HBuA S3 ٦DDTyp$"""vYcժUG AgJՕQ!DT=TEaUA**}R""TL8A3g̙3pde/ Օp^ G.C5ѪDlj¶&"W?#GV֭[sRM đpi]er u^;d z8ʔlZY5lF wqu+j϶& _?j&M 22R:>3+a^Y,@3($T^Od8jvڵk *1(7/4|Y](Ldmd{y}T+T0eGi{|M2&Ƞ=xu19Ud"d$ )L#֤P (0bRD G"""2hݺuÖ-[?l޼cƌAAABCCkEcc5#@&@ڠRAÑjKS4&k&_P=z􀵵5?.:u*`ƌ8w #_z ˴`vNH5ߨu-)p󏛸*Mknf>)DP- GA^jB?|M6ǨDDDAdciݺuÁeÑwQLSԬX~؛jK]gT/^xчQ( :w茮sUY]|`{v>)D {.T]t!U;wƾ}"&&* * 'Nɓ&M2/3<ԿDdXͫgz&Z}~蹸 QuRjv_Be!rrpKhۺʺVyEo5+7?HDDÇ| O.)ӧ0a!pWAG= JUPhnBr|x9RWQf>D'NH"gdc랭bLP@ѳ[O']vspIJ򒱧ΞBN'$ ӳLML2wNK'OIJ'O୷BÆ l2Ix7`jj {{{lڴgK,ANmM۲e 6lڵKrUVQFhԨp!k-HNNaYl$"cժUSZgnAUD|J!T?TjOm˶x-[~hܰ1"wG杛zw̩'#|G8n߽n]]nqQ8{,{8CRa֢\æ$GۥP6um#fNItmsNĝkoW7s^z144C1fJfˆ#p=\rEr\pp0>Sddd/i$GbbRRRplݺ˗/͛Xz5Ν3gڵkc}'1bX1c8!5j ֘wnJ"@2QEcT=&~M}1q,szu֒.C횋e-@ZF }6Zط{}sq( y&v%9g᫷Fn~n%Yۨ_>.v}6d2!UaXl燏>H,_ 333̞=֭J& GyQ^=0c XXX?4hDXYYi-Y4tP :ڳdEMDn$"F.7n 6>HرкukN0Tɐj~ __M2 PFi]H)i}enUPGxm#mܸyCy9T*ajb* +,AQл>yyyZKndp]zD'&___BP ** :trDbY 67nݻw?wADD6l؀B\gΜA.]`ff7|X֨Q#9 `Μ9+ˤJHV5BQ8urZceJ?Աh @5yN=M¿?BF`耡077g(zf#,Qd % ꉞ93pb,Dy k"(" Jΰyw?zea}|NwOMMuOo3OUO+2]fv&Wf7nٚWƧ0E֝_ٟ[W_F֭ZsLsfp~{y_wYz,?#c8^Z~izŠAС^d>_3<_FYoҷo_m}Wz\xԩS#^z)Gnhذ!ѽvFnB^u*WΝ;IOOgҥtЁ~W_W_ #<‰'5ZjOG?^z1rH̙C&M1ۄQ6|_qe.Na5m^8 @@i8/^vv6?;pEKhɢL1uӾVKoT+D@(+Jq5k2sbUVYfX+Ws2o}I&n?ߺm[Z5MVjvd7 !(+f̘__d8E;3:t(5bٲe%zݻG~6l@^{>f͚O?q2gΜwӕmQ,?I2=F2D'R ʵ,KQN֖(_OUZiӦ˓O>9#{! !cǎE|q]}׮]yJ?dw8 6d GQu%D, H Y!~!}=r)L:UVQ^n`ZzɸqٳgԪUӧӧOĤ1p"6v6@~oz?];PsЮrNo[Yg@0BRW' 8 !"fTT ڵk.] KplѢ-6/^ُGLg%(D,} 8E0sImt%q$ 0+yӵ7IQBOtB3vZw>}:@ gG0u]5kŋOMMK/=J DL@1.8p_cɯ'+"*$(BѪU+6o̤IKQFgl2*8mˊj(D,ɵA kW\O" #D;bٳgK۷}͛oۢ7,}aرc?>j⮻:z7 01=Rc-Yc(󃂸!X7^CpBҥ:ƅB!>!uԕ" whyit{$Me~\# ԨVC_ļ%Kp)Dϙ39ss!CРA߯_?F֚7|[n3j(dryҥZeuXi/=_WuҥZIK6c ~[FV1135פũ-ןEдiSO9n~e1ѣGG>\sM$x 'p 7_ 6=2jEnA&!bnTdI$T)Seg}d!*8:"?ҥZAe8ڑ,CX{~VJtidQfԯ_7?ӻwo J)RRR85j%5vX}Q4njժ|r^yv܉RohOS3u1r { YtPyYޛmB^@9,v{d&H ! R-!HюɥD[p![.2'̘1c|K2a„ը;p}tRR4o|m'2rN"6 <>/,z&ȬDb&8r zҥZd8*"?Zk*UW\֭[lS7n,S޴i !ڻ# &ʀ-Z _!k1|p=b<^zEuܙΝ;G{Xkټyы.((4F^..^R;b庆@'+"*Z]7֮]Knݸf͚5lx= _ZZ4р(#/^̪U̜9{M7q 7Э[7nbi߾=C aliӦE@dǖ-[œD?ÎO B`L^G2X"/zZT5KW!DT%c8VX+SswϊBu!Bĉ'ȷ~뺜{wq<,Y5kD[v-_}~)mڴA)K/D>}4i~_Zˇ~XիW3l0Ə p 'BĦ7S7܍ R% B!/4&//`ԶnJǎcǎl۶&PHx,_&MV7xڵkWTzz:;w&!!N:cǎwnӦ ~!ݻw}̞=;.33;:pUٳi߾=ڵkaѢEipkFFFFe(ʒ֭[3qDlذf͚Qnp*uԡ]vt҅.]uڵku<QaM^t3~,J!ʱpܕm8't#F(vO>޽{ ֭SLJ:u)kڴitҥ!CȕW^Y?I&.>2u\{$&&Ҿ}{\׍,;w.q9ΝYw3w\ϟg͸q$a?8`8p@߀;3GΝwI0p@ 8rkȑxw}W_}ۘ1c&LZ˚5kHMMP:1 Lx/}Wt;b³W{A >˔.S2;xƍyWPBn۶+R}=\ضm߫T:u_s˖-ARԬY 6`W[)==vѦM."g>C /e˖ɧI?ˀhzrS>cܔ`%zeٙgI۶mѣ#FaÆ̞=;7|W7}MS (OBĮ݆qJ {^X``L@)򎉏n"Z4V\r IDATjժdffBvv6UVJ)))vi<Ü}Ye9vIZ"˫T9dYUbE>cʕ+/RPPg}\GzNpÀhܤʼnD󐀣(?&L@=ZvZ^z%~mc LHtRQJH#>b ٵR-i }a".ܹ3cǎ% 1y"]a˖-\\/Wwj'x|}.]/.:+Wy'Ofu}/qRRRعs|8LƘe)t<9%l1i ʏ=zPfMƌ "=-/_]wENN#GZV04FXea]T'f͖l"1=@AJr}.:Z焝yE!ʳROӫW/ Dx".BԩC^ޡ hܩS' Rl155իsy;ϕW^ٳiܸ1cƌlԻ׿x衇W?pdݽ?СCZ#ȧIz6aӦM{-;xꩧ4i^th*]Mbuѿ;CWK V2l>-!wkQ+<5^?G~19%C !DvT%`mj̙֬3nҤIu֥Yfԫ;;c5j`ƌ1cX}ݞr<Ŗq)0zh EƘw>(?vخ];ڶmK HMM/7`w}h!m5_"1iL7i7N"n@+[h 쳼]cB NդïLH%^<|FInd !J$Q(Yz5'tsaΜ9{o׮?b(`1Mo%A9XE nGUgtV]L/)8k*kvT%P 8VZVZ&BR$m@k- -ʅTrssOyXf -[Eq}ٱ,QQUC%Es7'?3cz|_ם ۽qد<0A OvxUbF#8 !DUM8#Ba쑹0JEJUEҹsg:wÇӪU+:u;@3 yni3fztHL'ak~9>@ &O ~b]8OrT:qK˵BGiئI&,q- "D,@X&Xn5-´iӨ_>?aذa1pğU:c8VQ:9ξ.o 7-MҰ=wGfD~ Br%={6; Bc\ԪUksW_}cҸqcF[oЂ MLWb%(C 8:/^$>,k֬! ѱcys $.#zejIclq͞Q:+Z#\/u~hu/1gc7_p5'a|ce8W?%B>bϘ1g}Ȳ;J6mcMZ`K69JYp8K,$ tV=Ic3J0cڍY®ϪI(k1/f(޿&c$7AۼF|ܮ7k1> BibV`歕K!Ri!BIJTMk-qqq<@ѱJl@\ǘ`-M]UxE[28 'ϔy6QlBrBxIN[۔ ,&=8 8iO# tjjU@q۾F^x_\`BQꀣRJB!W_E)Ś5kܹsdyV+mݺ$\Ϙ1#6ޤR`{nʋjQT%.%ϜYpPSF6=5nBm:.PhlJ<M:Y^6vDwAuƔ)S-.rʲB2;dƌw}ݻwgҥlڴ#G2|ȌG<8P- xO|za ܐUGUM^yoer-+Tbs(~=άa Zi=P^1罅"T7o&!!u۶mbE}v.v^KW${Z!(fΜIQJE~a̘1E8p Q]5!1vX>ZRNVLջ2DEI,f8Tm89~2wXB_.ǽS ~9c98"VGETB~~TZLZamuV٫B!D93e=\̙SJ暿r'ö\&c&R2ostd# 3Kw{lHjQF$nGJicNTe}mDXc!a|K1۳BqT]t3gu]>#7nY׹sgƎK(btҥ2]0dĉ裏^B!ʙ/8R:up;s=WƏ_￟ݻӵkW&MT—['T%Atgl#37exL\縃.QȤ1QPZ'3HҮJ|~`p|A(8PQKBvB+"O==III 2w}7駟f̘1TX~Y&ݸqի4jHBQ<$''zj1^ :upmncFϛ75='Ndڴi\z饜z%R* 8׶Db7gcWcT2v2axGLTʃE)h[kƲIcD@G>Le86p޸?W6^u;s}+\e3[r0߬ƼBQƋTViӦf͚̜9sֶD]ve~u7[B!ʞ+Vmf̘Qx 8޽{pUWaE)Ev< O?SO1xL_S'fB3^լՐڰhA08]Hh2j5^Bx#3o.D_ 3&.}&<HW\v2B{(FF )l?5lP)ehW5Ǽ'x]wu8C#C7Y]FFj:@A/5Q(k-\J'&.ͤxl.:QLt8PhUxx< OPqd4Y!̦т j Ue&ɳS*'q>Pu*aEvΣQjpUݭdcfcňLU3oBqJ!"=#?I]Jh۶-gy&)))("c<>c%.syXkٲe cРAA222ѣ]x]u+y P0a<}y>]7~P]ƝeЧւ zT@߯H8> &BBQºﻃ ~a9 E`NRFWoV4MpwPp|U3ϟt] 5#/0,]!9\@!n1o<23 3ڵkǽ[tŒ3,{7ꪫxp]?ʌ xJ3.XK `3U|TVGuI}zz/f8)I lk-|L8^-0?m-{V93|6e}2`/J)Gu&ԯ\_&$6P@vXg !DlF>{ woXԪ!X]3kjM gLB+rQb j)bU:'B*OtMa[ lFޭSqG] qP A !đr̪UBXk_˹[=@{[Z9hP 'T'n}̀FU'~&~ww.&0 @| ^n4]W缁xW%Ty8桙 g`Lxp,w ߶F5[#9}0 C e wk`{.KCAvG.ĉKQ 8blT3lR<մu {Æ5Ax)%[`K.VbBqD:B!)J)hтK/ۧFVVVo kB}6V)-@[Y(쯅~^3c40 G;jW<ZJ ~۾a0?or=<L]o0Eػ0Jp4_XM*:4T>) _B-(P%nGJ˲KM[~A &cp @'U🹘%[Pqli#!8$(BҩS'+,XP]:uD-[Yf[*'@h#6 )('qn9xa|ZU,YIA-ڄ{?yc!ZqpB֟z*<'a[7bmu,:RU!`M7+Ô+h>]=t<C%odә7;ya<m=] ~&ۥBw2Ka6lQFF4ie:߱kwR+bQVCLvrH3j1#G|BDBSN;Cz~'oMݺu2dHj36%`R'ވ]C:`љ/2vnm=#~o;o^>TpI)Vh08Va'lQhO `Mِ +1qޜ. 6B1x7b7g7b ! c j( ޴P9 t6ōؗ<g&LNwdC@}d U1csQf6Ǚ̩/b,kҭB:(KȋP19t:ݮ~3s9 O) /iR>!?3T@ ;}c25w-mjd$`Kzjf5L\^'/BE)Ñy)sKfg(l6ay'$'k!B!0h Fw]ロ͛3}t3`3{ԹqT':7oף\P( ~PH):lZg8^80 UK(OaQ ;ыLpOY)؍/?fDUJ ?5/`+wgojUnd]_ԭ꣪&;Pu+c&-ڢo=|{Gon=שpI̸н f.5Яi HX\uE: 8lN7 Pzz(6Я_V{h%Mn31}NQ 17,k;FsA9A !Ni!B{9?Ex7ǣQ:u\ |gՁ8] 6^%A|&; {K+4 ZpaF)X,^8Xi5D' UX@{D[, )Z hk+ٸ=k c MV<5&/Ua⣳ۮ|?2cC2cAG)m0+xgQ~@fcz/sM?gW<}`w1ccH?8j|sg 9c^=3;{ME䆊.\.ט{g]yoa*ZTVvs6 $@{6#̷k{ܛu3( GU;`?_WOĮ٪zd&;L4B!b:R@!B҅d^m@6ŨG%S9N=Bfm5ίpFy:!`Q APY_ r 0ڀUx,5*)ҧڔC:@^8#WCq=˴P?Xqfc&ݨf{.v*~ns6u19 xYyxYyǻe &m6 m<1[ُ^xPU*4| 'u~,% '|뇩VaUլ [?Wk b.~ƵȱkF~}S0ӗCxRdƂ7!'!sM(M B!z٦m^Pt2^|ss>=NZ؂pw浰*TU%: Ghٗ%Z I-T$5W-8BWik+]xs_,V^98N3. @9 v&#ن 8cA*0Ȫ937dcSBzde V+"]` ݥ>0gEzpɐ~!kv"3SP%UY~]>G?EGg*c1)BAi!Bq<NYt*; .A_.lULMA%AYT™TSwiUr\T }l bX"~~G[MNCFpJ3TT! I4V<'+lVc1 PD^W,J)q*֜Pq"AJr]?ZLR0}:`\Ipqn׀>ßX?jAүWEfWLC^K8naoĎYLɀFlLϺ) Ǐ~y{!ޣP*ڙGFɑ̙Vg zw bKz< w,Yj+3'֕4=zǶy~dj&Jʺ2g8Fc$2?8$q2 Fsa+$1^kNqf쫓"R%C2wo$˜1cpHcYSdK ycϱfܫ}0{Ry'%5[?8Yr'PZ*鏲e'A\h'c Ū,un(Ol3Nq^'TƙOS<-0},GvQWilK'j*?P6)-,]XB#*>cY_yNdزMj'P,,eKP+`e,ݍ]DDVp|cpT|q}}Ï}IQ/Jd-SlTS6xcvx^K6POꑹgMai9T}y)#uJ %m*5)U3Q0i)"pDfSn9F}LU[U1rE=%IonTm /ْd~4<5P+{H;0\㔮Z^Iu~|̽E>y&/<%̉e<̣dYmuΒ$YJ{e%%3mm w(KeYNxbq]d+>$g'p:)NIyD],<'ޕ$#y-L2NHqX[yd9I[ k/ϴ`IiNWrp#4dNSRgh-#{@3ylL42``Pɼ]5TYg7Rp~gcp~j-ձm vt2Q n%ύ=8v ?8@ ɜX[N-u( F-L('N:Y<7-yMT$+xF f; )Z2৕t6N&IIΒo`)#+}d"dnkH֍=GJָd=svʖגPV{- Nvpt%꓉,#+=)I f3ȟ i^[;&L$yd0̥#I:MݹԔ9'61  Ҷː?ӹ#_s٩^:Gw4Ժ]7zv,ui~4]pdl~dwXfy2uRd NsO; C=sr=kT/U%π2^K䩝j%9ϫ41dϙrlWyt' @xMK&?"͡dR|*Nd%KS8v:OTֵe:8zwک&9 Vdr;pɒ4S k(k5Ne=}%dd5^u2p$Ml"[&Geyy;`S*Op~b~ܬq]Ֆ pղr:v|׸A7I}`l{gb1WGKkdd2eHeګ}&2S՘p"n ю9lT8|Nwg:#spG^M nm/kxaN:KVjQ#˙MkwΔuZs03-R~'[ndoԫ$Xg4II(3ǥ"P鍢_@1Rߙ˰cCsXFV"g>K4iS Ooݔz1&bd#',7MҥNkH3c6ʮR2swL6jXKR}2G)@/s/ w_Qq:Yeri.d]ѡ:e׊ 88Sʾ'Wz,2 CDPduH*ێ3c$g22xߺyNeWY>nd nZ2ި]◽cokguo,kuY[y"Z2@fL5qRQoٌN?ICG زWqy-y04RR`gJmj&IS>,-U|7vN?383>Ӗ;Mm$Y[)0׃1ƻKC)Q#p,d:Ǘ#}X.mnlWNNjQS=*'|@v9P?M[^>9Tv]攬nnyJOZqXG׶%%Io.j%%z{uR!@ʜ;&BFrY<ӹrOEP01,#%%yHi {-)OW l&paŧJZ~y m+ mc[.{P _0pf8uS}ڠn @!/ GqC@p7 GqCږ-[3U;C 60U۵l27P/*͛*"??_/ↀ#@w7k޼yqߴi4mڴo޼y㶿KjȐ!q7mׯWFFF\qZ⺿ _>nї_~\R_}UwM7^ϟ 3r-m_Li֭qdffVeb4UZֳDxIDAT\\۷/nm[@ Ϗk׮^xﯠ@m3e۶UTTڶop7bxGիW/cn5#<L\yf?^O<~ ( GԪU+͚5K/֦M%KhΜ9j߾֯_ɓ'3`@ ٶm5_~˖~T. =).Tsڬ{ F79918 JHH8`N;McSff;NYYYγZ*MnnTvm_۶m$5h࠶?;v@w>)k駟ݱc{u).[TT5k(%%%.[RRUVsq9_IZ|ڴi>_I/dYZn}+IVRfff{p777W5jPzzz\wÆ ڱcN<`4j(.盗;vDu.{_uT7Gnn>#;vV9ϋ$}W|7g&\7'jȠ!o3RZn.IEJ*KI%/=|WpKov(0zhp Ztw^իW멧p?4i4iKJJroղe˘dիW/jyEW$}\<2ۧ{IJ~zxq9_IZx m+)nk<2_n@wɒ%ٳgηȡ?//O?zUXXp<3r8kq9X|+z# G!#ñj!1>/_ SN9E@@6lΝ;uo9 CD#pb#s8DرΝd'po>\RlLJJs=Gj2kڵ6mݫ5kHcƌ)7 0hѢ}QJPm-\PSfԬY3cԦMw6{lS~ 6(--M%&&7`~}ڷoS]wݥ F}f> P)d8zG/_~qY3FO>du[lq,;ukʕСY%IÆ +~QnP)P-mܸQ .ԋ/IҒ%Kg^z/..T{շo_-YD:d61bK}Zx233%I (@tKrڶmKjԨQ 袋.ǘ~gIҐ!C$I͛7wm޼կ__݅#oݺu1|>Iқo ܹs:o 4TGTkzҶm YGI'=z`}'0(J!cy'I:#aÆ1Iv UՓ$eee1J!c?(I4*?D5Ι3ܺ3@U;$U T7^{1x<7xC˗/WFF:wUK,$M8Q4vXI_W76m4IҢEe2ƨf͚zH~_cePݴhBd$5h@[lap~GÇ />6(;;[k׮Un4i$~5:33pXK֭[emw}|w]j p@3vXٶ3gjܹm[[ne`~g?8t[vnmۚ={rss3hömIһᆱe˖iƌze۶>c pHp@5rH(p饗2U@NԩS'pp;M7lqAǸ"TOvIq @p@XYeWGG8X6 8OqVq+Ut 2x1ez[fMm۶o߾}Ί+l֭19s_{jӦڷo'J7nM6Ix ~JII̛T\+𸿬CFnM{oAW%%%}޸qGE-ڵ1D G-o4gx'jʔ) &phJ*Rt12XQ'Jɓ'˶m :]VZZO>QF#۶\q„ ѣou^ziŲm[mkȑ#yJo{U>Xplag8pc9K.pg}6qjjjc,ǐJg;pcu]~ܹs%9كӸqccۀms-˒eYZp;Gbb:Cbbrss%9M6oTF wIII?As='IڰaCu rf͚.\uMwխ[W]wuv3dwyzzN?tYFk֬*_tj֬n۹sg>@#xUN12*,>PF!K,)( /[\Gƍ$-X@9996͛7׼ytj|m[|P&M '3g*''Gԩ~oT5h-={Zj]wuj߾4p@q5F`$۶={F->}^}Uq~~~T3f_~*((UW]#FHL &h2hرھ}SOϿ馛$9ӧ6m;wO>Q۶mնm[=裒+]v>L|(I) 9R˗/1F=;F8b}vZ]ve`O|eѢE~zըQ}G}#GjΜ9? j׮]/..v @ 8nWzcMdB]K15k{+$r->72/|_P.kԨ^>sIү*I ܟg͛7+cǎ1cƸsR>ƍ2W^y?|I 7.%I:t2CY1{Uvmws=={ȶmM8Q/z]&t9[o5jFivXcdc(WttG/cǖƍZ`${e]zݫ%i?~$'gyf'xB%%% [W_}yw}nԦM}nܸQv[Tir[J<Ou;w֧~>رcT q_F-s+#==ݽoذ$'RrB>l-Z&99ٽ;v(--khzx=GIZ~$)%%E ~U8T,`,VaLdPlJ!A?{;ts=|w)c .,1cs^Əvx9 1n\M>=oN:fȩ_tVXQnv/ TNN-Zɓ'G&ưaJt?~֮][VTT"˨C c4cEs8V*HA-[T->Zl͛y<ܚ7o^%ƍSnnnT9t`PY瞫3fD&N-[VxlIII@ Pn]dݻkȑ ]z'OMƿni۶ݲʘ9s ϙ3G>O饗bիPOd12X6kB?$iӦM޽]hA)z~ .@4wrciƍ:ulv~@#/BtEiԨQ;wnTSIng}+VD袋m6s5jeOm&1#e6RvD $i…7N:v߼y{߶ÿ;_~eM:U֭sM>r=j(wyd;$)))jO?oݺA7|, :]>hР[I]+}\Q3uדDIڰaCv?VXk۝;wjZpl"IڻwooР }W^JLLSO=>.Lcǎ:suM7)++K/U q+T81$&lwC6J4j_?6)yi&tM߿^y}>n$I&9r:u>L'9HBѣGe-RΝս{w=cf1!@@k5\vM_~T銤mJcѹ瞫?X~o߮DMƍ;q曕믿^0xzyjݺu:>|5uTwѣo>%&&Hm:'}뭷@ ^z /taΝ"[z뭷Ρ_~Z`nF_r!#ɩtv&Fhb,P22 C2ĽرCԷo_wq:%IW֖-[2dZhիWkٲeݻ|>RRRtkϞ=JII1Fz.]*cӵb =裪Qyq={f͚*((Ѓ>;wnжm}5h@G-Zps]vՖ-[Ԯ];eddhʕj۶֭[zRcEm;T&MdY~JJJ4p@=***RNj*|14{l:t^{M:%IuO1iϞ=Qc5nD2rrru֘222m .u]f„ 0aB*K,/F!˲qY}۷!#Z0ǕB̘1c$;sճgOIN&c?~.4J8ʴo^)jQRReY18&UT&kƸB5bqQQ e۶rrrj*]~ plqEI5GYfi֬Yڼy+5h@:t``G 8pRVVʠ@p7 GqC@vѲ,3p e˲aAzujXF]͌.Tclmݤ0a5iu?*0p,KukU[Ȗ̀Tk_dզ>9A*Uv'1PAQqQT@UU#FeC a`J&jg^. U*Vp8vU3Zpr"P!\o|ťiߟ>@p7*6ƨ~9NR@R)q[n݌#y2I2\Cxo:OoJ~mIwK:C)-i8r[TRZ"I j#}\pݻ7\R<p*))9noHQ0af<&T+aG`t]ZIENDB`3Depict-0.0.19/docs/manual-latex/figures/tree-propagate.svg0000644000175000017500000031661512640746376023137 0ustar pcuserpcuser image/svg+xml Ion Plot Pos Load Downsample Spectrum plot 3Depict-0.0.19/docs/manual-latex/figures/spectrum-raw.png0000644000175000017500000060247212640746376022635 0ustar pcuserpcuserPNG  IHDRMXsRGBbKGDC pHYs  tIME ;ֺ7 IDATxwxTe$I-UBW:R"DuquwરZ]*+bC**(@BB >}g2 IHB)re̙2pq TI9 F\0 lHzH˳{Van~2NlBb rr1^,z9_`<ޠ@q}DDDDDDDDJ 1IٱaunW73^[gxi""""""""%p(1 Ҹ^r5(Gթ^7U*rߍ.La:|o5}<~a>h""""""""%p8|8_^Sx/Nk_ؿTYE)n}keUoѰeK\$+"""JJqS;L'CDDr*lWTxOθL۞6gI}V^oڜ匎WZ<yaU)ӄE4 Aۻs n@nlN=c)eݺTsAtlےzBLl6}e!th۲D매'- X`+*n OWp;0mrF-UkR͎;ڃ'x2\)۱n[8r0>yC'YDD ~&̘\Ff&os"!AO8z?]EHi1p"=w} #CI"''s4% ۃ^D8-5tm\N4n@bR ' mfӮu }oACfV{~ϱ'58hܰ>Y%;'MstaEDDj NnYUxeه)x^лkڜ\xA"=NqL+SB]IF8r=-5obH@ߗ/g| $,6̬\>'&Lӆu-!Jt9NH䒾HJ`"y^HH\NTSް ޮ'aA̛>_iBHM_yȞUW}x>^+,'n`b+%nym2wd:V{lTAA?ӢC}5WCILJ-gee2/;+;v|M>rRgLJwZfݹWN!dee}n/ڶno9'/"_DDD =6F +ΕtT``}Pڃs3 qI,ٖ4,dtHdL_GuGy_X@zI9I`@994ѿ\[V N'?H7}T^olb^s㗨^oﵐ$DFFf} f7[.2$׸\.Ndd]#  MX8*4M[6w|V:4Ҍi˶];޵sUc+8 'Yz4 rp:нFT"""UNvbܠJ9ɒh4? etD'$U[i~N izz=[B+>B}_~;SK7мYSv)z-7ɷ6pe=i D&%݄֍Ip/Ibun o111"""5rirp*is|w>\v-[Tu{vv-4%js+8=\'h[F-WE Lmri4&"E0 }Zh~uqx: 4qF< @pP͚P;4:3  ܎8ၙ>#=#<@hh6 n\Se/GmDDDjʣ?NWxSu<0AUΝ<.; N5R*1GQ=BBBҹS_ D6O9^`` :;w9$$oק~&"""5O'"op/6\x瞲/U""""UGsDDDs;6KCL?fI{d~ *%NDDDXnR3 JsDDDy+%+Ii1£=?W۹MK'MDDD:uja~KΤA){""""tѶC'>~mk7$(s4{}ưvS#:;~?snPXH.VZVۍ9\g֨^/""""""""5ɱDEqWv3s8v"ƍ퓥U""""""""et1WN}:9;|OU1U 3[Qu`,zf-N,VHP M3; KU""""""""RiJDDDDDDDD* UVHQaƅ^PԾ7nQsnX }-+;ݺ;Ty)+e]ODDDDDDD< ÇNEO-,l_N5naziKh^ zI-]:upɘ1\:vlrY>t4mTDDDDDDDʓIJJ:mL~; ,8)x<̟4o S]DDDDDDD04j]))\yUӬ9W\y%))g pDw+R]VÇ'(8>(׬vs%4NQw߿;vШq4| {w~Jz5W_u{)Gџ.)2O,:[>~g,ڶm믿siDQwxA +/̙ ݿCqt~̛4Æ =7o|n6o:/ kz$~ !!!|ٓի0dȐע]Iׯg!Wȹ+5~3XztHTVYHsw\ҠTHLL^zx<4hPO[oc,\ysm櫪*y߿3Wٴy3ϣWޤaYT OuGGGx $5_R 8y&ԯ_7jDbbsQ<|ڵ/y]6mڴaɳ۩2o|:w%44R]D4h@ZZ 4ԟ.)3z[a7999꫌swĈS\r[p8[ebXyzoyuDHI>Jdgr](ϑ5}5 ئ-PD)qXws;$ܹ['>>\vvUv7(?.c*UC1S"1=ȹ^y8T"%r4u_}|$$3{?} 8J|⑄~_+LU;FjP>^F4w$_ Lh]ʢa|Ȕɓ rQ^=MK/['11ڟp""""RbP5ۨ*lP@o?+ﲈT%Zh|2ߴ k@T9)s7ndh܅D7NkV\I&4j͠At2ڶkO&\|rr2OH&1L|"))ywJLLqiӶ/i¦vOT<PcꮪUʣ{#*"R 8?)|Mvw{=u9sSm{p]w1s,k\ہL>in7wۿc,YS=p߽o/zhvkO\Pv|͛7WUŽ`{+Kt""""RUŠj2:ZjrK}TEDβU]v xv5lĒg ƛo/}1ĉw;駟2l؅|a}N6FMvvUOvm `䨑z}k}\1q"jo;1կ4ѣG^cꪪUTۿ L""r69KI^sm7Y{A&D:۟z"r楥&Ljj /<SL)q`tEDĪAOzU^FOe9JV ~?޽{&11Es u\.GB]v1v%ӇE߉~;; FrDžcK/3b(kFKNN?DXTck̘1,^kC?SaTvU5nO:D^~]^cx S)qX5kLX $) ࡃ4= Y={m̻f7<|zY!'1?E3fLy6|À . ^۴/@hh!!uׯ@>} ]f͛/ꄊT{U1ZL^P5Ty-;Ņ, rLF=MR|/r&]'RSMD* ,_&ۯAu9 @Y1b8o&.v&Nv@nݹ{5rwy' 8ZAێݨN9%smޠ(ГTy'xMӯj ಈTME>\I*`mIXXchzNSrs ݹ悧\.'.WX)S=cӪu+ǽw\9rsNzIZj3g("R(^f`8P=ED"_uYYؿO?ILS_`6|QcVȶ333I:ΝIxx8YYY|}[mr: Cǎ4kѢS78001c[i8y2IIIޑ#FкMRlEk%))y>"'; IDAT"JU ">jݩL6X[뷮'"RJVefeuڵkOX D _999mEFq:]~./rϷndȐ!4oU.cgggޟOph֬9F`5wet}-Ӧ^{78~x&L_nUFjAAUX-`*X2wV`%"R~J}7@͡CiذQP%Rx<\EGFr,- 3_/9lټqҪMr T>iׁ!C/dw;Ѕ T4[AU„S*lU""Y7*<ĪB~\N'nph͚#kڬ)Ge 佃SUVXuKd&}oYAHE)yd8$]]S_vz&&x6}tgUq]EDljAd򂪹((de)/O?}zJJ &Me˖w#55~~vILL 7n_~noժU4oޜ͛3l0k oM61rHZhAy7NwyX7oΪU<{9zuҺō /@Νܹ3k׮{'ms(RR&O*| ]loАoERRbٴq 6^})T7_%"r5r\u]<>{lf͚?_̿/ '|~JHH_|k֬aȐ!no`Ϟ=z~8p onSk.NSnkǎlذ p7{~֮]{Һōk.K1w\n~v:"g頳 6~AF۟ UPUÁCGXf""rTj_h2Ug=o􈈜`yYnIQ~!= >G}ٳg3x`.]ʤIϘ͛3tPF]~]xL>۹ aȑ{v'[~;kf\ΡHI搕U:;Ųc6o{qtӏ*Sw<nz99xOSȶ ?Ja9+bP4SU%g;y [Κ5n˗{>11͛].`; 6o̼yݻ7|7,\qz)zZYt)]t)tD^|EvKO /QQQKRv"S9)Osc;/:~,S}ǎ'.5 {8B;deeu& YSՂ9,%<ba~YȲHYTHf͚1p@^~|χ?s8mUvmڴió>KN'66KhhhDEEtRv}ǵ^[>]s53qD^x2o?ѧV9)1%ԱS,}r,-}}<*L(RS9kTIY׿j1JDDJn75mڴBC?ë%\{mРA̛70p@/^\d*!Cb \.rHLL-޽/޽{ϖx;奸Ks(RJ4nBZjɃSF~_N'*""U[U TGA߯ji!""RUԆ¸馛=w=pӺuk/^#<{m$''3p3`o|$ijatуZJCsM73;N'N*k1yAU;Q :t@?\lix+VHTpvi׮=b;ߛFDjMVVIA$: ;yӷ[N\.v~T!Ƌ/ĕWLd͚5PX%"Re-&qRPU}Mۯե&"5Z@Yߘy4"8jҪU+bbb)׆NZ_[=N[޺u>Ov̸6ƍ ms}ʌ;$))b 1U) aqW>өMqujIu̕ Lx:eJD$ONI@B+~:t&'=p}a{=2u*]c? ~#]g}1fǫϹ}DDUJEdASK}6 W`I{j֪2(ɣJD)Yۀ%c0s?~-S 㢋qi,{ BC>|8999:""gDU ƑT,Tۜy in`8&dHbb9ۮҾo)y-O8O%n(b T޲G<?""(4~U;dee㵌a%=믿ݻٹQ^= Ӊ9jNPl.R0Ndd3< DŽE~αk_k crL蔊 Z`&bevs#-4w;Vb-c^L(}_1؃+`̞)c,"b&"Rݛk>ܺu_ /oy*;B&=zt̤kP(S0&`zqo416LP{M1CすvVmtD1 MW0b{[^l&aUTYxG.iذav^G|tnGDs6e#3Ǹ{=ԯŔɓ~Euz~$$su餉T U){T']L4 @f*xʤ#1ǽ*80P6{LT+L*7j̴0j#8 &ba gv.T},za²0^՘P oV LxEb*zʿE^x=HL3eVg/yUv YJUYެ\n .Q`5`@vU-.8*SAHsy=y핗0Mԡ]y_4]7e|Ck1_JfbgXWՠj {޵LKFcDK4S_1bm3LpԖNH1S~`*cB@zjpfL Vwc"\Lh&L φ`¡m]Wn{;a*>„rb ^a6LSU=_ߏchi}o@{C1ZIvCi@=LP/dYDf*4ѣGpLrv1EDDD0sĂŻ/%6zXq9 k\'Lx.` bF5W1A*LD^@nL5RLR]LB&(bOQZ@#.`LuVG;>4pL\LO)a@C n폰R`+Ow-{ܝ0Uev;1AnPs:&,̚ 1U]{>=㟍 g\ "5i5X=z4پ724BpnX^}5 ot-¦ 6frr2OH&1L|")))?Eoŋڭ;rJkIII\2Rڶk…9eQDDDD&i'Ӧr7&?jwS)UCg0 F=!b0UF阞TC0b+0=| nCv{]v-Q Sm3mWvnL0t/f2;ݷ~ r1X{칸ɞnduTNec®4;Z{cn/Lal 1~Zmǘl}}VZXDF*׻Nv z+?wY)uSZ(Q9Ƽط^r =4;{"""XB//XxyL0۶49h X4*&/䠪N1Ug=ZLs&A27Ѓ|F2vKQLuS &i7 "} F`*b1ML ӕs׼@LO71aa{fJfv ^eL9S0T7a1KWL𓁩nZjUeJf@=,LU tճ$LT(LխI#`6-1+? kk~7&:ꋉ]cyTxߪБED*r \c\LPP'^Nrrr &t)UOvm `䨑z|=B;ctBCCO&we1ct}DDDD"aO:pUgRӃ ~aN`fZCbLr>fj_&_ۍ .TuT0VAy ·aBO0˅FNmTQmtTX &޷> TkO/?a vQ)3}g5#y\1=ܘ* NLpj#&:TI} F "3}3&o}bLk*iy>&VZM LH̻DDjؑD{9۶n+uKbb"G]<֭[{#" ? ШQ#}DDDD" SE 7T+sִ{jq?#w("s׽1I6e&3vLX޶3n3n}7cjqƄ8~& :3u)|=3p+o(LALtm/7^V={WcxQXb*0S={|bf 1Q ;!~coswC'殉1!{na³9]M1!إm0aL8݆d;g/+OL$W5^f 1Njʕ*ӹ+y啗}oi-/::+fz|tA2)j"e6ø0ØvLIK^$`*}B0~4?T)ec*b1Sc,/ Ӏ=ӳi 350b.4H_#1!S h}o=1!}`''"l 7&8 L ٮ4{j&, bk1^n챶 ؀u)rp=& &b6aªyJo0mbza7 L8Î &'D(sXrJn&,^{n׮]{ }aѢw\IL,Ѻ^8]wK/̈N{Q#G+c?OHi-"X n~U@s^!hns>wa+1K"tQ~Oa*`8LyM2c b,eiLPĄ@N$b*Fc&c}b_?seo갮 L6LuT_LS56 ͺ}{3&zS[7Ҿl{1X>yLw!&lǹ'{Nw3|Sbq +5{ V_,ݦW|K^EbL&"R*op>yu,\4GԓOr 7r~^n:{ F]Jny)8=4c3 yGO{ヒ=ϣw^8N}Dn++fqzALV. idr)TR[ `)F=L(jJ~چڋ kLN1N+QLu>ݷ);W* % x $av1c04X3хcL6|n7;0V_{1T=ޛ0T{1#hg:ɘ/zTaݏ1WOcfw n;VW5~"1Hv{#^XLOk(.EKJJW>n ,00֮?whs8'.5N69c\clnD= UDʹզ!6yӯj NӼO?q&0 SmJ: 4T' u$y6LI(6 T WaJ^瘾MYsi030@bbW`5v<;AUcm ܘilr;v f0\WUlL IDATގ.`w1 ɲG. tƖ)nLES ~1n1wߘP-+j]~ŎWz@owHLXrKU"Rxow`,zm^nӖ 0`@|)飓""%x8;vй[wRm ]A8L9ah{Dp!9[D_`90P& ك Wjc•ᘻ91HLh ,&u0!SiS4u阐;&h9 ZcacԲDZ 3o;0!$LV;ƞ(f \&&J۹Sq4X R07 M8;FL_&su1}޵v7TRc-˾?>>v\LKBf}vmbBCm(yQ{K.SgӯjwT[ N#<ӧs$!^{3S:)"̮;+9BuBH4+['*q+& l%."ҟ]dМ\r1SܘPh1&&2 '0H`BLSL8L #0M0Scd]`Wu@myP.&i fj`]Lbǎ„cc %o*_gm9qcb{<0UbnLP_}BQ8!LkS?c~<f`3>0~yL ń0=`cYɔj &>ت;DD2Ul5cX\\RS:I`` AAA:RT; 6S*L3TEؠ$S5iYN@-~b Seㄺ6VT";Z6/I6\N󛉙j { j%a}^_a4pi-;]I^ !U _jk ch/UJM*n)|0k ^ThcńlҾ6S!u&nvA6j`Cv0UZJ4: ƾ~B%cZ`rыյq=Njj~0anLc_bN5͵G5UBEDVٰkUU\f+l.ڷHmuKW/*ym:N^Pz|S^4bꆙ毜Ф&Kۏ=L"1k20!R &3% +na!C0E. S3SfTLLqpLZTv[_v캘੃(h`HTmĄAcB8LLc*0!DL}q]L{β6v1з1WwLԮs=.^ ML=9 GNLEZ.} F`^L\LX j_̾?K5`V+'3tk&s`p3+_# `An̛T15[1Зy'i.-K0Vi]Qa2Ajgث>~\ JpzwwP֯UE|G z25&>!*cFQQQ4h?g`ӱ7& %pTAU2 j9m` s ưORB+^,Rch@D= f |@ Zmy =cpA} ǂ&jJ9}U`J*+Vg͕Xj[etZn8+@sv+c+ @xa.1mX}u]W]Ճs5$jc-b ,uѧ@^HͽE++;( } t*!K<8EpY؍?Cd?/Jg6''C`Y;vlJ$$&:PtLV:de%"o"+>E:99999 .\ A`j ,ǠT@}J)S &X b8N`ڻWٯ0ɚb B.Qkh1`Wg/6`w*)0u޽aγ0SX*eg)m}&F4j~KOp''JfU p vጌZjŬZ?tܕj 999999~%Bf48 xFZ`tÁ%=<fӟb3[FbΘ1K:O%G0hZbK{K;s1L[ h9b("9y[Khu`;X!,us#ט۩u~+ ]9n X b\1s@*iX1K`|1-`(U5j\m#~Vc)yeC aƒTJ]EZV'a/ CV }ano5Ǝۍ:jUy?]crmNNNǗ"] Oc_r^{59 wA.fп_CӮ]RʯOjZ~P;wG96Ν˨c߿?=QqjZen6''''AGbPLŴ@VrMtOTm)X.k4ZtO={ 9^Wm~&@q)?@ j͜|r-|taz3ryxvvDٻgw5_sb[Q0uʓL1~# Pe+\ˀD S=s3LY$T$ެf E-n#.ڀ9 d4%acW&J- |"0Ss7KϻJ'`,E%+rA)K E ea ׂl+JZL,KK19k}ZS/* :v*שa?`-D {AkΉ0Pw!&jXktҜnJMs0祉Fv1Z;9o |u/_ndBrrr:>UN54 HgͦMܹ3s^yHn۶Vdp"۷ozf9$$$0v쥴h/))aȐ!trrrr߿btt('L!K?q"( pͩWTe31P"OAH̍s@E/u]$qAd&r~69&MҰt:zUj?RZUuM/,LفA'9A/(&B*>G:QgkӀk0ZAb55U%w"4}o.*^^h!hmy 5J`2,M֪ K;Xk=U~7P)wc7b5vVk.2W~鄹aiRNJ&+qrr:nUNN{aƍx㍌;ښ6}:#'&&3F`ڴaհ#^&Æ +`VTTeee?pƙgRFMFq&cc?s?{X`5Z:=z>;h ^ySz Νn6''''(/4ϼUD0z$cޔ=M}$E WpD;cY,g6VTzyS 80s}(8Z H}w* 409^j_ 4OXZc,]Pq? :%<%PS.RfJxc|I04+]_KUl%mj[d@&=KW|^qsm$kdŷvk"B;,Zc{ }>îX].MuU10Qs>~+Q̧bn(DB5^.O/NNNNNV995-X 9 MO>lb~̘1={2nܸj+38s8sBv ;©M9sw8 vʿ yǝl޼SO9{'NNNfޛs:{gm[k_rrNyQ\hݶ='iOܥ;\w=9G%wv5QPu#3ɘs* 5jsE$KPDE @ (RhMe MO j#E V ؂Sk,zNqޫa(a0P&C(1 ݎ9TǜeIX\=sjT<;)R$lFcPkOVs Ju\yYOU߫5M@mjb5njy >afbݘ/ZkYHR/bzo{PsUR* Nuuu v?4llZd`>aasNNNNV99Tx >|8O\*` VUpy KoOf޻*^$UW,I*,Rs( fĨd!0T@n) PmxO flnwx RU9vHC󨢟XUS17FXl7E4]PF=ta;0'V/̽uV+*PͰbWyQ1ǜWgw?EbO(0CȨ!^듫eKSj!Rkd+>vb@^Չ. `~UNNGӧӣGF 0bzӏJ>_̤SNZ#G~m=̳|g(52~fuO$$$_VvϞwnvs>Cݺu8CjꤦUq&ܹ'۪X!]=N9<5nŠ+j'%%帻{1W_ HUy0s8PrW"r'V_F-So뺮X ݿƖ03K\%sL݊TjRH}@9=i>Vd5T@(KV[I]U$L$P 0S+֮Pu(^XXͨ[&k>aߋ4֙WyX;Omumg_A-hVDiS;(>d,uBk9S {8W8S.dOUNNGC̜9X=lܸ'xT͜9أ֧<]z饇֭[Yz5۶e+߶̭\KPP=%9| HI?8"""2dF]>Xrr;o+ۮ;in?w]Zj*s {y9>9s)'iǨ1"[ iܤ 7eГYx=$eîNzvrrr,=OYtm64)Gf3C+6t:Q|GPxj"#XQI1S\Ci>UTC+s6}+HwA0٘6O|7W@LW! ='xVSskb.{ ڷ_s!s4Qlc$@HלaEwjr` dŢXc.xz\v6jUARs >]Sxw}f䫤f. +^Qm:Ki``GӚY&+ V-O2I ڰ:9999X*--'_>fxnݺqӰaC uƌ닋~ر#u9MΥ^BLtA0z( ܹs),,tg޽?ӇW^}/X@>}y<.ۏQZZ3pCjܥ+6OJ)dgN 3/d~|s~:@+oo^͕W\7 yK@ ׯ9~1gPw2jCmM jaM^z (N9TTLIX_Q_>]V'ضS+_P3[УTs&ݤfũ]4W A(/sl\UL;l΍+8$ 4L,M]KsN`I8Kك9Nz/M9>\Y.퍹[ɚ+Vꯍ1S^`)&w1g:,;]M:|haiezh{IkRylࡍ.&Ғl B3YrrrrP 111 @~xⵇZStAWtA.o=vEs[lE :_~j٪ wɬY^_|'L88O ws/uם~_Uz_<XS~h2~רɨc: iׁʦM>|"22޽z{ʏu<$y]>SzqNNNTޠT`<0JzgO$t}:\M!K0fu9V{~iCpcA4̽\:0чjoVT=Y}xZO٨-$$x^}4H`+NnF!Q, x%Aq+J@UXjg=7Wsm/VSj#8sSH IDAT}ߧi.waN"GZ(L;UqvLLiEc)IV *s6azhKt7ך\[7B]K-lDf_)٘KDGzUr5Cgi#t|(҅IeexZLt43?]MLt!]w(|tܕﺝҟeSF~B*V'!Cر}[pi]_;nz:~qT^5a[?w]cc_ػxnNqN~p"W1ɋ/@-﹓U H wXU/ڴ"L@b'3RE<"5s5$Z-(0Hq*+/yVՏ;!:^{;o 0Ǘ_ -ޓIG`Ź@XXZ᝺.Q;մNMxq\)L|D YTrXrrqVECt?E p*&1pCN#-ؿ wJT/ErY/P$ YУb `YE,1L E9 줫J S$T򰴵D̑V{)Uߗ 5S?QLƹY)I670 'łUWiܭET0E@2V*Nh66zoǿ"ŬBi:LÜj Nŵ'0_|`}>Uq*YA$pAc^9:bq+Vs֯ԓuX`6UbPsV1QݵΛuEjLk)uwf89999X>rr: ]5}sOٳˏwGhܴ9㮼G{޽{qRN.NNNTJ, _M0 sMEn$ p! 9U; @V"_ )9sԜ?ҽ s4XyIԼfau2ۚZ{߯tzsV1\, )}4c, okLfxׁ[f19t999r*"UNNNNNNT1:]i+VRwKC o {f_Iu )^pJœ+Բ=A,,) F0Qj@E-vL,rZDTEůfehTy_ gJ 1PKO1`m5;1 z̭4h;a*F 賏P!b Z&c@Tc[}aAX=Zm6K5# [r̍/zbohh`zh1^,0u>rXLŶI\x\0{NNNNV99*:2uR :聽-$SO̧$U 4ĸs4 +5`]b O* sU ؎ʗ-: J5KEP Vl9bʂ/5Z5i.V(s :]5: H[shj!=h6K{UJWνE$4zkZX4>BinciOaNxA0GRίRZZd?E1PpRk`)&/bPJnԯcOc3sM݄m/t.j:)iSoXf0J}H\{f(0Ѻڒֳ|љ˘U:999a`̥p9ʂo*) ] UlAg?5F %\gDb({пsx5,,hs 2ɂVy/b1 *rRs& Mj.m,S(5PLߧ Wzc};Mcc%X%M207M1W*,%m``OnZ 10T:!ŧ#j)87 P0/v#Kil *V`JM,]Qml (sbqּH\%{Z *S9FUKa\ƜW"uML*(nfw2 .+}vrrr:vjV""V:[PNE_߸fU֞T꠪Qӵ'HZF&T* l!RfYiKa2s$vaG6V#ZRF ČO>z-`\2zG@\Hq^`)e>yG xq d <#szSC1RZ`A.dxxi&6s*Q1TmUk]tWu'j 0Nh❧%;c9B I&qVQL-Vjc (fUN~O'sujTUŜfӰ&zg`P.9b,ra 3,e%m2 =:999ǰ*:*ݺpSRhبs8>I++ g.9={: siJ7L|.@xT*B]nX(H5(FxPZ6h]a@c1lc S4ӧWs/.G9ǚan(0TO V0W0'z])ɪ]`Ms1a}TU9T%T(=د\V yxEȳtjŧ#KGvV'>:?VuEs8RSae 6`uv 2bj9j։Qh\*#+W?7@^R e*;tF1YdPQ.]`4Stª(7jBtT4ޘ;$h:I癩S~~?)))t֍5kR Ty#X1s;a~2MX錥R q m 17%`)Yu2J]X"(_࣪-B6 2D`PQ!51GR=7^A!P% ۥt}sL0xsaNMUvұJ|BvV܅%Z1j*Px=>7м`@-CcxA(6` 1@/uclBAJ17 WZhGIsLZUJ<OnfMޫ g4ykfQdjESX(++Q4oђWRYYT999999@UwAڂA';H`)hRr!./C[ݲm4 3 oR 1P'XT`tډH\9;)Y׶ԈWHA7bj.u1VWDa6>(P9thQW^_ W5?>:SqYP4c8V۪PcRa1PxݼH3^}4U%Ț"XT{MUv/JȹCZFaZY[3 Ki<1H!.ێ*jNyqƐDmV7hvcK` M 0&s- kHwX8rxtyotkS\)9t U z0gk4QO a`FA.gpдܝ6P9QnלPȚz)4Ku-\ۨ9M}L?gb/ VW;y~O>\ƀr`p>{>e(dQ&\;կrrr:`@4=qAp: ⛯e6. NNNT1wIU=QX "HCP+~b9wޏPj^3޷ J+ BV^$-3KJ<ٍ9sJu ] K/^Vh,WRY5Hǰt^qDb]6!S@kJ1G]nVsURv+5 :5^P+@]g*!XM+έ%( Ƭ^J[ف9c0(VtEj)t+)#T@=P[ƒ}NѺinق:+k\V;kA-/-o)bN/}.Q*`θ}ӽRAu^kJ } ݪ1?G<`mz0vgckռjzα8NXcu}!hOŢnIVne 1g@'VNNNV9999&jܴi9>|𻨨c>nȏ}?磸˗ѹk7`NNNT@^q'%9a3yjdQ ];ڵ_1̱+փ9j , C +W bS޼^m{>Ш+H-{rF<}['(QCp'' mXiMW~ ^UW[ł7C'RIc.J#`@|Ykrm/]c}sai-t},ɂ:eeDq|8K+v`*0Ptͯ~=WsƭӹZ! s]9*j~~ݔx=J|Tj[0_6B`0zūXq][mb. N=Xe<4)o2 xEg?NNN\5_'''c@RSٗ@zp#U'6,ssU4LU .}L1j.ѣfzPqbw0Nk-R +Iax.b٫# Wx ~m9k_+J$T+Fc~Gǖc w? 0 Xz7ƚWj{byb`*dJPt)bv`7R. WȼX* E(}sbC@):Zh-18X[' WکKiVsڪ#0]K_ANjtN,ű%S_ЫY6q[ǻT3@# ws+3ā*'' ( (  t8\|#QDDeee.NNNT@aqƙфoSJb z.XK"z |tD@<8 jN\ ot5dP0 _5;20UXjWE΂&A1!AasRkb 9g dzE1/\yz:P:sW}9\yKkؖڬR^V;5ށcc1x.\/^KT;`aRkW`y ح`~B,/Ut~z4e*NC14+1UЬ=NTu}wѽK gXO\!ЮÙ,:c(p<2*#`㮝enիv9LT1&MP;nyZUGC]vy;IErAmH=#9nRZ``^jV# IDATls  Vs\H,ŭsLHK}9n (=*P[ o!'+qV)R0s V[kh1O ^bBŰHhyBm)0\=v+Uۦ=ԶʚA~eo̱TEc@ae`[rYGc.pY v;AǮy}ڮ5vJ C/@e&]351Z-a@"BmӪ{X`樚9x:MrK(V$nЄ,c}prrrr7WY ]XRzMzF=~ !EDԩNUGI5lG*lHY96@ ՑP  NWz/gB $ݦ{4vJXP"AS0w:KU(R~uzj[5jT58]^q*yWsj?Ъ 乐W4i{T}6~)OU۳R=. ؼߡqjtN*œOAnB:jXf0 Z ӵvc5;Sأ.`Bŧګ,(O .K|*˂ /DFR`{N`+uq_f͚ZjѤIƌCVVoW͚5IOOg޼y|]w4`Ŋۗz :Puaۗ5_MQ'''' iă<$H$Xznz/ ?c` 4d v4e [:C&}5Wp"^P$K}Jr_IZץgPWԼ,s `"놪RR"TTWEfIIX:IHVb{!ƒk %'`䝗c5:/Be lde6}>_L9I*(<4j[0ǓK7lW;JX]SE딭s&Bn}mb4sMz6sM} wkMk31XS0>,=UN-fb2"U-*P^-:>233d֭,Yp7&+zo+hEѼf>}/ S?mv@mJt_~1wl*}b2črW8U?~ Pϴi:thw&L`С|9 &;v,&L`\}\s5G'ƍڵkwX`ϝ_RNb kttծI?ylŲ/U4bw\pU na1HPsUǒm"@44郹ZN>Sm|9j D`n>;!uAn.#K)D\&G`+]$(kAKv pi ^\`GUQ cB c 69|[J`{ sSܳ0gsbr [zW;jaGYP1좰 KbT`Na ^ڭjCg'V(ڪyF*ԞJ\9nxf~Zg귵W^/jv(ӫGXآUU~{6YJ\TZ sRM--l,)7Σ oٲ˗s_~<;;*TpP࣏>JAA^x!ZbʕG4{2ydƌCݏڹNǏ~i@||< bǎtJtt4Æ ;cr:X_.K>g/Xt1˗.aŲ%.8NNNT0G }x0=,9> >N< s4\MtNKPv>Qꫢa}j\P`Y=2AtiIu=va>bαUZBEi D^ab tXYz-K1LRl5蟥foX{8BJB ${U1S[\/ Z k{ͽƱ@c9Iy6 7Su.5P{@կ ճ(Unv^{55j/|P='2i$222;vATfرcyG4hPɓ'3n8tBO>ouc)**0eK E֭ /@ZZѼnQ~FN~si1iпd@|s>Gwxm[WwurrAՔ0P5UAc`j='bi[ 0VmB.\̥/0Sph+ )HU x| OŘC+B0+EBΰ 鯹 D ty5lTAy"@S_^:b#y,+P0 ];Pa5߽&FZBiz'*I{kVé]}>,GsbyUd%]ꖽM5Rfk4ǮjP>ȃ~ʹnqap4Bm .0FbAGmx4;W|9M{( Y%h 꿡{-F{k;+a"g9999" SJKKc̙?z]v:?ҾzNcƌ)ON AvԩS9˿y;z8zRD*,iAc+)/ј5{Ѩ)ƨأb(((H8}uy_Y׵άY3{>kM߾}uK/߮T*H$T*zmqq^yOOoY&L?38C/nmwъ+4yd|jnn1W_Liii:Ct͵׵~6K~49B)SեKvء:|`yAGAD(SG"+@Yaz/)bT9l;) HIOigz?)PRl]tm IZFr CA!$@^4ih3 5t,0a p ea =+h_y1PY1&!Sw!+v'wag _)c3RH[ـ^!5Z;rfo5:GB8 A#1[Qf]9Zs;KtYz<ջ AXq)EyP^u}U3(9Y2+ְ`Lo{Y^DFh&V$"͛7o_ܢ>޼ID\--ͻ!E֣Ѩu릹sꦛnl橧TϞ=J%uQcHS ?;h|}rzIMDIVzM0`Y:׵llT(޲zQQ5IB_w306ˀS$҆)-Ô.go H)^JKwTA{=H*XC  8OR(Su5*8%q,1v t2I'd!߃a芤;6q]!9_" R/0%~\FxRB%S$#7/G7m%Ŀ)=t$g,P>A\jKNDeuu!@ҩ~ʘ2e\h2\j+,a%%%zyZLEn.ޡʔ UX))`^ M!P+&+dcEUaZ/.Ksjj6tI95RFZ|%6+dj@f _ 8d*\Y}%].St$W >w'fV>`'㼙rg i_Tic#_.y3.s\Հp| 2e2')K-oa1]*%DRϥU]|t)4_ @Nv+Kwɚw a<~(K\ ++ྀfޫy/Cyӡ~+||"IҵZmU RPb 7o޼yX.Udr<$)L*"[s>[gO8{kT[SƆz56ԫnkGWVZ6_{wwո)vzɊϴ:Z?;s+kԗt#G3zV4ϼy󶛃𩄁'J$@}5%5s6. 6i<QW*S*euUP˩p92c WSx}r e[ h4զ󷧂4ipP*T 2!@[G)+o)EqjW7;W)sSG5 _=~u/w5W_nY{sSqm͛T] N%,V )bS6jEoA`RJem}p?&+ /@86s:r)x5\I&_WIgKcJ|&SDNmQmS\-z\.@dN9![z)y@2%rXgT>n~j{ }OxYQAZXI{`SGYV:yיU0+ dʶI?<(S0V2:Gk.+:oT h,ɖR0ObM+߻@ҡy&J37s˛7o>x]ʶ}[zƏ?A#GTNN*~4c Kڎ7o޼|c|'B6E2۴)G6^ (&,E,@0I9 SV#S Y*SDdZ / ~!SSIJ͒՝i? dȐ)S\k:RG)8pqq[uMOgv &.SFS|) Os2cfII3wz:EjIUPE:w'+{&MWlq_i3ee^J\WP  qgXN WK J@0 }_-œ'+ɽQ~- $0:`ڡw"NP{D㉾W^͛U޼}~֭ik׮z7[!Qii~£۷I :Oj|͛7oT}JlV'KK~/XseqM=-zˤ2!!(@UYQҚig%)+]'08Bp@xD.eX.${sWOodq_v|N4@oޠUnS^^>vuÛ7o޼yPؤCPLU2 0$`!Ky+S\ |p5v"@ZNo'O[Ki7)S\H[bc5*H )_fNjS&釗HXa]*aT/xOi]7x.ׁPkW>(Qv@#.Zxf9XN,%u9\oґqHSb2K[*VgؑOw8p% $z4o!kOQb7tHz_>PǤ05&9y8e*+Nt<55x`Yw +(vzeP5{Þ@p by.~/esh rY@ޤڶ^UE=xS ?޼yk5MVjW(jv{͛o:USwxllDZ}CxГUYsL2WbU@KYH^@ K:@$VPx$JjT-E":kʁ &-?V f<^느GH v{9W3;pSE\\Cޏ)Q:*_% d)ttE&66'2EY kgO2įԂ)Y+]k3,v:V31hbfR >@;eEWʀtej]lII'ˠe1>K\62d@"[ S .f}xLFLi!vp+S-d̦2p|m: H7J&?* ^ މ_27oVy=Aɛ7o޼yPm x3c l̏<?cthhpiجrOIdL4?Wi)[ĵU$}%|Gr:{*N5kOY5qT^B&+8)Jkc!DL@{ q'Bմr:чr4|Tbw?9tk ʐCeu:Ju0<DZ!+d- !e)GMk@s$1J,垶$ɶ,9:8֖=X߫3e̓*o޼yX8qڷoiӦiҥzgTUU뮻Kwȑ~}],QaQ6_%U<6nؠbE" 7o޼~HV|d'*-b`Ns'䕱n,,)V*@Igߗ)r$eK6ftUwjZ#ȔsQj)UfJw"%]Cl˔[I`ޡ"9RKGylb$qHЖK*S  p- 76 e2Q)pcO^_7͖``44 j)sduV1e2EYLa>mlt \⊋<{JAԹnf~X [D,#[k#y>L[ *VY\{|>nj𯃬Y#׬g#vW62-57orY =~i552u_]D@`sm,yanl/N?t(X?яKw˖-~}M,9c֬^x<)x<5Wk+3ԧo_eddE͛7ovxi٧}YݛalJ׼fl3eiN2K_[ I2UIHVսj`R R<_ HSVwY!qu:G**kYΑ+SseiD)y\81MZ*yߝrNlr|ޫd"NKWmtT<XR=2Ŏk7@-7XD'}Vvz_Z/UrW+81o.дHv,YZ2wGOLTPPJ:Ns v`@^\ͬ|ZA^Ω05Nk]m[Wي?bcObs<W[k u^FK^I ~Up=JfwkINn]K.;tE0kܹtA7p.2^UVV&Iֹ瞫W_}UÆ ]wݥIRMM."Kj߾nV>СCkWn}~K/g;_/Ik /P[l]wݥ1cEծ]{Osfj%v;b1i~TVZ,idRѨWy TuTugF'۩@2%Ygrʗ%X|*;).MK`QtI O,ZB{k?vo92 T!PdjXvLXHA5'SFƷ0+ϋͣ>e%TN!>1w>@lX@Sl3 T^u:ا{\V>Nu2 ;Ui?p=(g@^XNg^DgNFbfϠ4QA-{Lu&Xg1@,p0XyêM7ݤ>[=:(pܹs[1Y;W_n(^uU={5\JtWםwީɓ'뢋.ԩSz(I*,,ԓO>S~/\P3gԴit 7cՌ34}ts9Z|_;iHDi֭ڷЪ_$ eeg`|۲y } yUIPbQ)N`"U25QLr`|6/iJ?T-tWp_ mpm~Ն8+Tq$qhKRFՔr)S +clJN(SpRKŊz=pg(}&鯌1i&-*X D8 d (J<'>ƑUW~9e"\C;q `X,1e< L X1Jc.1@&SY1Sc@VGaRc/| =*)>i`n53d2UE25|7d5FTf|xq<&NZ#S !f N|B>oY>7D8IWwϛ7oV}MlzW4{lzꫯƏh^,wq[tW*--MFVX[W\q5vX;}=zt*좋.R^^F &'Tnnƌxl#2I[-cC}"},<R ldu|~T9T6)uLIR2*NZ3ޙ2IQHR 'c_!KKA%dtc=X"5?,:ƚ%Sā}s-@ FIo%hTP( JJ2Hd%T( %SIv`|_{a` qnEd H<60dfgFht r)O3hk+|u㲴e*Ha6C[ƸY]$؏&WKAǰֲ}X3dRpߑķox6s6Y^ڙ@],/yêVׯf͚PR~T[[u7oV6mT[[ 5{lTSXXfedd|!wT=GzYlo x̓/l#fs*QΑ~@/de#?Sf< AAt}5PO¸TnlKjpP'UޕTm)}jwc,Wis_) H{W<%K:AAڹ@ @\VgkM#v "M2Eԣ2_AbNW}|51}gJTDM/S\\X,,De.~ub+(S3 L6W k+uļ1lkLmkkLY(+`r}<\Dd-)Y3C= O7[~5=L=  3j] rJc=, ̆3Ώ_U 7e>:ӛ7o|8}Ң-[Ӹq㶹oWssq=:'ۈZx[ 6ć~^yq=:[?bڼy{N [*͛7o<{y#Oa|zEkGe* HzdlcüyH%MVB?d ^A#ـT6x>@ S'KZD% wB\rQ)wIVՀ,Hp%,S4)'$PoՋJe"Ns1gv!P)ժNSs1lv,SM )^պ ?w$S0͑cr'SɄn; `kYB{.?i2'BNF2SBhÝX%S F~1߰2uY7ʩ?q/S-vҕ| .v `ZY1'{Y#^`,y|v~O௫W5;G$yêV/3gj̘1޽Fk.۫_~>}~󟷾FW\qz{G} ~{W=z_ t9r ~u]:s4x`ïRo޼y̓TZ/SB)S2- 6?)A\UȐXe^83dsl6郀Ȕ"^)`Sd/W %WA]z.+STe ,tZǡ6Nv')oQ?FL(\[De5\vo%Q"QJ&[YC 0K#F < )NT<ێxU`\Wmiǒ9U+Pi%@yU=TVt}30})s* i +μ-SVb%d*¶e/*5V%SV%rݟ)5㚹,r p-\wM|۱-S͛7oim۶C=M0A&LRduU IDAT{qqo۟ 8f̘mN;S>O{͛7o޼y۸kη( @P;Yz cg+Ŵ  P3׬LV((. ~ pRgfY͟tL );peʢ&Yz{PـN;PRER҂RQDj`Pv#zȖ'ʥbpL N n|{qKjC_u1ͦ}ϲꏭ:=B iL^6ώcם2eX=jO|/~wwd'Ƶo&\=e? ޼ykw7o޼y͛K`T@@ Lf~"<.SM25Lg۟xT?̋S= HѾCseRxum9W@=PAm"9GU)|uua|8k2sC%;W-* 2ɓAp 2 "fd(P=L #tIW$$-"L_2ǷL3ߩW{ Y~/Y*Y qb4Y`-OV ,}d/gBc&ʴ\˛7o<͛7o޼yjvMK]hOT s/w\IȔ<"SOLS,SC htd!S EeM Rc]O6mT2e'hoErf &SRIfF9){ Nv(oj&Nv:9zR|RP;*Mq]c_樈:qALƚt)~VK>s $@EKyx3qng}߮zp} ZVL|YVT=OV\| }`0/r݃ud?shmtmn u_Kl:3\Ƙغֱc Ա2,@\Rw֝vDoo Z!;`Nl_j  x*oh>Λ7o޼yCꋧ%v %e)y)Y tA#_'Ŀqlm)PDCL]3ұ^F"T?HIV?PR$K:ώR$^JqIȊY֖ 8]pm.=WT~}Se*;%.NҦ;mA6&VYIu m' \,] d uSPk62b}2\I{y\N߲µ̬W$ː)RT.T)Ku !SMWWؾu(8!_iĿ\޴ӿe{9sTlkenRV']ONk8.ii>ULwLQWUh*WL޼yʛ7o޼y͛Uʁg=iO6 -\7Sl+-e߃M}ٸ/Nd% ů aUSEM[NRLZ 0[V;kEA}))E$bN &mB~l C!'g{yMVӪHq+voLaFViobv"(GCp#ǼhouL.E%\zfJWTnd2/x14]ZRp*e=qcQ\ێbI D`yLvX4:&!K_,*|wWJ\-KǛ)SJE"y ڇP".{^l r$9GRx%k-W)>ݦ~ag^m7ݪ3wA͛7o< C]r!y*1kT(HuOejE jPm mҭ2AlGH!.xFT)W*t;ojf)vi?PR,.>TzlfK:XA@@|'!#`UzM>[jg{F1 >6EnL,B1l^@TFwއ@_w|t/5?)zjY?d|yWdо#u TzGsMZV)IYٴ3TyѲ:g楲^UE02x)fon-SkeSǥ?aU69WfPee*C^q' 2*udxnJRzx͛7o<2'RP%ū!V -c]AzTLѲ y7*jY]TuQ)8!I(dJ.HWL?!(- 3\W{eY߆vk~kJ1OZYn}F,H$Kq)q1mڷlhtdʔA^i tn^eeVt}UT=(!V{h"^OO p0JQĽȨKIYd[d5x\g/pg%upl½Biǭ=d$za=lj xv2cȘjiZgq|p)q90Eeu.gOR`hJV, p]m'ZYz|D@[Sٙ5W,V_͛UÛ7o޼yAm vieEK،O6PozZ}7zsO/O66CDej OndǸT|II\l>_(sUO|p,䞩\>-Iʩ)TP5Ob_j#28#,Z@̳\+mK]|;:"|E\D_ Pf3Qd<+2bzs#SA)2bbL<+?[,,zNE\C~Q"4O{â*ZY]ܚ:]'S!uṀg uZ?a B6[V%ʥ`(SXm Rt79E2eqd-WY~7oVL#͛7o޼jRh38r*Xސ$K6*eHx pil j:jJ;Aer׏o*C@S?2 j ֎ 6Ҁ?⚜RAt@`w7ѤPX{>Ȗ\SrQ{6+Pʁuoߖ(8հ@A`Edu:zԣܻ]~z7flc.*mC>VThyto1 Zj+K;#X&&W#5=C rCk%4YfTHĨ|,Q)S&S๚`yġ371v~)z0[~$U޼y`Oi޼y͛UaP5.~)(Sn?Ig6ʦ(H.?Cu j9 )WPDv2SBqM ӜծZeL1y?ɒU&w~N[RΕ&x{VpIs#l?dj-WX}֗S VRl)`<^|K'N\MewYQ&PBUR*7iQ(m$IV | S8hN<:dLԽKs%s*("q`ϗK%Lm$s]aY\TczmEU[Wi#P֥W|"K[w 4?7d~o[<7^L3Rܠ?*KE7[͛7v#Xuy;{광]UB+O>ʛ7o޼yd>KQ2Ѕ v1`(?u%ʆAtJ;: h\ KꤠxLiJB|V#XtjCdʟcvd[Um[çIM$@D Bg>RAAq(w>8kcV&+]^nRe.s\?O8cE\0s@̘L9,o`N_I>n9X1P[/dX1 F; vnU"?ktLaR|~km'S5][}hc^,2ܜ$Lc2%T,EIwN*!sPV){u[^VkYf/WWuʛ7v/X%I.wt# bc{H\y>ʛ7o޼yl Z`KǓlpg@9k] p4+l9 yRN`B h2' 4%*eڎL9X ,JWiip1YZj_ !^?&).7ETGbxLQmK?(~I?\_㝲tLm8_d@$yY7s 2\ʩΓ)jA1D{W`O-m)yL ;#_VD|Jt/YfڋÎ!w"sC&kv,=ź=(Hm2 2E\wж9h|?> 튲a𝼚jC8.-pO|_uN^͛UTXy2%7%4mFe|?g7o޼yA[x SJiI@, ;L(zޯaSUV`S0_`y!T++Pj~@哒Ih =x_{i2O9,4IH+J9C2mƖėtV~@6|ķA"ī.6+ǴILeĹf=lՇb;{rE{*+|IVu3m@-?&jQ/w Υ\f*8e|˚/q|b^{#Nj7٬l`qE?ѶBz~ya7vT`<:#=єwַәQݕk`o߷T<Vg{뇣{(;3S~D7hd*^un7o޼y[)2;~ٗkcy8?D3঱! hQ՝VW'd z6U7GA*^@}u% 0hsEWmA_ؼkݦ+o\e)P ɔI BO#K&ڍ!SaL fJ=|KejEey*AԤ2Q>cĽ)ⶒy.v2hoDܧ((M;[b/w55SUSq=DlPԫTN3+_G Pm}K5G^sUѬEu>6E/ZJ2I {uml̐vzUxp:eзp;'ꥹuԐv;ӯW,ј}W4@o޼ymUBj6[㪯@ lW湝LyNEkWVקeJUHMl]YzTOؓrj );Ƶ/O)`!qJ2Qq(f=:pB 1jQPH5o;eWS iH.6i=kS:+h'q}Dg-ҏ;F?9!Zs鏃R15R\˹Y&q- Yk5f(u!ljY o\K~AW5Qzêo}Z򆦸f.ب6YdW*RsKBi;k𳼬464+Jy﫪kR*R\?!m~ |Wz"2%ҥkF{Kz`ܩk:Y1|~pCˊ.1y& IDAT)PeabQ@ Bҁ!8ܴ)6RȯůN!H'!kf]YAܻk,\~&^wS ͛o^*fizk篨Ҡ%zګK[^Y"ҀnEZZGjϽJ뛳VVO]VSUg{En&Km 3ѯ^J;Oh4‚BWvUzz7o޼yP2{^u2=Jt$\Vx3lu & Uإhrۋ\Qdʕk lec^8g" jb*7\'*ƺ>泉@0gw-҆RMRc"%\%S80&Wxr/Hd)m;_qM7XiU`W,l4tւX2_!䧫U@}׍̗%]M\3G|`SFk1>Rp }r045&+nH;eR8e^K0z%Oz*s͛U@J_6*Hidž7kdJgejls.L  o. dũ(xMV|O`+l_Uҏ'Yݫxu 1Y {)K{rF8Vg^t*˗bVK=s|6Kz6jP^У~D%i)Y}ĩ7+T-/Su'v NUu&2\ :1 P|Chc=0K>:X$+:tLԋ1Vwdo'Bd|?\W$ޭNa@oڥyꂿOMu,j߲2I!jlq{Zy.E9o8r WMYêa:>f~6g[_Ock붧o}ƢMۿomOJﭨ}',H蝷ֈ[_J٫bt|eڶm\|o޼y-AΪVɶq#l/Fs(]^*JyL^ԇ 2RP))S@ 2u;ydCDAE)s7re'za})Qb &$>a] S5"Rz6}}".it,mTҭ mNIU}u2M((t[{JALpM-mO $mpd\9m #ә\sBu:hR5 FIIe'i!WߗY;qmw`Suhc=o "?;jDsSL(B8(b~3'wxeX$&%h*Fbl,XMNͨ^e޼yn]`}wx"QeuKcΪTKK7o޼؈Ԓ?`+z_#Bjz-hJJdUeb;c)6_Gf,+%sLEGT+]e5dcl32Dd׊ 6E6l@C)gЇ4N|k&N<{K0 SAG51YԞ!ԑG)QZSn)SXU|>%)P5з+lDAݧFj4Ku Zc{.5.ĪU S?T EO2(6p_ 7`]MI)PFa~)S e>\}wBeL54G]7SLnkm>r%>C{1jt.Uѝ9|Sʔ+P17J80o%X%dA@E#\ׅkdiF~ե!%~WDy , OOd2X,4%Iy TM;U۫\gUI֮r~W*L52U'S 0"IdcL KƺwN9AT˔&]<~|m$S""^(t=J)P'_m Kwˠl N%WpmL_ u'I _)YZ DiVM*UE5T\VHeJfŔRmfJqsrjyLyI3i /rDtf,i|;eTd,'7e56)ckYͧ ~ :ż5L|I)X;I.Ŵ,M4Oz˪E`s"y`'N U?L3 hP}1Y3$s?M4KJjZTVHjVFJㅛ5JJ+jS75*K2 2 n9~b@ɔJyA]'Oڵ 2V.H[%W>lc*r#QUqfݩ|QGܮ]O+4OU Wwri},+z^&1I5ʨPMhS\]&ECӽ\};ϝr7)ώ R_$쟱ť@QQº -t鎽)G|u|N_.Y-++G.ձ2{T`+"x$I٩ _3dVGNgD^_5.` mBA7# lyGW+yTTDP OQ;\HҚ5}G!o_GHL^H~/Sd]#pߋ S "/qJ+*!O? 6N~9 :YR꽒c(#uX2e)j"ե"c#;An osq|X*S gl+:Y\ eݒNiz6+!KPR7iV\qT-O*%Z*Vլb*W*;S1(+q*sMdzOo,k'PU2e3L&m:e^C=Ka5Tm%= 9`X"S=E?UM`ɬ׃2hꐵqHھe|z^F /}fWճ#`X,^n7 -X  ,m@VsOz{e*}h.]Wԙ.bglLq4q}]l}Nsל)Zե%#0)xq'׍4FTyځb~ȧJ4e*gNR2'mCMw;_Ky\'u2pe~-q'?r(H_a=/_Ov Z?H6\T:U4EڤbmUUBr i=PF%})&_0UquýO{1b%}fn/t= ('ET9\ZƵ&S㼕="lkֳ.n`\ Ka)Y+f"ץ:cqw+4pհX,Xh]z饒g`ۓ-zԜ:IZWJjVF2O m,i:L܉|+'M@슭;Td0'h&/XG&;yE Ej1JҷYUH㗲NVs1Xv /S;$߷ʟt>er;§9\-î)K;d#jD^;ԉ?&kZvSpXVLUڙjU\Cէ!hMiU$9\M/1F$-Tm~5V*>&S߉S=p*2O,gC{CՀtzZQ4F|\s~Nf/auDķ˔[.J7'r\3Xt2e] soggl6>(_?czUW]Q ,`v^|…) GD55u] f)K9{n(I3 exp;I2Y  -&N]#y}[0(H2sp}_'_h5}o"v`.w< JzsKzHz̸u-isVj4P{w43qU=,SM]8[-S4s]P+}L`ܴKE`e]^TĘ%)jJUY>U~U*+:k4j4mL_NVKOqxXX7LF$>—=v_)ü=9⾇eis؋n>n9Sܚ/7U%S'Se04")+!̚&u*{l!Ժٻ.mt{F?Y,}rx\*WBjW `U`{edᣯojU}_E l ڕ<7.iw-dvȧ5D`yދ˔;e N'oO\u|d7qd)pC#@-OCa΢|~*B1k$S2uR8.I%_A T,>܉tIzT^U: RdEVvS-IY<|Zz9Uɼ.!x@b1jV2)SYW\1*Q\/L9vآ@M..:m߮PS7Y2('SعTN=RƺN2 Z".E e. XX f_5R\]eE|Nb-ee 2]LYaϲb;0l5LzPSU˧=_ ,` fwܩErߝwީ U ǛKC@45,),i㑖VEqqtSNn[iI ;SN0 (tC %0B<}L>=Q*,Ǐe H0,E>Zdj$}FҧM#[ 2MoV,U=_&IM>#R9r,S9o%֏\ݬ+xo;sl[UhZVO)#S d%WƪCs\uthʕQ\iuQԨ*(jSN1%UUJJSSz^;RPXKS3cHqMy@jQY]'ESMI^1{pYjrB__djOό1V:Fg]0Eܗr$~/Z:<_{vBVG-ƺ159,T.Gu/ޔW: 4pӷ *X` S>_w^vV ,o D{c#=veJ SC >X2 Yc?˼p=,I&\;ͭJVC1ťUYJIS*SN +?Iyde/ß5wPͱhd ` ,οUU9뮻p V ,oW44.5lp0p^ yS uwd' |/_kʩmwJR O;^^=up6JT7J"QcԽM85HvD3i[\{C:rR.&b6:K𝫳0~m4Wx~W@b*/+6_N;XDhZ+V*GS6_J+IUV1mRrW $R:Rʵ@b`YBX28N`|? X.e]G%1r~ |nuEړ_dwCHd2` o7Jy t|~ެ?6Y+0cZ?'Ss$KL^q晫_5`u%5:X{Ӫ W~s9]~߾{,X`͕r5Nh*K[@ENБz;e*/ʟkqY^LGq{Arv^paPl,'Ks*"W| #%3]fUĵsR|쓤U1'Vpg |)F~¤KU8·̥V6= NqV-8@ mc #ڦbuT%Gjj4X_IIcԫJeծ SI QJ- U(ujU2vWD7_2e}/*hzݬgA!ᦰWRN/ 62>珛ؗ}J,)D1Ɲՠ6?`̇H}INVH?Mܟg/=%;= Y.KC|V9|?~U`V 6PY?PVIң<֖?eU`%U> `}Wp* si[ 48@ӴCdj-2P;&H_/tx2vSV!`A9H2WށS]jd%%SiBcu,?RhI' %mj}mv6>>ri1ىo_-C0 yE-ЪE>0|?[7XUZJ(vWy(RAբbJ(mO듥mc<"koe szP[Hw>\+suRY5ܟ<}Pq}|^a.Ͷ 'ߗxVHxͷ2゚GB` l *^uݩ,X`Y>}0,ce*gS޶sͧdJWpYZ odFI{s|Qa2Gokdx޳߮VS2eL=mNf t(0\ݜNzz1 Z-W\.d)ukۙc%կl.-e2UU%K 8R8? 0|dS?TV?l]`X3ejFU]*UV )NtԫS߸ c25X71@xdN ++Sc9Zž+eMOD I49Y#41/s@_v q9:6ȟx!Rp:׶>珌P+;/$RYv@ڱ2Unv%odWU7ׯ  `U`o&*HB  ,X=> J^2ŐKxwtm3 D97AtQْ0%T$_YuĔWJաTOjfAT5SJ5OiʴMQBeW$KիoC3kUZ1 j芉wȟ2~AKdK9]SPwU)@]Vm9k:eXӹ#0d-"{9i(}IOg=.b[edu܉TħGn ^̿%i,S,XU`U`{@>Pm|̿67թL \WZ;@R'.XeiNgI@jN-?7sOR=NV[ x0MZe2sӒLefYy-~+Ks$w2_ߍJrzyɽ"8Д4MZr4=a )޺PkgTFVͧ5k+^^{MVqI'L/jjSVNE x*zPhtu+EGAh⒆GTz+{nh<ɟ:;;_i~#*H ,eW{ p`u5ηfi%An;Aہ5e>-K1*5Y&ɫ\>@{*WTf:v/^V:r(pY8rleEce){c2,jiSd 4KVGU%` Ldo=2 [✁x:a`)|!Ko,y cv&+lUJUjY>+IyyTb*.&+ )ժW#9tNn\Xcܒt@'yn \ćEnU<O:*Y)F@c gRgr0us _;+Z*Ş'X^ըݥ^mvWsf,X{3-SuuvlozUUMMX,|  l2>m*:r}dm2U${ f ]/ ڻe*#]WsNq#A&,AFp'8* qV9_F pʣ2K2!pZͼ,jOLFB<6׏05:dIi7gG Qg.)uѻTڠԧ}ԧ?˔9 u->tpp<`[1Z"YR=eV)rUe[ɧu^f_hY )`97 ;}\tO#CqvGq}|ɝ踊cHL gE'I4|0}~ۋog컯իP]-M៯` lDƆrRry564'SN ,ekW!xfqJijyI{bb~(K\$!/_}&(&K;X0s~;mE+\Y$ |lZY*6(yy/^Ԫ&J#``YYlm)ž`O:|N^nRXAgiSk<8 ̀~zTR*bݯT&%ewc/&?QЁ[,V=Kʩ*ZԥysecWu᳌LYM$3 2݉1&Ku~q7yc. luuVrϑ|חh{;:%_&S |^V`ng,+_!K;`^2;`RH@k-7~T-sx4H#o9veg,X},)Ni񪯯W6}C c1%Si ,ksA'sx~ǬWĭ)YXi&?B8HRTe #@LҏťE)*?C~Ld|[dJ#7?\*h4E@y1e*b@DJxm/)k~GB\ x=!S"M`d,p㬖f?ՌL|Y2qm"IMMեFeY+5RTMR/,dj}߭)_+[WFV;*+#`,2fr5/ۯ2Q,^ں^#p2X_0\&W:T^Uxg,sdn>;M]zA)ؚh2E@m|>oeZ ,6/x|Xi7ýUOI%Ƃ{- *n0D%%T颴bP1X`\{yq{<+!\m<0hL q" @[*S;O_$,S|RDUAry Ʊqf'hJ.)[ =ܳ(PLRTxeU vLf2Vʩ9V$2Fi(l^(ە#seI` x=4H*RjXb-8EW=`+<0&#V2; ѝ6j8D#p轀j.\y>Yr53@,%u L9ձTP&^%i ~U1i;'K]}w;{j(9,/j>|am̡?p¯r7e[鯻EU}o oMlϰ e߯͛6ijiy2㪪)S4zXR`cfyōs ,H,mF}Bjee @L@z1Nu9S}\JG2zY,+CɔN#Sl(םe E#}T/@ nbҔT1р~@ԯ#TؙX<.cm"FYSe2K_p:~ar8ؕGꥭ"l@iig?1ִuj`b-}eʹgo'#H:u [%N9Ϙ'w7el|&JV>'~%SY `U`os9m߶M?3gj̸ J$; [vya% =F׹` C\@ eITѠ@d@Q2Ч 13 tT`P|GܿDOװO-GR7}wAR2u$C{Fއ#cC hP8NFC$}Y効n$d.l->uix.S :^?U*RgL*/XmjIjTLQke׍).premؙ̻WC?>%Sҕ˧Bw\Mכ񓫅6uh`]\ ,H<=2 *)*_vM-9Z,S:ɫdDƝeLC`>'MeR$[ ZIem2;y'|]Jeu֊K:"p-_t~d~XeIvƂ{, l..ԬhI;T*&kcl ,XL4k\Y-W+Y;!n<S2]K-0*&.!w% +(2rdQ/R]Nk9Џ@ āj`iA50ljh$2EÁR='ʫν/=z+0,kTX5E۹n>ĥ9:WH<:uHFvܩwO@&p#{'ڌ,69&9_ݑ/#K1=~B;X^[M>#=',XUV(Ynj}û9zZZ,X`{͓ryU{5]^x/YH>A9Ex诓o|q|_!KD qv'Xyg}^os)b{v# ;IimR"rS%f IDAT}W-Kz-u=5|6F~+Kf3H˟x@ ^ 59@zZ2I? hξe+X`V &Z>W"PPxCdR\ 9m0X`vLg1n+ jN8PW 9 ۝:VN0BWp?K *Io'Uf/a)|jY=V;8niM$24g Mh2sN>ͭG ]ɀ_h':߾(kkL11d"cꑩ0+Ky^q0 VyV#}H0 ҃|f5eGY xc?_>p˘F`_̣\ -pry[-uL5-v EkUX,X` GګKoJJ<A ~ hcOk)4?50uqY$P4J\}$8Tˊ }>6i{{8`\ I8< @$ M/cP"S/=+9O,ii0#jbԯQ\*HʨARsA*Iq#򪢄|wb9Pz1a ^^$>=W 'd9L)>¾N`~%EfN^E ()&%}Ev4YZk)Z}*l[&NQwɀi??O% s$]+KYϕ/ٌN?I .qY/ 7)ԯ ,`4{UG`{?NXX+SW'#Sڸ zH?&}@I?|8R .v#@ y^ґ@_+SH8"+E\1VṚKVpՠJz@l)@p|6to=,vzZ1%Tu *(Խ Ԫ|]Օa6ShId98[A+w8Ht_YS3 s=Kn(_NØǀ8SWζ0rY:<"I3kY7"W\ sqZ: `$qINa ['0)jf0d G>{𔕥4?W^&W 8w`X,X` ZQXI"3k侃O+p$diZt^hz,q)c7˧ "p>EVh}pr)IIy~"? }q $`d23.bCW׀9r)j&2>Y\Ob5KZaZsJ=zDiVn-Izi@ْn: S13.g8USGU !Ks~/2ϐL&S>8}0~]PȟLX;U/^+jOm h~L^)WrJu;?3v}q6o܁y;1q}}970߰?>h>o*Wty8  `U` vi>}}wyQ S?y5eMe2uD;n%^%i|K#iT!u+@eg 즸G{k*#Z^w`8d~3gh7/SU4uv,-rK,4ȝw%#SZ-ޘ)tNuԵS; Ih 6AҸ7. K[9`JBvcL 9:dJV/7^3++}?~@:4)._wO{e*.Z&Ka}}p\&IIoe:zS]hT|7K!F:EͪP_"Y*w^;^$߸E*ImŻvfߗ)iw1N,׻Y6{>#Մ_Od~E@*N]4D^ 8|V^}5Q7&)¦jY!0V2R }5@V¯]̣e)"I#Z{yvdBr21UҲi~֘3 WȽD| -w};c>殰?^+W\-1WG򩪖%cSdi5@+O܉@7C+!Sxղy^c;ۭ _,4ۂd#enY+Ǹ v'>cwKLk1/˔6>C/)1m|~ޖ={իiʮ?\X`V X:E]]|A 5XTUܤz/Ȋrϒ)T~&jjX%X̪潙 gȔ.NZ@gF{]ډN@p LҲ>N@_\>O;@<@+Z@6@)r)B;4[#Rv]ewg{=)x`|P a[Yĥ\J>ѩ7X:w78F og WjJE =/]`=݌8Na̡ۘvG0YNX_?9kR@e&dOvF 6؞f.Gi —wR*f>d2/ZX\ j%K1'/h eijOJ\>oʫI ,`C+s9[#G徃>X3gOu` Oxp-WYT-2u152ŎCTˁW^9U+\.Y*A%M#pwfL r Pv+cf>6לrE/@dݓ@ BW)Ki(bl`ZjlRii7~hɲ\A{;%%SM؞c* dѩI]`X,liT* .8jUU oH 4kp5h!Od̤e 1"cxN|'zP'0 `mUBR5EZ##o)w\Q$yp1@;pTs%%{)S%Ǹ6$E *DC#*i p.R!+m=)m⛌xtjJuCs8T&K#Kއd7˫6T:ɫze{1J Wk?61pshğDY-3d*9Y_zTf; p,)ws|g|p (Q.wRd>ǾOWUo'_d~5-ΘU 2FݲGGGW+v`V 6PpիMU__/I1c= ,ؿh "@N4fիK{+.K W'yH^ pWd;P#S#K#_Ͻ3F&g[Y2PZqy>6*Fs$^PY zYk} ԛr@22&JOt%nL4&#uIGgO_(:SsF96v<|8;xg]|`:xs \v3_(*\]"S8rLi=^c_"`Stu>x=#o#~i)Ьf]n9n $'R]5p kpǀvލ6y.q6WJ|Zo֮VKqG` *UN]uz ,+B=Uo`ZGT-:~#rLTYFd~D^`"kEoc ˒FPN['%Zdi|CSȧz%-f0 %>9*@#*#_p&Ilm֎n?2USm1"dA6@Ae}~8|Zgs_I1"cxK/wÏ3f#k*q'e'Fiךa^ee &&~9BGG Gsqu*#@Н9~v~Ęʟ9G`WLE'|ϞEoVjk_iW}o_/ *X{*B=>SO1g{#X`[suQTjz$m>JҠR8O@E?[.SSUʧXO d2%ɩ@2rmt' |W Mh3OrS{ 0zXNsƘ4Us(iIUHut´2j|[,Mo4*8b,K;$u䤣~%5dj*kc%KZ[ tZ0Iǒ@>vS >ިM6ex)NW_ x̲N7dZTn] ȧUw̥9 _yv%/ɔdܛ¿MF|v벴ѕo4s,0Y NLY(K\{jq\~ok_Ux ,XU:^ʩ/_*( ,+[T5d)zPtLH6Yn)76 wr5uʱ:Jͩ OFcCe*$(_jc_hYVNX!-%wBұ XkW=ǺWR&/V){Zgk!v*)I?ˠo|=<8?† p,m]0eu̱.X mz&ZF4 *XV|? ,XosJl4AթZTJ YwHEO u@Zڸ0Mڛ?f3) "piL51Cw(Ȕ@iwзS xh$/{ m7x0qy{.zPR="_4A2M%"W%du*dj4ϗr_~7뗥ɟx犭4iURiQBy{&h*ft[ 68ZXXYмEVD@+/'Q.&^ ɰOzoskdq2 _/t@.I.ZXCYcY r N~Ǎ?6&S]}m˧)̆܉[L<(SF)={kߒq+WF@gAI,XU_RJeU`{Uf2 5PJYMUBuKb IDATerYZFv''ҿ"ږ<pqS5$pueZWROxvUDFU馝J:\s4T˒ȾnV |x~!U⍠<}>ReʔOWYi{SK1Ӊ/kYcJ``\' {ܺL4\1chsL1 Zҏga}suQe 61ϭj/a,Wv $|| dFSŞ]Vk%cxDVy0+d^b>ݠe6^쐩).5AI:CynHQzKs0Wf" *X U ,X`,fr ɑ:6 <o$鲓>!+H_Ȕʔ)qى~eGyB)'@;xxC;e._d;@퀚hk##\jA*h=V J|)CC/@?%;.KeM5)VqP8 ,HIxty+W?m$LNeYRs'ٵߓ/p[y,M1VJ7'/IkzKI[~ `jume,}iR)> A6yì(үDz!P"v[ٺ_q6kg<൥m7>.K^+_pO 2 *XC5ZlVD"87"p nyUywd&dO¾H@@v..u նX+TU[wnH%.(*BPPA}L&}y<@UI~>}o\!B^p ʬ/ewtXUT+Vclٴںy3S۰VKxj}OVhK&OB[6rBoܔsgϬNAAC!r{ 7ao޻Ѳsv.)L w/"ŧB'q:H5ʑ&ad>H8c'0ӈ0m}a͠ojYwjnZ$T~] R\hXՈpD>=l)0a{ MFmaDyeſA!,\3{ڎ=]T`~Cɧ6u4x_/i%ZB8:SgzP] "L9&ڧ;d&aⵎѾ;^Mw^+qLXo[ wp1Giߟ}p܌sj=M0w`Vi˰nܛ|rvIxn6pߌYߒþ /tc }BoF-/ N clY=^;k):"I DcϵuQ2r9k̳|= Xs,vș|R^4mvK/fG ^ 4d|nLvhu0;78/)7׃=G>c5ι~MzI;~d)dW,,y~hۛ;ׇ7'.fP4ZPw1r[*w;ƿ뻄pc)"Z LZgDrˈבXUT[V̂ c=$Bohjnmܸ2EEEEEάlz.'JI̟!hL׳? gA݂ir`gOs^64s_]I2L |­焻d_ D.5Bmۃ>;A,a%f3u64 ڜ݅Dޡ# 3UJ"N!b6X}1h0 @\h}/Xf^-^i5öeȳ4lN#kuʀKRV~P3k)19ԉ3BN?zc߯2FpF0%gZ555Xs!|Oᤚd}};ŵPM&'vauNZ{o&N |j9%Mx\ SE'afyO&5 XwJi킈߲f ۽@hpw|C&a"IF"\r?&U t./zeE] ^ >mW6nqr=[5fI9:qz3) N[)Lfm1hǑs\MullV9]DHVT1,B?`׈f_rFi5!nrG\ ?&[GO[㻁Rҫ}v<߿!ǵs}M"= Fd UQc********ڭtNvpq e%m'3蠕 ;O:fuc?\ٌ'bĽyS.!7 Ĥ8%(g)A;nj~˜aᄓiF~O WHV#a mRZވ h<9=4-9H6pGmy}|%ɓi;vuo$Rkk 2k>ۆfi~]_}-{ы0P?Ψ[ *********mUӆgԗCB{!43Ȼ0y)/%ߋIf±{ 7s s7ٖa7 Dꂄb,tΑb y{2) iַp=ϭ>Li"[[ob= V*pji 6=}]E) Y0ٖvz  &8O@ @YG^۴os9^>q<_v^bY M!_)GÎwLfZ' G_3ZL TƢW[W1ϲ)zK'M6mv NLsIw3 q "8Bt@Non-p>|?:] WߩGW`XUTTTTTTTTkEX](uIK:c B'hb<€KÕ?Z[ Q9O`$7k5{x zdIUT=,.$5&"Ѐ ,%09GJ|29dmT p^Mu~"9&)9VٟF odWb#iv!fl0o+c2ǡ1d`d?mݰp=svK}'g}'zN **hwE?&/ӈH L3[ٛHFNZeN81"y]sD2 u"+xdnY޹,fo էs$,rHUp9 k!LOeYL6itZD!e^$\Md%$2kO&wN%;ʱz?CM$縚@N@ 8d: x?*irbS W$Xs mĺ@e_1;pxZx "x;=2D[DHv!K$Oᄿ罉]J7_X$)pOgۯ ܐ_Ymjd3êűey*t!ٕg*5~]SGT2EV.:]_ |+J!1lfob_g!&pt Nm%'! 8G0INvB8Y&ً)H67.}'MJ2>Pfۅm5DQ7wN˕i7 WűU{Ce[~ic^e9+Gh{RH4F[p[]QS @$9r9GVn"wW-'jB;?W> p7)vlct{ۧ[s<{r]InJmr,^%~k׃,aMDhY«o;Fuf|0w`l!rBڙtF""/2)5WUckZQQUEEEEEEEEEa5u'R!DrM'u`Qa>+c9c b؟|Ÿf7Ȫp npXLsRYKf ?RX?i~Tn:p, B (L`0B8xFLmBq3j@a?w 16x[ۄ)} ~D{^\͵ͽIb5Wr:d5;/&h-\_'N,;QIv8^ozkbm.X6 #'bLsq9O>VAɳL#d7!.pI5)|aYqHj yU-ՕmXusj4O^r`]FN_3t^3_'d殂GwTUQUEEEEEEEEE~ &UNf<9jjla¥nW*榺{"& }rHm"Ӹ3!Rr@8aQe'vS:/Bp0a' mKX|߻f__H8̎q<%\F]#B+%)yzydwTX+&zOY R&^[`IwPqޞG{JIwoVaRr|\ANZk+gDzY3Y03ѵum9H^>yi?9Ykϛmaa69N/9ԾC#\Ro'͛7y^mnbj`cK:_k?H ^t2Ր<)ydENGyjEEV:br.ʏU[w`c404FqR][5k$'>'>n!k݀7@3Y­Dɉn4OuNmz{P&|I0UA@gɡ)R]8268,,-U?ƕe]B>y8J'W@Kr3&^}dwAIX[3ע /Qܮ''j .@"6Lk`PnO"\]A8!;27;VnD8ޓMH]= V zmDZo&Qcsg' 7?Қ wv+qoS-:εiW ^{9{9ͮ#e J!: KM!x.n -UVEV6J!&gC.asݜwΕ+ip"I@?HV H9T(dOy'ioe1*ylbX7=&r~ %qdx!zI "LHJIG*hra|zp 9^uIui8}_s5sj_;`Y LY1뷬:X0v AdA3l[~m8kX}aۅLDÝo0n£%BpXOՄCh']XK!-h/W+xo%DcscMwpk}6}H G G^ SNAWBKxsh!Nmue," ~8r_R=ZrR`QUEEEEEEEEEO5Snn:±\O#cPcp!N~g6 j~W$(*PʫLFA┾YX'vmy7nS\C3hTz빙ȭ@V}'9Q|J=d;W`š1FEe 5u J?p_H8pu.!B1r]" -n<9aێ& f&%r.8^ω[e_ Y8{O+\UE^ZZ|C8.v<|2 :h}s.tKw"+];u-'I`[ι/p:u琿Y)Lߑ";BOSMeTt>X(s.[OxD qf2Xa}) h#(ZX,Rm\7Ɂᚹp ip•t(r);iߗ I>=o;Ժǡkɶo"T!vn\%8Z8P IDATM L!D:vw[tb_{_8 3~_MqYCn` aV#̨CXc+p5­OKN L[g>mBN\r,wO},98_3[ej^o&cq+L!JwSNl ڃD[z!B}.tڱm?wu?9 .w=\K8q^M0R?/M.$ZF`ó`ʝUO8TwꤜLnZ"oIg242JSƤ#8I/ h&UTd &BӚ #nye (&d)tj^+l}]{'mI8`Xdrrm4`<˾0xmĺA~Z26 C8ӔpеQhY_' ?@_i>63/'"y^Eq]^#(:)?Ya'/:+`m_X7agw^TT`UQQQQQQQQn<ĩɻT_!)57'LJSgك,sN &Z)k >0E)"@'AO%pFM^O!\)C]`2P#DnjZ`->1J ٿ,J ʥ‘ D6Nh/\h;ӄ7Mr9f;w`M"\U#E߿x[$})M3;gmǷ7=~͟$`"Ptn_8I$aj"Z~+|…w[_d79"Ug-Rߒ?@])|?kcUUUQUEEEEEEEEE.r<NWTBPX[8 pl#Lw 'Ki|w>lfi^O`N\$B)…='&0FµVawU zlr.C> DwMgLNL"ۜidWlmM8znwE5DNF۠~xPqݎ{ېuNu_J _g[SH^Jve[Q&r.Dlm EGOVOkuJ0t2GK|WX_pT'B/$rBu.dê6%B혭-Nfێv&o5dи/[A@{ 9u;~n.v%|9z_ӭCx?J_QUEEEEEEEEE:<'^? B>/ Bzsj!X# ՞;$q¬f/ dGz*=I}o)/f֨c0*:(ZJ~{F0_{d=㮡ίm Ne'#r}}=sUS+=R}a(/r*`QUEEEEEEEEEyd8]e+\SvkǯnRBQek "  ^H4ƿ{pv{hmM#_Хj&\ E8b_n'C~@·5((\H$ruv * Li$8H5rN,*a!b끿  ߐ4@!NM]usxk$nX#پ;! Ä=X7~R\>1/pVKaڥZ="tF)U,`mdAZ6L2BJ`C8|^/JNdM49R_nݏp:= ~IsS[>y~ae-p9Ҁ^I8lLDr{mBk@3*PJSh[:anuUTV—lL 'ore7s/Ӛ⵩PǺd8%f2<}U5ُfYjݣi* h l2גC>͎~~N<0҉Fk3ڽz'pw9{ FȐ1ug2~5 k֟y-BΫ|V.x:ONr.?j{YEV:ӭ܄v=ztP{$9AVp<3h7U6Hh$D{yDXµ(<ƒr,M\NsRг1™32g ]ID ˾L vJnlv3CC 1Men%NVOxO^=))͂ `=Qכ*m&S#6ZG7úic26'\F6$ɝE}59/96= /٦7=T¡ugFCN?f;odj qJ_?4 +2nV/i6v|:σ-svxL"$7_b~b}}, *********ڭbŻL&w|-l"af(c0zpF9ObjTvv7cDQE(šNAC7C&J. )VNk /֗rG۾j!]oY!4mql ?ɰػN$^fm8eGD^\`I)Do?=wIISRxw+tⴺW؆6v"%AݜQom\G!cKlx%U'þDE.X# H'>ձi]Q"dp3Xz8I(6 $WC {N$Ne ~h_:H P* xϺ/&"WaDyA-|l#f}bc:GO#rhm@ lZ/:kDҞk0ih1hCRn= VN8u#B5oٖ>&Tb8_#{p={Me?PB5sre_¨96:m0.GxxXkDۖyR>p^] nX!ŸT>=SVT`UQQQQQQQQџemnws<rpNNFi0k4× %,J`b'o}Z*i5qb_ dW9QQrΪY<:C0e4 /$عv[,wPe gs<7"Ч,99'z ZBcA^TDj$AM,"/ Zyn=9pLi!|LӜD#U@z>krM"eD)|cMЎpRXV^$Ix"qJc9:?>O@Fk+&y\GY~"QD+ߠOnx.ͱ{i>P!='ڇcXUTTTTTTTT*AīMAGP`*B#rR黩Sg-MHO@ C&'59Oy+h27}d,S-M/Z.NdWk30 + I gYgJj:ҩ…f__B8ε|'&pY~D8ބ(%$>x.|vpK!Gjf ܿ|wZ$d߶;Jcwh4ؿa±`}ž [l|ZSɧ;>2kyda\(0yVy78o?m׷St78[ޝ?/p,ǜo v/M9B&?5g 1/ ֋ *********mGL~[tPYAD?WH8ϰH;hg5ꌧ_Fvmv#1is'Pj O) t!B -lq* YR2&ֿ6 n;[GM:eOۚ@F",Ar^.YqzM5"/%(O)lRIÂfƿK?{| 5F`e_ {W DX1?}pmtp=G&Bs|;g\}귞1"Trr[mlL~~eH{] yJ~gݯ"'fO9&9G9SZc#d;ȟu{Oǜ6[vϸ}.!; v+!Nv?[QrVXUTTTTTTTT|-:8 q:plt+0n`;'sjL¥*bnqdP1H!s[UJI l"d5o%ͶEmLl54Gȧ4.nGGZ ??H[f&[D8'Hi&E!d|S wfx}qc;:#DxjZ& Uo׀Yh|㲄I][|KyOS "ca>c p/?aEV*N>Jy~avp(YH?;ciY;$j)<$A8lZ~P& Vky+ƀ}{um— *ONu UJ)zInm' 7E =`lJ(*TI!3ͽn"i<9mowfO'\$@8 a4uOdϵ=)n5\&{['F> 7aӽkS(β.F'Srx(&v87,ZOs-

`1/[ _I8r<;w$OΧu%T^TT`UQQQQQQQQџVTՅnX]7DT  L 8k9_;=MAA&07U Dd'Ґ"%a9 BzY/lCsΚ*It!# #5@"AJ*SMp~#MŎu 1IJ6M" ܰ.[_e{8cDӝ;I[q;PNnh!NKE䜺EݻCȃucw;zI9nܞM)9C}jΨ8#Õ}" nM?$fa}|ug{&]Gf&cGf{}.|R~+rw {sXUTTTTTTTT{Enzbu iqnN FC~}O3g5~Cq8p1O?|_Je>IrxWr[Ucv(l_tY/}0j"*Է„,Ch\B[jrba!$_|:`+ّro 9~a[XV#Y@^ms|''?X$ahC0!JyI4FFŮ1)Xu)W3m}2x[\Bq.=-5S]'x)ՀxrR8⧉UwC~©u F-5 u!,R]#N |G\]`٣[+H.X!g&jw Y,**3D 'N5{`" >.TQr\V8M~)z%C0yƄ 34B zmi$;i}mD p>&,3A}cLT]\t|)j{Oa nONUk>{0Pֿv#M4f-:4˨mH^l}}6vxWoԱHv6:p#c3lo5,ZYm~mvކ 'ީSpί `ulX6YDx_+q` B%Glk7zOuplC';hyvXUTTTTTTTTGQ79<8p\-DZ.( Iy9:7qo:dc F&sBi&V`dG՘ТpTֽ͍0U3?uS ) V@`o}}xW wLvGv3DZV}@A*bN@&[j$'?1j_) @gmHs!ǠR2’ '5Vv-j7jvÆ)ppm-˜QrR~.aDAaVaM S%BH{s L&rMXA@s oNv̱m DͮK ܡ²4ƃgSB!8rux\F8vϪ h7}TSvXUTTTTTTTTGՒʆj4nS[ ]`lfWp g! l"';o gC>E 7n!"d7)vrs*A{mTH/#sil")y B:x-<aV(="$aaVǨ~MI8w<-wTQ\m" V"Bo'i p+/l}oNq}$P7b_599A0WP' 6y!R;Jt:_M@ قmՄcmkMsm}]fzι'([m[4"7572$xr|\S140U Q& 2ƹmLE9sp$#æMpc IDAT6ֽN_+J'ʶll4T`IDxߕdm3ɡ8䀣iӉWDR^rxD/I)gUf=^9cg:S`r[{"Ws|m} "ӭF*z~p4s%w8Zx[lt?;$RmpKpq4Z }}Äku|p1O;mkmsnF "iB6XޟNZ{t)Kh>!!swԒ߃^>qOT[Oo)CjVu!ZqX0͌K$N'`RӅ-B>  WL†F p&4B5gkB#M CRr>}>k/'\E 32WXqP*ɲZr\3fj=$%By$P˔Sh2mrK”YBa\?N$F"}k;6 wp&_%4kp6PZB}|B!V#@j"wB~|5s=bն'=lkdJ|{*pU>Wo}x"}K)H򷻄̕TEE/5!(******** pfB8nOݠ'$7ԭ 6+sG{y2&y"Cx2*I!%\*Ok?Ho w JMm”q&噚c/!@Zm x;-uUNYqbh^yomcY5u!6~P>Töw hڎi?_M35k),XﻍH48l h ΰW NqNFlt,"ͩ x/q "K?As|>F8y )^˲NrWΨguL{i]uAR#wkp5}uWu@"fՏ^r?'~nz6tO +**3O$(6WPr'\WcMǹ&!,7DVBa r™YFJ: 7>Ѳ&M¥C0Y8p<~vۗzeFDiȠ“m&XOr;^e)mϫp Avn!l$4؎`is= a0u,A'̱Vm`r> K@- % '"^TmH9˛,vYw2wA}H@ėn;c<$|?O;Br.m.OR%BWTT`UQQQQQQQQIgK܍_>D8o. ݴ#Ra`:wiLge{j-Dh*,"'v?Z‘2X/˄'`mDY@emOpg6WO(md#IyƼ!sj.kys2h#Frn#T0Y;z\Lsyf~o,D)QO0Oz;'=pK.[ ϸo/Uc1;ؾ"ٟzslK[P=mkfr-l5 ~D$eD8]ӟw|}{cB킪mM3liNn`V~*9*ZAvT]V epۆX|ΘYt1f:5s x!F'9-#;noz8Kfye+4AҨ@p~ԭp$ҏȇs_)^_{Lmzϙ>&jk!ul`g/1t3Ts8Dޒ&o&Z}P"DZ{p-1,fAΛJFahy4ڧ/.o$'xmK:p}6&G >DN@Hy$ax=K")uDH\ ~.;W9L /U;'@NP=l\Dۄ)qz[ e3A`\Mv2!- y_@2ICXT ԰m(LM[k5Km\Ha#0{&584Vu4k>N\ /I~KCj.Ւ2 UD8>;ԣ8wwMumN!$/**hnNlp|HMF!@i%;tA 4&!&<$aICmnIdNնiX&A3$G3B8-aM[yž-dw*+,k@L#;:|kDyscARݛz}k),k /7}p%xw1|Rݨ?Wt갹] mosάJ;6Yfyn (q=Lł!꽃po%`^㺽8)݄+*.t V"Ve`ywoaO A{ ?S|гd7<<ݶK@?yd8'%7 p|G.3p֓RF@"}!X$0'pt,]WO:ڟ[o >*$r$B,@3Mp6v<]`#>kM^ĩ{ݎF℺~r.˜A$蹝P=cDh[#h-zu7m"'El>L8'3`Ôxff=!V3/5 Ӱ;@\M]ɰFNx~ YJ@Ok:)$|L rk,"g]G{Gh]Dr Y-&aUCvГ'2bJ-!|w~:1߱;[enL-x!h+}F1v }T n?k‘ۉ|} CfPD2t P3 x:w8@v]%#(k9s[X2E36Jl̴O7A!@amv-rF=kL[㸃V"]0!w#p_Mdw\~v<%MmO] ^CšZ8vW0I@>5T+`b 8"8T7"gLD>a!MHAgM }3bgM+MBm#\a&Ejf2m',rF!%ok_D icmX'ێ7*7mF8Ȇ}6pckiuN$#Nl:؞ƈHdV4ٺN'^+9ǬzS_O\O@&Ow.(]rT=&Z&jl%¦Yd7 rmm%Wl1ݯG#<=\DjBQQUEEEEEEEEEJſ5$XUWTy<-v㾂8=n' F!q=BYDY`hN3]e'3!w>>uJ{mYjsJr᠐e9$PKWvwگArnUulgEWrg)s*DNõkFmbl!R/kvmuv-5!\e&B8KNVٵzЈkttZt"0 +nS s;Lm_qPTT`UQQQQQQQQ"45=킅mdwUN_;p:~>{lAJ>\6&t3#Dx"MTj}]^ALMrvOf{pmK1,ǰShd":r2 nCeZȮN'ԙF>o"B w\%~?qU''{shY ?Ф f_|D0m%'Wڞ@(8_g vN ı~BDvxNwmnۿ# k hwwW' ٮFwoIIr܎pܮ&\m[lXv~ X&q琿!9//Uj*CPTTTTTTTTӋԝw tp'%{NFܴWʹ=[P2F`5Zq3p,&GlbhJR XG 0V ׎"z7VF$vlfg^ yȝ7 "GT@,$8H12`=L}Ya٠Po&q|u~!Ye{U+ 7ڇTGڇ7Iu!9it%Pk V"p-ۗe-{^00p?jwnv&Tʝ qXvDNS[Dba68ݾfzI xX!Nʝ<^!cQMpu6 > weͷݧ{#solPTT`UQQQQQQQQѮ3EBg3i<JS&7XS oq;|!DK(:d==,>ychT"p&ƗraV !J_>UPvxKmO$>Aux2'H#OԜ;ɹl^;>pL E—˟}ߋ]wY[\;-'.qvwS#AsG|Q.XTTTTTTTT[jyeCw! SnA6ZFy,J]K)n&UO:t7'0'Eb 9,z`V{ Mj(Avw!`c6"@k`W$"AzgNNN8sL7{>|[G:G2Y3ܭb%6t;>KW!]a6KUTTT`UQQQQQQQQnVw2cWUVUzdhx ,L#=c?vNS\?=G S]вGX_$ iN#w lo ] 9 +㉎mDVHᙎsrmM4!c5ǭ:}m`,wX'gct7qm/ YsxG:-pbrng h6+Ơs_%VֵB\ԝ^x{pe. |8ޙk;DIu8yz);sM#r3 rB>C)tc>#R,"oHD 7 3ΎCPj5v1ɱi '8rHvmh&vCB#Ob%Vܔ .CxlRok DxႨDe<4?tVeNvTUX5iA+*&6MYMAB+ [ M}#EK7"LoA󎯺<BV2-ukVMD:jQWնVVܨ D }BI8'Ws>ys@YgmiO7aq>NoUt+(ˤƬm&/Am>{q6%&6nR@%&V$ ;6 $f:(5Wk2IwTPN@ =[ӹ6 LDZlS>%BFJ$ԇ^J)혞Hxk5؞{f#_,ڞ1Nvv*[ l\콐d`ip -> l^} VЯWQzho~j~£5ēJ$׿Pk{%]L@@wlL6λQQ[I؄J 7@=:\c L &@d2/+QŨM^=PbUzJ,J+=6&~4)2̮Sd^6} (-4gvJ$WPi WprxtDYE(73ZW@`]lz!1YnI6Pdvcbq|.{>Ƹ޷H-q,%:$ع?B;Vd6udD"~_L 8.qqPe[F}J &'r!a<¾j1EqyO(e|4RT5߾kGM\ЋLRƜb4yƮ{IRj ~-vP>qA3llQBM\u{2P`"ɹ HK"#un9&l\29旁]Wmm9Ns;Iw%Kly+ IDATSQع娬FڈVTҀ#CtנZ)pnub 2uH1V#9?*L)69t! LCm$C&= _XǺ{bW Ш?A_K˞TQ %R`qiB} qq>N@))LnCB +صnIUw|5W|%Jtuv LH\baIRjyXCHbԘ dC&3XjM~8)GG/X:D6;>1=l>&,6&ǡ&#Wec4сɤL`b%H%bHukݏR?L] 5&A ".ymlHUS4u tS& 62(auQpRm"Ta'˾L@@zd&7Qep!J=zm`cmH|/'ut2 bkBT4ٮcWϝM(do4(J-J}eD JVD9rJA"*Q&qEr zmV56 Z!$n0yԁs^$^~1AI*LG}$ӑ6X[S(vIoLMemS :U?CIMHpۜRr*F_ԃl$jt qtfPZ^~:GrEރSh|ԕ![aB^)H>.^Q ;%ޗq\V988N䛺& "%U OSɄL>I 4WPiX;$oXQ/GMAJAJt'dBDW-*a2K  E(TEK[3PZ2o!)E-paϧ{.Ѿՙzdk^aqB.2ْ偁$GIl9\cbAkM6uP?0n(G*cm-Wmׯk$9&Avw{o]s$mm[;MXc& 9Sn}PZiRTh$tz=v8pٙJܫ0yUiގIDJW70ԋP@G+/8.qqb} &0UA(2 SUY&q W2v;բI&F6 dzRA)TH6#%P2뉪vlʲǃ@^DPݟLTXccy>W8yf0Z( ҃Z0JE <x%Ю24;&( M+^@='*614*k9J}U=I'T2#ɖAq14Gzm"˕b~[e,6W*H }1PpiZ$KvBfϥ I=m~e6iG鄷Q{(]o?%V}6 QȱJS7{kh )vl;fY6e֣Fdk,uT3=cJO{͌_rX{TC|܎(`qqi"ƢqM>940Rk%E@ZۇgY#_ LԢ{ jʝ1djXN6{:9J&:&"CP:=IQ&ML"e<фə }GّM}֛(@+E/:WoF \8A^ZF1О-ܬe{0$:ٹm}GmL(U:&^k,FW5%/A"piaP v}JE>YӁ5ɼζf!IZ}1ϠS&`A`' md&%JF?BSTZjsKq-@iww_y=Jc1D6*M:Vb0WqU88NGRA*tUP)ع /1ɐRڤ!vRO"nmXE5T (3 (U5%_11sI5v~OP{;/$sg6r&f4q@W^KNI~vϫPʪ^ D /]L!LmnPJ];Iv "lH_"Yudi眎LgfG>C͏Dp{Hƭ/"Hױ ǿv9\lkjBoH#,K瞲{tsAB1hl÷6rJeHZ|5ޞJPztAΛOAPP\4}}NwQ8OV988MH}=>ɪJ_KVMC$1(}24DDjmĩh2A[$W}'LgTɘ9}SI #*jh)W_r^v&*{ؼ^CIZ[(EюOB:(}P6&ɰ&]N2UP%+ɾt] /F {sa)%@y&_jPV*Ggdb@F9v\^c;)}<>N <گF"m0O)f6^J_x5}tY{N?wxwwף-* ĎNjugl>q!A%v`oҀc«(031hh"#uV'qqfb"aѸ!jr$>g\hNCw6>6`$K7 \ΦBx$0rɉ#hg2$ʐo |c]m(]9B(z%l lWDHϯ eDWPCn(XeHR$K "ϗdR3$EeyIb"cvsܙc',ThIA$Ϗ_5Qz(U!r4,q QsxPn`{#!Si.CR yIl2"AT\VAy"6:P:<|1aL;$ґbC2o*lc B8cvP#9>d*%rl-GBm)OPc@w]m#lKmGT$CWih.8l0H-JLQ*`ІT8;tFF$7ET#Tb4:Tbx]g-J*7 TU,iH$(K]Hd\TN{w[x;~NaH譏$NR[*&$?@B mH(lu?J[.4+{]e@Mso})GkU=l̕6rtKBb$0@![&?2U3}rր'qq`4JUP]"Կx &MdI<'؋l"RIj$2Mfd5@ (Kr3J"ѓc RQT?g6ڱs<IO w aUڜF B_{$rZhoBMvN(ajTR}*]. l J~݋dHp(뜆㾶*l=^`ɨ4rݷnʠK%6&S +j^T@F7ӑg/DrEy[>\=F3dF +C .Uޗq*qqG*L45.GI H܊Cn)H2HdW%*H$EB(E e"F1$evlLQY$g␰JAwmmNA[]k:]MmU$]pZBU$P:0~_$V_*u r-Hn6[/VlEª/JUjd =QF;;ҔHdfuQ[HJ  E=}r*JD Dbj=C TQHƧw:'G7s)?;,(U;Fڎ.qqb}hUS4ǢQEHARec#Etb i8u=(>g"Is_R A).vYH|zW~DD=2m|[%vdHD"e%ڡ:[xT^j׉J^ZLI6r m#kؗ9xQ6?uqXǓU88N ,mI6HxF!iUJ(?\P^g12.31IH @)+(9\d_#P)a!ta9_)E%gQ|,IHeb<@ kH6W;(uTK6wGU_<$~dN !QڎӮ4%߄J>O#3TVJ(j=8iT$P"I`w%*; Ck*W+BbF- X K'.H| ːzuBh$fRQ(ɛn m"/ݮRRAjj_F bɄI6Q#kJEɢq{op6YvHm@=HfAH]gHC TvW[}>*G\jsPF s |6SJ+hGM_&XhFѝ=ЗiOO0JhU 6Lc8;*qqg2A`3zTw j#*R 8RQJi*;VU)(E49aϕ&H$ʕ6n#8'"RTǣ`HD#LB%S 9JR-ARFIt;̮RYv$$ CvuHX] |dcYQvB!WkRR9>E(T~mP:*b%6Nw|^;XT[Pq`Y7,p:avDK6FCb$1 xѴA5a}!`j^f]["JyCeb$Vc7WT:ل^i6*$:WG:Į]a6BSH,  %zۼ"UevbUHFb_v;^kuM:S= I㔬I8(60WC29tL IgŤ ZK5ƾot!\V988Ax [E7@"r²YD[SI2$o6Hy r$v~GH!R@ PZ^ 8Юw<*ǛE硔T}ٸy{Q{DVw{ 8$G+Ex_hلdW͵X)Xy/8=ծ7`$eAJp#22藵$ΰ6Ocgk9L׎cF aTI*{OUP rP Gl64TN7$šSz PϩL$ư%{oqaYgsD}C"@QB&ˉgﱈkoPvf+q8.e88%E\bQX/~lPBE"diHC eEH\d%"%6NFtS HҜOcuvEvEHdVyˁv(U`|,8eVP D$VAvlMǢb[Qa ^F%{9Hv$Fb-I6,>%֠>vN{$B6vcu#Ѵ !⨠m<ьQH^@vz;ӗj{U4/tqq|y&,f=#q?񴡔 %!R ܋h$VDAT ~߀Q.*=*$b$aF' V9Qh*S7 i )>H5"`2k+D 5-$vl$| Yʞ{I1vx抳C\$DzT[( v8L>GA)eN$<ȡ82)mR8jlkr=.{fULsQ8*qq'(@ Y1;El`/:C<ЖHZm$NBr&gߗ?GSPH|bUy(SC-F}sPIRl vN&@t1(=lRVIvL_$jX;mn sh*B򨆰oO^:x~AmS Bl?$~i|H;攀X"%ugڵUd{e$YBw1eToJ<* ݚîU DX[xϠͿ8Nd88eGa\&RĩL&e9ǐHFٌH (mέ5H|`Ǥ# "iן`+[DHFY(qTdZG$iWG29lL=6(JUrRcm=rmN4$#l^RjP"+ Ivvޯ@+֢$U;RT^=Z(}D Iip&0Y,уѬg?Cf 6XY$FTyJD%|H"CTJ7SqHd̾H"1\󊑠ZDTa8$r˴{C劃QN;=Iv^RKvd◃$7hchW[E6ǕHZU^Z[J@ɩcmGg1ۚǣQ.bL.%MdQ7zq˻CƸB*w3Pkqe88uVc`2IQ,b2BP)#H^R/;H(؎_d,nJ@d>p9JDQJgۨN.D2i b‚ Mb~ec\$Uݷ;\+lYH%۵cYgօ%~{tvjJDTzW: UmsLc:Q1Jl-v֓F"9# a go ٕdc˓ Hri:\V988QD`v<82\A*EQdϞ$ @ec}POHuA;բQ j} ;'^L9G6 RTه4~0ڭS%v $6c_ !3ڽT*=zcK: %W7P(I.()/oXZ͑į35IWSD3lRk,EA-p:k2T iǤ!DS)Jd GH*퇤\=}hXPZW!9ImɄ;YV55f<2TBx5$g?I 3XD%Eɱす8Ϳ]%P-UQFolޗq'qY88D9\g}qCpg@ΔW)a:`3e QU (Tv$[(}ƲȎDN JsARm!I7Xf+dԞ0$.ERnVv~ooȪB;JjM53POSюP# v, =1Ԥ#Ƿtg(5ELVI<ӇtGXY+Wg6&Ndqe88L!l>.`.y(.RSQ1; J$ Ž AMڻ>L{v%(fwC PS#fcv /$c2x=%Lu7vH&֡j] )C$rj?1!bkt]2TR׮\%;`#\4S$֣?j3YmSM>\o39-;ٗ8Nt=qq`4[n <1<(32;,By 3ɟDlP&JAIgmH,C2JBˮ[tƏQ_ᮂH}Ep[{F%c]H*9"?(t*N6Э  )UJgUDI{~E"zUZzdR|TꗂDh/hM헵ߗj|[uA:Drqqb@P屋j|kmJ xF>NCP) G ?o#t*q'A{#i 8 SRV=*D{J qHRQq*+E)'K@BɨxG[Gk3Hqe$בHb%D|y;xBBi볁GƏx`)U܎Tb~Ckv`S;8Q*qq't`s zqB]%R\FrDZI"qHz'M*mj,q_8/.qqVH {*mnxD_,w#׭cˤ8*qqRDHb}Cg 4:9 q6nrge88JHi 5ȷȲ)o8Wȴ HN48=]8*qqd@$yb)eZA_4X_rqU88N+'(E(bH:bٺW7 %T}:qqiD&Z [sFRzK hPkL{)R98 qq hMɣqHSJcRȾTX4rirqqvZC")`,J'l"%AJi"WPѶ֞ri)\V988 Hp$S,P_7*X(8Ne880-6E lѸ{^T M5 U8-*qqg7#<ўHj  [4Q4}fTіrpY88fe")7osH(vl]mT(u-8N hYӡc|{̒%K3=s$/e˖5=Z:88N40m\+O F!+Muj/U6/ .q]:cλ5j|sλfݺuMr88k #L!,kiPϧDW߶R .q]*֮ݶpzpE1RRRडCy?5=j88N,2¾!:oʥeUPPϧ(YKtq&U~)Hn{з_6?7i$tF.]9`t ,+Vy+J>lxBB&O{kԿv9:Oңg.~;t88KDRsѼǰu_cz>;ӗqyhYuŕWqͯ~‚x t͛˿˖2j(*{C,\v5ٳw\u?aÇqwuk^88N1IhhP4w.(Ol_q&UL{38=QGūԩS:D>G\ﵣGʈy7v;3/qq'ڈMEs4ϥr|䯹R98-MȪµk1\tqĠ-?NYi\w?f͚ٓ/..gϞ;<= ֯_CdKo IDATؙy988LBhA_ 񚺜ngiTKq&Uw>6m'99ҋ,,X]wy_z)|7[=>o޷r ӘFk׮`Æ ti3rqql椈0-㿫o|̱~_`%qId_Ygɠ#ᇷG /odJHHQC\y<̙;J**+3w.<W\%%%1i$6mĽݻ5ǟ￟J&LCּqqX%ADvy|CIDW_C}=T;8%r:t /<.w[?GvۃK? :k۶-773}>aرx dggo>n˿` ݣ[nOznζ88* 'N,<1j 73J}}6vljquo[[/E.%l(L8Cm@8N )) y783[a8NK0)Q,sP>N8&P_~a a߬lܯ'8f%2-Cj a_4k(}qZ+.qqg+Ay44lސBF&z;8Ebcz/ j>Ύњqi.&"11>HJ J6XU4P$q`;%8JbcNke88'%K@b$`@1}rlj%bNLS#qq'uL&{%N Q*E"pI*/s]I*++|v_?_?qqb)HB倽btMԣETaV8 [VQW競398N@%j㈞0F0KXq'nYU`sq'VG}P9wl vXI˖Vz*qhgeNsq'?cG;Q)pWP/U"[98[ɪqqXf,p*JGxQ.CTA߅vrqIdUzzw_ZW{/Xqq__?qq#X@*ZweNK5`u@qhIn,szF{C_?Ϝyƙi9~88-M? pjRFeG.qwuj1׶ {|=884'l>. 7ʤzZ/iIi@T98.U8 RWWx!l?N8'zϭ_9:rYgSTTԪe_̔)S6Us22nqNmy衇3=s_7`}>;_|e*qq&eO]AO\HP1SU8N ˪'+B]]'4t?>~ˈù[7?w8쳹[noj/d糸{1c3g|ʣ<.e*qq(ShGʺ` ;~vq\V5#C W^`С[<uבʹk/̾!11N;ɓ'cᄏ^udddpi1wIOO3N88MB1 倣K>OmmcIq]땕}̠AGpȑ\3fp!lqLǎ$99um~KHHhm?x[oKGI[S۶m<_)rq d}WP9ȵ{~6ߦHpyuqGljL)Uc222߿?=8;R\\LN7?׮];4ս;s =V?[5tlkY*qq|`J6MFI&Hvma\پrZ/z;8-c=Ɛ: &r)l~O믿?zZYW_#3 w`ĉ3+W0m4Ν =z/:JvIBK !B!tƌȑL4V/=XթS'ʖ- #Gҥ ݛlmm`ձc2dǎBqdB!8IOOg10nXN8_9`҃U*ưahӦe˖̹s5jr)Zl)W\ƑaB!Bd̘1?Çp'.\`iE*GE::ygѲeK2e2ؘZj~zի >BK/  Q[ Om=>>%K<|*+ӻw/F@T)@B!Bcǎ,XTtLm?~H弰U>>>;UVի888ЬY3֯_fccÊ+hժ[fݺu%r*!ěrQju)SQR%rR;wxnrB!/T133SfjjJΝTsT\\\X|9ywssc̘1lْwyG-֖hZn @VHJJ9>lٲ*U 33SHy8>cƌfͷ011]MN\\jP]FÆ W8p@nb*.. &[oSLYVS_\*#z`UXX֭[9Ufrppѣ3l0 FF4i҄0{}בBHիWgդ),--9S.la&|ү?tl_`>6̘1SnbjqYW?wٳ>}{^!D-U %ع-[3g<|}pҥΜ>MЅx:DG<t˖l߉59KA͕`ɓAcԩg?\zsАQF];͵8v4oþ} սښ . 7Q1 G}>ݺu#11BQ|HJ!Js0+~Ғֽ'vV7fJ.MW퇏᝷ߦTRkk#OM6СC{o*iҤ 'O=6m#ϵkԩ ((6ml055’.]p֭;v⭷-PX KT\ɓyԫ^ԪU*Uxf1UTn]+|}}sk=::K.Gx.d(rdaa@ǎ8x/=j$gècޣR0:Z0*)** }==@%jڴ n$$$p9&O4s&LϞ={p-ZdĈ03?.\&44N:1p """r~a/ |2/_FZZ&LĔsT7ٹsm0eT:vX9f5pghcǎNPPP9s@WWaÆajj¬Yr='Nso<=G-?>&k7[aq\rPma~_ڵk<:V1e޼y 2k׮ѭ[7Zj… Αر,ZQF1c ֬YS`ݟ<m0h_ڿBTH ӣT6wҳJ!^#$$s'<ۄ}6$m_xmQQQciil/kRΞs\8Ξ~V,)))r1`US 999מUu5k2k, ;w|)ׯ˽{w9rp cÆ KC_3fL>ƍpBcVJPl^={`Μ9z{g֭ݻw2zv֭155-13+SNU144mG}?@BQ넏>6liΎ_~%G޹s?Es-t{MӦMILLQ|+UX/ !x9$X%as,Ev]37o"55 x!5kIII{ڷWiݚNZZ;vg46 :u4G>r )wjY-[ [.]O?-~ʖ-Cpp0FNl۶-dm27rSF ݻW`+VT[Zs.[2*Pj5ʗ۷q&::q5uv\111D?ZjU%=]dL_=s=wYe_\9 wY_"""HLL 11ؘgt,1V ]LqĤPǟ97QfQԾ+TgkB! V !JH'!!>rQ/_ >^ɿ1+wC?3tI?Xv5Μb6j/&&X頿c23SrrUO(ZnʕcڴJ{k;|͜&Fll1D ӓ۷0d=?ejԨyr* ,[ CC#7Pu9%3Hknf9 cǏbhhDfy?'efg9d@ M--w<N:rC~h=bϞp/^;};;}rɓacc=_*`Bh1 PiI~333rM<޽͚5yxxls{n~G W_}ѣ={scIL8!733C|QsڵkG Yx -[d͚Յ1/ϧE,X> G dΜtd 7Ԝ̉3R=1go(_<#FЮZھ}/_z T Vvʄ d 279֫S|dns c/~5{U!D5vjيD=PNj~NOQBjLkQ {nR%.1;ڮEޓ>Yx嬟=JRPTRʶ̓;vHSl2DDDDf(zbxs?K*B-i=8zk֠TJC5jĩS4>XDF^YJ!/-#n4g>:RGJJ #G"OөsWՖۺuk3g.sEGGX֙?>'Ns?r?H#B!J^];JWRJO'MtRHKW߮; 2%X899xb<(!ՋxB888BL0 IDATlގ.K(dBSIKW䧊TU9+_`y/d(Y&h c/55jG"0n8"yzOB!B,X׮]ٙ ߺu#Gj*\\\ցvI%!%OB!B^HСCt]]]>C&N!J !D!4 P[[t(!B!DBz!700P`bb"5-ET˖5%tB!% VO2eHLLTjV!S^O<{_"^4G|"㥍\Jmlm=rm%Q!BQd/$Xekkݻ۷/m۶RBrx}ף^C3"n^`.QT ]d R򪲼W沖*QZZEe_nQR)y(Y.B!"W/$X5{l\\\5k-Z`RBrZZ7ĸqIiʜU*ȑJziR=Yئʌ.e]zI+6IJ̈9W,o!9I !BQRJֵ"**95jyO<>{l|rJ*p N*U>|u LJҥK0`ƍCpww &&Bы(*!o u֭[&O֭efܹäI155eiJ_(;/bmmBűeukǏ155۴jJH-Z`˖-|hiim67oիWy뭷*TRiB!Drt&=]ErJ**US K !xFQRelmmpsrv# {{{ecWjd]ၩ)&&& 2gۻwoWĉ5jTܹC .Pvm ptt$::ZVb.]}}}F͚5kVzU.]Z#B!ěH=ܗBJ>ɓA5 GG'ƎãG/rN`̘ 9m۶~l2ׯ_Wݶ4i74BBBXx1Ly===IOOgڴi=`2ݻ޽{ٶmRg~~~`ll̊+9r$[l,^S2c ƍGZZ̚5JjiiQT)4!^0@=^RB!4©S| 7o`ԩSzzz/_/?~/ٳYԍ:{nvR&@Rʕl߾]&22RY9QͫٳYl&Nʕ+>nnnʰ@*V(Vh???<<<000`TV 333RRRv,B{ C7m!( iٲVB {\sή_}UPZ5b vbR7-FAV-$&& =/떚Z?#LLLׯ3k,f͚L`aa/--M/릫K2eummm7ԬYiee%&B2gB㟼4o֌Ӧc?q .bnܸAbbb <|KKKv={Q2˗\3fևޤƍ^z{xzzF||< <___Xxq/cÆ $''ʕ+۷dB#ӇիWERR+V۳zjHNNf۶mmV*M!x $X%B1cƌ׷XƍqssАDRRR o UvѴiS #86p .nbllLʕ9rZZZ鉻;FFFԨQ.\A8}4իWGKKKy,\wwwLMM,YDn,.]J`` 5k֤B \zK0l0Ə/&B:RB!rrQv)&MLŋ+Wsfi~4lԘ=^T^ !!hђ|՛ΝQ~Yy`B{˖ԯ߀^zIڵ }9s]vq%>c <~EKK#]HLLP ReիWÇ癞9WAy}]rM ϳM(7HFFF_HTRIB!UB!*wlr:wWbɄf̙L2c~(v;tÇc``ѣ8px쁪)!!3f0~"""͕&Mн{w͛ѣ9s&jբ];;6ŏ Ѻuki B!B:X=P3262e\x 7WW%ԩtލҥKLtt4vvv{:r..pvvv\ٱc?JpBCCsW~}(Bo'5oޜ'x0w޹QB!( $X% ޡX/ ! O\l,[6of͚#߿K?`< Ʀ ̙3g0a<iϏ9spYB!B#2g(P^qYQ8t֕FͦMJZ>iӆ~~̯faf@duf4_SSS6hҥ?ҰA _9%W!BD@D f6l1xeyܥKٳ'-Z`jps[ 66\I\zdB!œDdo/c޼$&&jJ JFUZvv<|ؐ]竊~/A*!B!^2u(cCYbbfrz+yB'E0@!J=JjrT޳gz葱1cFKF&su^ן\B!BZ;2%X%:?ֳȎ;:$B!+eW# GR _PKJ!kׯ_<g1qqqo|m䁍4$!r/BgQ`e܏Ts[w˗'g=^!G^beeř3B!BgU~Zn+W^If?BȈ{RB!BP/}Q$&BILLP&Y ԅB!(_TA ܖ5-::G''*WBG'bbb\-[{bTX wf?܎)uhب1+Uf޽JZTTݺv^FmM!ILL@B!o"-,^^u 7wwݺhjoo :^DxX('Ofqr;n޺ʼnyZ l_kͅ\61cB!^Hr'ѣGնcgg899C5k5j@OOkkkΞ=+Fhpz聱1eʔё{IB!4LUGϟRNmtttlϟw\mٲ%ѣtОSA' ]nQ|1y2t҅Ǐ+ҫgOɅ>6!xQJiky Jz~ں#C ݻDDDPZ5 ! X'|"Fh~ѭ[7߿Odd$:tvB TX s Kֵݻje˖sիWȧSO- SS\GFFbd1oJ  }lBTh=w( ..ciYU1}?/OШQ7(((˗/駟bll1gV͟8q:uPJJ.ù|48O)]4Kf=zTڮBa^yԄ;J{w# 9^ܼq-O_HU\9e.BB(gw?2p֭2'VX'ObYn-3g`ٲeki/:XU-byк}6Z&4R-زe ="%%m۶ѼysiB!yO,U<;pUeش?}:e ](WLrCloϦ͛:dnK, !ċn S׈AR{Z@[ZPόmZO׳ւRʺVu(WKٖZKymutrv# {{{4i2L>-4AHHW^eT*Ï?q@ƍ}ϝ;w2tPpڵk,īj*>C gΜ+BhС 7 << 1|]k׬)tY?.uc >RJJZ~f?5cW 9+Y`>ׯ/Ա !ċڴ6'~5R@Bm92s!o*26gcK^{=:u 1c2hmۖ~eː@zz:zzz\~4AHH/f߾}<~?<<<믿fҤI߽{ػw/۶mSϏYb#Gd˖-rnԩ̘1qƑ+f+BhB P=kzMYs3LJ~ȉrM˯ǐ}=cϾ^\9v6|~&/Cll4͉xzzz/_/?~/ٳYԍ:{nvRlqqq SٙQF9k׸x"yWJJ 'NdʕJPO__7777 +V'40~xU&mW!0RN}Xz5QQQ$%%b  !7 X%@s"!^^z=O\0 66v슴ɘ1cptt;kii)AeРAܹs'GLRpBF͈#ѡO>OȄFXt)cǎeʔ)@FjvB L~KiM<䚈צxڷ3gصk/gL@`I|}/ZZZR~^z>|8@Ua_xxx6mJ``40X~Cr !癟(a!Dṹ2idw!Gfy̜9'ѮժUcÆhݺu !B!TB7Q9p7״͛sD@B!BjJB!Bh, V !D ~Oѩeܹ_~M*G!B$X%%5k43u튾>oլ7_/bTB!B#ukնկ_=^2~$NM###oȌ_-][fT*yOƍ?qn!\k!B!DI *!(PZ۵P=Yfwuk~ǂysCCڵ&O'2u:ӦNO;̜ ڵ㙎_ræMHE ?xB}w}WLfͩS6Ν+tLLLJłiii爿?f@GG;v,X5{>rp kGjjæM?JUhݪ%ڷCzcMJJ &B!(sV%&&}Ǝcƌ+)vo=jB4UV%44Tm[JJ {(ʰҥKlٲE$%%1vDuKRB!BVl'Xg، J|edu]Ujժ%Uv1֮YY711!!!`RR&&&*̌?Lb2M B!BLcӦ5{%55CcӦu_* 11RB!BVlUtY>h 2w#?BHH#Fȱ鹽HxznÇ̟?XvsmƎ'I6]tFRw^ghkk-̙cʕ,^X.xejԨ+Xz-7eh\F K_N=4h;v/sgrjZi_o6M"##*j҂cccx!;o֬YԨQ===9{\0`XZZ2tP"""|!%/mhhV777%SfMf͚ŰasN2lmm,>cƌ~ԩSi81k׮x{g[¶|nݺѽ{7n].x>jޜ{Nu~>UK777gF.^8bff7A svΞ>ɩӮvTTk-*JUԼ9::> %""jժ1|xg ! X'|"Fhs2oUV| ܾ}[. <<\,Oժ՘>K!ԯ߀riݺ ƜWHH5z]|O?ccc={[ĉԩS*UPti˗ o5B!^.vB .`ƍԫW/|J*>x+]4vvv0id?~Lv000x涐َRSSeSSS"""HLL 11XGMd|̼?3&)ShrKbbqXXX>䓗2& ʯmzS-Y7nd|fرKjj*SgϞ=lݺDՃ TB77oޠAP]vlُoߞ#FKKKtttCݣ_Z3~=Te͞vu>sf͚EJj>IKKS i.^Hf͞) ʔ)CӦMYl|󍲽򢧧G hժ='OTL0Anm۔e˖ѴiSʔ)CR077Ύ;v0b%5k(" V !xeW2Shiing=J|ӹzNn]?5\&55$6nHՋ74___Xx1VVVje֫W 6Lrr2+Wo߾ȄFS+=ŋ]q)~ɾvYSL|\xQn7,><߼_}|iFFFԯ_/2G=&\wMkё*BlYS<@OOW*o߁3gΰk.._ggzֹF˛_Zxxx7mڴP :X[[s̙gw$Y穪[nÝ;wrݽ{___|}}Yf {{{tttHMMɓٳg\ȗST|Z/B߾} ǟe2|J}%&&g̙,^8?J֭[4hZ Ν;/߿ ̙úuy&+V[mgaӇ˗0d<<<Ԇ?~˹s8w[l33}̘1T//ׯg,Z(G'55qƱrJ)))\p .vZ裏^X000x)mu H*!(O=rssI&tޝy3zh~{fΜIZhΎ͛7aon/g̜9??**(yǎc,\PIsrrRNΝs˗g͚5cݻ/'OoTv9#|@ر#G(%բE\H7V\{;)Yd߫ ;w_%99z衤M>t*W̖-[!&&͛7SbEҘ1cK.}H.]p)))={VNYn ʕ+$''sqy c8_]z;w.jСCԨQVXApp3x1bGɜ:uJ})>OL6Tj׮͎;!!!___>T*| sɱR G={'22y桥Ńڵ0m61jԨr6!^\TV$z7F=^8ؘ]K˙[(!vA~嚈զ{\e>~Lll GbeiGw7kW[Vc3B͛~! yԩSj=v&MRmڴɱqtt2zfe>IoҥL8Ș.ɫjժſ˧~͛jyO7Ւ%K:uj(/ HLL|z(1_Fȭ3bVZ QFSLΞ= 2]z&M.׮]FPCΝ޽{G,sݻw#F(eqtt̵g`nӹsgݫOXX-Z ,,~yN`Ϟ=>HOO=Vd@ Æ CVV|}}ӎ;9sLCJP5uT6 `nnGGG߿ᰴWӧBeTyÆ akk ƭDwwwH|Y9 ?,:ɤW(^= ӪU+ϟ?/}"U=9bؿ79 0\,22Rx^V-CqUEY'Oϛ6mtr/Lrr[lA7nƍc„ .`ԩsm6L2EuQ8A #wW*;=z$}bdwѣG߳P^y ;P(Pk> B?lnMMM T]gB*!!Ai}*cdd$,"NdffC c7@""R;f^XX+%  y& E+rJ!ҦM̜9 6+_| m6ԪU {ݕ*wٚ5kn֭݊[ [nW_zVVV²z?l=UCv< nܸ̙3 ,;TҞ={|swE^zBGDDSNkkkܾ}@h}Q2 ֭Wu*޾}**""R;fΞ=̰%* D"t ԩSaÆ O8p܃7~*w7x!<<&&&x95jI&-ץKxzz%ojӢ,{}=Zx,z(hT~UII֓޽;ǕUM(t-[TZ>>}yṃgϞBJU.\^k׮B U.\U&oܩ?UHDD!%=%|€0qDi/Wν ."W^Grr2O..]]]!J!dp |ΝٳѦMx`jj*xPU="J*_&}p-իëW͓k_f ;igg ##0_.[M6]6C̜9̙#d}m^K\<+˪KKK *XssstӦMCpp0nݺ+,zccchkk@TUu)cʕy&&NƍC__zzzhڴ)N?+Vm4D F>I Ȑ?;v sL&C-Yhʣ ug̫rZ%:%MYxo~vxzz`ӦMX6ι;v9w)rϟ?G.] {9"uIOOnj3vDDDTJDիU{Arr2  ܸqCԩ۷oD",,,Kj10`KWr~ׯ .v̙ CCC|w_)LLL& \IIIѤIIiWL8˶m`gg'k%"",bUdw.^U777GXXaÆu響 333 cdffUsɛEŁdϘ1f:tR@VVpǏ-{nL0lܹr.rD"M]"*knBTijE#F} kO?7775 ZZZؿҲvvvhܸ1lmm[f \]]͛c޽l+(8E"rqhee/ Gņ iF$''cS#!!A({h޼>#Ldeel5`bb"̓JH$Ǐ ^^^]0- @Ꮰuu2񢠲˖-LMMQF ܽ{=`ܸqq݁4GШQ|yimVA喷; UDDz͛8z(лwo;BBHS޽{-[j~"44m۶-΋R#)))}:.鉹sVVVصk'v*,JTKDDDDD%`U%)"iѢΜ Q8cǎze޲Ǭ"""""""""`i Hch̪0֜aQeP`UYs$,,mB&"""""w$"JIy_ qyVdg?+%Qe`Ac=z +g-@'RQI0XEDeVc& 4FU1cԩ===4i˖-T*DGGy}"R "H8v """""""u(ujĉ;w{oPEr"ɄDDDDDDDD'N`055W ~~~Bׯ_AllU4]GGpmFFFpvvF\\ %%^^^WtuuѾ}{lQQQ2d`ll '''zQ*uaÆXj\Zj} 7Ɠ'O>ušo߾H$ӧb1l0YfveVXE*C.VYVmAeN[~=lprr^zhXYYaҤI9s !!W\Abb"&NQFaH#=x5bccѫW/3cWU;w?իYfѣ? 'O իWݻwprr[L.\WWW$$$`ٲe0aB27oFtt4VX 300T R(dR;L0DFFbȐQ6l8_ٯnZe/_p! u]FFFׯ^MnݺH$4i޽4•+W DDc… DDDTJOC8pjՂڵk'Nׯr6@ 8qpm?3ߏ7T޿O.tM̟?O?m6mڄkƍ޽ ;wOƸq5fܹS`UQʦcƌXv2055<]tFsػw/Ґcǎ>扈lU;wƢE/m/_ƛ7oputMaX@$/_dPLL $Edd$+J-o`*R`|r~ׯЅ[naoo5&SDDajj ݻw%.m6١N:J3 'N$%%F&M'''v'YfA"@OOӧOǶmۊ}Q*uFxܴ?Jкuk|7ԩtuu333Czz0v@ff&[L̐tݻ)wgG P1PE3f CCbb 33{Ƭ,;CBCC믿F1˗֭LRRWƼy_LL N<)|Wdeeٳr ޾}:`ԩ| ~7oѣ2ZZZ[wvΝ;̄:wS"448r7o.7_GGGFDDI@TZ TՅN:+#88VcqXvURRv khڴ ''ghԸ~pss ₀ ƟR$==s΅ann}}}L2EJ#Rt<|O>EZZ 0{l'""Q`Պ+vA"࣏>‹/0VVVr֬Y/ظq#oSիWcƍ0007vޝrJ,XFDJ`` >}-[ ]= شi#0yd9˗/???dddWi~fff"++De0de?~ kרQ&&&kTZ`ssl>}HHHurQ. j׮3gXرcY[[EWw 477/tݤ[Vzu_ݻ7z %J+''|UV-XXXGADps6j/͛7իѯ_?ddd`ݰ.Q+W(BE! ߏQصkF WxN .\ Call#FzQMGGG] U^HLLB۶m,Y3Çn:N:8\7RRRfS-hذ5k*7/g9E֪ 2]/";`'''bĉصk`-Q9+Qz9  UcJzѨ-[{www|wrz+~(`@4M9XVZB|g8~8ڷo/"""o^""R={1zW%F޽{e*?(TbaaaHIhɨz%._?'Nƍ1x`nsJ$""*G Vک*PUѲx&L{B,_~TXx|+U\=zLݻ#99@vfUll, <_|.]  4H sWUDDV Td2IE\888v'NZnݺR˶gCՋ/ꊏ?ؼy30k,ٳ1TDDDjoa""p*#WZ Zƍȑ#5 &OǏcb)lle>̪rqqAN0{l,Z7oFbb"fϞ[nƍHOOgE3諯*RիW#99˗/PW~RSxJD" ǏG˖-֭[~ZnK.K.H$0"""5aHMlmmaccShH7o`ڴi>}:+H YEDD&;wDƍ ,sujEG,(3*gٳg*_9X ooolڴFDD V^xQeZn],bF2 mHq *' b1b `bbJ#""Rv$""R}i`ũF~Cv\F[۷HII-[qaHR{֭ƶ"""`ikku033Cƍ1sLHR|UnR^.udeAaÆ GQfMܿ6l=V Q^=cٲe4"""u #11ݻw+~\xjՂH_߇Ua)v cر#<={DDDYEDD&}|ӣ*~tm۶-e1lLxvfZUDDDj믿b'Nu ϻw{U:RW?Zl r ^xSrV`+""""Jt77oް4 ۄ-IQkܸ1 Ǐo ,ߖ}b1,,,\>&&lnw7Uv*ɬ*(8R'ry߻e͚56l yDQbĈ8|p/t,ĉJUDDDTq*۶mSX6 'NCDDڴit/c BvVff0f͚bwIP iiiJ޽,:4h{{{'=@[NJAe1PEDT>VZ%0{lɕIOOܹs ]]]~AϟUVAOOVN.t_~% qFl߾]b" IDAT ohԨ:t蠒mYz56nx{{c+G,ʕ+022—_~)7m9r$,--ѬYr;-|""RGϰ*#F@n^zxV^ƍ(鎾w^,]R`dTuɢёnA,C,t?~<8::XUȩSЫW/@޽qIa9Μ9t_晘 ((Ϟ=èQtrLiիWGPP]v !!!z>LnСCobʔ)r._bV,#wMq,b/;|~CCC!dM&!##2 ZŋK}S1D__jX=#F`֭x-RRRe899BBB쌕+W˸'""%fTL'""WĦ^{N.y׮]rs=z^{PтW6l@xx8ׯ5kذa`ܸqq+m7H""*pYk""!8P\9tQvZb"׮]ߑ<;$psir;v@bb"cu@DDD*| :9/DDsAQq]Ue]]]g8p9s'_ݻ\Wx=޽3@BB,vL-|͚5ѷo_El ."%rkJ(ͻ."""0TADDee˖ХKb/X#Gرck ]spyt!!_dd}дiSlӧnLnz!W4N> QInDDDe?T)beecȑX|9fΜY@ \ܹsۿ?}}}lٲx"_Άb+]agϞwJkggDdeeZ "hѢD"ʌ9Cjj*f̘"mG׮]Ѷm[64L&+0h%"""bJDؽ{eiРA8qܴ` 4J!Q^=io߆= addgggűRqyyJYfMb׮]ׯ_egر#gB$!$$D6rHṅE1lk*9(J2֬Yr7믿FZZ ++ ^^^DIZZ\\\)7 nnnxaeeI&¨aO>)1aD"ĠF;vlL0AxgϞٳ}TQDDD`ɓbŊr bXz5 @ تD}]wޅ+`ddoooTܓ'O={B$aܹs"66X_`ٲev L b̘18~xi<`**,$;FFF077ĉ DDDDe3gɓ'JO(D񁹹9qN:E@@uwwǾ}p9lٲ .di|GȀ)+N:!00Px}5 0M4.>6l;;;ܰnݺًpG GGGWHK޽ATed|7Gdd$7n#F`/&QIJKK +WW_}U#""cbɒ%~:߿ˍD"w},[ -J! C'G@@&N *cРAdXjU1b_OZnȐ!P`Ԟ={s"u+ Ӂv' ˲*4lǴi`/&Q Ɋ|/^ ccc 2oƬY`ddC"##嵴ؒDPLL N< OOOVU9_}d2'(-gnnݻw#22Dݺu^Dعs'̙g}GjT=I2EO,kklmyV$V b%''ˍ*J,3GʕYJZ 066.rpwwGPP.\T(Qs'#:CU۷/_.\d2<\x1cʪ#++ ƍ :5x`={ի"ٳgxf,hveHIafUE*IՀ#.. .DVcDDD`U `oom۶)-k$%rJ9pvv%?~ kfP?.X*k*/KKK9s֨_>b1֭A_{QdB6aϞ=+zK:uQhi`fV'@bWIG'[n 0a/zUEWn{,_\e‚ .āND!$$Xr%7o "t6lD"SY"{3d2DEEĉ?~<V߿e\]]>kkkԫW /Bj̬jp!hٲ%j֬)WDDD`Ki9[ZZYf*yٳgcʕ +WĬYتDlܸqqxFTK.{˗/^JP^=̛7ǬYШQ#{ԝ;wСC534CUҰ?3CEzz:޾})S+lLeiǏ 4;:.XQ]򋈈-[/@WWIIIY|9sӧXv-N<7Çd8p͛<(J!5=UMӦMuV$};w`%""bVU$/_7|ɓ'#>>f"""_ҲrNNNB@@JHCCUбcGṿ?v؁ք-Ν;]`/&a*$l۶ BZZZد޽{cݺuX|9={̙3g'@*>PB&&"ؔ.RVd' VQ{nL6 ;޿ ?9wD;r{͛7&M (!tjHk2PRGDDDCU@DT0u0fJsq FFF]64hPaptt̷~ OOOMJ򻝯o޼Xe;`,0w:3UDDT]t ~-.\XxOR8k˗ѪU+tM6ոmx"jժ8.ʫ("""R-Rt0j(QF~M k׮h۶-* b@*D,\tRӻw2DG=2 Z\U@DDEDDlR)UƯ__Y\ Jj2:Ƕ"""RѹnI ci QwHw~ZĉJˣ:%$ȐUtt bcQ+Q{9 6JwLBو@OO8bp:еk1N$` ?k"""* y˻Ɫڳg ѫW/.\6x){-[T9?7=z(]V$ 刈p V7cY ' )1(+ʐ`ii-[")) O.X,Fll,7oQl=OH(fe?jlll`ccSgϮ`*a<X'" 2]pqq)O?Fr{Pe.BϞYeQuH%< DDDcfU ÊhŊ0alӧOɓ U_&,, o*¿/ TxV̲"""RԙU"wV8… r.\,HNNFzݾ}044ʢR]VdׇU8p˖-샖r*U,_ؘ1TϨ>eEDDJY˗/ǢEyxx`lY"5KKK "##;99 ^Btt40i$V"2x}`ȑرca```eekkkܻ'ëW9%Yw^Ǘ4迻 +"""U2y"uYP; 'O :t`=|޽ WWW0.*dhkk Y~a2۷oݻw֭þ}}}}ُfDVM*붖I ڴ:{pvSS`,+""QY̙3JǫśH$ann#G 88uԁ. |oʂ7[*?<<"]9dgّEQTDAAeDa s]ԫʈ n #sn(AeD}QY!,$圪GtN;Nԩj9)zh%>k*=zPPP4}w MӰn:߱^zGAVVfϞ ˅{,ndGf 3k"'Q*/O19DD7D+ Xe0m4L81w܉̙3SL͛w^,\YYY5^{E3-܂^z /^%8 +]vv6.j0"*N^Cx~РA999Uӧ7>4 ee>i{' cG 9ߟ6T&[FK z5x`pαbŊ:_3 ##7toߎq!==#F7z{9̟?=(A$Xd ~ij ގ]"?>77nK/m$R[W^M8֧w11&|m[=5a0~hA\gΜ<`)C8k`[ ##Nן}޽{SDx#`Μ9phN\S=//Ϸ}믿K.wnÆ jRuٻw/ <%6mO7}h8t!%θ\)Zw5AAբY=0d̝;4'O  CNNnvL<;v!5_~yn \$믿E}Ozj  9rsЪUև3X G9~%$ZAD ĪtL0!(K.%{A4On6lٲݺu=l7\ 4MwK3uT9C}W\q233}L֭īVDpuٚx ***0yd\.@RR:문SyUr(5ndS6IάJbD+  ^{ > 0гgπؼy3233'NG};{U}N ==Րv4 }卉$rrHHT,qAMYEAqBnݪUP ,իb=ztyn޼c!Ϗ7gy&ƌSbÆ ݮen4 !p8#/(+O_?=~vl@ )C3 "N7nl6͛+zW_CVI;p@ 8<333ap5tv\z5~߿ .O?[ontb:qҡi KONж'={8%z@[uw%AAq UAyxeggfΜ-Z`˖-83#Xr%; Uзo_bÆ 7o\.WRpII:ض@^:sհ?PQ$%X'R,N#  T ygUଳ’%KUꢋ.۶m9G>}p°=p8_~ᨬd bUd.]#1ɘX. O{9iZ   )Snða׿sÇJ7n9?cv[ap8`۱nPRGqq|?ԏ;¿O 'n !ܘ&c=O4 s91k,\uU7x#@0 wz3Hmؼ9+Ē:ks8aeII8F;+ AHpѳgZ*TܹsTΥ^K/:f̘I&zQ%'|sL9\n4\`JJ4sd$S g`hY-:P2MNBQQPYY KA5H" Fs ;mEEzY&N'sF9ǏSއqhvK"g)yUk׎fV֘{>MG۷oF ""H" F"%%_~eXi; C\pAT^`A L G~>@j# eKMζ׀b_K@DDo h$>BZ~}cǎaƍi~7ɓF&87EǾ} .Wvs\<: n }B APoJ4!u]umQDP^^3,o߾C AZZ1zh:uh\˅=ܹ3%Kw58R= zسؠi,ns&iiHTQ -:i`LYi)UDw`+ :: IDAT=F#3gQx#33f͢^%8vc̘1Uv.5jNڵ+ƎK F4[9UCh'H8z(8!b,7jx<㱬-;ghHOאADRАw(I7 ]ݫH Xu=_lԊ⋸뮻ТE U U/曑to 9B͍Ν;b!ϧc#.#L^]tSW\q2337 yt͍, O0#;&}:l6MnH0 bCAA L|78p@X7@vЮ];|gXl:uӉZ?p-[z ℧z ~^/ZjE F4{~|r߿sbȐ!wi0 ;vط/ 10o/mǨr6Av$Z,+ &fôi0qD,Zܹ999XlL,ݻ| xj~„ x`٨G "NJMB3AQ8um۶XjUp#55>ڷo_mړ'ObB?60u[!1\@QUPx`r?s:ڴ!h,:av $ BaVF?OXW]uU}gn Fš5k#F9Ŋ+PYYCRoD%K? 0ؽ{7&MѵӦMO??񏵦:py՚~˖-<`:th6mZ"-?zȐ!6mZ*Vxө]C!%ӷ'a8J4 hf6sL3k׮uڵa]g&&Lr7B ǃGyś!,9nFݻN?o< <8gy&.2moIa]g"6-!'>iC:ݬDϲRA͏/'Ā9dggcС:ujT)**ܹsR/DO>$ѵkWjYУGj7!i^;> yyJJb4zjΝY̏?ݻ=J4<Ͳw$\A4GotL0!… .]ώJ9<~'m۶ʖA/vlقnݺ}K4z!>!RSSv@,+P!_..3la_ޝa:Vm~7jceɺ};Ǒ#@/Զk`x蹟 Po*[n%#xPXX{7\}}'"BU;F-ӟ {ݻ7S[JTVVvcȑa]t:e9 bF8L4*+o>T|ہ^bU[K7$;0sN? <W"ы ">Ac:w^{ W> ,g}S[`Æ .]K. 1b9 1ʃeD o6kx 'Mwaa\0cs^]ݤDX 5kfpA4$VAD`-_|q|G|wL%U1h7fs6l">tСR:>fU^oTpJJ4I'4D, *  ` @ V>u+W2|_?AL,Y±u+믋W0g3̝[3|muBf(.N_bVI}4:p$Bh54j~vgEH" "nb8rslWߧL \V'b]i=㣏8~K\a8GjGUJۄMCi)0a?I vTSlNNh͗X ]$bA fҥK#2M>b8C3j-`iMֆҐxfMx~;z$7 9kbA  6vn 8J@WOM,7LNy^8л7fطAɼyL -N׭<^xX[R^αx1ر@^lU8תNΝfsk١9d a/ x7|/Yqe6[Q\l-$" VjˏvO&9AbAA4q Ԁ9@U֌*s";<ÇY TY|ˁª{ xme@^"]q4Qi^d'%;w-HI{ "DK"AHDbժU  :.\zjtuQ7l;[WEERS~W_(_$%#& -bF۶PPPo֬ #ǫmR'DADѣG#++ XfM?CKaW 33zXVgV7!!@*<pc$hC.bi9jg\do4GJ sXw3;lظѿm5)NqʀirLm[;wm_4M]NW@Gx8 ;88Wgmx][mupEٙOߚ5?{n֭yN "Ŭ"A)F!Evv6F .ִ\pOcǎΫcI L@`u3ŎTDDvMƛᏣi|yرI=-r|4$:۶f0ہ .D"3- $VAD3ছn¤INf?Ҭ8Uxc@̸E1Tm*V [ ctD"KhyQJGlAL:uji#*@1 T¿[`#J zpH<ct R~׸vWR0 c84Щ/֬15#+c8z HI10 ƫ8t7HM5ѩO?I>7 ,XPBԮO*{:&h}l*_yEg 8qE ͛nʐ![rUN?ݨX2ᦛ"SѾ}{RAFh)/4Mk/h H" "ʴIe͢RgMK D( Vs_F9k\ (v`bR UTѮco<8WgQ 8ڶe.5."d ÿb2m&=h!F]eeB*+[S\ Gv PCPVΥAUAAD+xx2w*s KKBP8BjٲSGu}t7@g;AA*  b# 1kkxs b9\wc4hk8<w.Nb{UWBG9.۴a:)'fm`[D|~Masn?>wBO.Ɔ L9DZ{7ǎU{ٱw{b6Ms Eŋ#oVÆ5ߓ+.NZ}sED!  z Sƍvx%t-1|OX?bǽNЂ}w* 2d=8VdcR#X"W@Rkѣ'&Ζ-i ׄ!w|lJK2iAa=AADLΝѥK::&J_b)teL$Bb AQZ-%YEAD8yRGAǰQd8BAMUAAD(,T +P "T:$|UEAQ2X~.*SD?!ӕ(G~BVn,\W!1`s<_[_ p.#+i-Aܻuc8qD[wm̨a1Bܣ*)og:bWD}+  \~IA1Zg*IsƜ>["hCárRry%fYq<+pU5cUC};B<[DP鹯Rqquyȃs]iS?S(* |Xϗ?[kPi{o(*PX(<99c ,ĮDXK%%P|/gim,DS!8>U8bķUAAD*<轺Ԗgs{N%H|8I~56EH{AwIj.H" !\(LSfrяvק iVZj1N(ADzo: WM]eAAԋ~:t?vAsrAI&h呟 YDsk)`b9MI_.YjVC^kBfIwˎAvAԓI呯2@q 峦 [=zVn;碬J%6:'Scg1f7JJR v{%˼LYG^dWW\tF}ÊC֥\~OA^û 8xP6ΝvNx<&,9ǡCvU/c^~ف {|0ty'DŽ v0Gѥ 99iC86mq`6EQGY>Nk 7()0\y,;O_xqi"{Nþ} ۷3TV_|o S&O;v8v̎L~;D -[4ܩad^}UOuî] "Ԯ] -΁&rr]Ÿ}]ч^/ GSS|U꫁[nё˰oÌv\ǚ5 q^ĸ;aJǏ3 sWTPww1a@gM6kJ'Npp6p"?0 `:_?4.܆o ]#-MĤ??E8.?Dǎ@fX&.HCj*&N?M | ' j$',^p䈁'tL(640 .+V`LǶmb9[okv6m> 7 qY"~>xv73Lq%Np~I{p|x36kb\FMCJ ݻ:~%Cf9La Lxaѣ5i̜ɱp-?^~x;"غq1}YgiXcD /Ѿ=0l2@ׁT`P ã=[ DlRalʢ9DTQ6* h 8ݻ[Շ+lLE R,?aV:" YJn~.k S,V|;z47{$ɼ`LéSL h].s Nx\3'\?l9sıc0Mᰖ8qQǎ9'D[KvkgQ;,شIx((lغ8y:\..šCN6G^r p ٠phߊ Gj?Bq %4)۶#Gr| /d4 etl"ڴɋM8mpr~=i _~1kViض#%3 }ƑƏ"p\uÛoݻs)Vf1eCr2Ƕmt#%1 ]hHK&O(,0io%ں\j2u+ٰa.(.fX\c@RǼy"l6 NRj1,^''Cr:z1w6.dXN+0\:֮Ր.s}*_45U:ŋEmq]7:LƏ6\x! \"ʕ &yy.l` sr8u:94\qpM!]C0A9q"p}hݚc9+O GjJUAADٳ5\s i a'.)TJb'Y e=Fco@iKhVǢE,+ǣavE8K ElSw TK;!PRF]+F n$1z[\N/jx5Br9SRv IDATk !4'ҬhV]['^X]vMCA?i3A~]jJh$AAƉ ءq;⁵yx-[Zm͢߂qO%nS{k!l "\U"HbAA'@9j8hxln7Ǩw#}උt`,pba/MkUD H4'ADb8gk:u?/y^AM%kdyVy֮6gȗ @ o(?p"p "]'C똕WiV`JY^|PMi*ߑД:d@kOlW̻@&/~BP G]im639&(e2V! M+<.mv`ԅGeJdS}mz0Sc&d0:Lb׷ iN^"nm`kv3fKtb^ݐY$v&|9ć4pupnXΆR/8װl'.L;>;Z}fȝmx[m܅Ç `v#܎JSzNlrl. 6 c‰}<-TTkp58˖0Mq(-BӬ6wsc܃ssя{:lI {QR"6d847FF#Gd &ڷ7pib#+tw*+!Ǖ '1Ƽ4\\Ѿrs03X7W]Űmp8FZt"5Ubz}6|1EEv\z#t xm1le @}{N $%1|!àAvl(u0 o0s Nz&{ PUuT_H4h8bժUJr*jH ߏjlQ\lfSwhK W( z_fW|K]PW *eW.{+b!ZjK.lҁV}]>q VIPfSʲ٥M"^;2OUpӕt(b]iGL+S46EQ@ #U f+Ǎa/.Ye8ȦABz^M~,|g6Z?`=V&՞B#--Z |]8>Kڮ ڎ D#ѕk?\[Q{]4ZVsZ]l#°/y^C;Fh/)p >#U" V  zѩS't҅"XAH0cMݴ8/9ܧez*9c D~0jԨk~;N:+W믿N  m",]skw(Qc`։8ϲlD@xo.~ $k֬IYVQwihݺ5&MFؙ3g1c: sŻK#  -Bxe=D{S(A(VoDg* O Wh9&u^1o j[b̘1O=ɓ'q5 )) \s | ˗.]ÇW_#G֭[*Kt~4 *;<Aq7r^Zfb2?˔uKydÔ6e9|9;e%Lce,?Y5M~&(Q< ٦;zH $+ilϞK?)*u)ߙ)+5^4lOү&ustYS`c>Pt)$~ڷBڠR^cٕ{ɔ8~GL4/>33ROa9+d}m u(/~+R1Vs&e /\"rrs]oMr4s~OkJdۙlKx "U(qJӴ.? QY9Gqq1x L6w~ҥ3f /wO>8p j\}8묳jL5IP1ZQMALN1r$W6 "d,e(CtB^B^$ӧt5-Ӥ$89:4tt)2<.OIS"$ %?UK 8UwDS-]\\ +V>j}=Dљ++ezxW }5z&AJ۲ [lAiԙzA¹$}P'M)_W"7qJSIR7nEXwAB0=hwqz!߱dd*Kƍ޽{>1ݻӧFvv6ƌVYT-[LDzDBh?p0pP2:t`8~0 (-RI'5l!w(Sq^R1+5IIX".X$n^ÚR fXs,ÚQDc#(uS3Ua +m!ۃKfX8 k !aTQUdHR>"lX3Aױ 1$$5GtXdS?Xтm(mT21Sb' *V~.e#Hѕ{F x6ORΩ]ʵVԙt\Ѯ}-DzP댠.EҔ<슝"!$"\ٔC4NA"\RPJvE ABțԃ VxH Z'cuتK=7hqn_Y;AVV1mgiimڴ H?k, 8]jdgg[lfΜvYuMw1AAu&z>@ipG+*aꐏ;F;aZדE>7)/3dPPP3f ++w>#x^||vލ~˗/NJ+gϞj7n^y|GĦMCaҤIaRS:ÁlTTT`ԩ4Z "!?h ,p\ñIC~Xѯk`}[=ڧB lL1;겉4 0U4 Au"̙3`ddd`޼yxW|Əӧ#)) ӧOǣ>Zm9z¢E0c l#Gc=ѣGUJM.\,tg}6T {Dyfj3= j{}g__RAQڵkW U5[eeȂϬdDж$vDs&"jժUrqʕ'ADt [;=z`ڵ߿8IMHv~k:چ!:H^kf}5bWq?U8ě8'"D$V 4Z.Xj 4A Us&O$s9iM6 P\\`ӦM̌+yb1_, `;mсqjާchuhG}XbњQ^ubDADCBά:}7_} '-"_aξHO?;wp;\Ƽ itZ Ӻ@슸m2Mg)ϲ!TJ'Hye ??8\.Ap@,?6R_"Yz6 @'i){mw"k]ʹ$y&S!Y+#M<1ѡ8 .J=*ϐmlWq=de]+Jٚ7WPlPy"m!q)6[†:#8eɲ,U@B&6ʗQOeI]׫Jmص?,M-ti/G͡[A>C]Ni?ج+ĕo'n&YidrXuKߡPڹ@ICLPt_㩲1iJF@Gt)'FggKJ%w8#JR&R!땤h*YV*2]]ӥdY֘s9v*}._{*Rz{  HXJKK1}_wu?Ԛ~O7`„= Źs­8s9,'0)_Ww8]w9i֯jUz{ F6+ܠ5*& MhC3B*BE]f(W0E u.ҺA Fwމ<?~]vرcC}WѫW/!77=zٳAcժUصkuVmݎcǂs޽{SAMC{a޽i(,,ĦM0sL\xᅸ;r\gE=h@4vqe?F^^LDyy9RRR[xIS/o:v2w}7xiii{w}wܝ#">|KADW]u8PkZ9y8qyZӽ{wUՄ'?y4m*&4 ggӉl߹SN1tP՘_ piUWMWTT?HMMgM6,_ēO>Yot:p8pEaa#HzhժUs{ pD۷om۶9 nݺO>I" /Ou> 6mڄ'Ob1b/}Qjp}N?ɓѺuk8i&mڵ .DV3f@YYFzp*}zqm6?oٴߧ~_~> ^yjӭ[| ?`ɒ%5.[ ÇǗ_~I7{}C4~ IDATg̘Yf!33lh۶- > s/ܹs񈄡OO(۵^>sPX/?_n%zڴ=͟UJ=i Ѻu*:v\v8q_|1rssk^PPS˴>wGrrr<~m[Xzua}n˳sj* 4fL~~>Ǝ?NypsΑ W9KKQRR.u7 O~u8É7&EK%Kn;xb >8={V9ޢE 1:c|fjgqXv-BƎYp!ƌ0&N'+ <ؗ-.==_5.&ߖs}vU㏸⋫߿?֮]~bݰ0 0e<3M ۴iSei{⭷3kڵÒ%Kp%͙3?ٳ'>S\tE,k̖"==ڴg@IIIiωN5vtf}ݦ 1OlGmؙỦ'p8{w3T"m4uU$BwRQhCYBQw"T$"M#3{䒤I|ޯ׾3;d|~IBҥLgyS*Epp0"##q޽lyk֬ѦM.]ΝPQft:|g 2RazN'RR/JjƍtX|9 S\ߡC֭[QL/_>+Z(D+͛7Et]`}x ,,,PT)ͅz2/@խ[лwoDFFSNbӧO@ս{֭[ٳ'O9D٥WI Tƶo>4mvvvE50{l͏\zC  ."EJ*ӧ~/ϜA>}PJ*Tvvvرc|]'IkUmc@*U VVV(Wzpm۶AJ0dh?F@@accEݻwǶm 矕7/ /xtD9:9O?~<Ə-TR8tbbb0g͗ڈ2֭[ի&L`:Ç~LL \ʬVVV⢫W^KЫ0:%/_kjc({`Ffppx̙35k@e-Z64et 삲RۧObԨQ{쉓'Oinwu 2:N@ל9s_VZ(Wfiѳj֭FJJ =z$F+؊Zj֭+j.[LOWe˖PTa 5rnjPgÇy̡q*UV]bEn .ĥKR:3}vKǏUV-,,dkkkyjˊ)[ٿ=c5""Bnܸ\paNnժ<זtlS9<쮼z2sX~<P믿sΔ)S4m#Fmgg0uV17nJ_VdfҥKEO66sLm6vfqx.]ҴNQT)ݻ:>߶m4CگzwNChhz͛k~Q_>\t:͔ieTDDٿ=clٲ8t^x8ڵKbKmD?,D+ТE 3vZjy MR5kON^WeʔZǎM.]#y///M{_5s@rrbs SHlݺȎˋ6%TѹsgV~tWҥe;wCՌ1p@/__~e՘3fooÇъ/#>NjHkbZ|1b2tX޴iS+?SJWÆ 3z\ݺuŲ rέ[ŵڝ;w4m/d \R,*Tvz~$''#$$DaĈm*gO?2}[ʿJ/FiݦR))gլYÝ;w_aٲeѣ9zرc遦f___|"7onv꙲ϡ"%)ˍÐakQ^1줞#FÇ3|Ͽ c2E=pr7xC,רQʕ+#&&FzlX+)b@vډeMr X6 G°լY3M_)~*#Q 5n#eȑ#]vffl*UwXr%q!Qshn9хjJ}@[M@9gS6 7oȾbx~)FR~Qf?8F={ٳgI&ppp@ǎl2Sj/d VQg2~ڵkb2F)Pkk/4Yw]M!#Z gdROc*U_xYΐY |w~+֫g"SR|Lkkqq9E*-[Ν )fؼy3r[39Ev|UDDD)t5´fn)u4T{_iSz% G\xe632r0>g,Ξ= ___=ZԬR|GbY VY[[kj T*V~vvvbJxxx۫S ЦuVԣ4 s57hGu//HJ\~Vpa <'ODDDVXnݺQb,hڴ)vؑmA`e5,Y ~}-ʆŘ7ntҦL:UӦ\8::jR־vʯժUccNիW`\fÆ bQF?._:u࣏>2^$3\65UL]ܹpiȑ#֮] !e/މ'''H9?0o<+D Y{Ar TV ˗틾}7߄$IFÆ Em#o7o?o{Ţmb_~ 4gZ4i&]uppQC_eu0RÇQ[=iDӦMsO)O>5j/ȣWgc8 6mm۶u/d VQyzzԫEbِ^e.\byxzgiWׇzʕ+e CMZc…&.e?L:hϟǵk͛kFYп=-["..N\xxxb :e߿666pssW/o~HLL4*ߪU+矸sytƍ3k׮!,, 5j@^4 U~S۴i~ٹ@ǏGpp0J,it/ 5U}zɮm HpҤI:lfc,!#9)zUŋO(z=z=e=MQ*IL^RiߜX 2ʕCBꊩSj̎AD+222GDDDDDDT0d*Mn?^>}B r qI}_5SɳiQQQiܹ=,--QFaٲe<:˗/@Xpp0Zi#VO}#(\r*""""*0-@ zh共ơUo:Sɖ`UZgFΝ;#..{ƨQ4n•+W~z])+WիQbE|'غu+.^f:1coE\\:w/GQ|2V^ {{{+V 11DDDDDD.X bE_>f͚ ̅rfگ@X[[m۶عs}„ C푔Unܸ 6L2XhԩիW+VH"h߾X}vTZVVVy˗/#00x7nc?sulܸ֭3j;|A2(887… طo_~zDTXXX`Xft ȅ4h-ZPHM /^:A7n~79rƍ31uT,X@>22֐$ KƃxtH|ǰF"Eh"(?kРəO3O>$f^~͛7O[o.]k׮b#:v&M`q$aРA8|0;2n݂= }6t邚5kb޽zݻO? 8Y T*Q={x9J(--Y$5j֬Xׯ&MҥKk/^:N KNNEKDT <SL9ҥKjf?̙?>$I°a4_===ѰaCP͛:[lq]wH2oܸqpqqALL nݺU ]4ѲeK_s΅="ʗ$I‹/2tx`֭[$ر-[,--iM6={6nܸ$DEEa֭WXrʙloժ\d,[ 4GCܰc$''ŋ駟Ď![n?~<ÍڔQ:9tѺf͚aڵ2eJyK|'⾳3]f͚er)S`ҥ&Ϝ9#GD"E0w\ƍCϞ=ƍ/ $I*WiRjժ`ee%K @م мys4ox̉'ꊰ04k bzǏg)ܹsbyĉfĕ+W I֮]XbRG)A-[B С (S$I덞S]X裏L;V跐l8TH"޽8|}@jm^ V˗kEuZFբE /bzt֑#G 5B hԨ={۪G̜9ʕӣ*Ɉ˗/u;wΝ;CpjΝq!t 3gfϞ-FdĽ{4@^vs*WpȲ޽{ǏkUfÇN:8qɲ3fHCz >\/\0^ 5ׯ_?lݺURGd-ZH̊}11ƍkjR߿bIJ@lz^|ž={6#GZglm.\ N:Yl2vYM 2dYhWN:Mf͚aڴiW%hjcc 2իWGѢEsZ ϟG.]6fkoo/-\'In*"жm4nݺ~.Qn2tl=KKK XZԧ 9%Y>Vg@"""\4aMcǎHJJٳg`kkZjexJ@!,, ڵKsQ-PT)1jŊXbgtqW_a"ѫW/|'8vQ vF3T\٨!说)RݢE x"##oTKiɏ?(6l?\v-[ۚ`U…E0K T תU fwҥ,-[;w6Yf/ϰ}V))=s5[5uĉiۋسg7f\YXXV*2p?<C/e.X?'9t{:gBDD[ԯJNNѣGE\2ooo q9s~M3ԫW/ ~A4o\M4 믳J*N:ѣG^xR(RHM77We 4'իWǼyдiuzlVEDD>VF)گ /)(={}oCSEXSNGp9xyyb%M]<|"UUM4aOe5;t F;)E3JuIxzz͛i>&::0eի1 5%2q>88X3B+-GI7]_Oz)saÆzJ7o6*`fΜ)j,0f̘[Ppa$&&"22o&ƏQS=Jy E}N# yÇr5mŋ-ޗXFT}}}y eziRQM7XZZıx7`[f>Tم }[(nX'"""e*U}.\-[V,\Rz?^Z;ƍFu@j~@jkRDue5Su֥>J(i"IׯsMRdvvQ?gv_gϞ 3dYF:uĶft7JLX믿LnSV-:uj TT(I$_}}={l@A= `vآO$$#6)FǒE lH+䄧1OwYƓ'Tљ}kUDDDDS)nC}Gvu?C,k׮]C.]ĺ3gH-jN Q5uϓY˗,Yb1WWoUToݺg豛7o$Ib=zX6ѱyf|,B CPPTI4P͈h.ճgOhRңQ=;ŲW4V^X>x sԩFܿ:M33,,,aaKKK*^oUYYY!%Eoi-oY[Gwww~3)5#bҥbyСF 6u&L>>TTPAg'Oo!K.$ 7ƹsO3GZreϝ;$I3J9f^ZzBà-[IJzR ubܸqg@رc!I&jb٨[.*T1S;cnTpaoaK K֬sL $IҤ)ujׯkkkԨQCqpp$Iرcf)))X6l]E|ԩ YѫW/M]@@f|7"@; RJBY dY4u:hɓ'cرRӰԩIHѣY\5jN ɲ~  BΝ1|p2d;w$Iux^$Ix뭷 Iʗ/y#F@$O믿e˖?pvY׷o_H?P^ %<<-Z@;;,PFhRXeTȑ#QHI_ߑх!I+HRed~TRF _~iwhdڒ%K@գΈ2|qoiKK+qժU}ŋGN!C`ܸqbӶm{!%%%cqܹ;w.6l؀K.^CB駟8%vZD)K$IEeDGG ݻwǘ1c`ii%\r#F#GPD >sX#(_fO?Ŷmی1FhL<#Ga޽Rg~U҆ǍO>EN4ž*5(K=:uӧOGifcǎ _|!_ٳ-[s*""""|ĉb&ESpI\~?{˗۷5#(Ufp!ٓA.99 :]bܪUsǥK`ժU(U$-Zzaժbs΢ukXXHܹN~ FfcT\ z} Z`ǎ~ݷ$ŋ4ٽ{7ڷoY֣Eصk9,--бc޽[y{{>_,Og$""""ʧƎc̙3(\0"""Phї/'ԬY 7f'PIgV`HYu1rH9sݻw 5]"44qQFHHHStRȲ(+f/oii'~Νurrݻw[ouN:?~ ;;;Ȳ [[[<~X!24mM4Att4Ο? UpdQ>WNxxxEy.PEDCAe^+7'xf;=+w탮ذ~}KQƎ FB (<<}8ޏrKs6m5B9sŋ?<.ŋ׼G yoQZfgիcWPn]X[Y卾Ua(JJJ7""""Ȳ >ut z9wn-[aq&u:DFE!htElիh׮կK@6__ys_y*tIIXrQnf9`6nڄ/p9|4}:Llネ6!Qî_`wEBo֚{{{a3}`Q>O#%%; GiS/.իL:UlhB5jD*. nʔ)(S,0o\}Oi;;;cժ;w*T?O?ڵSdlܸ kWS5\rT2?III3}ƚUDDDDDDD^G>ErfoƖ-M)! bEEܗ!htɋv^Fnmvm*fXfu|"""""""ʧz=*`A<#mT#3]a^GJ,,,,9,-9ZVaiii}s}k*"*dY$I""""*1zIDATb@HRKsqT$/IRط9׷& VYXXŋx$S$ XXW""""*yS$R--,Q'OC]z(Y4,,nF2"SxfMmۜ[S#]/Q666 g1i"ʓdYFJJ ^$(foN!"""xGNdլ([yx <:[^diibQ %Pض066l*x> stream xڍVnF}WcRs\ HIZE]IJ&BqUr'3)GheK3CJPATA OΒ(   ?GR,IAR˕$ I%瞔QQْ"]NGjR%i_p<#JK2ʓ6d,K9Yd`?h%G WT APiX* /P "ohΐCEZbE p, kV<ܐ!Bc{$.=8`E6y *C)V SY|S-p΅Vnk7,- qQH$g c(!pw," \ "J0, (VP-|x8<<{hpW70ldዕPr\! p idR\<+ݤb TFʖ $,&}5F 7%We'⸓((Rz5]^uq ͛իO\װd;Y6m#@짰kSlcTu!6tvrDn:mjVkjRs`}9W͎c}ADO-"P~D6ڰo&I랋 8 r\S.TIቃ.6YsoVcKrjBDkL#c-fW ܆%}}:C!3RЧ*>-A3e m K0cW.Ջr!Xϐ9 H[uڰ.֟]b uj6!oT 0ɝmApM?j KdK3 L7c< jt>qX?OҜ sƣL[<3=Fax͍(pK\bKKOD72!~Me&6Un p9u 9pgm9`>7tmP6o8+=؏r~J_#ꋒL endstream endobj 349 0 obj << /Length 382 /Filter /FlateDecode >> stream xmRn0s) R"P&(8  `[;,"_3<զ4b2 -avs4.D ȼM7]"`4y>\:؜pwenjR\|6Zk6npf{Dq'6F՛)THJ^eXֺ^XQyc endstream endobj 345 0 obj << /Type /XObject /Subtype /Image /Width 1308 /Height 971 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 358 0 R /Length 287232 /Filter /FlateDecode >> stream x|e_ ߓ@i0zH""DC  z(Xiͼٙ&&>>|>>,cT3NxB!B!t@#"¹CPÆ yi ,IF 6n@q&J6i$HЩ`cggA&..Nn3םtwz'I^Nz\҇+'o2'@67P6/k `2 "(*&f h"۴Yl0nd΍ܦdL,YL\X8ɨx1L6!ds%G [dK57نklVyv-ڶ7١e;َvj݁غcbm:un+٥m`;vw*ECnI v%FHv'{v>ՋћLJJvշ[ou#TO%sA>ӓЋO$<D&L7e!4g%?a}~O|!J8l ~~p!_|Ap #rG/=EFH%'SɗhˎȱdG<_}-߲~;|i rx$rM|ɒO~){T7*;qoNϝ\ˏϹ^L.#אKf,%f$Wtzɕ+/7|&j粫7Wv$ef}!K~|7[ XU+_m@~6ipVµH339˷B(:^)!(x='CrA BPzb 6K_𗉿d/%++Z {@z3|wΡwZdz ~JoKTz O~^"[> >#BD&E2G>HJJV?'Zt r//(B/@„*²E\FX Z "qDK'i1k򲋖c2oNT.%-9(-Q+-i.- JqUAi1NsyNyyOy]@yA yAyW1ºF\ k%5_U2M+5Tie'^Vpr֒#&_ҚT^V^ҚW^ +WUu~uާ1 J~FP0<-( $ >C>C>,C#qBca$#ihl#pġ&#"#%5#ai%] nLum-II.OOҘi(i($iT)0i) syNvy Oyyl+C@* 䚠s'ARP-C]#7>ArQɭD$Vbg ))O3S "NU;\YA BRPrERQu٨Qir㴁A"p2V4u#FO Pac&M4(L'lCI*]Kul$]GcRO3I/ނ*}N'Ws޲J]H@A#5n*CK qK w!!TJOH`Qf^:x%a8>&HFMB`K3#VZ#[GlSj4-2XjȎA&h쬱2)XlW-!fvl)l(CcOւaԶ!{ oGd3 F !UZ&&_ KT2V\|-.EvnZPAhurŤZgZLg&TA*4KסZjW^#i[@9$Ph "C4,(|;ai,$̆L Jw|Ň^i4rE~a!(JFv)BqvJXa-芃^0X5BNԣnanˣt͆\f NV!)fy`QWP7QGt敔]f9*5jҎN =U)ÐNBgC7wF 6TnV)lv(>΍Ju1Ӆ*XҭJRIG/3=HoLAO\ҋ[ҵI}H@A~'5 (-pBfA=17rhc R\xI[(F;(UNڼ,tbB֩O<u<3EjUIY'O;t0[hj45M{m< MFSԵ]ԺH6x~㨆t"yB[C^=jϮr8;JR=,۵LL_A2H!1HүTOAc`KzZI hM}tlF as%oFis[_?=J_k5 "^cBM-̨QZFZt$R0ʲVu cYqlf;+p;H[624FaٱW—k]x'O Qw«e“e൲XEi/jyZQ4o*:4KסZʷ֬C"C AuG2|7)cɖfMDgucHcNy\8lXkik>Bff-*Qre.Dx+G["HNV:KcRv+8j@meG wEgtadY񮋻֝^ks>Ι/>g߬j*FShjx9kN-D}זsMO4ޡgܳ7W.e獺y3gOՁhj45M]#~կo2QO>h>ΪMꢲw/N~rӟ'dǏ|1a^z2zXFҚvsww-CУL=ed=UzK;ۺ~>eꯣg~6 gI/ IrCl3T2(G26 &#|ul76#%CeaFa85 <֚\ax j$i,Hns-tl6Z0V[ѵd`Ej;ݚqa /G{y{{r޳U?^gQSU0TNt 0e'N~4L5y=rFS4>Ū;'-.$.`,ŵ[k:+ΊFPgdXjWyeKסvj֬#t (B;.{L; T {Lc!ytdhJz7NY򁢭J(T:VFziQiL^Zٶ M2A ݦ(Dx+ƷHNڼү0R0SȺ ̲@Oh\7 77W77qפ8EUGm'}vTѨG<0rDiOw9{&>%O۵,0 /45MFSC/;4* maL|#KoZxzyLڎW&^~a͆& gŇ}]p赩/kWw߮UL9x;MFSԪY-u5jjw=xm-a_nڔɇw@fg_Q K x5ӽT/A//2[JO]}|mL_I/3Џ`ER%dрR} 6,X!\_AZCOp3-?76I i0Q^1:FhY)gf67`HYf6n F V1e.c]z _V{yzFEGӏ}yhZ s̿_!JS}iX9EyCQ|2B4J9ihu!.u"Z\\[\[]k haE#,TAVV׿jZ]˗960eXH<:u4%KYԩ~#I[!kZq[xm`84&2n2ڗ,ԄeVbĴQd)-f^jڔkԸY5P'h 6.\j` <[U65[Z{[g}4fʔFGk򸐧Chj45M P|}45,.Ͽ4<".(UhxCxDإK7jJ}E/hL,,3Y[MFSkLS+\MjSPWwU%Lr52!~}N$&n&۷z%}bHtom=eUؤ{KG?3}mWZuZkZ*Gmn WZܶ~anc_kHb,R67\kmF(MA-F`J52yHT X{ԽM7LKU{;={ymsh| ZY[n5 ފ[ eXӼ*m^Qul])Vjm`I;LDzeVE'CIns*Af:\tAoFQhj>[T;MT6׼Լ̴-)TMk::lS?>ƾ\'Vo_>xK. QFShj45z"c"JΞ^s^f ?O?ŷm&E=O/-;gӕsrJ1hjFSը7nh;}YMwf';EY ¯{YmaAR}5}M3lWz d@m ] RC*AΡjp4,gSJ 60eɠpFT1[-䶎`HCt4kޛߺ?Moxc̹ UӃ{]jn۶o߾W Gݻs޵k C7{UFޒV4e\kVbGb*LT"-F|-m\lfHqbe SmF\qI?|4|)O\V,;Y >ۗ?CC y@ʀO6rZڤ#?|ϧ={vmA45MMMnVYΦSJW]ywkWGW?[ڗ/e`~APQ6H`H5 -I2 7PLjT2]AiZ E ֌.SfLBU/]qƑR~K֭[.f摩/>w2>~/:We7]{&W0C]v%%8a /\~}^< M駟;fhBŻf%bՙ͡j:ky11Iy9lT8͞!4h4I2|lZ0\e_3c[%Uĩl7Jrnc"e6|\.MM:5i-ˌނƍGhj45MwVbZFE >W}BY£C|=<<>^ޞ<â A4C9}Yt]]X;gH>&iNiOx MFS;XSkߜ]zZ-WjRFR||bu/Ped+ (@+kd`i(A4,UR)Z4 1 13H2PZ6Uj(ae .EoYoI{zz^y. < РOQ(C.ӔsV΁6]A4ke-!C+b]y]t&C+J\_3l(sLbm>~۶mgϞ?~֭%^&T{)>xe[ytGiӦ ֭],99NwЁWnS>g`ܸq/^NHH M6tڬm>k׮!!!&LXtiN>~Z_1bΝ;ݾ}K/T棣|z˳f͢ӓ'OO*>lٲ' |5 j֧'N<wر 7hFNjժr`0ٓN_V׮]K'6o<oNgee)7y?7GGG%hSWNS/V:]M? Ï5j͚5t3F{.22gΜ9 . 4iŋ cBSGTNSSnݺիEEE]tpZZ:TWtt͛=K/io}Æ W\E1 ׯW&G׳gO@^trr2ֽi30mڴK.37um+R}Ujբ@Żux4]lM X45jgS7k e,MP}:ҁ:22eC5w# .d>Bi|=,c5uԫZkϮ_~?~;/(9Aw>?'TM]7kׯN0禙׮]ۗb 45C7uC45Aw#**,]@AIBᝑUϿ_hF p~T0DS82̧%Z͛7ia@Shj!ԷѪݛ EFFm|ѡ"~W`TYrҠ|bwBFS881NsPJgeJؗezSxU!M MM鑷/OLnߵ=00븪b7 !DSԶ7uLL^yyo~W^Ѣe 77sfKxMquuM0&,X&_qt]OܽgwR$wwI9{r]:zwVZҪ{[ticb-m!M P:BS/[LhXuSZ*iDHhg~t?`He:?)_k{t>7t통 gΞ9l0>q&Ow`s?glV{[tsfֽB45:6qSj˿\>a.I]7̛ce31%<.߭{O> Zw`0(rܝ|bpp;֝[Nmr rm!M P:xS+]zEXX6TOMקo͚ib(ýV]|ELDWWWy:QtZTE{!ʝUcE֛hj4uU5ukV[;zᒅ7Wng +M@sV \CBCeoFĦֽ-TwBM-Re Ahjqqqq8xoڲ:4;7ͩoAvqqٙts(L,T~uZSd~I6tC&5ΦVURJnCyVJS5 XGnow}9s!hTꨂ2=zpww.>?::: 0`rf|CWT[)xVb 6s rv6w\;ZyWuoK9+ݻ !Meۖmg?,,쓥ޕݾ}{~O)MmoSY>5VNHHX|مK/YNm4\./].M@M֌jVUP:PS'!5ԁFGG6S'N4xPLL 6uBhCs s ѢVck\S@;t0Ik׭-_@S M]th뮭oxsبaCG V/7}i֍viov~`8r@U+_@]a Woiy{{gN3Fnj'O =wvcXjj~S)32N:s zIE|/㹋훩O~}G̍,tM4jj777S Csߗg-o+W`0`64unaQ(o!ŇwN>do9uTCfeٸ\͛7+vtuIv~6.SS}j4u5hm¼#9{m@mnjsnUn^i nyNi&445XjhjjfS_|Cs;s|/̸qLhV4C45;PS7oM M|?LhVhj`;hj@uo[nݰ Tn6 _~㺝@5u-+Ԕ׮_S  XGhAKn5uv^vv~n;[:bS߼;i&7-[8vj455_:jCrW,[{n;iMk,nS߸yRNi&ׯ_vڂ hje˖hjjOS*ZAcݿdlnhj@7u)9N.ܶS 06S;e2O 6u۶mȦJ-N)l>i릒s%.9[B7a42z5]238$xҔIhjKLglcS{9KMo`l3 2ց~S5T) շcԇ~8T}і-ΜR6uFfƉS' 4ښe6̙7'o_W_elnPݴ`ѱJtE4KMǽ6N{hjgU-:QZ=Kc>w^&wԶn׮nS*+̛6eبaCG V/wM[8|Ƥ^=~HWЬ(-5udT亍ߧR*EnnnwxǟypH0]fhjcX*c/22c16Y}25Wz2@UC@M^G,9Yr3)ǟC)L*;nZ| HWoNZjjZT,&6fG,???_¾-\00qĢEԔhj(?#{=/xq~3{/j-clc__nrWB+; (i&|n3wo~%)-=rN(~i45`>/n%Qkƶ۩DV4u»ܐ)7u~aϛzGΎW''OfMM}0>5Or3=X16gcG抿{+c;ŠދgPuPƢ!ЖV,-[n٪1.^n:eS(CS@Ek/c}%SZML:Wl"<45ݦސ?_-y2#}87ח_gPI$3փnue,.uf)26L޾kf' tՉI!M Fc,ƢK+;|T^5E-R}'jjSwQHzVTb(l!hj45Tx1k&ڔqfkygݿG1/jiw+Շ;*6i<ʂ245j77Fl{Sc3hj45T=bA1Ryn1}C% yMݩS'Mb-[PbϞ3[/ ԪVvIݒݓ&ɑ/9yظXէ͘k=;/cbG)oMACFS;>Y<uN,GS|ч4,???m&^lV;k73 &_'Z#__ܼg~mW445hj45VyI,k-[Vަvj%  ܝr rڽgjbHhH<:uV45hj45ܥ=P۩;'Ԕ&ӷOfMuW7iNk/{-+r M !M Pq(cQS+wnպ豣.Y~z݌սM@#j+oޖ M !ZgΟ9w+d c6c4uM--//UkWy䋹ikjlSd~IcYjӮMyaN2G GSCMx<&yOȞjpu䦮R\#^ ľߪ}KΕx~Jsd۹XLTYܴWQ|f!hZ~~~?]\PT0z螽{"^ DSe*Qs-l$E4E}m}ߨoPM hǻ$uM=yaaa܊xMU}MjǬd+[[|7C݂24uyy؋DSAjzbڟoRoΰow턿D֛`][ߜQÆ ayBYffdfdnܑ9DSAijG替+x ^cHuM5RS)32N:s 啊?m7o,9Wfj(J!'M UShYm#|󷶾q545p7M[;l0 Toy[{¹u_;uTѭhj45#rm1k*8Z"N}ASwRS 13hCPϛn7223JΕ&WޜvVIŇ[hjpZno^vW]/5X45EM]|hngΟE֦6v lPIM~D1] ݊FSʬ69h}8]'@@Si[nݨ h>:woscT9k.]J-d-3n{':)/x[>*t+5hj0ML[n*>Zu[nhjPM}uԻ v)qϼt;]._=َt1+AףgCգ  Xڸ~Y<5e5$Z]S553^K=.wX45%M}kׯ/RSړOr%R ,֝[CCC)ﶝ*[U(FSAuhjfwY,P <#FݳoxMK>]FS;7oqXo7?1V錥t,NgYo1豣_n|bvnvnnn7;/ȥZ6ٝ-=kRΞicbu/)%`LXL5wE|tW7r/_ԋ.XͿM jSY]뇅knTK=~x֮ljہ?& @S MhjPuM}߯rvh>֛zG~.\=cԶtqJM,+MMF㱍7iKiVM8xMG%;h +MMѷ} OL>esCnXK8saÇioeټu/Iy8tW4?22R豣]:ePʌ3> q?US2k,:񒏣n753=[#bȑ#.]:djg:*MS򒓓.׌wX45=MM+Ək׾Ui MsW)y! NCgYiK^_:MSllꠠܽt"0?001#~g ~(;CCCSc]t>Vܮ]t?r5u`P =yM_#G.jݺ>e>}c4 C}7Թ?<$e#:4Mk:;;[NM.xAl\6|th/I}ݡc777//UkWY5yiz_jŇiwJ.}dT[GY[w֬ h s~uYijKf|ArvvV4];vȏ3g'ojֽ^n FSGjjռM2Uu߉;hmڴ|^-&v M M -ї/JSC45ԈfY]>W:yԩ711Q>$8f`t%a~_$ݳP\r~Ka.y5o7Խ{ꉦUԗ~tYhjP~մYgF’=EEv*jjeP3kM]KPP)Tîi*ESZ.](9_b445M jGS3 #GQVSc}?`OEDUI/R+vMmO}~5w>ǁ1Mݫw/45>wܩ惦FSAijdu^N?>11NSPf!|5_@H QlKd ,mk^JESZ%gK惦FSAmjj9Mn'$''SMJJJjtܜ *?YnPDUaN x }Ԡ T)Yĩ%JОhj455M.7xeק| ۶m[ff&KիW?W itT=>s?U?ƞ`^@8DSO4F>-5unaQèІMM-,WL=vXсu_;uM]M}sϭ\M I'()۵kf͚˗t8Rݤe$KAmiV`(G3 c~7j<;vEfN[nՍ7bM}q;=z{WYobIE;yLԱ㧏'N=y$܅ss/\ xYK'W._2uNAΦmY]G.m6:zҥ#GJ!ҥ]++k/~t_.cQ:vȅ'>dtmm4=/:bS*+̛6eبaCG RSoFfƺ(nBx^n]qnwp?Y,|uH5ݮ];+|#򧨩͛GM'27 ߊ@ec- ,=ebI+8w{UT7;Icucl2ħ Y3)f-< . >Z:idN'&=|dɹ3@X^Ovτ~464c745pZӧS51#~sUFPׄsk&M?)ћ:-Ԯvelc ƟC+f)l,fukK6UTﺷ|p5p7u^l1g.:MYmMxsFEE9G4/hј &''7!T:6/ner1cCvw[ʘC]%fժ4% =:;#6/.~*)IVVy^5MbScYEhjPZgO>IAqnݺ=M%x17G#wx-K4Ԡz5ujハÎy_bc))GEY7LSSϛ7N+l|QEs7@MIb1S볙XlaS5g+ˎg3|tkP/[{Էq/[g7GXjiX4_jnŦN#bNzJS:DJajɿꥶv:+ebYN[!ӽYquG\ź~lYQfx%9 w^~fߎ^va݇;s?ݗw9DSϜ9F~}M hjPݚ'O18K7qv`h.ԄԠ&4 (~458@u=Y0mڥ3=:z^zyp wm.,;.^[.K ,N|TɾfJj4a'X Ov&ƚ}w(cϋ5u u/Or:O8FǍLG.!7MՆ#9&>ljyBS&H'1:ojJTYq]!Sz1c3 Xa :g:II ci ;?EY^w_N@Mݯ?45MM#wǦ̌kl1fnʤKM4諥?s1nnG߭֬]ֽTy6W9J9kKwx,ʒuٌe\F4hԒ{l0?y2OxegY(j 4Ԟ Fի!~YJ2Fcs}f Ei̾vaF/KPGxt.7ݟcYBV6O _NMmwii} qY>))^{{hy_PƢ.~ؒp(%ox KUރf_JWT'd~1/;Sl$-z ^a;ӄX+^M;޽}|?KՆ:MG!cpOPweY=Sϧ`KC2&%=5~z?A2,m;݄UxɌQBP}YLx_ UZxy@ЩǣBMg'h0e1Aӣxgg?Xu|-7$Zn~S{_ڵk .T :uXϜ9JM]`.#=^zEhj45M3'jiii[l_|ұsTEXx*kbV؜tK.%tR}ߤ8cXFYէF [ 7-\ޅ'6B\'%u t߰.xX `0c2v;?\u.Na)2Ys Ò\YZWqq\jӢѥIK{aHCCfh\ g*c>($%#>8/gXl#7mȇ>a!t(^IIܹ6554%Az(*N_rtftZy?^ ijOpSggg;]ƖO_zuO=M-~ᇭg?JM_q捛nңǎFS4$g[3j@ƣ]dffn۶m„ K.:u*AjOOOJlZ Xj{ٖG٩T=GRRKpD>ɌCQM|UW|j עYJsO_\jvP2%չ}˗ׯW~#vSS>V 5<.lN6)iz|AםxL$|_G:G*pvbbXS̨B5͉D_]R2zovlu{1ag9/?ihwؗC'bYXj?yoE>[ 5II`0 3'β3c4k":.KM 'HuR@`Z3GnDc3u2ƳR5cĬvMYW -} *AMͳ`0h2qFݺu+yVשS˃j,?o&ңFS&kGydT|GSSYO>|pe9266711o^x1WfGPg)Vzg<0; TFAbwUcCbaFYܠƂUAp%` v5޻X s>wvsw&#d&(t,rn 7QM?H5Ձǁ:ܭ *! KO>?C( I(Klm3QJ7d+JH,u~4iQ}yQ.lni QMQ:4tPHA(-qܜ)*;+]V,Uβ*z^5(JQ8vΔVέ+z-_GLo.,\Q|ȮG^VpݢEs竭ՂqSưrK:卡?cڿd~&8{to귑Ç䳬_uVFLMM۷ 3߮]~#VJeAS/?%#㕘Zbj$?0_\_ʫT!0yĶm*J}%?rf}{m^>NYgWЗ3 B T*;3%0Y㷙:Uy}.ۉ|TC\d7QSWzP"J~~T*MXAQhM3d/&,*U M8K>HsmE1dѢg+F[NV)!.:z/Ú4bj2RdZ(\ m^,j ߝB<3745>cbt;Cv-1q۶KOݭ۔ӗ_%11ǧ4MPzEdj.JQR}&%{7˧ְ5&` y5ܮhW.B`W^q¹8{{,Un=J}S&iVMk#c%k5ޗ#ܵ[6>}J%:=<\R3@l&ąP(Z:s;oID':`v4oJ}M춼_hp`DYPP&uPd'J{#ru 32Nx>ux]šJ7iI*BU8Y;E-/$zA|IQ=0(IVO}(ؔKZ3KǍ`lQ`bŊUL]SN@]SlhhԫW_rtt>YxQ%+7nܬY͛7?~wrpzJ+pɊ>S~tSKV$ETNo3OMG,Yr*>O6#ŧn=֪խÇk' dcE@>B.^;K4ʝt4gdrO3ghiV7y0u{\nTM 'in~Q_lfe5h֞mFgx٭PTW ^mTRǸ\ <7\_(aZ└dYLiMgbjH8[6X0A; II n7SK&1?dufҒMj3hPBZA4d}T\gyy ny |"2ߗ9L[#o(/VZ(r@oqhWV^Ckߌ(\$n CQ ETT 4CBjggo&Xhz rvvZ]RQKHYQ&ņvHܚ^<*y-Y`¤qQ Ǘ|~VB@3Ǚ)edJL <47&4aG:Mn|l]RΝS<4lڈF'9Ln50wT <dJ#OvVZk4uMV)Cd5T(.3`['"y4wzT1 L%nƔk!^ 3&^h ]N%}%i%-H2ux`jr={8h.QO7Թ>}:w\gg?Q0|𴴴'OA_<ӏhr o߽05O>O`L#㕘Zbj$dtLL nժUbbرc {i-QܴpvA˖Çɫ^i4&AvNiCrj=YU6V $9 .An7vʲeW'6FJ3K 4Z  U 3cjQ(xA(.pPyC^ *Z U&ծ> 88 :kTu(VuOֱPTg_P#F0 lvvDVƒw(dlP=m_{'*Ytz|,rblxd2Weϻ~2=%;mP*H(jˇY(PFʹ%yZOtʐb@(Ḑqed^Jn 4NM(Pg&a<6ɰ5ae*tRNv3~@7'(]wœkT 2Q~ͤ9#[zܸq=B}VOM+˗/ zȂnFFF7o@LM&G4޺sbŊG7%LbOOg\޻wo]PՕ,7id̠AZX[D\ׯ?t)AMld\Ψd-c"r:H5YcyTBpʼ>ZzW~>)*/hSh7ڢ_Ɓ+ ڃJxPrte0tN誂eLPˡle> 0kp %Y\X'iʰ ]W|DJ@.aQU:K96J)۩T&o^:QxniҌy(q-(3&d"KTQB9곾x ;g.UhAJ2jq,M e#];:-v̫Ֆ˭Z\dfApwduFJp֯>lͤAV ϊ>S߸qAfff֭[544$@ӅF+W/^I#㕘Zbj$~i -g{MZVΜ9 6fBAY_,Gq1c&[X5=r댲X)+B=ucY[~{6az:_eBZtUM(tdppZZ* tEAD~!vL"ZiW`7X <"Wii4ruٯ,sT ‘Ґ9x)}ph~6$ug[@.w +Ue2b 'HBAhlEZpP`j/p Ufc,|Z`W4jEy+Сd*]v,Z[g#X6p:?$VEȚ2t Qx%-/J_oԅF2gj$LOD#_x&Wf谡G8у9da鲥דP52`qɻvZ㎙42^%LbOF:&&fҥ'O'=vش ʮR )YT*/_' t.#$dUM>s6@Zwoϼ}{u܎* Tjup>@t$÷5p -ϟǯ#PrdVM.7hW]ѿTZ{K/ըQµ>3Sh.7ߺsrVx%Z2%&ܦM΄w=p@m۶={M"""Ν~zZ_3&gѬ5 Vd HINNgX cuxUh@TU`.F6̇RU[ j,{dG3{= QB9 F|&rǂ)L\:i6|6 ńஂ["G3,"g{EC/({ks47%?k_M|. Qgδŝݻ5rk؏d"Ґ87cQ|7oݹsPB0%pߗ.1w4sdw\shFT77S?CJZnaQ$.=JRXa0'Ոt>llnd&M.,B_`,O! X=+v"n2[^J޻uɍC>9g|P_+,N&RVb|ԫ{ rdACRbV M &X{,^&A7GXXͦUiUk5+#t~Hl{扶&Xh5Fhܒ{-BCeu= Ic <Pmcd7Iv!BZo7S*=)yKwv/J>=SK&_=$\m7I(ʂz_]y}UU}{JL-1dE@ kZu˗&pݶma[/N80u߾} J׭[={vrrڵkONLW!6&%Yh !vO6gz (ʺl$I1eqv:rcɊiZ*x{ %zjoBeor u:c*60 U09ą+E!eKڠ5лT-B33ǝ=}8^EVHzp7|FQ #2"өe\Yk}X:mdApJU Riz#=\XLVZ'$ ~楑aXªuMϭq7oΘ˝e 0F]>3OZ [,e16zbۖ:e{tב,șô2[]46gf-5j 溝;4<${CaBo^p骪e9ΘF #\;& n AȏD(Sg$+OWƵo]Hccpw''W:vt#X%PaW-̰!&D1PէqTr&ATzTYՇH{!٫Ԓ:~ͻ7?-h ߑ?mߡ=F}7=u;tJ.M֯Ԯ|{7vSK&1ԝ-,o d#ݤVO2aܹsnjӪU.]TReر&OO~v~ppzuIq!֟`wLT*&V8na8 6c{x+Գ8"c9jW̏/(jXD<]z*`LBxZ?yۋ)@!րhL<W~8dYa RJ"$Lh$ ` Zr12o[mG[wTdЄ" jV&ul 3}';ߌ,p½P{R֞&<˃\FUBV8H%/M4qVSe’"<\TT8qt.C`l X$Q,TY=dEgJX[g5ܰ.6.S&>S.Lr#SeӦM]WĪR֮^ʽ42^2j%LbO7onccSJRwL1">>+;}3geF: 4p<;?'<٥n:#kˁ~x0i'N(yDO` V1~hWAk[bV3h%}!P2!zM3LdJbx[lo|vɘYEpU%5v2&D<4Ȣc4KӸ#i~].:C:O)ֱ=U& ,(۽vv#RP8h@FvE`Mk9?POgXPX9U;82qs<~?^4$'QSԳ}@'#Mqqb[.fW5"g~9 0 0 )H1`*ѸՊyb!(,sθ 8색L[;ǃ&Xe ޸ek-1,SŖEb~űʄ.<ȜP;P2 h7aҪfBbbmc8)T|SѯHxzK|*!1~S߿CcvAbO8]wOϹ})ShdO'>zSKVL9HL6ӄ>pu֑)))[l9pV%OΝ۬Y3S/A~u;hd\>qc3]:aqojfG%77@nŒo q+p"m\lTOdkl_ܮpl KdC,4ڎau7VɽY~SvNi~Jջדo nq=dGTN*^cCMZ v%ݖTGdj%A89 STȽv?8vlĉѩ B&W%jiCx2 AgjCen@L-[5^:+jrՅ g ~9kxE.KŰ2 5g>ZUk*\UmT(ɆZ`%V:GtS8Ǚ&lsnBi@N;m^ۼθusE!A>v~1"տئE*.+B~I[ڔDbL/$aX(P?uGȂjҢcY5l t錈hgHfKG/T^m8=,̰zvV7g0{8L uע-SGFᅮ߉fOZ[[뗿U,X3MLL[۷o7hРXbӦM+x sɊS]{.;zuۍtϡ=dZ2%?u-Pe˖v9s͛77nbŊaÆOvjV*諩Yq#ꆑkXlB3챱UiQkDԋ JW^>յUVɿ+Wdɫ֭K p}Ν;S(-WVR/ {>'C^⸟alS]J39Lзٿ,ө冉 3Y Yca':kxLVcE%(S&֔7) & &x_]1(umӖjƂ6혽:u 9j 9&i&"ϓcn8wj|8M0nϿVO?"UBMys2(],.6Kp.Y"! Z`K?5yW:Vj+b+(2/cHmq嵞s6ԉ?dԀ.@bKqk +oo8 b83 _c8چPb=St.µrn*xE]2WS֙[+8Z úl5P4r7c( 1CgL]0|,eHn,5p!E߯K'-^;+Bnk APm~Wn9}չs!Q[aU-,OtU4@*â;ʡweG E`tϽk-WW9Yrײ ,QwnwZ-s7@u/jFu]!~Ĕ ?́x Wbu ug"C5KLtџpӎK>#ŝ(s,P|xR;]`!XeJ'x!*Sv̌49jyFz1Ex;hM;u7.8H5}bk r {AWv4ŢRۀPwQbӲZ}|L] YGro|yyy/ݼy3..M6K~ /dŋd߹dSKMbj$S0#qF={4iY?vX0o޼UV_`5Df|~/eU-qj[Z=Y+9}d3.-y)6ʠ]]Nڿtu`GZ+D3ŗ> LGID;ۧVsԢhBe ?b=pLeCږy-6hܑ]87ù& _y=|>.,3V #$(Gu#;k*jxE5D8DfLa}C*OW+ 7Z4?3&˝4 3%8z a&-FAe#kC[ spnԔ.r'_?9gDL06%d' w7`XM(cM^K0s'(- rq쁫BnRϒ^{AlxBĒgmFŠvCEcLL;tnصan]Ԥzs&7Lww=z4*Y,QXBLx3"֖s?J:1&28?ƙ8#S^iJ)@kƆPD[Z%y6jaGv>sV~7unLO{`F LZH!i ej]y!9y"aۇNEʼ"Jn1_2&tMd'>HZ?v#@cfX Pq%nLJI!'gp 4-r4C/N/r8==T=Cuaqq7 l6 6:;`5#', (Ј!-2 -"\Enb것Yҽh}%&I=_o8'Zb3S 6,:|p^^^dd ٧Ow2;7LbjIL-dSSLݤI-[9r֭X~%Ku6mڴ1c4o޼nݺM6ꫯ֬YC6!?,SVWamLXA'Zdk3:'!?3Bx4|Cc)bR(Mm$ -1*\bQ>42;}8f/l%:]r<Øʴ10A.8q?|qaN$8DwoeUK7"eL!e&IL-5%ZbڶmۡCjzҥk߾~hѢ 6L>}ƌ]tIgִiO|jNKA`N^]l#ZnXhuɿ<Ⱥ8:/ϺZ?2&l!n4LWL}Հnԡ簂PkZz4zyv|Sbi, >7D#=Tz'zl &g3*ӹ}q\}$.v,}VҪ+0@%r jbWN1RMו>943VK/WJܔz`x1D67e5݁6 W(kT]p$}vBRj.DAiG] $xlu6"z-.ʡ2EGd*VHy?g< $Q <pw&F#(ihS")v(>&1 6ݨpݬSbDcROJ)1/ ̺-DWNZ\WIt>pF;vk Wb_Rcm4~ELjŷlcejX:[S;688 QZX$ؑgϞ-[dggY[[1N6߰O07zNb7Ml?`ҳaKo:8Zwܷ@z: +! lP9`+exukQ(cD| }y*}PpS9@t 5 CaPϝMQ% Rl Vr1DS0P * :f]]$9ܵF?QK\8H1UkG!jfyKV)5sQ'\8iPRE6Oi1bKUxq"&vm|ہ1 u 4bm1Q5 ~P{LejXcm,S25={ipwwwgg~qsL2hР .L>]$}S3 Fwݹ]3,ZÅjSX=+^6]ݶ!V`QjH.4jH>q@@ϸ+M)9hɝ''(<Ž7EP _Jj+uNx׬qu˄.=0vdZ,q֨oew"ڞ)Pu`IywJLrʿS?}/ڲXXfejYc_4) ,YrܹW=66wlmZV$aW?ٴi ߲S] 9.hc [͍qjdn-(ߋ% '2m&r݀#p넊x>#]Lbp)3GGYq)d##qՌHH uRle҇7cpOh$$c&(%7-%)CpzsepfRLRƞ\ĝ!X-zhb.U|\j8$Ks>\]>@A;=D+Or'4p!\ 7Tt;C2W)zP$Ǝzt"sbHBrW<W]d'. (ep/sA*jMmUGۥ&OI)XgwV7G b!H qH >R 5 e; TR){$s0[1xG5EWj=zvU{ eJBJX-IVuB@ =f)H!J q@kJ6c"^o6YfejXf_2.]zرӧdggYIkOu/0:::...**̌Fo^Jz* amoMqa*.J#Օ۝Iε`ۘ<ҍ8KhϮ8u`3~g714.Sfh(:ͣ(~:; ' S /P>Fri; !3f^P_ZrXĄ2w8f *4psL 6?J{Zqp?2wpB\F5"^9Wy 2+ :Ԑ}Esu)?%^eFBCYѝv pV{0^;ծvz;S1A~4,;z#1c "g6_R=+po*pw1m9এ8/ܾƤȱּhWݻ>_5Ҹulk]m9 BìW(0*KRϙz5E >m,)L25ԬKBP,SWީS+VL2%iJgϞmjj~EKcccCBBڵkNeOHGQ}• ۫G8Ć-ḽvUR&}dU*e`"aV  F/ xWt1 oNs׸mu ^$=pFTR&pr..az8G1 6\$oPVXFiZoA%eYf5Y^xYY[[[id>~x||[{Ν;|y}˱߿۳ȼ=[ϸ_0N ^cۧV}{S4UE[9ϯ{*yMKJoʇ |fp%kcmq3PeqHC!QO12V-x>aiS/WUC0A WE(Vr^$A_ݏu+.\|c8x!$kdN`Ac]Zء՝ׅS5rivVJh<C)ur'6:#~.4x#w.Cdn8"uQ~U[[}"&EګjeGwg?jv'^^ϵ35Q]t.^8 Ir^*w1w} K.K 8j 긢r t)R;qbr]ʹ7#ySueyzL;Hמ޺ oU>qqO[1h[$A}~W`4~=~SFEK,SL25k,SLًI^~= Α۷o_dsĉ{xxycH% 墂X-b*/m.tFp_g8$ Q pfOA`a?B~ʢ b.΄j[4;oEe;E0(6IG4mB&i@,rF_R:f=|&9Ԕ$*[ͭI/=1I6ٞX(q,>#\|w,*VbE yʤQû˦ Oj6vظ34w13x̓*D=)/>)6)eq.~}RceoFmk!Q!6cCc7">n"q>o,)L25ԬL'L$S|qKKKHy漼ȳucP…xG|oބ:  Cm /Yvru@m(k ~2kzo>)o"O`2Ljx%Z39$0I^_eb䙙ukBfb}0S^omI4Yz{Eow)|XRfejYce?b̙3333SSS322h^b 4e[[['%%9;;ebŤ'GnJ6PoȤ6)DQ-|]ڄǁZV~kt|]qKgo& b|á)7Q;9ɫ38jNʓCx,we#f|[l{ "xޏ<</pƑ@}bCkRTUɂ*衹?!tQIJ?Ӥ M. $oꉋ]Ϻt*Fb1NT<z/ʠ6pqL'.b+md21p"{^&7a1d7Vȑ&upy~I*D!3*Jo**TCl\]Nf(p퍄)3D!֠))(#p0@ljUQ1I.u 7927sOv㧃 {RUs-]u]sV:4,ph/>)%J$h&?==iLL8ٛH* V1eaaM>nF֘L25ԬL2M[[ёf]vzyy͞=F'Ndee]v֭aNN!!!n%}b;˽zY^I ^no'`1XHy +!ztǽ1|wUv+E| Aؓ]'33rUk:5hAӝjLRmFe\p{gww'U4 DzJ4ւ!t3_=" P:\;ԓb JW>5/uwwCu'jÛ(DS+oPV C7B9ʡG ϣ Fu_o(݆< /mB?0sgd`yE9^&ƶ{n\Uߺ[mdgcJƕԄp8%XfejXf@3љ3gh9rsZZ'OIҥKi| ̬#-^x0Gj%55j9<3b8C>«To@AwYފU2OHn'Mgqo]0VW&9 Lp y:yM7*FMB͹WA&d7 xlx8o7` <>xx(Wைt=S._&E&ķfV Qw"V٫h2>BAi:)`1kW4-""];}Ma x;H^ШizsMEBzF\v0uVpw͗4^T!]F6(64"׻PԫtKTzwhNky&3S 0 #=N.|_SBz\#LM{TR9۪r7/nd`>8 W-{Z@&FI!En F4ؗ0Slb̸NU$k_1S >֢/E7n|͝wҒ^_z//3/h,~P|><2mAse]6Άm! ??)=ϖ%eYf5Y7CCË/^vȑ#WXaee0d}!3 ܴiMߓ&Mb-SXefˆvÑ-J5첤XyQ0 !dSZ 3 <]n|<~ZKYT:G y4ok   (n?vue#8a%I0{{UZJOKxa̻3E zݛubє .YƽI~twi\,ո2 ]qD.r,A^3׺22h!Ip?1Hw M &I;)l T2k3{f:?q,SS]o^^բhRnnYz~Y~jn;o?sSXfejXfcٳE"Hu"##?EQ~Czxzzܹe/e#1ڎ|T3m".|sPd5<.㕨݀ x5@\牗VC~Xk7ykJEўT>(LmD( ZD€7~tLgzG]CHx[Ze=s挣vrȓ'g;7 FX=8=/7d(Y9hݿe0c0 ixj؎xYѭ)YZ/[=pR-Rƒp.2yf}ͣ_T\ϊ~t@5ˡ׃-D&D /ƣj$.*ۧa RU<䉾5Y<@ j"8 4lj:p:?ݪ9wn{ڟԷܺQt#0?l w Xe5XȈf;vڮY&...88x׮]4\;;;ӝfff3--=h֎9v7_%"z^f[*9ITqM!hm,3#\qkΧ!2%np.;KsVX2Qﯛ׭1Kةk!V^^eShD< EuKo;W}4xGl~C37F o璐r )6Sp@ ؠ$y4w/oz%u fR<} I7i| ѫ9BVD;%$$1'>&Y3sP]vaSqCŮ&15wgw5uˮ'ڄ6McU&"3S^f1K(d5>ʕ+[nˣ[AAA,&MYd7;/4K~5olq,@/LG+\u#qp٩$eL#T %EXb7(+t kRyh#3-޳`);Ҍmx/1^X a,1d -ا*)m\ w%&(yO$ysVhUxd(DdCo#իkva m0NէP8"KvX^ZZp' 'Z? fjMB7 En4"8V 7i3I-(.qTe`. 7>JbNG,`gDkE&r&kVEdp ܖՄLaɻv{U]|lfH‰Ct1>n'`pUTv8:a*[q;ko+{>0A:F9"Bł})Zjdc"|U{ژi_%1sNıLLnߌ|ښogO޽G#۷ooݤѸ%zόk=~t:tkO?ŵu!CZ;y\tҜI6T;'{ de$<{ϢeejXZ[ԣayϞ=4PӘAA<==ϟ?cǎ1c=o޼'NЬM`fffdd/͒_[!CdTqۈI3ZdL`?^-@Rl jOCdX[]bWJ9;9 Gi? %wg^pkS6`GIA*q}X3eE] %85hى7rGm z&xƈh%]P19qH\ﮠfAB1OGh4GeqFf|llȜCXARVrBPA;h46\'N ΑBIUb@SV a|sHApU&7Ss2r6@PSUIrN0@Pf= JTLb)\@_fe7"IIb9W5PE2FRiYOπ |.:KÔ:B'k2cYى3'H{K9S(q!?OiP7 YW5Ԭ245o8#33sҥ48'''^zށfj]]]?=gΜoy^ZAW2 jIw1NYd1ԉƮvIx&/lži@bɇO7̺mAnkmٖJxi7՞r$*Dl V |3v .@'@$#Dv;؝(C||­ pK$!#L -e re;Hjs,U#J[5 UI ɶLM('5X2*◘/b/7(O4rVsKPA R:e}pCr8kCbEJ8Ńvĩ1Rӭ/ilC:3kc]D G)Y9ͨ{M%#5wQN`*D{sHǢ0uܳN)-^-7:xvuد -VUS UGE$6ѫp?/'A6.>oW߇|&;'+DPW cfL0H{K9SGF|e^Yceʴi|lW$%%͞=̙3^^^W\蔔iNHHy?0uxLO?'== ,Sg6iҤ lٲ&n333GGǭ['&&}3Zia 6,/S^4\Ĺ!g u q] K<j{RN":[>ou'wl$@Z+AZBs<@Yt 9y\7TuLtukJS>u;K : aJ8~JpܾV$B8-}2r l/;tkbvK; / c2Mc@99og;k4ooy6Y-vjA{29Kspcf{eQG4bEppRSڝݠ" $ }=sMZ}^/c2\<\%??Cˇ?CL25ڿKu/y &CBBbccׯ_ꌦ_vSǏqss;r7꺿bjCw(*99lk=B "s]Ĵ@ZVm kP҉OOKN+C:ҲLde n9½8 ,do6@2^H%0Q \$)\$^UӮ|0kZa/ze397A-Bb?P˄3 KJ7pc\֦^6%Tr֔Ȝ.ݼ5q;T.gf:kpjb6X4R:f}"Pv|7 &R]U'`gBvwaae: ^F q# -B9xE .)RD;n 8 ?ٽt)^`_Nc""s!  hPI;C9f3] >q.%4g>bI<QU# Y rnS"$d#\6(J`2/}; V3z_חJ}_X7_?}/ڲXXsJbejg5Nϑի###.^@㳋=k.__͛7Le˖ov^~Qɶ/t4F}߱Ɉ9PN* ӈZbwųYވ&y\O w NʦLJ~G>*AwʈetiU[' >"|?x4w,yDt:HKQƗ[>d/Y\|.>Px>½Uh9apLN#YdrZ^M>bdH#0(FV{<;xa' .x'Rt`Ah)KPi!rEO=4BIx)@R ݭU!B_u>{@OYK35[>o~4z(YfXc+4[[[SSSMMMijΎ޸|rlllTT ntwf_՟' LλD:$ٙ&ߵBYZ}9A"a4m"ie[Pi( a#ed8X;ZmAr tJ2PGC2r`A?QSÔpeb927΄dj"~ݰH87$ XM< c`Eu鲧s:6wS\ea ģ(l_@"@&ݣE{Ƣa9%|!7_mxITَ\?︉gP׃樍b*`EK,Ҽ=)~k Ԅ \̒n+GQBpG<nOҰcy;QiıNY;41M #Kaf2cYf525k,SLxY%K=<#YX?4y#L3cDlx/fA@{λ"SY6VM"h c,x#{n*@NdRáhUG{4gVg,A($ʙuRjU>S,~bP9!yschc=Ԭc-7NaߧCL25_ܹs 4>[[[Yfر4Y={s޼y.\q{ݺuSv^AI f1=l@XZZDQ P "v)#/i~0p^4#ށa11hu̅př[ 62 Y}Pan xۓc] tn ܰMja9NkOTz,;T{5;Z/uz Ǐ=/3J; QQIPk%1boLeHWw&p5mQR":("nE⚺d$44I*R)ͥҜݧ={Y{{}'fajFLMo 'i]f;:: ˋ/?~<m777҄]\\lmm)qoy b'=^g1VM'W-TGDjbY 5:Mv=lc}Is{" v?1,Ӆ >ݬف60ӀK ; m'Vo50#. PJ2miȽd3m [5 ($=pHrlS{lZPb\ 8Z[ (~5 hԝGlÞ뱯7"b$8Է(yR,ہHqXo`"[LYz"\iᣍ׺(5ݐg\en`NmƦց92A㋽RՄ镼Ud'g^ HD-ic@ nJS1S %Q1 TV_tYvBO!Y)NJѺ$u 5f\CGk,[r9l1ʺ`/PB74QO>ی배~a:)+uui=*5"&2eUCZ?UXYamoܸQYYYDDo߾j70WÇ֖_+-3f Lmfn> S3#/S!tLyĈԁzzzVՍ'ͽMݹsַ<.-W`j"N2Thu)$Q,j3Yޓ= +_[ dCΣ 9>MN!gnw18,#mgPbٱ j6ޞqcL=27U2615P6XȂd`.7x8?>0mYkW)#9DQ}F7="MQXq_F!+vm;PlRuCɋH렱›q[g@ -h}:::`u||#G_۵[߾ℬq&@ob!'=  %evl.(X\6IO | +[0-vàOW%HC}aflI'~s#rCl6`([%۪0 'J X &ghQ*:BITo2z7T3}l fHH%:۽$z)UەLa>Ǻ,M7 !|\ ~&`)3;dl<7V6XaјkRgDxOO~2UKLY~ >SʎF{^iOy#p_C+q5&lgY،C6i!JyL|sD!ӄ|!%g+c#2f_o25# Sa~PSL!o߾<ꪦ&,,|֭_>p@2ѣGÆ # *++_|gvݽ{qRҥK&LMN>]TTtڴiuuuG]\\LMFr}SWK`P S2))f-Figg|y2)>qℏOXXʊ̭! (oT~/v !ga -z x0 d:Y?WnjntDvk6my@]:tM&PV)}z qs8x:]D扟t&th L8HH4\fN!p{F$NIRT\ ײWD .jʟC-one[nfǛ5qJ SE^oPT؛cWhUgm lYStjI/>>kk,6;z0'MC A9\Y뫅7Q vw".3Uk GӽJ/Pev TkrB.S5%];QLUEEzA~Zm?&&&:88L:k~Vpzdp1&pFaa!xώ=DQUUճgΣ2jy_WBbajfba.ԫVڲeKppsLMM)v^wwws=:k֬ .go2WmZ)ް͕N G

G-tӫT"kFyV4!T 0cSF2wOϗ˼,Q/pHJ<Saax[eY6}WzUfLL_e/ԩSd޽{ɫ͛===n5X'{&_ sA?852AmQuF&R'rVE]^6hzxm~1bX(vN' DYSm1WAmux#u¥!k6%{sKA-9G5M&uKCE$lEzxJⁱy<\eVtNe^ (\Oә1cP6 S˄rgch!kJ اc(l7uH-3ЬtCܖďG98) |zSp!%awZ^^붷|1b]ppϿD6eϮӝxy?gꚺʚʿfaɌ3###}||bcc _oݺ555{RRRlhrA#v=Я:X ZO,6a#Yp7Paw:GF)T@I憭mO_ޔ%2Dмeq:A6ܣ6,Xk~w?Q,lWgP~[,^YO,._N#z>{p&?F[K#zVhb"*Ere/d K>&;TLUin((Z|VÖ@졇5s)K! EVF|qfˌ ³TQg->Z 89y*L'/WحВ,԰O3q72zy;tPnn.9nΒd⮫۰aßbm۶9sf?;r>xxx3a5K!M1L053m1g$2eoS>xի1P S'''ٳLSeL܏ `8V z0懊P %2 c"y엱ү |pdu­\"s l.ff) ~ODbO1/ quަ-e4OHϐi FSdAH?ICxƊ z[: 7RJ=$oah^|&CTLIJ6eM?aRݛ=)w|2' c`ޣW$,T(ټN]Smd 姧<83pZ4x k`7t)OF =&I`2VVGqK#:j74m9ub9JCoً x7rRYo{#ˠƚcIWj-.xj{@'52pu.yQ%ǰY nR8ڢq˜RGMO#Cl*;'gLdb4,EEg.g#U9(A*.yʆ/ S:v4i A.++2e ѣukkC߽{w?̥ȤYoѪ*r9aagee1Lo))f-Fj"--MfR ggDSSSPݻϝ;w}vvv'%g},}emVEpc$6uiR Ċ!Fu&P3?r\O6.n1 \74(''St}S)҈0ZWcpI)6֧F؂O{ 8B]Nޜb(QF/cVW׏92rcwK;M&=Q6FyhقV1AIH16fPV!J9lSP7IxpWXA5`wM.qu^znD]&oT{jPU^ l?D}PRv/[;/LgdBu,f:MENf)N\"hnϝ_ۊMI*N")q R ݪ7٨|Y4KZawoOoy^wGOCui"<EQt0 "{j(wD/ /6@ZI͗Ga|y>߁- ztmF:z6SwYgK!M1L053m10u9I,^|՝;w~Μwȑ}NJJzljZ+&fJY 4p YŰѢG4gpt0RA Pe\d&Ƽob&{WFQT|1 _qPiJ|Q1{0B=Gވj)7MNu6[cR *!l屔=E ŃI:8 xH^ߣpni:={GU?\6qItkUgebʈB:|Z6@a2w$%KDs.AI8zpYP'nQ Ϻ?N㑇)ˁ*]r0Ng'um5 p%ܔmj .aw3L0?K+JʊBbajfbk37E٣нk}snڴIZZz9-fͲ8x𠱱qXXWC+Ku K7ݧ9(AO\`?wo:֡YcM~U:̇o  `I8[l-\MsQ x$I9bg̛cltA8O8?S!4RNpJ ;ʽ x2TzM-z6 M82|kzh%i_@ #cѥވ=Q8J?/J_T9{H\=⃅;iQJ#s)G3D e.Gꇀ?Q03xs WquOR ;uqOutp6bj]$wN Yh^X#WxF)_/5=[5mܪsȼ &WH*(!*ԘxPa-S/y }[DQCF2Zxx6koJDYJT7;if 1U݅z S3LObj^(MɛH S3L# Sw5NZZ.s888ܻwўG!dLlvuuZz(EosP~%I'!@GO\aEs@RcY{!x6sLXqQZX-YV&ҝué'UՆhY}*to:أih%" qWR}lm+wt=ݚ,Z w={6,2/Q }h^0+8"}qϢW5x(jf4\b=^D4XF4!g;/=ʾCE͖W6MEyaB_G)ݙ, *FQG>t,2P{Qˣsؖwʑh/JuԬ%[!rE90V6A*4\꼲c?놢Q|Ǖ^p؂+sn7 7~*:D Ƿw V{ϖGFe q/ KO9?Սq\(ɵ@\4]s2<{S `R6Hӵ׺j!a&'cfS?zYX\&?,Ļ 2L# Sw5߿3gRSSnG֭[=rqq صkو{ɷ9(/W[ zu `ܽi53gJn"Gs^E(d]tWh't'o@*Gkr"6cCo:N]$2Wc"xA`$ ڟw'&[?ùel@p{!ʷxlS룰'+9!|"T$P5cM[;ӟ#m|}°j5L@9+ƕcDn5!xxuL#uվu/ qE =STDZ0qBg7ۘrH,-BFTGlۆזx9v4-L^yоW idPo5`+"ʽxxx8lr!r߈!ڄ~B~P'*y:<{ 't*Fb* Q]=]SGӎҐ.*2̩~^9uo!$ a!vWK}~3# SԻb S?~|78=+/r:i4E`ajFa Pl1dpysp~~~߿OvΚ5 W1<]3wtF'V8\WƲTϺ7Oa6uQ aP\/!v̸uR|o !E #=W*Fχ"j82F'e(M,J{NM}WKn8&`g.o);Cd>6M~Ψ=>MZ[Rtmh Ƈ"IQ|l jQ:5K><OKv>\dV/hPYQX9f2ڳ*z<)-'WR$NCB8EWQr4qq3W-Hސ^cYGN uڡ_^uggܛɫ!x]x;H x RI0Le`,Ԍ0`ϪĔİ0^(/ $/r:i$!%4/Ԍ0҅+x100077?|O||&W?Oˉ' bs@]]]Ԡ50 ]v{6m 96 L?L>OowvUT-@27fhPZ& y ~~,Q?\:ZҨ;uq7^qo#]p%xѐ'X߷T>bE J( }lf 9Rr# (iN[J89MYbo^g(.#ODAp@ l6S^|Ff&SSgO3e4BbhajfbH7{%KǏ/_|jϝ!߿{nppҥKy<A頠 \Z_?-GJwj=!(ІEXEm%cH|348p}QjfeuRe$WTA9+f5:)4š%Fצ:0InvVYUlCiZCG͙Pz=ӕz5u5P۝}{<.}8,ƲGw59]K}#?4k;Gen0[s>eP+=1E %/ >\'za0DώRfݺdoh E:65~6/7HɿV'&J mc|l3q< RIN0zfAwC`xs(R`i4F}d @:d`mYۣa6SEO.:)1d!WCխx x iH+4z2g` ydlf2Ϣ r+ʭsQъCt po]" $j*Z"#ƣiݶ.+C ڮ{ԯArOZ@&`cvȐD&5 @[qS%i,-I@ $Ê@=P {,4HF墸e2JȴX ňMETT*]T#7Kjk=򮉗$C6¹6|Q u2>qTC;yxg[Q+axW;?ĉr=eQٓqfr?*[x-bixG y ut+R$8j tckֹUN]I,E5AM7 ?n}ԛ\~̀JN*ѹ([rkhsCքR.;Ǧ;p,R" <}ʄېnvfy8&Ϩ,wCfTDބ|n}wC \rľ+HS=XhkhX0ʨYQ@2"p/JZꁗ~j5Q:x;YLJ|\GrhlT=%_?\stX!XB T@&FAuSߕ後6й9NUT9D?jþPqr?m+O3P5K✡>b٤^ob3jVvE++z=w1H>K|[#Bf*x1E,Cl*WaooDL <|=B0aS X >}ݿСCb4^($) ia^aa.%Νrww'c޲e,|3uӧO?x!ҩdpY83|CX<9ȫ?qj? }9*s2Pр bA_\,x3]z+VyvEUa n7EzϬR)껩nSMsCMkԥJS^ E mUhhE-Ja$ھ{lhh(#lN >Æ9ti={ S{{{1a_o% "L5'v."kI#92mϣZWY:nD8 |$8/WFT ?1u#}/c[6b]>uԿʔGsd@vټP9Ɏ7?Hv=>NXa@圪DRց`uix~#HvFcﺵUe&_؃HVggmÒs纣\_mjxzm!'g%K[8#2~o绖xLo 3ѡbFY|/j4i!m0 t`Cgp}KDO-w>fJ2~@u7zqq)M<)TdeX]beWL>'vI;ә/eQxhG9'\& % E/#_JFatܓv}rDFSBLmDN8A4 ݻ8::~~[]]=e_&jjj·n<}rrrO>ׯΜ93""l͝;a2O?t|[ iaji۱yYOO… ۶mK51;ӧ/_޺uʷ9( ~"pSWHXa3&piv¹ܟ*!xx1 R}Yua*k}.O|͗Nء9ˬx4?O='TG索sA%mś"LeRvTEy_A~| @q*Z14\Kډ(,}<03/tG'~D1-de 8=aHYa\/A}:-~N^,!kE\B2})"k,uKQ1v2(WG\)PQȝx~ $Ƚ0E b4А),u>Kyx!HP :ag}w5;m+Iu& Jt;cnodE̳oRz[rT0 g!֩e7}_A#+c ^ٱh}ƚZCTA2+,cW{@ m`Fxi/bS:#ekꩿիLf͚fj2755&Xy7lkLv;wEuttH7ܽ!Lcf3iE(7n܈!s=!kz˗r[ b& >bĈo6or&%S)|YΩ5{35ڄhO ܳxS_E^jPQΞ?]l=ق6Lj-Y}d-r j^2lf>qȼlTj)|[n>_SAc "P9kPOtHO'QU4Q< uDRGJ8mѭ7Ga, |XxBjGp^;Nx[z"AS5P=#RÅ)EmhLELN(J>`1 t.Lrd9!_4껒i&ZpiK35ׅ72ێ*|^aH7+hE[-+Z[(ֶ\pΖN6C eOi"8FiixȂ+տ;k3Կdz2 kkk~H  Ե?۩\QQA6!F%iӦqrgl;>vo S3# Sw5QQQ!LHZ[[;99?~a֭/_նG&$0/'dc 6Q ŭ*x5%Kل`wϹY ji {=Zp;lINaҙ:5 Uhxw} V N|K-]Ç'p4DNgmΞw^-!Vk%o s?ƾLᢁ[[ҀxOě ^(] p8z_:=?X,FYȵ{ga>/i%*vRiJE{ I{JRJ"YC %Q!?woncǙ|Ι3s罹F >gC#dx2v)6ȇ>$wr+}t^SOM֎0~)TB6R@QM =o2. t,uѦzWDFq"QNRטK^vPk&p=P0͑* "5b~*·ܤb׸'k#Z߄T<9YYwEɳ;m~HWL#DEX;GQkr®k 䢱OE[QHU {L>9%3e"ӞL{f?b@Yq+(Y+TajFS;v vpt`~1m>}jK_b^) ǶL_cd|%% faj1L{xxL6-$$pϟOLL633#M!&LSsR~'ҵ#p@,{nnx)bǔy<;g!ZMCM7dM|LWCqQ"-cu1wF b2)tDA^C'ñkH@%3aZ~;idŶ )W}vvEhԍƃ!LM7cTT]f8kܵG"^" r4q Vr6]MپgMW#fݓH @UM&e)]jE"G4il V4$ * )!cL[L7 5jenYsU^c|` >O?7I<4$xXW4a&B#^OGtx՜I̔u]ٗF5h\I`3]N3e>pJ[hIÁB2YzLHm)P4m%ݿkQN?SZEEŶeYY6qCCWVV~KKKBYYט-1 FRa2Fbajňa&##v&>>>Sigieef9'7mmTo{}L35C wNkNE5|z!PP? W{~6vy ]me|S/f#wUUՖ-[ڹ¢=,lBH}mllZ[[W^5^vmssիWIol-0`@NN_dM^p/i㦍P S3L͜ul:vuum^t)gɓ'ݻLX;!!!((())?-P [ھ̑uȪ$Nx6ҧ){ )W'x~n bP>Cl#a!!no+LSrbJ1dt/<1g4.Qs+K1lU>Tȟnp˫p{֤D< A2F!mٜjs&Y4[WD0ZƁwUy]n*Fa4Pxo~bEqJ4n$*x&4fb'|.{Ő gxq= 3uBm\H KO"o?c>sNS68dЖnzǩGy]Lk]c\cS_᱙FVFMЉݭg1.W~ʠ.ߔ4n^˨3M3s#f.r@--sQnqc C h!Bx]à FuIV27 ՄuMM3PuQ:2잍r;Q~,i-2|8?|\c_s.[rS#G?~|eeeʶ,dRRRf7opSUU%t5~ tF'NA'M0טL?7]Ȉ/'ajf0uGcsss777Z>>>۶m[fMڵkڊ_8w\ H6Xfmmi!LOMM^ L9A56cujX +L5A1]JJ̰(|7ޜh琉ʩ{(15eϵC+V؁l'+WꙪє!mGI }*Or0ˆvʵ>txQ@{k}kSgl}WG$VpqV2+N=la#} SHigj6v/η7Efl?>S;PL͈aj[[5sPO6틝aj#; Vر#"""111))i…JJJvvvo߾M{֭K.{nttOԿ֖[LmaKH\ojioaSǥ3ḍMea(ʈDBݱYk ڤ+A gyϯiBdMQ1 +R.tFȚ.|ڿ}Dbux0pa../9˰wWbO~ )kΓpQQBQl'x,^)ףd|t[ː&(_H:;w$Q%ݠe8'<%=\]wǕB xpG^ e`c<ܥqӢ>Ȗ=Qk8ʢݒC}:VIBL G)P i\Sy<+6%Muw c&*_F>>|JQ4 FBGUl,4l¹Je$f$-PjY 0}qe^Y(Ն,?aby)ZIr90uXT:;??f1uKkKcS3`u& 05iM 5ť9r$U'|||G>x ڷo_@@@BB)秜˳*Qdpx-V"_/s*0)ԈS J_N[s~{שD*\#0.lȳe=/~xGP~Q`M%~D;$==lt"B99JJnаsAu;W g""S:wqFk{˾;yrfqe=n~VsSԩSֳf9m1+ohݺuw ۳g͹s猸\MMMB}|JէN6m9#_ {ùLmx7H:#e8jߙ:(%R殸Ȉ Ϗc8bTt޳O:x:d_l1j.!`_wCĆ`HY^N>5s&ǻ4ʄFSIGduFc/"B3EQ4 K*J>hBr,P}* y3܋*]%q $D{W戝C>vd Uܛؠ؁(O/P.#.j aAUQlDdxEVL8'Qfcn"6P[xBo%Q!@!X0YiUQ=` UQWfn$P.Цj ^Ig `["\`Mw 钏r>Ȉ/;`Ubк;f15uo<<ۙƭIaj-Ny%???xNNN 0{j'n[_N9gsoSv-Y8+X;\~O=\Y/ b$ 8m)gJA6~٠X^?.uBQ,ѵSVfL7#pSk>~…  M:ܥZmĆܹsF_'-N_ejeަ֧?Ta5j"WUz*1uMoثk6j_ #ѐ[MB$VxdLE,^k#~HE=hs /4H1&=!ii|DҺ~m 05iM"*440u@@@HHȬYO~---vvvQQQXs眑!v/qWB<|b2t1+c IIm)la֢0e^\=q-38 SټDRᦀ10UƖ3V ŝ< `8Ui7p q`JnHçwrÚc rpD/Þߔ)3PNh(XUVU<&Pc.RTE<*( DHdZWI9?^>MXe:N P 5sj"i-ʡ x{RiJ^>r= {)6ba. obQ pU³5uEV8h~>(U@׀'>xEkДXϻ#i8, 4`VXBaF*I沢[M5)Q΃zr^3uo`/yRgB~9t=;;S;tfյn{}H#C1L05sbԱg{L6-55566*88ٶmSgΜt &LfjӞr$O = ;nw&mS>4}M!#1J~@R멸>MNR Bh<_\aI Z/e ߻, ?ZG ,1›PTd"O+7>hWxǐ3NU;pc(Pup2fD<**VPgwűNتH8Q.yy C:ulLgI?Z)hԧRa$G52p:W??n.CUx):[0IAzHÏTI pJEQ?MhriHSQ'UINS-qԨù/8jmQBfKPG_]^:F"ہzԌ~4,,Gaj#;tǎ7o 9ydPPh__hщ=<<۷o޼o>EEş{5v7^[>I&P17RYm (2,nB!~2Ԧ\ T*:;`l%Pz7qA.7D*$a a{Ԯ;76֋h#5Y 89D g܆-[μ6_knS旅|gvm iV^=x?nxʩx|iXv7Np \G*`ʷ#B]}ETWgl/1T;`'f.+ xm pK.(F&Ǵ;%[U6GP0Ui3zwڏ.(Ay\Vaܞ?"\1zTMQȤZ]Q&bpN9#[kċW$GxUo:x l* 7*>8 Svhp.5iCiuC TyN&YE_~DE~:SL=h/Ԍ~H.H#C1L05sb0uG 7n'$$xyyܹ{С6#5Y{{sA*%IJEpЦ]t|}/#zǮ SnŊÇ:HYYٷ;|zՕ+WlOeeeH#C1L05sb0u֭[ \\\Gh:88Ν;߿zy/y眑֖[#!qwxq=S\:ˢy>ų>AQ*AF`1(Y؀1 r&xrSewC9=դ$!65S CД;Ӱv3Q9x Ө|k}BV\CҜo"\$7*&CQPNw#@y^ІpJהK{Y@'-1f#5si\_{;Etts/N2mG , { [Z8(ݒWmBPv`z?٣jw@KUr W y0G%R }r26=>5z Kak:7]5X4+${YW seD5S@\g!mލÌBOgh}81_f]m2{NVLJxh܅a'`|U(t,M]vsR# G d@rD 3 c0T-jcLR=s'p="r UʗXDh#[ 5Gz_VkDs/gUOVi)6GYc4W^E.vwY@C][(wU8HލRoo6yW駭N=3Cv4A\h jl"qѸY8#|+b~6Ac"آ|A36,Eh95~VLWg{.0SH?e&@-#8x0L!ZEwٍ.;;5Afmm?Q [eee{#+:8,e˂Ȁ S3L͈G 8;99ݽ{۷n kt\rҤII={3ajgڧw$~>bL*2SJc%w~1v8rWv!<4 uQxz% C"KGΘ,%`xO9LQNξYy0sS ˝xqEK*M^EF3$YGf8'Lm@D!b0E5Nz->Ԥ#X=5hPJtI⟖aMƣghaө(Q@x a8;ó+e>FWAV<է(l_W ZqK=lb,פ@"#*֓ݞamFC}PmݩPC1w(>q7WM"İb쨥¸6 W҃p@ w+',#q%FQy8*+,lP.DJZb,% G1*:pX ԛU7$6{L-Ma/_j>}888|ߛ3gΈ>m(((xB޽8r[G?w0`@||r̘1dXUU Ǐ"W jluL(эٙŅ/F|I|a^1b‚ e˖3KRRҍ7Νd AT.sXFS9%Dzvq S;lH^uZ'')ґÀr(rd3wizS٬s,8OTZJw,Mob9?< x ,gCs6I\2f}[tF %Qr3C;ejy `; A@eDjQ K |lH%zDl{IL%a({ur3Fhp' ]>Cn"qt4Q> C`/[ Ez`W+n GR^rD^xY9$L׉7Wwi&u[ ;a<_]Җ-("wFLxs4?YFY<7mQ'!N j\]g^Kr'د #%۝'a0WI1?L<W(55*++Z*$$$==s]hѻwN8AV+((ඔi&|k׮}mGy]C``F^`SZZZȅ… !i^k׮1㧏 ^PTPT\y9 E`ajF ܼy;|}}ã#'O>'6ysFF+ŋڃ( ~gtlڡ׌.^xpA DE?Lq7EHmƼTNSP3Ϗ˧ǡ,6{q3TPM$b^N,ը\dz*>:!{ >8!y=c Ͱ/Yx_mat5e\ؔm(5HѢ8rkrf±#-@Is Mi(J E sDknj+N 7q-"` ɞ#G~3bNh13<(U P<{zr`,Mv^^\M{ a<)˾8)2Ǩ`lQ1u{ʲtΘ݆۠[QQANӧO֭?}$W r,Gq:|m#SSǏ2e BbhajŨw|wH򲲲0`ɓ' 5GFFFGG$%%mݺUIIѣ&M"W\iiߩ+Y5 4qz`؏{\[=CP /MzQΠ7Vݠ]qef) p!#cڨ&v.kLtju>Qlfc֏FM*r=ps=5Rf+Z0SHym{`sn;)?sاƸ3zHazG3ֲ%DzᄏG ;p Lہxnصaۄ{p ~+:f˳2<7ެ넪x;a w 2 W#Po/.Uw V5*=x^sCx66:{igo;mqo%QDʡh/EV< U A {7>YW!ByTh*n*Ntz'#"}T^aqJYCnHܳ1b,.Un(>D /|܎w`х2R.ZPSꃩqZ Nr'ʥoѷ1bLGcjύ?aKKd;c~,Դ69oܸ144ɓ',Sw?geee ɿ6ΏLcajF S222HHH lccCoܸ ea(=Uq ok4+ z2lgصtZ Vi|BbRSd>X"ߧU3i]Pmj1k%Hd#?L|ע(U' 槜?{:SqaSGܹ3//teeșXcǎZmeispEE_ۻwσ۟h& S3ajp32Ilmm \߹s'((h'N GNd7otqqY'7mx?6仏`k}/9cr#/DA"m b!Mv6_{m=gx큖'ȈlA.7󡑖N*̰]F2أ-(:yp #uҪI^j)L ޽MT ̪=׫FI#P~T*{!?5{sXoCj:vfٻ5>=)n6 o7$!"5l- )]-Eg_l"*}Y*9- Y9yLrFIL_4ﻻp0eqB(r텏UpqVTx>TdWRkdC8rEkeY=KT)<3Xl~ҝxvd&`!0nC_q8BC?6. 4Ƈ<^C3NQ);.to ύNpP_y?Fi{C!Ga8HDZѸp'Sz6vM1uX-v jxO嫉u0L *>05Ԍ~2~uvLٷ… Po޼yŊgΜ|YرvR~Ӆ=7k4A|f&-Q0^rȋ&t"01D8)so?;,WKbn yi|1bgs^󲇁7#~_Cǫr1#9SՋj . sb^qO}1=peÔ^zh\f {OH1/lhpl9xo:2I(&ͶҰCZ];O0_ێ"HJxP56vR~棒"8@=abor ZjC?"9SEihS4h"SgP1J0.A>^Յáh؇HrTbwKxLe5Im^nloG  \%ߚ$(ԟ3faj1L05#E222rpp6u5S Jmll>|ECCÉ#tttϹZt)_R{07kRqeIjx8a"վOoL=.% `$X,ECgj7sd O<^%HFfqj7I"c\4`$^) `.U&jbzP{~rά  jйI#T+dF)J ۢ^'t&4xnH!/'Q&<18k/zzǘsc*D^D&\](}49IMyAVѮ/% }/6IH+kXyPPӆiB\4FLo\[d0V(g u 98Ivև%զ Jw!irjI3i8S25(^ԾarKܜ^KYpx [?G]H4\[ B|iK5s@Lajf S3b$ssԫXq'(~߾ni tBw0+&L 0e_}C. ۛkb9rb \Mji 9ꌑ/ рBCo~5o`2¢vJ?H+<R&N4-'kqՔWťN(sPuۨѩ+GUM-kY{'V1OkMEޛS٦aW4]iN\Jh iV4pDe*4D3J i|}W<9~w}헽|Z߅s?_ gCj@P0[>E V?.zEdhDxaqa5uiwN[]پC~4^ W:*{iU`<D Fg8|G)"}0 ~:r4Bxs٘ܧgVgVM{S/YRRN%[|8 VȑrS`ja*Tىn<!j r.pO(I$Vb0ME~#9Z(K5SG)܊XڗaL~FASj[·8bal\;>S zRؽmx+jd|u @Mz)FE]JMg92]Hk9S *eXFomiI׆׏6yKk,c j({^%qxp:+_ _핑L>_ib:]^ ճ#y*ъN) &J<6獻?`*2Q!s嫳Ϡo& .)ҐxAG϶xY۱Mdq:WJiWS$rI՘ ۄ/PuiL0_OIGPH.Hn:p/83IgW%j a0@oѳxXbl1~"'pPQ3Rx9a8WP&piFr>OvlđiВ(<8}J*ȅF/bߟ޹nMDVwEuH/fitm?it@$H S42xLc27TCZG p{(Ihdfkxz@w!kI\G.Fm=DJG$+"e+F|h*k2lULQ &/dx{XOco QqA1L f0uPDFF޸q㌷Sx{{رwŊ3G?gΜaZ}O892A5tFN j@h đO9+LF^x#jIMƤDյ}ffj_{iI(\%miG9+pj zva_,av&%8T:{{g;^A V '"| Xy^,G$q8GN<0AP슆L8; U:oAQ62wy_BH<ps7\ G_'Ѻ<SEҤв ϖ#)fmP<[4N!r8ZeS?"09l{v>'r B_ q7Hj&Hr}vxcV\N~D>ҳkd4Mϧ{~- S:|ajF S3ajL8Q</44ܹs3u74hJ_vmСGIKK5kH1"~ф.GS:vېB,Y@H/Tƛ(Ղ/Fد6L/ hD:K/L,gSO(KY^;ȁYTLcʝ* g$oW3࣍\)b>%\|1G`ٯJsid6.e׊th,Kb EpDmxQ8g`E*Dn<~n>l;8/{ʳ4BLj'){&*R]~(zVUǛ^yӸ HS e f Md&\WlW- HMS* KB#$p:=s=>&S/hOrGiAv kQ~3 \)J5J#x?֖_}ȑC48\h{_ FNڛajF S3aj1LcsNΉB쬬mÇQ(mjjjlllhhc~vVQSf8@q2]px'X3@\o|O#TWLy. !^mX PJ@M}Iv`EmQ[g];Q5 UQj7Eb ꇁoڨ ^**r3𦬸dP /}d`)_Yq+^e#cRoq/H>h'!x8I!h'5X[ʱ9r l`A<W8LP`WbFghh%D< Q_` x{Ơ}!ӟO8N`;;Aa82qCTjdK(EhsgϿۖ3X8H JqZ#w3`jo@Daajf0L05#ꜜOOO]]݀(ƍootj3g|׺c3\N#^q.\\>(CbmWJ jxY,ziD :a꟨W2$c+?Ii0,P2 g6Ϳ{;9g Q<됷"x q`7E}Q-!RqE[}#Lũ)dxvF S3ajFbM>=::bg???ƍßLL15J8qb" _;b^ƺ#~L=42lj-Y6oB^p1߫::&V|:4Kõ/ɵ? dK+M1u r$}OH~ pw/ aXMp1hݨڌ=s"؏^5:y#U <ރ`'c~#8Z 4DDi]kP[sO]Xn[[vuzʛݎ%Ѥ҄|'b"z;&r- Yk},b Zq_7aa<9% M8Z[&Hst=;ފX?-H)xşNeGpD)\wK#vɼo Y]gK5&q1+IC5֬VC  n+ e{j:'?fPD Vwݫ'ǿVFzP_ܧ(u֯9yJ GtŸA^  [HXčR§g&..Z8د>ڹm$O |FT/+>4z3>(Rq)^ O;uvAh4#&}z.ʺnkW_9]f~ܠ%$<ͣCңD0_vrI#?Ld3ZX5`ajF SYZZR@E1˗)655uvv>v؅ɓ[L@1E%RyNXîiKŶmc>tqDl_pGv}-"K R8!FL̖]l|9lY˦p&UP;7fj2΂ptqTs9F戡x>3 ֆH_Ȏq颈d)iuvFk;.f;*=LIa]OٞlSG&mOon^qʡRH axl`SxhGã!/!&b(OK'L I+ O$;6y[OmAn5gp 2]+A Y4S0+ٗxq aN6z.4(u3,žHC}M&d=Ɍ 4x8adIA4ucNӱ!Gf sSgswN][ί^hH]n2- I^5t'351S>r(Geajf0L05#{ͳN:lذe˖9::ݻWUUbm[7۷GFF>}\q0]^ݱe&Y u uyX@s"Ik>JYH g'o 5Vd& 7bz;(~ n&zG}Hst|xS[rϔA$i"ʪ.zxϫܝ_)#_lD I'w!ȣr,-JCx\سիyCqw_Qzl<(HLy~;~ѩǿx%74`4Xers`)pBV4b8ܓύl5~ڠR-K6y3FbH&/&t8J_yFZ`f:sk sLɽ^H.7kլMl?rr<&ޢx: >&6o~<ӄi.ˑ4MoEK,”L=fj/m6>qf\eAxh!f,_jh:caNԟaj7Da_}~\fY5`ajF SX+V,Zh֭7oѣ?W֯Otrڵdɸq.^xҥ˗3L/x;6s+x`Æ9 o5h!ݣ&mi `|ox`1 4.N"Z#g  ́=moo$ZT^"^kV'X R["VT4K RgݕC<X)#%A(t,Bk7u˛o9?MT&pUH+O2L(gi8K ۫Ks(^ qZP!|?}K!m5k>'5uWypwPz(dnjg=੊)S R>i:x :G(' "6|~I{68+;q䰟Qc7`u6AlvCp`]A/F+۫L} G$P[ .OL})CH\@r/-AwWGԂ-EE6E?fQZgGtCQl*`xjjG~ S0L۷oDe S3L͈a"SSS+++===㩧ӧOxԖ$ ccc###O}\_3/K#Oa.%Q隤~o1ka~?<[oFriitu1(sB4_<50dPMba ڔ7jpY1UFg*! &GHߌ.:NH4GE+5j!ODRpl `(bD- ~acO;2M<#f*t4>OG*,:pRw[o0r(uTsjM9Ti=vtfR ^ϒۉ(Is;tm?o<ɴUP:c*6^iLѴ1P"bWu5\ ޽J  pr2| h lc`ZWHд&890Q?f$|~TRTVWNC -GE2~wsCD(0ZCzUSXyY߳ߕz31L f3;tnqjww7o;::f ?~<===333$$ JJJlll~zt:e}6 J{< X;)ZyZ>KX`' SB,d=_1C l qEQ@X.#f.ڐeg"[F2)ր@%$h2Gcȭ6*at萇ŋ]\\Μ9s"/{Ƣn+ V#neiH™'nOFsܑ ֫UaoO9If訴6"h.:N&),djVpeɋKc0dOu' J KFأV`,m.t^W HqsNj]sqixKQEY4+w5AE x~hZS$-v_h ʜ*ǎOm֧4s 1=>oNj49AS-*<&'Jb@. st(ٷ}t:s4cއW:#lDo89r8'O|ȿrj_10/7?wY b򎉰ೄkÆPjc 5*\U8"RۛT?XpD˓8r; c?l CYa.΃&@ mRp5>_ xsփׅ:)8-1+iʹ$=a3L0b#Gf053f'0$]]݀x/ܼy̜9wNII9zhRREԄ555ww(///5C<8J}Ôn|7LM<6ΐG,”H49BoNm]^, rt- zmY@cl!o.<;ә;2lcZ,O+lQȑAwP?LéȞH^νx+fQw{ץ3˯jvgmuejOҨnLT! \؛o0\SY'O@9އS/APL}R ]a屢{e_D2L͈`yD@ZhQhh(LYvƌsvv>qDDDK.[YY+w#nsCK |x$!b=xEI#{g8t &imb,:9 eٲ޷Hn#ӖЯFpL«2:bW2UG#kRZl':=Hc':t =+M2ū8T{ G&yYDpl4a9n'f;mjg,$> )o~(=MG{/$8e?: /e"Z~ppAlpZ1GdyH(V!\il5v Nbi"H墘:}JRI|@F?M٨Y~jѮ]enSuv^WG|Xg"siDX$b([~e_gT Y!?# H; y8^I8L>zltu;F1p47\ =ׇajF S3aj1L݃B՗/_rJLLLbb-[JJJ(駟G_~z|UCCCzݲ7mLs.ckG!O1_qd*S{u&h\UˡE>^~ )yԨ"S1Oga}h[LM&_1 p6dQR[=+%q>>^ ;=8, p'0'J8B~wEYQ ]I<%$T{+ wݑ=Eg^?dnJH(.Cln4%'Gɣ|g|fӛ_rZN~|8?|LF @Ş$&g=">܇,+*’DB?ԫ)dGyE{= -sBuY Nw9x٫8/>s務?mY9謅2w~{@ }TA4$4 k7?6\IWU} pzUc xPKAbYah%F-ƺWd~V =VڏajF S3aj1LݓdiiuŋKh?訨(1777//+\1Lx{ZTb -67'l$twDki8 wy}G#\N ^rQ,aK=iWykX*0qQL9  h f#A D HiX%R "QKd0夝ҷrk`yd(nj&d'D7/ { ]j3 [p:ܽ*`Kܝ`x4_ΑiKtpLG7*\w6Hf_GFC)3~\NSHU#QB6f"'_^K 􍎕HYjhG;Oy {ܐ`1;֗s3 %0XsGW3z}9U0¥H&%Ը~a!7?hlmjlpz%#>\K00Ԍf S3bgYfQ@JY/\@41..nY8qǬ17coe S{нIt7~xRX|S\61B|k0jRD?j@R\ 8$,e Н=ڔq\NML;u^&*doK G,e3bMNP27\5c.{ƮҦh]~ڸ: K]m۞6_WKW2zSfyes9uŕA8…\a`R9 O7UGX\Ct3Eqi?')Cz͝)H]ճEp]7 }1^Mʱ;-I>e=Կcj7e`ajF S꺺Y&999((bzl۶w_xɓ:::111(޶mԿZLȈ@ܰĐ-B* Yq"bUt4A:SKE\wrlrW`IGЗzN#~op:c;|y]2DRi+KE(/'%Az1Thϼj`jy011L fC |?~jj͛7KJJ233ݽfϞqFj;ݫWZ\`O/̈́ xm!%i[ D x2Yмˆ`>)h'e 8񴡖нi𘊌=po%k@9)~;SEڞQXd`q3K ?/$H8d0=pd5+ep1R6U R%T x_+HmJ(%Å!,Sx6S|E"{ :g}͘ 4 I5Po+hP@h0Ictvj0 G/+pG&a5/M}[^2XꭥH24pF?-MG0tC!CEl%dV2Ԝ( !(U}](d@-:ĻZ\{!3vMxjt/4n f4#ErȳXDUǎuf053f=H,"hsss1<<<..NGGgaaa>>>Yڵ+;;Bo p9q3 un}YY`n?z4^gCTAG_n Wh ՛N<=rMP#קꇨUW r+┰N'v=t`"x-]<)S7{w` ,ӏuc_#6 &v`Vr d.‹蘈A`!p%mCQh>\clE:b4 ? .nN <0ri~w|@g)Ln _b7I 8gwD=)d1N x;(h?s:H8Ty}/DD`/<]Ÿ~hUu\`1Gj &r0WŹѤ'1bbj S3b S3LB?"SS@~ӧOSh"UUUL555++ꑚiii#6pCZCmIpj|-WE"B(*@䱟곪y_z)4"KpGh2Qixdm_q4f5+#N S;Jauvt&bhCC{7CGi-zHM8M"]-v,E?%[C$"Xx8B!sN^3Q(8#&+2Hw?lL=;O>95sp6WZy\H:6/@DJ"G} *N*>g'Z */@j'f6DѪEs/IvQ< R,V蘀ʤnڇ~ȁD04z O"p&H97)1H|2ϐ담y݂*WeB 6Jl9zcf3>U K &2 _ m佶N T&&&@$fEְxҧ]:χvl+ώ@xQ5=Vtx nms? ~0Jh-ƙRg?mPY.Q:}a =}sBt7j_APt§7x"{'w1L0QAA?wttݻwС S3L 1L3Bwz*b1k===onggn:[[ۿ1ɡ;g7iNxE~cbVHeX Y(^;6 dGpM`]nl/o,15 "8*=uV}VTT#Ms_@Wl' tT~A*(S+@Ixjx,g&ԅ4V&k8\.=;/BuIA- ~8O3^LD@x{ΈP'#8lᴭZwGQn3fWBa(?Zk-EoCDgwɡIQ"Jx%"hw| S.1+"õ8P'gLܛ1'qχᣛYU^jc )EL`( -M1 uHxW:e}O@0Nb\x>q=jba?~'}xnYYYfԌfߕ)H1uî]ssscccbbbJMMoL;7q)vJVЋ1lU".NFzq } .Sԫ2*"9 3OvNI> (*t;>9 <%)!TF֛zͥ.b.q'2 H0jcKLfKQy,F "XWY, >+ٌ3#m1:2uHO/m|J [N=U4L!` 2]2!j8!0x_P,J=ׄ/Le$ou,lT |8=#[?F{gWO\y@9L$.%C2"5 )ɘJ)C(DP!yPf!w^Gx.:ugk}~SjS@>{lͮ䳮߷oʡCBCC[~>tP%%%o1͛7wnffVSSZZZR|رc9 Ss1VLMM'L@N266^fѣɪÇoڴիy-DQ#R ^WmcM Y#Z;C=݆6t[li-YO:q<c@X>fT#mp3Ay'FWOtPXܙ~زF7y^h2D }z!@FgQjKiDc7"Bsool`-hT5q$ig< c+("_5\U[KIK3^+l1]vR8+2ꁲ!Y89OGڪ8?/p9IgZ]+)7o86zsyAeE7br+RO%OnhuFï(#6 bM7i#;0.Js%XWtvB"É5wΤV֏9a 8qBjΜ9^^^߿?uܹs+W|jՂvvv{y… {-y߰A޽k``@p昚+Ss15)?~6U @?h) 뫔A=-("pm7p/u_b0*-{J|_l6\}w09h߲Ə9ӑՀ U1y3dB40X'XeEL<?E(>}:zC8ᦵqŹÃ-4BdpFQB= qpy}\inlSo_7Ꚛ ^Cݍ88LOD*~҉O$UyS*]X5Ip'}SU^jL载\@O|uߧI﫟CmU(^Ƕ^Wjt p7*h86 1z?4z;@ph$RGA~mYI2G. È5QZ`fÜ]%o<=8L} ?@#?ӳ{jjjd XVUU>SPSSTJKKd466c}D,Y2p@B7W8昚3s/ejcc\o猌t>uꔟ_޽/ObDj}OPsc4۲p~tpdSᱟ?KVSn`ؘT<ý6{SaR;q<m6& ť]&6P1lG7ѓPF*f"b+<| '56Vl̀21kyi;V72WO-bw'0TїꃴI˼pA/ \C6o 7Oj>]&`Qo*,f[`<-bfcjإ]v-R?(^^3jrNL1bu;:R}GY+Sސeݩݻw₺o&_&,,}?~$o1`wJl#15Ԝ0uHڥ88d?~ F+W 7nܾ}H}ӦMv%>Lޔ% UJ}`:8N#?c2-0@4!U$vV;bltkG l ;8( Ϥ.PF-=өw(gh$xOޚYbnFNe>RmwR1Ybcywby)FpD7$Gz}Yr+ߌ p lU [eP}o9{n,J[ ~hUĶ+U$J&r dE!J BQM^2֯xmӭUEKY۾5>(IdяR Pf&aC9Y9ͬ/J~[Ulp\^ (NFvU9K9`Ƅف89G+@ilQ;[r F]0K wLkh4DB;$Kl* mm"^J-x=pd fÞ5Ƅɲ/{f0#M_tq2t!CS~?zXCC*P|REEkkkmڴ)//'o1uuu 0w*SXcjpL15'Z(Sۘ%'sΰ3g,ZIIIΝΜ:a?x,&&p?To{ lUqvzXg:s"?diΩp=NBIO፣Zv>80*x6RWQhRL*,bj-p\j@%M-(='V\d1ff*Jepq!(8*̚=8"~n7d}xv83+˳ȟe}aL_Bf ϕAR'd,ty2sSNd%WG>oWfez$]Q4¬V f _ G4BŐo?!m:!v;0U^MI]2έG/uusjsmXivG#w:Vbo;`m|ח\_n㘥ڴjE::': L$Tҏ5WuY$8:bm5O vlYX0TG0 j Ax͑= uUqšeg|Ĩ(Rβ% a%u}So 0ԄB,-c;nu_jj`߁U e%խ[[g͚Lꂅ(dJԋ/޴iӇ/_-^recc 9l_PP15W8昚?ПSd17`˗8@:111888""" Ԕ<]\\&NHp?v P{)M4<ׯT+5G>6cE6{ԏD8t[ ft dٖOˊ޽}jρi]3ς_ ӆXLK6HfEyOD?}=~xl/[[=9}E$eռu p8Ã@HMK}c#͈YQRe؁̛}t6Y b.{d2+xn#`{it%rz/EkdFVGLsS DHHHUUu-!CHHH1VPLQQLٳ#Gjkk:SwmےsPKK˨(RvڨQ8 Ss1;’ RMڡC~666fCҥK K0-[~gާO_BWW_xyP{Jz3v54f:8)t療|yVD86*b`ZttQ=VEÛwKdM3 `uvUp1N<4n8l\"皃+yjN*^FV*ϽU|o Y]6dp'֠zD 6y6 !6TuwFadDV`|77KƳqH W ,/wVě` 尕d#PJe@lk Tn*xCmK*Y-p8bdqWC"_iF]qxBTI\QBD/.V['X-~˕qANV ~tUA/rVS;ݛ+ҰCI:]c-|Tuwz?dk~xBdq#~wƤsNNL=ZmR ĺ1u]ϡ&?o2x^ss}  ?bΠ76Yl2~ GF:/!q0Ԝ:ᘚcj90=9U*Kh{*2dԩgΜٷocFw5kdggܹ* \N=}Ρh ԛ^M R~EtpBf:}Sq \=#PP{P:H q7~癟7 j&kk @$p[2V:)YE̓;iueC.Ӻ߳3_Trrd2Tb29:@OEI a>mzu~ge1,w)XaԞ9G5-Bg* gP1''߉HO=C<6:, 6Dnkt>wC)/6CNʰ6]&ۣn4ȰzfF9gXZ8[OoO$BeesĐaG@л? $+IxKbjg8[ R[Q&4VF{aޔ:F4tbgPU8omfi'=3;c)9ؿO29ᘚ+SsL S/ 6Q:gjjnnI:88x턠/^Hެf͚@(Ǐߪ:&HcUP{ZԎR[[jlL=TgF:LGgCVmY>1:C> `Rl$ç J粱okajAP0cXjnìU>C/k1[aѧ(_[=u#{4=>lmT*"0ZRǷo2Ӗv/~mrP#X*t36]wE.ւ?~ SDNԜpL9/exo)Y pHS POMM͟9333++k֭W^$=c @8j}:G{@߻(&X^NqPD3^h:8~(4vH9j}uطEL<@dxv>ՑbL-;ӑ2M"}5؂kA@ Wԗ1ڥoTyRX$脭œDo`CB<-<&LwmOf/%s{ǫ`0%rUp ;pj] ^y_t0kZ'~MYzktqpgc5[^]\~hivu>d3qN <[ 6#"R"őff)JgK拡$ spGc&)˻rmbۥ3UR.<0);\{͵ChD7Vv+Gg5FI{6x/ A$Mӻ2Ӈ3!bdhTZ}6G(z A(W}= f8=5ԜpL9/e*~F/k$7Hb e/}Fh,زeKhhٳgwj* ,044$BV}ɩx!9:QzUԁڎOPNC.6 E唾7Sz=D|:VG'{Gn }D=Q sOΧd=}26I)G6ybZRT,&Y=!oHϼ8wD.!GR8 nnׇav.,׌8m`ʰsܷ..2ly1T+-+ZAʏuู٣Y#/lIb6j9aLgbk-VӾ?~_ʳ#CQpSqHS_39cjpL15'STPSi/PD)JrLi ---'Nty|zzIIIqqqׯ_wrrx͉ÍǏժ~'ӡq;N{y=;^DSi4| :0%5w7X;cu"~D}:."SNDIP kkx>,67VKP4qpq|)+/:t38$ټQ9]Xl(:8-X3@}Yɗ巋i#^~\᜿yC\b47Z5̻d0ȏ 4;b(5/uc;X Wam̉&; ȲsW4$Q`2tRI=th!s|T"ai\c!}ë^`"~׬Eqo4v˟܎⍤奐mqoY6) !+[_PE[E`2Y;Stte%2%pC$ƯuCM[IjXxhLmR\d+nK5mG*];G)=k{Mɭެf#Kɐt>'165)픱J64'ګ6F:=S>ucjN8 SsW0u)PI[Ⱥ"S4ŧT={co2y1)sOp[=ztaaa6l~j>MDyF'[In60zx9 x/v4j wݸ7K,/σc؛xuZ1v}s@:#ᬇgPmpJ 飅Z"?9t=C%߮m?8}~a(C#sv:%i۠x.b6ܽ2y|zCG+%=QM?}belL2ҍ>$|ڨpUwՐ>R$io 6Qif~,{4#Ftwt͝%uN}0v"^;ۣԩ]-J1 =|dSo 9rXɒ]kh؆ǜf_ۆ i*n~uUEKMQb#M}|h0:ҧcU`(.S~%1Ny Eژ%CnWpeun>oRotQ,G0`.$6Kۗf cqGB,z[S}7fdL4l@o:{|_ c915']L(L]T7u-WRX iT[1 !u )$ןgjJ{;<~ V)SOzaTZ(SKskES4'fB4Έ.)rlWOl9ϥ3 vj}}; ]dpCv+Ih LSPQEVAjR/ѽfKg-jGZ,z $¦M2:pS07ԜpL9!-X]A!r,/q3b*+V :5hag0,,իϟOLLtDNN. 34Ǵ; Bb?kK6H^HC/՟zAw%|:b.-H6/<QY/j쳢;(6S8MatR3cF1c8UpX>MɆGݨU^n~u '9!|t%lUJo+{ǎ͚^n̛F>,rx/Ǒ3; d\E6\2;Qs2rI!3#7ؼbwl1Az+ƭc6V/QG蔎Юh>_:|[SX꿞FL15'Sscj9_dbhd~}HWu,Glqiongg縸/JTTAlR ?s̾}RRRSݻ_ jݹeib,Ae}fSKikGoofJa멹e%?eWX'S/Gf'02mmyHYīXMDK4.UKU $;? oIWVq_17n))a,z`OeSa,.EZ[>#cFIb$;壱OQ&8bS E{ 3 ֛TyƤ<_Ё2"S@4S*iYPNk_e~ôg3/2l(~{KOWZi(ڪaAܰw5Ne^90MEKt@Mڼ$͋BmCtXȖȤk\`fTV'<=dMFl l0Mh cK.)yے{S@^:Keur&jW@JƪG߾lLO|4bjJE02A߆8PsL X9<_~ԩ֭[#{ߓÇKJJjiiv15W8俈Sp~@t=@.}M@CQSSmllLLL5Ϟ={ Ǐs+V:u*==롡[riQm!`OK@LSiF]i־='=0O+BDP{ ݒxD*<~[*<ݸj4Q)ht+2P,}FRY=+ G~EPzg:51gWj1i/➝YxpKDpL$Zy!myӺ?Wp̵1IIX?Ѫw1K&Ok׮uuu=2'O>}۷eSscjN8&Sj.-PF]ympeQEW2ߤ*"!g֬Yrrrl~j//[[[ooowww]]M6eggoٲlJ:,,#BsoOJUs3V/FshK6>- eA>, z e'5¬ BOLpTG dp4t @}3b:8Z2=XSQ8)>"(!;2q6ޯ˝[ϸ~F>rv<58 se :X({jWKZ.DU脾}}UELU&2Wb]#yF|<AE!Z)Qq'\hgc^c=t'λ?uE? \VN,G,3+h #6ZBVB<_<\`Vu{,#2N_/L\eP~x<LsY[5vM4C]!7ÄP\HVqLm@ ʝ0uTE.j=/Q1}P'NZIw}Cpv`U󤐸SPq'`߿UmE,)Tt«,VKhӵR w}:dܝsdc#>z(+zeUUȞ˖-۾}{׬,15'>SS|26Ef@&NB)MrL{Ertt4렠 WW׻Fw]Tbݻ7jT|ͭ=?5]/QUu %CtmojG"W/(n_.:RCK`ObAi(mI[VkDI9] y]Pm LD#j :`2Q_/'^;l]P6 z{)oq+? UWMD")W@׺;8^&Y1w\"xH| zo\rxX98x> E<Q`\X( K@ɍr Ě^3 Ux›34QFcQ6on_Nnٍ^W~*g%Iܖ@$W M[N+#wdg r*F } ei0x|3D fXul|E@] ״ ōn8) yl @TaVՙhpm6\>~Ej4{O FZ6K讫ݕB k#}/RY<@dLǾiOx}^g[OQb,^N JǠHk mƢ.lȝxWMUଳݳg!J$NCtqBmMW}U_Uw gb^oZ>6-+o˫w щ@)ZZpҊ`߁U8ǏSSSo>l011,))!gϞihh jRi۶`aXb:WmĤ 9=T^zb޲8昚cjNZS/s@@K1YWo8%PHӚ9ȑ#CCCg̘u1uVVVlllLL <~ĉG%\{Ad3V{(Yjr<ݞi6.f9SLcs vskͬ%yeWkute$='I"y*TZ L/T9,2,s0k U@&2:`8J%ZV <0gFHp4xUP};s6Dɝd~EGEVZ"zk<[0cJ{}ې]!k]bl&;W=b5/ds"b MB6v|v}'V)cȁah 8 /Q,3츺iVAa+KԆ۽/c.T(3JJ۲~ͣh$!H0ƍ3xvv!a0Ez/,Tu,`#WmXo j>*%P+L) o,+zl&@~=x5mig-<+W?v"EyBٝ$nC[9V6c?=1u+vڵ&mt,iSR,wu7o&/:t>Swݻ-_O>r;p),,N+9昚*)S/ve/ "}/YiSTJ!:u-АR>(]8RF?kjWkRG7'l;;k׮effܹT222<8mڴ䠠 .\ذasoj::R 9 <ɳ(P_:Gw<18vOnH" Hq6<-:q0zHa1V(: ퟂ Tdj?QG,."SmT@rT@N쀱=.OwLP&d5<B$<5pDRW,6Q˚n+^at|7PaZ#< u`apXkm!8 cU 1xYm%\鋀NoSpiPTeei:NWq'Z`!9! uR0 zb# 3 TQ݂xgd,CXzkZn*\P*b.8 1[e>+d,F.0%\xbf12`$[Fqɢ@9$0Er+E E0P6S귧ҵEnQPiZ=Yu&1x3A֒k׃GV-vpLԊ,S{zsLeeׯ_;VPPhͪ*u hmډ*djccc'';w|mQvE### 4/_l 0޲ﯭ嘚+SsSwJl3D*hXw5k򐖯1 9uLLӧ(22p}VXM,$III666xbMM o:ڛµ'-GC2ځk8j@AVZ1@~/7+ŝr,XQf?[-S~U  l^GKv"l(!\CD tێMdM`m F'}xg3=1Tq{6nei*U.6J>(<ӨRtw"]H)rBL[|xҥgϾuև|||/X8w\A(kjj]eddHCC… ϶ɛ̛7o233۷o,X5k֬iRj'VLL,44]cjpL?Y>K5ѧ)A9 ~Ew=1*3ڰdT+ \ W@"б\lyw|NHHvѣG/_wYuڵdI@@y޵ky+ON6ce=puO>wI$hL<)aè)ݓڇwK;DsKxP>MDmC:3pc'Xb娰׉r3Z~&©_sۈA"ewMmL^ qktVY;@8YuHaAUL!- Z_j 4qw)!u,xa#zIy@X J NbY7D؛MGkQcvv8dIEa$("#Rre6C(D0ɸgg}KgЏa۶CWỎ:':|<f"o Tל!R#! gK<644R3 |8tNzNI}6N<쐆<6|.c?+s~S‚ ;88xF^#-++;~xW`M'|/XXWW7rHGDƍ'!!J^Bw!ݛ]v-˫ B?bĈگvk P(**pL905(S`Kh=/tݨ+өZ1 TRjO`vD%K'ߙpI32[+gd(c+͗'ҞF ".|a L ڈ8w8Bz_`2dqfe| <^akwP6UObڝ샊x'ي3Y&i<F(*ZٓF>@4YI/u$'yNb> ܉uIx'h_i\a 7is:Q2w+rL9}ךHC3xtbu>wid8"#p-Jh؇s}g߶l#J3P~{gWOi?5)KE9HdD\[nBe,E"ESiQiM")K)Ed+KvZ[/q9Ӝ̙peE{25,Sүˎ/hwr% 1r&q8u;:w!Sev[vG.).+>z Uz,kZU㵫~W×oСa꽩X?ouoU'r3Hv'cЂ?1.ciLmIoLOURfnYcr%oM漳1i/\)/Ӭ&bn2@8}Q c'{Ѻs{4#3h*9Z觎X-oS\ ػRFAQ0^ţ lqw%ѢHg5(% 4bqRކ(;ˇpn;f ;|F{$O =GrbpSA Ę^Zc.Z8MJ4ƲL͊ej25oN@ 8;/֭$xn$ٙ+T>a̞UQ3{w-9-[衺MtwnA 0## X/YO봖w9oq~bo[s wW2c)ԗ.7U AR2ȫgc&Bc*4eMEX[+vr+gR=N2uX4J)Lʼnhy0voא:oPhS{pŨPMUNX LCQѸ7,}/߆p \ 6iƂl˵C"'lԀ((ۊGոZ8g%zB&\*@p'l)V EpĻ%Z(1EAȏ2̽k]nS=^7E |4@򢃾P"̟.  &nP#~kGf'[ұ+,PFR?XK1J < T߽tl7 Gz)9]Ck i ,ejO3)#2ԁ,SL25;XfARk :BOk*S!@]pAvn\lYQQф Ҋ>~xppu觶l٢78UnA_?05_Uۿzs>2"-xʓ.\H$l.ĄlBN.rtAAʸ Wd2 "i)ot{Xjf{WB p ]v עq; ȵd2AI!>i6Vb &"x*C  yc)28pM$Oywa,-mޖH [mډ۞eVx}9$x$Gb~{7zr&ʼnH?mEh)+J3uD<<} eے[" s7ПejVXfԬ v"Au$0RuCE|HYț2ViiԩSi.,,tww4mڴCyzzLj*54J R2< q.U \^e}pp& azޭ4 avKpfV4 sg!8]8~D=6k/ɰ:\[0D†!#œ,hn`qA8( ?7]p= .Y(hO'exGpM ]Ф#XEIz..@MK2uZ y>ȣ scswq^<<%|nDÖh1^ġip`Q L"P3j9Ri)OV{3d X&ީ!-K6}€gEMLX3"~`:jz;DW&aQl}$۝q #&SEH: j}yvS6_j ,ُ>`y9W nJ̜hV!j$&pK<}L;|V_/nGL͊ejvL25.SْԅԜ J(w.BB" #,Ǻpl2}}}).xbSSSWWפ<'sY?ߙ~j8m 'n%Ar,߾iyr55j8 ¾{ww`~?cC3̻b"s[@ɯ4l:n/ih5`{x [Eȓ@UȬ*]VȾe"/cĊDa:%X.JDϱ Ih"5SK2 if|>D4ƲL͊` s O.Hh!VC%A4Yfԩfڳg]iiiBB***iii666&]L{kIVדemII}m=>_Q(|SXneW5XǒA|v p/ k1zձN {`O' Յ2C!D'Δ`:ъ -=E[su|; 88DBQV$DOWAہHZ?c2?,Sb,SL . S RO lGN5y慆[YYYZZ@}HqϜ9SPP0UVߑ--OV_w {y߽m,9q FeE.v u>̶A8NnfA- \$pжQ]4.`#ч6txz 7]|>c #7.6 -(6ٹ.v(ZFNV!w\<[T R= >ُ)?D$\E*kt(Uև@=PN|ӀJB᛽E2M8?@ZHM a7<`rFR\*'@ش 3 {(WBa۩(BK*jbEfbت 4FbZߐӳ ތlI[8 +Va>?>s $` ikٮ0ޗ'8Od5KzC DE>G#JفVAHl[퐚 fjخTEgXYb,S; KYNA0H:Ĭ?KSkii|Ғx~$66ԩSGٰa÷Q/2g0:l\q8Qu}`UP'O Pj[ FhF{HFdjv}sg+R'i~r5tE.j;`""v"V:@FgP(FwsƊQ4AJU*8 b|lN3 {mqfU"хTkEIc&ZF 9#MGERۃx*8ػ]p 퐾YsyΰA tA& *Ho3?Ql5G-(,1 ıdEiS wFnT~F5ƖWbӼZ(ÕX77-a ̚Tl9(öQp& 8TLӸx/ZGHϋۀp2PVmdIZ:3\Ur0] Ժz#&+c,Fo*_bXa_owass?>p]XLY}oL b;Lk, R#B?S_Lr-[}hi>ydrr/fff6664Yd-X3וD,5x=8m +CGe^_pBg%L]~rVn\OC0cvvB%׺1F IjH3 pZU2XKC:$QS3.T,7yܰ1q~UN /Ef>RpW:vh'J` 7B bz@~P 20,]&~Ke2ڦhZY <pҐdE pH y;4)`~ފG7 '&B&?%Ci4F_Gh^ʸ3F|5KU42E$[H7 Ȟ%9ϱDOQE["*hW,hGQ+{a:C4(:g9z #qFRXmñlAُ4Ĕu1ԟKd/CYטǏww&XB4`C)1Huy!k֬YgϞ IMM׏qёkUUmݖϙr}h@.Ք?0p$'E9`\O^UhWG?=eO-ba)1WI0I5(j-#J qTe[/̐bx7v!Ai.2bJo%WQ[U6.%R VC-i5p&qq#-XETqW Ge EU4~.ePZ5lv&z| .XXusژpSdd N˩'4Lă3AФ|o TVmaD=VRegX[. ݋\nHUheoTib,N(.DY X!.H^(T%z5ۤqL[qEW>Ah]ʁ`J#C(Yhp`* E)e5O4z9X}1K`AX0;ӧhp8,SLYLGQDRZD􂱱1s̙:u@ XpaTTTQQQxxZ4_O5lww31?q !dp@=*4.`,q:b ͟>d#fe:,4e׎f@tfXG#1L))X)aO|MR‘3Q*[zhJfeXLH"L Or:5qsr6j 55p[-irSr1+W 4VHJxˣn UXYy)cg:Zg_a {2yP_|)i8yDqNQxd;&`:o[ 6٪?{Az}KCqJͺ2:IIr97CYoD!/Lal7)̽wSbH\k,q=p m( X\;17_فUAX+j0]\>ެfnD1 Ѥ;6ʏ9XL7qPLs99珏L25;Xf240~ F)S>{d#Fx{{ĬXFf⒓]]]zzzZYYoٲ%71p"[ Gp)}{㲨My{.t8>GI`jcIS5WzqvĴ.PDso>8YG(q"zx#4;Lmqh -m$qqں6EnRq= tH5bnKfzefVb(XiQm$G#1 Q#Rf^ɋzxƯ|..Fݶd3z8ؤEoeiַkfO;/0iN6%A]]b) g^ɯ[o뽆+M54qBMzTFTįF'P 9ebsg5RCQ7D#SrD 2csNea)Fn̛2A n xLnʏ?`U0uAA,S;L;vSVnd,SޙѤ8IN%}替;vppHKK wttIOO߳gφ N8AڵkO:Es74e^̌e!`IHAըk?4=9=H3d7Mֳ>ʟ(t%V?ݽ%+ \(IDO <pE]|!xR82g#i%TE+Wx6߰i$w yGlMnn684]\`6^œ̭Ǥ kcQ Nu8$gp0Mt1FqIsm$g EEP,W_+< EK YY>=7(\(*bag#t5A &agg6.!o>I"D{QeH(sqň :?hfG[;M^{MNK#ur`e'9$F&̥ Kn@ IJ 0덁L[4]d9V_he[(駟Z[[85`t!%ѲO rf͚#G >ٙ UUՔzFo--1W 'sW2L?PI+;r Xk+ϒ])fr;~= U5~2LU3I4Tu@S"MLͩtsp fRꈶ0p44d 6.Jxoxf$6BopؑNw'3L# 4|8CZJ0Aecw@|AhQbgH=ZPgTBac|.0~nKzŪbo %cjB$\psm{kuWjWUMR1c}oEa˩კ(ہLg6{Ǔ%R+@3bKkL0z &e6o|Pl"LJ9C(&1~/*y$Qٞ3+$qSj-u/0+XԿK\\*-ej25+F'ucjuuu ipvttܿ? ډ$Ǜ ;|ԩSdFZosr:n'1>/&PiJj0xפ4ٖY-ȳl dz sUg 5 _PuRpKq)p6F3";!=5@MoTK"I"7l !w O^(UAr7QauRhlwRLOZ`/֋:h񸳥 4Ɏ{/ _pj =5Ǩ4 P;GS3t/(鈃2X,h߮=bYnaζ?Y DI_J8˧w/deؑxr%) tC";Wwp%EA; |+187zTVM}uvSH\`B f!R J/#74:vq` "9 }W 8!u,1.-_0ua,S^^^ԬG`w]w'~LM'r흝i9##c?Ųe˾CSq8%ZQٕ Z LgQ>}2Ws@7+,gC 2ӗ6[xI!E@HWUpil stI$tALB |S{%qT*#pNYȋ|U_qDI\uG~Tő{Pm^e=Hb(dHCv}ݸGF]D@A;"S[`^4@qkVQZ3 qxT6^5ǐ˫rGBI(XCs뀂n2e剂 &MKyYXP+dGVT_uEM N_sM;<(ٵ =- ~`4Ԥqˉ_] |3NN S, ?\4pM,.S YDc,S.k8m)b=zb&4Wj[4auѵkC*6uUE;w{wCr({ַGOoeE\>}65D&P'ṪxTM1s%2|{dͭc~7yNxl "0T<`ہT<us>*k m\\Ts8~p;3צ.@=AH1@@n_=cq:g4g.q0{϶3t@03LManlHMbƿ}:Cnj/׬[ a`ejV_!S7*.SJtft*!!^vssIMM}ן:%%%77;yݟCBa=Ϧ CId! Q'3U-N!&i9:z0?h6BЍp}R,0\+K8q^Å.tYA(P@X</J[Ưrwj\^fz%/jDQ6áSzRiɛlmWܗ/=R8cJ1Ͷ4kwpa;Ճ>&AhP+g~Q8cgkMGը~!~RyǒjQ@6s; [%״K9 DjU]Ɔڽwi;HuD}sq\OF2ygҸDw'&BmF6r<܊zKx)\49#O| gܬ,ϙ,%-,H5_e/@4~AL}ejV,SejYL51Mz:u*--~) <xј{mn!m ?l3- $quTn;<Y$h<'>B#N EʻDuM,#*:c04$ȲE8T1o~ZGAWmh aGIg6ݰMpҐw'P5R}Uq5/Z{( 8WŮ-.peKNkݰŘzסUTsk#8m7l\f<+w4tРb0W=Ts[6Z/羮>.haE]{lW&pn㛛 D-}"{IəR/Í45Ln%G[ߛ#v#r( ?A麺uЩ_+Wv*bۇ*cӞt;6 B?<ƾ⠯$tI`XQ}J8b^>MG!E0Idp`dqbg5C.|vKjR3[))ykIxl^*XqHgf ɴWISCmi_L4&[>jq'-"3x8n)a'H^UD*$mQsH`][SڬLE0EafEL͊ejvL25+| i:ujDD֭[G+WT%Ϗ1hc8'&>'/i^1 UEw?9~cr3W>,8^SI+\Rh4ē1asJ㒭(P_Y `$ةA5a $c+ 4&s1e0a&YR20HffSls{`0Vu@m_ᮡۇޙ)۵{לY;TW.n&TGd4O5&H }7}g+SEƾgcT%P,i?Z 4D칪bV]&Q8wĤVB *"P:AZ!xӟu'9ؖe׉ |/z.r8xL %)˓)4#Y&s5׋\ m)1#2v1R(Q K8Ømt4ßP}_ X\d`30X #f]KXjp~Hz+MӋ/NMM555|~AAԭU9x&;Ou-S!>N$յ4Vo2ڹ~،ftC{^qPBr/\xx9MIke[C( f< Ex썔a<{z)2Nm;Pm&&`mB璑 QlGRlJ;hvD(|k+LV^ONe,O \N1Z D8QTՌ+AKy<\#pRi?KLE@4D_ᢐn8,C5pz(CkHi<4EA(kLtx|*#vhyDia%j,pEI3) Bx{*2a4IA_Yl4Ch/ Ԭ:`zffGL͊ejvL25?9 8[qرnnn4G߿?,,=ksV''Y?g|8y! *8DQ4ΌnǦ]8HEh#3"q&2V.24k"Rzse%_5G p)TeFYCbtzLI` pqbLz/ Rw!`cS#5?N !xH;U%:[^ʲk͔kι.w)+RWcZkMM:B8x~]bp[bAӶ[{`QT(b,ޮZ1WZ6kFaV-~r>Z;!`MS >/V4~ LmQ,Sb,SL͊eA4{ =Fʊ:rɓ'ꪪ{K2@={sLY+}LIpTFO~y!sBm܏BIY(NiޤDri&}$@n쇵x ϖ@t_(#3*(BS=ۏ:GX+3S#`:RUjm ŏ/+DnA. 7*ԉf&-e%5C(%|1ZqE4BJŃAq$+[ +"(geGLBM `ʖI |C 3hN=Y.:J` JŐ.OUmqB4^nvGp`i"sP# TPQm{g5|ֵKye!N"ں=0,RXLi"VL 7Z+hI]]ty`($Q* 31/eCM0r:`jJ/YLYf2W#.=>:|*g?~ښh͛7߿n]g/ILgT^cXI!v VI!;J(#?ʽH(G.$$|?"dB^SXǒ,@QfB-hv9tHןз"0HzijBLG|;wD$$Izr9a{WNdWkHl;w,#afrN`@tet4'6DVoDM&>vZ ZU@Q`P9ZX G }pfS=ԏDJ& 5TL$OIB<*a٠oN#A (z=UƽTR5_PI UaQ0|-ΞCDyr/18mHTd>SCzOaͪDp~H]ܽX+7ӈt'MokˆAzF|ZIZ"UuessDo|Px,gd٦z,QW ɝ{?I"HeƓzc:6? 31]ҾZlEbWBYZHHH Rj ))"/cf,3fØ|}=3s8z^}_|}m'z,<\աh7W=,AISf=MˡRt;D/-ݕk%,[UkU+_kg4z&;իȲ< Ed|bXOW_w3$ĉ6%Y?] ktTB7~Y0~S+g>!}rm+ZCfjeȿ*Z >L'VVVt1$$$//oɒ%wNHHXhݒg;:>Ndq.a# ql^|n!JZ0D!6N\FF@M=~\avk LD؂G0zxsClc,7017CkH|{}P8f{c=Tz9Pl]8:M0ӍQi޺u0ϕbe|#mFѽi<~=,[֯jS7b'K &c :g;Skhq.xYӃW{Ǯ!fˌ9zfsQu:}OmM#`9z"?<ʃQ:P4ƙuu@VͦCgMnėQa"+"^]NopuvL4hsv(hAY@JJb~\>jps%~/ciCa7y|'v+誎fbUhA1_[c+LwWJb ;cN\j\j\}};X &)w#X#ISĤu#avQ p)&h^[K{Zoj~ ,$yy2S"3|L-3,2SGHWlٲ3g>hSٳg۶m6mJII6ß[Sɯ$g\G `;`vp!g9qal5C=(nnF<7D.n7Ƨ"x Dɧɾ(D&$22/΂sq\?21<,5_Gm}ۍv%/8x剢zW욹ح$Wy?kH Ixԛiԕ6s:/vxt-6}xxp!MPizxBiON\:N꣦1N M#ηF0Gqe5w_b"P=?/~bkkwd ÚH/rP݉F[lOirQ|ruzx#Zz~ ,${+SZCfje?Coߞ痗rT]]]l[[ۣGVVVYϛ7Ύ~ V;0ʢ밇f# X~2[dt{1p}sBsLynSW }O8qtK̉=>7_vw 17#_ǖI*g PEiu6c?sBg>Fڦyi%-bݜH~DKo&z271NH鈧kNq"m{"3b냎rk~$9Ϩ,\M'[wlZCfje]";vƌ%k׮Æ #(wdw>tqtwi9ЃAAAcǎ-))!}ߠ,No).wbjOOІ`*[lbU z:`wc kt,[[MkӜKƎLӛە*|ؔ|%>i/~gqJݵS41fM|;_^SՁ{J_/_asTP#aHzHk1xPE&QwwCMW6~l&5gv)>i8l)U YJ9՚X`- zWr~srzzm` d6ꨜju4@#e-#h-0S=#R^h?x ,$uD7S弣y(DXExм ۅ83 N"gxG(T]]c#.ZCfje/gΜ/f P Do^ByVDf۷oߵkskQD/ZG 6mZA2SE #]12K>y/cW:jhݟ-F|tfv$c1[`Yk7efm]qT[(ML}ޗ_O^01%c ifl[oߦ؅3gرcK~Wz<]UU啙i&F3iP Y]=88xu"͎Z CG>i^ V񈟇yf~[*?SK ~{(`?#p+ՇUs)8OGt@4vj36|b\u p-8ImM'lMP9]k./pƭpw&m q}=5D7^"a6">r PS՘@N7e6~03 >G吇`/sYjVZyͰ]k_wDh.1#B]d<;笹tpb!hB 4p&Pd{>d{5] m_4馢8a G%䬲8*@111w}}V譆ة/e23 ͺL-!3ԲLO #+( 8BWD [lN1]b*.. ۼysii)-ssscbb޽{ 3X XBWujӍ0 oЦT݆@Wt]u1c0[POr/of1svoG2.̀-0E UotvǴ9]2^Y5Nm_1ihkG<٥P]2$Ty9͡/lc]`#',T"_ZZ;<%qk{hBP.v +s5j 4y`}@OCte@RVi=&-ÿ!RnQ5> 8bzpo17£ Mp2";w\?IjlN7qio˟ѼNؤF&b>%!$; dEfjZfjYOZ`9]ZZJ*Y{!HŔdT0׬YvZ W:::BY:DCdddYYuKNk-A(Mlٲ=d5LMM-)) $44ݥN,ZHҍlذ!..NSSKI:n&s k15Z 6wI̡uZb#]9;vgo#b;"Sz8e+:|_)R؂3_ji׺Vzc臃s q-JLV_'z8 7b )v["s)dnCdw%LTeHH/]qw߂Ľݸ\~-ޒܛԚCCk= l-gu:w{tZ&@`_Ԯ?j$uOFkYGFKan~ _[]#U_^}p-ָRN;eWb¶om8 Aݟ5LJEX}~]8\2` y mOB~L-!3Բ|L-1K5[h+O0=ѱAGDDijR5a,uQQMm汸lݺOJ0+͂෼\bq-_<99[hh͛ /wuṳccccbbWy&''111پ}B]iONu!tbkkK/iR4wwޅ]uSv9Ndg)J<vup8"k"<; {qMKh&OڊcgM ̾E\ʍ}mdQ)zXCPLָhcz"&0;3qnltvLēSnx l*jHU KxqY(0P7 &5*EZbR^<CL=w[0PGduv \0/9Ggb1$I2}U[̆ [.\ kv%g}.lBEx O]sƧ#y-ċs-j6vo`Jd~ i^XGbSL-,2SˇԲL`j-[f10&H LmZܹFEh6]Ѥ ڛ߸qUB -m-Zgooo"\:د; e[QoDs̡=嬉VR'6uBڅJ %ܽ{wYYYPPНv8Ä5={67vY'M6QWDtN-;Kbb",UĖ :5HTNHFy?%/RNF~K0u]}k#ۥdДD "—3/-t1wY "_W1#Q M:7b_q<3^̤ӵǢ'޻t$&:7D1]oGD{" M#B̆NV Zf,JjmgZRSO(oy%b;g$8ņ\2;ͻl5an;w50=ũHé8U}Pqz" XK!S ]Ä>P[ N 'qg)f c ;ao'BiW|ikqn{Ln8Cۧ9q?{mG@pvCRrjPkvd;W Me:=) ;vL-!3Բ|L-[Rq{\Àع $!ttIs:MoܽSkYc(FD}\paUU颤 *}Ji:wBˈKY^^eڵ93啖!s̑tYMM3 ~H]~joafF P3tҧǧpI}I!իVѥOnbbB^]]J+uV":;lXXxb{:sL)m߾=::ƌ ]rGCxLoqn;Gඁ 룷 V#JCۄQ91aO~bh%, ckW- U3 ˇZ}E=Pi(#9d:_/{Nk5-l`4O4jr}?L%_Mf"Sfo lL=Hg-pCG0T>|,nva{指#pw4ǽA{1L=5y8O?4hC\@ac\\-|OGWD5Wի>xd#qjLp5mQ ˚FߟcS j6]уc0؆ȟ2'SL-!3Բ'2[$ N}~C/uy.[[=ж4޴B4@Z...6m"\M,LX΋h)))FD !2ݲe \@Km!b%&[DիE-r 0СC멟sfdd ޢg𸸸I&k֬.]TG~$~өbbjeFWHGE;m;Z"چ nR#33VV=͎JHHR=/zDڲ!󓒒H=v9$[<]||QJȲ2bO>Q#)D@'*$%.,,$:sۦ,^C榦>|xOXk6"]p!?uƍ4{%d'OLL$rI %'ndڹs zE!͝h)<88rDtz>mmMi")))QQQRe!jv{z߿Źו!sssitzHץ7+f'Y_/mFRx~K>׿R ۦظl' -ԅ 4 q|2V s=v<.t ~>+pr#tnvɪH2.`I0 t2d<>;֍Iꆋ1%\t-AF#oDždlåÚ^+3~ >̹I;>Q䧁Zs}zՃo5c"1` lCfk?^dPf\>l<3t'@ZM/Ҷ'|MO#H-}`y[~4e>axzTEUv]kg ~ZZЎ͍Z.">W:+=dL]PfjYde_!?¸)dOJJ l$ a9K=.D/#g]aa0ѢڭMN ĭԪU8 dކ8$6ǹyS?44 65uKlKI0haԬemzR3\cf͑sT4,Hao۶FDTK8I9r8qYtNש=05۳gݻ+**<*$}555iiilAA,B8,d֬;L.EXbbb+F6]'ihRKU3jL>|4,8cGC&&&SKvvZ odJ SK~4crTqV`k8D3$tњ&xh#~%B[1M`oC'8Z꾌 @.F/q?X&Ж xqa+>> sxٕzϗ<+iZh}kˆ5DJ!hSbQN;f^CD30OE R{4sf` i=OZ-\E67o*` cWa4@)[.l\Eئ7k-kmp:#L9]w$1757k|y֗ X\l=en85mm4sqPdKy"sn0;*h]ceECfjYdԝ`ք"wYVVjn>>X/ŧ5[A}kSm߾|LSdJ>IO-Y'5q_w-0\5vaDvG=OL{쉍,puu9Kَو-M+SKۏYm{sfQ}nJN]K8/P5I~ \,,KG-{n>̰;&"f(jUc( >Y֢1'%>Y3R7d:-4Pe7-97;x;^ITN9઒(OCMz.6cl6,2SL-!3Բ3EY+]Y28P2|Qk??j]F5H#fgg5cbD͙R1"9C_PP@{ "PDv͛:hkǙ0z={6=DCfJS &%%KGZl[^^Nz̝;7'''22R'$$Рǎ===itE!Q1MmTW<*­> F0Z "1x<Y{};F ˛I~znG*B+TXS8;Bgr^lddB`FpkkF] $#M*,0/rv8nmGq@t.އ#m٦\Q&'OfVBz#V`HOBp5i֭XdIlm=jxN1+b$%-ĿbWr&<~85N~zxxn۶-~Ƽ"ҌK0HO|=y{̚ӥFv9mD#wĿSL!BѳR1jFI%5h ]Bc)`Y&})IO^ h:Y{,i kQpf!yRm1F>,T_ 0EpI,zζλF+6|4./JºM`TO5;ul1F@(x{*zcm\vduaeFb@e)0!£خQ{G68Uٳd Zk 1\͑Ć j=lx/VQMr)j8m"+ff`-\ Yk_!3-2S"!3,2S?b=Tbg70 fC tNjժٳg'otX$(.}||&2i5oJIыׄ/&" c t3#*~NGnS|vf)6z&i}J`- R:[D;v ѣG iCBBHYI9$K45EJnݺUʁFKCPohKrEEEɓ'mGNOJVcHC/YNsag;(ۻHI`{n˶b6l %@#%7nH˗/Ҹ-11V#OJJNNN^*<22Rsӳ.ٖlVUڬ\731J4J}gX3[+Wv)>u\i.F%.bt5PǨx O}z%7fDλU3 "a(F jk\gJ]ș1 qu"'8_lԝ&:vV…1QGg#6[O%(jv` ;D2z'M0< l\ZvTlDlIoh=d5W8+ &@ ;:b[1L\d:5ni(3Ymkȉ3u"eZ>dZ:$gB3@},-[m۶<CbOPhKGR!s6I6WTTPԸ<==`㗍'T411!$&z5#>z1ӾU :K^"XyKUFw"`H rKKKĎq$P -U"]ݜi訨(Ex+*UEJ;}ttZ3g&E/Ո["YulBB+rWZ0@|mccB:P|š4qchPGG)Ca2-q={gzP#cǨ9-5YvI[///ETPITʮMnݤ}IW _3Ѵn,-|{M7dYt9?+'W^d'S#p;UyZƘ۳K{y.vN+ĚYa`~0QÌ+~yZ#vT&ޖ8]kr c2 Paje dZ  ջKi\ڟ`ngzn~'NӭYF*beooo_m  WZEwK XG%aϞ=[>y֭[?wEmӶ[aa!uBH&M`FGGǏ߻wD3ƊjV|bH ;wnNT}V/Y,[|UMS!fzz:q̙C'r'̝@pJSQ3¼̜;//oѢEAAAԴiӈ\R4a2PomdNrڷO uIzyReˈI1q :2`$1>G-i\'k׮)ʥ8#ݻҏȄRhsBiD Nr|ũpÏUoْ]ZCsƲ+PM(ԑX#TQ#m .Sa+}xa%a!jWڤ!k|fs{?*3I?ۢz56բbcꌦ/M@M3\CMQj SW.ܭHpU82ƌ`}fzG(Յ t"W=u3\K0u6yӏ{tpp_ %7kIٻ͍h΂eJFhl:bT'OU,ܼy/bo,akrze&bgc'T_ɼΟ:L?HjI/W~$S˩ .ZYdeR=QrZZZn4cd!Ĥ{Z΋fL6e]%ozt 뇜^>uTD/Xёr%ؐ@8=1n۶-%%ЛH5џ<=\m޼Yv.L0wӲ5yEsLJLl7(~|#kCDsnn.CH= ~qnw+kG`xG$ "jkk 1Ϛ5Z|9_Y~Mф,a2g@zPz +-=H4,\]n?m?cx T;3O/*}JAR`;MAʐ&1rxixy6Nؿc Y%O0_bjsCJlm·x]-.19/bf^*+`c<DŽkT}@NԤ(UDQ*Ru<20ON*kb.Ӽm/j)~*aH=l#$*])6Zc:(WFb6~6~,i}YpۀVz|{ ,ƹ^Mx6Mi3M`pveosg:l:Oxdo@aמeࡍ.Zx r5PVl7a4 wSBtᢄZG2J1/۲Q5Q wE~ !p[ Swc=+XĞnO4Wy8 Cף 4eL]\R,3,2Sˇ2S!1$L"* >qӸq3Mc]=t]Zk10}UUǃ&u>չ<"KnpԈ1CG{ln"zPmk֬!8]p!&6~Gm1G:2 tvb{rfȰ4I=[ W\IH+rk~PyRcGRUWWJt@8a_6ݻ:?V7kiM[5R5 cQhhҒ~\zijjj222iXr$;&s{psj@s%.)b䴴4Z "]cCBBŋKE )YBBGZ^m;m8ZiuV)75Iҡ2#3g3-ބ%%%scYofvobߗ,rnn7ݻG+uņysf`9%W+c1֭׊voG63uCq%n|7 Z SVHЗs{5pz;3?9>8d&xzŏ{_Q{$'-D\$k:o 63Ncpq+2 w>Ԉp7^mSIxWhSSaevPGX 0I ➙xdg [4(U˩3i]6X!u+O<~> D(wCV23_E7ZVvw]={1SZCfjeёHpڵf;O5sKb^ -^ڝM &#;t1Zmm+88'&6!'.++ɑ&&&R0QgN`)/+E۸L5w!Mf i&DaR)by ,ȣG&͛G}ԩS44?uu\nJI݆_Ϝ9a4Ǎ7#R7Qٓ'N%NNNrqS3VXi鹘 4c}}HmZS4T)]y,#mۨCZ.V[A-J'V}4ʄ 85?oMLNK9wߙwd, 599oޗv4)u|_֧Gs4tʈr`O~O}ԐMg/f!܎Xv kuq8r6pokSz ShWL=l # #+`$T*IuWDžb>Vp3Zlk(F`ektDRl@=; 2Un-!m?^.W{T aNĦyמRfn<ǩ]kz_~,;Sy/zeԲL-2SL-ˇԄ`Dv/v' 89tiDHەKH⒒RRR & n# LOO'#0H ;'Ivn6W_"⨨UVi%3NIhggGJLOJIB$i>|خX 뉝i1cƄS'D[nHEcBFhٌ4fzqꊦsRٙ|ے%11İG#kxi &Xt@͍PرcSwNVլjTMXܒ3% .3L2"rrrC=ZIд?1~NRM̈́ѣ&5 ~P1,dfQF9OVS|SX.ڱ/ŋ^xK̀"wٸ3u߹~lt2pkv,D|<^5@.$&b4<,(ܼI;-&5E]]ڛsYR[|w+0JOdKb 4;Gq*S0Պ&lc@͌Oh̸]JRh) L)q|.DV3Up%|3CS̶0  8߆y'+Ζx"Wa3tWfƼWZBs9#z aUgr%b+|͹ '+cnY<Oo,2S4/zW.eZ>dZ@~S.)"Pbabψӻ!^u̚sNy 7pա݈aa&vA@ÇKxU dȸ.c:5G*9-C2wܴ4)T84$`'VȚNrO#A1p젅A݆Hi^UUUD+W$L^9vm*65fJtt4L8LSQzdte(͂=qO޹:((((-M2Kشh4&NLLA 䥐j*7uKS޾lrz) .9+'$b54 ~յ;?xx]uk<`Jy]>}^ro9P,.G9p<3|`|3a~RSXl5:/R$+NTv KU1 PY>׾htl3g>~lw^"U:wmo{`Gbflt12{̙uDď3f̐jbO6- @HH4J:oX ryƲ/SătNRq39fLEN\I#ՁƏS]9fD ;;;Rb|WWWoGFj^x8z aڵk؄yDRrߠ2SLʪA1pϚ4٪ŋ;~U̙C ~g-E}۴-/[jލJ ^|򘘘0Z#MƖƴh&&&R=2)e-͂HܤOZZ:騨FYX C wD?ÛMՃp{cNCۨ Q=_OVlAeq' W#?rm~'"[uM []rÕME0V)|2a a|/*%Ϯi`PTn`[g?U5ǹ>b7XF#`atպe=+3U|]n:Ϯ3{!5q1:줽?@OBu 6hh*3TDuW=osui5H3__?b=xZ+?eL/SL-!3Բ|LMb63gb<{N]55gGӇ0мovM}bldY "eæzyyIE ?<== rN125ߨπfw8p@ʣE-KKKy%OHH '&0$ۘosaޢ5tqĉ4)csV[B~@GORPZuҠ!!!$ ':h 5fw5]k*#(#jcQ3yssIBW[NHyfM6gji*Q^d iܘ1 -PUi=128- 32$c4aN|R7}gN= ֓fGW@t^\\!%I=cǞ42wH￿/PO.c)o􈋘v E5>{80 otrU-7=c+?gc9o?O9{z^KK|U6}r4ƙ$k#c|?z aX0SjU=~{܂]3Y+aԮ`c/kcv^|ήԱm>O'2BPQ)3dػ]{(! !Z(j ' B4e5Ô wUmkOi?1)6"DڔUE7el^=lRNVg#;5x:SݒnQ};xc"3?#bS޻[fjYdec0oyt;ۉ O"kb7^nZfYNC;chV[CUQ F9Osw6ϸaDǧO>qDrr2A!1`ffdn}=!oG86%%eܹİt$$&&0ut?KJJ{E-~orE DE2" $I"AP "I$ɂptLc1`ϩ+ׯի9տ  Sc2jC%ts_OO/??!!!ȞիWSc;eߏgeeE!*)) "2 *؄ ״Fo;i5(0&%ð$}l[\--\ ۸\|$zw+(3‘QC*aUbxq9%%%q8}eDd W ΃QPˁ'SPتM|ckZ_FYEP䔔۷'WV̌KIIpo=8فC7'qKޢ$b͑0\r0X.Vuu{R㝳4$ PMFF7l~#>зQV0~'-G $h BD2d_xQPq3 ~5LnL( I c;׼zQ4M4e(+BpGj%`q8oFh„$@xR^'8 QbNI<Kv[k%o!`<[0!K%7E'8$m?Z;^,I8z-5cȥ_z=q?^TR3}>G܌aTww#䈕Aw`j;SYaXf͆O\&e(1M]]'hLi3&1FI4Megssv%F6,**B۳gces׮]wFF '2`<^Upt<qS4ϰY 3DHHαŌ{t5茲2cl)^(@o-UUtw{{Ln {ر֤lTVPPhLdUwnF^S@tB A\ 22{zzn.،G,<,PvuM1bǒq3LL:;[g{nL.+,8ٷo..׋Q#vqq1N<"U [$6i]3!O3cNsf3p%c ߢA?x([ӧ=z88ӧw> ~|p̷/іխo[8 0;a7CK4nKP~|5&ڞp W9NOey}HӂanPpW^>,I-#^<~ӻ{e+Tn˧NKNܥ쑦rkR^>r(\#o@~wQL>'ٽg5~Whgt8(M0%SI3/B!k4~rZ#Lڈ'o΅NȕpO6+6S2&Y4z=%HB]dcC(4RیFja}2PXfejvcejV/;?Eڔ2a;o q2222;,rS56|F͌CvO !#ݻ y<""ѣL2~-j#*Ȫ7 Of>RUQ9mr`c3T+dC^y )bE+**Q&~]]Ozm5'0GvpXp^0 ^QQ==jfH 8CCf__¯ג%a˅JK4551QD=1k"'CܕTAu Lx5.uMG!%%%??k?)@Pw{?|'{_>Wŝ x"/'ξ|H~:p:{w3x~w-oR@\=C[?NBNI Mv='|OG:s+a껋{sCbbVj>4e߷K+Vݛ>]XRT:6KX봮?sK꿽{6,Q_Gdf[-UTrSN 0W؅ipOG}!j@ Բ|^J(zPiOW6% ɷ)Ca? ;!ց&OfM]Y\tg[uL.G_ RBIYaԵ ,S25L25+S#UzѤzKϲPy %>J2vc\a-,,#-]ԡNOO_~=06CFsww_޺|sfP'~$VlL('jq5piBL/ɓ'QN*^||)AiXgZ+'ɩͯlL_SN$4$233򐚑gkܱcźQg:=A]]gjm4H"h?ӻg\SҒ `~ٽSTlcЀ+UW_C7n\ݲeSYYÂ[xOg;vnZ0wy7>a\ Ui(2vpS]*=?˻?݊ob?rGM8Ee2G ?ǝ+UΓ+Gx7_@wՃK]T G `H<X /< R.觏;dt*-(\J0tU'C%XXYaejvcELsMu0Y9zG-cGXSPVVVۋl,iffVUUֆXLXȪHkkk$;dj$_<0Ş||tLȶ`j@#]""xp$wIOUGdb3uu.Xqhäc2{|ӧ_ #h^HNR)װ&pFɮW/nw5};jMw5.Hw$R$nޏ*s~[8=Zٹp̝T'ev{hZK@4 / SzL#(V+SX|xH=0j{j-ѯuAv $7u('ќ 契)M,gFMIv*6~9BShʵASz3Qۗթ$lՙMs$L궙NyLt-pK#J)mz$+,SL ,L25+,S?ZRItޭ^݌ljgmlp2m aV+\]]C҂tkHNB* BcPɩGDK|>{!R-,j*$MuR+++pqIbmk0>m4R}ClXRR¤FEGO,H aÆJٽ{bK<4 888==e? 2XOaݥݑA/.>6wvJeKEX3c˱-S:yzzqMFfc3\STT3z#CP yR***"""pD[rqE؟:Mnb1Bf2{c3F|Ʉ.c00m SRRkP^N"طX9/55U^=⩍u?uwwznzޔiNv+x0ǧy N綅jP۷n9ڶ a !BQw3/~u~ixc,r= {҄9$4=&5ЭY?7WGAb ^NEq7N]ᘅu-:TeXs钅 fkjWͤ{Ez@]@tH;^8حCCuDHSYL)6 >R;>BGE' al; 32 T&L[M ߥ|k S5ֱL 25Ԭ2?7eooPֆT}ђŒǍEHDBJE"C@FsiL_tqq O RmS> z .yK@ݶȼȘuuuÞQUPwww㫷wD\/PFM) kɒ.u'N 6/Yb+Rm@rtC`W*o(?S]]C B---\&.,"?ce^tiuu5Nvth*ƅE@F>ul-|biȁ$j0t`$!KGo(CM+v,6( ~ @h'KEVo)rWWIl1j^ЏnH1'e_* Õ ʑ'(r^a + \;j 1[ejB2?\r%H:( 6+Dom=6'?=O+x;du&88+/$.l  dv`t0܊4SR-,S 25+,SzI7WM9fff"? ZYYγ#ȭHȧxHi&???-6Zz?hm׏g:b$AF\Ƙ-Z80/?I`9mͮ] Ki[X(x)o5~ZsAVzyy޽ 22NBF}+2/f#`FFFNNNVbV9? G8pYz֭---8Mlo}PNPFF|qyu2u޷0/olߪٯG/wOfK?> |Sg7_?1Kp5Bu3Lx z` XAOwŜ܏0X7Iƈ/9l锐 𢡄$]x|)tyr/=a={B B5KCTA(8-U|p)lģ vQӾT޾WCkH3. y^ @vGc)Po;T"[ ^ /pׂJ#GoV%>"X%y"j Qc9~A.I>҃gc-!T!,Fpׅ: Sh bU, ߶WY!J ejVXf7Yf{ba2&aaa;b79aUl>H[gg*?e0VƏ_a~35X:f͡7T4>b=lTgLLb8 EwyM@]BŭeݦoG|Z#{ P pv:+@9ݑoܗ3.]D ^Tv˕7QFh߲I C" vIl=HXtP?ʃf#s\j~xtbav2MMćS)ӂ(ԯq'~uZ9%rq߁ ;S8t9K>;(XXYaejvcELbڒmi444G''tF$!# Ο?>22v4}kB*ׁb&PRGPF*['+a𠑑.ULL d)# " "#Q(ȳ!EBD4 3[]zeJJGGǵk>>>6ccd<ݽgcWV[֢EPsLQMOogyCy #CCCkkkFql$@csGp?5g2~.jzGooɓ'Pa'!b< 6*PNq)9)UEddqNw& Bd%E҄ʹ 0 kb%i_)m)/Q{3oOٟ?~?r2>ÇoϟwtkSMLJ=HNg,lzڜގLo?.}qm"]sة yWPzcqQD_3EzRZʋ[$藀C*"b5 NJ)X sfr0*M M8Oӏ' r("YfCR(ӂpU|Mh/Y 既0`Bؘ֍hҤLhK E~RlG=nK$@GDoP{J4@5͋KA o!uPHIFS˾ X?&7JUH4isC\2L25+,S,S|KR?TzcdQ$j"gT(v⥜Tt…н{"!Ɇ 6.H]$XTk׮x⌽cooo:&g5)~ޮ CAZ rqs0` 3u***X񵩩iyrjHEh#{677sgjii)6C>t}JJʑ#Gd\H!i! ř!rc2?H*I%/͘dOJQ8peȣ[C7|$???ℐEv"FFFfeb^ȋbbؕ\2}T^R)0K*]6>>^>]#N y{V`cֆ ¸xqwfZ[Ty@A0<}u B_3t{|MI1>{<v$w+cNCc043ysbjs4kܾÁ!;&A (+c9<:-Kf f{o_qj!;`)q.trAXOe. ũpi2U` pt47nhys4!>RjDklxteQ/h1nGZrea8?AEx5+1aȜO]Jq}MEZjISrFF /*Nx\a'+W,LGjnOL$%p io#Oyܐ>GC٧LL}0ԬLn,SLwԐ |-6G^ աf^587l _ j[WO 1#"2䈸,0UE[f(|8^UU5#F84ԺZ]]ݶܖb'`E=zuu5)~]q#wڬ!q#ף&L7TϗGHjjeqjL/!d$*#+U'&cMrcIMG G@&d;䏍 +3tЦF+L`:3Kb2rB191Fg\Ol,ᡤ4J.NbD ]ՁF6[CySR?[{֮]?jlISlXj9X/=ևE.Xk|# C8$J,D!'V,պ$dnj 'tYI?1ĕTVlS+B C @# <}-}Ju(0,shV.$ h h'L,u8 t<P$ -pQ+PG JsZO Eh$ֻB>C=/؁(ܞ<_biHf"7T tJC Kw"9BA݀2&M8&.K'C9^je |w+ǽ\q遥L2d|\&Onoo)*)5ORd2uP8#8CE]߱&ԯ0T =,==66UUm^=^ wu|ft<;#xqo ]9C3à8"`/gM=G#O#-& CՎt:&TiԪ>T}L2ee125+,S,S=1"E}t%IWFر+!!t׮]---RS܌l͘ޱ!#':̫}6]m ؀i;MZ;0`aLI>URRB `A5 R%n\\\zs:Gvrra8H1iG)#8aNm۶"K2䈯ItF-eAKOq\+QD{3p'99,/ΜY9k OqNpvvFgp-??Q<)(!Q`cSq֭[qb?I pjDrpZ f::ɗ*yFl>۹/uw?}z?8f_>߿Nr-ɟ͎?0pFqp/]r);UwV#1N25+,S,Shg8[v6"sWW"ݹsgz:Ξ`k.bXt&.}Xۣ#)))?;'/u'찴aJ˔DDSIkǵSќD\o'J 3O]]]_Ao߾}wFƷc={P6qI8s.%QG%p3I3Yҿ[2IpQYuDgmq={txxD\2xtލ999FTTEEE111oFijӜ9ڮ] foߎ06:r퍋:Y`iV455)ƄL^)$ P9 A&lnnGrttDǏ$%Dt5s9P< !]Gg(Fϲ b!QV)3 LmO:?xCWhj|O!>+>~xASmO_ܻ]kU |5/ |zt?=H) X7:bP$ 8͑|ǫ RܪZgntVϹ2%թy"I0@B=Aᵨt9h6%9xe X~eᘪR>M8g܎Vl.:tX}s'A n>r: ѳR#|P4.>*'u P>#BP ZO^,Y}, 3s8C$|8.꒗Kp |:}~D FُߚcAAxx8vʤSHykܿСCx$==, ٰNC͙Y7NȰIZZV~~NNZ%ZvLJksvU? bۛo_K׶zu,U5|mNuN[+A4,,,55 Vu*̆Y 5ŮO_?];H{Ϟ=mURNeCf8!JR'#TCII  V@,/_-^ L= &s9>w9?:ˣ2|w6}w/߿yr13ēs_;jG7 @(hP g:3Nh8%mr['ӌ^Va>iV`: 8wB7ł> 8A#/dW:?r!:C"8+iE+&A$/I1=3cfrg{@ے|DžclL2uFYaXfs\[*{!YQW)yy]a2ȭ q:#:rh ϔ ^%KR",2 ަ3յ(ؿG$ƍ$TQ]qeYnϽX;#槡&'a'''L :&O-'.l Ù4TϬk]VUDh͹dR1yݏ+|*D{W/ƒyt Hf jE]w<\6}zzuw:}j%$p`Q[1 U18/ Dxjln@OS콮@=r|MjIQ!|$jMR/LPFPVSrZ l9e457R<@}CX3io+AݼVCOZE쪪ĦMAA[[81B^raacc#cSP7L0 24L-K-,,45Ce2x#J;CB4*5DET >q'JHTj˶JY(Jө-!R&čqQ8qfA+vڊ+<$Q:qS}ajSMx[s tjcG]VWWww<@H\ޫu=}[zc/OKT!q͊c6dύ4r !Y>|äIc7DM6v풸ϮNXkwX%ի>>8VbOb]}S[u:oփ*U5o84N굤p.t?hkO?=~a]$R;cO7r+#S]4 D~(׆F'ҡ=o϶)wrպWeNC}I%x=GQ3v$fVI-?PI+QOt\ n _bL5neٍejYc6"m<vHe kg"p|{vXZp9 ҈i\.WSS!;+RPP=#@MQ#0"#lMPT[Y\ SH(ڈC(F,ݻwodd䰬aB1  JKKbbbRSS= *^`c xR}$b&:8k± xbEE/Sc 4c* ' dCRƹ)ih#[f&8pkcFUx8)kḢu8G%$$DAW>]jREuEC W#Ø蛒7sK2 5`Wf>2s{co[lQ-[U[UJ==cڵxɈH}ZNoff/w^mѦڤ7'SH۴!@68pڻ3onwzЃKsytS?)_ ΟDyAӄGNrxd:pp&\ {qӇ٬V{O}0{xRf]{gBcNW='9:.u<3gfC8ޱ!VϟW3~Y"Yq1@+B(本,LSgk%4t `LV) R$i7"z c~V1҇+/ŃZ=Y9i/x$L> եRSEз֣FI o$HS7;LGjnFPz JQ*qٳhp+_D,G2uS76L 25Ԭ|LIpsyLvvxTԏ~<|#G"Z#-7B]ɰ٫ߐЀT]N[mLZYYꊤ\L"&6iV &ݷ9_bb"::L,6L4U#eee=ݴtV,Q6XZ`%/cxg<\3>]#|1*K"qv)))w5 $KLSK0nTIn\FFHn\hѤIEEXñXaSܠ)*q(+ܐ6q$bbj&l.gAa"4B9SihNӺ WU-  Ѐ;-(Χ#FVYx=xow_xa G,ק] k8,D Ӡ}&ԛ@GjAv>Y4SS'=. eU&wTh+YxK?2E 0Sh6N]EhA1[lͼʿ ƲL +,SԬLfjS؜RD-/u _X,pL zEuw"!՛Y'I$ܶBa2˵\wÆ ~~~ul&-ˤ~$"ؾɓ!!!Ezƒ8#0b(t^cq"""Պ616 * y}"&S F =+!l;_^^\ :++KII @`{@W@X@r C5@MOB]]˕9.#}LZBS05a(8r&XX*ӣUnʃ}"IvZ/4h5 @BX!%!2l:WQ˫̲wX9sfi.^m1^/rYw1@>p&@T]3>}?ȅz|{_Z_Gxz3 7it6|ɲ; kG"-ue# [õJx~hp2s w8ѳ'ݍq ^mҐ0j@FbUㇹ|P3 %r Eχ(ly豄 <9 8 ULw&}+^xnؼ1gbm)ָc( Ƚ&n]{qdO[!IGAÜɷnIָxyHxM({N @#iΏF}~;Ve܉2dhY2WLJ)M}M!z* FXH_Daj)S4=v%Kl&Y=#VKb4[  D_o|2ۚYfejvcejVCY2lE# 1od|522Bݾ}e#$UP555x# m}twI%fC őRO IPݶ߿Jƅ;TSS;tݻ۶mH`{gNTa=+V (xV⌳#vaM+V=z.==ҒAW 8%ܩMgRlkC}>gX޽pX zA0\FI߿u7?o>4pa {3 NG/x { %VNLs6<3w*QMD`y4hr^\UUVKUa0lP#HY|Ppf"\:/>僟8x18 OA3}yAQ Sl!G{WG,nlAM5qX"G-SD `,s_F k>Q MT>`-NmGy@pxBǭېf*6L25ԬLn,SL0)f)))1F^DHQadH˷.FƷNNNL1 ?Xw"N\UTWLIIOoJ6EATH){  BGDF=~xGG 3,)mbacǎUUU!~up%j[8xsfD~ -$ӳIf++v܉ǑCsrrɑq555͈'-f%UQQha+^,NcFoɈ]s#Ae @ =`a!!b5-+cvvv졩3"`|c%',m=0ba]jWN ]NJHHTT'R"4"D\k"*R.IIrqga܍˸3i| ~?cݫWJ!Т` q.+ɔߒ)?XL16}jF55(іj !#rԹ+ WcJKPm<>4`8$fȜ\Z:!kOyxieFYϲ>G? iՌ`,Լ35LLMplݺu7NVV'|tz1f@=EE 1=d*<.T*Uo'ȦG/0:t= \AϺƚrCC!}igՇ޽{gSIɰ  g-E`<*Ʊ;[3Wb88Zۮ8X3GS)DO NcF}M-irȯ5DuQQ~N[=\WwC/#2#F _t/>O櫟^x]jf;ԕ|u+k̈ng7=Mj]]bWPs|s@ZAl3dzeʌ{ٹl=Ӌ}~Ǐ8oKgq̑mζp/eƹI~gZcρkLƒ gjx7yԟ֝5 $BGɃV +«_e?Bvqq!ں U>X?늮ZZMi 2㜎HqqkiAD"~y/O[rѸl!dz\1!h, ${UVYYYq#*WPn"RNHHBܑr&yH Ǩ8YY-..>}:EZWEjwhO<<<+*Ċ`rE f.#;7o& a7ttK 566vQ6JY=G{yy8:Vή-+J\A&3)gn\N`747glEkuttt+S+B@}Ϥwn /|LMCP/zzL֩x5R3݈ =å2ًS_=|ڰ/O_Sp5x1^m Oű|*q( ~Q*j^<\M=ѡhfb'*j+Kn5';"WaxFiX:B&OvTb/H8Q"eEPl9"lfOjҙ"d/{; m +!Ύ\\o>9=0QBc2IC݅yv:v01n788FlE/EEEٲQ AfSyށG6w~_W<#gi5y `_ygj~㙚gj>gve%Aٖ vgFQ\]VmjW iGbcSRsss զϙ3s  撚Եl\/~)+"mO.~ mmsS;F^7//tDx޴i9244Ȩ[a7NOLhYaTߨO}~@ӸvBn)~ŻwIng;-zMT7i Z8;… ՍeҩRRvrr4Y "Sb *8$$CWk52D54a9ڙLMZnHư$Dp@O:%9b z=@m%SEzoinD֭#%YOBN]?,Ìr-:O;~-8 ݹ^xwϵ@Ś"T{QYyC;W>|_'&{4_땏rFůMəo9Kי=q3N 3as/^K|pA]sۢJ Y,y,WVmAի5&n1CWhnC%A(ш%!|d9H'.5X` RTPc%ިpXM:jb~W%vb Vbʚf˄vH{a9BU1I{pymz@7!hg T--^,$ۂQcju~~^|}[ ^ؠA<}YeZ@OMpT"9m??jg!>~˖-k׮uuu%pJ`0f&9lΜ9o-ZD0p(%XGS*VWWyxx&''թ!'MdVoXI_ڗϞ=[MJ] Jr[,\]z^$Uk*y-.ygZSEq`KvDmlX򾗗׌~ $ȣS%·]Id04Z1aߙ!r(H8&+W䭸Yuq1[Ujoo㻉gUSjS6+8Tdg$nFJzʪ <'5%KFy%M}`⋲3昺ժ)=u2\&(sqNf٩)F~3oof].K}Ҿ]6wwo ']8]%& ңfMj!z{lċd_?Z9I;Ixq6OиВyq|UYF44~oarScD"Ԅd[}p#/]z);7aHs l*8*ETZa/H7<֔r0T ]FÇ98 s઀x;T)sʒ7w& ƙ d0{bQOPCJ_m=Fԋ)?sEb GτXB&G֞K4oݕgg`,Լ35L5<ʆ%*U*Z:hUM \t{o!srrlzzz}sWZEh,k %ҔLLLcc#kwwwss*F;wJGIZZdmdϵ=i(VʉsqoNyǤ ڢ/LU@UQ^Wzp .ljԊQ鹹aaaly Crr䒻N=&94[>PFG0ʰ:źe'4Nxe%4ciNN!]xPw.^ɢ477"'Bg QLu -J-&P1D@-NgswsBmz,7*>*{kɜ$[}} ?k?jwϷH$y!E2N ݱv;3Bʌ˘zx0q_3"VNVQk(#䊀c\*;*#k\HfY!Rgjx$噚7gjy@;'vQuP%[kIm4ɽ]R5`}9s<="""YYYUVV?>!!!>>@wrr2kAaaÆ#g͚uȑRBoR?jkM&8sGt\K_X*׃zB%ǓvQ=J2×7'3 S^C^ ԕ>>v/=~|\LL֭[kjj Ș1B\aa C _(O%1622ipբ97R6mFشi(rC$ Jߥе^~݉MMAa{F&=JbE׽hƒpTw&9*Yӧ5)783}nݰvG~١=+["{q=-<`Nlz \uxoOk+rd(%ի{;,7`-7xfKK\Zځb,. 7'a8 _C%b0DP@#Lekƨ"Ӵ`*#3{xvw/;ı{LWTҖ3L74[`- 3p)a2xČyfg:ԙ k5UeQbJJahP~e=)M4A~ZZMSLi+u^8ݺꤑs~j%rQ\Z4vNBYk…B1Ɯz :8/|$W#u~I$Kf<8~Aeϛ"N4zf+S?p}(AVsqo/o޿yjWDx5g1`cF/ny^~&6@k_=RA~Cϸe"'/HN:I.I5pH_v؁}<jʈUN87FkCAGc0K.5 XN$?t@<"(Qnd_݊Z[*(Q'L,A=7 h @~xoawBD44tľ{#An;E#!1ƶL3ew9QZtBk5&hօ!(txW*@;AjT噚7x7y;N $_2>kq㪫˗,Yjժ1HK9:tSisRّH$ISL  '(RJzknq^7V. U f1Jh=۝@zhh(WeMy,}I&M(@@ҕc756 M}jTJweΨؼy3ɹs̩#Q^pXohL{JJGv:(L=%/4RvZI85c"g)ycDL7z^h;K#ht^'n:˛3ݵM>Z"m1M*%TE ~mį0QCf=V+Yw_`p(~lK1ރI~;0jm'\)>;dqtip^` pa nfBCP#PLPjXB:y870 ez'6kl6S=er &bIm|뇁lp~oUL]]W35o=n-0x5W^@,ޮbUT;Z\7Ӎ*o3XvRĎP۴ˇCZo|] S&G ˵q͖revtv,!jTPi%|ֵ-Yxt G1[D8#Ss=4 3r^xKP/qsckFYnԁjqi r9,o 4lrZwpGHM>Jo3\UV+;8 RD%F=w-a}?~(RaLn?ˡ>M`k:|kBZ*Xj=VZK)_kL35Լ}~̨U]{)JQM|0l(e)Yf[rԫKIIn8ݨNuۯ۶FQV}OVl tss#LmZgQ]]=m4BĄ=<<8&ښdSC^89,&ti 1B?E`;r")tj]]xAxĞLjQ"$'' KP:??%{+snEr>dϐJefӢ]w(֝JJZ((*[u2'z󖲛-HǢԸBC͟#b899)ySwoGLv+S/W7a&nZnG6IpF{W_w¢CIfD \r-J]qowd6km|T:;P|˔YA]L9܋ŢGXR{6fů?o?Og?ԇygj~㙚gjs?x$Hh;͖(-FC]Y)k,o߸q}<7}Gs\L$ ei#ɏr~^^%mp~j///\7Q.[@}ƐR03㲿hsrLLUT $tMUa΀dm1ۻ@7珶ڨfԪL6tGzwVRRBw9+AE&]ZP-C\%8~KUJUV>bРA\87߼w&R 32:6A3LL/y?++kΝq y4KNxe[TU'om~?Lns"#us2cs9(ϲve7"5> }sPfx< ^ .O+[fxhUG2C"nIHRpl 6uCpA1ͱIJo`I,ܝIkq]w ZWi i8ҟz9E_漼Nwd:B(JE2ٻI7q+cqT>\mTxgS25unMlX4 iEp~4QgFXV}b} 6k6 OO"_LQt1Vx<'D4IX"="fXme`_cmYs o3>bꃇL35Լ}L kRgt8m1s*\uVQԅ ]w]W/Wss>;:Ct@%LDبvHMI"(K?DW?cnY‰111-J\n CDLb&C-^m) *GT TwޙjkqKgϞ˶:u QQZߦkM;mTZZZPP[EEE ,>E&S  @z W`ZYlMMnqLv&=rղD fNxP-~s3{# xyܚ pbs S/ _rae 7a +zyJwo:**Un $_=96XhGJQ}Qn). P ^8amp8stdLV:EtJV0uxZx/Q̱,vCR[X4gt.q)T9iO~\ǯqEɽHC==uk/1jk&6fw)N-x#83k]W^.^ ՑX-f.#Z+Mqx \$ T.bUc|Gפ~y9\ҩS߁ fґwG`_M{35o@ajߺF. 5Xr"%~;f=)W;GS>C6OL][.Nl-~5ؠ"1RNдb[ln& DR]L5fe|'jm`?^U(y K]Am6B udpCQWL5{}7]Y}d˙hTIéAx9W=JMpr4Y.2X-aLvkVj!b9ҳShl^/bMn!N ;!UZ=,?(l9K =pm3JTgRDjH#eb<_1`:֊4i%W.93{Չ '&Ua3upch-@ߤ~")%S!paSL),,ܱcKKͩ@)(=۽1_mjZ+ eG r5lؚ{K#\6y AN[ }Qm4JDHz}oA+}4m;$֩!>3F;C#ph2qڞ ճoO">thr{͋J\v/p?yte+Z?XP=.Oc"YHSVe-V8`z![ t"vװcX>eE(Ӈ7;V$D&SV l gc _'gjx7ysf<֌9:j ct`| z&m֞q䟭[{ l6͢E#+Q!fTK&sL ijj1199sK) 㝘$hj @aWۍlMkgj ˄tV?5׵ww]5(KjN" -Ͳv:v(s5Hq5nV"qPv8jF`2u#[TNHd~ܛ7wtĎHXu2ロ%gg\NNj,Wٻ&8w<|>dVxk&x*cTJ(Snb_V3C &ҕCY֨ɚv_\'T)}>!3ipnHm&Q"̲,V{"}%꒎f6Ip]Tp=B*\p{}͋/ۣy$@{%d[)†^uk6E1L0UieJuݨX?u 4򠧳0K`:=e$hSzw76sxU#mԄU!UOlܙc`,Լ35L?fﳧk$$v@*RWP>rbsXOW/Wc=Qg Z $m&;G;Sdۈ؈T &6mWb^t>tZC0elK2N>^8zaBq!8"02\Y]Qd)))Y7V$z_19F1ua1uˊG jJN6mZ+"bMA:,\9 pn)x!]滨Lc''{S|ty"BJӇ*o17"-7pIV@_4zm %Tk .LgY_< nwo%sIX9id>[/*yb\5hSsgMn:@6 vk0dXK nMud/R;ӣ:.K|є`vT8)] %Q *bL m5pn jʩx pyʈ *HkPО0_W+کfU9lb 80_DVQk:%69M&R%35]_7Z9 57pA"UIA6tV, 58 ѝ|TV=w<,{|. ݿt3?"Ou͖^V--Pzu+[7"w7.wuc4ڡ76.Qjlj7k8Ixs@m~ֹ]eڦ; 5m,م@ʭLɪY|5ӧf˧+ ,xa\SUPkM NW=Cfo^`WGWiʽ TqN rԡّE}oFVS>'tS9l}s(s|;3&J[Mb=;@S}NL`60xgj~㙚gj[ߚ5jsJiuFDpŤZEχso/ATxWzd{h9 dNNNy=]3ZX&/TZ9eg›yy_dʉa;}#@#%_aPFIImW!AN52`i4`;Q!=Y}.jh@]k&t\((L:ne/]1x(˵[ۻYw.{}tɯ/o{JGK/TQ%8Oxk;3=pX$6^ kdt xKDXJ+_PuwAWGsTHm:''ZnT0>KO~.vܭNosR޹<(VO+ _lߟٌӿ9!~$|O=J)/Sd0u1DŽ:OTw fvsX!p1un J¡3zO=XOY6 q n8Gv] 9^zx4CnyL1$K/h(:15"-nGq9z LW5D  Lq8 $*>YY~o$AtR]H> 4I迼mSSY,P;̰1uL}qS3gL͘co38ɟ.d@q]cccIk'd} $o/- W=_׭[ǽw1 {u'WPhݩӦMG 05rm<˸–W iٱ9Γ;IR1" UϚ,4δjX݊c7R0\`ODHȨN 8~_Ş?3 y-%-9sY=ZUt3+=al)bӌ1fΘ1531Km.ᤞvAh~E&SJpےPYaQ/r4 KNvtM § ŁEE]|)\wP׮SLڿ+qU7L '9S}JuRO+Jj:D'dgERlG8(yQԟV4>J%`U #L] s;> 7+ -Z6H,_4wsF|Wܬ ;M߿ZPX3m}^y#W΃V4GD]\kl CYևCr|jOlc*»z[ qW\ݡ~ڱ!=5Bpw:5#wo3$!T{GYba+mk -kSVLg]/cemU(ҩ3hCm ۬(H-mE=N9k!.ItG RAc1vQIIr1' ;Q^DCč_S.SF>]1fΘ153%5_cFhB~`WZd]P̙&&v0]ڮY* 8Qԝ9P]ؙ [!655rEKno|rJ -%ح䖘]Րl$Cx]*s+ǓOI.`jCGIAAr#aA/!Z(ԸS֠eíEd68;G U+FBgt6h _۾1*Sƌ1uLĘcj挩S3IZ?\oc#ݦw{Q!V֩dM]A$yar}s@{@@ǶGhs$LUή@6*YAݯg&&M'8.655uSukG:[\կӐHSZ)Ҭ6䇪Vd?9[-:4G^o,cN!ٜP.L)I_s6?[R7|Έq寬u?vꋻKɵ[[5g67MR/mݲB Ie 5[Ճ *ʷjy=ՋNQC`>&`>IՍ,n$cVyj/ fc) H_Fs6V*;tpߍ2!~oOD h3uR)bĤDS3gL͘cJԂvvޅ;]/bg73 ?͛uo=.hHvGA?:{)^۶PB C4m S#GlLMƑ;|cxgQf)?\vB@3YuZ48y&ǃ<k1:($6BRv;tO֕紓M$Iܪ&8@޴x" 6`8 |6S7zU7KJ+r83,uRWDRuwFxix ~@.Ib[.rRW#j1?<ݠ%:|c'2t J{0:nR]9ViSXaTC{ao̴7ʟz(MhEm-Mʝ-h4?JFu4hͬS3cL͜15cjf Zw,%b7Dڼ:|-L#4.HZUsb4Lr8玕pY7 *!ʭR\ĭrئĸW*Uô:Dl$*F]sH7qFGAp¾/qގýI[F(Bt!D]B$K~nvƙ[ZkKpWlYQ+)L;WV鸃,T֧Bd1~ĩ .V'Kz.UbA2MǴReVI:M N1IÿK[X]8m쩈cc-&S=:^EA I` EF|GG.e~`02u2cjfS3gL͌15co)nB(#bt 0h<.\b]+KL[.wAm]б@x{s Mn]NۦX)d-š& hHLսkkZ/+6x OZ`.~ V8#qvFeg,3W^vs7WHݱlpzy{\ƣ康o0#Wh6#Ih'Dsajj*;,뱽GDDϡC+[*IUcYQ!=#TX`嚥nU]έ=#D",+ݾPON r-G|=E=s1Pۦ8k/ dxٸ Ֆ_ s1/cylW_<:!;G8/8(kO~ӞTOě3/ (A;5#l1Pд(iTZ @*b *L;/DNA^H@k!LWJӶ- O,)NcGҤ|-˽|#>R'mi뫪4*!ퟕ$h! 51֨ W+\s88޼kakcAO)/m z,MHyIy/g0SNaL͌15sԌ1.etllիg̘0y慅L81&&&<#Bm':c)uospdx 4/2MJN]{PN_Fͥ~V*^>5q@ O{ FO`h`9jP<0l  6)ГH;6xkkA]hH3!VHBLg\6AO)#[t롃<۴joP6;\@LP%?q@ w>@+Z(#R+0Rx!+h㕯͓df!J{!U{p6[c&)14^v>!7Zl"W {X,Ƙ HHD6@JDjS5+"}Is݁5x5$eY@"rvd3HԧRN1fƘ9cjSf35133 Q*111UB*,Xp/mWpuv$fSsxWDg}MW} |zϱkkKѪ2tE@OM2u 5F'4rfpm-&[LӍ(rGZwiOcݮ)ș`kڨTI);sfE[]BpXw9)=z8gߥQoҮW()~xGTg޽|~O_=zwd8A yD涿7*cfFdY`C A\ҨQ:yf6C#Ŋ8$':-+pGrZg4~,[xu1Ug=w;ؚj@zk/uYfRSRNeL͌15sԌtL]KLmO_pGjjB ENjC4X 2U/9 [Tege_3ט.H93r!ųsǪ;!)!2ak̭_s\^{W?jՕ?51O4{L;~v8IM 4%؉2r(v;A" wBUgK>h06iZɇ1OEPSWAPϤ]A݆ԓ q%T P/ eaRcS3cL͜15cjfsrrH # FXdIf~f& bF|*B+- N^C0L}"|—x>^.m1\5tC/,ӱYqs&2N.Ux>x2b3,OzٞKs qu&r&*1 FbN­-u(Yt- B\͐vʱ"F+p+`6h Z< ^<Į @'1$JEvZW5FZA{e%0 tFH ie5ҙ4=Ɉgseb aڈɡ~:ޮPu@#BmLW 7PG);w-n`V)>ѩk 3ۼSN=͘cj挩S3-⿛WfY&bXcG:RԴ㶎T\niٶ* 4\%*I]2I7m^hU kh*aV# pn/Z1t炃fh!gx5}.%"{,T}_V*`Q]9=A󝳚ERi F8]=Nţ^p}ŝpϷjAhŖShܵ ` cc NIp ߐnA>Uf5詃Euk~Bݫf $D?O3Ҝ^j ۊh@"]uR!ĤW >lJ1 &R Va`sL̃-p7\{.Xm@y3a:ReX+ ܞ 82kR((tH2a=I0>Ƙcj挩S3cL]LT騦h|):::&&uykέIpYd撑"nQdj>V }痳HEx2)=ݗJMut&g!x]u+^XO7- 8qiz7|8Z{t-~ݝuB/VmܩIJaG8#" L"k 2q/Ao2d3T\I(gfaEk9tm@pC״VN٧Juv*o`FN>TT93"r߱|rA= %#)mHt%uXl``/}6ou/^$ Ci8N Wk!kXy}ui.g`BA\Gmip/o%U`2uZ)bꤴ$S3gL͘cRn;[1rle~ߤI\&nذFGCSCGI,Y 2?߳5Pr[n\ӝdi 5/+쯥ӣG|m\m?U Ug$w"g$7lsr3Fέ)h@%Egz=ْ06pWݱoк>cAryLs"S@'N{sDU#^r+XK证w{zhiAޮ{5|ՑwY߲@uQ=SǹCDV4}rJii` nƣp:c*yc,I W.nUsܬB(c[uqiȵQ FG+ۓX|Rl۳8WZN `@kf?q[:153S3f1uU~-#լ B "xI<6ݻw1cƨQ-[/ߐ!C8.kX.n31ub[,p= 1>gxN`zZ`TN9ΪH9LvFvNjֆ1!|B,s. u)PF;jM*yҌ |:JȌ`2u:cjfS3gL͌15c8nl^^^ƍKMM6|#} vƉRiY|?"WaD&?PZ_"׊)֘gck >1S)Mg%}E V.OFឿ).|Sӳ6O<8oOe»9]ͱCc1u!Z.fpAFU-{9<$??nx=R(:CuN68\:l6Go}VV?JMZ"A&CN#՝vKPqͦ`ru. Ҩ r4BףAy$:ס ڜg+N~ 01S3gL͘<$ZGsJ<Үpj QfrSbqpGݩ&n kT.{SSS T䊒\^J!S+~ b꿈mDX+$2P.4Mg'Q0c45#NPF) c6ڗw{Z ሟ`5"m x+%ia-CJ#f@N"pDi@#)EGqQ B©zVzWpiN:_뭎xꎼ81c!:"8k]fS8#a>ԑxu*-, ozbk O$$BzUZL}465L]+joG1IqIEGF<2QܐdAʦ5q4o7 nO;iHW<=`Yk)_nsgS3cƘ9cjfP͢<2vhaM] ^W9T7ɩ||;9={rhݺKS B~NawVWOBFͅdY>R;a$M:[W H\6КcX.݋XR}xҖw7EχA)z#ot5BfxZ_+f OXxԈ_E3!n\kN¤SmSbL0\jGZ}[mU/Cx4a N#?bxךe2n@nSQl>-i s.4$6M/@n"NUu[@ވ~'B\Ƹ#@F;yҋ 4X1ѣm H&a>yt`;1G:L cjf3fL߶B*/WDIik$(KK#<"a~ ̈́Dyݴaw V1֝4cn7vKuyYfxJNu'Yȵ#n[ܜC+ܲ@A%|ŇȰ!.8G7ї 0F5̱U3igtSq >^InLJ=μ[i-9njq8LmA!tEYj.ߨ_8-EL}153SWnXɘY)fjyǔdj3 il]=͊++j q]Z7[Ҍ~F{K/7Ŗˡ]D\])[[ܚ +kNJ]dGO (wgXnX횸"" l4J)iawE\ 5§9cBEdiwPu]ɑ }Wps'{@ w7]N54z.pFvGrs|5e2fƌ15sS3cL,lUܱQ>o=u-N0M4ڳhPqLFyZP)O~%SotOzl[[.;\{LGTHnX6! PSbµK%]iYv fCȊA4y y3uހ<_Qj]no.'TD`J@:\X0&dhq07hjx?9}^S+֜9+,Df`[Ljb&&Dh\?zc>ImOWQۺw͐\|Azܺ)Xj˿Μ@ʓ}-*^ |su**i걅畽 d@ŽTdC4Tj/_9kG.^|.!iHLԉTZtkBm )p݉* i\aF Bo 1_锦iZa{NO7Uu-PQ$V|X3\&D|7J4m =wiwԧqׁ(Oy6hZ;8s^ZN&khTق|s\j}`2ɬ`_H୆&5! a~0%0K#̀C qdE.i` 2RԎ1fƘ9cjS3yZVE-8U1**jᚓ5 n Y+]ʞEQKUX jKiE k枑I1)yp`0@@I q~`uquSD=k{o7 1LW1TI " =ZBXWq:GcDK^HIv&k{/ks3{ṍ5yM*%݇)#s/@|iD(a1W@6ӄ ds5K6 U腻Ѿ@*S^=-ؒ78Z>XT\ uwj•.M=Kk#gk3ti1fΘ15ʌrWIEpa}y#Ƕ:ghljljjjÕ_ժUznC[ r]WߊH.@Jě x6plBS^⎄MޟX=ޚ$c:55j#R8e-peqS\t%o]qO42kHʂq?F\ȍBKC;A5kcm  B6ҮrlDDꪴUW!bBA;pMg% }1*o/l0&Ӊ(܊ir%* JX{ AA^V!'3p掠FwWzj5db$ēC:]$hijkg1@[\>BljZ g%ə| e1ULɍX̘1fb1["u_+RɆrE0t6:jx)*CBp6,.m[̭Z]h:[qƒ4@CE!Q=Rk ̽: TY[s\<ӷ)+˵qxXͰ2; țn/̴{#Fuk&Z)O<5Ƴ!w$ETlhCH S{$c}Eͤ*twF?t p7]qGjjC.ӼB,b^]U@O tHr \] פsiDZs G!2_?5&fӋajK)ʘ?_c5gُ jY?KaB@>_co={/X`tdVF)Y/TU\-(BBE""4̑cawGЦؓjnj]"AF`JY0뵳.nz6b-oCo:b,AU8+~_<3ȑ;.@|LA;Gm)MMy_݌B 0G=-}W->*}{K1uO̙3gΘ15Rs_, z5jFGjyyyݬ{3ϏIrP>W'b@ 3AJiŮ(45s;Cu/,xKxw+5J穤 *nl]D"<=‘g6ۖ:k dAʾɆBU)HHo i˝f9NRT#Ӳ]|$,;\݄T0$<.H7wiųfH*E9:")B^$V;Q>WboفmN<nRC3.G\ꀝ/wMpLLq .ؑ!Yv7KT|l%v1F3G降$yIaB~L.f@1.daL͜9s,Yfp`y6c()Si 0 0iݹ5֒g8NMM2de7E_gN2N<]ly_rT2EPTSM.T"U7IqooTuԥci{Mx .W JV6Ɲ4G-{b hh9 p|%;TB[[vȥ|nϡj=VC #$8`wi͘Sd=1Y%nӘ]n3[j;œ麸^d]X,.\pؒ4WIMv-@?%luڤ3H0ʕ ;=q.L3siװ.VW/OnxeXrkT"P[Jq[cj̙3f:5e\333#}vhe䵤dD~`t Ѧj777̢b;}=*[hE|ݻ:[s<r[aE7Y[X-. MI;M=> DT9"O7R8w-_9ȲoF"w!xoT1u zzV`|('(]*viJxG 8bBd7=839v[k`'|{ͅϻו !]GJpKw4Io4deick[B- ԀoEu1c\kI֠x-cOs%C\v >΅*^Z54Bdn.+x:|vJ܆Yia 3gΜ153L-<[ ͼYܢ+:xsg">U^'q< 7 G`@198 Whd.iVȹ 4+V5R+DV Gw2*f[ $Kz&n foX |zמx>`*$0^Rm: TkʇҸkn Tz“dWUنhKҽG)$'^?a_yzi$.ׄ 6uۣʼnh |ڗ48h*SIӿreiIFg q#]&<TƗ7vVg1cKS_dL͜9sLfVj:?'5ADKd!#‘#G[O7Z\jsz;8r?QO2SDQTͬr|jh(3Ԧj`@ V74*5jbqsq]ln\yt`b;2u-m;GJNȉ\>n>"2IP2@t9,s:M<*(红\3V? ,FtML7 ݽ^J1K6EFyjpxR\xa' ֤qqV ԅYpYMh NzYY>S3gΜyiש?K-f?fi^We\.0 yEq}Xή11A1%v{CXn"{5j**(7Q bĆ޾q;~ߣleMu"׈Åa=v1bE9+gK>>>m۶:$,|RWO>Xk>7-Et+mlA_禥eY :]^َ`;л)&hIǻo>gNkiC57uDM.w%1{h>}Ֆ? kKJZtm.'~+,o}0^}MQ;> 2;>b4^[›bۉ&@]~-Wl.VQ!_ p>zF?if;|{H>8}/Q,hp]i}]8{9nDV vAQ[JF@^,ک?;Sϩ/\F pjSth4R&ۖԋ{9^~T%]|^q ~GVMB UKUZN-m|>@5oAoIx]R;=)S׆շ=2rщohC>A3½JR62nIѢ4m$q(_!Z;ЭzkٜX\$k5x:5bSTal3us煶t2=)MgzU3+ ݮIcգ7{A[we kOMliWV,o٬i3V檫 ޕ_艕0ʟ9䓗Xo*js rT[e֣iA ZvWCnt ,IhcAa45ۑ.DX>E[d+۪|rUS5_w*]+)Z4vėS#85SZ\BY"E^-4R*UVy՞U{a 3{kuӈ{G'ɩ~E' fꘛ6%fVgې=;AìiXvb-̠S^t=e+HQq|:پ$ +6OF,w<>LT,'-M˒aҔ3pmG֢T>k++aq@>u'akf{RVVYs_kYnժ5]*LK0Q&uoj%F Fx]?x;5ۈ]ֱC3j+L 4w(cE~̖&gV.9BsI؂Zzv*0ZlΧ/3@g220 E8:/F;5S7NFOwjuMr_D~H˞r<;m>yʕkԘթӨQ@ U|cZ>e1/\/9 St]:P\s:@Thy?6d. 3RL:TVԗ'?7u{-ܟ:Vv!O;ЪiG Ŏ: 9RǜVEóӈ2ޟNs lh5yJvfXlAbX霍ZUݽhG<w۲Ye=ߋRh ڟ.Ҥo1 ]#td-.FaTϖnͿ`8.Wo4w'2tC#klk:n/~Q{9–27&$59:&Zod~癹wfLrI-nNlF@8u9u85SSm$?TYVlڋ7ago jug4+ =$+E&yhon5yy~~M*~M/ Z񓺮;k7⍰:Bcr޿QQw'GV6Z8Y>c؋m5Y .otK[ŏW=B- o"eC9xƸ:__хtÅn+镝 $߼ѣ)ÏV-BB{qH^* }?^_ChQ:ίX[:T&|Z/?6- 6$h{mVNch'{_+Q[zW; ;Ee4z@G85Séy:uXv3{'9͍N\Q ~g^Eߒ{9V: ]Cgz; *B݉K?r/F) ۊ֜šZ$ 2|R{)asWN]r+ޖ=//uiK\JBmg=s)y[|hw@.O͑=8,`WϦVӝ,y=_nEibQ:#Jz՝N yh~.މ~AK5hJ Ei[s]}R(\zrw?FMSwvv[U9zrW[μ3|} ~dž쭄;^_˧^! {dMYY< ;>Fԩ;85S70CF#wM 57|(O!PEXC5+ }V-n$47oVl,M~Iiw.^&,5jY,+ZOu|LiZY~iHtf]L5[>>hsC*JWJ}\.Fw4-OW Ghy WK'gбM~V65C**Cw/!2_|Q͑KW]Kq(HJͱZc!m;%S*UNy%N@ h&:ns|>aMPa%0Λb38,>WZJj}c֯jcMyr]ؓTτ']\ų5EKӊ䖋4ͬExDs1M. ŹbSawsd+{Fr48uNQ\OzB/x˝>=ZV=V)L7;t:Etm#cE~Vk"U}7 G |ֿjyn:tŕ4М,T!c\gmt\f=*\wUm_:ӛ>4:-pɽx/Ϳs7]>}B6¿rs_>R&HtT02 Y-fz `05>_٩<|?}ЦCuѭ{ONR|/Spj5Ti/z2%v;LS #Ѐs*+ ^CС ZPݻI$PRXҦ2lS;5 f崳{I";{w6aw,Z-y77\0Ed9 \κ Nս8XneX+,WVWkj;ݝ-u53KW?iRw.f_ptGa_mzfؑ0G5OGҍ ӼԿ-򣍳|xχ7ZX6%Kk[1pC~t淥8ow'YxkYܛ9RɩSN6R֩+W:t޽vz>Mx<z* J 85X[pC`3BUGdes.TD$ᕉdr 9?nQU_œiDA8&TyOw}glI_Ӕ|2m~u(?iСZB[ofU)E#+EZ -"Z9$ly'U&,Q]߽ɒ糖i |bVa ;u@`kcWjժ-^X]rJ*Hh6q_#89;JnZ_ŴΡXbᒅʕk٪剐&Nme4eЩH8Vnau}~5^]~ٳg hYv_Y~L:&][hs^r mUx.RYb^Ѭʊ;i3MXboUX! m,!7/h`I,_]t':ntȡ.xx6 >Psܧ֕.G>ooYe;hTE:ݒW)fZ槰tv*EATy8tp[vc) ZZT09yHk`-4IjHUWMX[kKr 6Ύܳ*0>ߥ)W:4 ?=Z9XXhY"[:ә<ZШ|#|ruZ6sq/!_7 9> >D{OSg䳖LMS?ұȨ'4sj).\ hޮCl:y.ߖVj~35ݩ;!!&xN fA~C+*v)'ܔT~;go:,ObxjI5JcO5|[Jߊh '{+|jȵpo+iT-Ezb:! ֫x;*T/\.4հE(Ȇd;{^\U#jvϪv_y|M=>pHMX'}s.\=SB;bZ㿚QMnE~~m>&FiyYL7DSD}ޙeg8u:8ɳ''<[nԖ V[1/.[쮽;sȹyΩS ԢM7q+D pj850?v4 5_O87VW$WBCܿ|)䃯% EQg蘐eͩ%Fg!MEjrmj UJe]4\/kXӡ C|iގx{B>x]>6ceXDX?Wuv<FdhCTv6 M0v1MTցy;+ 7'٩rښe6OE3w]깿^xFEbu:fox Y9 ~`S{*M61zĺاS <*|m=nNy;`Sasgj֬i^W@ pj $sY4RtB4vwu-CN(SwJI|䉕 V2'L"WEџAG+:[ jܔ/Lp5ӹ$zrH4I*^[=|6_*;=\n̋g#/ɶDT]*E\SQͱщyZo_rgؓn80*ъ,䕕 Qow?+k.s?VP;Ҭeޟ՚tG*ܜZl 92AR'gU".GS%K:M7(dmO'_#a챼s?YEm}ꢶZfok$W]WD;x:67zgBܩ g |]sw;E57#J"a:qf\huIkÄpttj~ׯ_JgHӿS{{{m];.]Z1#zt+[,=tWXqނybgMg;vrYRBS3sjeܩe "Xo!oGrw$ЪRsR\X[cJyvUʻoyttm4DJТA4(C7zҩ.XPh nĿY{Kn[J},on%݊Bnſ},Bo Ze5v兩؏>W$Lf)kU_k:SSg`iN ԩ9s؎UZ&:s85N ,ߩH ҇Vlb;9s+婍iqDɆܛ)U-'^j©SЩ?|@spj`NFj6ϝ} &A[4gd<ßI)֠j©Sx@spj`NcBDRWs_:z Ha}јv~2Wvk9pr9N ύ? uIakWצMzh@\2_I52npo޾1l/%KtKDFE)SF*rܹs׫Wb\ں<|)$ث{Wzu_&3-ZTe]-jccb-.pj85X~tvjNZZ 6uG&ȼHEmM$TA898뷯 Kc}/>} "}Ϙ1/b 1g!|~9JvMgɣ_B &Oz߷06kqSée:'PJ 6:ۓ֍> b/[6bq K㖭[\]]YI&{2/ ~"EL7%n޾Yxq#0^im+ϑyfh`/>zx)pj85XSG0fF:jjI;Sk<N.Noܿ%ރ{vvvL ,S J`؈yY)$WQz/K9 | 85N ,ЩH {O32֩wkgS)U{Cc! qxk?=~^XYNmN熂SN~5o\^kDŋ xȑ-k)GJ\i$HSépTQlNџ'd9ڭpjDe /©۩cbc K'g̸1666L9ex9Wܥc=}hɢ5k9޾w|R{6mLyyCiDJN ЩY'~[y^ B ^e|jy7SS?yPtr2ϝ?'/3e;;f͛ݸuC̼e'g'fʗ;z⨑SIe+I9lJ5g)/o(HSéҜZE | }#zK K!75]TiZ_NNC ʕ#'DbN S{42,yYPv4\ý?m[[Dg`2/k~NmN}}ݛÆ2l<# I85N ,ʩH ̓OM>~&fPU YHLpNN}]#GԾ|<# I85N ,ǩX+S+6BiM $j&OJ li p4v[o!pj85XScl0W۶~#"ahL[H=5:YZy5SSGߍF 9pj85F#50g۶ޒ K}=! xf-4Ԋ8u:s85N ,ĩH ̙ﶭҚ?+oWF©A%4NmH<7pj:e͹hHp'z4Q9mG}|f:U $P)Q;]C{⏊C7>{[$ز㩲clD]Fo7SvW?JpjKsB qqqtpjFAfZr^CbOx$1 (3NԉjPhHc)wBBZvogK>ZwKlk- Jku'v_ytk&wi|❚R)'ewԔ}=Ֆ7񌃉Z$=I{8u;u=,-5^?yN 85'T(5b`?™Hx ?%$7j@# :raI=gIj3&oSIi7ԋ& mӉ.'eK*~T{|-ױ9 _#hVI 'sG2S?~aÆM6}٦Mpjd'R[cd\EJ]E;'n;פ:#o] 9if){JԤd!gO}5iu.MJLJCÁ:5pj@셭(huOƷ x$.noBr0G~MjNcG~/YcwIlN  jA쥱UXլ4\&F~~Ɩ4IZJ 85N @Z<&vdI޾^>vPN O 8e}/6{NS(/5dDפ-BEpj85Ѥ_ne4,ppWS85N 0)!+85pj)D85N pjF ÁMpj85pj85S#N pj85S#pj85pj85N pj85SéSNSépjpj85SF85N pjFpj85S#pj8585N pjNS85pj85N 85N N S85pjS#N pjN S85TN SéSéN pj85N pjN SSépj85SFN 85N pjN SSé85N pjS85N S'U©SNSépjpj85SF@tj&&pjFpj85S#pj8585N pjNS85pj85N 85N N S85pjS#pj8ub0@]Séf<N SS@pj85SépjS85@@ N F$'PS85FNS#pj85Fpj85@@ N@ pj85N@ pj8u9uЁ U6c~^=~b7zH: CGHk@ pj>|pjVY~Wsfj* 9JC pj`N=dؐ,ܳSNUClSAchF N?ϓQDJ1{N̹3K.=\Tx5W; -&t`҅Ƀ]RJ5R70]祱8zu֕*W9gTRN 2S[ .V-SJ4`{#.G,X`OÆ 2AwL<-j҅Ƀ]s#D^nݺƏ}ih~xT8;TRN 2S)S&<2 Y䧐a6Ufg1rRN F @d Fx0TaN}v_}C۲L@ "-= gSgX#Gţ naN>C/^7޿o޾y뷯YB޲O]ʉxYNg@ DGO=st]p+׬Yfҥۺ=rnaNw̔ٿLi>ع3M޼qb|RgϘ `htO/zhdf[@ I>MTS j85FICE85>(0GMKs?©85NXNSqѩq/pj85_|iӦNjժK߹sgϟqȏժUspp[I#D㧏%pj85SéA&aݺuB.]@s=O69\SSF"+W DN 0acbǏǍ 9e *o\RJ-f pIN@pjȕ+1~xMm۶e[YY,Y>cǏUͤxᒅʕk٪剐bsg;.]ڽ{ȹ1%v^z;v5c 'g'aƮժU[l1|N S#pj85X:ғ8̙m5kY]ɓU_>ԻUV/~{;u#ΟbA7rĂ 4X\vKVvnNLEo`5QL+V߄SéN Ʃ=zm޽\ƍ SLfOs;vV.DбCB3txLYٓ5j3UHof)pj85D~qck֬Yti'' _85S0]/`eeU@֭[7n,\pFNtÇ{zz.Y%ݻ{6mٴyfj͛͑w^tivo-ԩSRaC'N;w2dرcuF_vm^^^vBu `%f-J7sm1dɒRn3K*e|<s(`AN]rsm*TDęjI+WJ*/7ѩ4m2bu;N Sé8%:ue>{*u{`S S`ӧO뗔.bee"o;>w ,ٳTLVˏ+Bg{8qBkKb'O>|xÆ u.@G̽:twޭQN~V\Y5N>]1ȑTRO>'MϞ>d'b' ={ZL{vq`Z [,tB+~YƏŭSSWZY3ɩ>WTQr꛷o2^ڵDf=}#Ȏdd۸S-ZTܔ#GIWކ`Ē[nN}-T!`N=o<" s?[:wCiG{ TX@b<Z'-S[Jgƍ]YՅwaJ0.ZK?ytا,QNN=k/_޿|1cHN=1c3fƒ|1׮_ۦM1s!{Yۜ:éҶm۝;w*n?lٲ.ViРA-eHLpj85)Ը' S+n7mj֬cW3S[J˖-ۭk6669s|y*o5kVj8u :;vZR%KV^}IϞ?ze˗ջם{wD}SN!!b[7<<5l|W#[/=:u6;vL#ώ6=`˳:N=yd85pj8.VL'uA!ҐR NbZ_[ PdI>z1GwimU*W}SéH% 2d!޽(+VL̑3/y3gHO8r͖-etؑڵK 0ݩ>ZSé8u8͛³w/#RlJ18u'Ydyn*mE.p~y~ǽ{/ֶQ.^}SéH%VZ%~WTIxby~zM69:4ie˖Ç9L]Œ666nnn˗/gR)"N,ShQzN<dN:b|!nӦ)yb>pjΜN17S'ʩYAfCz7nŋݻaÆ9r-ߥgϞlիW[j%YF^K.m/Ϋ$1h RmJcƌ ?ԓ\\S<{&M۷KRNtN S#pj85dHNג={v# ԩ~I:vYP!b )v}2ckk+:d"kk=z۷/o޼G8pbb޽{Qe9Wϟߺukggg]~سĘ'ĉue&}Su7o޴kNgwx@#t2uSéN XcƌQX1fƍ~. .dO3f8y򤑳; @P6l8{~TnN;P9 6mTŋK,YrebҼysK9} 5*͜t޿.OǞ={2VtjCpj85S`)`NݨQ#Ĵh"Tnnn'OS0ƍNj*E6 N S#pjKt?SݺuUdpݮ|իW/gg֭[L|rXbڵk'ھ}{v휜>lDr?ر5|Z]l_v :(n#4xzzqjCLqjuV~򥗗{Æ  <{l-Z`s85S[SlpjR۩?@q+Wo߾m۶ ,8rȵk7swСCL6mjzS,O77;w4%g/^͛7rsJ0,Y"f}٥ߝ:uEqk ,:n8}6IYz޽Aϙ3?~  L:]*ӧOSé:# (셳/> u:!EgIHr?KAvjL@Frjv#""6l0tP&Ç,u:{?:vicǎ 8PY˗/ JDLXb!!!b&~3g޾}Ȋ[MtjرcZqR4LY"66Mlٲ%j N S#pԎsQǚMkIk<ˁȑ#mmmfwYl h%9طYnIߺuƍסCD9#tZlgR^zŋ-Z^eРAjʕ+jS3ӧDחn KKҗpj85SMطI̓ܺwͻ7ň-ō7ĸ~n^C~)F).\  g;wZ)3Byv>4iDgϞih_I===WXqر7oԏ=j۶$xcCN `)ّukjS3V\x1:N6mڈpjNf=c_ƊB tӧ_ݻbccl"93޾};W1Sl䍋;w$zg __͛7dnܸrjK[IGppǏ㲥]&ʩCbt6%֩Mv5q^/U f[ligg7oގ;& xU%Lf&N N N=,XN 'N2d/_5j&x]Vo%Œ̄S˝eʔiߡƩS R^ .h H[Id23:N-S_xa¤ =  :uxxx5j}]ti%lllt^uRnݺٛ% 64z=5nxĨ6 :$:5ZN:[ۈڴ[1GHٲeQ5k>MJxbɒ%+WLY7onbɑ#G25jT9t?|a7AZ~gϞ,Sѩ mJkSS޽/lڴ){;$֩CCCY~HHK% 62G[;7ј!ܳLؙJN=qJ*4iDgϞih_I===WXqر7oԏ=j۶$x# h ,ПB900P> V9LPߺuː\2 @bt6%֩oymڴcSéSé39"E(>ðM 0zh=`AjI*U53qӧ_ݻbccl"93޾};W1Sl䍋;w$zg __͛7dnܸQԊ'\nӎ;?eK(n8sL^D7dp{x1:ӦMv8_~b&AAA/\N SSgrc dMS8urxok N3t&M0/nժՒ%K%c2zW^I]ti޼֭[%5j!uk|su:6KiK^xQ-^|piŭ[VLL05eSb:66V<::ػ( t ck,$*v_KFbKD (RD [b]AQ,EY0~̮ {8;sgݝcZq-,,BCC+u=L SSu4J'={v]ڴiӪUٳgS#0u K-L&o"ZO>GVS m`jjӮ]J[͛L]M)j|;GH$05LUFj]^jܛ)|~%2eJƍzf͸ WXѣGd`jS9_Fꏩ-,,,XS05L 0uq/$>~87'?-yO(OD%;7;;iJfv&WsشʽTOVi޳!~z߾}rrrzR~S2SSSš={lӦ LՑVW񃩑550 ԇ:tƼRoQfffF &7mTqF`j1kOajA`<;Ks_a222bݻw_`AϞ=_aj9 a2BeduԸGYmHzz:w1Rkaj~4s|s=LL?|_(O>;vPj vްpMz3kvS0uudcǎ5V .F`OkGL/oQF͚5k/K[lB?[rssj8ww~ FF`jzSrN F`j~ISm۶~fddT%idGGGZ󉘛0505L ESF85S#0˚Ύ{ʕ+Օ.%ζ411"H7oիҳg˗/SP۷ooll5暙IRn͛7,Ϟ={:ԺukőϜ9GыѣT9pQ`jajA`g6sNS#05Se2YvHO/^:2R3%ɮ]fΜ {NLLJBBBnFKI\Ν;~DEEٹPq?::4((y\khH]nݺS#L SS?3uK+LMkR_7ԭZz1B.*233SOWW*Asss Ԥu133*RkU%+6.\_~vMS#L SRL]6hej5jIBBB\t̩S ݟC}ˣGVX1<_D<(8A5SZS1Bȑ#54\. 400P۷o7m4++~޸qCzͨF'?cǎ#ܺu~MMMaj3NwԈ6&?󽽽*;+++ \| wj͘Z̚5+""<[lYh?ӧZՠy0u՚޽{ovYYRKZZ"KSWH~};v,a&>qĠA +XY\VW^U:Nݿ%KSkaq'L@k>hu05L dNw,7Ԉ/U(^M$JbULDBo ?={MjL]MmccRXqq1o144ӦM㯧xSEsS/[CsS&%%͝;o䮧.++#saj57$懁!7Rn}o˯,{ajajzԩ{oii9o<+W̜9|ԨQxpn _L``͛8q 8?8#EN86Oʟ|߸ 0}/*uZ1}̚5U 1e,]XZaa!7BNN΂ NB݂y]4L& w֍rwk޼2z 24h:tl5LKKOIIԝ;w###tҲeKOOOȑ#T9|S z˜8~=F1u3`jD S߸qccƌ}︸dE&cjd'NbA=C;v,w-:yqƒ͍N(oooK?~|ҤIJ]*_2dŅ '%%ZU RT?p'u֑n$s#8::Kgi!05Ԃ?8yMޣT]'};) 83+K/ãajAjOK9F15K..^y!}>|R~}hŧJR%]O||y_N-|w`I Έݻxٲeܓ(ׄRE*nlڴoUN>w\ES R2?$Mo/̦cr#F %L SSZSw[(a}6^O5p~MdْhTY美05"S7u;F4b\›;c&jժ &T?˗WϨhÇH$|盛[XX*NPhJik5{lz+*445_߿?PoS05ԯ]MݻOKW/%&_~W^'pg}S3?q|гoAjO˚8S#ژJT*2d'WО5ko|||jj~ј1cxRb1p4 g4w\OOϊ)?ڔ _m/&&F( Sw^iѣGsD05LJL]7A`j6 'xSHșcǎܕԷСojzj'N5ڵk105L i`jD S;;;Ȓeh+-,,tss׿ɹ عsR۩]g8fpp˷L2رc2LlPž'N`K@&W# 6mQTYS;99%''sSϙ3k<66///F@,/J( 6dԽzS_vW^jL͕ܽSRLmF0H$Zx!C#G<؃^reQQH,,h[g|_O={l50pV?ASR{|*n9Lhcj5|DO85L S#LjM}'No1_ I 멓.$;s&NHQ{:t P9SPFWoFyH1D" ajFfL{05耩% zdj  g0˘/AmS05舩FROLL18N պ05L ԌL05L 05L S#L]HYS#05S0505L 0uMm'LL SS05ԕ7]^505S#05L S#L SSL5o>}رC v^X`j$77wĈ͚58qÇF(((oi-[Κ5AF>qqqfEEE۷ajAt]L/cj?SܫѣGQZEdI+VXz˖-}T*-))quuׯ_e\LFYqU{po(AFzej]N'eM÷x{{[[[R!\Ν;VUV|M4T#ĩS˸R˗뉩I(Qn~nܜ=-<윧%+'+ٙ\Ic?+ߣR=Yy{ tF`5];.05S#0K͛z[z쩸#X!zo8&&F*YAAW/.._F055-**깹j2f̘󋶪>C'M}{poLl̫-05L5l|\Ohej5jIBBB\D"c:u/9Է\pA <(8A5SfS޽{'&&R%!![nJ+K.Ň@MCK="6͍KL+Ht钥⢭~Ե05Sװ S#Z:,,v󽽽*;+++ \|ˊ+jԕ?dӧZՠ~0u՚ՕB?TvUf122rDiZǏ߰a:ІAjLjԨ>njJ߾}ǎ_X S#H͇Vש\=33VjFBnjSq]~05L]39}4}zGǿkܷtÆ 05SWK4/ ajAS߸qckIdEPk$8qB,!~R=47n,))ثɌ܈T/T'MEpbRRR/^pUVU4AJvn:L&%ݝё^*0u >_{Aj>KQQQii;w իW-,,jIJ0u $11QqF_]L]]6uP5o\UyҥP%СC<>|HrߨQzIR%]̛7^ uZqR3"/]ISGIQӯ {]*45_=w\ES R2쨝?$Mo/*yyycǎGA{܆aS매$5lt`@>}u1<]롭ٳ魨b*|BuL]3F`jէC]v)ჾ}nF`j2NۻMmeexV*2G_NNΓ}yhϚ57>>>55UsS?zh̘1<~)bZ233U3;wg[ӔXWzmJC\R$m~~~111 Sw^iѣGsD05L S#L Sׇm&MoȦOEw Lm+ӳQ5w\oSԂvvv IOO'兇r9I\#w͍^sN۷S*S Hqݻo2eʱcd2u|/Ԯb;m44vrrJNN殧3gHyll, ajA`jnׯwqq}||2224騸 #ASwŖgL]Mت4u[T~_S`zkjHx!CG-yrʢ"X:yd++z+V077WEHaNZ\\N^&*g8իW+\|&H.C+ej !WyA5u^^w1;Ν;\#c˗/ i05L S#L Sxxx n w'z6w垖6ڵALUej5ǩs;޶Vr:5zL]oM!-kaD" |8N SSԵ?G544|ᆩEU;Wbjmf!1:S^󰧛W%Ϻ[|`jn9N"05L S#L S׆Ͻ8qm޽4­[4iBٳoܸ1u h?TԩS*u]-ȴ\c>YZ1ucX`F:L S050+iC}vء焅Q; U1ԴYf'N|Fhޫ:ajZM8FW|Rnnn7fF6u %SgX~ \JSvZZL Xw{ݎ L )++9rbecch"vAA+8q6*F^SڅR].^XLԈ:k aSrW;f| S_SNǨQ'M0Le"4ԩS_|ϡԅ{7U.2s~uU#nDMM^ +,,$J *;+++ \|ˊ+j ,KJJMjPͼf:L}^z-={T?sG}dbbҺu됐''5 F7̬ӯyhaj5ٳg 7Lԓ#4u#i.:u?6^*M0u5_~BH4|jnffرcb1ʪUްai˸eASS]S޽{'&&R%!![n;>}UJKK7o5^vPc=nݺS#&Q766OFhޫ:ajZMmh`N6lذvzvfbnS#:dj}1~ UajUq;5FtSN <ߛ6ﷴ7o^nn.xʕ3g5Om~ ܼy3U|}}$3"75I)tĉJzz7| 0}/*uݝ;tRM7g֬YLj&)SP`ҥ.Y!''gÇOn￧ tppP"H.\د_?u`S#5oj##g{5rFhޫ:ajZMwNpڵx՛j;p-Mk3DGLƚ$B^Q/75~qnj>pd'NbСCճ/Ì;6--ݣHK:yqƒ͍N(oooK?~|ҤIJ]!.^xȐ!_}{{RRҪU*Z %; ^LMp^n]JJL&%;::KIS߾}iӦYYYj$e"ӱcGŽ[nѯ05haj33RN+VZjT潪ѣ ׯ_0lhȘԈNt? _O]Sfw.hQ/=WޚJT*2d'WО5ko|||jj~ј1cx_|AvګuzevX :b껬~ MYMEתzUE-"7xȑbG{+W,**O++z+V077WEHaNZ\\N^&*g8իW+\|&H.CܹsgW[accKCUut^qPeM]N0W5;|r JfS050̙3{*k׮#?jڦ7b=莩 ݞ9\ՙ?0u5rD"h=qPn ̙3UruuE ;e @tԧv!U轵05L]'HajkUl4iRLmqjDWL+3075GKڗ:4N9q29b05L SSԵ$K(wԈNZjd羋;,pC~[5}F`ja2y(dǎ7u.S 3 w]S7r(xY};嵃ajA`j ШQ#AU266]/1G3+5?QU~9yV^[F7aZz׿05S6?滻U6so?ZK3_ +&00p MMMkԟo8N蒩oHLn$; ľ5(+}ͱ-:Hj-8N]ߎ!V{.SST`jDLĥ9nNܥ&MԙZQlDL((Z`jA0`:w\s|)SݢL凒 *@t8(F٫zUe&v0u1upj-05L X^`lj8]]LS#bFahV 455q,zǩ둩w݅R L]MEǏ_G^^^nnn}|4[*@t"1gj#AQ663=;QPԺaʾS0b4iRqmy…Zg^_i05+n̢XfdwtkdŹSVի:;w(vLYRZ0LAa+DJhWJRJ5uuېÇ_rRMˀ55.Sؤm*@tԷDrK^&`jC;jS7v(khSSE)w_:O& Ey+ׯ(])++ԹS0-[S5hn8`?k_h5vԩj;󁏖-7]SMLm`'ӳQiFbcܣ:42Td1;_#,-+UGBsԹSkBQ05F̦Mh^qЖ-[jv\ ]0&Ms=!\8zSK`zdm)W/کP'%RɣG"]{wx_箘]Ocv˸G<\p}J8+΂s8uHt'W|a(蘩---MLLH$2hР-Zlذu̙>lݺuHH?MOOnݺWr(UvE2667oܲ<{9tMSi7nܸFXcSԪB|UiyܹbjLWmM}&ch'S#:bҦE]إ8(R[:$"D~¢k?ۡA֝[ۣN:Mf}N%|o$gn~.]qR ;Whj;wpS8w\XtرLjJ/33% w̙\?u9shj j޼9?M5WqJǩW\Y\\L^&5/((ѣsaa\^C//22{5o'P;0#mjqj26o`U肩odƚ:};+Ν1`> e0u=2uPxR tҿI3ȰNw*ے*&YT\5ɷEnS,uWDν; _qdRtԭZz}fQQox^ WJW2uNNN233"JKp mڴ!WVS#05L S+;Mfٳ&LV:tEyo6ԈYm;{%FvG"UZ:pgۡH\ O6(˟}r3'E#h^ddRtԆמ~pFFF\L&{eee988?cǎQi~YS?U֌ռoS߭[VU:|p2uO- M-U ỦfzvSۖ5?EM`e;*Ҳ`]b?)?LB~|Gy"nFꮾ=j;_(u蘩̸ԅz\ݘ}\VW^}ySk86k؂-S0R:uꤴ"5008vvSٹsgݗ0D7L]Ҝ5 g4ui#?}w1h||ԴR,7Snp6|oxݡ$sUnutR '/_t7Gĝ{kr#Xj<בy\\.'04q]qUuRtӦM㯧:?.\ejj7w\:644ʪSϜ9RtϞ=]tZS?:F0顡&L kٳݻwoР~5FDDp^*6u{- Q~#DL}- W0Hzb#SKMz֪`螩B 7Az\RRrŭ;r$RIjZ*kܶ{O.n1$"$-#mzd2~R8DcGPUG+NbAѾСC9D"ss6mڄ'GFFj[l^ǣG V 6>~ Z L05L>k֬04|2Җhĉ\GET2mݵ7uc', 0uq g= z qk#Mml,/ հPwGFAK5!Ҿ:iVu5L0u=7#Gא[lQ4'5n8n"NNN ::Tee47S'L ]0▬\'hy NbfzS& u|dS7o<66dŊcƌmS?yӨajq_֐AAALwޡqGR'|RfZjoˏ*@tW2XS' MIY^'|[;!gj  xdSk׮A:o'*ĉGWhKMLL{W߭iofk`jDWL݊5)ǰ4 ~I¦6+ifzcFj-o6Bedalj <=bĈ3jd/PxfZh{LsŇX `ˏ \C3075G~\m닩7l݀RoF@,/0u=7utt4mn_8ʕ+i̻wܹs={vV?7g̘QŦn[?SŚ/v.JsLNuna 슚;ǧ ԛ7TkajS+Ss,x=<}tK^צn98XEכֿs߅Fٷoq^mԘzٳGM4kL3X a>%ӷ4m8OoF6[ڝt2{J Q]2At(Ut .205LD^^^#xzzr#tYT˹ߍ7u;w4 `_FM!> ~nhz>5^xiVU~ʻ#u=8NOp2!P?xk D2w\v/Yb?&J0b7=sqqYdg}8Ν;lxxO?~]8MmiࠥAb1zbU肩/z=S˪"R4@ L SzuaKKKUǗ+O>-ך5vJ-ZCiK,bSii=WeSq-7߂k.</2lOeTƄ S#LԈ3RKM s9##?~R#uLu ESgL7da0u:gҢt,O͕(|s*S_v˥t8՛Y]l~?Cz1u_|EVa$RL SWLFyߺu+m6oV>ST>i$aÆq_~uر*MmhkLM7AtIs{jkSC-#1owiSG{m||05| 44߫QҲeK5C+kjs12DSLk{##ǏpyȣGjkkKC+nYڵkG'NbSj'+0.lFNu|oȓEFGFJM? >[|䎏FZJeRCe/_h:05L-3gp۝֭[\|9-鳛oQ?NNN#ko/Z$ |5a1vbsCof5u 05L 0s;$ҠlKKK)(㭡;u=499k׮8AAAM60`@ff&ט;t  2$//VoJttq`ҥK,C/^%aSKeRZ˱Dz_N-F0ݻ&++r~b 肩3D]@s׳J^wb]gCVOQڝ25_f nnS#T~ٳg+ 1cD"ٵk̙3լs񡊷eqRk3gΥKRi@@k7nH#3׸nݺLF[w0L-JK˺~LOSi:05L>S%mۦW_#0m_S'w{'sCftfMmd'O0)Ef,~L W|05茩оЛoX}VZ=~L SݻwСT:z(?ݻw[oqT!PS%++vj GEJ^^رcŋ/[,!! RKE%E`NǛ~RZTLӁajMB%K>::極C w;SI`leg $n 75I2SmLi;L :cP.O譅M4DDrX̏0 ^eccc~^_AZkꊍCu|=|sss 7pOMM ǪJ^AZW˯,'ՌIӁa޽{?z޼y_Nצ̀@ X :bk, ۻR;9tK<-ڛ ;L a8uaa!SޣI;Ww|q=zvq4}DR_ʊ;^1b6IF’԰ )9y9{K?ՏFӁaJ%**JpԸqWojPFVAteuf˂!φ&kB9Y'?nH@^SoIszڴiT 478K.-++۴iqkE8 됩̙5N2رcԨx5Ԙ<^t`jR5|Vϝ;ǵςϧiSڑq!KSNI dOٻ|Yj6;ݓu˴}S#0u]4uffA4h0tԌ=Z47uBB5?G&MƌR~%GWЍUM://oiӦq79\|Xݿ;#H:'/'3' M+kjΝ;WK76ؾ=45W>gAtԧer]!R=jf _#& ){}SsFv4ѳe߯7VLԵ55T45膩sf=|BӁaJE__V\jU@@7xCBB^8oh7ffr$0.G3djj*nlC(ɕ۳ 7 L S#L]ج^F4G2^t`jRIOOoذaS^ a;ɓEZ"Y~kDGLsFmR3ia 5&aT{;GbbL~K|kַ5@`jnܸ97L 5c{pKƃ105L]NH-15B~{%SWWF,7b`VʙLF #05SԵ37 DL}/KԴԫ7oĦ`6iV~>zA`j݈L&eoؼaᲅsEAэB~s x L Sk5[zSY{Q[kqN?ݗv7cG3oed&GJ$6̆ӄq5>}A`ja={TyyyzO;W? }IۏC/0 륽S`jD ״w]9OCSS$oJl=M)~6Jmoؕ54w-]g[bl]ж`Do*΄2Uq؉V3'LLF`jFAazk+W֧m۶LLLLMMySsߜիWS稽?,oNԋfR~FT&uƬnn5m갋׿٢e#߮yzZ~1 ȚM=WLlغuޯbUT!JS {iN㔚XK{MZM]UG`jELݼys}}}Ŗ~smmm>a„WiO2vNgTn["N~{ 4Z6lؠ#wKpŬZjܸqVVV{ϲOlP~%f+_QyoOoz,IS<,m(tyLelԗ`jDԮe&v5m{OۅNS3'f0ZWkN#[I2C;雮L]KL- F"~gff4djH`jouiZZ A-ù:m[=z3u@܅ْ(ek^X-|9Sz|V?}-3ۼkee kcjC;ׄTLV653$iꧯЎ^Cq[nI/ӷK+sːv S6-= |٪#?ldӢRs$]c2CY{񽂩QP`jƆ>RaRr4A^ӧ McMKo+1eͫZlh-;ݎd][GpVk?-]i\^DUj=$zsJZcl/mАqj[3f?F qvpugZ%6.nVsN؞̜*NILǗ F`jFAanDׯ_߾}6mo\\\U܊͜93,,422R]!2VKVK l˽l-m n(5';3n="D;.9q^~erdjv|aܲL~51q.="QW725uO^uԌ=ulK3%yR(-i_Zz'71=7+OAϖL05LSԵ0jѣ;v(8f0w1w1ZEQkjiUiDߚ{MyO;郴dS#eְ9Wh2q4SSgMʹug˜ÜI_+LCG{|lͯ;N}8(FMyqdꥱ+2(M)ˌN͝hYf?㚺:`QP`jv?$A+n*577sh*>T枿^kihSZl`-5en9K9kjlDtvf|8315ȖrShoÞmA{釾O?7)QiGL#Gy\*6.qLGj?HvZK#5k6CxީVoSf`M~Yk K:;}.X"`jaj[iӦ}.\X9S"5Za5H:ˌņOCbN^iFv2}똱qM֓g s%Nucw6~,?~yi^sEuYsɄuOy4vJ,dm 줆}:w0#_ˍƼKL05LSu(/Gpvک2\3 c`>xAb>pG.z{8{̋Bsi[vR(S_|~g=p i*[Uԁ;8.|=:S61B~6Cp26n5 )~}UllG­9 /-:`jv)k`Ș:~,Qjuǧ˲Q̻X"`jS m`j2n 577WeU$>>T`srtHTZrϽ4Y~x)k=Y\dO>ZoӸb NF; H̞/ L#Ga|{VUnj 43L˹71Үo.fǽ#j H5[CQaj&}=• {q/"ЖºZ7qAZWS׀DչU.{{&%Mmױ^}w7{4oD]ۖ5 駵lQiS'T)9Ydws#ga3kx-L ժ#2c;޷wsk]krusU3oYJ&؏];K{mɺ05S0u>mq>CG:th&Mꜩ%IƇ?z;0+4aӑnr( QEQ FEEDEi&GɈ" D &@vgwgGݝUΥr;\>OSUν]oG\JĥitS+ˉN5&NZnb֍rX5;m4^cJu/rj)|_GW5]Ǯw[ 6S27r?\:7ʹMdJfM? ij݈cNucoe:M6g̭'2t,X3fE;L\a|ұڕiqjqjqc={֮]cWԛ^vxN-v\dN mN2sLLY\BS3#(3k]r(5󪿋k 9TS(mXnV~Cۓ{{jebbmA-tkEOhQ%ifJکOV2LVYcTrWJYU+m:M3%Mv^Y3#tG ,ݸvg~w˝F{epjpjX`˖-+VNŋWGjgU:h r^N&:]wjI^M9iHe790;MSlrRJuTrIboYF k_:wvAG0`1td~ؗ6Jf[͘`G}I 1:uS|IG5S}EU߻Ω]#,~<дM],Tj̆}{M S*UJS9ں戝ȎW9#cKwí"zuvX(?#Nw`)ԀSS'USuZgw[?GgO7Ul@aaoj'vt3@ۡ]$^')X\4N6nxPcԎS7aѭ, wH1Io;m UzYc77l+n9[{dKPy}ׇi΍jPdiN,Ϣ[̲S==wN6iVz\emk^XCW归Zj6akiΕ/EiP?sek"qjFjoJq|j{x~͢])pjpjDEs *G=~u*ɘYiY`,[7|pҽZe,?i3)]'x#%Z;:u+Et4xݵ3Jj$Y֖t.9vhuI⨁lAimO HBp;ƛm7m5<̬m,4TLHy|Ț&S 9NqNZ؂SR6G;ǛEڏ2%;Laf*WuZ9PۦvyiN4^PfW4YGV?yÜ7Jc uje뺽b*tj[nL?A;(\Ü2~a'3 WeE n)O'>mغ䈜Z46􋿛_DkQ.i3xm85N 85858ocЩ+U;[nWÝm|"f:utإM۱:p85hjjsJ&Ɂf %bb5ѩk7G%9u3;w'Xѭe^\gyX74nV_?<8?4}x{n{vW=c7/,:u2Nz׷sTsF~Pqs奒=W8-/X鬏$Wfz#fuCd(ώBh85ԀSS8^I9gm&m n_^}&o}qULW5. %6;uTWU n㍄*~EwvlZqLQ/(jhoI$Zu0k>0ܻtI^؛(zM,gwV)>gdxk@I\'>}fKxxtzM]HQS?[Oҁӝr_Z';'vnakU;ukfthLDNkj3Ss|nX-?\_|yŗz f_3ECӥW;Bż10}I4uuvqX=󯾷G'jgJyn[ qj 5v_pj:ԡf7]sDض~:r;fKT&Zλ85r_85ԀSS8qy9[cS-ENg@BsL) T? \4:s4'1C"þ$fʲW;P[;B#.M_8=[];jVZ}kUn2޵gyn|͆|CR{ݖ:QZN6:uTn,޹f4J,85ԀSS8~ӶN-\iCuGhonÜi@t3D14Ħ:ƫS6Du`1rl)ջf^uvm!Nr ў6oTjqLng9QfqA!1':Rz,L K;{#G'iksOBmJbRlzq|/OkyNmRE;%مly "jcոd>FiBm͞K|Z rl]/Nk:uBܚܗ k*ݱi?66*&)uv[fSk ~E&^;&9]\tޛ }z;*|HH =@H;wB8JM9G>mcNotw:'`QY psPZ I3wSN 85N 85NSN=d?':;uƻï .]ѨS DBTmA}\;˒{lsAN3cU`hML|^&%kⰪZ}?9MRhg!Tr0^9\MVkilý;Z&ko|}-`*,)'P'ݦ Di_U.c GIx%yUQqi F٦֠:ή/Wm;̽q-̒ 5ӵ| yM[_8?SN 85N 85NS0؎J[EtW?6Kw: }L\zpFK7ɗi?Zj7J{akfm+i[\6A-8OL1;IN<}\䷝92ͽz Ƥ8,&St:*lm7&i66+,x`À鵠L DU }kotOj&5Yj ql/ GGR4;UʫQl:4\`6:5Kq^łuF9yWNɰ^١5Zq'|Mw[M4I-IL d6kvԀSNSNSԿ7n:c7dZgqj>eJ[ u8#^:5+Uv;r;3YU3/rD3LTjmc3X'i$V%zNvIlw<.Ŝ3ҽifcrm4L]i=)1{q }'Lwڗ Q^zl^7SHQkCtZ@Neҁl VIi`kBSN 85N 85NSFPqL}]A9f1ts;NrjgO0׽fJS7Fo頳PG^,UnvR!u}8OW{I{C'qn\[3tK;/'fخ⚓7[?REKpH.c;G% i:lT)nso?x}kĮ/m3kv=_Z3l۫[GvO3+T3c@⸔`U'׶aN)mg]^<_lܮ/|l: \4کM%oVnJW|%y(IHw|P3C['Jۑk$+!8xTrIì@`v'7 9$W]wtZ .-pPm..4 VyGyyiMR5:ڽ]F})uvS$KnqjƩƩdi冹f;s8u犝ZlڍJ)dͿG~`&Fn+Rೲ,ܛi7ͶNu jgM9nVXǥoS M{r5oZx;wgLW庢%u5W6rk&]Z{0IN]L4_ Un5@,8 Xth[;Эdum 3u.J9~o:6Vz]9ܽfsH1pt8t֛GHwCwy^i\Lެw];3 SN 85N 85N 8O.5yʜz܆;|cJpYlOz +٭e]xIn.Bi?*F/nYk2,k%i=d=%Ox|sLsưID՟_MYz5r{˿a4߹m&N?ӇׁZܑSQVv=m)N7+d<^]U܅Nuf~`mo53k.g6+ ڕZo~Z%2f*3m:I+$fҝriѻ$n'k3=lypjqjqjzngo9\[u]ЫtԺqZ<:O!Z&i7&]]Nօ:H9kD M0_kSWufölo&m2F,Sr%ۃ.(}N2[uzd~{̆}S{O\mn\k>9ݴN]/Ǽܨ{th3f+=`StXsTg|v~|VI~l<6lwaA;CpjƩƩYWjh?]6;|˛mWn͗˰9O&yW4T.œ4t~.ĩNjSgQУͪS7 :u^5i5;7sh SUzkyqcIfNlMkNݢޡypz0nSN 85N 85N 8lWSW|)ãS|)M&m.B:wtZߔ]h`*,\2cZ29.C9}A׵nڛ+M''EA ԀSNSNSN}9u)GLԱeNW:KvD~WiʜO.WyۑG7 uuZm>}_QY0֚(_rM`C 8u Ȃ-kvpjpjߢSjjW?eg}No v~l|b$yfh=9gId&d NSN 85N 85NSԓ6^?SSٺu9C9Tniʕ8uur5bĈ֭[85N S85N 85N 858585N}D^x_=X\:cW^}wFvlQQQBBBd~W-Z3_~uۡCm۶E|1cDv,Xٱ?x>}"Sj⋑]7//k׮9o\\\dye˖W pjqjqj1N3ψfFvё\:cW\y7Gvy#;/]/YjժS}}Qd6klԨQۯ_^{-c{裏F߿dԩSdNF_85858585NSN 85N 85S 6[nZn=tPƩqj_Ʃe˖G;qjƩqjpjpj^swySLYbŞ={ݻjժ9s\|Ų+++ ƩqjƩƩ&pmV\rIv*{S -[!˝Er-ӔǦiQuʐʥP6lYQQQ.,Y\=< Y *`dynڴieW}Պ,ϭ[=ai*$qdy_\uTSNSNSH :Tow}=~ ʚQ !^[dIic,:MeEտVjdy"˳Mq6yH|̚5+<F_GWY/^,,ZGuz*>>NTvyE5m4tcZZZVYNNS85N '_}O/-˗/o޼,l޼իgK pjN0v%3fc„ I͛;wn 6mԯlݹs'O_}aNj*ٲb 5۲e S85N 'w}*8q"RalWս{RPٳÜھ/^"©pjI}Kѩ8Ѳn: B͟?R©pj{ϯI4nXYլYSV) RTT pjNHPU}D޷o_Nl2 -ɵkRP85N Sp"qm)բ" N}I'}QP85N Sp"q饗)Nm;P+ũpj;S85N ;}CY^h,lْbSYFV[n}Л=JG)Yv*Ҽysڶm[YW,rϞ=)%qj8>|xAf(<$ov{VV񪫮B_>>m#tK.](%qj8a8q"#fLK}D֯_?a„EQ85N S858585N 85N 85N SNSNMS85N 85N S858585N 85N 85N pQ˗/,ƍCSYy=SڵSN9.,Z /ҥ N S85@$%%>dV+My*-R3s=/?85N SG3׮][>}111pW4nBWXa7>؏<N SSgƌs:t?Az~E;u#Org'%%Zfm/S|dSdƍqy{_2oQ1n85kVࡇ{ũpjpj ~'fnBΛ7O6:BkBwۣ<.]j_}ՕeLd 4hӦMf͂Ju5ysᥗ^,]reSvm~|hxkĈߤ۝wK.]†z[z\&858585/Ԣu_-nk:]ho۶M4H[h1qĎ;*Ն i[jչsO?]Ϛ5n|'/bt7X}U8ԚkWnnݻ>h/'۷o:BO{w^{q.ՀSNSNMp|9SO=e6z!kݺuSީoЪ.|dgY޴i,nZhw爆޾}"m5nCXNi.\(={m[} J֪UKxP+[M/]W^O>}g{8rݻwyg;uaaah{S؉':Uԇ~EwVZ]B߫Ԓ1o-"ڭ[PAnԨ6n8t5B-[ -^x!駟.M6ma 8585N ǑS }/eЩ}?='OaONmWCO*Z%/Ϙ1;7hdggz^FF}ݡbw9qjqjqjé>hQQQ.0)v^858585K~ V:`h^;<jHbAA:nܸlYl)SM4 m6weNm-U7ް[a4Æ sss⋡n{WXaL>+9ӧN)åKʭo޴iSW^f͒[3f?3\"  `ԀSS85w֭ے%KdCtϖSO=5++SNQ~p~gԲܰaC[96m]֟k=ovȑ\ɩ֯_;3D <@vvv jڵ'L:t4֡ %;_MpرԀSS?cNJSu+o^^=e˖~o]v]s5qqqbO?ʂhj[D=DK'MdϖX~}9JBƍ5k&"mڴKQԪIZZW(oy^PPp饗y)kNݮvod{(=zMs嗇+NݥK{کS/__Z Y QFg?wpjpj}ʷ}ԀSSpagUV]ԀSSps 75kLHHK6mN 85N SP>`!>_1K858585O.]d͛ԀSS858585N 85N 85SN S8585NSԀSS85?SO9oN {#epjԩ.[j*yLA!yV[h"|8uOv|23'J ~ɐ> stream xkhr~xrONIf]c7l 6wݚG:[V'ph6fgcirACS[GOo[ <9@nضeޞ{q6, dfcEM]c[Mw޻a}{w>mW[c]MEf8&i'uq,QYc[wG~  ?z{vl}bmGڪDxGu'u2U`{O֝C[.>v`5퍋fLoom;G.wȱ8kNܵyݪՉ⩵ -gF^iw8$[1ŇW/:{KK&kc |kٻΕLѽp㷯|辁]mt. O|{o\9w|hpCwsC*Y:Q] ț6~rƕl[j ۷웴;~W?@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmQmFmFmFmFmFmFmFmF@@@@@@@@FmFmFmFmFmFmFmFmgo?׭'n\ܠiqlR׏޾٣w5ק1mHop3Gn{se}\2>|gSwo]bɼL^8ypuW'J 6v7io\T5$髣^8̞Gۖ-j#@:}™ٲt~E|Vp6cvni.,fj#7j#?l԰2}Rk#@wݚG:[V'3q'6cUC-M˖,~lF hj\2YQQxʊD$i#@Ƽꪹsxi4 NFmGybvY4CFmH,VFá`0FmHp( f6c̉Ө@2*DiF f8^',6y0NRFmȌS 6` FmQ@@@@@@QmFco9M#O_ nOsw0 /d:m{ic_w 2ƾ_} /§ endstream endobj 396 0 obj << /Length 1087 /Filter /FlateDecode >> stream xKs6\ 2ŃSuNfJHP E|4_a)ʼn<G.ι%1MB$NH,;t`I{hÿI9n F90tF~ |1?dIEU֏l6,کDDMDRv<ސ"ЫuaUyunz[ie |ywk(=mH )MFY/;:gd$QqtzW|ׁH4Ţ]A40-z ̦~wK~`,  ۫J>h0kC+__U.ᔲًݧ÷1(÷eU"g]Jc!ƾޛVߘ?F~a1k "?4+luk74OKaFOYٗHdx3\nE_k89i|N5Gz-'dP>N\>]E"{O-6}Cq6jKpml%xZ`[{SW*>Up#E7^έS4yFuJdP[T.p|is Fj}-lle{J`oGޞ<]v)8.&>rl3a AgD6sO=_4վ>OSGʬp䙰"iS"v>JϋA` endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 856 /Length 1827 /Filter /FlateDecode >> stream xڵYO#7b>ީgu: rԪU[ć%,6dd7\R"ff<@NHޒ5RDc(KȰh$-#kaZ&l6 q;%',ˉ6 t#똼y/-E󚂼3h|)j(:)p9l`JZ~J7j()a̜d f3 A xw ٌ&cDX^ Mhf) dHflr#@Y2<!?9:=A`9/!Pfqd 1n2>aP1a CU&jyrr,R@L31)'etE C$< qyϐ0>Aa2%%|֊%0^JqX!$.wss E1P#Q L9kpa@`(1G$T&ô=GQuFSKzZ_ʿfM۹(޿/g6Ovh:+?Lj2ʇ[̦!f1;nti^W"`h-;=֓94Yl[L ݀L AhP'? )w_3z5dL~d2՗C '^^DWo2jz kmh1l i{hjf⮙wԵl5Ķ:r̮it^ A(o7V s%4Ru4.ݻQaPuR4j;P_F9N`EjZcsMRݣvy,{B:B04*>lT)(/U l} ?GZƠŷU.YL'qӨyUoAp;@|=]zB#RohC6_ ¨K7q?D;CG矾aOv爈GTczrEdB9F|}պiMimi/Xb/Xb/XRK/TRK/TRK/\ZOԗ>h_^A4JFةeC6*:nIp;aLBc&xNѫW<:Ke؋* 5쳲>3:{!(/]J3ݽL9j%` ۝{*>gFdTxT hvSq2I.P"a1)TZ^jep%THv`ƺv*qwTJSg*-ǛW8ȽR`4J6qN8p.\ *kt~Dd2\"mڃd8ŸBYvXr kÃOKPro!> $}Pb [AUn !|eqB@yNHrpt1P}$m R·r *틋w50wN;~ukxbØ endstream endobj 439 0 obj << /Length 932 /Filter /FlateDecode >> stream xMo@aݣ8RVM"$Zw86v&e 3y< LѝǒcQG1h}qDb B!0绺8|> ~>y$* -?JǵO, mpYRL!䋱ׯ3YWgpCq_0> cZ?4\1W:~[_yRw7U߿Z8~3|-,Ȳ6?Ws#1ϊ{ LRN"v4i浬?ߚ!IIàȦv!M+|0q:F0/ p `b,YZ,O' ,CUzi1N`D# H̽RopC/;-PBj9Hs=u;κmoA!*$vC8M@F&z%->(E7> stream x͎0y X#\IJU :q$Qpk0a TӴU;V02w.ؾGO*d/y%/DX1n"%@&L͆h 0 P)a̟#&ĬKaAe?j2) d'X#,ʹD/vbVϬy4P…A;FOB(\<V|C\[i8JwJ F9ʴ#}}0j~VɔsPnMPNF$sbK6̧ds._:s=D>͒/GbH_ͺ͂7?u[wtkpvoS6)N`pPղ)' !W̫k{W ltyL?֮=!KgZ<|"{Y輺 ivwIPdb"@{}fmLS+~Wlؖڸ}uEP] mM,=|&7RB*U4Pz+3nh/ endstream endobj 463 0 obj << /Length 2527 /Filter /FlateDecode >> stream xڍYKܸϯhI LkE` 8A!΁#%yzQkFdW/?r8ttURId;RRi}7yyg ?O*n&CZ*dj&>ɻN B)2,eU{sČ/́6IVfnr'w:uuftMw2cmઌӼcOt<1:{I#dDdCՋ}q$0^-g]|lWr ɂI氈m8ˤL`Q {D)tûge:̷s}8y[-9)H*U4lS-&rW#8],@-*qUOV"EMLT&z%/SΩXSiZuݫjh͙3WfBPC";1拰h * PN%%q+,Ӿ?v 8ȡi) z܈wfLQw:?qHؒrmE%#o6xps佀׉x9:h˵7H0 \9qLg,e 7DXlur@ ,9 o] S05Y"|4Bceoo<@oxX'2"t|2ѽAt4vh?Oyѽq(WۑNRwH!fFQ8<SRN:t[9ƈ*ɣ@@:ed X ĮG^dmӵ!%c]NMQٯ[ 2;:WԑR<\=_T=W}AbNRy_W{yxteıjP'ajwXCB`RIi;0C|2[_40<ay>[*@k1}:tSR<`,"yDt=lGv; 0}p¿xq{aQm$#+{dI8KsK3дriU *buP^0݀r]pq28YkRaBgDQv [H 0pɇVHuIE(# Qm@ġpDG[Uv28eVN%OS`碻MD,]_- ~ͽX,=*GV?y`scA s,vuY.*햱ܘ*S t;H/) n$"7ΜE0a&jhw.@01dyk.kR"3  Y_4l2谜R%\qEZ3yqG*1 EXEzZ~Q5 0ѯ1>AM; W=ct9G]Z^܇MK>T"_*WLhaO*c {hAwɭn8@odu~=qVuT#gi#n,&QE` L sUG61asUHt(+^#KyVUR 7rY 7U8ipUV&kMC$i0fض&)E+:īta嶹WuX3и+"B1)0(?^G$+_L?z,#ѪT)Yz)2%lP> /a1 << /CA 0.26087 /ca 0.26087 >> /s5 468 0 R /s7 469 0 R /s9 470 0 R /s11 471 0 R /s13 472 0 R /s15 473 0 R /s19 474 0 R /s23 475 0 R /s26 476 0 R /s29 477 0 R /s31 478 0 R /s33 479 0 R /s36 480 0 R /s40 481 0 R /s43 482 0 R /s46 483 0 R /s48 484 0 R /s50 485 0 R /s53 486 0 R /s57 487 0 R /s60 488 0 R /s63 489 0 R /s65 490 0 R /s67 491 0 R /s69 492 0 R /s71 493 0 R >>/Pattern << /p21 494 0 R /p22 495 0 R /p28 496 0 R /p38 497 0 R /p39 498 0 R /p45 499 0 R /p55 500 0 R /p56 501 0 R /p62 502 0 R >>/XObject << /x6 503 0 R /x8 504 0 R /x10 505 0 R /x12 506 0 R /x14 507 0 R /x16 508 0 R /x20 509 0 R /x24 510 0 R /x27 511 0 R /x30 512 0 R /x32 513 0 R /x34 514 0 R /x37 515 0 R /x41 516 0 R /x44 517 0 R /x47 518 0 R /x49 519 0 R /x51 520 0 R /x54 521 0 R /x58 522 0 R /x61 523 0 R /x64 524 0 R /x66 525 0 R /x68 526 0 R /x70 527 0 R /x72 528 0 R >>/Font << /f-0-0 529 0 R>> >> /Length 3444 /Filter /FlateDecode >> stream xZK$ ׯ{00 f0[3cu^GT=^ xYE'Jͧ~i}ɍS65e O[f!ѿj7bׯq;6ⷺcZnx?.-Kal!Յ-T~XC2I5d/Jbc7úwN̸vF TZ :ulu0))흡];id:_[C޼&Dɸb|X}X<_w˷ۋ~ 'eW_{ z!b^^{?Wll+\s*I3-!m92ֵgb#mղfsބTaD$}yҙq-V40I94fj0&XU[oc;RL'EDV$XGQx9>H@_жnAc!T[F_+btdmU&Z ^6#-ӋnK zs˴5msz_E+! neivaB`a>Wm 7Q2)yP)+(ˆ [29,ɤj[1έ˰bFq `uFu.ld3i ElRxT'Կ9!֬pu9tlrtо#&1=@$t>">ڦI>!;eU]ȘO1;Oxnfa'<X 8 "܌9j2#b6HH#&!Wd12YE h3O4{|FR@^7|DݮyouIjҦ.?}ktU(Uu5 K0k4z&V<b$k.4 7lu Zϙ8 صj3RT%mInr,+F@9􌤧EmJJ9Hʰiƞ'['rF87|XhIxž>+faRXv8JߌtL9<C8RHOh'DY4 l,-hY ОֻXkU=2`)VUd:8Tr,U=&Q5Я$:4M#ǻysrL"=! 1 k/Br k=((i7ėHf(jRB( C])Oʏttrt݋ k%d4gz(<[)jbq9cR" 2wpE T,0 Q=V~*t qB@TG _jY$XYTR}S!4XIʫ :q`bۭ|v}]6Wv+ 1aWKi0U K'r =c*GcJ!+PIxv9$gr?= .L[8(RwggUCXIC LD% x#~!\DP0 M 9ulPxɝ6wg ^5VU G}?O34TW/ʚv≟ ~OPlH޹Bk(qʱ6 F)!.yVRyN(Q|$n& *r\ xm\Æ$5@ںJ1(r|ʧYso&"Q[:ꡥKS@h^ *H<;=;k<&9#QԟhZ e4Mű1a Dr$B3ZGΎ~*RKRLzlC{HdFص.'tN~Oި & dkr*R,&,U9,9Lڶ]XdAx` PRFPcz/tI>PA[t1wf6mLSD5ը,4UyuS[@}U0M .ޟB-_?pڕ7ԖBa\KMε.H7WDbIhyɌO۳e}@i3]&ͧ볏*qѱ3[+jYiT+>2x\/YxxAъ8ZDÅb"7ah|{渑ONٗE:rRyiи5\Vk-t>gWetLX8/$wf]􅾔;4 /G2,i&ǰs#ugue@!2"$^VJX2u<Ï5{Qo7h n nrTpGjp~PdBrt ҍ0h}]!tR2TzoM+:\:݀f:;E8?|`> stream xڵZMo7ϯѾpXŪ"08`ȳCcFچäAfu>_+W )ʁr1.UтՆc s-%h)ɍ`J'%)n'*`J .\p;($n$cKc$zR`̹<0n,0 [eHj~W@ `4\4NHPߔ-h)%hscdN .9ˊ;`33Q4kg$GJ'f EP(ECi>HavLSYd#b}pRCvZ}fh8ЦERFVNp׆1IJ0+1V83_W'% 6SR,3w8^}Qa sOƔr9y9{0g9TDo| DK$k4!uy!Lɓ>^r&!srgoKP&IS hLÇ؋qxUA_8K9m_;Rؾz"l_>}/zlx 3r_׻ۉ M~ܽ}Sg`1ꀱԟY:kGGҏOt~ۣn=ۣn=n=n=^r哽E$T ZV*t>P7؎FH"_EP7z}6Dqg9eD 5ZΒ W6 g3"x@wmjX6ި TҀr-eFG&(]XTP};ZG dp^w*融YeG0U0lUo 2em"I (<,5j"`APs@CC͑<@ m'&PmUؚ 'V(Q DPAN1񚃒O*:ho7-_gPn\L(7Ն\kdWӱE;]|}ou=i3;:*m {ĥM9"}6+& wu}Sn#f]gUDa#f"Eu}ʝKRG=/&}g/X򊢦U:k*Y5밵:e \ȰF蕪u e .TRWuշZ! ǰcs̈jxkcgxS X&r" @ d$*]I5ʿ'6BdoQǗG ٞvW!> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p75 560 0 R >> >> >> stream x+TH,)I-SH.V/07U(NSO4PH/2P0P0P023333T4@.A endstream endobj 504 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p78 561 0 R >> >> >> stream x+TH,)I-SH.V/0P(NSO4PH/2P0P0P023333T4@.nD endstream endobj 505 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p81 562 0 R >> >> >> stream x+TH,)I-SH.V/0T(NSO4PH/2P0P0P023333T4@.> endstream endobj 506 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p84 563 0 R >> >> >> stream x+TH,)I-SH.V/0Q(NSO4PH/2P0P0P023333T4@.A endstream endobj 507 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p87 564 0 R >> >> >> stream x+TH,)I-SH.V/0W(NSO4PH/2P0P0P023333T4@.oD endstream endobj 508 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p90 565 0 R >> >> >> stream x+TH,)I-SH.V/4P(NSO4PH/2P0P0P023333T4@.> endstream endobj 509 0 obj << /Type /XObject /Length 134 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p18 566 0 R >> >> >> stream xe;1 Dbj ĹaeiX!)|# {\Z MWڌ J3A$'R 93OT0f$I$N}b^ i>aF}G;i_g`N c5A endstream endobj 510 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p93 567 0 R >> >> >> stream x+TH,)I-SH.V/4V(NSO4PH/2P0P0P023333T4@.A endstream endobj 511 0 obj << /Type /XObject /Length 137 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p25 568 0 R >> >> >> stream xe;1 Dbj 'Nb;aiXH$)' \Z6Glm_B\, R TKQ U4nT9_}XuԹJᆿ6w0C;75 endstream endobj 512 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p96 569 0 R >> >> >> stream x+TH,)I-SH.V/4S(NSO4PH/2P0P0P023333T4@.pD endstream endobj 513 0 obj << /Type /XObject /Length 63 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p99 570 0 R >> >> >> stream x+TH,)I-SH.V/T(NSO4PH/2P0P0P023333T4@.G endstream endobj 514 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p102 571 0 R >> >> >> stream x+TH,)I-SH.V/040R(NSO4PH/2P0P0P023333T4@.͙h endstream endobj 515 0 obj << /Type /XObject /Length 132 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p35 572 0 R >> >> >> stream xeK0 }N1kN|nG,>* * 8/ӼOVt[[5SE#w46 qPxWVj *|!JQpK$[Goņp3 endstream endobj 516 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p105 573 0 R >> >> >> stream x+TH,)I-SH.V/040U(NSO4PH/2P0P0P023333T4@.k endstream endobj 517 0 obj << /Type /XObject /Length 136 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p42 574 0 R >> >> >> stream xe;1 Dbj '4M> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p108 575 0 R >> >> >> stream x+TH,)I-SH.V/04P(NSO4PH/2P0P0P023333T4@.΃n endstream endobj 519 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p111 576 0 R >> >> >> stream x+TH,)I-SH.V/044T(NSO4PH/2P0P0P023333T4@.͚h endstream endobj 520 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p114 577 0 R >> >> >> stream x+TH,)I-SH.V/044Q(NSO4PH/2P0P0P023333T4@.k endstream endobj 521 0 obj << /Type /XObject /Length 130 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p52 578 0 R >> >> >> stream x]K0 }N1k$Mz 8BeP: X>37yٶguWQt[ƽQdDV(i1S2dghL2(5> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p117 579 0 R >> >> >> stream x+TH,)I-SH.V/044W(NSO4PH/2P0P0P023333T4@.΄n endstream endobj 523 0 obj << /Type /XObject /Length 135 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p59 580 0 R >> >> >> stream xe;1 Dbj ľaiX $-|# \ZKuBcV( 5 $i-Uf JQdow7.LTTk}?=6_.wroj4 endstream endobj 524 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p120 581 0 R >> >> >> stream x+TH,)I-SH.V/042P(NSO4PH/2P0P0P023333T4@.͛h endstream endobj 525 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p123 582 0 R >> >> >> stream x+TH,)I-SH.V/042V(NSO4PH/2P0P0P023333T4@.k endstream endobj 526 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p126 583 0 R >> >> >> stream x+TH,)I-SH.V/042S(NSO4PH/2P0P0P023333T4@.΅n endstream endobj 527 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p129 584 0 R >> >> >> stream x+TH,)I-SH.V/04T(NSO4PH/2P0P0P023333T4@.q endstream endobj 528 0 obj << /Type /XObject /Length 64 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p132 585 0 R >> >> >> stream x+TH,)I-SH.V/046R(NSO4PH/2P0P0P023333T4@.k endstream endobj 560 0 obj << /Length 614 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x164 615 0 R >> >> >> stream /x164 Do endstream endobj 561 0 obj << /Length 616 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x168 617 0 R >> >> >> stream /x168 Do endstream endobj 562 0 obj << /Length 618 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x172 619 0 R >> >> >> stream /x172 Do endstream endobj 563 0 obj << /Length 620 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x176 621 0 R >> >> >> stream /x176 Do endstream endobj 564 0 obj << /Length 622 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x180 623 0 R >> >> >> stream /x180 Do endstream endobj 565 0 obj << /Length 624 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x184 625 0 R >> >> >> stream /x184 Do endstream endobj 567 0 obj << /Length 627 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x188 628 0 R >> >> >> stream /x188 Do endstream endobj 569 0 obj << /Length 629 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x192 630 0 R >> >> >> stream /x192 Do endstream endobj 570 0 obj << /Length 631 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x196 632 0 R >> >> >> stream /x196 Do endstream endobj 571 0 obj << /Length 633 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x203 634 0 R >> >> >> stream /x203 Do endstream endobj 573 0 obj << /Length 635 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x210 636 0 R >> >> >> stream /x210 Do endstream endobj 575 0 obj << /Length 637 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x214 638 0 R >> >> >> stream /x214 Do endstream endobj 576 0 obj << /Length 639 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x218 640 0 R >> >> >> stream /x218 Do endstream endobj 577 0 obj << /Length 641 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x225 642 0 R >> >> >> stream /x225 Do endstream endobj 579 0 obj << /Length 643 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x232 644 0 R >> >> >> stream /x232 Do endstream endobj 581 0 obj << /Length 645 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x236 646 0 R >> >> >> stream /x236 Do endstream endobj 582 0 obj << /Length 647 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x240 648 0 R >> >> >> stream /x240 Do endstream endobj 583 0 obj << /Length 649 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x247 650 0 R >> >> >> stream /x247 Do endstream endobj 584 0 obj << /Length 651 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x254 652 0 R >> >> >> stream /x254 Do endstream endobj 585 0 obj << /Length 653 0 R /PatternType 1 /BBox [ 0 0 488 262] /XStep 1500 /YStep 1500 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x258 654 0 R >> >> >> stream /x258 Do endstream endobj 587 0 obj << /Length 656 0 R /Filter /FlateDecode >> stream x]j0E -E5~5 %xM4N lg;PCǣѱF}nݸȫFg=7z>.ѤhVonIҐ|WZ7~ҏ<6Ov!QJo޲ImG:^'vʒQP[^U qnCߊŠ"kl̖Kgw> OCx/J|\,+t"(TPځJP@RFځE"#O:,1HIg ~$U4JSïkY*| J:%4*jURSH?JH%~9BqF\j/*˥HVpFZb+aKr~]ίc)wmOx?^8Yo2/4 endstream endobj 588 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.913462 /ca 0.913462 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 589 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.913462 /ca 0.913462 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 590 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.913462 /ca 0.913462 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 591 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.575305 /ca 0.575305 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 592 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.575305 /ca 0.575305 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 593 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.575305 /ca 0.575305 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 594 0 obj << /Length 657 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 261.600006] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p136 658 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/046S(N2P0P0P023333T4@.- endstream endobj 595 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.21519 /ca 0.21519 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 596 0 obj << /Length 659 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 261.600006] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p142 660 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/041R(N2P0P0P023333T4@.v* endstream endobj 597 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.196203 /ca 0.196203 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 598 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.227848 /ca 0.227848 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 599 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.227848 /ca 0.227848 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 600 0 obj << /Length 661 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 261.600006] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p147 662 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/041W(N2P0P0P023333T4@./ endstream endobj 601 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.21519 /ca 0.21519 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 602 0 obj << /Length 663 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 261.600006] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p151 664 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/045T(N2P0P0P023333T4@.w* endstream endobj 603 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.196203 /ca 0.196203 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 604 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.227848 /ca 0.227848 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 605 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.227848 /ca 0.227848 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 606 0 obj << /Length 665 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 261.600006] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p155 666 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/045U(N2P0P0P023333T4@.. endstream endobj 607 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.21519 /ca 0.21519 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 608 0 obj << /Length 667 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 261.600006] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p159 668 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/04T(N2P0P0P023333T4@.w2 endstream endobj 609 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.196203 /ca 0.196203 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 610 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.227848 /ca 0.227848 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 611 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.227848 /ca 0.227848 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 612 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.745192 /ca 0.745192 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 613 0 obj << /Type /XObject /Length 46 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 261.600006] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.745192 /ca 0.745192 >> >> >> >> stream x3T0¢tDb. #3C=3 0S(JUHe endstream endobj 615 0 obj << /Length 669 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 670 0 R >> stream xe; A S yZA8[+N B3!c29PRYᠭ)ksB^nBVi' Ƶ+ށyU- u[)h sLd,EF -$˔ }. endstream endobj 617 0 obj << /Length 671 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 672 0 R >> stream xm P E|ŝcҾ.PWqC:`!$$lpb갹' ~Nnjḋ]sQsc9FCQru ^6\R€/IK]/Hyɟ}A])H+ endstream endobj 619 0 obj << /Length 673 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 674 0 R >> stream xm 1 > /Resources 676 0 R >> stream xmM A S lF,V,DD7ga& 3D,V4M1U{N&[sM9(Q߼qxcsYƅ;L`܉HZ0xJ(U0h (f93'{@Gq/ endstream endobj 623 0 obj << /Length 677 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 678 0 R >> stream xm P F<7 ^s7] i7:p^N[őMUnH/&JCPƙ2C?i sNB,~ @\#_GbA5=.fZzs+ endstream endobj 625 0 obj << /Length 679 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 680 0 R >> stream xm A D|Ԃk66`qb! 'rW9,,> /Resources 682 0 R >> stream xeJ1 }ycM G {Xo/xPBi󵙜 oK43OZ\_*bx9iͺ[[۩ IM1EFyh IRԐs3%ej0a],NI٪ w6)+-ll{.=O[QnA 8cx@ endstream endobj 630 0 obj << /Length 683 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 684 0 R >> stream x]A 1 E9ſMۤ= ] ^mK 9'y1:v;OppӶb5QAɔKșbD؊> /Resources 686 0 R >> stream x+*T/6TH/VЯ020PpW ZzN endstream endobj 634 0 obj << /Length 687 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 688 0 R >> stream x+*T/620SH/VЯ020WpW YJ endstream endobj 636 0 obj << /Length 689 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 690 0 R >> stream xeOJA S &d@(P=RA{(JXf&3k1zzx.&5Bp#,/PQW7Rre Sʂ@{ ;*u*W FXKENFkmg2tH!sh4+b>l]f$Fӝ.UqVG5 3>c9;A endstream endobj 638 0 obj << /Length 691 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 692 0 R >> stream xeM 1 9Ż1mvbt)."bpD !|I^~& m,>(IxҶ' .dajl5#H%Ljw\%pڒ3bENb ϤĽ=:ZaK`drKZgW9`^9 endstream endobj 640 0 obj << /Length 693 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 694 0 R >> stream x+*T/622TH/VЯ022RpW YD endstream endobj 642 0 obj << /Length 695 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 696 0 R >> stream x+*T/62PH/VЯ02TpW Z\R endstream endobj 644 0 obj << /Length 697 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 698 0 R >> stream xeOJD1 +&M/G OP=,{[aJe({=殝]_՟E*oAN5U7ӣvlˡ=irj_ft+CpF1( x"eȒXvEVN =ձX>auqP䤤}$LG%v r!m\e3+r?ɡ.B endstream endobj 646 0 obj << /Length 699 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 700 0 R >> stream xmM 1 9Ż1I'Kq!a oGR&u$T gAʮ s ‚ uaj,@&ST h98K9=;cmg0S,oӿk۟OSO/(;{ endstream endobj 648 0 obj << /Length 701 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 702 0 R >> stream x+*T/621VH/VЯ021QpW ZL endstream endobj 650 0 obj << /Length 703 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 704 0 R >> stream x+*T/625PH/VЯ025TpW YH endstream endobj 652 0 obj << /Length 705 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 706 0 R >> stream xm!0 DQSF$-9GPDgXߕӵe'ueeքs*,$:k띩xu+@ۍ endstream endobj 654 0 obj << /Length 707 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 708 0 R >> stream x+*T/623TH/VЯ023RpW ZL endstream endobj 556 0 obj << /Type /ObjStm /N 100 /First 893 /Length 1651 /Filter /FlateDecode >> stream xYmO98؞Ѓ"]'HU?la.$(ٞʿgJB,y]{3$C%FgS$OLr o/96 )hR "x"@yQ0dR DeΆ295)Y9Y9Y7 jD gN \D6UB\3+s (@M R!9%Beq ƣ ]h"@d.I΂3=LfFb{!`_ Ȇ5 1I# xi$eV-K fx9($n8*bGeP#*srTf 'eFq2NFY]#YNG@w9# @N$DD0Wt #f2#S]p 0RG6!elKO0 A K$g%!Qb9J( A&`!ah2RTFpE%3B%JI3zuqޙѯmwi&(5m?0Heuf[ ((R4wxzjT&y{ Ϻ' l].Y"䂇 QFGOlZ_ gOnz~4Ow#C\YhC` *ٖ\XMoup5/GB<)ر^7:ߩ.dY rit_^eot#NTf;X` ؁XL"E~bŊ(F|~Ŗ(t{9tqdAGR+-Hd4 2 c 0H2 ڵ^ko,NI> stream x{ |ExU5s;Lf2 @#$&@8}$$,rEW/XœKVXWQseUP㊻F]dW13W=o:^]]UB"jF g/@&G$}xwVAE ܞw !.2os9A}=ssN^ىPv2*,K(r%+V߄(w.^6{&bа}P>d= ܰo/5~0>D`9`Ap/t=qlDȥ%3,])+/].WJ /,oB~]E2ۍ.x')3,ifN^绥KNU㩤RHOճD-DzzQ ^/ dAo 02Amix$ i_+҅ucb˨^`&Vs,l'ƊR-3;XO˒I8-B@M|\?gvIYR-)zo 7(N:e"l H'NO,\M*$MVPk8?c3T^`HI'/=G{F'{sFR2 >| D~v8$tZ^( %D'G&6;eMsfO6}ƳPH@ZXߵ}nR'6,"i4{4MRĨ3 {:dt$*b, l!9 Bp_¬ `oLS./']j{QII/ -P-Vh5$ m'H='{H^n(oyhg#F\= Y89b%5q>n/wc+ 1>kb (&QgI+ܽwK>HFgyJ*C0pJP Z_9Ǽ/ܳXQ@ N>mDۭ=֧m6kWƴOXhy.xgE^rc#l7{K,A̞ˎ\Q|<%qc[hI``h[;::ؿ>}5 ]= C L/Rhed䨳9!0v5,`r+ f3CAޮ߬0e&Ƅ;MYHA5hP" #kyMؔbL(Rtac|7!崀}B H`Oz!Y^>)PRwXwAu˽[0\)FXӐ9B!(%\&^|l_˿ǾӶ> ÛƉX| ,Z|^Yn]`@4mN`HO/4 Iߔ^kM_hX^b!"t g^" igWІ԰\.D,ՈM*pA3rfHA$-ųg}wpZ{O۱8ze)??? VK?Wk 4\RdsIr{Nj-%ie}v9mdnx~1SՋ fNgK(),0؂fuW#7 B >\[n؊S4V[:T4ʱU\ہ/I{;⎹Y>>5𳴲 x]v&0GJsS%JF@xAk8 + ATZ7 ={z}gJ־? Iס3/0ᾡv]RDv;x̄I;Bp0*ZZfᏔ;d[rfmiw*BD+,I4AȺP*qUfNxZ:b}.:BI &> &6{.Jќʼn$ћ A:S\ՙMHIx Ϥtw6+[ݝMJI~c SL.A`\RÓq..lcx\p^Ltr5tYfXn%u`Re̒EJ l=H&x07$ƀ% zуR"f='%R$P7l@9ukK "1ǣުԽ#bʹεbDA/'{u9oZvݞ؃SGxwag0 ܑ ssb7*X[3m/"/6)6zف ǔ1]錝WR\Ƭ7#JNyRNX;NA~N{ډ) zK.S\4F!hlИm##VxhE 5wuzc{!ǮڧAr)) +%O9>M SZV;EW,iu IX"lW`Kkwe{w5;Ӳ=ӻ_p\qJȎM^goCtm)퓈$( *3ZBbG Qr)VK>{"()4˕tzƃkhD}r5 -k,VuEKZ($!p6rTޕᯣxAl4{{Y2A_0uTSAE?~/6 RcٱOyzm6f8<XΡ9_72CD\ap(*J{4<:19}"ƒ&d Dh 9.8D_wݯ][[h?$HN!I*!o/tD;Ns׿CCr/&i=Xw˸W{bIVHm20{ aV!lC?܉;o'T'Q6WZ/aA* &7x_*ffM 1QM-eҔѩj&ִmVc!BRSn4X9M\[hXdkwޡ[cXcZ'Li nfZt -{M) M)F{<g`J2\gϽv4P2u?:l^13TY=m"'gQЃVnZ5UOTX@C05 kl&ٝl8l'v\'ž1'&oS"Y^!+ѝv!%l'Zd"nS)k~F 鲓R !s8HrHȓ"4p`ApSuw*sANDJl0(05ĝa׆L3'f%ќȤitcj5ak>(N==Ƈd}[In*B1JM+Lk$Z)ddpu>GHݕt2ATjBRWua^%%'*,lkâǿ~<굏qc95K |owSZϿ5p߮'y$uQU?:|x*yE6R.nn:}hDgOc iܲßi1U5*WGWB%`C jrl "~q?NxW7[Gem\Rhɑh_ߋ ޾fcA]'`-U?QC*JU5!7ެYez`;km!R+۱ljڛBEՊýbmju1µ$iReH nԠ@5f9ѫ!Ckc^Z!O?>u6|TvTKxW 6VE2p:;@$7o3gf4:71h]R^䲼^k=Zc:"!+c.јB&lEyBf+8MnifmE<a0e:dMәP!՘fJd PvfC̃g~_ :w`??^`/\z- A%pZQzQ2!+oEݤMFYȂb qQ`0j&SXԀB p-m2՘zA4,c1 yrh"pn^3N""^&I( 3^f^o>EIS:WW+j !]} Szwht q[֩K 01)KBRq ]vk]-#PbY76U ~`HzKΌ}%ue&'X Pќq6T't֎4UPf%Iz2یDw&)#8$%{=!'#3,9G:Vp%RNΙb&g*1U+Ÿ{M?R/TRe ='=n;/R7n<{@=jźN#^g7̺_Zz{B0{δ=0P }z L}[!p7~*?M˘ vXxcx:[8we9׎a ?PogVg/xC櫄j:nuzk,1 Kx^j5Pj4A @|ω pY4l'6q@J@VO;!JB`m _iZﮀJu-ƳAk5xEf$j5< R &կoɧ־êWǺ (6;EI|%Zut 56;f+VJM'VII  OOO(DW!5T8i'pHVo%94 WNjX8} 0 bѤm֒с3l1]gn?J ת`+1a+C?Qӝ٧~2Tӎ.ET?o],E /R aYS@BQ}0}:UG_UI#M 퍟aPm!C5Sƹf]@Ih"0,F:qN;kQ^tH0̋Ƕ6Jt%EEP~/s saܴHp=wLu#F}Qg9~-by{1J*cVТ ,KNBqȭ.ͭ({qlc)?o`~,`ޠL~JsWns"3t=Gþb-9h9'?r̠~Zd9#Kׅ&ŷoJoؿ1ŸkCvxwg`3(|1h٤ۨ_|q8UN4 ,Sb猬L+f1ϊdP̊".-ab S?4S2 R✣2RZhDDو>ugb&էh@CNS;f '3!Ӡ!ڈwJ*~Af[$^)ե{t{2zt+7h '40oeٰ?=m{| qJ2Gk 7sk,k,G-_\r^$M ,ւp'Oz6׭L4n/cH:jh!# (z2,# KH +zz' 5ǣJ[mqXQ<ӏo-(])uW+Oϝx^kO$҈wrm/U=3\zA>,P|h|ar]*^ZB*@6]T^w$e^A RYO 6^k?Kҧ4hE #j"q/&2tg$-]YLB9 NfiNG'wL{jojyѝʸ1&f1s MΘ@bOz_PzA/{, *CLrzjQhp87K kTT\WMoK5pĒ?/yߦʴ*u!Pjḙ2ᴃ,.jFP&aU<䑑T餞4d 1&&Ig0L=DOϙ+̏pXl cJq++{%f0D.T ZapHxOSyD~<)cH" ~0p*ُupd(.!d/B2p96y@Gan'.rף6P^1Yly ea}gJW\3F$eW5ہA/LL x| -"B [уx;݇rZzbOdB9]!N gCwZa"DY}ʼ?M^fƱx>H:56;*<1x* AeY?Uj@=05N[/x@OA @o-O&hgĠu ŞA{b.4Zx~%8~ %|oF@B>"/P;pF~&iaYf0F956iCb|XDcQ:~-phVFPJ+ZTX=8+spP0%}I^_f%ѠׁC0( # ;3b uFODS?@Ϲ\%̐rTi@&TA@UN5o7ereѫ淔ՕZuzq`juA.4bpf|^ *E\R:,9'R9ẄQ"(02b ](5~TDP_#/Aȭ-;%4.3*̬0ὥǚOExeTՖ[=LKsL--[Ⱦ U7iZ] π{Ipt]hxv b$F6UWE&xLgBg_}-#u4xVC.[&WOzfՆZ&Rd[fJ8a[pczS\tD!"lFR9Ф.npWdȂvT]TD.(p@wf)\g5hÑt"(XSp70cU' $UmgVe~t*h"e!%3\!uZK|uյLhBLZ6(x{Me-u-Rz[.bUxHxzgZG *S4j GGZ7u.ѻTmÌ^φoa``'OkiM8Mˣ"h Hf:c=H6vWӟ΁Aѵȣ[Zfvƚgd)rF^ki(8{<۫Vq@uM[a*NѨ/R)>8͓4@Q x4JB?HE?PMMh =E7O\Jۨz?ymFȗzrͦTTP8'xyhcfC4ꞇe_Dˡ-CŴQ! ǿ&6GKaP'd@HZ d!i,Bb,[YcBλro$yAT.me?P  ๩ y`RJopB`WWa$%pK}>WȈ21t  3v~fzcqQ:ݣxV-Z&qMnEnsՃFqjF[vƎ)&' "{$ac hf!źf0gI\@G%n4gq38|֓@M%{pS)e p "@>T"ӵQS/ cH%g֟!5;Km/>f™_?g,NN|v97""^<=$T4rf"<sm@0>@ @%itmv~"om"S񛀓$%#G,΄v=⋍0c@%3vInC| }gГ,)Qc2MBE ^yo({H} G!GК Ih*$4g!h6r4 UL$WRR}_M9978_$rTTTm1~`k?1HOԒxgW%e#ƒpqXC΄4{~8#LIPS%3\\ hYt-pOJXfpER,#Ŭ1wbá/ҎВ h>׉j H$.@Mj9y5"/ypvw2|]H:I {{6P!{m73;5Ps4ԉujK'ծ6]- MPRLiR,<+N{{`x6;4>pJ~'d*B"d _ Gi,Ic5F5hF)'LWwyH|Q#VO#ݳQ,9reR0q8b)GGF Blb$?\*ojjNU<44906oCqڦ{ӾYbn.]_X哪"'VGi&X].?UWfMN5}}NO07jf'2\B$Wnԟdwv6M 7pZyGø}h"4ϒanϬTK#rК\CJ[QMm2,0}Len޵r+*r|<++k2F}RyUFVCv_> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p198 728 0 R >> >> >> stream xmK0 D9ŬY8ub7-*φ H/ص{ q^^a SEqpkAR)`:M(eS.Z]ܿT3ߺ){n~w=sҺ, endstream endobj 715 0 obj << /Type /XObject /Length 124 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p205 730 0 R >> >> >> stream xe9!s^ѱVGm2NqX%u߈8} 8 FH"W!'> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p220 732 0 R >> >> >> stream xe10{bkϿON"H,Ѭ4F}}6xG|0o ރf*MQ> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p227 734 0 R >> >> >> stream xe;1C9kI2b9*ӰY@cғܲ彡uHEoqTP "پ4r|;0IS@pP ˘Scq%U07Dg2)j endstream endobj 721 0 obj << /Type /XObject /Length 123 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p242 736 0 R >> >> >> stream xe;0 CwsRXEzgiֹ?܍Fm~VԆҤhuEX"L =ib<#f>g3%*{B>Fh⬚q8!QӺB_*a endstream endobj 723 0 obj << /Type /XObject /Length 122 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p249 738 0 R >> >> >> stream xe;0ާPM- q$zßm~V0 ܇#U,bdB-"*ؤrbσ59U>I4gD8xo'wq_,| endstream endobj 725 0 obj << /Type /XObject /Length 119 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 488 262] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p260 740 0 R >> >> >> stream xe;0ާb;-Qģ_!w,nj!h ms I+>Й9&I|R%̔TOi?~څCx\)&y endstream endobj 741 0 obj << /Length 749 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p264 750 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/023Q(N2P0P0P023R(JJ ` endstream endobj 742 0 obj << /Length 751 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p268 752 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/02P(N2P0P0P023R(JJ a endstream endobj 743 0 obj << /Length 753 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p272 754 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/027R(N2P0P0P023R(JJ ` endstream endobj 744 0 obj << /Length 755 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p276 756 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/027S(N2P0P0P023R(JJ a endstream endobj 745 0 obj << /Length 757 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p280 758 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/00P(N2P0P0P023R(JJ ` endstream endobj 746 0 obj << /Length 759 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p284 760 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/00Q(N2P0P0P023R(JJ ` endstream endobj 747 0 obj << /Length 761 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 488 262] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p289 762 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/0T(N2P0P0P023R(JJ ai endstream endobj 766 0 obj << /Length 2778 /Filter /FlateDecode >> stream xڕْܶ]_'nEC>'KJY^G`f`q1A|٥a@h4׷/^}_]a]$L8 ]#=MDy:Xq0i;^P#MoG: dtu'g&8L`+ s8`to^A~81cxۿ^EW8+͂JJx(5/MAoe5 >Gy51iLB{˃a4چ"LЏ%Ft8Că2 kŪ= Q)GIRZ;>;`h/b=}VVN_~;*+u,psGYֹH.@. FNf, lnSv<'Z"^a3c] @v>鄦P#h,*9i3(z<@£cDh-#Ed9L&sڡ| nynF^'45*1Hܠ ڜ:cߏJN65]uCofAN:dnOp:M¸t&py`fШ}.*8$aQ|8}u9t \F\ާ`lxa:N(-~4İAW /o%'ӁE\(=IR/-SS9e<'˜[ ӎusG}`_`E G?1c߉<' zX2vʁΉLa2Ç`)I@REesγ<ʃbR`T@j2Kc c6 |'w> Kadd}3Rs!i8;0RYr[̫<Avf3c*RC|&Uz.H6LFYrR%R3`ddh#y~#!*B!G# %@—35&iDOn3z/Z8i5b|҃2ƀt{(_ AcOSWS8qXLY=Ue(ߒs 3Y8۸,8wq1}P 2̫mkJ/W2)Eb\ 촵#khn t;$jtQ.r3@B:$ L5N{Z3Ttީdry5X?saځ# -+H5=x 4#[;߾r˕0z6Ȑ < 3ax'?fWh&}xDU&B6W T2@ 8L8TK $X+cQ$ma.bHjaP:2堐}#4Y-l=Xq ?ǎƒ뾨jQ"ҙq=ArV'd%sUr8ar0!pq?[7 ,Y5ʓI13L,&M%/ W+! i,p,-aB]B>q+oyb;>|p3\(I2̜Ԫx,VsY_}̮&;iS^IȱuV͔- w4txD\5CzTb-hfvsUAK%wků eޅEʔ9'Rʒ?}cηlek!hvu;O> stream xڍYK۸W-Ty!rIyڬd7[I IءH-ASi1I ֆ/ 2n>)5͠yNeJE,AЅ#BK=[`Lz *^+ Z}FfE:; I);ቦp_vK:A#>rh|i!(=="mxׇZ/,\jK9RA=ፒ@anDƊFrA/TQ/a$1P_T('RA儲#yS3=׿2)a?;J^8y9bG_ Vs4hnT K$aBu!Hi2(EK溩qDfnD}w#bTBƉ7:P1#I a?pͶUp`9MW8މ4Sc?M..KHzF:͉U5"NTqjOh֜HV 1JIlj;L_ {!g/^Rɽ ZV\?97P flp1lszI#m9~SޏP ItW#;68YN dBZp F*P Gb.aBJ(`˽*yg)n]/h%޾dXtFfvn(P)Pa8^]|EkHvͰNa̮4s%t!cLljs;`lMf^lJ"xBsRr l56Z4Mڠ* g,?@`s)%U޿C" GW$ױ<)`gQFvj_{U Zׯ񝈛G,-4/" kO!8F|h9Nðw'UR)N)Kz 'Pi&5 $FR',/&@3AiDP%2Y oReGLx=dos'(V}%IIn)(tOϿ@0mM'm~|2p×qPFeԋs4\А8/?bp?'^4FTx~P5"_c'^;[^iQL;^ T8z]*q!]f1_hᏍ4 ĉ~맟>cf2 E%x{i6ז-D;OC(z x1>\ؙH=|>v ~GyԬqIׅAEPlF\*9Xд>P9MUÎ3uxp}L^jċ3~C ,)?#Ua endstream endobj 782 0 obj << /Length 1686 /Filter /FlateDecode >> stream xڍWK60z Ԋ$aI-PE@Zl$%l^ׇb553ݛ.ߵUz8jՕE^n0f:`{\dzSf 2#6s 'HyfBNK_18yzlr la]hy`CvD ,=jZg>-ذf̉Ђ@e#gf\6N`=?rn+<Z8yPl[*[@>.Ip.o?,1 0\#u@+QiQH|'KѸ~@l&Ӌe/N )T~+ c^]{]QpD<B.5>T\Q?Q% 1,V,VUuѭ\m0LŒXeQ)jEꝻMRz|.w0;:㒢Q}-zUeDax׵JҢ8-A ǫ;4Eg{48?p7mIo*8F޿/8dWy}h`M`]@J~Xn60|9M T5opB.D\`Fu^Q0 >. F&,5l`N ۋԳgj᳴FlJ/u Ii49m^}^`kۥ^U"]ۋgf.ܥq B{^;cG0 A?ٮjA$O: ]PbQ'1s5ww Um=` p*r᚛ңHx h~+q*NhΫMaS !18 endstream endobj 779 0 obj << /Type /XObject /Subtype /Image /Width 1023 /Height 680 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 785 0 R /Length 264729 /Filter /FlateDecode >> stream xx? ED:$B{.*MJ^N PC b[QQ&5K|%\{.۝;..ׯQf7>>>k׮UA޵k7]ӳ~Zc}:u`ݠNzv^hN Gx lUl^u`';u`#x ȻBkBc߫1jDm4FQt7#>X:Fh> u}4-HmZODBEfmy>A"QZ4f*4/Z?[W`3KS!6SAxiR(&xc5"xFڐ4~mbz'G]Hu5kzլUFݫ~!;csɣ045zoag:d!; baA1 *q&NgF#@ YR64X;- ͺȯ@5læQaT,kpO:sOO)~ݺM{6C` {oZn^M͐çݼn5mׯ˃69u]ђ(hz->zmSRPe+DEfzhNc;6?hҶi^4ciay3FM{Tf87Dyg@c&i,ukfQ=̊)T.6TD@bk ぢ/BPJ7j.ήΤ ZŒI^!o ߈F5nQ~ӆ> -4hqhX%>zȓoU~+~OVtdݨAk^Y7 sΆhM# |j4BYϔFmEmiVvUyxkMS 4 4h금U4::-i+K+hIXyoHG05- xcrUol 9&h*]1 "SPQH#,C_@G IPÕ%@,_A ?ٲ)HBuC ƍ[7iЦ!(:rcD'ӈ vM`b?Rs9ҁ{c~9ўHT>LBs%cӂ Zv2DeF뼠U>Ѕ6v^ŴmE{южJxUB[GF;(y%oK:i80_!+pg sdȴZ؍\D͌,\1TꋤxA p;7x.]g]OkG<[@(H<@KQoyo6m߬YF7mں9PF7iӴixYcD&8#G;"s4{h+6O-wjAgݩ%^EٲEgvFd 2O]&U+mmiN[miK^i_hHAnk^ờ3au1Ϯ)a3ESZոu2` -mF9Bw0 |hk8@z@G>(u!@uX77I]/X΂wF-v;vl|--/am灭_[6~?yùYR> M?c Ms&&&&Jnʦ8F: 0k#N_өv_A/S}{^۶ ߥso3|iC=1S0?S0Ȟ]&'>E]~_JO{f*3i{L'f6'asjH;Sy9003!eZaE,bYxVYsTEGJ9Lb2ǥ,F, &NXX2UNJ +g2gY kt >ì5+bWJPi>Uڈ,_%\A`zz^h>S8P|+]dj~iE]$cPE[R.9GfH nuqyӯ. 4B!z!x!zr7q'vȝLS 1YƤ੪:i߉ۧ&`Lux̖IDLDlFE/рʖ~˥J*e-ouAo׮-_݇VB)8KCK֪$ NeAjMcb&0}#/LH -T2:N( [v!_b R)ǔYXqE R( m2gg~!Ωc(RQ(}V@@@_WEtXѿz/W'&X/^jtP,ZvɿYa#4VBK$u NU "`9t0UQSx: WWjo2e⟗H;w6ڶ}k(/?c{ŏ!^Z 1@iHdH[_H2O[:{̐zf!,1O3Kdp#R|$/rUFЗTy_gHT'YAX 9/E Z!z/u x vvgMFv,m̔O=DO]w&3G0W ; &Jֈ`;|y>@#۵ynߊU߃ȿ`!!Q% JTNQ2+ʿ$-Nkڊ5`J3'$/}WZ0#[?>][h c% LGgP b&yj+=7&gjѬ?jHA_i,R@XX 8ػ L'ϣQ] Srh^.R/|L<{F~rHcD׎՘7)Ϝ?H+u+Es4@d)v_Ə4gYiaZj"WnP!gdќ;xaȠ9>Y4eڥs),֖WY>X@ F E 9/E Z!z7Bg^7rAeBf:k z",`#n3L}3)/PR)GJ \2Ega=ߛ5y1o0-N.طm`×X_T$汆HPPI,"`Lk%(bl1Ģc}8+'!\\_+Lq2egOzvض-G&_|8{S6ȓX~5U?f/Z: #THA!d#u0w L?3ly/ ^Pv7)HㅅVƺ Ai`@0? :k  tt08X=;#Ɋ TqquR)GfwS澻O~:yWz|qj֭_g,rЅ? X@34d^an;t.Xϴ;F xD_??%Or>+eZ'Yy;ts|'_sg1uz??{PE 9`=p{ipfC5B):ȐeN=cB)B0`71Ri@_ 詋RhAm,R7 &̢lP'dP&P4RFGzO3 苘é钩!K{?'cAI4lpZı[֯=JH{rjACfL ~}mغC#C\i| jێ}3l1Jl\{f/$ra uvw([gaeFX] /"xARo,R CY[+c %g!X9$hk@^HFH!O?j @` K?]k2?t 5$TrWFPh/8,E6)-m|_ἀE71`#CZھV2}xca{!`$'ψO7E?l&g#>~y$aBzZ,мs(oʿdv_ALi&As&_ Y8ok<=y򘘄Cǣk :7g5|ωӃ̙`wF/'~WhV09ǎ^OauѕFe$ےX2G ^ x vo`Jl A'L v0M2G0Ana}~oX L@.25\@|H?9WAݪpu^J5\GݻF+ ^x SJٵ^o\et}~;fOCGBϋ}Yh-QkS 3ǔa1yvb >]),G2BA-VX}XKjjڰ~a`;&:n' Ǎ^6,X:1qm?G W MYOA4"A/L #C&"4䑔oI2B4) ut0?”Y_o.Et`jjPqz0&['!uժ*$+ȑDQ"{ "_-Zӿtc]:֣;_Vt嗶owr38DZOGχkC>@o\)?[khL.xKP{PCyT oߔ"i|d)L>WZsBmwy#srW>uudd዆ ka42d kMw;ia F _@~~\tn%pa7Ï 5h'8+f"ZVCYD #r^BnnQ)?3 U'o F *!f;B&?aT!~3)f`>, _ =AM;`:?;}`* ^ƥ74_\# wՅWg*tlb4ZE{ /Z{t+h3Y#S"7ygYr(07W&}*/^@2*C5SSjXM^JayW3Ƨy"촒 ruЁӦ[$|9 AFUJeaM!I_ɴǘ`4yjp\=/W1 LʿA\i$n\ 2ao^?tSG 7-_o 'ݾaCfff3jys6=ejhӦl[^Ъ{G/2I+O&Oddd^衙~k܊ O!~P  :e葋vl;vnԸ??wOo^AC5 LI %^!e(V)B0`pϓ&,0FB8#B L'gHB##TApWFH%dSQg!u`#K٠fZ/=agq//BC}#Ƚ,!2/% U%Q忻[U~JBȑ c?5D)c"NNNNqŊ]n|s uj֐*hEs$C3#JgƪȰYwhE@q9 Ug颣FKWB+!yٌLs<>ȗj/oA7~e~S7}:bǍ^x!^9K'GNZdA`/^pANo^1+F . ", ?i|ꕧN9j"HEDeB0"xA@y(nSs-௫7܀LeFz~uHZӍj F 5M@0MYPց29"tϖ4(l^P !Fr?~r֍ >Uӳ{n5U^j*Jf(LXOC X?N e׫u׈[dtZSk%`$@Cڧb2?TE#|#gq&Zʰ[#x.o˱j;aIљ9S̷]0uNr!b(LX35غ k'~qLWrVSU~Fa+C &,PoLה-DyH!qԨ!S}r{M%*dT5T5˒wamOoZkp^M4엯/ "oo+3&MgM,|l$dRA%sl*9Ke$pJϰsR|sv_:mƴʿ::>/f6Cem._kyz$T0b8#yd@@@埕 n@d w%3T#S)dFHO]Dv0Mpp@h )RRYBzaQ@M:)O'_!/ޞu{5TB**Oӧ/[XgN_JC8'clYjHo32WĂ9oϷp.ѩQQa=J`$ʼuL03h jV-c:s&뭲V6p,8\>?t /PN;_nւ<0-ԏV6_ۃ?^ȖH+㑂BȠG 2O7nʿ \)pC! P l֚. 8Zj  t: 4RN+O"P$#zT ^u|j{zժYF%?+VD9/A@@|1[cT &a q2_tSLQ#`>S s,aI 5g|>]+#U@u:Oo1/O5Bi|dJ %[e7 ޼cT2UيVcT:~-Dy U#6&\5 TC΂M)?FR hgI'QS_C VS&9S ۧJr6g̗hȒ|-ȿdNQm?m:FjV,)JAn!J!SmV }Ć &0V#th>@h>US,P#$LEһ`;U۩?U#ȿw=:ޞuP{M쿪 J+^zJ^׭[?1+Z#E^`^| (7!ޔ[5xW1CC+jb0|3"`\3Vi񦂾 Ĉc`06᤺?޵U/k>Wν1XBeWRu֍HiySyKĤg£16(@0H3 1>p30 ڗz |@xתQɿs(u!8I?M埄 I11 $VV5fuΕly&&5!0ě8(fbb&vG[$J)O?IS9+/9ύV?JH'ǏsRG4)f 2iNubvp&[j1z^pUVޒhb~9.j )2gbwCDX]'K! O"DqΟR0@r<I“8O K?!~hMAFxX'Oؠ׍ʿ(xdHBD (dhu%OLrX ˈ@3 L71qZ Ĩ4'R$ b 9B_fժYg?,`y>N?O68u~Ĝ UF?A4~>ġJg>\. qd`XM)Ąt!1jXRh&%GOKR8R#9I@\Xlx .}n7[E7>a!Urpm@,WI3T :ˆ݆X'ݤRJ3Q=#T88m&&&&F IA"FR؟_WsDa:H W'㸜?'\?283X8,e?OT_$O#'Z =| SFP~Rлs맒7gncLLLL#l"~>۟gqt>F1u ԩSD~?IeNRTX+;A+D209 ggdg5qeʔ)+,ʖ~ ˗Gv*&] Qبo(mJUZU$/N]*׺"7h?-G]l˖)"=Fn^'ٹsǦ֭ZB[oWPEMi4y>bC!*8og"o%u"ww…]$h/6Dd5}J +F2eΆ;ZX'kzO|.Bj"3-6[߻RAG2GhŊ]~aZ{(>5OL\c$$?ZtVebbl8M j%GRAHM?HI ڟ`O3{@b6gwx 6}[Qx_F Z+W*oy( &SQn#ABd$/s~re˾sT8 ۢ@ٲegE޿;o֪Yc@bQ| HfjlNO>~uK.[b"ճ{ժUznl-x'M4u2lw9+`D׳5A2zGa#xozĽz/B*Ζcb (w?0*9w H?-G$4Q&&S$'R14Hp x ,%^0\?)s1wB4p'Gݎrq0÷ _,UG7ҕw@/*^fcg?ȈG ȡ/}uӚG>ȈêF%F(‚=iƎBoeb@z{^RȞwz; H:&M{&m:Zͭްvc%6EvK'c>_`Ck5}ʝ昘8S95ʋVᏦA}GIl*Ҥa1qLLF$?o4(k%s/Ks7K'I9[@\-N[,>{w /ݡҒ%L$ݽ:v#C?_+Uظsw- CthO?|٪e xW7|b7_ 8l߫}M'0%ȋxo/ڠQظur%..v]ok/CIB: {PmOjaG׾hOsKU>:RXGJ}pO,g1y _&ȿ{u7jUTqqŋ*='qN'q2J*UKrKҥs2b1٘t b`"3RcS"9G;F9|pa!{ gggms˫j{z_fب=jՂʼ\]a^{REYUT)3-6` \O51n<vOsJh9GѤҪ)"F$$2MgR1VH>&9`O pÙmT3[q\?ol36&y u@=rq}C/MNDnbbbzqyG·.Q,ADb"n4Oڵ=<׋o[ZWYc&̯^mՊE"+9_*y6fL_M{!9&&8`:eF\Fy~dQP~$ JA'yWDa&&&&&T _ >;= J7Kso'r [@|-`q\Ÿ31=p:$uAaIkլQ*.. ,quڛot+StfM~;Y?FQ˕-_g ߳M$ѯmK@1j0`Wį {=ށC6=_ao?mpu;?hޅCEɣǭ \Z~"tSM n `Y_0(VW~%7Kx&- ,h?ewOɿO_.FGt\H OfƲ _ tmlKt6^'KQddMe"$JML ⴀ ?!=8LY֍ #ߙjt~#B TrLL `=s)xO AŸ axOOa'w1cxܖ4ĪqrĤpĎ$iC7 QhDNQ #"#"kpj & +sGw^%_U\S^KG.!O! HB:@HU|H-joR_%)RO柦hbOi=L0%$Qo9*oh92;} .S9߲@#m}z\"ل4a -=% (8ѳFY';pTa1X i^bx "$V$Ę؃31qn('&;u \ń_/D_su{oqj~8/'\GE^;.@xZ_s>s㺌kdk#~1î; 1QD"7X8gD;$'O}Ϲ3B$Os WH4>)=I]; hnGsĤppS/P]n41?"\.1W ~OG sǐٰ?IsݿUDQݽzXö-u鐭?gg$Y@"Ket2eR Q $% 210b.RGxA-%%xRL-NhكiSO]嚔O9G9ifs ѯP"⁉IA"'=F{x@@W I"r2b=sD<ZEMj+i+iۧA) Kt盒&&0///s~UG/$믘/.JOyq?CB`k |4M rR6T0;k5?Ӓf_]M+W툹^30s1g(E5_Ic7Xz!?簾\8]xjkTiQ@I3Ql1{ {+P*ⴿXٷj,՞\\ s/jPw~EW_Dߗ,R/cAs:I&2gTSl.+qPذ! _?6N˔-k~E P۔¶B]6~\R}_E_fNNE9lS^yV؟TF!OI3z[jpA.4~(*Q- gwŸ'gOp j:?>oW%!"H^я?/9髱#?#-JkkPԎ'0\̥Pk%Dh.՝_El) /RԼR{-] )>\:>&l 3|CdǠ?KxIcEiD~_2O?+ '?5+5?A) [a&J2rX_Y_d$`tTKa%/-9HKTmia$)j oCS oAv?]&tq,eH0?n/jȼbK$Rp<?\ |uv~uwR5X>9 ?elTUK$nG_A4?g)![iӦJ5vo #[/];GbyN ճs'Eqztӣ֮-?ُ316ܪU ۷k 'F&Vԩ}/o'ȧO$}'o%E> 2b sQ][;m%7q䥣0R\~-WIk?^['QPԒ/p6~ *ިQC!oTJko޸AV <԰a"gMāc7+_H޹cIαcF \sıjQZ$ c$)|L;!bڻgGR<oݘ|-lP\SMskזO, _Th* ugosЎE4grM쀹 FK~*)%KD X8׻Agva>w~~q$>]cwEګNd؈WY;:lݻi0_IC׫ _qD#׷_~q޶Ú9  ` 9:H.9ODNcS˵_s2SmD~f2v3\#ץSy~ W"2'_fbWNԪ.syǛ?Ux7Ε~kͿp/"xDAdFNfJQkmwj\kpҏJ8}ӐM6@.Vwv G%WתNrW kK_e>}Wi2O_GvlM9OAߪtQ[%=Lm~?Yz0^ 7j{ѐWT Kb#߶M~'z"hpwlQKC=jx|"v/DSh޽skzͺ}3 (O2`OU^^e j ~}R׷(&ع~v% J@ x^m\ b}LQmwR~u /|H\rx"k ^j? rڶ%B٨aCȿe?ࣾnnk߫X}ǎ^E./|ۮ]*..p UAM5q@v?%Ep,/|jp֯Ww`l*"_]NyZ{BڟLFoMs//5I_D Td|yST,Wnh^sџ8zO>P{ʟ'N(ѣbvm f͔*Ymo@B] o G~U՝~->D\*_BCNԭ} -n:o:I1\#W"m[?v(#-a==?gΧuVǎ&ڹVB6 s_.W5J@Z Z)yأ(lgQEBC/ot޽&r+Kر٣F[O4hS&hͽն}"kpĺtUZ_.52(򜛿9QIlo˿PcH}ϕX3ӓ+/ ȿ*$+ikԟ6I_C @ Y,`{~/v~-p-M1,Q Ԗ͚'~mSؾ?]Ӧ豈nnh_'KނK,(,\&ecبK8yQ,^6n O䟤-)V 5hnbs saTA ߑShѿ:WA,ɡAAtTrŋ-rF WMNz{=$ϥZ^L:5kUӧ_*Ν-4=->ꢔd^NFWHS?˿|/mioyv?+ j$ۍd{6"R2̽T611])]t;gG[yJE{>+?ȿ$/ҟ*W7گ܎8R4).)Xဃy+NxS,(Zeʐ!ؙ-\J [VzkPѢS #GvmӆMGY=u!9W8o뒁>0غ-?޺3m eˆX>0++$|A0aQ٩*F+4) v@,v0ٴؿ> "z pň$MCl.4fO{${uXc^K?&GM4ȿs0,nn.cB\(O?3m d/%%V9T\$pw@'FG8W}{ھVyTwg_nقٻV-ʕ)/}}[//˸Ƒpa>|p:u&ؾz/dG :/4c!Æ߇lpƥTuRڒ6,)gkdb5H,gE ߧ`OɱLjgf$݉x%)HNzd?~uCzn _Z?HUpo4@V-j[ZK~}V?-׮vM`儚䟪__K[4%#/v|F z/TKJfX).6nҺaڶŇܰAYeNwt4CBzFbňձ#~z\+T zժTj??:h?G/ÅCM?2EM5;Ǐmh.O<"[k%p tRC;guE+En_CCR3%HRr'xD +LsaOEyvNV@mdgF^ |Ljg[¾>$!>ݹ!>yfDTߢ$O?Hi,I~2͟]~U`;U[Hb)fo=NI]AWk ~{n eJ#;_knlwR?ҡC/1e^~Ww* LtR7ΛwjH Ǐ'O7fD6iBX5KK}6oaZ|32 K730SBՒY9qKo?P\ؖqD( ?ˀНٝ-D&A{!EqLo~-?\9~sT(?Ґ{C'd x@n{/}{dн{5h+Tkwf%x!|nKolތ" ^׮ .FKZ99Q.;W 3j?\a1S+ВX)DEi\FcǨʿeeqB?1S NW+LYZfU @"˥ZbP>G[hɓkרK/Gヒ_ Yf.wQ>Z*+wyv w8sqgD.]ʕ>rKiTP-&VLՐݫ*υ?K7}y ̬ܒ('Cu;OG0*Y2'5? :5?:iRܷ/#`@4vUYG6{e.4oqmZKZ]_ %6tmTG` 6.yԥRE|GV(WVM8խNKxS'|Y B$CGݶ쥗𸀮mڐG=S *~^^ɿZƟ4Sp 'i?3=2(mv.xb6XR_u.`|YOqRYs+ȅδ߸) yB1 P85/(^zyYχTD?JW nml??w@0w!۽d /[V`?>`G@}mri`a{/dwWN<4_'۷h,_=VrJ*M.$ Hy< gTuP&?A_? kr`}IEEmYeΟ&(~_,__d bR48 mtRdMҥI]ٿrëWIWݵKc/W)d1\|{7ֶ-l׵+lX<{?\-/kҔ5io֬YVVשSiSMA#$Xo[Rk<(g'ri'liJ"W>"OSXXj~XN!`2#@QS( vs'iof%Q~6O.C6͆@<s܀xɓO=<:+Ǐ_c=`dίw=m7S5^1kWؾk#k#iImK?55{ʕiia`Wҥgw4iXbNrv ޱc ~P?_W_Zj`?}4RJN.\@ȑ#^UϜ>-yx۶5m̙[nժ{>pspnj\Ϟ9}T֧OoKZZ~5]ІjFn KN.?3-o0efK(ɿg"#;'('Yzh4YDV^թ =yr0]$/4g3 5 p2-_̠{u]LV׌D,,ZΟ v%Gd)RoHqb>ҩeKӛ6n嵼ys1$)]Kׯ퉟5sHp}\@fc퀉X":-mh(Zd曾}J1W^}Ν'N='NXfA7o;eDo=qxm۞xفGY[Ph%뺻(}uԌ UĈd߾pćQQ+1xjӮPxU7z5KKgT 6W) wzy*o>߸ɀ'lԒp^{M^Q.z{Ƶkŋu̞={SNg7o^~~ _}._,-;o`keeee?7n ~uֳ͛ (׮^轍;h?x`x ׯ_{晧?*_D>+4xh_VQOj 4G0ټco}#gܫ3WfHs-Ou-K9P$ѥ(aoQނ=y1Nю9Qّ"2vnO ٞ-%hkrDD?xM>c7D^uj]䉵kB X|lEБݖ/߶-J~^ko#俉5?57^oN.S@@)_%G&˿nΨ7a9 É"f[[}^/P++??.W||!+pJ'O>k|PլQμ]tG^u5?jo᚟7UQ}Z FD0 *Ɵ`|Qq:dlx 31~ M-B ~hoO*oђ"ks7GNx$Ch"|ZVdre7w.jxOUgQήߑ-R z_*mJ{~tޯ>a/yu$կ{IՄ:85~/?;p6#۫Ws$}iO T_.{[nN4ɓӧM2eʁMo{?ٿ?qWWׂ?@%"A'&|‚?:JS}5F!g?rhFoXo^7ݺަSKߥ.ɿ#忨%՗M+u໯?r_ޫ^coZ tB*>mB)#$H! YJL#c9 ftT7WAPvn -JWCUiȿلMGLZ iS4͂k HhpKgOS4H ~VigZm - X"W^ynB_LOߵj=z_3S'ݳn/Ϫ XT#qxOOς+3˗)信(}٠gl֖&6w:dJW^}ҥ~-22bܸEݻ{z8v옍ͩS{#@sAUfΪnhG.\ٹcJ_x_E+<իŋjkkvj_nlC\l,-j2vi=ڛF{x'x/ww ?Kz}-keo>8Sk_ [Gh]L@So:c :OcHǸ B3,fo~f!JMoY'MYn7B7h_SWm=oIhwEGDcݺU)t$>n ֳ_D|76^XY5-[a{{ Nk ٱbE3gznjSXbccT5 ܕ+Wċ.cff=Ξ=ۮ].]/Ξر#vNN(䶶*Ȁ戮s>(r-GO?33sԨQh@ׯ꼮]3?/em['߀7RN/w+t4U8'*k QfR?J% 7BɣU?v.E)Zfд #y1`,e}b7!Q%93*xunh,)hQ AxwG5D5 ?vXѽI /J>'/67%iR0n*!(ik]4X3a5j!sl@ @O#nP'y nufwvD2CȔ!tzeA_^>zwVɱ;d0璒6.\q[N5XE]$pK}|{:_uۦjOi=eHMV'v v>ܦ/U[cmFoAmOZN/OK qbcc۽["6֪v: e ð$WbC ג덕 *iBo~24u/߈j^%=^9x> gL 07>p-*r>^=7˖}>|q}f"6ֳ֩]T[7Y)=?'bC|o47R߯yÖS+2ՋkR?WB]:zY]+uǍ K4*-*xIϿϳ-o_k,17hnΧN 0`z BK(_Zu[ppA``IZZEnnEqȑ{vvs;׽Uz^ 6/ q[9nǍg98G: U} "R<L/[SkwQʿ:E H8z$<DBڃV5WE Q"l7o,ƣGX^KN͆?/r[ %zQ2w+>teʾ?7q]_/O۠[@S+'UJ/Ӓl_ F}Z+B'Vi?_O-8AgB[;;{?E m- 4i5Ά}ai]\bҿ`Ĩ' # >r O<{vN̞7{Qǭ}#V2w6 zM8ͽCDx1WBO,tB,XaK+,Am+{=cS,1aHDRA߄eߛUBh4!a*_p Ç$"~@"y tv';c` ju ժ]5Фp<`ɱryϏFtk~~CׯNJǯ?rj#Q} ).j[/_'W+҆y5?$-QR>Lg?a%Va˺0NZo2AZ%HݙKiǎϙ=ȑ'ekI/YtA6n s~^-[N{''eKq?zSbrƍ7owWΘ1 +zg"e¸)V.`b8.Qq993DĄ?c0 O2)yn>%{h%"xo lp+z"$+Ι@\EV#uEIֈ@Bd$ !3m 8vEB %a,Qv0_o5w@+O7`"fxp)xk ΐjuߚ ~414[_ۉZ_7{(( UZO+c /5w͕Ocl?l o~]mA:l؈3f{G~P//ʣG=zgްyE_u³cF]dَ; Ţ\xÇ^Q} ,H:ta#$I"Tr@>bEb)%s,: hY۶߸qsRR <?~M[v''femޒ=r,$8eeVQ3g[!MT)p)_ҙH@1$d6mc y͟:HX&&zB 4FdvӪ~>HGB$Wjm+/d.>޾!||2vp=z%R-4"H,9*&l@`.]<`i,mτߊʿlPwB3:ЦA&)"x#.:6:RYIرT(BB1;)UXT>6@!s`*Al^ve B+Zd̚9adHfΆ"2"Ʈ$p ʿ֤MZگu{`o<1_RfO3[}z')Mp*83حWco.I.FE>mRx)䩭kP*izl)Fˈ|'?~U?Su o|j:Ϯ}ۅj_UW$iKK b9Ё˕J_[M%4_e͈" ^㴨(hqc͟3}>|"#Am-NMI =+)19==w0h08yEՎ{5^/ bcƌֱչ^7?::6## .FEFC]2bHo+VAvpv]XPTTTYѢŇH2{{*#* U*B9O_Jo[M$k;u=-04ͳA+lFpm6iK\n'ȄDŁH(a_jDB J"(|5>$Dq"P0B>lU 6" پ;0Vm X sdEIyD9כ)JMnh^i(5])@mıf6u7pgן:~Ate7?T|tIO5gWr6țY rHLpv$?~{'w;nRd1Cm/הy+F(/n5]`HܽWmÇݳs׮]n._r-AA!+xWLL,<4#F$F!..=Y pDh-+Fzm1 Z#S¶#u?lɬz(=ERS$")DNA:;Ac(o|0WooXrPݛ6_{jlTZ Owrm_-?]C:?!.ʍV/6ғ_x~XN=~EˎG;?qoVnj&&ԂcKZ9o`펎C}i:vp=&:<%%R^cĄE m ;  3gvpp?s!n$,9###([HZ Z`0p 8NjIpR֦Ma!/c`$c1~x K!P B=Hh*$ͅ$K!FHm$!FHg+!BHm/deB./o!tXC|>k8@ha@-Bc\lyveVA4LLX92d#u@%Z )_u冮nY&" ʿ% Q3F7ׁVՁ {@]??7 ?)~NyojhDz\o߁Jybۥ[\:((BC,\5iJQa|̐/ s8@;ZXEFDUvvyy^'zdzR"(VLe*WDX΀Z-o'>]G0>v(.rh&*bP$ K!dk!ZHV5$k>ђO6S2>C8@9_rD*陻F meeRF(#9sz25LkP:#S)u#Qa$J7CHGҰ7fjj@vhGJ37^v_w'߫{"x7Z14Uk%ETux>O~\,cGg2?":Z_<_(XXtF}vs;u :?n&+Luw?hbs󎎎 Ib00^my uG Kh8::]̙3CNdܴ x l?"<2##6<ܳ{'xҹs_/.*⍉!_l8=w'tљYE%qm8;1b|.aw-6ۇ{wt1|D_"2h;2o%DZz3Ɲ13Tcs9718G!./Nfu ZWJ֨D$ȉP R B?"]UC-2%R νφS# TX8ɦB"*BSzAl{b)VcU@RVԖ X(~8 ,`H0E x$Ru]:j_C';Z_oPݓc\@޿)H5X:3W\h77w>x{;v3g^n87..ȼ-,C##RR)qoE\.?q=7<%9LGJCBŠKSS PlT qo܈}$%̚9'/R^_r)e[2|]]Ad!*GTs"wk?Wqs9b©T_gj))'c<՘8c718("R<\=l"jR FeJ: p|Omls>jܵ&Y|5ngZ|Z{>݌O ee#&E( چzV BY BڋNW "7eHbʂ9~ WF)7$ ?'. öڭ (̉Vq¯^bGSOKKH ?M3`֬9ᑛ7ف;}΃;l{J]񃁃{ڿsАλz#('~\Sw9 Λ>mfZjznN^`@aw[%ׯXR\7O4t0yEUii-L#7tM&mQ8qWK_|[eJ:ܕDhUlO<1PGb>s188YbG=p!B"\*`ks[JŴTf9k9R`m3Rў/s՚Of Fq(Ś]%v(]&!g/bv kVt޼[vO@5i&H`@fHȊ`ɴߺxK[ =ox)y &"k[*;7MF߬忴 ޽|O{>/=%߭[笴o^@SYe˩[}kI̿Æ٥۔)-\ -Zܣ{OooߥKܺ|ii9 j?N/]‘#߽{큅 IÇѣKBxIIqirRرw:q¤Tif%Ȋ3cNNU8COHH*vlJ5o0b#XTЙB$RKLQ|s"dXkcGּ5ڒfh -tB!ԗ9#5˳uTcR/2pl>{-`*F58[!q "b `̚F'kmFh9) PWB'fASk5 LVXP]?Q`LSD KD,iX0aQ;6shjHE?BlkɿذGo?E4E?jW5^kn|YI4Oն2*(=?-֭G;XL>sܸ Nΐ>m_tr :vrvug„CCã"/^v$00x=XO91}&}QQIvVn*9)2‚̌,N͛lwVfvXh8>## @U0/@xXdzZ&QaqEyeNN^ee5KcĉƑW5ކwS@TTlA~<~s ,YW^֎ ßo*^Coեrg8!2 ΝpaI$O/Q3Y UHU/W*\q.YFP+_G;YĽY3 ,zwf+lZ >,"|!K SE[0KtFh5]#5jD}Q綨)2"S0t-SU% nҠڳ+'cEA -Va #l xE.0ñPBmg*FfffֳG Gſ ??޽"C/e?퇯_7k.Λ}oT>~>~zُup< 7ggY37Xc70YWjaq{yy!78`|8 fy0gP8=)1.qppjmٲÞv>;w[n_vUg܌LgݠᑎJ9lZek<|^<Tid,Ml^8剓2֯_ ;+y~^!]2*2iOqQ)DݹsW\lDvJrZQaIVf}6vђ:: n@_h[CM9?Et\g)/WJ~bU/Gb_=.*tst mDαwv`8 {3_LSKb5B i*EM8G. )`5kY֨5FG236#g!4LY Ysv/@7k   )+2cC!K6מMgoj<LQȿc'$ݽu5<4ug}&-%n ޭ\w~{ݻ{#*"aVFY@]vu0m[o3(6jMO]-/C~cc"ŭ0?n_ų?iǜʿs|\bnn>xu6K0`В%N;|-,44?luq 澺x 7N2-,4<1! 9y"*KK*@cc⡝W]^.?u >^CػǥVTV›'U?a3f~ ~bHLL/+-Mvr]ZR|Jx* (##qb|̞ԏ/VfSj丧8n Ma濅 BERڟ$̧b>s)Q!g3i?ȶbOͿ>V!ֆ3byz>KgS2Y Bil`% s&4dG@R)$CKh%dzY#kZ9H&bdH֖LCKT l7=4<* )7cCÒlvY c4hpXsz_x8Ԓ3жYszu _<`߸ք_kʡkKjXK; (u{ 5Gkw+8RO?ޭ垞'sߵi.{͙=wqY II)ӦNKkv98N>s6l1}f9[ܻ\[]u^RLSÇYhq!ϑ''$:;IMI7LKM////-+vFEF7IKˀ/9|ȅ mǎIq= ,Qc! RL;󉲏ч+*:suHo":+Y=!o#|ViPL`@ >p3}j6rQ_/\F.`F ,D2?"!Fj=.RޔZ SKT)@\#H3")2 cU3Ax ےLg-Д [ h@fS&L-'h^ c4hP78Pv5M{m~ЁE 4ɿvҒbeթM~_uQҥ3X 4TKo}o(Fo翬!\e?K1?~*\#F<)`Aefd䥥f@.Q%ˮ+*Ϝ8q K/?hMAѱ`YYwq옧‚OS+V~űVHG`A04B=<5~7f@qǹr)BBH eOVa>CQωڟ(BWH |vEt Q}ʩ3i O5=S?Oޢ8x[1;_q0mUk V""CPH>BTc#[& 4L]۱`s:0,2iL̐ D0IdzD*jdD72X61)q@<6ol5(~G3+#w)/ݻR/_:ߊ߯oM:_ FC*c#F7EO3_ҔnU%3`^O^d=/]>utp8`Ы6{]wrrtt#IUeе RB#"!2dg&&$5m xԔGçU²2yII\^}!â>| vPh Ղ6<ߗGpTfk8nR B %B,I"P'|6sg): \ `SʩO#J\Ĵ2b^V3?MVwDxUP b@xC3{>BR#BH."iG" "!:``~IYF} d+2CuD' ̑-ʐT@R}Lh0yU];oo7޲_ʿq#G֗_cmOKMWرwYln!|vϙ3oÆM] ,Z:fAO; }ע_촻Wq:eZii9(#}}hǾ*==d>:*qА3fr 'O:S%.:dlAV~ux ^A#cZ!g9+CfK"7 |xs9? 44>RY(8bȘ6B:+{u',"* .l30F&`\I! 0_ )qÿ@rfce{(ӞsTEE_T o!tyV"ٝ>(@JxF*hu @r$!1 ChB3XpD7BL2x$")`_/ HE,TLH*ER̆Z/C¾'F&U &k~Mmjvt)wODkAvIϛ;Cb;%)駟٣שohA.Ξٹs^z WkOW1'LMܩfo(R_]tonk{f1BT^.ww?mBPeqΠyE[%Iv{4IˎV255{vJy>}aAQHHc=v]sU9yկrC4شn)՞O=_`ӓ6xyqa-^lV6E>>~6֝>޾>࢟?ccssR*zr =Nlٲ}=^eeyv&ORVZfذ#|1iiYannGrVuvDq>9G:WF5o0x~*CLpm=\i"Ɋ E(5tٱ%bnRZEj6/k6w@k` *#uڣfhV[$l!t?p/8;&:nŊUm}I)o\ld] q `G:*^V)).bgg:uy10# @ssڴ)l6mh%S=3|j#!,]lu[n/,(Ј>۷툉VVZ> Ι8#y}{oSS03e÷;ffDGCJK͔ڵ{!=zI$w$Q XB6oMc<<?2ϥ0a\! -$\ ƥQ":g_)g>WPĉ 5*  2ekkR?ϸX)|^{ź)uRaӕB(ٺ@ /f_V -M8N @*Fclۋ=lJlYxmǶeZEhc%r n!wK r!7qG0DNHօ0AAֈW7wubl† ~sK&?Sݻw3{_~l4#z% &߲-oj(9[ܣ*T'8"p]E,7nՙo|#(d~ڞ >3 70]NN^Fz 6aDDԱ#G%9LP`0\ȪWmAA!nd*w_πWUqw;7:o~614rĨ2{ϋ>~QY9{$'ԓO/)Zgcw|m}}]]s/W!):0u |vʂ..23+2s*b ++ϔWxu݉1A_[n۴ MH ^W FAKy /;˼x>#y>8>i.s\!pTM½A*A cmLbrs6wsb̽9xxE{.{0pO/@"C:"Wq!tMm[q ˸jpW?ws P]Tц1i=Dīi+ :!u> 9xegv-6$~O_t+ Qh ?7/|P?PTH~c#?^ k,ʿ)_O|U/\h+~*a'8`32mXѲ{*! /\$`*l*Td6djFWDX:]b8mxj`*15MR*7Le duN1Q`2EJ1^I/K*|+QpqPj<?D8UV _&r}`]|g}G}$%IXRb,Ax% %AE&[5G耀VE+JfY|ȉuvgo-+5{ݢ˂l쾄rDd)rTdc9zLda+58JEuxj`gu"DNm-"I}$k9)}yaX}sO(*7f¯i7cbٿR͟o(p]T)pDmL 53wEԧO*Z6oX; L(&ZHH!::O5<_qu! wqq]uLW1=&a-&ߨ%&_`5YWֽEn 36 9;Ɔd"1""c}wq%G?Dnq(?⒡B jbEA_L9Y@f+} r p8B!!OD r Ȧ@hBc>_}zh;\S/9 ڰHt?Vvߨ= /w~aUS{ ?Ѣ ﯿR7_6~w_ʟ{G?ҹ凴ԧQ[]5R?MtݺʴG=RWZ+H$Z)hS[6+|ЦJ4P"Fr=BtY]lD`]*^Sa`2-L& sLtT^=z<-tHI$K$$rA[v 2`%yY/e ,d$FePl#|KH\ADZET ecSb0W~gخU}Ha)[R9țE='zL^j*M{T_uA/hpy{ >X%){W9#rOrίX_tTeLf&( T  Dz BH!WRIキ{ kwwmֵ~ܹa$tdΝ;wn=yR{KIȟbSVbU/`,@t^.uo_'*Mԏ}ie:õ!^_8+[޽7 oܰw@ jlh//fxMǨ,f̘wo(\_3wÆMsTJVkmm-[>̜1 > Dp߸q̙%Nɜ8n^wCZ:`2jegN1::&?`Ӧcǎ˗ yx^or~]lܰɠ72)eIT 9RQ^q@dIHHz DQV(55uF9""R7ע=⡷Vhj_2؂3fYlU=2jujX?hPuSSŋ77p|o! py1~euBNb8BNGNQؾ: &< MqXvE"|QnUʁ]:FzO;bwÈG& xE3|h?L"vܙd`(96/#)Oi Ђ[ sx )*-@ Qvaw5D#pgocz\$\0f$Oހ@zϵ9[\.^T\髁kG7=9я>GoH*\Qs'nM =7Ylϕe/Z&7_7Y(xC0OOTgZ,6;^}QPsdTCCs|| /,--_f][k;PҒ,^"/[xC%Dݻ W<0l>47N%h%LeCQݣxc?N@zf:H{vKuag~u19[F?F,&:5x`? w`=ޡ{Xa$vb:گb_kIZ"G?῝t%[U1ᘰӁv44Ov=܆n;7tPK~_ū?}!W g.:\_ӽ&}¿"GK*_}q1g[ojy& ߽Y8_NO^;\-yAW΃ZÆ?lQ/]lk׮/**T|}./ho_aΣnXsZFzzf辰[lFlXΠTBI[1q{4wg5JzZFss+8QkDp8 G̞5S"VU)`":vPVVn0\1~{_kn!8=p:0E0&U5G(J1#/K&simi5f/2U*Mb]~ RIOKJOV*--aa:C[R31<0/xʹDbO9\__ӯӧUz~: C3 B,+ F8nd^ӷLz b!) 9}0Mz?vll?b&?s?G8"7l#dMq?HT$GM4r-%#FIH QT=ZoMASpFX6Sd5K^p< DT G`QpC-_5:':C. x{/,E)aPge|Njtۯ/O?xHkw=EOpn=իuYݴqef{~W~ojw 5{7{^؟sn؟;jԘȨѣƤxAAl)0LhjjY~CSiU)ۺusG99yf޶mGTT̤I2 eR9L&PW(Tpb_bիH2 @CCN5`?XViIYccӡ율pwwW^t-\:83# llܸvJ*)S&;6>@z5!{ׯ(re!Oٙi۷mz }U^gk~/ M==?2U[ ࿗? 6Q_S࿼b/E]홇k"3扲ԐqKR-).MHH {_sW@$cY#0_d)@xxxDAA!vUUMQQqrr :XN0,nߋpM7?;ircUx v  o|ƆFX0G(hO`o+J 111`[lcFFVD  x0DeVDGX6=>rfsXo2l6M[ J Vkw-YeqFbuY,䶘vo >Wx\d\?@˧]װ}lG4|0`&z/yۄv"z=:'8I^. ` :z(0^E?FnN4twN> #HEl(p%dl7(!#>jjB52C#PT(8[zbip1VR"5nwT!T;{~}B`oDpcޖ3:J-J%?~׳~N1N瞻KJm?/?7; _^{5o z{ρwo '?ѣgef/xt۟] )I<=w+viڟ` vKĝ|歯-_rœ]iFZViRrsjVXְc;..pqee^gHOK1!!Q**xиY3gk:Z/~ ~>Zv]~~֭ۂVpOItY-6PTRt0SZ[[WSSTkH!0LY,XqfU\\ G(K33͟]YÏOqt:WQQS[6y\>_ZPPU*Jm -Tŋ22f mD<^g7s}5\Of8 `Q:?HW`\keq F!-پVt s{cfIq w(0eM gӁ`AvL f,q0E4(c4(#$Gv'F1xia IT*" 'PT4 A XEQq;f/ @{K^k-f:|~xoovy.1?/W(j!۳~NyB }fZJRB,,c3S{Dqz 0O>ч/_dذ?(x}U++>߽suiqOJ:Ah}w3gLw /hأSk o9^o<_/υ /\J͚u<`g͚STX;{}aylFӁ9yܿG<{^6n'|jw$b YpQ[k{]mErEEy)XU*5 Ro/mH1խ9U*åVw k(+-7r~~433+<\ګGʪ+kQ;N I_ WuנѥwϹW C{A3gnmiH֭ /^Z]] `L789_11ѱlWW z{oVFM_” *dY3xtR E^T)ɩaplmm`OiIjrOQk1qp>-*,jnj/,,?n$++;/7DcO?#cbf;;VZPc2ZjkIhm_fzsނ8֐)O ͻ庐U񹣟 jo(6MaJl{yrb<_踾Fn;g3opfĐ _&9>zB<gGݍ@,c99J''6hP+9̬}RD@ͨ #RVl(`~30ZF  ¿|OY<i+!ztyA^;L q/ ,Yljd =ugX:ϹtO?9}[Ꭻ3W}@{[_!hߠ׭MG nԩOpç>O>"O??g#{*x—\=G.O5fԨ[Ç߿coGO<8<,Ə{B?֬^a)G9_s P[t#ޑ2g[-3#:?ܜ Æ 5j̝wZpi/?پr5p8Gl۶cٲ|_Ñ^-]-w ^ojtO>16?@*|E&&$ut UccSpP|K"OZ["I||,Zۃ;7l2k.\  ;NJ (~+bGOOJLYm` |R;,SL<?%%##DQ1XTf25j-\tr* %)L۝;v8!B:`Έy/_Rk FU F`Æ#q^?{{7=4;.݂K  MQcp>^=w Nu'a#afɴ r"[0Oc9YG%tGz<NS,8Y@$Fu^]0.F )*Njj/彣(AU^ٿO ;?)o\%K~skq_?5W7Uk>=Gk#iH/[>Nˇ37=Q?pc_]Yyp]}zѣI ~_^0,[# [ PDnmi[lEEy%`vО`R ?sƬdBv'>;gt:(8`WjNP^^>8]sWG;4[ZZ]N7Pzmm;]K /ځeR؁zɬT2 -#5Z b V_lرRSj: bjj2ᩤdp[Mz~B[={ЉFdtf[gVo0%F6-]C;46IJ̖d$ H, ٧lQ:aD"'(:rp ϗqyzGi o ͈ o\ gͱ}L816`4bٰ)E{iJcB ~`'QϡjߣLW#8qXN #ӄ%9$x.w79K] w^A{Wn? $^/GaM1SN ?1 : GQT*pM6(j E͠)8)I;$@϶fvE[WK¿/n'^%&_e\ܶ9Q_ɚU+abګWw_(rYO%K Ӓw2?7+#-~ˇ_|^Q_[A ];OOϛžpaz??U,lt/ O/zFeYoЖ$o_oEVF̛' %)t?h)/xtYɵ-Y ֥xcAF#y'\? {p&M8pprRFHV _)kkmV /+Ш6t_XKK؄;w rOdL r*}\l۶])&Z8 ZÏzjrXGGǍvxbWR#Gyp2z~9?@RI v: ,$'S 'BGx16ll&AAY.nf ):@DŽF cI}̳5@9}-Augyzn0_ % 2vgៅ9?TwG 2[4krWfy<)sz,RCɀF3)sz?=BGaP Y-o##Qy+y][_[ ՛c?/{?[/ߜoy?|Ԓ#O{9@N~ySMy;˗-O>Gr)\ו].sM'/c~{<G|X׌U|AG>#w^|E ysg,?iz;|Ϡr~ 🛛ȣ3g^vnj~|2ŝiDF%F'Xm[/\>J$cxRJ..*IIN fpxM_pQC}ڹ# 3#jŒ+Vnټb _355q&9>>XrY RUVZ;pUBUˤ2n kQ_0e@H^mks(`0n޼FDUV0R^xjwP EI9vtC9&fwGŴgeriZ֩R;Eb폍3v\|3<ҼriXݦISMwq} Dظ<+gh7 އôws}>>n/v+ߺ[0ytO ؏Ⱦq {{?] &.EDr0χ0%w[%x+^ ERfd y^E7z{yT!ioLQ-Q%C<@GQ.sї)jEͥ, E݃\)@sn^Ubϕ RCk/ןqO[/&o֣vQCn\yu?}[C; Dw ~d[~|]σNr}CI.??H||gFC'"ɤI D?x0htd l _VV_^ </3d4z ZCX|Akk[xXĆ +Ə?"2&&tWD"q΀}8'xHqQ1>8b P( z{ЍCZYaǔԪ*K+(ˇ8YYN lš5kss4a;d2EQQFf'/FuesqYiKXkO)( ٧IJ֛-nfB{qmnSr-9/W82H=ᙐmXlC,p> ]N+dq,2=M>$9G+$k~=oeԽ`ƷL;O7d|LثlV","f)  F~k 9LڪOMIminG]_WO% OOKKl%>Y&YV06{CC#H$-]xRI xh;`O::p+V55gH$RW_U]kvdFߧL{}[E_QbKEs3of,Zl M8؆rt.i@2.X[[J#Glܷo,++ K}bREgHiXkw䭗_|Q^Z<5~JX"U- +0^78Bk^Sg\mvm;eWd͛7l)Q1v;;Ǒbo\1ăSa9C]@1ugdL- 1:9Y#,NBȟ=}3iC7JUcKy^;Lb!2#KCVSl %u6"=)=?>9<>]`R1$#LRҿCP$ԯf)$x%/p+kpR0m>ǽT, ؏ [=Q.z}o\O_v*_7cg (es^\ p+Wd׫ k}W:?-~{;?ji^8YO?yӖuk[֠^X?EϝГTnݺ}m{EBUyt՝&Mtt9yNz3lI;eu۶&p9]tF۱cGО XgfdN24=C.ˤRɺqm޴943rƹ/GnTĢ掎k'$$fggO0ATAhnnNH ***2UX^^AODf%7/_ VTV™q'U͚=J7[dJ[F ֒ -ɦLm2Z(mxtV] t!ءOHۚu|gab늉/^j`ۺݚ+VF>X*z @i?lŔ;1߆}l [('Gf(,x`.V"G|O&X`yFr~B`J6긝< -`I̎@3,"t:P죨؁?+_㘦wk+_Ջ{u^7[" |ӿv^'ݗ|DC3'@?O¿ 6/g __j˅ ǽ? \f윃i[lJ ?7mǁ}vreEUsY]Ȍ{S*M&R^|NVVKJLkgغlEuUau?}\XeHt86Fq9p |!7pu\\|JrJkK+.dfe#i<V%K664Z 8;,r9@>ϗJUUYY|>.pǏۊm  iӦ k@@KYjNNNj"cb0SRSAbd6[m6][[ga_;~ Zhrm NJ+C u y6]XXCr~;7rXUS oQu N!֮1+o_%:.= WZd0p/uÿ ]$O\X"OabPN=Dw u;?V DȜPN["6?tVt!1 ear0st($&")X(;A_;DCv__v/ m)aznGK+(r))CDQg)~ i t%Ѓ\zy']{j &Wߧ_>WyIKթS?\?Coo{>?:FYW\9?l7M}f Cgg2hrL4^Y\!JzC]m=@JNM989xtٳdefQ.SSj F Dypx2XpysKYiyttLHp0|ccX$/).1x`떭qӔvwȊ#%`XBX](*/HMMloZh]-p޲zwܱ"O>|RvgffnݺŹs+++ۗziStz}yEH,췃q8wTi4:>9%Sw6Epy$,CQ=,)7%]߶SߜcbJC?2Ofڡ 5ŕU8JʜP}ȵϦP["{:ہh*Q8g7 v?d?iTq`$ fR LFc&`?cGbd ?rr1[M&ˀy8W0G9Iwojۯ8zkDbqBa$'Ǔ{$ow*U@ ! , ` 3XM_^B^FEX\L]p6 E @gBpF~FbF0 hk#Lϛ˃zb:G>zSɇo:-TP0ni|ҟ/W_}1mgwmDMy> fotzǥ=?^c%q";9tZ337m`x ݖ<ޞ376[N4\^iUy WѤTBBm5.ڳD6Ov~˭ͮa旓W JOl[ b3c*??`߂OC߈FJA$D c|=}Cp*P?fӡ~'SK;?]:;KޙBfב^eL32/e0=!㉝:Szf% t#nt̥C(@xzm)d> @5Jet!Ct!8l%&-4z Ep^._Hl}W }?_;-4wۢ݊cGbeǝxJY*#JYH^OeUrIQ]?Z>?~q // oy_¿V/I_-A?`wQF-Zx?B)5k6N}NQ17fgج#O>1o%?YZZ6qvT}Di[*K ninvJEŢ7FcEZ6PN||RV҃ Eq3{WWUk:@U!U*B! %-xٛ;?7xj@ 8YTT𨀽pv%/Cx<Ǧ?=ōZ?l~,ӰFi!Si1oD7AdzU`!ѩ> ?8: tz G5J)b\WkWcshf'.TnC`],'7һgW,XlT n#To`~ L ӿQu)P!@J&;k&g&Ԣ(̌Uv:].h4 2KpСO6"?/րj_!Wr ٲ7$dÆ $l_I-8n_[[k,_p!ڵk#""$ɖ-[󣣣ILXfMkkk@@J  vpа#G#󷴶+ mmU4NWhc³rd5: /:GN}3q-hyJ+V ;BWns 9bLIҶM3m9Ryh}U61"?;(Wegnb ?¸fl6xa `vBw Q.b8s4`.%oJ{OO`F@'OE#f>z5cAelj8âkuyIdaf?uxHmL/vv C(10VlfR>G0 :AHˌ m,eC1JQ/r0RS0  I݄CY?/c=[y)%k@Y`{=?0ۯ_˄?_ߴK΃~z? vUk֬}a-//?==cƢ>mmi3/Ι~7>c4d2X`NWuHZqCW,_zq΋ #Y]U ؿc@ lVR*UjusS3/  FN֞:u*<|ȍBtRTp8 6]&L7={vss`,FmZZJ%q54gGӹyyB>bkA{XF . 8Q ܌eW[lWc߱ykK̵B'+jj+M} },LQ&J2՝ڐS1<31!۰9],.[}']{=c,#t0vZW$A]|$#>l%c |8F3;&W<9JǾz. bcOX{CEb R#av{Ĩ4M5|sYs]69'<}(^x uudP)jn""U cHF9 +^Έ T§,@lO! A`qi4'#_,[?. ˆgD߬&wҍz9__t=_2dLFp8^"e˖py\X F+TTV\r_qudTk4T'Msj >kz*ܬ$uk1f6 57&܈[yh<([Fg4a쳦%$,MbYƟ2Ɍ8!fSbߎt:؞uGO((B; 'G´B!H pH&5wBqcW< Ok6<~ bAeQHȢ@-a, Z  = {#u.R-@#`k07_s{}}CsSKccӂfv_$BA`*.=Ƴk/H]OѢ&h0?+2"O20TTT.N )ԥfa>{| s/PKKKZjZaAS+WaՁ嚌Ɲ[gdd}]f̘pBx="9>!\|恥UT'$߶}[iYiZzJ̘hp1p!3c LTuXŢ1q9+եLаb=z R4w!V-V0Pcl:uUxMj|:pakc(.qG|CqyC#M]a"ТRL 6oeǎ5KXJ/qvɦuoc锴|RHzd&jƵ3 0jh:]`_/?bQ^?vH _;UPV|Xb+P9K?QTDig8`CN#!g3ih9Lc8HO{G\G!N2Qkk[U@#]CZ$dɣFPς`pZ`^(<l< aOK{Y_/<\F;}G)N\wggFEF/\h۷`0۸qAo)Z1-)1f?wq?za݆O\^e7F]{–JwܢT(CRku ƒӽr|SRRv)93#=>ܶuQMKJJ+J * gccpp00w2E܍l5qb{e[ALT{7̪*f3$$X?E?`YysZ99uz 51ёK/=uz vWTUzLK%UfCYNrZ] j̨SP^"N53WḧF%_f=Q )Qɦtj0mQ+LkI]_ ح ,D&sP(ZǯeKZnQqH 옯wOt8W捚56#km0Z@m?~3RT:?߈?-@zN(6:|)6@m08BURr ~2W?PEpCh\!>dO*@ToA62D:{Pbw?3]?%?ICJZ|Ex3`<&eVNjkwΚ5GѩҒ2&I"+/ `2MMjhݺ\.O&JSXYR2L1&t2\af' JKjk̘9(0ץﲥLVX,F+(].yxxt꼒]c.)L U==gpFҥZ RDfxG0o X& g#:i8VT""ʘ Dqxds0>Qվ!ݻޫmIMazWg:` abG7mlj]#:cp[:Y6oPG6?S(BŒ|yEh)QFrjUP6xaWǼ%k^X1坲-Vj]4f_YvxW `LJoOЎ.`q3Riux/!t9_M*S UD0?MPc?QqAG Bhb&O %}'3|q:8B#G9iq Y\T'a$[9 EH'\Ϗ/poMp'_ ǒ̗-O|~'5 Ӡ'6MgFo@ /;gUwHZM,zp÷Oiv/~vo/ݫp]' ׵+?{oW| ZoMܖݽ{SL osW| `A݅QuU  ` K.W&G'{mRUYBȨ ZP(a0^x_<:*HϐF5;/$$$>.~K,rFoӦMBEQP/^ (ݠ `0K$X]U5uTLFcs^%3D.&OqoiibƣT)9/-+IIMibRZ^* 2D*;t}|SfU,+!)w_iyO+jZRF#s%%r8j\C)s>*-3bqɆ,}xgՁkr&V*ĝcگb:ـLt#{M)\;${YjvA1jRSWpNQi'daޥœ} -4MH {Lynh84b.N/C0`3! 4 f$e"Z U(1*Py$ ypPm(`"@lE#i/ [Ɉ8A@zF:DN!NS۞|Ep짜D(ir>a9OYrvגePU>žf9EԖPѓ~-=#$K6k ῖU@DGF^l<_,3$ȿ:}wҽz>G^w}|Zk.ٜO((⮜IH{ /!OLH*..a9ykbYPPp]]}MMUfla? /<__߸ 2E]-c=ཎ{;)/T* 3ZV555OaWUV"6 恷3\t:3f \p!/.*3f:uhRSRj5%ʊꜜ,„ؘ4lvSSl(999 PR! ̐ZMJ_++/6l|S. "_QYj$5=-APQU BN+DRRUfĊ1/m#Bxd2c Cqa3`Lrl CL!lM0&kҺc\<@:M!ܙe#֏VMcL* 3vftY -3Ӗm(y';vmtc`HFrKĦvƣfkٶlC7C7Jl# ̀~ JI! h߆{mlt[!^BlE4[b+EQ^ryq~| Ƌ%>> |0 zLL4PD"nhl|q>{ٻ2Cj! :8gV#"D"+4Z(fchy6_qm~gzqƮW)5&#T(ez;E4=h, [+h )Ŕ 7}J5u :"1˷t)co2,* :_1N3#N+ߡݿ1(W[oNL5W5mӗ'u-h+HUT!am;vq>c=Mة!46ZJ.`q`=FGW@pI(4=j~!K؈llt[)ND/Ji*E#]!.nn.n =.!] /#vG}J'z?AGV8aY燰8DE KmO"{/%(v¿uM?s[WђG}䇋:B?5/16+ ?`hFAc`^ËKw"Oشg ;"[nz;wug| /] WWϳ |8ڇjv }֟Ϫ.jN ?}_{*:'KFmmN6=88bϜ1+=="Q*T ))ɩYF DB|2F]Sf歚1cƮY}Ey%(MV{pO:yWWl@5XJNJ JںFp8␐A`0՛yMj?99 aa`lf ,̯Ď zH?hÀدiXlx}~60ba\B1mX?p?v1LEFDyv^ΛcFIƔԶt_ ޺Sscs2<_(19c.Nh~i|SpyذmҢj{h'ߣ gh=ejS}ֈ%/vsnat'q]=7{W K2;\Ƒc4Lm9[ި~(X5'3fDPt9wA ;Ât򿉄Ֆ (HBO?Gq¿b'!b+ڊpt;5AGs4М08#]#N"=N .!]>@]F\F&Ap8c;%Jäsqi#MJ+Vg 7[RRUO +IÏ$?agZO! #?v~}ݿ>+e=#zN?#:`0< /j_z 0e'ߺy+q淞߼yIb_# xBo7HYus3,??_{ 5@zy6,]zuZBcp8\63yҔJ bIeLm;b''nۺ=$8ѡ/Oy<~mAE܂!cWۧ \UYJ~ja՚6u 6lXHpH]m;sxbsgaa!}h? &&&33pd@RIaAYs~LfcJJ 4@ Xhall  4xCB@ ++/esX)))U%!Uuu _PX0uh,;7[gЕ,^"(95y> ~چI2#j<^Tn]j03뙺L'-+00LUQkM:ZTflgg]'Qxb; -jWUܴ+ڞb6`>p;r"Pk4GeM[MgV-%ش6^eןZuɀ[g_0fZ8p>Q3'nYv.)[ص2?ãj}(62aq(46 C.~0l$N INwɟHqޭ82"B |rqzt;<h9 u?q?QY˒'J}j@Hzn.3YH-u~TdPQI#O!k/PLWC/!ɰgw,2 ry?_?Sп-+-P?p[nwܞ:d:1ߺu {5 `sSU?99)777--?<8,lƍf30uIuVRm۶?M!?{ 6,@H{7U*3ҹ|Rߺь`{4453:^/s_d022~њ&{O7?x`۠e؊0c)uNҵJIEYƤ ]Q)*`t}C>u V(CG ,!Řa 4+gƬm\Y[c*0)jI1ilrƣƵW[-:s"W^lxUr*<O,[h<*cC*9/ ?hm T5K620RlI"mDE%;^ISuZzWݏМO^=G|qq G=OC?4POAt?aO10ɏ:Lݵ4%zҴc :ho%uI7A X'*Iȗ‰:|28Xa[OZV?3'v#jY3oCN{ 9wsЙ3_[t77o>{>:߮\_C8ÉE+{g|OtVl V,,zQk'^/Q?U]4GS%y D߷dEfb9yiSۿxђȈ(;gܰacZZ>?0i7\㛙XA_@WTIM9+;;iP,8(XPI\06APwZX<W([+Xfm||<˭S*:N I---͟w<$xuzWff͛ (*.2 z>"2H$jfuqIş.aJ`)i)%5%6od+*liK&}-vuY9Fyr64K"C/#>@\ >D^3}Hg`UOX;n'Pl/'RhUGG Q8#8H+D@< P+$!_<,"6< 0`8 05?Wž_g tӟ{JV??yy68`k?{볧#v4~ |?~{"4?~"@?7~I%89[_~ =1܏o ^`#ȟW?} '뭏RSM~= 7?{IqX$)**V*`=+3[ |oYMuLNyzFC+ PdD U@Qvo3giF"P}0LX[[b@D rrrR3ggeiԚzF)S*+* i4J&zh0| LPEEE `'B;55%((0 0!J05*Hjʤ[m`T پc{ph0k! P}~a~tltfM sFcQIQum5mEA(MԽ効`IdyBk5Hj聆>K׶n}u'%V`6s owUK:J2k s ֘ ͜l԰:NVl!kA'`k#5եizEԭ.zm75P?F6waa-[ydދ뫼'LD]=_2~ĆYo)"]{͝<&~qIS8[Mp`##ކ5RT; N m?2jJထbáذ!ϥiߎ̿bS;k] ;Iz{.ІO~: 2 2#d'OW.#N!G#? s8'>̿5 BPG~WVTeg_a⥉I FP FIP̿72_)+-\4b\X~u VWUOSKlC& <ǍWVVlY㱆<k҂h^n^SSH$ilJ%ӦM#۹sWtB"֭[@8_fVO>a|7l01!1>5-l%e%J/W+^_IyszXdXN^_MLN+k"m**6׃Xߚ}!a`zgF(gm%ںEd[G`o4?}qےfpXJ&_.E2ƚ=i{[%T:LD3rܳY l[系9M$Cz,XfxW&Pd,0]Yk:/1 &5lp cwE~>y1’5m]:mz#ۙ1ctͶyD 6XT{%NA#  lM3ņfoŝ?bH@J ^z=@N8qߧB}ek_ ?]@>SxF=dB/u!M@Z-9^3¡v4"t2O KgU)HfrR+o EVeVB@,ig~`B'(~7 I_\\?}$H?EZ `mܙo~[nߺyWVΝx_nrӲh|dž`Ý:{~EUA/E\>~p[~E$j-7]|Roy w_!G}? >a݅kh)4o/ m ͞us$67JdRl=mcE@ZNҀdXMM-P_Y'Kg[ kjkj<>b:k󖄄DFCOL:_?^{}r3f*^_Z bbZx8,ԈxrVV-X&1<"|u;vl_3;' 0tLK_(jD1S~AqcrsJyQq)je(\8lTna-nj# ˫bQ4z~֕ڜfY*ժyy{KwE/Pт5_/0eJ4"Fo4a@)%[_mYU]dlt&lHIuYSn^'{U1Vdrе\]j A#Q+L==Z9U7V͍h (z`x,OuØw]gw߁;lBZْi^ 4ta|sK ax;:F^JQB*G?o/;5AOfp8:|>"+i'|L+QW/#C.!Gz?] ]C??!6=B=:aDG%8F`Vة+s{GnM$RBB.IW I^A N~9XIVR"5?ka2υ5²?`ύgjaIq\I/cԉ/-Zvx `S_}_[^ݭ[+?_Vnpw=:?kM㿯 4NίuFzm_y_ qu? Ctx<_{#߇ tzzo΋xLz{rTTM̦͛qæ‚쬜VW(%%&` )))]3``xxU[Pĩir5̝;wTQ  o d2x1c@9(b*J*qm޼ о@ F]SSSAA>Vtojn&fHHpvvٌ 5ʅ2bbc,[a7o۱ `uk*ʪk"DbQ$mb⮆,`fV\SZ^3*k* AkІV~]Ai㨵w+eZVf`Ly{3j(|ޤaѨZL&VG K}X`jΰ/^٪WxfqF~5''Ǿjdjk έ:Ws+ִTVW{8]:z-nm6RjʓGGF+fxI(꙲jQ]E-[Ge}7eb@B7Ǹ@ڄrڌZ%g(qQTz+N`? MT& X8pZ@6⠢8(]MG(q>}%th>N:[Q_r<Nw8m"6 ÿ6'^`|:p܊F-}-Wq@Έ py(@K>?b@IJFd22H$VZjZ'ze B_ g~I?Q߁gO¢nu?_|x;0'7p \©w7o_=s˯ɲ |S_ṷ6?y ?n%5[O&@~ɢk~5tǼ_S!A͟_O_?/c?WtudBs}eIIYQQ={pZ774p0MVEE}٬gz;{CG7&Oo􌚚Z 4jP ⢒dch+J {6#!`º}[#gժUDTN:U,F*?877>>{֭E:f7 yy6 0 75 ٭,PcIY@OoKdxD  50gh&!sNڋ50&GF'jϥ9Pl* #{%QIf0Sz5 1ua?,}Yh.L6mi:c㭾?3B/@ǝ<"b3: ?DS" ?zL;"sFvc$ht^k3ດ|^`5[(_G:J2`$?~",Οa?v^WA_'~a}:s￿qn9DA/}໬|ݷ/ovӏ׾֭l8Ew?9|Ʉ?Y<_5zկV"ŅӧM}N }u=k&j8#On[t/_O&d}/ٳ}n”c)/T4*:$8ѐ<7W,wRy{fU-dА--,T^WptA_VO嵥B,( 8r\usT׀aq&1pLd2 ,B8р~۶SLݱc^ax3_#od6>,:<"%5@@"dfeB p9 P,b՘0Scsc|R<'&T iYaVEטktF]TlFr'-Z8`@ȫBGc0Vkr e[ZRb)9]k10ڴr)ޘU)mNZwf.:]ݸe :95u\G쎗(Q-6UXZ(yfn0iJXzHSk珎Y="=8zfb,}k1ɐUjGzy0!nTlmk64I+-,CN¿fՎO V/%m?y@A w^琭 3ȂUo*DB &g‚}8;C# :psς;hJo?կn=,ƏaVFN~(p':2$8X1i@b_eMz-7"A+CiPso% [OK\lj┕O0V0_QQ5w;6l{cWz9GGbmOLHi,h? --QѭVx!R Rc#yTӧTVT%r 6,6&hܸqI+GiuɤҼ@R))++:ujPPPxxxhhHmm-ҒKPTbuE 3g*2;7[mܴaMe Fhf5wy鮯ftV 6hitxm}}L~F̨5h*vTS`--̖VfQmo愙"sUrI*m+kT8F= $ɃUcZb Ff kGaa -*U Wd_dY!NkU9 _,@hm-_.d 8c>c3G dedE= ʇH+xJ=/!:Q2ptx$bwle!lѮ =p<l&O| IR<Ī&!'{ȣlC$kuX"t? $^Jyv/t!/4<  _7~X}wlψF1k?h`2O̭v~ wo_sZ)/>'",_z},|#F4 pÏʪjJ nnn K[w Q XUY][X4k;|5K&51@oju%eo>-1&^(F1EDD_IP1"(J?__?xcǙ_ߴi X,rw_!ޞ ( ?;;o_"l6 GDoܴ1eȺvzOo4[kMMf߳w&M׮ lhj(.-@+bW.1U=)fMf~,T^jc 36>VWRJ`ϖ.2<}EB|);5t.be Lk˅FZ͌7+W=YT(3%g̎Ou)_WWP,ؼjj$hYc=\6k5b{z纻ǗEm~ 3ܫnhag E z8k36sӖFl `&Ijh < -$&նj@mQaQ; ]dg=Fn:0pG:O9iֹNKR 6^}9|f33i#?F|yq8Ϸ'>F?Bl?E! HˈGe|B۳-PiW;y@# uӾ:'D:4NX}0ΧSaB V~ @AJEv%,C*2@X1?Oגc%Lݾra?f`_8S;"k_RC?C=~CV>8??{pnhAן Ӧ^3K..}ȸ0ٲ ˖.;lݲ/π_τG}? O?9}iw9?_6ŮcH2io ]9k֜ԄDRe0g̘`ƐCC[FB? ??`f/9MFB2L*yx/uz |m۪ꗗ1slL ]v`0*++W氯_ZD=S%z.$$X$Łmx] ,͘53.}]hئR+6, /<",#3ֺmJ='/Ggв[Yk</*-ڲ ڪmi*tilnbR#fHh;:4s}}A}wKBOLA3GMۇ/,IwNE϶W^CG͎O5|M_aF*q* Sfi9SWmUss˚)׺t. 0]75#lweq"oL\>Jў]BccR 9-/nx}tҕܸ;=6iӮi#/(lp f׵%7j|\4 ݻbޞl%4[#oLx(vWP{(CLúiﵸӼs;mRub3髿 ux}/Ag;~ SӇ0(/#NyEuf}F: MAKSDQAHS@{3 ޫ$7dM|{8d4h&}޹sc ι?: X3~k`W .z}򳏇{W:4?~;[R_<)Cf>Q1yJYTұcΎʊ/-+߶|m36O`'|!>_0M$1)LLN+ф'N?b`P zTdd2id'}[Q^WWWIzoXSSނ|4=11!14`~v`2=r w0.VESĩzw7![U?kĬ?0jiY  3m+BaQGB8 sntahdοZ{ZVw`?X o{ .Ϲpo"ʟ58o+W6U^/3ajJR(j%Z z_6M#"Z?9s>?^=w}RD?vF iCوg4 rU=>F_Q1~1 O9?3Mҏ~ofB>5>5}W^Rݹffmw;a(\7VQlI,J~h/7L+gr"#nܸ\IIqic3/U`0wYYg8.cЙb7o`1Ty*MOuzn==TKsծιra*JknjF1<`##/ f 22<`iaQTXV#[[[Y$* r z*bJit[{Ebx~wwWFfCɔT'Ƴd,ݶKO?y2)OvvWӮ&\c_(j QA"@}5!PIy0zbs0`r_̧2oV_޶FfbzEJ%_wTs[h}}gD4WN0di rVVzĵܲ)q%O OJϊkO*?]lb;[x2_-:G_w͆+އ.:RދY&yb$VC|jŲ͘5䱊 oA\d{ԃTCY9 ܤ M#Κյt?vl,UGji@ҧk l9 V6pWD(8ǔIƿ>7 ޚcC-646\7 ܄ o<{VW~î>WacUx UKo@Uu_Er5r>s!#y~US_TOyQgi505zU 2B*ԯU wjO/u!9TC!h--{>Al|F?^cS#^)C}~ ҏ UW?LO۽O>  ܾeKofqg*|p)8Pg?{O_;мm:T @FpC7`pW`9B/z\/S;Hg ùH}S@/!w9b>A[>Uw M=|pH(.J96wsLLl_QcOA$}aAU4RK5i ЈN&4*mtdT&q\&988$N alH DƓ'OYT% >}fll'a㕕R_%forw K $buMUqX"[C^c3a(IyuI>_sp`"ێh=T2LP"JS<aΦd"ӱt@_΍*UK')Sy9kkWq$ډZ2$J)"q$9s\LvɆ1Zqlَ+?⛧cˤUK܎G$՗/ZɼH̒V!zHlo @bu0"_0I("A^ϖ%M<}DZs:;-6Qtū77nXx׋l'1ꀢp*?iWۯdVYggWnKJp#)*8 K2fV72P]N$&dqOp2άuZ;(;([((F [Mdx/km&7D2o߀]}~.#RWYU_DL_6!DԂU=u_W 3?SgP15@i֠3 @)0U**B ʿ;-1/UM= _?63d}?[hُ͗SO{D7 [ އ{O 5۰6͢}`|K L޽x U\\r*5B.,M-p-*:sE8݁?\ |RL(Y슊J (d Be2Yeee#T<^& #.**khl6#-=Π,@U(?W\?!dX[og39\6J>/T_N%e %KULZpK"jko5PLXJ,&4RX[<|*+T0rwt|d8"Ouv  |e~T]~;V4-r&k7vp"ޙ' d )  2SY_ItŽtebO(O8žq@o>wHai! ^E6ILpXeq!9[VE|d/ X7if}~iBv'YME'R $b JO;-woߡpX 6i  02lDzvJ3KOUӚ=WuIZ#KiInc='ݓk2Ve-, uiKF.;_ED- ?X݄=MCW 7!Cd5z 2a9U_ν ^f}yu\@ I|?S#?:ukcnYyooq /,4Сé23p8p аQ,v=9jßb +?qdtQ4qFolhwXhV<?+++666##czzFQSS ];%ǎ񸠠@daÇ"FPF& yn8zxt?kjIH?`S+S(D*"y*+(4r[JQîve^|dtrj0M*1cdn*ZR%tr,DiPQ" fX.\@2΄n[_ήf({{-z$PyxbOC0? ]sNL K1LL"JSR SJ!cνWN6[lD Iq|p*[!ɇ}lwXFL%{h 2VAY ;-d dRɅ*pX_rX1z%ӑ Y:;tZG#ݛf T_xxH\y]|fv~vGvX}R:9FIs5,])C˔yr:ܦQ#~'&2돒EHMlˆ._G222+(X2|#d5~ &kм7!UG_U>K}~fxI!%d' p.Tˁ$jϷ5~3OYjF;/އ.Yc.D [ԽjOs9_ 1q {2u_ÿ/oS}?$=E|5G 7lP'=-#2b/x_HљLP :v4Cqt&i>88@E6m *==֖6Ax$H23jjjeRtYRRR*H'yŒt:}ddR.s\Maaի}}}+*in{N::=Vr M :K"Sɵ"u;cW$v'wYi'IΡz`, Wf.0$hW($ \@*U م]E!šQ7iJnxI 3aC.`y%g-r[|v ܞ>?6٦ VWf2juU5m QPog~#o| ^^[p 拌?24 DB~kVU5-bA90Ru;ymK?C33g{~l|_=Q|> sg?'5=H{nÆ7nٷoI*oO4ihp*?/ nRh yl NNJJ":te)T Q!kin;Wtt3t2)''Hb'Z[ZMaBYT"y4<4 =kED$uuud2RCC=fs𡡡Al`ICkĞ :כbӞRfkh?M"Fؾ{?Ƣwwwuwށ^.әy&shlGTWꇎz(eܡ;|9N˖Z-v))七XO 2>Y'ywW2 NVr[tµmY9\GYJQ1[cK2_*i:}+ %֋K.]X9<_0QK[cәܙ"O' t?[AbHK%%K?vim65ۂ:ǖgeJZ9zϸ[ܘ{,f{ưoOڐ̦hB V,6yLow{ M4uh v|#uXdx W1^?L"q./(-/.z#Ro]:?c3ӀAƃoa!3 [5*?^߅XW@P B):AʿY@<}Z _W?ujooX<injO_PRR +V<ᙏbKAoy^)W=}ߚ<"n>:>_=>>|U?c?9>Bz35ǖ3L_gO`Fzf]](,aRSSaF3BnڸYO,"qx\kkvD"p LTJ/0(,.s`*Gm=H>8Î65?v8nsf}`r66Px*}{"1dbW$>/i]9廔E\,]*sX!u/7Ly3-ŊOlYOYoFVwhA)1##2GNU͒/9}iKv|{sUt9ÜwZ$%:MfIOm9>|cՉʓXL鐏Kk֕DпAbm]g";UT YMtPJm9.NF5Id>lmtԉN<ۂnİ@\Y)qttYXc[Ѯ6Fe|et er. WPW&_$܄*|/ &! _@ڗR\DE5KBf*: €-TϷq|7rL טӞ_0yU6B#я7 e'n7x*GZ࿿g*cM^dϿyXj'@=?Jß "ow^߮kƗO~9>~L ~w_Ioy{ٰ̌eSҒS+@ΧM ۿ?&:j_IqI<{ n> U`<OHNJ`م*͙"Lq LJ_ LiiiinnOIIٞ݁ 6;@W\_ySII%`G2Jx\2O,7/wHhmk1;cذD&Oy*AeP A- 'VhF\u qR,X䴤|#e.2MM!Ed[(LO*[]"/>;c0q\$]e,7tc0ԬT]/4\/SGU~ҕP*{0/X2- *vEbҖ.',ЏNJQ BߠNyq rcC܀ m)c}.(bۏawv. 3o!3,q4+V;y=7'L10*/@DS-YoN8̳7PM7ػ^ZxvFt~i,}ąKׄqMrKxa[OOzøFlyueԒ(wPn Fͻmm8`Կ ހ櫜ނL@߅ nÎ@ Az/Y/*Wg:|e?*i2Ⱥ05H-b/T7~7j!ƪY؟E׸)WOv45TcTE?!kJ~Zg?t?'OO/ܗP ÏTP~۷[YYr^Fc4%=ӎOOOxU0g0]vBQr\E؃":`OfRN///~``\㹸i4ڟJ{W^( Rb91oJrkžwE/>os궶IeeLkjX]Us`LUUu]]H(C$f2Y2uxxdodѰ\Sz彥M|Jd GnmmCIXLӫ222dB..%[ۜ[6jnvt"h :U\_<<2G{*;e VH:HqI<6LL!MRDd&`eJimCj3Kp65ly(S3RG8&;}e RR*+ݶtl,-P •aaJb N? `RѢ1A15-aG EF^VhD>PPʭ霠HRY/ k5f/i3yŸZR&y+!'72PVךˬ\h>e *b#'*c@[4Gl8ޏp$Yg9N |n3yfi^Τ>mNmt@G84TTZk6ÈϘ#iG[mZ{6ƎnJxdm;95}r})4&X[݁}~LAZxmxwwJ::dt2 -߃LA:teH Qh}IM"Eujy i8KF#B535Ly3?4u~Fb~sT824cDUSM!qt/F>߂b Ut_?;~U'K֭HW_ӄS {xxHjlta3VS~W[+ w}ߴiCo@ :uj>L/?O۶mkllTfo;cCWwk `߾66|755b't*`O vsUe._xlߣɐ®ԔԖV:7roII ?iil6N'''X,VCCCKK`EV>j'K[kkk)2a01'2|(8Ms;V^[.iH>i>;7`?%e>"8AF#!NN!UJ)SVL=y?C[x{q#mYgwF)67on3+rpA=^$"E/P(UAtƑc>J_Oօ4#'ST+ea2YZGfb.UZI]R ZQ0F3r#o\Ոt^e|BR$udf$oHӁonYi [DY9?2E`nXOWl L"M$Ku;-4˜eJc95w hk7V`Q!߬ݙ= n@sDmf;/-|E.6:j]ԂwP2{V@鿎22Q߁nC !w`%kWb ÿ /Zz*߇-H >25}`wEC~Yj}O<5sբ}ԇBRJ4͔U"Z3#AjßfDS= AA'<@Z^ioxvI_u}/R ~]GDDXZZNLL;wO?svv~ofHYC|W>GFFFGG|{3r{ @z''WUU? ,@ nx`ϺJx`,?{'O?yun::&&iu˖gsz{{{}}IF"qdErsYL#zW)*K̨yHei1TJވ殌C5M"JIDZX-4>|cgP3xxon5GXz^XJۑ5C#87E4XJ\dvӷּ>p6cᒡ9y=.{swuj,E)B{m!ii1*]2+odgzu<9kK8lZok-2e.\_p*jmԂ0_#0 z 79W97o@:ߗ E_T {.M>r ,\gэ`\W$jHhg<\Kό?]W )$3=A̩jjj魯o/"R KYZZvɡJ4]__oooHRD\.?B& ںZ53\8=_,L>y.8ᄑE>QC39l^s$'aɣhp_uD"|1.r))K%JK&)6R8@1 X WV)+e+#MxFEL,aTP$Ԑuov#<R&j᧕E/wN d C Iְlrσ3T2Qҋ. Z :)IP 8bM9z6Vl'~Gm‚ |%w1^q|uo|{+=|ԎbzۅKmt+4͐mcScX|8ݜ#ItU7h l7ӆN\\ ;9M;9ĥЉ%//^_{(߿p0nSDv/`ѲZ̯kDY"}-FYF^C -uH '!ӷ2| ^&42sGV {F%@%b#fQ¼o*B?8Ջ1狣k?KWF ֐(TPDf{M!1s|;9l3H|i~<7ַZ?_~o@1|!؀u꠿qq x7~[W]xW_8;;?NNN"_|s߄ gd19^V#344H$I^Y_N!S+WNO|S$; !ln YP jQi R4D _(a0 :EGxȽ!!!FEDDp8):Zۺcwtvo,ݷa0ňBLR\>30?â1~o_39(WURb2E2:?ܟГBHtLT3-y* ֱ¸Ǻ)[ê+ J ;{p݃AY=Ăxa=hH9]yX e kz9\d]tG=n(sŒi1Nܚ i]˙l G73ZƘ-'ɶU$'[:$'y8Ku0=3}g5gSiSv2CՊj{R'SUm"c|+k*F0qS,l()df#kcMEgfE1.ͷZWܵ?IihygCI/N'9A@Ivjr`1aEZaS>Df \X! neYm1勅[P\uІu w~lnZf .(bYTF++cXDQr6_2^ANiF.B^s)`"Ɇh]m#XazԱ\~el-rtbcƆdNRlv,DgWȗgͮf(OR}*⊅JJzzbIºeyѸ9lE<,~\(r>߷G;OG?8.gDBBW {$t=,eyA{yrnIOKҕ11KRN7$Ib,AmUuW9* ߴҜrA1Z,S0X,<_ _Ol*a}}[)<;%Š*SB- b(CGvbVvO 5vwd ,̷9U:D>sdzsYV蝎\;;w{ 1V⥮mG2%gϝXܪӿJc%ű-2!eܳny:N!YsZ\'N؆Tk(w)ݖHL~C%FGn|U#k2yG֒(ۻp-Ԓ(ۛ(a# ˷Qn -x`y0ހ?`_55_QU q 5ث^?d)Tsf,:y\UkJӇiG;V>$TR.57"RB9#CT297Z4v}O1/;ϦO| G޳-"z-%ץx|>_ 7r91<ole>:: hJp8EȃaH\HL8\vrpL䄚cwT JH<֌krgRM&DO/=簸|yB"M$/B(tveeМ5Kvaa Fnͧ[9&Be$\;I?ٲycޕ-nڦRuڵ+("s {+ +Cb:+/}m]1KnQ_*Ɵbok/#KeuI].3}ϙ%|@I\7,~Sd%N햄6+Z!Aʒ;vO_-ڼ^6W+3.8 B|FfFdǭUym5[7e[4m%IrN&%K:w +uRCciО;`WKf!zCҒ5(V.9^%I;5>Vi7HmR\5ve]-w,ղe %7PKnl#FͿ{ͻ {dx{~\^^E޿}Go`Wn_SmQwW;Uk"H-4hfV/U̼])C֙娍=g'i_$"rWÿ ;~%}2_fs/O!CF^fQkK[_YsǏ@_ "yw/‚aHL3 'Yu VT!s~_G4 DccSPP0H6ov̒JeҫdZɮ]X,Hfc/))HOOSPAC쾚V|fKD$ XF-lr v[5.eclNBtp]wm≄apwcwoocKOĕ* L bw/Jau07vZa.L{&%5ԓEk0kpi :ubt W蝩<%ڻ,o1Q<_6^+n}eStwX< f\hbmt3)/xs?hv| qCBSMOz+}(ο—ҧ1˦(B&_P薊j ޴w׭]^0Z#u=kQ#MugnN>ZVFĢٞ{6v!s[4&<业i=niXNzLa': t7 Cu$j jć\;nKڄ5a H^(=g!4z岉 jYe"_Cټz[((0ed B n-7`נ9*xjUi BH1Xf?Y/VӸx?KcL/OCW'bɏ\겿J?#GU^=Ho;Ro@|K?AaȐ?g.B&jyv>ߩWhz5O@ϯ ?y{byOA~ ?Ab .O 4#0l,vlB1`y<@FFJ^,EH17__ HP4::#ö?YG+N5XL+`02'bsܣOZ$4X`2$RT&@GmY{h # C# /$ޔHm#A%DԠ|`37R2Aonk^Ma&41]9߆iP=9fMPzXZuw NbQQ (KQE)*bCTTPQD7{{+jb-vf߷f/;IL6l rg{a:Ҙ lɭ9&= Xc{/:0'plv)}|;%q)UEé] Ǔ:MM7]{zRQ!]J\hW>W?BoS?xGᑃ~B<,Q9B1F`J\&^~yRYUsS9ms:Ǔ;j}Q.˄VH~]A2kg^yT-͇,+݅[uOY?|{[bM)vj|*'.38`ڴo:C fέu?^ C>? Rx'fŅB"]^ N!2d'@ViQg[.; of~t8h|~@?w῱=dW? M?w<]j,3efK@]Nv}}fqVT&tb\Ss W+ut!t:cpp(<<Bѱ2!.B%M⛛[lkKT.:{leeɓ'Y5|Ĥı1L6?RqwvUwgPOGg6Ҁd1Z[ bp%Ԓ,st223iU 揣+k*LjL$bN0"{1p<ܺyTQ6egYazxTcCQI))KMrWWmژ!ϸ|"]6Lm9<'nSLvR{'ZjH)) %ݕ ='YtVlm3P%|W)#ؘ[[ou7 SiMVQ}RN 啉*f[%>]ygKJ6/k^_s9m`~A]6`UGDEÞZM۵d;vgHG3w{,fXeyjF'ED8%99F7X߽f~meYI2|`/l>C6=[2a'W~ iisHWHHHewVV` p 1bSS3` 0}eUw*sG-_:,_2H/P):* Jazf濦_w rbS1|CƗjZWVhW_- ?"??:3 ?3['5g$;z|c}6$D"OLArxaa33x"o`tt|ut4_>66.HGG9|dp`L'$$dggOLL0Lp@ƒ1#Dv=7/3 BP$rEuA ]w%QH<O %B*b%uHIy3 g 5|#`'&ZJ,VWU2t+\yJ|h-WCfR$LJU^Ss}H"‰ LzGZ*-ݥwmoi嵈B6-{Ya <&G;m@0 WYUrjx-B>K0˖I `gx ;/Peüχo% 0 0A?Y#G(8s?鴟"(?oB~׃_g?oec?~ hf`G?o7`C?Zjwpp9rt'"zR;zZz{*ZR:;zJZ[Z'Q:: <ݿ@jJ]O8u*V5 WVVeddhR*ry<xO(YpETR (-M'8<*- |2$Kz(W3،sY|_"/UJP➒LS_(-0$<[0(IXD'ʎˏ vsl{u?8bBm6Ђ,MaKQ OڥSK%+WKWd;9[aC CN ъ VW(\Mn2k",\\f`ZXLcQE V$%+}[9' Qw %)tI~stR<$RQc1gܷ=7Tv/ڌv OJ,Ǝd;Z;YDɶl-Ë圴lvQ7$jj3DELQ lj͗[U.+dpEHNQBE3ڎ7/D[eKLT{e*F6M썦|Գ):+PИԌT(+x*q܌>..URǯUmV4Eܜ8ʨ9b0~N+;pp]hҢy!ǣMd<5>v(&w3ʤ1ۣ/:j4;?hyU{;=BUEq_ʿ/&4C!L!|$r\W:G}@ 4~4sHO2i(xK|?v_ 8S_E_"W=G1?)b??n}9V g@Vd{774zwOss+zWӆ䰹|'';WGMpׯgfTVVJ2jkk{zTBd~72:=22^PP\6]^Q^\Z\ZV::6ӵ}ʽ1bc$ )(5pp>;GӭmB@cE~m{#Nnorl\ HܹE,UJFP#JEeVe+_X[,*WW9"&&cvڭ2op|l-wY7yӥnsU0vvI1z(ݍx:Ol'n9n2wW%6 [ۦ:S:p'͔zSP$3cX~DMG?VLreoblcRgrɝLtהf { +T,X{>aэ9Qwo%vYs-ޖ k7srytkk0]L)cĤؤj9/mt:%:U~KMќГ&&JaY]{Ny+0LMZXyo&Ȧ-jȇ+5GJEWS6A,}0 1#mkXw*2f݀?JG\>1[%,ūOH:xS}S"lWCgpg_  _Әk@̯Ks~pjqgV;a@ 4;]93~Ol;g~?M~8k*Lÿ7o27(**LbOF"AVG1Bd~ 9fstwA/% H$&Fx$bsCd!5cN|V$ %+_,(bBN vs2,Dy˽U2BfvF&[tuN|>Zy(=\$cƪ  ҈=5Vd臭8nU"u]N[bhY gb,&_Hdc)KGj%\KMOU_z#%lRϻ;ޠ0$hV!'yqX~+K&Fh-+8I-a00fŚlIvOk։ -9z=$xlԋ|6Kk9zsws/Owj 篳[;_ҝgs|jg݈%}报 M*;I W8ezɇ 7E\yr#Us毑voF/˟~ ̞ L#<0/ tnZYٷY7Yס=_Js x_ ]L`*ÿZ+ voP[k/:\H]C> Hp""C/SFaۏzڷ)4(Sk W[.D_%W=[Qc_*sg+3 ̦|/1,j=22"xAHm-,,$L&䉓` PQQ)# exxX*UmpL&sphH(d6VӀa@nR}ʻ%?zɦxm d8qBqBZnTtV*vy.x]=&>Z yTM$AƓq|1nRX!i&3H&y`?# 9 Qd48 \Rt1:r)݀=GzʼncQC8 K2%gb?sL+N^晘ˆ#P1:SʀDEd%p`wV!g3xB0Y$׏ ԲڢIRCXkE@=2|c81jl>r)oj1&>,-,i&Ŗ}ca(:su4ۋ:K'rᗷ.j"|#7/rf>3uWzU1܌΋VzEQc#zX:_DmnzK"bHuͷI%,{H\!WGGßj[D _ Z|C wۯ k'GkdxQM_/}RQ_χo{{S'4zܹ|//f*~{57wmpkrxd2EG $; lo`8ccFl^  ?N Hph4:\J8Mb2 DL$0z W*v<x΢Ih7m7FP#B@[}T{*pEs#| 8BJS&0 Yl*4Y;R>\6Jߔ]76?}C`;~61Ih Sq)dkI\ EY:.g${I ㋧D{5wvq|bmmsK/*NefKi\A4TGX`Y!O rFYU, h.5؃{ݠ{n4OYׯI`PU,X>-~Ab~CKO z6/q<^s"= =ˎK&&kZ/[7۲Ɖ($Iҥ:{G]; ,fu2WF{u+g b7;w:ߋb \WW/)rS-o^"AB?C,n~ YvGKonn Wϛo 9+_^_< |TR]uu?rD#Gj4|x@1Y }X/ '8 5L4 dm?|d8}{"u+m _ 3?3?3 ,mתͭ/vhpx:ܵUh@ FGǶm~LiYWVHH{{{SST&Kz1";84'$%dg ufFs%cOl  8rȄgl?a?!hli?q{{({CDG@OQ$I6OIf d*w ,2 4UɭH+l֕tEڈhxB6-?\$.,,ϓLeBX~Gp̺@$i\.^6IDPXn<_Axfp|'tW]xɬjLaû*,^t!-MDS7դpj=7lcm\@3_۳i"~Wh2VAՕLeI^b9gG2=KGP[p._5=oFVE5ꌯA;jy-F9o/߲8aT6蜒V?wS6Ӎ#SC0 qբ5+^J ᯵9skڕGnp_-a,#7mt9rKk%o#_!F,{rX|0{1+˪x{97RoZu]#i2H:*5~#k|>1~Z^ 2Bxpx ak(0O3?v4D~qhxj(LH"w?m§*s X^ % ?k?l 0_Zs KD2vp2NLF VSS / yy*%N+)*G6Mxya##׬qqswbDH&+yz d l\* Z[l&Bd)X> [hW+Oȣ)L9G}@t I-b)gNa r@?uTdS )U5 2iپ?5@POr ^+sI+h .gKN]}Wp٦S8uiq˩(uUOO`YM H'tѮJtrn=qv6g*)m xJ4:1\-4IlޚK1׫mijs$o9 m2iQjC 0ׄĞ aì[4isoKIףS5U_k^bGYe#{B3]hȳحO .qI97R:Pf]{b+s%SV rٖ~-a1ay ϑ_ ^ WFcĒF` aata|ab]@20 !s J:0UOM?XKT!*S?Cz V5R@p S=)GM8]$ñjgh7!J((_o>ՙ?3G? R[w@o3ݻvvI+UYQ0Xݴ?־.ģc౥urC&S ms*&H%ovv6///)2)yiz/&p8<.4,s#\Ϯq*r~2VA `zj2%b՞n+?JL.s|r[QS.UJ&h6EaR<Ơr:SQRi`AEap]BzL]QEĀ>yԀclңH~ҽ 'tn/P̟ͧ6Z^v=]b [*On]Z9U0YU:xh4 ! VkeW\cO[w9N~/ :FkNHgvNyeGpuWʜ-{ǼsH 򰤒B>jbo8y\۾5<@:`in'3w(]TN%K2;n[sce%u91 As$VG6Xgx!zl;Q fsb#Ծ%\_ya1O0?˄w8P Q 6BӾZbWg[}&W-GU?ߟ_-PG˿6{okSmwD% "踲-::x?$=b aA@4>>QRRN"XlwwX"( d~{go_x1 -b+9?3ɋkJ^;W1|l 6xB"l7$.`hQLΦhɴ+AJUf0'QqY|SD_q\߲e~u~FّNrQ<,CZ-1A-#S>.8}0a,YGfߜ*rM}Gm!=Gy˗*cU `sIJGûE7 n/s?V\\܂nA2_zW p "`W܃C>EiWY9_9L4fyn.cM[NOMł?Q۷ O&@g4N_KkXKS *G T*jk_߽1 FB$ş;7::&Kz{DcIP@>}:?5+yO,a&uўSu u5qT,c%rM\C9ٹ@ζ6N!ޡ0r )I O _vueME[WD, ?G?qR3S= fSoŖ okU4#\:'NȟΥqDlEnd]l$%#aZbLWN9mIXEJ?̌?jҥ E {wm9JN}`ٞj*tTvf ;q k_9tV殦ŠbZQuְ8+P[ɊUmXzTj%^ +'N3-떓|'U aM3ˋh-/ee#+pXy"]uuj%Fh%Nx ^ uvK[mfoP9I .mETPF۸WEja~4Lq؜.Fը`ohЙ6ک/w:Y1;ꬕW+!n#>Fn{trr J^*}j0i_>z'?? ׿i5557333DtW~'444ւN<]u(}ZϿo{^?);+|(qed䩒3CC#X,lX|ii==0B !)mmCC 91LUdTXk΃;p8T. ;o~guZ`Zev˶㷍0ٌں3NVRmmys B'yI}Cc(x&Q1A`eT8r\a-9=b{2XiDeQ$Sbkc"EN8z-&*tC&BWfWCv?SoLMfLYm&1C 4A=l Z׽wtrJ(?'ua:(u3 JPLC{} Ͼc9[F`YYW9OAh7ʷe d^]WY_5\?Ayhxq irAV_ZY?jq 낌(ot"o.:wb{Xk Jέ-Xn -k Oڇ9JL[g&jɴ҂l"r=S:>lڿ}XcSEKW[ e!&xI;sB7`YWWn!=!!]#_"^#A7{XU^"=G~XjWB5{ {VoAK?T̟_`WEz4CTtXc6+@o7]ưt^ă dX^ag? 3)m?_ 4.0$xΎ=?OSRR駟4yҥK?G[6?k~?%]?>a*^???>_z~OV'fg/2CiW̉蚐4je2ٓ؞>"=/ ꪪ77䔢b9X,55x|/$K8zDyhb Ưɢqd"-*(M&m);.I' ?j=c $el/Im6gX1Őt#f>S;G#[j6nX~U 9)y,`H@ةP+De6CcFy1_szDl,W4tӛ)嗳ˇR\?ߋVaW~' 3zmz[[Z*_ۻ`v6HKcXp܂j^xʱ4NedɈNV29R}g;%wGTq]2nоpgۂ植CJhR'rYhm@[=},FYYvבiEP'F۟l?/Toa aZD>A,}XC}[*-@3PebhwZ ~a^u p))E~FڧV&ϗ{4'|_5& ̯zj`zWB8 Nhw dyGw go90 u9@>O>o?KտUGG4888FD"?l[  w?ȖD P~O/k5u񟯂Yk]7(Ɋ]dp6~*. ֞?ٜCNN+wCGDb1L>zH_ 9ԴT<ߙ\:<2\sX7O]RZ,K,ɘؽpItؑ.;!jfxH1Jc|bu0Bi!L(xq~=USF^]JOnj%Ctwl q)1"nbYӯ8 aSXrɔxdV=S.[*3pZ7G3o(3@j{R\:D ׵~ȗ Qms: C+;޿<[|aƷg32m=yݬ! ]IO+.)7 /?q zr,;-gxѩt.l;maVS3z .n?exjp顢n[ΨzCM6#b3hϼ;kƷγᬙ/X2Яx= X*Upb-nIzl+GZDxvmߞY{gʋvj-dB.~zv{ _ m_"U}y~d"CC@ssB!?Kŷmy@^&@tT ]Q+`ÿZG9;? j|ha?Ipt5M>l _a?azdQ|_SM` i 7 k{?o|}=A~zAA7o O ϟ?:Լs(GZ2ŋ7ӟ4F^|_3\GJ`P븎_6mg,# 8]\.B;__X^^9o<?!hdJJj__? Nn ߰mRDGw$zxxHeR)'<\**w{fcÃ$ )-2%UH7OL['Zk.6wpVd790q&RM\e܎L.C;CRJm:RdҮەB+60%<"A]`(mnӜd W~c߲a.L$z߯8PtãSfeSbئ礊Dc g;OPIJb*@aS8R6d.>r]phP̏uoxWb%A_jBwKV  t"C*>mΧesMj! >1s!Q?/O VO}/CAY_NфL,Ӛ?W#P8OpSN|? dK]O2.I.\P?J~ׅB{7پE"gH}# ŋ~]| M?C{_|g)pgjW?N6ffiigѨɖȨ!H[XXD*Ow<^~I)L >P9<=$w`Q0CKދ(JG@TQ)AEP( w^2W{%Ѵ5ev7w8d1Myfq`fΉI%ԅTξ}֖5u5M-M]= *I<|zq?Le8XrZkkXc˾}9y9JS:-t}Q0zX9Ti3fh:T6Ȟ]bcuHl!bg9ݲ|?@} LPaPq'գ@I{ZI-}ǟO L"LCjE&X̘y G's,s0luX:VF8_wGtUHx >Yלe6fJEܨm}>+ RynA̘&%4492!)m+~uѡXl]䇦_7( u ulu?=sY^/Mg7fVS۾xܔ|rRE zĢIi㨆bZg1G-TF:F{T}̲j%h<7׿7[}^mͭ7Z0ǰ~h1wזO`_ yo?A+q1&x$ o~x}*Vƨ%~+??2 C #OR f~  1@d ʕ?M_ZWSShiiy>ѣg'|n"/o"7ҹ/x7 ^Moyد ?ρ(1 (0 h۶]""<{UVV]nnh*x?plxFFFS :2j~aǡۈd"AG3tZF*pT0K%SIxF6=7ttH! ,$~1xXXUoihz{S,KB5S< 2ro͝;7V'I9bTP˸EAցIٜ,5#-&}}rbpC1pJ j\/eEǢ &5vtoWiiYUr<uf;{#!9ira!wŠV j2r}5{{0e"1rLY1U:LCҲe{A1H-}E1ݥ:a+J-;5⯾jXC4&saKx *ͩml +܄i⒫Zv[dA}rz xުoWFbh#+RgDb(Ylq;֦9,;lk^'Uoߖ"8P%|6)'4L11#ǰt?_1T'* TT#=<{ Mמ o< Cev6Kxm-Oh i x7n$8؋xWCs~ >pORB p¿*"̏~,/8⿠%o=W_}&Y _y嗼_;om&7gm >5wwӁ+b NI6wM I$2Pa}fccTO _g\oYX\mO:D?4>9^QU10ד{:OēxlQMF_oN'uJ|eyU.Sǘhda}щÎhw%0S%#~sohT*S/ԧMe#yx,\*1SIlH[Xq|m]E2QT(ބygDBSSbַ 鉌ظEv "H9,ٍ <ޗȨTR~։Lq؊Z`!)ĮBPD3,G\qZs:NR8}9M8F٦PEW8Yjg5{0{Yiǰ-aJAC*.T!TTmC}D( r?r%VŸ; ڿ?H%_}^9Do \#C! xlցC~@ f~^4_l#6/wv.gg񟝝>y/g{y__;ݨ_oG&_د5+C\2,4|hh?~/[<\WWOPD \4';408TWu3m;]ޏnVz j4: LIOR蔑>>%cYی6,ưCL%Cnn1DGWTI`x - ݿX!dfJf߾=v{ttzD:#k벁)#MpҠtUp{iwTi:M~ڶnVuM\C.P1hs)DэjD3E$QUJ*lesS?iwUV{*} [wOz}Wˋ5}mKRl0j>a8 C);Et'2E䈲v1lzmONE|b'sQ' l<#ΔbH\yߘУ6$Ss(KT%,Fw/pvi4[0WqPBRőxYãDH$5P_`\hzS)xZLiE4!BQ{NDJQӨQ .eԡ`XըXIܲl[BcTx}$?6,Q6`GN.݁_Rr/TPIo Bd7`܂^7^@/r+p'#HyH)?5-`Ol=饽~u]8qK_] ?_Kpz@Q?FG)S K),2q1~/g=n2[yqABTdԁc_)v %еDI# 1*GY-_߈7*q9Sv/ۦJ e=9?NS>}49+U0kg !Oꜫ;m.CIFʟ>sa,{5,;0,7`jP;0O {&c؇P@#?6IN_25k ѹpnE.^6/? r|~1= C~'Fw[CQN// I@A xg>M[_?#Ҁ{ΚLbVN.VBdJF346uae~tjD){tTp($P x#}2kz/(TzJ?CZ1a{q G`ȫEB=ӎs2+{c&uh/w%-6^Xd٘.5!k-q:=3dɐW L-)›F.)bC+쐭c 3&|OϊfLzϨA):rYAE !& 4Ĩ肶@m;9mQar݉5G#1DSC>g/n~ ? K8 _<f@2P9ſPq$ރJ {+}0" ww-n{2gAt"wWB/E5>4>y^'0iw;I8?#L W%8c50}?2+/'|`G y?S {_sK?1x}{dӗ/7}'?~ữg\Ǎz/coom/{:{NX]E ?oH&Sg櫪k[_T*jiiaaaxddvn.CњǴGttu&p+AM]VX3g stb])^[-%' V;N}ޝl}ؠօ~B_1;@œD6 1踤#M("+qShhIdg ,98 ơP3݌ Neu:8d&x&xncM >ey,Cj9c#CŕU’B ڌ3%ЩRm v3~drQ,|v[O-P;ݑ7CbcluI~Ճ&&J-Xt|^d]Zt͔Y1e)hAdu`%zW [[O; YVH'yeUԊD>Vxƃua<@vKSB$ĘeH,ŮI3/n1ap6zzâbQ{ Q(s"1`ށ.[zwM ]tXڑ]Gv3aXnG]xP{`.q|767 y_?L\X+ lb w غKcK|S:X!G!2o/- _ = $C~ ps3? %6m旹fx?]zz~࿀gJε񋌌_+ J?~?շ?@}w7W~=#P?>]oUK&7/į5O13fii'$$ D{a0+n盚8p FNMMMLNtt贊ʮ +r|Ω#1}VLL*tHhҭTUS rjf6A@GⶃQȖf4~5%awa0,)hsgٲV O0Uc4gjdjlYaC[}ءP? 3#I8C7YBQUcۊkNgӤZ],.E'B_,)=s0tѼHVM~ގXƞk[X}EYF"O=5A*rs]P$y& w5v۳mQjHvh YzۢC;:md["LѢ~t$[T4R5RqEk$g_ ni ߯`o:ZdnBN( ; ]4YTG.GmM>4رј%x1"Ϸ?E.%fUi-H7;(0Cᚦg]Pؠ5c-#wMm`l%*6TT}(/T-(y A!p v emKO~Wb _8M|nl 4a?MYNldyuq  YE`V`g\;;Hl@d;xnd§tmdoۿ;߿W\yt:?w/y^ ݎW~ՁlRT?k:%7+կ;M <7Osz>{FFF˅?644 sQ]\\WVd p@ )T*67^PMLWPJ݉IEur+{]hWTҘၒ"xQ;:ōI^FYlV쩱Q mHOfRRgpLiԹOӋݭX2ơ7f;QNYnCRs.V9PQk/iftOrmHVݳv6oWhl"ۡ=䤋qD(6tV rcފ&-fezmI<?u-a%n1_\elem'W-mA/a ˳dmVоz,5%LD.`HTcJnb54d?-BJ/^>څAyRw$SXrR¦2i qn|^QMFtY}"fO %UCvEXVᬋM.K9j&X%1SdLtxbB_nC]u1+zN:UdIxp5c OӧTOU5Y;߃iނ=m  }.WkU2? E[?5Gה9A!B@q A oWݾYcFg?o9*M'PAi|P?; {2?4@$9%@Knf~~w/-|/ZӼ'Tz\p0;;7?y睩wu+ _?~ӯÇ۷_%F3Ys뛿?o? X_.` /OIMMwpp>_XxB}Ggg?DO"QY Tuvx*J ;_>DDBwowhF Ǥ.MM3|W|4cTš#5ŕ[9Ư2{;xd|v~ԉc <#=_UEa5ƒ&'j&\9{(>9Mٖs[)jC*tS|31s`gfbT^Q_SpάTLbjlڟ.cnak3dwqSO{U1%̨9,4?~seJZtJ%D VLKch[kcǔ̼ǂp_F5뽫v4*\ *F&YR8qOURZMϸ,lUkHezljsdl UNItR$,h2'*,٪vzJOh!]t >_ޣD5Ycm-ۄ\/Hwl;VP;ށPP w[6râ adV+&s]]y+?J܁J qwxw lg@`T0sQ ؚK -~(0csE`>^ sQb 8?Zή==}Ÿ _[YAM.<vNQ+#I'''NbygN朜"8~226u0|Mm)-2NӰK7歟>$T@LvCAMuo}1k&S P3JLEq܄9TnIFsA㮇dž(B S9CQ~4qZRK|izuc*UYL Ũbȝr)v#mEYV 9LdՓm'R"*,%o{aO~nы39TLQRdӝfZXRvIŨxy䔳riq c(f0 .eZ*F.iE"3j-AɗRyuiRZȣ<˼)Xj Yӕ ;WG jwl@dg QJzN>+>p/͔V  /#w^в{A+L-]==-4;Pbנ\##ғ r ԁĺ m5n_"B|^`8 {=7 S ?n$8/?`i'WC>Om?6"\}y.W&?3w?~\QQ"NMM}%G}kzz~xy7r_ Rox'7 ? @&t^ypK;+_Yّ 󴴛EEp2z|;5dzF4ɕՕUx{ߺQ2 TCٓ-}JYBgB,P[/Ki8D#  NuN/L,z5 Xc6 j5YiG hKX ks|nGUoU5Geg.tOGtL8@ꉔaKQRVn3$b[MhF,=]j{ssR@DPw^YV41:q6SRTH'Tʞ`]cɰ|~rwU V=ݺ*v;8liއ|Kf.'D68H kÎ%t^rhJ~,MUs[$y */Ӝ1) wNkj&։-s(Ha6M +\\*\ mM/H9o8 SSUM(u(Tq;Ggs>ܶE8`۟}|2Ɵ   @!B\x~_KS_|@ėi76fQXs`g1PH (s`? 3? =+_?3kuIJc'N~xFe{/RXX(GO`ɟW/1_d7_mg? ?gw"B""xB#41W.=YRRz$.Li=K$(4L_b%T:BȄե6/ggwgѹʚʲ- ==2ޏ淋yL;F&wF8,RRi{s[sBOppb蠴-9!ua9GQ"plrMsuC[}.KKBzqQClXVNWԱۭ[RMNW'l:l1^rh0scC%|׍:yԺpuM~4RVS\ck\U֊ąoiV_Pщюěu0p[Z‘HB} z-[% k^q4v 2N!K":in;`C$<"ܶ?o<.`?_Am^?>]=O<@˟w_\G8os[S@oEBGRX#l]e[T"y*BxLjU px$n&}Sa0&jNr+KN+,&&[ZFzvKÇ{vyv^bZ pOѳV@h]Wg$˜n{_JۯVNV9Vްe2<2K%:#9yqUSB$VJW7SeI34h*h}(dUj'UIHf=b [79$L$EMQ.j$=q4@672" yd?Reђ ;]lqji9NN;B%X0'Y!ZvQ/EӮɆFM"z셢納Ҳ91+%AV؜&l_ ̷7tSNS00{0ջPPyW7 ^ ]Ms,nIXlpו2B:1%pϷs;ҧw9?WCSOo" D}Oł {@W>s OxV_YbW_K"_$'ŋ_&7߹y .?F!Bf0a x3\---Hd[;B2XQYY_NЦl!*uqlWx\|OCSCRHSqrϯsm͉ G#tu ]D*yL'i HgVl!i1T㆏m gcXl19M{*a@ohdΖIQ%4{{,yS8yov6)MC(k5Twt:V&{-x04N\m6ud90"nU`j-iR;ѡDFRgfO^}CD.uvЖ]oo)"f-'$Ə?ʉZC# 5/g-hrbQLyeF$6>5 NYyQ)r^u4w]]BWnZu\kY9$< _ha!&ۑQ 31{~8q_o~G<9SՈl@x;RS%v-_|Mޅ!9/ԶC(\cٜYq*\> {aν0k00000wסPPkPPkPPaT *O3?`*>Zˊ( +."?#_Iy|㟞t۟t_lFϗF l=[%`'9~sB+]#̟ s}O~gI+MoO_?/O <O~`$s" 4`=<<c>EPj=bvx7֏Ocp 253uLeuEcsW5Zwsrf$IT& =s)d7}wJWB9,T qyDxqcUk6[ku'jr֜F[w NpvQgNOqD 0/F7M-Ln9B{1T, E[;vgW|HdcѣQ"J535G$PQeXw;ϐ*hHٰbSLBZ5P#҃Y}NI1Cv61C&L- xDA+}C `Rſs{mG_MoO"ɓ?~7)1v?|`7a ɟip+.p?\#ߩp hnnIȘ OIMOHL ;gTE_Y]`1==s sUUͭG N8'EָLjlr4l>A _ ol$RlROdO|W4kYJ &͓}6vkĚ&K=s9]eU98"(X!u #3TveY  + io-Phzm&mkQ^:w~Q5:[7}Pἲr'ۻ㫕ы i^, )zd;Ռh+Urb@|uK9 [لmkas*M@T9|I#~%vwÏYD%2C.~<V6DUMVޠ]%>2+~d\bUej[᪅Adlߓ{V&rHKe>Ru7vD+EG["sV'Nzw9l%P*$(7ll9V]JL/+/X 'ZV%pU m)`Rl%un_6T Tz ** _Azxienȇ`?ϯA.*Q?/@_X-+|cYstC97_QF`c2(^g B y0o yϧaYC oS?O*ỿc+ PMmg/~ W;x(uphdhxH"WW7GxJ:Tu~bjbpxhhoݘ+ɥp`t"tp[;[#in4WEѥFt fn{v2V)؀?0EaiTabL3m}uA@jL ʞ_OJNbmnx쪴t{#!^é 29o]H6Q,}.Ǧ\t#飯4Li-WgUu;T)Y\H"pPSsimLz职\ڝ/{oH\0[&us[sj_3"سm!4;]4iևhU0$u'X{Yz9a"{X*^c5]0?^*#!wGqAifOfWFqH嘣1aۑHdҵU//$QУ"HD1B%RAdz+Skɦ,k#2խcfUeCLip'ë\cl_/,5& ^J_nr]\^'G\f~Կ _{dd! %I~R[xOyV`V?Z 3 mmhBX9&)!Pl@Ko_c̯7/?7)a?w>?yG<?v!k[ϸں:<0882:CۻO  NP)x"gNXl̷hBhf\Zc3>&ئF{'[1k6GSvEF fM4ŚϺ2%(TR-eR&9#<iqDI^u5yŧ,;WKuG)@kO3v"'9ݙi<02{}霷 1d_6r/J,'DJGzGWN:8sdfԹy ⶳ)I~I5$A׎ՌBf!D->Cꆩ[SRJ&;P;Rļ<aqڌȲY.>tEmXk^qGĤZAiɀUoǥr-uRj0^ߊ^$⩔Cr-O6;[IRNBLU`mvLl&}*{*s H݀߀J_0  [z^Л5^qG%^ BAr n[ŸI'vq١O1t8~c^Oz:9~o;T@ HB ;!SDs{)Gl_}}^~ϳn?ҷ]^SpgέQٔQ%爇OnjUMztm&d;H;PW;K3хLK,sOLw5I!;51jI~i9Œv"i4qۘ4j`ǖy 4yeFM;#?epOg2UO#k4jͨGFE>'RgE!8,'Ðd?H6u/%" ].6fIndA)YIV:JUtUD ͐쑐 E 3"c# KAU=3{2V20=D"as'AGJΨ!ʌ:[ k( 5 Yns=yr1#{v~B-h J&}m9^sJ`yJG)]^01k;`T [P;Pz[`&* ^R为 EfǠ,E_{/ 8̿e g$'Ocyi*p' J/l&G_ؗmoz/^%v~|?>{WI~&7F6S{φ3\GJMK 윖ngo__X=S\RLP2ZZ[}:gTTTTq>FM-AɨƟN߽fْ".$gNsQ?|44JTN+e ]P3=17NI{Ec+m:TI0g5_hdUO͐rYh#+ ({d,KbCj0+n2,)n@bzQt|]rVbډ%1l[y0z~GFˤr[XM]֢=f_~ܩC2TOIY6RܴJOt=n",4HjJ$q_NLay]#E.qEيr%NhU/"==j5qLAjѷŲ/9_wYYtM'gƪ@x"#IBB1$g椶 5YXkQxx=<([5+j^-PbAm"Zj^V s֢$PƽPә_J$oBůBŮBůAE7BoAw ȷK7[`oғ ( O?@)o f{TԼԞC; J&=u&Ɉ0RhjZEKbk+2a%XnU (3/WYR]E"(DԚx=H1SM}eKږfZj<~ս{{fc0 fڀ 3 ƘH!'럴MMӕ:te8;mO:$>.Ȁ"Ң^rK tjie1(7U'z;p죸G":/ώ]$/gYs,-ft5Uޑ=tfę@ް, 3uj  'Lٔƌk5}`(}%v"aֱAQe4D !~2@)(}OP/(Ľb_F{_hޮn@"*nQo?̗(碈 | k~V'9@U3*j ˇoF4 ~xߎ?_+X+ƿb7?|?X/CDаC|//Tu>84Nو3eeY &$9ݽb"u#f,WؤمiLݳgW)E!Jv^Vp_S脨3+9Gh&4G\L\0֩Ͷ񖶞CVȳ9uK#̡ 򥱭:J,XowH3,_ q?E+7}~t*NSNkR=ֻѕ@ V}5Ɲ܌[aGViKuKȵIuJupq[1YMZ,[ƛMq\ġN5^E]‚%=䯥XdeEGS#gәM֑!5@>@ d"~I"R)'=/y7bh妘at sH>Y"}|3K`O nZޮ]|l7kݦ^kJLئ|vBySo^k=u#$S~ƕU$+dPT-ATL}bAD.6n\4{@!Ц4t®&LPJp@ |G?@/}XV*:\&n4x>ߋҳS.JԳEg uȢ,FE_Y &\Eݕ_YT3kרɷmp-qA ~40G´?,N?ԳGG}J?_&?  n_O{7o<?WJ9yKY]ccX#YGyFU*@R90070.ɖaG3 rDtD}f{sLZӊckg&^XV=4|aZ/ q:#utȁ䳉KM^{^کlk[X+ŋaIn(z]#qz: 5aoko=3䔆ycgk^%E|f/eL̏vpfZ{rjv YmREe/Eƹҝ$rM3u{-ב$.rGXZ3cGoH_m5ے-qЭIa~fHWLnv %lAQml)b#9 Ĉhfjv{!XuM msCkCB= r_RPX +-}18N[2/K(7T3H V8텱T[`03̼2Tu*c $ E!d "  b #^uUme?Q`G* 7(_Fr;O2E=Q͏5xY+ϡ!CgNUE/ JJ7" czig?"L~3J_=˨Ot͇/g߼ɦԊG}/*<(+DW/XTyEie%)931EҥwD\ʹS5QILK( czx͂5 Wj +T4To2(u\F҉쵬PfHZw6^1ev6#a=M\ cAis̛{<H ]MOB'4p(K>-|H˜z_mV^{$ľxzki#OvwԳ+ߖ}beɃZ'Jƛm$ GMû izfFoՙ]I{ڃ;!myfTG }ce9R^d|VS4x,ɡ|"oBZͩ ^sl# L$I<WBB.X18tkd 13#$ǤTWU6F0 W08dd"S'7c JdvHn ۝Vܔ51zA3L[Sk9e*4@vc3.QӐb̃Ak bA1tB| h4꿅.Lߒ,ʂTlOu34آ2K[j~-63M俰Qk"뻒;fE=uho#T= д̓񯄦qszL?3i/_&;çWb?IO>~{3ȟ{K_7A?DCŽ;6kl7_s<˴:޲GY u_UTrʼnRfxJnIRSgF'G+'Z;XpI[Y ,gVԋfU5.lM6+KElYzƗݹ~ΡɁ/ܷygiEBJqujBXhk'ñ|=Ϧ90`Κ^[eYO'EÆ%%m}nfڼkS /Ư$7Cn'$g.],³mVNS7!Ĩa\W7trx5a{'%TgO'QV^,kn $g%  /E/)a,YXx aamb^~S~<}bBE$qrhc߾a+=s7/wp~u{9Y__1d4@ 0@ Bl~.A( j~q ]DZE}} 7hQIM5ѥv _G?aAs-p@#h$ *%q=f&g^X? msA!ƿb?%o%@#h;y 3s$a] iP7[?H=D_%2FaIS'g63+m+QTҟ+*df(2,iv5seå#55j%i5c)ī4vw;f.U|W/SLL\d-,-vLO쌗I̓fR>5 č+msKʋn_(ϚKON<{/ˆI|mklF7{yt  6t9F%hrՈsX!#1yM~ d̓\-JJ1oz ?}tnwq}s$gH r^Pdj:~r 5qGjqng06-V Eɓd Z,Yf YøuIB?;ےp(Sml3c:,؉X\>g#j#//j%k&ngņ̬otDŽKae0*l5m}˂EBHe, n8BǬe#<l&1yo%( W>KW<]~ T0>wEi!::IԢ;#9̟E@xN -f49Z7-?.>WG)NoHO[?q/#_pA1~;S??#;?w9:923de Z47Z#S7{Kĥqx3q!s"chtDAbABLaA9qb'1SgS*W]oilj~-7<ԫRnx 7ęFv?K9]P+YnȐBCN(qlf /KJly窆멇a<픶c Ƣsm,WJIWVw76<=>A7-b; 7VG4/XHH+M<+"{bmNsdN׼ĕVDeu\zK!w1S-9?.ch645[{Ԅeg@`dT9bnMLI`a)͐Z#Ivhg*Tq1%ٔ Ӝ[9 V rK'MRM$%p3g6ٛcE# kFTԕ,] ba182SL08#'3JZ;l!  iB!xo 88 # < #f+ WPÄ?}戄%xv{y[Ү\q=™Naᗌ^8sFT?%:,>헸kkIK>= Mh(FKc-u{rʟ N?JO%b k˅lA7 /ƿ?K?Zviw_0 ?"2"7//:&:.!B fGWBrA{ۑXͺ<5;i`VagK%V$$V&wn\cpĵNJemfe(kn 9Z\ ]SwUJpb:ԭ\#_MgIs%3ا'8cᔰc[uZ\L  Ihfy|(^z[:&+'t3'*Z]: zt#k3FM_2} ;[~IaٗlkA2Ugi^rpx儙2Wq߬䵄3GfkU,ESQكG~W 2\9:b@s]wZsM W9v)j\~t> T0F06V49%ώ@3 aH Uj%:p =y82)D;CBO>raO_]v_W@tEx bXS+s~`FPap](ԌἢrxƔJ3H;EVج[A@x@ Es )(h1a?0l$#8iOEOEO/5 DKDyYnGS䅍K,*"hZӉ4ilxO0AɗXϊ!S__y\P1eh(~:BQ´3WՆgH:r;79=?hF+3gyeٗ+Ȝ04VH/?zd־xV\vs[?/ibv|zaPVQ׽{2Gù[g[fxW.o%;?slfcv6[7)7TfXY)SfdwJxIeU^.knfhgrr6{(Ζ<פ9mwO*=J⪧SM8}2W[)>[za3G)h$@{Bװ|۞!=q~Db:o$͑|vzT,8 " ,YY 'd:4h+˥ץ:.+La3al= 05/J+ykȅ1Ol2HƧGOI#eeggX˜ºjđdnyx a?Q^]bXN?gbi?D"!+Tź,A>`,_11ĥ@dHC Y'6zgA2XFqDw^GLN[,Q/MSwmG ?%*mZ|.u It0:ާ  :"Zl:[>17=Տv< kŏ/Y9çq񏧎__pA1g'+-1~>hՆku7ʯ,>r>.qht8z\vZB3XD]{]eMeJU =тT,FRmhH-9:la.˕DYjkU#O踷˄RC&ϯ.NM-Z/d_JHq]Qf\c8;Y]VZu_;;~sBO$Y<&r-|jꩵC{:K;gL/ϟiysb??{Ϣs >_3~w?_[W(+4`D19ajEՊ=<<=7i:rjXzpx'eԄe|bxp[^-} ϖ-<_A$-1tβg?fޱ,\#Vf57d9RdK75i ˆ@ y=|7<ޟi[R[LTiAvt"Br}Ufw_{()sFBa1%C5[-eȝK&E"p)'"Z0NXvv$Ǯ,9<Af8HJI !z   \ b.nP7  . E *]CpNRt #w-@FWvMb0wIT#\50-AFJo=ɗkRD'x>;Yb?O??K?݉/DөJnl|c?%E1z׷=o`OޅA|Jxs se3/u:?(k3'N̘] =sVeEņiAp+v+_TL.hTl}{ͮr%/Ut酩uj5r(+D{KӘl9q{dj@o '2|m%ntȈbPYAW;oN١ ]ψ f X9Zrk7// qhowEҍiĠIX'=?k%;JU!9hP`dъDּUXrz{uZ!TN ϳ=T"#`7{ssMfURNH[;әy I,3ۻäTYJaoμvz˽qjx<вB:f`†zU lګkdqֵ~FJ_;L/ir,ͱ4,c ~IP2RdRu}KRJI<2 #QMu9i Upm8 _/dzH,Ba9sG0XÚXCH"^T @D@XG/ 1q &yzjN@pNp.U4/? epQ >FC/󹾋ˏ៉g(?%J<P0_^4߅H qO?_Yi sό&)h|y}G 4;_%}!z /ƿ۠}PSOM] N]&  'oH ]8əj=2|+hm˽[v\WrnX9Xds3ĭ=fi]7fo <\AҊ"sk.ο*|慔S9k3µg~S:_Ȉ#ޤX׬1VZLtxTًWޓ zI=v|q~eBW%5vs ո턞ekއ5j y5,[J~V&wՕ=nFrRrϥ5,/6`\7ltvU(RxE:yOQW`3k)9PDZYXFT ' oꃓ:vo!G&1C߬oTy5 CG507*;ә*ƶH`&Lj`!_X}=>(] ?, @ F؀WbA9@N N ] "/+0W@c[./#,_+#"Z/9NFS_v%u {VΡ:_iM^b_xFoL 9S6\ӿiw?(h?o;__p_9$@X?JGo#?Jx/&' +Ң% T;^xeRUm6STP\SPcu:S1h-7K.'yDjd n+Ut1^Yic.ū2W=^čW6R?@))QEI֠K+J|MCVn/JZ֯ܲ(!Agruv}X)| {PuiMU9fnBctgᔞӘ=Q.'Kqae#mg'W'뮨r`%;c`9Zj5,"c,kmG e_RG\M*# ;7%'&ijZ\tsv 612Є`M-dDb%JYnE0&t!$fd# @H!ۨic!g4G1xbtA ?EP 8x.4'*BpQEL&+ )4EgQU;u>h-pV9E&_) >?dCk.까\)B_=_pA1(3D>__[WsS[W'3;:z:U9eH~%W(U; K<O'x=nlWMհk'Hzg˿LLg8y9!urlT߰RiDmE7%yG̏T!d ^ F턕4O=,"u;NA Ja!k&7:V[SmXև!lin4[ǂe”d/+a0 VpsȰ+ɜWOvͩJwjDQGJO>BQA`d F*auWջFءrSRgݾy}ɘd )Z͚}X?D**0ݐt=~ D9QD0FHPBP%2wb?H#BZ dBN@qts^ 4@`&#*J h{ڮ[B g,?~~Q?$0(zG!dKh1Ta@Wz/+Nt_|Fs ~)G`3_}ONƧ  _1I?3'`(}0Ds gCxe<j[g% [%gEz*9 ŗ<Þن'`aX)Lە[g2UF5w[8~(nAH0+.i/=uTޙB#U_BxhL츾zV4 g džה#0W`L",`befzlOU&bZLe!wcſh@R @Zd@Qx0+^p0"'"vWQU+(翰+kڿw]aP} ^@|Zw 埂Vz{V(=\6g~%b?2V*o5SbA_ _p=v2-ȉ#q q] e t˯ퟜO:xՖfc. .yùEmM)kHR[^ %TVV0;&.s./?vEzw_ #v=֖|VFacika6fkz(=؟ɇv_g6İ2O߲OSoٲeFU+ ϰTd1Jc\xu#ذ|tز!t9-9[z u9f+RYE2.7˕VYV4^7%*MyF@j^JFN̄nqa\lnPfJxmgj9pA2텡ـ%e&BzC[1/1C0H'h{Q2^Q͋J% Vp5 zܜ[U'd}e1zptbNfznxNۄ9@Q@qT@H(+?$4)t ]0O`^Yj!2`?۟A6.! qAU}'n/C5_,U7p͓3[6r,iwk+V2ޱ;]5TG`JW1UӠ/8-I#rmR 8 ls҄aȖSkS9T5 4X;W-i ^NE6.Ұo{_r;m1/ͽT{ 0 bS<4: cӛՕސ*t.%(up _^Q?v^^Y\Ihoɓ1ͨXAJ@s(iDB,>aHhv -d` V)& |}_і^)`'ۿ ᶯ QТc$=tO'j6@ @5 ;燒ߐQgՏL%Ut ԉ2<9>G?~Ͽ_/ƿ ?<ߎp0[Z-]8{G4E(()}E{fXk yK:lm-ھTIgUπh)S/؏o`RP`{1q.kZ5'&,扤8%eYj*CSUk<;N|Mxw3 zLm s>ᰢ%]B-iwsh_0yv#ңTfTtL4|󶑥_T2zH%60r~6!adt 2Ac5Vt6~Zdmb^ ⋱αOJUoJalfq>ڨH2_Xz0e0k4jMqpqsē@f|# ? WaP@%4@ }Yf32(G(I[A?/2g-茰LhQklWP]~v>;|R4S`! _Ig?~ѧ1L?mO?~.?b//z(?Ljo_U]W=<:7'KFg0~=im7 g^w\^X)Z8ڇv;?n(0rگlyVL1IUYuTCFdJ{ 7#3cܗ9$#uZc>{37{ ](ME)6 E" "HnQcz5&5߽ Xg $]묽$n5QLtHKMr7_H"aZuR.ri%AJ70i:V-GBSF5Db<=A60ag Dx|CLpX)UK 2!PV"WsEC@z (. 0X . n4nB [ْp.|?K4-k?f-fZLYۗY%oлs1K5|ƄHbxS[ttg_#V4Fq * B:F+ȭ4 U["ad&{\-J5YaʯFV |tk AQC 쀖M)NOܕA,Q`dZsv9TeHyiE`)W"6=: $66[ᤰu8>Ά$*oMu1Xh_9z|Y)G0OO)b"_7[\OZ}B}`pEϗ?~6k.z\১$x.??p??_7o %)s_2 ?(ZY:zHk{eqYY sWg}C5W:UwČG"~FmWګgtfZ>Tdk-giztkT4mш1+ w {3$SoU=_snϕ͑ N&4tX*xϱ#I[Oww=e|kHRnﯣntأv F7^5m.7-gkdFAS#{ Op*,[m|u^{= ZtT3'>!@-!Mтv,(wm H+(hi(UX{ő2DT^meIߑx`Ӥ.gz E 7mP`sZ?>Mj`Q>7áIH[CU35J,O )mT 9 N:셰U-`pFABngccdp|]p8'@<X>+UbA8Sz+F&fe↟b VY1gv'7p8l0p_TQ 0S%gC~z<~/zL)??3 !ow-K/ 7+*?22h@SKKO+-+ܯ^,i98pпMۑ}]r{Iq˱Ulonm;b-UvDZY7ΒNR Zt{Ⱥ¨s au9ጾӘR Ҳ(Flj Z5E!v[DzvA"  b?C؋xT!+8_+8Q 8"GlT)69+=V~?uc/R WvW-=UfV[{Eb81Ycb?r"is20P:=bk[cPgW.-oY*57\ox24(?hGDTL ya0jGkk¨[*MQ|,~f/[l|/b}}$#~CK/xV#dW?'?2|6;OvNNҕ֎֖JQ۪c}ݟP?;ٹt˪=ټ"1;?vuPB͠3\ҎȰmJ= F6[6Yf/MW6p\DNN7kˌ?ΈvufWx ߘt4h{L˕s 7m7Ў||[{81y׫2rqR]iӾ @W{ ۫CtJ5e:ӌSd%]Mޙem)GBFm-{ $zu[X>KZٳR>s=v˫ !> 24-؉ (NRKlʢ˳uGo}EXAt%ԈsR j`u5b/\!(EQYn0B]Ѩ S0( /4;a0E_K_7D\5Ka\;pد1L駰<,`mYLT_bPRU[ۙ1vjU*njABkӧ̋lO45OWt0#j`r)`T4Z/ `P L~8pA`N5df@tgacX   éctݱ{8\r1YX›%n,9k'0\<4m6ӀqAHWB `d t YR}%/N=&X Vcx'?  V?3~&&SXF0 dqpq]؛bf8Z컬j=RRg$KWcY/_7o/x`WYEGA]q;V5t-\&1lceU4ƠZBU%߫k0;J>ihق8F}256n N㭺W)t]зp,3n^~-Aj1V'[t'do{􁴜g,-z9ǘT2 i2n wԚhwш,me(HF ) IQ8Ji4kF5F0 c =h( Ǻ? OE -̓L\F 0~ `޽ hp="},VOĶI"I2}qP.&8`x _7ysM;H_]; =:/ %Q߳B,?|*ۯpO_wEUa" {Ae2ur?F#:~U/U34.+TmQuj_޹=Vmt;JDGo[‘c3l_OI#VMzpS -UhekDeuhLN'}&2VQouF$OS8t LtmRT_Oc8D:WEҽFY]tV9=PߩMʝ zvf]FSVq}N[?X!CLz܆gR1L2GjI^Tg_ook4Ê* Kϯ*xilC`zA0;0ܧGN#ҽ(0 :L@|d0eO5H3@$A8P3΂nI* Qg^TDϸ BsȗʱJr}zBO42eU{\00BG m0" { ?YJ.z.6!Yvx?v Ų]hXO)h?vlJ!Ю8z fX[_$1{v+|DC߽?/_>[ %ǯTW|0w?xBM6_؎mMuٙeU\ݥ+::**(WVlP)TJo95Yj\tr5{C?ñѐHXwev XqUK Xc,Y';+9-{wj>oݐh_/1Q60b ԈaXz]C{;eqnYG9,nϜhn>бO"i m6o$9+"CPSH-`HW[TmK7H s{[jv ) _cgG-}jANzU>~)cD!-LOiKV@ԉ*aᗲu̓MxS,&5U ] ;%'7g5da]() #y\ zUDӺ5FTYimCvjpǀe~qxx Kaت9fYiNu!&6Bt/D<ʵ\'dذd4 셰AT=hqOCx|;jwO\!.Wƒ < ?g R4]bX&|JaWyOc V_&˛Ipp6II{/_ʂKߪb?ag-dpCJ3Q@ 4l0@Ewxhhoba"¿0 ،./e9#eP>,9;l-2v )PR3 [ s-@Ql NSgW M0ȋI$?Y/ţ~?Mm }!DOiݱM `^--)x%AE?ӫ1:js<\!`Rf峡S^lVQRw&ֽ'p+'VgiOhHOt4S]k47>2ڜI r^\zFŪQ=vǤk/ܹIVS+CtJѤ0iµqprD˚V%Ԉ`QH"'2#|yj֬iC{'z{e p=W>fF8BlO VY,xXt8t!?6pYv>WS^ul_P 5l\/Rsac|%_7%S %e %O]?pI ceVU^CG2N few(dcG"wL09Fڛk[#)C)6ޮk*=/)NIe m_fK(qʏFU 2v_ .73bO3Ut]ƙ4ׯٱ;I-<\NwrӨ4=Ajv#1r츊ӡ!JUL-FNVvݺL]șʊr-νȾo! /-[CV?|x@&}A#\}Q>^\NA  ܥ6TKNyDQ-M-suJKGҴژA'JJl t$Y9 |b PȔ$O?h bpo|䀥?\@ l?wM0\Aӱ[ּjɄ6mQhLm`9ْcxeVOQ(+;cIGi%!ƱOjgϝ/,׆.wWYY넭- 0:r=drii}B`6\,})؏^W"|*}1w֭?>ϗ%Yq_ _x?47\+n2?Du>LwP`q.1޹Bj*=~صeq,ekIrjj ^vGESq`͜2j*k۳ڕE +#me9sF 胶*tVC( :.7-s8\_UiNAXt6ERM |6ԧσ# @B>$\i9 nU(jP|TJE270??W _fp8-nNr9oOQB.J Y'[ io|MPfP! FBռe-}uKw n;i%jДWo տ:"GY!iЮګ5 7clZLޭOm{&\~7PLU;,%-jT[=']=wB AhDjl-[zOjYӞr؆M&7u{d_A{ ?smr;,Z,m p%`,9 XѶ"95YV^vcgc /b9gEoI O~aP7i/77n~PK%]j/7#K/ˀF>bWZ!s?Q @<&M(#d IM(?;o;ӓrQ)TrڶJ(1s&mjx$PπBml- ]_ʴۘ?ĵ.4>q_GiC;w:dXWuCѶţ]S ӈۺ#glN#'tIcAK3ŇS;n:ax8 Z\{!jzY<|< NLyдF|+wu0f_FNsK"[zS;ߤ󷸨$eeh^yEv7-s Ֆ1= a5~vu"lD-n헆:@6o d{xY1_5ɟ(wqpb%{  qbc >/y ?g ?nG _/51og*;+4kviVȥ Z6zotpXZ8g6O Z-A[o*zYqđ#{5 GzFrBy xn=;QVRT^GnZ}+d 3'5Gz'6Q#!lߑX>kҒu|]^|CRV\NRLm:[(WLn\MN/{Kl+_%QPPbՆXjt?]`kr) |Z٢Ԍ?h?ZBn CPWYNNwopZ]nI?I^ZTilh @/pJIwM"qwL[A 0v6arY;7 m.a z@)-@6x\_ 1YE?06 ?y1poQ16?6 /wj|/ |} #$xݏ޹΃<\>3% %K}c?~FX,iyP:B A(C=Eݔ²/ɉ;嶮\l=,>3-Dma6S54(ľ#vEtڗ&`H'la !/s.a "7tكRn鈞3Gl)_1Qr|㡐FHkjTNaȀH5[<ŪNC$c. 3H &E'7.{_n-)R9ZQu7n}4 ŤE'Er($PT>6o=Sff>d=R?K(5+':NNЕB"\ZL`-pK ̱a @F9qNE#qش\ɐzt>ϴ~x+BV+EHŞ-8qdew9c}ZSZk3u$S ]nXkHzΡej~b{<9/us+G xSڿUeXѰUW\E.]d{ҭ.?~Sa$( >C#T"-%HUZ0/wId=Mvy (6unR Gj'2?kb}ޥaݰ尓b<}bVnLC]|ks[OפG4߬!&Zv]U e\LR6[d{B!ﱑ3!_ ȮC(BLmGCjXب8uQ&&cbeh ϶;P`(mɚ5B'#EAl{H&g zP> [Z7b:^eQ4d;@N [>VsTE\H[PeҾ 8w8 "S۷XٯFeA<?_<e]G qbƝLO[XQTEEO65TӰtloVCeW}pN\f6{ꏙ_( ;ղ%w7?p+|ܫDgc 8x!WJ]~p_8ܗK] AcOioK{oܕCWCs@(V_'erhT_$4̓_l>n:#.zGQ^Xq RnD)\֗>9s=5P硴#%ixU4@+: 'A vsհWX *>ɛ6!Dx~Y} :I޵4j 2E%9pDu~3`αGk {1ڟ7K޳Юe䟻i񯯧[_[)^. ſOk! O<_B+)*,'?jO~計 B(^ ~ߖڕ+%^ijK;ooOH+RZ4}Smw?suOd}9-+e9\Ϋ* *e5:1 K۶wlU}M2/4 bwNWb14V1=rpWyKw=گ/z%;S:Tb6j,= -4r._CjvA*=v+ 0UY{a~,oJRg:C1DE2bm^6*Ub7h . #7q@s:˪-ά:|2$k86.!N9!-]&Y?8:p]qlŗ l-_Z:ܤH'A%xɕ;o]fȜh8"$g_DMSU@lt@_m;}[6lUjM=˶T>l`^6a 132<٭#5\UWjFX%3mXtu[hmjʹz&K-k\Uo#} ~?r0K5^{A` 2iHMY]=Ug$W (@} |W@#hi+O۬_bmWȶayr?3Z} r0:AZ PfdXjȖZ"#gbXj<.9sA~ɯOwMr<ş?:|[SC}'8:0 үό?~uJ '?;|E + /W&%dK# %yo?K.ER;GۈIGۚҏ3 Z5%ΖSY' P(.]AnJ[+$KbqܰK?3R ~!<6e8:izY;mZat^^k" $E~jKb%)6J%%Y0D3 }g´@Wr8s0ک^Fć\ Q:*W'3o}   oxNzlvM/JQ' 2_Ң r;A/][!M@A)e? FRA^WzGF13+hD'  t^A(fùn:?' I t. ȚPOn >D Biee9؜܅_9YvI7VZ$&oms9φ{ye%G?%ౣ/?7_~jdhW-ŸE}=]Z%Bo#/mK,O  }jR<8aدPnWBF!s|VImN-VCI= aK@4̎rc:q0IW p(FTx{7TQR#$1QR\`B@^%2p6@)e&*"QTt SAGB|R?E] l{bFWu2 T\逗9kxkh<]8w@xYK9Cբ5mfKLtG._9INELCv:[=HSxaalB11؉}&:_Ȼ+D*ol|HXlٞV_oҼev}Rg2L}՟"vȰZP`0f_ữ?۵sǭӳW[7f·]YpĄs>)|9JbQAB'm-WJÿ *7lŸpvx_ _D"e󲀇/ OleO̳T)u̓Rμm!IG,U2t6TgaֵSb#\ɦ-:#(-hYF^Us[]-ek7$G))#ɓ_S2 v6~5G&x5UD3 (9d[UY'-~r'!]!zʫ&W@Y^{@CP.-V?WϗR &@;E^Pa2@rr6"YPCNmM=&j0@;WE fHpX< ka@D°yuBbu!1gfu=rh _R[K_x" "_WG[g2?9>hhh /4\=^Zwd0?BKKK(_xa[ 򲕕ϳO I/9vL^m)##-%v3CKR?_ag|#,(cFzmf $jM]+CcgϰGR}< =vjkn@jhU~k!҆)>h]Mse±L#^J4 ߢĕJ#D="/mmݫaנp nFۧ$BUǀuP>U LJ#Mh> D̓Fd ]'vh'0(˨[z yVAe1=MW@]3jծV0(7Ae ϵbF/.X ~1Yx;j.V_/116 ;K׋?M`{~>Kfu1 \%_U YdM_`p+& Uj/9+x!8zRY/& űx yeK:.,K&oBTݔ7ۇX6Av\$*)JیM^F G=jjeʵSU;)wxF* -ayL8Yؘeҁ.ŰilSlo\YWXZWZs(M>CR^G:W[lrV_#t&:ȫn?^>T3 f4`o @/*#BϷeI]n 9 *b~Ge[ǹm5ivn "@E1\jVn6?'UOIt\#+/c  ?jo)Ϣu-yߴA~&_yg`~?e1 bK/g( %oddu!+@"G CʻG:|LIA.$+/C"qFٲ҇SUaneW@8>;hPǎex_']gMZ{ڭSstcK34CL)?ִcַB%6)Sʴޭ6V j /uzݨT5| ~d6ѸuPKHP/D@dYp󠌹ISgnEP/m`6ծYGqq<3wqww#!!H5Rܝ\$h-Z JJ- $ov7w%>瘛l.w{;3 Y3R& ],~мIM7eև\ɯ!5,a}3 Fl_b$Cb$AyYS3O;`H9gM98{QmQ0*1fAZM?DS0Gw{D%ʐK7k; ߼f?XrWh?c_?lv'" H-6_{8uo~;٭qN2<3mYx-0 ۬yOR %Dtq-r6;gR?+ؔ›sb>OJMp;g#}NqH?L  ϷLؤkGBolv5q=dm2ܐ@dm!|9pq~YCZ2Y1w#PO\Cр)ZjqVMܥӜv'ļslV}*dk/aIQ1&ao`yyЪ#4hLzHD1trwD6^?1{CB2pVN,DK?74]2&p[>it)l0בuyG;]]E n^ʞ[?n@2*4xU(کyUs1 ~K4WOd@rA"ݜB#B٫zLl9rŶsnrqoO/v4:a'~c]>! z85aUcH\}ncۤ'cNd͆=`!G8j~$c-ާy߼Z+3v (dA-KY7H7`Vc&  αo1`w&\;elhFx=k˟&y.b-!~ceW)\V| ;x'lɾlMٞnx8dQi?5e`vk!`h`獎'aQ8aKm:r4ihZA@-t0@%6 HmH@T?ԝ&G /oY]?>͔i؏_V̿@'mY? H8[JL=Pyo@H!Oe:i FXޠ;6ukbWf^[=]nViA][oM:Fc#|27Ŏ%lw[G߿˼NVݏ$10lLQ tG;G(xU'4a;S̚uY-+lm&7{yc|6{'9S B"ҷHeé g[ M( o2x(,9 ﶳh^ n9,s zo5ds;Md eK.-4~¯Ï8w>)ryW]5&D=3L_4bqD4[ sʟGzMV̷5~Y*y66zc]yB轠*)}俕Ed}؇O2Ayz~iN^1cwt3?SĆCZ}zRzא̌wLhԭtV,O"rj^z66oбᬕԢ,/j6b?Woޫ=8}mÅZ3`&"ڄ6uyI)&4+ml/{PQUA|,̧l*s1ێgQjjVbjC4Ł_X4{"# ?35f L*댪]RX]3g[! kC??UB<_*|kY_1An "$ÿ ?qxzֈYsgi@d*A&;s~蜅C]^/u\dhТج؆*Z$ި͠f׷'W困4-+.Se:  ` !n%QFBЙuHϓI3l(lXsߜ~)x\Po߼^'_` 0u ÿý=b<~l{OW^sc$ɍ=zp :a<{j*HvN3nӐm6!@\R^NnD=@8F]c=$oOc( Hɟȧ`~8oȄߞW:a0Kf~c_g៻կDO?UԈ-oޖ`IlKϔ9D̦O ?ڬ&]"â,<+۰Z|gZxeM{*Ѽ$1FM?)]s}RGDnlpo7"ݲ͜)~O}n"i$/kP-:M1Mn+i$د/jzK-ھ;?k 5)67judOfy,wp8fr~s Bk6/tj:QRrbxP O3{}^#xda}H= h\@X J39hio֣_J_Ldm}=&Np<¬ ]yGH'gCHf&S;kBtH)8g}1 SUʔb~F +@`B83B}Q6LLd'BȄLy?~qZGJ{BmvZ k_֭~%,S(Peبg/Bߩc^)=8qX%<@Of&1nB7V4aghtDܚ;ϱpYdЂume#kar٨] d/+q`;DVm{YM'J'z[R(` f03tg􈖞k݌FS/]hGa~)'&O@] },`e+2t3$>F P|. 3GYw`o:;Zrw#hg za3YN9oE7a6$I>ؾ%D t~Syq` \ٜ`{ Ӳ۵c @=k i lo/P-|((X%oniY 'Z萰!㖍EF,d$zI z~s,KY|¾Ok:ѣoed7y+a[PI`f |u;a3c~a[1* EL>B6d[ &esҝ)ocJ&M~Z.j 6öM3#@ޡA;;I#$S{ >/[rx}K'f|x q#0 b9Hc;0TngĂOa-D Ȋ~U#/-$~҅oʚGWHݪ?&:!?׆-B\?w_[xF ? LY1-ˠ6YlmZOuf)Z#Gcu1{ѶX՗;A1m&Mbg't_БՄk3f٨{_$l q}&Owk=#w;. @lWļ,Sͺ7Y Y-`mr\ggߨ VD/@LZ@p-z3/K`a"c7w0@9Ȉ"zHU-ɿjq.8N?){v%wDN ǎ_f:}}|U]ܻU{9u=D&j#k%__`_131STL G4_4DO"ZOM?]hKî˻+iFMoKM ounIjr $C2ɰebÃEk%^4l֩ V̂Hx@b1 v" @Ưm0s1&t2@p?I/o _1ȐfRM*0 <+_Mpਊ.]8?{|\]U 認ʊ鴲0GBX[[/۵A u _"a_3wIH GS!L=}`pwmKB`MW .͠i#v1ƮΡp}'vn\ͲZ9At؍-Fx:SϚMO@iJ깞K1hh8o]'e[6\ͦNwumK /KRkma0f$& 7{Y`nH4E"(8l.}􅀰=i`Kgf!F(YJ8Er6bS nڅSs[Om=zTfrdN/tZ|HfNݰF޿-~"cV?; s,CX0 ذ_n<ۉ{4\5\26CH\G ?gt33ukVǠ9cnjd: L[IU B^GqqvWRP᤯&`>q?Z[5U ,;avmOu^VHt0 ȅ͏W?7xbۯZv-=w]u2bR;ti-L9|Ǟ|Ond!] ɡѰ&g<;$3(ddCtH6xHnB԰/YywL%s`TU?p04j1;:zD$a$@DыvNgD>x.]tr[ֽz>RlDUm.vJ Uo%fua/ ukn+`{?7HL!-tc<6х#$Akg9;iѽf?q\|XPkgs.ۆF0!̴S_Q"; *}'R`iK/BlpysR6ILMfQB>=q$.IAX5;`K?VdlٺVY=l(xV:6<j:E?cbA旾Gyψ[o(l38gutk׀[ޯšo]sO4uDѕ:ź 1O[]󺰩,jC~sv_kmnɦ3U,u-{QE4 7mhĩ[hfP&w@yF7JQt"\ U}E.}_j7|i#[ؘQ o!5cg ֜^nq_眅"oqڍݐ)-gx@1r0f|t??݋]ʟM1pw>.  Fޫ/P/ `g/HP\va!=_RS,۶iŭ 3 19Wc/au1˳ Om&s=\WH~0$aHNF9Q03"]4:ۯ MW,r2gB29ɦ=' Q0d`g 3d4LѶZF\h|V-lܩ[ԾC^O^`gGk׮.D+FL3"]h?݆eKxhlO3$2"X$o!# Ly:b~ ZT~L8dkW/u_Yÿz,& kiZlvdux`j.p@9/acr5$"!ZH̼]n?g$.{+2k@bǡP^ e?B& )J~3ϱU1k=Ϩկ5d> @D|OdRzʴIw!st%rp;ogtӣW-70 fFńuuAF4 [4{6=;11=q!s`tAc~b=*<)iQ$HjΆ>HnSSz%fV3!zGwWz^V; UOXl06R&z,yC骢BR_s,@VJ1k7GJStIrS1aɬ ,6[k71<ڹrljϔ6[D^)֭l&vÏ}yYhQhtN L꼬Ӓ3g!Q0c`iCǔRpo&g?rDp _" i]gn{]<ڻԢ&팈a2l`i ,$8i&ƍ\0*6ң;K%}f,c_]]džpX/PNi'~ѥ|:ͫU˪uQ~s$',1ؗWvDẴ"JӋ7dݘyxMYrGG2Ⱶҩ)1cZ_$9yRuC=hNm!#p4kiLM L= 5S +v |"C-Yw"-V~r:#u^-⚝!1>na[Rk3/>"1~^]6 3 `6Km  ʹ0>16ZD=#H? 'bm]eʊ^#z]v}/޿{Vi'Vס)e l&ż`_ q *y,[A?.ψa0EAgPD]3{=i{5KX&F&M8Z ņX@ R;sE ?>% zr,hDE?6/,%`l>;z) ʀ`Y_V3`?ܻ}p-*u~jb?Wbt@/ b@q M Ҡ,>!~O PkrME gSGGd #© 15@db}^t̔p'ޫ)w_kC~a1ndQ0/OmGaR珟>U~TӇ^wߛR7L_U u~ہ@ DpSsiY@,NѧϚT9P" 6CDbgl'{J-?˱薂 @|IL5Տ1 ݢBY4gӍĄ.0Ty /ξqhOUc G{ +~z-N;>}Ww>uj ` / 3gl )8:&tبHvrqK耘9(z&Ɓ,C3:H̬eX[(0u 8f{KNM n?5(W15 8W͛a837,Xs¯?vڿV?HK\χAHeH=PXiÎ<=wlKSݱ}TJqèAl8fx-dNJM7f8CK5||~ȿM _[$fG__eZ '^/ i ugHқ?5OL 1E?}TQ1Me hgfyh4#ӏX(Ip( `gq.cBm;l:V>D1L: cZߜ3CiJ;pPAh8˻[!-[HW[WĨ@rn*B-me"MPEAHC@Wrw% #%mۛSTf|'( êZcAc|Bb98B8̷ G/6mr#'$Tș@?V9~_<} V؉ k_* 5u7@!q@; \_G(7T\vs,@*po}.S/LK~%/]dpwǡǯ5) ɵkcoߠx}ׯ_ $ ̂i l /e TY=%XiY"OيԬbɏ΃6ypy{NS.VkB o^KWЀb4 Y_% z=UMR?\CI,'.(OX7 @"e HM&?j o%Jk__^Re?7XrʃC!*(5e*6_s(r_#+qO qe?FWYC :nIY (/@PlڵgV/.QuF/M!e?:l+k&P*knڅAS_c_Q ~~4b0_΅?w_🧤-%MҾҰH37WO c?ZPÿW '.y~0X]_fz-TJ~MpVW]\K ?.0ф& #释4@@m_~ ~Ӯx.wa 1: ?C5ߝ~:@mʰ\5v1m[7Stڠk)֦Z66L@C(_۶z//Z#bu!M=k?CjH@Yش qK舂t= yGft%׫a9K}Ex?ߟi?-@_ֲ}_8ct~0?N?] T-+6CgQ%\ud̴9s/{&"1!퇋yPh ~/pb.F??.Wҵsn_V/&$-e?Q|п?pe%1[2r(!zVo62n B]G\O߳{ hQ=;TȨ` wQE= j/Gm*o WT"BUXU KOAgQ?!&߹݉9EҊ֧oػ1dcf馬}#:e7V~n+¡bCD?OĈ_Q_CFz`[a;¿?s>S̹JGUJ,F".!!'v}Se=a4 ?iH}=ݾ򡼬k^}x_察sɂ\_* G5~UIP;PWpA q;ΙrP¯] tH8px?U˥w+?VTۏ*QCUCZT-?3O**z'(տI?w/o_O/7.˿^~|G>~yGw~Je?zCeM`տph4 #w&Н \Ep~?u!8\(OZ?uEZ?&eZ]tIµ#>{oׄw.2VT(3e?Ÿjڧ)&t+bu]*N3TuQ|Z_eIIjai~]wR`͈$[ ~ʟL叉`PH AcZ<=Yd@6Tp?/.K0igtL'%;g~{ jf/Uu Lq6j'?[ իt_F P25JeG ; j&ҏ')?}p??RMѻoyҖLT]⫝̸V3?W4̡;A-SQ%= e?P+v -;N :*?᝚_ uu4kN郟߻O]}Ϯ rI/+5I] ELOO'G#NUP1s8Qڊ _w^TA[2? U:I+t^ - O7O^KWU7q~,6BWc{@ Fȥ46~zWT (v%fRP=ka5-W/nOً[ߛo_=Dm?&k¿M~U0 6e5s"_p(-n鱢{+p̺3!|yfֱT^$DEũS]#Fu k k1SߔqWYO2/r/&| H.!/C;'OhvIxriPYvY+h=_Ƴdmmggٳg5 cR͛5=~zP 1CS/>_p| ~ÿ@ٿ~q}RNҨӳFh ( /0De(U/Q: ~1[}{]e]Ϙ>%=G`52?8PG_Ȝw.Á?_`FM+)fѨFO?jU?ZІ&jc׀CwpR}rӇ\?2e͓NJ:e?t۳۵mi:wߞ'n*# p5?L )-)B AӏRuJ)BYA~ E a'6`xY [\4 gO +^N]]]"#O?`-B=oEOKJU4=w- =vRezs MԏVΜ3 igLÆ ai[TWW~?8>/+)gmӺi>gHo9W\bӦN|jQIh,{;MQ{ㆵC¿x#0n޺%w׎|tysg+_!?NO+h}TRE9ÛeT~S~fwTTW#/E TD~YbLj>S|=3$p #K)_/lm}| vꔯ"#g&3m4μ`i"Q=_EzO߯xFV쯬V'CG ܅||_~j?yt6T|XVd1Oa?}jW4x'}7\_ ¿t}ꋁ)_(0;&}%Ѩ -5*h]Tc p/Y: BZr9);gKs (]r9۽{*z4)_UU^^3/ _w..ܾ9 E?9O899)K@9A^)iIr&O}cfj[#2/ wPuSZ6[I2DaP^toQw_J?J1r[VU.y[,/ھ|œ*dw.4Qi^޶J_2VJgԿ_ۛL`FPWO==QųGJ֡.ҼfeK9Hx+̪_T_1cXͣR|F9whЕMO8][(8bjdRd ;o#!0@Wp!w GwVZ.LOeÿϼ3:?۸)[8>W\. 7jߞfCiįAlL rf.SY~$_|?oeJ `W4 _s3}T3Y{1H&gc9IzG  @Gv/m|沥q$3ۈ=~~~~>Ff1i~HGeeO1{LãwG! o/ ״I3OTU{Ѩruuҥ* 9_k_9|??X/_Cg͸y/kp3 ȖzFCoI㢊´YI$y%$ߎ)jWq"sK6 iPkKBBMڇ_R n P2+ o )/[BB",14e\cJYXI|CN##G$#XXsFxi }_.%[?7A'ێojqfM5"EϿ#33^?Z$p%/*D4zb=Cߍ`U?+9kaVp| RVm=菞Ht[ WoiiUy] i G9T!t q( SxW+eBvbߜCf08 +~fȹ;@:8p)F`hy[C Fv#~P@6W++K~7 _'ۢDDU'5} 4F@]ﳚ_j\;לC_yԴMpv2l 6!EW{|sݙ.a=8x281.@Z@>Vo&r+U~Y_H+Xُ_ jT˔_/`oY#[ PVȫ/Gt簹=}xN7ZFDˡ!?4M1,IB`Nur=I9L~𯭄I&%;1NBV/SAٿ s*~ *(ġ#x/^mxߞn-$㒺ٗ`mT8p(!=QlaĺiN733WJľ_VCP۫Tկ+j&i7?"@ *bPFeoohK}m_%91 .G&o3+hÿlI|kIט[?Bִ fDلCa~56~mlx7H5\J+m9UIetR;PduZmvi )Hwo1Y_j~jQ_/_K*i,0fD-[MH=+W(/d4/4'DvlŶsm}"㈜+8ڗ6Kmx)Kms:9?r )ϱgW19 幽(ggY]¾`Ȝ~駉yjʩ HpssO_1 @sM( ~Ɍ (SZQxXRx#̹ r_I?88H7OVi\]]8dԩS Z0էYjU@+sM&3/^>r/?% 3"W4T_Թψ| b;͗/utJxj0Qiz|PP[fe7?8>58~rGG PvAΥF N%*e=QUUuN:aci/_S/h_o+3!I#&1ok*RG iZCft^ZRao1/Ğ{ ON0]6??c0ɝS;v4Q@__⿴[numٲeVV?ƿzRu4̯f7g߸r4Jd?uYA VM+s:<gթS͛7߼y1c~mZ.oI a5~ Œ ;]!G;v84aH|2NurrR?ƿ_2r Y? ɂ,fT/}^}1^ C;Eȼ@W9>\O}{0ӃM/3z~~Λ3 o\)o/$RoҸ1QN5;O,11ktk%2,6^KS9WLӺF# YaE1;v쀛֟er soYGX'ֆdN)0>Bڿ-. T.Ȼ5~ܘ'HrNf 0VS~66iBS8p2?y?W!?0!_'|F:^T_Mb)8%[.?1--MٓDNNt:v#ͩ;O {;Y>LΫ2H]ce:Ú5m0LJ!q@Wǁ/ e¿Gs}/hy$ `Ȗ2 XT۳Gw'GǞݻF]XNaM$ş:@+¯K73m۶vtp3oڸp-i\9~9?p7 k֤qF W*rlcc5:¿,X%|i"h'C0E<#$$q\|2i$'N8o}>}-^cǎK,a]!66~f͚EoD@ڼysJJʮ]_/99:#zovޝBvܙxݳgOn`СC_}U߾}7l@m~/:a?219)64QpP1ݕHaCkV->lBQ/$7_5jT] Hʿi{Y( o|ϟ;гl@0YCy)%߼YM6 &*ȫ}x7wWW࿜/dÿTG_a2O2"Yc]Vw  IǡP ѢE ...Oܛz1uvѴiS1e˖QNLLlܸ1cÇ nnnJeDDD3gά'Od^AAA襁@ZjU_5X~^p(`'0ǞZ8noۈ ;fv:,/ hXȿ{ 10 . B/r5m3h]Z 2ݩVXAV8::ߤB5Ǎw\p!jrE| ]}ISƍ 믿Fl!t'k ǟ ;`9Ç ]+@⢂~YP_ƏY1 t)%dӆ5wA>o͛Q n"C-9)~ѝQ#tz 7.1>X>kٲA@nnnnx!/d: #h5oάlټA?RT[IvJ?ťw")Pr/W_7o{A*ai/*)Vyc_,혩a/ch&&[#qURp^ᑧ+hLVAGhޢz9^^R_8pYRof%ՋI -ݻ'l(dU|0(0໽EYqF CC˜uf~05)aQ5?F7nbݰ01ڵkY#Zׯwܹgœ9syfNbb"8o<~SnKGΏG` z$gGt뤾#`˨?#"s~5n?~8p?W7J%?+YO|U}ٯ䤸F ueϟ8;;!;::B;JXFwrr"`ܝ1*8JQ _3'Od߾}T>j!1a_s쾽qʕ:.c(t/ ?Ot']?e.B |i"/`%/e⿺`)V0\?Oۼ_/߻A}b8_7G}_+{{yR/ʿ p?JjxRXJ2(b/TRm pள3vB<$2}tjӧO ]-`vHM6~aA˖-F -6miӦ!EoR/ϱcǢ3g/m6zhסϘ1cГ𠞤1?Z-[SzddmQKB2=ȹݺLe["GZ'=oR dȝِ ̂<:dk(eB&l̀ߒ2 2vM,lݲqo&M5 %' Mi9ر_nݺrѣ4Eo^?-ZOmOcGSՏ<2Z{.0uw"00=ڵkQK z,,]Eq5 GիWPP1;vȅK(믩MQO7 2>Ԙ ̽G\'HO:Gh9ϊ֑mZlռYxS?1ۧ sK='V&?@*nݻCPP~U?4#+ӻgg6m"3.V,|~ѝOvqqlr>b?/xoJ8l0X@=:usJJ At8xǏS+tޝ[///#M?ҥ+Ӻuk>qqqGL ܹs]]GG:g~Mbe4 'Hh|c,|y37 K Cއ̺yz&d E鐅iW 8ߺMф?g>-ڵkMp[w qO+O%دO@@PypZ'De_>EuD ,޽7u6`ƙ$aŋk6l`|pNNرcS0bĈ_~xwa?,,lƌ.\X`6Z,Y̙3'MԶmw~~۷oG0fϞ06mm۶Qn>s'NN O~:pkG ezs>a?-4`l* BIl" g]+!z&k3!2 A~ȴ+oӺ-?y rO ?l^_we _ׯ$СCÇSȀѣGii)j,++۷맟~S6m0Vsww?t"&<4hʕ+\w ͛7qȑs΅c 7nOz#Drssر#|NcUgP7_R"Ӌ ?]b_\I0MF; ` ?_n *3RGρ̟ v4e\摶mj36%z?J+4=OI56"ZE}6 mB__ Ϙ?\ njSQQqVZ-^ٳg d$]<؟I$\ʃ_lÚS#%޽ۺukߙ?>HvttDٺL,`tOggg7RwkF+--t|?zv7IW|'/F嗱Y#v9jA/@AFq~'9r…}7] ;b{dq6e}FDDΖf=N6{>g5:_|@dF {iH/JYx2ȿ%eT $WmH?9M6lDߛ1mڴuj}(˗/CBBPD=\ ={ȃJƊrݍP mo(^zcǎFqhk1qhU$M˟ Æ}z W8ʠMq(!$?mll5'2Df0jP쇼toGeVuɋJrXXe?/^?~<ɠʔ)`G75FEEeff 8k׮x?zg9r$225~w{𢠧c!۶m :D ͏C.qǿ_2޴/uU[t,\R Kx)tjsُ߈xƠ:wQ..M74q(:ns21>KǁIxpHt3쿗~_v + .B/]祦$;DF!,?8($?]WBC)l6l'N4lذO>TIii'|ܮ]l~?|W^9"?~/xR{uwu-[X6mڸЧ28)H?1-:[C S1V)2ĥW~ ơN+iiS_L3_H5bQWȤۈ߼w&eP5Ob+!/:&߄_O /PpX, +oW\ɉc_XqfҫBEe4.Cs8t77w/u3!.ן2ez, ȒL+ ~HiWW//"G //t䟟_L&C6w=aE~9 ƿ]jyD[G4fzfPa ێuIFI>î=SFX 7WM{Z@( 0sZeOW77_o?5ؼ@;(3~8d4W/B^I$/C^JɃLM yG6?bkٖȉo_P8.޵&̌Em7?E祯 =$D'rbED>-g2(@ǐwȼMf.d#|6 7#%98=ԢRmukx6כ`o˦=!= m$(ᰡ׭}0Z_0ϛPo^8A?PVliZ=<<5#%''S h˷8~ w׬ L{~uf\-ћ+Iv_|$ȿd?9_p)䟟 wn;|'/ۼ9P |}-ƿ񏿲pXʧ/&gNAXaKoZ:dҡ[ ˰mwۗNJ;WDZUkFY;j֍޿~́0Ʊm)zC[:ȶGM:}O1ΩvMӻg3Y͎?;ssbC ._ _20TX~0N6+-sxG K/@kn)xS xsIuΜ  jXHˆ.1 P9x N-$f<8,Mgo}&Y'tK toI⿙b??7/vjԼ܋d́L&օ;(oMdِ 9Ydݺ25"3@Adv 3DFu"O_`JO{_@+ -WKSX{jn; FwF]H= n ilPwڕήHP2jtrr:aˀ|2yu]OȫB._,Dy)_@?"^y;n_H6۵jE)A~o?;P{b㰑/2x%e7D &QY yj!aay1o_ň=@s Y}|RWR ==u2wp=wo5BuHW?К@xo9!6ZpuPҗ 3%6b21dy;~ )߭?xCߋ*BR* -~'QoI_D/@6`q &fkB !_N9?7`Ӧ.<665`_ bЁqWk~ڕnXW.45:9:ǝBPhuՊ?R 6j].AI.#Q^t+ŗ!/R?E |Ā ;@! {?m1pXZ;?bk~L[hƖɺy^)r٣C`Gs&K^^NNA )591qڔE7 91\V8Gu 5dصKfwA=F=U5|^Nөo ~/O :s!s8ߡS6#Zo#=}[+( H4Iy8p$oR5G>'9;33͍ټys'2|}}%+KM-7`'hP]nH9l2qK)E(S! Q/H<O'DOINAʇ V[ކ+.? a^?z\qR%(Ч.bD fdTV-].;RIx̿tXKn{Vx[9/C^Gͯ؟'B{::T4Y3f Gquk-__fݑ+mڴA 5S;t_+{k9]N/mdJ1#I"1ԏ .@.$y>7' sb!sc M?u }j.&O(PZr1 %yF^#l_n:p~DD駟Pƿ"0%.XJe{RY{^,6=)WejٟK?'.V9&K)שm[V7m((0߮/=%d5wTZ-?k('O?^,Ŏ?-ԯ_ߎ ?1_L'Ka׌&gm:Eb_)uL ̿HyD&!$ANMn\N[g࿅}jI(jk??!&㭁=bٲe...T]vqͿk,Բ acMv8|d?TU"r'7р#{f̙]m, E_OB+AῬ_~^^~~~C ya=k1H?.?~?9/B/mSL{i.D ު5ԭ M|23_DePLAICv|mBrb@hpo&_eE_z~}7{oӺS`/K4;&z{w9BئMy~Bo뫣E߲6G2o_;9o*ƿ2l45_*rrr;Z> -Â+880%?g!''FO4{!7k~+'-?tЗKLϜQy~6+$NܹxZm ;vTK -.ƿj?y<@7־k05u7e향 ~ Sڷ2tGn߾q{YVwx*v<tss򳞗~_=oXoǑ:7]h9?s/'%b/I*^ u"w;,bI.C3+Ry뭷{YV-Wso^ݰvQx&W.C>q`+G.LM򬟚W)GxV(8rH>O?UdjT7N5ok4??.Sg»?\ :+;}о{[7'֨QhpPHW:7<~/ˊ={^zፃ@&}G۵iA/>qdwj3}ʨ]:dgcF9_WǺ՚ONNݛ>>>B,,]<غJ15/n&fͿkGZicO࿲\cXzs [ `?4y7oĊK.7o]qŋ㍃} .Dp=t`å#C}I}L҄&ƿOΝ;Qo_c.` rQ*Vÿ?U:WxJlJnΜ9 Oٳ'&|/))իW ꫲ2qp`+ gv7kq$͚6=c,}ܻwX>rp#+7ӧ\YJ+u9'3*IkMk7w>\+ȳMV3&ye8ۧV$JV?GiN?'+*!=>Yyr_IbT5b^${.5-¿r[rliim>6VM?4bcWmS/ ///3<p_#?#xF4_/-l׶*1UF^cc#Uo.\hР3X/-hMԳֲ+p_zk>_ ?;wБd8P11q#L WIkK$~-vRkeO w"ƃ*_i|/<H #mB?]<pίM/ b05*aqL/!Wc+ ?9eKm !8p`/>SELMiM 9(=6Ia#6F!|_ . 01qWO*0r]pyYFe_-%_$_^i$L +xt~CǶmED?ƿ f+kc#:ʃ@kmT( ZQ_3/B[@^o62ҢxG4玄59")) 0'8d$YZr&_~4 "3+ _$1k E>__W0D߇ R<_K\t;"˷߭WW_͋G׷5Z"___&-\[6o{ \ *5Og]>*'d^N_yl={?MBVpk1R} !+% 11q7Wέx|IʱEyr!k&%ۚ~lE}*/ ÿ@/5j0_/u_i!Tƒw0q{kSl{y6e_1+?ڶ**!'-&wˏYZ3C)/L}m]:vخ]Hx4k oB_)[wO_c5۶G^ɿA6i%gA~.xՆshY, 1~߿3,80gXFLט|X3rrD_cgX_/k73oZpoh>Uݳ1q`gˀi3V?e?ĿZs/E_`E~_Qqz߉-ZJwrnnnhh(V?{,-_^_o>\Wuuuw7j[_k;?m¿o'm.3"hl\W 5?((RWe9a(Yǁo7 M>_zk0k~3O_> 1,KQ3n(h^?%#յ 5?wZk0O;?vss'c56t7%6 uBވ*]ȋ١CO>P80gÿvA%ڥ-95oMp_-7ȉ-ƿz-[sN>10_)5H10qಟ'ww}w7;{0Z_ei$3?&z.${zz AWcB(,cgOMM}뭷10q`++xp88o72cck󜉦ˉL7XjQXQM0ZذaC||<'JpOwod^Ol3oaa4ODbbQWlbȬx2 Iz $фdY~Pfſj~$aFFׯ<V-W[>lmk$7q :i XOl9>xeTRO%_!G#x.Q|ُʟwK:Bb?gt?jo5y򔐐GZͱcr>))=!! xX_7 ƿ?rDHFZ&=od^𯶧]2ke*Cǁ~]S.))?1L?6IO_|^^^#~~uȤ_zoMSƿݖoHFv}xyyy{{2 oR /EO][I; oXύ̳ٙoip_s_ү_?hLLL۷~s֭K.5:7Y8iR_Z?~\JZۯ^\l ;W԰a ͋=wYH~O0ϺBQa!Z4Y,\nsƜ= PF+~x[Q 6nzf%@3g<oR +sI9RɟD/@9g|jj*@gϞ|Z_H^:͞+ .X )&0ZmB9#'= } Z+??~4k40uҤzɃH S")1Wb|,1cTB<U-_y.}k :|}_bQ0UD:: 6So;vٳw?|== -W šSlJJ_Mn9ݾu+c|l,ƿ]+::+:߱c… o?YIskr3Oȅ2o2Ro 7oΘիqqqo&zw#ァq0?S=qW9¿ܿ;ix Fv՘`y YCoXG;rS'O_9tO 9b?}:NPZ a7l%h2p`B|y_'#ѣǮ]<NN,80mr _Gwfk֨aAҪU(CW .|2l4`Ȩg޿gOɽ{M?j0R ء*'G:w H?v?!3** mdE(w nS-9.O?SoݺuOVLLLΝ6/=E_l/੸"ՂG.`ҡ{*aW[Wq_Ps7#MCXh/++CnTo˖zPOPgLQMa:d@TG}Ç襡)=̞1xb O<xj(lxy=i0ƿVFy_h۶}{G>a!D ,z1k6hM.nTuSF;OP˺~E #^'LoG=|:XE2q" Wacco5[ Pe(!#?ȼ[-[DŽ ]]ݾ+ ~h2oN_U50@=ܮozOr`ִ,;4sf'oقZ֯Y# ku&@ƍ1;KwɃ>Q~011qr6_+?666,,z_Mÿ)P5 G~7oZ1y#"_SR߂ 4_O MəSO]q58xCh?K$?/G/ǁö7U??d?b~0`?_M*amǿ<#"𯶷57x?E_kfϦoϞ~ݽ`֡{laeQ%"l4T ?r`p?o+,,=ssrnL%#-͠\GB6>i}\[(ǁ_o `Y/_C_+=Ղr.]Z_z_e&FU]%:ۗ9Oÿ*VLk\Z~pw!D%K.?uVu7koU?*.Q.+11q`` vL'烔_8dAwuu޽{_2`?B} z,svv!۴* ¿H#Gwp˂xRb*,(7f 2?~(c5Q?H16&F8!ݻzsy6-fd~0q`.waimjb+W莿|24FEEYFُK_e7W Ŀw_% RW |gNyΜC?j $űV8vlر~o6y(pw(%.Y#4~ ܾ͵5/B>()a] ]Xc| \p~V H4I<8d$} `/* Ʊ~?9K,_%۫U_UCB*y\?/g\pqR<K VΑֈkuk+ډ-࿸g%aYڂ\ƿw|p>SK/f؟ W^U 88UfS}Dǿ ;Y[oe\ƴ &cȐ!<]5Z1O@~رcG-1f?=Q?U#7v*_-%h9 P` mC֭+'O!/0 ~F*DOO/77ztG /-Z*s?t֬ je6<:-?.3a+Z  VJJ ! x;88tuu/\qq..n&qP?~ڴQ5qrrݻӧO1oc?}۶mÆ g;wLoϠg^>HX eȁ=s&Vwj\j5ῠ;vH~_/5?.Q0)=zڵ~BCC<v֭...Bruxpqa16 x"0ޞ8J_!Z?|yJ#€]\*'/T*.V_GFo!!?{оW_0V5[G/7'O{qˇW??BO^8,`f͚S< 3OذӦM`ȿpRw 'j4ʟ?\Zg~x`Bo%_?_*pُ];T̙3ZÏZ WW7PYիYoKX,?}߆0l3gXFm}%e? W~뭷/_n֭[ʕ+eee#G4:u:ĉ }۶m;wF,~|RZhӦÇ y͝;Wq`ۃ!/Ɋ'M}A/]8 N[]\VXEA-[/*b?UZÿy?Ght3֭ƍȋ|e?5 w߸qܷo_Fܠ;`?7nHῴgϞήQ'M#ׯ_? `̙nш \ʗ;N?>zAӧ(W:t\6̲͛+eK1WI64 l=z{^A(m\h/_ŨQS$qq`+\f_+Q]:;;#\ ihq&jIբB:Se?ٳ%(KaJ>n5?.'<گl5??0Տ!YEפIhs7E__!$SS5to,S2S7ԷS|Z///?A\NNhyŊpsɝ;waſ[5SǎpW$HIn->M=<d2\)ıvZQrcW, Ge?sppؼy3.] }}}/BK``1]\&F_{ _U\Xco|;w qc5g!Q_C~j*Y%q=Vc+cW_y2_ _;hÇ.AC;Hȑ8[wZ G7.㿰P^wj֌AFVCЭ |r)6o@tl[㟩 FQk!–Vڵw _M1*]ck cg~Rh nȿ]X6 XK\S/8#/q`+ԇB1p@V䟖_H🟯 ϜYY$ÿ@[*C߾- |Rk1Go+ۇm<_i_+1!Ν;׾}ؿ۲_c?VՃ.F/M?yI 4+`-OHDS$2W$Y#S{'1k)35&j*~(q73M'ief?ߦiSyy?֭jGDɣv1AC5:gr#d ]в^7VW!/A7'+;0_ÿ~T+#w_$^@ 47(G"_n 8e~Q[nw}_pg~9܉pZ5lY4׍K Uƿ$_#[D0)_]C"iDSe?*݆)o V.{׵UĿ!`+W0)I\[w rOELl?^ZS{'=6_-)o^lm6|N:UvmFO??YCa߼WL)ſE }T1Q>%߮ څf>V<ә)_DOJ?U/"GſVVzw4`J.111<1Ɠ'Oʗ/W-[6>8 }BѣG,-+ [\_ E2+bٲoƎ{L |g?~e˖'A8u:|y??4؏c^Tr2Wxccndad:%YwF\sK?:v9&X?#=?6eKR'sF-Q/Ç񰏻v5j|ŋᰬ]Yfx1cϟ+'Lfy_Gz*hՐ(fƿAſ_wعbŊ:L<ZUf?1Et#Ɉ6m[Ydݺ,$av,@#`xå>Z*SI}B7 FZSO~RJK.ݰIڵɓ'm۶]vZZ^ w!ؗ͛7_#o}nu!}sjls??\ſIUt0ˁ$^Ϳ5qe11|+}^^gt҄ʕqH)f̙dz!!yg#; : ϟ޽q,.Z?mb a_ſ>ᄎȄ?s: @:N F6?T+3f ?,_Xn߾#n9r4(m3z?,LH` "R%?cYlsQ񯳍>;;nᗪ,;edJbCSPEP__)ۛ]k~EU?ߟ7WkIaYc6o |?W2e2wu4Œ>ޞNN֫wj/I~ؾa~6yМ8?d8~XͨDEO vί'' ޖs ~ϓU{2&};wN:!!x0IX֭,^ 1'Z&Mx=%׳t)Y}KpCſuLJ_mOUj8_gN!?$@?,VݻO\\|oݺ ?--[N󍌌ںu\]r5\]c݁x O]~k?O-Xߦ ?\JyoKŠdԂΝɊI<_?j]4HT_ſǿt&[ŭ2ZoS_򇐤 [jݬYsAE`qr]G]~+;G͟|y>l?-0LJ:+pW_$,Z0ea߼O=qc*VOI[LL|(L)Dra|iw9"mI=z_zrLֽa#GDHNVC )i .,sTN­yt״7i6)]C2yӅ 'g-6/qN_!~ a>%`0ys 0}ի߸#-kkUtP3*ow48$/ :of'Sxe%jܸ3a`|| }}Qk.֭/>#48+qEoG?s:e32)t3?q:e|Fh=)g"lGrW~TRqb~ ;-7_ GJ?Gſ U/^d;v쌈0` { oѢ%X߾zH~dC W0J{`rWym^j*5o9o?v,YDFr߼9s?. Q/ Ʉx_ K*݂IޝWp_iY҈oOn;y_p!44F?_~g+WQf#"Ac͚)kE[do??? dV ö/͉ʚ?{v?OSC?gu"[ȑNKM;x:Zn?_}E?vlz*U{ F3eW i qX nlk"~ZgӯE&';fTh8֖-\ !v &wb񟒂ѐ\93"GE֯VG83??kY[#QOIOJſǍ)E~ BP\{& (sU d"_>dD(|9C͙?!0hOzM̿Y'O>1t7oZd!/W_5h@  pU]>U.^mߤIl,8t?ap 4h^xG?rDe)?aٖS/YcIFz>ɓZJƔ)D: /'^u^ AE ÉHB ٳ׀ٳ<#/=;=شɌfOv7nߺ̉j~:ngG= ./Ш/tPWOU@Gm۶-k/bŊ˗/;w5hn׶c?1AK`*5l+{!_ſ"d?;wBܾmSR,~GB#ׯ`h  B">m2d!/u/ȭYR#'NP ߽6/ $ϟO<.w_'O4o޼t-ZĻ)xѵkp֭[O*+W;v۷v-00pΝʄrk֬amuK񟓓t)j*x*/T9^%_=5$/<+Jx$lp 6ߨ ӀMGj4(z?%sg] _AKٸaq OL;'+W˗)_)4%&mtW9u߯_+V/ǻ_r-[.C^ h"#F`seo̘1۶m[_~ m?^$ٸq .pm :upgo8z9<<_]M}5J^?. &?Gſ/Yя+aY:G߾#"L?mQ $DO:W Og Pyy6SԬYf7kE?bYE0w̙) $iSD v_=> '_.\?oef'a(_ſ$?{ v6u>~;#h68lhA6m]`Ц/O?p\JH[?}:Q.k`4OHNg8plyyIjLLJ5fRǏ3%j?öa;F}1W/С̔8zn2{?WEzR{?l_짨boٳt4`?<|Y/m'Oklb򠛃۰˟TƧm_@K݄\\Kp9*ݍXzD@c |y}GI\~>7x8FjW 7mJh|k/6o);|8rK`0|: M0 tD;:dv%G7UEwj]*?((gaXשSgҤIvJKKch8k?6X4iҳgOs܀+]W̪gcig?WCEYK-QĒON>_,iiʕD˖%#}7g5;w+С]ՏEMJ .&MhClBaZ.= +uIGR}ž2;v/?ok&-/9s]-Y0nQ~4{>8<555;;{ذa,G9gg}R<~Ν;~x-[_p>}:{lΰ55RJ܏] UTF`ҏmk./H$?=zdd,2AAW˗ɯ"*T?05 >>yJɉ=[7gO?}k_?{j k`\[_1eM(wl؀0L{J޹M02Dx39k¿Q 95VŦ)X OդI|֭A8K?DNGJݘGvTw-]܃ij_ @]MK%|?e?܌LwT˟k4yrgK4?PaC:6/۷?_ "I͛|} yݲ%1u*(3V[?jի4%k_w:YՀ[ )?$SϘA=ˁP*U:枀ΗQ0j`5W?U)[8 }p^ tjUb†%%rۓ-[ѰZ-1d]Rs8Ĕ)[I.9e3vյ Z z:<KŊx柇ϋ K|zn8 y?Y!_0/_%l(Z$_T_ ?""Ӧ@?__/c9A ] Ë6nܳ?17o&'L@?1d׮ކ|V =9<úu聓&6߹3٭Zq b(chW 3!ֵkwqt=)8𯑆J$?α#S/%e mg&HڟC "||m3P ww 35 O?G?Uԩ_tA2]8W_sqtN_.b?~*sg#.HON~??*,ԩ)%bZ{I)8HKٳh=\=reQ?e  nhTk_Rn,]Z /6u8S,ŒW8\ʎ])S]\X*Uٳ%?7vmca}V6]J:̿g+T?JfϖaaOgIC7t`g +gȠI&Ll*]'O8_{F4OP?v>ǿW!]<Nv7emq8[/ɓY5A౱F&M ˗۷'KM%~\ՋHH XWDG|w7!...?z [Cٓ8p{};d gb# ͛#oJY5p!ˁ8LL??|;,0qI[o?p voܙ:r .>sj;7m"r)׬!RſZ#<='Y>|{*Ļǎ1V[~Ng^ J *ˇW~ ?ٱ#u0BT~OID/E25ؑI$ߙ./y4)Wj_1?E)ht9WCV/ @BჂ*?sY c݌WqOO!4HW?i05'x!.ٶ͌[(8=Wr(?cK5\; I?rGYq.W"/x"pٲ ?? .%+wR{PmژԡCbKe?ReKo'?q ;:EJ/7_jOQ~{֭߶mwΝOOzt_ԲẢ ϩPiUj _;9'hf=_qĉ 'D_6&7F?tNco?"XwYWhnmg$cbh{#)c'@Vؑҙ} uP 5c/09+W2ɗ( ֭[f͚ժUs6`"0;a$ߌg l͏)/9tp `?78\_Ze39fn/W0x8hsm[M13Yߔg<?]7hm\kWg;3&MPQ# >LE^'/7_Z?>6ѣ|÷P*덻wЍTVfmCtrZE>-~'L _'I.@,)/UKz[zΟV$w 2ԏNW;gS^{[g# ?KfOI?緄|jp##cY3 CE5QQ]s~l\L[7:bE}fK)}dg3Uf~߳Us Px}5vGbNE nP0O8pMad i&oVVV֭2;;ּۥڧNSx>&&槟~SykM5{Rz}AAAp+݊_Ϗcmh|/GtteR_ e_[]gOƿ"ȑAAaӈCBi>>y!!qqz-4V۶eˈSQƿW\"6-9W3!! cGؼ66`nӼ$I>!C/Zcc`o˓~;`h F&`=#hP*z]HjAhb5$V55 nE>(2!Pj.u:栧:p8P'w ] "d6t4VXS2Ƒ#JO _>2?~~Ֆ-U,8_"@< ii@%-ʕ#[ ;3h!67OnWmp srr+~¯W0"Yſ_k8K.]J^T( ~<l!m,[S s:ۏ25j9Ս,}:Do`Q\Pd/SЅ<3|S?\{NtIgLSh ;A4 4t)y% ,4~<Q柋ǎ~~[=b9_ :w9]EkOG~~fQV+q-29n9?33S.-5L;LRJt{ِ+E1 ~ُ_2ϒ?N _>cѾ6'bӆG?<'% DFF#mk H:9~sfW ##ULG5qq*U5 (n*1?:2pJ5bd?p?(7)͊kxuΩ4'H~HzV-꯿La; w͚?He/#o sb_u{B>'N_}7TfLpa QY3wR.E>sy\_:KMM>|8t۷o]7nu_?~Cݻw/Ў;j@^>РAG#poůsN8'NtbJ #Q]o#e?*̿CC#Ѧ͡m?_]Howo T  ʕ#۴a🗇ώ_ 0˗#`TS&ǖXwCCO#F;f f_p nQÆ??p/\ެ.Dya1a#kԠa$G%] }36EE\I?:"d gDt4ڵ,Gիm08J 3 #UC:Kž}߽YL Zb_oE h?=,h?"OIIp"|; Po޼9J*sn~RJK.eʕ+WZgt@:MkfGy> 88nزzHض6m[~@5k8]#<[_VZSoGv+܀\q;CCRe[O#odZ^׭#Ak4,m`_,#T8@?1  ?kXnB?~E*$,][5ʕ˅ lwhGGA?&&[⸢w1h2]o z|7 }:JXh?~^_oZ3"?o8/2',Kqw|TsWx&_;܅A'zPPC^ُ.ٴϯK?޼o@lv?پ|CvsPĿ;Ds~WjՁӧs]7n=z j ZĿ?ߟHH ?@?>^<cN5T~*}|=իwD_z`C~sfߡիh~4)DE!׮D}0a6h|9ė_5B3_-|%3CBPM{;d$ew= _;U?9ާϱsnj!"#ћOCO5O?愣!=дC~# ƾ{ۓ'9D*DX1x09gqv76.aۘ}J&yi+"+J*"OKK S {]( 2/{\}jzhݓtBiP5IsW?ZOr:jժ?*ݻeV&Akt?]1?>+VpfW0 {,Z5"6ɌX<'8d.} !=?* -rժD} C;w]~W6DӢ-]*|k}0 B쇾wFwc''39W_>kW ٳ|QlOs3Gs X[7ӠADb"7 >?~DDh(1h2Q##;я 6hWdqُWJrl,Q 8Mxfڟ ,1g//]v:?VXm U l\5T{I@q׮˗ `Z Ϗ(Sl)@mr}>,G`ߛ211烂4ǟ|œϫ5?5gd0Bp ?2eլ}C۷j$0Q˜~@2^Rma\jWt?O#)M@3[҅ &:6G$""Лg~@lˡ7wF **e 3ЗWS)gp{1 l5ïĚg4iīOLL?(KShϩri^Wf PCmK~-J e? ɟpDjͿӇ* +V:tׯUT[?MԐwhtuk}|||׿sj4W""5]M !V{f;U/}|i4toPNx=.MZ>݀Upb"~=*qhiǎʔ\o:cpd`7O X "lCӦw;w/ݶmVn;z}ZkպWyӫU;ֹ}_+5kjbbլy2e+7S'

`Թ4]٭AA*UrF[܇enj˖)p [Rڍ0ؘtxǍҪ]xg}>h]Wp~{ۧvz _ˉq_ bk7p_GFFUOq: VSS' gOB>$x%%$x /y[tO/XOM=Še_d_OmGbu?Qe#qh' 7üCC,#^%!o-0 xa">b!tXgVi6W CpJѯ)MF*tSFDBjuЛJy[+CtHmӗ 6n B["Xd×s"zĦw$`ڟ4Cx;W(i旚?*gU~>}}@/4} Xpqq֑Q`kR*^ Faa)))B\jٲ?UfMCX#M9ީ|y;i~EJ`dqJ$ⴿ ~O{TͿ8w|xx_zS!ؾ]aP-lSD_/w¯<_Rh?TXlٲ7n`R$`?;g /_3:W]+џEjT{.%~u޼}qʔi/^2]e~^d_d.8픀&e]۷qJc?.-GKKr2\2GKZ1|,v9"!8xc~>ccKNj}ύLpϓ??!=Tvԩ5k:]Fb')9]$ /]ѽ{nz5{vϪ=P+\7Ep_ysn/fh?~<0IGJ' *L{W?SC4^$^V+^5G7z|&=ge_ſ?Ht~pi"x_zop˯7yz¿{0 \ (\)K)]xcُ{2JEs۝}Og+N(6r8y5e?N%}otnjO%,3-7l P2 VAٌ\7R/I̿_f~%32[@53 X]Ŷ |?Lpk_~D_<ߠA^_G)+bHe?XփKZӹjwt d_\2()& +KJ#"}TCͫwo~/̇~8߸qce?x'ii/ںu٨Q|}}a,X ߤh qo{. (j95m桾a~~}voݹ]PȠ>]>{^svA}u}QC#Ct^???lpj ϾwƑsPnatn)n3:TvI~%Ǝ#F|sEQO. S >݁7t()wqN:,˗/_lY~g_g ///ߣG*;;Off MV8Um/!,3b]#YqK5dGp]Ef&Ĥ1czwKϙ:uܧ#_f=}dLϙ+?}<3sze~ޜƍevS'N5u*?gqG2s\Z_,~>/n 00LJ!%4ضD2T^n=n| Clٲןqjy+Ap..y;Wu}3,:~[/Wh[ .O~%?y+7lx)5\ڶe F2ܹvm˖]:|\ֶUKʐ߼qKBŽ7. biM_uǛ7|;pwl[>hۊW ޱrUCuP_ڿ zڴi\fJ]`*[6.Bazj>4֯ɟtgkq_/@y -/90e?ljժ?.yb/ghѢ+Žk,ԇ X4}2++o>;;o_:O ѠlABtE~^^\xL~|X |4WɉFF>z! yd~.{EK"3WV,jpOo޼BJ11q-aX Ŀ':u:޽+bc,[mK[\Cu"@ǿ'e?ËGdg>x3O/3x_+ ?,G*lٲ͚5faVtz7|駼 =1cر: M޼;w#F|L،ѣG;i᚟ %%CfGL{{AO+sqzߔq0C@C ?16 yH/g@zë,LË/uvIC~bʹ15U+qjKıT _t R߱~޸_~Bg3 o޼q[o z׮]ѦMɓ'7oڵ۵kqCtĉ?Mt:݆ nݺ^zWɓr)W_2j/t 8"]?( X=`xSjL+qyyZ-4|5>Xd~N _ bwm?[sJTX/)+P/O gzH*1*BſCK j׮ g~ptttdd7i.?ũA{Yfu)!ϟþdeefggN>`T\5M1-.j/]/PsV_ԇH߹.PʪGy~ewZF(\V } ?5[3,ƿPzCe? @{޼yzmpOH8O8_Jٿs~?/񟐐k#""0?,x/P=;?E_+.P,SSSz3g@ĉJp֭[{{{Cep+TmW>yMOQfMMR+5os P?ڻe(Rl{-4i|?j6cxNǬ|Wk|>l!1_^ ЯRqG}r=|c!`~Z_ 2/~H|KBUR o 3o_''kr>'?;Ӝ_~ZpJq7-GBY;/)&Nv:j_0 4"DWY*=hoT?+TߜbW_|_L][^MtmMn>׶m[^8zhzp"88UVX~}5 ='_y\?Q < Fa]'"u2: Pua1/]}~Yb2'ݛ/ij/@ ,\fZX$4sx{[+W~ 󧦞u_}e?t^٫UV3픦pR z3e< bW^|/s=?Cbn]gf /_,|ٺGv WgAi󵏂0z. hO_b4<-N;N>(agv55UgO[r'NbUFFd2߈{~dkwb៭q).%w}_dwP*R= lƖ>I;0&/$FY_L^{H1bJ/ű#PzTvN%ӯYf^51#F|11x5Ϯyn:| Y?K.C)M/as)Y&O +ǎʅ w[UVjU@Çaײe˜ǘ MF%>e].4%4֭?.']xSV}O(ϐ |(^@,YH<}ͨ7N_=w]Kk|_ȝKKQj8\}I5?`Nׯ_;[npc,󡡡 6V~z/4?eTh 4pSrO_-?;Z6n܄ xf;{l4h4@Av5~ťǏ%<^~J#C_`۶m;wj]7 e?7pYϑ?͝;.ƿKqq/冄Nqۧ>?H:?7LݴƯnZo>ǿ}w~?pʡ̹8v]/6iWjxZ/IwJzƍ4h̜9 vLL =vg>RpٺukhmW\i?^}6Tsߺgޣx[n#J|Wlo-n* ~3g@=poŊV8eF˖-G ) 6̣2oX# ߠAxԬYB ,S . /wғ7.?}M8v7EuֱumK!ҍ"{b'E,REN-%\O?޹]P~nЋ}۫W?h}}aYN:;w'X?|{ džԨ^ٲݣG^`!x`ǎM8U \]t)ϝ;GDDUI޽{l/͛7ÑaBw߭I/UVQF _/lG_7zaW\(SߢG >ev>#"nQ}T (.E/o]꣏:'6ƍձc&$Ν;14 "#5!!]OfCI&\Ú3g7#FP4՟~ ڍ5}bm9rȅxt_.+QP?P7obC\kn?n2"M}OT_ ???''';;?GܼyܭGY/=ЯA~0 wg0^o^8ih"~p]5Oj~s?D? Ɂo"t{&%iL>bQ ƍϼ+dϿ b =s̭[oO@ҥ=ڵkOjdaƏOO4,Zd jkk_Nd^Zf ܹs^{^~ͬM6>}С;vx;26oެo0g0Xj?}_jjr? OWTT忨kaGzz\wnst}doh@|^qwOb- ?͕tؑC\^uq{8T~??u!GȰ={Θ1c5"{\Bi ?'KTy̘O _H7yOO&޾nzC /H^^ OiٲeBF(tcر+W$Ҥ<]toŋ~嗺$@?:_j_Z,xD?'dI~8:?QzrbIwy[xooY:43M?`'SA֢7D*C}87;;*).yy][/菰iÊR=gΜ!2KpBN5^SR _zWy lQOVˉҶ]'ro2bk匫 qPQr/p)Òٺ̐?O1)+}{ww6=쁹 qj_oZ~q~e:Cݲ>+~x'U}GbďNnv=η.7{~Ӫ+nhMTEoM4:?0@_O `IG5"./;;m|慧zJNsrrFT}JnY8?:zmt,@9ji3⑂ f*T%7koAo8y:(G[^ nLuǦ'g Ab0`?*T~#?Sc3(\_rqu瞝ӶYf ^k2w,j=~3yd{5y/:Z[ -qEy8H, Ch5=۽; xz!.M?nD H10oj?E#h?!fw1LHON忤e* AGW.i7==GWk1PGtӢtd'5Y_t.@pqGFM'TJo<ߝ`XARiL߈!@tm?fȿGV'mWQ]D_;w./ (m?nKk?kvz~>]v6žmX,3Ē $3v.WʌvwU9_>h^ᏸz?% jW9{|V`H`=``XGij/z߈rOM~ 2S~+ &AW{zI̡qGu v20Xw.|Av +"f\R?h贁xB8+Ez<7Ol@GkFvZ31Ț?I%+ʿ{DٳgO0!331A_s]/h5?3o _vy7[\95U6aT?썌=ҋ;Kq;GM%l[ԇoO2e ^^-gdd2d4qw;Zyl7<݄G;Ke~7 o6Dx, xv6;گ>O6  hk_\m$;Qg3}D,:i~nr:s?s4S>㧳)g׍YaΜ9?yd៖uNۗ?M[4}lbMp`MOݶ;-'$n%ksuߑěy /#~>@}H븈cg@`9#T{?܄.>*]NONJl>;nǗiӦӞ' %k>TN\%fVB7$IaT4oCu]Q`^HǛQ3XVZ޺Ŷ,?/RDXg_ h id%`NM,w[+hP?UJ {m+UQUKSj uLOKRVVL81333++6\/.Uxpn -U!B*W ˓r3LBɴ$777IFF#a/CcCٯhh&5_ujǡגPc忤VI&q iii?X7G@p@92__0LXLNh-3XNJW{4ub>,^}QFӌ[Hr\ 3씁Mq[`PwY%$0A7?߯ Ǟ_Ds9ƾA>%%%x&IW7JŗoKN P2,'|7`3E.96> stream xi[eᙶӖNK*Mv(fQ  (*E,*Ȣ,(n EPQ'SABAonMxy9ez~L;v5|Yw׭ƛmնvu):u1ǟtg;]u 7}x׿O!'0n{M9ӎ-gf^/K1yRάC{?+l`s̝;w޼{,XpѢŋ,Yt鲠 |ԋ2O7rCTC?_ _&hW2C?KAA/?[IY2:6mX/??X~5'g:2g [-:_N)%{?:~@?V yV?'?os_(/g:!`z#h/_O?_&ϕ?_Ю?G/A? @染?_ ?_ ? @? @?_ ?_ ?_ @? @? @?_ ?_ ? @? @?_ ?_ ?? @? @? @ ?_ ?_ ? @hBU[>KK1~Cg +g=賿o$?!{οL ? @@6:3Ch3 ?_ @? @? @?_ ?_ ? @? @?_ ?_ ?? @? @? @ ?_ ?_ ? @? @?_ ?_ ? @? @?_ ?_ ?_ @? @? @?_ ?_ ? @? @?_ ?_ ?? @? @? @ ?_ ?_ ? @? @?_ ?_ ?? @? @? @ ?_ ?_ @? @? @?_ ?_ ? @? @?_ ?_/)Ȣr//A6 _HZ܋e_N<*~7W?_ O~7V䟖@z~?y'ٰlk?dҲ0qy\KB5󟗘?dg'@(K?W*7՛0Me__?ֿAѫ ߟkr*P;狂G4:+ ˆ?_@7oܢQ'}/mN(k'ڿ!lQP{\~ TOKrI'r//vo>$'ke]W>G0Ҟy"oI,dCy·/?Go /|to=<'|rT|a?t 4_=O5/KZ&?{n?hu.` GM#<22|V?z#Y_2#rч_z*hz|8c ~h L? #G;/-@d5@+O?Jʿ|&h{\?uXj i&o뮻o\?T,% lw~vۭs5p Z ju-׿~=?7_q.Z| nZoWWU`Xn믿kvD$? V>/}_sZP=@5_*pW\qG\_a PC?y_~e]z饗\#'2 %9s3>ً/xDxϥ;-?. /GҎ O]pӧO'?x _;-Eyw>V+ akd>s9:묏8 0[PygqƇ>ëO?: P@5<~iz_< @6 t)|'wxxj8 !8O8{? 2vZq{w=,2ciVZpGuԴiw_,_#:8J\;X2eʾ D qkxg{shibldh {naaG @֝ୁ]vewک;/H`htvqvaɓ&uwG&M~nm}KU5/[l[oUw_zU@ l՛[n[tzLdwM7|6|Ldt7tM6d6h 7L?Z4@l'o s&NL?'.@Z@vg&nzC LWMU#X5Vn &LX'o@WW _U*C{@}+]]wf "+쿯@g@{ _\n|7ݯ>.`F2nܸ+%-?t\c^nh-1]0* K7,n8*FDU6< #h#2?Jѝjjz(+ -g _?m5 .I^ endstream endobj 791 0 obj << /Length 2350 /Filter /FlateDecode >> stream xڝˎ_aII^9.f'ۛ 63zxEizǧ^>T,.Nu\Yqxz9١L8Q=#,N4͓b'Uf;!c]D>j*9,.ʊ92vZ7aoRD31$Ȏ 1"; OYp;0#>ןacs'E^jI`^]3{1UYVvf `mI\4Œd}8)ą. WVNtmgj`-TiycDtg{)c'{ >فhD6: =Bd1,= $5U=2_/v Z)^FE*IDhN/kq  1)PNBz+.E 9 q$\ ‘i54*TD2dT҆8STf*˴lV^ m=#[3pe{,!da?rZo!tXH 3MH2סE|AF L(` cC LCzH<,R8"hv} Aנw@ d3渋FBݸuAb3dļIFu>7َґG%惽g*jLu$OYb]2[8ˢ7m "&xf*g8Jz$ydN|MvI6Foy~'mA[^ V Ue呿f&\2]aty ؈oHd%Dy_!7Y.c| .̻?[bZtoQI ɅG]<7]elơ06cVx!4 :6vA,$hC= \JF/xayݕ 6mڵc^g'wKκɥ{Z:"Mte0К!I~][ęwOUŷOA{ronvMn偞$BbA$|wƵ!c)|A$4G)9vBBrC qnX碞5zj M-jk~_py( Y- ٍMy?>Ʋi:%(mݩ= i“XMlt]f:6i}5*t>6UvDCdz$[()0aooɔdM{,qCڌ NZwK(@sfg5+~?ѠrA 5@mȈN hzH8ACȏ4NR1Uմ7 9#FG!(`%8!UybϖL_5 w&1AM&;` {yֻdwfm9Jkb,d0 !UD|IwQ$:.7#^)݌CHN|vi%Qпy%t{uΖ` 0^Aņ)Ew6k0CDopC3o7Z^i(S2 iyѫ&pns6ˠ&ByZ @ Zdǧo9c0%LtVE_!uϓ'DͰXI.V l&dj1L]9J*ǹsurKޕWErʨ_j6< ָ|kZ[q0`<gL#ӧ, }(j$MD }:k{;_1d+4i|c{<U ܁r z|a+%!XWq]ú\ab^)Krދ&rUnB hGܕl˫r;O>p8 X26Nn:y=#U6dS}{V*!aj3I$VɮNnڰ&Ť#F)<\<+֍'Bl0[ϜDg'^/'{xєWR 1_-kT sT 1AҐ> stream xwT EA *{ X; 6!+"6Dc#V@5bkbAŀ"(}NٝKΙ;{ʕTo*P էm>}5XP [9YXM}j>2` `UԗL}u6iY2P H3| YLwي޲K8HϞS'-?SuFʳg:HyB{Of?[/.?+cSIJpzϞL!k畭WIex@&?ÓY|@g\HN)*5Mugk[M#5$E'}U9#Y+'ݖjDZմ(P$o@1Ŀ@5?  b(ao? eװ6O }y5T+9m;T< Oy } 'i{()2OH>JթUmUvO@#w IC]>+'DOJ-3g l\) Ɖ5]lvvsOv y'-ˤU. jbO]Y\'n jS֒Fg2Z&m!v"T մ񟻭%b:)wu;s XL* ;{O?G}{ݦM-r:#?>;蠃J>V[H+&Oo߾oƍKmx^xa gϞx)SJٶnghd5nD=orUAL*UW]u̙Y>jѢEpj׮{_tE4h%\ҡCuƗi֬oYѽ{/dW\?W_=~C38Yٳ4lw_~7gΜbA^\pGY]ϯ<fͲ!,7lƌ!ǏoҤI֭[ϝ;ǔ/7|sCN4iŊ%8`g_|Y<~`s ƍʣ}UVY%zI'cP8[y y{GS_]0a³>{6wYtizoa֬Ycƌ2dw=|ď?k 8jԨ ܹs[=z'|O3fxy䑿a͌;vѢE bŊ?pĈa9eˊÆ oߢE_rK/oٲepŭZ^}N暒? ܦMRvZ}7o^>pۮVZjܸI':ni ;#Jdܸq|ps'N=$0U۵kW 5ڵ맟~Zѓ^q%OfLi<wq%'~_EaʮV[裏NJu]Ÿ,Yo,u3ܠiӦϟ_$;=z{^y啕}xhxui)S6wC9$^$ioFmZ1 4{ k,>k&_4s*WF]M7Ts9)^^5nL?ӦM s//|e?Z8wN u]swVrAp' ?}ew/"^q+;w}ᣏ>J}9CmҤb?'>詧zԯ_- mҴ/wygQ 6 3t%Xa뭷>v %wąw4(]wUk;R/UV{Wf#ݻwh ѣGoYU6m5kVj:H?O?y͛7Oo!@~{~װ;L0!  6QFђ{GEi'?رcw<Ϻ_yzDɯ0BM48K>s}իwG⋳g.:wW޲~jÊq-Dq (ǣ;HlI~ytW ^{b Eg}v4 CbN<_SN[q}ݵZ+Z,MM-2Z/ÇG?`[y~$v}W/߸q_}h6mڔ]`Ȑ!#؃N:)ZxĈnݺI?uQשSa?N0T.,ih3f4hРd5\?OgxY˲:v ~饗7 7?n'qB_߾իt6?DG u-qr)Y\̫Y-\0Pa6_8qj*U?hJ?[4x96$ڵk'37|sjvJEWlݺu㏳bh ΉE_ve3/P+VyҤI W^GӧO~X?{%sWA馛Ave'mر]RfȑK ںu=dɒ% |%0a„aÆ]s5)rb1tfot?>ZJ J<wܑJ#v4x޽$~N:%w=hSN_UFvMAt`ƌTd…xSE??n/љg+ _љGy$Zܓ?@FϞ=<f[0xw=hK,S*'!~R_ o'.oѢEtq*s=+۷owjFivmmQzlV ^{m?SpUW-%/5 &T%M^cn^z}{?5*0R*= ~C?P#K?UΝ[vh CMehm*~Q^߻wf3iҤ<K:Z<벗lٲW_=^~g]vI0aB^{o=:_Yfщ?CWORtuy%@!ŋ>'\>/ewL|x7m4/bEK/e~O>NK]wݕ_qO:Z>O] ?Y<é?6~7>Hرc?իjv_~9zasOⅻv횴j*rG3gNkժO?ԅPw}7OѩS)BW7}zzǏ4縏>(Q?CKXuU3?<~ V#_;sa7@~F!#Kt 0k֬ d7n\ɰ?q;g ovn¡S|^R?1yh˗MzI^{Eq?'nG'o' Ni{?Ӂx`Ŋ.O'СC+TܤߑN:~a{b!lٲ3_l :tH\Oz+?Ğ={sҤI/Yh ?YBխ[7믿y7lذ7|sܸq!/֭[Ǘ]v^{կ_?GÆ _|~?kd/2wV̙3gϞꫯL]wuO*i/M6kٲe(O>?kw %7P{'̰>WSU>ܵˈ_QFeH~YԥKW]uղϢ_>L*#PVK0kh߾}n_bEX2sӦMK2RcM,YrqǥBVYez*7o^wv/3J ?c{즛nj3o|G?T\v.yr?nΜ9IO}MQxR-[6wx,Y/$m~ ^WcVN8jʓ?Tas)@ڵ'L!Nv=Knvv?PS}ȏj?xG?Z)@ Ǝ!w.VrW`UV:t\;W?PPSK..Cv[9()@ǎ'Md@®v(nݺ={HO}Nv%T)@ШQ^z˖-~ ag LqSv~Xkz1lذcNrq/ |@y(_YCD>(OE_;պUuA@ dIuQqMb _n@fY4ti'~"]g VdXY jFX?gw=de%8?xd?Wzb?Ns=r?דj3_8U[z9ɝ _T_@/P_گvk?GF_T-WPoMfxQ/)Gn\oBPPoUvcdSR_U7B_jmK3L w. |uU%)X]eZ^9j-Zs7k5q?"P맠fY*.F]@vkq[H/5}^3@Ŀ5wGBV %I(?@5 @Ԙ (N? @? ?oKϿ}I7n'f~sAԤNBjXbd W*OoB_CU.A*J&?Yp?[!O?GS[#O!_i}zGd쾤A)rr|?5sz?+ 9V^fi?Eg&hyL?BE_>|ڗ- O> ?ߴ?M.tG:OI |\Ph +gfRzit#g =A{Aޛû\pt7{%@S8S{eCgGdqG?@`\n?t@9_..ȣSﲕ[?{aAl[oL\8c /vmNחd ?@5/?ׯ'뻛*uPS_S%_U{/(N.++*opt@MLJNgiY^-?~UICEpm'itcv?W~Y@ַL.Yva9 ~(B@.󣵭Udy~*fՖvG S+_?wg骪5FVj^?lɰ;b?+Zh!92*3<AAVH_C 2S=4g@(}PoBA ?@"U(@?@M ?P$o1@S\?@u ?P$oE%@UjR[?"+?P$o@Ŀo-@(N@EV7_U&}SY&}MY"@@??@?@[z|'Q`F&Q`‰-s0`!C^}>l*'kC F޽7|sS?պc[ouʔ)/s]v,OPo53fvmg 6{Њ+-[)?蠃Νk@̚5k=0@S._jZdif N?~k#o ` @.-^>{7 >ShѢe˾_}СO=T J^g+Oo';w^bE.eɒ%=P.]V[mBY}?Gydҥ>u%\[֭[ԶWV6mr-K>_Rw_p# 4o޼\@-䨣=\| ޽e?dҥYIH#=ܳhѢ <8|_}WOdwPQ{w[dI۶mnfN[G7ߜϧ;}]Q~sfw<^z:hs6˽$ٳ|P- {am묳N;tqРAzO?=L[6x-Zlp:uԤJ^ /{׻w=ܳd0)~ב#GwyGq;z뭻[m|M7} 7(yҦM 6L81zKGI/^3Ϝvi;FmTf~M4)'hu ^pWG%c6nܸZk<_3bg?3?g۳;O?ѣ+;¨QשS_M!#bK.I+urEڶm;cƌT͛7/w:zHXoqy.(YgѤhƓO?=zk6c|mv@m㩧O?t4xÆ Ӹ… C%A*vhڵv:p~;&H߸%Kgp_#z+~0.aZQѹ [֭M7#LXŸev;sÌ,|(Ǐ"wΝ/l+{B/wя[o~){o[lFguc=k߿K.WӦM+-@%VYeQFZlrH@oܧӧOXVL8]vb~۷oIPݻPmј hɬދ0U){SX]j~WYe=~TwyguMhڼy{"Lr}c϶/s1gyfz#OLZ,[,r0aBtR&Mܤ`Μ9 49sfhۧ7Ȟ{uߧO-[,Io6mu)dލ+<07fIe۬Y78d^y睓^}4^;x^| m?|.akc=ߤI4.r=~='|2ArGo97L:77;bĈUq|$iٓgɓ'[ꩌ6pwm(3fL 5?no&7ߌ'T~_9.,0sWj/W_sGgN:ZrK*~N8a兰K?շM74+BEz.R+~圮]ssJvXGwaJ]'~!G}ފV%On[ǿ;7n|Q W]uUVua*# ۤIRk'5nܸ?^K 3gy믿NCZGk']!ݺuKp}]QVMY7}s9Znvƌ+?SSO-;]}a}w)yxƖR~:};B|'g8CBeRdȐ0ӧυ^#oôK̝;7to;P?̙3{SLyGo . tAz?0L4rr>#F\{!o'x"ҥKǍe]v熹c=VTT,\?򿅄Fj'L|WҪU(f&Bs#)r'~/j?yN6lȏ~~TvҲeYfȵiӦuJ6=cɒ%rgnh?t)w?,uOn-A6mNZ￿cƌQ]L0UVv7O!L7oꫯZ--FZc5?;wyR>}ݷe))@:uN=/ʁʚ4iRnjժTY@[_q+"HA}K/M6JV2(ѤI0СI'"j(z_| 'о}7Nn@SMg@>@c?& @@?_?@?k?@?@?@@?_?@?k?@S% 1d?GY ԩ[wرG_~A׿?k׮{wVToذaΝ|*&Nد_w޹VZW7mo߬rJ:uL~7lK._ĉ;0@SfM4jly'5jd 3ge˖ *|rra̙;e?yxe˖ ={+*Աc~waϻ^t?k֬EU [&lOoK>߿_5\3(bݺuYgΝ;w}3fq_bmqcǎ馛foӦM\{$y'Nlܸ/g?Umlr̙x)S{RׯߧO5\s ׫W/jwyg>|{饗)BSSZk7xGڵkC9D*k׮K.իg?UaS\z饥jw0`/g? /|M7/ӠA#Gzhs15WYeλ曇:zGyKm]tQ^ެYV[m5a?>p kU>جYh:u-@{K ,h>M6moʔ)y{|Eq衇f}znݺSK/ru׍Ϟ=Ǥ`ԩ͛7뮻.oO5\W4|n#FK.mժU4~۶mT8qĆ F<餓|R??ǪbF'+O޶)yxhP^ׯ_z}e /x /os9c9묳n'i3f<×\rI=Pz C}gIlٲ}Ig}&g_ԩSSY3MN(Y3cVT7xg̙g_|="̂S?3mŏ:wuhʞXdɒQ@_|qe^|h{77|Ӿ}u#pW_}⳿{wEvmnj?Cid…{ZjEf>+]v K[y<o+ԯ?;w.w a/DX!aE? wܱ<]"F=D ,hԨoi?*x<}&/Wv/_SN|뭷^|.]gX-~7y%/IdX38#~M#W!Cjժbuue]*JI 6?/ ~W{xGx~j3~V[m{>^rΜ9]vY᝖j+LVYeMm_u|%K#E?i\>JM?jG;}i=,[O~6嬬}'&vmR^I7V?[O65X#c;裏 oC <8Zrw,@wuWv)D ?:u~x^ѰI&Ez_??u&jдiիWd6mreXꠦ>8lWUK75ٲe?4ih#C늴O] Y.;wn?*;B0.#>|xE9W_ lƯ6m=c*?lѓj0{l;S͜9aÆECEw}_(#k'}~y|>än:Zᆱvir*^˞~)*uЮ]Fl޼… .aG l[oy -'X2-[&Zd%\uƌ a{駟. ?tPM4ʣ~TrY:c>Sђ!w2b}Eȑ#+D)K?m]I|A􌫬̙3 ?xo߾ծ}֭?s oV.b֬Ykv,kVҳkZN!!+:pTG7%m&Z[o-o-PV7*׌3ʞ\/R_@5X#?C36v_pWtU'x"~W_}U% <|xIG'xF}JxرܹsK-3`JAA޽I{&.矗|ӕZw_P@N'xb%LV[mxP}:n!ꩧfSNM0lP% L=˜O?wٽ{`^zcǎhŋ瞥$^z?3<7xGF< ޿#G>]tQtPM=]s5I?L[4iRlf=__Yg]8;wj+ #-[<O8[nlE}yg -Z ?B7:裏G$u!$x{C _qO>d1-ZԳgJ]=5+_v\!J ;׿U_o.O?U4HR͚5>|xw)?Oz-_tMWZc_I_a*뭷^#M1cI+1bĒ%K/5jTӵlW_]KL2{-Z(dMMdWoëΝf.;SrY9S1BvE Sv̖/nѣGNBp0ܹ駟f-K>3zjڶm|VzR&LO80TvŒ裏 n7x#Ksf+ӦM8p`X_~C9wa>=ݜ9sOʘ-/!zٳ {%+ C]q]te]šرcx|TVH2~(SN耢/#Gֳgσ:(l{m>sQGp /rUno|˽`K*:lӟ(7S(7S)PMMLPTo ES)U@Q)U@Q)5MM@@uS(7S(7#X9 _N`ιIPgmw F8%aGux*"tpp7x`7?tjJ̓#l=W `#\5X0F6h{ɯ`MxUmk^E;oꌸ^`@?qŽ.k4{i?H]P} afOn[=oNkq*R0P}7XN?Xdt 7_緔׬v~ w'CBF\Ͻl͛om3/``y9,_l,KI?`@7m{?e8Z`#_0:Gy`0t#\}n w@03{yǛ6w? r8u|Ln<7l1h`PW?Ztt?|?hHpo7UIi}Λڊ}~UD{e%:c hN%Q#`ӌJ]#Kj= yPj]^7 ԫjkcL`(0\AaAc}Ym"GsWE^0h`K6øe%.P-U[t okBޖ"Ӂ 0'`[Vt!&m+_[@-?'3~w' j{SwYF\Ӷn,p8;sDp >i|_7:~uBWw`{yL =ӏ6k?3?|ڞv6mCM׶Rm>ZV't=Ş8v50& y:H?oZeR< yVo|`?[BS@JwIzKIZͼʎoIW8puC㿿}=/&FiWĄkĻ /r{s__ŧ|gjmṕ.Bkps OUp#dž.ڬOΥw>ݒ K;~pЙ)2 ;W?S߶ԣ ?P6?l} ?{Zeo%z endstream endobj 794 0 obj << /Type /XObject /Subtype /Image /Width 1024 /Height 737 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 17473 /Filter /FlateDecode >> stream xg`EKC@z .EDEQAED ^DT"E! H@)](Hyg]vrY `evLL2D8|A~L>6 CvQ%Wk%@_cB;j}؀qbvGOO80>0 o.<_}?!|>/fSgsU i7ݫ692WTnO Ɩ(EX 1ed4ay˗<\*-Pvȗ4={&Sjuw9/,?33 ؞*'m}=u|ٳq|nש3w>Y.@˼P_>5ftJ/L֜Xu}z >W㏙G1كpYg6eubنn֨Z [M.4O P(N[fɹ8R)[xBvR\sNmkE/N\O5 2)eTu 1>BTpsz@e;쒃rqquD2^vwi֧I9Aw k]B1/TO /K)y;n#k/NuaI*gU?_9/ĖRuy퀞߫ FDG1?EYZ:K%9v6اݯBc+En"5ޑ C~俺j+uT_y?p1vi-pM瘴JdMCԡ;fT[orR>ϓ&XG͛]3dqvVwl'~_H(v?p㢞2w.}$7tcdqVqҞcQ)}?\ꐦCR#@f\]Nio4 i*b.yy_$4Ӿˬw.HtcmcG[ʥЎ*G!/KUuS}^x!?i}hʵsS;|*jn/'7hР 8]?5'~#j@#<_w4kGMϿ"[?~?ŔHh{o8gR;y[Syt?A.qܶ?Aa2:>}}ľm|»=uzM$ԮZL|9býrd/Gq_M9(È7~uӤ_ط^ݭ]%F{rXi@HuVV)(6? ##qJ]gzs3U8 7/>bՙfQl,Fa {Ow>tW7濣v?r?XmzO6]*h+Փ"FQ5Y2{,7 濲кs;>Ë +NG]weUV_XsM dʛDj)\P}WCmWxr5QWkokS_蒘X2TV I,l2~Z8Lvڙͽͽ۴Gm0u ;y, 3^,{/o>g/q:Ngy/5/59xMzWw= f[NJJ*f|Tsח74.+uZznKl;3r!yNJ7P򩡟$hn| $ye|ri*Н?־A^EiUߓ︿e\iU3'MW+c 5MϜȃ-)N=qW ;%Ĺgcp"=mT`<"e"ixL+=,ĞZ`@].7PT!>`D !s`D#4`$eS}"D`Dㅸ00!R  ^";ѳ3\T!ZKԷ߃mbYlȭvE#nܿ}|ͅ:]c>6mi^B%FgqB[BzRo);6gO*s1\~?z)EB( F e=^t~<;G]0;&^V;bmJtmw<4/!ar4 w8Z";In'}~u`uuMM:|.bh gs-7o'_IB#2Cq?[{Dž8II2X III_.oo3N,8m A/R6x+ y6)eׅHrf ̈́˿IHBЫ"[ `~>Քs(G# qH`Of(HBSGkP=ꮝޏ7Q9S{#必|8 AOݫ&}a4.Rۇ_}+>S?&Sz }m.m o\g@hȪ}JŭN,5T;)\rkm ܤwJ 4{;O/nf'Zo {1Y'#1|`3₇$h_e9_up@B9v{E־5M:+Dro^1_wgo2m Z=,Dwүk:]O9ptR;fO [?lߨHyؤ->"pq%7Y{zvr'?NBHjmw/d*jՃM۾:΁o^5|U?앮8Pٚ&S !z<|z?@ 3}'đT {;?>?WE2ooMM^#/mw5`B]0i9ËO}J bkN("09,`#j#IEH9U0'Kmb: [_.fH0dKQ԰!W9kRVߙ h`DWTjZQ 1(*u%#/Fq<e?,B!uYJ]Lп {u@*L=[Rks{s mj .>HSQȷoh)УIh)Сg@w'l$7@g :Qv9B<[b'u b#ut`fO~#сGnT'ЁN^<J?9PjWsjysnUHsnHsn-IsZn@?@?@?@?@?@?5@ʑ@e@'@@/v@@/~$ρVCՇV(NUVL6B36(AR6E1={P4B_^&{}F-)u`x)Z t5k=Iѓ]z:t4:$dcZ t"͎2X7ΑrOξ}+0*Iw_vW(MˀAT~m-78._Ze%K&fTtv qZ? ? ? ? ? ? ? qqy9\ng&DswA/eic(GHsu;rJBQ~Ɩ3yuH?2G#_>{oa߾f]w/;wU%Nrx \>sL-ׯ~}E ru1:?J~]z>ݤ,/(OE);SXSD향 ?d>7!O5Oa"VXMw$8n'S/h??Gy[Uq*%jy8HQ%?'0e.XױޢKT> '0evgq?͖z:nI]{}<6/G뽷j~^6"W^?%R?͖ﲌ&o[j;>->ǭ3[묰˨N &7[GټQG(S{W4QH?n7&/CգN>iװvw,.{A3ӟnk)9zyJQOqKe[fy.'í.v܇=r#S8Gx>n-Q5qvrHO]} ".W~#gA{,rhc:_Wb丽?b,7 -h%o?(T_%nW~GS$?GfT[Űd!{l9Tb= u#ӝij-4B,%.}qfrSY^H?n\XLqTV^{Z}cOyazoI}γ}Ni%>?$$i#*QNS|FXG1z<ԆC?rxL|R-9vzo.?gܪKB|S mqiŇI:-\LZ~~#%:J \WriQ\/'5]oob{&mQOTˇruㄺAejUZԫAlk&?9!K!B\‹~^qV3B\u5NZC,^"[] o`zM~7o.Hn<t?IlOxl=o6:^._3,Mo/A) Ss:#Q$??A=4#<O*S2\B|@<ǭCrfȐ p?@ "_a'xl~v[J?ojwr$ 1"8Wm I/;N˯X_Pm5yL.0@\cGE~⬇U+3'vJh/vyJj/ 1!Hm G9{N'_u+|H) ]O_?#_&/#r?!ֹG4dq!Y)?eۤ!NVGw-ZHƕE8hǭVv"@r{# wɟe1y/!%ǪߵMY\C2'bӅؓ/xWoy[b_N|T̿Xa;M,|舯x۶+~zvݟygzYR_Ztbq,-nNJ$ 2XGN8b'=俈\Ba/"K#0} o1ZA/_tS;5*;~J¾?2W{8& gebKY<XXDy?FV>z(5lL[ߢYB푷ϓŜ桕5~rVɝ\گ}Oy?2Sn#PXz=̮+/N q-\>j_rGd|uqwiL8m~? :d/̿s0^//Y4_!cW_~MjI/Wt 鎤C! |9̧R?W9Rk_}M8Eܫe/^#/ "f !޼\Y]ӛgoml#9%7723?2E^qH}(f~%okR''kB׾Yd4I! ?|)}~A^'8&pp,w 0vJq3|&)v!'ejsӕ4H?_o)o_>LjwrG7kj^TtTմQ_9c <,W dHuG=!+MhǸ˿>ӣ=@)3=]_.U뎳4oosʘy4Vl*$zO_K[qk,,H_gwY?U7#+Zyj=ٴ;2߫mjs]֜ϗX/S7ԭU_Ft_jƫDYGS?m%YMߦb8vdE\'AYU'T݄:N|0* q탽rQ#?uv_bwou\sH*i-7Aķ&}rGQ_" ȿ1qx* p;o\K@ sS;S% 19aTȿqD9]o մ+@&f>@d#R q?KQjXl⊓ c)d:7'K]Uݨ Ùnjx?7hj1nlA H=S,_#zVc6߈& q"oHKȿ1?]J7"S ߨ@@@?? ? ?T0ߊ4&m[:/ĕ!fߖJ XK-t[" !fS 1]_C>`D#TS:RuUWRT3_MUup,uK80i9 `/PcϿ* #b" 0ŚHk Hgmŕ`U/֠JÈp4u& R'QLuɿؐJ  ` M_J` Ϳ@pT `?ɿxz`_oK=3.9.7flɨ2/3ը@"XGnh=rxS*3K'=-D)GXtBgݏh:Ģ(jз&7 @{@YY//pLNT `}lvB*IP忞8M٩ޕ?f/!aT `dGjeO 1j ]툦B$R/D\{<#ĥT `Ļ.c& q0˅XCŸiF#4jпfCҎtN@ Vv3uHiM4@ w^05B,C;ȳêuQ:d`!_Pbb#S'&Nv'&&?YRN)z\6BN'B\nk^?7 qrwf7:CL]G,+>~rx8YE !ąBmkcϷF4*霦U D|%:!\v~7nUU*% ,HߟGЊN4-:~Wq--A!{x#A,f*7gwRdqe17j۶MahGp˺B˄f*2@sHd%xô}?X6̔DrbXIjs!_c(jg!z7-"2Oo-esȸJbGK ubgXяeyiɒoQ_;tLyw1_ki9̆_Rڡ )g.$V$aqʶw"[v?\>ams%̿Qg ;{-ge[[>62Eϼneds?A!~+9JiK7+=X>x0G~]w SV٫zD.X: d%Gh+D:iz[iVkK[65r Q:jЏDžX5WQlkǼi=뿞=V)K?OBk(D;f/5o{Q9ES_ ]PC@:kKyeiבCK8>=YI-crh%T\-_ 1urPS8H/W6hWLYSGu?&rM,"Х⻅8R5Xnc{X-3DiYC nԝArd&fTC4?>}M9,#Щܿ q\We6eTUj>]FW7UŲnO)A%rt?uXC[ rYgH%9foiuJ,!б'%HwN̘-f;f>>5荚򇎯 }*.(.Σ.ul9!=Sr=b!p]#>^O~ᴻ||-)|o:Og+m۶.- }cAZ_&ն:d!nx_igSd9+\骭z8,**KU$:W"7cʇ.b_P-kY#s &?_ԢQVZJVF/1̋ڨ: ZM1v}%kDוIj,6?mcd Z8N;*?k^f8/jBBK؎~:6xVTؾ()ifIIk''%MvHJJ<4jly6\Ny3sF/t$I {gd8{˯sZԨ}n귭W̏Joפb䍿_Eێ Yg-iH Tȍ#,TBJtGm=oTI:j!'8gX>;Q-)?j@H*zmv^m(C%ϠAM@-$n>pq=qOm~/]2:XSYNnzH޶zK\G#Gf,k[Y>0m|/\n0?Uխ/X'.8;E|ef.ڑ*o%My}{|UIY4[_m۶ym{W|&?a+D:)bD9Ns,_3[ O^)/)a;I/=L= ӷ qnNŔ(͟RR!#-Ϣ.^L)y{gϞ])OQ'j>̞u\h̼b:xxd9ӃJ at3{sfeũes -C2$NMqL{Ku{8jUY%8/Uk5dHd+]D&_>st}/_4NyN]pujpˡт)~wLw//M ˆ=5٦|m@7 Hr[!Z?M /]==?Q)%el/c rr-:+=俚>j/9וj|Y޽y\̱:jq1.e%:;]{Ovcr$dT qrr"&r!~+d*=XupwCs<;uymtSfk&[5[0=fW[U1?ۃ6"ĺW0q, u mܖtq&_$h' xtӿWOSc',]JXL ut?1:$%%Y\Mv0ܹIG唾IIY{%/N8>z/;:h9fФ/KL&hT- 'm??zUiJK #&E|_#`_ 7K=HKʿW,R#os!*0֣X9v0BU'0{usR :ԡ_*FL]fe6lqӧO6m{maUQB {-֡A;0QʬYZΟ;vȰǺ/2t'k !~^oǝ0 68C~"~2+>|8e ѝXNcWxN>AL%bNp溑r=@eΟ?|qvxd=灌 K~ X7,;ī(=}ҹھ}߯q숌t: m3&pvn%IïG#`\+p+2{ endstream endobj 798 0 obj << /Length 1997 /Filter /FlateDecode >> stream xڭXYD~_ahgz<J ı3,31#ΆSW;NƋHqu~:( b"X7W_$tN3f$ҲN_5I~Սy3<(T4 l.tp ~ _WޭnԄ rZKre è`n_kdOߕ:~u+jyEX<9wk|òݜwv'}ܑ9հkʍ֪H>*cеZx^ǣ\vm'IL:V䢱?IOa^Kh7y"|Ԕm?ԥdDnh{|9(ef})jrNX)w*e1KǃSO:*}`IH e+Tյhs8VĮ>$ԊՖY'`PxQw(,l li(Q=31xČBC؈ 6h2 P`rNjþ\ P=k\̲}ts;XPhǺ]g ]@iS"%tǀZȣ]Wo+{ARƳE8i3$*N]cTQ$~ݮ.dp)~ص3F?H LxC- m@)dLE"7 \NJB3F 8 d!2&K{۾k.$􎁲¦&GX;C8b"Hj<Ȇk0V5 kxxcUI"XK a4ў9q&F_rE&[t%`X ;`a4MXL@sZAba5)h77ʱik9MGGQz gKG|=MB$Z+D{IrI ӆ`ZS e8BKP=E/ȑ*8'L(2ebj9~Vr6%Ov6 | =PF 5aȷ;<-@Nb^bwlGԂNV՗r d ~r(L"4̔.\iATFɐ**P4 Q|Ld0/MQ9U"!hɷzp pMOYJv+bA4# 䄚jZie+So\U endstream endobj 713 0 obj << /Type /ObjStm /N 100 /First 850 /Length 1912 /Filter /FlateDecode >> stream xZmO9'D*wU|HÖJ7('!o 7;gy<cJ'% "!q'ABZ6Cr ҅O00t$54i  g"r \EPzx=biEҋhdsDrװ["h"ziO.`ȾarYBc0NdV@ +4FD!kK0Dݓ)b f-2ݝF^Ƴ@wdbr#L GA\X{JA m9y (z୕+ ߀!Gw\>cyyM*PBp쀝Qẙi< "?1f.0싅a6ǬA-]Ag3(p Å5[ʁ0E Ud r`X&Hl/$;" s!9gT|&SlmoA6IQ]okKBf&~94tU;߉6~:wL]0Ab^7 «9-J꾾Gqd:0'.$(s7sF[$?{MP~^ ]{~->@1B37C㏉7P'<5uG|ꞍiΆ6l66 ` 0haޢ|3گ~(X==6M5YcFfؿdnHRI N H)򶧴LL:'4tڞͰ;8 ;ث{+z0<ab'#j$RÍbpkt]vQU}f8~` Y3NQ )ʄ];VVܢ!^08&)I4C 䈙' J2QC}Rd#2I:$mq$4K>qBF&YP,<2%QbԦW(ZeL|UvEHFa1  />%\^f[Kᨰyb#ZcVQ̫J~`h˖Z |? ~\MÆёs53#ςgxx7vn \vywX=X)los=|~pT+QΎg^$6=? zsvI&rpnYwP-QsikGs"W J'd|;{AS5<e#Wӊ]#:H?.`:9`xZɺj^;H*es4'!daXla!E $o&> o0^\\z,aYyWQyz~H% ,*b[tW KG0EK7qĉ$effS%Tsv@ku3rMϒE|Tl5{ԻmWdۨײmT˶f K:֔kԪ|(p1%읶9KY]t ڻm!HIx6"' y`QpގƢr<GUN-JB,g)sCX!?!#: %Xn((ĕR\q?QUz$7k endstream endobj 788 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/camera.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 807 0 R /BBox [0 0 577.599976 382.399994] /Group 800 0 R /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> /s6 808 0 R /s8 809 0 R /s10 810 0 R /s12 811 0 R /s14 812 0 R /s16 813 0 R /s18 814 0 R >>/XObject << /x7 815 0 R /x9 816 0 R /x11 817 0 R /x13 818 0 R /x15 819 0 R /x17 820 0 R /x19 821 0 R >>/Font << /f-0-0 822 0 R>> >> /Length 1883 /Filter /FlateDecode >> stream xXKo7 ϯй"'P`(98A`psH~?Rg[bG>yzv7߲[/Sp͇S} >_w]}=;'^;?M"V1'EܓKHS{t'P@(% XrܚL~ۗK~zR9@b75PβD9`[*IEI "3ڞST/J8"Ac*>F:!c1D+ >[IJ;$wPhLvW: |Ҙj39@k㛺2ܯz!s1?T|&؁mhXG_Ȏ<E#+'$<0QK[N)jbԃD,9LDRWhf|m_S$.1,4՞ZO|JIDlhq҆6(DcHHW`Wp .O.%S˫R n}ZNpQo C[etڲ2 x+CjuxCt%"JWe]NI2^ظ㥬xoz]]yčB4/'=~׍ηq>&yσZ[ef68* %U1VdJ0uL\qLGH A6SiyZ_ %WIBͲ!dqi6J]> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p5 831 0 R >> >> >> stream xm 0 {8q]8h!/o> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p23 832 0 R >> >> >> stream x+TH,)I-SH.V/02V(NSO4PH/2P0P057347S0032-MRҸ,R endstream endobj 817 0 obj << /Type /XObject /Length 70 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p26 833 0 R >> >> >> stream x+TH,)I-SH.V/02S(NSO4PH/2P0P057347S0032-MRҸ, endstream endobj 818 0 obj << /Type /XObject /Length 70 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p29 834 0 R >> >> >> stream x+TH,)I-SH.V/0T(NSO4PH/2P0P057347S0032-MRҸ-f endstream endobj 819 0 obj << /Type /XObject /Length 70 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p32 835 0 R >> >> >> stream x+TH,)I-SH.V/06R(NSO4PH/2P0P057347S0032-MRҸ,S endstream endobj 820 0 obj << /Type /XObject /Length 70 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p35 836 0 R >> >> >> stream x+TH,)I-SH.V/06U(NSO4PH/2P0P057347S0032-MRҸ, endstream endobj 821 0 obj << /Type /XObject /Length 70 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p38 837 0 R >> >> >> stream x+TH,)I-SH.V/0P(NSO4PH/2P0P057347S0032-MRҸ-g endstream endobj 832 0 obj << /Length 848 0 R /PatternType 1 /BBox [ 0 0 578 383] /XStep 1921 /YStep 1921 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x47 849 0 R >> >> >> stream /x47 Do endstream endobj 833 0 obj << /Length 850 0 R /PatternType 1 /BBox [ 0 0 578 383] /XStep 1921 /YStep 1921 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x51 851 0 R >> >> >> stream /x51 Do endstream endobj 834 0 obj << /Length 852 0 R /PatternType 1 /BBox [ 0 0 578 383] /XStep 1921 /YStep 1921 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x55 853 0 R >> >> >> stream /x55 Do endstream endobj 835 0 obj << /Length 854 0 R /PatternType 1 /BBox [ 0 0 578 383] /XStep 1921 /YStep 1921 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x59 855 0 R >> >> >> stream /x59 Do endstream endobj 836 0 obj << /Length 856 0 R /PatternType 1 /BBox [ 0 0 578 383] /XStep 1921 /YStep 1921 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x63 857 0 R >> >> >> stream /x63 Do endstream endobj 837 0 obj << /Length 858 0 R /PatternType 1 /BBox [ 0 0 578 383] /XStep 1921 /YStep 1921 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x67 859 0 R >> >> >> stream /x67 Do endstream endobj 839 0 obj << /Length 861 0 R /Filter /FlateDecode >> stream x]j0O1aѸb2 5|e ~LdL/scw?g2՞S&"'ݫyS|A$ 2<4֌IUQ=㇄7JKW͹Δ%uMMXEW90xe2>ǔG lI''{iTYjLꄭϷΨocYv|rHB PN:E9T"VB:#s[EFCTTA11@%2k WXSl Wbb믈ǸzR7à/'Φ|֪x endstream endobj 840 0 obj << /Length 862 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 577.599976 382.399994] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p42 863 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x+O4PH/H,)I-SH.V/01R(N2P0P057347S0032-MRҸ4 endstream endobj 841 0 obj << /Type /XObject /Length 53 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.923077 /ca 0.923077 >> >> >> >> stream x3T0¢tDb.Sss=SKKKs3c #=c D(U! [ , endstream endobj 842 0 obj << /Type /XObject /Length 53 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.923077 /ca 0.923077 >> >> >> >> stream x3T0¢tDb.Sss=SKKKs3c #=c D(U! [ , endstream endobj 843 0 obj << /Type /XObject /Length 53 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.923077 /ca 0.923077 >> >> >> >> stream x3T0¢tDb.Sss=SKKKs3c #=c D(U! [ , endstream endobj 844 0 obj << /Type /XObject /Length 53 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.923077 /ca 0.923077 >> >> >> >> stream x3T0¢tDb.Sss=SKKKs3c #=c D(U! [ , endstream endobj 845 0 obj << /Type /XObject /Length 53 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.923077 /ca 0.923077 >> >> >> >> stream x3T0¢tDb.Sss=SKKKs3c #=c D(U! [ , endstream endobj 846 0 obj << /Type /XObject /Length 53 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 577.599976 382.399994] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.723982 /ca 0.723982 >> >> >> >> stream x3T0¢tDb.Sss=SKKKs3c #=c D(U! [ , endstream endobj 849 0 obj << /Length 864 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 578 383] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 865 0 R >> stream xmM= @ +,]ﲺC]A*bo(&<G2B طn}Ase0!eX3\GVX#Uj #RlDƥ8Lⓦ`L#URilC?+') endstream endobj 851 0 obj << /Length 866 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 578 383] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 867 0 R >> stream xe A <Ԃ1?wF,V,DA8-|}s0$|3D oy$(h+7pw^oSw:\2> /Resources 869 0 R >> stream xm Q D|Ԃ17lk#k+"nZfJL$3Qp ٧: '][+ .Ä^p$C֔=C5,Υt0/T8g vg( endstream endobj 855 0 obj << /Length 870 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 578 383] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 871 0 R >> stream xe ` <͂1WAp8BEP|}SGM8KniIŷ:$2.-B߻]t WiDŽ^#j2 ͵ Щ,n56 39kV4֞Y^>K( endstream endobj 857 0 obj << /Length 872 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 578 383] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 873 0 R >> stream xe P <řMrE*P;&skȾ׀%a)Pw0w\C:MQ"^uHݠU1BJZeI'476XvbA+,ܬ BOzMX(q endstream endobj 859 0 obj << /Length 874 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 578 383] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 875 0 R >> stream xm A E|ŭc33 XXŠj+1pn)K?ǀI0<)h+7pWloC7:\(a 1Wy$ʦUFX؛Sw$sK|R qM0/Kz wg( endstream endobj 876 0 obj << /Length 878 0 R /Filter /FlateDecode /Length1 13108 >> stream xz |T7o͒I2ɼa2e,d! $ KdI,FjUl .UR& 8 -PkP`駐ܗsns/ ڼsf$ŰtU+Ǜ]`y[󂥫_?@.>ۘ6͙VtF/R/|¥+̽ۀ鍘}ټ9@Fb7k5O2ך75mW˗Ieي0^OF ("K Q2;@GL$#V/NVϗB%LF &xq="\ X Aod$4Ӟ("\T$K,Bbwhv%Xdb80ƏGdXbœ\lŏw&;ٛ\, K.fD|bG[!-.wr_'HqFS:)R((Íe71"!W4G\хH "i4QF'->e75*P_3( [ؒJ̶d4Q(ӗyQBxY%E 3BN,W2|T׏>8X)6RE5* ʫdɓ=dGJJLeFbL S!ѼIOmқnv$.إƀ\dCJr ǏNwl#$DL8lf?T!g`bGS ,4,47̸ ( 5T3ȜFRb0 (r MȊEAĨ'"iMhA{"fѤ7m ݢ[ҞNB-CsT=ЧR]LG{3Fl>QŤ:^N[2&~OoW&ɒlvd3p1zc@3JD9QP| ya18'dúfK{Ն{Ql6]DŠra&!ϖ0zt^[cHf좲[n;nܘ[|閉%/O(k\>qSS! EFm :o0V: rJbJ1G;'3:Bʷ 7oޑ-,ˮ2V+3ggd.e6fe~teHю C$LT ͮ1hLDתTWB^0O ze ZnT]WQhAɮ ͡+RA>mWܳc!9wǟ>pM>=kwkκ7F"?A'.-k^sCByWͧ G@oFcDX&7%Tt' I({I(o&;>+qԤ955  .b5ݵFWsy[*UU>٫0c/otGANʏ9ɇ`(H ^41)"'&'cCwڂ%\nh/ oZ7"TS8?.wf,q~Kg6Jf>E2l7HTm >??E' m@B(쉔#іH abp `1ۃ&JQlĭ"&bxL4b ^&1nÕ7r᠛)L@)D+ ؜lTMt<еg#vul3tf">d'?-CE)T\<4)m@V&ʼ6| zS+fRR,C-˫&g:oJPXr!6I6Ni'$N5,(<ŪH5qɩ B|^*1uެca,&>50c"l4fFiy< l׮8toࣧv}F{'/~5kQg/)rcɷx?~u^o\&Ür9?SpAnI Ȟd T!k42wHJTcA5#Hx'ڈ-Fx[I2RDy 9d+2Ĵ`OW㕬E4@r` 5jʄ ;#rlnNH&bu>—]5)$|]^Hm|:ū~/_ 7+CM=n.y5kj`~L: H]TM zia$%WRW*=Y4Y*,KK]=Il̷p3-۹&IݤhC;DG`HqLXȜ Җ4 +QI̡*Й4\h@B(==.L se4;B$~={@߾΍:oȪ/ۏH*1[GpML=)Vy{9Y'7mr\V|2zbd.x ;(ß =90%0u,/C>?2`.cy /6uww;zb鐮s_޹C S_q ƻ"PT1IOktٽˬ-&K1EHga?:?9͞{8 @#qx'ңpۖaRs&+"*A dbUCꞵx]5~(\J7>ƧkU;kvW6J7ܱѷjg>I ;1=1ht?E⶙SK2IDe1]-VmM{e`raˬa ׏QpdZx{MX,Òىc zoBQ#>LWOTexOQ}}uƃV6`$6v|HꡇkgF\iG|:<3ns,~wrׄtk?(|<}w>|+SL3? ie"CQ zܺI'')SsI9iGR4)'PBch%<9‡.k Ƭle)Ij1[ JIP_xS2%[20mZ7i_xb8Cь~pSTcvԩyĥS Z]0uM ƁEuƎȯLp:Z˴F}Z)2.Y۪I%II-YYɋ%ER=ϓKu+pB_VԛSƿ F/=wy-F$SDF7 ȣy @![%#ed 9 Q1=#bM?SOÕLT6*Gn:x剻o25/c`S7ǟxvC7_{[u䣡웃F&$ 2cij4=(=(o5ΙDyj"˚$8%I@ШT &4Qi1V"mV D4Q<-C_HĦ )4 [ 1Ⱦ#$2y:1#ORb}a_Fx"QMJ,NNH-F B7% N6GmkW]> ڙvDTd d1K}|՛"s]|`d9."UppN+%S YRؒb4RM0D8:6~u}8_Z`pBgokpQ02 ÜnɰsEPh_-m~fz;aa C'{kQdE&l)kE;d%MaAt hQL4-j +@)$N@h%d1+6fID}c[ ( 41BDѦ(drDoSld>QH, {Dž4|C-IH}Zb~st5_mEE=,ZRUG}͚I'ѹKX7jX$)zꫣQq$ qyI6XjT;kXh0:őN(Gvn-~Kx c%^{1d#w8Oc5A sSLHKH_,^ܷຽ_}1#>Tޡ]s_V9s} o,F^V(ofYཉP9{BN*u&U'54OT)[G#`hƳ\a}r7>կz_{~ >ZO>KcW!#, 1zVr.!q8 0Z.<X*Z#0·T ;;^z$z,gX?~cCvE k uO125X LWx78 "7pVqàe0!f ~(h&m#G`FW}'g0[<O C 9a8?9Pޛ4xx4~ a'd 5wPa $t^|c[s zO_7PiP5wG8Ft`rpW}܏Qp#l578ܷc&m|AH3i&]F-ƶ`>,By?'aQYe!ed܂;{bƕj|Hl)"8W}+,e7"2Bd#1yC3ΠKYn!t_ |Ib$|5'7@_s 9R9WZ@)Jh JC='rF%pYkVpwrsQmsKw 8>~~6%?-NRCOq8V qԈy+pCNrJnOt@^v#eP3> sa*#Lz o`2Wq͸05BGX(1)/tLIqQaA~^9#g23C0KM&'%ztmb6YG dWh1ʇ'g,sUAcTâkyZΦ]A/ g 'QR(U;-FnZz-ڧ5:UH@,ТQVZ^XuMlPH=uWtP8hR2`3r9S*+Q2~^`nְaQQF[Vi=c*m ϙUԳ1la"꾫C;xum2^Yl{F-cjյ~cؖ۫p(FEzRc+a\_S4.֢r`\`aFܚ(Lߙه!jR>.%Tx;>ήĈxm6(u0&ΨiW$K،ףBDyΤ.k*bIS+B6| Y7% A5 _[2gTF2=jXѬ,"xSX=_0<{Uͪ(9%9(~mCLmj`^ɝ Gi#\p#i\syc5[RϪ KnVU7ɶz5+uCT1KCMZTYWY3J=?&Jz Ѫj^6ZfCӌ͏&LN7+ԡ xBu~m|nD /)bP3Կ5Ct=>L;gWko hUsbM ڛ+/+N,hzBR2\S_3Ym-VJ♯ҳs]_H7`VF؁0^w%C?<. 3A濂L#VD_!Tٟ&n3, M7g4 HW ;E<8i$#g2,k@aPF1?>}.L `P=G1)X97E#p4a l- :+YpAszMsw>!zHG]oճslMf ~dmT`q8={ۃm +ܞrc1%0X dQJ"+- Hr/ xG:ͶrY?h` rO_n/p=ҴbZ QzǑsA(C Y~J?c{.C3LU\_0O~S{8wNs_pp'vWn]/F¾#E8!"4"4# a+(|m>6GFF"Dj$zѣqrFěCuE7">B_LAۨU9X/w}r=aP0a6=HuٱWv7:~  GX*)LkC4zI̲$ȣH$fXkR, ݾ )/F%g#ŒДHa|%-W8e ʭt5Ji5Ji5Ji5xyܞBm3|mI6=CښH۽mi+%m0iT!m"Et_-xHҶi 4ҦH;Qʙ]!nlGQh1=sd҆ 2'2<+l0?$wYDzm8'xܠCFC؁2=gߢVLsf#܇pO,eCSܭO,ghSX—ݎIQjXmk*Ob_6#6 Rp#-ߥbЫ3HQH1HqJ 烗8;Y;CپZ}}Q$x_}xK^{͜%B1hvYaŶN߽ [++nm\7EZϽ2ﭾAfo$N!ФAm|Al|i !,CP ʲњVYё5hyZj'6W:]Bs-dxNS>T:ճX@E̪Q1+T9&220kBm~5c=xeY-,5?T lB6V!kBd>:^[!z uE kc~Km+#ZLx6#YP1dPŶ8Xٺ<*`ъLi`]%s+ZWTGWG^!XȖ-\f4Vbx>X8 KX!]adeL]$JV@k=MApV&Ч 4^+!9ƒIeq\y z endstream endobj 885 0 obj << /Length 1589 /Filter /FlateDecode >> stream xڍWKs6 Wx$ϬQ^{>2=t굢ǿ/@xLGF%*47E)D'͟QȒv;YH%\']yQ`@"/A"-mGڶe*.HOLkMCġ'Lဪf:?辡g2g2H<źߊȠ-,.SeǶTp$Z$6&]ZV"q? 0eEMx_g'J ve;&^6`kTwX_h5@mg^kM qkW3rI6 bvBWW_WlJ6b#"Nj#"SWiYy Qe~W,Pvp;]P[iV#Y\$p%QJB7p.rг (,!v>Q;7xk Cnl+P%E=a ,N|L!"0ٶ; +ky<&.{b̖eB䖢ϖC֢R2Rh~Z@ɍYl}~$2="?}ep/0w2ވ N 28N+^ۋ4 ,ދ0CR#|mPVxLPO(fixt&FAgFSPPŕRJ ŕ 駖B2Gyҽk5't0@*Iwa8)2{ SLw~O+St;4/wt' 3GW,p%#{,=4<*vG{Xhn#b /G/0ٝn-> stream x|_AEm1\-ƶRjƁX*2v+ao{'@HB{s8/77, y>7zMNiiiy8=-Uo#|ֿ߾'iiin'XXii雂lEէTa#oiif<~+E'MOʕE4M4M4M7W #8hְ- Esщi)Pp}rE{iii\sE`Mlfէ2-xu(iif +?nleUSX vG4M4M4M7cO\ @l-JteGokҧ[3cҧym'ͯCsieʴ Wh['Vcl V+} N)EZi_U)@]7[+Ə, lwfɕ>{v ۸nG\&4M-;#?7ߝuj?Rޤm?mR>[3eQ^UQh%X-SgK]X>M6[OqgDun+VM;'~ͮ:hEOg[,C4MѴJy~QWRr޿ J=p>B0joh(.MJ0a+) %X)Y&?eiֈxTIzοb7m,!~g^]#_ё_{~s=&};B?4Mt 4 '(/">);$_WS3v/z8|I 䠙owi%{*«gL V+}r'&,ob= )#;+Ç^3=iޔ8vszsz=aC4M(!ཉۤ=CWbZJ7xWL:{KWN.?y7NLuO~7`A? P9x>YySg], ##F|c̆ݡinyVH(JteO#YĤ>MZqWmf}Ǣ;Xov^>?K'Nrt3+V>zi}zeqˠi;w J̊Kɉ|$p=S+]|`|BZOPs WorA_s'R6NZP+ÎO(iJrYgK]Hv;1fϪ %<5̬ҭj_GO5/pon̸w?iyc<~YՌ渍υl hv`X\-(M~olR"<>CEPI4MLOt 곎TlF܉I5}mSXUv͇[:K{_o?:vҾg^q{u4M-f9]VV.,(L(==Ώ[eM#>fCn~QaQ{*}1s5Y!-Qk]Qe+r!#pR\/--=øNa\Zqt"SE4r3ТHv{ZBf&഍WoK;jkwsǎwݵU+_Z]'4Mt ҳ2&&PV o ~ECѼ*Vh#5~3C$XqΖ`%2ۧ,wbRrUV]zy 'lZ lݽZp·d;F 4M-ւ.<J'Pԯ L@|;h[gz^)l V+}r'&,iҪ$0),v7N;i;p8likcM.SMߕY@+u1e9o\)[t7ms%LP^^!2'_V31fgD4B=kKl V+}r'&,ob= ))k!OjYMWk {irXsd9dIд MKi3/A4Mc/8(IMJߜug]|lJϔK7 ,///-+I^狹Md2ԜKFyP*igĈt=2b陯wqA2Лc=&D45LՏkOWEeJB5i2 V0s8i]@l޾8;pm4Mޣ|߸o|'__z^4v;x1f`cST7q&n+Hň{˵j_;{s&D42=g5apmP`%}Wu:&} rioxO> i>=\xµ]*[I]ݲ>5k:&} pš+4M4|4Mt}`"ݺus^ּ@ii W_~%++^܀/Z[[ϛ;d\bZ%p逸\xe5e=#>ޢp䰗{NQ>{洸Ph1z޼/_#M4M4MtmPQu6ٔnRqp4h>k2~8a1Qq/_ݻŋoxG>a(L8}cǎi?'4͚}8Ȉ3~:8M4M4M-u@׍Ν; l+]tV(\P߷WG}4!>wrŊ^{Ml_~yoyQ~WWZ~>/ !WEM~iii- ΂8,_7Znm f>k5p6mbEAQq-4lW_(-:w|FFwjP=2j=Zϛ7+ٶm8M4M4M-7;v]Yx pb'xb-ݺuTU;zg_xA{~nС?߻7kyP^' ?|A~iii-;o:t06&z?=LA=f#W/8/]ڹsE ;;vqcEy۷<؀hvP]gQӧM2x0?4M4M4M㪳 ׍˗^|Ŷm<޽Ç-Y]U%_z5_z衇/ZXuܿVVVN:.6'~5woQaݢsvQ>t@n+fĉW_}5jPii: ݨ\4M4M4Mjt3斍uk 4M4M4Mb&aiii&4M4M4Mpiii 4M4M4M-O?B4M4M4M7'WFڶee4M7~^jennn.nK-Z6B9 \g9pt>uf0u 1]FNs'o D/'|ː]whcv0m{g]&(n|5B"4NZ7< ״i<j.eȈ n23ʊ l(,4 .%UkҲrQQba"OIqqiiIP ~+}p粃 E&yɓ?4H@ ?fJ4;m&)ja7ӟepjJ={~^zIђ%-E͛6 Q 1s΂D!8>(/WE%@f"#-L @Z$5C<ա&e{衇Rc_=ҵ第^2[nm(ˋmڴ) )I f2Ӧmۮ[2FEF)"]/&BR-o"EQM ;v%%&s=UgϞvӧNpYB|y;w:u=|ҥKyXU26M7!4F׭]sW֭:u"REAߐ&z&ܳMF7~8BNb7׺u૲,eazݺu[斜g pQQѱW^h_|^OOXN"V2Z1>(_?)՞חk OZ(\۷~VZw}_}߄8Y_~dye>hN:{{1P, :jO<'ȈW^}]\ KߕitܜqE#{iee8;/-II>:*2*"ia`$<}7bĦ}}|QFnݺK@Zl(AmԺ~(D;0shÇt-sȖWw'ħ$'61w}~Flݺu\l3))9(_(Ek I gO:i¹3ccbEnVTd^EEݽ=.6&7'[$eNssݗ/;<_zN:͘1ڵ(P{f&RլZmO=z3d+1w=7Q9wL_ܜU$1Q^?K~KBIEEE!Wݜz M9<(_ncMd@"ZccbT@[gggm߲ǒfz+<4tq1Q@<ـ1yi;m}}GQqd`a¢zZv-p[؟IpP EQ͋n;=xGTGQ@ P`Q*:uT]E)"5zq^-[[^iQ?E$R- sQ}M$Rդ该ôUvPRH(,,,| &)jgy}Uho(YnڴIZ\I_ד͇jXPc҆(_é_]ًN"_y[\O=jp2qxXHDxh_")"5EC7Rr3f[@gge֊Oq#yU[4{>@ QGFȧ1DWf@"ŗGGGWVV# 80;;[\yb600PTHq={~={VJVpB~v?ãV֭[|Iq]T0K˗/ի%>޽ȑ#U}L5r,0qzzQ0`dDbXhr!HYYU[U% Fw3c(_ԕ5@ɓ~ =:((H|{\vqĕcǮYF.]I-[6~xo悪VZ%vڵwUcy}/ ?[M6@Y8qb~~EMq#%[[[1<}L5E3`/]L- D9mV "RոϘĞrmtkIG"RaPHSW?3ψ¾}>3Q3}~[?|3G pxVz_RSSEAܗ( 4iUFR:9)ȡkݥUjJruo F?z۪n˗9-Yhn ,p:u<שs\';NLq3\Lw9廟\2tW].Cw4q8yHv獇N_6? EQ&%_f@_n(`m0::+6EY\?'խ[ݻsH ڵ룏>zҥt&*̝;WP>k~V`ղEBL5]3 :,*2&}3>z #|y ~|.]'|E+/^,$r5<42MXHdxhdDXTDXtdxtTDLtdpL1^8.&!>61!.:*r-UяHQT#?N7ʬn(`MP^jSO=U\\l[ڢE}]Q~뭷D4+v?U9mڴ`V5@Wו[5fg ʳAR-,Oc^^nx077g  EQf!{Pgkkk2lذu_x狲~;UK;vm;~_ɲegg38Vu@2՘0;;K eIв`aa-xr<1 EQܘٲ+J(PhӦMU  &ի*Qŋ#ʂ~3/4h#<";w|z)f[ C4{7lų*9f9u0(InR(h)i`VfbB|,Wf Oe)j"w{`6e˱a")`0???33&REk shӱ9@`VffB|\<e@HV6u9gh}}VB0//:V EnDXHIzU)Sբph<033#>.A}&3R)"JZBk癁p} Qsg)II~>nK.]Lقheؚ྽ޙ3?wf׎ݻw3zSN ^U&bj(STd())iZX9LNH8{e :u:[jŹ3'>k|2.]nMnEȸ2EQ-iSF dQq1Ѣ`׮ٶSPn~'xm۶w̟K3J-YN6Ŕ62GQ@okڵ>wlq?M{1xnݺ.0y`@ EQ-$~=oC5mS7C'C;nL( MӍsgNY*.?#?w&",DET E5&SpycX4sk@*uh^ivPkZ<|~=SEi4Y4lKjOiGh4M76omzn20k ',q K6dlh&<Y%qKM[4*_?4?M;is5miPkZEc_5[=TCM[i)_sy Sѭ Cr^Fl(Ht$ |yO<zr.ع}I`E5J&Pm@O+M}ikU`NtZviZisA&iZԴaiSb׶i1z:͋4 ?DMRi^M[n~RpVd2Ct>G@RuPߪm۶VZPMj~\{6mxo8wlGzQ@\@AL@[@vV?d4}S@MKԴlM]7wU5ݧiK0 G wKq?g6):д,LF 4fbL !4:ܷ3oCت _^")jh.}S Hj ꖦ[&]RTKW.cE㧿k m5XG>y |дHM*A+OC9[ek1Jq- {Mskh &pZB-ӵP@/@Wb3San\g#DhV+EQ49ե`]qPu[P2`۶m*Vsԣ @LL\~= ^C.E^jgص- ?elxma3]u@`@a9Qћ0((zŀ%KQ̀aVJp=/6CKxكen-f􎫄,v0Hs66fE5c_9_= VWh}&݆ھ_3inݺ49~Xx54$رiȕ4HQ-E dE%# 1[Էl{ Uz nc@8/᳁Jmů {CH.xA-5 '< il A."9 ?G0n*OF h@d]`>^ap\&֩.` "k`Jps 66nD …jCӳŅnw=+;9Y[[We:,|iӿG8~<9)q޼!+ƔXKPEQ- 3_z푮]͒ ֭[oDV0XnӦMZj($'i Zȁ, ǺM~ jODʀ]@:~*VقU1 'l N|cfj^I* hL-ݠb r"tgAIy@( Ǹ޸le Gq<ƝԠH 灘cfM+z5W:-V 4Oi(y~-eϞ=6l5O4\f+;uꘔ`+عsg O @j)Z`8x_mmr}7c*dvMHZ@%l;"4'Dm kxEj3Uq<)~*BHPfqGĚOw`dl.i -TiE㸊b̳cy 탻+D'PMΡX Df5tuH`;PT(XWloUe;yQTs@c ^">4XuW-T0`cG{U[SLNO 4HQ-B@Wu(žZM@n!_k?D͇H{2V h e #&NUjJ^F+7W@+AW``\܋rK"oQ00$-xRt~AՉT#/F =TNvL;,ݏ{ODoR~fBpw!xo^99:[@nA]-7ګ (9Q&/_GԩOSׯ_;++ n WL'?uDm2 h/j!#IZx(+’HWr)fe2be~wR! ?#Jy@7dwe!?zue&̶F Qa$Y+7Z.6:&Z@ac}ZM8OCvX6L\ڝCq6l;011ܐ@P[@P)بCz/_"\Mo׮ZukT%)Cg}SO,ʍlJ~}^kEEj3h%p@$+V ěɠuX&EXy&)2YJ u~_ 6Bp4]vʁ]W1jV*TR52?g87_-C-Cj`8O>1Ӱ1'#c9M3 (Llx?PuF܂MC6:R7֊,^qe$GGEFE-O#q (RTS{EsF?kĞ+Wx7M1Kb/E K,'j-*f e72bE ?1V:f0H . "zBgЬl*p]m}J2iVEUP\)ӣp$;nPMA< TYya:ka,(ܬcąXS%9Dn+'xl<QT3ؘcGfNm?~PiCiޚU+ϞL'1 lAs;\ٙa=_Z_W@A JYgj_k?,DR0-k,@1)j\&Q\ Fֶ(lm4cP BÀBa-g0^!h6$Gr# zie2oN ɬ(~i*2VRf!0ӴO5Vk\+qY*i|)MeŁya&RSPc$*17"w(c%[픔Ci\@͓xD T͓Ub{,p/ &ϲߏ|R ^*20ՠih8ٞfz&/ U d$1遣RJFF rn nbE5>4.6`մ$z3 vn2vԈؑ;wl3ۖ&RuUK.D&:ʀ+{wkw9jߦjw#K ' 3`R @Z)z{|у ~!>u&׈EW[4l mӓUk/8͉*& F^(;L+ "^L&?S0S1v;/kPS&)> *>'8 E-@Wh}_|ueٓE@ͅy6|LR$1p u̟:B-=] @X;JF4s5TQ`Scjŀƪes3J)Sܡn.`@ê}y}fJZw y9xgf>:r*3GQ@Q# /C| aV"]Ro(|AR-P+<8#ʀ9bJUrbmȓ.IaEk&z|L`8b31z,`U(^>)g F9!9yEH0`fDL<~f$YO*&W1b$ 퍩+,QN7\ {^]T~"TٖEn p+m zC-YDj/_'~^܀eRY0/˛Gp@՜u8}X ; 'WhOV\ˎҮ }$i[cT bT רb:,V܇dkXXr* J :ī@ uzbF4Vuox`Qs)VJQgkNp..;vD EQ&kVa@!X Bphv_tqQn n )e<^&&k$ߝPm0[+@ra3ZU *pgG"+@/Y-Ҵ`D\9OP4UJS0Cy_Z @+@'WUVZS8] ]w*yRd"qjmg)LD]0 w +Ll S-i:V#Â[G 8znk=qмn'" HQ@6n,Yx2/AӧO?Cq&0%9IT>(,T&|o9I |?~[vv}tDy \u H3[S ٳTW,_ncccl%6.6F-@_w__9~HmHdg>52SLH"ͪPkScB1 !vsCk0+~Ya'u]:_*fb@9>u9q=@[n( u{077W0 Jūu@1dgb|8[n"|Z.jen݌ 8e[㈢ly5 ~9++! -xwk  E/B}Z #ll֞\#^3 Q-WRBWQG3 @F)l0,Xs x$@& h*X>/ca؍xZ!@qpSۏIa!+ YިP1D o..GSu1EUyJzʲCy&f0&f< 7 !xgЉc&톡ⱟ䱉u9qy >@^W(Hj3ŋCCC-Zdj%FGG/]ҥKBB~rBG;u(Ag͚k鳉Viv5u7s΍Ϟ>_RG{ٶm>ܳH\ha6m>x@(ds-5dO>VAcZ"<: A-w4(Idi?8Q?/1P:kRi6:L,tPIx7X)T >0 % :O;PT5oA0#(Ε?c>Q\uT4@y FڙnK^ٲ;GI@fQ~d3blC' ^N-ALpnO1n5Xx[* RػHH-WݗWNa)OxT_zVNċEn*vNOO.&JukT0L#'Mhr5jPؘ/|U}]@Qa>}s 0رINzfkvmx̩ߍݛ&(gϚ[vM LP> Ejm3**gG{Tk]ADcwT?G괅#*d}J*yp:(/]M6[n}/HR`';2%8+oh %vt@ DOpg (*TDC7c ԕpfzbs,UѮ#jb*& MYVLqT;}rLWUC6 g GՌF0,<"hSW>ahG* iTaPyE":!Ye |=_6F:,.DmxDqje*FKlUkn 8rC+¸ϘT`~~~ffFtıýz{?{ZZj%oj@"iex -HvDPĖUH"w~D, bTVl Q̉kP' _(ҌUaLt(;h]Ŗ~e#028T0h2ɼ̤r٘RSӌ-Oed*K.}p*^Ƴ-ŢmJ%;k:0TK|I~Jƈ3U*4o wh Ojjڥhe{&2^Y gLS6$G]mk6 3E1FGEp (E4K쁃 vBkim+O.(@|o2g1A,vh`Tks ,ԙE*Hր4y:bd*K.I cz #Y xE))S8}fbEd^B4|1>uB,F%uA '%(+9x#.܂LzB%-L X䡍[g<Wz}RYUHAwTRV\Vf{mz?2ʏ5M>1'MQ@0/v @j9 P~@XhBrʵN+<zEx  ~`:@4XxY KAu߷] p&ĩf L'E*: )U׊p#K?4z΁(GP eXI3 xz K0dڳWYOI,E2>>n:zd A1jlz3 e'D2,L2ꏂ2.L{`WL>H(l8izny\眃Djb9=HYIjgWc5u#Yh_x1N3zu̧n4\jQ ˠEڵ̀j={h1mwNQ Ϟ=5u҄RU쬤Ą8!>e.KBsrb@ E5cKI㙚5`/e@7[oe@$HJ*}4UhTB ur\:.GJsHErFl 5/N\e[1K0iT 8(\[P͠z^4W.I5Th&T渭sA\c`d hGwDT\ aS9wm+Mĵ` EQRS23/zϝ5cpCFnBykW^ (,,  \O'bj3 rT~wā44,Sa \v(RA<ӗ 2Sg0u)#(HHxSPVWlRlu<`n5W-verJr@ntj&aеM*j m).PyJc*";Р.,R]}p/CQeޛ۽*<ދR\D֡BZ @L39*ZtMQgj˶#mf$:n?O ʮ>tqĎ5HÍ/+a$xS.F [A[ $PI@kF3i)g̙۷追B,]{gwmAxy%. 3ǂ<0Tj/\+?ZÈg"-{@5l#c[ O0m)RB̀s_LXm+e:GﳸUy@^WYw4G4TMWNtpwE8eՋʩG!X`T񡿙XCC J)fUԑ4vgBBߖΕObLXg( 5!-Tpj>kpH攖BD >OԚGب$9nX^un+"_  Z,.Ð9 nQc{q1{吘dXAe#^3fd| Vs9kUVsB=td < ] +La_Akv'-GFҒ'0+e;_DBϨR_S~v훤G4cC׎:g@W\9YЅUqŊ û}ْEuʩGc iavN>-"HozFYWB C5G4hԃ$&ȕ^ma ez|x*`GIX"n(d8)-/q\TRggff7WJI?$ ;ď'upow0LF@ f3c9I:M52hUЖ VZ-JH2n2^|2n=Hb]Vu*LWX1&&!|VoȱQ51^06n4g{FCbtஸ@W:.;녥K[4+zw>t0 3- Z!ȵF@"34|Jz蓣#| sAX)qP5^I9z1gd8j^rԀ3,׻ˈ,@Jy Wjdo(/ U7L!112 \A=<4>bV&Ahja։Hú>W^5挄ˍL0,ˬh1/Gځu4Ks`]-t LeT쯃"}__mRpfYW˾s#JcQ\A3:c_oYW\q@:PW\qwgա?k }z +u+l  vlhFLnpjeZmwTrJ^)QQAkRaH`FJW- vY۪ y #e'5((a-=j6>AS 2BYٵg1"T2=h0fMk06(hQT>n00`ة`;0Ls>.L& :ck 5e!W*RtF+|g\Z8n4UEwW +~֏JC  =2PVL5ΐr+鑋E16r`s0@ZRo.*o!Je%]qA2*lYׂZ=,B:ԮexUf^}-kbXQVR,Kapը4zue1s`o8S~D1w1yV/.Xҋrɏ_j) h$Ag#,Y0֤E|Yj MWqx60RɅ[%HATFͮN0x~=<,Х׏sџ+8t$pOwWgwgiqtu]򞦿OG'SBB2f,AT+ 2j` M9wN 0lAR,"f'b54@(QQi^, UcZDAZ"L 0ť ʘZ\51^9k[~-QUb֖Y&A4Q\Nq8&x="d=NWTJdy7(a']/,}7{ }Z RR)(y!)}Ih4-ukAdEsk˗ @WN:cgzlç1ΞUg7k]qKdB_jC4x0t_tۗS1~ Xּ hU P_P᳎Da -[e$PnQYJA0- ܙCbL嵀X=? C]fW;$§ZIEٚF%-Zˍ/FLغ~ynDpW W5rK>v6`ױA0wIuz]܍7\٠^vHfZ(GdTSC}.;d=S|yswWދ—ϧn:hX>aX]x'M\Cò4WNPQ2َʶ#tL2 Z.22,` Bg!jP6͔4t Uw/AEFW&eYw|Ϥi^fj1Xʕ"pZi<4j]Vb<زPonzinY2Q}< &E`K/X["|EC<_\֨L]QCG5\Lޮo΀Wuι;G5pŕSHcg?na``4O~k׮=~p8`wWysO;í{}< Ɔ,VlM0Za@ u,q{^5l,C8_F@q(O|>F .@f/0@'jU6Z F4ZH8 4K+U_?(zg^ռbԬ_/в!pDf)eʨRTV@C~RZ+}1V&,q\\nV 3 AS!+bA2+Qn|ijO <'bQ; oEGKxCޥx6I Rzߜ=H8W\q͛7~:oX,xosO x:{1ɧwc=trWs7&7& }?, }`}j堌PIDS .ˎY6#lsJoWky;G]P =°g'ܑߪ) P$䅗 Og1BTA]a^ncxf2ӴD dYs4Z, 2 1ۙs{6`ZVO j`x,ʍ56eOcTi|~sD2ǐ"zkY)ٱSM4":= l^35˹"c$L/ =i%5g|GZ^ɩz|׻y+lӟ@cO~o+iެ=zrW[ W7{1X"/R-x~UHemOmdjcL虣V 0תERqe#۬\L%S2|[3reu@E ņ<+fyVU=IJzhOnf(UBnY6fbM#ə^n f7B_VҌTXgkyuDۼOsH1߃4UB_ 6ʷZ`5l~V-y-txO7g }Qp";w5\q$cޛ>#10p5׌;D@畿޳g:JyyW^5x%,Y$h/z\q+woL#?  ln "[JmJ`~mˈGcB:VаsV@n T,E-9i7[^ucƽ Y,1l#[t ʂi/FVЯU\ "<р٦Z^Ns5LK>j h)ń mev m/]4@¹ uk[$And|3ay,2@>b.@Nt1hi9O0El7 WĞ##cBcnjΦ]qkM@M>vm>l&ynvܹssի/7_WRԢE.?fW:t+AvԑBUC_K1o>~)! M(^\y 0bƓ*adeg}f2 a-HTZEA0+ɟǜ"1$G贌'0ӿVs2BfPQd v mLlTk]\ڀe)LE3 '\ElX{giAXãox/ʑsWNB{>_|?GFF??NE]dlْH$ޠIkxP_< h+Od,-9YPF'mfel&`AnKWP@PW;}aJ+YϚe:Hj T#΀MAqŕOH`}@.~_]re6}Iaa4;j'Sww~#n/|#/~ ۷n1ܱm_.^v.ݻ(|jړg{嬳.?Wށ{3׫Љј*]Hl2`XL,jE O(]J*#Jg"|yG}dZ! ~c7vn<3.`Fw*^<,(#yN>x&f'j/_C.O׬UJhzYV VKvu34VVVwrR߆4dnYśnӦi 3PPᐼ(} ]Ԅ&j6jK,:nyqy`nn1u3\FRt79x/ _}}}?O};۷+_?K~DVҗtN>8NW9L&Ї<y77A{Q;GǬzXso۶n…GLI<%[ƽ?w_[oM^W~Ó@o|~|ړO|ScʩG!d؄I E#e#<}<LI+}>,kY<\GAxyͺR=_N-YWu(ݣo1:ʸ@W~+f[8L&{n\џYg忱y~jvtt|K{wڻo8i){w1Ge^c_{8_oGqj`K߭=5ǘ3ñ_W*3OɭlPgI ME$'3Bl dTry+( pHa@(m Lr76ijbtM`ǂFV"6*i'NB Z gX׮ Ik ޸ӂ.i)n $S2|:ly@ l "G-nE26)$*-&bU%h{}W*W[L&L{GLo}|$6}Yӎȴ'?< I _?7uͣ3kj>+X3O#e\[[PSbڙ^-E&i\C/qū4Ǘ6*CA9yx3GaXigFX5Á.z 8SdxSdL(szC8:@=4+xXXr2M1514p\֭L6+MJ99DFC,nd93JۈF9%zy'65YiFi=~=ka',E> .VT9id%R45pXq~z"-E3& t_W\qʻ L:{.^韾wO>/|Y >^sk:7{y+q?]mf[7+.dϮp??93=>)򞥿I1T\~-PA4ZqV>S,\4aZ^z !#8 SQBmmFȃ`(FR3}9/Ȳ'g&h$1YAB20,}`l)h^?&5e!y4-"(Y*ֳPY-\ͱ,yZJ+8Z2 h5k֘LA(QF6"~ht=Ostby+YGSXB/xEQaXзY^w%(*K3( }]quh(\ϻ7&/YnTKq+$8/YxGW.`:-x@g?پ^Mk_n+=~cܴiה5E~IJBzWN!yLг6ko'WRh ߾F}(v';rPsf,Ӳf8-dG o~@Eoڱ:9iWÁНwW'[*AMZ֌YLeF.'lgUb;sE 2@3,'DgXXel95mBhZ*yNis,~lY{ȣZͰѯޏ-X.B3 iz %|@(UoVI5KIF~sBO1͹ꨎR<4atf?ԭ+Еw SH::tŕBZh,{ur6e` *K'C;ڀ!aב?y&tgG6=a8r@Kɢ2żBaA杯Vܲl1|;R?|'*X3БnyY˕ݾOҍϲ&}kQt2d9+W9 k3zܣ ݛ2*9 &lX|7`ehi IIEI'<4SՅ: (ԵYm~zWi=k8ُ1g:^ZW\q;dl8f㼢owpWN[z/LYxZEDInfa)>fWLB]Rʜ2o) e ᣡ\PZ K.1!]O+h936!IМ6pk*d"[(X˜bqT/R.)5CƼˢ4ˌW-8L*,j#=̷ Dϔ(V&4oY+Pze-(QZ6%ʖ0̂䥺Nd/4]\/@PDxCyVyeL2ٙעqѷ;8>)8H+' ɄœV@rӟW^:+'rI3$5K$%!&`߾)gX^Зn Q#y>j(ʝ9ZGD,#5G0 ]QBDUrc q .C@eq%1'jtw*e ̰ A3P;8/*73gH>1w0Z#6eSw2I n֪`? 'i Js⵨&'Sur8Oa>}= 9:-%,g-**iAcxė9/Y@w΀Еw iu8t+'m&6RL[^}PTR2)hmS, V"< XEdꙐV#0ͼOSDLʝ?e9y)v2*:v j;8S:V%@ߧeu M姑:NN "\5HW,-" j 7,$F-QXofR^^ \z{O]{h.z'ǏX/߿koj_W`9s\HYf͛/O~k׮=pYO<:M?o;=\zרdXlx]qMUc`Ml˫. 4#na bBаz@)(!)tCU*mVJzY,M[^RgW6F%4PBUrT 3"RAa֋ज़0aFuT.@A"@^m*6f[hg$A`2hx)w{wbλfNҴSǃ0~޵(be{5$ g0m;֣ЫV>?OB( p:嵰BޱzylVKy WW`qz?oꕷcDr#+$VVV~_?{gݺu555A:L&Ν &]V^?3@yq6*L=jFk\69eç}w{Xn 7aDy." j%Oa66Oyl3U1ٙn\NⷮLǾmwRKPn%\b^zi*: w˅&2z{ v@w˟[T_w+Ri7ڏa~}u~@1IPp b7a]iWX2 B:rP[9}Iӡ@M&eq5.&F'ZdN^TN ZĞY¼v3-T0,/gVv %+%tV5Kzޣ|MR&>,ӬO(otje2Lylbj^󺿘Ag+,W\90X/҇/ }%oct`P8~ex[9̝򅥵5ꊣwސUe{N/7<nj0 ªDٮ$3ŽL*GqD;AO!_P0/K#QЏw3:/}(2nlYSJ^h$keITf=xƹ[fnHa%LLv[aQe7?.Z+l& z\Δo_ŷD !&6@g~nتtJlRTMwk 3%+cWFFO`ŝP֜aJ'3eG˻ڲQtKrK ܟ`R _=ƻ?38IƸ?[r*?D"d2g}5? /BQ\tEt@ꊣw\NߨO(DJP+_Y|U^6t熄 u\fG/!BoY)zT:RH9X3=jd}d2S<1b4hQ iELG`^ՂfdКSQPr+ID|;NsHamaw N< _Ej xPviL>HEEQD JD +>5䴆;@O(ôM+fnDV^`I4"K4HDڌZBKf\O"|P¥b>yWƱ ~Y6qWWn2eJKKu=Ӿg_wGvgϾ{-RSSf.\o|.~6m.YK_,G^+- [,1e)_yFO#{[;CiJQsv k ^,]]T_]Vs3 J7qY'ʺ2K1~V %ҏxAeyl#j*/pS2&qHݘDn Ƀ`@>)5_YRMsuN(xPƥ+j Ns\|\ul߹Le-ܷQs̼8LG6fRlT 6<, b>[Nj>*Ճy\>p\8o<~t^I+2s5|s?~O8|3wt^}⮸CH$OOů}k+]wݧ>rv ͛,W-l&t|kn[|3f=3^ln9RBea!Nt!+Ńٚl) 2zK?FUT&I`a!gSs8:3)A-Ay-z^*UʼڥQFlFRFFޔEMmH\bjs1)TU;^͢u*+Ѣ.J^%K(O9*t"⣙6f.`VO~^V,sG5'.><ĕV/kߞv\E/ fKyF _+Bs)9tWI{7uoӋk@#qvsɛ ͶeB7W F}ڄW][`W$˧`Q,%)0OBey?ە/GKoUy%_Яo+@W\9/S4:qkeJ?g$p)"k*ia#J[T}2-g&sRjG!IPT?5m7Ř;() e;+Œ11΀)!, Q;Y"UFW 0j&X |AE,*`ɱ_JQ&š-^[XVjgHU&Ҟ!F= (=p@:BOaY C6BthRx (}=ә+Wj.Fm.- Xn.EH; E&(W!,)W:t@rRotYT4aZ Pc?oS2De="ٷPgb>Ė]TU&_|.E#; p诔c.I`e^/H rT6? \VI.F 湶6t2r"l&-KI講Ǥ&4FXؤa8k4Vz1Zx0+t:2d;+m kFF^dTZ*yRI!XQ@Bӂ(;dOky7P-\ߣPUͤ-O5o<V~L'=s_߬5+8|+:tŕӍƆBϰ3d<Ğ<&l_qhS˔@>%l&deK|dN^3+=XuR@ 0/D;A@X=[hv[is0[;,_-FcThZsMNyQ2j[@ r sjoH&'!}V#KzV.v* ]B[r\6DLP?ǢtÌwr^9y]CЛ_1ˀ[ҹ7'z_p]q^{8ep+ҷJ/*:#&[b݊ūRr[i ?y-9H9z@Jgs1.[ erWlo@֢ ߖq&\ZֹAt{r`܆9n,_돳6 R<4M*EPPJ|\h=J@y1o)z.gW,EDjT 粒A^-6 _: bk9_,+5M l.s΀8|O=pW(.)L}`sveH1O?ʀ:@: ٥E@ހ hoDÙ!9=L]7J)2% ˦1#aCsGo,?DJ7ȖVVʲјĘlM-LF`A:eESQyte@chht 9seRk +ns2Z*єNDLܒ`.#"7&3]wq2.ۈ ,0EBCbHyhl;q}ni:ڴ(O Bdlf1Z+ TPy doL/w΀ϫ>ep+=- $~[z_͞v ct gNnh-1qd<*sT3uaC K1Ћd48+ //<3k`6|&g*FVFyevM,}Dga[ QQ.i./4b6LfiXjx^̆gac`eMLne e]Cs@\[E@V{U ܍o1ooBYԿU}-zy9\م&)E= bۀ[kvS 6 ~:g@WU]q  5qkfsA2k.|~1a]|TE-h6@^ȳ-DZYEc1w!3(|Av^h1g$tr=̽OO-Z*da=C`b{ sDfzK*C0p;6Xa(+aFDv\*D^,λER@#2 :F2,slbcL< #)fD4_2X@чPI"n)% <=v1C/y)|sneٽs{SLcxC '8\| -;t@W\9]oD#C/;~VEio$ % ^>/;os0HKr '#Lm8 5B(JOE{M+]LienK jM T[q8Iq]*EK[4vf`4Y%B-+ S2ΐZKΤa):ѽ%}1qs1xި'kJWo$woI09.s\qxfW/~ew@"XGuzoep+15cvbX6歶 H %6*c:`hWv)¸n`G"N=:% &P;D#| Y60l+E'8fz^QL 4%0Zv;: W钞ew*kw R Y!dFM2,ːFDJ겧V'~j&lS<((De_/05^$z*)L0kv-aڗXzIxgRJ!]B2z7n߄ۯ+Ub\g ,刯PKsWYq{V%ӹrq.+f7F a͒^rWT6A *?/ۢd#xp Kң? 0v$'cȸ0-^<0lL#193ˣ ͛l"Ϥ_/+l a乖WL\3΂\Ojl6& RET80Q6LC}/ VCD}+gOB2IBmSddz3DFE\ E٬i 6D1-Q}-fni1d1—0&7+I Lj]$qwbnߧV?!c(:"}fܛ] :^um]q;W~~~ɳU˺Wtlj ;sկ{'/ns747tS>S/L6vż`{tFM5mѣqrZ_oN_fEXącd!ILiTďre[xH{2̂9 1i9E4Z e_ ͬI]b8(CFyNѯǝˤ7{7!j+4g&p[+A{&{YГEo8} hgz^Z,h5k#Ţ"Z꼬yBw꺑`k<7B5:'RzXuX/͠tSbqcBO1Z0"1uZō1VB&mLsytngf< e8'Ǹ?8'~Y"Ob`@{Q,H^ffq!TNa Ɉi)=;+?գE-09+1OӦZ_I2 jEu92Vi7$+=z.}WYwÙedp.ˏg[lQ5;f:Nޱ:\F+w%#˄<p#-t<"M)`X>Xfpfbd/(zI< 'Dnibnt _ѓ`/~Mp+өŵt3.+́]yeqIP2RƖ1$뤁ayX2%a(fko6H:„6_f2Ub'\8KX&E9%&ЋJ\Խ'dKT'B K| {;pū3Żo~?8ᙲhnw"ؐ+doS asҏ8(0)* 7MP]P[L%=$GosBٳ~ҚZ}סZ*-u1 ,W_tV EXv+_^k ]I c\  +EQ: te"IM(Dr .wdRr-N)0òLhemўf+ 0XjاO$ 0 {u=Էhs˭Jf\0c].ϷUהt2dseQ5Fn{dzq:}paU{_ܫʣ9cҒyyIox|#f=S{נ@^`Qz 7F!+ O=%.w5+ CFװbbGmI*>eۧh:m%kP<mPnp)e^-L=s܃o#u^ D"ykYG4)E/?|, sȒ2V/ `Dpgn{!J*2I/' iJW-0=؄אNX,''DFxR;i?( ~5w@,bg@;\K~hx0>?ýWԖB$ϰl\ClB/oRD4N>a=y>p+ʌИ")5^Θ6S1's b`5[3<#9';Jf=l0/&5A#BN8Y1 &ߩ6@⼇_׺u*eu"bIߎf@}M D+zDxd"ֵpVr?\EMbP-坉3_ Y~d׈ox ~KZBa[YnO~slwW2"ޕ 2eKl!j4Xyo_7E0j]qxrS8s9M Tϙq@W\=L+^@_npc gDBP/k2-Nʖ0}xZLs3JoP@ȅPQdka ^c0(ǣ4ئu`N4*f倖)yWc׬@^ >pd0\RQ+?A6#@9'Rg  ү+QT0YLs,* |YTLZRlARҊP 8jsPd=H}f#mVQX/cؙf;vk$SՈ726 ОCmzYӨX0ʀr{9o$4@x ]q`gSyQ:GiijpW^ߘ7,Qa ԍ'̖cEP-l}"~Q8*ح 1s̰/ a(`-ܥ24-Y5cN.rfCS[fmP g4(#00NjhQ( )X9y;p{6A/pR6w2ɜ5-+@R.f? 2T1=[fD-*VOQ) !R(3ӽ [ʸFB˴2n|t)sz#VMbjpu(NQJ!MI'4bXC( ϒMF<+eY~bǦDV`$f4FX2 B&22Zf#JWOern"tvN+~Ϭ ,L bhH]jƦejGFr(`k"3<jf2}zXqe%74 E.}IY`ne(*Ʃ>J#yY$ہnW`T'qo|oSp+[;&\qb|#F@G=$j _ R@  Q.eaȱo ϰO+D> RӖq%em/ېr=K_f7sF yH;d-7-YPL+ ClVtʌr?'-*SPcWWC3Z3c(t^*tw|Xޫ9%׈V ΖnXt*{(ZPa -(=p`19Xi;D/NJc?f%Q:sٛBK/귡Y 傅$T mD0]8NUSfj&,fYaVj7& U}&9iROYEh$~F;b9k%99#^ }< <3:#:;:s0tF),?3з-pס˽29H )zj46@D{UbԺo:r^aeYp;!ٻ@W:t+Xy^9a/&LͳIP֩a6(5iqc\G01M'E/f٨wfXEw -`jZuZ&QJSN~^D,r ^]P#i,R/.IӬ"k]NJӕ4X6/2RɅm }wiD<;Rbӡ<+?}(}62h^~=e.J[h6p`2l'p&S pjoC&t/3I2!~ހ6>mHK]&W+au )'Rp,;+8t4l6{:t+VtRY (>3gN[mhXf*X~ "X I1&Rh\톔mv Uh`LUxBYTFV NWw I 6';,iZ4WO򾅕ie k8ϣCLػQ9]<۰-q +R} Dx:l$Ú3$Fk9 8idr>Ѷ4_/ ꎪT0P,TeYq6UTV0 <͝|cWgFx8ZAmJzZK,4{N;oZξZy/Mm?u,Be"]A=Ӫk"f&μ3Scu(k77D* >F'O?wLZ8-jӧOPURU^*UK\wuUkN׸`ſS6!Ȏe *:-h}j.ldclšZ90ɥcg9eSl6 /ş;NL}xW|>?~_@>|iW?qqi1Eį$ӤxuO/hqO#lo6 Y_CŨ%5kٞ`V!fYP ;7h.|9;܎x!1fi$Xc/ä"QNMN+?K}gO s 0VƳ']َ)=uR?JUDHlh}g=E;M<N>|xW@,~@>SP㐞zK]0&d-bSZ V=WRN Q(7DEݛa3.Os;)1u<*qY<@qh&,7͡r.!IN;F.D|<) +mۇ>0t꘯T*s/} _=q.9|ym=ǺUQe   <& (K}+;q(g|I\P+HrfLh7B˨`m=lbGД>;0y96Aj:a|pi-aU:)jaj2/* W,%g?%%k ܗ7+[|?+^|IM{"`X0_NghtƊ+ˊӃ[SʖU.AaJь9MS-)Wum1|Y os-bf5S!=5K[ ['gg{} f*ϿQܶmml/}81koN~ʽ2VoKllUrc\"_ QdRNtpA.W,P8 $tIw{߉ h^ >COYۃOW4ǩsfiVfYEK^l^%P[}u+՝`ص,ApDŞYڱMD4Ry]iG4!M^6 2B.v>2EP L&Sd2Dbʕ,/}81k iT*=ug]>n;cCN)}Hf]Jq۪zXx_ǂ?, gEB})8Hރ` q >)kF+JX$}J\N_/m0N4UL$9VMBy1**EaYQ\>(|Q m4PԎn,8OΥSG\|X+ #-oّ\0gk+!3_QIځr4>=dt/3A2w"YFLרj- p@ܸB DO4xx|!F9^Q!Yɧ]Aλn 0zԇ@ 3L~siܲe1@>|X^<~zY <̴G|+ 3KG>+QsToe=Z YɗMMN4n:5n!%hp&Ẕ\OB4Cq) Tg(JƼ*A7!)j j<j.qI t%3`:|p9|ppN48g48w<8; 15dGX`{[&)K>zٹSWD.!uױ\{|UR7=<aAnlז9:;a_-'Qd8|[ִ5yy)咛o*P WړQ.ŀ><xN&yMc]t&}}ЇČWNOGmͬaW.e˲Zf|VK^1=SD:0s5CNpUFS7qвU_7 n/ŭiuV,[ x@^*]j6,qˉ4ƤŴ˸"q/N!bfS7ʃ`w}XBdc+ v UY.e0-~78j8Wʹ/ЇNU;^/}8qq_Q=hȒJϻHUZY2BYwR~GF1(hMTc++kVdK&uKG{﹊Ÿ>w(Ld+9`о}NyGzEZ @JV^m:901,ȩGJEW߭Aia֐s\`Byf̑g8f U:ƃssHs&l^fQZ2L^o6HnYlZ('cؠ8'v7FCpXTIf+7)&hWp#3-8&J͘=͛)6Dl-iK5]Z.+Æ$ٸ  t*8^/}81:|ޣz̚%&X9[ې|2H?ׇԯ)eQq 3B4ިF>QuDY-sFSƕhާ~G3UgXM*[gyv>?y5 I cpVIhUE?ηʲ.Bi\/}Vf7g%<3 ` >w$.<%N`Q>Cʻx@lI4-+(Dͪ( #q>ÙOhJCJ8:):=HtmrxNGk^Nwr( UԘq/[ҠSz{eI& n2wqoU +\}J&&Ə@>NXgׯHd֣M|ez1W'' ,KQʔxd="ad\ 6; =_Q5ϋO?=`T2xYhV)CS1гnl]༇qIv`n弑#cy^i!?wT OלUc'x3QNʇ y?1vabK}M V]mԩVT2W(>mvQOE?LvBhqk)Nr=Iq>>|xq`2@>|ȸ^?W}Ԉ ndm27Do?L~7QVd2b턶T 3WL%/upZWsЩO]UDF6cjqSp;!B>H{YJL0/x&6կU$.0]Q*faL s:UNse~*ymGT8$ NQbEJkâHSߒ"9,C(P|˴cho% pn x*].ƛXN^V1Oٯ4W:#-8?}E G#U=Ї u0KD\`Nv ߩ:A^; ;T!dY?a>&EoTthڢF<_abK>Xԅke=jSQjʽLHlu|8#NҥTU$0ӥ$v239a:؜@f5~Auv[:u#2RC*Q̫˸>Ⓧ燈2=Mhǣ8741tv~;27uTʇ>N =҃TxvS=]=qºw Al9GkdrW=;*z54tb@OiRQFqtDz|7LX0Xg~>7Ū:2$YiIe%AZ5:}BJ)"훃z՝f}̛).h?=~6dx-Hb038kXZjmøbyC$h8hE]Yʃ~F!>G:WR"hVmpn 59qÄ)5j.氤>6{,E(ju154>MwCb&ٌ㷪m=`_a~p"ZThWe&P8L#$OGS%M{<ЁFGWuA=<zD_1k#P@J0U]49QCՖx?8E|-ͫDh(r,KZ[%N180+A4l1NqZk ֭AZ礤za1MGfhH& f糱91JKyiY]Coqʧ91i) X).>s,N9샆j jt{PJR r*ܛwy-J߀2r eJ(O^rs(6_UG Kr!d`Ҋz$Q(]r[FGt3Hx+w$? ۲u"`dxx˞x|{wZ|}O?Į[z~'u91ĦGXOK}ӱyuAɫEL˰>v8bBJ@V ׭̲ Slw q_%ZeFuج*"DVz9[̹`;gA;{G:4]d頏+`N0Ӻ`n_?/²C؍h9i 25-FaC͢:My1sN\HQnE0D`y=ic끿 'ݬg7uXM73&8u'DŽGv\?>*w"/aVcx<JfzkJn便oV* TN>|xzz:;?̫cz<}8v[P%,M;[b{4Ѯޛ|$B:biW Q5\\Sn(6%Վtu:v Ep "-^%(,/U.A+888N"},gDg[WP* O'MslpngpAID7NeˡEʐ&M*!z-+ImLkA>Er^4;}:}P3\?,-.B@;Ďo!vDv Sd5ڕlMU71 )SeUG%Q*Kz8+66NaXٯqToÇ@A8hdӟ@>NV\:Q][dl%}lT/^ʪȾ@*Y3`2 V:̤0bCм-fH߸Aa"$QqDZ KqTʊ_\t_Zi^L fl߯&KhOY4`s49~5 a-+:U9G.0{ZsJ?84Fv(-1K8yO~]m}7t;Ƴxd9,O,_ a11Ng*z]rE <N?%º'Ukjܽ?LgE.[۫ЇSXf^:|Zug#7 |m8YeNJVAVx$%,"İҭ9ɂ\ ZdYRi+9T(/{7=ϡPW&dcgJbR1Iz.I1`y-љ^;j[ f_aNv kfO}LmNi#LBxU|:+ғ+93PqzP!r;er5ÔרԽ=+)pg\+Z+.LQcHo/Pg }0檢VSBH{.GuݥZK)84fwq&$CźɦidnǙcі=PgBPڏ.y䡦]z CDBތqH~t ,5c,+MMS\.V-.f;`qMu,w\2WVIrS'[a~% ߐ}LuEQSNc(u($++9k`C>^.i#)F8WF9)˖w^g [̦UY9ǮbPGyVF*@a1oI{a 1,evȬ i#wjRMګEq2J8]^@ DzTpÇ@g 3O=Q>N̓O zɊ겊F5zfжT}]ZPˢ|%(cRFط$s1măG-,_go;qM*fyV6Nq6j2}itK wh*M|+Ɏ|`3?ɢ@0+9 &msڟVWM :lE(]P} خVg2ר0uK}J-B-*5G&"]ߐYk5OZ5 a u.e|x FR{{{:<z$ºj.a}nxE!e.[_@NɟUWA [zg:UjrVD~T%Ћ80ko =^}UBRFG2)k5YWR^1UIf:-)IS&[Y aj3> o2L,*4ϡ2"k11{BN=TkƸڍIIaT(}-wFk>3m]\*e K4í< k%u#C2C<IjINt3<[eq5g\Nj[MÇ@g2*_T'7>(E1*.Abkb%jZ_QmUѤЛdw~"~)^Y5 Gc}2#&Eڢ)bYuI_}JD=\ L^f4p Se Z)8G=DJ|o)[ώ}*(͚ᯊ4șvDR8U|&qq]fp]?F#jKKKX֌~ȣXcL.lpAcsB bi%AIifЦXʢ qB9" RҺ5z1C +[ Y'K}sg:PQG%e:TɅL8%lG9]iEE(5\/{$"2iy8eZcICJWTe٪Ki큱ִNc􃀵p7'ͷ/2;ŶpΗ\1ok/ /1'yB pnЇ@}Ÿ.۹ëb$g,7Iu~[ɜi>?R!h|w) k@L{\f4O,ybTI D W+^#2ԫI!}U(W$Y1t,<ܡrpԾ}NT'Х:WC=0?Y>T>e BC} {i2ɼ0!XiR[AZU^W>)HbkS\SVm:85"?̳t dv33#LT˷R!3`tς #. o֣݂}x@>N8v婎zU\,}I~1 %g j&];,Ԓ- R~cNen )\)֕ Uhl|H\ePQqR*4MQjTzTo$e&C97Ϯnߍ16?Ϭ|(\K3G(C4iN4Bַ@5ܩ#xhLvkQ:lY[@ c ̚aDM'<)jxx?&X]adXR:D ~ZZ%x@jj8LwIx~Jb@}X }8uq:摥CcJ#\ +@Sĸ=VV8XAܴ"o"eвX8.iLYWsg8PJ(v, ;VXץ/ 7v[@D;G{1ges .zΒZ]? }fb? (߆[fRWc,T!Zѭ2=dA(ɼD#܅[4?[MK+]d]<0.n߷ZM8cV5D53te2X?2Pwl&(S .r.ǔUjbsPfthBpG!n~Zºhy]Ї@}XPUQBBYYÔ%$^-odM*So?UgK3T5ū"/SJ(KI;7KEyK$Eț`jB+FK;v&,2*"֠ゖs?ymY_ؑ*t<軠vu639W! +; lzNyYΓe9MTuLf^l9h 'ڱQsW'o(/M m5I8消pu]ISn1͠Mf7sҷTc 3y sjh, _җX=QQ>XRAXKgA%W?}$ꉱnVrc"Vd>gS&9㝭BߨdgG Ҡ%;ծW)CLn_E׃ AˌdfTx$sf\-+F>gHip,'L2l~|WsڙfeV v_JL 5QurʧʭoErk6Zִs"83?4;3ԜJ2GhgajucK)vc<*8xn$?[-p^ |x`Xxc>V*xG_?WحakiM^wHKlW_+wH3SED}|UϖHgSXgHQ^{r,'hq+iΘYbVgiRQoʋ+땕W\EfW nkY(: ?r4(N*^W 6*.;[fϒZG9!8ܫ5epDR+$ϒ@̉#pD Ln=ĵ1eW2.sWS6NaN[$Lʳ@ 1ݣ>=P-q<tK9{vs8*>:Ç@N=__>0<zʺ\%WP,ޤLo7A2{v}_d-J Ѧ l) 7R:a"!|ˉrSM, AhN}G*9](sjbA&>"6e\U#7.b:`_j\֢ؒj pRUGi֣mL^|RS7$e#/NGj5MKleJ$׸rR]QI18'_UH4Gm1MKZP36J~T>P{m&%9Ʌi": |gxnN>|xq1E<znbI]ql!us>ERdסUz )S,(רPFe(aC :2<ğSE`YVvOQfek3\Td]nJv| oYoԀ.&)ڛbᣱ%p7z{9WX:\}Nw?B)_cDlƄj5<_==RܮMMu[؇@>>rt:uW<?9~[/}OO皾pmE(A_e5~;ė7Y{L)@BfES$˙}-88Q)w|)1ˀa)2))ke|ڬ-8V8E?[c+e`Si##饯KZǜt%vc0W=<3欱CS l,ŸK~QɟYNqhIQ͊'4 i dE nTweQ6sZu6e vI4ESfbrik'xN&3Y0,_Yt":g,oz6kRH3P}\6S iN>|xq`6M{pŊ<znbf= +7D^+n53iq L1YOkP2 ,I!SE;^pL^ *,+CO)!@cZ1Ar5s>ꢟ RI86ky~aKR:c˃o~v˄Mfiym'uW*qXsiXRi&Zjr".bY-v,hY&-[E0XFgtC9cΑ5CO)@u;0^C-, /?dܾ)N9{ixe]O@3d^g?,|yGꭄ>e@g8sRKꔲ%>-oUS]lL "t0h^!thͳYj +jl)) \P2c{]+;H6,dĬ`p3i)XYcJc\oByfPi2Y-9kr e9F @ߔ)+ż*<4i/zqdoʅm\?W:]j*׸|RI׹FW pCSְVy6%<{I-굚,Y ͂Zӊ\7@)ׇ@ L&=Sp+<z΢q}"k@ī]}Bkq34owPtqH(lZY_'jj0_XX/ìHvl=ЗSKɵa'ж6XJk̋LEL/Vx#Hz* 髇-WsL +29ivIY6aI}5rRa==+Nhh Wr#Lz~_(M9f*y2?rH09[XBns蜙!=ҹԼeBJ_IT~:1VTroPp;l5ͥ੃jSk/`{=4.S7I&fTxa1w#jr1-x;5e8<xHfŖ;9] 'C}4<8336q^=QzWC?ssf,fcC>֗./n+˕g,[TŶG5eQ~X\d&hDOqfh($2·.mP$GS<26SX# zLi8Ÿ_4Joک\ЈTu;8uew@&&5iMWIFxeiƹ4)) le :ZROW7"1TG6-Hq^X˴hT׹m[{o'~lg^Fl|~|tuX&yχ@RЇ0}kA FϴiOzINi1򻛅UAOI2w;ej2/JozVgr[IMC$eD ּ86qzB^v1ejI*dca6Bpr>?$}kZ}0T dvOWD=kFj̱ռUŰEy:҈.<f)aq(* FͰ#RTӪ+AP#TYngr`EfYF.ÕoQ-aKq[%S]zG/s/U=xFһO8݋_{ut}4zyGƕN_SΎ iqley?y|~~1.d3KyjƸEW:Z EIR xXQʊtdtkEio Pp:*!C“gmBnpKc q\VY_ nNtBt6N\GԨO=CF^5䦮pLs냧t.}Rԭ"tU9WC *y8T#7$wcg3Fׂ͈zS\/v-jRLMkJU_ٗRf BO߸b_Xx<zᣎcKm3O<]{`azY[^ve=xҥo{9d58 /1 zeJ+^:/ۏFQimOK{a.xAdP|`)<2*${uMYR:do?RkxjUhhmo!uyȍLnF|Li:":…Fۛ4ةW7~U8c*㪫øI{! pGN:`0Lc2`0w ǁ0Fn]Mky Δ_.v\-wdd8=.@>|qOAf "=-VC)ܛh+Z5EDV*Ȉ%'Fh^EavVRFjRdTʝ|v],5(-:> Ҳ)`TQbY8Y5Je$5m14X>7hW#oyrܣ+hY sfs7=S 3R19TݴdڃB?tmt g#WYFUح ծ i=Q~"pL5ιY(QT ;цeu *؍0/GCImFĔTN#oڳ䑇7<44:2kW7=40u3~)<_AO-sJGzxXƃ}1A 6yʯ-Gy0ƪlI&Lx~1'iQOT~M^~ C,?0,-K|g2+_C'|1"4 EKN|Y5, xLA6YAyV0~V UJ|s J]\oA l>ee?)Cd_"jZ *IΫN7jf(lJU#2pǬ8Iݬ@9IC#lUSY)>bP yoY`^*"Sp;*sR3£]x><8 ۷.{ŋޅk=vl ?>|T˶,-Yºzzg'lT 7-9Nva]Ng)k`>IզE?+BF%F*++k$i]GkJ!TTcV\zF˒A#*?k3ZnNP=3!Cܔӗ^Z?=J `Mtqp/*i1Tʹe`ft/ᢕqr$NjYe$v\|Л=2;L m^gȽȨ4qg[1iCɼJ'ututwWoW`_x=QqqpX2*s7a6xjiAFn8I)\ s X;mXi_Q{bWq~16D MǢ4IJdM:E\*Ҽ"(#FSE |Y2W)B˜l~vLM~i,j4ct+ڷIA4wL$gq }4M:siwj$rdu(KLrޤ\ ?-sPf/i㖾6sz|V: Zj3% e2AMJ,;$_vԺ i+*( Sve(lT'M.Naq|x@>Nm\xwgo=MCs;gPfi #M#%UΓ/⣬ځFU_O, pحQBᘌэvb*=*I ڌTPw[ٲW  ʷ,wKsBV̜9`jk ?=Cph=1%,gpX2?$*|=KsEև٧op!A„^ƟAKNZU60kL^ei&G2%+'w8fu%5}aKDDҒ㙸?C$(}vxЇ@}8ձy]MuLLYuGLıÒJj̒.U<)1KAapxH.rOψѪ?Xm/,<|>Zvf`0`QJZ:Y%$KRM*2F&gLi}ȰkҮSէlNmS+{h9<8,L3kdUoخ"ǡZT9o#M#5E5K1fc4Jr^>S~qn=|ȽXEd9*8N!RSI [AQS~u12u D) Ҡ6}xЇS˝ZSsY3d$-:?j dufrԬUqd+2,飪/(ź[?6zk{|3(E"䴁%lvbw`P)f0xx4 E1Ơ22^ĵF#|2` ?{&%K n-+PIHq`fVۋ5+s:'_cCf>'U|UWʊWgGj55.iAnA3[W땘ܲ=rhap yAH.| \Bs* tm< 1 LQ/gwUD\F_?><WS ˄,R0' v%9܍m7{Ѽ}C+~9&Zՠx%sNWIZhw`t2fm u6Jicm}YߤD&%Pmk>ʩ]A3UVT:eZ|uR eab:I٤-+ ٭?e}a٠.+5L viF UҌyc$h*Xe.C?dxQς}L4,0aC bð8 |=QDZD?쟂XۺD&N~'cIS\@gcY.maqqN+ w5lU>",%/nZju_3εS/#E{*hȒسWE#8xٱ- r\iD_`#aX`J$a-9 H'A|I9Kkދ8%WNo{HV}k^4ىyK]j9Ng~1en1+"`{ 8!y/piwu- @2u~?"$7*"><z)n5u?q9+s끛"N!V)j}z GI%+m[`WzʢĵQ#-KZ[ws7), ԫes,*U O!뽈r#9ӇZZZvV0ɠ0kSM/ma~D#2H\0Em ti A'Xt .;.f@4Q&v/8uJ wR:dO2`litڤa܍yh ] dJ[}ۢ*im$t)ltl%.9U> }@>|.;'ǒ cxepB0򱲜,ȀN,V%gI.M;-VR̃o#`+u~%BvVdE QA8kr%Yd2iYw9,72"?#Zy>CiI7ioCq.JkC&-XΩHzc>㔤s4x"9))/ Ս +G^I쾁jo"ۨLݻ[L;$]p Y~H1?9e>&IPnթ Ym͒UKM`N& %Ă=q Ɏ$C;g0*!f7n'Xޛ9~9nj.٠Vk ?שGbr@(^ηWےͭfZ A9N0-W^gA+q{Ї@}ho'5VbX+5qX[ w#|# X?975e͎y$'K=Ob1W,sBYaGXh< SlWomN{̒ԔVVZ}Ru<bż`s4]aEDŽb(IKR U;Nx9廖$>e^IUnwg$10m5_YgIpN6=jc๞OnrGMY=?Z|kV[%_rDG9\yj[ x!?+==@>|O\;yq|E:H9!?{5V$v&',8go< ҧBaań.YS7zY蘨((LTveR@3G>z8CPn@%!a428G30 WFV6vU4ot[˿N1.Gu6~ >MK[L%K2(m3*̪r41x;oa(pJ{f>Mh#Y+ rDUMpzig"r[yKלN8Wn~Kgg9"c}x@>$8%<'/nw  &yvTR2PK3N\60dm?)/Np4y[bA+8': lUp93⾲ tm$I26ṡhp'oRJKh\U1R@ i):']L}v7u#Dž?p"IVӊ("0*Ű<4CKm_Mա,vsi(+.F.i5(ty ߭iohS MJ553/:ƵcTpa~$N;crA}xЇS˵~;yHH`w`Ξ?dCr>KEVhs'enw&K b_![m:ҴTXC<1;~߈/gA7_b]^dvUVtc^Ven&ɼ1Z$ѨM{U-Njjǜf~\l 8r+J1,qgt#EewtXKrSw0foJ_ML"Y[fkll #Q.m!fJpC<-y/wH|~p" {Ї@}81Wvyu_~Vw;g5i9͗%_fgDVg\,WՄ[:$ yHbf Q0d-_ؘpXg٬qYvrIhm8ĩa)ӥ,=Ұ$ zWd ~֌}kR=EGkA;=fJRYVTm-&5tN :d8#<$y~ʻaIw~x?;*^"Q~nq-<媣^w09kZÜ}Ux '}x@>8ɳ2{MP\BX B^+#3y)[>9?XeRK[Rc_mȖYYNA/JU/F@ 2ڦD'%wJ VnDCŰ 1.Bl[9dNbTiBrj#J4C_^8< sU٘DžƠ0Q:F1↎1; ,=yd}lytԨz $CM\vng6B%T$OU\afaۅ뱟 npNB'|~MxЇ@}OR\ B]u;hܕRu^NIiu[z7I1ѨnԴǑ#r=nm'1}NcRBؘx͚S.L+͒hZܩn8dsds3ߴX*2G>L}v 8Ri5Zv=KvvMQ(z%xK7V듢е DUhramD&5V<ήaAwa&zftgy #vKp|,uv]p|.?)4(t!)2g$=q GO!d*}Uz fOX1jLpWY%zBvV1]>8x}̱K IZQ24t3"|K7xPTA.'a Ut}"k=-#tԜ]Ys*)eI." bpԺ' 鵂ݒ+.ی!4Lbô̊ϬvL.T6N.bZA'W6%`^(fDܜQ`ï^B[7 N1Q+(|Uf6O:˹&dChI|ȅ7Ї@} ,9q  DHGs a:8"f|fr1mSVAYEv~XvAaФN)e(TS] "to %N2LZq⯭Iq洺VFt݊D*;}eec:  8&Ts:Y^cm9,ͥw\'3"}ie!7TTX%Q6[‰L *7aX8I 4GdU#/te|3*zl|p=qbdEanY-=\S9k+4h܄h).|HvmgG{Y{|azZx39#E:|mʜ%l;G]7aSPq\YV ,q(* &gB*uv6@JT7 a5);ތ~7 xn!Gg XT-LC4MpRO[⸊ dXoj#$ZR :Fb/w+l j7)~ypPSԓe\&V^p!Ym|ݼ_ۨx6POxs>?@c1Ї@=z֐KNɾǢz̈m-YD6̤YΪ`hPg7YDLukju HlK a~hD+!qvʰA*dzj-ev_UoB^vS߂ ߧЇ@}I:dϩJx7k$ ڃ?.gMjei=Q8%PJ9% fi0 z:kSy mdg D1-*~7,S|UQm(`,mrhU\TBhZD E}{ΫnyJ6q1 ma؛0+]LAJic9-LYet WUSهZ2BmZ!43%1giä T:eܾv4W>i'_`Om/ƕJC~|$=Q?KIp{xB0bO [Y59țBS,чTg<J>"n>6 *C!o S$%c@3T0c^a/&zZV^eJ;_ Y'糤~m^f13$irEȃ" RJR}P26%v3f@1@s`ڼ8եI "8 {D=I88Yn PYI}δpYouZuvԠ8,A/Շ@=zAھy>9Bd7+㘈@wwF[qTw%tdv.CjRQ#͒UZzn\vRѰq°ꭤeaݡ6녷j0Ɖ;A5|%qތZ^Nǫlƈ+]K`TIzb̲WQefXed,t|:a2wӁqn읚 OٹBoC{]3h~1HKAz% |6AΧw4ձԇ@=zt [pNUAIp@ʈe#gSe[TQSAVqI 9"(prAfl Fȥ] RڸsPD3Ԥ(aLB$CeU`҆ك^ai9&7SXv,!/  Η඿;{/@Xژǡʥkorj"~*Z[uu:•FPD!$ $dy:pyq ?yv{>?y~W/ňǰI`fQ<&²-`vv>dJPoBJRE3|W kUI`7Am&aXu| t_5ŀYxkr|5=%$ %˩|вah ^_˚0O ykfʌf.*!Ym<aZ&>|t ~$X`TuxG2MŮZ$؞MdV4ڔ<ғᵸs=kڄ4pD\\믘F&^6W$_n9OπFV px@6bY]_e^\7ViUa$nh媭o7_ ;Z;2lǍ}٘iQ۰zar,{q K $wGOvo;oP(cKc㯽oo .Z}޷+̶M,5˿hpU*_kdf1pPcCyy|>J! mq~9 1plv1ܚ Ȣ>b`+ϋRqYdƷmlU )`46 _w'=\~+Jd`# 5g||;x]V-3^&v+nECeǕ5323 fppz dXx1>>[-0 ϰzJL~1Cq[F&OP(cR Y]-[.,Ҋx_Yl53[Lլcd)ȨJPlʟixϯu5e)`34_v5_FOV-=sgQ\:TRez0AG?'n2dT=\`JЛ>hu)~~\dk 㔞e&Z"JWJ~̤cfN<; LFN2jy3P4L|99ccka>M8!es(gakVmb`} SfoÓ؂X/yX' %L(IǕzo#AK-oö5gfϮ60T7@C y0 l&/Wu;f1}9ȥSB7dDMKïi16cNbk%&Wp72%W-h-lfmᓝayr oCez79b,' %L(Iǡ g_bx'»^w3`l(FrV5d,myeFEdf9mb+̬%30<ܔ  ܛ\xΉB a+f1a?6l]shId"r5G{.ǟՓ"Ȓ5A<وyvpOH.KH/}+aqց aYBB>D 4$ֵr8N 2L20H0_/YƁb>&;6W/U).: ڇ/'& C+OJ@PgMdIΞյ0۶o 9{ 3W߱oy 2,bpi,v[o}j=>stU= b׻̒0 f1Hj9v =}}fKMsެf&/~]ɢ0(frX %yzOV,wyZg6hW" pXOwLed|\(V5`Q=n#|qz8"6^w&8wt|d3X _.*@7b>)RUQLEg\G@^&la=Ta]D@JƔ8l ~>[$l:kXnE9q8c+'|Nag1Z)7#RƩ7gQ6I@I(Jd1=z|4q5Vhfc玛3Z̀z7ytƅc>-Fg_kh=_@7x WQXvu |Z"lط;pu Ћrg2va7_|fXOH ְa%232Up.܁>/-ʬviiWmbdn_Hf-CLnM ->G;Luk:( ;pZyp z|λ[q]H| }6#UބFfcc3D{;mJP&$UJ#<+ I5co{;!8dTg1b)xo6F/û} <>* 5ٜ^{x}^Kl[n'Hlud^,HJLǜ,gA;\^JW+\VX'f|B:ýG/:'BEH7 ͥOpB+OΦlYFk(NFg!63Mⳮ÷+Γ.禳_P`+nWnL Sp*@hQ@|OOg?(3b>' %L(IRGclXj4B;g7\5!lL`Q3ڜ5'd*2g5zaQn !V~e3Iy<6'vRh6};nzQaܕq&dZv~ OlkvM ܩ,$K$-$N tI#60Զ+v9mExc.If&i ;6>EL[9;?e"9f%0/v_ O+qZ'^?d!*5֘/Z~P$ujzMp1z>3W 0`j4bW&]U4% /L@-/ L x#+pN2T;=:azm6=YGރ$ZM{⹴tL!X_`F zi4 b %5WL:o~)IlWI *:٧ C=e}[gZt%س#N*L`j`iF\斦K/Y#32b>' %L(IRKc1F = /2I:.= ԙS_J/f܊S62!ҢE*pD 砃w`O,K< 0y-@Oe1/Pɭ\5ؙ]m亚y_r 0󕸫59LsًOm Ӽx RɨBS,CI|s:4ľݎ1aa&֛G6?o#!/2&4ށ b2ܹm&#P&$ Y}d~V8V6;{_^*7'.Ğݠ2`26 5d.~[A?:pG# qAٺ`SIa6pY_b8Ȫja+جC/VY` f$U«43s^ ,h۪prق38 tcy3L`6100YUbc܃>Ϫ5~* `,?Wܲ1-Ӛ~ +E +2Lu+c2%jz;y?"]܁,>u]DXn$|9t9P&$ ~}|b>Þx6jΊ~b(1x{ߌu/} 6(P%&/YlgH3OUG# po)G(cZh.Lgۅ\EDljh B-Q β\bta+ iilј9M2geO|0un$Cw"Ϩ 7<>V}qnpu-l9Ms:D՗8&v2փO+p2{3jӆ#b\>J]P,1i8"1}^PuP&$[4ome756yq©dcŷ(bR2Fb]X%C/c͇f/ ı 8ϲCl?9.=KU(Vb;BV>ʂpp\\>/n%d.[&Rlːڰ,T |U/2@[ql2Q+&: 0)s=J L!Ĩw_?`),I Y8W,L[bGQ$DC{v {A 0>`=}F p@8`H* OJ@PD`9^`ZETƼnL-GD~':i.8H;aNMv-@>`=B<FVLGNŭxx01}Ut?IJ@Pn*m;ù+D xٞ {N3J [lfs劘9_ ~t~ce XĶo2f[SPV>F.Nm&gJ &v!.~@tV4쪟16fu Yrf::c6sUj[L=gi@8f0jVc FJ0fWF1_#$ %P(Iǃj$NGYQC'l1PPЂSX}Ca"Am$s+p &Sntpņa"ٺ"Q=U #<.Ű^F&S^Z|we%C=/J6l%|w4{P0Cebx]ȉAZc}ɡOgg̼pvn.=#bav_fNlDv"Se.k,p}-&Xw?{xRy>t1=} ?­F1Hpmrĸ %I( @I:س Bqpdmt3geQ,ŝifd9`7qqm?^ͤfn)>TvZif߅r߰/pbP$RQ|=V J&,Dcd3w?ނjK#h}Y1&%)?|n.,6C6^# fnW(hԐ#9ɘ1c$)mU঍ue5&Y A܏֓a[Dx!4Cy!sD_w v ;Dwgl|I}$$ ×d\㍹?'bka+}A{nCZt,U : XhQmNm5,ֽǮ /=rXF d+{sA UZgٙa" Qj3]o>v4sgWf[5X5 >'^Ǵ'qMd:zJ9PPcM\`.FI(҂ICUȪ?_Y~TT@sXo--,.nSi$5LcXG6`t# B 9<JG}t?I(@$Eb=I! rNpWA Zۅ xY@7vm@ZIbw{>D)G;qjǗg{@Ye-X81#? S3{3sB60s 0á-)oh>Q%fU&*> 4u1p cz-VW7Tp H˃%x|P2(0dYcIƅ:it?I(@$Ekv6l\3P BV3po0/] 8>p|L(YJ0m)V3&=~>ad&$uKr\z="Qkq";t^r|ͳYZW0~Bp U}Mgc-*(fp_DJD"0ZJyn'E#m?P42//9[0-8ރXgf{N-PgYpR|jkﴲӼ3?T0]Ha1=dw13$$ %Ij|S@>ke?/#ogy. s .yl|PgD̩FB#Mԓ4e8xLd}泈q('!}o[MOIe .v9,m EYQ;;Dvln+,#m?b9(QKj1)R Skz޶!?Ŵ;hUauIB1O p{SDi >f\t :cIŘ>LS$J@P"_;v,WM#3`Rq8W M{C%nHͺ̀zsr9ߦbې)#1|]pU3qѮ+M8. V]-e1-.Hk8 hG[T Yv[d!Rto߇Og7fkp7?X\')g_x=~XJN&1ͬ$k' >@e%˽6f&ax}Ow}$J@P"V!/MW/R2;n/ƫ\>Drx50ld#zv=ǂ2̠ am+f,a+l 8B OdZ+ ;ZX%jg]f qn 619SèV0a-Ϲz>3?Y^;^ԏX3_ h cVK1ob%WZ3Nck2F0|:{#nf)x@Ǝ,=t}6bpK6p)JV{[ݏ*_ liه:8ݯJP$uՌy^Z̧|~SU>z2{3kiCWOB]V\h^ʨZʨp%L@v:cö LVbQ)F6n)~F?όg pK]xfWn`vVZv09wJَO`lP0$.кS~ XAµ.ſ28ޓSLsОL\5PX+hԷ>]cvsQ>|6 ACh0DVgd"U<ٷ}]H@$ %)5Q/ʢMʄ*̀m5]hѮ>40^q>FpO7[^)ke8v/p!1-Gu3#^c^6/Ad3A'El߀%Jɤ8=b)f`<ݰ}z^+W`teMKc#]q^G5Æ3-'B-Ɋ4PǮ BcI&Vk1I/<[Atbtd 9vu,PqWJDF}Wt?I(@$}Ƿِ ~8IxO./jߑQ_ Mă [-&\◨"tsĪ5FO#0θi~%rv|K 2$)㤹r|oEhf܀ǝًq3,Y[QjELs ɡƩ|jZq9Zy0v6s5T?DaJ*cn-Sg ZCtt%.e~ۋ0]{2&5z m]~P( @I:ۖ@$!h1o q//lbΒP]\@~>`Yd"&@mUTe?mЛiЩ=m_6mnc FD4XΧ./ ӈ)Mfo|px̳.ܐvY-mŶmZq@߳?3X "ːg*/ I`Vw7fڽ j {f` O L8"K\urc ` y.l02mQG/Y$G ×/c[LAl#`ZdZR-. AͿl5?kN8gVD'fbϓ;K1~K4怛8[Dm# QP%Vs3@Z.2W06Ջ-_Y5l$g3eϝu%e:Rz؀+ڶbg%[j1 3@1JΡy/ A|K9?YەA_?;X]"8J>x`*$618/H0N"كAqZ!E;V GXaފc9/kyWK1 mad́`>t?IJ@Pi+(@tF`V)wS@7.2\`ʢ"==yg6Xm\q3.֕KX*D`1N [*4jvh4o6;`6#W0 ȍpcBbVDe= [Q`b%p,j*5g~b55XW+) .~Θ3Y5^RkOpUa]2XU5%a{*~-]xikL$3C3vX8W}rU$ %P(IǪFz /|Xj50[wetX`)pl;]4J2>DM+'"S-2גldlTF.PԛY4_koزbF+plSXr`T2O !K9\~W2`I&МNGvi\db?ehas <^6^|I041ԜlsC W*7tNL@I(I@P"Y=EUd#߼9pCn]fx95t5} b ~RgO6 dáVÚ06l4lOٳ5^y.1Ax8X&b1¤@w0q3.dS xR f-th1X.J*"> ]1kxzNgG |^[ZuDya!܅BwiwcB&O~$@$' p]c+,NB3xBZ:yIϮ= hN2EQ+㗡G=l׀M$J?^#]Y۞>_@Njn[(ڥM֊y8@ىf{i!m坱D9Sxo+>cYiӷffyš‹3O4cLi}gIP ti8߄{; WҀtEFb5We҄}#0>0ulK m2])፪ HeوlEڲ*AU g3\֩g>kyz3WiblauZ ^.{=z+Y  hdm!Eٶ #˹8ܐ=Edͷ{L3 Nw,_r]kXkm{'3Sxs̥}rt?J@I( %)5ۯ2U ^ù"svg^.e"7mf*lKV㞟 }P-lz^~DGWޢA%%al=lPZӒi&Bֳ6|KdLi8ѯ3^ekuZuM[8y[s%4q>|=w~:3َbX>j|f+Nq~]m3Ǽx}~tH$P uN"\m25~J7e`ӭfn!Ea`ގRYe1p!BCpǗ@O69` &HD@} ybO-(,MJ+$]ft$*] -."6l_`}ں4G]y K1{O 1gy:orP70F ۅG hKN(z@1f4sjOAU$ %P(Iǹbz:`ksZG3(K(᱂.+MqoahRog[lrp'{K`{p'Ntzi?Yt}iBP&$)4}|1"1uمBs0gR|Hz3[X< QnCN)&xl͖4Fric hvep.E ,>S -dANKZ_",u\z%} ;P(5-|fXSx6-@?X"=&DmLFl=~I/Fbzo(1"ͅWELaOvwsn$I( @IŠc]ľ:>J=_6?0?FǮ mrĨѪ IE,d-oW.-? 8zTUHQ:3g0g,=r% n t!;2lZf `J-ƅbu04L޶sAq:Omm&gxڃ ͨ &1p>Fk=)6C֛Djs73հ6~aDc%I( @I\즎G.F!$XH i2,`+wG?]-_f5JWpaR>, [p  S*8m`uղACў.r7Ǭc &߅nh$X_ZG"[ZRpsa۾"(^$̇önn$ BV wUX!Į<`Q>gfp, mvo?+Y=uf|(J9pO{=82SNo@]2 y@IMp)ǞYA2T VDLťmcn ᮔixX-[9up٪/[b& \Kc VCpi,N=8l-zBob 'ԘSdf86@,nB]L$I( @I.WQsbI{s 5aǑL  `']5s/V=.fLç5ئ T5H[PE9pJg;zƗ}+'ƝmQ=MLS{C'r"#[[x L0­Ƭ]!B^53ܯ̜L>6WgεuM7cΑoL:bA%I( @Ib=&mNּ=|8ڌyW&z Hbψl[43g0t?Loaf"K,.餭U lNmBfVAm뒇\0,Ǟb# Biڴ Y,ZF$c9s9` Я3&|f,saoo=؏8ݯsJP $5/Q61Qjt9m,}͠w̢$T+ {n1g׼۠@9 "ZSe.lk7o: t5xm 8`]-~f"9Y@W?"Bc[jUH+AȠBU,Nfc6Rg=b8(gAϗQLҜgmhIP$ii 9s'h" t5#S1 2F`ZjAELFȨAY(zi;GӅHcrd%nj3{:HkU5|s3Ѫ6G0W[l":[UEc @y{͉!؊sZmN7!t Ko@%QW$ %L(IR/*a#on &GY6NJfeaP.OȌ gb~ȰSj}mIpm\e<[H>R[J})x(}nV3>g>Rvb55ؿflcn.b%Q_hU"P|d|>+ ֞TI$@$I]6/:P"&-&zxF0"&ae5?k*"*ףz ]F59weV_,Ҋ1~72p$BE"WDƲʨz$1~~ڈjR#l`lc~(~K$͉Mf`93Wdvp/W!$IJ@P+HDbYhDgca9(eGH8 "Nr#>]?Z۲1mӇlAbd%Kpl @~_32{l?MæccGD= .e8Ѻ [y^ 2 Yt'|y(9>S| "]tɮtF'I@I(JGʊ ݏ4QtsG@uI~nyN|N {pb~>-¯EȌv2,;!$}06O5?-6nT1Vn^2T}pJHP$lx^VM,ܮ}d'QxDg'p8Sr)2,ձ `/q`ȡK}ƅla R0E,5&Z0 .clfTǒ]m14T}(QGt=3oJm @q̈Zsj91 I31T"#~ox'7h=P~'I@I(JWțXWU k aؠMi >4-4i̦ UdZwҍGؘb G.aZtwhǰ p&6M |g#xrH1,Xm7ob~b@IJ@P>Qț[VUD"T9+Pd eY.`: A-f ^]7C`TLcn kEY V]!|h0?#WS7 |Rn(3fͣU& \+SY%[@N$I( e@I"Sތ I%/Wz1~a`?Z<"x2VQ/e܈QVt|٘\l0fU:[a64 ]* ~3:qd9;P|ɬCO^ z-0Lt9kܜTo1|v~UM;oIP$}~Бg)Fƃm@C^U/k{w kfί-ϵd;"mD֞-(2,eW_Ö(k:^x·;)@(&[ͅs#Opۀ1/Mt#((t$I( e@IzSkuO0z^JiY(X ӊ`q\K(DcS 33\~иab>XFc2`hWm*}J|\gpy]tuq{B8o][ (I@I(J:D;Sg)^]HѻHpň ] 0W"%4u~4bhͥlV`-|$4P83p/e+Y4 > 2i 8)?e.MfP0snt7r.~O~6,IP $uQ]-,E;V}`Mh\=o`;4?Mf࿻ UlXO9Ngc6ЗBS#Pԁ{ξss(Q&6&4϶N&oxw\U?IJ@P>Tewlb}aQq m q(v Z| ,}("D(NyCvb [5[RaHE|{Fs XAxѤ%I( e@I"S›#lbQ} 7?ll8fj>9K:Ot!oX`՚h:%1l+!g[N $I( e@IF?>&6&4eb`@hq%~EqO1[IP@$gׂHSliax_f1p"U$$ tjt`-eE*vz7泭Ny|$ P(Y{kds>\)SG %8Ӫn~z\|9GsEgJ$d@I=E]U‰=SiK#$I@L&$xP c|ͭ[a̧;/^ў$ e2PxGzeac>{ڤuj'I`#䤎>ڳ{W_u _]7agd@$I]S Dzea|YQa$ {<+HO{uk׮)*,ɞ3qƥPG6L($T\69wY h@I4vt=> ud@II#JW[c>{9箻$v^|SNG?JݟųL&JܻEW׺R>g;CL($;4狮RMLY~@I8;rN:իVv23{R/GxV3@II{Q*H+ոc>{ݡIY8|{fo޴ES_x]-]޳O1ۜOIv623=. e2PS].9J5}N5&G_)I"-+3㖛oo}XOIbw0 5u#dgepï׭[[TT蘳1eaӝA ;㻇rvpN|o. e2PSʘț[+մfiӃ!VIx3z /<̯Lzh˖.oA5j`fĽ W_}5\ms:&O~.<{(g?__9Y]<d@$Iݪpѕț[᪣t(}$IeطMAL($)Ru4EWzT;vPg`/v1Oe[$I d@$I#. H_T{c>cP$@&J:ܢ+U4`p50 %I t6dL\&JԩbVtEvwkڽ$I-k %IꂲzgzHV9~rJ/J(Je䱼i{9E1q>T(IRo`S1& %Il[V$M)wnP@_cZ!M(Jt8 (\'Iҗ} Ǐi4P(Iᨓ{p.N[3rJԃp{H $'s5!jy.$${{H $V<|u䲞PwDx<{n@Izz;fcvzccl^o& %I:|ŐWwźz$})] AP}y:+J=co<ߎL(JtkXڨm:*($I_&mל:kY O_r쭽ۑ @ITqۂ2~Y*q#$u53ט}{=/1N{SN+23/# :O:?]{)gB͞' 8fGb;Zo& %I: rA&O$@g]sr:['?ܳ}]cn鷞矟l؝|͛++_~o]]E u5m κ fzK/}!A#js $F庽 aG~(xІ$Iұ/~ g??,>&i_"`9p8c\}ŋΆLg!vP&$鸔u&2>е+~$I_z,/+mלܿfge|igyg#=-saw~+_qa]{g}&'?lGz;7P(IR$YO3fE$E>zJ5x>3cpyO?m;5W9 h>v^ivVwgoϜ}>H^o&Ώ?$7>]j;(#H;$I$} SRܮ9Cٳl_vpأ|ɣFHO;]y:9$~ڎkwmVK/̜1YH?3;ڎvn@}Q$H+X}^H JXR\Eۛa:r]?={ W(T$Iݤѐum<=ٶ^ (IR`qQaW,7'tw:b]_aG^P!$uƓK{F7ɘ $I:OR 2J$uYqА輛e %C@ϟ]\TPT!L&dǭzJRS>]P {"Y3j# g~W&dǼ54xe7];wkxSOtJ}Y3PCՁ?pɒWqb BJRRcccssssjkkkjj {#ۼF.~åo~K,91z?PH e^M'66]^_.+xJ r?]890\pl3sK߹W-  .J&d=jO=DCCCsss1:/ZΑoØ_*%%E(!zQ ec9qHv^tq6x㍟g]F~>p\~FrrsΝ;lg$cΪU]$*T/2L&"kC 8?O/^gΜ9w=>ٳӧ_p/[o=Ñ;@P!zQ eڛns7:כh-gVe˖~o~]wvŊ@L!@2w\p=bbbn‚^nя~dkcc㥗^Z]]o}ˡo^W()TuW2P&;替:/S("M Iw7}u.L@]|~ߟs9 pꪫ e%I(lݼM~+ to޸ kG޻{{opٲe?O/:wQ^^6ysΔ~_9:oz{ァOo]ve_zWUUΝ;پ k/@I(|t;k_woLmɧ8kأk-O};q[1{y /2y:g'p|~{Ս|2ӧOK8\O_}u3+?vtI#ę.@I(Fʘ_2'#Fp /LukdߵsY_~{;Tas9Yg}򗿼˝_5!aϕWO8pॗ^h"guk4y|vvXfoq~QWW{.䒎83fpXsyL5|QRޤI+-))kO>䨨?55_ow߰a!/po|qy͟\.**tqOGYfs{`7M~^tE .lk6k;γ;tj P_ٸ ;j9s޷o__}[n=n C=x/0v~9nٲnO:l8̙3N擑l:T-iĈk׮i5s8צĉ+P&;V흷صc[bnԉ9G %ؽ8 SO -ܹc׿5OgD9צ3y͋s~O>&nmݺ{ϥ^ׯ'**b\ZiwO'xPXPPl8x r>vr(CgNd㋋gu5''=s9'.wl[SOq>8劊 l9mQΧ>wpQkRT`FbXb +JԋQ"(֨16T$XbCbJE0o,m<}Ϝsyw3s4ji]v$uB^J2M4'S$P< u5xy_#:Y۷/^4qxLfjI'&e߽e]va8eV½~V@)`|k6MHGWcsDCf߱cHG"l ȣXXOp\b_gYʯʕcvN"-}}\J֍>})6uO=pNӱ&?z})EM=rोz&c۶mU@iwt2ZG}$j6jԈkΞq/K"-@}ٹ ;@sPf׮0*9W6Vy捘2Y<">6gΜW}Q:LIIT<~{djj*O W+  @ٟ* k @yѣGSM l֬ϝ;Gx=E$:y\bh8M6wMOOcgҥXW=='ǀI&o7 &6'9ݻsJrt]:sٳgӡs>޽{$黻vYR~}>y$~==єp{?@ ?05*$OOOAjii}gׯ)l^mc%Κ5ihhw"q㨘*c,*U#P ?V}ClH'Kpp'JYLMM O>R…(*NÇN7QMMiӦӦMc^>} !_~IħMGp{?@ ?(̉=EÆtjW ? bNaa-)qD@2WZF^\ݻu6mڴSN/2M+yVKo߾4ib/()@2<СC 'O<Ǐo۶mC}6mW@ [GovڛW컜v!qgTBȹWϼ 8r۩@ #HHSvF'J :=2~/65>ؕ-fffzxxjՊⶆZXX:uJ0'**J9'@ ~DBr(4ww=zt޼ye˖* @LEB"!)3v%//bccmQx`Mk~ ^9xȦ!l  #$d玐]!T9" ~DBg)")+[f/o=SUZW_Rmޖo 2ߌDDB_!ѣGGƍ| 跫m-fׅ-'_-_9?WZ?}[zA⢢ڱBJ,'U\7'//j㟔$$$$$O$` " :|5),*^fP9G!n '5S@?xd B AO2?! P S@2 iiiU,ׯ]\\U=%%111<YYYZd [[;wT;))Օ<<-559 8 7b@E ۰aCN-Z4`2Z[[ݻ7Bqƌ^^^t? ZHegvQ\!$ҥKgϞ]PP7ŋ ! PgFԱc=x<1ù9\42b-[̝;WϹtttthccVQlMMM<(cggw}f|!S@! (5ܷ/*Ņ8ax2Ҧ SLJ۴v'JgΜ&,@^^^``===̌2wElChh?nyޞ&&&B$ %@v={޼y=vo#cNNvJJ2ew칹9[2RdD?u|F"սx^AAAK.Zxx[vv6ZHe#I&&&o_Om``&%1lB XWnܰŅ=>7ooݸjήO?:So>y{qz@)B! A@LP$e[!"b/@]]K.&&O:@FFF˖P~ɒ:::?+!@LP1iwj׮]ƍo/]D_sg)?(-!H?|=е7w9%BΨsyp% (XTXyІ}<B ?!HPDB*'L鯲%Ad@J];ܺGc'* DB**{t 0?!X3,&<~w}W+REBb heS@۷o/>1B ?!X'Xe2w ) <l A@OQ?$ 1"B ?!X(}cg45"9Wrڽ+LCCC]]sN'N^O!f>~-ZaX;;;ccZŕyR$$& BN3ǿuI/]J}iiSrs<%kNK}34u ~42|uBkw9yƍ\I'EB n@'"ŋ9KLL.swwʪբ%KXXXPjkk{`'%%'4j-55!HFJQ&69W8C98889 8|`bB|G?0~2bsF'EB ]ANL'"޽{+Ma?g̘啘H300ʠ_V|fǎ>p@8 %@555.zꥩ{!꼄G?ɟWWWHOLZ(HH෫m;@ gOMM;փϞ=;77R-[̝;WL'"͛7Ǐ/3<)fHk_yAsG }_c.rIWK <7hOAV}*h/Zek}Xjcߦ5?d֐Bl _!BCrD&֔z{ϣo#cNNvJJ2ew^YI) ENNNSND*+CvʈKRpKKKmmm77l`?yDOO{Jll,B45 TXuSVVVKw<)U@{n֬YppEI5@N;˔䤄xJ_%Ŀ2Ջה^ƽz%g/(=,9O>Ě1Rjbݾ_Pu6wA'[7Qח*XSS͛7d%cVVfffe*+)lҤIHHȻw Ə/ЉTV`رN o߾gZZZQQڵki/`^nz~~1c ) &C^ukf̘AF#ܹ3442k JJJNt(\Ov҅oܸq죶67C,/+CM7://srr  ߟ0kȐ! $` }@.%%%RQWNNNMLL(SYI)`AAb:cXwC=~ۥE߿@q藕!3  e'5o\KSo߾b&:OTcv}}=%)YOhmm}Ң+++NEFF#>>sXX{̙3/+C=}۷gff}pAN !!In0}LH3777xG#FTYÇZZZl~0  ޺ugϞ;Ǜvv۷m~ b (P~2Y/ P6544'#! ޼I.P6Ӆ QtzYuFZ&8(ЦsglFFFb-s5K4n B! SR)>޿_::::uw}:mL EGtܙ̌{k~SSSo>wiZUUB +4*Љ, 訫ݳ*jhɒ%wA v^^ބ 4i2mڴI XFEEА⊔dnŋ̙3SN.KNN*(seMz*i pC%M6|bbBZZ*eZn T<B"0x``ttNDdFkk{W͍3fJLL,.. 2藕!&+---**󳳳 A*[ڏ6 4(:08IRL|Xݔ455>̨ L෫񣇺:(3J#cjjر3166={679<|w۶m{!:-[̝;WL'"@{P}ئ177QF !X%QB(bB$u\\\ ֍`ooܸ1߼yE`rE/\&&F^ځsRfhӹsgRe'I1` 5޾}{nD6m(u総{({zdfZuޝg-Ks (ENNNSNDDr/j.]J `---ܲ/+3.,,P/TQQmdոqk׮#rjݺKj˗mR^O+4M2X/{. yzz!8I0%&&裔Hgʕ֒T?=k\O?qp"##되vJDV*Ĝǩ'O555LxRnZbE׹""<*M(p-"7%X|]{7`BJEB@ BVH*,,ٳ' HOO!$/X~KHH>2릦dٿKɿY6mD={qo!1 <\~}ͮ8R@nR#YYYbF8tuuYIKU\\,L@n4.YҬ]u5X8EBp`}? _qȭA l`{N<)>GGGʳ[n%K(߫W/ӧWipk|"58N-/G½>=ƽ@@aԈG$ݔddd|`;ˣGv^+駟2K.]{xqK>x@`SZZԼyZ [hTxJgjj*zT*aBVĉ\Go266lahn/U;w ?WVVƪ._fرbccEƎ[yGj#s EVtח{E]d(Ym&ի٦ŋ3 tE 2sLf(|ai@nTMgϞEBp b (ޭ4}tV̌5\+2EL'NdQF\vّ\v9|˖-^1uTB7nߟ{<)A@Wyxx0#e. vЎ}>}_x<\MMMx}m%ڹ8zj u$&g2GA~ihhlܸ]v#[SPP[YY __ߺ@ UP.Նn . 8ȯZhQo_ Xj^SNK#d"Xp"VC UVEff&Z= $}Ԛ |;wvQ@ M$}7dV9>>B6mP쪫Kٽ{7+!K,y"xɧ~:sHTݫ]OOO]]Ǒ&2ݽ{w閖:::T9t[W;&qڵ͍5jԨk׮s̉JIObhh8dȐSNUv"t;Ȼ9rcǎKwޞp`_3TY999 ,h۶ѨQ؀8P^رc۷oU(Oo߾jl8B DP@` [eMEEEZXXP`kk{2R|BEzP UYIH/h W H$e$֭ǹ/p:pyjGڵKḧ́رcT8;;kii 4k@< ovpp]" ̘1+11800ښ޽{+VYIH7ҭ3@@ Z8$۶m[YY١C,--pA>}zԩ[)-- 9s2ϟ?42񌍍gϞCFnٲeܹbKdU#IIH+Wpo3@@ .]ܺuoIœ8pȐ!>e(SRRbjj*Yf1iii|g =P~p߾(~ H6lXOϫƍB:8s̰01%JOO733$۷ouƽ СCcƌ w^a#vׯ&믿1#${p+{*.B#WڦF}3Lݻsغukj_~%wrr200ן:uo7<rHWpsڵ:PCǽv-Z8;;lMKK>vy^DΌ (&%%R RWԈijj::711 +s*C P,((]q}^CtƍY>..菽ꋩ7__~-[ )6B5ʞ 5Sihh(*f%KPsH?^ZZZTT`ee%]" 8;;WϏMՈѣG||<"KB|uIpA@4A"lMz(`BB<՘9ŋ821E >tpp244hsDuVϞ=&OV133nD0  U$/=Pw9sfӦTcdttOիW|||TTT"#ϰ-[2?j)BX(Por7n\2225kVff/\ڵ+---wsOVB! A@4A(S@e-!n@4A n@4A n@4A n ! @T5 B  A@4APa9QAP !P)&6R #z7 A@ PYy@LP?!&@?!H077w֬Yfff+V(++cRRR[ ) TWYJRK@ ! '>^:;;/##{lS&M"j]8! @|cJJ@i`ZZ$~, `QWW'cLL.swwʪբ%KXXXhhh޹s͂2nIII 5rssKMMm A :uZt)7[m۾x2Ϟ=k߾P쬥5hРle@#]ȑ#n޼)uժU .`tt者ƍ)cmmw y{{SO3fxyy%&&S1*fAl;vW+sB_պu͛S{Ĝߟ27oPA 1113gTZz8tлw<عsgToTp@T`|NMM;փϞ=;77O<4h>}\\\I&4A qIIpaݻwO0.*ח*XSS͛7d%cVVfffe$_ѣG:H'H & xWe,,,255ՕeOEE3--hڵ 6!O?TPP;f̘*$H}+={FCzz빇( JR >&Mw^ii)zRZ2eӧ~Wn{[%E`^ukf̘AF#ܹ3442dHj*ƄxT8uꔓpq%''ܨC6>ԩS3336 @y744iӦSl...O߸qy'A( y`FF:u$ hddj(&%%R RWԾijj::711 ͛KvT2~xM/l"P ..ǜE7F6 YsD !HPrߡ @|6'`#DHOO˨m6/T hmm}Ң+++窱@Nn߾_222GFgg簰0:???[ ?nbb2o<iӦU6 KJJ.]xb4AD/^đqĈgŌԴTiÇ =<<:C333WߺugϞ;Ǜ77M**ݛ"3glڴjӓ^㣢y'NAAAl dO:@۽{ ǫ D_&oܸnggedd4k֬ 2^յkW2ZZZf%&OGl8nii@Hߍ77nܘ}AM)R|[&Iy_$@} 9]| `@A iK%%B4UBu999 ܹs;w`@AD@9RY z@ !T3ȠLii)ĉ`@AP /YU} SSSI444+҅ Q333Iw666>qB@ T$= b*Yf Ho`;8xnsκ 1իWB@t",|> ɗN>M7˗ɏ? !۴iS֭Νx%KOgϞEuA<@ T,4Νo%Ν;!6 CgϞݼye˖酅ƁD999EEE4#Bp#k<}%{{{1'M$oDxÆ O}||JKK/_ޯ_$p 2ԩSmݶmۢEN<)ͯW_˖wP^'x\YfG>wofddb P֭MMM|RX]ikUTT&Nx…oYYY+A@ 5PǎGW.[[}0WP좢"½+33BQQQ hܸ/BX3kN)7nTĈaeeeÆ mԨׯO81eʔ]㹻 ZXXH[ :t֭@<6(#;+TRRҽ{+Wegg/Zh1A@ 5@,Y5gںjժuI[9;;o޼a ؀&KQQ@IA ߿FɩJ&򷪓)ZZ@``CDyo߾ xMI^^^``j BA@VK{^~tz M f===V</66+3j(CCC]]݋/ ֭Q9x @Y]\\V^]TT;fb}ΝQc@+(((hȑfiF|yCo|NN`BX-5o\U@G%wX@nʀ `򳞁@t jI@޾}[ o/(_9#>}333#;tpᲲ ㏨1A@ 5@uuuSSSUzmp(`ʔ)z }$GR jiӦk˂:vlٲZFu@@w0`={-III dd h>L`CO("A{`-W` H6 )ZlP$YCl A@ eDw7f0D ?!B@`*22#Çy&ٟ?gϞ.]M  `CORB:(^nݺT`Ĉ@)` l AJj4APCPP:tjʕ u˃h  A@4A+tpp_FCCCEEEjȐ![lzBLo `A@ eMVVVb /_,pwiw=<<^z%h/^ٳ'+@%E%Vy4=Pr/ɫf̘A%۵k'/ɍkr> z䉞</66VdPPҥKC@Ro3w\ҤIw Ҽy$ʤMLLJJJ Ӊv=a„*pm۶ SXzzx* [Z=P{Ν;%E]]'&&漛7o ;E`\zꢢ|1cKMMuuu}-|AJ@B]>y'Mt޽Ґ^z1̙3/_N9sLri_Z^^޽{w?\666-RXXHZWAlO z( PڷoO5 .ϧ]$m9wUF~b _ ؔU&A/qDqeƍB!CΞ=KȡC2cZZfddtN: Jgg뒉?ڮ]8 [( z/=;= E55h .:t0m۶`"W.,6A2Zehh T^l\\ǏC@R$$o ڊ%f]b~Stؑqzĉ\]V hC`v\5}۷gffwѣG||}ʪl2o4d`C@Bh եKyUUҁ c=>֭۰awٳCC˔iX D! &P/^dogg'IyCCCVʕ+s^|]wrwrmLπ D_A@`݊бN:UYC׷_ wнB&eVgΜǏ3f_^ oت{ D_TAu$ P+^ÇSUbH^^^r<B#h p ͛GfGo@n/Bh Pj9r${sP'7nرcŗ5b 6! Pfnݺ/Zhͱw*_'SثW B A@ lXu!::?s2QQQ<0c}޲e;vl21 z7!4AX㏩{L؋/.\7o$0ZiӆǏ/رk24AR@˛0akҤɴiRRR>A Hx/;~#c gΜ1338rw)**k׮GɅVN@`D,j*J%>,iܸq l۶mwhƀ\WZZZTTgggABA*V=z8s̼Cج\?bAJ-]~gIЏ"DI8j(*?ydʮ]1[,+ESXefjjsss5j$PR`! @HeTʔRHP|L]]]߾} XOѣ 211 Pofo3gǎmV++3`c$RSS()0}Ab/zYVVV%^L~wܹs/B}ƍKNN{>PjyWWW1~TTma MM˷n w3W,ט1c~B/REEEBA n۶MSaeMś})Bh ?~\{sacg϶lٲUVx6lΝ=ɓ'+۴w^2d˖-Oѣ л=Z[[uZZZńg>@/RϷ,li¹s)`ԩcCx $٣Gs2/_ʅ]')Z">}ʝ߿T3 ) ~,ϖv122  x<$hffV٢ @Y@RNV\I!Ywwwl! @M$e7׭[gc˲]U ۷o+) |kn9˗?A &{e IV3f̠իW*yUY[8!!{"+5ddv%m @@ &{eq^~-u#G|ww;vX&MJIXXO|w@!AT h P^sddԴTE媏R֫{ MV*3339.55sIk|Er!Coқ" ŗft, `Hb=+!!]Y?;6r\r%ﳟwQ?o¿W TBYH%۹4迆5`mlP-M@WWԩj9 Q( _H˭p)j֮-߮;-({EBDhRRi>yxx4-/,Ps! p&ؠP T8-["w޺ukC[r+بQ)._6p@Q8Bh˗{ghw}W=ulҤ7+ƋwwWOhO   .xQFmذؠIدS ?p0{/wYm 6ܹs+>oA(WAAA-`===&Mh/hWW˖-5kf<Ϟ={V^/TO~͛7[D[$=-(@ "ؽ{wV^tiq;VCСΝ;/^AAAx Bپ;fIHFF\66{u%'' m۶6aӦMVV& BJXVo5#G5rfh1j|Jk5"pB~ӧO?&oo߾nݺ}@ /⋓'O[ʾ*zӿ˗#2uwZ`~ ZFY*ݕ) ms5k<<4}$ : bϠpBfM0̙3`zz:7-4>Zֈ?~RDMQFϿr M۷/PYm_4 jǏ4j2Ɗ}PNp"GE D 'AF)Zj|qH[߿ ]Q [BD[ ~`)͓fpssHKlYE@ذZTre4 ~5`` Px B!":bbb^JWL{6|u,]hPc;B׮"\ie۷ Λ[bU` Px B!"]paժUz*'Ojϛ7m۶'O k4GJ`P6J.׼ƺ8oVEDpB!- !|pB__{>~%8;;d2WWW/O͜9tlޚ^@{i߾ĈpX1fpuGDpB!- ^z%.j׮ez9C |I խ[~ɓ' _I=\.*v$N}i1sr꣏@ G_( ނPxy "ʕ+eFuQp'{)өSrߢ9r Nմh.)& yaPeEܹSP(z޸!@k +  )&&F:LׯO?=}ZjDH& W.رH9cƌٲeKV:uuZ SOQ,~9)(c|/VIG_(.B,$@@մiS:.Ofѣl]z)k27nٳطzK+/rЖ-EԼu@+2DR.Rǎ O[ժ2( ZXP.pDZ)]|yҁnll#+&r G j FcGKMΚ<:5z@@@$A}Px B!"ZkڦMy<==4h`V޽{i_~i i`Q#Zd21ZD6~sLt 믣P{"AFùs{`B!""mph:vrtڵO2Eoiz_ @)pժrcG@JOO״ie\ЖBDDD!";zxx^AiӦUgjbQJpJj[Ҷ^=@IB!BD= KwwK.Ĕ˗/3<¬J,?Q+JCfԴjئp, : bP(@Zw*Μ9e*((hѢ}rssQcJ:tعsg>ŋ'NXa%'';;;j5⇃bCBBܹ+M-b]k,Ui$oS@=}QQvcǎy< S}K`L[nɲef >sep`1ƍںPq# b Bӧy7۷o_n>|?`@C0apׯ7o]|9 `թK. 2B)\p?^T""V.]jbO?x\~i##dd2٣P<֨N&aZdIu`~;&X6 b7l@ 2 BWє <0A*(W^wAD9M6-55` #GT8a Zu5eʔuded'e Eו%K1V dK[oqӠ/:ٻ-( eOzl٢ ƩBio񆽟@@PLL Пnt6@ - d hL&edr'/iH(/m`;t\]vT@\ H5Q(`~~~nx uRXXp `vvvϞ=߿w믿zh`֭ eD &G&SlWtpDS)nn8xcG@Wk." P(@?Sk__߭[V_|EǸ+""̫Z], nnn׈ eLT(DG+-[ zS'0m[WUvp@@A eBDUXsa 4k?st„ F3< "(,յzēɄӧppY6 Umj @F z]n\~RG_v-LرH62ML%c\[o&uj#*iS)@8taϞJ۷||l[P{#`%(   ߚ%D2YѴi 1E/4%+V)m2ذ t$XUHB!""Qp "H& c ׼y1ZϞ/_\\| (dX\snHqm[#GST7"{zz-\(4֭ٚy xeƪƍ.v̹hK|}^^V| G^({DBC BDt+G &L!XD;n(nP%5K ={}771߀' Q)#jЧxs ՜H-кwY(BBDE1o e!!"ZK{vyŊ #/H08nbn^>BX@=(yCh+S@9hwQ5 M2EE!(#|кCZj2%KcLɢ;0 `$ XL^ЃOefj>۴Q-$rD!A3 4wwСj Eɓ ݻŋba `> ׇuJXUa(ݽXvr~Iv-zR,ܬ·)N*CK>`0>-c*DDQv P% ڝ:l<\.?qiXD< %Fx,`21ص+<8d~M]]UH:P6m"1BӦj77ZOհCUK*#K06@# Q(@@  `kٲe3P "0` 3|]R3XDL `V&M > )Qv' LvE&@܁ ,qdh1,0H&v 50ТF(!<| !ĉ*` BNոq*''`}FY]@r@5`v&eF~~">".[ɩ|a)ŋP>>{VxQ1E.CG‹khײ[@E8xPi# Ugga3Fl ivmMg[@8AD!""VcǎݺuN A;} b bAcO`2a8fG#XD0CҩńH3i)Sɦ1;`>Hp|;V@1$pо}9L\ٲc`۶'X7Q(8sBDD!""ڙPr00ΦPU+ !?[EDDDٓlA@@  1*f`nYL(&13*S@gADDDDYmQV@\W 8 us>5!yO0`$JH"~LbTnW19$E`oҗ %A`a,ƃiɡj᫲ysb4GIt2GC:; 4)=#^'h |I {qN5aC5@ (ԫ99)E3I%@oouY:u [ ݻ#"qt޸UU`.Jggw)~Yavahqsgqr߾̙bSO /:hM3}HqJ=L.t޲Exyys5iӄ?Y3ׅ>(:$l)z&+adI_6lT M< ({?xx0g 0#| `Mx0L4")^!"Z 1նeP&]*ᅬh֭CD8 DDD!""FX 5a_`>}*S@;wVa_ow):@lQ(@@S.]VX,@ Y䝾țWg2M2#4`u& u sS!,1`}0+dPIReR$2f"C_9/j&@2U.BW٧3,wY"|擗cNNPNk\P@Q 9$g>lFw uR UUQ6-R({R*'B__ ?^@@ukÌK.V8V{aE>4iB(E^^͚)^Pp)4PvUj){N^ңhkWwv.W,Yյ+|U֫VܲE ֫5,nٲd*PT DKf%}<=7W=O3`a`U曚^~Y`z$u.J??eݺ"e#* #5Ήպ rph ={Q.j%zjZP3zUKp6aTa /ݼYO+X ~(! @UdE;P *0h.Qy4R2Dտ2߼)Ld?ҿď_hj-@UM}@e^|">,t]ۚsu^..Mka4ͅ 4*0k(srP2;lz]S P $TXT'U5IA _~l=&Vcp!+JK(ѕ]5*nT  M( ^"Pb@m B+53fcR$B!":`H0/e!?d=Y zB>}J 1r$b#Ypo" T lHJĖ;X& {Qa Elّ%7)'rb.e@dZ0r 0%_1, f1Sc$I9TElEHGQ:)bp!%2;cĝiswSҕ EK]B7Bߧf,fbK>a"y{ }=l Ig:95)+PaP_Yn>a\.xxINʌԺJ;[{B4XK;tGlzPsmƌR__ ލJW᠞㏋+ӧk6 ( HaMP3KԺZ XXᇥ^ҽY}P试 ԧ}{{w u$奂jSr[t_@a8G %PbKaߑ#$fl Yn]ldI V]FA>>*RIQR ;dGi@M&~=[XN,GZ?0v!ׂbi:UK W^ݓ)0-:%2>$Z.TU%5^P@@@ Is0@G2!P c ENFvì~̗K,F WYli&ɜM IfhYbfKu0[ `!jYJ-$bV-U8tRflӦvy)S>Κ}8iR) pz@c   NV`3 ,0rXhGy@;@(t$;V9n-MT BDDtD̫4`QL3`{=P L7&`0LT&haЪ@J _cUieL `z嗍kADU""kƲPk hQ6 i0lM(  #m0x&Կ=<T\ >\>~E9=PES@M@8YS@+@@T@@@  `E0gl>8JXdد_P// a t)S@+zBw6BYH,_)(uyx d^@SЫ$958KiPMP!c G>L.-SjvOx}zi>Y$uPi4\P. G$xxPe ɢԬP99,tv38;89 l4`:uJ Fٰ![1$Af@k sG9կ/N%5 IY)"WqYDxdv)IJօ)Ы*b!!s-rsO Umڔ@~WW1* 7 ]] I(|gg%ja*^h8I'L3M—6lXDťgO@9 Y|hMÆ%PX1J_B+J QF@/+f'E{L'yP]@`Fu qR Psw/5J+>"J:VHΠnFJ+xL₋n: WDᮚHD& GB&_i \$[+lѣFI0A-|$`p*uLjpoj\oMA2a(oMIBOD@ԔX$0 "MyxI4R8p/'2SȦXq48y71LxI`F["YB2r%Mg4Fq,= 5SbBy3عǐ>ٚ&v^P!g3[j6Id(Iȋ2)5Rhgs$T0h>3ז0i1A%I)blfόZ}U\VB뜴~4$3RKڕ"<2uwR2h1F f۽ώ_-M!*$iz6Y Pm[5AZ55MEV^hU(NU")~($X:Yըeo/E Ab}V1t:h@Rj./"U26 *Qb DD5nܸ[*"KǞJ0$E>'7 v3[$!;})v\4N'f]J"hPhBPe>  A`$ZJkAo1C^,L()BVE1|LFpjz +&!LCz)JdKQ33b.HBih2"5Ar"Ke,!*T61YedIJ9z6+09cIj,`uǾrffJ̅y%XȚ@w z0qV *0 Y8 F `jY,}ٶؤRf2ؿVf `+ (fW4N ^@@@Lu0 653{l_|`a5GEiS@@MEDЮNbL^ c]MXU!Lq8L^,tH9G1 ʱM ""<- !`0*+ e$04d4]%Uy`eR@,̭ 6o X(gڵGYN 9r{&M֮][n!h `.&2 g* v)c# `a*Ц0n24Etc "q5s-g)HUkղ,{;^LV@"4|k֬_^ڳgO@\$Fp85UX Mj"Ɩ0`2tPx $P/u! L@ڊ|@S, VK `  кjժ?~wuuL8z'O1n8&o><<\# *]kv@@0^ۦ }QI!QFP\LL3S, 䫒TX2X,4`Q`02S@yD)(a@?34k֬m۶T]v͞=&ٳ[nzP*z[@!Ʒj?   ҥˊ+`pu`O>Y1-z r0Yt+$PHß#)!nŊR$#8ԷL" ~I' \!Lv& =_Od %YHϓD;DDZtT T )! $N=p,@~Cr,%¶Ȧ R))@ ;h z Mr`vo^# J2]'DR.gIM(L55恇m#=op>mb٨ 'BCȪAd1=>RƦ:C uTf Me{E!@2ﰇ$$=@+ϞıbW2l8)6=F }J3u$IAcT9~b;z,|6UZ-SHk{T<.ŞuNcH:}@D7yɬ%ON&u%FISs<([@۴nݺ[6l)RPPРAmܹ Xh&xzzݤ@^[0' " L&;&ДW S'&ZdlfI$HǼh1%a6@ "_=E =`w߉ց- Yɰ0 #$N`2X#OJFˌp\ sqSY?Gjux"/p"@>C$uQ[(^%)W ȮJ2ud:s ;M2`Nq _X~yB+1@znK|rnÅΌxb 2)!hk܌{]cnnDv.}(,Pm,('W(PvF3J"\08keՋg$V t)1z~n96:)3\ gU') n:ܑLH|z[⛈]Bq,Y{cX:4P(0٣iHM y$%Qp)PD)tP,Meg4$iDz;mxoG Z@RJ  NNNefv;ʏaN"Y3ǦFbYXRXTXfaeƳ gbű]J&RBf@Zʖ -ZB܎(quD ^$=M9Ep֨X68dObl<*1>9l2@:dt$;wBءdf`6"a$c[f~w<$f+@^Itr)(a@`vv]oР5ׯ__j8p… 6S ̑#Gzm@^[322qADD6\bn"2@ҪC`*Cx}YHL7t0Y ,$ V033sٲeO_ʃuH,))ѣz޽ʕ+Zڳgynuqq9x`aa! @@@J`a + q0d ^>4 n(ە ୲C`LSͰN $9+ |R `Qc+ `-m  e hE'0rA0 ڢӇ 6jԨ]F} X믿~im<{l^ݚ7ouV@zA9P . ` qSpLfvd f)!1N$8n6 aC"*b$mުY&;ecc* 3mY0bHcQȀ@ .5\ӧO'G|֟6 ilkA|]&[1Ɍ!Or & A,,) uid^e0(F!:xQU0>#4&@v&JFs0d/4 1(  .s0<"W13ZCؘVê# )UQ(#BDOV V=`t :#X] C- 6` L:) `c-:-$BLI00)qU` @@ yo}̙WxbyZ #-'ToWt0S# S0ň `wjhp;{#0d$Ƒĸ4Ǯ `" @@@ڽ{L4iH$~TinJ0D`H!VF(AI8 Z:Ʊ 'X'`iSQW9g`")0Z `!Q(hES@@0۶޲4&XofEJ`0(Tf K00(Fa6BD - ( ^Ҝ9s(uqΝ 9sLppw}~zիVfV;FZ#5rRi6#mc0Zd0"u0,FW1F0LƱYd&Ʋ Qe(#Q&ooƍs1@H/L-ZݴEw2{z%#1 /'dnH2n}Ws2NrX9K/dddec$$#Ga8׿? :"#C$)rA$LDLEJ2Y =%e_ +4 ɳ;;IEՇIpsI"M G{ɾXAr -?2o Հ_H~Rýd}YJ%+$6I Y_!4!R>VAl!I},>R햽d.ҜVzY%%2|{.C,'^vj~!a?9=֟,YzdKH knq;/.ՇȩM. 3Id9j5~^O&ldu>c 'I{Wzd;\?SccN;)_9bsR!9XdW>rc]A{EIZdQrJ+xm:v\(@@@  j֭fsvv6mrYq%+dq3ү.l_WV]q&%&ru''C8Z2ZB+ʦq!yeS\$]$J,Z2ӥř5EAȔr4*#3L'Ӳ\Y4'LIiGz%-ۓ   ԢE WW˗/guƍ]( B!Qk҇/|pݻ1[ﰯP( B;0h!--2XZ 6lפI2@ʘ1c`d^%""ڂ T͈( 2Qgg^{ BLW|||~ =Og...&\!*[sιK/drrr<<< p-;|LDD5%$$ =zR  2W٭[.wZرcʅ}q*{P///xJohѢ P4^ V۷o7Nח,Ycfi <o>@{vUuÆ ӓcbM`-[ %kH"o]|V"VA([ + :F/^:tٳgŴsN3gάYO??w; patݭW\9}aÇ~nÇ٧q[!q| /ΝW_nxĉQF=zTƍA6m!0dD<`@%Olܸ10ܻwYf J+M4ѝG [H1bP']o"(==}JR+ٙZ  s)vlill$ڵk>,}O7I?ڝ$777Mtí po知[kժm9!۷6ݸqC?|kN;tʕ+|.=MuǎڠA> e0|ܼyo2כ!!!fFDBTMlu ob+WKM<}[A׵k׌$"څM  Vg" ۷ֿ{3KZ0kVih:q>Sj zo:::ӻG}$İ0طz ԩcgVwumF7=#FBi#O-O )`zhтnҭ'D???3qqqSN <ݽgϞ_}9st~m۶/l!d-{ҥzX x/B uօ!w8S.ʩ_>ơgϞD>|ťUV^'LVfufΝo]͛7y\.;$n:掞Kaʭ޺H_W>̈́xցvg@@ZHܺu^_5݅?p5k}aWP\ꔞnO/}Z[RҼyhW@}\.|.W>}t|ge}EVz^z|ζ8qDGaݻw@i(,%%W^ѭO-Ld@ӱpȐ!5Jw¡Y1cFPP\;vNν{L@?K 裏r 7&;w޳g$Jԛh믿zMOժU.]ZPP7X:@/)pS6k)f:ۥjwɢN=ӺH7^zqoi=#7qjq胎M|SK g6m۶i6mDk~ ߤ@ ><&&n=wJeԩ5xvcƌ ~E@!HKJJrCa,AC\@'N_%Hܹsiz=  Pk4TIB `N0!$$DRcǎ4COǺxb۶mW$B4p (ʢgKGn ~ݺuӭۊgy*1O=եK]/01b5 ԩʤB&"ڸL /t%55uРA^^^0ࡏת-Юu1Zz5O@))))R[ _~0)C5ZN, x{f):te˖uO:k : pNJۭ[M~}MMMLNN6w"@v>(}ǧ?%MAqB*-w1D22z祻IMh:v Xt@[l@ /@@[Е+W$'NpGjl޽G݀ݥ҉x𠖙lѢE4/0tٷntF jyᛴ">x@P5k}Gwᐭ]6mSO=իn.v%߀۷/]~@0՝(hu)rLqݳ/NۅhVh!P#:uT@f̘ ygyFkR(JuFS 7V>ڤ@AAA&i9@\î&ӱY w-]H2qB!":?3iHj#:H۪U+ݿufÇi"##y޽{y3-_(J*$$$8JO.upJ׹Di3g"g#O?7uGS0n|VZ4^z2VS zVu1[T055g„ ;vHKK*G> iHbl߾]Ӝ9sKgJa80}FLI]q\|3e4k OMGIz:TG> 0\k֬)nMҰq_7sN@E||<]9s :`@zfIFFFB.\`z*vɒ%D H}3@h>5jR|}}k-Sw..eyjK7;CҐx~KYKVrM_w?sG( Èfo&Bp`}ڵZ|bG HQBӦMV^4?,0ةS'3o޼{CǍ/VXR߶|\L0&{MaÆ dff<^^^zY@gƍtS~hJͺtе}=+p53==ݾKg8~G( Èe_^|ǸzpB풆ض;Qwvv&rG+ߓ{nǏ!q9s?4YϞ=W:[R74ƍW___[o~{͚5{z+4>?sn_p$/ %5JŧIh,e]ۗ>M-Z{s 4* Z&wh[@H7x4wo? Q(@@Gѣk 6;u-ZF<矹Ar3~xٳgo۶o7n~zҤI|k׮]?uݵLK%K@W\5B@x!) {S/˗/zqi׮]4 ݩS'!Eݻ7Ц֭˝ϝ;… ?xtYJn/((陙tz-܈xpZT* pG uyyy< FABZ/ƍgSu鴦C]w$BYHvSv`x|XO>BP(ueA@@j4ZR%%%ŠܜY(@@ BQ~"ɸ~7--5%59)91!1>BP( ,}:M͝3gkvV^_ Z "P( e_X:ׯ__oI>lŋ/]O  ٳC BP(@J۽;9)`Dxw; *CC5--A({ԦM.\BP( pY={LLHOdDDn^60##>333y7hŅzI5rweZqO*SסC5j(77#GJcv 7|DDDP( :,,(1cF6myuӦNMINwyYm5ٵkٳyEGk׮A6m:o޼C1cZppZ޾}; QV}||j׮K/IM( BP"1MR6l077VMȜ{7Yf͈#&M_7n /eկ_ǎ,,,_|E@@ʁwݻwKϝ;"y˖-ocwmpnܸq)S2oxP 99lݚ~7( |:99f6 l޼.m۶MOO[$aeSߦ'  fOhMnqvv.wyU-k2}jҤɄ `QFkٲ%ԥKG퍘ۿ bccXdI;9,X7 ʖZ^@4h@-ϧYX^B7R]~_U#2IADIUPPYի6m*E`{i!ϔ)S>i6l6ɩ_~ pqq_>CVZEDDH>}͍nu:u'hlPڵk͛a(-{rC*!C=ԨQoFgl%שSɩQF/...ڷM6m'aG֭[HH zę3g@>>{}Fp:g֬YZA*}4P'RӧOVCo?~v  rdз~'::>Z֨D)zѓ¾ !0iI& d؄\AmڴINN8bOÀNA((b!haG! >T ȃX (@yb  /BEk]B~Ujg2;ӻczpC%6mR%{*YpYS U(4&MJĻ.]:rH)ܳgU>zRToܸѴG(V%3U|m|ImڴQ=?g'^ݶmڞ7xH~XJ֭K^x뭷甗"@D 3έ.iΝ;]gS[jeODlb@o< 0@mvZ+,bPɗ~zͻ<ޡ꒕+Wj_nJ+NK|Mp-ZPm]M=냊Wmv"[]oڴiPgPcMK]Qc}7G))**A@$ HR{= cg:@ˮ}R/V;V|:3f\kGM]]iyzȠ-4hP14wQ.RtUTPPc12rM7WK15jԐ77k{ctzRCU@CCCMGkzLҚ{tRFrAT&ڤ$gZ[iʟݵW$<hlZ+q;xNA`ʮ azx34uO-,^ttqmϞ=_sƍ7o<{R/8ڵkO2|rLO9KL֮];c-]ڵKn j#ڵX[ ) bO- ~(۷o>X~lԨΦ;Neڴipdgg [Tu [*(bO"{&<]* !N *!'vޭزeKym۶jU߾}+yDMIkE MOXwV)Pc3&=XeVDᦨy 0;wsΝ;k֬k@ 8(ݻ/D*=zPw}Yx=\j裏f7֏Rˬ71\2U񔔔rȃ2G|Y|lLiioS%p$EO<[^{Q@u;>>ަJ lǸVwhC'Gq`LF[``0c3<. h͹V, //=LDD &&Fr-軴ۗFӳl\G\nHoJ5sՌ7NJhh(1nptt7TI~D.#J.DOj,%RT%  !i^SN5Y䌫"""tg} J S8g뻫q>eD@ugj„ +V0ƲCUؿk(բ3ydYۨQ#R`:)C5l]~vq #YҥKw!b<_c;/(2E׮]D< lt^z}OP|POajUtXOOO떾W^хjD=dllR{KJJO}?G n> Hb/SLQ|X34hn9K{XilQG4(46/uN MuV7[lQu}뭷Szn*(ʓݻwAZQ=ZlKFDOl޼֭[n]A?˗_uvٿ~(69NogU`Bdܕgfcƌq| O}p*={ڡCMIGfsdybT$# HbvcwdDvx4zl:7q쵺uOBm&4 zQ~ZI*Po"TKܼyuGSoJիtU+9r>04ӄD?Y=}5%|i3fmn6ur Y d'ʕ+k^}Uĭ[T`XrSRR. .pb@$Ĕ[8Ŗ-[٣_nڴ頭qO<2Og}gYf3gΔ&[_Çӧɓ?mg}||Fm6k}}}E+~駿X{r"Z=ziTWR]B=NHHPv?}KRi֭Vq»_~Y͚1}QFIvIHү_?nܸ񩧞W2>WΨm EfϞ-6PU999}kڴi͚5۶m;wܒw|wqǢE@BB:++kwTfdӵ]&Æ s;VRZZU3d__߬,^{m֬Yn%N]v ?~!$у\{QY;zh義fz5Jԩ_Qܜ>NGnn~԰a)6Љ:u\;w\z$D !n"q8|z6PK,QbUr4cǎg...ڻwo.]j֬ٴiӠ )iӦ͉'dA~ʲ,ddd 0VZ̬u1cŋBjjj~gZZ*T#Vխ[W^ɪugJbbbڵkB@r޽_VyoԲeK0.;vHB9p|ۛ5k6eʔ/222Rj߾}XXX~~m&%͒%KdO>eY0aBTTTQQ}||zxx\lٲ1ch;v*dAN81 @OB@RZ8PLEZ.VjERs?۷FAA+M;+,lڴqРAӃ7lJ7nwNΜ9-cJ]vVVU 6LKK B9}U~\ +@B@F 0.W;wl޼Z>}U'$%Q&MdffHqYC s+}K9jYHXgjTy ?ŗU`:uψ'dWR%  !@s"~{zz~)Y^=ܵK^EzTLR}KOOO JxK [Wbs)ge!-5ETJU$BR͛_ѣϤIJ@ AB;GO_TTwΉ9bΜQQ?gee<` &Uk޵뿉gƏ/֣ -H.\^>l=Yݺus)J8|8J,xժ;hѢEpjjذaR3AA+eYO29##]bҤIz?g]Fŋ*@B@Bq$;Dbbbz]~jժ5jhʔ)AjxUxaYP/E|:v>*Noܹsg9f͚^zժU_~ PNu8p`RRw\A&*$D !˗V gĉJg !Oii?…,g`'_Ć:*P6W1cgVHB!.s9}~zYV㑞=O:Y"Bk}gef6]+$D !׎'/555##}](\  !U1yr&" !Rd>)ɡ~NOKu^&TBޕPNϚՅ !7HOxJY0@BqK.WfoϙS =`HfOb7|#\/LINU.I0kBwf=@!MrbI9i)IgNJ;N;xFNJP`HfOǏ}FRl#r( VUBt$3v$s U]t$3v$C @G2cG2M@\?<\?>է@cB}>}v pHE.|@v p @\@h> @;ځ -\@h> @;ځ .|@v p @υϧX!_|B{~\ W@YF .XF endstream endobj 888 0 obj << /Type /XObject /Subtype /Image /Width 1195 /Height 845 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 2417 /Filter /FlateDecode >> stream x=@us܃s (Q6 ((nb"Y;< co,o&ǡ.&Oqt2IY.>٬pfSi|^zn.>˲$Dm.QAOU ;ѨT2b !T(M`0( 2+4O"硘toWU+\{1^P{0|E%B>DIhX'f9ɓB³}Y$B>X(c(> stream xڭXK6 QY+z?zl7ۤ6}xD[J#J/^ēS  t n $qaOw~GEI!-aҬHRG}77wV߽y,6_fQ6yId7yqv'}%Y`k:!NGwniV'^{m:j냢%~]E$ejаI3_]M)|2p(=gNO z'`A6ƟO c?G5TnU ͥQl0[^jf.0F󤞺W!Ԁ2qF w{mtGgr2;?Vr"!a:c :Af9QYr0Yj43ETrGH}m{͝"o=)j(^v ~(Z184vqwb<]j}+v03=ia)K_E=$\ '|Nt#^ DG:Wԩ)r `ʲܯEY!!>,BHiNp @!/%>$ 9miCn uR7PdAErK$)ATW:}vX/t + \y4ҵއU)Mu :Arqrʆsa'^rYjUqxX٘S! J&@s "*ԃPuщƅ; .&' 2A_ё Uxu{|r'NV9ktRz+>K%A@ј_ijvxъg{\3LZtj5 {!\'00RM.Rxi˶rv^C9.``*։ Fj@2czhM'܉WzwvVw;a֫l:dۍԧ%nMEy903ZQdxj5SX(i5+𿫹?@]& 2? LŁlX+wow^t endstream endobj 882 0 obj << /Type /XObject /Subtype /Image /Width 1195 /Height 845 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 128875 /Filter /FlateDecode >> stream x|A-M_+jZ[ZUQ)(eIXa$@{%$>{'dONNY@ϝyΉo뾮J;PEQEQEQ]Cy&5p؇1;(((('X iEQEQEQ]U߹jkNB%J[?((( kkWNZ-1\LH(.J?PEQEQEuU rmŞ p1s)Ppz*((.o ,-FP%LLչf)((f8LoITkN!=؛LQEQEQՅ5sk+i+19O"5gNӴ7flN!='?u]^: g7WnW^TԪei\+PEQD˼ߝ7,!AYvA٬f\*54 ?= L=(JW/9ÓEQTwV?ZT,֜O٭9s5!~?Md6?M\kE 4]]B; ;?ܗ_=qd§'}&ttaóme(hk?X'%Osh(|kںzӫBJXB`Ɩ.RCAI;#\uJ7hai?ݡ(ΚZxḿ)JLeqNYĬ9CLg9+^<{a /0esl礡ϒGoj([iގ7gTWMf^3<%+S\gx.^[?[~3N6r׉kϼ!P9flG3O{2e'GPEu\/U[JSYDv'1f}NQ&3>dwEݴꦛ˽|=Uc|əE9%]G"GOП!jHCF^iPTƧKc[q|=&:~gG JÅR\J'c}u"GPEuO-jOR%JLeqNYĬ9l|gEi5mQ=^x#}hQIO=u_N#_vSPEQMSϽ2U,fW޹? x`@ ޚ}94-^m֭!P"p,/;EQS߹]đJSYDv'1f}Ncל} PjQ7ܤ.pf'?;|W^9,ѷGy(n km9]WW/$(LX~q?o=eOқ3>ZGWT1|1Ee^Q"C_dzmm)L1j)Ԙqt&(Ld)1Mi";34feNc؜} phz3E@ofnro[<{s(ꆚ6mI+8uAvE1P o g6M(;kX V\[- Vb*s$fݬx`ЫSH\?j.vf:n;LBQEu[ :Pjz¤P*3TslzAQ՝2XjISYDv'1f}NQM%O!=eEC>qlM;X71I(O{s?4?Y@:_jںWC7^;^M*JNQ_ ј_tԨ3nEeUL/Cs (Z'jVK&>Y7sꇘpEs ph̓vVTsj EQT'ǶK(J(ڴ]֙^ O%9|}F2dhZqᑧ7).)&8(IM%|))=s ˧9ŪS-/H>5x6 drK|NrQ}H;#V 4|td3pd@aNuoEQTwgo Y]~կL- %/7ÄZ r+1Կ1SHEQudצiPEQmR V\BZ*GIS]9MӚ~(>fs pƖp(.> (-Z}njISu90({/~EQ9$ &d4eCH 1s)BI)(K0?>(Zѕ,=1q݅VH 4JSu9REQEQEum}96[-1\LMEQEQEQ]^KVKiN:x(((ꪒ8[(((t(~ PEQEQEQ]IBC)((EQEQEQTܜl(((+HQEQEQ0';(((J"REQEQELmf,v3kto==-bzz]wݵv#7{+(((ٔzXy9fӸ[[<{{˗;w}vޅoLQEQEQTQVl` ެ }iqceKq=䓢 /lƛ7t.P4bcEO~)((j) jJ8_75zirf9[P^ i!ȨVZ sժwbcnĄ~EGEvOcn6ެǨY(޽{)((ؿԔV ?ph\ Ў(>csG=7LD'|ܸ'|7k}Q͆^  w}7?EQEQE|:t0-5e?y  mYfW\aq'h)_=ULܷo_+%9ǎÏ4EQEQEQ- CzSaz駟ݫa+s65ac/EGG=ssϏV6^MKJOK&~Z5wOtطwhx{ZqM]gΜq뭷1Qk((ZTRSjhV)Hh+#\NN t ntVuWϘmbBྸؘO>_|! `3GnE$h4_?i:_Kh7|sjJ饨Ȉ hwغE)HhݞLaت\4h?qSgK~?͝w޹r ye޽{w=>k/^.W:>66?|bB3oCЌ̶jq-꼹sԶ)Hhݘ: [#lh4ZA~y]w_lvtQu}mܰ!Ð嶶ŋ xܰ~i*9K^|wO?l1cŷٳgef=Zk@+?Jm"i4Z7MP;Mh@ܜl}>pzVpY.tk6FLLw-/yQzQkЬŵD+ۦ( FuKEUQB6F:{iLUNAL'[n9(SgϞثW/Վhq-{im,Kݻ[`rRF %(&v4`̌n14 2?ߺuS'͸,Ðlf_z뮈0yZ26Eu"4ymrK߾۶m h4ҟ$mnC:i4ZQޜA4̝3tngϞ11Ѳ-e z^윝?gGyQsã>*/L,.~чm@V-)3` 4iO)`uȕZ'Fg?ѣw'0nÆ cc#׭{ ?o\~>1P" :n>'ŤĄ^_qmPUk駲mXZR"Hm[ qc!-9)Qt_hE;=5E\7f}my{idĄ}>^~1QTC=vDx|%zmG5e`EyyQaMbĕc D***l<)pްi4 ѵyF#6#cGRrCC.>~L\9uXK4xVCN8f\P -ü=w5rcvNΒxhϜ:seFr2{=F5e3#Cʅ]`:H^}dpFul3=JstN%i4`БCx 2~4viE?  8}^a>ёW;](tQY+3CFS{f%ڂF5e#A)>&׳ yhٔ6op޴y:gg'絎Ϋ8ZÏ+pZiw˜.qm4c7 ^4;ljq? u;qN]&9q?'̌SǏV8uhq[:2 ij. Ze,|M8X^^&6@hٲ+QFBK>>b I5C萔`9E[So==slsvvt~!RZ:8U-_ukUtpl,:FH@FmFչ03.ƬWJ]m& F$wcM{%f˖c94H[ 充mF::бr4F$R] 3 "XVVvi4Ϫwn^nOF#RT7v*FF_I7jhn n۷RTCzZ]@Fd*i 鯽gm}0%9owJIQ Rۮh~Uz\4333''\HHh%ny")K:y)UIue4"#B=bX"JDEd6o\j||seSRB|3m?;4qFuE#]3]٦hrs E=n۷nu+m_AL? 絫CC.d -(Қ~{n 82yF9,CTt"O]So63|Ѻ>JTWW]TCQs(--13qI V:,]ԾZ|MΜP&i֨7?Sm[<HH)6FHQT3!0JU" JNKOM35 nw@y P{;~@߁ٳg^eㆁq Fu<3Js!ҀW[K$a@:h4 EQC>} 8c1 ̯mtɅsm?Ǖ+!"^t$$¯4ТG_și5u]2VGHM g p3:1xރ!hWEFm֕t]_߾}3ۑLZ4-EuO 9d= hju :>]6a 4m2mhZ5k-e6k 93`|p k Y[d,5W ȅ`rV c0fҴKy~ .v.f%tDYpz oug062cg.X5Fh7%ݻo@N=HhmBOT% ^F.E7lw'xatY=2bZbp.*:|x4mЩiY\>Ɔ"˧ >Gwƃbd~2P0@336!>n<  3pS:) OY~ƂƠ *UAy0 H,%)ܫT}Mۮ4`UXk*qIeV}>Ûd+܇0Q χ=LmC(- ~&#.TmP @Hz:т|Tێd4ZW@_nݽ;`@ys6lX+Zi >b3>'Z ,O<ɱG ,--沁HuV-EOh?9=&^EI$%u02ўUe{A:=䩽$N9D S<~5աC u%mvNK̵pm-Y<5pnOĢ;|wӀ;+bc( QASmd`y 9X0S3&2`Ud-c8gur|;h]  ׏pA)I>=4Zg/5m*[ [N#sf3\[*A3Fcb#/&t8V/% աQa\;{r@O*L4p=2Zdhdn!p&qL:X bȾB;H8E%$H6`H2YM*+^̲,U /I-Uhdӏ1\0T.,/ւiw=>[m< H;lmm]w0}>n.(u]Ǫ0l l ?rco%homvb;*" $[Ad2K&d98_]?`\QX0|/K 2*_*Y,ܦ& K$a1%|@وb~gyc27L73? Kǫۗ' SN]HѡH42ޝ!fa@ءx=yB/.N7D[7s Ymg{MO,ۂ$;0rb_9ZAm|Q10+Dpc*w2%%P8p^UiUꕻ ~ZE\eq H,uas*@Yjl'Ey[q_Y?':V5rسL\s'FÊxsRѧ0iD.F@rM@EgDlhy9CJrRrb}$ C:)! :i/Z?{`RҟC:=nݩ}P)I U=g|@Gdnl.%Iǐ04E_T}Ø-l$2JEץ\5g Ǝ#m!Uf{i\ehc6Ki%0Dmn 8x w ;WDk{4w\95@I!e~ӳWq!˗@ɘp:-8F;qN nԦh]RSB/v۾u ˵p;_xŢ|iNiCAsw_aDp(Rgvq6oB.N ipEM`r'ڦc*D3WjSW@1'ah '. Yv>=@0홎UJL9G!ͦ$`WY"up|ۊLΪ&L8%`jL|z hdEJ,B@NtVꄧh[WSW΍4`V!2,M|HO:UWWQ%% |zXHu>*=OO>vh! g)@/Pc}Tl8 .۵Fy$8JWAK0I'$*%7e"SA`1pIJW9HPpT# p# }XS>\~ -*E>c TaT8!aJ#K/TOsC^>B$ʬ2R9֊Rʬ7of NʲXa:(Y5Cbl5VuiL#d`P;z;*7h];VlPn7S'x8"hkl-?i2*ӹ F񪪪Yaa *+E}6?zSQ|߾}_xa.6o[/H:+iWsBOp`WvQrs^e&@iZ,>xU&ORTX̄[Uѽ|\\jMWW|uNY/PqsOSܕ(O,4ېsarbQ\ge, (OET&Tbibf).6`:I`"zIW[< Ǥo$V)*JVʘ9^R^,Q/Wb;@&A"lD3͖c#1gw?~ĥOʿFH]7,))nx{gWzQpb!]  mG2,?#8 Fp'9[QsXYಗD5絁^aCedxCp\nrT5 7N4)'[)6<666g\lUL0歷* qC>OL7\7w-4w=>_z 4C_Xմ03@@2rA#(\:VXD@W!dJň9t?cG:2Kf,D;I1ŁEH٘ћ C r{;Ԁ 6ׁv x>e_V_BAUU*;hUagY0KKb*X"_ =x pqnÛxNyHSw_z䷠R@n&wcqu"3'5n%?)55U|rN>}=[&9Ys`Y?E[\i .ҥK23v(+(։>mk#F+dz2-;fLUVX!qbOx/[ݰ~i`TM7tOn~#-s@wFXh [/@De~3S ˄O$xV HG88$@!otV= ^;3[<ǫ7Ye^b hʍEtE|,X JWʜG1JVWůL\S(=pɬ/@hA(炈֧+RABSTG 9Dl(CFcUj0SըƢb x! v[gX0 F#R +ʋ t[jv=!.V\?yHYiiQW@nSRR^|_[`mPg DQ|< HEf? _MbĕcUUV6uPɀwæM?h}84{왗#|=zhiMriEѶJxq!+!|!\߾}[ b F‚ׁ=vDtHh$~a華>e*{KTHU \p)D_A^Bz`N-\%%LlTf*gJcƙcn\a萌tO*F:00`rPBWL%=*г{م2 Lz&&Wi碿sj3SE 蟅jISMR7[tzPaɀa1< xJrlyF=(U 0vKb>8T]jΈVwl̔ZeT*X3i4x$E팷oF#RKJs,*;+ȡ=WQQTff 8bMĉf͚ivo4i(CzZd `7xtPg1f9rcGCX裏Z@=Y\8xԉڈW%f~+/Zk#$ 3{hrŠAHMX#Ȋ~1F[秽B4Fg wv}U2$8i V:4@Gp2_9 uUw9xJSs R6M{;g࣬Gj TPf+Ȃ\a 6y*~֩6IY|U*K7!OP屻I*k<{P𛭊 OoHbUyx Vaϲ>E=/}*l6 !A_T~TD/[l/ڞ4!gҟu44^vvK|=?%9bRb+d+[[[{Ŧa\Ìz'ůC>s,Aw<'(g?N{SC46bDSptdx/zg}f:C@i4U٨Tty4o7?KM}V> D.@l7.!n@FfSe$Fك;Q[jوD1P*&SdYXl*!*u1h)-Gz*FJשe @o@|!e(a8cr@u&jZm:bnww | }.A~l:>YgUj:u;\0$$xJ7R[r{eˊ7|ؿg߿ 5[H]+,.gEY/WTK0%){@[xiץj#3T_g% 8G{-}wi4_Sf+3$y V$!uZJf{T,/̝BB"0D9}MYI 8Nb~)cs1[. @A(&g€'|el<8]yn,'O $섪䙲q\QGce6__f% wڠ<>B<2u K+` 3qnwzZ[kހē\~T5D LTD؂q@g֌Ka#OzûT`*?'pJPkp{0: pQ0"phH2 W OrԱ"&Д\Z( M1hzRmah+̋@Ir*%qxp!.Y8+b2  7R L*ӓIƴ'n7 E<&1CRj ÔoEh8V o4n䠢LJ r*g/ȷӠ6H\`LOT&|x?£žP>LA{c?s?cH?ffE '~?<gOKܵsǽ=zf?n@y<57X! jPd)T@A $L dvѮSHwzHgGd 7xd8 ,TYSxVWTJS{HVv/Q( #qwya/ t0Q̩\Hn6A?fH`sM`$'2F#i[J|/Dxj\N8Hz"TKxQ#I0 Q<-nD?D%RY!,DSH\tȅOp2) rԁSԁ5D a{YE J%Y}/UX"B6T*_;+z#U>5j˖Jש*_ئ"r`CS7g ވqʭ [>EH#\-$KKF"Ox= ׵ ɂm4F 3 " HuO>xN7`ƕ,P7*JZ ́kI(+$+W R#]gʠs8VĔ  F|2RJ)ϮFד֏bz@V%VSm)zCy $ : ,TWbo2̙SJcD?>7F) Ehן4x[:0z>*~VHq7K"*2Qe mL J3YzV\Šu''c.x@j#0I6pZ\r1O.:b \w ў (h4$1M6+-+mYq蜍 *B~(F}E˰UFV;ux1N͝G46,[;c(UOrhzbTYj#?ʩ ܎=RLE@h4e ~;+bm?n-P: E^n@ Fq6Aӵ=65A.괛lyk34~{ӗO!ڳ 8&0B :Vi<>R:jIV'噻 UXc*tAVlP8f$ILKVbfH[*^P 0BU*-dR7 TNR2J:(sH?|Hl)PEUJAk*>J1x,Np+K?7ﳠp@e>h MVH܋9}}l<+^> x67Fp;*";]q1T @kg*@nlOsL#+)e+J@:Y6P# ~YΔI%”TDy40 A;&˵^Z.z*`QT]: P+PZ%P$@O%x)OUPLZyJgqw'4XbԢ*1++_/ɤ#JV0 %:ϧ?ARTO0ZMW< \< vG*EdL: ۗ&>lƴ14`^nNaAm׭.T HuU<_7i#hɵ⮲;A8>HY2@f @b INN ڠ+Co: «\<|y>t$7#%H#xIO> wc#jFP(UVZR]]uR }$RHuavq3D}pKV%8,f<`dr4 k!J~ U8S*_e he$9 W&ZW0C<&!;uER$]R|T EEfbT]c*5VQB<4ZK :{VjrKjΑMYk`<O<+ ֣Cvr`xـI1<0~:wT"2"9M@y#qS.t8(w! laxBf3HPlkth E\֭d %?Q,4x[ֳA%tS%I D\KmbP$kc+*bevѠt"UjxzJ `*wVP y6*j W1y2bGc1\fGCpj0 %a/-V}UaTNSe J$ 88yiV%:}3ӅGyB-LaTU>i"֩b⽘F3oD:YD4Gqj!!*+? 3Vy!e0CYLcBuKn|Pm:7k ?m0zkm52&PvUA`ܶ_q< ^-s Xiڎ` !m`0 bP BЈ&44RiRT<[u;|B@@IΪu}tNڿW\68%qƆe/r+gyspAِKCh;g. )k̮V$Q/aLV XrZ'Lm.G[jJ3Aj:V`gl '(^B)IWH@d%YYB ٿY1FhMj} ֮#d.!n.s\I*%D 4im̻+QvIeL񸅑1,z5H ^/3_5Ja7 `zMji.a.%vOig,ƃPE}di=]qe`W(?T ͩ:z+}7W [~[}'-i3"gG|׿4D)AG;3j=p$פ$&J)`AwaTqh>T#iW6I),f.\ioW G*E{r%gZbxi;mq;"v*_٧]dZj^fnzkHtּ߽eV4@_D4uP_!Ӭ<7X◜0xxQ(W͒v,קȂ"Τ}ˆ^ş x+]q 6g@W\9o,w}B;!kUZ=f§xyk?9ªN/!t*QVK#t\ڤХ$%a2LQ7%hg\Zr׭c̫@kJ 3)4h y$4œ<gBǖVo6nUU+,ು\IZ+CG;dq9V,i 8KשН\SsdV:,%+qF;(kBbtGP ڠgt^QAV 2Kz?zEC W3uG_z2GP./^O ֱo_A)u缞 H碋5Hm(Q>@BV@a; s[Jw%u dM=!k 4ObfVK} OWFQJkU_ɦyi'rJͽZd9,gƽqe1>Zd*ak 5pe"qXŏ)پb~v1 (,+Ms&޺~SV݌[>#& 3` 1UEW +N =y<?g_?+ d}@d DtqEpoWDXe9rP2 &W {lj&.2q,'S{Cfe%g%EaŏM3y@y8n:s/RrtrV@<) ha6j*'c+ōԖnN% I_8'pϽ/uW2ЁW#Xh+8t+g.»ǧwd bSlZI C4s?zm$iRZB>1A Z (%ZLm)|O'AGejtstS-,WBu ˘YNN}|`pR. !M22J$XƉatzY[چd[䷖'*94~_}uu7?W\qʈ˗@\i?+Y ާ"lc6iݢ8k&ۙuT9s bF>do2_Д: R} Bf,X1lvQrL MǕE 2~ցiů^XJY]ZV*-f㜘Cg j>2{07rvgT>~_#ii/^x+N\!`cC}ɚ>PtGP[SvU:rWDQYIWz$+.=+B `eBez3'f13#TC44d9 LŹ)L27jƐ^,EVb_B.z% 'rndUpF̜%gN-7әQ= bҢbXފ"v337<`51Qo9_^m18{fnqId:0:>@k>D*BCK&+H]ؾn 9000n]`p3WUx' uK/9 ֣7gf:tŕ3F{Ji7װR pf#篘jiJoy+ %ڦ ͖? [u)\)բ|@R+U0vfQ!A%Ztˬq1n8M5",SΔ ##{4ޱ?W^zQpڵCsg+8<.x;"kv̘1h4:|;ٹs]pe߾}W\q_Ҡź\q<@!+qJowh0?@D~"]#Nh5jѥy*`f/'3"!r~1LaLp짗3", ١diYuhV,C^ {i>(Ӏ9\i`F9?ÄXV({LV8MgAs=R!UZ_šL PTZ-|45Cs4^Kώ]qed1wV)Svm7ꫯf2ŋr-vGW^y%-_)෾-T*5gΜ|+o |Fc@W\9QG~6AyY8Z6 ~ S )ӡ"`nzV9"-p2 Z>Ng̓R%+Ý:S9<,(:ФEF2-0R18(MU(C0i`Fit:5"L,Wٲ #M14`5 r))_TTxFe>{vD;ĐangAS;Syd+:O{}crf4mzV83pÍ2/KF{ 20T/}s袋~_G_x<>n8я~qD"q&oCep& hCr<__+|o{M"ɻe8(rr,Ac1dZD%uޢOed8*iBaG?4D m>+6P^RZߌ+Lᯄ+Fp9̐jZ(1yqe؊byoNqPq2]3Z[AXCB֬WSW"toS`KG# zeGMҋ R,֞&AĜDV -&ӌ\AJm5b(U9I9]8\+ћaӇi ѫ+D bœ*|PO>Şj̘1_җ ͲBBXASқdiLeÙ EIIK+<,Y|7I2~'h5EIW5~ BC|D#4@(=y)Qo](:h2qhw!%"xSd1]KG?W’ D _58CaUNR5q#!ki9\s _΃s\h.kS7f>:JGQxDJC򡷷:X ݿW\h{>fK7@cbuRYf]|ŧfo֬Ysq+r\FbS=͚*YTΟ3s/x+Y7ڛ0` %̱ DAX)N b_6NSǀ,rK/=rw3$.KZ.7e eXTØ%ΘC |iQ(Sd_BkDO1p $lALʒ3-ղa+`2Ǵ撐fbWpM=RZ{,(/gɧN-i6`X҇;`~J!q5n2܊hXS#ոG.6Q`BtBr<q#5s%;p>-pCqŕ %hgL0!ⷿKfٷ y4&b;#\9twvF"S=|"mLm[66}%qwc 6|#7[6m4ܺy_7_ٵ:r_W+%fz7WicPj^gm){s2&|ןSvҊe#h~1^ b <ݰBeZvc!lLҲ&CHjiUVg#9$3h348WΜd9i!Y/ e1*:.ҸlAd.ո컘CZ)590ֲ `InXʹ]Y9c7Χq0iAo<[~KZϻ嫄.<RW<8ݫ@C}-VyY޴ZP6`k|IroW> }W _d߻w﷾}so-[_W뮻\y+FO0" ~t/zmN&>q;ݽc{uqC~37{?|W>=)>/q+g3慻v4C$ž1 Q:eFZd`l%Ct7>o']q2&l-oG~:;­KP@<_TC#lL@7Iu4N7CWŢIG,#@K%q2jP2`njvqͬˑ# F.k݌\F9sZ8 CFMq`mjF1ɒ) a ,DMk bZl),:w0e /95y73wnJ4 H˲ 9yA+g!HgYB?,YrY%kV R;?%[?*ϟ3ٯXz}mM]cCs g~ܾm׽{ .пZQ~ȿ^z鷿Wg|3uŕ~0ttVOmc׽ݻ I>#$EBa)4 f.f)tDܹ n;'au2pnjW0K0$2`h(ݜ:e$=`#)4^qB\%-r,$s2(Mt/W(Ya'XH(Q`A1au4a<hdadφìFǃݼ*ov,pW m--m>ah>t޵}c_l\PWJ%kS^P/u>2ƆKFv]EB?F,5unxQXu¿x g|#X+E75`Q%;f!X;;Zf,_g܀_?T]~[zѐi_^9B!3-4<9ԻcI'*h4Kr^PB.XuADdog(EQxyN.{]9>䐘S o% mZ44:|*mq"#1fjB}1.% rLgk1U4FcRؙҪke#Co(M k; V*W-Ixlp'2Е3f̍%k{{drKC,z-?d2{ǭf7VwrݕN| Y\p)vl`a Lׯp 0>Nz??t+g8zLq[ʦ}*\FG,Ha_3KK/t_'ImҷgoGD $ UO=0h:t 92Z˫#!@[Je)jd)5X}dtC@:l,+:IIj>\hbF+ŭu<(]+W.ío+Se7++ ,HcguvaV(ZW._N?zm\.,v5})YʇsgVWwpX_U++w1㗞~ښ矛ry9tŕ~kt!ƟW̷1vl" @\|M h98,sTeCq[,6~.[}C+/3NC<E #Ӥ,M3l(ɍ=iU,pRb(SHx|)Xׄ.*I}2 -Z\L*hFn!2JEmW)km \ߧ=EY'sJi4ӕ!DQ¬ԁ{yi1 㜭2c!=-7lؾgh gGl\񄖴D]GEXov ?+8t}֖S=}[7m~]ڜ|>:\?|qkvH&% =#777o`eӆ?y饻wn?./}qԨQ>=Trh<6bg2ٯ$ =ܬ Na37]}~ۼBn~ ,ݲJ^!f\o$;K|t8~ O`$/s!eC9֓x,3zC8khZW"e<-A9t S(3T` Ș>ϕE|zgFt.dKp7V+/c#wM9CRi?6.̺ U4؀%y?L_s ==tגd?e⦜Ӯ(+wJLP.PRkd<4|a+8t@(Y7qtK5~Cϙ Kw<5U.+E7q&d8vma*)b?l1 |ȼвG4='JoWt(|꒡5z8 CVMuR28wvY(c{RqAaBpW< `^e3ӔYRbzTRgL /Tr${qkZּ?]D |ڬ[YA 5)(i~iѼov·+Е q uuvdَv өn>muwuS?|qktM1Bo4ֻ:tŕ3]j싰yPqakC^& ̑sD: ͱCJ=7ўRj,}_hO{1 ܞDAy CYvC{D~)%:lyV!M3[ñje$ >2)cuRʹ2*÷.`ĵVYZi##SL8Q֤_ۈy2>Y l*Qov f9.yg/+H|^e8x"qcaK-6^8TWz-j(ICowP'@.֖S:!@9NpWF8N"Vz/2EHZi݂FZI=-%1#.(GQ|J.)/+*H:4p;E;ЊUTȑnT䡢@TP`J>zLM;5lHD *AS0"`  E躙(:i٦57ÙjYSk4-FzKh|$sk v>jSv:Vt*~üo!`Amt]W Q [#f^Gs\ttD_ldӣw%cRE$fZ0"h:ۗ4$;g@W\qH@8AG⊣ _1H좓 CT!"WU4#SpJ\ 3-9^W𴴳LHY+f[yIwiX2MK*Iu,@VJD`֍^S"|ߜc={nGIU6$\%n-jP$,U:*\řT+SҼhԈ:"`i<5 {Zw|z@MB&AlmuT]H,Mk}.~~5~'Z v5_"4\(w;n0zov,}g@'Y /?яދ^N,P_#CSkKg+dT;N_KN*6s jb R\6 _B$C\h¹y%~+3,oPR 3MbigRb$ZR!F}PϦ@IH֢2~3Aq5҂ԓe %nP+ÇU? =,TZ58w dn"\5ctdʅfTI Hj=4Bܴ3 ahh'H> Jᷙ-=VE|LddY c!@>#£]j <95F^&x | ^+g=ZI&_ZYQbeCJ$r׎3FZ?8OO /\bEp?4{othIIIߟe44ԕYd ݇?G>(%F Ϟ@W\oJu2H//Rҡc <0XT>TN*)((KB$נ"OOںw!$Ub!谯Y(ln(^0(į7 73Ġ8ek ws4f ~}4[\ EiEiQbțo })fy(i]͇0&՝1oLΆ˕L07%Wh{~i)iH:tqɾԠ<.¶sfjayX~`ѺNK߀lKi< 9Y"X3VVtӳx5< {#f*'}+2k+.gϟo|ͯj&Yx-rbO>[ouʔ)wqmݖJ֯__VUU_~{t*|> o7B~A.r=sbt(Dfy  "W<̻IjӞk14Q(W8,Z<2@X>U}K[5̂n㮧` eL"{L젝)t|U.M`yl;x.V#@4VAyW ZD&?I#2z^*e(*$ -EY(})nS f)+Rko( j2潜T8y>\yM~UIKz-= K(9N֪ ΀K~nVg̘o~׾_O|7n܉_|qWWP ʶ@#$N}S}|HH3FĨ f4H*OuWO*ZZĒHy IAHA+,C`W\ޅADAZIvN9ƚz(H?]qh k„ ;z+VH$~w#d{o$NZʯ|NЯ|;⊣Si'E_}<_ʞ=Q.+ ]a޴m>3G|]TOkrU 1't,26{QnJ/zo7-.bJ'CԷVŤ*@Gbd`uph(&iֈRʷngXz4؃ʲ[IԚoFC+ujvPqGdYoи7/d36Un+hkXEH} Y`^ ϺK/[1XEs<\SKa|ۧH57Wka)2:{ t>rŕ/g?q~>GW_}H.Z|+3f81b׿ڵkOo߯|Nmڴ?ٸq]qɕ^%X"͒A!G#[g}XjuNS)l(e#d9a>}^.[\f]nTԹ5}!B=4,XCD[QJԴ&d7 cP.a7C2lW/qzWwP.W d"&/.۸x^>w晘 LFkJ-݊ c!Uaf{3D9e7d_RldY w*Vrd2B@q&Ce vX6uù<U+t@>#:PdܣbG٦ )TCN| -<#pVz]2ѬX:Mb?_kaߎ?W IMyyCx{zp a4 A}V\_ 1|"I!cl&leaUBbq\m2{B9`{&iRifm-T(xK3/Jk 'uTw JgY$wEYeN.孰,iD`Ja߰qӤuܻF;ۧx_R ;1 `Vw cx* qZ28fZ_PX: >D%ı9axPxW\qﴖ[ߍXR+$m| Ynp\PnxbIK5+ |dU2|TzP#(4 ~φR3XPj;˜7t%kauhƤG(&&9uqq$5rVxLitR[iM*Z U9!vczh9Cn9FD}Uj^{<Ʉla-m*OR=e0?H=L(Ό{Բf,JΫAMʧ2)q3σ+i0A6*.Ms/Zԉ\l|^ aP2ʄ#N,A6G9+5)鰋Mk^\/ I/cL$NӬ0 ng%-{ȳ'Aܿ6W:t@22oܣ%})U˅*U; MuJYrҥG,zejI%BKln62 aq%"Ê\'ɩjk\DivMRJy,B58 #̘f1AnOs M;$tx^8" Ҍ*/Krѡ mfٯ0/TڨzoTh'j@Y=̱+v5_,Q;(3>BȈc 4W( 5rղ?4P&*xLm'hs +0Qer9cp>(Vkh 3\&7*Qm8S+8<YGoПlSUQUrœ6Mڨ[zrP:xMaAR'O߽.D u!2}CXTnӲHd%Wb@cV>=^è!F(pFM e#ƕ*M,^_ %vi>blF,DŽY&{OI@Mj v+Bi,,7 ZB*(u KD(Yb32$﹬X5"\IZֶ?Y eb%0!j!.Bv!f@_O.D.`˵3$ ?\:6 #Zf6.h-W> $'e*=Z]]qx^-9@w8t芣B@loVs3j6m /dmq~x)@ځdSWD:a:%Y0uԏ1լ '3PahnhxZA؈SSiL($ΐJ0SAW [N RCSk0ŴfdԽ=,l;( yYop%/ւֿ͞Qxj&><$v+ P5 Pj?uLb"޼\b+$ښM޷CMߎ}f- [?'-x)-lQqDsͰ^+AcBnp΀rf3Fݕ戴Cy rY"{r`]Z>E-09 + H}*qM\lD3N}:~x/+qyDfIZ+[z "Q)IzfCySk!S / 9eB/*zV䶴`ظ>5# l_(Zos|)\(zL- մm6 9j-΋JF s5(.K˵fG#y.Ǽ5wDؔBI[Vދ+b` 4+6$HDe]LEa}9p)'8X4'Q3+0C#p]q7cS!wmbW-z3Tdj'Rn$]RE/)4Z쁦u+^AhP'[Dx|DAVNmLI-rvE%s i,HJpY}dMffY )x¶b}茥yXք\\M#]\y- kە-}I0- SgI z| X~Xg ٺH}{wyЗKrʄvn9?{qlcCGyglQi "ĪLf]Ӽ;bv9?Ґ^;_>zljo!/7pruBq,[̕Y_(C\$#x5r,6½f:XbHOAN@äCKtȊҿɡqFeV?ONVK9)=}%-oTA%m7k)BB?1'ĢB$`_KWlf$`^8vY;q,m / +6௨|yݲE m WbK!fIO3F XԄϡֲ|_SH5;}Fy53kVi\J*wq(+$)*ت+8/c~=Oq]q.诎m)kÊg"\f/}X&$3ޏ5Eyc;u0ݵrsi u) 'cFH<((spVOyMbf8"E i룗ĸ݃'[VâPLS׆DY죀F+GT1<[Cm%y)U"{YH6O=:\H"'YxP4O:e& Vuq_D_A.8e% 5|{z4ϰdΣ?DWXmھ~SYgm}'tSY]/xymo5OxP;8;2V.H}HFҼ R0? bnYQvَĠ|^b5lȣ0U[2bRCdGCG2 b:VgC׏"'dPƊǸK$3Qѫ 09P%JW^q5X<7f!EQfzĹ5J\_[I@ap5*>*1{i"ا4`r@՝W ^%Lp$ϧ ׁD_N+HfO|i15{qk@w8tT]qw6>s-z7Ö@LY'xfgw} e4bINqibu(`W"f\4!2>JP@f<(i<ʠP PgC2rLZHL(7QJR Z+!Aex j \ MG5z60`Q_8AۥW6RC28 E-҂(dQQ.}gt;hmNv]q82gSvGkP9'Bx̧ǜqk@w8tT]qҟhPG0Gg=|QĢRR׵&a:5 *ÿS_(uBQU?^1OjiCL2wJ9׮!@BFˍ67tW貇1wNRNFvN34C{4 LdҾ9d*>5ƠÒ&!QV[>z\v5E="~0 ~݌kK=b%2jf [IhB84lus/F$A$@,ɕ$m߅mTh v^:t4X3H6ߡhE1Z+6C7¸w(Ù]q ׁDJ^;1oxܚ'n<𘣻m]ʙLebz|Ξy\.r[D+dUhQo6(}e H \[ L|3YF†A&H4.F[[]JO_L ִ{Z@\եe/^Tg z4$ qfNhV%-"x{RݠA/Y䙠fYS(0uPHځk%&TY̫Wif*M=)yf &e?*4߃t 馑&̑̚f i2aAh%*|{;,g8+G]H ?551s֋ǭyƃ:Ç~{vx'ntw7+ 7VtAX8*{H ǾDaE ;@K0U/" 9> ;S! q,"$(lK)S E]%Ѧ*,J`#ʏhL$rT\H[d.ePUL>diE1j!\ky^ 7K,tVA-G1&mG Sjy픢1MpX+=+roKtuXxv,v-jcH^湊_;<-,yLWE7j 卌]З3 3+G&/VIJ|Ec1oxܚ'n<09Y0f^IRuD ^Qaruw%75WWe{lVMS?I\kIRo`JR{h=& 5;,0 4I#[<+-kTeh^͢Ax)3}BY6Z9wAZ̍:J8`)~B7=}'[*]qtߴJOZ{7;ͺȺ6䛸b 2=ۥ|(gQ>rCK]P؍8$4a.]̣48OM{jgaRI_eɌL{$``d:1$y_,ETK.4H&[4R<4)ivy1W#(dƢ+`K;sBXr"PP, GyJxJ z`LݳXԎySZnZ%mOBp)=Z2}XvV/L -Z6DyF25jBq{''$t ;ܶC~>hpltJE*25iuljP+Uęi7v42XEv~k5DLty%\1uBET?+nͅvuJ XT8ʋU!ȼ\.~wq$gY;һ z|*{< lV8,q-GFVD)E:-ϘNWjo+ާIBZA"03gQa)}%(*EǓ@;Ƨ +n/qǻ1^!>t"GKw+y"+{"r/lW~0:r:teozW;rYv`irU)zM۪^btɚ)2ЯWgl)Bփ^NތgR.~ >̈́t–fô(1C'as*sL&A3٠-bI6 ge B>9%Ro 9%^ʇi^]twN;g 6F;fQSnVlyD96&mA:`mZV1,x82LfAƴ=jF_o$+;|]Zӌ"_7 ^2f Խ쫜&0f8W:tR. w{#R)99}pWT 2G |2Ч ds[$U$Z$2Mΰ %|a۟'3aYH,*[:nhIO&D ,Qg^LJm$зO/M:|")`1ě}2MhU KLuL sk>}ܠ{а?F xs ʥhVX.[ cL?&Vf(\%56bVM 2xRoTck0 @^jG6qiAK>CJ/+訆Az&Ʊ R%ۑ OW4x{WrOmWL>?UWF8y t* d㝗vyJ_3zE230]@D JM,c@,ۊ7֨RJ`M[~uk Ng0?!?]+^KN{Yij62{4"UCUt2V6hys͂y*Ky$s}4>DG.i'EA뜢ߤ¼%Vg"12`a=Y.啰gTg 9i(ſO/ۍ~4kANK0v1T1[i'"b@\$dy =p3, 9N{/${W\q@]q=+ݻ+33`.ldKoi_BQή{5aB"yCYn;1l`1>3%%+*/д"2(!4=Dj1! |vbx7f4T%&\@1uRJ1٧Aj"JW73]F]ԻY\R޹aJU}2᝗UzA 5⛙ԘI۵r kV\Tn`|ސj(%r=+`Mҝ¯Ro;v mdw%b^¼rjl~Az VOk 9^W!l6{:t+W<"_ 9h"Vd~V> ;EVy),F>])ৡYql M(FC޲73K \,glz4_<-iӒ<4so)sĸ cQ!a)704c.BeW EaNfgA8_+bG~}<3 k0 C?xfE9iSB>ِb_0ghܰga_-np&y Ey *D.+*-]D^ _Uj$}6L0 iwXp$;{]2ݞ9C$ P /敘< cCY]q+ ޞ={'Q:tŕQF`@ U^CVFﺴB|iip1Hg|2b,8nJA4kx$bƈ7<=?I,-ܹ`;dBqn!3èȭdl .&$8ʀA  "@BHh߷Zj[g_WXcSTOߧwN%OЯ ~G!F XbWFwRҒp*3UsmT\AɮEH˪MdQÐq5 ;m.EtsYyV]U,:=RZ׌ U9)EGRyh),q%_SP`7 BW6)ThB%_tkec-[7Ậo=1=$K3Uʻ9Ji_7) ԇ@?,r/~k_Ї8j'8&-&.Kk[r}ЁuiJ6*m2')z"qsl )aQZf j|X *3JI-Pϑ#Z43-A;3c2`g5{\h7fT@F?B)J(ɰuhf諠f#2%x/{#..ө[!cl >n E ڃ]8~88{<8+_8ob 1Irk9KFnՍOaxL#~<QjV=`IRL5ɭXĔ=gFUK1q [K⫌<!?DЇc7^Բ[%]dCiHWFI]%=,3JLk ?*{Ra8(9ٕ, S(qҤ"ixVJe 6;J &r:7둅}I4Wrv7AGIl49i# >vA7czs,8qxpF1*e:8Bo10+"M|xq`6I&G}%S_W𪫮z-×@>|X[>jzj~46x3{׃`NfuY)9"Y'YL/Һ`"3:/n:o%$-.xi:i֏ģZe&FZJi!^X[@E&5v|C0H܇]*X{ȕ(rҔYw@9'8|t C:i׸*T2Y#8TmLS KLi-i.(cvїiHlH ͛r{a6c`sR#mD' 7UJ_<[D;yz߁dn[R#dSo緇tG.?_={Ç@0T@隷^x=֭[oc{yYN|oe îqVJMXz|$s;KXrTby?R|#OASܱT@7¤Tu> srWSr*mRҥQrf qt'jT|X,jX&ʜJ*蛧}lGDvG/]`FgpmW Θ fd3+xO-Ts>ga&d[N %U9*vu/MS l2BF6ǍG~!ZnY}f,AOI z "a.-7;hh_OهfXC_b+j2܇>N:']ꯎqЇ㳖FS/0e96I)8ou[C Ф?1~k%,7hlƥLc)xD_pJնilbC23wB#7D˩:tn)SI,#gV3?iϋK)$Ck\ɱgsAuJNI| < v3ZƂFOxjFu]٭gǃUpTpVAjUr%鄲U NjOq72s1Ŀ<UNX`v89cN/#I%j 癣brbyVa64{?vl^ 3n 0z{tzz4n޼@>u,B>=,_\&XoeA vni'r)苐5cܣFĢd@z$=K8<"$'bBԢWi"2$sÒpGbYdj+Uwd>$ұE`R!gXx0|kǏ]M_pǶ?f^_2e)&3c}R:gծ4%NQk[0ZVY/RfV7wFuJF:V>q' z`B[Ϳ8ۤNvj<1=]%EZa q.z5t}OnK}1><D=X.:WW^ۇ/}8qϨ>tzBR7QUBH96[KXVvyUXG~S5 }a'2!锉sD ųk-;E r\)F `x~⇎RpjG!eG"ӔS5LWF `%MHXhEy0靳J|P^&]- y`ς? UB?|f48g48tR ms:fA=\Z'#P u$0잮ح&BHs鰻Q|.v6;ȏQ59l5וi%. qb@}x`*ޱzyqBY` o3 ﷕DYz lm2')% ?aK1ʯW5YYEa[$lդNlߊibA/'ME/+(Y_VZ"|<&8}8݂ʚ4gLKM{k4qÍxAY7fƂ3# R3l:ªT J+5z& 3B'Ų RZWRϢ4!KQ6~bjm<<7t *cQv[!nCEԳrG@78]?Ƥڜu*,y> z/Ї@D,:~^=q|u:Gu +~SjpQkxG#dw 9<*pIU :{f` d(J%aS8*D(QPqٰ5`ـQyR(W녒$0J=k9y~1k z@lPAn \.'\yVWgۯT >|z4f>iv %Y;OwOPϲlsbƙuҢDKTݚMaFv%/ 939(6?I gۨ2Z!T5 VՆNI&o]ȏwY4\] -eNxӇ)(.><80H@>|$=2{ڤqIxOŕOVZY~۪k5@X6V"[y&9rZBUJKK#kB&[fޚx2j& Jj١j)`~Nn>[}>Uզa}6,Řf>I2v)=_g& fV}x}} 'jKZO1]}rw z}62IInpl5Ƥ 2on.s_^Sglo%f8ir*=&Z}O*Ux F9.srcG7ApXwB=]776}xqzzyqKډ+>쨶`],ΛaYdŸ6bϰJ)>&X}ًm~̊b2qHP+4(TY@5TK0qXb`ryNmHJ IKeß%/M^0'4v4MYT[tқ5edLQ=_5jbU] ,гL3H0[5YٲU'M9if\2(8|Qk;xW^0!ܒDثy)M2Mz(|]+|#F7E<ƃ-2rs;ֱYgiLVfmoA x v~DO><8 pj*>::r^=q<&{ļ5-@YV7(]s$} :Hwќ?ˢz%Р~Ye>-Zˎzj%}JY@bK a.Tj] --{s5pu2 "+MV]\,eV5A 6ƼPo|MXA*(;dt f%5TSD^M_8^k0/+Wz;@p_X|eN\fK8nm#BcU0R,OΤ-drlLj0i)In8hbu=PeHݏڠ>IJ[oS͂=?̓/a_PoivG{4 ><8 WP?x@>|X[_Q=Fﰮ^&Oib4krH`L"k2oHwV6"|PsShg>T,)uËeM0*ƹj$M4,<ɪѨ!P.iњDT;thIstZVj ^mnC ;dpVI)cdx֪I3{󧂳3'JQ=uP7#ɾenJI~(cMMJu ֬1zf:q7iv-$rahRӌ7RG黂el9^/(̧NqIdS)><8!88 8PAc:xEtu{q k߅/+7L0zAK/k$c?&{[]'QYRa)a _͒~s ýj+j3~( @M|3'MԟP8b5(Йal) oUhf?{:ű,C~/n *B4U2@{+3ze]a٤SRV:-#( Ϊ`Ig/}zQjQfYReRjLۯוODI\B%]rB\_Ӭ1pwtdP%a{oo桃'lr.Iۧ%M3 -5(ڍRܗ˫g2cs2u\><882+l_чcb"0hXqj}yoV+F zΛhM(5.t5\ \?ܾ9&YYu6K^<fb8]+ڜ嫞6ٱIMP3s)nŖRNlO abiHw.s)*@gro`xPHώM<NKkrTk?x =Vw7,,%lX .U:%/˘HMmQ[:] pX(zH^ e+G4lgzh7:hmGy۴ i%sX.Y?' XmY%o1CH_d 3u+-oST&gCs9}?,/hF1f׫ycl갚DY𶲋 mӉn -!ٮ옿UiD}W j tCYnSfhEMnRidX:]SF"k~jHk <+yr\vr b: Jhlo(ޞ<zGonMꃖ7BYۭRbapX%)އ>~p42<4804Q_#!O}8Qqu>z_8k5~Bv) R_fM-F H[wj>#wTVPcǹY\X{zN=_Ex_e|Psn5) e"Cz g գ⣌X.eaf0i:\2ތP83ƿgׯTDhWZsޠ9䄊7'v[t`;FN䕔?"ܑ({u3ʏwM {9[%Y]+~7+ƞvWHm'qmey_O|\R9| Nvv8&}8`wZԓ%z-|rmzXNQ}R"!_vB6J;=$mL5f* /8Ej))_ |,1 H'Vy%a"zCg2~F` ~tnҩ:O>>/U3A]c*YTt3Ҍi8,Pmd S9r9`Rc6bjR(bB`BGŌg)s5e}2(*z7j2sΎ1gN.wDߓʷ4βRW s*휐9b>VEحS?Z㠟Ҍ <$k5<8=p42ܸmo=K!lᦺ߽rX}8QvuW:r8{w^Ey R,u(5,;85 I90RFa+~ճO Z%@Y kRP5GeG>A߀JҼŻ@Nfy2\x$ -ϨNQ.d[uY,%kp)~>,H j%$KRȲ4G+Zl\gâ\Fd*]Ϭ[rz2jysQl ͣaB4|CmS/acl[ |xq@,~1O?'**K>_,g+y[\EuŜ+K\z8@J.aece~"nTUK}l?N]Zػkc){UR$(&3+Wz~NN9(H+;^zQsLkx~qI4mj u.К쁹Fſ1 (yyU2Y2if5Q,C݄*nt]ˤ]S-J,! 2]Pԥ! ~0_=rsxJ/! 4D=:'0դMW[X-737絯$P+f5Fiv(LyfY aZzػcC,lLڧumڕzـ:N Lb?טpj4Iі$i 7A"̒(!,KFh@kI,)Jh7%?BMF.M2$Z=70 .[fs!&f%bMzKՈ+mM*gƿͬ1εlZŸ>لji#1Ux6$;fK ;U-nS}}*V|˓kUq3ـ̖ùDaϒb@iY`,rz@)^Q Z[qK%v|ltqQ5flu-cH/4r 5--bN-:C4!BJ x=|s$aW:S(p{~ Ծ/0S nKI4Y1V l2쫙p6^gwȜX|vᒭWH;$$ GP~oICs\4LnS|_:Lj*W0(?/f+R_ =q%5uSgn|Uq^A:|!PoSŬ N'*sxN==BIYXH[o/ÅPjTa]uZ|U3a$Ϝciw N$-mQI^>_рtxlpV.iòVyQ]ndy֑M4{k9Ѣ|dvy+9:&6iݬ4%KTFWR9Z&'8̼54liZy@8W[F, TQKP[_cjqR^'ipn ioq!Ql̩?:nk؇@><zǯM5(^ߣCL9Dߌ9XNXU)߄XN^)$M8 !ӕ0X#cFX= Dal oҀchx+d#w80ҧLԤH^Up_0k>/ }a>ƐR3C, 7,P*j,АLf!6)v3Kr&ݬg$y5 5B^GL$ e S7 N5uVI|t,Ux]A(k`_Mq`xTvr:A;ug5m< S*SJ"n}}x@>N8zɎzU|;Rӡ"hɐS,on2YVq6kSzaAb藗#y:X|v_2Jw"ʺL|bKvΒe?eP|V6cXX4K~#[UnZ;(5;FuuW:[mW٘ ;#Kń2-p ƥʅI] {5Y%21Ni3)!{ &MbAvND}5Uk"_7F=4NqJj". ӕhXJ+d#lR/1C:Ƴj}{,wOBU^^~{al}Tŀ><8Bmc=q)5G}0qdHd+N2ly# e\qyz;Y)[nf٤QsYmv> zXogL1'1| SNaksx}#Wy`F^F:iɎ%A3WV{]8\$ =,)$yتj#{Ef?a2J4p.sϲe#kToY?xc7r@Mb5+ OM9p9]u^7 .<~'ݝbC*>Λ}p/.zګޭQ/ /?>ZZ><z@>~=GxUFJI9jRD@נZK_.)6nKlOR$%WbQN5ch=Fi9(,2O>oD3|~L:P%dSVa9N<89,cgI㠐i wFuJq5nK=׵|X]e`HAc*i˲x ^uj5gܝ E't<o @(eNqˬɵ;u2[ ZH-8ߔ٠~ Qb0LML0do7r]Λ sA8ůrvorR}x|<zᣆ6[Uq)`k'aV dͼi#:K踲:GdP_?fKn Vy .'{UJ*7U}`ș}@IiզYa[^ɮm)Ͱ*6vO골 ~i,C13%WD&u%ulYDK:Ev5\tz1Z4.X+2ơeuL!=C DŽS?8xria?O0f?ƗVcr$15 kPsKZƑ-5;;J*sLSR*p-l W~QsIDZ>Ӹr@>|7zUA"h*Ό 3&H/^,JG+YBzLZzVת2E۬tyUt=NI^Z;<TCRޒWLa /Y^1E[E|ge87Xpauט=}ӱ3 Xt.v"$4Z< uqf%͚\\e ~ M[8W8P<dJ!Q'ľz̖cbESw+Q*4$!ܨ%Ѷy)4fA_C8f.+^RS}N`2G=QquMūמc-=ª;Q^YCH'ДڡR27C@XnZdA+c7Ps VVsyomjʢք ]0ŤTTu^ASД,~,®ɩ,+(y+ 3++NϘsьjLh[,ݍhX5",J:LC rr#O2e0U4'D̴geZ8ڗQ>4dNSנ1# 3PU`R$93Z I3nP]ϡ[%B!mj^$#˿#$.9z)S}xT?}6Ӛ׃υ3⋗,|UWVuUm%#eS3\hyYZ)Hi*:zEհ4ƘV4I WwB.n-ZvpUg!E?)}V+br(IK=s@79/яU0 V*=lU U%]3.Z pBɟC=OiZ}d?DS2πy岚rm?T]j|ϗ1_Jص|{'n294;zzdG8/|jIi iټ:f:5tnS}&d{}sl^=Q3q{vn4c|eb6,! U=&&5Ygv<Jhv`ZI}u]p u5 e>L|m.r3q3ᩌFK#/lJ¨!FsZ23]_V(mD$S rf;fѳr\ N˚s^/F >G)U' Wl:nZrl7(z 6#hy6i!U y/˹.9vYWz <+Th}-tƙq#$>^]I|x`zj*~/~񋕇OO>`/ 6 &YnGV,-W}eYBhQm, ūrK'ơ?֡דmVV!e<^ߣxN^d@#Rj\Qok>`7I]RNI_}2x|^{oW>x3{yG 炠{,dYvшZXdM5缕O5܏2%}B"{Y'7UYMN:$fUGn)ȃsA/UY%¶mudʘ:L=@t~&]O8XߞܝsX*r{@}p~b@π><aL%''b_o<zBbq7Y<_Ffz|yXMH^aVfձ޶%=*g=na eB-wo,0"e&0;AiyW UfLrH`=Б7& RVYʸ~*T09ŃFX [E!룲_ 9:zZ"4D2*72z\ۧTWPMb?4rvS pPkTm6R^_un5R[ x]ZW.>), gsu{1eY |3ynAOo/χ@ɉX_7@>|^uj%>7/i8|1IRǔnsTׅJrN1,S^I ƶ1MBNe S.qh=ȐfW1NfQmFJFzC DzrX&m@`d`s.p U>N8=J,9mZyeA0w̛aýYMn2ǷeEʉ]١<~R3gOsM*-h2% o8\vlanycb:?/q}N8!ZZ6X+JUK}R8^.ra2Wb@}X?V/}XZkTm ̺78{RJV$O8ZGboPZ뒁@7ehTYy;fcMؓ" ܽd XVI*~abI e0XOyy܅PePB荊OG69hlsA~|A.yl㎃a!A}v%MxvC4HcP-M&^{9W9lr;-ؓrgÀY ^&yA>5pB>y]::}]pl3N3{/ZgnƌGK {Nڬzuh&yχ@&cЇ0}kn V_n2n(L gCM6X<$sJ޴xݩ~e1TH{ 85KJ RQRI-IK /$y&He ,mS̒RZVۭ6]I*2cI>BgTzf$o #҈ȳ%nqޛ@0 o"7E̘z 6 zyN)a@ڤ ̰}$D$2v (o|/ s?b4s1C8G\K+%rnS}8566z^=Qq@A2yMRwpՅ-tZvxz{BܷK,jq ޷)Qo)3ЎE{ at N#nvU^WXYP&aN& )zI * kk9!T!ZQf&0e'2!2gVǹ ѩGaҐ>$d~ AfcRE&Ѷ2ug`Yi,QϬ=Phji=d9`˹Wg!LmBf- [ V!s} 2@%AK9}3y"Y X><zT|ttX<zᣆ~%[ҳl c>,Z0c5$  jXЇ-39WR˄Bb6zs@h]LNj,[ť($ _VؑUM *k DrEoU!^J%il6&RVKqƙAiFQݠR+׫̈́ !ˬv?8MWٕỨ2J;%rY⺲J -;YJ.k&coZtJ?6ᨸEqagLlL23܎2}P]NcU S\|A@I4ݠ&ʡ~~}ᨡ*qq~+B0#b@/$ : 0JX7>(«u:l#n3NDKIEeU`ުz:27Ǹָf@R簺n^ p= pRYe}8dm Οj.Zn~rf5T,vkJ通ߟujQWrQn|~=suSNvZOv$wZq(۬(Ƹ"?1!*QChPqyner&0kWrؗ%Z1`SG=聆}C{ O>~Ϯ>};O8.eiK.'; G%bz*WJ' q@$RajR:eFZޕTޤIfc V)ױױ?(dlekS-R&MMy۹nͨ ®,Qa`A=fљAl%1!oG:hԧyT*"ɜ ދz^($Ӹx+9$-K\-:"S Ɵ"YbФ>.[F犚x!;6 }7~=>[z:~B²mv4_y1`}X?n6-{D(EA-3;Y ,4q$Eŏ8uRc4U=CcCj-|BIrA>\2a/̭ӕޛ^gm`mrRl:͏q5|I>Y[(\L~˰kk˱NUJf,1cNvO09M.ΫeݠA~ὡͼ!g?p'`UBz)2TJ+Wc&O"p}@逃}=]]mS9@>||\R#=Uy7x-&>pD*xIgi_$Ø+O? 7@sƇ@3_}:x087&*3*/R@c! F*3+0l. zo*4'E,2hgtD O)*F`.qUh YY6`F(z/M\~ Xc+}]7U98 g&-u_b ɌgXՅIǝaΐ4F]Ze$eꢓfZr*6A'mTn'4/3 VPKlg؋Vb\Dk~+#YZ KŶ7rav'ǨgtᤧcuV}xЇ^-=#h'/2 33mu˃mƳ|8śgJuaB"Y+&@=N5)Ti_+B Rb%S )NȑYr\K #):GZٷ_YZRB4EdKKPYutp 6;(̘dx']̐nv,փRVJWo7=Y Hm;\օlԏ˕SvhQԙh&8$9TBϗ OdK1R'z`Pې:g^?) "rQLsۍ {:l5Vv.><'7.<;:ψ`sseewJU50Vk!"˵R/&egDBNt1E4gܯ"(4a5NɫMhجfavv6`*#VF>36#<$bie<Y1J&Wҁs:+_^kc\Ϧ00N.X'S?SJR-0 Gr"_e͵P\#qzH { a峢M0g Q2^-*:vsf>Of9ܣu$մgOZJDi 'j'K><zɎ'k?i:]7g_ ^aFJKHW/onjz$υWzV NI69e*.BKOZC˔L*WJ?*v{E)B71ˍB1J|w̃B.sldDz$ŒذlJ6r-яoQuGXi+c呑`6 #壗W֥~Hu3Ns8Q_ŒGa[y 7[Q*#vj{i+5+e5ry ovvciq#fNz%gW5h&rt> nMbp_h}@>|X򜄸Qt~d 낹 6!Ԑw bI ]pCpf3g9w\MBRFDE!ʙW]Jlu3zPLԸO8Y'SI'Oy3ʸaHf aXd>G-M*|Zq`5򫃳kqcAvwC5A\wZؐsxsnbV_8jcSRe Yd;f[Ie:.r놾Vx[$*XGǒ7p8ow'F&lcJ0iW)6³7%GK,><zG#Nt\ tU=|Mǥ`F[eKbC9aXWCT]ŝ&܌+Ip 075ih7H Iʢ32uFé;L%FIx6Ζ9bY1âZp*DwI6oc+ y[/3۫f 8/-C(V7HSBWF#Lqadł.'>@me/m˕Nn1'4Crs01[+jWmɷguF.U_S1΃:iG { NP=]K]*tӭL}x@>NW'?רYe2"ϋOfi >'zvآtP[c6^ jQfY.|Uum,4gRaGR߆upڌ;JLo֚@Ga˜kؔ%IK1if1(̣= YۨKL:sV#Me M;VT"hTMVs^,֩}J?sxH8S_9H $:0J>ðL=ض  %H3hf`E钲-9ƴ>׈ MD^ wAr•V/˄ӥh=ZɰV@>|pwWVCV ί0HpV (;,Xk$S}d]8$ keM^&E:Vf>&{Mdb~I#goptPJVD%ѕIC A&@˲ 2P~vi& ସۑrB@°Muf<:e ^Z%Fv@_5ٲ<q)Oz=}`70)Ec*A0tƪ)X  ˚VYw20pA4>jAp%I.j!\N٧:>clT|TVz2|w,E.a9uCpk8EDt Уu9'|32_Vo PC@oIC/8͕A9kKNuGc"}xЇ޳'ėf^k=;|-g%'12 CxǗ D?m F[ZvVH*#kjt:pŕD[VjNaR:o-׃02*%~ 96:EQ?cBwNU|X۔U +5%#5R'UףhQ.'+ͮCC:K\\I]ChsC?.fp5+'z;kC|P-.qnvRq,+{ܯg[/%s-:><zITvcZ6+Y+`?/!o~}J풠c u*_(hPc݃b(w:[Q_f00ːfB@Z̜., (:&X7N=n.ㄥyj|KUm Z^Ի h\u):LA J݀ ^56 wNڿ qXqXeC]`Q~ ie&) R v\:isv,pd A4>aOΎPb YsxJ8z'w,2O/c*NO7pޑG(;/~><5k kMLV] S=gY,}o Uc ZgJ2=45%g 0 _֜s@(-獤;v2.`zW/q3ƛvL)$.ԭXf0 6W-]8cULk\Ȝd<'.Yte0tNUb ݢ*3ɐ-J# 0ޢY Wݫ$tfaJ5lJZI[{2 0FC:ojfk&ue竧~؜GBV}$zЇ@}w:UZ6|bmpI+ FV))xʾ[= (So!- s/'Y<^M ZmP!^NCb !Ĭܑ|r\f7APa]0%)Jь%D3Fd^w+E^Ys+mj\tfoyk5!ENI+|TDɼv8lժƪU&N1~q&>ڊK_&b̌n c<ΏjjT l>8vI-c_OM{.>:r)"죉}x@>j$:%<'.]{SCRjzUXfb-pc]kA1fG%ēv6 s; Ȱ$ YW+rj!wЦ *P\ffy 88ֹ4*fGN Ev@aW̗HL7(S4fY5ƌdΪP8㔮h)1[NkAw971'3uuT' 4rmjRl:`G՗!Yw%V9dA`s6Y#5Zj'#(|/.|? Cў}*s>/EVS<5Y=JN](8Bn!G#I *0&E,27b.pa{X߫e6W1-i/ S8E2n$لSNX&)5Դ +Ҳgh&=@>|R'(;4gm76@OM0HIXߙ[K5ez Ix& K}B'$ou)Cr}VIc[eI0alB-T8tS]@SÔWa?NqкوIVaxQvs>v*t)&g$=qGV~0QեLZ̰0yrHɦu 4jFZ$ ZlW=NZOQ!Û[ِư#FFNLN1ٲ:NY^l]tL PnBYa }ġci^=iI~5w|0iUXd0Kzi2~d丘n7תZ*"~e=]D#Vv:7=ڗu*p\)$CMqf  ?|as{X=al|Ԉd:fv5yj *[]UC>8c{?e_" PVFprDdXᕕ^KsD⣥kSoT/!PLQbBTAon͕-BPD)\E8˥%tz~Hi5hz^(L:rsh>+ 5sNJՅ+4t=!U 9$nh& )I}*K§o1No}59P;̥}LW8C<<+=j) ?rq2B1sܠ b n$1|?#ڿ97!W>3><z@>S̓jp"ډ% ^"˂6\}e#QƺDèf;%ruΒJ bBǭŌ#u֨& ^YK/hoBLR]3{q! [ lg059(f+:fjpaT(Uclߗ 8-01Ԥ,0FGB@r4Pe^ m&5w:b)@JPDCNEU54 RnWn8%T#?/g&.[xll"8Bq _[xs>?@1Ї@=z֐u'd76wgNS]qۢ CYO  қ.@s|N~V  RdhB-(MU엇Bɱ˪)ef{AwB71GɨZ0lSS(h:fsdEh_4 Y)^U2J fPfdUiKjT90oYfJ3ւ0Xr&̲֫9"s~m0I;yA.aJ8AWhA{q 10Ynr`ω*پd2e.Ooa=Q;qu(8,u&y+*hpA"+/`LZX2M*< X ,+bWWhXIv_/R= 3.nܖ/;irPͣ|B- *[KiǨ 2`LfL6Yং7w}>(8>. J8PUNYvSQbH1!^IؘalYxysCͨݲ(uQŹ˸Iw5sӨɛcq;.}L!&~ ]Bw"b@ܜ_f|$=Q;KIpZͿY;ɴ$ e;8 ɂPSfcyZ͎Q-'b=?$ԟddZaN@cXC:RGK:5ҶUfMJ(e:ƿRҲ\eA4 lVrQ&u23}*2fIëAlv|IbBVz2,Ӑ!NRaLi5*)w3|.B̌Z]ڹ#9{/KܺlEI{O 3DۋXhA٪ݜ4Gdǹ 1`Skjt;Zt!G^@>||ժwmj2e|m㬛ǘf$s  ζ!Ԧ%qPvdUr5)<B\p+=7(鱌DlrN.8}l r"o:y}]@A]- a^gJƨw!rzV'80O^d껲!#&rbϼ7~i(qJ*bYA bMNFxցsbOUO: Z)-ΘybcP7kJ䀭u`Sve*,ώ@k3i8<zǩs;ZEcM׻md7X? Ă+l)tVgpHB9ad^"lӯ5^_/]#,5BMHRp] Nsb,Ϯueݧa+b]V:$M-gLg,XMպԎqv:3`K}_mmոtjѪKkG: bA6Y @ B}Ͻɽ_c!@+|sr9\x'5 VU(Ö-l*i6c203PMۊz\S|kXBg,pIavLZ[DrY3jT6!eP6&ߌ/Ib%j2zt<V3 6;`?gRVJ@I&JA̖H3}s7y_*ʈϐ:wt$z U'z$'FKx2D/0SB]ִMl>C[Lcazifb gu0vQ S|E^E+@'80uHDyDJSa출3´9na( wvPU`ӎ螺b|{eU34Ge}h!}/XéXo{e 6|=bXæi4qbX2֞wԉ7O_Ka~J"ofUa|Go!a{ L^;Њ? ܆ׂgZ#mV\vM3|& pD/) %P(I.^t>IΝǢuVַ6`Q:p.wV{/^k|-bbXa2@&Vsa6@$nIe,]I joeeV:g{ p;aJC,Y&$VJAX*quX{0pVfkXf`INae^Wh^ЈHZK؆s%p>Yz#uZL [L{04ggZ\SY罜MFY8I:˩Te"|4,e|v $$ %Tѧo5 ؅x{MtXF:bHl; ʏ},0 VƧR _rXقk(v5`& 3mĀQ 0bUnD%R*@M*]0mnRE`y,hX|5X>:.c0Ө9dKLg pfPa260R r[ 4-4֡[Aմ@22zŴno$ k9,3VL6a8^HbRM(Wa>mg!Y1ѹY&fvZ'[YǛA1f=|~k5>S76+p+;>{f3$|:K].\r'KKĴ~X/:|Ԇ=lmx)nb?r΂mO,kaW˯j/-oXH^_Pg _yҎ)mTW\/!o>hqsmBZjp1埩v`MFcg{v?.i+Ȃ 0=ލ@*(Y t1/fp+J4d=cH23Ts} GaD6]L l.dO cڟz%fX)OJ@5$β🜾;|'_f =/0 ^Ekk&A+uejik1()DbЈf,/yY5BtCzJFlRvBØ@L -t$fԫů+b9m]||o晁۟bFVhBT3jfщiy>75,Yh%p/抙K 񅉫s7'๐nr6܃ED RRC'0Z{W!ж,|>' %Pe`2CK<-d`˳"/ܐD4#omnzۊ!`WAYgk$52g`PX(eVpa1X5hYO=o{.c[qe4bVTr _uCje2=4Sbz l>ݴЗ qU+npr?U  TL,"2D+q+Wc'v/eh!SrTӐRw^p] Dn@ `c)`0 rЦp?I( $F>f eę2@ ?nhqGA34UXX)) c6ҀFwpE>c\;m0-LT5u,)X ;15JL HW"Ŵ1Np7jW~0KL,M{g vV V&;5Y%VpnxJr M⸕ ZzBp֡+{Ld-]J&71_!%}e|M~P %I}Xo3aXJ[Y-C67 jGT0l8jeMv*; }1 RRߕq z+ 1Tj>?ҵ輝h|a:bl!؍GOWO +P)л"f .AA@^LuR} eY\==j¤{ >[6hLebx` ߎUbլdW=6|zˁֲ>oeW> PM(I4a}HQH#T;fV3V3BQwL;Lf7X}=Г0w7%G|j @sՃZe.:Xz汴T"$ge%J| G kY +-NrN\"`'*9}6ĘeJE/auehnxפLGS|~n <6Uδ~ HٯTlK:f8š0DYl, OUnZHTĖ $ Tk[)ٸ;޺~o=}H[ hI@I&$jPO#Bm:ޗ@K?lb/!7$D]/AU9wM6:y.Ge>^FnJ8I2Xpi.\/XcgalͫhS S|(l]6-/1$O3-^+R- Y1P2N0|< 42IZNlݍ ۣ| C㑥5MYI-0cE`325E3 +OI@I&$؇odXʺ$-Cގ. % P@2d!ͣGNTCc z%gY 2_ c"]1geLiݸ D3l*rĪHؠ՘.q߉ArY)N;G$z\$13% [qe yɠ)@#4&a7v#e"hۊUn!/s⁦v<ӏ6WaZ\ 6gbEffiq%87[",#[K7T̟ ??goxp",ވ!GԺnq(WGcՕhX@Y)[oъsIųlRY(m(A؆a|36ܾpo-[>-3Fw9ϱhџt@ PIJ@5$ITNO,~%ˈfTJG}7_ Kbl]+"=w_q -n!F&an!E%48鳊rThvM (J4ӊgPYTALm<54$b0zlQ5QV &@+>T`[')f9X:U }֢&[h^2۱(L@Y5l|A#+;6xicAaV7am|h,wͻw-D?~Gy3i{Lf4Hw& %P}i$'tOV].Vm@x/Ƌzh%\\'a!zX)xoȍ9}!&\(y(H%̧2V.xy c{ES%ac%0Xl\SF1`@SC_tKIDC &(ȱJh,a *Ľ5(U ƈQuP,Wv!5ƪ5K[d4n 1*/82])8ë́U߁{ 1O頙!wByΝrqۓk;aɈ$$TJ_}k|.^ړ_8ֱ_H*ѹ2vr3cuGV#`p[ݐr"\@4apVA<*[ AX ۉ])p8lcJLv0d/5m9 ķ|8n)B,)(HXwqEXZQx[BՄVVioAEWq=L"8u25c\p|j-Nz~f #2s#LoF3h(|x45%4[dżgCgQYmVwQvb Bx>y&ˍO?vgP %I2#;aY)z1W 7~0̚w!f в or#Zܑ Y,#nae9@qFWv#v#lMHe OZ UŻR˖b) Ic:%Әf`n@0 g7sz oUaTs0clu@dVRz~HGq}5o_rYJCؙב4g,l+9f܍{73݀ Z@*L /Gg-Yy|Oku$Xվ*ب1/9u}~P %Ifg3MK"ƛxq[o"e#뒺2O=bV kA7ĝt\5-ːa+Apa0&!V- k=aq2gnLX]0-!S=SL]+hA7^t=M]69leMf"y᚝ t^MByt<%aͣ]hPǕ ؙ*dizV衑jZ3Pۀ{O+ь-ڂۗgx cҚ' eGc+|.5}6\VX)t ͡oSu 8!*LSu?I( $n's&mp_iifo LK`覸x.LW]0BLm(߬vGdrA:´YCBXHXl1;T%G`n f#1RșiI,c9RilO͢j37llf " SB!q)JÕXH:C߆In"X{ S`LODr㚎h\x%|. n, Qb 4iZ]g"KyW`Is'c;M-f&_ ׬{^E49/܋O|lUn$I( $m \Gt"I#`𶟄F"]엋`YSGmUCnG;P ] .hW4`f2+:&#4aN, >T'ϡG1FVr7#\FE8,-֮0S}~OU|1ܻ F<<9! dma Hby>a]G`ѵ u};xZ,p ӣŠ۸䘹s f%E yko VJy _us_p}_o`z ٩ԠI@I&$4{R yކ_GuK5˶_dSB|-tU{XNy]L㌕ `hAp褉` :y.5C61Kko Ū!nlº 6ȆjncP+De5.2LY,B*ߥ53Xo PKa]fqy\`}dXM\c6?O;,K±"M|.M0϶Yq@Vlm`,y[9wVTIkF5뗁1 }ӯLvFP(A|B6m]xO5ɛ4!oy ~d^pLQwC "="4ce;̯y#V YAA8JHaE#\Ѯd~KcSj=jNƞ54faVY9 3@j;ӎ_˰}Ƿ5xRz[ħW2#kR@\mk7&HIJ@P+ͣY@+[78s?L3W;3Vqdynt4ڙ+r3o9,pw$$T% J1M05#+gbb;F20ȤkcuusVǃd ۔̈́ĘdlVsn`%x VRYj75m,qeIièF̪HW3"Jk&@p-<6Ťu[TƧ0KL#52[K-6y|^C@3u0ڳXhL~k,KQsXcn~IjTUI( $S |x+nv CA.-ഹ$eѹL08Gr3[jpG7Hyx^_ZD he೚8l0c@XKY= ^,NgƗ%Xih/wʘ4(5f.,J jeڈlA x0zȳSJ6!@k*2 ܧ1{[.<)+5ԝanI.v3g)(W-N):Y{빨wYL&[BC{?f9S>I)oPM(|)} ?A5~73x_+LaW;f}>;W&a ֖ F!5 7篆Wa +·> *3-V*ysb͂+3 -/q[0 zrfKJPLl/c5#8bg3b1ǐU71GJ>ӫ"Lmf`WykZ@xF }\Z be 34 umC;1Hwߧ xx+kߍj\ A+ziYOԠ٘c9j>KnQrʯu25nߎwmZܔSW$J@PP9wrb a1o12 =E0-oWO@CQFmu_qÃb"8Z"n;b΁x7C6GqY:yAM/ g `b&F\ӄNF5*PKY m[ .X6D}uV"i t; m^+,Bs0BY- ˷ y迈l{A\]Ȏ 6[Ʋ,#C+ `~$n6nŠa_6j9V#|cQn{kAtc?9Av @I(JR˪ĉ2w}{- NoL ʨڟsF Q*@%ǃ I)m|neVOӬuh׫S{ #ވd,+#?6[[Ʋ=I͊eD@7Va kHbtȫ`db>iƈ,*eU0^ bJ+5oB?Z ~UuI.) xr-0_Mc}GSK,#]NKX3k)QOl1[_'8;'>p $ P(UԀ4j5I6pM0&l^G&~'e3\(GTt]o1.oRJbLR6|YD3K5Xk 1| UTJ: 0Ռ%)3G-hr?G-k/+ ̄\v^b^enlCWf X-C lf<\_=lգ/¶/?H\mR'OԞ~^pPPM(IR㭻/0}>|/r,M;ӷ:Nـ,'}Us;,5 3"dmgY%ȥyZ dy|J`ěaQi6}w9J]3e~AM?jIJAU>Bc\w+a¾~2 1ش&.Я " a|sVcýGꮸ8K>܈AW`J`=f8 ?3h-&5[UbϋXp5T`ؘoZ&9sv:w/>ip$J@P[|MxF&gaWsϞ*A.p.-Ub0fBDBwwZ*gnjh%/&.DNln&b ]Vh5V|Cx`Rjz2L}vW:湜@L8/b6_! CukSkOn Jl۱3؊dO+=: .Gb0%xL:XH@8~ -Xr (A|@.*]3٬|b;S~P( @Ikfы 藁w2F0X(ar_ҍ> _xW>G):PkvXI %[}ejZ 6 []HRkg; 1R~[t;Wa/ I$D{vB[hf3 ,d) aq>Ul D֔\,ap&69VTsM7i`9=7<p7M@ `!9Ã_YbmÈ-ϘZ٘e)t>,rށ#Ows۴5$J@P%eQ %|@;tP 0Bxga mQJ Y߅@ ڛqeΜ6LC-]u̾6yK1\l[M Ʋs|-\(6g5*}

|5Vȸn k.=N=(l,]iL.ՖqDĦ#Igb;Oos?(uCp_""R5涄,P# @IW]Oc[%oa{o7 Y ӌnsh\f7l1󇌰dU1F V4M2C,cz@S<Mٗ0kaڅ\%VtE: HUOW0I#HI@P kEV Tέ}⤣FSei(/Z%p=@ ?rNHZx&nh|\6YO0Ý ܮ&c]v/sIP tH*Ixn F3rX|Y}}&ן&rf⨄h6q̹Asy6SFr9(!xDd 3Z9Smbjf&4R 0,CK@~V ҜZVT/CYKR7Rk|t|}4 ~"њ}kvG#v4_+A0Vw,'ӌIdbJ[v &ܕ7>(OP(CZ=濕i'BK]!Yi7 ?Ӱi`F\`**g0NN2ׂ #P1 7ct@ m7ory&:t $$ %P_-QMZ,Cf8@ְ4VT a+Y0JF6XLS^IsݲC pqm-!V*z9Kby@{axI]"0,tq"ױ5Xl]#fUOd!}^OzX/h-Q4͜J_vKZYW?Y4002X@6l+,aq lç)-Ńxs=9mY~r^te\ t=F$ %)5V(UYF_G搦h8%gY Ki΍e96,qҋOmbyL]H\j ،0_T>M`jJMVڿ¾ NgV8>Eх aSf)hJ0VO6[et mO\= |D/ q>vfxþB0ކh lwW:Pه~ $$ %0Q2_O`ZDv$`ڎ!wW;4Zaњp>8:.c\^|tlY2 la,`cʛoBӸ}kYth .ALXRF9&evYt3|H4F+ᐙELk.=A#K$ٳǻ$wqѥ0]L}rtU ]66䮖'^o€~͇ N]Bnrv0@ tp?IJ@P7p :!\ta,7r:rEak8+P % ΊD;& fgtr_,a"0WnAXF7z(xWQqu>ͦ`J huPa1P6 \i\MLS1h EHt,rOC Ww5$+Bh`J&^ ج]r |>Iqn(g ɭ* %P(xʹ+u 4`0"p׻7A j|i&ӅYJJi/sS+,"6#^1{aZj, Dۙ2s.frj#F)oo[+T1בilG!Nm|Ywi^ԓ.qlGk!-K%s۸g1-,Q$6E8(ȿ!rbuV2B|m(0ӝBiQp?I %P(I^Yd^|.&f@gtĞZB gbB"p*֬u0 >FViKh[t̔۰1+4oh봖;ؽhU:Zv[)]j_&$㲻Ukݽa785${~'I@I(Ja|=NoJ5|wpßpg]AjgND/dZJXm=m YrĐV5 VKDH-p.]4yL#];+CN=A-Xz Y2i :\wuRrR\rpk'al&`J?4B0tPj%3nDFܐxvcKJ$j@IM|OI $8vX9jp ` e9LPZ@U|ucY:-3F& Apbq{6nm0JZIj73qS{ /xs Z^hڂA:sҙ_ZUю [oj4jWi?5㝻 o 9XnCCnH;7u;a*8NKFj#$$ %Ii"u0`mdRptj9}brA9Na@V*ztr@P3 tC?/&S#X5w{>1f#t5i\+gaښ0|AwXD:rܛk,ɬEW00{Ӭxm o; k9sL2RBz&}\F7\wJ [_bfWN~1Ν$@$I>UREׅp\ŜQr&fif ٘vj}XATh&wMXGǹ0-ŠA_e& !@h[\3,YLxŘ؇kgop_D9Tzvx^+(V]=AźiwC^r .n#u $I( @I<dq42 <7эst8l`TKmXJh{̕3YϬ ^ŕgr"L ka.&kpF'`gzRӓ3*[[h|0| aa **2] 6FՈ/L͂vFUeUL/Nt_ ]7K?oއUIJ@P$1lj Hd3pSz7ƜG.2W#ZxRR;lA]5j(da,(Ʈ/!-LĚ쳊ɤi)\LZfT-3ilb;nMs3B 401BezhdagU"/G:): .NLhue`/[3tCqrBL&a$ %P(IRLqAoDǾ~NLIzn@]\Vj!Y&8Oˬz91g˂ ks䰇X*!"d4_:JzYJ(*h{´?Y\3p `ZA kEX[ЖfHXIH\V }.îF?T>rCnuOta"۰p?$ %P(I~TzBZNK9J,o`͐F6֑.-K+B<VEss KfF@sqe{t$˝ A+p9.폿0O$$ %I,*)tVGtw0hbk]W]Zi/* ZX@[;Ъ0!a=|,r/ȆV#0ncpfp6Ԗn-ЯCsa?"&Hj0cg.= B #i9 Od69/~f}dܯgvU.X׽ *I@I(Jd7 jZgrōg #+X3m nde ͼŻI0Z&@=8bZ:֗d71ׁ{f{lU\?i(R̪s]^b }GcU+h-oZt2*1 @h Txs%ayL@uO@IJ@Pg \w<6ͥ}*M\٠|p\i<^+άo^ :iERt, m@qAM4mŕiIW+.5v;,R^s5Gs s^ ae lTzKjp2߁O؝>]6}ukGP89j<*Ͽ $$TJ?e7=N~/¬V88T tZMأ#I8a:_F Pb!2U>+HX8\IJ(g ZNNv2| 3oA0 Xw9׈ ږp|3.hjALf2"7d 6V(l.~|{$ {3pa{O~$j@IS ~s`Y;Vݔ{ Y]mǁ9aNcXCVRY3mǷ%|JZ- a58Z fbf–:t\&?KLd3\*0G~?dܠ&7}'JW w Pb/~$ %P(IR0>6&r^uz| KLdf}ַ>\$ me=KK@a\ Fkh"lyMǬ*|Z+gXPy+Hn&ch]L.ggu׮t_Q " xU~FA$I@I(Js%o+⭰R-pns?gmms JYѨpNDkW q*D3@6q,k!eۘ30Y]p*kXa6!@ޛ4`9L-ԱxhfT@ɰ%61 oIfnPָ_NzNCߨ}|~-'I@I&$i)81@@`ڂ3cP 34ku\- Ӂcs #0f6Fҵ"͛#;XeJX-2N33;IkA`ضFe*pqڊj}& 1,=߰1gvaՁ9Z%kl;}YnvԶ[%^ [5I$j@I_X.?44|t(kɤv-0s*Z=+?'Z"o42a>+gOލhV "Aςj-85cPI>, :_t2I26a-aPE/J=L ňdM,u_J$M-%Z2gRHP %I@{^NM,VkdHog+ k!72H^QՌY4L WngCX_+O}Fke1įVM`: 0ExeXPa}c".N$Z'*3a99Gݎ p.n$wX`0l=cϱl}Z$ %PYjob=-W= kڝE z$rY L L5et"@ijfU"/:0cb[ʈiV dr86< U1q wG.uLroܰ Qfb aybnz z\O (I@I&$i@KyA-*=W7&ov 88w#v ~z% tp?IPM(IR|ěR,$D1" _90335Xk, Xke e4d{ X!1W*tO7.(!zVŌ.Dd^1MX(r^s?x]bO~ȹ=|Vr9+ 7yѝ T{`~;2OIPM(IRěމRLep!|8ӀW[\U0wh>P1gE/W0W $WIe+h`YpFPa>m) _WZ6bp@GZ 8SZM,O;DMpzm7K?aIP($i~WD)Z_`K@\ - t & GΖp}׹e nm0X tX@vq%#_-|/nE&YݢQ3crGۙxl7Wt 'I@I&$iUN}}}*g1x>p)<8d2@2DMh 7{],+pƬ;]U&r5،y#poN"k8K,/.I{F[N$I( $ ?9&vAh\͡4V~}GOݒ&>IP@$Pi7x>Hzsʑ~F$$T %P_ʉW8-gg7 nI %P(In> } q c-OΟt8@$fZ+'8oϨztZ&. %0^p:͵$ItP(I8z`>_[/*IPMMM(Iҡyēџ΍@U$PMM($i/PpOt|NTv@I %I:ةO k`}>/P$ jj@$I=PV`pW|>9lhCIjjj@I=ŃK T›&f3@6GIjjj@I&q$d|)IPMM($ϔHCS,IN~c Iδ{h攟伣ԭ[^KMM($g*~(Y8>bT(I>;Y.hŊEy:K.H?ljj@$I JvL8Jpop.)/+{=ljj@$I t'Z% >s[~@I71c 6O|'gqC…ؽ3o{OjN]y?QG];{xמ3TS %I Mߤ+kf|WOO?}E%$$I|ӧ={ý+;' $70JKc|Ι;<#+:6esw} '.g&JIWXfY~@I[4jTq#F`rg23O?#]]PMM($ts%]9H%hg;Tu?I ǎ{׿k|GyKtӍサfE^HOڙdger)= $z=JoT3P>pz$),h9YW\~y38ㅤ˵b' krs/g+W(..w0颋bia۽N w7wwSzxW3TS %I=Œ\saNַLmgwpU$3y^8ӎ;{;{.>l f'=ԶnO O,ϟ3!!aڴcN׿z7G?]]PMM($WKsKޗrZ/%_-/A'I9US %I_Lҕ>ؽ('.= SI5P']L_BW}>GOu?$I@qP(IRj^մ'$?;PS[ $u%]%zzO5~$IzV!J;^P8w Bs0d $0"IP($co9Dq4P`0p4wM(JcY[NMg $폺ϊէ넟pe}+S$I}--͇Oz@$I= @~쳁$!677>Mg $=|uDrYA?fX;]m{ז|3zo@PhQ8?/ǘ'KƆ.[ѧu^o_Ww|@$IJI)ooUe$ ]6}m][#??[{7woM(Jt׿%L}W$I&ly]=zm-O?5O?QGugdg;Ç3aB? z׿n ݿ ?q+/O:#8b+/bP($ E(ip?IC ;&^y|`~w].eYi?+.|ڵUO0opwwUv/^2y[Һ\9gyf쌷ޙ3^{5v o{#M$II$I,+-y]u:޻q۴͔9r瞛a'vl?~NIZboHrV̘>[H1<0ujzo@}vT%I:P- -3~AIKK{RnCۯ+T^辩ѐsΟlP8⢞o 7\? |F; r$H*IU=Ν'$P|3ַ2w jr$Iu:3O&IaEOzx+gk\@MMM-`Qçil@purQ555O#.8|ֻ& GMMMMMMMP_o@USS \@UTS۳!PᨩT.jjj $%vzsǶxUSSSSSSSS6{֌oOO{OJ@`gk;m)*,ͼ owA^A~nA^Nrrr㵬,eL鵴^۱mTm޶k)Y[nڦ-)^۸9kR6ZƏi:m\k_$I$Iᩖ;yfٙ@I(Eo-).,.'(555555öܱh@I( ٳ74DMMMMMMl5Y3P.$V$IM+PH$ P$I$I( P$I$IPt9[z՞WO;Y]]xȑs̤IJJJ\2On?;SO=#o=l4hG}VTTntZ$I$I@I&/_~ɿ/_}ccrr˟gn);;̓wk}{Æ ~VVVɏ>wO1cFJˎ=ؤXW?+co;sN'?qSSk죟)))~ؔ $$$l޼ٮށt:ϛ.Nz :t̘1V$I$jrO˟{ٳg_qv3Ϝ;wnKK /}N&&&>`7Mk&55Ь+cO9昣>+;aQ8 #8O^wy_xW_=h K/tiy]tQOW]voP@o޼O?t(3g71_*I$I@Iv_]v 'xQnFyn&tbw|ɥݻc'O:$"/~+c:㓒=^9s/~ СCc6̎-^?.o /@o >;akĚ=[{i'xG{.?z3d?я,YM^J$IP.?oe[6'o*͵C ˰;AӔ)S<c43҅BI.v]^٥#"pmii}k{bԞuSO=;x0fgۨ.K򤷱Ǐ֛̦M$I$ %ڡc.֯;c=2H|7o ر#v)RTTA]=S]^٥mɲ2"۳CꫯN4;h橶I`s4yϟtIT$IPPu=o~G|{zp};ro|CukVg6쳿UkV0ῆ>jԩe] j٧jjjA|o뮶n!vWՖ-[IIIַ238CK+3x❜2emGO<ĝw޹7(|+3fN0a3glX>Ar!C??A$I$ %ڡh8餓.3I]=u˔ /4tEoΟuswg\lxхL{pzNqpOWYYw](=\;7<:~֞{z><9묳o͕1yو \rIzzwxGyǞ'NES]޾~c:_򫯾jWnܸ߼+>_ܮϷDOk׮=3K*I$IPY@rϛ?qnIpNuk<ܴq'd%x) FY%I$IP.&]oZbyvfzJ?O1=~i2[7';njO?{M{K_%$I$IJ@`nڸ~ܸo}у>JrWFsp:tW75\o}w˱,@I$I$$Ə hNe $I$IP( t`_bĈ{nII~Y/>G}1wh"og_9OLLTcС,9vA~~4i$CillJeIq(4nxժUbͫ\Ƞ*#j)WŋMkuiπ[kܶ?\ q@$zgPEs|Mu 5k*w%ԩd֮][dY_LGQw-==}ܹ]իK|7;̵ָmjՊĕ+W}۶mrX1wx  զ:xL^zQQQj) cƌQ\G{!ݻO4իr7O}z{{˧#p?{Ʌط|H2pQ;͛7mmm <s-4WPkT"1"=ld6޽ŸVU&`+t>q@$z55kěT7THY(4.f(r%QrVlr^Jr\/_ޒ\-+K[;`NNN'N'Bfn*ӧOsQr222 T騷~;&&d-T m  _v S\K%?T>Ne\tZh* `ggܽJj?Sqq4; cLf͚Nݵdf YcL6\W,Q={믿ruj*F4y6m|6l8w\aPԇ=~S*U'&&W5~X˫f͚De@-˗/ի8pYt S3xˠr… vR N:z+ĮxgԛM:BsUYXr4yvk3Ox% *_.2Zzasb&w//[˛}2s]a@^qݚ21 s=NҷoSNݸqۻm۶Jl"WVgkJHH(W6mj\Xq?Sl?6K۶mkժUdd%~de{Y;ds5~]׮].\L/{)Ow~7}\K̙3+sR` Uea}4yv&dIsc˖- ;jԨS1"=lLvKm^1~1 <V* 0>q@$!A.^\M,r<&NץKq{,00P5nݺI\*0NaQ|}}嚭jժӦMD_UOwI&rn+Vreo[ZZlzCI/_^;_% 6c ̣G>nnn˗/Wxl\rE*'[JѣG*ݷVZc"_!I(S 'tK>}Y/ݏ?OHq~)ntAZ./ХBsU%DM5Yg*ȑ# {:_.2Nݢ&TVa\`o?bl s8 P@֮Zl|im:.%|ᇴOȑ#wt~U`m͛+}X[h܋0t~aJGPZUO@@chin'[lqwwAsߺu+_>q@$x<H"x@@@\WnV`us8(F6mԭ[[?VDDDݝիWll-=++^z| &.666mڴaP֒y̙g}I4xm%./^R%KZ""l`&M_wJ[hqԩĉ,%-3mڴ|ƍsI,Xx/l&k4hãrrr<<<5jdIUӧO翫zٲe5gϞ=/bĈ"cǎ?~N@@^u=#7oTƒnڴA;w\c 8_~b=Bࠤ{Ӿ}gZ{l̙oqxZ}ʁN>/_hV @0`@ѽ-ZlذAIܴiSƍ]teRRqhC9{^z֭jղYfR %%k׮vvv/BjjoΝkPɽd2Q?##AnnnjѧOeUZ(Gw͛7[bښ]\\˫͕Ώ6Ez^͒V[Z5iNUV @0xX&uСةS'%ݿׯK΀,C=c}BM)0hР3gܸqKJ&jJZ{֏?8++K~9r$d^u GGG_@@׌1jɒ% 6ٳW%:j(5{zz~Zu$= D&6vnw ͛75kvqIGQ%zaND%!"iZf͚I u1MRZ^U)E)ٲeKEeU<91cV[[["T {n%??޽{KB˖-SeY|y P}dSr @2Y9DE!R䡋 ښkNNN:Um޼K.Ƶ111OA (k׮*$ 񣇝KBEٚ7oo߾Mj'PnƉ8TZ՜&&&[6-\~]7B wMU(F71+5שSGߴ4WWW8k,BCC.\1m\{ԩ7nx{{m7EU6nxժU駟*R˖-oEMܵkׅ ?ɚ?OHS~ӐW%QZZ6VZYc*111:t/~@ǺվrrJO@o$0r{# #l1}]l߮۴n%tv≖`۷/CHGR̫$D]d(C@< SO=/tpp]s޽z8|J*!GV$Jmf77GEN~]\>3Z>K$l"E IzR$ `؟FQ{@ @› @P'.?WלChjD@[@@k6 @4)6#@=h}DCC}mΝ/%FTxBkkG6ݸws5h3I?֩SG*jK۷R4yP@@{\4yO_߾틏1}{O-0kL q oР~ w%1d+)>}ZLtԩ4yP@@{\--Yzuq7I\tvjˡUuԩKVF],04$ VZa8{洚iޢ,EzM' E@+++k׶];-Av6mmm 85A EܸnMDxXxyܹXXtu3qDG͘>z`Jmsg `pP@,;WFz㵏=kGO<Χ}??'x~/=?s7#'z~=ُ^&y}1뫟T{8_5m޿={o^^^4[:d )~k׮[ҥJO>{2cF6mQFr'A{mZ_7q7z9(A E'gn ? ˍy]!v-Pɹ{-oyMY\_js)׿ ! COItOO?@[nvˎ;X5iu~|ک;M֠=6/ykWfM//O9A ,7{EE+7_x_nnr9WYYJdfeffgede.˴f@-?^{M>)+WM` `j*99N̟%||@N!_;gF܃XثRS @;δ:0! 9t,a@&@@@B~2! X8gdeeD DOG.]kժ5ydPi?yD ,P/_UŋR϶hFK"LÀ H- aN8Qzf͚!%JѦa@$ <{V ` ȈΝ;22"B@qSԭ[gRE-[*֏=-[@}<'o@@@oE23MN;״ KZa>ɗ>E%1mԔŋ!:ⴟ,2U6(_|Ŋ###?|R'ԜGH{`1=-ͤVV-.66;++!>jժF]TJZΝ;?֮1d2go@RSSƏ'ݻ#3FX>J͙0aH>6nӪ .^H@++Gʗ/ */oVtr^$8Àǜ0D\\" ,{.Y5E# x&Y+XjU`||*$͜k5"SE`066F+VPVO>ա3666M6ߵt֭u۰a}ڵ+W_~[uk"DVVfjʕ+,AA%G o񆓓ː!CmPw%8pXd"o [o#<… R`@J$٧~>ʦ|Ѣ|8.˗DDXlܸ>?h$!-'/3$=}4IגK?KzΜ^^^jPy;%VN1>gyήK.:sF/_^*Ytrtي"pP(WK^bccԭ{9iӦJ.4HeիtyN=|- 5jț#JBB$4h@W#^59 D M&(^x={vCff%`a#%%6(蒍crrR>,m2ښF@)T棋W 38K!ݻw|嗕e>E<&&Z*鸸8D@HNN.U@5kʦ;+%b OOOz~+&]v~mo22Pի7lp˖-иuԩS39[)g'v;vQeT۵kg|R>`HH1 n@@P_=ԩ?;VÇ˗555Q2Ǐ_P>Ӳo7nܘiӦGyD27n,.@$D54il]2uH ѣs ^}P=~xN\]]l/Qj׮mkk۰aÉ'?˫UW#""zUR%)ٻws%Kdf͚iҔ9/SsNI'&&iشnСC:S  " x'M֭3ȗ޽{yKUf͚ھ/8pUdР%&LZ%--ՖlԨߩxӢEdSΝ,={T󝜜@$^`4uX'$$ްaäXvDٮ\hdjVeeejժUxcG1}>xk;ẓ8{Ckxcg?zd~f׷S ~״3f{:{\ﹿy{xx{yy^0{|o!8vI6]xSNNζm۔HD̙ Ht*% Po2СCٺzjM>>>IZ{7ojN_UUZ\D  `) ,N6MKqF''_~YYmذSo:tHV,'rO,l:3j3gnڴk3225j$S\9YMKKSV?^Jeʛ&P  " xGXV-)+W-Z4W#eQ>|Iu5::7ܩd#x0)1!8ɓϜzuqvvFʢ_.>>mZZ||RZ%q5kVKᐐ`%GlɔM˖-@  `lLsǎٽkzO?㏷/g, >YY&lw|ltȑ#YA֭E  իڷoSnW$@(+V,0ye盞. 1;___}LOO3TKرmǎaaaRC@ 6 }%PpÆuqqq`PE%lR5_M@Ԕ[,ߌF DnLqN㩽@R-@.ϟ?jH  p0!!^Ny DttԚ5k.)۫>(ii`Q#G eKSSSRmvv!A@ˮ"eQ%"""6n]lUΝՎܶmY@[r]vʾJ:**RPP&$iOr\,W  `ibt@D  `q9 l@@ A w@$" `[q@D l `(CDx;""X|@$[o@$2!n `b?D  g!@$R+V  HeN-? D ` `ivФ" H J {ϜW  |OK@$R"zヅu@D 4`P: "xJC %}pW"XX+ޑ@t@: H k @t,^ZK nw@@oQ-  Di"" HwZ@@$+  DE@D ,NS? eDiE@;$"xUo." HeBo." H " H  "`I `[!@DM 0\zUPEK.)mX`a@@ƍ?…6B D@\Ю_( %@D@%~}ChhKKKݾ}2YJ@& >>;vltI  "z*juuu۶-.so}feeJ΁,Cmذɓrq@bE0ϟ?'%oZ8X @DbذaCtt$d~Z???_Q9IZ()J$-jR[zU?$@D ={.]/[8]|ZPMK=VB[   -ʓ?}}wWsTP,eKCCǎI&vvv-Z4iҤ;+?+Dʴ]ZO}O}J@唩] 9l߿766Fyp hO(O͚5Cڵku@#۽{RSSm}vY@]V\qYPTfݰa}||l1NcR Fb+DYڵj7c[n2}T "`Y6' D"CO>i0sƌ_vm5#ݜ^|=qS۹cG+WܿȈpektԕ!CԬYƦAǍKMIVXz=wPѣǹ  E:eH_x.Y ?.6 CճgϸjիW?.PkjeUd'Q^pjDlT[aDF  47$ʖ>3ut__)֦M13gNjRV%Skj#G*U([1ܲySlL_AX>|uzK~W  %'e`\l_I777)}6eu-Z~}޵SY  r) 3l^1QڿZP~$xzGRV[j  XBHw^8N}SV%!666ZS69sUԭ[w׮_[KUvvvƿr+VD@D Px"MQW|HԢD35s9֯Wd:88,^PkkyJIԛ   w9CCӧjժl5k1|ԬǎKmllZl绒! "]-= CD@$J. op@@$ʴZXD@D D@4 ˡr5+K[VwOII.:M ԩƊwخ=a D@(sڵP _ߕ%-j:=== ϭ4[K  "LNNZzUff,%]Pq+J#@D@nǎ,%m?ii۶m]yim||R.gΜڰa:8S-pEJv V3JDHHPxU %b+V,WӶoc6IwZguQ&8{̚53y+7.\.\8o?x! po `vvի$-KIKf <[VҧOѣ{w9S=E >E` `@SN\o ӧD>f۷W}P7ȔA%oߪNϲ͛7޾w ֯_H QVX-,2 L ٳazl=|落vӋ/4cǎرc[e&yGycj׮ݽaDF  C@ʊ_N}N iG{nݺu*!۶mپ}vPc?ڵkm WF*Snذ>>>V=ʕLuPsPM%8eԩ@PKQW"c֯['+VTWV_y%mee E %{ߊK)S$=|0IwsA.vY@!eB: ĽĄ;v̘>m7jHkvnnn>x`$'U^Eؘʕ+QFF=$33ںU+d('"}aa333;kN@ <ۼyse2S$P3ZK/XwvCVK %1 z] zў[@/4h0t萙3=xlll "ʕsM{t.Ǐi+4@ ` EN `) I~eZ[:Tv}++m۶=Ӂ?@@!" *'sfώ{ΦMj7ߔt^=DF,\@u%R5K&p >?ߕ{o主w0a> P@@hqP^**U$...&0-5N:Jye6uWWWm˗W %$baf;%CC^}UGGG;;?>`l禍?x kk+w;~쨒o*WlR%&ϻQjx*8;شjR{@Kb0=~Ckx񷞣{ϱ?x~׸I^~rS&Nnӽ&)zM=}/g={o^^^4{o.<@ܔ!C@\x{1lo˟rƍRׯ߸.^ͽ$]ȕ[*{ek"Jɼ}I_ i-X0? af?hY?u_~7/!'\]՜WmvVvYˌH̐HȐHOSy Fʏ*D@Kvs腻"ː280x@-{5cyu?sg7_5;N'" Pcܸa9)ג3%$g2)jbZvBjVBJϋeF\鱉˴HILIH_"/+q.}$@@@X oy{gPq@i H "` bOrFn^]KL˳?Y&^MHΓ,eqIˌD%cx_tBZt|tQqK䅚0@D "=2T+)ZRWegYq)͋XQezLib| )Q "qE"P$@@@D"  x M73!jb]MH>y>\.)LR.P$@@@D&_K/!-'>5,SR% A5jԴm"cSңҢ7grG/R"P$@@@DZ"xm/^;aF|  X&]ˋԜԜ񟲌OΎKʳ<wÏIȐ WתiQqiF~_l23Ob 5a*@@KthBJ8#w.(Zq)) M>yRZ%\FK10  %:4.j^$e$e_RVLbH_TBzT|iWD6lQ)ҫI1aQ"y*leeu߿H:,:),*ZI @DjV\%(l#'î$_U4$8<'o"oeސI?h٪"pʐ^ l  xƦ\ hQ,YF'fF%f\Ip:UT|UU8àԈ|wNNNwu,?ڦ#M>p9:rTR٠̇~dݦ#!+  %<46_lRލ?񾘤LYF'S|22/R-S"bH^Ȼ뗔>(qYy&LH "`E @@?3D2e732>y73oD ̟%:Qy9_B%/jT  ИH̊N̊JȻ'˨+y,#"5"&EHJ_s/$)w.P$@@@D"  x/ JBƿ~fJ:|׎L ϋay˼>#og2y&HHD/j("# Ѝs;*b;[$H "` ȺnYܕwOD @,!?\u0Z+p#ׯ/_]WjUYYJdfef/3#=33#3C"]"C"=MMEFC "` 7gY@@@!.5n'gn C @@. ae<9ڣ7?x{;ẓyw/_} >]C :uW}UT9r@Jwrvv߽B A @,CN?NtOG6}o@XOS'OjßxZj9y@D26 SO>i:88Yvp^={8á*V>l!ۏ!H "`75Owqq3z*>Kz" {Kz@D/Zy  " "   A " H  " H  "" " " " Mx~ffH   wn\&"< $@D^.]\rb " |U+-/ .  $99Z7d)i:x/@ " @q1o޼et$0 " p.,_|E:5 " pWfϕ+W$!9.ةS'֭[:t­BDDD^*UTB޽{h]sβUWވ#2335WREXXWWgeeǒ=rv5j9rcTXr/[՜K9ڵ+V(xw}իW-9b'"  Pd/^,W~%dٳ:F)88ؒuֽOCF-1&m-[,W܀,,/>:p@e D^}UK"hoor %G-Uq4R1h>nݺi6l%G?p%Ga/MKz ""%AJѣ6k,$$$**m۶:tPK;VVD'Ol9s\zڵk{U1,movNN۵k$.6aYZuРAo*XH--i޽͕C/_^WuVK/iժչs1#Fڵk[rD\ qeX:>S   P(7DdUwVV9"?%[7n,ʪ>So޼yq//Ç7mT+WN[S-|@@??DДՇzHV{F*}M$=`Y^Zr>Sգ;vL1))I#ꟈhu& "˗/7yb ϯ]vMV,*"i\z.&&UV5,,kpRI+?_nԒjkk裏J޳~뭷$'MKHHP-a1G?U3H  "oagϞ&}D\OV-*d\z3K9tÆ G`s qS-/QZbRi2]jHH?/9;vPB||U,o#{  " >َqqqjfll䨏R*[<(͛7׺nnnjrRMA]r&O,rƌ4F`$@D@}VZ%AK/>ڦ\~o>:::22'qi֡C*SʈdeeO+[./^ ڨ/t-߿yq^9/UF<# (x?^Ғ)pK{So&'Orvv^Tܶu3G ? pwo5ƚ5k $_yM}z^FxUZ55:c|sS@37Ҙg}VʸCN.i`B [6z_ݺu֭[M}qrr'7]a߿M6666...=zP_VHcfϞ-~j%oPx Xxڳgڿ1GC@׭Yݸqc@DnS[МANkݺ1ElР۵)xȡmiSU0og֪UzNZYY=C=@@,F,>xY3]zsNϞx$0_})?4W_Ulj)(q&'%֭  `1-:88~y5kxE%¹&ؑCϜ8vJʪܿW*iE>͝= %@@@Juӧwz~y[[[jcVUEgLչEʗ/ *wjFtgb@DP;+!wJʫWn׮/OGm`*U;Ǐ\EGI`9]]]@*/?s++o.>(/L[zUutE_]}+/~כ:%o6@Dbt" `dsf,}iSZj};k#<Ѧm۫#oРA奒S&+([@֯_ƌ|-uuuU0,4$0@D8ܰ~]ƍ4h|@@@g#/GH!  @q9 " &tֶw7n8|Vdcǎjለ^zUTB R2&&Fݔ3jԨڵk^ 68qY&aڵ;w:mllի7bĈLuCZn-ܼ h1:u:GQ=~:xବ,ѣG۶m+նo^v4wz,#  "8ԩS|AuGJuj/5jla1 0aB-Zd|%*[Ĺ b{L@Ϟ=ՒNNNE1h!!!jxG,@˯3.]RK{TC @@ 奤̛7OvvvoVzzVTI)9vXY޽{\\\bbbL'OV*r\???IשSM"S:gΜW^vmϞ=l1b>SQQQ[֊Oc5k&&j۶:Ԓ(k.(((++KSVVlJd駟0hq\=`]Fh@D@0?gϞtvv*"eZhܸUJڵk+VX!*=&͛Ǐ>|xӦMdrMM4#G(bs={neU'?%GQ 79#CV˗/cǎ)@s-E?@@DOnnv2{{{konݒ%KjԨd֯__M111Z27QҪK{Lخ*UKb{=&hۯ94W~?X, "Zjkkk|ޥRoР䋳7ސ =zΝ3>9S`徧%G11qC z^=ڸnMDxH   :nnn΁iO?Tq7)s$$$(FY7Bp  A0NvC:]N3/"NZ7eNt -Rʵ-BQDgzow^wڕ)S~t6Ǔ?~3fr/-:|tǎُ>oy(gYZS{^mz-?H((l&K, 5_]6~oN_p~)uuwwܹ3dWWZE:3g΀<@`֬Yeee]t3<~>/0_ښB{ns9rto0#H@ @Y9rH OiP4Xd  ó~pvҥ-yn [  (D,[,cܺgwab 2>!$IC3$TK^I#0 d Sj!f I$KH'IrHɒ @Ef I$KH&I$Ir(I$Ir/$ɢ4{6H껟'1IEi~'49|$I$M| @OII$I~ I$I$iS$3v??뮫%K~ֽܲȑ#-Z_RP6`p⬳'{>kc=Pn?4y쾽m^sѣnjOS,NDlݺev,ׄIފ$I3g桇=_RPMm[Sd^llٙѵ&a]/W-Tᡃ7ׅ20$K MըQ4$I{$X!,//7r W_]41lhpUUᄈ=9S%۷mNsg3&Xtxk̙Od9R$xpOzް57o^iii5<+V?c$8'~ ]6a0y\|prчW}{ϯ)+-ٿoo$I} ŋ;vԨQY馟;zgp7-P3fhjښ1Bz =[&A?IN0}>;'JJJr]x֛ʓ}S˗-{gG~꩟zo$I} v뮩S gJKKs]aMM+ =?,`ĉ‰TjϤI|s I~`tfֽ¿g}vgp݄x^5\uc]G72HڙNwvC0_x)0 ׌6 IgR߿?`9,6~0s=&A?9}fϚGS{Z~8{v VWWo|/dY_W~/ I,p?pʔ)?ܱakի o7t\x uٴi[1B'mXjC}M$,?Q+@mmmM]G駯*\H$Ov?pǿޛ;wnYiywםwF_ajO˜9suϯiMrEY!CXbg p+m鳻yWѣG_pa+xY/ &;|Ԟy慛_r}7W$z]hp 77$hS*HxJv[n!ܻ?iS*Hxl_p >_ih=ħU$i?OH$4Y|?PX+I$IE$I$IH$I, I$IEl$I$ɢ/}T endstream endobj 903 0 obj << /Length 3689 /Filter /FlateDecode >> stream xڅZYs~ׯڗPUxUYoŹ6ˉ?PCH,J䌨ʋn_7O 0p{?n>v:)On* ֲp:2 = =u(̧As&=Z+mUē48 I<;]wm/5N 㲩ciVf s} dxx'wsSͭn;D˞nCʺM0.JOװ$ ~r5RsG3;zSI0/*CN-%oUpDZ>SÖ=4;.[:4xh_mC=wDcgu}w 1&dS{xH/f* w< #1ǫQqd']f2TCԎϐ,??yt-8 pp(S+]  \Ԛ ="':YGu_2y,nF;fVY4vknZhaZ7؁[.o0. X6&4yafRR E碂ݚ4=?B><h챞Nn>z m =0M뾒?9~x?B>1h/쇼L/UH=}.D4Pܸ#^Uø;K4`&Eɽc#/cN42ke=R5w!ŢR6& ؈Zx@G0xyID ԆyXu o'Ey)@@&?23a}&O0UFh =lyQpCu(FA|n[[]2x%@fL|vPPO՟R-wÃD(7ֺs#hk][܁4DqdO}WDr ŃK֖d hQ,y+Vi ^^@,PyX|yd^[@\1bVg#4ǶHQ6$+& ,"4N$zڹ_1XL^rA; g'eD.qmֲ,:3eÊ[DovRaU6sQ pm/4ᐯ`6DT70Od%\xe$sRURA,+ 1c3r=C)I0JJ͍4/34AQ:+dn /=?8~UYV ;>R_ϣ_ԅHcYpM$49)ss9|WhԬ!5zl@R+s'ri@3,}U*DYg%7K(T`^7P;r6tD cג!auJ)V/cXJǠxcn+pY:=c_ZWՄLcV;:OfA/Wx0d3ΏD%(q[!X He"ԙcᦱUk9G;=;i|x!)Pq>YG$R>c|.? kF-–ÌnSB4$`Cͣjqy h :dd'.zp- wk٨U\zEQ/eXBT/7`ö\-ե$ 2UYXFgaL0sPSߠ 4x."(s€Lc@W9JIu\z"KH7ںyNR +6ʧI+!Afk"i8RF-XzYhQ:UoD{OG;UQhDYEʵB/`':H`h (>[׳WaE4$_eEõB䣮gJR3Z!7j) mYRM\Gўm)| [#㔭FJ7D9:)p%!xC9WDz,,fS${GV-hCRΤFp(אKZ}{LTaW= 5)@~<$;s>#@= $PӏФE\j4X}Q^w8Ϭ9?ZdAǞ [GqG90$+oĒt(4* $ɮy4z3IX)t]V3<4 T2̶~lWdY&f/,6X 0EY$kY8 3vs;?> stream xڍYK6Wĩ<:q\w'U,Aɯ~5r4@я_z;(һ]U*{7buQ*-w޵~UEӓ/wMܔiMeU:MZfQSY:턽<|N5}ô7MS^F¼{Sgia|d,^r4"M'r~L|0[PM43sq\ !ݖeE|3^.ٲơkC#waS;x(,+on>?eDcIAIs4Y/ X$Qʭn52zW.t=dY.Su y&3pJ {`VllI~8fpC^ô .F<Qb{ٲ4V³8$}ud[mOixgbSG''WǯډLcZ4IؑX.vyݖ[(-kA\ Z3#wà,#)X,Mpm@sfS,gd[0Y V tʹ ۄ'0_L);렓%,ܝAΌ|ϖO>ɱ Uǿu^P2Nb@&u>ـMp<+DhpG*Ϛ%3NaS$4n,\1?%T|0$E0/IŝL&я`IbkQEֲYP=rB:N Jlq0>>;K3޺,8"vz|$@!;JP9 >ã$A%SBCbu7rY2|2̲ 2mYHnbΣd, &X1^fN8v/qG|I0y@.2Q%Z̋E$<-3r|r%'QM헹 )MTS6I$Vp ӍX\r7%?νDt/=gXi (N]?yZ/,7iml}wg=*<" @$ Rp)s_o _m]-P-|/[bY` gCL/X<P>ۑaQZ8\-ݬjjP L EDZp;2k&JEODjTr؏Nbu"w^AV{pF-MJHdh ?/!5BߺTj<ni0Тzx#S;I]U ETjox&˭_rA%KwZY ,E"`*Ę b@88ѽCY;kajYZнӦ˳<W0=Ct8>HׂdlY8 b oYlQ$q7kiM^KW묞KWjK~B Epf:jyz&.eCJSI:H> stream xڍVK6WPsU1xTm٤K* MWOZfl|/yG<-#QɤyԌD*Ǝt"C||7V+w{ ~;ߝOUT'u9*H"INm{/+R->f~D'gFM!rݨgCs'x6z$kg`iZ8f)OSX@ h2OP#PJ@QnF_q%^P$و拝I=:HvU({} nլH6hvm0SeWHF2 , ċɰQVHr]=k1[%g)WYeMNq%@r * E]dbu0XHn7j9X]μo]]*AE>r~jR xs0`#fupӿ]_+U2WUG;[QE;e8aƵ,}7;:W``I@82bAnqP6l[yIWv&\wX6ký؁+P5f±ߵ@s伮GkDg u5xvgFƪ@<oƝʔY EXB%zN4} GBlA mHΞ\FmgygNƧÄG6[ ?-2+@fxIm%LdroZ 9?l endstream endobj 907 0 obj << /Type /XObject /Subtype /Image /Width 951 /Height 801 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 69658 /Filter/FlateDecode /DecodeParms<> >> stream xw@f؁$ *ZE[Gm][hݣT~WU략VꮸUY"32Hr4$$o[͛$L(ʌp()Y!C+h>%xyD[Kq))))ĸ3!|g\}'=w{gff}KQۛ2`rU׽{b7{{{:pAVV{ϒ(27G/,,rwh^{LLw3Ӟ!/<<K8U\T$a3/S*McnW$fdŦ: JURRiM!G2uZ//ǔT }++l8qի5K~:tvk ڵKЅsssyZkTBqXVPP-YZZ G I^~R(/ȴ0nA۶mÖ\~h@uvrɉRRR*"4% )GTټ99<4&&]*~z2-s_$$w 6lݞ_~Tzwz~'MG{NlM r:;~R]rpZ{`+|]X`/!>Lx i&/Y|-=bD_?n/ ].2v: , пfBï,XJ%kk+;KTxKK˥VN4> ̞Zs̺qָdlC :xӗ.r~rm u޽>}5r` #{x[[[k#J##w-{X<H?EQ I/&BQOǚ!}ʕkg M۶܎/HNN:uҭ?nB#K5髿hx:ұc-_~:Km=}du38Nv4mamt͒l+L}pĩ޽{;~rA]?nG899uk-˪k #ajL5cW^ \dl !iްn'Dr +32]RLJJ mK-`C&Oз))"7:Q ̧UG"TٴTy_,6͛yyytǻf³h6`aaQm\1r_ww$;vpuu Pm5 W/9Mɕ Ƣ4'Un{wknh/*RC@5i+KG;FY)c*kK>b5?B8 O0Bx?% y`ԕ)^KY*i4RT^BrL@)]Ah!B+Cy7/k OMƆ?|1 :"(#%@5Rhʕ_&3]I18j~>fCT%cp,6*L3\*h-D ~)#-,,tuu׾[,ƆUcO&O5j{{UcCG9u^ =<<.\8`@Bf|^ɑtkx* dZ;5#9*1aU3vZ6]msch^t]]ol>_k._ikkӪUUױSrR%/Wo]JhZUS*McnW$GGP4רVa=W Wޚv-a)m'N2Z/e%`RQ%:td]] !yJ ##œB4T==r8fĤL{{;o3RXX#Hb7P(||5{ %7KK+]'еKЅsss+vk=r;x "**ۋ:53cبS=Q/i& ۭ_u%]CzC^k 0bMFs44MK{>{ kC޹{ߣ{rr޽h5>rrsbsohc>&HH:-899HHj !wޛ6cfby <)ӂF:b0Gk'Ln7\fLzy'PZa1l* N]bw˪LFe8؀^0tH2Zva)ol0Gj98a/u}Z4!̝3[Ǝ:d[s"BM3|ys{~ͻ7!EEE-ד\?IQԂ~1k&!$<ʂ_XlI>09 t?n/ ].2v:a;e82cbuk E |`*; TL Q\ ߞԿ_ƀ0>.M?ggcN8_Ttj"ܶ}R|!AT?Cbb!V]666.2L*FF>% **:**Z,v+++MHL0a':V 5`6u6A$ʌ ʘR:qV+&٫.t 2`dl|h۫W^zBnq{i/LyFFf^=lxBh׎=o 2~>`biiA)--p8awٮ]sy.y9ue˷2225f.ݴiys 2Bsąj_wm#3x3Ir&&OƔ1k~ &4ybmpּ_$#M}Acd_7 l㏇~񐅅P(ɣ-Bb73&8b4l`:׫F=bl ^y Rm?Bƭk)wyuӦN/(hHsvz\جwܬٮqW ⯨\ H`3U@FWSV}("{͓)5zg&x~\MU)SzWP5tHԁRL5AR2@ ]( vDs2=4Zj0SC֬Y.ٳgODDDmbzzzQQQׯߩS{Nk{ќXTn4֐W0Z- R] $%߿ҥ6mRݼyqǎ޺iiiN>Cu%N5W#I3uԩKi0zG# Wq oE"QWU*Ǐ[nmkkK)***--uqq!\wwwBMiiibéRSS[nmnnP(^|jii)!IIIE[U+hj={ج^ᆱRLL\KLĹ>k׮%&&BV\iӦgϞ[nu]vׯ__bǏꫠ GާON:h[}ׯ_?>rș3g?>>;z>f̘ [ o6lH$O>-((P*>Կ !z*,,LOO0Uu'BwbŊ>biiAOt3p8=HMzxx|'eYizZ5)+ylև`3:L !k׮mӦ͂ %)))gݺuGW^...}9sf~~;wSagϞfWW׏1?ԏ>fff_W=u!6Ѻ#`iiimmliiYZZA!177[=z !LFz ü?ׯ^8uViOq*MuAuRrǍ.iܸ1MӻwM۫W۷;;;[ xxx|׮ޕܧO>}رcر}p8:/^8|^^+֭vّ!440zf7}k^2Dd]M:Y ׈APSEVXoƪCaϞ=gϞ]\\Laʕ+*P\\?Ջ _5\ARRA ???فbɓ'333!ϟ?߹suAǎ Oɺd_5[͐eT*U47.&lnzw)=((P]rWW-Z9s氹"00ƦulJ.**ٳgmJRFnz};{ڂ .\`mm1wN:lٲo߾uM׎ Anܸq!9q/T2 )jBފyywV#;D"]4\^^J&|ˋQ(5lxyydj)7Wn߷.J߭gY;5_ ,R&SV93S-#* i7gkkۢEjphL@ `/RuuGA ~*>fU킩3 jI*F؊{R2@}M-̛wH @}а 4ܼyȒح{MYZ~e#9k} BB{噞1sܐsuK\G1Uk*3ڢ-cc{xCS}*@J5ۺ=K&;{?sSNiL.gddfdd8::zxxp8˗y Ey| D"B ||q{DM&0j/DI45r!ounot$4-rysg5oenGbq46Bf];vvWXv1666;}gee;dWiD!R2"xNjDB٢EsNbgkU˃_$$rJ~chڮm={!ܼUSRp)Ab@J(... P#E.^*˒v}R`nnnaalnn^^VKi"DFop04).qH.]ܶooߎx #Kbo%e) EYYY \VLfkc5#.\0o~} !3> V/Wc t*С,rAV-il4U*=s末;qŋd/9ڣ,.++ӿӂ~xɨݟ8y_RimD"u... ![xu z岳/~ ?pGoh. G>ejq[ԻwOUm2#.:w$t!yO'[i劥lT&J|gSCW*|>_kʺv Pkm]XU*UttBV1xnQ,wݹ1(@>GGGGGG4`D)Bx"e˷f*"4=3x7sfݸykC bWZoq{Q2vY:/f$_YpKVΟb5_OΞ>nccsBx$0!̘>u Y{j#v (7̔2BH$vD\"JXή?{6`Rids !b[YYylll۶m!Æ i=l`BHbLVPP(JNe>dSgo) iiH@6޽z:::x9ZW1o&u'lڵkC4,pqѵ:=[ZZ?//ښ0O0_2Ի; MGl]"IIIzllnnnR^PK@OܸX,izúZ0VbX.d(Ą$s&R) EKΟeٲń.KӴTFIJJ>|zHV=H׬XRRBa&"Jf%kKi~{t<Ԧ]ǀϚKGv!n&2l}N>$ժyy6Fï$$&zzzl yt+-4 "ܐ4i8ǎ֭] _Bc#̗\uJ~ ݺ|CN!e65hP'Ԓ0⢙O+eh)2q,4076I/BQ&)h)xi~w+A& J&@̧!0^|{).JjhGĆG%*%.$''BxּMw p}URRjͺU4yQ 7 %qmyKE CUYy괠qcG28y*[׾dێ]^MW;5<,y5 o0.[jիW/r/O>R2Yvyy9R +\UBT*usN+/ٸa?ܻ{-?},2\wˋljffnffF-))-((sk"">{UH ݻ[V }uڦMg̘s52y}^ޫW|А6%"|x?b}I<}\si*UYYٶ-}|}|NN.!EBiA\EBWw5lGW !/2f&l֍.AMk̫Z4MϚcf9|PV''E 1j|wiZ!ںi&;Uc#999< 0H&}rL嵒]y7⦵!H=9{_ Y:GE\Ʒdm|[oܰF,\2tȠ~}G{@C?352m>UVYzM:z{Ζ*,,// jE >x-k S۳gOPPФIBBB,,,\?w3g'N=f˲\.g,͵B[077wي՛C'lNuv4uGvAZ];ۿ5lkB! Ixyyr8,tJ*//_vgSf-_ӦM;9:~y#?KcN^-˳E В O)$֮]9gnȳgQ-[vJsߓMvÇWY_T:}߿SAA![߹ӱ'̳ٔ.-)esrrkq(J=񜫫J T)!Uk|>U={=zD4MoXZ$]ź EP:y!ӍBZr/ 4kEz1cTBWowmKHHsܙVVb9!dIwLj h0lml6mXӹsM85n󡡡UVjyyW/ ]~g.vP(vڭ^K(Ʊn1 R[lM̺M8>lPyͺ%%%a""TcHZגJ ![b]/:q?۰5i쑚*MLJxGdvv*㩩RB WmDhq }뭙]\:;vtƭ.=uNtVGKQ/7s)#FU^adZ`@sGXBj-ܸ*ذBڷos^^Ξ̒(B񨲽wjݹ>\`XD3'4 j߾ݽ; M5׵cMۻf@ PT9..΄t2B:uЩcByUw4@ }uUm6iؐѽB@WDl^K$M41d Xּ}izϞm8gddB͚7i]\\hA,% &mEWp0ZEZ"^jmeeck3gv0$ѣGnZhm7h*Գ hd76h-oc]999EgmٓYJR$&mǃ{ј ogg %ꊖ! % % xGW4.9>Z bNJƼj E9D=S'N5q,4k^2lgno4,@}J@_2ݵE'0P/S2dSc|_Ԇ۷uF4 2)^_Ḑܾ2@=i0_2 x %j@J0.NnF(a70sm%l”G tHL~|Y2 3ڌς ۿ__\`G̉_Ko@?e۶mjN %cm+pu."3*J][RRZXXx* ! "**:*:FT%yJ ##377-J޽yU˖zH Wgϝok {zz^=&i{;⎓Stt̢ǎXO_O}>^Rm g}I<}\sֆ, sG#''ǽ{w9:8T6eZCG kz!`B|2nYwz | %,%;~r\8v:%Bmll.[p8Z7̟CY|ՂS'~;g֍ƍ=t vvuBh<ΛEjj*J)s Fzz#s 6 !.רr4 #3@O1QQѻwm' š+N<3o;Ѝ5k7c6uw0rJ~JHHsܙVVb h(kMZ^^զlIvvNn= ;pnﶭZ-[vZHG4r4MKi>>IIɇ3Cf5 P_|[JF!YI`BWTJ֒`!ڶQfd̝yfM]$ J쏣?9bX,TkP(PkgoR);w%66<' %Wt>VGdBs@@cN)Y_]%[o3ɓ-^>rउ %J>Z͐- Ӌȇlv~Vn1C8T#]v>"!% g^?ϨϞLYz6-PUKJJWYC7۾=jr&O5j{{R\.ёQ p!䔕i-LB`ㆵG~>A>?}=E4xiRa PϞ9.T?~VW繳'd2PfV~xN㢅M_PѨW;?#NtmYב)Wʵ2}!kfok*x@RU˲_f~y'^o{9% ݡ܌RR򉓧e~~KJJ{g98zxtTP**;;ři-z:uP(O9jzΝ|<*@}T&> AV+>ߴIe:䢤|wC63bkm dW\|9տ̹*ܹӊK6nX{?s[RO>|+///**ӳ9;};w+11)"gQO!=uXּ}izϞm8*\7##3%%bnnּMu- 3i -vւeecûn9lgmSBbeQs\BȋӂӋį6=pk؎߯B_$ 6dQ'Ln7\>֬Wh5>rrsO޻ͷ[:w.Y| UKkeg/ Ι3;M PO1 F\ %#\.QJbaeFx,)Jrvק$p⹹ؼZhiUt𣅅E~ , пfBï,XJ! BR^\zd O9:80 3|k%%'_~nMkk+BHQQz]C3 Cʕt垀B﷋D!DEEBbضmT>aÆKRkD"RߧIƚ:٨rCDABG2R2@1=IPheY`oTʶmiC4dĦkv `s`Gۍ0Mwc-?vDŽwM1qcys}M4rÇBt{ν>nQ,wݹTS(/W5ON !d9f\NZ_ `r iS֬ݠR>{SJ5o-?l!NY\666-daGB.[9yϦ3 3{e&dђӧN4a!Mr v|y ~~wqF LM ]\\BgӦ / !I/&O֙2yӧ222oj666.2,!1)EkKQO RE}XSB6sYo66Դ/׷i_t_ΟΖes\>ϖDBBHLgS%,--!e9<O[@`yyyVVevrr4)nƷm_C`*ׯ^F#Ș )YHNquuUTYYYB*%!W/O:aBdd1j**%%U paoW%R, = .k&9jS"=wW\Ϗ7\&dM_fuq&Mqff{^xDOOϔa;>nS@DFJ4iqndcGG V.7)3tq1Vxd4 %u"2R2R2@]EN d@J(aCJ E7$R2")R2IܖO4M_.Z5l{\s|g/RyX5YPIܖ&NcMXt%!ys/ƌpBHLV\\VkW$Uo5Yzj222.;̖ ȨPmnQ,wݹ䄫 u3@CNɱq o+cW|cӨrM666-daG2 hɌS'O0ŸP_PPgnEJK !vƮ8l`{BHǎZh~ ֵ!t /..d/^$HRSO? ( @]wkLB*ߍ\dlKK BHiiY^^[䈋 ( @y?Iƍ{9sc?V,M]b\.e .Ą$\T\[ʯBz )(d?7ڪ𑣮Y豓!~ԫHV]jo E >i7xe*+Jɽ{v7mj\\vYϽ׻Qc̲V,_ŽS^mrq 'Ox(@/4Lywz,nnǏR\&ݮE RRRE"ruϞ9^Tv,w ]]EP "42x^^~%!13%%ek؎σ_㫭l;^n&MGܹqú={ )%/[بrCxyy.@J.Hօ&xc1 XHH #G| &qUYYَ)5rGfeeeff|8Z]w#]޾cWyy9Aڃ4#?b322;TJioW^pђa➳3> >jl0K&5?حaSҚlgQ Q^^}%vR(h`)x̸ K$4oeޘq~Άjls괠_.^m۶s˷aF}mD"^PKɚ% F*5bMΝrqqfKgeddT&e;8سWT2YH$(ioomffT( 222-,|>JttBx6srryz,'7ٙoϮݻ%%'?ps}7nX"!ٻ&$ WDѺցVpTj~V[kցC8Pd((34d烇.7u>ig |Dr'5mzI={//ϙ3x:ܦԈI[m;ٯ_nIAAƟH$I.?~"^͛eddJ$[n Dtxg7 Iɯ }S M>s#_0lfX̹w/{cnj.CQ<-Z)9mZݱc{?qNND#"77?&;|kDIJC5bc/Xxo"W\=rx^3W+ ٽ'Fk˯G.;fϟ3;[ND ̊[ߙ7[A~|ՙ\߱{xH ů P>3zя 5ArP)\l[],w/вe yJ+WMHH$"__NhĈaF#rbRrBB_Ѱ 62?&#uvv&*J.3goݺѣJ͛ze ÇqWeڸ3k5_Zfv@S RL&#J {{7oͶ6~9ޜ^zQo{|/N9anh{xxx𿿟۳Iojc+7 $r"9uw;DyyŎ3jࠗ ~?~Cڭ5š O߻NJnٲE8%"'2n8?Vwi;?ٙ߿+|}}YCEpMTVV04kQCnJhhS̻qq'/_ 32 gk/4=1=uڍ~ -O4 u*$4F==RZZFD[fOp@@ߎ#"Zio S*R҈޾C,rS&%'* >ZX?hlRqkVXx!b))wv"a23vԜƌ֛7ff1 Pz%߿uYz횵zzz,˼1aܑ#QNNo999.[mZĔw-u׮]dɲn{yyy "fϏf6iϞ^u޽{:v0ϔPVVV`GOƲ >zT*FrTܜbP(tppжE B<=YJgNA7oͶ6~9ޜ^zkjdHcooRo޽{|>_it0 `auc$ @ 7 jPCL-[hѢB}hrss$yWID>jgXyOf  S;v4l>d<3F~gx5~___aV.{0QWu7Nvrr2 [50Foy7z{7}x7Y3گ e5fݺ !]i]cMKO׷bʬԴ4"о=˲\m^5~·{h*--%"ek4tcQ PjY}ׯϪk׬ža-Y~2jа^ Xߵ-}GoggeKj؜ܩrrrruu]t1څw'Y[mڵ,Y֭{/o>U(Uxfʰ) yW.=fX,0Yj_;6o?AE{YQʭz+ь+?x ߱r;4ճAeDZeI7440v^la#IBPb|BQ{&/[ٴSo:APD䦟k]HHooo<< `h)y{plIc4 QH@sd+a4@'a'< aMgR2X+|H# Pog *fLAd}5K>xHFFsttɼ{ǧVC  aQ y)5K_~U>_ \ԩ\.ǹ5~1"E5mܭ[%r÷oLxs{Z}v xm숨\"QiiYaaUd^|>??@$UV vuii9nn\DTf)JTںu+>RQQԢEs.I}XTԮݳBPw򲤤[~~ ;|}Hw~V\\,yj 0hwhHuui9k.w|GGko|;JVєq]s/N?JD?-|߿?/5#¹D4qRDPPdz$Ibbһ 7aȨ^&CDp7ȔHܷn.sobqBbҺ~G\]\vɑ-00ҥ7nFEΜ1Y{M>s#_ajۈܹ 3ގlѼyqIIא.;vtifLD]SwmC`\"ZыkH윌͛960xgƇvv׵qvvף 3*'O?ͥGqsΙ9믷3o6QRR1NNNorD\QEEŠ>C._n…ޜ͚ƲlK״)X'4dNp<=##%NĔoܸܩS3g 222MǙDtL|XPm9#uvv&*],wiiD)Μ_|UFsMm!CDD]C+**ƍMDBsN݈($3ϴ=qhmw*JRxX`aP&LRTe(W噳w ~gx؅ >|x_)k5ADB.v{{7oxŗ_֧#G~f+W),,ruuuj qBAY(Whg˼[oIIJIDi8L{"մ.Y]YYRRRXX׵ ]rK."f:th/Xh4m%Υ%1pݻnfnE,JMK#"{{۳,0Jegq _a":z,6-=_jd74xPXTf|#N,&kLFD'%Î~! e2Yא}1iHD<o'+f 0~~u]-boo\bbR``~u{nW;u[NNN˖.D"hFV(|+++_2W^wvvv^O-^r,"bҟD"^ > 7#RnɸcE,;rU*50Lֽ{jA;yfeʰ) yW.i #G~YS'bqz!eED)n]t5?t?qRʨR2 %7vuWm #Rc kRBlԴ֭[gffnظ¹Xty9-[?wʕ+طoo[Hɍj /C ]ޡR2R2R2@#Fɀs)C QdЇZ=R2 )LC}R2C}ެѻ:;W_S(L͟R8;D:JڭDm{0ެRޘ}9;wN)/+733';|kuS?W\\=զ <n {P)zu_xB\wn./LUaZ]TX#KR"hDZc/Dj:!!1 eI$UV ŭ֭+U /:?Czv xmʼnIronJ&."r}dCQ'I YQsv7|e˶~ࡶV~|'5u>_"IM[zE^D4qRDvϞ:}so x6D"ILLzwX1 ''G^=8(vsh˿ظm` ;waۑ-7/.)eΟ.;-Hp@s gϽ}w~&?wICDF:˲ {M,|}}ӹbTykMDrrUr'''GGGnD @MFi4 8K?cf|e/0+hV]RHg}T&77W&Q]%xʒ*˓Rq~@=@s 3iԴ:***h ?࿟YerYr-XJKKe cfvY3گ e5fݺ !]e2BÏW<(,T*x"97fO8%SHpCGΜ߶1{_S敔Ѵ)'NlQڵʺu5`XŲH.^;iydWBzu3=#cʏ>]IiIiO4uذx<?`T$[?ohGڥܺ=wl(eu'ֺ{9b[=\G<}#G~YS'bq@-^VDrEPK'Hz0hj?beķ@$nDV-қ{<5-u֙6nz{p %?Zl+WW.o'")z[/^O$tl@JJp!%@,j)v )!@ÎO-qH ޷O @Jhpa'$4ܫw dBDC-rMSEH{|;9{|f? ߚ9dȠ/ !6Z9?nlP>.싋;Y(..7aҒ'm0n¤b,R@u}ΰ8lUj)HTYNLLR(> ._:;;ȡ}ܔY3kͪU֝Ky1u⤈v=ud=v*hޙp=D/fٿ/]?Ϟ];֮YɚO]6mZݱck<\z1ߌH))w"LFFLqfvv7:bPggg" Z\\Rt-/+#"7Wkĝ;6yZuЄ.JR/&Dh v[˫&r5:@ hٲ3T9@Jޘ}qq'w8GJ .h R2@HO{^! % %Ih Od$c1VcC|A]25`ɺ; P?~N6oV2^uW@GQz5唖xL< df%,7f=j֔kĄ-_`)&)d1Rշo D"Qe:11IP/ٙºT*Ya'BscMS Tʍ2"}nbnAHDeeK8Q{}doooFˍfU6WPwXDRrf~:_,j4u6t du:xNj<o'+f 0~~u][@::OXu2BA/&"ևTWHd ZvAD@Jx!Ci8ِweHZB]T80Ӹ'@Ê8!@]2@ z0dƔ]p!%h6 8g=w=G%h4̗25vjii-ҟ>>۾ٌc 'O`q"_+_ RɸcϿu뚤d"2:{&^(wyگ޵{ObB▯tqqyӵG' 1:7d,хO;ϺU_V߾B<^@;K/D$B룻@ X۳fqej:!!1 _**YJR*n݊8C)<--=;;500 [n ֮eI$UTT$%%h\.QʝԇEE=+ q &ONZ[t0v ިUCskdn' 6V\~cQb7JIAAƟH$I.?~MѮݳN9czls/6o旑)oݺ],6U80Qs|50M~At77l{p_1lf6Xwol߾ Ĥu=~i#.Q.1N$x\I̚Nډzf~븣uyg!_Z0.-]UHu{hcnj[ѠʕGpPǎr"bfVܯμl'ߺ}#"Z(ZVk4?XfquW~Ƥc>圹 ͉Z⣊A_=|ÇZ⮯[7+zxmrzj֏jahdCJ^L$i_Vmn׈16D<"ySܬ_˲ n݆.\9@0RED;e~~2+5-;oϲa v.óET3Uַ0_̘T%R5_;u<o'+f 0~~u][[3ea#F+/+fɝ:-'''WWeKD`%YY3ls{땵up5Dȣ)ڥܺy2iQ,rieYUx -(((,*jެ@`a{j`t[7jjP J%*^>8Lf{@Dix?03l#N_|"I:v[˫~Jڇ,~ œ`Dd^Dlhd+-V3>ت5f*M*(qF̄c35ɔLDn7"RȤ=C@IG2X^83;_[\Z^a'Rs Uڢs =Į|^+N*+0WS]DejsZS2'3fK&'[Y{D>OAJ{0Zd=*]ч&g,*.iءc`^*pt^1scQc[-*.Q=m)7fQq?.M4eUâl~bݸlM~cPӔlo'pvrttwHEe{Pew?tG-|#Wl.-̞ᓗ< /y<ƫ"~㕓o|u +S~^nPOVpÇ.H֖ ߺ^ElMgj5Md:.[ ڏf%k)yPA=RlNmk¢Nm[9:|fERZVADWӜRLU*,;߷[G"IݟiONDB{{4f<*)*M4exMh 0R5zeL2Yiqk?ծ.cMw{k빿W2n@]YIDB{{7g u%7Q)7%qcYv=&vzZ_2?㦙͆c{xkZ\U5KFԲq[:Qɺm~ a9$C>."ݞ ::%n.L>&j4ej]_Иcd^ ͚fd,.3-`cN6VeQ/hɤb"Wrڴ:;ɤ1/N6uG=xؒokoVAJ%/!W"Yw"YSͷ_ bm|hJ>|F{o[ECнϧ.4zJN;ϴV_oEY=lf\7mk{{W{P朓_8wֿJniu퉼\͊dL65c|fco1a^sdւ fk_4-M}Dlͺ0j3$Nwz<ӏiEJ6-3;oߞI7:ګH6Zldž5* #Ll4:7H|"g83^16`Cw:0ӝ xp*7L\u2Uc):HWɄ͵ˬޔq.'nQ&F#%C2v24CH]l&=VZ zՈ;DL5=3M,ē|1%6gNxZq2vܸrpgCbT'S1[7B/fek)#`!"7I%f^%ZdmWn;Hɬ~,F}#%4M*[L̵Xl>6wwZl#%MPYH&b1U"Tr`NWmkea1 &|Б uy&"h'6T'3U6U}Uִh͉1s:w>]_}=_|nQ-UmXSrH "(\kRl*Z^ǘxaDf,4gξx%KKKwqaC) ]@~~H$*//KJP(|K)YJR*n݊уJ(;;G(JfVZXXtXّ۶;9@w$Bcf2,.ssbgg縹ׇ;93`mme֤g?8S'vl"l;cHn-77dEa2m8)"00ҥ7nFEΜ1.>wbf~֭-[gdl Xc3+=xp6S#&mݶ=.d~}k x6D"ILLzwƘZnǏ}~Cџy<%&%6?N嫁m <<۾LDS5rG0 ct+4Mn"Ḷ%SmT0/"a>g"694ƔܱcMXSS3nY{%^z>6P+W-]pq›S^8Y39#D0̬9_y͍:u ݽ'fkW^{O6%_׮ܿ_F/\ot4Μ֝viĤ'O?HD=ے[`Dde[l1=TfvL5ȍ0@ר]+>_1C^hbty晶'N""\vlo˯*57oVkuI < }x܉#uvv&*ʚ5 Çq8phD.WVVnt"rqq[ \Y\֚l4@'̴K LJ&~~=}G~/t/OO<2/O*Uk \]]EZמ=1?oǺ=fooA 8853*6xAA#?{xHCu%"ooM_xҲ8@'.h4G$+j̳ԹR26Ӑg=º+wFYYڏ{}̼wxƷ =#㱬}v&n]wֺ|V`ʑN^4iFZ3.}EM*ډ5=tC73k:(^5v1z6_u򺸐.ލᇝbwg]#PofEN֯;)zǑ&[-fӭ5HUZOW')y{.ظ3\P̴b0e\~2kЯa8}S2S//֤Zʬy)Y8.xd*RfD FGb<ǚx-YsHP7YjL D8=瘪=wVbFJh@ ~DvɆQ_Zl[چNqdMebSQb2SF./nVFJh(ܢie2m(Tc^5WV!3U_OmX?T2R2@ ʄx^7d.-`MDUÊdkwa*Xu48F>煣b+t 4¤ll5;5װc8EcbX;Hc0l8jOd^vv^^~Iq v"4cY+ڈzz\O7ݶv4P53)رϝ𡷷wzQ[[R8;D"\e?P4kgӜ%AaT*yyy "bYV%{j;)Dd 1V[!ΫxU[$FFS2c:[jPQe޲]\۷o>\^[6m̟ W4Iޘܧ'~ګ 9OD**W^}3(!!ա3`܄/ ~N,^/Kd\6Gd+bhP ^)P"[f[([_OqSrEa20'E\t[~ͨșS#&ѝig |Dr'5mzQjZZdԼfRR|]Kjj'Ekg6P+W-]pq›S^8O zfG" .:üy:|FSRRҿS0~ai˼rb"z;qrr|×s.7'j劏*** ~G rrroW*+)yyyDhfϙ;gN )IchO38SɘWf±<wfU3f&6PVV&U P֨]+>_1C^ߍJF *QHHgi{)Rya}}}+33uٳh@jtu#F "yCDD]C+**ƍMDBsNz!KQDZ̧͝N^8w9w,MRfhpT;cY+rac͑6AX13c]dS OMׯO~}3g'O~/<<=ȼ}z2 ru:fi42K!?"x,[wϾ99iDz!?p5#2+޾gΘp?Z~zT%˒o1 c?~Me."ZFXgNjCB=sR-vrr6ufڴ\) Ok.h f3[3fi :_|z5gyΙ#}GAs-%2֮]U^V֭{tx*x'+ |a^''"iSN8پsF7\{dS ӫwgi{{V-[uV2 AOM$$_ɦ[ mMHX:YwJomECo'l@[7u?n؞eYʲs܋WEL4h̻rEw{9}ZEE|}MdftvvɸcE^wFח lgT"2#kU.h7gzR2 ᴡ:ժE֛HR޳:qBJl}u2U mfR2k"+3V([|Oo]lgd-+LZznHfޫn . d/kj!Lu5խE6Y)TE-XKXo֯H q 2kGdld{d MU4 %<G~;*hj԰:|>kRsdSx_uY8d0aV0ĉɸcoMѹX¢Zdu2t86ll6lqQ5PFJh q䪓g ʔl]2cH`4JnAlMղl<aԬ٬{?ۼ]{MsÇVrζmzPYY?:u"((hĉ֔hVXa&_hСCG=j(_?~|˖-u18I.hAYF,,>[LfͿLD] \h4#e{J>/*)9m` 7S>2x۷S hoggGDeeeڐZ^^~̋k4LbbZ Dp'gg縹pRT*Ri֭|>=(,T sB{TWFQ~~H$T'&&) __\Pw~ܿĉ{]zcڵ˲iiipllCxx8 "ڵB0SXX'h'޻wÇLL&޴g1%d]D6lSK$;ikV+\o]S5rG0 5WxxH}.>wbf~֭-[gdl Xcm9Ddt#h⤈gI$Ĥw?n g] prsޝ5q}? ȢA Y"u-PvE֭nWj]>Zťrl"]P ($ϋM#$!@ߏ/̙?Č֢EJJJ!K.={׋/jjjIjxQ굧-!dѢE}%%%W\ٸq={n*Γd2UTT޽c0  066%---''GCCFt:@ b#Kʍ?"2&)҂dӮYsǵk7x<?̞W2o^7v̪?}!/^LMIy&@j.3ߎqܩZ5֘  =r즦/_O8ǽGC !+̾+͢HH /_.۵sێ|>~AοxܫWUVV:uj͚5TD&h[|Çƍ۳gܹs.]*lIgϞٳgW\)nݺdSϟ?񱲲JHH ܸq_/LLL޿/\) `ȑ֭vZm{zz:88lݺG @4'BWMB7g25ou^d9dӪkߏ$\vCGGcٯ322}K"ĤaC-[WK'd]}ŏ1f'rSSS%QC]SYYلAMiԉ=xW$}˥l$1WVV7ǻq㆛[RR5j觃 ۷ollƅ ֮]ٳݻw'$$?~\.駟***6~w\\˗/N+̙SVVv=jCyxx.ѣ~!33SRk/_HKKsNllŋqr.EAYRmY&yJթmܸã?>^xOu!gFz]t+*==fGFFRorrrw)STUU9so&!d„ C 2e֘Lf]]޽{===-,,zbrB zXP6YoLd{{D­6o5_ =irrʯB!zzz<O훜\B.!/ Z5gϣϜ93e췞7n̸qcΝ-h hիWRq111|رc ֚_~ɓ;Q}b={h!SS#FO+_~ O?널'N {?xbuʕ4WWW}}}egg8PIIiĈ|>qA6RԮeҜ$_`ągg!%/YŒ_N133qikkQ|lŗK\@ݻC8oSW0\<'Yv>p k ^yFIضoGh܎$\ϐJeeDނUTT\zE===VZR^^?Bݻwcǎ]fυW@hh0"Btuu'O|qI)F:uۛdbbr3fPQQ:u!ѣGYYY”>v^z߿b[uqqӧz^^޾}Zctմ,% ӚT( K-q!)+GwAMfi|`@`"wuf̘@r 9CDSb]~}„ >|ʕ+̙b\׸5>k.kdd${ȉ'6H@`:gj2?x45/%Ӑ{*HLL%2h2,="?{A"@8p!C~-h [N]k(ݻaaaVVV#,teĄp3"Y4յL9ւ&CD&:%ev/ %t [[L~:ajt54;*ʢY4g؞&Lݬϻy YTHHJ ,).揵 2c,#%tTwA_2feɗ,%7w{J͑BP&Hʤ9c-IR2@C32if/2MjR7C`L!@!fd#rtO/r)? "|EFF rBMe"!GI~O0'5Chв,fΈFA&neJkLoFUA:L 9YX=OHʸ) @)ܹs·fff!CZGMM``4(/}\M⺺ee^z|&)!//d{`TWW'$$ 0XUtETy>Ǐ?~Ŋ%%%jjjKΞ=ŋUUUsɓ| !III'O :p5%;;;++K[[ҒN7Abg [qٳXYYFDD4a׮]!!!Vq㆝s/^011y=!) `ȑ֭ڱc҆ [YYyԩ5kPBѶnˇr\>_UUϾ!Z[[_رcՄ???GGǍ7Θ1cōw !ݻ'E fُ=:zh#l޼|yhh9sݻG}z!mTTTLḶG"""~LYVѥ?~6,))5JA766VSSs…3gܾ}/dlܸq\.799q̻wfddܹ4<5cą9ZXm۶Q1Ȩ&!!aђUVV;|)SΜ9 ?$L0aС]Evƍݻw[YY=|`Nuuuɓ׮];~իgϞ}+ݻ7!KfXKLL|}}}}LLEd dd>pp驉 4FCb)yȑ}y޼yCӷl"boo/iВ%K nܸ(HOOOZ__???ef̘`0-zW\tٳgǍ'x9&bOhʔ)Ư^jrEG4hIff͛7KKKq› )\2"2| б|ccI&-_"߿f``K/rǎs?~<77rʕ4WWWW=l۶رcN2kTTի n*ֽ~zVV]F***JJJ={…_~ÇARfVeDd !Oӳd2AAACZ֭[^3f̚5KKKKtNwwcZXX߿' *OOϰ_~SN ؾ};!DAA!<|ʕ+̙bۚUt6'NeN@r @ YQRRbX-?SPPPRRbff&?g2ҒJr+!z$? S%o&8dۨ]aii)w BVVV\E>iHUU¢5kkkS lCxځTTTΟ?`  )vA!pdGG PD /!ey(R2@w'Ԓ, $驉9ynp >mTF9yR&Cr[H|M!yN[JׯjFP^" @=.K{\~˴2zh:==%ק;wn‰TD&p޽{Ss޽Jlgggc8;;Ąvy]]]ŋ@*ϟ?_Rdvr\I4I4˖-8p'F)9==FQsrssuuuocbbʬ[aNJJ^'''[YYB?~|˗/r\KKK@,lGTEEEnn!6**֖NmHGFB}||>}yfBp?t,%l Ʃ<}3))ItNѷUUUo޼4hM*fff뫪۷WUU 8BEE$%% $B9rȒ%K$`{GF|eehjjrC~dKEQȑ#!V9EߦӇSSSLrĉٳgÇ))))))͞=]CC 6!$$ȑ#yyyAAAԝ7Ķ`{GF޽;>>۷SNMJJ:pg}cnm9x@eLOM1HK/}jFl-r{̫W:t7STTlV;ZҲ2]]]=-PTTԯ_? +bĉZ$H@zcj2?x=+;Dd@JX\^SSSSS())83RPPMnV;Z( 1Hɝь3,--{D2ȁ;9: %@Ddd L) ЁEQQjvP^.']dd$ R"P ) =f);C>)ܹsS,X`bb"i~`0~E&Kϟ :Kq'N8|j)󻺺^tIҧvvv,VM^ׯ_[I4cŔ)S`w F]]]||!$''GYYY[[ a֭...bW0ruYYYرCJA?naacee@M~+ VXXFA)A}ǒ%KowE>{,66VMM?ߗ_~y۷o7L&!d۶m۝O?Dv횯offfzzzDDĻwzMyM|)SfϞ=` RnCM~嗾ϟ?X8κuHACh/Kf0"-秦Fرcor:`ӧSE_HiP6Hjа>//+Ba+ 8p턐:Btz7KɚZz|q6ViVYkjj EJ˗N\I'M|JB@ >NMM%())1 Ǐ%\r%--URMt2551bO?$x<ǏO%fYX豜իЯ%Lm}] @CGKCi8wWZu-UUqIozzzL&3((e߾}b>vX SVlMthNznzzzhh咽"r+N6:;2%+++ڵҥKW>t萦&'<[ww PtΛ !vvv˗/3g+j'/o߾߿?`hhh~nh'A㢠bP89F{R[28{mDwVЌ۷o?ٳwF䅺D8WFtcqGC!@L߿/l2o޼@??:O^)(&&zfkjj ܍#q<+% 0o%lذnӦM(|+))[lQ}DyEdQQgP w2KZh4BJhhQX,kP7<{sJ6mZEE{{jO^TTT\WYYinnNtzhvdh(tˈ:=(R2tmEh(;:J@B_2!\'/F0KH]/!eyg{rCǀ }$$KIzjbN^Aw8p[\h FJ mr"͏^vN)9225j;(/, qCDwJ8q"jvh<@@TOADhה $̷obЬ3(t'#%tUfrУ`@R2@ FG#ܹs1O^?~w-[ ) !DdOjjjo߾޾~zΜ9:::(Zȑ#׿P ?q-^zh"WWWO^~Ÿ d|С:uf_x#"@0OɺXd ǻx񢺺:j==%BΝ{ '''n<1=5<͚[KKKKK UhƁ*%܃2"2H 0H)G-,,|=!P #2"2 tNx^pԩ/zM)((ZR\)ҥK(Y[XhѢEPh2 ~-h)#. ADv:R2R2dhdiX Nq~ -ӧ- D@Z\ H]GRK4&n )SBحH=??'('/u᩹B 4tXJtBydJ8q"jvh4ڃPslBg "tXJHK}[Q1G2R2@gfa-< v %tuH>/%gee>}ŋkkkxƍ~͙3gԨQ @gOYYYSW^r1zh1cƄ, T)ѣ·Ν;|*(:::kuu;w"%؄D0ʢg`w”,} .DE !,& dv@os133۱cj*++<8{lȈ_]7L|5/yϞ=SPP@䮾GGGgڵ@7f>pp驉 RA=V3?zʕ~pr.\sM%%%kcRrTTW_}:tPTM|/;s玺: У2"2 ڈL#.f͚XXX(޷o_z(>ǏB{FDdK|29x] ^eeeXXXVVUX"@sp0<)믿 hPؚ$pv @t) hTdh#.%_Bv8iKQ0L@J>>Z$=51'u)!IOd 4;En7%GFk Ъ0:8%O85ji7%@e%>ۨ4J5=bdZy )C9nN;fjj(:ի\.wΜ9bBe{ɓgΜIa\>tڟL{Պ+Dx%KKZᔗ2:|AAA?UV& %3!644Hk2%nٲ%!!aȐ!Ԕ2oooBHvvvVV%.&vkjj*++SX,s\cwþ}mllv؁LN=ḝԗlnn>~PYf9::nܸqƌGۻ>>~ %#0丌SN !~~~gΜ'ݸqϏq̻wfddܹS},z{{G=z׷O.Yd̙gϞš 1'Yq1gΜo͛nnngΜן4i!bݻw/1111126m۶8BQMMMBBѣ{`0t:zi@O`>pp驉 0AgN3wܰ077P___j`[NNd0o߾7o-[' B >}>Pn)=5APFD)7iҤw_|yR555BHAAAFF؄-J;ꅱ1?vneee񊊊zHPFDD}qƙ,\Ą󳳳 !Trm&Lɓ&MZ|yee%!D ܿ}/_\WWG)//_~=Ų 2"2?d,dB_~~>u!hŊvvvӧO7oإ֯_mell/vZa:DEE57`IYiQQу8;;9sz6c Y~䴴I(T\\\WWWRRSP'pܸxPVXlٲ={ g(++{ׯwUUU>xچ'Ozgnr߽|266vٲ$22277%<>wܱҒUNNN5~ԔYfEFFfddhiiݾ}d6X|ȑaaaSL!p8hhh*((hiie{4""bݺu6l&xE&''֭[3g{ɡCM|>ܹO>;w]VSSs֬Y&L8tPAAwɓNNN>d2.\vZtttYYӧO{-p%\zMEќ/\{O;W {:nܸGٸqcffݻw322v)Y@f=ztQ__ߪ*YҨGEDDYQ; #:u]MMMˈ;wRNl`VVV?CCCy<ާ~˩S6~TXbb"9rYlllTTӧ׬YCJY Ѯ_(;2'O|G ڵkϟ?dȐ&Gx7nIߪ#Ffdܜ9sۛ7o9sF__ҤIu޽`VVVTTԶm!FFF555 GnrY)+󣆍N0aС-^Q;?5k O8J?2ɬۻwE߾}%Mׯlp@ppYNNRՄaϱؔO%ɓ's8%egS)))YYYT3F[tSd?Htttd9<>>}P+B}JJ]]]ssW^I*<|#>}̝;7,,-44חJZnnn999nnnL&`}V߼yCӷl"boo/idsRV'|ߚ3MMO>$00AE?w޽i&==[Ν;W+W|TSWTTLB?E200knp܋ !Jղ쬢>}Ro$ <OCxᝲmMM#n!}x<YzJJ&M4ݻ/_&dff޼yA,((~ؘ;vdRы]\\Z?vJ\C,X0}t55DWDӅc* +jRgΜ?~\vg466ϧrsjjj##|Y( aÕJgΜir8Y}GŚO7n… MLL!|> Trm& @&MZ|95@ ܿ_GPPFǏS/rJZZ+ MrNe$9;; JJJ#F4M+200x%jjj:bĈ~I x׏?J ܹ۶mrdyy]166vtt ,..N}7~ϟ7kR=\vvvMn_%YSdB_~~>u!hŊvvvӧOt߾}b6L8zzzL&3((H@CiRwwcZXX߿z2S:Ɔ`NT\{{ظ۷`xEVu떪qh4کS>}*v~cǎ1 }}}--5Jҏ#B9{leeg}FѨ͖e͛7d_$b׫W7$mU]]ݭ[|||r?tIzjuFZfM6QPPPRRbff&e8f}}WD@Օf633bQrEm'22Y #ׯ_s\###j4p84Mtl$FFFĭ,R0NMP]MFQBG R+UVV׊:?2NF49Q֬A޲!׮]KMMܴiӺu뚵~[6k:\8ҍ꯿ڵkV)@>,,,߿կ_cǎ6kqSS#G2"2'ڽ{7mtibh K=8d. @|DF)]#."##Q@LCHQQ R"Ph%!Ša@ R{\tW?:/@D)߿P.k=|cP})9%%%11del6h%ưs;lAŋ{yy1cf͚Ejjj~ĺ:[[SK%$$9sFAAaѢEl6{͚5 JMM g0 섄&>uTIhjjFDDoҥo޼9{, 033#pK..^t!!k_2Ͷl0Ν;cƌ:sٳg !yyy//Yf]xڵk\rڴi...Wr Z{cbb,XP[[LM{~嗨(www+++I۷/%%eΜ9AAA'N>}z^6mD5a6=s窪E}-ZC־NڰaÇLYp͛7}||LMM PRRRQQ1zW^nذaϞ=Ç'=}q47nNZWW׫W R3;88]Vy\]]Bĉ>|xA:ޫW7RK=zhǎ}!d8 @֔\__ޠ/9::Ȅ.ۻwoBHXXuuu Ƌ/թLj$a/UPPPPP +\V}`٢lmmtʄIgENNNtOn޼"z2%'''+*~SSSkkk !<~xMMM.{! 4wNx:qP՝_hgth@JAWi>uV#.|DP;%t @K.**B r Lj헒']dd$ R"PH U|wpz'seddNY`Is`5*66VSSњ&fK'NɱNn***Op8岷񲳳y<^7k*6+I@=kdBȔ)S`w F]]]||쬬,mmmKKK:EEE  066\ N/--366VUUh=2 kd--;w~ׄ??HSSӌ --۷o3LjuFGGoذ!88A))) ZZZ)))'OO!nnn=eX͸z?X"ٳبӧOYB6nܘy݌ ##;w ۉyQDD?a!z{{G=z׷/Ydʕϟ?geeea ^@g8ui:P3 ?A~~~jjjɓ's8bݻ~~~%w&L:thxx8Lʊڶm[\\!Ȩ&!!A]]=99yٲeTp <|:@J vSb)nڵ Rsssqssc2 ۷E[{ N߲ep=-QV_m!@ .6<]#%.33͛TsAA]䲳E_.kll;bDWTTS\݇@3`B4c\rMMMZ[QSA6==â?~<77rʕ4WW)yҤI˗/= x<333[[ۍ7B\?=E:%u0@'Jɇq9IsXz}ر>>>700hӧ,--LfPPϧhGxbMLLFխNEr01C& ߘYXg%~lfa JJJ|T[[b+i񊊊]]]ѧեwGFFN8 TJ<ۑ,=WB~w8&سm CtL,@JLۮiYGVVVg0 &ի :;:%Ds NH -(#"<t(A8e7.@GiPF@Jٿ3eь8d@¾dh8]Mj/9225j;(/1r3R]qh{C"2 8 ]:#dq|,@2<=eї|7nڴimY^^^-X`ԨQp8jjj S|5!2Ho%Y%KֶlҥmYexl'eWWK.u/HfEdB3@ԗ\YYy;wLHYYYtꄄK \.FRpiii\\ƛW\\\WWWRR-ŀ.\.ϯNH??HSSӌ --۷o3LBÇLf|| ]]VV޽{S>>222""555^ezzz3g677[S͜9sW^UoAAARRܹs͛233ܿ?''wߥ2 E25qF'@-Wt|Y} s\,^xńׯ{zzy{{y{{lUZZJקե"455ո\.㕔(ѣGL&3"".:uhBHii)Ţ+x^yvyQ3:1 ?Fˡߥd W1bժU۶m077 uqq\bE7g_5WpĉF.kkkfCBBTF\0Ç9slȑTy'+hJ9 k][ 䭁#{+k?[YӏjWWW[YYihhtu'Nܸqea:)HLLL:^KKH$ÇW.Wz*'!!a֬YT RrqtM=vO>6Ӭlg0.YWWںm9ánm:::vvvaXTjw#j^_Eo@G2@͜9Wms ]*iS~qGFFbhz7Za ῟_ wʟ37C3H@WӕMsQi|d>D Č՟;@_2K``]@O h ǀp< SrW紇.Ed4/*¸dr?'N % ^')^\CopFu8uꔑGo9--;Zd߾*bX__b[3--m/^giiI-mnn޵kVXX]-Zfk֬Yf͜9s5]z5%%~:o<4 @n_rtt+Wzq2P&#@Х+uَjnڴiŊO/=g}NW8{lIIIAA---B!/44o)P߅ N:UT]]zX'^~%KlaooEp8[[[&Y&==BWWWQX,Vss>zh* L4IGGGeꢢ"嬬K% ,8yΝ;555 !ǎ[po޽{ ! bĉ;v ̛7/((3W@̞=[w)BD$)999yҥMMMΝ7n!$000!!2//%$$$x{{=Z"#// *:::޼yfgdd^x1%%vw:t*wD'O7nѣG?kkk%EEEqqq/...}w}t` 2~`XdP_]]]bb"5jr@O UMOdLzj__,BAٺuk~~wEׯ߸qcrrP(333322~O>oܸq *onggydL}IT ;FW^ۮ&&&"''_~*Pŋƍ, 27HRH$ 7nnڴ)55"####""Z[[SSS !yw ! cÆ ի3glnn~뭷!:::SNҦU _^QQTOOx<\=]j?QUU#9ʕ+&0P1uEII&=̗,̼l6*--%X,z ]bcutt) 444|W7lkɓ'?xYYYSLw7o|H?xW@7HR+m譠 'y[@\W0⢩BSxxBd[l1cԔTDVrttܺu+e@ Ύvʒm͘1#99m333$ZZZ$I]]]ZZ7|3{lzo6c @MΝJ>h֬YХ9lwqܹs嚘D"q桡...T gΜ1339r;'$8]]]WWWE+VqD"Qm&ݯ,\9**NqqqxWjdddjjb?6Ѡ~wDOV^lemMbr ˫Tz"|~x͍ `O>^Y!?355m;NW?"\nzc1ڝ_ }4{vGu-ҲWMcǎ?vލt@ E.00R@giiyСo!ad<4C< |idx^5$}hjd[ <3$c"2R2 25)ӽ .#%@D=`Ay887@=cJWR2n{\#2p /m>aK1y4;" ~..B\ % Oՠ~!hꎸ8uԶm۷ܹ{;^dIll,X,K$+}(O!~}Yxxxv"^^^gϞ};Ճ+tSFU `)`'ORO;pB R4===##.,++khhyÇ GGGBHUUUKKKuuuQQQyy37USS?5N͚J[o@<`ffG)..}_zirru@@]ff&U>o޼w}),,믿ʽ{BݻE"QddOXXX ;vlhhhbb"N@Wu v39(/$๤dBH``c!111>>>TL&[zozzzVVG@@=BݻiiiIII'Nr6onggyGv̔%KBaW;^N~~~ׯ_ E"P(ܸq#tӦMEEEt򴻻'Obq'|Sk׮e8m=ɂdgA̫5KɆ MMMC=~Ga:2.:9v>f`(r.d? ׬Y<+ikkkqq1Tdc*:BxA2fضB"AJV5LzD)<<\Pd-[̘1竹M>EWK{R)dq>=%3L7s.kbb"=6tuu]]]{)P? 2: jP?ԽCk.Zg]FFX,f0ʣC Q.6mP()x~x/Rx<^?7-WtS[Pt/tCdLYKK  +:1Иh$=[W / % p>.+:xnm;HtIbyOjz@dx._4~TyxǩP %ϩ ;00.@3F`@#FJ4/tFCq ,^{h(ܗ')nܸqV V]qҲ{3rccWXuN !?X,?~ʕ+555~{8::1LPf^ֶν{BQ\\[oE磻$&&ѣGFjwx@[]Kqrr=ztNNUxͯ:55uʕ͛6m<11qݺu+WLHHo!ń˗kgΜx"!$>>~߾}III>>>vvvٿFFҥKwI~x-u;S+++;v)Bunn.U. ]]]<<kjjJKK Evv6C:~z*[nff^[[KmPPx<]]]\sΆ1cdgg[[[S҄vX[[ӿζ#P(H!r]@ݗWQQ|rX77C8;;CۖO>}̙c5wK'ZYYikk B*RYJք3fL:ܼl۶mSLiw8.ڎklw?~x___Xrnݎ)l6[__*J%%%<OKK}SGٓ'OMLLttt:u1bނGĬYCkmWcq1.M, /_AA\mnnԩL__mnk=Yy… =K~7T0 0*40 \CBСCGNF;y.\ɺe,=C@MK__SyyEvv;B-j]Fk? @}KcO>"xy/MNIuRE$# h+j*Қ֖ںRmm-6dƌ(--U)̺ Ç kɚ9i3fLTԱ‡p/vlG@OSree%AtvuT&m 6B>ChȆ[W[z'%wOYnnhh#m_sƏ?zRyiÇyyNFSOvR^Nl Z;tP>BCCvlbbL)+/GJdl]vr2ؘ1!5!0 jB 5a&8$LBd_;OvrrJ>uԶm۶o߾gϞӧO?zHϟߍ[dIll,X,K$`m``0vߎfNyefÇtps8+PuG\DGGJ˗/^zŊ}ݐ!C:Y+***###..nذa88X걗`mr4`vض1>Ǻ9.~˖-QQQ\;;;M6YZZ^vm۶K.O>>>'O$Ξ={֭ .2eJUUɓ'ߺuz,jkkw{nHr0wrrϜ/\@INNl*:̛7/88xرx Vݟ}3qĀ__pBŋ˖oZe֭TG\._lٮ]"""vG\(+W:99|H>d2ʽSNmwoo"ooo6bJKK{?~ KJJ455q<;ѥ:mq)c9r$QQQTH~~+Wjjj !yyy"==qYYY3v'hmm-,, MMM[[[|>!Tx:C~"H޽v}Q9uΜ9^}}=!DPܸqC&qMM\^XXHDoBcǞ;w"JQm]f ~GXWW'---él2c * :R2!8p@__-_\.'''{xxPN8rmmmlvHHH8knnboob zі-[~G@`aa1a„vꪲ(&&"++`ܹs嚘DGIu1=}ʋߖD")**211144Nyyyuurykk\.5jjjJKK̨Rb1|0quz~<ϔ0 oAh#g͚եU\nzcΆFܼ?o|_5Lx@[-ekky8455{wB_:=?PG1cQ )bwnCjwT{ % % %R2@1EBBIg4K]мGduB bnn6ŅdY)^jWTYU5~CSSS̉Sf_@R2&M`BȣGE+פg899RJJJKJJ ͩ>FT:|pBHSSsݓ:c"+**+F+z3%:u*//`ӧ=p7jkkMMM]]]ϟOYdq@ݻ|Gl2ggvedd9rۻˡ]|>dVWPO#>ߙ7gÆ駥g2B>}쉘#-3>˗fu;\ttٳgbqNN֬Y,88xÆ stt}wr@3j2eJZZڨQMvɶu޽;uTBѣ˾----#&ʃĞ=}!'//xfe9*%%8@G2 #.K=vww 9p!bIcr8‚ckkd2 !ȈPUUejjJ|>Fo'wwwD.?L #477+!!d Tbp^fÇڵ_Χ~W_BLMM|!CU9Κ.pk?RRR444d :6%%u0ǏC{ƍ$5u"[ljll$̛7/88xرg޺u… LRUUEIHH>>O<_ex3NvC2*|}'O$zzzO$19%-5-}xg%9fxzU*L4f !t?ev1sǏYYYǏ7.>>.>>~*)pժU]]]_}ǫӳǁƮ " 7<<rŀCd?R677ӿ`X>r徫\xb;I.R55ԄqN_4|0N&&ƱglCSS uuԧ՗LYv-ޚȈTBK|||uuu^^uBH||<=BϜ9cll|ȑ &t灊m۶%&&?^GG ))iܹMMM8/VccO>DeջNww qMZ[esɺM?nHg9j!tY'Ih=x)666#GC&\RSSO)//ˣS~;bĈsr8ss={p\kk5w\ ߾}7޸|1c \y0"Bjݶ)<55uڴiP4a„*)S{姺W+}< 8!d/ǯLx3- ]҅D}Z.WTTTVVRC=^zryDD+2z>,Dd8/_.˓=<> stream xuVK6 WsRǒ߽ڢA/=fbRɞ"8, $IL2d":6)ZʲNMWujX2kTn~O]T[iay|n6m+U%פVIQdHv׵h<T#L7Dbh@IŽbLGCt$h'G?{>@B~?E@| eͼȼxrR2m˒GxQɞގtX a5Yb8<1O#=I(`&>rZsNSYV JL.Fq0yZo!:UؙqK19!ե{՝ 9ԡ'k vҪf $fFMudZYE hZaR P"w-" *3ikTY_Џ;-ڹC%{(>柂WA%>V|Ÿ X^ɟPüB.JaFXoU 7NU&=ቲ.vP9zO@ byMU2mdhM ʣFY q[ti}. rlGU@;BBBwGmr&AGEA"8юx3!HaCDU@bN+З0뻢/C{\MB8aD0Rg y%s<,%Ѝy{Lc 1nmGw3!pxc_o 2aV蘧g asPaʍTj~U09yA hRJC#qQ$a^z5SY#Lp̲js#h;w̝",~ L' t'`q5tIնI*6ظn\m6''!ؚkximv b(2ŸB' @L@Oi4tHkL^ 0e<(fnVu">$zjBS~PmxW(;ѧyS^'{)4Zq-@_]ӥ ? PITf ؾTl.> endstream endobj 823 0 obj << /Type /ObjStm /N 100 /First 873 /Length 2310 /Filter /FlateDecode >> stream xY[S~ׯG/R[%\rق=I!_GF5"kɢ|xaXYLJa)MbY|D` HZ *Gjq؎ P`-hU dVV2UϴVA#lUt0mj#q'a Eȡi;0I988v3Z@CcB(@ϰP=d1[2!A;4odVbY Gkr0ôފ,"-Ia&T9iiBr *Ǵc;-EX3Nд9KGɔ2 p `Q"L5|țAUweA[]ӲQQ <~߹ɿIaY@ybP]'[l9,{#GJ CiiHK順Ps:߃/Yy Sk>2z2GJriPoT~#XGZ}"PPQzUEtx?0GO[;o6A c.7j`*dHB:q"qǦ˴LmBa A5Hތ)I=$٪,d[k92/ tHP^Xy}8fɹaG12l3'~'&m6BU"K輄7$Q'#8 m_zdxʜ\ " Y\<([vȺKN(ې&ow #H7 -t`l(VsM*r82mp¯K黈D3 !J: 2U5F.8%=LGu [%MPx%BA2['E\EeQyz!~ ɁCl PƽK8rB~Vh 4/n_ >\D5Vg\P|CҨx8- 7!{6AX"ߧOȽpꃾ*8ju,1& IbǦ˧B Vm> stream x|M#$(ة5jS{[#DĬUW AbdȔ!{PZmui֯ۛ!b%߯뾞y977q7?~—72I!B!'ǂ}C !B!fB!B)G!B!3B!BHϐ=,&5k˦c{v|rd vlB!BH> 2u>ƌa,.Ye4=NxN&Y>"q!B!`hd}0۞ԽSf4]pRo3##wm>[v [B!1|v`g춻VBH͢-N:lRm9.xHiKm^zn$br@Z͝@c4B!$njZc6d93WT-5}Z 4wܕ7,V}1j̕mv̱Ee+kC!bپtaNם;:o6|]tw6oVA3̚,iy&+Λ'Y.Z{}20+i?mَxlX!L_GWs+uTې{ \>Q}rԆ6~NN%*=;/txݭIv|hfӼh}>z7o5dQ*ezKB!oU,W9bZ!\O1l+,+7ԔK^)W2rni~!AaQ9vlʊ ۏbZyKX]XM[2~NF+ml•RvF=,6-]Ee%whwJY̥q¢t1>yGud1qv}G. kwh!הe_L+DK+\->:fK[Ædذ˖12i:|i6g֬˿=GZvD (J%!-=&,mj 7oAB<}Q*a:ںŢg)2e[p;GE^+6iv6 (Z%¢tOL`>^v='.n?t; !lJ>+Y[۳xqjՎPҠoҞ::GW0$OzrapLB$REU !=6~AǏ->jim{oò[{X2h\XԓKAcWlخ"rYUV2mҎ'?9vm¢tͷ2jGæwg|܅/ˊ On!LZʇw/uAK뒖V?.5J+櫣㫫{@GWGR#>ZmՇtccT!(J1!$}2i]\R΃k~3,}{ҕvW>\vs*5?V W|ywdl\|eg: .,}FMQI:G,x徘䴃GFZv!4dNHqZZhiWH%8[gTݠ1C>?4%RE̱1!!=,fϿ/[-]+%a?o=zI3c1s,uUW\a?fzԅ˨S.WZY6vo~4tmsBHJli`vM-TCFbXUAWtz4X-u*,֒B[ o>}FQVeH.M1ncq; cȄ' ~[Ia؞)]zNX(n!ݻ|<*m4[C!-}S-*wKJvhHB!9פŽ&,5qv=Iޓ("*k⢧tD;!BӖ睞WTzQK뢖lԴ~=uB!eۈ{t>o~wBH+VU欥ϝ-?jiu[KKCSM|!$y+!Y'&f2n:[QzۺXB!B5##B!™1l$B!™7N\B!B aN_=lgll]B!RxB!Rx U(Lh"!B! ,B!B!BB!BB!B! !B!a-[6ok=KYޭ붭+kmIBC4DTZ%!.ZcQqϺukV9;kT~{ǎm_lX1^x' !B)TҡCu :Xɒ XV6ix횕/jg4%?&:2LKK+9)YC?gL5Y+VXj rǪ;{֌{!B!ENX4fѱ1i) 9Ζe爗kNv-Uc\; jOԯv`.VI?U;b44ǣ'i)[Wʗ.IY^_G?HyBxB!PXg5kԮeҢyr:E YZ&&#G S j-WZU 46ڲe Ʃ{f>_>nUVQL2IvL9%TLY/PXr{{wҴA}yyh6| !B[uIqE&M6ieݳB'9c_(*i).,},e+.,$LO|rYOF99ѥ$Qv@v~%RիG|MeaSnqsq 9χB!Ҽm* 8G$YFgASSȪ<]_~{VZEuf$?G׬YOWG(Uhu"-7[rYE+W6V%ysgd| !B\Z[[[爇_ BZ |":dPn]LM3ie٧O];u)6&tRI 1bvE꒰r0U.'P ?}ɝ:vQXu2qg}0*5k֨XBnG.;&R~*,y쀆+^g%JD CN!B/.;tIRF .^HyֿQ:qK+WXq9 KZ&zzz͛}Pa i܎4k߾m {d?[…%1GVZFQ֮N!Blay֤&ST#sӾףƼ{Q; "u!=Iޫ| !Bț-,Zxyʠ /sh:VsEXTB!ΰBqcGv} B! !B! ,B!B!B ڷB!B IԅE 0yB0#d#_]@X!!mCXa! ,v wX;x@)QqtaQjh-7ε,vuϕsBJXFYbV;ڤfM̬k 61mP&;wF}֭3t`%K/ocvXYۤIkV>B(<’xPUbE5_os1ʪ@Wg3N(mT 8d )’8+3/OW 1.Bc5Ť$hK{FG?lWi@! FaIإvTjU5E}sۨ4o;x ^HץG >jqaչ`)=[N"eio``:͑x^2OI@ɒ%M̴TݳBWVM̵%Ҧ_>Z$w¢mTIٮb^!a+,4^ճ{VfZvaAb]v}P,FdguP){XZ/62"84_ n.JzZ^ Kf̷DamN.\`ұkUlYva7=j (w@mߺ)MigO5hkkw爇jCa!ZqIƞQe'?ljz^l`떍agӫCX zd#ƍ֯T 9/~/L+K(HU(,DFklQVIri),{Fs{ƁRt#2!3zaCZP>4Ǽ{!{ I-k׮UFu EXMҥ*W6[V\%a&]:w244ebRi'y8*V5ss ƞQ@ycEzrHOM|< LX&(TXH`VfjApR9=-!RKMTIM?]"}b^-Ǎ>R1la%,NI¢/^Zj>6Q|<  sR …ua@X@XaB%,Ws玪/{x֭wo޽}||x‚/,={ŋj7oqƗ=io&M>aiӦMɒ%Ç Ѫ"Ro޼=z$ey>EtRpppbbY駟7nyfim͵kBCC3224F;w]~=I/c7e_Tfffʁݳ!'9! KX,Yҭ[7++rźu6hР}+V<}TըQCi`… R/_Ǐ'"RJݛ6mڣG\xa͚5e[R#&&&]v-ZW)SԮ]UV;w,Lmrܐ~„ Ҿe˖ŋE*9Ry 7 ʧ@Xx]'J]Xdֺuk;;;Ǎeo~JFرC˗/2d0%%dɒ %ai dkkG_  ){yye?[7wWZe``yf)u9tPo & ˥iwR޽{>|x;aAX5 `Ŋb FjժU}o˗1_MnRo]dIP&M3gNoa7g'۷޽{+_}zoW / u23JX] DŊOuVelٲ{/YDj˴Zl\g%\rED@WlH9-䱡KoyO zw>%Ly=~ r>ʄ͛FFFt2tPΎǏ?|P1CCwy'--M͛'ey d###uttkK/徒ׯ.)CV+[ Knʧ888lڴIi2XcgF֪֭[_~2e6mzp=d¯O<)OE4ʖ-[Z JAu7hРxڵSk```jjZNkkk#r<帡 KnoڵS g.]wa%䇻wfff>zիYYY"y4}QNXqm=}rޭ\A)uۧWժULԗ֬ڵkUl,2 ,B.3S,oaٷwut8ڣ\:u0v(Hy$%J̚9]!gTZ5GAXa!eF-,;oGs\m9Lо]VT ٣#@X!0,7aqwuvnqmvmխ3qxѓݺJX*{v뫺{A ,IU^],h1~,\Xl8zּ.غecD̗"CSilHYޭ붭+k\cBraYviSPfZY\a}M:* sws*W,\X:thgڠ#Һ2xyFZb%3֯y)ln:CVd6nM4^feF[.,Oeͪjժ+V\rzzm۶twÇ(QfժV6t0_X,ƏU՟9ub GPՄ:;HiJM|\T.<[¢!MKIL=sU'c\;HKєUI 1n.AMIpw M䶷uaQ!gPbjőPEzr=='VVmժVmdPlB*[N50З3 fO*rj֬QIʕ+w^iҠRJ {6daCWO*K(bR^ԦtRծ]kaĝ?염Rk'KǼ|.Uy4+[I~E*:2Lw8a! _XF}cuuu˪ {e_Byte#hV0aQ\Ҧu޽{+מ9;ge@Xܺ}􊏋yi , ~aQ/^Zj>6Q54B__vZ5jT`1Ne".kɴ?f"CtdhhXĤT)#S/LX#:d(5|XbOB^<51'߬IM?ܾuӻVfKIٻg碅mԶ\r3%EWX^{@X^`ON׫gÇb^RpmAX% Lț_yLM !,j7 Cq5=F^ o OaAX@Xa!  *a)Ǐ , 9k=+4$ ?L{eF_v{.]L˻}ZJСk2i߾si:vس{;@}zL4!?afp5ϴ:3mP葃 ,W\nev5 |7MizaB(,+W [X⢋/>fn =":2BzRL;|9+=>.AzKlblL63#/&,*3NU#9:k#2t dɉ|tDZJBb|ae{) 8d☗jOaIJqsq  BX($²aÆ#G޾};oaY|/_nzcccGJYAFen9@Zժff (|zVxAݺuW蘭O"ٲyj֬QIʕ+w^`1?&VSCUR ߽k[.]Lճi߮iյdw!cM4.Q˖L1 w뚷h\VvS&)F]Xdt6uYӦMfZY*mĕ*T( 1G1L.ѓ()GUKS3J_񗔤X)ܱdɒO K[֩S{zxwڶiR~Ŷ @X ̽HM >7nܐ5j uttG?Q]]]Oa zյa!ge1"lvaQr=Xhn.O.''FFFGr lrnde6A4a[jeҫC)e{ˮ[EyǤ>9..N۷m:tpRᬙӏzFXaWsIXfFr֭T)KM/ ܹsRΝ;p@ggt?b\JfϚ` j I=KDmz!#dethkk*pQX>lRΣá;70j۷n~}FZӯQXCeW,_*vWSIͪUȻO:uP|֭aR9n(}V\~>{",+%)!ICW)?=,׮]ٳh˟Tax!lٲ{PNU֚Ԭ4nd~ݧJ}p:,S_9F觫Wjr##^*\fXWWW ˂O+VKG4/|DX~}}SJi_. ^M1;W]X7?|pÆ yJ,)xUMLTQo)M^O^*a֭ ;A.g5BVfZ>[hM6sTyW9$ d/-,{TxQ(+$NɒUV)[ȜVR }Uwy;Q/zzӦNrwu@Xm.;}<\}FWnoTbJRfԮe׼OΪmP^ʔ)#t"*QlU+EE>21)UԴ8⼅%^WK\ٸn:R %aݻu?)Uٹ}XM'%͛6jR_hݪv ,v SpJ*DDG_%E?gKBCN3z)%axǎz*.sfyrUO@X( K>~5 KDXPBxh`.5iH<]\6{voV~Cv#  BXa%,( }ڵʖ-ST)ÊUXĤXFzz!,B^<+O;^t18t~F@Xa$ay ,B@XaAX@Xa! @EX'᳁ ,څo/SD^'oOPaW,,KO^}1axVa*(Ca@XHR8 ,‚hqI , ‚ AXaAXaAX@Xu?lٲ% E 駟nڴƍu֭w" #,o7r", 6a c+6?3={6ijܸqeʔ۷Ǐgpʔ);wӓ㏼{5oyNayOp , 6aQB n~1g$ WBFFFʕOvZhh?zH駟7ny7o޾};f , -a0g x𡎎WޤI ֮];55U*\Jݻ7mڴGO/(^.e ]֬YE*RxbCCCi޼4ȭ , ENXT|g طo_b.\ bjj`ҲYf?NII)Y_5?’.(7o*> ܚRTe 3uʤgrڭ\a@Q,j+_.]vڕ*UٺuT^xQFS]uYqxD׮]{ҥW_}%###,m۶իW0@(,5K[r)=6 "ܻw`ȏ5*))vwVn,]ǂb%!)'G.,66TNmUVqt8wJXCd ʷlѼn:l,,?n޼iӤÇwAyrWVV&22RGG'Ȁ3f̐966v„ 57\~]+--Mʗ/_666Vy &,2lwwhCeGcnu?kS':t:pw)1 55\h޿^aAի ~}}SJӾ "\pqƕ*U*_˗_~HJٲeUְaC)ٳ',QSRRTkmll LMMԩcmm2Aŋo׮]͠`²pΜNX KQO' Hm`)D_.F'{#-MHFX^:;H3J,rϭ^]XzN:Չ{Xuַ~^ѣWfee= sÇ/Ta9oQ{[Msm3ݵ4yw[⩄oN~xׇCpp ˖Zϒ,]x`Kç$ :v->taoܾYGGG3k]kòyӆVZ뗨RU+@XE; Yʭ#mgo>)ɩgn9cs7w//K?9/aСicF)]=S4bXpR>NŬ̴>G<]S;H!̟<789ԜHKIHq9c/%AOx!E]Xb\CDկ_O徕]>jҸQ"oRgvmm@?x\OscR&ռXPLkO7v4>)ƝN׳T玳=:tooMlTl¢)׃ˢL}{+122>▣,\`su.0ӣ<> |x?ӌ]_B\st1-4$ 0ईɳ‚@Y*T&k*,sQYYYAAA׮] P?߿Ν;aaaׯ_W~;wW_}%o޼}/X_%7aCSo]k՟=n&5sv[W\)g^HtWa7CX4 YmECX/WWWeĤk׮5klѢO?7idʔ)knժΝ;U{Rlٖ-[N6M~ziEXr$%2㻮s<-.d7}|֎^6<}ax{8~ƍ}}}mVb۷o' ‚bpႵNzĉW ~(B@XKv1AX ‚ ,  ‚aAXaHKKYIqgNx6|~/‚ , , i߿r//&~vXh‚ , ,C{?~|1U8tय#H'8{"~G\dた~1&:Btr/cJ!{T}^۴~^t-#,aY 8O?嬻ݷHw~嗟?~?s{[|'/n_TƔ~v`:y\."{".4ʺwnѣR}dpyAX\vEׯƞ:., b4R=#7')w qJ~_1 yurؗ0SLe1aI]=Kg=7݋wkܹ󋬺՗t5Ũߍu.LEڈx+ycG<Ka1Ugjp^cՕ`/_LIN@X>XѣG!5V]~5)1Nч7q/So1CC#,mvؑUzZ2B{X~rbEAu~<LRqor\&"sJB_7;v9K=~?g=߻I`:?)ͯ\Vn0Q.!7W^~G}a׮}z򘆰\zEЁ=2&BE]XDGǃbTrzoz篿 ;.ׯ?sح\u뛯U嗟=zw Q/OM AX엄QQ!xy8/8zb8<"[Mk| _I%h )AX[(,)'}}aAXa)RTaAXx#AX(r6Wȧ  ay   ,aaaAXaaAX@X@Xa , , , JX2% @!#, MX2+Udll|!= aAX(TbVLXaAX(<¢^Q>+?$ ‚‚+ev?+vaAXaAX˅$ʕ33a.,WVCX^d?8ɂ , , %+ V.CX@Xx2zrͼ9  )ao޴aAXa , , , , ,  ‚ ‚ ,B@X &,)zAX@Xx~ay^gX^   ,‚ , ,  , ‚ AXaa6 ‚ ‚ , , , ,  Qaٽkۦsw , , Fa , ,aAX^aY ‚BHa",BB ,BBolټ~L"CSr[ #G 2%&1>& '5-7_F钟93! EZXdd߳GwiSc``JN<%XG=dӧiԿ;K/8(R{ qRvsq 93! EWX.g;9[j;zV׮"zzzmN tDYw߭l3o3 ˼7b|vm AX(ҥGo:{2mҤRphǎ {qٴaʋRttt>۰eݚU۷ΝfX{L‚@ڪ;gZYEIfFҦq#3UTG=jz֊(ԬwNqh ("Z_U=}&aAXΟS%4_=9xB򊰄Tzyw(_wҭ[klX0/O׊+Lhѽr[D>Tơ1qdٳ{{%΅{nL‚@QƢ*kתQqȄtR+׭[G V.S@Z&"&͛}}C[6o.ҾRŊfNWTV$/lQƀ",cFZ쌁=}&aAXHKn 8&!R`̌dUYALKeғOj<+? τ , fa):"-%!>6CXHɚ>G<]S |ASv!=I%tƒ/g=!.!2"XiOYa! MW2Kt]ʦ Wj͛/\` YFZ&R_\Cra1}Zmƌ]X(eD N9!?wq#3===bV"2 AX^\HO*[j>z>}z)eˌ=!.Zn."2!gEm6m2Riw  ",>G=;B/,Kz,% F}d䉽{xaC*a7w+/9,{[t>VȅE9dsevzWgmmmՕ`2ȴa 9_xؘ>Y0[JեKNV3,EUd.#._XNSX6m\{ybX ,FX$;_ɼM?>K&K$[jyXHH<%L5tH]XLjܻgR>saA Ȥlٲŋ;N]X7ٳ{{%΅HMV{T︜dV$\xEɒ%Uң{J!3#O^ ʀ ,PEreI#VRFuukWǑ]:w244ebRiRH&M*aTbJRfe@X( ¢wyQCXd~!=or])?lxR#R6"V {Wl;( Q+Vl umfc}߹3sf2$Cr̝"}_i) q.&Ƒ   Rq6V"S/}dv`AAҬi9/S߫g`XA)@`XAA ,4QB ~,    ڗ`AAG? XAA -X>!H,  ?,fOAAI, x")4yRr   RP`5\5gXAA`AXAX+a,%,?q2, Z\KMY4_}9RBknJy`XA) `AaXAA 'Xp-Ƃ, 7XPPPAA`AAXPPAA`XAXPPPAA`AA`AHq7, ,(vF ͿY`A} ^XPfQAb"Q!jx%`AAAXA gT   ,((K(>uA+,;,xPhiƋKO8|u~dNfVzPPvQ|" W`_}2v̨GEUV1}2vqq=k<̬F,/=FAAAAAAAyQ zJ/J:xy;{ѡѣ;D i);5BǙS_8wzsP6߹=Z%2zd.Ko$ƋOGnxH]%jӑCo\L 6`ɫO]BRh0#"}TE߯F9 &~nk5\ ׭Y@ LLL+-[HX-aǻ)׫[ɱ^:^zd.Ko$=cN,TR&$&==*]w҉:xgn3PPX~gf~Ϣ+X#,2n^RZAٕC!ٓ2ϸ{6MMMH3ףxH X.&t蒅ڤi)ʕm,~~m8Xn 'S>Z̢X\e/ q9ˑC/4rF/:::1Gr>Kg<~쐚ڈ_)JXƏͧ/;M+̛3Snfú՞455,--^8_zrsg髗/Pf--et8Ef,y{ҽpAA$'T2k4>}~ #뚥 ]M0~ꥋI #tYg S' Vu3FXh w'r&MIVZ͛{_t$)l`!AçFmVQQn=2O'3UtZ5[9w$=ku6`)!`Aa]y[555;96j@KK#Dpv`隚@S&O)w=2O'3:qdͶ66ӧMVRRm ', X$ݿorƵGCp|CYpW7`ɓA~dn޼cp,ryoFZlцƏAG`1',ٳ~"(++wՕ!R{x7ҹKEXp &тSTTT,--E_ɓxe) Hna2g2""BKLLLZ'''e`P/{NXUn*[YtIh޼ydkCCC%ڷnC F`뀒{NXUbbbV._hQ@@@!Xt dTƎajiƋSؓ'($88Xm6F^zaT}}}A`)fԯ_ѡGm|uuuz5y +..γgMXxgɒ%oذAiLԘGNӪrb޽JJJԌgwرc\|3q֭cccgY'&&jkk'211 xJKzf͚UbEM2E8_x|#;w]X;"vȈ`ILKwwrIGcG:~PDAqd ֦MZz{{K455eݻw" CfFFFBN:RˆH^&O, K/-W0+ B%ÇCOWlYҢf*i׮v!`XPPJ9,{i\OKo ʀe[Vss3'G{ VV{vohjjpqqn`Abŋg d)kڴp$Cx?G7( ʔ)#TJdƤ 4HXӧe`% ef͚m߾],<`066E*UZleV;`M6o-w,((82}d%%{wIcgWOP oӭkggJ|!HɢEv˗/,7o^ZܹPH5)))|Ν;B jSLR޽ЬW^E\]]ó_,)'Bd__߬`IMMxԩ8z777^X`iӺ1M, `شAEEEOrQr(AJfP |NҵkWOYN;;;4LKv`yz<˔)S䂥f͚^})`~0)1G. ]tyhɓ۷frʰkf,N2(Sx׎=giYwɑ*(xsxYNܼ~ŹkN4q=-e5x&MƵ dwży;e۶m¢ÇgNܹ3秮,RjiS''V.2};~K/]Lش̩Ĝ4>w$o;3cMXl?ֶFm52?6UHD!z^wBLޒެ#7o8`I9] 鳅r(a}ծkuAe8@5/^F;`9z(711EvϾz,Rۦѽ+0dH 5k x_I.7oL;.*Uji"we 7Wc |[P^ݺ~}Y33.M`_jMUxv[lT$NNtrđS'~Ñ An?tʕ a`߿? i_ >_; J6oݩcVjĬGX/eqr{6t 8^\%KH.k֬177:L,QFQӧ4%st,X 43gNvͤVR% t Aҳڵ$5Nria Bx d; 9,eޜOĦ6uژ7`?|͵:'eA\~~Քr&ӋE!XV.VWWOQJJJan];,8`A$o{AJ2Xrr6p넼mG71j=EeU`  Ha t,,, R `,T`A~,,((K U)Yt={A`AA)`r %*Ǐ_|/nݺ]vA`AAXAA`XAXP`AA`XP`AA`XPAA`AAXAA,kBAA),  9r/R{Tqˤ c~2xPsf;  ,RHQӽBvm}[4ׯZKJnݤg'NXJMM&MAAXX:vhǧ#7oqтC6ؿ{ϮX>ŧMg=@w-uttD_ ,Rlrp clffnnfqSMMݻudSz^POW7(R`3gMѴq.]@*TK  X"""~̙37nsa_TTTnXv+|/h?xy۶mXINN2dH``sՆWSr̙3ic[̖ݻhhh_$}g=t]***["i]yaiw@^C{fJJ/"sH䢤Ax{{WZu}uwwKMMf̘ ?~L_vϞ=i77 h$kK( k뇄 *U 8}^,2`JK<@C 9^:ԒWvq9b=K.=aRe*.#~ X $S[T)> H^eС|1VJQF٧OyO?y_zug}ׯ_sqPÇX,i)B˗/>|,ϟ? = `QK?:Ho߾a !=̫zE;czy:8TN[vE ~ :iƕ*9zz6j5}ڤ:ujѣtttݩHm&} 3  ĉի4QFhh̓޽ښO9cǎњeVH6===777=r3FKKƆy ddd*Ujǎd,mhٳgbb[ϫzE9,@9bMoڤo,C:d V`Ĥ VSQQ9~+ !XUFf4hP:u5kmd 5믿h:::ZGGG"UUU}=w zeƏ `)L2E$/{AH3Y.X߾}KG?~|NbbbZjS ݸqCfg+]{`)z=qP6'OR3WkWK17;r7,2d牑Qƍ+U奯+MA,]TGGB=2e…!&L+K(=zTu䫱)rXIIˮ}^,?,-KȤZjvvvxAˀ… ...mڴ6^KKtҗ/_ÇӴיBƘkpp0TU$7ŋѣvڼ~Æ W&66vO[SyU, ,ݫ+ @__/ W`[F:qnBi֬Yٲe={$gJ-B‘ErI'L ĉuXxihh$7V܆:###i}yU,)N{m6+V 4HCCi2Vڄl4o/6MA ̇RSS_zU_LѣG7nUtr<X"ܓMLL߻wͦ,J?e D"InsB+9|BP)K?;FF99* ^u~پ1+ENiaBfϢzwfyj3ɩfY◕}DTZ*)= `X s6lXbE555kkI&ڵ+ϟ^Y,r`X`A`Xυ J.=}t%D' ,  |gtttyK^EMii=t, ,, 5ki]vK^EU^ GX`XX,fO)$`_kժݻ܂EEYX$, ,,UD)ˏϜ9s蕿X[[,2sqߴ C`XX0$ ɹ-C0$ĪVݵj,KA ( R;cƌį<{@), X?`XŋJ9sfٲe?~(?~ݻw|:##ÇϟWR%$$f>}ʗŋ>|,&&&}||Ъ޼yçs}wYVpDǎufccCPp>[Z!?2|ptSN :Onݺz&M"ҳAWSU² ,2eʥD<倍Uno&pIiS'Rqj 8~]K }XTT$`i `X$ÇƄO˖-+VNio,˜[nQGlZZlVQM,vvvs۷o+++e `$XZZ.]4"̢[,.ʺ(bZ{g IhI`:d0~lRSS'0*" ,%,1UU X6X`)`!?UTThm۶wIy%177})s*^فue~\ʕ+fff19t4Mk([qƑǏ.]:999W`&tKE86~iBOa}rʥ,ǍR}T)!g{xkh2772y<ܽ,34a3futX`)Q`iժU^dެY~}|z tXN8訮^n]MMMR֭[ "\6 ((Hxl/NNN*T`IHH f6fn)sK_ (>龜oVYD=v+ݼi0XRUUc؃E]=,+VE ,J#Ǐoܸ!R?K5v |322yt/,2RtKE(3gL!\O?!e oG*ehؑyURY8>+XFDn+/[|`n;fԠ!K,&D1`Xp~ewW|dwV ,f>\9 %%%CCC55:ujmDٕ70%l WBI2641`ޠUnnKHTTTҥ\m|}g6j"#)) , ,vXm1["6m8x N~Ƕ;I}I18(Krƍ׋`XD1X>e3 `AS  .-KÆljfn~5<GX`X`y! ,y7.e eVVq`X ˏˍL__ &Q#`Xɓ,  ,ׯ3CLL\\Ő0`X`AƖ-[`X]cxzY*{rQW,*o;8`X%?rA #,KLLٯjv,wEJKbX$`XGX  ^`(`)N`܂%5ee ?`IH` |͛LCMM , , L\,,$`W27^$`9Ut.)O`~z$X`X`)*`7{J!)K~TRl޽<˕+Ru9Gvd,4=ؐ&*4fDC ,  K Bu}%LŋiZSSSoԨW`|HRkP\nLEMF+`Ne"gX^eT?, +X"""NzmݻwӦM={6󋊊B)l;w/'kBebb ic¢߯\2 `РAף>99yȐ!BU홏=NѣǞ={5kF3f{/_`-X2ҩYsK.l jՊT܃5Z>UO`m4'`X,jjjÆ j'TgKzw RBLj֬63g422"}nؿZJ{>uFi NNNƍ;vl'$  5`)`Z! *WLYcǎr,˥Kޞ2vmֱ#"lʔY\LPO`mX6%_rP)RkbbG^'ӧB?ɓ'4իG޿`A Ih7 |}R֭355Ȑ^v-ezy}xx8޾} ,,JJJ|0Ojև`H7%99:JRЁժI?ÙQ{z1Qۢ ,/2KJJ,K%-Mrɻͽ;,%,cǎuss۱c>zHGG'""BիtժU[hggG R!;S27nܠN͛7lJJ RI… 1*666K,IOO?y/'z2 AAQ^~M:aGXCїMڷoO5w%6VLJ2Ҿ,m۲0fo^qZzi|'?\Ϊ{`X,LU$Ѷm[5kVϞ=wڕXU_ttt4F,,HfҤIYgcbb%B$۷o֭i←A6mLLLOIz#d.\ l0Z `X_m֢E avȐ! oZGą re X<[0 R WSS{ܥ?~;wn}}} f}Ci ?SNe֭[`=rO8!GCC#::`X ۯ&==ƒ5TX`[7?XO/}vNl!lnRʕ)+p5=*`9q5qoipU`_ &z.Z$%..e&NH RTҹsv%[Ç'_|'M$,266vGjɒ%>55U/`X [H:tѣ?O-pׯ_?y$i[nևlٲE__`Q'$wm$MgDvgϏթysa,JJϝc4D宍#V!;ZVYJh1+X.]bW6nUy;R"k`)*yyRv-]aautlmmnjw$w:믿-,,UΝ[|'Ohii=x (7nË/zQv٣%XAL Jط%)))}SGUkhDK?[Z[*UDAZ33ф"e{ÇYve%' `x9OM-R"`)Yh̕ 7Ǐ^zpp0oI 5j#OKKK##QPONNN& RHrANQG9yd9#""?vP333`֬Yrנ|=k׮7}w,ťJ21|h3}M5kJڴ!7i֯'ĉDӧYuʗP3X2n$$5"*]X˅ j fX*+}XJ XxٳgW^K?LMM],O1dz"7n`},y[Nx-wN-*g\NFtD <|`aɶ-aikֈ=<2Һ5[7Q#nZu9I.z$=*碝vvq8?oUkyŋ `9wY'Q҇D1 R(`$%%!!!~߾}G&:::drʕ+?[~bg'$ff66g/ת%+K,1ŵD/D_gقE}U,{t1, $a{jt4^|,  RqFGGǜ6j(NpŠ+8xUlNHI'Fʨ]k7zu֪,lZq=ы2wrRgXv`,`0@[#, 8;w.>>TMxH-UVV$a+g})FOOǀe&E ,|H  , ,͚IR*[RmK;l)zoXZ;Xƶju9 XD%:׈+ûW,  RBNsXh.nLYry''}uؐ+XZ[LLnqn9R% kT ʻѣ3=ٵKXʕ;lƵfD`141,K~%>uF56FX`)QQRR6Ջ,XpYf/b`YE`IJ-_3̚4! m{&z#,b`rR 3|,K~e>SuTSwX`Adȑqqqi޽{ ի 8ڜ>}Zr…T) &j>fLKh(S'޽bKڑ ''|,=*!b``ٴMh9ٳ*{`X,qq,*+s#%`)q`:u۷wM6mX I3xࠠ+WW&&&N0ߟm߾19]| 5ӿ>m$''S.00A}v R8"wM>׏K^La>E ,X6-{sϞL!nԈo?R%ָ1eC&XϜ)#J'DD 47_ CC$p`X,v˨R6l0&**j=̝;WOOآE ^?pϜ9^j0bĈ6FFF2Sr[6$%%ihhLh3CBB,K!o&=K2E,ݻ3cs"vnMeؽ[:u"S,NNB`g|䘞Ӧm,,ffb1y &Դ9E`10`Zjnܐf/_(++%KTjFQP,0 N`)[l QENE ,' WXbc "ޞկO`Ynn/`y_o6`)S3XO`YM-E_eN$,y ~q:{\ܹ̩XL=*I,//,ƍsqq?^tdɏ?^iwU-,,6l0|w76oLy9v- ŋ==z]!`X aN{{oo&vE ,IVĈXz]:L$ԫ')f1D7nT/[w`YM^O3f5+˽{ `:gt\-ϸ[XJXd, _455*T#ҟ>}:uϲ^ `A?N? P|yb1Q0NҸqc>zjnç?ZD#ap ްaþRQVVN9ʝ mS֭ ` 8~^ٱ#[i`S}KKNׯ/,![nC*BOR/ p>}\؍7,Ka ]6m[OC6Y"Q$+ͯn*ӓe q˖ٱu%`)S-\(-F` 6`12/Ov-7S%2)+}{`X,kְYm~m^١[ڵoD`)Xߣ@A;ѣG(X<=MXF`M,e@rɁŭZeN X:TJc<"̝J}&%X/g;SM6mXD`GMfe݂KXqe_R2j `4I ,{XZZ^"XXdm[ Xd6KX2L,zzbgDrYdk׊LSQ:Xf` `YtJ5M??nͶSQvqqb==,,G),KʦM;>88肥R%& S[,,.ςO?XIҧ]; XXhiIbԯLI2D`ժroK>̵̮_o(e{\So>Jw 9X^e'3-nܐJYRCرL[ׯw%s2oy,ʕY~e`iر̝eKOI)C,6F, , ,nnn-zA,,g3sMUºv%̷&d `qͺXih9s$`112T1X,pߥk#Xtakl޲EբE >J93XFdK$ܺ%E fuf^!~ZcmdԽ&! RT}vTre###ᣬcǎ !TQQcG dk,?̪T;K`cm}a1 I V,jj`)[?~˲er\P4M$#X5buVQ?-VGs  5XRR8>`XMMm`g:WQp~h[ei[=JooۯMNj=>, `)V`:tٰ3f ֯_/,Zjxxx9T,i&?^lmmsʧ###"  ,X{O`UEUtL9fLU+ֺu&XlmZ mX39Xn,ԭ˂-۸:E `i᲋B*e6`3~IJXEqhOۅ=MTݽ/XB'w*kLX̮Ln=vT$/^LNNt_u;wO^=]zU͏;, qN.vq;ztJqÆ+mlί_/._^q.jU XTT3fH. 2Mtkҥr\-,5X?%6HҹfZ ?e坙`1K`ߟi?zUrI3-m (ׯ3};+Tv7TgLtt:x0iS9`dvyJ,,gϞ"D8;;٥zr}=;99ۗ={IrΟ7nlccSF oOkE殮W1chiiQc777~o2jDEm444BCC5P==mhcmmM?k_V5hذ X0$ XܺukϞ=YuPq$y\`11a>7jd˖Q~H*;w.UlϞ=2bqvF-pQ4+ #e_4ÏP= )Shjjwrݺu2k #իÂ,KQIӦMd=?k444ٳg+ "}E:nddcbl,;?g X<=Y1F0X5cm̲B,ff@YM.9,#DEK3XKժF֬a{0[r,2_IUYNI<":Ų>,˗IMefzF?,Tm4OH[֭/2+7K|G_s\vkH-۷\?}x J{EDA bWĂ4A,{b. v=w;ٹ;!DDsn'O:I_ot9|C`&9r4''o߾pN!EEEN eeel'**ʎ%7EC8Ce¶ֶ`G ++i8qEO^޾;(Q˖w[3䚒}щ ު]^߿ϴyВء8Jfxo|Ѻ|9K $T__F'Oܹ3[,}qpp9s&"662dm ;35+?,g'?/XZ5!,,Bvb ҥ (/qرQܟ SP@NNhn HeҤ/ @,Ք)85]]Y[7A|N$Ӳ2/PF,?_tƦ`1Mꑿt)6`*8 =R\!CsEPEM YYa<,mU;2s x7 zZ/͛(%o wjj:CB'ƪr H7P8 ,ݖ8]#{qWՂjaÆ}޽srrBPCCCttߒ@4X={wn߾^LNMM-` ?~< o~k?'kmִBB+uV.2DDD[?yDEE>,X#jTTP\]7GF6@/,UU9K\Ғ,N}F+`KvEVkVy9Jp[ɂ%~,)x7Ν(@*( `!`)c  w(tIq1`Qo;+s"&t<4KŁݳUUUURRӕ_~ݻwΝ;VVV·'L ##caaallT oaαcx8q"|YF!9}=,NNmSD%be%ea*ccA0XTU5 ,w9:˂%&'&3vEBXTV N2s&8vPe`u ZTv6  ?+mG$r~kטST*S,)>>><{Ī*>7߰ZƦMאɓ'۲H;k$DUU|f',sadm[qsyK_ ,]0Xbb ss ͜W<Һ)er̟V,:}̛;F`wb dž]osX,,|Hw/<%'/.0%s0`xnf`G `޽{cǎO[A`C `!`C\\ھ}{ˣV,F̮HoOܐ0a8,;v`< w aaxI=_ ,`T@ŸĀ 2`,F?]tȨ` \\ KԌҸh$$஖WѶm(T7 #` fx <1ٳLIAN Նzz`_ҥ,^˖(HB+wrݫWDkkkvtsstҗIlߎrbebhxK0%K(x4X`QV` im8Je</PRX >e8IVU?dƣG1XL]\\`KKB/.\@&'@"b>{ƴtu}no4?-F0 X^ly.Y*:\ n$XX(--9Ծ3+**ҽ-_,bm涀uήAR&&'X cbk+d, Xf̠r Rs[=vEZ͉PP;FIOo2S `w oܺգƌ!`!`!# )?fZ 4kmF`Y@f[7 ( G``E!oܲQG3gP .cZ%1BvYV%X ϖD N_.XH `!`ę3gΝ:hРQFY1uXI@ڳu+˱c XOӻ"ʵ? 77,g,PC0`16nK@@M,EE<^ fmvEJ G=el<8ɴiTUBrz,׮dqEy3Ч XXũS(z7HD󷵵Lk13C7;|))HՠmۆK3@fxhQSÃwc ,,5>!&&&JJJ-/^lmm1sLPDDZl[ߺu+,bb,wyxLL^yE""0X-PKgҵ+ b X\iMG II43qո&jT :DG#@MP?}jH_{0-VkX䠕I Pm|[~<ő{>QM od ѰcGGo $H| `!`!+++##ŋT600ٳfFE&//K(&''adža57ǿC>sb``YKѹ.$e..,g)GG H*5 ˴i,7hL<.,q7SM{`h?XJgeN+H$SP c\`Pu*,,,$UQsY|'HP&7l3qPmr|0~@SG65<*BbC&`!`!`!oKk|ge㰰ϟXzfc71C~Ύo ,k'eaqLKpXFcd'SYXk^rEF"g gΠQ!"`!`n@"F*obZ:?4r,hMr,T  <Δ?|M _L(h,,,$`!=,,BO>]l(ҥK?~VׯoYX Θ{wESÃ:q/i,e4XNX\]1X*, XF,|k ]8D׮ԉqUF32q;lXCNF֡h#<O݋xUDU`QQAL2d ,Bfl?ӣbJJ^PnAUU1X&1JJJ75߸q#o矛644B `!`!`+,, 1cƕ+ȋ?ج<;;[__e}ԩ? m@XI)Xlm1XOX1X mU8Zyy:X,BRp@ze=CC<0-`QQpslltLE/Xll,,%%TnE@#,S䐮.#ݗ_e&QNg'4̙rr *>)=KeUR<=eK߾>dq,,b6)H\Lkh }VF,MS64? ,hYCh(K $bbb6lhյ222u_{wI__)))?X֬Yn n޼)!!}<^^^222EEEtZsss(WQQٿ  %55^)JKK=BQ\MM͠ {{=z| 43;@s,?X Sw[2+ekOAᕚC;,,',Gr 0ep +-<̞:X,pKeYB,S{刉9a =KP>رcxc*)_Ћ΁D,4`ECÔL֧DCT%yy ` 84.uܦ\ɐJ{q NZZ#MCx۷ʇG&?y$@ѣGp~ww,NMMۑ5O?ոsV^ MVV}Q?#ɗXXX`翤dQQсΜ9S[[yf!aXvE\\(;rrиdzB`r||ӓ˨Q,]4%-޽R΃YbXde ã즅O7أ%Kh(59r(Z /4h  ;r7<Ҽu:ZddУ\a>wfJNEDAXՙM`>" h=,W).njx>>(߅0E"//dPUUyp΂o+vhJ/tv@L4ipRt=&C?rWR7o%| >|H2 K6~ XÿC~Nm K,ΔΝҺ=}`7``n,fMG;uj'XDDĸ!C(!E7 \^xVN,!!(Б#hJ4ȄJH `!`tHZ& ))8O/gѮ]Lɔ)hc|9Shm,=UƧ55> XFfp6 R^ XfD_v ׮1ER=Ố13K~e˘B++,O2%ԃV%$sDر, I8w^__ҫWuqq},å½{6K.})=ç僯XVV=P,dHKLjuWZYY` ?gMM)GǝrrjGG_#%1cX,3,sR!!<tL% 0t(` ٜGrTQii|A^Wg[38&1eFl,kc襜 }`S*._v ;k,XĨ:#XL6js"&UW3th`e:a9M at` wۛ6~xeee)),ZZZt>ciiiZC _p1׿8X:|>^ @tgϊ}H|Ff!sXX.-[vEٳGsX(EGL2llv@YYbZ*h{9C X)?? ^/4X45RAA.Iqp͘:Xl,RRx<-(;tѣ1XxU]K2>y[9p%ٌ!`!`A": nlԅN;w2%hHVo"Es@S `)(hjx $``wॾM%%%===ҵcbbлw 1o&44sfff _df`i6m WOQQ.Yd ɗ: XȤ{a N!PLо? b`pq' 줬,󫲷vHIll|NpvL,_ hQ`<PCX.%+XNl:*)/˗/6Z2 6' 2j.e`5k0XMNXz@fG˖3j@~A$szV=:dd$,EM]1X)rͮeWN X,mȺ_~)O;yd3@[`Q˕!ߧ"юoZ(zɃ-iH|ػw/QFrR\L ,ZZw~ٵCA᥈ :!*;;vIɟMMOCf.K@uyr 4XX0XzlQQ4de V2=HH,RGGQvLP%4X|LXn\ 1н^ KHIҕ+LkF`0vdDeh?V9~R ̲B%޹:}#Ge%*7e[9y72%F1`)`Sh`v~)9zwܴ69#- X,'H 񅂀kKyyӮQQQ`9|0a܇??ڿaAKۈ|:XTT$H>ٵ)Ezz ]>.NHrt%$Y v61whkcGefxxBճ'Nǂce=E$`:%ݿKŁ3g'v^ B,/GP!oF] kH;F"GpeJp LIz:9T[VR;bi5,N} hwlll~qq'[555ZZZ  @^/y)`f݂ bA1J_QMQQ bjJolHrtĐըC82{6N{`2e 3ԒFL,}e~JM 7e,=,X<uCq@eeh5#\[k 9wf) X>6/FЫqez,,#F0`Y:w.SvgJF]֭O -XXXȍXX5vE 1nܸ^pYDD.g ,9E 2d8?gz, ' (K4X/QQ633A79n~ Xf͢XNeҵ+XKӓZʹ`0b9~³38v O buXĘ,V{, R4ֆ ,M$oZFy :M"XDЫ̱yP{&9|857V).f utlf`qYaHD‹!`!`!`!7r#`!`+yyyO ,rr5). 9KPPխz,&&^pY*vvfkX||i0X), ,'Y:XBi7X.f:{x`?RRTUasrsCܗ_3 X̾iw`{EQ^DЋ6peFkƀ2>=Y:b]X;m\M H"`(jFS4;s%}桑ܣL 2*2EX/HJJ._y._kgggeeeddt֭`iz }}vr#`!`!`A"44Y>oܸ׽999dz0GGĉ|2D1`))`abc!uuf?ѣLOIOO )A`Ã1EB7\ѣСpI ~HLv ;!K۝Yn;eQB%^>S`Qu%`t;tQLHŶR(;uJ CAM0X,X@WXG}q%ŋu*;,,,222迦1^,|? ,XX:SfffVZ=2<}ʀ2ykcsPMÂ}@xnw<.vp3}:5`e%;=tDe1WWc,GAvt ]f_ tNet)K_'N dZT\'dYիH=Nu,yВء zH!7XræX,+rrCd~mٖa+XqGp#& >uH txl޼emٳg?k*,,,N-99<0rz +եV4XހA/\ҭ x9SeeрeQ?XMqDϒ DgbP! 0Pk֠"4َ>(;>~G瞤,sҸT=΃LvdoTO(\?kS2U7X{To=-NG)X>|GN♨s[vc,|ի XȍfBvbeR044JJJ kkĉz2b2o 8*uuHBW;ʔ^,:: Xu[)# jun޼ bpμ<r#79Μ9#!!ASEJJjmg۶m< >\VV=,3qjg$ϤQ[tp-/O99m:yJ, R?|>iL*62յ ,rމX1Xs,3Gr vInfY!zY'.v `Y%q3 /XE[JO6,``.J"'TV2g ,R %XكRޗ{ Ɵ &`n~kV7߼~ȳλw>|O? uc `!7mG󐉉ebl81SR>'XYY<0.HF K  FYYP`QTD+Nq~zS %.Ņ```>嘺&x ``ΟS:&%38QdiF_ ,]ȲċC k}U`|]66()_QtpLw(\;wM `QmmmXz/p/CS=zt `!7Cl߾ڇb2i$GVCCL\\. ƍ!&őV 2g 8*N~ptչ3խEC,;;S(66R8x94Xé{{ Öc-WobhV1蕢oͰ`Xv [^2i# W]ip܄,Kp{b\h˥K,NV$mlP2Ko,Dx>m?,XvF|އ{ UU r#7NNQ<_zpD"-ҩI,wB_, e uu,EQQ dV(pɓ? ''*/=((0 C4Xp :X< ,.Inϰ44D:jr`+Kӆ#G9ene%Aَe# -?ˣG1HHNV&%D66(%LCB̂e.注fD(2**h}HBBBnFB"gϞ:֮]iӦĒ0X@9w.]svѩ_\55,^^#UU}٠}4k ,r(Ho5$ n݋{#zZuWԞ^2JBE; ^TQfF3(gg!ϝC~ X_ ,aa˃1X`5 J tYǂ0fb2`ٔ?#) o+,},P(+ T@    Kz)8رc-k N  37xnlܺ4`QU|}qo*yyAE]uߺ{c;6>xV'R,T~>(HabkRy0dH`,r[Ơǒɶ`ahȿ0eZl,p>LM,K"HDg9QNǸ,7gʛ~# ٽݻ1X`9qY mlPR5z"ĠcpHf`A#|ћ{ %%)#`!`!`!7r#`!`HOO`5QQvH-VDDgEB-- í77..,`Y!''=-؎'X,E,r(d_``7v4XAQ`m,,gh*M2Dtib&(XA" `qt,Yl9ȟAA 7pcӱ$ǂDb]:Ā,U^δlڏ>l#uWKvD#v ^`%`!`!`!7r#`!`!˹sx09A6R_{pnJKI㱻9p~/]]JJ6EE*,]${ik틸`Cqv>~<5x0Cs(+C9kk,ɭŻ ,pe08]`T%$k)<`= pX-B8SB%9{`[]3x{иl/w@de1 xUB\ ­"ƏG> w ]]cg9l$qq`X9swo,VVԊVBoM`ܹ=`HroOu`mg}zX,`s] `12B=ь(י,i| Ό. , =zqo/=n͎0}:Z2$ྲXQVƴ½< ,;v%{{ql.|{ $Ptn95"N>3XpZwҞ3qdS7L,,:uXQܫ˸qTJ ӧΎ*,dBB޽`)< Ջ>J]KR?9vLݮO""zdΠBBn`φyY]Pm[wseH`]ZEB [Y999Cjjj2 gp]DD{r\dNO<捻$ .!U:wMbbM`ڕK5WqswY˭! n3:R (,s,, 9yET,a!oXkg0zJi5>G8pM `:PB%8^`I1u;z,徼DEeː8]hc`jz z (Y;l|DF2`K ŧ,XmC7' I`=L?X,Ç A_>}| v֞\"ϩoYΤ`© /"5ݺmL ޓϯ @ܼ SrnMh,66Tq{`QWG,{Ȇ,55M`QT`am;Xdd0X5ңp ,==4=$)S0X,-,W,Q˨XLMqKXXwO`}KqH$hSjHg% z,:o~C@!+4Xt>s)ٺ^ $ նQ..R MIB g@ͣ3]]2LTJYXYx8ҏ€Eno~Kஐ޽?:(+d9?jr˴i,nl5zx4XPc Bq:D/h9M ,[)ce&у -2`ifXs's)+c*5gW^o\`98h ,xΓ'"7 t&\1dyvǁeD>3`9xpxy3班 ,&-CDz/ߦAIEb悄{b,JXlق&Ibݖ@KvTa:waTtˈ,$H `!`!N&)uz}t.x1%Ec/>5eT nC:.b-ؠ^JZ: I2b%5oe --ĄZŹSVU6 Κb04%Թs)Lgվ}xӊPF*v̄,Kse(QΟҜ_Zbfj4%#/XxnU/p}mJBkI , 5 R`aA]]ȈiXoo NlQRkй3^)zmr؀B zҴ%3?bd$dYC8<KT _|r( n!&&g־ebrkϞHÁ}A"#!!PlPȗֻ7:5 W`1V}eF`s)|+l,`=h]Z܅e;$HhK)% sJyȿ I~+oDWѸ8,]0`Z)**eziQGccmqe X 1XsjywEN`bvW/ L={pN~xFn.7t ,K2$e2a%!3>,;ffeԼkjzk` s#},DKVt),OLc.HHHX_4XLTkYl؀BA@J ʪ},mwaZ! A'EZϯ}`,-*܀D n?`tg%XfXBCB@`t G, ƌ`13k ,-mk ;濍AO+S'Rw#c,s`ЫN((PF>%B KDT,8kpXWJGIg0XMG=vXoor=4/ckK98bPU35m90|857HdL|+!I _Zp0 yzfjX_̆fHEVԐ͈sȏ.{wtl H&bADHG`AbNJ-c]b4VPĒby-gna;$bg?۝{;3Jʮt0;mZjQ(b:"P(V`[Bt'(ƶv1Bt\XYr:s\Ez2@8''Ke}-Ky9ƞa?mYY#D`Y8:r`,| _+Q8BS}`11!ƑmSZ݈TZˀyySsv)SHNY>[!R, g5nNMQ8@E0,Q=QQQ7~ G@=s㱽 cDwxB̆OzM*42Rz}}&[[~we SR 9UPi45İ2QZ^63`,/jL B! X"Q=N@@m B0y7o,`C\%i_mp1j1AAkJ8wpĞWdf*XZ6åys"=­$=xX:EXh0Dϧl}="3g*4 B0`4r$2dY쯴cVbq1iݿ KvR.fn~ `9uۗDG/5{1,(KAAt~ 6Vr`ټL2A*y~+ eFw{)4i[eXL B`A`Am߾^zjt;~~5%Ra&>yX/, NCu YF̉}#o`5 e] ur"ٞ8h0{Ch,3).t,ˌʆ ϋ샹I'N$dIƦY0db"{^ɞݫXݻbEbb>~}j͛/0>z>I( Q0`a/ fӧ'%Yc;)M!I]&"Ex9]K7 D(Y$v ,t^fr_X ,{@07)o+')ݱ|ygf q%^=}FEb p`2qXND`bb ɔO "<<8_=uUPXXP`<EvHpp~)ah,JK23)V+]oÎ"Y簾צLAiڵ Xn)3""US ^\^<޽z#Do& Y)l럚/44 fsɴq%O4c]újOPɑ51kAj )@LJ?B! ^m۶H+]ӳ}- &F e>hwes ߾}]]XRRI̐O%j,+3mmܪMcP-r2]MiȑXf֭?=3% =a24ln-ED KsXWKX-%F;SY&&2$*B! pqq4х[ؖXF wO 8:2p wesiԡ?-zz6@\,,N II$|ֵ2={2nt()6%ťXD`]D)pbeEj y1i>8X g)XRb 5h@>>_?*HI,ScGy7`ڕ*e2?h aa(4?uܾ}g))$eeBؘoEF%2B!  c\c[bR@ȩ'/f,YYY+Sw/TnX^?NRRHZdwo%خ,X *`QR6`^\3`|G`epw`7/ , Rs&OVXdZ}ۗ ׭Vkq}\h95nT6|c>/5uY˿.^+Ϗ幹!|iiy-G_Wq(-Hdb)7Bά c"Eh,ináўR?T-]]6#֕幊E`uK"u1ّQ,( UiSc["aHC|1 )UILQOabhȁeE,ǎIZҫrj)W,LJ.KK6hbh ` ۛ 7)iq5~ÆQ`v8,lr= '/hKjtrSޡw0ԯǀM'cχI[zz,/+(2!azK*̹Dxfn^ f ̽(|JM%GL2y&Z.ZJ=Z,i`,s+Y62+!O=V'cʑяHR5^٥K,C$ w P(eحVjlK,\HL޹]qyDOz\OϽԀe&GFR`\Iz:ke={*'NFrժJҾ=@XV 7&6 ;-nN7(Χ@e者C'MCFukW,O:ddtnKjnc(|Rc` =,ǀM' Yc E`ٳb=MLy>W}A?oFs>#Pr,SNܸQR= a(XO,| #,^弯jjR+MÁZgWZT.WߟVRv-˷2`;gX7 B`A`A`,o5de. :M`K~n-"NLV+rՋ$\uLfy,:P`֍K&"h.C bd.O8?O)pbfZwFX@eQڐzR1Klҧ:f% /~7`11#mc&d.\O5}:˟YX20b常xxmժEEJ>8vL j,̆N}JL$'Fta-׵kveHnkXL}q$aUIlPTc~NޤdgIKUG r:ܿ"H@`AP,,s޽LOI7j\Ro)R_xfc{wFN 7n:X\\(؍O*ˣYM}x{^I%,un:U5XT# ,F590P2 쿼M;(;' B`A`A`QOX 5Ԍd [Z#;;a6 j1J2-]J4jX߿S\L$^~ro)4m\xzJF)},O\f,*׬hli-6_TD٠AN.stB`AP,,,j^WӳML6 魅F`0`ݛ|l H@f?-Áe!u@ eܹZW 4Kj,1q:P`!*Cj姪R'E`7.rӧ_?F6*ͬ#G9sߢ X,,n60D5q%i5x0nhVb$^JĄJJK5s{|F9m'ْ%u={v bbHhZV& BLfgWx~±K@R,rK{a{[6\eY $/NHv֭U\\O] |QPvtLG ,`rؖ0l\XD`Ջ'X ,Xhd=,thܻw@롢":$Z3KJr4 ,VVʵk+g\__0(mkXCV)}tI,|3`-ӫ;Wc`akTypHtH,eyK{ WZ[۶Q`Yۧw߾$5l U4Vmƌk׮֯'q`80XǀM(QWN7n$QQm{ECuMHL,8A5heu,==Ml:c{Cyi \hZ _|Au ,dҸY>+0:p_|2 &$H|F*VN"{߫C tlRbL bc+}Hr2\%>x[DDD~j5k=XwM+++i ],&T( |tPWûv ))lmy!6kX!#F5=9= X3gR`nH%0bbܩ>F t{̼Ū2FvW)+m<44S,O3FicC&lBeC^ XE w3`k,23] WK7n'Yu2nh۷SS'H7ܷzL d~4N|iKb-<>>%}{X.{V,҆H1`۝XTXtމ@Z ua1pP>ͭ ^۷!ҧZd 1رc#Fضm[c x,jPWX #{nA)lH n(ݨKd5[* 0OjXv"@O7&kzrKBr, ,T,".tо:戇Gڒ]꒍}{%L RU]Xp ,P9r3 WK|Ctt ¡cc uwX-P:bN0#8tbTsᧂX"hZ3g,E,bID`N_$b=~9Y-6Ɓξ:,)Xuy.yUlWq~"ok[5rBXX>pA ӌ葵u۶mKFξa [;B׉zz+"#GEAÎ' taZXsۧjo^[#Mϖ-/CyE$'ffEqqqeee:KCBAzoazzBbl!!'Y x8]o4:n[^eN|3_/IZ}bdS9B&󅀾~dNp%h|Eۧ[XvRsws׏rwȾ.$ej9H ~`q8Lyu77iԾ}$GApܼYgUNNPpl(#^{ZP{UKl!uO iͷk׿i4t63KT}=а)+cOi1ծ"XzVh3̣Y **Қ '13b*Um&# 6i T"Ά+UI-e278O˖owydo- ֞UwS5j5LU}AyV5 T2DXYJ &$OVK -Z~Pm `eɞXyy hPW&:pӫيTUoUAhjKp7e5M]dVFF]~5kfbuH]݈j^e P(:*}}}hڵ[lم Ο?|r >** BP,( n,d2IoZ3BP( 7_S&LсVtR B!P,!P( BXXP(00y楥$>y/))aiG7o"P(Pe֭!'M&&&XEիWcuՆڶmjxqqq,YîBuq߾}={%`#W/_BXXP7eggӺg6 'Қ5k`cǎXK'N@1| f͛7iO>ݻwjCfffPiiilW__v+mlVW-̙3l e*++c;w4lK.!P(J6lGuΝlw":::.]Hm9UmbC_ VW-CP b-Zh444dG]///Z !ܠA6*v>2,( ұFOII)w^͛ȑ#GႂW{aXjOχ굱O2ڛ6m  `uՒp/\@Ãaczz:D>}'ݣP(Mׯ_|43g]XWsX=zY ᢢ"kpBߘ<2dȐcǎA@.cE՞RSS!uֽzݫOD@@.]BXXPiҊ;܊uܰ~ :T:{իl`hʕX?'O0 ###"V~1Nad=&N!B` BPV,( n,( B!P( BP,(  BP,( BP( B`A`AP( B`A`AP( BXXP(Tչs犋?c֬Y ,x^ǎ;p@ N>m B!B_mٲEfvޔRm̺UPd2===5 h 29nܸ_ҧNR[#RMӦMg B!B_ݾ}ˋ[O9\xorΝ;׭[WE+V@c3B`AXpC`Aޯ5&}+ϟ@USO>>qЎ;K~ {UXĉl ޷o;w8;;+Tׯ_եhԨg̘1rVpQ^` ~h3` ǏB B#͛.$ ݰ+Vj*) 6iN9iܸq899+  ~eϞ=781M`ao<@W_e|%AB!B3ks߾}Pdd$,9}n;w0S7nxomm,={V #޻zj ;;[233Y={_TTwuttt=zFAxQ6j]B0 ?TR=}RXv-wlll*l͙3'(**B( 7};ڸq#cY> _mt͍O;hA[cfn*&ì}OOOlqUcƌѺ ΖF$6ȍw+0IzMҜKŨOKNu6I݈p4$- ;tIG#`O5d{,CXP(XP_k1WL|NÇTMѣ*1)))lTϞ=Ν3qDo˙3f̀BzS3V^^_JZmݺu{W^m׮];v,ǏsssG&Ԁ5 y~ŋ^P9sfHHHnXGOtt4.@JNNt*<21o< lmP;1}aŌ*))϶mƏV{$DXP(XP(%>S3ɦ| >6  0Ň͛7ѣW\),,d~iϦ|711;v B` B}KHǦB5nxɒ%`-ZwB!B>|> stream x = endstream endobj 944 0 obj << /Length 387 /Filter /FlateDecode >> stream xuRN0]‚4:Lة HPbĐ0x8,Lk2I4;8Bny4+<7CrNEJ/ NW[xD,Qdm7#ӗó{"W#(.sS#s7D" Bw:M麛O=8TX-;|BE7,rUo?{TߖMxGSihQOCJ$ͽ=BL=WHH3oϮ=9,4㐔!g"lucT"H^-["`ָףº%f˱4cՠt*mgɼ3zN4xr&! ^}u.7{~! endstream endobj 914 0 obj << /Type /XObject /Subtype /Image /Width 1083 /Height 623 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 946 0 R /Length 88933 /Filter /FlateDecode >> stream x|Nǯ #{EԬP[=b! b5D!S$$ADhV{亹뽉ssϹo^ܯ&^_sخYH\5c3̖al;qmzloSnf6ӻenm{1bƒYkwe*vccvNnjbw[W?֡etMw6qwg߾5ͣ[&˗Ol|ͬnLb-0 4[yVܻxSκ]zt+ a92aY_^mȓP|G>Y|@yr97˲gwasm?l˵gۛ֙J8͌@L|€djKC0 Fp:w_ӐpZ~co>0i;MQ&IBī)mjպqM\w|Puon~w_]jM6>~v^0se"ri+~wN>467;Ǖ{NcŮTHٳtNFF._޷vmڵ1׬WcFFnVl 9[Φ. 4h:d0 0٭z|'42ҿ Wohm~6ui1 hk5,B*0sAc'cOu,6?>_ ~}KWSn5`31 |ꈼ^wR|8Ώ'oGLLPzFFK\elmw83$^R' a?7r[ᛀn",o}w!>gtj;pj4vN[_uX!Pɵn"&'O3V ,]c$8O_uK,/&R.m: pqR[}984/w~1gN"s}l5S[i'MN0 6Oe}+׷d+, {!c8&6c&޸u{xR!_Mcؤ犁ifOK#[vx{;~`f.X~ `s(!ޥ{hYq1煆ɺV p&=ltOT 0  d3E8vzcZt~tv(ܼ@ogLFjsX~RUlsXTұ lsxsvNP64m-z cÈVہaQ:Q͟.Xc}[i="9 v֩`aXcu5yel.c糗b`!WpM3.ya&wbK {>ScVTg~ .\E=iY_'aaaW 0 0 0ka_aaa΁6iYkG0 0 0LB07_y-0 0 0 9D+aaas Xn^"%AAAPX/aaaߡ,0 0 0 X`aa,0 0 0 X`aa,0 0 0 Xtz3 ڷ۸kvT~sKE 9Y\hF%^WXGM6:e!Yz>Yo&aaa8GK˖ͫUڿ_̲ώ֫Ww%YuokNIDGs{ wRv-z'O駖➔Ē%K,[Hr`z6#{6u0 0 pSȤxŧez=rL;%B\a!b`$.l;9Bx:du..yccS-OmΝ;f$on+ >a >LLLBO;0 0 bY3O(KXHq=$0g'_N8OgA:BLdffMv\P\Y!25hP zMmUKfX$oL X4n@,3gLNHE aa$h|I^ exhP >ڷK}෬)Nڵ۶i}>&pBcLLL|E$L$jRa:ݒ0 0 Q!oror:$9.,{IRNիg^ 1ݙ'Oq!e=xXbC Z0.CS&}q,yh܀Xecիrg0 0 0 i]tJJc9n{XbH@0"tZ>e|RV-}Gha.*U,Yw offv({vF  HtҌkmuΗ/30 0 ֍m۴ [Zּv5!O\zU^ǎ2eJ*YrIr˽Je SSSeceoG]v;xw-Z4+Q8kܱWXn@,Æ.WlŊV\/< 0 0~KFx)6?+T~l{wlzwYu,\W/_҅s0 0 7p2e2p*OCmh/t 0 0 0",pC0 0 X`aa,0 0 0 X`aas ޾aaa8'X,AAAPX8 APJyˏb/^OE8K.Ƽ~:vP<ՀsBxMo M`b9 KޯU&#,gNE e`yuiNT:E` oo@B*YX$lD |U,J#TA raΙ1PxhS'1O9vе b`/",X<8%9C<$A q1hXLRBX\S벑70,IPqqnb."h#ZXG옐GQ`Q;XMErt /_\ڵE=|͚6:k0ܩCRZ4ofiYEf ЯBO#˷x_R*-Z5(V.8ܜUb:EU;W($ U͛6(,}` kԓopFERK(.ê0 - իi۶_radaՙ!өcQ(P@s\pN`zOx Y7R.ׯ_oD6e%\:D41n*uҘݺr:(.nK0 ` H^X&^ȳG3ũ%{.GsC-0CE) *[XΝ:$'Ɂ]r\@dѮ]F1;OHrXh֋N@ O}>=NSX5`j,tE=vQvsf 8F`@6" m\uQrF`R=#U>/`*koNcccu_Ɂm/>rTۅzFѪUIy IW.=:I`ddD!Aowfff…C7X&sU ^z3gL0{D= AY^xΗɟ%,&&H9H{ї΋jO)!b` >'jԭS{3t=%^)`aNr@ĄQF"Q!+!gKb!\j$os }ɇ ou^Q{V&X B`/" mA1hXX XK[LEfEfaA ĝeos6unf=;ݾ}ѣF`atG_(Q @Pq6;e7,nڤq.37=)ɩ-j}:f֭Z!\T{#0EGԉc%K:d8)hzoLhl"8(#K2`QZF0'CR <}[BRbNK'8w1>&/os6wMLLX @:X `/ՈYQK~NU$ h%"ArB ` ,/!C y 7omwD8XOgy@ A,BWh3$n"I΋Sh_Zk(FXզPd ,0Š%0 AY, 9P$ r # wy/Ib.ZdGUĕDU!` ˕,% AY,b"HED3;^:l'+X ` (@\y4Gcq) ,apficX ` (PK|Kг?$]u%5 #H. A Dze=z$ڵ+:::߿ҥˑ#G X,F`VĩBlBıbPC;䐢_K{n#XtKNy++kfC#]eϞ=[^X ʽ"y'{Kʅf3,>TLKE/)FXtKӦM ,O?)˳g㣣5~믿ݻϟ?6?"^~=$$… ֭Dtoc/?|}399ӧOJ~ ,Z'aƖ.,bE-#,FKnXt۷ookk+k׮UVf͚-Z(Yɓ'߿bŊlٳlW^vDDD_x!~8$(۷oٲe;tP~;Ry*UDײiaaѮ];lذ!\,ƍRJƍϿyf( F5ʛ7#G%QSI,@Se=ZoX  )oF yCڞ,jW[6&{ @%#KO~X!I&loҥ?411y&\NM6Q{ѢE<&$$,XPx?4}qppИKpABAC:jc/}Zjݻwk| @ X_Kںe@+...Ϟ={#DX,eh}wYOX$|!#Y-eR۹^}K~ KF}6lX_hdxx4.\8&&5k֌>|XH777kkklѢŶm$B+W~F @ppƍ-[ֳgO+4wIa1b㝝Y;,,HX F˜9s?}aIri D+D=ujX zC)(V3̮֟U EK'JD_Q`vAbb,dNٳtq>>>ݻwAѢE=zdjj*! Ν;U\[Xzg-^aȐ!7֘+NIz;7nHQx|tttS3f%_|qv'O|{3&ݳF7ÿ$]OBq]+R|5v e 'szۊ (YI6l.\'h<%5lVF:+ҭ[X?!#fX4.X4>ݭk~*a癈_Y*S AY,%U QD"{O)f&Y$Ay* ,{ϟ\Ho۶mYfNj/BBB={죏>JJJ3gΤ6KSRRX;**ؘײY,Ν;tKTKf67v!ݻwݺul6,ltx6(bID,uRQZ`,=ݻw'QF"Eׯ/ر#=i@hѢ˗U5$Yf޼y7oή[@KK˪U1P&K/X>Ӯ];a6WkVs@AF-L۩HvC*LLIџџ/&@G?NNN~a?wߥ8h {a͐/6?6kD ` ayDc1X1} "o,^ѿX (,X` (˃,$+ng/Y/;a$E߇ ,r>!:=ܧZ;E>q^QUH"`@A,:j0qqdΜH ;v<,X ʙrS8CHvQQܨE 2s$))[$ ,aKDXKݭkqcG߷ AP.O/ 5dD3"ZG-XtK>Vp3~xʯ~E!`6ur~}jR A9V\x CNejL׵me|a-. `,zAYKʖ! _};YNn#‚~>'N?JxNw=.6>` _EB*I1JqDѰ~Ųcb$b  ,0 g_-KpqSS_*ڥjq25k8WZ[ʕYZ^VRLXAPJ!.ꕡ%8^`yK\Z]TJ8wX`]K,37.[辽;\Zj9|X_v=vM|NDӧʗ+?XtfkF!bHG&vTޮElV,`C ,C^G#Ã7_;}Z4oFM"(SC@"^q@I_qIR)r`ѹkvPF|!Ӿf,`JGlޠxyիU=j$I>RmS)ݻu߯lb-kc%NŨk$$hJ;S)2RmH `,Y.?fd'{i3r8",*[eE4vc'a_#^tX4evSgΘ6ak#Oy^:x)6CXBe6n3qr`U+L0%LdAOʅyy+ZAP0e`$vb` / /,jҲes˚5 ޽$]~^]֚+2EVj}ϛ3s?;Z^ݕ+dd`TfY|ry)VIfMxQWb APŐZPC "&EKܙW#f:F փAA`9\?uXɒ%$yגXO\ٚ5ws&"|L09/DI `QXc` Yك] fMm׮ Va`j,' O}8>=̙mCt3}!.B 'O9"9|X,p`l%sz1(V!Xͥ3^KҲm_$| ~`pKBݶ~j9mBy={t#(PaX&99;Z,֮f+I:I233{e` (IFv0zvgԦk;V[&Y@P&ںGe j X` Sl' $RNիưA,>"?J ;UtT8߻{X ʙb(C Fcɵ^*it.`QC'^>ݯoo{vС`~(避DovĖưMw))!=ssݓ `v&w9.,U,0APEXPN`2W|הFEqw>{@-`a[|>ƌɟ?*+V0f@"ܫT055~aFm̬EB斖5]MDG"T*X$O<wa , :A$%IAT^D w:ȸ,bc"ƛ˴/򏏍Ϊ:oXe X,`ѹI 1 Zt E =gў@7.6ϝ3kVŊ[8pwn A,ڕ^mxI9h޴E)e< "3z,be3s<¹Xr[@YLcCWK<_2K=d #eIh cIAM*1.2QL9&K˴J{|Vkd10` (E1E\K 3XLA$!J.!_q !~`y /be APn_G/qb9k &K`F, ` (W%zF䤣 IFs(\` %E7|`  ,wWv)rcU^BjڎŤt\B``yl}#3즆깍Qab3tܱ$I R٢EfonrVg AP&E{yy1a0, Atb}&,`rtxQznvZkVНlܲfaCӫXbZimq^ڵBGF]v5 HtS#)$ȫ %kIV+ޒRyX, ,K, yβQDq1GDG_|SDH{f1hK~>~_,6#vPq}39x耇!H߯utKQϹȤ q1g1pss!N\t ` ,;6jt%ehoעШ&.jE z%` ]˚5km`YhZ/^eftdmb:!ä _\ڵkӋ9|lُ UZ'h ]xZjWTJeV +{ uQ]bbGtRJժ-g]ԹSӢy3K˚Z2;p@?z˗ ;;¢p+UW҅Xiq yEqibξ~`Y"LXs=X,jK’\jڤ%6dzIX6m *4cƌ^zIe3TRӦNf.PºK,C`SK[Pe<'/)F !h`8&C+XrƑjNIN $~XAAz++b` A\ډ$ri,z9rW&rL8߳6v~yAT\~ CNwn AY,z5rC1XsO2b7gԈ 3C$,* Mq`cz9:kA%aXAP_? =y".qj%kI "F Fc@X,:`R٧nl-]%S=eWa{@ aY7XZlEbz0GۣJX APnd#T3Yv6eUAFmOI @vV6L A%2^ׯ ̪._|ݺuw3? |;rX,eSE <ȃ<џxsW]N+@PKhhƅ訞'N:իWvĈE֭ۋ/Q8qڴicjjJggYYYٳ!8,X4)7^&LӇ$\")/&vX;emDb6ӧŋK=.]S_rI+W)SfҤIB۷¨~[ӽ{KԆA,Ǝ{1b-/Y` ӊΌ:C!i, 涨#)gby50,0 e, RJRF6l@׮] nݺE/޽K7oޕ+W^~]1}4=**D=7n\lYϞ=i" ,Xwq2*|={v|ޕtk<${b)&D$\v{*vcA=e+5rթ?7;'^cХ~:}~[Mo/]=r>%km/ ?xÇrd1^a -=+F44$3`/NU0)O.$ Kmݿ<KII17t> z:rެ=o=lgw RXlFgtݷLIN=rKLҿ_!.sёI b=898cG] 1"‚s/DרQ>Ү }PY維FFFAaE禐ziE ,pbada@zqkN\ N?4hpL[n>q}枋W>j=b*$'wZKJ*VlЪAbvtQ6#]֒Ŏ :UTZ>ݺeג:w@cZ4ofiYSXKFsW'͗/E ro0{T\h… x{ ܼTɒ1K zɮZCIa%l lt[ܧR|Vv-X,]fql\•WRW]OIw4l\a]5o>=% {rBE{BD5>-,g (IطEN4X,D(SxÌƻrW [涞D+ƻ'ȀE`a!|}}z*˜6LDy]p I&bJXX$˱S?D_^h_eZP h,ә/ Az'v71{KNL`"wK7b%ac";wXvD###:$AowE`U1kZ(P 'wްNt%8t` DX@-Dy&jg6X]Y%,;ܯɝOR4xޣ1).'&%\tʑ6Ӽ$'\)ZeCf9С19ʥLLL20 w(t _=KO]#嘃%a`寽! uK]c9ށ }:,Y3ʖȢi]tJJc)n{R8@&(8pؘX z"}1S$2TO`ƺ/^zE ᱌ǟ?իH$+eǽ_xtO7o߸~m}1}s6J-Zt钅gڶimffV¢P!sK˚6("H)\P2UJ :9X zR@+2yN(.*=;7AXBCC59INիgkkkccSdɖ-[\redd$H$ ~/sk5k wS'Y| C-xy#;Ed艝%|lκ~-),40(8IFy` (",&jAKməFQ/357&YBAл(QB&2}tNII ޾};,,ʕ+?_=z(<<Ν;gΜoi{جxڽ?{xݰ?a[Mab%n:vW V2=V޹,#-`^rH>N_[LU=U,CEB( 366`/mll,,,ڵkWR o^zƍRJƍϿyfN-ڨQ#KK &_ر#ss,*Kܣnw_y\dq?}w1<0` ('H+*Lu\x$=eO*"!v#٨EckHr9Ο8.㢹ԭ#k,8qʢE2J+ X&Ns)X 5ء{ @GOj:tܜݬ]:_x1|p5`\n :ýzOpzoұswO't"{!쿉l5kc#/]8|%C7@ ` (ŠD(vCx ,74X[Lz8n8w;qwB8 ǝ wR8[`y7I,%€Ex#y#v7n\lYϞ=iD:4yYlldh.Eպt$#N=rw vr[Ingh6ɽDJ AGO8*q{*aO<,aI؃gee%$>[x!C;ؿ?k?nܸG Ԁ%Cs,Vjcq磢"CYN>7wOO#O <|>&0&Xr ` (ˁEqyMR$^מf .GRkq7pjuMd9qqq8VqXrAYcqˣGJ(B[n[$GGGm`}s?#,s,O)ɉ! Ş9ABl~PzIt4,w%X,` w_81̆&ptqiAMx,aq 3~, XHVP¿{I撒tB6m 0~#i޼~`ј `u`@+E{'GZ,1}c+}IAT.Ln^7Y֋,DA>>9.go9.q%Jضm (`iiYjU;;;?v>^CGu\ ` (E;!˷T6%W,%:I7q9nMY˂,>iAд E>>OfOϯ  sE["' V >I RƲK ")&߆:s, l]iA,e>&r_F>J`ɐ|}}׮]qƒ%K:;;774AA>kD",A -WEXu&>*,>縖ׁs\_dYq,~Y |2K ,,ߧZ ^իvvv}R;X HruH'dny[Ԋ'kD315紂,U,'8.XTr5YC-wB-` X,G+|RY1 2Ab`@r\S>F_Md I+q'$r-n ŷ@`cqq,EPK V9(#v)+9uS{q@q8n(Ȳ8n,Vr\sS4<|/` AYG|xZo:-Ť+31*rJqUa,iASigyf, id>ڒ\ A Xrܟ|s~=XW:d0"ل{)Ͼh^(A2$b\RXKq0.uIdYvr~,JG1KrǖD\.1@X,FŏOP8y_1 mv5cYjb 2F[ɲ ] , ' \Xі |E@`{~ӌ9 ,/;?9 V$UᴗF׌ZWK¦p7W It:G"|h{sy>K<&%ѣӧOY`S1`@n;f'gܿ䗁EOPa|LƎQj ɁEӊ䜯n`,_^ef%gP["^",P'O.SԩSW'ڳg`@ng_ygP 3$HۺQvqI)Fg0DALW ,_փ׃ 帑7&}xe.-ELdqiA4f %Ƅ9\d6=y(88Xy9kׯzmgϞGGGK'4aaaݣ[ݺustN>}*xBC:$''AwIyl9/s/O vZIBVc3EqOI1 ǵHK`q=y`Mz7+Vp[' N KnAmի7tJ*hѢ@_}vZjj֬I%K"! 5|p=zY&!!A , D4755u֋/4i.] .ƌ4Ϟ={|IH~c/5aÆO<ҥK ӪU޽X =Ѕ2ĻYk΀?&T{#]ZԶX #Z%22߁e(eO[ dq06̠!;EAQF z;}%`԰|rq6͛6uX○i*\pLL͛79,tN!R ,ά?,,HX 6lذ9sX` v'!~9m)Oά'e3 xEk&,S^Km  c3_rp r qV  ϖp%š%ڊ6'`,Bƽ},3` m^ߥrXtH\Xt1 X2="5*qV|@&,Ғ<|W s渭|e7@-I˜>Η5%05hpT{IZ0= `yl1_%싴mUFvdUW cAM<|F"[yȷo,M-[411)Ydb .j*.lmm+VXjU33]v {Av>QF"EׯQݻw۴iCիW~F=QQQ5k̛7o-[L2+V0~mp_3vX~n/ö}>,Cag"MUa+ :Mylw\V5H,So߾O|ӧW^?$S?~jIڵk+'6,=ί;0TݮQuUP^Trd֧IgI};~i; $ڊY1벎_,KSP)6T`{ݨQ{WDDM4$ibLl;~83 }3{Nag͹E06_Sg9\M_2sKB  2K&G*,ӬvV3#]hˀ Yޢ:yD I:ai~}OA0QeRzgYyKLM\ 4MSy&/C1EsTM9ŨQ"## lcQ l!MbfͨCX+nj#_χ(i (}0$ c; 34V&5sl"=^Sf)@X@X ,|,߽rfJ&rBmz H%C"=h"255¢iJ ,"r)e\fi6fhr(4 ej^o5V@X@X ,d_/jfcmOY(M8/;55W'aQÄE!d:($P& zMlO K|4MylaUOgBX ,r>4Lq|D-L豌&J0|=mEKґ,ưh%Yؒl~c 80MބזC^Uk(5GHoOzjK.t%,\NkCX ,difcSXdW`Q^Q9"Zt(.Yyj!6(QcûkR65[ɬCa s4 H)/2hҒ,l{Ygq/)41T Ht՜ffx58 aP`Y$,!9"H惡Hv;KW|YMז52P#/5Ԕ>`_OtdUZkN fݝ%.0Þ'/vf 7lݏ "a-RA۫E MY:TkKK?K~UJ;MbJ/ KdoQ1ç79z(2O *,7Ҭsc}&IKkyF%iK/MKF/M9SNUiO o HXZ4j 7w/?ie1KzbR 9f qVK: _ovJmsv ~n})| .-#^9v䶗ѱ&@aCE[ @0`bhQel2YwfhkKttFUkJ=’73,clɳ_?#obTrl&zfCw9̱ 4/ͻH=s;@y7ooK<'_ Z+t 9?γ/fz O}"aSX taQ2. :ɘfXX3qFI:hP:jky:x%ofX:XpEga/S;|\jb0W$KI7)F,ė=u s9Y&_zj/Ȗ"hۨEx_'zL& iVކ=OK+2, o(,pSd(mJ^?I\"mi1yiѓ6:LU-a:g=SikXޣd ߉K$ 'U8LĄb]tߡȋ)t9D6I;䕾=N^J)_`$[>b^X.G.3jfrmX>#1, 2,l {jWtYAg y;l3q(چ,[%NHc.M4T'M5ۍ5j:AU2,d ojj[#k/ʻ^LZ0}]teۂhR"=B {?FlagBBC?0&,Ύ]#! ,clr慄wm(IM@Q K'O˶H=iܤf'>EY)|̨P<|FC6Q> a{Qya V[Gxܞav%a%OS0^aPf7jhӿɄo#7} s(w^ga槮cѤ’{3,3gL5sY",2+U), .a[ 3,n?|3GOa=~[t?|:pYƽ{Ǔ2!,!b~ÄՔUn?؜y&rJ}%_@X@ʋ9ZkMV,6rZG<lu332" j9yU&d$vvPXo!ױGFIGQHzVsҡs׳J3gLe3 ,P +S0O2 ~QfDk3Ho@8W@e%lc" KײdII `YqEmFAXdsL+W~_z KΌCSVj[Ha5s͜+a\X. {|uFhJ#LP > qDW dIa Df̈$B5ѠQ/ٓHMDycvio0Fa1s+iI93!,),k(¤zq.ғ 3/|e###̰/, T I ` !z#ZQ;RtKH Έzyѱx@X@ cY &Y3) |B!J3_aJ9+ l@X@NqcGlL?a D(_t.vmbSsH~A@X@N^>W7!,@v wQ+ceBvts %=dR? @X ,ͻAgUVdWHrѳK>¢Kx@Xa$ \Qd4ұ$颓, ǤR- a +Z8Q%YE犓)&^/@X ,@^ɰdNXeAiL:9T [¢06DCxaf%\MY0_:2.a@XM\$MB%!WM}|9 ,S EY Q_++wOn,+,Qd] ~a1 =J mD$ ) E瑽YaI;a"b ,1 KE{>!wK<`LXDf!]E|a34` Y?؁IIEW>V8?@X ,@i*a) J*O%ؽ+\HdO3B2<\ ,aXE>%˒Q*Da-m"mn1d;A^h=aiFnc @X ,<ĊS1aY_j%"/ZEx|4Kce5+-@X@(9Ə($MdV%Pd/!~5ѺXaf@m簡BX ,"{mݹ+݋$  @X@Ng,/g.G@X@LHdWov6MH+o"@ r$˰` E>/tn()) e{|VȮwj  "M(P Y ElE*,ۢ|m";ExLYDICc0 (<^@0"6K(wEӶZ%Vr\!bee^@X@R\Y^*,tN ?h 3x@X@N};@X@[t=Ez,VNH"4 paaIg ,SXDS{u [א"t?[%Y<+CX@Og:pv/P+NR24I>˾96 ځ}#҅3 胶نeGߋ)6 EL:1‚P%’  \^ نul:ӖXѶVNac0DaD6?"/Q*"U!9yL` , ΢):O(WdeDa93@X , 2,Op~Ƴ6a@X#,EEgGm[ך@X `"Z%;Da9E)dG+w@X 'Ekk^L[/~0ْM5a‚ B, aQKEU¢0ױE‚G ip/0[ -[&TW-T>EIa/@fee;osbMINZ|i/z޳i._paFaɐ(안;~1,L a#q^_1 KXZU'rƏ1}J:?v('A ,@nD/?Dvt{mL  /!y7ˏG~(xߍryʕO|gD'ի'Jb|4x+j֭*Ur x\1W T.= g$^>or=3a e\2ْE%xdѭt >_ѱ;Yk޾Qnn5 jt$W/[XX,Y@XJD*D%Jعc++''tsܵK'*Yr }ga26i]b // mzi˩(SSg@ 5۶i=l跴deeu%1J=t`QyBO8'$a)[Llؽ]En9uZ ˅VUߝ?Μ1uQ-[6:L ,,,0xD>cFH.gNK*9a q3{kga"DR ^LXd'(VHh!,dhѬJѣF̚9KիWc;miҤe2׮^,,t?afffKeHX/ޚ71|3ar]Eaze&,ws BZO,ᦦH#"Z9Sh }!,Y潈u9+i+?o=+W4lga Z]fS -m #c.p'')V(c"&`˝jbEYbb6-ؾŋ<ȋmӺVO6ѡC;8D'$a)QĹ3a?@XNXdA[0%|b3(dLYe X0ꓪSXZZ:;W(W@LXokkSd 1o,^+'1USzU+!T߾x o"!AThoO0~ o|ٿ݌E?\=# >CT]^dh>FXE3"$˛kkWoJzdxDxhѮaݴHXV,[rj|4_{F ,@QCd+mCOeep’s ڨ t 멥[WGXK1,|{s o 싥 ,zpqebm'",d3&~rWB 7P0 a0aѹQʞa kŨyy? a@XYd{i܊)/N3 au yGk\^vd=痞H$,iCޱkx|@X , ` YCv {^tJƶ  a(Ed}Dvjb mudga@XF%,&,bWbCKJqcGIc1yj2c/%߷a@X9<âi::¢mI$f^z(X|yE^yXX7nH6/p2{ aK4Ih W8mwCtY.,h׶5 m]x9p׮ƥ g$^>oGT1Q`O'%|aYr\Н=}VUgkǹ3'Y#!, dHԹhtˣf!ֿWHX2X˖-[)BCͩNnvTѱg-KKɓ&:NN+"Elۺ) 6lٗJD;wled+t28޳;}3ժzXXXlX>V@@Xƃ-s C`dGn g6v]<;GX_/\0h߿o65کsv$<NjSF#:6+V4'7KqdRJe;fU\%@X*a ?#1wHB(%S/`0>P|͠y6^XƏ-1g jә_BgA) v̚9ajj 2‚@ 4 "i-_^aa|a</_g,^TF hta*z' O{v|a8Xoeeş7 ,¢mtk94##4 !>P4ih5jTNEvEJϛy̏C1aaѢE3wrڴm e@XDXg 0d$C"@B… ˗/Y(QɆkl$mV^m[)WwnOI+S,X6[э6%te@X/,"6_:mg1}#BQdΝ:P}ʕ+keexQΟ;բy T(_\!,yQM^XBCM?e@Xُ }VWVveaZXDSP;EBWÏ$]~4!%IIN:#!, fXqm 'w4#a e玭]t^\e0<aYX2׿냶LnTt9Cz,arjta:'= >   a|*a#xeі K1/xdd@o , S!st لH(}mc^dǹ|!@V}͛ CElƲ"0:LhMHXHY=}"KB+BX ,' i'.a:&+KTX0'pkfyE GaBaEx^XDgG? ,x ,&\/,S$&0YacB`@V [a> >`u*k;J<)JX]¢ma}lE[RFazz/@XFIeE"PsaJ.xF@X `̶"ͥUMb,:Ji/-'1Nex@@Xaљ."͛>Vd"]E!@@Xu2aeȮm/mc¢<3 aaEy¬_ږky8 S>8}D@X ,\!, yA؍>3'c ,S[@XY]q/ p! L#a_R6ma!ۅ @FEyY}VW=M ,ɶ9G2 c¦nr0srZlQ|֭ZYn?w*)!&?ˉ> o aaa 7q..{bOV^m¹l}钅]NQx%t csh@ SXJ++"as޵rS'=}*)I~ڷ_t!wkq<"lCn\O ]NzuM+^ ؽ%G udWXW6KVa3B 9gE,a@=afU ,޳G7*ur*\|mZEٶu;͵2Uww~$ ڶF 6jԀ˞Gt9Յ7IWePa̞ɘlmmUpvtVm  ȓrK!_X]BQ[)WkԨ>r0qbŊ+YYYiKQ&RhauJRJ.=e*ݺua"{%k!j6|D Z500}p/4`N `0yϞ>iaat P<3Μڮ_n.ǜK{֪ɄEm #_, fXy\5okVrlѼi*/occʦ&,tMɒ%\\*ƼX.'\8ռY;9-\0Ąj ’!,*aHJ ?sA7o\9q,0ǜ'vRJ ’%!,֭[k’c)߼iS)2k44ttadnܸJi^jժE?2k@kuh" ,a ϰo>Sʔ)J-DŽe횕(LLB^Xߟs |Q j=Ka=!VDΟ?v-_<ܭO/۷xaAOiWW!, ~~Њt hsݲ[a ,yfƍE1}۷[\zϝR^\ ;$5k jggaaA@XƍVݺX7oVUL}钅6?p|;DVJ*%,-WU>_|mnn^|yK9rr&&&T*kל>}n*wlWLL ɺu6iҤL2Ç733:sLم훼H"4ЬY3=,YRJG7o?_x&W@X ,#_6`jǏ_$_K!f).ǜw\igOx@F4'X.]l۶fɒ%Uܹ#̗ɞO,]@X ϴX[[-[h"VVV3Oa弰D҅N_'SQ' ,>tqqj ?- J 0yxxȞVZpEB'MXv*ׯV?>NX}|| L KC?qH];WSa8⡖>ҷo_~;)|5hCc^ \f̛7OVX֭E#0aVbI|\I亘;g&=[6 }w&U8Æk! & ^XN?Js’U9ZRѢE GY9[XXx֪ a Or1U/ɉoO>]DEEr{{{_h-[ݻa K./eǣn:|1Х-^PyPn]J_糦NڬfmZ|’Xљ` >*U+:#6iTU?ԨRMxf \?w¹ ? vS211YwÆFoAXD1ix&髾q=VURƇ 9 ǭE’ês7kJM4` Kv(-"D8SXEyš7nWlٲB!d=ĉw/!a)V\XDYKǎUhWV- ݮ];R̄5.ˮqcGAX>YdokY-Q(,"aa5z21BX ,@FEԷhт/&,`ݻwg%aaa–LV\wf͚͊y~ AֳdR+++hcc#ձcA"۷/+iܸ1_hmmg¨QC&{///rwwwi!^'aظhcnjb](WdO\M _\sQ:m;8 k^XtJ;:gy/]4gݻVT cX0gQQQGi֬ĉ˗/K닺]vڴi>TJRRʕ+Ϟ={Qj/^n :lL *d6%ZHH _w @X9۵m(gX+CX-Xg0]6}wǂ U,a'[4ojbba ( 3_(!k+clϣIp,0?(]Syg0 aaJ ,% g  F˰a ,@X ,*Q< ,!֭W_aA YX(޼y}?mQ8{ ҳm۶|9@X , a@X @Xa , a@X ,aG '  aĩS%Ua3k 5eދN:a , aWNŊ=wо]jU"# ,~ ?Ξ=ZjVVVZ—a< ,>v蘭qͪe}{}֮廍ϼ =rm;?mSږ&h ,mmmJ a0553k:ء}RJzz*Uk`*^dB~};川9aMaaamnn>cƌu 8>VX_,/^s'OdjF?RtWfOѣϟx%K[Gӿv 'M4~q4lOmW\ɹBqcG7k.aOvLJJ0a# "Y",m۶^#ZN[[ׯI&ŋ'aYj՘1ch;((( "OO۷gy@XJX `aa.v&8}3zķ l԰dU='}?B ͚9qTXBX> 5hЀt+|M*a!`UVmɴSQÇr~m ~7r ~U|||BBׯ ?~%~麴￿xٳgQQQ+@@rJ@X%u =y&+W7lY%~=v֭ZVʽEf iР>emm}!ss@_'!((H}go/ZCKgϞM~~~L%D r |m۶MNbbbʖ-K'twwS%%%rGGcǎmFCTj֫WLJ MV@'''OOO/// 1,G{wD %+w2fX@cOHXX)SBaQ9ȑ#4hЦMxebx>|x޽E׺t,oߺM4}6lXZ( MV% @X@X( D  wV* -R0/,2EiCO ^v{vX`aiذŋ.\8prʝ9s8qb^hŋ'N6]q=mܸqv~gYS ?x ,F",C E^w*Wc^=ya[6) ^潈ӧ@X>͓OY",¿,ӦMsww- $۶msqqệܼy0>}ZUfnn|%?$SAXXGn݂K^=?`ӧaѣ-Ze˖UTi֬+\`"uY[[۵kt/[Lr+V:tÇcrr2RJd山:N:چ@X% Vkmha5*a>|미8.]{,+? Xdɋ/if9^|y`` q2>}4nܘҽ{w7իW{),]v?~<a % 5p@;;;|EJXXĤTRWF&K۷\\\%K˗SN?3_~ZjE%y}6Hrpp .),Νsuu37l ,Kё̂ 1Xbƍ#G]J Q,-+FϞ F+,<&**Jgܸq?zǢ7oܼyMCZaRHA9Kj|73w@NVmגe!/7Ci=l aee /_[&٤ ?gn>Vh+YMPqV[I%Sj4DEPmBX;ֿzC , 7o^R% r͙3'$$D[ؚ5k*EVXߚa@X ,)ݻwK`֬YfxXipssdxz_a@XKX6l~ ,KrrׯӣK%s¢Rq.Za@X ,@X@7n6lNX6>a@X ,h=apYzK .SX*W aɄ4nm a2/^Va߾}ŊdHX>HXڵ[=haװjժzpp1cf̘q,uh# 04iaqyǎXam۶z#F0`]ǎ9ܥ^də3g]vԨQ*UŸkѢEgΜ1 ,a&ayccXJ@X ,1cưxj>}}|-qp/>}󏩩Z-rʕ+={$`,XoߦG ߿OhѢ7ofaCSLuח(a_sN;wY PI*nqYfM+VNmOuԆ: (aɐ+gj a@X ,.,f[^z ILMMۦ>|}}uƱcwٺu+SN3fv *'E۵kG +Tg |raټic+Ur9u )I^06GMsKKa~K]2',ffҦ a]x޽KmHOϝ8;; "VqFm`墱BaQ7iڵk-,,o |ZaYn@.];hW]|M1GǨcK|҄eFJa@XMXyyrr2Kߛ7o޽{͛7|!s/_^~]:yKݸqCj;wRRRᅩ!,b aYhwCeO2F6w3Q+WD.COk٢YjUARaٷ?`NVaZSScᡴ=}#@X gi*,-[rs*ۻw9 ad-{G n .hbbRH  E;;W(\ƆeOX[[/^m|?a,Щc{OZ\A```B ,欬]hp$%AX , %5jTdd$AqX`C?3?{'Y Fbcc!,۷ӄeNkת!, bG ZX9 ,9SX%,RP4om98\Ca@XTX@X%{-ƆeQfWlȰ@X , Z@X ,’#M.UX6V[@X , Z@X ,’#%%+R$MX.<<"E0 aA d=(Q%CrWX4i͜Uvo3",TX:U :1 aBXN>aɐ$'s\n 7&Nj>_~- ,Y%,WpNNҠ׼z~'83-ZlTnΟϩjO7 ˵k\If!, a\!,9* ,֖̇:;;3O/>ܦM^h#GTP’QaqvN޽u|7r@?PnN̩:W|b a{+SJ@X , @X ,+,V6mZ.]’!aIL\\HX|׫W^ iˮ]\JNRnW5нU*LaTX"#E a@X@X_|<SSSsss! aIH\]S~}Ϲ_??r…)` T_*@y8$wa1$'Ny{Po ɓ S7ٳ'˗r6H TI=S{wחsq9cjJK5Un,HXbcZec,^޹aVX_M_3}a@X@X@F СqzyyAX>RX,,֫U*,q=zw*,/To`[TCn %,:_\ݾ aVX]lTo,)a@X@XL2ƆV’!a)Xcbl,W׽uS;wv<sqN:U@333٣Gӿݮ];*oذ={AXܹ!DvvoUסj4a֍k`W܎bbeQtT3 !,Oso}j Š’ȹ1e  H suuU^s]A}6mf ˜DGs&&4"E8?5ks] K۶R-կznEX\\8լ+*SݻH{}o$$ a1sI? faaa1N8jҤIsΥٳ?ORX%KȞݻ7n,X^zL̙dX8;vMOOKVIXT*ŋ\M_VBIOŊaxǹ>aZX.*cjaayK/Kkߟj3FܶM8h߿_z B62eʗOskkd[ K\Æ~-Zp۶qի&O9zfRGEgsvH!Qn@Iaeγ\4>sF a@X@X0F 8P+WG&>"eOՇTKпȰ?Ĺ+ZwqNN1kתOZ6k*,u'a VW=UNI իYZXi!a1DGsʟkKCX , ,<Ν;]]]iw#FhѢ.\۸qcǔω.a:eYꊐVV}n䷟}1fMSTai҄G&,oW7R_qeBXJX7 AX ,KΧh? , QAoWӦMEgϞ*Udm۶c-*oeeaQJd"??ؽ ҄cGQ KݺLLݫnza)_>MX ",pc[G2Qs/b apkZ$-CX , ,Ɍ3ŋ/666'd!Ò aٽY3ۜWFȴij&,5jp: }ܺ5UXLM_[tVH딕''JXZFT+OҦ!a1;ǵt{g ’G.OL4I¢SXZ67OS  K\$,;O__u;Ucbl ˺uom^:m|AX ,gaTR!aa1:vSX2t &;V!)R[Xu;9O`;{/sff$,HX5 ,MlS۲' wPwRa)WΰMmFz\boz aHX*TRA[  %OMoW&Mfk׮sy54l0|嗟\XV,^M.۹ڵ/ W)Sԍ Kj\vmޜ*,?ߺUM{SjIVFXlCJXi3a)Xm|O!, ˩S\޵kcSO’(W\Rdw5jH@i2KKqծ]ieHNU,¦*^瘘4a!nnn#,Crlۖ˺mկ6Z'MR7k*,\֩B„ԩoP"#,K K#u²{77\r$,El!%"_חJ abTdNX @VZ>zyy}iS5}bE.IXIXSĉiεjE²6,GTGG68vK {8 r(gۨB[V@Xza014iRXXX{92zh1\xQXzj*2p j`ڴ\&,>>\Q|Y KYnn܆ bc[=Hѣ2ǀ²k7:NcbR;A%,p38a1Fayͮ]:pUV=}TU=zs]ǏqD֭[`` /^8s 5.\P-!!] K]NNNY{8UC2aYewNWh9JeK-+ ŋCTYe2,?Rgz}a1pC#gϞխ[ŅZ}kҤIR]Wsڶm>=|o!ТE a4khѢXb BNAuÃ6Ǐ_|v}TɓjժQ>Ra3fӧO###YwRHN¦7oޤ]tf(Kz*>>>!!עˑEEE K(Kv~~~~666',@Xr v) ck;9-Z1% Ktt4=r +,2%,>> Օ=yɧcԩ4:uP}s&߳gϤⅅ*M46ler$>,go>kkkQb$Czc… ~r %g2h z7o>O@>}J*+ebI%K8xPmf:eXu6$,s*Wf²ɉI;Ӧǫ~VOFXJHt*e2 gIXlm9')) KtaK ޽ܤ!֭ߚyaGL2l s愥aÆsM2oooi׬Y3.]Pۻ}N#ٴ K~gY9-?xbrzׯ_Kn!,ŋe$&&&W Knݎs,X5mwqQ\k*E{қ +E DQ@Į{;$&on s>;V,>ߝS4CKH,``EbboORFu A+, X%`!`ylقf@7G~R-u,7X@Qi+T K!aː!CXEEE+VHJJ0txU?3<+W0nÆ Lhonn&` Ջ/r-RRRMMMNB"\wVVVep!˼y߿NCݴ$,hkJ %DP46R>>g۴i0}aɒ%9s133](%%ãw XXNɧˀJzpe M͇;w22{C^ 슉)x{c3``!gQ/s/ׯ ,[s`G3^䐒w]0X^"`!`I0:g+X␣,=X~oQ[[[IIICCo߾ܹR,/^477xyy}X !iii cc &p`yM@@<SSSEEcǎuF=|VMMMYY3@OhWYY~o];((`^o.j'`!`sE\\~fDTTz3ǰk.Ӏ%8"\`5 45}` `16` 1KfDzv+XEE,j=K]'-evˈthaaccQEܘ#, `ŋ/?~/;o=}#oxxxL7H/^)X<8Cr*-%^ĉ($ZK֭4ː!,8_?l2K>b4e}=˗_"a>7=ɀE_,LE&`!`YYʢ'C 3gi6 MM7OV #`!#  O<%(C1.Ÿ=C qPhheRZBY?ztX()Kh1eWyy,c>XeEIY\%ĥKHF%sKM *-&9DEui^ꑄ,.]qXYY} j˭[HD-[˘1Jm{7**,С, EAXhoXJJhj9)|axlhؔv`YIgz5 ӓޙ|b?  IHXX>t6^ٺuk߾}? X0X>,#)9wXrrЀ `ɡ#"0X1XBBђ%,**/nj c7| Kp0-+Н;H +ͻ(@ii*Çx~OϞ0XL1ؘ w?i90v    g[wuuu544455uss{ קfo 5khYoede 6њ׷!;X\]1XE3`y1z4]Hȣެ]`),)s2>z]u{Ɍ 2?v"WrGf˪UhIh 8 i:mΌ;`UEBBBBBB9eΜ91 /XllCRTD}cG/%#\GEKKTrqde4bQ;B+X4֭&&-ҍ眗< ϝ,55I<.ZZ8wTQ""-`W~.*    ''yFHbb`Yij> U,Ktuo56::ϯKll R!%0XԞ1`5X~yG77mۆeDQ-(Vhe4Է?,Ϟal$|7YX>qt,gg西P?s-UU,X;{|b:ر-,,$$$,, Xoޱ}޽p=6o,##ibhf/KA<1~|/%. .Kf&ÂhmPSk5 ezj>`k;`qw&XP-[ѣhvY<ES(1+ǏE\Ft>n 2?  }JT?bhgv/XA[|9MBBBBBBـEGG]-[>d 8::ر0?qoܸammi`8Y[3EG0XXbhk#4`@$ZKV=z>zjՇͭ`p{M .L+`JK5% ~zIѧNtgϐ/YޫyGGXVďs"v969CہŬ6 #{aaaaaccMnnnܙbbbVΧ #ٳ{,2= 4 2b1X$$X.Q%w(oh;Mk:m0t9XƌAXErc,,]H0n7/XQE\误_U&sNf @r۷!,,$$$,,Oq0Y'++ёz˖-!)))?? ww,{7kV/e`4d _`h,O33?,//]~=:|9mnV|u=CT}  KWyISQ6{Ɣtt|/_*1m,sʙ3g$+PJJJ}`.һ``qsC/̙ [[: F_ƺu!Kz:`Dvv,bbx1,%ԳI+@VX gg[Ѐ .L+dKKn.RxI zn RtDt|Bďϟgr,N[OdCBR޼{޼yٳv<އsH9t萈eDEE{,jjUWC}嗨kVVfe88ЁFF,ii4o XlmFD#RduUU`u-46`y}=:t%V0vٳ,:J/,H7 m KWy=I]6rD9;eheb%ylcp0ړ;?ߺ4ExnWvw&~HII׮]m7n455)++` y=`E;OeC`Oj9hh CX2QQTZ?NO`B V;n\\[DP[2`Lͬ$.t={^@&)dHLBn>D okrkB'*| .EI{ǏAA|by$bu   JII LG{7^pʕ+{}xxߓoܸaffiү:;n ,ťiڴ^KHe5 XJ'%e  , [nE_M Yf  pfPg`)?de!ut] KWy([`_kqPtf7g*i%ٵ[!0۟oD6ZK#g=X޾}9rrrԩSgã;'NNh~ ('eԩ ,) d7G]Y[ˣԳԫ+ҭ`ڵ66 ijի]EiXu9i(/iuij,,\OOMVz aZ/F, G|b}k~R&`!`!!!!`!`0?ӦM5jjjj8ʊs[@nڻ` WlIjY5kXXHHHXX5W^廚1oΞ=s~Ym] YvŒϞ 0汭퇂h5:{ ,PEF]0XY"ss BEExc-ET ҥ nEF:s|j ,c5 ذ7Ѯ]x Iĵ]m|eeB,پ#^״ \XJ"c KtA:9+qGT| s'KOHt 0]d~EeT:NڷmBWf8yqի XXHHHXX8]XHHHXX>TTTP]&=={WVRRb6X ήER&&gz ,Pq`EAA5qqtF SS, XXZxq`17MHIQ,7.̙d%9ucSGOBU.]Bf'@"}z-oζ 4?s'́>- N,Fp)5)qN[N`rAݸcУǍ#`!`*.P 967ݞcc~o `,KG^\7KG!a,$$$,,B]-\XxqVVX3k֬X>%Xij`9u=` XhcKzzEyVX`qscrbo`YKɂظ ,kttp`)+LwMʣ'̛2!h \dlzmjFf,7oDdq};ҧǎ%`!`*Ρp }-ffNu˦p;~ix,+W+,$$$,,krrr>!&&&۫544Fojj{AEL !`12Bi 7DD~( +i*&K~ X,s`/h;MHJ%1㊊M&z, #[@m0}zr j$")؞ ]nU,Ũ!=N\Ԅ˵,FUUEݻ?i,,$$$,,qdee9zׯ۵"SPPx-YRrHKcss9?3'O, ~~9[+`qq`15PUE;:bDGYY,X@U Xf`ս̀eb">? 4eX44ecM+("3gҵ#]62`P{,,$$$,,B'Op7G233Ommmh^|+YZg()(.ۛ67? )H@1`Q|<)GbOXs[u, 93gQvSBXf`a>gequ^lAqt<Ѕ@"*X45"a[Pd8m`a` _ӕ +*:^@Os!QҺX8""͛7=}]caa!?X>FwmmE[XҺٿ_7Y:аa,+V..jKNb{݂ X,EEހ7ZUBiЅP%NNקq`ּu:Fz/\@7xC|{>=@"FOe{:z44ͣKa!ڐ + 3,X޼a[J] RMh,,$$$,,˜W^IJJ2g/^ׯ%$$6oܱ3X[[ jCcc9ESӓ:"i,U XX\]1X"#*,,X M8zZ XVpۅC>XL7 XUi̸xV6Z7,Æ!WKϣMPCBED#k@"jO8sM2y=%ہĜe:^Hʵ׮%`!`!!!!`!`ܼhѢSyfJJJ ;`w:/X44, jj͒?Y CX,_N6(( ==K`jKD Nv;()usH\muȉ1X/*T,Z7,¹shFh8#`!`"ߕ w=g!%?mH9 euRҥm/8M,!`!`!!!!`!`hjjvSC`vO;mm}TE兲wET``17? `qw`:/,72i!sXE&9cxOi˅ mG ڔc(a% X֧0 Yk_ Ϝ9L6G `!`*;w}HA"nf{j.6],EC+~Ͷ̓̏K@i2x0   pߝYҥKB,s~ϹEEՕ=UOl"hX[cXXxz* ``105r e޼b^u,ui,:y2 3εWѐ!ԩSc:=0΁D,4s`EJ F:pm=mΌӲW;%ŋ:*uL!CXHHHXX;"""eeeGpǏonbb"wX>v~_ mgwP^/޳4X,-^b"', +'s;`>XꇧfgQvX&MG$e{2x039q$Z/4|8 KW0v7Ҽ{[lٖYЖqpZKm`5"ꡖkRFu<__4߅ßC}MX eL5+N+Q_6Z[CkR2:'|Yliqqׯ{[n۷ ,zzv ''auuoO `17`<`e2n -- Cv6,X_b`Xie}zRFe?2a!#Y ^pgWQѺu(͔NI!`!`* ;7")^v{1uul WaVצfB\ XXHHHXX>ԥnܸaee)&A}MX Ҏ{,>}wc^x1` $$ۗK>a(,aa,煅]ܹRR꫏jF$a *d1#Y ^p/,aa(бc0 XX s$b}jXOG۲bഅQSkkFKKt{ tE^ >P:b¶0 XXHHHXX:uuuw;ÒOS&Xtt$ϹA樜meuLTC+99*ott]U|`)/1Xğ 3`dET]0^A=)tOecF|J T8@Bq0XFzlH m|e4` :pKHBUDu7og/OwPg2m>*N[4l E{@W`Y㹻r7?_z}Ҿu|쭬NPWxr94K~~W`9{$~A޾Eb͙IIx]ѐ|K^)3!{ ,>&g,(èe ,,]/HA:11zew-S`)mjn],l O?㹹nxyp\`)/--9?ZCQT|+"u3KRSP VTټpDcc,',,(9K%z)XަlD%3&>;dYŀ4%${VRB֢4/t7#.|;D^Kwb[LA;F ʣ'^6;/m֧u< oJBBBBBB"k111eJ[1B 0Xij>⍤)W$$-- `YccC;;tt1۳XX,ZDXVX&M`R9PefbLWQ,|4 qe[VtL e7olرxKc#/@>x]XEZBvV|;D AKvd[&OFMQpڒ V,99^69;y|6ٵkzƥK1XUI{,>hZD'ww<&MJ RcmMX0h99,,.1XBC XgAVq`)͞lߡ(~A;`ٞRt`V4IHdm} \Q , !!(,"$ KAAV̚`t,;FEFDiA%3,Gclh`rE7ߏjjP-U 25|Qi W䐲&eD3;N[7nJ-r4tSxRup@=, Å ѣGC;EVVVXЭi,V̽&Aɭ5[desu#)be"&5ai>Kh(Kp0=u*4RSc2b,Xf,*G4*b`TRKo͊b`v9l߷^r-(!?G}~4,N]9$nx,_.Ԝhe,cF##>`rhnjo*<# XXHHHXX2۹sx>̙3[+UJCCC@`1e<0 snwM+*~DKICBo")&)[[Z@ ˩S|ͱRV,(=K@|-Mw+g09\%8E;nݻZr-H!ED[Ĥni98S[DMxrq 25tl"cVh˽KXm5aGdޭTmmQ'ABBBBBB"eBQWWgU׭[_M`:5!AP`9P;5_XVYX`"+9)2`9 `XiX`IKTX1XPϦO`ٓ;` SZǜz[V X̏]|}QӖ={Pu5cIGDY0 %b9v-Z4l H\;L06e8;w(V0m44h2xRA^*'`!`!!!!`!`hws-++cl€.))w-dg#*kv,0X.uʊVLbfFmq))dte::(6,# 3Q**,X`15GWP)X{77~ |]^^޽{5"j[OsB_]:h6F_32j־#*JXLMiw` E^s11dwl&>[CXå,3g`QVbfvLJ^ S Tq=/##q>ʢw%0%l!VVqVV X JДY XUВ f~H}ٖ͛1cуUI,a0XXN/oޔ3ZMeMe&@Μ9!aPSUucJ[kh77?klLWX ls}MM ;!C0XXÂER0`9j2s8}L <1#1X.5%!X[8{#!Ef}cS]Ǝ0eN\,G`Yx1ۨv~m9~%lڜ9ZM''kǬ 8qG,|,""´33 D }wn͛V̻ ~UϹK* ETLP c{xe\zP2ˬY,Xc`Y`WS,'wE,'NGoݢ zMx{iAX.` :`qw4+*:,LȪ;w7a2<r%Z7$¬2oAK"Fdn.7z4֤,/gutЃBv`ItٸedDƛNL$`!`!!!!`!` W_)((zJ@`)oN` ?XVק.XBBh XLLk|V!SWdzT,,%%  sX&M,m`aft,Wf8{zb,('L,kb >prsC_M3 X̾nwbtEЩB@"̢ `)Tq#rrXI,+{,`g,ǎ$ ޛ^^C'$q>9(1K|l)) ']C=*'N,.?xm\IRȠwfGNZf K~ nVlKHUo#E _X b:]?$,u6h)\a1и65cBQ[dƭY7m `#`!`!!!!`!`̘1eee5_$%%}||¢]+;`0` [ T""YY֦O`quah()|jsZxl ioEE,,g<w,g93@AIx={99 ͛ђ%,AAB/ܛ,~;cЪ\3,^?YY,Xg55"33/XRej`|h kzw۷o MqqLJ舨?11,˖apk qy昺:mcs ]``qsۦ'om)1oV,xz,HA=X0XSOǍ ,ǎXYb&(--ޝ;trH!{,pBWͦMhb4͎*M#cAޡ+s@"(BKY l9҆~lvr»з>÷, XXHHHXX,...zM۵kW3fto3#*Uz+,PwᜟmlOUGG <7qqW__Z̡cc,K,EFrKS kޘm^"~XV`jWm܈1XJq)ۿ x("S3d Z4 $ )KIuɂ!==X>e[Fu;F IBBBBBB"`پ}{;w¡/h),,c0XT]yy<0qgQU9 tuioF@B>o]=)1oX0X<<L?KVƾ%Ӽѣ=3K2|8'wȔE X"vX@4|7l@eeh'|`Qq||_,hurHRoAKi n t(o4OO;mTWG*,#p1el:> ݝ.*`K߾(&8Ņ^ cX C!ng˭966, ~25tUy4V56EL{GȪבȫőWKٿ `tQMHsl2?rz]F`8"Lc,`g, x-iqh?މELAA8c;w߷o%KNNOKIGvvh{}`uu7/c-WtK|lG}fm#,nnܹ,XIgg,ct#Gأr <beeeMI+P;w{(77WVVc;;,Jx`DTɝ}L 8*ǏԿ+(NN;RMMǧ Bx>s73i3$bW60`Y`qt`YJ= ,GrvpI[!fY'U$%F\be,G9G3e؍yl`|f` O0t -eѓ׬a,X6e&pUU eo98Wʻ @|nz {bl= fb;EVϤpryIK"'G0`]_{ymPQXP5f>3Ki/%9Ņ..`0`0`>㘺6x|t)NV&1eFX)IdiաR@ Yx 7gsxXT6Y`]B]m CC XXHHHXX#v>|xر]eԩ[[[ 333qqqCn '11-JJUZZ۷…,\>D22st׷/᱁â`oK@ʛ'OP~(hk̙| rr3m.wvKJPR4(aI/c,vSn Cأ`9 qV|`X0uh, 13J0XbX,,%v#&dUH1˭J_rg'҆Du6hY3qjہ˖q{ޤO(۷zOe(0XBBXXHHHXX#...K͚5f̘7nXZZ>z7OAǣt,RR,22x&_y P Yx{xw g5u* I;GARQ;;,'AQ{`G:_XAKHxPpIe55h>uuTͻ <)S4 GGz| QQ,P ‚z2rd`+/X0([aƒ/`ah(`> Ǐ#SSˢիsh''f ;E _ ,XD(dg5v|`),X~8 W+XXllVt\.ˁu, 346'|nE-)M ]P]8: Yx" `[(o""kHHǂmܙ|^`),D2@"Ic ZUU'!ˎQ8X3R VL˞=hcyXXXHHHXXHظ\t/X: ˳gxUzGJ ĹSRz$)UUj2`HyF!Vk$z `QQv [#,X22:OX 쇃jH 65CKMt4K",Lil `r%Bؙvp*z^_ځǧACQWv3K~>ژIq[(-Eh[YxtbB46eGM[^,.C oj/X1XsqMԯߛwR‚׷ }BT.ʅ!N boO/\,`ufp ߿}!$|jSGh+`Y%ٵbdVUTL Yx< r@N[%4toVY﻾ŋ3|NA2@" R0z ,+(`h*~Ɂen4.pفygukv ,?qЯ籱= \ށxnpa4aڃ`HBBBBB?sD[[7,:;D)5͐zڱ-[RXu".N'&b 6OY A۽{$ , [[  Ȁz`IO ,E^`hix {nQQ XO ̰yPgΞ66BV%=t>(cnaqȮ`13; wM5XJKix ,3g-#@"uL+hYlbbЩI~Ȼ)$tfk^LZ` =L{ ,#ErrhvrFFFLJݻ,ӮQYQ#SKP f`eyII<0 JAn7.W"5fwmbbm`׏K-W{Eǭ!PI\]ƏG, s  JIZ/X>E  &R5 ,EC.puGG._fB \hkk!ϜAzCob<̗ǃ唺{; }y׉k!q ,ӧY ̆A̢Rt)Yn )'ΝhbCyxIiô`%`!!!!`!`ǡg |7vvv>dȐ9|a~0X""SKS3gٲ,vsr QQt=YQȝ;x߰wN˸q4bcCuuboܜKǍlxwoX0Xe`?,,**ٚ\_yd$}d\fH^u̙,Gs!;, x{Pԯ]݇m7usM2mږ,$=`"ID9H9`, #sb k9zwSߚjffD`]q3sf9`""R`Y Eh|Xʀ}B Zb`@s^飄 ,GϚ%aCzȘgi>MkxqH*wUwpWXN*n3Er]睟m)@"AlXdϊ%%"ͱMjdoD ,#"HIB=/i5 9WޘB! iRBBz=l׮ʾrC?󊁥 EZI&0`iЀ&di&ЍY3\i`>p72`a[IT<>~K"f,6۳Gz15£*UR,2{gGӇ,DLH(b#`-?yH2WtVZQ ,FU XrsX *ˡCDS ~ToZ#iˈd{v2HvbAνg+$1 Fib,&9lNr#GKIR`u),tiYRc@XP(  B'z_b"?3AM.2jh %Ŕ%0p͵]3Ҽ9=8Gu[ӓ"6(4k&5 %KÆ$2K\\k * ,4A)8=21a̙rYfMN _k-#i)/5ocrRZJ~/wD ?ɎI@"}CpvlXu KHelI۷E˶m$/E4S__%YVRcO. B`A`A`G}} ,.%P5S5dLxBXXP%#ATT}Z:wjSKAN"7+%- CT\ ̀Һ5;<[O'ܩH.,,@ glmˀYN,:XʁB3uVX(x7b~]; ,:N.+pښLL(:Afɝkxqt%ANKn\GˉrE㟀YqJҠ /^\XlmoqqDi˧,C]: KXVtQR"xX XOrp2{phٺR|ϣk_JjˣG `ɴ veaadC~Qe_bJ?ML _sOV;\ Z[L!`zxy#TV. `ڴ|ΜrbgGڶ񹓓,;*ٳ2`ٵ X(PJC* ,&5SFгScqq#C''LFM`)2 Nɩy XҮC~r_He|Kecs _&@;?H$'l>tee@ێ 4>gXl!1X},k_j  f  %<ʾĪU4Z`35| {^$~#iJpZؚ%Kݺ"ШCp XLIJ[`ioOX8:R`Y$P,?Xږ_9&z(CNl,)#Xd-ٷLI̟4 Fk,u,#FȵXҠ7R` YzⲶq|m[b%ISZ8Hd`yl!˪n&O+$. X/,.8lL c&A!KwKwxyXP(  W dQDz\ qѩ NBBHe<K| !`|vf|?-}ʇ Z,iS,?eם;ˀ֖ _IiH{ulbuL6,%%XX' 25)oD2t(/oԨyX:>*2J&Ń !nML|)VNAivifyj&K{R`Faç,@"簱,uebcə0ɳw XFN`91/%P5嫯F3ݣP(ԯ]]"}Re_|i,tjXFx9.:Xde2`S Xdqo.]"$ 8:LmܘN&o~giFX *,WX4Ρ>WFSLMʟ:U^.aQ&.J4~B-С,?W,P`15} rZn]ڼa~6n\6$,(X ?Ž+V? ͺY)XtˊĈ"Pd,6 ,} Xj]eh(4ÔNk;6Á55Z45C P(Z`_B?8ʾvqBt\X754L u. ̟LM'55,/3Nsv|0X/,X887_hkc8xŇTXs.QdsfVdž$1`aQ՜<|x2x0/>]4MWUw`:(`ٻ5X~X9YYy-[غ\uӧ%/PWWXXhpE,,f}+*˴)S LO>v,82/q~Ҥ) ,O 4,99r Wff*'bH#p,1c$6vn{ߖkd_!<}! Țu=+"g(€WX6l cڍf)Exx}?,=:a^ ,R-`BXXP[lS[p߿ʾ_*L_oU,4X!O?ǵoi RK@@RSr< 'OM/l`1e3zɁ:;8i^^90{Ch*,&&d;)zK4w/##E`Yi)}0#e1$',2/F X4t^Wi2kSD1$!8ӹ3 7t͚rU_U$|'P'л7?0HdDt,9nx"چOmm)m7P)×abȻeayRG),ϞՂ=,( ŤvH ;ྯo}M(a"\b,, By9?'MP!`9wDDũ9L&K^\ ,NN  Gp,vvX w nmĭ)WX%RU,]]5bbB u8hg 4d1߿XD!P(x.0nU%,!3aGGX<_6F[ߨS,$$L0qB/NV+>4+KQX&2`aSˀJv,/נWUX  #;&z_ g8;m xJ,_z䳎jz"˂4ey+8P}{,/*E> ?~1/#@`_k1pޝ:#CÁDF44,[XI9RҐrRa*UĂӹ'v/`]ł/.U`[4WɵQ<)Il"~BXXPj1`qs/p!# #'Yl[ES6X;FHjse2` Zߥ|W{{ ,p `Q\q`a\3`&X[2t(կ` ,s'75%"f˴c_(ӣ׮V};i{ˋ[ͣba+b{8/=o,-s ܂ ?|%22ѡmDƴa/Xe1)hjR` YHđPF6v/Cf <_KkRX^+Yw9,Ҁ`ɉA`AP,, i*}F  ,B#*O<~rk}},ctt8̫!`9ztH/OR+Kѣkg'_hA|}loVjV}}ĕ x>>XWIH/J2%`aXvʆ2ݻvR:)@ihT.GFplԧdr|x(Hqky.W .^)[,gy# ,>x{8secu*X^?F'n`xlFi"ܺŀ5Ȱ:]XP( ˟\;v055Z#06^E͘A -w(+sWKϞ cݺe-OL!]IW'zzXff^!,IÃx{6KttEۋIP˗ ," Hl@L^,yQ%۶Q`YkeBiBJi4X^VX<{ ,p[۴Y7ƩSb@sMI7S'"m ])9ȉ!@"֬uMo }-s""o=s̀%2RXj]\,oN-|=:Բ4[#?G&"^ [ND`AP,,k׮*)!+67_Xh>wtNylŋրy5,&n]tH$%M) //of&dG(;(˅ $$  H@"MGO`JZգ_?ƍh , RhkE7 XvFpC5zh`OM?C5bb🼅׭K^\:#D&&ZZww ,uz|}ˀ']`y>9ޞ.%SFHKNU `E ,]̢Beh\8ga^ ُM*;#[L B`A`A`Q~OXhڅ*jdJ <_Zi"anݨ(˴p! Ҡz`~{8i5'l|pop2R`iPbE9`"epG223` rR.x9͒|@ S~~yuPTDg4u+8sl:U~Z%yzBgN ['T yx<n#GD#`j؄iO8[nh˖}:wB, Vқew+!W =x>ߗ']*LmxV ,3RK7b1o}Ilo%" vm˒1d?kjɧOS'&T^^-nyOxo W:w|<95"HdJHsKq~A+Hn)8홦gJP}ө* ,w[Eɭs ex|hJJYls Zm ,mݧkk~BXXX^U6nY/d6K}`ҥ yl9sH`eŁe. @+eƌjNŪg."KN`m ,X'KErrC񀺕姨Rޜ>>"E\0`#+vՋddau0/СCgϞ^4uq5g=-7|Հ$*3{iicʅb8}43{gC&3^-XPk|iӦU\ . 55) tRt@|NNYg,:(7+u˙7:> oU6mba7O}:t( !{W;jj۸B!  ,66U%F&—7n-E`ܙ|\f,"pY MǏn*-s@RnaM X'R`ZU,YYy~~Q`lb"*^%ܑ!M€>{e).TXX.?E m|\N ֤0fXVuңIO'MT{$&ff͎2TbiQ+VV! έ57/_VP 6 U|9WE`$WGr|EdvP"Au+˜BE _ZDOfo0MM=Lp/!{/я m:OS' '׾}6bAarģG>xBYHo%\SMV>?YO'k7XtuunڳNrj NMOXQQ,"HOVXΜo3s)P` k|ۻ XKVwܽ;IK# A>VPPP ` z&Eb`Qjp2kPKjh`ySyF. ˜/ k5u.17'Ζ Smɚj:hj::& h,( N-XY%LMMݻWрA )^%Ք"lH $WҥKv`17/MM~yԩSتݴk^` ]2y,BK% l)l6j/ho OY>?~<99Y ,,웙)?0Q//|E} (Mش_-kWJ6T,O>իWr%񞲓Kܹcee%+,g33͆ڢEc$#(-m-r͝; YEԴB /T}o6K|<C%"bkx2?- r`A O eRP@E53'21Q>mss%` %e], Z|yܕY,X}Ѻ5{)_Ooƞ+gsv˒%oVX,1|U|BaӶ-T>>;X_EUN ॣSqNΟQ3`Q+T{3"hZs/\HEBR=+m\Z{z* 7|qBO>υ'O)?BZ>Y'" 9zhi`R!LW5r/Ǎp*C`AP,,Yڟ?nmmݬY3ҠxyznW[55 ,#ttis0 Η&R_kn {KBJA8ݰxo2fXX任uvdjZpܹmjh }| 4>"4DP~ l >įlQ9q`k@uTpppf;w'c`pvȐp2iA8 .M"aES J*>Yﺴ>ySlaс <0s,mm/mbedw52:z5Mӽ=.B{<ze2cKiZ}mڜT*xyk!',+m~M7'(f okcԗ} ~޲՞Wtq57>%0:qVKҩ[v:-Xh  7⃵gt5T_ ^Sֆ/:n]|}7mzhK/fM=N**4';Y 6_wJ4*; B`A`r!j/*:':`We%2Yb]R ]]ĕ[d~ݶm[ X65MR]gZXU˫?oٲnG?/ C&sR:2mł )01IdhklllmSZʆbٵV^,l53kmj(.0B445#<G)zz::jKW,x -,D*mҤ>{7l ZZɊst̒^ҧ1*H&b`Xh!= 15b[ᧈ7W2b Z)RO|Ru;E(X&k iܸ~}.]}t`L&r3g,2lxX]5$>$x?u+"߹sB! g]6i}رjddUTCZbyU`ejB͚5c5zĈ\\\]/ Ki֬YP666)U}W{Æ ayΜ9X]5$6܋?ɰ133/_I( gӭ[Tn˔)SVZ XWsX?Y`KKKjNlܹsY|cVl>= XQ5t䈈XիW}׫OD`` ,,\B! ׯ_dZju5iȐ!`wvv޸qce gt )jjj>\Z2!!_}ӦMp&:::p|H3{'OiwssTW^_E 8#G/^>o6mX LJӆclmm|zN> GGGnNNN ł`5<<|ɒ%a,[LJppIOF©XXP(;wzofT񈥥eJJ ۔.%;&%%R{n%oooӨQ#]]]V|oCCC_x̖wxP}e._6Rqc'g6:uJ˗/gq޾ vݽ{[lŒM4N}}}b@ӧgΜ V oJ{x{PA@dA!P,,,(TM˹sBBB{n)::Ve͚5>`UV|CJ h ֭;[[[;88Ο?Xb+}a>X܍/--ZZZR:ȀU???~:uN{u!M0?3f35kY LuڵjOlѢEҽ`UMMͣG*GVu .d,grXחnt[EcZ&Q,,(    O:5Ud|bߞ{QQQo;^gf=zU9LĶ2aJ̇ln{쑮2룁3ħxeJI9sت +>`aglrwR,'mA! P,,(˶}ZK.5<ɉ -۷o_:nٲ*`czLVfII >Y( MtAX x&~J Xv!- cǎl ď3}t8~XX@6mZ~9VX ,6l`VǘULNﭤC{]vje۹ !{9$>_jd3)6<(4,7QP, B&:t|\?^4 ˝U?_UÇsgϘ}ܸq;WpCOO/""B:ֈںuk&o6fΝ;`a 4q7-7kLz@.EEElI cccƍİZηBͰqw#Qrxw,.ax<,ªUx-Z#Iq8[2ܦO bXc BV֭[XVOW$]mٲ%_4iamPPwa̻]*87,{yy)RK9r4+&''Gj}IlV`zJMx HKŨOKAՊu6IÈ)[;%鵰HWYt?TUfQ\ߥKi2  BJ}߉es"}L<%%%,zW3vE+=hӦM ...޹s'߸qCzi۷oߺu+_e%_x7b6T8W\ynTҔ)SBCC;t:zbcc 1ĻuIvm̙3R:C*&[bwڕ]fLLLvvSTgEEEmzHB  B>*γgV_c)??y>y B`A`A`APв3g9r%%%l֯9={ش =mB! PV«7o} B>~8q[n͚5߿ÇNP,,(  BP( BP( B`A`A`AP( B! P( B`AP,,( B! P,,( BXP(  BPj <j BPOX U˅BP(' ,/|c{L"YV endstream endobj 946 0 obj << /Type /XObject /Subtype /Image /Width 1083 /Height 623 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 1332 /Filter /FlateDecode >> stream x = endstream endobj 924 0 obj << /Type /XObject /Subtype /Image /Width 1368 /Height 902 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 947 0 R /Length 136022 /Filter /FlateDecode >> stream x]XG۽ (ƞ1bb&j4baņlh4ނ TP[%S̗^9yx-܋3o1PYGAAA 1 aׁkwtկnsAAAB@"'"i$5;<GzG    X(I?40`;O    XI?x    XI}G@AAA,>݁qr1;L:aۼ?]~Ú5>cT    (R`ŗ:n]cӈ[їs\n81dɼsǎf1=G, AAA$mQy󺾻:GLsy n>i ڟٶ!~v³푫e ÜAw|x  s7x*8dﺦFޏL|K᩟N}raR 6b镋V-saQ.g'AAPM{]Lo}L|+aZassq.\\'gٗ88O^yzsWL__  t]iwvH}{\?+q;?ѥm|-xq)|u|΋{N2i gɎQS>1~|6OnwgBA^ǀ k L{1SL\QS.^r%!S>d;QC[%SodJʔg^u>詍m7u̩W7fy_v׳VM6YݴޔutY1j؄?! /N0A|h;hDgĽ~&/Ǚ {FN9azrUO[azQS8/ҍNo~fNXX^)w܌Рcოf;>u.q1™xKe֒=;;^ ~Lo1 /,=9er@b0k]^d;;7w-! /N< rY3inmQ@VQwӫ=|h@ak>q >9K=ӎ?f|еilc~1?6{!/N|$ VtZnDہl2~'rz?a\|{y۝;8-N~{HXTDM;=luZؙ9if`H(yk \ȉOps|DD\|bÜf~dso1c~A kΑOqwhA^&?Q!x>yywF/LTx @"}a3p3aH@"*^DjzT2o }{-[ܜ7zlΏ|TKbS; $oG ᮟuY4ePcʕkwZ0eh!jl{N z5S1? ᯷~O?]}魾#'u869lշxkf|Eǣ;=:oA|9eeӿuWKs=Wc䧂t'﨡VHWx _웚O}%>Qs7v yβ,ݶ[u|BpIݺMO{3߷;JÉ2~Zl;YC6=?A5ݰOүSe-'eDӞ}dfSs,0: /N0"'jtX" XJ5Y:8|!Cb(i&l & Y>'gxD.ީYd$;[S kŮcw<{o Ǒu"&O0w)Io]4wUT7v+I'$^zI )WM.nB~^v ^@AY ;G%%I2"󓟚;8|F %)>/fid}+)hрbU;ҰapÆG) .S&@Ѣ^M:7X1[DŽEJ9LH:ld'yK1A_ڎݮCANMl}_#>.^uOzT٬ ;2cߑKlf8r|IO݀gGr~eiش'َrmgՌ|ka~; kΎ#\6ncj>npA_-ڍadScxMڍ^ZmpKo-,"|zAAɮ{=ׄEx  2I},We0\̮p`d?T$   s&AAʧ׸U/e>UCnߤtO   '4.    f4/`ւ    XI?zNZa?sAAAA,$Ÿ < 69.t   DO$?`7n!   rW$f`0AAAAޝ    |    AAAA    AAAA֯u>E"yŶ_wy\Qa1V83ѩ=g+{ySr-֛ܾ]=kV/AAA,>@۶ԩ=ht统۸{V.3e+Ez"X1&L sɶJ6l@Tgdm{2S+Vb/F!wOGW   P qi)LJD|r4< I ݣ#C>t%Ig}w9c#Ng<~H"B=;ݶ[ZZ^LNP)B2n_FO+Ϻgȳ AAA>@}oԨN͚~P\Lx[YY5lؠ }cժV%ckI7o6f(]W>{鼻];WZp0\ `|7nd\6{򋴩W\0^mZ<@ZJRɒ%ܾl/Z8j*:&XJwVXckۉlPoV>> ҄,]_AAA& hѢdNt2&*ܴ>᠁v6znSݶmԩc qeʔ`nnvg+KKr _AAA&(I;vhe!tNB}|AAAx9jpx       |    AAAB    (HQp72M2c6 nI$mf  C1L|iѫL)FoS>m "9rώa0LcȽd 󏊿H0>7@X U(t[n5Ou:o2(N$W7&O+<f<͜DZw3 |zĵ|69_JJȳ i\Hy̠^OKϐpWT3 苜Er |/oq=r@Ο8۳<{&:Rb$@vmwlߜc'UZ%91^.ӧH$/v޴ |;/W |^n0V-S%(-i[ /geI]2k R8:^F}`zx~Uif%0G\L=|@>`X>+VxQ#[רA7l`ꕹ6[:wƟ!7xb۶ԩ=ht统۸{V. LWS ) W\*@ZJRѢE==H_K#?֫ysNFOoDx<~vs]M|=b#3ӎ8X=:2T8HKIV+g\|tF@Kw5T)S|B,@|y,zf׿/_/)"7L[@OBn|U+/`O6ŻKVjÆ KժUkQKQDnSӠ]J*iƦ^6$`իMyŗ.YHԨN͚~P\~/w+++rC1Ҷy'%IoР-7 |^2V5LȃUr^;w\'6BKxן Y_e>FRfj?A >a߾-,,:u0{֌ i"tl0`׵ d/Q(9Ib5r<&TR4i<ىq۱BX.ӧdL= :2}ŕNJ/A>/Є>dHz_g>u.ͅx%xQ~z<q?APR<>NTe]ښͮKFz cϢ`ܹ#Q:="츢>)iEFG _o") !><tu$gNJ/rlW`x)}4 kWG3zV -`bQ vP :@B@$Mjdl Hu@3~2 MU$z633[sЩSmNq^h~{Mծ]%,~u] v*E%r^>^%KNnC^y'I1o iߍ.SϛqڸSzE0&?|\4j%.^W D(0/R\d@@v3xw'h_r@¯+8@}#R@9^! A^ ^m{S3T(Q4ΟpP_x|sss:P&.RqFOrϣ rIyM 7{D>#K*>*=8>lSbȋmy#X>gW]@/(, (&{QC6 q厙o6'"JItp66333}ȶmcFϝxa*+T(O}ÎcɱtѐZ.-%&xyHϪРA1 o߮m}NHލ`ߣǏVXaE[EkMa}rFxBz 1 >OrAP7anV3#YRār">p!)yD+W2efHrVMk O^`iiYVwީN4;Ș2eJf:uj htqK,Yںti+zC+WLTɓ(wREn @bek {|^aB@OҪ թXW8~y@fB^3;:Ux `k miW A^ZAK;ʭ>@"|^iH1Qq>!.<]LxZZtTٯZ,1RbɐxNCO_LN'AhO?o^[Cb}$NTc pIԫGvoBuB^0jX|?($r 8:XCa2 A|ɟ0A[C}[HVfz 5c0+ }vفy0նN8@ nDhTȁrY|@UP!mA&3M74Pn>@>״1{|^?Spf.IYL@Jz[gGyr3WlXs6r7& пŊVZ~}BwmAtv &xꞗk !0?/M@n0gg@h:eSiy9XȻZͣT||$5ڄ> [jRuwr9P zz0O*j0\|~e-u,$(W}p2 _/ 0LTmux>\+ԥBJ)?i42PT|[{Yfp>3]{ W(>Eh^-f0t"ЌW/Ѭo,(>|^2*-Dz;/tji).rHLn!>AM~ .OЬ'ntq=dX>|(|>ϊ+>|(ٳgO|||~ˮݱݻw tcu~69!zނBj:A!u#ޙL2s4 ̗eCh0s>P|;;;rҞM]6e9˾}rwlƍ @a <-+* X+2x>:D_O A^Tlf}Uxͨ >3Bp/q |(>G}TT~<~8999>>^Z'ߧۏ=s~ &?"둑.\?~֯_O߻wyftt+W3(|ܺu)~Grm1< oݽ{LOO'7_W?pޞX  1҄>`]^^O=M.M4ki۷mL77ǏC ixL%.O)C"]>XPNc?QP 0wE:J3#A8"1B|MV>TLLg(SLBByUVD =x7ӧ٦M;v(Ŋ[jĎشiӊ+zMJp,d$_EJc'7oL-*2g }}+6m8k֬-[_߸Z>~I|BT>:_jITC}q_НZbiۗ .=Kꖅ:C(]dF!D{@!]FDwjjK]N={hѢ޽{e˖}𡅅BSv֭dɒ5kg￿tR"Ƈ ֢E :D۹qㆠ| DJ7nܴix^|qN? N x (-jd)@&s"O`g $33YޟYcP!o>8_SΫoGo~='}a80 |P}*xL|7oXKtżbŊ&Mڸq#ы/~:&‚7oޜ|D_d9\xM|G~'? _y:T5 $t B }=Uk}rm  |&/@ APF-U_~/NOudI[Jϙ+0(yK@ܹciiiee% ԩӠAhc*K,'--1c٦ 9##n9šӧ9ߺu\ʕ+Sy;6>D:}qww_ng@@}CkLO@!WǪ Bm2*PЙςy5tfր gG.oxW"pZd??| (>+yW^z_n7xI&R]M;FT+˖-[Z  _^bŊnݚD666kמ>}:c<~@ȘΝ;K5Y5l6| L(yj+>S9%luBy2zd QnPgwȞ麨33܂sǗ)'O|D ݻwk'z@9hЀVo>0>Թϸztb/y]3_>"_QCO *?gf(0C ; S4X/%>Pp>zR?Oc:@(xz {qI]k&kFKgݠQ#ȓ#X`fwŵ4`.C &׹4{zJ+ jVӬh$ʊx=%7C&"Ɨ>|^jRR{ul3\_ɮY_J..3iȄn:Hr*e. ګ3[10o^m[O(@GAYz|b]/@Q7&~Ȯ×b#V}l~={t0~~=xe}&Qr0趦7пPsy]s_DG Oqa>+擑 -K+䢀a6쏟  @ yga'4~78) ؟lr9|^Mo,_QPP44f}J:S\Ny UTȌ E } x}4hٟ4oD~|C q*U:z䠴#{y ;~aVP?mǖS'P> >gu@weDv{zyhv-}f^@᠙ ?_;oD!#/` f}cbۣ[oٴofzuk׮ճGUԫKlrVoY;C%~yfxE/XE~FKZf%iy= _si}aAc}ȓ>Nm]wIڷk;r0WnD1=~CŧLDNV*U .'/ ܃TY-P!ueiW6FIK|b~|>ɻ1ߍشaƏiӺUK>i-"u>|(| gLթ+k ԩbY;? WQ<;[gV ,-.Пh` /D/,!sQ XKfFv<-| bA ƂBA%Uڧw/?E /FK]& x<$@2xu\oTa=rk˂"CQ շ/T@ @P30]^6dzL>k]O2u79Gq=z)(BO$by/\L٪&Nl@8׳\ٲx2?|J0Q P 0}IgT3 C/_fu )2‹M%ڶmmSClC"s%Xq4l`Fr:uj4r93]6nުr=9|6V.Vj"Eʕ+gaaުU?/AŋNjU4>/=(օB^P*h&ɑ<5zz (Q^g{:|#|<;9>@| x}#'XaC=1Q>^dkitORzu]0o qaj@~"BrlZJ`Nz$y/$%xw'#ѷ.&'z{FGOr񼿟Wtd(Nr Ղ`(ɷTx!G/zf>/L0$ D@r?AyyB^fFΨ~ [F;pu _P _B @b ˩Yz@ժUkQjU6j؀tscdOÆ 0M@ m' QZ55\r{wCl%*UԠA6g#o @>/]L0Ǖ45 뼙L1RY?^=M̫E /KcsyTzđP? A;U%'!S=|l;_Kj4q3t7L|$(&qIƓK[+T(OدUZ>M-K*E.,#=Zjs̤>>&<*k͚ucGYTx1ZJOnU/jEezl=W.K(姳df[a6\{<2 :2LMǞE LҹsG2)|?Յ2"^G@J++Tϙʌ. o g"O;RH@t(>>&dk7L5]B`2 0=u]zf,fٟK@!|TQadSLx$Z"/@1GѢEɱrb?֮W.9~LUdvGT|>|^MXdk:wJ2`WyOsZ)0-\yvP& ApKϞ92OkZ[SDzNQ՟}Jr' 7d'}=>*L w|>|^Y->zM_^OS O>x]^]܀W4S6J"p } !bGB90|}C377w߷A<rl]ByIv;f4-/;@>9G-[tnD>dT?sџ/su$\@L2)/`:zjMLK x :E_VVn?aJ2[Xjժ'$8H6neZ5yQU‚iϞԱ}ɒ%kZ[.mecSՔgb:vȚʺF.+RyWp4@E`!}㥷kjBZ|A<ܟ@ 'j _fQ݈Pj)wy5M!3&|^ qa|އ嚩CO$'ƛj׽֛ |>S͕cVzJP-0:@,w; jfmScu1H z -3d}X_Pc93wm_p^r/2'|^Ʉ)J|um@y?n:] sQdy;|f^@Huw 0V@Lc| COqͮ!v~ ,|>>p:2թ~u}A;q: PTG&Y% dQyz |hR04.ddࣼ* =3M`@</7t< @U7@ )_Ao;Jtj+#ujsAMWy?lw-35ԥxW:jtq&K@x?L0ބRL8r@,KhR)Źjm3 ¡1>JԞQkP(N ]y2b R_:|(D>4ubݟi\W_A |++Sy\ AJG^~/-:X藇~4ucΨ~E} (xc%]O;͂xboAMoYOX]rP3 Q(`[@P@@>@.> |<&K2E./-+VyU%o x1J9NǪ'H.`H +/0:x;5n< r>%:*Le=z)Ѩ+߰~-p9w~-M<>-%yРjZi*};o`:d< V,xʵ|ȩ 3@`f`xOwjrdܯ |={t733?nhذ+m[ԫ;b}˕+׼YӌTŋ7j :24<>4rukW0V.)f|l&.Ǭ bgWG * \.q_ /Atf"_FA,v1"ӷuju7@-[%+6եBry&t;#=tl䍌Ig}w98nKGv58IÎ#|$)ƀhA݋҅sdϹ I IGQFwAJp19#6:>@O>5nq[=^yc5xքx! h%d:k*;z207>Og >5kݻ'.YXMFzjvlW\}7&@$'%,UڰaTuԮ^c!Abld;,4FwjմnrFvqU.˖.ZRJ ߾mҺu!cڴnecSOJ( <\X/^lAK/0~ )lXy(V115 +y~&.r%J 2IƓ[+T(LG :XOTRY;*$8LK'Xz)ϓ[6*UJ:A>->l^vt?OZDԭyP>:>jQP^˼mE;#Wed/l NP0%B2٬P2+ ~ |fjӻDuN`o&ΝkԨlffv.>+>!sss !Se\) ݠM 푕SM++L`lW;\!yΣɱg" 4?޷'9۶n/s#{$w'?su{CתUsIBI<տϊ)!LI<8 8\GK . A3?u\<uzɆ<"/ ʥZ>Hdu^@ǎK.ҷo_///=u8T)P(Qb}/w333i/axyuJfHO%ZhѢ-9{3}/>n r߻]6%JXvש^I@.Tb],]l޹rJkײQj̳Dth߮B͛5S͛F,֛o֭nv( L1rQY~>3\t6EyyR.zR'GLAq}7~|O7o޴+]_\RlHء֡Zר! 8t@kpg'Г!I?]4&*YW%Y+777/0{֌"Ex^Ç <},--#Ž'K3^]P]c_..j'/>ݖ;gKY4@| 񊿞 L1ٗ[a0lͪ.i_Et qڵX'k֬7pMJ"Xړp6P?ŖV$ʺGn`ki4F N62z޼YSq@™.UEc!wKKISyy#}BQ1Qa?orKTU-Ӧ:>^X)?ϋKNj˻%I>HfGhjaE~.䝦+@qSPO z{|L|| :׷bg6*UXQu4 *VMk p"^w˗/o4l 2⤦@zٲe/[|L4%Kִ.]Ʀ'G*SoVS6 y]l;uiכIcNeWtFׯ[ӢEsKU|"4h>35ixF~: t׎u]GM=.5y|fbP14"vԊ8|HO;N$@_z{퓿%Olnnv2+5^ysg@Q9[3ጼuU74V{Y7LЙ/:PޢSf; zbuF(|>*EJ׊yb"}O^d#6:skD cvl\hݶMCFGP4[3.'^Νeƥ3B353y<@ .ߧ9dG8zX|BjժYeJ[]T[YYUXں٘:]ީ^¼Q(89քI rJz$>OrXn3E'!ByLn:|>jb 8z|Oltāo_oȈzfksflg$`~^Ύ=5%ʃ +n\1z2 8|0y'|^dr@ȣĵ>[.?93@Pj@NQО@ yNG }+|ŦQ#muup`Vsy`d *_PܝPUЬ˘ 35|@(8`K~df]uu4*#. ^Wi>cbs^ (9f= l||>| >t j=R3UԵxS@]@e8偫s>gFƳ=Ux#vP|BL_tމ |>@d~s>z:4pzn]YnqgE|Zȑ?P|,zӇ L<7Bi}uZIg bx= nAa|X *&)T#Ph|-|M0*.)O\_O` V5k!=AKف ¼L&OLQs+_(\ ԫS왅b@3/^X̚Yy@SK>f fg@"n@/0ʬ[fQz=b@Ps2IqC)WE_lIKWA<@O@bCOc@S;{@<>>&ī:QF2yW sq~ZLݔ |Po@\NG삗c䳷Cg\j:`fF2(З i:2T޼@i#/`0_| p xq: \><'As[e5xuYtR z,` vT2C2Ygڧ!nWfE=:kH^2 "(Ϡ1 >@{0:@6ı#y҄ #Oz9k>7&^`ǃ||Ĭ`OU:_N\^ŵm95|u-F~nڀ}=Q/LB?Sg'ܹO\Iqu<҄ү|'O!>{1L >.IfM@܆O/7ߨ:+)k` Ɩ P?#\EKDk0&}SZ P\h.@?nC;ȞC~{wou,$((__=!>>ztJ#$ٿg6g)!>so|cP~thE:f|}tj\xM@3(#YO/Q2Ϩ38c(@F %ۇ~Ͽ0/7_=zݻ;5}qQO<޷K}=#~{&;/]LܿG>/1: Y"!eqn} ꭖ}AH@й-zNuyfVS_f^`߯a4w%K .6{0_~yr)O{dA?lEOSxLOrY·__ &qFIm[/[>/wTzi&3 LTb<(d/eı <#`ZzL?hqd/2L $/6'|q/A}@>r<~pؤĄ[7!yx}^=SիM{eP͜ٮxP1[U4jU͕hS.RZϳt6k ]2fS |`{>~Dbu##(/oOz4fߞ#AGܾ?ۯ"Nlp?_}ַ?t/93~'˂w.^JM`¼]zu*t7;#CØ>MqS @fvT@u: 4c^ 34{UxsQ[@^A)e}~GCOGn;x>@e{V%@d׾/i AП_ph 2[ bJY/'`+W]uUx|2O 7kZN7Kt0nE{+hq1赧s]CbW@ چ@@1:_( #_< W/ ~Gkx|\'z%HP@F'O8vNxZ H7o~z `FƕyB;N{goJ͞Ќm;wg+iiS l6+! >@5ީ>|o}N\Loط2"8z">/0(|Uy!h^ (chT+@AJFUT(^ $F! UT>?T_?q̼zǏۯ3eLM~>$>|?|/$>'GvDwnG\<{DaOouGlir;knKr'B~^塃~rPDq~>K8~R/L|u3Aq@_3WK53& V,3+5ų`h-bx+߳g6?߬}{vGN/=payNƜ5оЌi1I>-'zpk]O!\0o];_KⴔAԪiݦM<ؾ[77338I嶍_Q`5-Z4,^[˗-K,5rI5RjYM*3X].P/X:4"e3/#ׅŅ*(8%?W?r>i}yn=9pIpgStq y)5dLˆ/J:r76d$}p.ڶmmS-W\fM3E/ߨaФgy׭]]h|dCt>/ TiN}mk0KrI2} ЌQWQҫk /X/h'N^B+Dn˜3AN }yL!Ѐ/=gl>kwy0,.QI×oAw1$_JQGc鱇HO;t`Oꥧ3?h`>Y"/]8GKKI|B(ʈ^>xjq1uK йS5q@wؾhѢ!(h@~z"uש+X!g3+c$Ά\sFa|^qgy>|%ϼ/F]r漲ሄNBz}~~jffaZR;jZ7kArv#;8* ,[jVTA۷mbuZZ7.dL֭llI !Vv/^|钅zjժYeJ&wxoeeUbEkdctѦ4[5β{b/;iNAs[O|*uC@pt)Пl7z_< AmL f 9"?r>|b̀]&\|%+zFw#&?%?%#>0!ENtWD q#r&';;1n;VP>-%lno?t<ij GiY فXz)ϓ[6*UJQ<p)c#xz{DF@@^'[O=9%@MbYdglI)?tT,  z_qRѮ1W|> ze[/uq hn~mZ;ķw>4) :2$4H U_0g+u:6 :M'^OIJOL/6 O֭kÆ 2S/Z(yKL?ۂj׮Mo]mu:W.oʩhVw# nǫàfxbq_Ӕ`mE>^<yJU >@LnuJ64ٷV/bDzoǭ{d}h,p|LƵ˩i׮]qby} e˖tҘpjuRHZ^peK777b4/^t+"p슨.'EȻ0u?f@Ɗ,@OP\j@;>ݐ2>@}{7_ v+ƜOűTAtyPtuR-"?j٢{w$/#=M2 ;FyV|г(?*S8Ujsr\ D=˦D,} DY?PQl+& 9|h/>>>+~cǎ=y۷}>N>w~z+S?|oOX|.|LL|r+</ n6kG>Qe˖]l3ѝ:/YdMkҥll~byeʔ~u&drGZYWTu|y{u?Oj z 0+ 7"10} əUx\93~h/x\*yW$vvv7vvvvppXb۶m^Upݟӡ1W}Wx%p3'cGpNqcCO$'ҢÎo@dJ+cMԋ:1 (k@5XxE P_< *%z0m4A.2""Bz͛W\ ㏏=zaLḼ[oOo;wУݻGX@F~ί)>8{;'[4mK%m:L-Giz㲥 \}@/Qf>>/N->Z\3H@.+`l&`M"n_Ȱw4|k| 0P󏙙}`mmݹs5j4k7n|^lWi澪7NM oGTCuDg:/tZK,1>/r9s*Ulз󀏳:! Ȗ\eMV5@0 do6dPM5 EK{%l{l@ a gWst#h$ϰ} OZ_o]6++gaaI'?ݻ<@B_ B=s']k5ז ~3qvuzgg_M/;rG=y<@O/aI%g8Y? TQ]t{[ 1A j-g$*ΓxI?|GStoW_}s|@߿$ >˗?SeWX2y\tK|?_vee?bҵ~jgQ} <@O#CH1Svu{쀱d (O ^>@,SRmZCߒ}*8J87 I| x7n.]_׆Ovm%K~^xa֭a<@B_ B=@t+_vܾi3TUU+[je+/^lɜKXQQ׿Z_o۲qߞ'/8?pC<6N3]GC㲸L %>Utп\bCW_TY_7 ovvvY^z _5sJKK_7^uo[Z xuwٵmM߾];6'_?vfN+W-a >wOȓ7n ů 6Q̠{ ChJw|js_o3nܸN:}znnwu׿ַ=k8<<qaP7}! |?jwuvпC̀En|PCxV/"5\+ ^aCT{eggϘ1۷oFFE]TRRz_kos}'~U Zxxx8+)UT;=ϳq_sg٪ig-F lcmП>aƟnz^?P***&MTUU㏷i'h\yB|xxi"@Av-urN{Bm3OOu 8~ H" hZ; <@w{=RaN1555? 7 _YYh_xN%VK}}w$~x۶Q=!h\#h~OCNJ]-JPa/ɯJj.֣G3p<)2&Om>Cꕂs_-u5qa.P 2M6gWT~-BW o/=|ВpJH(_d9. [?oOGhB(|e4g;4N*Cx 3Slix@n++)Ʉs3懶$S`A_Uz/ctbT"`ohxx8%,E9o˻3 K_nmzphg v1+JSC)<@0NAA3LB[i޾g+ɕ+nk{^P 60h{a#YĤxxQϦqk}>{xܱ@}y|s=㇖䎞 p]W$ky¼O)O?-++{QF?~<˗ 6mO?ѣDž^}}K]q{;x^^WTL˪-8~R$410)»oM6> /z!~~K/O>wyg->kxo||MxxRRI#X0ˇgl61Z-""4m@p…|HȽS̰5@9xS}WTT?Y|o[uu5>|ȑ_[[lyW'Oܽ{G}܍7o~}?sw\ve\rI~~>n6/((ꪫ222&N>/~+Vǹ뮻ڷo}РASzte8k)^$vV$uo,=]_: gM% %_jEMDH+QJ.߿?}ػwo^S>/ÿoȑ#y?uT~>*))Vߍous=^g>sjjjq.¿ԧO^z!'8joC3Wrs~āɇ &|Wg4v;85Wxb˖-GճFcx ➼0'#| _wqǀ=zx.]cqp 64sosS/I: 1A"= 8" [%VW_Qi?bc"җ$>>޽{0_d }~ݼfwѣ6w\W?я vÇ_xᅏ?X|?ŋO ay[<l@AN#t 3 6a.@FyP ㈄J7]t/DEW6*tC͍d[S g=x>͛{T<;']YK̡žބۖ4( V|э#Z(}fܹSr[% ۋ#xAi> 7aw+zފZt6BDxjжg(KND??<xi/.M0;fU1 hCt4 s 8/x7x8@wF='xd^}_, 땆1cxwxl E.\xxwVl Ey}ȿ1wHߧ-_Pi-+tp0<{8<΅>p#xPu\76wV\;Ga^\Z4jǏlxƤkyG>)࿀8c? /S>\&OϡA(KUܟ Hҍ˗ 7nܢE׿۽oFsRжQQmz^/ouv}G3O}^*mkDA#;~j|h<?^ڧO^z]ve͛7Iݷ{/dxxxx@#zzhӞzP@B;c|Bpj%Pp'-SPPrzJ7<@yzng\rɀ~LJ>r?裏'|+/n?A.6o|M~_~Y+9|Ç~ȟç~ x]₵2/!Qqc}Jڄ܂l?/7zd#'!4 ug[ P޴ Æ ߩS'/رc:lذnxO}yWD"'|e˖͛w .ի~W]uUFFĉρ;~iӦ}~_wu= )zh=߸%0t`ol{_4|7%s gP=Y&H/쯴H7կ~zo~7BE]Կ[޽uk׮4 /5jy[nxO[n=s_z%sػwoӦM7uԂzx;UmO ~C }[^B ?qߘ(<@.P(Y4{+x|[7nܘ1c۷?#'U9І>w_47vv: v"w-p(cqJFeCY+9i;4h_L_җ?(B?^)_ys 28ywUW!'y"4(<{c_1wwB`A[UnwY_Oň1:I܃a+pK{cxʊ/?OyO=njï|+3gtmݖǟ><<4WS|"V9zlK4Z{0p}ƿ5><=>{w9tЗ'4ߥK^z曯j뮻$nݺ=?0?tЁG"^;Ð!CSvؑyȑϕ(2ph xxhzGk}V)cBs}R#v@5H哎& Sv 7<@y=s9ڵE^SSs%nݚ/"}ѣ۷o۶1c>t;vȿjС6ЧO&M̛76nܘß\ "zp? ۔eimj|&>cꝸh*M+/ͻ3Zig믿|?O|?~}>wyg. CKw!,KRlWC |jdpgP6-wm B{*l4z Ts^mۆLZzߝ]cw8.'dB@`{nW=0TW= i0tMžDŭdCs<yS]xBDF$÷=X$jD۶'Oqz=~̷w7Nx^W+ /mg6C .t{_js~x< @^ TgZO̳pq=tʸxo|>"4N|R_T\cmFB%{IP?7<HDvm-`kRί3s\%7 zc4r9(+ ؏ M큞  MRh`L fb䈡 A/YJkϢ@xq 7BSH*/|wc:P!4g+=h _?x-݌/ FJ_h:\;^/c$+(}TAdMZR E_W{\/'= }g_ 8})zh[kFlT{ TJ8vپ$  >XwO rˁc ?Hpɞ=;}0F6?wxNt$߫)(+ܻ_Kx<<<< =<@BwJ|];D:q5g߂<}H}'rXAʈYp8[9 42o6<EBujvGg}.Ѵ`t;[E0D^h>n|SRy*Яhxk:pteq5y_7@^3 lZ2 o6<GOʾSO+[1>2wo}~ w3 ApVOW ԎG Zao6<j4`F d~u{zVah]hN`[yVO{ДEcBke=xxh{RZ=2ij=m `],&  ;m &2o6<0zyT.@Ow5dzkF}Et9U3&|wK#fs%J(FDngDԊĽ.Ǜ l{zYr&zv% Fsߵƀy]-z2࿇6q sS/KfxԦꡝsqT@Q ]9¯#OifQro[ǿk7ҀS|B! q63w`wCe؟^E}PDW=@'!u1sGJl /+OL`|m;@hӾu1Vqz.{Pow#Rρ_Z[sTӺ]!gqOK6D2?3(^7OB<<<:~8fВ_sW #W}*zs|~D=@GyAN .2 "_KH<<<$΢T{cB y(p+mF>@YXYYՊ[\@U"5Vk)k~-<@RLjvTl:j2>#;=^Ev;{!l?WQ G`t4 r^c YUn -vKÀ;ϱ33үvB|m D=#tUHݍ4ʟkpd0υ}b=0$7;=k߃_|gn*q1 x<I{||ʤ3s@\h{@N ~=W9~%@@/<&?x@wSC@~bF@Y:"Wx>xxH1)`ke7.ǿv4P^g(\ڞ<@wIBB^cx`8l0&Mط ]ʷ݅f[&щ+u{.C4`ZGm/DP֧@` hi/̿ !Ɩ޽E><$EӠOѣWAKq ]B7z0pyG[)TKH%aD-!G-~{J'c)4-M4ٿw<<$]3vY=5؜_#z-/(+ʓT ܟw) zF˗4y&ʨ0 < PZz}0)zhc)/jg(B ~}@hy@ݝM~4韺^w g@<$o p7Yy3/47϶/! _%IP8Sz7fLpG:yw鯾hBxq]uYqԹIC^OtsB_ =>rPne~_ 7|<@g0/55;<|<ovxxhp=51ux/KT7W)M"Cw)Mf I(c4^?@=΅n0_u@9O.Em+K ]@Pg;Q88L&?[ =]Ab=+ rGwv~TxRYxQ2k[q00+>qC^"xnrm kJ¿ȷ? ?+ًRx<Mu.<<t{)q,H7ޓrۤ^f(z3q_׻ؐ=6!C4JH؋xi^N7/%+;ܙ;;8ؾܧ=^xSk WܶA0C[aPb2<xxx@ykm>yƂPjj82Y- 0~ U4<<< x?e ҹ-\[ka@ȺڞƟH.m?4h+w0K/8_EK҉70^VT~U]NM'BWp c^;zmi AGvҿS!̃U<<< 8@Wz;㧔Ƙ}c'|}ۅ~70u I4-7"-=Qv~hjsڞw7\pKpTt]zTDw<@B-Rwz_E8<@q@b~e_h6` (H$?:efIVF*TQF3$_E8<<<љИʣ Dk0?t-Ͼ[,C/$TtM"w| t-td ?KkH'6B?kъ.mwƴ1:P3{  >`Ut <<< <@#_dܹݹ(o9OGݹ#U<<xxx@:ÔiUghѪ& y㰼~1=35<y?<t85K@ 8:4OK@%A7Nti|GzٱbO-LBEv= t'3Жh7~ޑQXo*z<<< iϋ QJ%MRݑ"mlUe,L+JHh;QY#|io {sP6";L(gB?:{1<xxx@˴+R Dҝ>inkwo p_8.{RhtcAN@I0=z{\K.ҿpدH?>z@S<q >.[6fVxrcO.' H7SKr/}-~qq=b9oKpC+ 1P<ߏc]g!xNcxirO8n+p<=Oi$$h\`{&sGO,<'^J(l->=/cxi70^kVjmvw\Md:pѡ%W@1Oa"ppYZXk xMJ{_-ucr;4^OS<@By.Hůjm0~%{9AQT&ta+jgBLa;,rzx8uoh ptڐz"tb@ăĶ4nb Ls<+u1<4?|wnMsh>vNh4HtRav]}啿ڵյ1<4(t>%^+wkVAx(D~Ж_=%Cy5:؂xxx@yT2z-_/0YOw+ݛ %{C.bZCC@-kqzr!/V+ֱ~xxx@:);+KzkvOݧ76  '~]"B_e܀rl@TO.#>sE{ <<< B { Guv)\iwT0@GL@0'C7%3ӑ,P((/,@|=/t #Bп_Yۧ:q^Փ )/(Hxji=U|`Pg Xf= 8! D-l?ݮ`>|tbcAzr~!<@ JU x1ۀ/~i U8 n@z&*@v,;)/,[UW4S@o-5蕾l9wd|}#(/GHc$@\8ydL+WTT@4ȣ\7xxxpI?g7utѺN.%ChˁͿq鞱WSXX=~>:=@=8[N`/<@M@$0|=% 8<? CΆ~7=[bxڍ^y}ݼ?8=ICc;D8~:v:< :MXi:сKC~ (h)s0. *CžxIv-m~pH޶HlLS0- { 2O~6˸.7pælycM[6&qs[l[n1Җo5uaٻO;ĝw޹wdޑFl?iOǮPKq@=ho<PY\y"FPLH{h`tpH^e}8@%LLWfDf#n< Gfgf6? Hwކ!ˏ._v9yRW1CZHG&tXNIGַ.p|J?`J9"cU|-"੮]=z8'{+6`'cǦ@:z$<8hW@q{oqn\[?-,h9d1v` <x;cmWC`vF=@t. |P) xJ _ {=xx҉?@ $M`4 M=T{}@ 76j*@b.C`5=@! %[oQjG $GՖl(9"*8p4P&@%ؤI h@ O'[ {Iyt<<$74% =A L~]wG<YcˣY 0h u롋5,%`O0xxvWs @*@r>G&t@ %@IralS@!TU9qy9@x9+d|P1=@Ǵ!x@B( xV: h@z6P7 ~lvb4`Sdp ͌H`kl:<ShΡ[4 #ssG.GLP `׭ VB_'{cG!1@*sKgxO@*@ <&ॕ|%v8@4@W HkLxO|YlTl~4k ?iF`ݺu6P?I]y.@G[nlsk:GldDm_My>5 JuN4 ^W_~&y8A OOf*[KFҎ5x9!P k/cfL~Mf֍o*&ju%  pY6y<^WZ< l@/=<}&dx xxNmdl c^P!8rK D= nK BV~믿H*`۠-z[wmΡ)Vr)-Pz>1'~erK #P3y# (PPV@9(@xX>@IU*~p{ u\B<<<8x2e%Ph<@@>" ҄<n:{N7n_80K l>h>?ښ$aKC`6{Fdh47Pb"@e.@Y>~.  (G'iŢ#{m_bg[Ռـ_1?ހPbx S  7pyYsžfu֍"淘OBҒV(=g#st ۉ@y4@xT"u'y2R@M'?O lyEMIn1Ō-elE`7"6):"c/1Ypnj}{_{?3';?<`5! w[> 9gc[ al&cd Ʀ16 F06=X20c2v?c{cw cMcWƮf워]7t^7_lE;b c=cmkX+ƚ3Xc1%IvA2V9С}MRT:pk%< yx"'pψ~rF,L <N tøղX17Pȣ|(/#P0\Dym {M.x<  X؀Aݽ2y(؀aIM :0)0 ŁU/3v)c_4/:nd`،{ތ \Á@Ɔ>dDFd cOb^{Aܿ<?ِ-Rh̎DF"#Hdi$<YDF"eH2U$H7q(@xy4@ Hns |[ne;s뭷 @@FodQm?E~1@9/@{k:MX i(<hb@(?1 xydp}ckKaϜ|j ^]ė%ӧEK@t~ @1p${ (*Px49:%Ӫ γ;w۹Νvsɒe%%+JJV))^[\TVT`c>}]4+_{{0i4awopׂ}9xpbjG^ ASA`iuڴ4 9wߺ)MblpY k0I`(5 Fv :2Xc0P2օ2y 4;c?`?qxc7 3v'cwQ9c0c``j0c glcc_=(b(5U\E3;ؑ5]xc\plj:>]=IvWcH"}gll 1sf VsۂʀyΝC[ $@\;r9y}ںDC|5yk;D- 31_b\JNq.dZmGP|g#AcW~ 8 mC`qb7P^(KF*V** sI}(*P_(O)<>hoJ[g$l 9ч<`zdRB@PV{jf (m 5 PFd [@@95c;@8<>'(@,,>'@ <>Pz' JZX :]M`><xxxp@`QCY0H21 PB= <uP3e4@]ò/!}O=#{# ~ W[ρ1C"@ w'jD8@ujy(@ <>ȡ8BTT x=rx< Wբm*fxtn})ddlG|Hg1x-@%*$ @s@4x UWխk KlM"0z=xt~J 3;؀>@o PI)FB(l <:& U >!-dYڊvG=R3 o  < Hؤ~}@Pb ?{_g6l@6`Sz3<@z$K@9gn\ 4sрhEŲ ^7{}r{mT:P Tqo`]DBP2%@%%5k1@<mRT< Trjfxt~EiYJ?Ѭ-$9*h"`Cg[kX6Y<O,>*{]fmZhщՁeeF \p=*ePѽu7y h=t{G=\@dHs"xm <M{⩕L-@0zΏU Ng e?4p"Ix4emxQH(`ClY}H. EՁ r%{ T@G'v[HP01 (RQ4B}(x%x<_M-',g3Dǖ(s6Znےh;jH(<e'$,TΏ/.`{ye  ).^*YT~ p0D@t Dθւls@{X@JPV_upL{Z ED~t :<ʏ'({LʈdZ= vބ6dpn h4@U?(g\`VYy_G@$@! o-/@ {x=-_+y%'PQ xR6PDP@htC6ǧ(VY2y_LǪއ6T_Jg5dy#mvǚ,;ь*6@@ ik/<AQr?DNqb~ \ } W$4P TKL↔lY b@bFƌ37ب x4s,;XNܽFh7ze4!ptc`uKip:MXǏ =(,hJEh"tjbGd0~#=@'Zxٯr-1=JJ/`Fƌ 27T Կ<Ѭ-ZD~҅YgD/srT/6xRA>@UV@ 0(8x| pBtsrKy]y3d1Tm% %?- PV* _f6 E07k.?7tӼf\H 4z/`6m/{G[82F vԊvW6`%- = j PlD4$^z^nPQTA{<yvz7~p  5/n@Z" 6`&l2sVYMEnU=l܂VnBD*]تtѢVh=tq@ `Vܵ?RGp*<N ĊzP (V)O9'+}Uܘ' @lQ<@Gf6y(`K0e`fUu`a˅;Qڊ<?[/5d@r>+ՁǬ=@hHฎ"'P^(T(/=@yA7- </Z@\@x+<4. 0#2# 6>dc@(`n\o>Z ^  zкÖh3|A39,YOe@sb4:[yk@@x}`;@9s}`XC< sG({i@z=抜@` {%KYrwe, #svWTۡղ8$ =:ё Qm(@xՓ Qr'S@(E <<< = * @a6H pˏмV~nn{X6y bKs;oThDh4N~VS?46om=)P<2ț@l4B@ F9=3x_@^;#̌p] ~m\XB Ch=lq%H3b)Xl 72W sI08uఴ4Pȟ.bM*8@*ԕA?zb`<xxx@{}X/~ 26Mo1_ Z.G@e 8ycW ~[:7:E%@' G (&ȋfex_xq<e@̈X=@Fu&o*Zʀn)k`T48٠yh69e3dZyŭр X6۴]h;j=@x\HPNs?Y&LX8y'9ES*J@ɴ*~j|Lqzx_m': AHsMGD%@lԜ(sZ e `@UU:Za5?=Ư Q`(TNw ד0 PWxbA(nψ{g(i{`d=ڜ͛|x Cb4 {bj&gҜG nVlRs>@䍯_p2@r?@ P.!ES*р8P'zb@8Jp?W\HW8@({7GΒ2y #@`W {Xv%#<.'P @iouǯ wS'Ci.@ CT*xj%??O,*=@V`L <<< ]9@ s  Ld-(-y44_YB~ZYتtv m} @t޽M(}mGXv/v84> vZ+<@ ќ@cTGTO.GRD@@*7=,g6<<4ͧODFfs7ox1l56@*ŐD롋9خaٱMKF =qo / =5yIx嗕=@ds>e4}eszaa*pէWd ՁN9srK!-P3aÖ{xmӽ{e9rF,`7pߨwC*U6иEW[>D=@ &(^ = ൿ<#GC nw:=P@Jy=rH'tI4iH4'idfn248O6 幀j@h3n"`iRpEXvŊv+V[iZ w&`忴,LPW si(F, H,qz<<0PxfXy- @Fx&1@!Ixe.t T'82G\6@ b(KGx YP'=@ɴ0z_/`spR&@\N %hM- / 60\!@y4@Z/*rGFuDU( :0nuqkh(𸎇   {6@5>T@V9=]NG8FGj>gFƌ3ʀYMfџ6 h*<@֣sfYl\xC@1Ъt <  PV8<@]%F~h8@5牽z>u@~zkP>08 bMQXUX$"}^<<r+ -4x sieE< s󣙴7P ~-,lYZPSHaKՁր#r}mGFGl Paj1@T,u  %"x /(z*}rJH&+)U=p u\]4fDft@t4 r>@`u&~ d K`^y`A@26BKՁX;%7GGxcV` 6tP"diN!ptb>861_ Q!0e=u(T#$PUR9PvP<NAٕh@s$ f(`c@D9[6#0y6E vfE^8{s`}t$ %'і7OQDN`҅J]k/^{ @ 7w_۶ѽ=@ ^wFtND` M?6@sPQT!j⩕4[P2O 9aRH58<< -=w_l 8#R8 frʀՁf<@A}Hz뭭JU$@롋!@×9#=- HTiO]P@XD@tq5\m  F4#t@'SQT!{y㾀0^RT 9}b/p= >*D3jٙC`n\lB  77pI]?@9#rGF=~Qj+ ƴ# fVs'֥TP=@@PH> c\kࢰכc_<@#xeO(*@ 8P2(+j 8uh7Px;rh@x`tU@]>h>y ȋ." {V(*:~|J2Bt$@UI}3@IɒXH&"xxh401=0|辀q`fF\ܬYΝlnfV9U롋-rY" 3bE@x  Eڼ#FzGxIS>@AAh_@EQω*l@eIeʹ WXf}B<<488 @@~ h,6 Cxm nQ pGi HQK("@9# T@]T`J?H8nxD?LJTA2z =QY\Ih@cUUC,{VxSX8@ހN@ yo6P@!{jXتz?@hw(#40ƯU<ԣ)'%`ry,$ P>& P2<˩ Tx5!X( c>~giL 6gemSͶ6o[n7KfC Vr9f6(smGEsF.=0/Ʈt8ďՁ@l (\qfjqVTyYylL@L3hi`$A6ː#($pNɚ#\@A nmpo16.!sF@Pd V>6𸎴7P}b.@Gt "<=@~uJ<@6fr,yGFдlRs2l=@A b@BVGd0$zŐ7@ ,>=AT`=`Zeɴ]00: [r@dsp<ӿM%`L70k\'h %v mkXk{`E~ǭՁm.@\V+T5 2bSxJҞOOPć9h_4xhD@ y-@~h.@3e4@ƴ<:JZ{Gy^ۓ؎{-ıl {\$DEEJB 8Tы Hlkkwf/ͷ~={fyޢ*w\ʫA!s9SUq(p.I)I2zɢ䡀-xǚ~5x~;XՁV e 7@ ~L= mfJ 8)`NH]B\{2<x#7x[t_WZ (*Aw9{C ` R зT>}: Y^i 82L"D}:°/k_yhϋ1 {h: @-@=ŵ#mxf5x<h@ =w:U(5QK7_pIN`preXuXuuxr]9ۢs7 @M8Jv&8ąxܼۜ+yWoN`SRVPxDѻ =@x<<<`s`y^{e`:p_Qwf pVPBVTRV*@ sgr\-4m[̶+ /)iGp?@R 枒$ɥ[St. x7P^SQ#(9h~wqiQϞ sz3 جTN kR+TcDIZx<<<`xLUs`^\3|.#ph?yO^\q43l ZVڸ:p; έg΂8@ *P$Ձ奁s[qxe&A=<3<<<`x 4/0yrwY!ZNߢ@6n/ (S= p&'Jv+)q\@|7v&ܙP?She@^({R.ex9{*x<Qr~/%/a߆~s `YY) xY<>*\2hmFH% /l:W/{ 7tN$4(/ea=W:n!]TF@snv8V8\ LN`Y8>Dy^_t0^ P<iu`riv%ڕZRZDـ-:w4`ncK@8*pʔ)l˶TU F-| dWKj@q/lJ(rS ;<=/@o@^ {kRSj+@Zx%`ofr[.:~7X= {cCL=@uX5 _Us̮s 5b7:=@Z8, 9G[-)-FpaMݩ]gϽ>i<xxxh( T0zߌ @`&8$@:0X_H@6*T 0U'<@^$@E\@gA]-;[=~YF@i%;M=rB\{%!{G p8<<<`48=^Ҽ<_8~6-VlUՁ={6{ rsEk\Z?y{#{w\)r3@9`ϸ=xp{PQ$PFe'@zQu, dp43Xp[b+yղ a 8)Us_Ν-&A[k<xWHv l%xzJ<kZp?@zC[E@pdYeAA*}ӧO? 9/xYhN Xyy<4 x%J.IW&h4tu;x_'< x\ 05/Vg2Qɕa|%"WDYym. tzV{}A>ʼnJT`RIsRisOi(jؕ @aM G*VpKg1[;:P(<<`a&YA_W>Xys6tK7V Y^ 0(6V*y.-7J 0465nNi_({р$fɥZJ\X p3yՁI[:P(<<`3N?}k=p,@~ ^phߢZ-ިlp  8O &P^C@SxA{nt{^4{gB`#{Ez;NfVp8s3Rf pqm/~( 0 Op#pDʼˌ/@ =@ި@#@y.@n h-=@gAЧ`Tn{(ܷc0t[t\B< a4 z M:#bc>{Eaa+рy. "= sF 8[w0~-ysE d6: txi 4USwCm<z3B<6(wty%IfP]/[8%"TWPBWl se *۹5Lv䙜޽ZfyeyXM )rp?wv'v$佁5@d('(fXټ ( z7k:j0]H-F 8@q.[m ȣբë/CD+ 6_ko @QV{HءD* e.Qš 4Hs{`z P(< p=h`@z_ XoFyeSQs+r?S = ;JtڀލIqO.$-V;7NM6@\PoE[%\\;cc.Y)<B{a:HKP^t.Op|yh. |Uu*ȪqdF sLtmy1 1&9έqgE9H(rgD絷 @ eMK^x̱:_n8vMIeƁڬ/W͘>)/[J: <ŲKڗ-.h4`(@\&MWj[͘1*J龀N ?*\gϮ;@&7P?@G~ REQB`\@RR/ Y @ HYY@l=@rW0=~W2喛 Llǩo5))13-w˟;Ac X,ؗE+<t-t<ȏ=M69*++C*=\o Qm9QmѦ9ۙk5M M}zfd T<)v7g_Sp}}u5/{y֊ݻ%mo;1qeK;r̩ʝL:%))z?# .Ļ'xmG܃xOh?sR<+s?Q(xxX'GyuKl%{y.TTR>@*N ӣgIՁJD@ET`L^:Э@_ K H(T@wX3I^PڜUWToz?;=X&` bcofq7˞'4""'čoK|-,>K뮻 Wq矉YWS)###*7.nl?e'Nx٧-߾./Ei)|sFcz<"xcxz#}֋zf`sf  ̘1C+-aբ=H(*-7=7*@\@B^Ur?3 G( kRZRxq ux?q%xı.9}g{{:u߹A<KoEVy8qBBB|GIq]_[u:𹇟nQ(xx9@p?yn x7i[k 5 27" {+N |Q9uQ9 PFD5%hy6xyn 0r>ZRZXEq|`rmfF[6/\=YKO`ޟ{2/)=|@=::*>íZ[=g 0f<C`^(.W6nH9Fp43X{U!+ye. \p =FGnUt6Z7tǚzV}27佁ɫ{Nݽ{''0dzcv#LM7Y|o+l|>xGoW7~yk).(}n?|M3 y<@sf# -'PY! Y" 27-0*>Jd` `@h_2ڦ՚ @K<ŵ<`Lp79wd@Ņs+/kcn%Kg<]8k䤤e- 'N?>'{nQ(xx72 @wm<W/dr>e mSx4-NQ9{M=@lAcgA(e 6O G`צ?IQ~g`={,<{̘>1փ;\s",,&ydks(k>du]WZ\@ *c>BISOA^'N<~TSe>O;[=g 06&n4Ψ@e^eQ~oE`5 p|yHk_ʾ  uU ؆|\@ep0\Q<{6;w@N`l 0]=ܮȴ2?%_s) s_M@"oaZԔdq޿;vM>>>?,no>z8q¬3bccē*ӭ3 b<:Q^^{*"CHв-"j{+-1cFUHUUh\{S8Etv(he{}4@qq͛;V^hKDQTx4Y kR)!P =* W@I>ٿ88ߐ P<)p h o+xiLWfLc{wq@@oeeos>/<eVQ4l [<2=Zm('0&C\@\8}o 565%4H`gĒG8VjšTbݦs৶6.>0Jz $8;OWJh4/2}ޢEY{?K6){7PlVj)NurUDfR<IQsΥ~Q@ƸqeEM E;d /TL=7ZR{p3ey_/<<<`4_,OVʵ @߯ h4=@#"k"<@TNWD)+pӜ@р@p@þwl<@"~8!!L=̫L{= _%lf 8|,3fΜք(@WNSG<ʀ E;v$sQ zJϗ&+)[(" ušTפo6zH"p. =!I@KԋʽE)2|T8Zh|[MWք׈:^Q˫M= P"BW,ziu,\~JTJ |ȺzQm9QmQѹL:cE9\|Xӗ.p8Qy~I--)-޾\m8?B pu{Wx58ŷ45FHr{(XwJܗ_Bo2|\oE~XyśB "@s4Z{ ~y_Ek $. py\@WQŽj HL,)Tme5Zx]9#tO:*.66%94*?[n^(0=@ѐ{$h8Ww@?~~Q`5W*&"rp877g ƛX`t'R8d@@\\ŵ,<@$<`,xxѩSSm'?:qЅNqqў3k+ڧ4ooj>6=w}8ygٓ;rvу3%*L @ 0`>JN:psfRrT y j"jdp:;R =hPT@@2 JؒBRW@?=@HY0!!>|׊Sq}:.6w(#>f%%%$CBBlZ?=o}wFYU9(}/Ny^v-]w]ٺOĻ'o{:P>pyN/c . }ryPKMNSMr?*"H xW@N T<6͟?)8"@ ܙ9TL )0f 00f=g,..q^Kz}cy~Lq\_[eG/Xn7NX0 9"[rUp?+**$丨Ъ[i{`ʭhzԱՁȋ1m]=hQ\@:m{ u_"@WЁϿo9u 7))gY /?e|7kġXP;=?~Y`uI!Xw(^ < 0< x\7(Q7̫L WҾ x_K92$XH_~<7PK ?+\+ .*LNT[Nyeo`G^<09@ dMT~ =[oh6Ʋg,;nYEM?>'{C=stި@&=${䤤euKvxxxx9xV2{QKh] J`UgVR͘1%x4t.@s̑=@[n4 h%@G^ o4FZ{ ~H*==\y&3<`{qַv"##_믿ıC䓏_Z=;rP|{)/L_\8SOF>05/`B+\3+о㡡ZW@h @_ `DDn[4 yM46̏U<!7P3 GLK}7@<@x0=8GEE>SLj3bcc wx>㓒5*=g{##"ěއyWh{[Hʕ~9"=&MKDif{sa{OeEFjY[Y7{l=@+bHҏ4PieV ~f(*&<ic7tgL??w;@sm~~~Ug~=:O?_~FF\@Qw0m\  (r) K _BVPD/ G8"@T2U+p]PʩU]pN`l~[:8`zJ*@QB^@  p{Wrs>})˯s1< 0"ywe`(*@4pp{me-"న QG3=UUˣ('Pfh( lAy}z$Q2 YPB {|SXxJ3:<`,{}d)*~efmu%(xxb<@:]ɛd0  G:u@@nW+VV@8x^ / x5 I`GD@ ؒڲ;ud<&3.<`,{F!2yyU|Fpxi {QGM>2R ,WQ9rEoS<@CL] *NPx:<J%ʸ/@ ޖ 0`WcF< 8< ,U<c>?ݛd+~-":"ȹ/`!W9J?SYNgGΎ$0^~*!#?3?VƟ+ݝ ;DQ3Hק<}H`DN G03|9+@0l 0 PZo@8<O<@/@39QJKzl/rK@ dВ`w~jrW 5#0L<5LHJ3{ VA@p43(Ձ"DDvmdv]]d9bb:DQZH`g~lgAN-#@(;[o GQr>HFwn|c3P *=%.xxO4=1#0L|{<@{:uF 0zy.@#BWl ]N wLv䙜HQՁ#?P9v\@@+4xn)Kqx{!K( i> txKpN |LZ*ĊЙ3gX&Z 9'< huN̕pfNJ\L=@wq(O<cC+l|[ICd@N/%s]t43hadh(-'-7 #l<*N3q 9=({/IN\ߑ<@5<uuu{;g?OGp\\r8tЗ x[ (.=:P@RGӧnrDI=<5$@l~#yq/lJ(j]$J3%]P_ X$Wxs}wBCCok'zxxj!~@N ` x!S ?~=$tu {H_'V|DdiO+<VƑ8-6E ~m(@T=z*ίN|.xxq0F<_W̌ ]F;Oq$(xF({Yt{VJ?Ձ}Ah4Sr>cT`mDّttpN F8 py6{W T03p f~_n/]x@(Cc/Nv=V }=MΖQH* 0'=7ZTyN@v }4KwQ)\)fp pxow}'_*s?}mm5\{@ \ujޝly p0"_9L6V<@ubE(y@ = yUhsU0S]+?WO@ P"x.@ՁhIi㲀xfw}yKfZ0<ŋv[DDDhhw_7nTh|{=xe.t_EZy oHy(HW{= wS0GG:m^~ L*iJSx.@3<q@9_0=o.r0'2V&ҽxe~)"@X3Օt(@@\1*tvٚ~<4PK`;\\@ai (9|A<_3p~`< ~8 B!}t%z}@V@<،c`NZdP6 {"(0v=E`0yK>k 5xr`h=wzq.BPh(@ 4/H9wo{Kyr8@V(xL0<<rSub P<>ɓyo yQh@t.$ ="N:)x'UՁ[L D= r{R$LL=$.Idཁ~dxg{`%D< 0l>p@ؗMU] p`XάdDo?Ua\Ύ={6KUnt.J&!{\9' 9=@= TT(P0|@cD@ "?Z({S@F Uնhie@F`U> pI$0zZ xg@0}< 90|4|!O<48"`z\pxih9Hs"]x\ 1`;PD#xey*Ez-|O@<@!'0r<?!CVPU/KV@ V@}ʀ3gt@!uuz%k.@rD@cl#EsZƙz=xp=aqhC&=+W= ¸2@TV~TWw ᫪g&R<%1ð/@ 8WpΕ8$s8`8Op x!/)7PSIQJ?(j8*\<I9Ӝ@pN e.`gNQf\Ȉn`> zY? (p1ϹL_pT/<+fY dp {@w@sbb:feui>=P]R8 рڴ߱įxxF맹o0^ies`7<P3@*Qr>INIf J*<l psW6@`0z,p؅_!< 6i+`:9%@4@yu3f̐WL j @+^u1W5wxo`HsQ] 9\:%=@mD ܢ{,<@~ 0 =~x ˜j%m @%@^8uM6lfpĥ9jyu { Th4@zD@,vǒ¦sE9ƽy 䑇f P<Q X!.?[ʀ^hZyjy4@PQUd7s@sΕE@F \XBmr=]xxFX2 Omr>Bܻ\J?M<`BWl@$NiN he-f[C {; be:(^=1"=]䥁26m"W:YpK\Ch 0 @x{Fs=q_excN('g)~F8;` ȫ9*PTo3Z]*`sf+`zd湀. ({tL=_Xy$)MfP2dQ'^${OG][{{Ӽ8#Ձ8*P `@{9Ȳ ^(8"FrEn(*T5n H$`_N+o<<<`z xO/~u {cNqe1{3+#9N @ :sՁ dmt.L=@wIROIRPx'Xxxx(5Ћ{xY\เ#fǖ=L9'TV@ӹz^H &An {feoX$WTP6~tM?930+UF@e Ky.@ 49`( 4p4ӹ:Pi?" ~jh"z=38"=7ZP<uOՁ({#cCz>ah"TV)dGhI pF:cpPT<{e. x;p$@m=08~= x<y=p `// @@ǨsyP>@>=% 7=1C=@WQ@O~fT8^ԇӝ6 |4&Mߺa6v 0IstJfP3{  =@-:GKk_@ T<."ej(S`/<HO^?(a+hR3@<}mxxxhcpxxCr?>Dez%PV5[m=! W8lpz}.Eȏȏ (eoS7|Pja3 \pn<Fxwp P2# `G{\ Mlpp(KK*%Q@=*0=٧E͙3'2.*+$PnϋiB:EP|l0UUTK>_4^VL=i =7[p ~Fls?t9?T@TɌzܻ|B2eN0i/ =Qi{`Jh70̹/({3ّ̙#{y_{6`ԩ\7ʠ LIv}d<<<`{]h tyJ(*D |#Q?ԡ~I&=@g>Ȳ yey~s@sH}T}[nt@|^0{.6Hs7_վxb[<ƣCD:0@  {I&flrҁt.@='Vs'm=(W>|jm?N/~ j\[< ;<<<`qpx A#(C&M Σ6xGetZҗ%輼|s" 48XF9:<@MDMmD+"{n rsȋRt _x/EVYz>PTiZSw*>m!\ u7<@s 4iAg?bśD=#Yd;#By.͹:0=#{[n O1~9'=7(x|Ih6Zx0ڸV?ЍpcPd @@@tfy5.+s}@ye- <  {Rb54$qZ4 4ik*0@*E!ni&^ַ <m$P0XGǃ>JP@bpUfzG\p?@`xdieAG "|*|gD,xh$o֏rlhnYW)68Gf0y8 ,|@}u s}zA؜ŏ=PKyqd *s u&'7@y$L=@{)\\x(@ط⼟ 0=xWL=[upPGqTA7Pkg~<;xOFhZz=O=͋zJ'z~&]$@g}vqz?x~^ӹ@o/p4Y'6@9 Tl<΋;?яov`3. d%d2zW8@ %р*N":_#mcq޿<<<`4{xR?#T{iJ8TOpJע>u52~gy|Al8qxBlx;)')G~}4 U\0F*`EK>8?0=xЍVnDѻx.@`5|jD] </~7V>+ $DdTU6oSy xpB t ǃnL+.d |5~:7Rp\(w5ތ)" ywddTRS+e N',W+`PP~;lv7?;7[+` ?Oq7z+V1A ȷ>_h uEJwE"ʇtV?\?z$o͵']T"7y\}ǿ9_~p;<#xxxչakl;Lr+TuE"hIxk Vy.zύA0 )ퟀs ܗ/8NK\=_ҍ%(^BnuTC. p~?V_<t1RlP3߯߯2آmr?d < !fh7?HsWz3)X~E^ߵyK؈ 㽩I k_)pT^+u7KK@P0LsGJ~W؜2(< p?/>{+H`0_\߯ݿ;$`-t?BpPV_*uɤi@ <7 ʳUL{3R?@IgWm0B=5%~xGǥچȠbT2.0vX6>=lql?no4Fxu+9uCm'&NlɢcG?Mu+Oj~?kޟlؽˋ]|~3>$v:Һ_~gմW_om gC|?ze_:'`ooVwhum>WOfP6NnK \G&6wG{|vZ6@]7nkh;(ۧwSO=vB<\+q.Yl4@X>gm'=_}zhᄑ?e'iP1Χ^gZȯz^9eө|o..-d&2`(0v=He.^aKBBBV,_" 0=߮=_a||fX >ϓA[ח eХg8ݿe@)/}u?:D<<ʜve>'}E黷~};: i<Mf3?0&\ XM[BLIvAdYe6Mc:1+)$EDdE,Bv:]N˭}Z?UBn? |&dBusi>񠺇J?pO$XUyHH}zRcx?_j5dcwi-F0{ gdAe4\@|\H_бدTj0@h@<@@<B6;ySOudh=ϨB f <\MP:{(הJ֨  < 4{ִ#T8q87عJ+XC6+m4*ojNI ~&w5+˒y V,(y˕J TPxXWdösoo:SժU}T:9Ra.$G?ρW4@?xY71<ʩE"n\ay>uS<M0 6P؋ήW=@.< _yV.9cjr7vCܾ17>3' XhM*8~U´gC7o X0of dW6V#q"Ёh:)OMyJXM:;b6[;j<<|΍l=MV p* ԩG4 ,?޾Zԛ\ȗܩYT)a5kTxjETҲ,eB.K.M%K.]i&fB a3MO7tϴYMjJbgycccʯ^^7rv Zn(3@>=H&:9>55H@xPʟb5ξ&!O3rCM~D iOGY @4}ԉ#;j&Ř3EUJ/8$Ztճ077e(nhhب˰Y4;h}ulJҙgmm+&&gM|W(xY=/(E4ۇxm4øO89r (.(R\kcuDST=詞Xo үܻQ)(q$B~r}R hONl׶5,HWQbOڵY۸%m.]Z7믾044|߰Exw{Kf/xu3yC_&v Wͮ?]]"D$;;jB:x**r;5U[G>qK,'_KC%sف7r.r@ >ۛ߾r% H  (pD^xZ/e;/1x 1@}y20-Jz _А{yNҳgʩ=D ݬJG~:0x$x$xx@aVA7''Q+W7W6\(<*gxwĂ~t*oo6x@@@! ί*eO9(=_O x@P^3(!@@3 ܾKʤK/[|@aI<_Rԯ\@W]EjgjMeHn~L,+ \R m(uzſ }^H7<1X[Ra*y  o&?^/_D|*WT7uW(]ZtyKBx$x$xx34 >*J?ndeycUr @@'ՔQHoyK~ rG唀J BPH=,HHHZO=|Fj[EOwy$@oX5P<@mvJܺuɓ'<`kР^zmcbbnˡM'O=zHxjjjttS^|nwޥ6/lP4lŋO5eۗ :3o<3H+tbb@\ E4lpРAvvv͛7733[d N0TR5ktuu߿?F[[ƍSիWRRRܬvIuޝnťM6*wݧO |ܹ *&M?~z3}ƄV.>~ {ۮ]7n F+B'wgsUW >P~!"?~̢`ӳ)daaA!<) HhS`~=8O>dɬ<,,RJO<9sLҥ{>T(ʢ|llŋ5| y64vXVgС7=&=Pܸ~zժU'ЫY+ʟˊ1RqU3?}xO?tO(xѢEiw׮]S8ҥK ȑ#W^555={vjjڜ9sI{\d!ϦRRR)aTŋe_4xF.],X@xx@ Zi\\1|^l׮]Rj׮i&6;t0i$!Ϧ(X+QPstGU<@bVVVaaatyUx⤤$xx~z4BWWI(@!C #QpΝGŞ_ݣG6999Ο?U8t萱R*U?$$̌*(7EuuuOMjgϞy5xb @oF^u\n0F,. ԴE:t(SLݺu˕+Kz{VL˗ =<cݾ}׵Ke-gagM ͙%jO?*="p㺂5'/P<m_=@j3ÎuL?cGhZ♓枨BX }i^y B7Vvr`_zCpfUTcݺh6SS۵mmmm3''G7l`<<<ʀ}i;1;ڃ:ٹ{v mn177>ux⅗WBBp322fΜy}\OCCC9XXXT^b OB~ cFؽ6113zĞƍsvv~yoժU߾}qk;v~*W?$ME Sa[ޙ|r~Pt6~n |@i-[UVu<i„ _tiʕpkk׮,nݺe>{ ]gTv=g1{VVmѢE;vl_| ^+^IIItEU x@Slْy?{qʔ)&MTnݬ,駟 `*8-<@=EI+=pDř׊xYΝ+TE`@=]<@<@G]xxxME/@wޫ ~.t 0-.oxx (رxx<<EK{ [O RYCzsgϜ?t[>H7N);޵kVO9w~ֵWO\~bHxxSP=3={z &^͸wιs i)/^<{M{YTΜ޾uh=:Xys7[#]- X)6Uu~)= }ѻY-Qv>pO}Ygd\?u\\H;5ps5o.f!i؞^zFB`x1[P`wTDNNcHb'('*˗ohͅrXu?v-zGѿx}3 7˯ѣzj^N浫Iwqa:`BZjB׮^INJ,t͛+V_reժUt1OMʗ/_lH\h= ="tZOΞ ;н{wwww\@PV<#0uA?밿޿o<<<<@!ϟ?sΆ y]Tx=S@wyvݺv۶ʕkؠ~lL<@c̘1 HzիW+ &sP{kn,q}E ^ dkq#f=Q[Y*P^y8<>@Fz# bcN6m6+8:֍JsecSUӻ'u_deٲb>0;v4$&&.nP <<(K玻"BnӧeK{_Ǿ)K6Ʀ(_nڵF% x{{K{|as D&&%CQMV^ccFZL)'|ւ 4xzg}F'4""mRxx <}֯lYna->`?pO#V9?W_Κ9>wYXXڹDÖ-[xT@ἥ1#)9paԮp!<˕+׵KyЦ݀?Z[[a}ҥK*T`=xo{ [O@!?Wd7r떍y0p@477g=-<~Elٲ  П<=햖I^={,YfUTGwPjִIYﹳg&O@?7o^׮]M8.88s3f8{9ڀr,X>yѱM6yV>s .] ^Z~!COx߿p oۺq} !!!h۶m۰aC~+W}}˗B[n=y$++~?_v&''=\111xÇ<uB;tT۷v1p>}\zÇ{.YWJ^z;88dggMvk%tpI(`~x?c'S[nSCB?~ljjfo?~x6llggʩdTҴiSz{HHm6hРF/B5k֬fnn>w\=@NNƍY;mܸ iĈVr\]]-[M%K4jիWaaa@eK>ȗ `lt =Eu常K^.2"p6'8z(ĝƎ6Ja8!Nax&M(^<%8|?^YYY511x`ժUIIIGG{Iǐ!CT6tR777au9rd.]=cǨOe˖eoyMxxPK.^^^Ga2eK*' lݺ5G_R|܀;8g<Tr;of 5?ŋ - wܸq9s8_d .ac $I9sL%nݺEӧO/{X}RZYfޑcǎfff 妦1cڵkx ܕwޚ_mߌ+1qe4-ca&ETѣ,0_n+nʟS5ooo:L4I;>>>--ŋB9/}Hz#Ft`}r_|ill\_8/_ wgϞ3gw1΁yE_UVw-7S Mo}W u7€;;g=qnMy.nb gv{^e}6M=eQ~+VH{bI&b>G} j׮=l0{J(qU}IIIodff& xG@tϞ=7--ף@yޣ %[A} ̳ӹ%(Wkwe\ zhy%\'J#^)Xt?1_mƝ].i :Ư4.ʎ?2BCCMLL̙Ξ7o^`` 󮮮\S&''¢?\!0TR-(";A / qH @Sf֭Ϟ=ݼyؘ{-[3،=c=pRJ!@+@xZ5j `VR[iLͬ~_Ɵ:{b?ŅOSt_%&;[Dk,ܱ)*7uVq>,Kڊoλ ѱ_ʄ\nƕ@RۡC6_RRR +VH (>>BVZH.W`B~oӦСC<PjW\L2SL8N=;wj֬9rH\ZbzO' @Pxm|Pch7 [S_z R:~3\`=>ԍJ~]rljp,ݷޚ tݵu\Nl n)K/)|F~cgّ?  nVa2cp7AqMV.8 ;<@wqڵO*_~ƍ;ߟ?NÇ |HK.Q'++ի/UV999u?~ ~@@ ,]I&QF`u[n=x`~;Shŭ{"Q߳'epŚQNA#R|e#3"j5׉Byospn]5SnK#>M⏌{{=>pql<$8eklh}|]x_VZwEzs-Zxw>PT'... *2cƌ^/+SF90\=YH91f@r 3? qkeKw0,pNRP/oq'mƄ0|TWS7r\Xv|ǭKzOOϘyҥK9sݫ ӫW/WWs PV$((.f͚Q-ʓ+_I0 ^zʅT6eLMqT-/+',|ynsjRnY{R6@dO405wOο 죢ۧd'˧WR\y%Kn޼} q\߾}6lx=Lab&Bݫ*'\="q缷bY)oJnQ`_SK|>nSm /spd& 7d# ]ŵ Ç5œ}O4eʔw|sQ.PX<dffV\yСw׵x߿͚5Yɋ @CoNܹ*7^JMMU~I庁v|'O/a!=@6z^:4n!( x-xb:UP3f?CC|ʏPY[[GEE巩ڵk -۫#=͛Y&>>^xuh/v% Xd?-[>>:u <2<@%L"D'N=zܜ&zm۶-p8%z~AYHҳgސ,!7F:|F둎lr]y?+r>=&sc].mrxS%fҦܩd.aqO-cǎFu8@Dkd ZJ;;;¾}Ιx ;۷oOHH8xtM///[_;2%JȢʕ+Y&%%ȨQF/˜.]PyVJ*Q_UT){{{j7n?,mV0~@vwO~k)k[=6.<}y6[J)rFF.ԩS>裮]ׯ_f͚O?T.ccc,ܶk`_ݝ)[ǤOD50fbȑ<<:uz?>;7/hѢ߿Ű3gΔ,O!ٹsgʰ{qqqСC owo~Wg3}`231ps. ueB`6LG/]MVJfO-Gybbb;+# R>fY:&&& xSԮp ʕ+}yn5|0KZ 9b?CevOH!.޺ukP,pnѢ.(]4,X ~Vciii+׮Y/:RuOTĮۖ`떍/gJq}xx?p~hո>8m֭0&N{Ǐl7`g'j('`OzwXD3Uz{gWƍщhbmm8BA>?+x =&&%P{ղJjժYrJ:ulO%9{/Z~QŦM\5mP3g}G^YɼOiЋn}GbiӦmݺUU### < PT)6 Bu݁2&~OV)G];oo-k6=Gvcܹq5}ߜЇ}v|V .8 0`3Ξ=A6 ` DEEO}zѢE`ٲe ݻwr~zq]v,^рuֽ84La/EF1;m/[p%cn}MaECrbS1|v:aՕ?9ba-[ИÇS>$$m۶m6lѯ_rʵoߞy Ky&M.]t]jjxM<Ų_ X/)}V9pPnoCTuS@Cc~" `<P}i}}}Մiaa20iƍ+T...,onjmIDH[3zh;Zj /uIh?f6Fu]v?,v Z6΁afͨرcUVeL23g+l4QZ5_)Y)y\FěS\'2'ӟόEX}\zÇpI(`~=tK,TǕw\r)'g{d7bռyS3O  nj@1dSWR`6ş'6jh„ lk2WO;cwAƓV-?ɓ' Z0-[&4? /9R(hE}̘1>>> -7Ś5kXB (vV2j( ۗ_~9k, \>>;^?655.0?^z :;;%$$r*0`4mڔB 4QK1Pb5kϝ;WsC*fПmƍV>#FXquuUi&:WhfaS k%؃*¢`[s+%}ܕ7$k8!=zJ_ ENNNcǎeC0 ԧ0I&VS~ϟ?ϟ?mFzVVcccMLL.^XjaRRk޽{1d.]Mx"yMxz)f6d{_=N:@잺utԁ2n  TA6nc˗-622'c<<ȷ8vaaa%P=+W(7%%^}6ۤ^Iŋ'8@߾}Ǎ'x3 di`iiigggmm]t  $4(yБYӫVbhhXB}T~]Y-[nMIx-,,jժI1G ;LJ}~ 5C UZBGRSS"aZ\~yQ sNQ.TswwS56&C&M{OKK{PNK&@.@ʖ5yfuХK@Eh80eʔ{zzRj>_%(֯ݻ;B<,d-Lߞ-7lg' ,nz<-7nBWџ̹|P=aoo2pUd¦@==sqܸqCxիnw~1!wwts5>}P~7n`,~9>*!a ~޽kjjg׿nݺ !<'saaa*U,C ر#]G <<<(* sSp] pr6[ ]2eʄR~ѢE5j`c={P ԩS۶m5.]LlllXZZW!LHH={a*U`\Åg ڔm1118 Y7p]t˟ ;vبQS.^wkbccھÇ266~:.UѾ}{^3PM4ppp߽v255}Ka_-Qƍ)z766PIff&դ_\أG-E666_5"ִJ*]v߿?e^x?R;\999p\UTaS1B @=wx PaA.J֬Y#|iaxXmҤɓ'q vy I+嫯4i+Lʊ"^cl];)oaaAfϞMe˲]v—X*UԩKn۶-gddu YO4j(_o߾lS nnno?O///V|N:1Qx1q|o SV-?<<<<М76FFF -WXO<G* J/(;گE+ 'rK.y&3gΤL #e6*ͤ-.1c`~{ES><~_!µ|":r'f*,f6}tt;za~u <6lܻwo<֭۬`W*ObxxP(0JTNعuQDĝ]~EAK.|WlL##ŋ #b%zMoaa,g #e0kʇ߂)k֬۶m|<¬~6 #d5YϦ4\~}Sٱl{/ի 0Sq\ppٳhfY`ATTfy :::i&]ȮAq ]͛7'&&/O>K­[W^}.>ҥK py\ҺpCJQuxx8Լysucǎ= .h^=_78xǏe?^z :;;%$$r*0`4mڔB 4QK1Pb5kϝ;WscllƱP;mܸ iĈVr(_Lq>M6 8q7|<<Pfرt6kL(<8qU\J.+^Wd&::ԩS%6T ܻwAϧs!SX@ؘvЁNJJ+R.Px^F {{RJuZjU qH @ ///;;;e@=:0вeKnݺӇ2U}5k6i҄LJ*wdEg%2ptttssRJsnP#tfffZXXʏLAnmmm[nҦMu L0@)#~1ҋ}{9zLCd rP|S|M:99_]$춻&ɓ{ɲ#.W⧟~7oQ |Xn*ؑyу>Q͚5){u922]vJ]M6[C]}(XgϞQʹ4V`!v2e._<ʕ+5<4yH5jZ }TAAA666 |=z4<@)k=C?}o?{Sp )R˕8 ϕ?ԩSGXɓ,JOOnK$vreE yu 4mT /.POP#ћH4HiӦiryhT^c7m֬<<!!!t֪U?4Ĭcǎ:iPs+8J lllkA)TJеkW6E?XQ;=z`k<(#VSu Fۑz裱)wY 2667,T{ΝGXCu}WS<_}]ݣoѢ0O&ٳ;v5Py={rœ G?w ѯ_? {U.޽;}:Z_z^.+o򘛛;99ۏ1B8s P666f<;t@֭[\9(@V J![0Bݎ?#S_|U:;;Sf jt_Cu}{.@d/7noߞQ:uVZES#^$/_ d@Jdꎊa1ey?ǝmmƟ'qCG?'<<Аh 6l֬Yv}C>E?A6߻ jwl EC@}wƍCxt_ag_AW o6ءHZMoṀBy^\ Ss|(q\ppg~ !gQQQz'O۴iBNN U̚5K. 8E;Ұaċ{R$q5nuoơ  ;;e˖VVV>!!!h۶m۰aC~+W}Ο 㙒ت$999xݻwӰRj``  a2mضmۆ kjj]њ5kYh 2`g M=H"..ޝEMhbiMs ׮]FMMMA^YY RRRYYYz333LUQQK;w[fϞA@׀mӦMyth"^_Ĉ_\R(P =Z+xlGp %yy\ o1LrRx&$FFFT 7nΞ=K5sM@^^^CCCIIi7nܠ!%%>-Z f1 *o̿sׅ,)a?XH =ө[' ,dP3<}:>>Jt.]pÇS~ٲe˗/葂mԃ`-7n܀m>{,ڠ'_?Թvaρ+WB5 ƣ`c}WP_~AzMfp=uꔃÒ%KBq?t.xȶ( P ݺ&b+C =$}̘14mذazzz~JJJC <33}=jjj,XOZyU\pACCCh GGGr̙33g$<==m۶EFF26 ?8III8s} /f͚չꫯ؎ayYY &h# q[Uݲ%/Y+w#;,FAt:D#%%™ܾ}[KK=~_|WUU6m Nyѣ9 \~}hĈw!|L6CUٙtR~x*wށ‚Xz|\EEmyaa!Ν8p<"~52$L!,;*ۄ2 X짫{`CgL044ǭi))\رcͣf!600066Ԍ ospp8r眗={UfJ|}}ٓ'OΘ1&6i4 RG]]Ɔ^v?L:226l m۶Q%֭#uV PLSɏeY>CmbrYmZ_׵1*lF e=,k"pH[2fffÇ$!VTT?x9s$..m H̯_L NG@_%/ZIYYٮXz!0.) mɯVkBT1ޓ_0t$qxIΉm|2IYIO< (F|6n ϳ̒Jy$M4S\ɥ`d&<"Xy pCݩ"00zITT'55T ҥK'OkW?~=?z=z>&&&SN~_=%D+r8HmZFE1먷 rLxQ~4Z>.z1Fͫb'|e˖msӦMǎ؊( #lcCOSWcdKE~MAMHe#i&_'Ϩ~5&fsYg^*_Ȩy[E|Msfd:Ϝw[B?:Z$B̄2 &ZJ#~ yaW 5@xIYjԲΉ^1 jmb jyy Ẍ́aqG5lc1v A@A@ \x_l~7b8k>}ղ\D>e%ӥv9=ލ(f]! s 4L Fލ{q{vR4MšƏ{HAzUZ).7GH ~6\rz=zޞw ϟ fff䰴0+''G)yg"QئM Q0[X~{H|Ub';'-HJ1㈭~ &vbD0A =z=zmmmY~׶ vտrz…r z>OnĖ TQ/QI `ofDZKhJ?<|_ 8zz=z>ݻwuuu[KHH7իU__ƌ_~Ӳe` =@_QV1{.*D&Yh&!|G91Wݽ<^Dx? q ;wz/͛.''Gs}ù.{n dM%=ՁE"ۉ]5ޗKu)',?A2N-oĸHzI?+4$艧{-{$-5 ?kd^М,?gTM+~)ɉ s"~-[_LMM'O 嚚~7|M8p`;vUʕw0W}=xEdנ>~7#pzXzՐiobB,Lx{uϭ(/KJHOmjj|ِeR'[;[  OKM"_,Vuu9Hxf{nj,BD/%t̝;s׋0D};טRoXu[X4AwFAr 1:Î $X5쬨;%VƮ>pZNG,!!oya&m 3&E1ݱWTns0"SwLϹfnε2Hkjw ˡ$--JRX f+*[*WS95Tܼ*).j~&<A~ϟו1cc"v^ee̗/Z5)t`񊆋#=&nzzÇ-DEyrȑ#-pf&z>3z-/SF݋Kѧv]_tP@B#N1"8.PJ[P_UUEΦ$'@N%eRȚa:*2 r 4ܜʣٴ_y4vr@b|lzbgcKII)ɉ\}H6wnj B =zw}Y SS]~RE}" SqZ5N4aЈDcFa 9ܻ6u%kkIB OՄ(+uuP "](++իWaZFFh4ښ5k6賰 bDa|]dVHE:dc;̺.AN|_0 g|gG\.z'f!Ӈ.dbχ,'T5ȯZ`VnnvL4Hs}hge8-ߥNd41 x+T݁=dɒ%mW\|`2jjj" xA=rڵA_PMBB[47&NC4 SSZDjNjGtv}:`0"^55\3hH[ͻH M++ʃ/EO:ŪINJ߇fsd=ŋ'LArrrɓ'ٵ-9sG+++ ne~`|h9~ڵ\nPJo3ֱŝ2n d.序316O%$c p '!~6֦a~+VVVzqqaļ]P_WG>P۫^wR+O ʬ~ GKqU-8/{.Nwy߿wݵ@K֖Ɛ1TS$9LyI&䠮LbɑSdի9By )),N@'Nݕ[|[KK :֭#@=@oٳg 89///;;ܹsh\ѣPOUbk1t/`<wyt݋w> 0k,qȼ?$TUU Tނ˗/)pYY0 h$ RRRM 44yA=@bhhuӁvAjy@E[կ"Jj1n41q%lc1vQ0AJJpE Pz V_ԩSO>mdd~zHzzzǏKHHN999x-~$%%9_˗/dA///F\vڵw WV\ epc4Bxj2- <Ƞ@@ٷod-ĉy-# //{{8::=z_~8N o!LĈ,>uK'9'pXQJ2ʿF'y?" >N zhZ[[ʎ7NSSwN```$9=@QQǎ0eʔׯ_Cytt#~I-@G}k;w0׻fffw* x׻wGvxHgXĒvY QDD#Ʒ {# :LfZZZsss۷kjڔ_E8\=@l<Ƞ@@h5k/ @Ѭx-uھeggo=֊\2M*Nl( %=IDZR: AD`XzdC@:xMfdddŋÇlTUTTTUUa,Dٱ8K"Jk3+'zOҏ巶:?A?cpDdϿ;N ="X@ @.CNϟ?:d>|W\gٰ'u_~%Eo~ {_Fla_% [Ȫ~%fB;lS 2c "p|H&z[[[iiieeervҤIuxy__ű+D/ AdM=@ogͰIIIueJj#:DFR mkDTga4DϿ'f?|p֭=#-ׯ_~e-ZĵBss8wʕ+o޼{Ν;!Г*-ŋmv "Z ]JAmwVle HↇۃI@5wܡCBڻ{nvuu.^x7oVPPXlA.kdd`0˹ߘٽ?;ޱc烂j3f3f̹snܸ>|xRһ]Nu`AIIɻwvx H=H|} nڹ;pz"ԅ4a,;0Ƥ⬧lq@}ѣGP%UUU tSSSLLLllׯ p\PP0ت$99@xݻwӰRj``  a2mضmۆ kjj]њ5k fMhr8ebX,AV8q"i$'R2eJ7{ܥ7=z"ƕ+W 8x";W_OFN<2 Lʼn8L(O ,V=˸WSV^Rk^4 # PWW'--dN9r&LЈ'ˡd֭P2}tXf/SC5gϞ-++{e=@ssΖ-[TTTMvѶ]ڳgзܾ}UNNN~hfΜinn+իWǏA=zɰa<=7-AVR G}.Fwx D%fȉΉ&OqI5bapD=@a*2q:tݵk␆B gΜڵk0بIZ@5H+++a: @JJ*++K@`ffFђv***t`Ν\uٳ ZA]~?3f̉'`2@@8Gt).ܹw5͛+V|gMMM0D@ _=d׼61QO҈tPK?SoMnJHOOno{n,))IB5LP٩j_SC5 -==ǏׯL[[[]@F3ԹMssutttkCtpssPoٲ.ݑZ=R`2jjje!(**dP} z &++ _[ ~.[lϞ=pXiz3/%a590xlY)bt AD\3L\XXHΦP{+'MdbbPrBO:Gn5̑d~~oqFOEEn?a FFF|IH!z_S񩣣cmm-<@E@@ ŋwe}tV)LHXLijDM6K%@#XSǯF<7Å "ܤߏb]rё  kΙ3UbޮPUU%(*##Cppx>]j8Wu=4/t{ڷl٢R^(jPWW'..ͦsrr IJJ,G<(XϏ F+ж{׮]ϧn)  deeiIIIإ^hB$VKEZ0ۭI^!P PAܸQnͰZ1zDi- ADI1ch4伐%''C4dH333@zٿKKK΂ :t\Ņ 444XiĈÇ'O(伭 ׯ_xH硝G]і-[F]]]]WWnT[СC`wz`ӦMח.]) B`ԅ@dQ{+++SZN_nxu}@@=.QWQ%rrrݰj/3r3e[.hVRfy%(-p'rp}}cBk֬inn&n__?ǖ/_xbj[|#(`0`u1 //orꖁP^+z=zyagvjf:}4z}Y4}{@v$si"c؃Ulc1vCNa:d vN4A> q+ 񑔔wA_ԩSCtV__BBBZeUwPWZy^  .\خh@}U1:IhIa"D#|'n~x;YS`A = gfeeAb'Ntp}Ȥi+P? |7}tꌔO5zH%@EEe?P&@ދ)=Ж9ӄjGٕUAt(//?|II 9# oo\h?!!Lƕ;>sPA$ECӦM#LԴdފ+Gȧz=zD ֯_Oe˼͒; TNaTOd҈j0Y'a^ՀEHy9sHJJ:t.\ ڿq455!NPTT7pc*((L2׭>ott#~I^{򥖖g}Ƨz=zDh=O?t9"mZR;-''-l9 owxO306@Аr&7z)))khUOA/{o+/z1z?6+d{e؁jq6]xOңudAt #@@4˓<<{lH/_,hnnppp ٲeʴiӎ=ڶK{۷oj GNϝ;w޽[Wvφ@A=@oK kČ#m"Ӊ0fffzrOH6B49Ο) 7nܡC]vAN^in]]L9srk׮tcc&eꕕ- hd-- >]200عs'foݺ5{lrZII͛7@ZZ=7=zH+˗k>/rŞGo+trQ[Je8&g>uMȩm J|[L& FFFT 7n<|0u qYA7o0ƍT;|pRWW7p@777?=&nz^hfETQs[[TIa!+7S,fڡA!mmύ%%%Yfxx8ّ塡S{ddd45;X ckk˿Kz`۶m+W)S:u6Dz W@4Ξ={ҥbHN]dP} z}݈#˼2{A[NXʱc.&?{&[ A\3L\X-)))Ԭĉ[&M?2?}P%=@PPF ѹbs⡄s[ϟȐ:::}z5H믿}kѢEWƌ30t†_Afy;QζROejUIʅq@ŋX,֕+W $AHayڵsiTUU Ȑ9;w^K<*91c 6VXAu|W+W|P]]K3Lr־vZ~~>u 8@@ ::t: ҳuLxޫ1,0$jqq N."ިWt:{qsܒ}q!Hz2IԘFAv,--G^p )!$C @zٿKKK΂ :t\Ņ 4448<<ājzcǎAamY۷o3gP#69L=z6:4eMQqx!z=z"FvvK{={O^Q|Wi/ۍSs %kvԐo[ b}O3ܳ{؄"QId]?e] e}6BcHD7ʰZ1zlY"HH7x///h|"|/0}t++w=)zD˗/zF988襤V6HE5bܿ%O@N\jy$v(JU0&bly ⹖; ;(aDܟN͎X`VZ`CpeTf׼VA` @g=+Vطo9nM@@ 2?Ca>|W&z^ӽlv*=hOXdu-W("ŒhTxeȵS[z"QR4(i9 J2i({ x$S(|nu}vTKv~\v6Rh.;vK0mH6`;M B{DER7xgQ[+[=z>-سxy/_jiiIKKg6A=(ahh(SSS9˨zDa@$4->,Orv-vM qgHK<(k=>/6lK !7f?H$_s/\E|;' '+l,y:rBI8;ȟy)x@ԁN|B{Fz=zC^VVVRR :r۶m;}4Mɯ>{n.RŎԒCp#*SV!ge{.%3q@/< @0d˖-'N83KTa^uj)B @@@ /@Ilgq@zOrd-g =AA2ϴx:+9<  ]=z=@/8~%f\P \Vyd$  ” "@3'" kWQ95  aׯ_8! b&tF+ ҫYq@Nl6Ç[n{N$kz}}}--Ecaaת&޼ysݝ;wBUUU!@@ ,[ ~{#vbh&0)b͝;wС޽]]]/<))7Dxt  $KEXH`X:~̇A8|ؾ}ѣKJUUU tSSSLLLllׯ p\PnΔV 1޽񋉁R@&ٶKm۶mذ!??W4->>*𐕕3f BĪU&N(t3cGA lg'31(Sb3:v3 MJ1,^NZZʊt:}ȑ'O0aAC֭[d鰸+jkk_٩jϞ=˗/ %$$vl٢2mڴGҞ={EGGۭurrsݻw/ի\ k@@fe# 0q'[u'lNj!y/%?S@&>nܸCv4}p]]]Ha̙3_v 555A^YY RRRYYYz333LUQQK;w[fϞMN[[[+))yW@A.4hPg y==zH7OѰ|"xQq@=CI^^^eęwגA OՄȈjA\\`ƍ<ٳguttn޼khh@>`7nPI]]`?TSS#" k>sΡ@@AHj7H_ Y72vS΍%%%Yfxx8ّ塡S{ddd45{ ckk˿Kz`۶m+W)S:u BPPgׯ_KHHt)MyovŊʡ@@z ر <*<Uq@sn&s1DPhjjr͠333raojVpp I&ԲP%=RRR>>>4-;;,=zO?YFRR2??6DWx###8111͡@@z@c5Ӫ0H!fJgԼP  ɋ/X+W8::5L477]vΜ9v=*@WWW2gWvR+ //#Gp68f̘aÆ͟?*qqq%G߉=@tt|RB8z7 k֬yrǛ7o^p!|^'.] >'N~Eu`9u_dɒ+Vp_V{U@ =zùZlҧ8E/8M/8 L!5hB:G藜4dH333@zf---: ,ӥVs.\lM{{#F(**>|'Od )9LL8ܹsd!P^^kt!VˍUTT 666;vBwww=z4A!WAA۷oCεa7Z`&;|x=_ GwbuOyE3ʭP  55%dEEEX;766B^SSӉ]A 9:pz\>} ӫV,{ٲe䴯/FU9tлw吏?m%s]r%gԶٳ7nH{ ())]~sY>FzȇyR1Hd qmZA t8 ѹR?-֭9s&Y>b8 #$%%+_GVUU%3i WPP8uBnooOuk>ɉ믿~0kUʼx=_ C7I_G*L`4= q+t\[NNNƏ8h4___ɓ'g̘ѣCzQQQ"Hccc:m_~%\˼yZ w8p<Ȫ58 }۴2138\<E`ԩ@Boii FFFP=|p+++|+))Si=__~e„ _~={?x1pe,Iկ0zDhǎϘ1R.\x1iR0|1z==z[-l~`u"vڃbz͒J1"y' kzL1@|.˗SNx_@e'y/n&'3@@@qrr!PQQzK[[{?K渧`c'3L99U.vie?`<Ǜ&  諸?~^ʢc*Tb54t 55U?`JJ nU 7f;E/cKPN7JO :#U6/fVR߃ <ߚ5kcK$LNllqDx߿hc—KAA@EEU;zmt:CZbmgHUmcV`+&x'L.vԽ8xє~t w(P2>;1&YYPۘ]*3in綾mgHE^+ͯ>U>fIyP"2YyE;;;.hX WFQ|ɟş,ZQG)̼n^Xpapp_ =z$z|@ts΅y^zN!Ŭ& 2"VXI-?㊟W0qyqb@)1cS_0_?qĘw 9{>(k4xy̙3',,L]zB=衤ĵZ?όq_6a҅€šm=:LӤXzV ^\2+-@n@=zD,^x۷o/6oU;񹼼b̙䴎GMB/É' )@FF‚z_@XI-$Ԑt+K{Cd&͔YALl8?=EPiQ>4LuĈcڠPAy8η8rg+&4&>L|ɏrddd9K>?HN䨒f ҘѸ)QFZF~%KHI+O6tSfBet(RՐSDBtI^sBUu1i@ cDVVv`=V(Cne(d***󩬦۔DII .^SRRma 4>gv;&`7]WPhOl a-V&sq*Fw';kߴ!h-%%DƈKjF$k](aJ$k"H1c~~0wyws1Խ}ޯ뾞<<Ǟ12GhYN{_C_ ]t2BP5v -`ʠCa:_ԩ |PqvISTz3'`ߐ2>2' }֜633S{o%|P>b [?~̎:͚5ٿ?e;֦__e˖QNpp0HmڴNA}%ooo(֪UKXR@YekR~D|o!>>Ծ}ʜmۖV)| WBBʕ+A?lj7w^bRR]v),ө-29)}Krr;k\SzcdXtk߳g:,Y‰ 4555--M*NBߪ?buޏ .\~>;o< ,x7W_TԖ;}5 ӟ15 3| /ZH9&&FݾpoLק-n^u!VNF*~\ϧ={˗7|:mmm5?oֿx[nSLQx ϟ?_cҤI\fĈ\c ] B޽-,,ӛ;w.%>(qƍǏs"33_XZZ=D2>E-ܹ3m}k׮QwJ3/_Lׯ"ߘ& `޼y>>|ЁJ22:uʮ|}eh4fm:'Nի7cƌ~QH>}|-| mƓm(ظq#|>|7+DyJ0`۫Sn߾-_ pu]]bDD\]]8hذڵk??]f^YH@O +#olٲ- ^5 Yʦ=NbɓZ+Ξ\RSSԹ x`ȑ>,**2dAZZmݺuϞ==D/_}nbb™UV_;::r&ZiN:ұ}VDۧM[ԄaÆ:I5}h"ʙ4ih O |2>wFFFNNNk)(_?O澀/Ǝ+| T*?nhh'4~OwuuOgwҥKԟW\bŊJLbРA2o^p!%u릡@ښܨ={P%O4J OOO m͛o׮7J'&&LJ~nܸQ#h3f6Ȑ2Ν+JuH>}x$eٿ?hт4+WxaÇ Tw^aa!_- ٳg թ[H ߨ>>9sh}K-[&h]=hh(Z*5w濾W^R+zi j|kb" E2KKRzҥں &Ёxb_|UCՕo _]8|>|P$&&fC`eeE'OE|ٚش t޽!Ç;tطo_p(L {{{:t(-֩SGsfjjJ;H4p|y9]`-Rq̸q(*$%%iǕoܸ'?;;;["q >|>|13gN͚5qkk3O`nnN.]5+Wdee5jԈN= Oz/ѲeK>nh144TqBB-hhM#5:a:u 5-Zh޼|ƏJ9~bݺu2Snc칁,>_'/VMFpȐ!^:NʫXfMm)BN4mڴm۶.\EVVU'رc)evڥQ+v+Ά̿cA m@Jx:P)nڿ4?995. (EDx8qFb+N{xxP(Eq}:9޼y4 _1r>7gƝ;wJo/,,0F///֠A>| |gϞ8bL<G-Ο? FGGu[OOOZ#422T™i^өS'ߜ Ў=(s!SyG &LE&G4ŋ}gYٳ[nI'ZC+bx1==MLLɩRJ'NW8Ʊj*1a\\5~FJ'|Y4^_3?;Y4իWWPaǎ'&|>|AQ5j;vvq& аaC~XY4u|  (?00...ixOG'{yyQI-8VdLL U͚56\066vҫ #tuu;t@ +++q#F+U:v(|\x`]>֓}Сœ|| >|>>|>֭[###gΜm6~Ḟfcƌ ҥK\\|@ϙ3gС'NVVG #4~}ޣF  o}&9J*111_~+Ϛ5ѣaffֻwHΧmllLٳ,XPH'rE CCCyz{Q͛7)ءb/^2>i*|-NSJḅGtuuE(@ۧSɓ'^rsrrNrHŊ_|)xQQHNNoZFVZEcǎ WWW*Ͼ˗]\\ݛ5kfcc~eڵkd>())IQ:::͗T>|$++۷ƍ*boo_B|u@||ٳg}B_nݦLB_vҾ^^^/{!߄Ν;777WLQ'O^|ٸq㈈Χ@֖~?~7hǏg`޼yb-ܹ36mTdeey栠 ʤ} [AQ|HH}Pݟ?OqvvE233eVV|-ٳgt,(ӧ2h%0l0Q2..3,YΙ3_/>( >2qD```zf̘ӯ_?9?""W^ ݳ_ \9߲em۶+bffn9q|m}cI~[ǗT>|-А{iɓ'id⟑.fKd}q{ӦM~:`=x@&444::W_۫ӢZj͜9S8v옅ő#GD7oRo߾]|ŋtҁ$I@!.]DիWK0>|³}srrUo;mosȐ!z@#G|aQQQvv6?#}h^^)𱵵>ӧOMMM˗/k(-T?Ϛ5_/&'' ڵk666kݺuϞ==zC  ڹt8::7X~}TTeӠI&%>xggg>Ѯ];[[[Nݻ6(@p͛EF?|gUXp!>ZJݻ˗(}<|Pf"&:8yUHHy~ $:&ş%> 1sK2,|eX+N8!]5gb-ZHKQܜ9potqqD1w /[DZ @zdgg󢉉_.ʢECCC5ڵkZ ]kJL0.]yfeO<>|۷o.s_ }fO<{k֬]6%cZejjuƍ} SPz| O?T@ +@ /_>;;YMbŊ׭G>|4>|@)Ĭ}nݒ^obb«:v(uڕ+5jrZl;wPΆ xѣGu._ñ[}5KȈI3)\2GGGK{ibԩ.((ywwwQёy> bQWWWP/ꓞi337oRNNNU[n D<==1`~RCk֬2eJjDҥK hB...ؘ-ZDiqy@*U#}B liRSSdV*ةShUݺuW͝;>yݢeff&-ljj*S&##C&C\gF9|i1???e+D`UU4sÆ V2V̙3[ʬpez3gΨYK޽[>}ZZ8++KZtN׭['Mڈ4G7;;>bΝUIII؛e7 @>|>eXnסVW WZ)1ֽx>| ]=qŋ=s+W>z_Z>|b˿^1O |>>|tjQ-ʩ |@>|}u7 H>0,qCwRA)IJd   H. AF)M$>AAA    E  ʠۀ }G> AҎ>AA/   E|  !A  0 B_  ҾwܶM_~ڽ[AXjaٳ{N͚5YfwǷn݊ |7n엤 }7o֙'>uZ5'e[h|YokM 5"Oacd޲'9qPgԔ|?oe =OظSL^̃G  {=P=d ssa!CWS<>z&*57۴IcsyO<}IJݿ}!'g+Wc2T׭Y\\QO)U_ȩRv7?.y!GϞRXՃޢߵKżS  µgERpU{$'^9-s# Uov_n+KKڲ髅nQQ/ta _xpѼܜs9Y۶l8r8]gdmٴT>efP%PA!(@*:ꋒv߱[  *>@Wߕή*..{SvQAl_ѱc{q F9REH֯4Sϱ|^=w]##ù ETNN}Ru^ZGL4^E䴩Aٺuvӻ4 }@1a%+ѡYY>k{PtSO]DF UG E~3=eN&-5ѱFNԁPvu,8| R8޹} 6a67xV?~}{שSvk}͒4n4a׮pi֬ivQPЦreSzh33+H487K:+hll۲A__?`:$Ǚ$&l6erjո3hk8 }24dm АCrŴSiToD~#֯7aacztZ]ܶM+"nG~vĕ;*ƍufLWQҴ)&&&& qM-_SB{>4:פST\ e:Y~]p<'B>޲EsWW7qۢWm}277WB  J}׭㇥[7/埣.}՛%8όl4:b8P]>돆~ڎNfe>ԝhr*px2e6dqM%{>###:K7E?6tQN`WSN?Wl۲AWW6([@AZC})ҿ2xUE5}V1P6zz _ kjD (1+e$7WoCa tTjG5iTxWW6mTWݧmy;u<˷l\@e1FFF4WQQ#GPU/lljj'9QlK!CqA:>st>.G ߉OE9ORBzz>SZf'MpW|RQM%&lѽuTw> ;kӞt>/ }u]  d}{4궶W/:Ivʿ7uw7׊+XYYѨPo4 4/WNe ]YR좒+KacTNO1~*/UPUQxHuظaI@ \*) >o.:|z)ܶmkccc+KZj?峥✖‹mAATJť1uy|:ر̵o[‚ ixnuDcrչ,(bϞz/aQ&wGI,tByg(S挦8өߧS@A±V^={h>t=I 8 H#">AAA AA{C/@Aa A*>+2 FDE@"u|   I    >AAAA    }H8    nQ>O۞Et    H+E?. ʕ+nAAAAڭr?~ endstream endobj 947 0 obj << /Type /XObject /Subtype /Image /Width 1368 /Height 902 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 2731 /Filter /FlateDecode >> stream xMN@va(ѝ7qP;Ot\'p btZ'b"P2> stream xmPMo +8Ei7ޚxk{~lMT7{hH`{o҂Z#2B|',˵(6][" 1*VQQE'qc/_Ѧ"޺:3)d`BFJ \ZڋWQP<|Q+ >ʹ k?5ӯl\ܦPnsw) endstream endobj 928 0 obj << /Type /XObject /Subtype /Image /Width 866 /Height 627 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 952 0 R /Length 48872 /Filter /FlateDecode >> stream xXWއWRĊb{{Qc1FQ\ŒXA,"HĔ]M{v绹\3g̜;iw%!Bk>zIOkZB!,B!`B!K$B!X"!B !B#w7m>K gwXGoYp6IuR~>!&+#K\f^{o˦vY}oݺ5o_TBUwڸqѣG,^`{`5uVk׬|P[$t^Ąؿo)IY'-ZSuMڼnM^nVZW-כCė^ЭY !B oz꒜fPQD:_zbj0]KzrY&.8%_و*T8ڹ"=-IoM TO$RWdKY>XK4 .$pjrV !0-QWKta ]:oWF}{v>(Kiisc4KԖ>}ګËЎ;L68aCrvPW5xud:SZky9 zyu;ڬt^^i#`pB!<3!ǏD16mZϜ1Mik[S@\!5i&Z3S^5>K-eӃ[b8kj֬udr\dSSӨ3KYnŐd՗)K4YbE~̢φ&'BH YbvmyQ ?ecDLD#Ulll (&mF32g k"VVVoOK,tp,ڵk+D̪T[}ۭZk+K4=K;umX79!BgiCX6`-Q2zԈ~}ܵ,fffΘ6xm[zꙜ_j$333xY5ɥK3^ƛB!%GOg Zو2ԔjP|ɠ%jb7uTPA;Y;5jLܒo(O5sz:khz4mDݬM!^ysAdg|}~EҤqύr9']f|Ļ7^٣AK۷˓^*mZ֪e+PКv%KK ++SdP ASW ꀞ%+ܱ}kJΟMN!Gkbz)Tk+3I+$cE~j׶Uk-1(ܼ}xyl7nX_КYnݺT=w|y{Ă:gOPa֮N!Ģ&+#%LF(tz#L ݃Xty2.^M!Ŀi^{w 1Y)}ś69)n-~wӆ9`}l~G-O !KDU0a\Z3gL[tы/LprtT-Z~Mu‰ ۔ wڸqѣG,^`{`5uVk׬B%b7;3g^lrY&.8FFGz9uB~ıW.gZbzZRHyǃ;w15wLTK zG3,` .BrU+B!X"X>-1-%QFz^ТåF֫W˓e 71ֵknݺh8v̨ ꋼUTi%><,ѱSjԨoNU/icc#rvrܘBZC-T:) nn=lpE!KÇ 蝷=lпߴS,---z/h&,e0kkkZ^N6gΘik[SQpsgIœq9~Ġ%Nr"%`;w9;9IfD-{.Y(:קO/q6b<#O](-S2ۄ0)S9r( Lkd۵1GEXK,h {hlpE!K˳%jtƷ[bO5o˖.be{=YZZԯ_o^}Q~6⴨Ȟnq?gz^BU'y{67+B! s缾hn=[,D(͖(iРl ЪeTgĵd4KTɽ!hffD QzKQR*OKyA -Fl! Ǝչ}xv0ٲ[KRe <ܓǩ]o355-}{<%u;s\LT1%u5%ETɴ껳AK; 4 ;3U˽{[I_TֳGDݞPN"9sDZ?{DEzLX"NKԱC{5jTZfM\۷k+_haaܰa1:eҦj*k7nH V.3rYݫS*63gN;loo/Ukiz=/h,hE!$g岅J+|LX"3β ?%sr>0('Ձ8+DK=ϿhH ;*bnaCӒJh;op"iO|zL7KRnB o A~=K,Bʒ%zF5&: ,D((['ByPAXHK6g''(c"D["/<xO~g@ *YA8a¸ģGzDA(c"D1?_YDXbzF<;LL >K,=!>a%XbYD~DD,KD,K,VwĒ޿|?c4hPpp0h,K,q2h"}6l(,˫xӶnD,K'|AK}vZZZbbvO _}*7oT;wHYߛ\z5**ŋ׿doiժզM[T7n\tIozj~__~` R[駟\Y~Mw/??BD,Dx,q}1cF~KrJƍ5k֭[Zj>}Z*CCC6l̟?_ve)լY?ݏ9nݺkӦMrѢEVVV'JurrӧTvA4i%N2ťSN7lcpAI}ǎ+V,W %~o/=Ew~%b%cd)))F~%sK.U-?noo/?}q˖-{=)/_|ԨQzLkkkͲ<{@rĈ .42HtCʇ6ڋ4OR^jMo5jh߾}F^lz%{m"ܹ?=DD)9׵DFi?V$t"oZjÆ nݺرCo?"V&vګW.Q,22r˖-W:tȴbtR;vm .Hߺu*Ęh'eY`K̟K[lE//?tGkD1+Weeei(:$4௜?^F-]t̘1G2dȭ[Wߛ",,lVVV4h>>#bwիWW Yf+VڵZkFݕ4q6[bA/ӧe,x[k-o%`@,0㏹~mv%w裏֌4u떴Q:m0`ŶѣGvy2%CD8c%%bX"%bX"%%`X"Xb-1.&r+G|2X"X-T)!1uτiݪZjbzmR^f%+K<(JbH,q3O׭[Z͙S}QA[7싋?~c2*AUs{g`%cgRQ>dK ?inn;xЀ:ujo߮N͚5=zL7ju]5׭Y%..εk_H,D !Z9{:۸%ڹMcp#څ={t%4aJ+U4kt)G=Ssb%H!NIl[M2@cc#a32[.YLL*h';asX"`%BH)qK <7۵M7zyKiUĥKYXXh yzQ#DK$% >(ĤB58DY⻛6q5wسٴOH)X-H ʷ-QcuŘ!X⺵̦O:-9cK ΁>5WKgݻwum Ǝչ=|vKoZ[p{k"meA7=zE yPc[nvb\;7By xW׬WϡB 5j077ҥsP?7vtJ60fH,D(83NԪe;asZMlt_jRS7kd⢒ ju$i3,r:{B/&𖖺sSӒD.43=`oLTSQPo !XnMو<&đld"x6`P,Qzrss󜬻5rzuy|YnMN*O{BjZp5%?g٩Cv]~ߞjfM[۶MF3AR)_W,_'VҪe qύ%9v`3%O<.O;,sqQN:Iႚ9rAKԛ6mZϜ1M ik[S3uԌT]]e'Kұ,Q7S>|(H%`PxK A~ʦ|]dY}-fzؾ]ysT"OUgU9Tp|G&etF/&~+TJa`X"D_oi.޽jY3-]4 ZbA͊qYo&&&2nS* č֫싲:g#Nˬ_ñDBD,K[a8;9I!l:o+9cZXMU6Ҭx;u$0 uU0f D,X 2RR98jfff^eT\LLx*Ųlmkj׷o'n6Ҭx;sɓ; 4 ;3U*%Js'r^}X"!X"%KT *VX^ ֚M~ysÆ &M|Qӿ@?g'sssq-#͊gz3?ӻWO+++g'*Ul\]]YnݼN% D,K,%Ƃyvn_da5-]^,Q$K,G!&8p@Ǝ6v`s%ekIH̟#bg8`XKUҸ"%`Po{ >K=s>!&+#H=wd{v~dg=٩[.}X"%bX"`Űħ255}etE ֯)Rϻwڬƍ1F;7eKlp//aX"%`ʕ+[bZJbŊy̱+o sU9/7\\ԵԔ͚6Yp &'ū2B 9qT_?)ٿWCbG6t,"v15ZhT"Ox8vX뉲q1X"%bX[o5nܸ[n˗4o*~Xf;Tnƍ5hPdhqKiB8;uh߮FI_d+W,U'˲ssk}S]=p@?iӭkWfکjvQұ֭[UTIV|Ze2IvTxpPDX(X"`%mӦb.o۶m6mZa8-^ஞMz_>-Qs^nS&Ɗ]o2J&OdKKK)H6mZϜ1MI[ۚٙiR~~¸qύ=k,Nr^M,UKAH5Hcfz=lmm}ϫ"ˤ%vzcF.#6p`ʕ+wys|ldQ-i&K,-Qg!zsoY|'RpB˖-{ZȕĻqCN533SBZbxXkφ`|:uqg# Z\TC<Sz%.]P2jѣFޝ26jPkRolݲqޝT1F0kGCOK,D8^xs'M.e)^zUReΜ9Ç-+&hggT,---_xKv9']9XgɁrLLLdn3h]NLow,--ׯuw\ʾ(;q[b\L+/]5rqrrtp+4|g[ۚ;oܸ;H/TvM 4K,D.1=-uV֕Roܸ1`q~힖xrf  멞M4Vc,U׽"Hsj0Leeo^QБ4^t:ˌ%[B^ L?Vc#{ ?NpD+I=zt+o~뭷apm[ŝqGr~})],o/OzI]w-/E 71:)f?=xP߽"1n:88jvfĸ%J N%~R5 P?c%Vvp[z51ٯϐJ_oV;}+G=hnn6Ɂ>\X"`e{Zb^=>L[.ǍU,ժeg'l=,Qܼ}wiִI͚5U&y枖(VzU+O>XYY9;9UbL=Ƹ%JzUjڵ7n$9g,_>^{wD[7Nkm=2k6)oVN-,*ϯZK,DreL^nVd)u?Ȓ[i ;xS]~R(ЗdcGԠ}L333wO:r/|X"`%K 8X"HD,KD%bX"%,KDGY?? %B,#WP:)D,[9PC`X"y|mĵKKrbلruS DԦO$K,D,6K,h,DDg%X"HD,DD%b%%,K,xw |͍7|'?%,W!}Vsƍs玪oZjiӦ7o޺uf%,KŸq¢*ݾ}4 @))) 4hݺKVVT9nݺkӦMi_b_~E'NtrrӧcrѢEVVVRӾ}{iPP3 %`Xߊr]˗Un׮]*T|被UiڵkdffZ[[Ϫga,1''GVŋRy1b… q.`YW&ϫS&IwrR,D(]XTETRWjU;;;1͛7K+Wdnׯ'|"Vbŵk^z0کe)jFFFnٲeC-f%fCRv СCd͛.%~x7?>==ڵk133oҟ .H9,,lVVV,%d>H;w#?>yx_Dd|ď=vĉF>w& y#89-',-BOQA2xp`AxHW'p]"`%_|[sΝ>(//.[no~ ͠=x+'V6kq[p{kb;O֭֮Y<i|XfHcGT,=gg433 ?%X"cjO?qs+N-ړ8x;{.uc# |jݪz]KJ^UcVP,DSK?'hcO|ymhBm)"z^չ^>笃bÚ5kSڵk3jfW---98h6rpkoo{DQ>"lRdgiܲe~Kʢֵknݺo٩Cv5jطgOYL|-F3A2J*Z{}x8W^j*b,QƮV-''G)p3`%<8h^S3/\{j_FO1+?_]&?Ǯ^E 0iҋѳaNfN/sA(=1{@~ӦN1b!aÌ\iӦTجmM^)N,x3d){ZgYA'*|J\L Q{DkK-g)u|շ 6#QĎeELMM/$=Qr⨙*+z4+%߻t9ս{W#(p ?e"Ƙ08L#*666G~.o&Qͤ,!>qwK,YbEg 9bq'M|Q~Pcmdeg]s)82끺c\ά^A&Jz6iXķZ;rp 紩Zl~ݛڠv5Cφӻ3d*ԴZ)d3,K,Dm|wԇ_U>I+wGIN˘جᙣ4m[EqGԴZ^΄5n(1!V۷˓^.߯Eob"p*ݻ#N4nbw'UePAݞΝDh3Sl_O)L3,K,ćiӦ'O{ ><00qbo~f#]yrO{'.K9rv!w3%XU,8qS>};t7ߨ֭[O2ťSNZOWޱcGWWשS~WR/v]iqK>}퀔+_N,47OC?=t3ǻ\?ОCD,K(._,qڴi}ݧ~`kkk)Q7oT;w1b…i~Çmll( ?x "M erGC#"μo>9Sip'=fuBb| 2pEyD|ZvbQQY +V=,&[lYzСCfzRʢ2eNNN ~UR%iZ(x)bgN<|4(0Ͻou4=~2>lʅs?L#K,h,D(?(OŘJ;|֭QFo^{gi۶+n:~x=8ʿ׵kbcc+W>*4-IKq Q"aCB9z`P_߁^~ǃ =~*.&29)^Z?ׂ%rK,ͯ;/.?رC5rww%~O?tʕ4ik׮ *BZbAHD,DK!n˻}vQ'i[IKK,4seww#G'NxhB)D6d%b%P-p6KD,K$X",ʰD%b%%bX"DKD,`X"`%bX"HD,K;K>v] 3{yW.}ݷK %Xbiě7?θKLIN 9qx q_`=X"HD,D#KܷgGGٮU}]!G:_m3̻rky~wY%,K,Reǂ~oo??r8@K͕KRsܾ}(㢌/p.D,`X"`%Kܻ{w}s/g-^;q_46n_{9G18,K$X"X"`Q>{U V֗x>Nxz?/h%Y%,K,c!Gܹ{!-R[x%lkF%bKK,X݃~=Hx8O, K48,K$X"X"`,nmׯ_ό[XaX"DK,Ux8o_~WQ8MK Z%,K,GnwC%aKK,TY" X"DD %%HD,D,D%`%`KK,Xb -{%`X"pOK,%bX"%`KK %%,K,K$X"X"HD,D,`X"`%`KK,K$X"X"`e/e_`X"X"`Xn.Yl",KK,K=hgggoo9'KDKcb,KK,K$U>%bX"`%K\t'k'bX"X"`e/kÉ2D,K,Dlz{8qR,KK,Zb:uj9%bX"`%mK4x Qj2,KK,|ZYc0sgcX"X"`D~KD,KD,KDD,KD,D,`X"`X"DD%`%`KK(iK%b%X[C,K,DXbI%bX"`%p]"%bX"`%`X"%X"%bX"%`X"%`X"X"%bX"%%,K,K$X"c2H HD, i_rxDKD,ސ2yQm[6nXo0oKDK$|Z+'6u %b%HHxKK.++,KK,iN6KDK$<[bÉVVV)aX"X"`gK8q꫓KK,,BN4~ KDK$Xd)y^"%X"!XDIrR<%b%H{8ɓʆ`X"%b<(K/D,D ˪`X"%b`K ^g#v>!&+#yYykscF|vSs%=9D,KDI]'lZp{kӒZjc%ر]ZgN( ?`K>-16:[lS>^'r9SSS7kd?d葢jZ^N~}4i,LLC2? ٙi ~W 9y>%,KYիZpJŁuյYn]rW---Yn2L3Sׯ{S2<,T:#)e{{{TH_LM?CfM "5ڷX0CMR ,`X"ETA,k@~ӦNrhHevfq3G =W_rŋyg(ؠAD)733>V 3!X"D(%^ٿw钅sgK(377~0rcשSc"Y9.n%>R%6<`X"X"K]_5cECyuV{=YZZԯ_o-QLp@LSSӷZ[$K\fWM+LC#bX"`P,1lv4KTɽ!hffڴjBC-"f?[bꌶx!Mf((}6izOnτ%`pOKܘ D8mk[SYbltDDI5UPȞz,a߾_ޭ*[577uAjN~yۿ__u(5ӛX}B]ܱ}kJΟ.BD,iz-E,,,\\6l0iŲVR}ƍj2;\۷k 2UjK;[<%>?aC]錥ź ?yA}&,KXP#O^Lt_ʾXܵKzr"O? ,q9aCnR.3!KD,GY"3B%_w!KYbI<%8D0b2PN7lt%`, ͏%,KXb#HD,D, %5aX"D&K$X"X"bKZb^nY1wvw7muLOKj֭]}8K %`X,1k*T˰%vUFMVӢ aX"D,K̟JbjRjyQE_ʾ( ٙi ~c#K>t8?+#[b۶m,--Ą9E{ZJwB|jv&TVYk%bKK2l7oРR#IhH8]56tH=YXX,ڄ::6tqv5j۳[kӧvD{{{TYQf"ڬ}giղ[eY&u$%,K,ʶ%^I^fJ&Vbttl}SZf6I^=g6MPIK7~K  577?\HKܸa?oiiP^/%bKK2o=6mZ+Y4md2g톎geJz~JwTD,`X"%ZR+Vrᜮ%+!ܱ}kJΟ; 4@]w-/+/7sqQ֚%wRȽ1x@,K$X"%b(W3CSz~8 6XvӻWO+++g'*Ul\]]XXdf!vj[D,`X"X-Q/Y)+WۯgbJsNd\3yY2ӓy6HD,Ku{ϰCZnW{< kb}D%b%By=2&:\&ƚX_,`X"`Pn8cM/HD,K,W(r֗`KP?X"D% 0X"D% P %%,K,K$X"X"HD,JS^!X"%bza%(G %`BD !KK$,K,BD,DBD !KK,꾻Jn,K,[6'dez%Js'r^ݾ][eu%bX"Xz,%&&z׼B 2nBD,K?xpЗv&4-%0^Ɏ?)v?)FnXN{v%bX"X;wx`ޮۗ.YXFeKO$`X"`aC&M|q~ύm !X"Űĭ[6Bc,K?n~φNx>!\\TvfZfz4NM9K嵼cGN;,b!Gԛ<(O՜9uBkk Q^}Q?,R-Mw;"$/8%`X[ⰡCɠvOoO{+'5Qq6+#%*XJeUR> K,wVuvo6]Ko%zf)nQ!9^v,Kb[]Zݻw/8vXJNWzW.{m~≎;kVķZ+eىо 6}*XN"44`QRhӦu!l%DibА`^s,K.Q7]N՝Ҧ=+KT%بQ۵Ut PR%yHaeEzK[U-4KܹS +V=rJ\LdIED,D()>{:S%o%-9Yi+WVv"ڴi-uL\*6%^sp;˗xvX&MxD,K%fOͭccD7\0p`WZU=gzYBU)jcX"%QgJ1O&{^ʈ?YЏ]ʾ*\3%`X" D,KD~DBD,KD,,["!<`X"!X"HACӕ DBHcgG %BDB]VrK !X"!`X"!K|Uz'-D,,1DsqgKO ±D%%bYz{:l` !-gj=E(3O,-7@9.D,KD,KD><00xy͚5߿?y,K,4[fϞ}kou:|_5yGbw9zY&Mzꜜҳ"_6?HCnHˏ%?Y/矿؏?֭[H{1×_~y„ 7o?idqPB?ѣVZb|\JVDf=Z=cXbyĔ n%++KK͔)SSN2jFڻ߾}@ Y|0h5}]vv=$~OUennnbboL FGG߸qC{}zjTTŋz7|ӪUM6ɗJZ%`%Xx+$zMokݻw]biEo߾:|N6]v񇲾6mR>|͝;w[3f̘:ujcdqPO?UXq߾}gbKIcǎ2ypp 5lPj&&Lح[7KK˷~le0rȺuOڅfdѢEVVV27R9qD-LD8`;=ѱQ#8ʕ<9>6R7w]0M6Yp~,ʕ+R ׯ_O>Dm{l٢yzBAh%Y%^pA>eءC1L)ZJ pӦQo5jHsNi&zJ966\>633Z3L͈gmTQb["%`G^{wnܜφX}bTͩc..γfN?z$0đBZ ̴Wv@v+j{U믿Jk׌[hdqP(uVm&&&ډ~ڧ7f(Ylo޼Ybŵk^zHAX--,-1.&B6+/ѳ=5jPw|Ԯݴi?˛ %Y%&ɧ,..0_f'O֮jf{F 2dɒ%Ff6p@+++gg}ಌ[bA FaXbi[B^(ذcUÞiҤ:+]3lpcvݸݏ%Y% 5>C$ĥKjZluVsssuXw3ұcGK(Q>u,D-CիYXX~},[^rP =X*K׷ޝ>gôz=n-gٵs[,1?_|yq5nܸB k׮X!C_^/-Q6lذQFVVV{5ePlzsssŽ;ٔ6͚5vUoT,X"X:8Fă8v4Hzi͚.|3h>+W/[2~M.}g{Ν>(//Ot`rY^1hK%F6md!R֭Zݺ>7vT\L$%>>{wC-+ي`%\\WVJ1ƃT[6h`nnֲe ,K,if͚],{=(XxpЉc }%Ÿ?/يw.PQ\" FPPcT2љF1xb@ADx KL|D B DT@ATTȫViX]_jUvmK8`pg%D| `D,_CX",KD`DX"}@9mmm=bJ%Z"8k ??wΟ??66V}Vm`}_~= ʵkD<,%z%RaѢE|K,((sBee%,..۷o3-Jh222;u׏Lu~嗬Lw鈈>-I)I\ :\zօ %>U4؋-5>>ݝW^]_QQ7(ade%IXYY$SŋFGG-1&&չ<<zh'zڻw/ёqXTTDri~~>7B-N ,߮%2* @󖖖:pdkHKT#ػ{xzz\wHʕ+\;ݻwObΝ;&/&%%֭[,ѣGƍ 4V~εD:D"ѠA%qJE:r]\\O. Z"ta7n˷Dׯ`ZZZ-3f,^=I+FgZDyRf~ʦ~N?>.s_%ҙYEE{]Æ ;u5DK!d,䜔I E8̌܄9:kqˣچKdQQ ["\MMzԨQ-PGGؘ'T׿***ΝaiiMWϣs7a_s'M5jsf;Yvܛ)|-xE􏏜r,T\\ܠA+west%*ݻw;e*++_?:!P~CCGUUU]5Ŀ,mY`}!+a!ܧq? x/ǒYGbY,})oC'1I;(r,1"")=nķD$0D'a S~;ٯ_MN ,@b`>ȅd^*3*\KS35E%ƪ?FbTr~wK;KR544PƍOzHs8v%"K|a Y|yO\D4сC OX"D9=a/{E/??wkFKtóXK>حqaXbYlٲEfWTT(^J< =v{MSYY9|pn8풜L+=6Y__.\BqsǎMMM,xq~7˩7ntss0 %%\D瘙YZZg}&%Ibɻv풎;99ڮX GOOo---]}z]𺺺u-}}}ҥK,Bkccӿ~P<$$DKKkQQQVVVsaq//1cp;FNAAAWV?`D`=_kh"Rnt(''E=z4nܸ;wp7Ҏv K\j+_~~iSUݿ&%%<_Ǐ㏛7oR>7X,JOOY]]oQY"֭[OJJ8رcY933cH'Dz$p$K%K)w_i.DrSSS[[[#GRp433gC#F̜9[bKK ٤PUTH$bq='Z[[eцԢ"-1<<`D`x. ,Q,z},| &$8߹sm.\W_kT[uuuYYٗ_~NU%ٱs 40I)CBB(H+F,o?711Q__f!o `K,%VTT%9 ҥK}|||Cqw`I_x4?<5oAkȧ***BUQeL3X^zUII~ޒ%޼y )))CEOqtzzz,qaaa/lǏ'uww9r$֧akjjhéڭ?77700ۛ4%a{U["eee.Hi㭄%Λ7o6m裏8i3)w"T̡544jKJJ%R_~NER-ԩSzzzdk&4#a^^^G-TGGgΝlD7++K"!-tQ;'OO+**IDX",XbmP,,.ıɉ'ٳHJƍﯸ%fC ٱcdZ"$X",,g^>Ww!KlkkX,vqq>}:qvv^f =z-OH;dDPPiSSdZ"}?ď̐2cƌŋ3?{,m&LYٳg@g;΍=x{zS(nffICheeec*dzw'_OO9y5aÆ X",K|=q :TWWҬTTTHhrڵjjj֣F"%2_,=zΝ;SdֶܹcBM6elllhhqND7 3UxzzMLLvU"x#B%S>5vppm `DX"DXb'Z4d\]]!*++_ή$/\աCȻ*~t_VVVFͽBso{QX",,^і؝ILL IJJӋ'X",,["{]hg}?C,K#8+X"\",X"%K%%X"DX",X",,[bagO>}}%DX"[K': <,on~Bw$,K%%|w "_X9ZNR⑤ .s S\κu~i~mO8~>,X",,gYwAe~z4'##Ck+K Q&~9!8UUM_o`g9mСӦmmm5m۰D`sSx$.V?ܑ#?`17_eHxR"tTMM,},QzL( tóG[hSSHt/QƅT6ۙ\&YOK=g Z'D`DX"8<{%`L߿?7wee-$ů]ɦST޷g455qd6X"DX",Xb2|Yt_i_)$?Eoqر6$T+Җ۩S'OI \D`,mgϞ7!!᧟~y}k荎??`H3JJJzzC 0w~;s&'YYMxr,PKK@b,aEoOy ,??X,600j$;}X,/X'L*huuuToBCC8jԨ={Pj{뭷쉉@,Ks%b˖-O;+Wzxx$$$455رG||< җHjjjxx8[%իW-[nݺ GǎвpāirH>|8[AA *++YNqq1M޾}[qKn4~Ty&姤\zօ z%>U4C-9fffgњ%[DdAAA"d}edmma???v XbMBquuu] eexHH}%m޼9**jΜ98@ߴD`gg_//\9.^%İxzz:\Ut$Z dN.J|K8/Z歬Afrssce*lhh'y^{=))Ik֬/AV;vlpp0+gff҆3SH 0|OII(//g $GYYYRt!E,QXboNyX,VUUYIz_m߾AΟ?_UU% ʏ3m6fV~wX̙3jjjݳ%]`3d[[uqq>}y`??CH/^_={-DXQ^^NK":::֠>`СǏ8p`TTKZ"I߃ܣW\qppXtϛoy!q/[b`` tyyyƍcPWWHHwĖggSrT?>bwww__ߑ#G} {: ١bK2膖T=hX"ėDZnӕX]]MKIKK""(..C.ׯ_?볷g%%K۳5;wIbᬬ,tD'a_GWZ"ajj}vVˣIlڴ2d^jkk#.ȮU߹.a7;",Xb/y gX ,--M2۷m6V 177g)>p@Fr >x{ӯ8fffς>dSӓ=*\\\AT`|D`ėYMMm܅DZ̙3YO?%9411=r H#O'z-,,h~---#%}v-US^^^XXȮ QYYI^A.+++**n*%ܯ!,%kK%`a^oK%p-|HW`/_PRRoƾYrGBB̄-[(2PzɴS0,x,?n...ʟ9;e8"L/((H[[;44T:gŊ666oW(_(θu떾>mKK%^)KLXkĪ*UUU21εYfrLLfCCDNmmSYc+/g899mݺUaWdS,1**jCMLLDK\dqJJJBZڝC;ݻݻ6([+}D cGNumF ,/X}XXV^M'NrZJvv6щV۝WqK)ccR л-=a LMMN/-nk?vtt#KU}߹%zK|2}_1srr ʝr2)))q###$yDR_6([O&7olmmsf&:R\ƈNտ[3h=7n\hh(@ANojjjRRRnݺ%Q}`~~~zzzccc[9Gmݕ+WmM$w枺YYY'OpƗDfS\T9F%X"~^}}}ɾ~m:dBgHZJZZDqqqXb*hNKLL8WHO8_л-Q'LHttt&Nhmm ijjJbcc3r\NZL2a„x8ޞ=cL$`4/M+NqZѣGi s9gYb]]Þ={diMF{5:;Qjڴit.JNNf=j.+1o޼ ȼ( Fg6V&EG,?/f!C/^9رc;dB۷29-ƍXb*h'NI&Q%vvvtR}„rĈ!!!O '0K$_|_|99!TEB]4:8Ӂc*?} b(@zFoFMMӠqԨQB,ŋɜқF,f3gkطzߟI j2FyҖ(aKDKaRZZJ'gl0K,**,MJt{ĉ{%FԊ5ejjzС%KX%FwTŎ}?YѣgM`X"_q8w=zD23uTfd;NT qqq>}HTfnOĄg?~uXiDLn3f cgbRmgϞ >{҆ɓ'񇆆FNN▸`K , Kdab?are;wTRRbn7nܸC,kiiiVVV***d=GZXXжS+H.2***NjdKKKmmm;;ӧOs/[زe }-e]|Ȉ֙%eK.K|1:dbb"7ބ̯/O7`~~~UUUgmEKKKaa! ,KεĐ===q8Kde˖Rc}rww /!rrrV\ᑐ 3ի˖-[n{DJ~<55uƍnnn>>>T'ױE(f gTϜ9#yyy-~>ҌD`[s,--Yy$֚I&YXXek9::^WٚH$"K foʕ@]]ŅL:*?b ooopZZZpruuumll$M5Pou`f}X"D""E$_o۶m̘1ɗD\bnn.MfeeDX"aoȁ%v[KȠ+WHf򕗗Ӽ\DGGG΍]2R nlS9{yy͛7֖J~=Ȕ599M9rV5>>/%7:`SRRdijbb)ll/_ݻe&8;;O:`%?H=H,[dãGOv%=%v%;\OFss39Uzz}ĆOKK""(..N:S,/Y޾F8ɓ'iM***͗DɐٳgU&&&5m%,{Z"annTVVV}8۷og弼<=R$·hnϗD>l,p-z4.ÇDGGNk׮Ud7mذҲ)ܔ)SX|߾}۶m{ǴY~~g<|PNꉏonn~lpUZaÆ4yDېׯ!._|rG崔l.`NEEqii]raҥ>>>oCX\(_~\~`K;HDDD >GH)))q##ݻw+30*HXG;rȀg ;;;O:U7t\~`KSoYlNGմ4."9uꔞ^bbbRRRLL DFFLܹ%G+YX,^d#qqX"%0,tswYuQ$ĉS3i$ FEE=x.\fWWW'ʧVWWW[[G+3.T?8KXb|3:}7mذҲ)ٔ)SX|߾}۶m!qS,S9::ZYYX(͍fʉ+R?D%K ɘNM jjj.$zxx̜9S~%RăoUUU9qED)H577~KX",KX",KX",KX",KXb߱xwwWvYrC9קoٲg;v6sǎ1Y?N˗9sFzm{qz%,ZǏHrVZEGvnDdtAAAڡt4b ]]]MxΤI455'=jiim޼9**jΜ9,z@_b[n#TD%\K477_rJgYfrLL ZCC9襤$ KDcǎ fLj755?={ nʷDD%\KSQQ!zE䊌+11M)));wNƹ X[Ǎ;3gԨB04ɍw^rT|ˬG(%,Zŋ7+GTvv6ё+Ѹ"i&nʕ+K.y7:igrr29r-.>>ƥ(`K칖x9}WJJJ<.bdd$1PNGZb[[ù>2bwww__ߑ#Ge,,, >xfQ$% N819&My좢X"{%&$$ 0 88[nz<6ljmmuuu2e ۷+xcc#9ہ<}#UU_~nfffrttrqq1_*\|yĈׯ(;BKXb~ѣG-,, TTTΝۉ쬦6x`kkk̙3t4k׮7 "(""ȈB"==6*111n'֦K^0B_YYYAA锗rW:xiËqk׮=~%D %,%,%,%,[jjj;qO\#!!9B񦦦;v`INNwz^lٲueddk8v옏'- ,ɉ Wۇtn"DdhAAAڡ'Olmma???_ۭ[oG]]Ņ|QYYy,Ny樨(++9spD%AK2e ws-q֬YnnnР`Pߟ䍽\ڢ[-QssYΎǎʙT?X"%]bE[X,VUUMLLdJJJΝS$Gμfff۷o/++;|UU{z:۶m3f +;&|555 G%,Zbff͛7;i)\DGG'::Zx]]?C?~QQQ,ظoiaa&\tR7|СC8,`}h"WWεĒZJ^^122N(G(ذQu*ϟ??,,GkwZZZNR9~#}}}G g-@EE%77-ED"Q\\"9Bqr~M__Ϟ=N#iLJJy###I寃X,^d m2˛QGGgΝlƍJJJYYY8,`} yunSS۷29-KͦMه BZxĉϙ4i%ٱB>z􈫍]pQWW0[`KSxH4hРN 6XZZVUU1%2e ۷o۶msz13p۷oʿ,TO[[Y~~g<|SS,S9::ZYYG%,Z"vZw%6448;; <ښ1sL9B񖖖O?DWWȑ# D־gTUUY~zz%SZZZRKX"F, ^ G(^YYIǮu:pPZYYYQQQss35KX",KX",EX"D%,%%-%%%?~ll,7Ҳ~///wwjTNNʕ+=<<:#3~e˖[.##Cdڜ{ɐ?ý>>>˗/?s"j...ʟ9'Ok.V4iŖ-[ ]kۇ,K$ikk*#WWW&#{&wv-}}}p:5]ݴaKK˪*^SLa}q-rdi<{!g=UU_~v'O<}v}Ĉׯ_|`K}8wܥKJ4{キ|r K$S|`K}mmm7o,((:t(Hyyyaa+ (2 k׮q|`K8X"aX"aX"aX"%޽ٳ O?rKKª_`O\ÃjhPiǎV?aRSS7nC\z(<<\h䀀{ 3/^`~~~Ǐ緪X,600\SS3i$ %R&GGGCCk:!􂂂CCCM|HfxR•+W$]SSСC r$;;DGG+#'}|@=~k&o7oI[_EEqiiiG-qӦM6668,`I444XߐÇ)))pmf711<9P%yyy\h݊>?6l{޲ { nw?zHUU_~`K HW5 5ipp0+gffbmz[K7ɓwE: hsIm۶3H$ٗZ t4lO>IMM-**]\f ͽ <77&}˴wyϏϜ9|50%,(d"3455I .(//u":::܍]93Ҳ$0ag2L/YΑ#Gx9HtR7|СC- `K% YbJJ e޾}[MLL/ZZZN2CtZ<.bdd{nEr:BYYTXSSDM˖-##3<|ѣ -#Fpww9rd@@DX%;\OFss3ξ}ؤX,^d=iRW TWWӺqHHNG>KXbD[[[OOϑ#GNaGzߟKnFkR__OвX%KiY\6::G%,4KYYw,$oOLr>IW^URRbn޼IKҺpB~~>Ź]f%%%<.bddm۶m7?i^LL +744,lPc/͛7o6m裏&O,gv@ #x~ϝ;/--2KdfED"Q\\>KXbĿo+VZ{ŋ["Ӽw'8Vɇf8wwd+{rZmvɡrKK׍WKuů\ŒN___%RwI NYߌ3/^\WW]gϊb*L0חMMMgJKܰa%skk)SpX"%*ٝH$;v,%ۊX"vZ555kkQFεkw}544FsN%%%sΥ8]ss3ų flllhhqƮDZ1gggںB"%,ORTT2UYYyuX:dbbKBWSSZ pX"1#111$$$)))""BOO/22K]hg}?X"aX"aX"aX"aX"aX"aX"aX"a%666>xN[[[76D%^KUNMMM76D%3DX"DX"DX"DX"DX"DX"DX"DH[bkkk||{@@իW.޽{ٳg% ?,ϏʕΞ7o^'.=++7$⩩7ntss=E Rt3gδ[Qxx-[dΘLs=ʼn+WzxxP'.X"{%>~QOOVZEGv]7~x~D,|BLk,777V*,`TTT#333MMMmmmmllFE-)BR$=ڵkdiT.((6m^rr2J0?o޼ HիɅ ~r֍iÆ ;u+"B\'N?z(M7n"s%_xLG]f-_%]&%ٖ^nxx8=7gy{{Chs; Y޽{h' Yt=qdUUDHI;$b/^u`_|\| ص8;;ǏS9..nРA49ptO3Ι3]z뭷ȦXA__-]]]=###44) :>$;}uSȐ7ߨ۠Fb,g̘1#00P.UJ|H7ϟ?EFM\pر"T!#4LK066.--Dz㤸4ovv6,`ϝ;Go߾-ݼQee%,..2"""X쾭+ 3L##ÇS͛r9ZZZZˑ+1$N-t$`rMAKdqj~q&F_VVVwD9 "ϓz{{sraG2-q,Gꑎмyyy\a[ =-~KMGksbbbXCӧ)399{ZL4Ϝ?N"t틱l22*}MAK?==cժU6͎;-QB!ND8}{5KNQ%psBfjjzС%KX% ].Ŏ}?O:`%%ƷѣGsOeeeu6ٳg%ʙS,I/h&Mz٥-ĉSC5S2):z'A/ĮĄr`ǏnKgooOI9ӧ9~~~&233=5cƌŋgRTްaرc6l{\O֮]Ǐꫯ K| P=rꧽliiYUUE9SL ĞVG)))̝;]7nСCuuuʊڵD*$OUTTPd vvvO4hws˖- gHƨZnr֍i/_644422;j2W[bJJJ([m҅faK477'2dvppbQ\#G*>;DQ%ʬGNjjjƅDX"{}eeeO(^޽{ _f+.]zi[l)qF777L%rrrV\Fa\z588xٲe֭Ǐ!4%,Z+Oν+a[x <==}544tI~Xޞ$5̜9lV~5թKC_믿LյAAAW P$%lPl6ŅurrkeVVV"Tt̓*(!DB%cß~WWא-ƍKLLtwwˍE666&M H~״i E~h lS_%,SSSFe]`Y`,j~~zKKK\,BµCxP|ZWWgbb4ƍ)F%b׮]5ٳ6zh㾈!ъ/»z%$ҹʘ[}tVnff&wBIi jFFK.}H!D~b+V(wS>|n#?vvvy Hp0ƍ[<2,HXHO%(tYG()Rf=(q{MLL)jҤIBeUp;w̞={˖-ʦU0vج,5kF.H!,9ף%Nx8UăN<,Xq9q({ɓ'Y8jodd Z"!/-رa/RG-3g\p!$/888**OOqqq?&Nzj!Kp-]x˗TEEEU5fX^^rT唊iӕ%#G w777Yk$ #FPWnذa騡Jrr2p-BQfq|99DRp!'OD}BTgΜ3 1|ь =eo Z8ee\\\"sOOmQԩSg̘fDB%]:t ooQFA^h?hРѣGFFFbEp%Ǐ/6;ڴi.KWuլ5B ŁF5B///SSSXHȒ%Kt ;4KK˜͚F}D1c( fkk clmmռ t^3J`yw;777n=TWW0Ɛ=eEÁV:t(-̀Qˌ;(F+ctZ"-BK%;ݻwY н2Ԥ |?f@ u"FVVVeeezDEEeff*ZReC"={&N ~nsb6Ңtvv-yBK$Z۽sAAݻ8pM]p!::po޼|ŕ֗ZJ?!55"hDB-_%666^zIII?[7o^BBB[[EVZURROBK$Z"-BK$Z"-BK$Z[o[}vmȺv|S4ӿ[Tm۶ߘ٪lhըQ.kO|7jU|GZ7|y|;K.۷O~!qӦM˖-[ju:ʕ+|IBBĆ/?^v˗es7%B--ĄpqqIIIZ;\m]-'y*13g411>!?/!!!Yy oVY4k͆U[+Wܱcǧ~:dȐ>0@sssX"[[["h"x 'N>>>]$&DB%5O,X?r劜u{}???hCGGGۥ׮]S.C 3|FWWWWVV*G޽ѣ++lii)..A"0d֌Wm.MA{ɦ{zzJJJpzA3g׎>}5Y>}NOKwQɁ(^6,,lٲeVVV"Tt̓*(!DB%XUU>^~KܷoW Ii jFFK.*S DB%}U^nH_bĉ_=iЃ= ĆPSSÇQAHK,7x`48pʦѪT*;;;<4%%e…+-&V.++X޼ySf]mmmoܸa";gցوDgffBY_h𷈈C)666ǎS;V  FͲ -Bho%^~Y*b%Bi.^[Ν;x-T^^^.`bzA"oo/uvvBPMMMatjsCtY"Xv'ѡrSB>m۶ST(F25"bbb O>:0??@\z!\w^˶!FhȠ PB !>|ˏZ"!\K,--566* U50a͛8tRi["B8Հ;t}0KKK77Z"4 Vv3}}}t4͚F*WBG=ցyyy/e"mHY!vbnnŋqSB"%B-Vwuu&y:i$(.x܇wƍ`111ϞςtYG511(VF+ܹ300pZQg޲eih;6++Kk͚G0Rggg$,Kjxɓ'%vttz"N4'eo?y7 6G^a!BK$ZaPd/Zh"Odddjjx."1|pC,1%%˗/éīQQQ}}}"ba"#Dٴ2ZAAAiӕ%#G w777Yk$ #FPWnذ݈:g]f8>wTT'O>U!3gΈUS\Ǐqzь =eo Z8ee\\\"sOOmQԩSg̘KDB%s fkk immejjSQV^m%94WW׸:jwwwxxA`)Ǐ/:ٴZϞ?3E%KzG!9&Vw|wq9995kd퉉ʚ3"3f2QW?+W匒;vc߁~a|qCBB= m:t(HDe@ "422 7VJ'DB%n;AĂ-zw^ss_B$:C놯ˍʭ䉊̔AUT99yِHygϞ50*|ԩ;w fCQ+]]]---Z?Igg'ڒ= DB%r7 .DGGp͛7/_WhZJ?!55?섖H!DZļy /jժZ"!iZ"!iDBhBK-Z"!EK$HK$EK$HK$Z"-BK$Z"-BK$Z"-BK$Z"-BK$Z"-BK$Z"-BK$Z"-BK$Z"-BK$Z"-BK$Z"-f?א[ endstream endobj 952 0 obj << /Type /XObject /Subtype /Image /Width 866 /Height 627 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 1075 /Filter /FlateDecode >> stream x ]U> stream x}ˎ6_aRX"1HpOm\ʒK.%9q D yOTFi^Tz?njUfywߒbSJɯCgйuՏ'o.??1;eIN7r*fӦmxBUHӭJ)^)m[I:j}UUiHV7}crU>Kfܪ,ݩ$<{vh :{KAmYC%DUA`=qnܿ1dD E^A*/t ޚM-tD:DiVs"  >s6&Ca }\_9}\IpMQӏ'Ll6*Ӭm7ɇOQP-b$TUAp"OFOo>O/E!Xy Rrѝn7U$JaU&%T =50f4~ 㢋(_ OvЉ ;ނ0cf!\=[b P_40#}p|oZw PJ^ 4 A/qB۸qދqXP>w@ `$N ӯQ"dZ!TꂩHy]ֱ貑 @*5X. T70 t~`D=\+>hLZC'-v ;;}'1g?.Ɓ%W܃V&RKxp39`]Z_8{Np5hbpkAad*|J.-KS)Pxc^蹹 b0INT\yڛ,eSIz wGG6'nQgq`1U&irQfAJL|Չcg9@\E10BTI;~f΂ =-AHEl0,븨""s5J2i?-g~)]ஷ^F':M ^y[*Wm \obOStxwk/ j;&<Ⱥo<?LXm+KzgU°X%[nY>?A,x( NfLn'B%ӱeVf,({ƳugL_ zq8ݷRtWzB3z {TrNgw%jr@szѬRq.W!>?+ƜiVդ앵Ay<2<,&&^=fny(?pf( TX]Z4,~Y.~G:Af1ܱ6: WBx i2Vt5'ʉ> stream xxTިbAEXPHlTDPK$@z%BI4{キ)[s}10If&]K4Br?֬m =M,^@%/@U;/%K޼,(n@w}W?,*aZ<ʨ.[N S_n"tcu=k_/ѷ&:J:{݊%zO]_=vC?]SJwFAK=@7ߐkOK?;r]k]pZz|w$|R +I++^2{Bj;?㿳+_gӻ{訮@]ڎ]{|s⩸u6ޮ =uq*^mW[\w[k]F|Gn@ߍvgmŹ{7r'.Z|awF;ʗwxX&_ۑ=k&ۼ~ {u@wDžd aK{7/=KJzOk_hjO:*y? t_~Esc Q w%~#}?Ez?%?jZ!;^ ϑ4r]Y?a@g ~"EWkxZyBdſ>@'_Ttc` Ьw \M T}~[EK믿R_@}6?k` 27oR_@u_?z[{+~{=` H:g?;;~7t::AovN.~sߥ7Dw}6tbIN߉muy/`o.?S\@!?ݥ;xNut `WSkSwJ.;8(] AZG?P(2 J@$?z=tN_??OrK/[YWR+KK%%0=RYS#-Tt1?ZGmm?:Ǐ\.E@ސP]U&*!.N"͕i[@Fo+ZGC7jkŲ*_rwsJΞ->sN"3gJ\].^z&(HM"FUMqY-uuV; _YS(,]]]co_~}U˗.[&dqy[ڦ;:f:9:$bP)VVVhh` @zOwsZ|Ժ{?ڿOm7/rO^6iݺ0k̛W1eJĉ%ؤ9:9RvRmX{@[Cwu^W45-7/ҲNEsYY8;ED(55X_G<LYYy$wɒM7{v?XZ繸Txz)JJ ;x qw"16]L3Ԋe{g|cՔ#xn%@μyfZY988Q ̼Q]&3_+oݥ ,ФEöqcg}gipDkc>uRz[Njd`m[}Lqݽ;lE=m?_޹c'?i'c"c'ʥ+}̙^sO?U ]@y6^9[%s7Eo`gOfuүzZl߭%@7$nْ`ms` IIʊ D]kDc-,@vw0̬̾fbݷ*dkk+o7{rR=UkiXz\]dX@ڥWȵ~ֿV[5oUϚu9a}yIуL)翞jp?c=,ʧN75M-<~68X:#p]ںs /'ۧN%[z`3\dȓ?i9ά1?=m ?mŊ,C$Ç]ef*UG)wC۷G=ǍCNJpfV&hb ~-\sg9U\ҐQ@@O}ޓimHwzb}{vݙ} _>/~]'nᑉoڷ_uۼI*'Oڿݽ!!AQV-?L_ޑܻGCo,^zZi[4G?W1 7߸~wKُLpr*p!6VYZ!@7N?|mGnP/qߝEi=O._k̛ǍT#>}ߩIWMgpTmG+LJ߻h7eo =\^}^?zٻO< і{;'I G1em c1 DTW׺(?b6פ1ǼizOݨY9;;MuKZ/16 :MsQ ǽ5ݨF"]k.]ʢoZ?csc 'lKGq' 4ՈOKIS}paɫ/,2_dfݷc8 ̶1o{]}<'|Ok,=cc_7̸ضܶ)y-5qɿ_/? Cl@ZqoTSbf\YDu'bF{쀁AQ'} k?j>WOoeމx,x[k *5_7Csu?ܥ6Ů .4ˡ/]͈7\t?`c\\IX4}yg]wN;9;W,-IG3m}fu~@} xЧ {i }G%|a:^u=̟{ҮOt[>xw^oULkmo_ qqy?3gj̾sA]&q73xyMW6?tඁw?he}X)qY_Ԑ,/W?ѢeiWrrr-Z$(??o]ix=j5m*dc}䒍E;5TMjgWtdmH} 6O>ݶx֬ GG?|w֭?Ν;###?cǎlq3f^ڵk??@AW vsKi&?]O?_6}!OoqM{[|s @)VDu][7o&$LLINV(JKee~eWs G-S+#hj_BZJTe?.Z<Ǚ%]y!?^8ͱVoQ?@v@?ul_ci3о?Ӿ@?]tE~?NO~k Z]^[O @RH@o??^ΝKMMU*t@avu unب~= ?(@K @Ѧۿ~oe?x}x/͛4/?|p}􉉉霧CTzYmmCUU}EE]iimqquAAU^^evvEffyZZYJJIbbq||QLLaTTAxx~hhnppN``kY^^W_rBsIg$:pDѣ..1E8ngncnk+'>A|P{pbŗ;rDG?~\\sɓ N[I+sr剩sMaaMQxkKJԕ// /ZVS#uuoJA!)rBKEB̷_G~6u]'O6طo_+KKQw"D(PaUnneVH*Ed)*Ti^H(U"_Eʊ}+ZWth$WӧE$`}k٢E~YYZZs¬wwFrF\@gxޤgO}aմ +'Ujauja{p{.V.қVk+*JR-BB/V*& ?O]wZh^@WWߧϧ#GE2Y(b] O>D?/N:Qtҋ~~9DI&:-:86VYiRBwFFEVVUNXHf7]_YP]-5ҋmRP(rrECoiT[+-+++*U/^B-.@ZC5.[lq?+iiΗ^EȊYRFG+m25<\<"\EgC"nAOJ_iHb)\"e]U"-&K*b[trq"QiwU / +KNT + 0V@=[nr@onnn~q`'OthBU+WDCa)**02RԩibhW"kEJ;H^Z*CRU%:R_/E8Gş +_VҪJmaU*-*7JRƪU~UPпVbHbckwF۷o h7o6 H?rkkkF{?? @?ӲmzWϞ@5 @,ׯ_@gw<owO0aBMM +M_Kk ]QQQ}=_G߾/t}?u3g?t;M[hH&es@Ouh۷^\yۯ@~Wھ?W~kS._~{@7;ZQ5yZl?@Y7]i1mϝ:imha`i?tlc>^ L̔N.@?4#[q)?8:,LX_>U;o_m [xK8\&+-?e }}HWiHH}hYk8VVm_N^z/lPId?qQQFw s=",!(}ͯB#IEj."tPD`EeKtRVh5w۱Gsx~۶y6vzoĉФRe}OGuD%!uޱG[]`nkuCݻ7W2tp ;P_"?@//ifbS^EEGT =7{޽{hgj~17 iv oȱ"e]=OG7r.+WӔ7#H. ] fci; rY࣍SШKKXXh_T$XX\oeqW(OkKKw+@AJK=,KNNQwp{4{XOk^ˁ߼Ϝɴ p"?@lh > -6X]ˣ/(_Z:]?O'Noر&&&qqq?ynk?O&ӧAaÆ* vJؗ?pBwwzfZ1?Of G;V^^N-?-7mm.v/@K6lߴ/P3<~jooCM*\c]-_%@ѣG|Mm,6O9w\ 6lݺu?:Jif;OkKB2A^_/FV[+MMMCuuCUU}ee}EE}yy]YY]iimI45EE5UyyUU99b*dfgd&'&%$&)&.(6(&0:0*02 " <<_LXX~hh^HH^ppnPP999bfdz{gzye\qJgb<<.]JuwOusKx1…ϝKvuMsLӧOJ8y2ĉ;z41Ǻ8;:s`G'&rHGG1bgŗ)_ܖ]qĝwLCqo="78X<4HC_<iϏx&@d'V< ϼ[o h ,pss{Uwm@QqR^vTEޫT/]g={TEޭTUTRngnkfcfmfeh>IO]xœzJGsuvy䡇NpȑR7.?OaڙXRR3V#޽bi - J/q:,-%^?zT,1BC,79uJ,@O$ iyrXH/qQb<Huϟ6mB2ߑ*gi<<*r?z4}og{w]V!ߙ+ ,./\pitB)P^ZϜ9@@+j'[a LMo>z8#8XYZz 8y[YEgWew#5'\/-,.MVV;AAAg͚s_ OڧPf6 SSMŽأMYzkW#+S5Jy_T>-_Wmh[~UUUG[ZZJA,gۄ$9} -w٣=NdË~'*jjf:thE˰aӯ_#Fx{{>.=QNO(gڵ7O_3O:eR#[`-To8u2/&˕ٱGM{-RP\~AvZdIG"##GΝccc'۷~ر}uuuU}ʕ+ⳳgVԩS˗/oiӦg}v9s4]q}voȎ=LЌ^?=]?M+^xgiz֭[EXPP0`QF5馶V\_W}dK|||*++ /7SK|jŊM_@LL O:P=oN]wck2yhitJCQA[g]vHׯ[o,>n:/o*//g_e˖my%>rA'''@u J~svos>}=/ V⿢cGT'\d"ڛ>e˖577tttl|{}{j^y?M?.;熟 LʒV(dJ6O;taÆ133qe˖_ɓMy?~7xO>3Z8|0Ov3.>oƊn3=sY>Q Ҟ?uJBf[N{jjG}OG"WQԟ*~zի#k׮hq 3fhŧC;m V4aO@W?]\PRM>h˗/\P9򩧞JHHP}$((衇4iҝyy|뭷T[ T&n::hnn^{̦? A?@a p++[b}us~iOmnnEUi%jE]Ɵ 4ٹo43/rbb곪XUU%.O>rGyD|Ո#Ǝ+nBPAAOz](7~S:ɍ?wv;uV7<Ȳre ji\:ڧ_=jժ"MLLYfUTT>)A>>>RRRo_O4iɒ%nnnM_Vz=l ]˥n? Κ; L\e'=E:^x_p7Ce2O.G~ ƍom @?@:4g @ݽ9$@w1Cm2f=,[}}?>~GFFW fȑÇo wӦM <߹/K}!Ç~M?Э_ԾXjO>@wcǎv5jN7@LfWb p5PO-O /ntW(_~3g Rz{B!\.F!I M}\L]42155TW7TW5TlS^_^^W^VW&DLqm"15b Wɫ[+&2GL4YYb2(^&MZjiRK$'IX"&1q'8.(6qb ,!MDP1ya!y!y!brCr s= 'Pkbd]''[Lo x]ɸz%4W.{Hs4b.I~1Ei.Opq\ϻ&;$͙$3IgO'CkZYby77^}Uʖ~٦B m*4U -P NIgIgIg]ѸDZcww 3$>pD)1O9BѸbs8#bc;>"`hч>?ྨbQ'1{qc`{gm쬥jc$^ t][u>}̃zmWż{;/j_ibu ^8Qbᬚb}qqĊHC,@JXD,L DREYTFeΈ9%&QBXUj! bqZ(&JXLVbuVKz%],T2o @S-|}2M2XIkk+b'WOZ^bU( EX-JkP1b(]}gcA\lQ|읍 ʼnb7.646:6@JIO6UHQQڄUugFNNen#/W/&_RX8V)4NimY㶕r1ueu/T;_DݽE75sCKSY_ոLuUCMuj/ZYƽk bQ#gN#;kvW^_ׯߏ?kv.@?__(_K /mV|bMM+O?,DlWvrr{w سٿM/~ vS?@4|Yffff&_׼/l :To]3y?C h/L[YxSVVڱ8'].11g&~k׮d2_2doMZ[oK~g̘qB_C5jhXSG>}};v߃׾cƌ!-zwtqP">>ׯ~z޼ygΜ)//]'[rк#GIbcc|<Ǐ733)5WLL4>ͲlٲK.][̨ͭʬʪȖ2'2'2Wܪ|1b ))S\[R\[Z8eueeub**TVWU6TUIS]PSPS#S[+S'ALB&3rR3=bNX 4Mo4{ᇧLbooApٳg]\\ٳf͚I&Ѻ[?2Vb쬥`+]}qrpr8Fw:up_:t Y5]n#αG\9{p#qb;!XI1O9pZɄ3bN%s:sb&w|A̹q"4Rx^O4Wg+^W26WWwdd]OLkفbrrI|=78(7DLp#W{l`77_@Z? ߱eee;v?~< YSWPѢ(NpXUЪVxE,͙$"ňT>sJjfQ"9.E}=,α⎉2r0F(vG%`TR:_R4kzAX>tN/t;/^LW#S*H.sgףiT{%j]H-U7TWٗ^SEy}y㓘;{C7%UTXS(@ځ :_LcU^nUi,1ҎXYb3ĤIZ&&5,%T5II%IL(I/N/k{O>@e?1/yhtˌH_{6}}w$˻CuP* 󠑲??B)**nO~A=ϥK4!C̛7ԩS(Ul7eu 55Օ5U՝=UUU5 ui!@[[V.wm;k%/e-K73trg_TZ|nIXH[53}f(a_Kt 1csq?]C}QYF˝+,7m9lg>֛WXm2ri6|ْF.79i+VWNy%@^iaM]B.5eaaP=6nxȑ jNKK񱳳3gN̙3mllukÇ^{(}ד!0111,,\$'' J;;k+E؋ԦCrƌۖ"+_}fCb p)pR?On„ W|"[|6ݙsCGaܹͯs\᪇_][-hy&kwlo| bdUVZh妍v&8nqӒNHKޮ~1Y]V W% ϛ7/..N'OjXSjsҤI_W(d2{{{/@goसedxyi2Ǐw9Ymg=|D0adJ[L^ck緻ňżmҎ@n.< K.-mԯl„ wayyy[bp̙{m怈/^׹y滞@`ccCwxoCge0>,6Y޴dɮuj`%_0z3?`@hݶlٽdWT=hZbϚ5Y{ugq喇)oFtR+wť嫫O:ejj`'Ι3gAAA.+ϛԔnggrʙ3g~?իϞ=lX|WQÆu sr324VڢClu;v¿l:{'579n4n/&~c˖_2 m̆&w49iv-+&#A&-w\hBoܸe"##/S__1cFV?,--z5k4;(_hh>gϞ* ;88-k_رc߉U7j>:K 4ZUm6-.D篲ٲu˞_a邏 wuѶCulYչ'.'F.`[/Z_~m#$]|Iqqɓ[^2!!Ab׮]k_^,=./V.SNmv?? TTTѺuT{O@th75kK?ذ/~Mw/mCoym]m>d͞3򉾞Q]][#{eXkkvx 8sj~Esv<ӊVm}sǞ-^ٮC-&'yQYSPO[4aaa?ꯐ|g\Պnv___ hx3g4}UJJJ+Lv#oܸq׮]Vj Ž;?@ Z-Z{wL=w}y"`5ϭ[=hS˷ Xop/5>a~=+)'R:0]<3پGQgϞ=N8@_+Nkj -+r`…UoA{1-?]o(V٠#ڳb\9>&/g_Ԙ#|nv޳j󦗶.~~ѫcVΖeǭ.:_ \VU.Sp袢NMͪ2]>:M?x`_ߴJ=jwo߮5{yyIӧ-ZLܹͯsZ̬?Ҫ*]v}嗤9rСZ_FbzJ-Zw潤 Ϟd ;GpT,ٹtMol5i;WP#dͦl.t LR_}?ӑ2zwkkvD5EXJ_cm&NM룢-[F?^WݩO)1A?h'Yl0j<§ 7 ٴ5ۇz季3V_nq~v@J-+7[;p&RTz|qEiBt\~1oeηxg#OnTYYY[8設-wIyH-Uυ lr?@{@G»iow/1.;ի?YfpZ^cmk[ _#weY3ܳ~ΎtEƫ-][T^ROwZ9s4YqA^^^فCݛ>uam|r˛^fMZZ&_^\\|ٳg?v9kÅcN8/j-^'v&b!Co|};f{FYڿzŻ:zP v:G?=<<>uYmO4i޽F,IOȟbc2{)ALbQfZǝ?.\eȶ/ve.( V?(OZϫ_UDDD MWsN+pBӧ;v=޾1e̙3?ϯ-vq1\F^Yag4sZ[7ڼlϯZ㑻EME>OSgee_թS]F}ʎl\PIS-O ӦM311qww^?!7nHOkR}s>ehhNy&?f +..QOk~1M;4Δ+&ڰx˞_M&#_5N#NXd׺uJCջcii~Wjx|MMMMM:U}#rͷ,:t(44ȑ#VVVoԂ ,,,;&>))I2{m&MR?X Oֲƃ WvQ-ꋅ36 ޴jFY2[dfix\;G]u[ݵbHU&"M@EP*M*{Kpo} qsM ByF83I!ߜs 箩6@YO("?OIm?##G;)@؏z{{S"ٻ0'NL}3ǯNz4sx?R=U`knQ埕ykNƻ /,/v;;*բ9HLLiM*α0ԔZŋs^ǎc?z>|8z(ԣ15==+PU;'EH>gce-w8r@Y*YYY{{?ԙ133B~ݯ.//Oě~YY$wMjjjj11C%++k*98vIʽk 122Vnnnv1y...9KRRR5]]]uH@BaSI2#sݱ_ e}ȡ;ksłwnV2[~|M-nZ/f޽?~ȱokk7onܸacc料ɽ.9Y|޽gϞqOsay,ZZZ+"?w5!9q_26\( Nr0p!QEVv{Rޏ)d"JDWEqݛllܺcw|W졲y[&Foc ?+ıEEE|R%%%nMoo/QۛN宮.KKˑШIKK>gp???~MjY}KGXǫ2l{kXoloq r:Ɨg0OCCCppXWJJ*22X*++lʊc/++300u2@HH̬DRn[M(H.Ty8>_:[0A,.[_ ͖[֛ws9+S-㇖cg޽?tzWWWsssIIIll1}â[THtuΝawuu%noWqqǏ?zKAAfg?'猱dlkuUYb /l ؗVӐg~klo!J-222޾}coT?ƮV-.8.GYSm5n5Ӗ8#XTl|gHy[nv!oz>LK袣M3w[@>_^Nj҂~??N={WPP𨮮!Ȼϟޝkn?c eg4uP Ss~k^Xe Ha,a{D^t֕w?0ߊAɯ `?c 5[n555 0޷X}8qt] X't썵mHS#-dysO=wg}X( X$y -kt =2!Omp^׭zk[> ~_QOILL"99lF>O@d??lX,\P^^ݽ ?pPSww3p bnqiG]^WE WJ~x+Zu5o]P~"[q,py(Cl?}pgTm︈{q_/gr<'kY_$ѽǵN9~Z_MXST<=^$ ]BR?Tww &R U!-[ QW'"Wop:[Mm.9]U2 'uUcWkHsofv_^n6X+6|nH|iVKw̴l HXA 7L[Yw>0oFEF>#W18:9]%!ydG-fm\ßDf)3胟&'͛0OOOQQQr8p``` U ,!NNNǕLK[k,zJFqd¥DbD -]-9[0EU'%$2K'&~+}&&_ mŋ:$ {Cfvn{9?|A91YmE-kmCV,@^g9IeCoݺ+8t:RRRɁ /@B66mrʴ)-#sܳ8({)%C uK 0cfڬمl!EۜCk7?HUHU6)YEGDCE_Uw6HSz4&`orayIRɎG$Iq;ilPJaFuS]O_/q۷ƍ֬Y#//ͮ\XXHSRSS8t;vR#:]\\C%->}ʪ@*[XXݻwʕz/Lv)@ ѣGYs LgLza+? q\yk[&ڶF$F`af߿,_k~5&)CjB^)}44?c1Ʌ@| Eabb_/ZGbbb .TVV&򗿐-ׯ_g7hccCJIIiΜ9$ QYÇYyzzzWꫯ>}hloQ]=_$~3?K,޼yk'QPdoi8xz|P֯ջ:7wpǴ(ǵ*JX఼YY+Zn]`ڬϸT6v4uն2 x\ZJ p]]ݲe~ᇖ֖&vK<ҧD/^ޅ K.e0>G+vo:::XHVt8U/vshfv2󊹷úhuSٳgS5:TVW9`P @>g =%yDabRbҬ4n9x:$O ?,'nfffdd@>dKXXH333qUR;;;$ ?+))544$[rrrX:th޼y444HVļ<{$%(&=t5A7r((SRlݝqJU&&&S0)@,8>H+p'XXX͛__zE~bWxX!aEll/СCY+X?-yLMMb`hjipA(wQ%Dۻ;s~ v:www/[믿.))!FFFEYY(XXcM̝;ÇþϟG[0$;A]0?uꔧgMMp# b`aa;VJbnjQui]KA'ԧ8,Y2|EEE/oذANNnc~}Yc 6nܨFoŊ,`2ٲe`zmۮ^0fO!]O:[=9MU=[SgC;31&F""77Єu꺺juss@6f%ʕ+ ._|̙ ㏭]H A/// 6`25)/&5_N>M,PP tzuCmRƻqo#"c߄ʒTZUO`9UkOLYYYSU@rFGG ˻[?/&&vD1XRdf0O~UC?(yҥ.]D0;;?#_ ]]]3'=*M>*$$XǏ[~/??RYG`>|5``0===>bD ,}28ydXX+(OO<0c0o޼ZZZÞJt=t]\p}68.fKEE~8?ZW\\L9>$ s%%Q۱'TsNNNh< K.y󦫫~cc˜>yNK:,,LCCG wTYYIݷf!:yƍ^N嘆 H4􁂳3wooovW^5xꦦ&E9j,Ɓ:i5\ªfnnN=D$϶Ϗϛ7رc8QO5}}I&'s67&ϣ[nד-'NrVV,T===xԯ!?5t/^os5:u xa~ eWHJJ:2tvv6& 111~ƘDDDpo$$$O;;;AiiiA@V?3/ZѣG稪… $DJ ̤vtR{-a!N;X~744z?ёw9w%1 / MM͖>SVDl Ai?s!a#(ܽĊuuu+EEE`0>|I _XXHM(=sbss3|ƒ80/--%Y[[]?::ǻsuuΤĢ)++|YwʹREEw{xxx"MExW Fzz: sX@rCJ a𝜜F:Ӳ + ^~G6;\RW=޽qssF'I-8qDwGQSSS9"))5/\]311qTBƍe򃥥%N5]ԴZ1G? =n߾͝B`3#l?Gc'FXXGB?5v#שUUUSsw |||{9NrG^?<w,0q'Q;N gff6Fh;>}!>###M,tpOCY(ÎY>ydcc#ݰ$|VKKK)R hkk>'GH5?zxx...[qY] &y;# ?4S g9IbbfI񠠠Q B{Hn/,,R=$a"2QQ]48ꤔ$vY'q&OOOީ~zz:wA7npX@P+񫢢"OOϑaciiIݱI$Qڵk=Jzاf@ W\G 8b?5[===? M0n1 ~b@S}}}jQAPJRSSyPV㇅+ꭖ??''!ۨOI͛7S<ԁC_~n!aŊlnܸ\d=,//O[YY9gUUU̻5]]]jQ_@OO'Jmbt:{q?1lyq??O$? 'ze|K'/AK,lXH)Q>Up;Pn].ٳ1dd?33`yyŋׯsl/ ;;[ ~>E?n ?-X?`$..(n~!)(#͗isN_H.,, ZZZj&&&  a9& sh6nLMM|&LMEEE;;;ُ#  h-#ߟc~[p r..._9fVVVcZ1 ,Ͱ'!+?R-\95?777eԉy'sVP5(5J% |1nH/K.+--%߯2vN:khCCØZnllc*);?OHH)'Ι;q-}I*!g[[[!6(++;p/[PP@2mmm>%q5”?_c`ffFD]^^c Ty;gΜ.6;CzDgGG###qT >K`` -x]Os4D䖟^ڸ;:ciu+**DEEGmۛ,?L ^ :8$%%[ 9s\R2KC?ׯ_SVFjwwwmp6;?q3AWSSL?;;;ɡV{ѣGyLMKKRZZ >c0/mQ B%$$8V#^}Ց$rΑvUTT4l~ ǫ#39&a<9_,--[ZZ?.[l4?@PLsQaϞ=#O7$$&%%G>G2O8C~vrr^Twԗ}}}G***^6ihՀtGwg*** VRR///IhmmMOO'HƒW\)?&O}֭cǎqLςpiiinnnIIIw0%$$VLge 555nS<#ׯlg eȡ[l:'߆5qᇾ>~Z8tqԖy2}`aa17æS!hݩӁTgM1xdخx ONܸ/?@E۷:##c;e?;?$$.41= 2ѭ͂`/Q=vZ?k jDDa}533J,00 F`gw>dK~~͛7Y5.\kdɒs={^O#_}81Rv嚚 7&?\t)1SۏY<==IdJUep'NrEEE%fWNUUU~%{a g,5㈍uTHHHHwwUݾ}͍|8}||ȎZZZ ujjj@B;w߾}5l ʼ"/^;2㐖&Jy$:&+`ŋϞ=7O,a=6-ˌj0'N066k0Kz=t5~B hhh|ζg/ggg_Q  ?FOuM-}}5MUӢUEow@^Sn ;6;K˗0}S`7o|4)t?>Mo'_YPؖ:1,9253s'+ ̔nt3339ְ+++ȳHeƔoC[N)?zP[_=-uO^V~Rr㣑["-.x4/ySFܖ>F7B?ߟΝ;VWWV&񂹹9_ 2_͜9sȗ͛79gAq򮼔 6j&/:z1^¢r黮d3:X[zmw}5.iO(544p vrrz/RRR]~Oi1؋2>eC?.;gޭ*/(kh*jIw|aPLsɀr/&ŧ5ogJib"fY݊Utfh^Pa  F\\%////g I`%KMn.%1Ym*lV_t9ms:z'gbX ?ŋ>yFSD` 2*4|vkגBzN!/Z)lrBww h?x݂ߎ.Y Oj!M6I(cWIVu9̜qHZ/;v쀰 @lٲ|r?yVk1Uc0=جH?mǣ"Ц*  ?kW @6l?KY}_1Mc؅݌Ő xD0X M Mԗ9@"}CEV[:ߚ^z'?fK, b ?Y(?bvӎxߧqgܙ[_Lzp"+%)k Tbj>;"rJÓ1G/xx5y˿t$MMԇY^*ޡm8OݚDL)=LvrLwUW!/,?g'6MDvȍ/9.muҤ†T߿@سgϪU?Q} Z4%ж_|D;0y6K۶m6͛'#L s<2ICÁ0oL(?A\EDD@ 5?;m9_{b&t؝y@& `nL{NR?LfO0M^}މґ̡3[۷C [l?14v uG>G˟S$'g0?;S֬Yy`Z eyם} wω/4I)@+VI/m"ݔƠr"_KJJ~.ݗ@s:L?5='EO";݊ӛšz&qC$%%UTTt ,b =矅?\>{JeW2y4jl髥O[ 577OJآn}ީjάV֭_tݻSgddKKK??U ~D{Zu(Oh W~;5 gl7HRb}@M^zCs?ΎH_[[}+WƲ Xf ٝdΙ07NZ(X0dþ=2W:.5n@?5xb/^hѢsoڴiܹGO8Av?|===?WCCŋg?ণ.zA;iev ] GI4{y~jjjX[BBB`>r"3'Npssc|A݉y('^:W6>5V3Kf͚5޽ܷo _[[KUTTkKuL;wyfzzHgM +=|-Uܫ4eMwQ@;1 O5-rvvf0bb"ceeEmlTUU?9 9XtfppE ϭe#. 1Fo랖vd4 *+W$WGtttEEwXArA#EEEչ0ͥ0C,lϏ9s?/+(X^T!(8Țڲ򸺊䆪ƚڬ溜ֆ¶m]ݝ] =M=-}}]=tzkMMMMDiO?g۾וVM D-Y^k\u1 fN:5b/**`j֖4rYiii_0a{=Gx|}'bQO%dby.m@Ÿg_*'&RK H JN qk7iF$6Ɉ1ˌ5zkw3s4dt+/i ~x\Ό><)}Zs4(8 EC IFCMu---埣ޞ?΁n:DC/ 544lܸ6͛wQ''b̆|"3 Rm} =h<٭.RԦhys1֊؞Q]W=Ng)LHYY˿{5@{Μ9ofW\d 444 kkkBEM5iMU+*+֕ԖD-* RIey~%9>%D<3݊21&zz;"Dmss,snds-3,3$#8akpwa:))!I%MxB)>t\[DIG?"hϑ7D';C+@J8y C!g("h(Fr0! K$?!r" 'V4DN9e[~B.y%m\m۷ob34xu{wKmsUusYEcr"}um} ]=΁>:8IIIMMMΝ;Ǒbg``sNhTT.III#QmpJc12]}=}ݍ=]-$j,lk(hmnjhNmJiLjH/+-- ªB>De'%9=?fg>.pR\{f4䘟䐟hGD:ފks534#JFQחS#.cD)C4jbʟѩby&'+XQ :@Ǿpn&% \iD-266 E "~) ?WdB?̵1 1Kminjnjj-l) >7okgD͵5CQr=>_0M:}=gG)ө B1c9sl߾,66oZ/$quuMKK ?'88x|j/0mїrXG櫯&# a 7o(= HHHܹs'//O(Ԕ?Ȗ-[?4sInjbb-t-Sr<?tɓ'tRUUU__ߺ:}kS,?Ã-_۷srrf$*SRx?Z>|Hu˖-FFFo޼aopj\osO}2k `PQQә4y4oTbyfI30޼yEEE8 9sXZZ?300իpo߾mkkaf??????????????4mЫAB ^]ljc?ťW{OOWo_o?} |LϟNgnm/oP_W[[]]]3<<}]mIcsm;z{ȫō?L[?&.}mqc &y$zf'zLaI!/#y~fpaaBYUA}sM[wg@?3׿]?`t.˪ - s5 yvv*Зq//Ž2JHN┊.@ TY^^;-ٹUTDtoT!_3&zrWNa|Y]iSW{@?]D'W_ޤ+itc3[a1[xvxRT¸^O,Az?EWi۳,GihH${T4׶3`w'_Og5J|68_pls‡s-Ok=>n}eA]gk7}Y@^A ?q_Q~o8<}oPbJ~(}FogODžj<2I!s/{Ghx_Tͼ0, ?L'ſoaEw_=~|'S[,9S$"(+SR=&/Hs>ߓoB%z_C`?@PP'W,]/OW~u͖~jIz|it;)Lue M@4D<j?*Nlm@ CQ?jk?X_[qUɭ‚KS#= 75-%_q[JbNx}rk]O# &{,JG^)FJɉ(/oc00 H`Nɶ>'ğnnҭUUkRYcUՏC 3{n{=3oB$Www` ? 5?F2ǪqAZk'@j겠'Oxq 2reYt^ݺpOM!ٕ$"^^K-ϩjF?c0&{zo76T[cHPsÒ[ddZXyJ>(H.:zmUկdROﯫ[A~~"#pW])64qfifuGKRA]3} 3{h|s_/wɓ^TSü@"ӒNrkRw?%cje{S's ?ƗDxO9曝F7犋w}(ܛ"&+!! ۶Y>ȣ/_ a)bM&i<;s7(S`?;8?>ɨlaXS#BLhOX>2{8UXSuj%^nntO%*1CByk]{?/ ׿_ hr}z-1VhkoJʲ0+W,ɣGR&+XY&pODFJ}WR4 vrd'6na_Q/  $dñqXXخ!?xL.ۃ4O}?0M@eOϭ/k;'>=Q]:*jKSOUU?VVۇ½ ?`6{ nO^ޒ~NWX ~Ĭ [3 !!YY?57\Z-5Q!1lS(0*#]Jb쉱*EE76.e/^8u_/wB4}Oy>9)@ ,~WūVTl[ABR""sOBYygpɬ Z-t0 #hynpd ?n QPS}͚l߼Y]W޾]CUU?KU9/,YX@D$Nݿ/ahx(3WJNK͹DwIv'Fmhljm}w>UqUddYԬ..|Ss3^@}=scEƏw/#-Kx}nZROO&ş{bi㧛s%n]ON8Kmωg?B%;"x]g% 3wI~{{e ??ԠqJ?mag kpj៥?3ğ+67rCC;F鬾 OJbJqq*fg/hi:M]mNym ;v])fg.7TR 4Jz߃M"":E]G;C.>NB?g..ꠤI%eJГgK޷f"T]Ntmwn~~۰{ڧo_uIXkej taL~sknhWڳZ3uigaNf Cbq5kI `4/'e*Com^HؒdKg,;l>#g"#o-mm{CY{D #+\f˿]yjOp[dU6xRAqI[1w^O%*10[OxR.4/1Z縁;XflJ+YO~^6}+hXZg\tSZQREk}?Ow5 o*\R;|MbN5luU w,?gA̢-Pgf[̏UM'???Q-O'cN~O5马WL۲=2ΣsrlNU6?jV뢒yys կpx.f;?*ͬh?3S7ݟyI^{z$oAⒼsskz#?࠹pdw_0YJ}/`T'HJJBTTTII*""?B} @ImsnG;B&)TWL/+kc0w={+s!2X&8'AfQrEK]{"[nezҥ9s戈_oعl)(=pQMb{Uz``T `,ZenUQ$uEDj٠j %U 6E[^a ˌ0P1'D?|y{>F}'c喾}/ W\qFs_-ILLTgnݺ%w:sTmmmNNNff˗F2YXXD!G+2SVVfjjjںͽ}˵@FЅ>|LX}_ faMq?;6yf7Ϟ>dɓ'G3˗/ +((pqq[&gͭZprrZb岃ãG9s,Y>8Um]{&W1k>$Y;mI~GGGO(Wο1yJuuw;FSI;bݺuj{yy'%%֪?|pnnÇ>}zYyIHHի@敇Gs)3&޽{ LlAJxx}ugaWl{t`۱5Y/6>0o?**J⼰PQ+lKwصk|;v(3OΟ?OYN-&M~?lKٚу?;~ߚ߬_+T;/͉ .ʨyQCK}$k*6 dNIIfs*g.ܹQ?owhx"g;32:5& MwZK?-[wvv~wp{,%lK|ccc^^lTVVʤwPPo=61'Zv`\=EY567JtFآ}}}W̙td왑qڵ;w(g Zvll۶mѢE.o${?`xMRd?_lÖO_t:͛7[^ :j*OJJkLL2zy*??omNWG ۿ"_Zv2 <˸[m1ix_ZZtsƌ===ö6yh%%%0--M>^rELLLStvv?mtFpoIeyuߋ|=Zţ- cGWg#k~F~oW…/^LMMptt2?qncƍ%ӍF,_~Twww̲e\\\Ի _~] 4@?\MQK\K`JeL^;#ކ-o5k,z]O:ebÆ 2ȳʫr coy\޳NYVV6rnAe^f,'e?@)%%%;;*.0)_ F]&Y)?m44(0@ٹY/s̯^hps/,>ia0?]U1֢BL={6 []'220_޼yz0_@@I0?@?@_Z]_b`ؠ188H؏/^z/Aqchh /__bǫW`7`?`C. . l N6,SYLC,SYL0Q`Ca _00!f3lbhhlIo@~fl@s~0fԷ?=~/i< endstream endobj 961 0 obj << /Type /XObject /Subtype /Image /Width 1024 /Height 603 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 9161 /Filter /FlateDecode >> stream xwDq޶.{[bqu:⪣w/ZE8 *7]޻IrI. fG_{˓xk'O-"c<_oݦbovٓ -4|\hq^3Ь~nnswqC3?F7_{[=;.&?Q.);aKʪ{wʭX`OC;5ۖ?vxp02>蜽~c?1`}'l~F]t[&%?מ|% =xG/X%#2֩m2/kQ{NR]%`{ikZ]9U?tS~蠚K+ ?r2);\Gco>h)d>a3Soz?(cyS~+w \nj 76|ĿJ FU@ LӃ+vFIÚF=r k oRtOr [/+">$}u y~=_p  ere<\A+ o…ՏR%\~v\oGIx/JkQy `nb`~P^y6;^JxP"_FW%oq7<7&u-_oARP7;֡/SvSd(+{4i{9)p;e^V>| q̃IۋH3-}ajI{gTzx(+7|lvkkvO߳KVu̸;?~P"渔S.SRWJΟ~I[u_qguY[ͷE^O߹WreN,XgR{8o&]Zp߅-v{dVj~P1=-~5? yaz@/\SN<`x@͟__ed>^?'wyF89b @ ?уkg5ֱ؎Y/6,6>d֭ v¯JɣzSwi{^59W/:׎NoJ$mvW|b &?Uͬ߈ϭb?oŞ%ͫ Ki~Xclۦ9nO?&ɵju[e[mU-sn;>N>64Lֻw~uջWQY; F %ꦫDa-sĬ[%A: T] l>4mYSϢC}.ζ.κcKl;Ϝ*S΍.9 Z>Yk296a„)u5_ĵz߯䥅c:M'?1';|_w%^5Y-yV+|a1~l!bs8Iu ^IpW:eG=4 ?oI5>X6a{ro||bU8IM6]6ȺF 9ð֟ \5K@y5\x'xݮC-?Q9fޚ~2#unl;\X_teٻ~/fetzNK]Ϸ7^\_sB5h?9ҥ-u#+Zro_$^|&izky՛ I5f?鐽' )z~2=mRsm;<"mUn:,Soj5^{SϷ`i9,*{j.?A澩孲`tN} 렙/ѿO"UL.~>av;3x/vA=xbJm)$l?8h֐-}b_x3Θ7K>0wdI(9f/Vv׿)W n9/kyӥ3=@TlI~MMY;u ֎ziYG'_h<\?gS*ӿ)Wl "tOZ/X5xZxuA[s럒a1&nݶ#ZK#~$p̃^ohCõ'e65 SqDy歟{'_ZS;~&`wr껶Sw' sgsG阴ߡSKy7fr-;ޖGN.u3?::E>w9q>nK*;mvQOYO L^xb3Vk ^U^׿)?Z/snR&J>BhVhbfJ=*^ $N4KgK~}PU%.&SzCU7:c_NkSbjMn2X^j^?d…?Ω3cJou;ɏI G=ÿ߇4 +O=? NGrm޲NU~2v⹧sO?G?GпAпAпAпA>h٧]XpBK(Go/-ꗒQE ~$,x\9c׿i_1)_onTr?_׿_%8?ol{AP/?P^~jpw,#Jϼ{OhuB[T_a=?7&X2vzjp%_FCVݳq6lL4oPC3Syqvˍj8t%_ͬz= wO+bKpkAgVw7 BԿ[?4՗R\b i;M ^b@`ջ.N"F.Wm+Vׂ;eSENem/O@dK_`lxŌ/6Qeh]F?[[kO_;m!~ToE|o`qU_?*ӿnFzOOV \۴^Ԏz6 GnX/.xsYsgu}n{wǞxg!C_{w>o~nj?iʴ ?Q|+y햋>k3UٷqHub_y&Z9Xt֟a~[y Կ]s+ͼG-5]󚵔?ooD'y鷰`Ck~G_FMZ%jHxNo_›ѳcN^_n01<a\:%L|Ggzk\rkEfk!;[g4ˎUr]pKc SrRꚻgl11fk![WOIO{n\̢w1t!(+J[9If#\rC}N=7+9׾?kW/\o\?wa|&kA A}da{}faLւG&+/[_?_?___G?G?G?G?G?_?_?__G?׿ѿ?G?G?G?iIC8vO3mTgS.wd);5jG?eƽ7rs)1<.g2SzNSZꟈ_ywsusʻn}]as}HD?ǫ_9Kƕ3J;:?ɵO1Nv?6sf=wCy{Otϸ3-`"@ÀW]Sھ;N|pHAS91-ʠgĿaV٫F?2zr8׿ѿ?G4wZGzGkOrURGe^m?w>-w ͦ3ۺ|_5ևCs`hhFU?`1qO?Vu|=if??ꁆ3N^[Ml'cUfoڽ {jcUei>Ay ӯ]n/"x_,3\6Ge?S?׿ѿ3wZB 4LJwIgꟅfm c\ك}C\O4+nfގ7s2닜~524{ʣk߹d*4'Zt9_¯84׼}?oWfz,E?j]歋6ũW{.C4}___G??_?_OW}vkSSMO{5?e][_W;x|3'SN]Z_MwOX]LϾ;?eO3>?֐fo]J̛k<?%y;߿:gANi󚰗He?Vԭ=`1kl7M~/X{'_IDgv~?a3'ck9Vxl'u`"lAcXLD[jzN?K'M\SD WMLDص.xS/aax)cN2L>ʡX>;b'?e,acXGпAпA_?G?G?G?G?_?_?__G?׿ѿ?G?G?G?G??_?_h9d-?z4Lւ1 Lւ6Mւee3B.6fk!Gٛfk!G#fk!] *l٦k~}b@6`5RN5k>j泓u=|пC6Cbm5esӿUfl42m_UY*MִMyc9iہʆQ)_b?G?G__G7пAпAпAпAпAпAG?G__Gs|N?/cGVE~GSLAпAпAпAпA&0o\m5IhxJŻż!nSs7o\ pyC4tWs7Dj. 񝜽OٺN:ì!*s4k.& qs9Ctlk%] QvS3HyAM|!ZV%Bl> stream xun8r[-Ej6@ab1c10N^hA*.髉꤮*zzti&i&=nl7q8>ov ۞$WZ1ylvePGgHwtp}ËGnvGWXH\ax9?%GxOhTR%+' waOCm{M[4La =]a2 *DE*Ɋ|" ǁiBB+lQha 6$)~磝y%g #Xhsh-+p/shyDuw@0-y-GAm׀L ]hs-/(+-:"4r3K,I2%*,>}Q:7~Y'*<3U&U]@DάM8O y#͡*gt,_mx3[&7 eOeyJ_|$M( ?)zFr@y}~ 2V,j@Ze!'54H`_lSX3XH4{*92yZ@Wq^7nM< SP䢫řHL%e>(<|yzPp4RJuuTdY*ڟdUVD, ӷ*v.Vi=P,RP?54r;xUi{FX‚ʔ;8Kg=xmp%"7aTE(`zC8G.Kr{ΜuM,vuu$<R, J1Nl"A Z%81 =YoJ*ƌӺrP2䦟HaOΑ,U K(k;N#;tJ+a#@N ܞ(wT=l't+~2 H܅֫e}מrVi=Na+v,3vMwr{{46t(d2 >elf<^N;X`K~mVZҴI_%]d6Ęr}iUw-ܿr< Z8YfRJ} y8Ck*,m m!X!k*Gm⟞s}z ҵu3Á}a5*DLwz%%]VphƯKF_<1 (C˞ȃTidа,/ؽo2Qei|@r=%+{Co<)ZMAeRÓ8߰$?0a҂MP?3 _TOX'|kpx\>$A g =4\@.!Fm>5gYvM2 3hF{kZ'H3쏼 Ϲ{Hw %|yc)`NFKPg :)/0_y(s=CEtXj' K,]:g̪-wf`sKa蔙.ÅRP㍩vdG&h=S׼E@ٟ7Z>2sbK`JCZxXC"1#wKU'Z ǗMTP]2OH@/₟ MQ29uUy=>č6;I.MܽZ%P=$9!&,3)}с$oí/y`o+l!d!3lO*j[e- U=*kQ(t1ZE4ZC (yR8Uϗy=|ug^XFem>sFIRWx50CMrYiNDDujE律~ɟ,ʤ֚|IZ/(u_eY.U ,1*Ѝ sp{Ўg GN+JvќuzX!uLަq( "b/>~'le {!b  n=OT!>Q endstream endobj 963 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/tree-propagate.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 973 0 R /BBox [0 0 1512.879639 797.825134] /Group 970 0 R /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> /s5 974 0 R /s13 975 0 R /s18 976 0 R /s33 977 0 R /s38 978 0 R /s48 979 0 R /s53 980 0 R /s63 981 0 R /s68 982 0 R >>/Pattern << /p7 983 0 R /p8 984 0 R /p9 985 0 R /p10 986 0 R /p11 987 0 R /p15 988 0 R /p16 989 0 R /p20 990 0 R /p21 991 0 R /p23 992 0 R /p24 993 0 R /p25 994 0 R /p27 995 0 R /p28 996 0 R /p29 997 0 R /p30 998 0 R /p31 999 0 R /p35 1000 0 R /p36 1001 0 R /p40 1002 0 R /p41 1003 0 R /p42 1004 0 R /p43 1005 0 R /p44 1006 0 R /p45 1007 0 R /p46 1008 0 R /p50 1009 0 R /p51 1010 0 R /p55 1011 0 R /p56 1012 0 R /p57 1013 0 R /p58 1014 0 R /p59 1015 0 R /p60 1016 0 R /p61 1017 0 R /p65 1018 0 R /p66 1019 0 R /p70 1020 0 R /p71 1021 0 R /p72 1022 0 R /p73 1023 0 R /p74 1024 0 R /p75 1025 0 R >>/XObject << /x6 1026 0 R /x14 1027 0 R /x19 1028 0 R /x34 1029 0 R /x39 1030 0 R /x49 1031 0 R /x54 1032 0 R /x64 1033 0 R /x69 1034 0 R >>/Font << /f-0-0 1035 0 R/f-1-0 1036 0 R>> >> /Length 2669 /Filter /FlateDecode >> stream xZKW: $qbb_'_::XEԩWWKI/_ԋW+i2rR8<.I{5mI}~>_~VwT_֏ VZo͘es\e@fxC-tEV"RZ6ʇEOz˰F: 4K<\a(:*Ii؍6!uJvE]RסK'h;V̗|96%~2,i(헨k{ٜz(:avq KCTIe5`p!DeIS3ٙTsg/`_3ǧb=B/IF/\tO gȪ9 Yd*k64->m4Y7(vŹdO]RסL'v.{<Pkn%!Av>H6MK#['$A<ԏ& Q[6./VETuKh&;J*>iQG|Ft[EB$^?O/zFVM?^#?͆>?L|}[MRz17.iF8O*ǶMÍ-Q %? r stE h~@p8q|#hJIs4'HqA&%uH"V7ɢ_(":]R'$1b""!YD3Ngmß؍.s^J`]g, T}هN61Ca#=GR^Ħx^yS4m̳bA .-) cdEjIG&Eeў3P`Ï% )My1`Tg7lM9~6ŒB \݅%d| MIw(CQWFdm ee$3IF.1E 3!fp4P)":`NMs չNzln 48[41ɆA/<+@"J'%\Y4 YS/te|хpZϛ t; E =!# a:P܆KG` Lmq|Uº$4 fe/Nϣ>Nc t|DY@VVc&380 *ɣ F"S\p ׎!Y΀8@LU@.a~.VWMS5 VwFExzR(=z\W.U8^`TqgYHԥ4xzt`3Erg^|%,.A1v-^1#FpgN Av{,vh* 7+ `*kע4;!;NB&(vgx%J"6WձDVE6,\ W4 rGR*=E׼ؙR7^yC,[ЇJ S+²J1./Q-²SAsNuРA9/Lźr, D]y_MɦY endstream endobj 983 0 obj << /Length 1046 0 R /PatternType 1 /BBox [ 0 0 253 200] /XStep 3338 /YStep 3338 /TilingType 1 /PaintType 1 /Matrix [ 0.801594 0 0 0.800126 1150.4 254.549661] /Resources << /XObject << /x82 1047 0 R >> >> >> stream q 253 0 0 200 0 0 cm /x82 Do Q endstream endobj 984 0 obj << /Length 1048 0 R /PatternType 1 /BBox [ 0 0 232 179] /XStep 3293 /YStep 3293 /TilingType 1 /PaintType 1 /Matrix [ 0.802308 0 0 0.80088 1151.2 258.417357] /Resources << /XObject << /x87 1049 0 R >> >> >> stream q 232 0 0 179 0 0 cm /x87 Do Q endstream endobj 985 0 obj << /Length 1050 0 R /PatternType 1 /BBox [ 0 0 70 70] /XStep 3028 /YStep 3028 /TilingType 1 /PaintType 1 /Matrix [ 0.800244 0 0 0.800244 1187.2 332.157768] /Resources << /XObject << /x92 1051 0 R >> >> >> stream q 70 0 0 70 0 0 cm /x92 Do Q endstream endobj 986 0 obj << /Length 1052 0 R /PatternType 1 /BBox [ 0 0 72 72] /XStep 3015 /YStep 3015 /TilingType 1 /PaintType 1 /Matrix [ 0.805049 0 0 0.804825 1184.8 332.627474] /Resources << /XObject << /x97 1053 0 R >> >> >> stream q 72 0 0 72 0 0 cm /x97 Do Q endstream endobj 987 0 obj << /Length 1054 0 R /PatternType 1 /BBox [ 0 0 41 32] /XStep 2917 /YStep 2917 /TilingType 1 /PaintType 1 /Matrix [ 0.806954 0 0 0.823896 1196.8 361.810169] /Resources << /XObject << /x102 1055 0 R >> >> >> stream q 41 0 0 32 0 0 cm /x102 Do Q endstream endobj 992 0 obj << /Length 1060 0 R /PatternType 1 /BBox [ 0 0 253 200] /XStep 3338 /YStep 3338 /TilingType 1 /PaintType 1 /Matrix [ 0.801594 0 0 0.800126 1150.4 20.149661] /Resources << /XObject << /x131 1061 0 R >> >> >> stream q 253 0 0 200 0 0 cm /x131 Do Q endstream endobj 993 0 obj << /Length 1062 0 R /PatternType 1 /BBox [ 0 0 232 179] /XStep 3293 /YStep 3293 /TilingType 1 /PaintType 1 /Matrix [ 0.802308 0 0 0.80088 1151.2 24.017357] /Resources << /XObject << /x136 1063 0 R >> >> >> stream q 232 0 0 179 0 0 cm /x136 Do Q endstream endobj 994 0 obj << /Length 1064 0 R /PatternType 1 /BBox [ 0 0 134 92] /XStep 3106 /YStep 3106 /TilingType 1 /PaintType 1 /Matrix [ 0.801818 0 0 0.803475 1195.2 59.855181] /Resources << /XObject << /x141 1065 0 R >> >> >> stream q 134 0 0 92 0 0 cm /x141 Do Q endstream endobj 995 0 obj << /Length 1066 0 R /PatternType 1 /BBox [ 0 0 217 171] /XStep 3270 /YStep 3270 /TilingType 1 /PaintType 1 /Matrix [ 0.801531 0 0 0.802516 70.4 531.744678] /Resources << /XObject << /x146 1067 0 R >> >> >> stream q 217 0 0 171 0 0 cm /x146 Do Q endstream endobj 996 0 obj << /Length 1068 0 R /PatternType 1 /BBox [ 0 0 199 153] /XStep 3231 /YStep 3231 /TilingType 1 /PaintType 1 /Matrix [ 0.802197 0 0 0.803499 71.2 535.639563] /Resources << /XObject << /x151 1069 0 R >> >> >> stream q 199 0 0 153 0 0 cm /x151 Do Q endstream endobj 997 0 obj << /Length 1070 0 R /PatternType 1 /BBox [ 0 0 60 60] /XStep 3006 /YStep 3006 /TilingType 1 /PaintType 1 /Matrix [ 0.800709 0 0 0.800708 102.4 598.532352] /Resources << /XObject << /x156 1071 0 R >> >> >> stream q 60 0 0 60 0 0 cm /x156 Do Q endstream endobj 998 0 obj << /Length 1072 0 R /PatternType 1 /BBox [ 0 0 62 62] /XStep 3007 /YStep 3007 /TilingType 1 /PaintType 1 /Matrix [ 0.801804 0 0 0.801581 99.2 599.276854] /Resources << /XObject << /x161 1073 0 R >> >> >> stream q 62 0 0 62 0 0 cm /x161 Do Q endstream endobj 999 0 obj << /Length 1074 0 R /PatternType 1 /BBox [ 0 0 35 28] /XStep 2918 /YStep 2918 /TilingType 1 /PaintType 1 /Matrix [ 0.810717 0 0 0.80755 110.4 623.963441] /Resources << /XObject << /x166 1075 0 R >> >> >> stream q 35 0 0 28 0 0 cm /x166 Do Q endstream endobj 1004 0 obj << /Length 1078 0 R /PatternType 1 /BBox [ 0 0 125 98] /XStep 3104 /YStep 3104 /TilingType 1 /PaintType 1 /Matrix [ 0.800375 0 0 0.805466 320.8 370.039199] /Resources << /XObject << /x185 1079 0 R >> >> >> stream q 125 0 0 98 0 0 cm /x185 Do Q endstream endobj 1005 0 obj << /Length 1080 0 R /PatternType 1 /BBox [ 0 0 114 88] /XStep 3074 /YStep 3074 /TilingType 1 /PaintType 1 /Matrix [ 0.805477 0 0 0.803558 320.8 371.861706] /Resources << /XObject << /x190 1081 0 R >> >> >> stream q 114 0 0 88 0 0 cm /x190 Do Q endstream endobj 1006 0 obj << /Length 1082 0 R /PatternType 1 /BBox [ 0 0 34 34] /XStep 2911 /YStep 2911 /TilingType 1 /PaintType 1 /Matrix [ 0.812775 0 0 0.812775 339.2 407.740506] /Resources << /XObject << /x195 1083 0 R >> >> >> stream q 34 0 0 34 0 0 cm /x195 Do Q endstream endobj 1007 0 obj << /Length 1084 0 R /PatternType 1 /BBox [ 0 0 35 35] /XStep 2899 /YStep 2899 /TilingType 1 /PaintType 1 /Matrix [ 0.816988 0 0 0.81676 337.6 408.388253] /Resources << /XObject << /x200 1085 0 R >> >> >> stream q 35 0 0 35 0 0 cm /x200 Do Q endstream endobj 1008 0 obj << /Length 1086 0 R /PatternType 1 /BBox [ 0 0 20 16] /XStep 2872 /YStep 2872 /TilingType 1 /PaintType 1 /Matrix [ 0.816077 0 0 0.812889 343.2 423.168628] /Resources << /XObject << /x205 1087 0 R >> >> >> stream q 20 0 0 16 0 0 cm /x205 Do Q endstream endobj 1013 0 obj << /Length 1090 0 R /PatternType 1 /BBox [ 0 0 125 98] /XStep 3104 /YStep 3104 /TilingType 1 /PaintType 1 /Matrix [ 0.800375 0 0 0.805466 314.4 118.839199] /Resources << /XObject << /x224 1091 0 R >> >> >> stream q 125 0 0 98 0 0 cm /x224 Do Q endstream endobj 1014 0 obj << /Length 1092 0 R /PatternType 1 /BBox [ 0 0 114 88] /XStep 3074 /YStep 3074 /TilingType 1 /PaintType 1 /Matrix [ 0.805477 0 0 0.803558 315.2 121.461706] /Resources << /XObject << /x229 1093 0 R >> >> >> stream q 114 0 0 88 0 0 cm /x229 Do Q endstream endobj 1015 0 obj << /Length 1094 0 R /PatternType 1 /BBox [ 0 0 34 34] /XStep 2911 /YStep 2911 /TilingType 1 /PaintType 1 /Matrix [ 0.812775 0 0 0.812775 332.8 157.340506] /Resources << /XObject << /x234 1095 0 R >> >> >> stream q 34 0 0 34 0 0 cm /x234 Do Q endstream endobj 1016 0 obj << /Length 1096 0 R /PatternType 1 /BBox [ 0 0 35 35] /XStep 2899 /YStep 2899 /TilingType 1 /PaintType 1 /Matrix [ 0.816988 0 0 0.81676 331.2 157.988253] /Resources << /XObject << /x239 1097 0 R >> >> >> stream q 35 0 0 35 0 0 cm /x239 Do Q endstream endobj 1017 0 obj << /Length 1098 0 R /PatternType 1 /BBox [ 0 0 20 16] /XStep 2872 /YStep 2872 /TilingType 1 /PaintType 1 /Matrix [ 0.816077 0 0 0.812889 337.6 171.968628] /Resources << /XObject << /x244 1099 0 R >> >> >> stream q 20 0 0 16 0 0 cm /x244 Do Q endstream endobj 1022 0 obj << /Length 1102 0 R /PatternType 1 /BBox [ 0 0 217 545] /XStep 3644 /YStep 3644 /TilingType 1 /PaintType 1 /Matrix [ 0.802157 0 0 0.801357 139.2 119.435024] /Resources << /XObject << /x263 1103 0 R >> >> >> stream q 217 0 0 545 0 0 cm /x263 Do Q endstream endobj 1023 0 obj << /Length 1104 0 R /PatternType 1 /BBox [ 0 0 219 33] /XStep 3127 /YStep 3127 /TilingType 1 /PaintType 1 /Matrix [ 0.802647 0 0 0.8065 153.6 392.760352] /Resources << /XObject << /x268 1105 0 R >> >> >> stream q 219 0 0 33 0 0 cm /x268 Do Q endstream endobj 1024 0 obj << /Length 1106 0 R /PatternType 1 /BBox [ 0 0 234 77] /XStep 3188 /YStep 3188 /TilingType 1 /PaintType 1 /Matrix [ 0.801789 0 0 0.806319 952 285.288271] /Resources << /XObject << /x273 1107 0 R >> >> >> stream q 234 0 0 77 0 0 cm /x273 Do Q endstream endobj 1025 0 obj << /Length 1108 0 R /PatternType 1 /BBox [ 0 0 234 77] /XStep 3188 /YStep 3188 /TilingType 1 /PaintType 1 /Matrix [ 0.801746 0 0 0.806319 955.2 62.088271] /Resources << /XObject << /x278 1109 0 R >> >> >> stream q 234 0 0 77 0 0 cm /x278 Do Q endstream endobj 1026 0 obj << /Type /XObject /Length 72 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p78 1110 0 R >> >> >> stream x x@ b2!QCcMtCxDh/gR/1s:nW; endstream endobj 1027 0 obj << /Type /XObject /Length 140 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p12 1111 0 R >> >> >> stream xm 1b"{_Y@+ /Xv,ķԪ~?-vy:'1_ܺ#f̔ #k@ +p %4" XJՂjU͐ 8i#f'ϭ_> ; endstream endobj 1028 0 obj << /Type /XObject /Length 140 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p17 1112 0 R >> >> >> stream xmK DbN`ClEsiԖ_"Fycz,(Ë ,f{uXHSDOf OtɏxcɲY"E3nTSh$)$D{Υ/9miS&>9 endstream endobj 1029 0 obj << /Type /XObject /Length 137 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p32 1113 0 R >> >> >> stream xm 0 Cȕ,E3B`si6QQHx$_y.}E|&2,7Mxp̨JV(8),BlfJ:b轤S%\ewy ~tܻ)|8e endstream endobj 1030 0 obj << /Type /XObject /Length 140 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p37 1114 0 R >> >> >> stream xm;! D{N1'06`0HB4Y%aﯤXX)J⍬O˶]+ZƂVq.pj8JQ*Z!ըpf%fR6I % %bҦ9P͔m9-~4̻[8Q endstream endobj 1031 0 obj << /Type /XObject /Length 137 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p47 1115 0 R >> >> >> stream xmOI0~$әt&'T˅ h/8!N-鹢nw5luE\.[cI!YqCW\H!sYhFSqHvJ;aQ%.<"/TF&"[}Gw-JϽs8M8P endstream endobj 1032 0 obj << /Type /XObject /Length 137 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p52 1116 0 R >> >> >> stream xm 1 Db*p؛OP*sadhi,{f=~yo(xԲj9Zr:OdQD!ƯHĚJ= ;b遼r ѰGv̄l>7 endstream endobj 1033 0 obj << /Type /XObject /Length 136 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p62 1117 0 R >> >> >> stream xmOI ycEu4jKr$zx7eٶgE/eԲ.jFYőb2<+)kL> X`EEHԾA{B91OQۡg%`?3 l77 endstream endobj 1034 0 obj << /Type /XObject /Length 140 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Pattern << /p67 1118 0 R >> >> >> stream xmK D>O`p ܢ=B4jKF ,|2`ޚQArlb|aWB 6C1hy7C\$ ɡXd$:IX#بh\ƈg aT> stream x][SSٺ_껏T-T!D \E@ Q[{[A.r͝$hP}ʲ/p7"ݭB&5B֚c~s|yI#oP!8G=Q\g3}c$SU[UUx%vΝ38{--tUUMq^e}'w%˗wUU@QޕB:beuv,7h퀿[`78?l3.]$J\~ҥUUor.W˗ t5^Zcű{A7q(3Z cuuʕ?]*oWW78jb_Ǻ;l[tAoc{(ż+tx"^G|3C;lelrRXʹ755 E=l8!C525;n%ONbt;ܼ_]v$«X޵> |u _ l R`XM+/[W7N4#0 DJ%]~6<, )KA [aHbPf:9vf|^az<ΠmF\!l$fmCltuFE Ȯǃx9ccK <601p41,޹cpz8)}|M68M ܼ鑘-_$>KΨR2nz^9w-sp[7nd@vCU :69a |EdݻO_vLNsA |<7@CC:eߎxyX~&H}Hhw=;K4VY_@r>uDQwwz k{wTnjjNM `5XV}7:ϨCC` TAf?ٙllδsfuAmV2Ϩe>yC'F{d\ 4  J^9/bZ2f|+`jJx0==7#_3dz?dp:J Ob~v_z K'`F"!_RH #P2|Aګt!lP(ww'%P%kd"yJBZ<w𵍇 NUWhhi)ѽtE3 ͣ~n2Lz3.vm׮AiCo?|:D7{ޒ\8\pl7 )SYk)f4?x>Tk0ĉ_tӬx#)?0 >TVoҒf43Sh-u-yS(  VMK&$=6y(E{=HYUzJx~巇_~׿Nobj쳞*WyUb+T;F5 ymVDK;pۺ:Hzl1l<sipfv~U<X[y 'z̑{lޒX3Jmo[/UGj(C*zjBWn܀j[9(o oTÍbDW&[ukypP8O(UeS#:7Z .;V\C?5o0]w$= 8^|!$Ώ?Χ~=}6]nlGGʵ~+LiRe,\پgm=c({A+Jwe<x^L]'|߽xQ77)ʛ bU|(+F51'v~?t՗I~eG͙_ځh"eyv畤[>p'{Rg(=y7A`u8Y`m6>$NK`wKj;p!==lGG/|>h^}ے4ԋ dRuP0j9ˇmc8oPO,URgl _# v#(jxP8dٍ%'7XT SL4n_U77 XS;+""etRg#9΋M}~w.feO6KD4)VT mT„߄2We>Y,;c:`ϣ ߱3 jslJ0!f~dƼChNbΘ~+Wko۹{w :%ҙ po-c)| d/ aZVc˗eۭ>KǭQ/ -AOL,xXr Ny<+58o|(|J-|6>|t!iEYKe_E2}aeAZ½Ggd~bb~rR7{<7}"ߖ:4Ҝ-mSTVvw*gctfߟ?Ŵ emjJCްm NT=~m)yLy|hp0 dy6gI& zoo;[i?䰅tc㎕R*8ՙ pf2`<rS+?U|*xf=<`&_ϣxww&iΙCQtqюS6nlGG296CC?AK5,卡'oU߹:hT->mc{®56/L㯭UgN0b(E"h`Iճ̘zχ3e|@ ,MLȄVfnD)1#>ל*}9e1U8H/ٮnm:JK"SZ9ǎd >hBON.pԆ6)v8Wt ‘ 7v::)X}9ٯ N=B5tf>,4u*ulu&YɖC[G` ::;:6K,{cX1_{1||AͱEZ\:|8H9+US]GAڋ¹p_ GnXT8T82fb)ST3~epF`gjV.RW&DWW*Iq s~[%,U y6YGpOVә%28(KBˍ$ccKuП5qW+SthTn|''*vg0g_kɅ vF;]<^޻Wcʹ478^0=˫ՆE!/B&,,tҾ,z)e 552~BDg^66a2'5Zl 9k}>N3J^v/\gYªvrh$`~/f+*anWW1L0d/]2{^x$Յ] Ų}}T֎^nมtcc-$3VJ{~~j~0(ǺONܽ{eA{C{cGY*Hƴ$caz_qlH|2⩦MMͻ>S]vy檒VeªNys%s_mش4QBuiWWaSH6,|Y[us,h%wL9iYFCiorU'6+Z[ե̜-^&ke9Ih EőygyL081쯺Ke*m-„,O'7>٣i_xQٗhm#9}}R62411ϫe+ç'&Zgsat_ـ]]&osn[GU}Ci?0W~vBC3789FRĄPHi•+<^7z.ZC{ns[KKg,ڿ䜨Dt pi؞S >nm۝&C{ AޠahoP07@T *C{ AޠahoP07@T *C{ AޠahoP07@T *C{ AޠahoP07@T *C{ AޠahoP07@T *C{ AޠahoP07@T *C{ AޠahoP07@T *C{ AޠahoP۴tv~2 ~?TWW͍C{i812:>0׷oB9eKߤ۝6EՁ塡山 C{#hp핁5>n~eKoWW}_~dOO(=/:i 6}~[WS]}(ߟ?W36=l[[6JZ8C{~O? ''AxooϷoy}9[皛At(Kk~itt_~q'AdŻwX~&`p5;D xv5,'eH}*9VJBr *ʂ`>Sۥ͛Ihp8 9۵ԡi}?e}<١+gX1L#H_zzH!{z)]+E{N9XA\=N$pڏas `0%D88y&Р& U&8#^/΋T$~֭ej0M}4H ,JDWWYR,}Y B`N6HCޯE˱ز̷Z# GE ;,֞aƁ\eY`N ؍~6.xڕ9&iepLPGдgv;L82KkIz3j Fʜ;w݌78v5UQKYL530FV%Yz) sZ{۫RVbO&6>,$fetp`W-a?oЊF`Cly<ɣsGxR*}ll ==TkEMépJ{vQ9O'dYt]sիdlׯP( OyѤ߄yes4c ~#^.ܻW J/aOO*IB54}]ݻrk6iQ%\YuS-y`Oo%g GC  jqww&Ƀ> 7c* =FnwpXFEeSuZR<_1 TcМۅT8q.H:ʶÈ{k)f%>fY:G1#Z9|~Y_~O9$d%[ 4l8s+vYa?saL)@ Q2 86F jLulMj g@):TOYl S<8(Qҩp^{ojj*f>B@c:G[NdCGG2YgTcBᏏ/ێ|2z87L=TΎd * ]rZ£8Α󦦂כxRmm`P1oZCc1|-T0 s4qsGb82!-Mԇp?u HxAw@燼RHd:G(lu oL| ,OwzRA۶3 R8nwY Ps0[fYZ ul?8rm5uǓm > .Y~&wcf[Z2^iw4~y+x,G(p8%N\dJR M8L"eM= oI0Yk+SR}\8`K+o~gιyS*y"ϱ\9R63;VdoUV.aӬa˜ٌ㴟slVkSS ?+ uhh|TX#u 7Os0{p4#E8==AYqzCp>.ձuuT$[NGH-h?݋l=\ [e'h˶<8׷D$"t)ԗ3y joOY|[`cjm G<9K,gvg"3zz4o<3[- ><ל})aR12rj"{eop88i γrVԏͳ,O$F>kvnQ0c~ kt#dsI`&O]'%sDu&'eߜ776y=dy߀ZkتvQ {N3e3l^F~*vؔ!z W*R*&V&qV;:0P߮q4-[VouVm=gʕ̏듊"_Vw5%c?v[[K,#g{l<\gx3ê &(|FKlOM}9-c6yqsN("B5 )@Z,?{ ?TW ռ?T:)rzϜZҒcB~!eƐ7ϗ'yaJ`v8$V3#e_ŖlDu;|*5kJnN߉k8Z2]exvJ=r^]S#a# S~ab9> ںX"C/o7yL8re95WDl~W-J7猑-ݙ|*Vz=  N5#큝Q;+cheR=L%v߼Lp$a!FaMNIQŋ_DJ9vIrj- D${ Jsf'"/C >Gſj<'-xRko!'9FuKg`` RJttH ÕykF,w(ElyhΊGc_ #lc18Ep.S,P, \rKl[ʀh4Lzsc988L0u-#[AqK2 Mk5Xl~ck2z|C*ҙ_eeiljCf`!ZD@+ PϖdzuuWf>ntssΪONsZ2N+Q==}}wz1wecXX5{ua,77<iU s6SZYHuryucgg>~+vafxmQ8w$ @3ι~9:zWn N1r >b0wr3̻J8Zytv ay8y'ˆtcvm-(=oy;ts?ݩ_ K9\}=~aIfARAALZa]] PKZ ^;ʭ[uonk*CnJx3]]3P  [b^& E^J>N2_u~Gk RK % Pn ?cSIh͛ zH8ʖLwOHqC8#Łc4`0O#/^/#Fm\Riv9IjTS_T|R?J_?OكK1,h3 {J#f0Ʊoɰ]]2=B!1pI ڠAx Oį%4'G-p 9͈-c(~=H2Kɿ(eO^ f1 | eq(08-% k z3^5-)pcv'MR!بFTK.qkf9ɲ>~I5rgu5uu8 ͱK VFȷdߟopzik(Yr_.!7n~i޷VA&׮AN u* ̟9 x>0S55x"'*^|jbK 60 G/R)]lpZ\85M77orWT޸!n;YTIWU{=J|E;_fw-ͣ?gCgnlmh4]޶08]K)Z[ 92FJ(n6A\-{N#?m=:_dW^;J}<&6qcHFґ)fp *%3\k_Wzla-SFnHޖv iP' "6މ<68E+M[d#,xE!sjUß";?o< hI ~U3UU9ʹWC(48QTOp\SO۾v(s(=ߵ F[ SǪw,h>˿~f;?}x dxg%^UTwCv8β1np5qa>qwbpVq(o endstream endobj 1049 0 obj << /Length 1134 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 232 /Height 179 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1135 0 R >> stream xWSȍ\dqQVUkjVUVVr IJ.I.iz|3]6V_VUSéS8pfdjWa`/S.'zv9c;6l>hmiionhh I/+y3R))$^f$  k\/,쮩hlDVd O޶yJK&lKYuW;ڛ#÷|-|tgC+\|mkn/x| FcE„;]pw7mPUEJnV5åcZZ;%묭ŎY>83uZXH9ښ\rypnzaf&[VܮRs;6M}wJq+]ۿ7́,pNuv'~hlR);κ:·gÜܒFc9?3/TUM[}2䏭[;FY_QNʆ_w@ x̪ӍffY_n݋3R_^}\~A\(> wHeOGd𙥡-[k9 Eؼ>stXQg퍍w_nU*\<koj^X \| _$$.$43pq2&f,%oUk3.=zIn~kmi++c^_Cr;jNr{8r tAnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[r 4BnF-!@#h[Qpn#s;5V_h3.;挏vJ(OLi b\>[JU[hojK&crP*{*+[fJ{c`A[*ͭBw{9@(F; [R^[Rr>6P, CyynɭK.8tԽ po&O\lnebk4^VnI;O^U{v[$ͭDr{6Rr>6Plc+VL0#99~|ltUWO,]O }|9Zf[skWz+*z~"@ӁɭS.(*V)bq# & h@eOӋ2mnU|s=UUj53 XSκ: *R^W:ʾq[Lvc^t{oȢl8;ZsKk6l@z,9y2ѝ.q/TU..)n88\R^/,DasrAE['m\mj6_HH C;; /NĮAp{s;88>i֬a܆˭H$= /-TaBˎC\n?>n[X|qVd6w;7\prKVgKb{i߼qqxpTϓ#ln@(8I 5Ж-*Dь DK%%/.L"-]g|={^XH6v$++Tc7NDO/PYy3XS4:0HJoof,IF7l,)W ƕCpH ls=at xjj_Y:h=a0?[fƎ^} h"!! Hrx,/-OI E=}qr(7DCt in=^|{\hݻ}_҇¼ٳ#G,bfj;wvj(`>ڛL`.Zvt}{6TVfsGCGNOgH54D83RII:Zio|e˼G;|m~N1D}Ж-vyfiKj(7)sJ{SMȑk׺d2ׂ]&)Q^$$ݼԪӡ ;kkKYoll^+zbJ5uh$ƞۉԍd44TU,(xN.WqZ&l8B1ykǎ+_MM>$l-,n_S׾Ϗ>zLqX3'XD'ьͽ߿q#,V99]KIIpdNUb> stream xݛKk@!o!D\t(EJ X7BXk!jyOӈ: @ڿA)6׊< \ /j0_5EXN̓pC-t]G'TJ Ev[5hZݮ.QDd^@6"t\NFWP) :0:vo#тm!BeULQj]Ej.@ܻz=lŢhTHfS輅ʌDuդb[\@]@~%(L~u&_+jKV Zm .WAeTM3, r,R|zw{'C~v-'MPk['۶Nv &#ꧼMvlxhwk;A&~JvGGu칅IdDhq(O`MnB$HHߎ3, H84"[nbˉVxWDxNQ'Mӄ-<[ag?NZtgA?.r+#7 endstream endobj 1053 0 obj << /Length 1138 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 72 /Height 72 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1139 0 R >> stream xݛoGP!>ررds9rkonihJ VJ)w r PCj%TKwk'`'zphyoE^i-ZEVr2L S's4ΒK#~!#Bn"zB0bF(eo>=d7nw3#5O~] ӪRVx⃵[ܶӡv=_źy<{[UʬO; Fr<+ Ta*+s~nx2ʙcOP¼@MB5?M4ȧO4U?`o<0!-> %HA磁rk:1RXצSpYs9&PՊ de zGy׾'OH%)զä-ii lix킌h2& 'DL!Q< -8WXAZ()N 7ڃi5ȓ61O& (*7e}]6;y]RJ]x%\m4hQ穤어-̻ -H,[gJ4H0g+/4W3;ERNV $:'o7 nrWȂoV!ioDu5'j|~0lGQ2UT#2^*mŊn;cJAs)tˋMEqF;%Ϝ.q١W# 2hF|E9tQIԈ.Svڑ-n|b,$}_:M{\2hp:Lؗa5[Yk#M|Jj tmvΪ\BhC= `0D0q:~) 92k,6e 9,!vdCFjĒ@[irEĒrumy7nkbpآ?f%b|B|㥅bs|A>X-WI,Z*ۯ1ҿԸeO$?2`JeZGG\^s_?v%+^4>+MsnTlwD--ѼUWDTWN z_-D"G{ޛn*ʓIB0!CFiY?}.fp2"00D=OǮ{IkGM ȋƲNTKf& 2'JG ,F4뭃yd晇u^FkM3]~SF?!ja恗sn#~3Fib鵔VZu Qw 3w^&|ߧu0$)5*[՘BpL8Y^8w=1,?l,pFX^Hr4xdKm}9Ŧ]B̿\UiBV0z&@MUް;\B դ?<!*LNDh@VVj2 endstream endobj 1055 0 obj << /Length 1140 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 41 /Height 32 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1141 0 R >> stream xkkP~+@ Vkcn묕9/xA7ͮ\ԭM\&iRW01R-] 9P8n-˲ Æ2#yB&I+O4UT3(-Ut+ݨ,S,iL]Hӭk3" 0 Yf l;>7?Ծwz!ԫ}jEoZW Jgdu]FF)҆ZFJ$'IjEuXXԊja =o旛k+Ii5'.c6R{bPϟI/vO20e#>BN=F+^4k$2`~%|zMs%'@ {;qpq0]w>qKD8nw؛a &Uᓻ2Q0/SQ/?H@dHgvg :;6 yʇ 0 endstream endobj 1061 0 obj << /Length 1146 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 253 /Height 200 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1147 0 R >> stream x]iSIol`MdT`܍'pCem0F{TʟfU$h6`T Rɛy>Px wů$:#Bu/^k]T2|w#3J ?: }ww7C BKR]һDO9A3^#n :K)/2V2}k&=_ B+n!lnaD[yFEfo=&-+-nXlW{#FxVx06Q{5wc{ЎA@Ci HdKhw"lcnc0O{ZN~V!cD.ϧVJX+OJA<.ǎ Ej hOiYSɢȧ)J5Zcv¡VGm'2!v ~+I#Ƴ@\ †.wd GN=B'"=#^6cƢc,T>W6cT0 7壕KsͥX5bKVNh /d 0!Wwڇ. kK@l#IC v+t/,iiUŜϻb*kM*A;ּcn"hhŬkJbX`/:8Vg /8oL>4!$vRծɕ?#8E~[̈́:!8c{>ss9= kPf\sfNygL7UiI5@]_2w޵fk,6>t!S$a`w튙y8#DiG\/]3$E I@ԑY,KN{ߜiINZu{3'DݢokxzT0y 7 akXSZYDͦ:mbXseS@ޭ,IWI Q!/BKW;2V)9/6!f*oJ%IHNJGd7c akXuaǼXm(\ 1 ~Bxx;,U: !v<("?H OG<%- W̿,֟qͶ3)bPu~*?$T5>&n{xp@H#MEsa?-^# /"-%-hfV~PO4Ga֥qdgd v Z!MDGHo%z։j~W(pp1MFo,uy.¼йV|$:SAKzA"3Do 6m{%VO۰h/2d܈#l㐲Sr{!`ek9$R W6_JwҘIKiA๐چ8O@C Xf/[S?Bn>Z K#@?@ߴӃv~hf~Śc CXPFNQ!!IVl~r*'.S9|)8aD[o( B۬spvA<XXaa 3hgڙ,14+d?ifZ?NdӬx Pi ҡ$mȋ%X*s\}N{|؎~ mekn;{T"s}C Xk;NZ!=- ! ~rga?,v*Z7{+3YP &R6ӼrqJ|U:DxI'G&3Gh%#p`f~Dfn%>]p冕:hkԳ$Ĭ+Ojt><\N'(`QKc~(o<7M C$6"^W\Z<RS^y6๐3MG[K(3w>H|V.\_Zk,7vH3Q==sی󗋩<2ܬ$[٥R'%1Ύ둤G>YvKR Qw#V#[Sփ:X¹v% LqٟO^s*$UyiH O.IJ tIW o:D~bs'GI&c8z̘L nD]r&m3 %/(8}(og#擇k#UR$]$r@Rܔ+uD~0ZE8/8,^ PTs{-)i2݄g_RRD@H~_=LJXG ˜O:ۂd& #"Q䋠* 4'KЏoOJ,sEv4K=v8p^ x~ؓm>DjB9?NqkƒvɡV|ϊwx IUN~G~荬%&76Vkn,I 8=f;!sJ^A!_ 㓟S9D1.P;O""VQ&cv9oe?yONz+ %JS56Ȳ sB &;ӵ?^`>?9fec('c̣{[ے}~'!q5~F+YY]SQD 8*8I'w2­GE;0UC#v<;Oz8 !s,D%Ĉ5 A~R_y>6JQM3o"9@aC.[rKܫ($L˅?P58=PfPJF椎 ;QԱo GҘЙ81VJ/zB:HH:ԣeѡ??Px3Í`[|PFK [p2Xƙxܖ|mסJJlzO+Y7J2Vo=%z=d3էJ(|% ~:D2<%E TC2S|c[]۝_)“]*dzzx3($&%,S%o QFum%̗cPEv=* c ̒GO MsCOjP^C]=X'U4:XT6i6MR<&f+z̕ "Id~JA䴜F_R@ocX3mU}vͦ^Rw2 _ ̟B!`7Q6#s*plwcӥpY C@# :d1އ}Ik5ӃL7Ah9N3hEG(b$&ߜS^l'}/OÉ( zQ0⮹T$)e kC7ߘTxۊ _ [y&ÃVz}(35sȱMy{o~uNPhA2\}peXtG:&Iސ'ޗ#\K1J(|  ߏE Yѡ x;h ;֎yxliN朏(}ʽ$=Qb ~cOCҶƴ)cE\ AʏW /@ ]uk ;~G.~ı%cEq9"b爝҄ BaY*씍2_&XB2XZs9LT`|k+Se-uDA2αf=Fr<'Lpuvy ØQa<`gha)8\P/Ν.LeKkv2uAYA$$C5p]cC_͜Wp&>l1 2)U$ wɲI;W;cfGX f鬖dA&t}J,nUХ1_A'd#4dAA gP 2d6C<$EH -W Lx+*zi{rI2tirRC4U)p歐6A-%Oפ'q" TaIDϢ^mXT]{pz21v:J(\*'A9PpL7= YarZUdA^C˽~y[ܙ+#g+apy/ӵ9r~"$+yaT<$g1o(0CL0{Epq}V FPARwxD|7=5cQ6LZEk5 DdK{Q˚0b&>)\>{Yrs|VV(BPE Wu9{8t(Oq7"c 45ts 3B? xa mS.9^"t@H0K,mhu?!< eqgw}%ҟY+NjL96G9< ݵ5L9;h) Gdw0qLqbc%rff넃92Wˣ(["YwUCgakm+zI>(K'j 2 5 8|•_&k5_䍱Q5Ҳs*cyFc=A{RA8,g{"e wʟUtDh+8Wôf\L}젣|z'^>쟕Eh~>pE\ nzkƑӞ h J{ip#T`&eޯ Mnz$ !"_&^EhA hhp%V!?t…eDc؜XM$c(T{.YG;+J|m]JԆ&?s1od.Ffyu]*E{+A„3Hb'pOH a=h/+5ةL<1ri~/•CafD-hoMՉAսUA5a齽VQڻDu rJFܵ+SUsƴo?=)9VW|Dˏ>okXFr%e98/(3/\{׽nKK|] s? iadIX0B{k9[͑O%;EoaY^l\*3.On-$X49E65L{Y~)^*+\=Fxqx?㊅\ڇ=7W0rJHޓHERW.\H .t ia~²V/* ׆?=a%d#n( }E{>BB^hЇPWC(+! }E{>BB^hЇPWC(+! }E{>BB^hЇPWC(+! }E{>BB^hЇPWC(+! }E{>BB^hЇPWC(+! }E{>BB^hЇPWC(+! }E{>BB^hЇPWC(+! }E{>BB^hЇڧ֪c-ּgOw*+\/鑦=^'=k 0j\)Z3i/4pJSkT{#ڧǚuBgڻbl,WբlۻӾJ<=u<M{q`BY,Wh/xEuk"Q2s٪9U7D{ oQgfJ[u5Q7b/8"V1Ӿ pk_DDIl%-%3D9^HK>}t[^*q鱆OY׈U$zEi!ڿ]#㈵|qE_q5kc7ڷwan[RW|HgrY2@}z&rNԬ^@]p{<>"~ӌxN%F2\XiϜц=TW.dng"π(+)ϞBU_.# {ɣD슽^ggg >9^<E zl,Xu qzzNoKhp%ne-}fe=ɺ5SsX*N*^@pr'ퟟ=q^f.\H.cNydkV8O^-hhp%}3=N7xÚi\Z"Wj*H9xV hOD?~4]hv|H{$YLЖ)K}fT-Nc^YFzmEhzD!wZvfpz4=cjVBY_r*AmnO+Hc}kziw?ɈA,}bb~gOxCriVvLA@{8׊ WDI#"g}+Mt՜g,D,E2〃T,xr<+E}j,bDKjIPC m;i(B|` cMLWyGwvbE75Kr"¿^Bؓ\XE̺ 퉚9VG@hrYhн¥"B{+ӈ d[9Uj\žsO@i~H"vD'zy-ę9+i^"/`=yw@"G>F^EnBP >H*(\*v -l"nyTŜci]/lDN#▷>ފT9d'<=QW"L*)+KF$W`Кd$TG}UDV!pͮ y¹uC{$j_{ be9h6{.tZG/rUa6L2ВC{ 'J{zAt'jeJ_DJo{29 h2O2W\?K h/C_,xmwBݣEk bu{0́ZŻߐ3q-?z@F/U u%.$+$DsU[=h S$9(Y@5s#]up9n0pmZuCRk/Ar-x+*毅N0ǜ#5u[ ^(Ȳ顦=@Ggk 8$#a.GZ QZ0.R6=\itJ+\2ƑEh,g.Zl0N<êPJd2'RБJ(\HE =z.K ΧS*f&dJ{"pO'}ԫ ҂ʜ,Q eMy鈼$QL U{-s~)t9G_„Z> wy$uDAl!xh@/Aޣm39.ؒ ҐF#?*^D!,K Bן x(Z &;6\mV9~p, Ø+|K GV!I:Д{aoZlNUvžU??%tw~ N.Hѩ X35QERA=:~Q_[A:AzChFSU9S3]#^%0Q%b"gQag}N_vZp418 gLHk*v4#߭BРƞhh 9 8DK3^N=0b/{U2Y:ye93Us,2D{b6{]2 W#4`ƞc8Q5vWx ط-@ cJ6s]K>_RLϯGrA S|3d~'c8H΢&FDEe_jiYeV꜃^ B,[t_I/OJdP,ƠMb*c8bl$KnO9?Gjqf?aQ7B+]p8µV5s~P̌ f"T z[sho³%޿;n97/0h(aFc*,o;(਎YHMNS'w(E :&o0ozJHx8$쯘" _*` Ǭ豪>WF0k(ځ1i`֑|upJaS G,T'nL{EzWCsBfKL?~ɐOVVHD 0QNAe0&"6Q,)Fpm>HmCv^rRCa#.a~咃 x32V>jI[$s-OX O;DI-Xɤ|w?kP\B60#Sܚ V 8-d!S?_3*aOxP%33U:x O0#PG3?jCtΝj)?#>B~պ~&|z)$>M1,ke7=YY#;G >J]O %\K<#U[Uj 4X(|͢=m%[g$<ҷJ3\88|y!LJ`^*d#C5nBleh‹aϝcι(|s,+\]1 -R6ӣMxWm;b#9/֎1X+1I: 77ϿZ5[b>T 3?BEeU!}Q/As Gi#- r].|{pGiK+I 4[5 ]/S,?HD7ԇp7M(>ulۿ?5gjTGQc31l͘Ᲊ DYŨ=M+!.@>FN54PYH…y\c0̣6`d>,Nqc7&M£ĜuJD_uo_i?jʂ8`g)טVە{ўQ.y.0 9Bc^{HU" _;Fb ;_9汤ᑁbA"a2"1.Y_vyYfyyato}G݂;=o /pr+j'-hS:Y O 0{ g_3B;URa ǽ+}dsڣ#Lqv =x&x 6͂\8^AԢ5Ҫʕu͙ ̂c18RV}Vx2?mx>xouHfN(篠Dr u|̹9O]-γ; po,5\bVС^,MYHe%TT.縨`97ii/1|+ׂLYoEܩJOgӛıC ,C Vh h]@^ fv#D 5zwoDrdP+Qe\vRk("UpͺkDzVDͮ32V)rB旸SHO~5{v ˯!ņku>, 8y*6]#.#pt%dl0eԴVJ<TxAnb^T.w3_ RN4t*ڧ݊<*(H$J[h3\I<xz$Qp`kG$}!yC8œGcc {|H7F>ڋr83? GUN>&mmlg8|?^#~ HN+%$C<-922 OJ>b;·h-B~xpI{z2\+9wi9zi$'Jp :;iHwEvo#ȿ돟}A]vjO|L{aE+s ?AJ`cc%B#s44Q濾"Bˏ&E&/ly-w|ŊGNgYG 3yCZp=^t~A4Q曽l:/^?K(勵_;ZWⷮU?Ί endstream endobj 1063 0 obj << /Length 1148 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 232 /Height 179 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1149 0 R >> stream x{žz23]=ӝrp@/EY,G!AdB!I+KIO?SySCȼdII]$"bnD4a,)o歱rpՄ)'4tjk %-+8SiRX͛F49%WFES˻=kaZ4&XwE:P8[\ag9=t+ M,G(w6~fQve3d"!.вGY$(Uٍ_'{WY\U w]ځʢP9GaEjLU*u1<@bYhS}1D6hQL86K,SKv\Spͱ1Lu|S {Xn剣% +v&~qc,fvs6eclB]^)aԴjOn+G r@7ظy9$+ Zh*oy׏_ `Z5ZYFuVlU^67L6{Y)/1xhVcIZxSS{.|UDQQ7z[KXxMVBWj8jZo+bC S_?j\f]\z̏m>6&LNhEQT^{Í;:XXt/xmz[p8u6ni%b0ԩdFb9SS|oyJȒtm?C8𖘮n2yGX!Q9{i꽳+X4<8UB5=7\6>Q}汑^6$Yw䕯yҫ/zOkbY*M(}4UX_Tb7:[&Vk25"4lk3bC-KNZB㭮 kwr=V:Ws(brk.zɬ8Y߽!7+bDi`7ۥR61!1uY8?O_`2RM 5lh]*q2yEhrk&sGO*S}&}BU=gv$Zl QڕFj̙^WWPkCfqk}#w􉽳)Hq$NB{Կdn+scX0u=5{Eyש:-!V&*/Q#q6MZUMmwTZ,BK.B[n\aq%+YR8,zޅĦfÎP;?#QfgzEzx`X+T%s$gCۡw`ZKv #ERm6m&eKkԄ335ө1"fqkuv9WJP;XKW+E 7CiP7Gs?Nʱ&kx-36UX!zB։AvNS9,zx36~UcYZ$jTOkK+TK[f=u w!Mfs3Zʨѕ^*At=)C^^=@n5G'C%Vn,vq30˭א[ (Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!["(Bn!ʭp s;r+QS$Fͮo2xxbQ) }ɻz^`<:;B],;m+T$w ƂSP-Q$qFYj͉ClFcP;)j]V7fĿ͗Bb+֏~buo}enע\\eU#9ǂ0a·.t+T 7 5no*Z|YuX_m[h_C[kr[ ی`X]0wk%bk^F4+n(7n7ٜUN7r;}DJ–MޒXZZuBUZETDZMNtk-t~ Cg w!4h1 ?Le/оCg 4&Wdjqns4gGC[)|K-)'I=έUjB$SƃsPb:yT,Sav38%Sv_ jʞmk^z9+ c,:[U\3m}ƭͅPTʳκǃ=j^js[Zw{Z-}ed Q^+e-Dw.+iv0Md72ٕ,uYYsѻz- (VD_ķ& aݮ~nJU sKd)*@،\׮J/ș^ r!,[{\e@-(xX4;6r6ئ9噝nzRQI~$7ުh^13Mm{/xװ U'R9_eIV+ǰ id5*T[if8kil `aWI6ԄF\r]Z١ǫ`|jO}w4δ&h0Xh7]"SuΡi2 vVl-⅍0_o+bCͽfnY /1 ]y:D =͏n-ae LK[Y&-o(lebSJ /}&Yt[*{.) Ξ23][b4SYQG]x}~_(mhY6y!97%L?xѻE]xcTmbcuӅ}:bml V`N~taef=iI. DQ͗Ve?^Fjfv}!.yG?-H㉣'ZcArbrOo†YsHˑ'ԸpAKd{wս,X.{;5;.wg}nf]IRԡg66 pJ KǦlϞrɻ;xjb5NWGr󉲻3(Lj+qCdzD H`C5<PAw潕omv"ͅrH +ZxKlIBMZ5iɢEX\+ٔGWK1'|iKӶHD> stream x1 Om ?x endstream endobj 1067 0 obj << /Length 1152 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 217 /Height 171 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1153 0 R >> stream x]YS[_y*.C)6BbЀmh%Vjc6^Hc23lpxJ ٦6.Ñہcro›f Vݻo K ZB3+nʲH !poOHխ[@mׅk|ivmm9;t#C %B`9*V+樵ǫV䄆D,ki'by y{9'p8F,x6&07{zhppUȹE (>. =KpvcE flR[ PB"s0HЉC.]"Ojx1q:% !x4m⵷Cwv绺Ǔx >_->z.rǃ8xF,۝usX΢1'n!A$$/Kb҂0% Lm`+E{p\כߟ9P6@@R7 aE5b(0-XYh aS!!yԳ3!~I9EVX ]]%͆H_^`ѨAi C!"?/ "YDoil yDnCf)`ywU fNFLTB^q%}CGG& gۛ^oK: =Iѓƿ М`ozl<KOJG"TeK^M E +pv]tZ|}5~q*drHnqb F& q:(-߾F,$̺HSif9 %SdP'NA_SNj Iq\nd`c2 TE{̠`?mD""4SM{;r*M 팎"rpMK3@=Hxz¿BH^BrI![,ѐ6nFFVGoE[En$o܀k~XA ^HVi# .]ɩ^UkI/ [ԓp $s].7Gӄ(V)ⷴЮJw7`Jg`OOSf~ E h06.ld% w@Es76䓅$T`㈫7 B^<71?Y* 0qY+PnzZؘH:!_e3 RQsU wvH}}%E]-sW~Y y#" UxxGZ8i<iut9/Vh.j5mbI,\gzŐ! ή hL)|0 CzaA4ԉ:y8LY9KF=c*c> GT ~7חB8>N쩩u@ҍƊ͕4σӤmPvgfl|< 7ߟDΉ0Q2z-u͵z<"iDgv+[욥AvW~>#I#iڈ_N c0x?GjgUv٭#~w>̅jC,7$Rˍl1β "8@:hOcwXowgv"'6/FÂBuSCC&&tI, *4_@=ڀ0np<~oo6,fNW_rE2Z99rѱe7{gd$زѬ$_}AR_D 8viԼܼya֣ݼRCw7~^0HlXu*,Q!ta\6׹1:qtV:f~::s+%1CT4FgNc+CHő M1ΈD<Ӻ;(\* eeҫ ;)ޞSQz;D;InϦRz-Qi+I8ƸH-d&Orw08c蓋|w<;xC%DG3S EZU+dyFؙޙ؅yM=7H>֭'Fm6:Eёs͙P( |Ve{W$ڢZcTM6aT:7>|AؕZwMI&Qa\.\ydIG"Ixg.'Jt#{$^wp #EQEXi() /Ԃnw*¼(Κt|[9gwXvc-lӁٳYIⵆ8CXuTZwbwCNK=c-H&KA ShhJ_"7pG/,lC*|ه%]XG\*1sYbHEҼ@ G]Fi|o T W ? |qo".YMcyT^j< MZ^ψI>%J&JTG6$]Lfy&TJt?gznn{N #Js3}4 w<|j42b9]]Yc,ccTQг\MP0$Fu.<$ *Ç 씉7ql0RɁTyAYhʨ4 M?չfSTPE%&YgM󶩉+wvnQ eQRE>d./>N;ތ^L4֛כsNltna4Ӹ;dB!iAYyheUst pl,5< *AxsD˩g\8y<ӧZ hX,aӤXQQAǩ~xG"6ڱ1ח ~]t:_֔%i*"|V8b[Rcc[fJB @CM *w4isNgUkK>g졕6XSGM2EEEUQ+<tK;i*w59[-9 t$=:_*TT FHiQr#J;e?瀇建5mԨ",dxrՒ*Է.hrsΚP:Kƽ`l69Yb?{<{ڰwڀ~`Skqa K3ivNGQeAA- #LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LEE@QQ$PTT0 LF|0חTTT$|;Q? *HEHbƍJCþI,lYG*ÕCo+V H{ЋO0rQ.#ɪmzK1\ OF&g9PEXrbPE]MP0t*"W|9$uHR##PhvÌp%HPx#svND^**rZ?G&Z EV9v.g*]T}ISQ,;pq1ZW}Sg0Ѳw@E% * gJ,t k Ni"6gf=LfTK ϒ,ݿK;T E0UNi="ssBL~TuƲDF ΋(ɱ1}F.=gѩ";рlQd<ͅU-ɪiEpۼ3>Ţ:r8*\Qw.tY/ӳ=8Iusq^@-ٷFgnޮiǓÈH,y<9N6ۅbŗV+9rQDxEb4TTGuE5:K%QL~__i)B m=Q@vn -@ۛ as_: #TQ Quɉbyd8}}PHzä7o$Eiyt <hg%]ma  â",<TDj 95lInl|˓".WNZ! Qҁ2ݩ00}=p*\N(a0TYbO )-;0e#/]:p1zx8)"|sHXXqM܆A`=`@^}(:T\b{v)54*U Kl&3f0~YH:D$=DRp@֌CѹGܒ_;jn2/^o&LE##0G;r2ZQjJp tFhJfJƙ&޸\4č& Wpt'!"}Stґ45 랟F1˗ -4We<\\\ASS܊IIg bXal?0Oh0/H/j-99y!m>5Fg q&4*[[ٚ}EvWno [mx޼0ϞϗoaB(##0l ӊ_tnYcqLGPx<"G%t| yaut@l[Qj0b$|@WNqM(S% `JȖԏ'b;?*v&'w F3i BG|7ˆPqC.1t67؈H{Tf*9%G5c@lթ2,˖ e $CCCtz%9\%4[y%Ox0j\^/ 3 )f!>#Sjטl΋r/VTXႡ@`S q\yTE6Q? ?a!LSn]Mǐ4)"1 # $,p)yTR+Ċ:$G$qL=xؗiw30 <@iЍ`Zlש(!^t}=(ǵ”< !_ $ȁ,l'1ij'n[. kRuY̊"Tggz%&'0 =s+ٞYvF6욫\8M߻[~ςO#M@Ⱦ>p(B̷8dKhɜ\wˤ W^il䊚|-c̓G2 SC $r">T#4_$\!ل2{/eh6T9IQ{ff뢔O^(\)ȌQ_IV2 3Ѩ@4ϭᡤK/4_@Effa~e6665r8a5|kcZ>8mN66''|.[l%I@A*r9X&ɄX|O|kVzG(ss31Ht5 xψ]$GGbZЩj]8_5$TᒑO bm@ o,Nd^o.qd,}-C!%ac+٦&x!ʁ<)2NݼdZ$Wsx( #@pYx}6JNgu䷸:ۛf"ĕB3rPQQxY?T8 e%C~+mmd` w) gzxxy.[ h4)lh{I &@CD*|no8pTC5@aVw>4D1OJM,?/`c]9X-jV"W©v#-yEوL큖~?uV+\`6eQi/G#""xۑA eGIJ)6"8!!E[h<?) $, n88}f,xBW.ۮǣp%%(r>D#Օ, l,YK . ,*ۦ OwyX^ kظtNQ۷_sUk.ANhf pRy [[Kv;A dݻ(OVΚ䡑v=O@òmx*C-_\i K9?k@=R@D7II_Tr E NHyvL{Ynw$ANJw-o^,+h,#<)TE(35 Ihs&^BII\ ug>ut73Ǖ*0X,M!X/Z0'6Jh6NCW_*,BN +\ۮX'#Kܼ)jdV\@HLPT1`C_2L,!N^x] o?ߟ , endstream endobj 1069 0 obj << /Length 1154 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 199 /Height 153 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1155 0 R >> stream xWm%:83Ԍ+ȓ8K!8 1 PSiI>q"ws|q_.7yq<u]uݛ ŧ=Z;+DrArk4ⓋS/'QT/5jg*nvoCǏSRH}uueg3jFFF9эXߗ_NLAi`t߾nEWrLy. cQ^{uI[ee 0X*LzzMyDmw]\--ηnHhǾ}壜Hԝ#GRqD}GELZF_ę.bχ?XI{>l2aFRM*C|~t20%ӧi<ܽ[TÉjAub)jTVbgrlݻ`J;#'2?UZe`HfljQ_Sǥ LnmKt:| f&Wn/}jRlxBDˤ򑘥d@|6EE+OmO"E+Zqz`c( 8t)*L, R4 VU4g@ZV}W]݉eDv xAԲJ3 DlKM J|ݭ_'$sUV?|)!LAnny/}/u չVyW_h=\T :Y+**-h=+!{vE̔^,5CkzjeW_eXUW[/GVT^淂'޷+ ·m 1p,Nm  5]oDAN6!Xg{`U<{#,J=w{ 0e0NW-[~,/ǶuG>tQ*gSR|+nno<KQ`VOed\&FK?.{iWԟؽ]mB]vӧ][2)*+Oij3qlOK`%u5%7AiiХN%uB!Ts۶,)[$^lt_va|ieμ(Ow@oso L錌(ͣJz/66B9/_NV+4ڲe.ϻhgu;G|[[K+:_],aD ˵^sܕo*Z_6 ;Ф0L KCF#R⪔JīŠÜ_d endstream endobj 1071 0 obj << /Length 1156 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 60 /Height 60 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1157 0 R >> stream x՚])Q4N'/KpWa45RRT<ky1oZT,`<3 okV+Ͽχ>>G˞z=v9}nwLXaX, ]hX,nOZE6MO>]cZCk_Z$6Mn=txX,)Jǐ$K|-EHI^c/5J&4 .T:6K4:g̔U:?J8vz р΢'9vf%'XكE3&<͐g"hYdoPU.)I4kQ8˥,0=8,ǫjLaEܝnbUDEvx\4W)´H)E0ED"fz<ҝt~:JČ71a(W . rrHWG"H$Yd2^sU;3E<N:ÒC~V|~8u]4Hns$RE4(%vfvhGE"Sh2 F4  UDSDs6F:]tjU4e?xNj%0f[jV6ni~vdd2i`YBEiڇ${jޓKΧ0_l5? P/;o[HG4][-`8Lb#EQMC%.2N:" a2q#~bbF96 endstream endobj 1073 0 obj << /Length 1158 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 62 /Height 62 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1159 0 R >> stream x՚oUL mKu[vuzYutl"T""(( œ8-%D h$1+>wcuۓOt[~.s'I1Rtt^Ѹ#@"3{dt". KWnw44H.jX.2 >NLs^; rB۹'"y .7C1;+5wN5y^&o$LYr#R$l ,[2ؒ#SMޭSx*m2lFO6PM.ﱿ9Ґ@?Rr !U.h$^Wшo ܛ(xR=x"OgsM+CT+C)ͨ 3n>n0<9 endstream endobj 1075 0 obj << /Length 1160 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 35 /Height 28 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1161 0 R >> stream xkK*A>UQY`&m !(9cHQ/ũ H 7^|۷٦JN;cw`싙ij2)5MSODV$Ye. 5P%`YA׿pƱ* ay!5&)6HRbB,`-uB:gjmt~.]f*3]f^S`=iD@&C9Tjo/()q7)&;e{$-ĺ ͸j>lYۡ q+\d]qKsH !?H>2C0ٹ:NN(0q#=[ C >jkO`QfzM{i?>s5ĺ>gs] xW;i%zڊ8pQqn6ߋ endstream endobj 1079 0 obj << /Length 1162 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 125 /Height 98 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1163 0 R >> stream x]kOZYGSmU@( UK~zQЖ^7i&iIᔩVm' ۬rX^Y眵~r?grVUM;χն&ӎgg0YMkZ;pw/oxc4zq+|۷#<Ø^ZZΧ==r?jL>w0|^ G7\5Ňc_jRXJv{8r8JNgІ4EiB*)n/,@q(ACdf+V⽽G}}%(nwYUZtKO!E ~;OUPU pX ѺOqʻrm,ehjVk.Wp8dp ُFh#ʎw ݚupTOn+:m+xf++JpXݱL2{ݬVH$A#U8 - 'nas?ZAn%d^"A_`rrgrrkjjsffm#ޜn>_Atj wS)pC0 pHa2/F5zGa`*D``0Cx'5Yݘ[\7 )];??s_UNɝ;UG,q +9) c57`Y3|b}xyyme hkǖόP =50@%gQf+l#0mOL* KKMton=k%Uy60yeN/'׮aw'MÙH5%Vv[ZEc-gq Y"1(b0xvXЖjb 20]Z6|vV`[W嗖3ěS/, &w o6vɄ]ԏn> ;D,;?P&E[s5 ]\!K.Zy]l, _A:#[c5p6XC̗lߍ*[x?==tLreC!l ‚M?= |8y*l~qNýU~q UmALB7ìHsQA$VR~$5EX߁d^+  waX?V saŁ p܅r> H|{͛SUL ]hDd EY<3;;9AeΝZwOtKZU!3\%.׿G'FLH"Ѽc`6C."|;N(̦1_;LMeƠO4tZu,C>@B=n `әd0-%3o2|u GKf{QNA=./KxY㔺hO3~4J}hH<(Nf kwĵ>ֈҰCFB.h>ߑөWLg ;k~p`]PomS a'3,CCfGz?ň.ʰ=<٪z#,}ZJ XB锰K؛$1 uL.aoK[$1 uL.aoK[$1 uL.aoK[$1 u첰x ˤR}{foD'(96Ƿ]0{En6G.Fdr{zZtekdIjQXwߑ/HY, F"cc[7  vM/7Ǎ{W]NѼ_ؙ{-? fN|i9d.{j\(D}8KԻl\gw|yWI4=o!tXU+ś7Y5v  jX`eC-nEjo>ӛqSeB<>7٠N>2^vj9ݩ#Fj7>'} #UTj}ff@H7fg0wFFOKv;}m~ yfR_egҒU/bz$nOLFH m~jСu ?^: _aa s82G];kho{XL@Ycz9HssaݎB>ݕ!o9Rt:s^oZoqJCgQ"QS;p8޻5n?*&$u𢝸FXgujT59dZP2 xz(l;4~[0'B"87!K&,5URmT#|~**'w|eTINH1_ZtzAvipp2]=yㄎLECxP&*$ uͻZskYHՋЍrbq&BYt<8HG4@3gfbւĈ1|Kq̣Q:{J >^I)E$h::{U0#M3-ʹhp-$닌G44htvr2!4bjE}g n$߲jz60PN;`- 1⑩4k̃07Gmnb^* 3ӳA(TBAvWNm4S;/8[AC;;Ӟ>NK&&mB7\Q^w @:B(ˊ(ExtNJ,;WͅBȳ4,["-'ߑ! =MU +}}(H.罽PVG b[|\0UY,HZ}/x].ԕfRj7"<^3^X,He\VQvn0\&:bpW-@λ._@^Qqӓ{}}֬֓;w Pn L >S Q~? îē9k{T[tzQ^r.V1/z@D<뫁**\׶>A9 VHh5O#hGiGSI붵ǜJ?{vʓo endstream endobj 1081 0 obj << /Length 1164 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 114 /Height 88 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1165 0 R >> stream x/[aǛNO[eHCiE,~D"n!¯{B܂j؅Iv1d3vf8=Liۦ}D '{s ey_KSމxݍޛoj o4>DL-Jt=0+̔^ƂWQb9=VB=$s<8n7:EZX1 lBB.+kmE.Ε+Hyz0?ڙ"`j*xujjzɄlK+X}o-ɵ畕y`1+yJo=tECy%a^]]DE ׮u#>= OؔZ'Rf&z؉ossѓf\XGO d2Y%@V*+U dY%@V*+U dY%@V*+U dY%@V*+U dYVГF|*y8IG]OzI =,X/Xg?0t@+l=zxQWhqkC݉g[)xuuBOVu{_>o`ybq+ĪTd~l~S\ڡ-0P2AS۷:[L(( endstream endobj 1083 0 obj << /Length 1166 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 34 /Height 34 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1167 0 R >> stream x@E/`$ES+lB$Nnwg=6i<0nqUU۾~m){>eF$/qN'N"Ǻ\.} #u<:4o,:DEQ؋%#xQ"zq9rw5V]=B ˲z -GAtʺ|/E ۶Si4I+(i(niiL4u](Q C0q(A O62!gwJ 9#z>0;sҿQ҈^oEE ov!>7DݔWiA<7u=\lέ endstream endobj 1085 0 obj << /Length 1168 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 35 /Height 35 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1169 0 R >> stream xOAy6 ;̴K,-=JJmK TPxF &jxDc0$B  F/gQ )Rq@AAT*HĤlSQ%B܄fJP ,~o f2D%p hfm =|wiuq%$E`؂D*JP0w^`z#> gW|ny8YJiTP)#Pԗ|$% rU"T%w S\<6mFysn?TOٕDh12ӑb)N*iBA'l9Bk&f&eb-SHsN@øp FD?ސC|.U[vu ;K&9'],0"eT1J‡ wv]['ɒjV7.ĐMf2IИT?.;,1 %\tL]%E9馻TWd#E|bcS \T.MW@aԡ<.ו 0d8t_c?]BN]IQ* > stream x=OP` F1~0.Vʤn.vibCd&.E^ZzLL=Zcr'$= 3RaaQaDp?RJHSiP脞Ao7~4 Xڳ!յexrE=n lwuaR B^+k <;*ժƎTwIy{ى+U^i3Zڢ]\z[B*#-+egu/e ̦7 S6_ g3=5~:G endstream endobj 1091 0 obj << /Length 1172 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 125 /Height 98 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1173 0 R >> stream x]kOZYGSmU@( UK~zQЖ^7i&iIᔩVm' ۬rX^Y眵~r?grVUM;χն&ӎgg0YMkZ;pw/oxc4zq+|۷#<Ø^ZZΧ==r?jL>w0|^ G7\5Ňc_jRXJv{8r8JNgІ4EiB*)n/,@q(ACdf+V⽽G}}%(nwYUZtKO!E ~;OUPU pX ѺOqʻrm,ehjVk.Wp8dp ُFh#ʎw ݚupTOn+:m+xf++JpXݱL2{ݬVH$A#U8 - 'nas?ZAn%d^"A_`rrgrrkjjsffm#ޜn>_Atj wS)pC0 pHa2/F5zGa`*D``0Cx'5Yݘ[\7 )];??s_UNɝ;UG,q +9) c57`Y3|b}xyyme hkǖόP =50@%gQf+l#0mOL* KKMton=k%Uy60yeN/'׮aw'MÙH5%Vv[ZEc-gq Y"1(b0xvXЖjb 20]Z6|vV`[W嗖3ěS/, &w o6vɄ]ԏn> ;D,;?P&E[s5 ]\!K.Zy]l, _A:#[c5p6XC̗lߍ*[x?==tLreC!l ‚M?= |8y*l~qNýU~q UmALB7ìHsQA$VR~$5EX߁d^+  waX?V saŁ p܅r> H|{͛SUL ]hDd EY<3;;9AeΝZwOtKZU!3\%.׿G'FLH"Ѽc`6C."|;N(̦1_;LMeƠO4tZu,C>@B=n `әd0-%3o2|u GKf{QNA=./KxY㔺hO3~4J}hH<(Nf kwĵ>ֈҰCFB.h>ߑөWLg ;k~p`]PomS a'3,CCfGz?ň.ʰ=<٪z#,}ZJ XB锰K؛$1 uL.aoK[$1 uL.aoK[$1 uL.aoK[$1 u첰x ˤR}{foD'(96Ƿ]0{En6G.Fdr{zZtekdIjQXwߑ/HY, F"cc[7  vM/7Ǎ{W]NѼ_ؙ{-? fN|i9d.{j\(D}8KԻl\gw|yWI4=o!tXU+ś7Y5v  jX`eC-nEjo>ӛqSeB<>7٠N>2^vj9ݩ#Fj7>'} #UTj}ff@H7fg0wFFOKv;}m~ yfR_egҒU/bz$nOLFH m~jСu ?^: _aa s82G];kho{XL@Ycz9HssaݎB>ݕ!o9Rt:s^oZoqJCgQ"QS;p8޻5n?*&$u𢝸FXgujT59dZP2 xz(l;4~[0'B"87!K&,5URmT#|~**'w|eTINH1_ZtzAvipp2]=yㄎLECxP&*$ uͻZskYHՋЍrbq&BYt<8HG4@3gfbւĈ1|Kq̣Q:{J >^I)E$h::{U0#M3-ʹhp-$닌G44htvr2!4bjE}g n$߲jz60PN;`- 1⑩4k̃07Gmnb^* 3ӳA(TBAvWNm4S;/8[AC;;Ӟ>NK&&mB7\Q^w @:B(ˊ(ExtNJ,;WͅBȳ4,["-'ߑ! =MU +}}(H.罽PVG b[|\0UY,HZ}/x].ԕfRj7"<^3^X,He\VQvn0\&:bpW-@λ._@^Qqӓ{}}֬֓;w Pn L >S Q~? îē9k{T[tzQ^r.V1/z@D<뫁**\׶>A9 VHh5O#hGiGSI붵ǜJ?{vʓo endstream endobj 1093 0 obj << /Length 1174 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 114 /Height 88 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1175 0 R >> stream x/[aǛNO[eHCiE,~D"n!¯{B܂j؅Iv1d3vf8=Liۦ}D '{s ey_KSމxݍޛoj o4>DL-Jt=0+̔^ƂWQb9=VB=$s<8n7:EZX1 lBB.+kmE.Ε+Hyz0?ڙ"`j*xujjzɄlK+X}o-ɵ畕y`1+yJo=tECy%a^]]DE ׮u#>= OؔZ'Rf&z؉ossѓf\XGO d2Y%@V*+U dY%@V*+U dY%@V*+U dY%@V*+U dYVГF|*y8IG]OzI =,X/Xg?0t@+l=zxQWhqkC݉g[)xuuBOVu{_>o`ybq+ĪTd~l~S\ڡ-0P2AS۷:[L(( endstream endobj 1095 0 obj << /Length 1176 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 34 /Height 34 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1177 0 R >> stream x@E/`$ES+lB$Nnwg=6i<0nqUU۾~m){>eF$/qN'N"Ǻ\.} #u<:4o,:DEQ؋%#xQ"zq9rw5V]=B ˲z -GAtʺ|/E ۶Si4I+(i(niiL4u](Q C0q(A O62!gwJ 9#z>0;sҿQ҈^oEE ov!>7DݔWiA<7u=\lέ endstream endobj 1097 0 obj << /Length 1178 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 35 /Height 35 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1179 0 R >> stream xOAy6 ;̴K,-=JJmK TPxF &jxDc0$B  F/gQ )Rq@AAT*HĤlSQ%B܄fJP ,~o f2D%p hfm =|wiuq%$E`؂D*JP0w^`z#> gW|ny8YJiTP)#Pԗ|$% rU"T%w S\<6mFysn?TOٕDh12ӑb)N*iBA'l9Bk&f&eb-SHsN@øp FD?ސC|.U[vu ;K&9'],0"eT1J‡ wv]['ɒjV7.ĐMf2IИT?.;,1 %\tL]%E9馻TWd#E|bcS \T.MW@aԡ<.ו 0d8t_c?]BN]IQ* > stream x=OP` F1~0.Vʤn.vibCd&.E^ZzLL=Zcr'$= 3RaaQaDp?RJHSiP脞Ao7~4 Xڳ!յexrE=n lwuaR B^+k <;*ժƎTwIy{ى+U^i3Zڢ]\z[B*#-+egu/e ̦7 S6_ g3=5~:G endstream endobj 1103 0 obj << /Length 1182 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 217 /Height 545 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1183 0 R >> stream x1n@DA70Aӓ$I澼Ӥ7^ԫP4}C>"UE=;QVQQ:Q;DQO@\ Z@r(jQҨQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=r{(jPCQ+VnEZ=ׇvm(کhvj(ڝhGvg(ڝhGvd(ڑhwvd(ڑhGvd(ڝhGvaފvd(ڑhGvd,ڑhC=CюlUUaP}y8c{I> stream x1 0;Lf hFT-C*!ʐJeH2RRxȌ endstream endobj 1107 0 obj << /Length 1186 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 234 /Height 77 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1187 0 R >> stream xwlVeŏЯ-]P6-BQ!(2FDąQ0@DшQSpD(&J㎠APDhPAe!9ϗ2z?=4?yy/ B!B!B!B!B!B!B! á".z}/@$gu*NP C"`}>Phjɩ@9~v:GɁn赒+Şg|.eoX \ \ t:1Q=5fOס$ƞOJGA1m~_ ׁǁ H`=sX;1Miㆴ+řéCoX 9FV{T |0yi`"0\8q!Л6R\Esz8&P+U(ogX00 xu>fÃgggepy8Ӯ?R,_i7 Kk,3@p6.K4DɽRiPJmgqj3= OQuMgOwsFդZ~?;ӟK»7׼xic,£Y=_{8M!b.qܛTIN&/T)S{{,E\ʼnD?N:2ӭwK ڽɳ3pN 2@Wv=(p/+prF@㥆k2 Å`GgkK =++ `isxn@;鷱-e!ƒC ʬ2't,Mnږ׾u"3,ݛ$Wr<_ [L.<{ѽS{!N.-Xfa'ke<OqɃ.%77˵Q޽{B~f%\B[Bnxw&o{- sٵYGٶDciAk-zZw% S8pa8qNZf{m,3TuE\|r;9(aj`9⣆)w{%0+8mj!(qBn+I|ے5\uXlr]gp?&G0Y/n[Z7k 2 ?hjO30->%wܡemf\3+\{{4P (#jCLsEnLooaT̨Pto۳oe؊o+U\ȱ:uѷnw*ݦ aw69;zݛMP=NͿt}T/*@lrڳAC{f.'4762ߺ'- /hDçUYoe造4"@-K\XێX>|]6{f9!PՉnUL͠{/Aen,ծH} OGb-o'>כmƑWr |#fXo i[ KyW|Tẙ QEtr_B!B!B!B!B!B!B!H#h endstream endobj 1109 0 obj << /Length 1188 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 234 /Height 77 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1189 0 R >> stream xylVEŏЯ-_[*EAkQDTԈ@n,EMU( Q (%"J * ;V!3TR˃?99sB!B!B!B!B!B!B!qX3W<* *>\@5~ ~*UBcPV!0}CNn@m&G)cp }q#UԳR"5C7h ڸr͢u2vDW6TZAAOfEbz#DKt4\<fӭ,'prqO:# Ïwh㾌A)>8 h uZLDƑ7"#<MwÀ@ hj܌6hQ6M'WgB`H5>*ޗ2goOH`(0;p.m܆8q1m܀6v8u8<`荪clu ?LAEwd)np#T]ZmLU^ *vo% óXg<|p%П;@gDsfF.gGH\R{-/@  $6&'#qGM;QrttMmgvr3 wؚ=]w&ڲKܔnZ 8}@MA$[ ӍwّxxM1,9]5vD}B$`7&*-!:E80wLn}`: <Re4-yʯ;kΰ[o;TFldC[9<{x x8p5#ą짹<j[auVXR9Y.F_YWL LƳ6!܍gp9׆ֲ*S!eiB!B!B!B!B!B!B!h endstream endobj 1110 0 obj << /Length 1190 0 R /PatternType 1 /BBox [ 0 0 1513 798] /XStep 4622 /YStep 4622 /TilingType 1 /PaintType 1 /Matrix [ 1 0 0 1 0 0] /Resources << /XObject << /x282 1191 0 R >> >> >> stream /x282 Do endstream endobj 941 0 obj << /Type /ObjStm /N 100 /First 946 /Length 1882 /Filter /FlateDecode >> stream xZ[o~ׯcP.|i9FM󰑷ZgאV?Pv`ٱ+7AvHp!ehCo d0Ox63фg+wyo10dǛ) xqɈ<Ő$08!,DC`Z" L,T8EET5T($q" rƳj^ z1 $aV9BaMpsb/G΄ȊBNA!o#ţP)x 2Qz0O"q%s٤E(WHLR?â)& dRi)96)::Y<x2JPͣSH^!NM%Q)!JQLVqiTL#y@}&ٳ6+EdVjAc-<)R!+EQ (XIxT#|Rڌ 8]\p7 iPV5xSH% ,PٳIϓ4[}?`vff{viMok4/h^{J6Ԍ&J`luAe=3́iWiv͓ijl e׼_Zo!H %ތ G6 :.= ܊9r"< t]-D/#ۉ>m>L:X4M0*V{혏,O %৵=mbM.7e# ,#TGĦ]iy(-l*r5sa0ɗ,,UY}YED.4vn.X$vOԛ3ZN:h9,OKLL}vG'I\xeS^E}6uarB/]7V+ ʥJsH4J1IμkanL|0d-'_MS'ɻtaѯOVNDøw0#?]꒪ϭxѭ.Pw/j5ߋ:܋:ޚznO΀:8!#Ҫ:.tw4`+Q2]{8돌8I;iro[QS5yУoF&~+y(twxz 5EfmՂWa?8_vi.;1{h9zQ~Po^v8{-Ajo?U5w*2gɻv)߀}\,w@fwd:CfǯnDO㸮׆ݫ(ò l"JN7>j2gyKv\8B+R ]ZÙ/[%\#6OG_h`GͯCp)?̝%,Aa껨lE$oå.pl 0[Щ yΏ8o+ AIK[N endstream endobj 1120 0 obj << /Length 1202 0 R /Filter /FlateDecode >> stream x]j >$M)@ٽ?4SQ1搷-t@7ߌ3_{k"* Feex#,<> stream x]n <ݡJHfHSwal@tH A#uҐ釿c?(, U%ˆWc@2cE4pꭞYBK+<+^auhk9%:Pq/½ H}b܄um!T9]I '$za2ZWЪq~&ۨIΣ,KT%:iC@tLTee(ND ё葔tfC$HD#"r>$4@%2Q} eT_SԪܓiۄ703HSo,_J/ endstream endobj 1123 0 obj << /Type /XObject /Length 55 /Filter /FlateDecode /Subtype /Form /BBox [ 0 0 1512.879639 797.825134] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources << /ExtGState << /a0 << /CA 0.325688 /ca 0.325688 >> >> >> >> stream x3T0¢tDb.CSC#= sK3cKsKs= #SCcT4. E endstream endobj 1124 0 obj << /Length 1205 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p111 1206 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x N&-dB?#_"սh 6$e3$n*63 endstream endobj 1125 0 obj << /Length 1207 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p121 1208 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x N&2!Q#n_m&_ <<$IpY !I<T6\ endstream endobj 1126 0 obj << /Length 1209 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p171 1210 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x N&2!Q#cMtE'1$Z$Xn7) endstream endobj 1127 0 obj << /Length 1211 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p178 1212 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x N& b2!Q##ǚX+gR+1s:T8A endstream endobj 1128 0 obj << /Length 1213 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p210 1214 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x N&-dB?#_"սh Xm!Ijg4!I<0;T65 endstream endobj 1129 0 obj << /Length 1215 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p217 1216 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x N&-dB?#_"սh Xm!Ijg4!I<0;T7M endstream endobj 1130 0 obj << /Length 1217 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p249 1218 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x {xGHZà7F qxl{5 >CWQQĄ5見~8 endstream endobj 1131 0 obj << /Length 1219 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /FormType 1 /BBox [ 0 0 1512.879639 797.825134] /Resources << /ExtGState << /a0 << /ca 1 /CA 1 >> >> /Pattern << /p256 1220 0 R >> >> /Group << /Type /Group /S /Transparency /CS /DeviceGray >> >> stream x {xׅ0QBGm&_ ' >zu%*rͮhtE?7 endstream endobj 1133 0 obj << /Length 1221 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 253 /Height 200 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream x흉;k9یe2=K-("mBJMQIZ^҂X*EI6eKv.gIu5\}=]ݿg47F5Jpg ~ 9'NȂ8q"!G4 dz"bc<8&[~lHbP LF!> g$rdFL"p2r,($"&.!)IH1(?/77y iD>a1I)y%eU5) *55UeE9i '@|~  ,$FUPohddllˆ266624ם$/-!"=-qD^4}cYsgD̳k9{t#ݩr1Aφ5=NURfh:{KX꺚jr'{y3MTDI\I돚} +IP\FICdݒ.k7xl޲Ǘ}&uW9XLUyl0GEOcDZqPuLm/_Ͼ>x 9|`pP<9;.;@KEV\Dd4 *FmZϞp12***y|ęGCiS=u0e44vv"IHR^]~; pjSRRn3Rn%ވuTXpjFSEܜ,v>aӟ;p9>YYOQYYYO2=7Ƶcܝ[ɊyFAOw.m2go;iO_/((,,bD~,3=59!ܱ[t.'.ZGRfjsׁco>~*miyEeee]ɛiǜ b<U{86IsZ}O7S?)z[VUSQP_W8?;+-%.DEd# J(O3Yg߱q)rޔVkhjimkRUT* I͘3wmv0Tb!wGPRI?}#ɫҪچVjGgWWwww 8yzOW{ )|D6@#DZs%s|*&1YnIEmC #c0;NOEԤIo=lD~19 c}O_Nz]u}s[GW/r}~:AXF6>bzVN^ai5%zIJYXC1oSJr2şt8IB[PRYgB׭'.JYT^։#3 mnݸ;ܜ5@ӌ?Rkڮp4f Nꥡj hO\ YB_UJ#CO1/|4OG?@ɗOnuY0CmУ"K(Z+8o(z~?!ߵu%ؿ =xv.!n<.jhڲ;WNnYe;]SN/*e:e[Й{ +Z;z*;]ƚ%Ft[jBqtu$:)#ʎlƏ ߿TkУ$"ef=l]}P.?I a0-*.d}h˦G=eZBD0 /'~׃WXVdPǴho+Lw[j,A& =,wD~q%]s]GaZ;{vQzPjJlk.<`C\-(5f֠p%5Mc~ #~Ϟ G@fA>'?uQIOʐ~dB~ܙ@VX}Pr7iӞSR_?Ouz;[>>uϚf¼^HZd7ֶSݽrL L8HE\8 ^Kޛws040瀔֌Ek\-w?EHh}aB>V*DVh)X,ݸTfqgz[y9GZ4; Vl :{==C _}$ƪwb[4C $=;hv4x6.&.އ.z_Q_}${PkJ^޿vr;Lzp!Ityp1[vL*009u +KtxPDg/q 8qLxHIvg#i^t-6O{RsWYnqX mƣ\pa C tW~l3G}AfC^H#“Dt̗z=:g &ShW'8IH߼/NSW=})쿠у 8Jzs{E mNLtOk~ki!S|N|rTŽ+ p^ S50^=~&}ă-_Rzl3mi~6ngMOT5ۤ̂Jfo'w--'‹qhu82\^j!WNvwý4xco2tS{6:̞6m]}BF{wOݸ x!UL Ax%cZxau6s[yLC׾qGO1E{:sqx{{ЇI_<[f~?{uk}ցCЃ9B*Q*kd %>1OL'hiRsMoqsw}xZ6e}kM5̻ꉀ4Yй9t܃lf]57լ1n5;jyF_f-/]:l)u˘wsƈGZ]Δyj7} lYm{frp"\>y`;ދ+Z8:z)%3 X$; m`‘zpΑ4=8"! fycK-%DC߳qg, =cHc=vr"{XD\?xY\@;,= vWLKNC]}JvrZv.ۂ{VXQ1`KmyѭnK-a๑dz= ~!o>.nhC>?S8ۚЋjNYDLJFλԮ]\WYRB Ekc=/mc1{:Z뫊{,6VAahb8/ ?4>z:[Kr2R. `)O=_L~Gn>|YTƾLðf޹~g }U)0!=+xz EYgBm'.JYT^joY"9YkȊXG <ɬ$a5%z}ckG ,pO\WUχXak67Rӌ/al74QPZ]LbXjom(ɼ!,yLe RFi,Ȼ;[K3ĝ۽u0fo9y)Jf6|OFH|UTZøhoki({r\hW{ ) l0Y R*f.tboJ56Q+*Cuۂ{[jȉ ?F K8۾7,JbjƋܢU5W uWWzy&E2== و|"*Lٲؤ^++f4CUUVT}S21g\`b=zv@/m2yo`虨ĻiO_/(,,bP~~صu,}uˢ)JZFvn ;}J­۩i鏟dfe=E􌁄(+Iƣ&߈8~pb+3]5Y}~$$7z[xjSRn3RRo$^:wHp'; cmQ27`g# ˪j.Y?БϞ}y|Dcm߸f¹fz~n7U,";v5n;>^۶l޸~*'{[j2 7ZAz<;,,)1v+WZXGZrysfi)H 8Xq@;$>>/YDBFQMSly6Ϸc43ͷg=|@&i>:v >'*L304266XG21622ם6UCMY^ZBDJhy$dTTԦ3TUd(Bd7cG9\<|dAa1q I EQEHJJ 𓸉4 08I%P&Td2??,?̎YpxV6vNH$r1D's!px<+c Apߠ~&3'NAG?0Y|F?p@B endstream endobj 1135 0 obj << /Length 1222 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 232 /Height 179 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xOSgiKK[kEeDc0a Cl8ܢSLa#es6%۲ [ gtqؖ935i˂ ([ --Pz9B z|9O_=9D H2"R7:Z% ().->ٱ5S|VAFZJށhA6cp~ciܨйJTv뱹F@xh.cN{wuغj Sɒ} 'w0^ؤݐ*&/Co,K. wX:~$$ c=F58PwEf!YΛED2#MVqrzM Mvۭ˖M\,Sؿ,~u{c\`$:P0)?{I}j80m~f`ioSf.?jr0W§/vCNJz%uҞ+Zz^U_,4= ɸ]sd\S!xc>["?@gB'47 B`G %}s3c+ [;:oxJWu@l DXQsv ?ΒjgYyw5=lCWi 醮+reOB_F.saQ'C&w;| {yh\=̫2[çu7t!hBo\HBU MWN;aGwە:*.W Si*de7<-[ p+޵[ͨS:^^stC0:ڽB KF>`ڨ=aF7vQ5p9LW=!=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=a=az ϗu'}"MEPWY}(-g3,Y_\xP#IX.gcz{<ݠ:/ S]:-ڃ *0^햹 ohǓP o溚WjsEQm@/xqU\{gMX ezҏ'okڱ.}.KWo"l\F=\*,0DӍxyQ4*&[g4 _t}_(&{$opy8nfdh̎FA'2?hݑ/SBgɊӏ4u 4/ }6Zxnqiz ih-ڐS"'_8g2j^4fYMm[g=e볶MCJ7F)0c}5DEsbc(Jx(6 endstream endobj 1137 0 obj << /Length 1223 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 70 /Height 70 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xo@Ofl%_Be#H% HTSqfSS1SQ]QSSlM cw? ܻ{ݻA vDx94T'[`8:;:Wo l<}vKV̀J"vĄXYi,Gujm%N[rRi1>:!$Q}K0@`FSrQPfq7U5(*ԔtrJ2H0Wרv"ɬ~b6J06Tq-%ݝeX^Y$2,[TbgF&x`ZJ%,`=f]$nqC̍FOn_|bm[u\*O5r #yw {3$MRg iwa-m0yC-7aJ^$&25yOQL> stream xOHQkwH4T!Lq qGpLx[%3hpvbkҧL&EgQ3csLgQsM9y&d\a \"y$D|Ba qVpQ'5,Y,dm$gɉ 9AF8>g2ő4#!4_Nue]nvs+bNa?/|wGT-Wo0^SAW~eDz#}LH}N!>k{%In =^[I0عC-Kڇ*s0!r6/-Hl|j5eN8|c}PunX-+SL됳6Pg25?>@{WJ%kf_l Z endstream endobj 1141 0 obj << /Length 1225 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 41 /Height 32 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xc`@:Y^z#9peo#1U1E ^58EG1u@]y1ne@Pu5^u?Q(\@@OAPK"c`&FLlR#8u.$RCD*Xx"'VbhDU/SA{ BOQLgD[NSɃs #+Iy_>VRP؃C`21`e*f%! $ endstream endobj 1147 0 obj << /Length 1226 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 253 /Height 200 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xWTW/A e`(C3"T)QiD ]Ԉ Q) 4*((HHE{g[k9 :FQňQaݟ~fmb~oBp3, !G4'qx<|ʏCrNK$H$>H"/0 ts' HPDXU EXHHPM? ȉ|dUBJZFFeMh4i)I qQaA~/77Lt*}d$U!>0M;0</ EL&D2UKGOȘedddh0]_W[Sc$iDGOXg8I".-4yXXZY[۰,73s4uU(sN z'⹉*&s[/^jˊ..XO.+;.]hi>HOs(X8 <|dQ)9 ]9 -wY->>~,'VnVt27>MMF=v~a*Mi6{o۹{CBBYO!!!ݵs:gEgNפKIx-;QPDJ>pu[|w;v3碢cXPQQg#N?{*Mԕhp$[TdK&]c5RS$ğ:i4$ ?/r>>Ӕ8q߶/Dk7dyɾu7+c" vs^DWM^RD陞' ˪N3gwOȉIӳ>/(,**..aE>+xavgXh=[_]A [mbl'ߺɳU5,ʊeϋsӯ];wEf5!=zGA"eڦv>G/*_74655_Vd%Dd-=r9 DA1z}G^J|UCSK[{GGgg(wښh(HRqȬeO ʨhXo+7?)~YSϲtwu57U={z1"4v)B$.@#qS4gX8n M󠠬[7=]- yY/ L_m8Ţ;  |%gmh{?YTHpoҧ7"8/C¢y#' OR>wq)+^5wAA o~gkCMYÄ́;66,ϤizUً]9EG{ ~oW[c틂"mt\` !0gM/,ib9H~}M>SAkO&HS ;l>x;5{}ӬnuY4SKYԣH^;dŠW ~4/3)M-dX>J=Lok*ɽxڥf2"|ܟI<7 ]oB"d4uUv}_Wk}Ea {=VZLU4O*h8{xaqUC[weG@ogs݋w¶o7קD?Np78UUkWXeG7=%n_:ugR?" ]N'}Lfjq v?5N7y0Hǟ~^FUmǑشgǴǾqzbDH=8TA^׏p 1mz(* `T)$}@R1۰0H|aeC{ϛxT=5.yN1tIq虍?{˙O_ַ!Q#!l)yp=%35GйZF~7QZr./ &7tma }\9O3/t_>__UZgƒ6?#^`<c<61x 1x 1x6c<c<0x 1x 1x c<c<cl$ 1x 1x g##}<`x2]_zGs l7)sCߌg,_O'h=q Zkg:^0bl\*K|n;K|?\X3>71y0]p [/zx='Еm`gm?]6bYߒbyY鏗\tM5^A8Z8{N\bUSC[ȡv=VB_jVt)٫R^6Ky1 /e4;>\Z\ jSGcf,&FV>Z=i+ ]mq AGz<kKA#x.4T za*h,t: N}iMSgA?faAXxytf K?mǑ֮1m| N8TSQ#]}J`]<O|X\?v-u/K۾&0;3 zs9w5#c {0}[m ?Jpꩠ[9m},.-+%ca$NC3ӥˈ}SOVљdOЩ +[(=ƚ'G6-4R"'?GS/(>i|!g<*EcHM/·t]4K[YH=IXRIiKK*_#ޘ落d_x:;sɲ`Cz'xEi:z= [:z޾CY!:q]m=f™`7G #  !"sGS?KSnn;0<.%qqū^'XY wJ ݹT #g_AhzߠS2rk[; ;?YV0o{ڛJo&Fpw^4[N@g4>hJfX:n KJXPV]f`-kt4Ԗ<ɺyx3}59*a/yDeTL~x̕[OJkZ;{z{YW}}}=]m- uUeeş @]^B@U|=p-QW -m]Ύ֖u/o'?PCQM?d|N."Y\cjkwXIr J^Tտnlljf]5556~U[U^ZAFZB] "<_2=3s&V{8x\|ʭ{<+)}YQYU]]TjATWUUx^8;师{}ݜh(J}$$.e&]>n.vj(;(v?LOQTכit{:{!Դk,Ԕ+τ ٴq\#-T" Jӵ X٭\3c'Ne5bΝ8{=^e|S= eY0?dê+ LUVםaft>v :x(8$Q ($$Ё{wܼaтYbda$ET5tX,ZuM[}|BB+mgh)Ҩ"רه'⹉2f 9,_uj i e,2TS%p@;|IBSV3ty ,mll@L6Vfi*t!~"7qGǎ>O".IWO7hk dldh8]_W{$icX~CGIB"2*jjSYN0*tU%9̏ô;J! QDũR24,FI LGq' HPDDYMHTYC_͎39qx7/H"XV$Er>"~N'q`h<Q>~rpp> stream xO[UmK)-ЖByݘj؆MG?fFf,2 1{Q _,8bbDf8%q/J(!9a奔@K[ZZ lOι<< R(E)UKh\&  S-94jN)ܐ ފ*/} N$gx!zQ%A}M@V8Ɖ֣Nt& C,4W}^EAb͕ɨ̨C,>kp"ܫiꖅA e9PtujmXoT~V>n鸜 שKo?tBoR }5 ^j#IWz J&&Ar7#4bao6$2oNmHkXjY;1sEph@MZ4}=QfdMzsYQi!JiK?N7fTA4~CEGx4iѴrW]kK1shU QãҠ )oGԟ]+&-*^_妩td|,q;owy=>wY|OkHEy:F8 QV}kBo9a*Tdn GY7 \GS\v\_ڴ77TTK0c}5D"Q/q*4,P: endstream endobj 1151 0 obj << /Length 1228 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 134 /Height 92 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xZv 14?ݕtpY` WV#ϟ1gc80f85!e `wf0(((_ā6AhZ㺎m*n~%k *xa,;I;&`1m?JEu85U-@lv\\m]BGea!6{^-P5s^:OU~8 @y 'VC:zK76 *qlMCwA6CĉCƘ27>)$ƎW b/٪Agu]RuFvĂ" Wۃbe׷3s ѾA0ZeB:bx`Lz8c<͘+XQ |4qn}aFPhqd6cFR&ta&~?HqMx 0I׮LPk[ĶsU/'G%RW~=2\q I$CjEzF-y$kG[D2dL/== WcJkq#,Z]"BYi]y\.ADͶmelق$ɘ%`=& :oL|<\cWD

ۜtՈe b~Dr:q^xR=qh0 ,)v0V5OhcmsP7Bw|ߝ6LOl8 XIMSP'^8AD=/ɲO%t;"G x~Ԇ.6uÁ}ު7Wԭ,׵ҁ4™:a( 8`6[L>!VvN9vzzҏI(<7W1vRBDwz XSg D޴`zm筘*Oeu܅{i4 U:c\>N|L(P?_d lp{0ʧsSC+\dqBj<{F;3CDŲEΘuT7j:wk\us7ПKԜCh0ŽAoWB{ -fnVy}'lMv!" ~G@:>>2`]QS?fYZqGAϯ<,!ֺCcO@vQ4Fϗ?Q?Q/{^BЏr¦?[%,AKEn j 'M`f_3xj硥6כ?lсhfK.< ,0Z .9gK. Cet*;n/ aK.7`vGExDY3\4BN I(imC4M7,/Ls\4Bp7y`<׾I{IVe,&Ks^V5b" _@ !7ޚ k,r_,"jְv?[@\EH8mSWE\=*,-CzQ|JBziqPY3m0 <244 qy8*> stream x?oc:11+1 BРDPiJ.MJi&ED!CȔ ty6kxZMC4} h)3@8TLfD,X @ 012Ɔ R1XXY؉Dā@ $";;+ 3ќ-HF$9yx B`ETd.~AaQ1 I EJJJKKQ$%EEx9ILM`8y)2򊳔U50LY) QA>n2.&f6,5M]}C#cS3sy`7k\V"',u9& m;8X K\rVi*SD9بI2U7]`kn[}|}a)__-^<֬r\j5PGU"II)'"5Sz9r8 >~,$ȡ{vxw[d 7dT."ۦ=L q P0v|g ?q$yL)a^P?!\VݼKLy'5{iwSn]OJ8upJ2|䟐MpK):oy 4:ʭOr ~AܧY\~4p2K591~2@!20A.ie= ;7=Ǣ}$yiyꚚZUSS]U 'ijawxX4WC^>CX*z73 jookmij|]] ;萀M6Fb `D.!)e~G.+Mg۞>~,y\_UVvl-.6bL Lh0F; EIoz좊QBhzŰ}.6F"<$o m02L] {O9/ۻG޽{7ւAh{Yvޫ UPF!2xE̖y:WV;8?SD>w#C EćmvZDmU1BdfQ7ZfGpLrƳۺ8 `oGSw~߳BWQ[H-DI%+CW^ַ ,>M)66:\<օvܠ2$a$Q G{kpL5*DΦWEowB #8ՌKyRZp}\@0i2?Jԁ-+-ux?& &'>Ko5o44HPs7!,c 'ۗ)C%$if1(2)Us:Gg,қ)K)w$ v򴼡odl* `wKUფȠM5d@&#D6N0sɏ׶ 1Ili;\Aʈ?K",5~iyM]:fcCm^R }K+YPZk%uo|!B6{?:T RzlEQ"a>us*-ry${ =Ɔ{k^=X2a:8)v!΁uؿ arR.:[j sM:-}C.V4%a@RV T:9}PkT"3Glͺj{q04e˲o`.%jq D5^],/ CS6Z/:h-R+bK{g7 CRβ%Fv_ jq@!qimj1F:_d^\k=,(e xGFQ-!'Ycy6pOpDq4Eay݅“;>&Qs;F-SQY g#Q*/h-"n?coFg-[)(f1\~7lƟ)Rm~qߕ4P\coTQ[S[q)tg0 ^ϥj8QW Nڲd[O}V 1"6~=~\<(jWC ]« OQ3s .8( ~Lgzbse.D' -YtQ]w&ϯjˠ`:Ehُ@F[.kPx($a:'s]4+4=0rܤ MXg}Y͘C[5dЁ7Ji[:=wiyCg?>RFMXkUAzbX:9J?(΅W1Z'"Aau+.6/Pw/uԗf:{dJt*A`oO;p1j-=U<C@JsWS| u8J߈=RG^du|yR6H̍<A.h|sU(weL)3Zd|jN9()ږWl^a r$d IMS#m[m[BvYQE]H8-] M>r.}~eM#ܫfąۏ[Z)Y@66s]ܿyp3כըt,6 O.inV:pԝq m{]~aֆ*Rl_% ]H`# H*/tڲ/RjvquSG܅,t݄5j+H ޱv7[ KU ] .eC2~žؐ]̵ľUGDV@DGo{GFa-`_Ogk'ĄН%~sC(HWL^d72r+;  a,@ۮ7 e)~zJ[/ex+J*j[;:WWWgǛƺqw[)K qYY/el) tܢҊ MXu]ueyq~v}>kY.aUd gs9zlz&Z9E/J_b'% r޻yܩ#^.Kt\ ,V{:}!efeegg?PY3fKy%>&nwG+c!n+Ì&DeuMluW]t3_|5D8@]^BwAg<E y6n|v ;y:*:: ?yݝ.0VeT2O^@LFIk2'7O/~{ ڇৃk \l-tU%y?'ca' I)i[X-Yb5k=<5.Nv6Mh*HsX %c`bf#q KT՚mhbn`blekkcmp<ӹ:JrQ2; E\4.>!1l=}}9X@_oL9)qa~2Z`_HD\RZFN^Aq&,? /+MbB~N"s  a+?/7'ezd`dllD{ A"*#XhҨlLfVV666vb`ceeaf&05m##"`*4FF>87eÁP?> stream xkUNfmm* Qji  5Jb>b4/+R*UUb_4Pbj(6Иm;Ygw;f9gs=KHxA(, PlmX@ot<}b?_'NQP0' 7)%|/#E-E_ w;$b'y-wkۡg:OK/$s^Rwn-snY JE86%qi}AnW2.]Im&H,us/ʆv/}JFI6[ļثMsENzp߻0rj{1-3u18Ni`,SNP)VJݎ Rl kZnGRFW#MYI9vӰ|Uש >VylFC܆;5:bHW (c@Eave3ѣ"n'1#A.NHeZ1.FoTƪ~ڇ꧆3tg{A44 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ai࿄iiT5}[畯+m C>I!Aȶ|{oWF4K 6W*tz;@BSrA j#&*JwG8$%B}sgFʟ"惘Kgp'GbMva=Q3`C~$3}s?235qcVo^ΙLz|t;&?ꛙ?&0~[~rа<{9ԑmyt[Gx/Z'Ւ\NlO>_^U\9Hc9TCb;xV]BzXu΁]E3P- GsejGo+tCW2>lqGocn7@Lhg*mҺC?ו G^w}I*;K}uC3@)բ["ÉJek]08'UBy(AJ endstream endobj 1157 0 obj << /Length 1231 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 60 /Height 60 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream x-L@BHHF -eY% @0˒mP#(0C`5335ٙǵ`-{wP@ًj*{R5IF|>4Eѣω+r-ӭx3.ߴt2x? ]+P`$w?0ig$/u-tKiz1[7bȮ}0/θ}ZGX۷i nhZtsK ,uPmȵ>XMJHҔ9B5PɴBFc&XF#5^Π֪TKDS |~M5:11fr'^ =¬9JP>N@g9?!VZ ? >Tymts97u\707yl'p69N_KMJ˖;ނW QԔ:aCZ!!&'jR!\I7;cCy=NmU7v#`NB\) ;Am endstream endobj 1159 0 obj << /Length 1232 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 62 /Height 62 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream x]HSaghQ@Kv1B}@A50 x] BzGԅ1%+&2P9s~l~W},9g+>[>pdӊ?)fM!qNVkbVu[Yyju,5TfRs_ F vMF51)Ԛs`5a/raą'#q>#"`b#70kYOPu@Px>41:t=yNY]DџE[D~M;BzQO"#DUD DFV_x]wɺZTT$-Tݙ|ix(5 L_)}m ?v-8X|ji* ȍj3E[C̚ZmqKs[ֆ700@٬&eb,USVJ@q ?UR]j?ytd]x; BSWW&ں endstream endobj 1161 0 obj << /Length 1233 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 35 /Height 28 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xc`>}p,ML$Q MERdE 1$ OXUR TB;n`=O UiAT?' +yEX ΀E'$xcPSA+QW fP4$ٕTqEx_`WHT 5#Nx F~ p!_AH endstream endobj 1163 0 obj << /Length 1234 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 125 /Height 98 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xWSgǽ%,BX@wcqb(.e;TVVБbYUփa"R,, dyo)uO3?<|yAFOq8y LR4΢I:0{xIpyt&QlC k[{G  l:[B̷/_Rw'k6:uhLc 7q:Jܛ;*|C W1F"z&r̜7.dQ^N3r yOVʤbOlHK6|mpB+&%nYfŞ)p3 OǦUرӇEgcfn"fr_ %UG6/6gj"Rvip,oRaH3n ~[>$ô:(ꫤ?#c|5Z0Io ¶YVBƘ [w. 1l+ i0+w]Q컮㚼nȥt]}fs˗`{o$-2'Y, O7#r"[#YV+# &q%f-XeqWC%v؂;±ݝQϰό{{Yf=\{aSҎʬ@G;P!!omj*71Xh@a*10!R|zA20' J̩k5papbνNHw ޗ/uZkZkZkZטxgYgbo6ŏC4΄Ɠɪx24q4n>VzJ*QD U\_pϮs%8:me?P2K >sy/U&i)>ۆ+#\Ɂ^יo7~>p+uR @СzlLs /T9@"tUێ_t/T zJ.Lx!!$6O]CEPILO u_Ɵ%2 $SJ "Bjrj\]'eϖg PvQtrJDQ(J﬿{d}n( 9g߭ j{G&d29z&F{Z~}d)@0 ^V70(AQ-uf|jƚH Q| )9[SsSc݃0fl P$ 2u\.+7 E72O߱~&{v{?M>~Kt&=d>6Lےw:o"#> stream x+Da54`$ I4 ʂVJnYecgE6RR4Yre8quŘ3y64{szȔmg Uyb[Sԃ K/kVyWKt9dy\`*3z?-1Xȗ )A惬0fZB\@| V _c`s%` g"`gߔ/\'1 5c@ykK+: ?w1V zܦKo}jw-A֥(E)JQR(E)JQR}`Qk=2h 5NwOČ,s Ƃ CEjOWS3){ODHe@Q14?N`CTto|<q1 j1ܟKɎ^|c@:LwWDt&n=jS*H D〈װhE^|O[P endstream endobj 1167 0 obj << /Length 1236 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 34 /Height 34 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream x-0K38 df!"(4 01@u: }K/)ghrvij}[_hNi3kk.bNo` p @G$S]j9Ft,QMxc4Tlq@ endstream endobj 1169 0 obj << /Length 1237 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 35 /Height 35 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xc`@u`,1ҿo!߻-1T]UE_TH~cxd8CPM?DɊTJne``Sz0\įf) Cwx Tخ endstream endobj 1171 0 obj << /Length 1238 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 20 /Height 16 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xc`ɻ|<ʀ ˔BZ#_e@!! f`;&U0`})B1N>Kb0&4葠?(BA܀ Ѯ|6 endstream endobj 1173 0 obj << /Length 1239 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 125 /Height 98 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xWSgǽ%,BX@wcqb(.e;TVVБbYUփa"R,, dyo)uO3?<|yAFOq8y LR4΢I:0{xIpyt&QlC k[{G  l:[B̷/_Rw'k6:uhLc 7q:Jܛ;*|C W1F"z&r̜7.dQ^N3r yOVʤbOlHK6|mpB+&%nYfŞ)p3 OǦUرӇEgcfn"fr_ %UG6/6gj"Rvip,oRaH3n ~[>$ô:(ꫤ?#c|5Z0Io ¶YVBƘ [w. 1l+ i0+w]Q컮㚼nȥt]}fs˗`{o$-2'Y, O7#r"[#YV+# &q%f-XeqWC%v؂;±ݝQϰό{{Yf=\{aSҎʬ@G;P!!omj*71Xh@a*10!R|zA20' J̩k5papbνNHw ޗ/uZkZkZkZטxgYgbo6ŏC4΄Ɠɪx24q4n>VzJ*QD U\_pϮs%8:me?P2K >sy/U&i)>ۆ+#\Ɂ^יo7~>p+uR @СzlLs /T9@"tUێ_t/T zJ.Lx!!$6O]CEPILO u_Ɵ%2 $SJ "Bjrj\]'eϖg PvQtrJDQ(J﬿{d}n( 9g߭ j{G&d29z&F{Z~}d)@0 ^V70(AQ-uf|jƚH Q| )9[SsSc݃0fl P$ 2u\.+7 E72O߱~&{v{?M>~Kt&=d>6Lےw:o"#> stream x+Da54`$ I4 ʂVJnYecgE6RR4Yre8quŘ3y64{szȔmg Uyb[Sԃ K/kVyWKt9dy\`*3z?-1Xȗ )A惬0fZB\@| V _c`s%` g"`gߔ/\'1 5c@ykK+: ?w1V zܦKo}jw-A֥(E)JQR(E)JQR}`Qk=2h 5NwOČ,s Ƃ CEjOWS3){ODHe@Q14?N`CTto|<q1 j1ܟKɎ^|c@:LwWDt&n=jS*H D〈װhE^|O[P endstream endobj 1177 0 obj << /Length 1241 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 34 /Height 34 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream x-0K38 df!"(4 01@u: }K/)ghrvij}[_hNi3kk.bNo` p @G$S]j9Ft,QMxc4Tlq@ endstream endobj 1179 0 obj << /Length 1242 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 35 /Height 35 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xc`@u`,1ҿo!߻-1T]UE_TH~cxd8CPM?DɊTJne``Sz0\įf) Cwx Tخ endstream endobj 1181 0 obj << /Length 1243 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 20 /Height 16 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xc`ɻ|<ʀ ˔BZ#_e@!! f`;&U0`})B1N>Kb0&4葠?(BA܀ Ѯ|6 endstream endobj 1183 0 obj << /Length 1244 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 217 /Height 545 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xWsa 09)R%HP\{ ^K{f0$O?;;+hT6_ﺰsc|,s\Ve4e\ZuS8M'=.V)*Ӱ3+@m>\ B0lDefnbёyQ6LDcX<F#DyI9h,H$D<F2ߍڥXTJ8 M|8B.b3aIKK LRi樬I$x5:#b(̮ e9 YN52p$F.3WrT lG r˕jVK|6Jbh`ɴjAի33j1|72g%eUk4[v٨UJLJ`cJFݥ:-zd[nnx%FIXRouz3xZLt$9\kvzh4::,0jƓx4赛R!k1#ZX/[|z0֯Y(.fZFvbe (X*iMvY/fAQ),O?Vc\owf9'XaaFg F2R[mvnZ03sXcakiMG {`v8w%` 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0`B 0!LH&$` 0z$c`eD0ΰFx4g$Gra|206Y, hR=laMf73x$dфtH{*pmX,ZLD#!ML߅)ǰÑd>+4t2Н ؖ`q[&kVKt|qBA iWkXKÎxG45Rx {^N+>Y4Zf2dmp8M Gek>>ڍZ*dL:J&W3izh}cpzNwYeB>kFt^Oق >=???>>7t0*YD|.50V pq}% Ǐ'{1zfZ)V\N}F&6KvfĒa//?tXL~h%ER 4o)}0Ln bfZj6zj?bZ@yEg,noiͭ4讨ao̖x4N&hkjsȰ,|GC୆ո۬DAnW´9Uș$Eb|&f\'7=3Zgd<nh]DEF!Kv 0-vZ-܄>ѐiu%3I^}۷'X7wǧ<2=ank-3,Fdoz1>{{~#܊>|6n+%gdw؍>Y\o'GǛ#;Wm˱o\{g)szx5{]OO?^^g)i1&YV6u+o]|x v,Ҳl*UjFpU [aS}#/d9助w -zd.Y"1sTTkzt3i]WsFv 6\`KrR^UPzQ?{dM\9_]052[3#\,*~⟩gd,C'd3L3%bYo޹쑹d-Ng8CL;p2 UyEL. ?JiF )vNs 'q"Zf Qy9K^aW{~k"dziӼzyEdD#߀\[hK/5 endstream endobj 1185 0 obj << /Length 1245 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 219 /Height 33 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xWQaAq?JzPRPR$bqaqX%\rIHQ@?\>}N[0 0 > stream xyTSƋ9  !@Zj[mھ@"Z\rk|gw^{mafa^AF9uu QZ:(MM uG1beW BA00Aj54_5ԒPhF#Cҭ)%ShFtS3903516QWZB&jH73dZ6l5 b jP%ˆurrlHadk_gH)TWF7st===<`ʭc&*,_ʵk`-CH,T)`;cӳsrsdixadha- OQrkO E/R%J).+7 '3MY o5t R*ݜ&s &N6}RbZ:AB&Y;tX SK1fX;|Bb$3g[P[[;n̪)JF'x619Bl̹u MMM˗-Y8ǀ_/W͂‚nl'E(Ud ACS+[gπČUk׷_zEc5ӧN(+J&FYȱEbs{$@WSPJ3W6a-wѶmkV,_R; ["/k s dp5@=zQœ7oܶkoնeMa֖eIErk‚:D( MՀ8{Feg,hhnm{G=rлھeJI`mFN>(-@Wz T#s_x|j^yռ[ww)#サoώڥ UO\Zf%|/砇1P(TC#ˎ.]~? ~ Iey%gAJjTחoϿ<|ýk?8+ͯTV!MqX @WKl*c )  ĈPpS 8QR育)owT_Ǐ\H,8 af4Ilxז0@v(S C`H8<76..^q*;%ҴܢqS1O"?x'O>}_b1gϜ#n&Y(Ϟ>y;,=bB阜dQLx/і%\۰\ĩxEU;ep8{Z\x|oh,^Vvkww;<ٱmXH~kLGzֆ.I:zc7zP~若X0їjc7 &^V9w-{vo]ĿM13B׵Uu8LF`m'{v'XJja{A* 5& e +;E%f`mo_W^!~)7sέ(f'b86Ύvlݐ+ IT|JGo ?A 4NVvN`$ha q?4+oofYU̴$cǧh[ FEP᫭CuZ,X74.9Vmڹб~=щΣ=-__1(tF =»H`~wy=h)G.S Qgۙ!J/?m֝?qĉGQx esUd&lQ@h f4TM +H[|Mk۞: d۶@|4C5{3@]r<񯙫)b67AX\JNԚvj ;Cr7s<}Ǜ1XQE8#E5 V۴y۶n޴azlRt[|  FȫP4w ƌ^P߸yuk׬^Ѹ*F̐@_/2 G,5Ҟ &e)2cN ˖.F8L 6:(\PnکvWIhbFy͝]=jʄ22L'$Zͤ T NqzvaS++++L_:$%uI񽕡mֽMgbiRTBrFv~QqIii|PITŠr3*H)1…"ijFYRqefMߗc`p֫+"""#B@%v(6sh[u,;GwO_l8'yCLv:6δd;x̗yO7`Zr{-nAW$z ^0,-D2deӾBR ԄYUa}֠4C b^C[0 30üRj endstream endobj 1189 0 obj << /Length 1247 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 234 /Height 77 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xwTgƋ@ f+@"3 {-:E{TQܢѪZgb[+VQն9j[s^.{< 2 2tôutmmao:d5(R :uI$DAj54|=* #PFC*lPZXbBu (4S@75162ZBfjdYVl95 b,tΞXYH-Zuek럽 R]fd;nn|Ԛ3&rk<@^Єa<|n.N\[6XkB3Dvv@ŔB,k.?X!D@?oOW=Y☂v7kk*ዔShfNnށBqt,>!!^& \[kR:Y;*3vtxZ/wn*c!RCS3P$IQ4i̪ںE WϮ^2ᭂ`$Z, pukPXЌ]R\mr~ECbPD51vt M-\VYStꆆ+-]>uآdY/k9֨0C5Pkj$H|ШĜIeUKW7nشy׭^xʷ1kGd&HD`a!?!}PЀ\Up*,0jM[vٻwOέ֭^V`.fma^Nz,Fn-QX{oz~u MMa/jGwԼ.ol޹9|=;nZ߰b nb6%!ہn90-4@vOf dCc3+ť,kܲp'NxΝ9U=ZjF\,8i%lUJT#4砛1zŬП3inݩ <&9tvʦ[O]|k׮^g?9[vamnfJ|^X!f&Va]S7lβ@U`e/XslN.P&fN~fٻpʷ?\q?|wWh;wknj>3fV IOE0&URlA[Z٠9A*`%Gg/DU0lޒu[=}7~u[?߼÷Wbd NM @9F5#\UYkt->wuuC9أo\KqIYpVӰy._;ܻ_Ə⧶e{+,Ŏ,V';k1.UTѧ9Gn^>~'>} RsFCPym׮=z;>`?1]\;wvYYtDkR)$]-MeS9LH<7/P0 C> aX82F1p〉՛v#޸}'O?z}^%1 B/,2(/3I2<Ӆk͢u ~6B##z"ReȨ,)-;*_PrRz'?}ӧY+ ^̉h^Z.+[*{쭘&TJ: &ME'Ho:)YBrZ戂1%H鯏~{ǟ<pfX65Zt\ANdx#L%NRK4x E1qRY||K!^R2r ǕVU(yǿ?/Uh{盘_=yȁ=1e%c3c!_$))9%5=+7hew?ZlI瑫Z65,[4wsDA>1ԃRSo D&{I&@jjzKQF`c/IaB723-6vPq \\\<PᏞP6w-}xeo߽l hײy}^OvfdVJ|84B^wi TjT[Tk c Vh+|#bGOqVkM} *ܲqwgiow-tmHN_iTC1>tCWbNBT+;,P'ST2s ;|t:kxkĿQ`.0sʥu5U3g8Ȍ uKfػ 2 ;& 01A/VvؔcΩ[q>o^z/?7lij\ ̄}qQ$! YqG>)p v2f 3 )(h _11~ZMTcb];~ZUi֋64*afU|݃ЎYh@D3[V?nec=СmްnRl,u;m+/՟+W'3{P'6Ph]8nڦ-wnٵcks\&.nS,k.O^w]o`kE|ʴvEӒڥ֮oڸicukV,Ac]-6i!~׭Ŧĝ<DoW-Yrժ+-^bAfB@ cd ,KҎ'KFOv CR :/T~٫CM ;x%37`taaiIq**D R=/T#KJMHOKIEa6c@/$h()Jb#Ea$^Yu sPbLJzwvC:aXxx0$(Tbs쫘e{DӨΆW|>OwWy#3С:8\| ّy_@iO2Xlk`˱f[C9dW$z#c:ɲXL/LBJ"cOf&4P:aPgPd B6 uck 2 vƴ` endstream endobj 1191 0 obj << /Length 1248 0 R /Filter /FlateDecode /Type /XObject /Subtype /Form /BBox [ 0 0 1513 798] /Group << /Type /Group /S /Transparency /CS /DeviceRGB >> /Resources 1249 0 R >> stream x9 Emv!5!hGd v9SB'f0Zq#+5FŅFkP&ī, "K<$$S>MnJ9h endstream endobj 1252 0 obj << /Length 1263 0 R /Filter /FlateDecode /Length1 4344 >> stream xW}pw:ْell+N\@d#cAu-YF|X4&vRB q,(5a tSLL:)2LLvRt )`oO2f_t~cvn 0H0뫟VDWlz_Z\ #NGogwEYuO<1cj= uuGcO0{Y c(?ݿp){Q~艞MQ>/,vGk(KO@sA7ufG丒)d9ӣSrmqg8,xLՍZ`4:hr賦_nFq&n"4hh?p;VM8"pqϹ ׆Vg빊hkŲu^ñ`\e&M|y$9ycڜ9h)lM^ 0PaCq|"XRQ, ss7nhmrbͦtJY-_"otzzi즏 ^:bK. ^ŋ|ܜBs0|!o* #\X`V1l\$f)U2rXX4"[3ݕ"/­[hpf}v88/?5z@"& tl2~әZ=ǕCs@EITq#Qœy֙fYwjKwh]#Yi+"/XНuXyVN٣rivW=j3N^ \\Iӝ>38;M9igHU'aRnpN;)؊+x:j_ZډYkKǏ醦7xƷץX6K6M%6ʗZ} ,";Wi3Xo2mb <M A; H=;]+1ՂQ'S.Sw'{&wC WZ"_TW@T~%-|lrُܲ?,rќm223(RHjIDKdr4 JQf&oeJRkIDi,++~X#Kc>k䰤~WjmDL(8!yj$D${+`P-WJ!a0bӈ-uܛ +֠K2L[+Fcj>䭱9:5[TPTjU6a(4&ƈ3+&ǢC*E8:GQl4Gޮ5^ɢ'pKEYŵh>7ɒ/GǒeI㉬x`ƒ췩ª"K҃ 3[B*-I]QDlKx&]j@"`?FԁPJ`-P\ΰJ#L3>mb)]hU.&{Qu`#TȢ}9i+JU]lJ+EMȾa%iaX썤OwcT;SSRl(y.Fp6hӧ^*WݝOwsCHsIj"^[zHM*KwJbd;@U*CpuH!CU8a9f ssh=1h͡EDR />FRapɩRڸ0H>lU3p eKj"649&mrOEq6Gؑ*eRc`T\1 FlK!]]Cll4jOFTO LM'W仢uݔZgȁ8 .f^["Ml?˾(nb~'.mr],.7iiʁ 4Vˬ*!} khゴ1%:RN!\e}3~}ͷ!3g(;.:cGG\#nHH z>n?v^9J80WO ӾOğ+ÙFȑP9DC1D4!Ժy>)>Ar b]A9_/h?zHCz@1l!--BBT0#iIct{ә䕎`ljsH;՝]i _iۂߴk--,m!m&כI,m& wN\#fÍpy}kb^K^9Vo1QǕF[t= wO^?i~OnՒdo-YZKlI{;BM܄'&'aX15\5u?z#d}eI'}$+g?> stream xz xTEo/=%! t a f$@HBQQ uwq脀!*: d`1OnPV:NmN:'64CߍX{U+76/Xzsƾ ,1 w.llvj+,K;rpc},O^l^77 o ,>l&\#(9CQ+9"KQ% ΈttttB_)!-Y`oaFeQ. zN>Zh^lURm4i&4J(-a[v@5\LRwiB/-9( IDzHݥ:$eR-#ki4\a'u5VhH~T@:Xm|E0tUœ_3g{wny`æNj%[Wwߐ4b8?q<\e08znK/ьTg7l|\Ap;?t:R)hZMVW544M&]0eC5++mj| Ojx2@=;YԒVEyW8#>h-kˣy!$rД~HL“s岓ËS2bԻ|T{1һ\9He9fK1(&y/o. ]7q-Ș8N- xS`~YGkh,G\j'|7}&j) _ubr|+_ϣfBIn4Y.;k!+0$S56PdXU?ݰqG )Of=ŤrNOUܡ(^T3buKiع>U9ڒЮ+u )'GSN]?cs&h3մ8[6 %fz 9cgOf.Bsu a9- !C  کitШg/|`+yR>qKUfv8 %PE+ lckgR}c\4J$3$x: <g>f"zs73b\}b8 +`[ߋwTJϱ(e`fGpUB&|:16[ʦ9'~媧޶\~b7ڧSOWıĻ+BPfwFòT{S;kLve Ѹ}RBB$nĢyDJ-y5r9NiZSmvSy8X9^?k~9hi[G4ji# L}fQuA}*rK&>BII?Աg5=?$򻧿!+ > L6qf75@JJ<EW4:"^GnHRGP(+Ѫ8A]imgmjY,W/ܢU\>1SuY3gB!Øiʰ؆BfFg^W R?T}' Uj:^+ͦx,rw|lF(fղhX"hѨC`0&SDaw( (-d Z,^EJbbޗvI2zC3QNo{˟5>Ѝ7;ZNe{nKU3 nȃiYgjfx7u!qn=4!1'mvqƜG)v,lA 4E==4KOKu\L, WƮ2kjC UF1i-Aa E I!O|vsA 1oz|M]YǴ>Ç_w|% dP#k8.U[By.I{:DhpCM:CۙN.9 d;IMn4D41T:/@ź_WZ(A9q1mְMo!%)u,(PZ B汼V=gj7U=>|9s{ˠ[2'WO~޾uS"ޏ@>JIU_&dy)y#RQQ:j=MERbQ=ۧO諾K;+e{HBDŏfI_Otf#gz^i-QmMkWk>ͷ!1r>RF&|$񴢄^EӒ*B76edɎwnZyY^gVv/^n2eK'/=2coP+·-Ahh"!GC)v g~fΧиR.qHrr.rxZ욡 )eQxaZb^߅(S~oi EBgpuBf[,,4HDlbĕ-Lp{Xj]S jKS;1z{Oд]#QI=^̛Ր^^.4  GS#>{_L@)H"J滖2絴4$bҲ8,fW"++wCO1vn:E?t5L]ć'({7\t"&/?nu"I7s֊GCe_tbfO_9કZW|d zQp2:Z'>HH44G}{[6Mt$3=0!Aޮߨr9e&D Q ̶ Ia'*DLAcWE|ea?֛<%TK^̖WM T)^Zӻb2G6H(sWD|E2J;Rκ'lJ68^8ERg(r AmA0fh9m.\ޠ%%MĤEsLR:%'qQ]6qȃ({ĘxT<-N2V R%+e؜/Ůj$r$bs0\v9`J%ҹKHfcፏy[-}f{ـxfXc%O|?ȯUZf85) h5D.[Kʿ/3Cˊ'rq9jsl Gv-?2䙌eg_:{c'|>@eܴ[AJj]Ov.݌ӡgrA{=;44欆Lt]y6"W<3#;KFɀa=`P= C V3(xM@+[ OLt]:MSlhט [鎾䎞2m]'1 6vȈ1"c58KPA^ayV5^Q-@0b+Xa3RoeQ[0O; {y#*a7UCSf3L$`}x D=Wh`=d||%~=x I[:5#$<7}+7t27?~xΐh6,:f\$9J#8z#|Cd 7Gy"C./BxzH!MBm|B$Fa5t!L2|B… lwQo] Nز Ny.Bn 3p`ϯLk7Qxf^&mx>'nnL:.x7"8g$BQ===?_VD^!ܩLZoȇK:Ρ/}bX sd M5d(=4+sp\+JnjAs͟(]1 N{Xu~ +ϸO?p ToZ,̄.#^Vm!=hʹ XDz1-ØD;-;~=ZwK5vHI*̊? M0q/|`/:\ixs>#Q0*>ӏ4Ei` ^v#e-P3>sa] g#>k)g>%O4hyyluJ40;5 3# /-qtrd2:]t}tٕQr,\Á1cr+~UQjԵ<1^a"3^$\ ʀ;Yɬ)HSc =A+i;ȕ΅r˕QWWp:Fl!s;c8Q,頠6b@Ee`+qʆS++<~9/071SDa41ȘL#/b[%[oq 5ls筈9n=[FVoukt.Y}3׭~ؗFշ©8PS#pJ*@%ocz<w{ tg])Oce@MCSo9ʮk[fwH`;$7hڦP ;^,a+ Ed\Iu4eC}Pdï`|]{MZb±IӫCxbQHƀJa$v}T@^o@a*}t{FmAY-$%36TOG:iD=O'H ~ߟ/$l*f.*x2#a(Ᏸ A& ?zUدL>A,lq8ڣI+1\9@ @? `Ez3[X׆QJjU0+A@'RzO`p!Is!FP)|fZ#(ܑFt4-S bmR7ڛhG9ҳ(Me B8g1 >29 G駘K/lesgM>,*;$ % 'IXyoO`>(N>>TH}ԇІaB A}>>b'>Qjz馧:#|vo*}Co4i>(a;` 8ʁ/7#(9e lCP#4sςbh'|q5D|H1el;Lae;bY-H,|:X^ )7!Ų9H,|q U& )(& NZs-E*zDڢF^U*5jPۺg8T_T"64R-ƧƊ"U1qB`mM;&qV\@y=37SSN2gexTſyy Y5:ljM,Ԛo\8LPMan8GTV &3>ߑ5 : d:-p//i4RB OC5B +h/2] endstream endobj 1195 0 obj << /Type /ObjStm /N 100 /First 993 /Length 1505 /Filter /FlateDecode >> stream xXMo7W#N|hZE{(|H[G,Һ}Jv *ܙ7CrfZZ.dC I` .0*NۘBPG1GD}erH Q;cq\CUq@ނCQ%B B "%lB "%bDD(GDDLDB͙u2% -g m@Ȑ.AqQG9GyO dɖHX/E!.'!ڕ쉜6Y"O$ (h(1(HVsE^j8 B9Utu.SDDb3Ddzb T=* P/ QZc@Huq΃#8yKTQ opO?Rc($0l'Gk Ar0'@9yrH 9rBR9p}FXHA_!WLP/_oח} N~nSc}`JjzhSїc;5ָjt-Gq L5%coEGi [ypVBcP&|O0w 4˫WI~c #lSpxIM,>=i^'$܋x9mipv;mˋnp~CsBFgoa}^b«}qkp]ub:9m+GNW}wq2kQ{ߝOWZ?Y|^/I?Ly?_r]` Gj^{p3= I_s̝}i;>>$@P\ "Bz"l=rk? ~#=e<ҳ*9~laGv:Xɡ6:0MP5q};҃& ߤn-m>ZwκdBYT4J>Bgbӻ;/va@eaT2Z&{vn|Ʒ>un<7^v6lhv6lw5%`aYfR.f%DŏJpm{lT"E y4RF +$6z7Ʃ=z*ac*CޜmiMsm4n,ꥫMG 8{ඇOQp?r|kvuw/? endstream endobj 1262 0 obj << /Length 1268 0 R /PatternType 1 /BBox [ 0 0 401 401] /XStep 3686 /YStep 3686 /TilingType 1 /PaintType 1 /Matrix [ 0.801442 0 0 0.801505 -4 430.771453] /Resources << /XObject << /x288 1269 0 R >> >> >> stream q 401 0 0 401 0 0 cm /x288 Do Q endstream endobj 1269 0 obj << /Length 1270 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 401 /Height 401 /ColorSpace /DeviceRGB /BitsPerComponent 8 /SMask 1271 0 R >> stream xQN+;DQ?iS$$]쵵@lw!I$I[![]f#&N=1b$* E$E tjo|U,EoEk?IzX;;Iߋ<$)i/q8i(q1CRcail񯃱Qſ*H_uHO5⯝eH,I:fmҁ3,ِBwΤ?W"=,Jc nIxHH?Bm^ aWVB;fp -\uI^GJş\@ Ep%U?U@*CËFc I Ns? şQ:Jz(_:Tӕůk_4,CgbX+~$QZaa:tTM[;ů6׊_I/5ؙT=_&/~A Vj{K~7ܧ!}I_͋?W;?|{?ve?p?pM?j;?d@k?^Xk?^p?X$?R<?RT+?Lk?Fk?F2R{.[耈4?4 qY]ŏ k)~PO b~#F^|Q&?`OhfcƚV@ɦ?`9ŏoN* )~@ (b"& b" b" (b. (b.& (b.& (b"& b" (b.& (b.& (b" b"& (b"& b" (b.& (b"& b"& (b"& b"& (b"& b"& (b"& b"& (b" (b"& b"& (b"& b"& (b"& (b"& (b"& (b.& (b"& (b"& (b" (b"& b"& (b"& (b"& (b"& (b"& (b"& b"& (b"& (b"& (b"& (b"& hv"& (b"& (a& (b"& (b"& (b"& hc G& (b"& (b"& (b"& (b3Y@;6& (b"& (b"& h_,ZiZ񏂙ſ/Iſ$-SkTҒſ,'PCM҆ſ;JG30!$V݇cKtA/` i`eERWѰQ)*Jқ:I:$$I$ endstream endobj 1271 0 obj << /Length 1272 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 401 /Height 401 /ColorSpace /DeviceGray /BitsPerComponent 8 >> stream xidEfGQmTiUeF}ffͬ]=ϼ=q[.r.r.s~F.2>%.,>{⢲2y2x_bً*co@b:e9˰F9kq33\L31'w3GgBgcT!9([GcF2frWΐF验31ГH-+h4Y&Mh- "qcp Qn ɰF1Ц Pn,(hR<&C69k5bXaơ8A2ɑcȗgݓə8:z͟HN P&5E$&A&ALΌd#A82iE]9" "Q"'sp?ox$CQk?`@&s$~y G!,/d &zrIHx9H`( z'#T40br!4 B(D IsH f!Nsx?8ZU"&d$a5CHK\((`b2Gr׻sx9D8@b0෻G@'dB204kH W]HPB*9f<<,Ci a/t~- UL ɣcVU!0B#&:ZG J5Qm"IJBr>)G ˰ $E2$znaH"9ȘGsV GYt-Шh!?̡ PPbbHJ($7'꣎+Ve2J8FF@ ix$P&CT%ڏ.2AţN+GUuTFF YzPḒ%$bl"9/GW2˴בA( hPADD\-80$۷$2!ղ\xZCq,ñh5LD&d*!YDycy뇬W50X9`V) ` xտhQd]IKܪ!QcTQE!nb\q%AR6:ʾUCR-oBdCWPb\x8H1Ŀӣ]2TUCRIpۂ"Uk9GW, IpnaH"wFp z:rE;0Z@Q *5#ry:qU+2B!-8E Kp t;-v!EWp9'nVWABCcMhg1q$␼[tGl\C7 d\eZU8ZC`xbHy'X]@}J=sa ĐԱ"o F<~ :D< Gd*ޤviU";V5r07p(m9F!:%'s[4L4Ej o료+`Y* . UHy$X~3F֜20oǡ5kcz D-">o^# .X:80Cc gB$zne=j$x-X(2t{9VX*C$uݢnE^ŪPCk  oߣԹWT#Ј^{ [*$0D #20@QǕ5D(MBc D>"}įZQSz6wp+,BiH±EwD%Uj0$ +x@q9v(9 -؋4pCkl`=0JO(5,J@BE˖W-W#8Y2b =T{D^'5H5 ߸F5K.XscEc$08$T$K+DK"Ck(`5V`^8vp&[, #tbo-yYR#G±FbEE;v5ODWB?̂5c$j ]V4 큅RwyZ8["u V-dh彾 ,X^]@Xdž";=+XY@3^wx0՞X Ol@ʻUN"7ߴGfR;/9>^d*"^ nM{]D.7_[kfяMewF@F?N;#*"З.Ϭى)%V,崆=Ѣa|mg1IJtycޓ ORC9"wYͥN1/\U@NcED|m*B߿#fKn@6?k}]כu?&J$*Z~=Հ|""kg~&VJ׏y{9랞W<WYvϬxXQ˧X'||>K>y-o0D[/'H;"gV ү$EoۙY}0/ +G~:,[$|U1&JdB+ Hά%2Xx+^B`bD<ˆ䵮g 3cюL=y{wZg=ϚZ|*gBҋϱV&Wzbb@F",Yjn+ݱNҗoPbfϳ3xKdDU_zVh*݁93KMoD>W!X3+ŗK$`uϱدk=x]]"qT=yw,s 9ͬŷU" A|I`[SѭT'VXbfٻaY|ߥŷY"]AVBcbԈ~}$>bn!{;DqV} $\NoUX'Ξ/pgM{t KBj,& Jo"q|GKVZx2U\"U׵D¯ΊZ}]p,{ Tȱ_3]"]dEk@*锈j?Vwlr+KdV^苬t3ViY$\n%+t|7+_"8+j5\='Vhp͚~pX{TVYͽw_KuTհzо%"f5ad߿! ~§Y{N u |{^d_/ f}]z3֛T5i^Cܣų^f5{o;!7bz]s A̽0xFlSkǼwqg\ŽNp/ԏݩz]Dyof /ѽ0dO2xq17Ñz_zO V/"yo> \O"B& /g'A%<@~Hn]"tUoQg8 RޞEA0g'Yi]א<{?>za C OdQdW5 A_@@ 3i?§CO/ ͳ dcsع!c739 |t2,kN<\dۏ^urroP]1<T著!HŽ{onW._<5亾 h ")F\;v* KI|)07mbq|u/~ ?Gv7ӸvoؙdLJYoi[Z+^?qU?o?[uQ 9אg{]~p@uf~`0H"dxF%255d4׬%y YgnkYx.~H[~_Yi۫a"21 YkZV&r3+HuO'Lݯɛzu&3W?TAz_U'ro%rC}XɯTH}oJ~G~ҝXwQ>7kd"2PR>VgY'^@‰޳YBAZ%‹:7Uީ Ah53K i, 9 %vz^"qY|?~;v/Bc5&hJ$}O3 UXD$xEkd%,bf7E4"$tq+TK>7-̒O>"s'j-=^3K)b9 4x ϱ5.nHۊ&EU:}{4&ޙ,a H\9Vcu&H2y_E c#VV89,[ٜX+ HTVNytfgTb]hu"١zK U8&g?Z F譀J/OÉ5vg m+8".u< wy\BL2ϳdm}|ÈxhmH$yKWLjպ|kD>7Z1v`·tu i<i̬ӈ؇Z kt'TϬ cuѽeԃ}$ 6MW֝R띈 ,| ˃ekGE׷'b؝75]:H ,xwJX HV.D|eb> ȪYZ"Rh"sC"I~iCyw~Hw"l7&DG@p`F/X& R*}U3ZqRFiG@.6"}5d,.y2=FjGDE"p;C jE=+/OUz27/RWzhوH =X |Qy@l#RN-O=Щ@$ z}_z -S#=k$#X_؁+oy_ W[5%Y=j[OXqDuZ\#ɪ"OCrG켣+|DD:^F+gE&=@*wtjX_@ #bCz jD{O$ݼ [@ڵn#RVߥЂ!H.!E"GP b`q{ HV덈^_0Ħ%-rM$c*7z]yKz<%"Ro0CAHBǗ҃<\X;d0"AˡUGDMr? ҂{f`A˕w_ k,Z C]#]$$$t e 2Z5"rhPZZ!g&= b7 w H7"aˡԈ\~H8LmU Q ~Dꋗش3-W#c"iHv4=M7Z Jh {HGtDL*ϴD4DHHVн0o u㥁U Nd$ZfjM$&ῑcXw`DUiQcF%7`l J' =  DoXQˀE$uz5V d&O+(_ϰ`4#]FF]>f9, -z15N "AګZLjd)vj%"Fr/<U { w ]}9"cXBIv7>/a~bR)›RrV %.#F.XD.&23q‚ŅNJek/Zix̨E>"Yih3JC (d`5}dumDZ -[:%d G<5z%k҉-q=/y0V(- !&W*MXCpRp^Sk Hв5"h|Dz$d x%P,Q55rxW:AH#؂nsK,KI1Q(JaOx-*FXQ8׀beRFǣ?q!s+&&DaIN X,00V]я=H:%HdL*iOd ` H)xtE$6yLJa: @X,$ѐJri%Ѩ x$"~lILLЄRWU), HXH p48Nq!U"DĚHR]FP<0V̪1m+<+CH䢘 UU d~ RQ'UUc4Ic"MU Ku!{HX0pf% {Lx,PHTQ)BaLVxlÊ"1&T* $Ib = x<61*tL R1?kX,#ԘH(F)*a$% EVCqYH pؼ"i ˘ClQ0"ƣqG43(.@֢`44&8Nģ!HҘ T`AmcH, Xq2!IHEd6Z%1B.ƣM];@r6F%*H4F9Nܒ$.&TE8GFqӊNC y (E5qVh@AbQ0=3PY8$pH"*"aßH# ǹr DIk("]ڇ1qIC!߳ƙs,gĚeEA#q+$ġ(8o=j0Hc0gñ?/7ağ8wtH"F*KOBX7c9=a(&OYHYs3ibTB1r,'/7&Ūtd~#7c95(ȱŸ 8௺?ѸiI^ oD>O M('}A2iqшO$(s.?clz&)JWZ.p/RWeUiV;tcot_5.#÷|P4̱OL;cй`l\0x.<mVr.f1+ endstream endobj 1276 0 obj << /Length 1919 /Filter /FlateDecode >> stream xڅˎ6_!kDQ1,fӷLĶȒ#Je٠6YU*֛RQ *RiMNʼOtfI(ʴ Ϫ~~?%~I2+痨ʢRI.5dwcmU?Y3"6'^LqI~JUvSŹn3+ƫ+G ¸Mm"rn!*N)!R fխlJ$xd-MX'L?Z ki(d徰 '3ӄp93=u;]{zݽd=T|ݛ/Ԫ4t5pF r?B>egf#G* XR  Q"W!w9nᲳ359pR U `4J :i`-:Ie'45SZ\;5.se-tt,Cg*9&3]z'R2rS 3d0ej.SNx[BE9d@3ard+ddޜghk<+ΖnK063#?&*D0S“T!2fFP CEgQee?g[uc$W:GG<̟=,J|PNtح 5W4SϓkqȡS7wݝضls@YzpA¯ 0 Xu ADAȜ߀rAɊ9Cg:p<%$/CQGbܾq^6yvKJF1#UG  endstream endobj 965 0 obj << /Type /XObject /Subtype /Image /Width 1065 /Height 606 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 1278 0 R /Length 77150 /Filter /FlateDecode >> stream xXq϶*jvؿ_[kZA=Dd""{( 2*{ ].(}>=!M~Hrw l|"?SV@^@rhy}t_Xl? %ņbD}d?G.*ASƶ-\=6Zz_PPJKйsڿWfc׭=s`Y) q {w2"Byffg)ÿ79D4ۼ8gY>XVH"5R$lNL27x%2 Ďӱ1wLj&v>90S!Cu<؏\pz:vLݍbI+ UJC"-! <R;tU H@moD"I".(E15]Tء;aBp[Hvi#À̕ NSsr]`֎l0; +f$r3c`"m,#V@:Gߩ"e>+?\W-z5YpE%/YDC$ddddk.  pqG/?@Ϡ@C#b?0!.:)!69Ӥ$)O$́,\L|܃ $RwIAE@7P=~zx  ᣘqcL}YBzZbFZd ddddddz}  Hz!㒇wX߃b=LJII~ cFZbVzrNfJnVj^3Ȝ @.AFA^AvAAAAq\}AAzHT{A>#GG=} b:S:,}^^Q\YR @@@@@@A.AFA^AvAAAAz  H߫]}_hP1Qa#&>OJOJ-K/),+ʮ(*K T́cGddddC=< AAz TGH7B>y}?ITj㌴K *˫.ϯ(,Dz O [ g s  P=Ac]y_}zxzGG<0-IVzRAγʂꢆba "%(+.147:=@C"!qDAtE=VzEyP{zzDG{ )!:-5.;# 7(,˺R AA$ d ddddddd !c" HoAǢ}"P Sr2 sʊrk+ Mue-  'E"%(+.1UP`=@z [n걘.4p9mOۀm.룏>pgf/(8I^N~cMg ~{?9a䢼⦺Җ2ra "%(+.147:Ƚ  HgW<6YayRF|g3|cG?dd !`BA~B'X D,\^JBduv ŭ[v֯\.ZンGwߜ9-ms 8vQ# "‡l,ȺkWtw9=؇Kk;S=b"cA=>L*{VQYSP QR_Q AA$ d ddddWL*{V^Y]S_]X[DpzpB$ d dddsz@AAAAAZ = AA zoIСCp/^ ge_ ))5"'>w7vwvoȺ[Æ D{7-4AotdP\lӄ穏r2Rˋ3˳k [>JZKD@@@@@A.AFA^AvAAAAAABz  HzK=>OWA N {Q=|<s 3gvw\-yw>۴y{ԃrk{: 8YM,8(CFG0#>yʣ̤ƚ+H"ȥD+.zDAAz  H:R=~a# ̢n<9r˗t=%O̝3[lܰvM8;tP{. &\-:x` 5jao,BYz wmEOmu?ˉE=B<T)E)EeYUy5uE-`ŭ % "I [ g s  r2 T ?׷g! HZ B׺:qB'XÆ )碁O 2&9;X- 9-Ź-^8b.pr(Eh`l F`%l,1 eG=K8V+##J=SzBXSꁠz  Vz8z9" mv"q%5,3"7&#i|DzjlnfBq^JE1GV}UncM~s]aK=GQkC1pHȜEOs29 '4ȃ.DrGEAAtE=3Ȋ ܣח׋K7knv&`^^{xWd_ldP"I [ g sJ3 sҞ$=xs! !G }<A@78ϋ7xcS/Ԅ΁~.G%p dxGXǃPo= J|,6/+8iE1GF]evCunSm~sGAK}!$> PX[=֜HȜҌgLx4:9zx1{p D@ARO;X( $jB8A#H u/&2 .Ti?N,O)τ&↓Z\ {`?$+W_f}3?cFnXYO7[ %1%>g׶ŋOCӧA0洬EYiQ=Aoɪ~^{}\B\1 MԄ$yp y$:8qXJO?.I*O(˨mko$D?r% u$eantVNjo@?ntTm='o$- U9uYU%eNT` -C_{AA^U=R:@70" ¨p_8S#H#62QT`\LxS%gyPBucmyD=b" Ç7ŋ/[ˁ};%Ď)+Ȃ>I=bt\*g֮^>/C^-, 䅐N`޲G TA Á!wCC<"B} 'ǂt&DžăwDe?.N(K(zV]^WPT\ R?*!v3X/L@1rSeI? BycY)E9 kLXYdou-$l*y^VR$d$TG?O;AA^Ty/y[wo7v4s1{)4=OP/0ospһ=`0Fl06Iv19g͊wItMrK 984QvW,#T#l{q)Y=t|~/+l,"'?3|W$Npˌ YqQ譨@K:8:_.Hh㜝%[ MAAzuR@{~ᡁ)X٘]t0r*|Mɻ,.YrqiO+9o36 A!ʡN*.]GGkQ }r*a7OAb+}DدK ~!Aށ~;= 0^_p mwlXĄgϞgggc`vDiiiYYYyyyeeeUUUMMM}}}cccssskk˗/^~m;#--m.uքE/*޼yr*||nݚ1cƱc`OիVEǥz``````}iz,}q\1,5!!>9 3Ғ3R 23 J ᬍ KYq%yeP"TAX_SXWP ckS5/[jWuUe۶<CR_eʲ]ظa}muL:K4u;-ie֪oTI%\R Ʋ;c٦aA7 E$Ǧ$?I'h08SCA Q"HR]QHV#w h o ,^4heK5o-/oC q6T +mx|DBBBb|̳qp^N(+ jB D^, `A1Q_|>sׯ&&ؒ%ZkN= 7mCxҿ8{Ҋ?6 i(yjBvFJa^;^GqIǠM2%<4?E ɢz`````` rE=obe$4q3:'1/PV: A9Yp.ޚss=[UBt hHIz ұdwtGfFѣCP=000000z,D)O2Ғ6nX gʲgdPp$&Xhwg6W] `U{P*;`Ǐ?hט3gZT z\pR=zUōuٙ) {K`m."lH?dۚ*;գb֬nZ^EV '_VdyI.6% G1uWN6Ç6l{/ؗ۷,'M18w#G\jEyI10ke'Lfn-`3U\L=?wnt\Z۷mAT%84Wz`````` zXb+v! z+O>1mGmoD_1DD EMCmŵ H0&FY_#a.2uեΎw1QQPe8F<,tP9`0g¶- p[40(?,[ oz4Wzݹꁁ1(cEWA >捫APIWXnP@qa֌#MJjˮL2F=& 67T%?y齨mWW z0zL,ꁁ1cKzP۷>yPY"yB(Æ +."JAEi>s͵s uPǁ}{FBWMd11R1Ue))!ʧz*X\m;uǏiV[UzhXd/[z@{T +Xcz<}>!C|Rbp&c_FEֳgdAA=m4wCBe'nꁁѯc߼GyQFDxW\\‹""KȨ2Axd @N1=ġU zXW31W=1bĪU+fLN͜7y8j(B=̙=z``````XêkGI^uwܼ7X|9qaaaݝPWZ47&?͛9P,dQׯ^3fB'%Il^Ëz+^hL][X=Z=.d\[=K]rsFdS̝;gEcC]P!S_ +cK,Bl걦C=6m„ H=kR=/ z0O=^4׎=zݨN=wz^㧟~a+`?L_߾}W*人:qqiӦ9믿>wuĤwVSEnwҳ@{nhz8xO@=])Ɍ_=ꁁ1c-zG,XPSSCVG=} SF+;w @U_YY)++K>;y4{'= T~n݂FFFFMEZMs4(QzPFW;㡘@SRT wzhhhՑrqEEE+1c444^#{]"z6ͺ ?tׯzxQ_WFyQ\qnT]ugŹUe) l(cn{O@=]FSL*/E5Hܺ̀U=+ cnGZZڏ?HVG?Crr2YΚ5+;;222jaj[[ۢEIruuuFvZb ,** ~y#]ğ ,9riӬ#F>|8a4VV4i%em،ofŊ[FFFЀ*qDO? tqf&$}H,My6mJp3~󺍣t6k/[_|>s濘ϛ-CI%\R Ɵ=U7o@ eFLL QqMDVV پ};[-,,[XXQQׯÀرca_~%%%(y湸ܸqcĉH 333Pgg篿K^^nkqQ}}}x+`)+|׍,;+wʖMSPHT~222|ܣ]=Zj8"죪yMbٞR=ܯ`>X;o΂l΄Lj6?7_jko ZEL[[J6eL_4L*_4U-Ma{_KEx걓T.\8~8𪡡ZBɽn:?m۶ݻwuԩSg(//1c @mcX~ٳgWX6l$fՈ<5k@)/_=U@@ky_UUZAL6 Uz@W0'P$INJ##1i > G&%55`E9o#1zx\y|]CQn\U wQ sV uR qT vP?hw6VFiS>NyY~?wƴO&^t׻$ŜD:\7=agrΥcwݾx-Vn{R iz~sh2+!iU=j*czV-܅״4֊n񕕕1VNggg/^3l0r`C,((X]]GL0)u2?3΢ h_}9F.[lȑƍ{1p]T֍U=-iZr[%Αxգ&6vK=j2RAx .-)B ԣEz@W'9)~) R&Aπ$ {ϟSBSg0~&i"<Gesh 73 3&1ZB=ZA=jP=000000ޯzl=cѢE[n%`x.]*))yfZAǍ3y/_U\ V˗,ĵk0/ R`===SRRت SҔk5}"q u`U2OՃr8Gz(,,Q[SNGuzMe;2hQ8S=z,^wIK-(zŦ Uxx'zz6gū9bssszx<[ZZ/O4ܹscǎ!7%7񆆆Æ #ֆ k԰>78::²X,) #)+|u#a1!n'wVwwwʭ`] *qD,|[R[]B.P 7m/Zzf^bًQYuu%xxOzm2dHff&gRExkkkV^ 9,|^OGEE0vqq10aСCL"++BLڼyQa''9sL<Ȉ\t5o<ˬ(Ճrjkkׯ_?sL;;; fٙ8q"zxyy͘1cݺu3[!2Uџ~=z4P//PMm/ۿo@=ӄŋ~7wxG_100000ql{yT^-))Jas[zTWzߒ~UK]]@==v@}l>c7z())aA .=z4eAzhi,OJaG-z@WU cӒH=(/|_}cǎ?D!$$īz4WU&zȾ~򲩒O@=nkcHK~zQ=l000㧟~>|8z47Uz9O@=+ xǎmpէy86mMVZؼU+ԣ1gF[GM-uE|]~6'OZOޥz qSDummm0""Khj,/)r<޼yͪag_6ImI"tŋzw|g};I}l wEᑇ^q~("A~K??f h(+e%qʼn9Oj ^j!'*43I 54a4rĈ!CL(Z]}GY00000YlfU-GUy~]uɃI27niy> |wG}rk'I6Oro3`-[Jrb.|;h.] pvv~׊ .zW&^éa,[ルG|Õݕsfc  {ly`````ª[Pƪ5 )OWUVmm]6$o޼޼f6i8ec|R=Ɯ_>$cjHͺ5{fxOwp 뉢uۉ1P@Q4j( y_6Uo߶2SS]{g)I1Crs@=]TE?`b`IO|RG$ƓR=RaIx-=5<- '<'naT!om('` ;c߃#c̘1C%LIz0},YqΜ`1Q;'m;[c泾fAG#_C]EB=J ]Xg=`|cEqʩ=}-\=&n^?t`) 6lӈ⢡ֽH`43t{4~nV@UYa֬`3Mҿ ؛"-!DK~z|ݜGvj[9ǀenЃY00000We;{9mlor4>HIaŋ+Y^v5qIl$w[:g?5l|5z^p9mrad3"(OIzDܲHČ^AxT H]V=}ŎmHz̝;j2k'Ni hN4;X;*8 䚹ȉcdL *%* Z9|p10Q=HxhYwѣGFp<$GY,74kJsFhn+&*d" F]6pP=0"mt٦[=`7000_cvTR(=r)0P\5cd&FeD<>C2UOG t2@"`ظa˖0 Iچsofߞ]`1Qu=5sT "FPN,} 7000S@ # / jJ>;I9;1sAKOɓ?~eoCዥKۖnM_lXx=T];N˸uH)*vbC:EZj0 V~ѣGg= PZ?hVAEznXYYY޴w:by-juWXCA _L}x{^2r52p6uն=zuRrqDW ?BÆ +.")L=X=oϓƺrÆA}@ctjDQ=X{W >6s]AΖ E `lj Obϊ2p@G@PI PFPvf쨦䠦 (:(ګ(++ة0}2 IlR0B#74T'J4UI8ug-v\p9Owq7\uQpMwv:x00D 0D7 .2aǀq2 vPor)%@P@tX ǢUXC&6Ӧ^b)7$jO(?;ce| :}D2tK@P$3 먳Q2[~;؛:,fܝ=ۡ4#qhVˠӇN$CGn$ ER1 :/0r[CsK~/{^{SǞűu%t쭜3s;QBs!MG-:: uÄ  \PJفJhMح7+0+9Җ2A=$DLEA=pUzuǮ#\=<ܜ/(8aK}MS27mJd/V >%)^=qvP]=/P뉘yjVeÅ)wi•/(.f\Pg;\‹/s_/;fA/iZ v"/B1a`F=3S\Bv9UD猥p,X5`Z+iwVHk%L謄Jح3ćJ!iċJݤ.M8wgZ+iwcPYIu܄J޺ W+!2S~{Z+pv+崒I:%}u+QacDŽt@=PRUzq>8ϙ3;$ȇٌܾFZ|YN3TA=WSLg{Q=Zb}P=z]=}yقDSZ.~Apw 7ZFrA^p oZVΑ~K~pW {i"/aZ_گln.ZqF tmYI( ZIp Z+aBg%4Vn%IEg%VNk%޴VB&vn¹;ZICh㐥JZ t>vh2:n(r;3#?aNsM' 8Ou}X9yqϕUIq+(o.lLx7[Lt奪SrwMMvKCt/ׯop-P#uQ񢉪a9ՃM=O9>SSMa:| >PV?ѕzten2`SC4coWQ[+ikLTw+8OغwDX^3PNݩSt1ގ!N:OӾ|h-Ǿ^@ݍ(@/XOĔ~~עV 8;_PV#\̂ W v_p+H v8͂_ԽA~҆k&vͭPkVf F)i/mBT_x%YP˅~;d'Ќ- ~YJZIp`Z+aBg%4Vn%IEg%~V Nk%>VB&vn¹;ZICh㐥FZ+tv +y&\ęJTX#p sZ }0/|T qCYzS ғk'?|=ȏ9\VR׋Czm>yEaF5ɒܤׯZP"z rae_KΪe**2ڷwϽ=[}-+ur^C4_xǀS ;]3 uoh>*%kbl_VVmo믪d e|yy5@qn}RұÚ^N]6$z$%nx )fhɪPè5"CK^UKÁU7`JBTS= !;?rNۉcazhٽ]6 *$U[R= t>y?i~*o@DP%ϖq G?Q?33u.pv)rV<\.#k)r@i13ێzz 88* hb%C5ۊg/GGB+uJqO544AEQ_~e %g9/_ze䮃TzVZZ Êw%[Nvz:+۱@D/hݨik{ pcY0P)&1Cדm4ԮΠzz \سB샸k|ܝNSa]jCIWáSӧO{…X5/6+I7>9 Ŗb|}T$3OՃ;V=h2OedReO.!sfӶ\Eߜi.ǀSZUUjפ%.jW.y9ux?}M\D-o Q#N^|p?>6橬 R[^G5O;gcSXX iG5]Hϗ3rtѮM:#=mWdzɾLQ,s yWਐ:TttSǏhhs\-n9oU-:1ԃԔǾ=ǺP=}`PAAzԗ$2zRЊk;aq~ϣ;=)EoLT8G?T!W 2g械E/ Z2w +]1Z}1㼦TuQnz\;vX4伦#,9YOCM1ed~k#ԙt5>`1ВJC*0 /^H=K6⤬p{JWL3NJSS nk;Y+߾hh- hkYp43 z,7LUeIKwLqR9"Eֆ^jJ;+Tn rP]ǵ{T='0@`|qWZ=2@.^h\˗/hm!vY9^fcǎYv5ΎwFu˦U7|„,^T? a0wO7/T[;YO)ҥ<[P=P=c%ulmŦTTԴHJL7d|]=C3:G482ݺyJ@R#BjY4qWS6 6?raf `7aNz5h3.p]$Icآ[d`13'P];Ϟ-ؿ8zX\wꡮKb1?P/7.qMs'ҳgϞ s=M=? ׆.+ɂ=s"uUvniP[A|]g;T~zHv n+me=`ƐI\njXTNTc eKFj6R&G$Du.;Y\sTeUMZ7(*`*0#$'e(ʛ}}' y:G]7 t zs('JmGa'z466޽{ZZZx@ g#o^7գ믿2d>I9YfL ^su1LJ~[w9{kSY_FGvD& m9dݑ#&NtgZ!!b}{_-M=b2uAs^ 55T>{1AfF+mMG0 U[MQiIJU[)[HzԔm@ }5`$"jJ5 3R=zM:믿,nܽrmo^ p荻z999&,,lȐ!֭#ׄF=Z?1=5 + 8Ճm̯\jn4񲥶 /]S]eĘcGG4V]379qs)fhPlb`w{֬ȹK 1YѣG yWh<@ՃqdȡCdhWqkQ=aV_hyUFRJkqmCۅW͜ϩك}TWi^9~[ 캺3.2*쎍ym}23 XM=t52SVZqauYii>k8X\s-9+w &i-qA˥}Yoʓ0>"|^.y3HD\.@#""bK.}@m_e&(}=S9gt?Ξ?1cxQKa W@mUǓ'i^^GL:e  f͘)R* hZ^b5n ++e]Ç7nuyVW=z(k% - ݙ^츜1~Uc#۔f.;_8lg][|THI':|!5sYPoxir3&AIsaA[ܓgJg/]7 ?}#?z︠u<*(oi~}YF>fPMvd"#=|c0 o}pImý...PmݺKWO0e M5֭e؇9a z@o7\AxkB\VnܰG6l˖ZСC]x\xg޼Rļa~)-AC~_ȑ#ǍK~q. C$Ez P7GGy>> CS^h^isfׁk=odd4k,T1*iDŶc5>|` w|=:}/++KLOޭkY >r2<;/K)t23#|^'_ :w 'e)>JVz{A.]^$Cz(fzGVjeէx|3~G퀟`~}iу\mחlF-==t=9U{yU=G5qF%auHtDǿzm =hg+q =Fs4=؍K=d"*+); 9yȑ#= =6oZﱓpsq޼zmIq TT1m>+g<:khg)6*L\Vt>WJKgy2ɴFKfS&uݺ{wo~8&9!kϖS@֤%=>ޣ΍zlm"DDDDDDAu 2]VeG裆;x*Jz@kJ W lz7`߿_17+̅^"*&Q}GEۦMzX;f4;/NHKIKfge 8-J)z(-=hE赠&&f!:zjbp\u@7ӒBbnCzb#Nz=?\уvUDžCeeeƍ322X]쏓˫eRDBeVMV zdDpqltU_=!=S )-ZEУezx2~CnkpCcNq↡pLj#jP%VJJ/@hM)>H%u:SU)1{TPևQɨț;'^F=ou^4;ݝ:kD5z\:b#44t~+d Z3FpͶBl&!1iXjcѧOσ%=<Ccn賤avc z/@h ѣNَx;;+E?#4>nݺՈ/=ytG_}9,2:=.ݻgo>z، BP(Cofq|=z䴑_}՗> VaÆeǼ#زzrؽ*R=T+)1ڜ;Y'z$m{=!f>fxP($ @|qY[Rp|sE=_>zdɓ'#wI% ZCP-` cmf⁊BP(D =3̖Bk꣇Q`` Fzo[+K/@h CEl3S/ic=P( ACcjyj~'`ϯ_5^vBH  '׹=YxP( уJ%=Ջ:#00h .*l 2b6˼Kѣ9ǸXEP(V/=-SŅRBn&dGhhɴid2b/:UeܴH༌_VU)Y3u7m\j_[D B!zFD|h-/i{o޹u msVZѥ@XϪ*,M_̟AqspEP(_X}DUZ!Qss@Z@E0FAX;I:[fBP(D =DG܃~:əȳQsb͢k;G(T'5ќ3!s:-|rz zP( ѣEzQhZ&ovqlTY!z s#]ps@܌ȄȨoEP(k;z, =***>\.>>>xf уyjGZ?xȨDŽABP(D =F|9^#ldddggq24`@ccoLĩVcѣZby֭{͙zfr6g 9XK ~_(]GcN-GChY םC}&ќ{U4a~6uNwnAD;3ru*3SSDJj&砊ZxR =Fx622  C{ӏpفm|j1UZ'33-0(ٞ(ALX^~8)\\\0BFk*HJe,k B,0 /xCd!f>ybѿ͛+qEأ>tH֭8B2/_oժuxIރUPdrدƎݦM169*P7xF}{;9>z;Y(T3AbGJJ CC 5z ^e$ܾqj3^g=gېpg+\nDСQ)ف={ޭ벥/?!oXZxPPxwH&6 d 8w^TukK HPD2bcG/^: ehz<9wAhza *D zT@E|~xZSDX1ʊo>ң.ߢCO^NQ]7׭6@qwY yT>g;ϛW!ȡQa~6.]Z|VEn*P7uv57gCefJЃWY(T3A'1~J5cpk#|}~w}wԩ\.W# ˕+WTg7Cn;@tG=NYX=}۶l~?ICW#lݺuvoG?TE[lIu *P@&< N&*zPi*D z|PN1P|1UtiiӧFο۪ cf^o'晴l`8=t =ޣ_Z.ob1O׭uɈCcGw"135vQ24s{^ Cͪ8QfdcLMM۷o_tPQgeev4>Zj~yfȇ< ;2^ؿ9qǴف9gnsNMPg-[2I-ȡޯy?R4=ب0(y>WQ24s6y#d:,_0PڬL()LX\7zgn޼6sQ_PBaHشn>(add?zHr""">3c+v=u A?W~RUiz8WCcԺ#'Q:oѢEΝW. ɪ mӦ I_8wםT=K˾P aO(6p*P7x sm|'JUB5MCcԨQڵUql۶ܡx՞={,X@;&Jϟ??o< ؑ#Gd2˗S/ׯ_``X,>ydǎ+-;ATbnnn^=tnbBP(D1J=@{eu+UӇ; ѥ… B!Yչs璒Huԉd3;wD"7P)PJoh" :tĈ111BˇzTˤ˗.!b\^#zڨǏӗBPz،KBuUK tkٲ%.|L3rȚLS̫@:u^z)EivvvQ'zzR =2|َg(xUVS&OjV ]׈6BP(D:c*pBD [NȨP(dۖ r#,$^2z)M FBmC Yv-`N<wN;֠@_5;x {衃`6uNwnA:\~*TK1hAѣi PVF2߄”O 顑R%EF>dٲe]vmݺ5DGnnnڸi f1QQQi&88oܸ>z rYf3ч-=z9~xSSS _뷴qTXG333f,z;R,+QbZӒc6pS׈:vsV5=ڶ5!w23k :iDCS˗ٻn#B>x,}B8amDӧOp)xWvrrB@9۟a]bڴiwߩ...pʐi zR[>BoƌAYv,zI%B:, {sm8zoMV&a![jn{ɼ|џrEU<{{sO2W~iZj"#zT*ɠKgq_3ZMQ܂D M8RZ_wghORb }$=t@Knط-o%033SbVm Bjfw Mcz83g΄3==]}>'/ƻR[Mv7w; \in ZYH\kuo3=`=tncGdÞ={tuŁF)H--^pV((+W0`˖-Jotz)ÇXPP۷a-q(pwy端*,,dtvر|>Zտ S@Ap8-[iY;t@$(1)EEʪ+*dBQcZMd3L6L7n͛78=B*Ăr++3Я|;CF=~[Ә'\Uusj3NWAHCqcy@*Z2LpM[D^n$*i`F;]*H2-wCҨRC^abSoݶ_t+;u* Lf?9Ws=ql۶A;&Jϟ??o^y/{ CF=~(+_[tW ܶeS&~aO*2A^pvdCAҀ6-5q$bz[O3^45կ'l oT;-ZFzM?i$n/wУΝ;-uӔߋUWXX؎;ƌqYF߆ hF3BTñ־HMczT=SvCjff^hIϸUuUuJZUV5Ao'QƍG݋5bĈk׮58" _FEy-eqIߠʁ}=UU=t =_`0}=E׾A>]jP@b\$# =hޥK}aj^Tҭ Km$&Fn)4+>tIw23#|^>*v^AL#SeN7ԙp4ЁԩS{E' jB!!PI:L4DŽ X6z&kGɨ 666m|D-Apgs6%JSd+Iĕb>(3_^^ +URz' h0;KPCVn)xHT&MM1;+,NV'žXϪ*u12pX˺ǜ3]9&A aޞ;! ge4,Z8 }eQm׉m8Q:ߗo9TM mPښzR~=z|GY5\HSӈ(^T@>\wԉzBxDSSSHDh߾=I6lÆ ׯ_OJJHV\\LQ :m&bc=˗&&&C ټy3@ ~t}|ϡD-rij-S}^(EqE ؄-2/U< !US qiP,,`1EbһAEW\јcтGNѣ;thߢE.;;\.UۦMpG;}eI*GVD<_|i"Ѓ~H(u17?c(EÇQy_!e޾^j*DX;gΜx4|pD4MdXA}!YF^O&R_9x4yM&ӊšcmb)*h吀VJVAEH@#RNR9ـA:+NȢ{7ccc @>|2@W(,,4P=mll:t ;KիWbҥK}533zL4r8A D@zL8!ڶm[oj5K?-D-5(f 3**Uڋbi'reB"A.;Ic:q7p@2zܹu|Sl |c (DDiho=&1cS#88^b##&J"+1dDG2Y5ID‚ >yڭ%p Q$lŎF+++D5gE9A#zӨ"D =&+Ǫǂ })y']hhhh6%jW]~ɇ4c-#M[&%rbb\!+[("`/Sx O UXb r_pmɔ$.lKAPZ[t 033m̬DAĤ⫫=tzcb'DOGH@٧OrԈ#>bؔńҚG$ O kiJ%2|ڲTZUȖSY廛[[9Uj>_[S檫./Lzƭc:zxiӦڐ!C3D~'c׿]3pXj聆A)s豺W Rw^D7[i{:}GidޣQ?|pCc  уcm}ٳpKчVw0:"J##055Ӈ~GvV D{˽3tXI'' j =\b^ S'1cM=c۶mpoϚ5K{|lAӦMCPM!z4K7k[ O11(Eg0>k֬K͛7[H$3f̀UfffZ*"ҏFNoߏE/=oaZ葙G GzlMzLSDMܹsG=(#og1b$ҏb:CbŒ~?I_G=V,wV'HP#DZG=^F^o豾>+*GPP^xl?6m\C/G=V.ߢNؓ2!zf[\P )Ag˗UXpppȵM6666, &C0@`ll[-*zz&zwzE6 @^I$DM&27nz([b=ujG#9vqy%T%b$(OX\DQQ^JJ* DY+q* 6'Jk4l/PjB"c |A z(M["(rI$AW3%$mgLZ(ܾ#dB")( mA[مrH=WHi4J&U@КׁxzI@# iF#Q9hz3TO(((066ӧpDIIɲe˺vںuk趛zf/ |رcݺujX#hii/.MUjR|}z}񖛕kQ5.=IϸDps E|!/rDO(J>'bU:%G-B/jLo7`Ϡ꫔d|e}5J-%x"#'^NVA­׮gAdFF8pj*܅".eGA|(%R0%`hS1sZ& a4z-=M<ޠύFؖ'\grM=<<|>[zFZ633k$z]pA,}'011iu,zh)&w&Fo@:f:aiEJ*G,$O""HD"jgr@)Ϲ OH^˨i6+OZ|HHĕuzof13 WJX9$3'r@ >U1UL&K +yfLX!URDFZD,+JSx{!(Oj풲L/ھ/D[=νI>| RdBbHT̒ gHF Aaؼ-*+Iܺ=LhDZzZcz`666^7ϴmV(҇*:uꤑJ Xbǎbtt!Ct=X,:A <ǚm"K hucjY<vbfHșYBH'SN~@Bϩ)/NO-`[NZ`Bn/`Z`+xW/Oezk'pYH&\ r}UUS(JJB&W"1; 2mQRoT&teJKBqkLì@tGmZasRyM $$] ' ɄәjTbSP@iz9ϞT>E@Ө-R}Sш4c8G1S=6liz>}ٳ{f[lQzD 'O|wBY\\lkkۦMcLtĔ)Sb>裨(RՔWyg}ֺu]:uJ5@k~Qrw|RFTkq`BE萈)i&ǃOz|~#ivիB0#G@d.Z(11vĉK.2/_,J/]DeTׯ_``X,ر *ݱc`ϟ7okAu PiӦًKp* y 8_=Xtqj*f'= ZZO C~:aOB"839JV ;|$|D,Kbiz-RQ$ǽΡBoOhM>fQ 9T7((V[Ae0eB)\/RkdԪMJ3ƕT%LT#X Q[DZG=Ro #-sn؍nQ7xMVAGyW 1O9;mFb OJ3N9Ʉ3=jbEw6'l*^=@F.ؼ /Ȫا/ hDZ9M=ͫm =f\DEFFF|t>,,lǎcƌiժٳg<V LHop,,,Hfn%TihQЀ{|s%%Dz21k1-L&233k#=A8J8BA!_@ N?q [&޿L-F< .% B#.v ZvYnN ?O DBaEKXZZ!OV@aM* u!*P t,3OJo!UTZXKuD$%rm߷g J7HTT.)DVsnq89 Gmnc;b*Pq-O*( $"=O*A2]ܣ<ls&dHfRrTSϞIY͗T>W|N8,@t-w)֋4[k;vTl{=FMN[`[[[ewܸq ~CSZDDO_MIHf˖-X$JZJ,SNիj߿rr2(H.\@ux>[hhDZz4oTN<%~RB2YYeiZ6Tĕ%Ia'B7" 6 9$ URx O ӷHe&*febT 6'LN^FaŸb{Aߊ.)DPb =j(ZZ:I =f3ccЃƐh4SSSHDh߾=*AF#:u.P= aÆׯ'%%F4>H5B!(-k\nӣǵk`[...Z$2~VYQzc 5A/;(PN"^a]u־ysUKG*=Y'{ ngK(҇Nz8ߡN&$T\Ԛ(XeIx*#Iϸ$zݞdV%ɪj~ Н%O@Rj[Дz`s|žC@RQ!{Tg`sԫ5OYh\q/[Q%(뭴Gmfcu~I}zsf3cmG2`ii :4+sssKOO|޽ U)H9sa}}}N2͛w- ۷/5p#v|{{{dt…򨨨={^x={65ҌFmժՕ+W=BCC{ou..W oZz~oӇ<(sY*`JN爚k߂W]e$]?t_F#Xp/8 jGLdJxZP.WY ѣ6KJ.ZqI =j =ȭ>>>qvv{&??ӢE.]^1114iD KAy !<oܸq9`+'iF1¿tWO?Z~=JZ[[C@LFv:v4%z߿Cq`H 'cy1Up7XP$jH}Rp,LޔZS':"_MDX|P*(TsGmz#Tm^onz8k= ___sssr91bG6ӕ75["Neb󻷮׫*nE"ngK^#u=̷lލa  Mczli* ޞ<ncee5k,www??^4o޼9~x2gȐ!MqxN~TUeU-z\' N~VRS\H9CCa{p|}]~S*[}<P.pngK^p2s·@F=:#z!z!zF_)k+}||M֧Ojr: C6˗!xx8ťgϞC]..,z췃ÛagdH~<1iL856C I;}?_TUw,Nm%Fo;c>"p8 \73Xp/8\ OQmοb؃聆Aǂy"Ϛ5L)򎎎~~~ē lx7{q|h|LxUUVz\<0Bb.0%UzVzRjR\b|TltXDxH裿(Bu:z$xo jk|NׁLp)8 NWzQm[===h1_=7Gc7ovrr1c I>} {  ,X HaX)eee|(Ɉ#D#hK3#7;-3yʿw[= {ap;pǝn {ju|pL%F79fGng{dp=!z!zF_豭٣ d'ڵk/ AN(QmP Xj wXȿ]c:@ LNhz\9P>CRBURΪːb 9e#r~-;0ΟG'U3ݸr(Rpl6O {==(X`=0z'P% Ȑ!C4ԤnmZɎf.4CjjPelll`Av9~x___yqztQuRBW/DG.&z^Hy.=O},ۊ+B7vI 3Rz= z!z!zFEUУdٲe]vmݺ5nnnyʫ@ NMM>>.Ud6 }#""a*c5!MWX0&*\EIYEգ]:w>9a!ps°  5z,T@mn:m۶ "ԩFZ7sqb)BTk ;( i>u@E 34  ue: زeқ 8y;W_b[[6mڌ;LHL2(棏>"uQMyyyߟ$6۷owڵUVW\RKqwY z)U p0&2•!KkV،B0zpۇakX쨀:111~a^J ˏ9 hѢD؋'N,]ʼ|T*tXAҧN"Rz@kΠA݅B!pZB?N.Ie*ť!>SZqb6v lq2DB1ACC@CC%] cǎ1c@Y k9Ʉ$8֭X,f4@ hDi> +8A i=͡J&**yatc@˵aӾ#zzB@CC@CCQKe?\7""ߧ~*aje˖TxiiddؔRPCj+YujER\\AJ‰S,OzqAqlcv  у=LMME"(J۷oOMAF#:uH$E.KG:+i=vAA%-z:RqZ8Fah=vİ  у-YDWC;;;77t `{R38 Xj0ɜ3gN||<셯IynݺAAA}%-[p8A&8::"zA{fUUDZ^xU=n9j=~?E zڨ]hhhh4XD7D|:hѢK.Wfm@$bbb2iҤ~^&<àA`I&7nd0< lĉmڴQ$2ycǎGExqJqE =^qd|^]6C!z!zPqrEخs=a~GT$)e7^|@gVk=}8]D0Q=!z!zPqò p߾MWu2xs=j=ϜW ;=F@CC@CC@@B/g7^4.pڎA0@0=hhhhTb:zؾKM/."~VܜxQQfU`F/Vh=Ξ Q%= =9aGtXD7D4ݸH—Q7vq^F ye T/̊|r}gQ~jXA[-Z;z{!z!z!zԁh:rqG<ֳCA[_`ArYdOGsy44D44D*r\htqTWW5~+UU2T fѣEs^ {==^J&zD@ӥ@R.g7RҼ QaA?20G={!z!z!zV)Ǯh:sq)H}ӻg4Fg=g]?>=fG=&L0c!z!zPqjG'D4H9)sˈiA>58|/v/0!z!zPqǍ رM'.."~-gvv<@Tu,'%䏳|B 0~D44D44DzB@ՋKYQvFsAA~9|!9Ё!z!zF՛WD4]A^CUƫZVY9K;j`G=b؃聆AQk(.D4A h=흭)t^>D0QÇ===^Qc7vۥ*j>p߯1C5z>QDvID}h @:qI {==8jL؃聦+q<͢G~;Mǚ+ itDE޿a؃聆AQ:3WDM$ݻwСCw}kb|h|LxUUVz\<0OS!ܸa-R!GҳXE(zC.zF@CC@CC:EDP4`bbҳgUV۷oڵ|˗/>ǏK zT4^Ub~5~kۢEcG"zԆfe sE=V) {==^- ؃`3330 GҥK ҈ʑ x`E-^@<@SA$:葞*+5?7[+@ VQ? {==8iV&zF 222@ԩSk LLL`T*աn5q*YUXQ( 2i9GᅚB.; ;D1cR3Sr28b. / %i=N><聆聆A6*'"##[n QĬYj+xb(0|pڵK.A~mDqgquUe\Q2h?+- U=Y)hѢ) x08"<$6:YB$֫t90˃_RV!EB@CC@O5zlRD_"z ={$9ͮ˗n흝t{ĉ{q} z!j+,(ztFRY_oDEw8_== ML!\飘w=i=|N~0=hhhhN=j7bժU*C3gЮץK趏NǍK=d"*>J=~?D#qA>=(^x}Vgi) YIp< /B{z 9qc؃聆fXQ= zȍk׎iii*JX,(C{CvիW:7}ՠGYm:t` ޼~EEJA];mlF!zԆo'c驉@RYr2Aج,'mD44D44Dzy =B;~8ZO_ee\\K=^\]]تU;Λ7QfرXҥKE##>}?Q><|/?J۷U&L3112dٳg2k׮jʔ)TX P'Nݺuc$Vߞ7sڱ=U^ʭqJ@8 C=>B$A䓇䘨P`1qO(!m_MhhhhpD}5FUq^=@Hc -[̤?~Ÿ^hz(v8r(5`dɒF93*%ƫBTqC{8Ax`pox}`Jy-I{{,3hhhhczE)d2ꒌ[YYAٳg3g1/[ 2M(e=zPkHS$/{:UVVfll uܹXUߞ7wvuUxIwNBh`G!A@nג' G===hqԶ-nJo!RQfmɓ'T c"%tBw-j^<(occ?FKKK͉6~x5`˻ #cUzL#L*/qI>3566ivnG`"}0_A!ړV㔯?Glug~`>~aÆ@ g/_zN__xAڹqΝ j׼y3bvv6jzdeb*z zC= M&-ϽS'  C 333:uT˖-###dgd6|ggg0iL>2?ڦo899A>}\|yƍd:.JI}{L# 1x__pBh@^cHH9D44D44D*rݶ@ vƍ-Z@l5sU#{8z(=T"r?|w/z9\\D;9ƫN_*@h` M,S===8jNDvU~m߾ܹsgϞݼys>}:vxE*l6¢wᥥ#G:][oA`ܹo̙ٮ];),,$ͭ[E8q\nzL..!eTč]QB^zE "\YZ!"z4 z(&V J8  8www,wygvxUaXܹ3:u>}:}:e^^^_|nܶmk׮Ȩc=z;wn}wgSzrqqQ.Q"xgqBMeptpz@\!zz@@J c > e =xqԁ_QXrő =<,QVoq!@Qpsve@YF'W= Q/z39nBU͋@HvЃNYG[[II ! =>#|X˱OP(E197oz@tiO'?]@.):] =xq@&ٞIINL BcG㩂2.N@z@Ѓ4P^>wnXXXRb,CT(;z,işK/z,z:y= A@.:,f&V;ǥ>yzyyOJ%}APUUz,zx= A@z9&xS;B-=R°@ݻw,XЯ_?|qx*F^=ue=<ݼ Gu&gPdu#,'zкTCb !  ovڅ*D&Wtfz>y~\B\$GčkeGӧ1ZfC6㒻7zC >$))y_܏(_?*##f›(T3S8􈎼Q.8tp##@D/=  ==6m0}ʵEN3gV1b_|*vU24'A4h=d = '̄q=bcnz>YѣGppWhoP?vXݻwբE 3Ν&''s5ܹsG__vqݺu+W$Z9tЀE޽{˵Eytuui۷;999o߾ǥf=K}A|B\dЃCA@zӧO3S!;Wݺuk(g9yyybrrrT,22RPóg4h@-ZL*F0BPݻw+EٳgϞ>ׯ_L>ǥA=l /)))9_zz^z@z5=2Shu5HMMe^j֬YΝ;Ge5j$z1cТC_|6LEY3eMDsc222غYYYq8+jl]8tKK&8rȵ+Eu.Ѕ?=d =.^z@<8)pG |vfjˌ‚}R|gϞͥ=//_oe#""Xq=~>=%%%_reŶhhhHe8.M<ӓBZ( v'7=k۷"B8 =ܜ5l) =>Iӓ^'p<"%hvmƳ[߻nU6|ԟ.KKKv[1c , ]`9RO* 鈰6lϘ12N*ᤛ6T 7Ҕ-'%D_JE,QF  -&{;Cv#?A@zpq=>ǝE}2~,_x]d͹...QXX(XM6Lw^zMH.ϟso߾e孭( |?šJT9 dѹt$Eފ vpbq8=d=.= A@zMlmln w0[\$5Z%ٓsy93wҫG'eo ZlIᄾ>Wl֬Y3yd6))Ç,& ,ӧѣcrDpPUb".x3]/YiݩOYa!A~F2q&bG=  =N-Gv(~ >"z>B||x@nӋ޵[=8貾[%n U޼ޗd[|)E֊*)1_Cv~JX[v$~)pTjgvV=vFޏA§2\^ O8}AA@z@zm7Ã/[|yHM|B\$^ v{?ʋ^.M4f@Gk@z@z=}Fps]n7^sb0*K!K B\fkI۷***:vXrYltدM4YlHA%:uꨠf4leKTqc6mrrm 4n܈m޴^iSWRRzЫ5Cf_z{~ ˔!.*W:R! =>Ui!`X,>p@@A7 , ƆЃ~)`zAFG==n= A@Oqު^Re=ؼ*))m޴!q3A@z ÒWuєzj =8 D[ 6`=kŮz ?vQ{vM= !z3Zw{Y[U:uT_ڢUUZ0Ѓ߮t 4Q#&agS衩QlE4=sCm+PU/ۡCէ:oΏ^.@Zn= A@Oam-@j@V2e9T*d`>~P60߸F=nz@FveDGnJQQΚ+X[h~>/h ͚50Yt,-W-SGse\K0,LСװ!:ڄme =MҷOAW O?$G4ࡇ]%Уi&7t:ˤ~E730頤$ZI!9b%g"%ʸV-ʠG˂zLE*AB{UUUzͰ R =8E{r t޵W{tw.u`b%ܜ(+ZŶ%=kdݯ۷kKg|&G$AW zp02:vL,טjE;QQ@z@ЃCJEGY3 W2;wDbzXNv;wl2ybH_{w7oZO6>%7::XSV,;{ֈFݻv5L5RCqAQ#2eEEdy2jE;@z@z\tE{Q# ?o'%I/]:sdeƏݫ?}"u| YZKSקa!C6[l\]:о}F06uY3ȋnm8~d_wupBg%JJ+-.{Պw Npҹ>qUkW8ӥ$twrh{ ̟7g9ݺv^_OӢg]Μtsq(;90jO&PsOcT =x(@.;XOA jB^% ~]jqxaVgإ3?¯WeyPGࡇzFsǵ8(qfx𭈐7C9U&: +jhcƌڶm jEq@z@z\EGQ?g? ]< `y#&*NtDlMtɬ#LUUmNթSz]]]t== A@OtQNţǕ~0Y,9uyqq+"$u"coߍx73]n2@+*jjEAv+ST+z$&= A@O\A 17")}pq''%Ѕߏ q;j3{MUUHzn<.N z=Jzfxpw:8JINL}iJ]kp/_˜*S @z@ЃC7gQv`b]t݉H$HNJ P6iϞd'~oA2FSǃ{@z@z (=^aCnM-AQݘG;Pܬ42]t2:n̶cT葔xA@z|BWQ^`U$h O7'Ѓ.ؘlUggӵF1-]t stʲ oCZуD= +У\tS Qeq]>lGrRmi~/wХm39ox쐨&qHGr}= %w7zx9W=ΛS&MseVZVjNY}ݕztl_+۽m?;'3 U454[6߳{{=7==AUfzJnVZˌ79]yʠ s{&S@p~JE/GѣG.Y-ẍF<-]D 9Or[bcF vу>7bn;>R9.1zp!!:LՊO=z@ UH;r.@OwJǶ-{N^zۻ+cmun:,hS_W/ܿ,xcRDbi=ʎCzDݾ^zp]\+yqi-#9 A0 W+䕂=\UUUm45/re|<(A4kzX7o۶{_^z=)@z0Ѓ"qAԱøc/hhPM h9I˖.E'G<2x=rm=$Za>^ՁfNWPPXtwyy,]e rx\K;oWb_p9l򸧻c@Ѓ##=`=<=N;M,?WUUn.Lyhӽ!ß=mRЃvJ.M!4A@z|B?oQp-/zފhV?CCqQ d=` =|. ˳2}SNz=JBO6ixȐAwmK,_2g͜_V=c=`C/p$z(wܙUzVD#٣;Rf&GO;˚,nݺ$K&;3}[6kڹp<== @O+DKnpPQW'MHUNN.-v_2mV._G'@z0ЃC~zz,^E{]JB١CKM>X̛W٢cNAAA^^~úO zw0Y,A+r*/Z /'+"_5GZ[w:::[>oS0kI͠GƳ߀a>B*=`UΛsXQX%Z˅Jjߗڦi1蔙VG Lam'ur-Lz@<\VQvnaѰ6.1ڴt"زl#sp,ҍfNca!G}3 e=.JLmÆ )5+`sm*q%5/= Hуf455&~7.yJ~={uLG_zz{=ꖣ5|=~~(M-}w?-AK7n~v&t oK}CйSӦe1f&GUN*өcG ۱}? իm٢pAv̨r狶iF G___oY=OK/Šy97#:/QIZ}}.%Gv→=2= Hу7y3S&WZ}]]̢?!z=jז\8뒣%O;N&nVn]͝O:bqҊ05zG Ϟ\r525l)Ѫ^]GGCԞM~e7+C8peׇO@Co j!EÆ MoJr`B7 :uTi)1e&\Y;\4K^^~_v4}=T[6)ѡ};*8_X5eDbX|%k:uׯ=2TЃ} UkG?OTZh3CO7v'm}x+GK+z8vIƓ&NزiU(Bz:g=\_֬d}3,gelBi;+ǭ>1|p9/Uq_}+))їa Gz=׺^ݚӑ`ޔ_0.1~ܷhw")B6=aܠA}{wLT8< &P衯G9-Z4rX/?qc;[~Jz\ N۷m*kW`%D чe-4%iNJ-S&O\0.7XW.[|":4qNV7zx5Y;@Y3N<0r3sfz(%XFGеɢV".v--?ͻ`ӪUK4Gz\E7ʘ6l^& nvٜ^=规ŨΞ/ta~^ڽ{mZO밵`kɆ'+\t:tuRUUFF 8@9gR~b٬YӢzKdJzFvmEWl׶ 7?'%n^z@P-@&kys3Ett ^fM=+x٠~}G(AGOK<#IƍD*=]hؐoFx-,qz=#__߾} pzxy:xxz0pwttsnޱ!C|`G]ˍ-ݱ}3I$:`ÍrҸp7]ؘ6Ł;x`:::_FlͿ(cN`훡lQNEץŖ]B;liӒZMկW= v *i +W%%%$=@i1OaRVVVWW8 !^:u277zT'zM3oԢǮ[OLfME/^A+Θ[Jmt!8k:{_׼?cH6 " :2-˷0?%X1[bb? E23EDrǡ,:|h_G ufzJIzŇ䀫9ρ$Ѡ~}둟ݢ %M4n`0WLUŦ];{ڄUZWqٯڽ{wEEEzuss.]aÆl߾] {0Fn(rغmE%1x@R_999E-Z4gKg8}t}e#sEӼJJJ~+hٲۧ[y/ @v`-M0킥] u;_eqhlwmXߌ^bK&\= HZc\JsVXJ_\&Ǐ,]?l1-&2}3)%# ص:th`w2|sGH%cĈV߸qȑ#'N"KjBeG E>\l cfD/$ky3b.bغeZ7@n)gY˗.*6׷77}gO؝ds\֝ݘKX&7]MM#2I(7+ H5s`wG +˫W@xTTTF =s >n]qcǰ>6JjD ;wsK*ʢzŮu=4ǛS>[X #Z={====,l---n@*G++?eeEgT>8ETjcѺ[,[3٣;?.m~\ b*.33={ ?aL;Μ1Ѿ][n*:{z1CځzYܧwӻ'[jmepfo00{>՝<'Sз%̏000 W/3$'tpGpу0< *'''= XǓe_7?oWoϋ>^n6\,=6mw\a5$ލ&wt؁uRԓA@,[qI zpwz=ˣ\= j =da@Qz0-Q+=0УTzg7W=4_QpGq=0 A@Wz Gp zT=]zpr z@A+>_=`E>^+=b@^^^SSs̘/2=$ڶ܉M9_azTz }5Bz`BJ{SmfJO0!95tPvؾr(Qq!>{d;pzЅá]P@ z@CLjjj@`:({rztF91X1 >Roh?IH>}kWC¡W@z%F}IiMMMA֩SGIIKW}=O^jܸQz:vn߹c%5k ()Hnذ\ZzL{r(ԝ/>M9e$uuueK|x L3z`E7mS٢=;0*&AWquesh4;AiSc;gvY  =u%l^\aUz`f.''S^drK#֬^٥sgVJfgP'HseeÍ(md4Ҟ.ez~U~%Zhd\aW9|}CD?>)K1iGY0_]]]YY95%YIIIMM | EEEG(KD+>@ z@УQn]ZT/R QIO0vڸqckv>Cfgץt,L3/ zp։]^J#z=0 A@ʣ>- Z/R QI[Y㾷--Ζkjْa6?st6t54zGk1`A2\viAm[7Κ9 z@Уho[ysŰCY=*Y煼W[7o`9\S^$a A %mkhȡ}%߄`s࣑m tX'dΞd'Xp҇ Dۥӕ>p A %ײO5Wp!:͈'OzZ1MR/1%mkԆeKzo޸@_| я6zȕ+xy:S\b7 K> z|:::TsMF)'W@z k=TT/y8 =ܜD:S⢣M}]]}KCPr {zػgs5D?n=wWGJXrnzBvw?L(5m.#@̉= z4keúCbcryyyweQv&ܹ @j\fdn+Y3>;3z@1'Yo߶uVѦTwP~*DR+j/OU+hk奢ɺBm (,AeLӫN: :v09~_1Ji/zpOf7jd ''7wάߧ%Raټrm<]zTàA_/vֶMkJӦMW€+=0УaeqFCCcúf|i&rrrR[hۥsgzh+b6 K+zf%x^M$wCSKX&.UbmOVCeoB_׮HY~=0 A@  ub? zQhڢEs.u% J]ű"Z _DItΝC)ame夳v+j Q\W]}m}zsEo'w^|7=l*zNs>zgTTTdD YZd=ݻ7bUUF=zTL˻wngg'ȴJ__o&//o̘1ZZZSL{@ݺu'OE#GՁI)z='~&‚Fømϟ5>̖X:::M4B_OV|x iCEǛb'O2i'fg=T#--߿#BǏWz=W|~ץKJVqnݺbŊ7o޼~zݺu7or֭ z= EY{FEE+v255rLLLlRj)&dsx2l0AI `wީ4 ĜB@\EQQkWC TC8{˰xB~y_w.de>kٲS&ZDWW7&"//`<nF7}ۖ&?/@;E r3?-2z= G۶mqKQN.Kю;Çv344{.W֭[={j[ʊRCC믿fCZ|ӧ)ѠAׯ_̷o[^p AXɓ'$z=Z{ ?/߮][=A0f(Kbwߏ8аˉG?{-("#CzfΘN-|" ===99޽{ywӽzE:ul=㝅 ~ !5Qf WU:u(/v+s9{0w\P_*@6Ȋev-22o搄С5ttt͛ݻSNQBD+PRReRBAAAP8}Y9@vG-5U z@PmA555 JÆ _**_/GAA?s ,ܹō"אJ G___ڬ1PYYYPrܸq\XXHY>̑C%z=`A@ʠGǎ߿Ͻუ#K+((W*/// K!|䉆Fvv6^\$"4iR˖-5?UIIItPX n*}#:չ4믿DH2bO!z=i.]Q ƺ ׯ/KsrrĠw&L&}ׯ_啘ȯŋx;M"֘~cYYY ZZZ,Mkjj= 1PmDYNNNMMo>2&fgOq9ORz=@=?~ݻ͛;99EffsPZ.URRrwwUģǑ#G(o>Azttt~~E5^ÇfffN֭[LL %vܹaÆ7o޼t킒?s˗/߿޲|ZG@H)T{у>^3gL_zȔLD}Y\άY3(kzFǻ7|xчtԠ= LQ7QCӦM}|2rȜ#ѡzģGZZ ٹ]v?z(ccu?nl28Œ=://OPBʹsj|%-˧W\ ĜB=n@EmۆiݪP> CUS?nܸW_Uf[vpsu{kianhEYYYAAEҧOvmۖZlߞ]ug8Y3)Ѱa=w=$Ǘ`[; /O88n]\r "A 1A=>{ЃOݎ]G;h_rL8 k׮wܩXV@H c:t0[Ԧuz`௲mf'GR͘> 86(A(9eK(tiX֑#43z4WZ5>}juGčPzde>} !5"5q}== !M?jԨO+^|I+z0խ>h@7W'nG'ME梱eY\-zHwFG޽;wnZ+>MigGOWJW7z a{;B_>YܷSBLAF= $A(-twaYe)|e:.c: 1|\.555(\} =¯D L~jʣy/^}yGM3HmB~ȑ#UWRRlբǵW=nߊΞ* 1)R>_fg_fI[wN&JHs@z@@\FZm Z!٣=nGDKMIrdzO2S3?%|F"5>g~H @gd<{ YF N(@Ѓ?1Qc}<~ q>&IOK&>eZUmý~diJx^,!q#4VDb$&<|p/}b'I!dS]&.JHK~ǍaD1Qbc"bIw^63!]K&t%$ʱ179= = >^ r38L BʙD:gB_/!RB|#= AzҥK [n{nAU<(455GѣZe8Q@\%!d#R;wNģ:2)S8p ??#77w͚56l>B;vt=@X<}1z-]%(ﲷɽ(!z@ЃTNBmfff =޽{%eW@r!R[7wW|.ٙK 5N:mݺd%tuuYfNN2RNVRSS)ODDDP:99ŠGAAΝ;:޺ugϞTWѣ;v-聹@*D a޼?޲y,qVac{%$@z[hѸq˗{xx׿}eΙ3ٳQܹs)g8r䈚ڞ={(mbbtR񑹜 [ԡCWW[ZZp CkzTG$2.JNʒ˻K'vͦA@& ;|pB [[[.~ nذWEy }ZG+F9tj=@z= !uVӦMEIK+((P-yyyJ~xݻwyyyZZZ&bЃ+++tvvΝ;'MԲeK>zHZYWRp=$g>}cx]o׈DA@۷obѣAף~,s6lqF!=P XwׯJLL-!?98Q@=ચ3gݻ :rrr,Y"=f͚4ܻwozGiMMMHDt= A@i9!5bŊf͚;vի%z}AрDEEǧXE[[j1xpwwͬI(SC=@z= GUSTTHDUU͍ء  MXZ^^ W999!>SУZA@=@HFã^zΝ;?$i;wlӦ KpmJ&z#z=z@@ʣ۴i&N̞=[AAaŊ$6m133ۼy3[ddd4dɽiC^^ť&zz@@jz@T~}.थ5fBn)ى cZnMLѠA>8;;*))Օeu֥ѣnMGȌr!X@z@z=ף!^NNN-ZL=J@=У:wƌӧO,)@z@==TTT lqA@4z@@@QMd!+W=@z= У0z=$A׬ rʩ¦޻woĈ5:zUi)!!aСjjjSLˣle{n˖-͚5SRRݻ;w@z= QUahh͛ ߿ѣݻ?~ռڵkgoo_Qk֬uJJ5H$rPJ!'9jHGA...Jn޼Y W0۶m0aL6kL7//OV7nAzHKKӧϽ{/Mո6ݻw?myy2677W#_tvR,cccIAcYYY/' Zhq-y.AzMa6lϯGjKK)kVg'u_ZQ(++l߾=ڤJw\pKKJJ$:dЩS'5ڶmKz@z==d(/--5kåGJJ|}}o߾vE'NT?!cxOe}0Y4doffd׮] #ύ7ɡCn۶+VL: =H{z^^^ꌲoݺ.=]_'tY8yI>8q[nfff[ҡC{`bb4{gǎO>2imm{)=o߿SU899رu4C,x긖dmvʔ)Zb}?IxٳgΫLʩW_mѢȏ $Az4i`pvv ?9x`c3}Qt&?lڴIo߾gϞ $=HHh׭ګweʷ~SO=K/Ztq˖-3_LUw M֮];ss%K}<[g֙lժUPP2 o4IzиaiiҰ{=9tϜ9S6VVVaaa5^4dȐYfϟ?;5jTpptz$>Ls[(̬A@zW(/\YXX?=|||do߾֭[?Dz4o\ʥƋ}Y٭ dݥmm; -3 ={LjDddsZI҃ =M7{^f?=r5ڼymhh ,_͚5]"=)!?RʯQX6o$Az@z@+eرcuVxZ|_T]}CsHhJR/2)?w $=HHh!C*d~[vHHȨQԕٞ={?d!W>}K=͂ s-\Phg=d\kLnǟN:-]4""B UǎerҤIƍiӦM8AT4FIaΝoQŀn((nٲ,~%}߾}U2CQkU.]U*꼟\wuIxT֭֯[er׮]2)?q}Q>TI҃]]hw=?>H0MH`Ƀ@zAzAz@z@z4bz =H҃҃ =HӣgϞ>>>:ylmLz<1ںUVcƌ_F$=H҃ ===gwޅk<ݶ5ƤǓŋgΜYRRR\\WWWWwU'e!Wa4Miimս[aM 핼U}60$@z+=RSSmllŋW2)12z^\Imֱk)GSήLk׮>m҃ =+2rHCs NJJnWsX;w~S}[D&j-a 0 ==]JgM@zc2^|μEaa)SO>)//1cF{ؽ{ݻwWTT(7W&ޭI&yJJJ$Wݗ,YR 6IzAzzLf͚uvڵڍf͚-[ܼY'ufff&!L͛7{7&=|xAAS 6IzAzcP4Ӏ҃ =HH =H = = =H =҃҃ =HHH =H = = = = =RzCzAz@zAzAzAz@zAz4 = =HGϞ=}||t-?.y!=%%%#Fnժ՘1ckԦ2$@zQ,O[?{w=SC~-3!c|L H#uy-.̑ᒛyR"d'_^vfC[6/皍C޸+G-g(GGWn߾-'>9̹~I%ĝ:}*#?=Hzw^_^x +pOYR\yWw\rVO UnE83=e g+++gs5#U~/۶m#뿧sYXXٮlry,--kFj<ŝ|qm{n9'KKKk{Xc)菒[nɉONYo[$'\H<w6:6Q+cH =y ,wF\TS፜* /&/?oQfޛ\mn/cim[nb qcW|\1Ⅴ=Po>׭Q.oW¹S\?ñ5~s뒅gcV\!cer¹9ձz&*XҥKwuD}y Ar_sgN>u*鎨?vCUVze[%L쉳Tac¾_Ξ;}ʭhd>jW,,,ty!ogk:ֻWOKK?}68P6K=7#rԉDc A 9/6xc?1ctǡ#CUH ==y∼ʋpuzS1C.93g 3'N'q#8Ozw/(Ǐ}*=Ż?F:  󑣎1A4'N';r@)q "_"= y뭪_}>C7#䨣j{XcU(gG:!F$=算mC5acx9G!B4G@ߨ?_!j‚;H =-~7Rt ,G}mM'ȑpFD4 =0Tzh>PMDhdDrr 'G"""AzAz ""@z"""@z"""@z"""遈Hz@z"""@z"""遈Hz@z"""遈"""遈Hz"""遈HzAz """""遈Hz"""遈bhh҃@DD#M˗}Μ;;Afڴ҃@DD5Kfz};p i+CwϷPHćHY;Y>B遈FQN >R~&tܷ[9)AzAz "cʷPrVR0T5遈L׏GTGxᴷ߳WgATG`GS&No{(!GMzAz "Qc֛UpZZZLZ[? ctGjлZ$= =ј쓷$="B L e,gS>~71mA5遈L6~3~vtIYF 4xoGG+ zgDI9jHDFGwǍq[+3JY)"4H/fS@zhק.2~;oX_|}KM_\vK!A?"= =Ѹ|h" }C^SUkNgO>>!3rԤ""3=Vex&= =јr/$@}>2֡5遈FMyg:VǼ?@zhr}5遈L Džۿwo&9jHfVLMHvk݆7-2RCzAz "q ~{=6qT^""So75mH|DP@zh85Yȑ~遈h4I =HDDDH =HDDDHң Ԉv@z@z@zAz@z@z@z@z@zAz@z@z@z@z@zAz@zM/=W endstream endobj 1278 0 obj << /Type /XObject /Subtype /Image /Width 1065 /Height 606 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 1577 /Filter /FlateDecode >> stream x?JAOD V%VDk tV X(XΓDEcf7[C' >N?&Oߵ77GJd,FjnE֫ |P7VӰj{bӗV20x?IY5@bj~h@&FaUUcck̳8 U})jK"0cn$QY׋&@֮3'Avu: s'VTbQ0/cG4PчyK"DhKXB endstream endobj 1283 0 obj << /Length 2706 /Filter /FlateDecode >> stream xڍYYs~VE¸G)%;X-bvX ep{zz=}woUiv,Zeaq+Wz[soַqxYGP5{V6ʼm~AO䎟l3qmGY[}P4ruƇey&X x==;G"VoAkwX0fyq1.lI8*m_u%W$F&3BXIg"D#R@Izs O Lz_S؈gA3o&LPe Kmϴ\':Nײ.-JNˆMI@C'0bo|@v'Xwl;&. `M8R>D{@gȊ is_:UYӥ@i4||}4ԥIQ8Mj4r 8?{9FNup8&,Lj{ V'NVO㸒'G hح,rw S*_tZZ1w*űH5@c0W)v ZIM:Y'X4sU h@ZbPGK>V5ⷭ\TRb@|ማ4r|ه8t3uTATnpr!x*8Obk?ۏ_(K{DN'i>LI6%%h쉛 \THQ; !C4CUv7U]Ϻ_ЃR6Whgvt*#U`r7r~ŮRX8_o+#V&;J֌iٛhq?ꙉiwabb(/ؠA7] J$'U=acg f=mpdrvMr?7s)o^IȸI#^".@#b]B ĚZג|hYhwB3P).XLGR삐ЬǴfxyxF:c+>ӣaxbԔ'ϫ+dl-MٱΖV`] K8inieeRdɩQK&_̴&X:nl8~b^z&7&/O0S6J81;1HT^W½٣﹯-n^xd M7NQHkm;ȓH>1n KL4XMS=yt1e=,, ~E=U ^i &I`@ ~tӅE%~ 5!'8Qf iOWQydQxl,&%H6 )_u& %`V(ǤJ3%A;AGӐƧP Rek> }Er@^ bAK: A"y}#5DOO.O{ DX[N *0 / pꏫ V!k+R?x"_=2q ppkY6S2> stream xڍْܶ]_1pvi+Udˑ+iJs["*w4PO{S3'a3;1$f~N=w#*Ch)S48ًM+~5#0r8en>!dk7 4r7et|6m=޸.P3N}6U ]H0-R'waY/$EG%GdHTĶG끿Dlˣ%ˣZs8QaAzG4Z+/DBl^30ìABygjM.dE阇*\hϮ^IP[f8Ox3&[#7ixIqi35J66|F8VbQ`H/JC!I ENS da U8dbc 0u#Gtx bqAO)i/jYƍtɌ !l"3?tD[%sC*TyȆ,lkE0kAcmv.D /h:H+BHLR >$0^$ø:/yq!UEZj3jH -I.ۗ[Α< B MEx $OtYw tR~ /@5G8,vZ"ݮϱIN?dY3'9_ݟHS2h{C!8):&! i$B[G'3&qJ˫Dxuɹ6x܅MtRi )s~J% ~0ћ`i9y B9Sx|Y$9Ր% H?L#/N[WmcDRM/9E1>N'yw< 9< Ͱ] ZB2NCe `:V@UGE"I:gdǮę1obf#ʕh3=~o$3]0p1Tlss[haI-ۢ`8Ivj.A-*U/8FpIlQDXxc:E0?Yp cgq2ppCt?ix;O$Ibzk#d"P#idlZ^r6[-i%ՒX4nZ,`7F!hQ8b'x]:m)@C x%pϐsmL3ɷb6 !!ǔƶLWBj8?2YME|R"?[=+dU4.Jgِ&4ʼIS5.I)#|G".W"Ӽ/5 7;!?fZ7 y:w3H'&pV"ԖC=<*VU(8ܮoMc$9W+R "ë/PepPa k9ݖhW`lIU8rDRY 9 r>[H$ ~nf>x[E,lD2b2d$V*SD^`bj9w >"y*ɔӵ˾o=l* բu􂘎]N:*ފIκg W7#F1f,[,zkS/;6Θ%&=Sh@iY;hs}j l#G󈔮KY*+*y)g@j|e]! ^7Rd:^ NK|02~  [zs92&GX,p?b| G!`!RG ݖ+]s)K 1b8)Zl ,q㬱+8 iu33Fϥ7.f>opm;4MGNri9Ͽ` ];°88-IHK "`[*c&lG˧(^:@{u"|P!-xK]䄞xٳ,>q ;͉,Vrk 05=I]s^+.`uCGV+bUTĜ5v f=[3 )G>gn+>H֌xԛ_ jo2aTfW/nI(U+-/sկ WX6g'ekY\Z6✊$ xo߿ s"Fu(hϐfRlgx!Ք^JtRaR ôS_aD'& Ն+rlW{*+ q4E,O  cŨ4#mlqmy z@*.+6aov/Io&> stream xڥMO09vvGMx@, jR`?:37! !EdYh@i֖v#3Dtu"m> stream xXI⷇`@t `Θ֜Y1+@QsVń QE5**~mA+o?7a驮na浻FH& !B!BɝQMVMP=k9SoU0}U) GM1_,O.E&-8k]ˬ#kZ6\yiʽIq_yܾ#=DĂx^B!$]=bo޹'rˤ w>i]93rFM7q\g{JMM{=޿/^: w6eɒk|͜\B!TkKҬ,M<:FK6Wv^}F{r%B!$2z* ^cȄT-UrQū'pZD,P46_Y=}ݖlSjMEP3(Vg[uԽWB{أsc!^Nƍo?š^ڎ[ԬWʽfLRXKQ(V)$BIW펖Ժ䈞|ݱn>zl$myE il8WY/2}͘(6)7*x`/ʔ?Q^\H]:{_H9pET9s6sCphY߳ec+^Ôࠈh|.N/_ϯ%AuV?~oiNGX[i=GL~EָE"' fl?NBq|0Y6#}g7>Ӹmn6p9ttϿ\D,PRI!o <~nwF?T,}mᓕEV랃G ,N~QE۞7o/ZKwX!\@! ~{RCI(K]kkվHQGLP%<8,),IgPڈ~Cg?GW6vrv)*rI Q=OSsrJ2hPB6'?XIkw$>O?]wy ۹*MB!ֽH(}C&xu5A,9N-  /cnwͻ)VE:*oۣ~|PDtAn;v vƢ"0`j݊eygsd C՛w94qGPxpj8ґ3]q%B!$i}7n&%wttRUZ5(jii(?(^B;),{ʩ주2F+P |zb;,mlbLLC8 ޚ}2u&^a?xX/EXRB!DHz0eR(_nXN~a޽8a8Oew~,Q˯VYBId-(<)*)=v5Kδ=m"nIlӹm'Ϟm?`Ȓ@ط]'~GO_|lw_Vnu.B!dJ:jl,ҨI.DJ,~YCvttytߗKQ(V,i1@Da}B௟X#XXS 󃦦Ų(16.Uju1sTzi<x) ?V&B?Su 9KWnWZS"kw,:q6Qqrkȸ(8ku[.\9qr^;ɳ WnH?cI!~7Qq=Fa4 /^9 ZQ1~v˯bye#F2 BHa'G齓XгͻݾG^|?g/:#":\h|4lrBFJ8a(PQK|ջi;i܉ ?X/EʄB!zFYdu2]ѧ/9$>|{_SYGd>mܴQ-\J Cz9QEd%=nބ8 !/" -V^zUjU"͍QtrVd)\\ŋ[OP~xp_Dx?BEdE033?%",ذ94۷oS.6]iЀ+4lؠ`͗F+[FQX{AQs1Rqc]D'aVVVUgfff+W,S.LIfEӦuڵki y-[d=7oժXAbyw೧ob+Ydo\gbb4YWwn߬>͛757/X% 2.6o1u$SSӓc Y{}XrJwښo?pc*UDn]$'Ivh9xbՅ3}SW/'JboĄb-^|%KˢkuMtBͅɭccc5mX۷g'AҥKog>nKT_)Z聨piWhk#уA@tP/^0Y" ?'DVƓo-TFȺyr&MLLJ(aU_7y$wa}[˶gW46mZ,kVD?[mm]X1ҥJ*TcÔ$yؖh^f &/w^TZeڵkܿCdenn^ZJ*5BYd=HN;лWd_DQXFu>" r' MX[[gûw2YǓ'OT" ?2XdI{Fc gO=H㇒St!A3'N8"͂g|y#7]ҳˉNRH"AʅSϞ%dw+(py:,SCBBÛ'@d)#SJО]}RAˀ `lla.[Ljf%KDd "M.v:Ɵ=O%JhYŊ3ׯ_K d@K.Xŋ,SN=y$K7˔=eYǎӶӧ>~۳gɓ]v=2>W^xq e˖˖-˔q~葓SB48;wIRR5o޼Uj=ZGo޼Du)ZvʘhBwNyԸ4 z&''O>]7ggg)))+W622R%SSH=|rҥ5kTo[R%~i" Bd@Nٳ4g ̢xbӦM&&&ipB-ܽ/°ߺuR9<== >Ɣ"E9~&MH?7[xxxҥ 3u(Y/hܢ>{+:Os<߿_Dy1@J\|_Bd!9>A UT)뚶m޸qC~2B/^HaSH)WUѣG*SDVrJ߾}u&M}߾}OȚ:ugٲeu%m#y"̙3݆/^Կmll,:Bdd?wû>x{{WP!yF^cShQ=!""B]ӝ={699;uꤧ͛7˗/2Xdd7oi;RIMuO 鎬Gsr'LKfJspVZZdIg_Y3gL5SlYy+NNNjkddį"kҼD" @/{5}6bGiÇ4h@cgϞi|D|m{VY}4KdzZJ'u0| .}eʔSd]Vęjݺ]-Z4tPm O:%6Ѯ];eCժU;v,]tժU:=6m: 7,EЍ8 f̘aV4i:m4Ϧ̚5ɓRۛ7oiZ8IkӦKVZX/^Q_A?Di*UV\9aLm6yyAAA,Xs%BD[TA9ms.\XXi>i&D`ذavPBO>PcJұQѭV< Y,ArY[6x[W\t;wvǎL:Uݻddҥ*33rY:4Tidddll\R%=gi2Ldyyyih*Ul[P!mybK.:&@d!Y9Bdddz'10lׯ_k{Mf/6 akwٽn߾VSdYYYi͛=Ç& z]t[S뫣F[Y,D@ӻwt,Y(7nԼxrM671qDʵkciԨQ,3>9+)RfjYY-wl 9DBCC5~s6,,,?"k͚5{P.† *Ws7ѢE S]_^cwO/f\dnZy6E֗_~iz " YyQd) >ytrJTfzEYWJϧw׮]aQgPdܹY^Bd"+,N}\l,țIØ}Ud4;qtt#+Da-1\Ym[*" ,ϟ_y&3Edmݺ54hPVGɛx%"+ׯ-dZpX"V9-y}#ylmm*SDV\\N:e˖UY{!۷Oy7N<ʟ"Ka,Y"yիW߯oVVV O8{[*" >/eM4Iw?"u?z*sdذa,D@LYCߵ ~o\|Vĺǎq߁pNݺyCTd} Bnu.Tm۷n:url?s"]"+,,ᅲK.]$-;889("qB; "___ğȣѢ<,dO*UؠA=++W:oWgM4QzM%˹s%7^z㓘uY[*" >!ڴi[d",Y_~ܺu+s~,D@LY}{?s@Сł*@Sŵov!ȪQbyB gOXOt/ H"K,׭[gRە+K(wXb[bA*?ElzEV˖- ._K%"۷?3If]l,0`7eeȒBllcǎe8!Y2QdL+LL/L8ut֭DMYdBiȽAFFFOWLڱEYQbR.c\"‚ #~޼yvvv'NJEVu_*bKEd@1,Y2gEN:;;g`֬YS}+O>͢sBd@~v h:vhgk[Su5kT3z)uS,̟#-B)gaa!w/TYHlE9۶nu֭m޼yem.Y`Ⱥvx BdeŖ\1|%jkwdPRɓ'o%000K" -dYǿ8\X=cc#AQ#YÇuk}%%ˏ+SL255 Æ KEdeŖ\C&>q(ݻwkku"2܅o:" -d0޵LgO8.݂%J-hԩccGV~=yƟcq'J+nܰ\)Q'<4Hd떍*_hJIIoܹʺ-kkkxddd &߿U7oިPL:jRs<<<׮]x,=2x۷o"Bd@v Y$N8RX^S` \br tLSd>ժe Ϝ1H1jb uϜغecѢEK*UJe m%pqqݻ7"+.TDY'={,ȊSݻu7T{Nåϟk<www6k׮eQAd! OYsРspKR.9uHh/KE K`+ssE"bKEd@_0lٲ 3&"BJ… 5n(T9:m*ÇlDm֬YVD" [\=}˧L(ތM2)'^^^b-"+.TDΜ9yw#wﮣU,KKK}7iC;߿_\.366N&ʔ)#}Fɓ'zDֆ Y\(B4бCv}],jY[*" r )))ʟmll ԩS?㻺hqq,5T\r:kЋ/VZ鿉cJׯ.@ZdJ[[[Dan!LO*"+w\l,M|$_|al?q5}t=ٝ;wY>LUREn5tP M6նիw&b|U+Q&<"KKT;vn@"t ,ȶ- OaaaD۝HQQQfPdϯ^X1Y&33'Oh MZ%ѰaCծ^ܹsmb׮]5cZh޹W)e}H{>|(M2fُEd@>w ,ȶ- -iРz'&&&i6& vVP4_m.]W>z())FѹsgEZ5bl٢~ DkKfҥEy^ K*V=X'00P=Ǫjz͌,qY,D@6ЬY3?W^Ӄ51lܸ`%ܹ Pir40.]ҽ7oĕ+W46TV+22Ri Srw$z}9+Vh߾ʃZ.[СCsww7XF<6 o@deR?@ Ad@b:,D֭_͛7kԨ>NIȒn[15R~z=yҤIQLC$...H!ʘǏÇ\Ez鉳C2e .)dF{mIU9r$I"" rQQQh[[۩S۷/44tϞ=Æ 1Trr[StQ-[4RbŊt6&Z:011%{{{}9sСC...Zʀ Iy4Yvm.xʔ)[yi5)[ŋuʕ+ul[GYfh{a~@nYaD_|Or)bD666ڴi[С@pt[quuKoi9ydfѢE{6 .,Z'݈kTb `ii[[[{qB0,YOj PBll,X E" D>Lѱ@1c%Ī7}Ig}||qAO<1xɕ*UҽҥK?{̀cccU&R*o_y23gȑ#UMj{TЧO\\$]z '"+ 7 }^pW^>|x*oXDݻ{{{ϙ3MY׮];vXfͺuV\K?ߧ'))) C]fM_d0up-[lРA׮]7l:ԯ_5k65#-DGGGDDxzztpph׮Cnɓ@d rqE!YB>YRY,ȂRY,ȂRY,ȂRY,ȂRY,E߲xɥ"Y'SDփ;k:4߼n^Yꩋ] dJs4y&/_.:88DDDȕϐǏ=\*" ~2.nݸܰAʕ+yM2M.UÙ6l|I.YT\VZ7nX㓘(5kVF˗_]v666ϗ\*" ~2.t\[WŮfbׯ]T|{I7+)`}aw&Wr)1 0tUDVSa!{;0%I*ѽ%K={6U\۟YZjԨ?H/?|Я_zꉅ|{ɥ"Y'"+u33+)~VG#:DjժnnnkLMM_zo/TD@'߈,)s~zA 0K[|k2(7YBjRJ%WpwߴI 'lѼ{w%Aru.>N/JLYdm_x \r`%x? c[dEEE ҥK^^^KEdw eFS \9!~l.9^D[ ,u+fYTB yLr{$=} q]լYC :VbiYvZ)oY".cFWVRGPYC~骣[d ʗ/_xq"E,\KEd7 wv#BdUȸȒ?s#,XzΗN?r%=_xQ-~)#"K>|Ӕi% o^?IGCr2,P "r0A{vKt,~Me% o^?=@>a[gk){B^Y] " rKEdaBa! " ԭB^YK.TD@^xi,  @* /TD@^x ,,d|Pi~֭iӦ5hРTR&&&&ѣs6mTT033?Ų(yqw&âV9s5jg(PƦw>|HsC/_vuuVUڵ'Nxڵ4wC'v &&fܸq+Yi…Ŷz|{4o߾}ҥ+VzNNN{6ao3r,#Y@d wM6XOxjϜ9L,Q>gQ'#;"kʕ Ը:umb'܌)S YuI{3gδkNG˟;w."+eD" Y,Oo>|0p4~9;;gdg2Qd͞=[O&tU>aPP6Mc@y UwYP9ˈGxbDT>eʔL/HרQ0',zR D +iٳ VQTʕ+:xTf͚L&N[TG{Ğs.]2@dsL%$$v[hQ׮]+VXhQ߫heeeص2"+ω,=G @d!jVVViڡԿv;"˰N{Y[|Mz6lFscذ䪳ʋ"+MNׯ]VϵϞ;Bd YDVƫHuO;LMM3XMdG;}4]"K >èqs-[ȥ2"+][ܓ?|wrr]KY,\rDV&ޫE|f;W9#kӦMr]t qW_}/^Ç \uYGd)R) ܆Bd r$@nYzΞ$c\.9^˗ Fuԑϝ;Coǚ3g:o߾͠UgȒ}x Bg"KjNNNRgh"sYbϥrooo͗,Yb5ruuʧNC׿3(rYFd!Y,D: YU۾}TF3w~m2ej;ẉ"+00P*/[mX[[`:$.\ѣGr? ߿WDKgBd!,êŊWou]:駟~ʣ"/۷#ٳa3vsy>V*Zv?E.UXQZuƍ|0p4A}ޤ<'đ0@afɀ d||6Oc{gC,#Y,Dӧk0fffguƍ322R?LQݻ̬~+<.\'R ~AvwY 咳Bd!Y'HIIYr;k׮C1,|Te!7,Ξ=q%K455?4i2gΜǏgVrVdI\ti̘1UT177Uք Da=w"##GQfbŊ)RzzwOoۻYfVVVfffeʔ#?w\!BO;}.]X[[˳kg?EAdA^ݻXlً/+> YPd ]uƈ| \dD^z4YjuBd!Y.\XǧTccck@D" ȂlcƌRKKːyFeDUJ DFF2Sg1&,D" ɴ`קsIJ٘F AdD|߿_2Qo޼IrƍE͛K/KL',Nz_r,.ŕ6l0}*O2ET.TraѢE%ջwo gAdA_r,.BCCŕO1ch@ܔ@dA_r,.^|)MOemO>{L*_`C /TDd#ڽ{jJj֫WO}Ū*U09" KEdA6rJP}*kݻ7uT/(l׮~x "K\'{ɥ" {Qm 0@} S mUXX/\tIZvppSRYiƎӧO '@ZDntԱkΝ+4nxҲObb"ט%ȂlŋiZ`ȑ &@N62K,9{ljZ"e˖ 믥e۟kLKEdAqEkkkur…4_ڵk #@N8,o߾MMKd͛7nĉRj޼Ν;/TD4/^8t۷_|hYcy &#!k׮(Pӧ,.TDDw^ƌ+Wԯ_W$ĂaRY]r,H?,icǎ!!!# ܹs%ȂʪiӦnJ/V\9m4wwؠ F Ȓ?noooiioi,...{Fdsɥ" Xh4{N|||"E4~(br ,޽U"=E֫W͋-JKEdA6,FGG+ݝa mxyyʈ4/TDd#:D֌3ѦMF 7XDVN2KEdA6Md*###{2cbbLMM;wf0rD>pd%ȂlDۿ *jԨfϞ-9w s9rɥ" ([jcNJj7f<rDd%ȂlDjѢEzL~^*Ͽ7n0P@dA_r,F4 +¡C !**H_/^vMcmmUPPTSjժO~8 @Z666V$..NVbɓ'[U@dA6_r,FLLLŋOHH KdR3so._cT^Nq@T76\re299Y,WV`{޻wOnri[l)oذO* /TDd/wiժ_A WW4 Y?^lYbCc|SZe(sN7|Jk@I;y&" YBd" > 6lxYf,Ef͚\rnݺ(#D" J*YȺu" YBd" ҍCׯ_# Y ?UիWOȪ_~ʕH,D" ?J]dN[deɔ,D" BdA> ?,[4,SSSBd!Y,}E֞E?" YBd" ^Un]*Z9" Bd!YFD" Bdd1۷oWh,By ˔)Bd!Y,D҉.\$ZYYI+\D YȂFʕ(1c'D"K`dd<,D" J[d+JCyӇBd Y,,FEd n*2@dիWBd!YFɿ5k'qBWmV(?9dȐ J%[Υ@d!YY &&&r%"%!H,D"YgϞk{ gpZj=~8>D" Bdd=6lܹsF:ɇ"~+/*VMdit_Bd!>1WO"" Bd!Yo"Ku!H,,ssseʔA%!Y,D" @dqYYeʔDҥ5J cc5k*TZ** Bd!Y,D"PիWvvv}666611իW```fH(͑,D" Bd!Y,D*UXbiV]B; P@d" Bd!Y,D" KWScccEZX[[gpO" Bd!Y,D" '111JKLLVA%akkBd!Y,D" @d!Y,RUrekÕU#:r 77jժv܉Bd!Y,D" @d!Y,ȪoL2x>}jii).D" Bd!Y,D" BdAaaa!.zis\;w)Y,D" Bd!Y,D" YDtt6nܨMUZU~\\\D"Y,D" Bd!Y,DYobbbg͚O'#GY,D" Bd!Y,D",b…ZhZx>(P@T~" Bd!Y,D" Bd18uHKTP_~e͚5li&Bd!Y,D'@d!Y,\_jԨ%-?~XG#FHBD" Bd!Y,D" Ȃl lݺ˗Rׯ_'&&FFF6mTY,D" Bd!Y,D" ѣGҫWl,DBd!Y,D@x|YzҼy n,DBd!Y,Dꩰٓ-" OPJW 0ME X(H^Y,D"wQ{?SRIH)gTAPA:HGTޔ" HSTP*l4mݻdN&$I|~?̜$adYDD@dySNիWϭ_Luu_w+#E^]XXX߄{|j6Uϻ, , "t.]O嗣Gzb6m "C~w㬓222, , ,"h!]md, v ,, HS@dUX[M ,ʁl! d%''H , "", R 233"@6˺y4 , "",  1yetY]z@dyEL, " VeF7@dyEs, , ," Ȣ ~q, ȪB """* - ^d$:+j@dY@EDdY@E@V"/2dY@dY@dYD@T٥T"_, ^p, """,*fc>5O( , ȋ8(dYDD@YD@T0BTUԸ0dEGGUF <"2ZdYDD@YD@V%Af3x"Jp%}H@dY@EDdY@h!y;wZ:RJJ dY"ڀ, """Pj$, @C^, *Ջ+,"" , jƍqdY@dYey-,"" , Bג- RdY@dY@dYD@G-$ , ,",r,F , nEy,"" ," " , """-$ -,"" " *6f6" , , "-$ , ,",, , _D_@dYdY@Y@Y@EDdYdYKNNX,HdY@dYDD@dY, ,"-, Ⱥr ,, , zȊYdY@E@h!Y@h!dY@YD 4l6lF, , "", {WjI- B , , "-, ",, " v ks@dUhc, """*- RdHzHd1dY"2ZdYDD@YD@G-$ @d ,QDdYdYe,F , N_1|D9}Y%'YY1"/Y@EDdEdYt;Ա, ; Tv<g <`bکSA9/j,, " bn:L?mҤ~Ç(v"&Oq>nuͫV/-,"" G" Cf3H@Bɓg@diV̳X5j()S_mڴiHȲe>h'jz{yll%]lh)6l, oY@YD@V!B Ⱥ,ˮ]nYD\J޽8(ӻzjKH)&4g$VRͭUuV FdEdYCV@7~vYiDgO1EGGWܹseAnݺiӦի뗼~oOo(SōjrY;wIn_{ E, " v >ǀ,CA֢[#?gX[a6ԶmJN:9φ^qm`~ҹ<{c_&q#&S|^0Y@EDdEdUd%''?>#EYY) d?R gϞ[tU~%@TOuo լO͛-,"" ," UE klAȺ1vWvVf:֊w}[|5ys뛣*vYNq^!, "",,F Ճ"Ӂ,C2[}ݧ_{t q YG%Է0[x[d:g6dY@EDdETLY@!p 5;{կеkWO:Kx57(B!CС1 s@dYdUP6l BF ,S7!v 3/[d몎;Zիg -GRRR̙3Ȫ\z~ "", 3#2;w7n).OepKVU8005kVz|HmA֞vqm۶EnXBAb?y/^07ԇ~|Uֶm[ """,b,CC-Ƴ.OرcSY6'hKִpY{տZzu_1[d}R.eMo;ignUv2227:t(ddEdU$d%''?8#E@U)O2 "_M޾TEe9C[ta +kBǼ2@nzoX^ tnǎ_k. "" " Ȫ0⨅@dַ)@Vtc>&y]C lud˷uBo AU&wlݺu%$;w"* -4*d ,SiScv}1 |)rD޾挡k/bxKҵu>"_9s_ӧddEd/++Yf;v,dYO" ȪPZfuql#i=Zv22#oa֭_ y֐G-t Ye|cGXKjy8q  , ,=;UVY,F -|F˝ Iߠ~77_\ʻ+^dY@E~Ţ>p@C@@dE 2k YO]_Zhon}Ν;^zܹ%8 ,"# d1ZH@d6Z[oпBXM/+5zBW믽7"", ȣ}wEYY6d2!E."Ӏ, ]W%ȢQ&MtZp!h!, Ȫ88 ,iӦMYլY@EY@BVu7z@ddEUgryf " 8j!dY@Y͚5Kǫf͚YY)2$d=dd-,"" ,"?^H@ rEY@dY@dY@U~:urBO? dy-dx, """rٳx㍗^z_, R ,dZݣ.d,, " nW\9{={Ν;weOh!dU)RGYZBkh!YDdYdR-Y$==]eZԩW_Y,f2"CBV22d)=ZdY ED@E@ԼytLիWY,F 9j!dY@dY@ET\iiir9r,F Ձ)"+ YRs*,"" ,5lPw}dY@diYƄ8,"" ,l_uVVV:u_vvf/<0y[/}3gou~駠 WC=|?k֐@^rrbA YDY,F -,QDdYdQ=zntwyvkזp~M}y֭~~~ʕ+w0"*Y]DY@7BFD= g,",ܹSŋC:zӧOkN>]?b Y Y2ZdU“RzphLR, ""Ȣr/t;?Xen_[ƍKs#Fد·j* ,cC;{W|oB ,N裏ի'(33/ÇdLR+>9]oq>$ !BBVkV=@A!}d1Z蕐5>G,"" }n jjg}O8O.\|+W~_~?uԆ ֮]۽{@:?o_I˖-Kse`i&#GYY6d2!ED,o'@!!v| dY@EW^)NǏ;zϜ93pB_xGoJ1?_3::W5jdRvv6U.h!@V<"u92,  , ,rرc{ԩ]?jY_uWլY3}%+Vp{ʓvgtmA^WYdYh1!+̱AdYDD@Yt:7hyG{-J.]jb>>>aaaM4 .:x9IIIիe{6lZR4%.$,d,22,d,BVKBY,"" #\R;܁Uiڲe˝k}ĉ| {ںu 'O,c8zh3iTR9c?3.Wfdł:Ӏ, k\ eИe f, ,H'O}v]ve^ÇoX (a /^_geҏ>+Z\?"G-$F |RCDҕ dBeHb"", {ʔ);wnY\"/^@dUƋ'򌲐#{Y@dYT#**~h6l{Yq}(-BV ȐUYR[z$1ZhHb"", ؂ ~vYV~_JBf3LH@VE?"B֢Fd} g,","5jGs^{p}1--~֣uY4c[:rxoUQh!dUΓbJ }, ,^kϖ-[psmI?~ rYn]F~-WD" ,)\ye!+&-,"" 2!ԩSe|QF󤒒\ kܹСCok=Gm!-JI'DkAy{ +Gd eXȚ)AY*ԅhY@E@ydkؿ<) Yiii^{ EqT- RY@VE?""˘>, " BCC5xϡ 7o^Y,{Rzz]~5[7"Y@V%<)F ,,_lodYDD@d kΜ9N/S<@QM4y}> zZW~hk-$ JY BMeȲEEDdY@y<>jՊ/]իW/4gj**=d~V,6j(2 2,dMWY.mBF , " ^ c7BVu\/%,F Ȍ*Y-ڸq 5^F YJ&Y@dYTZo߾zR-[߿.]fΜY)!7%XE!fL& =zч <"ٯ/_>,@l dYDD@dQUhwwo%>x@VȊ'_}$@!+!a@VC`׿6y{s}.9@vs9O<dy3dͨ+eY,F ,"" ?~|drKCVh~hTgDYF{cÇ;DEEyl$T}.i,dMʕQBV2 ,Zz%Ks:to9y7~!Xd<'A!w޾7uC#]&yg Y<M_pY=Ձ,, *.]*޽{˰gƊslQH*m\ ն쮙>>+"ȪřOȪ$ȚLdŕ?C*C@E@dQԮ];;m%WȲwڵW.d\MmZ%{NNGY5jz, }RE* Y3Ze?,X, Ȣ*W,ܻ{Ǐovz#G\dɓO>/V  oYAldG-dY@y:ͦsȑ2W_ .rA AVvvWn@Vhp` FȚZGdzn^E nF , ,,N;rN&Mʶ}۷WM \mmBO7 +$0B Bx{TG Y ,qnu5j(7/Ass+VZ曆` ",6lؠz2|޼ywo,~s=Q23d_HIIX|.E@UOjȽz'}??U^}ǎ_"~"ˣ*w 14de{ ",:vsۺo߰BvE^2>L' Z ,2dr02(d,/-ŋX[)2b"", *#Gu$wPՄˢ nYSjW,?``  F!R, ȢCI9dmذ!JJv_E/YEkhar7o@V`@V>" wɴB3BVL dY@Eŋ?fҬdGYlhu11n=P:XdYft`ИY5d_{ "", *p 8Ⱥhw$^d +.nI|bf3L"v YE&Y,hWB@dYTY[*3d-# BOR$%=oo25' ^d0jO,A% , ,]KTll(uO^|ynݪ2d}!ZluN AVDĖ NȲZ=;^h!UqOjH&[dbU`, Ȣ12&knޫW* YGD^~O!ȪQc;!rVVo"zG=շ dj8^>E!+[dYDD@dQO_wyl7,dluI4B|<=}}!%%b1/2dP0>fgАh!EDdY@Ub[nz7˼;߿ B.dB63ߍKO :זn@!! dYDD@d!;t萪O4UEJDRaa第5>]{4^hAփCtF ,,lodYDD@dj=B֫=SĬ,]R)!+<|[JxE#2-,Y@E@yQW^TX,* Y+E[^ĬD d9Z6 /-42dm rՅDdYDD@Y]mV]vjBֳ/bVUrsۉ\חm6dy11)`-22,d=)IYz4K2ZhHȊ娅@dYT>}Zʣ۷WMȚ-ڛE*F3J@VNN'>Z(.9--)RܸqhaWʐ+,"" g< YD^ĬjbOWJJ/zxT䅛)ϒ >yx,j"-,"" ,RȲw*Y#D[ĬvZ {'GFn‹ YRGw~^paÆ o˴^Wks\~ӧO&tu!+Xd dYDD@Y䥐cǎ*YE;TĬZvL JJzlbX /2d=2C|u!pcN0_E^[n^2ed4/T3lE!G$B """ž97nh1N}dV+YsNjY֊!5U!4cC 1][渰;{WyO$Y@E@y bcc/^v/JѦMܹSoѣGHhNjU?(YiiBC > DF Yi.v\ҩπ,o-LbY@EDdE27Tu Y-"f5JԱ5ktEF,?D&ˌ0e!X% kdYb~``;{.mneY@EDdEY 6,͓O]p,xD~(bVE{W JNhaff_ xa L">mo@N-!kQD F2ȊRy,lodYDD@dQ@ĉvoV, " ֍X!*"fh+%\!+'W0'YS6m"#Ղ,eUJE!"2dsB ,2`Nr~JOO%])bVH ȊY8 du/2 dU7y7MJ '[lej*=Gv,"" `5l YaaaU &-ўT^٦)))%7u07ٝ(ujH`e!~݁,AV@EDdEwҥݻwGFF~7n\UK݁&(Y[SR&0Jznn;%e_t BVAƆɓ' }wlP5'T=jY$,"" ,*KU~Xm~ڏ:  xf)X̛-ڏ-Z;L_fnt&=8j!!kdYDD@d!Ko-!h!h}#ii# Aלΐ kG{B/<c#Gϟ# d"ժUӯ>lذӧO- *édN@EDdY@bcc d-X}&Z% +(dzCF -?ggw Y[%z"ɲ-2Ш_"cH-ͱ<'u?Q -, "B֤I;RJ@V@f3L ^k$>f)ble,oX;!'!kV}h!YDdYdQAV.]Ο?7疐uJhu,?KYY 22dOlɧ,BVWe!k\vn,#BY,""  kʕ|7nv;N% j +0nj n|I!V4dٟ]haʐY@dYTiUn]E{%DXh,,gWCH%tUՄnC1Zdyd:B ""Ȣ5k(ѣGICfh82I_NIIZeH^ YO'Fot,h!mx cИdYDD@dQ4mڴ/[*yph_ESDۡQ ޯ]{ dd<3z' { Y-EQft`g,Hʐhm, ,~M6cU|o Yo6X]l|m+ry9ZNJx Y@>d7i$d4dh!+Y@E@UPN .H{x"e?&hdu(dEEmLN W-i\OeА>;ZX]d dYDD@Y6o\F )E[޷o_բ-+DcY&\!K-^4 22d~͹y =Dl)<&dudI$E!"YdY@Eŋ6۳gOUD[[VYDdpfyfL&B\ #@V?˻YDZ&d5yXiȚ$rdYDD@dK^5WMhhzs„qqK!#@eOB>d '=0ZhH/rj# ,Su]޽{WMȚ$ڻhUhg Y}~- YIIWCF,.[h!9Qت&dyB G$ ,"" ,%wN6ȑ# ~o#GLOO/t YD{ 庡!+#c@`E!+9yjTF!x^&IjBV=FY@1!k`tNPBEvQ:t矗p,"" 7o+I:t47\~V-I,!_:ϦXVw #o7$8ƃx>""ˀhaba*Ǐwrl޼}] ,跷.K{U7ʺ%dՒ뫊ѪƢ4haZڨCγQ k>d퐵%GI=%g x'2\-e@cY^YaL&~6...$$yvݺuA֥KgeeٯqFҁ,",~G۰]va Νo~ĉYe1ZN Y֬haZȐ#Cּs>CROjBVu!+qBuG i(3* Yd,5k:-߷9sFdK./ϟ??::z̙>}Ni۶mk~CBB,"" bڷole^IӦMkزeKU.Fv21"bsQJO((d퐵A`rKg2d Q˃6uG C8S,Ⱥ|-ʎ;J,fϞv ͛7ׯ߯__>|YDD@dQ`;*~ҥ5L8AVhUcDcpȲfԪBN^(=_I=k;e ȊBAc-߸'O&%%^6m:p@1c /^G ,","##/۝W^$&&AVh?U3DjpJL|*6vkL&CyYe›33T:G-4dE8F Y,⣅GVBޡC4iR&L,nuz) ,tK,7tѾ-Z(y7S$D bjh YYY=}|d5{]dA![d Sypf=Q Y@G kŮ/9r~6**י:u*EDdY@y_;zgCݾ}{G7f̘~z?q׮] A (bjh Y11/&&>UY, y;dM/3_nϒ^<8w>!GF+ Yo/tPm,{ҥKq+lݺ~X ,t?ڵke[Cvv?EJo)hUh78dժfQrr:LFϑ PO BVsՅP6"i">"0Zh0޽+d5jH?B 6LN&M,"" ":jٲٳNMڷo_>CHKHH?,hѪwElpȊؒ2 )VվA! \UlKW:8YRjRp,Q:2d>ZXE k-֯3| ,q XϞ=KOX7vE}T}qUdh׊Ѫ} 78dIM}yG-m'r2v|d%$[r-4d):Zhc{4K;Z4dUʮC=R ;{wagDD@dQtUW;w^… ׯ_ozk6]g„ YWD3OUEip >6haWCVd}l7(YmBV5:j~I9٣AÈsȤ\E!+oI*CVBP" ɥK^ʕ+dY@EP.]JKK+3j(ʛ4irQW:t qqqg..]iȺ(xB YV뿹ٻ~y5d*RdC3!ȣBV㠓JA7rC'-*OyB3L[O>4շo_6mڔp1cYDD@dQE֤I)Vrrrvx\_~K OUEgp .#c+d飅LtA\ ujEVh KÝ[uO~w!+REe!+)ب|k׮_u-Z>ϛ7,ӵmvUV06mTM7NLxbpppym_2dFTh6C̾γ6d2fggwGjIM+@==_:*YDf Y>"CTͭά@SVn|Ͳ kYYY7 fyܸq}'N<ίw}7$֬Yy lO$22^2 , ,*XJX:ucxwJ?lju^z#_d-xE,_kYY-4+5u jՐ_˖\WdCdу B]"CՅZ}dU 5pBο+|V}E!+zoBLLͥ)S_tPAV{$e6뎰\!+(dzCWC\j址,cA-lqD M,d @ "", A͝;-~ƍ²e_d})Zhbp27'lJJj՗CCBޏgyt-2 > gn%AQ P|0O,"" ڸq.TaaaK,/_x[j:ؽ{@ChK*h+<Y"<mhN&/"]/qsP#w0j-mRrE1Zhgu+˴:Y,dU=, ,*AѥKӄ {_oԩS}^ mlN$",ha|gQ#7H!kr BVOȪdxa_˟wmؾ_"˕jldY@E|P_{e^sjje˖y)={+WZU۷w}R8A*h Y99]L^bL&4;&f%j佐ni"D^k(u>g`U]Hu k=&/+'>Y@E@z}&Fvr+WTطD_S+1BVvv7ō&'Oz5^ZZڽySs+GEު#)*#HG G:,Kt߀wїM3/W;dYdQYz\+>>|i}ūo@іT=D;bXiKq:f͝B]ϋYz'C.*YE*EF W5B+b/#Аcm, ,*U@{Q}UUL۶mϴi|RB2VTDg`w8JKz5^ZOF+ YS1Zh0Ȫ)2Z)zьW[ q-1RMuL.`, ""Ȣ|+t#O… #""<;vG}t޽-駟:Q͛7C@%:$5,defժ/?t5^Ț9JO ݉? B"-|@:K=yϼlZݚB2,dj /PcYDD@dQ6w\s_Je+%BCBV=dY@E_pp9k׮_ RȬ"""fϞ=};K}5yvD"LBVjc5k.Y~~~rNN'﨑BVͲIP ;*dYEIWB~Wl!#k+;Z& 2$dEdYTinTRT/_.tj„ kYE[d]% Y))""^bL&^:j佐dlhvSs@dF YѪmO?Is} Cs-4"d+ Y'N>}:EDdY@UdL&qٳg]!k>}:;;[+ZvDzQ5,dlӢ^-n0Lznn{K!e~7~UYZAV/%9 ˮ&dEbU@zGƏdY@EY%zjƍ+|'oy#FW~+vD:&=-LJ2 8RJY丁ğY"-%I2?.uҲkb Zh uoF ,"" ӐuUŁ꫒UÇ+ DD5Ͱ . bsvv7K!e˫рB#AVHO:@Ձ"]cxZb۪ YD(YęcԆ^z"", *N:塻pn@U^W\q>'NVwoOW dʼncNha kVjuSVV/5')ifpJA˾NunlCy)ezTSibxHfQԄ,c2T-0+!跩ucm" "", <Y]DFFw_{޽չs[7 +L_JtY Y11+YE ؼ-\?57X='G"T,2sHxkhݚs=˪YͪY"5DW &<ҹ, m}<"", *%5j^*ăǝWmݶnݺ,cH[ U#1! AV|mFT<SRWKkgB ^ǔ]60i7dqu%RsP-.K[ry_e!kРAÇ, Kr9c>qעE.]T,\b]YD (P=.cBV@%@VbܘjP?>߅BO٨5[~.𩹍Ա{,S fI̅9W5-F-mZ`s?^B?gԁ=}/7"@'vdY@a _W"/''G)66v֬Y{9y7vٳg7jԨ)>|7n4i޽{ΊZ Z ګƄ,?23^bZgoS,OJDz kS}8~zF YK#=eY]@S׷3ꊏi乾 BER[d=db>[b(>T___(YVfe/HKdDtO=kZIwT,UHB\(Y.zoWXBB|whsM&H_/Olt`O>S@dY#ˠbM8 Y> k\/d-4cBK-LKe6ONNBxq*@ږrvJSijuh kA?>?o!Oa5*c;耉_Q V=՗5o5Qzꩅ YDD@d7ԵkR{s.4qF}رcYEkV @!Ƅ,'YS0Z^٦Y/N |jOw,@3ZhȚL{$<-aeF {${s+W.-vm d+YO֟V~}!7T-3h ,ןC9FlԩwHXw'^۶m/g cѺB>1!K y6+Onn˱Yw>+ |jn$2̱%GR zYŽbZ dScǂ@ BHs@Ȍ{۷ח?6'JabgDD@dwzG˦X?5O v^>jԨ:u dmd)+f2gY,6:t1G_NHXTz 6K%jU6[d}y Q?cC%G J>u:F Guն YKs}nM*Cֈ#y ,vL׮]{WJWYYY|Qڧ~ڳgϹsJJ(P!+7BvQh0'Fg^>>tCf֪NȚ=TNsY;0Zh>&;^M_$?Z 3uo 6 dYk:գ݃&VYȚ6mڬY,"" R Gz;vW^oٲ9s۪=)֊BuA4CB́ K. >))""YS;= 7 q%o9BHȓ!L Ȫ&Tɪ#@CVL%$B ,"@ֳ+P]M Y99M Yne҆W\5>PQc +[dr7ٝ.5AZ*Y?Y;Rxx*;sYK [(Fe k~SB2474d3UŁwFVbsY 1b, B l@&{g6lHYqƵrSN1ŋ}:t͛ϟH$:T@hagY@#KoZYb5=쮻 b7zQOȪӼ@֎?U:@s3Y3ܣg;Y k|7of@%ȉh_G?mKݻw={ի׾}FEu$Ǝ Bd!2'9X$٦M|32dH0{lu}OIj!!!b%US[RR2sLfSnnY@7O'@VPP/[+Z餤DF,^'g5qp8ؗ)GD3|FE=asY-Ț Yse+a @ַ]C$6O4z3ZX +&&Fjkk޹svQGVE ﲦy!whզ,BP(Ydaw։Qt' }w2ɭfMMӦMڵklY#G7n, B l@&{g:N^/ɣG:tPGL;ԃTz[rI}9q`ذad/SO dCU $/r8X_ e#44&*-l'f&6j!>Z8txf8^ZnzsmeLyXE0TgT5P&2y>3pÇ#BP(Y da,J#(Y=w^''' Gjp톻*"r+_w} HNUؔ[&}ۖJAfKXX}lY?þ AAM mzLJi3m4V, -DP(YdLG111:O5jh.]zg^|#UC?xŋT˦MaE}9NXX76|(.!@c -Y*7cd|>_& `S*4+A8gixsd4jh,2c6i|g>fԦ4rUnvʴIIIaȢ3==A B!Be6 K=ćFn>={N:4nL ĉt҆r V0 d!@ oB. B9YhB^HH:AyYZh yԨdpfwLDPM^Ӄ2sYJAVucsD{+FSz]v*WpV,BP(YdawÇu֭Aeaaqڵ뾩wwu̙3TUV8ȦMCL઀@E KgwtK|9?klmd7:" 4GrhYyz:7+0@t|f63dmO7MghoȲbӬC:˜#Xj5C\mbcc6]ta7nɓdP(,Yf0ٻܹsV[;w 3gs'Nkceexba )aaI|5dyYC !uYz= d{e޻-sD :]imY S(W,ޗf…Y999 @BPdY˗/W_k);;;cҹSǎUy…YL Ⱥ-B ܶY"GS{OHHHDeL6 kՃVFLs -侅"oe /e8 @-\P?hyR&f8kf+{A q-4@VC*nݺ C Q( A,Y(V999NY[[w}&%4R/_d߿_ Tޯ6*5> y\>D]HRS1T'we>qս{=z BP(Ydp[zIm]@bb"mݺu@rbT2N4P1R0ɩPk4v]ABsԜ0.4!do[G(Y Fՙ}t7Bւ,߿ yȲmajD":k,3g"BP(Y dawG:6;Z *R5@NcȲ8&<<>Z3dm =Q35)+ fHx#`]Av>9AVՇbbt}6ͬ@VL@֊r?f TR~;vֽ`{(AV7Zk &#h|@:>kA;e-G0</SfŁwL^w ^Jc^5k֘'ΰrrrdP(,Y0G^zuPfϞזrWT)+kjD'!!B&|J{}X|<=K$y5>>3ϰdoW Bڋ<@V\%"|@fIQO`K=^G/vn#km˜Qcd= 9ScY g̘qnݺ7ac+8C/ Zr;wHU&{GP(Ydث/_9͛7d1*e ++ V$Zd  M`r\(jTk ,e>2Ȋ k-v/ZC횣j 눘%n vrh|@֒貦GV;+kv:A֎v]՝e k_T&w_,}@0~VZq1c|\ʝD0K-[Un)\Y( Aـ,yiCe Tqq U H[3_:Z(LXRp< zMPPObvŝ Qs8@*5.6%N dHi9$ѰAV[)ᚳ6g-,'x:HG4dY8BԞf NP?F g{f &N Bd!2'temdddlll-wެY36m2| 9 V7U _Qd@Ydq8;8g):88=YX<`7Ț=>7ZH-~)AZFg  C4C [lYbWwiށ"3-v8jܸ1Vn݃:ujʕxi&33Shi󩬹Wrݪ#05MU\ |a +??|EY( AA&{_PIIݧOCU'OK9g75 v7 bj d T;M@H8v@51."6DZE',e>"sL| A+Y./aWA ~ q":y>0-XL,[ -ب,T#ݻw/c׭[+rVTߡ-w}TZyGC QE ȺܥqϓiVlWn,>@OP,ALZjx843YKՊ@Fܵ<7y/^\ɔ)S՝SԥD@UZ Oݙ:Nʋ0`GcN4 A B!B "_2ɓ'+W}d}Z}kd%x1d۟ :uhLt&phaJXz5=r*PXL@O|B P b7d=qh*&PVV8˘Tj_,=F~-,dmhsF =Vf;h8*証r߻wO0A B UӺ}6\tivܺu+sdUcH*4 M.d2׮}:3;SXX"AVEJ@5Оٝ kH*tBs K bMd=NWzIAI5V=T?~jRRRרQ#un|2d'wzFA}Dt''Ör3ɵ!A B Uu2fP:wÇGڵzrכ7o"Ȫb ]YVM4 B. BzwvvY|BB--7f*CAv%-Y de,t!@O ?L@ yKѮTj}j? ՐP̠us#sYasr!+wW;VYY~U[@Gou|1ITzSN0-#zd!BPdd>^zwߙûQ[ S 7 ζi|hT:OPPo;gd_aYƪNʁcXZ-f;§dc9A֝RGڄjJ} ǽ@sYί`WP9묙H9lp8Fՙ}rY~(sNY%V mL 4hĈP( A,Y(֩ͭ/0ۯ-u z՘dY5  +44YgK._Oʯ>,Y^a{X% AVװ5RywݛA|sY>G\3N6_X J##KR.o$3{MQr\+t1..NÕaj +7h͡96RZhAցF1vXY( A,Kj*#VAA9xm beWʲjd pt<dD"}n?tX^y\> ;8ze/坆B sY?lgp߲d]"y*5@3%&:IQfR2BUvo2DžKmb]AVqq1@P(,YPfgϞ-Yuwtt^-[=ztMd5d@8paM,l.]Gptb >_>>>JA*be_  Q[^Xoz dglDŽ){A⦃=J UHЅul"5i$_^Tdq-KyxݛҡCS0jqJ(mBliۮK2 |>+@VRRRZZ, B A .m޼YZYrH e4ȒJǺo4>Pw60/~~뽼Ng1R=PՃ{nUwfdy@HW҆c-:_MfGz ]C}2E +<;dT/,Yu* e1+ 5G+X@}` kwO#-ޮ۸X֭3- m:Nv@pI1ȒZ]d Ĵ4tP(ӦMsBd!B2oQʡCdH" @g0JuP(O8|vծ ̵?RHiVɞ#e1Z6+pwQNv &VkY5ւ 'llÀGֽ@w˿d )Yг+@###Ճ}J3[ W-חi`HysXX |E +%%%==AQ;Y4wﮯƨD{ڵkR;( A,Y(3֋/d}eA= bd͂,Wm:G-dR3dr O]eeu +4+ZYIV kr/5AVfjԨQ˖-;^,_-ĖB  ,.uK[tȪ!EX}U'Ry)ukլY*qRՠ( A,Y(SX,VK,^Aڶ%7n$JJj/avvgWd^1XP7 +$$nD;;g18R;~?փy0-Ԟ {Le/ Z{8&ZPMoc*L%v-t3vVN?zqh^].QX$?q5nܸɓ'diH'Ȣ}v&A:nYH$ȴ( A,Y(ٳ ,<A w|_UsOSD"}dof6%ExdgtS@֗dq{i 0 b=J]JGMVH_Z8b$L^L|Km'Re;td58аA֣G5Wm8 ;2߶qmd 0@֩Sz5kƬmVcbb6=FPd!Bdd1ںу1,.&>ڵ:PѺr8Am|%ՅEO85KAV``hWǨ9 b^+AVBXLy/nSdu+h2 K- Ǚ ~;Z] 56,](Pڎ bdݻGL_:ph};bQh QӦMAqqLH}c A,ٵo>l AY/^|>};횕׷:I$$溞5CS%$/U$zY+z,Yr`HXoThXvd+RVʻkxR bvʅe oLcdu):Ќ ߰G%BVdݺEZN:@V{a~ m۶ +66YMHHw͐!CoBd!B2}iΗmN: #,Ji/}%egWg5hsYG<=%OSzщ d,0 djjX+ڲdn: !v{AkÐquaP<(t YPSZ&4be}970Yyyy3g4{5|pfU&;-f1FPd!Bv] ݻ+`+, YYll tr*ҷC焆/?Io ZPPo,[(VK>άY./U{Za/Ȳ3ը:/XY1wJ)Y/_D\Xd]@6#뫶iM5?5iҤS=ڷo>};( A,Y(V2֭[ŋd}LS]tn>v!|H/x.qwߨo+\ޏ w&cYI=t<AVi) w$ze+V+@E A%YO} 췓 SKGdXA4vm0:JYYYY999fRsڶmv͛73[°KBd!BB! eٙSǏI}-Ͽ$ 86mup8J&7cAփ$XGsN1`փ,uO3Uha2@ yidoY =^n;kw* /$]:g-C[-o&{7pt c@ҥK 8e6`B!B B@DbNybpr: Ύ`0Az%llW;Zc ?I2Ք%ݍY}γd} I 1'A G4fq) -VdnM'rev0#&,g* /$х6uh~ +;;;77 KFZY>| `*OmT)Xi({`~ kĉYK~)577WcjB___6lxqP(YdPlƍ=l@_t,b21:YCܼI-Ç+Y"$O>?ok``_{3lYNN`E; !@oʈh ՚ km3ڈ`199 GMyh( ցeu*Bjs^L u +,/AִiFKO;~6Z3C Yf dm߾k-^~]c]?>r)S:uDPd!B{CQ]/_c1Bu}Q;j8|9hٷ/8C-B*r8mºp8>𱴼?k}7AHfYiV*:y3IvWK"Wu@vڈ@e& ^4mд dkFmgƀ,݃[)UY;`JkdmFB<Αϟ krODm$O}Ya Ldfee dP(,Y(YStJw^ wtAGIGGʊxܰػW9Rr 6q#344YX7lY|`y[#C WӬv?s01Wj#+-vkd}YJ4mWZHJ,Y_'׭tS'ʖCg$ݧZWduc|G+Vr B.c5LXl{9UB\2mg2bow B A1Z` ͛7Ge Rl,1r$QY# K*Th#<<`׆A }e/ցaHE#ԓ'$PcCO!@wsA֕.Qrwwv 1Cr̘12Ce K&|Rp~ 2ODxxBc" ` ics]70LȊD٨ijikK)`<:_z0nqa[q`pM۹)0]{EdFu(&Ojc@֩I~\Sg Ykw߹3 [ێUd!ȒHo)<_ذ #>UhW.Bo -DBd!B!BUd{^֭[[N Sog,Yr\(5?"}|(U#:;יR6+$)YR8wMABJ^^=1pvG t3B.Ddۓ˴ɛvʢ -cUdG0Lrrrzz:, B A4U\\ iڨG>D $Pˏk5acsqYH*lX@*?IUYaa)d zr `u 5"h׎Pb/ZkNг d-UlYZh1YO}y7ƃM/Cl HFKۗRÅ9IY|>,G(r„ڦVd-9BVro:y{dbB!B juƾ{6 5jl*,,D? A]]ae^/ڌ^Z݅\ +`nŤ|wsu_du%1@vv*Ox4\XynHMۉ(@lY]l1 ZyTUYpҩUn 7M d >|ر 8eP(YdX/_;wlMnag[ddIRSE."Ro>,|7A;wsR݌mxx,[(VDDb*ƎU -T9edYC~yE `Y6`hB./YaH8X; 8i;|Lh ]$ɪGF!Q'  5}WF id`C- )U|3-Y:^iedLџ"YU%?@> y:lZ8[vzn8ҩ˛ \d ~I̕ly@ַߒ>>LPRRd6c)Ⱥ{u,[PIW d=8>aP/4sY>0 B AjҤ C:TiƍS-mۦ1 JKKU[/_ A P|}Ơb]\{y-xUeL6\&"L4}E='zAVr% Kq> ll,jڔzUOhVfwAXq#>fT_aߒL:|~ZV rQ{D g[ v!b *ʯ4 gj dQefLfB M24T7Ȋ>.K t{@c?.~{ @ѣ̙}` A,K%ɘX4 FS0}tUMz J'%!BOnn_\N\ ~ Mf0 [u``"oTE,^=,^^^KNZYݦV%NNބ%FDtUtUe[X|JqaIzAVJ@VPPO^S MuuEhTڒTIe kK=^%D cFSa$Mbmg K#Kr "jkX}W GĆ:a\VJ1 k;*݁n>YǎZ Q>{A֕+d˖z=tYJ  ˰ L d9>$ԩS޽Bd!Bb(6nب^B'OVx{{8P(իWG^%|Ys3CCx?1n_7s9aaːK U#8pSH$4rE;H?NnX!=MJ'hE\gz7..۫@GxZWìzz.up8VVRg I7Nq!#˸\>T?Rg < wd,5VVw$|2^겶y3a]ZLQRBT xē'jtJ+ML)#_'D )a\I4^:.kkX.yT;|D(b#awJAVk(>궳{kd-ZD._^dY)rdLdQg*>.cz=JO]0ZuPxahGY鵌P(,Y(YСCʴ~ڶmQs-g)>>^{ǒU z8֭swY'PO R0 B AR;}]v-Y;1cid0V@R>\̲^<=qūz|||hl0s,x?3KW+ywj ke+M!DY  W /7OqޥƮ]#CG=QAҎ Nְ~^1EN3 69.,${Cw4YY.Qp[ctvv%O , T ~NU!_|A.XdJ,w>r'ƃ,WA5$̃`zd}45l0|( A,o>0Z͚5r8gΝ;W}ӤINT5Gj%Lm>.xy-PeAr[``Ψ@;Kbj;ZĆq8K=\>T:*CDDǠޖwU \]w}s1\X 6<KqUqo3=3.[Y}3K̤ٝڜ9<ɮw $ckԦ |9'$×- mےgΐKɉߚYkdiur:Ȭn@DL A H/99޽77Y\L jkr7qȋIfjҒ}T|ɐk#:v$]\3dgCtؐ~J~%SGM+7fLSa45Ц.ٳ ++3P%%$uC#G);}ЁiO6ݶsQNj5?3-VEEEDX{EAލ0y> ~4r@ݲ%ys*>M2 ,oobL0zhVrw' -tDojd]HKU!G;wY)~`YoHLZ§ØGQNN΀L d@YcƌQOBPd!BT2 3g HDf#;atP.Q鹔'?᱌Y# _갌yъøIoxy8 q S%.ޖmh2p wN Qӧ+VоX4BiԈ&NTstu%p`_|dI;;R螵ZFt=ٳdCW(3~<}YW'. U3lтP oq6mHv?ԼBQ޽ik2r|2*>nytVSUYt'U8~NPV%0%P/$ :3i~UYYpL>Quf9C?|ӊFs 3Skdm)S`+pz" H,p~W ]#7qwcZhd2PIIIP(,Y(YRJJzjƍ7V:mڴӧOؽe˖d*|?s6nҀJ/RӪ䤉G\!i~h)3[Bz˗XMLJKP=.00199u*v-_}Frpgй% ~/wԾ/^NY \͋oۖvQ 2z ߵl֍<~3I+),KWwA֬Y$'/FzVb1R1#ɗexH++BŢ,9$/.rr&6%u\ąQniHN;v8UPU~yH|YG#FS2Bvs(1)ս{=zjW95rssǏ^ A,yٳg>>>VVV *##CgcU`ff&Sl2} OA,S]'B$  .^$ׁGˉ2BkW{1j0z#1}Aoqe2<|DF<H\D3-.^LEԩC(X6‚`f3r H,y2͂7'g󕙻\]`k KKU{dԲaz@u.D cj|}ɓGM;FvN#*"/5CZг5e;77C KG."9kf͈/{BZt;?2y􈴶Y߿9ɐ5vA[:YUYźA lnA3d-ZD.qI3g #\x\5M:P(,YPjݺ63f ,,L+}|d9?CCUdDhaO'Ob&%%z:;OQ|<j_A ooh@3JGlN33?~ذYY.a7n^^/VxxywIcݔz8*O'bcil"MHؽtٮy v:]s"٨acCgA (ٖ-:@-1sf;&VY#n$L1J`UG8]&>𷏌D'giD¡ݨEu)397ښsUE-Ÿʍ /IY;Э1*YC?>WQ(,YP( =yرcqժU=, -DUCaH+A,Y b3ViiSr5xzW.]JV <DTVh#"kk[hA;۬XAW`鰆 !ʾ`YYd˺A֝;4d+**ߚC8d]=x@ 4`bWzЎ=9Dd5dv6}4fWx|t񈚹)" .^$NϚE]QQČDoWbb`:갠h׮|kp0툵aB(;GY!~U=ȄB"9{L۶r%ԗmCWoh.%X$&ޠ.gI''E&V a?*{:ZGojdZE΁**xUS/CC6Y eh=[[R_mŸO t"ٵzԜ *ͪÉBd!B2Wݻwoҥ7nx뾕ll`D#Y5D""V,VX k@<{Nө K ujоaK2>}LJo!-,9shgB($n%4&˧ez8\x b}YځqX+u5 1nY,X>$Ohq:hYjӆ#tQPPe `sY43ƼROL/JKzh9Q,U%-/[\:hĉzʞA {zȟ jdsP(,YPf B}6mܿ,իWE"17"ȪA%J9"YZӧico#Z@7@§Ⱦ}dz:9m!o & )(( Nb222;{tÇ#Ȫ),Ydu_ +: o&&oJ-|]L{^98aaD8#23S93`n.!Ӆt":Z/5jK(?QOj 8ra'T,jҚNP{﨨30À;v%N4&`K%1FcL4K5K4vZ]gg}9g8 ÀZ,isgf|>[k^O @;>b>"",\:t`U>'OիYNNyDʕL\7&S|w]Z_x:Z_*xԪU(,OgJs_,VdMlC }R>厎fDrV6+I&%E I3udiȄA/" " " @zz:={T21m۶oݺUYj! hlqED!)*墌zB-,uvcyh!g#~icۓ'fEԱ Z"DǰaÔ Ə_zu\k8>IS46aB#yNFg>RtuR~Ӈ|Q jԩSѥSu];|~RrRS]M%kڶc^5#Ri~J9pw]dpGy|Y)))'YY" TQFQkܹs%~3\)iر!5RpwwW0EYYU*"wj5[UNq~qq0]ʼn,oDQ- 2/Ο?_諡t"\}?|\t)C.>s''SĉH긷4w|bEQZ׼?"Ξ偁fDVJ5g\`jY)7ch%G_'bL4iܹ UcVO 8pʕׯ_[?z -^\%Yr\]]KrR 𰳳)J L4MtdaS&:D%Qj@m>-%'ЬzIDVak;vdɯ_gW4_XyFi,'`رsζly7MD|F=tR銽j.\aNTO雮{>9~|汸8f8u={~Dd ;׌ricՐʹt3R4M>=99_DDD^Ҍő_U'^ˢ"͛7嘑PݻwYYH-bM,kY./.ª&*Advӵ>.&6W^-7N_ބ/%sPy#/vmrp`7ˮf¿̈yr f"?m O.ԉF_p;;ڻrJYNL:|,g~,/Td7hj $.-VdyZeƆ?^ktuhOU S')J=~WJbcc1@dAdAdXTÆ -e|J.]z_8u)eǏCdAd!"*E#pvYUDeY&~\dIȚ=a&OW=zkۘ}Ņof򪘘 fDGlj8={׮C+3sLe]lPfsޒ$t 6 ŋ*n :;EJvvl),'B-+ W۷M-\B jHDV]JnGwXX,,,`ܽ{0>yd9`.8tPn 'foo?uTÇ jZYYZ"ƉD⊬FUDV&5N3/.]Tqu۷eZ~0q":-XF/Vd-gd*RFFi]9fkhC`ؽ{?7Op`l^Ӗ]VzV~5kX.֭bEOKښ.^qڴ718`Fd=՜QLLLBBB䫥׸?м4a ȂȂVѣGa%K}!CԿ{˞ǏǍWxٳKd ?y""MRAd8BYME!E֔)S ڴiSnUJ.;vqc~ ?7k~l)?_bEbltO}ly!!q>_.?ؽapy?m I ֬)dZJz<>`վ}ϙh[}K isqW͚6+ݨVu>oРIlׯy ǧU:O#O&DVS~ooipU@dAdAdIvvv#T 8^2ĉZ=DR Y":ELZXDZ(}af̋,Jlp޽Yv혱ٵ)Ųlm%jDַ#4A_s|7o޾}۰ə3у]֚5ɉ]{VNegeո׼9|@ݽ+| EwFGks!CY~Qm WYUR cho}gD(9=k֬LYYYJiB.?;dȐ믿MJ\b ez꒷r DDD֧՗(B\ՔhNEZZt!ġ$5EB?4#yyy*%-ֱ\*%EV n+g*gZڲeٯQ\҃M?3]y.LNLZծ~cc`&su(t*6OȜߊl̈ٳ,Q?رrRg6"+KMYSL^5meME9c ȂȂVիnӧOE2zh Æ .e YYY\\̊S }}}mh#c>_iAgEYY?%]^lZS;Ժ5֥˾R, 3߉zv4^~&2fKx_y$qـ3ߊ"Z)Bja,[Z2T=WvV5:7F DFF*||x|<0D"?+,]h1/\PtfY;iђ%zqt4S>ok#YW3;?掎>lg*+||>&+oy T]Vpܹ%9***>>?}&M<| ޡ w^ܹckk[gΜ9)))}qrr[nllÇ!*Cd!ЊExy⊬D⊬&DzYeja4N%l`Gjھ]2˕ĵ5F}aP+>]5O;N̉gΰFXX1Z^nsqHDZUjPbkiӘVJ;;Ǿ{{K[Kளgsx߾es\K~4nf~ =+EHCTsέ\0?nnn`Qnz}t3OOO*8,,,Z還Y!(66Ks'333NJnŨ>Rgddװ^w ;Fz#OXJSgΝŋ|}z-:ʉwpq۶,$eoڷ^*YUۭ[xÆN9hktyݺlFyjE ҶMԂ>V Uc̙sܹܻwo۬8zNf…%߽{Wn]YYZ"Ɖ,_4S DY[R^+Y t*ckk[ЉTtm۶U}=fdi>W٪UYHk[:pT %rrXɷS|<ҥ.\}"ϟ[ V8!-:__v[%9kmm4HVmD#^Y6"ʒ)h ɓ-}@;w7˂L0aC\Zkթ>nvhȂY({-_ÇW lܸQy;wuSM6-q"##d;qBN!|Ѕrgg?ÿ+ʸ֖N+޽Ҿ=W/^֯^]6qru+?sҼ9cϟ"_U%ȫ ~\\بQr11i ']4D(ԑ,*^ ʕlU`z-~}6s&h>,_nR1'̞]1u\n D,<8}trrrNNѣtd Eeazzzi"m|A,FSd"k ,Y.,/aEV`kqEVZ"+3N,ȪvU*$&N{s'ܠǒR8˘MMd} {-6^xoܘOMYؑozŅݽ˿R_@^A:K3NK~]۷`3k,lldnM2%/\jƝ;Y^eSrT/sغu^@dAd,P3gem޼Ddeee ϟ?ȪBj!R knj4qEQȩp!EQ=k};oԈݾ]UY D‡'ܧ[I:177ӫ8sY8zGDw~&Ԫ2p2i^sb?]c͚ɓ'ז}$⯤-Z|Jf+nc#OH^Oc(󙱩;u-[\/!+Km{wW_KV#GJt8_!6:SW&>>l߾z_Z~Cf .]؅ y|#,_Κ7/阆be9ɱ;P1gvȂY8p#G,{LZtW^I :t{A,,,EY/E\HWE֯vŋrrTz'dE@&,6س33/nRYvrةSIp,+;FoM帬Sĉ|l|zzA:ys>z4kӦcKW_)#WMį^=bbDu,"?"ȲuB{5]d8P"E:ŧf-, MFL(fsg ӧO7gZ?9SVRJ=ƒ^.W|8~,߸I;vQ|eD32x~/^-=l Jضm14#GT ٮ<{ƕ#ڵm3V˟?nnëW Խ;{-yE6 r: @Vymȱg׏1'IĿO+y sv7۵KSƊ58XS(.:uXѮ=ڴw/HQ^o"6e&WwʑoEQQ֯7#,eȂY,_2D{?L,|WgϞ^ ?oؐ?"oo//9l biI֢?qj~IBOfnvv,+K^5f̺ ^ݝ߹#Iϟ͐혟H^=~ႜWŸaϞ5ț6Tfoϥc޸!ۛ1cΕIWzoVNN۰/fi\޳';}`UN[70'v&hר0Aod9f\+14DJڽcG[KEj7ш2e"KܼYvHӓKDDUV$^屮t޽"/}v0/R R +Q#JWd5zJj}W0۷c˳1~<2- **4)QٙڥY36ok\.cr|ڵZJ~'O%=_7d%y3ԉ/Y’i >0(~,-M>6mH.)\X˖9OܸHW@>syÇAӧYӦnݸAUݼ;vS>OL شZ]PLC>!Q:YF|0vl_}%խ[$!Ǖy62I⾾M(/T8|+YY"ȑ#TTRXjU)&??⯈B,,+YCbN-."++و* -рjk[dݺUYvM}dTa˓^bH~Rkۖ}޽[f;ԕ+WnăXv6?խts~6IU_@V-ޫ,[l'SG?ݻI뎎MmAvSC-P.y^W>kty;we[ɉZ)s,nݺŝl7An{ؗYT֯˖'$ȗuʳ\xJ;vLn_woޔWx!g 1銤ڹC]{XpUՙs5ztvKyr2sqG!@dAd, R8uTƍ;gg+WX qwwW0EV):MWd 'pw#ƵWd9 .UY*rV%&rw2D+VYO9 5<=tw,׽Ӻu.R1H [(Roc^.h]-*u'OX#}Sڴa{ΏG s\I~>zčl֌+xF^'ݛ v_-'fo ޞ)ŻȂY8o޼1uO81,X ,,m۶YY":uA?YB}& k'EY,QEV@@@PPPEФ<+X2]V "Uy6VY*ׯ3Tqscw3#&*I7Jc  >5jq]vPT5Mdm޼V1le"Z-LU:BkY tuM-f.G"k|+ADV d; eZQٶm)XucgΔrsgY!մiٔ)/xlh޾ӧ'Ga~](qy34+ tz7/w1W" " @d 6L기{%Ν;W4[ne=ζmS},777JSd"˟h"+@hU(\d%ZJlY1111K &ѫ "ˤG>?nB7ok/ܸ^-mPdUTg#XV9;5ĺwƩyDž c꫊ڲBMw\^z|, y.^(uܒ%K*%nݺUDڷoGe:"ZB+Y݈ Z8hjdYȪ%x 񩩩1Wti+Wu[t2cxh( T*z;w6oْ)E deIk-XMd)*-IBYQQQH 9iS~~8WOg³gΎ)$8sF27صnͺt3M4a99]\W3|8?{Vpn, 3n8RTe<ȂDd ԥ8AdYȒ>DN- kG6RiYNjr+L" 7o'C)wp5Իwh*VDlǎB?綶8lLZhՆ I3fAXpp[@dAd,:t蠈u^~L2]VYQEVgB& ^#VԈ,kdy+/;"+22r…԰Pb-[̗-gӍ]\g9rWbbj]fNN!Q D"FSBDdUZE\6PYS};aEVbbbzz"7""9;3_Z8vS7{Y1vDȂY@dUBj!DDV5&D!D#YȲ<"\Z("+***>>^T5wիWR#4UoaN@dAdAdDdy%+zCjuvFd95Yd9V)|||?ݴilVh( D''Z-LUAD⊬D,.LY6Ƌ,]H#AAA謬, YYY@d-T*LR ZX"?gŠFdi,&jDdY IKK0@ $11Q@dYDd!""fB&DtY[#K+xw_WrVdW~y{O0!&&DDDD5i U4N(5ƴP"NW,Zr$Yd"{qEVXXXdd"+99yŊ% t" "SYEʡ#jDs>'[YqGd!JEghh(F,,,,ȳ s…+e)VaZXDN*#jbV(bDY~V +&O\ DdYr!@SX55EYNjr+&M,Ț={vff&,,,"wwwZ SB*Y]){qS ڈF9 )qfϞa" " " ,EF)Ȫq"HP"E U +&Q];aEVxxxtt"+===??<DDDYH-5Td - :"tŠ.BȚ-rD\^TVwy{{{{aȂȂ" " PMBYj"AŠ)mVYFV] R RdfggcȂȂ"KxjaZXDVx3D੅ ]E!jE,$Ț>}zE,,, BdT*"'RYMį%rjac";aETY)&Ma" " " ,*F% :Eh Q/{B"#rDؖdo+ȊIHHUd%%%-[ <DDDYY!'QEhxS t(BBgEV@+rWdǧ*<==CBB0@dAdAdZX `Jd5<0s80Rd59Zh"+99y [dj",VȪC.JػF"ϕ46Š,)S*&Na" " " ꫯQ#,FSd"ˏh"kQЩ:F,]m:qEVm59ػu3f`ȂȂ@<._ܟCd!ED!⊬/BYuuY""S DY\V%JLLLOOUd,^<DDDB,Bd!)FVSc{aEVTTT||"'<<<DDDY‹,V SU"Eb)]YiRZh"kܹ [dT*"':MWd9 #j'ȚVƂGdw QEY0@dAdAdBPCEVgȲNX,V,;#Ʒ"{[DdYȚ3g΂ 0@dAdAdea%zj\#K%F+9+.\( 0DDȪ]Е(X\&)"{w$%ȚZ°HQE5_" " @dU"]VAd8(tDV3PAED7qS DMDY-IcBYV0D"CY4f V# ZF\ػhY'O1c"+44<DDDYH-5TdՇ(\"B6Ydyo&Ud`ȂȂ" " t/QCFF,{H# +,X-Ț6mZbb"y,,, YZ" U*M"-iI*QE Q"˅lōȚ6mZXX"+(((>><DDDYb,777JSd"n4QEpXqEQȩmŭ(~,' [JHHIDD"ER Xd+F:Pb]čr JYd$N>=<<\Tb,,, R MZ؀ȟh5lEY*]w"+5R +233/^,JIIYr%y,,,믿nJM! jK*Ȫtr"kT g-%rD+9+/^l2QEV```TTy,,,}/DZ)J5(^\Շ(*]#仨"ىZ8iҤ`QEVhhhzz:y,,,YH-4h`Rd ͞BkYND"$EDYQjEVTTԢE0@dAdAdBjB,g D=Y)]ITd|B_WU +"""EYcǎ.<DDDYY"tAW`S #Y-H)xDVc{aEVZZZff"kܹ_}y,,, YZ*E8tZ>>55UTrJ YYY@d-j5LU"wBM+ %P#˪S [,|ZR SdyzzbȂȂ"Klh`UDcƌd YYY@dAd*MCju:D"Gdl+1EV-kd9Q=;aEVDDDtt"+666;;<DDD{n7r2,V S'%"ZE5fY^.d#nDVZZZff";,, <DDDq/ ,777JSUD`(# +eYBȪAjU| YYYR ZjY u!gYĭ xww€ QEָqfϞa" " " ,,Yՠ Cj#EYܨYV)fϞ]͉,,DD(Ad Փ(D\e:ȲF&jBd'u%[aEVLLLBB"+"""##<DDDYb,wwwZ SBVj%J"nDzY^\*3gy,,, Y" "JE ]ԙ"˯I-FH-Va" " " ,*z+:VJdfZ<"ˎh"k+UŠ,)S*BCC1@dAdAdj%JCDuf{O8PKXdU[Mu4ȲJ5w%K`ȂȂ"KxjaZU")tŠv{wIHػY颊त$ YYY@d-T*LDVY+4D>DY 8"+FdվFVTTT||"kqqq R ܚ5kqd"k8Q,DDVލS S2Ee+..sŪՊ4O"0##_~Id%&&.]SĜ8qZ DD"6m qd"k\ H-ըJ$'J"nD#QȚC-JY ?H")~1 hȂȂȂYYY֝Z(K!ȪEIKX5MY '['%JIIYbD" " " ,EZȂȪq"Gp'pjahaE֔6ZhK'Wd"+==}…h,DDDYb,Fe"˷AjDDN-\F" n"EFF*BBB YYY޽{R[,ZC.I'ȪKWdtWd9N\S).Ȋʂ@dAdAd A=ѿo&eVD*CdEEEUjڴiݺu+C4iҤK.?lN7o^'ڡC8rF*%0ȻRDVBB«W,NsΪU XEf͚[nYg7o1}:x:hB bcc߽{gqpƍח`ƺFֲeQ'erreDpDH;DVrJKYu4Y-zL-g>}aV%jDD"˻%ōȚ6mZXX"+**jѢEYY@dAdAdBZXd %j'\(EVVd{Od͛7" " ,,, AdMZd5<"+""k+ +On(. (D0YY@dAdAde"KV! jȒiR Udt7PE4\dКj+233/^,JMM]r%DDYYYT6o߾-i֬ժUcǎ{Ϸ/h,c<<<4 DU,ՃB+Y F"."K%ߊŠŋ/[LT DDD4ZQN/^@dY\d!YY \uVdn!aS g5Ε46ŠI&*sss! ȂȂ2سg,,,,ZjYV+lEȪFwkYAAA YY@dAdAd`qTj5DeES" " ޫTdYd%w7"ˁ(Zb*aEVDDDtt"kԩYY@dAdAd`qF]M9;;:4**JlٲE%%%I?4hPtCdYJdIWDU^DH-NŠΤVZYdy&Š,i)ȊɁȂ" " " nQ ڳgOlؽO>YYH-b5(]\Ջ(L\L4"˿u5'!EYb;DYYYXATd|hCdAd!PBšN0U[P#EC5j;ka@@@PP"+55uժUYY@dAdAd`YU W" YYYH-f"x$E#Q"k|+ "*Edd$DDYYYX]vIwZ^^^(ٳg6i@xGVЊivE/Ot0odLV%"0WO5M ӴiӺu/ɊQF7~jhذt4ZjIK,rz5iDy,=Gd'Q;ZQEpϤK? ORSSWXPqTTTvך^g-ӦMKHHPwI;b ew']Y/|!DS7BH'N}u-ղ-"}\HYf⨑Ez̀/}[!Ǐ|ĵlr+,SL) {Ć !C\&L(9;VVy8p`-~Xi84j(Yjd}rx~ ,,{IwEM(JzEv߻wСCg!F3sHvKt;*t˖-3^R9I&IL O "G 3~_\R:gpjjE Oײȑ^jC"ƍ3n`Y:[BBH--{7]^^[Xojl~~ K-,}X #N H%l`r|I-,Yja ~ӧ䏠rcǎQ9<}DDֈti4 P@dCd*D,_kw+W(H" T-" T! 77uֽ|4;zjÆ . j" T-" T-T;;N:;622rܹ111QQQ~~~ݺuVd3b @r!@CaÆhC V" T-" T۶m+Zv-ZjUU|˽ě7ouVzFD[=Dn?6u!ChѱK.&L4hЅ DPU˽@فU˽@فU˽@فU˽@فU˽S7nشiÇ˴7o9k׮ X]}wUVݽ{><''ɓ'hjիWn͚5+>|idׯ_}ٳݻw_rӧhk׮mٲe㏏=B3V /^z;1 @X,Pŷ{,DGEcEwtttT֦/֭aÇ+777CSGqm"bvǨ(JhrШQ#.w&}׹sGm&Ȫ2 }JI~V:Rh4%ݤIhֶgϞ}Im߾[zJz }`J}g<ԋ/w D[=DBpBe 7f̘~>\l=mdz)jժU˜_ՀF$V^4o?%~g߾}kXbVPB4?h|߾}}wĉ޽[)j>ȪF$Y_pdGConnGnܸq혘vB#W>r;vwkLvTxeg6-\yH_UJ#?~x M6D[=De]tmݍGzƥ73++cǎ5l/+y͖)NLL4^^ZoooϟyamZZڹlu}5[?TD4DV]7;Lڵk?6K:B#Wj߽~AСCƫ.֫W1CvGT2U{(J(Q\%___g֭[]V(aW0Ν;Ə2^u;|Rof^~/PW\ȪJn*5ͮ5.b U;wɓxU6R_f?~7o6^_눌h=IPA-Z$5۷ͮ5Έ߽{wɇ2 N222 J{mVzwx #'ItoKeo;uTӦMƫlbXdv~RV!Lرcqk#> "Yzu :T\$ή#rPnrssuVZE/+ƫΝ;yvl.\ثW>QK~!{Hom776/ #}UeRŬ\2 rQA{V%+b!8Ǥf"IL|Lppp0t۷oјUĉ Nidž *;#F(]`oo_f x!" * YoYX~иTxq5+2rH4fUj7YewE(պ=L (ArD $HAAr CDD&0əapiս>|g׶O{fjzྯ₪w^kUwZ/?d5qss3 FS!ř3g-[re&8C]vx))ϤW!wLjFɮF<,Y1}法 LX-Pn])>1MCb )EZik5}ן% E)_mWAkRSSibYf#Y`d*`dC΂K/?4i%pqͲ +V1aԨQbWREiG^KV+%Ŧ!-nzWCCCr{zꑑbSNbתUȞw"AAAwS֭[]РA7xC>}t# dW# Lr,gbya-C1#G;vIIIRH[lڴiG-ի'i۶xz4&@ Y``dV3ܹZٳg#B 4{a'OJpB͂]tbܹCK:ID0i6ݦM4{J J 8'CXAᖤN:%9sQ1B*uVYhI"r0!gx>֭[_OJ&t'¤nnn".B}y622R<j///n=';kܻww${0U# 9@tvHYp/[:u* [H˯ԴiӤnzlLLtڔ(Rbuf ܸqCg]aBBxZ syΚ5KC3 ǎ``d*`dC΂#9ZVҥKK?MSM`ƍ4lQ#UY,ũ<8۬Y3f5b>pk>WSرC,y&4("iԨl~~ν#w懭|HZp6m޼lvv۶m"8}4r?yā,,],0yY0islb-/ݻa^^^4lQo|ܹҩ$q@BBf3fHe}||_v. jժ%EI=䗫PͅPHDVZ%+ fffqx,6lNɗ7*]C_G~mҥ ~غEAv4n񩩩J ^ЦM.>}z T\9c%/ F<,Y}up0P,##FiL.88}vǏw%Ӝ}^{@@ Y``d`dC΂9 FF?,Y`?Y``d`dC΂9 FF?,Y`?Y``d`dC΂9 FF?,Y`?Y``d`dC΂9 FF?,Y`?Y``d`dC΂9 FF?,Y`?Y``dW\ٱcǦMzI^kӦ͞={4JKKK*U\9ٿ#GhhѢŨ?iٲea9{7oҶ Y``dآTR.̝;*+V/ vbիoذ!""B,XlY7|#M8ۮ];ywyFvrM&vMa/nݒB3::Z/u0!gMáb%0 ^~eo>*,g&%%]쩇e7;v… K.uӇFU# 0!!!ʕӴ||| R  Ξ=ťJܹ;o߾0qDy֭+,^XTC=99k~tK],0yY0 %QtYɓig͛7^ә9}K_r~+QFF w-urʿ;&9 FX*X֦p׳kVR.uƌwΝ;?CḚa0'OݻnrB5wss Y``dhNkv7xÚ\+sQlvvegyE'|x{{KH8|'$$ѫ̝;W|7|6*`dC΂`'/5)))ǏuzjnܸQRv| Rwkpp:tH*ޢE Y,gKꚉ' #8EP{̙<&9 FlҚԹsg{k2eXZj sssipqqq< >ݲecUWFSY%b *U(RcΘ1H_+))Iz{:F<,Yv"Y3g,b@FϝRW\Skk(_FӲ|r_N>M /իZ4>&9 FHFb,߿_o`dDO̙/5<<\ݡ{-zbFsɓ2\0311&9 FHFVrr1c 2F*7X *ˋsPP(^D-[o7o8Q6(PƑr+1lx8===''ƍGڭ[šVBGHpB*\xO>~ԩ/d͉jR\@֭g)~*t|7o^jp劲'O.NQLn4XJ===u .jM֬YsMaǎB%B#،t +a1^#kԨQRѣU\Y kڴ(|MDFF7 FPҍ,ի;)GbcdF8`m *M4Q=wfggkOYR-ԏ?tYbE͘J*)fʥOݛ]JȒ@8p8;~ԱF˗|P^|Rm/KT#t<8))I:rJEUc"[n-p`|:>WWz4H>Oh7n|֓ ="\s\\ ɩs*;F<8**J3fŊRz6kY]lYt!Ha=ra=z1OҰ69G2ԧSG4JN8a5gyզiʼ,͉CE7&F|SN)b&G^PLLs֬Y©(2kJMV ] W.G"IauӮ]u}5ni2_W+V(4]ؽ{"2++K~]???)aeȊY@uSzƍFF.xƌ,?G9P~}#K̞-/c}*R5{l fNоo>,yg})ړ'ORm *j#k隑 6y^^^6c4_L2+ʕ+ϟ?_~P><:E6mh'Yk:ZE6HzKuLDDe HW3VZFҹ |6Vf,GȡC7xϞ=գNgd#F ,,(AFիWEhh3bVq#K]sϯN:c-ZP,~=<].#UVN. aDY:[{9H-0RD]_"ՕfUo:9,YbRO>msq#KSȲ9ott\tvi_M^ Y%.43SI{ɩYT$}cod۶m"UTq\ Emdׯ_bŊ֖^~p,Sfff5m4)q|W4fv,g|vСAծGo#w]|*%/#'Mds9È2fd)Y˳@LE^X)ߝȺw^Aŋݻw7F֒%Kl֯0!u.OpnO`sΩւYqqq/U#f|R{ # # 0ZzAɓ'R@ƍ'ж:vyC;϶d*"u | `dFddYdڽ{7|ïյkWvYjgL)S˦i&Ζ"CBBfΜss:p67۷f >\^aNL^FVNN<`Ɏ5Y*UR޽{}||4i"5'#/۝Y_~2,X tZU;vWjAׯs%YYPBDy;:Y7nEFF%9J  իז1#KRRs3}೧"""_:/׵9lȲhr^xiu“,e$FF1ϕ% VՊ+Riiҭ[ݻw(rd _YP(WDsUk1“wٲe?Z3)Y 6ݻ[.iذN2sj Y\sFӌ,___EѣmV>j(y ˔)cΤB44s?P,XF WWRJgϞIIIZI۶m3b~*#W YD:~I6m?0t,Iyv=G'<?^9zhEؘ1c 2+W%#kƌ֮J>qB1ZFʕ+Ssp?lbZ7hsF{Ql(ѻwo5\pA*%\:`k֬iǏed fTH3̙#E*:..[ɓgϞĴL#ZhǏw=:z|V/[}E"&iV`ǎ3O.Z—6蟫Ä)yVZ9fZ TTi~~~[8qtv֬Yė FPR:9{lُuC)H;ޓr=9m۶QF|P}N= H:ծ];wԭ[7)Hvn#ԫWO6mt>}(5SC 1bD693gδ@)77wʕ7pTbЎʑ%"4o->NjiJ.m|MZjj _uj.q]Y4QCU]t-JE~WF֓~glٲeϞ=G,X@& _~YB3imErx}BM!|`duP2d)Nu,[nM2Wf._lW1*00CYT+EEE-\믿xN7ot[n : %Bx) ://OzJgש]v!> ڶm;h M2({?:͛HOOOyfzu2m1)5'OV:u~S6svD$%&a 0Y;%>Og+MM9|p_;VidkNxPNZZcޑzŢ5Zh=;l0000J4υSf͚_!_SvIHiygFH*Uԩ#M&Ѽ&M4W .]/<2nZmtqeQHsmÇk)j[UL;zyO?5f֯_% r?CgW:CS;<^yͅǫϖ.]Z8bŊǎ32\]]E_WKwA.;0*5j8qB 6m|ڵkyj؇?_YYY%775ӧƒեK4kJ4*qžiWD$2e,[L:۩S'1AP!/iWzM6uU31cSX͝;Wos9؆ >|w6T̙kwww1Sr/ hΝ MɓI&)f兆_^(hs0 F}RSSřBBNJJҬs΅UD#/_^<wy@ǎB7{*U=j3FBp SzdժU}Z*+GFXUgee9|%BB_e?y/##Ǐ jZ$77Wu#}ҤIrc$)))**~~~7oxMƏ/7իg|ֆve ߉ pN///?8*U-*`dC΂u RzBpOڱc\"ϭ&9 F8׮]{^pA oMѣG"۷i}W# Lr,p X{B-[:1b.)Cڵk>Y``d@q#_eOL֭[=6nXNuvtp+[Z&9 F7u֕YK,1XbJ*9۔|7tg#''U젱c ],0yY09˿SRӧO[ͽsNӦM`N.\(^sÆ wɓ'3+`dC΂ōwܹ鋶t={ewVg z,,,,B!Bod%%ƥ.Q 97n޺fgg7:3.Mkۗ?{vƠAf޻wZ٣F}K[># # 0B!B9VIҌf歍1{MXX؊ϟ?,Y~tKߟ?{C0 _>}zL-{ĈX;>Y!B!HK ali`Zj>=jIIIim`zj';ve ))?ޒz3bȺ0zՎo_̙ÆŌ`Ĉǃg (Yq{yz>%s/кisO?w7@~أv *:100B!B9w¼xp1+WMrPȊ7|x{'wdР_ͻкI5~nnnSLl4r[;^nYYY!B! vYsss=~ܹ&])l}|DDsw/ٰa~_~۷oz,Y.] ]lY-_BY^ع3wҤ 1IR >A#F|sN>}b:vLx~={krb"J.R%Q\;} 4kǣ"BF ǣ#C΋{tUdKOM 7_ߑy{`JҌB!B!Fօ7'/ܒ5{~a?C_/ͷ^C_pX65%aɒ%A|x06&|ѢElٲ~+bLڵ+oߌ32$l3> ;6xԨ6n\X;>h~۶͙U5|fiT|>a5j|e˖]3LJ \j8wOzu6/U\bح͚5Y}W+5rx:[|L2%*B!B O\r㕻222-OVNKK[nǏWnٗac_}}=&#‚-Zc+Vfٽk˗/ }nܹ3wѿA&䤦~S^Sk„=;uJ!]wm,2eUh|%_&M߫gUNgNtww{_xccUs>)VuW^'#F KssɴGIqbf͚&G ߷wW kXB!B!F֔|}o[Ç~8kk/ٸ[?;;{>I hѢ~M\H(i5=wmٲeҥeus9bd}EZϞO>}M ?~˖/zH9c}7MN0|_vssx5owwwY`\%N|9.κw_x;gN~_|҅3waoG(j2c#;*B!B ,GKMM|w\\O?x`msW}l#1ܱHvvS5D,ZH8]Tmzjŋ"OKuF#kǎzHKPl߾AÆ姤_~_ss'O?aB\-ZDzDf3gIWZu'E+WnŒy:){.Ϟ|3OvQ N oPa})nVx,,,B!Bι0$;f<>;c{O_Ç~3##cݿoz["հ~zooLז,Yc=ҥKCrھ=KnҺwސ!xq)-7VϞwz뮋m[..?I*) *U3q8QݺviҤd.Iޤu̥)u,k`dadad!B!*YFYUMlu_߼?yY<9vA@_FZT<ҥKCCΝ?K,es*#^^;~B.O(LI133|ƌО=o.1u~ͶmobݭZ>YPäґ`777KDZjt2eʄ?.KkӳORB?Sf}GOXn>{%'>Mu~К1e,,,B!B%iХ[4:ܹs?_6˃,39BްaêU+?|/^8?khdI^VHyYY^M/SBP>i_}oԨڵ\\B\\jՊ>=/0vϞ?]\kyս[!)jԩGGf1k|n:ʕݼi4qvO| 5kt*]ׯWO8Չ:ƔJ000B!B8#ӝ\xkסs[~׿_Ndd '1|=Y_ǍKW/%j{zmJt]\\/]:lNu vEC߰R}?eBb|T.q BVcY!B!-ٸzS=| (QSPGٙYO2R5zY 杨Q/#G>[7%Eb߼XzmX:%zadadad!B!r6#+#-9%9>5%!>.ar_?><^bBgRB\tdp\8+rSk.%ze}6xj?Tb\?]Kժ1aadadad!B!r*#+#-9)!.%9>&*41!6^`|\bo\ DžB)ħ&ɯP^֢ǫVڵC<<=ar|dxp{wn܈. g!Rb,Zc$9>aܑʕziȟ'Oq„Ǎa̘?0SUޥgHN{FFFB!B!2yYb.I5a)SSla9ld%%WwMWJsq.Yؤ>ټicxq?,,B!B!dx/aA>Ϟ>rז+/YkV}cc/]<p32<8%9,B!BYbd!,,,B!BYYYYB!BY# # # # !B!S=G nȸ,ڧ# 0B!B)CcИϡǑB!B!`d1!IB!B!FJ܊WB!Bbmi]B!B!\Y!B!B# !B!B!,B!B!t>SV!B!BigJjsDZB!B!UzhN7B!B!BiT endstream endobj 1306 0 obj << /Type /XObject /Subtype /Image /Width 1603 /Height 822 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 2593 /Filter /FlateDecode >> stream x1 7 6DBrV;+_ endstream endobj 1292 0 obj << /Type /XObject /Subtype /Image /Width 1603 /Height 822 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 1307 0 R /Length 101180 /Filter /FlateDecode >> stream xXTwڰTbbb{(*"` `CĊEQ)" X~y}f7l64+p3,½33 0 0 0 0L'm wҝ[=~,aaaa)yͭN_3M{o8|>*1aaaaaD>?7x֬M{n;0 0 0 0 0Es6=*aaaa(90 0 0 0 0Eyv0g-fۦyX-+e֘aaaaa)d|c&:v|˹'O>dq70ǎ\d8ݻbaaaaF Y6Ǩafz;Y'j{&&8_޲jV1Wz>pIؐ޳\f2 0 0En,S4 0 0L#y#U)į|y/Ĝ9;]ѣK+I \"]8;ofXnZ7:G} 0 017SL!g0wB3r W3c8oiⲘK7]>7h2 0 yo)k|vhZSdžR :\13Whw竝7gňȌx xc_ENs.LyȚ͗}x4It!cė0 0 h~ҵ;u/-)rHh (fB댘cοx?O1R,TYaa&Gm?\.o??lq{.bP'o p2sb' -3;P6kkwLpNVnvg~'iL3qzۆM3ujў0`C:Mu[*%A>FJ7:s؏C<އ#aas'ϖ~ė?z\ qMm%V?y!bX(+hpP)d \M146pC pi@+{&8{?޾{rʟ;tqkۦb6ik彍kR/Bq 0 09Ѳ;I݇p^HvR7yk&oFYfQCjwNLz/prgWdJs`f|WcNѾO]8' qgݾ?rqA|)datԎFEK߾iR!nKnIϨ>}xJz 8,]{ Ԁ13zp/_ef=<8~wDRڭbBBÆM^=i>Z(֑.??n)뷥ދ OFy({_{bMaar9}V0e[% GM_mj*#-Զըzm|f7yo!k1æ3olLv\&;qNLN33j[;nVL~[V޾-LLzWq+_(&[..6+iݦ+F)>Zi(q6;/c; mu")ׁY0 0L.~WړRPRT,_dm[u:V#B9møR’rR,TYm̼.~kMN\ۈ1S:fK|.CƊSgqݣn} Gzߙ~KZ!w+.+g=GV/Y=I7z΃.;y'LrCxcػ/H`a&Ӫk=.#./BqZ!vtwcŗb;),{ES+͇xu[ib_gl{a!=)K?\uTiWā'%.]nw~gxumi&-4z?I,w{bg!x4\{5Ol8Vt?).\w!k<aavp~v\YWetl{ܼC?{{}1/U=?\Bilr\F&{'Q&;m+%W$˧UVߕ=&N!F\_WfasCVӻ 6n^c~<ïz ?z5۬Ix|S.t9⪗WNg;l'. Nz؇>drI&wϘٝJKz%|; r0Ƴ@Sշba:U_g1B+pqvqb]v=CZc̮C?,WݜO\mh}t-dLZ݆0 0LO /s宎I)W~?^Β>w}:/~Z;w<x}'das9MU^g*#Ad;cV!dj,Ee=+aa"8ϝ0cGOE.^eaa3RrZ ]Lv㙳$L^&{^̉Waa";==xBaaH!kش@.CוkQt9s+$iרC= 0 0 0 0 hM[!3Vaaaaa":#fV0 0 0 0 0Li+53yvȄaaaa%fn8t- 0 0 0 0 S3iq脅GZ-+EȲwgaaaa9!G\LGG&`<'@匠;d?_x#e }wl$d!d1,P,B(Y !  ,BC!!db!---11W^?Ś^^^ y,/^3FӧOU6lӦ!@~(Đt‰L~jΝ;.[HG?{!@JHHh׮Loƛ7ouرc :dmӺ~zÆ۷Or:o$Us|uoۨQIT! ;u,ܸq3 Y#.޵]ȷ%tzȺpvO%'W ;zPZ/&rƵỶ+V?de,Yn%5oִvZf/׺u*+:q4Ov޼yYfҤI֝;w4#dm޼g 5oQ!bڵjvq2a?Z{EҙҗO&UZlم ZBV[ƑK)FG\LNRɣ{G&MH|_Z͛/}K+&.+#k׮u g%qέkn^Q^ʥ |zWڑCLj[TpjQa=7 gc:qTq7t߄x"w=|@YbAcvuj Y<ypCVeWVb ӽ劐G}Q˄TBV}ff'4Y`gg˵7;ݢ~U/9^f͛*Ujiժيk4/=~XsV$H+L.ydYBgUꙙYЪ ϜpjYt P+L̩GMLL^N֩]VuZ:u-'{_6mU]lQC֖-[LRG m߬cCV_Jo ݼlٲO2իWwDwiN_ճb50' 4QÆK/O۷-&wı*˕+p\ҥ-Qdn]HjѢT)B+U"m֫[G&+吥0>L(.?~xbŊ{߿TJ.-S̽; YB=Ch"G{Xr?<fذa9}6O"BQؽg Q_6y~*^8wz挩gN%qM6׿ͷo 1±n:b3Iuh|gUSKq-UZ.25圸7-V,}󪕕5z [f*7Jylmm|g 4I a*UB7-O5~KK˃]϶sd=xK<z޹sGiD K.U/33پ3ΜYb_=d%$$t?~~~*;-aaa. >oE9d$5jp={tkެNNG9|YFGH˷mdll|1BVݭ|||%!K1{LLL֭]rGiwΞ#VP]}T)G7/ou5SSS($U^@q92byx ?ytO_iܹEKwuUCVk1}E  R$8sssq?V]c{wvҩti56mXK -RYƆUJ.M(!KLխXBy+FUZ5k6mD\Rr:Ņپ3 hׯ~'gI%f|k Y>|4ʥ ӧ)cmm2zyӦzh5ĚKBV~ ymTժnڰv.ΊsK x:/?YΝ666VR~EӥK9~Zh>ol>ytom YSN!ڵkƍx Y#=cIc#'`gIcȺulߙ׮\=wj Y26iBƓnRJ(St NJˎ4M֬^%ʕ+OXssR%W,l߮m~ioI+*rSCxJ'wR/Cm+V477WŔ gϞ9.]޿/Z<(Ŀ!3(vӛ:( EsW i Ywn]kݪu?GmN]X'l/+TФ ޥԩCJ_Hvn(Oe֯ ZUʕ˔)3m4ŵ 6Pݻ֩ceeٸYb'WnZ5Ǐ2;0h`Œ 4/.݋(d~>?/^PyY,C4N:s"ٌ'Ԕ^Nsem,agN΂6d@7h0,@all_vb iX|RR%BN޽FpLp X[[k Y˗7`o߾69r_zUǵ ={ŋzo޼IOOONNۗ,7!ĉڮzeFFFQ>8{W^%%%>{|Y%yY"bʕ:ޒmlllW\yU6INN5jwٳgkܸqs ,]Yf}+VȓٳgNNNeʔ<lwZpj5Ǐױwމ֭Sjڵ*Iv!CIo+ A>yd}svvV6==vFFF*ϒi\\=yf 6T߶VZ|Y,Bz*3 ӭgffn޼DG/_ܮ]lɓ' wZYYsczzzrt|`Vbnn.^Үڵk|Y,(wR|||ʕudsk:w|mo۷Æ Q*]tfffNիkJ,~ģC~!CtVZء6mӐ5sLjժKڞ .ж"d?^'G݆W\DuY,Bzn{jԨyƎbcii}طozp“'O߿/c=L:ܹsNcqqq޽S^M#U?)xC?ѸI߾}ޑuq}^)S^ml]>9W?d-[,W_ Ys1SZ5ŭ899h[###uEZ8!K. _HDTTa><}Tyf͚i\իW?Cgbb|ʧݫme8e!]J:+v{eeժU Yk׮'d$8Ju1,,lɒ%...6<{.](:رcW޳YfPCYE"dq VZEGGϚ5KgΝ{i;wd[Z<IԩK/iźr劎=aÆU255SNPPД)S4v3oU\ްaCDDj-s$xzz装T6?7i;\ٲeKj_)Ė/_G @a,>Z7=¼yrss6w\m>[W^*ƛK.-[tߊbfmmW!Kx'۷o+iF%sO7o6 d |2e^|mCmT\YǍj*##B!@ai֬YZVǎ ׯtmwܩm;vhd̙ʫ޽;{7accm˗]"Q.7!K+תUK]sdXxuv2ehVO[I dY}Vg\˵۰g>\!B pΝG >mZ_O5E B!@4hPZm^\V*k^rEyoSNo[}ƍciѢE>,g|>nȊW߰\rh.&+Y;628,@q/iStׯ_dZf=-͛+Mjvک~ 6X=zs:v쨾ym!{^xAcȒ|$! P\DFFׯXȒwv|g].]g{ڵ3Q2dܹYYYY,!,^B9,@O9rD}IȪTR;qtt,U#?Ba':+^!KE@BlrBغtݻw0OBֶm۲#G̏3MyU2C֭[(ඐW!k=Ƌ63du$BT69! P 2DӨQlw'!+))IN{b"7m\k{9 Y111bɮ]^*]vppt`?jϟ)S&gR'!K[^ֱ‹/ qrr"d(!+cc㥋J_gokkӪ766_~ı 4zj_}X=g|ulTV!"'&1Q{תYY&*TX1m%uڥR/Zj٠A6[(dۋ/,XXҲeːr```jj*I^lrB3ҩS'!Kאu=rݼ}*6mJ"dP0m!CÐAN9t0e ]ppߧS%uu"d5hP̩DqyE2eʈR.,$B_&m*ںbҙwO&4do߾lٲ}D9d8ɫMN|^n5d)Bbb'ŇE`B,ſhffʟ+LMI_Θ=c|Ě%JO8"6.Z\ݼ~Ҕ+[vǷ <}_LȲ_pa^%!m۶T`EcSR Yƺw~s> 6T/_kG"dJr[;z{.5Tc ԟ0~S{W!k|}ח.]ZRˍĭ(Ϸ6u֭ n۶Ejl/[d@ȺyAq(2_÷lْ?ĵ6wd^VZydN>]V#d%-9N+c#+Y7hѣ{Ӵi[~ݻ&9.}\qƵϊub#lۺX< d&'d 7񸸸\*<<\[z$d{N}UVU^/T_ѣyȳg6336m͛75>gϞ|۷oϧB"du[ȧu).rQTڵjU>rc!ە.]F 9~ĵbC;tf '?m&KK*+שS[\nр%4(2FWoOzUa#+))I}>T^S}ѣGNbcc%_X i7oB"du[ȫ{=q1lN7\lQ*=},:jK.&'z!+++ҒO(2BCCX"{;M$d)? I TYx2MY(TytRӧO m6mYb &dhVx{M^rtoSsC~!K`Ezc< YVVV0H˵2ccDժUm322/*/^sE!dmܸamGpֵWC `EFzz㶶ٳбUCdi\SsʪWG:l0m7-uA8qUӦMsTTT>PC~,RQF, k E0d YE`Eʯ+W4l?۷7>d͞=[tm/ԩE}֭[kwzDidggӧI { YY(MN%N#hԬY3d5zh}nnݺ*>uW&cc˗GFFfddܸqٳgiiiw={ʲcaa1nܸCuV"~f*U*/\pM6M=Yu?9oQXfnB8NN dY6mhogҟQi&CгgO>\eK.e{\z[y~ OxǏ 2:Ne@ޑ 4ŋޮZk׮*ԶUFVXpa28F9rӋi`; U!K20,@2o<cǎnҶ;w4hqC}%mIcZh |SNMbDy O:mçOp)KOκdƌ7WlY+85n;v,IY~EA||>١QF3gܿtt={\]]uoɓ'z޺{MoݺUYWZGd#}qnyLLL?ᒽ>3gbÇ^H'ڵkmq3fHHHP/_vM&ժUr劎;tl;w\=zo&>!d[n)zʕ3D+&ېyf=o[nz~Rs obС9>}eN_Ͳeˊ'>vo#_[N7|p+++﹍➧hz$rrB,}1±vZސ|O^ 6ܺv啯\(Χq9`̃{7+\v0zRUBVʅ1Q{N84=MZ&r-[v]yG鲸A?寿:t&M % d\.CV[fffAV(/{|JH[ YQJ9d]x^4=;O)'ˏޭXbĞ0*[l2euY7nlbee~{ YCteȊ?nSYnkk;k0dȠN Ti|Jlx4c5wsd=xk|z޹sGiD |{m{yFmڴ/uRRRҞըQC:-|<,@ˮ]}-g&!+ ־ؽ 711Y(.GF첲|nx ?ytO_Ɲ;wTh)dYJcѣW_5>{ WI/;mnn~ZjЪkR|0G!{VVV>>>QQQFGzY>^ܱH^z׷$rrBJ7ȵkxyĬ_bcS|y*+)SfTϧikϝ=)6lɕ=w+׭Sʲq/ĸOgaaQ^Zj7F9de7o\׾~|i! !Ba!+>>QQQQY< ds Y((*Thݺݻw]3333((h֬Y^^^<{P_~moooeeO?i[G"d  "ds Y((K,Nnnn>j($''+WN1y d)/kJ9d beBV#dөS'I( Uo'y{ Y(@BVttJ222RyO#GLMMk{ɓ =, m[.UU-ZжyI\x Q Y(CNNBwAN&N(Vkٲ%'"B P4v]?JSN^ڵk,ʱJٴiS*oG c-nrH&Zl)~)SիMJWUTIZbkkmXddx cK ST_Bz[,MjrzᵫS;dݹsGf+OXm5 )r/_^"meA@"dXVVܹsSW\7=e=bʓ6|o6lҲw)/tÃE"d}!KƐqLV>j >_Y,! ,x7~8iT"d)I&٪TR*!KG!E*!KZڡE$d񝜐,B! ("J.-zb*V|B0!I&W9KKKB!E"d\I!R:} d,B! ( 8d}׊ߪH罗ND"dY!+QdY, dY,>d 4PbeggLMM Y,B!+d)p1p!! dĹsvuQOq YBUNBB!E"dk~Y|''d!E>}(bŊ%d '~'dY,BVCִOKk~ǎ+]h"BY@"dB}v&?.!KPK\ dY,BÇo}VVVBLup\Ë27EY, j׮ܯ???>?R!I&ollL"dY%dy{{k_Du~ PͭH|,BY dٸqcFz왛LR–/_^ڦMJK,,,Y,B!Yy"Gl Y, dY@ї!+!!AM-KY뛘JY,BV{ Y,! , Yo߮^z%666!I&UreUD"dY,B! Y,PeeekȐ!666&&& ϫ'$$(sd!E"dY, d@Ba\r]q2{@րB!E"d,B! hWKQ_-$dY,B!EB! ,GGGZjjXF@"dY, ! Y,B! j׮XTejj:f̘Ç'''GEE>}ӳ^zvI!E"d3, dY,ϒ_UjUEr劶=|J*],Y,B!8CB!EB>)]8ؚ4iq <3@"dY, ! Y,B! $!!AjP6mئ֭~O>%dE"dYBY,׏9rD}ܹsرc ,Y,B!8CB!œ|xbEZdJZt>;177+zB!E"dgY@"dxrKjԨ!:T|ٰal7߼y3!E"dY, dY,ׯ~Aϟv̘1jBY,B!8CB!EBLm۶yFZ۷qqq[V^ҥK,Y,B!8CB!EB8~PM@"dY,BY, G޼y|,=m6K!E"dY/;,|9Y|GY, d@!=BՃE"d( dY@"dq@*դIBVQYZV7!L6ò۷oY,B!,BY֭[jUBVQY2F5_SȊLJVV!E"dY@"dP!K\Բ5#kLVE"dY, d@Y(%k飅 Y,BVHB!,B! ,B Yb>,B!B"dE#dU!ʊUBVқzY,B! degggmmM*N!KVY,B!TBY@ Y|Ǐ5Sy:!E"dYBY!U5kuMB!E"dE! BVJYE7|a>YØB!E"dE! BVժU˖-K*ʕ+'S~PE"dY, d@>G s~7ZH"dY,B! Y,BY,B!BY,!RJ,B!E"dY@"ddbȪZjٲe Y,B!E"dE! m׮]62>ZB!E"d,B! (8GY,BV Y,B! Y,9BY,䤁4b Y,BVa,ޑE"d!!G!0B!Xz2Y4!E"dYBY@I Yvvvք,B!@!E"d\!EY9Y|E=ccRZeL)F`JJLÇ Y,B! @"dB!x2Y!~LOBLH-,,jll,-&dY,!EYu֭T!Xj#HZ+/Wٲe{dffv;~:fߎM6mڤs777i !E"dY,BPCV*U/bha:==]˕+dIcGWGƍKJ پ}{FdQ܇,IEٸ8B!s}5uCEĽUujV{Ϻ{Z֪[{}W+~y>89IN <{YYZdU#Gb7k숒…Ec -n_ٳ2Ӄnv5z,%dYCת_3gY,@+dYYCp%@>V[,>* o%h˗9b3׻Ҿy_5O<\1:]Fׂ+W4l؄L@v@ B,@^r,d@h9 )Zh$qeSM4)ivvveҪYB233MmN^\pZbRWp<ܰ7nY8" B!@ /9@ddt:Jb09ɊCciӦX2]tf ٹs{$󾒱e18pxȑ#Y,@B!@  tjdUd,Cc(^cǎ/!Ν{+dI.Xxѧ`:, ;-ׯMgdY!Y,@B, -|Y\@VbĒ6hkk+^fӦM5.!%M>])KV2N]oh6b:d!dYI( *Y.DY@[7eB֪F- 59DQ*emdBY,͛=ɳf!K, -غx HYS89dY!Y,@BRƇjZBdj A+,X`ݻΘ1C /YζA6boo/^fǎ,@ ! B|B? Ks ƛڶm>>>^"R.ȪQpAo#͛f7@ !Y,BYDYX}>}d&00 KFXO6mܹs ղ f/ef[  lw¹fֳ[g̘fSYY,dd!@ 0PzEQ(1;˥bhܹse*ST¯!jJUBBgˏAžnB!@ BR*:::))^zGd!IUq]hW"8Җ57-iw+ꠧT~ȪY7Q׀bsdZZ~}&G,dYDmڴ߮]3h4,&! C Y+! J'}@u ˸I+nܸd! d!@V5CVU(,@ ȪukW .>YIo2pB,@ YV, -dTDY,@ [ *d Y,dY,d-ZQķ ,@Y,@ *eE &hѢ%B!@ PҥKwޭ%j  IdYJȒO !Y,BtѬ<<<>} KB,@ B!B,Ǐ+JQvB,@ dBB,$f̘!URRT* Id YY,@+dYUe7o4& K׫j@@4dY,B,BX:u2@ܹsy, -d0dY!YfΜ}իWo۶ Y>Dq Ybj@ 8B!@ {Ǐ;ɓW^YYdUG4[J Y, !Y,@BjѢEd)[[;wp YZVP,{̑2dq=Bd!d̙CeK&[3B! ZdY,B,Bp*g~~~/^d, -dM ZdgY!d}]h?3 YPMF,@ !Y,@zwލwrr2"ׯ[n,]vԩ~>xŋe>|"+az…ߍ 6{ BNST,&!KI,dah! sB,@ Iۯ^5jZda6l(b/^/&,ٳ~wƏj$d,@D!Bd!V;|0U T]v횸̷^OԩSœ+W4BC! C , -d<0DE˓Y, !Y,@b7nX?Xd4/lAe!C ֜;wp֮] B,@Vד?0d!  Μ9Sn]BQQQ7nܨ[hɓ'ƒ6.4?됥hYLB' @9,~d! YK.Y4([[͛/\pժUn駟>|ٳW^~=w^FF͛7lЭ[7gggzi^oO i֬YY.h/^dZBd1 YZU,@![؃~Y,d 6et7nڏ<ׯfz/Y>#:܄ᬘv! C , -d khC@ 8B!@ ѣ 뛑Q_teݽ{›JJJ7rJ6l-o=~ YUK!+ѧZd\! B5}vajҤNliY ddmdY!d%bݻ{yy͠AX|Y$d9d1 Y=x`%-o#Y@BY,T/9~t5YZVP, -dby#3,dY66l0%ѹsg ޷Ǐk4q`cxxpEB@ fY,~eKժT*{B=],Tqr1@KՆhJ,@ !Y,YT~}ZcƌdU9di4@GdM:<@V Z,d,@ !Y,YvZ;;;k@֩SjA5k֬O>)))~)Oj  IbyhR4~u;_Mfc0G sB,@ I)+N6mĻvZn ㈳gZȪ80`OV5}}ԅg7% u Kʐě6d3,dYƍW%%ɄMcݿ_ b4DZ8w\ÏMRqjGqFB!02ݗD4[jIY@BY,^֭3|P]h27k֬㏷oߖ\\ndYB*!+==Y% bPޓ&ch! sB,@ I)SR322$rVXV0dXC YVĉ͚53 'MTl'~MUگpVJO @ BY,Yր,[n>ܸq!kӦMQ#|XmUSC 5!!!k|ll =r$6d-_deBCR,zC&}> 8B!@ ƍW~NuB˗/ #~ƍ|CBq'2ppL6*&; =bhܹsw>},!?U: *VFBdW^Uֆ,1Ç娨(e bbt:ET,@V׼ysgj̙ 5eq]VV՝gS=GY*܂XFFd, !Y,@ CUT@?ly).!Mdd?^/wȪζmۖjў0a۷Mbyf{{{M6=z(ېUC -:d Z^B@ B,@ Q۷o7(;;:{ȑ3JI& h4YbC o :`{>YA=}bYn]@PNNNz8!uHx@{bp Yn1_u d! YMWx#⌻6lG1tEM>}ժU@VTυVkg4 dUJ",///SdY!d!@VѣG,^)ȊPrqi?d)LǦX,̑%aruuY¿J,dgY!dY$ɿxb77 Ç!Kl/dYzȒ(d%if C+;;NLYv,@ !Y,@ .^(OLLú<Ȫ !KjmdYZ4d 5d5gf̘#rpp>}h YۖEGi9SAYxzBd!Iyf}u*p9sd\BVP4o‚NsvdA!,\j} //G+,Rի.devdBB,TTrr͛/+ z2L>b<,̑%I*N/1d!d!@BC U"@VUAʀBw8 ="Z dIhu#@ 8B!@ ?*?ڼyyU?dyym "BZPdYZ4d% \Cv@ B,@^r,n{% GDIYGBCG dU\8Y8" B!@ /9@i4@VIU#C ]]/Z؃, eY,@ BY,$6nȒd9;O<"#毀, ˍh %ESD@ 8B!@ X-''G(__߃R233WXѵkW@VBT4`؃, -db-S#Y@BY,v2Lعϟ?{ ȪBȒ'&[!ddxY=0dB!@ g}&}UdU!ddIXt*, ˏk2c: 롅~,@pB,@ ݞ={wQ-$''>}U%E&.jLѵY,A@ KBKY@BY,TK;<F +.#orpp\bb,YD`h! KZB!@ PU#>|8 +66ƐegY, =^{y8" %UJY,@BYx岳W\.dUdEGOdi4'GQQ}Y, =^ -dZЮV8" d! Bvl@V@VTToGVU(..#">d1Yf,XDq YjZBd!&̤*..b >"ˁ>Y-N#KGSkl9Q5E+8OBdYdU4JuqYөT*::@Ki$Z _^_Ekׯ/RSS9&޴%dY!d!@ r䤥O5Ce^V5Y,ASr,_'{oѢE_GӃrB@ B,@d]` `ɹvZ"%V3dK4Z?w9 %ȒNAZd !K^|u_;w,@B!@ Y;xThZӭ a YuY@֞hR:q Y w B!@ /9@ZX%lmxhpYl@{9o׉·`hd?Vsjn`%-OB@pB,@ vɩȲ[llJqbc@%ٓD-).$ԩS}-N>5E֯_:dah! 8B!@ Y*,& Kvbwlr YDX, G/3+ KC Y,d U&NSC&.j E\\GYl@h䴂c(ZXN'-]fj-1d! BRRR>}Sמ80.J@!k$lhdn =2 Y=r Y<&, +; B,@d"Zf @VG@aZ,ICVg@G,EU8!+n! C ,B!@ ԩ¼m۶P@uBVllL%*8 %iJFk"崑 YZ0p! 5d,@BYUk 믿Sa޵k(:!+&\?:NR|! KҐp4,8"KsFah! KjU_C0d! B'\~σEȪ桅=`8j`k, +/=AkJ!YMD2@ B,@d^x~~mYQQ-ω~d'+MրO&Z5d% B C Y,d T*Kԗ/_Y(?C㨨ހ, t?o(j mhLBb0B!@ jYvrww2ԪUSN"")׍!K ŏ,zCz-5M Y:@ÐIYLBV2d@_ +4wpuţo߾mX߲e˵kΞ=Y\RY!d!@V7Go@!a[7ш>!˞hאz@ ˺{M47^z 'o޼),hcǎr O `YM4*YAV:J+0eŽveYJ`cc#^~˖-禧BB֗_~YK,0a@V%!soH8ch4BPЧYRE3'hw@+%~Z d$yf___2uVq9;;{ĈKJ*hD@BYUjnmذae6ea#;R@V%!K>ᤰw EhMjYRWҔ"*r󹆬n<-d lY+߯~/\B!@ jU-vk *da#M4ٱcGT'd^ b>04t!@!C:m]'ZD>,?ޏzhaSoC Y,qj1'''qaF?}ZحJoP.\hջz>} 6L onΝ;s-9r>կNrqɈoYaaݿdI͍ a0%5JM0%#  pM6A{{Q-IxWB!@ jU6\Ĉ[qϝ;'˩RRR~*Z0*9dED RdIbnEԳ܇'d->B k,md1Y2"d8q :::Yh !Y,Ȫuk֬Yycyԩcϟwuu2/%!UttNSTBdd KA*-'dpDcu5%荋ퟧםdZdy{{}hիWY!d!@Vmkر=z4h`HU{Μ9Cj̘1BpR׻ QQYA xB@ {Ѿ)n2,^Mp Yv, WpTT[7x%@BYU6Yf=}bϞ=۴iӨQ,ѽ{$J% )2ǏgdƦ-N Ȓ:d9,#N'|9,/U\CVw JJS-ά?j#dm4 b=zT GbW.d! B+%%*QxxxޟaÆ6x58pp^?sLd!MxsȊnkG@!7:/v̒t4C Z5d!+:Ц%vlaX Y5*J_|a~ywwwCBBZ[bbb+88Jxrɳg ׯ7cWf~h YFXM+ KҐw"dHB0=nhᲆ4CM/Y҄,+mm/7ҥKOB!@ ج]vU͛W0 (˅1˗J7҆7qq 'ZBȇNDdINM.RK!dt>!kD:^T@ZC كLB}|| ]]]Lb8СC`5̙3YNNNz-[֫W0@VoBd! ױcDz+VNqWwG 5^Yn]FGG3Yqq1 -?w@!H9k>QO3CRTHd)\AVs݅]t=ُ#0ٻ~\\\|}} ]]]/^(V ڵ3C,\^%4h`~e˖ gt:V +&\?k|||T*lc󗘘.,Bֶw()d%o5m8,{yzⲿ o'ۥ 1d! BJKKJV/Z놳^|yܹ͛u֭[) dEG5z]\.Ȓ.dmjLNt#ZBJZAV @ֽޗZ1d! BK2ĺo'SI:thދSF +eIC DEdIִ;pR'ΑuRW؃6D+);mm'dm&Y,d bcc۵kWn]^bj<<<ʵCW4hyVV]Yk٥Hps1YQQ}Y ŝ,B֒.k)L3sYɈ@6=&-gԛ5GdY,d 7eeHTwǏh/l;߿ԩSn}׮]Qm%4z1<| KE_6~LrYd IR\^dQ3,dYH}+Pq;˖-Cxq˖-ڵkrSNUdLUd Y=展 dkIvah! f!s-d^!K,@ !Y,Y,/+?{Lܸ?p͑#G>Y҅6{h}|܈D+|~gzr;P CVZZÇY!d!@V-9w5nBPɩ-76=>>>++egg dYcF׻2'^^i,BVYҰ"mP5!˓hאՃ#rFtDq YB!cǎW^d! YYftWoUٌ *1cƔn0{{{V K~IIC CCh4Y҅LQtݮ8 A_C y;p(z;d! BK.礧[&Μ9#ɓjYYYTj-nё9Yd ws;Ȓ.d `bVۙ3gN:599Y!ݻg gM`Lh4rD K# -:O=BH'!KESڞ#N +7cp5ch! GdBd!)~,n !ة^zer;w?p[rY[j B\%]Ȳ; (:)|GykB #ҮƦAZȒ B!@ YB2!.{1dr̘bOf<=w/ihat{Y҅,zCR _Cd1YO{Y6ڱ~B& aȊ۱c !Y,dY쪽4O2De<<* bb Ȓ(|7z1K,͸_]>F86v/w6BV lr 1B,@d*ζM={j!Ν;eޅ ˯_]rs;6$Ȋ,/ KsBoza0ȪG4Ⱥ#>gcRUB>!K@q;Wuۻ!Gw?,d a0@UU_~m۷n*㵎=*^eܹBJu5"bP}\]]常DsY'6 ?e>#|qc,f kN3ΆеA3EcQϨלCX#QԺF^WFFZl#BB,d/J7jśptt}ɲ_ɓ'ƌ"d)w"#DoYoZ̿Яz\;\ ˞ߡ˜Aօ{7v7{{AZ dHѨ &/jЛojذCY!d!@V-/11ѪЩm۶UٯZfΝuŬ, W ke{2t@+;YA&XA?Z{}'ch+B& JJvo z7dn޼B,@d0˗R*v͛'ͷ3n8.j7qqJ,xhH +..7##X,!ggzPVȋRehV/[L Y^D&{!'7C {S cW;(m؈ciCVGMJ׻N*7<=wY^d# UǏid3a<}:7Y#>@V' ?Q=:;,[ k Mˡ |CVƍqDBYz9ٹjk„ |3f̰xoO8!YȊ$ R -[ c>U( /}. kdel(d-ze +:>,<³tBCV'cSI^+͛BB,d^.]JN>-ǨLF>?T!+oCV`tk!\sF|J>,Ʒa0jt65Λ^I(-7C vI`cp%9-}ǟCȲ yddt'. 7d|׀,d5 u'ŦLRI²?zd^%? Y116,Fc82s됕;xբE\@րy4bk\/,F}Y~~7EL:ދBCozˋ{ Y۶md! Y읛rrrUtt˗YyhW\ѣǬY*ꄬ^JZ%u:q"w>făBBV,̑_?CϞ=[nV^f͚}?S|N"#:;+wpx:dܙ;}z^Mg(mlRl!liH gYRyA5z;A{:JJc@!U__n)4Zl!d!@B@VDć..Jb֬],ݴ Ȫw&[cO4/!E :745W̏Ȋt[fiO oY;&{7@,8zE9d}G]{Q./ ;eG˦B,@0dawVjܸw ށӧO /={Xinڶmٳ? &|U]vEPD@VXLJ׻Nŵ'z:d{X^ܙ;cD[䑃RM"rI9=GG?7A7D6\A֭n4Sw YŸ]@BYwTbbbŗʊ+*GmڴY_{BBV,̑ZlYͷ{G]-,XT*ų֯Yd 7*o,Ʀ0 Ynٳ{sY#A8"u܏d id%Ӈ<@֕N-Z͜wf`ha 'OP'oWt2xO5'kulA" YHƍN:Uۍ>|XQRY-[|Kwtlmm,?!KLCV``{xmrYc JΛ 5:93ɭ0947L$c~OUjjjZZڶm vܹiӦԠC/vW +.^(ny̙ ?y!d!d!+AO͚5K|Oj_xa3>ٳgBJJJ)B%4dggwau333+!CYs}}@ 'QQ},*ɓȭ_ Ȣ7tҧDNrYj|AVߥ[dwu8c;^cT-t4Na0w۷{x⢋NI!ˎڹs[s\Ʀ;%_޹ދO?u&;}tV sd! Yтu|JH>m۶11?~bza#&L09WʹsJٳg ; x+dF YٹDErQZ>dseYEpy]RzhkY kK-\$,o#8ptiZxqdIy^_89"Žrˏŋ<رB,@da,F3'6nXm:tHV(u֭ opϞ=On9'ܬ YZo, |.{;wd6lx!@BY޹fXWwl…Ϟ=[eWXQFqBǎ>d9;ﭐ:0wc+7Ǐ)O͞D+ ~ER,gAk4P@Vg[CNƒ|JA5'q/89}TZn]ʗV2JUK]vY Yϣ7,Fc&<|ev!k߾ɓ/0Y(tiC NC{Ջ#}1d%kg%nT*ZD6?J9dͬ?[89:S Zm`NNBB,T~+RJPm۶2_JX ommm=zTwFU>T'dGttjn&2Bo:w~cNL!k}<)>gY@9{sY;PbكpY nu{:r^!Z(Yz;AwsF\c5?X ͨN k$<(VzY_A_ @+hI"=}$~ K)s ;>X,\n2vURH}ȋ)_ў*<GO\n޼B,@daVNNαcDŽ70 Xoچŵ#zY>>>&+mlӅQj$ƍbl5` ߰ YM~J T'y;ȜhL?8d<::d9};Y}Bv!ÐGdc"d-]T֭[wKS¾9/E\Zկ_>ڵk޽{Wz!Y,BURvvvdddݻCVG!K׻trzٗQ b5hЛɓqa kWdm7A))4 ?5sӯdEٌC~"dYy]!}JݝBQҾp$}111*jcǎ׿&xdvۿugYAAA8" !Y,d%2~iӦQkР \Y&̇ yx (d>~\ 6m]Cg>h:d&?-hܩ~ :Z,-t iMkg+qȒde7uIgX8qd!h#W~yFոqcB,@da?.(ʺu&''7mڴW^N???[ndbbSF]%%fec}rLaz%]JZx$d튣y ;d5;LBJ4de[@Iḵ?8dP t .tU\zs?~<666tZ@#Va [nذr҄]z}Vo9d%d5oB,@da{EeɒY%PP,F̘1g10"&D0aV(1yww}wg{_X4Ab֭*{]1cN,=AV]\vj+OOOtKˇEf3+ ELONHgLo<QY>`x/Q &bu?EO-u-Ljd4nMHmd.F_k 2 NxFZ;~EPSY]wǎզ߄#2\XXaРAYBd!B!BUR>}ɓpmTIB 7-Y[ДfedD߽RgE%j56w=Ȳ;/7X bj 'YCF4TQ.=ޠ b`_xe\;@ On ֕#kȑhCY$r}q>N5Q J턉|mۊdeee!BP(YPPщ'KnZ;_m kO &9:d-\HwVVV+тSn*܅DlX׽6]-I:jd0pv\  |~!zݐrݤfuG鵔'܉TCYh$nlauԷMk5a22hDBPdd*/ _OUK-XPhn^":5q"VSт^`k k$d"@@X:6v:$z@uQ[Z<_D W^ koS]dͳuܰҔN,))* lLrP}y,l.+?4Yk~͚5|zdk! B!BBZ}v۷o֬-&&&88߿}U~zDTruMAX9;;[YYi&:O/^V=т\?$lo  L7x0_@86kTO,5{(?SR(~0,Óӧ+J=t8ĺiT) =Jh9^)WWW~ٳ dH~y n=3tJFΊW,''' BPddPݻ}@S[dq22gppoqHzЁ^.ZwgJ;"%q= dgtrPwȚ v5Z|C4!Uw/EVcڈdd&00PQ 0lRfVѡy 5i$3ga|Ud4A֌=Ąϐ( %"5k-KW3r O?4w\gg礤m۶ݻP(,Y(Y(TZxȗYuk`b@ƍ dGUb"=wN kx?/۵Puj***c7[Aq\̙3͇ʉbÆ *!!O'n޼Y~Og B UH$K,{-t\d*N@~ۗT9Ȳ.jh&rwwY>>ܶ d۷ZOlY *_d,fO1])0ݼ0<]@֐UkJxAV/\AAO+XV<| (nl,"4vߺP[; %:[req13r _ɾMem۶U>2׺uktK,/_رcJo7u{rEEE/ &F+ݻߓ( A,,T5" ׯ_ @Nz%rʨ OyI<==AV@[۫"YSD6l׋dm.Yf[TS?}a"Y6Bz ]A`Y.Wna߽Y-BF Z!.\ֶwvf (q]& 9tVrvv H$&@\\\nj +%%Eml"HRu񔁬߈d?n(g5Y*,m\ :`V06ɫȊR?N wJJJ[.ħ̚5QP( A,,>ZbTNdg-׏| oVH;U@zׯ?M,ymJΟdk5@֢d@ ˭;RdyA®Y 4т,ӿT_R5 JIDL ǼU\ w;Ⱥ|9*uؠ]v&nݺcǪ,yfn)GBP(YPPe!xMD~rtN-V7laRԄVVV@uE.iՍ46V 0c`jᰈARzplRSnY69 KɛR KnGõ`WD>}:wμGzAV~> _v7^fo[pYb ?Rޫ RSSؘ( A,,ʒԩSO=ߧvvtV }Ͳ7o} m["X3'~0Z2$D ef,%l%F Kl#}~ H^ dq]q-u:W z;kȯSCSYdE9_W _[@Ƕms@( B UΡ+ .',N!!n]088ˁ7onm}; `t@'S?Q4fZ]\V=}JD z`HA .wilGd):5`p,6l^=$^9e1 w-l'vŦh>W[G.} +&&?"ÃO<'Bd!B!BOC@ɓ@#m@ڵ+Y ʍCCW d^^H k2.L^ffDtltg;|>IQ[<@A H_ kxvHAW r:/ȺBGr ;ڼm5EEָǻ>զM5k,5|g-DPdd*YYޣllltD15 KPuһweĦ >;mNj`ae2GF aHm'0j6XI~g]e(Rtawsq\?`b5 Rv-r5E u -*,LWU k2-l69MX@ozzzY?|%KW( B niт MLtao..8$@/\ZT[[Z\,2B8L.]b>7zo@U;Y?D7n^i-ڵ⨅Ȳ|>ZJB3Ԣͣ(Yd͘M0"jdm@VWw%RuGZ|`CG?d-ZDaPuBAVVVMf M|AYYc8j ]vs-ͽ*ylFj{]v'N?~_~;v޸qP(,Y(Y(}djjell\S={ǏY*Z^HPgcc5 _MIݺ txFF R:A+ͥ&d;Z=,y EFz(a؊ # |jd@V[ ;HAq >vcS-d͂pAĉuZwI[ ! B2;n*ag =55U\ BPd!Bdldќ5Y ~= :1V|9yPm*oUP@q7M޽FFJXXH[!:5Yص[L|Dw/RȈRGZKV˗ 5 %Z] Oxd8`V R6/_^ j ?0o_B}dիGl <,3dw[Y K;@!{GBPd!B'0mڴA%+R72^hЀ2?;튀CׯvP8kdu΂ZAi+#JtA[a-Nnm^.u &E# W[k!SnY$GSƃ%4A6z'Lƍwލ Bd!B!BUd=ztժU׮];rHfdd(+>B|杨(Y:T% }:|Xݸa^ tq)IL, laU`PBt5rC'ܻΆ4nlhV$hu-6dfKerFOt^.!f S }jvMOVs-@?dI$Cଅ\}>Wd];7<8W, B \\\4 O:XIyO.O%8n8YYvvve,NNN,Vz‚| ^͞Mll dݼIcbʀT 9`,a A(= Y(Zdٿ*p2deY@j;޹͐@ּf&c5usW,9.[YQ]:H!}͎ヽ׷aF%{dY3ab.gbccѵBd!B!Bdвe4T{V޻yf>*ZݲzŢQ3} Z&<:{&%QVha@SrKyyb˗Ғ.ߕ.oA˖ Ɔg`BoTc g6{`S'1)!kvO}&d݃[Y+S`u%Bvt"Y%%\dyZBh'E-3Rwn!y 8;;oٲA B!BB*SozjMԣA"NdUdZK)qt$摢" l!5ic2 M, "<8PG0LL5uFFR*8:NJcWЋte7W^U5z!,N#pNuP SanWkp_TDTf[.HiBVxA֋QdyXBc;xn&Y=2VEޫd|?8Q(RY(YҠA@o;rH EǏ#ȪEw/)ˋybYzu;YS-X@f2[ܵ;б#ٷO4FY99UA F)kI Rs[d5)ݜ=&O#Ȋ:~W> \\:?Z[2`z *.VVJ +Udf"-ȒYu[sgLyA; $p+?BZ&64U[AVvn޼ߜ( A,,TH"h+;;uEDD{|Ut۷ @-# cc5ޝ4i"@VH$BL6.>}DZx܋MiUOZA&&Pn J͂oV Tn. !a(3auI eejÃ>?H7SzBMbYQ".=@Z\{:+0/[FEZhV/Ⱥ}@ ,okhVHY-͆5kv BBBrrrB!BB>~Lz#-[ԤU3f 9c/,ݐʪ@~;ƍDB?~gϒ\N"/_$''wG.Q uqO,]Ymے9sDd֮[^DMU,n@W? y٣Zkd?Vš=9!Dd;h '+ w!@իK*ZhgdО=Akq`뫣f\@ kpJ|t-Np!DPdd*gASl/^1B7*..}=rȒĄ瓎4:DEpJv6  *4ڰ! ڪUهĢ( "-6hP@te*Xٯ\ )Onj`wa" [dAzQ ~k@RZ-}}\^zï򒌀ܓ0@t8+s{˦5L ):r0hiؤ9M d݀1Pė$@,''ZmϞ=ىBd!B!BU^QQQɓ'ܿ<[nA{oܸ @i^Օ穀0йsС RRB6%-ۺ^.Ț;Fy1 #t5wnDDD ;}Ieoo( A,,T啘ukdd^xR͝;W)Tfff|Iap!CǎсݻaCF7'OhD>̷'& ]/)).]IIf1~ٙ6 @),b&`?yBɑ#" pQ#]6_EVA'6mJoܠ+MFT PTD5YuVHW6t;Gx9fǠΛGaQr K67oM S`XrMGƇ .Jʭ- Y)/!4/qMyyBsT kju0r`ޅ>%Y ]= Y[AVӦM8}3 B!B e:p׭e$''ClySj;ydV5<==żƀ~Ջ=DKyPAg<V^%66d"vTj*֍%#!}=}/M:u+W@ggx19v0lCZljJ?VqR5Çٳl iNvv52bd H$RtlWNuusSR֭SPP@bb~~d~YΤ$ r=;p QY툄G?D3zC!.*8x0MAV?%԰S:_@_=PbA%Z*ѯ?Y+4R5KߚYݻs `n!TX\4+Kd@{7:(/tv-ٷo~vP(YPPɓ'yʔ#[%)ݻw3p'W㤧Kmu-T_S<|\-ի,gL ]pe++!Cak͛jۖlJܴr$A@?M ȷߪ@6mb=ۓtdڥ c핫+ 2^DN{x~H^~5YvD/_RKө.U~1̌CBҤ iڔ/Вw0xܜ0+{d,uk2>ySI52b]Ƶd;ֹ\I-" r&z.z֥ ƌ}"k4{JYϳTv ##)n. BJcdqK5Xջ)ݛ0Lun.E-ƒ_&yYS?x6wнF@V` $ZX lb ~ɄCƏ-FVC[~9rY\a Vi1q-CۺukmYYYYىBd!B!BU͇ŋ߿rJAC woޒ%K-Z$1*;d$EĪ$GT [G/;́yj*%utO;w/^0r1hs,ifƯ#c/2ÛqgMˮ^%@͍zӦ.wccF6n+WTfv4n@ syE ۾q8r BJC1[Izd4YGMuFzE<62/\H_}Ei(=33Ó삵BHʊ$':u˗ {صCgXa5/nWOεwߙ쀲] `y^&o#9sCzջ]Yiit#P# Ύ+4 Zh 5B>9! ,& VβMs$ ޾MrKGyF;766[d5iرc͉Bd!B!BU= z+::+H._j*]s<9SaN"u뒮]i>ҠAu:rAx%?ZkFҼ9-/Eܸ~TM۷ә3gosX{h@lWJ leE=c)7nШ(Z* S>ߕ\\\Hǎ%k;ŅPT$9w.MKcS\E13K0T;9Vm?x16jB@X:2|8=yzyџVidfvÍ /_Rssn~ʊ gAzCɓ_LnN):Up,Iޭ8z9"feqcg<*w#Dd%PjEoi duyX1[7jڔ\ [U$vwz'ab2s@mbBe:z2n]W?G##i䮅v5 vp7Y^VQaD} =9bL`A=vU[AVxx͛7B!BBB ^|gѣصt۷oϟ?_C",=AZdոΞ%G ÁkטTϞ{vewiuݛp{Mn}.]ԫ ,N[33͛Xp09S_miA1| ;Ȉq?ޢwidLyt7t2x0={oOv ,/]_:S܆nb`TT AƇԧ#mc0'\&#GGǎe>>t2cH޽˶cTӇJ !;'jY-(/^yyfn2Gr)+Dy܇@xπ+F,n5ۓ;wh` /]Jϩ*qhx2,y0O͡Oru Zd[Bl1Y;w҅E?TXbPwC >2mU,WWݻw& B UJHHAmۦ922RyE.^YD+ȑtV`.vQȲRMz޼a, C y{VyסC46^M?fg޲E'RtC,<~fg_r>z4=pddP//r1fHf \ݺx,%~g@}"KՑ[lm;Bd=x[G{hXE"Y__biI[U mn*%j k,/MPҨYe gU5jta|âP(YPPUozyyYZZ*3dr)7n3= !7nTdyVEn8@E-h e%ל}ښ['Ug1ȝIjfFyCyMC h˖̓ĄX4# JJdz1&M+PҒcg2w1B\/Z0tl]Éё7?}bn99ޞq3.Urlf:QqL7Уu׮Odd,[c. ݯ<_C̘MoO_5ߧ/޽[)o ,^0߸7r,ü@umux=A}0Z9gPޘñZ)+@VPPP GCP(Yd!BiQ5)XYvvv_SZexkatk-^dI$ V.F! mw 뛞n tgn~֫d5iP( PP3g*ϟ#BBW `@V9꫁*3f,/[E/|[+k,u2n ϻ(щw 33bn"wDllΝ-_N.\Cʥs֮\F}|Hz:sǽW̏+zxG@X [GW(u,_XuﳁuM'MCP.Cg_Ud` =[dM6u5x-_N"q._`ӧ͍jY1X$2 #Mԭ€֠2$s+8_˻J@Vݺuw؁N A AV‚/^#ӧMPY.k/j@̑_3D- w锗/_ׯ 9'G(v0v_>|Hg̐΂1Y.k=vwJr-9Ἴff%R\F?P^we#-3Y2Ⱥԓ- s٩~x⛝<,d NנYR_nt"mܘw<ػ7x9o' `>9w4kdy(Z- l_RfaBdC{A=d222 dᅥJKxxT W' B U zن ܹ͛,`GGG3$z A&A] Q_ {Y)7$VWi0j,>$0f"lj5YXd}.\ЍS\ll޼N"q Z 0;&;>ej(&mFHxY |9)K `3ضmOS @2|8 [QOO*%'v@'] @{Mw UV@.L"ehYu JdQeڼ@~)> Dڵ3 npneD c޽DPdd\6m21YYYlmm5 bŊ$SNdEA[Y5 rs۴;Qkae};+45evt$>/;1 ȑlˋXyçG0ӯ'̬e͍;v,TBUSB=lm#ۼKnl=ΎwfkΜ2Ad]R@D0>CVhw/_RKKpVoe\V@dݍkhH9ܩ߷,PdL#wwTCY\˼^J:,Xdqk B* B!BUfΜ Ծ}duQ۶m<#B ȲX]{AUUpJ/؉_d:Eu#]ȠAT=јɵkGs&JSabݺd "ZۯsnLMYT9Ym,{&0,vׯ_?,7+*Ћ39_O׭OE/]*Ô;f?T4D%E*&ҲI7l5=d=XT_躺ulô`>4-ME*RvOvc9v~r(ո $Km ˯lFΪx:( A,YHJnݺYo޼QgϞiڵ2 5FBBQ0UeEEˋ[G+D`U/@ي ]d] {֋5Wkz9HԔϰf=Atf!H>M4 ,]JϜ!;3PGϓ&iYα3E9gLlȐ!cƌ[0ѣtDpT>)4'G+nwɞ?|(ڽ.\(}Y7޽{wͰ ȯ߀JN͚5C, TA A չsgdM4I9ҥKOeFa.FZZ#8 rwwC SAV**.&&ʕʂ 7 dqJHCK=alrƣGYX0>|A:њ<*YoysQ2/ l˗/g۝42ͥiy&vWD#m|mU]NӧY9W*! w\ы,' VIlv*%n*: dEFF9rAX: v돡'JN^^^# B!U@BBH6mڬ\T/^(,,={vllZjYR?OQ㮅D j52XǏQ-R&: udYUiğZY۶m3 dUʞ9\#G}X|X]4-1cq{?f%<|b%*Ւ'W'e)v*!.\djVmIf&QniEޢ-* |+*1#~EؘEf g>- 0Ν7~SߏN A AJ4c epdccs-}<|b+y(/>|P ̟>})BB, Z KI4Ve}+#tӰlH;Z~Ӹ w6w! ~a!uw'K:l̔A't..Uq$UFuҎ+EOȈs lL @֬!$?hNfP &O芑V%Q g2`Ԑ!+.;2 e˖Yv!^PVNaaayyyDPddU ce)ڵk3Ǔ;w YY#K +`tYU, nH͛7y+  s:uȺuDĦ={ʠʴiOu( h$;+>ʕG^ҔJ nsYB.2̛Gw&P{ a$9ܽ[45%]Hq1S޿Of[9_exDHo2jaA_ |!E=k't}{z &1`ﯡ[$4oU9988dddB!BB=z$?{l ^XXXU "99Y١C}Nbb"ABU5XY"YsB=bd}w* RSIJI1fͤMFȌ$%mvY+T}K{m|zo'Eob<t+.*$CǏ*FJ/3捰uk.d ?߆!jaAnd +r!d$ҟY`Сd]cYYY5 pS]HөI&B!U@B8q_hQOҮ];6n̬ڲxwޚƍ /..)rvvD 덮YEVQ!YdFYaZׯӒjd$+11l~Ý;ɸq,V,n+t!N5wBW\ }0K݇`zBd!B ÃvU$lzhQWyy YY>"Zm.""Y͚5{t(Yʹ8ţ`uվ}{~Wddd5<@ZE],+*<Nŋ.%70n.,ݔ(:Ғ4Iƚ:vXY~ׯizd)s{޻GM,"7rيȑ#d WɈ +f0CCr'$$D@{?P[:|XV`6$W m}K>4Tޭar`El|uP(YPPWJJ Bҥ <6 ͐22@`PxK)RXIHH1.R]I up ϫСPZ%e+]Od΃͛T11֤|G}*' z@< 3{w n!> vUkaAP(YPP:{,׭lIzjé׺u¸9I,negg Aշ+Ȓ%C2q5Wko !{35A͛7O"}ᾳ;zƥ)re w|7ov}K4PVHD|n ###%m `pm@ƍ ZEߧN hZ ߰!tw m˖ Ȋ8tP  OjMts1; B U%z)ݻۛ?ùsjY8tpp@%Je)I,g"+`@… se]+X.9 W!1C=E}Ll6[nW\KSFDR;-[e`ɒ2fԳ|8JOg~ݻbjm[ ÇY,]@{7iӈiL+Ⱥ|v9?o UqʧZlެ̡U>kLt՚.$ó_<##_( A,,T jҤIy|𡱱qbWƏ?mڴH;;I&"Y" `]YƉҵPqm z d䎓K,D$!J}פ4q<=K+4[[vbO'11 gmIr.n ljbBwgIvD[y^lt(Ҵ)+V0A$Jz*z6;';$"~۬w- VCzAߺ*:v:Q(,Y(Y*ٲH"z?)Ti7Z)3[n@L U ] E D#Ko k[ dupa off}E'n_ ULG=zڴi7Ç};`%YCͥOA>{kg:LJG D׽;҅XZ 6% $ vBҺgZ+%aM۴!]Nefl*/\`y֭[k)7 )jMKsp~|uP(YPPU_tI3Ǐ/_/={VU;wӧOvvvP4h AAր|GDD:{~e/}'aҨQ[jl E99$+K/i zu֨QΎiFtqQQdD SY 6Ǐ]+W2K9lۦRj>:5h@'OP{{ұi?|fftNYcƐ;tY«{J[{yyլ$ B!B AV-|vI#+'';gaa ziӦYΖD  `UY&!2 W'*'øZ& kۖ>x@6A>{3G:kD*v=~LTWRˆFz.''':uJ|m۝}29"y ƱbS,/9pha%S'woqV!.NsGl@ԫY kmۄO>aΞ5g?RRĄM]eF_Dz$6|"Ҳ%W2o|Z|bؚ宿~Μ6Kz,5`ۂ)+R/1"~hgq"$ȂY1deemRv Z˗/uwjw߾};rd,/J %a"ߩEB`PrdeE[dâcp!VUI~>rΆ$<<Ǐ+* 9 }}Rٳl/^Œ%uݻ'6mFpI{>,ƿi؏ۡx-'˗f̈́>}*Jh\hXؼoe3gۀ#q-u߾۾]PX ͥsGbMKLa NQ D4}{A 5`hZ»(BF`cЖk1y2bCϬ9l蝐l >pNRf3p  FU" " @d;7.]TŞtH(е롃SY.֭+t>GLgIoǏŁӧlf||*D^d8e?!ww%m2qIET*SOE18X#aCLB5qt);i?1޾eu(9=M׮֭"p4k&޾VϳO֍m 7imTYs ={ bMwkײHOlja@?˨_mW&3Gem͛3b8߬Ybq&HUOBVa~~wEN2kժIߦ(!DDfѢEY+WI;o̙3Æ ɓ+jBrIGb~EV@] XrNUYs q%tj5oЮ] EV?i"K/O)h5]lRCr 33SʑuWÇLUVܙ+ GCT+;wV/".OO\Օ ]]ܾi#$~EChD~{[$h-Yy?2ODDF"Kw법Ԕ| H)//ˆ,Y|F#ЅEV`Ν#M,vUgv1r ;;[Nl ff l>>񧟄ƍ>տxl"AqP!>z&*CMQ]W2C"n֬ݻU XTĜ^Xh WNCBM{XQ@fڶeZzZ1+Kؾ]K\ۯcֻг;G5e{7;ุg>XEO38XLMMnH8c;ΊP\,ʑ޼2}‹7&M#)|p%s~(Tnٳgx$-F4,'>pWZv@ -O:(IJ2gƴ5imipab&O* ܲE9R#q"QJոqآ.Uu"kD\扌ܲe61%ZL2e*.P=LZxح[!9$ՙ3lr6߿Οg=btž=lhg kI-ۻWЍ0ot@1$D^^ 7oؿ[*vQ*$q(qP߄kM]I8y2 ͛5ӧbj*JX=|(CܸbDyݔ)=1wU: \)N ܿ2ӷW 68~0I],6o.7N`i:lNܿ_\+6i"<)}K&(ЏhFc+&ܰEn*Ν+Fz{ 3$-'G#+=wzԨ}MOg$` ,,t7 ,'Oꪎ!,,uYYFTBd&d!"~,WYiȒB ŭȊ#][d!11Q̒\*j4ܺ%&&<77䀔t}ZC/88@~;kV c T_lI߾Lw,YR=!LUqcE: qB᫯ V8aL,Fo"YZ7֯g(=]: .Ӈ/2q)ݽX9غŋ6mJ"h9O~~Uʕlz /^Z]v]V|x+(ɓYBɓE)ᘄZ->|̛j*E;,n&(N]E?}|vF~~Bq10oMNl^B)ogU?ڻwŘ}{'׮G8Vi\)#mȂY@M6,/>xׯ_/--G8\dĨT*,Y-rV:hx͑EHgT ,Jv"}%%%56l ]pV[*|| Y!55L~gYkl!&B,Z$#ȉ?@:~=~6 0z@M8~\8^*6kR2D36EV.*#.X +gி*?ٰ!^ 31 s9ƣG?g)22*`:ukvʕlatثV1%WŕBzR5K=b-7쫯]+ЩѣYtdϞ¡Clcz b۶K!"B0oKID9b,E;{^JC6I_0B/=YY" Txb^E@h!2}EBfs#ˇG%ΑͳȊ# յkڄxԐo_}(+R3$ll[_\\,] 2FJD9t%JT3򘆒&74y)Oi?fQ%’ؽepbU|+?sLJsGl@1˸.;W*:/s/׬ai :q2%˗,RzݰH5];v$_~) P\'Joazy{ αh}#?ۜP>E#~ƥKc dƳ7n![ӵal%%B}{떘,6k&J9e [[, 9_ER4hСCs3fL&M RkFhnEVsg-1 Rչ)G͆հl 6o7r3rFmΝ+\&y66 cO [>y †9oY+ȓdg\faTnn增dbӳrv,^,ҨQGؔkpwBEɩ,jv]c8p ySʕ+:QU%73 3f:H_lƒkegY#-7nhMgٽ[6-i҄%%1BhRڀ3l*lnDDZjepsss6Eo=<<$_Y"ˏE-tYuhaWdu#D-YLn@DB4 B #Ii?Ga ,˓~ 8da{۰;WN(X12@x8“xQ9 uQQˋE+ rsEMGF".~͈jg,/g־=3`vx#XǏ~*JJ[ΟR^X(JY{z!!,rԨ9߯s@dAdzN׮]iÍ3v1j(YgϞ5|LII<Q9PdjB"#@djNb -,NEƏ Vd%''Y%?(^D" {t.h]U*r3px kt\9tM)x Ql1c*Wݼ)H9 %ħOۓ'+ %6hm[ċ⻝A֜9y̘h6J-)RؼY> vMLNY«{ؒ#v)*GӧӮ}!,V^dw/K+ %@~Gܾ}۩DVBBڹsJK5Y|kՋr(eds>J<)~$ZEJ$ $[BؑV" " @dWJ_~6;vINK_dI {A_o޼" @d|-DnEV@7"+—Dhk-[ԟK_ r$`E?MEF8v읍/O'Pbo>?ÇSN0{M*EH񕁄/^_v6糏2Kko֓0Ϟe] qT);%x" @dAd,POd&/ " \dY"„6CQv} Vd,~2ٻ3f͚޽\"S2Pf4wﲹ[|LlBЏzU  gܹϞ-3M3n՞ɓ }Mwp劘Q15ayyg=}**lƷoْcX$}'~;7YY" w%rJy׭*"K(J,YWdy"UEVpoha,/iY.)Zlo߾swO Ə=S|Ư^ӧ;F4aٵI'Ԇ'?<PلRvw:ygǜcG{w{* +.bbbT*DK,C Z"+=D) -$dQ~$ЋGOnBGdp+Zjm6^Eޫ]عV('Gصrs-S ˴ibTaL%YY" ,Ij~EY -LT;"˓ބ(Y s$B ]Rdnڴ^]%Ӆgcާ{@_wTFl˝%ODD" 8Rd_PC -|g-lVdݺuxYZڿ?.OV R^,}ne ^YY" ~DZV(Y.)Z"KNhnEV0,wB:#+ΟUduڕYM4ٵk.CټnVTT1}!YY" uEFdAd9k5܊,79LB|YQ~$5[yl)4MQQ.@{D g޼yY1"+keUha`oha"+FAZp+6myf^E^׷dZJK, xVZy{{Cd,t-t U 75"˃s+]Rd zUC, '<5ϟ_x1.-4RrIՈYkY- έJ!,~sdD4~I"+::://WYX,xe٤piR |C#\Ud{7nGdQ#Y;wxDVllmp@dAd,"Bh8Z"+5콍~'r+8Yc\:YY" Jqq3 6,PMB~EV "CEV0ҀBusN܊xgJII9x .,,xz(@kYY$ " DdZhʞ7묅*LohaWg-(L/"d*NDDSRRB[TTTKؿjBtBWY~$^,ڇs+zl<"  Y" / M ȑ | \Xd7FHn\$-[,z5߼y3.,,_)SxyyAd,?B+2&2[:Z6ǩȊ#*nEVvv6"+11q޽t DooڨiӦAd-teՖ/Y_4#M8Y^t#ğ[@:Yf͛ ȂY,zWT*!\Rd!G"C p:"kzȭR&AH"KV ȂY-bbbT*DDӝa$?"~ 7=BY K"+11q˖-T${*@d,Y-taL2~EVC  "+- Vd(n"$>[վ}{RdT*YYYY" " "̿(ڪY][Q@~C #XwDV׮]9-LNNMOȂY@dۊ,C ƛ#Aha`oNqYȑ"KV*5jc\:YY" EW(YYNwQr-8-CH8j${wIՠA"\:YY" EFdȊ @W&{4΋[GCYżt${*@d, Wd_exY}έRyC Vd(UdڵWK'" " @dfrRwhaMdqZB -H"K Z"^1"  ^di4R t9\Ydh"+7B'$_G)Y'{F,D燓pJ"+kͻJ&d"E9"˓(Y IHrIոq;w ȂYؔK.u$Zj" p%YʵY=![զMݻw*Zju\:YY" [,5Y-tiuhaZ)‡r׉,~Sm6^EVHHȦMp@dAd, LY8X,YmY&{9D)H JIIAwD{V DK8E7! Y-έjD -CY1[n:^EVxxxaa!.,," #\XdzDFowsd(Hr"k׮jѢž}p@dAd, LN*# "YEVpȢYQ ʭp걥j֬ٞ={p@dAd, LY8_~C L ,YބeTdpnEVӦM7o̫Ȋܲe .,,"K(J,,;_2[@B}MN VdEfJ${wIdX,"+&&FRAd%dB ]VdqZ0(̑wBVdHnEVttt^^"+88NDDoBY Do"EV06 Vd}IB"s|:x .,,DIEߡѼC nEVZ7."5[űJHHرc.,,D "}haBVdEV>!nd{([ϫȊ۾};.,,"KV+ ,YJ;DV8!+#UEV| -AH "+.dF ٻK2\:YY" EFdp="KM*,WYDTdyғ>EA$ҏTq+< DDDB yY][>M~ǡڨk;Gd5'øYJIIr .,,M)(($Y"|5|íRy3mha[]wNEFAچs+9YQQQ[nť ).] YFTBdR"+0o"´Pq,wBxY̓Y~z^EVӦMwލK'" " @d`k˜J"+-rR嬅tmI8Y1H"+))i߾}t D|,;0wՖ/YTl;nidNEViȭJLLܲe "+44NDD" !d"!3Yᾜ&{B ;<"MDɭj߾}II "+55 Y" ,,YјЕEס$ҏ΄<"#vqhahhMp@dAd,YjZP@d d)DD3oha"Rs+%/77W~\:YY" EFd;Л\$Td5 :!܊hiBwY DYYY;_oՉ90!GO!=Qq+4 :[\\\̫h4[nť B39ȊE,Y uiohadX6[k.^EVJJ ` D܋,FT*!\Rdq%@d9Hdل(Y~y0B ]Rd ȂY-U*DK,C cxՂ܊$KUH;!u:S@"Y'{OKK;t.,," YNz-te$ &{$!܊,/iY.)bccoߎK'" " @dfr"UEVp VdQiYmڴq~Y ;v B39!d"+\y0^sdyVÍY JJJڶm"+%%t D|,ZP( \RdaBY鄌Vd7"nB~sduDhK\:YY" RXXCb0" DdZY.,T$֟ž!JnEViĭȊUd";V" @d"KM*,YE fj܆v׍TdQY;wxDVHHȦMp@dAd, LN* Yɯ&d! !^,/]ha "+ҏ4 Vdeeeq,KKKq@dAd,YjZP@dBhK,C CPdmԵ]],EA,YV"+>>>??WըQ;w ȂY-0" " "ލ.ZHxQD%Ȋ)**¥ B39ȊƬ)Y鄌Vd5UFlg-Va܊^EVzz:` DYY+ Yʯj{hBfs+bʛGAv Vdt~EVff&#8 YYYY""K(J,Y-tiuhaZ( wDVGdE$"+;;cY "+::ZRAdAd9Y"mέ"ė[@:]Ѭ_WY " .,bYQjIpnEVNsdI]Qp+Ծq¬ ȂrjMBzDV3%tD!=Vdy.Q܊-[*KKKq@dAd,lJQQQI5Y|FDNKxN%܊ۗ*T*d,,,,P(--mC8PdjBtB Eև!n׍TdHnEVn8-LMMEwD @d>_C t8YaY~[VsssyYᅅt DYh&'Y>\ȊA,YT$FohaG, $d)"0?"k+mI?"˃ nsdB?$[qwJUPPK'" " @dfrRBY GVZ(idNEs$FdJII9x .,,DIErdN7܊fJohaBY~$![զMݻw*v؁K'" " @dR " "חE"B܊H?oyZ؇`nEVp+v*Od+W YY" ET*YYNwGd!d:"+!D( q%SdDYUd ֭[!YY" EVttJrIZd!ЕEVZ -$^NGd 5"iӦ&M8xNF,DDDD7!MZj" Lddr)6M~ǧ".SGՋdCd D6e߾}i$ZYѶY'NE:ujΝ(yڴiu^{~׺Yc Yo߾mQÇ>p@֜є)S^~]wu& ߒ8B}ȫW[[GT~5̑5i$[<_vmڵu 6 [AȢ=|ƌYgΜ1#HvTMDք l!g.^XPPPWK/pyyyв:=~￷ڴi 33YӶon y<駟lq ٢d Yؗ޺u+99"722E}vssEnݺu(V-fzjNl"" \޶Eh!}yis߿D@YLBZTBd-]tÆ f$U3% |A\d?~?%v#% &!{Gm!Ν[L,/_E;kҪEց&O\W۹sgyDe۳gOܹӼys[)SpZdo޼sPqq9W :T^v-##$3!~܊[V/"+%%ʕ+YY@dAd,Ȫ[m~@ Lo#,Y{@HʷUQIe'R$i*XGb ~,)vȑVk֬ل mᖗlOjq1[0b34lPV-HvVzęnݺYU2(v3zGaկ߾ɓ'ZU,j7kݺ5dFo䪽@#< ,,\{ўV'#ym ҥH+YۍOgXϧa[_߅… 7ZɨQd͛SfcƌdzY6?7|cU-Qn6cƌ~6.wҥ'jK6ثڎRUW ]T>N?}mUǒh O>bW-ْ~|]IoGbmO*͜9>l?8qbw6lnLSLpczf~{ у>K-[̒t o^.vc0dᄈd?qׯnݺ͝;-CT8Y]N srr>hwww!Ct"pB " Y,`.@dw9-D" ؿi!1۽{Ǐ1??t_TCx+W6mCk}/B訶++++**AI\={;v/U;˗/~/P|tϞ={mamۭ_^t }?XRR*up˜1c rss=z4n̝;׸XQ7Y؀;w<}䎇ҷK߾}5!!!U5\dd Ho={)^R(U]Æ -ի.[nEڇrOOϪڮUVU/mٲ%}Gg/7?|}} OVVT.\_>qDm'Zz'O>\j*ݫjѢE*?UjøqhV5ւ ?zMeOpU7q9ԃL8k,0aԳ-ի>|ϟ?_`Qԡm5_ZiI iLqq-kѢzk " :[8}UTTdrݻS䛕UZ/U:uW$Z޾6L:gϞU՟ڢ.\eOLVvҤI&N 4dȐv4H$zṳdOpׯjǰ0ښ#FL<Ν;YgYΝߦ6IIIi6Z2!ڵ玬AQiӦR͇T1DS)F10!f1QGfܤIv[mѨF-5Azz-p%KYgY8ȇO$̷JdZ iOP&L oӴiSԧCڮ5} oZdig^|Y/))A9@/k!V" عi!/JR޸qZ}vT݈`ѣG-i\y(Tݐ>}ڒ!9{U# PvK| f@Z3"gz7lf 6>[,`.ȷycǎ@}brb5">Cez(yf͌7شi%"bg^+Uxjj{Ad9.\ҥK;f̙3rPa-qϞ=rM4 5iuGj4!ٵk" l " ;sΪn-ٳ7JТP6;v$Fo&VHUU˗!ƩSZnmv|k ˉ'ZlivΝ;K;j;֨Q#㶣K< x-j>ߺ3*Tft-/>[,`.c{ V 6ZѡQCwcx 9U1w܁Ȳ LU\&@<==ʹիW-/J 2>h&1^>o_VVfrD*@d;w9-DbfF={V`.JFFR۱q͛7/\s7M[,`.^HwwUmx(1dȐI& A}ړ/j{裷PPTUµk|?&7-$YÉ' "޼yS^QFÇ Y ps,7YkO&L`#D*@d;w9-DvA3 _V5_K] ?Oo]N>s r"޻woK[Up9b^O<o{I WZe&" l " ۓ+ڝ={֒u떖&ܽ{W˷WFNjи@JKKl lرCnm~cQQF7g ??Blرcؔ+VMPRR%LS'2V" عi!1-ڔP;r 0@ZK sYVVjҁm7zh3Ad9s$:tۄƜ dN8M$LaH@MPDsBd`K.^hIZj{Bc/<{ߏt`M>fYvkU̙3nrζ[v{~ZҥKFǶ]QQ" `*@d;w9-D6֭[]ܙ3gfϞ=Ֆ_nstM^~I;R^xt`ۙ"˙… &7߫MBxAԤC\̙j4pȑIUvrZ,lÃ۹ҪtӧO[x3io%֭[FD5ڟ7nXXYƅ ̷͛ϟ?{_=!hՎ%om!;*@d;w9-D6ٳgҽܖ-[FX*L9o߾՟\J !5Ę1c Vv4s?DMڟ~IiӦRP,go5dI~~aU% <sd8?`W v<J`;zhjG13 p;tP ӧeee/^@:h{UvrZ,XDBdz " Y,`.@dw9-D" ؿi!`=Y]N rZ,XDBdz " Y,`.@dw9-D" ؿi!`=Y]N rZ,XDBdz " Y,`.ǁ/_ptcϟ///7ѣ[?LN4YfÆ 4LGJJJ]9qDB@ DsBd@uL2һwoT*|͛UV _\"Kn۶M4}{i|Rc*ɓNʼvTZAAj Y]N ^pTY|Ljǚ5kLn}z][RR"٫W/T2Xe " ,… ~~~&ÇkSݻׯGΝ;M6[N/_~ӧO8qbԨQfORUm#TH ݫÒcP`UvrZ,cwm0YرcQ|h"h4f&oBd9?Wɓ'p:+rϟ?G%V" عi!J*sxժ:t^Uuܸq5n+V'l3x`,'g˖-0$k׮uИ\|OOOT8Xb " '&S jV`-YϞ=CDTʍĤI[˗p }ufɓ!}ɭs)TH>eʔ)Gj uZ,`.+ ;?V?}j&7P>|Uf|;wq?r֯_/np ,YDnѣGBj 4P9{y0o " $%%*ԩS'kK;voDDq_FpM< mxիW/(UY.Pwre7Φ?ȟu9T> Y]N V"k k;YuܹmZ޾}+P( VAd9-s̑eڠo߾mѣY|0c " DYgI5֮]7 3˗tյ6<{Us%;Wݻw!!Y`%Ⱥwg}V!7.۶mօ*//?z/jso޼yf;mTu2۷Gu?1mRʑs,Dd=QۆO?~իÇ[N, Y]N V/Lj-)H5Yjذɜ]SN6md{jj?0l0ooo3֭[8p@PlܸuNi hGttcǪ*Ν;>>> J0`-g׾XkEmwww#t钅bŊ |\\… -)̙3DҒ}&-O4ib}X[uۙ\,ߗ6P.]-֭[GwDy֭[ 1.!//ϸ-[f%hi ߌ~JƍMnfSvA%$$|llEÇ E}QAYr~f">o/ϴ/_3\vM⢪ݻv*o"=;sĉ:7r} +11}k$.\BY1)va|@?UHƽKVW̙3yȑ#KHJJW_ŋ.]/*//n(rrrj6Ǡ޼Z6Q[h46L1cP%ƂX5jb$v;j#J M4`99ޛ{r}>q}^{.kf\:˨ŋOVuӡG⥗^*S|*Wfب>)SkҤ5ILL4y1/]d@ sNJ䫯H ؾ}f"z#ٵk|Яك*wOOOikXXX)k˖-ޮZzYsΕ_d4NI˪?~\}7-#j kĉ6AAAzHń'mZ|{Nczz 4nٚׯ8֭[K[l"]̙3ݥUV]b… ?#W;~2)&A^_}9aݺuB%cǎYR3-b&>YÆ >\X͚5b-Z$Xr򽒓 d KN:ѣXLdC ,yC*FGG SZ5@f[>lp:ֻwjOVRM4.uV?YC1LO>YKYh!!!:u2J:$/hsɃ&'OOڡ~>u&l [,iӂ U+z2#%'_SK3y*T奞h<`H<ᒞ={v,SSS#""fΜi(BNOsg3ȒNJJ,3|Qob 6mhBӻt),7Hz̵kjժe&&{Bz,.l`ꏒN4|%A/^=< ",rd>}Z\\zոϥ`>Ȫ_3:w,/_( (靯}wCBB4W)uYG\Gx4Mu& .2få Kp ZɇGii]kXU*ozyٳMm\4d)&uY6G}wR3gmذ}Q\"UR, (Afv2,9uO|uy(u>H^FL;t^lv#"":C qpeo^rdO-Dj&!մJ|YΝmHvvQ<۷WϣS%PK.27ų+zƟ^\%EfB4 n|zȟ!.Ə Ad<A,]Z=رc%|{ȑ#G4 8R- \~*U}ѢEb/_/[ +""BqR%H +((Q >J*oFiE5uT'f.%>R7QY 7QT_E] K2y%Ȓ?o߾1Y]q1۵kǏ Ad<Af߹cǎ]]o K˗/ϛ7O]:xg%ǎkc9Ďkϖ K:K ĥjw \R:vXM"Ț={!)* '0Ç՟Y&U޻c,k+Fڋ+XLfddAY-Rwn߾-hڴ v)_;K86 K39uwر^ g/^X KArfΜWCL0ai\' kAV``i@ , +j5KVREU+e7n( ٳ#FлO|epZ]7Z8ؼK A՝QF[Zw|5c ^_m%%v6;(:?(v6dW^Zjf&QF.҃)$'' Kh pM-4dkK^FrrrX9rI&{cǎ2_#ɃS|a۶m*h/'G d;OveXTHS(y$?Y@$Y:tP7n믛Y]v5^ܮ Kw)gZVͅD޽+Wnݺʕ+Y%+UY {zɯ`6l8ځjFYbÇYa仼˥?`www * K h) ;"|*T3ψb7JZfק2~x({=A͛7M~jo^8lTK+;w.?Y@PhذΩZ&N(/SV-34,1te@@2ovL%^f]l> f'::Z}0Ro!!!%Ț0aWvvv.8Koj>^o}y{Ŏ;dY}q5gi;cpo駟G&3!C+ ,4*,,̠YZf&!k __ _~&I3pbÆ gq*TxAւ MBUx嫯s݊+WԫV |>(hirQi/P>yӫ*44Ԯ K ""B^@2҈iӦI%SS d-\q JJJ̴ZfNx4|O֭[;v@Ys)UQFY̙3ܹ|yyz%\]Lh!7E^FȞwBKM6EFF GWߘ1c5#@M'(_HK}jBY*9e.\iN V^}ȑ:tz׬V GiҤ𗘘_ի7xWwڵ<]Je̬m///I>|X# (TQ=Ƕəz@PTbءG[g̘a挄w.]Z,K~ r߿xte Km 5/V-/RR%az>44L{PWRg7刓AVݺuw-ނe˖c|.xXXb>}˟B,,,BŊB!ԝhcuq͚FJ:uJ\x1{"!ɷϝ;Wڹsgq,a/^C^xEubN:]vZ8b~o1s^5T_~eq|#)** Cjjڴiz5k;vLV@6lPnB {;vbTիW/^,h1YcG cvbѬǧj"`޼yɃ./ЩS'uch|===wa;nݺBIbz [nO֮]b1XS2ނƬYFU}ddd@`0Q$%%dU w),=? }iii111_rssv mRXXh|yeFqbIJJڲeKdd+;8zhye8ڵJXNǹjժȇ<N:ep̲E>(kݺur\pMM 0):wRѣG5 p8~]x `*d\1A8YX{Ŋ^N{v¸d\1AHlrs,mg~ع;cgn;t{d3t׮ߟ2%ڣas[2 I®爬12 3m1|{<.ORutGa]7L5hЭdY׻ڭ]?op(AAd!""""" 7m?gniU^n[A17 ٖ)cw),kN溵8tNKI6mXf|:zpO^v a;u=8hG^rt)4_~yu#?Ҭ?}rr.l zi,: 9qK,=v! ˚: ry;cfl6ugɃ7x˫Ѭ̟Ӷ۵kՊ<&n4&`=;Vh<u߼p„>H>>vFǯbŊƏزEukV ^˶N,,,DDDDDDt +>)]B.De=:HmDU<(#ue۬YKAV7Tfu#={UoP8vl~~Y߶X~Z~1?r޽;u!_NJEU*U/iTK)sדY2RRׯ'=f9}#2o$1/r!܁\$3=5W.9J,OEENd-@ṱY?gSjϖ+~oE,)nnn+W,W.4|G ֮^QJo7=s7Zύ{/oS77F6QwFim}ڴU++ҚYsۖ`y`5~{[+W,Aڵ[z5Mjˍb5k ݹM,v>l˖-{}wjzakfqaC4l7pwwI#'""BDDDDDD' }3{.9),gh CW'_?=JZv.&[sd8~XT ?zFVReO\YaC^^PاO~߾)\ ý{?=H{9cvR~]QkOy=}{ȃ &_~p^WW_) 6o7M,VmK /xZ2Rx5yqUzjo˖-q7VVM(W^y,,,DDDDDDt kʪ#9#3_^}"'(ܺ-2/4: y.[李ϋH̻wY1i}&mk8Щn:fN^^A9i~Aջw{]7}_~71=zddt޾};$iAV+VL`&â3>]'ץYW.E #\3>Ǐt!Rx=!t}.+=-%Q(wIYYYA_?۫O۟hKg.;M2uͰٷ oI7D%_OB9Sy>y+V\*PZbWW d[gڣgOދ<~vo ƥn}7ֲߦM[&gѵk)UT7K)\N_*ٽ[S&v )'Pp =_x]/~Ӓ&\#*+OEE9penvn859Z>ّyhڂ}Xw<㛰]Nܴ_{%6jhР>׹fu`Ŋȥ/vss ޼邬kstvf=g+޿y{R2aGay_Koq墋y_Knv_oLEuҬYS)\ 6ol钯_¥˗7*!""BDDDDDd >y֯%t]?11秔oz{~dbn#Y~0A֮^!>ؑj0~qd ._ zK }ժ\w3 *(H4骯JM_~~8׶ه)ڵ#y%QjnZҤWb+Vxa1,ziKH{ƯK`z[2Rn=\2ow[s,c;m{ꙕ`iI4C`J,,,DDDDDD,_Aփ>ג{~]w6A [u8sEky矫]VժU?f<ȒoUeo'Z_}5Fjbz~aâ4wqsq_?qĢ .F ۠/3gʃݺ `Ν;~4|1^.z_yERi4 +!PpU_nmٲEnvz\^o%g`J,,,DDDDDD,wA`%c#?{t[\ Ϲy1^.{WoFzy%$׮}gbrLJC&v-بQ_{mkW:37ҒL;7"GMKIB۷X]L, BDDDDDd Y{tPnvFŸ֜LAqڠko ˚9}wݺzQDyu_bE {y Ѫ6oY3̎\)m -˵dg[2RSSE41!zbU(# g8Y A5kF/2haC1ŊQX S/ۧScuFEEO"""""dYs2-驉IW^pB䞃'"Ξ>~R3:*\xEx]*yg {=1#/bfh?ѠA[7ˮ]]ϻ&6iR4dȑڵws'""BDDDDD';˵ܴe_OINHL{K"G .".l%sxA_GNs/> A,DDDDDDD$2xEDDDDDDD|,斖OUYYAV @ }{OX㥈f }EV. endstream endobj 1307 0 obj << /Type /XObject /Subtype /Image /Width 1603 /Height 822 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 2826 /Filter /FlateDecode >> stream x۽JPsb%hzWM7DAB+ub?hAHHN!ᅓ^H.'D@r}ve@| _,˞$5Ɩ\"P @(@)NdӍLDTEcյ(RRǯe^} P*ߥޥP**7޿> Jۓve]ƣgIg;J ͭX\ Q:þ0./΄~+@A :8:Bf a endstream endobj 1315 0 obj << /Length 1991 /Filter /FlateDecode >> stream xڅXK p$W5wO!-F-feѡnuUA .?;q]Vq߇X'Na5%˜f O_. JDa%1>i{>t:.q=:ROCdח}ZE@U٫܉`/dֽ;N+}OTO3Ś׿0f|Cޜ&ꡕc=l !Thx Z}tW2r @3#tVH'Paq}/"b\'&V7_T0Nh>Fw `r L#/An[47I2B] dZ8q3ш4` VJC!6_ bE3=4A^T1<:,Ev"16P6UW#aҪH+ $KTalZ8iigphO܋& uH7)!/JPEP%Re E,pb cnI;}bJ+U-CrdKI %TCc6$njC}' *vvZ%n-U=WGiqNRF|TCBCeςU.D.s z8K#߈"*G] u37|($Y5a!(=G} 4Z~L>R,w6\. oufH&Mr ST|źy"c^yl1X@QIDynPP8㵯Y%~n؈%d99'긃[TR$ïbY endstream endobj 1310 0 obj << /Type /XObject /Subtype /Image /Width 1375 /Height 798 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 65359 /Filter/FlateDecode /DecodeParms<> >> stream xw|SUlҝA --2Z(TDTAPP% \Aą> KP( hi)ni6m3I$M~In=ܓ[g0Y1{.-%h<. "0D︟:YOOx&eYe<2!tv_tPz8Eѽ Ã8T @kAD"VH:f""Ɗo%RDx*Yw@V˽DjTT*aVEjzpksL>,_/0Ґ7kQBk2Macx _Q$&^9t#QuܼکS:PSS0 98==dmBw0qO>1\*L]stshIX-+/wqqe WWotʬ?] G ~+kR&Pz8uNZJ<!s/*.H>W\RTV<8KOϼx\]m;PvG%H.)p)j)7oQX~|ڥ4t@HG]ژaqaǝ5 fj //O''G'GKOɖ纺Œ,0 t&qYbHfڐD{s"䩄l9wvr/ΩQQ~~aSOЀJҽTTYF tVkKbRַ@ VT S"(8(P y8)GTI7T7<)Eu TVg>KR?_7wDWEh}.]G.%"H%ctߤ.*J-uuq1l0q3AmtiFF&^׵!! 3/ʖ avqqjjfA)./: U*J,I<]۠9 c;BapP`zFfAAy{{Z2 pΜpе;bW::;YP./>% a0w^Zwx/E[H?QQܥX>TxKJ*ek bvꈫ<WgWgԚ۷]\~1h.4QY$"77ׇG3qrrqW8;;UP(dx DDTr!R6'mqgemr!ZVk}z |?_XTVV^^y*+*33#":v/^>4" 3:f&O,+**N>WVH(Fۥ;;;CdMGZ[:u 7 =َZ6+K^qpph܆3kmN= "=)PofM vQS|U T]eHRV`H$^:;;pۥe<O"qADRtУ=wϿ蒹I$]_ /,31a$A>wbzFfzF&1]"+ <]]\Xٸ5m.`ίo_aR7ٱTQRvmt# ۵ JKPT ELnp3_/|HDa[!Z[݉KP4 W@kT*X,jGJUSrp,Ǎ7Z jjTjnwF*4ނhrɆ4BQlMM,{kc4hGկ( "2̫*"9V` D"HlQ,b ÈE"X%iB^w%{&12CGɺVxZъD}, FwD{qB/qKǫanN?p:_j*y<*:3ѣ;*xh=>uC wqt7:@  w'`y GВGDrBQhmIн b-07(045: ?~vCtCtCtCtذϾ333/<4rÇѫ?oZ"'`䩱ݳNRԪ#ܹM6ѽ 79rTV}ΒwwwWe/{^w{-[{u{^ulyNMuM4Z-+簬 K2mn>X{o_ZVV+{7Î&3}?h֯o̻_H$okڤj:<<&W^HLL ?=VWҲ2Z]^V/ e2;f!<\D)bauvJݝ|}}eقBoo/Ϟ9TZSS}FJ``@@?.z>-՗ط[ii5y葁ǟWϟ𣏭^KS^d˖323+\cs3][v!kɳ;w1u "?41 óz'M{KF?5~Qڊj3g.Z{L8nE#G {cL";6o;~H:ٳ[; ?uʤqܛs֜'O~ascnjƍ}j/6/--=zĖ6Zxv{ jslB3gBCCΞMmCtggg[[._uϮ..\|?S>>M@\gcg C"L#/_үoLbbRbb_M*99cI>0i&Oz>vwWLt ѱ[3g333MrY":s&oL uB7)WW"իgǎNğul;Sͧx6~ҽ{We=V3^{pKqQT*oH$Çe޵{͜]ߘ3g{Fw ?X†:NX[^^EK,vGTQNNd<8ζC&>s6)>Dnn}d2?۶{yym@WnP?ry>iA7^1}VZSUUED%$jSSSsۀJ jyDV7n>)6V Q=ޞ OWU)w٫Jevۆإzw;??81h pDkj Ȩ^1+Wf׫OoAaV\vñ>c]v1㴩SN[&&7¢qcBaTTTFD}F+J [>6x =6l[.y=bfY3 7uNMnc(ܼ|Oxh222tk >(tv*'L2yذdz}|pZǏ4mk}yڇGR+ScR44 6>Ahhku6]CJbXK e::Po,A$zŅ@wP `U!:ڙY0`z ˥\ʬtPMgQXh8""b\>*@3Y 0a O<؋UM Ah,9r4yB3GQ*p)S_0aߒ>w.WWԿ :xȑF FD6K!%>pdW}''Lj bUӦ@Ym_sXV[k/?[,DIJYsjorD $"?W?/Xܳ0 3o#1{&cqŢ?uʤqܛsUg.\XʼnϙLSǙZ>#G=7Z8 ۿ_jkׯFͷDO?nSD7&P._|_ߘĤ$UrrrZzFꭴɓ^$"a&gb]Euqv =$%_Ar7WW':`kZjY4x~РG zN9ҔĨL:JEEDyӆ_o_aܷ>|.MDbk x<ކ_޽+˲EERT?W]匌VnnɃ9ht0 գo{amx&@+MD<;/PRR{+6oll_Zy{ץ1ϲT*eeBNNNٰuTaD_v)*,V;܅FX|X,6״3 ǎGzFnܴY=.tID>)|>eYCY-3Nğl9*Ƀ֊X{"MSfX|sL.7c4Lha2(4q_=kaSSWWW B__>_W^%%%eAm,j??YJen^~Frvvn0yPC67yʴАw-oII9lē{ܹs|fl׮oADnj7YPW2CǏ4mk##@j۫{݇ `g~lE888m\o2L&jmxVR*Q 4^՘C=Mԣмlw.;}ڔ6m ѣCM<"ݎB"!O#z[Tp\ndۼJ"8iz`}jxh=AnZL}}㜭:kAt@d}@twhXDtoV-y%qH|oh{ˁHB4ԣ;vXbEYY~֭[;|={#hFnlձZG@ݙD]`!.]&ؾ}{キvZ 6:u;jԨٶ}srrl,@osk/[foM C"Ѐ1{H l0&&fݺuf1~W^rERuɉ***===HT˲999<^PEJJJvv[.]BaIIZ}vvvX,"t//;Pk_+Wm6((ȸNNNj8۷׭TZZCb3˹ ^#B4} 3Hܫh{)޻`nB݃#bV-5 Dttt\|^7n5{zz޸qo:t'f̘NDڵk_ީSӧO?S9,;~gFDDz{{>|?yg}GFFn۶m'N IMM<|L&3.Kzzz^r壏>1l7C ݻѣGk1y ]=zd+WO{?\]]Ϟ=+J\|K^Qz &Meҍ7g ط*dp!o09sŇDsx4+ի7oޜvwM4i„ 'Oꫯ&MT*  SSS(...222..NGe{Ů^zСҥK;w$+Wviɒ%/^ܶm-_֭[GIMM 裏W… .]JHH.\ȲILc@:ϕ+WΟ?>sW\qR駟T.>f'&gm/۷o?~ʊrZ<Ƃ[ٶ \ ;C3:\GА{9jԨŋ k֬|2UWW?}ݻw\\L&KMMw=rdjzݺuƍ sqq1Yk׮k4'Ovvv&A)\XC&Ә<΋/HD XtkFDb8::ƍ+@}:;[/j slG-Ypv`]QaAAwX"1DEhʕ]v7o~KVV[j~KttA<==ccc 2s̲smݺVOWXz'~'e2S~~}u4tuObD"5 W4;BpO9sqyY g?~iHL+fk[L}ej z  )\tC/¢E̲-[o4hƍ O|}}Œs2dȐ!CT*զM&N8l0ggg!~֭n-Եh@0S!E=0\^N惍Bl$= XG-`aUA5 6;`Itw9"1ѷD/r/^óXto 87߬$";j(&&o4h.X'גP$EEE,իeٌ "y_~i~_#(u@]}O>D̒Dh\y~18ϫ>EX@] xw"whrс3f( ׷cǎ2lΜ9H$uttҥ.:PQQ1p@}mVׁ,WW7@H 8 R9o ͛9s1]Œ8~' xDUD "݈@c*F`2@>Rp4nt qcaZƉ|~cAa7ۿ]HuK)(,=sss ۥDV $ EExxP(-_Wp}BD;2h'0&1 W{sÇ~0e hGVm;tԇɉV^{y'qqq&7ߚ!<]o.[3I7+++7}񹃃W4MfqRvЀnFOL  Պ DZSOFDD~h4}p+-]tSN""[7}[Ҷoo.[9.V_xqJc#G -;ػEmIgHMzM3_CBbZ"'Z"-hDq :д "rvr2u+-]Tj[Cwu1O=IDB0"SfV>JhZYM#4Iq&*o#O<8' /kg$O :Є4h<==(7/WXPY"ܾYD(Db\BPUG -;p?*0̾$g;%?1, sD)DQL cx D%  #ݺFz+''لCJR"*--jsw[;hЍ@ԫĻw4BJYzf')F?0WT~~UPXi!݁/<4rÇѫ?!Z93fLo2?crp+ʽxyyu̲\^~~Hvr޽}-ٱm<7vhˋ=yyݻwӽJݺE 6gNDc-/6m+wwwWoz{3O~+- %Iv3^^3^-&MڵkلsII7.;gܹ >+8(Rݫw)w#//Onnnnnnh́>S_&ML(.Р׉& Q=j[i;wzY>DIJYo~նz9O:md2O9pb'>g28nE#G {cL";6o;~H+E"6}0]1} }iSL8nwp}4;>g&ܬh׮ja2gࠠGXR\~s$&&_M*99[D4nܘ:)#,,,,/Wr]'a={h1Τ|ΚqoٯDh_t ''}h4Q*-**6"#2}Ux6;P{,{g\/OϺvG b.QZZ*HtvԀ ۺv1cAmaKPs : ?Ү]`@@VVL݄/))ҥ1 ^66,&#`+JeaannzZf#h 43F<W_IWEB\E5RYVV?W,|/~|>˲ryeddN.>){f0>+V""kZ |Ҳ2<>߀5ݻР}[cФo 9@]o,g~}oKƌQ/M>j.ӦN9q">"3&If̉TW0QbV^Y`O?JY5&J8{o&_3~}x>&h V?YP' 0Lh 8O6Q .W֏u4X|GP'Ľ=/ɎMS+X]Zőƙ)?~5HQwjZ)C&<>?I(0}xm,_m}}L62 =5"ؚ1{,@tDiQe~rY8 6[[wcia# Ut@Rh%cCL}L4LshU5Z;-:JXށmfq09cQz@tUp7 Hk@]%0 :;`aJw'G{B'GGTjy?IDR]Hcyo"Zdټ?iT*UyJͷߋD޽87ޘ=[α3_Vk˖w|{\]9{<|)ā***}rttq'UMh~F܀}ϑiXwT{Ж1#@6zkO>1'֜7l"oܸqݺut#911Q#hS?ǒ[SLҽ|yK׮]7NÎzml\.|J1II~55d7n+յFͷDd8aO9::QߘB\{6x{9oz3gjMJ͛7SkΖurrMrFQ(Oh^,엮OV+=ceg~8~f>gԜ,^-m>-j bV(((7m6zzz}Ç D$^Cx""JJ轥ZVRZ,4r,zZmK>x͏?O. iyIhjk^ qX K Z^ri4Mʪ DPaI/MrnݺnXN(ڜѣG322O~fϯ{+t[yn]t@*TWU1~E___V[PPMDYr"2le/c,>>>DRtO+6oll_Zy{u7ڷeYvzWGw5[6p88RID^rE,f2S_voZP`ر@]gr8F4M ݼiss >pEbqWT]USSo:#DV7mޢ;99EwM.]"/8j>[߫g.R`|4ibX8KH8ղor/<'-=]pq]0~;̳/zrgaeg320^gINN),,rvqj5;ޕ-'"GG)jEmyݝi2[#,\xf֪N_+M&mj~y,궽k/ClGϿѬY3N<7 Ա>ʹSN̄ |.];OL5/\UUΟ55}b y|dTp[&/_]xTF=DX vקǍ!>KIDE^^k>Xyߓ^zyGGAeL<̀`yݶf?Sw_5F4W_n`Q`'㲲<uljGק ٿowAa!C}hlۖ/ _J NˠT*s==<\]]t.y02ޫGΝU~~bf5|qss koK{zzQNn!޽zSw߲嫣JcRf t{iqcӁ871ay`cR Ƕl|~۶+4P/TNy/Юm[KFU@uo8cYvݺFzzzgeeP(!eY陖ƲfgDo3h&dA}'9,g`?;~8< ü%K?1ze}|-} _$qpptr,**,DBD=|=;vb:T 4Ks h9ʤnM|.]4_u*BDmo\\\0~./ר5>>5#D|6T&@i[rzT,ɖx}nf5 F :Qk fa|[6$̶9ߐαcAt8P̈ :`Z669nۦ|Cks15 GشfcDb?VD8+umh[xiIٰ#Sw&RmA4hfZ6܊o6-gY7[8ks;:/3aAHMZV(T@sWvGg캗U6p†-}We]?&Ct㰠,FYI'֕ [eS9/3;q6*Vhv[ݰ€GnKM :3&ڰze5DҴ٨/8h]Z- `ہ Sl*d֜=):@Y`' %=JKڪL8+o[2c X>˪He9c}b@#Fy{^A@3 =Z'hԊe_Y#РgY3 lx{3n}{ [cqF/?Ox Sκַ]c~>"P @x%HTԹy"㵓Q%&@x# KiZπIXꄥZ! PرcGjj*999EDD=ЩSOD* tY(ӧdggup{ { $k EBTS]U;D,jܹS!4`(22r"xرc5Muuݻ###Y?~ٳg#"" >l&C3 FïyW9t(rr(Y׮]HNNsay\7dZ5q]Тy]mݺenݺi_|q„ k֬!W_}uҤI/^zC R)דQx#N-`򻇄+pTuh/]]J "UZN5"F=Ji5'3meI.I=x<~wV0Tu -}3hZ]SU!8"N|!M#:@F=믿޿BO;utƍ'N̝;7444;;[&u֍7.,,|<^fE2 9Wת49r!1KD|&PlK%(Yn pץ*oR)1!.Nh^'qAiέwx^|MB;ώ@V""|[f d*4R'9љ+ZenO}#:`K ==ц}G1w\'' HDDyyyK rss{o߾O?tŊW?~{;(E%ͮPf#{o5_)s(=Tj:'-MS]"*-F٥SLVkHiT<ɝ㨪8V, NnՊ,KE;jTXV d^(SWW<7C-]OL O۰At/F;~ +RVIĎD x<~";V&bdqTyQ{}45?ou,M MǸhaþzݦN^:|{DFui}_F#%ɞOHб/quq:~I~QEnڐu$ne>կ y ,\S.ז Յ0IXxNLV¢̀̀/4p{pW/U?kPߞ gOY8{W3'ghGTv c'$|{"oGN䱞9mmu/7q=jbl8v *O^1y3%՛~dܴ5U ;q22OK  ׫ GQ{Ms1s /*SLP5}"ؾXh Ϣ ?,ɺwRzesj^y3˩?5̴Wmkm8{kkm*Zf R)+ZKCK՛d]$kK%?m%\= -|C)܁k׮b̘Į]fddNjD"+++ J lڇf :ȵ̙,Puɋ1{~B-m "9-185Z +l NUK_T.70VԎO?qҤDm~5#>of "LjkmED߈$rI@ml)mjQQS)*Vgf_TJsMJDaN-&n?<_K(.!txZrU2rL =}AD<-ɊYEW'g^Af",[7|z4aЈ%~z|/Y~B6Uf+g(7olvɱYlv@Tܼ옰?Cr0G?RLj.ɔutl9\*deE"Jj;#XE?as8,"]c\&Qg!Y,ָC8:1唛ODzQ@Or 9< X$əlUU5Oˤ,WW7"ͭW7^NO׭C?cDb2yq br9r@".ͥ['e_>+arrlfٺFOϘt"DLJNn1OUA;*NTVT'/ݽi%?>!Y.[[woZ ,RF%Hvn)품Σ"2n~>%'," "X.*mf@@5~G]g ظbG]۵n̰zȿ`}MD<U 6ofg^iYѝ\bYl6MD<;44@,f>;%9}Ykn\/M'{!"M]3:2ZziJ<f&O[ג^)>ZO-XLJT"ne3k7q sWl 6944UpGCD*y =d='?n$ӗRT{K~3u.Wfq0n+{[{[f;VUY@=vaJk,rl~ QJx!SLKD%Y)o5MmZ$Tjf&cl6{/ܜBSU"*g$jief L(6$HnѢʿgd$ŊKJw{JyQ\k7Hb,[V76[zؐ"bbDEBcK;-씷:r4%6R-,Ղ,L&h-[=«Ru& 3% ,uϚGoyPNy陳9ҧ/ʤLQU6\"XlJO*lPC" ZqITb)^At@Sw,SY/Ч3RlIbIUUS,B=3Д؟lKpiH;0ݰ s9j\tN4)L-&ļ%%SS[!40[] :PU}dr""¯"P1.FG?nddԿ*GG"*1~~~C ),,,˗YȡC7UhR|a1>F/_yI6.ߏ{Ͼ8hZbkkvZ\.J׬YӣG&RP. T%ua///333TjccsIl`wjсk׮)Y,"=(([F277v:6CtSAT+VVVW\4d "x :Aue劥YYY\nrrs%bq^n^JJIXܢ✂,MMMXnoo$|\(3--MWWW]]}QʯX’}}}"***533%"LnbbfWn;;92\nNFFuTόYs.^T*qq/n޲b޼8hE>6ou3޽LN)|6nLQ7njTzrSϑc ?ӽg" |cHU6vtt1sK ?!Ԡ8LXɖ$LJbe2YddTHHhQQQW/((`)h-+)(77Y...IKO7<-=] GX,Oiy-Cŕrg !?nY .W\>| 4p AAU g]ѽ~'X7׎))o,=o٢ţvvwV@) oi>z,ttغYGGֲ}P mk׬~QxDP(. u"tӉOXbiN/w#N?zy7{' |1xygN#:zm^z|Kb< :P:VVrOOLL ^xaXX8%%ȶm#KHKKkg]h׮T*=˪^l۶=Սfʫ׮OGÆyԠ6m,3񎐐?~D[L&_'N͚9_544~?tx 3gL]tX,4y;C"7|_>ӧyу6|ԉLѻw;~ uvv"׮wrsU\[Nm3~@s;fluЮD֭[}>kzVINNa{~٧Hi׮L&c+r~H/~rR'}{Wخ]:?z쯯ѥC]׮ېbwkdga!P  `,MlaaT*RDԮm1TUU߾%ԐٟψzMD&&QLLӿf=^$ɮ߸5ޗjXI9Ntt.{wHπg`@tbXr?|Lir5P/]:wxnݹq`UUR*)kǎڵCF665hC'WN1T~UiݻwrYي +**QjZ:|bgg't \<{$wZ*C%常t|ۦM+7W?T /_Q MLM"#d2]:wZqM\\.燐.X,a{Չf;s}.84uּ#IIɏ_s\L&_RS*ҡC{--޻_>*U/K.vt3559y򴁁l( ݳ@_>sw90k"m۶Szvf4 ڪu+r3TTKMM.3׮ tTp82<%5xZthsמb"Ϟ)P|2wAUsqqѵ7]\QG'NouJ4s8*rpR)>^r_{ SR uuuU6mȐJ^b*{,[N0557f9f_>BBUU6ᣍ~ݻ.4h?6kвZ娪iutmfD.Qaa~EMMM;f XƶJ~?!/|>qW~~@W>WteåKV,nٴ(-=@__1UA){K%eWUafrΝʖM7:]'jSU'>ıMMMMMM ud[>|V+:2Ѵs˛MΈ E'W@#t:h0@.^xheeu5AC"_S,455O峲F?uuuOJur@=u֕yǣG011qEEko|̜o_ (s/]eddmTq+ 噳\v^U^*%&&dzURܟP~~MlǫMhN3<,|oaT[.+W,U\?//?,,\ 0WW(E̺%%Q_Qbb7SԭիdcR5v(,"zg/{uE_/Y+z2=]]Ziii[䄅6SQQee::=;[hQUirqqqRRrG)g%dyVK^?תo1)[}}vͫ,#"=GyxW9:{w1GNԫԞmߊvzNOꆅGܱmWB yӧs؍ :=|xي䉟g<4Q#=H.,Y1dW۾>K޾|y rnxD{?` ʖyffD$[o^ԋ.^SKKKt8"ZӼ|\._ЧF= pӧ>uJe={ x!fϒϞb]BP&ȱRVQǿ{ԙwԽ{߭ \qݺv!'N @˗bTn7D]D֭+EDD^x˂>zH4hW5üֶb\nUVILL ֵKXXxXX8o^R"d=z$%XOWW"pllxE͛I1}jHHhJJjEW5贪Ǐ[,ݪ6zԈ'OQQQ_]5*/d7bpf'"&L""55vھy:s{)3EGQ֭>5Z$'=SkF&1FF̂{=-^`OJ5k))T<2FD%l+DdblQ*=#=0(0׉(-=ܬիtZdgtםUիG ^f?d@廸OǏ8hhVV߻;U&ʻJvz:~EMMM]]]1׀ZI;@tCY(,\.g|L&۴q]3'3wڽ{WX|ĩ_/իs:?{ĬԴ0'7 $%%U3Q޽KL*1MH$"s3ӊVz;JY%%PŖ}1$_ȇXOjiiѹۙ?ݸyk~%٪nj&&Q2f .;߸y˦ \.W.SW׎HLLEllTUU[9;Rߤ9L&KLLj>..:XYY:;; se/{(3{555yvl\\>ejӮ~Z&ܹ۵6feW711JKurzERn/l3@cnjiŬ[W}xW _KWwW v#||3O[|#ڴnuđm6\M.=LM323?O!55mƬ\.W[[;--+oED|#G{ |D2cȳAԁb}aYs^.ƍP曕e^b}iW:w),,;VUirَR~Ka;ZV~ww葉ֽ[}}Duwzea7PK_~1ޜO;)rԙ=3iڧk Fj=[e/ĭT#CCfd2YRrX,曛+KYVVVn^U%HML0tӦ 4SS'JKOgب5贪TK}v׽]];֬na79Ω3翎 Q~6靨_trюq{ig۬ l6](f ;;wfSSSJ6 6hw6V^{ٳlkN:;6!>Ј=zBM]}Ǐ[ hBVZWFl 4u4u2nޯ6_z} A U;L9 \.Z[Ф:ۛT^VC6b :P߰ а>.>j.4u4u4u4u4ugA}qh"xY,ݺu|Z<[uOKKU---??rС3gΤ<|ر"S`rrrxx}>:t3gM;P/_x`ٰ*q唶m0_3K(9%%##PXHDK;q5߬ 166:^GGUQ=?^&q/kՊd$"DM7l*w^!d5>@t8@e˖2m۶Rt^^^7o&ٳg{{{zڵkiiiDWbw.۷on: "dcƌٺuƍ7lp/ۛYlԾ};qce}fc2L=fddQQQQJJ*616&"\dbjF?-=)D&ǸmNӦNIKKۺo]wъ!ɒSR|9*&&&66֊bKutKu::̧\.OMM#"##C obcؼx 90+('''""B-VE8޳fΘ6jԈظeR,.>.33K"XU{̛*o==wn$2"y[P6ݲeK]盲ܝ&DWB̔Yk}efҥKBp펎aaawe2,^.!!@,رc:::U)TTTDD!!!yyyٳgRlPEٟȆ MÇU$NljTk"?Ϟ x0,,|ɲaL77ןvDB&Nܼ[bfjڧw/" 8rxxxr[ao|鲕 ۶m͛)25[yyD4y҄իQ[ t#>dMMMGwztѡeXxVZ~#DZQo߸ykKY,IDKDlQ6+yUbu77\;αae)8R♓3sB۶~ӧDѥ#s8ݔƎ}歜"|5>hpybcckv!CΜ9ìQJJi@@D/^w^vN:U㉈/^~YUܼuOO_VI^cu+/fϚ>ͻpʴacƌ:_o^O2"ҥM8?XZZ>qVoJvV_=jDo^D}9 'M{ZZZ5[ظ]v)$))9 HD 0`H$ڻwĉ ]y[˖-mllbbb._ìLl^ d1һ|7}\r9frj\v#++bqˀIOvdlgM'B_\q+//Z-1 "nݺyγgAi/_;{z+ձc_I 盯X\.vx*͛:ߔ&OtשzJo&dffV4gсeڵ?L&[fM=|~\\\III-\\\d2Ն b@,~>y˗HEEE&ŵj,>+Lf+6tȶknFFIү,VNOMKW|4ظC u a%WT##3455Z%SYq-Epڷ<55r{l\wYEo|EQUyflHKK&&&DFD%%:ߔZlAD<yXRR^}4,^^^fffRɓDᡥk.Ŏ[ٞ={٣{ЦM"ZhX,?~ǏU|||Mk.WWT GCD2yhnf|}󪆆:XTTljjXE]MԭKN9035%"Pjjj߶*2~ h11DdnnVqKMmi""︸7ѨQ#ͨ>l艓Ǎ]Io3GJ)f8|2kvmOS*2<=`Gܻ%T.wU.GD8MiZǻ&6:67h>  ҵkMwtt NNNfXfffLb׮]322E"F dlݺuɒ%vvv,SrXX;@b~r嚰aABbϒ#F /,,|eHHKmwjnn2/{e"С"JҔfvaC88VKKuԴ,kOopF֘E'M(lŽ^"Μ{ ]T^zҵ6jdbl+Tޮ]۲ʊqD$_|ZoiSkVC眪nEo:ܔ m2utuΜ:VIfWWX>@t5&Rf<ccc SlPcS'z*$…YYYӦz}1~ikk\ǡ|cP۽ךoV*lloLJJp8i۶ Ue;FǟBa^=Lv Uu˦y_- y;Y?lɬUu q@_bYOvpvv2{5л{^\u) e==wtEa4Y_~1ޜO;EG {~Μ|OCµO >;,{~̘jhBKW^;oAF5$1)ehh>Nz-**JIM535cFܵ's+G!qqzH9PE#F}*=?qr{D"۷ ffΔr<;;;;;GWWР܉ҊK,?pukƩV &zsםSgy.o?NT/H[h8wRWWm֬aՙ66]nj=?UC}7RQo6qUu,wd&u?֦|5>h[yysPFFH$6tȢ_lt5_w7ٶO1Rռέ^ P'ehhh0@dgg_\\EY[73 ԅ‚Ԕ䄄W~DWp秥*_U iʺڭW"8##]MMs횚Zj4u/_6225يl͜\9.gx)z,Tf|M--&QOOĔΦan.(,TUUL\ W|ӧnjsiwww???r J326QI p8n^$O KOO3 J ? }"fX*\,̜[\\tŒb̌t33~II7mLD" g$ -;;\(,022 |R0pL./).ӻw+myLDݺիsgObfv={ {8'Q}65%9m\VV&T`BaS~~n.?󔁾?OJ$:? ;gaL6cN &:??O=EG~7YY7٫3'x|\?ޤ;xdХԗACD9c&iic0XLDI \MBPy~޼iխK;r/7PUUcXFƊU"$1%''RiZZEQJrRVV :&&O<244""aA>o`JDa s-hjߘT޽۫W/ХvN^tT(:с jjd"aa45@Iq .JH"7qo/}hiiž))):\ME~Q?eʤRT"J(,,TZr55_TǓm۹(RRblhBj Bfkjj1qmm"bBՕ _[[G[[_44:V4yoc-gX)u.?YаfdJD,kJJ)x'u \`ee*Y,sxXsZtdnj`mc@A~RRBUT[9_|sp@wf?8b޾^2U7bXķDEp1l6;&:Ĭ:lL&znـ]ߛztB!iI>:Lv__߂[[#F8;;ш#ƍWjj HN߭[7KKrK8~Q?pk_s"bvnnEHD<>+8  :|pjٳgBpjD~b9''ܟ'455DEJW;{R,JT!"Q8**ZZOO|&@ Kf:;`looo--gnٲ֭[NNN5yj]Y'Nd-[LKKf̘ѡCRRRw..]4yݻWCCT rpp(}̙s3fEEE͛7/""_z{{ۭӞ={Μ9yޫW^`vVs 33phgDS6H1a KJsr+#ߙа/_ B">-JHHx򥩩)f͚R٦OA&--|Yf֕]W,XYY))^x󭭭|>~ &y5jܸq/^`XLD"QPPr+a[ڵKܪU 2D?2ˡ}]p={Rl[-JE"QV566vppPlR_˚ _~ƍ}eRbqvvvBBqEh<WڱcYXX̙3gePu6mڵkץK<==y$lfDh~ڵg6m?q+# :rJEhZjU*СC;,0`̙;v\j☭R~W...>>>-[ܽ,X0dȐ/2++}˖-cBDbW^ݻwޜ9s-ZWTê744,)''5k߿J:""q„ /v>eʔ޽{[nȐ!:uRlR_˚D"LضmׯwSI=+T*1b3??γ6ʽ] @y~rr"}vV.jPHԱcٳ_vmŊ111+{9l2L&HN|'O4w Dʉ-[y /_ T3QkXu?|ذaTҗŜ^(j\v~ۛuܺu+::j֭JkSs}}I&=zذa[lyaGGo& ԳΥ(&SxzzzyhT-[ׇ0?V4'_%LOD={lӦիW+O/.}߾}󓓓#""bcc̙CD,k޼yﵽ_8 :uA Ua}񬭭-,,RRR?~\Q6MMME`|xBB x<^jjjNj>lذaÆѭ[ tO?T9۷o+gscu(++!<@WUeoo߼yGѣZ+)/{xxT^9kk낂`,22رcݻwW$?~b)cnj^9::Jr-[kY[[dALL˗srrs ӣϖuR~Y[[ylFEճ6VVVϞ=ڵ+m+t5\YP[8p`̩۶m;yw]=p@bb"?>**jСHwʊ[vk͛aɒ%Ϸ'5C2ܹsbٲk̳֬b ;;ӧSN=yO??Mfqqqc}Y`so\+JUTTd2s}gff~w.^FD|>իW ճ6&Ok׮lLq.]4o;())#"f3{t5Ç:uj<ϯԼ}eyzzv~„ wV]Q;;vL(Z[[0>cX1^{Gߗ/_nhh?s-[ԟ֭_**Pgmmmssqd[޽{U奏9RTTdff```pBLfeeh"777''A?=՜\zpҤIׯg\r2[ZZZb@ 066 ?ÇO0A*2833] dʂ&A&]p׷vĈD4b//qƕZڬ ~ֹҙ1?<===== W+(/QΝm#ttt*OW^7((H8ҥKS,,,-Ǐ+5kVnJռVu ͎NMM233c&c(NJ/^XPP`jjx[.Y$;;Ύ[Nkw޽555@.tU9QQ=+瓒Ba+nӧOGWME~~GXXW6mbcc{o>OO|&[VEm`y{Cfy M?vŪSWWwttzzHׯZ6b5k֬>װ~S\xjrk\:NUt5,Z(!!˗ok֬IHH(mZZZrZZ+**zefͬ+O/X,RSx[[['%%|6׶?>5YtzYUW?ލa9 :P(ښ׏=x:y T{ڹW^Ml5tio/6:C}OOĂ+++⮃[o6>**99ǧD|ǟ}BCCڥNxx+WWW^y<MKEE5kl^ږ0qD]vS/٥X"22NLAܾ}[}h:ujllGffÇmmm:ǏڦرLLL,..:}ܣGSN&&&s̩K.]ti˖-O>To߾6mҍbDGG]V !d2G}ԭ[Ǐ2w#FB(J77+Wfdd^z۶m={ܴiSCjbqDEE]VBX[[K+zbmm- Ӻu:!!!ӧO>}z#P62}駟 ŢEco1ޅ`TV=zモNCCCL믿jI@ukRΞw555_~u[hZ2eJxxxrrG}]k||ٳgn:|ݩB_|qҤIƍ[|s紗˗/9r$33}ŊK)))gΜYh?߳gϔK.ݾ}{ǎlqqqIII'N8t… /_{ڈ'N_>""B۴4Jb1]vm߾ٳg?{ g[u .T*__GC[0wn#Ȁť&&&CUUUnnnk_ baaѳO !nܸoKsIJJNq:u{KKKJe[l6nػwI&j!KLLի.]ZSS-2ei~{```UU7!I/]6uT)[^<{߬#F$'''''WVVJWMYaeeUVVVV5ԞzDl|8iU q6ҫ iӤyCAR !tIm,-% BQ#B{򌌌ťBSҺ#ƍ7n8!đ#GFcǎ~Ǐׯ_旞vJm6B=vrrӽa``tRmJStJŅW^Z(m.}n{2 iP62uzh\QQ6o0@t֔_P06l+/-4յ&77Wzdr劔؂Fѱc+W\|ynݒ~.((lnmW^=;vՎ;j4 6x/tO<<<曀me2vA~~6AYŵܶm> ݥ5ԫh~t=))iB޽{3#"3<25а-ã_~^mmZ^dGӻyG}y޽YYYFFFFzhʆywڸqcNNbݿ{HHHaÆBڣGJlٲ 6DGGKqqq{ץo]v !T*ղe˴ϟ?Bjzq+Vlܸqٲeiiʕ+wp4tTVVHܵW[e@qWUUU7n())BHv-'в.2e^TTh.]:`OOO :L䜜ܿNFFmevL&>}BpttȨ^# <СC_|>9rٳw>z{ 4hɓ;[nP(ݺu}뭷}L4i ,Сȑ#g̘|r%K>ұcGݟΝ{333z[ZǏ6l ˝;p4t|W:ӛj (*::~jZ7o-K.\ح[7{{-[W>`eMWˍO6Y!D{K-Q:tH{흒T*e2d?cZ[[?~";;EXbży󊊊t;KBiOׯ_[yW\yeK/#prrڻwoYYYvvv;[zóT*UΝzuڵ+W( KK HP]o^N#444''̬h.~^^mʀ^M~wݻsss===YBT/hT Zt闺{iwyrynݚXL&ܹs`dThb^Ew8Z|檷W}@6K5?K'4]```vFV :gմ "v%@@@@߱+!AT>rll, F.@txj(=]3@}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}Gt}gԬܙeTTT-BBLo:>4p pXRBܝFLc^g ^ӄw bhoR(Yo_o{FgN !ʄzS/ u*=#W; i~޺ &ٽʪ}||‹yQnn.Mw8::t\Ԗ_]W&uU!RaiYwBKKyeee3ibU{!on]c`hс%%%B֜O?!h5^"'7W7&?ѱY;`hh,cǎM (,,zR@ۿ 2@&N:ݻ߷Ľ !/073$7ojYn!'G4@WTUUɄFB\zcy,!Dvzd2!ohyޜ}?w(='','yQ󧟏!zԝ~sׅ?ɺzu4w`m;}_1aRsMMM1Igׯu+fffYhnn.1 EoW;ݪ[OW,[?216)+/i_^{oY"M10 V3ڥ wV8rİg_022_xC#@63q̜RqI& .04`&D ?=ްl+))jt[YYܼYhnn^UUyﮮ...u⨉I=敘xVp<!Y>Mqʕ3# lll._Z=ߧ~lO|tYEE6.Z4֭n!&&規1,^ Xr٢Eptq󆋋ˮ pJ瞭o lGG\.%:ۯj۷y:t-Yt@ש]xyظK;ͻxtf$4m۾561תu| } @Ԛs|z:6сǎY<dƧ bIс.<v2Ѥ@*=Gt}׼7n߾=33S&9;;4͍NּQQQ;wT*/^\n].]TVVҏ<[`СV҆[oYF/U*UrrիWuf`` (++Bܾ}UhrsslGݻ/YdÆ BHٳg2!a!T*ŋӸİGtww_b"000'''33SӳgϘ8((<]ZZt\!BL6V:vqqYzҥKkjj111EEE;r>|8LihkׄҩB^?~9sr[Ç=z4 88ſ+ 4?=_~}׮];u$j\|ynݲBH ڵk;t0b{{{wwO>DPxyy1dvNsʊMcǎ>lFFFիBui/ 0<::Z,0|O><4с5kXZZ:99=&!!aȑwfsww={Gsi/XXXC 6] y+ :d+V̛7K.>=~ꩧjkk xX_q4ޞ^] ˈ.Ĭh9ؕbh}Dhؕ@ؾ}ȑ#2O#mIȿo4/:խ[7-H`}=;Rd2Y۵k'%ꔔN:?8t?xC5:0qD]vS/٥X"22Yjᮄjzʔ)ϟ9rdDDv~||ٳgn:|FCGfp@FFFzzzllt:gΜ.]dgg !Njii)>|xiiRtqq`WBj܁<###{{{TzW*ҩt`jj*aktյ&77W:r劔HY|sTt||·۶n644d ={xzv#ؽG!'58tZzݚC  !ţszykk_t`K$ԩK=F:>dUn݊=ai)U !&Lߔo.I9~ԍ7  _^^'llly}n[QXX:\ׅ%%sNB s!XQUbàAN8ǽrK!D>;wԔ/ZQ+֦ܸqCVxsnDWྐB-[U}Vf5IxذVV%7-k+\={_WmIÂzfK#חUx@CC >lU~~~eeBwAܿ7=s™Sc;)o2 w[=t__^rss]՚\Ev=wڵkSww;Zfi unWTai_vuԩ&&&;ә#?ksrnܸѻwOd񌙑^vuNu ѤXB3nTW]76ngkk+P/^~1/7oWWW_"ʺw}{22O 'j)Qmyс::3g&>$ 6_v-j={u}k^reHCWV,(00@1uz'N.o3Gjh4^+lc^7 ;tݼk!DԹC62b^z!%сS>=;7^?qԋ/4tlogwglŚvvvsfSO6^O͈4LV[[+;;;k4_d2Y5 X]]z{ސ!Gvw>ѷb]þO|tYEE6.ZnxNN,!DvzdFѽݝO̘Rlq?beUO  5߀?ZoׯOzanjWPzyaCԹ]SDw_Yiú:)zCZsmeuK{=x_O*NN&&&SvuNu՟277ѹ \]\ڬ74$66vȐ! xuoV74y.@5c/=͈<?ːPG%۷oB9;;;ֶY5h4={=z#,,ǧ[T*---rL̍`߁&ڹsg^^^VVᑞ⥥AAA3gBƍAAAwnܹڻ+m]DC]j$ܧO?֭[FwAnnnٳgggg:::J)K,ΖU*UZZL&޽{vļ<鵎jZTd|\^]]ҩS'www!DaaauuuQQQvv=h:L&mܹs:u*))\^^h"mh@ammݣG!DBBWDDɓSSS 'NJ[qq"887ׯܹsv_!V\zйs;Dok)x駋cbb<_}UXXn .T*__;TSL ONN>ȑ##"":?>>ٳqqq[n?F/^i&BBprrڵK.]$011:uuo޶m !ufdd9s+2uTKKK!KKKJCс>m4wx…//r T"++ͭΥ<###6...46)N`<;...׮]=<<6mڴnݺ3flĨm֬Yciiimm=f?? 6h/3t„ vvv?~w}a\dggw1???L}iB蘑Spɒ%vqqرc޽ڼs8p, w`M :l:ps_{ȗ>KRRrYYYt KǾ7u| -`oߵc&.awBNx&7Wicctu!DqIn'}dFw) @K uwIio:yLM9@tྒྷB-[U}Vf 0hM 䨑jz??H1[+3mgVWVV !tWx37Wll,_)s#:tW!7oޤGG'>1 sDwDwDwDwDwDwDwDwFMO/=͈6͇~!VZؾ}|Zn([XX؎;UnRYVVv/ڹsg^^ٳgy晱cޙťY5 ٹs¨eņj*!Drrr߾}O<9x|\R}||Onaa!.UUU;wSzοx[kbb"e),,.**611^uF6&77TVSRRT*U=r9 ]={444BGFF̞=ɓ!!!|-88W_3gݻMφ߾}[ʦ-rʌիWΝ;W?0`moݺ%t钷ɓ:tG6nܨhz-ť&&&ər̙E=={LIIt۷P?^xqBB¦Mt/=qqqiTTԨQ EmmmDDDxxxzz'֯_;Vl޼7OiӦ5eii@```UU7!I/][[ZZN0!**JVn:uT!DVVV\\܈#+++SSSc}ƌ3g\nllMW( LLL̴{ TVV6&MZjѣG+++Ǎ'? .]ֿFp_}3]&V }bذa۷߳gϮ]{9)<ѱcGFaÆV|͛7?@tO|yFc`PwL&{?'NH;v6l؛oi& cǎ C +ҐءCs1:Amܹs8`ffpՈ'NxzzjnZQQP(ufkk[oj܁{}@K/++Ӟ_"LOOuNNN{-++vttt ZK+.Z-:nݺ14]D555;v8qJիWDDuEJ\.o/hsѲ20VxQuDipptq򐐐kV:pMQ\\>ٳqqq[n?Fi~ӧ/##Cq*777)\.vZk :竨BXYYI}v:u^zTT2@C^xQTۿ BJ%055f333STN~kƾGNNNBWjBTWW溸4*B[m^^^ ,m$//HM\aaaDc``PgVիWuǎ۬xzzn۶mu.J+WHܥ! Jdr=))iB޽{[[[J:] Mlٲ 6DGGKqqq{ץo]vI ˖-Ӗrvv>v2!ƍsrrwCBBU\kŊ7n\l_ZZr;vxxxޫUK,۵k4?77wC B)S|EEEfҥ ltoҤI7o^`AG9cƌ˗KW,Yra;7wi'4k_|ZǏ6l ˝;'ɢO>P(322{ 6t4rw@EFFٹ-[H .֭}bbb]D=\xxxVVJܹR^]vBaii`)}麕ʕ/_vqqi߾}s )++sww733ҽSRRJL&校$''k󘚚jW4~w@o䔔jr*޽;77S&n:{9zhqqk@@QO=Ԍ3BCCGCoߞ)>>>#G7[XXXxx>{? :w\?yyy5oom[.5'M}Ғ/rYfI鹹eeeQQQ;w;{3<3vzo{@iڔf(//_vO?$m/q]qqqJJJNݵ**--M&u޽]vBJ;;;!۷ 'gF#mo`P7r1tUV !{rJ3}t )tܹsz`|mPT*F}7B1;wn׮] )1!!+""bީBX___)û&r?uT>}_j۳gOCCCiHٳgo-|gqƍ'8rѣw!2}J755BTTTKR6|;;^{_ݸqc73f̜9sr uWt`bb}hֈ#:vxʕ2H !Ç_vmFaoo'(޺gooߧO;k|Eq1:1:puM6Qwެ,{xx/5͒%K,E  P^^}i)X'L4ΐ!Cyw:tx?#G6_&I 1##cӦM%cc  =zHсaÆ1*}n7_RRRVX?,[ҥKR^zegg+K.]ti˖-O>TO߾}'BQQQqիWo۶gϞ6mޮ<**jڵЀںNBBBO>}t=z:u]g:ZaWgmݺu駟Ύ2DEE5JPFDD8qboߖť&&&y{{/^8!!A74 pJmn#⒒oKt`ԩBÇ*JKK &DEE !j֭[N*kao  ξpႥÇ睌XxPG k޲?t|WGݻfܹc[n-˲峇eIVL4@:P|}}o߾uAt:!,+W|$I~h462eʞ={z}vէOM6\رc-Z(b۶m[7*̂}Y?Y?PVGgxzzܹ3===&&ݺR`zJxxx]}Ʀ{{{zv[,hݺ… -ҁsppW^+y~(dTl%/^̝ ?#@HP;V%<~8@ @ǎi/fvjWt 775jÿW_~7n,)JQ:mΞ=ۻI&[n_˗[e˖+W.§)JM!4iRJJٳgƍ߿oyyIFcXXX rYMKK;ϝ;w4M2M&ӹsUMD=؁uM> !$I7oŋO8!ҥ˘1c4h0iҤ'Okǎ0aB=>U&'' !ҥG}ԬY)Sԭ[o&Pҁ˗/-ZXn]''Pˏ!!!.\8{l~erss>cƌSN]t)333S>}:444$$$88x,s(E@VV]\\*q1c!$I7n\~6le`_ZZZ\\ Rxzz !n4Lwܱ,IIIʕ]]];5Yk׮Qu 6HgQGIOOIBB\rݺu!BBBN:~*UpONƏ@ f̘QbE//Ν;1bO>>]tyw%Irppײ)a 8p͛7Fcu:uWXXXޒ!!!v|޴iS*U,+ -p{{{P!$IիWCvY^ׯ| 78(ڵk=z4$$bŊ+Wի7sM^zE*#@HP;V%<~8@ @ǎi/fv MյiBI6lp5!C :wlޯ_%t;ٲeժUoݺ57B+̂5k񡡡oFϞ=EBťܵYO>Y`uw}wI"EQșW_}% {O<پ}DGG߼yͭ^zctܹjժy{{[˛sƆ :88|ҥ?úkذaB??82|oo .jS7o޼W^fZnucTTTxx-?N2rj֮$)*O W=&O-ЧO>}888ܽ{׺QBdeeݹsG̝;Zuֲ,w9s4nxʔ)-666nnnlBgI<<<Pj~߉cx5m4ׯ_߽{-c-o@̏,+W꟨nݺC 9suK*Urssܹ%;Re$Ii)JmlldYBDEE-_>>>&LB(rQ\!}###-?֨QYf>}逷IZlY~nݺ 4艇geeyxxԫWeĉ,BTRe̘1iii%IZnozj.O03 !!!AAASNMIIYVn;haooo}Ν;cbb+T}K/tܹ8I.4xҁf]&)988ԫW('L44*G:ڑv649۹kϭ[zjڷhHJmm5k%VԬQ=x/sF: jӄ7nܥNҦl6_a2ԩm0, hvwwB\~#-5~t:ZuMHRZ5mlli"wvIHHpvvt9~8(^Ujڤd!7Fh*Tp͠:th': :}s_/<|ŋ6oڠ !.\4NNfsNNΒ׭Sg˗.-tk٣z~dWܘ^<-P;-\+dYȲ"lVf{WW~nvvfs ?k՞msشϗk^(sloD˗%Fh4Be'$\߽[f6˲,˳Gؼc-sۗ'[=jpO!2 |/\ȼ{7EO,Bt枽}fBBrxx'__q54`ΣȲ|ࡀӦwK^z?q-RVBh5YKv뫵>|kК_~0tʖ3?݈80%,,3>>Yիg89z4&oKHHHԡ~nddd 2Of !֭ra.OHL(z='n,[dE=;5{':tcEuד;~K99F뮨k7bbKMH#\ff&O][˔?NL4j9|SHM^_'0`pLfs6mV^dTk=s-߳kkE˖qc[>މuqqQ!))`0暮\\6Yoݺnh6\0Lu6 9E? ߷YPO://_muŝeA Z$˲(&Mmذ׮>yHV-E2ufӆuL6#++=4fݻ~ _0u[ v^SE3c2ף{ן~Q:t 1$K}ҸQwf嘭pґ'w/1d9(, B'Qܻm^ok0$ؑcdK]Qd9o9B'GV^~ Y6xf˗W\9!+mZgdd$&&޾s L@jaaھ&ڶp7NZcfH: dYQ!ҴZ}޽5³wgfI6Ftʟa!DJ1V?rw|˗w.g0ܻdeb !sZm%75k4.niڴ a;uA;thK:0zPc f1֝>R97W$Y5:;{!FeYggγF:7PfIզln,X`LJ?{vٳO 5e!d!̵j&j|||wբy};رgC,co.Zfslʕne-vA|h_`oNVovF{ӖozuݿBXVFB,GGG؇ZjyzxnܸGx֊3 YȲb6gי3Gk0D͙)օ+kfe ! aSP%ӧNeWZX{jZYcc!oqsSW˖-Λ-HOOOHL\٫MVϝeI3BBNwvóY{~osGo>];|f9{}ضsϰNNN6j]Wnݺ-{;qGH:l6]&%%e?o>՛7?wKU߯ݻw323<=-ۧO͛_zc+|......taNNNN_0 5kT/ӭ3bכG lÞ=pBw/k(XؠcRjmt,W(_D!Dn]<+{?*'su΃G:, 5BH{m++J[rtjռ7_S[M4ȯr눀LΛ?mߤĠM7ZVQO*N5Nydꃔ)^R/^n߾^=.>-^R ʕ+cgp?֬]]̣E:/;q FZs䈥laZRFnYW+U1xWyitنrRʗ/r:yxx$''=H}R%3#d2zK4@t^_z5/OiM5)))ѱsNNNN: |qK?`0ȲRd2ygeeyyyeefVl2==d\(ve[O$^\Eu}w{BKYV^Z#@YEu!;^hP$j<eIT%;^t;ڑvjG:ک.5p@@uo41fO6:=Gx7:vȏҁGv*tQT7v :aGTjV&1B}j .c[+ɞ׭oBwן@(3/D_*Ԯ,`@'#jC:=sb_HC@w=]P;%})/|Q @;t{ϊ% J3 {T`_]z +r`]L7bfÞРT2g,`!c@AYe;Ҍɋ|&_?緬@T@ (Rw=ox!afcz/=P@AD@A:ASP<)<1HϾWyd; v $gaUG:PJ?҅4*!Pҹ X_ kpYTG*WG:Pn|^JvJ fv(F0@*T> stream xڍX[~_aKd`%u)tmӤACE{Dwv%ڣ˹9?iʴPzSTEZzs8y2"JӬjY7_EN">|7ME:euyl7J>e]牮L~u׿\&YHNOʼJ9v,sX쇉Sn:].@hp`w#qPrكဩU$? =t5 ΛČ-ݤ681nۯYY;jKxDd垽EXdt g%cTAB:-:%wx. &8:0`u/a)DLCgk _}]{KЧù*A5̴OBr#*˚*E\!q`og,fgqҹޚ{pۑu YY!hP;PYLfd*ʪl\1KE/DYT{p&lWK2I)n2L~bv^\z24@gݤ`m+3 kU. 4u(&+!- S +7MBUϸ9p=v VIM@6?4BaeZ'j;-]+۳'zXk >:|\sE(M\&FGps\ ǒj:$$JNKqF '&R+$zZ|yq꿻+^A/LNT!!~=GNㆈ[~" 9J nQu-!< )zmᖧ\.|)?07~f٢X]a6m &d~'eK|`-?OKR6Jg (QoW!9ކ-/=Z[X3 1 o:N=s/uT9Ⱦ%|TOf,NԉH[:I wF9_u@ٜl d][3<LuU{\G wwV3g R<[,jWBţ{1IV$e0rJcbpDShW`݄51p" 󓳧or1 =xBCKJN0FΊ# ,氊EPi0-/Ow־g }*}"T:> >> stream xw|Sjn RD(PQ^EYl?7d ^eS:hLwK]8C3)m&'s< '" !xL BeINJ˲>|dSꓢbT @3ao'^XxXq "h>DB@s$2@nbT&UqG4^2UY^.H*ʒKw4WQQx!Evv>&x.\31#ᷔN-{E1 Geb"U̹+?l6n@(D 4 "ɤ lpWL4G0^:K01cHQ>䐡Acq++;Z$o͕Μf<=[ Vh#ǽ2`je eْRgg'{VSZZ,LG*2ȮYVF"F N+7}dUTaTUY))ʲ4T= Y9"ݭ0=#3'7 ¢JPqź nq$2w/.!S}dXGNCD!m_>!1me))-Ϳ{e` 4MZzR""7WWSwL[A\S28*9o`-#\=Ɛ\*`2\FD KKSTUUU:::vѪe1?is8.%5=//_òn!|!׮Ų\ppEBa㸴􌼼j]ې􌊊 "JO|*:=C?OK l/h}8;߽[T*# RH$.Φ"~?']*̖p{\ߎ|=S v;(e V0A(VVU!rOGG'Ð@ ȟNJKJJJJ\O>vqqiiA1 q\jZ^Zz&""J$gb22B!77+#3ZIDyL7>JT*3-)(о]H-qME"aLR0J%HZDe?'ȉʩ_:U~&=$DD$q#Jʨ#8!'T2[n2PTtX?_D/70 %$%)..V2 ӣGWHcg')))---sp/WN{6S(Wa?_;;{Ξ[RZ%Q|w[nb/\3%Ҿ},C&okԚ E޾UDQU]hղT"# Z}9=>0A嬢$% q rdz0F"dg/t~Bw}%@* k/ "T6_tj,Uj/~x{]|eYOO]t #ԅ SStVZz/77/''W.tqv`)g''"2-lm_[^aoo4DTٵnȏl*0%5MTsww3_}}X8g9w:\ V*$eT*J{{;@ qF$*L&3]ɤ`24ADDj잳_6nZ<# Wz~U{KtW]:5C!JR3 c'Ij/"H#X,6;~އf$ѶtU.[ߞƙa4IndY[DWCGsNqbw7ES8UĪko_*h֮]'S"K4#Ǒy1CX;qpqi().F4D$/8j0LREgɷo3N5 4G4G4G4G4G"3?p(==]200СC`"z)uWc_Du<}{w8=/?A&Yǝ;wh"2ƣGTٙsnnQ{imo`nݺ:sgd*GAAO{{{痗j+SU]U]#F*Y,!"#8itW>\_(m'Nnc.eۏ{"sYڗEEER[&>>ARXzྴJK}G2?JUZR+݈/߰)!1mh(3ee[vss#ʪo"bY6//K.rtF[XX$ɪnBo3iIIyvf,__gO:ccxSO?lſFHl.-=}?+V6-vص{vݿ=;hS35xv.^zi(>֮?9]zm fN7a_zyWmv+.t>gϝ=g1Lq܌sGQt>;Tjoa?y_h_~6{0~83sM3g/YZ#G߫gT(;~r˷<ݺ䦧g8w>mh1ADFv""P333-kc߻ҥoksj";hYGɩe` J(c{[]LLLd2oaԴ;)ƾED ÌV󃟭:~$gd3'ϝ)))MOO8qsܹ^=#8/-ޑ#^vqq&nݺkӸ@};;i49`݆M-;wbYzSRXP ɴrm+B*yݿ8{F I޾377]DZhIYYؿ/[l8cOZZrOOs/g~~u2"`???e/]d+**KJ\]\(++`2pg.Fxy̛Ξ;~]?_7W^znݶ].lժeTB~짟kjA۶8=/]QYYID\h4S]]}WR lo6Jڰ[o[+Ft t-:'\YYg>~@Ϟ[nnȀMw=Dѩii#" իWTWUwгC#\l7zDibfْ8շSԩ'?yTXxWG[3/g'#"d"+B&GV ?j :mƂsp.&)&tH}ˆVTTdzzxيZNKK6z:;[O?ng322q4[N}{G|_kߘ5@а[jO&@GHd1ScgjHtƜH$QWx0+"Pk߆vw$ݺu u@2P `U !"3jԉf~Da@q?"Oq5K}ӫ@m`LаƳ+4i1 W ̂`%L@"B@cfhDc1.tҧOo"wtpdViwG~噁[TTW⬻}Cڗ:t{O>ˑ@ ?@]50ş!,CYYEK'M)//º Pd=pLE(((xpoo{///<~ mܫg$eY"*.)QT%99ݝ,BZ '"??_||J ѽ_ZZkggoz9w,ˢ"fGGnpE2LRŇ;x v@GJ˲UU-|S˖ӷ Y|Ys.\" ==u۶ͮ..,Nhk!m <<ܿۺ/k󍛛[||YǼII8iP pssj岾}Ke=y>L^Qȍt :?}\޻8hD1 . "@DK/L>}zwҷovmChԏN9G OS||eLmN8vSg.ƜJ޽{ڒw;88>򿙳ګ ̘9g!EG1I>ńc'.qLaΞ;?{<[c^7Ƒsgp_{^WDc'6gxU++] ~ѰɼΝ7lRk7o""WZRSӈQ~䈗W|Bqzl^=|)iwRƍ}1Nɩe` J朳?ȑ]]\L4n|@et`O4=waCj99wuuq {u[ͺ ӧ}6I://O ۰I[fΝX-,(drqw|w9;;NӓbD3~a]Ԛ k 0V^=233H0w?yĩkWbEEEi[QQzT_~Og>T>>???e/]] ^QQQ\RxGnl<h<~۳ "J:vħg:dvvv&rM4Yw\@Q {30jx ":vBթS8yy{%&o Be,뎝|z"+%5bqǰ0t5xJ"8.&F 7HRmmSȍFNQѣs,ۙg.[KIIQkK0=F1Ϡ}ɓe?xJT^D4qٟǟ;w;|h?Z=l萫׮Qnn;ޓJNNNyyy1usѳwAa;Flw&MVþȓNpٳ\&dPC da Qh䘤ě!oWUUboPh,QQQIii`@4˲Y*t'U\OgFZ%wrr7S]V@7~bpP9[nN<}{wu>''WgOZn鴏tG KԉoOH{ڄ#F2U}xjl[7Foժe%(-:2LԺFHTapu<F_E,svҽ{ L>3 ֊ ZhX"Tc/++dd}f&xzNo, 4 ¥+ׯs"P?_]҃s=v}0q ^}P3 X%Dsp 4@-Zvo%$$ 6L(zzz&$$|=ɓ''OJD_|ʕ+oݺվ}gϾ%,;jԨχ{yy9rdIII_O?m۶qƝ}.]N:cǎ}]r2XhZztP47nO= UPl[~V>ŶU( DBp!"̃&-[y攔8nرG;}~;v؊}*d"? 7׍7>|?ڵk;w$%Ko~/_޶m-ZΝ;GMNN \jK.]v-&&={6˲'e0؋/Ν;_MHHرc ںU+6mڌ5^)=ƌ[>v D?$X^ĎaB)Hp9Y gNE7lĜ?yX;.HaQ{ `ND@9";`[-X_bbܿO>8;~F!={ _~%4@D,?рߍ7"eٴ4"JJJڴiGJ پ}_~'394&[Cvjy 6 |76C6@L}СC|sc=oݶshn&#ldt `y DAWlͥ38CZ4\޽{ڑaY6==]TC Ͽ{nppP(4E "uxo ?cQMTu͞3O~ uӚF>jMh.*hrj_#A=S(43 o01p@;v%4DDBokFd8::k*_r\n]^ѣx\-[h1u) 4n8@ 0 p:A QN*Ǟ#< Zw:  |3>#δ ,Q_\@n׽hV+KtD1b|cF;#>AVg Q Q$9 "`AK0@`0[\O" n?kf7~BmP*Q\},˝9s땕~~}Dn qw5_a \#j[vCnkO;WN翺/هp<3@7:@}E>6@p,***f̜>pA9~4m}G `݆#l72Bw@5H@TITF${`  "1m\X @n0q"kِo,z:srrsrr\]]|nT*UwrO"JKOWv/44D,ǾoݶmG?D4A~u ?}h QQK\7:kUUU#ND "GGGGGG"Zl~~~Y,W/Wpvv"Ohr=/g' 9{.>!avBh4?bL&,qO  ՈDCODD`#p'%URk&ˉe}˯4q)[YY>O&Qqq"+ 5`Q{Z\xAgu%nƏNۘ>'wM(у59F 9"ta]ZV^~[L/:>{!ͷ35I/ L&{pooom‰H4OTE_f uss+++֭S>+LVk&V ,(9 xdL@WCAhpB!׈-:P#LX"DԣGsfϓKb"KPDT\RVJKJsrr%dzI5;,\'Tm߁"LRCBG2B[ZOg}Do/_^^4@}/s?7F+MaayPrOQд?Wo[C(Aa( `0=ڢgD@W6S>pٳϜ5ˁ-3\mewiۿچX`ZΤɯ1ꕑ 2qd@v'%ue}Fq:th9s6nڢ-m :0{1oFD.\z)-+*w˯tጛRM\9X5㩵VH#8#swՋ0z%#@u@"D5Js'C|<ǛXp'~iO3gu;L_sgϙ?k^pf̜3t?Ϙ?R{"~=|a-vpp8|3gyW99{{N0~qg~k1&9cyZW[\6i3VF}2/!: DvUU5y{{;svҽ{[Gɩe`H9BqzSϷZh:#񲃃Y^^_ZZP( 1{ex껐:9KƆC |vU$E 4"YYD-'I};p@WW`3w|w:;;G Ν;l垞2j#vv>Q\\,JnnL X:"6,bh׸mjJ1DHD`A[gdd8qڕf{QQQZzF0wD2Dz #0|UTTnSSpM4@c(Qg<apw\mGb*hXFgW%%}c1ogD$ YU((--;YoM$n~=#{,^8h(/2%ˊKJ]k9:d^Ҿ햖42A]ΨGF~NԔ,wΨ޽wcaoO4lmƟ}2W4NN}{GgN5🩘g?9ODMh>&h z>ڟ POGf3g:NPN&Q.WGƏ5_# wwwwww[%L& j]Bedd|nŅ\Z薶M'zA33 TQLmGv#DVZ\xz:Fә vhj]ҥ lҒ̎Ϭ~F 4GC-੺2j;Sl3apk ڄچGҖזԹo2K^gaIDwDޞ N#"30&{ږlؤgkmFж昦P2Sm醝V -FK#""̈́N(F`ݮg936;%7D3g mGAZսMADf8 c7U|Bbt__d2t"IeZ%LZx+W}|ۺ.53~»GH[ȦؼA^k3X窫D8]ެ֚xoy}/={ ""TVV߸98?l ܵ;>.~˷xjyyyazTdv: k @0 a@  8qt){ߧh 46''JUZR[TTĿRj}+/._p7o][Qq^\\Z$D""*,,*--pS\Դn8K.gee.:WFμ{&ݹp;A[;4Sk @#r{ti΄q۾~ĩ淿4|KzIDQ}_ewiۿچX7'𑋳Z^붡&vآP(,,,";))'M nnnwRRW\ַo76F;ADwR^9G7CϜ='?M`\,Nhk!m <<ܵ .^?߸'̞5}ڰѣYYD$J[nխkd2T̮V9PҜu̙#32 iu#pEFg6lV&|::nݺ֔vyB / ݵ{6"`д>sV;j@a?>kgLJD/1s?mR,--$In͘9g!EG1lJh4f~=..ǽO:s1TjODpfΚkq¢N+*+nSxBߌYsG Ϣ>,j6#2=Gn>(SUN-_|a贩[W?AD/^ܰaÚ5kj°D4嗎8߽7SZzZr /ߙ͛rrrSˎ.]#{u7V(ׯ3..>..ϷZhpG#Gwuq!"c\]\jHMM#" Fxz,//ǵg';?1)s?5ϝԷo'%%%zz$~{iiZ.++/..F}Bbfsm ;fƒ^3p[0T"Xa/[>gd,uɓ'?>%%e̙,w_b}/3X_  ^DS#9wάy w#mؤMӹs'e H?1{u[ͺ ӧ} PI^] "O'''FT*.YԚey޸yuV%%n_^*]֟͞' jƼҬX#gG+-@@Du߬ؿxӺoֈbK;vXZZڤIΟ?믿֚^V}dd2~Kdv#2^XX%`b>>>&//ˋ22Dml˖,?p]Ͳ򥋼͉O劊KR~:]6mY]dOD"Z,]e ގ+h;/\QD1&cjkʚSypCW ;SΚ) hX5`1''7joXZ˖-<8g;;ZG;T*W\6w,l;|6(Thsyy{%&ohбc֮8Nan]#耉u7zy{FXtEee%qsQaM\ EVJj*dq]-?8ko{qY7[ T6z^ML_Ѩwڝ "jDw\fg- pf>x&֢N_+}}H(ΘaVݻ@؁GϞ=vL|^QO7}4'?yTXxWGaf_v=W=X땕U;wzꪪ=zvhDK8s|嵨yI͟7G&CCԖz\pu_qWF'"P'=K._|ؿƾΨc?ڃϙ-g3lz5},k 40hJ6m\Qh_OEgdd|p"ҥ郃ߓ÷ m۲IL&t***sr==<\\ Mo/r\]ttlVvJՆ9t%%nWW6[rF)(( l!ݺvURoE"{tdMglt~뵏cՎ8 a`cR>t@`jc]BUˍj%ɂZkV[2gԝo۶۾8enDpOO܌L"Emۆ,_))),m~&24>cvFm09c j;YaA | HV,\9̘9GjoPPP8)R^Wmov6̹9#YՒ7[g1=u4r*3s^V-o\XX0v"aU^U0;6T&@#iᛳZQ)1{mi&nq#E `|}|P3a,|[V$L9.[cND@?P@D2ZV09mlێ5AksoԀ#bZkYΰ+"`%Fָy3o3u;)+22 y UfA#1n7:{c9KZ™]K6Pwy0<ʈ@[)hN8Jhj^ǮMsY4q`gKLC2*M읳VF8 BsįMU__\XbKkm}yz7HmM6[}]A~Q9F䬝5YX,J} 8?&eDޞf8cpnV#k[#ƌ{diC%,ْSSG#Q6XP-*9S0t`+OCșt03W,8"ͧ351$%M((`󔦛fkrp^+TWF̩=gۄ!(MF+}d'IӷֵښdrBwDDYx;cY;v̊E 7ZXU "0oNպj3?g mNEq& P8#c "5<1o:cv^ΒT5gsDG~d"rtt {glR 0Rϯw-Z5Wvv# W!/rs u`>sfdT:4|DĉC K&`ر25O8+[ZGs qڣ4xDi Խ~hѢ"bYW^YjҥK,YrQf?zu =g 7ѯPwhk`-GPOVh)`ieee_}UN<'>}zpppffJZfȑ#CBB)TVVtt͛7KKKjիW f13@\rM,w HDТB xEYj,"h]9V710ц7e.2"RSS;dȐӧ;::J$"Dr\>'ݻ߿ZxϲeFUkDGD/bff/蘛k0rџ7JDh/DE5gf~?ڗ*:55aVZD7]Wf"/?1u+ci4d,_hJ% ZخŲܼ oܼٺU7W/W@}Fk.Mn5&o"m-lQЈ"6p׳,`>}UWWJ$e SRݻR֯_cǎH$bY6--cǎIII6mjժƍ, W)G[f$r֎vT+U?)Ly9qv$W3ezX]dOD"Z,]ez n+s}Qy9@j7c0gN.:Š9 FgMܙ@4c~8wRRҶmۈHPDFFhѢcǎC]v~u999,^|g!iӦu޽C~״Yf̘q!Te"@Y܌"[1IBw'@ޝ&>^97ݚ>>@Of"5-GTګ mѨwڝ "@gFӽ+Y-خdFH:UŚ8}|#X8|۷fLJثWtRhooo~UV͜9ݻBɷzWk2z]~3bDu. ı#`Zx9un9ԛR?9h@ז7sj8Ϛ!Z'J 0Zx+W}|ۺ.?~»G(\QQP(tuu_DTXXX]]mp\K._|ɎN~RhpL3֮POi0gn.f4 5:9 &N]do/޲P(rvko?eh{UG?(Tiخ"FֈgoA~ADD7m&BZ;w펏}m,W捃\.h4Do6FݺvURoE"{tkh<@ɸ:ug[gazȫ 1 QI?5Ux~/-$@һSv""G{a_!sGNܾT(;O,h4<=zt_0KvåW.\oh؛7o]]d8..>(H$/,,*--pRQQ\Դnũjeee.]ڀ|۶ DZ,u':{zzۮ7''7##bQ۶jKwMߗ4It)mii`J~ qUQp2+ "C(B -E޻I  }=sȽ-q=ouݘp?U0--P(Њ:g[Nf|NnXp'^8}?ͅԢ*)~4!vr(9%eKurJꖏ?'@ׯ^n/{Μ9zgϜZZjxdd_[YZ<[TZzЋW. DTYYi({.O{ug=S,pu1 #HL/م]=Qk|>:@kF^~3My }}y:HGdJ`ED~(?<\~}0\j~ yCkȨ5VRsNj6cڴ,-(++RfcFrww3`ZTXLDdƦI,q7+@o٘FV1E_{ z/k|=)Jo#4j]DS- |jhuՆ_xw?؟pv|!Ot:]Ͱe*7;v{mmmW\>n6J "OD Z=s5y2ykkU07)lPY4Nᅧ_RBe/^M,}maYӢC<._Vr:6"|v "zg[>;Ɩpp;@:]aQd;C]y"#ﷵ9rW={eGnfO:u̙< fkKƏc*WV7!S?((W_H@D;wn՞jDǎ:th޽#K,9xE<==.]r۞SQQcu 2 !:hYC=v8`?w\&QT111 x<61??LVGEEV+%ɾSN >M1e----550ST޼ySNRJKK{)UUUݺucǎnnn6[FEET.]jg˪TH;;;4B@8`<`8 <<<88Z(CuڕF?FEEmٲeɒ%:xϟHJJ=y$QF+44T"DEE9r$""ʕ+"֥KK.DDD;V'r\[[={3-۳gSN9::_~ԩ8F ̠f |'j͛9sfdd۷G9|åݵknܸo߾7xڃ֬Ν;mڴI&}7o4&''>}:))u˖-nݺuϞ=k׮QQQr<$$Đ-,,.\8qĺu뒓]|Ο?̙.\ϟoMݺu+""Gi_^B|if<+,'Ie?zڙ60HU{yU<==333;t@D ,077'ÇWTT 3mڴ#Gڵk͚5!!!\.W*9s&::\\~Pd޼ybqW^yAPP ,fu#RSS6oID ֭[}%Tc*er{S;>_UQQx,)η^eIYW3m#4HMMe/'77p={F զDTUUUI&M4N>=vؐٳgO<933s,//ϐgB0w@ P(le''\fddp8>d`\#^*]vtkldĊKd=*xD..{wYD$ y*6  Fvvv&6U1-%%%99رc֖f=N++/0rFӖWXZX'i&^j7n8h 6:Р?ѣGSSSMLLt:{I6av"Ç'$$L8ZD`ذa˗/dDϞ=jq8iNΝ22-7,,4a8^λ1ѥ9qʴʤD"# І'<" ee)iy鍩gN&cLS= jq q ' ˾QQQ999 ߁N255l9++ЪL>/JMLƖ-[֬YSRRi|n\gPPPeeo\yPP֭[RftLƫG]2~7gkErT9|9zMgܥox<m^^^FaO^g2nH>IT(BThT(/ )43;::7FקQ`/\)--+--2=%5aRe*4urt0ۙ糿1J2++G$**R) l(6PhjjjZPP?d3ͬmN*}R3\] "q |21ẹgTԴtj>bb@MNNN+( j&,l@[333$&plIFxU DŽ|ap?L^B}zsy06/9%-9%\W'O?`@Щx9LTm|*NBҵѱsr x<3gCu/C`F+O<]T\2p@Թrsb%1199%=^|;\t̵=e[WN˫$pJzzfNn>Oḱ#\Ts>3+Gю51yofm6+3+GR vfv!3+ccF'\]R Յm-"Ъ 9:嗖N ~>&&&1wk;$6%%DЫ![aءj*ڸhX ryىaHLDjaV{kYY9ƣu5a7@p8"911=deesOLm#1F dػn~% "ТmۆNxCZd;I]nQU_[X(8=^U*{mDb%uojJ0^`uST)J"x aJ%{a\+0B|3C k|U5Dq\Br\.b8b?{y7ׄ[ C6!Cp^דސ1f6h:t-64f&^_,QkbdzZ1tm %SBe$gufz**aDz!2%ҫ*>rh "OK`_wgkksU*Wܸ;~~ot옘BD.R'a|~II7E"aRr*p:2, DPRRڱLV+t{ZVVNffVrJ 7sZ~7^Ke(^#"FSZZ~gsռo&S h~9ϩFT)MMM:QjZBrwTm;"OV.Zc0=E$Uqj 5u#!QI"ճDybZ &d<2|==<8׍[66lGk7t:M^# t9ZLL]Ia[ʼ<;;[{SQJr*u}w6[$33+33[RWuQr7۽ uC蘔RPXt܅ޝLLL4 pN]0L#7ֶ@{`an^ XKXOҊ2Je*ttweR***%k;ц^~I 1N?xYY@DYڒ^\T[ *G^雛܃?߶w =hm4hKrr\ \ts5b?)[>RĤ@?,"7`N}VG7o f]fjz'=o@K^1[Ggg WQ^\RRLD#FMNJLNNTRZ  fw7eٹbFLMuP^znj=:9)|܄)/KKMļ{.(ȗ+) %"aÆ[B"Wߠb3RU%gSG\ܝY(jڦe9ƶ޹d+*++D"\.{gml{?r3yywt!@D*RRV9j"3vRIILVikkqW+[P,U*۫abbntȱe</7'; V{v?"m7C!Jyɩ)I?|0DVwOVvyĈadwnÈÆ#7^ i<>'HHūjoo/؁bHVcc㼼<ٜDT^^,- u[ZZ ӃXZ\T*JQVV@D:.?ގi4"O/(e_ ֳ/|}lmqL4fxVKܹǴ{k?JD))N\rG 6:4'/xa;7郏>n䩿Omx4hȈjk^ 6_8xXRR2E\1a 4u{ZؿӃKJJ eeeQD lQlbZzzttZ6_ݹSUUUs핕T*"8aW=TUU 2^N}~AqkhKnۯ??}{pwsuonA4+!YYYQkV#"gg'RuΝݻѴiOW X,5jC]o4ݻ^fiiO;ga&Mh&G\hvqDGq'{Ύt:[˯/.^fNJNw?޻q=Ujzg9;~^>셅_~b_DG'1^aZO R#"FD\իǃGhGvҋ/4HNN.=t:v;ჟk_6,J>Wۿ_+aֽz ӻWTTDFfff..R cp)r\޹`(8fHSSS"ѽۮv?=u2x< "͋yE D`oRM[@D"hAOt'O^j-?_YY+/={|S#93 "a;;;t>xgKufffOs3&x2Sm~A?ʪ~ilݚ-><;8'oU_0p sPX\RbxnԀ&xG B^ r0̔ɓۿ[3C=٣J~~v=v̨y9W2G6Aӯ]զHWbKG 4=qҢO+++a@;g /,<>Կkgf![7+=!O?ܬ7<}SGv_kxD"!;Ar_P߇\.WQfV֑6C@۾ܡP(H_i882f?zҸTBQu=w@_B~ (g#d?Z׺ܫW'<r<'7҂M?z\D׳ƺ%w}gX:dpz L_xF1|&հ76򿉓899~vzrѻѱO&t51)ɣcG" Kȁ^=q0@{_!xz%%=>/koO-YtqJB{~/iv Rs+F/(X[x,]k6PZϷmh}|vAj g:z6#!"!"!"!"!"@D4x;ў^~\c+)!NhwBϝF' "&8_醗ub„Ǎ%_YjX/(0E"Qi|qqgҢZG!sٗQQ7/]2-x}묪Rlzם~:Q&8xǎgfeݻwupp0\d2vyK8ժ겲u:mjU2OhsB/}nكo zпuk /J4juyYynnϓH$y\\Z2$^TT,jullD"IMMͳ021%H<<:r8z4u\\T*uvv2//JZ-T*\\Rs]mSՉI0^< mxc6޶ZG͘lܟ@D S^k6au}Z+tzT~~@ lYZĄ~ky9Tx77W6RQ^q@D-zq33gLfsi蟝6~rJp9kk-8x@"?? /پ?z۷+*+_(4i+o.ϛ3<+W,p9BDz~uƏ}}kDtk<{522c,-x5"^YYY/utt "N|}G],8fz /y%^|6Fdv-|s njաq۴Zݸ 'z "k>+Efqic6<=Q괴{ ZsC~_ ؿOر`+a#:jqm\VZ6$"uZI/>αBۿ^b>=J5vc<a07wsueBacdeeEFF /66.66ITݹs}wڴ/VfiDdffV*Wvj[ӂb"/H&%%,?ܜZ8-x*;`>}|:PmiiII/,Ϧ/zܼ7ri%h GV7iӂrG9kƬQIoI8OJzٙD{螒@c`@R`Ҥ"ڵK/Фzrrr9Ύ5Mӱv삣w;]rqcU˯>R,2|DP( E"Y;;ZhhVK/,(rwt"/(prrx#7Vk/yz6p8dȠ^+o 3fTٳ=vbqq?gH6%ƧzNzwa>TpOzg9D-؅j_a^.;;;t>xYف_VfȐAsBoDiA.rfSCQ糓gdfC]ejRRBaO@3u1\9p`=闯\M 3fz>:St~= ٚziTXΝNpR~A}`/ z^ӧ7{m;YY*;}{r:.+++--R6v۾kNݯ~;4k OIMK>lhͯ]W٠mާwc57fuqz][k/5o7@΁3OiU̧[FQY3׾L&M]uSOz4o~゚u˾[7_v~ RCM䑗ŗBy~~?(>?i3RgF3q7"i0iыK8yfajF6cotqa~ѲW\\>Zlr͎2~%x41^_СCji~Lh O/?y/^V^dkK-]b~Bϝyc탐9y66<|5tZd.ce\k^+Fnoognn^k~aႱcGgdd:8?V~ACm#74Ik}n^ۚziym/^f|5DDoŗ;EV<1FDp\+H 35G|~c1=a]ftZcz Z)+hv8'=FOh@O?ۂh0F֛8a;Nh0F=BD=]Mz4:\x?>'ȸ hK0F :رcӧO?pСC aj)>#Ȟ={^xqРADRbbbx VVV]t1NY! >|Ŋ;v`SRSS|||8꒒L@`ggWk6ǯ~+((4Nqtt ~z M}zFqIukGn\TT\233l" RABؤQ>yj??_6ƍWˆe |Ҕ`"j6Cm-Mﻺv|68p!Ќp]rܬ," h4 СC]vt3f̸r势AAɓ'oƍK.ݺuP(\`=<I }qƮa`sTM"/INMD*eg8D~P`qDk.N׽{wV;o޼3gn޼^~燇߾}ĉ"SU*U\\\Ϟ=}]"tӧO߲e|[l ٳg5pןuZ)J"p9vvD볲2:tOOOg lwjNsvrrvvb6ۻV-Q\WV[X|"11iٯ.\JIM~m6Pj H$Vx@Kll\jjZ]ǛVKKO+**h4.Ri. ژ@cʪ*U;wLGGp8Ν;s~3a@D1ϊ L駟ƞ?Ͱj*OOLDV?iӦyyyYXX4~ SUUI3gDGGk4ׯZ.549h'M<ѐ8?x*ظ5oeWl%sucee[>pʔI-!ÞBDqq~wx[i ?wmui<-xꩿOWѼnxM"jw}{ƏOGψ(/^+>ns"ffe^ԩr͛cynsrrÏy<==zeȳgOZ677o>>:j;g{rN6y>b;C]S8::-~Cqq铧NjG5Օw٧R(wMyIǵ^DW(,,RT&_u7 "݆D4""h;okk;r?8{lYYGr͞:u̙3yAG cZsΉb6bܹsdǎ{,Y䥗^իWYYҥK[tsrr***p |8 殮֩T*o޼٩S'TJDqqq={٪nݺձcG77ZjT*U.]̌˪TH;;;3 ! [[[k4BqС]ѨQ[[ۨ-[,YZArCϟHJJ=yD"aիWhhD" 9rHDDDYY+WD"K..]rqqxwVZU'Nr{3f [gϞNrtt\~ԩSq "W㏛j͛9s͛_?~xx80Dtڵ7n ,x Ddmm=wiӦ=zcƌֻ֭BD:n[lطnݺ%}ٳgvR*]t Y`-,,֡#F0Zϟ?̙6m"#G̟??99 (ݺuAŶO;m2  4;@Dϟg_Z333CD`sss">|xEEENN;`Ϟ=ӦM;rȮ]֬YrR3g5 E͛'h7n|WH -Xښ֭[ǏPHMM ۼysdd$*[nۗyZq;ז.ǮxB%%Ġxv暘ng/srr؈Ԕj0iҤI&ӧǎ2{ɓ'gffN|8!!aĉ"Æ [|L&#"^YV 0F bf޽3gtttj!!!,r?akkkVj{q#Gʕ+jY\ԆM2e</;;{5[xT*swwz*>@Dt òoTTTNN0w೓LMMz}JBCC233|T*51{زe˚5kJJJ<==ҍ 4+ ںukrrT*` =ZYY`x4ɩyBWt;;;Ä#|}}cffТ0<"n0Fm۶Zh0F' -^h!#!"!"!"~1 ѯACZ¦9ërS=HY@DZ7~ACt܄)nD$y| _&l*,4?ݩP(Zp ZRV;z2<660 `#Cxd0@{5Jlj;qJrs:tp?j2y{w\รMc7Q [bԈ%أ$k]+ ME~zٙٹa/{ي0U Dݺ}ۧV!7twO-@@qus[%Ŀ8‚Ԕ䀀`.B(5j싿 {g" (.*Zp/_ԋg]>I4/|\QW:ܺoAEE{mg5; x_ 073/T?|OceB"=Z%RYj4=qYo޸Y..*:QfRY@D޹"Jz}nnN+ZC,YZ6l "2 ,/2r嶶v*¹3 /J9 \y͉r} ]T#F1""""""""""""""""""""""""""""""""""""""Ց+s<}yED`0>=EBZOz: k\6ht|,"6'x6iѾ<@TQTVaZ|`og1773#>*TmjZ:'xp("8rUP׮7C |>̭z7nj>>={tIo:zS)r7c'{5mU G =Ϟ=&v27;pu5k;}.O<} ߰=|!E??ÿO/g=5,HkX/ /^ħ[ZrtZm~^~ZZ:c.HL+XC^~{!A_8~cGPPdŖ 6/?DYY|>_V>vrL,^aP%pR#3f_v)!!j֍Vb1M'LugVvdۖ7oOHoZx/? B(:ubv_ۭGK6 (ַnDp^7o޶a#%Tی@`j4q!q'oڴuꔉq;ZEςRXXH2y…b@JTSV[^]D5BჇ|u޾s?bo|հ:;;UxLl\6@C T+я?),,u>$X:n;ڷk* JEJ#( U*Uޫgwؒ۴fMs/|1e VPF@߫^i˓Z[Uxv^~\6GO{Fu`lUa=6--Mhk++"mܰn˶k׭JӦLر}d2BHrJ1Qed(tTj\IJj![>Q ^KёP1eVAY!Źzefη@FJ 8s΂6LJi)2Zl!X,6kዩy~68Bqi"JeƩmڢ֙[;^Ury9Tmc"IgϞ}3y?;;;>!jw3yjxEQt=nnNGkڤ1cBS3X ++˘t))/S[jYeG@}1"FoPU.@iu*Y @ s'vyaB5%=s\M:M5'bj5!dNOc9|I2ƿiCk+bً{  js>9u"%1+B11JrS;bu4Fòf˾4u[ o!(o"+FUL[JWN} h4ymE^[YD@_$ZXٙF ܈ZyyM)^ v儐VSܼn:(Bm\cK>mʤ)5lеkܹ%3I穿Oj6n6*]?ӑ/C[d GjڼA%+22W>'xuqZ^2ɑefZ6OLNl-oEQ,2O*"ڌ˳ZR@lƱ`f"OUrNgz@ղX,6ݮu}NfQZ6BFiPV`Y"u% s"`Z%e!>x4Q,UAZ shrbBHQNc}<ݧ$c kEy{!R*)FQ_{ۮOgM#uyj;߸|3E3M8PnD`=;wG:G~rNҹӭw!#Fx"(##c|>!da3gݽ7Ӛ۷o,]`".[TոcLJ :20@r'~֦u~_edd|7wm%OZf UzՌ]+|ŢJTP6ݴZZq8ۄ4kXyЉ(3e_G;ɹ*^۴s>t[!Djc}GGbew.]۵p[EEȳq*I5 !z˳{dJzX.^/BJGhjPhRӳc2MjPrZڸB$X+ Vn8}rM/Yvsq>~Vr}.իש TR۶oPy6ȿ鋄BeQVAcg,jt(,XIQbd䅞>XBשYstbZH22j^]ٹyjykܴAoڑҾu`[5[Ė~S\^=fEX;0~ mqaBC%qyBӫX x-7#alFv>!/ $ E+5jf(Dk'9'C\. )q ~ U!;~ոBv;*a۵ &-EsG-|Ŗ"BHӆtz}Z7UŅD]L~=}fuO!~HvrwyϝqzL~q|B1ͅfx2H$DR$WTlke*p8Q % zVS@Y 6V՛~U.+o<(l^_po!M:s}-6v''MnO f5mXw'N70uνVo 6ΞL' XߔE<7s=}1w3'oڨ^2f\EqyqyYlsn0'c1~ !;[ s2LtBq8fVBafZ$+2HjT3Яq~AaWF|Ө~>];lQxsh 6wIIs6\Hb)M3]'2Afoa!?!/^?9X,U2:|/?|HOLųXoFoS{{{+ObQ4MkuJG,ߠ2#>a¬^Y!Y~^=r2r@;i!!Gje1X&HbΕefV1~MgHSwXfܬ\[뷸|Q"" hƳkv)[q.8uqS|K ߲m6q;ۨWz0/|JYEZ[? f/rnn.yg/]ՅFOV7kTK}u1/OJ!X @q^w ^LBeƆ/ /frŢ;0Ԡ}(3E=&bSو?v S}MTޕXiZ|D( 뮀 [f¬ܼ|Bȳ[_^+r -vףs !ZTEE]_FBe[$ToԼYf.XVR۹fN(0 4iX嵇oięӨl,bm2zY.L-ҳ nݭgbKg䴗c s2ԷSB byaM]ڵps z5ޅoi,oܾ_TzpUߌmZ2=Sm vPffY9:9wnNkڡ*B_CIz|wc Wh(S>,XDykͩ<>i셄 g:]4'lߌ֫"OEQqa*G}MahVzؘY*O,s\6|ֲs&}1%Sǎ:Y|NNOlc &"p32 @y1K7:mU߅?vJR[Xp+Tw ,6jwK^=/w+mc:V* j:7mXIINM_mg@6'7;/27g_6}܈>'*yjM-m~󰋓cz4 q~F匆U`εrPSW4(.Vl32nvꅳj:lwvSW&"@yauU9iƮ<fl6ymX}:AH5D2 }tͶs&rXVbQvN@dN\"^Wde߾H݀bpJ/$2De13cଢ଼<^d%5i6M=qhޱ/!ɻ܎3vVX)ss5vX8B2 l:{,yǷWZ9Y\_fu*L,Be^.:Li'[++M+IjAcg,8\.'+'J&qtqt5v] 2ߜԥͿZKEQq351\Jj4kjfS 6Y'|WRHL)lwuT©r持H9wlAQ< \}6veW]ZuV,H~>iX&l?Y:C4!f=j 63#˜u}r/m\.&")D_,x5uZZa -]:Mڹ ;NVG#9@Qj6j;qb;BK+wN3f@DFDpy iM `0Ɖ(B+Tr"=<E3ss^rzFūw?LVˉ۞pq_Z>}E/2pyD``y9zNt:M6hBE(3m6g6=Kt$^ -]![Vb@ 23瘙@`0\EXb w spF'͈^OKF=S#G'$$ rH$bRӣa8t3bVjr&E(¦ebPxy?)9Yr94iژCpJ2y:wꀈ@Re#L ;@BD"l6{qE/ z/##C,sܬl>Vbc;9rGcj^|>Fn۾A_H6%6)b%!z"Ζ(k4XWW;;;Bg k׮4z}HȷY,5>8AO*H!"PeQQgW^ G@Ll\/]r y󶽽'1|(!#GY,kkg_,[($$Cf|oڟ;Ħn=,]y` i}FhuԾvX(&v呑Q?((, {,ORT*/>>͈@XrJ4sUsמmH=tO_~5}NN;w0q8BHdd"O}WSNwa*Y$66ؑ<o&O2iEk4;~W'`mxt|&z~7}bGcګgwؒ۴fMs/$''߹sy`G18::՚խںO+TH]y<!ϷF8] 6x9o{ӷ߷].gH7ɤR㲭LPdXu_a4x :w9bh%--rsp8Z>ߟ;_ަ %\NNmժ#MӋ#0}Dk?4MxfmܴG={t3MtBߧ#_LJn);7>bIqq1!`0DG_鏢& t/)^^>Mj6n+"вe .Ӯmkkkڴ:L2slmm !˗/QTBڶ7`%b`ǏpR`Pmjyj`jP95l0k$;;[P$dlXWTT.a`mfΘf\}|dbbL&ɤ9rʆ ܻ{øh|sFL]|eMKop8|{Ol+#Ҏ=nmm#>Xop+W,+ Pm?pŋjP(j8}1b6oZr䩌 ӧv*ݴjuťF ;qukW7й@9)S{L^OhZoo/.z~~mbc X\\\Q{ 33s333BHVV6jxyyH$dD^nMƺ09zyA~~ڵ/.15k7g fɓ_~54by}än@n^NOKKp%I>܈U_ufe?,i׶ ,/-]uv굑`d׭{Koy,s1߻W 2vZ.^ɤacFEFF]v)!!j֍LXauԾvX(&v呑Q?((, {,kLşc "fΘfaa>cvl޼->!a:rkefhD9Wٸc BsAA&`0ܩ !Qg̊<աC#\<0sמmHf jz~jܹ{A抺~zvǍi֩S&2bc9֬]?i)&,^FЩ'z^^c`A6ij={^vIǗn.\f.3@#OwXj-:]`Q,VoLINNsnɏBjM\\\{kŪÇd"!WvvD?~P=xИ{<d#p8 <TJ* xxF@%>6dBZ<5boߖb֭~߆ 4Mпo]D7+o_2Ը?33˸IlK95pjMōXJJ*!NVqLë֍pS"o`wb4e:>sttizqf?SN~;p~}{WqSbbٳoߌ7Tl}5j84EQv>}i }eoӻ@&MF]6;XtBg0^۔fB7c7JrJ=fiNNNOص{\.|kr cJi?u؉MvqqifXd*#;w|)EQ<ѱyΟpݺu͛Jr,C-ۧ!d⤩+W,[|ɜ9sefev"lق5LÆѫ\tt*5Ƙ69x`oM0r࿉l߾=---((H=ztРA߰a'#ӧOߵk}LL "m_J! 늊Rҥ66b1Z*,T״ws瘮9tuiFwqv1oa0.Z8߸l+ט>H 5q >ŋ2f͚,RXXRR)!(;;ɉBtJJ#x5k=z[n8>>^4+pmZ$D"yy xv]U]w}ybBH۶mԩ3eʔ/2UV ,ԩSfͲ !ΝkSy󜝝=zDtRÆ +7?! qX\ ]~̂1115"DGG߻wy{ٲe!!!O>W^dddZ"##[jE?nJt@ {=CZAW:|>!#@:tq\.\jUDDNu!D$EFF<}4<<ӄP ʃWTHHH 8::2M]v6mZNNX, LzhhhdddTTTPPP۶mϟ?wUDM|||ܘUgϞ;v,77W$B ӧOشiF&^^^#j srr_>tݻw^肙M'OW(;v0BCCsZ'dfffff (P#֭D}iƍ}Yl...SL]vopAݺu@aaa֭?ٱcL&8p^d2,++  |b^ɓ'+ze˖xxxlMqcǎÇ>GT@U1ѳ2BD:2CϞF'|V(I' " :r:L7#@DZ\@§!#P!"P;wJ>HQQѭ[n޼T*g͚C>I#}cǎU>}zn6nOUgh4>(vLbFFP(jwusssqqx{dk֬9zhnp|@U֮[_:bz1;wЩcBHB!|~M;w>}"|||ڷobNP#7nٳNSTW!m۶~~~gΜJw]lYXXG#BT[O?߈,\p4mLa 1#G}ŀ=_پ}{ZZZPPR\hQ͚5Ϝ9cfWA ׯߒ%K!Gz!HS%{ l>icbbr/--E^uu=y<>!$7/O姥s8ĸj=yvQo%7B6vR׫׭.o_㻻쌌 fuȐ!ΝswwT*믿$ !m۶7>D"{ݻ>|ͼ@pgпo'_}dz 6p%ӧzz;u>m2!۹>3 (HZT*W^maa¤/Xɉ{^lYDD޽{w ,0`… l٢V֭{!C0٢oݺemm}6mDQEgd(D_eR-^=sh|pJsrrt))!A֮4 !ww&M̟?i vttzDVB233 !666@5~f,L*5.=6--Mhk++2n2F \!DRlܰn˶k׭JӦLر}%wdюvv }ݏ{رcB`^RX%˝;w_H$[6m@?#'b=@EN>aXjj׭S`0gkg8;;խ[g VmڄObxʔ) .رc/_e˖zʔ)~~~nnnZW\jmݺuk޼yJJڵk?'=࿉'V}fYzqfΘ6j䰼|g6Uf6. jpuu~RJjVutp0>ZoNcƍu{L7yx=r C%I+[d:" 3.[,<<<''Ãf7}¦MLk_|gr%o@D*,XD"1NJ,˩' ^_d7k˭Uj@D*@?|BBBOg^+((oڤqppsBHB!J?5SJݻ߯~Zmʬj;wԱûoߞ;wÇ !<8zh\\M޽}}}<'NyH۶mJS&f>VZN͝Sŋ ">u2rTؗ_ ٣[j+TbRw>1E;o J=iӆ ,7k֬su}E``mH9tЅ lKL?`)Sܾ}*|L a*..޹s !yy:6?/?--1gINNINNH$5/Zѣt)F~^Kl\7rΝ:W)"S,p8L(AP2阘VU ߾}gϞgό˖-c !ZZfMŵ2OUo۶ϝ;עE EBZW>=fAx iUʘ\o޼->!a:rk3f_v)!!j֍Vb1!dk׺pL&UT)))պ4m}f gR;ЮmHT^ͦtB֍hKKѳG cXϞXtQHHPz`Ϟ=LbP\h/^tppQEeT~:v{nD࣌+a |>?NF'|zΟ=%[vyظ͛6i\Ǜ2e /4q!q'oڴuꔉ̦;w?v֣Oy}gLfsssDݼi}5Gٝ;u8a!$22jYQxg +럐#MӋ#ٽv/WiJUUP U.;~h=-[(.]t"Y^zoS ̝7s :uj_v䩪VA=v")9 !'1ǏܹC!nj7.^ ]Uӆ(..޹s !yy:6?/?--1gQNNNINNH$5FZѣt)S̞a\5-!H*؅Fuuuaޝڵkq8cz=j^Gѷ~ۯ_+WBFmaa #" 0|>Az̉W*Qa_~1gn粒%vWbմ̂iUʘ\o޼->!a:rk3f_v)!!j֍Vb1!dk׺pL&UT)))*޻iٰ1"#E:]a%?]rydd EB=;y< BȳG cXϞXtQHHPBGEEٳY֭۠A^ڢE ʛ~Dgggx%cez}LLl0y`i=/^ħ[Ž'.>{QrGGJeLl1#Cak+c~ xbn>718y&CBkxBLp%p!4M?yӦSLd6ݹs{}*Eq򕙳e}1DꕷظcGx5kO<}ʤ }h:tz^= ;w0q8BHdd"O1HOOW̪P(2 m0@FJ1*o}z2M,//L^"6L 4M0^Y66m[6r%vgkk[b轢fxWeQoӝ\zQ, j},lڞ>cv\[vvD?~P=xmz`._R$ruqay<^{L~?&V8!4l焐;wOQ !A5hPh!x<&Ο=N* iv"饕W&7 =~rk<SAwCɿ1{@!|_>l`>fTCTفV_C:v]:3jش6>?33˸I&VrGzpӲBli,p8.k;BHjjZc 3s"T!$''ǘ$!d $$o-"P:J [:n;ڷk* 3z.!JRP$''3(j.3<0@.wLJJ"(pbbٳoߌfN REMKUlŻx%GGGG,x홌\\\nݺHyJjРF$I|FlX"6510`  zxÖm;6oF$@ SYYqӖSɰ5RԐ122$wd:rskhhpqcsssmm-ssQA-ЛM{"/g}# ɚ%ǑNɰJCzqD ( tX&&;TOr|lmO~|,vMآF\_M g+l#ڬiownXNvrǶ|b@SSSiY붆R||@ D%@ w&Tyy3 UUՊ߬' vVO Q߯[X=] gf)++?^aƏE|2?1? 0?ztx`ςf&P_sG O[WWs5HDwE<s {XCXX?}\B"?g;9:L:nL&ЁVVV!~|4// 5.mm-hy͞+iii[ֽ[(++I pIK<MJo=RSS7}FBio622rrr/ydҤֳxr/IS&Oz'qFb(Mnn?~`ooOtҽ{]<==>;wܹs}&">~. w&o훂RDbOӻ۵y)`Hɧ"Y,54lN0P$RiCCcee!}bgguc1K/"w+ _ʼ$__lݰ_,<ӑ{\ٟL /a-FKHJR_yk?)xªꀀ?xo^wAhvxΜ/++g֖n+a%% ɯ|/9ɄzB:R$ ?>ekk[TT4jԨcǎ!Ν;Lkhhh_w֬Yp݂>xC&R3<^RR"33/_?ߥ!_0x.^|e岥!_\YBPMM !9||X9 ^b qn]]ݛ7|s _Ȩ=uuu7n2Rдi>ݹQPۑ)7i4QN"~D7RRkkk555=y5mVVW(++KCT@544s8tz3O<~|9}teaa.IBǏ߷o_U}===,Xpƍcu >@ofbb~NVVw۷B, Jt%CCB555#jjj藗#vtI,t BHEE!Lm#yA?tuGvNMTE 351E"G8BH*kB2l0`!okjj]F$޾sˌM&GG;sGgׯ]M9}DOUUk߾52|⥦FtOsNΈmG9#g>pQJ,|^sKԩSwbGCZZi!/B*:&庵 ! a***zY3g fӂ%_8rUxO}Ԛh4Z]]׉VXf!0 [|_8zהI+\JJJ_.9J*߼yãzHt@rMBB;w^xammEF#8-{eWB6x@Wa2bKo0&x1LPڪH"++;j3_ ׻2p%%455=xwYhs^SFoHYE,,ڣD"QeePy0oQ7.p򤉛6oKNv.Ἦ.!'O BLa7Ǐ6g,RiPP 5_Tj}}3>+|o hAߋ ` І?~ܧ'\w 2;[{JJJ'}z!ӵv"YjAiĐ%v~XOO?e),^8nܰCB|~=9NWDVWU)++X+d0S&zLN>͗2,ZMCC]EYGXZZFRgr;i4L e2ٳ|~RR47n8jԨzvO:}e2dq}5"x:ḰѨ~SQQ!,H33$LOSXf0u  % 5>>ކa^MM <ܦN.57ESSݻ'֭[');;ѣ".'"p/ykX,kmm п9_VVng7\}e2DaTVVM믿|ݻw]]].\haa曕+W•>B5"DWTTDFڸi˩_&(J!KEe%&1L\CC㕅[ŭ kkk8J4 Q&Frް~M5R$?蓛9}:]uI$|KKs--AII)J/& zzzg.ad@˷qwy_oaHHŋ`4%0{yD6~,B(? 9sbG~:H/ܹOd_)ɒO+ۼ9sn߾=vXHu G$RiCCcee!Vgguc1K/"w+ _ʼ$__lݰ_,<ӑ{\6iD@w74!ݺuo6/׭ g09ϝVQQkϚ9!7,;柷֮X,PVV D!lBðeW>U pA g ƾW ]w;IS|.\?뽦LZ2PRRruIWH孭FFFd@CC @\xeK KCzBB(''W~G#G¼WXf`~F[WW?<,|Z-8ȍ7oB~ګpSVQ& TTTBD"QeePy0oQ7.vX1K,iD8!'O BL蟦!;؏@ݰϟ#JJJWG跶?~b:s/-_!-^ZVV\UUMnRW+m"N'PTT$*Q 05B\SSSCOD1*2ʔ4DCZ}.|2tEz ӨLHmyc{VOOK=xzJtbBMMMݯðo!|444\Gkii6lWS444%/\z[^WQQ_kdc3x׭H${oG0 +) hY\׸8Nwp n6wGyҢƆPUUBH[[B̙3g߾}AAA۷owvvoQ/M7~O'Nd;uZהIo0oɓ'nݺu={\zb~~~qqqU.BMjmNo_O;_$BٱmK7aPyi'y[k9k88q d,bUWW#֯_oeepX,ֽ{? CHL8&=--\BHɂ?S_8Mrkd)ɗqDLLLYYKccMFHO%988m6x{{/]؆pЏE9ʯt:㿦 x‚ >N\%Imm-ϧ,TWWay0@KKZ&eggb[[3]6lSbYYYQhLDmbb{vu֢`nnhiieees3vxGC h%%%!OOϐд4oo_~(tR{{033y͘1#00(Fӽ{o:s挳3y=ruuukk렠 ]._P^ppl2eGGǚ1WX1bĈA߿XGO'=z0r{)}Ν 6̚5kȐ!MMMퟜ߶mƍ3227teLLĉl6</000///55<56$mٲڵkϞ=r䦻wfffƮ]ð{g cǎ?Q$޽ښX?o޼FΙ3.Y!Dӝ ֪ӦMqrrd?B(==="""++ !r[ZZrrrV8NRRRnnnCCT*>)88XUU!XZZ*6W@Diʔ)aaaL&'bٝI,tA@[ZZ^y<={[ZZNz%Jݾ};Y ð>׆$>㣥d2Md؅=Y  O @8?xLŲk-MRqpڹsΞ=;sL;mllaؑ#GJJڐPXXx…:b,@eegϺϝ> @8?;? >|a9Ǿ|a{njj*%vss[rett ׯ_wuuh}򗔂aŶO>=t萉ItA'<`f x"pqqi㥦ZXX9\fVZwsPO4i̙ܥ?>dPo:KkGiG"$ ɗpQFu !daa~詾~bbP(zzz} O322rյSIIl>t@D1L++q.,b}w76 ""lJh7qƍcB;r˗@#>60 1y^ϚM4q`9@^%z8/v"7nܞ={BYYYÇOKK3fLEEYYY666 ,PQQ!Z[[m(/88x[l2ecMM ٘+V1bDxxAOOF=aذaÈ999kS2''';;Ν;6l5k֐!C ޶mƍ3227teLLĉl6</000///55<5fmڐe˖k׮={FFF޽vZ ^㩁cǎ?Q$޽ښX?o<̙C wuuo,YNNNkUUiӦ899d~!TTTr---999;kCIJJmhhJ'7"KKKbq:}[O{2eJXXrz6.Ng0t:ٳ'99eԩ/_R۷Ŝ0 Y||||,//'7abf@зN_:w\rrr}}ĉB'O^px] ?sDbٽwQξ;wٳ3g$9r$ .\#TVVBBBΜ9矛?yd@  ћ0w ?sD=000x!aٳg۷ݻdmʕ***8_~ՕFCAðb[[ۧO:tĤ@:>G$.F"B7!,,,0OLL |>_OO O322rյSIIl>tٳ'N駟:JPUU=}tppŋq3gN```DDBh</##յٳgIIIC IJJNJJ?~|]7w!?TTTl2k֬m۶=z6...88Xm~wH˖-KOOwrrB%ؼy3B(!!*++C8LU8b>[?pիWO>=.. ! nܸAfnn󍌌={o߾~mҥIIIAAAǖqu[hϝB<} f'NJdvڤIf͚: QVV@{KKKݓttt\\\<==-[V__Gv)o3Bxs礧)ׯAY "9ccϟwVP*"$`X\.w׮]l6Ҳê>tw M@TWWرxXTTYy33#Fl޼qLߎ38;;D'Ni wE0 Dd HDt㓓e2YQ>Dh4ڥK uuugϞu &t=qĭ[lӧOM...***DD@(}{o?D ! f>p,7uvvvii)BiN.O<{/Gg7-Uըtm- n:`0:{ڿ3A0 h U.70##|EyMフMz&q8p#\l ӗ"d4cІRa0@GND$Œݻit:qaH*65]׌5G~ 'kO,tWQpC;^@; ІFUAP߿ѣap C2.)x]۷@suRhBRr*J7^1J(vFGbEN+lx[27o= ѣ2 TDZ**j> ظYm̺:cX̔H{B*e L&vۆM=]K#=NSSKKw},4e(3EW) B8c8bH!)Fa͎2K$ɠAOSSS%6%2z2;?oOՅK1˽fe5(*"SSZiF55'T颊(7/{G|="(hv7! X[[4;굤w}"7dX#U=YKA8BNaH,C\hc#cccfՠ+W>3b뙳ׯiiΞ;dB8]x1ΝKNN744tqq8q"Bh .}wgϞ!LMgg̘w)--UUUe2=;^k38):TViVCt "#Z *d0n٢ь㲊 L6htzYVVv|6f2bDPRReffJ;P]],J 8?Y0 {eEEe2,?@" hܫy'8ZB[ܝ(-vΝMEE!4wg!KW,_z!|k_޼?_n?dD $$̙3'O/_^PP߮2M6=:11}Vx{{/]χ m>FQ)R F0elnU8;prʏ׭SHa8.,/gonn>sܖpBHMMzw2F/^ԈIC]! ^0t[555 ֮ ,h&ByQ/C =+ܲi[ ШTMME;w6|fG\?6c?)3Q߿? T@(}@e0 o0blHW_un=2>>덛"퇌D^rݝXa|l.Kŏ=P(0`BH( jjj 9#7nϞ=Ç3d⬬, WD>??nt:(FRSS#Hjkk|>NgX䦺: ôȃZZZJJJ!L-mmm##<m[FqaN Wǰjs׮5߾FRq H Pqqq$!'O%ɐ!6ֿrr>?a˖<|8s&;r׬5sB ]mkkm˷T*U&5558zהI+\JJJ_.9 [/!;%3a*3 ыzE* 4 ( e%A3D2t|fL&3QH~#o..r}w5X,0)))#F4h</((:''2rHMB7o޴!Ch4ZII B3$$&444--_~!yzz.]>,,,>>~޼y3f tpp O%**ӧ{ tggg=zrBAAAĻ\|?  { `ɈDjb1` PVHHD80 d T:^OO[1c!LqrH$| ˈ~FSUU-))=9//?//@Ur^T7sx PTٌ#DR)T*BQ00$p)d8pG 4jDP7jUU---u9)TDꇏhjjΞ=ԩ;w|ֻwfffƮ]0L6gΜN08ZRRBL 4dȐ$by]w=aذaÈ999kS2''';;Ν;6l5k֐!C ޶mƍ3227teLLĉl6</000///55<O>\zDa.d 8.SRҝ:JPҟ:uL$ %Ҧ&ˍ&&㗔tXKoPUUUQVnhg}jii-//h,| eT*C;#w솶AHdDeX7e-fAmSe}KucKH,Jq G)U7[bB%|RRO Ǝe7Z}Zߝ#pqG^zqqq4 !LDwKKKBa^^91,,ܜ988$%%iii={l߾}ҥK:|cǎ?Q$޽ښX?o<̙C\]]%K t1A7N6-&&I&􈈈,miiqtt|p"LFR7hBrL;Ճ7mٴNp0M&<|!!$$cccnBy#%{/^vq,2Dȯ0[Nr/ҊMH1\T!J444"")IdT$0e*G %01&D #|eh8P>8@M:uԩk׮M4)..n֬Y!gN<`\VV;E<_ZZjddlٲ۷o=z72eJXXrz6qjjj t:`strJ7x<={$''K*}vSwbudWNP៎0'24|0o ]$ 8Z*;;+`hh(JBDIbAwwjkk{xxX,.k.6miiaU, ;]R4Ν;wٙ3g! ccc Î9S@ωz60566zyy:h---mlkdڻK~.{୓dg(MT"A...SK5/_~@?tuu)B8B4:ۏ{wE쌊ڭ]WW?eϟǛHRo)3> [inuMvXQQ6lttveUUWq8zIf[b8 v_&Rr0tg">S"Fܲm].ϛlo4?+aO |@uuC͛GWILL,**rpp謼و#6o}cƌ!"ĉn"vM```C g:P(g޷oݻwSSSnnn+WVQQq뮮ݏQ(y.$|ލdO&;r ٷ~Xd999#dlI©^nnMMEEʙWV|!#W;&Siii@all:rd+Z6T5}{yy@_Z&l \##BbrN?}K,cG744VUW,֡hjj*-+VWkӿ VZ󷇉Do{w5eRIIX"124$j ̂4ҥKڳg޺ukE) gzzzO>%'STTtqqQQQ%"B6Axxŋ K=y<^jj%!fVZ՝D n~'+Vhw+SiɅAD1116lLCCׯ'Xpȑ#kkk*]ZH{µkƲ ūWp1kXtTCZ}N~~1]qVgfjJZZZ&&5_MMԴM~Aeees3S2Ы( fC;r:BH*J$T*d2YwFʇԭ1)))|>_QQ((#1AIIȭKKK)Jgwry]\%eS&'''PH<|p5H~B¢'&& B>G\Н@= ?y7TUUO>x e˖;992Vl޼! ߩ4#G\X,kjjxxxL> _,Djb/^Gc8 w۩ -\u\-tV9y0KR{]=Uj5V*JR4JUPPh .#i> 0Ξ~?n;&iee@jw cE4H! $ruu:tKBBBzyBJ9;2 B8B#j&&vv uaw?掫L&%RDC< 1R4MAAAAa ST@>wԷFG+HA"&(**222z\__6"J5***%^?d @ C`0 L=DC>Fgy7kfhJM.{__ߒPr ^>eFNNNQQQGMW䰁@Df t8Atul @oܸq Aаr44 yD`رFo6NGr{98vChxǹ,"^ Q Pw#'Oz;=RPV Ξ=|ymݺ57.~~~qqq{ݧbbb&L{ҥ<F//C?СCD1M>r4 mGWQQd2%Ivv EaEZZZJJJ!L-mmmL|=b8++K___"|:b144k[>,X"_ysssNN1|mo6-@A#E<==Ȑ3gDDDe=z4tP>f i4NAA?SÇ_rf777ݻ2dHtt4v"(&&d8!,X`r[[ۛ7o޻woӦMaaaާ,xصkbӉ111'Nd8xÇx&XzzzNNν{=zdmmqƌ pB(77W,9u2==/_^~}aa!E*nFf VUUE766r8iӦ899d~!TTTr---999y?hСfP9HMMMСC/]?!:O(/.Eh }; @D5xbٓ2uT˗/T}0 #l+,AW_VVaۚ귙bB}ׇT*:^Θ1ںSܸqcBBB(77?'\t޽{.ijKmN׭ܹsussK?q4kiaV4IF2DވڹsΞ=;sLEEE1aG0 |gJv8?5 8}Գ'ڬI~-?흷˧s7w@B={}޽J466vss[rett ׯ_wuuhmv700x!aTj "##LMM-[x!CCîo=ztѢE'>>ɓ'޽) lBCCkkkݻG|. Pcc Jm/MRÇӧO'^ꑑD!4~}^xe׭sKԷ[KMM066f[YYiiiZ|j@^xxŋ KM>>>N:rѹ~:9ܷ3G ڿ?$'@&N8vZ"@|;vxaJJ љ MKK_ׯ_766^r)S,YbddTSS/bŊ#F4hO:N )BuˆgϞu e^~ 2y丸8@1/_&9 JJJ] B!#fkSBhԨQyyy]t}}}KJJB!e0z2AeSTTTaa!QSS ā0@/zX,n4hZff&qKȦA̻AJ[nW_}ܹs;{ "ӧ/^~M_wM. $$$$ܹsŋqqqN׭ĈAɴ"=p D^N[[[p@0@#&TWWo^]]̯a6""BY|ygo>GkF@ ߞ Jtuu7l@kjjKKKY,g}־A.x>аX0@G!$H9;`4UTTNgoaR~Fd252l|>… q۷o׷;ezPL&k? ;nܸyl!]fffc'OR(wwwe#AB!s3r\̠x+WA ^zgezPiii@D'9l ~G9qIOO_z_~cc555ś7op̘12OKK_1 ;,k]ADQ`]{^h&jQ ^cbMbFĂ!XCtvct~?O>^}i(3fԩb3f(db/ ,ԧx뭷֭[7cƌJ*999u}џ}WRSS݇.Iij"HMM]n۷ׯooooooobܸq+Wvqqڰa< Å,Sg(MSvh===o߾jԨa/]Mx. ={n⢎`\I=Jի{xxlذaرVVVfdddDDDRRaG!ĩS&O\2Ũ۶mM6m޼9:H$IR5ʮ]BCCիw'܀-}b1gggO *R"dNrb"pq)цȭN:*UZzu>}L5j֬rk@)8tԉ6z86|/]1 DSD")*\[lt:]&Mmmm,9`OOϷ~ S Ow%rʞ={BCC+U4hРVZe9*[QOaÇ>K.+DoÇ7h w֭[īeJ)S6mݻQFo~׭[%عso֮];XRRRz S2dAAA+#hCɓ''&&;wZ1~/^$)&&J]paÆF*_a/:99EFF:99i42YYYիWwuu-m}堠Oo޼YJcBty2E}ԨQLP4!Po(OHMMݸq8@!I˗O8v&Ǎװaɓ'?Zرcnnn'NիرcU 0.GhbԩuKe[oݺk׮fffSCw] ONqKJ98fϞlٲiӦ}WsȱʢE-ZT@@zkݺu3f̨TSGme~~T777wwÇKd}uݾ}~/ƍgiiYre++ 6>\2Ũ?++k߾} QT7j#:wӫW6mڨsm _ה)Sj֬y<7ץKv~ٳu_K [4>hժ;v9lݺa ?999VygH0`PHZOO۷ot5jKB\p{1|wqqQG 0.czrJի{xxlذaرVVVfdddDDDRRaG!ĩS W;?L1߶m[ӦM fY6mcz),˃ 3Namm/1b̘1$y{{{zzڵ͛۾}ɓ'רQø3>>C Y`5k2335je˖#F%ԩSݺuS߻w/33Zjm ( zZh7peTZ$Gaڵ+44^z7oޜ?'|bͽh"__'svv6o1hР")RK,-QT֭۳gOrrrjjҥKׯ9rʕ^=ņN Xxfdd\tM67ݲe>}̞={ƍaaa׮]3\?eʔZjs 6|B;Ι3gرBssmۆ 98ԦرcGdddjjjڵ 9ϵ1jԨQFʸL~0@"cƌ<̯!CL<9((1m EQ8z4oE3Oh44!ěo_!.\мy'Ov!G;wܾ}޾^zdLLUVVVppp]]] z}ppNkԨUm׮ݲeƏ_jܯtWJԠAeoQ]paÆXYYeff^xvBׯ߿yI|rPPէg\leܸqcƌ)W*-Z|={_>j(&;xhR0?;}AbĈǏ׬Yƍ+W>x𠝝ݽuG\rpp߸q!!!}j+W ٰa?ܛҥK}||/_㥳g8bŊ۷ooܸ͛f͚;w?'Noٲe׮]Ν{aiiY[vLBn}8] v]RH%z$Iٳ-[܋Bڑx!zް]bEZ( fY6mc͛7>| WWW???KgΜ شieYVڵk۪Uܢʕ+oݺ3rȕ+Wϟ?oxiĈB]&''GEEtŋ_pAꚑqҥ6mt˖-3{7]vp7)SjժvGi aʗ//ر9sƎ+077o۶mHHDDFFVRE}5YXX zTYxvpլY%/gkʔ)VVV9/<<_~vvvVVV3d蜫}HFc<~۶meYo ,hҤԩS K˔)cooo !DxuC322%Bz"11jBBH GkZrS\vW^5(=ܻ3l{{f͚͛7{}Z7nP,˫WV{OTnݡCΜ9Ӱ%;;;22IS⢾*IR_ ц_u!ĵk222r߈QDzqY$ѡ}(<Ç2P<%)S,wBXnnn]t8qbjjBQOy3gΡCBCCէ5klѢżyEsСfM<@;xf͜FDuɭ[nРʦMիggg7iҤKNNVJq?jժaaak׮}_TOIIQΜ9^zΝ۰a< 7{yyz{{{{{e'++k߾}^^^烉x< ?NLLU؁rpttܽ{wJJJxxxժU)$v_~pppTT$Io1ӶmBUV=qiT^cÆ 긆ʕ۱cGdddjjjڵ 9:ujQF5*wUeg۶mM65n@ :qpg)BR.*VVV{:::/E/}ǠA 'w.YSP ?XOQ>[W8@j֬rʂ~2ga¤i&17)+KG#$ysOҁ190E$"L # ?~6zJ!%DSNJ_~J#@!ժ[@+ ҟpϫ&{'#)"`H0E$"LDST&/{ݽ{WaiaYfhPm۾#.6EZ5klڸV2RMֳfNBܺ}{Ӂg^oV_z:jKKKNZjU!č4offf6+++,손:k)SF,+LLLy~DsVM'!n޺5qZbŊ7o̷c7#F5l Y[kC\˗$X[YuE9!ĥW}0Bl>33ok=bCU7vW'O7osmƐiO,Vrкy钒6lYV-E޽<>fU퇄ݽbM4u |t:^z?SsIBٟΛ۶1g ͚5Bl۾+9Hp3:o|,Y+9^U(BbG[~ؼEQlիZjxx Otu!cf.44i&BYXX!ZjW_{yy !̚5kz-!ĝwoܸ=jd=9::w߶}gfMzgϚ.(`s-%S'6MQ,+"E,z%[VdYt(`uCg͜0{g6GEEk4o[a(ӬYY6* cefqqZN]^j!DLl͚9- Pٵkg!DD 5,|_b]0K7~,/ZXTz>&&J*B#Uڶ:|诇ݳlٲB''$7:@1X[[;o۵m3-P3Z(䬄ժ4jΛ;[/Uj: IR~}7n?nިwvvzj%4l~޶ď6:ݢUE)d%$-|QPЅwlӮ㝻w/Z`xu?skF fsZF֮^a}rJ66ؽkpfM/5<]0V{vodo_xnnaWrF{<7@ɫZ<z얖j(vUT)7@@D"kĿ 8vv`4Ih+4ҍ0E$"ZuaJ}+Dxnyt (y}3$.g1 k,#.^(J$  J+KYjs,eZ Iʥ~w.]57ȲNK;glh1?]{=g{?vϼ{9{kp$@)pqwփW"", YVdY^_rnڱ-B(2j} msho7ڲg ,pW[P֝=z5=:ZhF#$_FLLz,{n칥)32,{`{|׾op$@>gvNA_v^EJ2!HhʕKIvs."Ϡy r#Y8m?ÞΏ;~%U[$)˵Bv[}ذ!=N??[wnftLp!-::LԨZBңi5 XsԘ;+ׂ}ד5tĬO !}-1y(3aƙ#.e7C/?ihy#6Vffg;"OIL4 ||XZ^:{6]Q11zsvk֮m:cC= }?޷gGʕ%?>YQ`iiuz6Y+&&P_ku,--K22uKwd]ޙoE#!F>vM]=}?95oLoÊ:n_3uƍY tZ6!VRN:i}. qxiZ$GEIZ,[fgG/]8iԩιJVVyZZΘQ.+\YQRݳ^]QC%۶!BT`]i3Our_+ڮ]F=bT&8]bCO`!ĭ۷OTˍ7}~ڭ[n~oVX[>iqq[pӻE>cz1;{M{o.snĻC0~ u8}6S,,-7mxǎ4_VNaff^իWڥs.c8To.j.ݵkׯ]䘙 }v(;r.n8n ڷW7Xc.Z7;ݺ}bÿ eY]NbB,B[33 K!Dhh#p$BE"Y՗+Wo_$ipszr>+KR4af< !T"ptt]{c>׭k[[qqfB̘V[޸hFw+ K5k"@1Vfom'x_ rZeﻞo5!?o=~iq}B 5tfFe3s5DxE4(ZmEyZY3]||sΝ8bV._׮-ge*^u׮=ZQ_;v"\z-@BB/NNNz>""x,ˋTZ_ݛ/Xu` ' M'm=yu[ja_1^m1zH߭v=揄[yQ]!:%lB崴tkkkڵk;:8nٲGG*k@kx^/dY3T[,ZZ-Xq|ƍ)kn iBBREQWVoOMM]f}Z,B;w姂w٩uV }gdd!RRRbbcڵm3t5?~BQժgGC:~ޱ:~}{=a\y[{ؽoĐޟlPuPPPe Նݸ(Jݺu% ֵ#S ^z> )>>Eٳ"))Ӧ'>\AK>pYWؔBBkn.9;[._}ߟ~IwjٺӁM7vrr|wãQ뉻EZݽW7)XdqfFFv{nѪƓsF lx߶6ˁ?;~ ;=hM[vu'u\[޾311ϵhѼB ib\v}sQѱr@~kx~8v_zw|ePP,+KB,<HJrVM޵<,Îæ k-, !ۯ{+Uy8/?m~÷`q?]hv cx v>.޶mrrr322ԙw: ƟW9啞аAҝU{*ejfjg*U23unʔy+bfV6##ò|d[[ۄĄ^sppHHHl ]E4 YYYj@ ^y5kTwrtHܴG 111)));;ƦM VVV*XW,UrZ5==)=-9+KPA*)b^* 7I,,,,,,+&w꜈Bkkk!73SGOԪ8OgJC`H0E5<['HgȔog %G"`,IٔI*((ңEB$!$vhG# IBQ+BBHJ~y <6c}屽$I:'VbiտWWmQ$u?Fq}/)mm1F]u%p5PG=џ;х(sH$ !IBV͕(B}2/[OVrnHڏf {e-SbMBy;pm'm9VQ>\o^!yx:gƫMHS~HE!?oS)[);TyQφ475H9)4BQ$?lDYwIy )]XS3UvIY9[Jyk/Hw5R)Oբ0ߊWhRң?}z@yXT@)?a?&(%AA`ާJ<=1+=_DƕѮ- Gl;'UM}Jw.JϜ|/£Mh6jFROL%^3w#q|AVȓNQ}O]_G1M2Ro", endstream endobj 1332 0 obj << /Length 381 /Filter /FlateDecode >> stream xuRn +8 =UJ\ɱSҺ*;1E%$3ChK>*z*<ܘ3|q/i$Ng̷E\idxs$eN=)*6l=Ia IߐT)kgz<sٸۓk\VPrvC_키){] [2co>62ekw]Kދ'F @?'/<!p 듇GĨ!HNHȢ7(XÅd0f{egFy9HK4='ă!(Em ƖMW/BіݕP6!W2A?-$"<\\I9 endstream endobj 1320 0 obj << /Type /XObject /Subtype /Image /Width 1377 /Height 799 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 68842 /Filter/FlateDecode /DecodeParms<> >> stream xw|SUYM(-,)e(KQAEAQ(  PA=P@ҙδ͸G &M4~ޯ<>9{rir &{7@D^w-:^GD8AD$&1z#<88T@zH b]я8ɤ奨#I&UXO, D-&"1#G"1*DĈ31H "v+T`ī2B*Wh**ibFL?ޏLSV)srʲk%};ttR&+ϜxdX&Cܳ1F.V pr>οr ӏ1*$DN-ZhN枓&s"஫PB!g6!^ߐᥜeF41%-_ _f)#qLHӖ_ܷ#Pҕ윪jXޡC;/O":~"18I*4D"ؽ]{ أr@gg>R77W]|+--sws8mT*723MF@qA?q9@8IjRRUei0,D^9!qEE*UH Bjjnߎچ޿/jbQэ+#NKv۶5XnoѶ,%7nNKKP5DaUFW;YgA|k *;=08whtH[!XП!KKv]TUU83Uhˢqg,))=uG1AHIM񼷗gDxy!,յk)-Z/q1!-=#/Yh.<-=CRѵ)9y-XOѦg(3CZK$;yZnn7njQzRHRw77vm |llu'h?3:; ک+yER=X JJJ+*|}}\\ ߞq>>ѽ{`qIIIIc'3n$--#=C9dAHMːɤeei陼NצM+"ҿձC;Tzx\FR$8edfUW(77?8)@V/juz24E :%>!B[,HKTթiqF*P|B WbNL*A++TYeH$4 ŶQ*H*tww1#NJZvws>tc,ќ ehHK}.##Ϟr6mZ[C4#CFAPlV2O2٭[4oH$!-R '45SI FDf?Ƙˡ pvu\"RY_u\q`#,n;ҕG뭯=*neRiэb"*)-  +$((1@Deed71V\RBD^nD$b3HuHv:T*D"QC|2s~!c7_# A -K$4FRBdVqӉ4j5e|c ennIE7n2'bj>@]Q""u6b⮪vuu&"D8otF2')*T 2`D?B6j2XD}ȠUC ALn4h35e!j`רbwxyYc ȉHp# Jssz{{1v3TZj5cwb((0@&yy{UWgFF7|;wmXk)D"81(O8XRZ';Qդ7[uuu`3f5mA||b-:DX™Y22j''V-(5-*#C*bdm!"S^ϜrU㦡v$'*w*Q(rBT")..տtuuޭ7K8˝##;xBNdr'k7 [-L[ue%$$nDV;d[nVʽ<-NoD4v8)$岝/ιލ8*|GSUUUZ$sɤ6eTj''a¡ ¸VQ(k4U p@ӕܚHՖZ%nZ<;!D4샪dgXya֬ 4\.vdd2t;cL&ʤuDIMX,6, H, _\vWkIѽ3 EE;[. /qk0#a׮.?lq9|VpTpWt Zzo=@ 4 b3h #ҏ6`#D P"c+O@S  /n# 9ࠬUܸ8|MzaXib]K\c~]  Dfh81 x=UD$&Fktː{1tD3 ƾF6RTT'wf|ggBanֲe^8h}رgg{zzǰe/;BZٳ\w ^`W_ؽLeQPPеkgy:TfUWUHJeHN۾mcFrn/_΢wKJj}G|Sq-rGM1F}Q' /ru:]BUFn-}2(--Oɜ =1F$%%Z4''W*xyyY1G}󫉉""[=^VV>bPk;;JU]]IDU%%%D|^^/9rG[XXP(^Mj"888>#biwmzJCGzc+?x`Gwџ9sZO~[cz$_~UZz毿}WWCCCzyvÖm~yx`WWgjN9;j8}tmџh9K5;qҔY4qF\P>O<5B&ki7fq<'&ڎq;qww7"ٳG=իAΝ^6r֮ܰ[.<ۺ]:OE- 0ױU#ˇ{d/;cF2oD<#{~},]VVVvxώqz}}| |} pb yKJ*.)pw',8{'e3 N:qTB~b~O}xyynܴקUлRJQ*|\p[ w++++H3:roQ!!-##;Y4ͺ_dG"սE7gϋݫEpMgw}*+Uw.rf8z=7786h bP3F5>>peuUUC3fيvO={3rhdOg‚c/;q[N"DEuW(DԧOJ2UC?aCCg1gp1^1st7;&']qT*UvN~XsR! }uFNᎤg}"%Jp>{9 > h&j1 BhFDIN?,#tk@!sC_{ix{ {8!$Pw:6bT4Bn #8p`3eee=ߗ] ɝ;oߵ{ozzeHH޽F:|P"z9rhA k,zwٱlSMm;//OU/N+Y<;v-St+**Ms0_ee-?~iCh牨DєJ///"R*JW69DjjZNNkDDXoAA!Fn|,>>!88P­{<ˢ"fgGnvE B'yyyv"p'2XA<_UYeآoWi雿]E|y N9ҲEzzǦMXO>#F>ʫti26g>괗\!"wwVoRSӈŐ~ǝOLtEEE~~Rpb>1 AAĔԴ)&>GDPۡrܚZm7rhww't8U V zpРSOgo^#ʹ^1AD1&7C=gk@QQQZz~GlYoν4xRbzii*DVʪym;cFc1?; k49{[H&Y5utdG5JFΪ׭ߠ@DV*tLD~~I["y2KߤǭJeVJj*I$N g@򕕕D$B\ iq͚uDh֭gn|FNQݻEo/{o޴{/OXb߷3g^lBeKQQQm# uMz?4 V#8ё#>:_mF}hzoҹӏ?|;ǎj#G "{aKr5//o{~ʷ^;f@AaAppm?2&^l Ӧo?|r쑣s5NkPl=Ʃm۰N_ty.Ic5Lh1484rfADVn9caWUUJ$HT[EEE%!-CDp#m'klɩU:yyyyyyq\`UPi]cX, kpdv<FHkUU5Z&)ZyyV/IcdM )O%F4CYYDK,Icdwk>&  :Kk=|UĤf8G?cN\aܢ0*&?n֦urf=,@ !I1@rpÈ9"\w@},Yz3Mt/^T՝:urqq!*"RTEEE-Z "糲8f")))33ãSNHܸq#33S&QZZZjjoKװŋZ 1=켼<Fc髫m OHH(..d2 {^n:hs>4w֔2ܾhBC ≖-5 1V.]駟xի#GD>>>W^y#GL>=55}UV]rC'NxKy~ܸqNۿ~xڵO>ܹM&Mtȑ6m$''߿l^}G]xŋ?k΅3dȐ^zzgϞ=|\\ܷ~;|MOl;.^x̙~駟ܹŋ^R~G KݣuVm۶7n\Ey)Mv`uMnb[-BچHo_DJ"@׿=z9r…|acjjj\\ʕ+/\@D!!!UUUO޽{啜駟nݺW^}gjhV^=vp777{RV_Y;i$WWW"4hPYYYvv~t1iHsvv&,^_&"L}Uq܃df*CBB{9uuU^n=ࣁ8ob;0GW3 ^:2`!( +ug'}F]4-[K.s1l8n- ׯߐ!C^}ՒӧOoܸF-Zصk{Xbܸq{233{1///\yɉ*++M4<==Od2\.7A ɪ,Ws$A8y駟!r3n;vl$s-2hmn'nlz5 HLbb0Dqa4DSڵ{g,wPK[ Zn}}}CBB>裀pӒ 2dZ~ & :Օ8ׯٳX???_?vYBH&>4~Ƅwěs"@`k4M!݃@dd451 D2oX1"ŋ&_ "СC:bbb***AC}y iiiRiTT .]Q.yOKK#k׮}MeGj͛7Gd<FBe+7lb@z>;]]^ ݊6Ut!'$ 6c#hѢ [ʀ{yy͚5KߪJsvvԩ>FP^^>p@2Jettt˖-;u4bĈO?T^9s+oիcǎC}ꩧ,[m;^mrر{X_qf&l民1b $4 !1Vo L-s %#?zfKS4d`BOFL{0lkeW0~@j':2((p@~[B@n[nm {+ O㼶B#j 0t"Ro7Luy_o֒O^~yNNnNNGHH<7rFNNCDie4mg펍$ʨٯo,tf20NÖF#J# а1 F'h&j{m7x ""Zb Y}͕^cN vsud'N&\Mpvv^٧NN2\!x4)I12LL 0 Ո D:sOFDDЀ1;<~zJFm߾wLKDJh\G܁5I ֝&ko0 'hbDD!F FO?`ce;w*ˋn0"HRaDV㣄G/)AivO> -QoR8A?ah1&3)j"EpڥsO۷wB eVj pZg>z`!D=k?:C^t[[=L'ULUț&ˀ8y#2ݮ{cNNN~~Qݻԙ+/?YӦ^ݻoĈÇ %^axnG5JhO%Ac<$ST;wّ煜6[g*;w;=ǎ2eZ(YQ =<pjgQfg.4^ QJTnnCө kP% #eoΞ?r.,Mm=ug'<=f(;rrruP(vo:TTT]8w |~_xzzN jut+aJcM4k>RĄ+ ]p5bdn88@t!cDԻw?v-<|ŪwߢTf)J//6mZsGD%%Z4''W*xyyMfoÎH.Yl:.!F7/(,,R(&>>!<i8t*s@hdSgUH#8#00Ӓ#: "1=k4S:vk3Wg|7fq ϟٽ(\9s>Ql9:\DD.\ܻg>/K~os-x'A;^:e$Af} W =uwXg˹gvFCI/%:7䩸kZ#ZLrk/rkFT^pqY DX]NLLڵ ; c?e YN|ݟ?B2ND~ẁ!lJl ?or'NzaQ1Jp/l_F;r#͋%W˷͜1IW)4eKHTdvST9>n)p}+VؑX\+8=|3NxskMj CnO֭5h<TIL'$ssZ3w`=''.W;Ə՟;h//////G%BkӺJIMmӦMFFƚ_".hN@%hl9sZݥbui2 0]&Fj*4 .zxx|N{s»~ f;4Nuz`i V fc Cu멶2i 3Ô14XN޵ %zw@7h\ٛY< [z Fp3Qq~ Y9=94{wp`#50`^h&cBɬ f[wwzk&AmɎ#h&l]ʖ-rDz9DԸ#k`o;0}뮴{6:;C1ۨ!}/++7:O6 O=پ *{eeg7i7D"Qm-!>/ֹT*|p0j=YVi:C̖#!"58+Viɒ%6cǯ;u:a{~~Z}N P\RhJKJsrrj4ZkW9{gJ|ʅ U-6mZXLDEUeO4^jjZ\ܙ+WkIYYٳ粲qI Hk`}x w.N3Z-3fbUV%$$Kڽm۰LÇ~V\ַO 0sq_~UZz毿uv+_ϥ_骫?[I iR$Ӧ8zJV oQ'Ǝ~'Mرñ'}}}SXW25uiL hG6@1Qccxckfddљ3g֭[z:$\MOxt"C[)-=-9/_WrrrMS~=q}T*/\طOL||B||BPP`u:11ƎNDpwj&55'2;qggg"]QQku:o5VxT\\MJvZrʿ_HL^ZZj󋋋Qpo!Y92_0iT V6?>Џ~{{yyND~ͷg 6n8}ɓ'̝;W*֙e۶}ER"sc D"H9?Ͼ`^QQKWm[dgpv4ݺuy|}|Ojaڍ_m^v7^6}}pd2)UUUګ6QB,vuutjz%amZpђK/nժWOJ矷GlXo͟ ۛMlf]iv,:h6wj*#ht$5'>?ſvvjDbwiLKK6mکS~:kUZZݻ۶c JАc̰b@@N#L%׶G//˖ KII;}f_dDTQ"/L>}=٘ո<7u Z v=S#:pwanXf~֯quugi{Y`L&3qjU+^0OX|iru}7q4 _r%&&ol٢S3At:OX8O\z??ߘ-_YYYID ŝxd6Rt`ogG>6[;՗[df*Sҟ?N駞LLL/pus[ޖ$"ggj(@[mVD >x֦1N_+1k =I$͙cUGm~`hwLLf̘~؉>L2ȑ?9~c>zOKO_:ܳOWVVm?\Y]U;fGDYb uf7+77oO0p^Ң  4M)&&%>[o{~}bh"***D>DTPXe.=ƍpaܻ>oA[ǚ?f{j`|X.X{ךn4,ؾ]ı>DԽ{v҇ٽk{^~>#o%/ ǠRsr}/z85ս{Odegk4@C8L&x}<<ot>>DtWzhܵd޽ ( gobvH|1Xm,~L;Y1#h,X]+V$jjͨ~?_uR(amZv8EppVgخ]Ħ7w;''7##$qv<@G8k)hf$B]',y8G(8wޞhGGu|@`Q~A NN.^!ˉ駟|}Y FwI{n:B-e@mo3Gg<)ʬ5VVz FnoyӆBƘaBΝ"ڞh kpvݷPoLcXXfZ ,k~ #X`@jf[v߾#`.u .8k;;fbnj@?Lֶ)xLؖڴ_Ǟi,"f׺h1>FPo5O_[܎潕7YNʎBn?Hih@lnjmk i۰E>|yY0n 9 uuޙgu\6MIX e,ֻj {1b ׇ{߀_\gĶ.4:60`4D@uӆOPq maG`-@bMQ5D{#{>E;VX.B 6F@DOZpد:Aj;]}bYq_jild%rj3F`R5pDN@%8]mS!7᭙ 8c%O`:`Eº*R'6}lX =h46o]x׏Ze|p rʠ}[nG4h2Ac}v /DjO3gL7};,Σ|...!!!Rrrrb>App0eggk׮]{bŊqY(ޑ@%-Rwm`fef*8"D݃6_OrqbZdh*ݤŕiV:uh4:#mUH\<*KIe^"F#AQUvu2Tq3N-UkՕϋ2~[Y<ʊ4UOy]6s'K⤸PuA/uQQUżN+Ȝ݉si91lj*oŽʼn%Nk|UeEZu qbœ1*έqx5 'bO@3QYQ,=䪊R/̾q\K]U9[M?j؋sޭ .aZ2b^QH孑ȾvxK-ZmVVVPP7ѐ!C Vׯ_?a„C: n2|s \ TqYwC?gu G 9<8W^1KgaQڦe?j3n\.ܜq}F=73.$8{ D)CکL*}bҢ8no?L"&G.q/'I~uVJyR2[:TuQO?y<#^vgSk1* ==~qOʝ-+'gFy{z:~:5oUY#ZV*9pI3᝿tP8XEn4=6\d"@P^ª>bu]Ҝw-l>`%+8䨡aZ[9ѺUZLN8x+cԦM%K|gx}zu/)-SUV қY+( JD=ut9}Eqqv^*Rv{X=D^blQ)FM4Qc%jb`' *].G ݽ;>[TPؿg7"ںs6qpDeEylQF=v_!&@ԑ? HDP( v524024խӬ/V%痕58;'k]۷ndݷ=:yU! 3^6fֿMD?󥳣=d7_~he( @DX1 UKK[Go5?m^d5DhOHz5&^ޱY9p?o>"JMMر}-o߮_G;wsrè)t @[#FE$k*(- }$O4&|B?߿>&>cRq^ʯdk?zhJZ7;Z)zĸiM3 sgvE%c>vO"-- \a'Mbq DjzvJ]+s3ܰр>=%ʢ:7ڍob_pFVNvl|@i7nQ-%BO-XϿYOrkZ嫧ZfU7aWͪ/^o I/YEQ^Veko m?ebekrxƳMzhw'Lx-ggX7}Pp#tR X[[;wINN:::U̻Q =( -RRI&V@@HfKMff h5s0IwnV:I SGm]䣧M3ܣeh2WOL>~BD6V$9;:Qbglm+'{X9r54ʄrut늨`D%eӾ#YۋGv%6_"(pD߽9[qUTƦprr@[z( RNi#)2̕I+ H!q$b1,B 4 -zx_%$?p _!js{uS( Ì>hxanj)TX\LD&FRPAdjlDDEUJ\}웓8_SSKCٕr#CD=kyGCXB\F!WT$HHPQ.^]:xE%,]L(<.pPj6| {؂dD$ٔ˾f썀gTH!,ܱq=?9%]P8wl\BT߬=!%\6i~Pr^q1( CC(%FMxק{gvЩ Ϣb6,ginc!6-;z=_)ϛ5{ѝCu C?+6q#ܼ}|2q8 jhaݚF|^"aAqA3]w.qߏN~ O|#.KD<&];gWCSzY*<~Zm3(NW@W9=S4;O,XۇL*zEGI)-_OD?_hjhއ$F0ܤ[褻Cm&2jI<o^Ϗ 9 }.|c_.>?<7ncIO" r3@CoLD%k.lڇQq`ˎ=Q/a8 cdfuY;~ۖ^[DDfkiQiaހ>So=$ ]:xueh_ ׯ7:E(hZ{u oMm!aB w78VYϿ zD ?_ηϝDZZڸa0,>+:>wOz?s+ڔs ;f޽}TKgiĭ*ӱ̽UP~r RJTbT*e3rj.JR#2[s8>)tx%V͸D$%hikk[ L-(1"Ha׬ƿJKr%"UP/bF|K? Q 7o, ; +Mœ*!D.%D.z&/ s3 MLmrYFb>O$͒<\nSSWzפjuFBTZBDfv&9I:4oU>Q*v 󷶡s}}onOàq!Fc#TmG#t9<Z /Pw8 W'%< Qm8\ rT!s55sJ$ j4wJeb[T"*%;b4a#JcX9$7bfKDzF&Y0<-m[;λtvV3ཡ^D6S70@@D\n&Y>JLIxIr-ki ,4 +L-޹<*84U: \`G177۷o +4@# y 4SϟG2\($RtH1___'N( 9D* ӧOlْs  @иki40E6o\L&4iMh֬Y!!!>|WDc8]\=۶NzʝMPB?uM… ]\\RRRhrqh_6|}1t)obb^Kа`Qzz:#055&g FDM\D"GЀ T*MKKD 6[B߿N { {ggg//5k( Lznݺ ߿N5+0́e2ӱcǰ.]\vwwOOOgZ Pa666غ5A!F, tAΞ|p%? YQ.geg: buu^3mڴfnʊ}-3gO^yU_ vFjZ-ߧO)._էw޽| Fti%ʇyyy<R(##SKKԔd2YttD"iUy~AnnD"vuuasQQQ\!762Redd=fHW,_liiH$211!2aaalKK ו\t%+;Ý}ζpw07ǘx0A]L9sj{٦[(ŋ_h-ߺu0y~0pȆCB)K|*>߭GbWؿ<6b ;v@D 0Lmޫݒ_cF/ E%%%QFFfXXxbb\Pf+.. a#""%jr<66."" WD4o`fUSVVVXX. s*Uk pAܽwU VgU^kP(-^7hs?#-Yx CDaaΟQ=efpSֵ~3X/nެٽ..wSy 5smai w{n秦}ey3װ'׬^uX@::Drђ\099e%:x͛>z~abbҤigN355]d`VVova"Cʋ2 iӺUvvNjj-?$sGNڵkSp bZ˖->9Vgp8?ViJ.˕]Q?rİO?|%"Q=k^lN611iծ[k֮/.. uuhjXdР[G /KKKe2Yllr!6[ݷD%eddFDDxz\s" N@D=wx銧\.|9հrrظsN|;99֡-n͛M?N5Lg%VfgewЀ+20'lX$&̬,9prOOB}/_9= ]tVPE9^^BBj,"#-YQ  |}[ZYrckԱú 6o\ ?rU0̰C<鳣GPEm۶)++=}/RN:ٻ^Yk߿|_- UoX-k++\djS-i׮;woݺӧw/MMޫ?z266cԛ7oyl7mݺI$vԽ_?/NޤPT?:::lYaʊjcܹciii^y3\\$ԿΞV^n۾S(Bx8Lyj}̭w_r<==²Kzy%^;ޫvx*4ڮon?Np]6/ ];KKK32̌ U5؈*^b跽(}{t/_+aee?vmRY޽ED֪U+nCGYXXk097iּVhjjjy|s&D^b@JKK+87yWemݲQ-巽 |: KlmUyzz\r^p/fff7/++651QNaέj^rݺIܩc@c`))(h8 !F,1`i0 ^hyꁮҭׂE++aFjBsMgEk u+:#sAݜ=w!99Y…K~~ @D>\m8>r_g022l8R(>x 411ڥ30<{GniiY2ʄkmxȆo_ GA@7T3_LIMcrrrZniee+3g_tAU^&U+ROh[;&~4U__>":q=ߠGP.;XD0//S?YP*eddjii_ѣ%Ifʟsstuu%ITTibbRFFAflԴTSSSg&GTckk(GEEhkT"v]Hgggkk˯nxbצ.ʺUzMlaiQcFT K j{ ^+W-bV 6X)222Ѳ **ٹ&/?Tq111ll1>EqQ#g;fѣT-)9y<{y3M'x1cl.cbb"q毻wJDyx߾s|3Ν;qx3צyyffO]dB풓_ ;`VZ$::f钅Ə#ΜCC 0yZfEDΝ3{)juLٟ524d"觝ۚ7kV5iP(LKKS(\>g{ ^3gZW[Կ_6½500w\zntLTع Q#v~=ǃ!FFQ1~zzg%%'tp@ൻ{I>0ςso߹;q‡#G #"BhrA>]hɲW؏aaΟ162y΃;lzIII}>ڊrgs/|>鳳wK8n,\մ?XP̛F= I##ÇC&~4T& 4pD5/?s8ѿvv5i2 1FQ*봤j{ ^ǎiǏ]vzo0 ҹ9z_>ff-_X"dkT&"ZlYA/&&<o_`܍_ =⨑q?נǫ*aa]:wmD"qll,Q#؏FFRtH__|QVVO?ʤʧFGD;u/^LDD |49ۻ[n-)9)>>a6})^&סjK$D")**vo5rc'L_K"8 >=x{HKKM/^ayzEQ˖->9V大gp8?ViJ.삵/vm?/\0oԊ9ӌ>{*R~""P¢*@D9j99\.XNDY66^&ס*%W}lÈQc`ݚ7sb>}8nln433&5Q=DTq32-ZZZ9D"1#Pg9AѹZQ(Aϗ7p~t}V׮v,H=>=ztcO `|tqh0:XYYჴr<޳Zݬe2YVV;˔T"l7YTUQB^Tn)ʾWx =z,"*V{{}NqcGUPfAg@j`YZYrckԱú 6o\ ?nʎ4DISSBPobյK'ھDmz0PO ED;gv]\=Titmʌ+iݫwPk歠k/ЭLs33vryZzD"بLU^^^aQC+$J--- *0xȈiS'++˪f06V^ZpWc`{iii=ٵۻ}Vۃ#Pg}l2ceN>.R"aG87"ñLZSSS܁5\m6--ddVu贚4C{O:\Az8BamCjikt; 4:V.{{l 4GD TV5t.^Fn@F̘NwB-]?3Quڏ۾kTMF{[ ]ڋPB^lt[xE5C{^VC1 z8D Lq |½#Gg߾}_I x<>ߥK{{jJOO700h<8"AAAzzzLE􂂂jRO<1csGGG޽壏> U5x'Ob4**ϟ=z'|}}QXXX۶mܹӭ[7"ő xxxhjj*ťhB5|DٻwܹMIJJJLLpssp8D'HSRR-,,*U8~dvvjÈh1y+/ۧrnn^L__Ȩa6v֕yUjow6{nVXX4dH"i6eiG®߸`ӣիŃ+`b400'A:Tlْ妦QHHȑ#MLLRP(<}t˖-r1c߿陝miiyXz9sn&O|Mggxss˗/nݺ۶m;tP˖-Wa6ln*8p8*:F5uVPDD99R"ZtE` ǭrECn_w*5̎zM_w6l BD;uU@.X,n {o[QmđjWbVd}c{0E6o\ݻW.nZ&M4ӦMD4k֬gϞ]t)++KWWjRl׮]bqttt۶m׮]kggGDr|[lٰa/_駟T Zm۶;]655aN?,ɍ;dNNH$"LciaAD "5--5%ʢ2Vv6[\.tqq13{Ne9_~CUC.gdml| ̖NNʗaK:J$CCPPdff;?w_$&6qrz (&8;;[]]Za]D4cԑ#DEE'&&Udh1xMa~s =&&&**͛l J$~aԨQ5)UVVFDׯ_(**J=pf5v.2tdNNo6:X8)qqωSg8u8ݨKWDFFy||[62amaC^_CzAD1Umj5\].YBa֭6}iSeQ#_z&Mj2"yKURvԠA:ҿ_ۿ'G>|#pwksU+ EEE+3DDDVW^[2!0&W-~HB"rvn܄ZjY^6jg}|3{5Mc/uVPP0|+W mmonmCWCrvSVq3zԕ Og͝iF 0Abbb 4hɓ'޽7w\"а7VmkkKDvvvgϞuV6m\\\?^򓓓СC.\odd˫a6Psڍ^}>`~k9qtt -mqDCת=uԤ~#0''.\DD~i=ztԙ .yx{k|V Tۥ+V~UV&^b)X5wW;"ZtOng|rv{uq=xpok8jվW>&>sT:\.7$ѕ+^`u̟Fۃv> @^==haaѦM;;;T~HDׯX,޵kׄ  ```Puk͝Ο?_PPv8r*@t+&Mݤ֭[͟7.]rt(n޼u;??3o!.\b{>tj\t%//abbbկ_jjÐΝ:?4ӈ鳈'\+**UKDKNwԙ&_|F3a7~3m,D2q‡go߾[Yo⼼<"bAp7]n[7|yyyA7n:|eD쏯^QXII {Jӧ ^v|բڷoW|4q6W|P(vݻ<}+ߔU&Md]d/_V6f1ך5k~'\znݺ$HԬY3---///\^D"<~:vHCCC.'%%hwv->3\pU2x-nNNd-TMV~4¢[3m;;ÆM]FNn.5-kßdge׿Mpν'Ni*+;۹IiF_$&ſmRf~ƺZUR""$u6ȑߛQadd8tN3R[?f/ kS5Wﺳ.|пw6C& [_Jܺu]ثeQ5y]ʭ+Hfd5q^͡áqnccSk}a.]0=<<<==akkk6s999bAGGlٲx|塖-9**l _pIPZ6a8;[۔E >ɓQϝnMڵuzzƌ?ۧsŹ]v<8$222ع ּV-U먩S8u7FEEsÇOc&+SmV*Z[[eddΘo?:;7j닅K֬Тœd2v6G"***AXrZSԭ:5vW)j<~^ :k}ب*S3-,,,*sO@MYij?<7uJ]!0;%` :::kdo_P-ل._rΙݺu+"UKw9=zt|ް *lr-7|ATtL‹ٟmZܸ!n޺}?7Xƺ h^|u7zzz Pj^[׭Ыݔ%%%%%%첱q/]'ìMD;gv]\=ۭkSfU=]̻W3^?&OEƕʎ.^lμﱆdHgff:Nz-++̴f[ع;{G?AIIFF\5PCGy,?6/S*Gu;J E~~~~~i6)eee "7ܨWuq#T=Z\xy`omʌc? N>.R"aGРikk;7inՙ547.Saҝ? Y[fz6RYokii8O155=A٩޼WokSV=g#7KEEYu^\XD r]KD e÷ fFF>U]0 HP(BmEEFBa٥gE"![fNn5_$ݸ~RKKK,T*eYY%>yVm##~ Phdl|3Zdv[;ǏC0`#haEm޼azI{>uڣGgNWΜ:&Ht;*2 @D"y\LHOy>@P–߫-[ y>ejbvcRm={ }1jkllc"چ?`E5'>пI=,,N <> ?.6J"QZj&OWT P]fе/5w" B (ڙjjjqBJ\\T*!|"L&026hHDDiyyg1ZZZ=|p̜%\YvV&D!@@|6g^cܨ|=z.}ދD' F xr\(,c HWW"6]&eJI/^־~.cB$I$C2XOrL&d2C) JKKU<]]W(x)S2blM#ht RC"b_stt:ն4թ ^&'>[R\0[7k(R0w[QQaNNvvD0L[/46^P-mmx#d``P(a8:9''7FPRұcW h`÷UI8=q3j?00%Ł/pE\agG,1 0АԗDIaK9NB|umk0xH\waWtɥW\\יS*ur? ,))qvv>|' >رj˵Uu_Tzر۷oVZL4Sۚ7֩sիW z=d6T}ȑxax<ҥ}%9rܼo߾o9ήk׮'t}}WݻW  _VV*w՗x[jسgݻw6,==ckk[Ϻ\aaa~N:yk׮yxxԭ u=zT.7o<++룏>>}7|CDڵX,>wܤIƍk.#xgϞ}ԩӧ͙3'&&駟4حݻϘ1iӦV7oVhѢGZ[[GGG5FS#s֊L*-*,(.)Bc2YAA~y$Iy QO>D4n},XS+++6e)))j٦MY&++K__ӧM4qtt:$<蘖9ho~~~hh͙3gȑcǎ} 0lbqXXj+a [l߾]ܢEߴg###{=;w֤Z&-Znhaaj_Ϛ ʕ+{fS_$I~~~JJEel<Vnٳf*۸qϝ;7l0t5pddmDh~ܾsu7~}ۭ@ ؿ+"266nѢZ>|]ׯߌ3ڷorJwww7Ͻ-ZԼy;9+((q޼y O^G{8tR6@@D |Ϟ=u[ٳg{zz.XΝ;55i]Q\\lffVSW޳gOYY5iuLL.\|%6}={\vA:tj_Ϛb\غuϷm6lذEUQ&>6lXqqg}Txi 1Wmڬ\5DDDvGݾ}ҥK˗/OHH:]Ç?~|KrT:eʔe˖=x ""ΧU+22R,{{{&6o&<}444T́j^{VC ٷo}yuxV(QQQo_~[vmBBµkl٢:T;>57118qQ y'Oׯwww/CBBWE=k8_LHdA__899Ot5O^MмkC ke3Ua&&&DԽ{VZ]xtuٟ{]\\8{l"bfΜ9FFw522R~-2eZװ|Vwttȸ~etuu]T>}988§O׷m۶aT#e9j_Ϛ'Nܻwo֭G%TQWN,<OG@2ultٯIU _!k&##tU/G󲲲\===ǦQRRj{%IZZr>&(ռ[ַr˖-[lIDÇ0`رc~P|*괴4ae;gU :4%%eСWR!C 2]6`cǎ}ᇪ^|YY=k8_96fit5T#` suumڴCuVTNcIIIFF,66]vU&9ravLESV2,77oڿk͝^k9::={ !!ygJ普 "p8ʛUVquppxQΝ(**J(n+t5*=Pޖ-[ݻi&d[;VYݛJDgΜ2eʱc~I4BagWcz7o{B(444r9w~M5믕')={611LJ|gؓ*g}sM4ir|Æ :ujڴ)V!rrr] ЈcPC?~|Ϟ=666AAAj7lذ.]?~ǎӼ+KÇc~>#a*Fo-[̌wƌ7on85| gaaabb_ihhOܹfرr<$$o߾k. QQQ5yY[[Ο?_.;88,Xcƍ{M5r/^4338qul-pcO'|r777[[[ Gz:pe2;sssg```II===hcǎU[ |3fge?3"} 6lذaRSSKJJW+.Qǎnݚ`kkkhhXuaaae)Νc?nggnQ>n8DXܤI-- VjXֽ-'>>>333//ښ~_*YV؜={$%%J[lYxq~~ ˭֭[eee)))ZZZCΝUճq9s&--M 4mڔ6mڴiӦ1ƥ/**߿UV={ܽ{aӋl>>>^sXYEk7_̷zM[[ݽU믿bcc֭[rXa4iҐk YYY%7PsZzy<o@W F <}Tyb)))j٦M.gee뗕=}I&U_W";99988F+k^Ϝitw^ׄk```ppٞ={؅S ͌s@`?o`3x`fkѢݻwBCC꫅ Vύ7÷l7;((hĈM6-))޽]_}޼m۶*&ݿ_Cx3uQ۷=}K/_Pu>~888K.Rtʔ)˖-{ADD;I8 FoNYY?kZ'Ofg'޽{V.^Xuں{]\\ȞP0̜9si#7l&11+Z[[+mll222NWejj.S[)%ڴiCvŤ$eDWѱDPŦh80gace˖ѣG7i>-..޽{رcXk޽3gδ=sL\\rҫsܹ?Sqq5k] ?nktsݼyE{[ ] {kwqUUǿIAfGTRq*+Ҋh6]SofesvR3-+jdt.u.I[+,L\GCcǏ2̷Nݭ):ZڷWŅ))rpP~"#ռʶ:{V|~Ѐ%Fcc'77k' Ιպu-:}Z_/eg+*J-ZY]XHcǒMmϫ9qӵg%i{2,g*)I>>JOW~/Uث*6/ӟxEEãdtW6^`(k85lx-7h^""ԡCُjy-}֮Up0!}E,__MblGs>Չޭ#쬂h u$I+0P?$WWEFjL_6`4ܹ1ںU-[aR|nжmrqQd.ڳGrro/՞=zeMTۇiPYZU/um^ XH|R d07ծmS߾U_|%))IM*=]f)6Vg뫯ԩ,WUl^? OJ7.~(*ܹC5nƍlp+j%zyzj4xk ialѲeŻ=Z.^B w2d:[?;'r-sqq)((D 5zBC4hj.ۧp-^;o$gg=F԰azm_rWu6m̙%;5mO:)2R9-]ZR-<\{jvmܨב#]Haa ULo+,$[qn[;i->fLo%%m[k|u频#UX(I>>ڼYg7TP{K]:vyM38vIUQyԟrWL|8*U \8D;xNpU˓tޓvvŅ55EwtAuCɲ*yܴ@i*TrgRK6LÆIҦM2DK4|5|\\'JMy;5llSRӳdK]ea7()޽dC鶦撎+PR~_彪"o4GTe8*R[ 71¨V2e q\zzIIZr.%5uC߿c>T'뫂%&߸=Z\XY3=#GnN.:5UWlǎ}mLF+&ÆjR_޽K ,PbÆ% RRJXX_nܟ֭Wj GEWEEN\u9??ݫ=%)&F99҅Çu}1Cm·[ZZ։nlo+H>]7\|zQN7K~R^Fqq *-w I+W꯿4thٻ:{VeKc1CiѢpM',A+VHR^f(i[^U̙?_3f9YtieQU*'KTFV')x.jѣJOѨ7Pjݚhrvsw訄ćƍ}gVVufEobc.W KKm __I=^{MO'*0Pk{oM:^QG-/Vv<=ծ\\3ߍ/ԩjD4H?.>:}^>>j켟'O+Pnlp-[y //խ[eQU*rs+SZP\ԢErsӨQ*,,Se ϫ];M{/ p-Y@2Ξ=kmm[!#˅mXH%%`8򈈒m[r~lX۶);[񲶖̹35eժJϘ(}ݕU睼{w͚#GF KKk(+K(Y%J^*.NyyjB%:w:zTrtԩ={.WUo^& eeOvvR-=fWVժ (.;ZR:{V[ @+-??_R^^ށ-eZد_NWKacqpPvU=-*?E{UeThbQTWQ*>T.>P }pkW p՚=^ZĚ@"GL0aBE|0k#u+ F#\>׷5uFHerZshP5bKU©VҖ-Ȑz-\n(4TSZT۷+/O;+,L_IRPVh,]VZTH:t{)a),WW}\\y ڶM..ҥZZ{(#CNN{ձ~EڳG/Iv! *KK!}nkrO ڵӶmW]/4p$%%iSk,jl}:u҂KgB}II@R>T4^qa;=tƍӸq nEQd@^? OOM_L!//hQ 5Vѓ>5~ՌUuȨ{C׭]?b+<ߊ:ѳBPED 0ݵK)<\Λ& Y<#5l~[zU9Mt4sfɡ(EFjNMSNԡC:wNKT ޽ھ]7uy.*RXBC +VW9:Zyy¶mը02v.ïWmnS׮Upp+j%(C^qԩuSl,rim۴oSsYlbbŻ&iޒIc>`ΜQRR_~oW.9R͛5{xCڻ3QnoIQ:tژ12Ou λn\5p""!??(*رUΖ$'wr:oDUTޫ*2+JzUn%Qd@ǎ-SK JKJJ@-Y@ݲ~Ƶ6;sҳOՉn%'ʪ1rRɽmmÆi0IڴIChRwW|tDI}srFvv%k('gɶϻBoQRҽ{4mM%;VLX5*Uy{9J*Qݢ_8F-mԘ䤗^RϞĤ]dddH:xБ#q||}UPףG k`@5kGu֭?Sjر㼣͚hԼy eK}z.)\DCj L(HI)caQvzssZW_曫1]ULQ+d0ҒH@mY@21~߱ݻY|ݡV(118or{Uf3gj|͘Q|fҥ GEWHNN,SIp.ZP\Ԋ˓DM}YZRH"9‚vc'.;IO3h~MPll*ai +ww5iki iD}{ {Iǂի5j>Ζڵyq#:UM[GOG͚KV'kzٕL@(WUon6|-Ӽyrp\]֭*SRˍj (.jxUrpЗ_Kh4j ":UY9zg uERr򈑡}啜z:I=OiƒEF*)IyϖGDlږ;[ڶMي||dΜ)SVΛ/]ݻ++d;y5KGG~a֬QVQAKv U\ԢKuu<=訩S{,{k]n޼L$8X ʒ.2][z|JG(UP\D%$(3S%ĥ0쳊p~bi:8x&?[ziZد_N׹KacqpPvU=-*?E{UeThbQTWQEU]G@puqumuˏiiiݬTẉ`@s....FfϦWY ֋\߽>[y`)kU1T!\{\xH 9 IVbGL0!G$rr@"GL0*"yr@j_z9"ބ@=TA~D@z@"GLd0< #&D#9`BH 9 IVUfzgƽ{RRS6/haauvޓ߶mw4jx)'Ry߭X.J?2~=t̙sڵkÏo246pO'$$&$$l¢$w,9DFm[YY(LN>amťIxV|۰aCI}ǟukV ԓNN%SSS=<323˜ԩ4{{ܜC6:#߹ۯ;;7^NNFq“ƿ&M\ټy_;~|ᗋWY۶^7$;;{կ)A `0acƵig>OOD?9aCJ rEE5kS<==$'&< ԟnݶcg;;[IYYY&>8_OL}n{xJga"......e -,,|}|{*[ ---7oVX[[jղfYԛOҭ[WOOOF{ac>LdXP' M[nmm}c$YZ07OXZZ+ǟxʱQ7_%3XZJJͩSi9mSXh>=3%,,dW8i~}ml{\|woee2if͚1mK7qI2%/|{wsssw=e]]MxwSO;w.)k&E U#(_Z֭G[jya}-)?yeʻuIJwVr_|a*Ϊ޳~D#A <eT#G3q2#hߞxP_Y՛' @}ɒ%K>l0켽{մiSB U&.\|򤤤Ν;UV׿rrr&W/5ׯ{gڎ0`3<3gI)))yyy:tpss;vX\\[v,,,$eee为J:w\ZZ$јmZo߾͛-iǏСĉw1f̘W_}o馛$mݺk׮/rӦMcbb$/]w(pU$;//𨨨={GٴiÇfΜ)O> yN:m޼ٴDVy-j9G`oo/4@رc]\\L>>>7o={oQPPw^I7oNOO?|)S6md 0Q+_ѭt %y{{v===͇>iҤt'''ӧO y-[{۶m #jc^޶m͛v 9rdݺuOvttjz#O4i2p@777??wyߟQ+&?Lj8 ???+++==}׮]cǎ]t|pa5+++x1Is5ѣٳg-Zd80`wyI\e99s8::zyys=Fq݃ ĉ۷o?dȐ{|ںw 6ر)Gտ,@iV5hqJFDDޝ9s)S[jeiiYo޾ۊLK$Y.5 P!k3`fA5 PETd pbIYHOI$Pk55 `fe0UAj>kdWWA]S:W4_iB}f… ۵kwMX@dZ'ZY ///::`0o߾A”͛]1o ? ޽{Ĉ999+VԩO3g?~<00 5^pѡ4hPXXyZ]x{h4n,Ky>666&&f֭I&j*>>iӦƌ(igΜIJJ!Pwf!JVVVnnn]S ))ɴbڰMaIN׷ 11Ѵ{QS!a vIklo|W>c8}oۻh;nrK-5 P;9hѢPOO͛/] OE%>KGPr7n4oDFF&%% OOOsyDDyRVF XЋk4Z9Wj0 p"AҬ\Xf#de0XEaBfU$U%IpP.Ӓ+?YXZԓm;;;>7%2:׷티6!wޝ> 80^Ar}tH~tYwfEvZ%QtءuVW^s IZj$//7Y7>~6wNPƵZ98i13|;My^ W^~AAfÇ$oo/Syg };Mܹk K7\Ւ.]:sE+o=.77'*((xч---wzΐ֭XPPPTTz:IÇYXX\Kr޿e58wܘ w]L%@}<ׯh}LM?ըQ#IQQ%6|Y}˴ݵ WO?^***wQ=(ÇΜӧn萘$;WUႷnɓ,--{~nn֭۶;;;yj[vmlml}}}Bo )---λN8!)#3tÛ6RE6doo.ZRnnPNzؾ8:8J.-7ʗ"I*(7> L ~ܹ#fX w- ;?n|Cj2=[[ۆj߿Sj}ILzSbbUk}!s͢/SN7tpb=+j*:dii磻5Ty_U;nͼŌB/5Fu_'$xzx>ЃCMtNnnnBbCÆMZZX?n[~w 1j~) _PrevKw`ZYrTƵ_ h޼666-[ @W՟[r ?'Oҥy鲔ԳgϚ~d?\PrevKwTc1殮ٕ,p:# ??3#39uIo Si11[jKN>Ѩc6VVŝr4no[Rؘql񫛛?2x@F'ٻ/SiiM|13I垧\t'ƌܹo۸fy_{Mۣ￯:yr_wK***<;nԓOHڼyLݲ;;[I׭lT uێ;Lu*9OI*[kVȇ0Q%9:63J^={9핛ygNN \wL{{空#B6lȨp!+PŪ:u|q:{RRŜOKh4m^ObGs>quu4nT݅) `2 ȴm4zr_.`0ݻg=|g{s%)} w@UkG~ozْwV|XwR3UVmٲ%++e˖!!!:t&%%9:::88\TT-# ._<999..?lٲeLLL՛9s&((GԹs'O\{8t˗S)BPYjׯ{g.\[o>}h4Sbkk[ĉ㣢<<zI>hSSS׮]TM9leee^>G{?0=`A̓$DWԜM-[ Z`ܹs~ [nW_]x__߂DѣGM6lx9SyJJŇ¢.P$~ѣG===Nj*0ױ5ߜ3&&rL"r5?-jGusn>$°#N}\iU yyy3BVVWwI@RdfIMM-wIw=zt<3Ng=;w-b+y⯖墕kל9s\\\RN%`#7__23m<>7woDVVVF$EEQCg-v׮7T^v}w|M r5ֶ][[__aHJKK $gggoo'NH,TF+8r5ףMf}߶m;L;mUזccmSʨ]rW̅_._nCmU,Ao7m!U#X•,-->པ\?J?붪W[E!>@nqwwL+ѤI(9u_:Ă#&D#9`BH` Bi`U$ EUow Ru<13h @Y$ɪHRQ< IR ',Y^{{j!!!K.֙K7IJJʺ*jh…˗/ONN޷ow}wB``O\СC/_~)gUau){Iwq7888EDDtaܸq 647ݿ֭Mw<}_occcfnoccf>tibLbbȼ;:880\iҩS'KK˄I?~|&NcǎC~צj~ǻu6iҤ-[\rرsOhhh``sLMf͚;{ɓ'>w܁h??ӧOK:tP@@QLWٸq# @sjFK.𨨨={siӦw}:uydPPʕ+k#_bjժUK,LS]w.uaaan!'ٳQ҄ Fq=߿`0$'';;;H*,,LJJIOOOOOqssKIIqppΎjѢEfL'b20L>=>>޴m0ڷoߠAJb0LϏl޼J\も>2/bhh/w=ms\nuٳ-zL I7|-[vϜ9V91e*֭[¶m6jh߾}z^zݻw/XTw۷oܸ?rHyyy_hVXX8zЈ 4(,,صk׾}/^sJ`ƍԩSnbcc%8q"77iӦ 7>~xms#+%999)wrr:w\N5fӹs 6Ը?官Ϛv'Mw^34EbgΜIJJbЁ iiiLJJrss%I5W˫r˭lݺڌcǎܓSSyzz>mrrr -)..tLgz{E3$)$TKP or r AP/_ A+(EzF$FҳXcH f9gf˼w@?23Ų=<<^;^vMlRSSUVQvsAnݪfO5hРnݺkܹ֬mڵkE WWW )))2yϟ/xwm}ׯwҥȬD=G8{>VJRRl,(Fd2;vܖ-[VVBl\kp–.]j*9<<|ԩ&L6ma!,,̶߉'lȲeDdƍkHH-n`e˖ .\n]ݺu[n=k,MӬV̙3t%RRZ 6''&&N>[n&IDz?--MUչsvС~8 #W :>>}z5z5vsgΜ}v¿M2e֭ζܩS 1>ЏoqA_~ҥ&k߾}m۶UeժU?l񉋋8XR+%)u*7nW@@dZr>}ƌ5>zhO*]pG>lذsY,:u888fh… gϞ5nnnӧOקw1::p%۷_p3gtbE뮤~rPM*Iٯ57n3<ڵkǏק'&&fffVX⫯JNN>v?>`bGk׮ݝkڵ>~2Gx;vCHa]Yv@Dr)EQ4iboo/"^^^"?o0M1~{OD"""|v%%%d2Y,M3U/;~x`ѢEv{P#X,'"8кu)S4l>'9rA#FhܸqTT߿M6z7xVZ?CVJyFQA@޽Ǎ״iI&HUՙ3gvE :t萕jժQ y睡C;}ԭ[7v}. f͚5j9ro٫W+f'..n,Ν;6kL233{n*yժU;p@NNN||"""lŜ4M7n8222))IQ"cl߾_~Enm۶bnTDËվ}@PAٹQJKp2@!#;5?wt֍^cEAD cdk׮ݹsg\RRRfffIsUUݰaGodȐuTJFbŊ-[Tʅ|W޽O?-"-Z|r7n("IIIzv% %%%d2GFF֮];00PD^XbbXHҬY3T뛟]I&GEESfΜ_dƌZ:ݻ]v{򊌌\`q배̩SZho6cbbBBBFWLLʕ+y|pǎf9''-ϛ7o|r[sYYY+VXx- jժUVȊ3f̘1z͚5(,<|cW^=m4UU{p+c65M 6lXtt駟fggã=zԩƍG)ɓ'-K6mt%g:5MD322XBDVիG%"Ν ٳgDDDDDD```nnnTT^ѣ _P,z^:[UTE{}0>44tС޽{sss("`;wm۫?6ͷlOjժuG+y;PE32kѣ7|aÆÇ;88HPPK.- Mn.ӠA]t9<b*vEQFoܸ144TԣG'feei{Z7/w )-X`ٲeaaa@ .\n]lٲ:w;#~\zuNNlnԨK/Tl0eʔ[:;;wܹȬA_~ҥ&k߾}m۶-}eܩS':7ʺml#""l _ P~ݴiSfff||mHǎK9v'"E} .l޹/A2ԨQrVRpttdp3Cy]v `P,T-Z$Б21 Op㌠[n5"d@GFDʙ|<ѣ{ォWTrȐ!֭+)ڵk:uz7[laÆ&M:uڵ/)*]4iRZZѣGDd>O|رcW6ml-*5#((2v?zhOO"bbbΝ;7n8Qe%51j($$\F+"ϟ/<1???116ly+W:;;zyyԄ-_prr2 ԭ[6|nڵ*J10eff&''Ʋ g"tUVi&"SN0aB@@@)Ku}„ ϟ5kvF0t>l5jիرcϟ׬YԻw󟊢L&.,<|aÆ;wbԩS6+""ppcټyf )~G3QN:wȷ~ۨQ3gμ曯*?oA{ QҥKCBB DԻdƍ}]{.BFtd@EOp{v֍^õ@8):TAe֮]{i1LM6ի>}Ȑ!Æ {'*iv_x}ʲe˚4iҾ}{6'eVk VXW_%'';v0`i"QykbŊW_}u)~ٖG5x{=x<إK"eΟ?9ooF #ɔYv@[yiX5kf2mCǏs\r)EQ4iboo_EV3͛Ƅ"Gu>}k힞"һwvٳ+22rƍrGyz:{Ȭ#G<իW/((ݰaC|;vf1x(bkl2UU[lYdٳϜ9k׮ӧO.X6ǎ _ziTU4-44tذa~]lOΞ=[xj}ꩧ qĉ^zW@HxxxTTѣGܬ\|g7ozw7n\ݻO<^PP?f5MD322,KxxxXX~9@```nnnTTC=tsmڴ yVZe~ɓ'׫W/>>VZ"2zh,נIEQbO'2[߿ɓM&S`` ?h OOOtE,ẓ$&& sʴo^UՒZ3gN-LblggmK(D$))If3ʠ*]x{{jժgΜٲeիW.]+$AAA.]T? 9rƌ)~~~"_U @I Wϟ%K^>((G'NMkZKYd̙;w[n֭g͚ij9sf.]"#*I&k׮I&}>|-YzuNNlnԨK/Tʵ"0nܸ OEQVZ?f˗vH߶m[m,X0uԴzFt}TB6m̌^-]`A%4n8222))IQnTy:ooo d25jԨ>>"rٌ&M;88تϏ;-Ҡ~=;;;IOP5LJJcI5@ Uh4^*"gΞ8Pz3g-?k":jLӦM>R#E]{'NfdfL__$"Q'N{~{՚ч>;,YsC<۱n[n@D9}bu.sG6,vbIO^svm[k6e8ٽ{ݽC?ݲi,ҔI'5Mҷ-[/oDgM:c3kVZҹWT@4EQ:`||USDZ&&k)5k׭YND~'>>>""r䗢??߼}f+=ft>}}ͽ{z7ZZ+D$!!\FhFG 3zRj&VURժJ]s)s+3^NMM}mo/&%% /iժcwwm <\th4zzz}|jHʥKG>^|e,yyE\F`$@5x+9zW_wIUշև$SfjԬYSD~O_thdڵkώ goo/"~~~i~@ٔ4@kt}whЛs5YӴ~:ܶmۼ'bZ͚5?k.ZA6@QZxԉ/֮9. dNN_}paX^nC3usi^(·:v,}Ǯuz…> lެmbyi"\l/]RO?/^5jxx\`ӷ_ j2*ysf׫Ww ).)x{{n"((0.dը]lsU2#`B]WNûԫ[l>w1!#:2 BFtv­!#:;Pv U4 [Pu_O ؓt@x@БkPO x@DFQO'=Uu:o* U(t##=I'8kDk kФ*FF'ȍ{dr7ϡ2 #׽v< c#&Ѵ;T ? 'lh,2]UZ}z]&B/EF.*l܅}(TU w}őgykNՉ R.]ןGxfmLGNw{ ܷ"ٝckNe'$j*Vf:yy2dƍGgz!ym֥3ظmʹ߼sś6M?W@%:6k=vԩd`A/7%%ĉٟp7͵XUg^]N{{YN4o3#B^h3; ܧΞcW/^LsvδSt@DD2 NN)){_͚ss=عk/O{k]XgewU[7 "b4^hӈ!}n?z.YЀGGgp|aiɩRN{[d %GǬԘ]ya1r+!" >vuQ;wOt)++h2aѧ3V~}YK#}sĠ<M~;?xjKL~~4pqqNͳ$$$Oi[4=g'/3MF?f=;bٲuGҼY3Wب."1֬YA9Ywܱ@`Zev<2F$%)F$K/O?o`,{ӝETM˼xѻvmMl|ٳ^"&"S_ӡ#.\zj˗RCDBGiѢ?U^_b<#sO^VgfzϞ=Μ=;qFzgΞ[0^׮+.]M|y̝fÎ7xͳ}˳0jG<{B¿F>~7՗#y ?⒑~e曷l۷oGWWSN{ G=z^Ia+'5ʢi~ jX\I|mXo܆ ڻľ$&Y,ijXR(#5.??y?l_b|?tm\pA UUUӴI6ktW.?x`C4mݾmkW͛3ksrr܏EtO=o#p9u rW^Ͳ|ibRR~}7oGPPP׵kWg gR/_KkѼŋs&Nܳ@}z|)Tv92CUU͡"/_ٸ%o @5MZ W+"nVSb/)ZO:e5!"ұCK.[_|A$h4%$$DDDv!:_|,|_O.wr^={.Z!!/ޢ/vUU^VUUX!%%EDbccnA!:w~ݭi*<#U4M 0NN54(AwkGX|5?_3AqT,"5k__?{V+YE" "y)))Fw ÇئjB-e0o7C[m;tf?O|]FYŎgdwOlݖ bݷW6Aq"qJ- UU]㳳3*&# 2jU Ѵ 1ٹY&-W4y㍦oqh(ժ8"|[k~mZ;ph~@jj .~~~V5!!߯DUUߚ;ǧ%]rY|kG O}oqxƱO\'uCC0w5}īW*i9nnny5[>5*A腎VQUj͵ZU{`Kܜ9?jU̙WutQEj܊T2m/%Ka.lF "r/}Ykv\Lt߯CޜgᇬNի8!ϻ/>[{+??۞5[G?ooqQO}Nxx;vVm35lذ@ҤIݷ|=1 +(# 2Xӧ+Wr9"G˙[*v[,۶啴S=nw{~xq6>ܥoN۫Fu[ ۵9tйs+rCG[~=';VvP@p[۞|]*Evq);;9cǒTUtTM!>gY^uMq ӦMMW^=/^OZzz`ZFV~ӷ_;::Ş~k^ryzz+};N"R{fgg'%_Qrmy۪y}[/ ۰7'7;6|gt~|gtz쥰CZ<{c<0.c:A8ڷ@^nh̳XZՠC]M-(CɠZݷlֿ#fovf [ѳO(߮]?Ke?s&.KkAmDEG'89v_I;d{+\\\խS=t]?^uZ?lf"f".oTU^WR\}{[,7b&6f+WF@@<3VæktjZ jv6m~w]EhZR嶳eFq'>jo_Z~&Vh4jPY"booY_" K_KK.Wތ.J #e۶U5-=9YDǻkjkբQ ]2W iZ~~`yjP?D\+WL&Sիn&lWɒ쬪-/J__OAAA))ٴ_Iwժ+ 5vLBrW4M3 NNW._֦OM$o/+T^-##577AנI)$&%6m~Š={gdzu ڶɉէfͼ/ÑRYYDFP[R922+W C DE3\4FDb,PE+~66<@Ux>&S"s S`:2P%(QJµ zĮImkw`Y\ #k waiJYC.@_LIpE^f' TK ϗGv(|p !^õ%>$A'橚 w0vQnUCe\\hYP ;l w>GFp/"S}Y{s@Z1!##(=XeõRZgide?/L+,=k ieURNPT!wT./2qd{A~#Dd~_W`;q_ "b_HW|܃8. {b_Uc% {@s_TXp4#tAK #:5"d@GFp F"UT0ME) 8;b / "J "°1 q_ "b`@Б2##"d@GFD!#:2 BFtd@E24^GD#:,"Gtd@Б2ev'?"#P>*EF{>*`< "bJ)iGDD4M+Lm@=ŷ##ܑVvw$k 4:*Ύ! !#:2 BFtd@Б2##""v Б2+} 'G;) T(ڠR#>cEQ8#"72#3f "YtU D4MDݗMPdggݻODN<@մ:()"RnrcXCMD4EO ;5jQD4QTM4QJcOD+C^_^Z))Rh-+)\yzŵ-^cE1k7=ߟUM)-'A_ej;6:Nnz>Z7˷ioEQEU+_kן&iܼ3Y襧jE^J?R˳n*7?tVҌ2LtD+Nv,zC}QcnsUz;‹؞V-Q(Ѭro%wTIt+TVSBCߏwV5(E?4Mh(NTѿ(EHWR-?+KT^E{Jפ_we5JwO^z+m)ͭ0*2MnvofЊ:T+RoʭV䅫qU헀Rz76;RuMK>9E+OM 5cjUUGP۱C٩\XVV)-O)04^EV6Ŷ*%  endstream endobj 1322 0 obj << /Type /XObject /Subtype /Image /Width 1233 /Height 761 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 83271 /Filter/FlateDecode /DecodeParms<> >> stream xw|e6N-eQL(U~AQ?'_F\A iE&t7ͼqCmH'^.&sw =?"ZR6h!@h_T8DDg@n,˱l6-7nTR]]& {8C?V$;HSDDV<lP"%2X oǜsVY*,nJ@R[UUZӗqP?u2rTbzX-29XSs1a8XNjːB!z:2asݔIB I0VRSIB kac fJJwЛu)/h4DBo>}z)|}0 #IC5bvqܝwLd &ju&I.~˲^^Bc6VYY%s^#ǐ{V~njVc!G #Rm{1H|D?7jʲkrsU DB·em; ˥CP(`Yl[ƌv=8DOIJI---e1'͖ID=Ä64%5"{6IEeeaaqYYy_1͖5-Ds|;LoIȰ '8j2mGN?OeV;&F&`tg`R c_L++~l1k=&P{ўM%[ƪ* ݯeO\h D$Fa EK>Pk6[u|o/'2 sBm>TӍO/&:2"<5-sRz8fXXXӋDɷOlu{\Z6jdZG7Rd2ifB,jBsEE%D i]dd?ze2qt#`XXl<&FqNp؁.((K>u+kjW~ J$eDTQYw3)/zZ bF "jǯ?a+*OED"H$gYw%k"@V3(4^' [ ih*ӌ 9 \IϿlNY'}$%^ J6ˉ(pD&,-ͤ)"OG g`25-d2yy{^#bj;w8jj D=p@=wd0LD$×CR7 j q|}2D95u8C5I^kp#Ū,kRӌٿ sPuX"$DD$qʪ#8!r#,9b( RZZvUpX"),,`+SjR32+L&30Æ  TRQQYYYSTho3g ED!`o.aԪ`TZU]}I:*880(0@&s#䔴=B===u1D-_ZgM>Mo"hh|R䠥j՛&77݈(;'h2껇v6yI\$C!rw=IxYW!ɈWw\^.4X\^^_ȿ4P+LGGDr|ğ<}>Mf 8}<˲~c9~s F&?'dhs 8(P.,,*((T*Uyyz֏њ QGۖa+ذl6I=kOztde檪j·<х4ߓlE 2կAm}'Gh4nR7TҢ fdvsjW[Yu]"jM=il&\zOEtl6[eeY֪j//&4?5>n{rm4|hʛWk󪍎N\<kd2L&sbCT*JgF*H%׉`f#fG8lKDG!z{vڼ& ӭ\ ,# 'H}WH =qH)kX7ڸ(tt| @'kɱn胾ǜy'@cNbOEW]>Y#r[y3&DZqN"Fxxs/x!- 054# ȡ k Ĝ1'.eVh4{6m)EK7NYDtCj5wϼ?x{{9^T\.[T?t-.nX,'5>Fǝn!C nb6$@cq_vJJJ -*.qUꔥ癌:il6VcY9dſ%kpm_~Nm;:ۭN6kwDm6rV,--Nl)%22C eWYYVKnפjTVTJ$bBfθ?~+2_sȱiS';X d%ZcEEEPP ,[TT\9{r\.7))i!!jZڌkG./gfe>yVͱn?r䘫}[nm{xޣA|9Z/~tђj~Ρca}?x uZ`N:}׌Y|iԘqDtiw`ƅ;9;g^|g'Oq@qrV/?4pUӦN~b":pWdNĜuZڽ/{ooӧ_&>[ h24z>1ÓU`ɜҲ@?as22yٮ)o599?6u#}>>#F W(7oQ*wm;^cq@^jjxܰ׮%"Nlc2f[tt|HDÏ>mpÀ4'FVhp점Ϭ6@ۺvL;|xgoqnbKw; d:IDod4>fb _n[avauk^Qc2~6>3w3N,eD4bD`Ehumͺ&/j+/E˖.v\vɅe B??N6bZsrJ)&Z Lcys'O=7W၃\ȡ/Xzq{?h=#묩i}r<<_c"(<<=XHM+Ӝ H$+8nBmYVz52dpPPt1't./<:ڋ]9ixnC5a J.5<" #""IWIDD""HH$ 1WD6"ៅJ)Kd!2Y3>&98M)8e:@Zt>ҋ#bF>Jt 5ڀN] 8!v&FȇH9&]8h!DzbMǘSP̹;s41'3ʉn߰k 5태T/U: u >C͓:K"ծs{SUUUAAAc==rΛ{ۄNl[ZZz~]jfϞӦM:e2=h}Fj8: gֿNyWl+]3\//UUU 7J-**2fc,.] =/)+]ϼ|}}S[ADYY . YonX7f(":uǖj 5aÆ4m,\|߬qe7V蜹=vBtvhPUOʙ֬;MfڵӺ@ЩbNooc'F98vИ1{$/;z?g?0s]|'XHD,.YO7?i量;pL&s#j{׮~pww߻Ϯ\?cfųMIJ%Dt+?x7TKΟ7gG9{rj{Ds^@iԜ +xa>)51 j،iíwS.c\saӦ'l6~ [?~lY/^DD>Vu˗_eg==3vww'jjjz}b⅑#'%%'%%T&9555+;'#3ka9XU<=C5L&kN+J%tC"7xޕWg2pxk4o?V":~"y wSYƏvKJ.QPP'm-l2eH*h***>؞X\R"Y*х[ R?DCna]w+ܵ)k+/+;bqh:ja]_[[KD%$X[tt|HDÏ>6;ּBlҢaÆ k^/7ǎ_n֩S37]ZZX2k&q'L+ȱAu $8@ <|;ۛl,KGAD {~1}}̸~ZeZOz|"=1LYTTK[_xa\.Q;~0uk^{d_cm}sis7Xhh hK={/]k[[7oљ“KhNkfs[nM݆-y|Ѳv_6b8((P(6WiiiEeF(;`cY6/?beg0 +VkN6 @`h@+;oAxX'OGE)((t=zx'6ёC^,=5!nd4vtXvx}ΡŜ.*(9mxoͺͭ{&S( J@Vr<#pȼEm!G7~*kǰ]תwބ"@s-ő -9_Y8엩;p7g7b Ś~ww'!GFF7W_.~n@D2b6vOGh~й0,8f7lH$CܱwH"R85~c?14fvz_ڡ5>NbN6q> UTVjusA\zғŶ?lٮz>ݢvuh_G>>O"Ω; :y׉Ngog9q"~37w3| "E ʓEװcVS zN`nq(bNhsͶKot[#aZPS7ޫht#̈mu_¾?OHHhWWW;)Sv܉]ׁ޸BĴɸVYRsD9b-[6lٴiӱcZӧO6//xKD&8׬c ?iiہv]4{@i?=\o-!4 .Ç{K. fpl۷UWWF"2 !!!DIJl^^Jiii:ǧo߾bbt:TT*(''';;[T1:WTT\p{~<<<,K4 ħ7LGϞ=%''8P*6!<}61 6$pgx C#V0 ՜2mx֬Yƍsww_z_答ӧ B/rҤI^xqvv66ltR>}?~w;Y㣣[ooܸoټyܹs>o>B|GyW/\o.^N'N8tN 4ȑ# … ۶mϞ=[QQ/|!V}gΜټy3^:33s7ll[ӧϟ?_?s,oTi,^pԩS/<s…m۶&:@1YSSCD*=%NϚXn0?~ϭ3N7ef'm0"Sn{M0Sn?msө.CcOu &RὍZ0޽{;@ (JRܶ-`Am!й[u:3b]L;ڷ!1ke (vТ&ٶ*AvbհOaZ?]2$QbNh2ob΅3;N|.zO:j37 ıM1mR. :7&vMnlv qtȹ]9EX;v󉵵*Uѣzn56=qQ}>+m&Br*8EH9 `0xvUvv[ ,{g=n8H #]l_7Gm37_\33DNŜ-zP @veW|XT\OW4>>>F 䲲rLf322jROD9ZmuUuddX,]؅OpiNVɴNoHwQ%1vV߀s6Ø0 ZtF{=ԓ 'zxxxxxu'^PTyWdD?<=32^{cO$Ըܤ8Bť-<ҩp|ō?s2QNbNhPʶX{j(DIJ܋/.\0+#3kOܾ+Yϭ|by~?8u$J袧 cuƌYi#u!( g(m>_l2G*Ϟ=m0l6[jjIFD|wIDb8:67i!A2d-Un0Q[ޒ 3f1'@+kMQ~AA@+xԨ^^2' %NXl6+c%jvҳN}ts%c@ UH:Dy+//?>>ar9WctNϸ:W'.StzĬ()Ӆ]bΫvG2 4(88[{=dh;mS&cڗȼN _|5Up̙wI ϻv+ʾQ,f|\tnmk^͵B<59*q7Т[ 7uSc޽gdd~mof&,\ZTwe:}@{[SStD@5zկknz]N~}z {Yx?>s&C_shE㡔ӗw2ᚼRָFltWt5knaC_X_NO^nëȯzB !jTVTJ$bB`Fn/JKKe fnْS,Kdd}R\nX#"g;ӞjINNQ*U=J***P6V[v ;G=zdqqImmm``TzI'/~tWUU*Ϯ/>ؾ+} Nm&+ݹ)x̴p:LgKzs+qss{v媓hh>7g_h[]Xƚ]G.oY㸲~YY . YonX7f("3w~TTN(-͙;_)ϭ|f 'O/z|iFSc0 2xw=}C:ҿJt $h0,i-}s;Ե=pf2-D\1' dX23<Ҡ@"bYv'?tO=eGfθߤds>~"U/~dq܊gWM:eK+V>o2%&^س{'~g_~}=rg{G̟7g}M|"{V8fi 漊FOHKKl/]jpf& h"kNez}bgYLD*UdNMM߿sόTy;WSSS\\\YYOa;n6~`_6L*-vjca8ʍHU*˲o]=iST*`(../i,{?:uTR]]c: 7$.nhgbNj0,kV맟B!˲z}^ddDNmj5I@`@jj˲dq\V X#8;y!B٪ժ׬{՗jk~~~ks~o*Hݹc{^DR{xΌ{WUVu',?_o׍%sNzk /"beeYU9I'\.-5jB\*l]hRJjii-ŜYW>س{E\7Ϟ=8DRz.c3(gXsn^=ۤsڳJK4vS_H$dYN `Ξ@Da=BS26[pFcS2JKLfD,V(|{ RW16~Y,Vm_4bWQWYYl "mlH$o/n t:f~-˧pΚ9q٬w@4T0iEV@;s&15-3RRJntsrRIUUuVlaa݉z}D"E9Z]zz֔ɷI$b~mh4drd&"=((б2C<|4^zVaɔwߊK"mghɤ2l2r:wL'TͭrV1#suyylnpl_fm>Trݰ]RrZQH$ Մhuf9;G0"HB5!"QGꂘ 9GTC5)@DlCٳF{27l,W@t=qdfdfP(.KF;`2=<<1/&:2"<5-sRzRiSbсG SDkڤR}/VׯLAAQm].W*MHzzff6מ Oǎ'hs Ba알CwaGk"RIDS&F |:}j4q|c nfugfY*7 tןN4{b8T-**!PM?1g'8aΓ+Yb^#j=݈\ $ڨq0 >{*|3 )uR 2H"V bF "j"$"T*!¢ sT"H$ٿz<~S[ZVID9ACC1 EDf1aڋJ,d2PV3 .w'"0f?yZwBm˳1 sf6Q7pX,j*==BaӟLC!f̎dK)Jz%bt^?|FJ[*.,'8//@q6b6Φ,>Oo" uqlf㸤Ԡ@o\a4H,3&n4H&K?"z_U#\}KwF>/?j B!1tG̵8aH(CP6WSr(H8㈳'kz ]M ҭ_%E͹` 5Y,xsv_f(:Rs,YB{&YbPBU{]qN./tsur)-+/-+#"“t>aa?s>Ϡ@??>MP`3Y;H2ٸO$t)$Iܰ!*G=c7P'&=zG^Bu<Օlr%Pо C*.|^=E"j0#hzif3 /OC)$'_UfM*]_ ң&+;l6WUU+"^eK#<"*##?`IDK,~t# $q2[-yѰD&$N,m|VfsH,Z,ryl&*;qCP$tJ[m'j&4fz""ZUUCA?5z{?8z#_ط)Fɇi|lqE~qOFG'._{ܖJ$R[ 0NDfD3bqRI'' {n7ӟy1M")h3K$Ĝ@pqnǡ#F `jumlРĜ-lq]]AbN<i"t:椫3,sv=qD^-<c0q,g8gQUUNn!l]qݓ6#@#ngdtzE}@ .v~"  4tbNpG D4jx  %|u$G' lMsmd# \s xK_N.ARsq` *1'@Y)ma/{ZFٳgiNLD-Zj_.*.pw.c)9w,((0?R.ȿ,*.,\̜qXbؿw}^Z0a\ϭziqǍő 9b V_du3+*KeEeAAD"V(DdْS,Kdd}R\nX#"DTYYr=Ϣ"oooT:ޙ%`0L&___"5VTT˲EEJ3[QqqtTL&8"Oo?I69# :+?v˗_?h oQfV퓧/j;#G)̝ʫ'McΜ=gao/3F2N f{fMƌ$Oc0-mA+}7ޙeeF DTPPx!;;e-*1Bqq 2Gxbq̟eԴ//o]IeLDӧMh"ڊ ~h4_M;9nݚADѷvK2dF&T#Gv[{zzzxxQO?%~4ˎ;n[q܊gWM:eK+V>o2%&^س{&M|k$&^ѣF*׌5! \ۉ^':sS+"#z:}FPyh''^PTz}oHgzFktԚww󾛛+W Bo/V⪕Æ q,_o/s3 Ŋ/L6e)s>l/|=T_=KqC3 qww?tPs2ٲe_PPpYfM6Og_2Mo5}U=9T'&^9bxRRrRRJl2SSSwgF'N?fӮ{fl9PQQj,wD<80bxM>sŋI_~~8f̨nͻ߶ fdfm'oC_ymMXX-?t|ؼf݆ }M￷٧֬[o4K[/^ĿuaC'!п_qq^GDgΞq9":{ܠAn<yxsرw{o>vX{ ZgMsyw(11qǎ=z4K.1 %t:O߾}ϐ.]4~˗oڴ_T*{_XZZjXt:T*U*ɜ虘.ߢM ?0˲rcW$ΜqKxaʄSfi[q'|}}=jkTUU%^u;d5̇SN3={.3+`0l4n͍-3bqttmn.^xGCɜuQ"巌ߢXeKS&s^^z}'w.l69N&tyo~λt)+О1cعbŊ 68pβlm6C=t_{9s9s毿ڻwoQQd;j(ٜX庂Y[u.UcРǎ9rlqb ]^Cl۶]@s}k/ٳg``O>;'===))駟<3Νt b{iiiD՜POZ>pƍ׮]kZϝ;&Zo,?#16z8lO2|ͺ͹u挻N9`Ʋűr[# a.oP(dYtzϻ~iAAn|Q.q'g;ߓnv9z|[OttXwbcAm~p |dH+޷vرNl;ugyCH$"*((Dk)j5:t׮]믿nݺYf]7VKD*NNww* 7qLVTߢl:k~ؾAwT~&_P}%sSN դ^lƲ%/>=x˘D``ȂAVmq]O3swޣT} :y[&G޽{(X/&&=##G"ݶ#ĜD\IDJrkBBBVk^^(fee+$wqu .nqԢR*uTܭ:먻nnzeX++7\ ѣG=r-[Fݻwo ٶm[FBBB "cZ!4MkN*Vlr% B'K5U$S&[\\bmm+jOָ !sfkW<+;[bdTv%ȭM=[fg+KC[ltRZRێ;ZYYx-[du EIII~~~ddq<~zBe&%%u Ǐ+-+L_ahhhkkSd {;WkIQԞ={n޼iaaannsNBHjjm&M?7nܨgii9|paܹӽ{wBݬY<<<{=bΙ3̙3C&vPzئsU9-***==( vdvrrr?.:ֲBVpppPPP~~vڵr_MǦ^50i7T;ћOk ~N'%?qrqG(w2k"' Rhkk>XW/"{m !"QFz98pP3ϟ?׼;s\~M|T*vzxxX[[׭'N}4o\>&=w^m*0zժ Ҏ'7ǎ_v/Ƌ7I8 !ݾmID+M=k׮%7j]veJIIINN655uuu՜ "**NSUqqÇҬhDe_k1۷kp\˼<̂BBQTXH$6勍U( hN BB$HS2226trXiѱ&l=J"66R3}QQqLL%[ee2i\SkkkڦP( E8;iV],I@ :X;U@ye୺Y.Y|Xd!pؗcǎ|cbb\G.]211 `A9;;xyymٲ%;;Ĥ|:/b|=lmmۦR1}g3 !Y:'hcCmlkȄi<(~#6מOk=͈BvGnR(*jo4#w͚6nr@ y3̚ݪrw_3g P/eκ%͛7㏿Kkku֭\RT޻wOSdرzzz]%'''<)>}zu;vk5O_OΎ)ATvmcbbcbb,e2y||&4mdDZ 7nުӢE3aaӿfaa˖;~ݵafgӧW&N٭kCCPyKs!R,7'G(j_255Z135Ω0>';hbennFζx-A2JN.;Y?jvԱQChիGͻ#?//ReccgڴD{QN@.y<d29v#~_s֣^p}ajm6gg;vL0!)))$$=>R:%%%:Tv¡+Va+++a[YSY:СB8ۡ:u/^_7E m077/+++(,dѴLz+55sg mPTYYYl/^B,-̫+^Ejħњ5uP]U>pj1k^=i8r?B}@39ߜYVXrIIIiҤIBB֭[j9;wiӦKֹm2 CӴU[6W~@Vߺٺu+B:::M7V80i <bgg۸ ;6oVݔ;))]xW>plҤ7-]amhݪ f+J{|uAȨ2Ju[MP}డCj2cԏ={t>jJKKٲug; @jSN]f͎;&M4k,B1bĈ7o\vVVVgϾqy/ܳwMw͚.M[/ skkGV633ˉ^VV7hwO?o_kk+Rٿ_{VXĀ3*f!5+ޭ0\.7++oV~EQk~.YT*z55"W[U(c!fimp woN|>CFFF;U6uJo8k{% U^Xegg;99q8*xСٳg?wO 46\W/VMgd=T0LZzB~¢";[ T*SR%WAŋf5gYLMMjY\&JZݽ>{YYYٲuVukz/MLO6yۘi}O655# N<Ꚕ|E B'5L@ӴͫH$5{Turr|d<6UꊿrD .ǎprrsYv#o!pqq 066޾}{*n݊iؾ}6@rssWZh;,~B>04Boɇs/s~_DM9{1 r j?jU֯Zd,/^//9u܆ _|XG=,/ˋx}\}99X[b7> ] SS_|`4|s~hhcdd& ?av@ P(4MKMJKJ+9gMLLͺv%(p88K,K+kT*16q=:vA5@Y=:ywKJ|y&!}N:u=q&=qBphթkLcd27044 9u}00E"qii !i|B eˢ99B EA~ޛ߼PTffQP(T(l^&* JٗeePľIID+yԈ!& H#D70Dr}|xvq2;F,I‚|"d>_i>/U*W jp1 4,/?Ⴙݻu+bC ګc@6Jޝؑ?q3bcckd\XXـMij{,]aggѺUoW#?ʪy ***ׯSIilJ|ݷ5}aMYS[^^ZD>(ҵE~~@Z^~ɚ,ϻwvvoݺR*:u*.*7Jϝ=%I6koиqs'FyW.V9>~5سgLl͛ǣy9R[VZF;oaXѣF| &;mqss}WMz;maG._}TCBHs2*55"ngãy_Y; +/ rηr9zMQ%akYPͼstsΜ9WsIiȍܜL22۳CTBtxTNCwn)ҭWf-DF܉~i|,[xO>i;|(;,gT?䲽ܕgddԔVSR_6ppLV0'O%ooAڴi=~ج5ksYok0iiiVVVEUf333kš9 B__O(dffBLLܷ{tg >z&CA)(({jcc- *T7to11)mo*<%77OTX[~-km>CCWW&ųZ~$Fi?@VkGϠZBԏ?Оi /0svǏ& Մi?vP3RB%r[ﷶ-AGÍy >d2MӍ4,@QGBJKKm$::>5#?bӧ N=v11AFGǰxx^ܒdN^5`gooA,ͻtDۻ@llh7y?͛7~rgg'CŢbBȘG-^4R%;+P}޷@7r#ˆj(&6nϞߵ{/!5&&V3'Յg*/R5Q7ԼYְ͚ kTfv[|PPP0pυ?.Y=w!Z~ol/lN8RడC.q2mSk^5aƆJ&ʴ;99ng8_ε_$BJJ !{hӎrB,R?.^ҭy˶;ގҴI)'+++;~BttСwnٻۑskڻ@|HB,**NLLqbeeYe3|cbڵ\|IͣrvGg]Q#!q3ⵖԻW@|EQrrr !gΜ#Ӌ=tekks؉gΜswwk'wKKK EYYEK˥-džTs`Pٗw@*VBڶwm_lmmnߎZhoU&MR046q|| !X GҰuͰZ oRSN_PP0y҄Y3:`7 _M 2?N<'9EY]l>>槄?.^zeII͈[ODwuuV_kpxB⟜9{Ol>Tlzu&&?~um̴XL8Naaèrs*àHutth7puorimb^~~{Iq_;R#(Z]djտM<.P DTJQ 8BD"!!D(Bx<!D&Brrr!*re&*ӨQCBX,f_dlB.{ͪ+[]m4̂-(^.fgg>ycӰu+e xL]Zu4BQgZ.)..,,2 d-'CcKٽZg?915;Dc.CPD޽zvWTC]u{No,⥖-? \[ )T~}G3o{ٺ:y #n\ BS<==] }⥅H$2ybuTWvyڬ,TfggKѾS3Y@L&M >Y'|x<['-Л `rNSdT g3a-gDJAԄ)ZMq8O@ ><ߤS%/wؕBj6lE$2+dj5C_``BqEY1(utեR!TS)Ui.SVt%\]! K%\WɥiFz"OGettvOPKGWi"sBylMJRg.WJ5EU(4vhSFBnAaqBRCdP)+o@_|Bʴ =)"h}c~՗z{Nɖf:;ڧe _ϸiR^ng[؈p发/xB=qx%˥ļƄS./ֱM[H"--V#u ͵sQ@ /IF]7e,P"ڤy/7}ȽsVNnFfq]:U*9xj#g9~詮4?+6j]щ3iVR:4EgBtFҒ|F η8W iBZVH&n.ƒS/=Z4srw/Rӗo )*eDp](iIJ! <]BX!+ D&x|E iRViXb)-WʥjFE4d/2Փ\\F xB}M+ʊ*EXB'jB{!BH㥥EaK˻u}&Y"cf-EKB> P4U%SRMTJ*cT*{#g\>l| jTSHG ofbLWV4 |hLyvrA e9_ię~|L$"^DddfEa}lF=oټȘdV pzj)/R_qygݼڴh~?jme.x%"@R)Z6somcޤ[#BQ;0v˃7@_,&>1$ئ,?s3\<|@WsiF 462v+qR=bs{iia#kIwFe_&|=Po[^]j^6-rr tl;y%y3mr[K+?|kma֥k匊pkYqe89nIsi{l<.#6tNYJJJy1%h؈!xOD"*"(<<6ڵȑ#>-yxxX[[c}ց7?B*B^?aGd]JKGϹlq"s/g,|LY^Ƈ\B#<:p̸VٙՁc~yM6_-/.h؅M875#+qFvȥeM5*Eꘀ9g-[C/ϖ/]+.)Zȣm-mRR^~B7l5l -7u3eάū6z`61 5ڶPrruu}|/] iyIAS;KE=qɳsĴ^(7ųmR^dR G{.˪HNZ"*EePW_]ywHHСC>ID+M=k׮%7j]veJIIINN655uuu՜ "**NSUqqÇҬhDu+As40BeqQ4 64p~ص[m[Ң[׎mna.,"?3GNs<_PΰkB㔗i}HRZ[BR _d$#!( Us؛obl$(0p"FtnFrjfzGQ΅YnDB!a"Yif2S났-ܲų:65HMg#>ܼ3BBX( lϡfvjѩT*,:XRZ0:.hB E3KJhaO4g4EK9'ݴÚ$ 6GGGž;v˗MLLΟ?/H!=zt钉ITTTppp@@4ٹk˖-&&&CYPKa ~PՄQy荻îHM7DR*E1K |]M2ízQ\AS-KEE3Sc\[i*7-k۪EmZ(p٥Ewe蛘=}wPB ŅkB;YYrYYI'Oڷi4i޲r4/G;3T(Ej5Dک)EյG#O97եw6O~K̰k14'BRط×[`okeZ݂VH)"#9sYzuNLVPPPZZ~z]]]///velllCC\}+22zzzG;vɓ7ngϞVf&ePU3*R^S3@uJQ֋ߋz4)Y.։ܼ|B}\c/GFes+i:"pu"<.,*4^TT\ҾM˿AJT*Ւ jWu~`ŝGE%v6v61 f;x\TzN=!ޔ1vIUA)p8BPCVWo] ǻqvHa`ׇcE5vuqiP>b=!mUF5Q)LyU (u<{M!Z}̓'Z69igcIS͛<}ϭmLsuO6|菰k=tJe4 jُ[Fݻ g,Z9gO2`(v.W``lqY68S4-.+3mB.#jC$jMf\!D{yͰPwLLȥjk࿇P[v yz&M駟N>6;==yN#\MQ;2++K,+(;; JKK7o|…]cѼljjJӴv2Çք؂O>kOV^^ѣ WlJ%˛4i"4n+!;w3Bŋ{}#G|G"Ll&@s'ϗJ,,,4Ö3}M+WԌԜ. 9᝱Q*iiiVVVgϞ#PUn={RPP#NLL|RRR=0۷og (š@ c˖-.]i&aێ;+nݺuܸq愐SN%''{xxp\aRRR4iuVm؎;&Nhmm}ĉO߿B٥K3fܹS$p///uZ]x)b V-?ر=!$+;[,F^ N>sK;;DEEر>>>T(ڳg͛7-,,vY˲ٳ666fffƟ˻wngg7k,ww޽{1 0`@]\\FaÆi޽{-,,\]]%̙3+tq7K/fX,jؽx?01 [[ ?q:4/''G&22ӓ?bkz9Ν;vssJOO(JNhuuu5j^r˗<ښs#  wrr>]gIIm۴+\fMRR>;2""B3SJJJ^|innMT{Ε8pםkɎa((,T*EE<{pjjZjjD"qtlyNnnP(T(11f&Kik߮s5/˺8I$f!Iϊx4u+(\\\*755tMT7|>ͭib+V_%+;mkvF ]nEn߱yΝB]vD*iyeL nߎch`5a?).): B=01CFFFIϒW@9sܕ׾["R:ľ0`1cnݺթS'l6[?FPY:vlߪ^^]5$̚xGּ5d 6i|%}=={;;vX T([,ahr FBx<^ΜSSS< zfLL,!R&7olԨFMr"Mّ9^C׮vL~CΜ L<5##[."0''W󖩉I-gԴiIha3|N' !4MoܼUSEfom!!$??_3&// .ڷkkmmKBMQ^x~Hf_)_hJi?pUTmh0+Wl۶3@ P͹|j=<;jnsg|5Cv /_Ҹ}G[YY7hoO߯oujz~Y{TڦWZnbj5C;s\`WWWkkkSSӻw޽ s}}wKҌL sZ?s5SΛ l{:uvJi۹}k1f-Z4uGrՊa3Sӭ[6gdy 褉n"%]]'N:;;k_B 5+WN&H$[mɛB(:96dee-srNF#}jA^s 9' 99'X` %iW/b=pm-  wp Ԓw7sk7!AFQ70ӦN?v\1rNN^v:"$YJe<O.knаSNqԩS/:uj9~݊1ڐSd*ӦN߱cG7oܶm۟ŋsZb0 Wf͚G>\z? 2dŊڵ[reǎ?޿3v=rNE޹;c^]ܛe欠;w7iӦoܸG?s׭[8'O.[K.Q׹s7oj偸@~NJ]~3h܍6eee̝c ̭OS<\ή>ou̹~zӛ2yt0@1qă1bݣG޵k>%`򙐳-3ŋ=|aÎ=:lذ/l\rUj:!YFFJH5ty0hyNV>;;G'Nx666'N|qvvU+x!g_999oռySsssݬRJo6l0dȐݻw9r_Gm?tG/_Æ ;vĠA=>yBV'~{Dblyɂ"D<'Gw^zb[zzzn֬{[~I۷kp\mTPX\TмY!/_:GKuttT*ennXO90yy H$F0;=èrsbrNe,pΝowwwz톩IS *L&۴q] 7vy &6nOkBC?~R\R'>t@ }弾0|aCTل622JzzWhx'֯_u֯ݾ ;:zE^s#ع.u|o~-dvJJe||B߾}BIlǶ͚K.7n[3z$!3!' T*O?~}z&!d7K-8qEQS6Ϙ9g֌V-9;d̫2Z='hA F 3w~X$)S۷/~ [2}vá*|d}}g߿[I^~0.y9'x,ɓ'JڽYJ~aCItɓ~1Z.B &MѣGǏhƣ0 }9>Y% waQ?wGR 6Db]cMH$FEcoػb/" iqw lz|xvfgggOCCGDiiϟMerN񓜜\fkQ,xupŋ:uqݺvIHHLHH4778Il޼yԨQk^0af7#(D*Bp.WU,sԉ_LOQU!&Ms NBBB&O\[Nu/ytx߼KUk+**H.?J=|ӦM;p_8vu>[^ֻ֣צ)#l|C%/OaB"$Դ⒒m4-YٙYiQ3_V]hHpN{9bĉ'utt_*--9bDϞ=8hm5,+uw*,,~ ( ٲ;wq噚3?$6o޴cm9yƠSFZ,^?0ߧݗY|>2Nlɹ_*ӴnwBEG$;vtU\TlݺdR\طo/&MSaD4+**}%!@ Zk.Yt</'''$$dU{\dQmݽZJʫ.X2661CH+븯S'Ըlblc\&MtqSo۷|r}&zv]1?N;9vD;|@ӧOߺs/s= ]1}w |?}YP)d}oŔIffϾ r*|UFNMMMWGs׺/Ȩ]}4'bNXA8>enn&J$:J81'@CګFks_w1'|n@z:s1'|,ϒBN@ 9sbN@ sbNש >:|XDddaa_t䈖@ $ɪݻh⭿o311˻xm**5_Xp'ʶmz:͞6uz{߯oirw8x@q@ Y_ (3>^[[I2eѣG f?oI>s6''q*(br;u$"> yyyP 9;Qaa=R :::Oh߾]Ttc/jܼ[.˖.VjjjVUU%$$VUU={X,涊L6XdmmejjJDS^iӚ*]Y1sb533+33аYEEEIIO-,|y5JeUUU-Z}h1'4n[t)p&''EEE9::ڵEbj|i:Fӿbff6}l=]]T*~ߺeLmqkFZYZ40߻wRh mL=~2{I~m)9lAʋ?uu펋s|`[,QXX_hh( 4hm~/Y;f4]xV_OO* r>xW.\,/ܲm^vX,8xK!ÇykΙL&9kޮ]{?y)&6ٓzzߌ8K7KK ņr|ᢥΙ=nܸp[7%0W G̣DHW,x6ѱbihhCiiϟMerN񓜜\fkQ,xupŋ}TKÇySVZ S033366[. f"899|p#CC\KKK"ر#soYf kۼ];SS|A>QlkjjBDytut.rE"q]j>eڌ~}iij^"2167a[=C{Ls|`N:L^fuII ݾ}vvvDTRRnѣߡdKK {RlӦ-Nq8LEDiiGP~3DtԴ}s]\:Z_QQADr<8:&Vj~}FzQQQ[݀e~ŕgj_Ϝ:1'۷]dy<^NNNHHUztɢ6ܻ{GWmm]>'ellTc6qUܛ5 b LX\Rbeiᰫ/_f(=u"[˳sr4a@ >TT~aidTVX^PP`1`ǎ_Gamq\[fo\SSӶYS\رcGg ݄cyϟ>A9r9 >|ګnr+vmXgɏq 4yW uzĜP\ F̠_s@2sFu7mhT؎ՈF@ Q#2&h<П>, JJ)'f<5ߴD}NKJN)ODue붌2ݿ/c-T*̒ɤuLĜDD%׮ߘ;gsD%%DdddTۤth?gKݻu}} ZZ5*J/\ jٲŰ^:S{M 77~oۛI0bʴVΝkKs>s)C._ґ|6n577kժk7 x;hT%yW)'"RN_T[ 'O|SgDLVM={eoNǭ444l֬)w욚ӢJQq$''U544T.dͺ_KJΝ9EDƎ>cά9/aXA.%"T&LMMKJXPP)U&%=Lu:Ar 6-9thQQQ۶mztU$q?<&&VSSs6:իeK)%|~U29lR"}%2\Nr9~~wFDC<,((lEjeb|ǍpՖ9[x郇V/ ݩ'f͞®yAaa&ܽ{_Zz_hjE!gϞiL||/#""<u]H twzZL=~2{I~.]ue_PvС=b˳gσus_==zÆ99r!|e"i\.'L.T&H"#T.e2jӨmS4iFRUU=w>xqLBmsfxD$fΚkI~N݇w54ԉϛv7cFMUUU+'6kT[[g皟ﯱظsgOFDD~3n/,--ybRu\|̲ 2LOOO&>~V__?-=P"X"(9)ֶIC\6ݲeKXryfVVfFqS4:3/3c;vt`ЄD"5D*vd`NouW]٧Wt{CC.]\׭>捿ZZZ<|w~B._;֭[D3H$iS's8ȨWQyy˗oD30 _2/u޵{UUUGݢ={hiiY,.kKK;*/\$]\HSCZʁkffv޽yuƕ̿>KJJCxYԩ7ctuu(>r!㾙;ge?-7ܻǟR^ а{[WPx;a^200YxC<VTTtNvVV6 :fLEj)8k$[̹cCciέii&&:::gxs:4S$zX$23ZKKK?z',q}۶rbIrSL̟; `Xq?o΢vvͯ^޷o着;w+z'|=ii}wv,zm```nnKDJ)5mjCDZZDibbBD̠"H*Ι@y<dbbҭ[{ghC66u9qb"H)8kR),zVx`ffBUUUR-Bo|all5m ¡Ò|ajjXgH,))X\ub;ҽ{W >?#3s%^^C3ㄋΠ_~}D"vONx >;oihhFy}"b|~S X,EMNñKK.kk۬u Yݻ׀/KҟC!jjjA3Å,__y?uuA0}ba[`^VVsSLYbl6p8wx7* :xxAj]!,--vl*241#5WY'N,;9uǝL)OCC}8k9ŜcYTQYT`z?55fM=ۉSUUmjceID&F3UޠN/kO4P:::n>VI$br;u$"!5=}lXؽJyŜgsttu׮^YRR*˔驩jjjDIIO-,|"T*KLLjNSS7_84n\7Mec;v9?[noܼƵfĤdOnk.**3}Y'M /&Oa R^ykX]\:kjhnG2s5CsNϞ=qC=m|vծ6x@J%8Ukޭk":r[&M WcbΝ=͸t/\}9gэ.^rU ^}7w(S&ϾQ>3kI> &>DTQQyG*^>KOO:jNhXfffll\]D"qrrr=ovm.>@›4ibY񒱑bH a[=C{LVl޼p1Sg^=jӱrfv޽e2ٺ5?~^M֬iS\7ٳG(zxx 2a#G?X=~QK\訨(Pd\?k>y0lrgrssii}ͻt^ƿryxCTSVDD 5owÆ>=rss|>jvvviiKXpΝ;\?ʇ-WjjݺTٵ>#Ǩ-q /[c.ԱԦGB;~޸q#YXXL>}ڴi ~S --sJҸ8Xloo$[.00… "//O[[">>iӦ֊b'OX,V6mTUUO>׷WNOsnMyU$,+P_8tX—/3LMMLwlZ^^kԤ 3Pw\. wV~ژS*޺u̪رcĜVVV]v%:ee2ݻCھ4ewww DennND/^ " "rsssss۷o3futtp:}l ѱcEEw6kz0h/AG9gl xg|pcǎ [fM.]ϝ6O>sݻw\.}+DL|"jҤ ڿAAy3e>٧Ozxx9::\d˗/ѣyZZH$jѢuttd@e;;/[^waD..D$JZS.((IIIVS^iӚ*z9XvmUTTT&)驩ն;hh1h)e7mA#tx>ajjzy 'Ox|>?77Ç'((hҤILAY@`dd9===u릪efPP7ǓJ666ǎ#Lwww---== YYZr8B"Jyb6 E׺v'"~m۶yic=z\ZV} u"xzT$uS-\ckW/^wCoն;hh1]4_1,P֭ⲳY,g׮]bUÞ%AI)9Os7-k|I,VT:rrEK3{&ݸqk%n\eɤg444l;o׭]%rRa^RZ`ʅ=}|/W:66>sGnFo4Az"UfywL?ip:mmVZ۶jjj[~=̬Z ͶAkCS~V*ET%W{U.'XD?lY[ ;|޵4###66nтy Ddnn&;thOD^^C444q->>Dr:0ӟ?O9rh?S$ ~kfss9R}ODo N:а24Be"i\.'L.T&H"#T.e2jxYtqaa_O8fnۡ^1?Gr}8\H$&|A>144dMMM(O 03 9ceK?D}&7fyȑϟV˖- аG.// K`ϦM85i.~.ޜp} zR+00p޽w s⥴;w}:ݾ}{С͛7/++suuݾ};3}RRa80`O:"w(jjjF<,ؾ<;'רI=p?!>.RvJŲm gwamm|&5r)B͛]]]~A&1bk֬a^9uM&&LdɒN.7)}}}W\IDϟMII-֘ 555m5}M*{>s۶m۶m#".{%>Ϥ7n<~D"DGG+6?~۷4;;(55bf͚DDDdeeUYY߹sg*Fb 퐕;)x>x~#sΞ=~~EÙ1 1dCCCmm\&ɵ+** '+^|f7H#b4*3gml1vϞ=U٨ՈF1'x׮]͛7߳gɓSRR.^XTT̔*.++xDHdwV>F'hgӛ?իbL&KKK#gϞرZ[[{مiiiLM&O>s D$oݺ%J?UD"PiEID3f(//߳g󝝝۴i3p_=|P(vss7nb=x`EEkժy>ᳵAAA>>>Rظ @ݳ/_V^-Z+[[[zр<… -,,ޞfffeeeup<:::**J(.YoEEŬY¬Fc"5j;jРA'OyĜo c'''j*%%eժUEZFe…Gx!ܽ{wlllHH.3W"n,--}2=<U}oժUDHD)))ղ%%%yxxp8## 0"## f`` H*++Ϝ9Ӯ]gϞmڴСCڵۻw/._(..nе_\z-[ˋ{,,,VX`ڪ!Fym +WOh@ P999~3fS}'9 6TUUI$m۶1[ݫ徾ϟMIIQSS;v?M6722rW\Q~"""bbbtttN:5~iӦX$x 6lux˗>FĜԞ]ۙvm;wv pf8:++x}};w0,X`kkaiiz!Ǐg۷oiiivvX,Ν;ф ^8ra\]]۷oү_ahhXUUqÇT,1sw%QD[FK6fEL&QQQQtD]c̩ +**j,Yx5VF9,''j8;;oذaժU<oڵ#GĜT@7i@ߧOiS'AkkkL{n?vzD"277'/^lŤ\o[,'Ҕ-,,jX,޾}1ckhhh̞?O1r' nT^'>5O>s D$oݺ%J5krJ\.J/_ޣG&377[[-W={233ٳO>iiiDre2zbκ:rȵkO<~ĉ .DDF̚7׀UT>AAA>>>R񸠠/=x`EEkժy.((<ٳgDpK.ihh>"ѿ[-OXXإKݺuٲeymtqqwww lT#Tv_ߪUKΝ;ۧvu߾}>>>h IӄB!˽k("9'_i@rN+̂222LMMQ|uqqq,Ke׮](A uuu}ڊUοk.ں|Ű@5Vk׮bʊG ]863qvUUpvRRRLLLe==׿O\pJUUQ_?Y!mmVZnff1Z֭R 6mcc^1ga͛7M9RDb;;eOOŠ.\]]?9Ria3$>7yV$ m_VzMNצMiٳ75GH$>>>&&&˖-Pwx'|H*~7/^rb>z̩YU!d W^_Ĝo'N{ѣGe2Y~~>&x+uϩf_ǎ g DNVYc?t-Yl"Y<&0 GyӆvȊ8^h1'&xBh欹-ٳg 8B=>$]y?\lh,1'|(hh@ =~ĉ .@YEEŤIZj_>zm۶Lױc>9:wӴi®]:tmw 9|+]ZZ'П{dRSS_oݺ'OJJ ~zyyy"?l޼9'Ģ/BMMd2b,CCCPӲeKUUՊ lٲ"Jbvmըoڴ%XզMUUUEӧO3221'vO7:`ۧ"$">/vu1440..رcϟ*..ӻ /_SEDgN222֮]ĨDT^^RYYYmIII()) xݳZbł (22rذa̙3ڵd#G~۶mɕ+ Ml-4^>_{_p؈KΚrSgCńBmۆ OA|||\\Ç-[6zv%%%3}2GQ\\| &۽LLL6l0rȡCFFFFFF8prwBBBXXخ]|}}_vKHұcz{{>zrѣG/_~իWcbbN8bNקe-ZؙJ"hC2vX---"ruuD~-$%%1Ǐ߱c:thʔ)u,<555<<_~VVV?~}tuu>x3<[۠?qR g544|khCmۦWOWEcbb555mC# _Ztq~}?Ct!iiOw9>Roȸqm"WSS`p2eNڦM@p޽{ױ/_5k(R\\\d29y}̝;W(2-|-RܿȹgϞL":{ӧO=<<5krJ\.J/_ޣGss󴴴d"r210@9/\JOOWZYY]t}AhڷySj\ƆgjڧwO"JLL:xHbb2>|wNJlNwncjȰ1>__X\\-EEE^C^. ~ yH"}Q;͛>{Ddfs"jݺ5|i#7x`uuՆp8aaacyzzvMUU5++k˖-̽͠ ooo'Jmll1233ݵk"<}lNNCfUSSCvH&O͘Æz7Ujʕll$R@p?1]3̌W\T_>ػo# 5+W'w턄388t6u򎝻#^>pxw}z _/^es8sWl6_ elv(j/6ܻks]\:hkkFu*]\\vRYQQQRR2uT@rNyxx",88,##T}Z...)))|>_1,P֭ⲳY,g׮]b::wIDݺvYtbPC̢bIUUIqINN.-JZS܁,((ԬJHHU雈RSrrruuuZc?XNݱ9j{9b%$>H(&&% LL/5VsqK.+VgΘ,̘>ѱeee̗˺͙}}3wLss~[6o011w?xsߊ &CRƢ*̈́Y>sYr_-^kݺ;ZKv555fefffbcc!cj&M>j䰑#+'޽/-=}/lanuʋL)/Rյ;kӦu?;ŭ?L6k蘸v 41ܷg'XNݙTۻr%}o~Ĥ/5=xYVVrgNGxpWOOj|FL[jnaM/CGfeeQqI򆝝;)~VM&ijj2î0lDb>_&&&ݺu w|98thjcSBD$T)RՑ5sZaaWE&&ƟL֭[ =wuueOsK`ǎ]cfݽxU./\}9gэ.^rUWllܥg9*cgwB> aj#j()--W-ZtףrM:ox\`ђ7TҥKCC2jjj[tjyԸjuQzrR{=P wmG^CxU0ՅBaѫ"P3(CCjO[@}sZM8ѱb544Ifffllܢ/D"qrrrhM'H𥛍53*Û˩üiǻvq 433bƍsڪ0RRRAŐhkkD".ˌUήyll\1.*һw~)4/bڵ:a[P88Wm\<[ۿe6##4ԝ"USQeHCCC1t޽|k?k۶m&fG]]}O$>}zUhi>{.xS~ms;6x\&[S6Y]wZUUuy-ٳQܼ\ 766"ios >_h;poyyy"++K"R~6кg|H0X=v T Ú+֬^nS44'Oh,Sc㚺? CFH0D@7R.jE.``[-8JT ŅUWh OEQ2M_<@"*z99s9 z~4dӖ:BD"GE9{;;D`0#]ӏq7nZQYYXXkwatZ2t-+TTT̚n ]Mks.웵uc}pPPchS[KJJ?_X]]]SSۢkQw>dA׮yw⽤nݺ5; x7vwKy&nQokx~..}Bkkk%z=zЏ? w? "kd$}K^;kQv`=XHS__No?1dXƲ+Z=r.pv~7""|Kݺu0oae&i};-t\ 'O ݷtɢWށT9{̌زq̘Q!'<RߏRe@#jY)|Z۷|MMͱcN<37} MMM6M8q U9s&"9'CVmEY[[~駟VtR///cQQQuuuj<<Ў9'@t򷘒B|OkwۯZ***tP(LMMe0{/_޿gϞtfѣ˾c\,''' B{{{zb"b5+++LMM E"Q:s\>_TTr>.%%ܜKj9'{دYOϘ>sNYUUU=za(jƌqqqvvveee.]"$$$L:UGG>&&O>WW&''GGG9sݻZZZqqq^nnnJJJzzz?~|PPPfffHHȑ#GAKNNޱcǒ%K!nnn>>>>>>t׮]kTƍqϞ=WVV'{uݻw]P 焖{#xjﵵ**+;x}Ш(___@Yoll|~YZZ8qR\\,}ޒNAS8:TWW>b !O3L&S"|~uuuqq1R>~X^ͼݻw\(;wn޼yfڷopkR77F}_skaaNgeeoظk}:xLfVVVII9jСO> {699Y 0 G"ќdHΞ=[]]]PP`hh( СCҚmMMMM6>>u8ιs'NӃ=Ƞl'}-PW'/9֐!?]ZZ#觲l}6g|cփ˫<# )RSSb~ y0ΝBȠTRRj@vqYnkN>=e bF] 3g,//HKKۻw)S B&&&ݻwovxygqջwo˗7+ɓrȑ>}DDD(}s!AKXYY]~=>>GaaannnM8;;G9ۊŋBȈSYQmǏs'"JO<|䘳p++_ty׮HK{tٗ]h_&^|e„U_rEa.]:5S1,X|ܹef-֭[onn>gΜ߿dbK ^]Bh0l=zԯ_fT=}vv <==!7ottmX,Vx)nTx+@_0 nYYلeK-Y|?~&%Lq ?oFgᯬܕ_.3{=WZaۖZ[[%)))))I9W/CCÞ={nNo7KWKLL,((?n7Ky74^wٸq#$())iiiɻV|W̟?_`4Bguuulwi?b???:lJqqt59iomKflpܻ-!(*pF%%%i8>hIess3BF7oUUUB˗wՃ בnk.-Q9H5ZPt3wyӯrmvMF]7 PYYoڴlݺuƌ -B\n~~~ 6;]!&&FKKkڴiWaAr6Cv6*M琷cXվ_>sQ*啕˕>*;ۚȑ#s6nQM yyy"hhhǥ++dwSX[[1 y ۞~ƍ7n3f˗/jb2?P#,"m@-_xq{BkU~(yamm:m|ӮGjժ:;;BP(sķh:HT]]]^^~ΝGGGڵK(؞^II)<ݻw< "~? v޼y c/V,_ KYKNiii}KSSV*vi4:87xi,zYGM5y9r$!o裏ZrVwiu~|}}Oh/xZEEEII- 999^J(J׊BM#Le^\_l.u R,3 ͼu+|; NO"~ `Emvٵ;-Ѵ#/M?mQҦۚw2>-Ѻ7۵൵eKUSA ߞ-#Qtt ]^7,^ òR@GsM6{0 б{yyL4kn=z$[2lmQ-X? x]tӲ%,}sH1{lZ #Б-3{5ٷ]~۷rNx MN/_q압_|ի|~qq1~@ >03uvƕ+W/oosUTTBnݺblmm@9w#^ЙXX/_EOKҲ=rs|}:w6]CQT^mFDp&JιlJċ|Xs鱪woxVw?WWWWWW(""_~;%hiiy OOϙ3gB<<<-!455l6(l6nܸqүoݺ% ߞ>}땕Çm`saÆsr,/^"AdZ !xJJJ555QQQ{NBغuMllEQ[ AAA7o޴ӻt钮n(""joP ;W$544x(Sz ݻw[XXѣG/\ѣG:uuʕ+>/)):3--֭[͋!7o"""O^YYyU}yxxoݺuueggZxx8EQ}MMM ں{љ;wi&Om۶ﷰÇ GB6nܘ}ʕ,SS;v4Uvq|S$m %]gH?qt~BNsW^]PPbhhHB055`[EE.,..aXX,x<WDd333SSS"gMcǡݳgOXު@:)555OII2dfY,]\\jkk9K!8;;;88\paĉ{!22ܹsUUU555&Oiii9CMv̙jԩJJJ;֭!^/^444$&&6{J   *ϝ;'oyrMM+M84~hBBԩSuttcbbC4hPdd !D kkk:::^vMOO/99yǎK,iCE|РA_:O0iR,&Ifaa1z興 -//OxҤI-⽣UVVVG>|رc C )>ʎ8`mmmffTTTϋIÑT͙:=====,$;6ekeFLKK?%&&JM%~رUUU*|>̘1+W!H$ׯFո\d''/^}{5ʷ !NpsskaC```XXXTTW+V066~֭[SgϞuttlڈH$.//s󣣣wEQVV(333@' D׭[hѢ; '.t+++K蕴 F"}|^K紝Ç,Xpx<^II?!5k|gw>c##gVWWojdС\WWŋE5w./M+5k,OO\PhnnN?I֎+((PUUx;TA˄;v|W喖I{H^55q‡]-z^gHQTVV?,;x>ٳ>}tsse˖u֭j3f8p ~gGAvvv111'O ӞI4dŎfش+W"##mmm~blmm߲077o+uuu++i\__%oHna5N SPMMMmm>haaaүqRSL9qDXX622ӻq FTTT\\144̔rҥK<[fe_酆?~Q3=] 9;ٳb:}|@ɥY[[|( 'TWWo߾!""`2}kǏ޽k``p6`.l;L&xF%A “'O޻w^z-\wrqر,BͶ7nیׯ_466>|~Z9s̎GdffB ]|9((h?C}}ٳ^={ĉ3f̘>}zppUtuu'O|M6EDDB!3gάݾ};vqq޽ݰaTTTdNBHllldd)S̙wȑfqwwo4yu^9Ȁ&'t @^UU0lذgϾ%KeFF[1qttx*ܩ~~~?߿Ύ2w?ciiiFZ~=}bZZҥK !#Gݻw/TQQٸq#]ܼzȐ!999l6Û&--m`ƍ'TTTCW!:[o޿BȐ!C'9g3FO?B#FBbqrrP(BHii) IIIvvvҗݻcǎK(=.%%ܜKn ܬ"KKKcccB+O(((ֶWQQiX744dff;vW^»wr\:$nݺΝ;eC:#M8333###?nhhf߿b :O%6m$FW畃/{5qiӦ=rGII榤~СB\]]e~ziCQTmm5OWWW{{ݻt.?~@cEW"xyyyzzݺu^^^|2>>>%%ݻ҄3wiӦM>>11֭[/^\n]vv.$ɜ9s}ڵQF6%\x1##_4iiiVVVf|Ǐ_|IqF\\ܴiRSSek~}䉵M:622RWW(j۶mzVSSk:TDJˢEh<`EX#F}"rٳʕ+mmmsss]\\LMMSRRmΡC~W}N6M,_y{{B.\ ;wlܸ&URRҒEމ"hΝݻu) 4qDww~kTSczz1fǏ_O:uԩbRUU[nSNuwwwssk:QF|'fZt)6fi4W֑7QF͛7oĉ}7n\FFFhh:(tJo>c٦'O0-[H899Ip8l0++ٳgٳ^w*rkkk>~ҤIwCs[p!) @y/^lٳŢIII֎+((PUUxҧ !NNNAAA<Ovy]\vĄΦmСO> ;iΩ~EVVV~bUA|VL& @[`va9;;7} _;BBBex 61rHܼy谰ks޼y69{x@;%[2g333y&n[OOϙ3ghG:800LJ榤~СS5cƌ8;;2K.5266{n@@cxeS SNihhӧ!M:F rNPڵk-~ ܹs=MM~{ś7otҥKSRRtuu !tD"ܰa!̙3^^^ٙ/^,--֭!ŋ)>>>11QGG'66eԩ6H#;W6͛Iv^^^ ѹ-G>%)))))ԴN E"Ν;322!ݻwoMoooBÅ 5` LKK+%&&4{nK"skׯoZ.!-p>ydnٲEZDQٳg7mpn:c mkP5U\\,}~i@ 011yrNhL&S"Ȗ4]JE5} P(ܷoߜ9s&L@%˓=4iA^S EEE\.C166~ X}}S/_TP>x@:(3fʕ+kjj!b8//DŽUUՁRl^XXH9uTFF_yuM8p $X,1bD #9Bۧ/رc *YÇWÇ8U(*,,trr2114iݻePrww6lٳC'6ʫkp8ٖG: }.^lyRRXMMMtСiiiV#KΞ=[]]]PP`hhHgСO> sM999eggx<{mZҔmrr@ `0|ʎnll 433{,ֶ% qSFFFꜝ[FwtBBB:`S9`srNжw͛ ȑ#K8^ kk}:zSNbrW\9}t777܂˗&&&G67\zuyyݻw555 !˗/:u̙3߿`0uttX,!D, W^^. X,~ii)ͮKII177t-ˎׯ&mmm{{{BHBBٳmmmmzT_~׬YcmmgBK?~wl-ri~&,LMM -޽{䝵yf[[>!!!"".OLLuŋ׭[Z>|(  ,X>| EQ z]/^Ϸl2k֬+Vx{{D"܅s&&&O9g]]!DKKQVmmk5MA… opxLKK?%&&J*=;vت*@Њ^je!"hӦM [˼yv]^^NQԖ-[>={",SiddD˓-DEEE"Ñm .Brss~U\\,}+sH]]]~2i[6<<`GDDl۶-)) 7bXn ׿{C,紲8zlc رc ! d6Z*ȑ#M266nhh(**?Ѕ z&9?RZTWWׯ_?܈BMMԩS>$'sB¢4,>>ZbBBa``,.%ᅅSNeddt;vidUUUPPPtt7l Hb#yQyȣwh\= _9mڴȵkу7n۶mtopYfՇN6j{졳.5eʔ'Nl###==7n <`DEEq8CCL"@7;m֬YB\UUUC~~~NN\v-]>tд4Fy<^_tYզtmrr@ `0EJ555zZŽ@k朄ann|VVV-ibھ{ޣZ^;;;@g^ !67oD^&F ]‰tXX[ m59* FN@^ kkߝ={ܸqCaaaLk}Ν;lقh Z455MVRRBϟ>}"Z֬Y/|w@G־;.\x)B"Z~ݻw;wP C䜝о}좢~WĤlCAN.ZH,ZZZ tbx]1cѣ]]] 0@ UVo`4}5rN<^|YUU BӧO !=z`0 @#Y`+͖##**? !eeezzz @{AN< {k9' @ 99'rNx?pM@ mbȑB%/@s<结{ .G|Çϝ;=zL>} rή.77Wə?>* 2i${{ܡCFFFΞ=ah*䜝;~.ഊlXKKkǎ95VlM"Dy… ΝhiIxB1%VSY ;ACC---oߎh{N:h_l+W˻s玒)ٳ ֯_h Z#""=z N,ϝ;իr.$>>/rpp@4ZEQ^^^iii׮]B@I3@y}ޣG~{{{>} (z)d2/C zwbbb޽{י3gWSSkkkK!,9%KH3m4FGXsrNs )#͛7ކU.{ #C͂9#G"mp"]DVFjW /9ߝ0 ѣG>}Z(N>S<<<<==gΜ۷|MMͱcN<` ,]PgD"iZ`svR999{ILLE;E TUU!t-tqKKK??| @W0(8= SIQ9EQ&#_$;O_K$D"HH!VFp9ge˖>}%.\$0'bE'xb899Y(۳.ݻwKWZI ܡEpE$" WOzݠ6#|]bJrJc5Xb "m~9' (z9bĈ.㏵o޼iaaw%]]F4(22Ņ"LLL˵ܔ:4~xDG@%P97̴iEI(XMOSnWKU`2v3)_H1^6b~&-ax>rHCC!ٳgΝ&lܸ1;;ʕ+YYY;vha3--֭[򪭭[hɓ#""=[븷aJN+SS늋L&a2 !_}ii.'.{Ge"0 B  %!"$"D 1W<;5}e˖SL9r䈑ј1c!<ի>|ECC3&%%BLMMSRR 5#f|>l\1fUԕUlHQ5Y[ZJţnj6lݺFPujkkML]ǹXYl/bI>8S"!7~^H% B$ %! Sb)RQbD"k^S?]::Ç ?&'iS= ptn|444f̘IȜ2e_yyͮhaO0ʲϞ=322B4:ܘSKo/OL/+*)lh͜I!)/g06nT-%!N"|lٺSzz`%qaaQaamϞ=֭[Cѣtt(RZZjjj҅bѣtHԫUn:`0K6K݋?n KE2mg!JJq;ie[~^_544!Λd˿\.yeWp9'Ç͝;wfffeee333O7bgg3ydP(9njrʈ Dr ggg&/(:}ITTTy< n9NOII`  %%Eukh(6ZfM֭jn]&$}33 p~9q҄ҽ&4S'::hkiB}GGGѣo3{!$'7w/^011˘윜 (1:::9;muvޡ"y?ypL Au_3=_Pfe%a(,v7AU֊'Sl=pB Ns'q0]xԙoر=CWܺ9x{{]VիD"ѬY⚞?~xGQԲeN8A>|x㕔?]0$N>]GGgΜQV%H$BQH$ZUY|ceɔH_O4BD"H(wQ?3M6@:MR 8MAAQQ(FʩJo;EHh =$;3?6 z>滳·!7iR)s'p:-Z4dVQ?8+i^ƽ=(Ϗk޼ٔɯin7 qܳ#Eo[˳pծ5Su\,G-fCX͊I,uC&%lfDP@Nt:-[4g}||~<Μ[m_gǎwpdN\CǏ?~|3f7.77aÆ]*l2))ӡ/=,,lEEE!!!5jԸ9ɓ'srrBCCo::uݽ(~^bE'4LJNpVRd!!}+!DQQK~dD$ܹt\?S-Myaw݃ s\74EU0 M"/Ɠ&y~MGvvӉM{`)G"֨tVtP^dddUִj}Qg&o۶c]999Ig0pMRREDWnu'~jk;ִ(..sZMxz(.U\Tå6_ipEԩzڨv"rGv-g1EQٝ3Y)&nhZ42d2t߾E^{jcR.?n/;o~IIӵ֛L&]SRΉHbbK]y0m۶:m{NiQQQFffDDxv>uzII;#ڵ[p~a4j[kTmw4[[7apzAԲLhdݺ:˾Zb{qۃb^ njfN]fuNp}4y򤒝m?wtJǎ{];gD 7l81DLVz7gΘ9Vyy: /=Ġ0""ro+i[o7mN!9ٳ};8(h&z{Ρ!!YY˿ZR*ٺQ)Zف& :nطhE>@rt9ciV'̈s_x=-@ƚjW1]fgOu#3Y]$'g~]ZZ Y?*76kzQWݣu^lyz/*;C<_PPNʫ^ucz"G㰰 c B܋͛nOMKUzE_-3m搶o.;zK^nQ"nUy{bzJIIq8ujx*vb;y sTkzLQV}4S'0 -6"{pؗ.5DՋ:i%;-W5f5lP:f5cm=1m"r PEQQUrE]6%2'b!ӡnIIzYOzu~عIsW+]kԤ:zyurirm.R~VUTUUTɤfd2f\7U 9۷opmcЧDU,XܻM0 CDq/h#W^V۱UˎᆳT"K(Mtiyj2&l6{=f٬ilL9Hwy'EvDr\z=[olu4f۲re-M y*%-V͚kBDEQ/eIdt=֤T?o6LFw sPIIɹԴfM l""O6ljU\V戬[lP9UUVbu0 a9dRM&(j np^^^  -jX\x[aCsss \.f 5bPS}4y=9p"\#Ã(/jI}"dNcf@q9~{P pM"PdNHG)@cy(p歠ޡdN;mdU8 EΞ,EȜ=PӀJ dNu~W.GEC԰qӛ0Ea6@x70{X(N#=8uL8zc TAP^?s)wC;x%Y2'~5sI5 9NJ0~n\#sY?YL^g63P%2'\g$5da..n{^z%)7OjCLJ'k& /_2'\S$u?Q{J躡iy֪ݯߦ+S' 1 |nk_ذiOٴU;XLOq:ۀG)**R4##ȑ{8oRj."O{٪;';y̴a5dNr|utbzy͊;mHfyz32rt*O~t]fI4~IH8; ~Qk׭z+8=IUp3`G}}ns ʫӉ|0{ZZ"DmYL8##.;ˏqMOqqGOD&yiz{?ae<;u+O] cⰘV~r.%%%00AOi6;;f\cǎGDDUzRٌu놆5M;vlҤf PZHIIorGƯ\DTEk,´{礹?qo3ixL uߔ9-7yێ?|$==Dx|BpppƍK6nvd9L&(%du˕6kVؘ1/_PPPN'OMjttSOIUkԨqoNܹoR̼ܬ~4ϖ3yx=Cޘ<<<<&ʇS'&tFL&__ߔv}\ܱcaee޴p|/iYS?\7.񝏿ٵ??];,li߯ϫsֺ_zFsst]w7[, //ǯ_бszڹ‚y 05̜aHɤyz**ַo޽.M3ҜN4TU,㧔%""&--=[׀o-++)$[Z-"RZZa2*sUjR4_aڼڰԈOǢb{hd'YdO>Տ?pᅱx4KD +lx8SDTUubKۋ)@p 3iaLE^^'M9曎'68q&MSEtQ#^ȺViϞM޶m3srr^a,ᚦܨS'V}?Oxüg,CwxGߘ湁?^9^Įxspߥ_~྾/ZҿOϑ>x-"^(//O1Χ_]___uF-Ywaa`n-k95MtдRM+h2ef;1eJ}Žz…V]D1u2~e_~=w|m?t&Is"ŒeWLDDx۶mN^ZZ*"EEE%%%knWaSF{Y=m]չkG ւ<={uOWk ~ |Z???=<*=qarr4mzkt.ko>2///]=<<*܏>BCouT2'kr\z=[olu4f۲re-M y*%-V͚k^ (--3BgvVQ$a9{lHpHjZjPޥeV9(CoPMɄdN7si9͚$&-زŝ*&6ljU\V戬[laGiiۻ0 '7͛deg /h/:N///wR%˫AzaE ok7lH^~~nnnAAlZ,fXtN#4$T׵5 ðGM{S+(Կ .VUD|}}E/-:I&f7pT Ȝ sk6vḻ wcߔȱ9Nȱ縟@9 sȜ2M" ː9[v:b۷n{5fQ#>q,p=&2'InR~bȳ|jظɄvlĐg àȜ2'dN@ sȜ9dN2' s@9dNȜ2' @9 sȜ2'dN@ sȜ9dN2' s@9dNȜ2'dN@'+s/LTEG)90=&s6jܔ3̒:ٍ[ V.;vYTT6rh _:9EdԨ?[|[@N ̭\+dN@3CrL6NMɒ%&sN*'Wi>}/oҢJa!*g\YB&OE:ߞ&ee5M0$'GN͕d,Aq:/9!An/hOLQ<ɹIi]'v]⡮KBl./9 %7Wocd׮[Yvl&vTbꆟ}&M /ȬYn[%~*""R̙r̞-h!gwԨ!.Ң|4k&,7 ,۷KrԪ%7J`|L.ǏQiR%4T>}dZqYPHn4h qq2g{G%"=z_";vH`<(KȪUw狿|l5o.Ԯ-{ĉ2v~^\o|36V{Lf8Pbca)SOW_={$6V4M{L|P#G{w4H C $!AFe_>y:%7ɓR̘!"2`$'ˮ],X ={Jh $>(qqs| $v1 yiZN-[$9Y벣r;|XݻeyaiBn^]d>ٹS6lW^S.%vQ}rpfCAyak%#*vr /9v'(N$$o!~+gԩrɾ}""ɂ""&""gȮ]-ȁR )edQUI/;*ooΝLFZ]ZEd`Q|-e [U}3Tmnmli2fLUw&f"*m2kʴir""+r(>>^AyٺUJK=+*S]vuKIYª4:uD> stream x]RMO0+O%.z3^ 7PMPv-f4PC,)yE|% Zoqv[/q` ]h]fW!IdJThJ"@u^tˤӌ3zf*1eS-Hhn:q=ovRC .W3}Rt}H{56t8\`󨱱ZnɿEF)E []1- #'r[;>Эɮ}M%A*4դ>7Q@/Kܟ7wOHV1Ir*@RhU0N7c endstream endobj 1323 0 obj << /Type /XObject /Subtype /Image /Width 1233 /Height 761 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 69538 /Filter/FlateDecode /DecodeParms<> >> stream xw|]vtZZP@fS,q#2Dq ?Q 2lPm4G .:x}]ssw =-N7X9+ԓا?L&"!,?<~^^ ˲,f8¢BϽ,"\\=jxD\^^ƓJQQ)$"OOO(,d[+DHSHD&LVYFѿC9 ܶ8+-+suU Lʲ-cΛ3UO''a}dsOΰBdSS- mf:68KvNP TyedfM$-*.+x2%>ͭau$yN\Bbq9X֤)D9Dd#IV;KxV)-++v$Xd+jM4D~x;2L8p /yt).֣# O?ŒE'csg1( eؑ_Lʴ7CBbt@Ş>WZZvcy>5-#?q*P[".q|hhǫWSFc``@:QP(8e!32 F\޵KXzF^')y|}}u͖Lm:=#K 5S-k\]]+5LQFd2b7WڃA[y"|O^tL)GLb-I?GmAѪL}1hC 1ap% 8@ (--0l^oo/~abY3j`},)----p?rD&U$gfdjƍ0L|U3%V[Y!!QD.b,@ P*\ |}2F3 /4]i2loM&SF&XDaga' `u`zFdJK`l6`uPxj<)IGS^,qL.L8w`_L*#rGӽgP hrH,ލa/alHddir\]'Fc&ܼLM:ȶLaIgΞ1,P(kj͖w!QQdirL&D"1Ddtn :ϼN$3 +XX*T0 mYBuIaҹ(D a>Ǣ#u+ޞ:sjݱxUH,9ɴZjax"")oMa_pk/\'mGT1!qq WSJJJF0 $qiiYYVҕ22wj?B={shɩD0LD-/?~T@@2m~>2]+)XT`@b3&..Ҝnk_jffj&T*DDi!3S18HP%B"boHts䑌F{Ɛ\|L,*>{9> ZI)˲2׷{n^D$njqԙs/pIe#ϙ8׷㑋eT6fSΦgg,ϗe؞=y{{b@rU*hU[0L||RՙX-5LRSGNթi&I-W}zZ4#9\-<!&s~N"j8, ˿1MhnH 0˕f ]49 ȡg4DsbN@ ܵ'##VVٳwҤ艅KӍW)/"ɁsN?:_Ppqq۶8_vWZ\H4;v=Km{k4@9|d JXFqV"r,~߻9ffiֿ[_|镒J7_8tx2Tk9w4a <+oeVk||locyٕi:H$R̙Lb6"JUOO>rL-411jFUTJKK|oux[6oQQ\.7 I8'ylvUzWe,Gȑc*gFso=:ocՒ|W[x󝺧ׯO?o_7VTVi;u̔i3m ߇ >:99Ν0?qƫKΞ3_2u{ɟ}%vzh6 <~klӳzex_bO-]LD11|`~LZNݻ'qͫWE wSTX(/z{{;Qd2 eرyiSORN׷ϰ_]N^^k@a*Uσۼ^^ioBЪcκ8k~W___^_RZFD.2 b=< Aj7xP[>x Jߡ×x{{u"ͫqh&gԨyMt@x=mZ뛎hd2AݻGlܸfO>vE_ĤQ}}nezqG ŗ[6)ͻyyyDǁ1s@ۏ9w0  wפF:_;wafúWo#FٳgjW?oGG\9cԂӧַv"o>r,<<Ums=4e,|||@`?pEB"81^iX, oSLZJYiΉ+33GP`;r^M86z+ͩhUr<4S ]5/Bahh[Lkikט8.MVwyӉ3ʹJҿ????6bNh[ּ<Z &ĜT?ȡhp~0 $.54,U\'""mD7^b !Htc X"sek%JYDB9Cd&2oLDgobZ3v9{y@K2 M-ҋ"F[jBMgpڃOC9=smCFqМ,Uz5E}1'[]-rOl/N7bN>egTj| c7j;9JiSY)t 5O!k/T{yNkZ??~} 6 ..rΝ}s1 Xx{񳛛dddߪ={N=qB4=p}1%ٷp gVR9[qǪXŦKhon|Η^yŗ^Q(\wj]o?oXzaZFqJپc߳4ٶWaaa^s,(t/9@xO'<ӠJ Q,qDDeDZ:$:Btv1Xif[KvaBݢbAQ9QIil.+-E*4lFRBB:lZZznn2<>az~"JIM`e=<mmɧZKD-^7?SIW9v:L&%r{_vqqٻ+W?p ,_z觖.&W>0fD"~q+^q^?qr5Y=P2J| |=w'$TC8Ĵ c3ׂfL0گKd77|{?}O.~j.sd얯xӧ+DfX|MZZ:) 3Ouqq!t:]AAFxҐ;Դ9g0y*j%R2^jPMq ^])tev8G.J3fԘ1]{<2 x277on.ryaa~G_~eG{ ۖrD$`0,ѦOiݓ㸢B\nۻrFFx|z?''Le"vnaRw>}:tZk7P lkT|gZ9駖 2ϛ=~۹Ξ6㾀2y.Q^^c dJ2??5k;oK -,*  #ܰ,}>{G6ΕJ^mV9udW׮_9TZxq4&团lmQ݆5-~r%~t6m0rsD"@ )Ҳ2uZ 7`8.;'l6wP/;^jiX3||JeS4D:j@EȜCCBHt5zݿ)"[nnÍğԩӳU+[0niY:(f}޷w-pIv}OOgtFּ"D mS7obc6t:8m h䞹ɴ])bNg,2m:NpSg5Ӹvc;#U95?,aJk8m8iL66U[z [m֭Zii}Η_~)//oغ&Lرc69_{F ,rLs%DaUBۈ9l/9}ѱcǚ'O駟nvvvUv\j~&Bms6|Knܸ矕6#}9rJtҏ?o;wɓr bsxqw_iIQQa>Zx۲ m[sg& ulƬaÆ>,55(={}w?|z~&99bbb"##cbblӣFbvg޽IIIp¶mۈhݺuݺu{饗Ξ=yf"ZvmJJʁjo]Ӻ6gΜpBll~j*Vetӧ_xx 22ҥK zAus3gԕ!i4ÙwܖoZ'ygTqxioS4Fݷ_~'O^f7|co\xj`8`Jn۶'y+Rf?cƌ0WWj s岲2rם3gR$1chڜhXG.SmF6frqq!Ç .$"DP{`h X5r9+KVg͚e2[TG8#z^DG{E&̨w77*u/at`1ĜDnݺ={._>'33eDEEz nj5tq-^ԩS_~edw{k~~~6l9sf[R)׵?\*QEEE4]ڌl<<y衇J%˲ݻwغ% lwkZu%Aw0|nvF*d 8i=ykp"m3۪MZ{>gͱ_blDM"["lxD{5z觟~ZZD4h N7ߌ3Jm }rg BӉի~i6<.!ǜ55Ȗ-[}]bu&eZs4?Oh3B?3gϼSk`j)7KIĜ-j9~mEE_׮]U*ղelQX,:tK=l1gyyѣhz1iҤ?|˗ٳG& :TV?3 k_jʨjjGٳǶL] e_nR4@[N3dךcM0it"#.\tɢE$'Xz]T^^k^80Ljvie ]*nTQ4AE&>WUh4_oj[ݱS@Z覬̺nv x͢.J+k_yn:UeulV F*+umZBr*4tU19tB/_:-=cQ!99>eÆ &2)RBG;uQWCbz=(]vr(p|ॹ>_P`uwwW,{׮d2ٔED0HiR5ipbk3Jul6!欃#Ǣڴj5 {UOU( oxKٚl7ww~UIDO?KxK*W_}yͱ'u:'(J@KySp?c2QN bNV3MIM3-]vyx{/ye[0-?J_mWU+3ϚcSB;=ͽe÷3fJk A1'@;8Ci& Ez{y;w>%5M[$GS*Q^=ܼeԻH$u-#3i8!Ad]k/[aT֣%FbN&uk8"\犯|łC*e2YkJmB$5"d4aSB8Kn3_FϪ?ӾvBI{` 1'V3G9'O\.'RMv6Z gqme 1k;6uDʴ]i&󆝻ddd0 #J}|ӡ-/(P{ȖZ޳gI'D اxڮEUO*Jzo;w{{{q|n^^HNYo5@8f$-<|#cj.߈U[;6hO\;ݟ_ÏFך`{׫(l߱kYl۫WH___{89v :d+kvs]3垉p[.>{c=g]5vhN!1ZJ5N!"|[W_CoM'0thru[;pVM_#+/hdk4J҉eY"*)-eeybHRUXUCgDD2YjZ f9<>>5aC RPPXQQ#\ɓﮯ>ݽ{āoWx :FI L{̺mmSP]wQΡK/zuU+J+V>u:(0##}ܾ-_]]x}]2,wpY5  X#%577 >fϙ^./͞3gȓ<<<V|'S,|rIZ9u!xWՙh@H~kQmXҤ)cL7s[d&Yjƍ*cN"׷lNIISK|K>3˖=v>mmj'W^c^)q痯X=ibSKQL+?_&ŋao? tw+V~{y_'?o[<Dh@5uGl ~[8g0ؤ+ծR\`F.F\xis߿hJLLի'͘1ӧAQ:Lhl <2;~%k3t;bӯbaVFш^TӾJh۷v&ۤ}lJ "b/I:{ǜ9DMD x277on.ryaaQq/W,Ѧ/Uݻ']jZJ$b[]RR"lL'"=wwvE"?K@œb19yb壻Zu㶟C:u :tȅsL2,yղX8&qV{OZG, mH״dOw,(b6+ $ߨfSiXzlIv>&"@qFÏl$&&qDzl-5c7__'x?uL}A} v݆W_Y+߇ղD`з mDhڳwACF,Y q;o:d0wi3+zL4Ѿys>=Ͻ=Tb 8FaԷuް{U>b9M6aW*7mP32'.]aIWDqqqiY:(:.`z>'7) ٳwo=S{vVh^3!}qV3 Em.q9:p;Ȱ}cmUtě%LX^pVe.&] ?rmtǮ`tZQXβk\PeVʗ4SsZRE-Q8X,+eL(jtVV(qn8fVXQ.D*3Q~]m_JDaFU&{ !^O0x_=,\a0  `]~&^ Pw/=MW(W%&ֹLz!n$- "^~gEQ{Y{VeZhb@91qh4*7/I!ݪ 8MҼ=%K]DdiLo*$= ?S/.6?*"+]N,O oIɸ粟a݅zOl1gZ  Vb2V+wHƒPa*/aEbƒ穢xNT "ݵ|xݠqV\)_Od,/*x%vxSv@Ϝǡ99F}̻',;nPm.׽ ڒ ЧL0>h;Y*T^S*_H՚Wxjip3k6ljw?8nhT?XXxi\{5)v3 ƽʊZlHpPJz6%=3$85ϖ״s3s>.k33XK]\rHE?g%`ٛ#PWp Yr.)LёC:E!pLH^)}H_2#7_v=mԖD?<#C3h!oj_XWl"rUWmb]dE/gKʼB"R*\*s^zf}oOUnJ+/ʵϹe5 &u$X[?!E+_{e:=25}2,kqjgVEdJ`uf=6]sFu;DJu0Y'byWWD*(.6Le>*rZIJIp"7oHXxgީW}Op/Z)&"}ESVKDn'RQi־JN/P*B1qߨ&c9+ÙF @D# 1d<~d&s|G;B7g2cK8vH!'Zv{geYJsLլZ6\H+׿OD6T j%Ϛg:(/ __䟑|pW?j!C!bζgТzgX/dZ-i0< 7rN!6i~O\Oxyn#?~;p¾OٹFѱS ׳):wR?}EƎ$?t2, kDt ];>sl:m%bqN^~5C0vSsdƨn: @@Dr4z~D$*/!e5+ q \хP;uU|NRuf_V(ݸNYW#[:$8hzʅ6oAy ;78ݵٜ䑌|ێ2YLƱ0a!B:ڦws; s+?wߟGY];rIm _yjlPW?|WYx3CDrK͹)da<}i:Ȉz\O*׊%R"җG}wLj5 wJ-:O4nTao T*!"W]jIeE$<{6Qo㻾KaSQ9dsEEDWuw 9d bI?+Y¥KU 4,"9#<:)IDG]G.es咴wrVwn=1C34@V_qd,͔(};v,fMej5'5Y:kaB&}Bt4X"+U>DvSxcQ_^f6x0;&Z7o WrR +#=lp\.%"tvJBq-7(UsܴDwh2[QyY1q$sL.լT6p (7<%+xF_|ҳLX^9dc$^r鵥&m!? _RəC'=xlDs /SR ]TT$e2K3eܼ޽{ֳ9zn }loe2YD^^EEz6| ӧM}c2x WrR4lFRBB:,븘dJHHVۂTmYYDD7XlOjfsxxX՘L񜻛}N~~D"ytL^K:zh4zxxQEϗ8/s YdmIIT*&Y,V_P mqիf9$ڵLf;u -IDǻ*i*bIslEEdrss#"X-&" 5s_y?>ϾАs/sVR͞=:|-iifˏ*1jpһ}'_mfs`kvu<~klӳz.^g[l32yxɲ?3ONHHܽsL&p㦧-饯oxd2EO{gL'M~jb"9|cQ wvŋl{밡Co)eddA'Nv ?q2644ب }b1 ۷o8ٻﰦ' a {" ETD ĺq[ U^sn-RXAdlao2~i<}$7g{9ӦM8p RWWߦ͛)ollANNZttJpppvvΟ??hРPb!&g͜ѥ*D"ܹ ߫q)l6{pɛJzBQIq`s[?lljZ.G bwEƽx ''e$o`;~nJbݿo2BL;v.^QVRrpWQQahjt_2N;!-,,x<ޜ9sكZxORRҫWܹSQQ8Z__/I#F`YYYC ٶmBO:5((hΝ;v숎^lVE0O?~#1]C[Z)D<+!rr?{もK2]d ۾s;(@ x,f(DIq'zN8煗i.]<ץv lii p;rdеN8O>mddbŊ?cٙW Y&99HEE߿۷!ݖ) LfLĹvr;stCMM-// t k!=/RA.%{zxܣ'ι"ف܉gm=KA/]6ڪ7М3i87?Bpa.ܭmw#tɓ&&&=d>KJVҿ1BnK>ḵNNN͓]5~5kPTq2)))YJXiimdd}v:k׮iӦ}B@yzzyzzPtAw]+ߴ=9FSԤ8vC;sI:k_?eg#.]fm5zȒȈ|5 ̫>)\"-5 kV:vؑҲr5UUEŎ5dIYxEI9r<ұ};/s"p"h4---.[RR%ͮ......l6رcfrssɓ'MLLrssjkk*, !D$\E<֥ -Cd>[UUսwTX*v9.;-&q\;k!{ݰ Leee ?~Mzײ[n<o}(((&ɐpkjj._|A/((@egg?>c0^n:)B|0%חsst PPqqCTjGԜ>}:OJJ;v,BHGGgժUfffnnn3fZ600֭[ eĈ"IHusN ZZZJ t:fH &((hڵ555$ _avc2OSSSd H6i4>:o!9'9Ч [[{Ŝ+ÉӻW݌ᘘ|PNN99Jș3g]VVVK'''.۳ikkd2Waa04MMMދqu_k¥ WX;w+*X99._5fܚmmmt}s~NNNQQQjjj<σԢ$oСC?~Qll,QAAAlllFFVTT477O|pԩW^<f``@"***Fڶm K...?u``Ç>]b,YUpp] ק%<6:ks8q2"au1 ~\zVu̜{Q'O񮭫CobޗO;ۍ222m۶iii!|ԩSv܉} yyׯ.^_~`ܹu%Y9g $T*5=#֦ZV.Y?L4_"%F5EEĤs繎s֒C8Nnnـ?X~ XqdU?ob]P_rNqigp=zѣ!ii[n^2̘z.WG36??ҥ!pܹ=t.\d!u$L^]Wܔ^ !&qf͜#PdBm! of766ry'߂}dKA/4[䔟߃%˗/߷oZdڵkBEEE***T*ATUUQ(lZgu>;? ?!T\R"<6,˭`ihhtiiBNSc*{*%%!u BheeecF+))VVVuXbf'_4 %B2ocыJ^>+N#"ߊCԥb\z@__|øQ]]]P}ys  ޷t^&<:P B WZc)))>_PP`nn}q===9Q/_ [n k׬Z*p@HII>sgcCݽw̘Q؉Sx-u 7o||ѫfxOиw?&`h.Ur9nAa n<!K7.((t*~pb;E n'j@ <,[,888$$dѢEVp83f̈_… cO>R>..wޠm;vɍMMl i@R?#F 9g޺u[7A/Oq2sJΝ;oT*^]АD"eRRH222]t:͛+WhiiaO{&$$ݺ?D5p}[qq1ׯIGq1hjrrr-[YYF߹)K?{Wg’WDž:.fU^fyu:ibO*-)utt<ܿ I& Gq<"))i#>}zL&399MMMׯ a9x4FIX8""͛7۷o߸qcO@fmiD"J҈AKHEEE I]-A[ZZ`oeee!&HWXXS^^MMM˖- tN9,X`ddiӦ+V@0z%n_oeee9NffJqqIqq>D7Vf~ZWW5'7l4 p8CN `5k֬^Zxݻwv}С7oN7m~ҥK/^ Ȁ^b6hlOi4Kcʓ'CW +0 r+WX{v663)A_ǻGPL̃uQQZZqǏO)o޼aÆ*ikkcoTP 朧N 6(`) BhʔIX‰Pmvcc#Mx'V3gz#---B))k׬B1mm7oXX ,YdժUeee˟O 6Y@~{^{Wa܋ rrrؿ$o`; |c|~݋p8"ϟs$'';88 233[[[-,, si~ Cg#_DD%^|dJ^d ۾s;(@ x,f(Dc7{]VVjiilkk}P__D9s:th̙;ws/.9qkkkq񻾳rw_9go&r='HR {6lu#]Cd];?7nw;wnkbXjjjKZZɤP(:9E7S9'zȒȈnuuO HKMڱN?v\MUUQQbz-o+'M噈7"##^RRdddrN$eeeB5P DUƆѐI;|L IЛ<@;rȠA$,`0 bsJD>ٕF I${kBnX MUEUퟄ'i&>M[ @ RN;k&6: \A_ 3zrF F:9M'!4|ȑ#DŽ].s8=}CǑc23_ ? =s8\\.L9=yj٢d2佅 rN)((*))GEao_=[NԈz&:_~Y&8Vqa7Dn޽N̙[WWw>snYY>ڂmnnBa9g[W2y<.BH3ITUUϞ= j>:H$>^!lُǎu箧x؇sknj"rX)/Ng\nQQ|>{SZZe vO;r:rrNt L9P__WYbeC0ڦ??,#G޼UXXH dddiVVtK)6Ç_| &N9cumlllerrrBa0Ç^}!---R?t^^^ӧOplE7rT;<+6i4F!ofĤI^ 'NpC>AaY~ Jb4 cO~݊ VNNWG&p=>4 OMMM˖-SVV.))ilu{îW̙3׮]+--:~ܹs[[[fg!v -쑈lEq\cs$D |.M IRRdH.߳ Ӧ*--֮QPP6mZ||Y,ztt]\\ r]:a///8333ۼys@@@pp0BA>a︪ &?~<888;;ϟ4hPhhw䨩EGGc \\\lmmo/찋[!2Eׯ^px<^E;+=/kfs{iii ضW<&W2=11׿_3,[p)HTVVڻq>>IIIuŴT99m۶;v ikk377|@ ޺u+B(""'77WVVV넄dee常8ggɓ'Ϛ5D"㉹իWwܩҤzޱҰ MdeD1fgeeYZZv`vvvqnnn[lAر#::zٲe>>>Xb">,km6/ϟ:ujPPΝ;;ۛUP`g]lAoQln(䊺VGR'+o3xp1}}*ikkzz#Bbb\ǹhi1>?"bb[ ."z*u99;֮ۇ1`E{x}m!v_v:s~涶vp)'3gʵ'Ohhhao}}}Bcƌihh(--mlľ YаVgΜ9E$GG͛7/Y!D&^~OHHسgOJJ BHGG5--mذaƞNttt vrNГJJJBGddd,LJJ {K?hEcؐd ?H&޽#76HtAz555ʊ45%zjNKK+22?ؾ};Nߵk״i.cg7b B ;+8eʔaY[OOϢ"OOO*Z^^.fo{P|lQ7p\.!(Ȓ$E@ʥHl.U;B!KJrE:MŪ,--#GǗ[ZƏD, 9'B͛sz6xu}}%td[rϋ\nII @a %l_WW:u6 _r܂sBrrrr6}رYf]$pI===Y{Ǯm۶ÇG{.>PHa^ܨZ/ÃBx+3\^3Qe!:O9y|AsS)vjkkEFF FތB9aoKJKGrb0|>m_&7!"8\nsss]]˴W~u{Ӧ]j!6QP> 777ڊ)c```mmuV@6owIK=zŊMMM!@׾됐bPxx۷o=<"RRR|>K?:Bx+:;f)63g+!D`s&'`sl~S+S 5)PH]ؚwɫ°˶d2m߹;AB?M ʜ?qW#;t׷nߑ7_2%Ν١]Z?N\zĉÇ7669sÇܹs555&&&^Bm޼9::dZXX`Ջ촵:baÑ#G555O󓒒Ǝ+fs:#GƍXTT uB1bZmƌFUL[1ӽN|ma ӧ \yDפi55~Y7y몪* @˜S(&l//.h4_4>ŋYYY_9U>@ lvc6rCS$Uj\U9$zj&!;wBfk%Ūfm--+jnjFyÃf`ĜFS 9yl/J}afg󂶶Ss23&N sz~M~DM ˕HRUdiH8g0dkG&zWʪ6PKKKYY9DTBD]/(x53 UUU alVTTc*ݲʥE痔345 MςHauuu=?KSE)Hp8 @w!*%4i?/{WbeeeYI^<j1?S^^. ee%2Y,v OD"jj]@ įhka6M\YYnOO|~of#~p%%dffyCFƿ>;[b̚9#fT]]}])t ѣF"^ybV GhKndd2 9gbKSUn_2}3~#++44|avv΍H, Ԥ <;lmmN8gG<#FXBwn 89_@ Hd2Y+dr~"'<{+c'Ŕ=MWWdBy>;dddN:9QN#'1p.E ӧOqg!CÈdy 3^;ؾ"58^ Ϛ9!t ])N#E3 B*+BnAu (D D"ngϜ:wmmI =}ߔD_c---%z1%̞ѓB +W D߫"H욚ll<{TSSO n[`e?#vj_8ĤvXsfaYJOM}}~}}CvK)BhpǏ^+|ot=Д)O W[[H^ZRR4!l{NNNillNKt6=&xӽ!ӊ5+XaC!"i42d-- ffXeUBHVV WRS_*XSΙ+WYZ ` |1WW>ѣ'Ty^uuIJJJ rP]'_Hr9] _=A} I[M:!$--sﶌ [Ҫ~4&~<]C!T^^ks07!I|htSD)BᶠpɓOѓ~(--wm\c,|C&W^{#feddjkj/Jp֥Y)%蛰Kmnijn6`:k -&8pz///3nA>ވҲuy3 !dhh`ee9{<+++Fa1ԤK;Ed!g},4y4JmlllkkBJ"Ϝ܌Yucc?'H[[ 9& _9^Jϸq#zϹ!۶|0G^^{T9{ԯn{A F906fΈ{D"-Xja1!ԥ~"Lc#f6땫BG;)** Frr7N>pxήs]r񒀒K,r2 @"#죄qf2..uؑ*6]HEw1}=gN5'0hn횂ͧnij.SJ5K{>mo);wlٹcxྊ6mmᲱ4 [&|^9'>L6ׇ8|" E_OOI$bN9ݬ6@W):s󜽚Q\".ǻqs-~zl}}`Y]%Qn`$/w?Ė֟4o׻GG[WW_j9aa04MMMދqu_k¥vY]$}mjjTTT475}q̬S'w+,,ihht:/..y| vFŋ̝}Ӗ?.Xl6OAm]é/++FUUU>{X\\7.au'33+35b]444$&&U_P[W'w /inn^c|~YY9Nw3RRR/~p2 Ϟ%bܾ,})~RRR$$)ζKkٳĢ"@usBӦNhf.+ 7ߦm[Öիr瞘dkk3qҴ{v wGXN:]PXx7"o7޳{ϟ5^g,X:!$auUJ{trE.G|eFUժ*CNيB.QWWy0$>{UPpiM.=ѧ{q}m0s3xB}}*ikU+?zd&O/|z#Bbb\ǹhkkI^WY>5+B~`i˴W7݉v/?̘N$6n=O,+..Ϊ* -++/,|4>  vvX/vD >?"bb[ ."äފ WRTSl/r8m믒*(,{OclM=VdM[,]H Xc3t0?k&q#G8Z ;y9'Z[B"婭]jjd/EEPSSظG/}PAaANNgFWVVIǺ:555X,LtpֈGi_NNbEE_7m}'z>M0]x[D:p8))k׬B1mm7oXX IJb1Mu=s8==]**f+VTy<_9!3wͨ[];0>}9'@!*.): ˭`uuZbUvc}*Y$IEߋ  [=,uA6?̘>ͣ*vlw`o4>AYYyw#nАrxUTT#Ge,-~pńSZZ&֢5N;r#G֬Z=VULORzzZQC7 !$K{ /C$D_).y?tPqqQN]<B]]!!I4ֲv=S{eEr (+)98ث045CBhjzzbZf0|>m_.5%I#Fpp8/]YzȑO~|͵uuX[";۹=;`o5\%)){gl:]!dllt}9v^K]C͛W^ +//Gݻ_P0fSIO x O ͜}dhFFfE1CX4G`Iݩ3k1Lݰ; AB?<^S*..G|@@a8N~_ q~ָ>.rNpuuٻgg:8 w=}UاK=z0bSyqYM-` BNO b6կ_?x<޻wE4;6=&L6ݻ" ul$^E@Mhnnv1ı66C?>mnn.-+WSULMKJK9CSSxb\+.[PPNkmm>+;W|G:!ƭ?lcgdjjjB-]G ;s555ݷofgdd333ZEEJp8zzz:::" 655)((ܽ{w̘1  ??F 6^|iddd2BYYYC X4}}}]䷳Zlsss(Vf 8>,<𩿿\\ϱ@ Y˅500QSSƆ:sqqSQQIMM|rDD\\\͟5ܡ{=}G /喙r^Mf(Nq8}ApH|"d2yH+biq U+̙gŋ}||r/^~ŋ'UVV={)Sƍ7bWWh۶mY9>?uԠ )T99m۶;v ikk377|/V,!!!99YYY9..yOoo[""""|||rss5!!!-- л7`66DAAŋ]\ڱcGtte|||#t6=tЮi:`a?x̙ .|p SyN Φ q];E? BAA#2b0X.>Pݿd  ݓ6}t0lyO@ "ZZZ\.KBhYWW7///777**brrrZAAkwwwOuuu|S:L>qO… #F^x@ `#0<+**2D"QdĻ##yu|}Ο?wI~HtKg:s)I0`ǫ;[Su}[ 300޺u@ x7odリvڅ_ÌϷXj~OI#߾}!s=zŊ8m֞={N:u9, KHHXv˱tnaaa!6=Ha0^H^g,lhh|C^:#N[[[eee}}=BOÅo&>p8X`7od2MMM;[:s޽9ދ@ ;w.>>NkhhdggK>(D}ٳo>vXUVښ͘1+6qÇϜ9?N\6SL9}UUU رc,Xw^͛7GGG3L]]] V``[( ~H^yʕSNQTMMM55؈9$:3bz;wF͜9h4VUUذɸիWS(!%%%fGnݺս>8 m~N}~X V+eBy4Bh˯gԄl@ tIȖ"iii&) bHiiizS2LNmll,**UOx(lG\.7//NtWLd$ޡF C۽|>rj:.rpv~O9:yy^YR׬a P(Nj] U" _J~]}0FF":ĨC۽ATlyO)sעC$ؽq 2 8pA09|mO(}}e 9 A@ z3\|k b` 90X @ }1[ rN_@/uŜ+çJO9n֬YzzzeX666/^PVVDܜ󦦦jf>}:!!ANNn^^^"?~|޽Byy1cL0@ | sΜ9sڵ/_899qܞ֖dBc~ҥ|!---x<ӭ^``ĉO8i&Y䎎c2ׯ_o_ҥK,DJJjܹg9/U?IZ[[L/999۷!1c`h4SSSgEEJp8zzz:::xS /_d0%%% H$uz8;;c1&&8}5u?IaBB APj먢' **X[PGH Q F†B%P~ǽ''9ޢh333MMRmtP(z7o޼gϞ௿?m޼ٳgL&:{Qnwuҥ۶mkr@ @NQ{RkǏfnn`0D"zss$su6M1b}xx8Ésww'ܾ}{„ eee-~VFcsΝqQ3dȐƍFFF?[6~NUXXcccEΥ_9}N444 mm^J$kki5񟔵d/WggoINI6}؜H"޽[CCё*_~ !D.7~~~7n=y$**JGG󮮮ϗ3gYlB1cFc{mFxxy۷o!d޼y˖-U(ӦMk,fDDϩ駟0-A"ׯ[n:>|~ԩV+lY.^ !O97t+|n5g7}E0s܅˗m0 oC ֵK߾vۥ뛘ر{/AXXدqƚHeWWWBKKKSSS_i4Gc{mI-խ'!!!..nxzz6s̙T‰qn9"Ƞ OOτb333Z9|0]NLLn̍D( l6ܼzQqqTZR\J#]شapb]M֕D"RWW/`2UULL_YG&IRkkڳi99:V**fھ⒧OBFsΝbxBƍ7nU6Q6/ZZZʻ X.m {{{__ Nnnrqc10-MWWN;;;Skk:5u֭[7BG5ekr@ cW\rOMۙg=zH?pl`Ot];-uuuW7kkgϢxx>m&!$9%e\wu\.\cme_P``>v!$$$7nyÆ ?o%.{aKK#G̙3'99ڵkEEEb=033+++ɡ2g~Zm' 2--}[ݩuԩse2jMur–. ֶ>mRirr !db׏ÇBzZXX,Z҅[6ohZFYZZj7#00c._tPQٕP(Vx;fA6[ҧ2U❻CW/*BaaajjM'))^u;zߞ] #ڰaCuu\.2ă6:tgAAAZZںu(|붟ʼZv͛7I9UUUyyy%%%{ ?J...ǏP^^>x`j_~!/JRBHii?(lllZ_ rNhU*BgÈ'`˗ 6if&M9BHEE+S'+N8%x=P3p@ظ8>߸:!!AŪ 8HeTӧO=oydBall_payy#GLMM;wLm܂###TZsB:sy&AFFwEPϠ/((HKlMop՚֮I~x0)ԾF#mC|\yzW'R4٥˼|:1Ԋ~A}Yʕ+ 666?5kwi9PUUԩӻ8ڏǫ}+rNhjj˥ҚSN_C%0 \.fY[[>sNCaB+\NӛZӧ:Y#H[o:Ox KMK>la~}޸e ѣ'vv}rrrڷWUUڥBr;w=ylb|m˿GuVDDS3 lq'O<fhhhos6 !|.&9 c"Yn4m*wzƪ֐!/MvVEEE$А}_ߵ};xyy3skjjD?ޡ{(rNTtiǎ0eoiV.;gVqIi;S9jٽnUUeYd)ugՊLPC.}9!C=xgVVրJռN444 mmp58D__a| jRPPءC cϖ۩ /IIɧϜ:|>UUU#\xIhM([qȐ!Uqrj㦭+Q}^Im'&&}7cM[qM/`2ff<RZRҹs'555eM0K(lstC!Hx\>/ QL/JL~jjZNN :Zn7f֗H$zzYZZx,r_~㪕544֥KOXqv_hk;A^㧦L3=bB=z`ޮOOONI3םA'm =T@B{1{."ZV؍;w?Oeee>8qDFF!ߵkWsZ1HX5*j:455 !vOw&#%%0"?X#x" >Bf|-UY(FG ?66.667NHHcjjjBq|>09r}֬Y)))޵lBGkք/>mޘ1 ղ !LOdB455 w:oA)z.ˍx;r,`gגѣ5ZJxxxZZܹs>|x7mnia!Ɋ 9Ϝ;oޡ@ȼ}nԳ---BHAAAZz!痗y\.Fr|jsp0@*>tamaffvڵիW\.͚BD"ٵ{/dz0JkjˋKzU׮>C!˅,BHZZ3r߯ ¬{)-BX& Y)UUծ](A m9?bŊfV޴y"%%%;ܿ`PN :y2HMMޮl:Z{|Y3]&Lr555Nc(o"ݱ}34tss^}_ߵ};xyy3skjjD?@ Nv=//XCG63HW\Pny ۫V.;gVqIivrgz3$$ȈGr+//PуlT76nμ. 焷.J9Ǡ;flv°[){X>Q&iaޡNrNhJb‹Aڷ7x8::FOOoÆ 90_qsk9' @ 99'rN@ 9SuM ||A@ -kO | Eҫ|cೂlAsi4 9 s!]SSӐбcG=2r1L++Kި3oz_`rbА+v|Ə;?dJ8++ 6]?TQQ˗TTT++ be\UUUXXdhȥr%vZZZjj*˵QDR4&&}TV:UUU% K]]SHLuuu.Kd111]vml}uRZZ_|33,>OmNOs{0{'3NyrJʜ :]__?9%o&GG&X[[3\B[Ν/kiiQ?}oBS!/Nqnƌo]]',\Pٷw!$$$7Ozss$su6M1b}xx8Ésww'899Qulmm޽fcbbΜ9sʕgϞXRsؾ}{bb⯿znݺ=z4>>ɉ`p8ǏW;:@} ,--8 7'm!>̙3MbÆ :uZvӧO=P(\\\cccݻwa;PSS3sLǏxBy /%lP(^JJ|㪪ꄄ=שy¥[%Iyyjo s|Ҥ z,RѽxuoaAXX؋/JJJjjj"##\]]utt!Ç/--ή#Otutt,X@QWWׯ_||kOe˖hBiee{YZZJ100+[w >>>55hM?ޏnݺΛt:oAeIϞ :qL&*˹Λm[~ѽ[Î7.33sܸql6[[[ZKB444!SꚚ[(+++_{ :qFeI~rKf͚Y,@~~8u4\rNh=|>_.o޸^,ưNl+JI&/^bW#<}vdЛm*%''_vIIIw8NW(Զ\.3ڿw|-Jc033+++122"$$$46 s~~~}޸S(e2yue/q,"so_**r<--x>PMٰaÖ,YBFPܺuK&\̆YPPn:ey #fI^bZ[|}h ϼQ?F i ޶ϛuY&{2<}RԩS>|~GSXb֬Y{챳'̙cdd$rss۷ocr8uꔛ_lٟI6hO,:0޾:Efm7lג ugr X,ݏ'T޾9srQ+!D,ZXX{ט柢,33)ol={vٲeF4$zY:o|,:cڿ'&Pq!IZ⼵ODs:}L&¼p\.B[[Ʀu:pʕy͚5 !Rnݺa``1~tiǎͬ&ṵR0 -wrNhX& 9E99' @ 99'@mW}}="X[Kd6xT&_gRcGKw/pwszCL߽golca_rJLLzxT޺P% ly:555-''WWWJEEF*-).USSeٵlܼsZZZpbkW/h48USS#drX _d2*_>9W~i; }}GXrsidTe~AؑC|5ՖA***.]~Z*$he9ɓv_OuˆBbȧY[[={edKOn3 !ii}e!s%=x\cGy-Nxx555!eee?i'|]'ȫ$Tڽ[څ:hkkxkoo so,'O1뫑#ڵ3iN}-[0"?X#y%!DŪ 8Fn:HUe%!DGtt+++ߨ?> !vv}ll:޹{ ߴ9 7o+..b2KJJ !FFC=~i܄G6BYY kjjD"1{p9!#5mfdd޾}7YufAAAZzuaTteރҢh ~ڵ3zZ޶«!#055++7Qv*f:s޾ޝ/,َ FKLxksΪZW\.fY[[>sN B¬jiuUUUvP(h4!ĐgJ.~-{z7ΉFEGlˌ福E,oqsR!evqdͰԴÆ4yc}nfĥBP$z&a9N :}V|iL ~MM1Qф\555uttD"V3LBY||Oޭ'jGҚ-[oؤ^&̚9cQ3 pPȿnrk_~1l***"ǵlbY}r\v>ϔZ*<~᪕ΙU\RbΔgֶGR)X]]]Y~=4NcG3J(VKLLTUUl:Z߻rϛX^={Z* Z#l fu t@h4Iï6a0ۛ5'[4>kgcddcyOCWUXIӆXAx9'̞qJkmY å~rNټA@ohޣ7#=.--522vР <Ǝ5fOuuc""" 6~GCCC>}:{lG9rD"8997g'$$$44O>...jjj>Bt A+[kեKu7R=ztS&cqΝb?t5kdggS%O<ׯ!eǎ9K8~~~ӦMx=zرc2}qNo,N@@U !}D )}D&ݺuK9'_>zaΝϓ'{xx(?Z8RjDSSd6W'm9e2_Ցwutt:q_xР}z::h]No^_Lm{\m`VP^=v̨Ş!aaVvCS& SSӚD_^ oݺݝf͚'ͭj׮>x3g 6lyTTU8={fddX۷o;vL[[;++ArNB,jjjjBχ3gͽ1u_ 9z,ٓT򖝝Cwzg{Aߚ.Nwvv&op8?x588r=uuucccBH%r+WJn޼`++ӧoٲeلwwwkkѣG7>An޵{oh4BH\|ypճgQFF_p62g;NONIۺc255 8p@YYdס}{׿g۪uI&_\.޺u+!D*B9BMMM### @ѣpڴi&Mw޾},X@i,-,,IZKKK&bkkX|հF,--at_ݨ˗~;x_vedd*oP|:(pӆu+VTziٲ%g͋8O톇 wVNzz?ƮOoe@߯Pa EDڹ"{~wQ\\\?.!1bweBѣG<={7Ғ?>|8((;&&XӾ}{#VUUի pMo@[9&M9BHEE+S'+N8%x=P3p@ظ8 xue!o?tƝ;joP^W.Y0p@:a ^Q?~Bپ}KUee#Fmæ- NCߨK/4hPLMMiիmll} !aaav:{WZ5eʔ&ݾ}tѢE61O>}nsN:e([w +q9!# `RO߮NЩ㕕99FF<ӃΟ 6\]wu~[C.}9*c\ys PQ9vضmۊ;tPiFFFF[ K.eeeI$KKKj)KJJu||||||ӯ_JSSSUU&4FyoyFrvL9Ov w[=tAw444ڷ7{L&¼{P\.6>h4@r{o7>/_Nus]%q3,5-m!ܠ(WfpC VWWs___v_ H$q!!d-kw4g{ jιg<%L2m:zjEFF&gM6ŏQ\Z5/\daangקQ555 -t"|ps!ɓwSngc yj5>h䜍{g5.`9g7m~^y ť~rĄFM[W/=B 2xª3F-Q(h!۲x9'%C$',h!o6DرW_}E嬵<22ٳgo|hɜ3 ''A"lڴ&<<\E.]bӧs72dȞ={=z{ݹsGy(--Ν;/_BHT^^^\\|ڡJKK~W_}FG[[[{yΪ"P뫡H_>99͛III~~~&O<8qĪUryMM̙3}||?~ŋrBpqqqvvwÇ]\\G߿?!DMM-$$D P ,,ŋ%%%555&:::ÇfggR4#00e˖hBiee틯 眞;w ,!4nܸqƱlmm\ej-!DCCRQQIs8j###NoܸQٶ_~sR\Ç---92gΜk׮QbzJcrrr! r\ﯜ>Oۿ]byyymذZEEE.Blذ%KH$BBuL&PSUUWRRBS(hZ<$,\ȑ#^^^;w5jԩS_ԩSlĈ3f̠hCbO8QQQadddccf.]rӧd2.rq4ӛ -m???ooB C= '422 Ϟ=kbbBill|ղLG W @kMfYʕ+ 666?5kd666zs ++[nEDD;99@~tiǎ0:Z XZwiNĄ+@ o쵯h _ IOO'0L++K3رƌDXd2UPP0~+γX >7X[ipRh 88ϥ,h:}ѣk:朹xe2P%=|n0wJBHllӸOEMJIFPQ DMf LfM4..^ Ƅ$''WMMf9]IIill@`Q\( l6ܼNo,Tj58Η_~΋/ ;;WV #77 =Y52YUUښ2{'3ֽ{W\|5Ֆj's/233-^㧦L3=b`5|l* ڵk7**C 8yЫ_lld2ٲ+ǎ}ʅ߯]v8`𧻓ϟ?o6rkŢE .]8['k~m˥ g^---SZva|G !C5X >Cﴶ˗4sΪTH$֖J111۷755tG'99АfX~~~ӧOP9RbyrJJRRrlC566vZZZI$Xݞ)iI).Bh4ˌoPx}}"/.Q%EoM9 >]sN!_|S1s 9' 99'|T^[jpHzzr4$$tQcF"_ZZL&u^tuvkw >s^x),O^^^x<2ӓH$h9]ڝB9zr@SdfQqqTZR\f !2,..^*Z[[)g LT*j*X[[ӽq꜎`9o&*;IF/|c$I\|ϐE"!N7 x9gOnhjjBcB]cjGHxx:eeeMĩs:BH:z絴BrS *rU(˽}f=VWGԔٜ&B0::fqq|qUUuBButҤ uNBUSSp<05587ix---BȀ$X,NNN Ԅ'FMtB9u:oΡT].S\~##ޡ ػo?Yd诚|W]]RYYUTTA5 \(-s6FS(6ϗ7o4HҠg.^={Ij'6!&iee0pU>رƌDLXR9y,xQv^m3^x)O׻DR{Ͼ޶h"X"4v\ン6q9 !I^b>}}W$9Y]uH$BYYZBkҒ⒜\55U6MIMMձ|>V #77N_/ddUUUkGkkciO\jK#b, ǎrNo/N66 e2ٲ+ǎbRBk׭^}Y?POs2' r¥[%Iyyjo GӓNPf>2''بv5=&xW#Goo@q6dƪu u&!3$:9Ё}Gݷ,Z2zW[@cٝ:4vH&D"CCCBHFbl#ihqp0@*>t0];]_B!~u]Ti3LHx% !BaVJj*!DUUk. 7;s4m͞ p&&_wnq7ĩݺzX6{|MMMHL&m*<{78'Bl 嶅yՋ"Fh\.GYnkzhrɣYRols]r>mC+,d5r@M\fsNJ߾vfD";⼵??{$!D&Ԙڙ(bLbrً/-,,^[*!>P(^xI;v` /prVb :dP\\U>OϸyyNz5ZqqMO4Vy=7%/۷ |)!Ooۓ'1 \-C>VZSSRR0!7ewҮO ɠ=;Ofr.3ɦj555a0OE޸qW@!!!!E S q3<22LWWJ7iv>MWvݒŋ|վk ; <' h9!ZC]D0t܉RPPYY|qnn.!vþ}TС=!DKIa2++!UUոfٿ~[޽{! SWWZ}Jp:j̠ͯ~XyBwЖsikkBJJJ_}UVF:4t萯F~)ɶn叛acnjz_}yΫW.4vٽS$UVV#^W~r{cnjV<>ky!&!46(\{U^Fjbmkԭ^UUk+tDE$,3?i~$%j_&67@9 sȜ2'dN@&%/@dηF P^,1,}r+ڸ7î]{1򻝻իmu/bܒN42CbzƜy ʗLθ_]-..zIȔeS :b2[~$!NpuudY޺uzZ*++8I^ԯ:caaQDB$$)^]N'(++P7~z^5ww7FFs mmmo¸s>>^VV322322\]]Ֆ KUqfȜUYvmvvv֭FMFyȑ۬^XX׷o߰vڭ\GwoFFF>') io6nܸӧOO.XI6lhaafggXYY !L&SVV$I999ԩSuB\z`0奧[YY=w _4)jVvt$0)Q !ywfĩ[6}ᇋoOğOض[dEMѭQo !?5iʁ{ml+ܩ,o3co Se(1Gzzzۼ5r짟?n~Ul:Q s%IRS;7on~^NșkN68΍5B?~<88822_~!!!OV7hڴ?.gee !:w|xdd%IH;vIovÇ={={Bn?-;ͽ^!IZ<.B<| ?hd'׳5Ͳ+6i&re;r#C}cNv/_ eA?ܬrʎ;|嗛6mbii6:~0aBݺu8:88!:tPXXN}$OU^=/GΝ;%BOOOɔB/O!$ǎ{U-92WãZ~zfffZ~bOmgg'zjjEuFUl1qsk6m:iҤ)S^_~Æ Sˇ m۶ 6kBt45:feeU}$Q>u~iIMß?aR!|5 ?+b2K,m4\͟K>Z?g/^8ΝBxl{s櫽(JtQqNІK.B +>U˵Z,BԴ6l4WqpOPN vAAAڵ[fʕ+ rz}7k4̓ijήD-ɹḥm޽z^ݫQE;y2E6O|65-mB_DvG~`mm߆רQ\h[%"Ys+JSgܵum),k/ۥk\eA}>}W]έ5 EEE,'%%}3>hР۷WXw…/r``[oekk[XXrJ__W^y%<<|̙,ӧOgq͛7 z^۳jgΜe{!䰡6_K ڱ}sNn$$7ja-N<6d!겻JJJ/ծUQ-v ذaȡ{SSF|S-S#Gּys1UtwWo!DLL~gBLSNF۫P777x{СZ"r*O 0]u233֭+qℋÇ;vثW waccӿ+Wj4TTTT~G[bbݻsrrԃ,((jtϭի1f̘ŋDGGw1&&&&&߿ Soܸ}Ս7ݻdRW 8EѦM]vU .;vl֬Y0Vurr** ?0!!A.9u6a{{{KKK!ŋ5͜9s۴h|geM /b߾}]vݰa?xyyeggW NU.*}ŋ{s}W&/ΜnnnM4)_ U*|T$IlcǎTԈvj4SSS?j6sΝ;w+V߿׮],Zhۏ3X(ʁe+tʕs^tI}͛W^>h˖- ݻwlm۶;vlii ++v-555>>^aii.dcΜB/'puu;vynmZ]|}}kժ5`{SN=z<3[twXn]^^{ Μ9s;ǖѢE ??FEDD?)=wﮰkEEE111n|tKKKiѢŢE.\c~Oe]v%???r>VZ]|9--M[[[h_׫z;%ƟfΪ?MpppBBBnwtlN:Ez&n߱3--MakcTͳ2fΚ{o>^S&E=nmBoPZiחci˹ß*--x'uXFͦի4oT-U s.Yssn>m$!DrJJ~=zUꪌ̌ WWנ@+WmmmFùs}|||Lqqn99nj-tyP~:?k׮tee׵Z7Vx}ѡ~9jW\U?N4ף|.8Y󉳓"rర'Drɓ&_⒒͚cr!9yZBrs۴i]~KA!D҅d!DiiŋgNpx#QcOsO7de:8>]ᡖ{xr$:!!h25WݫUŹꀧ$I|-ۄ11&NwNu>>>q;:0k?_\uN̉K?L:իLݸ^}ofg_ءWUIB++K!DYk׮ؘ c~5Ͳ+u4 OOOV,[ڥ˖׮]{¸1? sСC_u;vͦ}^x1'V3^v%%%j !RS,ϛ3<|zwhuV[2 zm>32BԪUz888 z=r+zCʲY~pjjW6TQǻEfϝ9\޲͙`lEQ~Xfw:ξ7Աh(Jeo"(l7R]v}nYwKKJ۴9_/C$u&Ϳ^Vt6D7k9{|EQ*lҥ/ںM^3wxp?aͪ?'uy C /(PߡbfMe++겛[OV1snOO+++!JJJ/ծUØ4B/JvzsyB2' @9 sȜ2'dN p xl jiG'x}(:!EQI p@m <>=jf sȜ~+W_ɜm۶;G<vkoggkkYPӘ[شyˎvgd._|v=d]r +/LӦN`0$&& I WW\r`0ŝ (Vן?> Ct!aKKKskAAFq-?h0dg_puuDp+>|ǍȜgΎxsd~˖4__9ppÆ!?[o e ;w̙EE^occ-8iG]tqq^g'U>KMK[[hP?xt;pKƎ޺mG_7v4P#h4nذaaaUWrpp=V]][8p(((gϞMx#.0)Q !ywfĩ[6}-I"&8;9 !>hmlccnj7fԼ^n޽z !ƌv[#|F;ǟ~^&I}/''HjIOϛU9y3f7nx 6Vݿ曻>*knСB˗/kn˖-MxrtpWؤ%%]<(R]=}IػKjTyp^߯__!e&m<<9/>^h2 P eK?l8LѸqزZXX-t7ƍ#GիW>}~wI]\\&)++'//`0奧[YYۗ>}:000 @m6p===]]$5l;b{$I=*pԩ:u !^ZړO66tѣǴZKw!DNn­vuKKK+++=ׯξԱC{gg';[˗y pO>Yt| ?pKw(111..n &8q<綊Rp;tPXXu΄$IޟwdLVmn&5-^*5ȗzҵ냇vf^5dC>T F^^^BT??k L;jӳ|w)))G̷_ΤA9kkksvkVnݠ7JBrs6߬&M>uqɓ& 2(O՚˟zɞ;w<|%IСsLW^!زeKBBB墨… W^=|5F.ZhÆ AAA3gT>}>VTw@uf޽{gSLUwN `uиqcs;wشnZ-ѣ3<ܯ_Ki_Uj׮}f͚Inݺ#Gxzzzxx$&&T^*S]W_}o߾)))z>00~H!DXXXZZZrrÔ)SVZŕoE-pႏ^8yѣG=222mll򐐐SNeeeITc<3s !$I Q.88v 7!Fsk/ϜM6x0%% x<>Nx3%K}{H/$Nx2'XmޑAN< HCȜ2'B;СCF2g۶m/cn- x~Nxܷג3 sȜ95gcnpjoSMDNRBl6x ˙[ )dN@ sȜ9dN2' s@9 ]95!5EQ| #%VWSI U~N@M!sȜ2'dN@ sȜ9dN2' s@9dNȜ2' @9 sȜ2'dN@ sȜ9dN2' s@9dNȜ2'dN@JRB,[:ȜoF @~;|pNt ̉[$N2gH?K' xW x0@5q$qc_ )!

]rRMN'iS!DFsں$'j\\3g܎,{7s֜I-]7F~sWu}.wc$$I(,F`R FLo{oGQW/`r^VK$!EaIFY2Z~ M&m;~gƤ|yAl߱1>2oo'hu힘ݴy~e?ۻ?P#ZFJ$JmŋƎJ;W1gδ2`BVKQXZZiY3߭]A1q_MKf'NNBȁž<˹s'Oп߫B䔔&%]5ݎ_HN2tVqqqp6mZWK\+}o:=V?g,&jN͂' h9%ylݼNxs۾Y*7wƍ8s;={`^dN5EQ!ˊ$ Eq+W2sh5O&23zEQEEL\OH4 O>ZacFBȲ1~fOپ[;;{8i?^#IҸq5 =kF1L%%%DMѭQo !?5iʁ{ml|uخm L*j\iWtJZaeil,m$I\/1dnO5ioٲmw)$iѝD;vyfj-~wwȜj2tʲEe+[j֯7Ȳ,d*2!c{xr$:!!h25ݫZlQ\\{g/FBhZS';'~]߸qؽ|mi;fMbfNĦ[$ +dB'=\uZ)bzBb`{Q6ƩCnAȜj0s YVEh4BBdm I f47 h4R)wgzbzFfv;;;^|żJd+B]jnn[h4˖44iVлyW_hWt]N-$FHBq*&Yh$( I(BQI\7m,哶 -;8ؗIc0 K 3b2IPB&xL { W41#tƌjM&YYSz`nNmv4k~C/ζmmP?x:?ϭPcdLe&Ssٳg8n]VV>ʪDYr6~iUeBU?n.V+rFF"55 >͙͛;_*,**n/--U3rtQ{&~UFZE+e2l4Q&dRLl8woL}wݾ;!D-%/k挷njڽ`@0L$ʕL Z.<~ݲ+}||6{vm=ܱun1y{B,BtZIZ()3&gwK\u¸1֤/v$)&Ԃ?If[QĘ ' 9Ԉз疔؞<%Jnŋ鹟}fvͮ@MO:uЩcK.x{yY[Pɓ& 2(O՚߾my*1k /_>me%%%Yٗjתݸ^~xڳ#o̕A-XVĄaI.Vv}77>\g8YZYZzo;Jo!1?ΝIP#>$m[uijϚ05!޽iח|"]:M˰j KWWWWW;:0=˳X=Svѐ 6õ !wx>[׌ kaaa^fb<@dN5; fxYQ r:u6 k|\W?ͣ2[+;۟jA!hTE$IF]$I5@Ps`v[fdgKB(BH!pSǷI_$H>,B,Fd4_lYCռJJ)Iѣ( g”X:Ϝ> stream xڕˎ>_aIƎ(yES0h,6YҊtً]"~*ߩ<=dWbt#,zq=Ȣ/9?,Ա2bIyTGx^譃g&:Vy1/Jf~I t3sd\`?\v\&`փ]sa1#{qNt^[+f[Gp*z=yDOaijʒrV >"0y4&CP6x\G ܛb Fşoܚ3uA"zE,@ _4DgZOpW희rW4A9263d/2Y~٧˝+!5YhȜ9XDrfBj_[dq= = nٴhU(%$=Ox `6-60Ƀ\9xe:>2S5Ƕ?iYʊ.!ZTQo3к)DwDYͬUt5vH=Z^>."A[: nl@{L]WV} yfn]dkM=kit:K\i,b+q$TiXռ&W ċޡ3=V[F/?!s? KMqf{0өy@{dIIɏ*8̘X8UvUz"(`,0bp! (#}؀%` ^+zl0ڃ*B. Q^:O{ n(Sm;&X& ̮W9F)9^ .>,*]^R)| 2p9[@q%rTOJ646z{MW; v}Em;?NK-0ÍkK)k.l 4,ڜO j0k'trTu.LEwH' dc3VY! d<%cX,֏V)+b dc5($j;wWX$.6' vbO%I˗Kt)V ~z0q)C[\i-/r8?]kW׷m~|*_|$#*B,;؛ xi! VlG y6'P=UɄ^9ϯTýH.RzeJ2M+ {b)T{Gl\ˏ=_մij0m0tt.sM1܁ƁJ.Ic!'>t endstream endobj 1347 0 obj << /Length 2010 /Filter /FlateDecode >> stream xڭXY4~ϯO1H|Fؤ*TPkkvE|,>,y-3&2#ɭV>Rm2?xs}ؤ)IEl/B&_zB) >'tA~-inJ&^N~Akfl4T5f8܏74tvΑ#M4HazUSU,h; ͞0("d>iH{^{~/35Xua CE9GNvz]WRl˫b?ikTy)PJp3j5AdFVJE'ԤTR!##^==J.W ' ]3ďuߡn4i5^ޠdيVе5w}~5` a&lAl0n HUhorJ&$d+>P~&@`qHp}gLx.Dpk敺/:sch&йxGa.e\;M׬bnwX2b_\[Zõړ\|}F9Vqp^ s%AD)RU:Z,J  /L^"?N+)K~sE:7 Nyk{*@{b]RDܺ&6uXco;{J H!Q-)&.B'yEqD%?|nZ;*o]q|7b<]vS- H%lz \hOmͶ'zw4.bµcc=ر!%靜쫀Zm/E;~(F7l=pH]`~\#(i]1dQPj2J;'EAǕyQܥxy~oi:5 endstream endobj 1351 0 obj << /Length 1931 /Filter /FlateDecode >> stream xڥXYo6~УYQ5Gh&n"+BV;)I``Mg8쇟mryR L2%,M!\*juJ叫 u{nwt|̒ ,dBErKDLHa$8{ʚRhcƾ3h) ΘZډ\ 'jU.ss* aw*HJ-J/A]䎏eD.rP.M0tnowM^Q69}1am/`+SK+䫾hxP|-K2CմD{;]Wſ3W F^j-~ d G8Rud%VLLDwՆiшuEu`7@A'@边bZoCGzzڜhE`Z7+̓MSCk̅Hndx#8@>Q!LȳcǬPVyUZ0yM6ŝxCiGR`)$C ]Jq;$m~yqd åUˏK|<%zP5ݾc(!玹d uw!@=4%#k%rTHc,fA=6>ߴ_NZwShbUpfOҋ)yLǼ>0L!) "<˿Pł҅w AjZO@dZ +LLAsa9hP\#(-rTl6$H{ \I6 6aJ+2X_&LjUeir$/tǐ};R["5\wM}7p.\RBCIp-MFo"^O#L ʖTjd4\*W-r- X,C?Ժt {ԁm1!Xzv4AQ1Ձ@o7@ au`~WOX1n8)PsJ@`]æRCx>1Z]뮇've P5| [a?p4p5@?#1lUGź@[9Lz8)ݾ"߮G[L'2k u\?{EGX0 <6p `ͅj`b>I<Ҧ.,ЕTDELA+ЇjΗzT*exo>>L0S"w0V—E?C endstream endobj 1267 0 obj << /Type /ObjStm /N 100 /First 953 /Length 1955 /Filter /FlateDecode >> stream xY[o7}ׯcB3h:-Kgq½H-9H( @br\ QRvEIPIT'1hN@LDtȜe#s6H Hv%JH HB@d8ĵ, c1PhWLJi{LHAQ2SgplDb]Ԁ]9$\Dw Ȟ6#3,"(]."aճ8 oku /FkѩI"` 70!kg3Pb5 Trڤp Ѻ)a[s3 MZ̴SY`j,,`Gpa*GQ;?Ɨ (*RXƱM]ODY2:I2wESR }̀|P]'%I=z4./W˿.OW\\-97܋Mǫ 0rfYb_'?Y`aւ}'I8Ń $dJ}G7y}y{qX^yrc,~Ɨj۫o4yz̿3rS˵; {ijuTjۗ#GM^ }ϫ^?wĝ >MM_YL|aYzA=~zx Cb"H￿z'x(JxQfఘyŋ&4򞭖뾝3Ԭ6Ί3 =(yŜ7$$=?Wr>nY߽|~qg_kjו/~Y banVחMkǾ[xu'gV&psÆGc{hkLh< .GP}huQBh8m;^;D%_)eG0T dPSC^ʈ*!&@5v8M jam&^(RA_ /˘a|ᾐ eBRQ9&"<H)N?ZNc N7aªp0v~dq, x̂f3˜d$#ZqBwRome?L,^4>P{ {E4/ɭJB Y~BW,I `2Wr;@`tR0cca&=Ic`fIKLhnl֪Zxω8 6x endstream endobj 1360 0 obj << /Length 1673 /Filter /FlateDecode >> stream xڭWYoF~ D=]OM)4E5PIv?ߙ%MɌ qϹv曙g/ddQ4 X#ƒ@8 W2eS/>,Bp]Y.>\BO(YSDRr$bɵ݂)w7.*S$9fl^t ?z܀igc IDKƢ,IH~'ل&#'`Xx):[Ӛmk- z\ 31lb5}GQV7~SoۮvES(K5D !۶ٚ鋦&Z G[<Сۦau`\٫,<2TȈ ٻqM;Z,#Jg/8""Mof8:X:W(>WUp~+PL*8{]O>SD3H/JRg}K@$@#aU&HrX .To 31$fmٸHO˱0c[0 (G#_"fg? ªN-v)"I# $vZbx@ΣTiY@il  .zEG:n# 2O;v=Pޠ9?raw)-.'Hj [zhҰlA?,߶ME,, yA"X4Cv+WfhHl-r`ٹLT27S׌o0JLx Y0% cɣ01%h giiTkt E8 -, ANt oNiw3ְ=uk<+w[vo85}譓4C#Ѵ2] QU>"ّ}TFѬmCP=h|Bż{A?^K؋GkN {k8 *XX}-[TLB$f,U]/tULtULAs OkP|jxSuד)ףM LOLOmNQxW~B}Ug*9JOh`-]نh'U1L2)g1ba7z?B endstream endobj 1366 0 obj << /Length 2165 /Filter /FlateDecode >> stream xڭXK6ϯPDUH"{;V%d&J9$qMZ~%q^E"n_:YaSֳL28fw_JBJG7͡^fH扊xPJY6$:<_,:8)Il]ѻ %m;DE*Xi6VߊzʤRR)+ɖAȓIkt*bm4B+_j+mA5F:PE/*'<}O2eW~.+HJ/c^G 5zگ.\ev)61qƩcAw-^f,"SATUhc}UI up" 'zʹkF$iҳe$_` ȥ vN籮h_)A,D= PX5%H $119!.+a{豸^6;o!󀙳u4~c fٰ ]K]I>غo) o` ߊ>];0G.L@Cep{ pP#<$/+ rP5O{s')Fq-~u=%+_qjOHa-~ +<8W;LZ)#lS&<9uh_ `@04̓makG5SƏ3 Q?Qa Ք~gbFP+> stream xڭYYs~X%˜Wd*,K ).8V8b=݃DU\w&D&M*7H淠iodv}[l{v |"ɶYZItG =zM^h?Xz,7(gѱ[ؚmSq뗽߾6} ʢ*F+~oݦ$S!ZeJ #i&,LMJ\hMףſQqcfJln8n8fMtUqQZE IS' 2׌ɳ-=UiQBՍ<$LCS>M4u4Y붩*Sj SeD90J+:DS<|+ZoB\‚<0[|QUN!BrVQ/9 ~`xK ;'S Ί qqCp{D#P%Hn0@ eM|@g(Gc7-vUl/Mt(ٻr83EҠYH/)< C5F;.:&sy>aL")=";_$4.ְ;6{<'q7YJEmT6Pݮb$SuҐ1P:b7x8mxYZ6#t^<uXJg`ʛ=o C.ɤlYGʸл@Gvq(e8O K&pJWOgm=KB;ioڞ>a?9"C :xHKd~ a)CowƟNŎ|`GSsq:Gwu+J8À> ImG w )mֺ-%%`)JyTTH58eיNQ֮,c6w•$9>L~0׳$^e4+GM3;;'&S&{_ym`SQ$RG82%q~!8 &<\ĹBɹ `M=9p2z^0bzQZ^q~q]a#mc#^2z nw}y`Q3\E~sè8Zf)TroW%JP~$BịWFlF @noDtB T?F$\5|_Ǻ٩JC34"_8;[:uU+ێC *).gg/w=" K(3Z$N}EqB9n)pOol("rFA4K~mx9g  8N"lilԐYuQ7RĥD&q?0?gBB"x05V"'].|% Wf[=nq( 4C ݸ竕7H0I}rKH_y{U?~a綩wa]vė:lT̆a d=S9Ҍ%'3lvÍ/Y?E&!+G DGGI&6|bsWdp3-yZl|0\A1hӑ`)D}]uL\߰u"g[qى*fWGEb bAg^ŎDۧjt[l[?ȝM9Tc?8@yOGhpEM=͜Omg2k19)y3:bxĿx/@H%:BCJ*#]IǓ<% v R.g[P$<;܂#PШǖ6t.ֽT-G`GnA9)FP-$RIWEc'uP{ ht~ŒHe:f gkvu{ =Eƒnc;)6YO('|8HG^,*EN0HEN8= endstream endobj 1381 0 obj << /Length 2635 /Filter /FlateDecode >> stream xڭYYo~ׯ%l`.vliqZ,)\ ;o/݈qd ȣTv',O%u/1kQxa4nIgz;FI;c[I{ʗ$tU/:տ;ZrojT p0,\96I}J/xGפ{agg\,`,@DXxFsݱenv}eZhv<ӣv'3-욪^Whe0Tw,yuT_ǵu-1{9cAeFUry&[={2w+gw0n`cԦa]A|I{5NTgPjַ'鎆gǽ& #̽.iIӑTNXgs{&&t YXzp˭dxFð@Blytsqݿロ|!OD/+wjްK(F|zݗjgy f { 'z@ mHbR%߁XI]VBجuC A1IȥABR`0^Plz&OٙfJc\IצU >H30J^ C,'R[f$DtX1+.4ZFשc "{YVnju[#A5]INHؑ0`rrqM<r|8_n0YuIy .֞K yòIw=bz}vl햒w/.$^5Kf+Uq]6L"q༽. 8(";,X&ޏuuOVDŽ _輎 ܘ5.H`FLN'[AKmT*\qf$vJ-)W?O+0l6( ߏl4e0a/&X/CsEnnfl$A'm7c˷Zy"[$`dI@t}вie;Sx"oaZ9TQ} y\1oj:ԃp8A;US8] ct[a7U_Q9c@5G f8œ]}ly2NĬ̏%J*Jdej&g/, X(W s+0s6+)V\"־aAVADGmjuթ(r+}+Dʎٕb.SdrcPt/o}ݯ/߂kn>=ؑsNE{q.F~rlwFe#١Wv?ҿy92!a%F|%/AbE&3҃dcq#ue‘&䜃e>!Ѐ76 'Ze%%0&">ϐ%㴀D=aN-~|BrcKcmS > (꺂=L9Dk{u cQϳkQTAK$F o(4 endstream endobj 1391 0 obj << /Length 3255 /Filter /FlateDecode >> stream xڥɖܶ>_oN44 p͊őMr}nF\:\4StS_.MB7:a:=<_>UT潩~{w?ea:և`Q+Wq$ LoQtwpG-yj;'NmU8u5ތuƓ}֯Ak,b~wއ1'EYaqNolOao2?-";5+{[V}ei>3o಩w uϷE&5jO|[t`{-=Tklvjy.Fpj,%aw=f{^NJM+5 8(̡SGy{2USզ4:ZNtBkbGa%5 (C%bT,qdDc{\Kn/᳧BAO X4,j6E&gSy Zj'62]w ׅOL9/^Z)#[\f *FTCIS-/]ߝqӒ{n~| 2Qp ̿ 4N'hn~-80uies؏5}}xWvv4IsAGp蛝/K90j{M5~X(_8V+ WHS_?#΢/~ as^ܦo60|$ws{|ǠB3` EK^BۋKդ^Ae+[>.j⍤(GҷvwhY;'J=)O|ψry!T!{r(2թK8ZnZ47 : /pE/å@-3Nq[ N`8eݩAgl_${:i9+ mEdp=J]Jِ{GDn\a $%^>SXcɩoA0bqCDBECpJ$seYZˋ_e=[ESۂlaKR=#zUX6Sylɏg"ܑRL,KeuvIV4ا|%,XrҬKIZ$R@q.(uTs endstream endobj 1406 0 obj << /Length 3000 /Filter /FlateDecode >> stream xڭYK۸ϯPNE=1[T8#b$d(Rˇ )ݔ/4M^Xʰ̒l~'<(WՇczHϯI" VʃW:)?HgmdB{ϝuzٛ4D]芃z`N`7WΒǙ ⠑E4/z[_Vja5P͖;x@ց,7>Ʃڴ}2ۮ<.EUp75,:,Դ܌v؅Y(ƾ'E;pgSo jģվQ%3' &Y"[{pΔ, -{:rb3#KѶNO^!^ӎC횥u$ars;6}{tfiӺ08Q^O4{ /~zN05i>Bfܷ#X]2olgO<_ea١0*%kh*8LN$3=7[o:w@wxc5 0{z\6.b+ 頷r`=8a&/~ ԣRs2 Gw^ޛ/n,5/ cm#;(^t 7pR{=:x?xcOS]IWO C1AFs8G}y1Æ6[b-@!%Bz#Z#3;|Ni &;Ofg }2UbQ?k2Ȧ?@e33L /Ռh: J|ypUgz2BAڮ^VO,gv4 \31'J|J\!a5 2Іzqv/r_Y04㾕ͤ-`x$AAI»r3jp)C +0bHI6[;,Aq*}p?A;2^3 Z!)r d/9eG_ /唀.7 Sp_G+,{LͶH[lCd)S!H%sBJh/L\euPGsu׺DS:D[5)hO6_m҉4#5^< xzHl=x.%$D ­tIxۀx6"u7#g3.C.W'_>#J}Cm6@NY{Kyvk{ޝ%}ܺ}17{ո/2Pz{yngm=8½sy]=k`;/r(uV2zNG1}<7 EPtWĎw('"뤵{)jbo\qq¦Ah/Qf6bъ A0/gl4$fdM#zs8cJ^U{k"ܠzi.(؃Z҅Rt,#^브/g繌1{tOx_i&Ź5D(> q sLO.=wJ" YnLGNFNBٸ/.|DUx']/%rͬo?Ϩ1A޹KTW -Ml2yf. `3wvH%}gyVҧ#ϲ.)VYU!(rӵ '|M8%YePO\'B.CUdNbP?6:&~AS0h|ڂDaШ8fdpvy]*Nh I+93bgO:s;j^ӈcȬcOnr*3tgmŷj6So"Xa mx=S} x#j,z޿k٫[t>4o} sw t-LFh{2^:ph&86&!Gd|]v?,r &eX-ņe5 +"TNr5 RO}R2;Hb_>V:w71sI#EO TAd\ljbz?2qܱhEs[8@ V[c(vcVܢDLa;+8rrAYqg99$-:J=KPbY@1# F.|a ͤn<2F'/?1\ſv\mc1s<(oD #} ڲ ,'XG$_BAr/8A縡(.I_Sӡ8i\ڍr+g@I{-wgW2#?RMR܅-$&Y'Yv9'7}Y4~?zˮru׫֊V1~A(Lx_}*K2GCøĴ^^5~Mҕ$*9HK!'O"N~Kߎ݆I{)a`OiSPzFTpKDYQCa8];T-˸+abQqtx:1~/r)^`HS wf\5\ɰ"\ZjdgϢhl *~gb`춭AoP_0` D4vQɍ([ |]@(?ͤƿ7xY{u%$s(n,a8|bW! \Ë\󅊢S]8r I¬H z4W endstream endobj 1419 0 obj << /Length 2801 /Filter /FlateDecode >> stream xڥYko_!0BdS >[]cPb>٢0`Ν{Ό_O4L g~F,|czwG}˛eE ,8>unP ]uǶeW5ml}޿ǫW]E?Olb`䏋|ĤIc?S߯ޑ&q0Q%B?HE?NRQnJy$Ωyi( yEv]5l;~wm#:,z3ww5K&g[:V7yFqp~S ώ2u0,#L+k]:oaIҀz1 / wv8؛0N`{!WMBD''7 "f5anML$v=5Ɯ覩F/,\$!v7I}8" "JBdIX_څ!$DȐ뚵|-'v`%yxݡrܚzvZY3V yO9UpjuM#Dr-uB!e.09skגg̳;%0qjJkCq7GHAX2ݕMbwNZ~ʵ.h"]m,>*щ(ڃtlW)ET;>^5 YB7tX#oZAyt[m8Tnw%6ۢY PLW8dY{eF֝M]N6EMh$dJ=fna?վ:EW!iQ5lP N҅:jVJ:`2`d{l#C]ÿxוkZc,~ ',5paNh{=ݱhv}@JHIuSx]V.H A+ߖ*Ԓ}w+$s##x7B(FADF5|eT*L{iU8i'$ Q-'xD1&aÙƭ2@j nE0h\93Q Q#aE~ ە.UV9 Jsc 2DQAwWvRK^ |=? o{)ĉSC5zT}Z>}ۡlV$,#GZ llhVK|*ɗF)fF%:E䲲\`,h7:@!v@GB%~|b/L>܌ZꖇB':Ak+y)`GQLeOhwt^K-/۷Tsm^ Iw)@ce{P1L, lښ}uA-y*LȫQ&V T_2 endstream endobj 1427 0 obj << /Length 2299 /Filter /FlateDecode >> stream xڽYYo~ׯ`́5 ټ6 5CCMJO]Cf 飺zws?",Rnnn7<՛,CM>qP.@?nwƘݕrwLp*W?0mxa-+OǛ>\r6S0M "Dl6l~¸7DzڨԄY¸|;TD3=t(I6iBy$Ω9Nd87aZdKNv$,[ K9׉\U&51VOk:p[CW;~%R Tyu]tק)J|ECZz}(xȽl*9EiP# m( u9؊]ӝ{9Z,1h䐃nuE" @ (1c8ы̕~G3sfͺ(OQ]ܓgwll-Z~ɺSdiF +)p:[1b֥L0RO)kRVb,xʵ*'<.@"rՇzEXK2J䉘2o5v#e./s棠ܻ}27ؒ.):7C0&-;˹ه[ߘ=ں:I2I"ԇ\}rk#0T*1@8+ek+3Rp 1npD,2q[݉& *i|ěN5闂( F:$ȗP5E.K.8|sS,Oee6,C %L{Fꆭf>!&_*}G3e}ľ^Akםz׺.Sa o@:.MB .(O"fz79!:W[םx!pB'=׹"xw XfFF'Sϔ""LYW2JY9ՓC`LGtNg8 +9.P^0o-P%h7a&+`Xl@5`MI$aR#l(m!Yij*vtJlsL3H-V:_퍨!8{Z7 _Sjfby= ޢspT&0=\y]\sY] es:<O>$ ӊ11}y:ʉILq?O+N endstream endobj 1437 0 obj << /Length 1785 /Filter /FlateDecode >> stream xڭr6DX [3ɡnf:i0KPJP~?]mZv&Hྱ/,͙H2*3AEeX"|$> ŕ bخLkfDd/ȳ87U&neh~b鸾|L>uOsf2_j10PZf -n%s!2Mikݮ5k"K%v6Ym6.".T\Q(⾜*W5jS*-/IFv]kiini:OU|Vqm jeBQx?yuOV PJ!Zט2f}€mOdRQQp< 2*bNO> `+/D!R\`q:$X%{Co J83)d2͒4R $tOh.h.J# Ee6Bq[-A䦴Z~Rw U3v[]ZZj QjƛJ}jwN*Bߣޚ%S oKo7,GdpKoh" zf-FDy&qT0+! 6Dp,1R_oyfǼx7xt͈ʺn76/ّ\k!SY"݊VFW__wUK̝^oks::!7-!|\E`v%A M<4{c(,Jn%?=`~ދN H֙@1'>I9?Xxfҫ7mbc౥Ĩ[6A ahx w 8kڃUZl[ 7dRqe\o&Og$Ep,k:܇9/t]Йdh>f=]B7MnC y i[9<)pOȫԴK2 8qWM/sñaj[|Xb8yS%kIƘ!A8 +_?SonE=n-Mq~`]լA9VviVKwx*j]A+,"oynu_c{+{MW dM7>)wroy C8f}I:> 8~kݸXW -ܻi;@<PDMow]OV״O&\_,*JS`h'r`]_'u__Y4f?& 0ZQAr:U=d g?,$pVY0WqÂI}qA&p^qA3-_ k<-ZxVFJ>,< #/}Vx~,"~W [ӯ e_' G~!;$_09O֭H짢bŢħoz}/| endstream endobj 1444 0 obj << /Length 1222 /Filter /FlateDecode >> stream xڥVKoFWVM ( 7VIki-/J.I9dnQ13xÏ'f*ҜU$3& ^@0[+^U̅?4B&ڳ_I$/f/g&XU"Y&HY.:^ͮsBj 6[(26ej[$ӯ9W7-Lo7Qt;w߹Peҟ- -݌u>[s髺ݭ>:Y˾-,8ChݮBmn ͗*m@0yM`2 w..zd nmۻ/U>0Ú pr߇ "9b(ȼhz)&ǝcJf!t?jW[ux$%V6"pGB4Cb;EN> stream x XUǚ]8 ( (<̓AD "*1)yHQ  (ɜI4f0ɺ=On;on 1* ZݵTk-K =<=ڭ!z-7n1^uYW2jEY=xGe}Șh~=A#VDD_ B6&ݕR;PM9ByyGwq;x111dt=i ,/OfVTTyya]݊y 5ەԢ9!Sp;XNZy|[?72p<5wWYe222222222&Op}mttsX ))rbORmu]"S7Y\-ƍjƪ ֕@95Z^lh8W|=!?`_22/RK_7I֚L{6W[ [FnW kEx#t(%k_z%IPjuzDWU(e/Uӵ &n'''}򀞢rF%*~{Yq222222222eȐ!DmAͱyj Z\mn;4?;X$AVe<(ש9h=Jת9 *؈ .$4;w( Iaj:rvv6noOHHٳjKFE zr'########^ڂVRRRת0(ejy+bќVƄ1 0(ePjlP R<ʢq4@Iy dm{TX't^+ngJmg.P/rqq1n[^ߩ/&2226{r+u}UYw222222222%""-Hnt-133{gbBV pUk;J@R5=hjP!Ae"d崽ju0j=#DWHj}]BU)5{j  |]]]Ë4oc e+o;l&99Vݟ9*0Ll驢,=ڢՖ/4N u˗AHT[E,VzzjͭMPf2Kd:}7GwetGFFfgE~eddddd}dذaLTՖHhԖeb4#-:K^j1=x.Bʩ9s;x$lPjbv* 09TG3Ci+AfSGx^Ly\?{li&d+:xSEۖeHwAgggY222222!DmAnիBb|AC hZ,/BmQ[ګj o 2 V[ɣh*E G1. b5Rv"8/MeBmYF]k?;WqAԔ7 0xR_$eښ S?Տ-lxK>P222222222׷-HBB-KK=6kq2aXmUs3 ~z#0F7T/X ,>Rk/ rh(†/j<2h긏1 }?k4g ƶ-]_Z~!˼PyV oFFFFFFFFF@۳S-H\\-++;JU[bLVmaPj j RKP[Z^K0ԓ_DEch$Pjfajh(ԪLm^a)f6DP[sd[]LǰyȾKW^Mz1[˒h*>\J, (>/Btpzg >ZCjt[?/d47<eddddddddڋ{gS[Xlt!OH7x-zmWA%- J-AmaPj!my "H{SyhPj j RKP[&J+b;S$M 9Ej bo #ĤڧLxhͪYUNdqp#Y222222222ť-Htt4ڭ}vQ~/4ն O8 Z{"¤PFEzU3 LRk= 3hq U,B%kh7IELJH92=;Ԋ7Ŵ"2^__mopv*Hzi"Rdzozy:th^^Nl`vsDekkAOKmui0(iw>pȄB@UyIEl##}:ڂ0`o33-e kq ⩠ŃR5[E(Ʋŀ0B ACm2:_JKRj}̤nA\ҳT\JJ ZF=j D) $`׬.E=ʩ9\BN]Q-bkUh>b ³ VmʛG4%ws jGGǖ~jKWt$S'kS',,lȐ!OpM:uʔ)yyyǏ5jTzzM}XYYu~ Bib5FvBP[mq5ka3i "3v!=!DGFlZG^s O猬Pg۹>.=<J-\RZg G)43`u:mP[o[ڪ|X; -v|u:[m ;|eQj j N8M,XDQxQmvHM$VVmөPsx!}:999k"H_2hРԒo(++۾}q22222/Bz MK33.qvuumNxp;Ama@P[OU9|G0A4XF\maPjݼB_&J-! c%Z~ɝ.!hAu[g0Xc}OU7ܪh)Q{-$`Λ겉JT2l5vx?I6ok~s7>x*CUu3 tP@ߌWN=AmmaT <ڪYh!ZY -HFmd@;=èr!Zdž!{ oN;xǁ {j`ڧu%6N#zAΗ}ONmu*ݔFj ;6lX^^PΜ9sӦMk֬Yl᯲eddddt =z*'vݸd 5j '΋ν־AtA [DmAma ڢsTXH-}U[{Ҫ-ǫ'UڲUlNUlL}iNt xN#Gz$PjZU&DuW*4&faL-G%дr68{G j /YjjXT[l_i_lBU,}2;o!U[sT[Rm9G3&1V߆t耑Űòf;:>>>%$$=PVNžBQybdЪz@hZ'.84<[3-8*zұKmS?dáB""-VQP*•;5b ] 8=-E  JgTL, *;Yqeh{j#B38fԾ՟h&{W&R[ovvZcg#tAmY&:FDhV#Ov{2dH"edlkM|#o;*...nnn;׋p/Ș={|edddd{կ_x-۴JAma]s@&4M6+練/=Y*nH^g!i4"-ʒj9 c9|EN5ЅUsw]Wm!(hG/rzdLZLt+jJjA%-`=KQ'(γ>KBajk3օ:KP[M)}%Ŧ!NP[Ug]=,LP[8d+FZFAm`aW[l*çUh>jCa:AyZ#jn?aFjdΧnENҟVNma6Tί43>WB=,^ѣ|j !}7T[29,a:k/<#B=NNJJ1QFM2|+NFFFFvQM7n oʡƳ' EXm}TUq\m5(ζ~Uk j ; iՖak hqU[>,+׿իkRN9c@[1z(Έ[FONY"Jij^"13J-pОٮ hqe:1Vx>lOmbHZ ZW ,k_]YUM/rVH|ڧ@ǿ4cs2,#ViG]Rm<~\]]###EEE-;wirssnj.<00a ؈#bW^}FFFFF˩Z#AB5\- 88o½VmaLZ\mC\Y j ֝e~W3g@;RVӕ^J 68 }r6\!_@}Amݨj69RdS:D? WX%s9^)hK?2۴^AԢ0D3ƨU[궳 Zo𖒶FmU觑o_\m]P.~m|<TTBvyiywEP:(aaa233'L?NEDD~L6M>}͚5RmtEޥu͙kfiy4ܫ,ch" S*u„赴jpԖ`{j cXmaPj<(N|̦./Ba C( gR 8 #F%bzkWndw]S*' ^['/ |ǯ3z$=5l8 7Y c uLejY? ֥0i ܋#&jks zV, S|xNN'L0qgry<݆effΙ3gݺunt-IONfRmA:D_O ⁖5z-6xE4cAg-ƽ+}pp"jk?XFZuK? ޿~ye*IY{qYAmWOڧ΢ĸzۇw]vRm!DaJT[0vO6vAa- YBVm-#U[4@u2%jKhOmtAD@>MFJ*>:;j됒zrdg#~=8 iZlry&j׻UWBPDq5444,,,&&&11qĈ=:++멝R``a˟h7ʻ/####ӅV@@@WQ[<7-ج^w:mitE jk%%ssq^T;MO!VvDP[<4h2l4u?e(0MmW^zkT^ޠ&<(9 ,Rрv,wa@1jX(T^ e2i O)ۯE0FZY:eB2D}>ҭk/W['X@;tСeo6/%hOH;nb󊮫DwIII<ÿNNN>>>qqq'O~|ki;vlII͛*j+((9P[-Z:JLVA4(9n_ͬ/r[P[Yx u@b,Sںp]H jM%b qx3Tx2i>hKlڪ"ԟew rW1WՖ&xz-xw:繫AU[ {mںzUU* r;@K@ZBu 0'26GW]Q{tRVmg+`Fj `sJ- NE9i%Wki=yj ̯FA#Pp,gy4A#77Ci^u \FkO@@ ".7 ZaʅCڙ,hU!d7Ov|Mk?EdkkiIͥڒO~ZtZ%_S)44422-Wtss[q?;wܱc۵/Č7TnBBB:ڪd$%#ϨjKG!CZ z-2'rYS8ꀽR{j bVm]Wͼ2 jRU1W^j\ThjRF%Ss}m%nZj`Wd@@P[n h*OU@ԞHLOU[0RKP[:Am!(e",zآӷZhU[D3PEh{y%jK=J(KFj1jU;_YWVr[B.}?U^mmC7>j $Q3]i6L񵻬C0gΜQF 6,"" ә O짨z-kbb)SV^8G_xwرm۶[jhΖZFFFF-TTqU8 c77Wn\FG/ib,j Gf!`#0+=E~4"+Pm] 9Q:腠';%@RFR"Zwa'ZG$@;W[v0~c*pxi!@E`uRP@P[h`ֲ$@P[x@P[T.hY=߸2-~_SP[!Xb.ի\d0Z ERoAmX",X̲ڂv)9Um,E]Qmk MS6OfsUrY,Gͱ@MV'E_{Vm]h|ww?WUJpHGѾhOP-GxF6CT[̻uvQwue:„=)5a„5~ѢE[nݦϖ-[6oeT[gjl-}jkk},@?O V^LT[.pz>LVC%B x`ػjK9`7=iB{;94d\>,}`z@ pqX{X.L -%6wY\l=n>_0P v GGU |CgV9s93/>q'rM>Y7 dذao[cS|!{: Gkz9xScY2PmEDD<%xL llmڴiƌtQg~5Wʾ˺a1wڞ8~@ :OEki鉢DX~;CVPfy]qDxtqY%8rM:c+#l"v"EUleVmq?' j7J(p =Μ۪relҡ]Bm,kAmeTUT1V[8N>:OZ‘\FiN h-jKeјGIsA94Ѫ-B0-+0jlqmD%6o ӑ.6m|&@uF5-Qm31'o(!wB@x^ܭ{Fq/|Ӈ7fumW9XlH5Fv#=+ad%)e$,9`7[,####EVBBBgW[vqRKDze(5e,1ġkW\ p("pNض1c"D!nc1;"HHZV9g>6@BZʓs&{'5jk,B:GT[ͩWذw@Wj"| jkb:b:s+*Fj@ZV%K{-XRI>̼d%Ԧ9,}1`߅3w"jl81AmAVmU^>ښf˔pPz=z/ j^CDiRo)Ɖym5KSlL!*3O1U'l {6^,9QvK,IeFv[zo&H ed2GAEAUAANӝ̟> }tګvΛ73owl?\f̛?oM^enqb_s-uP8eBR ~J'P:4lBYxNYXNY9Crʒr^6&{e d/K^,${g*UYdZ嘵= .YYw2+Ube:GfHi(YN^?E?2Qm<%trww™p̙iii/U ۴iƍ76m22222]Tm 6s VaJ-ea_- 赸R_\p#-6Vw֍a'ªUB#!OO |hںxCG] jO6[J6e_V[PI0)n;}jt/BU{'TaPjxڢiOZkXvIj xJDZ.a'5cb`A@P[Gt^&)4jӑp8{h% Qmqx,v>ɧ~p,&58:%r@T[j́;J& l 8md[2S >BUj+ G?+ ]eJp_E''{,+V w?=vl `֊u[BO6bbf{6lވj˾Fs$ש|cu\-U_Zz]UOٓd֋P|T~ Vk(. _=vGRJc׏\9lzٴ#B5jS?2k֬YǏ5jTJJJ\\\xxx@@ԩSgϞ=qDKiR[Opڈ<55uĈ8wV{Rcbϴog˖-[v- ɓ'˻,####cA^QRBwahB/^gp<8Nʼ4B].T:#N(U[n55U./~q]5U[/Wr]gxβpAmUivyU[(Kݺ@-<:x\ma0+XU[9Q4 A%g -4HjZBuJ20O'D-jN5ժi^PmA͜dnW[=#TkoUn6sƵAE׿P9M9$(U|U/S6V%фr?7*-!5 U_٩)QU[E.=g5+e a-bmm E~~~Q79wG$8ٞDEwW(>lx_=ۓnOr5x[\nu2Ę-Q#>M 3!L;e3gYΨ/ 4iRzz-OPmCfڵK,),,7oYb.Nx7(B,z y9jFtVm}^u[g^[3,8X5q9̈́0}^-uBnt) R_?{\.s#ӑKfB*)1@5sA|8ڪSB,>ePF:(uB6!/ZE{_~8Um"o} xawY67jUW]Am!(hERKP[(ƀVQ UVw umֹ*ԛ h, VR m.9d4Ss\회Z;?"wڨUJP&NNEԑCA5s9+u`KHu3ZMN~LxoruǷo _cP[зwxnc1V *kẀz\id_STcsJgj$S>-;D4ڼ=/P+FяNN6tќ?||{9זt2;Pm60(m|zez쵉~kVy:_g^Y/o]΀G\Z-S&W{:k굾U̿z}dFjq;F~l]Ni|jc©P+u.Qs_G3(Ֆt2N˄>Nv$;-vk/ҟlr ɺe˂r^O:zsۿs)%zU#ǎ|jkb;>N=z grIIIyyy'Ni=འ~.,\h:M^}Յ 㗑!oLMdddgS[TZ2xZ8>pCe7ͮJ@͸aNY :ïUY|fN+*5́\'Z}ŽZ^a)!ꨒT)A%ҷm LޫX:Z c#h"[T;ty2#+yoYflqNK8B*bnQUy4sT[g|J.Tmp[lE@4NZj6n]F} 9q}P0P'pfW[O3!-ZN{+QmxOAŘ'PNxI;BPmEv]ιjW^C3W26GY{` 6y3TeJїTR]c IkRh],Vr?jpлөk3?T[ ?B&CTW[lPkuwWuǣF`` N9={R'$Rm=Nk՞lt!kɚ *,#eXXZ/o)i)ca@*$טOO[W_t… g* }EEP[ ]"_WƼRPjk%˕|6g:jMe,m7M֪w{CvgqE1^@mc{ZƞTbVmR(aѨkfyf,֗jRWkYE,GNHǒ]w- -ީLZ {U%Ne9jszmo +AP &hPDuWu_Kj BnoFjH:} pQ# l(Lurl"rz&Gx4y4PgyK~Vu]͟^S) *iۗ8"N+QI[6w+-[CR,Q!$ڧOj~\kz>}~iW֤))CK}IWZW_q!N{jYwӜՒoo jkwk-Ū@WF?N\5-anVm5X"p|&vZ/SCWT['.:4(@ںv ݯ6u8YφAN^P[|J78yT[@*.ܺc٧^=N{;2y%,aG cTǁjibaUw]V8JOؑ]JkjūThQ֩$$uGU[b>`2qJ?,ԽND?c%\ ?aÆuDAnT[/jIaM:ɪh)'SU$kq=î O){/4ۂn[zopђ!ksJ{άH[5gΜBd:M􌉉Z'R\\\^^>W;+####3hР.0o'^`hp+|zZF~}?Glqll;;;ꐒz~VmAЄ\cf?}cΩLCCU}#D:BP[eZe*JuQ. ;OC^a)oϩωǽd-y_qh:p/* fOjY? \ꊋTU}z;W3{R2xI4yLeTmrŽfklj(Z_fW7mS[?׍m%gmU@ZF,e}o߳jjK0J^ "(v8Ff,dk=rNLtC8~kUVȵf W!lvN\="\mͣA׍OZ{_XzsE;Trc}(\O/.zI$ KY>i s_w\߆yd~-xpvFm}uoH;B^!YFO|־g׻o-mh;Ƕ7޵Sӽl0T*Am7RڒEVH/MĒţHQ)XBm iYo77n>|/ 9c U? OWC8ik~+hFGDD<Ɉڪɓ'Ϛ5kڴi&Lv:i1:eʔ™3gΝ;Dx3v||ѣ JKK׬Y/{*####߿N#.طsO"e?g ^.aT{ ; R|JC%}W.OXT{t b{Qch5K "( H.4AƎJ91TTaGr>g9ge7ߜ7J0 "~pc[FBf8.E*Q '?O4הÙ&xE7Y}A6OWv9/| O9wm@Ҡh`0!H *@ʭ6 y<]j@,3^t|))֎DCU>hvW[$٥dD3#Cm (ӶD cj+(@N!zP[o${\_.~j#]U.\uE׬'%J>bN?d 0'5YX庫DD,J2RRPj XDFo$):I]-u5rPS21 ZN-Vp,,+}I6@xOjMj \LmXBj,;C é/[q_ .j o8LL"!.uTo;q f5Y?*+'x XN϶9r07iNeN ӔR^mu~.\mH3FOoZqaV#T+Bg6F!`E L2fE*uoݷQI敧X v蛏֋|!zYVCXZYYnښ5kִiƍ'UԖ~tww#p5u3f̞=oWyyyM2w^B0!?(U2, ;:RSR zaД9 *W}yu{ Č "pTaධ1o֠l.@yοY('If胇2|豕 LjئcIp6# iSJ80n$SʤV 6P:*:m:p,ɇ[FG&X:w=ؔ/Cm)g1:@]ղrdtT:O҈,Хʫ3ɡk`3<ļ֞t+kr'fPk֌X "_~S.5WFY<K ?I顶?`>AwP[Dd?LLJ*o>wU!Z)0E$DS[QDWj5qeF>]h K<-vCf vQ@j>[d "QV%Bl LmAoA<` yf6~ZIwCg׬h_hL̯JIjŚ#IAID8u趵qѶY_O~- k ((.#ujbwx"Չ/?ܟM'2TA̵ >=?Ɍ)j? T[B~rB˘ڄ"K.Ѽ)vGIAS@ ;7NAAɗZ/J?/dn|0&144Hׄę3gN:uʡ}!׹300ptts[doooiiiggkkk5bĈ1c͝'T0##VmuGb`ox{!U1M 0 DnUw3ʭ NW7qMHb2c)]r&]7,pCzd(RyjDtb2ҷ}Ψ-Q롶(kxom-Rggԥ[8$V%p@+yFFKm-Ŋ@~@09q2*uj6˗Qy ,`z&ӊjY*Y7>[/,FwtB{&`}<Ո*ʤ@{JU|ߔ$RCĔerDNg(Qd"K?jKPCmRxNg;q<@vW[.8$dj @KaLm2_C :C C 9։@ T0dU$ȥfI/"cft}VA B,.-h-˃.L W @ 3}Xꄃc ߭{ƴ4v7~'&K}w){\4ut0o<PLBUu\Rǟɼ-NG׹dKR*mP˻\@RlQŵxᣯЯ*2 Bs===gzLZdV\tKK3#6h h |g!j*"RRk567o-Ey.vhbכ%^FIJyDfv>>tsݺ?Vm-`]jA8"k;}}?Wm9;;eӧOSSS[[[++znqzvħ39jDѡHx>3r@"QK |IMۢȇÁټ(/Shi!R[N%UI8lR[w5,@FS݄L]m pm<P[(V\-HhIǓ7M /-vՖ|DEwJHlު EYiFm z_8}:REzc v*6F[쭞[Cѷ&EYi޹-f/$^lM~Q, CaVjI8Zѷo_kkk;;;aW1j 400pqqqtt3nhhkllܫW/xkC>|ѣ'K0ުnuZAQSWٖdn_I?^CVi{ì}Og%R_  3z`"#j4,Sܠyx`7K]sޜDPGѭcDi8l$3&&a$`#xh DM~;"0>8 ]$A<DQug $˨,%$эC34z4 ˠUB]Y_,d|/qjZ@ٴdh | VfnL&J^ީ" ?P =ejP~bH']j zc #]j+' >"8  8` 6$_1f&-^mm[ hJ,U+Xp;$Wm ^aUt/ RtD1Xy2|:GTSD7%bChW7DUu%5E9^X,H^ IjJ4)%K>I4.im Bb7nH7 n ~Qme[gLZh&F\D~_&C+?%/Ͼy-jt03Ycc~cHW[Kn&_z&UU[gw"펨!fXۧ⯶J<"ۭ2oXh/ƿ>`/Ɇ-t1нr/@oÇt$\!bsΛUZԟJl:u-ulZ> * 4OL–% jugxE>T[ijwӭ4J䮥*xthQhVhS*Ӱi G/0edeK+dQ_Ud(^nѫluW[t'wMmYktXżVMDvħA ()^''$kB%TСzIJ,:ᵀ|sy7{-"c"!C$ ȸcD9Q `j+BUR[ ,=QqJ"}iNIH e8J 9R[G{vU*+7^(gC3BҎj n%κﺿhʽ)R?!p.W)U@(_c/-:QxF Q?+il6=HٌH3 MFDH,xT/Xf5뤕 N)ݮѸ[}#6yx81ڷ&5pn s, D61 UUUOIJ ̤֯K ?h~'%)]Ue^oEÆΞ4nO{Od6W&ߞ|12#_ |('[]?v/6XWI"2L5VA G?"$$dс&}}}a^)vsssvvvtt۷/nKKKCC.ebbbmm e k^o0!HjUR\TњR eT j3 t\:Z-o;$2,7>OlIa9]%Qj^.[X昘:h;ꨋN"PyzFcsCFDRұR2m:mzapwY;]m9J~xVFz- * -?t92\"O:3]VX$%Ab.""c4.%qiID衶BFnP['s%xY4顶2j%&1[~!빲@!b4Lb"DЍ@,uMWLm-'ApbCm~6ߤM[KjGO;( .8 :n%Y!]j W^xF%ʂ|;D1W5(֯Hfgt@uaCe;înUVY,SF~JJ.cS̱2[ !j'9{ F/-1' ֈ#G{ U.!iZ_Z[dP cBM +zK>WY}fxs'+>Xهr/Bd^Nz=B w>">cD߄LzW[$oS_h>:U[^YZZ[8@F COOϵ#XxmmmMMM{ح^z |||]' aC[T[LlZ,c΅ݪFRRt,SAdJ8V۸֠#Ӧ9İKme|SȶH<=N#: F7^݉'?FyyJ90Yd*6FG 3+g )DP{%K4/j:x*H^)TBTV2,ex>A}T#zm&.=\hR}],'at6Mb PN*9wl'Xyb~js1ULd CmeSNAb}gdZCmDEc/acsyG 8*Lm1%63S =jIwwBS*?ϖɽ'jdHwEw"oEy5Qmxl $T%-#}1?u,t-fgaaW KXYY9 Wi/X\tMMMuuu`)[}ݻw^LLL-xSx1C0!!//ުe)5EAkRF<KFj8J-ւZ D7Rӽpgږ/VO!s`~\xObO9.VL\i'!Z,zzp@Y<lc&VB/B(:Iʶt3+ :'r>i s2禚J,A%9E6THtוMV[Q4h?0"usi]8r*dP+_$YW*c^X2(\myІ؂.@GYLm}H4OV zgVxUTV$ ˳ajd óW9V2DfbCֶdf:Q@Ny螟6L j pV|׿K|δyz! p/ [GGp#@z#ЕV$qd$ХTNwNFEX-R}t(pźU? >A죨6k $s&V=_˲H/dע|zX\\:fʣ2T&1+ QBUDj+ D'\sDʋe$xj+C :P[2Db: IH ӄޞKDsc:c4c8#)I1g8YxR0]r=r:jFdV`) 3C*.Q=X\kV<_>1FS>k_~̝&}[8B'' P(qmkxtGA!c:߲28 I)x%d\sȌ^jK]]} b\_ ->3Gk*h4*L>TTzE93'_9׋5n^׬кUuZNJ 4Nq~#3׳%ގm@|Vw"D9}k'zZ霩Q}uDV@?wꀻmSL1bĀƿJyxxE M8f̘///ߪҋo„ 1߻wo&ٙmll`hjiiinncZbWJ0! asBRRW[yxb(Z@UVs @Qkhre-//s}rN;gt[V' &|!ͩVx6sn3q>WeŪ;|R_(e2$Zaɲ Y%Yf`s~Jy8xruұ nF1 wtpfk~ms0 i:^CmLxkKb,νAIJ@uD'M!ߎSy, 5]7J%xɃ N3f L–x1ȁt2E2ON==ORVg`q׫3Dꁣ"=V"Q:Ou%ZV|*'xz- 5AX53yE0 dLmeXN88%[ۑBպ` 29aRhH#2]1V<*TK7LJR̢E xlTzR~f7Hנ upiu-f2R=3_pIw)jΌ>Q]dHsQmڃ&m~:~.Mâ!NUN(΢z"!F˕K+*S<ߗx_Ah_wDnCS?}bV/s RYi}Oǎnퟚ`sX#O$?yLVZw_~fx>|ZAd_}$vh{ j]Q{n Q&z(rWN@4Jy2!Q___-_tuuy{{8 0ܰ}=w~~~O 8}pz  `ll 2dޞM9@[gmZYYbM\0! abbbW*aMD^)Wdc=|A-J: 7pt`k뢍|L&ss3 [ s2dY9[ za dQCdHTTڦh͚ÚL.uW[wJ4!6}M܎p鮶رl O짃qA /*c$C%rI c"h7`KF2X:VmPVP_jl!?6->a=5(;WbO}J:_M>ŲQD 6?jyJpC^&,破hمX=XU<+ ЋЈ2f)@xql2+-r,)SILWΫ59LL67׫-2 ѣȘꦶ*Bt|5Lm b i o0vbjb :8zS[y%7cEv":|s@B9('ܥh2@l 3э FElM$8p ܀+2@)ErdUR* "( +EA2j)Zs\(5ljХC#7:yDjg Z>;nԸŸ΢ɰtUt3{I@=;tɪk7L<`12<"br5κ?0CӄSbD͈~˯I _V[*'Kzl[qPH ho% JP R[a%=pɰ,EV'/[^4?z7 db̫$mvnߡ P*jF%.Iʼno~Ϙ1 _R[q?Fj_zzz!aaddk^feedkkknn'qpp }Wjw8۔pc 3E _i&G{-=@y'w.);k&{iQn\xh: ;Mdp9̍::${C^yð:@8GBc'3 C KBu_ܙ) Fۈՙ9Zݒfӓ[MP{eL07b٥d8qy: @w}âjb2_Sb:] KZ,T?SC%r8+5 |}B tV┴GHޣ%~[]#mN4[ELmRwc0-a b2jYN0!Ro`j+ ’S[iiD.'(Lmi@)EFrvUFwEoeY5hqx eK-Ŋ Ѐ@ +A鵽>£!coZk9uwM54h-z9Sv?٢LJ&M|rbT$إTp>!nh%ypY"ʫ~[%w/_qM2 Wb 3i6'D!//DcƣoQ/R}%T[=BO)mʊu445Xyqw4piWk1ue~'߿TjyZMoi=nh$O =үK](> D|V#E^l0i;ܛ>?-_e/zzz_"lllLMM/ppp=&82$(( 4p@U(e\E`+<Ԗ9[][+ ao?+kԖ_Bmy21%Edja`Qua㾻13muէo^۶nCr_qg>m֥VϜoɾdYӢyfŸ?@O+//H/:tl$< .kdaͦ#rQ[If;D|ڝK *{NkDh:t_]ܥt2S|aqLG{'OnY--Wfapb\YθË/ H 3~@1g2+$Qn@`jɠzrN/h3uɕ{eZFm|Gq=7{*6KTY",MD>3HTGB[s*Aċ,!'Quy|oJd95j1X 킇'V>b!5X,H}8_WU*eDHw"Vuה{3pK){=Q..rߒ>V VܢMڂCcjkHNXڊ#j_oAPZ(i \,~GS[Tʠ)#֚B@귲|,H|kMR[KxMkvoT9اviFC;K^ޮYK%*ԪqϠ@@shhӠ*DEk.I0pE1`pd׃*dJU@{bԊ7NIKGXY[:jU*ZzDNahZ g&-Uώ7Z,W;.Q97qxc'`y3ƯtG"[o$S١,+5 93 e^udm%GjK+<;I.Rj bj+XES5PC$$T:^IDiq8E:HҠ)>̑졶N+&Uy?B'-jk?G0b 2ںuQ ù5Ɨ;O܁7Ͷ8wa$DʱļxTk}[%[Ⴠ8 ɽTM&3)/K_>[ۤ|՛C G.=}mJ_׆Ǐj~0+m;܉z&qCC}tS] n⾓s~Kxʔ#JU"$ňA7J^߫'-겍rr " Wi{/ %7I~f sv6]`ܯс挟|aY ^2/? ޴zm IYg^~su^k?|MMM Z#ŧ/ȶJxKZQ>nuL-,߬ܛ %gN`\G9`?3fL4 ̊{{{vߕft-Un{V;aCB%RVV~[|59˒LmUNI) QYaǞiD^[Ķ` Z= A6xYWTBwgޝ f)"oYPk[ߠ/*c!Zb4}]I?)HV 6]jT]mmnx7 1[z7.l )ܥq۴W8@ `Q-$cnp)^еs=`s 5O"E$J֥G Rľ#qߎYlD48g館cp1<8QͦM"sY?'`]@^il@6#=J*&V(N1EtOYBrBj|.F{pNRm, j͏j :myO;N܁@j-?}B J:w-'Ƭ> XJKȈd<#&C;*C11pǁ&?B:[|MM 8e7/7[D6vFT_98#ٜ C.Hl3lѩyaxU崀|:_C}:3ubܫMWnUO̲Uj /4ުWnhxtWA@{_zҷE .5 DnfK<"C(T,c?ZrQ!S12 ]~H&M(r-E(5.I+]69.Q|\ ׈`0~~oV{]¤UM&?8kkvMmQ۝v8Gt5|kNר\9眱+j[|ӺEm6;mtiZm*OXER2%b{Y}j_ar:Skf !-Bj 9F@@~8qDx`7|dׇ}e3} &9rȐ!~~~knhh5Y1V-]و0f^K+Ֆ6<' 2J2Iu֊ɯA ȗvf5wZ[FL/&Ž[끗_Z ES^_<U3M }=ѠJDZIWD3FO.:~o-fAkYѪVRڂ@此s7qvK}Ykck5[oY(}@Mö׍m X8yIZ2S> ܭ>UEZl$A]}DqZwpi^o3I1+~B ӿia\SLjKDKT[wC+t3k-3,w(lH{9)!b ĆɆx6bjk,Y!&J,L> Lm f>Piz$ 6N_ֽ\c >O?ABbk緎΄͠V >n/#^-WyOȊ\KXW3U1iFY3b~ӽ٪{2wwuqI/~R[<#yVhWvIp}(n!n>:y ]ʅ&z2=]fī=)t+EѿS[ݹc6k`pJ?ٲ>SAM.27YcnLx:=/6mTRZN)m;jjjis;/Uφ|8k̤UaSĘĚ0-3-7%'I97?{ڼ ǢВ5I{W7XԿ1ƠMMkS~&J#WH剿I{)[}5ݚڇw-w l#{LFO,LQAm``௘Y)ڲ0`oCԩSǍ7|Ah>-,,LMMWgXYY_I-aC?%T[jKSSlSSM׬N"DKQ-19)-9{^cRuA:rWk?U}ԪzR)zRkSd%Gu̺WFjT;" (lsʹ«𙮮|y?os3ɗ?9FJ'5Eŝ[Y9F#V@6X';bB&GR/H0Li5 <] F2 ۹,} ?sNx,w gw K sKLּ#)Ƽ*~z] TSm]nQr4?M5SNָ4к\/xBlBŤEΔ:q?!Ø!U'TZDNl|óU$]Ȟŵ[#h.z.VB^kL÷r?gn!Cxa=7;-gS,||>rs[ڧg kj~v2W[:_Y:nȌOfܱԾ>E w)=|݋w/)ӋP^V^W}>kR9g}MomoomlSҦLKo\{[ 6]IC}j߄-f&u-C칃$g-XG{3%;>Bl?‘Xm꺸&{300`YX0<{V^٭r%tVnviw.*Y⩈A:UY?p?1iw0/// S6e-ٜss}9jcc`8?ҷ`oggp E>&F1g_lKS6 yax/3P.F^MѻZb](3@%u8ֹVw 7]m˨a]Òj:UX\q$ŸV'DS^H1fPn﵊M+=6P:x''8|Aw0 cv:x!'kQ:p#RDD|lfyA!ZB@u&ID XfD׹[/׶<'E'4Nhd[5'FN&`VO$ 1st:C`jM:ZeR,"0~1jnnjk9][BZjӻժ]m3z0 q>+Y~I `j /C'FMz'vrV>ڞΉځ_oS[-@Asos끝M3š&&%iWRSdH`l`^nDr["0ŠJr٪&tZ βHC7y>mrIBJ|՜\s=,>!HrQ}egt*DdjK>Z$?\%?YėxglƩ!!.&251;dgϜ8c!O2z绻/dW22[ H8+=on$SErDJV\jNIRۥ%s[8k̤/r>^r ^Q;En#~Go=omnQ}D>3zi}O;;67ߚ{M ^KD퍨jDQ{jOFQՏv Q{0z']+ oj~%y{{O:uȐ!0~?o .aedddnnĉG5tР#G1" ƍ?#`?îB[߼0! a^K+}֦y!biDzAɕ&d(,&š7t|;(ta$#9眳D1!  853*Jɡ DD95pȩi@ z7ם{ާpTu9T;s)=s:xi? 0fQեޓ7;.^Vz^3. pF|(Xz[5&C>nuSB_7LMIRw.;R[06 L nߣt?ȍĪo/-"烼U7neN.!v9.~>90s-ދ=ѭШeo O]:jg4ų pjȽ 7lj,$m+t6ztAQ[$o #y>r\Zn~6eYDkRshϗG/rWH@WH3_p#v; <,oIal W{YiE<"}7h|D@-)ūݰhɭnwN.kP#QـL5q~ihh3==;ˏӄ{$ڇdRzդNɔQnfbפmBtd|$}6sa00#f¼0 3܅07!̕s)tb2AKP[۶mugϞuֹܑfDd#k\d쯦" m`k6QAAaLČښL}G  X{"l.v gd1>DaHXt/~qр9 +P0WPՄFոf͠jB]qH:iv^ = Ɂx|@~q *b)6a˂o?t\7 dݣckףZ:X2.q|1$e>:,ɻ)Y/R8SڣPZ..eڍ}7ŎGydU)(%D_GrJۇx #~VzvO>Yfef+UdW(cF+PO>hyM+.[EWxlunR"(sq]hkzMXkiQiPӡ&y8<~Qd˽xﻱ>b_ Zw.e 'k]^,<}Z8yѫSľ]Bȝ?m |`;Wbw s-h5M"HhlzN'Ğ y(,fitoDq9.JКDZ^ _⏮AWQb}BY< r~ %wuNqnqnQqno_9~q!hic?#y_q{ .qꋡ1!)Cm_ 3 3 ǵo7X2bݕW]yz+hiIlYNR OV OQN)TH3X3ԅ/Lsi=ηMOP|e7.&&2;$hۄZ˖h9&7jO78i>e Zd(t~B\fTVVA/j;8qcWwW+jҿNY۳Qf.n wYf|knLU xē̇dJ9j8A節.|0zM*I*ej= yl,$,Y A/,?rQw__evXZTU=-$tR[ř|_ڑ诿ȜwSD# Es\#^I?Vku:r>>6_ysDij>tǗY<#s^~6!øjݤFz:Tꘐ£c|=0_"̇-GQEL鵾jKP[k׮urrsUUUgE K浾(tuu]jի7l///77k傛)(("[gb&fw͜G~[ SMLU 5xsA]@z tBD ww"#GfꡋRO VtDJ_0yȅjtlPk囚NOzqy/8tS7'o JuH.&CڊIFh(u$vt1y‰t Mt:<~f?.,AɰV6 =?a wckB-R4ۦoE !& 7嫧64C/z&:9ys.LRO0oB@pY+5$`!5ŧ Ba1sH/~`r{ys[Ps0hT^GɾI;M6χ>/RПlC>. zjt(c FC,HOS1cy k$q[oFo9nMI,p{FO֟zGp1픝h}o#_ƺGBbR$ƻ,ܼ:-eE^Er{!iKXʤ%ǴRKjk+ǖ_ӚSC7D~M^D~*~81+ޒ<"Hkbܢ#.O r9~d 2nq#tׂE] }@~@zɃ- ]|*'KBDsdƹFW#|u#}uάq#,dl V0%]"M0U>'E%'U%'M%NPީedh^xЊ 6:99!*z_t8ֿتտߟYwG,D"Kd{7*ށko,D^o׉Un7^lx[7/L&_7 8-\6N~[W&/6 :$2@+5M(7N4O(v%hcCsav+'!;`b{6NQ<$G [IS9S6SR"/~ {6hƖeX"*XO 0-b8LGfDaR!W˷YUr4efuZ@Y?Pp`F_Ut?k ,z. vGaQĪ`%mjD怠{+PJ1Z;TECq$= _Kq&\HZ1_zqF `=iUTǘFAV ;6`~`a vӏ]`W07 O,O׋WYBB0bj$k%zdsD I%¥ CgT fIz&OF 0OGt _ 1G b!CzK yסw0T;M[u5$8Cv^Ao`qri ӗܪ_B_{U@jQ2TqZ{Qo8)(E5.Di S%:z%[e ZIS49޼_X7>aY(fۭ􀰔5vJ:t1)e>[昧Agb/;w`?x#K%HN5=,eeKMrL4wU W U 5zQ EeeaGn9?pE$kD"nt`6rK~;pڊݧ>낗a'MTHbƒe<-msF:½4f\aH208F[ mr]RtqڨA/BW=,Cyߨ`ab?0#s3;j >oy˗pEܲe˚5k`W]]]]\\E-999kkk SSS###8DE,xmkkm۶޽{Ϟ=[n]j#XWWeccۄշ`<\uřh&fb&fLg-mmYm!on!E(E1GG!X0ByV'W2*W Rs@ nO7aY@9 wŸq붂{H8&Up9+og@O`Q!s 8ev?%ǐjcl9p.`(ʑDkcP3ɜ)$jn"[=K 3[o}XTx U)Ťה`eJ&6fοb 4 ӨO s% y1X˒Z.˼ I>+^j̃TUB*%!!lPHh0$40xڂs^Q@c6O0WHg\!, "j+FF&0h>[m`!<|, `YnF~U3|MoiA!IHE\E^@teƊ_VҐz\. ;xEU RѫYצ2R= x  lk1Vt6HV:%#ڃsrrG#:s-2M2M*痫 WwE/l7ÒyRs1_L)NN2.1/4NF26cʱ!]3Q0A>_b^ZQ7SkCG^w?rbvoq4S$}y m-8nG^u[~Q^qAq~0bXCXlcyA %+? 4΅6@Hw| N' Aiհ@,pϹôZ64H2Eg /89'4Tk4D1{{8 +JF(U\)$}h6%, _w]z9v*j@Y) $`1+ 74sA^J+⒅Z{ky%Z$˻!\*,T]+U+42q2\>h# u? 3i&t r:)+Js$9?1ik0|Kr,ER@#Q$Rlj"y@UL1Jy$|d6µ'S\_f76gP {cvxx; ;  RK\;/}^9 rA$\CABnHm4ԏNce#F"k;Ea&[9Ɔm rف[E]]z,:-^,j{U>_0n?a^6n@tI;6;>=? mî!_0T$+ aEIme$d{gg̐ǔÎufaalieeiӦ۷ݻԟ :0Z̆K^ٙ]\\ ---:::D ybDP gkk;|kkk}||mؘ3WLL̨T[wժ(ڣ9Mm!UEU)Vcq>>ZZ;y~._u xG}_Sz#{ yBj'd{^?gW(7~4ah6* FV*0"X ZKlM9dL:fJ@ oH)|qFƸ~;vlG4' w+/GMn$d4浙0Lk5@5a6R@$@HL&ɢ $ KSS]Gҿc- ?!\ TVt)i}g1;Mt]4f֨9 LNj,c&#֮5-xJe|5*Ynt hP`$w.$ZqŗM pU;.2+h.ji* eTBx*!\ s 5 <9"p``%ςu:U^K z-z!s`"@Ot&jZF#Bmћ`P\'Aq AQZ0ruZnu4v.UZ@ElJÃ.х&yCfe:]x9boSņ q6E/|jDAo o8=V;7Lb M Ѕ1Qڈh߰|?ڑɹc_xnqDQs|,g4E!ՑS /9!27r?MC}QIvڐv%{._I:=/ȠH3~Z8@pXY_(S|4h;.KR7ϰ{.aUmu%( K/}z99aV#̢?d03]n<ae?0/wkϱ[ڽ{޽{7n8sO#?Ӓ%KG xL,===ggg777h7˗/wtt$kkkkii}5K0-7 _gH$Jf)((YZZϲn:".Vme5313jk&f2111!HjA#֔j^BH]hki0/ɤ[y=m ~p~)WOE#9}ƶ~ngqCBT|\*68=5]y Xg2nV5:$ ƪxbB_ GcJp:Bil.gI\A]{M.yyLJ EXo^*hjc '܇4G>R/(k=*yTD.x6Pp[`*ҰsʸKy409 JN0t@T* K(nHTv#]5-#wv Wc|j? U2 (B°8`Zz>M=i)׏Fw1(18Z::ER`)-ń5 rlV@%}.Holg_|MBw\%\l a S*L$V5_KKΞSV$@1@.w#|C&y:vKܽ`DR#QV/ OzSk܄4bBw|[!<0V`Y$5$>´ao)[]K|ʔx|%(!#}2EBm5qȓ>D|i#n\٩RX@F E:z(=mbwu Yjd{zX# ^:۫U]Shu딕ɧiugVv}V9//G =_#m44B/+k~Jx?fjkP@P?]NNLHtѥ:c2mr>IQ!cz/-k|[gn7nkx,_naS}*mkxqz"[]CrZ 9Ǐ\@nͨ_j._-׬ܳr_sEK/ \B&3țX[;0 765T;I'O3s*sGikp//MyPfDn;9?c9cbqͤV˸Ba & a%!'FDža~@l0_#¼0/!La`:^ k ?&![njiih7 9995552׬YO?>}4::K]]|9;=<<Ɏo͒DS9RRR266600 WWWKKK_m!~gQ[3/22ޱU 2$Ӕ+GU*4! ݊ 39}UC*ؽ3}nwm?hؠjX#gj~"cQ 馭7<0>{GaP+a@1tJQq6:wQ߮ytH@`ذjZaG*!|L#nQz W/[']$b*WD3p猍oV<y)WrI~IaJlnW\Mk51ϟ4"w z)C t⃪B.W1sH rYI$EG/{cB5-B Ўsl#]W|50E*Q=,H{;,'4 ŒuJi j/q{-ɚE)U ȸi!’@-¼z\*+xi\ NT]YW""SV.VA-resB29 88i:R(Jnql<{lYN_C7MW"V^Tje f;Gxj+I?oѭG?4ԈPl칻lHTXbk!I0$F%B Eq I^~cVA_܆,O@/jjG5׬׬U WkmkijoR8<| đ%mZVQq@#Who{+@p+kPxG+7psp#Q7URA8`>{TVGC5n|V@ +!q0S/v"igȶN7O(6+7Rjy&R_i)Dyeu/K<|zk BȞ7=KY6R Qo#/8s&z 2V1W0a h¤01,Ci,ՍiR]@>a氽V ŒEo3$"Q[F8; 2}c*xǨ;wڵ{U{O\`*OOc4 oh{c;dee555544rД2ބ"T׊[MW$-5'pYDV# v|MT3;wBfb&fbFmڲ153181M.G,E_6ɬVC!%J5B};SЕwqrͨ"eB)kв`PUtu)Sp٪I Cp]3Te\FޮAДo>A"g.^|inȉM]X\\H RVC+o*c)gkP8ʓ Tr f dQ*.:BƸn 'vzE}|E6kPU `pbJ̝,5HI#NT{1__5_McWk6ri؉eqCHHJpͩ-S 15cL3y)j@@Sƫ VT>h?פ▹C&=EbI5. _ˣBjlkyȱ\)oP6J)j3,bb 2'A f~_.`/BPPNj,*y5Vc'L1"|.nmx#ZXlt+rrA.a`%<(=TH@+?2x!&@"Y(bM,2ijrA % Cc:e"2%>jCb: j-8hD.ViM,׍ K(br _?ߥ9DcB6dш6#ʀ3,m3\=غ 1a,H%oC VhǵU|TT% |+.2%Ys\~hc72^7^58{@3wMELWd,-O ?QljdIK2"?F[H+@, ]~_mgPKuI˵L)/J_T( Zfvn~դNfCBl$uzmZuHSpYIfl:tJ؀5pٻ+/k5K;w'c:x Y Yٶ٧Gwi_ԏGR!urCJ_{< ,D@Gr۵3SeN:揘~1M[hKiKݞLmO\eYcqјA # cul{ykVƳQNcvq0v#-@@hRs|`Y`N#v>~08!jƼ6 eʴZݔFvn/ƅ )Sj`JmZkZ:=}L_SIsZv~<8lExCF &;>[3a;m"VXX$(D w'-~ww7w5iѳZr?Yh$nˆVgö7m޸kۆ;uGqgEYG[Xz=#~۹/ l ,.,5 :˥k${ZDi"=C#2- c*utqxՖA.TUlK`}t V-;0ZyZLg'!Ʊ'F|0_浈/y]h8;q2'&ī92Ԗ-[c?lSUU166?kϞ=>rѣGwڵyuIKK ,XoQR***_a`^H__TSZp!l|;" ;T?[waÆb&fb&fL-4ZbMSjmw=.(@q;a 35R1ݜ>"TӀ24prvkv'AޘaŤ֧)"~!]EQVzzStـnŠ."4ADG˹>$O[yԪG0}w/ÿx ɑh1,E»{[r$kT q}z2ƚKU\)QڧQ5U51*j"fW !%_Ku^b T" fؠUO!ryi~K+G\ {T V!6_Z4,l)/oI.7$#;.mN9O#M$o{@_)CZ^r7@bB#54pYHy|^MBva^[lmr=a@?>t{g5ClC˘%|MzpN.]Bͫs>zVҹVVAiS+`q[T/\ϢqH>'J־,v3Rܩ9_9:zdELxܕR"6Nwtӏ (ƪKbxM,q{9mgQM*,RE"`BCB\mZڧ2&BRk*,IyXeć6[m^j$ /"4a$ͨ/C^aӮk,&Tcq~_mu%JڔzӆE&sl?L|(6֩hVncu3%;RmtiٜB+%B'n6 bN1'QIE fߟۤYR._'QB o )egb8vO=!J TBc/n}[8$/,3*"Wu{&tWveJ-ш{!gk2%mUtRa3#:i1LT {'e1Ө[TLLS)I<Ә}_Dh aHc^C!Pce 2^M ҾWwȀ(?w;"(#fW) V[Shbퟤp޾6[-_y~}ֱΚb/fՄ՗37\|dןz٩O~<3xpc4m%qPuT~Aٮ11 HdרsTcTkH rv̥70X%jjf|25nbpiID4Al3hΞss [?[Fy8sJ9S0Q_ԏmy@#Iͯ <2yUc³)e ضɬzPM/cf ..KJ$_XA=+aEvEdݼ(@O >?kxxZ7C4.LyE m͠33Qu}@`BW:FfF];ǜ]y7Ǻ ,/ٗ9Cg`%~Mxstgl,k0B.~ZWYqD[1 $ڪt9y; DZXT `l3ۨm׮ "a r$s 5kHdig%lQ'(O ;X8u8!m$!KhB88Ǧ[+0qG]HJR;̮~Թi> 8L-q9Obp:x=L`%%/xJ%mk7mrM_{ um9u#һܮv*u5>7bF9 ,zm_Cc\[mKgS mu=3kib;U`f9Z\ ,z bR |Gp_(60'V/0ÁN?Zp&½,` sF(vaۓhAml5 Dq]&K 4دcpTZJkUucj:UuNLa):'hE4D j'IK vaM8i/w릨/,3(J?C)`c}33ͽY}{-2{gHtvle[#kK?4VR.'8"vhذͻG(a^¨Obȓb=HipѦ2V1Ҕô*qY0Sʥ#[k}}ʩ;ٞ)U%BZ@[S '-(OO?dY+W\dILLLdddRRҶm֬Y3"~1c[V$#bKg]>J츇G%s%Juz:2'[ΏLNʜ$y:ϢP#Gívw镓 ǪCYjbLy>s8EH #eI k&:\"_K}(h BϠ.b#_21m 2>x;QacsMhC":[4?O's*]:MFP'[.jDoU`Z,V+ hrWq/HT?N>-,90 Ntp9ԩohTTeִi=@ RPX|暊G>dz6y`tR>7.2]eu>UZi|qMD[uސ:O5 # _E00J Fm@=ɑ]PzYme#Ǧ1s`ZA^\ XB.vUEyf ǎĩ؆hI<^9M|Cg:_| #;4Y Z8My5lV fv t GsX9,j!#m _qh)¨`V$^a"z…tK۞ۣ=0`M%ڦ16kUKk&#z[]TCZy}O,aLoPŴ̂bR}os<"]!T,̴Vfj6XEGd FgrB/63s*oJkt KAxɎku>hk` W \+bk=`!9p Ѐwpmv uJ0|/@D[p̃k&oN sk.wߧ3zȜ}AZ ˬ |ocn{/mo~p:}Gy>}I:y q^E/!kh/8G[5wܝ%KNoܭ(uzov3#+*;Zag#H?,JK&K|06<>C%]3t$dn1>~/oohmD"MP\]]ٵk7n $Q) llllhpHr6 lwDH _hѪUHDr-Q~͵ 0#<5 %ӓh7 ^,.4 MhmM?FW%:n2Ň)s)ArӼo ߇fj f<ǢK.`ۛujXͶŬ?.3ob{>CDN%RYDd![)>-!ʒYd.],,W/\l\f[02`ߍ{ֹe d kгc36^F+ٍ^fK V9[JUB?JY-ɓP?Eңsﱸ Ѹty9go7~St%:zs̾<̾âޮUϋDCMn9Xz^/p"u~v!%s>fUCQ>O& m3Pakwޖ./zMja9z9~tK=KӉEB6.@gjrՠ 6Y:Ef!A\Y҆NUKt2jb?阗bA̍ u@[X`%n ]6QɱY} w`5hb,k+a+N`>¶~m8IlI$JgtEB{]{Xӫ=Ϲ/ž(--6(²y}5M%e 3>cTY=ǏYb]6fZO3ş!x#T ^ɗ> /I-|#o>0c)Nb2uV32$[G=j ^FHO^M@orF]L6Iζۨ}Yk{my6\N!۰ǫ ,zgU A_Fmyt?mOg$,m%\VSjz{15|B_*S >qi`i P0Wt:U'́[pt60ڀm3pl&;l:+,PtD{57LKҮKzy%)⫤w-Kς? M<?"qߜĽsw-kɗNKY-9m[Ӗ!4$q^E(㸦r*%ע6;4j32ia!Gx GuS:\YϕA?U o!`-2TWyIٳgƍ0Bs h+44ё$!-M>>d?l7x ]vMhB@[룭X3u%|cj\2|5/]1co r5璆'6tiIQal|%buX|p [Ɲj.Ҩlyc*k=ߔiE֌׎a/q9Q@S[x(;9E}_.GBvxMqEɆӒMgJOE᧱E(:\N!sރyUt[ݘS8^ݎܼ26'EPV)W7XֶZ868u[Vx׎ -U:Ϡπ>R6W/rn:./ gͺE&sְygHej7ewS:{]{EI6؜+(Ge4OayBq51F`*>Og3euP|k9.ێ{ħRs3:VjÎf]w~`vkG 9Bt&̨5xp͠i҂JZml@-)A)%)U,F]maMUN1/@\D("Vkgpj,`of0O;a{m/PxCwst?G՛nݻޏwOrﻫnOvܮ=sv um׏ֻJUݕ@uO%T6bw1F[vN;uT0Kkg~kAT/f]W\~~o}{_f?zF#E+4]-f,Fs͠WH$";Cp VCÍTs@4spx IU`?ovr.Yψ1o`n NLŦL6uM="54g.I_w[Ҋ“Oȷ˒\;q8\6'ۡHzطoH D<0\vTtyfKܳblUw@Rla0Q7h`/n[sFsՈWy!u9Bk fECkԧEً66q#X&V>2mV9mK0Ja{fAo0kJx:™,Dڬ>/ѐtGԹf32 lkMń ܧ wBK{ y>7?mR׫4׎}f{:>xV_\i Uiahm[h[9{{|}1R23S/DRmU.ND |'Qb`9(ǧ %/4\ڀ-i7}C3l̼Wl(-{VuYg.9|jS7`ݩoz˩w-zkuZĻ'>:q$YNdx|[(F@g#c/)BoMˠjHOG_~TIÓ$}t0p^o1q;m_y܍Vܷ^[ГYf=Ƭ˖nz[طd4at 6[n@c_"Va~xс; %YuqGL~H140C"PI$jS`tSGN>Rݝ"6y쬒n}3: >v̵6)"X?M7 9_5߿_}_$q'rppĘ7oҥKW\[o-X7W$bŊ_)?V^1C[p 5}kOEM+V6Z) zkxx,rXY剮8 MhmM?F/vRH?a:uΤQ#̛SҔk-%u Q] R]QYVQ7rYϥiҸTba3aqxt+ؗ*,]BR"ԩua+vqԊ=BK'<Z cS\2vpZm^`6Yk-`U:OKx"sVU2x}Նzf brȌRMp"E|s*G~z(rz&7zxS*ex%5Bi\-h]of`B&ՑG7/r7:2)>ݽHEj0maX[PU N#`Rшu[x <0 {xl.c:2UK8.8+m~X{H`Ji5KkU2h+50="X)kxlej3d23ar }aEӭFX /%|Q"(s1&ս6@`1:jQ@Ч /ހ?F{VNDߔfayaFgF=t :76lݩEZuubV\ Wys "r%-uubF}=C&L2Q>_^glw(V-Ǖ@{F<+ O:n7SPꥮ"w% 6nIw oPQD)]fZ}K&_9Я90)4@+˭[JlrDl5!WM7޸YӡZu??[γ=}0D8`-{pAC4?c?7rMr LԠe[_g}ъO, PK0"ۍ1tZt֣4uol*ΙDK7LZ$yHI`D*01};VD[<`S`:KjٰD]f^Z/1hα~㞛L~O=q37L>e'2?N߸=}Lo\3oAN "^ qH]-пm-ٝ|G_=yǦퟮ+?ڹ?pG;gOҮkwn[]zצ&sb_?:yaZ}Lî6-\U& (?sT6X}l<9>? ><vy.X{~~vo^kӘS̮6b6KFUu("JUP*( &%t68Nl?B<"'muyySܿN`Q86_Ҹ?g9e6Y\7Y`4}~g !T;6681Fq\FVxmC@V߰A_A{YvF@0#7⎙peF) ­2d`N ̹E=S s®@a99|wb6zpu/icZBWx!/ G?rF)Ve;a֩KMBx0+ p>Z̥5/ 3_`BZKicb \EcjB v.4=:+ߒ"]vU-:5ōϩx=Uspu[L_mi:}Fܝ=i|2#9);}FC =EIwv=7ӟD[?a/<,C̶(/$_H2t|:X$$EkRL8+xV`GSrN"n ^`DI:UܪsآKd ^vÐɰbdh4}7|OO>C_y*=&=.}՟Bz B(-݉JDʸHz+rIUrA[Ȼ{韁4Zt`]ں{YxD\ܴ-gwn8{{|Mį-g>t08;ߌ ='v E5&#q&\f#w,Feag~Hu 8 >|~|8 s f+aH_x66[evԚ=X3oؐ/zBONfMq:Yќ)cw&++nTNE܅mʠ+k%+lxg m۷w9|U/OK$ڂoK b9 \"5o޼5;88ɜ7o^zŋ(GNۡo-KKqdnnnoo8DwwA[oҭ__5εuQ0<8ZlJ!J? KEɵ>ac `AЄ&քc hkvtRٍYLo&w+gc.E"_*yDzUl:&T(f#+y%덛|:aǐڝ{'xGQUލC4%%OK6llyzM_>uν bfo~FSCsCKXCy|t~Q[g6CDWb9G?eiE~%n˕y P^˞"~h'߼L (ԵH)m c3 ¿} whE ~:nAӇ\؄YӠeo=D:7uiSyO-P$e 0gۅ sL,yKyx6}aQ2#[QTxU*Ut]ؔ!.,Yf!'fUz=7zn wIݠKҰat!!~*Dp y"]VV^ Q[D?ctQ<4^mWiIssa?/(/xZȵipzuS;^{_vXR:Nl~;!MȷCӆذyGa{'ɼIg7JiVJ;EM&CþRroĎ6V*I+lQ~pHO; k$C!!>iTM{N^ , , \A:?/"dA)nx#tp=M,!gpux`*;>0dus2!Thc\qy]Ks9Ww::va}m ]`]ZlpvzqMCuJuk.k޴(.|cm#7BM]wV}]G+-2*utxr| W&DbKrNo-0%"0ט9GnʕHF #BB0n#lD nVuQhQQcQLhsѬQP }/e2~iWlg)ARj|ETyۈ޹_f,J_[?3L[GC%3tl[E^ȋ>wVy?d,~;{ru?-󣶜?΍]" 9dDaaauٴiSRRRll<澡JkVΚ5+ ME-;;7p*_?w ^ c+y.xxׂxTTe֮]^ 6Y &oZdQ0Z///ؘ'ރ&4 M ;-Ϩ?GTׇnGء -bѵ[)t#T[z_r[l҅:]9 yM\gn`T;ya [偹W6Kff(kmѬЁ;U-0]V|#]Cf=b.;6Oxd~C#{DhLXBSQ<㛷 3ѧ5xE*ǎ5ijxqy.J6RO>.y:7Iu$0"9Q`(s4Wci<Ϝ!t^6iԖ)0cILLvcbbSjU'qe.u.ωR˝&UBv[ҕi򥅘En| 5kbL蔋} ;Xm,6貯vy) #31iԗ\( w\{ tk&1XH1^V>ͨwqeJmR."6EduY t[9Uwo::B]ЮD86Ȝ.Ҁr?ƌ\xs ooɚ+eKU@O3m0fR ) 5 bb!:£rDeK6Xcw 9{pl+8}>>޹V_)U][c U?Ɛ;32Ky׈gش[BpE&=ƽF^}!KwYK\NSO&4@9VKHZ @wUs{c\ <ښ[>ёkY?|$GG??MÄV^~7wmٲeժUqqq , J5g-_|͚5Jӭ777xUFL$ݚ9s&(m~nblpr!<^جY`aa׮] Wo\]]}||aNDIII֭۴iVyxR-Z᳔G{sªxЄ&4&#,ڢFרU芳ߟJzMf7{ s fimm5^d;'Btvi6֫2Lc~Ĝ{CEQx~9Y <(KU{W!޻8t}i" kZU=8^!&:>9;KvN[Nz'EXS\1Ζrd.).albQL̽T.ZuV;L{Lԉ=dFyD>&vQӟ`{F6Y~8pSR,u&: 3WXp3K,,-anWq/ӠJY^r>A&Z{I{ROY M/aURb1Ώx4p(v]a*X%aqjUr/x^F}n'ڐS.1ȼ^v3}%߮T"igSqrᑎ0.!!Jm]F]kSkٳҙ/<"Ub vra+yGba{vmפפk_3SxEl.<%hthU޵ZµYh:`+W|8,qFc=1u !EoԠFqy}>]mz̔T\qtOne2h6t&͚7F=}uK JY6 X46<;?:. :j<t?zfi&'{C[Ow0Zkqa#FCQpȣ3#2@,jS݁@vN,t O#`h!bvj7.b&USUȪۓ)zEG!-R6|Gؽk$^kЗ`30?)a5·F2ځ I:GjP [?J#>* jmi2iZ^o5h1b8׍yT$}1+_XwCػ>hcׁъ{\I;UϥskFF:G-ڥ6-2kܳr5,!䲉 wH~`&´7pڴ ?yHEeDTA| qX*S)`]?9m}r[*}m@[1ڼy HxXJ-Y111+W%lQ 1C6mruu ܮԶm6lذjժ۟ecc'ݻ>عs'Z$5ڵkLٽ{7LMTemm 7hI3 ^~̙$V ?>˒%K.]l2?-a` 0իׯ_Or-x5F ~;`6l((ضU=== x%;!fy MhBh믋&4?/sE[ɟe,B]0vAS^лkUx'gZ.XY7f$( s$K f:&TF1y1 Arlhi:wuwuU});ݙ8)+pnsez<rȟ uZ{M;Y<>$EcDkk3iLjN2u *BgiRd@-y^_Ѝ5UCU=fqCI6FU\F_/+?ءB(#zM]#l7GvO* &/y w՗⊋giK&苙LEW%\̂diuZ?C"PrQg;կψF;5E"׊X3 +(ZQ31@͌SGhbU]nS^dȸ7y]~+7u&5kLB+| |NIjk,^~$  hH ȽKFj\/Ч_E6{ZbXt[֍t;&I̘fЏ̄<^P.։ ͑ƅME ^ _>99f{@z7zҥ!EлsBk%xR:c:!ZW}D][ЩgQlwؘv`,WM3m3%տxOxCH]#uʃt~}ͳ; "~A >#P^Eixy+B~'*7i ,RDNհ;ģ)ü[Z`uO3¹ݒƊZ0ӤVf f ߌVc8Xk@XD6~Tc;<sbvݹ"7 Xwl٪s _F~O>,"B`1!_LH,$.$+$l($|I{J~HC0AP߿(, 9 QAKJXxRE}hHkp\uM;0VԺ G>P[RbV[ ~"|'v9)rjzevc½7iOylO<[k)0kZK#!.Ҡ[홈Of0 _i*Ц1Tf"I^nxGLE@MJEO!%ܲxC"XwVDDLi͚5&`;D///0R޷oߎ;6mArr2Pfoooff<+V)m۶m߾s]vX[[RGvZ8p 33GOd8ߵyߙ`piv Y@P N(Ipn-8M@Qp4qqq`oІ hiFFơ)pݺuV:899-[ NV= ;#3G7`Ff?+jjjjj @[0MD^c&?tSt]8̅BA0#RQ[QSeGq L4-(vM-BEؘoתGZ44`]vDPNxdjd&ف1AK4`-iRrW~A33N* T\76Ȳ2i^!܈碈ɜ=&*z-zFV!.$ب hbRX<\8:8=:'Ǡ/ ~11S8JN}hvX!/(ʌ*+QQW.+,^[%NJUޣZN9% / zʚ̘lfHwT:Fl[ȵCb Xqj7n0Rr+#{hazةqjق̓CK`bķU`Is¯O2o+;:GLHGגǢFFsRYWC^|-x$-׋#qZVdQ9AFVȢ6bN bXkQZ̫JعXG4K$mM8Qگ)N#CG4+`A6@@m|/Ǯέ滔܋~B_øgH"*w);e(mZ6mFK 5?]LȍS)JF-i755m=jq.ꇑ:W,s_^}ԶQrn_R[WfDݒ!5Ҟ5⛶Cb{ԥsKF,0'-|i? p M'fFAz!&+%/ |r6w:Hּ9~jw|wÖU[V&G%&'&NLOMLߘu [7'nJK޴.ySj2aZʚ'mJX5vw[?(P@Z_QO=N s$]~p&'Dz'etg07C7-QK^x1+݄ǴD5 nj&$yjD\OȹV, ',sE1wk~\=d ]_L9TѢ&\fmĩ[l_0WlWW2s)/ؙۧmE)DmP!?$((hj+WWW~ZCIrr S\\Ǐ;v]vM/^^^ =NzxxƂvM81DžZV{upp&pJ@!))) #Gb~)NpLQFFvΝ@O0#eᮅx댌p/ gs\aaaxxpf7hմmx׬Y~}&!"U;mEU/`ˏ.\v¢!T ,sDn_OyE=:zHECJum#lێZ!$ش 6+o_Ê2ؓ2;26<12Nu`yXT``Z VY3Ǧ,ȷm<%VS!xFH^"aF*mNAȄ$1oE\=Z:f@6 mlpN`m1 n[5%=V` X3l ," -WX m};x=v5v8efU{|r6YDړ9>Yy.'?I$΢[bfag@!ppDDDpQ[|o_ohsb Mi~GE*\jMx`cxϝ ӳX=}ǖp}\&i1aK)ݽtu N '_}R$(T6xqqPK(z©JrnJK\I_#9vY˴5. DۨE d z- ~!~@y!M#%KD:ݰIįq쐘wl\:]*rcz=Y" 3tgѠJmE$\wBrPXwjh vI"BS[QC9 \F-Պ1b 0h >!'~# 'jmFUx Dg bfe/SSK2۾"+2wɰ2hMG}j:ϴiUU8E ĩ+ڒ8Gt|!y309DgxTv?׃}l_rnjV3f+5Bt$Ʃ-<nS|`ҍbx"_aaxԯ|,\9XB6|[ ^э?7^lvb#/lر|ij~Qj~6oOOt"W~߳Rqa!BpFFA#&<&&""\m@m>&X&(g%o+nr9l}!C?8Mξ}!Cro]s~砫C/܈׸IƦ]7ҷر 7qxG^}ا2jLz =-Ĥߟ`{8p+AX!7Sp;M8ta/VB" ']D.BfmϪcFfw3MZ6y.eap8$6xsvTX@Հ[kuO:L~FiyPVԵc,p^ Lc:Vf xgLk?7ҩASw;MLy#n 1 ]$طs^矦1e6ڸq?8%%(>===]]]^_>>()vJ>&xX-;N@i.kZ<~Ph 7#9nj*!3gӴnc昁̞32#3 5#E-ˬў"S[pkU cAʙ]n=pWwRaآe̢(vp qb{w3RR}:zwsQhͮ%4 O*upg9m|ŽxA_6H={yx5*x%%oՎXJVݨqijj<$˭[vX&Be N;%GCUư}>q`@ )KƸK@ŢQM?= =`oZ3j[:`{vy6д4ALS29CxyDlwTR^oR[cVN: l|,0U`u֟S{`xpx|/ۧ?iNgM3Z C=X9.nqdpj c=ŢXnc%>нݶ!Ȇ#>t[CK·|M>O긄N.…:ŠҐK߸)*j{?Fj~;Wy~})^Fu֫Y^#WzU%zUzUJzUz _0*zeiKNoPMyמ& n:Jv'*wkM}Oh!> `bLS[IC,>$c^Aabn@)ۧSy%B~%""WKwϔxW]!VuǴi@ehOhR&;f|xlݻy-<%"""@Q8dٲeoA~ժUW^fڵkzo)qtor+M)ʃVAbtttdddHHo7%8sW p(P-4~j-A!xiH<<<@ #ht?y 4F04@i-ׯ @.0ttt𣶶Bm3%߀K,}mOQ/x3*- jFZL t--c~1 }y Kh˷ْrs>w aI^aB/OnԵeŻn^sepv$$$$jȹ˪_-bq-C&Vuw<, LߋΎn[Mt)xj__{e3kQ0zS?PU#,K,TL=~b_-h\-xtk!plh>+ 84W鮈W${.rJ>H3l@T}Q픘v¦sHALĽVDujց6BvįV\%tmQ ]ĴaPD<!trsND}ߢ>[)IUǃ1O1LKc /%$pM$W3ȑs.>)y@`-Y{6F$Qp@]!qmLq6t6FQjeF4ۄ$q+ըdYJn~ЯZ7b5cv}zƴײIm]ǩ-YYh,<+/L*LyYef1`0eR9\1׏Q-{1^̰6 MN %*eJg][AOz~]^TӦsp` RwT4$.y&^'|) χB󅡸!Y>J G_?~|Νfff]v:u <i.\pσ;v&I8-9666+WLJJJNNGp ʉ-pv IMpj |EPx0%ޠiii)))WGFFߙ P@($ (i```ll ٭W8N@P| qW[ZZ^> >6cYtD/_qFfdښfdFqS[Y:E ddpjW7gLL<(^<ЖV634 -f:C(2I[POڷL "G1 qżaR<۔M$y\ѱi&6[ Ktet_>;,7h#_mh|5l[NpsU8\Iʁ*&Ul؞/L |QPߏ`R.=|Z|,^ ,M| 1Lyuu Lռe\/-/pج1mX/80,T[5ň_ث%!E$n W߂C!#v9ʹIU4;Ӈ$4cTg cҜ̛yIB͆;7@:/R[fffnnnAAAJ!:) ۺu͛-|=pf͚+W+Vw0l022rvvNMM=sɓ'GDD^=tѣGO:uҥ+W|嗗/_7WZ|򏉬pP(Q[!DEE!!!|[dž[@,--&&&[!H ZʟnǦSX|7Cp |}}A2pst::::<58NG200 h@=PoA! C@-&@= !:::)))%%h|hMniO?Am:sf7 ߀̝;Ŝ5k[@@mUӼ@tΦeo#~?]P=}y5ӗ=wH<t5萓G~2m=n{爋a7ypA'G|AsΧ6G99wr>|1 LsO쏛ڟ02?idgYA{6%J xYwsƹb<.~x !Z ̓9s%9\.KUMd[TkFC^OXk$A<@V"1/"$A5!v%8!N\E<8R Id YQϑ(^_#U<&%Yxdhl>4!cq ,h1CLGU cTyjX!*Bn1sJTj(]]x/j/ݜuGZ&mLF 5&rp>ObCy7bĔ֔Z̝M_[ر4uVd*Ibic]\\bbb>mSRRq-4c^XWWzʕ{쉋 |? 222233O8q…oɓiii>>>xE8-gggz /Zp tێnܔ}!nê5z@Pab4iXI===)EfpZ ',A{{{P#hGO` j[V?qDR-0@%0ܠ@gG32#3 5#F5k?o޼?n8 DQ[; Y ~%\!:zBv(;?bV{@ G;jDSM.V qj1vJ*vwUc%Kh*uvT3C_~‹z*\juR;1U۠K`-69 HJ^=LMz"$ɏRPbwb钹zݐc$6G K]e52!fR[XH c7D}`vY[HbWeL `vxpsx c<1b0&3dJm6e+C< aZ;̤m? b:t([T0 y>Eh@S8bRW˻L"w{T:'ͺy+b5Z2U8=GWJV^o>%q5; sK܅,"@;l3f84Ii~жn{%Bm6~TjXQh=\c/N5[5{Z 9NiYJmme[7d &F`dkͯ1os ]!=3_8e6-*-+@yN|S[wOs5^_1ew{shdSR!^! } M0ҩhi8 y?ǢJGۀi%wcənǗ%g9'rL>cp!K %X5.a@l¦-a1Bcv,;0f'1cz9s)S#+mdOҥOC]r%hPz>R6[\7Oض#g13R.(3aExW( y Ĝyb<6w(O2hZ։*$h0h $ Ozx*~)/{Ͱ- %]EuBjkV["āpP$ ~-J AE7y~o9lC;Ӳa44EW)@c2 Y.SY+2tXe UFhmjuZ:::5WҸŢϦX-p`rG]QFľmC:8[h;fM:2u e]蚌Iɡ9xcUԖG4Ib!;;$qz)::z:͛M×/_1{;xQ[۶m۵k׾}píOܹsW\YjHOHH 8H8P)~Î|%09:: nLeffN$&ʀ #innnbbLV #Ph&NOYͷpF fSh8<7 m #mMikkY[[;;;@hO4_[4OOO0R3ˢjkښ??Ĕt,mtS]":3]'/=L pqsoaqͤiK!X tA:cn?}1@ FTa]ڳ`"7H[ Y ye0E'GaM2y9fDM\9m%d܀Έރ2Q^kV Lu{>X+ JClAjm7DewѕkOw(=eme?шOd9*9NxT!a&M&GwYU"AEpO_PV܆ߠG$Z̹+<3 sW6Il[Q~Lk2*LeހX;MOW|;M=Ş-"q g wg>O"7(sի.Xb> tKe,*[ԧbaX*Ar R;d&33 iK#T [YhێY6aa/j8,a"= 3izdQ#bG C;bγu-&dq`s;8{;Ռ1ehD>!0k[1 ԣTyPt>Cx(3^Zv]Sik %yHD bMM)1酊8ټI|/I?3ͫxIV pC#'I @ahl:v6t@NWoXYƢ -e_$6}@g]w.$fŔLx7wҖ8#L^nϩtՐszO0k j 0;edg>5C՚̟ċFެ .%uV/ 2"Ԡ;aM-\yMsYX@![ y/#,^f_Ի'Xs,* @ {4Mm aZc0 .07Pl *7 ;q; nG o+fMP~Do@;u"mPAHL:B@/ߐ,$5⚒9ƽlC S`R-NWkﱬju+ ~R{uw.;xIƹ735d#g8< g>޳X#%;=޲WSw^ti6ڲ.kڬv9s[>ݰ=3eϱGYq@DƁ>=c挴۞GB!6ctȌZGEQ{QEc=ƨI0xhQhC`fuϮ뿆msrnr?>lַvW˔M~ܓsG΍KwZsƝ;vfؙu;ݶpն+-]mm+m[`ۺy6ٶ9{۶m;fn{3kێocGRRx bA_j 6R~ĮrJ[JP39b ZDmطir{4~t$=B=>_)hn]9 jjIm}k+&&fJoo︸?[= 5-xW]򉉉aaaC+`||5uP`#paoܸqqUG̖-[֭[t)]~'$$@h)S`t X:<>5kT6隀Pmړj\ 2;  &y  ݕg wS)IAQn?ؽ ]Tz H.dD7pBE8R^]_>m`J,2QSQM|TkW\BTk" X N\ʞC:hq"Ă\QeVfT&Ћ;VQOrkDhdh» {ADAߑ+.j46u铋kڦ[,}Fp} 6g]M5.|9V:fb eR{4>W@V5-6m=]ͮ}-:WG 4.:<0Q<0XkiIߡ/9ŧSi*hjz#zK)i+Tܷ rV2hP4h*gʘgnψ/,e[꩷SK1W黫>iA 63j.N/d٫_l+ͪ[ScVh#Ji.2`0w%a4u%3x "W-htE_#@%s;F"2*~*n`&M#\ٗ@90Gf__-tbS`) }di: t7. e SςO[wo`.Tj|`3@Y Hj@Z]|P[ 4Sr}r>Wj/lBg! [\=}P|g/=w}{ϕ?W;\seOOJ~Ǚej~4C wZвV;ftG{.dƙwnU<@^&GiZ"pҺRG7҇;11j.MҫubUx"v}{̾E̸=@uV\]Vwƽ[҇8[ھWVv=d^,o؟)l+T/TTd%YFj/aN{π3Whۈ$HQ+<(̹S&jkh |Y(iE£-)ݓӆQ)eD W7 ڹ[ҭr{~@쁉x۱ڃczQdH]-ښ h#m#ȏF>%&&ۃ&L@~D #P3f,[lҥl % ݽ#""L2Dm-Z(//oժU֭rڳgo߾zkΝ+x͒%Khj Z)88UfC vD'=VKy)))<5&< զP7,, MƇ%o 3/ _H~- mH[P,hڂB%!i8p۠e  ˰ S[ְS[B_s%[?(Iҝ5ݦJ*HjC-HxV9S qR"N6tYq݆D ܕxK ьGV]C3-Sn ؁kkV\ʞK=W6iٗ ]"zpJ<)cNKyUfyT1O] "ڀg6P;B@muΈPyRdKxf(w/TZr v҃EXBw@`)T 6'Sp̾Fͺ@ssBř;ܩOIc!5L/$Ҿ I .jՍ:q0;Ǧq}1bT^Jƕbq/ޡL~fIsʹIiOBUEyݏ5!\mZ{^']5*QCAmԧˆ=N]~4%}2gfgZhc02þ-ÿnvj :FL_1N-/#LM7"}먐 *|*Ⱦ [```9`A͏#`7`Iwו?3RD|xV lm_ `0[dDI*#nRkD CJH0ˍe2T"5H̤"Sـo,7R)9yɂ[cϮpi}x7fK7cǖ?--o-ƖKER0oBAWKU.ttw2p%s?-Yd |0X&x(v뾅7ތ8w+oy/As/{h垢om^usv)ڻ`׎M_{`w(^| %smkS\~ZƧײ_][tG-i&<. fVj̵V=@gJ:Tͨ\ T@+M(%5Ti 5seDr j\gEȜ|=tcZUhүMթtg+]{UN\=_e#T[U0 Im◕ |N{У]&O6L*hBYJ==ν\'ߑ+IlrҚilv\̞rZT>LI` ?'I{խ7f]ɾ?d.}'*]DL{OxY3Tޏ56q8 NmyrBARb!30(.hC>#sGRi#^Zs> jAjk@m-^xŊqtt Zt)ힴaP~vWW`oo?!zN>wWKBILL }עx hj+''gK,Y|9m[zzztXb~~?wرvZx1 6 е;xIFEEѹntC:" dʔ)1116mrpp#_-`t&x Oa* ezM`E322͛l2ڃ̮EV8U+j2SFŕ[X[僱l%V͏gK*x6OH_N%tL>*@4nY4KHZZ-6|]Obэ;C0!8B8҉z.j$Ȁu 8]!2Oc k!=r'ʘGڈpT*S}/GuO '5KlBm@XT \F6|MOLlR0{i//_6_4I 23s2Uգu5boYݥ&Em8Hl~[=JG}I=+x0|,7G 9n"2`"2d~V| v׀}]y4~`15 'pLGpD*=\+p.ä1hT֎Xfn\}32sfSoӱXt66fmڤ )gjmmjsvuɺRzSsCnjUeqYwI.Gұjt|4*GB qm*+-e ,M$fm+ηG˞ں$ n(L*ZI۰]jѥ-!״qT" )E"^Cֵ# # CJmm-/I.cUjhdCFmBA/A`6_cfC81?ߤf< }6\dή(_IEOsZDtJTGmuYF^rTW,XPA<ʨρ1VҦbv|҆_`+_5\2ɌrҲrg.}CY;Vk9p#`WO]w7O yRvG+U JA vק7i-N:  S ;ܮNU5~BRȱP{d=2BcXunE`c Xym= kJ#И8=' t)&|~l=Hm=w5(Uu~OxESo6r} Z=EKb|*qצ,̋9t.-g+K˜eĿ( oTfb9Kv+~" z!IN u? Xp=9 9լkQ{hR@P!hK2©tP}=[bSpà'ELֲ oPfg@jv|(Cll'|ܺD"#keAl ,1TNŖIZƗhR{Rʨ2":t%̓yD5ylW{alڥ.UxHʍQ drczDQdP7bJHc2xnѯQ[Q+~jC4U+-ۄz}]2 G5 Jm R[jJ<16>Hmt:cKAjKe nR۰E.,BGm Q jӬ-*Aj+}=M.:C.Jf# ?&ӎ B9Ϭsg\UMuÊGАZN+Dk{(dI"J_i|Yh5[!Nr9f}R> gq=kb!k9AfILCc_9Z2h6| n ֎,1.f NLd3J-4U./%3ub9G5ʰ 9 bg.w61:>zOE̸Nd<{,:M-Zr;A,X-|1l-<_O"! &N% \kA#| dy6ڢ_\[-§l.f5@4VBXa.(%jx>#F}z(gwPc"6uD%,3y)=M<EA=A=A֎$Y#uT` Sce KسI6ʫ! *Vb84jC*CCZ^PatTnSviܚ~UxS2>HՁzbjr`ɉ{sSRhcZ*%8u65XAGxh^[!H2˧ {鈥pJMu~nb}̬_aשroBq]j*|=`A@`%=v[sw , lp_|xIQuD L4@4 $0zTcCJ+r22bH1tCc*=lZ_h m7Zl9rGVNyx *dM"<=0yv螏Oe.D>Gޯ gEK~Z>=L<  FB]}IL$Ȭ|kQ⌑xx35y d,~(Imܡ D^A -<ۿ|{oojժ ,ZN9m7/,,br[x2''ܶm\b/_9mڴ!@:Nc:qF®a&y:YfEDD 5 -zj8PM6gsǎp˖-'gΜ gVV< @pyyyм*p}r\Ct}pR{a3j?2,j 'T,"& y!KB|"]]{4hĵst|b`u=1'~yV^m5sʫ| g($~{Ҫ]hQ$={qvI Olf2j[L=#𣞵}.^~By͵bo֖,K17@UdZ9}ڒb,kکQ*uk&Omx6mvFmkT,ͫ~b~Uߓ˙n ,1{L&`,LWC+&1ex\%O #[Ԍ`VƧYָt]Q(JԕATr dc߂o< ,i`>`w`4cfZ<|_ n3P ,ħE* +ysD~tw%;s,?"#\C3Vy-9Ղr_m)5RTb!X3 m $ZBU?BɅx bej905<{Ƚ;Gs/h]@sgEgEg >H}Apbc)0N9\Oe_-_߃yݫRmWсuh=:N{ҹ_f'[JJ!KpF=#ў1^i@cqxtt8؉,TlY5haѨpV`c]Az4S~u DTHv)PR$Q5xXjUKfjxR4ˌVc;Ȉ ^9")O(iH;@;*}Q3zdf1:){aݔ~`oe@@ =)В J\żRr-UR:wKjbxFĽ j0&Ȣ|uYKp]I ^YZ}Xpx ޱ85|ehYj 2D4'hI XhM8EFȺOЍ:th/@Mqe`|yex=.`abۚ}RT4t$xB}8 De&D, Om;i%.5_2V}eУE#.[Cl]yDrHb(?W7'eOЭ[?nտ+ >?>>>t+WYYY/+-sj155uѢEtLb~~;S{ Ι3gܹ ,?ԩSaCwA>4EW<O>NEgܲe˦M/ݟ򑑑6L^ͻZ!F [{m111Pٳg@ g͚tׯ[jk.'B;n5+V@q]ר-Z8A4 H;ZQ-8갰0 ˰ S[ְS[@?q<?ô*cu(!$Qt^$hR+U%OiYyNf&6nju [DXOY tq{x@cm`>nӍ:P^ıGԭvԺ,[qܫRNg9u5TȴHzB/i@kJ"$? ShjIST#<oרE_AjZgujKm %MQVGm=o-JGmӊ:LTGm6JRd#m$pa+^ 8ѵTh=T%$'v`nW׈@QY' zV;< cD< IBkЩvqa =w}'N:z}u}MU;I%n%+1EubnuG}c{#ߝܴR{29/w| s ՛H3 OK0؇4UQrQGG v.|ɯP[5?=TĜvQ1<{ȾO/F'?A^&W1rMm},ONf^s/SslmB$&zJ&6*} 9?M.>A鲱[ Az)Ha8ȀQ  `.Zt +GFaqtՆ!!*G؉/z p9R'6Zp۹5NVK>IA4[PmF$$dƍ{o){{ɓ'oׯ_jժn]]]sssL1wܜ9s̞=;+++###==~6T KLJJ|Gۺu+Zfffvv6kk3f̈Jr'=-A3߫P%KXbڵ7o 6uCC%&&!.`#Cш4G[\tP}:d NႚO6θ;&9sYy9iҤ-sٲeݻք pp*/^ MyңqPC8F2H6a7\0,g~o?:>nw3#?/ɮ칗K6Ll#%LkO퟾gq\ /\- W2 DO1DE5ę%f$^节k30;ߗ%RU<]HujHmV3-B&")7MmUa|ܦ6Ըuܚp>}:Run\snd%j'KdWH^r/_\#>QTW@Ԡuox>$>D'cڈuy\ЫϯRYGwc̞)Z垒.#fO-/4իBҳ]ځ逺6~LD+ǽXZOwn{jS[ o=&_{ZwXz ˹HB(蒺uܛ~ MmR1661 }ʼE̸GS#JՉJEd*fR!~ ͺ̓m~K:tnY%`b%d_pS0VpŶ:Rb@W~"0H\ɀ$r#"cl4:A*; Yɻю1D(em] )-M|$L~΋8m& uxz$U?g顝cX@/$K e-қIVS/k>q zሪIL2f#\Pn)=xMmkQvB6S~,җEp_ۢa!4U UJ#+1ex)Ǘb+4njAV1 @P=*AIگH~LM/*" u"@e ѯ{ ӮlQ4iH`6 Ckj2ҵ2k=g:бpR .snwдڔ2M|:E)r;ّ: ѠAHX5{H1x|bs\2#LGm& Jfǻ֑ ZG(RSʂ.=e+ t] Z(Ҡ?%'JP!nl9In9]vE9$J NVhgN`3@4AFbjx%Pg"ᘉ;^fW2@>I$VG踬AǭɃS`"$3 ;[2~ayǩC7oES[7o޾}{NNW ӧO_`ڵky i,:clgƍ֭[rn1t=Erss̙9c xL[x-Z`k111իW ʫٳ)Ν;yHڇjȗ7((6BNjM ہJBA;_ځZ^u=Ϩ(:C>HXS'===á񓓓aSpp%5awP8$hI&a>>>۩S[x>lϞ=p(hޘHg` Y{2/Pw&LEDDoB+އ62,05,~c?3Ŭvx̢ܲ$Ψވ9.E[Tkv+!P>oƓIʤ~eHyd |}|u|9K.%)/аFԛ6QDOn"jA=55xP3cUTx#]z("I?؉i< Nt iq8urz5!)v=Ό\k[,ZU_aLeԇ.(TO̺JfUaeTs*:F(JLuz,)JKZ.йxu c)De\ZmH-R3r< }YS-AGdяE?`yjgshUkh*S m<6+g[ F/0\6ܴt{.]MK} &ܗL0Jz!(c 5&֝dcH/1JpnMЁ9D+|~5yk{t ]zMu_Z%hzDb;UnC+GX]buyqM~U#!rvg<\PrK;sޡӉ*@LT̔~ xpeI0$vLf]Y (n7bf>66vW.wғwuxqCeEznpGFbD4"Y#^}5O*SH3!iOu.m.V- &Z= Uoj^B >}26ڧq(%23*CC#U Ֆ<ԖC8(]nܥu:h.*.[ԣU6 kaբ*YD*̐u/Aj D@}!8 '8dT Yo;ٍ@>GثvQ9CJ.[ʫIߠ}Y$9wB~ K >Wl85x]tGHSMBl['͌%$$DEEA5C62,~ԖeX ϩ[ J4u/v'K\䏁Tb2fw`\ǭQw/2~X7ĽrMv{JV=Vv̈́J^Uگ\t$.; +Hjk{mKj !@kԖDl&qUjc& Uj H*'cڈRm+:{j'= NY5GIv ޴bjv"Gzhcn WYװYoe%? NhBYws8UjkVſ'US[MںEwWWͷD>sT:bJ4K&Lxb.[үZ^?'{Gxr6.O܍+-. 2U]蜓xar3C?r4#.`dl9N@>4=y{Օ6E{o""*5111u)iM3{t 0Pws!)>~>̝{yϹ9?={ffԣƅŚyjPd_oLLTu8GVIoN~kfM՜/ȞZ1pdiJ:¸ >,beA&\o9% D C;@4"=FWQ6d"+`-ID\9YOSN22Wɔrӥt.+Usi\G0aǐS,Dݢ 8e$AGE,YhO)cv$G$RqMhbb[($Cmk @} bאsX!Qi!-1Ƨg_e`z,r.y˦D_;ZƱDQP VZuM6ZQ:$WC#NvQQEL6b% ZrQbK$Ʊ8>մ=8GJ։SΈrAxO(JDI^l߁ _-ЛN]SέJooUu$~B[M17(oEN4uZ+djlL|2tB[а:/+V+s`! NJ2YyIľI*|I7)3WRTF)O2C?ON=T9>C}NW?78˥ΒaaxЯ]pɇ&SkJlW:pj$pBj{"W>A,t뜬ؘz& Wj qw G˿5ְ;ڌRXF&WѬjE5k we.uUAUyV"n}}=m?P}bqٝDyx:yi+9h뇷׾?qO#_;?~eMA2_kؚ$RwkZwRjTx\!tP-\)RtVk _[ax <x;wAVp4Ճ):0Ur"^^Jܵ0!xBu s^ȳݽA#nf[qͥGx?D}VݦM 7"r 7Xs?j;.ŬW/f% 9p8Zx; Mnr ZAŕk'\FzĊTL$ԓƢ(nf5iq;a^7N#DnGekzȯS$g]7_`.ΏrAAXfPb3F2QmLd;AuRȪ~%ѹ4JI{;xJijifQXi,X O%<圸癅gg%e'UpVa_Vj,aoY uXL:4'j ?`S^]LWgqO6qQgN&#C44 (?]0ќT0++kf–"<-Ͽwhfׯ_8LԽN\PF~5;nP>88 4{g͚ܷ.]zjsQAAeΝ;c ̙lCWw@cƚwF Q0aeׇf6 ֬YuVh!2ȡ nkYpzZxf\emq߳v#SGT¥~6aתbwUŐV2-t/|?C~j*Uԑ4k.rڂ.VD^ǒOc+ K 7^mf&.qeaӿEPx,mI\%v6k{~jNAH ʸm5P5*.}hk!b:>Ff]7d]NsɄf"ΔآTJd].%̬nB :!S~T3΁P*hH):wCZ%EȇQ}N=pXT:;.=,o%"RT:ޕ]g"ʓw=ec R ̾ CNrXٯi4EA37^d X[E;hj:._I.sUM#z 2+xWnQF6)cSz w}lhWFΐ4m]#m&F\#Z+&;TPet&[`Nm1ϼA/3MЖB<"q O3C["ߢ-2V_:.z-hFxTN +O6l=]Rժy=6]d1ڔVJͺ2):/ډ%%穕}j&]laEbZJT2-tt?Q85YOMvddua/h1e+wٽ0/<'7٧>!Oi+;}vAwx@uiq/ߡ;dV7 y5.UT>Ua:y6D{_) o"+`E&S2kAr !YDLVl2KK ERMd&D@'z+Fc9&ҁVt-Z&[mdBWQpT"X{(Rg4 Z:1 D@8 D\% 6 6COS;SLrkҩ_ۦ6$%Ϭ<5=X]_EW<83ch]x]z]9ú he ZW=U$r* -d Bz aYpIf"䀒j m Hܔ(0@S!9|DUN AmGqRk+3[ӨKe5J@hҭ!P8Kݒ*'P wO&oY1/Y2,]`,8y ZǸY*Sz>O)_zG 7oŋv-8w޼yϟw;ׂk׮={Խ?)(::`sΙ3'''WK7-Ж?*03.e̙(0,, ;MLLKQ>y丅8Oxx8!%%6M JeҥF^ +FAa1#ͅ[8>GOp A)s2ӭߘ{#ׯ_ʶlr_r38f=TsBJ8'u͸% ߠ2.֛Sߛuwζm5ok~"v]bvE%qâ'_zC1ƾ*/.~ '?X1|y:{Pa-*ml)(Ox ڋ8f%" L|<+m5+j7׈jMlUF}OY@)jҎeVHƷQU,bRkdL6 /ZT$בmjz]ꝕ6f/egN"`C[cԊ2(^# RzȥΝZMA8KLO͕ lu >,G~mހFJ?fϧ̃_1[2kK敨pޒvnaPSlSe?9w1e̫ghT~ 3J9$0!Pd;hq HS ~(xU#F:4-fOKĶa[֠kVOMу)H>d&)Ze-%#d, ӂm0 =#w)t9牅G5?է24@| p_ 9kPh87BE[.2DDshKV6lt|s0*>K l]K/›`|s}k8Xue`~ >j m MҔMug0]`C{] Gp1' %<`F ` dc'Dk ਗ4 8(lY\ቆ9W .D̻J+UϪLnL^NLy Q-(RvYls˒dɜdd>d޵d_`_`y` q鶲y C4rh4^p-[MP >v$W%OX|mn 4(չ6c-)~MlLH;.3L]*і-Sr媳YԌkrom In a+k\*"䓠J5PLU1~"Ofp~BEPPA~n٫_[\>S$fj*<&Ƅ0ɈC$z Fj,Xt.77stV{݋y<,*08qN1o3-I8N㑿^mo{V;/$~]_QNM֧U+ rF=^uLZ#AZcϡ-O:ܘpȺLgV~n8M/F-'2q ]Sw3:y{]Cשg#_Cġ'L##-U׈9eՊް\jYհͯ2z]@.R `>Z1/{3^^'7lȻ l.H@hkxˀqR\Q?IrRȝ# BP;+tJpR\'q v:bh SB7ɤ&U)J2bDL%3I940#׫K . N+BVhv(DC[lT'c 7=Z s)`nݚF}\qb jC`aX܃## l<5jY-w†Uy}[$ ꐄZtC܋ |et8͕6Vp8`fCƉ$>ƭhŠ1Yr\& S7qh㓍d'ȩK%]n&&Ti%l6]5 vvJ]9u|{҂hs 4𸂉\-`b@(:r51<'xyh4V˖hkm%&&.X`͚5ȯh W ۺuOk!dFDEQ/3Bx99|E.U!!!>>>t ʅnθ[Fb>p#ܒ 3nfǭ4hgƨ \e̙YbevϟdɒիWo޼^ɰ 6̩Q!E .]˖-۲e˞={PIGx"} ~rg!ѭ_kvѢE;w5*wFlkݺuah8Qyyyp쨶oeѸmEoqڂe@zo6\Wmv?4?j8%v;SX.wEK->_͆%/K2bK>ֿA= <6ʾVSX6^P~!=_~Z~[vA_SG]*1f+^f}8O?G 0!Ѝu7Ԓ L1Xx]|^X̢BAP -\rYt-*cg4ѭFAKYB UvBV1eX4^(*w;A]#_V#0Wڌ*X.uNlh YTLͮ%gjwٸZ` 4:Z* oX1h7PzjqK$SL׭A7 ypj_C%%UX 5Ԛɘ^:W|" 1:w7 VP{dVWM4}ţS!#`zzLۙ :ݧNX/Hhn>/¸r˧dW3 2cfpl@dȽ]EMt6}P p&}rQcʕǔ|uM.S%ޕNTx i%QL9uN~**ÜSbv=R_wZcݑǜ3\02,6$^"WWgeK+^WpY<ZI2ITKw2UI~WUVVu2FXթ'®^ {"QaQ<,wz^x"wFԋuOyHQ.}]M{ ;4KoP?0A+tts 9%Dv)9YdV xP]DȀG$鱱lQƨ"sYp]v_juǘҦSɔz؞j]]CB9y{]3f;ȗIB&5ىz󟉧?1:B@ҳʈJmF*FZ+I' &UIЖfciըKduS~ ]iȨ%h۵01)}󠀵20&s䗂YU m -INWqD>ރJox^b9LzK#Ϻi29 {NobɄjInMJ'RhoI LR; ʼ;U rcu2,"#kѲț 9t\\hL %Ѻ._.ΐTJp$$fg`7`1 As{$h.`gbiK[9w5U=uMAmA®.QH8s$GاļRt&95c&pP?4:)O9Rh ` Vl92$k\9و_qC&.2lkj".>8-v'Q&7R+ʒd[, .Z !PHse_F<iƼ[R,-WT̚ & :ts_jweWlj-nF;SۉqF" Vp]1uþ_dSYxJ(s(e4D asR߁ ߀إgJEQ& .6./EDF9qEĕDPKUOyC|UX42H$ڥVx P.KNƼ.9:@h vۘh}0*;hj6E7bZMlҐ;|]"A[aʥr8{bC)X'%d4٘Ԉhɹ7ecŌ "rKh959*TXtM;ia֧ʅVP*Ag7*Lu6,Xx]y]v-coF dݲii 0Iw!Hk-5uufLh9QFhc#:AR =qG]+w2]S$ds3cmMT^{Ґ]gC[~T QE{Yzvfzm3mL5A[Qmk7Fhk1hS3C[_5\ kz=$C[ʞ{іzbb Ͻ}}hF[DϏz{87)]qWϿ^#?OG_\qqʳĂb*Ų L 1^hqhK3b6JӠ޻hҋܫ*OmvC /8d'G\zMXl.qqˬ0GMoÿ\es$APD3RSaBSp8潦ꃛ 12\" O˿c7| !-t~<rodA6uVp>ovyW攻 wcZڛ#:Z:CA=n>!M&wU044pPNrEJLC -!e&WQKIeP2Xj I[=VTׄz$\:٨19daGWHMF< J:<.{c Q2TjMO&5Vj &2x\Qyu<֚4y f@OhRں>_tʭBFn̙Z_RY JGVXX[ (J\c?gΜ ݗxa_XD[:9Wbb"܂2hW ZB QCQAe aQ]@Qfxq`%KZjӦM;vxG?sȳkzN1iii-|E~mh{q .~߾'|^yk֬Y|ܹsQ*x4v'f\emq?~+zN_ρ@Q7| – e{?*ioc=)GEPD^JM .,PxΪHUeAac.i F}m2OdUKAEͶ3`ɏ.O̷FlRO`t΂R[*S-r< c}{A\͝`}L=6sLx# d\4ًL^b£Du-;jf9kf7̆3ԢS~ϟWl!xobAS qb.݃>_5Jmt;pgj"X$Zɨ~Kr`+<:!qwK"~t)O* m A.{6x.~ZZSR uɿI圤5)c )3OÓĘatp1O+yIuø{ lbA)vv1\e 19Lyp:<`= QpWjӴ6:'j,*~9BiP%4Q7@~: sX%FYخ N4b5\zY.& Ɇt!p|Zs M=*z6Iν-%n9*mz)ΐPowͮhKcdߕ]mʈJ}īE) |s?QkϜ.y%ܐL!GVBa+Ҫ!NBD%9|YsC}E}CQ l6~iug- RIb-mƮy磯򪎆j69#lxuugּ+':@hK'u.Sk~_o;V375O ^|}O3oOM?ǦݟpZyZtgfW BL~øBڙ@Փ1D.*I/eMMXodM-'&#n#a5'_f_|~s%3yڪ(uk 퉇ulxsgU2vԄ*%K ڢKxϿjwοyN_'soy|bviF-DŶL =P{K镀[ d)<"-9"aŔWMum&]l>ӂGѺLd?@$e&5FptF W ФpdqHclţ,xK"UM2s~   Orlg5HCy#QVv` 0e-3$8379S̲#캯fd&&%3fvI`2$ApP۷o/5Ѹ moqڂm}$*<9>(Z{>oEP*@m\l{f]6 ?&|Z>t(굱w1eT:YOߥ:A[;?x{vݹޅ~8ͤGLZb*6'eNf67P_P>~Ǭ T2,0~f`}1{(aEJ3KL`YlVq-n\_:5PecO`y5l:2HXbSWtE7{FNO?% hu2(9ʮ>,4w0!T-&s) x s4&I&΀})fo291ϼ<)A"+f =n6"Q{lI[dC̃wFeL3sQ_xA@!ptoYp[e(;zFzPOK׷4F57Gz_A6qw tR K.R`i c|q%wɋL~ UL4ciUd]C|!9Y) vz3moQDV2ZtQu:E‡Fі #E?W/:0Ж -\?!V95f%Zvu.qj 5-f^E]–/oaGhvjMkB[T-9ܻ]Ͼ>ϽE5[TV M#MEhPOj@5&&Mj1EwC0!RM%&❓{=ZѥYgUmyڣ۩/V~,4^/Mև;蔡gp,iii\g ǵaÆu7VS~M6mR3cqq5.TwD"}U~38y P/uG>um \RO`y=%~NTf}E~R{sX4Oi˯BQcgGMЃ0{_f^؎4Jc[LB=/CDpiP1+;toUCil ?օv 5DVm4x1jؖoTv͇m1.P$!UŤ^fr.mTx)UM(L۞h{!BY0%3Hӷ02oł*Ɣ&eH U6v28]>do>.?=wXC[pUc1 Wv_1π%-߶+Ҽcov:\0^79Wdx-zN\U:BbM$3UU ,NP@5&KfKA9Oäܤstv>Ln!.q^ck2zK:TVҳDi4+kV^*<j쉽ۓ0Rw`UB Z;.<[u>}:M/gg^*\k[j+S '_rmeZH8dB9 +>ޢ 벯Omľx^pݔwӊG\&]!P&zCKObK/jһP7d;sKl[F]&W;!PhSƒZi6PulN+uu4 j.8S Zڞicxy⟔{Ix/[͓:5H.N䤆o8ķN&h#O'Zū9zaٟ-x<>SGX\.ϼxgv |< xeς_O}v} 6Ko9 KQ~C&O)&5xfAgVDw1!lD7ԯVx%.~{ІjNwz%^Av,Wq=Pk P*e6rcw +_4Cbk h"c+ר'_[Pb6Aa1R8rY&6k[!J+)&XCN1(XF:AxqYpA0 4QtưnQ͚oUo>.^yv[V]C*WqYw}thwL&DL\^}RQxޛM1udz:fČq1Scţ%,2 sʒ9k\Kj+a%@N '#R|ViV+ujԮr\ᢐ:+%N!GՀ^n;Xec*M`[D(nk/F[Ѩk!Úؘ .َ1QE7o<"{UPTMR"x>9@ .?L$*pLoc1gX_295c2?lʙ,8\;*Xbְ=C=mTGGU 5> @A)z*^:la>K0m&L<3IW* AԂo؍LD͡Z*ؐ]R(&r:ġPu Cma{E Q 9'IJA@P9Ϙ8Ǚ1όiԙ1G̨-iչ|ޙ{} ^U]u>Tuy</Kg]ȭOÛ$xn6Md:WPfKvgC{KS& JUx[ƁvdK<޷H|ߠW(ATe)4V ֲrSm^aݿikn/,Ԗ YHFj_Zz v 찮*#%Lyn<yGk8޺˿_, iwTH%UUncީO=05.3ԯHKowS[Ɓҵ{f^ݺ?s3\,a028 ̿Omg=~A24GjQj!jԖoЎh1 Zvͽ/_LU(&<[YWw񻮞~NfY͒nN&LʧFpyQwh#j * 碕tV<(ʯһ?AB4jOr->mAȫF)O>xμ@q`Fztv, iENY2S*j2OS3HתFl Ӽ }koQD}R`OP2@st]KiX!5 5* JGM@P\ T{(N:A@-݄ĴgK~WQ?'X|9)klố5~';4L#xD]_]k  Zո? |Yo]~JWn' (E& @L*$c 1f) [^:$ rSe _{ψgqu@j1gΐC~!q!58n3xpMлrEZ3=/\<_zxcUV[nڵ=rעi BNE'lϟq/r۶m7oްa7̙3#FHIIIKKsWDDDrrӗ.]|S?>111:::44SuB3f@iӦeddL<>̒%K̙3eʔqA0 zưQF/kǏ?|0 gvKܹ;VXdd$~ȑZ`:Do|!Ϛ73b}x3CPӎpplBŒu9T5< kg sP[=#=V#VLaeUTMy0a2o|r~ϸIL' O5 G?ĜƦ]R`)pp"q"b//3Β w_|ZZwx*d[_;8Jjw1ZDF]vp?ysf\i^ՌJħּ s.nNceƼWx.C$ۘ4.bΙ`N6nMfyym랗8l<$is>yP|VxG~qI7wNRi.8Zs--fFSPb>zzMDDVGVEVFGUDUEEbް*5L\ Md9bhָԪ}Ty'Iׄ3. ^Ϧħfi&ã?ф,4#GΠe'ЊԢGĸ:Q뫖+e&rDi.VY 1EVҪAStO.!):mzC~-3$oqS+@jMa@Eraof ֟~Ν;/VZȿd߾}μͮtof[,;D (ͥŋW^{۷R 0Y݂FƏNgO'Ȃ6WX=Ξ={ʔ)tby*!!L0ܹs͛7|:tI&;c ¢'?~ȑC}kÜ~W;vҚC]vfat,4y-0 C:ӔMm=fddbk׮8{ZZ%D`h,tyh-cHKh'O:u?I]}hس,顶zϥV3>6[ȻX 'bRoʧDR{Cթr#>˺e˫R񕷛V"bmp9P{=DR/bW&5ڔbYs2)8<67ۤߴt8q; "˶p-@e.t]vp=g O?AcQa|E"F'0_3E\Oz 4R܌*.U#}KONLQ%EvJ  :.haj}'eB9UvP63; ,WV**rm dϢEǩUg?Vtj@W#^IËuwIqDP;X++mB]C;-4KK xzkXeUCl*%L2@9u`2[gS|VT+zԔE^l;A*S4}_R$]NbyW*ϳY֭Mֵ"¶*_دRY10ce>"qsys>__ׂOc,L6`&18?\LU$|sA|6v}VWəɹQ ΢%ЂKh54ʸ&>BrPJvO;1K3:j ۪)5iOɹDުE%"wXH ßn/ᆾj~{s5D NHVlKW [+8|3xu_/8Kf i yXsa|?)-AIS_κ$sA9WsB4Z~ sI g.SPR^>N݆9Hb6C܍-Sh&FøjOs[u'b{wJC tr*Vn < 6_cKls fKƦ<ȓdX/K[*JЭNzѹP\G)yǼDjGe`轖u7 $yIeh=ˢ =#r[j+s׭쿢a+ S͏ xZ9Kf,xCP$>PF]u֥vij9|A f5|2F~uȋM7 Zʣr!st9dS;; 3W+y aQ`1zH599U㨬l5Զm2;Ji!f*x1!\uUjM*ݮ/v~^kc*6IyB%gɥT0/Vq_}Ha0 زLU6yØgmc^ 8X gKu9c5k d!o䑀ĢB{@^}x=֠t!"Fc]U&~ 2njz=|.wNփe]ĹGK(fzP1 <.#)6n4/{o<``3 >do&c+ LABﵕߥZO;?, (懽VGibs O䇺[T54* h-&A,jur%ݜĢ?iVQWg4~.BM~HcWQK]Lz+ekYTY(Q1/?NGu5`%s]Zus÷Ͽv~-{і54l"*$i؜g͉cr+ՎՔqmٮ%'$+}N+ymm>6A돡?Utk?R˗. @Ϫk(Gʒ)j"`,(& bVB*.;4(J浺 " ՔλpoֺP5Xl[NZO.9 exp2Zϒ֋1zW»N]&Մ6\T BK!J=ճ٤{3Ҍ\(ң^U!>be`DZ /T,PGQŚ m`ѹ"JL$Xvlx ;Աsi׈K#1BkrQ77K>YgbaȪa-oSO{y¾2#u~MoB<wlV嚠""~h·(Bavd/@tVm?"^tG}X˳V@a'[,eB3D#駕*E@Yg. [IޛLLgý :jN[CՆ'6FL0$&NNc{K sd'Ԃ`+WYv翢7w<<<ã BGd-pLPfqqqiii{&&&Zj4սLd%էMvT ?cƌ7B8hѢ3gN4if͢>RsA5b-`7( ^V97r,K-5E^?aKNkǝP/;|͡gƷPE1e#ҘJ{"5Q{.^WMZ;TTL( _Ĉ{Ԅ˺uNZogKQ,T+l҃Ezא>G-@3$QUǾb㖫njz0P)2Lf>1DDXU_6 F)(-G4n o{{pĖ'kU:+_ap~mGPe![%U¹!]EJ)ʩQ'<%^F< #_+FHGbbE~gk~d9 \  Hk%f>,O. W{ҕq[2.a{~_p9,&OMEa.Z|PҹQ ⽎RƵYZ>TyIr2%5:U;tiN p{|?VaWVh8FB١&ݦ-ā/$WǼ v3' 708,{=UYY絟3n.Ɩ083}i>ז;9\, d0uܦCS[]wjX:Ct". iH&Eh }vMHZ ZAbϺEש]R6)GLz&K|&I|&J|&L|&H|֕S\~B./!#i؇i:2u̸1\SԾ'ުV}zJ2]7rmєpƿ*~6uww&]hs[v37֡JОߢ?zj H>(3̓lb86f K[& .G9(-v]ߡoQk@(HZ5ȷIhVd9_nQpRMpv$S7&J}L<ƿ£*"J!".f ӵQ^y|US[eruP2BX) ZzBLVz6VSpLpwZԀf+UrePa+Rak:u£-e 9ر!<];wVo(HJ\IOLU$ G<;jb~^>r#d"o3 aR.M~04ޕڀw:V=ߍ6:,e fru1ۗKHTjpGPNkmOy*k|nmb.@)7QˌqQ;Pd*cIXX䭹칙@_{] אV!! jȸuี3 5֐F>ِn+Հq jB/SNcsln6l翢ٳgV;M.<==#""`7٭#G™'fdd̜9[`ҥK FP֭oٲeƍVϘ1cĈfhy Ae˖ݻv={6u }@sV\ ֬YN:a„n{A =y??;vȑ# iݹs'\aBK,PfRSS̙^m%T]v\\ڵk_JB_~J >`I&ViiiFZuڴi`0MmA0Yt1z[F:1$$*i> ImSC58P[7Gz_.Om112wYdJf.f<`}E#߲|@{Àve QcOTs=U^Z^/!UTksiS5aCJSnBqs&ǵRpOj m]no>yOX`U 9?S+9" | QJ%9RV[{fo7=揬UW8JKELd)]8xSOɖ/LjrʴKaUOyQz#F-~ e<&^Qх 9>P V""9L1Rc [z{WsL23 'T[) rXz3l=4noa \_aU:1RY6ʷT1U$2k{Ű[Y-f#Vʡt,E4vJC'!'fQ/U1T,/˥Y̗ڴk^"g^F` Y<-G\#r*IUfW֫VHYO>nɬLݡŻB[ܞ 4eF+GZ2N>RɭjzgΫ\l1T8H*4t5hzjN] e}x(ӥCM&lԺIkL5FjV?uU?gېV])rR~-?Pnh1T1RĢ|ȠR2#Nee"eUT k8b3̜ikϱzlc)<لGօ+ /g)WR,XʕxFXD_;M(%K:6(%WcTq[XikHiKHIKֈܘn㶔mt_~I4W3eTߓ[N(V5fG^Ž-z^pi.ޞuңs3UZ vNX|]9=K}UUg0Ԛl.NR,@Ԏ i-:|9 A~ldQԮkI-dLlƗ6=*xd&nejUrMS|bQXuS[Gv}3υ-Ao =VY +UT1:wC<VS̩MС#^|ҖmطT\c3l*\nrwP-ytmŝ0 Ŕ%FZ^}lomkrhnuawxV ˰by|Tvt"Rlms4YLFTE/ml6a]ZbHʾwnԸE1LOwoMZo=jD4)"ZTo/B Uo#^te S_XP ,ӥ)T*eajLLT5Puic1#݁>dfoSV!1^>5n\85oHˠR(4{cz}_R[~ի׭[q+JHH/yA;wid)))III:7jԨ`ooo''&M͙3g…K. f͊꾾#FZԸqQk֬Y|9TSL֠-:֝oR[~4ю[~ݻׯ_re˖uW0( ʬ]N Oa3gΜnHYƕCKU?~jhgoHҽNܠv>C,X >56 '5K=r>%*ԭX6Y##O6Χl7;_<&( {J&'%ju'iv}v^"9Y(TbP+B9 (+4!lʃEyC,-,s1LWB /$B̢Keȥ Ĭrf<ã XcVhJ7x{f}m`'nT9~i^WoX* )ьx/T3ݩsUˡ\C3H8S(Y_ Q-^xm]jRб]0/-S+ CvjFMȵyQDp=T^l'8E>OQE4w4Z|-h;&XVpn3mb_O6ҀT> A1Q KfXQ196ADF%N'/l~Q/ywPmj r5݌+Ĭ y\Pͻ)+L(G׶4:58p[8^pկ;#<3he3e_iJ/ե9+&Ėptxhxv^ʹw||cO x`ݎًvEj\OiU Ժ E}ef],P[*ؖRiv_hh^K@m{7zՌ\:N|P1uEuy(S9zbʟUӟ ;GVp]6VGtD*2O oQ%JI@Чo ?jĔ%@VB`z0(r. _f˓uHK16́9Iʡ<܎r묡P2X$>qRmۛ[:0j?$*}nm".Iuԗlm1R 0psƍ#kt~d@9=0i9 @( ֒>M*7Гi+nMi}TUMun#sxI?)m*1nP TtTp*j*My&l&#F>^h!W~ ]a; 8 t/3TCTC862^xz =C-X}3G+GGO?$/ß2eĉhϟ谰0 +8c^ ҼެYΝp%K,XczHHHDDTǙ3225A73{xx[4~A&Op얛TֱcǾ\BSݙiM$===6o 2gXώ[`իW4wii-z Hj1F ^f tA\}֭[mh^Ӂ=A+ PD)=i 硵{x򁁁/m%: |d俤 :gY#=򯡶o@ȿ\k/`yOmH$2s3y݀ v{]1eي_j޿`^f0o2Z&2Jp+13Pl\MLĜ?Sf)T)p<-% LXf^&g\U?F&'ݢ2RnQSQHם/pM;6 jɩbҼ d^Z^KWR0?K.{N1uq/1yMk?\O%uȨ j{]0ra5/V\ҡ®22"zVԻQ"u`Β:jدJ䗫S(Q$Ip{@eG]SPyVJ>YRĩ%AW =fhL-Yi&^a^}4NyJSSs.e g }ep2L/F19=/x1ߏD͌R[Tf/\/Y/݋eJ3nضN:ZB4(& ~-?؂_LGדPN8*Fujbttg : EAˮWЬhh/h) jŏu+/&=ŗBMC;,#M]?M}?eD- ۗw1EcnI2N+޾:\큎j)IguFz~P IYb'M k@Ñp,z /ElD2nY͒i;S Z"ꆵT8,ɼފ֭N->- J~栤\V2K"8CZP1J3t;4"xڐOgץI9f.ZGqWY?iW#w_}Y: UGt5ǿA^e*aw4m亗0Jyڔ;(69O[$ =m2k&id2LZST2+L2=K/03 f.c" Lh!ZDb+tRt R|mF(,}dfR3IR2g!ʕ;:TCHf% RL4~d~BB<:Ȭ9p&[փMxt,ҷ0z?VQP0G5*ܹ#͛}Ⱦ`رEg]yG8.qK)LTWOk=`D|WeC c @m3Y Ҁ [3Ч} [ ^+s_foo? QQQ#Gv٢-(^ %%%%''O:uƌs 2mڴ枞~~~AAAaaaPHLL# 񌌌իW٨>fM(  #Mёs(ݡL``DŽG־}֯_Z J_P~ٲe[lݻy t!㖏Ԃ'"4ut;n׬Y#]jՊ+h?10<tuAM6A[n~h4F33ZtssXjϞ=$I;u"B?{uQ-{N\,zGzjGs(; ?[y Lo'sxjszQ)f`MA!G9_6]Ug|E\kj0Z)}^[S'eW%^}JjGR+rd]4ҊIŽFG׈)YD bُT}2>5ROܥݽU >hUkeځRDNH.eߥqt.UZ *Wjy𹥹AO xS٧(RI xJFPE|ϔ1yX_61,t.{+Qn Yյys.%ʑKfsҮYHBL2vb\6J]9T"ܢY̦<`q K̩RP.W"_dt- un;[밓UJM۫1e5cPΧ .'^"<$ǽ$G!TKCS[[7@!&s\=5R7 -:NMY7ʩXaAx( )Qa^"e[ya[v8>fռu_d꾼s͗ڈGڥiV9 %:|]q=Ԯ-9BEh*5Y {n IDl>1 M( klwmiw葯bejc"s/փ_m-NʖqeV spD\#nqGS[( Ho$7͛N͝Z;vŔSnbQlNY,)}&y9a= Η Z=08cf3.6sm9Ss `]^ W./Wq.Mv(܍M[]JP(iO{hu4w44Z~ڸܵE 9Kƨaxw'{9o?Oh10p\{^")6+l/ciiFDC_]c7E5B- ͢/%|Z|cqt6N~/N.*]{d>gpEvoرI4UJPTts :1u]:QW@N`m {*ΰ"^x$ZOE|n&R[ն\cV%}hmIyXȷ R[Q"imYj_ҕ'K,"[i8^H)7fjvSp#y:;\1胻Wzo_->ͽ?P[+h+CL@Y @E0MCƭh'a a*1Fx-or@m+7_@mmٲe۶mk֬ysȘQFEDD1v/ SL>}:Tw\@@ԥ<&Lڥjʕtŋ̙AoJBct… ?gu hk.ht`hdΞ={AsA[,YBGn|][`O8qSN{۷o޼yÆ ֭[v-{3fXhT?> -1ȬYk%''0(0ȪU- IGU҉@?Zc+/HP[=V?"...֑1n &17fgzcf-|ݹ泺U`&~uK|&z!)h(SW֏`\4(Tx]<vFΪj v?c+YI7~\tʻT}[3a=u29$) @9GgF1Qǜ:PTTDDPrli:+u/73{{ϹyyzW* cw=SGY6@7zS59>Mc.ܡ2 {Iy=+aYD-rzf]zzE$BRjϵ/đ4rVr%rv!ͧt!.3(>b@´8C=O/lZ[UÚI 32&Yw ׿)sv} Kc;L`U.eg*.;!'UA;_J6,(;T|1kVA7Luf+2=H`)v-\3^0v &&@TZƮNkSOڴ+Wk+HE,?3ޥ}_>EydN.GگEnV+/y}O33HO_Es^ҬDI:@:=X&|*]!ھ5LƄZu8NCYq'>9JTw8T}sᕴs&5-ϗ RV:m#"W;Zg"Xk,Qp{[z *dIƲ ,!8 K,!KNٳH"_|jс#)j-vڪ*Q[C+a1"3tU,{%:d ͟cᮩeHOS[{.( P=M35kt.E# ⯂dFJݧ޾M%%IM>H\ }&iR[:c-z8 V +fme3.x{IgCqWC{k=tcWЈ<a|Y}J=]g>(T 8@sgS7N?Y|gKĿEk)V`8Xv-G,ndn}`Igm+]?Fpeh⯁`mpLG)#g`S/X+ 7 "5ەFRYՖ@Kڇ7kC> 1Wt.jaLާV\2PP>֪Tlx|{- ͗໲Hm zh%=t{dwRݝRv]. b -YRd[wCDj _VBDžk6i"盈ʪ y=]@)@ 0 0h0. مtW=I  UB `3(]ZzC:ZP-(%:)) m(#JwsN,l/$l'>nkkk˿H1wS:_ڊw@t?\ZjCd?pbg?1cIkޜ ;6gObJW5 )-vVĨZxq< ;n=kզʋ=4\2-A,{bݓK[5M}t_<_{Wp [rF?x><6чb)TKzq|wV0'ͶъjZSxRۧ`ڂYYN\ҏEov<,a[=hTBUKտ;Wʜ["W`֨(Wkć 7wMpQGڶiLԖ,Reƭ4 RͬUNK0KO3)w@\k?/$m!pMy3c^O[ 6f߁`mϗsߴl C *'fc.**7 ؔDҽAi]"uX;ś67,yS5qxQܜ%n\˩f}vO&}@ҾZ}[jq&9͵;;NmQPEԄ,yx^̤soߵ^k^ڬ6&ҚxaCIbaχ?kNa6y]TRAVi BSLJ/._\JY.ٙAcLRORԏ4.3gE0$Fbx.`Xz cGbl ғB_ǹcP opGeC&;$*]H6!<0֌C7Qlں}e(tt^ram;o躖_6nӾbaԊ3 Xv8Vk~ ?MgKc^FV9\sg3Hlj241.xVw3Ďp{DxW}pƳh1+|Yq~5;h b%89 R/+gg2~?)?.tm7k[6lXj*ҹq ]Yr&%3L\;P^f.ty SхJsRnQTi ھ2N 60 L9X[jT\Q-JQܢ&[@@ҩ-kifʂOFjm/:#t1fU{e( 5r;mpڍ1Ȍ Y}ԷziOj0 10sX+cmK `3^n]tښ` xc&胁zHY_SZC韨9՚6x-kl ˪V`]2gݰ}KeяOHb$R6oP>N fm%vW?9aqA1Y,yU㥓/4O(H9)C9(֖ߋߧJ4CyM~`jHB³4NwAIa$lReOnO^-ZvM?w܌W=ҵsp`C5rXKi>=RWkF <[L9~Qoj+!-ԡg%ꉨRߪaM\&g!,hց]õS~ !)C ė2wX:j-? #cf܏WV ƾ7뀏9$XFrxOv >*YmaYjKOrXnɤUϋ!͛)&ڒX702f`SNN.}I47ޒMˏԭ9X kOMn<,\K#5Gʣ`uul ll9l߾jZ `!bg`s0>Ly &?1`0ސS)] B`zP.!lU~M=LFK.iT$oX495]sp~èOlMy-? H޵?G<\ ׸H&' r3Q[FK:* lNs %EGP&# abw‚†qqq(%Ke… (5aHH!::z̙qtwrrQ`+VXnw}!="#m۶uP[ӧOqqqkAQa gϞC!o o>c 8a…@]pucƌD̐'2DEEuD#"B .Zpt8o}6և>)WWWxwN&;S:.&&&K"4,Mg ] ҲC~fǥfτ8ɞlՕlijtnZHK2=Ո:LSW1k[ԉ%NR"w7A zC}ńkrTģ͡qv]ؕ)BWv%k{Kz:c-ָ4m,Y}92r@xPRx*˷1>YGF a/x3nՌSm7s /$s( #LpC"u Oy,QϳpY>l^+=}]HmZq_ ؅u96-qק ވ:jvJI?@'j Em 0aӓ-ZC[v ZBL2IJ:Dm4QQQ|}};La[kko-"11 >e˖-_|s̙9siӐ`DDDll,|^]!ńG`vvv*<,%%eժU7n" IMME2QM6! .dp?n˒%Kbbbr`P3P5km۶#G?~_~A.+ ʁ3 , cƌWu!{d(t w~Ν;2ᜑPIXr[vtJtR[V?"2XN#j>1c+-f:Ȏ;O5.ԯ]niӏrvז|3謁oӯщ3f_ذ#qsp/>riż7rï>OЌ"³Ҡi~c;\T.pV*)ޑSQ132T6nk@=1!S>"R7 fQ:/B%eᯙ̜c`z!r]LV'QeJB3hgiǾd[wݗ E(DXEPLzBT}#^ 0ا`b=;Le"9 Ua|=,u iCXN%1,ܮNn&%bǬ WLp²BRqȣsψ 2- oZkdWY,USU;&8AE=!&JF-".}RؗZai6+1@Lo"=%&%VTj.h.ft**cʁJjcJ7:M3n^DCm\dwi%;O5Tm.sU ]| 5JJK#,!JTӟ%yLM4Y'.ݛ衺/fuf,)Tq1b-FC~bT=#1-Y=Q!?Mmzݴ9עŦr`QmmذFƪX *W+ rsYe9ÞO[w)忨!" b?l vtMIDS(FkpFo&l,W7bjZǝ.߭J[=5 emQo&,V [TE퓯M`=c&>&'?TއE-D„풓䲟Kh^ƾV׎xJ<3TP)ըQn&W !S2jFCnϒj]»vʘĴtH:}}\s+gqXoD& 5  'J̦, %QY0?[n =ϢTG6j A$&KR#V}m+Yʿtr XgFNL? V]D,^3@VmȮ+} Ux~bF^w`xP%J+xkmpqVrPW)]oJܹU4l`s bqɤz. i5[V;4[l&p)!<C>[d}WQJQ /D+D(Xp"KiQʸsDõ]494+bgfTӏ1){k=#[;jYGəcEra+iʡkkkKj=/ /HMw)'.bE/K܋_vl{6߳vC~#`mL8݀{݀{_12WbLHx O1RGm /b|tΉMr5mJk!j+&l[*WƑ3lC y<SG\"w)Qsjpp+cnznYƹ ׸Ig$)T]{4Ej-r#2&K^3-{MB˶x7]g8ǟإړ= .~ۮwT< >R"jDv%- M n*ftxV> 36fab-{;vIݪ8I:/ǖQgs(໣``m>Si׺.yhp` S[ƺRP.ƶVPvԸkJH"35%T}_31riyqʳ©/x6;p8fWjKl[۱,}ҪE56hed?M1h+[LKP@)4la:=?JψOя5jcQ3n 7Yw bB4ȇjd* Uӕl$z+}2vȡ̫hBWOG=`8F0*p`r|#*?:Gk5;xz`[Nh`l46m QC;^LmK̼g҉9/:GnY#un/MVOn]*=O5_o5CkEa` Su6J Wc ~pÀ00+E:uWXߤXYY}篸o?So]ܸqQGw{"~kemm 넅Vi:x $%%JLLٳW˗/{{SL tpp DžWdlu;9s9sؒ%KXyЋ/F^eYf֭[ W;c`3f̈s7<:+"Z6RDT7k,DmA jkÆ ֭!`l۶mȪ ) u!ۭ'. N>D8wS:OmMw@t?\ ul6<{m퐇;..EEFlfGž%|>.rV!7 =͞qW3B󥉿GBL޸zJ&^"V׎'>@zfAby|9P34;A-;B^^}BOdߤcHvD1WZc "+P<0yzٯTra)l11~Vx#!d/j\EG'b3 _Z: B%gesiSr\!9p¨Td> 6r =7{~bS:"̈́ogG|Cu{/ڞi?JW5I\:jۖ,N+N]匫TRKB qcćhbxƒ#7oVYilpӓQԸZִܾѡm}X C:@3Vc_uQeBYrklW>(+2-Aˈ ͙4"KgY mjkxժ&ϱ 7D`87K6F1Pqh[q9f!xEn_Lz ƷVEYUw TnA{w!v=A x<,$e0^2IU!sض}hVWIqu;^mQqʝSgb̹m#ۚl"B*bd](E7AVh،*\|s@P| & {j6rzړ4j."ϧ.Ρ$13%0\\o` 0 G >~ DyvK2w Q[Ph,3Øi:ڮr*JI2ޔnkZBLszjrimϚM{~Rl>۾8)?7 ,bj 嶚5 PJKUV,Lo tc.BBlRaST a[+'&$oQIW9ybxNL͒G~W]8-x^JayaH1Ci"; zL,8V B}B=@:`2o@TC` T[m j3@glZơv3࠯p |XOUْz7C Y=;ݩ]]]n le``kQ10N윮7]Ȳ ֌л";a0`^:jKC5@?Hmu_ IkR _wx#;6((lT(׷Z[[#%j„ BTӧO2eɓkB… -Zǻ9vG Fn}FBԖ"X&MΚ5kC84!!oa 5N/&Z .#CZڂs7nT$ Cdx- 61cv8-WXaԩR[P9p9pn?æMlmm;n_n[6Yz5|"P'BJWx? \>Ng g;|w:S:NjS=7|W?D_%ٳ!V٧%Aؐf {@(3W̱DX!s:ez[dyI|"} H/Mv{CuIsPuM]U v5QX . U NDQDlT8$ V9/b )^le=eN''c񷈘DxAJOrYz;_J+|P\ߟbAFߧc_c/gFmA9e֜}VxPe2 E(U}rJLC%jcڸrͥ4( ʥA/,qSƚ"TSj=ͮqgnJ$]UnVY4heZKڄMZ5 3̈́iPYLKj nhnhQ[uGR~6c G: >FI7tUrb&f57 jV]i!h|gўaH ċ,.fo;gӹ ]8FC#aB ߠ㵈1 çc9XGmvaeL K3uVt$^6Uy%<ώF 8G  R W'XVZLew5(/q˩ z™tC42'zfw{3; ^[g+`J|Gm$L9FAU-9{b]Gg[+T+2TѪ1UkzAh=5dO ezLo3X|>p=s $R[ץl2:\n$27̝8 Bjvfߏ̖S̲ AaowA ;X cf3#0,Dwx XrXo_`ffJfO/ brAl'ԧo4 -U,+hWcXH 1 @ 3٪ aφ妵,B'I7"aRO0_s_Pz=Dn ]nBW*/Q Xj קY4'bc%RƸ3^o>3*opocYU_Cfa}+}+}+s ko VXyc10x)Wo~10/&[~詣4N=Q}ƫxNIIYfڢ:WƦ#Z1,,,$$d̘1GFyݝQ>o[:.** WȞjIII񱱱pΘ1-YZȼ n-fGb# 'U&=cbbNl` V(AY /^[W aȹ[J .*88z!^ NN/Pհք#.l DžSSS{ȑGp2m۶}Kmڵkڵ , 7oF--(  0$|w:StJågϞrI7QJ_GGdf.':|c oHnG^d>c;C 5&Msc{īױVU.ݫٺ|Jr2φ׿Ȭ:}8Eor6yƓەKoN|!kQOXO 蹗ɤ%īD}2&ll>YzV0KZtʕm9qk?>RF%sK-i_C8({Vh.Rs3 &* Fn% 06AoQɀ\ڿViK>tQ׷{AT5j{xB( }!MBaQҁvmFIz-":H̢#˵n4Gq4QYddRe"_jGըfϏgq]%Xvl3Gf*7;׫lKimGЧI`PPjg m۹e-yEw yU(gɏ#1 AʹE-cϢjH& :"7W{Xm"`<Ãjqg}(cꉁꏎh'eh^_h yES=i31=j+UTܯT/Ӹ* ivIzu"GO,"=PUSe& bP¥XZRwfmeȱ%|w϶͡HݫP:@[ö{~ }[qiGA|䌭iVo$a~>j o DNN)]AXQ[-$~"C>œ'0b"~p%#<0EoeGcYXx !}Vۙ#Gb:vk4|2$3$𿧶Zj[RF!QmDpUP5p5Z B<0kP{&g{QK*׭a1RKORˏѫ~7`ev v믩 "+VyUɜ$6\7XWBy{Q>0~;/~,@3D$KrPI!ZA9y-Px2p?[`yNvo 8nf'WRj/,֜[>8A}hf>CSԲ7a2qwL-fM:=>5v|ըr[̶Uf*m/ FMj/\| gF`wP[ `/`w%8gզ ҅颩oy!.mC }%mb:]ʥB.{ X`}JRnUՍ*FwË4WZTֹ䵌F>M{ ,C۠#`- z5M#UL, n饳 H=OPWA2gص ^8g[Fp0p1 ~g9܎uH[dGbWO[荲|[31 oe:jKKeڂ4K_ISkַVUbQE%''DEE!gԨQ>>>fƏ {={6 ϝ;vZd+55 6OLL?>lRilllJ;8f̘'"s#d$8g}D^pȇBaͰ04dh=xE$cBtȇUspRL&NV@ ad~K=a};w8pWD}f(v\`)))o3vdi*PX{87~LHH@1;_NNj֭g^'6!9-;Riuē]!gL|HwDةDs$߰-_m]3q7a_K4c1{=Tao1{յO,ؐ"{""({11-jL3UhwQQGD7 f6Ô=37o9s>g=ﳟk2{&B_'f wdWYW \WP&v $h;TUnƐ<~{Tܤkf:ri&_wy fbڷsUr)ؙ`a]V"6t:\g~Ah2=U7&J(^\9Ő0\;3GH2? NX L擧 _ɞ|~Ȭ}>H+ܴ\R(\z͂>5OSJLs#?Px*t@L(-$*b зuX JY-vo[wvjr+ЄC~B+Byk8Yh*nضP6IHOЃΏ]r[gM2ŴţR}-Wt4>J|!>U=6.ʱ ,f8rOi̯Fτ\fsr `pD5;)(*_1Yt4-g|XW5Qr+U Vm*W_'S;-A"zUwWE]AlYD] tNxNx%zB[ԤvkDUmSP`S50n[2@PjHd&ΓUB#qY7uθVdtEo1WJP`) xːV kjW4KD֝M#T@Ԭʺ޵/=tŤKYg腿~d|n:n`ڻ?vImyڈb*B#5J]" Lm$LR{bU_oS|^پ](zkǴ3_^dg_ag\c`n1h3s{"J"{]&Vk˩JUSg1 ٭:ڄW`~`Wh Lf{5c^ fζbFQ wT{baY+5-LhQUאFpnjdpGe൬}+i`~BN%tǟъWQ)O0ThsX/PYvh,q xz};^C`0j v͆ nj(LZ6'j@YD=-)ԆjB ԡвNzWm9 sō!~}ߣC+YA80\OjP|>Z[ڲS[Ct;5;դs>wi-F_l(ve˖͟? L%%%a?%'VLL ;v, 1IO2;q-_|`^kժUiiip\~=\_d 6%8C X{"skf0 Ev\֨Q pkԩ>NPP'$$Xa^V:`PKb^ ż길Th0 .ܾ}={Сlìd޽n?pӦM09`Z\ [`!n `a8;wz?S[3[z?C_FFF=j 签 yoIV >qa Bs҉hm-lQ"I8#͒%> M4|US҆RqڄteBU7%#2hVXf\R3fG £ԊKt67vת~!f|AoWb. c+ĖȈ4I ʜ.4 2\=D#ߣ4V+2nF$0#6 .Wys7W)\-2!f-]#u mS$@ g8E`%wIRsAY~;GeP^*W'; 5Om,TtfҖeXoRȘP8nf};} ޶oJ&Qj0/-f3>GRG 1ͻ)vI)SQ,ˇ+TC>EQw" !e]"2oܫX[bnIvfDb.)PTPޕJ w)˦ēܒ@QUwIu.HTW.n0f>ɟ7{X@6Y!y ":.c(Մvֈ&0>2rH¾+|jdk"(2ʷXτ52ғ TZJm*1ZJS t.k-ivR=L&13#ۈȵnum!(u@X.FN o$]*HלbUt!NuTt cz^%~%^ΣfQy>OHFzxi?Gڵ  KQ.ڸqE0!IC)LHHt c \ fx˖-ĉwh[zK/KmjkРA{lg~bG򗯦TιO<Ώ\#KIl@!$ X FF0%r*^j)rC腆{+I |QpAc1#MɤE5#2%͂";e*c/g|Zszkjw3zX= M 6W%-9O{yaqyPFE Pѹ}Abr .65eN߰o_gv#HMHg@! ZhEր*_LkTQԨl~oB.rI9k g \I?q+ZK<2߯m~]IrXSNa,aVžۇݷJ(t -$=:5nʄώЌLۦR74QeF򒁏%cwELy,PԹ6uyVt{w6 5YFU9v*@عtUB΂N2&=9oC6YP`Lo#h9FGu\4 DDc<=C:-5;8iKi*Ƴ<^/٨L͎IK'):B˺RrߺRt8Qe>怒fvX{Fa݊x#@gԊғ`qjz-!w܅ .[lժUׯ߼yR}1"x5kVddɓgϞ N>Z8+c P-000((7`9>>>q _vB#¹q4"tXBLc!}h hWq uZ )$M6܈Ν;w޽}v.** o Tذa&̧aj {ja-?} /I泥^j-2СCOP[?zd/]~<e^`@`Nxf~-Hdw~UkxJEdaLؿM0H! qʤ]eR5R x@ŝg\xJys fQnƯ۷tdu PH`}62Id j'l|>VD7bVU*xXJ<{1qSע3MOljܚ21qKȀ6~C{xB9D._dT_il|ЗWפ9ݧvPM9Y&;|W|N6)=nknnk/l,.r[<;n9vm$Ǎz%)#,##t|sDl&j%mrtv޹ޯtCMRIw5]fM6.bϠzwhãL[tCNrDld7iZGI]c6Mc%SM eo)b>vZS+tabr\Rf=4歴uƺZX3rr5E+ ;e(q]p]xFPv4t6{+W'?T設g3_("/Qڐ\2, o36%CXk%ȷ4<NdW_Y-kA'y-=EL uT #x<.\1cdzuLW!ȇzEp:U# cdQ*@Iz h7BD)Zb3iyĢCj)"Ze6M= r:k*(}W3v/-qw/;j.|&LGWjվU*Z;Kb_tP֣Ek+՘SZuƤCkD;`&a>߮Z|t.ݞCVÎÇ;u?:NӤ_kv^<rwٽ}'fyz-'vijwh!l۫FJ ^( 1"fJJ/[3nRS.Y7PZ:% -W]O^\s#rlFv-Ȧi v-M͵E6OGHn8>Xz Fk5ࡥ<^Nkȧ``kpEoG/&OBADԖk4\Omt;e >f?O6>]P[b B[Xl@paLb0apn3f̞={޼y ,Xt)NM'-C3gBnnnSkCh; '!!!X ùnQ`' 0a\[p\h0w\8=3&''CMMM-ͨLc!z̕a?N7l0׿;yf c;mfvaR O8; / O!z,aup#|z?/S[s[z? effLm]ch ݗzL*oh`XqIE"(wgLI`XV4Xc|>w0lhˈRj}{dAm:C%jBmWKޤSsNi\UaSf]2,G.'қ|Uٔ2\Mp=ێ-7G\CsYNx g?X~nɧBۀo{N򺂳̞2oW*2fpw ujmzoh ;nqfuث¬*!gCpBYN;IK!Z6Qzo_SУ0a»Te^ry_U?RIU$7KmIu2[a-_3.E]lZ-st6ev/ڐuH:[mE h!Z3B&4 +8'L<>qc8Z֭b=_Q|ftV ܠ:]rxگk) $j*[37:'_g;Өvw׵:I+zˤ% .[#de-ɀ,ȗs#nWx2JQ[TLQ<Ny8ϣx ~hS ?Mx/|0{f9zͤ2ʯIN Kk̻MύUnښaS^XKpE9 Zx ͺh L{9}at}hI[ fL?l^uA3:*XT'wS TnjZ{ MXS["i3vjdҶDZ۵FQTp]==$OQ,X^j04qcPɸMd6g]Z8]`L i~gv y><^ Ga9(8Gg %( Wn";bzX1\L!h쨲(znA38TAxhZwZCxh^:~yIzjk>%bw+PP=;VσH6Z͟~\8l`F턆]wݿOmIpc-` 33GY #֟g Iߤ֢E,Y|իWcjkΜ98q޼yP3881..5իTka1S.^LZb ,0eF Mܗv]-;eL mB,̟x-LAMp.g֭[lٰaêU.] `za?ٳg8w$8ç3l8,M^ \)~KmKmR[_ڲEm]x߲xjW|{ Q@\'o~//5QVc&cdeO]u=Rɠ*xҺV]K _y4/צ%2ziZQUe.lɑ먭kkʯL*VFpG=[kfͷ )\627:;f>/,6]g&w}]ȫ:U (zd1ߠ&F}TvX[оYh!zۧ{;>a}mKRNr?B6nej?C{LJdL̷mX4"u-gf'g.?9hT;q:^Ejjqv1e_L. PȆRoE{ /P9թ\Kj[3DaT@wM@Ak겗t-i{;1 y-4AziUggpU@YPiYȪ.n jVIx̌ťfrJΫ!ZMYϧL#4g_0@.ظAP^jՑLb:7!$pZhT" ȧBa=$m*ʾtCMbm[ЪIq0Iy=aUOBؠul:UiM(Q}ud%w"[GfO#̖/ϝ3)ʌZVwƫ)446 ] wֻRY#p(ڵ5w67vAzjfYrUj0FgPLm7'y$Or0$i)5U'EQsVc4Q<ʇG-V,8£>ᑇx{d,9 Z~-fBa\0:N*`hAl83&=6!O^xUiijƳ<j ȹ 9%$2ACek-֎8ժ+Uޯy,j#MtWnOhXy( d D< ׵Sqwa!k ܅]c PξE`?G{@G13g4PB)X wf%a0R23T&6UŦ9=CWNR;@{?~_n[,b|IĈ$ƄbZ!z'.k%IIvՂuRȎ,BmIR-j@j7D)oL+!!!;vf͚~j [~~~sΝ={Y05uTLpF 1oza/\pɒ%X:-Z>P-)) 7oSA- tuuŹ1O-[&\ׯ]vʕ`vXHC4"4i+=?[#\  N =cLvنj`ϦM BY #1͠m_P[b^ σuxoZ}672ҶoIK/ ZRyS@]u_i[rI_-M^"|] T)jyvv=IrzgbmsyuVA3Np]2YՌ[.fX8='kn<hEvh>NƦ`5'6wsIҋэ}9-Tv5pN{J. .+-7 ,%&=ƭB& .rQvAS]]Z7no3 \2$p(:S-"v&_f6K:5|&mʳ|xI23u" #Q.bF#h\xN: FҾS9ks.&t;wZ6/Ix$I̒ľjܞpc2T.RVui^O:>`t1(, hͷ^y__Z^%|_ӲH>+bdW۲ <37v\Nm&Ȍ݃4εZrSعnXi/n3n7!MY_:vm&1\dz -~č -Pt?U&f&^- ƱYkOP j'ʼlZ EPS܂mYV/ Q%l@ֱH.ʿFP/t Z0?DMJR 䎲Ho n0wPy"yaѾ:z-=C | *5EE;<2\GmC;Z3Gl'LmA ^p+;㗗L%eN;naaopiYg` {>EPhVq^y?kNK.3a2\h5 t`( ?>8v}5{r0vf`` & X{ FڍL)4PѥUUU2HoМ6Oˮ-zw֔?zzӟ3Z)]v+Ne0}bzfl(1z.}<4PGm)wZn[<%a :|pﯻ 8o޼9s̚5 ]䄄XCL&|p0#mH8m4hZ6.\xb,5c b )N4iјZaaa8 8+]0 cay,1u zW\n:>c00H`!<< ySWMvQ|`1_|%K`lٲ{n()Ƈ)))E>C7 `.4C5|a !$&&BG,tcIؼy ~.zKo饶zDmFF{/aYm%iCX JҺƴihkS¡t,n0-";Ջ̋*byW((v:M;~ xiIg=,Ȧf[Dr"vۚ dSHT36eivWnq΍c &=),2QTp PLTus6I%aZy؁ט)5nZw kT{ؽ_oGw~^a˃T΀ cv bESݤD+yW1v1n]R(AMZzse+*ֳ a߾H&䛔Puȅ%t@#rG&8m`"۪V@Z&x_DӓZ;]JDLj"1i.mUD9 ( ks);쳴Bζ)J9tBx]|OgDcܱJ  ; atn6߳~|||xY :%{vڵ*uXTu@Zu%=BX>F8/]l2z<_U u7 ggً+v8@)bG&7iVڿ4j'g}ϭ;E~B~Cq{( ^"\q# ? Qi6#MόCOMy{V*5JȦJZ] CnT;h<^i L.!MC_-]poYU{cǥ/w|2UKXXcWJd17[jb~Nw\f]rPa!l!ޕk!y4LzӜ\c9Ʈ[~{K"a ViCH ?>E6epsE\p)i:QX aUjG3 4E}C?Jy(oq[:Mô71bż?Fg&O#2q^J %F5'fXmAZ6wM {ཾHmx{{TܧN 0:,#0GaH ,\Zî_/_aÆŋCdxg8!BAAA+C C?bĐ͚Pƍ.ZhŊk֬Yj՛aSL0Xà  qt얛<-}B,pnG&\t)XD?L#T܂6v>o0`!X ³X˖-۶m۹s޽{<~.zKo饶zDmf ijJ|)^of4LmRv3*< JÕk|uiWD:7v  3@6|xu񤟋ff6 j\Ԩ,2:6GxACIδKnV>,:,=, /kq{vc#?#ِB&ř7e dU^"6~Ees,esUtOq!,i1kZ [m1UxvE`wn)vIwiu%plP;4(c̚Tk.Hg^͒55\aRr8dćht}fZp/ߩ'ܘ62];s;6\)XJ?#xes[r;ûohm:ǿț2=%Q3P\wpe͋摊!-ґ:Ezs&p8-GWV @ \unXj'y]NL~!3uM^vYܨRڷF\5GUgurgUSڇniOF gܨ'iPvIb6jLKۇ|wI2d\0"KTT9;B;="cRd":]>z.9̔ecfѦ*5Z2ַ.s9y@IТ/__H.05 p|<ZQ=V؉<}%g C)P#Gc Z(Ĉ|B5ĨAB=؋V]nJ"UG=VM%坫xML=-oT]+h!3O (AW-r Z`V[z̸T)woSo&Lx$OT~WRUjj+6g7z?BK~V6|ɽs۱ۻ; gJl]* ĂpW*}tD{ͺS%ճo'?_bJTOUWCPV҅xx۱}-%9eψq` .7)s !?E:ekh94[SWL\+E{LIK`m{]k}KąvjT86] kXwЖ(L4+EY4ڵRGl QU4V W : b'%,| PxDbhg,];vFsAUTŅ$>GqГj4*WWְ;'ޡ)-X 'Dx~-X9%v,,U4F̽2oy>zZ&qzv+A/'F陮=6ѭd7%EԚwٚ?I_Rx n+eQj߹ obB||~g Dm9::&''&O b-䄩-{{{UqDha [{ݺuU̙ FXZ1P73 `&wW39)&`ĉq NfX" @#16`6Cx曺[P|}}?3fa0^fxcccǍ5gϞ 5a͛aƎ 6$qW+4n#3`mƍmkqСwy=}jkzKo' j+ x">vMUQpt&=OɈDp^HnS¡!FfEq2Ĵ`-@!r;J.-T3]sj>Tܯy}jdL,*+,KH_OyλRNEмtvoqYv HZνWYWHlVu  o4VC>Cφr.)g}ϬC~B+u\?YdG1bL 66RsE(}AG?k2&d_W2-`?Qx\0NqSXV2J摓xHyDV9:; _dl_+s*aXs>a_O'vF5vac%9˽˾FM-(:&7ƔVEU<8/ pQSBI"OdL]6s3Lmi`!+E|۝)-Quuun-q&Q; N"C^# (R#PRPةumy]Щi;+(y?V;6fb1!@vʸ:ɽ~|ǐXDW\ 4~ MC^xZ>d_:Ĭ=F/9ku]qD4}[^Z6ʳMF{|fE n0m-ybayׯ-S&Ϸ]X$}`ʷ45CG 5>^2֙O= J7Ql:N{8DjMyBS* `Fp|L}B4? ˾]@a?Jm=Ѱ6ߺuܹv{owָq||||}}qtPVVV< mFDD` 77cb1y,ꎥڡhapoBBBTTTHHt5BRR\]jծ]0񕒒cpܳitم~vkB;!܋T8<>3gΜ?ŋ/_f͚yad^0G3 f0 tY;gV7-Zn*4c53#²y=k;հK,1I"7[d@hp% `ׯ_}W_}m렁2Pjk7Q[u/]. L{^8)/W~%2.]IuS6M}! ?0!߱D_3vRJ?+i+ÿ"F9?λߘz5zϯҜ|ej$QHzv*;·o,&IT&G%mFR~h6cvKщotR GkGv"ˆ^U(NOB(GKu6rҪݵ VNjgwv:+>PnnLTfY=INDW{RZ-5eCuayN%aJG^rT(F$T NHKT)\kU m1b;Yt5}FcCYMؽEԏf qf\ GZi,B\Tܶ0ضA3.r,O/|ʽC"WY5KX,s3dܦRY1 I&T!"fcyP9?ӧ-ƶ2^""qBZ2)0R(pX io{ޣ_IxWй{G5(} [E(Eb$2vE-&sTxlEk.7K,ZK}6=8/ c_o*`[NNΊ+/ 0|0{ڴip/G〱p`;ęk*F5-'{w,Ynݶmٳ{_}p U)3`lA:R$դp)SI mFjC9<Մ-z;p l:G]egª$={fvCUX^ /ׄvkvJ%6ԺP]lix{;>`7vN0ylF3Џk}[))הFJCӞؒ܊|aKJ0 ٸO'$"\XHWSbv;_3[InBmEFhRk}Ia]^Bk4vЪVue]a2 SJuVgCXݢΓ)ѳ]NB.8!!F+dvOr8ٴTOY7ѭri= ,SowźtmH)WE8CY,h+qZ*+h( @;r{l u2rN5L63v=96<0PhWϿiyMNQ_ܽ_\ch2vR 5 T6ݡـZS@"#-:>Qۖ!CNIgss1'"0z4[un-/5{rÐ~T7|jcTJU%Re$i5QJ* 3;[:;Cf*wJc:E,U@MMjj͹p5^Bk)m w L7̚OջBww;_PGɋF5x5454-p X oe|߅la{5q 摠p|Ο??==|0 .&gv-[!@/"h gˆ`t 쎓PZ8®~Vw|6d ZXf|ͷzmS?iӦ}^^2Pjk7Q[ j qp[ī>-9S`S#q)i[\7+ ~։ ץ2iEM1["EMV.Ǵ hTGE-ұM|m :4sZ[6\5_\[{w O0K!ұg3Ng~CYyɘy}J{0nSHU6]2nMi^j_ѫ15$mEoIWi?0+itE4q/էXp-4N<%J?ǗK})VzM&#D}ObY_az%EmY7'JUi{C4F -Ln鰨z( nGCHZkTf7P9{^z2B3vȡuBa|Y {/jcďmoz'bHӠtke- =e{( Km‘n11Ybj<\x\k慯uʹ7IGi( vƭҍ<1μ.0=0L|@O,D 9 1u+IVjmx3䞡sj֜ N23ϝrcŔmJd|"Uelb"5j5|lh2z#xD+Γ9 nE؎BRUH}Pc`t`p\$m^c5_Rq䨭2aHiQs}oy@X'wzi+04oAJ j?:`< 8PS.˙`"M;!4/eO0=f,7G|+ pqn⹭h"mvq7w3??)斉:fixû(y g9 % ^!4!_!P ^slR n1xwJ)[aJRmF{6Jy-4) QUCdN,rG( n~E ~@N /jg䩘]p%Gڷvx ߖ\RLE+ŏm/vcFkzKý?2+2n'ǃ2{[KUt|>R^ hxu܄J'|LܾQWpUy\K7}/1ne>i|UoOLzʕ'U/oi&=RA|G^ivcیL@C7쥋h5VO _0L_;iftf-Jbw0 fꖑd^.8ʣI퓈#Iq7ЦvpkU'-?jWV) 먡׿Q[% {Izޘ{?EKwh!No-)%F_`o%MTT*Tң`rʐM 'be(o5Z w3tO:\*/>Gxn ZK&jkS:k>h!v6\j:mHzJmaɦ,,?Ӕ~Ta>OHǔhOQ2-EpSFEmڶm/n:,רNm-_|:)#Ə-??p85&O?|Ϟ=`m2Pֺ 7d&xshϷ>r pwAɸ-j]k5󮾻̢?34jU^bϊ6ꛖVڪ#}o'VWIFTGt;UT`6Ds0rڅތ)e~!g}tsi 0KeW!'هPB/(6(|އkNS9dUH~+Ɩ2*euv~5Z[Dؔb6:;1!>[PV"ʣRo2)5(NKsOsOiw.FΨr_f^&q&{]0o"&om{PߧBcS=Jy>|G"^ڊ *EƳk9Gw˦ǷWzI3cΡsn1ICUr }8:J/GTS!Ʈ!T 2VPWY<M@__ef|0X·ضwu:FP]-y}Pc`}PbV`vt-7nBcޥPכzT|_VqN8ܶW j ~[O#NZ^9[r7A}JЇ8BJ@:Є.![?An~? ߢ$`6I rP[Gf$ېmH-'E@x1[ 1So)E,{]gJY)Lmiwu=̐l|Yk j3xe:-e4Ak֎$ѽXk*6V"JGtz]cϘZ`LLaCX3V\r4% r:iݓ'TH">=ΪVKqͶ]^~WtY}Zqw7>.?03`ccv2̴1:ƿ rT#&i=ceJcoWcc%63" M3hz5mCh|&1^.8ʨIcvڥ Wz&DeLLp]Wev&W~]# v AOس؛؊Al V6!J=0B]5T[o.owە::6oN"S'/юѫ-f~YB@V;Mn..u2JqD= zZI1N)ݓ&Tں<|;ܵL/ )4)zcv g?+x`$<{o~RyRk =bDMDa7[ L.1o-7^MM+%P8LQX&j)+<mC8* ȏ@lD'\qLm5o7ֳ|Կ.=|Š~ҿG84uϩ nذ!Q[x'FEEajkaaa*Aaqgi.w1'̙d*֭[ze˞KgbR NGdA5_e0쇚P!>>>774 1ivv6浰0{FFU ,רD [Sښ?y`\0R/߃mWb cpS0  *6rƌ8. :TP&GA 8d %$=+_|f B@Gmg 1,UyzA7gU]?]ŞnʗEݕִY ȑZQ* *l:ʬ #Jywmqoh:4JAo&ͻ+ 3rzMv]="y悻‰t&WfvV!07fn1IS?b\vܸB&:mBq(7tr6/h>O&gf&zt {v/lN/d}/Y.NR(42o TװFʶߦfjYH4Xl,eǗ ?yeM ޚyԳtb1픻0 :e೎ afs4Sԙw.2ӯҾmSnhzGD^USp4B.MI!ˬ~F?ľخw?2`_d}];EpJQ͜8^-x)QF;F>\ƌo S5iW Yt3ZYO!rqx}4Y4":3"]l]VdU$"_gzΨ <3}0[#U#ܩH*)ҰjEj|Yɲ͹NaDhD#Z$%p]a/6>*.B@R 45w9ww8Fzi:g*оamF% wG.7 W ԛM0A Ė7ʇS%7 '?IcҞP[)ϛ/ UyRn%S[PxQ?)~ݜp=f#clS`݄*FA Ӄ8Ռ|P` @%('$rQo Bՙ#ZsJӣqԸj4mH%^N/E?=O|`XBGWafƧqa n@(!RдshU:6Ry {V1=몌3?W|^mmAt`/zs'z:1'vy&6Ri o7+Qrںheg<?Ŗ1t87ouMZn>ҥ]^ IBe-»Wof:|.z# ZZu]t́~ϘPa9; i댁b&SvV<ꉭ i.6NzV9z`:xu}oL1LG R3Z81i Bz0B%Mb:&ַ [r6YgY%߱k>F[Fk!L%}x\@ۇ:q`1sS5.K-zMgW:J/=yS>8'P"o]m`F4(BL˘+Q2F5aZ'2'?{ўW_=YIh~{ٔk$s&.k MD 2]]4dj0QUQ+_pVL˚my0|o^R[x5ڜ9s-p)nYyp&]'ᇱ`\'$$8({#Bט0DFF½pw-zqlٲe׮]{g P[e] (oBm?kj?|+8åy7Ș#[ԲV{&A~ 9.PA)mc%QRp^h)v%&;5*PV<@Xhj& :e}qLsWwsg 2 k$}H**kxV$ߪK7NH9ZF\aŏE 7ɝ:WI81fRVG#H6Q\Rq5*!3MT0elćPN150d׮ T#MC[4o')<b10s(}YtMrR])lF>-yofn"]\1Zpx갥g Ӷz۪d*.n\bXvj2д2CcCP.@sD}]˘HQ3R3B1BZc%i)N&O/OLgwUw(Gyf}v#z ~eK*8jբ u2&B(vy)9 uo}Ay=XX,2Ҥ74rV B ׎j׶jWws?Ar`Np>rA 5j9s :aҊ7!/" ˔8xA.!53 ^3S[[W1"~T qe%h 浰|;roE^ wm٘*&0Ҝ?tM #TjKR5Oi#ңEݤmPשk!UN̪օ ~-Fo҆<5 -EQL910kPH% d+ }D95\;\=LyOpC;nIÆ_}l}SvogWACKNgKL8UMYf|d$6 ^$g P ~Љ<y‰5MnKJVGɑZ9'736 a•#BkdP$й!ױL(P$`9fqvw6izߔnyE>=PLפ:j\-z\#|̸qIz9)d+E]>6'e(!`1탙Fnf5B m OV_pY}T3򃛥.eosnkzgRss& WmJ5`= 0nśM/y6Ӕ5%0Ch4NÔɑR3 шQ!M[kaeo߾m۶lݺu̙~~~ҟ?͛~ Q'M1attthhxrժUgjTp#޶3')))8 IAP3;;{ܹ8iӦM;vؽ{Ν;otU@VbVوQQQY,XE222Z'o*81ho8}] p{PP4WXڇ+/^~z 8 Z觶ƙ ܂f7lذg-?onnAb8L8 8 B+ʂjKx:+W\v-z,>䓁d jk(}O"xq^g[PyAyWɉ'qyҸbeX0(/s׍uk)|2t\6ՖUf;nm6|ҩr!m$#*m:G z4Rn6 、yww Fs7s+lѹwNJbPn7Ztӌi^ՁyT} uz0U$FI5ڥ/#2uD&V$sG(`i<^_1+d&\70k @vMָp8I$ޓUBohN4{mRGh#,q= >JʽGT<.=,;}#"RDETB6?nyklF9QyTҙU]qpŐyބ(@ѯM^egEÒwi0'yW٩3qM#6zڍ(Lǒzr᚟-GGGR2B< ڋ (R&Xx{ӨW;Q[ CPH5 ֏[P+&%Im*By'Z]-r-sӝ|]xvP S[RU ԪjxUT~j !sUYhFk6zL ñ!|Z*W䨵ꈅꐅK [f&^=?6h@/%ɑZt&AO* 393y I$cL梶LH̭y򖥒 UԃtHm]>?)^;K73uvB^(DNzȧ%>! nf|:" #X #5DU+$9w-+tHem'Gs)}T jFfOθwp9&Bb(4QjNkQ&QZr"LyJaOma/Іo=_Ed&?bbk pqڸrC¨kؐ cD ]dPOQiWt3OjXp̸0pY Wvo3("q Mf^c3鷘I܆{tc-&3*\b_@9(D$R1%w+WGjl-#R;;F!R G:mCن'Ԗ\)EFUv:G0Vƫy!͘p8sY vû+сW?3l:L-?lz:\eBU53GKCk~bW[pp!> xOP._.nS׏d?Il1[]C!|N1\P-kֶG*GܳotkkZ4qSi>h/0ig>UR8Dsř.e=48y]PEe61++t ;ޖ?hja5k׮;vnٲeŊ!.٦RJJ 'qtP\\\hhM`R:uٳ)SO,cGmA#۶mG T~Gj=33g{YfA/0t0%qn#/h$,, S[xViii0|p`6@kp/6Y۠Ntt4x,ܹF ckmaYvkɒ%o-<8;w.q"!'O 6$`j c =,>8rҥ+W50``{h(Bmmo@(j _Am|Y%u[~~G ?^( daӈ6m6WG+KI|Q W})[mE6,2<5SN^QޑS Ĉ gm׼"{a;6*͹fƓoph{ݤP2Zm!P:k ~td,ȨGBe|GKһLޡۡۢQª٧ {nƹJԑekABnGUe_Moט.؛T| Y" ^|vBV) >,o#9` (114C/p@!Hk4;Ki9甹gE3+k Չ:Ư18vΰ(lN[ܲ ;i ~YkrE?-G*v%3Qr6EQ{Gޕ' tv5Z]^}ے̂ѪJXh_BWV%L- W uO.EV.zlQKX>N>LLj]*n\LRKL0Y,LV~>+jpJ3\6t[؏_׽n'U2ܿ:4sÆsp("#_OmLsHR$ՠ;H7 ]F_Tg<:km}u8&&"1\\d8>pbпmB[ %vs^brB[lL"d\Vғ|C0s/!NIm>S'M꧶xsc-I'Ube?ű[O+XލFN@eM{GsS[NO?->[F+=1N9\KĖ^+Yˮ^$tzݒKܵC֮rk<(VW+ lFԀL[|B(?fhwֽK=W(!eֽrv{گ C'_g3.g_тѲ: Z Ϧg1}xX~ YD'k9[|B79g 3/93ॻd]e2iة7)(qYlFWP]2NLYfv6|`KN9PU wqf(ï5+|:Bt_`LSO2˿b_[@`F ꔸ6|Uq-[3P5@m >joC-ѷ{l?pAf󾮡!hqw;U\ hxU?n.w[Z^u9Yd^Xwt*?.c2mP6*9-K+VK/8}Y:D\ U֫}.2 5[HfW:N^AYVG aQ\ixɾo -јdL3MhԸ]TvAQAvhfkhzs~OQ>|;3u_uUW:9:7sb:X++2V=Xf١.ep י8Wb#xuu]p+ mm6(2v`+ #kXZỌN9V1!-1ۿB6v"9g{G3,aáeǃO¶ScS/[Dü:Wj/" 6 /g3suI"])L*L/3ie E@G(f?j+!NE\XI'2ҡ2N"x ooQn@IXwڼ^mm0"_^j{k۴JB&v:t2iX;PWc*moo"{Ӿ)E!fԠ(gm!6ʎ%U:7?jPgˮ;ȬksST'ls>.f']YgԙjѶHu͘mg/;]TO=oȸ3I를ei5@w׬IP}O2̚>J߷ٶ߳*cPozKPbQ7¢tBKps)fK)"y7{dXJI6P[bh?N#XYItm[Ѷ8{'tߢ ;:]zWKm5G-ȩQqVzW|~7}G/h2$dE A~bj@Mص;`'ɋѨ{ܘk씳_%7n޸qI̴L-f}vt>ǃ{?@0;x\JF)QY47(<00Z Z 3&Amrz@2X($:Z;%*Zo5LդqmAHŌkMؖ@APJ;bt]n ^5cX>wpM;'aGkg]O+Qk"/fgWBgO3/3'R[e=5rV&'3[U=Q *7AU&ք{֏k67Mi.vJȢʈc5ŧO>ׄO겼ek74JԱ& H0Q4LԴx-kRx jk 5DHr\.$3. ,Υz5N^t'{/6_2۠qƜ8<"L333no|˖-7n\p?֫ޛFǣcFFF(:KII7n\`` l޼.Ͳeۈ8$wQL`ZbTwy-Kmu=P[ܹs,XrN' т j&)P[XX8O 'I# %a7 zM'_1#0ArK3g*X/Eih°.]t޼yPtr/@yySCnT¿Rl#!Qx'~9ZFUa$ҍݫbwNOg_'M*GE,+ݵMqH3rzdjfw1H1-;<2OֿN^hQhV8ͽ۩Qz`9`h(t@ Zf*BEܨl422^OگL)v+u[j#J44l,lḒ#e'OuFϚv:1h_?Ƒ\#c̗ܦ$R- %bnO_BN9hⓞʞ=~*e$,(Q8Nc sb.kb]͌.>Z48V΁ݪa2]r>eC_ ryPiG0L̏r&˭cOPu%dڲƩ3Lb #'ķd26JOmg^{t'8g[v/EEQRcg5@+|am}ll4m6eH5EAk.z8ݓ\sK)_[yVOiT(+o (kIGq[(n=PxOm)^@{=[ț(:!3Ӟ):DRq<4N4ɔ$_um\OmA5ej O#Lj+GZ3\1 6 ή $L0Z2lv}9-WRZۀy.dFzd 2p~+ϴ064 טb3L0X40- UUbLiO>X) }Cqܐ3H !rhF`G{Ѿ`סk185jֿ %gL-ex${g^CSn j(ڭ@5ȯ{B9ۂAܴ_%_gzy;f 1L(d1SUr!-ƣ[xv<D6~v|Ga;/9g۹8 zQ#`{maj%j4 iŪSf?5:RcH ViY\Ȁd~Մkt0*:~Лk "02Zwl``DESf ~a]fC p.׌Sn& tѥڐ"]:^ۘSܜ#hOxqn9f5Ô;qǀˣY8@-ڑ@L{42.*Z#o`>@vJdE#S}iѭEX(# ںBͽ5An('Бe;Z(X4(锃iFn~,Jo1; [w!F&\s%bۂok6+1;SbU V_b&}fk$q.& :5vھm#:0\]c\Ƨ'I擀ڌ#:eQ nmCxh5IRlqy:x:E:.e\FiRu[ "}ܟ'QY0_[|Za-E'3DRcf$Zמ6˞ZG; T#[kLtLe[ EDܽPr=zq3ڙ7[vMz6ڡD"n9H=-uxx5v^*])fm bb)Ɖ)HqAJwvrƶիxEzQh7wOU_PϛwPWHPOx3rqR>.MgXiKvA=U J4UkG4` K!\C.8J z֚N VwPӄyv~8Ho4f:`\P-UU=MPo0>f"؄.J?]FS)9l_`o}ۘxtz#v-/?ιlK'=j ~ :[+hYjQ .c QU{&1Hm+ ,i7BRҳGүB> {[Kk# ׬0.<qx-"5(Ί0Ia \kYQR|2 B%x5^+ֽ^Ы(hnڗ[==1Pt~f,0_J:;u&Iwbba* n/P['# D=888>>gRkܹ#qqttܴi\u9cS|||z-hݚ>}˙RRRYHDEEyyyrss[ 0zJHH Dؿ1(wZ9೿?  }7^BK0؇ h. pLL 4Z"Ί~aD/SPt8WO0#WsŊK.%D֛o [fM_NbYGm8j#I;D3zqŒbmc\4U1k*d>8Y5\6vvօ¤H ̾s$6Q3y( \(f"/(I⣼$So,t$R$`5ڒ菩cD'}$qŴL]Jn]r1Tpu%["K%5"VαQzVڢ1ЄeBUgJhjRQʆ(ڻG4)]j ]`a#&Q$6L=EzpG {=P(t?\BdzL{\}Ry`a]V>L0V+ zq@nQZ5F bQHa%D Px(-(lJa3 z!‰:DA(:P>Zv:-˄9/c%թeڔ?S~P9իW!u _1BgEFF,NbtYpƌ3g$![s΅^*Bmmܸ7wzS3(Fح@n-hѢ+Wnذa… V.]tŊ˗/|;i$(9k֬nA*n"W;jĭ p FJAC/̄ReBBBD''':#@ )I0Rp 0ײeˠkI *ıސ-8% `O\e.(dɒk%~뭷>`ժUp9> jYP[7~}6}* psJV'bly9UXlUzŲ}m,wXaӢ0Wr.uP4T\d#͑x":rwM9L,y*-T/Ȫ e,5Q?k`__Rfѧ9,=FϨf9ZƳ a2m}yw)skfwњ:[U)fafa!^EC kģNYe&QWS…Vxv7]bdxPԺ1ߩqȹ9QX]nMԷyрN6}3"72J}(GiZy;cux4y\zB~Bv=z̷h^xWsrBb8)agDS%ܭT i96A]Nvyq,Igxlo_TA{BE8f0?eTL$|̌tjZ瞳C?U cP]S[Q!o(ч01q#E!fֱu)0 :P%G$ۑxn}{v)vuvC&`-Dm=Ƒ98 ^"kWgoo}_ o;i6<ql)NlAc3% jQ|Qa|j8u*m4 ?bz(tS| 2 Mi6W,{tCe}ޭ }Fd^!tkSokՌ:zuKtY̼_%??5EvW;DLig -je~\e??q){`$\J ?m _/Qx@1"Vق g Vo!1^ bD ZCHD~/$zdZ!km~oPm]wV{<#&k|ʒ\7[mcaD૳W8_ý{{&0цIyMS Vhhh`` 5"t233MF-M8Jjk˖-8?f@of"a8լ$h]pm/^%gϞ 'իN '.XΚ?>eHZ",)رc" F8+_W^YhQFFTKt0>ĐC  -)C8s3tpܹ9te2y`$褑 ÄIFa{ô 0@0eˈPo{[ >룶>o2~oNm}# ׹|(OSCDYHWǬ*TIؔ]q)umo,e ge9d9J*Fayt=Ep$"FK4fuai0"ȲbΦ[0sO"&!h&Sf_sH=D/8iUl^'nj;2Os3?vd?>1LxYăw,eb']k_-[itx¾Mz Gy\};iGh6&0Ӽ&c.rqtofӲє'b: &O!إonjNWl&6=MSqlZc#rko br15va*U3ԨvӴZs]qm]f0c觝%-pY5㯢 OÍ$ㇻ2 F2PY d͒(I6Ã%6-9m2aol< fd zMˌ)Dp.Q}:qEv64uϼ2/3ģ GɪmvLj4.7@8ӉFvb.;;;*d"*逺O4T6־0\hݥ6¦怪_'ǽeOXn[Ba{Qjn dQdHCKSKS 󤿦Ը6 /eV.B;qta)<ĤQ+7S|d^5HqSxRLB5Pt PϡM)2Ed%#,J)}GHJMINyڒ@P[oƈyT+6WI;˕룶>1o,'dK uV]Ւ7D,~Xq8 2G#js]u}k* ѿ ",x]wD~%@),y?Rո;v5{ERDeeusCz]&>_yg|ASdQcc=MMma%m!s\>z.9D3El"tVLY 6JAtJmY]+p Gl$ N=`yzK'LHs^Fd9sRRLmP>uzoY}3\Q>cdKAGGBud::YN.0Y<83=eVو 0 ~}( 1lH-MCk| C̻Ō&]Óxa%*_x9/W8Ҏ.*M&*;4u 7ݛ˝T-co'„}4yFq(&O!d)E z 03)Es0xv9f?gRg^?SH- A UyPTRtKQ[Dm}#_XQ#SmJ21Ё؆0'bSG>š8ETuF&Lg fHibRXut5u>Aed;FuNsW9jmMMkKs駙ǹGxq")98q=|&l#S {pv %[(snIWq*vO3QMn]n#6U> /b_*\Vnq(:7 vj\pظa <9ۘLc (8Ƥ 9A@,x~No au-~ !o97 4%xd4Y0jaouF\mbhm IGV=qmx  w [j2Ԗf,j3:4 "{83~u kMbP;9jKjʄ⨲ѢOHرK o3\d$wȜ3$5a fZUwpy^SmjG@G]W5b3As>¹B֯_Pp@1mxE)A"!q 5FP"PA.ރŽeI/- %Ełh*9QJIVX;VL|q,޳4{zm/-އ~?~{CAR].,,P[>P[iiiDr<55599^0̙3|r8[...P߿wyE`ȑDj„ .ׯOLL$V̬Ysj* lݺEGW^MԢ-ZD(333QQQ111;p8J_V/ܫEx-fꫯ;w148@x-"8'A[8 !C ۽鶴^%*\h#*9 K{Y[T$0z0h pǎ+W\dICg}Om߀>?)O ̯ęX piC% wA$bEzأXQ+{xkt"~WxnWI[~lᖹBۮG;$mUv5#jC33x=ޥ` 4fE\X !"374昷Pm- tژB:q\ʽA9Te!eU#E+7eGk g\ROqH s6:"gzv}:J.3J#bw-S{=.|Z! (PG=VGVi4A vhS3Cnh nѪѿH^PmjKk 8tR%Km;6m>OA'Ggݗ.si(Ta'><ʍ# R.XݛW).*Eu-Sbj/Ãj}Je$p<ʼ%_`үSP#(0Da͵p&F:ڳ |616=,=(Sz!#K#Z jN8]Pz+XvNvNuڲй5o~-_y%&螚j5>3A{(nŽ˼s)ƣ |͡[#ȿgX#3RuzyWEXsxI2심$KH=DJ4$/C9td%JAQ^^=-%#;&N'~k|b/׋Lr+dXgM;ͫWlNlzP` 5m؁P[8zc QdmԹkF 3eBwuw orwvtGN=%[r'r%ueKڌig3Oj\pY3 x1/S989'xǣq?/9 < N^Awql\1ZuFoEb62!lT("qMĤ_2_2_ҧ_O֧0L5&6&"!8 ςNyGx.b׀݉KլCލF ~O;-2SnIR4k`1g%31q-l&_됝s[[ʗx~O̻(-Iz_&Sr=^m+t&}dz-ńyXSy08Hh8aDsC"Q/|&I kZ*:)YLp/R$Q[  /+R^ 9_' /M' |W!n r{-/- [VR9)~Ľ6ki6[yj{-`^`L}{0 no^9>WHNbpp0 "jF"VJJJZZL0a̘1$N'儏D犰4a~qvv~~~("##_Vk~Wv۶mP o >A+3f jlp{Zo#Vjj*ztp?6##Օ]"to9sѣ MGa$i c8i$R3P 4`s\c/kސ-p䢓.^Zej-+#1Z Yq}>>j)_DA%Y^?^"Vka-aYu>%J'"'HQ - ''Z9Ӣ?;uݳ^Mv.!ɀFV |< kվ'+EqWA]rW͟g+ 叺+uv%@V0=!zGmki0WG\43c(YhIcheXu^]Gw>^όE(qM2JP```9>ãkִ0\.]$f6]U.n mYׯ柴[_&ʖOގ/ =ϥÄ"N/i4.{ 裉Ft5W 6=B}TTtP1=Dv8!%Zo}G]WE}6L#P[s4lm%*]Omq\ȐeKY{`U?lblТpzTTA{O V;moAtƇvwh n??7[/Uw,ŦtT wNPLEߤ,Bo M<,@GP).Wg^+bPda8\:ͧTNkp͠/0 Ȥ^?Af1! R,y$[˂ϭ/ɤk'VKQ[Z'#O.1WY)juȴD@^mu/Ãaۍ)"q1O5_ֽMP ;PcxWAOH9:f +k ŸV8KPz_ZE%ϩ->!1SO& ,DagʋaʌL2mBr)} /.0E%pdIu8QqoL4f釖{j۬Nmݻȑ#a>>uT\RI޵k+;g[$pP[$I@ C8X8W #wDw["![<+bD)HJd$Z^V"qPN~JJ+B/_dɒ Κ5k"YC/";^/;L8Ot̙_R_0~gϞM6-]tƌ)h8 g àAI '&&Ͻ}G Κ7$Y![$W,IK-8B|ΝKI(sέ[nܸy̓wg}`ߟ"$ˋ#Q#[\X_ $U$TԼʽXO\Pw#O?}0+ŒsJOBnw)t]]T?tU3i+tv4&^e&,e#u~rf|I>I\U&Y&fxMÍa|/,Wܦw7>g6q#K 47nj ڦp'쫺)Ŋv'sLm&!O9͸RFFlf^VkW<y[q=&.c8(}kq8֭Vy>C;-6v[Ď_M_6Kn;/[ˮpP]Q*3H.;wzTO-SxWoޱog-*jk~ qw]7k?؀NpI*.k x#Vfd9Dfr^?JF~˭NgKlj С8qظjjKyF1X¸K<*Et8OmƊR(EZEZ%U!9{67ti~43q̶O4Bdy?zLk/{57{D+NY{2}mFֵ +0D*ε781ݢbIX$Dci4}Nq(U h=mn>H1P_)Є>{N1|r"r#,$n WE/(^ޑNq_f!Xt,f ig2Ux׏d~OyM#yH2x{^h|ƋQGJ nZϩYq>=S ݵVa62Omn<"`=6#Z[CH>V{b H=ݝuDn1P[wT.k0;olf~f/ms;>^݋v}v| ޽oۏ7o<ŋNy$"θSɄY"b wLo ں']Sq 47.eBF&kmYh:w!,ϘpM=$]kjG"*#~I:@ EK("ʀe4 JߠEp w}t݀>sp N': a,Gxϗx^HǗr>e8N=ln2Xhz)<5F _>Ȳs| \en* [-pdw@?}WT>?'';Dtw~ۉyKK.tOVE'z_2equ-ޚ V_h-2ͭV[.*(*~SPQ$]w䜣 IEkNk]în0iM 0f3]_u}};{TWWݪsō^/I]-/T'?ޏZ0pZa1ذul`"֟sG1hMcyT<¦dwːMLلUI,8FalogwM7IY?,7ǎ\6G[AAA[n]xw{{{xɓ]nW۷/55/`X`All_lٲm۶Bt X փJPXpppOᣞQp!ճ?h+005?ʘ1cPl#J_r-`hh(|KIIIJJB\kʔ)&MdSSP|ԃ]h)$lpݺu(AbP.kʕ|ƍa# K`5x\\6}tx_o8ĩSvS #8qD#At#rLEӂK?I=Ugφ^h_|ۄ'&&Ο?v]J^+$VіyB+g<:eAo5*l~}l/k 'VSc$2U0,?5PߖN+ .r>C̅ͷ`'ghj;7~BBBZ$qMtg\i\Ue[TRTX>?C\+5}E!!"w!W7&U5aYHxZˌ\ޗXpƥ]"" yN!&/9]uJl#I5jUr%zXHy F"ctH,V 'RT 'rh`_I;88mvIzUjwU%".6h<ʿNaÓ<׊mZ3Duů5Z*9G#}x;S R GjW.짺_qMmCEͼҰBX X >_eoքm-WJCǛuUS.oQ~9RBGȼ˜e%$$ZJҨݥpU5w)_ǿ U+06s#@杮su$<დ\tbXúڇ _UqeqGbG{Ѡ))\ek6p ~'o8kѨ,ޫݪwZxFכg\$VUt?G<|0j _,!b1Qb>*> h}[mcٔ0r.F$1Ni6>1UG'1JLjpv?D&EʤG=\OCALZO] _ N۸^y~cBOmmmըO|nsksdw%{6AL48{C!od_dB_ƽ=>TT]Yܐaа0l?h`7Fu:Yǭ=6&q'5E[1,b'[,aA+\iy, rb3n 0f &n`hOh.pxkXk'hvΝpK{\#>gϞ9sDGG'''[o gΜ nǿ ͊+etGAs ax+f{sttD{-yKhA[!!!Xx\ fVZIII#GB;>ĉwųv'KΝ 7lذzjx <WXW8RO ' tڴiMh-B[hP_t w NZ`` |QQQS4i_sFYΣth?$=\ l-_ypBRRRzVJ/E[o ڂztw/vciC.r<ăgr<;=S?r'CZscPPMlRW+A/\?? k7ͻx^y6ow6o%m R2H`WAf{dpr8vi`vNk w oJheK|E \]#.S\."6S7NPBI8}S7cv1c5? ҡZQ~_51ˉ6ʧ|T)Fu Ou6/ƾREh `]E8d ں~ZRpUXV?BgЖA[a6t!7Km  Vh3 db) I-9 WߩW_S?N9VM(40_lP_XNj5&ސ^QX0"phf L`: #0L0*gaLFm1j NXabdVc00:c֛k>d2F.8Q@l~a5˝cnփzGL?~ߏ&NuU`^ ;.t2xb֠Ԡ@Ю/ꋤqNlT6X.k]a*fҼVmWA>L:w*PS.Q#qh[EƝA6 ;|ˮgN)Z~\uL0m/ع쀊<B=Do>LoQG`2R1)HԨ Wiݮ0U\ºHJ5wF˭j9T3^)˽2k\ք( wyJ9uM= F5{OOF9+IJ4/O`% BrA3q ĝ 5pq18Et ~G9ptXxVz` LD` VRTK4-j1qOhKŠN o/>`) ^AY$ dUO@bTTe=\GPv2A4 ڦ| +(W4cbb`@K46cup?IDs΅+Vl!))iE[++SVX΋'Bn0I;aWvbt\[x&/ {u]*E-ny"'.\Zv</֪չ4\[!o%W~\v{cKvoS^L$Lȭ-+;gk͠s%Gi%Uju+I?CZjKr(9۬vZqvq4ԙ br?h[6dv֜"467m-3mRn>n+',I̩1NWV.p*8w8rڭ+B"#P5MgTpX`R¢Rn/"?TԢӨ47mon2e2f0ٽm OӋ/C18g7Xe[$tUٹs]Oh+8K-xuhj哾2ܶ<ʄjA%A\,im@@$RrqzʪoP(&sD]y׏jS+.7Aҷ߫V f=x=S0TEGSi9Q ;:Qg0A[EsQ+kK02#G3tɗq̑dRiaL-j.ȸl3dX5jQS?:bq#05˾cO쐈jH&Fpӏ9_X86__'ϼhki緆}7Uol^Y5皷'"h¡R`hѩx?D2D o!ꔶ*b&YH)*eεvbVCaZ'2;G='O5$,|IŲ*p}Mo ll: 6K=A^q^vZrVY)krp2vzQE_|/ZQRZϱIpMЄt !\M$3pN==\9j}U!9P_aI Xˢ^l]E:vnQ^|oRJ=-=OeW@Mxw(HM\[8e)BQSL7E .l2HХ %F'݋IO|XiY|ˤCIfڼ2 z@W %w ҉1/cR*\dX|UbmmYt"> {_Qֹ6߮Ԃ_i,j&i"m, $xZ*~u[_UGhP*1ʭ h"һTQAVɜ8bNzMб\8H+z#(8Zӊ%?V = tu~G{O@l{I#GGɏU'=ۃK /g-x<^r=f+ʉrsL'5J$Ny]Y]!/ai]a$2od!يe d_Q[_XίGh ! )QVX?/'7?\$->{%`U+0}tC;UBMbԂ}̖Pbȷw zb\[=H%O+ ,&_G `VpKzpt nVAK~{21GGS 5DWt81=_t4\[ndm|z ߥr T:=C޴J5E4^xZs۲,mJn6bt'M#$1ˊgb1V̿xmmdV4+SΦg Ywhk$[̲/4=dz:[FL߸n1JMMߤogm_n޼.XbpK۷o'aY(x +(@ m#r1!2k֬3g=qĈhCoo-ݲGճW#]*,111 Q tD;" ={i&M6B`!,]e^ ]By)B/8/)td -C*NRp-8h783Vxxѣc (R2%%eٲe .DfHh-%)) 6BQȳ uG 54֮] JW%eE[+#u蟠+122-(sҗ@J]u-jYWX vk pۋ1/^wu8gu lI/buNk&6K:TWT_%~!g 7}Em* \yQq`kۯ|xY]br66mv=N*iwϓ K(VSQ.N:ˡW9*caQrISJ:C?G. vMh巢5kF8w30kgޭ٪h7 >#&\PۀQ0ek:u˚\~r8uv bZܺJ.~~I>"#TT/TaS%ŜɥR~SnгnQ3*MB:K0AnO'oS'ec >]fo QwJb" 2A[֦j׊1w\e2B[7+xTwE2![I8sI+q@%KOf]RTLy~KxLOEZT@0U`/߃sK?Rjlk Uքl?ی[ԫl,pfY'GHR:xY&́A\-;dLY[U}5oH5&MybTzf_J?Yxf`toڻD^^FU\+%;W\˄n%Em~x#^=鈼sk%YiU:/| R {Tusr DXll$ML|TVgHӥc_ǽPO#ßQO`-w$\N`#r Ca |Oeo,uHڳPȕE*ľ}+uZvUpZ5XUMeu[8 ܵTQ(Acy'd~]>Ef{RG ~LA u}`8FB.`3C}"{V*ؽ]$ 2E9[I;0᝴n;iج0Tu;nEBܶ6jcȲ7wi-Zm*<2TwɘKTwm7Hv©|&?pqŢiS{V#XT`srq+]Q*6SOŤɢޥΣ_̭ ]rߺ2Jܪ2RJZږbSϷXg#W]!g_h*ҾEb$6-mKEWs~!g?%dУwԔKdcjb5z}: wEx&mR_% 5; ҲVn{;x[2H$*sȽu ^]SV𠢗:2#rxO1 ƕֹU]P5ZPݪMj; DQ٤_s\^ i3K˳4%v՜k^O3nznQH F1c_Y[F:m3A[]mmngv%\u n0jk25ڳ lV}O-ogWK^?оqO=<˵:AS_^ rS+hBU-K#0jFtĨ#n{fR,F.c񪚊1 #-1#02H/6xc3e`"#chvD+ 7pu,X&gbݱX>.|X,=` ,kX+fڃMYws?YtbO"3ߏ**.ul.5,EkpeUyՇde?uu_F'k R yU^JbW5w/p/ks+㹕7((_7;&댾!}wRXu^t+5.T=1]=6G+P4T,*dlw+xvugK22T/a` 0"H9~[w=[`n:ЉWԸ|_ځOKBRt%LDD}C3Y߿7H-Lͽ}ISt*e6vܾZX\wE/oQZ)p9U5}#z]56V _pi -!=h  voG+О#`Y^} &#jX5V`@6hV*ʉR߷/aD 'ӥ2 X(,Q~N^5`FQ}`I˷lZv4iļ[F=C7mW~^yA9|3iۮ2܍+浛676Xrkl9UN ]*]F庽qֽ4ˣgIg}kͧۏ{tЧyGV"r8QABy}B%k\nű[SXe31%٦YRlhnh&ڂ%~,˚)qяdzvaagn? 9Z>iq5vڂe)ׯ]/bŊ Μ9򐐐m۶-X- _CY(qӿ-4A;˗/_jպuKX "|Jrv}ݫG`em\=t $ZhCH`` 4`SNC.X2mڴ0X_g411 c_fk9" Sg-Ɨ+ITO9ڂo-w $#IŸcS)9T-+ͪ$}oO9.%9gF ]CeU=i3y3jKUU_NmQ j\5:GTQӶr#v#&TD&U\@N]Z[Xz<_G~dgoi m!+7Wm+Igu aAƫZlHohx˚dzg`t"F(k[(}6Ā)FcT0F(h'vhO `c1LQЁq"1j,Lb0C S\DL e$#LX`v]$fT,x D=I0!lA?}ō;n8[s[uqO'fWU6Zy:wɼ~ꂾꢾTUAQ+ j7hwT)w )o>闧BZX[oǭn08w \0NWUyYr>^g>^PߪHJҙIl6\5úoȳop*Q'Pk`9_-?ɗ-૝`k?~?O/E=#rKڬ[=CmPṿSUm7@Hܢ➪Y_/~kd.ZG&ٲբ~m[p3^iĮTNSUN]aYI7٧p2P1_Mk/l̰ulQ;46|u],JMNL͕v;p\5kͭZV/ml>}dy`_sϡwV-'tѕlXzA$KSXp6UKz ^XhDDX7-&(Ogl'ZW6cu&b(22q v<;0pfT|d8ސ-3gvaa-#}PP.\8gΜ?9>/,w{899YYYڢ]B{Ж߿ڤE.X.ggg">8?B6nڵ \l4 Z؋zWzV/ 6?me\lbߤSfz&ͻ[jYK>ٙusW y]iܸoĄf+I{hZT&slvm5w]mAڡڝ ̕7Z4t궕]LU{ʵvzEN@=@m>Z~wZEe!eK5x1h˒ ,ߪTejnF*l%b{-92CgߪFri+ʚ2s Nc <'FSK)7X:_噫O(ݛM2R~bvj:y_T U2 +7tX:G*=se.RonyĹB;P9^b>I.&j,:mx|jPA>M<>⛺? 3Y5TKXr { F|ڸYmz6P-Oi^; 3ρy Amɐl_ܡQ ; vm_j#(ty\ޑj[&R [v q\G4< ❖. h-Pe3qى+J*+(^kvjkuvZ66o4\"4:A\l,6v]Pեm}}j[_r/Fe`6a(3lfgCfͽ̂w6y40GP tY eA[3'tʘl]1 ։+#GaH&fp;M*t O&҉7棦b>#{X,ݔSWյε4ľWZѐggP4 ՇC}b VwPa^kI؊#\KG]@GfSAYTkt,"$˿TQsr[]EZ*̪9EޙQ;'ݒ]T u`ڳ㫌 =lksxgn'_ot: ZZs#"CKuD_I'GX|M2pr8 mQ_DyC.ݚ( 152p, OЫ nгQw2ܥˡNh:m52T 9zz=Qpoxgn@~ZL!_*SoPٿw@C09B֟8-րv`% .5`LMP5byb*EkNF%.С5Zp.9gDo稅'*pнGx~XzU 9IQ5D7ݳ@WBҺ4ux*28O_"V9uu VMmcaۯFƭMZ1]6]05m?a(<'ީ-8D|j^?-dD4SKfn]?ҭş홈:铎gQ?۠ Xe~Dшal 3>C[>ЖxV3pK~~ t]Q}-gg9sYZoFh+))r8ߒe ?IHHHPPJ'>M:_]3Cˣ###жL>^]@d#m6m>̓CNfb!Zh|s`eٲeKY5k,8QFAa()-C`]vX F~4'-#-EA*=8h6|111pk\p2۷>|wFV |аw+ҋzVdРA#>8K1O)p/U{ߨ >;=:\cy\AUP{/iI;7L>5<4Tn{ok7-M9bO啶p ki3qL/[xJ&Kf~ӯx¦%L9u>Oz3"rh=a O (g|'{T-NnJ|眳IjB5\S!q ԕw2ײդM1Ur&YeW&K=sJªR.G5:=manC-bVXįI_-ەzueE ./G`0xsC.^6*, Wrvl8K,|傑 -a^)ճP _FL:l[KʭpgZ x& ۧޱ5-Z[%FrC}e-e; Y@|ʷH'Wmq*>$ҧយvKSErmFͶzB_uwu}#oa+_K*oWo 3F^b_Ǩ5 #B12O!:{0rF-D 2g3EaFN̶DFc F:c/F,|2|;xFVC1b0_}X c1|, _q0q1G`satktaC?5Ĵsl#o8'\xy˚R++m ƥ~ۗ, +$4M:-ꤶj2ڭx Fi |X"nql3~Г 9XWfUuN-~邱$ѿmgT[u{{=i#TJ-Р$A 4(բAq5Z ^Kܬo3 Jd9$F"u߲/7Tp: OXN?Ƕ`r|kJ I``F#x}FGdo^^%vBawp%Ԗ$JjME϶J.|˸Nb[. CPw@]Ly &كsAp>`4[Ơ.'{N8̫ a'il&@#h+01jJi,:vtC=zQr.՞?W\?s$G`/lףZ5ۇU;w`)4Xr,FÁ&AEz7GuDCyr@׍a-oj+*Z\߁h*gĭ\˱k(e?3>C>9T|R[6~LGvҭk*jRg0YcYĄpŀʙ[V b`/Kֳk80RYN5mp 묅@ݡhseˍE^.~m`KD[,!88_T|ߏhKs1sC&,_c_|ł D-Z7p"!!!)))111?|}FQ?~< s?BCCaP;tl2i۶mwްa7o޼nݺ˗yyy!+kkk4<q̘1=[HFP"pKB ă...$Cf͚ rN|pIIIJc+ae5+>6 @)Ԃ-l5ng -8ڏb9a% a4crr2B^B֢A`_ϟ?{=z#G< Ge˖/mJw^;má&M6UsUa hXZ3 ;Ë*[~"? n/=Xxk0q#cME&Mp~~8`^!=aj~Yټݒ]N)R,~ )Rz֋,Kne22ɏ_EiB:,_훣Yʀc*"@;Ryo^VrU԰FҔKYsve*2V@Ք#۬RPJ_WLxG.L:8}i_.mYI9GޗIݎN|;ʗC6 E m yLOz&wbTxK2tL<"Z՜az֯0Qp]ԮoTk/攩\+ig; m˭_2Qj TJ]9Y=S=\S. 'V-Fܢm]NnҮA[TyP&C=W;*z+ msxL $Js{EM$s#"( =0氻k5fQQQQq!=3=sνs}szgj $q43_b߈c;z;:ݪ_=P&"cK.ҡp`r⡏lK%ñv~4r`Pi$ҦFQx5l?q'M{t_CL"3ne2_wy!.bI:A*Lu\OH[Gd d4Ɯ,629GIϼ=Gi饌Б09a<-Gz3r Bd!d2^`, !н32K^ =5!!XOB0d,93)@Q4%҄lv.^N Bi/`U73G]`h8 |?{޳ZRm+k|Y+mVu9IR=գAS ck3|RvNV[ģ WUIy)"➑cP)dq%C{=9,{BqZmrnh--HxSvSj![xXۡv-eJc(jޥKiS͈'4qm:,w"EIW3c|Mzͱ3KshA<cԼߩϨ1Ee@PCRcɯ{GP+Q .S3nQėT{"R G[Z#MUPUUP>ҍP|D)ԇ[Ry,H^ pSרɯ%fʳ,x r褜)V =]@% NjJz>6]Qw\Ԝ KL0 Qnbi_7 ( ezwvbB~~7,x6RʃEyS~5T`\N%ĐR,^xR1~RR?uzz\=|.\W@Mdj)Z4َ̓kP&AB`0و0BF-LNb`(L2A`38ˋq`ކ3{#bpV*;39a0C(]c]{V{Xvt9C6X#r4pҡhkE[gU9rŋCDZ0Q".% aڵk׬Y3c Paҥౝ7o tuuutt%)S9y܃Z8'3Jzzzrr2p}B%Kl۶m֭7oްapoŊ`#{h/++ Z[n S֯_rJ8(0I&|||QCld 4\zubbb*S`\hSO mIn=ԂP?F \'ZL1o`h`iii7!ap|pP)ge?ÇO8qر޽|yyy;vF@[e 5P͊.C[[b[!~Hi% yu]cnI&ܽg\]c|'ZŐܤGܑŭ{ޗ4lx GABZnоX$vAG;%wV6g% JF>K 쨶-* [IPik{$T|_5_!.@~FE3ƿU a&hEܚ)'m.`dž[f] /3TwȞZ[`zd٫j1w[Zme!,_}j~\Duo4?_#zD-Ed`z eE#Xb#B. ͵fx Eq6!F d Br[44",""Mӻ%{ GP/fCzD|( $M0R#E Gɟ ݀?YJpm4 GPƺ]c{ѿ1*U>jhk  Vd-=/ȾK~ɎXzNvט'`$zj/~ѥڳ滳QV[« (WWGqO5cɷ{g1ŢaenVWFRkong4vTqKz?mwO3@$p6ܵKȓ{d)hR.3Ϊ}\ۖ8N~|&-[kI#PQ.Q38؃4MWO&JM?C->FZ#5ԿAߣ&j,%nt١l yZZՈPՆPš%4ڶ4>UѐWcaŪax[M I h^qD1_wP;,0ĨDD !z(ʙM(Z* HEzJ>HmAC<^yY1$-CGmX]21gWCe1XMuگ `șY RC0I7Ua>D?,-%VznmO]ҡsa+Yrz_,BZ*,׶4{utݱ]2N DXmaR10j)j51LeX%E1ˋf.BY2|)6D}arj 95B k0,ˏ>1@L1'ZK˺@2<IhK+/}ҎGol00  edd 5kL7΃nAƍ MB ~S#snb `\bY-``85kUPqݻw h2[cO' *G"?`QQfOC=2,|Iy K}VS f|ʺrjL]䰭py+ CNӏ<тͳ(Ur.?y֊uakxIw a7CW<]K_PUܳ^ypK:f_QLkmD`']³ U# bv!'u;ջyn*̯ |.(g^L(dnU ;1bI+t|:/N^گXfUIIT`oՑ Č ԬjCr|,Tm֥%h$&)9 S*Rx/A*T!ʰDt*]$uh>iU4 {^5k%2*Ȑ¯vuPX Kh(u(^)A|bl N&\J52*7U{UD-,4}(|Ǎ.y*5xAGZi˲x=|gьܑ&r6 'mYLaS#_,>kj5UgNl3*fKo|?_X-HN*_4>]YXhzE 4Ikt;##=wz<Z~mKԒ'Q_#.hKjt 9dsNž}Ɯ&[acc:p9(l@%̪EgZDBA_F!'Y&/btVĉHA,:NzZDKlљ1eJ{I4"f#KCOFwAml7`_FkjEY&^GfӆΡŸKhC,.uHOƬRMqԼcpe],V g١,WɟWX?qix[Q6=+Ebΰ=5@׻÷:45 Z`( ~NiAYLqÑ&`8y}R&'&jS! Z'#mҙ$3][> 1}k8cK3->}yf d$mu)F}hK{1ai{okm-_rŋ mgBCCi,ϵbccG5~x(o7r~棣N VVVP! (22MHHHII Q0(>>>**;v,>>`\Wa6"=p_0%Kl߾}֭[lٴi=lUp_p ܸq#3ڵk߾}G=|9r{-]3Ǐ߶mm 2@D[f)}oGn+°і)o1YhQƶ(B9Xc_g}N'hm%|N1-nM)?1+t0~&l)'E'9<87ɷT'U%>Uŷrm`]̐[]L(vQ:rF# '=Æ_YKo]qR\/C(Ĩȫd=*\-T bx^UoIO>fJdAVYVZ<*Yo"hіXlTs>:Kj-X#h_iW'INNo]&P.PK7vlsS}Z-dw[͔Az#[!N/s wl<Ax`4Ag0q_93pKs%21ylR8a0I3Q"} %nnGSdژU?%ELmMghTn%$ B΄NA5=\@IFdB=Kg4[Lg2ا5vLVLFwd]`{jxyt9Cmglq=|_tڮ#!Zf X7l_/000$$$**jСq'NLKKKOO_xT5jɓg͚`G[Eptޯ ^ٵk֭[7n @s oۂـX`0s8\cw.yzzـqh7w3 :#3<\ ,8sݻwcȸ֯_\?vZݻȑ#ǎ;tо}<_@W*8?~ĉ۶m@[eY(σOc Wdgo+[qu`Up x6mߙq~v1{{eP-|%j0*9XU+< aaS)*G&t[vx[=@w^=sҙߋs>=d-bmb]"&P3֔Q;]bܴp^-.͹.Cb]PO#wR6/>F^x2S,z iGب b|m,q~|vrjnGnRb!U?Ga+J%KQzexpڿ}A9bjv!6=ժqnÝ;'n[@z=XU4Skռbߺӯ*ܻ*O1J񈏚hJv[{= /|;VMsNVVmwTg?[[z:zʅa#(3~"B\!oSj&ߨcKՑժz_ҫ sR8rHfK)j8&HκD̼Oy^i^ @jDCƶrR;~D]<Ǯ.ǮVǮFǶ=QßI<nFM~B{CVhBY.Q6W08·}G}IſbJ! * Xw+օ9reROpiak hEhiuzZ}E콱䕩\֒[ahԩk:ܯ^(ax7uz5z{[ynms'\~qB圠Vv-JOmZ~nQO2QӦv( +T)чB)PC jS@kāȓ(Ϩl#vvV'vwQ8kNv<:FS7ձAnwsCy잱䪩輹费丩lbj |.1OKp4D4,  JC[1ƅɼF0hklȚǩfULW9}kߕd/e2"3l-ᄈ?sIuĤO.`Aϩk߿Go߾}0 ڂQݶ`c`*o`b}U,o J[E>ߛ?3S   `6nܸe(2wCصk + @->Lو{쁩=cǎ}7hk ? @-'AK)Hk7W^GgX5zDzyv^CEW殞^Սw >zW89Yp6[1mӒ=XW=CEWrFcЯO}Ԅ~T|Xl!>* ?,~H#kcq*,Kf/[R'ĘB4Nu~Mz̼H *ׄ(˔A?s'hUUSw zHLdK,_t{=unm5.Ed$0)f L-ź2H&2*U88GqD85jHbl #SzIqm*た7EP>WaQ&m|/Ĭ2sT;.l̽Vrlɣ9m\Mжpm|kFQؚ '>}]8|2 q0K6 vcu33W~/=e\^lvU\aLtŬ%)wxWHZ%?FXMW\fT \lõ^wZD6Qy T DU֜&.GʷcG3kZMhEo`NJ'q]jw:E-KXOGFf'Kj-DSo&ʫt؁aTR2]JbmHGAXBh( %!Ӫ%-u ԇs)͓7ӞՎ)+ gu}9LsM=o+Ǿ54(w6R9d87d~.Mc8DF+ cVb}D2LU&yYLrf7\Cv;h\3j`;*yt+ޜfE[뒒i=k}f÷'gX1_kiiiue˖Zj{yy-\pÆ  JLLLIIIOO4 +WΟ??+++99yܸq&L0[nE-Y|/^ !ӵn:WW)S&MmCwɓ'{{{ǎ \P -Ѐ`Vdd$L]83X ME\`={8pСG?~n>Z0~~~`P~.___0|(`BWpkH8FaM:uΜ9`lϝ;T}<Ԃhk׮]m3GCٽ{޽{+\-:ꫯ|? \ }Bua0!hk 5ʿ%ڲ3{ؿͯ.f< kѼ+#^?hmh}*xnh %rh^aZW[ŷz/9oE9UX67/+!wNv_9fkL꛼?Ie|}мcXbX[<74W,Z[%+EH^kbR<1-aKAYװwNk\j~e`ƫsm&YWz3btS{]WkK zc2MtUtVV(q|Z(퀩su\]f#I@$@DQߊ:7Piy_S@eR(x꺀DM"&KnܞH'b;0 ,1,%|V[3ףӹGh%o܁} "AT>#_'eSUCU{ G>74 hwt“1Ap@5Eϙ+}oqcw/P 0U_S]$j g]82wPK[#]#WDxM*W4 ~p,Q/Vo师$fFf#YҏמUZZ`aH"}if2:$Mɍx!CXӘ4"!dNҘ7 72\t,}DZZLb=wLFpF(>"G!0bO-z_ 1ѱXh"D4Yh&DksaI:F#HXb1/ 5mh$ž'2Fu1*뿁vpڟu/&?j ]#=}솁ⲡgu߿~R1zKƏ_)"7Q-*z$N|+itaA-708W%-G Q~rSdT-Hj 0+\.7R r&2z]|oĴɿ!~W=HWk{j.UK03LĸJX)KJ V VF+^Mgսۿ\N<"&bH& [Tuh[zү j:ʿk|XwBzi\;NݘOn+,Ʉr)^O҆(U z{]6Pz:H೬;P&ڠ=cU A~p`z&Ϭ̓t:(gx25jw]u5::xZY@%TP\VBcn TAjLO!dڤT#qB5O#<&Nl/c-4+oV'W'V_!ʓ䯼6A}RIWc B]A_3Z7Z1-b6KآM"j>A&o"øY׬B2Y m#*\jC&0;*2sD  ٚd gP"wU_! Z0!?b$m(hSAs=S21`=h̿ژE[Sk?9!'ܹsW^[p'D0c&&&N8&!?r ddd@uw՟w\|eD0o޼ѱ? -*L&6~NҜA}&̘1&*B.5lذHPɃIIIP'%%8F:uTnDdPko̩lڴ 18 ƻdɒ$66 ,յ?5U0C;'#0xbm0K;vl۶ Ń8rP+r<:th0 f,B|0d_:k2o<O@+2P(~h ? |ƾ600?+p.Yy\|raղF,\pݝG_Ѥey켲VVzCaaGu{Jv,/ʱ| 3{IcZQlx8F3ayTGILd t~!,x.6*_SDBV%~"kLVBBQ:zHEm9I ZAW]cutdDpMATrmΉ&@+H ! DO&|2pmB[ `l m7vםoiT]m}mC-M3wnկ~yZ?VGEؒ_9Ϥc>Q|F٩48ÞcK3(SoLN}qr\z9h"6fA=Oi#,E sTaщ9+JUm@.0+jTDRj]L}W۷)-+-/UQʄD* xUL +'5~D[bY/>p4s+DzS~ /Fʧkk<5jG£E*qk.:D:ENWzv.ޖ:3Y1@]y|/+3ՙ Zzz:Nj76ޡt P+1LejD4ipRHd.[6MM{Zڻvun3uh?4^HB)Hz5QUTT Mzޤޤ7AX޻&S4&Qco)R^ggo?7ɽ߽]ų5p>{?{ao=EW1!JåmXKѫ{3݃]C["H|zsd?^G]ܻAgy`Íd.yثZ r?#pa%}ɬ&T|0n%*oqJcP>y|W0:}9eq\͗`K [:\mD];t`z݁x ߕ[Hg$݈p:)-"_G[zz{dYmkf333__ϸz7I~3&)))--mر8C(K,={6V-8k,/]TŵT .`xxxBBvbb"B q.`nnnt 7//n`8Vll, x+...>>F[ }UDp)WX=֮]f8k'o@@ںo ۩: pj8Ƙ^ׂ3gTyUmݺu˖-ضt[*>>l޽G}{]vfe ^N`o*OTtkm ȀY : A[ښ3jǚhOO9[O3|Zyva V]*!C[W մYnRuս:{+<^lp-=Kв 7ܣ<]%Ͷv&Ҁ#qHbR6[~U+[u;L[:FO2Rϑw{Ҁהֿv}z_ ϑ=K%Mddz9/2=jbRYf۵HWp,漪Yfi̶\zξ.A1d)ɸ# &[@Gݡ#^ GuF| 0WnaiֳMj6%m/Gռ+=4-Vw#۬_Sdtigk{K>k%ӸZbڳ nrqwBe@j <@f7"?)VeK5PZL{+\YeڡΉ'蜟O|tQר#hc|ϼq `bO h1hj$zPm~!ƒ#ڿ)]-]7L|t8+/_2R^J}{ePk_6Cj\.AQf:YQ8OK%I&{\ʧCP+0e5ތ6y'.v'Hpn -/9g\3KEPU Q!W8rr#8;ފHue!1u 9Ʈ$9; 'd!  }h0 5 >H`:B_#h^>J .4(?1ZJ|ghK/]*ӟ3_ R*IK|BGxFQ[I-K^x>-ԖK3xDO' /E^oz: Ce;l^ 1z-Qph3>nw\Y6.f2V 2kL۔& NQ;i,Pzt{Jܦc.1i'؉ܬɽGETz*&R6ϵHMBK&Ō#:MEԶJ\aSݷ-7w_%VS/A*drXrƽqh-;i.ƘfM[JVb8TN 4L1ȧXRU",{IFC-W8յ۾mj{c]e .!iҏ+^hH_iv7ttlAc޲V<w[!\[N7 ViȺ:4 )7A=o{xS Ax)h(6Ei֬0o&[R^H[ޫG& 5[Dfp p3+rֳnF%hޞu`uuεGE.7%S5Dpr vJA) ѭ8T7$VLjz Gy'ʻ|BW46 g-DXky#D>Ak7v"oB6mY 61m\bzMQ~ˡ ni9Vy6')om-Z_A[=͚5+''ҤIstk͚5`7ܿ/SL=z%K~λ&O _U1 ,u$W^=c x7"R!!!qqq\*hkԩ𖴴4:>,, L-- %&&&Ipp0F ^ap6e δoHLL9gϞ ̓pJ4ܺ8?444** %áypaBA#\X3BDRSS.Ž>?\_~N]n {p۷oذm۶mm[ӭ5 2րW-[[,9]_A@Ҷ Q.;~F--mmFumoF^]&.sٯ j ͡v9+Wuf=+jw i2oh7(Z(}8GoKu{ <8Eg z,;zzx?b(2V9"0Ve[Z9WlE-Ps 4D)zuj5V5 FO@+ֵUiNl3Q]hN?ל#ȽE?=տrӠ~Gմ _ڻhG[1tk=xiX4Hﷅ5Y\ܣBn1lίH-|d]( qICS'rNqnbﰑWRWi=rQ2 ϗJϻtEv L`5[ݷ o?>MZ7863o: բY1)cܿ.pzBz<}v0nnٸR,.( |*-.4_0=_ʐލ-[.jcX()Bة̈=]N\7`[B*êӂD*{O[Ht1*M$e)SQ-ZM 50wZ.`Wbw# b ʃ2>1w!w$Zt4JeBp&|-ֆwĢ]kJ&V(3hy*=Yol*ʗ5wFhk"AOFyWH %9]"Qy1B%S2 ! #-!! ύ8)ڥCc]*ӫ魃5% ed;o^y()hN:'{xrɼ}"|%q6Pv vh+ ?-|6 ;v] ;6Sx&8RP1Qڨ|M97lInLmŔwҡUa'Z2jі%p1ig6rЛ]qN;9tϸӢqggTY6ȸ%bǭbֻq}5-fjgXV _[z _n/g#e=2<,444,O,PD۫E8Y`PJ[Y:Ҕiuz]Bvq m™u(Gv pd&~BEHܕn( p Ro}"86q-h|d D;.>ZڈVC[%Zȳ;zzMQ~ˡ i96ymi_fҥ4ke]]].\8eʔ8?gz$$K,;wɓǎRqlx9uT< p8{ưL잔1`{O988XU?Z' | Y{yyEEE322p$Γϣ]*r3!!! : ?bqqqtpdPp/_aC!pb666p iӦ?MD_}wo6lسgWg0\ [iii;?:ߠ2 '-,0`dnj!ucZCAmDwׯܷ($ nm6:#d΋ŅP ΓqPU):o$|DȊ՛M^F&n\%ܚ+bSݷ6cM=&o{*;Wl{پ~)Y: 36  @mĿapB~XS.Y) Ӆpje&ɁmF; $㴡2ɾQe[5VmVm,%46/<^1ɑjv]QS$q] [荃jC6h12oTv:79(i:L Ks㷮|Ieș{wZyg .AnZ>_3"hxI`Gg\ jG|6x yzD\$A&H[DCΞa`Di%|{=ۉ^[< v.ANk5<z)*n" +@v; W%!$тB(RRgLgSV}DAWmj8v+x?m xz;h2Dg Iĸ哏C#fF쯵lv=Y[zaلp>_]ťg=WfQ~ˡ i9vy#m67oM׮];umE'''NuXX?~ϟܹsgϞ7c \J)S`-<:vXxS,Uxh6nܸ|rHOOnT8k*\xo=~apHTD? 'AAA)T```TTTRR >|(g8pm_ɡ...p xG)&"`{ήࡕ+$ׄw ˆcd :{u~v m2ˆm}ūqd2+Ok֮gĔҒ*4 e==LUn)y)}b3>m!Z{ZF^jL>>tg'm$zD6Q`fpŸp' gdY۳֔Ք?-::GTqn5}3iDW߶Y6YJJ;J3slfҦ{ _RnBdzl6 uDh+صM`uGEJ|6Eڂ[ Ss-Ka-ᡢ; *HτYB=1PV>aְRux:zO |gw]2&jYyWciӑd&;U1D6CS8,sφ{?&WgDkIcTv:;KD@-)h>bt\9q(&Al&AU<J8]^Q6i.{%$On*F{[6bSy+y~ŇIox`Ov4Oh #(Qr3s^|xmtB[|xM&-dsL@k A& A~IeT8zJz˻ľ‹P3#Qn;%HRCeoRbLz۷5LڼX^ͧQO}Q]im2:&僤ld_tCڵz%#(H,rvIL+-bYɽEVR.RJMt#[h>殞e痌6]2Nr~ӠᲯrlx1]85BZOBZ2vC T|K"sDjd醏?W,r7 .N./a=1ڪcm9ޯ/#ștذ6` 1h|yי Lqzs%_*R.F9rЪ+;g~. md}K[;\$핏Yn.ԑJI{(1kUNug% U(4HFNCmp-O G { ʁ{5pί8RS?b ;tC:9[N(*ƽ$oC¼B Iǝagg~-Zd]3O4M<_*G_fE#Y/Cg_ %R*JBnTcC[5O#Qr8bY(0yj+w `9~ڊFC.[sZէmW[[ڂ79w{L3p9/-!xks[hn<%%C[Zvvv||OeM2E͚5K+""K8%K/^ww?ך4iRVVV\\&T8iWɗoߎ榥f1ct؏ gUiqY@3O6pK؅C Ӥ$$$Nvİ777G U>** )(g}L"-zt|_}%V\[\:)#଻X '&@zi dYNHj3JRºKW8L[v|7*.pȄ[FK\ܴ٩wf&y[V@Q3v.FڿiDO ׬^*u4fR .N HE=B לcgjf`ddžu#L5^\-.3;kv'̪]̮֭vx>ya/n?3fʉWȔBUa20T[".Q S:"FW*HBA 3]v5CVc{ Z>V!J0T XjT%x@ux?_z\=6{M̤`2<äki&ʢ2Qʹy%R،cܔy?6J]ʭ؇C^zU_w˷mlv}|0E#Eg9*0>>xI5FX} >5{*7įѲ% QHm!uD7F 2}-.Te(8qR\u}}tkC]\JTm?И i9Ny&m 㭷6*o˿ a ܧNMLLOmԤITu ap~rr2F[ܹsq6r~ҥ*> mBׂfa,___x[_~˖-NGZ {%0 JMMΞ6mZZ*"\ N'rjA7(h1c+N?/x0|rt eiiі\ mllp}Ð'v'K'O\1 L"|ǣGvvv pÆ 8;G\XԺuB3G9a!G[VU<_7P v)\=; Mڵk?s AYl?g@dm D[YhD'߭ꏶ*<:6U4՘t _ ^Jo2 m5;{^QJ5jM]3yٖp8fάAC{ź5br]Z##mfoefY' yx/J9]6ԿUhA>OsY1We:++%.r퓝̂)0$2 pSղv:K&a\TXZ-.^Y'n*"ය}Utwް-@#.p kl1owѵ: Xߣy mfG{~kդ3OgaY{u+z4G4YBtr˫`@oVB/%3.\ڒ`.`v:PD0*OZKaK%鱈Sz1%LЋyշ_ }^Q"8&X'ӕBpzX35Ez Nn`,8bѼk FF#ȳ}ѭ|" 55pA"6TMixs TB0Q`6OT$1Xa! m5nbǒ'{ .zDa-PyiǷUrXC{% ϋO+O׆G61ӳnPcjbB!t(ڬy:s/89I@)3 <ȼ As[N` FH C[J0 X 8X{owh"wbwx1wp-hؾ;| fS~2H > Zu 0p,hJp!#F` ?毁c9pB~'o95[]˹q_.往Or>] ;$3:jLF2n"JPJ: zp Kpb5NƑj,β,PЀ  Bہ1`w<}k%]pǹl|!`=k Y&֢u~"~Oq|Ĩr+M)w#+6\6=leU3 WdEkVzgyCw5&ޭ]Ȳ&} ,o2tGYo̬p bf!;<ĸC[nyǯ1.0wkOt9&(3%lA{W1VrraL<-Q_,IIIcƌi:gee?~ƌ˗/M47hK帵t%+>Yx1\pD\/33366' >GGӧa'7o޶mۮ]')S`w'8qM s-xAqY@x 6U%bbbqBB=—T~f͂‰p(x?M`"\aKKK///8S*p dj^p D ׂoW8ehBmݺuƍ8#**.-[+\@kkkʭ-x^O T8 8 NI|;?M87 ld@JGVU^]pl5/0 m˕aPքݨp(^}^ap"LK̷>NY gayn4G1AԹt*jU"u*A7m#j*(m'59n}eF1"mWAo*@hT^Fn|V9Sk\D2ġL f fznt?+LS v7[1K[k#ϵXrL%-Vk . /@`m 9kyJIЮ=3NA->ٻ!t@.X\/PXA!-BlB+[F* #$ !^  ^sFXіt(\#wd˚o F  Dq@B>H R/ & )aZCwYbA5Gj Rc#[A(sdT3t-@_8^傾T( BvF\ q7GhKm9ykeeii ʑv 6?6F ř1</yعK$.[yV^ `ooo3i$̵pA@???ggg4zhĉUi6mڴm۶;w~}`'8$8Q? ?ah-/Xf8;ILLVqd8ߣ-h* N<q> ē];Qѭ@.[Fo?sssLgŇDX fgmmBBk1.j}ɖ-[6o  4"\p=៰7\CWc9UP .&'%%!|A#y'΍-?ܕ &*Q ld@,hȀyЖ* wC}&0 ]~Rdb}yM Z\yƂcMQWC aEߪ.Fq=%[\'ll0whw FV 6oIBeswYkiÖdRqyF+ ȳ,n1vjd%$!Vau(aAue3T$Pku(32xJ\Pe2o(b 訛l=&*F[d3wOlh)V!-`#Z74v i[)tmhnN#+6k7ʎ~(,,0{jJJ,AԐРRD_ʺ~ufΩz™zϵdUt:6]|bH%=rbFi vS fT'E4DD:L5dоmSvH|sf n13[f!PL8MpA<ԊCJ(Vlk%%>~l:݀t#IƣZb1-"$>ƐN PhoG)EkJtq6}huyF'D5fXB8U3$<c){ #& ~Ip!-?!C7t$< # ߩ`;m~..Z`@@-Hc*F[3Et5mxݫ߇ D=u Y'`{{ *gi.PԐ(Rгpښ5\p>g`&ޤ^^͔yҬYaHZ%6u2Zk+[ L *o1׹ .| ^W70 vv`LZi G4 _ @η``6sd3xX-\+|'B/^{µBZIT.K%RɹTh@]<_/h3On}M=EDMZ9SŊȍȭ(7Vh/إeasOq9W\  u cNJ>Q)kB^԰Sb.6n5kvHFv l)IV!*6 AM1;ͬy=kSy2GL0REItM&Zxc2#h:s}2<,JOJAculM!u!#ѧ;0Ca)ț+_DUbPģpO90C>ԟnp\@4bvڌH:d&R}J\Zї-~O5+g]oǟXC!eecc|KVV"?p<PT~~~>>>^^^GN4iŊsU0\vhK嵵fP,xu֯_,]-xɓa4 a\W;ٺu;{={lڴ {PbH|{,Y:gh<2t+99ڀ]װFXG[3sΏ?>ؼye[ N*88822{u9q4"|b5khW Sq-J8rs3DqKK ,pIa3~_7hk[K<\^jAZO.O!O8:~{nh;\p|"Cc?2 hkm % 0b3Bcڂ gn]kymnVZsG`SbzNCr~ЛlMZ8a܆'o"wçɛйpdǒEY'ȌdU2%:'2"\Pi\cZk\)% ܘ|_R18;{vY.8Jh',~$~ܢ"oM6]m#iB2ҞB5ȭ- 'EOZ6mU#O ʥBN|8wtuķ^?v>6֗[Vv8CmTCtkCviG" $^fS.p闸+T^ꏩ˦Wy-le'+{Eo,tbжݸcHfFE%;|T\YQ_Y nEeIj|KikSi\մݴUi"k)ۇ(A%K5Z-23?g uP ^=̆ Fם0גob֪+?".1-v]f v:ll˰Gp CCy5&cSCBb$(QPn-S*_7Hӈ{>ԧW\v :D9pnOpy;j'F a?| #@P:1<2x qB~GErSXp>CsOW,W?dLOSBd>v&1!ZȧBԱՕkؼż.'I\ic`w /`A'ny.6icާzK[}n0cS`nv.'ܪogL\zS QzMCuCuȾJ\.sIz=S=fsa u XcC Uv6x k , L;kv{r8 g{t#esoܣRR+2rҽDy>>*t3a„2yIH࠰aov̙3`ogu qad8… 8"t NNς6qD8?̵eccohԊ+R' \Fp|op$ \sڰQ'"L ZgÕ^R8ܟkЖ jUB0rTh ?5hʳ7h Qm~+dwD 6*@gՀ={UB84>&CU7kk@O7 ȟmg; 5/R~(|"ˆ hThUwUN-kml8 7s>%>=I&\"㠞NYm#Cn Cnhrک9~{]2Zt_(J'#*>P37 ,Dw5fxڝƞ3/ ykIm8ǻbO~5o*pW|.*H$ғTkw\Hl@6JLeEw gtFI){W&e3&YrYxX9}M՝ֶ>XLzvwv>xUmm6nl\J~*N\S#5`"uBy;! ҂0u88w\elچ 2kxt6ED.Qht$H?u!GAP'\^ф Wa A# ^@B`A`-!R!Qe1h?Q`N.5$ûr [ U}éTQL)߂/EǸ)WؔlH˜a$ƘT1Ώ٠|687+n`= ;.;v}0;& ov6ݖ͝]BZ}VBy`} U7X7s,86bQWAqLL+{, ? fxt~2Ꮹoltm@8J\*(?Pަc8$H R_Ar>HtKg(S.ig%Y{e3eȌK4̝0)H_dh6 X;4J-Ćx^zM4,P.V\G63]Hp| h&fu^mN(}ܹ\RLX@TP"󬔻mHrH+Uh&oV:܊[4/-~pǺ-DxF<X6Az& -^chb5$&k,⪠K_ڲ}gwgg7{syy>0s̙8|ϑh9sF܁^" FIHfEy|#jT½B{KJ#OSѐw-[*}H1sQV\tihS~L#fxA{09ޒkff9G'DH`/ZRwĉvߠ-OoBeoo2-3]t s1n݊0$!uҥ'O €G%M>=55g?~42MjOKK+((a8 geeem p-xVN`9]Ciƍ Y] {+6w\A1pZe@@l g)..s]\\ynnn%3RNN6gk9U SRRl` ZmkTP8*l.܏H±b{\NuRR]|o-u!qbO~'i-UAwtW>Ir!xN=MhC<_&(8Md3Fߦ9D\ ?z;CĪHV=2Ei)VDA?,[\KC/WzA/Sg:Ʊ1{@VsZqSϽC [mqUnoѣ3+z4/4TgñN:k9on#>rbS5Hw7Fj*DvAUEN4b=![,z, @\ mh2^ Jd"6я F"d!S Ţ)P6 4-DB[5Pr̢-m(R+(c"c>ٛuo p\;V(Hsub6df [l x9¤QTvJUjο0F6Y4|iWs˥ ^cLyYYپٻY=,=CzI5R6R`ZDټ<aV̴3tyze:'>-"JU!$][ڭ[fŠLmfufe&3&43$Bfl[O2E@ؕ+th[w5uTwѷ_?T|81+zL_(wCtS0VWѿ%G/-ˣ(b7Ȥ t8?pDe z`-? AhK90Ɉs3ѐ"˵CV"5OG碇BT5+8:6juXz5lm8pq>_ߙkxxxHHHPP\...p{Ϟ=;wܾ}-[0'p}^lYrr2̟?^1Zhlll22LK=)S\vbŊ ̜9S \cfYaa"1Ȁ)uOZp8q֬Yp0Swss뛁78cX4NΝ[PPcb)}h6- Œs-FHM]dds_O 8N;y8xx;yyy8Y&cOM\܀ +~M}~~G[hPn^xc'ag·Uܴ%/,~z3s︱9nw9Sd gW-znάw&BVQ<.^=PbAbGoʫ]|T-8e}AdY{ԣ^jk3ᵙVصWw+ L*)ߪ޴Am=}`y[""L.ӞV/ jƗ9E1 mY24v_p̈́DdQf\&Fߣb {‘kD-YmbT$D:@٥ UH vLO^ø@P{A/#_(}`'#A&S~F|"Z,=ek˲v~g̹䡵 7:I:U5\}qC9&K@V=PP:^bM_꠮f꜊w%qʋB]mէz=rBR b-*E?{ùӔk%N6.Z(~y,]-uzj^MSeux1DצR8(04mXh"pwN H@n@Q)CDMXFkd(U0iKHjZ&/D\I!2l:!ݑvKL"\l%\qLMdb%-Y)0Fe\ ; Tq P@AA6 (Tvgܣ A>pznpb(nD m]}VwM_ھ̼@^aO3S13k63ۗ1$wNzJsi 5DMH]I mUC}0\W7:u*HS* y){w;Z,KCDMCyû:Mڅf# cFB/GU`2[QUxo3/Dqn5IO9g7[BOTǔɕ}5j;O=\ZbU_c^+ ׻%(!ajFϋ%É{Nnw5N²a%-rۭK!υ]%gZJECԼ]bjUr/PTugugW_Ci"y2ggC+P_QՑ";PwHKe.K[mqRP1Z:-j@%pKx=SK=YG8gx჊S#9[EYZj_@*Ib3 Gr6g.l%$<iDT<ʳ[oQxB?E@lDS{2 Ǡ5d*pHgDxk4rR\=& lD: 'ע&r&d'(w6 ȍ,bi7Z`>4@D 7ƱXD"[b!g!z6gOl!EY6A8]ⵐs|'k]X2vMԠ|?H >vmo>#ܨ5kDl:Vv}|JNAzVj2 Ȩۘ>ge&e1R3:$z 3P ,yBUǝ'']%&=ᇖ6;ՙUSNB8@&$U0CDPx>cŘtЦmy+mYO tksLƏ̴3LE&z)XT0+/Oo(:cԦM`4Ե:BwMΏ®vM8!*8(_^ġ32[0?dV~,uFuU:;=٥k.}ۓKHբh7P "L0V=RƝ$>l?XEܩl)F?66J+j x >;b/ ҿ:XAzAzq3tV!3mdlqfbbz#庤T][WSu Wtp3mC_թGv:@G]U@A[+ Tt_![f?Pk ZZ"UZΖdU<L5`^ԝF"%(vK#˦|7r/U$ZVj-6`qMFm>xj}|;])OFUDB\TVg Etߴ#GӓgΜnݺOOπѣGO4 KcS a`%5mhh#j'O;qPٳǎú s*շ$" 46\k„ SLm"""`xp𱱱f}}}x4##cƌX[4O8r,ﴠNtAnSf͚i.<k[E[Z 6p-zaI.q-ım< kq8ޯm[ ob/>x/jtQյ#eӛU,ں]\|sY+z;lW[=s\>kV L6/JD!ڃۂoG-s?hY ~M^1wyeog"IR¶IjQ%hHz2:Rt9F#B1i[]E]Y-*|EyEKȰTz/tm*Fe_DGZ5k,1oMW"0P$ԠZp ~Ά~K˷=Z]+1 u _״;iw{m{znotLy$ ͸] R,Q2fE[)k&9Tq@qҠ'פUbg‡"3fv t;S=a%}TsEwpἫƅ-R˧ NzzyZIbd u6b0h/l^ؖgUǷϜk] oGe|C<\ܹ:RXˬsTļf<3,Zut1eخ2 Rⰻ¸;Go}9-׵־ƒWob>ۄ/6FB0!3L@uSj.ҤS5Ciڮ0kVXE[Q Wd,~upIgbKL %WT^i7{5VCԪv=J]&¶azF:¯u^Xնg+S{>Poۭ~Cr姪E_)gHL(I-3Udϯ3a unԢ[v-E(6:3ensL=o~=gj1ټ_DKB5;wsKj46ؖ~L8+|\Ծ ̮=Ϙ?02wgLP-TkR50)=XA?&t(6 -bL;`xiL `ӈn4r$x L)"N`.ԧ-O(֣T-Bhn*!@t0!Uw!F ws!D,ܿ: CZXSkBO)ڸFt ?&(#_;=hX;\qZ/jKB8=J]5լ0HLjL&kUpm}Gқ># cdddFF|?~ JLLh7.!!aȑX?jرvڻw}n޼yɒ%hhhhll,dҤIeee{%%%ip% r{{{ñcu uuV{\kӧOlV G3Ņëj W`$!q  |h F[3h ܌ -9fS%$8&^ Nba .\Pt[a[b\p?ohmwp׿[ōazs-gxqjn }iӛ+/++0qg q/lݼKwHS/'ӗNO_9|x>Kٷ KAI߾J?оHĜĬopkSm-yIl2۷BJcES4?GM x*"^bӝeb;kʱW?(/Q)5NM.Umm%GTC*&X$RKL%&TпQC\O0Rz`=5zC2): U"2OKe=QI`H0@01@bp0:ڪr7R7rD!x< [hhgIYC[0W'V hĪC/yG<[?Vl(xHʢZzE5AqZ_vjz6MGC_S햙b\xQ_kQ'OuUcʘWo%UEy\kN\CʶA#Ƃ6#q!բݣq]84sł=5MԎG䋏N2( VW⃎jVzf!fLO&1a\C3mNuS%B=T*]RGMe:TkS"m[ԢyZt]Ԣ@*DWWgI/*DDjEEZk{(9MCQ[S!(^ 1`n-Z%5TlA0*=jB FYWMeOEu0-{і;:+>Q[irrг+*itUf/}]$Sn)+JAȻd+ϩΉ rʅ/$%25;&ͦkfm)"X QNJJWp{k<~L{r}t+ =qLOv˺2 T17R*ȳɿVT=D=&;^bR.i'toT+KOضIdsQ{yLRtPVĵVp 7l)?rzhֵƯXGBEC3t麊#C8lWouh#C&mˤ~m_POn/dAx]N闃ywb -YZ-<$nSfק z|>ǃMr/G ~@%Z@?_z bКt.EM:]Җ3[֐UFm("kKlj$]hF$#Q(W6+YJx-A*+XQ/:ceHk@2l kʕ|/RCL6Ć~Y(!?MW$ Z*<AΤ=}"qTVU?}ׂ gH=?܄ |wzp~{ӮҲic^E!of`Vcbr.3)/:ƑX3f]I7=\DPC@e WJuM۬M*g/JC{&&~];M&< /TH]emکѩ%7K".ή-:c%DZI~gbLd  {F*)7jwjzҾYeݪmR6y sDWIsu߻DqCʶ+gR/gU)?!.8=BD\D>o|^hJ\]MZO[ݡæR} [9IiS(%CSOSSfvt]=-9qy>D'?'WȬYp)x0QeL@%v[Ֆ]j1iHU:,R %gZCI4mEעkZKEKz9~lmGZ{1f"*V&Eth3;͊Y´'Pv5u2a)'K # f0W2 }V bPyO6qz!.6D5r[[`v pB[(tRz4Л]5ɬpǑ>3Yex`?W-11qʕpnݺlÆ "2Grss/666g/087$$$&& "s̙1cFNNɓSSSǎkoookk3qč7nڴ IRCZ0x?q\ٳqJZJJ I)^]t%K4|FR`WpX9888,, kXMD7 ?zGGG8pT"Ç>sE[8J3o}C`K ڂsO+1B싶4\K#?M9EMx !Ǔ 6SYU< a}V?JezZhslcOiAN pslwrOq#K#.q喃Xt,4XTоcSkcȴM8^h^/2#d!KO[qt=,]a{u-(l kEW}pw)A]o%|_1e+ڧ fV!TBFOS@:4YK]θIX3XwC.]kMD k86^)>HCmT`2_W>}Ў##3R{NmԢ6h)/A55sI!:>m`nwFv~۵mr.Hr`pt}ux7SՆB뵩l4@O"'pgZ{\ t6F5&C 8tl" /}O@oZe(@eEkT>@G*^lVQW".W@YA"a,F=ءR6b÷H/I *F{23W:k*糱ay,cŸb7p{'cpf#AuZ'2GխhG%)`nLh|wI1?]ۋ6OFpʫ}J#n&g|+jfgo0טϘ7{=cD[hNzD75\Lj}a :Gj({WUӧ^Eݭn̕sg:.u]'XRWM5PvvYa%1 |#a0qըìoNCb&whRS96)mڔĈi̬Mb[ -[-[uݎ%dN/sN~g^nO՜? םuhtXՊ_)x + TF-*Zҩy SOJHFKB˺**;ubnJ\VN]eՈaa2:U;56*Sr(-k,݂.ҁãwk-L F7PbE+EgY=;wmdaT M(i"Bd ,IGi Uk;n `. s- Eh*!u2K (G7~ڏkUX|QN-syh&jV:[V\e׌^ kQesUif=ŮJϴ0E[C^) ,s /_>~kfeep\imy) Go,pQxqqqX+?? cSPP;ey`ggOLLLHk֬ Zl` B}1JIIk`WFFFff3 6uq899FDD=`6mFAD///WWW8Yf2s̙*uV+-#-l螊 ë`E, [IIImۄ8 iÀ/lcmmݗnC}}W_'J)hJR@xu ¶~zx?E[;ިŸ>Koie5hpVa'$$/|V?Vˡ-I Cgo9~1pb]]f'47s',nbKfj>{^,%#W̊eշXe),"Yiwb jZfe5@ P9٬C(T0MKd [0@n@}*ٞ3Nl2#6@`X%Bt z͸ntY u =7R7 O$.KƁy3sWyM3:_?ȥ洕3eK7ڒΊ&~-3`1#0jƭvlmxEe"TH=L i"V+1mcxն[[/M;0ٟ f]'Q?RRN[.3` 7ʸfv%x{J!=f1LT1]@A[[Sr#̸Cf&5oZ6Ilv\CحLP"* -5(3SҜIm{TWcUk"7 P7ЭZT6٥a%#ITCQiHھ#+^A%ꈻbeC"DXV*y& z* ~(HGݐ']VUM]kg&]fR3co335VoS Jk" ]źuUMԦA[8;K={,fճs%*Ah?@MkZ>8X+k>1(+Cr=ikG',OBiOA() bF$kaFK bYHqa.oNO-zX@bt+Fvhَ齥{GHfkW%8#}l`k X=,3_)S?.Wp -)caaap+''XM֌3T̟?K,^͛<%//o~rrr`Wp۷nݺzeq~0VK-cӁW;::p{ nj> nنcwG1 „ '@F.&ZzmݺumiBp<]/x=]YSLXt(GH%뇽֔k9ͤr`GigImcch{u%}FK}B[qRՌw׌ܢC*\;1՝~5TӓL88}j5;ˍ^6mza󵪀( Iv|*UJRgst]yUbJSВ-]xH/+Utg!p #w58)ZL]3pRؔC6н8T@MGKrX"ڱ --w}6yF[j]p&*dңq,b)NBD΃",gcô+qx"d-e2at@EdEtlG" fSZQ@l8 Q#C qYVqL`<{| 8g%'zB 3YGmkn ۃ-.`X7|IG급f%Y|k+9۾y&9zĤSL/L%& Lnj,a"0xCю͔uL6Xq']OQg 5PZ2X|P0Do<(|Oohaʭ-URJQǗR!ʮYa͓Xtvn.j*VTqv5:,R7Jr ,eB3a6.|$z&lX̤Mf,ۿ;W (|wgS~impEͥ=j]*#q ݔT6ݮQ "B|(C;ԦCHmh.L:=aYow X \+=^5 @tmtE!+>ƙ0{}_9keL@dV5+8=}5Fz{`VK^ի3338\O`2((/booE˧M͛hѢK.[l…śpAh^^^III8( uss s[PPv]v޽{Ϟ=;wܰaVЂgI&cfΜI_{/_x{{Ko鵭Q d)+D,..)5qD֯_iӦC8p^ +'&&WБ1vX8ٳgcq &p >F[p5jZ`ggg9l<1Gqd܎4 ڂwSiB`4P}dXF-FCosEq`fC<mj«\ro֏V|ˠ)=o sf^-싶Nrcr= yFUmuW,.< ?$?1"|QVICY`ԱRLW)v}(|eܩ+I.􃷖^pXwd1r֗D"0l%MycUoȯY%a%8^܇ŪȚU{UVdrOSs~bv)\R|Ks.,;j&<:M}snjjlpm^4*nN]q@zwʼ_ƅXzH3U[%Bʱ,4 j R ՛]aú䗺ď6Æ6yxic׃Z-g-w/|~2}Dnf"];{ؒ'Wvw\?{ޥH* {bW%|'1{/K좢 Rvwvwvf~|?;8}޹s"9vִ圅{-jv+^{6?@̲խ̠˒z79]H- sj85aO 47Ixb@iwmjw(`UtDT  2 d@)Sb: Yӕ[\G1Fqxǀ-h]YKH~A ip`Iqn8ť!QbT9 \RcݖQ:Eg.& q-6QLd9-:]S'ݢð|%/ PM8dk%XB mK^D .u5ס>ХvS; =O8|3^U~JA ʇΥ/ n"I$|OGuGP+-RmeEBuWCM溦6!K'|o_:u?{n\غC ;v9.úVNuvMMVNS)%.xkRgbSVRy>E|@!wxW (|bsDp +0!wh<7478?v}o OA%ޕOYw4g(~OJKuo$bB!Ц0גv0BW{d[ &U#c VV2ί^/O!d7e1We e))T u9>,v|W1oԳZ&2;uѥu-ĵZ2F[&Җ7j1g4/j&šWeM)c!R0RIQQ?Uo &n0tYx8k;sx UK15ſ px= …JE"an-|TWvTWx8⛒D[#3Y[Yh}!`Pra M}`J@mG^ZU n޼vƥn~~~D}ر&L:u*|ΝKԼ,YBJM8qРAj9;;?##cܸqӦM?~a 'O~СCիWUL>Hxy31s$AC #Gw'S6"NNVHHHttt,?)tKp[WTPω+AOf_ZHF6B[/NĜ/o3>/EnRn^uV5%˃ +0=0Е SNJRNɆ~~+LZ&G}BWq_)&m[Cjؕ܊h̠w(^c A۲~^Anof:m%&BS=]==;6 wW? Ns;+;M]`9WLPa/Wt,7ѶGzmsW䴮SmɿGE? :_wcS [NZiiIiw~kUDDŇ-jZ۫SY> zeM&lvzv΃Fշn k6Us1sPjXo~W sn,ni z\xDEץMih5g(f&EO&G=o?dJcR=*wD"Up 62H-J0=xŜ "x8 GPL_T]}, E&a IlSl_Dɐ$@{[. Ƃix郷>"F1sp(6 Q)ƣ{L.dĵX >0`QL"&]pc G(C@DHhX,h`J8, `b ©ch QmOTfkyגI+~23ﲃV5$ZnXT?t,{m߻K/k*vB]JX7 Z} c%7˵uF+QqW6k¬݋Oi۫W.5b '߸_??:-c=> M6杯藺uS iBƸɼú*xR9^n~/e~oSTt鵉hJs9Q$qDB-ÂvvvpSXX5k+*m;vعs'|U!و mA[by#T̐0U=A[ zmmO8xnAvE%sSE )VFrxUez[omhmC[Tdkm??ecn?,PBa"#<cY?4Yt͉_tL1י?H" +=LT]kS]mVhTĢܪ~EÊ3hF]-+PƄ__'> ,t-4j5י mZγɟ 1':'?\`jIhw>0켃e AW|q o4[`hךϿh\nݸJVfS-'̚d7WO5$貫k4Z2k;ve7RcW) D D joiD܄-WRunGWu:b('Mk07"ƾE}mYSfF(h\>"HC6IaeSFm?VcQ,) UGP(tG@)@D Q$|G.@L7Z7dPX6NnvX̅l@E1q)3(^+h e"о@ qCWh '(/V( o&(LŹe9b8ɤF>Bdv[a VGrD0 Ku-C-BIt"%G "l%LD"cȆ#}2(DQ_f])pC0?= mYo Y;9otG /myyrG5aZ/)'agt"tG| &U;c"KtdrLNnjԹcja+,ImwsKq3ƞ2a"6tjqm(7ԣuEmfͭ 6R* Z{sϹҁl-6"1Z$ x%"DHA>r9 !ww[|>MG=/x;4?P~CK~WKXKBK^%%גi:.]XODtȌi+k[SBWhQcW|Ć`csC~Gˏsy~zO']sWl%Eyf9yeI-Q6oX3i_CqHKѢإ-H:Jmrwe :ڬZp  °`={!k;b.QF\ 20sNl܀:5p?2B[1Ym>yW^!!ZJEAM**Xޯ;m㒋QJ!=41.=ztf },w6ܦmQ{թmjuzz:쾳ThDі*E-ZnݺUV-X`K.YpaÂ6bRP & =###qRٸ硳o```ttСCqѣĭ'ԂR"G7cƌI&N7\͙3'//oۿݻLrr2)$Jpn4o<"Qڂ;2 Z,ڵkoڴi͚5ΰ3 z\$!1**'9mȑ#gرdeH<}# X= $hNSsٸq#a\m${ԓkST)m^y 6碭h\ڮ}c=֙BBWBkں*p(_uc+s- y&//Ϧ.!hΧץOC>( 6A.7>RZksYSED.h2(j.*;-)(8oX}niP}uQWNEG Fzum]%uxײL_ZZf^MK5] ogUt̿'k`&`_u5oYTr(TCг$zz,;; 4;2n0yϳ~`Gs^,=հߺyn5cФݸZ~ZS|NޡìѨiӹc_*:JՑђ58flo@ݎXJJ$zMd4Lz+-7%Bo.MM.-yŰ늡3 v:d⠈Bh;\' T>FS2q*!8Vb_vBIa_$̡8+p)ڟ'Rv78p RBLqcJ̠!R)nC"I8*]ሬThe| b_X˥80)&*B e-hGA aIx>&bqW&JTB:QtJ8fRt`%LPB"E Q\P~b82u"+U*=:іp&?.+9j')o\Զ jx})is|JhV̾7kT7*[IPd I_k1Yu(yҨ:=:ǺџvکXAҿa'fүr FoУɹ֎d@vVW՚57[6 E2j-Rq% "c&PLַH@,{ITC@i=”& èH% _@LI^~5 iK0RJ LeIB+5Vk5$brd̔&ᰮؖX%+LhbEfR L%C.-=6nmClta-C=ѿɰThhZVZZڟ'I B6s¬׬YClٲnݺ+W1e0222""bРAp=~ӧ 3mѣFJMM0`TM߁ZDJEFhS9+444|#D?n۬Y-[k׮ÇFnjCVJJ*kҥ$0lÆ p(GV(a%U6,Ν;ZX^BI#upp +$$$** :'…z2˗XmX /A0 p@VmJ Zz53(w\ Eh}Trd9DpQx ÒUvh7i?mJ}myz|v_OvPBBg-hbZokӏԦD^oo؀?w z] VµM vڈbb7>]]z.]}ua.S.+h2|⽗]m7loLF՝jستCz&vMᏚCDz "Vi(XS7ۖL]e22NJB.we>--^UueyPv-f&~-m#9ֵް+ϐ)ޡ'׸RRL4@%MVip)v}I\j:a%}"DP2S1S]:S[<]*B[hgFQx[C& * Upx R4D`ءJ(ɈلЅx9"cp,V %XD (1$tGʎ1b)a%páVpLKBYgeˆLCp`VqO((Xz \" RB[PTKS Ex A~HR hC1>==pUDg7R 4B[`s(JadLRѼ<&Z[DN,E)b?QjMPc39:/۝L8mze_G[;lIT||< gKhKbj$OM0)ͮB[7o&k׮][p[|y###ϰ,pƌiD[*5*,, ɰQQQ0ZPP; MHHxkCT :8)qH£*+11 HA@BHi&M"IHlݺp-l8p`DDGn cbb0,x KIWaT2H}v ,QppZ@a$27‘``0 X#G ꉶS*Th >yyy="K% }m۶dž-'"`p {kmذVm֋zVonVVVO,{\OVޑo܊ܷU Ž=,ʏb:VR8S3I71Z"(ki& o¿}*; WIt5l[Kl/x,ܶ״⨫=f0-u_nku'm[v}`zL+"g%/|7-).o-ώ}F⽺9Zl K 35q[7[u|unbx^Aۺ5DuvbvZ֝c Жs%ZSCip.۷띤I:8E7L٠ɯ;v6,0fS~0bsq\*6C2b>Xw+JbPx*X/k=֦ގߙ( 헣q? !4\\ @ja QhMt.I.zK;k9,B(,|'.Hur(=0b(7 Dl(qEyt.@Jb™a_JJ C)‰ Kl%Qt:.8 (2Eq\ӨK.gWV#wEe54`ffw+-o,VBęGqӎ~.)7G|K Z#㺭Ckmm fo%B&WFm{hVܡYU߻Mwğĺ̐ ԋle. xDߗx"yW٥ѦŶ^h[iW+05[FJV̧HDCݖFݐ^&^%_ߔa"T=A|>fJnzUԻUV;׾'/5VY7Y75Y5Z5wX6-ife̪Inըnd9ަjY.SE9qp^1;Cn&~*|6~yӿ'-ň3tƅԫm 7b~x(oqGշٴ]0gjS15{F]qQCqUD54oOչj5(M& ( jNA//r8 J-D[ E1C}/F7I\&f88{H{Mw)S2P5H)E@$,=|3J)EJ%ҫ*bfw!7BNPkZܬW䤾3bDgeN3hkРAdg {mx[R3;vlfff3^^^DD=%%eĈ$ >-m[~u,Dz.ʚ>}:?~zz:QFh+).x@J FFFU$)K"Dkȑp\8 [iiia"n0 :np»?c N:tܸqp"\ SƄda)<a"pFxk π pyxxK$'"hqDD\a ڂU"h wF4ᒞpr$sƜ3gNO UE"jc$1a׮];vSӇIZDQ[ h7i8٥k:mݹd_uӨ uZ"՗gڢ=h |ZWT>~X[[̅u[d[vXٸHĸܫHTlV_f][j]VzK}{eܭ[U-vO辅tϒL)I&"Zf_J}!b]Iv#wǦc +VԿlX%3!#KukXcCI@m_}riW0^O0.ߺUڿ0nҸm3qyг@E`?s#piulşks$(mkkjnv닶,3-\ ZxgYsu] P:U2N˶Z7=S-vgQ+Z}E[Iӎߤdѿ]c_Q$^bsC)ߔܣ /=߶T ;Ŏ5RCnM"j}ܾVm_!u{){$ -*K8+K?&Q>3 \ ~/y?}UmJ;<+ֹT8U9V7:ִ8j;kEu]̮NnW+l>mgʙڒw&U6uB1sv.o9kR~~&~>o?S~ ?0cN8NUaEO=u)phQ0ݻwnI."Փk@{oܸqpwz[/E[sV%`L{-T>o䚁I_G`*5s{ohT4,)l-WgNO>&7`4ܭ dzl$YqJ|N9˦]0J&X֤KW7f~Qɞ?9wL}]}r#fLc&D|L}&\a.5grt9$.Ů7w% >i h2k-7τdnݧvU?;iyPV痆?J~mR96W Os&-,eY~ڣc!C|]9(Ȋ&aL1X~0%̠0X1,Z?ѭW}/̥m-&e]štiؙ{%ӏ9[|S>wk⭺xvޤh8TPy͹W0nUbv&@_VͽPcJ4r.ƴѪծصy&PoiJsܩZX:@=k۠i[5,[yļvI dqg?GL;bO3lU. )}Kyoއ0?\El KoħUWu{Eۛv7QԥR\8W)c,Cv i¨mj c7pfqN࿙k!%}#>jS~?wfkN+z=5^n9m~Ԥ밡#=Nm6_1|ۦR_ߪ_N5nV _B#[ɵq+7ޘ%)E|m>qJBpv;!4P]2}c?x(v0 t5sQAe(3Z,bk8SE ֊Sk$l8GA@7" - 56W]1OY)ߩ%;-=#dUTlllDD[OP0H|||LLnP(d2[1|QF;#[8=LۉdR&)ӈnQh.T}8RDl,ЃPL$>]ɣ (6mVCx,;JqB={1x8^w@u$#v֔Ј#PSV±Z;#L.,KqHw pȸQ;.w8b㚉qktF@+'qK1(f9".TzD`N1((FZHH2IM qWz\I:O!zdl UKfP T  %@Y:%LXrq.=:xc_C[BF8o䞏>{ mV8(|+\f#&ϯswOGUS;o"ļ>4u]%w/}JRjcCM[YWZqjj yQn: :EFb7 CyLyvqnQ>7vM rWW9ZFu✪9Z޾iRX0UhC)Kl_^/˒~gWs+a^)?q7|h ]{`x/¸*|YboܷX[,-}%%O̫L +<^oXW-^ 3hKJʃ.1_)&dW,>Ο?|>psi;r?39gob>~Ť舁䐞t|b@ A4qԸ (: s!ص\֝7CNBb1!Cɵl)ޒM)ސ-0 _,տG[ ay!'?wąXM?;J8Rqq.J JVϐ-I7ܹs}:&’EMiddnAkW^pBB:99:m ڂՃiӦ8@ Eܞ0ad۴ifnLK$죏>#ڹs;F K֭[ LC[ zߤdGݹdB[тojfפ*%^f]\ۂ !hQfo@W8[ҷeN].]`_ε" Ejmη?թyj\nrU{I-k'uԘ=c|~p{aKg)49_Qo:rJ5g5~є^ngX.v] yaz7\oN+;VI&Li_ud@!V׾l{"˺O.13<9ƮR}v[TX,iOoi1on0/p}9Eu۶o5jhܾKw6ϪZ6o6nYa֜g޾H۸eG(8}NVmZ؁uy)z\ f=y~Ce}h~ZCf&3ECUGEWK¶H-c#tE2[4R"J$W.S<رxgz#u&b"dP0!hO1QDD#@☱q#f \(A.ōƛ_k6TNeDbJ%1J@W\ }ۣ+gܣcq0D,eGq.HP5w(v$G)neSLe,Lp2ŬB=.@5.8 ŀ9(w^Π(֋Fѡht ut_xOE5P%Dk$̔PSlT?%m2uaM܋&Ŕ` Uн寣~yF\jO~Ľ1_wȳ|~Uk-)pYl3o©Ka)hnkZr+ )Vr ӭa@V-ג7jɛdڲ6mYS[*i[*#YB[!Ǹ |5~m>)+|8לS:װu]#c"L AIb KYlY&/p^6;& ??*W+x708+=z{ުP.U"<1 3*oPm wV<,~H1saq&wj0-?ߵ}${mܙ_=++ӧsJSqDCqHݥnT疩q3ߩI[aƅS>PkqpRO'bF='ߑ~ycZ&o@oOb/__WH$m _[՘+=sao{jgY%k=kr1/e+HXh/ ]g4v8 2(Op srRQ$Bg\b|l6䒞AK>Ǿ ۽9q)40?-؃!tNKK]2oƌ3|?Fm988?:::99DAlpm "[XTTTZxx8)}\*շo_ ECBB\]]It'8@ bcca@8I!rpELaLx Զm۶jժKy>K&L 0jYHYF`vୋ "77lޣehs裏ڵk{'O?SRR`D, 'th`Cff&xK|Hë$8C`AN\h'(oÆ D]qFxJ H ܂zҭ5k@{ٳ@-U6"fpwp]Oomhm⦭C[,Uwh+LTّ>oQjm/u(hxR@Y..1xYb_RbS ^^~)\kUq:qƶآBRzW^}S oR~Te\cM{Z`PmBgm6mgm=rmiZwYa؎%C?ff\j=WwEfU6^ؑgؙg <ռQu3AsOU|/MLFqkkLcESگEO&\\U++^VzWuP<}zNfn)ݹH@G@[K[h~*VP-@m:FWOmppIGy6֌^#Z `j\L]UH_>_SDmr^l %_)[ٰۂD #;RÛa8&Arx7 {niny: -"lH@J {[:%B4Ʃk!1%nZ8b_lNHڄ㽰/D( ׂ3BUI!r~L Gbi4P\ _\Jqpqx"\`J8gRmўd8Gx*zQa"%L !Pc-067tU" (Q[6*Zj{uf,Y_.>*qkcLy| >8?s~.~~ ܦGq䩏daOĘKhvI̺q|p/f} '\HP"){Դ;4Z55Y4 -::mEub7bYok!pY?O|X\[}α %B`D')GbC^ox ?cMuC/TeIXmZHFcwv,չ +ސ  Yщk#쿿sεסz<,0j,4n~ii=g.]|U㚑ny7Ӧu+mWӓt[U߲y/':>Bߒ'/f첿]#NG;~4ѨkXqۮ݆+.uWm.;f[b0TsjkܹðjcF{-[u5ٕj(u$mmQAanm"M3lÆ0~8| px#K8xF<`^2bEZb/Sޏ Y4^ԛ h+?:>svA]Gϸ.UÚF6wy44f;^栏RYղfcG_x?k`̋[w-e=ݗ(dJMv/zx]oJl ϟ7)m{",ufE.<>09ΠPEx@o{!]ԣ]ymڤƸH"6hikm֑I-Uݞ_m-@VEќ]h>-Jt|n"OXc49RPo٢0 -Q]HxN-AP_Y|`Zwn7ɍ$ALUFfupQs0og$@oH.1ƪ%vАwv4p$b,kcʬƑi"*Y "UE}[t1-@[J($'.HM!նVݧ+=/oP틽r!ٙQ#8>j럠 G|J<==ݝ)2d .uF5f̘DU) -1菚 @sT99yĉ!!!0`ҤI`*ڂ6}:ntQ.h)))T\=''gܹTWjŊ͛={6@`)@E`P N>Q;(Zf - {d`3lCI`kTw ,9s%Kp4h9Rn N` ο2Nh fETAAu>R%~'OC`R`0=[Zx>hmuoe"i9isċEJul^+*DmnmOƦR&HyT֨V쎸ZGEE'6B?YrixI# k .6/S9WVvk규Ы:fְàiѳ3֢sVmrYŝΒkw{i]iQ"}qQ=/Om6iZo@ \{kO;=Gݝ~ypag~ ;s6bE~w@SYfo[T|oAztW~ݽkWfKcZk-ݢWؤꀙt^gU{$KwKZc޴Ӱyyeg<m$yzUWKUV2K \FES^$.϶0ƨឬ&ShpYM+թ;B, K5O©\+Жxs#~H@΃ i}֎G h gmeȋo%ukds E^^o;d^(&n5sRN gX'v ?f'RpMKf񬝕{5qO8V2C'=jIVgQGc)2 )&tkGqEeé<]PTQ~D BK;EOL#+V=@B E֑R󉝓HVc;!4l'=!k*j#z+2;Ikg+FM|2]H#?A?dM|:~6` 4kش1QC&=@Bn/"##PTD] h#FDDDЌd=4մD2wߟ4h 0>)),5HŵCúh /yyyQ54( 4o߾`$X;vةSHqNNN03hɒ%/vpp {W 6ZmM>=??]f /̝;WD1Nvv-@ٯ_?) KЃCF40x4p룏>ںuիadO |\]]i"lr-X{`]#VmK0gϞMeДt &k`*MNLKKˣk M~a8U--eZ"lNKMMʂWafm۶anỌ@u?*wЖ_B]oO*euN/%:Zhio^O(z",8_Q*..p<%{+xIySV%Ϻ?/ZU$.)ﳽe.6@S7_wV ,J$z$f-[Ö:/w=x.KqWGnunSNe7oW6TM߲O>m%hX}+6:BO(~ƭ;4yctF!xl~֢ٗ}F }XrK~5?qoW.=hA#iD)ą%[JqI/Y0#$Wb]L HZ08s$v b 14=yyxl96,8LǺ );M & O\!X  r0F" 9s doA gG m1 %"oKV0.&1(82Z3bECpD/(͈#q%5 oeDk0craoџ„B7S@vhkA1m+-QF67I74iZvơD vy_ǟSݛ.|~mzMIߒy\~#Vk kR-slș"F:<):%B9QhABս`ie =B![wI ֢P lA`*|]tkYUȴNLϧAnu[nxBa!vJ7i_SW9(ԭȟ~^t6Q;J8֫ruwb9zGMQh@(&Z4|pڼןmQBCFVppPF#G3fر)))TJm)c`@bb"\404ʵ`*B*pVmmmi2X ^W_GŸ%$$_jj L a֬Ĥb#.>AM.67*ƞԑҕk[ڸIݦ-_H/z;.:0eҴ۠=.[igT`Pдva+wj6kXvJ^wM{-:]nFR-Gz-{uZ?+:"ea:L]jOvi +6 |jY„.V^Lyw8rĦ5,C=##(f'.@kƣ/BяAltBvyi?W׼5+.opuE><76, 6B PN<lײ/e>&|)<[>s\E3ϣaЋ(W4B]C8pKq_eeWOH[~ct2].[JuYN|$E{/!L[R-^o@y[h:\_d4V| 7\!w![4 "BƳ( {a#9Y :ԅ-|.u.Kc7]$$dgοvQ~yq*fj%uy]Z'($ e5LP51bmeZgn%+2_^/BChpkY RV'R |8{1K|!Io@l#VJ!eE~HWKf &.4D6ʥʸ\o ׀h ̱0@WLE <WUGkpc5efj.ҡ#cݶD ?1m-]'D[Ti<999***,, P Ƈ)ЩUVV1cٳf0E i2׏6!! isppprrrqqQka@(.5jTLLL||1c`B6[R<==.X)RNQ/%m-\pժUpB3?--2@Xݻ7Xf(q"f]ǻey 6]lST֩])ࢊdpzT_ɵ ? MZ]G a /v(!G}ܹsiZ"f p\SLU&q-[,77hKiGhmuLLLZh+ΡE։LUE[:ӧ=;۝oE+-MemRYh=|B\bTUWWZVcjl!if.gl/eI7x|u~I*E+wy4;[/zKv//V^&=J77,[T0_3(>n]}⯍oN;/$_迭0*6Kw~qyp;ؒD[tn ˎY:jYA3|}m˴ O@}g}.Lm$K5\5L[^_Twkde~#.--ju^jmՅ,5Ru!NMQkIm)>e\)VbҼ@AGBƽ֑җEjr448IZ0eNx]itDC>MӧqjW1|!ï k81%% v,Sa:ZsIa_\[AD*D7e/2AE3\ 9mZɃe

X3g(d NlGޟHb`lі1wf8CLpDB/֞a%&0,ġ\"xð8wQFԷa]VtE©^DA'^my ʋ4+/fǮg/nd +[͚6ƣ5Gv5YU~O% ˺UxRk {^>, ;#8͇CAqJy:):*K8?ggoOOHZH:"PPuA"ykvyRmWS˚{fM7Ziv[N BmVy+Bhk Z -YFעyPG(g8RQ(p y( r![4L\ < ECO?p]Q dYԣ.) |-ؼz==adwjpyx˩CQ{{,[b꼮:7M0jIғ¼%`(h|"pӀI+? Za&!H֗ :J>% #fD[2I#ZH J^,Yݗ)JtE.*TˎtA_% (q jB?\]jrIZv4uoPs(LZh vp_-h\|5kS 4*a{m۶}G4h…sΥn#FsTe+555-- ^ySL6mڌ3(ZnnԩS% TC`ѣGѠ/JlJIIW >@hhLvڥKO>}ҤI08&&jj-]hx].66ƍ۲g͚5o޼%KZjݺuW=<<`Q*cTmJ`+V.`9XJ`6bmmݣG}ڋZ%o4,w-LMslٲqFj9MT\.ʬ=\4-ZiFfU'Tm$UpD`BUM-0>[Ѣx0Vy3nO;l>iT >f0nh럗rhgu?255+mqV籸"s%ں1K~QZј"w%ڪW6Uh=mSEx^]d~uwď uuUz o ^U֘-/IWX\r w׍U5uQӯD֯ˋ__,+)U󷇾CAF&*֬ l4|ۭS%;\\r<(K(~dܲIul 6& g)b?PBI 3\M꧈UU#G4ZXEٵa*-c]?AΉ.:d%%S2(h"֡^pN }EQX {ʘ$'\8#,3"j$*-L3loK p0Y{->"Fp X2+kqxoF0Wæ0l9C3B7,592l#vfĞ ;ޞiMeE ;w\һ=@KܟfD#r[Ḧ:1GÃ~gB mbmr-kː'Q 400k>K~gď[%²ara&an!kJ"('| lF'oE/z}`QwȀ;)?]Քj{͖I\~ 8_N h5hEh]n Z߆r eěO قבewR㏠oQ(@P_8zYL0B]jY`^)t+X@,qG0B7mV,+Kl^}k͗fu[/0۸id4Iul_S_jK$.k`&Y ' kW3}͠u,RfAeCWB? 0ʋaG(V}# :Ϡ ClGȴOE IZ5.XIr ]robrER0߂H%q^gY~~]R|x_u~5w f#nt 'C!6c EBb-jߟ!++ݤ%;wԩSǍGٔ-666)))55^JOOmQΞ=;''.UH `WZZ ?~<Lͽ|}} B#""֬Y-Y ܂TK4Ӎ~" <-*T4 ^͛IBRG{m)C^|ȑ#ئ2b C윝6ooo$DeD~K}Ui`$ڴi땅 71*6.hpDk6uuEծ<zmcc᭡Ui.' 9sYfQ1%[pzp;E[4N ̠Ip9)7\jE[0:Z@[֭_LmǛJ|v_(UAN4fgQ""SEZOZzLyg-=^pدћ{׫]Ynܴb/O!^T|f96vw?"z|JO,s#g#~}wʯr'-ja[Zi%Wnۖ\yi߆:L~Zua}mkՔ646y:<M]W"ՄaG5̫cFǛMO[Th=|UcA[5D :ɠoK!߬Y;U|HN 0΢hFZ~@ӟ`r;1K'?;Kf|ǠtAgtAINtb4 H]Hv a&5$ʇ\ gERK1V9T >dF!q\nd\KOuwFpQ5N.վoiyyY NP!1<<-BЖgpp5<_vݻwEU.\8{lFD[U:ݯ4xSӚ7&A_%~E%o{^.tO)/~E\16^otIzG\lNܩ5-f6$$%O?8l=_m!l۰xT۲@]Ejʇh4,<ϰśR'ڭ[ m *WxӲ!:\]/?jrܫH*k8Iz\f)ta/Tk .\ jktأ:GI6Ԅe.M`P5yFSa[6`mZ4u._C>$ω0Rq.ȅЊg Q "l KIR v*qnaڞćbh%q3\ag2" +WÈq/n#&01L13bWF̈T>,~9R4N0DRdG`O5";%\t<S19I.07B13` :Zyy1'zQ$9Xb#AUZ JƩ VaCіh6#^D\NA oG[3g 'D[U}PܼC(a;BWaM_VR-to짱s6W:&h㧎oK,^>URpҍz?4fP'S9)܉Q>c4>9ϠQ5Mŵ(0Dos49Vٽze[IJYU֟uZau-o%-M *A])6foluΆuMs4-ώ=c[eܵTT<+3C`=(8= %q\ϥ}6[46vjj0GqI]cFnM6YFӆF&FFmQU11.(&4 Nȩ OJ05I AyO:ĴD,TС/VO巀 $T~2 JU]!iw#_rc1#?G9 :ǠߡX3A@[\HLr}Yb!Q GN&~Oh "IYua. *B!3;}y(r-!31ȐAZ h>`,N2N[LL43Ym!G[?}0h ޅ#G^tvv>|XK4* W(8R 艆0M0!33sʔ)OQ*H(ڂ(&JNN唉0/^8,,&0Ҁ+zKRRi5FeAFX%eyAeheddPrID NÊT)Kk!ˣhkڵ-h666{`I4Xkر4S&M|+V 'Qg&0?ڂkM)c=ׂs̰/[0}sw> J{ BeиKR&D[Td)'s½+W5O::Vh⯅>h]*xJHKlJ')ڂ^QW_[qϭ+Wٔm*߼4ߦf;QI5+.p߱۸l /yelIzcÎq3\%vP[&eVrʒnՕ<;j]{X͝O\ 0EstPT"42KҮ'z-[te5)ӌ^z׫~U͠Օ붍jK!]WԪᙑTuqӒՅ5~Zz)ZM76hݶRKB_%ہnDFQFq45piZG1|:-Xx7Sbҝ8qc<  Cu pBOzB\BM8)"TW#~nrX:^CPgFèpgt%FVcF(V¥ 2E8Ej&Zq`/Y!~tuȅ2E^Xl"f{qDn0 N@8tqDf `ǖh/088qxsyFyǰ=1q#?3c`].J6G0\:Dek2#Ȉc9}31b>o ýȖ)ޏN*Nd&PϷ_F[n掊Ϛn{u߲^^7hgh:4w6ڔG?%q_g\X.@U7ŢA%/pǕ"qЏГQm}أ(}h oKFY;дOQ&J(GzRqȋB[6x<8>¶eL$ ͥeMZQJ3=<87+Y޶ I&~4oI&cϻ/S3Dȟ_S^_ }`B'Ȟoܯ!_P9NE^hzizս++766Nr7kߘTUUt'ptdeZ+uTY g!tp"2h89n-!l{ a;C>&_9$5,KK%W)'1@9eSۏbAXq3U5xodC2%![Zn&\S\Xa|s'HGh='Z6zh)aQ[{V3)))&&&222$$LJedd( N>xLMMMHHMQXBC(Zhђ%K WX|e˖-]T ,*谴2K )Y`ahAyxx $͍5tttߟV܃`~;YLdY?[Jۤh 6frZ` k?*e]|Qf,iӲI:u*-aGy *ڢ\ |`իW[nÆ 6m3r-8^TevΚ5B-44E` Db <==fӵqUVт46hmum󯈶s6μȟ.7dx%ڂGzQѰE^Jkeo}bA}Rg]?ڳgJ=2{}=J+m^VR1qa6bsԝ;N9 ݸ<$;47'a%vЛ?mݯ%n4,RWKmISZM3 s<񩾥<<ؼP~q Z-u< !LM>\FlO$]-td5ۦkg}oոv+j=>bԄheyzvMft)jǜVke5e[4t[.LU2y:&QFaUp0H?Wr5j8ch#fx5<&^ ÙQ홌  >e NďKlGIY٤fṚ0ZG- GGcQ,1p0rOR#B*_FJFѨ(4 ?Ρp:-J%Gcᑲ/ `d U#/ʵ~CX qo,߽4-1mgSci2JZf6dN0=Kw82 mCh ?Fm>s6_~2hʠk5wheܲ~ۼmEBBO){ [q[/6ެ|T_gUi7Cz҇͏ 5>$.1ҹIxW{vWVGW"(x*'_1?H+ NUlhIHp …UØIIQ1wIvj@Giz'@E*`4D1` ʠOI id2} vw + B[B[$ʚh1J((ndBe˔AF$pˈDpu#TPʏT}e?V\Ā=|&OF#"""BBB|}}mll,,,RRR,XD[E TjsS+*93w\s,& TO4F Qׂi`$ QFР#X2dz6zէO}E{{; <n̴tuu'\5qDKLIWU\+ NΜѫk)lZ,~訑J`1Z"BŔ[F֭۸q !S5l0:=| 'L4Ҳi&;%> aٗ5Qaa7mV4#hψzGh*kڿ3Uі(G2g&SU\NЯ=4Y)E[u5&DOԋRuŏR/ǥO -fn}svmm:u҅Ev}nlWzB~C~nO mS5Y ; $rzjڲMN?<]>:,Rwmrdݺ- MF 3*tš\ 4=:n z ;52*k))}t|txM[lSv>RlԩHKXE8O&I%R6pPY~uba/gES˃{ոl:k4%$*IM&DE!C*a #>&?qܢK1NuVXyXrjSXGD އk}HHX`H{|0bG<9RPÛ13u)re ]q^{t쳳Bk\PdJk OJ4dm ޱGư#qC|6p)ukK qfn6bp ǨF[\WRq%H 'j8l V熵-6e2Fǰê\z:|Fðs.'rі8H]#iޢm+dۂ쬼G~q2bs)WGÎ}(m;--2/}WCMĹꐳa?#7:"5xPH9RAc㣊~EC. h(\Ru((.# \!r*A>枯mT[UVtzխi݋.uUv\йXf"F&Br wnV+-%ŁE5AEoʂ.z (ZmO=+$ղ\*yJyEoY.XF6>.0&݁少(sVk[oڹs~K$T; 888!CGFՐKH25 Vׯq2Hkʖ41ln^߸հDi.=:M{ wj>/J[ѺG[Z']WqNca}2gg(^e&Ēviȿhݫ-=',Uejcnfl_K:JT2d4e5UXJ]!Vj԰3XP~ vxE%$dBh+d%?r- ״KTa;h!f8Og=酸 ѳ$ QE3/mW (?b'48z8FDلG2w^x#J#*鄤ӧ"[+@!ʃ F=H.[JYĈ<;2l#?$=M![D}0V}t:<|V>b| ~:ĥ0$"Hr?Cd-ch.[ce-?I9 ̲D,%[È"qNdIx-vgRd CNmw[?-3/p{N/X-A_P40ݏFYѬm|N.{w[g}Ҵ)6&n)[I¡įZRC(z=?E( -Fn!huE+^F~!(vL;8 ?FM׭[r%K̜9sʔ)[fgg:f̘T*,ؐCNcݔ3c 2Z4vrrT0 J q'´ܰaü?uJELBLN(2 )ϧhm?n-ʚ(ȢNGhFU;ZGS-GGǿ (pȽj*Y[E0o:fD[G~#<+mt-y]ӻ/FhMs~?JmxzrŽoz4mх#EsÌ;5Бfh_ M4uٝ}5fi٬&١'-/oqg]jTv`[2k}.F]-ղWWF>mN>hjԪȸenKCniY.a'.Lf!ry:k]\ةe`ůVjۤݶAдmVl=~z{a/"FX0' j8o1KM㉚VB=r,o}|SփW KǽGp$0lr!nΆ lVFw{sz%)bE<2ފb8'h 3gN%QYd6$Y|?,/"1Tk7 1 LF:p_XEP`uv1BBA(Yx0"9 ;ITUS8-1+ cI{fH ƒ@qme2B&΋aucNDˌqM$s1bjlw5cX{Ŧ a }΃) fDn]< >VDE>oLK_=?.k?K{ *E"]TA " `CT K4j)&1&711&1$FhI4JlA]QRٙ󜝹5~r^絯ٙ3gfvV\ >k>17.]v;ڜչowQïo3Mml\|>>>0?=? ǽw˗yZpx>o*ÏQx)?ztnsզٚ0V5-m:?Wm`4+^~s@m6-6U*~ɮ}gUomJnj6MVƬEkd{6q>CdžFFw~n4  w)bJILk x #A*FV~-Ol'NU0”r)[@,Bo!ӕml rA5V? Z}` g]jR_=/-ŋ)]`xe˖ MJ;zyqttܾ}/__xׯZҭӧ&&&5Jh)))x;"͚5 /'$$P1ȑsl4q=bcci񻘘T=b|8(IWX\\L_xwJ(gD ޅiFFFDD5 +S,[[[_hKLԻ DA閘*e>bWL }0tk4QF/N4<|%ǎ4}V6::L|iYLm.b#\bJ3Lҩ[,* iE*zf*" \^^ҔnᆯpWպZB[]rwwOD[=ۢ˃9h;8m ?/MGD[{M ^[sG#*CpSrcE;PuUxQ~=RWa_VFT6gB.u{ҫ|#aۦ[)w޳޳ivi<|Ѝ(!NʮE3j߽\9Vϣ>{^wS'>ڝ 5eT4\i|BA+mw1l.3j5sReIUƸk $āj!n Ҏ2i21͓Zw4ƝFl!,iK[t,2RM7n4Qg/2$2 9fDE;$͑.p6m#EbHpxE HlŅA vR$ '&0W`5a ^Q$38CG/1pE`3GCJcE8rb amI+ɧ! bfAh /'k) ⻥AlqK_IԭRQHKMeB1 O)'4>&.㉔N$QaΐAH9D( ա-'ėы3k^A0jRyJ!1jREH! %kfR) ]F AR3ye R䠃fS%ż2kEdJi^YwbEEUgS|ط/xb$ťe^㦽y-;]W'~§x˼M?6?~6xc|P9z9 hwû-VdVk3644RjƺFkP;_m{7-m-fm7Uwomrռ'-[4o=bv{yӎ+T&j#M!2Ш )_P1&ni׽7]].ާ 은˗=nRs= WkRv}Cʾ%վ#Ӿ+c3iߔK]R% MoKق4T; UJC9.R~kO`UEcd!1Rb-΀tX4yBCAZ r2 [s jab0!ϼV M ݲ6ؔ tz턍Ō^`V?Ob ӢJ-zC'@mn9r$q VZBx4_7?..n֭6mZ~5kV\:sI&DEEm¬HH['Nķ)55Ϝ&!>|L0AP OLL̤~Y>>>񔏥bԩӧO_paYYQ'vGGG|FB !C4/牧D/R;sRo.FOJD_ieF|PRQ/tJh"^6(҇WxD}\xPZ27|"4\Q2_t/ȸh#ָy{{= xH3XKJJ蜩 TzW^^Kt;]u.04v#* j ,'j^H iABНTA)W(yBϘm(H!1ޙsR"yR" NIgGJ?TI_ E@_صy1;\+&*DꏘdpY" T[>>*2*tHt ]eKE0&I@HC[HK$r*:R~&A\\Uk蔒)eSHPA?\I? G&k&s:\~6E%~]WSyp>㒾ᢿgd}j:TiX;+8;3Y>?8-?;>+7xj޺|[{mowDo6tG|O#ۛnafj1Q+澁Rwk "4/"vP1izd+v?aƜ p÷۝~4e9YJ 4l hBGcjDd#3+ -N0'P g5mVco{)wЖ-)Rj,mРA8H_t5k~m-Zo0ghñ<~_[7,,,>>>--lʹ!ܹs 333ёٳgiiBooogggU@@@DDX*Q) >"^OiaJJdQN~~%KCP}q[* 4)55 <&ShiKO!} HE(D'Y4 .}D@}%r-GVHHh#Gķ// >OgoQ2Qo11GZ1iVll, >4>DGG;< mQᖾs>~G;RD\^^Okv;]պڿPr_:V*K(M^y5Ζ: UoPLG[6߯0;pE*ROcEmu7 W]'i}Wv}ow+U+# mfAzGnï~Ty̺WmKTjkԶʈ]A!Lsaˮi7ý5ތ!Ѽ(>'ei)3V*՘ؤ$ vElD ڗegu"6K͕r%dvTgk\_ңyU7S@0^ #H?6hԊ'AK,ٱ[KlBZĕؙQd>>Cp `BF`S2 d:Ʉx9.Jҹ)D* {!Ƈ&)tq3~!)$M1VICJ.Hi}(dzd9 /bbhbmIrb yH@UA\x[y!#RA%cȀX1q6GH>d2 "\@ oObhk8b=HB% uVK達Hٟ1EL'_1+ S"(" ?2Xa=Ekh E)݇Fru8_S9rǥVm#Oԩ4ƗnwEjO1vs\qNOiSqd:_e_HL?!Ďm.x ލzm)xg }U}پ LuFUM{)z6Z5kIZ5 GeR:[UUI lT(cthqC}8fӥG^Oԅ8gv Ź4-)oƍ[`ڵk{}7m /lݺu۶mx!Cbbb)!U(}\<*Ρᩩ"Jp M7o3_hhhttرcW.''&QEuDԳ&9>jFEJTOhhEh$%b+me<;tK {­(+T·P@GwXhOQ;,܉u0үYTTԨQx3|˨E[/ ZGɋB=ClٲիW"N[/^.pWj] mu߇_AAh w7})wʗw接N,N5orV;m*%dJ)ljhf[V?~ZqܥBPunV>ǡmսԯnEn~\6:ԕ;.3m^ѡ;Mo}g|Լnwp௟VoܶҘ8J@diCmT3[ֲŰ5ߤ5δ5ִ-T/a`йNֹAFrse)kr wl$np%vw^Y5)IbdRCu!;E*őqF EHNR ),T|>JH?"7 .<A4B8^ jLr o3 ݅g.; ׀d Ҭ&7,q0ٌ+SnQKj e?C )l# nfR!3!q4pO&D`ϓ<)]%I&]JJ X xf<Ԧ~yd*T~$lšTEA4Zl G &YX~$r1c 4iĽjȵa5?j}βl"zGܩZ,?EnN[!QǵyW-? j5k:-[UYW7[|TݯN7{]DsƐ9VU)WIW#HJRmL1 kF}pU8_B?˝}lܫ});GJc#}moNmmE DH:f!H+ ԕ:.QBF& Yv< z'j T% p` zll(3))))//_d Pf*((4iuzƍ U oYTTtGעE|}}Eeoo9rך9s&ͻݥa5m5i{"ِ0:腥ϝ~n-JR;5'''KKKFFFD=mxΩL "_|, F]!!!TBqqqd҄57P*&o)ڢiEt2!\ '7n܈k֬x`uSo][-"7? 0_D[[{ec@{T,"OT(ÿTV^D׍_Fh7x~QNV9j[6`xn3,ޏxhf}|xgnWgў_rݡ#X۪]K<w}Q/?VhҐed8{[qKy7U@(#(1bHֱP=EkxoIVRmsc&[6l3զJk^Yf,i^1;e\I^:אKlEc ])$-Sc HHb\S0*V@i(Ӆ3@2I^HHTK zN"Y8,Eq9$dK|8*XIMtVkAH vЛɈ-BlR^] !f90$N'*[C>?5`"y1'6# "OA Y M!]5!Lj?F@e ա-bґrqFCgdŦ!Io,%9;3`Cf&(j.R &8`bm1yh)g!2@-/$$2F*B(T•tR5<=y]Dz|kI|JѴ;Ƽ{(DVZ`w XsRuK'侀vk wŔkQ^~}|~.vquUvN>jW_l^p{RrO h /||G壎NAx O ~I WޑL(תV߿ZcljT Qm:jK}U3&KLs@{Sޖrw%\5Yפ+2O2朁{SS=N>iwN'ܮuy;ջۼB5DŽ͓oL.9Pj&Э R $YhkTGs|}}Dϔ-ZxbxX ՔU@[x_^ Uy­9dkkkii(f+Fȵ0>9╴P(ܢb-|)6X>E-uA.X`"ڢ7:<`546l؀Uر+j] mum8L>JnLƂ1ʇq|E[*wlWN^% *wҕ*GPyGwm #o=}>յLNܶ{}|8,,vS<#=yccEWiy'>w>xۣYͻj~^L3P5H)Q1cdTnƪ`n& 5 26A/傑6Jj}dkʈc|gJ5 :5/42݊-ӴmiH!)q/17R ^KH[$J526YFK) 1qD]jL.r N5![* Af:p^F@!F8'9*Ұ'8vRŌ+Y{N#A9rrCP"aYl.2s>bHr8^'L苉׺<`+8"l:\ˑj/*DؑizAHtPxIܽH#$0/*5iP#r0b,k;OV'?咿aOv>rpMeӣ^V5]S;VԦO7O8}G#|w|I>{> x8{_=~]oΕ;CoGwVӜćjκ|qvEN0z..zƔV] JLaoDu֔g "g S~[iVg9[ zNv),\hn?R(nޖ]ܷ9Z&fD? K,9 mdee͚5d`` %***%%%??l7o޺uwرk׮B{hvtt322 JJJϟxb#ϵFbccU6l3PnN_6< }F Y999Ax@}$E].ࣈ='閈Ī :_KKK?MMMieA'"VԗQFM[kQIk,B*f;|<51KQ}PC=O˖-]NWjhwopϚhkYؿց޸^㘗cֹ/~Yo{_m5?ޯ̴v^s68se;u^3}]Gbӫ8>Z[SjPByq3_.zs`T4öיh d2mK ԅB^&>\[+ShclGefаs& H5$=F52ffR %مiRv} i_hvIX 1pshlV6Jő7e\!H(TRGC7^'^"} }i\cBB a ~# l*8OX|p[!R.%B,vb|`ZpaB@$:yw]7.+c6,UВBD("YdT .&lGV]=W#?;igߘl:|.#~|||q>w9 >2.OAyyk_y;=i}`gwruк]diOiF 9s'ޝFjVWWi m)$_GK#RS)O}[cV7͔olݧ5d` +<ۣmjwDM!)!ʨqurWۅ^[a~,j%h~_Pvp|4^'>6}*G1~If-u8}^閷&= ͲhdU470Ap ٟJRG5cY:]C:{o|@[}x+!Aj X'FF qQo\ny}kX}Z
nRtRA௡Cq q6666b=$$$""I&-^o]vÆ 6mںuuhѺĤZnܹ ,ҙ3gΚ5 /xd{{{ਨH|P;qD/~'O o<|c>A DtO<77-;;F=8!=U-QNgH |'mnQRII M+]"Yҧ[L|nQ4j(|\]] m(KtGsӠ_ bNhcƌdeea)k 1zWNL~/[l͚5dkʕ46<]!OWj]h mu.oނ./@>+ ڪtx2rH=Odu]D[ۆ}U'm4D|p*o|ӫ^ͪha{[swS՚#Sԟ3^wPlѺȴ%&mK)^xe[qm ֪B㶙nbڞm9Pa0SdEƍ{5-yau{krexqVrKZֶD=ƀtF4Ի ZhT9ׯ"]S&cIW9p$l 4Y9g>­ N*%{"I$VQ`E)Jw%E$Q1'^ą("0$&FnBqhOa.s>t2s¤]0r VsAzqCc=-5_s qw5^秾'S|ڧ|!>klVۭ!5-{u\eQUcW/[f&nV~.~&]~~>s~W|,E[Hzv??zmEnorNW8ؑgڰ1_2gU:mTҢTȤX­RW_FYpK$^ Kn2[ ԛTL7>oּB.qY{igf6LJx*#Lju.ଗzk$ 4]葮;$5t`YE0lU:zyr iǧ[caЭ 2= [l@u_ӫ d#@e/,4KH?P-~HUmB >ү ˾pi=4ݚm\ly0}_XKZTLd"AZn񙙙IIIQQQ .:uVVVNNN999&Lq_ZZ`K9,_|ʕW^n݆ h֛XO¿?EEEۊV$&&2O&&&=:""[󳷷1b^Ow|#GBsww4huZZLKZSL-}_)ЩDQlO>.sܹ-<Mv<_?iD|whmD}f{ͼ5|7,<>N·S 5|||2qw333&&V{̙ym۶[oOK҇x aRSSdP+Qkh/jDD.BmСODBSҞZ"]b Pth_S=A~j'>JU%*}HE*hOr=?Db퍯P!?};S,))iPxJ--|F[9uKT<">M?nuG[պڿOhۭ>S7ʧH;.w(:ɅCWpoWXPXcsm?ltXt[홞4ND[{>>5;=ݽԼb-Iݥu?Xtn3zt3fb5Ӻ]Xsza3Mj7*>aKmY YRhML=Ͱy)ie* 2f)jK]!n6E:¯E4 3M06X^`ȁX)jq*eII:QaM(k]$Ռ2`$Gb.6X& qyb#aD$9}e#vyh  mG Xt! Pm%$(J!T΃@Yl> Ģ&MG`_OB`6 qnȢ:|Kb#I׏XW!BODdGB'H]HIV aƧ)2V:o@$)G yfel$B< R8pπ%SHj8U}t8%,E"܂R(,_ +er)+UԲG teRz#3qW @F*wC HO}@>QDH>)Б)3V"TVwM^!!qb?:4\К>-yKykYCmvo{E_~W~5=|ZqI1r>{6r.WZ|ѝ~mkq[5sWqeT?}~A>+>|=1.7{:ahjkUk-k,kZ,k-8\kSLjӝA4_2qrcL&gMSuuWkY{ΤX0*cJ=Vz H: Nq3E+ 'U~8:h| f9mmLkA^ C>DG mumڳR(X kr1,LIy&vaM_Ve%2Y Nnu=OmGiڢI4:|kAm 2' 󄒋b)#Y:P `iuC!^p)l^UgVt-O&.0W; ~mfY ٖܷ +OKt6B[8Ɨ GK.,_|nӿxO+33O@jeddЌt<â"U\\ABBBƎ-4ʵ&OLիlق'f͚E h4( 4ai<| [(鲱2d+aÆ9::?H %ZO@xʲQnxd|...Q6\iz&zm*x"%Tx@nᅧ'?D#?[A/E[Hh<ݢ3gͱn@ Q4+E/|sWm |hm?emXB\:t;]u./4??5<Ϸ룭SsϗpQ"ںt֌8["k[^qН݊9hi_+m_ӱ۰}E[fm\mq~v/yu~~7n9U| }ц4.ֱoUr{a3[Rf7j-k{ٺϴK!CML3OV?{{#jޓiɘ5mi7HRR1PLX68C|^@6Vr%p))5m9Sv-!Ea.t6D=L%lɖq>uOB:R>@I|!G".HbQyڢ>ƩDź.R< .3A ³R͐bdž[H#I$E:^f\ɜ  !  !#j6 9$6gw#FPWq)) 'y|$ tkTHr"#mG>H1%XrTCQ !W$<>x\sWB: }!7)z#'b=5HF%G!b2WF-~!h8 J*@bdJGPb> %цKX>hl RZ)AHGv[H n)Б1x3E E[5u@U7n(/U{yxLy=#wIk}Ώ=}ˏ>ɇ~F^x_iw2FGC5޾?Jo[SUMz?E~[4!zmQՖ>'ԋ ? AN=ߣ{nٿnV*^S݈3@y[W1:u׻ܩsx`wL;~yX没'{AʟEQ" qGQńH lxQ+A+F\Tĵk- ZZσEI0R=%hh.#Л8mjk"As:D\=!5/HPd EC\@G[§a">Z"Vqz= L*/خwT5Em: r'Ж[Wz5O-G@[v*})(InD+X,t6.84-uˀ%&"VhhbhnӿÇ_`7o'tssVBBk@@@ttqfϞXTT4qDdcc7k(h oOMgΜpB<{|ٲexbiiiʢWb?lذ|<@ZHΎ:l]\\g-7;C-j[DDHr-(D[xzwUH33EUT,G{-,oSJJ ῍—R>gY@UZZJK^ҬU *qh6"~KPfO8}?|<2>4~[MD[~ χ,}bŊeЖ/_5 vZW7E[Cj]ߧI :[ZWNGhSR:tJQD[׿PsWǜaTmUnaؼ׈G[v\`8њ> QձʤuqkAl mju-(b@un6ݿY=~۸n 4e2vD;W$Aʏ:A22mi7H3deFuRv/$z۷_W8_8_w1hK 3ȉ4ju<ŏ:QQU**~it/jh 9;32_ '|2UmQ5 }Rr^shvk/n<ۻDԞXuޮЫ/U{o;1&l[;oX7ܧYǹngէ4 2N.#sĿhe(2IN8(h@;(neD j(w[bm$D ^r)f Ru>m<<¡K$sE%pt £ZzҪHXe r鮿hxNĞ+*pÜ \'مmuZOqS\+z0\K zpI wuqr˃ݷ%Kіܹs_ ggg%K֬YuwwOOOONN:thPPPll,^C5p .,**ԩS'NH -K7ydB3ٸqڵkW\4|f&RDZNT^i!QFXAZxÇG[ԏKD[bb`~~h%fREYVhhh4|nnnt?n=m9{t+3n->n/ҷyק[e[צė |;h}L|)|͛GS?bВ˗//++_|i" }mͨ#𭧜S|F -5[@[oC塥=7./BWJ#J/+PO~xqI'EVw>ePդf_{)ڪm]hW6('o%R,4iKV#S_ЗES懶 moth!-:5S4tShK%)wq;+QGHÍ42N# j\)d޽Bb(Brev ҮhJO ؃fȳwbC!悉M$DjO bKzR RяZ-*HKr7ENdHW! $H8ʑhzȎs"~$$BPƂ LV j4K$wBfʍ0"2)O$xOl_ENȨFȸA tQ8)"($4Ee)60d]*g$AJ (dj<93AT)Hn$P("RZ$($WQ@VrA E1J9$3(.QM0PS`Āˍ6*F1T#eݗd>RH0B6D dLGN;P V7ք,_ZFݺQO㕸"O3A?v\pDT,oX4_x|oz<I5,mo4Mnteە_;_yg՟i>5dh/b!zd Ʉ59B~h$=]GH`|a2Au< ϡkವ0ZPL201;8P-aٰ{!DK J!>fBh@Lb5 *p*ݜE׃ML\?Gs}ʄ.HRip \$[9 S ΚP.zR#h2&!RhJ;Z_Zn}pD.5sLmmz&ښ={ p~??77.ZR|X???''0CRqUmxTU$(NCzWB$`]TVǶvqP0wosw(<9yܹsϽ3~khhhlldce˖-_&̞=RSSXza+22rʔ)'̊%[nnn^^^1???oooWhkСp dpij!C0jpu lȑ0E[pj tJ+.ؓ7zUYYilv+.mnIbcca% ۲+wx&jJ8ںf͚uӲpB8; % mmmذ=G9xG2HmiW\E1 `]NWj]h mu󢭍)`.Jwn;ֺn׍ߤ}D!5F Î{{S{{.W<Z#[w~. bcSKOEYBR /]{tX =*,Fati*bI (.F]݈{:R,]2`If\<Գ)3*  Cf #I8!lg C&&"' ҏID[Itg1Й7&9jq|Tai`hX(h;f9Uu)ByG?_VI_fգW֐EYM͵G:nN}֔ǘ8阗 QH(t2?ۘacg,iۚ-ÿS}}qg{u.3/}*SiONl/?exʜ%v[RPeIcIJjg%%~vx|sjԁ._w`{יzyי:Oƾ2}}Fo8x/=:oy{7_.eo|0%n G 2s_*z /C3&$tl&U4ixk[\.#6K5Yfw͖qM'M@8Fsi s$^aJ̬{oD[n0-$'0+<]NWjئX4>v?NdlkAl.X+>Wnn#Ϸ:z࣠G qpOm6|Ę 7m?=]O.r:pF[ƅbOIn13ڂjCycKC7.q^ ֓|Gd :r?m}^t:o?njLJP<8{sb!._̵X`o\hbw);NA4ՠ@;˝T9U(LG!UI|IHҬX(&/d '])Jxm1r$%DS4 9S0bx 0o #* 8:.{G-BJtk\!L(f1zx!\^i#=>(ͷJ=-NH(V Mf)UfQu^_F7aN!~La0 T%:[pc\k]2SYLЀ}FqBHcɫѿ jL@1V g(-1i0( si5\q)]0mQ`faܠQ=\Bw-Œa8 M>siEBTh >f_]r-B[qg[@6iA] mQyRG;vy\3gҞ=O'>{&y[>blz ˸ÖAG,]?^k`s}B34Dgy mOaW̑Q<'{øQ8Ǚ9~Zs~pՁ?~61=t>_tamwJmۛ7ۙ)h;4输DS)~/ " m D[^[&QJLdbdSӭkMCe,"`\6R~9/Re\d":EV, 9EL+G">Ek%\ r臨Yf3 XD1J\b(gӱӭ4%s7*C+3NTH<-"s#"$Tp?YH#Я(^;\!K? r(Y%9֎I;.w5k Z7'y2\m644P-5iC /..NKK 9r$Β;آ-www9::*,,E[U.../8#ЪK؄N0tP777x'e-v=z# VRR2M67lkFF  D 0a\-apF[-rvvmJjŗ6Xɿ\T[Mlllʵ~px`7.[l…---0 eH߄ۗV̓G9^]&܂S޾y۷C $(F[lhvرuVSrJ{ȩT* O/"U9fScWWպZB[]? T͞E?z*zg׀G xs8\E[? VB<\7[u&#'}{*ꜩ1@}i0/=9(g.wSޖ';N͹=|QS#nМ_4NʙusƜ1gkg3Sc5Z2[s;t!L^BR٨GRtz9YX$Q4VȆ1}|!լWZ1E*ZT QI(20*!@y_*MXQ)eR'n9*_LJ N CfYrN^Xv ?y iz)BhA)dΥp%DF Gڛh̟R᳅AnMD Za^MFh\ ,5Q 7 GQ-EO 07 ]*F4T:i(-8 =؍s(߳z!J2z^ BHIZq(&& aBqj6#݂j>o9^|n%`mGb>26IG }.$tBW']AKЖO(M؅7-=y6i7-k:nRߢL<鯦{;KP]Ɯg?~!,+O3VX%_kh|'50{ŘLwzݝw]9)w,޲a ^Dl ^DCc'GdWwLL::t.Y߭[gb z[qw9~_Á~';Gs9űsU7ڛgڙo3/SeFY<\jv(i)$6SZtl}Sl1Q}Tf8NmM'~_}U&L1(å4HM'kNr_g-[S%dL KΜ7U$D>t.)&hUvh>\ A?MbJ5RqbI4_Y:rbYh$tӈ.JmVǽ+]v5zm*nH?@[Y.q/[uuu]]C xxx?ReeeVVVXX،3@U42;/""69*݂7EEE0rTTyϴ̜XRR{N2qּy"##a,222FZdmmјkA)IIIϹ@mdC1br [Tu^˙ 0K 炫?'RTHu%RW[2&\WوWl=ڰaêU,X!p7&LEϟ]qD۴D… ׮] cj =m͛7k{{իWX#_\f c| 1ᐕ+W(Y!v;]1[Aﺏ]7:Uvh[{];{5Wh~~㚃^{~};5p w8+Z`9;'mwc #"=%1#z1ں00I 4m KvwZFr C (a).՜&GD[MvB[iDUϕ;bl s>"UhUHʨj2`@yMs'R/$PȔ zca(L z#FL@JF-FbYC`\8dQ3+ iVFf.g *چ" Ħ-,mAޅ\HFFRG+IMj ˊ?1 sב!Ɖ;)ϡBz⒲P\p"LT"hn.+LBI ؼKT> ^۳F/ DNƳ9La DkNV>S$ߛTBL|Jqc8 L T8WuhEOj7>є.tGƎȵkC.׊ Z(o?+.ĻmuiqkÚVoj-۵ae,--,M, 7YߦLSG)ORR%qKSg,i,zse!,c޲>Y oW&+-w*uw+*yZ_Dg2se›,/Ymvv}?c#3_2}S >C8:D/gClWOTuR)\%LgTŞ3ic M@~g5}UH6jZ$khql(iiGѲm}8DTTMBAn\)mM̥cѪũ*qܻeWW{ilCR~_ mAd *2rUU^^>yda(!~`"ŋ/[lŊmmm\-쵵UUUaaa%%%q;wܱceh 9$&&ٴ҂̤__ȴ\CWTLHH`z=W^^e̘1pF5pСCd*Xr-fχgeeL .' іZ)5kA2m8QmLXΛBLEt2mRH aÆó|TTTΩ Ra8\, TŗO&oy zcNmgü3S\9nO}̏UҩZqdsw{[h˴ cm]єf 25 R6ఝU,<ӘJDgbaT݅*;>/όGg?υjx\?υ~.so ~} ;m;?S!"DeF#,a@`ɟ|)I P5|YIRzDŒ&Op&hO.}h46YFIAG[ (0I6^^kEW2KoJU+?Y #wR%C HR RdR,itX%aT| Zt걄K .%x /t颲2ƚbl]m7Pw>XB*w%uV-F4+UF)z14IϔDt-=#q޵.Zc3/ڂi###SRRh+??􆆆[[[wP6…'F?~|bb"L~>d۶mldT___VVI?44QJ-榥LJEEEeddvf̘r!8xmllljj={6; { 2ffM\*хeh  و,Lb`em2ڂKkmD8m\Kwiї&WX$ӳ0ӭ˵[Wʴld ,,,[ ˸pBK1SMLHH`.x +7v{a븥-V˾h٢-UOxO2ټy3'*|Ͷ9/%0&}M~a vZWB[]h/4ɟmpB /ꫢ/_}os|aˊ-#е 6c[N_zyahFe`X2;JhT/^XÚ/~~aPv?ޙkoX*m"%c0c+n1"8$KlaLGw;WX\l_,aBs#ͣ B0OYJPi0sJTbBwKoP,8H碮Ta4j9O f \ *&NK`ʐR9Sac%9a!.lB1 ;F C8w0k1}R- q0nB_ tї VEG~KZ!/Iʎٝ2`WGB"-9Nڵe5[/y=YG=]s$=Os aфNƽ3Ƽd~%=G/,㾵2ee<3^6F>ؙ{N{ѓy?;|yh|pOx|tc~ 1=QxtC_}7Z~zk=/YD j{rX*Ӏڞ wZ|XK2i2gx1\6Wҏ+V4ʒs%ڢVOr #:V'HNêy2ЊT3+H Ukz5'LpR)dcyTA\<іJPi'U0otkf1a06/Oi :7=Β#sRo-::cLEL  u7I?cz#5V?OV`I^2**^Kd2:{!]$cXmfښ^ⵕW||V744̟?[BhkڵV>xƌcƌϟ5k֚5ko߾m۶Þ[MM 2PDuu5sF"充YYYjϧHؙ`z0L LHH,lE>Uͯ-ڂS^[L8hʔ)UUU&  S  byՑO'rr-+\ڕ\ %0jÇGSSn]<ˎUA$[̵ Y7- 4%%7p}||`erssa;IE[ _@[&j˗/_`ka#ɒnPL'eaɉ\D.'鿠wǮi? jf\3(W ݟ{R5k;w?C?ϷpqnPhn:=X͹t-S06RU8: 6M?v͡yNرdі)*AHUL$njuh %$/$k#dj\h(O#a$$CxJ'` 5/RdpuCULT!q:apWM듍39hJE߈ib) 90EJ0a:!"Gt];Z誑: څ g t2c nׅc! `c,F轄SV:B/,]ʥ3+|$莕GS*"5`0DJfHCa>'0QqB)1°=kY0Rb0^!Z~0 A%/DlKAXQ7 噱*7o v83鞓X>k)/|; 쟟/ }tB߰m |3,#[\S}eɅ#TSs'<=^>m}Gx}X2Ч>wa~5oF}ogzOtǧzϾu[/7crO\w77ү/I;ĩk12 Ox&a@_h-=*+C_̑ ̧qMxd4}=E]ɐ*xK111**jȑLV\\\XXrr2 29s̛7o\bo>|C^m6[eK8h  Ӏ۞T4DApR8#\3U7Nҭ &e[YWZ0cwjرpC%KAZz5\&-`AEaTe(WAeX^[)<l  .]t56׭[ a\Nʏ'*JHH~w]u.ՅG4hПmV7Gآ-cNun58bw`O?}>/q¡cáN'ov: ޜawrƊzYu~v3Z͉ev u1G]Cm :j#m B$<4+2G s4eQi-W@vX)\EY+L܄fHr1dW($60OG))Y tl,PJ(qa& 9M"{t/2' x) ut02avfY}rY9 ^T&$e4^ "뙽Pk/Pդ([m~`Bb s%G>\y?,5DsT"o(lSpa͓L)Q(3 Us dYVÚj>*DPf\N+Ά6 VL7C@FOsDe*ݑx:dlqb0F&ց0P- C(ɔ*bBdcP&ď< me+ rіi1Q{T۰О1'L)XQј. 6@N\8r*s.2 m+5aYuZmh{~*0r-"oy^ޏ|~; YZ|?xl23q_(>~ۆ7v8ѯ|_}0ft>_ṕ?={.Co?ͧ}2:u^z /_rO9SݔiP k@ezB D寔x1V̠G._fGklׅĻ8ǖ(Ŭ#U ̔.s4@ U%J, ̓e#hb>Dod' |%RbUpr$&RWA3b:<7Vʷ"ipf6rJck%JH3V,՚Yl-F{Kc4i)'5Cqhkyٵ-!y݋EG*]9^1 ~)#]h_cឞYYY766Bz͛73I`& as$6 W=`VR]ָ-`XQQQQD 3foxxx6Lj԰ b.\h"wwwQJggϧ-݂eeeSSSpEEExyy-,ܲE[+Wq qQEF[Z!>RH.w&*Zo_~˖-lŐ& 5]aU vZWcӖ>>v?NhKYي\=HW%KPs\FE[uiC3:8khpnI7$hPӣ@clwBy*:#5GS8\XhU߯ڂOŐlqwJі-Ηë!m e҄dw)*>BcO=A Y5 =qXOT-CJJuF[MD8Pt $tpڕTAo1tʣxkU238FS@g -zFl*V-v KQLTm)̖)T#2b2+̰VZ([0.fu4fQN0DyO29(pjBt\g4+6tK#ɝ%p8CS>*G ]Ѣ9U hB*;S"Vm?a ro B /UMk0^nhnh "} .8)݉˜^z_ ?PcOq 'X rhe)CΉpaL 0) Äqe)[q.U[Hbb я4Fg~r\㝱2aIɦy3v^wVԻW>xﳞ>#?:^ {{}{ O?1߾5W~q5kx߉={# |mopםa㏯ >ʠ#/ <N?=hA٩AT.!L .&HJirt ),'4Do+hu1YEߵl3byȔjOdF,9@Id+RdC,Il;ɮt*tuH*|rs$RIWaRQI9*BDOtQdIX/V۝7xFGSm ~0D2aYVeNd7*s%*%_w_a#aAI( zli}7c|]x{ȡל8'~{{{u<}~zSw\7ċמǵ'\{'rwzGy׹:ݱsgv bդbRpr@ hTڰWSLүVe7XxUshK-Ǿ*M"jZ\n6FXӥ̚l!Uʷ, ˣTu.v%]ಟ\l'8oRT 䪲~)[ҭ2,Ys)bX]}t6q }cק m% K~0 TkBY? NYV!18G)#Jn34 Fn JOZi;aҢFNA9 (&dpxH8_:D9"SևDyԞ ~MS~0«5RnJyBh07%ܨ(*%[{wa*:!.f!+1Y0KZFYW QRBt}7[C{%s Y%3 eU s{b0.'7up*2$*\aqK"$rx% mB-C vc,n0毹aZ!ԅxw C=2I ڛwշ|!c3tżFG7ǛvO9yWc;t0k,Y޷m |%EK? Ԅz~}#|rO}O?ߧgi[w8vֹۅۺ_{0>.sO:{ ޜc==tas:qnG?M.7!YFT &JNYXn'&I*ho4.J{YBmŭċfKwX 0bP!8鎕b~Y=#e.^8Fsrd+K۔M%,Q+. $)f5f\K-sqteR>&eo,VF_0?D&^ &۸~"ydUO)ܳh'8Jfh&Itzz򮭕ڼF:E%ͭ\T(mle,rcImL̔%MlYޫ( >N{]vjp}~5z,plO'Yfƍ7o޲e֭[8#,(((111??ʔ)B![̵dqSͷgϞ<d̊+MV]]ʹgĈ g}L >aWEEL3gCC[?ת^&M㗕रp4X &x{{G:1n0Um&-2 pUDX4Xe˖-?a#Y5~x.y%ښ3vn\)g{P+ tʕpuuuP²3.> 3}tvb mq6"7xc{h &wF9>R +Lb !.ի' YG͘1#77#lՅZWB[]h={ЖژkA[VDv]/A[?E} ]04 ãxvv_(t9⫅ݎhN8DZGAg;~WO?1ӗG~{.aKPq5"154-vF[PgRa-tA9Xmmaz>K^hag(ȯPDR 2%cć(|ŭj@gjHJEeLL!0bjq M:Fb֞2b р}qT\}kt!8RxJC 2ʩ19@]hz 0pPR;VrJy=NQbQUB e9xLmJWa'b)@ !ݚHY s0[o\3ݝs9G"2ʃRY#,`>(Œ* k,…gƇ/ ")Ӑ͢1' ! O-n6ݬmzD;*L;i0nh+ yX)ZSi' mЎH"eL /nE']%1Ov]~3cPKSf̫loش>Y٬='A:-O8R[ש=_:peKO,߷i ~ǒ%)sƋgc<я^_} gÇοh~Fy@ܩQn(5jF([4r+}tF_ܫQQQҘ3|;ecOeFYYM&OX{qm B_*iUȞ/kh%_uaEhk}T-FlLHͭX)[Z3az쥎>(wNd<]D[qSPEe!QtP$DxKq]fJҙ*Q~V(^0"ɤGbKsm*9ReKqi6$WЅ4WӭT+oAR:V0^GE ]軟BFKX G%Z*~-Ѫi2S^&H^&'[Hwg}Qmϲ+,hF.j;?4n m&1;[n߾}ǎ[XXXzzzyy9 ?222...999##sJKKmG---&MZdIUUxic3f3OMMS)M hsyfgg8ĴgܸqcƌE[7vUUKq1GX^8,pBB3$vT:n1` 6̐Ϗa{EEϱJrssa~ qy}|| '[tRi_l<p,#F녉l0\ LΝY&xXh OI3ٳg= P02LMK Ld -..1VWj]h muUm骆kcb YHٲ(V>!eS7j훅>ava?o~U|Év'.̲! k{Z?hKP$o2G)G Mn0h+d0ɛ$[* #SF[UhCXޔ*#ܕBiƙÔpB5QheJ@3SX|vfmZCz |ahBWh]Pe(DRfɆ:/5| 47`JYDSЖh{A)25OY5}U_/z@ :w>G\v}G{o"+/l~w9Bc]7u山YKwu}ύ< '즞vv[q^?=uI]co_wA?|6F|>wVT2/CFמymkă47^RF8b;M%2i&F 8 iD$arNTOtT9b )1fZJZLW#H ˍB#|,&qG~Y3MBb +ڲti(chBڭ.C$QiRz/%8"ZV"M&4X`};"V!k&9=c5WϺ\Z.jzFuMbW&$\+\#nl5I6$'*^u3,XO085!!+``d8ehk7Zp.ҭjٮn-X.GȤHufcoիW[*ja7HWI\ri͛N,O bX@UN\]q@6̯YR<,4~` ]hu.ՅHh4nݺ9u;͋_O7O@o*B_a31 BߊXRY\dXL}bv8 T/.4]iQphӾ{|藻~PD#Mh8$ X5&#R;zqIE[0r0k1Oj"F[7glF0c-,V$Wd"Hi.vSu`Wfċꈙ:Dq`:QrNj@%G'!y6<"Ttj*dPdUDyѡ=\J "Q*b2BxLC5x TB iSBDz&!Y|M,+RIƆWIt a=/1u*وCJxOa aBeuheț=Δ4\䉙adg5”+tBM/*PFeh O4 C+-ST,6s #3H(tQBjme۴Ko.CkոuToHDoJZfL㴵ao[~yؕlA] ]$|eo=hkqs*7.\{S޽$> {+OQ?rၧküngpVsw;u<}O>K<+._uQ_6z|o|7G#o "DZ偮[IEO ̕@db M ҃٢rHsh6QKbk装\ϧ`p*N̵"7$TZʫIWv.d)wƭ}&]#Ut[$;Z*Te!-`ʶʤ?p> WX;M8'3KJ+\+3p͢|#-YZz8W[JKNJ*\I1Cl_z$\GtCʪ*!^{A7nܸaÆV[ZZ l,N?YJKK!2d# jة/eeeYYYLiXcL?ȤJc1#5j԰aø!c+ooo>hQ/-榪.kF[*cO{`"&sZZZM2ٖ5r3g΄b-645k*))Qad>,, N7hQiӸ\ j?G~v%\} (uK3vڕ+WjЖj &$^bK y:4'nQeRls4{9́mr ]NWjv_лcWC5Y=DhK;Տі.eK@W ] 4a$! tL RrCJ'bDaE]& uԂ4aIh Xsiuŋcޞ >2ʐݬ 8=Cb"YM3p6 cm EK+&u\V˴o7A AA$Aq(͒Rl'V9NG;=-ӝəɛd$YUzWT@%cEs$Sֽ{T){*8W&zWV䫀XeM2#x(ڢ)h+ v *F@qy*E * 5XrfMy*`€J̰tjztUM*tUt~ZAuEVv({Jӈpa.NW9Td{{ 8XWVČEz]j@Wۉaj=.e[LM@[mvy$Ua:gHaHvrdp[L8w1-awk7TZb7N[m6$Ao_Vcmmت\:ii 19j@h2U ˱ AeD+X[¬RF PʸCY;+3Rӭ$TNL# g7 mg~iuWvtw95[?I_?W}^_/{V[/}q]?_/wwvߍ~h7O@[qe0CXA)Z4>:ưqڃy=$@K:|txNGܧ{B͚k%3pƶ/L{E#6LJ =b<%Y-*l{)o-3H L +:iH\o$I~dUr>GևŊuc+qZkNzdQ!4Shҥ[@~a>z+MT^Y'_u. )Dqi-\.[$V\MmЪPpQqffgg1"q ؅kQ>==Mѽ1U__OkkkFFFJJ ܴiSddUVV666vttzyyK \;#z%tqjoooii%!D^I"ڶmV4/עv#%u֞m'm 6ojр%7WqU*((YٳE[7l C&҉RV[8ݗV&>> ݂nmiµCE#uy֍ׇ-[^&M̙3.\p )+ Md ͣ(;O>MsT%֢-W/E% %%%ԹػI~;rI "dߊܤ[j4'xz>x LJGҜ!jB[!j)qOj>|;U V#@^Ж?'yUF.48sxTNwu)f2erXUF٭8ٰU(TF솺kі’@)K7VXvR9]6Xj'`8P^<>xc{+{9kU.b{Jp$;v9C*ΡB"|rW̯]2>vũV~' \$3nӦ=Ìq9xB]>Q!Q5 `:V6-kuApPKR'[G߹şv{/j?!$ {~vSw7/_y^|/_lWo7ş[tOi(t$aTåUiKq#j9PG).j˷82EdkEiMΝ+3h̗Cw%fwKOF[~.ڪnNKy9598aM `(z%9wM:|=FCeɼ^%O]XKH2iMh4'ߐ(/>rG+̿f9 xPRը ͤrkǾLvHS<6mG1TP|Iy-ju${n`-ס13r-Ο?Oht>K.)Tokkx"}ڵ+<<<**jӦMwNLL///kmmL1??/YZ~q=[ZZD0#ƕ!vh˟||hPL݅\q\N(bʼntb~AJTf┵O0ӞS^k,v}OBV2Y9c2"q_}o „{R`U*#Ule>u*s%Of2IV+ bcFZT3\O6V!m)_~S3γa6Spa9<ޅh*EE9O![xQ 5+6u+tسs-es^dHGvC<-6ef,ct>]5px1W9?vܨ/"ۅd N,Jٝ~&Oi<6$*6ְ2z^sBn?*sbi)ߝԢ]jO +fo)Q~̽UYe?= ^{>Tr%u>\*kFSWOzAUFt(++YEWQ`URREec8Qm'ʳ 5}tŘw3/o~_o檅0z˷X[q^/;ǣwc{/O7o޺ +mRХځȈ!щ`+g+jZW3$6su_iMU;[adÅ/ߣV>3>ݿpIE0I7@[&bח͂GN p˗R<Օ1M{I9B[*#_^>`څ"M':V߮#[Е1s&ܷV+EKqlm)G8-_]QqG ~<Úh ݚ͵UԏT`G)iBnE[{nHh"_җ.^xIN&?I?m~qqQ0$)ԧHhũX|Z"q/WߪfqoK2h7ph+P):2}KW|'/^KUmWACu5&XONű҃`smD@zd%k{cce'pDg-uW=*0sL ZJMfҌȧKBucTİA{8`PLEq=ıUpDy6hoBn ,Hbϼ?Q;oEky`lY6iq%!-W 2lV"RJcu,.1o`9 t~K2NeH]J>V^ҹ `7,h+99jg _rΜ9Ӗ+ q4҇_tŋts6m+.R###b+AB ymNw>CZjkU*"ܵkn4y&ү.Ze%Z^VeeeQQQvvvJJ ͝F䇖.?4:hK6555===;;+!0V)==]Rix4F[.r-=ZsZm7'Q==Bu' m 5Z%ܢ]zٳǎyIҫ>]2>>.".--aP[)h.Hw\,QܭB[',9n?~!zGZWrhQicP  PTV7`(2*UKvpa {mgHfqMs`)raē<:j7)Cxvd EL.& Uf}I5Yl`qY|NM PS'_boiP:F[ne Z C#lo- `.4&XK]EA[:v*| l֑me5.\D댛9u_94®F$ #>wd}9 \qC0g,rLr5+%#!W{Se;2[rf7G3C]Yg!:l' KvAm;f.Y#, dA@6cO‹f!t[2;tԈgOJDM,mgyՍ٠TN2js;YauR I̅>piv)~ Heƣ@-|)?Y0/sX*0|(.~ bo!2A}~"BR<ںG+F'Z[jvoqÕ0q(e`Icn-0XѵV+AZ)֫0ǁ2]Ҥk\_͘_ Lf\^q)#5V(P= ^-i. zn(}\k~r%K jw/A[|ņC@(K@[yTm5~z5#i,)`k@[5x4։,${aFH]1on^L׮!gDc$#߉Y~ǜ ua D&rz0#g(!a(6|Ѱ+ձs֤zNAg{Cmމ\ߤŽzܴ WKm%%%Q/tK.!!Oi+{eQ"zY\\ٻw/EΝ;{ӧO:%h۶{ڶmۚE|%fYRِZĻh˛^J$QƖZZfĬ˵"##C=\2lA[n6 ur,???###111**GnܨC)DH3x¯6E7&355%7A7n徃ѐh}h<᪭iq( p-kB[%oĵnt4fګ4I~*(#QѰE(8K5&hZXXIQ+Of-)K$ 4Cz]|Q v]4 Wi iӧ,Z}۟8B1>ihA-79Q52q:C-`\1l"䯆";GP~,k&q1}ȺUe.iEofaו5>'YC'uf*|YWc(#_2Xĵm|*CYIf6b6+`8-F4}Xh]aB$uŋg: OU',K _b-ߊJ`cM"'O;FxY GHa#WS?#ODĚƑ]0&P@ADv&Ka8p߂-t;F|-ڡpP H/,+4/!ˤCw7Rw#fiV=C^"'a%?  je7'u&c/QΟmf_jp۬_LAd8mj & E_f1 cuz@R9~8oQvحСTHQʚUqN)5rC_)jdw-,x T6`FNyՅk'D~t %DU Y/pKv<>Э= 6Q\a]ՠvoZC\@K%]%Yʩ`kfrk;^Ml)FW)@"ڄo6drVmŁT`A4֮n睚S OuA'O?hk&cBx>Ch\>5w,IJV.}U.MmXyA[8S6q:=(i_h:COkwT_ucuhna/F-`Qf&\%'?Nvtj[FO<,|u$h>MrDž{ݿ.//_ج,dŴe\7~)"zuӦM۷oGs]|InSSSEzz:݈nWPP@=H\*Y׺U7z עwbbbZQQQ.[yɨوn"ƟMaPԪon$rWe.0"[XXpCAPE?iѨze5\q"!uE ݒTDZZ-/ע_.ԒCzRw@2=;tԍ@ Ep5Ϋj37Z.qe[) bb&Ӌj$Fwq蝶6%:wtyhEEEH'B-Bh+>;h򫁶&v 䲲şe nVA͞KQ(^l2|a#Ҳfe^dW(S𭖬7PW?.Z1Y,1bǹ`V:MW}JHϕ3h[*8,(yz!*a1jmq2H遥^FdGG SKeD0pVm^: /#L˩jD{)V#P߁UʟMzd:t> YfѵCcV!%1`:zaQ=2ezh>~#T*:yq={E>j+EA9Wj8b%|&`s0A(Ɔ#g}2oЭ3TeWtH)mp\q*0ʩ,xkp=_Ҿ楶 :3eQ#@$V+%[8%K- Orb'FSRX"\xU4akRr[3j|"$-So3Cp f"6򒂗s:tkU`j#qs(\$|[#څ(ЭhVaܺ©5ښay+)XDI%&]=+>͎Du x&=+pnjHjtՌS @]ctn'7i-t-VIyujV~4~֎&ĈUBGG[qqqbm1&'%%!gh tXGFF...9sF@qыCIFR^Ğ%NUDDnL .55E[/Bbee_PP \K̲v\Ec\E%^yWD?+**hH999鉉].+[mmmz\qS]]uɶǧÇ8iqгnhhXk֢-z=11APW>.݂&Zl Z^և"ihiD[;ݧHNA[?*0ΒS,1&T! R0Jb nR+Zxy2W˜)ftR_:sذ~|RF[Wm/zjT"Pl;a Ж=d:d堭2&a$ZyN96.7R 8X%ĄQ z q%D)ETƚ`,_I էQX\1]2X.N\?wr,ݺ $pƌV.X|^&[)(ʖ& cxUa]:KK.8BPb=y`ј$xzzQ @k{ټmu,tHB b@1#&:^%oz00zt 9վ][o v*o]\unN'h2+יJQoc- ᄌZ_zIC'HYxΛB9ex:@{@>Stb5z ̽.[+ΰ/2pʲ{NLCiR=|l;[[IacgJcNxz-*BF]GdeZ5^+Go,oKjsV1eK*u=<ͩ:543[*\:3);еgm2)jncz+rJp qn#D ;[({JVg%GQג|QUK~uJ;1`#obbb(^OgϞ}'|ɧ~zYYYJ9f… ߏ?NؘhZ(DWEFF%%%O0""bΝɖ-[<;ɭURXXXxx8)hK̸hkU+rSZ7qF^Z4U+ߢniMHLPt%{m]]&4)XVV+wm)N"I^MMMAAExhk!子r!n8q̙3ɵw-ע-ZtZZZz{{W-pVYYkUTTd떓㺖9Mr}Ԓ>݋~isssd%3Q We#1 J4ڍb/+I=r<j4Z|z&8H'B-Bh+>;h)AZ>9|סhßmImRvSLq({p=\=PN,d(EYLì*)^A~-\~pS~w{eq[0\YU7yF[VU`M 9*7Vg&eՎ,Yyp8P VKH?BD<^qeoVPyIQeG0k-T9t]`!d>V8rham5hl5D]ЃQWT C%`F !hx.̩&VbucD;& 86#7%nfb}X'dE' jȷqߝ$WZ<3u7A_9cU GK1)$]cf86}fN~g5lQ \TU@Y D_˖YNNanO\ƭle5ߥ< kUk ‡?EAci4|ЈdX8#G+z^Ixw%[i xHzk\qQO:ϡg4(nL% "(۵X k  p+h葈d[MDsN+qצ>U `H1*MXؘ jQP ΔլOӎ[Xa|#*D\VOYODnTn:6x79ڪcօ{au=DȥkvtVlw{x@9d&&(Kx,=\c&X!|MꊴpLcy<%N+tʹSIN7]q肂uI1>J?y:Sm⚱ xt>"MH}Id0_ugϞd|TT/J0G2*77n$mI6WMEuMi"vt_my[µ%RФ^Ж`7qJIETD|'ڭULh hROn20/ڢ]uرh###b /-rvvv]] 5 `XRн*-ZhtknU^%(:v-̌Ս/C%\b jy#iGӧO?]qFF]EWdKDh+u?SN… }4h%6>jB[!jh)B[r6:C[%,ÿWGЖѦI+sQ3ʜc-ތtȉMl!e4YRuv3{Q&u^ßP˨_|e<,^[hDQF[Shhk:s[}~#K^A ᳨w 7.~ҞT˵ɕoujIu HR=0dQ4tKrMʓ-jSS:xbEw^76i?VVqkNݣq\.PA_&TA7v=*>С9WIVJlR huGdxsRXQ<:}V- mHR٩2y3x'>ݬq<;4_^^ʑ9} Jѕ,0/B$ tRKƴ:k?{&9?.y?I? 绻6m)V|wY]%)]RnjjJ:ٱcGDDDll,uKEϮ\StBQQKkkkN"b%hn*F}Z.rUah5hT G1Ш\ֺ t:-944411A>i$HW-깱Kz{{B ؉CE[Թm8qB?-uB+Ls i"DbKE[^%\KѺh577 UtK1ГmD[˵A{Fӗ4r4qc%nD66Z970X匋UpTq3r4(y ZZmE;ݖmEtGeYNDqHXAٰ`,to:EM:/q#eBnjeCZc.sr fg*f9v]4;wAY/Auۑ%ŜY X@v!UwY Z a+qwx062*(eQƂ A4a8@@2Sf^aog6!MqqP֢-IԩS.]$kqqQT+t͛"""D.Ζ2yhuuu***= \.1 و}sssSSߛ긊kQPoͥ>酤^%hK8%dѮnxyS&K-t1\HZZZĎ"??_@4ZUhKgb$% |CuvvVUUjӢ*͎%Kk֪&"(G5\K$[2tK Χ񴶶ҟ*EX˵h"ԡ$eѣtLt5iIѪ鴱/?ܹsp||HkQz%[h5I3 O\v~vuuͤ h( P  ڢ |*U[|5E8CʿNu0o԰}1,֢d!<: QV>^V muNLvO`}XU-|cl~]ʨ+¯~.[yi-Vpe$rm1]ɅoRqhkXףNbè>uSB "E 1ڒTfH#?#|6"2V5VTq(5K[nh+~tBg>/m}E< wQs#; q ZY 2ws>-کQiH*~-Rr91nf#xϢ5jJq{dZ0z1KoraW6B/'2I$ KeFdj[ti9hԣ=ӊM4sqi($ʕ9~JSHQ"4~yj]BN2:!k45O]Uw--ֻTg{4oEZ>Z}؏[;U)5li`8i >:aO)Km왇H. mQ?::Jxww7}K$%%%$$eJZAQ]uE\G{U`J\[ZZ;H=4,Es  4Œ⊊ Izm577SRKg.6hsZ-/JF]E?h1h%1.w"رCN\$yn] 3d_UhI֩DOS^ԇ--/עѸ&Kw_KtIWW#kſ]|||jRWif*CZFvk_F֐N/_L[wii"vAVu(p~ϋd94 AVѭӧO_vz4+aɟ 8j'+qG9' mU^ ,:*psY@*$(g {hp*١k2UʼYL,߲(<9e$ax feq=@[8׳2AWI|L/_IePqֲ γUfemLd R Nik/іT,vȃ8Q)"a@}̸b|n"jy[.= /TsƁ\.oL>|r֒~f ^+$*YW["S2R˅Z;a̵?ߤbBʚE7溪)$PRnt@H_0I6ϥsEn^RޣL^6kul KzEǠ>'97fjE#zZM1+gsd Tpc`Oy\'ums`\#zmiVM\Ev'wc YmmmS0^ZZڋFѽ䵭X6o%CSSS=zTh4YYYyyy¦)ޗJsB%77Wz1\X5u"tKI}}=]*#ӯE[t#:1zAr ME-z.N4YS\CO7Q|Ķk-ݢа Ie]]Hh)tK*ELNN+/F[sijt]B7%%%{NBo7B[oh4BoZ(͝nMӡeє%>.W3334))L@kCS:tS{tڱcΞ=K/7:Svd &8yʴ'ݑzǯ\B]IZ"gNOI/DE‚8P[O=3<>st=)=.ZVmg m?>#;_#βQ⒈,S (kHH|3-F# \Reei*eWfÓ@2}~5pQG_th h:7)wX-3LQ6t4v:Vn^/=kأ|A[.Jd;OGNb6`p3S8͖]S>էa|@2VjY链YaԩoM~П)\ZGB[mPP[߽Ck|]?m`hRE>u84DbVҒ,v͵ܴJQHe铺Ԃhi@gcl :,OaBu%Q:"<qZ^j墭,E|} ZHC[Kx3UX zh$Ǫ=\g.Mu(ֵ=7o^AB@­BYzD&H&"0]tQu)]볪p{u``"'Qb*0V֪ 6i>úpSH yl)-5lJjaEB1f.mQhO|CCCssw&ݖ-[nq-ڢFVWWSuuu'---SHntǎ6ώ;r|VQQQEEE-KDhhr7qmketaII F#qzmܹSO&''?~yn|CIEk)ZEK1hX?-K|||LL La %7::JPt$$Ґh$ҭ~kq}nj 9hy)))4Tm`ϛ0(}СÇOOONIJC:]<-{{-F*99.MILW ׮];y򤛖(u.RA,ү.E6lJƴ+hT.+=d+B-Bh+>h)ZMrЖks<(wXV2zq \=4f^S\.#e|Mr^RN6ʜP?K]o|˯ane F ֑DWO+$K(⬽L*8@zLHbJvhfر(YhK$-fh9cbm ũ|9aЋar5ۮI1v!Ɣ_R:.-1gMq^RR'qvTm " E `M@5Kq}#KEmMO1FT21ۃ 8oѤnS6li6YbY& " V_cE=úxdDf`:f18"L:d 9bUL،eV]bXޢA!\v.kX486u&Vs]_$W/_~w~h+YQ15lŰܮ+(]Lث|)ʗZ/[L?CY,e m=p2bt,Be= oOn}F\$!lQb;j5?jW? s Lr GZ{xDsH]y%Hͺp|քVhoA&N?CdN$d1$d9]ž\ qݸ$bA[* xі5>]$\z`>KgiE},Ьo*hs *^11m r'S0*ڢeh8. a~y]Odc<:' `Qs &P]ApAeF)Pkw 1lF22bU˰O‘_:QF 4+J ^B@{;ߨbSn @&v)k' }?zd{em[$CQ>?u;nG߮j]5)+ga%bsnb %^͖4ە.KGA[,UKiP\椷{xC5DLc @t? l4zՀ;T9Ajb}@ܵk]_yйFjSݨ|^%e" I#{#,bL v r=}}ZtK)љ}JEϑXZ[ei# ş}6yE;רLvt\E9h?M&tyi's&c;kt9['Xq-31m)U p^ (nK^1&C%cQ0f3G}.p nr{Ny8v ڢޕKiΝ%,hzM)k]%$,,,µ֢ѭҦÇ>}ĉby dTԹ𘘘Z8&:.:&E!\x#ɖȜ$^ܨSRRbcc]lh4;44$cnnniiƐ.s"͢hʂ%N+ߢijJ-B~~>݈\ŵgWE3%"i$'K;a]W.ZunI@>i t_PS*֪~rbP']]]UUUUh4fH:;;]s]zΧvtPVZOZ4t -JZO֐NAV2 89rM'NJ](V5===!-ڄZVmgm|?h˿d iV*[#8r<6L\Ǯ\f9m f+ he> :9'ȁU?D,{qf+%hN>;y% ͗0t Hj/L{2j$e>@0/4cS9b@Mհˢs JT[Y}17cdڲӸ"[e'E[ ȖĽQNQbǂҢyo$ OeoS69ۋfC{a~E%2qs2"}zI>hu"4鄘Kq-$ĆtDYDy%î58>>xF zvԆ_njxs GI#)W6'Z;40?lAobOz:M}7S+_ o`ηZ`(.'_ڢ^1x=snʮt*FAA=9̾[F3Tߪ}㫵=_+Yb7X(gt+Y7J ;>hHhʰѱ %ߨNz{cOi5}?*8inӏGЈ ҉(T. B-j􏴞ZL\333ٝhIII>bV: Oi}#]b˻t ;,J|;Wr4TnyMob)&\mJNMM ATUU\-͂q+v^қ$=Т"N1K>cAAOLΟ?઼ZXZ@iss3M^bREG|U\"92A.OMijyL mB->? j4K;GA[t"XG J6qѷ@!F2&15 "Eq[V2SWF"ted`/pep1`7ޡBkS}(XfYf 6UQU?S` [!*zQ,#9.`O'NlTGwͲ` # @|`)lQ1U@tO10VV aЌ X2(Hd%2 0n-W؆A69hKσQH38aN{6FMZ?W=갗 hJ$^|#>P$1b%\H&!m4bTA^0sFB> V!e?~z/LEv="3ъE,,bV]YVeIJ)(<fkrƟ-4cuYF)2 sY.ȑ0> g1nU@ݣLډlæ= ?|ݲgM_֫oRk"Ln](ZF ١{VeP#;*E]H/Fqۍ[岬!i|1Y-].dSbڔ%‹mˆn*T|' L-KLusq~ۥ$Z$>#4ڍ [ѦRw5qaKs| FgJ}لq.Ljn=/ݒkO'qї2GTGbjsfuEBR̻Fd@y;DZі$qh̢ G<`<M , cAgzܬmwi:lR *:7ã?CQyYI=Ynq)Wc%OVڸmy?)x_2\>梧G[.`pn%&&UUU MOO8q̈khˋڤ2aIIIIeeGWިŅ ~ᅅD+<<\2E(](;/ᣣ---2=-===%%E,bcccbbR4\_AA X$[kyW^lmI#G,..zthah}ht_Iիmkkt!WJ蹬wtkrrn*ctSnI:$͚)&K7u| ro,h'iht#h̓'O^p/^lA!LVv=Dz^-+Kr(eN7i^+ yeRm=|^EПt(Um}@np5KF.$|#;튭6otl] P?v5C,]JI~ qG 86M/׊|)씡]{vG"! r-9vĘqf vl~,-0QץU겉uKJ^$}dǪ֡4/ڭ(0:@q9Mi&'iOyXԂL3 =&vp^a6:h@q چK6h_)\SO];hINgE;kwAq6]\~ x3[9=9߫[b, vTVFXY>P dUzTX[.S]l}m [;pZt#Gנ-7F]y}/eee777S?99yυdA[)U՘/[uՇKQ'MMM4hMҵ낂qihh 5^NNNѯqV\\k%sSWt:~So㴆.ڢ5<~(&&&\E7NhtS-/+d>&k+*hɓts---gee%M@7U9 chѰe C/**tuuєi/^|?>55E+@o};::bZIp^?7]E2F\Жk]p&E/N8!N,IuNhIM u 5j!B[mK)E[t8˟G O#;@F[tQE=ʨDr2SӯPJco8"`26pa2Fё=o.O*4z$5ɬÊzsF;31:.VFײPeM;Ke,Y$JKa}_H7H-ocǶuؙ{N뜙>zLOfO\q2ϯ0}|(ڲ9]܃Twwiͨ \Z [-FVF[*8V/VF+ӕb[ſȋ9a5hN|:jh+X˔ӹ b=U#7N eC&шV7{3:mUa^Sd@1 x)1nm:QZ lZ<3#qUt^i*XcX24rC0 CiXz+X3<~=q@%\p :ɷgnܒe(hz`nei%Z,pX1e)љD`m%\%k6(i(4/՞~v%h%O6Ih9\g]O[-ZgdsvrwfjԦԙSci? A[Bc x `іCӋ{zz.]tΝ+Wl@[nVtt}ā!DEWJzǺ:a\"H4hQ(3m:?ڨH?%CJ.A]o''?HGoFW:hkfff~~~qq̙3ϟ_]]=wBh4jP`ЭZC6gVF\ ɓU]9ihhLTbxm?~\3p=bz ":t֍Z&qtknܸqMUFhɖ|i=iPAZRfh%!5"h+(+++4g:У6ihInZ%r-t PyRʿZ%*Bxwp(>mqV%e UyТU~RS*P!wmiPU ,Y|,هUh2@cJvN-g(J^fCq76pNNgVp\Le.Z7y*vLzʬyZPb7bC}Yexs\UdӔmL,Aâ 'sV VJ2M!%ձ3BBfYEX ]g ~[ jc|b` {:`*xŸ+*(k,L1 юUvcPڔd;:V<#  X H!SY;_oa19,kl)tT` G8a$^oY'8l.PN淁c\Bw[#khtB&ڄ7/Wkp-L!;Ѿw*odZdoUoRneFr*'daWyz@Sz ^'{iއB[ϟ+y؞+='{/&puj,yoB[bLT#Dc@(/ԿS$Apk ĤKtzRu$%hQ,a"C.u@sīMDTQ.yUM*Qt'$+,>\5X,,YΕ& 0v. ߛC)`IxNhβuPk\le+yڲQeNY{߈ybc <kÕQF"l% rF[Vw.eֈm9wleATk`WΌϊ"nBQ6%<N؅D kcV  -cp@[Pɷ"i#yH vҳ83b).:&a9=ZܲU-v0>xvegF׌ANb/ 5xVD'5Sg X2AgkOy"Q,/48S!_!,cؼa- i7{R"Ś"vV+S,o6G Xî-| {Ͻ_µd}(qݭWzމK~7m_ [jՆQ:,QlF'BJll<;D5 5\8 Xu"D5pŹ̚u(hx&1nDW fXk J\#]h+Qg͓+]MDA.霌ո>Zdʄih؎` 30uK: oeu' a8pPF %0.k}F} WRG 8yÎ}{bf\-;hģЖĕV1k;l8X%& H8{8Ok<{)\/i\Ӈe>c9:1NհG*{ږS[ֿQ/ J[Qe#X8sB[v}$qr<7x$rK>ڢ """SSSE LZ\***'[TTA,KMh}h$/hIuٳg%-,,EGӏ'B[ICC nyׯ\r݋/^pA\ihuuu],rMOW#m97ںw yQ/4A ER˴4YZgVS%p˵5j!t PKPC1T>R%== E[PqؔLjRڭ8kΰBn,DU+sB XeLCN?ㅁ2bO2G9(}aNU@HV˟< {(udnpH5eRfC1C1V6m\98. 1֠jH h6\r-NjWL⸗B[M6- F0=gw̦4uJ p v-ة>SUonj:QSQL01S8EYNźkG˗㜈m0qHgi{X!і99fkCXVIrr<)gmc_5͎jba! h[{Xecte(_(V2NbD*V`MINۣQ?CyAe$k\Vb,ν|*km[XŬT?(VrTH/Q_g>,zخ+<${/~U:f#XM}.V0V6|%҅܂:a~8LSR)kq9Ui匃\yp9hY9kc 1,mW,G;=H/9T|ZO9Q K@>)ZJr@&k>Fn!DFͣpgqyՏj)tǑVߣ]­Wd-qf#R=f"oILw` $G Z;/5hq//om/?_=_UTᬪoWYjz!іChsMIIq.<E[/tYtttRRRFFux$СCQQQqqqP*'8)FUU%4ȑ#¸ USS6o<`UWWW>eee[VzG?%Ef%B2jvddtkaaի+++bEӤOLw'GA mdKVoooZRwnݽ{޽{/^+Mj<114DMuuuEE:uJfHihkkk[ZZhr +-)LMJeccciiikkhUu^GSUU%h… zz-ZԅjdYҥK`LQ-:݄JVmʯ`^>yjW +iXRy xX㼇Q5L)|G@Kn)nDJW]ʟ#Hkح|u0㨥F0 pG]w+s_Gqk( /lIYEld˱aU+1^{_pk^ Dm7W? L h*־ښǥFm-hjq턌Ӌeoq"d`e1]Ժ\k V`ܯ.bXi-ՀN׉sh&C$nU,y% []8 Myf  ]hj?e6ވ{ 7 Ke҇G[#w\ nfm z4pzM?DP׮#ĊW3lX9 ic#.v !.RZ?}(@s]EڀMz̎yJ|NvE;h+E]h+IX=m5|*:+~S b47q. &[YSCSǴ{ ze_8G҉ۣo<.ҐT*IUV-~V`q \V ^%jD^d%j/|הkrMk,k@[bWA jja^_}_/;OJ T͠RG.u煶ޯzy'*#_Gy\: ]YTipQ59L+KR:hϷXd%IЭ]ULFR%> ?vf;6/tN~$\\ezӹ2r,u`,$A[')WA΃HV>Qݲ{kg@cDƿE JhDO-Ei}vh#)'\).. j; !µϘGo 3؈W$R Kє;*+!Su6Z1L4$QhK MhQ,5-BpR|?ݾ]1|κ< nPu֩l5PhEʂ#GOD[$[bC[qqqyyyԋxLI@qʒDbsp/V49h1tSzGԯøƙNnW*jW^^^[[іYObwiܙҨS(N+CPǎ@؈hqq',:1j;@)** $QÂّ ]@^v֭[ۋQ~nfffzzZ>y)KtS| N$.hK$[|OQsPS4¶ {ڤ O8 EeUUWO Kwрiy(GGGiCP  P,OWF[Z[~:7+_Ub [oQmbT P=e`3mF[8ށ8o~O~Wn~-zI[f_B X9J* {'!)z]:sY| ;J I:S3bR4&65<@]UY͜ʌTNrdrZɜ$ќ*Vpq}琲;q4k*2+aYR6Ym5CPcx)N m]f% z 20@nHH5^F^.$ >8r.HZp@JP:r)5mmFu&&KX  )^mx%<*TF/uPĥdǞZ6a"0"+wx9k%:yv'F)MFa t- 2"KR󅾶@sLJbdz#0t(eRh#u\y'"݄M߾.n \ǣ 4?sua6Yև4McKބ<7qz?E7wЭxA[T[ZZjkki333n)H7-'&u춨Y&ED@^aɐ(2gDpɔOsӭ٥%1Z\\ljjͥީM1EHl5R"iWڢ7phc)-1xeSEe]PKp.2#E=LoXvuB9h< &?4+ Afi ȡčǕeZ5 4@zOY8ɡb 8k#P^I629쀶zK?1+@[4 PCvm񙫔cʖӴ#o qrv0-8{w#1>se~4VQU -\ř 'D3XgeGݼfK ;:fY3ֶ5jʅ".i1(y|Awp1x4Xp;f3|3?*KqN98(nmqʗ1+@*8o Li9X7+_&%K2UƓG)B*OPƙ1 cHARJ-Vt/ߨԁmQΎ+<N~7nwSې![=ĸ_V6CҸ[TDXlp2ylfT횞Q[NZ,j^]54s".G5hb!z*fn.LRҡ9@/>Բ%A[EEgA.R<|V޿ G4gWzǎcRgis H݌&^-.b 8: ݂_GTYPj%>|}&ޠsnI[%wKvZK,W!(E2Qiu\1Դ6r!A@$e3z"q{ieդh_%:޶OMK6aGioW=vת:fbZީVkPuy: ɽ P&J'!'ʡCDȑ#eUZZ/#]y6C:cج\D DmFDDPB חӐh0 00W̉ڢEkhhnK6 w(ShTLff&0Lpѐ-, zwӭEz":1PԵF{2ξ>nQip;55%bjennneN'K֜8hڢ$-A[HH޹s>. ڧO.M_6X]>\d..BPh͚py.l&"a4BzMG륿5C#U+On@_s@WՀWr ЩY>VmcfQFc,YPo4yV2ruHiqNn_Www=e1^+(J9bqJYHwUƄ2* 0<3`K^e)㢲ؚ[`/ч`/ U 9|_^RZrs߭Ì>XS$v25Vp"tJmЪx \K-,F |2a*&mAkVA1^Xf Yf- HYOy$PKu!w90]e8º*yԻ=8csP-HJː0ؠj ӡg{?* /+Ef,hTPNRric`5#Xg f/Z_OJiL{BX8[#֡#3S*򔯞A?V;YHg%-|*߮|}e}âXSwc7y&B#Zvwr)OSIʃFP9PoDa;cV:Q (0śPxQ,`2z6y0HvuŤyT!Է -)tKFcV.be.5$>Kj?W7fuiYU횾!QCz Ǝsn y/O/.3,#vKkNՂw8a&BbYaԇ'5pӭ 0r{"@D#bǦmp Fw\I|cg1P%4N{Ua*1㲧ejoE'+YߵpDZV{U@[Hsٳggff;& 䐫DtpQ"dffx-&] ammm¼. (4ť%1rЖLZg,=Z4ZCZgjWbmQr uzƍ[noֽ{$]2ml$"sbbBF,)(z4*@FO& &(8z;Ti}:݄JVmʯ`$FaT8Q>:}wK`?B;e /(s2?/ 1 s9ufۀ[(n6q;4>8F f&" +xT $RܥL/Ĩ`3Tqܙa*W1bbb!b Ԑ %3쁷-q<ʬ)E4GJ5ڊDjlF[{F[|c4H08ÑN&+At`[ysO~ 6&xO/c Ud!.hU=AQF!uvA~ݴXMd]LpȠ$6F[):  vBG|RY{8xiƣjD(ca9x/z"/:xw*͘][5@䓲9WjB,#G(]ynW_{5ڒB[hk7V&mg]6 xP#QPP(!Η5Bm 5/g4ab=:LZB!(P-n|dqEjդwfsDliJzGx)Wj\6U~]ZcjZZ"ra͵fqy hîen͠)\8bHu joohglkF'Un9hnQj9Pk{Y& 5r vjT23O 4/Ӣ}NU?mpѭ)ĻG3b? vmBUTvif~7[/nWמWןS7S7QRw~hKbĤt6_^^vX6%\UUU.HBD6ӳ󋋋ʪ뛛?LLcOD[.͑EQHt@ggc wK F-hKЖxm6":EF㸓Hh$Cdv4nIs]tڵkw=#j@:vdMں_h˗;z$)]uu̙gJL;-2=D4R#ġ-؎[s)y5P}̉X F[ƫFj2TC*-l652Wَ޼HY,2kvjSfM1NPRU)3W7uEYQ_QU )kg9Lc},a!(Y1{kw ]ioƲٸyyOL,B` iVPRz (GdN3W$(Ӥ b8me}Z?g-6fGD Uk3K<]B5ڢ? !M?xF[|bLbqkEbLDf ]:9;aLÌnvF-tY*xL˴dt$ᕀh&m ->-2k;6! kZ 0Ml +ʽ_l gU`/'b&vd,~]y LpzA 2W22!'5-AݭٺW/)FjTƂ򾬼IʿIlSfv)~=,싅Ds@[mJ;K#XD<Y=sX<0r? HsNS\ۗZ I6\vIJ>. ^ނ$&n(oԹ<.ͣ2jD:%g etށ4͵4SӃq̂Die{LO~.ՒQ2i;hh5JiQ;؋d{}u7aA[mzֵ.IxWiFl j5O#s-w:Jzol,oN(>Zvk(e3@[C.p-'>Q[6sl6;k2~p2ox}8Ņm[7>|Жp tGi?}P%PHB ő^cyf)---mmmffVIE2-:v[|Tn FGoEdtLqtٌhO%j&&&Ѫ>nѣaKijg^xիo~뭷:::YGNHJX(KJhǣcǎ-,,ПcccE9qҒ,YBu .lo4/3=A[+UpΝ;wޕDIoQ4kɨdjrk $GL BҼ.]DY:ujzz4ew]@ P  P-/'myY,:٘?ʦ[F: ʿl>XW e)2۷ǓOw?%̯ž늲UQ@5V.;Wh.G/œ YïVRTgva-0 3XThI0GGrh^s EsMO+I"[,8!t-S!x j PGhKM ,Yg-uO>F[{0i„ Ӿ4n2LY!)I(N=cϙSp(˶GA&|8PKldq.V@$>,t(4vI1K#\kqYΰEUX㱧l_e?4*q= 0XЗ`Y7HX(WۄxfVʠ=s+ri'G(/meƃM@!?o(+*lfnXw^٬eq/Ry)qexGCS 9dWsA"Xݥ=aխo[{zu5ECO|첍vmEUS%:a);E!oѹ]Sx( wJIZ)aiFvwIC˭`c8n)ju--wĕp3j~m BJͅZ0n Un[0aMw /鐺5 g4:&{ U44K`V@{.yZ/jE;bUgQ]]h%r7Alqwi-K.^TcZU7 ZN8r˚)#&P S;fsٴyuelz-AX:Ȇ2ex~'{RGo9}aӿ&==]G#]^ E[b.^U'orm5444559timmJKKl^mhqH!pOOu]WWmIHa_ Jm(G h+>>^߯$$$:Pk4Z"ZGF p0LZF1HYZZZ^^^[[qƽ{ˢ"1qFK0hˉ%\gϞ' caaͲCz/^xҥ h edd iT4K\reuuZs˗'OJ V#2qGT c9,1і2X/QF+_HW r2ViWV % sB +nfQ¡V^1ȪC,a;wd ~DhaGq(ca[E1arD}>:4#i@5AuNP 8h Q[uJ2ы/ieNE3bPPh-J(r**^Z!dAe^0/^j6M[~|%͖!RdmέJi?nf'-Ge3 %ueTqv6qdu?|wfoh$Gu@~)O{w;W~9Ѝ횋{c @$I2x,Q&4$(DzΫ(hNEZIX0Z)XVh cUULU%7&ؔ#3c:p$v|1,לz &]Z `>}@RxpIl`(ig+oT[tma3.7]wcCɰ FCTQ؁:I [HNq~8=gev+mZ h7BjY y"Ff\Cy{>9D[z36IOO/**t Dֿy$lu吥Ȯ.I2(h(;;;555>>`mՉ 8 T觛Yydyˉ:iݙ<8::D%_n$\ƕ %,!TZ" hhT5EMMMݹsGֽ{^JR#41Z(zIӐnܸO}Jt*/X%*cǎ'FUJ،yqXp- q1%8Gx$gyzExF*tݶK`]8|[ny7Ba!eqE@^,{: irv72DXq )+"qy$]Eh˶NGS~9H=|,'lڐI%v#8UU\eCŹ th+mEg I$Iϒzk7F0GGBS!,, hP}Z.a1b[PLǘB5hs|(G5e+_m-Dfq2?|y;b sM3q=b+QY,2'֮#U #@1$_b6ګƈ2HV XV53}ϱ)Ix%ROa 5q?8|]|3--Z h4YQæ(P\-*_>e/)֏Qe?{|>>Tw#7h˱/r/Gi.-o*˕\I;b͂e]ªUl1|^p}<6,FU= 6CŖ,JޒohV*2hrnd!ᝠ\Wþ4hTe5Ϊ?>L8k]ׁ (E!Q Lwc5-V֏+{qIտ g z bb%9 sqNMncu0.\R$,":IR . 9(5*~.Rd*mNoFߟ7F}I 0ZVjjjyy䶅wAS%Gǵn> r4EVEEEUUې^87Hw i#""$D9Tb%1JI$&ZXf%Ayyy999nkk+M6117$=멑 hK,gRRpeddPµh=iCCCݻw@4<<<88+υI}S%[篡B%TBh+BW+Oj+Jy8qhJ;]kE?WCڃ@؉QW9Xc}Q9G OV6T`ZkpnTV%xjjC4eW2=2>at F}5sa(׾b#h˃ط4~њF[QqKa8Ij NAT=|+G"4| ً"p#u LLw5 A m%98")ҵO'⾂8`*X i.nv>K GIdu>Mo?\_LbNNeG?8?GfxʽpN;Gj4) DuF b#g9>Қ7ƚ+SݚUj=|LMr+@"Y+υv/_25ڙrx8>kѬ q/+G'@QE:y' wTY> mmv pb+^k ת24BWcGJܒGQm؛~ƭ)< B2~ :[C^fWU.1Mrk\:J1]' ݔVc[=.=xz7+hxկ!UFUCn]d pNL㽠|B6Z=pA|SXPYxf-rl{% N.Sk"En"~vĕz2J/>hP;UZI=s] x%~sZ-hY"i>:LazӬqUjmv`K`$lNoߝ7ᤏ/l{H| Ж9Žנwj"wƆ! 뫯w>mI@*EEE:PޒmmSh]]]n-FZtDɉ]%H%P)))B /Ynݗy,>>> \b pEj@-ɪv1wϳP9e"BS6ɇ>hyl/b!Ӂz/c`r< {lh]i،Tx@.xhwqk8I`p8$KŎAJY +v%b9RCڊ2@sMLg ߧʿXs}UXo@ŝաhӣȒ~z1V`&ʷN+dE(iӗoT9gՏhp7~sڻ݆T ֠,u:,1;DEJciՌ 6:/U5ov0U[JO)ȵR %Ag4{1 @9q@ˎS"~LVHևJsInw/+OK<۪ -7sqdQ^Uןn y~z+`b۫p<Z13f'XpLh+sHМWAhmG˫k/5|4T8"=ًa7hѝV?66F,,,,..>}ZLh7s-p-mI-=qzX>X#z r,\HZ$QiFo۷oܸqUZFʹ[eMLLSSS'NyLJ: P  P,۶m{T[vQ.S6ڢJ ݚ?ӭK#+g$IU~vCE1@&e8oށ19F^?)S>pyϪ+q_\'hYwHzX_ ItxF278/ e;28-;wJA-def2bO2ʀW>W&Qt#[rMY҂#Yϖ@NT17iW4Hd2&bQv~`|7m5ivӢ.dڅ\~x1hĹ 㑨92pDI\D/e[xH=A[Hlg!ZNJTW >C$Ql x%:H5:y^\G"2L!n$Ln܌ޏn=R~3riH4ں:Z(~rr.?u VU7p-A[\5==]RR"W:hkeeɊpQeeeʹõh`4 Evd]266&e4 P  _s=hר@դ|M|ů9p +߫?WUN7ZAa)U Grh^*?i)1u(R֧w9x+Uے5VxYe.1 v-s eDsVGUX`h}Xԯ,(vUm%AML:QofF[@Iq|ұU[m*85X"DsWp 2>>h+'C0{߇6Ӂ_s]JW4S={ q~ptL:p2=ejK^qB:Pݜ>\5"&B:wQO4l>fcjPpˣlz G,..W:ak0 >[h 5 9f,hʼWYdeT'߄ *gL00_ݪb ϦX46h/ded3ע3 FtRL8Ii*p5]X߯VtV}熶b:hKS:Yg !Z;9z!!#vu< Qb59)u\B-žocjAq&tY<\H6[F F1O\>J^t;*A+:4גh>ـ[AhIhðku^ղ(16Vm&\\G؎iD}GwNL9a.+As8頭>iJEMF]Z@ TڇWㅑFbq^S>i`mPs>,l"N/hު+9jlV+qyj]e;;v~/Mp3 ۶|Hh3'''}੘baaacPAAOFO:22"0gttTQnEwc^^^FF-[OKKDZJNN[*++7!ҕ4NRܷNn:ujqqQΞ=+Ih$5X rtkyyY ͗M'NLNNNOOZtkQڢe2Ҫ&&&\WWWzEpih4$ZUݼyڵk/_^YYE/:\ܜd]BWTT#Bh+TB(KPC1T>RgnٲF[Tmi+u"w8eW[**c0Y'8М|yfZFwq>(P5ӣ=ZmccS]iVMev8ް )eUVx1]jW֛0/d#&3\`8O]RW/̚h] fCP]BڭLl7δ / XS&x a <e/6ba>4+PC9h$S hgP%+_;I|M&qm`gS:~I/\aB@wrЖDJd)F[4| يD͡:IlƏr6Ih%Bt {\Y xhW:OP͚ܫPw|qnRo7z|8ň圛<|Sl%gFd2E WLB6\MYaߪWF򽬼g4ljaa $3w4!"(mT[֩Y;h+FdW#HȸV Yт]d(W,]؜c҆]4fRŢ%Ҍ0M"TiVgt4`,%KZ)0ze'J/ju긿Fm]Uocow _kVOjbVQNj+cւZַA$PDlgQ?s:&e^܏,ymIyTeɖץzzps!Jv^^e;Im?Z0h+//O2;*%%%##kwO >ޮJdZ‚K%&&ٗs'ez<ڢ6ccc#""D[H@ybQ$#^ZL ;viiw" esFZ .S waX+tcGGu!\+??^IOO/((QRb%tQMMM 8} L:ٞ#ܢ]2/7x} xŗ iY$8QLl͵.%ܹsKKK 555FM(#Z/ŋϟwhh4yׯ\J7i:{s.BIZp:݄JVmʯ`yꩧ[n}}!+f# hثYyLHt8Q;J6>w*_'TƷ(8OrSʜgIQF'3.QڕQ̴*0l/6L|٣t`|YǀjYX$Ey2KV9Dq!4NSKʺX l,eVF3ȩ` )Y:\+83W<9 쫄 Yiv jH+90N;*X{#ƅv.VٱB@[AHq=?h*.F 1ⳃḐ`F҈tfxJlղJj3~}Z*{ظ3#Gd˲dY;)}gq+UY"ERI"vK^dqq[N'7ƌqi i  PXtzm%7m'P<<=vh?>qʨf`+ q.9Y?Ӯ7-Z5`GlXn\s$`껜1<bw(Blτ2S >qQ[,P-e|]L@a5E e9{f;?,]|%(+=FdXMk3$_ :r,vjSbh:}p=ԩDA@_ upxӔb>uE)6c\aw'"hlᴏƘNA[~\upc=-C`T †cW-Jw`lu'mC7 8֍!v2%"1`wUP5ٍ)"G @1 |imGhI'\YIES3.6@+䔔܌cP%`jNWEݯBz0\FyUu^YGf.A_*TZ ;nJ N'C`> dNdn+cKy .*ʿ|MKݷ mI(GElJdaH_}H4v(6}4Ų5hFA;Pyt޽2E"mb%Fthu+ݖ~s6m.NthTdOTNb$S*j=}:sږ@OT;MlWzAyQ4WK<[VTiͺjv,S$/M{m5:鰾@0ڇ/`',F[G| dVc:18Z7(pYGJYCQ.!"G-7ء Lbv7?=}޶'ҾdkGUYYmvԈ *_Olh+---%%εCjFqqqrrݸ);LAU+`j{%,;w{0.j;$lsjjjfffvv֢F eEz{{^Sߩ񩩩txjXIII]]][[]܃BPAT85 S23JrF&52)2[6j*u6??bA---,Av_n=mQwC;Z{)OZTի/_޲haTOwi4&z-v%b\O{K.{~X_օE[-QE[-_^zIJ᷾")ނN6 bVNa\A/7 rTGcwQ?Veb]V+z N` [*T'/2vJP,"EОu8װG+-801>4l%/W-JkbW.cP !T,exSҰ7zFh>΄eB,U#hxL֒cXƛ&\#ʸl>8 М{ F d mj ^!"V%(>< ޚ^8iB i+<&t>.|r|OاBT/@ g'JH|?_7 mVΐhކ$LPC~@mF谵mX]ZbKWVhQk$s P"4mgў9VԐ @q8$ͷ)&xVZ*2A%t# X&Tx8eAøtӃq(F܆H%`8ϢCcդ[nG[ݪAwyELܪk ךC @ m|ֹ ڴg:e&? uS&f9< J#UmۀhB.A9`-r$o:{Nhk? mUUUJ7A[qqq.gQQQvv6*ȑ#ײZڽh+&& ʳ uyD#IBQɍ4T{Oz!OjYqT,%[&'':::KJJ~E -)fr/hKRYK|,{SWTR__O ,%Vj!{:z6-;ݢy-HOLOXggU];ɢi(,,/z)WVV$FZz[[[4D}}}[Ж"Zw}wGe}"Q-*1{pD1Zhk޽_kp1ݢ#0|u|T &|&@ 0b Vr&p-Ru@ "fTpFTxø8bTc̣BU򗲬Us$ȁZAB *t 񗀶9+\AdD>*a&BY#/Cf-vd OO昰1Sc">,#6z}g@)[UQ@p%[<|oU66`gU$q*8B*X{Ff-KZNeT=_OkCkoeyC!3¥*tL8`re W؃tPt*3(^lsRxwj̑X=rUC3밉18Nl*~H>b؎_+E-'LD%_3L .=i؉h#eٟ "V荵Dya]؆!FZЇ40!/2meAa5ڻ*|[&Vm`8DHNy}8b܌"3QƄ2XW-\ X(JdM|j8а\yBVqx< hr79IJp2 ez0$Q+W ue,۫ӬboyVTZ_9?rYVp*pHk8P+/}NL|6jo|oyvF[3:?l5Nt2xm>mv#e/]f&LFc'?HMH} (^G\@hɒ3xcqK> ţЋE-GQ5пRm*!|{kbr5)e߂-O6#)Er0֩Ftn`FAtv O6 F֐;ci( JɌi-;t8ZcZWY*Y'Te: րku[g[2qiMOyI8)Y*q/[|۶o"/%֎hf r8%%%yyyǍtm=k x<[־ jjjrUUUj6u'+++55U,"ߒCF,++kkk\[[;wh{{{uu5 tE?tknnzݒ^pzzZ2RKx%^UXX([>jU(I:;77*2$Ng$Ȯn-VHzpk;䔔yz}V+Y`U $̒[균k4vK.-QϞ=k%R.Sߩ4SݢuAnܸq޽ߦ/@Q-E[Q-"h_GQY[ Z#ժŢ<ǻTkU{ЭG* ~B#@V&oFy٪(S,2@a  5rpb2!9-|_a)o\(GҠp:K™oϔql%BNb==1P4ճKNDƹ#*T'5?ЎCWnl b+!9?s*MP5!dhZ&q._z9M+d?K6tU%lj^"q=h m~͐-C8Vm]i >l f³xNyfyw-yP=YLu<ڻf^3Qے]J@Q|鬒oC3v3xH,OqdF1qCNǜ׬y܍KU ݒ#Akt.jU%H0ҩ4(N<+u{uǬ>m:ۑk yB4)ŷmm}wh_[[K11JOO/++klllmmE?=ٞ'7A[ dff?~ :[૾^JJJ(DE" Eejw{^^E=뛟r-+t)XOA[nwSSS[[[gg'i-/_|qܢڨ~YuwwL|0*#PntZT0VR,G##v-@c2el5Wf,jhfcs !>ЀqDSb a1NXg01 g@sakS]* qrQIܨc|2*9p[c#/ 9M L%dfRX`Mm`"L 9 &іgׯǞ3v1E9P2E^R,i9aQvЂt"FܕVv Vm:aZ=jGvC8S}ű6gT8Ig qƏ A sU:9pL gs?W6br.Gqo#w8@}D8rP &*&Ʋ3CsXr@Öš_|Y i _*T"F_>kBM ,ea9>Ĺ5uL}([h%NF>Hsz՝V3=*^=;a|/RO}8U` aқt`fomTg@-ݗӜ"y[tFޯ#|-s.dkLk*K6 m:@Dٌj,L gzMmh+KZT[b>EGO.^LYe9y,rɥ%[^-ٚ^K1_V?n9h-YB\6xӰN:^6[H~XMV: hk'?3A[Wu tIcD&r6#³*-ґ#d2'"$Sd|\L(fha=d-|q],RݏHToi/ѣGn-̲*ɠGOHHx3-kV v?y))))E^*9u}dt>777'''++K<3//t ζyjxR$b U.u`ZPEW6o޼IO^ԔJh$5ttt 444VZZZhqիW'''GFFD$^jn?Эf@V\v[ڢ34gϞ]^^s…CWD-<_@sd$ jooF-PМJ6I ) iEu8а?*U*pG,nYWU hD@Rě}nrñj>&F]^ 2|9D=ledeeh(V>_P2P'j1 ;//0,܋0χ/S @jZAB2=*ǎ<`Vȏccv+(j2[vssƮwvfF["VAQ9n_#~˧4ڂ=6 FlmmLAT!%iZ|XC-GXԺO/`5˨N&0 pYW,۳=^V.ҏͪ*F[2hDŽ;xp3 iىaf0}үLS*"F;53k 8\7XsMaT*ZnPjkPٌG csi]ʟ|o~Wq-U*_C-9|{mpb[y9Y>bQZ/K+^˦WK=_W!G[$Q hfCFG,ٲhGOt+ּ!a/ jE`+86@:nsdcZ q/4`/a¨{l6_j#TjJVn\|IĮXBp ԟ"oR? $om8ԖYdE_FII1)B|gNj)Viچ]&@Fl16ڵ/ަԊI|&h|ݪC\]2pjK"=7M1 :TSjK\b2FmI@b&$qORp-R-;_|uzqfl!<?3~hkG%ɓ(ÍN3))ĉT\\ܓ_.5TUllܒOZ흛rٳg.I-k y",77HR[[*Nƍo߾w=DQPPP\\L7R:::o+ٖ% mQ=wܡ G}}}ZvQ$ v֗[ .D>ӣGZu_;NVVVJJd-ʗz,[CCMS^^HS`Bf ` 塡!@[tyznYjR+++ѭMDW|1{pD1ZhkulOmC[/g0[YVк$0 ̩@ p,!,D>QY3S< \s9C'T:η 2w_>`{Pxj6h@[53qn+k,Fa$ X-F2Xez9ePv # WY#l,ճ1 ZUL.pW~czhk ُ!FܘIk.y:nKv-,U!@0,YB>a|ԩixjH$5c="s[:~юXC" +91TB Oqs2P$M$X䡾f 8 ~*49l Wnؼ06h_F9Gu2k. ج ^QS9D\_}VPft/]6)LtR,Ŕ=:sXM%z?p/hUʷ1j IgZPᶘS<^\=;:Z&:$J ΍8 p-ku|I'Q1:nUjn%.yoI:-?;6٠npv]m܈WO<2qOcRv}y-hkhk :q,~ 9rjjj뛛QITt'O>m}jF666owR;5ܹCaeWqm1 +>pxt؝}4Z= 1иuye ČjJUVI2K,sn[s E*\f+ʼ̛YcC[^x[":!'L,+԰-j#\T |-HQ UD<ķ<&Q(PӨ=OsL7c71+" AOr ]얃p* Z'c.|k2.-'4|x0{ʠh*$ylUǜ6pIUgT4 nP D 6 sVP?C @br;6ε+RAj$pn')_F[/SgD[/*Ώxu곆} 6m&Q ~MT9bѣ} fVF.k uQBH.1ӥ1tx,ĊʁEx נ08G6Ù1G)PT3uYЭ/zz-E{.5֭[B\"Ms&[233SRRhTii0 jjj:::$P84yZ4MT!R咇QPe-Z`2PwU"1vEDEϒԊvI5^zUBPJQ󖗗Ϟ=DKDVmE,ڢ}Ӫ *OF[2n63W frE4C }ewsGGJ gS8ڭ!B  R- cBW1D-6o(ˬЪGȱ`n" !kV9\ C$*>`qLઁ 93<-w+ԅr/˽)v_gYl vΡ06yb A Ȓ$1te|fe+b3:Q5ׄͣAUcWKvsk}|^]ַ)qzdP[MrA+/==b7.짖q< Wk%5ky['Yx5HNXA15i$|]-+21ScUem9,Wkm:Ac%epN,WMą:ßL}kqũ^^[Kl ˒,G:. 1܂?`iá۩\Վ@D[mmm^crrrttZ\\,nQ=S*+EDEJNNɡݖZO5SP斗{cc#jر#R-k@j`+ϟtҍ7~~n$55)I!<=elllvvZ+SmEj3gSqYILhǁ뵞 mQ.^(a% ݢ^vm}}rQn򣹐얢ӣ/4GAZ]] Mhuu5K@c"hakhX$XzJO$u]TUYY]CаSKq4撪R.EE&Z_qc|[kI#?]C~7 N?ؤ|Th3 n>͜-v80L;z]d%L&[UpL aHXRCN Uhj(yUGGU s0ؗPRv1C|{ qY:eFCLƙ_V2_W~0<(Ud>KXcltDT[Ld8UİF8 Ud T9gHY>FU 6Iu>1N/r,!:Vk~!]u,f4cYE0d-$ G %z"Im5{IX75&x鰖e݅;P=}`)0qYf ՅwLvPX]Ax=m+vK֭T^ *_99ђ\3BeɱmrNe-nN p 8?IvhDh@sdLI^=^m[C+4bH~t;0ɲ!ho P2pfSfWx/ßK}׵iTJHHhD;VTT$畕X U$ajjjNNNqq1xпa%6p;َ(jjjjkk%n꬯ERXXX^^.ʢSGNيHD;%2K]b;%]-`" Ų|jU+pZ;rٕ;ڞr0 ONNJ=vEA%HPT5<{9C"'ItzAXG%U`W[ q?O⋶,*b(b$Plgi aԫ*Xz4f]HX&t50ژa[u_tf,UkQV'?[WYy8+Iس: Tp:X#>ۍ^ߜh9 oKTTU:iX`>:*y JH} EA %uzpnEf5|?Q_Z G,+Lbmu8V}[fޘgcՄZ3ksmyJ)M+#n"hB\3vA[nIcC[S:xj1fsEDa=ǙooFgױ+a'Rs,e+dG 4/`¬Xk$Jg!a)IbeLIQYeh):XPP`q-F &XŲЖe/9 EX%%ID C@ /"EHwZHE6-QE[?_k\arxfFy`ͪ` av%)_ d[*tTqjOs`MCTm 6@cp.˨8+aB(#lUͨ"r@\v*bwp2jt0 gm9ä/| rFv`]_w2zwد>a&}ΏT'xnLH8o+}\fbt)ϱ#V$s::ht, }̓pu@LI+4~ӁDV}xnf mMx'm z u=+PC6 P};|ƅM 9q#6d|R-؈>9&N[#N 6-lι2!bYU'*#eD$ưƙAVrq]1pXnyrb _ \lpA2>ܴrO5eUWTU;INym+=0<*69Y>ǀ^8SmѡG} :޺&Zb6>Ms:^T:^AGjGt:EuXV`Nm>꒒/-Q)ܛE./N[A]^g"jn$YO@~cT?çهM⥰D٢c1hw{1h $ 1c5*&}ʇ;i#@hE\6z 3T[4BQ7{StiLK,ɖ&&tKޘnxL {Obmv_GW^mq2b*C:T 㸥|ͬf}z:;zQ6LeL2ݢ9/9U~t0M2t ~Go3h uF[ :aUϬ @uCkI [ӯ+!".;Y z_}_}p`H!-pZ=;Ǣ#m 2 72x1# +=eI*%5ylV$W,bNl$=T/e}v7kB[Ei$iKjF{> [cIף-# ̾ZgQ'@B/}Ⱥ :TY:hg]Э5 B)c=L{bN*ÿ tZ7^ 8ԔMتxiu=~%wO^uk9*|*<#*ZSABkU`Ae wBfc`p5]~'itS=Ϩ{p 1U#v'@>pW/ЫYݻwB[ψ^\`tϣugmxlAsC;@ܘA) 9`%`u/yK/!, O|-f ʱ&Bdkdm/6x}c$l_:9hKP(ir-|&I}`pT]M׶$v5ַ@Q:% 4Q?z?|fѳI ]g5]61B;O=6Vi&W64>F5 |$h4FKNk~qrY <&5 6kVf.ƈn%izaKG3$a4Rc 5V \y~݇?ݝT[[|em1n'q!,11Qܐ*Q ebe "ܲQtdTJJmkkkhhK$)AI% -Xѯ.6|~~r .OZvyZ[r&nyv%.^ݻGSƓel[vvuN &Ϟ:m=3ݢGGGW\yomAk׮Qoݺ%!%8ƍTjR }w:eeebF3vԩfz*U+>W~Kxܯ}WyHг;Ef 6; O %%0oqS+]F[lbS) c p@ʮPqu1Xe2Yhigm9#"zLI5Iӥ3Wh~LMt` C-\bhKe|`VIusU '/kӃ'݈ˣH$ޓ {zmi#>Htx Xې۵"aCN_C~c:n `18rsSLA(F W,Ǣ"e53F#G B&7BaRWzHt3 #WR=xō 6d{1G=m}c G} GϪERzMH6f)5adKXgkA;5 ԒtRV+IPa@Flosڒ@ۉ"(5,ۥ><eeѡ"oJDG a0QMA|V;QpEɀnr 8цW0lQ0O9ZUOY皬E_tGDugAT Vknku,ESO&cD+z6O^nhs?f 5^[b&_hO GlcۏujW6*wꌖ:e&]6$4yi'7]M`%n,/9$ں#`*55533.ʨKZZZJJP&;{=榦:{@Cyȷ%lO1 <b~5;;QZZJ, I/ĿKЖӄkٟtennnaaAڕ+WnݺE#ٹ ]&%/^(VW#[SSSCCCb?M] ƞAuA[ԢIDEP)j 5J&O/\@5S%) /)k#s߿1JaF u͎DET4/ȋnnm%Zh+m]EA8O2_ ^VKбV!T0ER8,tB*0JTe-bfÄ1Np#b_Lp:X^QvbDu+cITD6 s#} a#$K)-IsT aQW}W\MIDZ70K0Nof0ڊ'Lf.S܅.7"P,ab<5*G&gj:a冈N#5r"A\fS/P%,ڐH~S+PBі!At-J 'c]qU,|2"j8g1$m_gs&!N qvsrr},bK[N8t%~$DQJ}}㩪I\bn ezJ@%]Iͦ}uuu۷$jmmmk4^/0yY:-ncV.숶DjUYYinY\j\-)n?~}}]oܸ!tkjjjxxE;/EwM}oo/ &uJ ,u_vM bR2"`Jhқ^/uP xn]LtWMMMQQg``ε~z/,..N̠P\sn }{2 j=H4]=hGt+_^D[V ﬿H%\\iSVF3kZ*\P3`1󁐓mB*8lm4!`t,x1%+ 5/0U Tx+XaL$@}eNTTet≠Xm5JfXq';YzfV 1wlG+3)Cdf\E&rpCfbɏ+#zz\ AfX"7<-_)TۗaWͻ9oO0/wϋ *zJq@8س֫mGha 4y *Ll#qz*/>$XWۏ-"$`Bu[*L/bZPpЖݧ33ܜ?s< T(dx lm !DV}hIfp .*^/p-O @,V~qo |3U `?z-ۥy߮]**~kf5hy_ }oz+$g`i#{r@m~~ d_d@2J*Ќ^ˊ\kB[:˞jIV '2 AitBrW /_GMT* &0 U5 Y͍@J<ױ9_%vycFaFurvHT[7[{Q6K:i E%u>ݰb-ӣD#En"80QӭbM͕S.O3.Y9JYP疵GvF"#iDJ*'a\v|/oy_eަom]-+Esss2331+Nf׋{ii鎠LE=%ݖwZZZY[@(dH &(SY"?k!ڭaV=!ajk8Cp7Ƨg.wcF ZDey1 H]uFO0emqkxWXmq >غkm<эF mu]g:+Ж8aQ {dmR&| m)/o\@U4Iՠ6!Kc2Ә(Rh9эlVĆվdנsadXՖ)Z3ZSuBV׳"qe#qVIU2_63S7*;R5^ OWRe*&Ms >pFP/ ʗ/ یm}WgaA߫GoߌϛX֓6[Ihj-hU՘B4,v-l_mmb%VנcYPj^2JFN3V؎ U*'ʆ:% X5:04P?|] |?u۷ܹoA|o'YԥJ5TS?e}u|ƉC`VL :jV$""i N (_(['Ö+Tiieu#Y!Ltr㴂 !yao/i@:hmX˝&7):ɖ+O$R՚YWt:Um}e+T5v-l_~{S.BvC_+d.ǍZiX&5w>F)\6:ۃќwM^Zy3?4vhj:T[x FnAՁPD@0ftꑄ1t"@'7+_vzƄ_2Mt Y-fH^j9~ Yķ0B/C[O=z_=2Efq ]6 ?6s0h^yhbz-/vʪwNR ^)vwl5kf־\rSzaq%[ yߋ >c2cnx&<" ET=ۓZ'|vcfx]QU YG+Y^b=eq)X]xƹWW!y9>*ʵdpNS &`@}o1Z:j>D?o9[5p?d{xPn։<޾xo-J7: uQ!i֕=΢#67b%d7|Ҟ34 >k[hmS8n#j5q?|K=J}hGپ-ԇ/.*mAH:D cF܄ n$pI5jZc W 0 4b_4:$܄P[38 r -K/܆c29)9cxW@1LC'MԬ)hˡVpYM zhzu F[ߥ5ٺy~V"*n9H!z#dxƬ=_,5%I=| n,X7^7fZJ.12\i($ʙe9*NA&kڂM.߂\N_:nҧ\hrM`aFKޡ Q[~ٚ`OxL=hZxZg?rMzmgЍTf1$Sk/޺lU ZΫU=?GR>F E,c<'JMKMB8o5ꘅZ)8{m& WԻb>K遝pGKMLlA[3H'?Ҽj9; 1i:B&D?f?iIK^^%cfrm~~~]]]UUip:>|Xcu`&))Izax䵢b||'O|###}}} Ҧ&Kx׉'֚K)))=I[ccMyiYd5$萦GHW%S+e)))j&cV3U ]II'8{zz[<%]2L^KRuM~>SW[&(kl_+(7֮| j>ʗ8U[*@P`%DhnR`ZP_ Lh 0PwPd`=Í [uۄo}v,l?4amPxlռh־Cڰ$,ovAߐΟNǣZ4g-9vF q**_YpOΦ&ShK&Tڪ[{A^JDՃ=mUVV|+;;[^_> Yb-]ɩVᖟkiXFQ1hE9"3k7LOi»L5L2m] 9} B !VSON ]g]5`hg)aa'EJZ1Ȝ}%d֭֝;m=Ch\|x z^[7p/&(=kkke&kp鮛'Dz*mTڡk\YʐθᮮSZ6UdY4M5i]68),[[|3?/*l}RuY_*;jTQI#'uIT&v%XG[6ctc~[95SShqӛr\p)yRyu* }U>iU^G5%MyПП53L jm=͠Wmc˦PcNG[.×FA GY Qm>鱝>L,]xɤã$$$<m gee5K*CڳgO\\ǵ9R"466677m]q-)qK-5>ZrDBΞ;wNqKMeXJڀ6$&/ML_J<->44$ VTTu&Ӕ1I/2y/E7ؗK_2N3==[lM>0===ң+Jr\߽{Wm5ZPzx,o#[o%y̌&g/қC/Km^}ä;){o-j|ʯfvkPc1VlEA[5!aVxN4}&!ZfO< SlwLumɫN.BƑK_5LCxmۛٿ.Q B%p 3$*%\4ƙvljXos!]\4"NOCژ 9dsī@=ՍQn9?h4BaR?JԊ& =Dj=5}Dws 9ֈ&Fses̴`S9FN1yb+M Tƀae{"UW 9&L,sAш$bnqdE[Tgx'+*E:ʓ3}hkZ' n}Hɠ0Hb zn2XR[ID!jq{8<`RҰ I-# ᐇHǩݪE_Yyk&tS7@Z4lZķr$k&:a]en~^1m6`?ݒ_|;/m=KarB2۬K GlFU[D­;`ZGyU<ǎۀe~#VfO Fw;ڈvk'5B3ic֖جZuU#RQPSy.qlJZB֧.ExN]dӹ%a̗t)KQO%Z ϽuE;aμ%ZS<8^h)Swǻ<ҥPkkE֚~ޗ`ŕw߆%np/ۗ@\/>A9> |$8}ŕ*Z5\mVŭޓ~ >kiΏ R.l9oC>|hk`C.lApݻ7..N^~ɵ~`miGr-)%%%~9k@ѣGz2#9MmnȐN#~%-ܿ_#o-W%qJktɽmjb%Vbh+bW?EC[gNLy4ttϤMP5Rخj;&gB;Pf%SvƄOgԄ3 4eaf3 %<c\2ƹl+xf8dy= #Ku\$FT-Xr)njF˰&"h8͚r` Jg{iF5z&T: VQ BmaӪ?F4QWSk5x^%otNHƼ:}\ 4N~_|M(i>>ACg8P0ʳP*ܚ00C_V'WOէ"]Rʊ'Mʓi)! _Ԟ?Pqܢ-͖8K+yB:kiΏ+S.lzm2hDzG=(\ܿ\\ܓ4]*---Ϗ*ɵx>1%E[oeee}}}[[[SSS~~њ4[PPw镕gϞr\\; Y"Gfi!ɜ唇a^1LYv -UÅGLhp U@Y}M ]P鯵8` 5 9B x+wmF[fѪ-~6g}nU>Tm~ ĐE iTكqJ )Uq^kZ,]O5BhPi?h&\.OWQb*A+>\cPp')ͩ 7MQİ՘7a&_U?dS#g X6bڨe=.5uo*J-˴V+g#d+<3C;աuh)gU#eUZ̭mthMKK;M&!oVȞ={RRRxO<_ \߈/`9vXaaaGG-ebYYYLRhhג"CRVY__"=J%%%KHץCni<b~%Ey~mkL Fmy B-*zt=77766#ʨԝL[ONS,&'d2GiUU\"cK< hĩG[C)@n-LVQ/YNޓlmF[r9"|ͷzK:PI;ҚO|ܼySq"[ny[1\.3J|ʥ_e+򯯯.Zv+$%m* N0VހL Ý؛#o] ]04Zv)]rBuB 'pUGrQs/֙p `$È^~qn"#T-%>TE6"4Zy3"&*Lp΄.3qatvB@RDG C>U77&s;h R'8Dv4NA9V|Xĸ} Sw^.tuJ #zG6ưUDY4|eʥ]=FttS<ր0: 1jY"Cu?j.̢Ui*6Ԇpѷ)8FNǢz~c)LP%a"'BS517ty}N+׉ Z6Ra[l8lecV=xuj֑42EY㼪bD&sKX*0;e:_];-o'qOÚ҅ΦɤW~mVWzzzZZ11.5KWGYYzzz|i퀯l[7$uJaٌz{{lj4j.]ZYY ۛdj_RR"K㪆ڀ 5nQі FF!hffŋW\~' yt})iyppP6AV҅ ^z9ͫ K^ex2 Ummn=j­G-E",d eRsss 6ЭYQaGtKXJd4yʢ\K d`Jd1]>l-](lJL@6și@^ &I"`9V` J>24:7omO?LtIvhRq^2ȯ%GAfkdF=EU &-Ei$'2dS텓949 kj'Z#`b9n?r Q=L5T?-BMޭǍ!B.̠E=[EL7I!&%>:kqYqMB6nU3:L;ZWE:KR+i)$냳}t hl4maⰴjaIa㌁%'ڂi|.l8cZ Ppib,;gcrD8R~g]vN2p zN'MhRW)C7K+6γxEIt@dXo7@L0,י[=ϯG[ū6^㗱֒Bta#"P/A^[g ;M#+P_!ˎV|RSwKА*!%O8OFqm]$9"R!W#g;P5 W|f^Yg=e 2˯X!gϊ5 hm*?fYhckKQo%78OZQl3?*{&[}P^R/av \K:}7 COڿ6keߚ[ &5ӀMy~5l_n=E6"(}q,0P>UcpĈ6AMK̉-\d҅Φɤ+[ ZJVjqvO-5uܺ4Qk_Q49DqCmn১U3iPDʳq5MI`OOOGGGsss}}\7uO|἗qݖtݭYsssjaJNi̙3Vҩ[R9VVVVWWϝ;'LAMhA?zݚ\A~)s5u;0J) >??8q3zjC[WYީ|$o};]]]zҾ|ty饯OVLf$)K*-|Ν;G)/O%EŌmgb%Vbh+b%V[_uDj8 7rhT*Ȥ[u#&\N6b&CF`?Ns3U6jۙn/sl  :$w9I_O?O0 xl3tz9V;xHi^N!eq ^A9eD5;Cc"s 3=?n0 \~'p&)SkGp2Ӯt$u<0IKvVmlalp~{d.zɮ;*r5b|nY5FT"hk ۈ*tE[{{Q7mww!wӌ4N:5N𘋶`6l"xXI%!%!"g~ky.ZȤbBF}# ͧwVK <$j K 5priWVR,0'@n4pHYOUE|q~plˇ[C?mrτLjP "G%y֣>3(o}cs;?`9f3l |X*QZaბjTk݂r:a]l$dgS@r0eq!~r&RyΩiOؐY!ۉ&6ud} U[g6+^/R//pЮ?X'(/v>JEznj hkwDWl@jCE[uffkyӉ٪w}SE%CV/Cbq?\n=oC̵Tm*َ[i7_lżDmi?w;泇[>ԇ] M_NU`~~~^^g-'p-E[Q/Ru%^ym}KYP ET&cGKC:;;QNaUr 4l+r䛜ˇ={(ڒKKK5K16or9Gke&ϟ?-I;2Y -2f ͽc,mMo*O@[["#n?/CAA-M(Ʉ@|$D,^[?dB1L!j?q'G;D84i.Bɡ.8Ѩ&:6&P^ٔ?miMuSQrU6/pC`hhI6&z&2OyRKQ /g֊:Y5Q V2]ߛ>}{ԞOhaFuww# U<Tܩ`E:G"B-1x(["*aMe)&PV}m O2dg,a; KM&BARUUF!Ih+I ƙA蟋IӬl 0gjЪh1L ߢ[>\hL"Y(:m"s Y~%)TYA!/E~ل7+ @2p &[- Bʘ 8rm. l{|h/ 27_|q=/miCVf3hz K 8ʃU|ڸ/\n:/v-mM.Ij7o# oɸ4G9y3 X}5hR5El<¥b˗*|r}- lQ?^&WePU]51b-h?wm6ѤRaܜH!p=xyaO6`I{xy 퓓cE}4%hw|rydzʉv| Vw̴4E[m=!̲eKBB?%faxkkkQQB&URR" m)ezzZo% ߿_eW:5]bQbn T&pKVr'OvHIS2BYjJKnܸ!2^5`Fyvv̮JFMlIMMXw]$Br,5ڒhU)YF/BPu@ ! HW!|܂6݀:5j.DGOqCZ0?Av(Q #Xb`csXUc jk٤^*!N?p DMuOg=sMڐt {ym Ha6>mg^g~Ry?7G=UhյƢ-Ǽjvm_MT*FGtv\=[c5d۬яfP4A.)^, aa sT^H Z2NC'Fp.:Ĉ}H8 bQ(܊#ݾp̃{S?ngu?AˎsmY=}~Ox!~OBEgSmo8XRRR\\\XXqv~ )%WOn֯yOZm8p hy)5p``GcFFFY7Zml}yyL\+m۷oCI HSե*RL^Jrrѡe|||EȚgeeɵr\Kzz\tٳ2ӱB #dH26[tC[C322ݫb3~[T'k(rwd԰]?U[my>~-f kPFR/w~?^iʘeYՑL_uĢ\xMHJV mJ_].[=G!zE[o3&1vV@h̩lE{Ld'T+iZ_7{v3eLlL 4E[Ƀ'R!-;)8ˠ\7{D&n6Ř"K 3Dd-+RV]E4wL=T#^UF®*\%aX *43q}#W9>ҘFn<Ԝ}ZygZKqA G5jhkr)8t󇼩TH&#>ak=8W,[ͶO)r=*XX8" Wϫ'ȇ.xͳ2? -XZ.1$PgmƮS/Tv֥N' 'EY-U")E#ڻwDz<Ѫ|WWW[[[gg2![mE-*xjjЖjZZZ<{f* ʧ2֦&y]˟iff\(W=7ҭELQC#=gϞG-\і-5Dۢ7eŤ)Nr?tvT|%':̓{Iw[gΜO9[)/W9uG[jD/%Xjŵw5vcV^xᅯ:*գ8xdLYUB;"rNJ ߅%"ӗMQȷ3Ϊqe4Y wAtTMx`v[UHӤ<6 p $2?LV8 dvE+9+&JjU2>%mI3E#8Ҏ)*_5HЂ*uljP7QftYݠaLtZܾuy[7MM%6LSIzPmԡhqo>c7銶xfEGl6k}_+7+KV]&[!G\QY\RK*}Hip hKspJ^ۺW%̀3.#qG'TQ-a(+tkOq.AO0c8MڪN>үϖ^(((R7al @Y @[BLt,^!7~[ hdTHPZhW_].hkwWڽE: VZ|00/"3sؚژ>ϣ[-=y m=| qG"MvXm]FJd}R79y$Fά5<^oДfk5.?t*2/J1ۚeZW3-.B(z-dtWUpu,|5h}TʵFܴ.9w)#/tC2.Jlp_ [bsfd=Sac[r8L4Ko.B8 ՝ui_N`EEEiiiQQц _P٩iC?:H233myU>A%'*JJJ:xs-Y\cu<:7L>11Qڔ1x@.s򛋜i4R0 tK1GHd*+9knM)gS't+999//ZG-5zڒ=&'U^{nIfgg߁H)hK 0Hvk`Z~mmc(V(ф_ aI&׬{&|C&9SyA%:i DT`#DZmX,s&LxJTԇ-hY(܂ghfFׂK|P5o(SUа2\"Ck"fv]m{ % M 42j5Ҡ" Y4>VQ&\AH= 6ts5=ĚPAAz$F[|`[39fa:Aw$"‘&ؐHkE>& R2#FE[l޺jj >%wGeʝ;RQ\1Z=h'71vf2?E'֣t P(V6mafpgzG\lт]Z/M+c*BN}Pb(kMiTԑf1S&Rh6|Kч.Gt∼M0 CGJg̓;8z>=6,wTmUb5?e0&{5bI6383N6& ZrzVsd}#vi[}EV0قJrG<.=BC@ kj.)ޑkn~aKdb=4DFԳWx7V-:rFec˺Gv['|_6k/YL[ljڛc]ڊmNO_>!2=wHOrκ餸/!p0>>>!!!55ѣEEEUUU`h+Eg^_44PVsss]]]uu,U㉬}ԨJUjqСCҾ)Jy龎f 9MF% kXU<7a~~ӔmI zd$JUthtKEV3Y@NEEl@v24Yp#id7-W\/‚^I9}3g6۷o߽{ye:rahک Oϔ^hKpႜJ|ڇ_e+O?mဍ#nl;L Mp;*Z{Q1`'M$wYdPe&X꣓|9dNQx:bȔ  c #'4HxI +.ҭ1TѝA|qTlLAUKՉk%Hto0ބEFLx`' {iBs&fkz>G[WPKo߾m/m9kO!YtN|w.# c$8x hKPG|F-nT)hÂR<C0j"᧧Ȭ> aG|:9˔.GlaQX8-dSlM%6Oh߾Ye5ahE^fF1w)6s8YznZK8&pz|#>w_UMIⰽOad3vdYXշXoU j欳cv`S^vW:m5k$𷨕dU}W1gke*9n]K?\PYo> )99933رc SWW%A[Rhczz7PUYY)WSSrMtG[^zG9'77V'uSF#șVuu\V]6Dbn^+͔fddH҈)oigOrդ@:V L>$gf'$]Juzr_.iUmi\/JNټHL0J\v5\pMO{}|jT.[jY٬yVkc>P9> Wzp{d'y#H}WY)ƫѻ[so$nZ0}x\Pa^.G5kߡpk/,Yմ+߆f[gYf9T՘K[*km-(#۷СCiiiMMM_o.`OOO{{ VuDӻJ^)&RH9u` ]H#III䄖jnnnhhڭohH9?''Gf' vttdl3z,֒37~AC~e;;;ej2/QA,zy-Mdhkxxr%?Ry3g/r?pCDXݼy-҈ɓpנ4JE/ ˤ/JbۙXڊXo}[o|_]w`?֙`"\Ud8sB&pLp+ 5+|3-o ]Mh;&g0~~, } X߄/z,T85ѷ(s5Π C[9 qN͍JeNDSWt;1˭7 Ñ)q3ї+Ɓ9j`Acktl#7Q]iTҡif8DPN<3*"0DqPAO33M ѳ2SUPf}kmN:i1[$AoS[u>`L8tvv*RhKeN*UoSQoJ2_4.7hEZr?`h\KZޜRoL*??_ YdD) R1}Ro|gіh… gΜd<2ڳgnZׯ_[K#/^T.Vr %Zꔵ)[vO,-YE[tqIMJ|5vcKX0O=Wqu>m!6VDX]kw@ Mi&&c }ۉ2! %p"PvhB7^1O3?;Q M /Ј wRWswgK@[x3pU4!RtSuP + !L n=J)9fVB)^m&z@\b؎"6 αVC^EJʴYW0е.1BiÂNZ4c k |FAz%` 4fsBvE8>`b;wZ$7qՐfE*a&qP&bFڝc5$_gxOg.sakpwr">d>56l*8׈Syyu[u~GrУ OV C"uZܤOSe\ {f7M*Z1OT\5xUhy;\:vv~8VaXE G^e})M/'F@}e+s-Ʈ,;ts`7U9W9s"YU*s("lvPh%+Y^yl; { 8<,ֻ00.v n=)Yӭië=^?co*8[^CvɲdGE8 P2t"0,z1k`S4ښUWK^ŵ$I]@Ǯc]?MoT-4&$5D[q#aaaDxDjLyz(:;;[ZZUUU FR-tQvqW2+PHRSSt:XSS500@ro3jGcFZNũ)jFOA=8m[j566gL. 4www6u 99Ybiۂmх\ҥK*ӧO mIܢ)Z([]vmS:~ys'-Z,zrz{{nQ'ij.煝2*!B[*:L-l|||y0z7hˊb[l_$gY5ʗge <,}t"LjQV7LN8h*qq <grKN+ EKgcωةMʆ)P5l6uB/=QDieg>(Kba8|/ V ̂&wVǚƾu;n';,{ ީqVmIb7=:츖mq<Tu&TWv]H.1n!0>"rxQJ Jaam^4@cV$WӸF@ĕx˵Z9_+MePY=]7w}lK$s,$3v/?F[tٯ\naa^ݢіeLH[0%~2#$!]T`:EJpR8TKVą}SNM&)i\(&|JUԈfYӰy3HmС}0%qӪPO۝ŸjtRLx:OcӾ.udo:ߡ;jC#hGzAآ]f qewJwШ^WNNXV9`uٚ5t?ؙh+jڊ%$33oJ_ ڒ(IXhjj"(wØi\\a1IHSS{$[tè֑RA[tz"]-GB-ӧUj]XXz"_UU%-i)Maa7õhhhbOKSDsk"(iJ%$M-9].\ FR$+jcc."3骭(nݺ~~}I.A[ JBGL<33C ȄJPz*FaΙQЪY dOyIEf彌d ʪS}j3Ih{<~:եIHm.?Ipu j9M걦 ).5^ h넳3!a5. z\'=m^h~AVڥ: \32[3y$XH^>QR5 Bt~ i\2j~G4ZN&|ox!~5'iDbN^¢%zPM S5

,2tB`+{n3N[,Q[)pPΒVʻ-ndUncV6*/{E]bdwcVJN}ױkt\26)E`c8zz-A RŒ6n6PvْSOt mmE-?ihut ?Wuss3z+єp :!-Qkkk&} u גPD#>ʽ{˷.^(v^]{EEǠVI'q2?P  Pq7|fYzT\Y2RKzWĈVl RC|  gLf"N uGYm?Cմ@2X{'g*zyǎqt^r%.*gC:נ*` #I!UVLbm`BƑ -`6/8;a` +y8y byR_66jO'[ [N:eNryLgXJ%ޖWd% u}c2s:TpC 0xkΪob3tgJ$'R(Ů9_ /Mq#n 8_/9h?C&hk 8 `V >pFN"&fW-3og@-d@=iۭsl:Js?W+U 7~v[ `|U[|ƪ(;A>>JVJNʕ7Oy;9(=nE$s&^V }.Փ^c_t9~ Xs؍27jTk5#M'$mh ~mtJ6ը]֍Svz9lxa~kQr͸qdlD1i(k]G`\R 8tH9  Ȟ3Be?jU VtĥbftR -ӊC~j:aM Ƶqn3}c\",8?D0'aZjђK4lE-C^.0E:3ag%휪Ğƣ3I^nh%[˒lA[ᣣSRR& 2fS»o6N2bdddppp?, eb$H0a) Pf4Fz{{h$ C1- "$DXZ[[i\trww7]K4Lcaa!&@](nE|&Zo)K\}G[Q)tOceU$Zo(KqE?P|yaVLl&Yh)(u@='g* :7ǐb rrvbd.ewN)x8,Be!^\F=Ã/leT]9 V!rqF\nW1/<3#$^ `ua T'@+-q5œ] E;}8T\y ͈,n.ZZ=k=LEa6b-[B3oh`XS KuCuozYu)3#[` 3ܑ1fT3l\dLSAzdg L~$ ;hIW 8{X_Ǔ\WurN +g*)+S?O=0?TWFE2`DVvp2K ڔo_ ^іA[.Vd|<`P5f0l~1W6 ΍6pu@3\{ge@|).uX#gY3\b]Iut`P*8t`~։y't精5J9#$J<zN>v^Dm؝ZJVs rv[cniրsN;!j=yuاiU}$Li D!'EEEiii{ϏP*dvvvIII]]Bi$&Q@͞D!E"ʒDj>%- K(fGbpD>h;i1Љ:o]:>)K$[ ՉuL\"\BVj% 3QxW8B~]@{u:c6ef"dZn\qq-I31@ ջD&5@;4}$b~Z5w$]h^EaxKE^I'-A[c:sC3g4[Pcze]Z&F[xZ0'hp͵R4̲1y93Э*ojNE?{ݹsGuƍ|G4FQyݾ}>~:%t gz$氫BD͆62*\o@ c|=#F[|/˯іՈT县іWR1F"ЖՇ,? [Nr:EXY@[Iu%0?xKQ{ʎvVn6puYN){YWQ?9|"mM) ,deÒu(:y;c:!6yoZMNj[ܭWSa>'F{{;s#~p1ŀ~7d┧~O'?l ?Tᔞ 'W?lgc_ZlrO=.T{Nf 4 gT&]auaN ꆎnV**L`]T]Q.d8*։(; †c |k@[3ϨezL *%[ŶlSr(I' Թ Mq+ lcQ=|V ,0pÌ.+[sٚM;YgymyÕ ѯ#wA[T8hS7>$&&f7~իVR!ĈTS\ˇ`E9&&n@[&A@4n:wӀZ\eoըZK a251,$$vpP'j 1k}S%ZZs.EHFSLq:q]΁uhR2ka%d=hB &I9Z' .y1MnKKV5:#dF}qqMk6tB|V,7i #B<'&w2•1 Y.xZy H|_bdkHBwVv^ϸT}^i^v^u@[n%sZBB0Wo-55Ě}hKRbɞ.Qt:(788(-O$ ڒn`jP҈Ft95.~t>];::Z__R".z-**F|c$ǎs#=\̙3#))--5Z%{[tG+**jFQ H|Ԣ"qBnݺu:ʦ\z^d,hH0R7$FΚɑ1шBU^D1-ZB ??ѣG>>5(.^Ȇ 5&ZXֻytkr3xRHJleH+R dؓpbk8ۨGg8H}?~gOY"+k'yDDoxo: H}l6sXcE >YdŒr J8uމ>=D>>pʎQbׯ,1SerXŰ'!9 ފpA^&{y5yѭ٢͠)Roh%8`;h9!8+ Y=X L @4]2y`YS2r;j@F[~YuoZmC|iLʗ_оl7_>z d#Yk+UK5b? &T/BNNc4ov:_n!B|o^+­:vSgDKlۍT*Nd.VV.>oǯOΏp2J#d4u5@ $gwOi%VBҀ:h++J@A[uڝlPuIdٌЉ&ݙ 19?&i;wa}8@[ޕJ j ڴΘy\ӁT4 DwZeTxܽl͵ B "&Xl.[Ou8Ʋ_-rw|amE5-O>9-&&A[t_/..kdz+}0h1H'>xD&޻w&Χ~R 4.Ç)WS8H޽K4 4(ҴzуD[POBP g߀ZPzZgmHd3eޯhף|QYJ9UPr߫5l.d5ǡFO>L"NGd'. *!eM!a܆_Q?[oαuPmeu4ǫ; )hjJ+RX8F[ϱ*6"Jn#nL!ݩc'V5M IqZk]MZ67'6* lA[װYMgE,b]°'= +ANj8-@vO~CͰd;lycPXn]iVC]Q"qUhuu7XW~1,rv[x3 {Wa8ah E'-HlVl;o#oTs{} p\ #q xJvq i9h)e;S,{ RAmٍ*0aP@v-l4 `Eg W4XZzyqu2b(_)0lG8rn:Ƽ^zSGZ富71 2ؚ~YYЋe9matJA%Zv4:8mAH& _&HN2j Z)~4蜉OZHRGx빎h@cЏOYh7іk) Iדk-ӰA=Lw\4T0(jcRX֢c%NֹM Ϭ#)C[%5%Vg|To!% 92]g C7jpg6?~FSѦ68 Xs 4ұ(4tWB۬ftrD^۰2v%hڇ>/ 4's;jw~h->6ϓ #""$à Η+|z%9jjjxA[n{7Oյ7448ݑlll,++=s<' nuܹ>Z4؜jO=+ɥHC[A[EҧfOQ) I\Ф7n\vMYT6\e}}NܤnR OP'iX@=-궀5-*Dum:A`tիWB9t~(-/r5Zn:dhDZAIȄJVmJEz ik\7)oڌd ߤXmUŽXh˪Ba.#,(lMw 8Ug!.+.YVEN՟mWۭ> )1SBHg#{ʙtZb'F[S< [!sk!] \& fKb3SlcaR5`l %XɬځȮ-jrt:63W VNU@ 40ritw[qp!Q|mF<@$c/K"23C.avPPdpf~xyq!n4E5ИDXPQuv:jŅFԐ:b=E_ 6Eh \8QۚvbX,,|Zo3!-  BH>h߀lS|Y%~h0KWV"WT B75|SʷFp `!Ҕ@yS[JƼLWKwS e(*;ny㔕 bW_v/%$G/_ mhB H и0k{Rc`5?M5+hZR7uxxx@=\t.ᇗ/_>si]Vt7o^vM/^(hO3Bk)ԖUfgg{{{i&&&hci߽nuYFPh,r.ꪄU0Rfi,n2^44{RM4|8( P  PE  dS b QeE0{f._-6BN:t ̷xAaߩpv:Ś+ΟxEم3NC V+8_ a8r"- хeʟĵ:H+Vf&5bURzXAs%N`bTS׍9cJbeLxYsYc7"RlC+ejӡzB'jDBf )N5ƻ eũ+|0~6ݑ}cebX7m6ZM8~ -e': F^=&=.}L3avsINg)h8U8?rx4^ae1u`8f_G "Gd++NysTyY9@O8u=_ql#B)l \ģp7K` lr 㦠h9q hK|;ە?I"( c%Pp,J1m i{s1]MI]&u C 2Ji.j95-x53}t>~'?O%nNNDNNaT.R+ab8ɦ#EL_/18.xIP_=oO l09_0䜀2J6c/vT B ;%z37{<x c3pp15xz;)T!rf 1f(N?tȷ%(2MGHZ`.wEhy`m1ךSv=V*pI!oumZsVЭ1x-r ,* 2{kWV.'rJVP8f([ZW2K[PIdʗiF[a9ڷOFLaJJڍv|C';wn#w-MiAps$lzbT;B)xH"ۊo<^_sѭ$-7rǚh%ܬЅː:M\N\b5? !gh|k-k~>bPXS1ƜjLת]<`֧`Sǔ=rQN3ˠ.c9ւ!ar,~z1eU0턪Ʒ~ah˰hho -LNN)//VVVhDˁh(̛% f"v['ז--h8q7 [ԂHB蒋Blooӿ>c8Ǡ_xqnnN26644(B݅$OPRJWWׁhK<%6yIG7kGGGZ4cKKKΝrk >2 M6эݻgh$ @R?inNF[\|ݎ*_*s-藄6/~W%ȎX,& K22=Νk#{R 0MM&FMm.//}o߾}kרt/\__mjB%TҾ߀ZPz-3|/*\9𪜫uNY1=RЖ[1{5|%We]?#j@vf_VgrO&*,UAY΄X˰WZBث\, V!U_@S ޫY1U& )Pw xsr Q 2AF͋ =%&E0dy|/*xr^Alk{BGʾJ4%"ݗ`?s8NR7Up$oi[Fs0d Y~kAC c,n1/*g+M܎}_2~tP0M$4gfff&&&>E$ $*oX5wq B%S?dK\RR"Z#o<.._b"ڳ(]ɓ===Pr2Z6hkcc… W\ֶnћIJ(BFGGbɊhhEKt%"4\kE8YӼ###ԙ.jGr/zommDd8w[ Pi tZNaq4j5QThb]xQ\ƍ=*.EEgr!MGx)uZlnnҍY֭[w޽yx]v̙3 N mjB%TBh+Bh,l/*߫\@[*?|4rcjue}DZy &5 UG{ʑYcnOV*׍(|7iY QOqb 3f@$ 1hL4 x'[8H-1\@#gЛhD|bS))gHfgi_th_;jay ;h\Q K&fzW~:HjcWH;^G vmS? V5r,2vmQa6ŪY3s {W̵$DT)/+;8Ql,9N؃QUFEbYN.&vu8ã8.*Ыj2pCAGIA=J*ǫ =e m-MrL ūS1p6-։MYu)8[(k3{AQpf +WYQNu/KA[h(?`Džx:𓉇ĩEO9cfD#,yn:f6Xw$$+rVkdel~S: m/ μH=l*TX7qp׎͓:?She7ͽ[PDI0ZC5rh':&Y(_U7"u59F'*#3~ j H`2j41jp<"~&14 %ih04Bk:t h' `~ܨαwZ?8_$3 N^СYC?͌41s;jH_3q@[&Еm iĜYTT$UOʐ1#~D999(|tׯ@E333W*hkcydddDDtXЖjzRo P]]-ݝI{D)~ܹK.={_PGG0.7ג0a:[PD$r#nBQejooގi~e۷nzxǏ]xCCIOpܽ{֭[ :n$#h$nH+H 5Em-$ImzD除tf]]ݎF[L%؊Fq E%%͞ѤTi`Д֖O}GDҸh6nܸ!Oõ>} .C;P  P gmY*o8bdЈ+Pe-0j8qv[ʛlf"^ 8,$$r Ο;1>m,߲EWԏ/W7>V>kd n ,T-t_K;s Xj!5‹LG(HH<<؈IA3Z(hk3 M mtn=͛z;7b('V+};b.3y'p$U]ژkIsYA]oF@渴UZ֩ %ǫq:}X.h?er45̻55?ڹ'针N7tМYSSS\\$SFFF[[s$,XʋKUVV$Wy:Q& 5.%[JKK^kqqqyyt s, P˓"1 1**jOHA[%wL"6>>>22244400 ~Skћ^!W2炭L>GQRBE.0G<nj-ys9o>w@4tK$UԚmqkZ4 ZtxӒRVVf0',&&VS<mћ5hM+4B 4i2@1(DH҇(>w E4h..҄v4*Jio@ c|=kY H wЖi<ހ{3xS 9UHFU1t%ΟVIkꄎTrX8^hJQ8Sx:?pWnqDkI=| A[ū\Ñwʿ7`|,̻ x 5.LS+zgVP T**f&L(iL+x?i\t݀*&iOqK^vF[}ˁ \PlXg@j5[K?4)Ә̻a5o5:W)X&::ZTiii*J(PRRFhCllhCB&,Q$!$'ALOt 2-٢qɖlffĉF#^LtT?^1#]eChkjjlww7 _TWQQQn)Эg^xQ$ *JVGzzzD$F OdE%Ez{{Ō]F~p[>r"]bD4Libbo߾{GMDY VZONU$TۜUs}[0 #>.E\}u *5xD_\'V  d܂eюH8FmP%5*T#Axmq>6]bEP{ٱ\)CXR{4ZF( &!DT?EWSX.®m''ʾa(0n,]&`8[争a[_ƾu}u-fЭѴ t6|FmaV9Va1-dfϨiV|E9/mr#Sݼ?&]d/`*@j~T H󸃶fsuSYQmUض .sMdee*+Knׁs^gkЖ#>Po:$Rme #V>qtuMxS$"I_V;߁+huҷl*+VR(G3b-*сu zlq_슶^Rg, n4V(3mh,*<k"2ժK?JkŖ"fY* hKƶ}mNrs:Rů\_I.~3Mnej5W>:VQd'X˜o`]Эh$=bŐ%W$k&(šڥk'f[,V'Нsh#d 4>̻Gjf}y>\%&::zdKvŀ3;>>OjǓ1c=ab)OW=h+r_rI(yyyglPDH@6)h&++ߗL`ܔ1hI(Px)))OStLnHp=5=88xq xRQ$ Ds2KXbB)aRЭ7nPI עu-z}`.ի{$[e(y՘cIF[@E?˔.4.‚m < =9HӳJ G}˩q btntY__\ʕ+*h^CۙP g߀ZPz-*߀l;{Ymrv!ۻJS)D#~_F_N~/CN>HyB9G8Up՟)?xIxU-6/5jT`wz]  {?ڃ+'T[*T30W 5}Э;L\?35A[û Iᮉڔd`la&Zӄj6r{`-dzːxg}fڗ!VdddLLLbb~$'\KOJ%ۄJZZZ臥 55uE]. w JKK=1x,~wI8$b(~ E4\Hɓ'ƨB-jjjʤqzyn=9ߠ-jsrrrttT< 0RnbPЭ+W&rooo{{{ccض}/KHqӢ[ӈh΅ " i)cn-C-sΝ;[[[ϟ_YY2fu[ Ժx"̙34@lul?עF~%hkssnD{,+N[\\4\^SfR!W4:H< IqݧQ&n%^&TB%Bh+TBd j37]:&M[̸㔟}/_N_~J羈} 7˜@;@ X?yec%<eBTF5e ^-^Wm^2S &CU ,)F$]4"뙥< Q%® @6" .&<,cp~3~q_HnH_:5oX fޖrZFdb{?B&Dj*'y|&6p@d 9* }ům3ݢ^ize`ڙIGr&N^PVE·]Ӡy]GoN[F밲_eɚvWMS[l}^ dvq,4$an\1x Y@ 5:Hm"=A"{VN;J0@[V!2pa- [0"{H;XSZ{Vvv[}Yh3m 1$@\N^W;v{B6;du^Bn$}.fV>٠BX>w,g9c|vF8"8RꔈEgAh2ڟwI]ʮ%m? $ˈGW!]=%OV>BMQWkAw0艹ȈN`-\H"y^܇c]h u&2̿X3'4Q5kǭq~Bg'<,y2M}}t}`vD֪ES{VN%{ X\ԍڶk2Do[[+ Diijd鱈Of}f}߁k\h+""B*I qKTZ[[n'qbl=%/uwIsw$ ]ePDc%=?m  J[ƈhkbbBhy-5koreАp-p&5xhibURRBSB˙p|||rr)W޹sիBkіmmmm]~]WVVEEЙ~Eܤ5hظі%ѵkNOV|iiEЬJitIgg'M>l15>??jBJO-˄JVmJP|֦Lt5*Pޣ\9 UV>UvU{^`_Z_~?/7g?LᐮnEs0y]n=Npr5??Uߏd2)@^e7I S tn &K0B@ddn5鈲,VLʞ@SP~UYX5Ҋ XɁ⩉ sbe!i Ȣywl@WW2z{ҷA{2,Ehff CQOx^w= n !O{/ZnBvS8~YU 9JA@e'"=+~/{ou^ )I+Ho}X$A W"ERHر[IƓq/y&rbXeDyqT׷Xhyt{4nݥ6*sw~70L~Q"+!,E*;ޜ^eso&GGkZK #(;[Wᇁ& Z{e0jdni ]fhk0je1NSU>To-MTh"ƳU8h"r m-KVJJKm=|=aGO5B=0e;n= m ɱݫ%i 1OHHͶ0Cjߩ-骘-Sgpzz:Q"ݚ^Zˋ\udi\211!/nA͝={V ]+Qh hzW*8]NÌC[4uNes-ݰ.I,>_ZNh;vqYyiuMgY(hFm6ᕱ{." hfw'N|q841Ws8# K?O[zo#gwYڑ[XJ~p0 n| ݒPDVieҩj ^ ]nBl$߆3{NsPD-r\řg+ FެICZd!h;= K3º@T2MAշ2֡v9ڳ :^ =.B79hG:buhm\欹i\ILԒskqjvFHɟx}waµN|3fL-v`&t`l# 1ROs\,]FME{Ev;gۣom }sCZK-n 7ANMTrUYY"$byyyIIIAAAdd$0!-'D)))d9JҒH7*,,[NyF{hS0===4"jG8&''-[v+v )FX&:NOPGQN\ǎ~ 쬩IOO!Sll,]N]y-(f~-|1ɕ]V[~a~hv_4"ʕ+.\8s5"NliŋiqiU[ڒΝ;{( m9˗gffS:577G9V!sPL3zJ X:Np]JVmJH}Lі-~RyUj9towݠ6}%۠ܥ,;aI #a־cn+>P"$RJLMEA[ XXQ{gAZ|ɹ^HbO= .^G>!{YU@II5.o%MYpbXt({}F j C?^ބ_4-VX/ܮ'au.sוypa3 fQeYlZ;ea¶tKY]ܞ*±LT"ЁNʜd,-mq;2E%h+M 8h˼ǵ*Q%-hPz"7Zv떠<7}=~Fh8ݏXs#{{.f6|UMCGw6z*acޜGLH@JC  Xd4v}~򛡨0jYTΩ7YLդEMNǤڕ<]>jc#tξ'͸̑Wϋgk־G5;= IWfRUfRk|HpEDCڮmUS:?|tFvGz^KVZW˰_t|joo:Wc+& %sDy \ s/NwFي$0"6x/ RI(LiQ?XݷjWÉ̖/6[B|*qq5C~hˆ;vі2-QQeeeIcTTTyy\U! Fri,D*Vt/:Y靡C[+d$ErRS)u8333%%%>>Il-is9ݢh唴UVV*77WZPc ŕܷA:ըnFh;f۫LeY~ ; ;\k921_Kߥ`爲&>$#|2yCڤ@\l-ْ۔# Rr26e'.뼎IlǾ(ϛ{RDZ`ev@Yc ]fQ"tS UL }"RSG=6,A%)Ka;xkj1]ց] 80𦸗W@L2_W/9گ;{WimU= /mі'\vL";qSJsBm{|3?p-1\庰Y%-T:<y$z@Ρ_P_KQ?l~P?e/,aަm[<*'@Xvݠ0m)d $T=X4? 3m4/pW F$&@#a):akm/)}#Ş(b:pAWr5&tO4*Ќ(hŗt't1u]k0-_ٯh55= S1g:VgJVzފ85HkڒsNZZ me/G[c"dI(SAADƥ75gds={"ݢ.RG)sI ZWWG則p-gLЖ"A[ljjʒYQv-YRYYi6?%TmͿSrl$z%b۰zE3@x3PDM-?>g@RPIBHRdff&ݝz,ie.QC= mMOO_tI$[~%m "ĉcccN;#?u7n\rٳY__OFm||<==!HOb:I!ГCgRtF&P%h+PE OA_]wk~\y3ws'AsöxIae ][ΟzX[4 9\)+ݪZ9^e0_*wBziQw1F ȎwI2Hgf2y3X{f_p5f l3Z`ԁ܎ZQ2 BX S*+ N\qPg5B+VXU#ײ0>сQ>H вȆy/I-4a VKrD p:[4cIاQpbNvJWf!`;:({jִ}H.{=ag*@92"xqM ~W)*=_s Ӫ̔JCcUQY,ٴ-yx|eqLywRyt^XV25٭V vJaݭtάm%mQ%[ t벲2Dq܋% ͏nUUU$ w"F$.f%BpA;}F=9zEnӼ9Z6MZ^[MД nшFfff._|UgNIT4REښC[{nܸAҧǎ4{qz&ũL\U[4)M5IO.62(ǟX@9,ȏ/ڒSromK*OQ|P)G Z`fMC{~ >{KQZR.e::ʡF`ѷFV Uޭx31ڠ,bne$FdUa-࢓y[XvelVF{u̦\f\qe96u78HPFxTזMMf,p4\i[V ü2abG_+>"ދ`g:rR$b/+,gADc\[b U-vcc”g6,{=Jg0?ԓ~X^^B^Wjeū=y(T.s7Ǖ2>X;sqreloKxLxɼ5 )7Y]a ?$9&=lNQΗkQ2N,iDV!U­>|OkX qXّ^I8P,1RV4k;801[N[AGc7;i]QepZ-؆ЎINqLǢ}݅&қZND?"Q -&~Stwq!GDRoFfgg#MNN$>TK3C3Lˣy SSSb5/ׯ_]v9ItH5&"ң74>R[mzHh4dj b%Ph+%PB>dHrj1+V͵3]R?~;wW: Qʝyy_?V77=w.{nbSF2☖Has@2n2KշF Xdc1 .3{9^e;_ !NYЌde^)mgt8A22v,26p gǾoqf:!=u$߈; §j@[loFJF~KY*Ǧ(ܴްeSEP,S%`Ec /(M43Nb{.]$4/^#[uy?X-> bЂ)Y5.X1蝮+&d-A#;XQΡiCϴlږ{ ; P29ifĖVp1܅ʻJ2zEzLƍT |8ggo) @U >&#1"CmyҐ0W96^2Zĭ{/gU|e;Zߝwj78Q{hk?xwFDa ( eN|~hN/&IxZUk~CǴՕae{W,|Vvğg.լXR-FtwXFX`2 Cת͸y*siu.ZXϠG-nmrDw9ѽp`S`\bw!|0l4 i3>%$Mr@pSb`.2W:l33{56GYJ^j5+ѭ&j1ٺ8rqڮY gm9@|c>Vleo<5Zþ?mڰ!ht9sPnDЖp-w\KPll''!}W[aЖSܼdKh@+lJjjjl䛚Mj0...55kEp%NR}WW-;q $߱cq_ ѲULµ>$r 6\ϗvzӑ-cʢ[lM.4:ZS:'ڢv{l]HK/[!ZǏv1(@[(v~bЖ+ vg]n!Jy¹.rV_Xܹʹ9o4A 4̸]fQ*ALYZ.D ;> 0v!s `C7TeL)2Yܱ#K%閑 %Rt]\ _NNgs2X>sCi2R2שtFϕmcmkϨٔ-,Yu6\ylF?3;RA9ʸ= ,aЧUv7s>ZFb |,˅*x۷FU-XjXɉ2{).KxEy!^ \m2:!Hq%÷mF!F[΢~rj! >sdmp¼2^*h[ =8{yaޥі{3$.<ܛg?ڢ;_h[aW3gkO7:#֟ٛo?GwSs?J\heׄGEGHV4N$ BwG-Zm}I-~V+/)upinIt'k l# 1]F3YNGedTx}t+^Ϙ 1';M`8HLpMJ-f87⦢H 5ڏAL4^ϴK`qi[X1}~%MfIc2=B~@xHq4mr-)2m9V&u ѫ\35t8m4k6ڦb'P"28ΨFn%s)lHΞC []+\bq))| v;}r/*̭UcדmQlϳE VC,~ SkO]8e^"iObuV$UUN }jDV>ji|h˂nJ4c`b_~%qO " ;'$:46O"kXՎe b.]E&N^wq@k׸C:=Z-,vtڪYm}p _bbbQXE9_6D%O+-ʜhY%_iiHDK|%N\~-jF[l߾}4dg,tqcǎQR^&p-m=k9meG;8J1 +Җ?%NT uR$M˗mENIFt=]NJS-ϒP)jzbKhhgΜC9w̥K7nܺuEFH(-<b.G3cFPZg %Ph+%PaE[s\9Br`5ZثqP}Ta wZhex΍M栭susesF;؃ /.D㳘`yͦ(kÐCOw@=> ystaE. '˳ +YdAfuaZnfu:60R _? W>sV'6(hU:ڡJ*v Q(v>C|B6,u} [xu,VYZmc[pN:Cw:2ľa.\2)w*;>>vB9hDPP/ƙЏe#sb6-v%sd"O((zAQBS/f Z]Kb;SuSxrineZet?[}72'<̾hL+`TW@[LYT&r稅p-XKdrGG[ފ{y+}wO~-/_I1}Jf%$myG^{49 %",# gkkk8JhĢ: )2]XպdWs>-T5dY-A9:aCT4K'|_鬠v.OT8!_ ڠT Tit`8lSAA| Y|4kpXЌ눖kUvF3@ ;M׽ګ.)zGdciQlvTF-[KG tЭz ֶDMMmǭ쥝thip9\.숦['1\ߔw]3o<<ю5>CJPk([nIT-sNv_"~S?%\Bl~"cǎ9- ?/VSSS]];%[vxxdpl,IP(ipvOPnezb-։$ӟmEXnМ גп(n$t>jhh@)NaI677S:::h8!o1:BVUUIytҦ[W^$CK?::JӍrgD^d'xL갍fffm͠\xZ~[FtKIGH1Qo @-Zꉠ-cgϞݷo944J|K_|j`?>#53Ţ#h˳CWyS~DpK;Y:8}gW/Y߽7|?vo{f>޵8M?jXek\*v#a8m9Zi:] 6a<_F쀦@zQ0zgy. %=g|pMhSZ/ٝMqylٝ _pWVUxCOyaMWk9Wq{Țg*gf*W# lUDZbV25YN(sm۹BAl.%ۨ, G3[̌P}`ge;ae{n_\g3 -[?6hcV2Շk}.clF7ʗN%j1>B'y`ŔVcy=Mc哅d"c./Y$F@W`\ "c*S6d4F},D+LjBߢqy4/)h+6\ԟ1F[Fhjˇt).'k˩ݩja@Жg#2пшs Жs% mjn?ڢ;֚ϝs9ћqxSHOyE7qsC"O!GV;[TP(^} µ24M>#hJ]U- 6_˫if\{_\eXt~C;ʬ}WvukZ ir+?,z2>|1]܊7mkS13iC9kԖD\ښl͸ 5uSU)$,Io IRT4x?+-Z+֩c09[4wn%-%{i؀؃ZQ~{ţ Gt^V#юylwDVGۗAOxwoE<տ56 1p%^[6PYRmmѵ6ԲX|zzzVV$&&ŠHmm"hK[B;644$MbN$%%EFF:/ ڪVkkkSSSmmmee%]%I"EFo IABٴ4|9M}Oww0L ~ȅ Z.٢v?|@L8J0EEրRK.tDl/#K ;M&M$7ԊM˗%C+WuKiV֚Z0X'~SSSd!]8;;;77wٳ.\oq5HORYU.\.zN~ԩinܸ /ܽ{_ b%Ph+%P~ЖW-L`C[nO 䪅-YjIP *eĒ>--G8k0CU;Z"'Mi8XĦIbW·h|Jy_vdA7{̪, R@ q-]yX<@X;.S7"c-;8Rdr5^\y c3+ GT?+Vl]n'q-*MPe#ͦ&lg #kVH(0rDyJ+O `*L :Am1QeuhKU;M 9Θ5bXml|`(ӰuMc*HP< CTc&oU Wf?;Yڽ9j$ d6͔Dh]PY$cu!𳂗JgZ"HTf9_f{=ޔ 6W1ePF#^3&QЖ'YyUmq4/a:myop@rQ Ж|ꕻ􁬫G乊m##{/$7|Uߛ?5ŵ\'DfKwADLثE\vhĈ^=N3'r^58҉*L.< l SAgq!oњ#-Ns`+p}nuPpC8X;PC4xڟUd@6riw2_~>GA6Q{Idh}tGZl'y))]zB}6\"i p`RR v>S LQ~ :|UM{xd|(&r)?QK< m-ϓHSMoh$V__( Zp'ڢɤMOOgZRg :@$MS.ҢВ‰ϛ_<,I-P&&&lEevv.\8D蕚gBnOOOGC["z޽{ӧOv1(ǒ?5sXy晏/ڒ]equwfQډӖ|FOAor*R5ʽ]˕DM@*ʙPɋDxS¾[j7/+N}YE3N}Ny#z"8P(e͌7+x!tV*d@Vj+VZ]sxAsShj WSYb4{/~ط?~Ih +Z+ * W/7vN}loREs$S EO)'xAו2xșXx>z=$@N04Y` q^N_ITXh3=MP-`UU~nq]u`m='<MЖ ڤ>|Nyxa 9r|A?֪c֝~͝WwV})*?x<~Y}*Q *t hXd&-- sƯhpgRzU8,3%nZ/UC}gͻc_]mRkSf_UɪҸlJq]G}zHt]X;KRIm:.#dPI6H%LepUh**]|; b,־[D[ {vmEZgߦA`Z e~k JI!w5}D-tknE9i:k"]ua*ƀ0 VJnAQڂ,Wꥒn\.tK[-:K iEk&C vjk[9o$%Gwn {g233ssso\d-CbhhKLˡ͎;%%%a'~-ΰD*655u;ά`E]4(E,9]–gHЩMlB]L*0e>*--~ I%uZ+eQB^ /+6Zn%hz200 YMLhr',//0zCO ӭ+њJ2޾}޽{tfNNxa+-%)ﴚtV:{ 3;;+ygQWcIK,\[SSCRoŘ8͕H37o޼tJVmJ'gHEu0o)1h3R-r?}hMK+-=>{1%0=)!6>ӇZ1AL7GXsP 4F4e1eF<igB,iL~Je`$eV:1P4@S jȋ7IyqmX9H<;xխط/7bfɘF0xoA"-L8:/GƱy!oL1&c,:es1bI[.;f3Y#f!`uqfŹJȷGe`PO~u/rn~n[nT'/4Xi0gA9gv{IOlHbXT<W9ucg;3cZ7UBsՊ[^r22NiȮʔ;FY=x-o31s>ܔ''Ee Y>X"S<4ig4*1-+-_>2z,ؐ3ukFֵ|Rbw6=m] FmxߣSviD3tkM0 ZZ.Mu1zY#Ώc\U֋Ag*BwȻ?XWVBϬ2 n_0A'1M3x3Zu > !HnF[($[#`w G$C Fg9Rʥ@Zq>U4qS 9@Z 6r}zvvvff̙3*k~~矿{.]NgŽb\.jR7$Q# a fuE3)]tkLJ%tɓ'm%Ptŋ@ c]O@ cCD-ʳA-DrısT_7!]{1[C fV NXH~e2"I'@d jK,!਷Z>M5El? *e=b"8;JjѻD0r!c36M2Z̗y3kFP[=Co܁N_}Wb}18͑?ۃ=&qh>p~RlUs1.[ FfUFf>vsH_s'-Z_}ofu@-LVcYb]PXe|W'FIHHwKj H< O&SVޟuQ,΢qeSp8W= Řs6^ X:cC-Fpep*̝U Hf/bu1lGq.X-Y{8Ѥg9O18h! $lATc3(b6Bn'A_6*Ef^"z-wZتJ9Q|꣣-u#NnTTUTԖ yAEv@#u4Mi# ƀIN[oՇQ<(:Om'&&nٲ%&&Fl(6'Qjã-]L333%/2zU__!і葖C:f:200088 QggK6h"FFFڡraXXmNn[/G[Hw>466Rͨ;h.VUTTY=~4Fjim jE饑֊hKBmuqRBnn%"ވ+,5HMi.zhFt ݚΦNH󧦦k>}zrrrzzVpݼy޽{Өݩ"bEh4vZⱱ(6ڒ0Cɖ( -^'N߹stŋ'r愆&\ի.].Q;]LJmV]yO$ښ OkZxFXⲰu{Bw;sc/M~n9OC> !?|*炽<ܹgTs'b^[-,3R>#bV49l$n@X%iD)<ǻ pꃙUuթm_,"h?Yxˍh[oN۟}c}{yl|#v;߽:&۽0mZ*rUfzGi6\ܥ\7hV-`2FѦYaw*@}̑x6v|7cX |]NJb< F[#,?q= D*4!>m3eڙvaP50E3 )R,Ng}_R49y 3o!+ӭA7wtě鋣iRhl捃T |F8B[dZhn#&*'=V'`Wmy9JUP-Жg'cP3?@[|wbH4}ŒjIkU\KrmժX^VAWVꄃm딯e.5}ԅFmXi FoUWCwzyk5qqG"Ƿhk \$1m/ק_gq- `\q~F1gܟľVg8t\>tp,)iaz'qvJK`aI u6tJ>E: 0+~\6uL]t Hqtvtjk4Z>= Ac]:abfjՃ F&  t\?A% LymV.r$BU%B9њVt1tWTG鶟ڢxoٲE0RN'[/ 333ŰݎIVBBBllA[N3+'HJ𫫫ojjjiiioo;Vcc#)--i!PNc~D[6:3u(9sgYWeeKzD?K -jhhi4'ݒpŇ-[~hɓ4W4jَ҆"P,Њh hnJɑbuEmigϞt) ^z- )9z5; L+HrK.E5H$xĉY:[NE.&P%h+P.W iPPǒ_v[K,ldp 7woaRj!omf5vonչ/΍}ځg!pʧ"nQ]7ǣY-d- +mdyٿ;ф6~ofA T4ʪd~bpIRVPAZ|>ff*.AYz #~a>SHUc<1lMm{hr<-[9 Z3 ;cfI#rvyu{ņEVo-@uVaJRDz"7 z6[oB|hI_OfmTϡNF w4bn@N6;PG04\YcV_6zU3`1_䧈 U8)!8I",EGklS< o~)Oıʝm-;z-),uŒmB[c7iHJm:Nn2;1<'*@("2“#JJg&K֕ v??Xޟa_Tu4j oPΦ716A[zk=j!|tRpGUeZx̌mڬIN$d?D Eu6[k7b lײ%C41',k5OfbR|9 $qI$^G̣*MkKzpP|\"uKq`q# 3Ut`ѷ]Lmeb "QC'𶂮m9VCNCp%g-7 P,SmhihKř/33sd:|OD[tNa)*EHNCCCUUݥNŨ8V}}}eeeIIIddО塈i"ڢ8 E;,Z|?GY- &D5іL-g__M`\nٜpŘDA[ÂN: K^5N[Cill\{ I3'&&ؘdrrrvvڵk/G,B5=cgl^BeG8޼y^%-5(sݻw]ݢӵB+ @8ſ:a |іP8[/lS>)asoVl`&_hB,3R/MC[tF6Sb"-#};,y6F'LO9"ؔ#Ated3bB$+dcyv*f Ch^21[9P"L+:,+z^wSޟZf=j1zѠN4&8vKE&z4I6nKV6x/dt%<$83 8PRbvtRKG!+({0Ɏ7[x&:Z5:Izlqp3`Z&E Z*V]2oݮ`ڲyX6 oy +x + ?H,^WDq2ZLδhaG5πZ]o0w=9UF4Gs+sjr+ϰrhu[HۨhO mZڋ;g)ڲC1".#4A9mn['/;|I8'Q.7￴kχl 㕐7W`k Oh xI9$>%Z5_GwkxJ\H5h{/!E`i@:0?APLf)Z\$zmդ%Qe܏@ T_kE ڒߍTd::娏1蚭`.i\q+IgN p~Np%n ֲĒHL˲4꟩qʓx3PkcLt1cif#n9j\5jU 7Z jqt=\;(Krtn-F[bN{'QꄍXixHF[~6d+22C-E;#466Ԕя^Dd R[[k-wUTTVDDx1"r// jωl N]ͥlЭiQPRQhZh+EEE̞Kܹs$qaee%MNb*?ndrr2M%ҐWQ֊ւB588HR (j4WUUUZ###CCCzr۷o?~vv.GGGˤ+=`FOݣ ڢk/hΝ;c8===ri:_\n]rދʋ. b%Ph+%P)vڏch=!x}Ny(6(nUɨ(̪9(A+pV ܿxM*@ΜyR](/FylByэv0<273a3^*/~T:V''rȞ?dS<'3qp!\~֯?83ؗCr-D=[-\}5LNXx3=9s5-4nhK@&[M}؏ힽGNEc'LWNXenj޽rH02m"Sa#N)hfnMXe%d|p ey5S0myvcx0>,+:l0p0lo! ȷ )g [8'XʽAc9@똀yQ-!Жg彗8B[m垭\j.}ɗ6PK֕w6zA$1 ]k ˱(MkHbmiӸFb.RQxrPcb4ِR~#v^ k.ȼlgrjq'*|9lYAb%H`)^Auh4ښ@6ֺ+xAF&>$3M:LC~A,m5`J پHh阓zݧԫߦʫH(<%[Vߦ\37PDɡЏiR^-;ߨHvvі4|>>>>666""BN9іPi9zf322lL****<<ܩ{XkI?T [Iv<*tmQ tpt:-&&f׮]"5`њmuuuuttH*16/))d[-f"u,OǥwGt_mIREkQtyttӭF[4 4 K/[kdE%j7jѣtzu2%%Eb"ВP'NRg*\tƍwyAzlq 5H6--&|re'^{.?}xOOO z饗-;&PXv/~P(?hkݺu$e(O8Rjpr  Z x#[~ݤʈPF,r5#j竊ZE~`^xtה2+)=6ܭHZT{䎽lJϾ}ʨʼ+\>gr>J<!94r8`{whA[t7$H gԈ3CI#V]I#uwq۽U\.u3 Vk49}% 08z񢣺*3~?W덇8LwAqn`epJS-z,7TE/2&B b,1֒ŽќaJc+<4* ĚbHefHMM`Dʼf9.i)3c@c(a "N;l ZAW!~٫ =|'SuO$XYix{1W +jtS]Zg AE咥P|}٩ 5b<)WZ}/B7蕕~㌶|?$Fo\Wi|R9a8Ud5635B9k[ hۏԇkʻshm6b6?Wn+D[:5:_m5;ΘE@5pHlرp315[ 5NZvRYC!~O/rR^ykIq7o^~.soA?_u'ݢj9 @ @ك>E["kOo"s,QBAI2EeZ6aw߰QIVp4˯r15bc(7c^VY ܌c  rϗQ"NB\sձk0pkʷ 蔩\ԫ\}gQ3r6j?WeʛirPqcoAjTZF+\FxX4LAW&,E3"B1GA 9pY/ce2Lca[ϛY̓7n [J'::yɷKꓢCfI!5 7.8֛|C,iǡv~'V}̅ue20Qe\ᰨ G2qA1Q-gdA9]%W-)WJa ;n:laƢ^Pהyd_2`\r*F懅K 2~C5O24-*o{Ҽ ʸɳe2Xn?A[AI-0[QE?bUX"y0P?⻗)ˏ!nv_mͪ]hK=8{ XKmI䗵>])rC5JPr E=&;NtA3chR}5u:\O_k55ϝYAP6Bgh tjP5ZB͘qkOq;F==æ@F4*a.=Yi5eZ/]j{j_V޹\ڊsxd];:ZJX_&BJr~3U(IV[-_'g@*I봞~?;lNR֥ZTD;:{q;>zk]s+fhرc]]]iiiIII111JqȋiցhkТ]{I? ***eQ'h^$Xt@nnnzz: $66Za}Or=KKK?3=PE?ir"ْDW(%- >66@Ч"JiHHH(sSj\. ij)4-b)H*;2S-SLh˦[>یVťk(J$UMM  TiDDDbbbFFIP\ ںxKņ9s>vڛoiӭ^{M薄"1C[@ /b95E[_׿hZmWk,?_]qVymyv()ʓ|ʻG[P2a6G[j{j7G|(Fc88VY.{ ]PVf2,yhxp Y<-pHtƠe:C3s1Ϭ Wf3: @s,G@Ba/f2הʺ/a {V2R֋\t85ṛ9Yw;,H(}qPd-σ˽rt^- ,:UF$<^Ԥ2RLhhJ}RshYKTgU5CAF.Ø/ҙb\qN2,`dhfaQ M`%dr] "MG~BIt$`uRِHyi 8سi `mrqouƟ&n-ݓcߖtCPA?ֈr8A[F0ihߍV%h1! HSU:$fkڰ:'|߄hMCbӂ $otk77.jϮC!m6%);k@@/miľi.w瞧?A.hDWC (49j%+C оurVkk(ʨ񬬬TQ{F;T҄Iu&44V1}Bكz'{(TR266F-Рjkkggg'&&Yj0<(4ZX'עUo~b!K" }u>hkddDPO:4??O]9V x%k}}]u̎C\XX8{jqqvٲLץLKK OD7ZqIvItzNkmݹsgݺqH垺G3I @ @كy/ӈrRA䉞d̘kXvrdzӭ<ic IQ wϽ7ݾ4MaWR,n1&3 k]'Rz8\̩81$1eS0ĕ-ʒl6ijvRðZ:Z:WS@!;kZORVv hjv/#i[fS2b ccv.Zˣݟ*%Bߵ󾉡J?BKa+ﳬ\},qcCaz*h-(Y&oS̻h(W?m:D[zc1#QK5ֹenv f?VVY`>c)s񠕨~=:(jI`>X/+ Zni\-A ي 6űY1j!>V%)#Z!LA6v4[LHX8†oȬ?2}ZA$;8!cDƕWtq- 0k9M|5w+ʸU."Ky;-ϐ^=NT]hύnm=ɐD#Fke:vhrҤӀ9W8 *Ë< БQ6G+ls1`H+s:κ(mx@'eZnjSg]uH$P؍`X<Ł8}D(SiasMy8];uxf*ҋHOyH<?I#uX lLY94fB]jW;vF|vHqr9 E>9뾄!fĸy۰ܶ}^j͵jҬ#t`Oֹ $h_aݲXfkb6D'bgWmY:&W{۠U[J  ? Ms@CCCǏ///;!SjLe IHHcY,G[C; -L M;tXaa!Cu$ҧQQQeKww kWW7~i3PQ2Wlڄ2y"HpEyG!!wAQKukmz9فgyj-і7^yA^Qqmy/RAm\ZRiǓ7E[^(#k%;WK϶(.ÝOqmjQѲ hбLu"~wmԚy*f2;'P7%@9Qun]1 ;WRF69E=v֪'HAuVpjζ?{=9uUAL!@[AX04U ZS[Nإc u`spJĒ,cu&;K#?th$t;KЖq$o:9F35@:ܗ?u1r<ِ'~h+//o|||ffF1}J]f?=ڊt>FT*++'"? ՁvXUUU4zjMr)XY[===N?666==$PEuuu.TcccYYYvv60??J?%`oo/ !XBK@Wϗ+ KLLwa?rZQqѯ"֚=qDCCp-Fﴶvuu ڏlEG)vSyQ}ycM+tE02u:bX$I331R Kr!wDN:ހRTp,O8#a;UT[/c:m]A? '1Zհyf| ۴EnӬcg*pV 6ӴtpMlJ`1wV] riSa]jfZ^6EGl>QOuS<ex U@J&Pp&Oc7o")(j|"xlb0s LV\ 0g]).ߓ̲ dasYd̂W#6faa'h! ]z9ݧ7 A} ~[]vG}gߍNRMUrm= "ZD5%Xz7C|W:uv ~: %kGnq@åZ AQP{qwh}hk( m53/E(XQ-to:|}\GEf.Vw?3دmeeeLMMIӥJ+y\A111ڪ""tF h^TTTQQQ[[dm!KTvB='ś]^^AdlL% Βµ斖ϝ;w镕 "ΥLXHYy]f}QXSwl+jcc|DJL(*F{>%ݢҹnݺ}͛7/_v766n!l͎FiaJR__Ocӭ*Zx~t.:KЖwI,$[~- VWWtF>P%h+Pe?ڢD71oMH''aO<W|tppzu3:C;v+o 0.kQ>؞'PlLs`ceְpe1bYNӲA$2tʚA&RuُxhʑgjayxGR.:%RYGHG9̩ؼ+z3ȌUei_eN}wB>Ң-(e3Wku#me `٩u +Ǟ lOcm8|hՊwo\ȶtЏ^uk|Q*cx?~6Ҩ} k5(ܑ% 셂 FuA ٹB)o#oqhm0Ik@YKl9".ɱݰ;kpK .) 9 ՈShʾs LCq݀Z4HR8W)wbuuG~S/m=r|#(#Hcr-' !sLZ[]DH#FZӸvkV+n]mU:VV[%DI7k"w )`kSkG$i#[Wcf3H(ҹPaї3Ɗ!r8hI:I{uZFk?J 0u1rHwS!_u-WVVڱl'GpppHHHXXRhOrrr;Ǚp?ڢOS&''mMJnn3@USS#ԥ^TWWedd$''K]hԟO^dZq%[!DT(3ߑ2+yOl@A`Ål%(q}Ll]:Ĉ37OhhflmY| {}Y$G,]̾C|Eg3la|0tӻ1B{o-CZpD$Xd!V&# s,zVl从='+,TޗLOC7v*V>qs_ݻSOЖm7EV:}vJ9tbmٔM(j|-ݩvį hNeZݚ? &뛀Zo 8m]U`bt*gKt<`IX )ƪRX.Os _r# (^o੟_xovau@>Wp8+ [2L8l6u &ݓ(pdHW'?QLaG*ǟ.><miiiNtر`I(6tײі@xs DWbbO U١EK@)"+ }zzzqqq}}}sssvv666V&0***::~w*1(LC8~x__32 5|'NPs6ͰC:ɵ}jYlҩ*==^f 6I$3/t}}499IkH3C.t͵$ jn_tQKlEŎF"hzؿJVmJG[՗ mj<{O'x kTz aq6YH3:9%";r7p8: S_cmfYBg9,{T- p#~v8ĨbcdA8}Gcܷ ж mu t:WzLx&rf0˙1kd`9OO5$4R3/=QE d82+pdYQV [E"j99 >d߰dW,} }6ӱA `<k &T'Lag3kLK)ٓ8bV7QY)ʌz5mf3F`$Yϊ8h2j=2$‘F#yit+_WVd\iEx*0?inv63[XGw/NrR>ň(/yAmqT~F$갠-_q¿u/^x׏W#B?2QЖw{zc!0Ng7壭GV"Pʀ2tӚPKI&r<5;bdBծ}ht:jrieF0Z_mNL6 /(wvF .[: Vdj֦[S4[x18֣c4 : DU@0*!um:Z g݂o~/ N/_0,Zaw-:Z]+0K:a2rm (.Oi lyì.cbwl >xEzW~ثyxY6:g"aDv9;d87*ǿ]lCnD}l9sB1u?,,!t K%(;;;!!aO졜~1&>>>555''@[>Dkk+]166>'utt455dTt\qqq3o,ԙ3gH6=$^%PU us ᙙ6GFFKJJӝQRԚp-ZJ&MEaaayyymmmssseeeFF!<<|*hs|||jjjvvv~~~yyymm""ֲi?bq&(o M $g,tŋ"QN-Am6Ee;SW{4]2E%ZhZRAZgPb-yAo҂N%шԟuI @ @ڊB:dsQSF6r8_@%s8# JXuJ`FI>NV-O3i>꟏_lb 8U2aȟ c|qTiL ӥLF%'i14 4~@2б%߱EY8z@ѷо}FCs>O?a`5*I @Q.ֳS׸たF 3j@^zsdBK8*fppԟВ,RH#X|!LdR*03y,c D3*;YZGl+cAZW4vpFR!3Y>$ݏ,AUPʅJAV\nS1F|ybSƵw go]vNB7ֆ!9c;'#tÜZ7R)K0F[au/M{nmɌ|i]w) e?w_jEޜm0e/6Y1Mȝ֫lS#9|n͸Z5h؇vjqs$JH N\ NCi5ֱ"jpfWHk\E$֒- LD  r!Fa9uOlèY]л:Jq6bY?9nw`ZpPtCiw6TV;_8vΔ!$)Üw?bܫJ_m4w DUhϾ mYև ^Y:yb# |:}v:cZp+N\6(ƒ ċҁ@Ꮮ c_.~h6_7ݎ0.X Rm㐐[iV}}}ccciiiFFFll"""N[RRR]]5>;;;333r&'''..^}顃ҶXLLLJz/-->}v_zւ=jCUWYY/]tƍ۷ouvvC;:Lh>ireffӬ\)JМ\K$[4'OAɖ-. 妉QS}s-*b{ea9sfݖ".]ޤӄH mGNݦNEfk...Ҳnmm9˹SOK|4S8OV:h W淔e~OC v\'QO6 ie~Ozc0@"0 m9ћi\J3 1yAY2j`arf Si9 &YdVLNR ӓ~:~' A&r^i"/A͡U$_+Y#!vpB5 q&Q5JC d^ՎPIp6uP[ĺtc,MxP6,h65)},+WU5Rcl/^F y8V|GYn@qC%ۯU¤,״>DnDc ,m,Y%Fm Ka~ ܌g`i .D[yٍ~Yh*. H)0g1ng ""`c:(j:Bl$TWR-hnS#Psʺ$V>UKJ%Ehs6QhNJX"L5wkށ-q!ċ+!s(h'+TzErqBm%-V)nc'ӷC'j_5L kj?z-§N-k.%4D0w>`PRtc%Q)5i \_>]B-wa.oɭU#-pN Utit .j_a/`q#`-btO##o:W?⃕t 9π`6Ѳ!RߢE6eY544H\QQQjjjTT.h+223і?I9*X[[K:~|||xxWՖ^%8Jtt4C 4[ 6. \*h˦[Ov-!6mmmbl{RlVRRM3I^(AWwl ג"\Hٳg/\? QVEEEaa!fܣ#ZILhz"hkeeE EK&S$c#OM @EgF "bOSAB;mE= _%Ph+%P/ӈ$IvWwڮWݡcaR= .CyS'Tyׅqi[<)O#eC.EF[7_πQUB06 F҉]|#(%>~"rRn4306; W6츹4DY1mN~d< 3x딣Я hk3>6J$[mϸpu$vgnģID+9m_Oւ~W[ǐ$DXp\4G\nk,YlQX X\ UpN*YK0מ*3s*f@[> H8oZNNg2̀yvODI1ȉ)6\5tboÄp{kcAGG΃oT*Wj6D38RSzGɟmvtt秤uUjjن˳?8viAovvvVUUeee;;:[b#OSR%--KȠ'$$P/ߢ--DWWh999r\\=nQ7 H:qM677/_|ƍf҂M6I}yz.$ Я4zfݙ͵h*l+m ݒDϸ(V6ݒ ̤-(s?hAmϩZ6ڲ(y״ڍjAU^w&_=P(L/-HH%N֑nM#9Q3'A[rx:Jv9KvE[{[%HK:s] cuR5|hkXs-\:v옓n! 7m>R***HP[[ jA}$Meeeb3V^^500@WݿϜ94::Jע~F8Jll,?66&J$z[9% .RnnnfffRRRTTThh转hZY[$hKl;::hlrrn9i.t:bӭ7o1Ԏ jE]J4"uiP(fFGC^9E]H\n ǣu]vӄ\K Oϵ-!Q$'tKܷ濮Ni{zzS;"&](44KtБEw^J3C:@}h6@ @ YYTh U/(OLxqaW4zl*OLqwKh |[' x'ov^ 8,Ï8fGFrCalî nA39P[qp ee*+Pk? .?BCvKFGYZՂ6˄&J>|ѡ`҈R̪L2(RMax [EI_?gG*ǀH$1Nc{?ӱY{T|/2qA\b'Gq%\h %b(FoV8feɶ=G8_ס|8\ch ek&o\Rs0?T+㷔ې(cVn+xą9<&"@ U"bx[z[mW+3Ϣd)S ɷ˔1m,k%QK>,OYhmU#["1K6mXbQ#/Q3j(ad13[x nRqJNנ=%i S5*h#,I(yBKwmlg)Ixd4XiGyE$c^֢z ]=!Nw}J;Kp.\Ӵ|.QEY7AU9aE{wQ㖭<:m$HӾ 먯:'|U9n 4rt|/ibivE2ِG __P8 梢mQIII)***x`k6*nԩS%$BPʲUS\.WKKK[[///omm]pܹs===yRSS^ۦ[6*օIwI[^^^EEiwbP-]f&==]R1zJivnA'W+W HLyR#qqqK/hڤ4tIHEVrrhK >.NᖬuI6݊އk}Ms8Yl~Jʷ:$HNY~/#=]斲.}~z |+ZfS 9MMVMfNcCNymX9ۂұ\ąD66 _gcwyumqmFb4 #-Ff=̗=>7ZyG)2ĐW̋p:à e|G+w; |R1Ҁ20q nzS8n6o'AWʽ=H]gYS⺝ɿ:S 5v_>zA!@XV-i٨Jpl~}TR֛qe\?#qn*" F,U霌ꁶ:h ɝVSJ~9%ba͵lt/E壩xٳgm%Bd6:kF[hDZAK٤Ը%FXt7P{.,(4RX%Zv:Ln'*ƍt9u;@ /tyl5E[oMݳ`Em{[]y!n9<1,^S 䬁D^HeFE d+GAM܊@{ /?[//Ue.@3QcFΚc$[DּKUrSf1W~ A(r5eS&V.6sj>\+239#u Ȓ4l.Lt+ ބ;oOu| X c7D9JG ;6"jjqZGX_NM055D\RǰiMk^dc:gqjS4v:'b;ߏhMPHlܺfr*@[i V b9SsYgW F0ڭdHCW e)^kxDg]fNnH=ܫ[*<aj}0^yն  sP-c v*Or}(Ϸ>ڈF[DQF[PPb9j@9ZL*tXF wtqk V;n-8cneh'z}VIZ)V^meZ}j巩׬՟jЉ΢JpIsxtDàLݺ5Nڙ"5fyTܒԠ¨'tfH PCq ^j,5j8vtHbsTwhElqJ4P{:"4XᡄWh\?C&e|!w@uZ{MbȽXFGPj).Tɗ6cC\u:bڙp-$[ҍ70]WHoQw kmF>% %11166V߳Vhh$LW]]`Q͝?… kkkN^ZZEץZ)啕t56JYYYSSSgg.//9sٳCH=:::==9r"???--inѣGA[lMM uLщWLL M%EN%4]F JIZZH E+,,Ozm-(F[O-O) n]~}kkfOєm%t?k}zm9%[(E˗/Dё"߲S(hEz ڢ7Zt-! G$[іOʵkl) x`(@[(r/E} Ж'O<,#f4I*μ̷*6ɰErq75_O1wJY->e w2O?*?i6ψKy9MkkUH] m%*# 6J!/\+Cظ?{sa*rdd(r#_0fgrHlbKx$@ba+i P~4'E-eG0("Sx|NvqEzV+2+B #[]M=m#~3 >&_68uBcGzk{β2p%p$EdQkqC *FWP6o~gu$FQt9Xʸ ͓Xavh'ii!t3:ZMu+;ls~ȧpfe7331:{` s$6q2]nՃe{S$[~u03)_*? *_y+!\|^QƳHخ|]!OymyrPfb~}mehkJuE[_o Ɲj-TӽJɻkVjԬ8G91mρnEkH5Өr@d-A;巺uF΀cj V5u\{IMhZ>Z^ ڢy~bP2gTD47`9Xy}mįhN/Buzmݫ²2pnݺ%e kkk-v9EJtfj^[[KBΝNLL RQl'+Τӄ&zQYYIQtP';&ymKm݋n:u:%}KMM-'ڢKPmpIrbECN .wܢByWnmlltNh'vtt8ЖdHtFm&_t͛7^J뻹)Tn0:Fفb3jYZZZhȺd.~EZT.rU%z%P[/A c|n=m~|qTЖQ j8$תv f0%0٬&9;WXd2M-O+90fD_ ʬ`Uwm6gue=GV̧9aXߗ˹)v Re0U,ȷs:<^0؂(A_+~V|nc1c jc˪KXZ=qifjZxGYaW eIx' bBytSP!; eZb HG n"`&f J(I?&'8o--nMC{xV1-g8nd0#xXGFޭsJNu%/>؅Lym-#J^ a00zP;x3ZJge5i6QG[Vؤ hˈR zэGp'>mG[5G[_-3nEyZ;Mjvۃ],_2~h_퐺*`حs%H~n0%]c+*><2pďcl4|l mIW+(V: d^vVA7{n&hKrL9X Уlx 7XmuJc9`DvF:눮e; L$.&xO ܍͸D;!ku`D/A􀮂jFti.EĘ̏,@ă8r101qD#/MCu u ˛5tz kBQlBX79?dsF'1?[9h! CLGk/ƌ7q. faG&QTi-".wFh`-J377!f09E z u  1PlMx,;:=_sl@afKŬZs,yYY/C5,OEϴb͡AC||,*hh|/0kY(hG9'->:I!A[!xzh믻G'G٪˵ mnHm=ԋјdkl94[HտG z}x+wEJƤ;1~(v*չzv泓 ᩜЩEiCl}WP/Z;ژk]-`%AԯE`A繟wC04he6Xh*L€`&PI #M?Vjןш:cC,J= ݓѳK@XA=S%MJխ(*03R56X=f1un5Lm ַv= W|4ۧHh#=σjkk+++"///###99Y?Y9z}5[WhhhTTUQQAGՍ zZVVL %*@\\B$dIgggO:uܹ˗/_zu``<;;;!!AB~Kk[[[8ьQ!!!6c#O?kѵ-nѯPIɒ%E3J1͵RFGG`ppMFäKQ٣ڏӭ=gIN#EOsN/jC*7|7ܹߺuڵk.]r"^N F^XX(I3rkQµN>--'עrQZtoܸ!t+ @ @So/E׹ngpuWj b;VmWqufV~\mSċ Q^!`qS5E[$&h+PmŜ,+o:>rDRyBnh a^H H'@hqK c"8h"474/In .jj߳}=kP}ABb'ZvrApth݄(Jz7kBI/x \"|' %n,k@25~/S%oOIӉ i\y_9XKQ2%Ca_A.St O\B2;4sQYdRpD\:1KPcWާ!l-IDLκK=ټQs\S7O-I-ue?J[tU||rwbb.'*tf<ٽM900 B0yb[‹"ݮY75jJnM#---ķddnRSScCx!uڧioKZmB߭BsxVhJ3@Beʊ-)aaN niBesQzcc=&%\K ,ڢAZ]])A[)b/yyy[Oߩ#n1-]i(x$+qϢÝ;jpywq=fT72vԍ,ͦe{ \M`LΟdJ?o@AT!!@rͳ| 4(ܢݫt6¢ Jp졠 6ÝɆQSJ)ja \b`GY@Ž^Miĥ"4.֛uM <=)@[TfnH:`iX=R.{L! ~1zqG<'%pƠb+|fx<|397\?p]is N pH9 Em5T@ĕ48Ւ1b }>x8g!'7d9j-oLqC5i-:B3f͌P7Ob+If_)k[oƵk.]D򟷄[2,ȥ'N>}Z@-*v--EDnHXOBHH1)+&1޸P̚7wWϰq,ψqQ9V1f9*Bz4W'q/ $:liW5 Ԑ@j=)0ud=`N"c㷙W e }t F/C.!b&ۀ1OK6}׹?b83SGo&|x_ eY7ƃmA:I9je졇qe7EK)}xb!,|i˧$puWΟׇѣ֯>z1e/8@rf+[b(jP%6S2mkݲi ֛/!DXGHx8?ʵvkˠ.:TxD_MzN${%dXǁpNڤPLCL[h%V DmKlvrW{zZLNc2jm4N,Uz'1pi̼0=II)V &+ݲeI]Jg,_"[X$73cwޯ^A;ˇ_qV<7m߿&''VX1neH%-- #-Eccc񙙙K.ы:А"YfttCQ߬@HQPP`G[eee(l_@mi1 k ykiivzgG[ iD _6kQ-=U"*m ֚5jڡ9bOi-֎'-HOSJK:9Y-; A55nWl+4]⪪[2.^@늞@~:qtv{qm rՌTі`Xuģ}ub-p7p'nGp0$[neBܥ\;d/넷S5(̒8gX'y #(#m¯}Q%` ĔEĔR5 jBD+_5x9RrBDʋl+dy8_W>N?N'mkkkmm>j[h>4F~ll\ m*Z.Qߨ?v%Yh4fsCCf@ܽ,ivDݠ=XI7oyZg ͼJ&L3@kFUDO-!7w/]dq-*BDK5;;fZ4Q4]&otp-j͛W\ah벭л[ӻ333-LDDz'FJ|$ 9A[9;*pN uXf(e.Į\$2̼ׅw]v)i,'9? 3<%&`_{dr!</G å?8AfMJҌ H`?@#5-{-w,%p#8_>yl Aa5\87H=lLG3[F֧ :Eժ6҄G_!*S8[1"*fTV<>A/&Ѵ |NgBQrxRIbD )% $[0g`\ @Ǘ ݑϣ'qӦimf()\K\塇]QZ\"5P{'eխQuMq2誺͇5ˤb%*tVʲʔRM~'VK}ɓ'ED1sxxN,v͛7oܸAO:uakd+4(+W4-LDJmEVD?XyW>onWԯ ;l⪌Ym ]:=}^Y}ٺu*B;BQ թx3%{2+Ԉ 7@ihWd$c(Y$2+SCDkQ650j?/07| L> 2jUF(kҴE\VpVGY8%hU{;ױ[QшC'ֻD!!wdD ʚ4{]_zLWfߓ|;d-mnGqNhr:5Q n`JT'{GtbWH:<6d F]X, 9w$-m8J-_>/xp;ڢm֯g~--KH&G ?iVYpB[BgpPV1&3C4ٍGyB5\fBL#DۇkcTg*`= dA7럛ۿ WI^RԾ Uϗѥ3lN]IX@,@'kEd aqJIr>tC,آ͚`R5 -C[ߓlh$b:} ƑF .2Bh#E#<Z+J9xV~S5I@M}kw7mǯBo}ltXz7Gh81Sr8%%%gHV||8-yC׷www9Αɥ.!3mmm랙IԨYjnDݰ[oZavE3PSSc>yΧiadgg +K*D/i5Q۹uAv%ltt&JR.Zh>-Ԉ'!$$!#uHm{Ʃa.44DMޥEeGEK&Kڢi@@@3 h4LZ>O[\/\ ^;wneeɓkkkE&G4{ԟg Z__֍7ij.E[ i삹d5HڊHm܇<%j+" 8‹la0Vc7oeP7O9η0o- ,lV$iD{1-6c 7! 0A9RBKiǯChK @S].1%+C~*p$aaAG.Ň~G;VO˱M&1E׋@kPxNf5 ;&=MLU%R"7{WmQZ2W]z Ә1yuvcrTRjr [CkBaa4.T`8V!gП>g/b7]Ҕ1Ê:mvSU}>\(X"|m þl?LE{_#O*h+Μ7Ǐ;&/Lf?}0@`A1611KVUt\h+UNMۓiЅT͂! uQ! $cG!3"CL9Vh t]swWqڷo"x7IM@Q? ֧Cl= X2o#Hz۲mb/ qI#ү2iPn[Cjބ61FeѠ-sNH&CVM%AI-|r~3dK؝DUkK明U!aq-FtQ'x_F nBu_/~o>U0,Yz7h__PP1rVzzzYYYRRݐ菖0eO:R]]]__,Vs(ϋg{Ų,AgwkQQ!_ 4j-B=/--8qɓأ333>j$ .ājNp&A-@eݭwa(mdZhȯP-Zg;ڒ[Z^^4hP4^zt]o;wٳSxƍ{3y0p2aiUsÜxoGldD=8-_ ;/yUT:_p̟̂1o {+yu/7{|^3ߧ50SA(CumTKѸVM#~-kЁ5p5k; k !o_mQpkHS$z ;m#*6`f+e ڢ֯] |y#\(2Kftʹ}Ɣk/O?]#?}(0V() mU[d$T9**2*!p`r !TUh%M;J<[ijxnQm5hQ|d]gؑHJ7m"~|Eqmc\4~B-QZ 88H'_|ϩSN>!+kѴR;R4b5OK2$kW\.:2uuss[P#"[HڊH{΋̃+k"{qSP&?Eʧywg=ƓY/VOtxgxdz%b+WCnЂ5f1Cb/&?(g<<¦LA:c|Ι&sqM0DlF?\|gۏݗP7 X>I~WM ȥf!_æX񤛲YK;y|}ϳ:.2690J4dWlX7;+2!5tipAe6W]3ZE+rD;̱'G`>jKp͚F^:~ 101Ȓa)=P|9[ FpZ4~d|p-7!l6}x'wif!Yl2<^Q|usÒMdSz+,zCV}my^6Z:jΚϛ3?x$/FաcV=_]?_~7 L(TuPoG[i˴5Y}\A&U$C굵+r6kKBPW4+ Z߅ud 5꼊<>>Q:n,զ{t<ՓW,s\3$- .[4$t]ʁr0iidfh\v5 3[Z2vZlC[%j8֌k{m(<,YHMV̚êK Dd瀰5y:bߩv Β {/m/ah mQ(III "PBTUUUuuuv%Q,// )))j->>nA7*''p %E~[DjM&c>Բ u,^©OI0][[z(8?~|nnnffZӨtMiCCM$[t,z"t;:- exΈGR14ҵҾƲ%і 稭qz(lpxx K@}G)O f=??E_Y9b[Ԕ8ދZ,,,&Z2p~1IOigYϟߴEj_]]D(w{Dǵ? 5R"#Y6-4o;UÉ١;5t$+4b[Jt[E!rG\3dܽƝiܩƓiɨegxvrySMuYY+7bCZ7-wUP-y9;g(C8=|mL1+CHCهx :l||d9(/pMg4`k3w^0&<&$+{aOno;`XS4{1cٌe85nk{xNO> ]oRǎWji0N:x)5b&T?t㦃8ď^+ &'>f`Ɲp'qN 5Jp޽{}пz\I2g|8fΙ[ ?ü?}oSݑL\-JXE *^9 5^BL #\E` a R3LX*W4EÚHCkTiԁ!6pɄ^˺מ:sЍ̢ 8.ɶ65skull5oYvhzchK -f@U@LEnl-QY- mMayHzlhUjVJmFAƼwOQDJv-U=Ĭjy#J;%%- 5X_Uľp%7G;K_z7󿆡-w mI> .Y)I(Xv;jNܜlkkSRR,{d KLLnbg JMM >'\KP& j}e ۨCCC4!]"7"'hOnMOO.,,OMMQ---43%%%ta drye=M M,Zk%7$㯂DfsЪ#Cb'Jcc(ʨ4 iRٽښ5-6:~yu h'KIlgYgΜ9"C]lEJDVmEJW?jSCG*-qu'׳\QWaK8VEUa]Ɋ?qxgTUef$^a%D;Voo/_2w:3h&p;(7D2Bk.3{ v 03husPTc YeBlC&0ė;y 65W::9d5a|7Ί2mƜ qlo׌ P76o2m2yx Ll7Qo IfwA*xxG)SbVQq/7s%,|T qV=Q}"! +=e\|u͸WW CiĕOo!TPkW(/Nh5blVe:͑#f`t\zIcٙX1em'UIEKM%hPSx,YZɮQ#8| p(.sA]j ɹUlDbY*Z{-D,9,刲ܑ j_/Ԡ./˖P#v*9H9_ǔ qt{u-bK4[eʉvKDhifuKճad+WUϮ]%[CS[S[(j#X%tmfc8-jQM(ԑ 'V49]x'eǾp4,yz1jomO1?oG[+v%,p%V9嶲nIaZN#y wOIIINNNLL#Ӓ'edd zmZtC >.9oTooo__ t"V4چ0-Hhr$kazAMZcǰCѬ,ѤQBnn܂  ڢ;e+t뼼<*ܜHhJ8uFO:Lݶڣwzd'N3P)a2o4ɴٳgm~eereI C[bV.Q4:f)H'FJ|$NrJf@9Cq;/xfr)6Y`ab"@||V ,e3"63~g+5_b?ʝW?L0I7Ѩ [j0ZX6ȵYV%(Gq#&0-:(#<",0∿-őnNBC\Ͱ_@E'L0 }UJ^sD \2*qC.Or9v ;m6W9w]kasr 5LւPqT O'IphƓ9UΥqYLW |no3˺ 6C@nWL+?a'ؙA=`W:qmQYF$mXo9rdeePjYgu:MW #.]+r)*.IOOɡQ+WVWWE3 7zKlH(DD677ݢ)yҋB/۩:&MB>MNfffvvlXWVVDy("ڢB[,Ɉ^t ~Z$RYk4tChP2zt3g.]$h~Uݢv%Zl̋-HڊH +{-w՟ <Kƿ}U`/s8?m& 0H F Aہ2aGIbnSvLͬ{; io$?q'l>-L0"q(z% ( TJ"f̉5{,Ļ!;z c*,:,,V`Uì>q!C` 1vj61+`)V 'KyRL0HS|:9Vȫ)&=S\ :v%_5̛ȺD]F_}m}Qսs9js̉G/JiUR;Y67+{ìe:G ~ڪqV6<͏`qD(٪VƧNmj]eb?@RNQ,cZҭ6LAe4SHeeٌ7G/,eu>1kxW-0Rس%["aAB\NR,nܥ?.<.U3 TԌ9/ŃT70N w@[άM-cVG7|T|k!z.j=yXc;hRgi8j}kBf0 2߄zb/7*}OL~uyI$~o_;{ƟpZz#Ж=]D_5KinnniiqU؊L:::$mbGRR++eG[QD%EBz ׊3SRR233sss 鄲qx(oO Ktttkk+ ENOO{. %zZvr a6,ĥүu(D[ZZ*ԑXNjCG[VGC}[Mhvj1uQ65$5Eq >PW\r_.h[SS#Bhٳkkk gmeffF`V4ed)A[)Vyڎxwm [zw-.+1ښqÌ|KƂ17b] +ڲLm P4ԧ4 % IJ,N\xDcUu&=v]JmBv&5Ä&mN3cp~B/ cAUL]bE9O#_!V*\ڪPYf"GMZNw|lN,I{5֊fg4֬a[|&oOޮwqnYb)_v'0GJ׊%e;jmmkzzzdddH@xmI~FyA ]+͞^ (..sn' a\KvYݣ4. EV4btt=hF{Ed-ZN»~Q[[[TTDih -Eυz[SS#0*BhKfffhBhfUUU4]N'E$[h4>ipӧO/,,X@$_]̍@p\Qm-..Ҩj呛m///SH.KDǵ? 5R"#YvOmqFO- rrD?rLu,m vqe [cAKd3.8zp,x.BNF@Cs ,N A6=ElSO7}Q>sNeBvZl& l?ItSٮFJLnEMۥCH 'U {9!vRTqt rFZ{:3)c xQCU!֦Atɷ5;J@cGԇGl2Hj&%:98s1.=zVC,yo`+IV HK&# 7 C[hShg m`hkR_ZoIZ.YѴv _C\?$ Z5j5/K(G@,~䣅jòk{+t+wiC&jnITRթ!VĢ6+*i+/A';ЬmGѭZ5/C-O+V-$s-ʿo)H_{!ӺUuRI4"Wz8zբTh9Aז=q_Ag/oE[}k0ZU:H 36GTD7ao%\Y),1_hf@?V DvHզz- kEZlyľc.0n%f1z/EtK~MLL8_εmUi3.[---mmmDәyaaVa h+ZhE3999##pROuuuWGGIM1QQ tGȽkbk3"hW %ѯn7.Qrss<=v ܎$/˵-qГ)))ӧ]dМchNeC=Y8e8W޼yB[ VHZ$Ɖ'4ЈLbJٿDJDVmEJcﵥqP=<]h

nqtho 'uyf<%kkfKs;q-fK"63!6'f/V QI/xs& f>ƖSGЏ#\&]xaX&8o0:Aٮ*؊ZZv4F,6xpuU"y-s 񑠄Sa#)Id7}BZfezV=G4VPz [qlT?)ךU:y ɂCȎ a/тPJ?$Lia'.UJ\ڏ^ YtCR9<@:QǰtN4fF,p1ѬIQqHJAHE[vI7締~z'uD[zKri筶w~|⥟^<0E6/2 P:Ԩ#uG UZXcxUZWv%u(4W8-'LbY 6"kB{4iKu̝laZb6~VMZ~*eQtP4 <>x`J͆fU a-PH #y=j-(K4X2,TLjTaCLVt>'C񡖻OyP \5X_+s@utHGxFvWщI%KQG)툶Jճ.h&-nYi_aZQZ$s5veqfmmm)))111ڲn?)r+***// bv3::j! Gؑ$+uC<_K!А;v*bTّЯhY%&&:y"jIp3Zahѭhknn!49 t# W/%.ӳæy}}] =L+"jǧ4@S"hk~~ &ݎΟ?)IHc9c+1jZ\E/)$HdyG)dH%@(seø*mƓb<9`mhҽn=HpF;߾%ZޥYDaK}ƕgKVr㙯TtNLD[]-m~v^KX8̇q- K,+++---)))***,,,((+AXBjY\\bo!IxmmmSSSGG%DYD(,b\\Ç=94:Whn :%f[W9''G%=D,Z(伻[SSSi' o4na-kf,*뎿pGOp-z"ע/..9s… W^qxccE&M 6:M/-:GMGkQ8DЯtk1ޗs=R"%"h+R"%DwwqǡƢ8P)Ӝҝr=1cGLhkz[xװ &:*WU-ᄪ{5"ϒoz`}!?Hʠ*l7PbK&hI}z4YNulw\W!Rٶ,VXhDdhe@&в%^jBJtJ,Ո[dԈF6{ ,OM<ѧ56۝vvYοbmKBj-X\YDRÑiMpP#A5ݥh+7~P5l?zh+`G[aÊ{Э2R-NDM999YYYQ]e'ZwKmɅV>0/QobZ%PKR c]P222{Ocyy$(!8I(e"(GgЅ4u%y955%:@...313 jљoG[29n9S')[\n!Pz|ɳg^xڵk+Wh&_Rtym"XAz44{4j:M :tȾHbbbҍJUU]H @ QBbe(E?#GJDVmEJl/#<JZۊd;)5trA+Cm\S+ѸTJkqsuY1RTу r~k=j*hrgeƠ>$@MGqr]F}:9j\t5kK/*JDmF;zx9jgA1GY-B~iݓaclVӞ]5&3rphCqreFr+\ݷ+*pҐ×Dj/d~?O>Nh+CF[/ZUWnoڏ^][ gm26I5X;SvmC7SSD+i"ln[E;گu@1!uJU\UhF?K$& \*mHK eG1vv\6%#j*ԔGA`D6wbx^ՔCYbtY۷)rkffq6uѼG,XX9yF-}ݑ\VbCa/V 1L8+U@ mm% Q֋үm?ݒEg7E4+rpGUXX(,eI"'6Y2[VeeecccwwXOOO$ G'[Pϋ˩LMMDVRijj%---e[٠y1 Ngdd}ꖖ^/n-,,O:HLY+ꞘYKtk ۲䎿p{ttŵQWVVϝ;wҥW_}͛.\[KUUf}}=+yX"Ѡrrrn'yMZhȒfI\"'D'ٹYOHq۟)F[=7{Ayz!4*7 2 >e<cm,ASb5RիI RvSTdH/Yoev cޱKk[a_Z0Ю؉Vk\ UYMaKQ2:s~;jSRg_ ]* ҠE1['؊&fSU[jDA[IЖ%ڿSNKD 8Sѭ\-֡CDŔ"K0aU[[t:܂mp~ 䱫$`MM8Qг.ζ6:B20//Oj"&Qt柦%--&Э*1xCWDeֺQ0 2`t+L:+k-,//>}zss˯ڵk666[yp JHc#ѨIL&6MbbbhUЄSnziZh1jO:BF?2pL GsB+Vuvv6=%R"%"h+R"nh's-q/r-F1o=I'yPF0& 'p7L 5ve$ɳ^G]6aшMJ,)*7y$׽\{TlpMÝqڈ:kZtێ{X.b<>4q5.^ek4>Tʍ TсzD-s66Jq2en>W0'qQ&V{RU8Ƶ`%]Z1:i膈CNaͪbܨ6g1jC-2 ͸MwLWi2/'!+pMh駟_mۉm hka+S>awA[y2*͢_mUmM壿<* h}Ҳ°-~5Hsu;*h~&n\"(N,g$hCX1zQ,ER&a}ImQk2BjPr s$^{{%%g|||rr [!'KxwttUHT&M͉EqM(uVA-Ĥ#IK%[v[atneBDn8p`vv"ZNZ__?}hΝ[^^34p3E]9!3'u湡QoDiz}s_WVV.W^]]]ٝ.x]]ȶ%R"%"h+R"h瞋E[!3?:B[MS "Wyիx{vcO}#Q7kq\jR}B v4ualT$%F48QA=T\r[0D_ 6nB$ yPjR4v$ ։-vȖG=讐{|MRPфeԬF$['׺ژD˸{xfE֤5rI2!/t%7b->2YX~Qs'yPO˓ LKH[ٲ(&~ӈ°~,W1_ckLeMehz<_]*§0]x<7cbhSnF}ҦkOaѓ::_bVvmJc">悳5CS[ټjѠDd= m-KeQG{8)3XQg7P_ំ5,#6VMU;W"X---ÝtТ[V$E &~v%L85%)ZWWG]kLnd +ZIhPccc"P?ցAc((###8tfy3$Ab}m; A`sIpl==-O֓EK\d%*.ەIT4Qږe`>/A> 4CS_nijTVV2ᬑZfX,ݢJzwj`I\ @b5U\J,S'k08}P.3, xj'bV(*X7Q `qX-bI7v(rSm@yhYwnڥ_(jm[v$)קvڙS3X>Ss?[Yv{T^AvC[Fq)oW YQ=hH@i$`F[=~h 5Gǣo$n}뀱iVrMA˹k?V!ufJ|e@Xhl{'  yߺ])e)qd|E{/}[п#qio+2!44'Nhkk>]tU8K=$㐱@ű:2N;4662zxF[a]# {=)1}'YOO= ItuuXWmm- ZZZ; H !%%E4zhv3 4:}$f?-vjt+0&LVWWϞ={K.]zuvr._<>>ήe~EF9ͥ4yHo0]͛~G}駟޾}ܹssssT {KQm493e}$,-i#4.11y_~r;T\zǗ$12ϣ+7k0%( n6g(1$ph04=50(= ڕ'PG6@ӊں[y”'Uy*EdxѳBtȳs00o9gFywxUnR=j{HK4Wm"j{Ty& 4M4D]v9j("zJ! ?~ J=4 ܦ^yꡨm00`U_P+|PcjY4YQ4jC]fTbL]-ȡz!dpSi523 ޥ<4L,q՝ ГMRY.zӐ( {#[)9qcH1?{ \R\5Yj|g?Uk 5A͛IE?ɋ[i9+(7 d$^w V$ '%Ɩ~hE3~Rt}%G*3`xA(#S B)wpaQAZR0cm,Y|x25 l@J%S7"kq8q z@Vil ^"k1&[ܔXFT*ogHK3CMKVECk-n`q2 " kgYlEr4 +' 0.I6TнL-{uosk 2;q iii gΜej::t(g rؾ^s!d]]]Ԣ[~I59, tRIBFFFxq5zڢyhllFΞ=K%''s>zE c?[ZZh%H0P#i'&&hQ[~\t+:n%%ŋϟ?9X6ĮF1+s^E~[4:5JäwiVڵk7o>O>?+++zQ?,ψ.TX[f,eeG[5_рe]g}v?xV+K5C7~$S{`8|5\N*XP'%m|gRDr޺Ie(e^#yNpJGReXBqLr %FxK Ī}.y>oj x$ħ4#- 3Gm%*]ހqCU):Q"+oNNR:"8dbD\1Ol'ɱ,_P~$h*F7i8kmVJAI~;֟_8^0JNNO^[[I~{tFE?EFfggjOzJJJcc8EWVVҝ.88:Úb\Q, h4arj=++fQt磣-2?Ech4Wi\__IKKh3D[_8E>q-ƕ, p '1/2laarѨi2ݺ t:ΫWtw-ZdsssnQ0;;.Rnr[˗.]i2/- >$ [oXfٷͽ'Xf7m`<|Y?2-eed<~hKN,fK5kތ.Ij O7TK(_KGr~),!q^ x ![#`&sYpZ N5 a1X&Q"S)R$1@+B!ډHS@aJSa8 (̑@un8dhu*ƠeLHUY) w2ƙ"C%aD&(Ҝ_>㺆8sXE3%IcD.Ǵ#JCSAB%2ńL`921Bp׃J< DhY^~ElV"';ž1X׾Yh_1+{=1ݢ򊋋gffVVV&''xm㩆j-ʭeffht:Z[[kjj222S묥UC-:::mш:u>,,QP1sR~H\]]999qqq4:v?!|Yp.[q~O?E D?hR7vvv---9swi9eb [5==@2עgiRm7n`ǭO??~:]yKn<> =C637 mYf,ee?m0_|WbhWQl%w} C\­3FDVr(}Ly;ZmV*P{BP*q~OrF[NSi36IWvxaĩQFTQ6bC(d*Oj(+o>J1b8Jq(nV\ʵ,xjUB ZLxFyg<#.r!ij0 A3Myi\(oFWe RPyQ5i\0"Q?O+:Sg$%SbTPCabF%nj$0v'幌FئG畻(4L[yWlF7&[jr~ǐ2ވk1x+'4UZ8c ~*UW?rMc1Vo'N+VvՋ-qZ+Vͯ%e>JO?~h1j?ҼQ[ O7TPB&b,Ѝ7!ZufF'k5KZgR.ƒ*R-\Zhp%3M ͘`/YLbP/W2T`CMI(eLoa] . AJYjSVF̉]<*Z1'E$ZD*#LQH 5,ԘHgx7@߇_>a'Pqm:לhqܨUaX0d4V$0J1 J#/e*qO \8 ȳG#~}"mǯbhF"uldt `<)IOѫPRah+((gOJ31b2:)));;;77ɓgΜYZZikk{Q~f|l}S'fffR=ZRj訯/--eA-nj̈)Y+3_ mQ}іݢ,l\nkURR:66FÜ\^^|2]LIIa--Oäi ĸn>}zjj:`gMug^^y_sC4 _[YYY\\cݭE4nKK uؠ ]d,/ǵX*ԃbtvy͵k׮^ʊ[|g}GMr-ZzZTfKےq, yI(Y F[GڷR_g?ο)9lP;^?eoi2ljq0d{n#YZܻS#’|plBq0p Jq d9G->0Y2 Gq6SXO%td%)~?%\9Fi zN|pgŹI\ơC6q*aSS4y8=[a96H*ZFTqC"`7<^5b}b6,YO}',gL:$%8eŠbMd/™zQVedq ůЉ9r k"w}v 弙Tcn+;RjwZۭ3bov^VaS+)heA`-VyQu ~毊z]np3zF^TAmT͐Mdev7 60֨_Z INN8| +~8?DElT^'J2Soo+&-` 09|}S$<@^ȗ H +D]RYǬf٫64: a#l\x-ljQ9gZD DnJ|Yj /V[0rb1,|K'Lh亦$ٳ.IHW ;my"c9Ē].6%um]7ሐ,{M2~:Y&ĀVUmٜC*cEoџ+ iiit_YY9sp__9̵Vkg├\\\7P g@XQQVhhhDDDԾZf]P[/ڢҝԇ--xp88#k1cE^ZZx"EM0J)))|ݢ\c?kQLU,nkEVq]gϮqX,lnn~rZ;YffFn6ΘݳN8 [fEkA]~KO?#z[1MKttS@;'''grrB[Yf- mYf٣-B[_m#ڲЖO?mxhR5o-nI9`,X \?u& YDZ1yDy|wb/&F=ƌD\gu`Gd2jdžL>yLDK;hg$䤇4Ψ`؊'WCqDiuYuׄn2L3ψeAa|_&N4bb(z*JQ>&X>|ܮe?V u,ۮ⃹r?\Żp FPDKvH丬U$>,b\Aq1hku+ йA~Y1ncnghʱL,?Q̩j婝vR歧~Oԛ"~2UuP ?O` ֿ}PA }KkΞ=;77!q=Ǐg) mRSS 򺻻95RUUճ{҃ nF[]}ֈ鬬eRZTP7t…&z+>>^lpoTΐhh+p1ݢ~PfM3[NN4##[p=qiE[&L=c5K4Ӄ /^d-[~Z zzhS܄kxi;ݼyƍׯ_>~!;nQvEvvv{{;UH1ڢ{3eYhB[Ypg/ mYhB[kgًm?ؼyNnb'/bjlFY.C|:}^'nT*09S1z* ӋgYnkyqpj2n`>%v,OpM<ܷ_ Z #b0h;V+sSvj.RjZG.;+qr8'ߚ/׻jwP$sǐzR$ʉ͂Ǵa2Tu<ɴ'"X.Ĺ8O]@Das% !e%IN,FG}8/{&,{4iq4ԅ1^q%Es> j5<(qa 87HJ71Dsѽ sq ;M7 cķU5%&J3*:($6rb7| Bhy6g+T1.a*1 (fE" kOr3닫]TejtZSvV"!v*Nh12>mmymCj{Fmh;^5֋KF7o݉M׊\%Nl%Zy&1ؽ5.H8/ƅMx4-Wp *̉hR<sԅX_G5&as֋ע;rQhA[|Zy~cٌ9B;%'N`\g iP-/OOOOLLp&D2g$džj,P*+:"_VGAXFG]20֭[ӑA`~~?ڲ2 mYh2m?<|Y{w .S1~qܿzٮ]Gq7////_,9*0,QO.V2Dx@.}:Ê#e-` 3ۤu< %0A=kQ3urC0C̒\&{1yҽ:3D(qPl| ]p`V`':#w`O5\bw(M5@j}R meFH KS˒S8ToL@v8 Džh}0>a,{_r/҂8:wb~㵤=JgTCT#jZ{U]y mdF&b:G vi%ډթ!vliii)))IIItBBB\\rQ,--e'"+-m:::ǣ`XSDY:~8KӳqQ+Νc'Bm̄T,--ݾ}ڵk+M`eeeww{8zHfCZagĚi4ʹ4٬t-q'hWC[4*-SKK u`۩,?A}`#""?γʮeNsttt|||bbbC!!!t?giYYY4pZjbdd{``jggffw]HtvvR'E[4ES9‚cI+kˌ̘5s\kyyٳ nnܸqK.q!a4iRt~Ly_5{QT'<{Q?IM Kw]Fl6x4|.R8JZs?6,B[ڲ̲I/=kڲ25 /E[Kmd?42ټ\t'v*zp_quPvK[Ase.  2rjǭ[ >$^'q8t"TVih4$ R&qjAqJ/F %V7mduĔ0LLHgjП,e",f Kelj0Tv.2b/1ڊ ܛg"b4P7*1"K2bwovk]jBV cwqRITl@2Yfɇ-Uvfu9 6$?ίuIgdlW:JCS=ujXexL.6n^[Ga&$ 8Vz\TTT\\ںYYYB1Ngx3JMMloog555UUUlnn4ˢգ-='Nu#\m  ᑑSN1z Hl#DF# ^`UEDFFҳ]g/b(~\ҭųg.//QN'HYYs-Z&6H̠h,333kkk/^z۷oݺuuz}3bo1jF[ BotYO~llh,׮]igj0ˑtM*+t?-2?ذ2 mYh2~&syꫯZh2ȁnj^_qF96Ӌ>?9`P)`h1=,*L`*/S\ZȔJI'jyπnÉ<,ÐZ4W(R͂tq--{K8k0,"^niOPH4 Y-trLNbzm⼔+hUHvdw#. E/ 1ڊŕ|7 \0dźd%ӍɴqNP%4VSBŀT.^Ę|A%AzD.heRd ;^tQNFyn6¿,{澳kŧnjyi u&R-SԥԵ?tСCa0 cp5֑#Gt:ϟ?_ ++z_>YYY~"W휝P'VVV־DǏ?z-(O8A}pnDTEEux_-hsq1?ggBimIII̵:::N5/Ǿ_n:.,,P[MMM4,_O'W{yvbk׮ݾ}>q& .6<5hARaZO^-zAMJ1~tx2{Q+EA>Zl|2cg_3PM ,?$,IOo\([Jyf~k@d8mUmv ʈvݫjgQI_N78N .JaW /mMx$Lr|$^sdMO$XvADI[yXy{D >A\0\Up#s27#+PO1LwYUDYPrQSԍ0u?U{$fG3VDiY XIgKHƺQqLh7VK*A8J"뇳KqB]|$xsGf8N+2V cm+B2]&+9G$C%Ad#*.AT؋ɴH_T@<m V/*FBn[Qĸڠ6_nj ^ Qj7Lvgؔ;U\}uO{C.ȋ/mh٧oFd?:slݱ>w q~-~Q+ ` &92Ym`srڅ2a>-XQ׀Ѿl7D7 @1E"ju3)v6(l0NP)z$ meUSבWY>tob?܂阽2)kԟir[mT--*ph/3߇,-hOqElX7Sdɜ 1Izlӧ(v+nKE4:aN3G*0>p9ں mݨT6dL`gZy/qXBPm}Y/Nԅ7ԕmEDDDFFFW׶\.V) Z@iŒP On455TTTA6-E eGZl dF2R~l-2?z8'NAMNNϧ/jjU:LiifLz̵=bZlq=\Rj6-zAg.[L:8"t:樞O>u^ ϟ?hkll抺AM3"dN7Ih -Z)Z&.Z299r* Z}ghK.mll,eY,B[ڲ̲o XhB[_#/^֛K#NcN#|&?{u{ˈ䬅Prx礥it+WyI6Z)l+Z߅-8zҺd2Dep- $-C0rSr5}$H@ƾ`wVdt'ʶyHԁghD[aaa111Ѱظ͖G[ǎOIIIOOˣ/ʚZGKė_hŎ[&@\^Јht4HM詇C-3ڢPee+?~8WN?_ h,ExdZzȑ#}T8/\\\LE[ᆆh}o~wEzAimmEaYbjJ[Ns\,~ Daz\M5m\u4]{olQ[~miiZ4g~駟}>wF[dt3fY,[otI(YM5< m}YgЖ,+mm>~`xmݩ}vsCX~$(ැDpf zxm2h+OncWOcZŝ-h4< ̵z%#^^"J$DTb&\ɬ~k{ 1s&j= |r)WAI0j[kJ: ͗H@Y*$cՆ k}Dܯo.4&1%ML'Cd(@fU| mQ)>!pW{_Ymmmmhhഌ.[\m;vLwT lѳ ˕7773 ZfZE3/b%{!tK-jEAajh.J'C-jSS&mQ󛛛7n8&.\`Q/zWgfGV`ւhJS][[[\\̚4UUU---O6-vٚtEH~jw][.fB[Yf- mYf-''B[_mmyfkp) mYhB[ꫯE[_h%gc3N#dpma?'5l`OSvi,QҲZu&r;P-&ք[ćk$u~ZԓPIyÄØc=t 烒 vY:EA+_5LD\RM%M{ebk3 O[&-y[-@s٘Zxi@}sl:4pdZ3_tvA[IP5Z"oӠ[SXp aMX9p[@"ÏO(g`{W ƃ* ``^UP /h09:rљI>p76NmH]^_˂RRR322233Q=-jŢY0ZwŔV}}}yy9!hѣT? F[M yxjpPʴVrr2 *mi}u4RzQRRRQQA7E]ԓ֞z4עJiڥjt]+j?ҭs]rڵk$qccs <-NOh l_8xօ:77&zEC`]{ML͛7.'^$-B[ڲ̲dɡ{ꩧhޞ}Yk*,> ^D[O݌zm4tl)}^s|n!q &[p;sI4),: -&/ra/| Aq1 ѽ+J$n.H$l$4)kȶ0bpj*)Uj%Ja[[2jЫ5&lUHx[;,V@ 3SnOZn6`-1XDF[1r6l> xmM$"R{UB4͋V/:P1&b)#+8ްV EbLI6NV)Q7rx7|O⁻AwBl8쯎=5:|fKNNNMMMyyyCbrrrXQQQqqqsE'c! K~2br‚TNstttllАbUWWWVVFI4GR4.NH?GA[tᨯg*++5- F:XG5KQVSSCC͝aIMOKzJJJhԁ㢆n5O?kkki9h\)fs8KXѝE]vfgg'&&h5\kaaCE[d:1%%v- -M/&6&5MNOO6s5]'5M=Oj<{,|dže}{e}SjW>?IWʵVkc ͔RPա>4XPW1.\X5̘S+3(R5&*Fj(IG6 '=, )^傶z2Zjܮ`5^uBacj3ƕFA&J8gH`-R&>#=FVeR dv[4'Ƞ;lo}8-$$$<<㓒X 0x趌Ҫ*p88TOO R:t LU1'\þ^[OޗnQsuuu 䃸-*:uB7@ay/ $kk_0,ٗ=j`TsEEKӯC7755ѳTM{OECSXGi愘s`mqdd#M);VѬһ4jM AhG\.Vht٢ǙkLZCb~Z,%rssiiiٳ&[[[cnt'- uL=^YiXf,ee7B[_8k,> o^nj^Z7<؈-nU/I5aPgZI]/4I<U"_,:L{l ]y[ť9p7/O"N$MU-3VWW@1-%%PhϒvwY‹eCBB8 # Hd-&du-QEu0R^ iҨ?T}a 24crxаW b|1nM˵N̙3󋋋 Z49,fFh46ڿNdI+F<mQCkr4R?EnaeObeTKHHW> u͕`>b\0V;JQ\(`*ʝj+Z6([Fq(OBq(Or/tV6~M#'Vy* %.)w]yw^?Oٕwb;:mVnPQGN*ogbmRUjOy;vPj'\D狼bc۵koI6dUhܳCh¸1YvP 幌!lvZbn1E6V{~v>5QEyC7SyӍbZVRCӘa1Jcڍۯ<5S'XGwPs3 j{)Ri46m2:(Tg7܋~1W8:6"K$>>EKƑFR#pY`4U%1Tǻ1uWEN"DT7HHXAQ0%H G&r]7ZPÙWeە9a꬐R.E\ WDZ_8IbR* B4SGys@_W['$bMh/\9~?Zsp #FuEk2j5v X,0Lq{hf@M]'*mҥSxm"'y My ߳Xd|TunhН#o8/Y*$$$"""&&f`~qѯt[bb"-֌tkIGVՖE/***++~2]]]CCC###N#Rtgnn.!Y N:Euu_[Ij,eI)mii}5bG,fJRT3hfփb511133s FS̤$]ꭎ [:ks˵&'' jѝ i~hhmi@ljjGFQs4n>t7-P||<]]DA7S4Z]]ʩdXߌޥn-n,Ж,F)}e5\jV#U\㴾oֽQ}\y7_y S^O~vA0vT۹jv1vNcu?%?6IѩB\&D!ȝ"ӂ8r@1SEjN@ jQ:/"ោ :Mq F 8!N3zк]'pt&1_ %e zDoqZ/ )~UsnQ%JP)z%3Єs. (lN2JCreCW 9#"pq}49n4dfaJ`Z%[6ϻcї0R*s$IbKGϏbGdhMVd~dȨZ|`IBd>Jh`C%Ch+w $~Q I+pasxbk5 ڪG\TTG[g$5͖]U88Ni1G.y&4Q$'cAwl9_w_f-3b,NĢs;CCCrd:Pqa1BCM'''gddp2Oc%vb LSһiiit's3z3ҌLZmmtaC-jer\!ꪙn-,,싶14nnUJfւ:|EV<dg-vu`̲'~ޓP,j܋j[O*orP mPK3Gj=Yj7IƫD3vݿԽ_P>M"\l8o0. ddpq0?0"5>mǡ,_‚8b8#L< C:Cu"\O(Nqg\IgL>Ǡe"zsS"cU8:-AC 8_K G~ G {%H;pa|t) }= CY0À9Pt\au\"45t0-C^gyZ&gՄZ읔~]OydWz4+D<1u!H)$&r—9RrI#_d DT M4}4aHYDc{s2 I>ZGP ;IYɿޤ"PDl4 Z>uJ\(kұhKd󘞁:^}$ J$Cㄏ ܟB,X̓m"SLoԎp /(p\puu~[.\<-qZW] 0{%@|'7IGXbN%]cv#4gP5 w{kҕk i .r簿>2:v؃j- +NH0QHF#B-6בG_###Y+---//#q)))IIItCDD"|РNzDoi-*"nѸh LmmVBBMb!2Mz{{t*D|Gee%U,EuQhfշ̀8њh~f\1J˩{,H؜/"^\\ja4EEE 0i9smmL;j'5;;Koѯt%&&VYE#F=8>>Βqn.gڨ~B[Yf- mYf#e] m=~U?}D%hk8]]A[@[N2v}hPv.m}amR;+ݢMvJvڡ횯vҠVdtMUCj7ǸgIy_yv3vڡvByv2>'2Ժ7XyBgM(fȂy ֠\A-*ILhۋ~1VK5J~y/^ǭB$J/UCQk3~.-X^ ]?C.5QĹΗ]$t+[7KGĺ UO%DÎ]FTVh7!j%+2GRmňG |@(|C@ȨZp$vvâCm XX#0ғZ-ZAܝ%9d)LY5u=NbB$9]:PDބ͂ZOٸwsVvu)@ t'^<찿5HZtO>+ѣJC;Y%&&&DZ`0ŋ]z788Xv=]$I}3oVff&ni38&T[[[cc#GGEKq+&&Xk`>p8tXbee%-2آvh:I;b2MpQϙVfJA[nižX:РYV{A-F[8'4b|r5*leeeiiɬ$5!ͳV늅Ѷ2g9 ֨?АB+t*w!?nh]mfVnC3ߞQr1Όt(ςr=V[ƈ(r.RC[Icqg`](NS[xҊR;[v*UG)Q[EFqWb}mxP-rA? Fq”+(Mfu[rOw￿mG[r'}^t''U%tv)k0;t0 'E#~>f"UzN!"4)Ǘ̵h|Иqy8Cw "Qn-i}V&)mGgTl1EbBbˇ%M>214dI cl1 i$,7_ O?z*4֋xZ7Utupe8d\~)iܹi_$Of˚vAZE,q=Dtav_ u&(hli oq6Z<Im99qhm}?_Lņ?q]4LӡA36z$&&&999''~Ņ=2=Mf1=Eرc|vzEwWbb"5[T?WEי=44䇶8s_}}}UUYtzH}cǭRίq`c[[Kt%g:c#Qo/ig=nE8T cd Zl0kzfI .\QX>U5h8ڡ瞰?ӌmeeE s\. mYf,eeb!+iy2,j>cF[? slJ~yő/^2C^dH 35p'Ж4 Nh8Ad'=N?&K3ҪPgp$t\5e+@4guFu OKKc9*zm٢?nӟOLLd͞Qje[,tVzz:]Ѡ,n䰲9&ja(ΦPWB/)){9-~үEv;ix=="FpBs\fPh/8]ǩ4@_C-1P&xi hi&ijjjXٳ"閖J򌶨׮]ۨCU8@Fzk4ɼ9"UBs+˽}XEx$XfXfbuI(YMB[_8'\y#j|gggJ8j]4\rbQF{Bm53;D ':(W뇕5墷 %^m%(W|ESq+:.͸y(7ЮF@ljJIqQ-ɀ?X-g *VzbDȾ" o7*=W$%Sm6QjW\ 2էּhW1HY=~upH)qA5Gh+"No!ѯ{3r^ȼj1cuJ.^3 BtU`uYS.^5&PeyJBnyl\Yw+=Y*W-}}﫸UIQ%QKJʭtOz^0ۃ' 603a6 vN;ЁqL<Ľz RJeUvu:..^xw@WG}=6lhk0U,k%/|_uո]hRtUվuڷHۡUR ީcc÷"vX6V뱅 nV &_2k~(\Z X|[FGa5$/ vnH7a%+m66խ564;93vI='b_~O4t ?HOOOHH `!HǏ?u%K!t+99$`[[[}}}UUUQQQiBsssqF\KFH'ЙFES;epJKKϞ={(%,, ʢhv}TDL%­aNcPh=' qqr)k-,,,.._tI薠-ZN񠿖\pAOS"jвP4H@-{4=I-{fiԬd4? e5w@3̚tjjV%'wKmV˗7|32wJ)8"ھ}pUNB`CO9]ID䠃AEmAmQ =l/kUzoUiW~TaV-OVĪWi[9>W @ӵ-*0Cʢڪo@ ;r) ^xWYpU t*UT*.$T+߼SȷOqHBn-SN(I~$fk K\#BZ6+rO(ϊÆlan]]6E;;uVy|v27#_a4q`(59 y'g:-j,iKB܄JUgԣ暵繠f<$WR~~~翅[DBЖ8x6,:!0mXb%me yXBi|˵=%J̠zSZfqAW_mdgNJbE{#OȧDf27i? c0<<|م~+E),,r%TJR"|vv V'9trLLN%EZڢQhԣ4:z nQAgdd%~]]]]SSs(Jzb>nK( 2ڭ/uܢ2;;+\kiiieee{{~%0.0mIAQ@mnnPG.\xAX(&7"d',8G ˀbZtZ ]km9!Թ=$10u<K:FZM3| $jOޟ\#`, nȭЖUYhë0'T$$j |ϕvG;i3ߝ>=cn_fv,hK4 'lK4{!wS.QO-Qjb?5/gkq-)oluqV4e&HlM磜ԫd~,[_|"ⳮ*tv3j6_p8 h_RR"v2Xb/|$111??tOLLHWZZZ||)r:Hc(**NLL̓-i!h+%E]Vi .;Ek=00@'%@JBbVmύHLUv"z2Z\\\YYY]]{+J˖taCu\tŋ͍ eى+)tpJ/4dT[|Kh1MõӝS!ʀ%GA)jNsûp g޳P%\_ϐ&j_F۵{t)ߤ(_ R@#nE \GUE{u:˕v*X&$H籑y rVxFحcsVj[u7GxKN}%u6] ;:Elf|QǼczHT$(oB#MVHyuEk] cEx=sljVS[.CB'qk:ta]mqIo><2vV~ 1$kxrq|GaQ{o`))įo" fw:m;:J.~N@SVb$Gia Zp< /Wzx'p-1צ_!K׌^vL-u|ڔӁ/f󰂥^B]TAuN<<yK!P=ֶ/HnTNpQ{wEtxZu$!gjS4GWU[5 hR-^ tąv%fNg &h :,JMH iەAOkV`5[`鰖?> ^_wᇈOQؤFjb8P[7b Gy3xpTP 0Ge1pa[B˻gV83{thm;::jjjP =!!A֗",H^^.D'EQ_Bj:^^^^VVd֗{m/&Ѯ3 uI;ݲ ɾgJv#h˘RS 5)..pV `W۱*ȷn]pamm\kHBEemooollHk#ߚFh40<]xw}{!]H%͆kI^PDZ31&T ݚ~ Kp 0 p '#GVm]l=/Doݕv,7t2dQ h-9Gx-a7FN^ݕ4C =lױ}m`sGxT"| /GXMsZyFd9[:qM+vv~j8  g\Cu#H>_}%[ 4 )66MF~GX Ĝ {(B)ʫyMܻ5,|)5+d̤v`/ľT+BztHB(s/~>YK}:DC.h5===22BJFFFRRӄ",񹹹}}}555P$UuuueOϵhK KEEA[|755E[!t E)Ch􂎈͎֤ {b!H2Q0ʡ-[ϟ7Z!0\"߲GG07tzƆ%V Я-p3#sss5 Ν;߿O fWWWNN \ zg/9"pKQfA.ill6%,޽{ K˳PpY. //鯂fEh0UK mY@[A =mYeZVn Q~ee`ieЖV\֛z- h y0~e6ր yD.!ڴ/(YJb.'* *)@'d0M3mT9Uxgun_:w N뿄zڔN⿭ǔ7Ji;ʛoL.* c`wj/BG[kF[m;>mpG;¸@!L@jsNq뚰uj/i~r n'RM$LМqWhngg}%-^^˚ [`31fiOp5A] mh ʷoU`=ؚՐ,Ӛ$hN#gq tDsyk Zݶ iSK캾3x+r\VfڷFfњd\?JFФvmצ^glBLf3^ƻYWFw@z /g#>k-vL8#fc_/[hk{}}}~~>%IBh=}(tKEuuuII EsZZZ\;Ԋw N;ڢK$Iba!?%0gzz,䍖"yЭ4 E_mommQn;CX5;5G#InٽCbҒp-:?1IaD\!<@r  Eu$RYKRʇPBwmݻwݻ!$dZUzި;ڢBwDЖw3IWo޼ްKVmK}Xx.!_҆r3:\W?.c1BL꾧G e7(}S\S^i[OG# Zx`.kqFzZ˱&eNgX8PyWH=фn=l~kgL^d7-`:5Zk6o10N\bNUHUTS7kHj:>ĵ2tDfHfgdT 0ta^׵APAL^ގIj$\+Uz`@IkD߇kG/BCYYL\&A\j4ka\G;NaWXܶa60eh xc!T?ǚœvvȳ4İ?̙Nq}N8RUUE{hwvv&/|UEQ" {VVVvv6O_eLIWEEEUtZAAAyyyMMiemK"Fa+ԯzMc]Y^^ a7Ni`BH l\XXX[[r\ɓ111 ZVYYt:S]$ZNB[_nx үv-"v"ߺrիW777gff@PWWG<0ֶiTnݺq=<}65АLKJ}^z{{%ݡ!r4`-㖠-s鱡 Jp gxY.m鷿:F|1xU RypuG&q ^[]< *5QGP( -#ʓLS[T \h*8eW޷X9û|4V*0Π(odBE*;wQiS/xϽxՃi+E;lÇCOPB졈)snnN"|Kη?:^uKVmK<Ͷȑ#uxwr+7*\i"V(inTs\QԳB;<}o2cm!`rBGd ρd+6-@ sq @?GK(r_KC9 \a5 ܵ@)o.+ܘR&0ae2V3U<=A!K=Rl!O܏m տSYigO#Rhn[n1â6l(rj M wፒ6Minĩh‘k Q.ǥ:LSs8q \}4m#?= Z.U “3n!CN٪uJB [&IeCu ^\^Tus'~}@&kE][7J!E\mb z <-oMa~\j#o)I3qm[q$SV:|k@g]@͚h![ܫa) ve DR{Bs'\?rN޲y)c{ƈ*2v=Σ/}SVttt.g?u~TUU`J\M D=K zݢatww NNNNOO=õ&&&Dc춞]*"[^^E&`HE[Ҙ:::]uimm|j}}]HA%S0\իއ(b,Oɹx"))%գ5-GNF %\ýgK|/,Ӫ&9atqpYyx6 h]3' L-UI;6H(+ड़R̹tvpzP[ê@GE0%; gaW훓Kpm8Da,IY6WD+m"Ck8>yjq,.?ߥM0Ul/ zp퀶B/nܩwVks?nJv<-pcL4N@p$~}.EУy4m)tIlb'@ҞG g7Ǻjws , 58 \N8Zx]&&fzwhKRxl"Lj޿R{f & |)-_?4c71|YG[qqqONx 1%tHV2txxX<|nnθK %C&-!9Ԗu__ pthegg?k :}tOOM$ennnAAAqqqyy9t:k577Ҋ"ųΣ~&֡Z$Йr=xҥKƯ.0*FfF+/ŔI4j\EvʕeZT{=|?4w}ݻ;;;Ԧ@Kb#fuD\V}}=-y*.Pw.\8|x.F[a.4h^uFW..IoYP=!\9GozEs4qTXLs%,[&A=pNYl~Xeە Eдv{+Ʊ:l\ G~"ZzixۥV7mUTTT@[S"z+Tx1Ĉ=ʷ촵uvv'~jooz+'[UUuI5(مzOijjr84)L~5UmQ IlcFFyõhF$/h (IEMtc$tB#[^^#˗/߻wĢ2}'Jjj墅yZZZ|i&=fffVWW/^777]rK߿G}m@)JQ{QS@@DNnymF#gF6+ԨW".Eж)fa 8-_C \ͦZLՈ#x!G I˨qNvFK^E? j>gԲaQSX>*]+Ρl /}kS4jEⷱ2:ZA[-ZK{%-yepD'-oe0>ez[Y7u\ mY9+ܑ *V ?tJh+11q?ۯmU}hHl*,Z16DkEg0\v;#qU@15R1i˥uAO㱬#t p1D:8-${`Cj?): QB ]/ҚXgjVf-yInT:3cbSsH} `.xS;x>T5ɖ`^k.5h"Ml$*' ܔZ?gn&ekL'/E+WPڪε5k֮G"6qϘ'^ֻ=F '9M͑|qڈJ4z{6t:%ΞQ3KK&>>^2vjZR 6}h44DOŢ26UZZRPP8*:Nk><mVEdh_襩Z,I<3CZUZĩZ뱤_~F4n@v ֬=j5֩#WіЭn·G[YYYԚ\ Bx###mt320@p=l,eX%1)m幮<|SǾt&,+ʳkȜأ[Zl EMsDtBP oCE4:ǝ 5SJ"{9"JQRGuq,^o'(_į=\\i W}\|. Vzn=䑏wmЖgA"<<36(NVf쒚) Cq|t.v2JPrjrb}@\*:rΖ gk|[r[S ʵ]|Z2P4LWԫx-n`kqʼnS?4ءEۑϝ~8auRrss333 .bbb$&.b괻["fgg򜜜KwŔq.,,t8mmmvC#JhOjF/--|| A["`AC-|322h:YjSΡ\+mO17-B :4&1n@/=94q)%-<͂2 /'a4`F+++ԅh~E5K.s(ڢv5.4 =ot֖=蕦@<.U p 0 pym)^eN)RCO>㲷mDT]T_ڞ80|@T(Rr&]0qZ8'Zy(Q +_ehhjT\z&{9> ^phKXfHm6Aغ H vjc(lP:T[Ycts6IA6#_*֔Kmv/V"Fxf ]*ʿX5HND #,@AoaGuB}4ls-~NYN)+Pt^؍&j+>p~*_;pY "Ŋ5V0A>V5N;h/ZyU/حDy72qC\0i6$a9HT3&!s~X\e]NSL`>'D OlCl"u&ZqEh'Fvb=itCk*tfO;ٜDies|1hՓ[IbBmn"u5MAUMReTIb{Z;wjD=K | 2S3\1N҉]h@ZZJi:m(Nm%iVL֪CJ7K`hlej۽r0/Iٮ %,MkHՅXNj)nŠ)΃3T kӺuYf5];(dR9U`+oCLEF[iɨo:z(i~yzcVjjjrrqߒ-:jkk^ZZZ]]59JYI(ZLh uLL ~kQ Y\\\^^^YYΟ?v7nrPp8jll4DΡoڲBZ ZaW-91 JXnъEGG tL%Y##l4NpI`'e8MR u-Uh6vV m4P-:a>* (3])v&٧Ѥ[xNr,Z$fp+max.7q[C3n/IĀ43r2Q&,;0&܈N-Għm B[TbbbC[O233%jEGG gB299y;:UPPP\\\VVFlБTi.B Q/7u@k(.իVJJh.r84BE@]Ӕsrr:mErJ$DuuueZip˄%(rhk~~~aaA$[k$ :HebbžuQZ^]]}nݺu嵵5Z1PMP kEn'E8G㤦?Ç߿s##֡­m/vzI ڢ͋.лtLc[\\۷?C p 0 ph0xUDdU>b ߈H:_r9s )Yyצ'`kSj&MWr,S){?y?|cG/ /\ \r]Գ\ʪDWku 22\Ũr* D+E.rePǂք{rTz#yWeCi1[v%c#6YӱvhC`ea{>`(!Z:LZ EsW|h>9¨ YY-13W\E:lKkpfVMx#v/ɋX >mÁŬf/1e[hOcƷc0UK8q6 jlpj*ٝ,=\Ri-.-Ғh vRCl~w2A[cCةTJ/I[V.%eX&0`,o!sj7ECuB'zè4V븶j vpP۴DQzOf<:dWM| %3HQ"&| @m,o_S{å <Ⴖrq-HF 1_gl4؆$6Ab$+=4N=dCgKga>,x&pÌ荧XكO CeGѭ,@nݸ`L?n9ѭ/|^i^ncwAhѣiiiyyyG[cccSQ(22"33ussK}egg8tKЖCu-jkk[ZZđ*Xooo_BvveЖ]rss6"66VʚD.5==uecc~FGGGDDHS8htV!h˞qR222ht&]@Hklٝi$ʏ&d%G:}!S>I VH]%tKn^rEa}aIt*-$CCG_EEрY wܹ~ݺ~:F͢$y C閱u MD|i"&DvECn޼ޞK<޳P%\hkOί1 fH,`K"ybuKo*;#*8/pMYqDžY7U}l#Ь_+f8`UqUTꯧ2ݣm~?tfCZ lFڠƆ( B;!.n#ئUОz~2`J D,e&PsPE%!T9ݢp?R{B,aDmAl\{DcυB.tXXffeDf:3;:Ol}G_V== ,KĬel h1Z#RuD8S㠿r iH+Kם*;gE?ǭYbycݬtImZ,q5dMtD4e%RPV#](rJs dc:#Vƙ)xpi5Xe2k?Ж& m1lm}J;c;Y?)ˆī:,NJAsS&^`T<%@ ("P%0r Gtj܈Eyj߭BS6J2 lLӑwPNZ@ 3>tFyl= m%b'|[%|;Ļ8L x"&6zō ưFq/Wb RkTͅdi&e~&9dIV&}4 \ Zh< 2&?o\.q"6&ZM)̚645q¯-))pׇ j@iDE#7nܐ<>{{ׯ.IP(th[%i]FڒBJ͛tM,A[t9]"C P%\h+%\*ڿ-*phNSxo] Y'$fUcX {(';#O@sVc_L!$ũ&e-e]S H`GyA_ٵ5;2.Jޜ-*-Z-r+5]UJ$b'(Zp**z) ̢ m@De} ;G&QxkK3[TYǕ|->3&9U͹yALv!vUm2~yM,8{! 'YӉ3;v-6&!x#x~8leFOQc?yDez]#Q޳v,5Y |S9٢7My_HU ~ Tڍ(?̾L}Gys7%q;~/97o[|Uig.3GNXB-Q JVP~xyd8&;_=¯ ڪ~z%$J4J J,J|||x1Oj \NmRKZZ(-꺶ddٳϟ4|3("33S>A%}  ΤɆ\NSE;T__olLdDwҵ4A YG(-3DnD:YeimkI)bO󪩩&fImIkH+900055z坝۷o>裏}z- oܸ!2!!tKPy]$k% K1ڢ[yׯD'&\͛t OPޤKf2gv0ZgeaU\&ؚ,h+PQ, 0m:Zg[+<4p%R62}; nTuQ?Ar ˧AO\Wx Nٟ)c`?|; U3S׵z:3'zҔe&NNGyڔ;IROyorMzݩ !"ni)XVIr}_?zJc D$!/3VRP׬ruƽ36ln`~Y15o3hl 1FDsh%ijPвIh3Jyg[vG-D%шSٯV~{12z.VjuB\kwU@K36iր{j"[pF $w@/Y٥k!+huA[x?m~%XITXQD%Kt\fE1KO/bT%%% qC411!R>)@-*ڪX!Z455eee}ڒU5ijFlehHOC[futKpy&h+EÖ XKhGh7]~*Ij-'w ]#9^ TM%3h+`g ҅jƞtKHTW6e;q$@tBEV|B*t^4e rd7Ď= ]IMJ 7V@3@ $)*`!6!8CJsdesٳG?0‚"e=0N ~d-HkU`)o_ɧjmy.|o)W㉤֋nK#/_/~q60T䵜(h`sР ȏo:AlhȣR j5(u`֑rWI`Mm ƪ߆IjJXֈVRmIXjA|7V `Kײa^&y#["EufUD_y,LqzVZk)h+FȷU|~ap[Xdn2x(PbւuqƬxAeYGk\V!ұՐi9&sbߤ_\yVmmmoo FwmGfѭK.I|-kߍ,})MQ{{{ss髫3"E.(­A<)ttww;Nꥠ@m'uA} gffhpeپm=nЬ+++%QpVVV-fNNuO7669,QknnHzQO*VG]+S94O>HH#E(aIEaШmHH01Wktthh4fZt$OHڊHhOb%rs7qro\yXEowYy{AJ;?,[}-|/A5, @3T!~@>sس tÎɆ,8j0SlN\8< zme+NR98$g U: nj_bǷݢ ]WTDZxP@ 2PC&XMt7acU?.6n< °iwx< .,3/a_ +KB,UCS=7uH99m(ֻ V0Yy 2I#qk;^"6-/#S5)f1Yvl5@'v lpcl|&zaXjV&}!Tm*HO:&h/Q'!,hm)/bޗ/~W0J 4f(hUN@pI:dOE)K311'o­Rp!&ZSSpI]BQ8 2PT-Jњa6>|eSbjSd(E}p쫨/Yv߳OwZ>򳂶ʞEOe.OC[Duk%[ںud"̸J:A)Y__O+++E1eXDp%`^h v{```hhhlllrrrdd>hF];Nuuu+Ec(..fF[zCr\G}׉p8$:1OZ$ uJѼ222 #ti %1䧃@gRwtĈm˭FJ<Å|-cyMʩʕT XpcoIf$6dņW9J76bN~GU:ʻz7+PI#+7YWeg@Q{IkCO9"@̇k0{fNJ)_5^! q UUuTP,su0cr!|axU]0PRH-s#iur8!_n693?<ȳRM0HTb:lsh}~R.; |ϞUTTtqm\ *--tnq-i^vd@*d"zbeä撾DE秦ҵFEscc$Ҩ e~{{{%IJ...a>cccbH%J~hFA> mh͢&nWf >Q5??O_vի4<4..fDFE32%-2IS[ZZZ^^uq=z~ z#*Jө0lʌB%Ē zC עȵZZi4$q"2(^ҵ^FԎ*ѝihy8 2IHڊH-X;|i*o򯱋Q`Zò@5cR 7HEN$( 9ڋTTJU7/xnZCKIT xP0pRBF+ǤC:R@îIFCp{&̥Cpt6ߪ}*zvTy s\TdJ$,xU &Vq`4>'YñxVмj"2c* n]BltÿXĠchBdd ^,V+K yF2( hժ8.Ee.pqlL׻B#?TAS)$K8_S>d;|KV5hX3T%Yf|sH(, $ r0Z\h$d UYmO~S9tuNDf!4c溅$~pPǢr_҉4ڪ /hB'7fZ'r'Uk.ggr&PT^FL-S/K)E͹c_e-1gm%&&>K KBoꩧ*CtD[FN;XRRRRshK@㓒rbϧGW{VVLA |s2MfG__Ԕءy ]}VEEEAA"s۷o C=X$"300@ɡNKQh_Le=v]vkӍyњBR_$ۦe#/ãF]hHteddsNQ;bEx"HjD3\??O9390tLl̡I|Zا‹iTcYτ̦Xvb;CiMVTv!!U{> Q VPF0Cz1N xT}($KB5t+0ٸ/ [r,D+-HPV.=F[@U*0Iݯ1dceis yxR,mV (ԇ=o7qpksXޖ eXV P󤪰zYz糊C&6񖶛1`߂jF8Kׇ [߉Z+T%Q@[iqg9\YlV\q 㩻Uϕ6rVNL=C~7I 򔻆 KƟ6*o *{o75|S'Ӂ/!#vدݨʦԅdY&Fy+"s.ȉu_f.͵̸VnYj r]e *PBBv [ Q'IECUl09F2lڠeRGJ2ޯZVH9A^CU 4XasT)GNxё;psc=oC 'WKdvکl tLaf"~@7wԎMI,(]uZWYp2$)x.}No[v'^wZ_~YA[a%IhSWeebIHH0薐%3:hα@'5}|||Jp> iliiiBm6[EEEIII~~>),, #Eahtxg577wuu HʊOܨ@BDtdF[4bBLLL4-Vx`G) @c E[ڨk1`4ꂂ MJTOtO e$RKKK׮]Wjoߦ?$rH1iYٞo Г#6ebw&-ZpZ -uJ9ĵ$VFH+C!;BE[[[[(P(ʕ+>UUU2RiiĂeI٪DJDVmEJ|B-v_/VD V+iC_\ W3*pшTROU/ Cwǭz[8_!W4L낂bK aUz8" -Ў2pqv(  XepV8koNÞ!BaG90m5ܑchU9Wp Q85=UǑMś98縰.>t9<>>)A !1/W.=XGsaN8#C3Q;5`;uc%oXW,p@[㲖Y l*eF[b5e,شO[)o@Oeó7*U幯(N2raypu<_#(m.{sq~ L:8?ZTc:wDfM4LA|ѥDcЛFEi#!AAcTC:鞄mW ƵQ̽ga*`C,τWsGQI:yt$\k]rYktSf-z@[F}͵,GjlٵY6(-8vY kt^SI1 BM u TN< ]Z8c?MiPktf&&y!{[Fd%kvbc_-'^qZ6373hbddt666үMvv`nAI&(̵q+AQp]E'%)))"Uo5L7c -?5_C(HWg91 bԫis0܉e &3QlooL?;4 *:VO5a+[H:-ߢOuu:ƂWpS ӃP2vsHVA{dFbJ¹0 ;@[@[Q='8cjwڳlX(ryR8 j _˚@%cd/B&[UCD*zhųk1ACz)yFU++5 9́rw+7rw!*-S6bamYfXcO4YD| 0>ˊj`.Ɯe$NewC! {juqVaʆ(qhKb9u0(ڪVS!\:#7tJaAa}5Y/e,(@6uypw׏}ZZv_Oi}i>gmEEEiuI4-:rwwwחп[RQӿ?:B] 1қS||>=qGm666vC@UPPH-MPKuu5]t:9aL2-l,,,!E3-jyy\TT!!Ԧѣo߾M7ݻ4jMMAW^^64TCE ...FZsD80hf?00@'IݻG"PKVPh"tع;YEkB+#9]npN!ZN/t_iUiׯ_҅$^%Tn޼Ikbѐjjj)ޞZE*)IП \MӮTb:/r_gc-nRlޜ-Rdaq`Nb5Ԫ-z*/hk(Zc۫\ryvr_QxxR98*Uפ|uM)0"8he+o+OAV5F[*=P:i~ڽE|תsD) immMͅ&% ijdD!u!\`!1W3 t(+H\;҂/b>~ 0pG(Zbԗg'FNIYs5%+v=+)xpl6\b;&F' R&um=z͛"2PwqjIh$[4$At LwppPzт̈liiI2?RO u$Z&(wޥ޻w;;;&"-꽳fv߿OH(LlU"%RI|ñl) ǭy {Fg=*L9` gTl28 OM9&[l-?WF;&UywtWnse5,xeRbh Vu{mñ^9Vjk OVb k`XE&v X)F[ȴ), h11Qh+quxڿڢ ߐG[eg] .wngOKÚ"&6m-:2(]` p mr%Ba7ikJj ,Š[`F8GQ?wMjqz{@+hmVZbdCh d3'kJ%UwmvtZ\жQ*HiaL[FdV6.izc$8ur5p{qOWtd}h֡DrsrWBiPo~z='P7t᧘b×pfiVnkbD>_p-mY3+#akǾz5Wⳮh$OLLLNNos *!}srrnrʕIyŨ(\\KdeXě[bVZZZ__=66=;;k$NDE-#)))oގFl4%ãa}ji)kdKR9mmmb/ԅ|Lm.,,Z^^\HC VUUь.ѭ駟0pZZZhv;͝B`pߢ3h ۷7nHb9%1ЭŋސNQW^|VFEDdZb. R;;;4Y֭[nN=^ЖXo]߿#]Hg%J9MaooݻtэuS"%R"h+"%RgJ=ghB6puەrtr.9p?9L㫙D+@<װnS?i`T¶ ,aVR=;Yq&~$ tPkFLi[*°ZlY;U`kPVqeO;N5Є̕P}ߞ3M!,nSbN*q\=D2x!S,!Nd-A̷#Y/ydQ{/Ч8ˁĨ&!r`V4ċ*tgT<17 v>?9v3b(AHc<ʷ6ڡfȺj9z1p^D XOh+ R*p!_@[L'FtJb* tY8$śѮqNY'K^v2U6@6.)ߩB?"F9 i'yI(\kjNZM[$ 89Re 3J̔3>49ML!Z6"PpX)I6@.BITe؄DG7ΈN y FL .[tjIkc<Х%[bg` B8"E#'W0e)z0&zi*RЖM$ޅ2yPh2Jm}lkjj4:.X](zTāJ|nQק (yOZTw]|ZF'֍7zzzDT^^^RRB'Йfj$hKGMMM'bdeeedd<1&Q{"*4GK_\\lȴh.2 # wԮ\A=77KÖDjS"h4VEjCakO[(Ѧ4j:G$R-jmtttrrrdd /} !%I,ݜH(PK,ŹKЖ-8ݻwO'FңKU2~z]BG"٢3iQZd)A[)= A[nqzN lqt<-Ri 8/lAs|k6"UHfr_I洑ePD_kdXu <텷ص~_=;1ѥgdPe|!y$bWyQ}FlQ"Ҷo@lsCm5 lXG:9S1Ϯ%4s g2rÖahyiZkۮâ(sahf^#-:K `u Zoڍ?^,MGc{Ǿz'ꋷ-o'^wZ_~YA[GV^^^WWWbb" ]"[,z!W6Y#="QiJÐH32YPP`{zzǗښh؇JJJ$xObjkk ' _&e Z̫ap?3zb']Hsy5zAS.--UiYhtERnz[zIIIrDVXX(h.F%#-r,dS$OO IzH*#2QU[[[4NzVVVftօkť3B޽c!Qixm\>"|'|"dLi0=2$[VGF6))UYjD3\( kkHNЖϥ|# (U'+ &D a½ NmL{X38AA|P+c<3Ϥ,$1LvAvp %h"d51W  ,s *(CMH-~_n.rNS16cY{"쨝,b O 2+RχDVu[GBP=sB`?9hLhI-pEWxwtl2 !a4f^s8p0,M.S6w!d+Bcڱե%M3bv> +70K&>xW.hp^[xJbm[!K q$m;;^wo$8BX,oVZ)Ey+9=ɡʿh[c&qN-rRE9 z=zҕ{} 55M[uҽMV1Fvs:LU2 &j?%,kdmXvzmԢv2dfs7­qUEn`<ؼ):_N o2F|S,kkw,:xX!Xh˪zLLxNN1tڌ s렮GM y$ex#8"% *7:J2 Sz-Ữіp~(l͆dTZh&ɖѢ3?%͹c_em1=ChݪGn,kt,ʲX,9(FKr5D$?P4jVb! Ek6Klii7^*))e9D|y']VkktSԋkQuuu,>}rHdQ "ڢeffF]E.q#Lhbցz_SaՐh$i$Q3&|)Di!֘+LYp\HіD#:qd07 Ȍ_ I:WfDkDhת= ,沎4MJ׃:r֣GAs0 P :Tn :4UjfE%].YA[X8ȜO!JG#іؚc!&W磾8m=axi}B[OॶvllLp^Wyd+;;;'''///Ejnn`;wloo%p-A[◕!.]$1B=q_BCedRVVfF[uuutmII xHEӻkѵ4$!sne3 5{4CukQ MZ__ƆU2B&i`4Q*SР[===> ty$4j5R%і-Z[ꪈmQMMM.PKl w."tKLh^+++˺,,,ڢN Z<$PQޞ-z e3ڢ%4aM!Z=[Fn޼IFv()[YjD3\_bu*ze-;kF;<\}[|{^ySQą>:30(/ak#wR)ð?ⷰWŽ[~d`M[cɈX<ǗsT 1jfBSSePnzҠ.S`S`cY!g]Vh FR*xdER* ąWJv=:Z6aIloQmB)څ[pn yF^Q@u.zLn.:֪/.U#+6j8#8Z`[*qR=&fOje @TCV:L/cm0C a{'XeNW]0 uam2Tq(+Ok|gSv\G2S+Oңuh\x_qNTOnYswyQ='Yo/9mmA[۹a )ql&Exl,y8j29Z#bؙX| ߺD\3<~ExB&`A\ֈX͘Zx3f K1د~+Dmc %^\ ~piQ + [eIMrdK(M6ڒh. &TN;u>N*4҆[ h#倦gu#56Rb<4;uk  UyQN3NnY!>B Zgmjx1'їl:Nl6Csm?iEÛ%[: 1( [fS3q*mv#FÚ%j!J[mX`iɗ(ʎ; O`FY*c^`L B,d]8?|v@&a߇vY*fk?Xbj`.Vϙ9ܸ-x8a/hgWі$!'} R-YN*;t\W=_m{OVNbi&>K")&l1[K#uxj&K;n \f*ӃK,E$ƴV;HjIDs+ қkFw@a 5`9Sn1Mh1t굘Г:ܟbxBrҔQDk8BG# +t$`<~Z4ǽBijbq0{Xk32< ǭtUDW?Jv ~ QXuY@lʵiDvhe`f՚"fgQX|qwHI)+KaQLĨϣvGN[xЖC^o9jeXrssͪ-)IIItNAAAyyyMMMsssggg?dggWVVѯuc&166P:ةаKKK`hf\(h\WWW]]MIjEsw]EGmmmfM}]Ee(6{Z0_"x5I4xbllLЖ8ӫVI`oo/(Ji kkkm z"2 }(Ol-,,,HtȢ "[t쬠-:b$Ru!t?nQ_n]$( >!ߺi*b F-Dv()[jD3\Nkcl] іOsM1ΊRrfY+6([S _@k~8TiF 6-% ^y+jlKmZ}ԍjAąuPG%#؟Ш) C%Qt37ЏMjVXuslæXPkޭj2Ua鐋4~P Ucx*Q؅axy+wimcȂvؗ`67r:a#PԎٵNwMPR81T2t`wS*H]T861cN\FjAbp ߁)Ԅі Y8g.._BmqL;'Ik?'|Vxyі#m}%m y/?ie8:ɋ~/P=qg:[LN")в[j+55@ &F-#xiIJ (5Hp@["}0!Gݠ_~wpӥV9! /\%&e!-tξ@ZmsMCU{fzm0a H5WH$`8NWcjK3=Q|k+u@W. 4!Jꁿf;yKgҸ=\teYW|Z^[tp٣, +GӴ|>N3A-n1ͯ>{.+,DZaymYP[B:;;|ed9,...((0DuȦx7099Y(&WUUQE$MtbtJJJ‹N3cbb_xOhѲ\zbgWWɈL赨p쬤,Gˏ዇< n*b[ԠdE2'7TJkaaA̬$Ύ0F.Eѭ?hK0ɛtc)JDJmEVD*Ǐ-wUz敻[yfQk^yK517Kyoq?.ZN \B m~?d+6Kh8a |;'XFl _Dfo %9cpTBa+Vؐq3~BS0'-a܃𶪀4p cGǻ !apSPdا8E m}-#'ީ=4\yL~g9Ir]@S

77G PGqOA 2֝;ẃB赤N aVѣ8::A Kk4jE#w8funX8{zzNPDl%Hh(ƍVWWhf!шr.|"ڢ!MveeggG`YeF[Fc+ZRpEv()A[)?2̂<3ʽճo3(Ϫ}*Udĉ͕(H߰QϨ OQF? []pJf iEa;ECHSӜIH;D8OM=bGl?ĉkզ1k+@fpvyv6EQ I;oȨ w*G8^!3;r ]BƉE#"]acέF,dVgƬNͳ̝Q7PuȍT=ȞY HUQd㓙ųIGD8R.>$G>=s&opm,'F["qtV\e×S]\~y۹/g00 7D[SSStՌR"!rcǎN_CC9>>.hKkQE.VWWzָL ڢ655YuDp?h^`EEEii8o(ܲڭ5tK$[K [(gff~&#O[kJXZBϮ{ PuJFrC -/ >(";Hǭ^yjD#\x ӈ^{A]Qȍ:3L&uȷM ]Ul,dM9[Yv6ӡv%1's23 WǡGJx#&xo-*VL1Fb>_; Uc"WÚkz?_L8I`˕VEo W$}ʷU~EJt!fø5WSj${jDi :/*)lBU!-Lÿ={2O}BZ4WM H&6c6Z5paՇ zSuaŖ`&NԊsB#ĖI+|c- 0YxW#DӈkR)A&K*LXGk;[@2ģo3Kiƿ_ԍWטCZ|puFu9F?OZR}×?.X.7lP3 (QT'o x$y#4 <%Es:%]Wîx0k@,ךģx4yie8I*pRѰ0i\[kQ\ކZU+U:\ʺ܋z:n>}w- d{תҔeVQxr~:؊uZXڒZ^x#a7f&&$#e}-9Xs&v2a2Nw=87b7j#{smt(<ۛXp dҸ{S]}t2·Br&6 T?фHV9|/lTk]دbd 8lJPgU"9Sf!Xq %HZtԍ䓈t֍XbDMx$nK‹%:oh$1`ځjÉy(s>#hr9uƱȭM(EYٮ$.e|cЎ$7{;4RV ~EEo%InMRy]ou&2&t-MW,]? eu})S~{sڱ̓ueL$PXWFpіVxiu}dwRxGGGMMMaaajjlْ,)))kỊms Z_1{VYYYEEIshlt͍uvvAhB!*^533+kQtD/ ):"tF"~eԝwA蟴ntNssE[Ȣ-QeggփWE r%fAeomm%čfnYEE|$ԅ ,膧-FY-*+JihH4 IٞDJDVmEJ|3mJ&D Ef-hM4ӆl#vV%Iֹsh4x:SWWGѪR;4eXz[ƄkA E\ZZu ںx"E7.aFVҽ"h+R"1,#+CHy֭[2٥p]0K{+GI>'YX.xwKf4`7{!'t*Ğ tNr}%d83>簥:ʅs `p -:$tVݣ{4'Lu4ڋ`؏_6J{t*.*[~/[_uBj1 NoيE慷nb& G9|k50wL{x8TZ);7 K>':8N퐱N!`ۗ+\@ Zdgjc,rMD}~C4}ơS8=%MV4N&X$(n,[aVǸ6J$d1 2°=8y+B8~F8]6[>N\ ͙ʶ%a:C8h#chkewEۖhkG[O]/x~~xƏ cfV*\˧hKI Q3lR6M*): ~ݬ|06`5)Y:&BΩp*80#psj>/8EIجn|;f&?KY h1W4d뀪 xSnJ^BֺkuW긬?*٣Z|<#mhSq*-.l0؍?/i,Z &1}pmڬR٫)2!WV. 3P@4Vsi<`\YD|LT[I[>ߪuV$і HGkkpKVE[\k?g啖ֶs( @*)))..X^wA^&)kfѡCX?d ֣cCCC4PVwwwggg[[[AAAaa$?myuSnAHΞ={ .KuqqQD&&h+!!nGKK-/Z -ڒ)))t?@B(19nQJ@h\BғLI Kcs)Z#%>zj]|A\lQ#dZX-^lO"%R"h+"%RzlIh=?}GOwB /y}VT[}d XANm)nP6"WQd2ΰqLNs1,ESq1XsWv%CEV OP ~mqb҄!0OAθ̙eۆ1$p㡽? ^9Am5"_'f7tV^!Z `RsՄ^e)8/7y?/9u_ƒq-8;'A:jNB>?BF3%N= 1:OZL6Y90qLMLA|lΝ@2(S94"ⵓ5]L8e#<ű.<챖0*Ar(Qu4Y>A -S P\BH)?ڢ=ju؂OR9$oԡh+4Fu zstTVҭ3 CM\h@9[i{c~lZ_|rަ{jѓk/Gi700g}6<fiXU[ÊJqyz@iz4fKr*Z6_y 0I֌sephkiQ"[_w~PZyք XG|8a'73zkD]mwnM?lK97`G%CCVE[_&cccl_(薤Sg...ȈǍbeo36ơЛ{tӣ244VUUOss뒒doqv֣q[𢭜E?b!E.[%ZNk+..]+WЫ[4WhX?Yk%h*heZ*++E%-[2opk A[vvx 333 _[4_nQ/VE|ϟ?/B5zCK5Ԣg.kdqZBRuuu20lO"%R28HGmK!J WAX9\2,g[>fɟ6U={",awP; S|p_w?YU .Ik&uCBM(쫊mB}T rs&4r 1t7 z݄9& Ur_N&c&6,bDIE<9 ZB \1N3o |gc'I^` R]4ET&4I2=CYMl1bδqo0 LЂ0A1kK~ֻ=j~2ڑ(]eh\Y"/,<Z!TgAdTLbdd|f< 80*m@! 5zWJ&Nf?|n!5?69g9k g૘ `?6N#BgEͲ,dxXY 1mqz4FU$dhz î^6ŭl;ذ-F[|oZ >lg$B-~Ҫl6NyJV '@4ohkhkaxڹsa: rZͻA;ײ:cgvV֤)֤^*^~"6Yh_vcH$/\pP3s8pmd=OR8{(0qJU |̢\-[T֏<`>S},ޗ`.,nq\ҭ2[G.IZqG['J $cE&kڋ@#׌q[KUፒQchetX z=97^{q+3{|і{ʘ A[{~\kM[\\\jj*5[RRRSS2===33377'… WPi;]LiJ#IFyj+::zjjJ؋HʞzX?m?H Yӧ%AaNNMҭ" |5MM(F l0hԵ"6gnIREѳٛ%hC#~C-A9R5֠ZZlO"%R"h+"%RzWbkU3&0cGr̈9AapWqNw?mIo˰-lkgM xHә98g"MgM /s=VB>30A:a2M1 2`Q5tb`J,\Y$&o1D{۸̉ p\Po?9SeUƹ>` BM4q!&BCECM,}1%xjqݍhbV^9-&6QX+'Zu8M!_gњìaeq`HaŸ 3,ȓ2YNC$f "ֲ9ZFpBЈq ~gӉZ$3AiXձl͚C8&=Mb<yj('.=hEBUJ5Si0\Gaz5Vz 2vL/ ;\j{Y\ʷ,|u5?y S$bH@KXqvH֫^ [ò`&B~puPwT\W5,?sHӪ+p 5Q n Tl_iFAuHXVCpjS@SN'O\'r6ڔX=2<"?zm?H/.gi_ثNyWmXU\\\PP khAtUWWOMMI3gΜ?^b$_ %++^ө ^GGGONN=zȑ#L% SN+/_-DiQQ胋x^IǏ|'t2ήn:RWW'&e3?UVV֬.MMMt^e]p`N>MwVBX%ΫmyBQC(񾰰 -t|C%ڢKzQhMV>h˿dm0 T0 rD`e+S@ <J'I 1`)K릂M=3yMH;3Of?}2w4n!b"XhaNpDژn͚` ̙)YVdOx`J80ANI*j3R V%ICgA2Zqj=C_$ڱ\ h˭6[qbVOHЖVq79MN&s kH6Ja;yzSvq+E#ϩe‘ p#9U 60c.ˆ8B'x 4:։J`ۄBi=L a>V$hy;Sg-z\Yf)7HUY\߻hG[O\/xz+_hxG';{'[lܠrOr gՋډO%ݞp-IBwxDd WHeD )9酎h@"^ŏk@NDTKHR4nqP*z 4CRj{:>'#ٲySٻtTN#=hP hQaT z&j8U('Z]jb$}}s^_;0C 4*hk@<`J%b4ݲWo$ߔ:y d/iS8xBe{C'FekiǏׅz pU*QUϪ}Z}/#g)~lϠœ{"%Rҳ8HGm_2%Wᄋ~{?{HU 1x Ū(0q +0M7ߟ(7)3&xc9lk+6G7lfP Xg*,UxgyXpq{.9ݬbcb9>:R=W6ʄoU; %xvS"E#ҟI^/ ,_U_$[[633FmBWš$<Jr %[%x|'™%sj[LPZMŘ]dqo{I:9qar/}zw2M1. AKV痏6_/xr孍?_xyYVoWի2mĽ}(8E}Feb2yͬF@[SԤY7\Y0q3a^kbnQR:?s{ՠ}&B#$rb *$nT,5V#Y= >YfV^¨䤠Blk"^СCXS 7Ą05߫h 2 Wjw6{S>>i^֠MF_/WĐmWϴVϓ#)u V9ƺ.nsX]QgFHmPdW8.mVG+YJ|rϳ>*o߾* )--P -pMz5Q~xLL ];44$‚HN8!1Gע| 79!עBcJ@& RRRh VFFm\J\\ kҍ"B#Q h$bncVuz5?"4!waCE̬ 3իW---Q_"eЙt͈%0CY˵\|y;wA&pΛ@G2Zd)kJ+^X_KgǾU91B؁cC8Sq:ΤGλVbˁ~#jN犯N8=ڡ~5S/FO-ojj8./^O#·3| hfɸQ*hfZw-H6"j\ހj!_1+!W+a65]Eni"T'5֬Gc|Er ȮFWenVFGº5QUO@=F[Yb`e>cd}eܽ]S#ob1x/auU)9b&PHl!^h= VaHXaL`;hkiY2~VRўh5j֎Mo<1?SW۶s`5jՈkȣ.^B'g=ڲ!4 зhXyM.iaHmQwtZd{)򸕎ǡFJ|d>c)n)C *rGXł}@TwxteKd`0l`cDipbOy$G9әbcWW/UluN ;aVa4P *`xlTM0ޏ1nha7Τ ٬! 2 Arad]'8 L0gl伇I8^-H؄&jf q$T`1'hsa.A[vxR}oSM pД'hgmRЖ7cS[#Lv*n*}0ڒX3ɖ0-)A$F=} =}?P !nW{Av]8DeJsƩ)ZSUlh+I umLi+^_bp(JUye.vt+UUz-ZJCVxU[1+Xg^S:ԮM#Xl}UԯC@5 S|/UO` m} âjK_8YyKoӿ2+9 @Qy~,ײ$QٮxqI ?%A mGkY*RE[m-Q(۷o =Xӛ֦&%{)l;jmhhHp P/---͍ uuu555ՕbNVTyJaDV^uih4RΦ~(8@˘gtkvvٳW^Ӫk׮IzD/iiSRR,ڢhnA[Hqiihҭ|MɊxE)Z%Gh>߿{5ا[C =9^5??O3lO"%RҲ8HGm6jZf^4mg\-i Dg=ieVE=aow̸ 5 jkxn|ƍ%FmP42q`ٔSk~2=maf0\Ex"C.ik&/zqpDU7]>0w >αx#c/xT;y茣ڜ_@[$q?9)APhj!8}* ^٠ 83 ۑq/6Z:9[9#6bIYT0zLRJDk$ '?}a,eFpT&g#pa|7CtU!\`{cB`O?TCHm Ÿ h3xGk/@1mq#Hs0e7=h#^G[bLהT\?2H-QӸmmHc6--- vDGG˛Z#Ç:thdddhhh``@Vww7/tIY%kak U<䇇^s3Jee%5"a4xIHc{[iiinyWOkBeee%ZJi֪wfff,9r R8hS KZcHJ.H[4AKg^r A[6CBt h333ף-^e閠-}6A[ޘD[unhA[4拫"uhfmZEo$Ν;_?ï~ݻwdjDЬ%vCQIDJmEVD@[)))% +2q%CXL3Mb}Q%+Mh!lC(Ǧ'9i`h8},Ur^3kl泝cBjw$ѹt˹{F7̗rPŰKIqұ@bxboRb$;>%Jm/_" mfxZF5]ƙC\(EVuɖ?W)le8˱zo* n$ B7-OXPEpVD2:ď-z*uPj5aU0/SG 'PO!P?= 8B@Y~hhC[ςӨ_M3Z5bNBhk2Hg%>.7;ys\(Bɘ00z<p)'jlZjxJ@-4;a/ZD>%斡q0cᕥ 0h1bصގDW[Y\=}b`թI G5Ѣз<0Aa=^,ZלK}іȫhK޽{8@*gW___SSSQQ NHHl?]B,&Qmvvv#і% LMMMJJaٳ:E'x֚ ݢsrss z5kmmZ %|>jA4cNetVVU"y閠3gںymyMiTtrWWuE[hb^Eߺu~:O}yTB[^p%7|-Qm ښ-$]Es믿nmpѫXiݽ{?|}wyNFʢvhv.F')A[)_m_Ԫ續JeL,w?[ lIr@@[̯b=v."xB3-d0+Xk&hu1М ]6L}8gM5;drL1W8oP "3)*q?S@S%ԇ5aB7s8sڛz.n 1Ν˕[Ȃ7P35qLI xmPPGyK3bW00}J6?[DlC'_9&˸/3&r@gZ82;5`0(&˱~!w|;٠;ߛlCf]q#lg;WMviA>7ʫP!Ȫ0P<0\ߧc؈.}Jq&{e'n$KXW\>[q?0p 3ק[r͝<X#5g=pV3Vca@-A[aER'S=L h/G[QK\z|h#m2VYm=<$Mݫj=NH6 $[d]xc%Lb.y*ɯƋ^Btx,iqSLEw+SS1+H)\UhlP &UImCk0092)Ռx& 5ڔR$E[333mMOO[λK{閴/cܽ{߾shnn@VڡmɵVIDVV)ȣiF}\}klLy5̑8\brJ8 4^`j}&iL>0&m>.2v101Ő<1T u M!ʼn1*j`,8 :3 CL&[q&wBSͱcA;N-TȔJ_gfB5aO#BGA[Yd;?׍>V/m}G[bR(Fj*PK]Q@%j2\mW}=Ǘ5URхA<͓X=R]gWMhAN{UXj \zudˎµwTU6eVN]gj*LubS6¶ Fmmh荨Li5;>iAo"7֬Ьwfqu_V VD&k͡-4hvxY*Fmj\4mt4^VڠoɉTJJJvvvQQ3t+'' /UtAd:N[%5}~(YY%iYBnH#??)AbE i`tNSSSmm-ʌzɚVM%pQkY3( (߽{W}p;w}]:޺}6s)zJKK&R;.\b1ꢻ;=HڊHh+77D[h7&4Pbw%2 X xek1Qn~ \5qgʃLBq7,kc;7G?ˉC'4ô*؀طvYL9хD9UQe@ta=r2U89`Gv詬 Ho'+f8Xz΁530a80W Cb!R%L=Baw ш?} Z+z #`}-* +.8Ymɀ.~) "%AUD`S 0Pr q:0˪WhY&l;+PvjB.2@")]qӻ9ə㌭1(C 'CQlG}onuiqNX΢|8f0b.[fYŎD+a(DY~8 <_c/NJh+WBf3noꅕƫJ*V/T%q їH=Zp[!;qsldXRYQ0a͵'t+G}<tE+WTIP^?HBx'(RUxuxu?/U{$[-l<㚠EX HL' LG0M혯ᐢ(uxj= j@Ppqd6jfC`x%Ő.N'[w\SOA&+\dxA\-YԬYf;ȿƳbrEkZ)OR4l$FW dO<.(ԦdY 45tK$[^YIbhk  599)_nԥK$ٳg%2Q#\l ZC].[-o ] 'yjp=:wp =ErkΣXEc{?D`L wy~뭷nݺEQ_4H8+..ŧyk/ڢD&)aYyjD#/mQ DcG. 2&@Y~ \+kq»@gN㏁w%" ˌ?-l,Or_+@)&P5SNȜrX}@܄ -Y|CCw.&ɺ] r[2޶??39r~{Wݏa#Jl?g QQhZYE#⨺`v$+}YИnsm4dFs0=&Ma.?Vvq3`=)T37ocix|h8e{`+j?0}ZkV:u| Ecq| *vKDh~l'+yKzi*pZmÇUmMHx;)#~M2c R8%e?V"^̌;Vh+S??ChtGZm?(Z&0caj0lLJ{g7RZ;r. DVm= Pٓ.dxr;L#2}G.><ݸws.< i V:fϪ)F~".|!&U4Ԫ@p>JTtԊǯT_(ת^MwD% d;AE^hV:nm=7c: u3KF#W_ /Z8O}\c9{<+<ZEwԭSs;jޤ U5*ʨG/MxE[: A[4+eV F[~fpOm^Ev )áKj'\k'YgMCu4?[a/oh+55՘a"***111===//ϢFT\\\BBjh}h/dy }/b܍&X|VX$XcONV)f;S'ͬJYj:E0 |Xu0iv:W{9zӌ2S>?ncбob߽F[|[F&yU=*,Ota%`,Cpgw,X c #kb*@OquN:mY45]ETF3nP cxexů4`c+v. J,KYIXo*ch8qd53Fއ`r⾄|(Lw}tXKqg!s =07NyI5QiL˂qVhOЖ3oxT&|øFQ36E[笋o1/VoAę5 G[ޯ)Z~uhImmU0O 1 ѓp6܀<Ȟ 1qB H,kQ7L!@"ף.^w6("7ַv#_ilNB6uOŠ%k j$jҢiE+g`mT]JŬm;yۘѷGu*J(-~u^=pZ-E%~Vmh!3 ĚՄO12+v:]h: &-^ fvShum4:9r_"ڢ cm%$$/:R&vkYU]]-91㒔tNJJoyw-lmmmjjǠ-oA_+=644Pw+*i'?&&F[K&Vcl$.4GkE3dO&1#S$[^uҭiy7xsssSZεӭ۠\#ܲhYD%FwM4NNN8q,*(mQ;|G}$^[,LI) n4"C)Dh$Jӭg 1HڊHhx,d$*Z^4K=\nOd@'!Cvlj,}rq𼊂U%vgN~2WΙː0) bVrɍ1=& ̑z` u VTԱ~&'˕}-ӿ~* TXa5fPnfm~Mr CV&me5Y Y\lTހ3 jUӃj4:RR.y薬^ uo^6i [ #2WFh>RΫQs)J 9LRNӁ ;z}F[{4Oe>Y)/{ YUE[dV ~Ӭ39bM0aЭ3iڭ؄z0A+:pz}vyۧSa59;pr/{U? Jt%{s 0 EEemvʺcW@vQƙ?g%;?g9;>x^y~+E?Ȑ80amu7~x9PDmЧt011QVdddXXXppp@@/ ӭz1Z+іɓ'K(]\+_"JII1ڳ.- ̔D.St $\Ȁx4ә3g 2ˠ[4M:,ٚstB6n(ׯ?,YҀ")xvv65xՅnXBMʎ8 2薁,XAA[ԂXuQ ˖-gVFF]Dlh"c.袋nvy{ڴiȷ$>LϘ1ED1kZϮS<-)'COãw'mʊQ:(8eqQžXye P0k#Y2%dG)2׊{Lvwԩw[6eƝa(g󙅀ZyrG\ik, y-aq΂GX}8BO;~['h# lv.h+&L8_>xZWg*NCau֨D#tS˴bf rdgs,[tӔMAWN%m`.pv5VD*Pe+ I XWg h>N#=D%#z N2ip ڲ5"g# qmYg4>ѵ<88m?QWh˖=<=`K>p/E۟@h딭᧭(0mxcwy7u#'?F VUǠ[1 1h,GƟ- 0i730b[Ɛ$I].,4w>|ԔP/ u5I baRFɛe^l\4j!R1=y&8~_%XU!Q5;lmo^ L*N΋X˟f H6HB(hk4?gLMyIG Ȓ^:o:s h,o mՙ8^oPЖܗd4"+7gm?c;/TnDk#-Yٵa\eDT?~O@@ U(9z3i$˖mq:Ea'Oȴi舷n%$$H^?y 5/A MpTbV`$_!MfA4'\mc_w2qDj n"VЭcJӭjaM]q讱qժUeݺu˗/?嫴@q1tYΎIшk׮wzÿ@[fᖙnѧf~zA["ʢ ^ݧ ΚqLm޼K/=s)֭[waЭMBKA BWQfe-V؃; 29 ˚Ǡ!\M6Kنps S G* XS&s|rȞˑ TUz wYng-cYU`>)L<eُcrNE|jr&: ja^Ĭbc ꂓ+g9L߱S&s̙ צiZ0xX>i$t1'{q)Ʊlh 6 .t+9gC^ ' 3Xxvr\3zi{fsۛ?|ނl{T:TX~F[~8?z[ף@ha+'i ο<)vW{5Cz2"є$%D嫵["; џ j![O[f.Q?c:VDu !"2Э ST$hKЖc-@+IG%D1@+e RT~u1&9KMb p~1t5 y-/K`fi@>^k2B#)u;׵ku -9mDD<nLN)^8 ڣ>C׀1UCj-0^0P~Jth=ʆ 3xF[9Pё +fc[x%_U@LS|6bưRYp \ǣ&hm>X34eyQXs:-Jؼ!ůQ3x}S[m,U*;pߠr.*t+kֳY)E9IcLɇ۟Zr]:w0I+Ql'#[JDMfm%b5<]]> `bf%ʹЍj-t[廪*g}Z19:g)VMj̒hkכ9I-wu 5_3<?:}ksڒ//5C[zrjeHШ'h -pM) cN5X>k\契8bMhܺs3m_kH(M$abZW#'J~OM7Ӣ\STc.bI0QGEkqZ5EB#L2-MɕvK8d kЀK.W%n{+MF%,>]8h34Qgzu X:ݤљ+S#c*ˏixX~BtPj4 ڥ ܡ:_T.yGuީ:oS7 5*ή2b~(7yƌc.:mF[tD 4i*\Rt9 Kʲ.b}t1͛Gu"YUUU1dlfhWh((FFJזɗhۤ6 d$ xtLź@:S1Q V9994#zdΊ(6H˴zt?YYY$:%#!5B@7p t/PhI%OrF'GԠWnڴi۶m!qƍmQ@p¸hh04~S<ŃK%t1kfeSz 9ʱF˕JeB¾v 2]@`\1q!oS=;Q~r\!ΉqU6""#+h#9G&dhb!ʅ=* <4T'q< R`U,BX9O}ŸN:B ʊrV쐢~)Ŗ?L6g)ؐzՑSp((͟c$7>cr异WuGG"aNag uB2&o<\,o\Šz.asp ϑc=֜%1S[htɌ9 m\6L%nZ%gChJ3{*h?0my [{YT%ۿ۽w+ZVuUo>ԗ.K56|@hps/k{u\ۓU"t-L`- v[nKLCp$.[ LhAKVP[5:PV>Z#`+١M $D)iBi6hͪs kqB r,!@F;ubUV-V 5 \݂}ڑY "5Ԑ0m&q˵MRLт%#pҸkZKf:4o37wu~=nM m pKdM sT-QBkV)؄LZ1^~jVMj֘4Zeh:2X]]̀ZOUӪ1\7O/Ć4DZJkjm:{ƍ3.nEDD$$$hKb(~ĉ~~~!!!tN$J-I(cg̘хmQ_ YfQGbI2eJuuuEEEqq1!++f$ .::ZŽޑӵZtSPRu***ĶPǔi ?G֓@t95[YYyuU߭t+/Wppp||U3գ~Y-,A[ XW ,r&-hiVrLFl$,¢28vPobձ\U>X*I:Q+Æ ;6=G5k{IsVV],v׹]?ѓ7#pe 3im^0W P`U5f rpܪ39C:Qw hZ\KB\B}QtBJpppTTTBB[RR"Riii266<_YG{4SRaaabOϟ1c1Qpc "ӧKoh1i4`bF]ӼaUZM6IYgn:jIYK%=f-W)xmyЖxR|'w:RYHաՋіu,WTvʲV+\QhVyl ld1@[a;xbg'3mڢ2m"7b%g1h9Qx8QshAϓU5c"YR$c2^4 !lqmN=k'ʱ-gBtar@L,΅!Urճ%Q!\Sc/(cC #s>T} o/;̵$u#mfd c :5G5k]D Z.ؚ/ZĖ3yc0TŒgma K!TǚgpXu&6u^|դ\90j:XqgL Dt*e`$W#Gq:lO$Nd.%+^{hc g(Re]l-h.:>MP_bR*pUlAhSQ˔}:F=ިwK/mY,Ž;^:ֹ'@[C='6}~Ou9sV.(|Kk}zh㽞g]V&/(2+`~:yF jVt- Xaxg&=Ղ,gqC bB f!|a=G]w j@hUgoJkR%צ[@IXm-*шbߪ_F`c6jx`` ~i>]^o_7?;_RF!8('j1 fb=I#%P&򘥰+[f$"ǞӰ4\rXXJ{.;W ƲqD+c , %Jh&b_ʍ bBU1r]\7nZij`Z>D$CLZ{twb0 es&]"0BP4j|!(2#(@[l)ʭ1Q-z*8CbIml5lqT@[XRhGd+=ö"1]Y(k BY~O8G ڢv=?:~ρfu=hkȐ!~@:g$oEe| A{w~7?zt^/g[On)J&Z:Dp+0-1$J`['BlO񥐖cKV=fi.AO4>n֊+/^LK!!'y]EҧԾहR;"joookk[reeӅ^YƳO-Osң-wV[L D{-\~>]Y'pD+S;8)?Ѥջ+&>Ҟl4Pv/\gB w(yʅtjNZO%+m9"!@|b!S '{rHD$hfQEVr'3ZGV: yơpq=X Kc+kd4ښaoqI |ZW:x% ܮԳ^ tqI<3 m@V5ZNY4ޙE|BHW#\vrYu8xp 7yMv`k-Q:”s4츂TQm9US"F[N?~\XEGlYne-^o:x=Iقm3ƮnfqtUIT%v߭3ڲ2꘣~g|}m(NQnǬc&i^?շ*ZKlg5hkB[~wW)ohZ\uyS|۞x]ϾΙ=B|2Cȣ56&`7pf<p~kԳP Fu&T,jÛ 5 gjrr Нϯ9 hzr pT>V:,Е2 i300/'R<|WL9:RֹL|$qHt~Ivh-LRN~!~|bv s42aAG\;5HW_,Zc!No3ɧcqޜ|3o5d&|Lю9l;Vppϟv^OOq8'ᠽQ:&>y-WǟgoYX]8v=lРAB[C~Guƀs6-hrA&=l{'~/~뇅Tmr/ _$D&tE4KbFDSVxI}^еCnCtK|||222RSSEm-:2(PkЖa?-l.[leee46adddPPԩS$IDAJ6Zqߢ-J/?::zڴi@7i$:'H-,,L EK\n=}D6\)_tnjѬit!-(6Y9f$Iw\B#I`DMZ4kZTYCYLìf.-I\|9= ϧpЖ"5"m]f1bL $ Ɩ&leX7LPQZQ3=ɕuJvr-[ Q1R9ƀkm/ 됱s:egpcs$Grk:8wB! <٩i.GBU9{3[ёopWx;mOoƦ,k!eW8wp:hêwR=-`OYIЙ'QVCӗԙBZZZh]53N$  $K#-cEE=]Ж zLJJHFZ 3͚ٳ+O-O dE[%wX;Bu+[і5[ي$X8"W:!ڭGʺmlqf% ̲kvmA!m X?nj[e :ǘjTٗGV9nRFMg{B)kaU0D#_P-frG +2JDA3tZK؅-DP^o`]p/|TW.IuӖܵxGYi1[ f?gL]> g 4׫U9v*V8*7IYl|B;GEH,FR_=x"13.RL$,T<\S䟓k+q~HN.9!9c%L>؍x$)>5Q`8g\ mɍ\kіԷ7;`COxL9Sbm߽w=FXmhѾ֚>]7y{oO:FŌ&wl5߶38Xhk|7/Yڰꂚ,gz7ޟ?zۇR+A*"@$vښ~42R%tkaN& I1L(@zToB[!&#>)D#"}N-XM Zm2h IE;ksHZM35`gkrAb~8g$(J68?,"BRծgVB2Y$6`5JJ5n69:qw[NLpDf-8kbb0hwYXu|@u>:W H> ݨ\wpO>?|q}gGݤM`蓶z;\uYk*VM 8xm?Z@[;mQ*,,FFFRRqKVZZ-\Qpp/jNPkkk+++g̘!)))4ӧI萘h=:>>nܹ P E_tI"#j͈͔BCdggPb"- ?%~P_]]M#j".ZKii)mʕ6m:s?۷/] 'J"N %n4x٧NdhdN+E[e/^Z+ Nӵk׶tN3C-DN=4Ti-#.hw611nAyy9--AZe˖y6&)'g <xN>e!K'XmuSE#^YK9 eW:NHxeYm4ece-W6$V2~wZmq8.hk"3}%+B65nU%+f#" -L ʾPtf庑MΝ7Qeߪ* ^U9ae6GL4W>rLE)j ˹"[QElEjҖC^]8BTl,=s!aH{C:dm092rz ?KJxԈأ=83bt% _|k9`G9Ն-le}Nڸ 6ʑJ 5 +O3Q!CBJ4XF#6&0-GX1sPҌ\)\X%X5Em617 FbF[4My>3:7V:t+ue/=u7Ob=]L}SM1;>Xwt(.eOW3ڲ>8# Ovq鄎 F2fg4Kv,j+KG5`MI%g.i9{f\JI}ini7~:"°O8 rbX͋Gd<.)@E:96ezjɘ=Cs~̈́f>@%Wa:>.d8'a@.|MWÛ H \j2n=afQE`FX 9 T-}5 (Aq>gVX-:<?=-\Vk}Σ1ępJM4ЖHzO`pz0@ЖYgcv֮ f ,ܥ:ڭ:7T{}|ݥ\zx/ y%[~C?rx$#~WPY-W5T&UM<~˱ԑ9Y*c*--AQjjDP@4Q옃`JL~#C"mVV-&Olr3gΟ?@QQ FGsEЧF<Z4L&#jOPN%h$tyÆ ۶m۲eۅq6åKwΧ4j]ZZ D@-ە7}7ʠ[4Yat\#.--z4l ɡ-sh*zbgϞ}Le|dZvnAGH=?MMMxmyЖxV<̓mu`R+(F[LUG)QhV,vR~F[u^̦lLi>3lךd{Ձ\b.$-_eUW䘡@[9ș)N_1r,\*Af#6p#&͇|7 W#7Ih5lZ>u2!܈2ۙ 'L ~Ѭb帚 s;s1{e V|*[\[og!J=DS= +q&^yb=F,EhX_ \929gsCvnc`\*b2 ʃX!r<Nـ(,(NIXYUCIg>G`,.\7r Q%,h4n#>}bgOpfX[m{Jo~}_raxo%}('cxš}pZ(֮cGO>v\:3݅cKF||NĚ@Ƭ~ӥi7g}ۼh'WdE/_‡>N{=7sϧ Hlҷ Gk6F$§$* 2V~\ڃk*N<9ĠZ\Ӝd|H[ich/M@ 'AY$&dݗX{yd% n܌ =a. j0J!l V{VQXR XMZj2h&F3 VBuaIӴp^fV(NV4Yz"S11Zvs*Ҿ(|" ԊY󕫶k}玞Ϋz:o鼯_=tw=Xr=õ͞?}z9gП7z:_zG.|S~|??[sg9'nGcG! ތEk%U<7߿ mb2%̌,h_YYY\\,Avf?ۥHRSSccc;2@G ɌxJ~~~IIIMM =-jhhDiXVVFKAɆ*///**3/^,tKE~aYt)IWTT׬Yy 6lڴi˖-۶m%\nGXX-H=eZF]Б4t Z [xs,Ezf%XɑL JLʕ+:,DЖ|Z}5kֆKo KJw8.aO񔓭L<x :䳑,ڱTVLe:ڹ.PmL-zJ{Ni  Q>6Ib3ġ me0ڲ/J?8ّHeV rNR`9Y-ڛ:q,ZTQ\~qsP0FCԑN9r)G?ȮS\9@y)ߡָ ёmBվ!*ƭ>{ 嘨l9^Zs Xʶ]r>8h֣QO6D=,vg+m/+NѨ>Gn~߁zOYTw~:}o\b:}޲}r[_ky}GN4}|S|L9x_cO o }}i?zSO|Hx^8>ˡ_~3X]=2u z}to҃|۪V3s钴UB-G[WBeԩSnjcv///7T[b%&88،U[yyyiiiB$OL󳲲$NЖhK M9NOO9-ZDXVuuummm}}=(..6h=##ϛ7o5553fXdISS̙3P u3X L\E&4kjs֬Y]薬3 FںaÆ˗Z`\f~5i*(AAAWl||< L$[qqq8nI4")`f/#auuL!-8 Z;weV^nݺ7hijF[/z8ݵ-R#AkK8Hgc)A[)c%8;Iӭ0FjIUUne=pXÓ{h#XY˖=89ɜW|-x l7D>V++WN) qqV bUV q86,Ji8ѵ츕U2kFؖ*\,+2 7bUD`4],@rL`X}γZriU=;\璠=X`ʂ}O}e'n~b?y/#Z5-|SF[ɰT + F[Vpx:4gG8.e6[3UA[׿\z_{z}'m[mzhACqhkۿ˺gZeݮ."<}r恏zjٯʺ}u{Knq[Fm툹cC։/&V[GeܿnEu mhkώ/Y[ںxgÖkz[nvD,?;@` aAq4^me$3&J&xO>)!!@"\TÌ 2IkDt5Y|ToVJy$c9:,ss\wBt!H;q(TM\c`"&- ccUm~ g-¼j }Mu6 e`QPFX|4plE,_ hHBh67Wnh3Sq$MΒYf-Q?q[/>M}lg۳=̩?=ӫӋ~xw3|6xa_|3ӡ~}O_dzt>ynk3F?Z_-5,[6=!Cã~"^봵73qHp_||U111#K{Μ9֭۶mۯ\iii25Vff& /666<<ܠ4ڢ9 ڢa}8W~_hܹsDURRZZW|mmmSSӒ%KW^m-U`Y)X>UtARlEBP/~{{; Zt0.Y)i4xSqʝ%2%%FEm@f۝qM0<]Z`XXudHh.46bŊ6ZmQ%";1ڒBӡҤh555xmyЖxV}1.sպu173{tȞ@ĹR>h+C k<mHvNF"Ж#*'B1 ش|U D>iJP3E`&|~DU,ʲPv:욕wxλkb +xd׌˱DAqx#˱%|rVGGGr ⱳǻ~g+͘lDܤƥhld\9/c=3-p\˃:k>nQLV__2y(U]7y'{Ⲹ[F h 賉\Ose"xܘMwZtׇE{ﱟ|h>uF[.j83nj[@xm9y^x}p5ygO߶'v:v﬽gco{,=E;eW(bߠO?#^x|v x@[/u#a ~rᴥ?̈F]kM˖˞O{^Wzʃ'=Δ>kV߾}~G^[U͍;f︽sڛȗ zکY5o{[(5c83g3U(J"d U$uTx'ЖYTg/ 6z-_P@[}ZQp#B|YDŐeb(V'NcݾnǨt#T1RL*s 9Ŝ?gӞОJ\+)#` 5ZhX08µk,?Y(5V6eX3&B16ԵL.^h<7qXc,%fl !t,6u崃7q{=Gx>{eW/yӎb#>d_wMy[1{?w}Z_zǏEӱ!珄?S̳F=?O"7WB~ѠםYה->t?<;-a xK;ڛѣྰԜzQL2ǾzTG*[1rmёSTNh4u0Ɏ˶jW^LbNl _9 D(z6 T@6rT gBOIʁ5g*#lʙձc rb2&f uXw Q`W* j%5!}yG)2uoK]UQKè9|/SGHՌ2a^avpu^Wix؏붹J} ׯ|=Ҡ+&)[ Crl^{[y [ީJVmhoF K|8{)嫂:rnxຌ^*뽢tk+;ϳ-]\O7H羞?~ ,hO<бZh!_Uy_>y%5@)H".V jD~_췪#}>X>ev tCS|yҳ\o/{Gg Eo_w51[n{Ƚ{yʳ^i˞t-}XפE}poj+#$ڒuo٩z,;-ΐ!9gE]g۟JyӈW_ xSe $7F+M2 1Tfi!5G,R1<<) JPvkzq2 #poЩ뤁kLp_O1}qsKּEEgE:0pr4͠juP~2񾈸>ZS>}1wa{oO?߼5J_=/k?p_Ly@3E?H}7)Q/ʓog{wL~/oN:wI~cymQ`a(sxڏ?,Ⱦ("ܢY H墖9+'3[6H`Bã6}ڵk/^LFNB#k=O-OKtq2-ZVGs(b bř 3鲶*jڲ)[ŲNF[Q_꫐V%}hd'l8W([m92`ce@`#~^ `\r^̵8wxؼ':ްjrdַW{tWrpuUv,Ja)pj1گ[‹^M >Y5\{Qa9ȩ?pfO wpZ<^of׏hk+A9%W666fff^WWW,:99}www///__߀Z+pȐ!CҭZXX3CBB222¨@Ǖ'CIEG^BhDMi ?xEI}7n^Brr#hŨ(dZ_QdiiI*00p˖-)݊W}=&&&nxO(2zx$|25jѣ̙ E-inFk'5Zm۶hӦH$KBc#E ڒ{ 5 n|R ڒdH!ESf"JA$KDHHz1mw)ښ5kޱ%*LlhVՊZ5Vi'?OhK Mnd&-Bz"i!y$5iA[$HH݂H z sAD$dH >3ɧpl0lɽ2+X`1@>D>bAEB] $CHRDh VɭI%Am ⍉S=mLBl<)HZߪWnPMdUjkIۢUXxhPK&ρgN-9HoL0".(F&j.4( pd{!3x=n绾8ߕYJ U.4*.kT\(ǰ Bx6I~WD%ۮ]tP@BVvSY:#FJFI;ޟ>H]޽'݂x<6SI|&Yv@O '><̒'eIqIϏH$ܑHJ)-R&r(qN#IE-61ad  d!4fKkmq"~@0ONoTz5,<-!~ /|3*3_:0/M1?5+W-VD^&Ve/tNWz~&ϨڨRtЭ'4nwM6?'ӣ|hcNAKϬoW$TMB[AISK&ƭX0hZ+ dk/vݥn}e&qm9o"в|a"V6=,Ex2HdJ]% j +XTg *Q75XRi}LᵇXf1d~CQ$\De$ .&2i0=J9pHFY^[`zb6B&&&hkǦ  ;LmA[ Hc!Ao*pzЭQ 㔊?Zuh~@Kj-+X9Nx?R/j5? LR].XJT8QUMu k.'Zkg=Yz|@^uO; e,]bZ nGv7Gj;&IIYzNŅ*kB3ǭitľ;xc[i`gعmƫ7>eDӑ}_UzxxP8caa񦓼r֞>(-G Q߭!C899) U)3ܭ >N\E9QE"Qu|NuGiiixo:Z[ann;Txል=z4uN*lncbbp+)))55=wRԣģǃ{OËœnV&liXZZ{G ۈ?*t9x>`JJ 51^F!g o5޴3f- 5[5ZmhɴCڒ5䝒iW(S#tKn@‘4&$ӑ,(dn=|9HG!tˬ zǒF[O-&Cq>DD\o 4<"g P=(T_rz"giFj?8cC@t@1i<<D}%RI?n b$$dv4n"U:H) jp}Ն] BlQPґ&I  &>c!?2>$$ } !d97HFPƊ$0!`xx fnID3quBǭ#3 a$9} ]AS~ѠJZ3;K mYUjwtء\S % @Ek5xPT#-:!Yx\PLǧzdgYl{]cڐYӪ?Tje^zBʙ+Re,Zq;Ou,p7ó^o^R㒶+(qvwh_7hֶ-/H|6jZ=91f\=_YӿJӪm}мn ؆nbNQt ?̀@PQ4^ QJ3UW(+?0n`dSu&P0k*~(ҠOɜB-$!$k+@"`H%T{jPA0[m H5qLDhm щkPMԿb- pf*Lf-&9  #zBH:8Q%[Ж<SVw8M4@s~!~LnJةm_No4Kij_oֱ`dž r:֗ת=(jйhz,yE{xqUgZw UBv%ˀP|2]ŵw>*XyX`Ǭks?~U:W>T)]:`sSG.2t^G[*) _oQ҅QTbjjJ iF2¿>Q /\ٙ쳰"ၔ 'ם&%%){mQ^etByvx& Ru>B3(w'(Pg,? ʊ-z-ZҭА|Z``;k)W P˷5(#""|}})^;?xDt4S'oӧ5o}S(ڊl}*ix?C[xZkԩ" \o-Y[$.u$$hd H@Jwy:n9 b3 bGTX!FO0x#p"4b]XAmQC btS⬉a-D: |>%‘&>ʆxx&8m~Ii`tgK63hˆ*Wx xK-pb2Fr$% Hr[zc6ltmٶoH"Q2F)IY`u}mҸւ 1ӷNx.֋K ;+BFw}T[L$qIk6O+l fEeDGy`yޏ̑$5l3VǘzP@FIE5 Z@xL$pWRZl?,+T8|H$)MS#+^LH\@>wH؋ӀPsankb`zTt omFH$81D%VѰzS]FL=5 Ktn07:&x/V+2%iE bfDn?:[Cc&9g4e6,XݪV?\|m.;էZ'>)r޿7䢷#5l˪qȓVjUuLWs56Fpj* xRܷ^S+ϝ5>7lK)ywyW.;5+_;Jc2}CG،pߏ꾻%r%9 HFk###PZP᪤Up|rpp%c))ԢT#(((:::555==]VBBLޔPFURR<})(zG| Y@XZZPw# (qxGWJi$MوM]iB&wBEE'o4Ç.X!!!x xt]sP7 q {kggoFFZ5ZV+jGV׮]?D*?&&--1b@ ],%v@L#7cA31 qjb!7o5 fI+rL3G_q)-hhYbĨIzp7{(hڤtM@,:8\/1#ӓ!$E#ޏ4֔4.i)$f L_bU21]grEnxEn];nr"IӃm;;yy/2HoR@oOq,7/Q?eѓC:Nօ.E9]}tR;ndd?3).s[;FIGNM'vD[ȫf}?|-?+l̊pH\y`yΊmI*˙@c(qO%,ee,0E8^3$*% Wz& @ @C"rb &$qc+FNw :~3"D'&B!$ߦ0=* BDӭp;`hpm`G %~L#6JF+RJ<&0*FX#Ewd iѢLoNt01GQܤ\ 2 ~VR {rhqa^@&s*y]j/VwWٺ>7j|?0g 4anϛ:ҩVM|*'_RC qOEɾH|n)Lә'h.mWgV/)pPt'?q8EjQNoK&tIofgY]~fwϖo%n(Mb{vSTTT^E[|B[Wh͊H\y`y̾mIź-K8"D40į'(F 2E)Kv0ƒOfDԂ\S67!n#qb'\h 0.x4&YK;A9غ&ٞgs=ϩ6W?FzU_?@5W}h*Yyϣs6>I]%,ѽzrӹJgU]`o]i}^D[ AWe#mog"9]L7(Q :QqLxVT+‬?lA[7<*pW^^A[:u/<[x\BJPfd֚},_7kV1m>rJ}A#5&t|۲.^젟a׻g9(b"5OFH^;d/8הv(eNi XeܸC2 0>o6Tp92I6D.@ڶm*J'V6"2l#x7їԖ"RlW  ~SF|<DxĵDJ|HlĜ8o #µ 4$|_yF" 7Co = B$|/L\ H' 2'GX)mЬjb bKv(|DF4T jJpN"5 N)e(%UU ?N}=j8ƈمDYfBt@R〡%*%'=ʹ`6p$RhӰc^䜰z9ϓWN?p0HςՆPSqVqs e܂GV8>,֯*TB՚.{Vijt1Ʒ-vW/tzq?]}xMcGAĚYL]_/˻gRt]LÝ.]dySfTh{aF.~uіHnwbf(P;00pQQQIIIiodjxeggGd XNNN7WWW///ర0-|̘1SN111<</SX 2z}Kyq 80&&&Z(?YQ~h:o FַJHHC<E'Rƅ7M| mu!x|BBB˩mFk!5Zm}Z0n@ $؂dH䁤 ,TB#& YĘ"Y$$hKSH@lIF䓐<^ɿD?y3x?1vҌ2 u"# 40wo ܵ+إUtX7u5I#Quq)HD?"҆G!i3  q?Jx^٪nC었[Kk,F}?m#O5RsK.AȢ9ZIB|n"'EE*Y\yyǧl:.V?܎mNt8){[>y0rgIo1T\3|@Wy*.c7{ ~LdP|`j_poWWI{3jG̀f\&g}<~Ѧ̐ {| >teU;[,ժ^F?ܦxKw'dƇ{'dG[m5rppPv@뵓KRp-*'''www///?(((88xСcb4ĨQ[p^Qˇ OIIN0aԩ3f̘6mڔ)S&MдT|B;F[*6ɬ<ٳħ`v/8$G-\bE:1DLA*"gP+Xf('Cr7f*:@T[Hp˸2JmM Bw~2Y3G~AWP4~b#pL&bKZ9Zi7f2U͈WKɳ^ݪN+;,jPd$kiVqS]Ou!C DMq^ZU}ٸQqmCn4U/YɾֹrφDy%-(M@TUU_E[$`ڜiZz03ϱ˸##M=sd*2*+ bH0{ 5'~ Q2P7J&j.yhgY7!m#X `4֤+A썄>R-'-k Q 'e\m%4qWH?58)h>hcu"e+Pa}hO )FƉ6$EH8TZq̰?)DyetM./FY|\1|婛6ԍ^0f]o _sY/Wd&d4Z0o1F=)F콶Laڒ+_zзPпÛg8ć~acd 6E(^kϩx."Z!`l̤x$^Eh|+b?[NNNTC֫AQ R!*`mmmgg/tvvƝ"~~~ [4dii{!C$&&{4qČYf͟?lDx8l0|&襤h EoZo5Zr"J|ͬ^y#r-i_Q›o-sgzG*)-|}}} hkAŋh+::[75Zmh x/ i_$ z0v.IY٩vErfqM'B/ kFqj.qI9{z\+OV\41PNvJ-.}El~:dWb(Nʿ/[= 0wav+<]y󗯣Y͚{|+ۢ{ˮ׾Ɏ A[p+g;Wy ;M9ZUVFK ^ƐI hKvVW33WHxȸ\LĎ&]R31a02K C j81X#f"b 7AN~d ig盓Vb~?[ۻ^,׼^oyx6 ݅zBvVM[bWUOV[ k[tcیV6~=;j%7pǷ g,cf,cgBqCN'n_JotNֽ;W/!A[9'IQ'J J,pLj/? ۷m'і 92ER>i՗OhN7A/"!"עɌ+`H*+5 Fp08o%`t? J=Fךyj>x|(ں\NM_@a] ]?#'(JtOՂhJEsi@XÎHuf B2^ $j:`4Xi焀:+FI׼ /vu5lJxX[%%~i ̭TvlhM&|TXr?T|M^M]M)?~ra2aBaJ(Lk O>?"ۛG1"ߝJAI2׊IHHpP.Jp8;;effFo:-7ߋ7Qh؉Iavüwr7 qN(s$Gɔ+3W~ԑ}Å/&]Of9\4Ov:NDj$q.A"I܄{qg|/ۘ[pc5ZEjɴj7f2U#A>bCj?TSYͲ,,DZԴRqj.ǺH#8k^nWxQ^Va$~lUy wM h|"7鐽 ٻz/rP`mI%1#uB3 2Ȓ@ AĬůhWiҴ|K-k6wԙwhnsw`vw u0c^ C|,hNGe1$E%\T?ZKU~3,kKht>RɻMTaB}jz֢T#bg}>lo<.zy3eZ\U;>i2,&Xi|X%JߺIF? :txmM'ZafNJZzhkӮoj{B-4 d: xK|Df%HW1GрjfE D7RY &Ȣf;"5WCL>c2T/ !4ͅ:G 88LX;#+@vHh0G ӠF[&.-- <ѹ5^K YWYov4{m(,p"aq3$AoQ  0sa'"RN#غF?&V_|L. ? E7>xYyi *'4ElFlҿƮ&2>f--~(,Y ,',-)|6]"CX5ErV7z쯕Î? Ȯ0_En|ʢ^Oh?]Vݧ*n_(L cB>!|YH&$Oy,gP\{kvzylTbqKfkOM\_9WΧS=)n{zz0M*$[L&&&fff666 jм9ooo___@e:~s.Zh˖-:uȑ#)Ԋ㿥x Y peffJ$K.\OiR(o ǡQjA]__iIo>̠A)v^xCqoԭ+ o/4m999Ѳm>-hkY֧hVՊZ5/h c\ZKUD $7$hK ɉ7E|񐗙 39"ARW"!#buy,)qH#eKDkAr`K8O?$[ D`c uen,,Yd& +' (gٝf9;r1 G40#n+b"ƌ4.vigPZEjl=K`zqb%"qD%)F#&gL"aDxn]+>g8k"{A?a! OT]JyPK/[:)>H!!$0~Y5^Ԑ߾1pW| ddZM5,dm~0y nݰ~ )<-~{3* զ:n,h <זԖn۰mqA.W~͋|D :͏E7*ܯ8챎LCQco!~e5W:=w~MUjw-:+3ʫ5`v,5A(n 9HCԫ}g;vPgԶ[%՜D:el L0pRh(1!3@(EL'Ι#25bWƉf[k.G( Gsmևpa,Fa7]2SZiJF[<hKYQɄ_GBaʍô{%8B,%9R-*J*ǡ?,- [D\+AvoVKQT2h$t[dTauވhå4g~@)_ Ɯ U|\}Z ۱BaF!ka!pWL4z!v,8ҏAqPqfA[ ZP񈈑 Í$ENʆH~(&੆C%D[P"ODa X[ccvMߴkӮvg!Q:OjIED#.mWۦVG~~gTY-үjqﺎ.on/(TVw Vd:BV~k]amwSju+[D[ PyYwdfMUk(rEU{TQuG/ 5 wnZ=e)Ken}>hAчE=U_R]EVN곝)7\.f),rR7^9opYV}^q.cvyI7_i_?C s;ȟwm6>RcͰsgzЕO\92ÍSY`Qw6?xʧpݓ%>ˋYWc]·I{d6ۥ}$}]@&(hޞ h&#q)GT'$$$''O8qƌs̉:thXXͪ=ؼ-T@LhDDDSLΟ?aذaOA{^&i t?^ Dl4B ZuXW] ;ǿQ.;wtFkV*f{/&I0'MdݑD2cBX $7"\qH>h!f4NnbASs/I-7V6 U`""L~B6)nbg$M8MA,-DXDBr Sx2iH61`{Eܴ#x3; TO+~Gnzf3ZquC;BnRϓ J-> ɯQ>Z k n//íg݆0̺pC9ǗdJ|iqs%2+rlVΝ_E[A}IlЬAh4b1 ؄\v>\77UеK` $y͠vDA"kRxs+"=d8@Z0:ʀF 0t8 h5`\%̵`R8stH]臊܆ DVgPRk"עvgOlseY͠C MDAKrd)R8]xa#-Z)2VZq"׊Vɰ3K߂ hQ-- B!-q#Uim>Qe6uߩbݪW./׽i2l}'ق_a˅y$P4SXLX0 VK//cw1Q =|Љgr3^矻_v\8\id 6,|Qp=/y G˚>|IO^>ߵn_'fc<Ϟ,B]h%24^7ɥWF~?Y)c+erEU[z*:+'*hy7ZPȹ:1NItt$;LF*R777ooర(EO4 4hP``Ѣ˧j+etE̛7:qę3gd|}})}#DBvoTp{Nnx+(}zSڴ۱c-[ |hmm 6h$ . ڢlp8vG B) ڢ9pv~( ʋ0jq-'Jh @TX9qqXŌ RvtZʡ-zׁ̳y(R}99>FO6s0W[r\Qd's (ōD.0*0ICgur%>WL(q='Z +AStZ!tL\ՠ^5BBmyEKАp^,LXaQѭj0@P;A-O=O l L|Sns(դD dTȪZs-&5'jLm?' F'NUnM֬rh;ڏj/Xh9RšT4U9C߫G[hF*e5SG[5q_~|f36{!lM5S-SNS3bVj&zjR˞ [#{O@w/+y|w =FŝR'Sx? !R{X ޙ v*Ǵ/l9zS89XL3B$Jb2 !08s^*2?J0r.Q4:VbHr눬k&-˰]& >ĆQp̯aErW &DLf"eRv @kad#õFJnv )+M{#xOi&~`FA5cV!(3],߻Y\Z[&X_nX9˴UE)cUC8*ܺ~~w7 .< u/fo :zk㯶N{5&=23'ISwL^oG=u*fzzji.zef";[=,戽vs}Vߤ[ߎ7T=RemmM9&&&D3bBQިG|mIe[| g -Ua{epE8a„KnذaF!.|c=݅ .ZhK,!`@6-蔤n1113fXl٦M2F6mܹsLE[* e]M$[76̣$%YRAat27ZJuj%;6>>m+6oZ4 \ we (=@zNft h@cl&Y!=q\<?⽀}KKb@_MPcBpQԑ0s,ט2=#&0W\s  Zi*ʱ-̶}BgI9&&u&-ߗ&ߛ؛(n*֑!TVT(۝iz6ʿV~(Ӷ06#SP,YTDYfJ w3فW$W(sG]Z%PlPJSe%76tSL+@4͚L~՘2gzdz$ Ò9E*$kRɚr''\Hq-u|~}+ۯ]mݯ <.3οBħ=xVMc.{aeug,Gemev-.oeU]_EMGjEuQqaa۝^zͲhMYr]3?N:w7v[z|V2zHMNM jXr̰"*rʫFÆSgtoǧܟ2#|}|ϳkL;!M7V d hk_]P3 ֆwcY`_r}haΑߌ0a`WRKXWsWEc<2M/{/,k&ԩ~W<̵ң/̻6b*1(@Rboay7Y? HVD.5EazτKNo! &&~ae=YbHh>֕Iv5VވYSa> ~O؅;yPw1$s$m9}Wgr׃NkRurVU&U&U=&U&UIUIؤ @ ySe:x`'ܵ? 9 ߀1`@xTx/Vo՞ IK׌S/L;v_}6x }ӡW&Ȃ#r:Cb]Y߰ ƼgH}եCnJoP95Lonsw^t͹k+t tC5&˸eᒏ\-"S7h k%ӆވoA"N/޸qmۦLB,eǟ3gμyϟ`)"TW$jM!0  A=u@] 1=>I.Aע-E[˗@5{ӧ07ZRqm#ZLiɓ;z_:@@[hk (BvhK80P38%Wv:'wBO@ypEC܀p,cw$  :)を Z`6s᝸@3FʗC[L``~EnLz%1.\T?3@yQ^:'_;@|UU6UUeg*(qB!*4CQl8EEq&GJHMNK~8 q@@5OS``ph͕TDL'U'E'Y ^Vґ֑V[`Q>kk{&mٴ)_2meQmUqUqM1UaVnVn!̵(6˩rpH{/WSA_|]JtryŞ']O95) ʠ@i[|7yci^5cLfG=G^:Yiz_n1Qq5nБ(-<mm!R^l;^`]Xx]Gpt0Oi"%h~<|$\R Q4Vd5V µ wc.fSSc* _~DZT{ j>@FZuQ%9nso Ơ)ZBB1כ-µ1br/F[UKZdǤ5^t'n1$O68Ǵ%0 ^&xydOrG1euV>ڶH[ҭ1!uaxpXU5a'| ?Z ~y_?yW!'Ga/q'f[۾?-<9N,)Na')~Gk Kh]V}F n. S*Ϟg?x:@W9]9z\_hݐԝ }puue\VVV1cpC}~ t9t@F[/Y-4-"zt^t,5jd.\iӦ۷޽[,X0o޼sc*K m! : h"VR|"C-""b֬Y'O0a\ z4_ux{{9d!Z4I(opppdd$]BN6mҤIkIZRjGDsssC;V6 2nܸǏ XtK.hoShm#іP{\ӭq-NrE9΀mЅK*/@ɝ``bP 4c{Nd:bkzm"f-<RPpfV[)`8=3@{Gv/`?Y{\f |&WVUsUˎ9唝$2+6I3BQf[jԸ#E$Fjj1zZbw`GrG %TMа9 C6u-z1nyi!e\BbKVbO>3.upoZܦoipoo 8s(-d}'/򂀌Uym і8 'z#C 5|0BiD텫'}bzqDH+h~h ъǬX9c~!)ɏ^kԠ"2XE8 [R~$1KُUXUzM; 1暋1G\<8-n} t|4 0a3ũn. K4`%GL%ݰ^GjTBE[\+V7?U[LI~L#̩C5ax <dBM&OVtxwm_XU8BK.699&9v<|T D||}}9::"ʫ7mZ-f7I=ڸqfϞ=|}bccLpKJ-jiiI%IB}h\]]#""V...2dM1tSN0aZXTTرcCBBsAݑۏG+mڢ4Eg8hLDK.E3f̘MH? ~~$A~?֭1@[mGCq#ZB-@` @8S)@c!~q \p[aLlU3|Gr4L8z%L Ju|=Lc,*!r(p(`tEJ Л!&`O8Sл\O:tIoJoMQMQ;R^@ttp͉f(j23bl&MH("5EUqux e&`?/q~^S<d%0=& {4mJ=+r&oʑC ǔ[ Z9UQbVj]e]f[,̶_/V_4XT`ҚfEqZN ~ (kH+Vqf?AQ" /%*H/m_n[D̝`fUKR ^ysTTŮ,`x=+CB6$ [trvyrA%j }{k>V}~.< NjPCUޑДP_[i\cf//s.,2)i=#?xz'zgv]ʭ6f֮?9ν̎oc5wʦ,SN.=y=N,=C4a1e1-SYT>R&~m }D]ʟv! HPLQO7+'LYğ-]]; \|n_{L9[jG"1!ÊiThD'1IsX_ ,=2t`}tـZ_`c/0z _皎^5Ob OmMH'˫\02=e80$8x:'*,6#AȾ\K| m\q\~?Ӡ>iܫ_ǨrhYQK }%Aj84A5:Z#/6i'Fr \ /pU8!΅.r9=~0 uN? QSpY8t^n> JmU@:h(֧tZu[KSV;GzڍkWUƚxr˘Cf[UW=jBp„ QQQD>xyy2|psĈo:ϣFrݲ[d"1J dC1M:}=ZUttiӈVDDڐɓ'Ϛ5kunSN,f#JjD!6 1cƄiر+W\dܹsO>iҤ'%A>&jheЪbьo$h?CCC!!!艏9=;+++r;Ruʕ$@w-=ȷB=ŋ]vK@hK'@h h gtG<yբmqSu9"za5A,g%_і0C[q؃+{F)AwFnġ *-R֋,چ+HqA ?\ki(v7'jqSL9z'7%߷|!y BAÅWRM?4# %7oBv '½u_q^^{"CVs.q%.lW<U-1 N}Q2K75۞iV; s[u/皋8Şgȳty&S^4Vc^Ïz\N~Í)͕!,A#`LRؔ~QmE^i^OK 1ڂx*`L|~Eg}/G%jSJe7%V$6$IP깭ncW@k뽠AV~E[/ؤW+2llm֦E* jusYvN. ּFg5̓;6Vgv8;SKKzpqf'[Fgla]T31QgN,5rF8s/"_5_Dž3yƒ7n-CԴQyj^T*Px+sY8:/D[r28>{CV`Һ Ogҏu9 PD$lz=/Hb$$ɐL: U11Hb<Sw1r1ZQ0617MA,:H;0Z$,KLK|1"I"%UdWR,W|jњ#)'HΗ#Z3$u 'KNx$'1C_Wy5QhsCe8pa?r1\_ˉʉI #_1kܟwͻTeݲWBj8CF u)S S} u@A(\tN f@"hO.|-q݃ḳp98]:_0 cÐ?zKh-fܼbݖ>vFWQz: ՛j.3.ۼN3=.$fy×}oOhEGG;OdEBxo&uzndh 8|pWWW#ٕ!CN:qđ#GYǍ7iҤ3g9cƌ5k֬mժU˗/ FsD mg@@ &)йa4ҥKϟC1*н_1WdUJ9i^ +5'I^yhpt-/44m.Pbbb.\6h?P-pc0S1c1%/~ F* 0qB'1ߗZ\@ 29lŽ n|j P@*Qb\sp1.8uHX3onFqQA& Nƹr1Kp,\ZP@/';R<Y\mDv `Vp+_`6pN"8892V{°ga+/QpQ#Bc%GxE>E[_r^ ND8gZ)M9K!}b4g:Ynwj8VI5-TAѝ,\VjV8gZcWm^`_&&8?ݡ(Ӗ͒vU]TVwrWj+a魎w:foTkVeaieueEsvmaMav뱞UAq/֛nvKrx)6|ǔS&źeBQ~w>̷ˢ,a"mvC3翘?=-m[͟ G'֏.3w_G[B%jOgw|{`e҂Uړ>4{t-YUH1L$18MosLc`B%#I JLvc3Dx(my|h$3༹mmMǐg$'q8^^3]x$&QXi_G[$H(>Rbl5^EVZ!Z\Nŭ`Iwꁱ#U;|xaRWy ;+$oh͕w3*lm:]%~Abu+~rr3ryy.fPwJoR_BwJ+!3z>l#~Z>ә3F-:pf[]Z>ۣ{PSі+9σ[(X@)am­ ݀8@BNgE[:Ţu\0~|(oPθb!S(yel| UNoq ̀JTm?*=PK[ 9?9p̹K5 {ƎD 韕 x(g]h]j]Ě3Ήs;< 0ƹӣo.+Wo^{x o ~qvg/;(8Ɋ#@w\<6lPrŝOV?Zg{=}UC[-Yml:x!yas!+Bfܫ4Wm 5ʗ&U/phK<tj{FuqMqsTV/sASIϽ$G٣NMMXWLx=-z[f[n+:Is[0ў$bm*4g,lOP$;KK k}W{PNj&j6/鴾)pURk4Z5;=^Q{r*m^nCޮ^k\mZP5.=٪IEZQvAv푅۬KYftx~vݎu|rK,sY\=pa~G|"=:v*̯rⳕڴLy"h^8k*|U9jY/j,8eZ|qѩyƳy ^G[?hK|N*$:-`mX>_WT'a.zh6H<$Qȷ1 3D)selpG mHX̅ci l'b/1鄄cD`~,@{f):S$ k#N_[|Gpc JnXFl-% n~+@&PJ#-ijS6"VjK 1)b%#zB%X ^pO!5UDk1w)Z+V-ZWf\;0k鯜Asrruy<˗IVnzE^S*7A'|8bz| 1՞yNeêU+X MQY2#@v-rNfEuN+jBhY ] }Q0.{ F]/ pRL ,Vh&lg5:YA݌JoӫH6 -9}_zj/g|Ⴍk/v\_Y~ooDChiR4i"0ɢ-lmmV\\-t9>5L!Y #d$dhh)S-[6mڴ!ɆOJ:G;w!fF=ARqÆ h{@K6{njNxxxKEIϟG31#b ֛+ >  բ\p)u@ qIɢk@YpysqMʯ3C arЃh_*0S0k9EـX ЋP;:`i㥳eϪ9ZsIE*!g~vs.:Ӏ]  d7zo)trjL3ӭ7{i~^Y̶v'; Gf}uUFmu&VU *RU3$۪QD/M OWՔSk*gHhHqssMu s z*0{bgDN eπ};rtr]-AǩNliE5mPk頖f GO1nkhiݨ־\}mc鰞eKMMT5O5htUt((tUuS&9 5M۴w0Tœ>>ivMU?S(Til)鵪j0L a%0>84 gf3jF$m677q'.|󞨝c6MoE)/|ӿ/h_F`: V] K1?i{_̷q6z5fmDiŽX|r,A~Y[Ve.c:`/!)p@L&}e$3>86Licb.:$nyW獑THOzc^dLЖlFm[C-9s-b#YFZ;̓IjKn3DRo1LwK`-J^'Z$ʱU]ٗH2[?ri rr]y6I/M/K;ON`Xks&^?kk/:'r&:itv[YZhT Ԫ毠ZBbh ])p02#|!t@jZP )y) HD.'gӮqaHASUmPGY>>%Qj˼.>񂃉kwܰkD^sԵ?[ ڼ1czxx%m...҄DٌBimAԤJlllP SI#Ύ0Y$jƌG1 hKO^i#NYiӦ]vm߾].uBm 2vXaaaw`ȑU>>>~~~@@Ln;&& |hm 64bbY$ q^kZ? øT px@#c^7shKtΤI ҟMnr;([,Z ˁp{y |?g<ݼ<0ZI䑒YGfQU;o6opE?_}~~uG*Mg{MBEiEnLQiEi~* m6{̰*~nuvkYmqǥx&{?R){!Z g9~F¢.͠JKڐ[#2xVb |eQdVᕖ镘r' }ceI A/1iũ62~߸BM2J=rT T*,S]ꖑ噚)A[5tjOb[WՔT[B`ʵ &:%Ңr*ʰ:>b٧3-"hО [OybOD-.)JGħuKt2]cUkD Qh&Үܧ2]6%m:)n{՝lmnSxUͧܳkj Zj+ rz:u(jbt-6VkWBL[@+j촨,PO:$ Y kU&T[x3@mTLgunY+g_JЫ:mK ?61֩AxzhkaƁL?[huu/D[J 5lYA' zG+uޚ*\ݑ#ӘVFIA[:l>I: -Yd4NG 1U,s#1MZ?/7%mh=La Lb0?fD!ZJE_U$1_2^)Zs\K1>Z'AY~mv(i.ᡢ$;90PrҵM=+otKm"޷ْCzHYdܶ̕>/~N\׼GR8X͔W`JJժJ\ *|+aViݦ#MϵLQgU jQ4!\Z!:G=Ӡ$@tת-P=P jihLV%4ECBt ݂QapI8 Ma[9;Zx-V{X^Vf\6\Cm/ٳ2i|cq9{H<[RqHEHlɹ#"oHިHBݤt66mZlllDD)ꊮ%]K+^еh ćJ%T%ho-%dF!}c#GDcyݻwٳFZ<(^D~$騨QE~~~[pp0HZ@hbc1߽yyy?[iWOLmp }n  ʀf029uL([ +1Q@ykk7x[RxSyfq-5Gn˪pv5r-!]ҒPךZV,NfH}@4cd~c1sh+CJR!BS,jukr_J*C)JWW+9TVÝiB_T\*w>)>T# .<{Acfk-x?xxZ'9޹Xn"mWL\WJm:ʆ!yPZomX!k[vZd,]6E[ժ6Tm5ߢ[f]QDi*sjh~ݐVf;+/]G߭ ڵ3oפ(JlM* z)jŎAZVlV լQFszVu1a^c]Be-Q W^sVaNӡi{?Y1ˡ77%fDc%ֽQ!2hӤ0 GQLWb<* ֶȽ؞K/ڊr$ 2ZkId!6 '4-YXidk"I.$!Zk1g#Z.Ȟ+')skFD͖+V`*fNTNM}kg]ɰKt|gOn2ѩOت A*hR"GHd5:мQP b" B/T*4T%AM4l A> 0" ;^8uCt t9L bt-6$;`mwb9e/_=іzy9 ER"i{XZZ:99 5#Y);5|pK~qI)';/$88d #-pJ~S%Hd"v[ҞE[V0zQF3-8t$'/|bQhm 577y㟊ހ Sp|?{5@(B x> 1@L S&M(;  J,KEd1rdsg.c-.*e~3#EbJ0ttÖ umvt;T=56nVoPg.*^RhWY/G۟ػfO]ۨ-BmJͱ/m,ע[/mP<,jW˿._~0.,kXy9UUZ!rks3 3ݳݳj;*9QQT 5m5O8?Y!e5 tf +&l|вhXqmqma}+ʨȨ{kͦs4=x^hjiSC[/;ov>WҴ Ҫ֋<6/n8y#1o}_(V:(#CjsTRjܩ(kr:Nt|Mu~T[;*׫7wj۽T+SzTܨSfSf jRQ?$'^gHboH;ώiȡ,*sc5{fQqUau{j sjwhwn*4<<Ī&GBE\{ ;zv$Ru5_0j(h}V=m"<-OhcVbء] E[Z<Ȫw/ }L9~o/BrysydF<9"j3C@\QEi1IFh_T~[-,_'ؼMj6keEG/X_EV$&ZK@ &bxNf;c+]DI|%yvnDF1 4*I@j$n ل\XO%uy=.ߎΣ-hNHtI IT&HDn[K'فx1K>-rur}9TX%.f)1 wb$[ rr3B QK[<{d[YyOzm f AO鬗:bj q"m@7ϡ+$ARh%fuа=i,-cb/TP "ۡF 4.6h6ùh (m QtB5(XN-5]~M3MH>r[Oq\\7B[oXhH:TIE̦d3HMBSos*)qB{zzzxx1'''۬\١ݎ {j+tk]m988yF[R1ьRlD&M$̊l,'4 }>KЁkFIlٲ?nozH_}b 566v@hhkm 482{a  1x&s\UH/WK(z4}92F{78$a{3\o9l< ɀZ2O9 .9 N;>*;ko̫75DB*ӧ@7׼0.5n{N|///fT>g5m2 4P54kljl -'s/Nۤ66i C}%\իO.zO)Sϵw튖ٵ/Uؠ*̲ܟa*뼝y)0BkfkfWo*`.:MҜa3r/,RXlYLshrH.W`u<~e鮩ml;X#m-1_s[.E[Al2#sQ\·鹧ԒMi79$6<.yQQbCs7,9ܴDPTkyVj ~Hؽw4ilTf"{Xa}N[i^"֮W_mTzF߂˝gyY>"{f6n,=q/hrnhjɬ_ ޴EͰ\͑;v.SUWV+ׯoPgrm"%1cǂ. {.xK޶Tʁg^$=nRz=O]\k~B-g|L&Z}&ZTP'G! ӡy;J^m.>%Kɦy]&A[xm3.̠aFb~stGqfq:vHZ(bMc6N"b-)Z!+s!CW؃~cVݩDoSmߤVJe4o٩fH|CN̗ɱ}% LboREYN'Bפ#?iۼ{;1\UĘi5zua%kZ.Rl]$σNs"I\V-I=4 hG$5[V &9DE 8ew% RF ע )r<-> 7lX8u'2 ݗSEyk6ry# V$;~ z3@W@(xs1#5$ԥTWVfv\oӈy갟7$JF[#qDB4yؚs%<@] CB(^ φQR#lHeJfV6}rpmci\+l uK.-  !FG\3$]HS]bccsrrG[#i$H,!!u'FDD`F#͚5k4vv䳤 ;"$v )))ϮZȂDrb$")#5"6{Nxdݵ#_GCK0vraTWe-r-EpFgxYGN(S ڋPDlI!V,cQhm+HhZ7Y% ܃rkDɏY^.~ v:;P^yszecP悉憩ڦ?#) kd52^kcMd ץ*3d_S(VM/U4;A]2YyɂEjTtS?0Êe/4,ohKIEQ,n3GsS˴4udUHIlnZ58"z8!SVO։MsBR)>e}BMEF[h |-3Kk`W`ү y$1ۏ ;fʧ)w1 WP,6@$qh6LF@VAuFI!d`AJNݖg(@=//u2"5N#n}e(@гH^2D<#(foj!(@3=KbGDn%n%tV J7[c6M+AԫILz EL ~GHŎ1#ïa}YH CP'rL]߅oY8E<`jwA[OU[gֳ: jY (,sss'NAʷbbbHîCZ?0%%%+Jc=aaa₅5+,,qq"ܱ-9Or矟)i5r.UqqqϢ 7hlt0"ȓ%Ms-Fm#ڳg_8w15c1}eyE[O3(DPQuF՝pOYp P. p N!^{'!oka;@O^ h'""'rϲ_S*/TOQ]24`!nAQv=Zq~^꺤I2MQMUQ5dAI-\g+8aK :B,ӊ; ; 9 *s&#ȿ6x  %azKw(v3@E5GҢ^ڛG^9eǓȓس.H .*\ mll g1srX=>ߟ/vs2OxbQSH`qc7yn,w33|!4XJXRmQxjxBsԴ_wh:! %v<JvjȺڕTK&_(AE6 k>xe;PbZv:@PaX5_3|7*"JԟݰO`[і)vo_K)̳N;%* lIqYOӟpBaC-SZ$"q ɵFV{> è9tG-$f*c@I,G )D億i-#k^$1" H5e*k28(b9DB|'k3QH!P8 82@z׉Bun}MzC6 $)"1ù(rQx8E9bVʓVCggChc/=<73&?/7X&7ڌ]ƺ~\Rn\XR_0[ӛs{m+:ĶHU\e#V;5.|;[-4=Zf4M$I$ɲ4lnQ#CG$*BBF]C yh E /(B^,؉b}+E=y?Vw׏6wr6}[B-~,X}U[#:qEZ[B2$F 5RUI^iiiSN?~|ff|,#[ĺcVjjjVVĉ'OL>-%% 61X ?)# Yt +1#I3Ğԑ HKjp[~_e  hѢnfC[c1chk mX󜡭0@>D;}@1B4]jU~,xs-"g5g^3Nv+(7߲o[VZw _2@),Swr r }B:J;WV'7$TTNќ71,l j ,;qe^*/vNخ6**>IDsa.3+WsSjx)l'奔Rb7Xr5 Xm>>SeԦWUQ֨ҖOHR-gW}.s ) +E;G[PM@w~lUŸ\?7EG35B[pN+*m59>mx\;G05A/w08ۏ-v욍𒍰f:]>}\L{QxN'뭪05r̼V;D1EMDU!ڂ4Q,vQp H3n݂ 9pQ Ǒ#6."wupt۽\yY3aYâˆ9EHcebv?.{N{TE& 9 `!,&*e^F:/XM;_pC?}?;q7YwOi]@_gܦXl6T9{$lTW()J} c.%{0)huB _3הbاa =m=/-ƃ7g ?s'jxLYbP[`~> $MBJR!1>uiDf\k2f,k1xj9ZA٭$L7,ZN!T D[OX*B`Y#k51B[dk(OV{4,BK>=y>#"%-,[1!Z_:%)aE!L"hwE?0@%v-!"bzU7fNL*{fZE}VSc<5-mu #=X3ՈpX*uVr 8aOO_`GgXkKtc].% jp:(VRi%SjGƅMP?mѨf4MF*NZ4 Ǟ@z@F7h ASHu]v]zEV4zmIP{:@h@;uCȲO1`_֮iw$,=Dj>`rfmu|k.G FtP# ێ,5NOOOIIILL$EO .]w6&L6?_;wի66U@#}-GFLIE3f_Sb>Avя\#Fֳ~WvٲeenE},++kΜ9ӦM12c1XmQI]'n%Z @)ʿYTQH:n/?pʹ]e {?6zaɽd-,۔tߤ껱շbb _f/K+e"x 3Dmvb檰"Z4+uEV&0:=A ܸfÙ}KRf'yd7t?drr*9镂tF['L,`;õ=C=\/mˁhMl3ML~Ɏ9t-^{ !5 .j+K^-RY)zp(eyQL^ 3 mE\'&. U]OЖDbj$k0y'hKųE-TmjQuh#Im6Id,h9T(Z*:NZFA Ox ȼ`}ha>?Y%]٫DR^)K/di+e}B.APQ.G>ϵW'+g}UtU1N'rf\G "3 GfG2EvOnw]P:\-C>L KT3d?w\׷\yS=Lq]pkzt=rӚ'%_Ak?sJ'`wº⼟_H'5A'D@ƟvauͩEVS׬;2ӃPbF[5Ee H#l6W[iǾSGJ)-0'AY@0PR (@%V5kڧ<(+ .#ԋùqn-?q"%Փˉ:Dk- | m؍D[t+8t!71^>}KT&Zwpe&ZJqb>*<<$9sf~~~^^ބ ###:thh(֘x=WRaE댮I=@ʲJjmjA3EXZpahѤI&P5`,lt\})lRuhkSQHcXb'hkE[ tlB Y(XV8r<佖KDB?POݕN-ǑU .絊`H褤 |ο8,fexSZd14y޵W3gU"s6sH;fb&>ۡ e{~!' Xc|*uG5mp $>2jb:|QÚJF67\ ^KZ-} {!˾[kmYJN3Riv?ׇ܅RROSj2A SXJJ;חԤɥHChLJ e`ntտ˧KNe7ZWX?wau"c)ͷ-j/-#| >{CH#lo:b A}3t9v# HB@@QI ҉0a~(5:Tj6J' [E$ښEH"/R5ЉaQ\+vd)L"8BQBo382U@[ FK"kxP'Kx vP^"TX&p&[ E{!ח\tvL=1 2Xe̜ V {uj1dMbYn$K,r M NbR%[2Bf[!*\[jc+1їk-:P LU 9bnipKyvՍ1m=F3ehN%-C\!mzhP8mhd#5nE3sLl.Jju⢞!d6_M;T=rnKmҦɻ+P?hP&)#5 Yll2FWb< g6#6 6TFFy)$JLLNpd@lORRŮSgֆ\1&&1XYYY=gN/bJ5OOO7o￿gϞm$dɒ#c1chk mX_>Wfh.aDl &:3P5PJZgl[wΙ:P"AqYq˶/,+ݏ|y˂zdX^}(2V4]09C|{[|ϊ`²&_4}-N,e6RKA#*,UJrNQi"e[%:߂ n\yw5aY՘\ۚLD'D ߑ C6n80͑Nsm98^zxN;i]|eqO_ϽWspq@= s#x.0rR)Z :pA4ˋ7оp]^pS_pS]P3hKQi%jGUGM}}`f4&f*Com:"?ÕwJ\ = ϼNAS6XX3<lVQP8[!pMT DƪeŐځ)QOF&_, |W[ Gl8co췝Yzz5{x3c{ (7o7ӃhEE LWfK %|=0{?yӲqvG)%𮙮8"}ݓ}=Bt+|m&8k4zʉIH!ۄip ]rCj`@)W36AɲHjFX?yƆYFF|'+r䜵ML4[֘_5'6W1W_5W3WW[]LfjL5 fZSmDEFF)`8chbik1ճ%ŪUvy8_[hJi"jZVm+RݎSpqZE-.""KrĕU[=h`+U&ѼKKuy6Ud7ԋ4P6j169b݋WЅ+F{m( j׹ݚ *Qp++Ԣ[;o/G[#B[ҭgGZdN:$,e6mzW֮]j*lnݺŋ?%*ú'%%M2{v酅s΍ǞĎl% v@i')FVp-ATT9I쩧Vc1Y b},Xf͚7>{I+v]#^G%<rrr&LC-2[v޻GmRRRf̘hѢKxC\X=ݟoӭs-h x1λpiQsF~} sqWݹ{otֹb_ ZّՕgc"ˁ~=}i;`>n*htf^n[t Z7@e'5tl}Fjd4ZEeRvvgp0'pa~O7|8h.ϗ c[hplȻ_ H6=xK4K5w`Ů-_Gfxchgj \ ?8+|%=H W \.n5,f=xm{,-AŴnJ$T*{nHg `We쑍ю_F-Hϖxv2?VƧz? =B?E ` G[@ګB))=e.H-/*.Tl;A#kз[Ц.GT,7S&hׇAzALkxbgZ$\;y]5̺ny ^eHvh(6CܯܸX]xիPR|2Akar.Q} ν+˥ z\u}m *ijw\>4tYCƔrʤ6߭1 _OrUf1'L'O;L$:h`Thw&%lWZq=qw6oWHIJ^C]MZhΘ7Q(uh [E[lYvkYS"\/h6A&*`YA|+q% œKN"\4J(B$O; ;Oa+X鏴On-#tVE 4_XOB`Xl[f]i^mTb#{V5RB {VذHXLJ^(\[^yыw']m t<6xmhp {\D]CNbn/k7(RK=s-3]1 Н2A.XJډn;@5] =}X}y'<;_:JQ~cBsLΘ+ZI+Ga ߝ>Ci`X#FSCPSwGP=t;hA+kޡoE5ua9MSư Jf(,Be-tDo/S*DRmm3\(l$ktvCLɶ"O1$׺N#BqDv L*2Z&ľgfVZ5o޼ $%%L> r2#r >k3<l4r0l؟I%''cN.91lkQjS$z,1%%%-- ؅¶g}o%ŮC~~_18v9{}޽fثp15c1X...mA? QuKmA  9J[" E_5~ S5M`عfzg ,*]_#?"?R6Fc|ld㊭Wmx`&3eY_;c:7b2IF7 &LWɷٗ,mP$%p TYx .B ]ADtuv3LnQ Ksv]9{lbԏUsԞ\$U[\:7 Ieº@ Ő{ڢj&Vjӹ#d|4JOu]5l*,vT5*і:d@ )Z/bmm>tA NxQ"mA|܍uB|k^|îܿD?lu;ZSMc 3lك]EGsE.dǛxb)V٫Kб[n}B?Pưrm i}UlP,u CVηNJV]a[׹i|\'[jЅ4hcnɦQL;4e<{`vqP++jA4xO;Id3H2Cr-#tm"n)|2)(_m gԷ[! ,ꌧ(KnZZ1AI𜢐:n e:wŽI;h [?ܶ, \5nY3"\q B 5^I0x@\AM#tV3RuW n"Yoz~EXDqmD Bb\Xl,(H-ґ~2/3֬6C[_l; w uvpSlVmn65l4n4Ui->٧Ӷƴi$cDcag;uuPHh vrB+ϏrxL7QZi'(E溳&cFf vXw|BZ뚒*[mőE]{O!<r$)zh)YW fr>~'Vn ;]PH ;x7ʍޝ?oY%|zR*O'U)rFilZj bTi'm|+UipH^G?b@d#04nk1Aw 1tetqt+G9p&]r^Bvqx4FZξ˻\Egc/ ϢKȋv]{]FoAc{AMZKt"3_Αzgl#Rq7 \ Y-{N$h\ ҄ꩺHT\\\BBI"qdgbb"3z+V,^855u n0*p8#4Jas>l(ljtSIJJ?>9m+\e'l;헬hk֬Y e׮]۷o뭧enLl ,b,o"b,-N@yOH"faYs-hAV~=h7! &}=8 k!IUadL_jqcy,AlA{;vѶ l6nx/ me>e^-lc1D<[4\ȻS *gy,NvTAe`H D r⍃ sUa'cI|n]Gf`Lps:8ڒ{p`ObKtyt]d7! ^g,iY|G[פ%-h2B+$ڪX0%A;`j4W([eQ4Ud(Lͬ726]"?x좾 5#W˧&S:_ 3]]*:MR&f{HlE͎LmC0Bpd6f}.NX|͸SK"S$t~<;_ާ% *Nò^laڵj/Q,gɼzV\gE '+9z ѵX6}D& &վpÚ3K<4SʍŰ~zAͻ#=~ &.d x^QBkNk];)-P9n8C}͂cˑz:e5Xۀ h-iq  5mt=SjZФʼ"f* nE Z D[ߢ eqǖ!k&9U<7]/|Xsp%OФD9{8 ˨W f\!|xW|b\X\=ޏ?o4sOzӄOg?Yy-vZ̓ԚԚԚڞZvJ a0KF18=}}~no^.u|RV{N4jݤ5S&oFu^ oxt#zZH*X ߮`:;AX'ф1}\?cIk6v*3ePm٩v{v]ZuJ*hq"vRDc/ڋu6)AeR[Zűk)ҍi2VG}U10<6R76CN|;K#lᒭht tշ~O1kC(N`[Ǐ10X..A\>.9.] qt5y~Bc^BAUYh\7'ЖTc'V:΂!W߃b6ܸzl_rڜmѽGŸ0"B .$iR@@ܹsgΜ9Vd)WMJJJHH WBZbNlg瀍0y]qk}tq%YH K#=bfrʗ_~y˖-{}-[݁c`{5WK̀x3f^;wn۶mOn 잙?^15b,ð}^?ɵ@]-h#O.>TMcG5I\gᐳ\l5'V,A 8BH@іf8wJ9e]wDgݺ ȼV~j;CLϢBJҚ5_dAt8h'uLJ uj-(>2hhJ±w3=4'NӿChs[*^Xf_Ez(-\Mkٰ2bjK"-w_}:n~s5@D&]/,%h B6r*%1"ubf kmtc\>f踳g;ՏC?k;Yw"oqK]{wgݤ(.~jZIݔ)%mSJSM%Jx8l(RQ'Hn:xaݬqF/A+R}pHq̚{޳FhչWiyc}kNw/>F{js53*"z*Y*WIF+Q3Û 15G e$p\(_0nF^O>߽MY&ι,rG[_~=&QMNM@ aiH4w28 Vvm52hfzM ]F(_Akpz]#UN…<{LiH. M/FA~c+z%j~~NB}~tvT`}q5EiͲ dB_c6_4]h0uW2Tn'AG|mGEU[r!c%&dnCߌrh"HD`ppԩS|5l0Y5]'j+R[Eڈ~)o/#6ɬ 6[{キjժ׏}شmM>}Ϟ=;vضm}t ӧL2o޼15c1XVVV7ڢx Kn#@JTNg6KP'Ž<ېܞt21,=mXzXТ^Xdw /W&~w) z eB[V͹DsY3~l`7X?[i>hU[8>y']x I 9-+ny/_اLj70O-ˏ<-Z5kYY+#ok{ .BOEZo#$XoXYiZbsU? _1 +|Q)G׉aWl z)vkp-d>YI-:s[v½.쯽{_oPHI +{EVƊּ"k7ޞxԃS#׮ᅓږ\r{EYs]\HE+9d%)$3k)Mp<]ńBz[9^{.";WKA#sZnƖ>~ΉU_l~o~}0gIʋ ntϼ9====b8! KLA bkTɤYW%)Mx4-&'O*~xYtP>힍o66|a[òT7Mz .BPOHEdp5xMT u\',nKzX \ٝ=vqx6 )BA}nEy-((?qĬJbg7}M6ܹs߾}۷o_v7zbvSeddE-[Zjݺu7o~jDLKKfkI "@p(?VHh7p!A@IPU]5oD:ٲ)L3ժ3wGܝ#]#FqcIId5YY6FR:iAkRI M{F76$[(@--Zxqgȹ#ĖRlMq_8G:lyŦŜ!|^!~5Xu h+p7J"Z^W#05]GjUN<߳`8ʜY2WC - Ϗu˴r9_bұ \;>ǮY z+(P0SFyQuzY>T,z,X\4k'|sV?.OSzki Ml#X^ۯOhw5j#s+q"r4С;B`KFCAd&FW'S LP*&ķ L_]p2G`7܌vzrlu[|cC5ZÎp@i7u+*Xnӫſ3@ϡOß^@7^6U@] lhQN}/)VIЃ5'i6 8V'L"XtG(zͨEc4+~$E4زx|ڒr&/ }+y OC3_ff~D?(2QS 8Nġ,;iƝMM7'~Z{rٽ(|ͮI.O_Lk0}0ү~xxx 8 xLyj㍷)[pix֑`WZ4<(k0ݚ: R61s}F[K &=VN(O[J"[+Rbè-7a>}eҭ&!u۝vo=w[ھ/y-y,pEduWUi^ނ>-}]J;fZfR:I϶8IswL+gjnQ߭:G-}!?̋ p9 .,ORAi:C2wcm~rJhlwoL|ΟwKiÀ8  = v>? [R{@8)J3V-5hLc}E7}i.Пm=.P~~_b' k_6GUW>}ĉL6m޼y-_gΜρ#qx Y(vD?B"iRzpi,z~LCqdcKIiD@\ Z&6`1,ȕusؖ|\0 LI ŵ"*{.7--{UNİB[p+82!w͵"cD"z#ipqt#xIxgэ5P:{sا?cna>Ė+Bȷ`]4ؾ[w=Yz5yp0gHgOM4ư =B_`F OM%*j;'QS|ZzN"qFZh0x.g<5]?`;`΁Oσ-JJ6Vfjzh:hLx%Vn&O3[?3z?y䔔O?Djĉx'ҪV`|n˖-[`AfffRRGppp\\7||xbu~+<֭;|]6o. HQ1tC\"bh۸! EICs_g)l*'ܑthP* =ꅼPjM/tc/>oDb땱|àԙB ,Vf2^fsM  ;J0* Zj8&`'Y}rճp__>fGaorBAu.]HEԤ[8-H MlEVUd$ @;B["bbz1N,IbR>V+4dn'҄Fk=5T7Eᗯ,%™|=h]ޡ|/pool~|][.XMBb+~\$rB,+)JJtXv2٫|+ς~K~"*q~yʰO>k֬_E1%%%++kٲe͛:u*1** C0MG[x,X mD*%$$,\p͚5}پ}-{5F4FֈF/G[%ELK7m@2Z?.߄gH:7L[;5b$ Iw@:H pkL&:P 782u[ƝK%)$q uyt?g3ħWYw4Yh'iJ'Vjf~UQ%Y_~"yEA)oCЬʹ"ez+7 Wyrkh1pqs5UPB5p ^v KDV㩵èr!%{"׻ڬWUkh־ŭG[LVn"ڨc*hUWN t[}[G[Xz;ZM(S8"g̵s &."nu,#W5[ `A2˰Pfh(=,̥%ǗB,`plc!ȝ{bSCwXR҈۩jȚr5vȖirb0j{ HFCh:z$ APNi!Tt]uC-h5hU‡)NiRG7.oY&=N mUkGt+svJ<]jjt|Ly>/ O"N&Ypt@aOqXmJ2PHۡl풷+.]Mp2׿o+Ĵi(9LZGxxߢ-@[cEz}Wg?zoXw.ڻFǣg&1>?voqgl=tkdf9< {ք9|ޯd<Ļ_WdB`cxԃ7`;[mtj5bz!?ց9utDBZш,7mHx. =.t95wjeV7\H ܽtW&Ulh^b8]&V*~٭ R9F5*𢩽Xj&L<[[1'V-0-P$hً mUH 0nL[\ '݂V]Ӭѣbn$ -Fԣ-`")YYіr|*?j/ҽyy-~Mi}Ϣ_F $"ruF](]/"n&$?5hnb8fw[qЬ]Yw >d< 7y'*-]߃"""m?mbAٔ{$Xk=˒XJJE嶂J{;A荭䕵,R\uw3+€ЖNV(X+fZ7Fo$)k%\Kc+=k]m[ [5;{eEY[ʯ4@/ ]}&3 =e"n}D/73x|6#IBW>ρJ3*VL_Yh8r9 M2]z[Z9W5;_1X^&N4^‹luzz[}h ތw7nz6uOn?o>?~8y[]7yj(jUtXk.,c7S}AFӌFPX&[HU|qG[lO@yKQp,z~ cӋ$(\3ZX/kF;]AT?݇vtᐝYdv=n i I(?_qAjA;3sxƾm.-D3^ﷁޡ\l#+0K?/Ҁ78(X|{UXRK֍2TDjreh:J F_k台yyȌ{UkQFvB{47;40ODw؈le6|%kUc RVj,(fUO!)+%IՒ:q|8V_LRi0~ʚUQuwЄrdb 6SLz@xqrQ'&tkUa͊zY\a3^_f[x~B[_|ʼn'~A[#7 W̙3׬Y/Ly?Rӧk8..nŊ;v숏YqD#_)_#џm9:: B{ *nRChM#-?@R135%${ٸތƶ&kf7Mg]m[vɏv69<|Es[%ʰNn @{E׎-r9kǂ+5XZ>h#*j-PȭZa-0ܑ!wg˜dg6مPR9^be4BȎ#w}ٱϡٸYXYs ѩyipUR tv4pP8wur:`֎s-VL|}] YITL5XW`)pb6E.|O;{vtڋZmō6:k~Օ1G7YNJ/LO"^x[jϿB|QmM~7rٕhr|x&^u=Rs[ pb~tċqN"Lf5C&'@u vlzf-'@4E]Ŗ>;QZR~\kS s[cgF'ѿ$ X;dB%\X h'i'W)qڠ.Bݠȅ!*sעaAbm ns=H~қtxV˵2.U}pΊ _.pj+8\d/W&cmX8s|_O!A ^^:9P X!cVrB5SL2#k [E^Mh}נ]G`i| k}{,M}NhDb8*@<9g>Aj+%Y)/Bnj~#wc̤V[^#W}-kAB6 6-~Z:CJzE 95Mb+́tuBhk xY:P ? `ޏY{YslK]QS:ys 69rH$W?]ܹs߿{m۶mڴ_;|||hkd?@ #U15Жu -6O2- k?'ڤI)U7II; ֌/hmNX=ş,7wYǏ?h>Ly(ҥ=,M)ԤENu=ן .ҥ"3N!;N_yZ@S{0nmvM}͒;вVm(T9qTc2)G1+G;v[8 s)WM(N|aՊJ1kC+ u3k6E[鈛w]Ÿw9/ 7bW.JɃU SݾMԈ\t[8E}h̀=P=ڢj܄kM. FJF,[ Qu=h@XchW*cUbSV L$<+ -;nm >|%6aQ].Mj"hJo̕tkF[I(U Xm0lLgHP$*&U+S~EHzу|Qg)jI^lci2Vr3^A Ѩ|l(|,N0M%.]H`7P)ݛ J]w X?6B9J΄F(z@΅ b{4ot3x1ssؖ%X}$WH=y茻2KʼQ]arph;ֲ7):ɧb'qa\ENjsBqk83ZM\$:mr&1q5Z,T!JMWt 5G$S_:jN R0.pߣM Rqqq ָ}3ld㧧{XĒ8 j\nm`6^WK.֥2KɕPr-ТԆj4}zM[͔'څWOAClѝw]2483 ucO@uaPD xH4tu1~ȇ !4V K!2``QX55c}b O訏 A V AL-Hx <Y"8q @,j5< v_k^Y5`|2U\Xlk9&s'. @@%wfz(T$AI={={i} WO`I"S EЧf<Q@x`7!`2RZ(35b@:c2FbL0 )Jf|hecP^gK`{ f-=&mDQaO(dIڬecWMFQC1{|^#׍.ϑsJ\&̗`>ڄvUXܗ#q,!1ʕ:^] IX ZDՂh:|@^ $ϋV\yС Wmk׮կ7/̙3ٳo>ح-[n{ȌahDKKxD#sF*h U[lb~4+~{"o3hҤis/SiޝMN%2qx8/Y\# VgyreNmIYf|u?e@xfD??^ UkcԾJFiܮ n҄,?YSK{L)Ru2O3i,S2|]Melcآ /U&תcDV-.w9/^WV*I$$ZW5ZWhL h: "DeE/W\lmb PMZ;ND"[^ȶ%KCg`Cl&X]%ş1ufY ̝tH4:).ue'#7Ѭi#׆x39O }IW,}֯G||o6ef~r\Ծ6oٹ/' bѡ\]HP+QUpzYO -pd'24`>ط/>B_B7|~|*ޣ-.\0"?vNBZ@d݀I&T@)eФZ]B.E;u`JLj&X?2#ulRĵ劝~GiQ Ŀԇ`e1w8\Z MocٟFQL*I3^{`rg.>ß;~>Jd ᥨ<`A6X~Wxra'=,U <; hghm} < v6Ǐ Njb:4}j_U(0Chr@~n&ʱ$ZmpDԀ ]P!f©56ux2%sÓg`Q]? H& QiK5=ILbILL/&1 v숨" 0tf鳧ٳqO~s=>g͞=w :{[e$dG@| W[`?CɃvhkʕo}? xn ,x K'57""";;ccc'0a6&քMؿm>hgPggRP^9]M9Qqҿ&m)bm;R>=a +)wHQ3ӋЉ(1ُqP9eg뽮2z, +1wrBR2*Ch^}xҡՓѦ^9SȎ10({l(mjl虎)klP~d_Er?Jc_8B𗡭wye/F ׸K| 񝺔fmf&E3SҧP:`\ WKN6.7GDlL,w\K*=qok& UED ZbgL1$uaEH*,W64ŕBJJQ8v蘭5 bdNL*R[ba9IAr;HkM`0X3x8x}kӭpn囷~~5AE̘_(K,u!V#6oVdVDh+ Ͼb%x9K%rxn 1w0:+Pgܶ8+h5aY"v ,(qæ~cGثk!2:l|qxu~~E1dU&uA&QS҆463{ ƿH!TK`Y%n,<[uBa|ߘ}eyӒ C|9y^]5?7løsP^3nEtw*#SZ. K%o@C h], tO7vޝ&BB8l-@@3Qߣu=s)y&6RXO=XVd&5m藯+<|GWRfVΤ1d/>X( CFJ~dC}EYe7#h+==O;J8Ph{|:B%"y5~,UȈ2bP#M%1#$' JIv1mVeԖ6ǖ7C_+ 7,%N"sZO+"x0@Fê!EԠ4&F+"GUv́czw;izL#w~lfA)s""`A `MEB$ָ^+~{W7~Ab~$)yIq7U)qVIr^'ӉtB;NǶ1tv1a3]-ƹT<_@UX~"֯`O`ˏ`lW`OkK'3`-<} ~zPp,/ pkŰk 5'YW*vWg,[S8c2ΚL'Iw|J[m*ȳm Zs{51L׍zgL7Sb7&'.zOT3QS/lnZL$jvLCuΓA~·|Nx{lb a;@*Ṇ$äن_f|Jy-6`a}ɏfAÙq4\G: Xp HljYMxf=׈e~ut&|&sg,lWGF5CXD趩@qC;1T<+j\oDtt|&*e3Q^$lÒ9 eefy*uC|Dk h>ӌĴȢ~zwɻK4D-^j)Ym/łp2~+S2~;Nz)O:7ֿEc<e BϻJ*;!?rxYo ΃PA̿mMH_^cǎU^L˝ԚYrUJ}@0dx,Һ6"7 r\_Ku'xD4^YpIó/Q{^Wݲ,lQ"2;"sY$/7!\Y [ aCP() %yưY3Q?Kr-a|Nl9Z[{@8Dx2d%H (&g|{ >:j~ڛY1|պE!pQtRUJ+UU*:^F[䷏R^j3 p{ۧbX>ߚ l fH3B{IƲoΠkO䉀 =V\K@->-XJ9~APAcLim ت,[Re)x v[WAtɵg;>hO}8wy(,,ܵkݻI+s_rYqYXJ)rԎz"ҰU$qlg)38"ҁ-9sbeВ+XE)j"Q44lL&4z0Uƒ͟lrHz%2䦦XbvQi"⻱A2+]q /9GWOk+5Ă* k7*:^~5Y$ں`Y 9@iPBks9]xWfglօ'],jgVIՇ$Hl~K"Imï;"v_DK`UX_T"ɒh}˿YMs!O#bi*NDB1`1H[ YxnՋEĵUSܑ,b;,MHL1L ThZCʋpHA-יsMD}@d7sn9Tl^7zAB+~_ҊC.j7,%Cj]A-͑w7K$`En]6/C|\dN„6"V9d' UX5$ZLųA%|if^(bh[tUZ9wNKÉ\DF/:)}YqDBjյxa)N!|vyjÂ*s+O7r~P8.ђXIxڙ6m*;R;aC,H殡D=ehDmM߿lW}IɝAJNiRe7KpA8r`î%9]-`. z:mwgYD[2 y-zwܹk׮={<\OkRPPPtttrrɖ-[6 @[gq.h+11 {WW2^*Zp=_sHԚL9 "b;`uH9N:UTW7/qD^Cy+ontPL6;CKP{9Nqz (9 i ٢ 0P86Ď`GNl^<~ [JUKmŠ.ˠ=xJE4*tI3eJECJsm fKF莥Ѕ$64$=`1/8 ;>"Qt/j DNVz ,4. @2 !"Oֆsb@2X}>JFg<7L:TpżJ]V/ x~-#m4حW!N=^GDj.[e7T"khuxlՉ4{w GѤMԈ6(J(m0yPUѹx Om#RMHܰ4`\R;4<VsQ3.qf3@9@dti 'ox:v+ys/e{8qGk2Buf )CE?_-.ΕǏ]9Ce$NAF.>7iMt;giu=vYaANae$^R-l6gLq\c bp2?nf,vZ^ 5FVRU\Gd wRv:K݅>\n CFWD㻰.bv0E3MbPk9dRq2%G_(Co/k:eap.Ǧ 3ID$b:l@  Q fYі˾w7OH$і5̼.2&cB$Z){2c3 @iF{y K?k: xkXo #ȇj%2:xa<^M&K|~ Nâ>knFR*ȃ'k@q5(=#[zuݾ[hB[_'xnO6gΜ?2M؄M؄M h+%%y$ڂѷ c^S>[{O/Ɂܫ\`&$' u=}Z˨7gIWzqjՑ|fd!EuaiW 7s>Lf$_%Au~K_xϴs0k*ؚD) d!}X)T2̉ [ [A⭗-1,KZhǘ W;à.aHEEBY^ChkdFa4m53Y!w1 0-$W 湃(<fpC.ewշLEtSDЁX J.ip,_BdpgH[9Dt#Eׄ L]DމSfF<DdH4n*,ĭ4F)4]DR'1˜T)9 M-J#Ȯ+.N+|^31ɒUQ;Da# G]D2ĵ0MADjH R, ˼21; b%,aZV_{>K|9aD6 fZi]![Py?-7pڑ1\"ոA=XYNwԨJNJ3śb;MVuמzˆSkO3fȚ\:ط)O=G?ǖ__\Q7 V3鵢hIu/)nݞtm?~dRޱBC kc޼yW#Ql}qNJ/^;{WǷƧySIbwԵiuv晆heeC\|''kNʗ7.^zi9|our)YFs 2oqt4x`4b-3^~~Mm~ } T:jHE>cTi!ԟV1Gؑ)~M׉&uDGlf( Pg\?xА22ء| R;^,a@MG:L5bߤMT 7jz">~°Y-I'^biTpVB nRwF0:xF;a I Gh`*T$MjN4˪v ]mkHΦKjM-u}Tg3%j߫|KXG ZP?鑝ڊڿxKۖ}Qv4;[S0Ixds2:oM&j'Yc~~15NSpi6:yUG- s l4Xkg @m`6 0 X> ـ.djm&[Epȇ Uif̾fRZ X|dM x dP A296X@"YpU'H`0'ctKS}3գbucwfGH]O3j޹m=XR@↰aK$ cYB8 %k d h[/~z|} |>x8xkGWҰMk5ikT+4M7wOhSɀe9rǭ^YpAt!2,s7` X.|v=^`h_#X9fy|;, 1 luLnO5Bh3ݶˣ]=i~~~NNׄG[111ZgI Mښ@[6aRDf}LxuujP/R8q1l/9e|H6RNp*3HȲ֙|QMAΆѝW_\xuny)M7ɢݔgPtאRm06yQ%L={ +/$uIh>6mP쁈1{ј*;]dtvH"qH5BnY"M5t(z{Tii#pѸN0S)zhҌ^i°4bT>D3a,V(;{|[ ޡK3t|4" UKh.$$ 1x\o&¹^j#mN6GF}(>cLTGInUluDޣKibGad/R _^o'kZ9秉+ :H0EtIw\ĜV,0ԝYe<^٠ nC5bZ148L4MwhK<>U֨-2T'H B#cnA0 @osAfs'gUk`X~Vk# 75"ж[VL AqGmRLJ"x&b^ > iN1&1úQ]8S6s <4o}&_9X".š+69!pSXull:Ueh$Ddngu,}Ltlx 8rAZ5;t燖| ˁ6B/]Ŗ6,hT0>O6uQ1l{wql:&BOҋgq׍$7hrt ~4n;i\ap[sѲ(%g#BG= һd7G`%` ]Wk.j^RaiQ^M2o9lYV7dy(XԟWMpWn_w𥢭Fh?֑/]>ěmgddS %q.M؄="4a@[8A[y rc[)Y9;9_ͥ~g77SVSfɀ(~0jJ$Oo#Ϩ)5BywԱzm/"<@k8/Qj.vϢ6^tϻ ?-$R޴ޱLIA~Ṻ)+H.ԗE[(~mCkrmDt~TtLrgSRࠗm(Vg`IzƴJSNuS(/dHw@XN2XIMXk$9 1m e$Y}<0h8&\eW >oSs=1wE=>K/iL%d}UQFmN~etU*Sy5VZc)ϯ Dl'|t,ړ]㹯yB8@yT (Ψ7@=R*GSd],D[U놲* 2JnZLBWEkbs>}t +-|^)լ|JvP!}6[ߢIiD,=D 1#Б*-m-{Oh6GWJZl&jleW)̡|~lˏV1SI81AGS>\q_ Gm MvbOTmT]5-“U-x}Irb/drA&Rr_'H`s w,kM,Wz&kz&a= ֠8 ~2b 1z`N2?=ḏHH=rwM(U2P1#h.lv+AF"QdY @=s}}Vj.v^Z3{8yp89:6/P ;t[>a:yid Oix]_+=v_Vm*cߨiFG1šcK!s(82V䨃ݚVMF&A`ȥ/g]":Ӎ'1 K a^ 6b-Tm^~~јsߜjS/85lGϽ|Z݃-ݻ>['q>3X EDDdgg/_1Mښ@[6at'my>ws~,yӡ-$yyڪ)5wl3*.T 5 )ȋ+ſW1~WFPn.{[-^Oy; Y%bBurcUs:P HUʄ|lbYbu113셋tA 9Ǧ<#B7GmxZ.!Y{~!%p)UY?10TEԱ$BZĩ mh%ɬSrБ;_*8[1TSN!]!:ԞJئvcj!a!!!]P-z.cD3h.38tS&amx. UŷM*闈_$sLLsH.TFTn:Z\4u{x=[ w0R;X>e4NSz19ITKHA%[Pl`GijLǟdڭY7m>U>w":莱`CjU$ɜ>띠}BRvy|ӏzzO@Cqt!MO)ֵ$0NUO[ڊy~t̅x"oCXQaXL?'JY1ìQV8aqALA$bH=3$:"£G-l,x/4MbCabb)1{ծ*ùl3LHe7M pgysEp9ZVH_o.X 2\Lu(V[wc/D7_.C dsFD|ouXjZ|63@(PL tAAbXmYڍ8!i%y R茈TGlFDjO6pDo0Ÿ6׃xTxEVkXZqN.E5"$Q46Fc1a|UONFFX6᜛ҒU׿6ve9a8x{D[6P7M%]}uV2[Z7c>נ-wkOڐ`O8v&M؄ ,;;F[V}@YV} 68gI'>q*yx?dW$Q5G)y[5!q>}D,Xw^[\#c:qWHlij1G|Ψnbr9&#׈O_'>51͡ݺmuWNRMDx *3l 0F:@DS`%/-1\%v~ v} (=Db7|',hQ9O|fVs(͑Z^g8ӥW5Ѹlӯb{1'EO"KՎVIJ;S~wC{ǐ1)Ύ :Y 50ΘG*gEN?QCDZ],+ׄ)#嗱*x#cIjP2GKFu~7m(oP+ltJO|zTeh+*止=vo/ͣv3|G4T;$-aj(GD b(,kC!zЉ(2875;:0[ey(ߚa2vW\UlG݀aݛn٘:_X,_u.0ۊq@ui·T 'N 2Z\rf_5(V 6}v}^淦OuMy1T.Bjk!e aXIpqL8<A},MW+"9 ᘏq0loJ{6L1bH$ $Q6bl .۲-۲=%Y]>Ҵ1,}y3cϹ~7 vdV$Sy5Cn,^yf zv<ٔ}ې_+w]tE-"'Ix>:#0::<,Ⱦ"]>`$ ^<?[odh+66?kfBf5+ڲ-Yhf>:?0lK7ŖI|Y68E"u7q|U1ގ?EJ_G[-28֐87`QBNV.ܐށvcQMhL1jKiٟ#2:'b躋c3UmNWg_2/BēxZ44#)ܯɋ/M,,Zxx gUĬf*La\2k%NaAW頳Wo(m}IթM ՏDɹ>O9mJ}!}KĢ^*1 B/; GW~:e^[nLH|T]$9!'-ȐF"^uԩOFtrF$0tdoYcQab>ч3jgӕPg_= C!Ժ&:>AJ(o5嬠<jzNU҈4> XX]&s2;61uBN6ܣ`eDPE%r-K蹕V*C&1<,:53sme2 ;b6Dr_hȬe.9'_v]V+!Eg|ZźUXu&C%n7Z#˯ gtqMt٧,WDQ{,wԸj<^yuZ6lxZ{]4ˣk0W= ⊣/_ϲ\yBOSjM{ulg>=uWcMMq=_g= h_X1`-Ǐb]{3xªT2b6`1$YVjsؚY7.%UhU4-hf;֭Nh\c)GDRac ":C2"ꯢiD P&P"QzhvxmZս.  #@LJCˊ '/݇] cQ3}̼k?^eucrb9#զQCX+4cuZd ,bXՈȠ-X cNI#@وck5sm)BO& {ΆQ]&Sny%{ fKgvofkH&B!:Jj!3Uxѯ%eghgO 30/qL'ɸjYnI.R{\3DډF:Rd"}P+MQ)äfN&q\:MӪTj7H0dt 0u;$jzSWҬfYWoi#a_C[k֬-Yj SjVXvv ڂ::{jC&v?$O~ݣ_)ᢡ}]vJ4WDӎ E7zgK"V:ұsxƀ s+؜m*IӚcغ%7&fklu=0 2V\IR5Fs81|sr|R1Y jc(h$2;Q,jGDTMeVGMJ+;1 6hK,jR}:_8PFK\qDgQ8(E4Lܜ(ȩWQdjb o*G7k -ᄒ.Ÿo lfՙ .KI86|L"{Iޣ 崇B;TfiF&M:+Y?:('V%e#Pkɬ:]DHO8W`a*.@Iñae<]z,c k3Ҁ滁Gt "H!w7mJoMjrQJ}&F!,({=?>3=fqV~ESɯ :%lQlEz-lL9դfZ65ez߭K{UmcB[~/%M~/ؙ2o4g|n*YxU=R7R[ŏ>·' ME5:(:<^g[CI'?򰹻#oWem;~GwoɊ#Vvgcdl7BdW̋.֜hZvŴ躩wǜՁI0%8,[ Oat ͥcN7Q:T8 F{]-Z[PiCL6i9Na7鄷3vn92Z0Ӳ3aY zPp,; x|{|3'WwA*Z@v!TΣ- $x-@'o,mՀX4j:l@ 6`P1Ѵ{y;ļrPzÚ41:DN{i3eQ-]Tx.@@(tLx,? Lm*J5s}x>pco8ik\lJkSM9Mxv2 B~A{~"A[l,' F5މ ?2 OrmuIN`kډ1Pq"OīHхtE}5 cOK"-Q&hA*r!uQ;tSjAQ& ( \9t| 5&=.D/.a.1hJNBOJyPa7ͳɝdllQ8+ϸAͽʈTԣ=>_-QFyZr :Itd8pKǷt0b\I "lg+et8w0imZL=U ҡH(815;qgxruu\~9̧׾짺gCmA^g5kjfYybi9:VrZu^u^SICAW«DtŶH3Ic9_c\|+H-F4 ^M!+0ٍ=Ŭ}6#vUfa}m e<}mkAm.W:͞wqg'.qzdze3Fyx9 55UOj&XOTz;6{,'[ b%_}zj-eNIaq|I|կԂz,Hg0_fl6}#BUmkgUgĖ$m^ Cь7 T6TDA _mZ']&#1$|q0$pՑF]N9M"tէфΣEtz^DxgR3惨_ @RҚgԛP .FbpR^RIͯ5,窣qC ;|s.JƟW \7NM98DgY- cD@91BԢWE;Lq?N#c'H 歖:aʩ*+OmHb3tIPmY4Eo7rk_'XP~E <-x(-bNQN-r SQp@Gwȼ C rn5"2hJP\DF4xXS~xnw2(]/ىY_WKdU&W^.AlcE6To6kV*}Aӂw^Y~=L<2LSn8>߆VdWw_@[N;g}v럮'ұx:(ۿ#` 06ҹdH2E1ZwQqaPzNjoauTN0'j$!Cd=TMmS}Q!v̹jY9[z ,14lX erA.< ->1} >x$XX fIb0vk`>̊;+&:0 VY,yĦk↕qtu5 kyNQ7dG( GanUr&¨y%I˪Բj|n)cHՅ^=bRO5z'5f*)#$g öCWb*vZ^i^P٢U$H_5" ":eo+ ʌ+=D=# jk[T~#@5y|(aBYf(U$\BS`Vwk2 S Y$79$E0D3j'1;Wa@Nh rd [=G b}4C*hgWv)/yO^ٴ޾~ppprrrvvٳ-Z|ߕ|ŊEV'?4֦M]mO!Y`III֟pϰܡߴZ ,* #_WCg]~qU ^inp^?gމ9u7hq m䦊Z|Oڵ1n@&<]zX =*yF!jQb;)֛ثG[NJ5!*yX]C[CDh/D,jOjGS%xR6x:.g0h$OGsL1hKAA3 Qt ׉9VSP MT(*1zכ4yu:s!B"JnRlۄf#jʷ9teza9zbƧHiq"sX}X´^'z"dh>`^4fo0a>BµN:2ǃx Rxt8Dalrf),6%xH_w$>{w%ꫯ %&&fee.\pŊ+yQQQZZa>** Q+))P)[VլhjV{`Y{k˂!7Hdހú> .pQt+xm!nPGg/W+5diQaC ۇOa[;ʈeDNWG\ŠuX~ɸ 6">ڒ"Է Ǣ`RVt!A[TA U s-> ںj:͉cdv^Bo aaU ړԺқ,ܫrjI 0p!SWEi*4 ~bTUmIYЙ?:$q|1tT3K[fJPadpcd?fxig9|:i;A Bt.GwebuéwP]TFu)#T)z1j1rI jqV7V3rL\:W]wTǰ`%LO*_r2 bw#6hTv?6ozGJmU2362   k9oy+x X BҿO}I5ToۈGӇ{e݁HV(gAjp7B5.G4#2SӠ/kO7o;nX.F,*l%5 U?GߴA6W6&{%֌wn8aj6e3zpNr:L'ㆉK }2KQ:N? gPNzz'5&$wS;LXjaz:O?8=̏r=bp03k@ӇrD,dׄOy07sUݙ KIo [=A0&@ юsK'W\xNhkJ_>m%$$ddd̜9s˗/_~jfqo7,222$$Vڿ )d5,&&O>]b,f=es̋A[.TEaW:4[2{tȒKXq%V(hsDG܇zjސe!CUƂr[LB3~AraAh_E4'2hk3+W pFC ]vR{:A[oQt,D>A[7ܼNTP+*`V>jLE7Y:a^r)Vz"6 tUZţDRXߍ$u &QuӜ|f/UuNsT:kM-;S䄧0OIϾL/%5ta(&|nS:Uĥc-k @8o:J<FT*fܦD1jE#SԚ32z%?-g_`Z +GE (`g/߀߁ǎͰ&bWB.*C$rͱCƨeK!pAϐ9eם6lG#b' ꖰU%iCQaoC=7̳5tbGTzHl;lx?mq0rD!vX1 Յ "`>s<O#D5LD D('Ȑ*|c;K;Hc5XhmY4ȻC5Z4]~Apx_Glqt1s,ŲqXXX t ڒQ^2KJ{[d)d"/وK)\M7ftmӟz] >z뭃#ڊKKK+((7o޲e֮]m۶z_{-YjV-YYddmAbJg-^EbvMKپLlSק>rk%]fGK s/9[hnԧAn4he-ɭ0W"O6uU[ͿF=V /i]ËjL]BIWY Gz-T"G=mDdE ̠y7E c17혣ΠC j@`do,D~"o)o ̡xT0yM'oa7_OV_Q+d wPqD\DTEHMp˗)=`{qa8=9Japbf*mSy7KKFGä:$"Q7&0cip .{*F\CF_%7DQnq='&Ze&kل.ndEG28Fo:6ЖզY~].Jsc Ltm E ziBdOgv,)zc0EׅslLQ{5K&sYG$++4 ~L^tس;>EJ߹5߅233كA[Ӧ}wAw{`Yw"Ĩ#H 9 |=sx6Nrz.' CJe:[}Ӌom4W Xt?;̪3`&xF.iPKF|}.X4!};fkNU3vzP: VܮbgH.c ~(x&}ŌGV x+`;f+Y /3``lA-o\_]0Cf,^*KyQcؘ!A[mtrSI#;&v}Mz KiXQrMiln cp8Zc찃^2t㎨UTіd 6z 3Fw{>s)E`ᣦ1s,xR[FX "שbļzmA4Ov( l{mC ;Xn m f٭J↩>,|7'x(h \\']Gͧ?ڴpSѦI<#߷޻w?9;xԼ%KYf֭vڳg m]@YjdSjVXXX؟>\j:k1FV@lz=LSԭa]]P~,KYv]wnO(N(lez&ćvA?CWn>{Nu5PX>b 1w !FaG!2{ʼA3u8"v]{|)~obO4NѵO3LejtY#p;}5W4YN?Qn'\wy[i8 xTD5Hl!RLQ\2f|*!M͸N]&OӫӏQ+˥f(%Ʃф&MJ4 VC)zx،L 9hy6{C? 뛪0 DB+@m͇j)d"o Q܌viR-HzlSd39U>RK. 5Qc`­O.E;az@O  ~j̾&rɏoNf#_2)t7) Sz$˖t|?7DE!T >J]K8a4B(a#nQn2kcr1,l;`=vJ]U6IrވV?M3Q9tc*zU?2OlQdb3oXF (&ŔЭhKA{(vCunQou0aW8ƅ!o/m>k䄭[2h룏>-ڊ&K,Y|ի7lY:q.J/MUPꉼ[@]r*Vi(a,:nU ?L?vOSRnJ.eY8M'5KY̥U7兵NrW6r. eH..a3ngON7Mgv|pt+|FP7)!tIjz[s}){hKwpj-7JWxz [,bm/_cLmpX_&3J}uҔ*a9ZT\|XM.`Eu:i>[\p2p};+==0dvϥU׎]"~G=.s]}cgJd[FDah_橩uƮL>lh'm $5TKJ``E2(W5CگC\=vtCTd3bML3(Ȁ0`X %xC ċ8+CK.vrj0`ݎ?MY Vr:(kcLpz-8:g7~x/`em;b@ %: ̀,+a[O^}}?&ߌdsN_m;lw|FLPctN$BF} ~IDR.ž'C$> ǧ`4n-WnrSBXl:BiLz|اUvq9(?#XΠK*CQ2%üfOX%9݂ oGwNwEU|k^~wz珅/:cJϿ۶mN6QQQ111}HHHXX<tҝ;wnذa233W^W;,77MVլhˊfM6ζ2 J4mA=tmK49&46߆E _a/@]lІAmҩΩz)I1pJI:{Y[n%ĶOQOvVs5\;(.ڃE2h{b3cĺ،zywI86,cETV$e32Fkyu\aW?9+8.ZJ41+j(W暢ljԬTcHr*ANO?M~84Opp\"B \"Oӈu\1ׇ-aQ[bRXcON8Pw:XE T zÀX=4>O,.bƦ膦#c?%c䘇s°eEv*"M,zs[~yUo* ʌ+N`TYHm{>2dVw!'9tEz)컯'S)bO6Y).%@U>c_(71laV?{>/2=yZRI?'e$bӴ<'帻XW"{%[cO->U;p7)=Aq~"%z4{Oޏ[ ;"X{,X_aӠ`3tq^Mއ3[(-h%0]eHi#-EjhDz(e B!yʌ^2%<#2A8tx,bp ;5J kSOl^ZtFګ>W\/>wfܹ^ںuJ4}Ԕ˗ϙ3 ~w% IOO/..jVG[pPUv2z$igN3{ڳksj$ ~Ip9㊕Mx6؈ -IԮΘ>^8o4/-TُEgtK[G֜$,hG5j B:%\aZ;Tu"dm=!%U#-ėdÿXU=1}lO<^uV;a80JiI0 % 4x@P .- D&h_5p[G+I7£•r~y@ z TSb]|/i˹AVyj̨gQ:͜ UAB UP SK>wjxcH:3h!F MtN=3hVZ11ɈOtz#E$M`J̍co9T\;5&2[9 u3GpָqUE >AC]”&eM̲ﷺ J]b3[aqhqYlubGIqQݔѰ `Qs-RO!WW l)V3L(7zZǍA1t e"%zY^ ?VSsV"u+$;Ϩg^B,3>˟'͌nw@VH-b3 "@|;HkJT=-xz3`SW &rqbc=8}_B9sB(9g  pƖ6q1؀LBPH#i$4#i4'wtwիa0gs;wַkh[_}eI,!ј_ۯ "Z@b4,9dnÄs&h @L0n_-[N#z~}0n+ :άf0u :"UF[p 2\u? 7.#B}_̮uіU*3R6ӆ(~#bqTQG;ծ"MHyߧ E}u,~(/=x;^Ǔ=C.=^hkɒ%سg,;v?{mVrrrZZZFFFVVĻ_iv͚5Q#ԉ6 5&l_ejD[H8,n~iwy*+ۤmҩ>f'j''gMp af^{JlE-73ĈYZ%&,'l# y{ 坶FۇhWx~̇h6>K"|e|Q5jD[TLD}{a U55S/$Y岬VY\,41|ƛJ$N" K6%ɾV{)4yQcK'f"<oܗ_w5tr/cs ذ=6d'`ZX4Af19w ]O%56К`*F 2<VPt $V3Lf5bw! ^<Ai,X%*Jkcb{ah AAvQ3s5Y63":W'7TG;KHg~ xaܫˑ-Ge&$)W=a+˯Q3 |Piw1, Q`{:&uW+$Cx M \+$_,Ή]/ߏwj*x5(+SΑibj淼Rb[ÔөhEI̛˄udt2R1'+lK^YY :{#o#?>=vH +wў]{6K*"F0ʻ-g]fVcx5 ?0~>y s+lÕ4w4lokv 5uvEb-iXXgù(-.1ˊU,#jZ`*$ S;I g m!#`]8nmѻūץhEj7RV0UnBǨkH߫ 6)URj-fU&X|^IeZl"#nRf } _)|s+ܷp1pyX4QQK5:aL LiU0gH7v !|[ߴ j$]cQcC~+k:nM$*v52lI 2ħmܐdAp0oіހhrRo'{p!Ƙ`*kfqXp+] oZWJpU\4m2\3V1U=9882={y D>|oH*Q׸]2"9)]6jrN.p;1qS|Pi;1JIVpnɥ۱}^z9gQ9y|x{_|We#ݶmۡC}ua%mM@_7888--m"DN؄Ml&lsttA[xh^_\ӹ༕&LfwRS'&'a=&XI`EyE+k UfNznoV\*7aqFu_?l[#iw8b]Xk!|ƕNB3[>D>D[%E,}fkjk?a^.ff3뙔F&ɀ@0v3a]T :؈e^ LjD'U dy@.+ ID T^,2U'v ;P&AZ+{-t$et܉k0ɽ 8 o 2K9\_1LV_}_}?XzQZ4"rC7c(^Z ӑ:.'xfT[3/U20 >NM0Yv?j8tx:4 碆'׵1=t(9: “D\4Y,k}:ȪF، tc8&Q S~LHO cnQMFjY7M-6l #u]{Y16ޠVUDsqlRPGezaķY3wVFeA7%c;urk^elֈsD5( n 0f&*KPV(೟7nW˧wI<|+oI܆~uD.ήu Ib4z )1:N^|AHڒNCzv*,,π+`6Emk[ҭ p-:dD[EԂ2|V&Q. ~|@3"Ux<qDbrNͱѶ[+U-6 8%B=F"\;j%lߏ?sㅗ _%/t?R[n}7Q-[akF[111LxL???t/]Xt[M؄M 5a/2;;=\oXS^p9XA;&&oL䵓G'OL.`gM0y$KĶ| og߾_s5C%͒HÑ~{k-ғF5xÆ|îXՠ>\?1ny*iEԜBfAHiARu!G;U m) sbVs9\cT ݲVY1U^ 2@6S1Lx]0e &XX3 fUJ4f3hfJ܂&g_]R:X>Itv1R0JM0I9+ M!V e0_)f uD= _P/7|߸ vRE:2Lw5bQ;IUJ3/l, Iʷ)yZʣ n*bP߁T#. Nj#IoL- j fxo'cy/T480|$2Ǥ\)il}8 qAP!>]Vξ ؔZ5_O ioX uxLWٜayZ'` duc’|G*ym ڊc_ߞm{|듕?]y9G˄18 xM^ӷcSpEYTJήUOk81?ѰF5h+8]Ǥ*]P/Z`, Fts lL*"4|T,;K.f:q]Hyadžѵpm |?Ж~|Fe W"8ǧfNt?`F)Sѡ"hבta'>0h;XcQR. j&%f 4*qC݀KQJl4`:m=F AH11>:\#܅<iݒ*u&[=&ԊJ9 i,̩ML2G)/IQN"m|Pm1m!H>}h~=Ko0&9 ~ v]ЭDW4:kF8M萑/Fet2-YP]Ad[4lUt"l@4|T"T팩Tj[xiۂh3'SsmN6$%ۘ**u'~mR7^(`ó}O?\ЖgXX~ ȸIΝ; mVBBגs6lxL_'M؄Mښ@[6a:ۣ-VaM.|ǒVvK:u[UZ6W:k'Oo8&~3$K//n [zг?>妡sCr~Gًg^dD[}P8B6mwEr&9prԼby~7y W%Ug:T̼L-K)UfZVˤcZq<7OH'7QFuY~E`9>ښ>p0.bYm:KsNgz{6O;i3lۑ`Mm%׏ԨҫtӇ aƗK%Zah_ 3 aՁT*}Ytr~&.ߨ@}G,eE5K"w^*՛ݺijU><6)f+3h+ C*%r`IHXaMWς"ޙ-{wdWLkEu215 Xx;v~ _~51r>{87_nQ 4ʘyP)EvA9U:1Ұ&\o+p%`?]*g שeZbZ.n@$T{kQZ!Q(~0N/ u >v]ռ&yr8X*tGP#1bXF-Ucˈ̻_ܥj!ki,8N|>"tX Aad\ZFeHw|!c>u0x6~lC_ޣk zCwtCW#Bɍ.QS]~pr\ZdkGU^Z^1pD㍊L&URYÊKpu!Xbfc&HTи]Iᤅbu2,REm鉩kcy~ѳMopi/ITlWqIc-z:JDCA|=+gͼ"st7{x+_|x-Hܹsի_h6mzݻϡ}&33sժU+ӦMx랰 ?[h&10sswyQ]]h #ҕSrh`2:5o2Z+gʪ@]w =_n**^;`$9Tm]zgz-guUiX~6;:!Ҍ[ 71܇\V>p{ɺA-Jʬէ.B}mcb`i$|gz9'[^fNuL |`t0.2ʑP镦rLX 3j44AFQCa~~P7?" 5{έ\\sype80|t +|x!ñgcSQ"~E~(|Üp}=|]͎ƟjiGӉ{0 fRkQZ@BHmmL\ &Ŝp[p[ب!_uN}4v:/RU~* glM|N13[UH$=R]E^r)+aVHnN7M3gy F aWtj?m{{w>> ;d"1g鳯*4-Ƴ7u7[rDRmzk>_~wr*W4ڰܾi~܌UR}J4顼 \Q.AW1AN:)G$b:a\ ̸_~5t}H' Bz=:JՇޣzQ #d(*YP ^[4k*5KAr#MBbx\b7WE7>Uf#:kݍhPT˨k4lHǠS <ރ9ƨS|P7n 0ֈz`?l C?YdI5К4UCt7RJ_Q/lN/gucFI/-aEfrqXEE~ ,?7_+2-MCZS@$\ha?-UגVL=>u6Om:ʼ&`'<|G7^V]לם7a6b<v;{ lXz ,4B=Lk) 0t@#$Vً#-?/'W1PvUTַ&"N%<2V5pi¹ΘȶϺN-¬W}J=܍3>qaj}UG\:U }F%3ۅ~WmXGLn`>uRyuPl*2L-&^$ל$%^Z}Szkܫl|܀XإV%]QѿbIbK+._\y[mȬ~!+fԞh 7|E!Q˼Kztn9fwW\iD[(|YjEjy3BŴa mdl6Zњ0B5] Λ#ݍhK'1R bי7ZL;uFFe^z :ާޞa^j(+L$5e"t KD3QZ Cpq#] 9Ì#O1OMP/R CaK.sJzzC;QkN32uEbğrX0IM>=x*XTd\K m \YdԁcSzN*LN2^ \48$;bܑj"*iTZJa/7y֥!t{VN[2 ҡ`v!K]U5ʶ0;FzmdͿK;?|~;wգaBjWgUi2ʲ>`e=oRWSqg9n/Tٷe~u0p/`u,qچI{CX(Ah?c%nfښ&o_?^f91wh+""hɿ mES\puY!6)1fG?{~#{~`v< x | 2kiF|4By*U6ZKXpK@"­ m'S3nKM߃g{~᲻p^%jI]0Fec`: I]N'Ý/2zik%9F ]D7(Ɉ tY<:&|\MDvQ}D: ij_w@ԣ g-dbZL/3dvnzzZ"I*Nhub$QYDާ Wj4*?cpc|]<*sR۫ĶZSJS%jgʿC[ʸIb9Ś-<|> N52)l,0)3ZzZ#J%;1l*MGjv3aOHzHqR S 3+]z]]by]0~M;yFb-2Ѭ*af(4%YUsW71.9SF*'QseuDz#L&ql}j)_g#= w&ֹJ5rRhYl3y OַNŻ-4J\(\4czyZtVxх ~7^ZvhڇG/OzQaÆ~?}ݻw ^fbbbrrrtkbM؄M 5aɩm Dkq]oƊ3\t5S. z\{z~lފ֮.ںț;8I//|am]N5لG#}ȼ>#ںF-mÈdǭN7_ڨ%SW2*O)37>ƟyҌGV8GVuʰ6<¸6ؠ=zuA\օwEgJ(6rm5H'U*nth m E<ᅤ .R7&DT0w AA"qHC$ g[5iPZi%f:Fd[nR)$Jgğ' `Oe6RfY>{K 5kqoq]LD7hЧԫRUm=LX!IkdTNܹ_X *@4RIxֿ̠USK%G^Bj=]P_eŗDufEcqwMqU*8dX3g 赗U[pa3hf\nAXkZNeSZJ Ba+,$*MP.ϸ^ul;ww݆,86$da+=/5p/3KՅE%9U&Yr8O ƃyYP"W֣ tdbyq tjb5qͺ$K?S, Q Jts)sj V~{ /o < R{T5& =uH{eN k-aT+ mW3]%^X"s˩UMk$f&#{]TTJ'41 dT¬J`P}ɹG3ẊRLJ bAd/ d >]LR0KZ:Lɝ*]f!8yޑoZ}SX4b$~(u e(i$QR/IBjtԆT],[#z~"x&FH1P?9Dx!ޣ:qT쌍:y6x=Lb&SlSL7hX+PI.W)iKO/]8T#6ٮ??gՁ<gH VZM)[꫏̂ o>[TTԼy,Y26aa M؄=6hW^γ)bcD[7M*99E.hf~0cX+Wr'J*V>+ɠ+K/_X^ޢ!>um~9\ϹC=IV~Rf+MuIJmf@=uY$WQiy%Ԍ艹H xlX'd Շv]d\e^MMħ#xفPLdH˄4cۨJݴrf*J,,+`ޢ7RIxJx=.iX.EeS3.Ф.duRT& RV2Ja)X+e#QZ^J?^jgMeSulsI8ۅ /5LyI)7RRkaF? oB~&QKmݶK):i=hdҊ/E*`R3PS`7`#Ltk Q 3똴J"YxV~f ")LB3>}hfYfW3'ma4Yj@5# Z`#iq"UK˺7%ישB⍬& .w4Uqan1؛7|9uTk/W]./nsK9,0d5Щm°SrV+ltrKZ sRdFBs؉/VF6jRY%g gs]. Y0(c ѡ8_Ep Ju,+!jggT)2鍒&Ir4Eh%del:&"9:{xNnV11a rezQtNHV`JgwL_[pW{nqWE:,qEN`m;-3Tzx DQo O7.T5Y#ɨUi^D&5SI}1Z@b Ll`z9Q̹K+/ӫ0Q]d>ʣFHoMrRaSh~L٧ m$TYK`jefQ16bދ}m z<잍Tsgwo'_9Sc޺h"n5ri.|hz&$ (Qm15tz%[A0fn3JQfҫ PaTh/D31\,_P'K3.*OAI*a&ʶ NocbLw;r&̺,ʠy 2 l#ɵDj:VZKrja頣[.&bj\9`S6z"-Ki)H䈩fr=F)3 h`{jA!XP l0G[L Ѯjm_iij\>&$3ZA 쀱0. V;H X ˾aN J_R)g܆/tj&&Tl~e̦cԎp%\s, lQb-76V 6c[- `u`@[VXӋs "jA7(Kf}{)ov#Ɓ+>Ț:ۼm?n?2&qgaY.y/\H- D27e3gl5uvUO+/|`@[c؈u,V|=3V!|vu+/a݊[kgE5tGǼ?3BCCV5hkQ# g{oC/|{v$.h^S-XX,fST KiTZ#cͦ{0.`T%Q(d:%1nN13rԌLꇧꇦb#^}6E|6.9"\s2) uBȸqA惷BmCۆ ߅JR8.gK٥٥ŪŊ%9eY,JeVjz&IFw1T$ ALj*yG?\rXu\s^, ɟSg͗UEٍ])MCJ7qEyd :b^Wv٩ZmU MJWjWZuftw2M,<{ѠȀ7:O2E*i[]Lc X u3o3ݿ2[/2k-40d%WQ--) zF"vZu iQ$XND?;;V95- G|~ a߈.cJOc\.RURL$8bZN4NPH.3&󔊜U#Đ9?Ob'CS(aLb[;nN 9]z4-ac^Ѫ-ѵdZ2]J]ѯކp)cuґyk`y9ȩ`[eX‡>CЏ@z~)1g$L8쑏}=x8ܙ7OUӻ"|&-o;C =M{uguCS,* QpBUD;~e0ڢjyZm-VYB,Wݖu^Ϭ{\_B)* /ޚu3g*dYc[k5ffѭ,~2/C#7Rj"[g D^eV^y^ #ZW/\"> Yp$r^g[}{H!~wk6]U-ϭd5'I8;5]x!::Bg\.U8+51j7⬡Ԡ)5`JqM)TrNwvIU)xmu%zQ+p%חjtӑ.HWኛp8ξsj`FLm)̴ *L?9_tMvʫ״ohh.[|[[F̪"3)mT|79Ш႐[ǤԪSԖc?л xKqγ 7K93{ny*+ T% [uFñ Zkl+]/ ͉Y3򊙾p*UbJWNa&IDŽN&̴V{!f ;<>AxjJw;B^"#=3(we8m}m@@jEV7~s7{XL6mjޣ*Wi5qUh5h˗jN:Q$7j0z&SEՓusSeddNFs"j]zn>&- o?/gAv>iLPʩjtrH$7I%A:`l0Ig3Q1gɰɟf^{01Kvq0O,u֋K3C )|%>]fA+̲z£G)m +'.#Ro#4kLcߏ Ă::LCνÍr$Ftnvw| euYyWn%6*7/>^0 Naݤbk}|3~Z$jx|#~i gǭunĂDB!ৡ-G0^D`kjBNUl&^܅s/5MT|&5o9Qn6Uj%{7qӍ{wl\j{5%PHB '!I%z1݀il{m˶,[,Jݙwrsr/z>?jvg ;_fƗSj5{ 9Qxb Nۂ3!E2ax8~a]$^}ϼyWpSl<ƪX1__h+C[ցG<ӎDl?ݏ󲏬eى)1+5ŢADϫWa#5 ] I'pى6R!1W iy#S˔4%LTpi8hj3wu eb")I3p~\t .W\5,t __+NqM0@&,GDm+5gu6o_I~UkU\ĜBrZ9POE Da7nARM-;Omz[oH} !}}~p㝮EҘ\o [룵FFJF*GFG-#uS)yҔn8uo8xjaqh1XÉԍU׌SVj{ ;ffe"Z'5p t@U l]!Iߡ(ԅp*Z#\G0Ft9#5 Tj5:q{U qaʺcOFL|SԔ1%^>SrԐKl D&HL`&@f&@iT&:(9n1ӹ _j `R=ժ x($2kd&@`LL@ .jM@ KaGm&9tm댶|6m3fS̚5СCW~abccΝnݺoxavLgg砠 ]vmyyіьf4#2EFhOaC[H0b,A':2J'f'] ٣O}D~v]KpjntLDzhٹSUSo0^\bf91z_JN$#՚1"eʿ]POՇzGUT(#{y=NdpʂsijS+1]gΏ kukTQԳ**< aH6Vŗ:*~PgHbˉIźdz uPKVFjGNOR R2vi%b!@G2E7%Z)n?sl {!a;jTcbz z3փZ 1nA6LjJ.s.< \"BU!C^C>`S=Gd"?f#yr-f5anDnyhkSۥ{nUXx$Qmy{{mք_\Ҏn?>'2O~˲镃=^2EB`+0s\5W `ҙUplvh4a_ 4u&Thbm'ߓ UD\ m݆KÕY0,tn> [Ncp'~ӻЃБT b`}0 Xss3+x(x8؁S`X.bRc[aPtCDpm_WoѶrzlٗÓa0gxbJL@ġ& 8oM0ééTpPo 9ҩTpf8U5NT-ZZ*YD3.C7 c'!tCZBDA; ?y~6{i\Z2lkqI%V,k{FlSmh5|BY U|K%ull+EbpgJ@N##uݣtQZhdN2^2!AHGa #H)2%զf 9=:F*L, d Kځg@(ŬT3xZ4N=4N%4S ) Wq c1:(9ˆ :)mcݮv5vHHH7Ξ=СCרʕ+WZz5k֬]_gƌoƒ%KMf|[>y俋 ]]]ΝkD[F3=ShF{mЖc'-9hu,(t>k~f2Bͻ1]i*n3}>E,Z m㤶+};s^X=|el lV.1+J/'T4&ѬWvk:h6,m&Gl R"eB om[ڭ y0C5% 8%KG9s#D\֯nC ;fIFʔl%KI=~WЫ OϢBS.kK/))xry?*jv`#b 9y⟩SLcٟxvm;>m@[je >8\7H( PS( XTŔE=|<6o6 iR%^YlV7{nOzuA(K$  q\qQڗww~+^GE=MZEya-;/REzqu F)p3*gݎc%R2߽,*8JF$I "H*NU9i|Ajgcߒ' z(ʫW\RiU(~o > VbOsGJx2\`)i̴+xThb />p\ #Zcωvc2uȉMxT x\]qW٨cH>¥Sv#:rx{XrXq_1c~]wq~(hS/s5[_=Dd۷i hh+ö4\iUOۇ~ڧ"w ZD<[khcTr3BBlj+|R<^=8vVwSvMXLgN'˷?AQŖJ)OLz`6\vןiun n; < Tv\u.yLY+jJ>5#sX|S~ebmEf\]DYY0\q.F㫠aX#7M·~ ? ;=o6_լo,vP嚁;&d`XexyJıڿ\Qq-§C%vJ kwY{,nKiFa+l9:uj1)W·H;wFѭ(!,rIG8:\B0|E5 IWUpIm1R0^5`Fs-0k&B u طqj-u& tVX`#cbDa-UXa K6zJcip#UEz[MzAL*?7_GD7Z'OS]2^Ƽ>]!YȳrT=fZhf"xf^z;̷6.Zby󥧧:t"(_`… -ZW{z{{)觘tіьf4#2EFhOHhW՜r?f74*mkG"ȩC&h$*Yd0fA:fo[ '$u DߣjR63&t_79-#f)0 mo6O,-PSQ jr>~ntC;SiˉI5xgR3QL"'?@B)LfC&ZԆ<@ QZ7H/7l-_8@8~[;C<ǂ0µh|mkcN@ƛUz{;Fmt mᖳpyDpmv| "ZS3ُit9y rt 9e7רUW꫆r+P=4{AU݇o p)(||g8q luj-jifN$6kl4ƂBʱzse9a'8z=z=hUî,(zSŭu5 9 v9lE<[aϱϕuzvq|:{үc+Ϫ6}0gU0 (.BQECD@A͂`:NQl/W "[Dգj4jrPWG5B:i:$֢.[a a`Љ'v铹*vU@2|,K?*1TpAyiw֑w6.[MnDf\-<$U{T t<G!=: &31 slzQızze+%"L.SJefQpϷY8>mo3hCU< _~fDe{G#߆8v#}}bjq6Xv@!]СzN@n o52 rj9E {<] ѠDW?J/mK xZh`2#k-.:E}Cn'{зC"nc# eg~R~꫽C0 yZ=i `y}.xgz[3FuE3"F"P8qT O, 42mb*IF9 NA> *_TAF֯Kri֭_: Ba To%#& i=@:R? ցr N~*I/V4S٨ oֆ xD=UTihj1.sHU"3t Xf~qݎ V%ڳgϮ]m۶~z#2WOOϸs._sҥk׮ݼyΝ;6ьfD[F3?믻eNukuA4ZVqB[eJ ۻŧ%B)-xg ]/iPo8P# -owRZ e?xz]M{tPiڛy9yEOO]:ڡwj'qz*153]CDSK"nJqyxI[Z(l*ǒr7T@/LCϡs(^m!A,<(k3ap & Rm_R*' +NW65G;/%6SA TubI6Ȱ.TUF=J8,BұGj[GIؖH,aF} ~VTc#r`J#.\[.v ddk.o< Sj' 5w Tq<ʹti5vpzbu΄պX"'ʳn7YH(o.t/I0 (!i7Z@Pv wt#ܐĘMgO>ǧtk7aPtA^śN Z<,}h>(3Ǖ+9j9rO6<;|:@j)PN%<<ҩJw}Vt3`X!16*1cL0馼|]e{&Jk՗'7,!ɔy1' }GLgG}UAk^'3@[H2[h+A[#8y}=Ӵ?(X{g#Ia0$E+J3GcJAC/Ѧ d \I룚ڗt%Ď+v7 ET S rZ|[l) :W^V^`,Dcp)8@Icd C}vt6I`,VCP9_?'{ryOB5wb=/I* q0O̓-maftR$9O6;[jï_}B~6CAp.r^Dݫ&чl\50D4S!D@އHj;~*"9)zyBxR:I!xD.\̽GVhˀpt__X8'z8i4Lٖe)lyK@z<8]fAѣ!bk}l>LL?]RǴj8jO^4l'Yc3m\&9ak,UVі-z?ЕaÆm۶;iYOhO!A[!!!zt5)aHKmefc0 8_kj̷bmG[9/m='4*'`a,*(bzn4ڒ&1kڞ-Tjc+Աuk s )l' 6R.|B> sɈ:}d5z\vX@39wHe#T5a!oy3TME׀`"&Ap;&VٱKkz HΥ'@Z;W9|^-@ғv;W{\J_Dd%Y0ż&&Z =onk/]IJ!X|ҩL|N]te.HE5,KF"ko!W^Kk /'+pjځ_ kpJ%3.G*P:NբeFy0߫JlƜ1"UxB!{ȉIǒb$\e8Y#0x候\`.7gmKk\rak~I}tڔ_y[k\/]|#ߞHj+Jf7 1^q/~2ΦV\OJhw~Wg{2ijơpطO&e b P1bܦ_ڡgedb> S3Jj&mXU |s¯AQ.K(MͿ&]uZ|Y妳M76'7^ÍgpIHc7w·Nkp<?Fl[{_PV*Jre0&s:\jFC9U ܋D>͆aN`C0Z]OFnOOBW+,^f0x5؉#D>0I4U)EBٴ|lˆE3%)eXbl"S٬ ixSY-$Z]p> ]!h**XCSQ T 5 )oG8AܺO+ jAaR1LA*U ɂ$$1{ZpZG~N&5$#'g^Zu16`kv;:hk&o߾̽{O~cYtŋ-Z`ϝ;wΜ9iiigϞ9sʕ+322yxxƢOMM]~[oKעF3ьhˈ@[b4l^&B[HY]̽3F[79Xc,'{#^Q?hmHYY < ѻavH,upSjh w~]6_E7̈́Ķ(ƺ-> "9x?ԞoiTt_Mc9"{1 n:֒ &žw&[I"m#/?H:Nc <E`o&Yռݤw?Mz CLS(4$DCNxh'(g^CRf9 S 2&n1雿⛿X16O]~YlqҷY:ӿ=^, oBd>$듻u*4aպψs:9:7p!jx }~ ~|9Fx/UR,2E@wT54B!T#(p0UJ!]֡g"+I4zwa}Xqeb9Hmf#Jnc6 h+/FQ\TG ,u ݺ3ro eYi"܏ 6S}}{PK k F0`_3](Iz Z£H.{Hc+R/ G|5|M >[I~3R T bQx@*JMKUkpe!H-&1Ɉ[%䎳`U>1 u'V8B&rEDj٪ Ɵm>#v_E>d8zB9^[a <3_,3[t)ZtAo@7˟E!k>D?lwZr.3p) _٧rW 7%G0=X չ6%~zx@78l,KI< "UI.RMzґ΢ 6ь{_tCAǻ8mQ.UQ [$Nk23P+|]4ȃaJ1E0\|n@|?~M|X |mՒ6iHl &j81fӯpe}Uj#N{ < > u'`V$#;H"[u#I)>huqnZ7V/nd#^I0w.@AC݆#Er5ygFcpҋL PT4܂|C"?osyz_p=xxxU^tD[C-{ o#OC=C# t3:#^0}h4BB*YQP mm0XzBdD@%ڪSGW&Vj$Crj!5 9ZB_iw^D6fsYs0o$k@V rKOzgefnIHHh󚢭/kYf{=tpIה)S*~Fm+$#[tZZچ >[.Y$%%Ch/O!A[Fںc\822;mqBQ-r|_-6ߦڭYE\IBP&яA?9˕QUJ̿CjĂKڤY^ nSJ?M~l-;d!<`c *X]0!LyH7R!,2&=6|}ؿ ̦_P ryHuxxT!H<9_nX>xJ"=~ѽiTbgMDh SAğo%uTsX NoУs. uԟ=i9 |w֓vǔu9yc+ؤ i Yd+M5A[»Ĝ0@)2 IDX6o\ȵZ6ܯV]F&[57B* 5s$>/lby 5 Yv0n]ԹΔz0*~M,cw33+IO39p;91=Z$Zg~8#L8[!w?ïaFj%vdf|Yt0k7c)qpo l}/-'aqN«[ަyZV]^QsMToF 4/P$0 еÄ0\qnB5w'p38ƾB[yp-|~~u~<5=xgr3`i78qeH߼>A&,ietoNi}2SyŮ,yFlN9* JuQrB$Wv[ .+R]șAڽcp2\ = 2*j%zIAA9 Q z~+GAZ2eN{0>.'Q 3L5,k]+/u(ȫ{!o???#G( 9Z ((Y0#TMT'::џ™0D7N(z \|!0-:W'CaB[h{U '"-4ઃWNڠVMP2YҌ4I˜Xdz׭[g|3Ĥ%]]]_{n޼yѢEhF3- ڊ߀ Im_,Ch!r8j҂P?m]$av{s5I2AS]7_\fh+Wuŝy)u5y=:k{vb[I-}q|} @4"0 hBkhۋ;(cTjXd| aP B5EVAA3~s?b6 tnO GL97 c*tZխhQzEwu [eϨb*BTf]GVˢ"r 3QQdd%{Mf bKVIM vC}P?S~g&M>ok݃C&AT15D0\~߸h|cƘbqJ+ [}æ3eI`[g=ƌ=_>~?EMg~:Z$v=H-eX1L ӓ-q&wva<žMxvX.W;3 cƬ{a5u6uur٨ضw.3/1ЅtZUfw1i hhB[#~<0#y_[DC7Q NLCEжzè8\p=w|G9U\LAT\unM~'qjYjSq\q\bMgZ /+p:z"t97/&h/]EsDĩ5viIʭ {ʅZ CRtbr=r5jy8CCp =\. nBؤ/z v|>D#Qed3rrrH05.\xGO.Z)(dp2=}=vT6\B; ~}? 03x/?Q`P&MHԼp 1͸hW k@, vR~}e'l{ 3Tmz5ю4̬q0 fBc:U chjəy[ǔ&ƟWe*8 }q ]G~;Y8Ńؽ1\=5e C/ˮSˮP5HCIK i9]+*J)w|.ǜ*@kuQ Rb8>wZZ,Kb 6U[T0,MmێyX6u@:P0d/9f* LW_뿄?/yEqc({G)(b7Fc$(1c,11$Ŏ UY`Xڲ,òevwu7g}v>- xT@J]GS|yV9Ы y2ʯΔFe"? DP,Q } IJ V:-~Li#ܔ.)bQS)p^KC.dZy3}.;$}& N&bo(ρOY+- oBd?<k,\IhПկF[ lj IͦrqV?WJ oz"4&>Ay Novk0ZNj$H_u0'1쑚teVr[usҩV^WMɥ"`MbZ1*u0Aj.L7m@;Оe?3LZ݁1> )p}\x-HLŜ'c?-V6bWG{h7尓'|b>F —?x0 <.^&^o?h9!U"*k;y OnፕȧbV,@hKb2 QR:aenj; CseO@u @-|[%]sZiu@}+轢;7zO΋aTm&hKߍ"""===CCCccc.]nݺ?hkF,,,/іs;v 5b#D[Uh kI["+raFV[ FoXǹK_x g\jVґ-vHZT.uꘀzA`]#f +Tߦ?/:*&&$UVUnl}*O,bUIn򂳩pd#AO"uC!*ZyO-ߠYཫʻ4+TyʩE<\UD51=w.繃3A7@gңB[<;zVKNӆYme~vṲ[f%3딙e2vUܺEn@:(=TETp=u8I{U* ٞRP }6zڵ+Cs1f`%^\+7L4?!iCm!Fc [A뎡I(3 SK |g}^Ǽ=#Do]C+{?x7||캀/3s #`p ݴ)A)-G#T|p5ڂo1Xl8O$p_a\U+1dt?|SSJe3;;xzfvܡ'{p!b!cᲔ) ~;`xg<_.AI6+WNf2O}h+))?\~eBCC/^f|9n݊i#?FmΜ9 իm۶bŊ؈د,/? k:̚俛5A[)3KVE0h +c1qv>qV52J)o{ͻyxe!N ɣBc Rƶ^U<(/ϩeJs%Z ,)egM#&ź2TE`3~~x{~ UH i}ª[iR +:)@Gmsz }"KUJ,iTgiʻh+iв(yteb.E]gE&NG Qpt],j9 ޅ hnf<ø\8{MZv‚C8YpN5T\ۉa. :Z睦o@./P8pz{kNjƋheps2t?+&iF,EeG彑FP)v4ȜnO&n$v z{["z=¦pN{Jٔ7Lh'|Œ'0~&1Qæl.p#mH(WIJRXWn@phV^'K7b $'K__~uLC-,9IT9lKa&7Cc rҠJ[DAVd[khi(ڗB@3OK\2s($Ma{X+o5b恩O`uX5-vnn<cSDoG 4h#Y|x8(Z(6Zrsmm{ŵ>݋}>;B;?ϣ6gf(&BdW*t k8AI0Vfھ2&Tv}i ƒ1Ƭ!ZȝSA ok,CL*FL3,d,VEJB*Dn6۞FrRoqk-_9RRX< nX:ŧUD5Wx7]p8d)\k̐ogbw (I'vʩ㶙-+:~xbbmVZlٲ={wUW2ss>vvv zG6b#6b#hkF?eӧO/A[g IRk5k0z +g]xBm}hK%&nǑU')ΥfV=/WySks^>%IrK¿BYUě"BK4-MrF]bΏ/[B5RNlڨRw9N-QOA LVzʱYf%WӭzVĩ xHBܪ(vE҉#u)+ 6X*=\#a~"ɒEޡfT0v]Ex>xVlV \*w򪁞XJG،j"m!D41!om^(*Iu3#/wY "FvBrP(s\wm=ؒ i0tuQkaaI c:KTaJێvU>MG@^w^X&*$\`ٝg&:0wYzWZ4 ?f2_ok:uL.?9 B>^ӏB.L*a@2\v̿Eg{]a(k?Щ&2oh77gwSKZ397m-8ڿ)3yP/S-5UkskIhžk$~/hQҁdϯ^]#Ж+F%_-͵6k7TCcHx|ҠB[D Q72mDN( EFTw'<A#ѡPhߗhS4#̠-qm߹G/LbK;On×[4EOO_iE(C kٵضvٶضڶٶmͷm-mmmmkڵH){J H^q`@;%N\4UwQf,ڐu3o@uȭyA3P0b€<85ޅ.էpϧ0i<?apS aA A iBȵ ycg=| y:{; }zuTk1ձ1?!I.Oñv2̗ NPFRB5N2h'<qb6c #A.n C-ra&2CSYhFŽ*:L)YyCS9.m\~>Y2*|sR_oQLluρdc߾ ةͧ;,`| < 5kDmЖcRRҩSNVܣޤ\5 \9r6|XR,Q+xc5ڒ-2S`*e4[*>AT,~-E~='d4t,ex*U&7:s%A|2ac:4(2Q_GiF[гrR[ĭEb$wD:\`Ǧ]PCuç |"\*R7w =ٔ{3iרt| M8 7qlҽi#éE0p){JWY6FUtP$a*hZē14Iru,y@nwS V`)WuZMw8+:+~ͷ9ڙ4z}rnRΌ{mJ‘:Wߞ5jT5j34.I]Af7` "c\%}7Z>9Y@POMlJ뗞7H7w -ۄgXN234Ui$L#ޑ9uNu@9;¯ԫt?:::cԫWqښeeGE%_-}n)lӄQJX|X5 idz#>Aq7[ghw":} }ۏ|>KBIsЎh"Zs .}L~^ ׷Cn9 Nv\Cʳ SMV! a8ȥٷkԢKhn`(#u2'h = & ЦIȁ.ʹ}ʺKa'7cI&)QoRCocT1JXu|zKФ~߃Lڑ9!7;@9 vZ(.Zt k؃oF?Atc!t{Pa,4/ 9^/>Q-?_D|*|,6vq4r0 (b8 $2|\{ _㿏}랡x;pq:}UоS7e:Җ4*fu&w zI;MCspx|4iXk3 KëcV6zf 77uC,u,4ms.MTt֛sZ]Jr"Re7L*%> M"ydp)ۯ"ճKx3x< 5i,_#Ch5w`gӿΝ;/^`{ڌy<݆N*L8MoʣSJT/Ta\]Q(7ЎjHnm!)p^* ۍ'щUWܠ4޹޽C-znڵ(G[sv{jzr`ЈkULMdS"Y[rcRoqi!p ]/ V\+Ъ *:1 Vh|Чc3NO]+=S4X&' uEkC4Xm2kE@dOƣJXZ5Jz -F:UCb05ޟh84)( a3CG^OηR>>[CnȶMtoJSI;En߯A?@{ 9Ǿ*/A 8g/eܻ`5z/wTnF8 _*vRA_w5JYl%t h(^qe]OgèT49\8i=g* ycc4?lF[Cʄ km&t:9KY?k`FlN2Xx*_ƆS%}KE^RE}}7ƮZjķ#6b#6Fl_V`H4}~βN=mmy o^s%E3FZ w ۱#C1X}>b?$}';ņYZbBmiåل9Я&Eܶ uϩ=Rv-TTt5 }} ^oV?Ҩ za=Ӱhg2ʷ-Ĥbne? Wru$@^YPw- mC/j*أv+N=朄;Sl|*P:d6dEkcuɍK(_8X|} ږB_{>?vG~p'u^EmXFeRѥ_'VNydr=NR;QV7Q^1!/yw5L1'TާOw$mԸ._oP 2 g=I'߯nC㶲kj$D$![ԜIyE5򬆞mUܺ,1itϴ4i ZlEEF{Xq7y5?֓(=a?.^mrM.:Ъ˝so4~G|IɜZdV2z ^Zoxֵ5KHh3`"N &wڪzp]km0hKKKЖlYt]Q޵h†Qʦ2Dq'h7⛵wZ  λ*]yZ8 :)JJBB>CFGhӹww sreh«I%3둙t-[v Jg5P*@%( zڄ[mxjSWܬ%gOP/F/G& ivv6bgҫJ])-W|nM"6ºGlBHt E*Ƌz*&ʱ*!0) 2X)h /]@Rd0lt?3OU#/vdDCh<\JYJCsWm=BC \Ϗ3`M zf\EyS~%:%{s`d&yR wno](YsV Ck/J\sM"Y.gZNiFʉK9ӮUw)S0AR)-E()ȏŠ-ѯ[ B3BT(Gl0MɈon%jbsPd[٤{)3/;.?F.y5Vkiqωbh}۶ma988 CBBFֈ؈KhFa~~~%htZ7Mz<{{7o V" 00CDaි2^>_ھ0@l J>_I{7ob4j*:G:y,ʆ ?x 7kmrU*+Mӱ&wݞwu&]Su Z Cªx*\O{Q#bp3+;$h%L` =`T6̦#9K*O+wSCz#:8} ƮIwt<<@jң*70&$<±H >u[T+,ӔVh^+)"VmM]͞{ƲkH,'#DB*ͯ,l\E|=8:•h[8+C9VmUπqW,ܘYNjDMuխL&OU,0{3a9Xg, z?5=FkB/w\9>{ŮB/~ V\ _WR\ Wl4Ռm)uhvAK2gڷ)A~ -I 챏nN̲2,QvS5ºMOwɓ'2#ЖYbuˎJط{KmM1J=/y>i0O['xi]`\n_]U ǤͿ:r)k+!y}%څ?~ߣ??g hu.XFaz#*ؤGRG1?´1 OS1 b: pC+mVrSa4Ы+nג7NP֌7fC~EؖpAe"8O65Gd A߼;݋u-|3 R$r&LŃZph\:On#mJbUPejgb-Њh>vBΣx'(.E)ȷ .d,2oSZ7+eNujW8$.Y4 ǻzxv/8v =GK-bfT*}ε*VDalALW>N?LHͿ׷`=Ă)R \u9Zr;ň؈y{{cI{5z84m3kɯV>VDzXYd0aJɢ?^|A|RSĚte4i|PIjyR`)L֖]5tK12ˡ_,»ga0fS#Wp/]b&]rjS83FWBp]@]Tw:I:b,~_8/PWۖ[||[l,CB:lJ*nM͸WKhU tǃVC<S]-ilSuq]| hQG] scb%rWhDU5Sv<`AYԑnl {/ ]-Wӱ;'?8w:&ћ] xeRpM.̫Ty+}+JjkhLuv+;%fb9_>ZM!,IK6}~td/<1< J`ek4s#TG-*y6;7dKnkh9O5auelEM/cuevfgYV'hKK$GcDNlۤ]Ƴ*]ҡ?DƟF,`\ЋRj|+T)_lj( 3{ `h_Wܭ%ol ޠߔs':#ȢEbQT#"*8L̹M,,\cf M隟Q.cF7fϐ WPN=W?f'exuLGh5iJx-g=e2]  ]e<4/y6"6d݋ O TFݤ)_f6d:h$ry FZlQrGk xq78q{Z]WO\CҵFYFpZ̡"s9H|ވΈ\~gFn_D=Idf2V͆Q0f<X/~eW0CckƇn4>b?'rk-yzznٲe۶mR!!!K.ݽ{tLCuqaܑsFlFk)dM5ºhu5ovrm(>=F[iaY3V-iǠm!Bm1GSQy+dMXlC 1H̵Uh=5nȲzDLMoK΃5ߑOR&'ٚC$~~:#_{Z)S4-[<x5>ħgԼ P#.:܃) yb]-BhhepwKUHl$V꞉0jN<ڲT"4{ίnzHn*ʵr'q]Z]|RZw삦"# Zm1xK;`N(kVMʪCl=@ ?);TF?m*jTdOjXert4&Zz -~ BϓdB:rL`ҡ-z!-'n<أɩi $uxa$ޞzu;B_:$޻Z# SE:K7Ulhvmwc=.PI&e]z6wML;3Mg6~ْǟ皓ܱԶҭ94=ӿSk)ZSu7xEW=p^xᅤ}"o,r/t Zs({6aA!S;evy FtV k [XY7M;,MMB[>meӣ| ߱nӄFщUIcɎN$ZVq-tBiTEn*{Ak)wԒԂGOTq9T3zzȯ y :րc ;ڒ ꊅZ ʎ M"ѫ#u-`55M>'yhϢ_ v}sC?cINgk%xC"I׋] !OYUK΁uLiOz7U_B2S {ҥ.^0u+jz|j8u[uWMgeOY0`04O62<KI4JO@\:[Xp>a .ȋi鈟\Ɨ*Z/4v31D1n0ձ~Ʉ1iVOcBԠLkT!}18-]{,7^:eBO>$MJNigO'm%.B㢱_L8WN@[VVVіצMnш%xaaa;A[˗/yg ؈9 madIZ7X <[}s᥶ _Ns>|y ϛ'3jID% a/d$ ޒ{"C,̡/ys-zܻtkGdmj[էRff7W=)ػ`E*,=I9?fZg`j:9*c2Mbі=Jlj:⏰TAOpsv?|\09+}zH.qʰKaćf<\dԚPT!!sn=ҼPL.(0W*}S1A4ipvs@G u BxVw@~ߢ:^6&c Eª,;T]oȷ\ѓ3/J] k(9Jʣz~H744gT[6`, FlQG+|u\,l: 6?ށNm[e} Xs 7@2;erk'44;55;rڝ-wM^LKRYgsǸ$eZJ.$ZG3V\;,n1|7bq*+5 ײ~;nT,=̽EMab)r컮+yYbT\F8[H]jS4+ E碈ghzd4#dɄlD))%5%ICZDNgyY_=.ٳzu-,;鯏]R~BU|6Ͱ{ :[[B/UaҠ_5Xt֛m9=.~ o";aD3ُp!LȀ3pDOP^5 :aa_Z_>Wr&p֯V*A[̄EzhٴT)T>.XbM 2%lToNEܺhIZ]kiqj|5ZQh/,--^5Ossaq-[Ͽo*GGǘ'/odd俪%Fֈ؈O~-XGa1h-v+U;a×7~ylե3KϞOHǬe[c`AaFɌK`U6F}K71AE>'G!̵sMOd-RST)sJ\yԕ#w(T)fW$< g_'@(u9uXdK)䬛Ԣ4ʣU~VuZ"RXmTjV2\/LjF%R } !r()"RZJU~=݆Z}MrOߡŶo%AhO/V p鳑{pL##([>eY (E[d k-;ϳ3"Z"/5Ŕ_#rCdLKFw8: bV> ůL*":*. g!4)*6ʚpivK=c%,j%dpˏ`jIbtBW4I-cy:TݛNKqEsPQ5VY5frqCIKY{9ǣǣk$bkqeUttvuOwyw+t ^)b%^ ڭ9<bbӡgi n{'0,Iw|^PʪaypB+߯#/?~o-?m;eV3| ݬ~(DN"ޠg~Mh('ݢI6c̜Wg9pK.A/QXLGQz*Z9#= ڎ-܆;`+iX } ȃCZȶ Ym*P (tr-trh,||S64q@ .P*oje骓G_<5÷S>xC#M/sW=kjOF18tϊ}h":)J:}_]^} mN<>BsYL@#S 3k;^2G4I)Tqq̴]cmcEmzٽQENwo4b j;ZhHomVJjʫ *C*$-]v=& qz-aA'߼ϖ#v"as g]C+›44'E%!7!2# |/h#>A1:a}`1nUBߋɫ;HS*EC[\=E8zA /P-*f*byp<1@|t K<7Wv|Ԭ [ߞ%qym:$CԖ7mآE}' &9;;Ξ=_5 www|5b#6beFlעJcVhkޤGx;ն RC .eSJؗ0sge: \^N>yQ=t8ڪE r3:u˄ 9'•uRbF?D8sO )f=!ѩtk{N [q}]AVa:!NNSSD"KqߔOl4-7KyUc g-.`Lmfz_W%+HV-1~˔rݛ7-j7'rjͮZ6yvr7EoX2ySءiO*K*;x5әn[od6:y5LOgEce_0wNw>Yƍ-GnY7aI3} TZיzoaUƼ:7iBOgЃLxȦ9W#fh3éLshݏhhW/Ѯh1(w ~rn&eih bZ"rC3g5ڂ`4@)-5Q oP7ekk{9KSYӁ5=ggqtI5u)5!oBXX4;?؊߉ލNGG>EIN{t/,,3*%gA愎9b,:9Q 9ghr4С?mݻw~OQ9Y܎)t'T&ZlpBA muarmJr\hof{i5/e{KO:v kj։*1bU..%g%uVL[tԺ+UdŽ^Š"[AB1X["EG|Ծ]PO l-D,B]"f}O!HQX2"\}9׌ӤQ7 K0ݪ_ʳ8HR?'aPݢ L3n|o myVZjh}ƍ[l/g[nѢE/V#=mڴKÿ4?X[[{xx?~Μ9 Q@[ SؿC#-zR)aEʪF-g=u*Y?NjRt+m}\g6N_|,hK: o??+f@ _6YGЯQ0x^p]Ή킡52]D]-i%a7%Fƿƽ1ymĶ3}Hj1HR$'p{MPWaj BjoJӌmjm&hŇpaE`R~@͓YΩK ![4Hӛ:[TE#|sjt鳙z,A;+HQKZO|-"VdoZ\QoȪ.sg3;n `p^ e[='$F5!7kPnZm}N&YRd׭Ʃs3SbݮyN[7}zrGV]#R)vo׭iճ٪XYZX:ly.,snËV1Y{ͿnRVVkhm1c^ʘ}a2  c&`Kg%Q}j Dj NԤu'9Lz=p]`.1Ь'ukHrʬ~//iKM%TZ^V~X{ ˽k ^C>5{Nqepm5\hE$l_`UX~ b>Q EF|~ B*R@ũCTh7fqn;P:@دqXAwwyCTrNi=lAhgspT.s,uΐ}ƏF" i}n[:Yeo=8M]/! @t~n},p*3@@*)*2Mn’?]DTd{ʼnSCR0Ns!iQۋ"NvuQ*K&'FmءB2G Xdw#z 3"$lЖ7joPk;wܻw/ɤZjܹaaaׯ R>:um\Əmd666*Ж0RŹ^Ӻ{+/Z.z0nO4x6Eʫ/K雔b>)oTΩ68n9mD/c[`c _ |_ɘ{,ڦ(RZJxd'1?(P3L/yA=+  >MY+l㻹~-qd/Vd%aX'V59FJ ۼ#ƐAwywylJ4/,K)T3pLp*ZR_>Jf%uL>xj| PsoQa/ɉqԄ"Ҫ^)uN&~QTh*~DP2O~ޤ.Q+O;:Fd媦tD!(0_lfn̕ +.3娶gen%Uax+9lv;EB߭oɀ09tǧTyai-X~x>v~]GҝŖTϭ17hpLFoNoS]=^ 1mJ:K}vA̍笡lXhrHb:&yQ/h+F[,ߢW_VzS{Zoh+}ƣ5:< BnsirKyΦ~U\2Q4{ "JiLBf׏a ҽҋa[!M=yvSc&1X+_;w m91E[-A_֠?-]1,?kd{K+K^g 56jtw[>J=ߓt'0!̡Wл.4l>}p` ΟaMXf!s!_t oDF[#T;||Wm'Z&rdC $MBr{1ގ-m7ޚ\2&vyսUT.̹D(ūP-c4z=ozf> R.C68Tl_tD)T n4*RmZЯ'tin3Pjܪg1}!i G;'p[BNOK}TZ=uzmm#Tdu[㠶u\oTQ'N+­s(@/ EWDL[vpC}Ж/jajڵk޽8|O8f֬Y&LXx;ж?+F@[>>>kUPt?)LaR3EcLWmpe6{Ŗ7lӢR%?{5]?8Acn6O\YSWuەD~]*abN5aTNW`ԋ" vD̚vM mݱcǞ={lٲs'N>}ܹs.\@ƍ0aիwڵfs:|m!*jر,XP@[ ?Ǣ-, !mt\O0]>J(0e TjT?;NὠΟ3m>9O{caEQy?'EiYvUqE619yU3vi4$#RN6p?y ./-!#f$shqFj*DD!:Hm5N6Zyam^جcPw`wj aI:=$gƒ>me[BYTF5~%f%r9$~IԘt%GbD@:%O||p%a\)mCL,sb}YiEIYiQ}E~9hUEiEM{ShUDYʼ[r[r jɲљy >bE|n !W:=$oT L\?SNk:V,̟]:LhL/^/_oS[%)0::Qyq"ww-S ,L5%ȹ;Smh M0G{?uoaש%\ Qzd&k+h|mra~Y;G>MI- q4[>:&V-{vm=Y6#)0'ͰHjka{6h[ѻS]Vq=;Y LxdX2\v_C[zkhk1(y?kzdzK+KbtWiPSYmRlw$AG+t)|: }p`; 'liAJlp,Q`AO7k y/tl eHun uFRBjTL%,ј=tͻܹw۩-7MUTSbQ0pXi:Gͳ6n_(/h{!sv_&짧U#4FDB<T,ʨc>n[,*̪EFl~cVuQhul1py??]v|yL#BNGxj qT GUBX㖿I&'^qEQMAA R!a'}$J0! '>|C+ zΛ|r+>#N2!۽3H_@02p*%Eujh+|3kGcY!1@T9E[z],.6mk5wk6uivbOaZ45$ѱZ"|]r rq> +UW鲸މ11g<;,,sꂞu֜^wsmU1Z;vw%/±jf]w4Z^ī|)6&/߇~ǿ|4hk 2`&$`9G2Gbc/UVD idmAYywTxh$wO30̻K} '7=p(Ɯ%_l>zmi0Z(FJҭ ЍVF#U&5a![HvRGrpmy0lT/'IYq>4:TT6S2 /.zWqmz̖=SxnKN8Jm/Dۨ.68qv Թ</']>P> ̴VlP&6O%Sʖwn$.k ;?7VW6vG;#҇ԜW$I'rYDM< !V,GLx&05EX}6ʵ K9!)*jos&TjԂTY3 Q`e2?!PTpIֵ2V(zK$}~bP9GrAQ(G]>آe <0tω~_hk"+V ۾}ѣGO8~ϝ;wSN[nϞ=۹s1M<LMM/CC )La @[ Ck'׫C1Gh=0ʲe/W\Ɵ([7y/'c ҋ7HMJz1 R-27ghSs}ߴ7绥cz,}FS|B  w74SkEJE|MaU4MW-b ܓ'\|koc;|wx~ VH R@I0lwWGws:.ۺ;Byfl\-.LHdrt yCdi 9.rɗJyuqUx!5N iV:U`TGr"esψ,G{yIMAKzgP:$]-KOư1YGNilJ S)i/.[FAheN_6|wn5H¾Jb"[mJ@Bߞ-8#÷b*tVkM-5q#xW2xF O`X 9 [pzӰ"FGXN0: F[\ *05aezTeOٖ o$Bb@'>EQ/խcV}-MaWbZWR/"GОVXd_5vCk{.L=$:| hpv Xft\C'W`e`=IT$} / 5%?Hp i& }JLB8JH1WH$U(ycu64=+'6OhK)ڀ8g=݀PG@1Ai?0Q s_dgpFe)J0a~#hѼ E j#Q{Ձ^X`eXe' p%<Pwaa$̊) ʵ Z( 5PFRFC?Gu=袾Q VN#ѳF,vz)E|Ghk ,-bƍ;zSΝ;q .\xȑ#{6lؠxC{MGG? Sﳷ߅? 8?m6ә)7 iSӬS+'UTcOe,yi*Ζ.N{% =2ޣUjRkV9S5ehZ_0 51E'*C+{B67 rd6w3,[rtK/ϫ* aȼTdPjUۖ3/~fO8LFZ:GP'E0 }x~Yk^R*qaVLZ}^7t5ؒ\}oxnRմvT=Jxoc.:Ah5 "*N37ٕpDBEs6 s@ oh y } _d'@gQQG`:D6b8H,/Hq4Db:;h9 s ٠ ]0X 2 UXt:u3N8JW] XVq=袔;aHaui%),; A ln’0GF?-Ƚj0B)Љ,K haez*Kɦ)B&tJkagY,}f͚E-_/vС#GtkoLyssqĉM0)LhKa ׯm?־i4yG?z+Zl Nf{́!Tαqۦ&;x]+'MF 9Ϣ0+WO\iZ?,:oS&0qsYڍYYV^y$P2(`ZTNKDdHEH`f&.?kIwö(Ԙ$j I%>?}&X0үMAr+/O x=.{*rz}$"3 "I* noaEX Bgp;AzM&?2(ߏ'}==Ѥ8l3MO!!ًҗS糰ek['C.zAGm{8 UW;Cjj0!وtFv*Nҍu ?o ]- 0&RH;ү=E!. aNNVt}/1|!c$GGU*0,A"4>5!ل~aZ[揉x6i뙹WެovmB'5jTDD7uȑݻ… ڠysԩ]vs.\{? m###''*3fܹS20)LhKa SVV #/g\F[ՌXSiǧh+e]9W\mKr9:z"uy} mCFsd YWl 1ߏ,/UTNʴ9F3·)-j1͊Nl6}m*/M+u".vy cSNᛏIrHztDeT rQE`!ujq4([?ܕݨnhV&3OX]>qȸJn9"-WXJL4 49ڢWGv[4#n nPma5X}_t|VFoqa J$ |6na7a[W_N0s.'P~o)(r},1?¯ش\M&pFf lI|lMl~Hm䐔+:UW#:Zz ZcX0f*UT+u*7`Ë1D!峅|'RE4ښE5B޽{%ښsmm1@K$y}y$h˓B[U8Zkd]^eIO{4-([} ͈߱N|+ Hql1-,( I<.p2qϸs̾)-+pjܨ̈́f9RPOBD}1~_qk?q}?QeQqa΀rXvcg Z"=^8NCg/'!b\Z׶<T:z8|F#L&Hb"=L' Q`R VBn’Ӱy'] gy{a? o,ﹺ]G w)Y)%c%& `$#ڃ栌~5`طmsRsHE=,[͠IӧVPo0,s/=>[xub`_ (&"Oϟ#\rQ"`Tzs24B-(e1կ#U[ F\-ӯcry~ dhB[slmmϞ=CBB̙-baaaK.ݰaƍw}ha;"Og`>foâ; 25^M4@:eCeei8V^"W\/>^L܋)˼/ eO'Eb!qlcbCipA1x`&OWuuvZuG_x|leDʍ#ۉ;×e3o#FjԿQkLY_^oGY|ZLS>e [?òVU#-g0УCYY/֬?RHh1@&_$:1 π9ڒ-ӯ'bj[숦uzچ?^"܀[$WiPvUdSlkQK0&E"JƼ2d;No-# wϐfIr%m6@"W6_fvy]!iSFLRd?_=;Y_?jhG LK\ӄ{ tm-:L_ ;A{ \շ`1}4O֣ >:b2U̦CDYG,pD"(> @ F,x^O%TٿP2f&G]5~p߾SS 72ۧ]E[vvvG={,?~|HH̙3,Xr͛7ݻL&sƍ_~˖-۶m\Bi #l|lfYBlLddksIMDU"8A@ؑ.WQa>+# gŁIb$/ {JM{FME#G)b<N\V^VL=Oudt:gs"t5&''R~iKĄ߭ gꕷMM>fES!MFT 41K\j/2"¨,#revˏQ;.%rE tKr=j^$5t\7S.tH+ 9=)g"DIOg)rvt h7\"gi ^͚qڧ_jJ"&i5=郾=䋣Iu"XQԀ`ب]ޅ]XC_irEWAY\*AA͍~a[^[ pۇ\'%q \nSnh-e۱Vڥ2kR-4Ook7C$Jy9_.b1eVc6fYEw4Yc4z) .WĶ}O[59l9ںVA ˞Z_\@=:D[ p[  mMf,BIĀyQm #rFri5j5YՎ|^Nz9p|q뜻ؼgiA|2;]2.=>}^K^BPX"8A6.E╁lK"u. sJȼ~oɀOOٖSf<6T7=A]a-j- M#ӛ& . Vvm!N[*O`FҨ̻+紋ҫ,zsF\>SYS6ᘃ;vQEfYfUq-iPGq135ƣ/Z& s{3yOmqJ#>H=r4 w@z],#{OCIwԸt7#qt%tA= g?'E:;44;mx69 f\]> DDC[n66EVKn"EGu q%ʢ~=٠W:Ԩ"ЭyFQLʢ .hFTƱ0%LbI?HEXjtM']RHn(0t)oUکaLifK8ɫV@ZVI29x{!|eXy ²2X2GymɗI7y\?\`-N+itkqϤ{2߈EEYҿA7?O/O|ɷJ7E3S3"Ά~# >,!MhJYtm:19:v VvO9oDؤ7cYbTӣo\CZ'>S.`cg`m}Yȣo߾Ж6֠/hkI4b%~E[IJ^Cv|(7qx'r6e u^bһr_ġVNdw+#/M@@^_~*<ЁOfzepm.:ӵz߅/a2=Ցf`SG#ysT`mCW z)+me+JL;mV~C[Pءs^h=]Q EPdDoXe h@pPsL㇏\\|θqkLM|_hkoіƍO:G?u Zj۶mq;w[l۹s;ЙM6o߳ s۷8q̙3{Yf%kMtuuQ999N4Iyծ0)LhKa O gڝeŜ m!ǫ?RiJ/Wi4ڊ)I|Yuo}C[+,c?[7..o+hSԻT7_ҷFFj[Az:Ժ6{VEUبDj+Қڒ7%_5^$:YAr#!`q:,*\x(rZ95 %^Sg#yj;~g~Z Ais9j\r`@%QžoxߚrˎCBb*j3&)N&?W6 g)lY*k[D-jDW`P•~|RV;^G!5/dsƦ$-p N`fEƧ)0afx1K{"܆QP4tip h[ۃLgо;T$e "Z|iVi#F 93Q}">ugee gNk)nѩUK639ehU7ł҈Xd20-­1'n1WqNî<"jѵ::1b;#,>R8gǛ?_<:ߢ%7g'o)fUxRNSPqY_1p&X԰.bTtt,otWvYc~)=OS$X~xl;]Ko"߁h|D炤9 ~ `OWA(\ңHT.nHC) [)͑sHu.z`ڏ` l6pd q>Zb&3%.6ev-y\G3Sx<mE@Tao-} "h XF/Nłk3)={A< taAnU :4}y& ɍtKgPfu^5&`@?OއM퍇 mQd?/ K⁊AVl{Gbڊ_-WWו+Wۆp|DFFΚ5kɒ%ׯߵk 8qСC[lٸqիōݳgݻa1zMb& ~FGGm۶ȑ#gϞ$K1mfff_=&Kebb0qľ>>Շȑ#֝&a|)^F[* ;z#4UiR3 jwӆ {x;aW?`'-`:"_^5vcxcFCvĶՀBF_/b/u/$8nJ6JImS!R]VvgjS^2Nvb/{~)Ѻz~OCUY/;'[~zJM~JNRL'T*<8:B(SZ) :;kwdT&8LmP2`[l@p>1sϷD0*A$1Tesa_,ڀvPj"6햮B`z!AD#"@u cuiw$3I? %f\YNE\$ŝ(֭#jqz$FE%'6 (d6l_ux3:EE& "F\3F5*՚چ% D7IРrڼPyjOPPi[GЪCm-:I"nK[nDIhZOjml ɯKE+uOCDw=Dag׌) (,{LǥmMF԰=!oEx޵pk!ˢS2\!]k BD4'E7AD6bv FpH6v3_/5XE"l491|-22"Xy >T0)(` ~ mUfUDJ= xg)\ңpY6vhH8D$#**bM`-cI7`Np`9]rDk'eT-/m媲Z q۲>w͢1])Mh -hYn;t`#]E"t' D±#v?vaͰdO]P`P`BBJRO¡MDtLzI|Et'EIaO:4['A/25F[V ,,,ͭ¦Nrm۶߿رcGvȑÇ޽{[lٹs ֬Y|}J۵knm:ŋ%Z~a_5FIC87sKf[Ɗ.O PwCxD| 0NN>G&PRE)C>3A[?\t\tXuA6îwIx &\-krGtVi.PVkVijqz36G}/^3iWa Ĵjԫ9ٜ_pު10E *5 rE?PQQ-ZD[F[ᶴ,`! gӏZڏ\ߟ_o@. $H\T@@5 osls<Do%1].,}^ꛎR>uDZD1ĭѓ=vep*;[G[U;Ln;)ٸ8G]LKC+:kUe)e_@dS^)t*( Lx<9w`kfB Stvj`"42 ۝`4ϫM: +(%k-.W&B {ăp`j`ppa;~V{k4"ʫش+w8hD;S 5f[un(O'}>PEW,>~k8|?ܞ /73`5K~Yh hƥKOB_QH,9Os^'!٤z`J鴑fLչ".ᨎ TdT>`GY z BNipjl$_2˄ۆ=x@ʥ^[?5222͔f4__ٳgmذa݇vPigϞ;w~ۻvڲe˱cǎ?pK.}]x~n޼yaaa4:ɓ'I̙x⿦e~'ԟMGGw{>>Շ `(kU}+t=Wj ںvt7kJx0!$a@=PX2S8=hU>#ZBe^ nzy&ƥwzm EiYf|/vs'Hgnz*VO i;wg]눩441"YxQgWnS5| |3 ߷D;<,`r:3b3bJZO+acoЮB`KƽߋHETx 9q-QDar+!YJ*$w{¿kFպʿgdbnp:fTj5z7| "x*x E?0 *eu*u]w"ϣc'1ֿ(w4iB=wYxHE[] gH-_ɡ(~Жm#`"`!`%6 [#0#(!  `?̻ڒ[ެ!=/-WfhQA ^je5!~Ӝ[b$ƃč3=g3xX՝y>?,9"ٶ85^Ń`v).6 l]k6ݙ`"L ނPmp+cSZPtr@ V tLлMzU2Fa; |! -0EHe@[ Q?e @їu3;HhN*th)UhFU-%<'{*PӀ?ls&C-q nݤ{ Lݤ ;{;8^ oG=:)d!`IlmZz&S^/%Qoe~yr2^3BIE..ΨN6vc!}x'apd%PƧ,,B]ɕE!a_:9bٌ ҭͿF[zzzۦ&J3VĉWZE;n}^,ҥ˗/_r%޴iѣGa۷ .<;wnѱƏ?yd: `yFGGYۃF[666tz???x[q`q {>?^)g}߄b\F/>֧Cz0R9&i"2h1{:V9[ipUrtͭ o,ZBRR"[a$QHAMľΤ$Q:yGGDn3S1&`Iu31>w.hYkZUoMyfɽX"ݪv&Mx ؘFߤND&_bt53 Rw%3ɣK?OL"eeRFYkG8%ߓI=D\<wF)R7/', &LNzCln>l[i#$(]E- 5.9'MJℼLrX=z9>)9!v]21I]yB;xC#,"A ~>Ųx\M54;9XJkVS.axcnCQDfsyXq=/f12|%]ym)nVepz?(wfQV)P{6ZhWcE[Ss2|煬ĮE@"وQ]?F 9RG+Ң"=ܔ\8^If+rC6A>%C-doh6>3d2 Q1,z*R]nM?7)|umaMXpmQ֫τS2Tl::5;5KyGߋW|'ݽF~n6|8 <q;dV 064oK{ "@s0)LۊeqWĤPH(6JeQzF:r`[ {+xʝ+zID *||xd&Ehk?T0w^D;NvmĊ̪ld֛Ult"=U` l cm=@`i06;OM+ &XHOsCc()DE$^Q/QIx$m?2E)#2rIMR]vV'g4ﵿV?1B[7aTM mU(c&RjEPy>.D>-;ǭiաkek=j} aKCu}>[, Ǟ(, Okw{O}2DZž']%cb+/$UJ=,H!BSd{y@=ߨǸݮc&lwJԛzMB"LWtYbba$T"A}OvϨWe1PO̐勜.Um&b,5N>!>%Np ua! &a+{<&%_^ idwib KCoJ*xNO%C"wtaPGF= 9vTL.*}y{}itfu. J]!p.I`'ǝ%VT`#xhMja1pa*j52[9RX F_ivh,+Qxxyb9r l+sj- ڬ攏ۜbN3žLe)iW!Lǽ[NˏQ Ժ֊4z"S2ILҧ {:|/|ǒkf&thUfkjgZu_]]u1) ~ qrqar.~m ll n+0׌UiZ1bo?m#adHi1HJ Faru^JD[PLVJ k lGVlVrQt-G@"0^sVN cbrB\L Hq7dRA갦̠'MӮrmoA!>(ێku ?-nt8\nI 2 x HTGMR@8DQnEqHNrt+H=u P\`%t<VM!ϤOܵY4J -ʕqࣆ!h'5ٔVІ ^-"p}x5^|;y+|\Б]^YxDa#JInT0.Y_u0ں]q`YXX#X9G`}<PY Dx랈XG_vWnGеHT* lU ohw5򫆋J+skZuv.2]! z1#,_: 9k֬c)֯і;+|}}a[fffƍS;Y>gn_,X Tɵm)^*.GhU_ Usn VyJi)k{Z@[ Gu_|j7$_јA⭃Z6g h!pd^B7~755' pLo̬Gknk|/{e{3e~ mFҠQǕr4J'B߈ $"KVlrt K8? cnodi3rr4-#1FxRvՔEDAbB{&P%RI:Ax?$nR1o4<; 23qx`NzeQLES I%CIϩI5|fG E8A0^gM̥)W:Yڹ< mPQ]vMc_5657 ޡ[=)fƄ3J-yK/v\RlL&B.(]>=jIIA[IS\M;SիaX*W -$R T[Ɨ S!-m,zՊ" O %vu~X7awd6G'Lx j-*)OTd(γ`|vfd8kKi ljը cQװ):旙dgݶzfU4( ׌#꿢H'?:~Ύhkr 郬,YތL:⵺uIju*XJD[c$]pg8&)VnVoR%Ju3AC#;όnKgUeA{*x1L5y?x0;E"ڠgSn \3xPȣTh_7[~M/<&-qx1yu x\NۮD0#+ oCF[4BRv cs)bʱl$ IML>K:u)P.)xM^z^=U&5 ^,w$k f>[Ŗiڭrn pkU)z ,vgA =ZLvѡM׻G]~oE%/`"lNқ!vN1x.m=3YL  nk *X#XrZ| ~)JqJ;my6B ܦBfH*5 [t;4E*x]k5Y&LUA(KaQs^Pߑ9gܾ0 40Oyx8t쐰@;eee;k4}TTTLL… VXvM6mݺ'OgEիW -Zm6wޣG;w^H?vؑ#G<~Xڂ ఄ;EPw1[~VY;şB}gMhmb(k|nHAl}#P5嘥_6.n\]]tBr!O@ZPϾw'՘~κvjaو` ɶAܕC'Io`ɦ>|y]>v!%c?mdoڥU-3k㫗qYڟ1TYh 3 +w͑!֞Cι-œjч/~*( A4lٖ"c.p >9IG>"kRy̤BS.L7~JLz!R(TRz+b\aGv%r9' Ϣ`ƩTVsӈ "P!J #gŲ}ԞլՆk,>X')T8WckeiSyrקԔgƩ!<5q78s0V;R\2:^l3٤\G8heXDT fc25qwY~mQ5ULClLY#2E #Tn"QʐI6՘i yHI^]03̐ɖ{|Ջu 0+<4GbalcqdrO}n?^v?qrsi YVZgUjWjlƿ__,bVɺmrCAfՆ0OeM/F-:aQ=$6YCDwR% c&eڭ#$QDVh[tY LG<,VX%隭9EkBLnRy~O궿=Q.=DvuC?yOUWZW~hO"'}n%bfUIC8(,]zعQ~2 !`%<D%\ؔ"ˢ"zkvʢ ) ʦ4i!u9ru|X|T\,$?R~ R=.z ?SI/Ak ƥ X&, ]JI{ܪ0i&MrF%Pʨ2ne~fҫ)7O&ϗ^+9Op},C:?0(D*ӧ1Qh"ae/Dz!l6$ үE?%R8s`pZlC̗(^ɶnj1`5u4kfU"JuJhij G>g 甫6GDMyԶ|>i 6 66"XylwyϩI/{5iFjwywlUsǭ6!ߡ-33^Es-m( 011 ƍlٲm۶;v7o޼i& _pׯ_ ,]ުӧO={gΜ*?O:u  `g'NO^wr%ڂ7CofxTDDߝ7WW׾ EY>;ڲ_C[ 5a Ab)b/BO@O`dy1wz](qE1" <d)V)ӳd"/O߇vjت^^E4F=ӟLL./y?|^ =]2FO;9԰q}6_I3띂HBS%yLiMɜygǗ^'^-,9.R廬{,+w_'%Vm<#[sW:dU"q-:&i,TYgAPNTLh[.%M )<% OC$6S"ju):WIZ6TDrv29ތaC5q >Ax2^Kx:R+̪@ <$LEt|̸NnMy9;^+Ԇܪ+w!=q\Q|54'syUpʫMPLԵͱh+@QݬLC τ=S.D+CcBQWDs+'GB+: 쫸m̑qM[c81Bh`]V-6qT!۱S0^SRXkwXry+f|xn5<ϘMY^13gkA59m.u/8[6lU-C?wdwZ~\cO૎ga{8zS>d$s|ZP371hU G#v6/d}0rt# j.7TgR@JBD[pDnUTLsnZ3壔>]_=ܳy(pH-ΧyU^W_Frk@x?ٹA;8YzuŦM.Y;%=nk̹XX"qȕx$Kߕ=G+_CC )UB<{yfW `SQzV.PRLGṿJ)jҢ4hkvG`,# yBMˮŷ@ <0%J@pEy܋(2Ү#MiRf`à`{R`>q> ;8ʷG[⋟&_Jʦ>&?$gޣct0xjmҫ&?`Yd`y8Pp^ }0vXu=6m UwEs_vGerǔ۳Xzti8MS 3VJKESߦʹND)~iWLQUfzInY %mm 0v8 [{ [J}3oj3lo';xܠ5V\ mm.EV/뀅#""fϞ}]vٳ^TQi6lM6wŋZj˖-tyIK9sԩS6mtŋ'N8v?݊7o+… aH֭[~ϵ~m[k7sf͚ӟlehY,O>&emm2UaЙ al* 8D cI?@[IߛG[z V!U| e'Z@[5ԓQ7Y f a9ޗ̼şD>e#VcMMZ=v nszT;Tkdwy0$c4"Zf#sɖ'_'$H&ȦH.*_T6|ZҶG+s^=FxTȥZdq_rEl 6&KΕ:UxW=!ml-vf!X@:lʂ,+Yβ~"r@~}yqyzuK2IDjIrݷ?cēj uL2[%J"_ ~()8*bOj%QEE8ݫ̫);`<2UY%̲llI. S@_" hOw|yؗmضmd^lv=&Iq* |no3uY=.e>oɠd< 7M%:L|Kע.f|%.Qˊ8lmnpP42d:*K=ߏW@Rvp0IR:ũmbttl==ƍBuq=7_XzB⎼%"RY ::+a{GWMƕ_ ?Nԇ*aj#r{W? A[u@[_!'UjAd1 l.zԢSqcDU-pĚUJNk!RIܔK鴉SZAO2>P+|`ozP]_,9 Ԯ~$y8KSokno4bRVM P(wΓe>OFƞ 7m-B@Z4HX~o "xT^U  s>pntuXf\z)bi&z2bLӀ94^x /"#x"TF.(~l,D]ε (0,AȞ@.6ܢbSQ3PQsyWb^Љa>R?-2 999) GgRcr),IǦ`#0 uQp-jj!j~rW55! -rEcseH<;;8윝=<<|}}gҤI߸q#ؙ3g2q ,[lÆ k׮]f \zu`y:=2˗/_bѣGϞ={̙lܹsa1x+-6:ںu-A-{{ZٳgK[^6xOFDDL6oNg}g}hߋwb+0UԟӳNOs (@5 'w(6{ٿqmmsk]>̲?6yWdd4|sNFL)nhض[}t_ě4 l ? M +!l UgQ?]-&Ytq&ݸS.jޥK}0fUB}}]7$17y<(_{4qTf[c~j#5 u F5N"DCDʹȈԍm䑝|h\; ePcR!rF["0 x(F׊MZڅs9a$Td]F4y:U2|̴Fa|T!>1͹Ӯ¶(M\̴X͘U!Hr6]٦V3d~IfQIY5 [l\sf9q\  `]L3{…ݣѬ0V XH"y[ƪV 7 r8\vfg{y30ceG.elB]֣^׭>>vIZ4S(iPIYmί;C_CW_j΍IxpQUH(NG&',/]WaE6ju<.܍n؍m=Hu+5N7 (ow|B(v`!{`{t~t^մhkѿE[g9=95rbrL9:9]mL[\'{5ͦ4VgWqJ_ JSh"S-ߟ2!bJec*8я׏~Ա~ԡ~Ծ~~tѺȓ7Y`PR Y@xkoAhm+ut)uy$z?6M6ޢb kkZPyT> U@,i[K5 hPŲoxja\ wI'SQ tN?e@C09D cW4* EY3I+&pZVI,Eb7x=ɜS %-^&{G|$V/<.|Y|K296 9f\w`>3F>;=YrOR |{Q;A׼'o ^@ЌB\;wa\#c/XvQtɺׅtOK[Tjnbjt6 Ƶ=frJu݀j*T$_S)7Tz$tة;«Y+D}bsdgҧrB"ˉ;OY?|Y?m!buwhttt~-7⯣͛-^177 ?~ԩS̙f͚-[,[lʕp{6mk׮ݓ6( n?͛7=<5pB/9a„np(vcbllwZ`ۜh۞)g}߄ ջ&q°CPgt NRj" B4bTB֌J4x"x/7W)VIEVswJMY7*CmW88}ubVZrbf !ks1fw,ؤ5~{Օ~Tm(./at8%OWfY z4~y_/<+]& ce[^ӆ=FI-aV&.8Bm\~ILMOA 52^RgWX68Zj]%6/!kpZܬRl%lA]'Ϥ,~XN]@w%~e~2N(\#pʤ|Ec1iIs,v#]tυBs MoT렄!T3_ H'}oQLқiUi˨/+9ùP]^Fږ6yC\^Z^Gh6j'd/)[֊LbnVOQ ܺu5 cC}3paPi կ3Yjc`gbEf]^)YHe-25D+­j :\A]#1`#UFUe?j⩏+ 4_aiD{ܻufo^^3ia%1 u}=ł^a[rZ-S*-o>1XX-cܥqyԣ4ڊGoǭԶ.[6xH`t8]֯i2vV2 ,3ڲUyeb2\`іrOB E؏xDPk+C/SlP Ɍ7HإT]ZM]pLݶ|Ld{9 L;㛯J?!˃)([|3ɢs(/{ܵP\L8+d6URZY̸If"eZfBRn'w{O$SK΀u߃@0A/ Cs-xB\ʁ-lFܲZjQ#61w4tWvXgr$"ob N_%0_و=-YMH:#E^& I%ƽOW`^2FwNֱMc?Sgdr޼@po.EXrbl}wsk+ބ4nHf瘼vy]i- ^jEآZfQMZNXȞҜ(F?gBnڦƽ{L'4SC -  @#/ $$$$!`z6 n[,˲%K+ihH+yyYZsSɌ&z`'lJkoTKnR='ebz-kω+?Ǜ,ѯm=5REFF&&&fdddgg/]t[l(жmvK/Q+ݻZqϞ=T:WHO:E(»[ 믿;2:YnBpn[?CQQE[6j?I˟-=D)s.ڢ\l"Z^xn#X"ҴdlhKt@sC5Cl=fD[\>ע׭q[X3/S+XzDUYASUs ;Vҭv| w9 Zw2N%X H*i,V3WVժ7k i3Rvi3 ԩ_Ư_l'w˼dep ŤT̜t9tY:Щ@b jU7PBs>/ʗfkbtQ@\1H*%T1:Mh:UסVz({0;CАڴڐJ"HyUFu^ o9ՙJDԁFLv.'l!qvrg;{nuP;w׼՟+=I+ʷ|#ϹXx_Y"J E|ž'r,% Iiok}wH{5iG59L8}cͶ/V3)f=PfаdjDxd-֨ 5$xm+'V,߾).UGPhk$E[#\]]}}}CBBbbbRRRfΜ`+V,_|ƍ{{8µ߿[#hk۶mC';*FDD[Y?K ;^ߤ5 ~gg?W6QQ5jڊ'iIcnϾcǨc0z3`1,滵pUw /Lܱ}|;PzYB[4r:EP&μUΜVͦ.V2}.AccM]3u'_VW]f_ͻʺ%ͪ+.rÑ%ף-IxԭMɕKY%5S*P~C;NRWƪcp¥{ؿ8Kڱy@5]D}"Հx`" \D3]JW.o1sʯVxˍ~Kik潞}=f}|a|Šor} )a3mE4>.9Lr64ͳg go>5}ܗgo1mڴ/hr_N$\ذjND[i$ŚN:n! tي$YV"_K !|pTy)Lɵ rh=O< #нKӭ$ݪUON5XXN.ڮ{=Yw̗>eo9Yu>Y*KWthxQh1(4\fOM6Jѱ7Cƒ:1e. [ҳiU5kkaDt_KץQ > BGЭs.!@]Gw]gh)#.kf/yN m<,^tOU,IF5ɂZ 5Xx:DPzȼ fsagWB2 *K+Hx\(#߻įqp-=]Ix(N}ʸ|*X*1rEl$\[Ĕ>+ƗJI4QrR*IG(ÛTAmnGy))b란n/ w4nԝyU{M6\V,z ˨D=E(a5M~[]X,:zm1Y{=Fm9=c9;;{{{EDD$$$ϝ;w…6Bnݺ}v*,qYk$m7x[...ڂU8pȑ\x/G'4::z7n\z= oB̬!Ckf-s KEz:꽶!&Ds"b[01n۵VؕW١ڈ`Lo#1ͤnm=6Ŀb6]ѡpk5j;ŮݨpoGceEͦ#Wl͑>BlE:~[7n608Ҥ. V}[{Zqi{DE{JMT:LY:nia_JoKӿ)x}Bmj%Ykh""F[esyA\k <5.6̵pg{.V 'S>@74~/|92Y=nl"IYY\TVH#Z8vá;kXQV^ƴfta n_a{h:݄yzNXx6:1n">/h ل-:[a~Xؒ <]8|ngէ=k>*FW%Sg^.ۧ63n[3@-Ѐhru3=\ZOZiN:E :@K۝;YK_ -5}}YN.:rmf`R{tA ` M#[daGbR $ڊ"%)I^NqI֐ –u tt댡#>zw)L>,*OEjC7g^幫 2g TcġTP^p-P4="2JJut2UǐQ! [uȽʀzUH&L_B$҈do*)Pz/PA,Ŕj@x-ZmW<Ufi7f#h*ء%37)~sh=~C~jp|0Q܆2nLK̫E߈רXث|s̽^K[|6_@]W1Q]\}IH]KnmE ӫZJ3nbzׯ38"r#0}(%߂JZE~^FV0WpcIw$Qzc4b>VBXj&YFtNmb ]ʏ^{vwUPl)H׉zu:pMX8]t,\ìcזl?nQY{@ #=ݱ`Fa:peΔ]Q~˚ mƋMvhx5QWSW'j+VWħ~zz46:TPJcGܓ$Qն4J$2,E=b{.a-"xK8oGbOttNREV#C-Z?P+Igt{5tKJ>SҵSYGU|lx(K)d2Βɼa`4!pv$(kۊ4~˔2.knU+, a:;6P|K}7h7@yǛ^dVʢJT 7sϪ}ڸ ǒ+aܪJ4}J=V*cj=Crs_9w"]r3SԩQN[t@:L̿Izx+|Ǧԫf? Zp>SntW>[sv G]m4q&LX{{8t8hV)Ќ:igЕAW]AS 8e==>k{&Z@]eEfC&o-1ںD[6o[t"*%/-a=X!d>MNB(҉+ 1 EL")AtM'}BHOzvetk{/y&S;-  t 5$j8^qu$]Sp m14UVUT?NzWn80[+! $ }UIb%>}"a߂3lۋI}2m .Ly "FU(Hku¥qe 'ILY=hrhn c6p;{x|G?lY {e f}`uXɈe < 6fǹ54e?zBD-LN/ N)_˨T8:|{kR8AϖeeY94A]teo95Ko㳋*"չ1a&UOMbc`<C 곩 >%ھO*mQj!~_*_?+__$ [=26RJ$ܑiֵ[Nlň=^hwZоϹ/-*7_hh(8ٳggee&/,...222$$$ mmڵСC'Nxw;vȑz[lYx1[^lnݺsΗ_~yϞ=ۿoOԜ9s`g``)IEf̘a.Ydڵ˗/_pM'gr۶mk֬]+R{Y®ϝ;wѢEpV^;Qirrrي?uڨvvQ%OuAhs,Y#h$EEhӟd{Hzm1ÐizNҭlɎdxG[Y .!;}(u+}9_[ ߵ0: |}USq߄Sc3dsW$VdVgU* E'N0R~WUK¡+kmy SyVjN])vD5*Yt¿Ry[L-;9]\{ fɓMtZ=ՅitO/!6|[&PZ iapdn'Js怓Lhjj׹waq- -"VoX|d}Y>=ծkKeB{Pp} ?=2#=OP~;oMsxXj.&E)GУ~eXmzQ^ ~xHTzb4ծtl:^t ;Df=J4 kqۘ3˰n& u)ωE5F;qNG&wj\H6s*ee1?fz?>("&WȵXTMhYtwэgх%=AϢ-^׸ʉPuEPz%w?&ڂK5eپ,}OKnk.3+X~&"M+TI2.һu}^4нn;b{@T_W^0V\~¸D,8BB"nGO{ok_s=mB[A02Xt.T+cנN4d!yVî-bmҋ7tV *At|` ?S]xS[?|_^vmvv6KZpp0lhΜ9K.]j,2,+SE%&&«0-ZxsR˰Է͛Y NŖ-[`]΂ `~VBB$gW^ _hA`ɒ%,ڂU̚5kt]0j6jhkm(@[PL3f05tk2Y!h$s\ B07!DgսMS/.3tB0MOD};kv"_sdYao=Y7ZnXv[*y;_L낾fB8 :qP(ôw>l=ںɾξ*{I28%cuS m}.rߗ̀-wdV; 2,#q4 G~'젉@;EBo.@z/E4ig{v zfd%SũD7zn)ק`{ vDb)׫p^i12M@\."ffچz~whK}B7Lle;A}+yzk}m(:@̸zUE@r.A\ 7hb]u_A%S}՚aϼL>Q0VPy}YM)ēEv"~={/:XCqιくϰ5Xh%g&LJ˰v fM72$Z |k }MEV»c6mԡQ-qZ8^\09S{xSZen|@j#u ЃcǶk87Z+^;ik@.<.ܴ<Ŏ[7'nD~C}?F[ht_힋NLOɋ nȲG-Npq+iaSOOXқ+TɸӰħz Ǟw-$!`+^o' sch.U]]n9Q~DvwhTd&1Q>|@#o `G&qPϰА|D?Vȱd]Eqw3/~N<AR o>Q,!`3[&pZb~#c+蘊֚ˊ'n^0n t ZCՐ1$z e7б t`! DTh>$aɜtM@6HOd^#[qF#η> m}߹^uVE~LEƢO,wn_Y]:o9ں< Pc)[Q3 Tʞ,g;Lmf=v>ܰ"a-T+>m t0UN(ƘbZ2N3}+VdeeF`-l ۄ̙3ŋ/[엨NZZa```?aFpTʵ,** yv--ϛ7lzj7o Gڇ+Rt (==V}sK_@###tɒ%CO{xFmF(?%$$:ENE/&ʥH|\ J=bG (c-7gqZhyeբ/u<Uk@x|`=ŵz{'F\\Ol {fsY$Ux #U!plfX5QƚD15k3,Cl`k*O 2d-c,DxW3 vbㇺ]h^rx%M5 :o:ozBJwg^-F%Xw, J`9vz>4l3ĵ[z9==,fN`5?M#^nEN $)G-1I2QʌU񚡱8{ k:)-,'`G5g^9){h}~f` >9dhЦ( .2󴋿>ڰqgގ'^Iݲ?(M,ui$d?іݏW 6P4[۳h رc߾}Ǐ?y$z-x~ũX V[w ٌ3%]+W\lYbbH`'accc_S 2?ҥKag… W^ym=8Uw˖-`Ŋiii?Z ,ZfͪU`~ŵ1jB~ qm%8QQ?Fmg |ymhE*%S> @j^U2YTF۔D}yl|a<2I`|.B~\EMa'(2|DZfʷf5ءO?o~n xhPm ,s~`a|z5V#tsxN(ФUڵ]eVS IL$‰Ti,cMo͵]W#U֫CJAM|v^{XZ+|~,()4t_v:x[8rx5 kiPIkW4麀>̩K"m#Ĝ;!KY$3*"HTBӯIu>VV~e3bqY ;xF%Y!U3k[eʘxR*&~{˰h|"Km&Q"qt|z yK:0^{ { M?LrWc0E{N"sg~q}D!ڂK}D@J^dpC=:XϵIDAgVSǭgK\+F !SrQȷQdiI)zIDq|":7>7^0ЖX0Q1 e q;Mjid"*HR-l ؉Xm׌vhSX=X~̻2G6 l{k7V ln=A[;^BV?IhHw/(OF;͇8ԚZo*3z'hc.C(UxY$рk5g ]ĞMҠ*yM|OuE[3Mߢ+ ,ߑYZPW~ׇu٩gcqpmY󄋿-ꦏ@\=g~#>ԙ)par]zٮ]tN@-?BS$Med_KRlu>2lB2OP{)5%ST5G>PxN`N'" ݓ9}ACI e6U^Y|b_CYG=5Cڲ ᫻ -48֮]e˖_|'O|w=[oD#Ra*𘊅% %ax/WWWo)//(ʩ@Z?W\9{l\Zp5kZ7no="Q͚5'--xs禤TD'%>{k̘1&mi¬\2<ncWd$((ht0j6jhkF"##h0m)!L{R\kߺ>ZK/ zQY/4-ؔA&_|&#X"XB!<ҏ ;-E,A> ؃13p׌ɲ9Jƪ YA4O7~ R&+"+ ctd`ЦF:B[]tn[_Z^7X_go}tel~Awvp<^Yx؂ nt6-ˣƒ[3ήIZV[~[Wd?F[EM5i_-.KNE7أZsȼX#Z?EqPZ1?ZB`2F%τU<2 qE idUxmQf'7͆; 1m؃L {ȁ3h+蟊2=&oVu8eTȲ䳭8~cWT))fkm%}IUQ  }JF nEo9_?稵<GޥPz|Z~8 Ckᕢ2Ix;sȑ7|s$Ϗrq܂>>>l?O, 2VQAAA/zժUKfZhڵkµ(BГ}?ķ o4|-FbƝ]@;:El'}5N<^Pa6j]öCh[C/ɣI(͔+SR# m5)ؽvvnMpt8Ƿ [ Veq J6=n V[M.%9zuMЂ4L3[n[GTw3ir,c;21n="!@~EM&I-[eqU;ê}e/p_ Kmqɢ*Jm4C+w75AuFJXp _d%|;7 9DK*Ц˵1eZ]^w AH1X~̽柢И=BԼ[R9u^tS4!e( fg>ÐqCڠ/71PZ➕XcE`!X'hD>NX|F X(6:/zAG <\2Xi)&(' 14a^GW^Gw((>{I^-1s\QK3Ρyޟ/?ZZ[p]%<^s;mpQw^/n̵;E*D[VmyJGg(NQ%?Owgm "/I<~$ %kE qHm$:HC؏䙗 ݫ!CFU5N75AQ8QLP3unhm'q yyH6yǦ *nz? !H}*8k?:hA&>Kgu@b?ķ-= z#m4Af:3ò8w <[Q? {ĝfVc7]4F2^>Q5e XSylk'A4JUHݺL,wM/buWңk+cFU ehr΁5?(ϴbT(m7!jId%]ƗJJd^4Ur&PVfDXQaFL8I9hi G *vyqCDw%ǂ^gATy@djwjd &f#yݷy3Or+ |B[w~ mQ.UEѪj; WZm۶M6_>''gdg,ChD R67nܾ}oRhk$ u|qB[A`TqoZ ~i֬Y|uk:ڂmžYgoÆ .xlٲ9s,X`ҥ˟eQ\kڵZb?w[~)2"""11ʵ/$Š?o]&ڨ(Q_1OhOGDzLS\m'|a.#0ClRY3ɔ2`u2v aDcgV` MG@A}.l`b+Eq>}/#Y"Bգ-}-70^R1Qjwj:."o0wbҲIbiϱOU U ` 24FPyBզ:I<#D5 â)CYݿJvuzt;JhvG+zts. ߅9 c(n"Xc񠧀5iHcխ^t@ahPM xS)M_ [jk̠8 VWCwlu͸}6 k7nI|W*[T~NSt/{OCP/A9F)@EF4,,4)&NY(<޷亵 /` x:!Qukaە zOkы6:jmP9rww1ڪ-%'Rƒ,cL_Z O>)J|Er-*BPZD; `G 8 ^![!`-^@$zLõ &_ ݆7c4U=˛ 3IlrP`߉1'pQvL1Y$~ϥ[# /U$f3 bTb*t|F"@P#n@(Գtkd^-w,X>Qa(ಧ 9w{5kaMhP;ϧ:Ȱ[ʚ&5ctU#MXel1OvM3̆X6,S֪Ek3of>g iޤdW-F5Xxd8Z.NZGcKU Eʔ|E}yf2K{NiIeD|ޛ4Y?X:yZ(蟈uM4VbM8B[ܞi}]ÞrV_7rⲦ ,eIqr֜Iw+O$XrF=M G罝~❰-gxwZz+h0/88x޼y7oްa yq^^^ֳшښ?e˨]vٳùT4"ǭ_B[TIx :Qh+:::)))66622244V%.z)m۶;vazNė"D:g[#]z ,\7>U鈆a2P~l9g@G斑}[2=u)PC1.PVPqq(TB3 9KXnqo{(*'k͊y VQhK>0Q#6 M%W5H# j#yDӴAtC;|v5; Z{[:nE1}CF#Vl9+y^ffCd& u1ԱsѼK}S^yT4uuvzvuzvdQ!~P/:ّzȯ=i_$ ul7'*FԹF.jA(T^Vr|q-0x9W%.5*mDcO4Vwm!gO& )-< 4Oh_ .h|ZuJ(n1vTYmDp<0m8\*'-3 6Rgch>:?:#.75YzR7[f>AS?6UMS{;+ $ S "@h#fHyjՃ:"CЭ[c\4R*q&hp$T lV+#KԉUҨFAp'ۋkԙYP BRV7S'=C,}>1=(˴E}i =fgμ){M6b%lo9߀ mQF^)%`S4jj{oԵ}/AFAA@fyePQ@mժUXRǶZsT@dP@@aB $;;[{-K9r_+WZk$]_q:*W@/^/ƹqhdl[Ƣ[15uOteڊ\ :9MyY+ngmd.[HpGUW~hvyJbN~ K?ӧ-u93"l |f8 ՈmM>>99'N\84 r{U[*WYenI3mM1*+1#lXUQ%|ʷ@2r_<-Etc.3BUIoޑ %ʹ5OiWOts&c (αN=YVOageI|]`v?"6[bW7PIo)QNT:6 M,}ś-7[ >OˬJLy9& ]|r싺7xNyngWg>xrP:fnB%d~JLЖ-B[>h "Fp@H[>#L01bОm!z rA\0cF0Ж`qSĸP=c[n j!hWS&o[ |DzCGR'~F[^Eh҅<5=5qVU]Cߣ7GvaĤ|& (b_Doa [xhQ$i'-GDFPW!Аwkve}ߘ G wđ-\ǣm&`8VI@MY|,U#tEO:G6wNb*e &&IL=LyI;F#ܟyǤN+ݧ>{…p4ҶmQHL;45V?&ՃYL[^%oҢ4}Zr\%oגZ2-yVұyqK?lе͢]7>rpǿX֝W/ҭ`̈p}3b-5ᬡwyg˖-'N }1q 3myzzw( 7CQXN(Qi?Z/~,X e8%칼5@@«} N^Dzz쓈`L2Ŕ-ڰaËh / hŀ W ~;vM!J + `{Հ}A#15"I$?E&r @ >"bqQT.P`JD2=/ʍC@=(?q@Pl(P$տY: *=^~VCqXx 6[˭1%7i)gQv ߭fVSp*V&#`QK۵9ʃn֓I>2v+M>}턻;?4/1e/d.ZEˮTILyg-[¢-K%=zMmջKw?4@ܡ9yxV>N|wYxN^m5GfwP!ӭ$x?NUpsH]Sݡ#AeqqW"GbTGN¬DhL2"9GT?]j1}V]#f#iC{ͣFpΊ5cuyTQWiui aIseܬvO璾ǜOwoɾ_s~%n~K^Sc}Ot5"6أ䌟_U"krrs,y.ܪo;l R^ڂwgE[/.1''zS$TOM@[*5[yTՈb c-w8t,+ĵMHc[^ 6F4 ӭ$meG Ph,21 ÞE*ݢ "@>7jSK4S5i ԠyjMZ9á:?pR (fT"T]Y]񞺤IEcD SbSE=EN:!kV6mhˢv>noh{LZ}rxѷ {9*/V^a}w pQ?.^3DA5:m.8=FPmԆl҃:ڞyCІ1u]&/8EEsK℃39%}A癤kt\aÏKwƟKxDM(QN('t=~&Qɥ(ݪ%ekŗ 3,Hnl,bпI/õc3?ٕrTbNIbjČKDM9246[`;a gΏꖑ|b߯ז :%5*Aֵ SE{O]+v>gloR+5V={ƕN3esV+D[hOF[fE[qh+#ċ<H،|A^\k:({F,Fk@h ̈JL&JٚV "i(=$fkZrmG;*̏9lC`  WȻB :1=.eʫP,ͳɳ끗QwЯ/48eB3W!T G=9IlggW#vH#R 6P:-[4NWd~sP CuX ̈́B}iP)2-q>Qoo5kj赫}BӞ B>KޕGVPW3_122o23& >dba¯7R.ZpR:8NodWn5E`3ϲS2KnMwVMvx;x6--m]:z,S]‘#;Gv[tT[tTX?u{Xz%B{҉o+2'fỞ;,|B[stKqpY*q[ʫJT.[**OOPyW޴i5nqF[p\UN b{h g A⢣̃|}}*hH:\uYzUCwŸw姩d\K"&MȊ'#lڻ̚ڭĮ%%}yÚE\:dFvmJǴg̽Cj^p*ѡvmM۬6%r[Tm*$9uu6?˶u٥-0jn!Gr nu-&K+D5" mOEm_7ϯ-4h:Թ՚bsw(䎽P)۬L5>; x VYKAzh ޼mhkkk[I E6dTQrAhz?@VʕP COh $bfd$Z \Ոqc(j66NC|s0Gs0skt \Y<&ݟ;LXjY3utpLܥJZ%rtit[[6[q*r((NxS| Dcs<&> |Vè}yDy&IǗbb+WzK6 xF1êcg_$ꘘqSC]Ku磑bam5&YPl5M4Qj[U8PO(rgl#w7_#-J%\TL=M8LNj|Ih6Ä /?1aYO탲%/LݧٹުѢm$@a;B@/PEKuicUkygIWi *[ݫ\S}8&MئQd(m;W<5x46nkU볶~N;=+=-URt+99yҤIѡa"7L|So--mK.]fͻ;ydUb vT Be'PXJz 0*E<o=`~@e+q$!z<&%'*6<4ۺAjǓ* o6^m|)"K<'OU1(yHG%E3.ucSQtj*|4X@Gn({-m4v{ڥ &ʦAnW/S'uN5UǒqER=C܉x5C zƲH/@"l"i@hb x i1b-/S} l٬-dH\4$0 TV^@iP?F-g%^=ÞT&{cN8^CD.zӎ]9m=]sGvэ7L,7~d;s[KKFXu$B9;@M,r9w虜ln؟?Uץq-֝|m{xA$.ˡoG4FM5"AiTPJoy8Т5wFcǔgr*MHrʽ8@.9M^ȃQ*1ɘ;~#OnSN?'$R/&yڴ+{BvD@Ge,'<@d(nHOI7g.+ֵ> (}YPFʩ@oj7rýok|o(V_Dy;hz#m֔쿪}ʹޔ:蕠wnGV[j*© /znSQGZ2x_ vڂQNe?ڂHo ~=h>떇VMwƽӖCq]NﶬԻPVZ)]o7l6--5&wv946 #UQeQ "bKnCEqi#WC`E Nʬ6*LZ=Xn=&"L Cs:2QaS8ݤϐ~Ϫ:wԍq \&Ҡ!ߺي䣂Έ/g£y@8.^-5eu E| cĩP2NbU.W?2__^ U; ;<۳,K9iXfi['-Kgs2dBQ 0%&%A -'k`T ExC yeD\ЖeSk ˲"G\+' U#L棗I議A~\ -̻b{u0X_St|`#D#P!EK DFDc*7>4%L=&&-9ָ2ثL@aPsB]U&\V.ӊ*fBeL9XxPk/>SX#f/H8$YScO^N!Ƴܡآx!%&t%~ɰ>APDH{=}DPd;icģPWtV9Wff& x}ڂO.2SO0i8ef6;>[}|Sڈ2k GOC>ҕ<7w  Jfzt H+ &?+vD<I)24)[65">W"0 /ΓJCsЂހG vm5+F4Z?B=uѬQl֓\meffΜ93999!!AUk @NRSA KKK{WZ5w܌ 9N fS~m6>}KN 5*ap&/l6JOOf̘fN F[8Meȏs`Yfa! w,~! z.MKEHMM+/߂Szk/(e˖?++k͛6mZnp=P P_Bk1B[Coe#8HH֬Kg? CI5wgxDx܋Y[D$J[xM)@!y3<=@hvB[p@j,ŔICey\l1/K@&*@酠Y PNTj2b |ѝ3ESYh mHeѻˁr6稉'~0+:`.ݫünFإ!+n*9|$Ji 4]QF+__VCrJ 麕:ܔA| zP_hP59DI~N8N(l`p2G}myfYc7Py{'ˀ#PO[Ol\/_%yKI PQm͢-eUeӡSnijtOY'GNqI/T"u|F6i9onhwvʡ Fwט#.)2)g)*c:f}0~݈>~ܱXDCSԢߑ'."ZZxM&mM-E*,pp(iHxZOEVGxopf.yc ΛyKhkܸqE[ğ Z._4kWɰ E 6a,5JA(jm#f4Lq`TR0=?=BtVm9T/p"9Y6=\d E-)єkIkuv]X_,Ws%got*]<=Z=Vxkd+L`]`(Ys~P Z_+>W}\;)ܸyw(|N< _zPt1S9QEu~U-=yʛj5e]j(Z4nM̈䤖\%גize=RBǸic)9,{fw?0l(;@-b@-`]+r5:l=TDVoL5"WHі\6#y,*6YE3iȹj&hv5/޽`$F {-4urmb>k8j'=\c*%%[E!uEF<V{nÅMI}}K{=&/Ho{x4GG@ ۛG.ScizyFo;R$0 < \ƺ~cFjb˯E?S*]Wio^#R͇5c+OVP|a ^q[iuEMI:Δoxq+_/)3*-2hn7Y M|3/,Ժɰ_ys`6bd줷{޶F(7b%CԢS:*<y&MuvB0M@1` ` $B=~Yc~b]iD|9*|UyMY G# / .%#.OJf77?]Su/[:43|҃{cԕW4bMYQT2nVR~:2r73cM xh - 3qPpJy!EB㪚\럎iowDnY=m~ڂZhN-N\) %|&>G໘,]4333 """"00p„ 8 ?w:"JKKݪf&MC&BgV`ϟ K\ILNNNIIIMMaŋËZj5Zpcbb=ĉṰ+Vk֬Yr%GU>t$+֞:7#ECr#Z\AS 5ʹlbj%PPـPl/AKV;aqqO@u0Ĩ3Ʀѷ9gh mt:<Tgm?h]A,WH&ЖⰆng&[ܜa' 3hgkH24U&bsBb,n˷lͱql 8@uJqGʼn|.\g -2h4{p=Li~<Բ>QW-NR/L{WV7I-JJMIE4ӣh;p[WRC˅q<2y\׃vml":}7y8@.'1?86wh. #?xn u`NBM ?wkm>r7H$aϜF(ʡrBV@ʖ*B4`4)]6( w@X5Yl#sEm4mMD(ONb 1>oan@g5 `896[| 4 }ÛFsr*;3An .fK̍̀5J{S]GsU_sbgUYת/W|%\`9{ߣ¯Љ'31~de2Uh2 R,kLU&<# ?j~\7.QYlB[ ^;mFDD]\\ǎ2/~_6*ƅ)%KN2Ud칍U)a/Fm222TOSN'''''OE]ቃ/5|o޼y`rܚ>IKK3g΢EzkٲepTP ^ݤILbbb)p֭[իቋ/}N584jI¥ZgiSRRRxv޽k׮;w;_tE!F[Ctk(Y[ĝ }&N{&"\pVqn=3ߚpP<}3@6q2+"zTd@KD#YI~U-ko֩`uc~CxTX8߫ ۝³^Xm;ߢ-ş,/$]hß9@hBLy,\b֖׀ϼCᨁDWtπ+ȂP.TCSݚ,#9a-!Xj?c;@!+^F,+\̻Fdf~B[(^D.`(p܎~sv]bI]v߸_p' 0d0 ^q҉*/WO>4Tcm?9ژsÜ#s;ǚɱ[uZ0|O%k"ӷɵήy_Pyǀ 0<4zNVNmQQWySM-cng;0vyhxV\^YT[z"JI>7)[Q|^9cUMy^ӠJ45Z&m@Ϡ]lY'q(/ Nŝ W!3L%ɡ#ee3*pwɏ>vs/Ng%Y~_ m r}l6XἬ &`x|c\pD p'O)U-zqLmHE3TZ/|Μ9P=_D[n0µ~7{le˖.]:jEL#1)) oڴi۶mqŊlks\ v{iZp1 8Th$W~pq)Z;vx[?8I Y P B[C񧄎myH L]Λ O>䇀)݋^iQEe~{"c}v;B:P&dKIlu!h@#5P ",76vE?'xEG)pjo7s<r 3iUE3VsRBg꽡,mŪнqIk^~;M zh wm1zhkzMOl8vwDX*;,'Ah50,] @۴ M6O[+[˛=+ݟq'OKO(Ͻzz W/$;O)׆vfLJ)QSQwET^Kޡ%w*ĬqmyEzq&#̴̌L&3EeS.)\%$M93tSj3^{mw2i\c>k?MC[^^^85K0zIAAÃ8eh0' !fPxTt5G``w'YL_Xx✁x)Rm/We.-ZoZIIIӧO222` ^xo}{/Yƿȵ^JZP 'Ło~kK Z|e }VVV/:B[CBSSA]]oOV$(V<.VY~8w?w/=%1ҀͿ hRD +P,"r x@;s'ljX@۲ ͘@9 \ۣƚ^H:ndΊcXt_ rPn`QH @ξVK}'ٝ@IM(?TiR5̗Cݳo#W<|vu rˏ<>!WPn$6B$v:>ޢ{s5mVՆ:v Xm?m5[&ck/Ea6aV7a()+wĵ#MB_D<mn\ W#C-,RYlqcV""lSJF$jOWjgf2ݚFņDUU\qk\Q(?|4xy8Q0fֶzT{O9~6sV5;|L[KO+O=  CrC ɽ{%4VH~nЃ ϲ NQM#z \g+PS!C-Q|5%Mz᝼-ּ: vOlGۋ-; ,Zsn=Xuѵc<. bAґTA"EPtK41$7$DIިcA{L[ys{gΜ9 ]< }:?ĠsOTg)K]K${3o\xRMW>:Onz1Mɯ4םMcw5tKM ZKrC 73~Fצ(ļKM{ m]?} ޞ[[yrwwj-N|)(((88'@cƸ3<\b̔8DJOO/#\hl#[xmĉS>]#Z05])ڂneRO:511'*)n>yd3fƘ_ٳg}o!;.ȹ!L 6Zܲ>,,,222666!!4 ݖk[h &̘1g#B#ׂ3LTLńLhTgNHm3d*72,EeH"V| },E(Ygqޙ-f#Py*wfH! h#p8LW{1a2PĤ G2q4%3Ee:.R[0e5`˒؋YLJTD_( B/!R Ba;4R"rPQ&g^93)ǑdR&aRkLZ0`QyB8G״IۈY^ymW,nwJF\;ں1\J5kl#%1F[_y>1wShqcG8pO8_{Z۹~EOY^߁hK,b8ݝjxN|̿=z׾W541+v]rn&*&.`rΗNv>+tڠ_.\la5ŝNx Xr_=helsl;X7 aG'&kQO;>Nv=}۱]ȭ>S{^r m&o0HЏ*5"B)0DBC sͲ8obf-X hV ep}>/u<`Zċ< \Skq z%7\Èhi;zWR<1m8kjҭ9Iw񢞄8҄-R^I= j$ܚE*ŤݚOIUL jQ|[܈p%:=ߩm.ż8Y=6!?hk?xas:ם~+·^p9ˑOz?zp/dž?k%.?ww͙nNw;վD[DX g#u0OGwi70ihWwWTsۅz?q5{]叺^y巺^܋O?Ԏg!rrsz_jjxFd3.zW쿻ᶷ=)bwSևh bgX1xJʳYOH7L~pXlO?"rjva to-ῇ  m{ IYZ :88DFF=:** ^#""3.rqqpq!S\\\Wy{{C5}kwttܽq̵XP8˛2e ,sY`Ӈ~ 6hK#f2/2ydn# ҤI# 1>>5==.$މk[ps-xkLrzx.wB[yw(-9RTT }v4E#)))|`2M)J=&e*?/_gZBbӧ1df +C(1E/fb1C*ف8co~ v$>L$_dJB͏d3QM%zVR ɕLYL&cJ4L 6r SMn$_`  )`PMbr$Dw&Lcr}mg_zx3f"~X<Iƭ[Ahk.3WD<}EU j~#jŹV0 RoXz:tiKFb* mqCj4p"ZPS*ysS7XY8]9tTǕj!- UL)ؘI,AbȈf}ZywQV7b:\K(u<+FE6ń.v<@s>ϙK}>}s>g=hsb z^8ܳd7 =g%l8۶9"le n"Oĸ~iUTK?yxȲ7p}u^O>l_~{K ,ė,kHk:^_c}ӕW;_FuU[H[55=CQŔuʗ:{rT'lsLszl5}u^Io7EzS}-nhK#>;bn=tOi;GuWOXVp{>yc /\{6JuvV7>:x|՝I0y/?eM_c'z]Bp|gm+/_Z CK;{;?x珖NGkmWݾ=?󓟮rk¨DA?#F~+>{k]N Έr!d~uULڂс2j8SA~#4{f$F3ReWAqJ$q58n")nK>MHWDя ɖmu|D W"QN,iR,Gj!JLJF<0pֈ3}!LqfnG7Տ9 v7C0-'Xϴ0~ES⣖⃖VKqZ-o>ԎO6|۶x[ ϙ77/)u%~x<~%~#qozw؉N}Ú ?- B%BUOɬ"im)5<Κ^`Me[4h~ 'z8=Qb؞=uoEUK՛IL|>qo4Ľg1e۵k̫dޥZlt&hs灛-UgElllܩCj]5 J=99y̘1񱱱q5חo-`ff&4ÅW> ;q-M.2\UPPPXX.--7+++ .Բ;;2[mT @9RkQ***̙-))%Lcpp0<;gϞ xk?>ԇ]R™L)\aZSQy2VΝhPڄё qBC(3x30 ULX䲞,;LJ~䂙P%+ ]!H$BʄB[LtCIX@IˤDJW.ab6\TӘD+IeB_-QvA{ytFĐV%`H)"׉`JэGIA{M(Se/GcƢLc8ci~/L`b!-Q%"jtpLLF.eq͊vk(c_hs\YS[ԯjk}߱]jgY5q>{# ޾>ث}gyS irY]J+k;7F7hK~ouey,k,myo;XaUeCDհKwt=϶}݅/o}.7X6_+\ ݯVXV[8Nkl_)pk~kK w/;c/ >.]<+KTTjxF\7'>2;9@s XwVő]3Wx~^[~O$*4%!n 7lw_ƀWt6ڊ'izkek%iߗb 4XNdNs">B?2'i(: _j駱I7B"5^HPh=?aMMj"E ~/cMi{ǗXӻDmp5q +}gMOikگ"/jzkz5Ni#Hrƚ6S:X͜FsUBi uOE~?7Uo9зId?-! {l{g";/)az!T5!\unK'R>:a UdOU㋲WU,M^eﵶkj0F[6TZmA#.jqvv*;A 5ki\O-yyy999}رG7BWgq𴴴8xg pԉ oVO+))o>%٨Zk5sL8X ՚ni̘nI1½``ah[q$$$mMT˼y``%%%Ͽ%<x(ptTYYBb;k,>j8-Zzj3OO hB[b*bB[&e*:֭_pAoDŽn@ ( ð k!yD slInp&$3! y(2`0<솤H} =2ɮLv' 5 7=I^fJ>ZoɅ(IdT[! Gi(%pk"1@ #hNQ`J,6) 3"*XKʺS*hCb-in6o&e"< ׆%&33Dp>%~0l/e6Gݫ3hWAS,nLbUy9h3a5 !L|ϢqG[fm/E[ 5s`]Y0t٩~38zq*^?`uD˯thVuy?{,X?mnjvsm^Zk]emO}ƱQVwaj]373涿Vr} u] /v=[^ZBu^WI+wp3;>osw^_߽G>/~{}q_׾ ^ ǰD7Ry#'mxefdT/rvYѣǺ{ mhk(m ߿R?#z'm|- 9\-ha=--mر p!1j>`M]P;JpzO4 sWWWhzÐ>0-VFFm8[ 0aB }())#4ۚn+5ڂ%h$33a9\ Bno8Ѩ,X`޼ygϞ1ctx>ǹ1c&LlYY0Ƣ"h:%sFhѢ+WY& 7XϜ902S12-SVϞ=BDKKHhKOLaEh/ad.0c=1# F3$3}wơ!F#3! pćHCPfc]Ecj2-18,@ Lr@_zvMcdG\rBSr˜hvJADS1K1lܷyġCF.ٟVnLVؾ?bFXZAO<ΔxJ{/gLz,B[uڼ~JԔt:yٍts]&)qOXv6raB0$?&ɏPQŔsR e]cv\eW\}3L~¬vSmۉ5.5oFzLďٱCkuayF-qDccm-,[`asQU4N. # 9FUmqšVw7CTIL Ԡ7h5ݲ#eoDI _4R=>m#"PRESX9VrwYӛNgaMOz4`!8}+?pT!"ZQ $9 bBJDNYtj6iPKr]uagꟶ绞o;^?xdϰ;O\ÿ ?xh#.`p#ǻ&_[삔 3'̟5;{^][hmi{rg\wjBOcmz҂nyzzrLSVDD\^^^L nQwKΝ;sLh3%%%&&ځgddpRRR7m#@oai61ڂn?>666 N4anQZ[yyy|FnKڬY*A%F@0(.VZ-[hѢb**- nmB?͛ZN`1y> |˗/_jڵkׯ_ -fS1-S1S5DJhCCK&vfDO:̄L@^LvLBǝٞн)b 0q!S ũ.gRdOLوh ^1b3% eWb,TRL&W2qX?. ,HX{BS5 }!$ 4C.aJ"Qbä$.4Ng;{MjDJJ(:aU\ńLV()a Hfb1m5n3N?#D渖$%63y+k6G}Wovi!5!i*ְ@'a?2k|\^!+aJt/(i_;R f )O3VrF1oLz5KU捋m=Ϥ19Хve ˚.4&msJ#u.;q4pP)ȶh5mX6|qljSyrK_i=0q'3^vR׊^+ipc(xߧC\(\1^wW~jN7~/,ڂuZ=%=U 6RpV77m%ʸًZp>t۩9}HŹVԙH j6,-1 &6V_mݖn%:FESB|r7.kXE [1%-;T&N1v ɽPXE^J°G蒧IOqvZUhkC&4尦\|kq'y&fe)"R샲NװmxvX';LoC6Zǣʇ (r[Sɛ8бJ|4גa^|atba-21a( (J3:J["Wg" 7B- c&%cuB<$uӘ䊷Fbɷ J+W66?j\TmX-i}5GgwDž=/<^uuu^:Q {{^=}K}{ Ńr}s62̴Xvϡ m 4hȑ<."eS;薋 tKZFҠp;zhNZ///hՕ-.'Kıc &,^hosq88188trro;^VNNܝK233ۑ+Ƿ[T3.4- mA}ٳaϟ;wnIIɬYpn …0pWn&ǡ5.\pժU7oք[UUUԢ!:::lD^cPPPjjjqq1\XQQ[qw>pe˖-_ΡRJńLTLr=2-S&jKJ6tF7 nXrGu'',?.Ē1Ɇ ޘ'L!D&ƍqDG&ebo&g޸rȓ19IL)"flwKaL bJ.S0i2Xq]\4dC; { ̶SOi&uBKd -剸?#|%uaLq 71MX7G-!d_ƄqCC3iXHJ`Tv1֏tKizWjX$fXńuhkA OevBGaɕ()22%"ЀKNxX']e.]/GieCjʺCX3چh¾4&mbnD[O>h(ki_**!sѻ}FNYwE[* 1P\@M$ *Q W.GM&UIU5mufMjD|HlNmial)% ZvꜸ0ȟjDT3"Ktk ɮ% UJASmJ$Ԟ[B8kmwۙL<"O.П֫"T@M!wHS&X|Z2#->>>##gqR4wh EFFDWWWKTTTDDD^^gG>===11n!Xk\KCjp#8C|NNNT-֝V 䳲xN"j*jF[/Tzrx Up9GFOիW\|Km޼ 8*--[Ma['oC'ə?~UU.X%0111nAk&L0F*/.bB[b*bB[&e*:ڂF]=$[:R !s7hf%gtҊג+.y=C 0q0i -/&d ԒB8̵0r(ke +<ɄJāLe#G6Lqc-"mID2193OTm1dA= Y#A)F0.o#6Y+>я 9O2Lq4&6Q~ w(qFv%z ALǔO%4aWuO?FQ8o"_/9QW:f1%h! 9aMmSMYLMX%LY:(yQӥlG9i0PzIoU2`3):7&nb.&F فNZK0q+`^]sܫ|aH͢u--q{L&nd?b?k_Xwg2vᳶ' N|ľ^;icA/r{6}}Oﱪ[㫝=wM?|ߥG>ug:=uJ=}"Xe'_c< XOG[ 9\%~̓V.on&O>vhKYa?L-/sw D# 25˄w-PL]Lz*F-+ԎxCn3[Zxp |// bY\L0W91|uԙBnM$vlpEf4qĚRi88*'A[T&$EsҳG+6݈Jt*dP:^d딉:%OL)tJN;B'Κv^٠ur1ĬL6:|l^d+<fٰ%ںiO\ɄD-8OPYp\SX b,SOE s|}}doȍ`|DxB"SL+_vŋ#Vcǎj UUU'H FDDzxx@\7-"Ω,XPZZ vPoSKtt4t:uxoo˵$lZ!nN0=hkѢEK,YtiuuNXXX[>W|OF SSTĕ+W.[ y[pիlRQQ-XXGv-WAWϟ ss .**JIIʇ%^̥1)LTLń/hGc*%*9jVj az5F3}~3d+_.yrB_M c! `R0tboܯ,&M$DцILt$rrG% -0P&Sw!ѓ0$[)H Dօ<0$RCI)\:)Lo^cbڋcn)<”ei`BfB &D3*pJd  >L[~J'0QȦ[`H)*cJfSh9 v4$”0ZcNC^4qMdIzXk:ymejK@=2Q&1G'V&o`cL䇙sL~(T8Khk~;i2Ip C.VuͰ0{}թN>m]m'˙}Wt^{?vn__=s%CX_;o۾zw;e9cqLC?e jKε| zbtQ.t˟BoNh˘kqo.?A6k > #{1Jk%b[搿&I4̕:{Q65kdM欩W@e4 R5Z-V59pkѤMQ4~Yդ,&4Kgmp*/3h4c#vms69L_j:tRDg!Q) Jٔ64@[@1)"Ϛ̤OnaZ]BT'**"~x䃤R{m^bɟI.?[ zodsؘT6ɟgK9%h;bnE9MEЖ-捍r9䉖#ϸ~bPGC[]ӹ?9sVX̙3y6_JJJXXԇ)CgiTT|||xx?L2WNrr2EEEp9k ݹ#*T1Rjސcv[g~ܹZGnq{v>-ZڮpW|q*tumٲ:^R7Çg# v=<\???D)O,(( K3UjTKEE mʭe=uelD6l_k`>0Š[axoœ+ QvVԏQ8pkED[1PGDLeP&ua'Mz⨐IP^>h%|@)SXnISH5_^B5`+W$Q/7جMFB֌R C pūz,̈D"Ddn%!Le=pi_.yPc*))#p.$,"D Fb&(i8 zG &K)Bi%{LQ*)iLNGARMk2i.0b7 Y(䯥B=VR2eSʙIs'̥2bF4c⍳!!ښc<̎ד-ϤvL||f72@C;Μh㈹?=O˹n ~_8qӉ<hqZ3_B[P|xBb3Ѡgր˽QVĭhKZڦ*֜ Rx0UoDj4dH z}IeO@j#ᩡx6یĩǃ:`24]`dLoq ɠ#j.[UT*ܚp ,k3(Q31h^߄<k"t:DMQ.s龓 M51Hi8-)[r…-*//5k㣣}8WUUi{.PRRRN :Ϙ1xΜ9sέF8S©ܺ`ҤIYT81KHHr'OYpqz/oA8g[s-ZII t`ʕp,C!.,Fx"Z牄~7nܲe | *gddpC~0IaBe 6pѣGè87Ƈ>CSPmɒ%ܣ~Q6)LTLń]feB[.Q?NMH ap@ˬѨ;T ΘзRC1n`4 e(BxoVY܆ Oܑ](S2&-f@s)z-9THorpETmŠM2I;c(!}ˆ s4r0)+J `0ΏbDI1 :y0FZ|7g\Ci?Dl=-3}nv>j{@ff\&1#& :mv3!|gNe °cOadS-OHHȭh?mu(w=کh#3V 'ε(TnqC-c-Mf#zr-F\k j2UP3Ee#%MbX~+vdU:gwyyyiN"[NNN*_1j-قḤ8% P!??ĉG,??(ίxʡ1j#G@RSSNZQQQZZ7ݨ?>''|޼ytkdP7n\ll,>ÅڔB\LVYY\>|X]]ʲe#T1cƤi\ߢ[\yrkéUVqY1#L t|2y EkB*Ж<=T]h N 361E&Bhk3qaYIsfnVә0~w !8y -r rs7,nE[hbqh^F=?cّno5{&r-W9~RaH*TJ %T\ȕ(īyD1E*oH*tSAP5 p7p#tjm%W*m_8JcPΓ+/Cur ћ$ܚOYtU g\^l-wAHj*OH*K}I Nڲ4Ѫp+VWɠw='X5h Kc{xT4Qa6hsXϽ@-B+d)؄65*%ؚ{mn2hРtK;IZ-xÉp*Z.!h]R[:ё(%Msuc-#Fx{{@4<<<%%%??֬Yб񷖜I&͜9͞=;777C-%''Tn͛7s$|F#]p Åiii2\pit-xϑvZ-NVXб άxv.0 .~@NII Y~-[QyM``,0O³gjlѶiӦ 6Ή'Jɵk]&4.4)LTLńnDLhTpI-Y}jЖދ™!?3dt17!pO^(,_Td:4 >"AlDOB^.Lp%eK[%abW&tbb'&eb%$'K1503><ɃAD"&!!e;nDX[p{>tw€⵾a>P; m BQtE*F*K50e {#qZNy8Gc(1LB%|Z{3َ104yL)gXˤx\Kzгv62i:s\D %%ϣEL\$ʹK/G3J8Jf3e "0?EWtCL7\lQecWJn- G)tY6p/y$Ό|g2&/j&!g'L>o(IFR;#ѩ0m&V5-q4(gRc13<„op{d >l xnS' `;Ha Pі~9Oj?mVޟ,v-.^{mwlF7B)]l0w$<;!?i)~d[z͏nrIO$O RH 52~!OLo8TX8Q$MHx>ȟvp}/Hcc`7І^ūhbJ63n̮LU"5Sf#ffbFhz1:ES<?Suc'"h/*QAp_kBM[8 g꾕zڧ5wOkwqp|f熞aec@CY*ml[wϡweLݽ)ڂrssFs ?uV 6lKBE[C3 @7ƍ7eʔ興ny3fTUU͝;xĉ%--mرЎ6(nK****++5x^ɓ9["NnU"2[|SEcmqZ#⩑|teeeUF|ٳgCy*"B"w}m۶=C?\POqOk׮\&&:5 qFhk֬YӂTLTLht˘_+TL?@[? ko$fn(lQɉaL e+1q %:%)9 Y fc0i5]1D qbV\M ,K' !IL,`LZYΤg1'W|%"_oO C1`dwmf6`,O<fH@%JC;zSov68`$0 sPzfD":9LBx99SL %aɖ)gr&w#G+\]pڕUt8okqXt+aR.%'2 ,+DC)A_,4ĤyL^b˄, ] ,$dwE.m&hK(cB;t3Oѿ26y1qc35<>P+h bde8GaMr=ۜԂ#o /5펓(xBj.-bA*XFJ=KNRkPeZY*@30'-R\D̟zXH(UjTPJ`bNrT.F*ajB&.AɛrkKk&Ye­*p 4L?'|+I5-E> ~6AVrk"TX&EN"7RcTKyrꭑLGktkGvҦm^5bkr1Y9AfEYof˻Ulm[C[AСC9݂|tKјhE!Ӑdݝnkt+ ח;-h-xA׀@kГ$xתp7xΦ***^%55u̘1ЦZsvj70WhZ\8PCRw\tkƌpG aKDnBԚ={6t %%%UUU<K8ڂfݺuԲqWxb OS,h:7i;3B6Z~m۶o߾uVj*W'?B1tM})B!)މ)9:M}8goMm"jw5$IJpB%E! Ȱ׌>i82Ex;'5hOV&!//k&[㵒fI0Pv !0 1uO"fcY;G9QvLDC-h}x\ښqLCTC.`[VDWUC=?31}p,zsp~>gɃVЫG)g!"fJy H$.Re&C,txpwŮĵllKh5 3ѧ+ - +gXJdFQ dP9Eؔ4INp$- j m5/MDyљ+R@nLJ@:'$[ qBtf/J/8Mx\3م 0 %h ] La̵$/ŨIĵ i>oN#G28wa]r؜M2"cשt$r(-C-[5`R$?DzAʥ3UO"~Z&9j遼þj=U_z.K~Τ$ZJ& ױ B_kJyԱ4Q 4 ~4 *$l#oTm)y*ݚNSh>CU>mag4dzH)|@.d)QͬyTf#Af8ƪP+RZSn--t@A#I+恸a>M-Yu׷oumf-YlC;-h6{mG-cі-[pܘkyzzz{{R HJJ  wqVPPPkp#x p:-=8Mqg,$$NiUߧomC-^RRR`\j3BXZZ:JYYG ĵZ;ɷ8DKZ)NZ-[|IZEq ՂnUTTliӦu֭Yf<}v8^]] Í222bccGƟڒ%Kx $܅o@Ǡm^)[^|9e֭21-(LTLE:dwb*,ڂj6\zG ' CEZzV 7.썌q;' aLEwJz(oЖ3M+yH\ޯMtM?٤K^V^пV25{:6c&ix"6B}_Oxz[{_; WF[nšvtC[Z'BZ8k?!lEEEߓnw[:1''G_<t6Qyiuhu̙s-,,hw~bvVt:aɓIky<˷4ұBG[ݒQZCCCKk;wmѭYyOK//>}۷eѤ YZ]r|nnNO\D ȓ}}=ƣGd<2ׯkPD"_ 1"#-wԫ9w 5lkيiUIYN m;zP+~GL' Biʢ( h C ?^e3-DU/ȟz75xjC8}W FjuGYOR [ f״<(3n΄jéUn$R߃'co<=`Y M5Ⱥd(;$аNѲTL6pX yܳXP,U{n?\a]nN@{2T{t (ڮjM-6pWh?kRP9Wn( t94ReGS)3i.JE b.r*VK~GZiZ\Y_(WYʮDOK#`@P> S8uet*bZ ptrMpz Bq9!f8-7,;S.]*ۍ2|ٚ\8G]3gP%հ'YU ~Nۗ Hv^}v&<}d7|v^ꣿZ:Oni$=-OgܹsuZFMMMuu<_@t2Gt>3%[m<'|CCjghmmmiiy$(û|NNNkH[kyhK௙niWYQمk׮ݺuʕ+HիW5}م۷>|GiӭgΜesssrY@9X__/ tMOOKr?!C_ui<Ȇ"D$"m-ߢ2\kGd86Uh>Z3~5PDX 6\,Jإݴ۱:C[v,H4+j(T  ^;*R^B;p/.'ᩁv -4' ɉLI'CjWṛ,чTh ҩtnKءU[aeLS熮,$%ƫh[K; ʁÕN6ԉTSp裥ĸǴ&EY(·{nrw(7 R1W:A&B-;_/m[!D)TڟO< LS^={FY'BJd&:tW&~< zԲڂZrEu=G[> P7uY:?p*2$*P=ӺhS7FqYTvF[p/m.?1Z;=5|?緳kyHlk& 4v9,F[$3SF8Q*6kŒ]D񳷃L|#j;F tQ-]#TlԊB^^V&c 69"eo{Tg}R֟҇t™59C xUZcі6 <$yڂ)x8Lþa+xT71>WM)|6=FֿJQ.W@gqҪ3)|iy515uWY`/n{ O7,i}@^{E-!j/ӧO>.ON:".Y^Y\yΝ;{ӧO:u…{= CVUUJ9F"D$"҆E[-&vӔZZp3N P؆k>)Mת` %a [UZJxXIea", TKS x^HZJ_vRJH+fDph4Midj^nsmJLʰLþITt،=i|6 P^{NAvZ܇K`k a㩑8JFi𮷱luGb/ܥdH 5ay10ڲF/oh?nV7 ,Fǔ3hq ՜ۡ\9ՃnNNI9 (}ʳcICUPaHzDULb!ZH4٬0 S,O(*zm[xI m-9HjɖF[GAA֚@ed/~`o )JaFUdJI$'vj#F[>ĝji+}K1e>G rNӀ}eЦC*3zZy=2Z_f'lnQ6vɀX_BqU]Vٜ.RutY5 j3 |.U:[P^Iv4ǡiJO"j%)Rg"޳zfD g`ƥSob]fTU>_2{63閒kdyA[hkEF[\nRSS=DC_|֭[===ڢVXxy| 3;;;nI<Ĕ%GjUuuuSȰ;::Lhab Vmɋ-I\ϣ[­gҭSNjȲa9Ot@_'Aͻ>O?O>yիWϞ=+3a{{ѣGeIerrr:Q^h#/?&' ѣG򮬹H*D$"HD'UvЯڒ>A-m|/[M lV#3*ԅ_뀶B0Y'W!K+fQ{3ʉ)/-Ah]w?A V<Dn=;|3_7o-͠DSn˖W*p2rtR^A(H'Z24#('h槺i2^=G5.wj2=7W/&l1VNRv]B}[ZֶiEh4{{M*3~oU#oqSD*S]ԬzJMM(!$'''%%\p!2[$6**J~fddMLL ttt444TTTHrhKfі~ir*!=Zr)\[[["]ȳöTNocId'$PђKd[Bp_,&)? 3" * :no{("i3sqMlWv nB4 ꡃ–d Y{q\lwty\$d@EF~5qs W1Ŕq~@9W a)(p/ڣj\Яn9:U;MU`{E(*s*DK+GvɄϺɪTh뀲dlztҕPyNpbVkQsZ@WI s>Ј잖o'F[o*ߛ=|3_~-`ErVXa[e-jC4Lc>rMr4d>QߔW]eJ /ռ {9B2M]YSY邤}|g_n#cg´i~0y^ǒpN4ֶc4QB'3|]\R+w+SKK3*2[2k 4Y{M)_) >$v^)Fy)\Cψ])m毓+Yժi^E(_<mI1G4,Jf$%%%&&&0sss'&&fffΝ;wʕfeei>Y\q OЕ*q||\-}wЖ%'Fzl2\ԩS}}}A[[[Kggg˭W/ Ж=i.9wz&ZVnNj%e /UYƮ.#"k`xtK^?^/B_~ǏߺuKMZy:%%%rGޮ^zeO%kݽ{W~#"HD"xIbc\qᶘn*PlPm-SlحԿLQ$>+30(&6eӔo#˪%[e-(} @á2BbDD.y q=PZe8ʉ!G` )[oh)9ZXY[);{ e톷[o^蚰009P/بjPsȻr@{(A)`<6΄@.lTG,^@b2 u"mBɴ#kb SAF}WpV&R8e3.EoɌNRvm]4kCZ(R˙YAMUy\b+qrhբU l : W VayxZl31vPgg#3VUܫ]j mkƧ?1z3P~zr=_$:#k5O,m0kiRLU*apd0v:/hiqZg9{y64jlɨj}9#T2ie-j[Os5(7#JĦ&ͽ̽­ ,^49Jtby"CiRrFmQjk8E_:Cs3֛D8ce|n_RYm|Ҙ7o6/۱ (cW)Ryq%gtiȓnMzjśNxXUC[v=іjiL2D[]":a3$xƒ=N)w^P`љCQKk's1jbþLgZzyx O5I^!ޱ.,UtҩfSQQy֋DL>}nrO16,>ďy|.{|Cl'Scv^i;dиxy>|fRyN$E2 ԏlʐ4zUNjE OKZ{wZwn?mi;іh1,K[yIIIIUUUG)...,,,((ӀK{siW*CcxYz#wkjjJKKsss-}. թEEE2fJfG=~XGGGkk[Dn=m3~_wZMd0'Ne$2MoCC OF%U[%%% mmm>Zuq陙977p%ݻ%%$$׉ r ׽ .h[nݼySl""HD"xyBʢ[p7[ һ%BTm5o>Xi텾 -@[PCS]3If$xb :-:@[i:,vINi 0FN7Fr# V3F((z-k\(XFhKw.&*+ \ ³47T E;FrSB_`BN5*Bg( Nf? .Q() x`,|N)wW8OW3(u9"L}h+"lUAgiwn4샳o~'luY5lԆMb+ȋ9I>Y,ĜiesD)V=Uup嚵2:,XAWB Jd7% fKj m3 c7-<mɾoßmvJ(1C[ ںD5YTru)m5qjacd<9k]P-R7apI^ȴ f4*evڷ՛.NxQ2񊡭󃠭%V-P귂_ݏ\[QQҒSԘ+---)))..Nz޼1$''8p`hhHI*.. SRR鵵7kyWZΝ; /N8qA-kkk)20 s|| C4:|t.=%7}L^ ZMd<.\Y˯2$Жr877']N>e.:y,NN֝;w.RSS塗Ndn޼nɷotDD"D$"eoQfrĜPΤt]JnxU %ZlT0'1,ZSY2{04ϫ=1@eݹs͛2/y҃<2[&4ݒ"HD"D$^w6]b l3EZnA $ڄ`U;zQPRUt%jծBe粪 ChuXYL"$*"M +1'B(#6 ^8֮GlB"f# N,N{PrNP`pmV9<l2C<,K*.c5–FvL7ï> Bc2|(J f YN!AQn?da=L$f3 ӈ -U -N{KYe Yq@[i}M9ϥ=^^gXu@V7Qs|{ U2鴳@VAKh5@-[16.Xu^aہnke~?Uj?1g&p@5~~b~ւL-ƦdP逸WmoaKA[qh#MZՏ4M0R6 Dη (nK$MZJTrJkf@yqkZSw1##I:15&_&Nfî1.&\#˻a3M10\K߈Ϥ 0-~#+-4O4T~"a89nso#|-׭ظ:FM M-V12ht_$<,{֗?^+[jBYYYZĥ=󳳳ӓcbbg>|fffbb3֋VOOϩSΟ?n޼yΝ\vܹs333A$ŋ999yxyr*tiwV:UFLmHCɼBz7D"tʁ. n`r@%J#L[0ɩ@(Wqs鯕7'Iمb Ss0q9?X!(!1˃HfT˪34Ց,FIfbĭq>N( GUL[yiPĹ 6ݟ(Ov&5ʃ"nQj U{!lfLfba?M?KǿNSQ5@[y(kUn+Ŝv$"wq/\=C,S{V9s[-=Q5e]R )x+e߁=8XUW9b;I+q?v´9dËb~VӨjUD[[qeD[?#zC-ޥRKg#n!}EmlĤ(&|sIZ<4L&wT:AOGbuۊ->巑{$|/rğXn : zNnץ O^AW?ލZjMɻ111uuuF\jY˅m)z&z0SNis>ɓ'/],#w3?'9r陙V۪ hǭFVm%!ҏi}Ж6I4uꟼZW2r]BqxxСC'Or5ڒu|;w3dʏ=^˅íqeON&}D$"HD"/Iȿ^YC KbZ|I k`!Vr7~%Z#*8BQ L(&K*8h]摄~Y`A. ;mZyCI@:zdg7ѸGN({(&ant9܅ch7PR0 (; 4H1P1IWALT Hsz}c,ɼ'-^<*G-#Qm嶽ęˍgr_6b]xN 18JY]ʹJ12(6y2€JdC`]1ҬjaHۡs V.ޭ й9RULjP0:(EȽݭ*FH9і tS% 1Pxf6>{h*4>MF[I3RwP/@Zp#[[qeC[O?ByK)$z-2 JHQAH` xm45`o{m3YlaGz1DحV.UtԹclK7`E%E&vSOT[s /}&7NE85O[i9YplSpfxI7{.hs2ԨX/Q׬dX:νȺt]ݾlP=F3 D7@(Z})u>XmJgVu]Mw&]o}[2]O~<ܵ<4WV";;;>>~ .і---|aŭksOp'O rmyPҥKW^Չ}D$"HD"/I?"hC[҂hpڧ&hE vC!J귥 ժ6!Be)Y2UNMkRYw}vXЎn&ՁhY#(g(@nWe>BN8WU?_L3rIWdb?T@$%G 6n] }T` %*7;,* j=;ќl`9+Û L_: ֛N^t.B1@$/)^.FD܉]# S٪m@N5]nB`T`ֽ*IXO_yuB&W2PO{jx,Yc5)j:] V ]Si*3uLY OTZb cJf|bAɧGE[<^R&&ZcE<_eq\4}2EY 74y[ Gs0ڊ ?4z.lq2LiPkFl ӕ0WZ P!u6bω!Kʯh_֧+Zi|4"K]u+1Z}Y,h Yj]rApfI|^aLujGVfs\zcѿ6%Eb6l4i+ŏV3.CI~?mtE$!iK%%%999R~u93g\pƍ裏>Syq}rm.>z >"HD"xyB}ȯ\oeض)krЦPVnҮذvD鬓O~WPj)ڥ)m弣xĢ![pRhԪ309G!E"'n=D60GكV QȤʁ̡ NSʙ2bHB*P/Ӯ^e,W4b; EQ-7>@V=a Z3 wq6)mesR(XB HW: gx7v[|Orµ٩(eSʔ` ca6Ѯ)N-ZWuq!̯ҊNrr'2-8+eT )+ l6F +Q|*rʔao4d)F}+feYMЫB D+Cg+-lm#]I@aіlӖo~y֯TAmf4Tۙ3MbLt*4FZaI]/ۭ֨gtF vR!aѽ&z=daqӪ6 s~Y*c\k.w,B;XYƐ kɋ<}+,&;FycLIM|)W5emDbLcKfA1y0U0>]˽183oHZr}۸9%s D[^?ZCtttllnONHLLLNNTFZZtbVg)_XX-99ٳ/^yÇ?IPQQы/w %K1>}Zb FH5̾P-q$*_V:弫FR1/#53ݣ>:j厡B{ȞnOTоya"1qCH#r;U.h O,%2ll帵گ`}C#q/L"nY}&L܆w`K褅31`(sX3ma2>pW:Yʆ$%^X,cLa !C:U.=)ʧn7D_^d(w[$B)K7y퐜8TIĴom5;"=|] |tXbU(rْXLsmB[h mf'd-Oe@[jt9WPs-i)t3bҏif?SKZznPK@W_Mm2)d D]VmWnmpiB#E˯9 ziD[MD7SX 6Å2y ]GHnݝUmO8l+9Luh O 'Gl8<衭4_F\N]r7ّny+ 4K~q^N򲉝扴=KE'DDO g Za2O׼~@[]vyF[rGVW;~/)))--xGVcuZ|y&$$Ee;򋳳/_u֣G>쳏?͛ҕLyhkjjJ-Ou?:sGGGі,S2#?BFVV177M^ʔdV- I: i%,kռww͵_~ ]Pk׮]xQI$[:oQ"9 Z9(+ں>ȅ 5ڒ'"#HD"D$^شiSmV;M0f5u=`?ľuG%VJ;5ZYPI)Rh򨲰S3Dҭ}Іa 0T \r@:*# Ff@jkt$ mJNo0U\.mE& !4Ƨ]*8jz*zUZhZdU6hKf˿7hkf} 1b5:T3M2$-&]G̥?QKZ/L IPkEӤ]&K I[Hp}RJrSw4zhS'"TŊ|!;8G9sw#2UӋ'. K sI>r%7d㣵Nhkɵ9bY4W1F9i>Y]k@fM5i忶lR89eSflڞݾUaӌ؎hkh+**5\Fy>=" ۗ[SSvSoooiiii)))IIIti_͸dA洹Ǐ?'Ok;YіG_=ӵ ~WWWGGG[[[򺷷whhh5"%P2>~UUUNNNQQ,, \Ay-C2sdKڵk׺u떗<5ҒG@ e]2>ѣG:Q.ULBWQ dHD"ׯemM:Ŧm+Xb ܴރ ʱQioR qd j _[S,| ]9_cͤI G\SXYNf:E&#tץQyʤ.`1EYkqYh73MZlnz_'=M+NmtK@[^jG[/V;G]WWj4׺};wdMYmiɖHKx9ann?w;W@{m0+r5#"HD"xIb͚5NxtܨF`dְg/Gә?:s F밺*F8@\phΪWn蟛=R*9 2TR&omeS5;܃H*Dȩro(7ӔoJq?( dWpJb)F6̋`Kc)d.+\݆9Jn0ͤQk!sFZA+X~4JU8c g:BXMV=}kF,ߙ/&k--ivuh5-J6moUkJ(X%#6)ǵAnӄZz')je8gֲK\IʋBOn4{xyZ 8$?GR3͵JxӤho@i T42E[\K:Y63MvzpR"wMSķ8'^;ȿfvm? Ç!^vhz.&1]]Q.]e2cflYuYڹ];kiQQ<.oOUcϺ?!ot}Y{)ȸJ xfiXWIOSJvn;'G[zGZɷ~'1.(y^6hc芁UUUyyy9lYYYQ o-jjjjaa!ܿɓ'ϟ[466$$$i+dm=3-ѳ.^xё/7Ks-ͯ~9Z:sP^i:bגȅry2**Y:Pŏ_ZkɂܻwϏdK&%[rNWr劧$[m+'˻ƍrpttTA[D$"HT[ohk#E291 b` <W"XD7VRVڂ|P &{d v[ϕK7 ]Nʪ;a.ڰmi<쀲8)*R6vhTYt~tAT܏OlB@d$V2b ˣV,CV3L>מ_u .騭V!{h 9wi/z&JZ!b+@3]2Z D3Dcڒң1-"z[e}RR ?*93FII^m9s =511X^e__ ɘ֮ZrN&r%Sfffd$gϞ###zdJKKnyj1Yx{=|ڒ*L=q-%[|U^\Y+ȇ<>"D$"$x ٢g?-%BP-sHN#UV_5Uo-fz`Hu╵pa MNՌ]{TRUa',ERH8Z\ѫ 8s)=fFUʹkʽFLݫMǪ r)܂ V mVbBg-*Xqr7Hl@"8j q6b`1iH,'nrTasnGD= ⎓<{,XWP?VElD=G;GHpeRX*@VM\Z(-؎XHM>~ -~\%h%E[o8g]*bH<`rdyqT2fa\= e]OzxK *é@19WC<Jio5#d3D[C 6UTpM ޒ l#:L{!}ʀ,}Q4EeS\2e+&ZVoRk3cཧaS%?]&ݤ@6Шo64d.hkͫhk\9/[zi y{n{w%ihd40jjj***(c27z&9z^ߥKnݺu}bJMM]-֋?-QCCC]__w5ҝ%aKK:00 z_G\K;Yɭ5[ҡt><<.TPP VWW'hF[:Qs<~XVC^rEfqoWռTWHԒ-9"c X^Fx ,W61D$"HD%^{M HV[-&M2T-ض[I#PqM#YD )U@mq[;BD u#h]n0!qr>ja0'.;ظxߠZiIQENSX'$74iߋaM,!o1H=w+00Eҵѹ< iX}VkZ&sV (f8S)w>^ˉɕ ៟j.vK7+u{)Ҩ0Ūj poLNV9ُyL`͖啕ܠup.;eS{C(Xk&f0A2g2ȱz"c&5y48hȺg>lc-¾J~?i.G[/ZTqaaPO*QF:yE*ɏH>Ti<]TmN7k$ON;L+mw|g˿\m지6x;XkUd'S l(^Rhe=( 6::/M[xEq ~eWe\A~'h|4Zd*bF2oi[|k=~ s?DY|lTJe5~G8f,\gJ7fJSo~ql]ڭTT^emғƗ|UB[w~_{n SbnyU [O&#GV z ue0MT1V-Y U7999::Tϟ}ٳgrss322e-/ZM4tKG~ry eFrG9(#n'&&FFFL^Zڭ]W9&W.\Х 5Vww,Qvvvqq,QccGNEw>|wJW.]VZ+G4VZmi+Ж:Z8,rkmV#HD"D$^-G[an` 2l7~Zh}HYGUhDk1'tEYӧ'* Uׄ qMO|hƬ}$e(g &]X ]-Z5I/6f{J&R,GC,+o_Fd'Q-tXrTXѝS9>6B1mr&#*]Hpk^0|+Z4wi~x/ejHp!sDA+ әJn+G3wLɮSQQ$:Y4= URDCF@r(=` 5*,SeC u˅C7JR=?vF!- -aV5ˆmɾi9j|I/F֓0膟x("~>Fd~Օ~eVbeTZ]m<`.HGdgTPJTe=&OSi1*P}>T5һf{= i?iQ@1פ8'L&cApL O|aYmb 仝v#}aj4懞9<# |"O6q<;${:0ؠy-*b:OHNݓ'r35GVԪeW m}VTTW7p|_/([N|1ڊfY 3+徐_"./4n+Жѣh``}vvի%%%NbZZZbbܔn=wt9rI7==M4nnnnmmjޛum~ʃ,Y%)8yy&I$HY%ٔl}u !'<$C^^>$x 4|H>8Yj)پk+Y JUteD%EWõhkeeEJǴI!¶Hor1ɌXdHz&u"ʩH\pˑc r#S뗖hh[h\IlkC^x^Qhk޽o/:*[ʳ>. [HgEEsp+)cZ0@Ot}(*Dy&!-n;}hFYs(wM(z(QY3zz}X sZL@qc<ǹ˘+إʜáo= +Qt?>nW ?Ƽ}E^l`iժvhc" hF6C3$Lz2ΐbne+8uX}@[H<.V[ъؗn{ElMf5A1VoXrvChǾcTR }GYÖV?PNHdqe.rG[]h/@5B#,2g,% Q}`A(ceކ,%GHZ[LGCL13]F<O>2:UFk߯l*0nN^[VhK_|ns066??vQ8*6 o|ЗyQ:n Jz^ϋ[WpY }d3̍rpح+MďC s/9[tBUQƈXTD>H2ԞRfؐ]8撷-H0э{s;cAd(VLk]s{0p)4B2qse'iq]>n F ZaWe/rS4hTH|CVLL#Z-!Tّn9Xš("h]|Yai9Q\\L?3CGwM`nnnvvV܇̊:!-GIҜun9ˡ[955EWXR;00 T%tbbbbFnݺ#GySz5ݹsƍt}wwwEEEnn.mcUUUSSSgg'a|||cchǏ{GKuz7ݒ"$[%=[z<7޽{;Dx^x-A[a&pX3Čqf+Yf5F Tp 3R&ًF hD4Nod^#V' ruE6?,'yG1[j0$6vdmS Rƅ = ( 5븺kSV#%|i??z-2n@,e܊"nef;~ 2Y-v!ׂ''Vp7~KPs-h)(؉}h hKZvgu @R.n HǵX 0AYlE7f&͚WΙ} 'K)C )q W2NⳔ6x$SYhsHCXŭKCzZwc/B0 c'QCedFԌs*\D[tڊP%ld G`& 'tXj-IܩK{ȆCc6"UJFX.5C?&5IOQ}(otF;`7 Dd\Gn-G:pv͉;Z'NK0S{}%ٚ:I(\ݾ=V/ :pŕWm͇x~ rRugW.X7wPuDbB{]bOq3lMo6}y|7mCі8D;C[nmeKt ~HuJE#ꈐZKR? {\!Em%@-QsH3y1 \^^^TTDE+- q ݒ+h2꿣&,Î<]&i41)H1 7rCZ=Z[[{g}.qzP%%%Kµh#,1z=p\%.7]+z;M+sAgiN&#}w /‹7 m)Ǯ*8GU@"7}[ 9n*(Ù YOjV>5v+xI%O|C-6Uh_e-Z`B #OE,+D ;DB6jE=-sDw 8D*Y83*b&LR`'vJDӨd:].(VNd -ϑ :}{+EuUN?֩V XIfvh  w}βzh6@S^* uSSjxy̰cl3$dPZW6rݯbtR29oPwNٴ/|^͟俴4ʭ?mp$\XoVڢ aDnQ0p%$$D D&"++k-XEggg|J3 HAl4 db OWBnQRUtk;'iuuu47a7U-Fq<%;Dq޽%zCu'|?yDxڷTWW777wuu9\+ܹ#?Bښz =r- $"*Sd$ >hkBIEF5PcOF8m,KXh+nV#17m%Ixm0%h+dAWt剃\˞+-U4g{QH%fݑh𪨀bXhO\96{A[kڎ҄BgJ_ݢW#<܀?p;}ݖd&$OaLII8&@,''XtMCCC\BFFq(RSSwD[ݢkKCs΍)W8H.kiiYOOvt٢+yRy Cs-5ꧽ湺çO~g?7ךpM<Cx1rVVVm]Flll|~iMSNAW{+~@7n^x^xFcǎhdo_?V3el T\1sBT_'b'P+'E N"ͰGXe|@Z"y)7ƕل}>S*Tb|…N-NXLZJݢfЖͿ $*ˇ>6e 4jqCbU9IuU8xW*CP NyU2-γ+bx[̺Ye sF(;pѬ*V1h`yeٳL8c9RڈAH:Xfs%DZ%;3 @Qʼ)QvͲa1'" `eVH_Ae`u92ڶvrP>2Oź/v{zs>g|FTnR/??V9k+/i R40RE_Q9ie\'#ڑAwUTuV%N4?9Y) ߭V8Muje8e KZ0T+i$,Xi9dg\\+EZfh5(@Թb]ZVӆ Hqv-s:4Zme9t4ov%}Z˺lj ElZ5vAѷO Ni%Lcق, j<6n.mk_>Ϩ\Kh7F'@[A9!OnG[;-zF2 E%vx U-kkkKKK .\tydAһ&|7hjjjܜ(b-'Im{m eff{EEihc)&4󕕕ѠRmP"xfq&i!U:{w&TUUQ׮]sǏ={gݾ}&CCg;DkA$OС[<,hF\ЭOіk#MLJ.ҭu" /B[vD[T~5>2<35tp=B>+g6(aV +2p#G7tYÈAF/tNabpD( @2ֹgqrZDaz>CT-pa*SV qx> b]*#iZ;Xsd&c7kk*AUl@-8sq"#/; {1f;€QCLE{S:2*n 6h>6e_dk}sTh+0iF[*tT`Ӫlfe+ B1[f}&gSƒ 'rNxPL^m1J$Ұ*y@<7Zh[VA]OE]@ThUK"zyTU[gIǾ͚{պWFXGƃ#^V< JaY0a0X#rӭyL؎,KGÖ_'s&ً9WA.b'uÅj4K”ϸ8vmF ؖ%J}jF[rk`ÏҐ9zσ=Vo ў]1LS4#QVǮE(N}UsB[WmyDDaMAJv%t^unOo 7+#2Ft궹y|||hh~U\2!$RLEĕ) 1oll⬬,ֱwDeJ4mTńh4C?b!lXuUVV644H?22B Iz@SF}(ׯ_^x^xF-m9cJYL6(|`^ o5q\o8)8PRZ`Yc\se=S֟f,U[f58~sFlEC UϬ#~v&-bOf-peaѢ!opr^rRZB,=3pNgRj? 'KP~ɜ,iV"F\1@/d))|N=q>v ZWjhʦ=%es !˙32˹1:*+Oy\.Mn]Q+v%e6b:k fkvȳ ЍNil>zYld_ 5n1UeP*ghb BŒn%qIjƘAPT ܂MX(Ji?]ڏ+sرh+MC[AF[Fժ*w WUViAI ź$h~ҭKq.lG/)s2#pE(~@K.|66NgU4ra[V6?rsbZV 82LMfvus"Ъu^ZYp$O>E Uilua8y|Ҧ5 Pmnϱ9طZ,*m|$LL6>GOU.Dߴ)쀤KX@'$)6? Z|=:yh"`=VbbW=;-Qӎ0w[弚LHHhii]]]|ܜLQL!99yff}}}bH%%% 74==Mψ$!XW@Q4> \r//O{Ȉ$QxzhhѱmtAWWC{HWVV***hg.\|-Pr'-hK_reqq߮ڢT?y !Z»~?n.uE} N^x^x-C[n?V ۢ$jPШfQ;P?%\h+xMTfV.(y4FTeg?y{ZYd(g_bbTAj| ;p Tǒ<>#*)dWx_ 밊p%2.dTmYj2/3b͹eCLlllrY5h>Vٕa}6jed-CU :fmѺ.$A'*](ڠ{y-~@:xY=HToh^H'\Tue):* fh~:Ĝi mcڦB3 cW-Yߛm9WsDڏ=m%hkFVbSVfU9D+B䈔].S2Z < 2Tstp ~ф4,|6Zm5c\~n Oҍ[kDl +lCVX')fb1QƝ:M֥b"zǽ{jkFd!ܐ6·E|A]q9ɋ!TmX9ǂe}4dʔ/r|~װnS`]^u; Y|nx^xﴷkTثhIHSƨ2=XŰߴFKelͰH*D6HF4{"P2+eb簃s\HQ"8* $=8@pbh& #m ϟfyA[ z'= pljeG=dVYd%h˚W%D bu{ UƜ$1d*g?:eLeCvTϺ/Y#a? X9 CIGT[qD!kuNb'T5yB$Q1FXh*+)e|+BchBQO$Vv=Re 3n*k ɆY5HʅOW<,Ůb@U3*4 9Z*>B\S ";>j&Ψ`3cIi8n٠ndMi?*:rV栭UK%>G!9 fP-ue[n[cb4XetDcb]Z"J".1&iiw(>{H(Sڬ>ߥ4m% >flda/~6v,G'fi@qqMO*W6@ :!pJ5;$]%:$UWX.{ :N`S nbo GO fk#,E/ Zl9~l3kǺ{o[fmN>-\kG}<Imǧג!4T\"--4DDZv%I,EP&kVffً/-..^rڵk4qwY 4ü<f[TT䟥UUUmmm###4 4==Myl͂ۑ!Z-$Ft\R6deeE$!21ڢ"':e?"> /D[m٭ *EVT[іQ*xEHˬM2㕱ZLeWE>wS2|N`4hb`vT [Tќer6>UaWq>,,вt9O~Nu+KU i}\'yu|F&ۭ8]b\X¶Z^b.6/etEVήbcplbz6'c80 ]80h hV9Ket]W֊%>$m+\f,VhX2p׀lZn9%04{-\1e J~6jF[m 0*tqnjg.jf|7 El,Z Qh+P?Lh+gF[ÌVv?B`&ݣk`tuHWlSe,5]ܨPq P'tY '9?]u;q{WkU2hK$|RÍ?0 ­eؿ;ފh%GO;uRI +)XŨ2t?wɿʷM@rlMuϴSb562Hv9YUqg> q2$NEiR=;F[~~8tV3=KG&e}]RhL D}ƇJ0ݴ^N6ݪ6"dF[>JFLS\A*S?ccq|qFߚ._Dcν9h+MƂq K[g dQdVk_V1\k1*3^ӵ+CG_|*8w5hKXbn}ExwkViiiNRQQA[4LJJ-&33~:hK:bۗ{zzhZs|>_QQM^)(UsssӅ ܙBibOHE[_|Ço߾BCӓΝFpEHiH혓(PK' Ԣ}yZ ȍ>}*,k;ע.P޽{ީ / /dEhKD` ԸNS;de)sNokޜ`#*rzܼ`yϘ2. @TΧ'&?m[,MЖhxL섰_V$f f6SIށ"65ڲ9=8yv6Ke="0+ؒuV>vz`Ee.bnSW‹ ;xJurXɖe]s:pbgU2k_˔Ɣ}Ժ̀a6 {K̸hYvnfm7c06-(s ~-8X:d fk>)f-C&^/m](QU!VJ٣F6YvcVq9N)cWP-BZ uhϋn,Oޫh$0\bp#0WhIθPIRONSZ\˭ר9wU7M FdNMd }YRr>vkElQДOfKk!;5x^xś|>~(OE=j= m]VT> U}ز)v {BQ8q<>fr Fs3Rc]GW#^BV9Ö`/Rq|rTakKb[Fآlb~ݯL8xk_PEhN(k Ƀq_DFe)TVV*+ڭYNdZk tȘ4Ǜʜe&h ۹%v7GYeV$--~ W0Lk`SĴhM}l=6nhGFm M9؃W}裏=?3ڷQq/dAonG}[6,%c,P7 r.eXtk YN4ծo*/*TwToWƋHdHv@[kx z=*++уAҜ9*iQ999A[N6vA]pwvuuQ'8NE)UUUUB\rשs* r˷Ν;ЭA[wG}'_}x߿F5-ϺV866&-A[X2­rs-Wœ'Oa%S=a+~T[?meee|d-:~YB[Z/PU\\֎p;;;ETWWGdddLZ鴢\mSRRpK[!hkuuZߧq233e+gFHEt q…[n]~KA/--Q"Xr |K8-uww}A666>}ɓWmq РpzZE駟Ҹ4ܣGh7nHdccp-z׿wp /‹7mџ=h+pGA[YceR2Vі5[|S&: Y8`'DǴߡ}"T>(Wc]F![ݻwOGbNC$$$觳N*b9bkLNN>}zsyՕ7oEHYׯ;}/^<CZe r6hmmv֗_~ /E[w̵|Z (v 3 oP}O~9 Y/b(.XAUk ح-*¸t{?Z(eEsn0&yݒmq47%mJT mںB̵"VYXh kr5&]Pz[K| f3:ÆBv q捆}8ǓB'W7lA|ZR]]lq7N,#e_(s$d0_颡$Jc;[Yle ?U392FGЙ-o!0=;͸k, cLje,[p\s m۷o'gC[%#C}%5j36Anv+I{M>@іcC.LbՂOcF[khC2jhSz&=t]y8Z5s\YNd-*ݪd-CJӆ9ZXLObojfN>7|38~_mnwDڿZ[ߧk R:-Bvt~a&zɅk +9I;ʷM.R|N-,b؊ ^cG_D>?Xgl{ojN厴 IS)mmNصc3Jnnn]]]!ZTyyyiiivv& *h -zW͍mZz:w9U(wȧ~*S?s=yʊ$ ݺp- MΝs ~O_o~CxDccb-IHi455-|Z\KЖp-Z#m#]pk8\jgg'F[Ϟ=^x^xƢmTm}7 Vn1>jbx$ gƧcj~n\1_?ҁoO+8!~Bwq_kznTKx | [p&qnpd˹ֽ>n2 g .rA3VÍuLev4$'6_57 2vVM>X{Tә@[v *,h+G-mx{aDi|nJ?ѤUeK[Kq-?p'ugC[6JrG&ͷ}q7,9_Fm~6 Ŏ[d+#m/"ъK!B\c+jҵ0L:Q 4;!Y@ZMivԫǠbBu ILs*ZlY-6Ȯl'G'cI\n@E]'qH-)(('%]cv~q0jmǪU٫,q?+¦5麍oV` ۸ _B"7 8H:RpPE%&ӢI]Ft=%/M`;P cޒG="&僽=f3_߷-A[uzmGkϜx?<;}O+浑)9}bZby>s;}UxmIGn8˗//// ںGPSSNo~gj%ҭ!¸J@8h;8x^xᅇL1ht;? UAW/kՁ8 }*Ob )cAј(gg1bv@Wzh+W,b3s4|Ll=yx89q|؄)T({gVq3W[X%F[ۂ?QoUό8@v3\BZ3 neõ!Ǣz^1YeXrQѬЫ5*3Yu2idhQC<ql_ WB}S%F`T,Yu!8i[@a(ԅ$1B!e&k43V-ť3 i\M@[{ mց[C_/|Ir6Nm%쏖A3jNA..tL˓6<[I :ENbZe2Jj\j∩rª$fOm ‚_K,O"lD'2YW+Ԟ2n#S)E~trQqMj4ԋ%ۛ.\rZKCխKV:kQgr*'Őoar֞ʷYv](`T۝uhQ܅ 0zZ_n=hk )3k׷)G_ħ>?YloڪAh̙3\4333&&^Σ"|~(N^͓f+D˱:[8hqxA[3˗/_zU0B3IHHHJJ@ג#JFGG۷%ѣG'O\]R虇޽{w}}ݱޚ;V/w ~mlG[ϟ?/'%wZ3Op-NNmGɝcV-Zo޼Irj>J%S2-yO>^x^xfFeej~ik-h 8ڈqk p V,7 2 70 5) Dq6"K8]S n *o32΀K*t*\ҾsnױE*XRv.mRXA]ϒ*jVB>gipXKaEm]f_YN\vFmm*'E[[llA[ԃuβӾfNލqnբBF <Lfі` ԇne[ noh?|:񳡭}%q#[_|s%9(hL[ II\"ZYݖʵVuJmk5iUS TzڍJC0dhD0+6 {jthӈi:'J&@{}RK3KuEl@2y[JB|Nry&PmnO{[ZuRqkGMqCXE%3Ɩc-#T_h}kخ^h׷9G_>\>sh6swU\(99ӱ gϞNՉr|'ڢY|s Z[ލ.*..~=ݢ\"Rׯ_|YYN@wLQ hhhp-޹sG \|'Xލ599)FmVwwwWWTWܑk%tFE\t͛l%!Ҋn߾MGe:Z>=C@ u= ĈލD, / mF[U8-XgxѽVF2ʖJ?_ SƬ2_(6ݜWh,Ue^e>c{'?[9ʎac̰*P&N|D'H-l>HD6;GʎRF:+s'U)H,h$8e#l)/-ψldmhŗ2⃡F‹!ZdWǗYv})sm"eec*U>3CsU ԭU}`TkZύn1g6&ZZ1VFhj4ʌ6eea>J6e)ZC3c&sQEqhk;3?ڳQplu$uVQM%%g{TK`N9PCtE@WUkkU iviu"Og;Va-x{{(X[efYZip-lj<_2r kdj0z*GHt$>'Gj}٤QIUUy5K6^s0mVj|%H0A͚ą^&3^|Ìk@X`_ ?cie &W`RcM p 3/0F\9i+`U}?foN}~rToOlo*A\KЖp-'e㓒RRRcbb^ ֎4dz_V]]]ڢbˍK;=A$+))),,D-FX^^N$eD()hv Y766=z䠭qA[@\{hb 8E/X-Z,E_JW^l#wZ2=1:p۷uںy&|EmA[^xofП[h믯Wh+XYV0S*pPu`ʬR8mq.[2r ''pIrYAGrR("}'EeϫФ rR̴3Y!eT' ._Q%f?|&g%0 vPМ9 XY,dq"ee0aռbܷzA`%z,%BUOB[쇖Ϡv-t'oWA[f9q$pEC+ (ꐆцBM23H@z2Oq:*v #j[].7 m%lhkFՑ[g;+<9żB] ngkaּV`Z X ]h d^?3%w\?bOl+ RzM~"H@,G\4|0V>p<UXɄFUxK?һ״mŮ,R]^UdRꭅ%L]16PdcAo5-jC{~\s0u_8jgHgrPgabߌ{t &ZH9o2p~U(~A?HlϏ -;"/yjޞ#hUUU>}:...11199zLt\G[F JJJy܊GFFhōZ[[ݢ=uU[ϞZ]G[[=SRRB&&I3Nd[v[?۷oNLL dkGpml677:%#rhˁZv>hˡ[t#h4:]sMz*dz~h%my^x7[ZlGa6+sBl&oL3n Ԩ_b&t]mU Zyp&Ofbdq2`  w=#eL`r@ QFPRdW} MTX5$TFImЃ3\hOn?mծh3|cB[V>YELqbM)XV'Zq<sH+ddg cTf"#*+y]hѪ@12Y &6!-w 73;781g8e0Jm7YkǷ4N}=+d+IlH*)Z1 g-[2{}Vφ(ػ:rpюO|L W3ymih'tҐv|'b )rENVa5$Dg#Cx,_[eY6ײrY2Ee]q DK /AU5"Vi glҥ#32ԙmI]@r `XZf[!zumlm*c{{Uh+q-8'155U _,iiikUD.yOA[nxAFUUUSSS"Жm툶zzz'ݢzkiiiaadSSSeeeAAm[fW]_~mmݸqcrrrdd%\5hM"mm u%%#=g&4{}W_~gϞ>}*w1!q) Ꙟ\[[|zÇi4zmE-/ /xc#77C[?mޢm1*Tr\h+ĤіU}fr@>5T S®5po@rfGY>6K!͌wBc.{ |p EXf'|\hNUvؽ%[<F \;}CYʞR/ȪَUnK,%jLfɖC:'va/jfݔ%ͅ\=g|am "7ڢFcBfm>ʂ1އJp5dªG/I+gfR~n{z 26 3V}T0s2-9҂H V9݆yN; mb`Ȼzw7{{XztPşFkՂQH)F@ fMݱr̵*u&c6TŔ򧋫7:9'PS_ꠊ\?*S_)k1[?kpZp1m95AÆ p8 լ%1,'S2G'K4rjW~{F%­E0~ëhBwcd 4UɴF_\vCaًC*B'ٴۊVO^K 鏖WWr)N©Hݾ }OE0%J-Z$pjjJj:hf. øm}OE#:tknn!{4zii)K;!r5WVV޽-u(\5hk{4fQ":h~2hOe F[aojV,S<B(ڒs@NhNyS"̅,-K ?8ׯS8915#B8NcU =X .3b3Thg2q2)3Fde1y- e v}7Y1*t~)sNY Lhw ؤ2Bc{k:^VrMoNa07k` xȅ5rl\(N úm~c mmWmu U7&dUD,f0*b-RIhɚP9u'EYt¦(2&qVxh68mÖhԚK}tiNϋF[m);ٌ1h~\;폻7ʣx^sl6sh+@[tKT[ ---)))66UhKD_¸߉sQ@NjJm |nS5==}ܹD._LaA㮠9E({Mn*2&T@ٷdG? I*9K̬`  DS"d`-{oǕy>REo(}'A%Rnk9Ƴ=zw}lMwמiY{"jֳ1m]LzDnݬ/^ Y/{Y(Z o#;O\C+rb2W(sF}ڥ2ei̻eI'ya[̈́ͅtms1^SFs-nljE*-韢kT 􄚿)T9vѭNBG,YZu'C]jRGvTU/nbt?߼?$n06 JZ\(xJԻzk-,X|<8EmG:$$nqLB*S۪JP;\48F؄ahb~9s_  ybS_)H;mp&zc Ɵ[z^LX ˫=evU̯8]cUz)]PLOOhy]$q'2dfpL\;^׵lݽ{oHڪț4%D[8(ɖ ge&"p-:C&$RIII9,U__/hkxxWVMMMYYTT½{۷o!s. h G9p@722$~tSY=I<}ٳg%鏦CcsWD[>=J'ӍvXtЖp zWfDӋÇӐh04ɵkݻ{;B舸s% hhi1i03&;::L̍_N/\BHD"D$^HKK{9іIE_Kη) *ʢ)NkPVlg(yߙc+T`#k̭ih*688UשE/@#IƔ?Kӹ:%*k%=쯥Tp+XѨQeLs$;>Յl9 $45u`{&zXeN,K#ޛc] 촲.)2UmT:L`l~z)F'c*ثaɉüu[yTe.W+!cY,ЧqcAZ&}lcE㖀2 I j)WZfYlgҳ07)kj8k@SY\4$e$j;=&0i<@a2LD&V2ȅ,TLe XF2ҹNmmQЗƒ%Ko`~\h+JKRW+LڿO]VU9.m &o dOޕ_l^6]\UXyuE:hBZg .Ze:[ɼk0FY@[qk < x *]P-ا*^^^+G} g>P'TOC/`MڥQH0h:L*fj('9R~:P1~N rNM\~&c$vswr {l_B[{p Rjo*]Z5φZb,R 2uCnIbD=8?` Ȋ.Wb]jT,h -5o@t\ te_J(!`Ђ ZF+6cХi`XiU+lДL!M-tu:ܕ1]*IJЀ h$WF[I:d ٮS)+"d~kK?h+eC[A[_F<*\k!bC֢ bọrvC[SSSyk01Yg]v uvv:[iii Mv!^ijgϞ?=h-ZqѠ.aO!Zb&ExΝ;wҥW[nݺw޻ѣׯK$ t^t9uN#-ǫUF?q477Ӛ0h=h;^xVA[D$"HAXzі92UZofm5[c[Vf~p3 *XÍSQ)NP15[:+V܂ d ה2+1YÙw%|whmrFWP 2)ƮSuOCFUs!/َtqRXC#=#\@L2`ԱٱYLY3ho4unG ; Y XLԷ|(1ǽܨ8C{TM|2*k0ZEXxTjc|6r 7|g3mVf=h9ƄvE`w\Ѩ+%%%--M.w¼br*RG[͵Ŏ|ڢp-6Ԉyth2w#u.tkQhN\,tѯɱc-LA-\SiNXfp-P- JDbtS.\92==M'8i7nܸs΃?~,O^^t>M.UTT-[b&b .ϝ;GCHdHD"ċϘzz۞?%q֯#V U=11e2u`-k b&emc"f$%﫜6(Rs qcA6tM4xyLWv:9sM)X wA/C'Z8 dɵR")Sc" 8bգ!V˃4vcq"aOͪP6[SOF euV>&)&+kX06ף>w=a&tqeFFsաJ6 (ؕ&`83%^j.Ș+5ەЬ Vi8cKI>?t^R/)5{bc*?*Jq!fSL`3*TF!]ZUJcCͷ/W_}uDžW8u=M]SKթ:u|l3{'6bv}ڸoz_Fȭ8h3+e7νeEqdi#)iPk[L+$)@R7j;jܯ(k^[`L30z[Y5^Ǧ| ݻvF[{q.a f%zZ۶ #R"ڎa]zD%X4zA$1+}an[Z;t-1 wcVX́ZNu^WVi><p 30ڢPQ򲞦WmڗA[?M3##CֳЖtR]]zܗ)2A[R~Qn #Z2fc na4ZZ9MrZmmm---.\p%&E/3g9W\DYI^|.qvtz4}ZZ0EDS#Pt\Ж资QNaЭ#HD"D$^̠~6,וWxz'?~ܨ_kN`!# D iqy}ߥʟH<_ p822i 8cRٗ>P9 voHBD\Rʞ; 9HG1~a.aeS f YKV3}%H$b8gsDe4,}caq]0/H%|l`^]hdv+UM֌N5cB]03rW gIҐvOz>y10d3an#'KEXiU/Z)/ [oB[Z6 yR8̻֢h+bJJӃ,d;N9rDKSQ?`VVVAAA^Qoa\˙ݕ+W"ŔcOC:|08u9p۷o߸qz>.qjmm|̲0ElllhFDuRO79D$"36o-ߧЖ_?,L:3zǨ@gR蠲\h+PƠ*C  A){5-;^;]XΤ` PM|<VQq*PfM8uNǰ{7sQϢ)lVv59ɠ*.hIJX z}'xE\ekd/SR [ͼIdS,jX^eID-edDˬ`m!-g6Uh5FeOQ<0=Fܿ8kXU_pP!ۂ2RN){7ocLêQq%j`y]%\[h2,IC *HK°[) ǹ k4LOqnv~ Buʟj!>[8_Eѡ^{mDžV]r|la˯|;VfHW',|HBq%r~n^*m*[OrBg?[JV8pbVKrj9ڧxЕaফ_9DJg lX.^99z#._,E CY*4sVNfPX,ŠQG[mjR4[̽:KΕŗ"?0KksT'VcF=s/U( _jχ%`%,xGt[+.X򒠭5ThK|@a "L@T*ɍ] 0]vرchhH*$655FKіSpll:-Iըyr4D*.|XCe4#bI]QYTTD7޽[̯¸b!B,1tҹsN>-%R&(s(KL%iٳt ݎDKK V-fddЀPc:۩S"HD"D$^ذaKµL7=M_{mufLl` YCҔo d1B@IO%*buY$TCʟBMf+3%ީkr32ddWF5va62*uVL#㡉Rrކ=诸aDV.;9-2w|FT Jޞc v2ٙnd iGL;hsZ)n0r؈̜y>*NہL>eU.h̚`WD+0.X7L=0[xt=^,VdfȂ< o{l60 V#)5%3^T]V뵸dOuZ/xDj@VBi 3עX^m!ޕǟ:: b֊+o`_hU[q'Ж(BG>I:1PJ4-r, X\5Y:1 mj%DWXVZlj;X6h&F[ |/Idcxgi K춚@on]FpZAzP{kl(+oS&#T0 fhOxvY}FMXYw%̗91<ʴV1[rY׫Rvբ e8](5I7O$Y8YW菶f=X=_mI[BBBbb[FXa$9G[nvw}lllpp]!.ʢ^.(nSo]]]%%%d´R +fQmQd k[aɗiɉ\0>e\f _ede7){S&ը rfMb[2|j쁓[ U7P+qm7c/(J-hk hkX()k>pLrѺgVwv {˃V-nUrK=33y<A7G[`XVV&WnD[[[KKKÌymM>#䠭,~I?(%nQU\\&9ah n9ˡ[u5}OOMS |GG1KQ9o>d&\z͛wu- :x-1w ?.*7rٳgYbNo0hxG '+iqheX(DΧ[G6D$"HA[NSbUˉ*x_>P WTYQwZ*q8wZud*>7 4ku”<$!|tU#ˊl(7,0W];}XX6pJ*IѢ|4$ VԤfe-}Eٗy훕Ila+'j D îLJ&W\E:ڢhͥ1걫BM٪ Yg|H]O;DNKL60sГtVT2fjcHhV17R˒m<0T]Zc,;GX\gmq8۝98?/]PgmEPpuԵpi\B"dW?ʈᅥk.{Ⱦ]@U\1[ ShӼ!V32FZc@VNW p@j5r؉m|@[#$K&OfWϗoe䅨kӤmZBuNfq'fWt˼.Q;6fk2"ܨ #]F~hn.&3nGWyyJ$X"6aڪ6fU_R*ʼV}ZwI"W/]Fg=I"L0}~l? U:Cڤi2*n {vJ*qy|PwțHn zg?z#]d/BԣXeA[` Ƕ)ϗ|999Dã-bͯ$tά*))Y4Q]w={^,xJLݷx``Yh+77W΢h^(\DQI"Ш蜩)Ď;tS:NA1F:NLOO;wҥK׮]=[u1:p.K=z􈮽qXu-N*c Svvz7o=e E+k#kxY'ݡ[ꑻe\mWFUvhՒaU]S ZÑ8n g3W'뱍C4^Le%a8gҬ ~Yj+\Qp3z٫q8x6031*ά,GV!3.Y2< YQvXV+g20`3#=7[ע~m1܉4Xf6- +j!ג~N :HGܹn:uJ݀nDsnܸGݺu__Nh"rKhxԧX~970ZN}FgI#HD"D$^x"݌+V [!%{T_^䛨#!Iz-`I43;36QvI2=H+d*#Wå {CTƸ TDBXlT>kQ}=PF Cg0aݨ-P\wpȻ+ʸawq6_ ܨzXh؛հ:/c8w=wU)\#`HFkê=3 m=~p)ueGCRRʐJV^yxg* sV$[YM'sbEZ2+:uo1JXq(^r!EfcPma#2تJF:jMat0B+9 jM=܂1lCKB Ds?? ?`,z6 qܯ㏅4棭/"hK G1/UKgH ~V"Y/i 棭TDJOrtpV30ʏc":+Qmv+`uZx;gP+gx N$oq5 K*(jF4f59~ɺ@4,|B([IiT͝tB>>2Q_>.8N)uӳ\]-1 gn5eEE23+~eHH|KVjjضm[UUUGG#5۟ø&&&W555ςERvuc~н:;;%fDw,)))..LZܹs1Gl&[0,?99)_(µ:n@[ym&-lie1 +VYXHSF[F>a1JgeE ?bװv_Ũ@f;Db_z?n^b5/1N B,p3ʙٍxf Ie ^zJ`QX (tXl:>h< sja0U Q!c'Lz1,jd|gu弻́!/3-٥%e, 1FR-?gPN(k6+URv*ime%wme^g dԥBN M 9 ^[!R4/֧muX2ѓt]j30Jy͍ ֭ q|:LSfnm=D3\k@Ψ5Ԏ2RPorI.zh;|h+Ņv I9v Z%K(>ڙ /OĨ/E[?jmmmll$ɀЖF }ݥ[n;.닢-:ߍF]ȊhjtJu[ZZzEE/4G%X~ʀEEeee4EM;t+LEAGDy%aVB?~'NKõЖЭ .\v֭[w}Ǐ=zPo- W^xg>}Z ͛/_>{zqQt }ppցO㤅4+W88ZaZ4F+Loݑ*G"D$"";W_}ٹVXECKyG9-ׯ|k.PF+W4.W(IZ圩G[7,:S2kxg!JR ,ٍ x6qbS%Ԍ#leVCe *_:$ VF/p'(,x.nYypj`fusc5ln0d+mE%pw"qZs- kG^^:R7bSP[\0GϊN52f#PTl&?Z۵=̣X%TkM&pʤNwaW#R \6äͻ2 쫒î k+kjy堔a=A)fPЙXxkuYF"b[1S^>͈X5/wk yBkXf|5t𵢭+mU(xON,Zh:.\kJa~앚G'~~6b|F4ڪԸ<Y8]A,V7zqiҴ,!y' ,4-yqee&yu BuY͝,‚bM2MT[ ژnP#P\qR믐s0UTnѣ|lPWltЖbKw1keR\o{U7o޼s]y}.~Ν;c4ZO‰''|6k ڢG/D"D$"⣭^>VЖo F 0`QVs;u,cjG\$U #/n`@xW2qi?*5þ(e|~0Yw_T/|hݷe6y nEc#'qQxf5؊TT3CN\JDe}1VL[.Rd&ڂ>p>S26l X {Lm#Ԙ`~FU]SYtW}W~w}moY‰!jdJ&NE"d-$a\?FeApFRa&kp'+*:VsRPтnb{vȧ`KXeJ*X7ť]*8mmƈ0̪ hFjHeNN-];CD[k׮Nhkɔقw>ũgBx! ҥj=,0X3۴UNEy"sГ;TaT˿|l2Vi%{%ZAI9RECj=]~3`X˚ߤhE pP{ tk~J:gP'kA+hrTSr1K3%1/j;@ 0A[e 2y;tUષ c4גNWET枍=>9qiLVWuVS6V[[H?yA[k___wwwggg{{{kkkSSYC[]]]FWIBZ΍PK sT['m  h4Ԗ) \Д599k.jԧ)Ң7`$[NЌCĶرcb)\I1CSu+W\~}vv{ǏtwyA[t|]pV֖Fx7C{Zg7ע]zNF D$"Hhk#ǵTkױ|+t|@UpwWיɜVVVv}+CܒfV c.V/4aJ*bJzRLle[˙Ar@ U\>N&nfl+a22rFNuLk; e 8*CF[V'.BqZ:%{vvذ[yPy[z2($6x0SbYmHl,k926]ʿ]9>榱=8Rx5!}f"#S n4` { .龸b> r`Ϛ48;9ld|k ѬcWR]ҬTeh6Mk :fV)3C*bfφ]ٵ([|jcYS4 PKg|d^Aƺu棭 /ڊYz|2m|awFqٞ470W[!B`zas$xH;ɷ:Ws$m0_$)X/Cw;Ox,% H( AL VZZ*{Rz~BE FnhhnVOO ¢ :Fn/w)]]OYmQP1ĉ'E[iw֡CC1tҕ+W|>;wDvɓGѯBN:ue::{G|>A[.\ ^iYh:tÈ#:$͵7f!D$"5?eG[!i!"Zd:#ɒ$D{%k$)~k/YY,` U(9\B=ڭ||M]ȖSvjg۫e(85qHZX}R$J`%뻌NlG1iV7ko|>:sloShLQ6{ZmVe ր4A.uaɅ(#Jujc P*1q֦!;@ +immذa>ں¡Um'3gK[>l~<d)y&Bb=lAvAHVcNkZPIRkJ5/r7|QNLkc@[IyiX Ui۫VM/N;`5@ӹ@U}:3j{GUsWiX@ZuVg2F~H%$ *0x]th ;1j] 1HXJm„|zsc늍9xjU1N# SΜUse<]/cYGjgrdo՟zYhgXm555I]²27ڢSSSvBg$$$8=mI>`iiiJMM-EC7 boE۹s0v:h"ФKH`.M薓gꟺzuF [BƄn 9~Çïu-rЖЭ'O9sQdI!| .E3/][oI!G9O>} -1r͛7i)Dk)ZȵdH4f!D$"~mI& t~n pf (#M $A> g%"momy8k͸V[F)(_Ќj [@-[x<혇K%ʟ5\GJmZR*@8.d^@#ZB,R뙫[Y5׳;G%l<83wV_|zCF[fgՙWO8 e$Q>Q|;=Aeb.^23df.ʤޮ(Qϱ džq#ʘb[*IxGizc,(S p/7[U3U fǐًݜHPXn|搆9 ?im "QRHK9sZmRakظq|B[1'=-z?|_1Ax(76ՏK [/EU{.(وx-ZcultM>CG$,'}[oDt=ڙV,G[A[۷oc)ϡUA[ 1WMMVTThUVVVaaaԢs233ccclw\+999??iEEEt;˗-:"f;v^ɝt=JreNNWgPtPn#wEݢPWZyzס[̌mž/9\!G]:mllAnD411͈pQm#$Q׻A[t7g$'t8PKliH9B$"HD"?hkӦM/3׺8hˈQ3LM1 w&|q\VW0kb-A@'(SVE{OV>\46Jf-ӕ@ eP(i%^ezu}F+C[ƪNة|xV4֙U XVLўK2j1dys3\}FmAea9B[|rx2ײ)Me-T*llsC)v\RA_~d r!9e|vJ% &/c yAj X.eF˒eHauFyR٧x|`Yŋ竑ZXh˨gi䲏]i4 YVpR5!{KYqLd ,H>XՇL:ueKC-57# 'х d`KO|k}mhkm`oph+W{|2k|N;??rÀ.Xd'H2@*z>C0d;ޠVSE֪[ޕ_:kX6- 9:"OpYi帪:%nȥ0)ȥNV_j?]/QPk-4TV9^-!=v >͡j~-(it=RsTs?Jv ̭xm{hJ#zXL?k^\[t-q)8kr5rQjЇ|^˜U/,%?~|nz|`z›+?iG[IHE?X@hKN V^^*++$o!Y.bkQWt.ah+''ǍĆ+&&.ܻwĄkIbccӭi"tSMcǎ?~\O:E/p!\ScEc-A| ";;[.OOĮk)p܂ǙJ9gf7f=:oZYCV /k5pٱiȞQm |̣>瓟cɻ6*cu:̛< Kޜ Vp~u(8G o[b,JaEP5oile`&888"؏RF Z-x:7- r*e |J9S0ԋhlew5usʡ 7le F0\X͏rq@jnF2a{T,C+@+k1 TTTT! Ф&_×Ftt|uED[q'sgk[>~'(6iT&]'9yv& v|\\ku󽪜b85ߤKgU2|µD Pk=0چwz+aą1 ͵$ACx  ro\aMc)\z[| [ єF[LWjmpSd@3$&2Eq'okԆ'Ew_Ո5:tJcAm#_JHڤVmI?R1ogG77l/,W'/._{~Ѫɺ?Nʷ޽rtbHZԣ砭%\ ڢp[Q9WYYYR011QtSB[b.Q^-Z#, 1lh:hKZ]]]l m9t˩wÇA-)Э[ݢ1th eEӧR?gΜAR*+t-[a\N:4GY= ZZ:3 &x7|ƍN-Zg-1F?k~Y7ђDHPSScǎsݽ{7HD"D$~"% @EͿ)8GlkW2hPFF)]kTVQ=_Vvm5C_sIp,y/wEc^LQMlvl3mM\VZ(/P)Q.jr62= }qDW`>T֬C=UCSٟʨf]=e4^d~2$xGiV:q* 2k/R:'|'EݲTy\GY Fd|WH4J3BeIVFάø1=R10X'z-vbqZ7V7). #=`!7b0j2-o5coHQ0h*PmhWrp--8M׉6o<m=zj_]ɼLA!@K*;4˒]X}P`/pw e"m$inK ):UjްΈA`>I2V5zU-D"**`v| TJAW;Z$xi] DB<* >AEbM[]kVT*\V4uUsϡ-i QםY3k0hn,PJ1|).Z~=~/O3^{K1G1ڪte#qH&n2Ju >ޱU\\" Nh999yQ%]577[sЖx" 5++ˍDJ9-+Yr-zACRĉ>:rHr-znQ4*H{{;͋fƗ0Ƶz{{i5v) +**jkki1{zzh̹ CCCt!ŋxGy睷~^߻wΝ;E<".]tܹ:\ٳͣG@ xʕȿ#HD"x%µk]͜fGnv7~Xݿ~èa3T ^Wҕ?kHQD$x^`'@mRQ}q^2% + 7v-Aت˟RjU4 Ҟ}. c;o-RjCM 6Q{XY;t= jXa:֎lx[`O.:σX>gЮXб-bPMDv'M霧i#74'G3=)s.0|+E_ * V1Mo/4]>89q&)k=iG[A[qqq)))nj# pE5].Rtahɩ^Eݢ ʡp-ꧭmϞ=B[YYY_m9%w@.ʵtG+>m:thQ6Q[eee^7??nDC{P4ᯂϸLts-g===4V/nJҼh 2Vt[n߾}ΝwݻGggg%P4;FKD?i"ŋϟ?-sѽhGFn~!D$"mѿ"hk!W^쯼KZ@&(:XŎL Jh lSmz-#JXrU|xOF]).P P-6W9Su =AFsR-k Ðķ48 `QQjnQ[XmkR;UW&NS C׀M3Pڇe9 u l452ɋ~s50<j4WlGWlZ괾Q|<_{:^$VVj5܀us)JtfCT L|!3Nx^ЧB|̊uyN]_`J[ou?kʟ_ۿ/Uîs;i>~UFr.aWD[at#tKx[-ԧXUU599)--//wj&.F1 +++s\mE[nuà&u8I\RQ sss#@B’)d(quK-i^.-5z뭷nܸq۷oKĻw |kffF[4TIZ8=DУM@ςtԩ~!D$"m#h7LAfٟ.תZ;u)k +v7+{2W*XŦ[leǪc@b`P;z0ׂv+F2wroGMH:+V1Z&x*'Z#,| ٌx&NނYKev VNA=9~o,2aQ4x Kx{+_@nO$s9Bs  < 6J:9eaU Xhpz-bSe~;oTv>j/+?ljGBФmPI-RpJU 0H;F.S(V3@QFu~`V+dh+[)Iܢhk+|7ւt[.p`@I CPXD; 3b=0_Wf\:? r$; xjnS^MU氵A(WR hR[ӋMk 6K+Ӓ]1Hċ]@^XT<e~UzN=ߪᄋ/yv9{?}^C'oO>Vz!>u%@[A[ 9R砭g9q=bJAT5]1wⱱΦRI)(m E[bJ_RR"dLЖF sBJ% [堭t ^B',vv%wz5Q9rdzz̙3.\8}4J9:Ө:[nݺµ^zy\OHj8ЊDNY%e]UVyog]؎L;ӭ!ez̻ʸWYR+,0>#߫w\j+3.;*9aєG×3b 8bXZ+S*YUəV N8-7yKe*c[V `{&y 7Ҙuh-!ŭPǀ[/Z:=1+ngM83r$F_ }G}'@h8,pvb4kcc[k]ˎco)!ŰrE8$匬_}ltܝz:+/,4+b,[PIEJ/m_׾w(1N*[m,Q(5x EW ib2-*7FkE[5<UOSEn=[*xjh!R?g5n]sd MRiydA>ڂGb{:!nY\288n0m9`d / ^k٠lR_2qJ)b5:ޟTu v[akK-j„bwϷ?(oq?~9~ߟ;]Oͽ?]G[Hg3;oZ+^y}qqH___{{{cccuu/Zz(}#űcǂ\+(* ݒ}nɩe~Gy-@[b\K閼N^閮[ܹs3gv\Y.Zt޽{wޕׯŋOOSpՆ)W]SS#wDBHF2d|WЖ|J7+ Xgٿ;™pC#?/\.4L,xL|qPf(<}nErQ W Vۄ#jV)Pay)8PK2; 'Xo=R=PLlݬyU8Հ3qA;WqU+t5$=h-oCϘ>6R1u&*qYJ p3~EWP.g35x/fbqXwH=kfwoYuT(lm6Dl GK0+9ie#p< qVgk?:N[S=a_<^;'0ICG!ދU#q-CN\1`cklmQh" L8-4b.A[1S^ 7nߟ3Yk_ϮNT _M,K6#)"DjU2FTkA*?$Vn)Vvkl-YaVI`2-`'Έm b+"JOO`[[Q?R*LX956~Oɇ 8kĵWqYRYMDRV`X8]6 wuM`s/ Ts[\vߎ~(UUo?G~xʁ>j|Zn)kZm)P ZYv%onrpע?74wQ eXZZD.GZXWyomSڑ0oƒ7ۥ=n.E uFe"8Xz)&QS=lYO4[>v?jGL|*ĩUyJsP+ba+LE oeAFl+%/Fw5S?^,G%f Fv"BxSIl<6v,Ԋy:,gb4D=O<% ҘQ^kR EsmYEJ [h=/#*20eeEb0Q5KekɌ&-:Jt:i|p)k~VǨoVg_-Q&6s;-R$NUf9}+ZoV%z*N[1OQ.EW2C=F MgkcUm^.ӛO>~Z$'M_>‘çɩ\+ o~ΣoZB[rI\JV[U+-_~Y.ٳ9 k\K)++[FG&2Hvvt{ h!={LNNܹ/Q| J‚t롳Z%}3g,[ڇ~'۷}k]~… 2ࠬƍwޕ=FGG}ܯ nd$#HwmUTT$! ["v"amTi_E7Л}3D<]mU#y_1Yj>\ 2N[AI7  NmpVC+?*Af";/+X.NzcK&2\\)xg8pSwvB?:NT9xIA3ց^劲-!9`ZiCK*fPubdt qS ~%*xka,#˹Pv:7c>uU^9Dqhk7 ?1 ͤBv#-? |6bP8s!ŗ8]2$DHVDa lY|tQ^6EċYB&Ѫ6|f66$X\ ??۪?uhpޟT}іjYVކp+:OêLiV;ՐE[*LQD/*TD[YܳКhyk5nV8iJ*w8xDy>MW)j:OD@ fIJR~5;<*>j6sbg oRWZ\{(c pjYhM![: "Z6[ +_z _o|ϼɹԎQ>:VhkY/ʒ+%%%> 322U,BVhKrRV-Emmmhi({X=T(֣Voo㨶q[z'N>}Z[tS֡@V8qㆶ>t钺?~\VSS 5<<,ʹn0n޼)?^{nyW˂j[/^L~=NF2d$;}kA$YdKl*$#&o­ᔔs!@ L3LlZ_k`ZY8މjH.CC(KLw#RlzB|Gv@T,.tC\: x]g!LP#ebTprV )#Rƻn>o|֒ke'jL5^ 5mV+^dgbzVTP8 OǰҚ2 UlhBfjf&אi 6dšJE|P,)vS|Uk 2N5**3n>uqoKc:|kuʼnLl󼉍wy8&ڇ]kK$θ9 iv8׈UM4 ns1*Zbh == Жyf>?ڥ%]ጲ7ny?G[=m̵mVUUozS+ӭeZPNlG.o+[־^Z㼄D Trۡ2rj6=Ό v(ZLQch..8gA"lk\IbCt,]gڌ{U:j5uR!nbiWD[ 9(3fFm~@3yO+ ʬYw0ݺmfgqTzvYsYNq3 Y6ñj{%bc/3lϝ+SnZɫ7zdے}y5PMTSiBWіH ֔;`ҥY`Q\&&&&'' JT9ÐZ#)tעeCѭ@dbm}+%>ŋ/1Ч[Ǐ閜rqۆq]櫶d\K}ZZZd(/G|89\xWWם;wd$#HF2h!KіsG77B&Z~lwWAj~ t6>`PUX o2: rY(FB/N<#g0N^Q/h29d|l&Aidqt QN|;U GMXH '+BCtuDAǕ-T\NLLp sh52ZYo"/&֗ĆpmgO/YI_Iع73`HYy ձR&PlKr-> NFlh+'0*|ҭYVm[{+c E*hKQ:9JJ2+"Ƣ)򩔯 4ct> 5l7 j5\ D[2YygϞ{j+H$S)C `ItkbqLOO jnIȜ/]tmS{d;wn~~ԩS>:}v__HR%ݻwr示Z500k. a}'|{2ɓ'.gϞM~INF2d$; D8DJMD+VɱE/?h Ml [Zy>0]j ֒tɯz;>9&ѵM+iUH|=:PI%wC4f*$M{hׅ Atoh/z '>{P 3DTf@[eGa lǼ^:&E@[q>z@[nj3On+|晏طB[v)U&^~ ڒBUUUr^%?WA3}엢{* :wtt((d(O~Ĭ,\Tm,RTѭ@!th}cٳ=zڵkׯ_aի.]pٳg[K}xxXG> w>}de|Nf: Sr!r o~[ou?w߽w۷en/HF2d|'ЖDrؑ0-V h`?̍nAqYxdQ Td]FȧrZsb/=BSj"?D4'M7 hunMpBlBDR.(ꡳQ! [u.(#29^a N쭴mocuae(`P[9T1xϒk(RHF%v P⇊T[r?eaV`YN Uդsƻ`{ *2 F< DzQdC=&eM|/hI&k .iX> 5@ml |yw9TRuNs7yW15Tp+ ɠ27));8{(f{qV5YE9&mFF'̿8?|A[<m}t-s5_Tg~մ&82b sJR%(5Bu[ Uz)mNtdG(|,+Pը5>Z,֚}r _p/3Rm}-m i ,._fV2mSYݭ̪L7nfg x9y]됸Mh?F^K+wiu>{Yzc *gŌa'nl^3~Im{M~V+F|2hkr,!2qiA< m:Q__/nhhZ&qY壭>|ȑ#:veKoo\Z QP`ʷdB[V-n=Dݻ}u`I,%W͛7o1_am>}ĉCע1;;++)+ )Y7 Q2|fkYij~~wO?pK_d\N\2d$#HF2'"ƕ =L"' ­HF6>(`߫ȏ52En<~:r/R hVdܨ] ,H#JBQ a*2'1ReZu10JkEOC=*z42 faYx25]}=źgxJrl1m6"t%ułڪhU aeb-l-ZZˍ >O>yy睷~[~޽{Wf"Pvԩwd$#HF2hhhHoMŶC$w0m0erwn@k[L hPz1>JHq^4s&} gΑÑ, a3fx@n lBLPKAQ)uMM mV\%Nx@AE" [wيcQXW2k/wV .L jWe;`ia&ZbUg *Orx -@g;e~f:;D+Jf(mshzDRHC˯4R/kbV-<N5S g0WZumGzPy9gL!"/afX>=@[L$*nFD$іdlH O>&cǎ/6mm}_EEW kUuMDZ_>Iz-BYYQ.e"fU؂j,#W)\ERrnHaKk; gRګ'<j=kf9hg2b\۬C!qzhYU[;,!Mt|;.V|^Q-0T㬍v<˵6 2A޾_}કk Fk%FYx,ܢּ5H v2G Ѷ}V֥ȴ|]KâNdbomuvv577v[>kP1"+Q{``/Sձcdž hk=ĵ4d䞞1صkԔY'{ϼC[ҭeR+(lAǵ!uyZm)גŔK...iiim82yeȪʯ2 >-\7m8'OL~=NF2d$vD[Kі$t2)hLtf"hm/huW^{Y@_/x*9TO>Yn8-jr!cT; J*T:|ۋ[jWq.}ͦz/BU诀;-pC<ƛjacT}8<>fW8jhE)^gs ,cavJxg˭+{Nq>1$GINhe-Z{30[Ѐں 4Ols.L@k^:pb2,T6a>d_,Eqg&z:Bd|n6hV4\% Bh(4;$ڒghϟRi. ̯$l̗7P]LY8en ]U,` ^$&zh-ʠ(dq9C^evS]y{bZ=|LPmm}?y3@@-Pb֧}Q:ҭWxb&t*%k߲hk*U/=h9XZdA Y 7VsцC0^e -C\۝'ҭ[|qfy$?Ń&̵M[*$C[jWjl#8-KP%;رc||\i'NRӣ-_rtssso)#kAU/2Uɖwy>O}g}{w!oLd>208HF2?KQm%1WΒԢ2߮hKR oģ}f `pf/z(f !cCeI]9UqhKk7dblX @vL-1N7je;^%z !VLuӔ^sqwO2=ka8,x|+aYӹ:5A\s͸qdo8Yd ^@diCeMQZfPp:øXD1t %K6үڒ97M0wRi̜]&vLth Dk…&RMU𢏦!# 'h˧me~Zpo&m#Y{,:OIn2n2Ҥti_l[7zV6mbsgm% vj-{`aj-glb--HLuL,heM[l %[kM9|㣭مĹi_p#ʳ 7Lu) 5 Q)VX*(n`Yeʷq~|>dL"RڔM@[D[G[h+''GmB!Wmeee(EIGK"rQ͕3*ھ}C$m{cc/-\ZkQePT_&+FlYJG[!ݛŔSTTT]]-K3222==}q2Kd^{… Ν;{|O>>O?裏޵[o82@r2d$#Ow$Jp-c/ #BUl+2&˒ÝD`>ڒCy%́ mS1ʲT=;2茉3:x2!g8]O{V!wqҩBJ:Ŵ[cV@Z *C`XWOǭj] 8ZЁh \9( taQz-.jWi?F) x(ӣ;}: `5!Z$e`,Ȃs|1뫩šP-^Dl`3O~/~@Xm`}P^Ut/يtnSՇu.6J,=w=[aF~-W5Q_7 p(5Op-8+H眉rCE6A"n8`E;A"஋{>UXXm/O) +YH4Zn RԴReES9?ۭ|J XT\7@^6ПX^+= ,UFvOPmg{^cF@5?mJV,n΋;gAܥhV;nDV١˯ TnwXL.I(gw䇹oe@7 0;~~*ݚc(v"h ULjE[#hKR>򍶂h˯IT$ /r*>ZKR_<ɱ15q)hdcNR\\cSSS#!'[m#hҭCFaõ$N:W#*ںr hw/\Zʵ֨7ސ{; __v2~ĉW;j 5Ԏ^]'$'#HF2|K-miubC.F`MԸ&kIzQh˫ zX$9}M<V]Z ᩄ C9NRQ}PvI#(L+vPOϨgvYTFuP%U uh}X>NFlh;в龾ׂ}Zb$P)Mnt5 E,3l Yߖ0jvw+h g[CeKOє0jNmqc|]@cj]7VrZOPTj/kSN{|#R+*\L Iy哧ɦւL{A%z)b[xyěD[CU(YNmIZm=& 䨋{SS5Z'gddyyy~ϸKQ,((Ã{NOOOLLܹshh_6kzAO/TIرC uUUUeO~WvxHk֣.K:?n-+cǎɥQ aj%0:::33!hݓ=z뭻w*Ruܹ3gn===j%}g~O?O>?Pf"E%$'#HF2|mKh+D&6OA"=o%7?iuN#+,)Vmדu`|-bFe'w ܜ@XNT$ZQ@[uixpz{ {wnFBph f_0Q~6sh w:CEXy¹ ,#1&hXm+Kn=>yCwm5 wxbz9x:~l_ǧaq[^6k18@\DbN&-! Cɣ;Jr1N~྄E*þ,ƴ\Kk؀vHekㄑxMk9e&Zy9U]O(l"  $ڒǮh=uhk΅{|QU [>ڪ#zYBq.^j;:kZ̥M[IQ94@j4a-Gn櫶SZ!A'lC|[Wa>RTe5U^6 fM ϖhk5 97SYZ"N\Րo,*Y˸m<|'ځ| +oǩ%I&ݚIgYhY8AjCHht.dmk\Ԣ߉UTT*++[JKKLNNN ٧FWW>\~EMKJJTf}}}Q ܂r2'\Mve2M Zzzz_Qi֣>Zji}ҭe=sLm]~=N<-߿6j++sY,hK|߻wO:{HA;Y49ҥKW^{G}{{p?Vߐd$#N|J-н(# '%&R_j6΁jK)7^ PdcAÍEjuho@'!./&҉[O_m78k ;͝7?Q΢$NhaE5= (utlj'ʑ\=TZX=`^r?btڼK%r/A͝GSc{J' kݪW+p4g3>|ú-|,o6-0qIy+~\٨DŽHrl46֚84Qn}8#N Z-0j61[a4H ԟ?(pȪ /;-lx`qGڼ4/3fڅmžTng,0Tqa݆wɸPWݜ,RrVbn2NN:.ĉR.?֘p S4opJfD[9_]c1+\+ʉw )*#*ê-&fЛMAwm ? Hv7?e $U8f~{ A#M>~52=k9rNWR."֗]V}9 o ڒǴh_>hk\͜e5쯺$)2 FhvY,MZ D1%!cy7!4w#kۘ6] zȲiN^j[[0*^e_UU[ȊW  DDZkVX;)[Ce,h\] ҅ikOIg>g֋u=­^r7g[^*>+)֫(j,m붗9q]xH5JzyO',;ʢj5j2;!:zz ?*ݺA[mmmi̕n9FS+[\\\__A[V)8jV.5R,dgKKJJV=E*'̔dJ.(,Zm@Zҭ\Kܹsj\˷|Amϟwzp8|r.ƍ3d+Wr^_h'abܹs~Dus%'#HF2] D[pFƆ@"l)ݏ44Ϗ>7Rl7Vd|3TL΄wnEh+ %HF@&I3LUo [p&],7Z?  t nA[>b!!J:AR J}0h}, iQU~^;GxM[`פ r - w>ҭʫhJȢt*`D,'*a$Re$~m6*`йR6{olpy="ڍp3E'vAwKi:Q# g$p "Ig8&653 ] W+~ˑUkܪh'm1ڊ=uhwCͥ&ҘUқM! Ɯ%6c`PKg-!9IAҏwYIn-ٖ|IvH]IcWuAm%]5*,j|,|;-9$K~͝NU {m+ 8{ uϴj<UCVUeU[[)z,\ѫF \GFSvPޒJK4L'Z@IsssflGZZڣZlhk)zTI9";v'O:uӏj(ٳg].\p-9&_|޺w'''eKHU[ʵd_]FVϩ)Y'Nye;wܽ{3ƻ+ya$'#HF2] vD[KV0dWaU¼lS&i̴[#e1h3ЖjO>.5n3h NS p $z- ikJN!YkR:VIvk,|{+p4nXgzʡ(/RFT C 169~xxL\_>Qof=cJ`RVvw/e} ywu_ ԉ.rqi36 oЖ{\gS'8C D_qyM&yHP\О]EF/r7d2n;Nŝ58]@ݥ\\D[8+.qc?_'_I'>i㕚XsJ *MtD:Mo/[V}y+RDі<-~@O)J&ҜUP![ZښHc: fɣv-vRdY R.[dVH*m JRax;5 w `T4LMT59R Mߧ?Zj&QuhQ+֒=cwJU!X3LW '@zdW@զVU|ڧliA۟Z@[=uk֑i5dK,)3 ;eȸ ڠPo\Jk TvZc؂|4ՒR[n Ky'^7X1gu/3Մ3zF[ո8OMss9rɓڕ+Wn޼!UUU===yyyq"5V6 CB*LqO\KmCU7xG%{A>Nh H|ff+Ie2LfvvQeTj!@L0ddrSEE[+$m r xq mi۷eO.3_V5Pwܑ ʏ˞2|+EB5bq)Z壭,-5LrNX9_Tf>( oOS'|fff{cǎ:uܹs/^v mmmiiiYYYs-קgjjjbbbttthhH6ʁ֭[%Z~[Fy(Cd2HssNOMM}˔ae)yKf5h6pzzZ.2Umݽ,Zz Z N>ZgΜ-2dp7ސ[)tj% uŖ\L[nݺD[ kɻZnd$#Hw%6oޜD[Aۍ&)T&bLgZ*7Dx:L4p&znE=DY;n&ὈP8Nhq_7<ⓠ(N>~ɢ!S\9QoB+C "\{s~hV_2I |*.dh+RgD՘:d&bk=IUUUmyOznhùk"_Mmh߽*jS-n!qoFJl@lZ(f!-^i7YA)hk l8ֲm EGʈ!޺7YxXPB 5m=;8驿Z+JYlt_jn9͜ 8gL_'( lɷ6 /!3J;q}K˪ܾnYEu惢pVܖ5j;$meЖϒy%{꯾k.uR:tO>}e߱cG}}C֭[5aAAϵdfmwމ ˀr4c$Hccc===2^xSSer.9EO[)))sssc&nچP&<88٩DeeeyyyrR9Q/,,޳gCtQ'Z,KZ'2 d({nݺuEYիW/_,c2l+φ,~ڵk2rL@._& 7ߍd$#Ć hG[^h؊noiPoM+7 LzA eLx2  43I 곂_/{2T FjAptlˍI^2i"H$)INJVBnS7h&L|IJ3zI赼;} A 󤩴/Z~UATD(.ѫB%h*;0 ,l%+fC|7yuh5&*g0yU!J=7z!*>ݬ@zZZ Eq\E;D+CN Yq "#*?r _ vj$S)C q,yBBn"]&R^,-0+Y}hz1VOmtnnͪ5__t4ɧ[Z:Wc-Bclp_M- Zl_EAUK&m{3BR!mL7lK}z)VzmO+_x]w7r5b( }}|08l-j91uc:Af ^ĶqcwcxFr@\I|NҤnxC[9hoӪjh@[{y'yO@d}%5޹s5Jd:$A[ vRRR]^>jooۿ#GN8tgPNܼ{Ǐ۷OAжmd999ʵ+++}%B]QB-%NT@NWuLofffΝ UUU2F9ŲU2y>i:={E[2-9JILUiH=ݥtі-5.\+ђut2ϻw^zuzzZu\rʸt钌){k׮g@6x뭷_~p8|)d~~^^'{Νwd$#HF2+nݺ$ZmMdD'qOq93.8 ;N"J߭~ZK D(2z~I~\g &ٸ^f ~I3T%o)̀BizJԴ8|*e+Db\j*Y$8syBuښ&꧉})W8* zvW\C6G)8- YTzߕM <6T5x`XE@[XXqM㾅W:J9j.9&"˜dhqO JˇA3ViiNuAR> Icud5CPvEjM8D^fgɢӈ^rn`f]tW@.u:OvM֍8j@zK \_WjьmG,^{T[ҟj#YP`6L%B4J'/ZcsD[i+j v;ZζZe鴦Jear s)\+OV:IUusFG,PCl[CymەQ#n{;j^ ,<.:s'U5dXE}Қpnܶڧm>z/N$ 몪ǡ[ dddbbbffFC{h2`qqƙ3g?o)))$333//χZ@E[ڙqY%UI{0\m^z֭w2CV-#dbɂUvSOCgLܦmevtthAbSSSEE-9}n\ .ZJS)7Hyڒ.^hKi-ƛoeg9Vl?#lɻHF2d|WW^I r|4a{8A3pZ =BrMLx#uPD.&KWД0T?I|VA`Jukbh3%7/i6 P,V2ĻpvTQFgLh#>xay8)M5@%Om!*KPЎ]&~JH 6 `NH] B&^+4oYws?VgԳ@cTRA]9ۺQ>Eo[0Oʷ:|ѐh+E[~VGF>%%/JJJѽIVff寓ӣ5hv횝ݷoS__/ctZviٳgzzZg]]]iiVA(\kfZ5y̙ .믿>22-ՒsɰE!K!Wm/%d>eݻ^(+644499)~ѓ'OǵdRVLFі^\r(R:Z>ݒkzO9\c \DugϪy\›o_J>d۲βڷo>qo!|**Wd$#HF2+/&"DVjKڂw xT%EMl~~52nl'";fZQpwA;x=~7  V2^PVlb5 luq}IS:f&TN#r2P6œ*|m Ϣbu_ *8tPsUzFPV:wc%cWCyJM|V)/Z“\p/~偱rp]!8wyzɩxc`Sq%l{HpXvd. aZ&Z~CdWc<9v=ϲ ^^pOCQ$y9 5 2;drjmE]C3w RrŃD sApmr`&amZ}hKeӈV +`&r$;zy['lD䋬=VRsܶ \Zp{2KEZ?}OV7{j K 1_ƍF'B$m筲j-L*XX{43EWcwv86-%-Ҭz,,Pc79,ذScLc +j`VmJ0ﴶoJ!Z-,-a7x>Lg@JUhśU/>|m3QIB\CC÷[RN+..v\MMM===t8D:;;{|yyynnNRM]&8)o3mg-PYxR$1WW~cשZ8Z9 sՖ`.2Mc)*,P3X+E?|$ˇ 8` /RILlYj`T* {.7;A!>^ R,sqZ N;\v*Ca y-!qU"R/#l-$)b@x*T3my`\T _RM49fbsvrWHOSu…/D1z6t'''gddPOliiۛ-ܹsƍB"##_E[V!UxI8ޯ]|Y ފ&CS^G3nђi!FqY6NLLB[4~}ӧO?~,#hCVWWign7m m餡iP47q4VI~|tz-CUUUE ez,--!ht!Mɓ'&ŏuЯvvv ӅdZ;]Zʊ;;^H_~[qmQ3~/?2?q^4H7[qnZ ys7Qore"!UF"1YGzv7*_%22IހX(3a(JК:FъТ@J!*gdT##C rze>6Ϳcnza@EckTF ,ybUM*no0 a{@ :U Ɍ *ïxn\!]Y*p34>Z ‹>TZF D sTʋ~ Ю.0bF?{he|iO#K\׺B+~wi?$3 7#VؗBO?[\R<+Xu]*ckA׺男?2(+&=0Zˈ޻],ij^KݏD߁fpF$=. L@< &Ib"+&VLe%Lӥj1D"o''(^\}xM ZV R.,<*L7)\68FF:]dTsY֤*]Ni i[תTBjײLl%ABi=i:;2˒0إ0I4DU o:TMz)MGti֌)(Pnuj/ԖeXSy˜ϓFi3g)ڒ&55DVLLn\o[IIIR0??dUTT755ѫI ݢ222~s-ג;U\2%LE[&jmmmh:_tDϯMEL[-MM>33ЏrP\r\H]/ܜh]z=y&6::EsɈxLjDZ֋ݿmQô:0mȴhfڜk׮I"I3Uk$Ç{{{©hJ3% qssS;;^=zP}0іl"㳈E,_:eh4-*OamqBby+UVVf97/!:3je0{l^w:#3!C2ʴzsP*/TI( I ق@`$Ql. QYgkY!ׯ,}CV 50RMdJU8]|[9PJIrڢ*U%ոVB;XɭݽmUi{b'نOFhGڡ΃6nhc~ˌ2C+gҢߵhB322jkk711199ya2󋋋*/fPtyjjjff&uXRRR^^^QQAĊG^^^vv6 jI/]!ɵ(.Nƪ7P, ZHHGt\QE#.//onnZі Z[[-'Ͷ&'kyA3-u(Dr@t&J!hN/ZIJ=ݻ۴zٳg"ꓖLoht۷" b;;x@>,[Q8&Ry+89VKF)2.>Mg-Ĺ\Bw@j8{#pzoVQ e\ X@[+XUMF\K5ed|hs<>N "q/P<-S=۳ٟ!f2,=՘GBO5S3.9 uYE%ɏE\n'Ȣ,<'Ɩ_@[ 0(xG0:/j&cG* $MV5>5P%eLCSЖYZ,șoHWN &2^3*ʔ Vpv!ħ1b\9ݸ\׍ր[WVi 5ڢgCˁ^F֞`NYg-Nho!S#T3ҴEyZc$jϳo&ND'8($ao5luuF[vavʡzއp-o*{D?aW~Xo̩WPpk z\u* :Z7pwTBHQ-)#=pV6S츕TL(nHHa0d2_V"\ @+>g@?sPc[J6bV|YOU 'vr QqF^͐qj8 3PcvP( ְA=kc\HvBs*81?Ab׸b 8)\e`o"U[P+a6c\/BxZT}4'7ōl .f9O'8ӕ'r*2f0/)%$[ۦ|7ʗ ,m=[_ e9{֛{γ+Ic;jޞDD8nЦ LC KI.|Z:NZ%M4Kk$Ds4uZkxkŘk,~Y&622<_prn|uio+ٴ,Aʴ֫] J?|9p+0Z?|Yڍ4IT^µZsFG?Y<>9̬)Fr 3&tKKJ?ebQ3n[+g_{ ^EڒhooDzt$]W\_]]~~nQQQ[lll\\\bbbrrrZZp-OHHdA[B ~-ڊ|QUZZz O9Ңjkk hdڍf:M.,**Bzt:KJJDVUUEthL%8(rƍ-A[*:.[cighiCh[ҭYSZ hztpiinƆI. swL Z۝;wn߾}֭-ZKOOMw-ѣG?sW ;C[VƳ?7\HFUJcCw'S~عߔ F UL wFyO*1n 1[K81L CR6D,gq!*#.Q'2܌iXU6*R{MǐWwXˢX.ON'ٜ* 4w9ݯj"d8zIO!$B Xƭ4c78R78 ,.( */ ,-kd Vchȵ'.@FguY+ԪaZl5- I-Z7Lwdq%'1^F[9Q ^UFNXE$}ܘbr*R㨟(,UW#q֤|l#kVnd\$_ zn/#zcyze0vl'R)ΧC1&Mkx'NgYI.Ӫj(aҩ-/=)hzџΊ:!Y* JCHc7ª)ݮX\7S,7l_Rd9[ZovMb=gA1V jAjYo=.nlop^ A*8S4Uײ#26A-a-Lҥ0- 3[ +dLK, +C[ b_%26 S7_f[\"媯ohhhjjjiiikk%0LⓄ&'' 2 ,K`!%bu47E[.]ylihqqe:NU ݢ7"g:N!DԢjll˩-+ݚ]XX[nyݥsZ[[ӭ\EI2/_K>$E/RB,pI~ .O].+l"ܹCik׮ٳg" "e;;^-uq{Z׊WJ廢~u;w*kʷ<ʆH CE̵jPySQƏT`E_V"}a6A(ri<蠐8\%O?kAc\Vi 5]*Zj21dF-O*pSl&aČ+v~KIVvǏd,z9"~&u1u/d,ơE`;e8[Oj+ӄ!jEųq: \>P='/Y WvZZb˥btx73 1 ._y'Cgg.jFBղ̜;&EMub+D-)kkSrgk56H*LA^ 5œS ق<4bj6tk 5+QN\QpVblvjUW.hbQ=Og<_3Rx)Z>GIqG;v6#η_uo󇇇GFFuppPTWW immp[7n8dÕ}0LDc52x.ڢ%مR0 QTTDǻPB[UUUeee"*--C'B\!։zQ\533#v[ׯ_y|~(t6& ^.eggZhG,NK7vYKKKuДLwQ\vzC PWq@!hgFGGѯ"4ZF76ڲ;ÎWmR'x`1UhL)XG[FA[,rP h+n,jZ/{g]uP;Z-^[:)$6b9Y(-l &]Zs%Js*t;5צ2:UhZ!0\>W54ʹ- \+W};a۬LC-=e܆V-J(Э8VL揁9WAS)peqQmy%eD[?s2xvl't W)a TRR0UrҮ -j,}bt։5XD :rGbR1q|2Zf]vV>J=`]xoB"% f8%sm `j"Mډ=I^MsXT ($[1Vu:m|apfnD *5R|KC33keC ʡbj+"R>3Zo8_aYVf牎SnmQUPP0::* A3NtJf]MMܼp٧8KƊ0칐J0׷D[e\vKh-L/Rrr2-VGnZfcc#׬NxC)߀n -Ew}ghKh4Dbb"K6'&&AѭC&ڢ4gZb&zWǝ;wpm 4r NhߤTkkk4 h-:x}{ ]C薍;C[gΜ(bUύ*o*c]ճ?^'7cx9У/Q/I1pMOMS70#c)iRV \g=`[qaqT3n5]Ԃh*73׋&X8;2B.dpVfx` {*x\)Fs]C`,O.TkyZ5쭪Ru(.ь}@pn$~e-ȩ<v9SI'ptN- ,9XV(DBh/sBTcaA\14A1H8r >rNUFgF&Z6p v+..XǗ\m5-SZm|jn>?o)1pʵ |j,}hK2_,ˈ^s2xrlbgNoZ/7k#qZR6YWTZN|+Y:xdZ@4 4T7Wqf>e`&)% }@TX2qYϔljՇ LJmATKTK̔hڴab*H ۀNXȄ._ SKIT0l'πkp}kZxcMHl0SӒpG,CCA+) )3,jh߬Sk,*/'DVڵ 0ݻܩq[;Ig΋b)_ϣ|U~¸;sngo~kp8&&&[ZZCYYYٹqD#M׮]"^pΤ?_EEE999R|Bt\υWVBu7hKSo)-$33S AY]O.!-VO"׊?LWH\$JXb~~~}}}ww?ڢ Ҹ{#4kߒnͭ޽{Wxp-:.h~|ݻs-k/5 =ܼy@s mmnndK.L}-VlvaڢoP>B[LJ KL\+_;[32jcFA?zRpȉ;Y;WQ XKPLc` (z%|^R4݋T "-1,Fk.M'kW8) fуC詙$FA*:[x=MTpY(t+T4v3'ê^bCX$.vOYP2<䛹` *$=/ʾ ( RU -^"{ۄdn$c஄.Fa1i{@b)-ќ Õ+;dyM4:V8]Iy3E24Ґء'7kQ_ly#Tum/)zƅ_%"^I7>) hL4 İ XCr5@>,7k]ѰȫGoT[5:E [)Z?koPeJOϣyna2_iO&]Q*am;Ѐ7Mci#_'az@ID_u倀:H*D83Q,LҔOxc.Oi:Kvg.a)z̶GC\Ŗ\8܂cG;v*&97WgY6;ei繎fE׿h!699XUU%G+J|||bbbRRRJJ )rnAtfLLLdd$]Hѯ{zz.-:z)0d;VU___VVG22NL:E%tvT[*QB±1nhhHLG:0_^^\YYioo9ҴSSS%Qxs{xnf-Z]Zt\K[Ixx0߿O'߻wOFs-3,I4͛ *Ǐ?zȔtF[vavʡ-d?V a0R[!:x3RĸȝXy ]g؇Ny+oU)QTnО ^Î.NZdHRupa5~עj)@C_VZ4I &H<[WvEaddR)4YdĪ9n JXyZB~[: @FU(.K, Սr^h+xY@C**C< )u9P G/'T~8Q !^Shg!v|X{A'I hn,ӺVԂyILHzFu68Ԓvm6UPtRDuAX#ii'yTou'5AXk% ZrʬW8z#2*z;E1Q| 2 vUXS˱vi#:ROǛʃg"Ikm=7KTIц(=b̤YsAtۉHe%'Z/4kl2vCf3y[Ļlؗ5q9vҚn牕}_5JHHhjj+,,4V$t}RB:::FGG'''Wtl$o)ћrJNNByȅ4fJVLh 2m+2wX-t?$p8. !iK~_])lf.vxzz 16 DH7 -Z8;;;bЫ4677 :Dd&ڲf# ڢ~VVV666hz!hPae<3M533c+;ÎW m!{O,hVg&zdqM`[  VxpA9;r/>EL8%"hs9 9ROW*(jel<# WI65"#4sR[Ax^T!gy ("{W/[*!aʄ{2M_ΎU+ $$:fHu[!3dVՆLI;у'gB[ijlQVTh mP^5??g qHEfzVg 3{KszR5@Z u^"qiW"Ŋ/PZqncﱌ!)ܓ 77qܼ7J۸qU2f4uʗ,y }|Yo[.3u(_QwRr|9 ^Hh,Eq& G,,QYϩ qrv<G܀]zUj`h)BLbhku+Jd'U@R 0j U@c4Xkz]L4aMJfu[Ҫf%~:x](_н4<0!=8bthpYLe{φ /[jWfўE.aQuXX4l;aӥߺ3s}˖;x7hh+**$&&B[B.X999}}}N3%%. nrΦj@Cסԣ)z.݊!%t@ a1--MRH VЯ’13;La[GfK:uuu4+C[[s]UUUv‚8KYF3vvvꍋZӧt\KƥmINd5ihknnNT[t\_wxR.Љj!C5 M\^Oå2l?IՀA$ȷLf,W1)rUή>M}WMB$c4jETu^80 Si* Э ᛛ$k]6@_+@Ceځٚm^}5~ۙycٝv>F[RБ:eүRRRUKGVuuv7444әh5u_$^f"qϥ[4=J钒*ܒvcc#]UVVVXXxHE .H:-AinCEEuiCDҌ& e+io4:MvohMMMkqqqeeJJ #={>~xnnnAofgg&2sG;w跷n~!Zsovavj-Vfá䨿_?g 7Qߥob'_҇F-2YfmS29bBvFsEjNڭ$F[Fjt;bjgw)63' Vymu_Q.q%D[NA^_BU3V;XsuFg&PF0*SU3 ^d(J7-6xm8Td_9=Hc.vo'e^l9zr R%M{mDmvz-CB(*'rW%t+WWT. 9QYoiqˬ7ۗ,(!c.Ί&wOwi_Qh1j䯘!aʽ $0dI'*N"9wշ6| m3AmWpru0vl#R IW(؅cWpuxd!"45W@%Mlb7:`WZ-*8UCµN#@lއ* צڿts.m3lVd5Fk8bCUpIXS { F[aFFQO]zSP)ZvZbfqEuMl"6f&|@T?F=ǏW\y.&|^q4SޢQumzzzKKKvvvFF[!%eddW i肂<mI.3jǾJdWN9&2,q] 3V)_94FP2KIi<2*OfBR@ 儚Lll)BFrVdXƹ~Ÿ^[|aTX匘a*[TRz ^jiˆI4"Ï~t'50 BЖ a]*TCWqyWiF3T[)aTjB*_Ma<%Wޚ02іF(**:m^LoEGo,e<>6]Az-TU.G<)H K.x˷C$MYzkbhR]Fq:ͻ 6oIBDV( UN.M8uh n#d Gx:ل*i!ק`c]8X])Щ!RA{1R|M[4kd «*Fi.w }.OhȚ4o]ȲhbpS*07_;XG;)-kՒM %$ڪj+<}VmoџC +//БbC#yRmj~m o>)AX[[[QQQZZZUUmVaaaqq1͙zQ3RRJJ ͐Τnh8+))[SSCC[і)ܢߊJJRZ%hChbuuu4DGG78h>vR2>7L500@"-D-0M K 9]~ӧO?sڵׯ@,,,P'dKЖ$ܻw:DWWWщ}ۣsmѸa;;x}k%UΪzrmyN){Bқ0 Ek7˄*SѣkЭerfLX?tX2]Aq+e +TU';c\I6$*\BU~j䘷-JNn;<}F[222b-kfgg :Ho^JmzzzϪ^-ڢ?}ѣ7nonnʽbzOݥKn-3=y?-Jlvaɱ(ڢ7G+ӯ3WXs)F^'7qhȋá 2n(:s  g2~IAKSF:31 5H c$RbvsZb ŠEsޜ@ F!FQEbS}ep6.F*D\Bzu]XTp l6gIU F1#bX6 B7J6Hט !4S,c Ţbs :LDRd*R2ˀ2y\՗c3<9Y22CNs`Z$F2( GL=hp64.XW1O1ChWؕKْkG>f2nFrQEF[,*7c.P%ӅVwWMl8+S()i-栁kRyI2 ίfm~[`mHL'pSr3V? r%h$l%&"@ն]VRs,c2qՖ[8'WTLUX\jےFټ4KyA5fQ 6abu}3EPп&04CK-;١Rzչ"r,f̵*t%J_7-yKMn[0*jxFñ-ѕY2r e&}5p۔`#m%%%: PK"+++##C$$Zh/zoooOOOwwwWWWggLNNN~myĢ")(WH ㊵S*644UWW;NV"٢.?dM755mIJ#-r566 R2R.]DW{:HitSRSS_nkE]]͖O݇G|K%E>|xݻGGwvvL$3CzG[W^Yć~(~rf%;ÎW mpmOgO=+O<߾OekMQ*@w93myT^ː8r8.x[)ߜy)cNPa%@ܕ=f._jH (+'39atp]PFFɀW c"ORF"Si4=H3xڑ3EҟHR qJ| @\#QA&SkK4)ieK 6.ꒈ*b6N!F)(Zb_߃9̂Nkт([a5V a9 3ZV(8١ZU*נ愵Z`VJ5l1&6[*yHӕ7RMF\[n ciVcv9'!E.|5t7v X} U1o}%fwyr[}f%B/IELLLr-B_555UTTuUJJ੄_z{{ڨp8i&#AGnn.R]]-NeJh&&3#''4DfIff&-?))AKsڵk7o\]]]YY驩!VjK6%ưoۢ3kkkiGע-[|_T| ВG=~%nYgNEܽ{OWvavrh\9kapJy+=?b#|'-e?WwS H[G-忥|0k*UKQH|`qz9SȄYngs,V!!TBԎKq<X- &lh YM K*TZF5cDJэ&&K Ɍsh}.d1jdoy )5x[k Є>PWht2~ e%C sc;Nsk8 2N ,b]͢=bвψ]% iKh.^nl \D;BE"1-_=$Xec.VV_PƖr3pZ?3aO>OyqpVp}NOFm~(&W'AL~LjɖD2}ӵ5V"?8f%ܩB\"Jɵf>I?OγsiӨi4|D`XŢί#V`օ7BL zMܡ]SvViEhJrb^pR-BI#~tR˂lh꒑+Ȭ\ b5:=,yb>.nD*Г c+zK'FjW.c~~[yc'y0jyc#(7 RSSM>c WUTT*///..v:%%%eee.Pf_BBuHo222ĎEAJz|$Ɉāi%](i4sah4LSZYYںu߸qڵk t)x3z_%{nS?Q%jcc"ZZZZ[[RpoocSЪn V}޽O>!HӠ? a;ÎWm*{,hkCnyʿq[[Լ'і8/Vh`, Z\rZ1ĺ~@eɐ.XdUzp>$֩~ȭ~AvPϨ@ѽ$,Dj}=4`sDl~Z7y,'pB=l8 rHZ<fvIZy0ȊGfY"jcxVP˺58mƧ* \P' rZiUx@&o~|3*ڎv1ڢ}Ky)O 7oykh:D[ˈ~WjKf|HUɯP1@)-SJ)KqU?A["JH/( f=4Va az}^TXVs u$rkYј5z\0MbՁqG8Lc:V:c=8}tYգ~=1c1әf&Ks.?}$:lƊ1(^i 3Yy K~^@f^eA-_ ޾j>H<9Xmm #2sM:Q(9}tNJJ p8~LC;/^qq+W;;;!].,K SuP{O;Nd5++(---4m577Ӡ .F|(tkaaassswwݻok׮4N1{ZCt먧MEĨm%ct|}} YzEB/맧WVV666G[24Bl LlY'6NTk(͚ߗfNh L`L }|w$ckܲ \u頱XnxSC+? I4\NR13̬-p\ˬKh?"OJNN?kEEE» Ngiii1EhK2&''{zz[&ΒHAc UJh>RPVWW hP.))V'_B vww̭[766N 'uշ[Gz%u"EASsZ?]h]"nDSS\__3i| ĞvO!i-4:n;ÎWm|P\+MW aSy땿K~{=k(OF+_)U-Af( P1QE82 $ĝ挶F[u5 Q?Y ,(c .UYk> z`ib82 `j"}-B/p`khN]擏Y8_P5W33{|_E}beD[.ml\I;&6RӰB*;}fsh'Uwa~:F?-N)V7屚(<ʘUy U-32r"`{ŶKB= 2aEPr ,ZhDBkԈF$p1zZVNE\01WPpi9˜-D^?TB)J|1Y5\-! 3b{ 9 xIAj!X,VmUs)K" -Xԋ' &)n]FAȔ(tClfqųX:n %ldQV<{ԧ2 겘ʗj:9ƒ-) V{<_h{" w# qaaF\YYY^^lkk%iq Y__ӧO={F=߿_SSCV |QjH[ټ:HA;444::zƍ۷o{<ixMg% r4ɵEQt` VAi;ÎW45BRܯі=}] qW'<+fU0sxf,9|Ǝ#W>mSLg@W-ܸ.^ pM*؋ h?3LK3Wkė{\;]/4nhb{XDkk*hmL?Q/"R&6fwfBfJFz EHp*~5'P0ʅ3i:Vmdl>]Jgʁ;b4pa(Tql϶,*FXtUK뀑W~X4xg嘴 pW^r,3.n0Bvg0 :\lk*p/:m͂Xn=UIpL_W&$aEʟϵѝ.e||򽮼qGD[tv/7;?QjA$[a- ^X Ka p$@$$(R"EfNJޓxwcٖLLG)xӧSv0o}O N$=}mۅ{^XxK^JKQ vA ]ש%[%9)Vm9tMrTPs&R^@n?_B~ UM 1H.pfA-Q? T&8+1 s~|4=NhF4Ѯn=:u@% cȷȭ$2Lj^Z4H"ePj>AU!^ش|nP}AOf%#됆-Yumv=X]T42>dH 1 hvoN+B[/?]$dKq'vuuщ555b3c٤,C" ǎ;u@-z1333<ȞPitիWo޼yw}ÇeQZZZhNC|8C{$#J3)uwwȂkѢ.\AlGGm- d-zzzv3 + +(--ֺh!Uhҗ6XD$0JEAv_W D1a]Pw!D1 {+3^+P&t BGxdz$/A1:P ~%P(UIs0B!wկm`Ӫp#8~dkbyr-N18X؇}؋M?A[]LQ]@Ƭg[*x eLq+ Pm¥9Zq9X :H?( QيpHxSIVB0,*mP0W>;q:< _* Y5U yaן?mס}.F>h閯k`ʿ]Gk%?Z#zv=_Xx񫎏6|5 R,Uf)-VF[`/v :<ت(|8nOl_hFk'\߃EG+bn3jyQ-߃j l4xK"bap@H9.x^Y_ S,ȉiM;4 П49X?րkU =(g >mфg\^E+YnJPkƑx\ߦZSKWN^J]W65Mgi-SOmStˌnh+)))//opKv[[[ UWW'f%I\=([6D~~r钒2*~YfO+Af[]] JLLI^xqqq"z=zD{K3loodP I\LȈ(ZOF\rh}}}ڒ+W #hhk&t_h"%HcD:3 + +Ӡ?,m-Tx_Q 7F-Vxs>Dn+WF ?B{A;P\VU8W?|. XZu@"v#M,d⯄[u諝SB}3/f?od&JQ=gzC.< ' 瀶~s_ο;, I@йf.Eyc? Q

͸˝]F?Y2 d7$`G.Blv(_:]wBmeffqs>G)D&G5 Bn]H)C `/N|ڪ(nCc.Hf,A[/jmG1$&΁dW# uj14f_պE8WTZ.~r}1yv]٭bbuYƁbԫ ܤVŚ%jt}lkt)~Bڵ_բxpx e&LLoǐi,٣:B[+⻟"xZn\4f+,,,))q.-nRh[NÂDssΝ>}ѣtznbfp-!?BN8A?B4TZk=< m-p! oZoկ7ײ'tjinHTLە?N&aUrJ<;th+8Pm |*) 8'?{_?c=ͱy5:X~7yTE͝L~k_O;oQVÉxU!=3fyڧUh PPp ' gcRnŃ,P DxA;|k3Lg7,GxF[M6L Dgd) Y` N|d[*3 +er5(lZwa0Tfn-8 AWID<hX=(XHVaˢțTU+ЖEyQ$B+c9퐸gB|tG);V[MgM,,A[qr`ҌAd B_4[[4ڀ[bR2p x4h4n"8(JjpBh?HcGJoz,V]ƪ" yEkj g?l.ȁ՘Cɚ^3@:tivY Y:5j_ڇ=OBA*%K|+ a}Xi7HR"ڲlCCC]]]b]``hˠ[׺+>>>;;n|ppa'ק;fF[nޢa Ma.zpdff&%%*mnn.I1̩&&&FGGn >whJtdbbV__߉'Sֳ-qHv]DYvn}eeӶwvvTi.\01,6YvƨIݑݠtgggϟ?Ow3 + +Ӡ,4%GwT}  ڊTEqh+XRb$_U)_-[Tc0γ/oWh ܩ55 P*;޸} RADd\QUJ*NTq 6/` {X\Q`TtF@J+mf0Id6@jluUҿcpjeё0Ǹ`pD~[\0T\TX /a9脞{J4pfh7TVo `qx2bϜ3ܥBL(CbfܯN6Gd V4ؒ2Qr?Z1u>`=hXS!XvVm+wsFyR'3D[(7m|pyϡLJiD'6ht@xU}uThElU/m Hhٚ9Axut1 ØjpMM POc&DRN:斅cq WU d0x3_kդ8Տj3WJRj҅<= 6J(P Xb3ML19+Wn `@P'.g@kSS8AnLuHWwN`7R;i7?үn*--ljV-p{rh+33S[FDaa8G y}zvvvaaItdCE4RRRRSS靲2ZÇeJB.77711IUDqBzeLRj$E[6:###==566JkH3Z\\l¸!eqNXW} 䤳? .c\L(i|*qDt Y~(PjT`IxAs^Հ9I<@J3x3d箈Vg= Xi5HLbcP%k'\1tZ{f 3tt lfv;z8Ưy*KzJ!2ؼ7&(la`!kYmfq;XVXdϪpqƣXfe0 ||P B^#sHTT X%}Shd"* /t͚KpK I^X%`XkElsAoR0ZLFe4`YD2ڿl@gq87^LK°yC.E90~h@F#,r鲕Ьu=)i3O5"]ZX֋[;|]zKXlGk] \NvoIDWQ/2 GFFĴp#N'c-*,h+###kMd"&''ǥ^gggMMq]"lijj'N8uԹsΜ9#mnwcc# (//UѢJKKv;+77Ojjj!=1KTEɶ6B˵ֺ`=wKy=cEQ.^hHԝm8[ou n֥K~ +95EVkTm݀ZH'\E_zXMRރw@YH!Z^39VP(b-rj+Ń)6_b5gw1ڏ|UhWhi w9g9C a# 9Cle=JX ł'OP*x;U]6nBeEP Æ@7a1bYأ*el,\*T[.Fc$\m ?i[pɼ 0,B !EKAa(v&KN)Za?XNG:HR""Ԗõ,1xtMf4mZļ+_6oVNV=\Uj+BWĭʻ'µ>CEO+cGu;vL*рHHHx6$"D8z^XlD\az'OaE[O7LGI{[ZZmі]qnnnvvK#tuuf8ΖAqƈb?==}ߧEY[aVXaskTX(7K"höV,Q {/wf| !*Q (oJ~&$6 GPȺ\spm  YJ>-0Pl+F{GeLafm`Y)U2"BlG?)k^J̗v^A ڌwTuie赆uAKEg#7V?d])O+57#3b`Ő?ZsXrv3Y*03)XQ(*j|?̈Эs[%‹R|CpKLآHn&}g_9jlKVqqؘ7bZ qPE/`"aMtww755#dee5===77wڵ/];::n7R__p8PDW2- AFFMI\'m#Ihk-2-3I1E[OZ j\\\jj*V˗/\bvvޡM><@K;%it"իW#x :~~~&yͻw_i`+ +xN %j Z*T}"裮Z.I\W2~m{T&z|Q?M:Z66SӪ|s+@_`5t*tCa-{PW5EB3lz#1}B anYX^X 蹛 $?u>ϡ\bZ`yI{Up/B#YU*U0x#ێ+!F|(x^ >O l\B1^&Q^L/< *lY3y\-- Kc$|H>O 'KZC2Ahr|<Vm" ”Gd9_߇..3YeMڢ/[ʧUmG?hkyOܐELJ>ը6,S-Z~΃3M& RS p%@|,FxQ~lbjl펞gŒY4㒶qE\s(Th.KU1ak.5l%Zb_%OE^Q^Z!h5yp *b0XL(942]mY ڇmȇZF[9k<"sP[Ģ-C}'yP{QWFEF[?VII8w<);^thxm[UXTTOKKknnnmm%E\Ku̙ׯ_pԩSGi9bMt:m6[rrDD`PRyG54TeeeVVN~6҅=!h4ц 23ngϞ5::j heOA[#:tGmmm]r@[ƍKKK˗/&Ӆ<OSS*;oߦ^Jgҭ7ݻGi`+ +xNֺhANeB[>T d,e|^7SX٩|[`@k`ya¸s:Scʗ{ljJ&N=WHJ#0/O;ީVS)E`X@Qت *F[0CєB=N 쳕 U(Aӭ7 }M~YU~ ` rEz 2 'KLf1z"ְ-fr]Ux?s JvgC*8rSaEЉ9?"WU@/_kS:'K**+!oF]g5R1{vI*zJ|]ѷe%U+߇QV 2)ŀr)NyVß_VĜ+i? ?& |C; 4J5u1"G*@HEd0˩m\@[zV214G >)wa&ppKՆ] :w:&V ipw鵈?UjbS!ŦLs p)N=S*%L&g=ygOW,ֻwd7g'Ȟ@`_@)Mih VXP(\ˆ īn$}˾տiQho>E511apa6M=9mQhKĂ~1fE^[[,n===>qą nܸq5z133355%x<"?OMM]eV%1==MVNN4U|6> m7=n\4YIͪUJuі\9'n8Z*++ h[n]~իŢↆÇݻ[oݼyr x9:ν{o!3 + +Ӡ,m|ݜWgRaS|G(ß* kի!=W+YŬ=m*_y0Y nWET 3}Vk{}(NLX:2[UiIU%М /{Z3V⾇PLW0Ol_ (<“\unN&qGvOqkWT M+jt@+fegSUPԽ`~_h\[cy8,o 6dG! G9i9'Ȧ{;B?ȔdB)5hЦӁ{߈*4VBnY$t/*, LYEy N.KYvH'1F>^[=ys5}O}zTj"J@'4T48Ɯ]`)t_L)*Nɮ\b_e/89Ȍ\-&k!eWZڪ7VooЭIݽ{ڵkR711ALjyaa! JpӳbAiO,< mPڪϋ Yd.ݢA<333c-31[W5b 9vl6PWWG{K ~Jś7o^to֭[Mp̄vvÇ޽{ܹCЍ/_<77G_~}ii̙3W\ + B[OA[TfRڱ7wr-/ʛJc}!eH{Yd\LƀVV -n ]P)_V[_e).K M۴{H%> Vңp{yqA?keĮVmǹK̊aFh~FJB_A|6 %eChL'P:j 󠒪bFcQi`,sb;v1g놡V&O5wѳ*ôin: p5b8Xéah FqoU6ŝbbJL7 9QX+¯qd+j [Up˂sЋҟY*:aOwnby@[ktis% =i m"DqohB0a<^&lYm2u/XFcDiJBQ(N۳hO@v jl&eF[6UUl阭MM>Ҙ;0`0d&]zReٷTs-bYE}3֪p4`(܄`{SIWi寴G{sHs;^aFiܩ]Zʵ/v=&DpK;ELqmΫ۽$}}KGm}ُx 2[;vL: y:T%F=mQڒ#Kh򥥥joo2saa֭[odkk+R\\IW644"5]Z JOOia122rteU[ ͤٞ:ugϞhv Zk뺺:ϙ3gE[$ ƕ+W}.͙֕H_ڥJ[؁7"ܺy7{?iEBAݻ<|}zo^vN_\\p˗JwK mYaVXaz:ƈ%~ss9a(oZڥVʷM)w@l#Yeh&]?Z6${mƀ'w3re')_4`),cr6m|UpWLdj EU-)QKj.E U)$NUp` vUi 豑6sع/sU\G[`߀.v~|DB°ǡbB#p2Oy,gXFX[aDNÀ"}:':)t5ipJ\]&` H^.,IʿEB HTbnN)o)?/FrC߰(ߐ)oѭWdZ*R}ڤ8Y-zN\^cspb.aM`2J0KnMh2Tf XFl&g˼_ J.H5#BSmMWfJXI2Kuha8>Kdcjvb6,GtNL..9 n5ڒlۡ࢝klĔ1x6e4o{LJS# 4ۃUlmtj*BwlP l_[vi{kav.jpKOʆƾh?=ɫjVEbbbWWa>44422266&Yf̵vIՈtiCO.+**nhhp\fu)|{w~?[[[kkkv{vvm mI\Ǐ?yA 3m!I.!^4X]JKK E+2-^qhiψ֥[ӴEt:W4l6[YYY]]ml__]v!+[dj6Eksw}}L#, Ο?O3T[VXaVX\Ǯ],>NEypZQ_VMQpk{/w0lާ=1 aN V=[m0؄[U*tL}7_?oldènVLΰ!|xA-_3YoNkP2qC0j0gp$FE+Tr&]=pBpS\Ⱦ[ނNq+5OpDa.ўU+ 趚LwLcui[6tJ.&xYˌ 9YJֆ9jA1H'֔N }1lُU9 TssFah0BwAu]8bQr++c.@JzA[2`ƭT/#( WZܵQZf| p9I7lAՋ-|9񿦾Po~?ŽI+^| MHH'IrnыN >m%%%UpѩgϞ9s… k(,,YYY驩t9zQ\\\SSCtқoѣ{h:fEꞞq2- Ѫ:uJ薹*m ˉ+.. ~hK?ZtSyA[Fu$>EuVGוnhիBjq-١!0wҞ$/v[B\277G3 mYaVXas۷oֳ>T}أ/7Ɉ-J)o=@=ݱ)S)ow1`ԟFmoo.>)VS;< ݺ`?ފz!)Yo%o%)|Ɣ5ji򾆖۠ QK;#Yw#p;͓s;܏?ܟ >K?{" hK,'`?Bˌy~LID;ٚlDn^i~P[K=ܓA2AlkD\2r*Ukyt~0L'W2^2n,Z>`5,Kkz;y`B=%gڪ"y78 c'4ñ*B=mS&k 29HJm]xBM'zq7VY0n5;}<Fny!zo_~Ӧqa_ugY?,.x6׽X/?{C:$1v\ґޗRSS 1*ʋ/^vuS[QXX(h+%%E:-|8]EwDK[XX_|B[VXaVXƖ-[,]'ߩu*F* .!Ԃ;c@X*g\S^h{lL&x:~ZCU} ^>DV4~^-ϫa$,zP1,c%z`壀E\nTi(| _U hɊo1يXXQXŀ+<40\vyyW#zJM"]}ffޣ)ѝ=III9Эohh ڢ0s%S(yw}WBwݻBġ… /^Shi2VXaVXƦM, j-iM_>rfY;0` lc ,B5 NL.>q ad?\aqc u.5N\[r䲻2t8dgr, NFKi/A+G*xv0OF)O( x0M! YXW;,G͋O0g:ɨ_lD.ZX6N>KGi3qc^d+{gRqXx= za wϪ* uϪ8ï3ZvRp4c VU3 tG//PÚq$feZ=3jڢ'1j?hKSjrNUڰT"51_ҠR0dEP7 ZczlX- .ۮ}-,]ESL+/f*HfV_yQr1w2W)a5RX8Vݗٵ*Rc ~+oNေGb1÷k[l(ǘ.}4v*+ ň~6\* ˴ƬB^rti?15otmֿә}?z=_͑_9R7єw:#vqk_d{C<`\"333;;;///??H0WYYSK#\bVV|*)))zM߼yڵknZZZ_x@[ [fC'&$$Eͨʠ[]]]t<\]]Mo O3D\=*u:uٳgZZZ6V*1L nhkhhhpp~Ҕh4 E. {zzFFF %3'/_m=}?nI-ڥN6Si2rںmUµhgh&޽{+ XrA"gKxuT>*_aWy v-<` ;osOP:tDId7%F mv, 4UP#<ՏrEF@̦ k.ve6 v#xfZ>K+t7qfOhHQ!9}}7\-K,6(1EfDT,3 rrW)ulb6QĽ} vN=7iq:th2/J(;SATdL Yy#WtL*o:I.ΥCkSK cMOՊ m} jxzJez}~ՀhƂLTyEF`Ry%D֞d\+M|O1㔯L)Tšk,=KuI`=Ϩ(l 6 Wi ~043J]avzU&cb}ߨVOe0چݸiJ~M@!v;49}~mpl9[߳?O?_}/~.wap:۶Wʍ(SRR̘+++@[-:8'' ~h w˗//,,ܼySoqyA[.v744йV.}ĉzQy%2%F( ѹfÇ=ZÊxZ]Vg [kMoF[}}}t:m;mKIIIuuuKKKOOp-ځW^vM$mfuSNMOOtkpk]ǭǏ?xBĈ@+r:Pnp-ϝ;'-h8 p™3g4% + +xOimų-JoZj=v0M 4hǟ|mycTކ!:cKe*$UYŮY4G0B*d ;UX,al`-lW11p?Os]ɄUO4.Z>~ \-HO&IAD-p}Ӕ3)p:Q.tY.LU~-,UyQh#BVbJhD'*%cc|7[}W5m&g{ؗ9^?aާʟ v$/&@FIf  L] ŞyiUK_Z?C.Y8B@I|9ZL]"p V%ȹ?2bbbV-^Hբ ZdZLxaHxcub:>4Z"JaO׊_x' ǔh3vB(=4z;,Yg:b*Mb*Nݺ_Ӧh\XS;k OuL '}g |414hzNJADNTɋ,UgB|63 ǔj5eN\h(["ȉUH~6?^:Sm-G?}pĩ ə׶nF[)-W;LJJJIIIOOy3ZnȥDECeddl<wv{WW׹sΞ={iC&t…9֚R:]jr:%%%]qJLLibFd***ۻ -\[[[YYIҴ:2..NLhmK3ڢ y%ADAx K7nܸu0%)K9n=Ind߿Oђi4t-NZeM%7f"-qܹo<@E銴p`+ +xރy嗭}XmOY)(cA[?Y*0zFЖ*h g.2ס8 j ٲGzQBXQ2?PW+WJT!aM, KIY T0)\+(LP`*tʀT,CUEIzP ;ٌjVmIqSSĵ;D.\-}j3,.)"i aaVx/gH K6ØKFI(?WW%|]jfK֯Iq5 8?eM"~_vH%_ 3`V8@[YXr?qؔf+h2#a̭}%LcFmmFޫ 5 6ݑva/\;11t׹sNDۍc\kZk.Lv{III1^;Ǐׯ_pannnff288Dtu4-:Bf0.EhtbAAͪOZ%4hn]]]EEE4T\ Ӱ_xQC> EcٌΝ;Gp[nݾ}ƍO['N{pˠ[9wܡ..J;)wO@644 :Mnŋ@>|ݻ(q E, +'m>铌X,Rzц`43Wemq/z!*f]\@2-zɘIg_DttJe{&Ч2? Ӄ(zUYcL<&}dj M)Zs>H-NZ ӲLmӾu-d=:Ȩ@Sz4 XZg˴njsSw@qulA[MU~bT5%fY XR%­LG1+W}D:k3vsH{ڗ`Kgsm߮hn~cl3KI׷"ohK>sHZeU\+,++qqYE墫G===---"MIImnPMMMt-n/..EyY4fK#Ti>uPoo/C1f.3ע9 ݢ8qBp)Ut9 o7#/oݻw~m1֙3gh(32[%Ș蚤.PT|)O=.m{"[!P٧+"S4*% &e*f;4LƖM_dhG x=m1kVA[t@qq!٪khhhjjr\mmmn~477766כ@і0mq驩N]~rt<|+))Ms ,ɓ''''EWWccJJJE)48 x-4%\G_w} ZEO*K"-,̵xm\ҥKO4]WT[ D:ƍ)M + +~bΝ;}XmI.omf[{і*_y3"hV} R  KSW!jSD` ¯gP/T-gA$GT[lW<<YjdC9"~8U8=R j*) AA  lR(8bE%ڵkJD[j]MV]U7Tַ>zo_oy/691SDgY6Vbk5j;zuxL.O"JCnp}P jvek+`/)yIWDFZ{ #aKWek馇n5Ryݢ=|:΁k 0pDfeúI8Wť\;ǔk"[)K Xcue&&h 3i8q?aޔOCM۽F>ߙ?ogyL_螬h:ʖ_d~%D):pSЖy@ih ߭r)zshkkUWW'ұ:2I:rjǏn͙[ZZJץ L\zBlMWt>iXh?퉙k Zںp]QZ۷odKN1>uԭ[_VXaVXvmC^4nN_! wm_`dnT ~Y~ U ̩#|Gn⅝$ڬBаOu T`;+- s qd* kXhag*j$TWJZ,Vt %dy/ L>B{V,o㖅Y?AM)1Y-w@]*µl#~Y `eTxViJK0Øh 8n0˷a/ژӯЄ:UpGa(D gp|=UVse OF2>fU 6&уE拽?&2VK۬6szwmj`$?رcJus6)JUCXJovcf ~l <VAܕP˦R.35"4iZբeT6dbqp T*"m}x3#Ҽ/"ʒND~VK)ZL X?ie(&qo1# Tsj hkYXrʬ)n,ygeQqv%jіMx_vÊ3g]di%&,1Ag5ÐG|6tkX"0/qi]?OFء{MNp[]| g<СC",>fffhf.2I܌NLII}Skoox<(Ybr2Иýn[vA\.3444>>.ijjjpp8'''99EEEtbcccKK M^IIIU\kvv+--m,,,i[ҎpRnhˠ[?^%ܺxK-K\muuu ג PU\KN1[h2B5==m[n]v8Ř$ES~wVXaV$-ڇUhkfFmQz3RsmmLx|PR%仺mIީ|۫nEc&JgrM'H:["K \\FUo\8MNq38C6m[5\dC>i&Pr\י  }}}/U@P kH,$AZȲ [qbKy<-ж-[陑Gi%P$ D- Q)y'Of/"ߐ/WUL;}F!oXLљq}jS2FXE77>=7e!"/}w"P`Ȝ[u 1.ehDG[f2;Uu'•_?+ԭx·|}c?2.jP`BvQpT-}\y{+`Qa:|)iՖ7N}OO?@vܹmE|^^y]|\}Fe ?K}_~o#ۭ-od:\!klot]p_W`b>tG"B= bjuYASVjի-ɜeI8X Xv&I ЫR&p[ݺqWRڰi(fZ|uh6\*}a,@2``VjsЭD V<6b%8Od[V2to06~bw_xb?UU}$YpϾٜm6F[C%,}݈-'H0s孋MκPhkUXZWW,-޾Uh+%%e``@Vmmm9ZUUHS G5==M/-cvv6]7kQC˒͒ѵsEy>>>)q*566&UtB[pY^^"^4??ܹUha-&\]59DFЖ8g]vM 4`z49iNsڢ_\ux|ol)cB3*p+m`*åʨnYgY E Ȣ\e/Y~4.z*w[2WƳ*Q Qeq,9n<.*e-*tcP5.?229(HbOz,]Q`J _S%qLgYZh41WVqh|؝GgmT+Q;6zױI,@2ZP*]{QWǘP^rrt3%ewgq}sYBߥyȢ ,:cCwuq-vb 4ctUh^TWQ/|PVXXJ6[YBZPsj`Y~XUO#SW9[iwcQ,T~T:2W-kt#JVЍ2heL4bLU5hU8\DB{v@S+0f]SjhɩI*WNŲ;5qU%`Bկce>B,@;VrL8n* y+ЖMֆ+Yn ۦ KYdkV V.-!anҀS4 r(ЅI,x~?s\}7qs v˿D>W_/U(;S槩IJJJZZZn_okk[V-؎h1_[[KY7Ԕ%ZfJsssōHBz+33r2###++K 5.nnmQyׯ\r9IpzhZVhG[QQ6Zh.%!Ƶkל߽NsӜ4<-\ukj7;mՐc-c5!űz +owP<$[r@W7)olsq:B-f苆uB1p1bka= LiXBLJbYU $da9(YUύ%T0@e(PokB7\o~MɑNiF2YH]bp{N%(@β*d'8" yp g/a ]L Ez;׎ Z^ǒ0&Q\J\Q Dz)_?^:[ 7lUޭ0(_Bۨ<,bg7O֓B[;vXv&^RZWBTc sQtK[BMBCK'!%nגvq#62uPX@-8Wgb:71mhk'Hi9YY5H.W Hqx*^ZuTֆt#y~ǻ.,iSɸ> u~V=a'w!Vr>hlD/J@ych0aDF5撿9VV60].Ksı9y<;g y*;t:~shlllVVVFFơC233Ee-R%TTT֮E[&ISqy=>>'hv #VSSSMMMYYYii)777<4>,\1[{{;.((cCCN/i"Z]REg gffN8qK ҩSh~& {zzг[V ݲdmY\E$?ikve1ڵkdK Eh*eih%{ziNsӜ洟'E?{>ڒ6&'TSqX̆M+om/Y 7nlUS5hDƹ,[G3XdlȽz>ƝY.OU܃M0>^,`2_z:t|+T;cq}ʌ,Ky~sx~)aus vd5誔ql/Q*K*p ˣ٦6(0C蛐&̰WdN*9$kvWkm/|>O mm߾}%D[;CVZRJboQǧ6^xaU_Q_ړ0@n'͆8rp-6FEZc~tkpu! ]%O3@=qXI>Yۭα-좠)J@[`GZ"JĽ8)OA sn1VzZer5 ǵ-[\KlRD2~07Oj\r-rᤢ*\.W9{mR!JZuVNJ,L:flvs>l7 P%*aK/rgshdddAAA^^^\\\ZZZnnmIΕFoWVVі8h'&0H%YrhF0EqݖyNW܈v566FO豫E466Ob~~~vvvzz:]DAtЙ/.// -GnhhX˵~$"iݝh4f~~ފ-ڑšjm[˵,%Z,:eW Ȳ-:SnXE4JNsӜ4<-\PK)Rm? t*+4^m0ᘦa|>j8߉Sēࡋf9Bxmg퓑DR4傑V39A=X `eF𩟻-={ ߍ$efˆ2)9RCʷ%' +M5|nHe5o2v2GjQ"Q*RC#_sYF>HTF{0y\Ѭew!4aZ sYURgkV3*8b b6᳑$vVr" e)3C܃aCRGqZ[9cf1Oq)}P!գNEW?Mo/-o&K$y-WPRm۶m+@u/Lݣ^:nŨIK]{f~b-킶o6*xT(axJ[k頭:QrDu8kJ`;; K$^Жij'^,@F5"2;: #u3F+V#;I̓t+#nBF԰Gz)S0Q &[N/`mZںZP:@Emuvb)%٩op/Rx~߮}aڗ)іCbzVyIi6roGxw?[]*eZ vy1U*yN+jԍ$Y%223ޭJփͦ >Z欠&]'*NZFL"t#ɏuFFͬ+0 ±$+TE̝% m3 y=%>є\'@qW@HI &\x$Ne^NE= 7ÕzmVܽe!S`#mAyʕ'>3=Wܟ ںuJ?PhkF&fu% 'gL<'gd vu? ң\5 $XlA[F6nJW1pxyXGЖ`$@Y"IV;.nm=\nB[Zjz\tҤeSzbHvA[IRV2?]nB`UYv@cBiԅ}e@( )|yـR0E7ܭ\D,w,^)]SO9M_q[yycV9?2~{s6TM'S|<333X*{V\\\~~J\VjVlllMMMCCã KMv ȠufeeHUJJZUTTʊ788866&\krr؅LhM{Ѿ%DۢDz2?;;+tڵkoߦǓ'Oٹ#=z˞HsLА-%u!LLL.jkQtҙ3g-//߹s֭[bBRX[hŋgϞu~:iNsӜsE[=Ft% &R=mqR%{|tIxlĥ̫ )Up-NG_8q b!&ϩep@QOCGwh h 6~GAdPIԩprq1VuOt.z"pDj2b|) @,caZ b3!bN n=|lVL6<Es02a9Rpe1^3A᲌C|Y "fK9C,'9 ,`No<3*02s8͞NX6Xe2ghUS(،v{,QT?41Z!(a5.1?OܜD~C[/7Aϟ}ۼyzhkӁUqOX󛻋? tP븭lt(i\ڪ)@c`;jY2Nf`eҍŬ|#إ)k ÒrWSo7@E[br$sM ͵Dnk SFȝXymFmp4dG N.W$>Gc(.,מDbE4e`[_4RՆW0q>6Y%Պ8LFN֦NGqIoFt|Ǡܛ'+QAukzizu/0ďD̴s-ݢ1---YYYn{]Dٚsb~(梥644466JĢ":ZmWTT[rqY&&&;9fk333V]%i]jhE[:{\ *nͣ)@봸<~8HcY~Bt1[ںpӧi%<˺ ׹s$7ի/^kR__OHN8oJ_NsӜ4|B:OC4sW?"! 0m}\*P_/=آP+vqlecp5CcP {9=ޗ1IȹƅyGNQ^pS<uI8=PQUl6Hzo,JP.e<{T |3P[eXpaecW}Neae 3#PDyA^ʜd f !úb,WorgW_:YZ9F]'qt!= ͂aQ[P/{j+NF_{>\Fta4P13K0/lJeu5ҢȮCkw3r%D_ihKu}w^yw֓B[=zhkӁ6*q7}1&ĝ,uD;ϑ(-܊LQ`H TCAdk0g(Z#uzM)5ط n_RS/ c5FA׃z`xJRw/ē 1QqEd}ՐsS>hiuU?ެ t4b@xfi(Ŭ5qYaqmW7"Ҷ nV=^ߤ^ߨؠ>~h7@(&&a\KXP||< vWUUbm-ne{?hk)-rNOOX|֜' Жo/ZC$x' T|kXVA%B i@1t<V זQfeC6/D 1P7IU#jT]( o]SS53Vxegd2}z9AlnWx%%F- 4[o~')B.[޸ eYO m mbbbƵ$#SXXXZZZYYh s=m=Yha(jQQQT'677MLLH)H-**sloGd###Ү֥[===mmm 4*E)l"魵b-REVW9}`򮕄oO [@;{3g.Y͎- x<.]%^z͛ׯ_{+hNCЁΝ;w .sIu~a 㷟V ---r~h̹F[<ƪo -;da{r--űW p9*9NҲaK`d*ƗYcfyH1Z18f[4KEeV8lb} mLeIYel sZH?HG݅C<Ă1#gAVB- n5@72%7+N|LgW*;9~<hW sXі}?ƍC[OzV=o&}1;ݢ:JF5=J3mh(I܈G2@[`5(vT ꒂYW@PP4YuώdY8\ ^'zYE킶\*5Jbm8X@R"Y=&u+l>rmb\ D+sKLZ_¸j 0 %~j;{iIhk@6F[O Y_GpA[H8Z_ElaYEvBfFGGggg'''% ҉Fq#8ѭfMI ZB-ZnOO*햵q[hI4+^ps-..pk,%usЭSN *=h/ ^}ջw4ЁāH_Z(1燮Ӝ栭z뭷>8hiNi-!\P _Gǖ(A[~0NTsV(8+l 1e1aiP@^E)ؤz0elUNvN~QZSlp3k㔿\(wH(N UsBz$αIPOଭaeL* Ts؁vIS-* y'0U a $vDއIYYtALE5ҍfQti"I\>8,t:Tp2P>HKG]fźA_ sѴFf|3`V815a&>8T+I?B;qWI]CP*PA=m`/QywLyҸ{0w'՞}VӁ6*uzи'̢/ǿ[3dFD!cC[ZaZT5(S.Nr( 2ЕB,*iA"\ 9zp:PL.A`b`  `A5Fz%6Z<@v#CHnA<\2`4*ҹXpt\"`b}/a!׼Hl\UlDe,RײR+m3MbUy/y;oGd_3syE[~Ж(bbb$Ze%kⲲD[?4k+-,E+5*z,))Uۇt =ljja4 z,7tfnll?XWWG/麉Q퍮Z59ѭUPZmm0UQ\K‚(\ZZD[Dax%4>̢"J)OǢUY>G_ z<IzWiĉ䴑^%fA[Ns~fh|?p洟8ZscuoUG5xڵj[yXE]Ж/m=Lƶd岆hwws\U,aW 92ݿ]qry`KcV#\lAx0Ab)Ts΄*d!\Q1T L c*xø !S o8Ǽgـʂ+*z9Žm|{|:6ԅG3ai EldiøW%CNHDcќaflDAfP0XABHF@RV>]pC(d=+ IIjŪbzhƀY1i@JR&]yYQ*I6v5ڪQ_@P,6.dk )zKP>?ݟwRy+$ڰazh+A[OG{R)bY ;Y^I6X 5- m4m'~ T|`f;g z YR("`qb)huyb,2 pDUc[I)Vb;tiZ$nu j򮠭:\Vat{T+IՊwDp\ m³ZjԤ#sl05?S"n3RS>7E#]_RJL&7{{k_8A[kևڊ%\*V|||tt233sss JJJ[@[?BVтh EEEeee999NZdŇѰC?Ytk-z9:=XY^t[qXe*s*V[[ۇF xnQ[˵m]|Y0$SE[,5::EP,:h͛7_z饫W^tAnݺu)Id{o̴'TJr~:iN #J v%m9i?F?~%*:/Yu !,5B[}ʷ EJ-b*f?G =U:CO"|,hTYH2#Vks)V(E&#1(efp4+ FT&8,#\?Y.e$BS4[3@[]: tVGK ׯ̋*S/|}Kzx<ݴG9ˌŌCwF8A)|\_==wb]Y9UEeӔ ^j.# ^<5vnFz(gӤBF./+ D\VD]G Xon- ͅJE>#};Qoqيgyfmlӄ"=Iof}4ݺ+nHf#ɡ̥P֖tYmXK܈5uz|zFL5:wjY.h!)HNKS]rorl?o13$oUmʻcR= X˗j@f)Oy8aW†OH{{gm=+ocsx'o)XR=08%KKҀD\6eRfPAYDdk i6vts`;"^N@$h+%TKUvUBSm-U3Vbe84(8­lQZy lE8^c i*8V6ZčZh+22R=s-Z"2meee 8hPn4VBKOO5"ZRvv6mIIIr"ֵ>&Z=:11144dWUUD3F+kƤ;עaH1{K,%kkkm,5999۸ncccǏ"R-Q.˟H#kjjZ[[hG:<ЖI}+W]zNk[^^ʉVmGKEW-z49яo}+,,ɢ__׿m4zkkOa_ec<ϟ|75bu! h˗6ypmq,Rܽim <bJUPɼ@[س|MʗuiǗuP,3'*wÃbMrfHrbYh! .1'6a]T+փe3a “y0ds06pfq``yjtu.C`6xT.w@pT9/]V*Ud_kq}߹*&/փQ)(Ў ~;'Ʒf1P/X^ ::ԋ݋֛+̉S܍*VӸs!3,N@b`ʫIfErr>_"Ib=|qdN甿Kyy$Xܫ%Su{'6nܸ6iB[QŢwvx 0W&ٚhkOzteȨ&{zq:kzeojMk9 ׋4`!"7s0vmh⠭u֝mEGG ŊXkH])))YYYEe.k"||qšсIhfZUYY%Z-OtKNGo.tKWKJJD6F dcR-ZtCc*latkעY1ɿ5lk’l5KaEoѹ ע't Z4:G ںpႄ}st5x,m\^^%q[ [9i?;;G?QzI 6ܻwo |4_y`D׾47 @ZӞVPP࠭GF3oWWϲ&SŨs|׊c+"25E{G9\)@[<ƨVȁSfJNs 6'U`y*w &w[݂`VUm\U0ڂ\vp/WgHY,TM F3; 9c.DwMo`; 8|E_a^F<{';4 B&#`\Ӱ7]_uW ^b X2N+Ɓ#| 9Zkkcfk6!cEFX~l,@Հϱw6bh+$Bb;W9F[6fynuDG[6mZyn-_k}3țn(U77y)WCz6oQݚij޺>{80R![ZЦ3b 뱒<xMi2mB%+ Ғq<ٯoQGAI}OƴrehYB$CƬ5?=u l[:qRGc鏩u:~aPr~$[p"ebaUz}Vaf[6oɾ栭Gmj(""a\Kp=EME̢ײC-i?ڲ]&M. rݥٙRSSI=ڲ >n>|xlll``b-ݒښ.**bڜzNKA+kkkںצlMLLЀZqq8ˆssslh~ -RK< sZx%ޢ[\vʕ+/^<ٳgNs~hkϞ=@@v%--M^~ߥw"h۲wߥ_7nܰoݺe;KjVy͛ӞFdԽCyi/Q];%8KWt0r/9oDS TSlI LG#V'Α}Ų-闿XҔ/^s@J{PoYRv-ou{0zVV>5hkVliEwv>$Mky:Z})6$Z%}4ҙZ9Y@S.Q]cث +)AX:&]luNЖ ʷEԠ)(<_U9@v$B"v:7Y\4ChKPM}9 \Duk-X)t=^.! ([he1KpW}ڜW\Ȑ־D'kkuF[B""",MYh^ ),f)d(;ڲ\?ڲUIiiiIIIQQQAAA^^^NNNVV|ּVhat?nIF+K &LOOӻٴ|Zvqq ^ RMMMcc#!Ą8>>>55%^EzD #欬lhhk-(K@YoooOOOGG\t\њiUڢ}9jݢC/ܹs-[^^4{燮Ӝ洟6:{/}''qii-7?m|o覆o[4//<'Wu]ᴧm= t [oWW- ץMG:mqÜPr?:a]LENbkT!^}2*2n*p[#D# tz>===::\WWWYYI+YEdggnQj"%yժH-qSJTWff& hhhhii{{{ZVJ#+**$F9snE/{mjjj``@Q̌4ieytn:aZMBYE$zkrre;wܼyS[]9i?m-6_'WWmkqPڇ>!y l v[c0b8jA[@-X8ʎ;Nkivr|Q$hxZ}ף0G^- 9af_\P2Lh~738/Ee}T]ߣ-Hj:+O;T`%406P #Le#U pF'5a&xXe$`!NM%cT14 Yepa+eB>_`8V"/҈*fְ2lb4@/f-Fׅϣx6Qu%p̸Y6&ذ)]X_$l|E<'}"IfqY5g<\U+_Vso>gjqq*NcĶpBo]D+o-wOG[[lYyԠǗ[L.f%[3TkO`T6MdL/5ث2[UJֲYh:uMs@[L2:* lD! ׊JJ19k$LrtMK@jX|)!Bb$ UA[+C\{mv&p# z oL@Kϫt}tecV"hКnY5e=6Z  \j,J8yIiŽQ1!Ah;W|…s-..:uj~~0z%[ڪi$::P[[ӓ.A[ザhnI-^siNsOm_Z韞yk;=-h+_lhNE/_җd;Ѷ6Z]goӞ꠭- )Z)ЖN}[{ʕ'і= 8Э'̲}Y'=a׎秔#}rMUqp0N 7WD8^?NF>`WKk)ӣkja8qQ 1,(A0+ḫqV?\4H;Uto#_LD<݇2ApA 20("N@.Aerg\vcY e0NV"%>³jk/S5:9a(3WaZ@H2'INEᏏa怺g_\? ڬL(IY@e򷈾9L y}!Om +oc۞C"o6VVmk۰nuc{ R[O,E]XaV/&G vAI`%E3ulۄ[TyX&[4\VM Pp iEKk31B{C[vU`JU$X)՘ ];jzfE]jm(e_5fbUE:Z;młԥڴmCa[6W*'Nb[Q6D[ɒh%\.ֲ]IX^-C[Bp[uhθ .iFB:;;[ZZ$Uފfee jsݴ<@$JTR-NI,E]XX޹s_~饗n߾x_~U?nΞ=+ˊ:~ړhm tFBh`kk+mE,EM,k=~UW^yuӜSE['d}cޢ-ooOo}K6رcTaaa??ڷF77e˖-4F6677; =u~,9hhc{UʧZwz˕7;W}eR$8ѲYh+:dVī̅,bb$?@=z-~:^@ 2˙To(!(aj0|!gրuxX@zT͆$cެw YY-Oݬ¢Kv27*(iU}h cqX' 8zCi']H!TNLflu>r^2=Q͐})Eʿg+B;s B&r,:SJA[>Y%'=Ų=Ur E?|/PC׊Sʻ:-'nݺ6iB[!1fHlЁ6awac;޵ҷj4%@2Y-%hGgmLYŗς5-5I|7Ym p%i `slI%ǣ8)c%`>QZFN,GWҭ*},(C'\*D:mFѕ^BZZV.£\V|FZu{ЮAk2"e-Vq2_KyUuen~'%{5s{'nvZui-ZeB#&K$. p͉-{kU.ӟ~Uо$zW=nY[dnn-Y@yyDo[\ax+ۊ2;;{s^zW^{eT+mKKKgϞD%t~jrvBpxnh +P:)n㽕W_u~:iN顭;w~;߹ڿ˿ Ð5NgAQBNg2b9*PkE`-#ڡ#PX !G'-6ʕ.F ΐ!^jWf''Vm$J zHm9)D &'D2;$*!UPT5x(ũ_twLGD9)[{ұCȁw&@3%eke.>SηJǤS3*Y6ƽY͡nm!5a'c4YiF+Z8֤8BENlZ,YMLLѓ/٫W޸q֭["zWE+OҰK ƵxItxeFZi›7o^|ܹsRĉIXW@MѩW{9?w4k4-Pm߾}2ڢ|D?lƇ;iF? 8Kunfug>qi 97I|dv2y<&~hH-XٕhXP9FLN4m.{*0ǵAN?:‘VMrR;dcWN Cj)DK BTϱZeRRAh[6+aGie]$œ*?_YEf ^d{|ҋ<7͙`qMbAFpq\.x fJpgb$A^6*s4d$_XI 8Z|Л `.|v5XIc \K"##c%Z&"5dF}/f@}|mE[tRR*գSa\B[Ih\:::ۅq544XA륥EEEgrhRp՜ZK4訽ZbeeTKBi%DEiaIq+ў`4;;{)K}^Aȷ譛7o^~}yyn/_tϜ93??OLŹs<ϭ[>7nܸvEZ$K;F?oAtT[Ns~he@tX]H͚e'1[xB )s?$ŨPm8~$$D2dyUTˎH.&Gw5@WVD kCDͻs.|4P]TdcDGo_R+0ҬT|f+w>뽨8/=ۘny:՘6sON<5h+L-W7/̵^{ޛq]w(ľ{hl} E$A @J$EQj~8K$eg3*[!ш/[o%gK#$$$n>XKr1%]FXҸڝF[E;HTy vj}ѐT[9O=ܜ,[9E^0LC5| LNOr%Ã+]9˸1 r^]Fj!ZbؑmζbwRܸdQ-(Wmu"av)2kJDR I,hR[Zk I~lGV(NN#-Q[=8|^n%!L@\(*6ڥmu`zŘy S%3U[ZeH42"#$Y\Z)gj*u-OKO}Swҍ63ڢoO8[BϨmϝH}]k׮ ;A[Ԝj2sZVLS43*xhA6BғV 6jIh.Gѿ@P0 +vl_ 83S C87+AWIK-VAӕdWzXGC@2?;V $Z&:jy#6i3* (ĸRZ8nEC7agb@]S-gƓOe{@ .W%$b Z-bFͻr84wtL67 i4CZ0߇ G֩tm,BT<4֞I>\r Ks춂{=pm9Sd!7ɐiѢ^ m bsZ\7JMu:1Bu ̥[(&0'\ϭ ؤ*]v:SS'& qmE qZa#3|lks L拡Y"Q:vz…wZ{|ʿE }[xVfAKؽʟ`͟ESeP ߯#܁bbz&N=X~ohQQdxXA[#hYUg{mWm*gC-A[,l[)Gm|QWl8WA4*2Vohe7쁤Jj\TG4B:M8L$p j괗Tbv p  H= @TijK$hVD6۠~NW)e$hKT>&s5VJ֥1T:7)C KU`ZL­L%ɛ&ۆwk/5 oǾH]ARV4ec%f* դ3/\3]!1栭wu9":::555!!\b[$3QVZZZrrd&:6"ot9([f%B2REU^^.[2db&H򪢢fIII)))2In t\ "//訂tG&,0at}}}Όݻw=zܹsu<8̙3p˜h2-:ԩSg= exӱh@"ڱc|W~ko~ҙeg5o<#-qV|>л._lt 2˗mЖ=1\i&BPqr rx剿O(O;Npe,ne .Odhhkٺ}|yGF>4(Ş]tZ D(v2lS*DY5lk-8pbepTc(rf_?[) CyjVX* b`ɕ? SU=Ô,y#VmGPmiXXrMk`ƩMhv]ͿZyWI>)) X6ΆfqnIiO޶{r޴\ZN8ӕ!e`.pW+\I~ Üʕ3m9+~ϯzꙏu95C'ڜ)qbRAtn"&(D$\KKI dP) ?gF >ekL؁]kHIXV!]qp/7!57[%&sk\eWQyd>O(2)f:%5?Cas1ݔZ7S gՎ[ɘsk̇ Y?/ [cm͘y_ %hkVЕI|!Ot8 ED > eӧo<::*$3ӟ_"^r>o?$cw_!wo,Y$n\n\rm8.ydZ fL.ak Rz⻕O2rsAUs mÜ湟yD*0]Vp: (Ss"u>wO:]|KǷH0Χ+$>i/YS8WM똼1#j3|6W4 jegۤSibvpӠsqE"/ti\Q1b?:.S (Ѹ aF[NYaAF|s?6ߣ||ULh0p"7;<eTHwK%橷*x}=07K0/h+rg(W62U\ӽM8Qѕ\+{rWl& "qw.PmR^M!Zf؉m-]9tr}p36Ε|F'AW3T!K-7ˊHU 9!,I[[9hEEU In-IQPk,ٴT2XhEV]Pl*=HlO֛\MlY[}B-Ed͑qQP2r K\e¨^f7 ۠\F[d$,Q 5 ­=l}Yi^M}>2҆*MV: 99 bbbV+}OMM~###EL5U0JAϵ=2N&QVVVQQQBT#jjjD5k544dff0CE;r-^nX KID,((EE!ڭYtJYL薸Dںg;=۷o\~#rvڙwt𑢭{.:z3,̔#N#I-ԔN\#PvvtYS͵UW:VHTNK,Ӧ[5[1צqӬ KXkB[K1~ߡ>6ͩr(Y}VrʮXFa7K.R,ҝg E\F1s۫LvdFgNe4bn*5k"58FLh+wtО={ U__/6"q%1a-MOl6mdM3IΝ>'i/^߭QOCќz- EG V=\k }i%co)+V&E4ʯU(P[\iуW635(Oc.z&eAi~䲌?! +`G\kw/_R8ӰL14KK G2hj`Lf-j1+1dy~ܘlRn|ympk`,}VozQ/<J6̽_&1RF|\1 2JyB03:|[oL> 釱h)7DIV:ܕ&7(g 朘l6bݺu3cOh+C'_YessOoX-Dg7 Pᯞ:תuO&Vp;pM<ξql'%^YͪR =L%1 XɂYB HJL#{N4E$ he"d""[uE)"Y'&۱8!i&KCcf11, F`.A[-XM;y\݅ukUfXSSSVVVXXhZRRRDvt+)))11ї$6J~ЭXDJoF[x+e w,2YBDY$[עr#b0P͖4;vܹĉ?\P]]M4gE?ӣIH)uww:K2֭b23 z̙34azslg149ŋϝ;GGזp*qEAo mQbccc}}}/D ϊd|`5qGPP={a9ԂNZq3Hcr&gj^rh@[ \9h b8oQ8ŗƦq=WT[e+2~嚉 #Y?5/ b/)39j ,E#"NEW츕6nvVpqd+r; hwI/3Vr7y)|>?Jy)NrK(""zH,JF6P: @1|cFJmj(wYPޓx"j+bXIO'7 ح'!`ՉJv1myÔg,֠ئU1dgb0F(*b~reVv"54 Q &æ'm_~cOF[.:sykej5?bZ( )4STS< }bf4 )\IsMZbSZx  Pvjk&Ƣ-u}Йhk1`]aWUVq|Ti2Kk8PT^ڂVJQQߦVl_r?4ΰ2Ֆ.t̤[=& hT3SU[Q&V~3e#i(gӪi@[A[5YhN[6͐o!ڢiii WTT¢10KjV~~b10JpH-+BQt!UUUdkkkvK`hkǎw޷ođ#GN8199O̥[MMM555Fr"RZ^ڠeguuu{{D%IsU[¯g.:">'OнE{}SEqAzQǎ3 /hK (]C5k:z( NkB~@y?}J{^lw ς pt MkqqW&崡]mrYlU9'ªphFO]ؕ*𜊈CUʻ 3*7X*B2W%lŭIE3(c) %!_n \>ȷ|sU9=|Oqkϧ|)}."GyetpBiSbWR/̾@$]٩q 76 d5l=' ]| 3i\xs?w(_T1J;q e\;%\{zflmDNY,e5.lD2~ 21݁杳3tr~lqS-L>(}Ha>PO=Ói 9R8Z(k!4)a0yZ*fքH[h9t+{jk9. |2Ov*ũktbxW>N:g*quڰ1`bVmɀJx7_mE{'R4O80ߦeZNhڊ\+|"#=g u[U~Ж-\mdgggffJK˜rhc6qMV^^!2JZQՑ^i$J`QQN۵ZPP`d8MЖ!ڽ{ŰٳO>c=fЭ1iӦn:T`,+++AHdyy hZb#?k,4jB/CeR4RO:uY #ڰ'N"ڿ}KW*e\eTH%,16ĿUEI ~g֒%Kp{4fkqhG9V+*-wreRh].[7r`KaIUHZU_ ܉V+-Xt0N.C[ .#+gb`_yֳ:/eeW+&ZgĩvlEe82W~RAV:9ѓi+ѳMy|9pOLF/+JKTxgR8ia|XD^͵\ ЗOhXj`ܼ[85ʆ8eWx΍Pl %|:!rFdah\\9ܜZycŲ&1dsml%h哔'No3EK J~b M8 h[lk)2I`d$x:FX:y&QUU<")PiX@3ذ3Sp/3p4*$2z#g>s, ⩦[Lw/ [Ǘʘkя| ԊiLLPhK~\C5%hޡ,9ǹ3 vKC候#OPbh7RȢD Ӈ-6)E0$ 9Xxb64U­f+a#f裲J\Cl%tBCjj;AP;Q.W_Ui{[ \բ)K3 8-nf%z L^SfGboT`d_z5}MV}hk*zhKpAbbb %IwXXXXPP t8a39!h6t+''2()hZFAFꐌhjjRA[(3-%~BС'N?駟~' uȑ}رcxxQ[[[YYI~Nzzz6m$fGS5ʋ,e.Z} ɖbTDLXcRO:Z O+#1!fA[́oD @UVNI,W6p-mENKqջRB@w bS0X`6Zߟ10@Faj\@Kl^YzĞٳ Fo+>f!%3/]yCBx}x|w&v|r>ōUve|/ީN_>lD|s1Ut.ZwÝYաEbJ7iC>wNdX〶ImcSw :g?ѻp++lׂ\kkKhkhTfɨ6}D Nuya\Q6Xs`ys;h+2nl m nVdd$d-mQFmQO#bdff&''#hk2bkɖxyѬfbZr\ZWWז-[ &/Ж茆iЭ]v߿ȑ#gϞ|nMNN=zt||K5F:XE?] }Z4ɆZn,sHqSa%'N9 &tw$*{<BX ԒJȅŌeԁ h%U6D af͚:܎hmW\n\gB mQBDj7 BYcF[WF9W)BF[~*~!gu?63rw@[=NSVm%hkoa,5+.zA V4/|yoa(w>㵟u6y|3FRbd);S%x|_b?N;X1Eaëdݢ+7)7і7 -s(Rf+UZ1AKaہUܟ97تs"`|i@|8 0ZyPq&~(-:N*-œS6mb- ;KhZw *.٣<| 7 v+wF2rV(WVr*:ZrC5@[51fmsβ`w+mB\4ⴒGD#|)NAQXHf_?%24=IKl$ £AW2h,2ENbtN_62V.T.S`]ɞ'i6b155Fzq`NHx}QX@'3=!Us%*\Fq-me-o\QXPL(ōیKvBU͝V߽hkA[y mEGGKeC 5VTT-`:HO73qt%Sf%hF3hV](16hJtməv!tkbb/^|g 9sرcc۫m6 & [ԦMs___oooIIߤ"d]]A1zzz:;; e1%y:|#GB w-E|ܻw,sȈZ[[@"D ~W̒g%B=E7V7U"Bі+uY2yk=-mqmtN!}myG89wNy*q=V2˥XU{1h6ފ0]hY4ފaŮp_(mWʽ<ŝ ˱mQVDǕӒ,.,ȉoml{Y9rz~0 Vm1jȦ|G]P!!|fq@C`)~s`ޯylhN\iQ|lGlG۠w=gq~xReNlg4GV\W+o {=Zz#8'VivP=Ht|M1W%4]ٜfNTWmVmբX@,ʽUyv,3Xk2Us7sکNM.SZfx8=|m?gY6ѻvhx۵5xZgeZZ˔O Gi߭RFzp* *~@^u­iՃPtnj]yB 1N$Ga-58\F(n1ka9/Q]Ƀ+ǔq?3ҡs jꂚ:b'fh7x'j,۫ ȝ\2ଅjj_3\g&KX֘ b9ӒhKg]9]|h慵;WvU.)hp}deeY,C^E{ f%% P Ko[M簾"%)hЛ( 5W%-mK%%%V x"?~vMfgg'$$IIIv@U%-ȱFFFhdL0oH3IձcN:u3g$|A6e]QgYg-:Bɓ'om]|| D @wm͔a$,7f\eB#n-gr%%*g4$[@[FxdEV Ж'晁l_V `xvG3V,Uv܀5}_hD;|Gul$}!^ypcUې7ؙOkgO*;C.˪ʷgtɚ5]e }H'֋iaPψɿKye!1j^@0O9U%U+ؗ~]/k#Z2yqq(F x))vˍ} rk@2*7\+uW+o(v:g z^s! Z ̯˕++Ur$o6{C[ͻ{ナ .^xҥ+VXjի׭["W"G9H=LzG*zLlC---xCG;gY1ѻahL ۵WY0ÙY+,]FZ bxL ҇D6bNK8E&Vr fEPWPbђT!fX ֈ֠ բUjl5t+ޤL3.h;SEUr=jZI5uHӢh3%aƟ+'JbzHB\WZn񦒔6gU)LlXg5:qoQn\WnM:'\jh2/W\Uh4ښRacC9PV"Bgޝk8/J&i)W Yh>in#<"tkbbbtx__MO[" 6˫bf1yQ̊$iB[&''g=CΝ_@kttT̲"fY9JH?=µ(hAh_n@L͌_+|3.Ώ~/~&uկ~AM`nf!i\A{F3<)kGbZ 4jQFh@[ܧyT 6ƣ_="hk)%mVs׳=*4E2aբ|m`/eoamQ>dh˟'2Y|ż(ToI6@RVRbjBw081 /Gy"H\0[ C9*AyľY\|+$ >ZkyCywEAeelŧYYِYį̸ZYVZȋBb5^W=o$I a[KRGymkrƿ -۹Jn_&}8啲4eUsט;Y^g{]=:^hvxODOpR~<~?:%x7bhR<۵WS0N0 C@U H")W ~b,ڠ%Y iUSOqZ%hO^0Y@X#` u]Ui`,dv.k[nIZi,3tnMjj?lDNUya ު8 Llff nФkGc>zJ@ꀳ:;0C`r ވً7Co7|̨e. +v.\0uOmE[ 0(--9[*1>Y>yrrrӍ44WQlotxff$0a-RTEҞ򂂂șCi8h0͘6 xSEqK.=쳆pG}'y|ĉBAG41@:h555Vaaaww7umiiݒJ24VѢѬDu+Eػw/DpAFOWGC۷o7E[r-Z1Z>NjV駟 | D h6̙3{ž糿 s5K/xoZ_IEp'hkV9՟)zF[`Z$~m`y<{\yw0r]V{Εmyb9ѽAy("ZDDۋBb$es!0mE)o7Z8͸-,b w""w}pYVtF^܇: E [_*o"0(,**Vm34NmfL'`9En-L)] -i|Coǡ;@Kv;B MWƌ0݆TD8n5*T\U9E[8ba&eVkVV6K(\*?hm6 bXrrr{@[[fŗh>w5<OFm @[f@ߖc>U_._ł ~gևwxBϟ?_Ӈ-((_M/]m}K Ý?Qpu3Znd)rCWr*WrE`nmqwNĉ80o%p1Pyڹyo-Qnt(DA7U =~1Wߎ[E?KXo&qe{{7|,nYwZ+{g+#_kZ_l{= W.:xqY-𢭎nNj=]g3ǭt;8sN"0w:/Rq&60Amv}qv^כOQ[J_l+R/l/Yo@73ћw$}s·=#_ }ub]F֪մeo-y_{~sڢ'u#%/r8ZύYЖ{ɲVEҿ[^\uԸ{M뿳u?ֱGÞ*{mSnNԗG2>˝9_iUg_.pn+t6\os\rX丶@Gw;ms\w\;v 4An6;3Yz;/9^eqۋš+xvvn/GP(PtR:aLx*u.}qs7KֿеuGVZo%|6bS?C~TǶ5.{h[jZvB~;Mp C]֋NLnn Y|jog߭T ^ 8?&:S;s`M& `XǼ`2oQ%ڕO2=ђ_I# : lAWr5*W`2.Rt4OLY紀|F+W$s 8-zŻmr7th|l5{:E6rhq1F[D/kE,Mڴ9y6qe((.ЕP5@%R6jƶd̉U׀ mUj?4q/@Ƕ5i{.xsH38^N`*Yb"W.]u hNeBgCp~X$L&eFڊ|=USQSUS)vk 9ՏSa2ʽp???½; wW[yh+}-sIϟ$C #jz^QQQ^^n(JJJ*,,VrrΝ;nݺy殮F%"48u҄e""閁$ u,ܺtc=O?=Љ'聂z841I+MOOXV:5͟z:u4,hzneggӜ Eڢݻ{&^:ԭ\r*Kza]mFv8;w\jΏㄵVǵ.V@qFΡp\s8k^o,m֯|olz/o7v$|Ng?W^ ҳk+ߊpw*ڂ=7 ά&/U &9lL|50&rN'U 0;9i}IHOǞOe'+O7?{y);Q݅N\Qy]<_ ! o;gqzk!~C2׎xqM1O@x |4o4ww$xjtt]޵ ʽeZ= IeUx弗{,G-:LW VۖtkrrFkŲGSaYIgA[+&:7md|.kXfK0v/ā\:Prrt]=8 Bc's=.`\Agj0&'yA[%ne FDjhKs&hR)r=ܗnEpMt&fhhh0_aXA=gԣJBZ\9FxhxחN56Aj?>TM]USE+s("⮓j꬚s}p zg"&@uk5}=(yUUF]n>(Y+) h3̎V6\G[)))SVNNM֭fH=m y|!fe(D]]]===t`?mJd[-#&&&~ipG C>cK9x .>}ccct.F̍Vޒ[-}tŋµE8qСC?~ tVX8*mQZ&C:uԙ3gDJ߇@"w>Qg{O }*~_uΏ/| ---sGjGկ~㌶|Yjg}rѕW^&:ڵk~^{ڠ47!ҳjvvv`~+rUrljdsd/_-[yɵE߭]f?YY\aUyE0jd<\2/_\/sټI<L|{g5dHl2jF;.nv\Fx7q/ESP*ʢ#N߮|+_/PڲP+RPd0-]gЗ8Q8bC:;nѱ^-.Gޗϳ~,傆Ilif`ŃDSo=w]ʿGyǸZsFts穓No jz6T{~u޷w}?k[Z.\fΒ7K\KJl'TCT_]e{{]s͇KZ[[+})mll;A[eee%%%vj閹4Mg*6m줳h2GVV'''Yݻ;>>.jn/[uݺ)u{'WaGO|6&''<( zzzhVzGC=DϜ9sQMv|tK; i>t7EoiC?~STk]|v :qӧ^[طo-CEWA'4C:FAשS|sUPO| D q>ńŠ΁Ɲ سgϾO2sW^ymppK_i;Ys{>sOxnGW YbN֗zt1I3a&+TNr *grֳY+Lc+R9 C%0WYL0TvYgRY䱲mq[;S#o$α@[ h 6?|q>CBmW(廤|jQ&<`؊5K ?ׯt(V6 O>+P%tcdoTnn, feo7{@vd˻9gP4Ci/QN=>_8C-[%l0b`ی)T֒yx=}hU9] L,Bi3M"$#`3?^lTTV\FӵU u/UpJQ8$U.꼂3>>III3c|נeFF4~2~-+{57*("XVIܟ?EΥdj䕋j~1N" 8h5.]*:QЖ˛.SIebBqsmtVbek0kZ6mn%2 T+{Zk~؆ #$>Êi%VcM&%-(<ݵǘ/EVvMكgdAym7/}ow׾V=5/F:%/yM%>ꝪQmuE[S7C[7R|Wt}ŽiKUYY9nIEI4|#--@[tꢢ")fUa:p:$ytjьmBn41㓓ϟt}| N8A#o۶))CCC4y:|׮]{>\sܹ|-]K*.y``D7ޥed],E{hy߾}ǎ;s ԩSiHA+CscibԇmΝ4E@g6::JoѴbEB@iOXX~`y饗>/^`p~Rf;$ښ{v5\db#OVF>hAAA4s{_+VH;ПEڠ")L E{^~媪W^۝ 򬚟Xߊ^n˙krs1bTb *EJF[²*Wr岷O-z:\S\\v] Q\sge]5A[n(-ܼ hny/1bS {DWorw2S+: A*_ F>TUO| 4o6T*729{Yw*>VolW_ ;FUd쎕bn-ǘI˺|;"tC a[7DV4C XVа-ӗϪ0g@g-SecMXҵ+7aŝ EV1źr+gJ @{s ssr@(f5k3w Z:ѹfhX'gYU.(h+@]L%bLS#gY;N!mRM=m3: blc|V3ׅ)IOiA2,}TձJ pKV0|mU[1:6 ^k#L!q5Y)DF. ӣNVm_Z\c#^m~{c' ЉށANt$@ ]m˾zN8'^Ldq|kىg[/_8kK=*I{k`;ppΏ8!C8E]A]x.':Z'0lI1ʱgٶgشJ~!=3g",Y< ˧<>57**٫6'RTTN=ZKKKm#}---|uOEo5jaa!}egg'''[,[R9^HNA[5554Uf.ihEo>pQЋtN+&M!h+%%e!)ȑ#_tŋGFF E|__8 J_Bڊц4^ObEt+:::33^@#bcc["#>| &rʍ7艠-z~q'OJ}"~!344Dh@';@gNZWp;pXp!o;0ڡa>{FOSMa+[}_~LΝ=m"7\`/<_";΢Ẽ/^}ޢ?RnuUZ}}$/yyφ@[`xri.  \hK Zܠ=H\h0%o-lg\fP@[qB6@[ЊqrUtWr\QkqkT9ma0cU \lpx(g hAa xAjoɝjvUjvT]\ع] Œ Rq"]V/ڽ xRj4g2Ց8$nő|-F|`g%[;[!+}R l=4/Y[ X+i}nh[\ˮ-r5ǩ>emKښzQہEbduP^h+|LA\AKcV L+n 0Q(ZVA>ݕ˨U'Iru7@[DZK_}TV>8T@::Co# #WH_8 dm`&_&m(uBՏ3Qg1;gL.vvS36vN|͋~$b/\XxΧܺsJ--9ܜjԢzT:N-Wig<#ڢHIIR5V씖uuu-3/X,S-q (ܢ"iӦA[EEEҷQ hGZxv&2v:NESMČkΝb.G8p@Z eNhxXVgΜp@bJ(++]VOE獞777$W(ZLn޼944$ Ӌϟ,O%[!Jh---tirc4ԢxW>p;hc&hkŊy?hkIVލxw~_|K_ (Os5~g_*BWq'^wWF[^gb$.κAQᚥ-rvLdM_d$6gG5ʾX奣"(vӋ(t.c ܠ \h0rtq;.چ*v\s-y sPWėVmb W$.crU-jt;pߊW@vbcle͆Zr1yZz90 ~i ';#/I_>jWF"0k!Gs&sf,mrap.0ŀlzl D~> z({>~r٠Ƨc hQ{t EYC0-m;kd]k٣QjajVJ;~ s>h~@[⵵vV АmyD%r,lE[VUm1(W> Cw1pЉ7C_MzsjtO2/T2!ڡۿ kʠ*HQ$xBԪjc9BNFS`4NH. tt*M4qK~7.K׍襗:'tĻ+JĐN{2boK߆־5}+[{zkޮԶǢC55 _EW XSH>n' RUUU^^^\\, ӓ;[8JhPmIFɑ 00\{{{SSѨ1$$Dvj,+{-C%E;vH{!=J ={̙3ǎ۷omEC!\VKFHk9 ~::-bE 3-V¬Z(.\@;ъn3l@lgl .ox:{կٖzիWO5kT[/F[ڸ4B[ \,#V-[Vl@[Zsl$\ul'vXiu3bPl\eVi-,bm︌PO2uW2>bR m@ veNmE^Ffm6,EPx分*Z1jTyG\jx~^:^' \Ȍ GȖFspDڠrdg*j>G?:r3i]_*4 pmbS%jKvAuDv?륈c%Nk|ė>CL܈•(-+ISذ]3Yُ}ѺLIwV9Z hY:#+cM:k3Ӂ'rrgUߕ]&N[Ql^ٍe^Q?o@ҁy dٛ5koWձ5V_YQ|@hk.̾hB, %Q{}}}yI$$$TVVVZZZRRhÃ}Ta!­j1ΦIRf]f6bFJ{DZƢ;fddS[ң`+9 K+Cm:vɓ'EuǏ\IGW__HtRsqoii3.od9߃0~A\B~D6OV+kdhŋ>|[{w_к9p23fn&I~L#֟p8ٳ'3gΤI.emݯ 67ښ&R$Ж,ʙFmq*ec5zTnQL 1jr+K!a#D"wrZJѓfQ+:lc$Dy弥q:Zxl^ ?22F2Z<' tRSURRqQj2]bJn\"Vŧ1\iWE)[ʵe^³1 Ei(c5Zx)Ie;Ӝ֍PKā#:y0- {ÇmͿziR#xJZңP]VcO4VIÜ *Yt"*Rr^MV.S!;Nm:[P{8ۮS\ gځ0( 5:2p F]HW;vU#TPn!8KV06qZTHu;Y 2VIscBdv`J$:9vY ĊenF֪sՅRuC]V7B;ӺyhkD[ۨÇKݻwwwwOyBBqt+33SV\\\TTThhXO]577lUUUb!"^>1hiiMJJJbbbypdnhv2- )ȵ&/s߿_ΡDE'V*=D566Ҷbo>:bP/gR A[]]].µ*9v+˗/ 㢭FX]]M{GΝ;wE:7oµx 5;᎙O4R|3ѯ! c*1jx#Zt2ÙiT[3Wm]֭ںF[SŲe˄ke)s̵8O Vw"8mV5}Y8QbO's* m-!:K`! U;<Ϸ26U.ഗIbm1%+Ы΄RYՅ}9lҁjt y5hAV1lb* ĭ\Q謀I{@[n;[9ws=}FԺYRE@[ZT8V[|9Li'\\cem.( |5TY+&#*NY8m'd@̥`F[VhnÁ\JZ3vNs5tx%*P7 E r5ncJ)*\%_;J=ȽUq6-zm:1RЀ~'dzt˩fgܯwzmp.JoXW=T% љH(,%aE&$0G /25N/ y&NZ jBUeJ1uMP ]mrU\uVF~"_m-y@Ж: ־}޶mڪbјR(­q }ylMkjj i6*;;;55UTXuAa"%NEE1n,ơ-(BTRڒrvOB2޽{hٴ~IgϞ=qXi@KK44-QmMD[Ţ3j3iׯ_EäQӧO:% &ϟ{[n/_~ǟz)e;p8 _״ }I_3G[jx/z뭷~W^[_G>qxmlnu~hky T[_P#8 e۠f9|c bK0x+ESBW+m?ZhEXYEkE_.LRՅux@[P&&8G,@2V㕽H*7C WN/8ت uvVU)ŅQ3Px .P%1ݢ1|P<6Zm) юtSs0;#\ȬF(O#vV0\ 61 %t̪1H JKQLAGnhV:2Z+m% ``;+xeV֠lJPm\J9R VUPm`K.kVVozV||[ݟ<,h+~GSnd<6OV4L 0ڊS^W&uT@J X9Svc_/oTyCHsp*z]״d8?uZG6I1aI&[n T&ca XU>[֖ s P!Xnz_ Wb05:ЛƓAvxLØtDXWѨ#r@e_.iD[e[ʶxmo+/*T9jO:5Om+~uOA[Buc6-TBhYY٤-glfbnnvtq[4Cllp* "TRHWrrrk%&&KLE-F;Uh`Yf5mMv+b_688822r .<#~Q,R< qڢCHQ~sDܸqի Cobhbuԩqh/_~G &8}ewW_njzI9ɳ>;qʒ%K ~Wǃ}uƅlK_|q޼y79i[pyEh:$N?P%mM F uecyیoGlŀ\0G-h: ECo1EeoyF~8:a r_5pAG mٗ 7"s:x~X :J`ܮ;hDA#X3KV6W3\mʹNVQfF(n̼Αλ)"gW &rI9B@qOF@,F{ \1P+(`t˯hUUX T&bqy: a] 7bm5g}K4-Ϣem'(x)D]y6і-- l5B[֭ʚl>Uʺm y`_DBB[ᶐ?RCMfޮbW+ 4$Վ-EFvY5\bQzUfB#U5V+bM$J!<*JơEFaݚO/{Gn"t:GbшYoEu#G?[[ܲ ÷|۶m;vWjjj *$l"33355 4 N*!S___YY)ix)0gxz.$[b8/\4&<<O灦23{-swt_tIjϝ;w)uђ=%}---2!\FnqXϜ%gQ9,+toܺQNve?aPhi@aiF}s%k9 JVw|g3X˥xz6ݕ+[Z [3[4Z F.򅿌m!3Jc5kXeM@ıp[whRסjo7e|q[+=fO8IR}іFJxpŘ\#tw"}L;;\Ǽ`>z`)і`Rk/~%[Cz[HmPА6MxONKK4m`AoypJJk6qQ7`OOOZ1jڲ.SE>p"Q ` z hKx 1hH}<[[U{(C> i,jh1h yvhVT.m9B cg/,-G \Z)ڲC@/q!Q ⦄vӟˀm;W8j^\ۥUIJ[O} h %NDe2Kci\rtc9ȘvіGbk k8QeE=fqꭸYoypWnٛ +DTeUW*0j0`J:§#.DjKӺB`y%~F"9ؠt5nnJp)j5_el&B;|*GtT@MLN*Q&[&5缿^ ,ˌLn%MةcAeW9s^TOΌ>]f\~k*սqMRDz MXIYͅn'_Z@!˂0pD?&`gB xͿ! /*;ꪣ+.:Qut~U{UCjU[sՀE P+E7ښ€k1^m͜n Dt@=ш0\ꊊCBB|}}B["ْRAJ%"""dm20Www7-SYYY\\,-bhCڊ z עiMf"ܚn0nѝ7}QCuȑ]vdスt\X}"mmm]]]H?mѴW\w޷oh״/ih-/MO>SO`EgUUU#}~~6җT]]b ꫯn:~zBk&zO?Dm E@NkZh:ߕԲ&SekTZ?'힨}[`Ӕ€K.QnDH$ױR<0-'7o|쵵PS惉 2XJclf)m 'y-azܺuy=@1@(|n&Wn @@MVB:,RĊnA.գ\٭(P Y>5 >|BaI!ښ՝+[u.n4sM7שjWSkչ%?95iITc$>% H֤ʫjD QWWW__D״qqq)"'''### HRiyf% i0U!ܢmEEszK$[3ג GmM#ܚ!2Eŋ{k׮pĉڳgOΝ;i= cOOZ[[ %kϟ;wٳ{5 >-A["٢kђkѪWp;᎙ᐪFx(h)cЖu#'.і-SPjVﰀg*nEE[Zs'Jf%h? -iL%}Bipܲy_<!r$nPZ H3ڊd*g-j $g1(K>6bëdAL *ɛ-vJO:kJ+{j]0 2Ӗ+c EJgWepEhkP_: ܟQ:h+55u콭@[./;Դa2Jt64@)/@Ka-[uMZBϽ I5؅&bl8R^PUw.. +Zt[r}z2gKKÇ鉴b8rHnܸAk7o޼~:}w&tvv܅ .Yo1͢;̠'7ڒ5iHM٢]hC.Z6B[,ƁT1PbҒlndO-\@M`T`@t C%]'JPb܅E!!hvc _ WD-8zMD[e3[xrfa[TڊEcke9B n\F[\2ug7Bd -;i/]v:A[z%`;mMtfVjXi'j`)K+d-W^ؕx)&`.H&CJ%V!5:fcn;%sΜf|-<w}m~ʦ%#[0) m\gX,,,,...mIiCCCjkkͨ*:::**5KD]F?`Z5{LLLll,mdsZz.bqh@[D5 ݚpkq޽̙3"2-aww+t,蒽Ȝ4bxx;v̴Mi&dppGqիWUŋ]FWp;ibRk~OteF[µMMn:m:9=!w?\YI^)[kjÚ"[ۧۚ&mTN4!T^\ɘaz rr@TxvŃ&ЖֿP{|!j*\h+[wW&3#rhڲ ڊg[Uq4I9,q4}^ʹe.TRXFe!I⣧teku2dwwv^/+"Y/'i `*֒re_ IDXֳ*[ k?ƌ>&[ rQ8B4 ]beBbyRe]h&HKmedd^pNn3ښ})~ś.z:6vPax h+hI'K;bS FZ {q)'ӄahmWwj=\BM^F -c ֜f+/$.[m&խnݘK\j`Z60%ϸ v4t}WnD%elM.갗*LR Z.qcu.x:[[c7C? %:,bI^~ ĊJ$,h0d+5jd=]i,٢thK@W#?7 d%.94of|qQ+K<Kg3Z |i3?nIoC)_K%JeS 0,̶lN|EkkN U[)A5@[ǰ.h bx`%3@)_S \h*ݺZ. `wNU^X0^ +s}#PW!6L -HSlՠޮr,aƚo&x52K{b]։[WV.ٞf]wrwq>L]Ln-z6V1\;Vxx834Anٲ읕$+L7b1C-*99#0ziXFFF&`ZQiF[t3G[nYVOOO)MAk߿[z>kɪ>,jppp޽@-'OeӧϜ9C?s)HaVm]|Yiuw#Ns-Τ@ӌdeۮl ʺ< 帩(e=X4ʹP'&uĠ\g_ j0(6fgSt'%(#|/ LkA5¹o}hmm@m)c"@3[4=)sg9E[Q"] m*qe?x0Ng9x4$ñDWr-!$U\n;W#Y9AxZpw,GdBiWET1+ @OIelRA ;mރ2Ci0[+LXG m^mDi)F2bY[)׸ >4Жڲ>h M/9;Y-u9VV}qym)7#GWyh,~xk-_۶Ë=W=DdϜNgЬՈpk) 8+uy`5b>xk*D;:A 6pHXZ /$u׼=,.[/Z,G**V*W5Hw#wc강a#Ě\<+%bn}_͋VK#qt},zToe?H^X"B wWlYVtK {nn='uOeȏZ<=ffffgg |F`lllxxTFD[]]]---jEm$v[#GRSS"=ȠK17lhMK5eo"G[3[SU#477bӦMZ:흝LaҒ8qرcG9tА!W(P49sF-zDZk׮=#pOwp;Gk׮G[RI`nbF[# ڥl} Cm|$ )Qrў{&h˞j%\ NRA-" iFqCai%];= =!z"TavfM"G :*ѧQW,+ m9 *[}m®\0n.@[N4t6h9jXmeF4e JFqrqc\tS})zckw;O9}8iZ>?WT'PY%&w+ )ӚN*lJd6E ڰ>•5V.dU| YɃ 6oW<՜wU[l?s1EJ:Vv#* *[Ն|q}_ }1,+|>ov|iWӖ&~;sEit(D+@F(S"M8Uqya+ !pMU<75/ GbJ[¸MOuMW1ԫDxhKLa׽n POD˜bD\fkni rDDŽ :M9q|to&Q쪗}~z\SѿiӲ;<,80ox՜smO5R?5CEC_>f5E3l޼kӦMuuuF5&%ZBR { 1776ii6mI֤tk&v[t5553@4k܉0?<}1H[ ںzŋ>wA:}wp;chkµ֭[7#%v[ HmYs\0H5Ҽ]YU=J`Ӥ%(0*gGim,b闠D΅X>`z2JA uuE/]2bUU]E3|۔}rVlWeߥymYYՈ`5ڲ7 LXW8ZIײU"%-Eq_5A2*s%w3D2*>sRa~g *0Q8V)=f7e*+/TWթ45XTê Y'e;S1Ϫ97qx[ 6_z!%@^rN||0U TV@[t W mqoLT5n@C߻h5ZlL. Pߗ˥Lۀh<>\*(hK& f ܠЙTvs^wd饋-LÜ=btB,qa.g1NN<3@k|\F(v֧qsp9Z 4tQd7LwUQ4||ul_fVe۪>>!Z'?mfeMWHN[$-kQF#}6#xz#^rssM/Ldׯ_O.[>/P׼ՙu$_nTwcr5%/B9^Z[xɿ\Xɹs% Jn_I|Jп'nI ׽}pJ)DKܥɪ 8(ǤS  <AƩtm 1T&\эјLbu e֘! t(~ruI8kɩVbfNjd-E_'̿k_ /,4n{wzܳk_1Ǭf]F[pЖkMD[n.N,((^!!!f8&lDu!MR__/N%fYQHT'p=DT͛&EVVVbb"&UcVT­i֤6oTZZ*EEEմInZڻw'n3c>|z(`4!hӧϟ?G}=Ν;GS=z֭[ׯ_Wh̡Cʌwps,]Omб+m1d*{K2mZP0Vi/OSV60w4M:Px`U·h@- KЛ F0q@x\b5H`͍ bV0bZ@[l֊6">.gKŤ&QЖUfӣ[\h14?4^D ڲ@(g-lrՂ-ekr8 *G#}7\X 1jBekV}J;Cjrbhmdemg΅F9fxeB[#>(mYxɖkeOfr'KwsV~FR'-`S:TWjP;UڷoEkߺ>־ވK§-iD=>xO׽}"LXK+1&ߪzK]$TQ:JnJ Du if/F[AwL Lp) ?邨uJr@xXU d<Vwm[rz)b8Y=֏Hr\k2m=p<?99W翜s?3raVYmg mںQښny{{U- z7000,,,Kff-.?QQQ>Χ6 Cl̶nkkknn*))Z"99911l&oF[FĐsDwtttOz^ Kydғ3[dieW[c@{{{uu5FZRKKKooӓI'ڵk```ppCCC */(tZѺڧ0kb+-BЕV mIM#MKY8+grrQ!cG(uDCh ,tv+Uhko">W ֻ\2˅Xvuk\i?h\D.X BċR$gsU g U2`8l帊 ٺ"k̂#s˸,u,brUl+=hi}|,V.eW67R&̿]>ڢ_9;YV~L=^ TՑ?[-U;#T+g/Zܟ| o@޺<=Š,*˱߱=c.~}xޅĥ*SwJs<yu­٨s[VN/VC h)"-\N5yTAg>%MFnbk, <P/641o'ϵG߬ZxM-˟V^TYTMڜ׫emK5)V񇆶|Ӡt+%%%333==Ӌffe0]$2,P555VTTvdɏC[2TLX^^.P [ڭ[k444رchhnq```۶mݽܺп]vٳgppPϟ?Y[benxi4q[ .\xQq%zʕ+4mw;15.x v;wCGC?՘}{m}aA[/~g]E%ǸhkҘ? Zfp+Wp<m.rj'mHrZnd[LmP.9&]ʵ@(M:`vbhkE0z%#塁`27"kd$~і#f=j!7E[| t4@[^ ym1{oD*ׅJu1Ȳ* O+hKCA98mi~JYLUXNn؃Y0B1nW|2Is(Fl_KVyZ;!t<߻y4.BJb'BUȨ-vnrZùVњI{jx֨ݜf5< ?ɝIug %*uq:Fթ0uؤX)Fڂ_.yذ{׽t,mߕ}l6d+Y?W `nm_!2ʀ8*+0b2g.Z([V@*z0iuP"Ot("부c_kX-C,*CJj ]KCy(9?'USbjS[3Ծ0u|=àIָ?@59p- 3݊C^49 [XD "::ZH% HNN겲܌h+$$D:$.jIqubk\"-(̜h?/Me5=gEk׮#G # s޶6:-]]]===vڢyh{߿رct eb%FRuH;9&hmm˗{G ~seӧip{a/..~WiO?0-z۷oOSO[X.JGG[N;}Xl\s w XF+8.E b4)hVP. `٠X~i-yݑI)-a刃  Q~E ~ͰՋ,•ufA 0\hsFd mqҴPj+Kn򑲕xٲË222ywte7w!f•k}/~2,s1ylrܳiqf=l~3gJ,ϔ[;̝{>w >kǩ+RSjh> A)^UL+2RZ}bl0`T3[:1'oRD;%n}T??Dy\v d N'UF, ?^rd TpũP[RC^ѣkT{+luk:PgmM m] ^xV+#HXg-8 -..."Le2%.QlUVV™< "DF[~233(t'LoԝH$-,* Qinܸqڵ6l2D[s{,kzg)['OH$%s]wy!8އ~o_#X7O/~~822k.}kpga@nn._}UG7 s^?v__^3 z9ik]a+|~UUU'NM0 ƙKqX__Յ̤;;s=?яw`OhW+jg_Nr>k֬hkvĒVPP$V+bҲ|$h S*@Ih]EzS.j DEZȎa5yQbXa8waYBœ%M *W*2& ~մ|^M^uTHsk.Xp2U)fkVUk(/挕R*A[hwD4iry-6:qmqk12 _++Ȋ=(%,Lb"Bl#{y2hEdnz2%WyRN+|钍PGbi-QTvQ"r ݂)V`hK&ayW/x% zLo8:LrCma"Fk=Tw6lz̺ugr7)l8SpTyS5ͧO54PxUSPطM2ҜyHWq*FD2, 2b?.vzϦb2wjbPk)=l+nigsNoeq%ϦunӰVwG|g|.M횽co*u+A3 YDu"JݹTQW\#jssf=1w yͽ/p.ޟ?Bfj-+2֨Pez{1.nC+ B[iii snD^ w9e,E4lXZ,x/ڲe fLt1Jr8 tk#8Pߙ-8o|gB8nƚϹsƏ& G}y]]鼴{6'"}[2̝;. pk.D巿SW+pĕm-^xĂkWP+KB@hUGQ0YqS%u`Aj23mA*}jAgrW} | ;7B&0kp+KJ qU)aF F[ʹ\ʕLB^ÍVcr-\Cl 窏|h+ ªV--&Pm B AYs"-gҗP+-L"#wc 2CH"l+yD+}*h/,-DEނޮ-JVW1@[u|04oh ^z&INo<#njZwmۖշ'Ol={Hܑ6#cpG[s7l߰;dv'3jƬED\ȥ|WU[ٛ!LnZKVZB+PX;C6PVu~;Dnĭ3,#uhX%@r"W9KHYgk ʭ-f;]Aim_^ϥwϺ%^#D]^NCO3!ޅ|l5K?y.8x*:؞DڒK@d݆ĈGR>".6_j勶6^V2%$$;%ӹ-/ym윜\8D&]MMMmmmp߿qF3e qcDky*بɵLή4Et cxZi#or0+ݺ[o={lٲvLE]{{N>Ո'O` !'0sp^)dfSz|r..mqƼ&vxG_8/\ܜ;w~Gi_k566o _XJ.yA"Ydɟ'e&x ڨ}W ]`!|#dz'^xᅚ̓K;Cs=W\\2o<+i&+؍`Zl/K/K4\{cŰNX_*831] _E] ^i.]:b|h 1EZ\ 0BoU"XXC W1DVSy%hjFB^%]˔3WU!v6t%ED= ʕ6>&FV]a&UQ^?`N[K5L,ZHlj MÍ-04,8maBTnV"mj@}n-|#%ʵW ߩ>Q 0ЖNb3ph\6twmWm- [!zk VO+)$7xR-OM[A+PQZ#}n>BWl_CI\[ _J_LU >aJsǴF[p剶򙁶>t9A-:Xz}K[n\1b_cWkڷjUW_UU bnpdeǣU_]Ҹ slP,P:):쫦2q[rmmEQy|bMKY{{Z(j$nbTW翣:*Kjm-$F[4CvPD%QĵfU?ʘekxݻ,E'3ŽD߱] ;;wvato=zתKe- έ9AuBkq3 ӭ8]W+Wewq%''3Ab7*kb2Y$spUUU N ۻ6nܸm68\-xC&c tY߿͛{{{as銊2+,,ދ>Ǝ^ |8oInn=44裏r7C/mٲŴ2sLuM=:*:|0';v FKgϞ}Q#G4*lD.\c?C8qٳF‘?/+}+_pp>3(/Io۳f͚g4r֥m/Hm4a ^3|){߷Qkwo_LX_'RY'?xv5|W#ڊG0۬<Ԣ”@o%Ӣp+_;1Ǚ<腾Xi($|ȋ)JIkUzCGA1o *+,,} %bbJJ4z :9 Vj*'|=Gz)J)HQJ5\idĖMBuETdheJX}h˨kDH\,F帛P0|w&0 |,L&&| Q4-Bt#d|Ţ!vEi6΀՟ ()o-w͟*J)VVM+Q! %pAh=vZX@LZ@w"%+m+|klWlWl纹-s:o~s\n.صqsC'_ p?w zw)y'!!, y'<䝸3B. }6зׄazb^R_TPMv3[ݶDx?z0l'{pM ;7oڗ`~ܞ9={f%kzPPGR Zj45*z꺉d|M m<7:4mFUQQ[c1lEh *-- 6Ĥ+oqD[CCCpn:"o-fDbmV#2ں[GE[\lcN={ڵ ^GE"%A[VpTk&8³u|:˄:::~#~w!FCCC9 h<;p{i[oOIC[S~![Kƹ7^~eX;NKq><dJ[@aFBa0&˫ )ѪgWS:Vfi pA&|5JV装$-A bq\5_&&s1hcx_J m9Vû^ҖS1maSZ&bذ`Pl%U/VF9U6)mU~W?Ł uQ#@9##LeRZ3? o-}Æa_U3 m{_ffs{\QdQvUY/*ڡp,p p$8G}A[nAл9AfNV;!HVv{=owvyE("LU 𷖆< i~OK#~ZƈvD/GVaŏ֯oEfwPyq?c^?[^JK+qDǽ4//-I|ieKI/e'jZmV'kZZ 1/,M}!(YOUjsڟ-RL^W,SkD֨k<.bccOvҒC#O{m͙37 L}A0>cӟON>#e~_e-{^W+0,"Ң|zHVBTh JxO~;,\Xs^gt3n9rdr'g#o6-o\csw?2?鈶\nk EmaNңМH!GPc^I *89YkJ[oW,HtQ c 6GIb葎~DA#ՠT=B,TtT;fvU1 "gи +] g1UM\\jK}܉YBj}Hh A\YipOṇ9vK3\wf1UʞЖ̵mFhAJ?rLp3KsYL|3Oe?O?d|ѓEOF=Wd$Gy%OZ\eV<ǗT<ՏT?PHj#ՏV+=WZ{\msյg+liْ:xxL[Ù3lk8ԾSCͧ:O6kǵZsZ]r1w׼V4pqxml6L 333sssamŌ`p[RR+gSSSa<ܚP5t|ӦM֭hll䞌ي  @^dЭ2ׂj8SzeqF8}={..9G*~'EǺpߧX(''K;Viߍ-,k[@@1֜'%arr2=zn˓jB?^/=S0رcO-Z??YNw3*bRښw:7tsKfm!ZM~䑕I+Z%lQhh+-8\B)X+1 QBuʹM9a9) \t[Y~ czyL4"UŽ) Kk|}V AxlXX.vm |*Ttͧ7ۗؗأ[..Ԉe<|hK4~K;xqkxӕ }Vfff]]%_yM&bS,rgK.x6-- F^XXX*/LJJJIIa\=V^Hyyy&_2[%2݂[&Eݭ8'--- ,s֭򮮮IL[nau;c[M6ڵka[E[9͛a &)[F,sssᶮn͚5ltadeeeYYﺦWDב#Gy䑇~ѣG:~˖-0y8`[&bŽ<={_zΝ;aɭHO'?9sviGGE"%G[`__ oFXEƹ^ .W&/88r/6G)/8zg|5I?;Ʉ[;LB>({㧤> /`CrA-[VTTpm uoQ¡CW#ڂvȊdzЖN):q C%0#`~Te(QM:a]svCӪt´.޵_1j!#oW8*ʹT4GdoFU0c9`NÙfp! "C~Vp\dm9ڕkދʵSE7w)u'Z #eTwRh!hSw;qKgaJWKw]Nˢ|T93pOREĘ\^Hh16亿 ڂ ڌF[p 剶>J0.j[B/]pzhK4֕URu8O)^>*;_E[ 3{ʗn477~Y999pczgS0&>>TNzz:OŬd3c'2ڲPtkΝ[lY~}OOO[[kӗ̬֐:::Z[[y U0m/e>NuGy;y9k|kWnii)̿{Æ !m;v[n = F=XzE"%A@sYd ׆g_|E~@@~39vٳg/ZСCoAj}}} kLBP?!Qք읗_~f owFukΓKi^K~?~^wHH&p;.v^uv?u]N?v=|(H&uִ2Uhh({߃߱Fɰ߶E?o v/KxW^s/ h&ϟ\P钣-iZ1F͸;iRnD6+ |R1QʱU9PU)ٿiO!C%c"Ra%ј*ϺrD(Y *id7 }*&\O=# A4#BJE KH +A9h1 ;Ɉʝ`\2*],`55mm Ui&rP^nQ)+r; ̫"n܍NPh#D[p)lXV@\) 1Z~heI'kXf0kr65ɕ`&3|I:>Fա[Vv͚5---U\\̴'===55ڂrᡕh܇IIIQ_ NVYr A[l500fy8gi#;joo#uuu}tvvVUU*7U0M?s~{oq_=Õαc`C^콼}w9Ot/]jY{6] ~gZWU߾?O)@EFAg5/-,,/$Ivh Nf <+.bAhka`Na:> LډfVJד ѣ*J'D, ¨2 ExQ9e=(LV:%aAb1*WrʼJC-̞JUT9ە\U-[b1Ic;cm-g">!G-,GwP-ʱ\q=&91`9pr3Dgʾ nqlOhKD[6X؃Ihn5TNxh z#)|Y|: 5#qUpA牶se{lJ$ՈS`^ $BQPpf\8*ׂH8]qrF[px5$$$c`+lee\p~z'׷q۷ M"9ӹ2%% $X/ܹ^k5 ]|`ss==ЩSCq5={nᆛo^Y[078+M3ڱcs'Nz뭦LMY^E"%D[|o~7|'#^HHX/ wz_}U8yk8 އ~> DuΙ3ɓ??]Ex_G׾6`s^3Ze_|Ex-L=|lW{NyN>[o/ ñl>V~fs3g>3}y}ۿIp{8|9+ _T~[Smyp}i-hh!Jͧ"5Bȳ ^I}S)i vOʒʱG9nE {,lhk֭pӷ୙& 1:z7[7n8Gki/i߾}!?cH4-Йi'6 b Ng{(P``@[vښo.i1BۊZȵ=uaە Ӵ[)YQ9)}]9nAh%Dsr.:grP;c!2x<Id^HKk)YܤZlDll|2ZH#UX8T~؇_Z9!rePb(21Nhk$Zh@[HZ] !Lځm8 Ê*W2Kі\7˹ SpbnK>ZfE[ǕIFPma 6V2.ZcfD[G[p~ %Ju QjpP[}fWnYĩ$???77&ZٔS`!]D[r1++֨~mmmMMMҼd+bkas ¾-,,cu`<a$?]H$hKt~>8k(bZ-87o$88>[;{umܸqڵFII <mqlb:rdcǎ͛7yk<X m$XO^^ 1} ]ݳgn?~ÇoN[$@^~"HЖ Smx# 8]2F=L؏ĉ= a"j,K*g .\ Ѫӊ*#+,Гm9VRNT*U A@fѶ˱I9oڊ#{$ -^=7p+$IU{^XTGq;Z\CZ4Fˢ :c`Y(2zwc!$-#s;v-oRNQ ? h "gs(,mz0H!r-AmY9"U;gxm2F[vcv(B*==m544FFDDXs?5=,e3\p"\k1N˸SEGGSEEELL ۪6ͫЪ[YY鋶UǏٹnݺV.'=WH0D&l0-X[ss3́h M{ofntM_r&յ}vV[uuu0ɦM`U0MAX?ۋw F-۷n<޽ng;sXYJr0 T2({A Fƈ`t$cBbA[%TX H53J99[rm!lL]]Vc&,%L 86_h .<і}V0s̱\>#[A[!Wіه/u5ʕ+mƕ6Vdxmll,SŌ匶9jh͚5[n]~}oo/{sle222`ŘXyMMnutt444tذ]tѣ'Oo&Xk. fM7⋶`dÆ ?00o)11! 3gzV`u[[DD"ф%7]‚'~}Z/ ⬭ײ-XЖV% R(`ұ, -BceD Vr7${.- #Ba|w^퍿9Q%Mf%D *@'+g .=;ld_B۪A_/g ĕO=KI\ X"׹SVa=lm(#э +؁d_i-̅#Eʱ@[rVJ:`Y#hSȘLmqj$mk=c[2I720($?3)z)'\uyyyYnel6[ZZS(k:JJKKaX)[o߾e˖A;lG0%nZl^]]= 7l+3Mا˫#L̋n:th޽7n4nU.`V&ڂTׯ_aaW`VpghhD[7x#C[o6PE"H$MHp1VXXs-Nmy1 maF 2w,#E}@i)ma ZIh`8NJ<@t\鹔UKMdU>ZFrW eg/ /~!Q%8"-j9ģr0Q2j =!0z.rb?Z,F[\rvc*V=VG1cr"2[6-h^^Լ2miK12-rIO,іVJJ[= )mM'˿Of2?ۺɂ!*p+İ+555>>̌JOO瞉l1b:yfDj6m[0=ڶm{zzZZZt+''g XwqС;vt L5tA-v綆~YKJ``<֑̐#G`D"H4QiE[fh8b2 NKaE[8fEMdoT!^E_Ni'5OܡXy_5BUL\F[~َaP6ZHz* l&G*M8J)5,z0kb3)K9 +, &1+gݜv.\܅l\ Άd=nUaBÊ;@fA[h&X,ltD`0CLZ艶VPv;H)E"H$MBp5}y^D_R,0-Rmȵm!FǨ f^bmadch ].ӓ`u!p``bdSZ3B+)w ӭxj֪hqڌP mU:w9P9j U@х_-m!0ͬw%+=V(M9hu*b ]?WiHF#ނ2 VzaEmi+d&ڲ[삶FWZ8uܹsa ]@M^th.\YA*A[SF\&E|U}qzbcc"AdxՂ3|6Ԋ"Heee~RmmJjjj3[+...((-̵X[-\c-׭[F[&ׂ9TTTz-ޓf"gڵ*jduر'N/S$D"ѤUTT4Mk-_6h˞D%mF[dѪw)mR Srb"&תQ8[D^UUȢ&",1L8ȆJ TKv˰^ݺ( ӷ HC6!źRa B V%wK1݋ҭ; Fҭ~4w.p,7ҭbl4c&zĵʹMԞ&wmaVƻX2b"̩{-hZH ?}^FFF°ŋ[pߗwXhK4qZ/N_njjbj$5^Vj_Z444߿f͚RKK l lai&n[{H[ X-zȯ['&&VVVҭZFK [a}}}6bWyMD"H$)tD[˗/gePUH<$IF`PdeJ+ǭXrXg ƢLQe| &XQ]^mɉ 3yGRPDc82((ѫ"2 SNX͑I+U9)zX7*@[h V&fTTh Sʍ1\`p-XYʹZ+g`vah)'슍 էIF[b9'«~ 5jL9mчhj$qKЖqoz ~`̓D)|"Жi@---$k%*nhْccc'L-u asͰ ~J+[[ `ԤEGGs;H8]p)ɵ06F۷oߵk-Z0Cx㍍;;;mmzz E"H$]rrrZ`s-8Zs--H9)]۔r@ؕj2ˆn-$JXZ{-T.DRiFoA 1~$X  p`` +痔/rލiTѢѷوXCvU:;3j ibȑ:tF%2 0k;P= Gfq`(#0EP .ދmii+Ȝ߂f%V#^K<Fn+ ˰ ^tft1z"^k=<3іZ[ f(7H$DU6mڡ-8ł9]9@jqXxL:F▶VS\;FVG膼-eƳ_es9b- ? Y}!fVNFZQ8iIrrvuȹN`On ^mvkCm -,̔--G/jX{qZPP3mw"ﳾ}?NF~`Ήl%$$$&&a{*<c7gV :׬YvZϖYEEEc-hFF)///+++))¬D"H$MSyѴ@[p ֮|Fh -=eRia".p-7>q~EZ xr`Ezʉh#*\m[MMcU5es5 rtVzQjP5@BwxrF[#U ,v_Քʕ/Β;~?u!6,.V&2a%hb|rcjߋSOz#N$:L2e8c:$NBLp>n]LgÝ搜c nkH$DTddG[l3g4ڷ- 6OX NL,_FOZDQ8Ȓ0[sNW6uQ,04;?Q_CZUEҔ6hV~50ʅ$͍0,0+Ɉkaťm W8Зh ėXBs7ڂxzղ^[ D[v7˲io1*1*3"3RFu*ф,!r(-C.ӪOb0LnF['4Ke˖y+ʽ.QBí絭jJЖhZ:_zoD[F RSSVSSS}}mXgDXOH$D3F-h `zVki!Жа☧P,HjbzAʞaF0ҥc80 -96BRȏᘍҫ#eEZe`=~6`{05K9[>ps8umaYb0zA{׃ } Z#,KYwN6t?,>,_~ަlD^Ⅺ޼v:$D"H$,ڲlFq-C+;j< Z XCDQ!g+08 ֠qSe32^Aơ+{b(mi+)ѫ_i[D[L섶nhK/ǷGQі),,ǘuq Qo"tP`G9Տ"H$D) NMvb Z-v{>Apg-r 2`Xіa~Vl,Oh{&jJaڪʾꍘ_6u** )p mmt6U2r Zi!?f=֒5GqsCos6B[NЕ]y/gy]zhRn&M1nPjǤ^A["H$DsYԬbccgη-F7z m+Fž\g rPCimW)Gr (G;a$ey5+G5.{_idU1SKL1yFfe2p/QJ%5+6*I]S5ꉶ|VAAcr*M+Igz\+D"H$]b͚5 .H͛7f\+77Z8%Vصlz"SVm xk\#:'n협nJ؍QpEPm͵1j ,1ׂpHZ)Ӭŋ{$ ٸ8].WE&2S1w1+1D"H$]… |`Jga7,tKy,o"jdh ms n=? mQZnšV--)^+ ⮋ߣ;pG?: iTNa^FEE>"h}g3_X-H$D" .Hd8ekJѶ+&;݇}K-hK`eO`ܪ:jY žEnWCw؛і[F[Flwx]g-k֖8@m6M)xKќN/^[^S(D"H$MRpAdɒ)2PFFƵqLJ<VʣalJj-Xagz-/N;=Ж7+ D[KVMMQ߫cH4e5@?ޟ=`ԬD"H$&)& ())'b} 5wK(hKfpY(-Fe6sh* mxLUH4mŔ)B!_H$D"H4I5idd՝CJJ l͞=[>Jm<mZ-PXvaY3] .D[ KQnh#~GREiD^06mD"H$.JpMu'\+,,L>K"_5*[b|hk-f,Xҥ(ܪDxjܹDSJ `dіp-H$D"%\^0s$,.<і3v ں&5|OפOqqO{^_q4kRhKH$D"I+++aADSY m(nc"ѴU8HL}r5*}~AS}=~Px%hK$D"H4+ElFvH4sLA[+hk{r,5~ D"H$Mrm.>>Sϟ/;_$^NJsz^{{vXN ˾f~@yr+K$D"H$媥Uhh(_GFFʞݱb޼yY077׽e_D3Be8F°w-'֗D"H$D\bn3),v/\D3K 217/`-D"H$D\*--m>bWŰp…%N&fncx$\K$D"H4UOˢ+!HtQ$mD"H$.jkk/7q`d"4=/Bk|?ɎfD?3i%\K$D"H4IUUU]V5oO3KЖH$D"h*//h_PP Z$ւrppjKW}㳛DNA>ljBhK$D"H$/-hf~!!!_+Sh~)}_*hK$D"HtTPPpStt4s-"&H4-Ey^vϚ5KLEk@Qy:F{5P~PQ$D"Hta^\+::ZvH4?ŋ{^{\DcV)G?E"H$k#e?RciM4i~PZZē^DAAX<VdzXPp "(?_&IGyޯd̴|~x~fQtBNNl8h3{T Ȯ)eQIoJ.z<9S^ 3dQ f`>DF-7¾?M8*2db\v{V^׷l-..R^ 3dQǶmkc*U;8ᨘxLDl|^ZQ[ Kd]~TMi9W+}u?m j:hKZv#KX,|0Sj1_v~6?R\UvTTȞ1ECz̗Zο)`/v~;y+i.BJD[{{{-J dX uw)`z3S|69ί"Ai<ϻ|% εǡ@&UtS" )Ӥp;4Jm0뺗lֹVV@VڒjmyM(`Ԓ6G>~6?GUZvhBpxxH1 e- zS}3]'`V5 vyi<-//_&}Wl&e^.ep||D[7b/ CO2)"@2\.u0UTtD%l.K^h띠&eSϓ?]qr> Ro~@bуn6 3z\ >Nx`_N'K*}ߧ dWչ94MN޴,q]>anࣱ q7̩cm;!GGGrTףz9ZV,eU;e]W3do#Xs\FC߲@s.z0K;eF_ WaM+ ZZxбĜ\(tN.F E[_Z;T}7l#}F:VqԯV](f󈺯)`AvԄȷc{<nggg2䄢^(Zl~FqSDL7fZxc> stream xH;kyS endstream endobj 1454 0 obj << /Length 1991 /Filter /FlateDecode >> stream xڭXmo_aKe4&Zvb{I ^(%$'wCɒMvC" 93lAEƲD&ۅIX"q.O\_H[jIrHFL'̛Jk}6[\) ;, UߞLy#+V JX כC݌J3˱!Y , TɛPmRgמC34H8#as j9vs3 `[6 4LWӞȈq~6JΤHeqY'bW`+pgs~4 1`YA}S'u bRDxpWWl2D6A1 &, j~Ыuf}Ь2o\l;B0z{ K4 zJF\9DC,W,g\n|~)1&2-At >Z6>pQ܀G Eb2 @ޕOicWp0FHǧH LBJcszgQ6=9[_qڌ8o6ZޡJ8=Ia=Nyte4#OP !IjěFhuzqQWi waziit*!^srJuڵs@OO&)X~!`+D,'{x>G/'藧G~/R'mNSk܊완@%WKm<&e|1qx-B^`FѣCJ_Lpq~|)$j2{a~-(jypWRJ$z *Cd:Ӵ3EJg,FbQ@` :~1<g`@H/3x1Xg,1{3`&``zT ۈ8OMϷS۸$uƏ$:L_|!$)tsϰٝ _0 Y,n!kj<;dɓ+&>1S$hA3yA3D=KfIN_\7v}U{zABT(KO%_* ֘DҧtH~â6L#EgVL<цÃD YbLTv8؛JdJ %L0"xI59GGMH=4P ?_#!ui62!vjd{ʅ eN6<$ߤDD̿<2pOرp3 =%^B.o)ogK{BC5$ 6cUʤ M@^xA$ P8(">&7Ěu|7[)lsun0XC|T*@CzSv`{tng ٮJRsMŦ`ʐ7uu-Y0S%R MT@T*P75]K5> stream xڝn6_p%ILA6"gwLZGG|뷊E%[>&/TX˓@RF͚'p\F靯7RJApf[xE٩ou"3%韉 u(^U:FH>KD:vXb,C"+[ ?V]3lx,@%|)߬OYN|F~v6jeÄEQl-tScUda0r@ȑG5IUߗ͵F' ?XE `ir#ZLr΂8כ Х3`'L`C΢8z<^@>OR ~xO}G얚`YC_>}"}_еjTd a$.^ b# r4Uۮ'K]*+⧬1kd AIa|Ō. R$^tޕ;<)Mv-Ә~"t[*#e jWCF*)bg hy r^ѿx'^䍕-QQb"`'@ sZ*g /ЫA&}mmnֆyD"`̸ W<NL,zR3.,c/wɘUzp[#2y2}䅠 RK&)a|"{3FZuDD3gI_` ^ HǁC@'BAQ֭pĝUJVTk"Թ&^GixOxn2|m_\d0J9Dv"M VIӸ>A59z<z4gw_Z"kkZ"C=,aBQjAd/\d% z+z+4 ED{I#CUzx˶-្=`JYojM5=0֌:ZoZ1tS)G~kc|uJC[+MnfT '.}0bn`g?TObNл`ū~tآ&j5ڑI K7OԵlB 'CHgOرD 9͟1QǎPPkhc CʍHFA-%x%tյ5Xj:%Ɇ H;HX+20Zl!IeSr\^1(.;E@Qn7Y?tvM4`}ιח Ia=Q5@aӷo~6 aR tݦ%rHD5WaH[ht-ݾEƑӊtg[j0<_=)`48 wݲ"յ7vNJcKJPvXҍjAN00 z/$m~ﺲ?)ܝc!b4K۱㚾otWY-U&!^e˔urDh\6Y\;zg_x`],Q5*R8j>uKS8z#7u{lwB%JnXMO/]meldOiy}\p +=2?ڬxAB|0b~2Rfՠ;}VEMV=AWo[;25]9 mgLl_VE w]M,E!o1^TxF|6lLx:T+Z[z(v,Fr[3O'`rW*櫀'|ǫ>OUg;U<tɯ'śU]MLo)k5~ x~`'> Ԭi :7enRF&0{XbI4ߩ#/w>[ Ima+C:a~hϒi*dlRf`Br;#s^ iM 2,Y&F{/!Y#ʰ`(m,涍M@8Q6ve*-c5!?t ~Baax"u+u) endstream endobj 1356 0 obj << /Type /ObjStm /N 100 /First 964 /Length 2184 /Filter /FlateDecode >> stream xZmoG_17;p @I+C[0{*k InG-[Wt ]q8۬q#J$d|J  ʛM%D2 I%/d {69GSb%P A*n+p\OQϠ`(dƢTKذ@Z! G)C?v^,P9X)c= $j19&UD`,M!a-Lrlx'I9Iʼn=wlhE9X(%t p l/¤ 8 aRF푫*GIUe8ZT> )g5 ~,{ULp' qTQMbT)Vq[9:B=(%U0uT)KaQwUB=@RF"=+\}J c+34$I#$38 <0X2RqS&SR <«,@R 1-3Ã{s8X`:Md#yt;|]eFcV0c|=uv:Mϓm+AsriZ9~мW ]9:%<3'AZaUuE,eu5؉iv;[3al+ϝB3oo(('' '2rppd5{pabK!#<ac{8e86aC?bT癐- >Z$~ohJX f$۠˒ےm6p"7Pѭíu$WE#fZaƲ}2L3Ԏgr1+: ,":b":+^뮾2ń.jU':v8e|Lu"=ܚ\d3Rީv9.~k4hλ9ќf4Vg9ZhN.X)I;H+6սʼçTM\ܓ H۲=a H Bv9IsMBx*X`---:mmu!Z4׹N{w (`41 s X a&d9Lۛ/hҍ%%u3|' )@ed^Ca%sxq?-26kT?fڀ &~>.lC[ɯۧ"zYSo[>wzc=Q4s?X`b4[UE@^E2u~__E.Bw7 p bږ}HJ);.z]}OB|t븰qXwC2T|R o#M=fj\Vb|qy]_wsZ`F'LntvW[%X'LuBKdhMQjS}U;Ń4Yvv3^Lv;'cOzs^Mtqݎ/$82(}FCYoQṋgyXZhNO_1huL;mv=-&ڗ[KJؤ-2a!&#?q ٸrTx[ɹZz#F̄e:> stream xڍr`bJ aFr+",d0wb '0!'<߼}~]e&({,~/!ro?ohN];8p{bQ+q^u׾?$&ƎN8syϊq.2Xb[qMuƪ31&n*`_$ hsMmyNtS;gub~ɖ~AͼcS02l8 .X,O@D^i& 5^eYޫE1FkyTߴn :/uqd?mQ[w%E5OH;'%IBe{T,Sdnɔ8N`X*0;HD""0aJe)H>CU)Of蝣vjc["eD`MZQ~V̶&)"W0: \ JXw+uJ]P;@|cX ڍ4䙟&c!" [ʬbO a{ w%w nQ M;7!x WV| \H1 {ilC½Nn9^::IY$ֆ7B8PWnDl7{i 5؞#W쨂`ƯUN7|=oP >r~@òO?'Do9ڦQDzI$CCl^ptv{;g<ȵz;pgedpBjХw\PkrЈ/#Rgٳ(`?J2d8բƏ͞5ALl9z\IN]{PdEb(h8Eb3Ǩf?NPz05%ڢ2Q÷Bsd{7Wpt֧ܣaBCOPZ`A e lMh,M _ {h&PI^i>|pvE|Am7@a`0=ïφNs(W^zl;Zu_\ٙ#8JJ>4?͞0Hş&k▒řRN!6QgWŹbcv ~80#YEl& YXi"CA"ǝSr` _J!PDbeed0قԝji\oaә;,Lj*.8W5@NAWiqWqv}D OЛsQ>ufmb4>^nF'Y"{ B$cx>WdD.SA%QV!Ulp.˸#l3J=ΎlVHTf6y.i&8kv%' "?/" l@jf:o~4)?;$&z&PL}MIp.9j'c︷ W$=qDf̵sGNvbbxE~`P~ۚ)EIQqõ `SSF9F'DI!ӌCxVO6ǤIx?~2@PHXOqMb 0ޚ%8e/>Aw&#R-Ndn2`m"W1)-GE4)u2YnT( 9)v$q53t.6_N ^;ySl"b%DMJ\[$!,RaAт%N.c.TcWKZF | =햨_*kG͵I7v9˔Pm\ << </uƤnoj#2h^mUN2>YkuYʨB&?@j ߼JH.">4`*P:jk+藳Ȇ|mOj=V erAGB3H-쀩B1L]{pԶo%6ycû^55Oz_~ؔɡC!|":\CIЩNJYѯß?agB:H\V.j68n)Y8U(Ҩ4Goj8ܸ@{z+T60 $O9O9XZfZ=[4mHZ,yN9T5> stream xڕr8pDU,F|LƩ֎'Ua2,Bv)R q\/LWt7@UVy_ﮊ6&)?wu$Gi펧Fepbo2-Vk5_|!Mf{nq2Y8P".*ڷڙḈJ8`at fAVwf,c~zǔfXsaa8oHvL%le(.?@b(lIEJl眓'dAYբZ;٢om'hU;c+xe(m}\#*PmͨG4̥­ ? \8޻ ,'{Bƪ^פuQEo+ӀEApkɃwkmldGLHZF`i;&|BT/+%B6?Nc|;tCSx>`EIl DA*M%vl 쇂V(Y6l¨/8?l|.QIyQE˼cSu]#^=1+)``!s @OZ^jz$v,1kCOK3Ήe^KSI no77Evҩ޴{<:bXzWNA%~sW&ZptB18aZ@sojn`oNlqA ea  @O$`.pxYSnZhA]NVGIڨv ҽfq#+^'Jf%F43# Bj6˻+*@F]1adyOV52hAp|Tpu ܴ c GS{>Vg_8kt'rBTED?1a?)" m"Ql q \߅EN1%&̀`rOIfBX<+ =KG:Q*PN\jر1ꭡYKzg o`Hn/ UcVDa?},{XA%ށ-g.~@OZ PX'̈́V3>>-#w=hyG3*Pr7̲g0X-uTŤ @l$Ok*XŵhH4)D`(,ɜ`m띨?Im=V8AZ;p)q6Rm͖;](ZNTd {^71J5-($0PoB>((Oo!e oU3tddxkT9Tk|0=Iy~.>sSq{_%*6~q kOX5n4l{јUx3eDJ |1C 8YZ(O v.A!X@=pBX7;~wmovdXbWOx@<$(䶀n3|:&}ÀLgȮʓ!zAVDໃZҘ=r,"c(bPJ](j7OT/pөuɒ\@ι@yٰ_<:jR:BWhzÏF9)hcg,%fIJϮ(S K9n$D]:I'z1-WeA#f~Yx3Ur]3sl()fCA!q`Lٌ&Lq /ބ5ʯ0uL .t67@RdG0~ǴʸC"D^^ S`o07p&VnWaQ]걏Ξ&F$p($$/dɸ]d{_pK7QIsSRV9`%V)@@ᵎ:N9y&ԃiLoȵdNȠЍ_0 d|OcbQE\h5{8ۭg~0| |y+뫝fGϒۣ1W9qSn}QDa@[&L:%')Ux˪H?=ȅz-hb> stream xڭXYܸ~_/ؕFN-A?z|Z*T3 ; (V^y!wIXEppCÄHM3yJ,c0R Sljļk]=m)m`6UVQ+= ?[YJ"&{`:;&ZOVਓn毛x>YB!JynȢHJpԅ%iH7_%w5jΒ`[UE_gr]#D;$v֪mܻn#W$ڬ("q_BGAZf'Yxule$ dlj[󦌚mELp^~d~b:$צ*qIL\ CC3 7 r)tQY=.L9K4eʾAz;c gm=3]P55ե0")Bp5L~_ &VɹNB86_\tc;`J@" Ø(KtbWQ9,T.N˲l,` 0? oxb*Bl/SЃD 8/\J%*(4W8D(1UV7Ѱ4׍L >!LshID2Ħpd7 s$ɒXd?ǟ=t aO2e[0Mv(M!%Rh/~J}lA!tjy!n5G%Z39ܲ0,ߒo>P@wW vo퀔#DO{Pz6v5ĊQ8)Q\, ZR - Sj5&]R^<2~4;R';fV]9S?rdL{4|#_Um`1Q^-38> stream x@TWQK&lzԔMyw5=1l6=l$nb+( "6EiXBS: L0CK3G 30 b_xl Ǽ8/~ 3cyz4ˣSxzyg{;sA,tN3󨿿4/z~Lu8;h+^U4TgܓSM,w|_x/Ӳ:6=dA(dqizϊLڽcfm:^̊١4rNAz\eQeUvo>?YG3AHENC)HYRT`c4T`7&"%8|e[J:P=+沨2b f= rO6i)QENA(TϊYRT@g_-ڒߐ^❥+0'B{f^<Ξm2TV@E*.ҨB[b*x}09wP_n ~Ѕ`=)&$R|0BYvHL.YI =t[q`qϊIu/48nK>뜨twzEbt,iFp~Apbr[ӺELUuv vglg~ui5kzW#<Bي9uioL umօ(xp DL\ߖk'>B~^r# Uc٥[{D$VuUs֥,-h:$RUVpNOb_d=;#e]6&`jLf9r',+HL.,ckELu[zelWπ vn||V/\Y.;?1}4ˋ >>aa'O̜V) ~}Vjmx,^DBChlmu˨a JKrǀwG=yuV6µ.fLM1 _Gs+[9AXml>GL=1oql=|@+Za;K)_,K^#W}u;?-5O&rِai}ӹ2uPVcrF W|9;Vc|N׫:c[TLNN п*p,J؉ӻqsuwgEc^ ?M 5kt}CCBb6U*;A\^6}ڴݔfޣljRsvYd]`uQa}:w X|{ˤɤb:َiǗY$~*{O=?>s XvsZ̼s#G Oy9ό@bEp}ݢ韰ʚ=uF\Vc;x)kNL/Upu}{v?[%ʪ&nվ {)b+> :J~x$2$]UB_.8c禽yEkWD :Rqoܐ1e?J3(f?f늭f; _ըl:T{%%%qfΕ&N}N XZ\.ڼyŋ</޸qCm]I>+S,?1%Ki qјo(5尷 s"ϥKRXmb"`ƍ]"ou uF)(h EQB!nsΈJNrVhL*IiSRb-vm"w}kY]\TbU?J ֬cM^̜I;IvzgFj :VL:1Zvv̺1ueV鷭_C&'4|tooo)/gv[k]D[q5\r?r&>wױb_ɂçKY}LW畻kUg{$|uDf(vor}?Gmh4Mc``jLΈĢV:GI:Zi :m1?o[9K a~KYg1%),4'.2rOM:DUa~#Tb-Y.36mU",5O$Pby|_PɬOf P77JohvB_m__~Ak=˗-c)jǃJo~KsuYJr~݇QM]e؏2{ihpƟ\k)^WG<_+5{G&,kzS}f A(J19#~ĴZ9N)d[^_VVdi6X*C%R87cXzinl4u|ʱ(/.QyoNN:DP0p6;;$l)ͮEٳg%ѨkQbY.3f .;^EaQxld,HR!g>؅;SmŤu$E11[p߯)ʛ'4sn =; s1﾿V}9sOX8l̯c=7~~MTZGO{O`+˝`jLΈĢ+v|N.b}]uuɬgln5k2I8f4sMpD8ϥKSbɊ%%m[¥s \[\T`gGT3f$싷f[,rfXd1u,TٳfM;#6ˏf_OXi0g,Λ;~A3[ Ne_aO{ lSM*.cc_?,FޢG};4f+&#qڌiQGIexp4];AY>gOV _μ2Gem߯u u:/jlYT0BYqXӢMo'dr[Λ7NOTF*.:f/p9[Xҡ̫i]"m8vter̞mba̯c˗o/ӱ2ťL(x͕%Ji0IQRJfwkNƂX r]rKMe77IV{gyTJϞuQ([1il/fL~-?uˣ06vZDg~ƽV@ajK-M5#hίƖ\M2>uaG} Ra+Ώ|Zg&0&x)`Ξ5թv >^)F|0[1il/fL 1 _l[ѯ_N~SC3ez_/7=8f]+-k>v)SU3JMܺsXcqT B_/t&ں}>YKi)@{#5@_/$RHp;uV`VLf?maQ~L<˵zEL]~T*Ƞ ` իW>}Z"߿ʈ˄}ٯss3;GSzٲe L+L(,ʨy\gs;Jӧ|*muvkr-x=k+yݑ;궊-Y"aҥWXM{QSٙ~iӖxx0u]̓6Qؾ'4ofc7.rq1TbuhH\dkؘSLU:_xV7Ycb-zG~bj`g`VLXGgX zEL _SOTWׯ_U}e[G^kxޜ#Xcj8{~ͮ3쵪y37dN 8,V\|ү53[AW7mJNeK7\OCgmΞDfّ>q^ _EV˘xg)aYp¬(i >V X_G~[p몫2,M:;۷M6m X̓J˗-ʤݻ\ft?/0?&:2;o9cˌ>+wDl?oUd S[; \˙Zq}WVǖ-]:mTb9kت9YusoorsuMOK5++xqN#IΤP~E' 53ckи7^yo…ǎY''9{[nY'O\l1`1=#?1kc>lU|0;1Ӣo'w_$}uz}MI>]7sC&z٢=sCO&-<8?#ר=`%>_ʳh'KǯVr,VG ɚ}W|E;D{:V`cr[ӺELѬ>^uuu)!!%:EDksNb!!RyGV7e<7x#)^+/rw73\]Fb>X}m-q|0 1?b?&(8Ӆ{0:` #Jj1BuYL.,U,X$"wEzهO蛄L2%jWdOniS&x4%KYuK,)~]muֺyL cg) uq !`m[0B߯c {h/eB-SLIN<ԣ;b߹#dmWqgb/\x45GKGj2: (TϊI;@7[#O*1 #=x_X"q Σ g$~]P$'=ӣy3O?v4_jk NQ+ֳb|c?o}qA|Hטo5rnxPECg\{NTZ\\ҒJ &S%Y1 _QXNC)HO ЃP$*nn.fvqg8p-gg8 VG 8qZ2dH{_fj#Gftd@_ `O?E%bq^W^&gL. r-[tM~VNp9р۶># .ңF ޼k*oTeܟC¯k3-[~V8=3_s 7^4h믿&;/ _yo=~|۹ȝ>(o+vzR"h;ts(~V?Ocwa4 :L;25jٳ*֛cR⡧zjÇ \ˍ2Oϑ#GRJnƇ~prW`󦍃N/K-}*E2Ls O$$D~mgGMc([3qoo{+iq^_re &NNYzItdG}Zn_~g˖1cp⋛6nlGfj?J,YqM7RkŊY UJj(D}[~&]<L9|}v-i&裏Unkg ! =z4W`ڴJ:;p@7ϗBc5~8;\-/U:-5-r8X=nixeR 諔ˤ5r$?~ gXÆ cR#:>|u?c(M^o}{g#y)!SI0 A;7^3-[>ȑajKfq]*e!-/ud,*qR lСv2ZԻcFEV*ܻEm4ڔI%evk_8XlA|.qs0l׎uZJ_А?a-i#:?Y~3᭷?zr?βρ8q@__ `O-8twmgK%}~!?N"Jgdrcƌ8p7|89Gi_ǁgⶎk_8}t}-!Chjf|r]wPOk}5j;-r)/̘>^_՝;[R\D ǂ;@u:r'[>3ӦNݾ}cV;>tPJy:ڋD\N TBi;Rz߰a:xTl ([3Rѳ?vV t}#Zz͚_;t=i7s̡Ol? J͛7a}ՖX푛߾`]Ͽ馛݉J;3w~Cu:θqSݬLZ-,,]hgl믿j7nWN_#>]Em޸qdrFIL [m"hӧZ/Re~# gk~]^g jN>+ xlGĴئ7x{ٸa}ۃ j:_z>vj@C$P:Hcu^/Yq-sluv"z;Bng~!C,]R 5j$kE[c%E/{EiN&WGnR:rTXD_@(nYium/`qvܯ Ϻug ]ĽW F~&oN7;~^=h[~F8{:֯i5z: t5:_u'&lu螧k C,ܷwpر5l-aaa!a6mncakB}C}ֆz._:/tѪ>!sBf,dgȔ%!?y8;I v _8y.aRWf^89 ϋ//^%/K._GA{pH>v ~AA57}V)i|bn}*gXDc&MMgЩ,qΫZ[Zϵpޅ kglu %l9ІL]  u7][/^HJdOP_}]BAAԉ~%tu;S1[e^~Ἂfï  ~u  _u*>|A| T XHǢl3:\SAAԛ+u}b\Ve4H%)S~v9:t9X˹  ut_w7j*nSHxС]kι  ~׍=z9=EeN~ 4|AA,3b0'8xW1$$xȐ! LL:v7 o(2)_}].¦h}˗5VAA+-BCәZpMk1?q3-pCiy^o|Ɖt51+$%`9P#,J*[+RAqyYYsi߈#~Ǐj9r֭zݺoe8Ϸhغe˃>՚9cNaO8a4T oYĉ_zz.wҤ~<β:V냂}gu  e~]'5-׫M|'yxYۛێ C=gO!i^%yjO:'*ff߷T+CTW%D/>rszPXirhXIry[]eLJL\8pӦv*+|*[o&J," 6h}w}7>|xy~X_gQ꾨R!l:uA6_/_(Tοn|fK]bcRWXxo[Wx2WǖmWҔj; _;V07tjݥQo\WѝpŽi}{`ՆhTWe5zŇ\n^B%.rvLZ LZW[cɤoI9|=6h<\]?˧_xaРA7|Ѵֵ_SBi9`*#%D,Һu:%wEFTJ%: z_P(jJOYZVwEZTSWKsza{g/ƣBN X|bQPGJae>L?v ~wX] >UNf7o;#&x=[::s[_PP`0_wk̺*ڨ ~]G,;'FX$,mTWWEMuA1m2D¾ 2PYq뭷}ٙ3fDF̰*Æ :"[̔G!,\t_gu_CY4M[_+r7ݴkWnС  c3g:RhW1v+"6vZkYTfp ^ 82i{V̘#?p$_ /Yۻwc# F-rK?]}h/7;suƨn8QH֭ $֯_g0_WWW2*ZOiB*RGc~Fy:/CH"t׌pYYYyyZ+U nD"4UI$R&Lpӆ X|2o_X\l)B.?knԨQaaFC%QuVq?~J]sϱLڑ?tЯ76qdE Ď_GAAu a~JjW,;[_ZcFCPqis}RKFu&^fp ^x MwdxI>Wߌbܸ/ƍ_/&l 6+""Ƽ޽hVo>;e*Ǽ7~]O>/sPB9oվDuu5ju{bAcPVW*Pu*BRJj{VQ=- \)abPT.4mxmmMIqQuUC$^|C@`ZvWUD^3wܯxnyS\ױb Gyd!+/9HNJ9r$U ֪_'^?qe*7{wЯ76]~]Sc#0Xg}vРAwuWpsfu'O?*0bĈpuAu+NV{_N 'UTT*C^agqź5TP~ݻwo]lV~~~NN8a]кm۶ڵ X*(d fIMm,Ia)_`T[uZOt!C-rwo~[~a4kjjai{ ̬3VjYga2:Z& h3b)RJ*X*DRT((-eW_W{qBV*ՙ9R!LHh꒒k|vuЯ5jTΝpƍ~{uG*!!_AAP4MEE^7-jUTYi0h6*k/֯_`?'O DGO?{.y˽ԴT_>^um/\RNTE\n}tF6uY.Я˙_G{f]pȝ̬c~v1V9h:Ѡ3T2Va^hT䎘Zёr955Us*B))2f։J_Yv uڡ-h4jĮLDiX\e4 @wa)-ͦ|uAu_Gn0nO|ٝ0/cN]EIfXeReN>+ k_z%44&~T0KnT*_hџsefrR"?۹9mr`gmZ@9/OOF]]]~c`F oFN)qtL{Ӯ*YY=ܙ_a][[[WW:*F髾F1*DE`*5VSG(MrHynsJ%H"q GDP.-JJ J2Tn#| h4TVVH$bFE*BnH@ujb}Zߟ|  [utB }Eܺ:ֱeN5fi.88xUM P%CPzZMiӦhGRe/2KИ ӟ /H%bR*|s 70vj+{8p흼SuyLY>0//Wr+&&~Q]yM'Vk}F?o#!ȑgyD7nXO9=PaA>%ҶFsf1;QoC رYvu5M,;F(QejVR* %tZT\M{LȶV D K,gܯTnL). %r`%*@XXZVY(//ɤUUt1RZI h~]Nu5UtnT)U 9Љ{fx_g͊˳o7on|||Iq1: _-j43Tϩ2;B54a%uЯۼy3߯d;21z*?>ݴi3Ϗx ;x뭷r.ĉ_R֬YM 9i7Y4]8︒);wD՝swYGpJCu%N ;}$>WωNR~^qfo*Z x,?bĈ!r玌[7jȈ;_tSᢄJNto8LC]3fL6g^issO1ڹIfˮ`P+eY&*brYJ)֨u4ЪUwo1 … ys' K.\8O̓g*X&OLDrUͺu"ѡ(˔*gwgˮ#?y':F}<=m*s\LqƦN,-)68a6eRs }~ݮȝ7tӮ]̯喛3N˼ɓ's~_j_w-dWWU  2( Uܙ[V}LjQ6Z9_b ί;vADGGQc8F~4hKӘPB! 6eR.%)!./2K;ѯQfQby΍u<ם.`>\v7g0UYAխqIL6N]9'e2\$,+:UQKd"J]__qQyS*䥂Cuɷׯ3Ts2/8ht@_.\8AϨC : Eg[W;GZ-᧳(~'d6;?C{n`~ݮ]#G;V  u 1 FhzyMyQb&~ݦM8ot,>gzP}yg֌=J.s$b1]qqs蓮X_ύ[{tu#fqD^g/~[vf+C Umpr=2W:i V >.mXu u_N<Ɏ:f`d ??GS_Gj P:SFU*W$TPf]t?Pųx1vPkM L J~\f:Ѩ̬3*;n; rOeK%bJ')XvשUJUyM4 b~]sَQ)ӎ$S4:AqQh&= ]pAR. ޔ{˯#,_u&Ϟmi>s--7a_AAԭ{؂:ӧɬjՙܺҙ*?/ _/4* S3X9{֬D~ΡCg̘9oe"![9TC [;bqɕfo,IP,RsHZR%$۵kGC jtz+K?4\;wdf:[o}ݷo\N lذU*_ fҕ+sLC…4J]UWuPOPCXZȔ򲒢6$Tȥ)i `Ky%*`+Hcv[,sܯ˔*::#f#\IKJL9x OʧT[vשs\ :ם?;Ι3 {cj4E ;oˤ;,TsV~AAۯ Va~]ee%}mܫ%jSWW`2Θ6öfԟT*Uu;%ՀtY8~cG:-A>T,.g[iL~GY9yd9ϩ]U xoJr1' puQQQSS.dߩLFѪ)((:& 7ӧr*:qy2Oo_oN="J&} q.JXΈه7vy{iiϛ;k֌3M>>gL7%+ϯԟb\]J'y9ebT}OVV:r:1¢RєSRNf3؟O[ '9.uZ- :ם;{ w~^u+RuA8p%WVWwESwt_dQyy9^ Gd4/ewQe,Lګ8;yDwfLm逨z똥mֿ;i5lSxX#<2dȐ˖q˥tVf\.###%p\lLXXȖji?_ϥK/_brbJ/5ԯ̺ }^HX)DBQikӲ bvH#()xbCC-v~0/~XʬiRbwGIN_(/8\L}lrY٩;z$-)喕 ҔcO=Be~ :555v @՗/_3D2 : ίz,ŏɫkgoXw(D":,\ڵNuޜju5[SOTѪ_ׯ;vC$FDGE&vEܽ{]wر="b[n ߲e˞={Py:f]5:FQJ.uZeQiJSG,;M%'#|ίk.\@%IeM[wB>) sNed8ڵwr3ӏ&'>Uwȑ"!m(M9O[ 3~::ם;t(AAQfv:v){S:WtgumPc65~?`͖-T{4uTy;#۷#Gfff;vL$Y|^A/7ZNOٺuhv! }&kVU4*ZP)*LXVJ OIEӨN] %ee(/άk|kow;GfKOKLӒ3R']7mMLT?į;wvAAA֍o~quu̫kd< _ 6Z`8tpSO8qaQᙳf8q~,8l6mKII9~xFF};7.))Zបt(555---TEi֑dơCcccJVVfenewšVZZR ii@&eԨU:J:q|v1rifS =;I'RӓӒOMKKN;}FɦD*C%<tܯS5F'j]@a u: q~]_GsmjB⢢^3Owį;uTAAAff3][s:"ڼĮ]ܹC^prFRJ<˄X֙=a%]eG-IJ?fݵ(xQ~^ZR#))M/=yR"K%&(APV*C% sOq_w|.Ǟ|Iuk3;2B.mo:uAuԯ]z6ö$}鵚"PP"()br8 jcA/7<6JEIQazZjԮ]!׮Yj轢de$b:$ kv?,whNS N9 v)6e7R˩#rH$OSw̷r8/)L?J*2LʐK%% ss3Q⼼5Ύ)~ݶm|||s.2:~]Kz E>)?x٦ֵ_tZK(: :ѯTy7x?vG=C3\:MNvVwsoXYi5*B.E"a@,.רUbiwUgG)e;]6l_l#iբޯ:ů1wj?_<&L8c~e /5DT,//J-󉉉[o䰰L@AA;s?3ѶjO<Sޖ-[{9~9YJOOZ AU΂cfNq2rM=\CC}Z_:CЯrH0'~AAי&t_G'Oϟ_VVFS PΝ;)y~800 .w}۷o_|+^{5tݻw?ckyyy07Ϫ_dɒf~$u6;Y~] qo KK*:Aq}Oua)//_AA:_g߯#M<9333|555_)S/(=qĔ)رc-W ٹŋ\Zv"PfCCMMMZw ~]c;MOM`?J*]j:%bְ[¶maSغakׇ Y|MPEBz "d沐!SC&- -xk6'߳+cRJ  DOtשw}ҥK\Οg&VJSNSSSO=uܹ'xaԨQgΜ=z4uL555GyF'OsJTGFF>3zyyb N-:meugδdfⶰy?;N뚚wEl_AA:_.ٳcǎrf̘! ]v},300_n׮]oذt_߿??sMM KtgΜquuhs~muV APk̙_f1~ݹsMW!_|  u]~)66Kqᄆcǖb*PXXH鼼dHHGoӯ6kjqAuε.:: _GWP ++U>Cרm-_AA: _q  /u'tAu z]`ݯ;{  /uDjV1׎]BxP` u2AA/w-ͮ׈L} #\nZ uuzSHkůkj8   ~ԕc"jigN*ߪ uȯi5G*.O;|y_ֿA(uAzY!AU DR\ԣL$tl@N\&J:@3;MUwlRZRb4Tv$2bR.sЯ cn4;7w: z_u kD ?g9.Ewi)Ijܹ`( TRTX*+*RyZ#~]r;cSǏ=uݷnXt !q_AAMYbΟ?Lx:~-ڗ|s-nO>Xu$mCT.93g&$̘(;iq _گ;?n[}:'kWdw߽on馘ݧ3}9: _7cYŋΝk::TWWuZ/Uǩ2~ܹwp0kظgo2.pwSN'Flf?fHxl;:ްr]䆅?uE {u2J"у<0`@әJ46s\5"K 3Nh]jڵ.gϞsO[p0nي%ٯEkl8 ޸/:Æ 3*)!}\B޺\&1bZ~~AA}֯[;*Ь4Ss!JC͍rKJ4E+5ֿf⚾Ji₊f&n+ ʾ  3wv~33g;9scQQa^nSɬʖ}r/9رč'x")1mg-[ 3rK/53]xX(`nr[#=-u͚խ[ֶJmAG8Os޽7ⅇұ#pc#uwΙ3zŚ ƍm _i _@ `}+7! :Q䈾NXƤIyUff͛ٶXجY'Oǹ5|ռ{2?SPP-weVΝ;lllXaʔ)++ܱc{ΝZYgq~ۻ[,ٻo𾙳ؑu8Du7Ŵi/35*2Lu-[HNJєn_OIw7o\C uhnd!:1NNr8Nw_~y`&MjtTXukΝ[l5 ڡ}͛7Ʌzhl9VVVquhJv'ZgΞWYfϝe&;=60C 74k쯀_ָq;:*T)}NINZre>}u_~(1!^\~@u+x .;[Eupc#s:*,6oԩS-[,;#G6QjNlh֭ӧuif VVV D]u9;}:|k rs8p"+Bq@ ,8Bq\.C~@u: Dpc#:agg{wB|ܴS_{5\n:lw]aluPezpcǎEGG啖ܸq?رy2r:>Q  EE9و F uc ڵkbk/_@u;n޿oϮu` {=}||~i:6y#Fu8}]zZjRBBLtTtda1.ĄxA@`<,X~auu l`j(X@Xlӧ"<=L5VlߺsY27&X`5rwww:}|]Mpc#Ąsg|!<=M8,Φ"d<}|+^JKKGѶm[[[֭[k׮e7*nȑ@::|.&:sKssrTn~D"wn-..Ÿ|X-[R6DDD<+?swQVNOOoժ_@ 꾯>=.6X+..^jEiiIRB"320 VR3$$$iFGVZV]x1:8u;}[7ܧO&uו ֚F_ysg}-ϝy"i޼yAAaz1bṙ~Xb/zԩG:;;y䑩S矉 }|\->[/pBvv١?[[[=.Xرcѹ쮩(55˛6mb}kee_W}臨C@‚7gwDx|3ױ+ܙTݻe˖BVA۵k'Mb? 7`=Ы:wͨQ&;=::˼;oݺe׮]SC@K*]~pU5vؤ$w8C 1UV?:u!᧟~һnpp#||@ )ɡo~:_g;K 8𩧞:s ׍1bʔwFWl٢j-&:jܹƍQunINJ fݺuy;.[Luʽ̙3 TU~)qSRR2fs={辧 mҤ!on]Yrrr֭굯x40K(׮]aKXq=jfdπ;}u^0eee߿]v^^^n_w=SO=~޸bF'R9&:G>__g*1b;:Tɓ'u (%)tXcÙ O?Ui74Kw_W7WxX6J_w5?sVaaaIIIqQQ*,κ{%jϞuX_'z֬YO=իŗ}ٳM66mrC:x`[[[3<,T@KL툻ί4}W"#4~.;GGG5味ݟC6lXߢE 1O& ;c;.>l Qn,X`oo/_"""ƍ#4o/TI;vJ 66mڌ;V%ܹsuuu:ac>Y/...,(gySXM:|8t:__ߗ^zI\9ٳڵ>>cǎU?'''e )))uuu:a%u}{0d5R5x㍦M>|Xrn&vڽ111ga;W~ɶY'dq1Ol{ :n\p'|`wz)DEF9dȐC_ݷwO|\pwjHkΜZݷ#7׵h8| ̱ƍrGv{[@:tH[ST`h}uӧOW /(+ cub:Ϟ=k|߲{.6:Մ 1BEىw;v=ꫯg 6Lfi:v*YYYi˯c[}ѬiGQz~͚5+ฎSW/>C:|l?ӏ=;>333u >X_,9rǍg^_R'PV(//7ڴi3f̘e˖ݸqèsin̘얕bھ=MOS.({5kh6]j<[m XT}njϿj\[[uԘξ}zjJ2|hN֮]/u:Qى.&&_wꕶm&&&(c%!׮*WXh-ؘh*+/[Eά:|+Wx' uΞ~GE_wׯAeuƍvoWt]FBTT駟~yBӧNen=J:vh^_תU+ ~_㏤$Bu wܽ{Ϗ[^cZ4Kav/:}e|@3v9Şe<>LƶY, \UL3ݿfJ`֬q[}b?c&qơwzKm]obРA2ov`)IVdO:|ƚYr::CrxqƘo]l񮢯v7l{ȯs9?...8f厧O-:t`+((PjܽiӦuM4QШQ#޽] ~kо.!>Np_7|8=y-=e ݽbm"?_/dkK_|^Tш;۶W^-Z˗o0u:~< %,&lߟpS] /嬎CM*.}&$A @??QK[. WE͢}߻}MǍ{~;Mc? Gd={#hUFڮCm{vgmכ~џF]o*}]A~'+{x11!Xc=ic?ٶ,tsg)TSRRZ0o}tR蘚,0;;;Mȑ#V Js{쥳+aׇ sω3΅Y9@u /.dwd5;zxxP:FjSU!SFau52D9uԪU}]::7hڽ|rmقvqrG deѯh5t) z1rOg45UPǎ9͂^ՕnREױf){ Y)츎40V[?}H孹s Ozk־Xyd#W=-JG;㯿a41Qana4м<ϴSgyiE5^:mcf4~5Ν>ǑCy9)ɉl;I:`ɾ07'[G|5o m.&* ͚;KߡJKjhQkWD_ʊu#kVVVx>>}lll5{u`v&La \LoWU_v4ޡC:NѧOREKٓlD_p!]R}z낂$!Ch!^DūUUl04TJsQɘZwj~_<9sgzk{KV^Ns\c?G- o_{g}*_J?r~M*`xj;ߋW^Uu*S_g4~5" Cb&⣣"R뀥:vggg%Ғb()fw[u*㏋ul\~IV5EGWݼysJԦT5JǏ]_@TYX_WV&efk,B(INRAhڴbwuяҡCں<} U{?2"ptT~՜k*h:޽||beӸ~/:*(gc}1יҟ&}և ױK>+YBCU׍"_71ԩ?d~}]ƍ\srjNVVs=3;uԃ޾};--4==֭[w iČ%fϞRRR_)wgj1lmmÇ'&&;wlذo߾bGGGe !!!uu@uI ΝoߺY97_hJ$&$\iú990T:?z*|F_z/3rEe?v>}*QXj_;o@O!T+5?x… ]\\ڶm믿^vt:Nܜb]ҹ9pS:5@bb~޼y=PF~nݺM>=##CYgҤI7_u꾎  -`u_ի󏋋A:5]_c}$_'wD \:b,-ZDGGxW^yt] סAQ| ߮;u`Io> @ ITT]|#zN}J-!O5U*C]i|K[?}%jkK۷Wž=uk<Cu_W+c_I~~?3:::;;(%%իǏF/u;ӈޡkJJmdH Mӑ_\]ip ׭;VC=5||.VVt.a[e^^&&ٳx Po|]ZJkW7v)..s{WμWXT.(-ZЃMu/ yz-u] u`=٦M-x$שDv?Ì 4ر#GtOII5_'$%&lq7!gK|l4|| &u0::YݺQڶ-6fg`QN3J֩벼.]TX~ޞT7СCϝ;gK._}۶m%%%/Ž;nݺ߿Qnl]vuU uuP|.\hSfo߾W^fٳgNNѣX8q)S$i,))) 5UV וo`uo u2|ׇ0VQuСm۷ ]]];ut5|?۷F_3mRfF}lllƎ[d~*7HO|{r^|]=:ֲ*EEE;vݻMK,9vXhhF_@w7|[onWXX___yqqq>'+ԿՍ54mT厥 ꚯkѢ;\[_tQ+.tCk5kh6]; o X%!Qݨ0gt|/5{:rh;1*CM:UmC 9x`ii_ :>,)S򲳳̙#WСC a*nW/3337onx}g u}_z=ҩE_wd`~}Ya.Ru Iwu=u`1Ny_QPPPXXXTTklS:X]1zȈ3ݻ^_Gy^^+4iBꁷ-jԝ~~uƏOO<9##C,t۷o߱cGYĩ4(RСC/r7l gQUYGyDNMM>|x&M ƮmѵkW5{e={ڎ^ӗ^B^zq] /y2k3kN̏E.@~ڮ{Xp=uk=穭?uרq><-,|2'>Dy{պ"}3o'N(|W\),,\~'|RmlڴIskg5kְݻw?^fm|]M-Z=s]p?.:V^޺ٶ8p!ܹ}axo{ٿ?r!+z뢣iYk*ӧӔ*(c*Υ6Tl^Mϯ~%/+3OjfAҌ Jl1|^fn4ڎё ˔+E)_iiw3kiʓ' Ͱ?Ugÿ>}ˣ?L;uRmDyקq>tL#"*߮]x{늋ۤM愄x֭[gggv卤D5~oiiǩ4U3YYY* -VVvawnB_|‹/i֬q}Ee>agP}݄7nܠ-\HWpyk+mBC!L*/}VloOW&I*x瞣qq))FGQ YvΝŋFwQ|4 &iGzlncCOi?4Qg z vM3꺅@*;b?srw٥Kx-v'WWnh5`[[ۇnvIU:c}?.ם:]E~㏋u׮ כsk?j ,͛1ZUnuRXXu׭Yu8Ö \r:72R+6^o-XF/_!_gm]i<[ 6,11A;z+\[^q}d dK7mPnaS'!ut_׫bHp0ML4fu:u*ھCMv\c_3}*mtԨJu_'* __龮 ;; /}vq{ҤgΜH_z/R_ƚ]t Y666{؀3ם?akk;'D_w*ċ}—p߷Sg xG0&ܼ} ꬯ۼi 5'Lghµk3f%% ZAA5k*I' ;אVkoשwFA1;fuvv l%%5aЫ׫ *5`N^CzA{Y#zX[j;|YTk-4eЧP?O:u wlV ?+^)_^z񹤤D}n!Cllluv\J}k;v5eeeʷoߦʡ :C|ݕ v%8*ׯ]a!:q:ᡷY.nrKK!UG[GǍGÇZ~ x 4jD[`XXu:%2׮]T l֤18mBҔ>|~C%}}+:39ڎ f|BױB?~iM>Xj_\Xc8Q|a'о0 3-]' _gy7f@բϿw/A||y L3. 겯fo|1BP\Kb„+2j 3pצH76t2U::HZNo!(R__;͛ ~D|2|| 3pעoiN0 =b[?a-3||inֶmi4;_g!! 3pצIOKmP__\4mڔ:˾n59VPnxWrJJ_ZK^5k׭^陔p}5V0=;7'Xf|]us\C+,[G!{N\gQ)p׎KLFHHJrRÉCvn __,4iҤS5_u_W}ݜWPy7 Rgϵ2RM+V|]jrKB^ILHHNJ`}M___)vUu5B:˾n֦+rT e-VVoA=T*VP|_~{lr _+EQ`h\Z>+;d\׳qy,DntLTDuu_;$ׁZxQJccW=Fx޺em j3ޗQaپ[ s\M,qMrw3CI_klbXƾӱs6_q"BhEi{OŰ ^) dNݗ+ƎKlez?,n_'e%DEEGrb>4|]]u1Q _b ],2QTXZOws]|]']-뙘/] I++*.)[,Knhm[| uuP߱*--UQvu2!_nk묭+W=>:T4Uۂ{1/cq|9' 76Xeʦmj,Wyklڭ9ޗޗ7^^N>|0T\m[ۇu:i:%`پNFҘ-^L'Mضz ۍ(NӺ|rt&SxOWb^ayĕ_(!} F,QEGG:x_K7neKzNE'ߟU یuIIBr]P_go/LsqF<5Zv5kD;u6JWvks'\0ouu$d !#)xlmm?}]vInn4+^c:7nTXvR10mqthzU7<0W>| ɺ>LPB^'d !)*C8M4A::|]uYqa|:||:1BFrY7 )oB6m>uuCаe]B2B\ HBEzGii)|_gYO\̧K[\1Pe4k :|:1n8! @;Ãџ:Bj.]Jlij>,u벳===׮][\22~m{{{333S66oܧO;9rD֭Ν;7n 2d„ :eʔ?Cubr`\7VZf?|$;!g-9u?sMl |]:?nxn_p!]Rݸru{UlЮ]$$ "l?:aBQʥ+ Q&Ӿ}+mlY`?mmUގO*}u딴kn޽[ӧO߶m[IIKݾn…G(׈}Μ9|̙33f8hXXذaXMgg^!.u25aiKȷ|,6l#d!6&|]ZjJȵ :U::R)AF+d/bB[߾" Mjf*-9462dHWl-+aOF57j}_Wu999C?U={d%l#??G}]VVJa޽SSSFbb6_ޢ\X:ʘ?opB\u::N \>_fb!3\y-"ď~Yjr}_ァV\[Fi|淂諯Rggu*%ucKX)#8=E ifu7n>H߾>QY0ȡCB&Myޒ u{СC9f?۷oשvر}kub־HV?66W/|`}\“U,31|ں儬u u G~B~#!?_r nz挆[qmVi*c_11†u: jX_gg'̜VRB]&f&KJQc#5k*uݻӳgZϿ}u벳{-nCLu.M)^xd* O҄>),,trrqP1nرȯ _'Loj$&$:1n$OTy|טXAi,pM;!'!/&_׶m[v{lʔw"#: õ`ZڥKɶm+ u˸|Y(+K؎!Ɔ=R__#FUoϏGGQO`ׇmTu]u4M:c|]QvbSNcrܑ#G X5ݾn޼y?Sii_ױF=*889tлw׾.9)1-VyzWznt!,kZ &䑰u!/\qYt' $!{ |]uU6f :-#a2'׽ɓ>"d*w5_e&~#aɇȺrkK~t$y!Y͟gN䑩\jD/rEx"I:ڭ0m[:m<~:,%į^ibfJݚUQ0cuu@iu/2rrgv_Bb7!rY'˺K<tD(|E ߾GLZGe*<#I]HDjx. >ujpDv/_Z渖+[U$~ ___$Y\7'}$d.! /3J.nr[S|:H+J$$T3} wd3j4:3jj2Si_οCSCFĉ; ߌŃ___eu,ъ:~v@WBnY\dZB(Kmc6 8TU0]:n5Zxq_4`j9sAnlF͟f\g6Նj2ryUw}|\:||::: dY 6Vc4fi 0]65?zߌ%NsAg?<|:|:Tb9gIb>ZlJ:N߬tj^| <)0sc1`Pw|]ii_ ___~ܸ}ES?'.M y6)5KIB>X[aܸIr!W EM&/&+6X3A1\/3`)5WO8mI_W}/|||b|͓X?!$%5\Bd R31M΍g[ib]0o!Kyh$A&a%xxJP#$.e(ux\o05pua:u Pw|]III^ɘ1cՌkmː4,wnDLH υKpw\,JMλ}[c,Yw4)YBJǽKy>`6WBBNW p.@3u.L1m1w&ZR܆PG|\'bH|||>'i';̺'~ YѩyTBE\ss'I).V?J ooH.1Rpd)/L'j'qqX(o[G1_רQ#P(??Oc;={7'...j___΅ 5_'#eoEvz %\_?ȕrP'uLsʯX(d SsP}6MZOUϚ ׹_g_e{ :::|]uzb,5ْ\Y,WaO=˗#^q*jܔ539߼0UdGm޲* qU6򣈎N\7GE+uS;7;r:?0~E<uuԊH7W&vRfL^ܥT4y7'IH^Dr6u..W#dE!i$WipWBk.YjُϏ-eЉJͻ`Sh|x(O'd ^PNHrAZ"@[8setV}]nzz`Rʬ@_'˗rp*,";xBJ/Q>\yNh--,˛7"JI|=]/.ʨ QS]UQp lF9BY󖄛Nm~.^>F)V~Oqe)J_ _Wy_@ܜTs|||>:<"/ "dRJ 46*垉Fѩ\M9UZVN쟐6⬴bOE`l7w6vsgc}qNҙ++hZV^6@Z~9jݥ>Vj*0~b54__@+=SS5VLeuunAܿk:YF:s6UJ P w [ms۳|P4VeQF&>Wyt.ߢ .-$YDiiW'.dx qLj!N蜥]+*iP/Qu::j%&l|#$$%9,qz߭Qwauu'iU;ɌyKʛM&; Yεb";gbxr>ǜzJL}yeq.HSrnU iyYgw|Ԫw'cOH2֋k*?//Y?Q$/d !wɝC!ߞwTY@B\ha?oJPQ'Rp |`.59j%^!W$&$$'%V9M_3__]M ɱH)kN^zՍ.O\BJ˸(&-\8NNi}ݟg\I]YD"_#^oI'yGJrs쟼$e-PL'Ox1+՘kժC=Լy'DGn_xi-֬\QXjŶ["2q8'*H`/rU_dǤϿ +wyrW%zO#I)pכoz-:||,ĸȻaDtDx|l kZ _WλOoɘərٝxȳչ27> bxNZ/Ef]/>:Վ q|$Y;nwIq>\^r]zWΑbkC\xiuZWɧ+>8UZ5Í?PB~ xN͓u_4׌E6Ʉ>K/_f|]ZJrRbBRB'__0!9)H Vy0,4wqmWa aY4ny^Di)⫲^*L>B.JHMvbKx/}rJЙt4? %JA)Mʋ͟4 Ks?l<]EwV\µހ~t2a_|M ezMβur*9* >wMZNB+^*]\lǥWKK8*OaM>U[A|:cݤ?q;r Gy~3?(bb$7q l0X 6¸-|W'i\ʅ ˁ'Qh2eO6ob]Ea_uuTKKI~^w@qqq؝[뽂/gŒJdmssGqJ*ދ$ᒳUX}d$7+cE<rbH:;i !d4m?i޹A|;AZ]i҉HYC8K|#ULԻ DJs3י׵k׎yLA__}]Rb>wDDxv-0cuuAJ0sV_ _a?=l7qX'\X^'ɽ1/_՗oa2ܜ]Y^*J(^g4mobB#HD@zBrpc:?71ϕoGqo OM5I-q-%΍SlH~ފr ?ynBH+~cr-Y3H CjII39(|;ϓH3gN-=XƛoB)G֛$\XE~PV~WSx ~zN/ z+;*׿~ldN|OkE@$uVI(tuHVJ: __|P m_MC}/y)U"]MXW[|eU+ofGya4Ng[.43kB#\%/g rp_yZm5awgXLZ7.<$E)57i R5;ARxzItt\;wŊ<?yq<'d;-"Ι::||u:x |p&+;ˢ% %-P$qi%+7{e_֎KVMSrӼP\a ߷Xe⚭72[,72S us xA0gAq<{nw󖉔'~(;Ko$"K*U5Qr.ZEr8!,֥O__|]YY}___0 ^i:;I:H,ψ4TvvlZ+}̍xǒv~ܒH.˛ 񃔆wXB yxYFxR穻U8 n 񡵃{<.эu绸K% OHoʝ5'i z*y/9Ikf?4GJ%yNQun1Qz>?||:|BF&@K9qI@͎oṟ̑y6$1\]lb!>2¸ʇӾ9Ik:qUćnGM$uμr{o+^rVȂ v[}fm>wJFH#۳`7 Knxnm _"]b!q#:::@-":ZA \4։c<ڷNwjvu8Uillh;sKkJRZT5Fk c""XF (   I<s?<9]g~4}".jKuӹwTUAiQbE@JnsxZ0 6RҴJ{dW +խܗ$(1ȎҿZ}(aI ah)߷J%O6]UU+ÿo2Lי Hwu׀͞=ex:dh<Rd6s;)0 UNZN_rζrqhǝ{ [tm]8j*SZ+%bf;RQD0GS+0-0lp)ڙw5%53RNc *fn=Q-/W@G4J8x߰;D4,1 9_h&^w^xazL&:u&uO|ϟF֐2^gxd:lcz4PfM?=F Nņsoui8#TU릒n%?gA2d_+S{ LK [z#wpBY|Ri[8.[t/RyZ"R+:gixsR {A[3+EQo)`w=b *%x:}Uhc/ ׵?d23^g2^wn@:uיL&urd-Z@\5^8gVgh6 ^ߝt}7g걽UⰩ:ZL>xvsw1eNbW)sU` hŇnROv/LDȪ%9$us5u7ze7O*@d, N|ndޫ r+#ҳ˹wrL:!-zA&qSpbuno>я~ d^7qbwL&:u&umSN9s׌3^g2q^w > BO-aa, zml?+fR8R b*|.3.*5ȴ ?]ع{qU5ŕҹwrq*SOkQ'\~Lɡ,os;wgI)hA% KYjo%? Oy{)K*v>&C=@ᄯvF+QLV=t PuG/-_׺BwIvZWiwM&:u&Ө}e~=H=3^gd2]usK/Q(}n+gswS.};vmr-χ&jI<`Pٰ-06f_FT}D*>TCZP˪V3U5u9{\ ӞtnYž"<ƴ|FZ_SI2 SvDRznoQ- 0#ۧﱣ1]%yyE^fn۰N͝d23^g2^7${c]m۶|ə?>!yx:u&xݑE& uuI i]ݫfD4&i>I2@S I_n:N lau3f[jҴaT?.[OɥGry,u9yZ6O /cz M'(Opb%ѯIu-3J0o+9뼯lzH^=vek=V/~mW?`M&x:!xok!oEճ&x:u&$x]"j?ŵiTXR mns4qQ=M$FPx0֠/f|6axV>ՂӘ7`,߯g[K󳍍dzԹ=<@_s/j0l P4RZ@6w<d sc*.JjJ4nu1Nuc1˴ӧuI'wyL >}d2^gd:ۻgC-\r}fx:t1To浨[,@f%-.Kƻ;g;C &x8fs(uYD}zOQr@]$\,n.5I3*XLׁV9>Mt.->:Aa7QvK ŕ>)6),8ElkB|f*aĶY{l""ywcJ$1I^7D0LיLGݳg[疎fx:tx?#/1]V@cMLU&j@kȝpcVK(Ux@N o!h Zf~K5RI6sg/4($)f0]ŃCƱSiHlA +ilѾDP[>b4,|QY%*D7x:d2^g2kl׶#Ռ3^g2YdMB-仙j7B@C\+484>lSʞ ʁhvr5)^?^Xω:l2>t@Y-PKJ4ƶ4-5 SMIi(kg;t+ն/J7g#%uD{ax:d2^g2"{׷mz:uL&'ɷE%/MIZB8Rw@w,i$eq_8l nMٹéJYy4Nʭ=yMsIRkg*^jx< [F>ILkVW־l&]0 >8@o"}A,AiZ^yngĄ<,* ){Edyid6{ÐIǞlx:d2^g2*۽ukj3L')inP8߂ Ka,| 7]p rӱ-Ԑ\wwZ")q!j.y@ѰQ,'KXHjVk?^)mos& uKncaf֋r1`ޭܜ@ V[ַR E2%>h zunRoaZnD(φ6&Wm53^g2LLQuwr:uL&1zʀs* )MA*jZ=rնƕtsɀ[  b^PjpoÖn~ԳAX5ܫ^WNn-U}Sy[ Xˌ~*W>97|wK7R^%kNK}NIk}x\x;ȞTFZLs;-Q-PՓuvaC1/:d2^g2ǼnJ7mڸcivuיLg,2V,XP+]fQjRHY V jq'%\<%.X]s-VyM-Č- vT6VNa ,˥aq)1X 4 rr%=Rv3b_;yYc18BQTmM/5,$8GCwcΙo|n"~95NVSbfug M(;R3L&u&q6?PqK7by*_ګFƌ3L뎬bʝ"J"Le+B[. jj<*8HhDՇCk:qyFD ef{["' JL -"u ѦtkĒ1!6 $\Gn3Ɓ>;\DC_S Rxڻk֬ꪫ>Oeҗ48:㪣Eg?p͇?۶]{q{8l')uL-7/mZy7o[ L} 3^g2ޫ~:*T "-ݼ^Y=OIg JuxyMр"ha"d xp*NbLvu[ {]d3ryObIF t=nkW uv'hظ{u3 *}]zΐN*p\bJFh)N#=ޛGGit֍5݁vO2^2;SHAu sΝ;ȼȹy]ロäʙq.]zwc{/3^g2^קmұq Tw]+4]w-zuk_3,fxd:yXt #.!!_<_V(='`]%wʵ@ 04NRXķ:6a*tkVפ'0DgfD̗-Zp',D:n'i o0lT~q-D2נg+}^Z۬öQgUjktj s5=`tLGŎ_Qu?yy{k02?w󝬬:'<]tQ~W8e7~~K.yyyo̝;kkkkt޼ysnn'//C?iӦ_/Y_lٲ`<$?{k֬.3ˏ,3g~,{:޽{O=ԡ׮rJFgO:Ĺ J7`/П̦23^g2^7nuk׾ՇZ_[Ӷ~]fO9Z@ $W)tnXj id*7QPޅJ6>bp/]SQcb:3c>t`^}UVVs9rƌ_W{9` yo~{[PyNf۷o XUU0w} g֖q>;wf6uuvuEmذ /̼c=vz/?Ü(\~~7౔555yW^yAC> v>n޼kҤIy֭[3K_Rk;UW]p~/{r9 =|juL3^g2ƶ "u= VÑw [)^Fj"/.>? 6V)- UNJVVj<ܩĠ,AP??YfyF?ܱcuYd2st}`s\WWu}OÝ;w4^g2fxd2^7x]HX<3ŕ2E\ (ktZW(.ҝ ^fع r(5`6aW0b\. *ѩtބeNFtZV[c:ĮVM@*uǚªWsonlJ.-f_ ư$݂8%.]Z׼kyV`eZ"2ZM}^رc_u3fAþ7^O~r@gݡrK/t5V s:f˃9Y~>e˖o9'' _B0{'ۿyݹ8|w;O;R_yץ 8=o|uuu͛7ol?:߃+hgu֎;"ۇ33!}u;gO~2n- 6_c(0y`ߓjss{m63fxd2^wL:G0:y+Ly Z5 ,}s+6B]Z U;y&\gjr0)r r{i)I,8X%ʠnk:ן^h7_ \O"y@?9W׫*i+̾i6xq2mYǮga̫e}`+c?:3KS-sч 8ί뼼oq8>3W]u`>G_7g3߶mۖ-[렼nE֭[3;Bm -X'ܙ ˂%gup3M2T \&uNk S v+=CaSQ[ @è h6881Md{/@[9c30]9)ZQNgt.or*<(^b-u^b(z>XĚu 1KYUz,Zlx{< I9s ̚5ԇ=3ݖ/_y+s?;;{|͟\rInn~3}#2yH _B??\y啯jwwܹ_3F"~Ϙ`h6;8IW^O?!o} ^g?C^PPp5̞=n3K~^{mKK'xO}ߓvss{8a„aVj6^g2fxd2^7*sQIRWVb-*9$Ay M&jk1~nWu?b .Zqi֤/`5!vŏaX&zN/W/wKYotl-{!]O"d>& )*̇8`bqkqs%9+t Z &FpxC?DŽ=>q^}/}<.?/UW]/O;Zti#+4^g2fxd+0 .đFڴp0FMez֍ -t_}f'߇ aʅpo0)lQ Jr{ڶPCeK5Y LR57`}00MW)w*Kj aʷ8ƿvͤ"60x.Y *9zf_<2؝c lsW z/`z3anyq.ҧz>#?۶]ӎ2lx::kיLcA]5^$)'᳊e+k& b]wz/\`qE/?}tȳ܏ԹuҤmtyݢ5=Jtp#4^\mx?r`zXCjo(,qVՠq>e s /؝X*y@;Ҁ֨rȤ597(.#r!}6i gԬCvיKxfj>Xȓ|ᱝIM'ƨ2sުcu> Fh*pfSr;4Xu=p3L&u&:kיL&ZF5hƵ©&@K?65k= 8eЧYK6*ǖ]PrPN}bZ' utؠF٢)ZhfuD.j x]̘Ome61$xdVErV*lfw!벘q'?W!Kyѹ7٪XNXu)֖fQV\qo?a˙{q>JX&U7SYx:d2^g2fxd3̌/--Wo).F+Ueuë>S^.7]aTZ#*koMRX\!aFy9˳U)p, ; mm$ՁN|8Xs-λuo6ott(5FJ5(zX/V {H̪>9AԉWPNl9 ⊸فgOPޯubN{)z"IYQ|;R"1;`tb 0ƭg)vJe!vy=.[Y_B"ƿ,|Dל~cDO>uL&xdΚ:u&u1-0N FKg")<[6n]0u_*pQ%gwZ40*NVbW{ p۠F<fJ6A*ȏзx:f@uL*GQ4a=P!Apy ,%cIq Nq DT']c @o}t^ Rp716nl/(ꬳ:sc&u&x:x5u&xq+*^u_G N[ 9DiSLݸŋ_~{z:dxdΚ:t)9`a¢l-:-𥔾+vZ!Cz1MIVw TwӳSazpYºce>w 5[9#q'1[>s] +~3J}: k:4}%آ .([h`O͖ӭڊ/NeN4t9JxL`躜1%M5hBS\%\])񺐲Dr! ؤ%zXְk)ĖNy ァg+*xd2^gd2^gxd:!y(i^MP~XT!OGL I %l>2iRkE/!C+Wmreع$[.̟^O$s f (j6Yk@ZcZ!FOj / tB_Xn0m!]D:HzeRb-KV*ԴrM\"z _Cܥ(5IYg{\ֳw/Nylg뼶uW\qgs9ƍ[xd2^gd2^gxd:8x]<]oi-:x]P<8+|ԹX4|ʵ1QPWDIkYyc.T XfǴZZ_(giTgz1pl.}BV1nF~;Zb ;Eէ'dos۝[|IMjU3V57 H~-#lnXGd23^g2fd2;xSU⺔P#V%\J4CRGNdy\e@;K2JBV#S4+́5t~n'0Gtl00oAsuՊBÓ+|`LĺE:98E,( 86=<Q,kRSE-Ђx=ly P\Ew$5&WyI-!u~=9z:τ:d2^g2fxdA5U(h"'Mvbx{.Q\ 4#K¢ nV ~3̵Si ćvhy^H$[`Q-PP&6B4q׽ԑt[p1i!u>Ľz%` fh~yI tQxN&(p|kb<%, n@N}!-AS9ڕҴc@L&xdΚ:u&xQu)ꔼ~6"(8Z_uBJBjWAlGYJSʡ4DV(Lza5ImͶXyĹ{F+JL궉q;W.EIr >²`&awh >p!{I(KA 'jnS3BH#[ z:hX!8):xÌ!9et)%q&i3L&u&:kיLAPN^'4)9PRHjE&5+]jOR|!{HBGkJ]qgvc A ˮNA80El)k.;g_&"3RNS&bp" PEԱ- QV>,yKA.cb Cl yKu!CE@X4fr" \uS V]Ѹ:+{vr#,Pl[@dJ"d(ynUe<ԓISvr<_1/N,6[bOa-FiPUTIK$ߕKf~_'^lzZHOVW9i QBϲ ~Ҽ5[!l&kR%8DnNPLP[x۪ , EJ4DxA^.MGƹydm kºj*WikFNŏOu=Xx=趛nj}U0Jj1Rs-/#jkjLHf},rdypnYּx:x5u&x1뼪M sЉn/еч}Ji hk "uc rc3;'.ksѮ1923|$J25à:Q{}wKb[XgkbZAȡ6i VIB,;$!2hI݇Ru-`{H x I*UuX&@ukAq }׆-eaFՒ7_U63˾L'I6%޼r<%E%9?RcK'R 쀎.LYuzlI'U'r|W%0N*-N&+_^q Ə_[[+יˣ.˜ŋ{/_||;#0Ai8Q\OI&~fͺ>,_|td2^gd2^gxd2^^%#ju9U fqHZ!/?֋,<~Ԓd8jqcK/%Gˁ$[ 1MQŏM`EM2-U*\y+7Ү-ա*b1\.jTsz (Lyo*o=GT[>ڝխG)פm:Hp po#V6A49[?hAQ#uW&=^";3'xcږ/b@`@^k׮.mÆ ^xa9T.c]{Ǐ>;۷/p⨬'xYYYSSwqW13Y3^g25F;:(׭Y`bmE i^fK/UB$m^]*ܕ K)Xڊ$D%'m56u"@*s)LJNh"P+쮍A`G+|Rgb[čWD6c8)fA&{AtWn|op&|G>4(u .d8NN»)W{d/`|Ԩ]^umK.=q/?te]z饙~{u2۷o?zzwՍ9 =l攼SN9e,dxdΚ:dn:1tUj\dZHyBllV9Дχ6:h Z0;}B9OeOlO4ŨN*Hm`:Irmr|>.bKYs]xl8a Y%!MYڂZ"NZX95#[ǖ'%NN{; A- "qyU;ּB&',a m3O(y,eVoڒSN9euPpiӦ\O:ut[o;sL&u&:kיLCX-' M&@r`Noq%5a-wKE42Rm`(܍fh G YMF*֯V >[B,PRlR-jU${V ˇvm8[9BbXm\gh2fT8MõZ!cέ7-Vۡ8r&Xl=}rgj {e%yݥ CST{msbeLŠ6[ N9gTp=7]S#0^7p+_wW\~~ݑݻwuY;vD"۷oyЌ3xG~=CQ<x:x5u&xu5f@r4u>,+)J+Q(Ԉ1l #KaS_vKǻ [ĻuZmVpk`6[ __^AS6(o #xm:'KmNga6ll"c\THSrQr@bM47]aaj >\yU+ ipn6[ jt]s.(r9*s-&v( LO#گջUku}[{ۆӧCkoookk\x뎬knƣg~=gy檫z7X;1՛03^g2fd2;y]WZԩ,ԏץ4w\Rn-c*$*S bVJqG7&ֈm\W["-HzRu!/#7^\NL-mR^7O^0ԕTW6T+TK'R~~ ; jb9!uoW!q_}/|=LיY3^gd2]]&)/#4Ǘ.a"=:~#"bfX>'-AO7ïJ_R+!~xTQD&~ϳ(ʛymk䶏J?Dsyd΃E] %b3~M7rhJ;s9Zkc6aj]"K.xCf^]PCm%oI4)\I5Bt!diDI$^﨩&^ ߖQWWץ^SOGzL&uL3^g2Ƽң=Q\Grߕ z.EJ0HEebwRb 8 ߤ'`tKOhuη-,x!.mrrKjqm5[t#ŘjUh7)+'Vs֨/mOy̪U 4GԝHXDz%?GZGzA[;N<fc;[t|t_83L&uL&u֌יL&ucZ}5X[41]BNFNHQV( pұkm re u߯rWt'HmBPYM7„ĮM'Eb\m%ڴ̹˱Ren>nʆ@r8 :H,C3S!R!GpRc"K]d/YU}CM܁=7Rݍ/\ǷgjR'b"#R"5ƀ!WE~$G(\zיL&Xu5:g=3?oxԆOs3Y3^g2*1X :c9+SUPmu^q /]wiЗ.OVZѲ/ָOX &z^!9dґf u%7gCXκybfL]IXXAa9mBu9⭵9kۖ kP+ZRA#K1..}_am]{zgB9*$x<{i"epW#5ɺHװbA\gxd2 3Y3^g2[c_!eVⶪNX,wq5itmfk1A*T"ԤuչY`W^[*a22w-in%^TGu0BDV2N6X)nb%jAܼ8ɹ87NsD0av]=y0YMM,I>>8h4RCq4^ [|%?J569+QKdq134c2r~a=7£+y #יL&E˗KCLOu&:kL&QMuԫdzLMbTJp|͝i<5pB 8Iq*SOWaq5CZ25;Xg$ h&lν ڏm un<n%_zT[( &>axux޵|nWR`fjI/{j&ƁqnL(diQ҄КKk[oPVg֓OJlxKvw%NX^o}k̙~/xi+;Y3LיL3L'Zmy]T 'xQPO#!>.jTywmJ$}&\FRf28T byKhؽ'Y+'W4 igR)0sVksማ zd{o2ذWa[Ҕz yk4r_Vu-clƀ>נr =g4c ܊Njo!4pڑ|I=X\Ϟ\`d23^g2fd2;x]D@:ߞ$xDu#?k4E^y+L nl>{ݲzf01>%AOa++)b7`P I6% +۹oB8Uؗ˼wcտW\C\-cx6 Vc{F NxjIlfg<[]('|/̞"q=d"ݎ//aia/9%GG.6ֵ=묳9ֵ-GיL&uL&u֌יLRM#7飴4]MqW 'HP4/"{,/VչWA]1UB*pMFܷ%27K1]\tp Z2(:(*BJ_d/ymuntyY -&*uEuj[ d&]#1 J ]LA!a pPӕC.P0Y]HbMxIuo+cV} N`gʧ/5|e R"_Ls疎/~K_\_:dxdΚ:dxuOcڢ-̀hIgr6:&>T3.Kv~KU'? ϘIڵy>lUF7v5݌- *cILںɤGw0VUU\jm/D.Niլptq{㬫Q_+ jD,$@U,LRCCR]ptT W5^Z#n}M:r\8v9'+ ௓kיL&uL&u֌יL&u'󨝗hx_9 xdTVsհƴف_%CqF cA(s>|3ǹ2E&v;6*vn}ϑ.iVzfGUȌ`4t:=A] C^*`R*"Zlp!D.FЮі*wn^l^/>:MC)bަ^I ,Wad&ǒ}9LвؗB0Jw5Ruh5^}ٳ"_g23Y3^g2NLFR4_6;YǸCB%op&i)U )R PMe8NkqƁ]p+ܧ0%44֯d{ \A^Ph5ۙd` t!eڃ]Zv/osԚNXbeZL .Ѓ kUg/0q |cR^QzzM:AYsmb#`.g5V|?.` +HH-Q$5QVƌ3[ k23Y3^g2. ,M->K+ %Zt.+IZaR&%P' z5~XתޥdqjM$ o?KO8+6' `MEgI%g@^oqC pJ^D7qKq^z Obϫ\sK4xo(+`9 ]rܽꍤ%z÷rڸ!n fGM'8p|ixoE4L&:u&:kL& Q-S_h 'GXV S huęjQ!W@RWTiUDl#,uze IU m+侫@L"4WjI:p]{jsZآ :78Bv9.eakլ0EۄQڵa7TӠ@Hc.L@OY'W=^תth{88.ļPlG F rң\v hL&uL&u֌יL&u:ʿ:s>Jp&gƓF7= iXWqpmcqKSfkMp&qGEz7yʵ֪ ҿkl!-Z+x "߄#e\ϰv ]L\m +(/0X9\i50 W)ìoA⯌C{fe^R܃>pLTq|FO5+P*c73CFg.akM0Gkod23Y3^g2}%G5.oDEHW\q Uό] Lg,KRҵ5qs Gw`ʬ3L&uL3^g2׍^'L)|^^GW*%#ny+VTt?;͘!:lcRSu¥8VOzIQ MGiLz1Kl) ;߃L ◓9 3N`b.h0Ȳy7L6.]HyLuf? >^'< ncjjHFOӍ8f|na,xj$jLբ6^gd2יL3^g2D^qn-?dkI%1/jBIY[% ݰ^rNZm-^G!`OõP\g o!SspͤRѹ4 w ,NR> J}¹{z47+eC_w=YVP07z0ŸZ9\rYpg˟8lN^ϻut+ <Y+m`w^rDI)^A ȳ띔ȃ%nzyԗbKgxd23Y3^gd2 hxثV 񛲂iZsJjNd{[s>m<+Ku7>8 IO+_B¼2iFfVqX](A[YsU=ܷĹHJ]@5гJ32H."-;;Imم-%*̻|eezNne ).SK,l*7;L*& %~5 ŸGD32^g2LL&u֌3L뎬UʌzIVjTVT342_p1^ .@&2 7kQ"mkL$ Xa(?w?(qm+*W6#$mRkYW,u+ kCֱ߳ ~_i~~IƑh[ o/lklPq0\VIdzl`f34ouA3ldfz /[t_^;3L&u&:kיL1#p<()ݚDwI- =g]6DBh^q҉-Iہ#HBWܿ1 P F '!. cnҸ%{PdjF`s%u/]j@V;/`Ifg#ׄoм8Ks lR`Xy6Ilˋ1[2~E"2 na8E psa}s,"jquQ"[.zt#c#:#K;R3d2^gd2^gxd2^wxxQTPs n7LqēZ%'Z;$਀c{B7uc UέfgNgq|`YjN*e139nzBMxmsAؼviivf;tb^&>7s K:\yXl%mV`25ّX^`yZ7 kَlf" `*O\^o}kz0^WUU^ۏ&x:x5u&Dxg^&*m\KUK>}*Ҷh&kE1MVL,PRq3Uow |-/W!Q3B*)Lf̐g`վz`RЖhZB"vs)W 6ACYқEK|4mgERp!#',8u%Z# ҿչkGXx:F𲞽/E7Jy":iq /L/\>ի睗>?݁}4}霜[CboUW\ۿMOvAﳞ~5LL&u֌3LFIQ 0{fO) sZkk(l$T Nt®}fapQ[(3΀h"q3)ǏB:X XR6i8:̘F Hv,&X6 hav᩻^ 5l o?5Z͏SzR]AK0XƲ7L0M,gUgZѓQF6s݁m;L^ښksI'_OygS:p{mh6Dao<ё~C7ґHaX5LL&u֌3LcUN%_:8d@3I8 -TXӤvKjVWW.-pݩ e >I!N16qu. 8Dw"ǨrɕW\k fb:d;ź07ӿf~ Js8F55+W@,B82=_}Mygt婏.9X$޻m !|-xRtkZt_9܋O +eXX*juuGk^DmcjKEoQƴJSZ5ƍhc$"`e*0HنńA=9gId<Ν>LxsQ%)"\⧈EDVn`[#ݲܟfX#Slb氝/G-8e\A%, %b e/̕)v‚ئ5- Ah\"cuk[Na`;S4 ƘwAj[pz:#8X]ymc gfzAbe} w㧸߈m Óݿ=AWgui=ĸ.ticz5-p=iinݜcq͌oIK֦دH$^' &NxH$L?:J5;N!i`y;b Skm>z:u=VdD׉I^'N$ H^\,ʞ j sx>|w`TsU=}Vѫj3[nms"vnz #ogMNy&cќO(iS!qmf k7^WVtF7ζm'H$^'N$N:u"Hx]:=c&š `Avj)^hRƢbmBf*+2ȗVC=Y܌eaeSunn+C@U"ĚD!N6}q%yRekRՕvprP7l ֐x u@1hlVmfp}bSu!@ij|ySc8]0jષH|~*(XJ>o Gnۨ۴п]׉D":u":iD"NT0; .:sTbv!t3+OEwz16?eK84 z 3 `" ň,se FaϙHeҋY &s(>gD|2U3, n >`9e`nU[ D6XZxFlWTI ҊbXo@CGxx&#;UT77ð)2/c1oyɕmXQl^'N$׉D ^'c=6aq)n Uzs M7ycR`-Vf~r ~6Y1S°zZZ꼠V1ab<-7K eU7MN>go~dt*7p8N9Fm@:lm x RSa f=.slaثFO##"~6 Xb5XfLMXO} i#r!6(VN.3szH^'N$׉D ^',^GE??_jR@*,~4Lb@ 'y)q#$ߢ#V]H\6opBe9 /:EW*:߱+o xzW0c:37?_ʅ*novJWE8.݆>[z_-awvaVpV8Q RƎ9r;'FV_.įԋ~ [hV,V߂$u"H$N$^'Mx:H@zж Ar,vy69?]xۓ~bNgj5Iki@IjΉ(7ޢKPiZ| Ywalx{*4/vV4- [8Q w5Sy\u4úLt^F,s؂AL\:߿-SB2dsئo51l`êIn|'_y>frJ zƹ,LMc7u,>!}립}ݺukt裏MwH_|{-HzBMk駟0`u54! 3^-|*z:ZS۝ޝ^]]ݨQ_mvb?Յ  ^'MxH$^9y8j\`O7ϪagfNƖjBGge/<P"޶ Q򁤶"Te`{/fM+Ƽl en4PaE`؟~ *?[c~L+`Wܬl`؀/b7k*(5s>JC!Ov7TC(h9l3q|Od3͹jr_ߵnȐ!W-FnVGW}] h%SN9eƍBXE^ښ#zvޝUUU*-Z(;;[T^'N$Nx4u"Hx]ec/H;k08!W4K)x9M*,D@Jp].2Q]K"{iD*0T^g@Mcr{UYtXT-{Swt(Y+\L}Kظ2!Jw.ha~n U2WT'9ޝYb"X@.\pax 70*| @18NUFST6G׎ZMu^Kbm}m!=zץ𿥰<%9cƌ#F >|ʔ)-_ꪫ>ӧ/Ydܸqcfff^f)GjO6x׮]{5\3t/RmԩsO{+/R5xW^cǎӧ?믿o߾/n6ػ׺:u"uB D:')bV#=&y)5guY udyJ>`QTcW9$k!`W k3 T>#=%* FAÖʊ咬x13E5ŒKr?`b,)#ybr4KY{0{q|8%{xYw|ʱiLGc#| OWB T8c:, khYJ4h{ڑE?fϚw<\eٵ[n1bDiii.֭zǎ%%%s7cIX_Wsݽ{wozz67oHk|SO=6wm}^L۶m-K/U*++[n%`Ç_׉ &N$ 뜼bu:TaM@ XС0hKVC}x52a ahwdBlL4\=RfςD) aS8r8Nxw֙O>d)DN[@9=\ЩxK웼,Sr23k\V}fM8¹Uh(oq8>PG)>#n&d_pkTU\g,,&a=mNv%u_wݤIOtN?!kݻwgddׯ=z޽{{+Boܶmֿk]x::U҄׉D.EשHUot9yT8 *Lr7-v;,W K\wj ^M 1`\,y&W_jtdS0j qL |_k\5:5v4\|;1:lO>Y7^5r/WCT.uץxٻwﯾ=l7o~322h"}'t.NxHx*iD"N/aґ; 6 w0#;mVֺ;^AXʚDlνv\n)\r^[Z!o2220᯿j۾}{{+قWTTTWWoܸqΝVWW':uDI^'m[3ٍ,T WTJזe":=7ɜj f=&@:Τ 3i~F"c\$<`\dBttܙ:3`-m U΁;;* Ȟ**Czxp]z+\չK C.z&p38^R{+b~κGj+09\~.cکa۵ ruO= jko7^OdffVWWgwnС-\gyC=O >|d ӧܹswq;z׺:u"uB D:'k*S\IA0Gei3N4'JGʜ 85yRlgKGBLk͆m:ا^A4G"궘#U-h9mlp3 [ZxH."ຄh%h8=bbTqX[Cy%k00[`OJ8uG y\U/dmCo6ziR '*[>`J˭*áxst>5L)8;H7Q ;bƟ8Nat'|lg(^.hG4N{b*VvNm&vP>Ѱa-Z?*OVx::u҄׉D"u-VTEp fq^ХίE,5eq32i0z5?|:Np,8RY ܴ MC`#/U-E{~ G_.pjjg`,FPsUdRg>M?XIBF88t> 3^#?`"zah4Yޛz-a`;jKȥXRB7_kn_}=CkQFO;m')d  ^'MxH$^9y]0vʼ^Х츳f1e mjPR6H*Wvv=!Vi9 Tm;bx) ږj"qMbt[A!u/6Z+`s@rB6Ļ31XZ~<ADLe*v>Pº.j Lr ͧp';~f-|}&{m^1S@,Æؔq#A꾄so,&M, ~KexK t+ɉ -9aiʩPQTx:H$^' &NxH$^uXv"[ b^X1KCgo6i^1jP|>={2A@ī"cejTSa{[HG'v!ȩKN:`h Qu%؁VJ4yN\B^<T~4P~ ū<oEH7zE~*r/>,UжRenf>>^Px:H$^' &NxH$Jp,N%'*@&)jRAm>.JaRk)mz l<;Ex%:/̕[C셛¬IΛ?lVLzD_a>" …:,&/7LOr;,-< VXxCa[˥ 0)(Kh5,| ^p*UbRD.u>->b &!%*lGZs]}립}ݺukt{#Ȩ~*5{ 0pA~5/{7ߪ3^|=먾87;NH}RHxH$N:u"Hx]˹\(>"f-9OGZXn#" g F[iL.OG*: k$eaJy˕|W*Bvc<[AHOgr-`Ca3,t /⑕x{:6`ZDZXo;lAv*'$6׀Hj0(/pks/̑i8;w#ns¼Kج6po.Pd./;(1,x&{|0-*2VM1H\"ㆃ\=8ˮ㥆~D-`[`b@㱕pu%ux x] X X›3f1bçL\j~Yg;E]zF߿O믿~UW}ӧOooԩsOmP:VСCOHHxH$N:u"( vԪj}G9 4Ӳy|YQ.?ԀuH= DA>^KMGPW4P)O>}+ZlTIiwK4)ka1y]gt$|\pSaTSYkբn ~j@U!)BvO?M 0FX*4^G<[uO#&{Lu[- |n?N;&a3o{Wu6nX0oGשu)|b-Z'Oήݺu#JKK?d˖-_u,j;v{lW ^V]][lsNK3lذw}nÇoz?33S׉D ^'p^gil͵esָV+?[pYpM`nO&z .MdҔ?Fֵ،wQEn*p ,9Db6Ǣ3 a 3 RO{dK x6^j'E0f9]7m>vYx$r Z\.^ߕF;^b=8 UF<1b͈'uB͹ü3QL2KV-@Rl$d,8(*Øt[҇sv` `SyZ.;Sjh~cjmmPWx]Kםym= 6>_,١&O [8~[æ׾u۾}{y]]]D"u":i׉DHRfr4g`^g2V3@s*DGs.;+ȤIG@ݫV 3/gq<}c\v|0'y %!u!.aOBC|QUVuj9ʱ= څS0ޏYse?ꕜ.5:JiqX eTg4ˋ2V9-|ʶ!.fj+.5[v͟uOL\ybt̘:Fy5\`ji^tZgu ǏO<1;ΰa缮g|*t?-W^gymFSߧOd~s^}%[ӧ7K-^G*jTB$^'N$^'MxH$ίlf @(߉H 8Y3c3V1)R/L2GDو @W?0\<20ʳ0~󭩂ˁҙb<wMn6duO_[wj (Z޼;xml eI!֜? Ӏ׾I"\7x{;ɝxל:tՆ6<*iFgӰa-ZԒUUUMn&6D׉D D"^t`^:nȈz&ֈk4(7Z! {y0wMrAmTKISb;+Z).afSTR]g{c/s7.>š!W5VCZlҝY}S#~VpXTًwйq.:hh1-dN.D Yh7nR̵mjIބp > ăWj:]֯Ox.O]ݨQZ3-YNL$ꜼNw^:H$FB[3)ە? L wDM SͅQ- z͡ frESeq1zNњ2BlDӰN.|z:Da![B+ų5]`K{kV5gTXHrCE1/&G{Da{{frMDg{9;Ky#d3NF|W=_ BOȁMXHauD"S:i&J:HԥКLt)Tۍ )5KNEjq8tr_JS>s6nr70F21 d&gs "gGXUipopr4+]fHNA 97xɁ8η\#f7:[͸%bg'd. A?NaBs0fVaDȲvy]@x:H$ N4i҄ D:kzSAu&qlmc@LZ0k-WmbUr z,(Wm W; 02ͅj#/TŊOKĄxxWyS-Lt*_F̸`cKqx*o˧Rjkaaq ZlΌ\jqn 밌t.n>M18 rdk4[[񺆘_uD"Hx4iҤ ^'Zr@:eP6:PK W 4% TR1] W3TI 5]eaK[N*hPu"cAt, zx;c^k{2י!Md+ q]A`]rv<{7N3W0x]kZT,R@UjބG kSȟUB5x D"uҤI&NxH$ܼ#9|(&|*<,(rPTtW``:.0K|:0k2QO!Kcj.SL),4 \gcq5epSa(@^#|D.,ٰq#Põ!|4 \ڹ5]9i&㻅x ʍ1CL>p|*9Zx:H$^'M4i׉D2,N0S1j2UE}Ut6lfJQtp7Nj L:xh}W_fSNy"m LnxwatP(Xf6hhp?$B[p=]SXR6:|P"5bS1-j_\}!gT[CrͪT(qf׼ ~R^7k֭[޼D":uҤI&N$ ;y;+U6׆f2 eZ@gt_1j0jsfB4aĜMi@\BUǁqRI­>񰟩IG"Œ0mԭP| W00h*:8]փԍcKaH+`5PN—CUT$SjA": mT0r ~բDNϝ3׉D"uI&MxH$^w:! ZU-q^ џ]J6.ʌ= *`~?C[6S:F>c[Pq o9p,B0#E+ǃbW#`@ob g.7+~e9P7USQu*WT4&X6)XWBX .c4t+ Za֧ٓK?aUYL΃j!,$T9T#Ȇh8*)SbXcY^ʾ)a9T 3x_ekh~˜Eneze˄׉D"uI&MxH$u#yWϜjC .4.JF&$T#a<d Su^Ul fSATi/7W1o;YchfOl"Ż-dZ5& 2\]G*5e3"Z^`lQx^<,2t6es+976W51N+fbѮC[n~N-/ &M4u"Hx݁MʩL\<?Q+?.Y\BѪ<&NA Ѭ,v:ukzPohK2\䠏BaD9T^5xJ6MGB?/w0HfЋ443`U%`54/:O9@m[n ^' &M4u"Hx<T@'M!|t 44_*vN@2Ў4D}M,q]]6&@6ǠX,Ϋy1K2P[u;,%.Te3A629 3 pLs6:\q'O+aiJIGE%Hyς\ C=CwފV&|zn/uv)zDI&M:H$h^W; hRf)Vex[áRٚDWpefaZy?Dg"8W \VdmKcleh߂L޲G)ŨZ:=TVIPîEjA|xux3 >7&rp2_LQ`aqLtD":uҤI&N$+1|i$'m3e I.5|,+ km5)Z \miZII ʇ)ADYll* >?r[D*;rOilnppk29TbXe_xU8}wz ڳΆXQ=uyPZIYox0?cG2u{oyH$Nx4iҤ D;f'ua&"QfE}z lPy[ uƂ\#D⩔n+@h*#G'Qq=?  Hߦ)Y`o^^'Z]PmY 7Jͼv䓀fhEua,-^Y[[ $XN(NxH$u0 mK?\쭪E :Hhz}4iҤ D"#vvj͍/pXBvk>0S!mU8r3U5y4ŻÖ|-$<gyˬd$2G֏!%9GɎ1`:r\H $?#|MQ琢\ #x柣T%ߙgN^3gqFS7ݠAB6uh=vG^pO5]4iҤ D*;."k:$! ")6C_Mg^HwWF8T$wJA,Fvk˸"'P)d0dg#T."*)ǰO-^7@ HuKPbF~蟨+{[OhAF%O&ZTpo&;(ث9"ǒ\2ϣvn9 ^ajp)w>es@kC/f{# 내9#Vo 8X7TF,t&,uU:M{uku4QyS;޽?n.9Wo R՞}F+&;87t୪*˜sp]sT-ڿyݲeg諯8%-yWdfj^קO誕˗~-u ~v޽O%\4iҤ D"DHěFR~'N#L m ZVjfk0$kPTuCJ/tFG5SQ*9ݝXFPBF(]o+)x)|C]g&J`|ǭdwWmؽV_\IX#A^bg02LmK6Vա|ޤxG i:SE|+yݐ!CޯZϽ~ۖ:~!8iff:k&ejM|~ ^β;nλ4갾SBϛӧ5le˒,0vj^z+&M4u"Hx~毳tҔrƗ+B&7s;*M$&12رVϔ,p N`| DO doiAK1ӌ(=*Ny'PUn:;Rd*˻TĨaMmAU;^B;}p3p>F픣9aY8рF<nG էPP#wJ(V5]_6'?qfvZrWs22\z2=\?^yye˜ot;ַ>g/c׵΅. .hfEo-%pdJ6~{+9yfȱ^l/qZJz=8/ O9qk4կ]ފX^iU+y8'M7Al:*+Y^6b7\W"xl_÷6O%\4iҤ D:u<6蜡Q u@BfVAb6cX0B>B\ۓ>οnjǚ6 | )ؗfKvG*Ci~/ʺ6I9/?|#)V|}~0/VF#ɸATztsoQF,+teZ/qj>&Zj;aDv3yx^w' 32Bv%ܹF?ڍ{챇vQGu7]:5[/M?ӟ:9uum;O?V^VV93qiשP#^̚{j!K6o}5;u|~gΜWs'}Ԛ]g ߫r0}hqe۹Es &8}3[сSԓOzsON?o}[y6C8+]8̼Z  ׇ{+X:§P4i҄׉D"uX #P;L?zR;rX RCp*A[t-UNcOΣ\ݹnYuTr: Zq,9qu;}x\J[4{Tx[xBR|>4ύ6 2tԻB[THy)a/t`+8V!vTIpfϞ?TU( ;c]u[Z[vMo153;}pi& ;vIֻcN4bu3f4^Iyۚ%7پR뜕o}l>),t?9p fM+Fi:7c94gVb[8fuΖe-M4iD"pNT8g N[K`m]S8?vO RȢlr*CZlحL11Rce{*=w2UCz(?-<~s=̢`5{$.')xNe'=;͵c+Qa5^s8(e+bxիR-Dpfx o,vOazU!5 Z8pks(Zu ax9*Cx]k.;sS𺯿v-FMxc/S*禛\*8W\,\"^Tmk^ldJ=}9>6nt_=o}{n8j=iӽ{\Lk\rIˋ/dwI&Mx:H$nuU S\y/N4c0ݨJ-(CD.9bG<^~*1AP̠i?c NƋhф]F7ѴSԤS?v"mVNHxQ^MZe[hb} ֋.@o31WB6Oix]]vu3f8Ç'k74ӧ:O>칧Îumk^켍:6JvmY=fϿ疑g-zO6Ω%qSx{|HPx:uҤI^'N$ 뺼¦!ZkSep.L U7?H-²9p)c A> ^GK O{SE?'Rxq6^B+*1YTs4$( \Odl6} %@{$z0~m1F,l'34l꽮pߏ_(ݦ_VmU!L *%y~] Mxͨ_Y|U+x_ȿMʶumk^zަJ6T$ɚZZdln6{=]榰s硇K/mf}|ƙ4Egu'̜w{e+=hu$'o^&mB D]M5.^`< +WۆрzmP=UYBwE, CCեd n2C֝dSΧhM?(ҟBWR5Cjfy"}v> ѳ;hFwӬМ:L)^V?W9<^kUdW*$U!\ ZId;S< V H]cW^Gunܰ>۲-T׿:}4rxb3)-ͽ9._pVbuMK&7پoIKj_W%u4)OVWjK_֓l~)yYgBos_a/-ۨ>l2]t&_~iD"VNtT 8-pj3)jWb3l-f4-#׹h.+)p/)>2)tY ٿd#=Y49MC'X58BLM^q%oj| VԘXvʶc-Ub 0teihP.ɤF}&ˋD"uɁ4 &N$uMOuȫl P&+/! \y! 霶Ak!dM(x1O ڹU!z?3oYHƕ7fᷩ@,̑e|+[*\sͿj>;h掋2tٓzש|w3VMٕr\1muX:u"HYxݎ/>?pW:iDv+,PVVu2^Pr4|W@4p6v:nM$ay'UN%D3MGSz7!523#)! yd"{(E d]:;~1BlV8S/ktP7dy){_a{P=6jy"Uuz|~e^'D=&&N:GB-+] ͘Hd] f ^,nlj[LkoEaB2^ _DY:;r_OF]L[x-:QTݓ"d%d(r,E&=tp[l]Bu%г/NUM;K` 㒲f)s)Tt>I>:? ћlkpl]:H$:xi_i :J*NmKx RA̗ŅMf2)?G]4LEs_e 23)pTyByY Ty"7) ݦI?Rx7DឮΓJsKm~VE@Sakge72ɯAHӕWϘh) Bh=!iej_0 {Gk6=v&);Eu贼n/o_2:eʢG]'@$ K4u[-Óُ{7u҄׉D.^צ. yv/݊˦~@2rz[~2vI]F(n >z_Dt%э;|P|2#c%dK{͍ ls2;>7=ȼܸ_9Xa(8 &#IpMB=Y%!pOrN&{3U~pTr2LzvnLYΧUM{ukuY|zhl?>52dK/5FV}ڪW_m_uuuFj{l֎pO?ش5\OMF387;NDoU9es㜸vXbeJЦ{St >M\f䭮7~m޴i{m :] )$Ѳ-QT:Sl1MjŪ4׀4E݂eQ?g5@[Y ~B>D7f뚳H_ve.G3d#(CZ~ |ʔ)UV~guV޽cO]tEo5upqI'6Kg_vXunߖ}_UN?t_rG^xU+͏֭er!5K6~⓭g6]?fᣏ=s寜p ݻw:fo :[Hl U)n/luX.S oZB g~{B;y41JSsz<(OGٔoDk9}!.R*> 4N.^n+MKKU4*sCMa. .$Ǚ,gۋ~GR #pu,fDmq{p\†om؅:KC-$*+T]UcnO|-_ȵ) 6wm +**.nփ>sϩ맞zVױao7׏;vy]S?_nٵ[n1bDii痔lٲ믿nUoǎ7p{wzV^2i  >#S nwqs 'w-囯S$U_/~?.v1~#>996mXXhB~6wΜ' iTޟ^JȾDu{ZdfCitZܗ?R ͅ8H7!5DDuZ90ԍpj:0kpxԱXrי1MF3GFc]N>?c=~T-Zn_~- ꫯ޽{j=:5##C]׿^bESZ^lnׯW[lg׮]Ǐu;***ռ`)tplj͚7mۦ;Crg\ZPS$矿b_~)z}|S;E}DZ誕z*.2zZV\m3v& ^'Mx:hЁ-ہ( dr1hC+9)ؿ`D<#q=֘BGcSP EE0|)P)DSDsiݑTz:C2$Ic~LhA/~Wȥp@i[4-FDȬn#{I0Sf ~ qea7]'3&s}X1tV𺔼k׬-j7^׻wﯾݚ^\wuzO7ި׼.y'b/%K 436lz~ouG;NV8Ľ_tI͎ZRRrYgžxV\YWWn/ɋ5`ZN}>޲9a\]uG,_cY_[ټic"{Aߎu;%ܯi~-7{7u҄׉D]ZeP !.! by{9&b]k7iqw-B,bR4L+Vщ~ ҩV_ q4/<FSOMyC(lQޕ;T}CɺҲ)|E'ׇNpmW=OOmCƼG# F}08.N,\K1T2:Hw0):^N<',V5ѣG{oMx]FF4믯*u}]w%ܹ.yݹ瞻aÆgg⋖e$6 v ǩ:N7Z[oe˖zܟ^6V^8^Ym WnM Rz;F1dO>. vb^zG}ښdvlK_}sܸG;Ų,mz3ugބI^'7 xEƋ+G'b2 &0" Du" d]cDWDW9W94"7 * "+!On*k929&O=;+Z.Mvܚfs%SXQy_ym >m6!ϑYyӤ?|pv)aiY~E#k# ?E~78ndT4nt{qenrG\%*ZapV d|N\& 19<.,?^zz5 w|ڵ0^׿UV׍3f|_V\ٷoߒ{>rVZM>ȑ#-8,~eu&Lʢ4:ujt`m۶>R&#lݻw-,!:YA9*,8la+gPr{MΩmשSU$ouhU׽;t`|(WhY*'T^ռ F~$!*3 :3fPG! q|"G&%-j=50#6PZvdk6YqY~$KJw #q( X%U, 69[Sy/F2^=?s|* 6y ë"3ퟷ'\ܤIJJJ۶m+2ŋ#kp1Cݳ{1L-\_~999 ,ӕNI&ݺu[hQ6ی?^g4M:5==I_بQ͛{7mʟf?W֭MHTK}hÇ)h2W׻q'ļnOnF3Yx]fͨ'<묳v-|_}I:u\y˖~b4 9q/,L4?=rrU>$ouhU9|:AuWhJuJ~5m qYcaT1{ތs( RJe 8k}n$kSz=CZ^{a$jG<-BjIW3qo`&K:w,!im!3{|"`鲽ԇfi+j!s ۘPSLuejܷou%~ߨHLa~zU?D'Tx][W^yUEuՠ%F AI"-h*+yS$ NFV]$WYP A3npq.Vt/YCԯ%Kq]|Ӑz}&'Ӧ;s3nu\ًwh# KV r2V"O19t>B3l3V14ΊRWzNi^ ^,ǛxWW%iTRR#$~DN yHm?:D{iohv4:4BP譩ѲՕשA Fđz <%^(vpj,X{ɦ1 \/ ;~GHi^F3n*`$z&(0Eu2v!fp |&E8 TŶ|ͲfkY!#O I Lgqum x JhjBZ- F+"yFq ydD2/{u-]9%~ZGx8|Fr (0Ǝ7MqIJb)Ƌlw>gV58A<ϭԇ^򈤆uuAUJECC<,A$8Z6qj&4 jU FBy(?25DRn YeLՔ嫈 -B<yyDsj 8Ze~ \iHq2`fon#MkV©8vƧyd^ ?#xxAPuv&Oס! ,|"G7Iew$ )}_б~p{xTH=rO1Ö&6beָenpikKI05r'cm!]\`vIO:=b.RG@23>O+W> uuAvܑ< ^xXlRՎ=PIT+*^pVDŽ4siD\J+<Qk!?]f%djJd|rRg*JK{+c1ND抜uX` J)r uuAUzsZR5:4BVn bѲUי%Su`[lbBY] T^nas3ϖ22lu#<勣h&yv&/# yϑ uo2nVb+Cm`[ gn5<MayNE {QF֬Y3y֭[{饗6lk h7g~ : $m APGuUp *y](; *'/;! o9!d ["&n!K"e5z 2+$`eւ@L=f5rI:Jw x-j:b B?"9olM j8+r &a0k׮֯=7[oм.==7t}@{e( ^xXbC-[Fuv;('D&"[0s]Ԍdg-Rll~aE3:tj eeeU  EbhټJC >55@23.4V/\gی3M@x]2[nLe9?.# D%"۷o_Ϟ=/쒒jlrsl֬٨Q? PI?]5TƂ >b-[U[ y.EdZ r~~lC-ZݣG5B׷UV[4h ll /u^^xX(&@#N\ʪ^#- sזM$YYY 0.I܏ُ-C3L@Ԁ~0va:ٳlÆ }u+|W+׭{˗ /L .U/8`f'e2mspjAxxס!Jr@9W/.y/ZXXe҄-ie; 0^CM*.*暅rK̟ĮJ\NF^ױk|ym:u,^ffzjIhۿq#__>+l.GciiC÷m  POqN5|k1z"ɊFB̺1R\3JyfaeVrG_b'|㎍֯[+׽}u_{cUKʕ^s3RS޹3dGcɗٵ  :CC<,Tv )WMJQH-!}\q KѲ(Zzm9 }ZLlU4h7Nw5eU5^Wu[<*!@/7=}G:7|催YZzϼ^^W :CC<,dCܶ5^+IV#~GĿL'dV.ACl5u1lv=x3Omkiݺu޽wlVxծ?~?;[sk귿}҆۾/WG4S^7sƒ̚5K:1??ȑ#ӦMkݺ5_q5jxAuuxxa<ѿv*dӬ'n$>c= ? a@nD2pUeԁj3 旦UaJ*if [n]q}ȑWNS^׮]"o߾ 6GmԨ_~nݪAx&CC<,T1hݾA*4`o1&+^`_yEԭgwj`@P5u!9emlV;?}# $Nduj[׸qcS^wE5TD?8W^'N BC<,Trnc8-I+=-B\sߩv8{Q59"<#\#nv.#6+HhYRf˕q؟Lnuw6m޽w:t(uׁAuuh*WkՁٛ;~YdwNjv \vSU13^XoN?3^Bfh5+^Wkĉ.n/7 &dee竮9^rʾ}ݻ' CO`ejwB݌eho zO'C C)\D*?^ˢ$ Mh A.B ]LB0quNkLU-^g?m>xgtq!{rO:5==Ʀ: /''guׁAuhuuPIVM6kU#2[*BVw+^7z{m1te'x}a(^WV35Zz'8̈́|+N#x..C|:yB jUu] /ׁAxxTe*g%Eo7p9MmN6w/#L6- FxBuqyʼ7Z^l4Cv+f6( -^ΏB2uAuu^^U% ;g8 E{j_**Z(:sqdLaׅo˖.MMM5M۾VZnz -1Z$ ݢ:Ә ^^9#s9Ecs4‚I+W"%_cƼyP嵮B S-/B1Cvq 0Ņ "6X۸xuu9qf͚_\wtVZuׁס%DbYz0(䷹lj`м`ħgedǥ䫬K%KXyc4 n@vmb1Kp^7ݣ2uׁס!񰈇<4t#ȀS;Z˱@ĩ:NӼdp_&\n r<!0,w1 8F݀^q7Dz ^Wv^7e.;+۷op<< CC<,a ^UsaNy#| 1p[PA,v,zm1~dlTU$d(Cv:6Lwx]yݤ7(uBϞ5m۶ a!C}X4444:(`/D֪04%45+_nCX^3^Yh򜀁($=`[U@4DBuѲȢeE(n!YƊ&Kn x]x]ZDB»<AuuhhhhuPAĜȵ>D~9Cz2ls(-j B22O$+]yryET |7! yG{ ٭bKAd+bũDT ׁסAU9 ~Rً (`vMc )cc4ϣf:+68Y^cF;/^]4ux]5-0D&o\zmd?5 Jd^g޸׻zu9Ā^UYXJe+؛F  Fh_f=Hp4tCD*gfwmn="V(-2f(Dkvz^0h(.XH;bd[L mdmR؁ׁA%>+78]=D "3f3XpR-RXxT¯6qrf~7 'V>] >#Ag>[o˄TxM%Y gsK_qc`,\iRS7Y!(r_!ׄD)p%F4/K@,$ocEvoF6兘k::jB0]?}P7%C}+SO]q!]M:N:k׾y ["p³όiܸ1vWnݲm۶zhAJPv)_dl*$js64Tmu¾N8G7Kr u; GNG犯"[Cu^@HBn&VBng$"$'Nnvk? ϛoe{w⋞{2nwթSۻxIþ{];wl8k_[T)4=(xTYr6,A qfxEa ޹tYY gpnD51f!pӯFBD%RG1YY0" GCx''!cأoD ٭E ;::$ׅlyy)M6oaÆr 3vվ}N:];w!,ۭ!+4h}tachhhhuP$ɛ Wr7JKƷr^7ifM5qkѷ6=,e{,iSjJF;(!KZh]tts5O{ "j:r! Vv%\x*5x]x]iuSR222֬Y-/ZݣG5*54(½=ЭZ~/'ONKKkٲeFuy^ǎkժՁNLf~]oU4U.gۼ믻.%%3(a=؛ڵk߷.S,W )`e{ruFC<*3^fBueTuSR"|S… o&MjjŦ$?Gմiwynk֬ƍɕU!]5jt--Y$''sΕ+A]}Ս7p Q#ҙv<jѢ}R}YreZ#Gןݻ@ujժy7|wK~x_zu7~tδ=kswz+M^UƲ04OT ]bW (#v5 ƉLt` y D 'CIK4f[s38+?ȐRB>gnR؁Ń-[4555^G92m4gƏ'ΰδx`ŊN fΜ]XXxAzYf^{-=ܾ}N<yܮ_.B^x߾fv١C^k :@{ u]vceo222ԩӬٕ/%]~5kTB]ua .8q=A )!CHeUsDc=pCYUExy\y^)gbY >_@7QuΈtLAgY3d:!NL3 /0ueuI߳burѣ5u'Bƍ9U?k׮/۷VZ۷B[#u1Ǵ?o޼s|'FjX]?_L]Sۺesz ʕSUfnQl"^nR] +-e^BS;KNRDY!QXL;@uu:?5^7ݣ#^~u *?}Ro/"ҏ|W_}5xm^q}qbi쳾};v,իWGzGw7hhhh 5^U JvVVTQ/!4]HYaOOc (A^:lJ _0qyXM S5㈡LFl⡵ٱ0!(6ڍ$?n+ BB`HLt^מN IHo $~=F Mf-BfBs Y4..&jRvvU0x]l.Wj8<% ^UYil-DyCe9VG;L)du~܆9_ 6t !^WxݵSẍ́tu(n(!Sxݿy=/2n!Xة)Bbe CCCی^8^!/8a1$%WC6y/Ժ-vxrɕy'x1\!Y0nP`VT(#!7lB+nu2' y1!_I!!XHl3>(,v2H/ 3=wxxAxxxxij @7[KFBWaEgJQ R (Lc 9ĂRORLE."#_&[Yx06Ž^.,$Bz;XHYf#\v#f'*^W~}mݔ5kV]^AxxxxT$Kҟ2?nQ^u۲ .`A1&bsXً>Jp#Nyoe 5x|,uP ,$+ط*Ub,vP,/<7V{18[+f*O 64---x   1hp ",TaVd+PKc[ ! Y%v>bq aY+Nd( ^πG=ulnB BnVkfkBbe,fMAvw3C cO0~L%Tμ]uSR"\wy,dԬYM7ݴcv:/fyyk/XIaOxxTNr3Qli2֦1H),s~Q57 @7e2w3g\s$xPV x1hb xEl'd !^p1ui6~a#[1Cu.Y%VV`'3da k1PeKFUq^G<<^?峲ކ Jﮑ#G5#Fkz:::=7Lg ks2p' я7\Cl-%T.6O%-# aoAMar8x~%k%ぽnsAY !m4.#<]6eןüvp7APz8qB.Ax]ugy&xZGJtVrMZZ]C׃ׁׁA%6&)lkQBe,! , O.׏q"mmDf֓YbYh-s>(› >t2>6 Ym &6FzĒw2pw'҇u#x .!xEta8:u4o|.]vkn6o܆ ֫Wx pdks=F~~ܲ{/ٳYgi}?`렲)8R>+NuN~ i1q?婓qU_c%rE9r2\[LzguaQٵg0dw3#rY nc(lMGLTQn]:w.**p=xAu (yt;zNԩS~?6l2c[۷o ?br#2p%a/_K fC_}uĉc=.\9mI YrBSOj<7 uZ9eis(#tCKrXBxĨ]Wen,2xݤ7(r"\^Ax]ԛQi~EۥK?yᇚ7o7PwpBOȲ.Zn;wԑ.wX۳#?|kν{ZSL5xxTvy*YCL4@0(jjDU He^q›Gq*>s+e8+`YZf.A'g@K仃 # sٵe.uf?;7`uj2o  i<3~եK?ȈJ~H6_Kv@Yge:uy%%c~u}!kTׁAcDk(5TgX؇>)!s-0+Q.[8 d[f]qX=Amvv=D92N5>Bu5hw-sеctЖ<x^[û<Au~ӯmKV-xʢW?33.\~,**Tן}t ^^E(E`r %qer:kb#"v!͔q3C9}m YSk_VpV;\Q4 Sne[\tquZkAU Wd"  &ȿRDu]r%t9o>;ai7Eg::(f?Cq8Ql%d#!+ Gy|!4ja3#ctG   \NQSMіΘX `$/o&cBy"[]źگxܬPl&F[d0G_`z`[rGO90X U\Ϙ(8":BAׁסׁA&RSݤq.Ր2Nf.DL d'.:@<3&W7PT(D!VBB_c#d4@ ȅ  CCC/#95tu`y `*Y@!Z2XuRB\J:iYkQB>=ᵲ~Q-f=9φ:.03Y x]iuSR222֬Y-ןst Gƍï]{w[K*XkʢW^/@ovB[yj*Quz} S\Щ9E9wp'T^߭"d4 WWL.b~–;/zv83^^ݢ248BJE:3aeit& ^AP/nذiii! w7.;ufwީ]?oަk^X_w]-=򜪏CCC+S5Arml2O(2N5CSEe IOb+n& $dšc%fhQX@)740!Kypk )5ɤ|*'3`B/hnJWn=,E_L?r PQ~mzn̙A=޳n/zJJoΜ(,X*Lt+l_+rܣG/5km?~X.5j"Ha87?=:mkm-zy{H^/_UJw/Pz+mxڃ׫k>}ޡ^vmFu?RסׁA\+/$ 5ek+2V<s6>]0^^APeKk^ꋿC|Оmۦ_u q^^#{{ &MoQ߱C/)n}߶ÇGuX7f[Q.^}Q}„GҥSvn>8}߮G;EE^ox^g5~٥dLj}ƌ8;Ǣ}o_)Z̳vh>XB׮a~CCC"m.jnežLgᮩfc)0kJ#( y]!rX۽r6`氀xRٷߊ:t_zngztWR' xm={N8A]Ïؼyonu#G/dk\_~eP ؼ8p]~s={+4ȑR+Qa~[޼.^UpN:ԍ,Pdt>N}Ӧ(%oC=qBRtD2Cu-[>}п:Ϧ+y{ٿuuhuhhuuPTRJ.g(01fZpV.\?b -l/n?sY:YȒ9D1<~c6ch4u݆E>r Qjs8p!Ic[1C@ AT޼q=zܷwO#N:'+}5]i SzNkb䯓[޼.^m>cFFLgqqkK_w۱c)| V㷿n_|Q҅njfhC,nذuwV8~yyAy݅~Q?V-o^>+_x!4]y854sڱc reJWj {c --z2hWmVyǎbjm`3:bu}c_Q}'J72Rx5Od7 Y}ek8xÄ|@ȓ\e\fuadY-C('Mb’Ȉ"^APZjA};+^G[4j=;ݻw Bf}_}Uot`]eukii~~Lw^g, =w_)҂!ab4{Z)qMon~ͥB~;cGx()/yVhQ̳l!r^gs_Y]g:ȉ Q=EMU9,S{upx,nV7'ynx+kTa[T/ ]lSWqi.a/N.;"kFQ:u-D7]F0xxAuu*7NCEFO-::l%a.UR#VDLn5 F2&k[6ډr)gl;yZ *GDXy 3`eMgslc2tZ!$!1S\%9Ddn:[ *NÐC*%~,Rb}(-vxAu<Ҍm&a0uuׁUCq #dm4 BJ: \ak+nf`L9[:iy Yf}JQ [xN3LC'MJؖSXqY\"W.܂u% S_vw]Æ ǎ[5gk) Cw߭Hvږ-[R 'G!7o|W̙c_Bꌕvݽ{wH`5?s߾} AUEeN9ɲ8"9m!$3 .b!2ߠ#xlx&9,s܉7ftq!{O_(0+ ^AxxAP5u;vhР3>eK/qlUqā_9OMcj&z+LƌSN=ςg3s9'ca駟NګW ^%4ܛ.,˘U`#y*%]*k1ѣ''BY3$]^:x@m1Fn(gU~6<dLAuAzѣGˏWNKKf.ԬZu:͌ >pX7o.MBe'^3l=~Yg^^U$3Teه|lDlg.+oU\ú]?M3 W}K\xap.#?fRA^A|/o}u)%%ܿ|?~9LK,iР6v+WjՊvKON-MH' bx}>z_رcow-_~nѢſ/znpW;~7ի':t/nxy:WGWO8A饗T̞=uVCW.^{Uw)D 0a݀ItFʕ+_} >_U/blw=ǏO8niz,_|PRzPC֘|_~yȐ!h5-9tP*c31}Hp<,݀ޢ6=bxjG*D K ϙuG:-Lt*{J`~1綺\p(: ~W5o 3/... `"'t)B~hKO ȴueggbU ;3:d:; ˹+_tRE^![6hЀٹsgΝ;tM>ȇ8aO.9rNi ~ˍ5SΉ阭ԥK%K+PozKn _8 .{6nXƁy[?udW'N]Sjs$2|ˤIڶmkUjZmFlfcɿj֬y{]Ky*XXcL.1W@T0u$R[J'9 pA?Y(9۸ZeN"n ymEꦤΛ77^0XWdgeAϝ;7ବ,u-]_~o޼~Fg.޽TlÇO8QzT_5ayթq/١Cvr萸LȜT;vM?n߾.[:j?ƮBJE: =ބiW-MGӞ{% mtwӛ!֦=GxEԀׁ%\|eY|s~Fa܂ Gc]Vax=pM XA V.Aیn;wQ7%8l0 7gω'ȏ[lKl_^nݺƶv O`Lחs CuTߩS233#xU?z(}PpUWX#yU0^wu2命R-*}g}3:jժ/XR~LVt9^;pD6ڴ7X O xx]f6E-Sp6k33F q8<3)R3p4k:3׍WvtDmkxޤW~Cʛ׽2nGu͝wfry]^x2.H5я1 bxBϞ=-Gu$޽{۟1Uظqcu}z333[lp8z1_<ۋnx]y: }˦wk&ٳ}uֽ/^7{l~9;~~k׮|뭷*-_+Ymt$tMmZ/I:j4S: eƌ2\tFѫ)B\]ve7oܱE7yNZh_ԩS|գwt]xR!iڕAe~ΝrVViy~wޝܬftwӛ!֦=۟clO xx]e~T&WRI4ǹc2!X +$yAaMSÍ| Y!5 FܭM Y::*MPQVjizK#H7&BprZ5 -[1Auvmoº]6_rʾ}ݻ' &L7_7f̘ɓ'_]_O7={;//|y]=/vq<xx]u[hѡCx^:ԇ|V0(`\~a`j!K%d.u:f27 @K)ZdSNC"BeѷEm(Zc=;m.[ 84ت[uja5#;Zpa~rrr,Xt::0Qa VGňqeVqi2m[q=9n ]͢jI <0|vPPrb6f,kbHWAs0{91O҉K3uBe(-Lvʏ+ګ$|WTTj0X)PB<$::`XE$rru::@E _o#ŷ2_;qwRsG(Z㲉I+l+Yh_E2MV2,f#g3h:uxӾ e'Sl\{ Tʗ+?ʫO2OwF2:::|(̬( Jp#FY S_gUYX$F_'%9p,Lt!P6JH6ׁruu:*"RbS-KqK9QyVQc>8 lE'FX50'53,`9 899Fy9 ׁ^eR_||BpdMUd8col@jjLКU 3g1u 8nFܙES(f0!|]1aä{i)w77^$Q _::||]CQ˩)#)Iil\DQ}I\x@G๊FݗsPbS}J eZ0ǽq;.YKV~Ĭfo5)KH,b̡018J..5W^y9((u@ª7L԰ȦEeb!f3NהKdXNZŞĈ8E&'g ar1DgTFfN&3Tc +3#uuT%,H=浂ikqdpsEǥ\S)BjѓRӰOiv*{nwgb.>բk&w5?gVNaD(Y_sǎ@mÆ kժ?iذaRuuu:Pa WũJ;emvK`}M '3Zibĉ[='Mw=8ģH39Uq8n8U 3Xsm83&( 6lܳf@g Zh}wȐ!uu?pJJԓד7l mڴ1r@$|}}׮]kX:|($Gh%rZ:uhaQsVfr+']I=l1Am |cLAEHSM7Aֈ.=^z\[.51-l/M 3/LqˉQyNf"Dt@ ys۵k:|]7xcܹRO&Lо}I&I%d﫯Z\N^v=*;:|>*S]vބ@;*ƧZp:K 1oiTxҍ:kq2ҙi{i#7^b]tRhAdt٨<"Qo+:@KeffhUx{w:|]{>ROZjߺukݹsg:A*ә*k3L/E3&}M,j.?q0iUui| NX.E7ard-Sz9 b,~[%/|d]FVޤu [ju5j6C=t)Aʛ5kv-Gj(ѣW=ז,YrEɹn81hРM6 O&|͚5B?ϗ.]"W^mذi/ѣGaa:A:|(HErGBݽDVA_f2zQYA}-8 !=,Wi:}v)65PDqimYgPISzfz_Uݺu+00 L%-[~C=t ȟիWW*8=t֭[ݍ+:: s\joLq4JMY8R:!'l"+e5RUcl8~5~F*塀@u<:lذ}J%уfSQ4lPrJ T}]~~ɱF|o__WAE8r65Oo}gvE!9"C,jqB^ )0ySL{ZΈ.0JqlB͊!vj'U&2b 6?SdժU?JF)_GU}bnڵs__W#t"Ω06w٘6b =V)AEMax1Mϸ+L{k:%Vu::cV_MH>__ݸq{=qĝ˗ӥgՋ7''Gm$|}}%Y_Vcpx¼Q3#hShk&FeqIigStբIL|15ϱ5]rRS_ &qM?Z)<:<@E2̦qklڅH&%k@3qSD/gdplsl;Ŭ I3UМI1iQU::pXE$h7(ܓ>pb*mT|KgJZ1!j1r8T oR?mRlu)֑L8..W3IKsuquu#߿ݵc5k$5jP7kƟ;m5ȿl|HnUvJ}We]ekO=?4Ó"soux)qbH[ =daPEH`m$1~&ot]b$ f#5qzR4aD:A(q;g_(Ԕ^y堠 ef[1Xu+ߺ5oV32ggO Ut {w['YEחc딁gtHݙJJ 1Ϥ=VP| %9)q_3SeR6IʮGzq9fU=£gLYI˅̹&Ţ|M昀#̌t??Qo=|p~Ncy߾ƍ,.ڕs[wgA|Db!|ǎ6mY>4׿ :%ON=z'W~WwNʕԮ߸w_Q!kwJɸu6ժY/(c&M\Zoz+!|uun07+ϨO*sIpԕ}랥NC_ޗvchADcbgb.zO԰-9W&gܡbW+?*q<(9.=I4&Cg*]@!};:ii|*.K3OLt oK>͟?練dɝ6m;\bMa^sgVTo…wћozh]P&tZCy(}:d\CZX?޽]z_xKu}"u::P,ة)M KW;q80`M1Va#%{&FdQG+ߨXs*ʔwhjué0fYJSxvɦ\I*ƉIeOj=ա3-ZPz[F^Æ kժ7<<:ӧ|LYv\W@>{z!פZv/u33ulYaA}5?OIq]:*W%8\1dXN -J;28W6[x_l2sHlC iK<:<]abdPsq&+֏;I9E&sP3ӽv ͤlHإZBԙYk&@YO]n<1sfFIphQu&ś:̛;6p [RnF>rЩioiX* \nʨ9u5T i)y+>GyymKK+_׫[)/IIС.XxV*U\nLCWŽѣ!+:حߴ)_ۅ.m͛ߩܢ|M&WX,]#?+ivFRTS{'7{WeWƺ2|rf bvFuE#*4ds[O^us𯾊 PU|P ;ULN1!:n]J}O*I_bL5ɹ+ňk0 a41dI3LĝS-U`tm8ש>1)FTu2u_,^u$7߿/#ޚֳgO-_3?S-߸v|V=ە!1QOv"Jd׀򣴸~oJx7Yׯ(,䳳]kV*}7v:]8~Qvp&<y>?\KnCfd凝9@Uu^86ޚ5SO^kjvf ||xU`vQspDͤIW:&.r/=@Nu_SY-f!m‚x<=U,*$qk A)gSEҠt#AT\x"aZJ_(M_Wuuu:P!ilE_ j]EVgxB.rv<3A g!&Iy곍ڹYB ql3C椫K4XM || ,,VR vf:|)ݗYme9xZ &g'eY:]3\vի'翁兯 &1ͦ&إإgn 1ZV3)sZ~XctZi ||yef)do;|>G^?ϚZWӄm:f̘QFmذ-oҤIVVVdddӦM ౼d N兯 +ŵI4])̪R+ւ̳fМLIL`==C)ecz": ͽ1 )A+GWpIV|]q;v*˿\_~ׯ2rMaŊQQQ/^3fʕ+Y/7q]v:|g Zh<00p{·z왙)l䄄JSUm%Ku/<兯&E+ľ21v.r ̜.J?)!=E,+Ӥ\NDW?43 ʻ8n'fbJgԑ KiJVuuε ,_"6,4H~bu͛7g[il|>bywO0v2¤\X((>*ý\m'>;c Uw;:@I//vɺt宵qkBBBT*!_p[n+N|/aׁ ngcV cդp5e}8A):ridp۠=VjUUiqjW^20˅o6zPGپz{K-[,L *矢 @*2;Xh1}[eQ)8UKLҨqgStvF9ܲltjMg-bfǍgf>{_W\&zY___7NUs4KVbz."Nb[A>N\wNEdW#h(]x&qVJBt!||gkX&anM#?4s(Ę="9c(8'}3v{LPf<VK$}MHZU>||x=ŃQMEpSyv]#g֎ٳʎ_A ,ERZ_ǩY83-M7lBuu<]7lȱ;Aח#wsʀ={LX%v1Sj͡gqOJk;`*RzV3=]]Oe5U_uu::P LBq1渄t3{BUK j:!oC?0؜hHNw# _}:PP*OvdjU}qKňgVePu1cƌ5jÆ 2iٴi?CgΜђoRa޽-Zu4Νz #?1B6[m֪ YԦkqL8EMzmi"duTfq:{bh5!t Vx D};116P 2y\bETTTFFŋnjrJ֛M8q׮]2,/"""Ξ=:pҥ?wDy,22#wuudgj%VзyVzl=2u͛7g[M?X_zC;fYe}~걄=uZO>{ƍǏ[,O>ִalu]tYw[_˗۴i>>999+++//Od7v \NOK/4c }*ӿ 2 1\_KԞ+T"Bgʰ(B҇LPS^E s-6i8oivu.\Y?:|]}d]F|ܸd$ƏW&n…ɷnݺ{_wҥ9s#8bĈ'O:t(,,T JnڥKrRպzjY:TLJ#k֬qŋ֭+/_zuڵ矿~N6}jõNdߠ+K!uu|8EUUH\ΈE-׊8w+( +9;u}EWfЋSts(jce1x)+߄W/"-9݋q*{q7oz8|V]pAǘiiid? :6ߥ 킯fq}6a©N ֙5ؕ̊5i%TI(?Ld [8VU9ŤXvٽ^p'jm=zTz+3]lt4 yA=՜jaAA JQsZ%4wpn&EQvR3.'t:!k jg  JBv 3] xB uP},Ć :u$S 4ϗusSN?rA_feetq￿Ny։u3*Kp__Jx36j ѪpܚPSo{\@.梵JhfK4aY$u_Oɓ'ׯ{{lrʕ215jԨ7o:ݻ {/^8~x}&䉸vڔ)S8Urss͛7y":'6xuׁEX-Qc=7vje6n.NU2N -SfvK׻V۳f#&f0G@yIᄺ::wu?RLegg :t8|Pjժ6m4h`nMQn]8[s֬Yk~ꩧ.]T_<\D}H-!uuׁLEVT::tᖥ9#]fxMgB{q9( C@VJ!.RN'"\ _uֻ^%t|jp|uu4 ӀLײs.e;1<~Vwhso0~\y%CgxUt_ke_||(eg$6饂+FcmٕG'd Gͧ14||]zH~~!!!9vox@@@Lm۟gg|]%uLX:@xE[ olӢ^+vg` )hmL#`PJ..5W^y9((H*Z{O_RSJ ]bEY=T(;镼̹{_z.uuu//|"x\wNpn5\6d Nu*Yb0uK,  Ъ0xʛ}YUفfΔ~վʏ*8u0lf rqf,)w pNqޫV˙i*bbSK^/ZeG*oԶmdW|~_{_eB/.8@L u_M+;u{s8u!::`]#.>k}f 9:.NLQaӰ|LP-('Fj {Oʃ#ݶ()ٽW337NؕgBa#"j~mH>뀷CcVvάzG69nnI-.NY%Sg5L),T_W~ubW3 'i1..E\DN.]L !Dg 3HM=Nk |_:::|D aML '-@g3:efXf2]q䖝+#Wߏ7@YŅ@hb::IrѠ]3yd|Çk֬٤Iٳg*b}]X@eE37d8m;s~ wyTXg9d]k__ם>}: 66ƍǏX,| ||uub])W2Kiq^zm/loڴwZn֭cƌ5jԆ XyhѢSN[la?v}ƍu:?m۶=z677766V~w HF KP6|6*d:%V4DJ|voa 8C'cyouRugۻ^|__* v:թCv Nzu֕]nMƍVu]t9sח{__||Zffb%:LỎJV\٣GcG]padddrr25v}z ___||^%@%u:uDGHM ِZlYpp016((H6ou_uu:(;Nzu(s_wT'sDDD|ׁ/l:uG&[Nv^_נ~}lڵ#""&I#~~!!!fs<u}|d$V[CYY3g\ظ>M{Z?ǏÇ{h@u:*>|0iڛo7wm@iq.ȿDT˅/#G\]S^|@V +ԭ+yA͚wqYu[hkG~|:oR?tթ/zr{Rqv\W3ݼɇz>YoVkh_kw _uu|::"Nzu֕}tɒ }_u+?jʗjlw[U tKLtM5ͽss1N V%C<~bIbuݺ;y;nގƍm3gÇ":qk.B^uݨgU}V߫x}]r2?f|T_eם>ɜ9Rd]Fj}gTQ-g޵L㏻<F0;\tM߹ӵXN+襗z֐7ZV뗜?oakݶy\Uxլ3&y;?9W\p+k./s]JL##J\ܔ߬#f~(_'>޽::PdG_efԩ="57Gy^CeN߱7V9t+Сo?n_ ;t/w;<.ߕrj^D9RY Tjt%CK vj|.{:<ļ<]<ܕhUZqvƍә5=!Vt%0ߴs\TGVܔOn&Mn']_X|0_{n@uuPu}%< {;%oذT@%uPv_@Or|ˏ?vNʟ/|ׁ $TJm]F\ ^_W?_:A|T2OY_uu:::NA::Jy{(^Yw`Λ/yIϞ%p.eeeBus%Y^uz 17V?:וkтOOlƤ=]|]` rkkf+n}]nw+TM: _WrnlWFD9s'߯ H{%Ͼdr <^7ynoϚ%_θ~|J#??|{bl@gJ)zg_~+חЁ_}]^⋮䰏?J+kiS>(Uب~__u+Y_uu_::::__uu_uu||||J 5*66yyyW^%wϞ~5jhdW{Kԕx`ƍ-hAڵkGDD$LXP٤I# V+5ts)Seи_>?nK, ر{{]u$@{̙?9sfȑu5k7nܨ[z ju׭  3X^E|]aaÓJVqkݺjy˖-\- ?"_uueVEUV oUXTA_' lٺu>k7n(y޽{ ac-ZׯY *өjcy睇~x͚5@ugۻ^tRLټy3fsؚ>||z .'lioH9P9dȐ[n)=Ivv6ر#UY,tr#,,lׯ__paäC7o1ֈk֬{uZ^No({Ak92~=zi&::Z[͛C-C?|ו22 Wn] [uu-:խ[W?h/j\Shhh|||rrrVVV^^;⸴k͇_v˖-GuY.]9sFƕo}v):e?u@zjllb)9_wرW_}x׺Ο?:_uu еkWOԩk׮7o޸qpŋ PzuٳҥKSSSI#Νۿ{׬YsaÆ}G!2n"]=z():t]+:ʫ֔>Yf3%MFF֭[Ǐ_f2-;}*9s""" K޽;::{ꭷޒ<?L@WÄ dZFѻwoMTn޼?f̘M6I|vҥyVu2rС0R(oկo׽R$lfJ,[,88X-[(ê%`X__q:[~zƁ >y۴ivڽ )))!Euv}siWUCSv|]WV~;vx~o[޽lqi-RSSbuJVVVF'#Ȝ9sڵkV a徾mذA7oFGGf|r^oSN,H`0% 2XMJJ"Muu_WuѣN:Ǐ/X`Ȑ!:I/v-Zd_7x`n>Hq# >8l۶ͫW\YZ댐̄U _צMo&??ܹsϏϟ??e|_uue¼y< 7oܾ}1c^vd>*//>СC͚5Q={5KLLʯ]p8f/qO?ѣGeУqvȟd;77k&k#GlҤ i$ `Ĉʌr/R"7B Op?Zj% ȻKJ S(|ݳy^z5o<((護ޒe:+M|||Ką ^xe#:ue+V"-[=zҥiiiO?dmgϞo֭[VUV'<<6tP##l2.]+AJdCE6+,,߿Ndd,8S6hu GaÆ 5j` S=K6m2337no0@]}'/vdbt9ĉ٣;ZleY]YKVe͞=__:P\ 6lyyyŋڵ\kܸqdd̙3>UzRmld#ݐ%;vNee˖2d޽u::||ׁb{߿9stQsrܾ%ׯ_&_~mΜ9so7^^=5kVSΫUE֓VZT&{5h@Z&Mju::||ׁAQQQqqq7oޔ_}T֭[.Ru۷q{[qתUodCGѩ J6|l3V-@?j׮|0IYxE:/*uu_|푚'N-_7zhYR{?駟9l6{ոR+Wׯus[YԞիW}׬Yvڵ2-a|]fFukdwԾ];:||>}z|||ffl֯߱cG`da6mZjsl۵ky@mT{ظqcӧ\שSأ|Aʭ[95k֔ިQuZsxea2-^C#>~|WЯ/bd&B˖-333OpnݺuO]n]:tjjq޲e { /Syܸqle2V^re}ђuѪVW&ugۻ^oaÆ :||Xz5qgddԩSG~xx8[ҮYf-[/V_ם?-s7w:l3fW_}=ѣ$r2&leY2k׮{;t kA^VUp4rr@ond@fΜY&uBڵ=yTxZ:u::2p@' KMMe+ޮ]nݺOZhР,S.//-4hF=zTvL(o^zINHHl.]M:'FJH9[ܹskf>>G}鯿z``K*ԭ[[n3f̸|2[͚5c[۾};[!??>j۶:uz)YXnnn&Mם8q-rĉ6lXFzhԩ}=EXh5kꫲh~Pϙ3GCI˾7JNNye]V6/}G.g*9w[a„ 3 ,h߾իW /@Y:խ[WiZjC%:uꔛ[{C~ֺukA#?,BUG_ݩ=ܓ)Nholdݪ5Yޞ%??se[(C_wT'sDDDhME|뀷+ƻτeݻ+W }ʅȊL&SZZ222Ö<Z 2qnР?`p?sՅjԨqcׯ_oOz 1(%+@5F Yԩ="57::bEW.((xK=zT+#iv۶mƍJjgyfɒ%d9vؗ_~I}}}=@v?~ٳg?Z#>}:k͛7%TGSN/&Sٳ7ި[noN7Ԭ,]M@{٭-b%e%:ejfYji9b%/[JSq!De-0gRD{8vsuC<<~9s.}}}f::::::uu@_uu}}}@_G_u@_G_@nQL۶m[?Sz\;*Ϝ\]_~qtOR4i]+H vC׸f)1ׯ[i]V%Ǜy_q+KFԿ|rG:@r}]T#+WJ}HNNr7գDž%??yUZK<" RjC(ʤi|5Q ':\wwy{q\__iϞ~ 顇>k 75OY}}h}]Yi]ǿduooݺ-2tЂ<}]~ar|"[{uᇥ{~K  J7<.'Cb8y9OUモ"#%I~ /4׵o/8qa):͹Sfvww;{D wi+`+m4S>-?MHEEʤ^gB_$vٲE;hyhq~9>^:tcܹbe ;~=u@_G_m_WQ^?ɓ#"­nk;wN~[UxVRMM}o1uEr-F=]ZbUTjָlss]넏?z<Uu{G7OJNľqׯ{V$OOiϥ叔]NXFv͓yMi:ͨpy }}:::uu@_uu]',ϝ={|ÆYL?E)::us[ǎbڶm 櫾_:otʍߟg_MMbrرŋ^;wVb.::ud,^nmTd:o' U_1k3O=<6ܤ_WWW7lذL]wUZZjgG.###..r}2D]{;zXs"fYj5uԞ={YGussVnٲ%)))11qÆ JKK]\\ dfҤIy&N99Ue۶m1bW}}:;qvvӶk.!!>1U յS```aɒ%:Nyaϥu555'N4iam_||X;l޼yIIIiii &L :@_w.&222.g̸8.::uurر3]Le9@_G_u}}::::@_uu@_cG1m۶m CLu\s-Z4 ݻwܹf.v{+n$IÒTU9@_G_uΡ׭v' $Tt VWW_ u$[IU9@_G_u";d/?~Pe˖ 6hJhA{KJJlo*u044Tڵ>~9φ%hbbbP:MJKv?ſ&'[]tɃ>x߿.555..h48q"))iժUѣwQWW,-Zd0lUvNz̙u-\$W%i\uu}&nGsXov_d2劊 ^o^mݺjfu|߾}?Eu™3g\]]oo^:W}}SQ^?ɓ#"5RSWFFD4vif%'=䓫Wnpӧ >}tMvӦs4$=U9@_G_u"E#uvwb:8yGh^TqƬ3gXumê*9‚9g VWk)))YYYUWWϞ=[ft}?sǎ555|4sZno<$-|@_G_i,m׮]BB|cߴicu’%Kt:SK#GjfggGFF -[^Z3v:7k/I#%W~qu.//_\\\zz:@_ǟVuu}}::::@_uu@_}}Ŵm۶5 Y3q8|xB߾}7je%Ճο;vfp>>>}sz]L9@_G_u׭TGqHY /t>}]]]ݰa2335wuWii'9@_G_ub;dVTX,GD_;w:ujϞ=׬Y裏eggkׯ_?`]͂u555&M}˕E͜9SY_tiEEŹs̷'N$%%Z|mBB9L]UUUSNl{DyP:Mݎ1ʪ 7[ꂫ*00vzAuuuAY۷'|RPP ͷ 2LrEE^7_QUUqsssmmP]]59@_G_uΑTe|ed<@{~ޚ9juVtbuzGy<3=zHHHP_o+7}ikmm#Ǎ5RٳgN::u?;,u  s 8PSV\ٻwo妯oII=<tp@TM7\} 7Y@_uu)1ׯ[3&?YRSʌYJ~| o]NWUYa4ϲkc)"Y?q.::hNI!겓X,:x 44j?\{ڴ޽ł/xͩS%%)b5{1]7K,Q'˿=ʵ4@_G_uוN5~MNV}||&R~C9}׭?{޼s55鯿ϯtγWz{HaKo*q,??p- }@cunGsDEnW[j}g<(hf}-e.z,Νo}}4f_WQ^?ɓ#"­no^WWF~lJ//dΞ}}c9::z}?oƓO#?lu{w+hދV_'s@چu.],6&fP \پN}+$! 5on1.[jދN_G!: }}oD!{1B}h}oD!{1B!BH3e_[!Bu^LuB!lm?l%$O$U=Ksm[|!B1G{~Io~~')]D!!yB׷zXB!ӡ!B'uB!vBB}!7'_|B_=C!uBa;!_|B_G.'۷zM7qoL֘[[ڙ{ݷwH˖W]kwnkujistÇ󞼴 \]]ƏS#6߬X\9SNNNNݺu{yҤR:B!/>#3;u`AX;}7߼uǥm0vطfPo|^z%%%#bm Nޱ㭗Ӏ~yY!!!y_g2DE9XD:wwU11ѯ:eGr{ٱcB!~ }駟zed|aل7r__7ub{Gk69R\Nd2+⢛ힼwۏ?8?*O颎D~kܸn‚|uuH_G!B'uD{g#T[mnMdu릯ԩS>P_ڣGÚ9w֭P,g׵kpw bskt:txeP\2[omժ%t L&c8ힴ:߷fpuu5̳*5Ώ3zO&ɱsJu&׉޽{/VW_hB!){9g1ci?uk{m=N|EKUV|vh۶Ri&}F'mu>LQaoΏʰaC{oVi)%e~\ܰcuuk 2hV}7]vqvv~ꩤeK|VXzi:B!nO4nX\Jԡ,l8%&$;kevmoX# A+? 7n bkԩSÇ1hW_"‚& h+՞QEW׉ 3f+˾{e䐐VZ͛>3OB!!:&={vz .]\'װPݷ?vTr>d\ltY|lȢ ;my 1Ʉ^*+-5iue˖Y\B_7|x¬Y=")S^7x:;?*׉e:%nnԑaÆtEΝB:XܦM=͟vYW~~TTX7m= n6q9}m>(:_HN}~<^o׮]-n{V6yB!QaabK o |/yyP,{>.ov~Ny{eˆ˿KX^–ʜf;Ex{XWh <;rwȨ|wޡ>p}WH>S GxyüB|B"ň.B,x"b0OyDRTXl%w ExB7_L.K|B"=CtbK]rq8O3Xy b{P1gHgHWhgJ,)#BC=BCřxz01" *=q{|p_$ y t~od¼B<C^AlC^~O O^ރ~A  =͔b/7 bž|?M endstream endobj 1490 0 obj << /Type /XObject /Subtype /Image /Width 1680 /Height 844 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 3012 /Filter /FlateDecode >> stream xܽJPX%hzWM78 RV j-XEp

KE @((E J68Ϭ- ~JE@UԦ\[Ky/2?~-[ߓ^ `/e PVPߟtA9ig֖T@~ _$G_jhY=ilm'%L1z&wW' ř< RF 0#k \/B9b endstream endobj 1493 0 obj << /Length 1149 /Filter /FlateDecode >> stream xڭVKo6WP2 ɢ^wC ][tSD[JAQ8r8lel {DfFfymMlV$ d5/goREn+A;ԻFDf굸[кf%Z..n7ǃ#Ua)dI*^ )_C@q'yWYdn o֬9j >bOK6P[*'l )٢꥗ Bv>W%I::eL^ ^Θ=X[M Fٞx]$ d3P_ @p蟚 C>K%_ϴ!R YEQw%v;'j!^Ŭ1$VH,2E%̇D^9PZ۩w8c JbJ$[~bL,\gIR/ =y0ܚ 56; i%( sle]QQRbReԮ*7lBYr8 :$q6 8L/,μqO?O g N(Q8)nOfa8hvkDv젮BPr'[Ȟ2v4Κ>7y\gM5s7[(ﲅYdal;qnAOۇg@MU)6xbs3.5]s6O\2h >UԱNrA:m " T +,zH$L#&c=KJ׊N Is3]s+$ӑ/݋qP> qAaGڼ#i \?W4\,3i?>Ed- ((" 7~JGi_iݽm;~LXN/ z <6fKno2.MvSH,0$ d-.+h5/p K&8fyrLpZ~_ޥ~ImA1y[ӱgGoˆl/\ڦ ( FD endstream endobj 1497 0 obj << /Length 610 /Filter /FlateDecode >> stream xڭUM0+rnhq變jɍr0Sd87H єP$cόg޼y<&`؏'x$34D>M$sVwiAx|If仃84&<-=(0B,%t2e*YU΢5Ljd- =g`8t0؄ -MM$%YQ BYٙ͒nĮ]ceuJ?VwTݓ޽{ﺊs&)tz̓{"%(8T L?<г̀fˎ=XUJwنDXyQUm5yUڡc3TCe2m"|ٿ"x`Ef 2LEvjj3 b{]hsAHgo>TA*56~%'5ejukŕpFdc_jeG*"# y e-1,sKr)+ƪmMIĢV+A$黚U/W> cNj"e8 ~ endstream endobj 1501 0 obj << /Length 765 /Filter /FlateDecode >> stream xڍVI0ϯ`Fmj$4da̡JҨ `G^;~1I}oLϯ|c<3yl,nmbpMni]Mb)#.KVuIUch^aʕirpZd"!paڅD~:{6(Jbb71YUpx"sPm3Bu BEe6 HHJ/%y<9V๧𳤩XZa(Ws(4Lyxrv384;{uGBW/eFV*S,Ӕe# Lx0 re7tɵ\œ/ŝyO2VvȡT {X%$ ETgmV3lj~Tj8B8/=wK7ٯi)* g XE~kέ0-7Ak 98SKMvdhirr崎u.Dwso9o 9F@lCx@A` +J|8Ʊ3"g\h+% /CVQJQgP1 v-! NeeW ,,1(J_1Z-v/.H$蟓iyTOէ?〘 endstream endobj 1508 0 obj << /Length 878 /Filter /FlateDecode >> stream xuUˮ6+TEhEEzt!˴M\IT)"ߞ!9ׁ<9sĢ$IYFiVn,(Ϲq#OLkEΧ-Ϣf< dzbTD%-%f<22fEaj"%\]B jO{kj2Vn81'=̈́JA-5  #ꖼ #tnFj:{+T3FLri=ɒhѪC0"tw9/cMh BQcUܘjvƔ$fh I[g>8)绚Psq 8:I7EZ;gdk?'uҶV־_5ɒ70 4 oV/U #cJ<'U(c}}y0W*}_7? 򔖌M7MgjN㝔Eig:&fjPlO`n{%z]a_W_ Cw&ds3f<';՚F~c #GaSAsV(|WQ٪C`"fi:cDS9klX4MW.*as2WD{ZqNSUAQwd]!i KH!Wn>Ph&|ZAM*(k//Á01jrG0po)V`Rf9{+[զ}T_ k|_~U%Izzu˒cغ<+i2 逋OwY` endstream endobj 1505 0 obj << /Type /XObject /Subtype /Image /Width 1460 /Height 853 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 1511 0 R /Length 252290 /Filter /FlateDecode >> stream x |LWƟbє["$`H!PDciS[ĨbulIKmEJij_cKm{nID*wssp>=I9s*n  ;RHAwRaC=}RA֭O  I  P0r 3N0رr>v%  NY~<ǰW_ )BA$EP09}Fb\$ "Ād6.v9$IR  HmcgD_AAyc`=e활% U>ꓤAA>,?m|[ڜO/AD-9†Nq9(Ru$)BA$EO гAYja:uºG}! "yۧ]x  f`8IR  HQP=.уǮ?)>A_~t$zs eԲ>v ,dkX}g&s>IAR HQP  FXg{a|ҦOV.׽Ӥ9Hn#zc۳o3#l\[BD2lcue+HO%dO"ARAC)^qT9&mV':ςGSzfs3s \wv"Hd2гӮ4$Cp]~d1$)B$EHI<" ,yns}K_`[5u9>Ԟ=7{X_9Ӽy~X?Av(HرLtZ3Ov:RnXI!&iN:~Lڵ#s$ jLڴ=r9 Poyh'A_ A +O(Oeg]e٧]idIf̋N"ARAC)3YF7=_EiQ<ƍlM ~xB"_F`t:KA4 ׆ܲlLd.L]G^SGoJ#27˦,u$$EI )Rd ^y"KZ$ǷQvZ{.imRkKNtv^m> _)5 !A4/Hp<ϔ3=]Ydَ]tE&> V1@ϺʲOȾ Ͳ3YN"ARAC)q+? 2MR ..q`rs^{ke6[0, Hw3•o; QIp$uD.2)1}xQzU}ڕFdh}zXlA!)B$EP((d`X/1II"AR$"H|tQ0 |<ȑ 3v.r8MsoLtZ]en9~"0/cdI;θ&h#>>GcJ3~8*sLv!{kOvz{gDȥGr2г֧ Ffiooc$EI )RDA$9bvkIl% 'r^ygrP7,+_ygߛe[2W8i(Xݸ58kGAܔ?y5vҢ?povŭ?h ^1j}M X֞Q%GY.}r2гQ1ɲc$EI )RDA$}, ]6켫U}ok x\Y^EPH?,o"0r9fRSNQkJoGM\;vq`\z~3w6d/ rf< QRz>38IR H!"y(EA}B A 044bں@?4qYuwk1K2q쓤A!HJEXr d5i3eg]>II HmvA0AzMl'nӟA>>5j3w?~=zX,Sȑ#+6xp$;77̭ r\ĉA>8AA<#!)BAyz#ٟ+W *Tȁ y[}9[5o);fUThмyXX???vܢEEfaNn(TPZ%vF쉏k߾;`s$?S'ZJ:qX'(QOact{-\P>8AA< !)BAyȿ䍔.] 9~ltE;7(HYkxzz*|"Ç5iܘ7jnX_' ;`r͍~ FH! gy۶}vⅩS-EAҳgf3rC9r͙=+' )!qAŊc$I7uԡo_8n|tW/e& !)BR  r0yC6iҤpBuϷoϦχu9N8޼y+Ν3;}_y''ǽBꥋ[^hY~͟nb 6mȎ?Yolk>dySO=rVZ' x! "9y膏,Y8 'gxkl5Cs3f[Ί<3~Nm1%~!# 0.1qa=".4*4,cC"cvk7aŶ=2uf"h ^:݁@ Dc `UZ`3 $-p8N)su$EI[?CGۂh @O !H 3I|d$_sMrkcr7FΞ>fs)g{?᯿_Ư@.;R9~_dƿ&`o'?ưٟ¬5Kؼcy#1"+c$čz7Ngr\~1b 7BR"KF(1` p0Fsx`X>6[gj35vMr덳8:$ٸ~?w5 2sGkrp̭[?ݖu9/ܝ۷wr]0ISE `.}i&$o_6F4FJNGG;6deP@oAw)Bſl?12 % Xl>8]C8i&5+.Yg$f'"3?$OkOſ`4v0FNHm_Nls8uމ6%?;p捐!.E#7Fz8# G! ƍpEuH( 7dUDrA^8j72K] C2 N fAV[*:z&MK}߬HoA7B7F2'Beed9Y='hHֈYfZk_}a l?bDT3L>uo>ァ4+St G*gJPH凬=4BpK(kyOK#UlyӊrX؋W+**qI 1XQD>]ý+bDZFG[^'kK__o&*U;4 ppKZ;$$Y:$ddoy#=c$iC) Yd3Sd#fT@ۨmZ;$>L4nVK*Tx',ڹsGzZj ,̙ ('ٰ>ed&f̟/}7EeWN]]2ctS^ɐ7Furڛ={f3Gnb RIMP7:Ā( $qd+V<ʳ}pddv+Ug':999;;om|^?;VN*Ti!vp\$Y+g[ S˖.^?w#E/sQ+5WJ%EyoGYݒ!`} mCDd]@SgV񔘐 t(?T$CN2XTj!)wEHFHD"Pt1"O r~Hfc${WL$i>G1یL0̨n ?U+bhVTHVB]&T{ėHAFJ.8gq%Jd%Izw.]tӧ+W.ARLis+TpaZ. , M(H5˖.q.Vlٲ2eʐ7BtԈFOS4R*Q'vjF`E 2)b@PW"~' u "]7#)-b ھ25 Ix?ӂ_$!)B,y#92FP2E.fld_2W&ks4LӰD4݆2#-{DB}`jr*&Cܖ5Rk axjD4L?RX[h=ԙG52  Sg?(;zR$K{KjSG$Z KXV[-޷?x# כ"4Q7Bx҈fTFtF2,ɜ1b_Q"^dHrˮ|v4vF4I{$}CoD@s3QW;a4ihα.(\@_iF=ҴiӒ%K>e˖۷T٫ZI9?o^*Uʔ)=nX{ϛ?TZ5vc, S .Yտr\- /b\\ G^]e/ ۷n3 vIʗ//w/nݺA ͛Gſ*H+| 2UAҕnnE5'6= ܓnnNݽ%\]zx́-=H8Lܗ"QUK߳FD#H끠F2WO_+ )|ꍐqȏRKtT0SS_cDu~<r?oDIdP_/UH S281b)p1:'1$Y@庯4|l( A^Dӌ=Q^#YXD]EPc-Ղ%KX1s yFӭX]WT)F(ԑ h(jc<5ݱJyU6{ۛP(ˀ6L`}[@OUfdwqqiVy87_䩫 wum`H`8f%!)3okB%YyՁ'{0)5WAe哮=9/D8Ы@DgB(ox#$E(H/)BEim|%:% XR?@ilF% Uڷw)CJDY^]< N@M_ 6wJDe8::۽*/)bD5U/eR#V(4aw7R )g/]Hc%E$L9̞9?~2_d³gNYpAP9FOmbgD63y׈.F>֫HW9 NQt3yJrnIYdQzyat';,G/_Wn:غB}PP!o wVcù P|{J~M"-:sSb=5vH2}mNn썈5'x]~Q=ォ,5[I$'3/3bD#吐7BA ꟼ|:zFǎ=z?ENhq 1(E.A^b4 f xÛu`?y{`ggC ?:e; ~v)|-M^fy2>@3DG1=)AWS2Ol5|S +8A]r$0óK^BWx}4dou "P<y^?7?s$r1xJTG¦v ׆=_kTLWF-O Q +nbZުa/3l3Q̖itBOC1690g=|c)ȁ #S-ZtÆ γ3<{&H>ݟ><+ ʖN'}~#yLסc01AE~8 Fk?e&6yt[+Xilcʼn/EX#v. 88R2MيW 6 6>zwtɧb0kҽhl;VNM4{è?mZA2 X:S;}}pHG6n<<4T "O_7Bf(:\|/hӸ_vG1 Fޕ"K9$gUZw_Y#3p#Qy#ŮQVVTUSq{ĞLR1QOK@BAE۷oj*&Q;},AGn3(Ho<*F( __yt`?bE(1,B}./._ ~vJqE gY |&Iy.҂V{1gR~Ox f=_kB]^?ICSmaNHdoi,$`S+@;"0 Iރr'K. (WV&oS"P<,j!.6DuK|˺+<]$'uI|IKkEhM~.b|bOpc+ 77Av^^;~'LQk~Iݏ8wBJ YF {  6޹s|w옝yXc$.8cxkl5Cs3f[Ί<3~Nm1%~!# 0.1qa=".4*4,cC"cvk7a=2#PdwwI ذC2B*;z_}(mZ9ٹVT|7\=MtUkv6: CGɘ oe%Յu0}<=5p>߱<{3c~kjl&4Fc BO3>b- |!2b:t1ݳ< L;v7&@[aa E9y#$EHP<aI%j9 jF0?/ڍ_/{ e?w9դ~| |ǻ P~ ^+O^_> ޏ.ᎩV>߲_{#JyDm)xDA믿w7M^q6-Y lcA|o#iޤ_%w |}@ҷ0d87#=ؑC'3Μ:qɳgNϝ=}.3Νp>sϳ;1R/^Ntr>xMf)B"GazTEX[;7xq s!WӍB%9hoˋ` Z|2/Ǝ7LxnKa& OIeP$8[^p?CֹtorzWw2{,̲?n1)iByy}LbQ([E/{#VLN& 6!m;z87F )BR Q]"p'A$W1F,j†ge($ÁuG=_}skw؇WRˀ\Ͷ:$zup0m<Մ{SsB$neXf7+U8];;vs4GIq!o/N̚ׯ 2fߌ ^<:ώ }ֲ$H(=od V^@Yh?M\6eEMӀipM9gc{1>Rܥ`1>QLYW;%ƢRS骼ZKw&'Jޘ3LF%Azg;0i^>7ylc4BT b؃0Ʉ"%♑ __]}>gO }os$9 N\%8x4Hy#$EHP cO.ʪ#xMu>H=;ZScSF( o7C;l˸!oIg&|]\Cx"w3# w$:=[_ZJDuC*of޾WTr7Oܦ3|w/.ݒaNÝڃ0r 8SPl:s7/jyp_ F((Qܽ{o Y <$H(c'Mpq⚦tmX+AX^Ӵ~8ŒF,C$$# .AamJė(^Oz-zpGs]I[LIhZy"%hEMDHZs0mdZ/u"0{Fegb#!'RcqI$O N2Ȉ=ɘf륰PP!)B,D1;2I6[ [UFbU6J<3$&=U>cdQ?p@΃P6Lf377.3F9ܥbMQ\Q]i<^olW5yD2Fx|ArΝ7$Y 3$.ؐ6N-\7c s ]\0ZyLw|C`@OxvqkƣM*]A2BZ2SRX8ʨ_ qkѰ CHrH]FzK+ >&VrkX83|=F`Ha,rwQ+"Y]vJg*[(}PP!)B!q5;!ʜTHj3#?r\ǣ5.ym}<9ܵЫ;I0JI"nz6㸑$͝I-?B {ӛ0˹Ir,J Y/ѓ1BE?wB$ ^۫3&.ۆo $$r|4 ^ѶrpUn]׉>`Ą&i[x$0Uɇ rBJHA*c+klɴKz/[:yNH)&v¤[ WOI"Bԭ[CIZ~$A]5ct(vqa$VC l.}n=>L}p'ESj+Py<2$eiq0{|‹J}y#'Hn\!KA[ E`[) o[iNeC{9ڗUKn5@j9SJ v%QGZ\j2󛝺L x0a7!xwna27Qs?6a8 LG %!ԇ.:+M7U&4[Ȉ`\$mZ2[rd" [h$IBI"D(G6F^V eŮ}dqqg(VW(%$`vIk ot_yy~?J~޾KzS^^BYNPYoz kjq;5T 2_pJ#Hnݺu'ʕ+gNB!ABBtuǐ<<؏^:z4.E4yaKBmZϯӐdzbP&Ȁ&/:wYloqG*fr u@m'zhl7¤Dk U`Hth ^ղ"AC-oesuBwFHP!)BQ`BT${oО'o-ze<)"yz%ˌ燘*% */fX\ Q-nfTg\IW8߁s *i99IEVG>:ׁ/KkVW5YX/Y;pEyGO߽o_w_۷oe5f_ٝ`rv/Zon&X"Hw߯=eKt$H(*olMR55U"$ $ InNFNjoZb_NBNNotj_[t)& N4h ƻW5 : +$C&zf3iFU''3Qt K`HVйDD`ذ:R!"Ϫh 0Eu">5FCc#Ib4*SC#֧`rt"_{#$E"$E( Rވ!}Kzn^< Vgqq]P].kJmsCL6usp;d=w/$ABވ0P3P6%GQ0!X?A `,\9]DSckW.ޢ4EB#CY"H=]{z޲8kD]@ZЬ לE\)X:Bd\[cGF}v)C$8l$\+z8J[10OwkciSS)F 7B$EHP0sh^TYrvHss67"op{g܋X|:jz?m)!iA &)hB i A$L Ch!BQ@ʠ CP@D((uʗ'}YgTݺz5Z{>Tnuڝ,÷@]e{ބv+j =LͦҞ+y@yfx1t3l8yypn'ϊTV4@9->5eR{-$ z3cG-g;ݘ =yU_ s@NE$"PNLmU |RxTb E,4n,"44{r*g4ظlrW!Z2z:ȊˊᣑF$J@$|n n* 0>RHb;Gq83JvwhR}4B{M$ڸW@~jk`ts#M(<!G?-fg"=97“'"B"&DSSH;j{=Sq)uaU9 \ ~j "`U!G!i"pG=x*kȦ1*%Ty>Q2Wɥ_O le ș1]$w9|ӏ:w_y@r ȗr@aE":7k:uoZXhqr>,@1,tN&M]?OW2QbH;$'ZZNh ]22=<ODv6yt"0i`EE)!hٸhs#>$d#1k8KPͯh{(N"XIH)c9De^H'b*q#Z{:8#Z\]IMǓhWso̹<9 Wh͙ݼ y6oXq@??*;g'=djHfcv:sM,E7J+妌 TIݺ0z%Z C`wM PNjaУJVQ5Hr k2K# LxuFtWagFĈ4"0}PqЕ  /s#R uB"W'NtjaiRу$Mkp:-A`&#c.0i=GuMަ16+;TPnӲ ϹDjFDYb25 iZj8pl,O 9ϐ8Am{)YeO*7¡OHQ"|H8}h#ڦN=ZylŎP4SgD7˽Z!ǒip2dT`/ZK.ٷE}Ԣ-hmy_"*Bާc WsZ-\/瑈$+Q TZNmz@_xr@ ;-ZkWwꩻQۨ.¢hm@飚{iP$9$E^>g3w":]62kʔ>caaakמqOHx9u[#bsvF>wqXE8Tn$u |1@觷g/CLX뫾VkG %p/ o?R{w ^l[ng(CRMFɔ@`"|X4]0걷27im:i ^GSQExPGFvBCӍd{* p8 'tM=h6VHq#4VrN'R}UuC -Hq4TC3$aUwB>gC3M#ZHkX#eHxf͚-[͝+1-٣)5~ݻv]|i h]C&}{LgeOင'$Lxwdj ۪-v}׮`4d10^x!n(ՔJ3*p߽gJ-}ؽ9 (R`l-4ӱ 0k8ٽb=߻HȨ'O^Ɣq󩖭=ȰX 'm!h *>$%|p(“'"VT'p XY\@HG0R;?^#w 7DEˇ]C$0P=VINFt+7¡OĈE'x%j[Dmt Mu9OwitrUHYTCNDH&!CD}rPʗē,ZɔFY`PO)=9 Íqh|ÿOT6r'N|x )?m~vqsV@2(>~I/RI!RA|{JH}2n$VaYai4_*XFl p(“'"<*@zEx+`@ ^"lb6LfFџpAъv]$##V9JQ}BjQ[$ҍ $$GR :"ɷķ?G ,gl'0ZO=tn,[\xq&Mԩ5eJl]vf0fHOːI4ooD5o׮~*U_<+ W,倄ǿ E;b.dХv%](0"6lPjf0^ry\_0k)ល qkc0e3Ѥ:Zᑇb-x3i5kGU;hB3:sEU i5Fd)a? Us1,so,΍p(“CEx+Oo;t+:hv5"1“kdx *xtB!F" Ƞ?\$+n'Hs~Cl*qNф :ySy4`#= *"-T%GXhAc8GT,n>t¹gΖ|쇻x<\ʃ&T/;~"˥0Z7KO& 3a kRF#rCV)9eȪ$!PѶϘS@#mBm9ng̅X[&bܗ,(R1. `4D`_p9:lӧ QQ*n~A쭔= p(¡OExTbC.g x$pt&!ghV&3H n8INL"b+{ HSĥ!EKpn2pDR)M:gIYfѺnvMXYGK<18޾<*7vΘ:ƓIIɹߟ^|wUZ4q#yY~Ջ<KO;~װA @5|&'Cey~CHӖړ>M|#Mh?jg?.-Մ`5 HsA`g:4,05VXiGkuh(Zs c\OUj[1v$ AS =9ޓ,d0=C6k|nCExr(2i9GΥP[?fwzw]?&~0d$+Hv7e-)I3G<:1f 14'I.%9L}W"#䅒E6|CDJnr|Hi ƍ\x=oO쾽{>| N7n!F*F@SJF' A8iH2(Oi "=.ܬsiЇ%l)=&5ɦ;ubx-D(46IDNj{99O#QZQsgΜQ|ׯ\)V@GN~aō?p ,-ng%b,AA>=Lp!>VlKvpM haMq`?&߷;$Cǫ/Cj#$^&t.AYa}n{BT#(J#dw8L3lf^sCD!\TQDEt $\ %IJ8Wd8gcs#p(“C $zqKʤiB`k)>) #t5葋nsyTфӨ`+9u'򑤕ꔕx{&)MV!z#rJ9I'۩Yp)"G"jn6R%|!qɍ7ϝ֥ u𙒫W$B!S۰n-^߈7։ވy!k K59EH* @LSk[-VE{f`(x]ʓ5F(dP4i<=k[HZ`L"d@TaF01d"3ZGD$&&/X̐ HFI*ާ./@lrʽ\gcs#p(¡"<*@hFN`&a1Wc'Uh^/4f9~f$o!B&Ndyr#٧;l[66ѩ>[˓İH2F$h-~Kzz`K]!>`}rոOhWUm2T!!f``iυ{qP(~sܔI/,I2I S,OkIMکi8ҀdHf}Mb|v7,iklIZ7Z$ }noEsh;VnCE8PGEg19rCS."_ 4FG=OC WӸJE 42}End#u s*Ic T|Og=GǚDS.=EpnߗA~pڵKlɋ/f|دݗG[FN߾bUCeip@£YUTeN!^.FvJER!2fĤϹ1,Lz&;aRQksיvueh׮G>w R pHCֽӪcpjb1< B #xqҘd5{F=zj"i06՚}0^>琏'1m;a_LvGE8P& խH a&qDbDa!o *9Mw "@4]ZBZRwl!tgKRܬmDU<:|xHZ=f0MF+Z'_=0J䉈? ;:竟;w}VfnHv;k׮ ^N!;{&}^n3I._ $<~I"P^/^aS#7xMaguNAN]I_epT{V7g9$)";~vR˕;S7~CДeY1GTXFdcSqa;TIVIQ?P #KYIN?>p`;Ţ BXZ,}~(_9(a4bT.6}ig = Zιp(¡'d1᧔Td+1H!cQ4I.-٤*)W`g kE6q&=sWGIyh]r.PD]N֝]/PZz 'f\nF#g 0 ; |ڵkذa~~> \p}|d0$f" Hx*"Ӈs}VKK!vls 01s J%f$ojJ5xC~|<8q1{0fL5<=v{GS[24ɉ GX,%Oԭeݻ) l ň6TJϣaXK~Ȑ۷\S7 l Q&< _O7ly:`ov=M& ߝs#<8PCwOh=b%77@śthON~bHό ja%0Pf'$J9[nlXaL(ë]$5i?Wgr:0bbR~GGԲpzs#<8PCwOH불<|~H $Db ԰&O7kH#N$ZYM 9~6( @$p.CI.3@}4>,^ܔJTVs.J13{Kuz8zґD_r΍QuɊ+y䑏={6lS$$^;f옝%@ssg]t7hgܽkו˗̞NH*-G21sf{ԥKXvT?X+w wsNv[8 qB:sg8ϠB3Y0>8G|s>tȰ6Eðn}zfu6qNTŗxLJᖱ~)bޓꦩmb`8)9ȑ!w3ȡxuuQ`QlCh<&Ur<V dT ľEZETbgL09e5X$!-|΍pn"p(" Q?c$żI7z/ `3 (m4*ùAUb9JD!Brh괵KjU4>zhU$HyGmB"s>!o-^KשlgGy_΍S?իoٲ'v]_%ڶm{ܹ.]lg@jА?1;+b9{|9K:VVMӧKc8j*gJ>{ 1Q~ӧN&Q$e5{ޝ=ervZ#齸tѨwb6"#&Y < AWTr@:X@psJ*bIZ3Ld !ŰTkrS`DsH""vO\@ UNEOh%[a 2dJGXr;V΍PCExU%vI$#փT&L".V!YlԝT%A]2r)su*Q/Ji! -zGroi$[q -gHa'ɧk>'hD"VT$ҍh$`1G H]JqlW%12*΍dN˻=5D$ 9wܯ${A/^(_9^w'nYSY񹳷4/?8'gFxxxyr[,{9g׫W Hl[vTZ544 ϛ_Jxn  fXjgZѻ[513"w6oâ|l;}b߰d5^zV!or@04ĸ<h5wZ"9Ih V_n$x ft?tnrh&4l:~|$_6 `3wZu uBCU1H(*/U} 0i/wF?1`Kmwx\7¹p(¡I&Fb&!)&$k1rȊ:-$ߏ*I>qlwȊK%94X B4uw$ѪoZLU3ZYO’l1ú$R%_'RαtN&΍ƍyr%옝,9<$I~ v|=}{ԔJ/ DEFLyC3sfhɓ&5jԈoOHGbpafoK. \&d!;CtLo * $QA,pPa6ڸWz꠴1Pfc<`4mdB|φx| =CѧOMIPyT D.!a `.+DDc\*ʤ-La VΝ/ιp(¡!D7 KCB'IBVDGl!Oʍt2OH)Y>%:%'Đ( lC541x-W@KkXz1Z9OG! f*k^"~ƧWxpn$?7|Ki}یdy@2~3?|}ٺW\)RF[kϝ=gJ>bO\ x3uڵpSM0,wHTz*m Q.^V0́vNdJ*DOZ`ץKinm0-Qču1 +[Ba|%V6v5Vw\j1ȓLda^ & BXFѩmjs֮G<{(MHvά:-[d2Fxp(¡"h4Fx^@__6٧WƥcKܙE/31vt-]MƯyAoWR%ɀDZ\Ɂ}{3d4(*zj܈3ԉż4 0[M {+@Zl\rٚc sN],z,K`\419p=zZ29_-jcE )TMNjrUX- -:<32d@G"9o CU$\%GHYF,G>PDM3}%򠭦QƍhC򕫴aҥ1$_m }+4U'5nݺυjgC{LX0o5"A Յhue2>s/8QZ/{{}7+;$/ZJży%WKݱ-+z{n @U1("BaͽB 0b 3\mTH h(IRKsf&ێ!~R8dNd߰aamMYYHOgO͹p(¡%"1U8"{N&"CޣR"(rEJtO%ۈN$,9JU9ѥJ}m#=%>ZB&lO%$:9 yğ;H4ңS 0Fx@w~;HxeEQ iҤsaURE$+W~P1$<`!ՀJAf6vq؏4#}(RE.uå&L4 }5g9Nk s!* ME`F#A5?"&_.IH};$MWuVdTIK!C]Vj:F.de9`<+S<fѬt=L-% 8jrns#<8PCwO8R/LNhD^oS^dtU/M^ KF2bZTCC~0a MGJaHrl` ɽ(ƭ$/yKw7hN(c:¹|׮}qGFpp>whdú5MJ*14| \0Hx-MzSC}=#VoG=%[G*jU-*&NdO/X'hiHg\ VE(|B]4V,NXL+FOWHdr:h[3qt_~ğ|Aq&I]}F+4,2GA̹΍oIH{ 9v?’B֒'|t.dqg?{l*A2Əu@[ќUTlm N~!3Ե(r] t#j6vj5օ`D`\ 5MqEV" V243-< z*7ӻk4N3n3.f-q;61nR].IIΆۭ~P;sn"p(. QX\>rdn:  HuG)Q(yfDkHDрTSSJ)Q5:O!l-q. +ā,VZ [N"K))Ut$ZG(k^Sù|+倄{L*7>YZEq`Z`X %KsGN/xΞc<0"NJF;?V,w-j_$@h-ں| ӏ0MX᫉|(/ Æ>(ľ ]eࢸM)>ٷo(=RQ\m.HRKau P(΍PCEx!uНOv d0..w0ȹgrg[!rcG~aō?p ?s{qF>$Qmy@XZ;LXr2q#uPl5),%H {92؋PLvo_̝]ɸ#Xք`JȈ(*iܭ(=]>ƞmTR6J5¤ \ĶV{z5oA$7w^Yan,j{$M?IhxM&H?\TDc}*7¡"<9Q6k4na5q ڙ"i\1(r$VG#m|$XD66L$ 9z1tw$C_1M3]Gф|t|h8=bf_Pȥ y)='7W_}yߓ/\8޻=Sׯ!$@,\24 NM@B,,arsK`{VtI7 s&2_ARh2(YBj*b:V<"PG K: lQJ׿$b?>#ţگS1!]q M(yzu͆ƴlERE<9O(>'$fl.kiD'7k~uN>**7g^9xR<)<;sgZǾ;8 '75+՞nCWĥHjۗiQ\#}ĮĮkuYܷCwv\B{ L:*p٧`1gH6l.S ,Z /\e$pp gm!VXەF7F4 jcl= ͫ"PGEB#Zy!29FR_ȴJN#dZDjNS$9I'ESl'īx=PN72،gaE'Zz9DtEO&IKVmͼHôV7"+F*77__qㇿGd?__<$ n<AC`Cf1$*uD1cȈǭf{U% m)$خxfhϤ]p+?bֶ(*A*h IAJ,b5YTڄ5&o\wGIɘrE`:$zn+67i3koF{InTbdR?. ]ύp(¡OExTt(08""#fӑL*d9! 1wd:0)Ƭ&c??dTLlI]r \(%2MZ=̜RE$>SzDɝDQGVf23<+jr8Q1 CW,倄oz!Bvl&u#kO5XYV?e6*xҨ}¦ӒԆ/{n5m|G}'8eŔSy{rƸi`4!yG&&[EP9pw>WX |2}6]۝OBm6\!!AF*=þ#VSP'"<*7!I2ݲG a.v,Sֶ, bdIF%ın "P L 58Jbx9@N#Gtl2z=Hd [J<h's١;rn"q#S!;{f/q@WFnV(?X.+א.]>3F#9'+U$ 2QP(aǔ~T2dqM8Q|Ld'D 7+tDWj{dViLV!ҭ$ "<9Qa" gd^:?tn=VH+b?['yOyQd1يȊψprYFp f(tu-Ej}Ѱ$ BI&yqD"+Wӳ`"`I$,k_sX9h%VN8k3.>M o4iB׮zS`pA5/i! 8Q(0F =NgN9=CUU="vEh_,*_j ְdn )^U12u*ȔGEFC!K?Z'@r&e&I7Ҫ\ $;1T25B>īdP[wyK7!)W lE$D 'Z줧:B:4I Aȧ,F=Gʐh۷2Sqgɟ K6nXŕMH,b` R:* nO: K'&,'*x%>$&-wP<0'@d +Mش+2ψ,j@L*Nc!g4Wr{v4##o*~8!cOUD"}7*bNTEuVzӒEN!e2PBM!+ .<87ƒCE8qy^wyD>pv~%HqW x?+FкGPLwQ.p̓&{hBTd%(2ʹLϟA@ҫ|E4CV4F[|@8a Fxp@7k]f5kHD#X5Ys}KU0PxqU)>7mEAR@@B yL`x;?!G{k7WxP@8gݏVbr }5`A){P悖jWDyVG]֚JZ(ꦢ԰O"[Bl,!O∈ٻu,LƱ)FQ0F ltF pD""t䥼db^23nVr-lM+ 7w3gͿF2PfGezhā4"Fm"f&W? ĊȖA[Qȯi)<87~$'O?vȱ#D;zx<U0<ᙌ~Z=z>IGz/WhAĝHpowtvP'{ȋ>$9IVZ$+K?v5r1A܁m.>Q& =dVМ}zxĿ,<|QQuWڻ!:P,5JYU% qFN?1yw1D7[sn"p(£Fs;H1MJ9"d?I53@>$kHY+ Pה#BDVn!q#|#pV 'th9U'N#$'lJ&ॐ3qFimi;Fxa϶͚ao'f͜mf9 QC u NCz"f'7 7!Nv%Z~5} Zo齰Uc7XG  #f#=%Dr:9II yL: "zGI'Aj~pG35oPOD87ƒCE8Q B6ef(k Ȅ8"V*$Vz̲zӰHM.yc"N8(H}#vӈ\wB"LA6W^ɩ16Һ\fsNkP즀脿R<87rW^zѧOKdѠA+W~' 9vHo9p*ŷ:AHxT⹆0v 8цͥVk=GscٷZ^nSI†.2S6gT" =R5CPn]cI9nWgw:&Fח1g;of/n0e9#: ~">O"JmP R^_:$0 ¬?F"p(¡Íl&z!8MTCN) AVhIo&9]h(#ȓ8U&UJȡ1G ىw1@<&jQ?ryA@" 4?Ҁo"\R.:9*q)3 č[wwdc?8/^p¾}I@fh'=&y駫" 9rxČW6S23U0\4.zQ ُoMkh)`WR )gz.\ZU‚]1::IX_V;!;^7d-y'hfQ )R-Bkb|&4$v꺪' =ElX|ȥx-NTzZ*R0BoQ("m-ʱ(e/mDWDqe? ~&EѤ_D$yGјDXƙFn V[?`H ȘAw> ;{FZłj瀄Gg!r  J aS[כl G*WV_Mq0 h^RJ%! x3¢ki!>Q1_.Dd t\n?*}uK;\7鬱ݟگy8x GqӴWbm-%ddf h KnCE8P}Ⱥ45Q)rgQXTVKy*.~"yF I56%\Ml #*ԇ@JaAʖI\Q ,ҦK0I3M;DCC=rU-]K.ݻwoذ! i; PL^,򁏬IFr+Zk_,ynIӑKQTZcr6jn5:ۻkIUU v+F7¡"p(Y|5(AF 0UVH.=H#b&]$gr/a#w>YFt BBs쌁@"E^ڴ@K뜥L ߵTJlib^ s#7!E#fee9s\~}ɒ% r'"g_VX / iӦ uڵI&p@ 0@V"b SW'j >B`j[n}@] OX Y!a_^cBa0ljC^0w\692b:#0bP+Z@[_Fa~[l1vyp1ZsK `)1e1lMiA<7¡"p(S|9%XMkR1vbNS2ʲ0HFiV+@rQnzb"G L5M',Z'iT7l(tc)b r#Nrh7o|.]oy{{_p]\|KѣGDD\r0켥a@пTs@s@/N0=Wy3|74FsIn-Z P:G b;(;7 |p!k#El 9ŗ;2hSu{,qqRwGw",aըs-d}_3/s}Ns8SH"2 ?F!ͦTܓ=eD:,!f!+lk;,ݗݫ7¡"p(£R!aF (Rt%$F J!@b!NPbQ2N ed*3Iz֌$eknj:mIYhBP$$ΰTД"r!r@V(at]RJy *ȍ8>ƍ}2"w:ub4lc׮]wH܌h__[[Qߕkǎ>|-z衇BBBv qa/k8 qBb&eCYKݤdxߗ=CB$DD#|[b}btRxю]R}kN 1<5~jފ| xsw*PԆ&6uPJ IHZ hC(,İ~*G/%[QtA٭Jg\]aV?/غ)vSSE8PCPK1(Dy=Db(DwȕhloĒbdeX({"Id/ֵyf#ш3xy.ኪ$R)Dk%^@+gsZqeW2t슮ՙˣr#r~+^^^M׮];w3~I[Ur4C-wn߾M6ghĉ4n51˗/oݺO?=}t}a[f$.^XfMСCf3 ʃ启v;{r$ 4{{{{[ιkf؀ u~;y8|w옐`Hy{ۻtHO=]g7QK"&vI"Z-&b縧 Y &Bσ+{7p)*Bo-z'N7~uxw @*Z5A01kh@R( l]ϧK_;FgCW+MELO0kC!J: T@I bK($UafƸKDJko4xs#p(¡"<*k${ r PFB2t$峌hsϟ?/Õ HX'Y? jժm6srڷ YyU!Z$4ŵܹe:n]b5ғ]vVohR&sY |xNXCsQp/,:zk64^KXGt|/oߵZݲ~FRC@'3E,ĽW`73,O ۈ Ml~,NvxZ"!Ƣ+h@vHF#ksn"p(£rlWRN',$5HTFNI-_QArv=\)6&IR%a; 솋t)?v%0(qD,NR6|ZQJ [*9H:mt+ݕ/J+Fxo䧟h]=]9rXΟ?.:X^=xűcGo3R:-;yNJ>MKx}2I|Ky )پ|ruu׊"HxU@ET)K=Pc#1OUf7],zLSեDr! jg%/:E]2h4l̍x{c,#lOT~m I#R=-`UNKa5b<D'Ji@\~K_<ɗs#<+@rڵK.9 ϛ7h424UZ5?9v]q|ŋ6]\\T*׏?Y@ɣ>*t˦G55>*y pK4U;N:!ךa1j]G5sؐ_-7zOYV Tٹa'!FCThWXrY }xMRGQ77Ǝ"s[JDN!3!GLBS3u2S/Y/GM+ҡ||m&#,NՂ35JĈ?sn"p(£\0NQ[A40. շ;@$#YBc N"oǖ}H|#>3uc*sXzk{+օ$ C|g 15!z2 RSžQ=۫alް9ٺUm[7H -x`hdiKt#! nT1reh&GDڠD 5iX!V ƽĥyQ_VP mư)S腉+)s/*ʪRAU0OB~[ۻ[QZvh#(NX2C1I6b`j؏ba'ف`ʹp(¡20*ŒSz6PLur/"+6UF/6"4S.J-%Bu~G,G1o THhkZZ<TB-G3@+t4X(JC:{utuQv7ڶm˰DӦMnro9r͚5l),fs~;릭=mN@;Y۱gɀDe}ɀo(d=ݷr4>$!FnCC`z! >Q7SS\mx-={>s?GYb[aR1ڇE"K_'mf=+VJkX97ƒCE8Q)NLq*rHR䥘Uʔ Q od*]Rۭ9EIa#nDCc(k&;"?)~db+KF"l)tt- *J$8ArIʨFEEen5 |ٳgT〄G WW#4;b$u].ֺn#ń|Fn< Y? `y"fZaV &\; |!lCW5٥qރpulQìb#za"4C/s ! I-$+3le11}#޳Nf E*]ڜ"𨤑A\WȦ!0d!'RFҘCDFR&Ʀ(FlEqwhxe;+)5dRxRJ:NKj{v69o١-ӚhSù{s$.9}nm *b|ޒ:G ӑРkyM |hZ~7.jcj.7M-X1f& 0T'$@ )8D~%:u,ڡC^QO7wq)O:6W}{p?h)^4.;,&-a-Uh87ƒCE8QJ\:J9@_lJʲQ" qt [h~`40\GH\TJ7i8IK^dEX\RltJȺ'Di$X97rbxޞk@r?h$<`"|3YyjbwM)1$jhRGiMϩaǺB ޮ&ђ5(Av6%Oxf!KNlG]$vmpס'pQV<-nFc]nf(s멡O&S)E6D% =ŗO,N%< z`Sbz56oN^A^8 3$KDbbPM@]![6rs#<8PC?dlj c>j)A)B#6$8JjO7T {ɣu.@$"IBɺE6 [ȅ5 V {#_Ht4kY97rbh.g_Nފpix3;'NcwJHxTCnF74zR*MTɮ鋌1'׈9nn j;b@W^ku 4*)|< M( ^ږ˃_>W' Ɉ⤐nSk/Iq:OL_qighбʼn04LFr"`GƢN!,Z L9`FW'|gϞ'NVj""!!) . 7ʈ@)ۀaD/%iؔdn,9\rE"i<̤ҚiSxIе̺d*jf!?M~D/!ĩNc$)OlJ7֬VkJ5;*=[qW@rȜܙ_}=7ow~ *:WC}=#lgD&smnJu`%KZmƇGwzwz25hB퉮eR a+K]{Zbժ.z80$pkM-BaWB]4.r ma] x ]/l2ذ"#BZt97_cݺu{06/N0!66 B8PC a'uR~ D2HScIq*{Ê,p}1ȧאYyBCGѾߓzWɦ $TH_.% X*HY<adɊWxpn^D̝v׷v=OɏǏ,ڽG?v~Jo;!v)7:"gʤd[>jFCbsczF>l~z'KRk y~ iY6;ÁQ-܋j&@Z6q =.YZ^-biiu0aO?Vŋ ]ɪ+NO'{ó) =_FBPuAHNFmkYr5iȔZH` ה;5wfZW'oBv~M[M=.>lFya@?mg>$F<|Hv-LxY <=kj%WXhTܗF+bȵk7n,_ر㥗^jذ3.nɍPCUM:){^I`K;$VDL`"r`"BX#)#T#%,4 ;z9\Jjd;-|Qe07)#C)^ul΍ܳxcg^ZrY;*`mYê2yOCfH)svUyS~{v? zW:It>jl42, wul, kWbE.֪0ȻNUSe!1mrܤW*D[ͅ #{yzut=^ҶM*Pa6k⧺67A@L0vz@_{xm?Au9O$V*0l_d ΍9=rM^_~Νi+-Z\x]=zNFxPG$6CfL XlI)g}Eɍ0 A3 i$+,*e\cLi8A,&n$F72:&bEHid#k`VH9] l!eu{9i;s%qfְ+S9gUoE<17ݽ)1TY@򏴹g-Y=9!; KT. Iv ,dMZk^v!ŀeck7-f̞X 6X6>10 )AşYTI&pu ,x*XhDO]LaBhAZC톚,wS3mQ5mf5LwQ?w%52F֚n'Y믿\m۶ϟw:uTFFFtto 4q_nɍ΍p(¡(.g㖓kٰQO.*v)Pќ:J{%JĪ@䈡dzVf`ؕ5,D2aеA)=3<%+ZRY@Tyxpn/9[ů 6C'.}hʯVq3vٟvOqဤJ{B_w{5 l"BhH26gSwCJZA0s#w.]*ίiiik֬ٿ퉎gyFV?~[N"t#H("3$N!Z11$y$,I\D}mXH)È(UJ@ *Q{ɑU6OH/XK:$?(OUz͡SZ=LJ_Y+g*Y?<87r:M_|_?]_ vla;?M}aߎ)1p@ "<)|a2ndH50$4!gqB%d|r#¹E8qF¸;XuQJ͔ )x@b6b$eO8*% h)+ك6&DU nN#IaJ\:Mq`$*kVtu()9/k87rbvהϏ0mv٫\A簊Cۿ>rܥf>p#|s $p@£\kE"DX_0Ł5&/I7J3x I\GFb^CMޞg.[*#>ik0%x͆bk,mp-{wCQ @o_? yWm74 [3»QKOL֜;iʕ+z[~駧O~{C.:#ҥKׯ'-pnCEx_H H"a"$K$ϐfG$)(G LXđc A a^ }ݡD "3»I1q %J^ncQlcX:^P9-<87r-٥?)p@ F,|"lֲzAFFbR r}H :2C{>/61jԄvе_Z!Хc}%Y*8"D$ENh0ՠ*[ / P,qCi8,J`FcD:Ҧ0!!nnΟ& ssn>3g4m^OPCEx8Ħ Y$، |@_* YZ,Α}YSs2=EZU q#"(j1D;l}A$RW#n$3mt!I5#LYVn4ҡbpnEm|˾{o#;='p@ $<*yE\ ()!S@ `NLևD0zD/gM?!7#f*O#FywE ՞ӏq=M.Qg=5lQfIKvvɃu3ft]dbCo\Y$a*Xc0 zQVK x9[qKK&CpFhҤIqqիWSSS_}{4CE8QBԠ Jّ0)8(n!*cpT]7eQ&A+[a<թ #Y@DD*q(LY:XMlbHN-Vҁ\$Â@,/#ERFhŤYGmݢvpЦ=ԙHH8]*4¹{17U $7@ز QlVn2<.~SdA?v8IBG_3ľ߆Iأ>(eΧ"-hh`:R5sK5g}0c1|z*Jd3_W DX7gF`vlG| 4DA~Zy%I!!kE8PGU8yʋB6mIq&e GDdQR` eаc!SfGIbC ;zq`  :h##'ka7hk,THڄO*s〄HxT򈰡Fcg!kaS (pqaauiAec\4v靽ZkP^ɐ0|1s ӊЬX/u~s%S.HV6 }~F-ÌxtƒZԳÿغ~ihl)"았 CE,A%@dd0:5U"8q!+Fxp(¡"<*s*؏%]D\S|SXRM,M4 @vа Dt\#ՋdٚD IFy Gvy=q4ea>ٛ/iH*V'ID.*ACar*4{<87ƒH8 QBHdBC>ԸXZGz"jvk;|,C7N-fsBhC A&$oz1.&㈐>}=֣5IAXl_`m'%#5=+6qغc: f>2tj5><̥Z둫>bUtl-ȟ`}^9+?)sVơ"SdBH R@C"} #ZCNY|A9/rJʐT Hd= ;J-M YFnT6(}f-m4$JNNdш"*XlrL69gگFk#I΍p@ j~G PZl85!S*I.on4S["g d,Mo] B'lݛ RzeÃs#`Elp(¡;F xH8% I! G 1!eԊI#Q o#@ʓhB&"35TBR ĽQf>\f*t'QJ.<&IQdV)w|΍p@ t'z3"ZC@`ΞFCt3̜٬#qךfYҜ#EHVC])LKzjG02)Gz5tGזf ||,@+aں-C (zGHA֋;-F}7vZ6mm6Ki,?.c 1^;S s#t$j6E8P3&LaHjmC\PgRuRkdR"9bENR,!IȞ%` Qˀғ}J*6o$NC[D;~G;HI7G,G.JbWhSAɯ)M ΍$ld*m%BtB@=K"Zm( x_4 t5I|D*"QA8RC A↞B`h1K|pGfv Dϯ0<^(9<\e%/zk׫\\hf`bN6jl8CE8qh#2DfEdE2v#BOw13/q\DP̯z8  9؀_֗Lb&Y e|G d%YRd!F\!&؏Կf'f?"{hGxpnF8 ငGeTpF:4g_& U <.SCư6:3WI#Lca3mk{#>(XS#2`lֿK ,p[C_H LZ}x;,gF>>Q8$qKuxxE1znohIG:%ƒs#p j6E8PêLV*.#$EOI#d#uƒr#"HqcdrȓSE+C/)Q(#2(bc6u1$;{XckrV '4QŋI"΍p@ >"<3́F;!Y%A=I$tYQꌰIsb >6Ye'L*1X fsqٖVډJClewwHKÈn:$ZF慠c0|ޝISѡޚve[ĉq\(W;V%Gr:rpS{`m޴捲ks\?ohp(¡ۄdV(' $a(#0LEJH%)%ğe͍J]` ejӈYIJ* Bd XHb>Ə3n0iQ4 !(#6^!FxpnHxTfb$KZ@D`W<ZS&=k2ڥMc|lŸmR=l[bc1W@(`L~Zy3 [ [gW&&Bw W7)\44?$=UF=ZoȘ Fԍ)IhzLj5z^΍TxkNgKW1L߽`]ߝ]QPCEx&,$,=(z (ʧC;h,/"Ch;Q+1OQQ׀2ʸ 1shF+e,JUD=FäPn:}EEҝƈ>e(LƻmI闌dYUޒ̍ha4veCVꖃ1薢V#i4JI:tk- 3w:M_ Ͽ.q(¡"<[|_MY*SUn#H0T(Pȇ@7J*L26l;DX 9ԳЎh*ɥWM#WI |K#[>UԔQli<ę|J4(oxpnF8 ငG% 9VCBΗyE$e.7))&3Tą^.މxrk#~*1wG. G.9z򵟗m=\E8y:zC7pϬ..Y ^[z8PC + a d!שUv4)dHR$7ZU4!+8O y4]4 !"hqDw,<+%fөH .N[MQ*awy:SwG6l΍$!+< /! 8,Ł| jؙd5.%uPĀP=!H,ʵj|GlmGR2!j+. MЖ)Q_{?OBM+Ņ8& >5"Im/ExB!Y!$=T!5cj&$Α<87Ośv鋾.&FG*r4X!mdD6BH:q?4H8 q?p#_Qfa2!: la("5&3{f{Vlil K%Kdc)̄mmhңт{>')z$@1-t~+6E}큂oؑ}D{- dS҂Rr_\^l?oLnzS۸D鱋v1^7.\(qJCxgz՟s~2CL˹WY6h]$PoOˡ"]4b6q N.kI(@K ʅ"'&FIGCri*AZ9(n;H'epr:'X %a |ɓtAt င3dt v-GB`bu;R&w" C{B C&E}[?.fsދMn ՚ȸ(&ao/Cj="m{%!Z Kxϡ5Qz/CAgeM( tqlsCܜgc`6gMm<]w8wToq_;a;Vn;3_8[mˡ"=҃>Iqrj蝋;)20@ڌdN2F MC%yTnF`5Pɒ&;"bTv爖1-3@XFcˆ6)3EĥX~rXZf9yG9g#?8 $<*a,2PP _rk`4EW B,-aWCxʠ`{vw$jJ ub`&uHk V0@ڤ 4QDR0X"C_>œTr8W~w}Jy3keG7+V;Y\ʑsێ{W'{#S"LEIBєi j \ٸDI9}[N2Y:XFD8I2s-ͩQϽsˉ$L %JoH-4.WNkH0)%F E[Gh)iF76pXE ʖ/;eA&$LH~!w}T=!*cG~DH&ys `MA˧0x?XQCua+40=jP4pNkvu~).CIX:FHAM< rh98aG ۟Qh_9{|zY(`T+, Ak0t(ά1`unjG?t-sɡ3M[vS˫~qͺ_ҺݧZ^;k$k[{^\ ~:k0a*-LjGrčdXK׀Ld(Ue$>P_Oj@#4UzK6NV7vi>ڟEEdM9L~4Ri1GI-9Njs umD4шP'T,{/kVuמ[wkeU|'_ON>vGͿqzkם[e*T#66i#6CSL &nfd YCIyBV:sIpu7KiP&Vԓ׍1x1 ʩMMIxؘCD#y<KM0M}cHt/ͬ׀mexwb^#r%D mQgT[z86lA 08~]&fmsmMaKd1H%Vؠ0p Q115 ^/N+ڬ5dm"ҟ=m 7_:/ř0a*mGU3B$G%H$h I9ьNe,e*0gtђF>2ԍ\Ju`j%\A7&RNz- z֟ש'L\dG)g=k#^YXQ8( V8Ƅ I51q/tȓ3 [tsrRin@ƸG-Q9q]HBJM<޸\el/IB&D`k8\,lmk5s m|zF|22tIM0WB\ssQ+7##2Xam俋'QWW~?맖cg*T㷠ȼL2ZRazL(̟LciS/HQy]TnZz'4D7SJ1*:EXam&$2Yx a"=$$URyUOX/k\5O/ocɣj6t% aE(RN)B3:eXkk\mHydbDrf3Xm+A!zb&l%UJI=kz{whlmHpڀObZ_HFzLE0a$7DHPI(8N\Sh$)U# |@/麎!N>'ťѫзbQ #Uzݍ@g}E6 $7ݭބ:ԺGwj+ CX {|؇dGrGV}(LA rj\KWb"@ZLKi~麦AUu 5$r:̡67h5֨V^+ҭ."7K(ڸɝKΐ\:ryuk# F0!a-~',R?O껫oTBx΋U^JXЫBcOYDQQ 0(t2ds`3"q*K"if 8f"ڼ^>IVbNh8vcȄ8TAvyv*tb. Ğǐ'B8FLE0aoħ )I*ֻߊsYDQ5hI]:K>p-ٵ|&ϤNrb"nIFٷF IYDeA]V}z"ٺ m^J5$ 0XaܼDa?q`B„AސXA} ~6hCS%Y AF#aK1э(.W[eM~1?CB.gsFp&ˌQS7b\m#rغ4~䃓&EȲ)'1@@s6ҍ0I]a"Lƛ$]@Uȸ6FLE0ad}z㦓"HbtˇV>sEq](d(k`#Y;$RKwiRH$r 6\ŝ?R?Pݤ\摟d]}..l%ȫD3lu"}U#2g* &$ Aϝ`3dDcs90y h ƷxKxD'$)e˒k_d -yT\)XX_)A*- R H5PH݌2My|`,k ڵ+Ԁx5,$XH`Xbި'sXYa0a*T Z_#CR9H$BmP1Re%MBe yTfD*dcU9O ר *Ios^cXJ=׆ R@g?埙O?4&$"M#m2tr(fhûqyWIBACG-@-,QQOD> 1mpZͤ;Ebd0d]rʼ{s!K-nlٝ!|8*"=RL!k[./sEmFTrh ,DF|Hr|e !!HIZ^S"LE~j4ET6rdaϩU|DyRT:5O{d-M;pXLʏ1jq{vE([RTC&m|$8֛z̚Xif'$6mR[`B„o0j@ nuT9,NKNHlV5Y?lOGvߴQhL(j$!d,Dwyts;<>2E!uDֽ5K8tūX/ޡxp]-5OSC~SJ"AB-nF xI',+fmqK~S'5966 Mف/Ng` 3#.!Ae>CZLzgxM`faU0u-޹jB Xw(nTT7ѱU)E)a0' B]Jz׮NˤI`,@ŔĠm, ۽Q&pIQ2BUzaBddzAgFLE0a%gOI$h-]$c_>Z1v oԎ3jBjjn GIHzbH'Uh%fL;A^*ZޭsT+tӈѧ tQYޫ!ʄ~^I k#[h;575LH0 In!LdmN '1¼y)\6NCG)SaubiYi̦f)EvTHA3wRAk;>hfc {@fʦ:ҫb6:h. *,=*ک! r gx:]?k# "LE0"u-7nbbzyl\X4!)nݳޕhfF- ¡%'aLSUkj|uv<d]yMTAťQyT-/N TD=cmqKڵ:^jC _SrPX C;&2+\bϠ=ջW*FMq3mf=w wgݳ~gЪVe_v Yuw8Ӱh QcUnE7ix+gcq`@^jS\JI4)3 \YltQ'xBU]0NCU60n)B^q7uwj4W'&$LH0u iiKc ʘB}2zGZ}rga&sBԩ\c?Z2g#;UDO3FvĎ8>F:$18'(r xMibpݳwv4OcdCaxqBD/C޽%Ly;ΚE'.PZ/մ}o0HB29amTS"L} )1TR{6 CxԒM>Fp\"Fen%U*qr w*{`Q-M%WM)ڈGtDKj^'Z6u[eamq^>֮]^_ &$LH'煌NxpSxm49aG٦km!$&i)uBIYw Q]om/Ruy}zi=+q$E._7*!9>urgUوG *ԥQ)--=#>xnޮg2>QGզFo{ҡLRHĸT~84rI =S" @ޏJ IjTP9hJ)`QH~44-{rvx$QEAP\zWo@KQiM z-S&UnӸI0Xāk|}_חرsۧϿϯLH0 ASsm[G 01 RMwQKGNj2=*eC0%9L+MG㾂 gR p lҗh< F73⤵& Ҭۃ6=9_ц ;*oP Ok8;9m/-ޭ\(VݮFΩPd=S"  .AL&O]LԿH8LrDJ*)v.OHVs Ȧ5Ϫe75Yu7H9I%nT}S[Skӽ"to F7)!5~Q Av`蓄z` yllq 7dgng& Jk"b[u4  kT~b8.|J08ಱx*ǎpyIw]4E8cke/Ym'vo H)^sF Mmn600Uӈ혘v6`*TfxIy&`$], Q^Q(2H !%MxƾUzIdE*9JKeu?E76dY7RqX#}O6¸ ɵkW/50!a,<<\4!:xǤVjIGptuF>}" Ҿ< }s$LύU^to7#QoUQFrr K|W͈Yjx +#^7VX14pk0d0hjn D[!,(op cb6`*T}#Z@WzǙBe]g6zM:NrԌa%)p]k^jKZ|D xFs.peBr\ $'?"ZS+Mqa?Gq5 k#[\z/&$ Ap0f@I d5wbFl6牴od=&]z6="*=]ܼ{36VlշH9gQf3p8L*S\FPB57QND`l~9;n&_]AXe%HLo4#I ZV UK>gG1Xa0a*Td/IF՝$/A:b)KGU.0r| Wk[ѴYd=pA/e4g`-D &2ևzR:9|''gMHa6¸%ɷ_|qLH0 jLGp15YU8icxRgB„WXjL_e hWQ.((VCtUGwc~22` eoXZm;S(Ǔ|/M̞hRA$!!h@A~ɔn(͆ǥ:V:[l1lDЈ{F-]Qiy5)jq#LQށ,FE!?S" cB„RH"iwT8‹PLO8ġ$8!aa;νȄtXLB1PJs42D\4}ֿn%2Be3wF⎶@P 01d&rbd.a6`*TßM#ԉ$59D2H2 o`> S_j#ԓ ?Ӏ(Y_&Y#M˺IQt_9]+9KQ$謏3餐WMg~L6a˥$/*ꕳJ{<*wxz0XaܼD߲9'N<^}2N<~O0!a (*߶PN>ýѻI#F|xm/&av)rQȠK崳3Es^4`SN_L[mQ3BpŨ0 g}}x:#N1UJn(L\MU@Bx 869ؐ@5L$:(E)ƨܞr!qPr\YlՊ Ya0a*TwJ;"N2c H=h HpQ&V%,*T1sx(J^nsTOieQF+?EjV F)Ryt':ёB"IA٦k5Sj F75!tsgϟ=sg?xf#LH7^)|xT 0t3ʋbq/ Nj@AFfθ=- zZGO}+I5 BCXsAKCU2$9!=`$l*BЧGFn1xʽfX,$0PeȔR3n|[=_"FЭ )r?oQ/I'1$ֿB>'Ҟ:0HR)9eZ] յ]KmCJ?6k#\xw.).:qׯ??xEUoTeB„Gm%@sFl@?Q5Zyه}) YZ{26-t:wZV\~ /i AbHS![ ɐ0sI$H[WMjX $MTf2eS9[Kf*Cy|!ɟ%&g(KD!1ҋ&&UieemTSoP%K.>e@(% eNI+:Kߒ#AwRh,Eh/F&+Y_KInDi98t%MCtc6¸ sgW,=y? <~|u3fB„Gd$)79 1Z#G:687HƑ ͒GGrq>v9Mu &޹-OVj˨Nk\K,h0af53df} ,8#l@&Nj8&@xHS0 2}#00a*Sh)T C몙d6ŌxH3'&WFzrM*xI'Bš*9݇}\O[ȂMOk c3ZBZj'{넍8+M KHx"?ʂ'1!aB2puCR78nSI&`Na_Nw]fhufZcotz/XOĬ8 b/ %ЗĒ05,7I1ks⃱V6tZڋQQKK:jw,Ik >^C !/CXq GxIF%Z S"LE~Oh)P>>!ġ Ԫ&.Wк1rRR/SKiENjJʃպ$c'f$V/ъzJChu7=U qk# &$LH0r ,%C Rꎆ;잰P #>-.z²1K2*$1&1G~ao +OF=0BlXX #?YL6J#B;S`Tь/3XDub 9 Ia {ma V8-\VkS5o&Zگ0;jS"LE~-cj0}e]aEB2i#.r\cRGs$Yz:)]E{l' EBr.i x%M( *H7Ri<*_P\I i&IZEByK)}#00!aBW(kg?7F!AX]|,نvh{: ,xq$hO+qMu^!%RXc+w=M28YT"&46*H#7(O#È1C6JY1E7':'`AaCܐ]7H vJ;).(z2\f͈(7¿5k# "LE0r| IP_?i NR'JpSd8'+H'I(%GG!-_E@WWFyhOu pR!NfRH3ϐSI:Hhe6`B„ O`b 5#8 XK=;fx0`EeZ<Is*L+}gb'DLIY#k.=uVkK5IBqQ˥[Kbۻ[:vڼ8e"3 a#$L' c)EKSSVt2oU[<_I~J34D(FLE0a' TA)UuH$z'|2>R'д2lwP . 6pLG`YY<"SOH%PbIa#ef]L:zOy]zpWuMNH&$LHhC `OCfHW0-ҝY.iho8@#&1ȇW14=~e/~\)}k8PaSm` cpWStJL Gxx}Q Nf )D5vʝ[ja'eiFܞ"1UHYLBk# "LE0GC1#=zJFuPEAz_I֮G~z#]Nטhr,I"?IEy&8趏i|Z$_"OW'/F$Y'[*P9HDmmlec8^zZ^&_592xfF"!~zLLr0!a4;5W#HTx]ԇx!@ԟyK12d; qXl,ZJH^D֕ ͮHFS&,A#\.C/($ yuM#׊H9Zɵh%<>5UP"(릯K6¸ _ŋ֭[60!aB$x1f0!nfR-ϐ8JmLH:5pPka>+>"`fKk ֎ K,Hvo#_U0\{OHn!G9/ftn4* 5R(r{v^ jam1WdMZE k# "LE0m6rLT>c#iDB[1д# @VhaQKNKGqOu {D['xbJ[ $д oke>D#763J#$׮] 7_ &$LHFJEyd9$A8<₮Ro(Z!ÐE]%?0M!۬VmbexécHpbdL,!GgL0 QLC%o7فSBCfVߘT'C;RPm'MHklspbfJT*a6`*T+4H&C+Zh )POI:< Y-#)GGTSATGsPL $} ΑoD t3zqjysN|R+TseSS@Yk/~#$_;5LH0m'+d#jSWOWm!b錻V7=/1RfHXeкPO6,ţA=_Z`P },A+ 5/ǧAY,;PYݰƨ=3o{çwqzH>KJR50 }uDmFǛXMq36,&emTS?CzB^ I tG("U4zJ,MpP͏$ԖlϦ,ZmDS'Q射#HTMrNƕwȸRH7.ŞRRqRHD:@jŽVA"-E`mqڵ:._e˖kf`B„oށq+bWm@ hkx2cOLKl(nHzHx5g-چ DhcDVk-Qi@{)wH>Ly~_i6qv$`Ya0a*TTī 'ɧA@6BO8ERk )$>1&ⰑC"umJM+ԐA.|I+z920O:;0%LjX瞫3 uUG q;FXa"k|}wƥ/ ïT xV2JNK\,>X>=>Ŏ0p?{3ܡJRMtTL&yTShr9)0.0@vjN-ղnS'kM=7BXak׾s ïPNtZ 0d"sC!2e[a%Cz:lÂVFtʂ2xr=Kp9L'!UF;cT\Μ_.Ň^ M_DxD q "7|#qnDɏbWػH5%cd$:ةH+}Ya0a*Tw;b9JLndjw';NGACGZX9IvCwqL$4!(f 9XNS2]*wG, ϛG*'t/'$jW_Q gCV)8<+8eo]9E]E"ƙ>0XMzWtm \K<`,,&;޾s>㾴GO?~{$XyM>е+5Ri!IQQFYa0a*T_pPGD*(Z>VR"2 !dЂܵx^z#ӫ XHZ7ԃ/}#ZE2h#[B!yB.јJ'"H˫k{7gI6@I/a6¸ իW?j0!aB'ʓz+2= c 6LLB`睕 y0^@JX*`9bD%-4۶VaAx#cZn,¦6׭Ն|*˞?tFm!`< (s77V""\F K(2>N(suV(##Qnx& 0w5oΞĜ J^aQj 7q_))Wk# "LE00A<$S. J%NC=FSZ:Չf-R衯fc~ryޢmxI$;Q4SD ݕ]#~uk#[| ß c+m$U#ba]0́l;.b3b{_yi2@qZ()nT"3lwܦShSI ~< i`Jnn= Q.HJlh?Bu}(+'!) ax-s6ҿH:?DuH{9dd`˶O2ǕhuO ^/"b|1QQ)!!6`*T˔qP0HH-Q<\$=$,:)R ̤v3Z|Ne5nZ?OW0kVD0ɩ9E?s1]z ݏ*!YG[}0v ZjH;-nkDFFDhqZYa0a*Tt8nڙ $hpEJCLn򁜦#^C4Erw&Y*)&<)uQkQ56 23d\Y@' nɥK"4b$XcFXabdт}~2/τ O^1vi=-BJQP6eT3WVFtWV"k Ql駇(dl1)w}l}φc>b茪<cc5 l0Ka ݖH7繞{+Lc*ѨXU:J&\AA7HH,ASHB(Oe6`*TJ.GI Kj'2`dӷ5 uo& gJ"EjщԒRz#R&j!&B$)DiV m8iͤI,4Iđ}u5D+){D0nBr=P?d5e+O< j$*pHF:}O GѺJٴYA[UjQ_O]$I-`5`,c10` eKL_o ѥ}%{& ^qI+BRRAR(#Db[rhi !2@)P@J(`R* Uj(E\EEaqi3.{}~fdNpg~2ԡ#ca[uo2BzKEƫ]GzBF:.+93)y#FXlE؊aCPmY,h nYs@ɸE#h\on™PW_U&BulEkJN#<߱h42(<9ըWq؊a+j28me'0CmB7*z#d,"} Pv  sHTki4Sq9MDi7S*ю.b0\5qP.lņ VGR22 w,}ƵB.g=!͏.OeRbǪoޮRݻ{Nv =}y"^VQb7ߴ'W[xvlPAU(rϭMu{w-f|xs>_ķ-]R\ICX핰 G=֯3;3m(Ë1fb,H+庭qO%v %a8E"= 3aa+V%sx0gxj#mū. F'D&vi& Xe  ̪&#mF9H Š"3nV #$d́Ylņ VBo=[)}ך1ȲIy[:5mVxllU_{h^ M74XgQG5A_?W<17 _/>=ndw;a=^NIҙic܏5.֭H :[}cˎ_WkI/z g Fc_1$ϛžd ƿ3["lEXZs+G xG ͉35Tr*7i/B?}dH]4&3A.I:FH)m_F~_!d.7~ 7Rl?R.%+ulņ V;Qa(ؗ@D`S,5/1$GG#;O+fE7>Ɯ%XFs/RU}4r:N7GMvvSP؞<5qr.f\y(xw«)=o(%+6bxGyw<( ( xfMC&{n["T^9L"'k&L/ȫsTbc4ȡ1,#停=h$׺ ໃB%etKZKE:_XWk=l1+IBQLbL#?FXlHؐ!a{HɈtGsw]HPz{HMLCd׻jQ;=7m׻%M74AGށ};G^]3јꄓFUrم?WCCIw}d;x~UiND'ĨՖSUPM[fFJuAH6[뱘؊a+jw̆E-}=1f48G$m6c&1BSZy^PTDl9'Hv<:k1 ː]ڳrO/Yo o[^xɇ{wP,F܊gaA҇[ھm(^:O#(E#\llYTT_*}D9U\F 3+m Ӑ&+#x)GK=1hҎ|KP f1aa+Vm2fߊ1NBcPT3$*FfB"-T|RI;6YD0~ :j]0jhS$H{sPo@ʫoƉlſs1td3ulņ VZ#ݺgݓbRmld)n` =*qWYy =OE=wn=xUIˆ]4ð#20[]OS8"T". YYWr! n[d6f4Gl4+2b۵#cm~kJ0aa+VΩ TPq>3Gsr{I9G"KKW4nyz(U^1dJi #c }1"]`ռtem&plņ V];\fNqHuor_ DHE&Flx^EǸAgIBd,rb 59ICPK;ѯ~~o1oZuE&l6#MU>qh &l߸?'2vGF0a6b+V=}[Fd16r$I)6?Qj8ԉsVn#;;q譏UHG^Du#7-5>nn>!OzZu\g~u(]f+:yz/6$lHXHmf{!ReZWDkLӳbN_cKq嘷109GZyUab,pȢ(1Z;~SiTjmǽAml9#_>虱q۫:/ϚiaN$Gq:Yݡze6b+V#/(TgƏTjތc5YRHJ(yUq=!3ahODWP /1*=8AB"RG>ss:sY"b,i fjk6$lHXDm#KVaTxDs,#Q駒Į:Ï{Vcz"iAeе#&YSMuXQS157 u_=[1z":A0 ##6Dg:lقؽaw[OwkTh,ƒzxU`,f#,"lE؊ڭkD9bh|8M 33mmso<1H7@9Q&sT!rB$cfYf*[|e:WE"1|؄0a!aC†ձل"H0g"E[_#..pN X`һ=]y磻K=9S2e, yJROۭJjknٕXUNdOǭy*kҐV\.=.`xؙɓq#oZ/AS/6ߘ(kFFHo9-fEn<["v* 8=Et]3c=uR14>&xL T-'i7'?LǼJtYyQ([RM*' ĺM:c9pk|}kʨj 6 9 Ǩla1a!aC†ձ:r'6ŌsSq\J썈Uo⾈oqGb읭?9HYG"Oixv x8zk~sғF+u"㼫4W|t4V 6C"(IDzt>? ;WGvس&l%J}GZھCKG%x1[1>IXFXlE؊aC0Q5"!?mLh0M?H 2')GZlT"Rj }*p nzN5=!ZBsPaImO(s*_ɧS|K#eF+-j8X 6$/~iڴ]ii|= 5{pKBKY|uӳYX&ˁOF b_{ge=MǬE ] so:ءf1͋%:jf+7vcK% UjPX LV݁ƣ (Cf#,"lE؊ګdz{( "rW }ԛv+bW;kf`#GFa-Qji7\&RKG0fNe\~2:݇cĆMbeDo`؈{4FXlHؐ!a{i#ߛ={pí}(À'UTC2g` q`-Io)%ҳnXŬIK([A <~J=Hv3D7%+Is#.W,wF~vGF[p-"{G;+1ъm~hא_]?zZu^n vNL* S򪨈wגbf#,"lE؊ڳB(H]\%q,„AH R54H ^?ȡ F^V}Pч^-CPE%sJS$j穢6mBU%ߒ_n\VY H`N%1و1Xlņ V{n$KO4PoM3rAw ݨ[!VDaD *UH~=]^Ĝormo( V,xjzgf9ihɑ*T\L?W3PB3_8>2[ykTw2"nGhwЄ=\}a䲺HN?/["lEXZFCtj4%qj<*NՄ@\#[E_RtJ--tI5Nic#)>r>;4C'RN+Ϛ=;F|٧f`Ƶ&~t]q=5FXlHؐ!aoɊâFv#c. kSEST]~Ww͒ zOh܄.76S&J bT7bL³ *+ta¾Hsw&{Z罧nH I %i#ڒ X E+=)Y'H9@.%ebYMzkTiNHXFXlE؊ag0RI8*jc3N BJz{*1 5' h/>" zJ~?j{KJy_!8;hTߖmrLN]X EO#~!FXlHؐ!auezNHAH@)AI{-ڧN9yӘ&v7]q6 ϤgFR b6b+V>usjj Ȅ%a7P1f#=dt[9rW5A44'04#qS-ʗzsb~d֐ؐ!aC(re:O'( ldn^x^%0x[{왈/,${»o[~~HhN7{_u!:!iv j*-&%Qrv[}"lDGSKzb|^%1NXw5|#V_$e*e:$a1aa+VΕISRcJ @^k42f ş#TxDJJ M#P4jNM%': BNP'jr?ӡWg/G&?QhV6$lHXEۗ\hƁ ֡ at{ZCDu$%\F̩V&* PmntJq>w;hBӗtjW?_^!nL %TvMszWL)Fc2*!qU'XTyKISO-!K6Hȯ׫GM,f#,"lE؊ک*xF># rC)l%x:Ydb&-4 &NHD"B[Lc mBl- |N' zss2Z*kLx.: 6$'[,ѩ)ab(ҜF5Re[\ttYg7h~;G/}j$N¯}t[aܔyu#4m +nihj;;^eQ,;{Yݐq9,[,'Rׇ֬hgGW!6E\J"$B`lV[V;*76 _D$~1kOr&d Q[kF~"2J8C4C\:WM#5Ki1ɆJ[ҋ?C%3#ޜ3M't%Ulņ VG233T,,MGsF B[FCP^'*U!%H%Y_g~nEw*J{ƽi^<[ba%&.,=}$hK9VUXVOiFvV̱ {-5|9f#FXlE؊akynݳ3ş1 r">Bm5YTrt(*C<4~ʴJMv+[isfGIN닺iYm1S4W0H('J#䟖 6$4?Yl]hus h$ }q8SXQ_/J_o JјGមAk/e?MW>¯[Οa؞?4rb/m S<۽zڍXRy͒@ ҭ?f%zD>ؐ+U֦ ׿®kNePrԷJ F؊a+j̤fwJ4\~P$CM.YCz4 ZCy#-d}ޭCvA1ڴPI:B>E~M[ejbR]7+C$GȉGؐ!aC(rAZcP'i@/irrҚ5xQBd0%Xsk귾Je&9fODbҜpJBܺP=YKWNJzh#^U0+$+ F X19ޑegIx-mN-5Aꛒd}Ej gC5Zz"z(kw5RҬl.t[7l*mn@["2#Q𩏒N[jN  !*i"<^KQ 48C->3uB".h.~Z;z qJB1O̮f3(HDW|tӄqVz~Tlņ Vdq-5>O;r83(m<( kweA؊a+RY\$qoR~,zV6 6v8Ib-9/q Cb Oz5H~6i+7% F˪PkהjT9Fe`ֽDs Lnlņ VGkv <F4ʐs^Ҩ ]ڭ+}MޑDY/稊.Jntˈ\AAcBSiѺIȓʦ[Tv_FHx}ְg^k.:<խnho죏 (ץ roM.LKS8sOp1}:e6b+V?ɂu}+94>&ʱ;, '02WP+h9*AD;~3i;eZ)2:bڂU7Ж(1tx.6g-lņ Vc# EU_,JCyuZu"QLUǎ7t=DVF/Pd3 r1'$*VR]_siuF4,~`^ju޻2`=/8w1J?]M'Z d:::a1aa+VGJf3 s8rhT M'Y7yjĘ8\y.9 cxfߨfE6 c$5I)\msjYlņ VGǮ'r;L`c ]50Omb=JGmhݼ6\~͈~Xh|熊zd%mA2L'&\?' (r os*8\FZb#Gi_WW}\#JHd3Nc̪c+@9pͬ)uT}#EKXFXlHؐ!age:߆Ř䶮\eln^ IJZeEܬiVWmѣdg+U 5--/F|ن6݇h~ {밢̺PXA3@_Ja ]DP@#c uC!/Įmݺ[w8lV[uޜ(0~Jpr["lEXbqx`B  @d3QH/юeQiSed)OPY" ^W1bCJ98:$B%elņ V1n)sCjj~bŰ< V뭮I-vcj}n9ʷ{/]iRJO*U`:H?%O:˸"M[O7.q! +$T1gn?C4Ml[" כ-*vc2ٶpGW_L+EB"ھܸLA"\5a-щT:NѬtT9aΠ )6?kKXFXlHؐ!aCt܊u7.\(eenwzQt32XTs]ĥ<"+smk}jm *՘ըpaO*DMhgK`Sq|rC18nX_-T%(іx4 S̶;Iݪ)뱫ǩ D#: rX˒3a6b+V}둸msx젂 -rBB%V{2GjB\EҎTbKu@,z􄨙DjD:f54n25]39_Q-xf FXlHxaC +wY{nK'-hvkQNtm]SWwvE1)NPJu=8^W\X&ԉu/[EYLA` JtsrrPv4ɐ5@0Xl5'Jk #hVݞ);Wf6b+V}-,B/NЍb\r'^2Kn3:7!*qT`gF=2dmG6`Oi#ʹV&D`Z/^ª(.y;< a̝p𭫄q찟TeZk@];egLt:2A]"Ѣ򰘍؊a+j_([ g1oSF,$d5WTPG;Q5c_Pi`-Q[%@ѧ2D3TrHZIJ/sl ɧm~H K)fI 0a!aC†pg9U{NfO'wv+I+#q(ϝy A8"%=Q*tz7&%UXn{ߝC)to,1+w[77Ȇ^mR/bfn-UAwz46b6S+PT k, HJ#mZQ85">2Ґ].1XӝhG7FXlE؊aOyRϤ7RTq JA>sIrz ' q: FX673KL5*U%gufVc ( ]ÿ$`fHf f#,6$lHؐڳzҗiH;f;Mʐ Pil r')$S?fE^^Y{ JѨebsT|oCS?f'of b jHA,n'T),Y.( =z">]r ;Fn.rahWukϛqai~؊a+jxĈNBm,>`?a!:[Q *CE#KT|Ci!*1~KQ'|3 >Jjm:(Fr1Gyvʐ9"xLڂlņ V{SLeGEd1c q烱c&ɭh1B<}Wݣ;dQ,uܧm_r'"QRGQ_Mt¸zB['IT:2HFIZSNW2sNﲕHYիFXlHؐ!adGx@$#ȎGqJqɑyANv8`CrTrcxȯfQE0Gx)gpDGAk*M=c8t1s,eǕ_M㵷!BY'؞8ħh]!" rBI. w&koT E؊a+I@)]=3d5r`E -drh|N\/LnZ0mB91ԌSF(&]y Hhkmko W,9ۗ[iؐ!aCpZ`ˌi=z憅 -%#(v ˍt8ܘ Daj*bIU՝8 f6֡[qɇjvԓn;b0Ws<X,C.N#DW7`[>Vt; |!gcO#,/C61e[ѻmNv[N %E;FXlE؊ag)(X7I%2c~G2}ly죕Tsr:t"D9BOr ^!ʈb\ՖJn0[r"!RG& t"ڠ6QP* &ms~YFXlHؐ!au~RQHRF1KC6D`4QqvND8R''A5(OI3GF=uk7vXل-OD/?jJJ]HIx^ׁGH1_ċ5q©dze3?PTa)BS:mȝ8-bRTӑlE|BY9fTlu/["vB"4gNіI Uw&y!pAEВnm:Ab)]bUA}3:wQkYZcHT@CDo.;jDSG1^f#,6$lHؐ:t`= ivY](_XkR'xĆaq#%7'\,Ӭ¾Cq{}X4n՟f7P*T#-IyoO&KR}3<,W4=3*j1+wu-G{[a%'fP2D<.6y|A,}/}8_Ი؊a+j PTg%zs4mEM. ԛP(/) c]AGJ n* 6ɣv7B;fy3="o֊^'Z0ED tv6$lHX_r yIDvl) Y;cdb=*KBw<#T-;ܵ%B&R[Eퟢ1+,Z`7mSVDQC;Շ,0h6G PHDZ]z-4P.:#k zD#,97i}DzW|؟Ow7r纷t.kdd/ٵhfM8 `Y46{'Nze{L"Xe6b+VK4pE>Q爐xi/2xi&KE Ћ+6Ri#9}84 (fkD#/S+M*mc\_\9j4fML>%0rp>_J6lņ V$a3.$flE;cw%w3"$&" U2@0^YOߏXtF1Nv^v /Ep-[g cꄣێ0ߘ,% '0UVU쿤_W8ȿ(0î _!^$e F> ky8y2^$ge6b+VH2=`y) 4HchԢ-B'N㜙 x:b"&PV"H!9ikͣϧfȜNFZj1jHʩz6rZ9 6$I/+*{pC<{Q]/AI )4yV@'I>rI{"uE!Q١$!pm-LG2f4͸O@GvSpȏ}Gb u;Ec d<:nlLZ& yS ^/FXlE؊au$UQ2`4F/"ۨTq>j6E$ZKtoFj5>-~ xE#iQB:rbĮ1FTiaFXlHؐ!au$8S8!w$^~7G7| Pͷaז$ՙy3j=%-ZEt1z<qO]nKmW; K7"XU)UKs"XDE“Qx΍|[ξ'H%a}z/z'`;!n&<¿8 d6b+VHs zd4H#|7lI WMF̬^O6 * ?W)WE1#`~uD#' _ůY!JG 6$lHX@Q@2>t^: "n{M74S`]ŗemxW%c^eoV6aQpѰşy<GIu2#%V+l6/FR(t B(̓xr\֋m^8j*ջ` [#FXlE؊au It<Sw/4H <~XTCoRM2ߵe!J1 4ʄTD4^q>],Ԭ ެoFo9-T"^7W"*yd9lņ V{[BL2DGcgAm}TmÇjҐf],*#OMz TPLy.O玳'j[VE/q04?9?Gf`#.y* isR̛r;AKQ7W 9284n\ll}ٷ?b_Awe6b+VT)4hi-"!ul!ū9yLD!wM1"*SG_u>Rb#41SshY3*QiJy،I/n5TROp&Be$\:lņ V{ u\F{C㣣FdYK=KϞ.}-!Q&>uj2Iv嬚[8'9PhbKJP"C~h}nj6\HŊs}ʚ!)w7nE\f +7 `[$**o gIog"9tAhDl;9W|Y c$̼_tlbKM/<[",VL - 7M.NUhM=ሏ#$.Փ|mB2!bB2LFk о2aO%3ߵRPj:%&bgYL?M黎WYFXlHؐ!auDYח*VD|&3j.8B_4S̅싽Bw ^W=_xH] ywYRI5`l6[O I7߮7s:z c] AAow[~2*}쪊4tiTnYM ["F"aDRHa-Raʍ: =ӶC|@%gmЌNa }xi5139 "nI-lņ6$)=E7k7䊜FU.˺B[0O+󈏯8z73[q\X.0a` uyW.{|u* Qhʼnh#J[B9(iȩV*hD)HUD% "toJJ0(xtlߎaNƱ71:D^3 F54$E"f#bh#qچ"iɓӜg4 :Je/+h+0t18qU.Kha#""bE1+&qG۸S68߱IH9ȏ&ϟ3gRJxb4I,q&qdD?|V!$3i0kaޠ5RO|HK)EUvS:6$FDbHĐu4_?{m jB׆J+͛;ڴNe,#@|2G"5Ope*R{gaO]ӭ U'pXah?AvNaB"Ю!ݰ YaT1%nS7?!jMB5kg8KQӜXU.Qq+\a"xI+߲X"FD{ZOX!|lLwOL%gʬcd!2s[FqWa5x&(C& \iyO a/j!O@hsZu43yqH|FDbHĐuH*n5߁K֋O.GEnQS4i$'2^Fm]#Q]JYo]7.s\:,Nz{EYaМ;S5mHXӥ̹\ynC[tOC[F2`q LaXc_MRڣt_l%|睊)_X"FDTXCjf3-v#z8Ny,ؤ~'(;ĹH)Vd3'x3aȴڮz(S I=qʷ@]H=ws,^؈H ߷/`$#OkW.ܘJ&]{{L蝖B?ɦO\$ᘍKz48s'h{pײ Sn'ak@oYͭpuq`Ԅ-gq)'C*ˋWEM$dG{Vú5']7S"N5-J5 X7$ylj?~ +"lDt˪RIch4#rdbG!? a fEӟamtz* Oé0fY/j,9"*_2@r]? bv3mI:s_$lD$D FD31zI#zǪxRU;XVl/<^{Ń顂KoCcݟM qe'ߘnTuݼsaxt)Z+FvQ O8 6OM;ZZcy0ij,SaܭuNXs'N乵 +"lDtKsMU egl8[<_3 a˷yk9k&"(WIQv2qX1hk6nV%n?|;NbyV$lD$D y9]뚾={(]DZ æ0<Ɵ̇#nXp3hڈ tG\jQG`#9:sn1=;1VeRj>܉Ѵ4d|Wa#""bEcH0r,o+C}$fÓlWdaά1\Cwq+zM`6tdTFGM ̙ԳWbBޏ+^<׸ܯ?si8aJ}9uܳF 6"C"Dr#NY:D7(h0|'O?bGcw)ȿ yԜA[M1,z:ow{LX؆aqL^u}AX EnZs ݽ13QHJs?[Ǣz4DqC} RwG1Vt54eʗ,lD$VDF>$vf|GBRL 1|`Mc,{‡Y2 y?xnݺ*E#hG*w~H4ܨ=\8Gf#ռ^ǫɛ}\۹_B#FDbHĐu i^o|ϯE. Y_eӞԣBMwmC×.L\Bm09̜XҠHovך|x"]weo޹9n9ؼgpC}4~kb]$y|ur-N3p} sͻ=}>.r>yiͨ0"/_|EɎxpmRM;}˭UT>- Iՠ2\ʜ͜_ }.Pdlx<#+lD$VDßُJҏlGXzw <D@GC3neṠ4Y`< 's̩Ok|=6\`N.yqcyU.UfWXY&~%a#"1$bH:Ii_mO]-E z+c)=ZEc5^  ygBU.r(~5]S01aB ~[gM>}̒6܄2DC'9>߽KOXp 7`)/'?KV2VGEjH-h+6Դzt'ca#""bEcMcao3%ʰ}<2~f[%S&쒚faXJs xf\{C@#Fy'/q{jb=ʏlEbל&E{8~݊Đ!^\n͝s$Â4Ϛny"84P%y;b>]ОSi(/B B [x۽xh52Ĵ*B:zH&Z{:o=P».UU-+ˬq:1ٌg;}ܰ;|&鱽?)+dc6Ku~5\c3޴HX"FD竬 1u3sHrz,m G>Hڹs5 C5l,KXƀ3Pqj2fF>Hx$yaɏux|=L{vgMp4ʋZ=|FDbHĐHnDt~˥ۓCYYC6=K*uw5 KԴ-yl XD@)sQAlެ1mz*RsSqpb` V`q)u;p ~YkK_VDmի.6C) 2䙳i6oFU A44u7fD$lD$VDABpe,_2&JԐZ(vJ!Gcs4r`rsrퟍgjqכd29Hyʋܓ;ё#'YSNqěɶ)U{4Đ!6":e>t5B11>ql|lΝs&?ӼfneV5`Ĭ lO8Ju8q >-سvwNCQD3*0K{gj6.xӂțwܖ5N h!H9ᇦ^ta0z5`O,}Kdӊ+"lD$VD,H=f98W좍Hn 9hHP 楀-߅[>:']ocyK+J"bش31x[;.ָ4e6"C"DjjDԢ Ux;Um3|C:oGfʏuظ[(#u-I6W]Ff,Ӭ4gY%g |t!.\ޚ$Essӝ7Sw)/aȥ)j_DU^OFan͘i'$lZƿHba#""bE[6i$>F+e|UUըg1qz7Dmo@figɌ kRDy1nqivU. !C"/\QTb r~ίY@b,i}FIE !Fcy8kݜ&3 #kc6/gai:|+ƸR`k\cUNOډ1$u ݩܹ80oNs6KIɀaKl_ 2u|+yGlT1mCloC+͋ ߞw3 #C" #!/XW2}KYAVUcqL}yW4?, bv# H7G hh؀ƅq6"+"VD؈U7DpSJIK2N[ּHvF0!ǟl LĥK"6F5o̥TXkQJ1$FDöi^–2{UkWĐ!܈SȭQG/ψ=5"\VEKO^7b+vM9V6kmʒj[HߵqXլ)7$192=51%wbx?D#=N٠d .3bՓp)е|+ttZKACUiBY3,̼j@\e#E(Em:϶u +"lDtު%﬎!^hKT =I!VmI58wy.%HYru%VXr2YLnXf)cf M$-|Gn=Hzc6"C"D؈?:4R渔#a{^ڵش {] IG73{_0G9:,HY;D{Xf8Bi^>+YjZ}W'%Aංij/2]#{x'qӊ\v]Ss84)j(Exj|FDbEĊf|)VB{F%VqM "v$f?:r)~pHfy=ThaG&`aɊ!M؈W9ʫP55~6KNf |7N^Ld>%W"5=-=eׇV)&,OW~hu$y;eƏ$\wJOd Z&UÚl zͬV~)'Ҽ>7`t1_wHV/a#""bEw)X5(ȳlaC޴fN3`g3%~Bff9jFV,V3n^.4/Tϫn$CBv8DFGxX#AʹlDkjDFDbHĐHMsI09Z-HgVQ ^cca g(K; 'ӵ獎ZYR@aEdUkCo۴*A`)0Q?cʄf\> 6Kx]jwnb~Afekn|cr`9ʍTi&lD$VDy-LMWKWlcL3!VیXS?gl֘ jcvQ^')"9t9G+$\?G<1$FDKcb3ofrAslO,*W"cPntَ ?Q0 .ܻz B m^Y: O{'3[b&GaP/6)gpIY5{`Ӌί c>WЗ"_X"FDTV?pxndCMIu9A枈7[Q K;f S<`.ƏWFŜb -u^uh^훫J0$οg(G- f vdŞ2װ?&y׻豝]bfnnb] M؈{d$Aԑo l'XѺ?OLJFlCV㿶&8,CsOf_e<ظ>슛dx$agETPxBI!C"lDId!UP׮M8H]kbJ 7E3{Cq#,)g7U zOs)^ܬeZ,BB܅EDzPe$IP#t3¼pkg8|Ga:IJRJJ2S؈HXa#Ntv-1FiTND+cs=I4yX)B{vLZ|cH-~xҮ`C$ */}n'Qb^תi-NbذY$FDbHĐHM3H?ؕ>5$B?u21j\Op^Og\A6Xy\E|/jp"<]+cNG{z7uEhh8Q,ux%6"lD$D FDcx/+Ϸ ԪqQ5b5P_5J x5DyڰJEZ[ xMRŧ^W:i6]_5Ws麒ԧ 72y`;z^KЭn7+"fSyY4m,hNm'QdCYYh 4MEFDbEĊ s".AvL}v#Fʸ s?W d7 mq_7HxѰL!y 0#:ȧx[tA*Đ!6":Pcc<ȍSof*4*4{Т"]/[2v֣> :23DnBLm++"V94T9KJZ0Wz9 m+&;{6o3x 1. RCq c}+!b +"lDtޫXj&g3w[\|H<<' V)*O-c*ʦ;?K^:J{!R ӁD$lD$D ԈefխM+Y2D;QJ`zs~WgH5b&܏JtCOβF܉j"f&RbQevgN{Q7^<шfkoV$=(fC]O?s bDtt;>yq84%Vt>2\PLYk,lD$VDyBg bHQC;6 "&56*15c$vُKB6cHaφC2|̻:Ϋe>JmQyg+&l5"a#"1$bH$7": _xXvʣI=^{nrfw0 7+IYi[+gG ˵7Hg>Qok]pe:͖#(} $;f;Dk.?V3wvlPVa]Ȟڪ{% `ݳĿ{ErW.z+wUi1WRqqX.r0[~$+6sFQ:_ga#""bE_iܬY$Zc[K=FuKyث$;"- 52 ux3x/yQbl΋tDڀ& 6"C"D؈?SִTE_j"iCMZ2<8ӏҟy :#QC/W_x2\a'VgamV.+DfYD3sXu4Ν81q%%Cf?H$V{` &mS72\f=ⱠH؈HXa#V1Ml8ew4UB¬y9mD؈5NW='@Z(:Pq#ИΜI%/G;VJUaD-%)Xkcscsb !C"QÁ)x"fdb zǿG1/}E"GF.{^QruTӳ c|ӚS^WxUVoT\enS٠`2sb%fnjf56𣂱w*I^؈HXa#NW,#X#anM M+ s4.:lzm3J^7 :69J0mOMءn/kQ8C>S(߫1$FDJV 5lu?^ݚW4WHk_ă˕. 7҂]geddZڰ>Iefgݼ; 3x/LےbR)<={23nlʕ:#:2L$%IMw sE"a#""bEsmB1gD~u1?0IS0 @4V[X 9⋈=fg&"@ä"'9%g'2 j, qV}./fbeĐ!Qg5~(<}xDBWȦ _5_p8{p;?h8_ZE i/fSׅjpFi{i $Iy,mƜ?w ?y"olw]:җoرyq}$Fbjv)--Gx1wnG#L]EpMOz=9O^|FDbEĊuE`M"866=?$H?X1p1v=߲;C+C}629e\ޮQH:_ObQb?oRN!^Đ!6"TJE&xlb2w!T毾f>#MMhTQڲ/8q<'Q=^˱|bTtix.ѸDhwr;Ǖ"Ld>;Ck/N|yy!CF֯J~TV JUAVĊ6"NalÙ2V6E`=a$8Mfu:;k.=.zpJs&?򘄕eֺs*s5cmqvqPyK6"C"DjjDG.cT$%JN .@f5E9K-dž{P.ɗ+0͋_{/x s0fa!::t_^e:{3/opgaxh[_ O8#Ԫ;뱖3hڀ\ %'θ$zZĊ6"'谒Voe2'a&7tڏbu.1f9N}f*"s8`SG^Cvף?mp7x\ ;NsxH!C"Q'd#6f)XωDL'0'CH7Ď88m=Y?ztG>+YD1A9aB,t tu|݂S8MMYR N2~o?|5=˵]j" 7^ad$r;h]p-uĊ6":OV@'fw!?Fsvn6~`6N KNNJ܇fϠr7ɿܣL7WmeLطZhpDFDbHĐuFuŎ)mS㪨0 p/K0$;9b|. tLBq2\MGhx7Ҿp-5;or^LF3]Dv}+]W^Tᾭ $?Cg30ZuGE(Ƞ ڢzsjp9hjo̮&ɳ +"lDtJ' 2|g9^av[b;1j8gnNj<.r%9ˀ- {Ns&O3kqt+ D1خ,iQجV;Đ!6"mw̠Ş񴴠]Cv-=@o0!]VLs9=x*IkH,U/s/ q}FcVV̜~9fĒȺP (BQ0m@) T~@om 9t=+ sٍXwD%.(FDbEĊ6gJ:15*W~m6nn4ȂRF>!~g! XJc!B=di\)vL#yH!ixX׍-[v5z0 !C"FD<@ٵW]ev46b&~9&4C;9SN9N0m/w|沧?I~1Ōy`”1+az]ȄF, $`?iΏy7L;֑X01N_f`[fDQvG6 Ǹ2ωEEOx-Z*ɦቡ#v$dZ1$u?Xt#F_Nv22>ZC*z6F۸Gx~˵!O 0JE7tsY6<ΝP?WՓP2S܎P5׍y_tP}PchdN ߆:rjU}P/<5.1-n8D!"a#""bE[Eh|NGBgiBځg8}&JRQSH!1qvEǂud<װ=*ջIgcyy(B (7 \=jQ[ r$#7+U/ށh=A_Ue}G0Xb%ٮUm^P߶@(cq%PKPa#""bE:d73.x%ze6A` syR- ?]ba6iD\(N:?Cq Jt[[{";|ߛ|a#"1$bHF餇PEf֡ Hc$1Yͻ~fw^{(Ju%!,>GuVzr tI@K^@清5q v/+"VsI6@?&V5RWcqĵtĨ%Ŭbgg_MKGzr+_X"FDHVL}|Nqxg:)GJqXȇF5HNN`{xGX(QSfbvd0{VaZ1*#/O9 ,"a#"1$bH$7"dlf--mPK}bX$Ӓ/Z3;xǃCO4X%8cXy킪,U{(=KK=gΕ S*raGj:܃e]]vsE)@{ $''R\pM +"lDbwSa,l~B9P8"[ "*[NͥTZmPAxp;Lg?X4G)Zʿ.~ <,,߫1$uBNG%ΐ!(:ƣN]QN@(:D;*c]x b\:wcKxi Ʃ^{Ց;U3(Kcx5 'GCy>;wo眡L>/OK֣(r_XrV,ٴO #sr5,ʢE&><'?|FDbEĊub@Np2-j]r.*kXN}Gxz3p^'(Uv¬#Mf_y LMWL0rH~s m2W؈H a#N%bԤ#Eww5ݜ=Lc ׫6sV16tbT֣"Ƒc1 #^u| }7Jonjkf,%@Skƒ1d0ifVRR\붽"kԝ 5I5ڹs|ìaySUWؼj7ԩ&YkWi<"lD$VDQ'P6#܈-DD'!){kTn xnO̟PEe=Ο4XGc2'& WYeO'3%;6ޘb;}H؈H u!\TMYơ61z |Hrfy ^oU؈HXa#Τ T<1F;|4e량MW/dr`+[ZT^ mc%[ J휦(oHnD؈H ɍ:u6ʁlJc5Iu)ܑt慪/W~w{ii,c}+^G<ێ O2'7ݏoڱ&d2Ou&!è0_{k8#t OƧOvg!dP?놓 ǩ, EKb׸nX$?dwEK6SUa#""bE:4PIdrX+awI3DRvΗy.igD&g#\YoI`6*mv ?NH]G 5[ŶڗKa#"1$bH:*T-sG gf#^ZrqKBFߨ{^IG(y`xy8?Fw׋pB D]bn䔕@`*dXqYr51'*D{"f_d-..UfĊ&lD՛Yq 3^bT, rB vO5]ʁ,s~xp]bAs؈K9.+=dwy7` UtI=0iz$VDoW؈H u*?xnGbyϜ̯ .I "Ua~ua慊֮EdYS3ٙ,+\XpWVV^0vd8k'ff'FuW%8xv1Yk^O{=[."BĊ6", ȇvn$<k5VM<8&hǯXic򍄍8PGjv Fs#r*Ivdtg90c$RXCD=xDFDbHĐHnDYQq+=Rڊh G,l>p1~'V5/r)SRf Mm (מhGnx#GiZF0XJ[cG @xr/ס =fۘTn2ǮyKT]+þI{嶶KKG6fxtMPa#""bE:-||JఁmFI4 uÔWOT>-ֿ`7JؤNƪs)$c|u=7&_'yαTY3D嶓I7+(Ս{cm舰1$FDLjZ֣> |2dvp8~QGA#ɿۺ]sþ!9WocUAaU:S_0J=Ts00C.=f\pŵK|}Cji[c㴶X"FDEVb?S"5e3D/q1zV,e#F߳wVh19/x).~1XO}H`0oWv=^Q#ci ǜ ;"6"C"DjjDHϺSt?r{OO:k!<"Y3+g0x5nZ1N 1yrJP>- ~=#=e))&KYʵx!܅'ǿ;~RgaM[ATa#""bE:T~&\ccN_<{.&!سwUJm<\ո̓cߒ6B9&B2c Y[aDAJݩmZ%H#Va#"1$bHFYeuܹ!zMãU˚hGA<1F($7~qg+$)c:pfONNEjQrD!/r?0|8pY2ɼގB $hfd$x*\UGui@I zw1+hq1I7/6'_lѥvK'Va#""bE:ѺeD ۸7!(mO9Hs&p7ՂV|EqIf ziGe:%!!Id)&Gy#QN9LDlDMYɍdchꚧ$MBu7ܓv ! ]3ܷ%c_Ƹ p[teS6EmGe=֧)-k,~a;JfT, @h'"ZVj܀;\pb#[^ǣM6pXJ[1uBvC^4{f?&VD6a#$1aU|- Y 31ߑrę%m>,Gt#"gyi.#GXl7 icMCD߰#VM aq`9 D!WcQO9_ElDMFD*II}7oҽ'.laf]f(h #~-pQSꮫakhQټ, E(z GUW) ^p[UD%[jO%fv15W3թNe;3 :\|wy睝}^4ڍNi Tǧz[ݓMᘱ[R|{|:_H/% ¨Q$ DY p ٴ&+]i K)FMI a ^7(B" c#mhk,JoWin($f5C+h4;[+̙3nY-{$)QU/vz$a@G$y@,G)U=L$iH:9$/EӜn E@r53tyLVE-cgEj7œ9$aV-qkHKY, X4nzJ\V]nY\VF&.k;pC`[c\eyV;عtx.C A" ã}xj^3rVQBN5 R`ꫧؑ6ѽKzy c.W#C/2n9sE7¬:biF5ѻD.!T Æ<+ ~fqp!cobI IGnd@'|)H1#0XMV6゠L,q5 JKB0 ".K&<_n | L[77yݚdzsT$w` bDM⪠47Ԙ4h63S৶q%!as 0nYupkAb$D $)%!XK9TZ_(NO N_ȗ"B!/E`8@}q5%Pv4V*TD:øƍ0g Ӎ0A&Jplf[ܩȅeDd:҃4 o-X`M&:#^T*X ZYYIIcL&!tbC)JwtSIo |=|Ue <$ Ӟz_ʄzcq?fL>n-mK` ڃDEdJhVksڷ7œ9"aV}AdHy -b}4!q,\Z`@x"%ZI$ј+TvĨZ"3 #r&.*q;mh2as 0ea&kJ亳 rub|?tQMy JS%h^ɞ*A`w>12x:㲥˰L!H p5E"2 s`d$ aRϬוcc cIo sCD 2v)_Xq:j4+Čq#̙3(¸fPȌZ&8D-'0!ߑS:Uɣ,Z~V5,.F3gPq#̪ID&q /-$SSy5.RF1,Ӊ)RN&R^$2:0*.pn TKup+q9K&&\CP]D}xϩtfrRBWfaΜSì,7ٞpeyMQ-9S|8BFj$[в;$ʕW֭^r!_;;ll }|<1$(8ĥ#T,|42uEU~G6N' Kg!lpy/dDjPA]Z20n9sE7¬^;&=6= / B<$)%j"$I& b;MZߣtZYu:@5zfARN Jy"I<{CMRڅPMaΜaVӬ pHTfx© aB q:_AG?ǧ#3?djvڀ;f,t>>Ӧm_pA T5}·=\Oul??a| ߙ'PwiK8^wA/O>ۣ%K N7.ҍ%B8n_f$(r,3i$j([HuΧꙫTْ0b6擌KR'_w#K#QPZ&_\4' BH~Vf xVR#0#Ae1'B_0!a=zeNrmq#̙3(¸f5$ReE4_ZUAX #č*ȍT7٤qXѺ\WDB U:.pe#Qk4C8t*"qK1cת(/Ìq#̙3@¸f5T&!B#X{Ҳv?բ0FoM--~2tMoVNL bј OO[)GRc-=֦W23>rqf)C k%ߪ G>KV!z!Bl8 nVMp =Mt¨|7œ9"aVq.!Rb ՗l#m[KDV ĄU%q(+ȗԡVDFnk5ŒRWv<ţԁdFm(ܾX>yZ y$q#:IX)!R86a2}fiq<7/`Wi%8Q0/SzD/q'مWfҖfk;q#aP9"aVSlIͣ(qr7HF,&^}4b6\GM'&վҁ89|Z*K.ww2HR2V0uN$'錒VA.'1'7}:UƂMջ뮻:uk 8K37u'C;+WhԨQHpNVgȜ9Fin."0ü9p^%,\2P'^x-q[G8^eX1}iSAn" ^/9q3Oo߾D3^zU<3dΜq#2&¸Q>!m -KK FyoG0`ؚi;FJ# 3]cLQ_Ix/ =wCP0WX7q~?2N:||9e#c%/u[v؜a OT()d~>x@" `c[|L[cfaP9sƍ0&)EM-85E2F^79CpЊZ9\mrPL G)xxl-!{tED\F7ET ҖdPHFA$SO ^HD5v,ʍxԆ۶mۼy+ٷwO};jn,9K*Ư<8<~?Q7!saV7-ҎRK9ShbQ'x67*4TH9x؏6C"68B151cSD&>۷a۝ 3qa[iaٝg8@@_PUCk\km)w x݁]bl沿NhFQ5?pAԆkvlF YSӤ#]#aP"aPq#~ bR@$N-|OdEV&VU"4m"u8Ddŧ}{ZxmCn.S\: &8ƨup/P0`-\'*aƸH3@0q+lXpPT|15>oSGq4).x0Ɏb1.qɻ ,xnDz[Z N_k۱=ت>|]ΰ(}*H1@sEgBE~ۑ;CN#Kc\,2,*# s6KQ*z?cd17 #Famj̋S cQ PĄk3 Z~ԣ3{QFV%$F5WRIOb vNAAGk'pD-XK8IJQSR20_F#ٕq# 0gFUZaI6ڂ;,wGH3x|p҂qn 1wmQ#/^~^PZRS:!>~7%5f=ǎuM<=%'>z.zTy-&39|eY R \9|׆W7ܓ-kR(WY*EDE: 3$Mi줴nin{7 #FaP6#@fd۠)=%$8_Q ƄQ% #j1E,mXy-I)5jHMIR h~cNɥmi]ޥ7IӶ2]B%4fz@#7Bk7"0eyӆ08Q't#vXEw^{1f0 90Uݕ)[A*axv3Ғ1kQ0AbqO65wa1khb(48b8YPg9塖;F=0Ab]_T;k7^o2uHJ b<"u$o;gD}!LMHzޢ3j$Q.*ZHR:R<ZL8|GdKb ,sI>$E$M9I+)ղDE/*7 R =@R?U_>.yW6`dK( unOwR',=(|k 5#K)]2wݺ33=&?B0(iz&sGI1vUu܋g!X{&ufW? |MAa*(Rc(RC?!7%[մURW(XI $ #pNRdMq2rĽHޅ!S*YEZuVΑdz0jO={<]EzsloWXbhMȍx*uBZGC ?lq2 ) K&Oj4pB,aH;[R }r>BnfM8ņ mB=4(U~XfD~DP:5")B&n̔z/5~~u5SۭYY!=S wHR\WX;o*00v srL2 תfoj*fV"}nc@dH"ŕ i!l )")b3>RL;=5GŰ|O8@ܰŷ[:ljN]j΍_?{GH8%h4Ty EȖZcSFfhR2f 1Q6l]G"ð0W(_}`~e~WfP-2/ruMw!ϭ&pw 4 KYciZ~JUهM☡ܠZF&(uxtQ U+2,HGz0&Uh%~,`0F@dPACPc(RCn adfj^{IJ)GDږCV!mI1堂HXCc@<o0l}n*$i89I 'H _9kv:LtZYwV^Md?|6-R-$[Νgr8Ķ:cl"_kr2(lÚ5un7vIlI2Lk6ȇ9&i"'١tWu@Iz::Owm/ sTrCv) K xMd!;#$Dۉ'TKQ98ɷ50C1p3Q=EugPթ3jR\ȇI4*9M CR41Jw XGSI+Ep E9J y(}5_sR죣fhZCDT4Imen~_w]^mg%aȖbFo'xɮ wĔkA3R%H,"BG#o|he .J f7brh[{'ߦ>%4,sh8F-ܾ7x q#yFx3}}XX^yQEg9 [^G;3 ϣO"e>1ce-5aP[wEyP-颈Z2'P޷Iv|\&*C 1~Rt5hP2UR fTY߫|/IM$m8C\~F~QQpqF\>wBޫзM:XlKF@֝AE)"4U}CC|Q:TKJ"Dl% YB"/mh/FF I>)K?-Omq)shm ˆOT+-ቼB_OHPMDo|O18.:3i5FzZs7t`flOČMpagbD $tY~.>w WghG=8wE ĶA2.y LE%Qu0aN,aVM5>uo^މ"5-[aa+|0:YlKFXwAS&[ՅlX[4 Y> T†{QtrЧ:\ [Nb?>-r/HK Q+/esrLe#9LliQ4j? SVsDNR[׿7'}jx%\~R*7&deȖHWd'MGŗ4er V)W#;fk2L~$b x[ 0"ر(&jNR ej>x8ElpǾӺA۝3f#}z5){ߘ`޵I'qJ?|<8Ƶ*#X5JnA?9?/" 0mdd7\vc[oG iq"v3 U$Ӂ-n?7PfJ׍QEG=E1*0-kv?(St5&] kL  )GCE V :d0lِpLQMEcNgKAV0cF7xe.Y502 nن/R ʊÏ~U̍0('B*[wEY]&[d()#t~I_WO]8oH'@u[r27e9E܈FxϏ [^TBFF)7&ySem `(Fp[PBCxVr#}M]羪~땯tYiSVkF\OHj= pٍ&?A4Kw-H\*s;mƓfum_rÙs&L9u^9Ihꆾ wypw#0W"L"]A y.RÐY%X&] .~sLdUÈ-4nA? THܺ3(bjeWq^`k#TnY9’ZlY^- x3$Lʬ,u[7rNoJR2I'Tf ;zVHகЙa6˜ 06Zb-1fi$Y?Slad˟ˍ0(@_$naPYbB~-Qd yBZ$-sβXlPB],VV(S8ʧ&u4T:9OWl2#jxYs%7Q!p TEdd˟΍7uy %Β'Nw՜8zԨ#o߿Xr1c~n7^J_x42"'^G(_K 6u!==K2217ٟSì3a0s ~!SF__b0 .<)!*8)eKԋ.bYY3fsd `u7FG09);T_9w"ύ["1a >>4t3'8-??y(Io2gPo:$ Cd "xk+eP0Mhc4Rc Z6+c m@  `S̍@)j)D @`ܾxܨA}ي0Br"zbnC~sΖ[ΐ-;7e={;6m+|{(hD\SBUُ;e22/"U< $,Yubb[L y=!sxGu=;5a)\fúu@Z_,3ѱ+B>P~֥HycRՓRDh2 ":ߋF`[FHq!M|a_!,p7o7 F%Mg00:ɝ1GyCX #F w稁*d6- ^(ĭ;" 0- TUEU}_ T%r,䵷bp$mx.A.1_͍FGsB߸7B qJi<,VD-'AJiIQxM#in'CR-o$[΍֛ڭ]t3fL߾}*3OjeV5k&#MLbG'oloU?SìIo(;I.Z9N63|M榁Dؖ$_Z8P޾}{`~M%Wi(ڦax'P\  p|}%{g_]Ou\_ IIو%HLO"k m"$na152Qu4T,DTv0`Qaib0ܜs4=}R o[S緈p9T( F}L$LJQS\0Pą~$I;ew"EYġehs8Di58Ȭ&-UF]rSg}{ȍeG߮'c\зoߏϜV?0U.:sJW\YѲqB&M/hoo|j~ 0!+SV5m43Y,fQ0˜Wؘ!/ӛ͍ ykn̺0o)=𗷪f4[Y 6tLuПgӦ3FF9!7o/V^DOF^Y:$1,Q|b xAO=~NxxO򜙉˒[l<Z%@%D8$=5laP@[ 0(HG#myhDvPW6&¨I?TzIChG!%ck;UxJZIę|Ka5ID|BdCW{ ȏRqj1HM$[΍\r~2ƨ"WU{' aj&f(C0/J z`cف}طH43c( ~mZք}򭾾j~7/,:Nm:5 s{vq, u/[w?`y`qo^$}Fw25y;N[Ԁ h0<ϑ) 6H wXf?7&"=@[">.ܖ+eP04Rш@J4`=QYwO|>~I UG!6jUy*asrnR' ;7TIӔ*ڀjTw(1'4J^:W22I Ew2qVunKUOΟKMM!>>!kfC;%%I&SH ?>mQ;[_diK5lLI(TG3± ͖[/+-ӓ{z=\zDP&Jz54{=$na ﳡxK # +1ŃOGa޷s(_]si(Mf ^_;}fuaP# 0(R#Ј.E\.CrxW$)9CA1soPy {Q]h4G!E,Q><<諦Ig9OJPQu)Qfq ^j,!MҴTj=7rźzo8 $,]XդIr{H?*@ܷ 'A߯skF{W=PG]SlQ;>fzʯ؏7vKOu%GKi,gl&|3|]V_ B¡O&{oSw4S]pz. qsB$A'}_RY-Fxpĭ;",涠7m&_T"< o*̡9$ ҨG"|O2Iy ~AT-Hʲ>jw=_HXRe^5nXQj%_ftӺzo}>&$,?.c5)ۗuHN*(EQ3#|0/Vbz6ox El}ų'f}xhÇgh kC͹za)[EoWȡ&zS -r,h5irG7Wt}diM'jD$;\ 0$BYtZJr#WyUJ[D1z~.ji輒v*;=W)\vwwS#f?kNo.NIɔg2uT3|񜟌L7l/(q BP9A-8]9zI6: ݿ¨f[͏z $Ò Qh]!Yunq֝#!03uf16 :5Q1ú ӷ\OE ^ QZBٝYjyY4;Z[UR" TYl Ӎص|RXF|B>c )n"RTD&Q*P<09h|BKEMu s ҉ENg @dהƤDj3YmF~?aYYl *F-ym5QIqucai5̰d)>!ewUk1R]ȊԸ4'W8:0#`_E$29AV@bUo*M+7ӹn8IR$E+d_a1 SÌF|^s)/ fJxl!΁U3[qH-!r &pȁ! +0NXA:]OY: QlӲT ڴA5p71-kv4yՎCn:\#b}ca@/Q+kX8(ԃ81L`2ʸ:΍F# :5̘hD$O,(q9҈8I Dx*t` uL1hD"mjmiI;F5n.DIJ늨ҢD)V~G;)D"n'FVsۉHXfd\`}+,n FR.H1Dz<ոC0mO2hޢE0mnNq={3Fz8"C"tbt1HBG%sFMѝW,ef"5sYc? ]^]f>t(֦;qԋ1vBHu 1.f)NPRX gn-F27RSEXfu$㱇D*_QEp\PP"dGFf+_%#F?PE5g<\"Uv(髤Aw Gf вS7&hVŸfk̟ f aq| b}8 WZn7n CpE}HBj*g, ܨSB?cV aZGacc^&S RvRV7/܄k1*ТLT^%8LR" 9R݈vk:qWac5Q9Y@ I,F7R#EaƸϢ&'00xRpJ I8TX'}Kd{o![KZ,6 NDiCwPӨyYlHUX,%j̎ZDuTƍ0"e0'ފR]xNu8ܤ|kj7~zPPPmM aƸ jس`Pemoxw5^zq?%},0zNe^0*FvU&:2[(AҶh `H iM4ZЂm iMh$\% M p(1DAQ[w:^L]\ϙ׻z*UoULe?A ),i.OݾpεڨlC+Λhնh>,I7^ULCf!Pr}ϼ_/>JO"s󾸮hϚDI/|f#lg\SqDdTx\&bd}k"PZ)D"trIEhۛJ'rR"*ū|˄ "+kCDWPܰs'Fwյ߲e۷gΜ;v5\S]]ݾٳg333뗑_^G"Ao(`XpM cɘO!n-H9(\O5<c{}^d߁~AEQ<+ ƍŲ? O=[[ D_mINCD#=)1y "˦L2]?3lذ=W_>oURsٱc:S=h_P=>uO?sy[j $YvaL/ 9܂'~8lF .lnx}tZ$ݞ\3& 6W:ew6=Sr2meO2Pfy̵vgAۄ&uTU}s#őXk*,d Ӱ۷ ?#<΃,E8Sǻ/HL' S@aDPQTsܘ٢!%IJ"nuב2tZCWsE>v>6(N6ٳ_p}B~~k駟ԃ?c6‚ pBއG\8+P;K\%>y/jmƚhLt^uO\E2TP6v\4|T`? HCw2duA=9DJHݡpngah.As9: q:_}nU3£a)552H^@D^rIZI9('U]K'@C4\A>'&B@#!z~( $)>6K('D/9Mgh?ͦU2[N{*o??8p7[WVVN:511\6?}Oj?N]F pp?vL;{N \\a&u(6Ova{PS"Q!D 0a}^xOW;]۝cL kՒ^O۵ Ihjp[*vO34iJh.aX5OGɿ7IJm8/ez<F:QՂ.'+gGgf#4"\S#EII0|Mu+E+/%ݥ(a(s-y>!d*i4oB7DD=(0yBD7RoYz+u^Ro}jt66GMMԩS=ztyyO>k<k=?ǎ%Ho'r7!Cv%%*nŦcP.xبm),lx WmS9:ܬ><Dh<֬ܵiQ'iK]ʚ|5D;4svZ6FzzzY||o/Ȝ9s6l/Xw+Ov3fLgf#>5,H_11ڈƼ%8IJP.M_7"I G8M;NW$d(وE5) b]K(YHitY.|hlDhi_!*[W*T5QyPRIœBx(ݺaHTw+F|[C-v673a6Rkj8:\#ngXv|B D(#B!l8J翠M>;Æ {lСܴiϳO$I{mOǏ߷o_Ys $\SO 0x0f@6lE)$Dl63dҦ,P$Ac=-ɞ_wYc*MBؔѪDh`d-fJP^n`@dK7f x-k0R/Fw nTvEŎܹHJ|t0Ll>SD~233O>lK蠩#:X(C So%F)Й k15@{DLjp=J[Ft˳t>G6!Pl9sf& NdÄF3}4%[VяX nYiA@g r}2LÎj'E’%agȀ]* ЀR- ;xԽO)#< T2+ܖN|Vmlu0Mk+qf##x$R?։Agb( _l*+/+_a< @8Ba4RQEiDޝ-dUgob| Vsfw$A+BznԝϹ RV%hG>[۾EHY^aJ†"\SaB0,LOxBqSH3U4#fRo SQL) ҙ,*9 J+ZEtWrsT2*yJdcl{2_~ƍY aA55p8.͘ь7^j"`~Tz-'uŊ0śG v,/JiD$T4s쎩k"xeMpf]jY}?q,㮧3Ehس]ry[,5W0v=%ąxT]2`)Rkj8:& e,=Mbn?)d4>D޽(iE j CR~H v zG=+LzÄ;BƋRnorJaᙍp aA‰(*X]a.VILY-hu.y=1.cD7CJ[TD-?I!gdkXk+ۺM`Sk {Y{p!F߮ !c>»;a4OƍVZ~Hԓc~Y- {ZQIu4zG4*5(ˍ]Иpa)55,}rīTJ^zVWvPƏD9^2F.)k˺ Yf2 9IU< m#$"),눴>kY0`Aƒkj8:l]@p>) ^BG"p%˫Ba,cɏ]M(锜S<)hDB>F^xeuۛTTs'ؚP06JK(@A#g:Fx<Ȗjkчp,_\0?DdgM,LVFDEtTf#,EXpM G Cļ,":@VѴV%xr6(6&l$w4MwSlT񴒫D??EyI;XDsI43BWl ެ!I+{߯zQΉzq`jE7oej8{ $E'rͰX'Jeȷ+$:._s؈Ex?fj` UP̢dhC=2iGd-eDx\Q2O: B=?\5$5lfXCi%%2ůXw+-s.ٳ?6%fiCF˖- CfaOp:vϲn)",EptR"AGX"2G>Z*cJo^DHVQnMLP2 L^Dr̗;FoӴgaZv#/'Y26YMQ#EmF)(<\Rp aA55-<5n aHVUH!d#ga~>U#P T +:z%90)PՋ׬U2g'Kд PED*ylw/5D$۷3 %>({{[_}\ /c!5"$L}>% [՗/K"F8:V(23>LDL$xjRp aA5536Ԫ1h-TODn3isfU<6D m-] I,:9MSMM&=!6/W&*}2UeF; Z'ou\}رc,HO 7xWQqiὐFS2=Tꍥy"1r""| tGa(nCQP? / 1/6ldXin8N<6#j9 `=K^ qP 17 QcYh BTJLKan-$1_(",Ept(mFc3qtp0E%)֨9K"'0>FTBŔUr~Й) D]!`3 qdݬŸOoH'{ԩW79s&\S#: <"zFsA YkLIKY[o y$l|9#=.GЍI$^~e w^(!ڝ) k3?kO /hVҭ |x3ړ[v4c\e5獀}yL&p3_f#,EX0p砊 &)"!xG>h'j!`BsJ vO@AG/M':~yso9ibHT_F"0A ;19}3gδ_ݲe۷΃H$7Д)S^~ef#~^WݦkzUyO c$a& 8w&駋po9A`PP?ol@AF$]|Dǫ xϧ SA45rNՌIzZ95…F8Xa6a"HB1JcgP(g#d8~RTp@KH'HdC"MD?_[v+&Z/o<9F̤ "n$ʩ^Ht ,A:'q:_}U+Y&$$_={W}iӦ|$,H+؃=ը>xևNmE2s[f޶ԯd$ <<-&ਈ%u^X`@$ ]aϢ^d$gIu8y}kkrLl]oNiY.KiJ !YV_%oqN 6z3`6R!&ΨXQFiWJ*cԿDHޥ69jx҂Dԏ蒊o0{ѣ5%zHF NFbcc?W\ |e#---Ç?o,HcAWӴ8Nh9_/ XL ͪh<՞ GD0z $ DKx=oo8p`a#SL`AƒF8:rvi7<.A.Ʊ qA 7݆U-MZeDV+iv jjN 8g߉mG{`j(!p>;PQ,I?2O'է:D:E桛]YaLïN&d^%0`)RG٤ PH(l2ut|kXyȔьM+%~|J"q&QC˾EoiI& 3: ATJSKjXFr9$tDzeK i H~~~߈zy?r f#g&<ڥlI!/6Wp{rgFK3L %zbq4,Y3.m[vv쏙.`ӐEt8M0( CnĂe]!8 z;2J0ŅXµPG`RZ$ebЙG1c7{-bb#+ @hZ6lV.ży;eg#v YXdE%DiIՓzmZ-{4J} qs<ٖ(hBE>bby#F8Xa6с6i[@f5՝u@OҕƇ q>A4"FԔ7Yp\M: [!ogDqb9Hgt*6pO;6II]+NwIR,ĉYhq{W|ƀX/0;%hP4TmH\ǰQYF"'TX.,,6 9p]-w2&DWc'z6 NƖف%aF0`P.y.l12TW#)Sf#,EX001`F;H%Kշ)D9b=JXVetdKqӮ^FNA \³soMf{jy0|VOtf,XhU#{l f#.&JnK.WO|t~͵d07fU'&έ}Avl a6,'1᲼Sn0i9D4!#%GGށe3zEMߗ02B$T)#Pz ldJC]r/0%v"ĴlKf#&tb?1^5իcG( h,D0N'$鳕BZvʈlOaF"4YaMЄiSTYSL/7Eڋz8p aA55+<ЫnwGOՌSefRf}x!,`Vqz.-pDOUoAB8ԂGcLu*&.vU*T$m'IZ޽t[[]p 7,$-S[m݄s-mEDGIAy #LVf#,EX08'}[ NOy~d7yV^G+](gsV'sw$utSzb 5(F|G()%հr pf#,HX0LB}eMFc (QTc/qh=sUDdsuR,EJP"veVXoRr Wl'ulUb3 YV4 7cMX#o Ӡ 0iH] :ԃ /_)6#$iw][';0`)RGڡ!H-h4صȗ.>.yݼMwTܨ6r?X_-z-'QLd# &d싔I 9i$nIll ;6G]` "i?M]ڦO [tKHx%.@A{>4RݢyFZdrrc E/>-63 [r^ϻb|vA9U:%wtܻ tNjKZCZ ",Eptʸ%PJ8bE`?/QfH-t7_ӽJc>72B\L`96ǁH(FވbCF)P{V_g8p aAy#(M??YB\pC@@;ȿWpDt$X,SGLIHT*R)ӱ3q X/!oŝ%ҵ#9kÀ2  BcF-3f ^&w@N̙ՄdWC=HB U%ʊK"F8:Tވ:B`!"윫zF4* D0j |S?V?r[q޷WhF6 ۓ'hr2'eZLDf#,Hx0@v -{#<5#ƶ*V4%VXccƍ2g"icRgqIt5; X`5A:Ro Wzd#F8X`6#-5/a}3ӥ[$0k;jP5rs|=C'MTYz%'bʐ1W ؼ\Xn>ͩU/$y`ZNvq&e5L"CnDc*Ի$)C>=,}r}u>R۝W&ev݂U1Z*l9]f#,EX0`ZFB ')(F3zvǻ=Βa'$$s Zh紎w~^SoJC.ROGW:B:I7eldp0`AƒGX !šL3㯫Cf6~U)2xWGNbed1 >`6daanvGV a.AL \!똘 F0+1G-Ex!#;=,s""I>ii!j35~^Ka!<ءo/ ៍iK[e6RnOREQ* 8B"qXjdw(&1"*1?@u.kٌ!mNcv>G1W濠EmRhZO3k|P`@J~`6QBT4R Vy}ƪUs*"kmP7E{cq<8x{zz2q(<~Xa) Gfd*l$w89hfE ypdg'=ULuĚ2== $|N;K䷘LH %ZeŢ5VGt4 cI 8+4lKf#%d8Lxk9d5T2sH( VYۻ^3RޡKRhiu yt5`j/NQµJe; 7`6 Of>. iw&,Ş )nVd봖@$px#/\m/ڻE(ْ5j62<#&061+Eِ@[4i7QFGȘr\po]{z357ys;Vd%(IS':N]\ )",EptYCbццGJ&BD*ѫ])@(!#]>tou|BVTӽpp^+d V(d.5Υ6H]Dϭff#F8X`6QC O|;?i2z_9}ogkq ;$3w W׵[7]+37+W61_=N癔?9s[_>*[O~isF̱uؗQ<2DS<5; 1<6sѷu¤LΗK"F8:\H&Y:pXb- ;%AunZ`izMFrI9eq2 Ё4>7^tuWq`6 +?_=NopqQ}D9X@BT$ʘ0! Goaᒇ.M5 (hDʤNLؗ-?W/Ck$h0f[bnk+ڸVq?8,h3Tᚉa1}MX wz-` J..%FG}]f#,EX0Xl(G&$Md#~3LF#qno#N%ޡ Co`W!7R/ɓ4|NKeHYzM--`XQOȆISG:qpt0 7ieXQQR{ #Ey]s ݀[|(ҰZ IuX;fcdXlǷi<,sVnH4z*YLW PcKI Tԣ$Yذ/7 -V!;%CS^SZA}lKF8˨bYI\Baio:b"RLz}vu0 |@g>5DVE%'k:* [u82ł r*I# [eUS>6J2?S}=*ȱ޸# "jTD=Ϥ協D]!ML/KG:>S9X |7voȼ3Eecc]k.ʐ$OV͢YW]s$ -Vy<@q_.\l}~q^zE)|Fz>raFFJ-]Eto ك4rH2hcp-%,!rJiэQI vu Py*9I3 €V7,[Ɨ<8oÆCFv)E4WWy1פ%-*fS٤^ ŚيmLJV?(c$P4 pъ\=CcVnyC'|hEgħDR#rPR> UIIp:W*AI21z Njr{xdB~>s02YvTP@x=QoћF!6-q)k#E7!`)!.6-an7%1AyT(  v"F] 9F8:b"Z>m6B%G|ߺô2o~o KF,RzBe0'dXv3ڈ x 7*.Lzf}'G'/\?-< #N1Gb(qTx(ªF4iC}1\kp.D{<kI̊NFEbb.QgX$JRGG Q[ S]̧@$jHB/kvC:_f'|K!,,@.e!@R#礑d+4S[EN)4Ao,H8o7je.q;ɭ-tK 07xfՀ+(M&.q72iFn(Z@qM' 0X`0n/?5xIڬ<3!4g˪(6TQ^Inl\O[=Z ^S<ׂ˻Jm3Q0a6ƒKf#-Nn*eTy0IbdU.T8B|:`|M=5|Q.S rdj(DOQ{j戔RJi-/Ѓ$z}B;2 ptD5"imh4`|3ZSIqN{n!W U.&b}ާ^]͊, p4F'咂/HV-D"t-r7?>_/?jqWJ|Tt4!3{}MVt6dufoD)jJFZbۅ@J${h*$r'b#3'JXFE"ZˆCJ顇4-"0aJ D 0[);zU]jpAQ nI#FxmxpG#5K%F|wO9"}3M+L1wnwu{ aYe2KԆ *zx YֺՉMEoߜxZE{ 2dݎU]I}]5nu!vpDhF/VOG]i B)ӹ?rkÔ~Ӕ!P݊H#dAj4WdJDEM{jfLQ{r.:ztU+/PT#ԑFxc5N?w>p`]V"4Byw.H.ydBU dmf|e 7ޒ.l9CBR7 Mm]༡577;zÁѣ{i*ZX}UYСî~40I2Z28o,Eptȣ\DQ^YÑHTSrOMjdeɻ:NІ-u. 9N?ѣT}?qYI{_-L&|4f#,Exa)B PLw׽9c|DBq(($DTS4zfP,sU!OJDH3oПAYYII٘y![o!˷t[Zz}fْ%v/VӥK /p5[G=xW\q~_KNN޽3Cy`AѩbEe^T[g-@*qzȉHʰϦ呺!\O[.aҮ϶HC+E]_\/ji>p|ؽ(Ye0;9.%H.^>H)- 1|AJT+4!<㤯 h#WJ/~#@hтi vpzg^?T=z}yO+H>5'[jugNpRxや["5a -ݠfI_0ēKXDh d 3aI>}CCJ%`_ePj m`Xyfp~ŞP' uw&&vn)9ϸf cZdYugy 1`]Vcyh%qaF,M!5Ң Xc+z-0:"A FڂL_[np)"\pYlMc'UXE%FFN$~ܪ.(IB XCS TZ]ġlEak8K>Unݻwg}ǎ~[ MoСC:ugtէ~|kA"%衖-[,fbRxや[m$l;U^M cbC|_..t:bb܉hqţ:Q GpHBж/C% p3a0$ S^uq#v4VoDD$ )ȚpFz0bh7Yb?0.9蘿lK޸R[M47>'pQI#x`@tb2a \'4ᢊ+9+@ e?V҉r.p|?K[:vA9+y(6H6H QHa#ScʤI&| ndkwQ?3BkK4gٹȮ>}|昐B;DPRJw*IH䴱?SM2F X9M^}O$%ۗqAl)-#5hfBi7wQ(yoһ _3ea5ۢGLQhj[nM?\ [hy+uVźS)?=%'MLtt4"-_lHS|F_9˰RUڄ!}ԾA34zrwTLIBJ,ѡ qlK޸R[3 ֣FO$ Sqȡ>S)^W8ȩCNZJ^"-{[DUC De%t=K:$oS/eya֨#ԠVPu ||uv{| nܪLl_ЁJ\Z [ 2MHT zl vϊL J&n~\kkXS7)*l %4CfL6ޜ;dzpxix@3J0*,=J󼙙14Z co6'D6@';RrlK޸R[M#VraJH|F)N_y~JQ]R{7h%.}:[r' +ShԿzrV8@^! #sVF%JF/7jbr?S(zV s3 /d} VMx|jȲ}-b\lM)p_%ƄױʆBw}cEсj (B,CYr!te]FMI|CZ 0B kYlhqrƥ F6ӘL G(fR#f;r|A|c-x) Antr&?+h@v j)=^_A"]VboD#W-&PZF*oȑ#͟G|?/?O+}/_3:xsg= VCM{3"iWOϚ!V|j@Ar(z Ί7M M9PD:)nk:ȈALLa#Q~~$!B1nώ[ű,v4EXL!%_өv9zϰIgmQh夬.yR07\p6v2#1(j[ٸB<^#ⱏ9~#Wx{kc'rN"gK"-4ѝ8&iDa8ZL)01sJ(NJ4uL_JƒcԒjHMc#oۻ߇]~nƛ;?'*ͥ.?w왳??}䆲WXO.HPsH/h@b56ۻmjQZ@4; K0'rl̳w# V ,1aUϘ0ةVu0(SB 8P'9xd <-+`&ev;HH $1j`9'U@=\p6v.(#:9ltrWY|Cw]GW C\Jd]2'D6RFTرG.%HRKB.vr 9Lfp!FEI)ʛY46:NCs.}2byxL g#q}rYﲑS'>c= V#M5CW{y se";bc~ ;—FYr@|O1sGm[ "ÃM(xWTȞ{SSm @p "0t"!;)9\;Cp6'|wYh7ϟ;sD6^y!>_gNwvg#okW}{Yv]p ؈d$۰>>ockCpct/`5J/90-ĸ'%#\ԅq;t`cjhGمN7,/4rD<4´>sSSN&c6|u"ud(qE -586͓'䱥21/)F8ڃ7FVLB R&C> JHr7d*RJIu?OHNL,HD)gmI: ::6v 9*TRtfT>]Z g#|>93O|Vťp馇>9.ٌ(hK7)XI7y%ՁX]-?@m?P:IQeg#UZs 0eOxl#+ U[ug#N( 0 FzDĝ0ȢEX @06n9қIj ^=xlKn5M C$R"Y%.Qa5G~>rN-ս|J&'LSU/@[+6Hmה_h.#(_ns5H'GK! 2H%9g#\;pA­Ոtd o6&yW{5t\M:]u[i>B 41y==h큟CR!.Mt{lT7|jMSW*IqZdf Skɂ ^o且9nGڣ [1Wط9r6µop)­&\5&0Q .9RV)s`0*yR\&\AK|FLÁ.a*IѰyJ؎j%2\$wM7ft(9Fv;Sl/eԩS;5}=u$'֡C{v{Tٷm鏚p6cå&[Bl5(81,=UzH1j >8)1zL$ `qN'kP ͧm#C6GM!R):nt-H걚&IPPǹک4FFxZkd՜um>FqM\8\&DEbؐ1a}j8kV;_xҐ yQO%л>&#z{zb#zqbNM3c 3IJO#%J}|bs!˜P\Bt*Hq7aqG:)CBB0(mس*{ K &H-Q 5pq7n׼s͔jU#vlnܪ"_,)XePVSVժaOAY.vLR= |<&}FYl.]N'v՘|UAXc$OBv<{r ~55.h% 0SJrV2%Y)exZ6QaZ,<g# edwީ|CVk ֯_SNjKsnzI&&M`WJk>a7o'g?;vvݻwc$ VZѣ/_d#qA­Q.zղA1Ыañl^X!].&M1 R;0;u>%F#;&a["ƛ4گ3<*͉ |{A/)ݡaMDvGS*ߢ݄Oٰc/9K@O#ڪTir6R{Hf#\p65lD %Tvr L1 i2%ȩyGJBLIE*$$ xE>V-iĽO"( Fn$[oF B+H2y\Yx'g#Y|՗'!C_ lY^޳L`Tdժ'On0tUvS)Ye[E贖BNK kdQg$C-b(`Ub$1׆b&,ēe(m'!VrWRsrq7n;l"wsJR|"njB>68HSM%9x$R6׭g#zJ9t"c=I]` qLI!g+*)P&ɑ9~&bqpFhځ;w۝;w<:u;Tv;{wqUZOJJֲ:,';Sr95ח>ŋ_ە>316ԧGM9]Bѷ_e,Ydrv2iԨ… 2#j9a-<.[wO~{37k֌?6ZGl ȕbs<3%pMhгBh4} k_Lj2B'CqSո^ FoFG :U@8uO]oh.zWWN[B|cdw2Sf=C4 bOSqa)>E "r6RHMg#\p65j&+ VNNFr(< rBIOjָ)L>bȗƗ;6{$'ђO7c&PʒL `Ciy5H [kr6_P&-[d_mftldUO|…c^ ~~P), l n5L&(o?%E5 9bzۙMC붪v(h P&v&aO W3xNV5R"j]G}&du ="2rZ.N8ƭ9vr(&!FMJE!Qݵr GRT8 ItJfRIH8rO-4ɟ%g#eRT و#n!-H7FN\~RNSN[wo͚-Zϟ?~ĈZA=zt?tg#\p&yƎuAe^$"br56$#91hDyۚjD$$GV Y OT iKm 0)3?d6{S zLS7-aANʨ5#]1eBs$[h^&<33`FA`Fj H-'pV%Po찚#wEa YtGI9yz̡6st$4{.RZ[>-qN:qqPP.RQ86'l n7U#fi?&9IKʖ]M@ ="J9& htu qm-?9de>XaŊ; ꋾgY@HbCm b!@8mbCSG6/*t 插=xKn5ڴ$'$G҉3x(Ax J -r'"dqQ(vIr iEN_!DNEζV#, ,eGKG=Ir6'p6­&@zT6o5ƳZEuh@ĄHʀ:J9K9f "Kɉ]2u$*)Fa ]{@-qc\(ճ uDzH$FR03հȈ|U3ehBB{qYlk8R[ 5 Idg}N r("^%`;\weڒto80$ZN#2N!\ 1|N*vj _Rգ,Wl7O8l[q3eűN'l{p47ksè+ØШ aP i⹬Oy6c2DFz 1Lr{7d^JA7?%kk9r'ɹJhݰIDC*`[=tb"CiVq12b)i+c0e9DT*zIb}ր>>SD~ $uᒲ|  O!K"1kC^=Qwp@Ѩy!w7 yZGT bDN㵯b0ؠˣm','c}/I@ݺҚ$ф Zj=xꅳn5gفʆ09ڃ7FVI#JdDRee9K@#\ xhԁ Fz}#@qINXbP89~DɶJ^K*ᑭ4ݢ8D "!$Eq6'on5"Ԙio7K4zJӃ+Z`@F bVD*LTo7b'Fa #W1>Ϸ )1BGA))H <~Ř1=uⵓP衿K#X:@zeH]X^%Jvl=xlKn5\;o!9FJX`|6+nSP"nk)H]*@E!*BJi"JsD)ʣ6QJ%x# g#pfc;.ƀMZfaڰ<d Cf#0#R)]aaҏ~tHYu\ }8%c3Q?e:))&K`Vk >Ė2Oi",ϖMH}+‹pd$˥~ݥR3bČYl q6¥7%_Jy+e؏(l$K("zbm5xd'983mED$S~4CfǨJN)F"ghơg*h(StFB!3Ba$ " ֳ+stSw^[4k޽/n9$nTyۦ >`F&E&5aZy*vx5YbaًG elal1NGb\%~~ ut:%6]ʄ&)s , g x\;vT^1=JbծRQ7QbRޒ %ݫk)|Aۉa%:UBiy $ߥpU~#ܮ;vp[> 7­XHw(;1t'#AYZ/ 31/Gϴ! d!}zdױۨ}W8s΃a-uF(9i2e- BV!=݆<nݤ"!$\|&u:)N';[ vpڃ?"ja_0q)P-[Iؤ:8b'g $r"t\>K$#y}%4.w(3^:́3r07O8l[7 4M>}]: l?<6̞+8 >.֩\, FZdg*mRm].t#&.}$+K"¥w,ZU]>iϕl^cզbU-ZP,<916N'epZZ_;kp5~#g#\pyuб\ RaZ:0RAa/@&7Yuy]M#uJZ:ceg.:H9I#J:t2T%b' 3p6F8VM!FWz3WϚh+mF$LLVw .-R(adZe-.^}1.) ͘Q'4gق" |}H9]~8e}b*~_5;/tu>r).B~mPGHNL2Ӌz^Ҍ8[7FVMNR8;Er)x}J*'DLoPHOt]|HdD3bR@n'ђDB*Z(Py+٭4!uD '"J6Wl'p6­[2堘hRSp<.Sէ4].r iكHs\*1B/lw) u1ɊmLk8U.f j;oEA6}.rO)Q\h$!y: &',;FQ ĸ58[7FVC0E(գAۣD!JW?f鸈TR!Z rrF𑩘T >%TƤ tg(GKO^ihB(Ŵ eUr׍tF g#p&5'PKKꌭ]}JJ:;Z[Z:"ĵ#_Zy}W$4R=Ƕ5ʜ!h257'2lRa6;[Kc<U?;wg#]g(޿b͢nnFNRCa, @m eSHD~h! kf?x^<:>El[HŀK4KN9% q0J^c餛Vh szq*'8쫯ݻw z_}7oS +Wl֬YuWK./v-X@GVRRiӦVZUꆷ\oV.]ذ_|Tu,CzڵKM֩Sv7{7V]mZZZP[߮%Kh4nݺ]p]U~hѢs6 [[-$ĪS;hZm Q3i;GF|BB\!bNvĻcJ rr?ƙBqBw"+&zz(xV9GVlvmܽaH   EOWOvHH?_uZZѣR_I̋*Ƹ4SI<10~b t<зְ:|Ѯ s[vxoΛ7M6={lڴHnx~kf~+**M&wÆ p6f#6RH9" b$;ǻըMə$ LyHVRՔ]~Z!< u$wg=LbijL3Z#Z: % F-HBBÇ]PP0f̘~ZbEtttMHMMT1/\rȑU=a˿ˁYYY}]nxڵkG[4ir 6|~W6٪֬Y3nܸKc+ow3msp^s&%%P#v_r _3ájU*Ν;9ႄŗE)`2Y`=bĆ#vZ5mfnfK?v1ȖY[/@pk&l8:C`OzZˌW1bdPEi{~~A:@+0:x&fL{QVC`6Kx$ܰElaÆ? s[v{nզ|{:\Ŀlw7_ Λ7OǏU٘nnfrh*-!t_Q1\;ɟd/~Cr)֦n!)iwӕ?.0P]O&QR@8rD$ŔS-!dRHvٷjlR~Ż߼ aJ&|ܐ-Z\|0ռyoW0&m>W1)eĭ:lo?PmL U.o~owղyyK.]zl7]'N`lylݍ~{9ႄ6Bzhyoi3WnZxA)QH$]h4Q|p-x", Q\^]\V7+/*/[qAB&0]d#)29E`Oj 42wSlOuVŎo͋Ǥ\gM9SNշUpfW]sIS0lZ>>>jxL<[vp^a:t#vo2_]a5lƿFJ]Zŗ_7n;sϖSO,t"gp ,C޼+#BڕwL SсGD} \BoME(ZZNIȮlcǎ~aՏ?ӪUVV[^=y_N6rښo|]|QF_|fn<[7g#j9QN.PJ8 0 IN#Lz$a%T{ ted6Ck7FSSH#x)f2- RFpRɳs(188a_~%{qûTuă2ᆱJÞeX2337l\.]t# 1]s-~z~ͼlֳ(&&#v+pڪlFxや[ ~_#HԂUۺ8\gaO-X#dO?m1Q'/Ahڨq@v)VQc?B0`2x %-`yuJaG+v)4&ίuv 'ݽbw&7jlR2__o$ 966rM.wlہmeee7jn̙3Td#ةfW]&%%z={ܺu o8g#p&PCQ |J^;YA' )a)?Otݩ'?I%XiKSI\ U w$(#VRx۪"-\\\ܡCz<{?~Ynbccck|CW3?CrrrɎ;ӌ>k-~kjp+o VۺxoWJJO?4|9QI+iiiLi6l;޻֍䂄[͵aðh;'TƵFǢ驫f'5^($ԧ&NLȷ2@SAު@;cUٖ6y.t᜛q592z:wIalId`wpBee6:f3^2n>MO>YfVr۵kvnn79f̘)S-';5;uoկF]ʖɮϿjwiZ77nM(D"G:^PI>!gtcĭ)}DEtQ a@^&E\J4%'\S*ITڴYT^O:_F8Sllmaaal |oͫ}GpB=4hлwK.A=vmf.mt:]^^$M&Mb:gϞ{N:C}o.aB膿]Ufpު)6olpvn}kԨQDDf>CQ%M6u\Lq6 [ȑPIB&$gRvXSe.ި{.E ˬ%jd${dodg~,[jX al$ū>%p؀˰lv,RU)#eZ6>n: 4lAZFd7Ν;m`0Tma͚5o77ӧM6+WH?5WW}_${Vuqp6[u#ߏB RID?P2:y~%QIJY_x!<@0CdF?i."-xUϑ~J}Ug\@SIVnqWQpA z9S!a~*1e(czёJ+Hs3DfF"#@byqwpGx6=]`3%EuhrtvBd#!M%^?}5K% !Gƨ lDfJ>lal0e&zI/Clk slKn䪸0*d+$LN#F"!|b4r9T ̓ 'm%#CMKr8ms?ʤ@HX`qAȇdyXzzlǛƸ4L*UD0+x1|"eDUUy,F2COu{C tedH&9a?4m7%T&X=V-lkO?'"HP7eEmlG5-ݧp "o)?"b4o^'ҖdJ0H:2"* h"Z÷DWv+Lp]΍y$jemlqS 4ȐS0UR`5U:3w×X)yt/@KPGo4!/Jh KD#pP?5v=_Fu6b$5RNG;&AR SFZb(rVrTh GE(. R~"ZcUPg:5r߮m+N_~xs쌙t>mTQK./{k6{bb6V%K@$QIPQV/qa>C'TRu+ft_CP=5Yns!S_z|E6!yry8ǗH]f̟<@(Qw=*Yi-cAD%eu@>웅Yzl xǬTUa/Q^)HxT|tlplZeȍ⣃u6/|HJǷd I^-Ɛ`/WHl,8b/m,Ko*R XB"xHafg }L5; ⱎPьc\\a~yF# QpA*'$XR`E_˨0&[Bf#,'FjRb)QړuOzjʬ-"CVQ̸33]W'!KKWx4eFa#{¢c 5Qُ_ ߫ dl-g#pe~v&R[ji4E Ĩ1᥍_1Vݐ ASF&1G}j0DHRT3.PmNc?P@6Dq#zg^ORFіBP"trH9C76!?f#,'F"LA 2iMZ1' 4*Qd y-$$MZ0V!/뜜IizLd.򑯎Z XimN?AjmL7U6y-2 Z^#,WۏCcKXFxic1a+ª}J 8Mb6ywW~7Z9D;pQzs@E!>($!"5#z_(aϨllD/W,Wk9Ǎ0a?a6lUe4NAC6 6C bΦX+t(O _9f]zWպj}]{q_a}yVU09Z/oN̪8/HeTx<^#6%%8"RR`4WÜ}ԯHpto==2᥍lJq = Бnz?Y'hV8 HC &X;&QKYA. .F͸ڭ#QgUu#kfU+d6bl6KDJF#Y魮Id+ikdL_NBRcWGqjÜYem,mzG! [&f@2l/ P&e md/lH4-aaX2m v`$BI.zF{ 9RPVZ YC4DuZ!yPP\u=d~s5;^524êlW4f#*1)xCݳ&!=eަ%TceŻ~A`Ѥ&]Ae9uz(7$@G/X>3Se͍^uQq#,~vq#FXWi +wFt$"- вUWr+MKS%-%rF)19n+*=;?p`SlnX-#ͳ*1ƣsxG yFT]уrYX;zђ3ڰ%z01^X7VU5ꬮ~P.LeQ^@+ N"@q#d+!_<ʝ"FT$HUEOzi{}HM%3a0lVmMԢ/"%UșfVkLajkW/ѩ3rQ@embv/n. }+0_GEięYe t̛ok҂2w=$r8""n7$bZMwK=gg\!/m,f#lEXSp!DE\"$!RTud1q A*S}41(H/bB6P(SC&Y4(ZEzDldqKJ,f#,'F$5^:!MpO=/(Z23>=ײaCL3gZRkG {6.tEz^#Tk*Lc*}ԟH )xT{kdc9WB2U?у4p8'%,wuaAN9ʓ_"^XF؊j#zԖyӨP]? OW?T)р5\%w%ZF8ˍɨ1xuE|tlYj"pf#FXuĒxmb|PfݖswvUǚt'F HH#{_Ɖs~$>-4 ½Z.4H#ejaneltʬʼCqvCRXz?sxॷ3#ս,{ |א{bZ$u[%UFxic1a+ªuMb$ )DO@ABMfPzKq&~zN#;Fň?(8 ^JSF4HiWSO7SSgFX!sc6†琺W@Xo1w:.W^e4TPD3{ΖRAd' ldHɪ{2ih8/ny7붦856z{Bo;<3[]6r4 ,6f-zК9I^6}Aˏ.I=?f#+f6ª;Lщ=.I"TQ<tO=vQ mk 5<(Qo:F?iv&֌0Vb#)Ve`+E}|F`d0/Ȫj0)C&6r+FRL;ݜ"@ PM( o#`tBB*)UG=PhԀkBKGH=g#5y\f#FXu;tD umXV#Tz67,M3Ƿ6.5S2예Y@slfa_q\VbDf/(Ǫo x' "nPL,j7IH!\(z9!4&+v(nSM F˰Ku0'Ο?ѣ;w}̳~ }[u~m۶-t~#vz?{};wc7: V`<|^292VzUj9F|.6b u9N' F$/CJ0tt_ߒ4жѳF/6$`} ~%ԜbMNue6mj""".~UÆ R⚝|&v͙o3l FK1<>2uy*[peTGsf,DC&b PL> Qhq +rLS4<-7YQq}ϓsY8馃i &Q#7Wot>39SUhMdiY0Q樨(UV|̙3۷: ]ܡCߤ6C2ν }5pBWeΚw/Le2wzE~y~5i5Cga6ªo.Doa$cۨ-fVxV%#8, ;6> 2$>>fOZZC˴^ȊȪ(--U-l伞F^|Ş={^o>5Osϝ}9]~mIIIMyW%.;y'=7빟Fomn8tf#zdA(K4+Kq@[ Ҩ%.JkFFL 9O!h nsB >Iٌ~* #Nt%ʕ13i n` uw Gw7n|mIz(==&aSw-X༹zӧOv6?8ydhm^uw|>u;vlaÆ8pѣGO:Uy=79 \0`6†瑺/Vx]-&"~m^zQqF@<1UqMXr̈ QK$Xv&6?rRB-p4~s"ZX@n{-֘1zOxݏb5ĉp:kwldƍꅏ>h͞5k֨{-Z/Y+?,I\\̙sq?ϵFgu!u^#ױcDz2uP>p^z3.;y'=7ޠAcǎ.zozݕ~믿8qb^^YꕖSR#E!఍d&(fC8L(c ʹ= |NK;Jy؈+!T1ʽEu\ $A)Ҭ:Eyi"Ә0QhIV>gϞ5?~x RҤI$˟%}jڴiqqog#ZEEE?ѣf{kB%w]ty7N۷UW].=XF.b6†ߓV'd`Z9"(Xys0kO I`S?S2fE<8WLl(,G .Uz9"p{vflWIb$)pk;y7v 03¦hD/ ?ܹޱoVÇCTGK+rm6}^6/=oСCC8+ ,kt\r_5rwkU}̹݅uI'&&ﲯ[oɲ^ҬY3EQj:^)lAiHG)&QH!"{O92UD'4 59AC 5gDKh=$ K<=Ŝ!$b33PRDuE mT|5HF!V1YD4 fгu | AL z<ʂ oQrw ,N#M( 5k\^XwS"aNݚPÁK hD!M}'Z,.%Иb6lUD99hRA )ZPEomSFa2moCyFBʅ4|08 oBPf=rꉣw^CgV77R?f#reWT?tCX7 &{Z,x/j-5T⊈Xюǐn4mлYxЫYwxѢnʲIp=nl6f#+Bl;;R@B4ۉila$;I8eFutDF8nwSVQŒلMVӫJ0I0*(:9ŅG.ܧύ֟JV+\(θyɑ견Uq- #eL0C/W2tخ}:]U\! jhѪiH^3Kl:SY}hתF#:ܲح`UŤbDKE@{>Z~_BUU#D^X3aՍܮ-zNyDmez d2%x`@Lz/#*:STTD(Ӥ^+ PsmR3J\B#/I&Rlf~`lVPWk6M{Joͬ| WuUfn"λ|s] k=jB)NՉOp_uEܐIR-!c@, Au;nHL5`6gvO\ b I&bL49Z^XF؊jjb0^zc0k֐
6H9Ac2XDV]c)Ѧa##bp?C4c=]݁z)44$ہ4!5R0a?a6lUHr Qh^Ӭ&ԝKpѢnW+rͶ%<5{秇ݐ;lUZ3z{U% VW-en9>KBRFreOb? //C^GqP55EGc#,'a)f0l6", xB>"0R|cH(RLY6z`&|)-tI~TU0Ax@/EHߓX-vt'ن,́x|]I-iό(^,H0~-6`{a6ªLa(%H..J{$PWZ죸7 ^J'|J%tU[`P@ģV®W+`H>UgG)k\e$$,"Na6blI]Y[|RBGG 7bj=Jog[)MQ_ N/LIH-V1~WfULe$ݪ+E?!L[EK]ttRv WMS!#"022nz ,v/FX]Y>uCGXOd2lP#Dd(kj\Jt~^4+5*4˦$tRҍ(ڮV4 '2}Rq\Ƙz뙚{' X$;*(e7V f#:#l۰~?!C 9!U@YIAb}X˓( ߡOa^[FeSW/+gd f낣&=gϕ`NZ1"nO@iDjh$4zX{"Z* Z//OQ GTOpZT'%27SRL)'"u@ %#. L<)6OjB1E4dC.9; G10f#,'Fvj$"Ӵ*ʍXT#|1Ud3* ,Mf.e﷤)Ji> $zb-^VmDW=ba=+ב6 偑ߨ扉Q-c9/A ( =E3z<5{f#:F^3rgԕUAtQV8B%r "1 8Dx(O CIF)ɡXDJzǬ1$Bﻉ'BRD?~IMSPF,zV/f#,'FRRnIHڇ}n^zrzXuvsB\gP\1&XdU' q^{T2_v=ѵE o.u. ,GsBt G5?&ҁUpHFF0{f#: ueϣdA| ^qn#hcpTNO!FAI}^Iޠe4>z”YAi5A*]qoxCFizf#FXu@n7rs!'dըj{)"dn.Fd05A_Zdm+#5iH!:@Ѳ(0"8d۷V¤&dzށ,d4+6 u:dU#DҚE8c1<\2[mnYvΈ``xf#=X^ YzxR]ِu3+4uSP:~D&4hx_MGPJUNc=*bP/)DF&~R.l/!ajZFy77߯Ar#aB.Kkb}8,E4þq8lûy}~3z=BD"ƝX0Av=ArǑtK#6ސT~5%3:u[Y((Y@} `@p7%1v7q}o|!R~, `,v/FXWz2*|I&DУ2\)e%dQitCQBn Kޢ)h!lh׀EyLjsf#,'Fꌢe-hdqu8w/td2em *^FuH2kvCAmnN&OHNPfvƵv m< f'py N8FYQlDAAߜŃj@C=cɈ%oX`{a6ª"^z=2#tT裊qb#z⌋6ҡmlx8)#|7iS$l@$z'/SU[E,%0NJa1a?a6lU7)!{1a).Np*3uN/Kԝ 7-z+%\Z(,Fua7ϰ̟j'O&]u:Tyqv#F+}>D2ߔ-06iJl )IHDnd#!,Ld7l V^0 YHj{XTѪ._PTuuQV)`U 9`FPJ%D(Q+M3L^E$'M MV f#+m#hqOZݢ75w0Y_R2N G~! [\=uV_O;#6ˢJ vmWPw9{Az!B/ALaH#R|0屙1z: te1ab6VUF(39@A z=v&ULq)D3>n2oQ˛ֽ×]ZW_zQl$BCTQ!P>3S#\twa6bl.I\)7]DMn웏| ,Fz+B'6ڣ}mBx&Ac3F7f3Rv՛El.ƯstFFf$"-Zݎc G|XO=1w,̚+BzFU5&,f#=XF؊jTLb1 yH2/{%5*FHZ*C-ME2yg9t1d#c;gh4Q{(ꡡi5C5'4FXO0a!9(.tm #,l;Ґ3vm$"ԗ^(^ G| R"7̏8r'uPFj*Ip(e =% be6bl(C)ssO QAwQxKw;$ب % ,^=R1̕rN/Dȓ L^tҢO8HTpjǕĤ^5G~DOp=B J\KѬxj2^hy^Df#=X^jXC5C$Od"!if?̔F\ЗN>C| xWWQ)L6ʫ\T+yRJ%X7i~!x&|=f#;X)f#lHXS,OcNs{]˂q*7[`qUrYZ/bM}W`/1a( 6t|Ta@3 FkUqa~TV9> i7Ynfw[DKMXoPɭL^ >.]fMa#ؽ0aUI!d{ w騋ʢ~KA&o#)c!EwA&ok]r&HGRed՘Iue?I|D \ ѕe6*AFXDf@rSbZLH=Q7ԝ19)b߶0>#319Vs/}UMఈYbvH ~-CV 1z#r! y`ֲs̸9)7?v5yؕVY8bɕ_XT2Dͫ-6‹{jRTޡs*(BCo[LS:U"1MЅF@H1:yLhEouHt4n#lVQ(Q_}ș^d6mg,RN/xrMG"I4σ%&9> b%%YYW;A`Tp+I9ɑJr-EN_kFt"LIO`$ic-z8 sD+^XaS4ʚyRZQRa#f;,SE!k| IOR7 3@?/@GӍ'wª|M=DWSGF_+3a?a6lUW+[i95шGz ;i&on@Z/7BgblkBy)?4Y6 R ><^X3ar YŔ2C) J?fQd8fDͦ`Ԩ""Rdr?qDASl($^BzlDib6blhhJ17di$#^/KYn.s$"OzPL9qōѪ=茰c ̚X3iz ̓m}(*Ek̀g21BPp ;[Ԝ s4+^X3anyzumiC qDQrNgD d=c']W Y=Նķe4ȇS> /Pwx 7n@l,NSmS^w}1aC3,`2zժRCltUg \±K6Rl߉AȊmQWs]{'w?nCjb7-,6V,)1-5RIB|ҐV/ f|oVMO'1U4"#H:E\Bu@5l{v/FXu hrU>쥚OPk.| @!.$1o=ekSA 6R뽄PIepPDJ&һFal\TD}nCGTUmڴIA}Yw r?'?a6†gAG$T$c| /_K>}r}8{?qNQnDŽ xͅed\v ֑S=P}a2b>AתBݓ/5~ NIѱ3)zrr&Bw7XooѧO.fI| {v/FX*nd2e|@F^" d"L#vLGtDNRzjRfD*'8L"*elpQ~?uB Y8ס#/Mȸas6rmyDf#O!a^!\ZlxhD G׫3|_Lnl;lbut6C3!WnHiaKqp=_z `3ZGώ Vd2Zd( +*DVE(T@Y=U|ЪU~o}w$I7o^]2Vf#z"/=FK}TR[]F FSP"C ,4E4bj{6;Ѓ\Wvo'y.Fet^>DSȯ?M6!Q?#f# yg6†yXSYSC*zrp@JC>ANa@ -#܆$+;"k([ T#ƯsbRSELҥwcĈnaa MoƠ1]ˣѲiѸ؛/}`{:ŋyF)7n\AAA͏u]W ^fȣ,>,"oSX۔ #B0*FT}=D>ƻQ#DB^G_wT Ha;XKY9  n^qdA0)SL0A˛:ue#ǏݻdR?Ͽꪫ.u; dž FEEڵ>y^!aFF HSz$y@ o$"ӐE~, OhX&WߝX4kVca \Vݶ[saلW{$VLp- pFZ/Y{t•L ;7ϫlCChqD|||FsI}+ҵkWՁjjٲeq uy',K?쳋X yN/{v/FXů 5dyEA 5adRhN=D: @#,3j'[De]R̻4DI׌J OvСCn{~1bŋUVy5Gsss;ՍE?3ڵl0aCªQBPitZa֦7د6$/n2KAJVlq#.233yHMEy9O0 n6M4lP[*R}ڻφQk*E].,M EZʂhAAVgS8 l FM6jڵSAhhhqq/'O֭:M6w^:<enfu#xz*z8&`lugzYڿ0^j(EA#r"zL2 AI7!RZԓ.QvvEVApQlHХ䧈ψ- <~NWn؟0aCº䦧 V&s?!x"VjɿUR> v"_QL]țX 4ޢg WjN8w:CGL>!A+r+Q}CaEk'Ft:Ul㍼G׿ #5p /u4?e{{a6ªyR5$}F|YMtߢ=Q7xhG+,wZZnHxAzU0y1h^dȫOee1aSRO!a]Z>%"t|iwjV=Ä ɪD E 4ίcb˾NsZ@Oq-9FE:D=."/TSEX%MEEGz#75):J;)N62l?P+waDȽlll{v/FX5HztxhmRX>!^H=I" 2\T)[Py r*cbz(FYWl|YFXПVD+f#lHXWRbx3qGO)ւuV5u[et1!Z,JU+=s:MEb!2Wʰ<9]UU&h[nZ!R]P->^XRG^jTT=W8LazHn9p"@)Jcv|LHD/Vc,aJa!k#%"DE002yr؋~!}q{ UF17f#lHXWd9;#LɟCxЛǻb%x"%,cͧ Wǎm}ʐ4*ldOFZ`QGLuGmDeT1P+Lc5%E9ɞ-QGD@b өӋ{*ؤ0aރ .0SEH3{FT_SRd vSM[c0om\ŇzG];`uўB:G*#i5ܘ?YFؐYnj}qX ϶#2IoKQ)(~Ri܈;*,g'X>^Uu/HqDkg3oipizH:F>P;>Ü"-Ċxg #ာn'!IG50ݺIO/hEDEi&zY*mr^ ~+f6ºhI)aOjqh(D&n?J˪Z-զ!AZߙSViZ5-}Ft32 Ũ=4Uf#,'Fj%,܉UBʑ(dž)fejG5&_xfQ>)*ѯmcG=;fxCAk=S^VVk ˲r7<]W}CDz.{OߔӢD{T_u6kN볃-=^r~-cGy¾h=xo@$Plm,vXsԙń5Q8 |Cz^!9hRfJ#(DrjV &NJ,!Jrv)FN%؜;Zu@lVS #~ 4ˣ!At쒝ZEas"n3=,;}Q]6r$ pis=J/=jRO)uފvplmi$\31s/u uxքɃp5bpxц?X3ay"/1㱓E&p1)#̧/iO"!끇(&ޗ,~?"v]ӈRa=gG$*oZfҍrӁ EU"P_ܭ f#:2d4Zü+r؏\#- }j6@5x!'w:Ƹ(ZgVaS /@ZD>Aֻӂ$i:FmKy<D(7`tWsPpF~1xƿ2Y$$h]Jc!!E& <;:" rk8?X3a՜Б4 p"7RUUOhoolҩ< (ptI 67JAsNI1ljTAiK$^v[ >ɧm] aװ3f#,'Fj\Hs%~@Ii߿A>tRY:FTĶbǤ:l(IK0eY4wVI/z6g拖c>Ņxc wpfq5Ǎxf 7`).n6 :$iiÒb66FX5@z#=zG*1i||Oz?5cj-%jpa!g4SBfRW(E-#T׃%L" WsYFXO0a<DgKw 򈇺6听 X",QD嶻3,܁R?fM[BL0{6FGjB^xTk&̜7'CdȽm5+;67(m761ᓤIBr#4*'GԡUzze-:{a&g,P'L`^f- I-Bk+Q) Y3* =zh#>GFDlI49uDk-RM):Ӯbԍh8oO$ ɟuϣ[ loe#޽ 7` Tg#5? 54rdE},5LSjӔ6zڳB"VE5}NlONsn#tD&Djd^Q)mFol$sݺuAAA#cǎ=wٳg'N8eʔէOOvf#lHXWJxh6g1=Jwq#h}B"a~$Ir$#n';t((=}{Pj%`"ADLi&>d^g{}GOk[KwॏG=9Sq H}iIrW$$ G8&9vXFV\y>@9s0a6l@(U hh!"Td?YWiC!q:2^*9Jʴ_&f2~H^60"f! YOˢsJ$d7M1*x>}=l?Ft&MVM}?~8?ܙ!a]nD33X 3bh54mڶ It<9ָeNBRj܌8 h;4UGd G\̝Ъ]G+Ala\(K6^@_sO0օimS2wKfe >6V °962vǷz;d6l[U-{qCeؓ1im=w6E%NP]i#Q0M&ft80Xt2BV#NFSuf2/"p[o2[lW={V>*zxL8Qʚ6m?ܙ!a][OVVuepɮW,FB?bt }6!)v7y@6x@+I U~Jx>uM!!ĆK RU!zW[tkwI'g ~O,MSCyDžMTCt"?2϶EXur,BVa~Ҥ"J[O~Hl)bvÃ3 s}e9m-82ԦHZБ2u%ֵFZl>naʕɓ'sss՗]~ՁT6b#W{a6ªI[vQ0ޏ&J(|S3@GS"z\lw]>eTRiBpƫUEʝH*m˸J:R*W#qxHǍ|7V`#Zs}} yU<=ڸqc՞]xQs1~3aCºbe^U5<Ț^؊px#Oge<`hW_Yhh!1紻>m6ff<(L54AXW;flwzrm.7DܽOO?yTXZ~$V$juO^3la]lZ6lh߾U^^;Tw,пXT?_-6f#^j`Q˄8԰EjQXa pk![ |Li2Gh.tV94 `(M)$@dx9Ɂz#F~onn?|ܹ/\삂ˎΜ9GG<6$+V )'ü;NUx⚊Gx\{|qqZD*>&0ߞt,1ynժs4 VλL!!ϩ?2QAK˰ȏ$9hhwkgk?^{yd9ʵm;B}ՎFZ$͛!.;w29rHW\y…={4k֬T?d6{̙436l͛/]TVV;%%%Hll&FN1P(c)E'ށ V-nD56RVI=s0̓!zKV)4<bUjko![[&StGEfxeQ7G?,'wO;,՛e#xRZDRKTfNN$3w+uS/Qbrj*BCy)#H,-8KĻVo^#OlԹW^V}.5 6kGwsݱ]"3I>Wd-#|^ΐKH<rxvp&= DG+2# գ2C_:kf##b>29T 3x(|Z@(Q)!QIi2wyh+b/5BP\4^KKՠLJDNӵN1zH2|Z2*0a6ªjvK֚Pvϲէ|vNqЧ鉶'߈.u۰0Ks>DAt'WfbZ|QC(,wW"&UL,-)>KVI5D"?m1A5*qǴcԛזul87CoU?[$yǍ0Gv/FX5CNZDTd*l%찌z ^ᡮS RZ-SHG i@|CzIZa C6eF`ASxlPUo1o皅n=,>1#uu!˞C6^\-,܁blp|rflFXiLY!H鞁g:cpkQ]ւHVEE2f#hy*1a+ºb婂Pھ.-zbFݏE %W;)"NRB3\$ K;)-"$zoJ J7Kx,_e6b6ll'!Y{RwOaDt{F'`\)(hyPHTpR^aPvPULD5făƃWXwj!DVjFcxDZءΡNlM=, {{##+=kF⯘ƨN91 ࢔$9dMy7h@,a.n4OdYLH\;bU:Iȶ;ls(x BM[5m"hBVe",V5UHpAkMuw9xͰ,ɺЧMBR,Kgu:~#)+c66FX5CNs4ݝȆLC" ՙ&"pIzәO)%؈2O E,%Ƞ((D=cU xWYeƵ0f#FX5Rfs#IH~"y4w lw ƻz̛x"⽐Q5ˈQf/GjF2Q^%TBZVA P kԛ)tL,5Swڔ'm5ʌNlI_1Va#TWap}#z)-eJ)0 l#w`5} jh|_#qho5z!V=ۉꕫ։XFXO0a(Eh{ "w~` 9wVUeӮZh%Ѯ ˰FttiJleAx9>]M~0qBY Ȑ[D"ӏ2DJΚZuKV+EC2`px@ ?Xa]J(S1JTu<Y6x:$|?Ct$|M\EԛDHVѧEhm=kxaوb]b6†iZp[`У4jGڅ<7&vaB( ѼDBnEu1Ml5iRLMɉ83oњV3͑oc8n)Z-p)"Trx-*¬ ML]98z`I_ۈBZkX;upyĺ?X^je.S4_|J'(xc7UO-!LS !z}rP@c^64PNE\*Nr?K4DmUQzriNڣSnXSz,a Ǎ0a$Y%-㵨QJ`,xϖR[ף7|G :!N:+@ǫTG㗸s"}~9و73?lXN>ݻwo|M7 0g`6l RHRS(Q~Αn~:zaa{(7!4ngO jJs0#}c:mnDw9`n0i=h ojnhXhQ 7fقc!(-8&ی[:yďƙF.0b6º%/8J5=(S&x 2G EܨF2w4ET]zƭN ~75 L%]wtm6/AQ$@_Saa1QէOOVǎ{ܹgN8qʔ)F0at9=yy Bf JJ08:xSaaa9d|w{1b Bfo@x}8T/Όh23CD Wǒ0<&G2=_j6#k8 _ ";@ND!gHoܲGvN U[2nVu$ޅTQQFX,V`#T];Zs3zK%Rr(3 $*)cm%~Q߷5-uIjaSL$w D;s)F0aS "x?0O4irE=cǎo]QQѵk/l_F͈ؐƀD5FFR,4:`*, jm$`$Q@Ys]#)>d~lYxx MDb6bj<F}bDn|J!PHfH*^!p63@#`ehOQ/Հo @>Bb`5ITU/ºHNNĉՍiӦ9so߾uֽH }yGQ7wu^zQNݻ9uTnL&_z뭵k^ne={V>F.XX.ﹿ[ŇT;`2b˜g_xYG:ӂg_h!B6u,Zv{U ͬ09s#ݕne#&28r[aWVH8$yX,f#!G|MBv{%|(F0^M]z(<>00bp 0f M觝7XPI19N3eOڹJz(gg*G^l~ }m]Vn5kիWn@NOOꩧԍbu[?.]ZhѨQ~ :DĊ+ 8yܹuծ]s=?nԪU#OҰ!aՇOo@1 0}}W5.zPfMqR{%FCރTcn`Ǎi tqJ958)//ܹsࣺѷm6ŋ k7oޜn(/ 6t钺q&MiР_n;w.ӧQ\~d2o\v6$+M6„p7펼tx~u 240 Xy|ԇo0~V`P8 aa0 #n9h>֮ĺQ&(ҭ-EU귡7p=wjdiA /_FX,V S'JlLqzxF'[Ic0q r*&qpZ%5zտj*&v}* Fc$8Dq#yRM%kybccI!~\xaÆ~mF.\UV`_L駟tqu%+888@lԋ6h#&,f#lHX{5ۆ#](bQG$uGEX(-rիŻ֊EPL&\9]aX5R<}iאwbUkv +SʀDŽzH2ZE y3Vِ݆:v.xӺ Wa6bj 2YޖBDA9 dyC҉5ShDx dHSj^A+ K_=4^Ew <|A>úfѣG7n~/^9vN!p3zݻV9)СǍ|78F:wG'Np:m6rr?!a]Q։n/#(F 6E@! (]Bb3 ]L A EjF{w &?=`fڧO~<179/zi5E!r)jij/-(/F:#Ylb1a)%rXG!kp2n |JY6K(C%!hLi2pƕFer/>d !ӅeY6E2 Zf#Ϝ9GQ7 yK."=N_TTﰑ@u܇~ܹs/^,**/_Ka6l W^ЫnBL$#(NI (+Z*Mf&&L@XXhXE d`Rۿ&[6i#LF4j*FiO[1]gʈF%tEe6?j*%e˖/gϞkV}jTթS2,PQ?\ys"`lYk^7 {+ˣB༄ͮ[&2Y)pUL5c":ܟ֫u8'kd:qެY}h|X,f# 6(wch|EEP4('J{2z(:*WMnCA3Z^8\}n(y#Go{vp57lWF0aCº4#-Lj3t,GŮ ͣNsʰY@~® &5#nrDŽѾu#5DSqy꾐*_,5f-@rX|hsqt,ٍX&dEyFX,V͐A:!OH"LQ?.E3KbZ3\B"qV|+= HeC dj#$"S^Ti\Me`]g0lHoa6l TvO#k7n~6v4gwI8t[m׊¢E4I ).n{D Bzl{dt PTޱN_ﱃۋYݛio%f#,fI&XG1ӨiQDMXXfT3F>>9Dw(n=㺓D}P|:}7*xq-e#돰Ȧa6l t#uʏ-z9(N i5 ǥ_Xr`r)%"=(d퐉ZD&؈2?l/ѹ; z m4)`;'ráFOݘ!a]9ʔ/y+1`N)e{f"K5'SZo=\%'K| ?Oк ?6i"mZq)%u|93fq{Vdp۪cqE&$$e#E4pː/%JU GX,f##OFTt>jKU/Qփ)bQ"CTDqaȠ >t_F/uN4F"!"'^ҜqtDpl7./=K)/.Ʃ+(#TOh?tN="8kRa bˆp?j%KSFe0blÊgM<ut'K") I_!-+ijX,f#"fS`^vu08@# |$qQiw(G;(Gz@w(y?MۖHӶD#S.ʯg ]t9a1a1a6lUd@']֍3yﲌ H@9xSn/wH)xя67z7`*LK ՛ьkkkQ@b5sZVP3b[in5Nb[eմȑ ޘX,f##Ԝ&E SpJ{ct{K@&:|Jw4g"$CDTpeDn&zaUQGӘEA&zm1a1a6lUYi!{v=?Kh uXG l9&NSS b}]t*c Y E@ n(2~guA"2QZ OT+W+NNAYyE`;"%0aXFX5x)#ͨT CrJ&%)^F =3jDK `Phz!5!0Ϊ|K8 Zڨb6b6lJmۢzq`"_ú(D 阞ku }KzٓLLVqLLS[$ɇ=OXlJQgm6=-KK $'dOLz9+vg_qGXYbI Kc6bj\IЋ.3 zN4z.O-Ob)F5Oh*j,;R`xn@}ekE#uxyWֵFvXW!a@o+C7&Տ31s6d#7z;ఉP4_]  M&Tdݣ ה}yߌLZ@aAGRMF,X/jP%Ҹqǃ]{n돽-vPޘX,f# ?d 2 ސ7+YM`T-E8BhVsܼ ((^VF;i-S:!xLF'[rb/6$?(I"12w-waKVoCX$$ӑ,JzQ#|MoW ExoBEc)s_bGSl?xBGPmh +D>z'E0.>Tn펾B21)C6ܜ,f#,FB?9Ac)5%R=L"ǩb6"&H>ae*-K6rv4\`-ӈl'# |1ίa6b6lF)  B^(>!G']fzG^Rܕ[j% IꫡuR!F'.UD TZCS_IfAc]5[^ '^Vo>&Hȇ0aXFX5IQ~I1)6.PrM%\ 1WRH,,:KŔ>C|.$DTHѳfjisd8RHQ*-+s@zf#FX5G Z9pru܇nm%fxcqJ l"6=7!h@9!I͎j+N>ghHaaHOW_P'To 'hWɹTL"KXFX,VMSpH6)A8NP\GkPF[(X /I@uV@,r4R"ѧf-ݔwȣJ&iBµG0a6ªaBs O˽L㿠am)O;1llV U< UJ۪Sh)LSҊ 2ԗ enZpm3c <(4L-,6VɪNn+hG5,g1AOM1ÞTOPo=d~T@ a6Vb6ªң8T+)c7U[::*裟c12)i4FS# pQ?E#q7 v$G_>EOYVfXFt:t{7pf+,,jBӧOl6tM ϙDXlGV!Z9M[-7eMֺNA8[cj㵜-;im%|B"@w_fA&A,}(0(49xyႿ`bRF2W@R1 vh"XXFX,VM(*⡘D?)`0]TOӲ``Nx6F{>t 2!;vQF+Wx| IҜ9sl$;;{رΝ;{ĉLl_FؐstQl? 18jJ!Z`*,Hpjk!H@ e@EhT(P PKSl(HV@E`TT.w [QuubDL&˕- j^+k؍0 n |L^A.Ymt[it)>MO!QKz}TSv죹6eMKtvtZS/7RMa؍107߼HbboWWWyFxa7 FEя|urtJ#ȭt$mV9Sh/E!u4}"5h\8qyHy@%پ[0y(EX+Hx.?W%*]ߘ|؝{Iz iiN-U+^nw:vje6Fa7„ -Rˣd-B3kdKd49QS$R2Ȯ,FK4N;-zY~ #'DOD)f4ZF̍Xٍ\wu~o^_ԩdR>|޺Jqqq֭JddSNOٍn7wgk)àTObSdlҋ\}.Yk31͹{)8nrQAa@wX*` j]팕QQ][zu}oz3fXᆾVQoo46dbJh8E{S N8o0FF&3$}qz*us<$ݏIy8C!ZF$hU=1>OS:hZRE{1>M_anaÆ|O~-0o]l3{YhѣG^<""uu^zFxa7 +,gpb~s V%(<ۅ8 K/8ĕmǣ:j\7 )nMuOlŠ$'Ke#+, [T(ZNHi)mdi&d)>%r(XӖYxmdfqS؍0 n 껴XO!z[3B|T\"'%rNPZZZJ-W#EC|k]P2Qv qQk4_QꕶFڞ0Ffӧkq_rP^Gx\xynرc]K/b2؍nl ?,3Me"ɦ.+h/Y2ݬ.`[Q7Ɋ21g2=e{xEIXiûLBcB^o!$8SSQ/VBXĖlVtGw\[b{zL$Z nav#Lؐ,N%OEPCvMCg^##:r&S>Clߪ Wraf|tq~()7FXk$2FTZn{={vzzK.9x\xyngΜ hƍٍn#w<4"d4QnV_pE Dq.77?%+xvĤ;<^1՝ĮH>) !$[nav#L؄"$@Rwe U24Gڱ &r#IQuv#{tBjgr0Zr@$}@a :4HVb&acLy#yB źf͚o1/̐'NlDDž\؍tO>:r؍n7AZH\j~ڴ7ǤRFŖR%{5f_Cb2 tDY!m!ʮt| .K!KQ1ECF^ߋPڬ]'#y8eA k:ҳec 9 ^MJ9;ۑ񺄲D45nav#Lr$x=NȊxh-|N{JQjv+5lyTh7ɢBZ׋hȟh2KUޤcޢ6do\iH䣏>ꪫ/_~۷hbʕPGu<{#""*++O:{a7RPPo,e|Oo )eOb ѾpSMNߝ]P~g *17%`uZc70 &ѐ(Tz~<t1:\,B~lP7sgP/ċfzԜ(Q(h7F~&'(%\i!G݈/ܾ}蒒C~ҥKMMy'VVV׹+\؍|.A[nGa7 H_ٌ8!#%2eɢ2OٷX0*މ`l?!rnL 51gj -(j`m`@nDjRRv# v#FpF^^3`5oۦ#_]WÉNVu.~= 2eȊV+(Zч{%f#W̟+-kH@%iʛ衍q(좖:C\o#311۳PHp!5QQaVn$mF6~vgǼD{R!Qwӈ>@i۴ fŰZtf$T^՜t-r:3v# v#Fq#^ʆHE8A-Ờjf&HZU}1g Ӫ~Ω0FpB4&ŤQ_-7. /QjN)5,v$"}l:o3TsQd^RF0_f$P: |H6v# v#FYcbeϛ3m WAkTwv9^KFO6.IOPիcހ]rotLe tM9h-Ґ2m) MmSPy1m0kbґ^?/v# ðaOQw(GBޥvGȣ$C^#QE>8ezlXLeeXC:.ER'Uɘɫb&R(a؍p@n&IH@/3HDۙ'[aþԳeP9*LA;Ɖݼ첖+z"dBom_)+9d+mU42>~Urʠ}RġUW:Ib4i;))mP bI؍0 n $4j"EEV x4Sx^裃Q Ծu^-g6J!.xqa4zMx?KĈ)% v#Lvk1:\#ΨL`g_h\Xxċ>WNzE|wl+o$_ W g&Y, U"9׫U}ҦM-'ZB^FB&GU%Z5KGz|d4Va6ndM=B0zrLFhu$I_J 9L3z)qd7#Q-dTB9@aJ';Ē}1m Oe7°a7n ;"$=aIœ{v8;1`{?~n^kBĖR9+Eqd-oL_*w`ݍ(6f6#k+h'W+^OLYv#Fa7„ "y x636ʹԎMw_vJ1U(̨y4VN]JԍkOp1`93:#]tijDZSlt%5 Gv# H-`.-^r6/Ƹ;c :B(y=o::شAoI~ mL_sΎ;N:cHi{NW:S JZӪttJb%#ڬhL/+_a,n0FpȜ!G9Ϩ^Kmjҗ|>FOc|QMud=]g?k@y1?EU(EَDn?*Hz:+I즡9Dv#7d%nanEǨ|[;l/V^wzT̉܆c|i)z?DmL JrkLs:6hNA1**ʎYSoq^\] ZВܢjj,5QQS,˲}il7݊ w4Fb70 &P(+2cHALj19H#}sia FsyڜM1hcn݊z{fGt#aT"4;>$PNjmSktayFv#F؍0aŢf-m}&OsgX{0xyLp܌mjP0`eCJŮN,GֹH$:}D%I#FoΙfm7 "IhfӨ՞J/BC^>i a؍0aCsj(iSq'$1vSoY%;(ByO(C=}0aFv"c0 gɺ%TZZ n&,ԩbuL(0ngWRvhG@}tij 0\hA}̪ҧhn*m /?zn[Aݍl+K4d&Fݸy:"հdJk+'hhwR?3v# ða:PLM9FAVQyeFnHZ#IY,(JHګ>&਀V$T4\REd|TA7aHBY9a7°a7n WXo/%Vr^Fa7„ =V GQLk,mKꃺC*NnuDSU?{ș"RK"zU2ڲf +z pwz/R#""*++'O6kOFu?kv#09fl6鹊8W2eSzfb0tMGx6E4G&?b1-X?E-!hwz@!$5aɒVPc]}T]ϹCZ SN.٭P8"ϋ7 &؍0 n $J8HBD#HMPZdPKeȔg5*3r?vQ`.(P#ю['~#9 =WDv# m4?GΞ=x}?rȤIڵk?F8 a.rEmndZ% 꿋&"6y` )0k ָmiM ¹VmJ%ܾ qP@QW1 UZʳva=E(RȺOn mbEۋA}v]0Fa7„ )c#EhjISxȄT~' eDdmn cn9jl̢s_4w[Lj\TNQIv#HDDďOLLܳg׍>}/kv#0/kt VxZ @؋t9.J_q{tB1&wGǩ{!]ڣ„'lBlHE(Z%qKFʚ<6[`jnðaFFoxc)8 if7@$>d(z ڕFWgF]PJvMT'WK,^؍td23gNf9ӲnݺO\h&AX+^c61/ 5Ӣy`<Ύb)X !( 539Wx#Pⴉ4J Uw$in$;f[L>sޫa70 &,EH";QB%j!bdݜ4[5Wt?첽puc6 :cǰ90f#hLO-$9Y@' zx(AC ]5ht a؍U7kojdddh#G~N 3%%%[kv#0?QQj _jC'' VF!ov# kfee9@+#G?7YK^>UW^-8YlT0 SFab0U4vkQ5,CKf!'=nav#LX"RAW졍>*xyDBws?d04њpvT@8ZoD:Z::10F.FիRK.~FT?F8 a.~N,\2,b0gMG> Ƥ#=qVه3`ksWK[ꌺZmquؤ wKۙ_,?mBGIje9( Z扺XGp9Z}$ېW1Fa7„ն";Q@/^ ES 5ud3FNQˑz#QF&<c#}ua?5ZJ5G՛BtH?J#3F3zȉ'l6ۿF~kxG6mڔٍp@\X,u[$Lg!^(7OL(7KF6uW+;d{v0%;0u;ʩ )2h+ óJyRF8c&DefHMEq!F$5"xMK\@"jǻݜ=nav#Li$1:PP4(cىl(TXRLd IϨ? $j:.RlRZg%ͩkR_y1a72~#/u#nǏkv#0?WMi9;H(sh-(qT`NU!zN;%[?4$k9TݝBV7W|_]DWyyZ6◚`͘Z$PCQphI#qv# ðaD%os-2(\+h ΡO$H 7ڷЮb9@~5Jl^%ʃ~7<9sj؍:to_~.]jjjE7 q#:ӟ"## r)f7 sd[uHY4&Qxe#&IwO R㘘-㮩UϊSXq@8G?ɾy_UfDGc*-P{j,a_3'('XMVYau$mCQaT||L[9NU0jK*#.ھ~5De=7W+:]ȗԔ5@i$z4_D/DlFG7n"bAviw0EbD?Sn/vg=e:xjN$q}XI~݆L-̹6]ja<3.1HxAˊm#r^bG$<C_M?5v# ða)]%;`)]_dQ^k@>"@MAReME,d nS}MUЖrD# !Ph1ӿB?)6)A8E~x1Уx"MH*ho/ v#L6PfuڿM+nav#LQ` HdPSAꢧ3P̐Dl !T9B"e.Y=7q UHF#ꍦ:HF;B: δ<=e?=f#FGv#Lc6#5۵X䀘%)xbRݞv6/F +*{KYuw?%@[X-I^9?*͘K`)PÞVk9%(IGz~/7)M]+) ^W4{ٍ0 n _#cd3YCtd.MUW^&5ZTS,(dL 1Sg)>L^#ED|K ]$^w7"KgYငv#Lػ$l["{ZQ&SAZrpnhsM٩tnD]5{WnGU/Ve6O$1:Z"Ζme[L UGVDEaT,Y}[RrDVFȊEqcnav#LXi4)f'E>֐)]+9|D-4!7*],cMQYvtf$圴#125>MF8M $̿HtTl֖z\$^YZ'ERO%g#9]usUHu&DMq'$$KLL^d$G^C ,R0P:胀>Wk`Z ^ĸU8BVKᨄ0F%l0ˈ-3=&h#Ës}Os-DY~^&[G $`6ڒ(C+Ov#+y# p&\Di6ߗ*/ɞynNלϲ^WIW쒤e"%0WaW;0uj@Ӵ9|{wTU٘5^P\wm4bQOOG\k)E2-~ c؍0 n fPYY2!:(F.#Fc::4V WS9OFCHFL_jHwR.f1iCRH UқB~na7n+qz|z95:ڟhKt\EMŵز T*p`Lu[ݢ[Z#bkUAGEXt7RVvyf&b&k)>Yб#WQ0 "Y% GbZ&M;^}[a>sEj*"U3T%0m@3kd^ڮPAڨߥ4SQAϢTs\4wHV)>>#KsZ¾j+A؍v#F0& 8$KnͥZ|+̘q@rhjn1תCNI dH3E,Hvqs<$ބ Y|;$\w~-/O$z2(F'Q!~T}nJR@7:Znܖav(R` [FC QE&DŰlO{L5$rZ#vS^&e4HPM2I6Sm 1F8 a7n!IC<3\>pWʹvE; %hH[@%KL7eVS#}Ziiʽ}R,}Ondcx|js"ʝNżIX DH_6&"m`E(lаm*%2Fa7„2UUȟepکLRD=wLŴL|9C!R6׏_zNV.K}iEO+a؍0aiEe3C3|ij!"jE&. |>cW5./*?4u 2!)6C/Ԓ$a؍8 Yvz~W嗡[ zpf͚Gȿ`7n"bAN.[_5.[ǴO쎷ުY;jF u;)EO5I(|¬6[ufM*Can1%٪d{`Fr>3cn('Ԕ5d#șW@Rtgnav#Lώ WIzMG قs jjN<~HD[EZjzŷ cM64 KeУ?'v#?&%%jO8{OH v#F؍0ap:%UȣG98p]Ow*4M(BQOۍCw$X1BPLWݚIvĦ#=F@G_xw͚eZ 6qJ⊫Ek!+bU=kv# | LZ M*ҎZJX\9F7uKo)cIwPbd8ug=@B&P]XٍL@_s5gΜQ8NILLܳg׍_pv#0Vf^18z>ި뚸85 ~)ԦEU]=VO]wjjқe(psw 5peΡ( /*jy(jy#jפ~tkX q3f`Ttx zr|N}bEA<0Fu#:VmTa1GI)e`ewR R"OҍF&+k v0QYEIL KG.*0FTF~L8q̘1رc'M~ў={6l۾}3%-[~G+GҥK;w^nSN&I}<|ph9s5kQYY׭[[Yύ7ϿF8 a.2deڬA{@]Wuu+++kժU~O?}X999SWJJJuݻwweeeÆ 0`@ii˖-8p`ho^^ɓ'+++#"",ҍnWrKV]&Z f2U~h3(.vׄokzΡ{& -8 M#&dZJTҜ6xjEC՟ez[v\VjQJz'hX؍av#=+uyk $ˀG$AZ3@aI$Qq17sF+i&ਂY+2jErBE&'>dIYM6Rn Wְ }VUUu1T]Wv̙30 /(ϫ+M4ԕkhܸ_]KU###C{9Oڍ ?4n$ʼnY@TSvܪ ۮ)%Huav2xM׷GgϺ~Et( ;N٩|(SNקil6wAC|.kvP#}*WO/"_`6:abEVB؍av#LXw %ױkȄR.G1F4JcRx:=bMNS%(W[4tהXRLzl~ ڵItSnðQ޽yx#:F2KF/]a7RK]X۴is󾍏;ֺukuÇ뮈0}NJRRRػwԩzb۶my hC~tRSSs]=Oa7 s ѽd]X'a@XS8.EVX(8DVD57-`Er)+uU_meڝ9Mݫ7g rJ`c,ik3`\ͭYٍ0 n w=2 9JXAF]VD#C/x6;`JXVal+("]}z#ͬҞcT3i<$܍ԅHF0mv4ruNۍͣf@Iq݀L-Xi\ɔ_F^NJǝU C1*sM)ڭ`ރfbӁ,ڞ)yy_ðaFd!S17r&09j)C"32FdmӅY!72Eԑu5]!^bFtgRf9 I7^a7S7RG؍င8!n:Cu>1:]ᶋ`qqw]YhfW$Z""VB[7t΍8}I }w>FL3k4f&Ha؍0ዏivj>uL@7YWpf;E$ Ai>kjlAzgFFou6"g"F8 7HTӰa7 sѺ+.IEY'[U]zA!"uH|5|!~EMM4H$rFgfz;1Zage;@0dIGzrzHށW'^Fa7„% p;܅‹]F$DW"/RK; bnƭa J(- C&; ^c`5kiv#n_؍p@\lڬW`A"@ptMĆa|x|L6nGCl]ﵕaܸ75+RVu7MOn޲KofLWwq6VRnt=?D==`M-E.獰a7k\ÿ^R .:M?DH;:~7$yO/2dыͦ N1L [7bՓ_}$gBjv#oOo$ņM9}NQՕ>:" ̛n锐jAPTSzdKIXgӃ1OVFJE %ԨDQ/.&cSӆ-ӴL'޿2?qv؍vju'1Fa7„ uQhhge|=Oc(oE٦5q&@TC[:IregHݮ&=e'> H؍a7aH@so:vhՈWs 0BYٕ99]\t[a6z-'QQ)Kv@u`&MW܏8 $rc)ÛmV:C}V%! XjDG5JڕCg~#+ɄF:e\\nt؍a7A AviA%n$OUbT>.'f{TPUX::!* 59+Wci+x9riDphėhX(,qք7ef"7/W=QKA"lB?v# ða\Key(DjgdOD`솚$+F0ɦ>Dm14 5'T#iFGv#XN\\&vؗ.j ,j`52drp11ڴtndgU~d鈬" (gI >DKea;T5wuj3q_Bgev# ða#;8ռE`Q"vFZujU-SI6"UHrj/.a7B&}n%XR";챈UW򑯮 F z^ۍ-S.Yj~fL 8jJ}O=ptT0UWOŬ(g,HBiTV$we, ZX0F? 2 e)10$H=Ivi PrA:  t_gjN_e7?OKKy(v#0VXeqKi%o-F9d-#&F.MӚ>O*٢FQ0s뢱QŸeZ>(-=)ZҮ.jrm7fũF^y=Ґ'aj69Pa؍0\DF.INhRd Nɦ◕A4P ^zc3NzvR 'dH؍a70jyAH f>-{Nr:81kf醩f+ pu4;j:PW|yy^xv#0 F*(CG/0(y+IYչrGvEOeek(-VYငv# "ZBF zƬO<31~pE]4%$ժdQ1̜FN9 ]_=nvf6;lHNnCa7z)Kd7pö; :&օj =TSJ,i pPw5c7nv# `5CRU;|Y)ӗ-^U ׯ^:-_"-t9ڜd+nCa700 ^*aD%0~Ä47@.%`䖄.6/O[BZu28TG0F8 a7n\XIw螃9#`56.٩ua K tx&t9ؘ(Fx" naΏ?U %1W!1IS Ze7﹑wys 4V_7?ydf؍nE:җ[ߘrXXoۣỶI0;Ƨ {U0;]E a؍0  ][Q'D[N>L#e#&Q8]n>kڴϜ9J4{7rYv#F؍0/" Q qVm ^68a؍0 AJ#y:9a~#72bĈ7|nq#{a7 H>NM3oy0F"E`Lx ۹뮻߯m+555:u2LÇs#[w]])..nݺy_֭͋t؍a70 na؍p(0 _4loɯ~˖-8py{s#-:z:v# 0F" ðl>}O~-7n믿穌 =ύ;vHv# 0F" ðI֭{ӳg._\_W^_>^r%穌 =ύ\˟/F8 a0Fan^k֬H=3ĉ6}-Z\Rߕ(2~roDDDeeSrssٍna؍av# 0Qy۷o]RR~Сo~]t9OeJ:W\qzv#ငav#F00F؍aa70F8anav# nCa؍anav# nCa؍$ 0F" ða7 Ha؍0 Ea7nv#0 ðav#0 n/F8 aa70F8a^؍p@0 na؍0 Ä0O؍p@0 a7¡0oFGgFp؍0 ðav#0 nv#F؍0 ðav#0 nv#F؍0 ðav#0 nv#F؍0 ðav#0 na7n0 a7¡0Fu蔺QYYw-˲lX,sϑ#G~_^vS;tܹAve7naðPav#ލ6VVVإK Fw=^oRRRݍ}YӦM/_~̙?PٳgF؍0 ðav#0 n7t#ǎkذޟ5\s#F(,, =}7oav# nCa؍555:u2o{gU j u"ӱ# FVHIG\ZgŖ^]MV:LTV4]3Uy7qݓiZFefE!''sn a s>x<;wt:񳱱Qξkqt_ы=E###c…raʴ[~`FFFFو6HKK[vٳgl2sLv޼yC{Og#999 ,-Ss 2DQ?E[,QW{ޕ,C Ѧ---p8Z@QHKوn:ujL E[,Qz~z0m~0D p:~N6n4m6[/zO<NIIQWEFF-rss{0m7r F=h4d4hP[[\ul6,m۶5_e#K/^$d#d# E?Tj6;|w9j(5RES ,_ڬg}V4*++ Cnnnkk߲ܹs~(3_uKKKS'Ol:H6@6@6P6wygPPФIF$/So1k###'r-⨇ f͚x~={P|*PoڬKd>A6@6@6P-nz a@Plll|<ͭXd6uC ?Ff|fI)%fĈd#d#d# ElF$>} 70k_q4klllوd#gZT16+  a(d#@6W7GKs+kjy+C ?F"^Ʌ1d:NUbK$d#d# E: ²w(|Wlɀll0>v~y屯lj1U+Ŗ-ͧ5f$d#=Clyc 2 ! $jg^yeY֒9+[ljYk @d# EC(|G)-5:)%&ijZ-x0 l"CF*.+=Vl1XLNY-e%-#8 H%a(PdzRz_ƆM#DY[gG# He# EB6}I^ "CDd@d#Pl E """2< ""O H6m'"bPg)6=o Ebr@Bd}}')6odn֮k${b6iվrd#LWb#AD쫽q֬Ç;044Oє!𰫐uWfqqjS?S6=5lNpD _f#UR1n6h˻2H؜/套^*ۍ :&$$l-(p~:وexx(e\s ""UFp .'$v%^.C?|~HWoV<"1W:r˶E]1GL)+;fZǏo59=s=h#NZZ1 "2]El34ub8w\1w~/ jDttўݝ{ވ>}(eݒ<3-zfIOOw9{vprfZو8ޘݵx:#cOX&q5k?[(ݾP%7;|;j~k]Kv""UFXtzq TJǍ'ILL(Ww)7JOO_d܃g&%M|ͭւԅA l=5c^}kxřg#xyaݵ(91cz;.Jŵ+VtئӪmE)0axyd}H6t)6DDz|L/[Q 0&w(6$AD@lA5:*hYk,sfϾ{eH5 EF#b#ADw`A~~RD> stream xܽJPXEp &.GoUqͻ6N" T:Z 1֟Aj"$>|C 9 /$E&`l1; 2!rOWų { ~@(8; B [udOƬR{)ײN} P)R eM_/p dfY@ Eթ~Is{'i,H`(H}a@ܮ.υL`> V9)Xcpr@+h endstream endobj 1514 0 obj << /Length 844 /Filter /FlateDecode >> stream xڍVn0+(t IJH]UjKO `K#cc)l{€y3??VX3Ϛr3+̶hM8U(qó=V-8xh ^'$gQ2*>f^_c\㤝i%LlݐGl9p]A8{WA݊b-۪m @,2%ƖiA3JshGfo|oN2p-^^vݼsl$RQ,}OMKbm<W/:1«8}E?nK 9y^2FY g&`  1*]NkkfwHտF]]dFU;؜P#(ON$M*.9|W2`(S=kb:ҭ |\? _nlL2yworTW mՄ}⢤|#ÏaߝՔmEe<<CA/V7M6N Yi톨p `,u<#IiVmLzբzĤX;+eA QE׾iKQI"frѦ \> stream xڅVn6}WhEl$61PMmf+.qr(CN\ ΅3g#q?6faJ|,8ѿ#eY;ҙB'e)_(_oc>pGl<v,6cS: </?ɭvs@<ɢʽͶ ͪVlv *5)^}Uiq06V@4 !RynzCԥ}cQIBhNc YX+pߐ6D4Ia2H1b̢14&mѥE 9(#E/yѰs813}͗ͻd@y]ֈQukJנFiStuPq  jF}eѹwcq"9NT] *Y&k艰qFOަ *z-ll+WVݡX"6#A!d"WA1Rh vzjU]f`lkCD/ܱˀfgj'qnZ\:Mۻx&H) tqa-ٝƷdU" M6PGwժ5? ڤq \3τv@V!$[hc9cťʑC`DLj01 [`ά?”w3^”M[Ve{)> stream x\TWOH4Y,ѨI7jbĘBk&m v56l *Hu?{aKywgϜ{w&3ϜWjy}KI7?b̎@3#oxݤ,jl@fK؊!޼<1}^gYNo8~:`vN;ϲ)Fڍ'y'犃!zV zKKZ#xUcL,dPh Uc`}:2KDn{>ֈwֈ)w4h1s TLX`Nûw۸쏚 &}tlϸZ#rpޕ>yH-&qkFOcթ۳ha^Xm}7wz9ɹuhǯz=d׫? _t8eV ݅Y}͗Yq p ]U"~.ֈwϚz5S>E 4"dNfp{r=gg&]4濽NV E{cѪ:gWJl%>vv/iCE%ey )vVQkDλ٧H۫3@4Nr~?Ucz3X+]]+s*9loL6Ε9?fۯ.uyU9xRs)yʬ+N^|kR^}Egmh #h`@yW:Mh4ߧ)'Rg3Qڌ;ǹ?8;`Yg3{)_̲ڼk2iVoi dV e@'}Ock6̞ӕ9c߿߯ۚ56ʼg_̷3f3ga^h&{/<( \ 2!s3Ss&.9)+5Iˎ9x]&2wO߉F3}}.is:|ѣƌK;mN cjsk>{99f+?Ko0X_ |kr~π,ALbֽ{327| ?pFw/,ߏL~)#SMY"]UէHӪhO hw}HOc@5-E &2Xj6>g_h=ej}A$ByEuM RV_6H////WS\ʴ/͵F&djt\=qW\/p^5R _8K+=}Vyi}.'`c2}<܏k.D3?n_C|ȜN yhcW0n@C`q ĺ#hx4sv~b"ǣxWͫ9@5.aiZO4>9@MǣQ~z31`14e VNFz.+ -5x+HMI@+^j0-:tIg3B`Mչs8ʄnݺ쨯W>Gz RgzVA5f?:vXk˛5*,_xᅤDe /d@-+ 8WIr /fyhy^\/Bfdd4lz B{=cc4+Vѵi\_T=s^wx%yӃחWmT՛7[oh UzF/tB|&s)S:Rɓ,=>N_k_Wݻ $?|ƌ_y^~b/m^ -1@^O'B۶myYO5@ <־vOy?nݺEN_QDxXΝc:t y'"#b/VРv/I{;vS(j}?zRz./ԣWLxӧH x{˃=sƌw\/ϗBCw1?_\x!>Ni^^)15=7m {lvҥ-:D+Z`… xyyڵ[جUӧYzo@yʄɩz{e=}VաġАÇc-裏jz9AB|ܿ=?|i:_ѹgx3OyxU輨^t?U:WUY7@x 5D hjh@b!W8r*57rԽSǎ=vvﲳigck}vlbz,wټs妝w.ٸs 휿vjVvr۟vSl,z͗m&ͳ0 Sql^|ßS   z ":URRRAT=ege޻w* B%$ zZ\TX\Xh\\\X*.+-))++-*DzrIf[N>;ܕ[   '\1o<*RS2GT*UrOJ ~Bqqp *!{%}AqF?=  +︧>+tgWAAAUQQF>^^̴WAAA @AAPC{1SNڵQ^-\,"Xz-څ*^AA+ ƌdQ)a?_:uнjU[+   x^c=uԩ޳ jwQ  WwSyށ^}U##]n_zԩ򉶶6;vxQab2Q#ÇGGE!CtҲF^Eq:ŏZO>U6^AA+^K{|[n}7mիWt/=ʄ?E%ϸ7nܐg^zg:sfB|HE7_}ڵ$͛~._,)Q)SX5+3@k[u   ^BZj3g 6۷o~rR\]%ǩ'=t҅'ڽ{wQٵkА`^cuWRx(= WAAA txs=zNy޽`O?\Ϟr=FFF۷|Yrm۶400HKMԔz t^Kh6~ ;9 bcb@AAP :vzrRO<_0י3yH 7wEWЩSG޳Fѭ[b=z:ݕm+w׾]x:uWAAAM+4i⢅ uxX+9m۶ e|tT}eg4N`„ W^-,-(*ϛ+~z[y-t6U]Ŀnz^AA5 8(pС?ڴiOӏlĈ]zݩSU+W};{^'oy+< oo\1QoO+PURJm+P\q<`##zfG!B+~7֭ۮ]@AAP#{^A>}n߶X{\A߾}Svv^AA+l@+A(ȯWAAA -+PF/63l̘^z ,Y2ExAA$RhF𯭼HXog:+x7Ν ʎӌuAԼ8UK3e:kq=\wu@ >-%9)QL=Ԕ3߸v-Q0m4+h۶mB| qOϛiӧOWA\XcF@5c 9Qrْ[7=_gEugёgOOSIwn;eea^;--w}ӃwU @~''{uiݺuW0O}Q /t|FxA (bc,6W@^A~~^݉tM}DANᡥRqqqxhv;x5 8^a~^^A~ 6^A xQLg!} Tu'''QK`Q^gEEDߓ WAڼY3㑾APzyR]Gxo ֖Q1`ELT ^A+tXY^}w WA US^A ^xAMK+0AԢݻ52ZpAT;:bՇ@A Loܼ Vdk]xA F ׭[yzW ?';K.>ĿQU}@FW`7 {Fjr"ϸyMx-HS챣G+Kpҋ/>׮^7jH۷ouӥK[ @A Mx>[7um}gx + mӧ߂lm+ WA+u]>${o݌ e@AexA  x\^oa:\?}|xtTrʕ}8}O?쉈wycǎkV ^AT^ /`gO2++ccc_g=N~~ZJrSVnZXgq Sff ~Wx+ @A$'%2b\F.]$'BXXh1QgEEFhTvM ~ WA+ +?ts={Lu6Wжm[yYγ䲁AzZ*/$+^Ap4;A-+P?`_gtr~CgzAݽN:&'%JWХK1 (0^  xAP]=۷oM"7k۶mXX Ի0aիWR,-XS`7߬X0 ~vUj׮?O>]2.a+ j2! xZz ־Bxww F|_wĈLx;uX]p?LO{CCCGDx +Ƒ1}Py:c3BՓjdgg:[ʳ ҩS'tQOW ^A:eLLf,|RS*34^X^iNC@!^[oG;qxxxc RSy۷N8 +yG|n5 ܂WA%f,g!*cSi YCSA  J4f̘{ԩS󣥺@oBV+prAS^5 :w qΝ:_GQP.]x aaݻw׾JLtÆ yaC qꗋo n__r}TSc @d̃kdo,b̟ F\+:@&x!xPy*v0 x=?Z _NI-R=^G~i5mۦamڴj\AZj}>}\*-BQ/_熛W}]v5 x' P7GX X^"syƜə"9,L|%-elc+B z m۶EDDlݺUQP@+P( |}u떘T_Raa:Ν:qqX#7ްaQS@Utr.]TwܸvA ~{Н[7W}mH.xA bR?f̂e1d0HBca͋a*{ЄՕ},b̌X,K4X^^Aqqtokj̩>cǎո9sL-[QΝ#` xk2D^rp„ W^IIN8p@g>}첳K0f7s|6f6nX?nXXmٳ'@+ H^3Ncg=TeO9̢-d$c[B2 ` @5 TU&zZrxf MIIQ ~h¹:۷"6F2&:g)" 76667(F!jb2<< x{{ bСC_|z-ϝ=ûjӦ-+/SƎu]x;vu#8Пe;Cq1 ^AF901Or2Xw@+VEV}uNI ~NR9ܠh7ZJ.@G ` Y`l =Af(+WU+ʬradd;o{z𡃽M6;o^~+ jEK4ҧ 2)繺k6?v3X Y4l v: 2"ƮI &36V^g~eW4] {yy޽SW DA 6TFcAj2|? A(8Q7i~ZFR_1fMC|ɘLG-*#c?4g(@ V* + WA̘L4ޠu r삅TJ1N# R8@ riє[A*c9:@Te`xP UnzZj^ xe,M:Doe i@}i<TSAc*=MvAc[iµ=[lPDeщE;ȓ^ ~|f(4 3P AԽԔj3x @P*Zy+f o?nCb1=;Nbhs2?O+cy ҆;K"]ӪmzYPh^"6b7 C rrRNPEȸ+ WAG(!Nk4<=ޣ|-*Ɣq !B%O@,PP@B.P I 2L o:GlLLUPQe 5K It_lIHpPYYdHx99Iu!Qe#*2"777xABƔd⍀Z0fO'~MIZJ?TЀqԝ='% evH/PD{&fU׌}CAL/k +HOK̸}búyLg¼lhTXXt^ x>iK;KK (y}-fXH9@% *oIFA5SIK"R y!:[yG_(i +rJKKGJE ^Aj@LiWBh1]T) .4V'HFd2HEE:*< B(c#!NIK uTy_%id|#L[@ƋԽ^@^AM*wxA i~Ѳ-*9I92a4ˠȁQq@ 8Nal4=:O5 쩟ԉ %֕w7ܔLf(@M+@|+PƜt`֠{X]Z + x442gJۍi"vD )*j"Z{8NYM952R;ث4C Ccs2JM4ݲW`mVLW+(WP @(6 h*A%KirA In@ )gRD+f%|hA_Z@%(v7XJQ< <1Lї!-# 3KFdG\{[O2.el 9f4Z{i)I$eB Q{&BN. @PJ=(*eR2>x_ PA +ŵ;UA vР HOgh:+*shVB4Alȯ%k' W*cV6_UTnP.|HOi1 yEa@ $'%z߹gyq7=Wu*ʢWW^+&#=iPxTّvNP:+&(6)THQ(4YZ4B @ȧ6zG(\z T)Fv1ߙW*(ZQ Ø4'48bTØ 5@+@-+HKIig-]v6y_;xG޴|S+ x$5F\i3o)IYaJϯ< )9J>S<1l@BHS'm(dThPJcTGVQ= q 9iWQskBjL5i $h*F a{Ks *}#Hbbh$cK1N,B ">J[QdA)fJ[$JTOZp].lPK˕Ӯ#`bj? &=ZMuR{R\\\:zr̙3?~H՛WLh # 4Fl 2x-X [I_jx ^=<`*e)uK )H.0r=JG[Ȕ&P_PB$(† y^>EjA]WJO>">ido`zm y.ܹ!PUS{.!ݻaax .eO^AW=!^A ~*-*B~M)ݦE: D'=C0X+IsHJK(R,KQMa!=I5ti@@ytʘ5 !X%T0vL=rbZ1ޯi0Vm@M+0jjhAؾ}9sYfݻu٢gupp(++;uk :UTTt~iW^T#q + xT)0Gq v1& |( AZPP2ikOjS@ RUD6P4#7.qF"¨p⩜E)Jޗf%ܒVB(kݡr"Wucl897 >LOaW +mS d`ҥ55 _}չsCJnn./ˢrĉ_~+W 9@D9AP;2@< xcxTMLxErxCƔzQr汔м|iDH g Z@bdJqGpܣ`KB(O_LA-l" N!8RV)Pf͈4`3ϟRyWWHK)hi$Ds+,@WJM%0 ֫] vԤyÚ xgy?>Ӣ2==}ر={ݻ_~Ŵi +j^^}qBB644j}9xU+oN-+hv ?<hyZ^JWP+@A +K })Bub\Yc"''^{Fk9rϟ l5;@.gee-[lz>|^F! S diyya+ xT_M:R\{hR_D ZH9rrnR+P%_>f"S|t?t%`+Ҫ;;(OWSA/XI&,fдډ1K'~]f4-8Z1B9iu #9Uë6 F4] {:7^-P׌3 xYT6ĉUmpgD1!''grgy&==]Oay?|'߾ZWpҠ2444WƵo=W[75۷pmۯ_.4au RuyZ^0 F@_ƔR:&|؎ɭ+HKK7ns=7y䌌 Q5tЧ~gM pi9y{׿[[[SLj^J&ʩ}ѣ>Oh,$<-ْŅgnX իV.۶>\Ox]AN_jxJ]^A.&baCWAӫNPEAT*i<@6f?y0`mGNAPĦCN,7 dr)ThX!  USAp}MCt%tz,'b-=ͧYBL? GHF7n$ӽshCVblQi0Tmbj. +o@-+ JJJWX1qDQ3m4B~A=/ڵK8:[nٲ?|ܹssrr*cǎ<==:t ^ɟz^ }aÆu (Xm VW+H`aCWA ŌAƓbHE~((fG)/_ubPe3bG)Cϧ \4& q` bfX"%%t9k1ȣMmrs'b;c礫(b꧌ E`ŠI4@D^Q` >3Z+׿z:*2fhrW+ Q bWA1%Jy (eKkQJA'՛RH'CXA+M1ubG6'P@-4 B9-xL# 21RˠĘGUCrAX(6Hea;\,b)J+J]*y'H % ipס KSp h+ëQμR\iTG~)pb)zn ): ? YFQ8B1PBjRG{;@{tRKZ'+((ΪCקOy922bذa<==ojW?Qgx۫}ƥkJ |o^/nGxbNDXGxQs1QhmXI3%Qjy5Z@k$]`aCWA(cJJҾj&)I S+(UPgbwiLG($SKX/%w\J?GQD (nRe$p YR?h*tKtK{JϑR!PJ7@玦 {[䬠Io]zc?iz Dv+d_`뤕{YY x Sd* XA P=>h2)JiEҾOkiW@kzs (N4uU*il/uUL4l{0rtJ2$!7z[M58'. dDl5 /h#7@.vx~:i^A^^fFzMɯEo xkz4@8XRbi[@be ^i5|-f7!>Eڻ)KY C|4E+kB)BqEnxZNji@o eS$ vw)J&PoYQ[LvdKw>:̣s Vz ej 螣<ϢCwO0^r)-A`Lևn@(QJ ).h8{"L^Z'+S5^WFU@6 tM@D]ҫ7@P2Jp+p)%A6 1)2Q)ФS}&˥DP2n 7z7Kq*:%ŋK@>_yt41̠Ntb "MHSbTChX1^m*݌bLwќ, JڷD ^9NZWMOKmU+WH?[\Dnb1+A1 cP q& $뚀5AkB1& @RS/K0>S,)^Ea0őxZ00J)5vYzw꤂ |)xIS&S@\/&FL:Oa1}xKnKIA3iTi*-zLЫ& b91b`^N+!TЉ@|)ETRr ӛס SZ$٫C_5p'vGCt|4` zVI[ȦDI =qu`MD:lM+(f18 2i/l\AtKe4"BL(q(ӸR6N+L W}e4>hޯ^@Z 59fORزᯑ];n++hdRN9jKF w X%Bޥi?P6AaE/'r($9SJ8P_F2zNyd;R%:.b mG$I(=йttl:KD LAQ8W/2Qb}71"ULiPDDӷНrli|f95! -.@ 45wSuBslF®?9vh40s+(.LH*eNܲ{qр"UE=~ϲ>/q+,8\y.m.FkX RS==n8ٵ¼ej^=nIqZ)x*U~= S11VAX@LIc c A @5dm )XQ9FcsP$d_*M/ ǩ/^,; C(\1)alՅtnuG0](_N,By:B]L *操G5 y TaeiE1HJQt0D%-VpTNwMN^x294IMd $ҋUѹ,TwZ 2zl8L/X71`ݡ :Qoc{Vgh|xNxqw8fHu(/Up17p((*k9^w{+/D+m ^4  \TC`[ ײqT q~gifu><%Nc\ :Hl$CʅmseIU-uGhj3L{py[0іzk^aW+`&YiGa\ecį#3؋'. ^V<>/~&o>~]:?~W`u'KWnPQ^6bH\m(Xdt1{'%\ cЯXqf7epq5)<&[ȯ!u7SLh𝊄;G5%!6 6;EnN鴇nB,z"y!%0 B쀯qY7{Wnހ(>(w# -/ *^҂ig*<㴬b*`xgn.H1ff0uuım8"5o ]<ryhűsVO]~WccmnrY/8kո; ql".͵A*1sfff׫ox-HæS?3>/}`5 bjALY+h` gU0$S?pA*_tK{V;N/y[=<|oBA"e^F%Y#i.)RzRs@Yp~zdY/8kո;+0j:^a 6d%?5%!b̸K0W8 ?Añ`$"x}J9((6p (W`WS zK$$#j,A&!.`#<@BxDU(J]+d H{AohtD 릑lv&>! :< ^o b!a3$,nsۙo#p@e- P~ 9٫+r8.j#Ǿq zlz̖ʓ r'Mo*ͳ(jjrGGZ|۫軲߬j 4Χ_p皬qvW`\/XnK(tg|b ̌+0{l8胚;@oI%x 5Pr(>GFjqZ$<!s Uû*pMO4iNZx+ʦaA;+'  !e0ar)<[B׳Mp}o?mtݟ\pHFve~;Wp19̸ٿ-9t?|^6+ø Qڹ[9y A;a ].ac`fff\n`һ41-SqT 2pw9s4pX6kF89tyW[B6 5N`h9Tk8ix+wpO-kqv;`+cQ-((Sh4ўx+I&`R $9hO5ur3V>҂z!Lrt+ZpLrWp>kKTŭ%۸qvW`\շQΤ1ꊹ28?cp {̸md9o%G?A\.E'iT}P;`k&P '5ܻS[;UưJ)FPa\=ƢN 0 ;K8*F>0ٗ8\ r]QF%R 4e711k"Cyw2>=[)7_{P&X8kXrUȰ3q]"2.+Laf\; mU=h,~?WW`q'" 'r?G0\cpQ.̸2ɑ=F`H,q: 06I(4SO**v(I SN/W Xa?Z޷ݪއwbA.(3$6i:s.i؆< <6$nA%{i{pl7=F܇{-UNGhRx aW~.|1tWو/_h ҥn5\f<}<+ø +[Dr~I,/5&2/hfff\uJ''{1_;@ i/}'KM;!  ,+ˎ m`j N|z #I jB O >#a}aϯ]b7?҇q 9U@6dn/s/cRkZJCOF͏vp[lT5 .Rj 3A~&؂~ W\..apƸߘqvW`\{eIK\\r&c*nRd QE336K&BX,S@>$)`'n-,;\]b qMR vm}о[jVD[ To*T)q}B T-f!;W>w`;za p>e:22dk  w;-DWanƹǸOCd^x٣U:b.v.慔3iIЂ.H: ̌+0kԖ}" _Ťd` ^cn ,֦K0333:1;_y>ni-?ܝ&H(R`\vz.k[ܿS ilLlR DHp/]H O٨aMC6әF_Q`{&nգƻXF6+Q =l?fFyp T󬠝~(g$5L߲}U^tV/,cL8 ]x:,-u|;\%g" 03̸ +mDS;_,cpAs1io{Bff]3XbP}~k;7zD}\&Y勏Ah&AܻQ<> -Sx7znwwu'IdS+4w ASatH?1Ty` $0`G=sY8Ʀ wZnji.QpFKϕ OX渍?<|O9ύq%p5#9DSX2d~ԟ}" R$2̸ +mQsy#3[q)l&nt-4333b f@a pLW,Bݯ`sѰ]j1< _hg77 Ml(vu6vn=5l1evq{'?[`Y. ۻQZgb S_@OpM5.deE}鈰@rx }qqwu[Nӗn`^<ha /<],HM)l%3zvq65/\LtA103̸ +>lD|3,'uVW\&epGxiFffׅɟt[Q0~X׀|wD^8#)&&Rn c0q|ܫo'^bw;TNp*cOeH,)~)K}"p0X>IIZODfDçԀt.RAi0^i.9w\q'%Nc- )8_c!&R1”UD!BD8az!ů؟qffW`\bOr?%')IeZ{ ̌+0 uZh) znq,WX̝J˴0Ęl.&R[i* eR5H Gh٩#*ΖWe'1$s?WpL 03̸ +l>Ǽ39>1?,r2MwOA]J̌+0L6li'3awЦ* ߮1̍Ok}2Es=AN`ցܥb8x9 */Pa{(*Jתna$8Pii)-,75=Lj*1fW%eˍu~wk< ɐ/f^PR+/I+6!S F;X'IhӬ^zz[jN MG!kpЂP!u(qffW`\gQ0'~FN&/.~})ez%Tq{e-p-t] | ,"tQ iXd^L|ne%#,vs -pֲenW`\qׯL?ӈ201X c ʕ$H1,6A֝Ylq[4336 FW=|9wۃZm0 S?Cl<9fMAe6Fud7rX`Wpw#4*c0]F4 g; ,DIfzs-l.ۡ>N?4cz)f^6?H@>rA{ܗƹrF{[4>UAh2%0aZ¡O ?I~> ECr^ʙ'4]04ZTI+|D|tWpDeyaf\٥p]ힶVOk˻=Z;;<+0dAGQp?~G1p~\⇗A+hfvl{3mz|咥^<94>R%`'[F4nh٥oRC,Wsc\pFyh֯A7h+[ c`H-A l(c?#Ͼpz>dГ`*u$q%Tx>D/4J`r#;/2%R@WBӣ4(fUXIE8ʤ6х=ة0?ܩ cjMF"<,ڌsggvsn\Δ:Lf] Wi+.*yaXtV 4o\٥ãuߝ!?8c_2^U!Av@X+yA/{JR4Vo8)|( NKAY ǣ ~hU#~vִFC*AӨ:E'P@t9 6T @V$ʑ )x2/{ܱnxK깠A}Uف.N;EE'j$'ss @)lQW?kҜVzAmg\CGO3lXvЂ Rqff+h/;QjNEĻp8\u"eEG5o\٥C3Z4?F3 TV\Yl ̌+1 #V0uAvxvQ|3ǒ_|ĕ8kt}D/@u[As,x\E L W`1!A@>C=RqPsV`L,ANrѩ0ᅚ鞗XM n c l R@Djc` b0"˺+$jڣ"8ȐU]zX6b!ڰƦ6$T bE>J W`fvi\իjkj_\BKS!} .lD҈9xp ]j Wp#cȯJ>0XSUd QpeÜ3O{U 4y˹èj{دe(9\P4^ȻBb_&.yoP19<^-svb͍l#[g2 G()o$@ y+)>%n+Y!Q _hxsV/#ˠ2kԸ@d AcN nfe*N?tҔ$h4M#}*}qXۗn_\Vh+\@/-鵦JzmZGU F,y.?ԉzVfP}Ɯ B4Ąxy̷$$aQMbad>r|l+B SaD!/̸3K g-gC T7s3C|ӹo1Ϳ:#t fffm2p&Ky]^g' yMݩ;m.Sީ^lI"(z(* Ÿj.{Mk,^TYw.`I" S %lX) :MЎmD)2(ߟw t=|]@Stw|c8axq]cLqXC 48 T% i9 &=J$ke !)Т ~w줻.x'֠lpV`D03̸ +x_٬Q$ଌ11Xx-9F]i-{&?(^} xb`c(r5Krc^4ONf5@ w!\Mfի~ɧjGN*;!`\xv+D;] lr49.[RY 8#gi3 KS TFj=, p3HNcۡYÊTA,+^ȤAE'd⢛&-7AoD/S`6T!Rn9DN=f`vAz0u˔K+033 ޿6lD?" M{tuOQM̸k j1 V@•$7E=|([>]F:@H/p 0 F]xLmYP-rMjZh_Y|Fcw3 f1n\)bp%Lvw5_v<_u_[} {Ex?WN!¡01Zޠ-PvE)Pˌ|!E 10D&!uA $#D }.p>ˠv*{Psyp\vf] # _< ny|] '?1 }∂ 5~=+coH?]6F[4A33 `v6߮Iv^Qr pr4)q?OS8#"= /:?y8&Sh]+34_|} V3o>}M#~~ `W!ASݪ {7s\EJ>p& EpzxcnA|vI{?K1Q&b?_%? Z^AP>^Rd U!+9x]t zAR0tdȳhWuDyv1lev9}7SQːf:[xq8>ո3Dk6 ](zf\qfѾSDsC8}|Jd fffnvȘ=*Nnc*dށL -EK` `8| I{ ,cǸ*"n98-Q:; X{z\l)-0Osꘃ&4k>J 5iŽG&oqv}a}}ttDGPɷJBkh<F3A ?O Y;5:T袵?SQʓi#bH.F+%n$ /b Xx jʸ V9@j8Vc&cbGlK3jqHdء}M4ɸ +iBss4cݲqWO!&]/qB_k?(>GyLCgr HӀ.^^Wkx:2%<4U@}ΫRT߂0 \ ;K5I+;dRQw~iwZ{Rt[E"C2$-2><#oABkYU ZBq:חrP%;JE r?a:8,֍y}j76n:z%0~GH-ȋnHjwKaUqI^KRЋI}] 1|afvx !R;NBeZpH|XrNi}4[OG#UUx5;~T"fS8^LX .7W~Yo3L=qs]:+0۔s_E8L}o4033Y_Ṵxqzz?r_Op$Th}@ u XnNA *}W|RQuF'Hj o0ߙetԭhW&R Tu f]r8nnwrw#njtr7ID a;6m_t<[D[!t0٪ IhD3X{ CVZǙ`.ú J6,g *8  #t#t4bBNЦTȦVzo瓐ǯ`!4R[|\{W`fvP( xG|?rW`\ٕFh`(K}LƱ4o 3 .ƀ@Ǔ&A] >`rIo1ޫ+-ELRV@hJWb2=){@?'WT4y!xZ| N=pץ/|_ bB/|gjr8m7>un W6Gk.H=J u ]dt i頢Ah/ an`N)%σ+- Q[ ToHK,^o8g)wۭ{s@}ZRN_S?gZccX>5y}TN+Ш.( WjNARuW2~/z9|W ~9KYF8%:(~;cDzr_W~1P@Ԕ@LbRM,?x +5&&?<]<"838^D:LURK`f\e @cڗ!?pYø ̮]h/G_pOyqgy?6ۊ-W`6%O ^T) |Jy~ܹg&Iz BSs$ p̀jU+^hR l҈A.|V! O F,\|'p#AOt>U("!ns_ [b[wxɰ:LJ(CAk=8_ky# f2iLpDPwqvL0Β /./4z&} XaDY)W)[  Q %X=, %iD)aIcZa1ꖍ Q-V~}PCFW`fvews]wC F_:+0 WG.%f8( 4jjWs[4{dM1{6œ~+[ ).`<<')/ o~R]11H(fߐ& rAФ˕1]v}+b1OS 'LQ0,JkY *00,Rv.1} N঄RՐC167q9 qK#61` RͨD"r. a1J ,Tr肥έf♔h!=]QZt]XD]cPPWQǹ7X2F24_ 2GpG +fQ[Z! ٣e"URutYAtF/ *G }])zpX5׳#lQJ!@5dh$N|FG3ADFi|0hxr/h<'}'ե>ZXz/O:`-daBx/)f {ק"6$M I%sbL+A1Ii3OY1u5:ʣz厶ôYME7 nҢ%|\%`>ĕcqffW+}=uW`\=?1༖y&h`f\ T_ <=|5UkzXqe$T&FHek!%N3[<ʻ}|v;uXRP(9v:DϿ(ae +ZQ2fq{.xbHE/PfMBD4$c$w`Ta- <؞(m4e#,$q+q6<$#Q9ɐ2 );Ԫ}J0!$âa' V@@cLi4qffW+\q]iQUFezff6?V(kSoXLJ=#[#Dpk$&7F\)}Zgz/R "^A7N "@3iِVVOБYߪ_n -8Fڴ]lT8W_JTL!nZ6˸2 >}\VW]# 2圉pqT_ғp+ ( (Q` pqG#k ToL>6 a. "a}1KV>6R2r#ҠqJH+RD^ tIHʀj+0ۂ+03b\@WW:+0J_Wlq'C5 d6㶾B`-Gޯ[B׃=Zh (z`*iJRb D WQ }Mp 4r} rΧr Šh q0QMW%b+&Vo$7@=ڵ,K0+$J{SPA$dXJ+Lad{Yri E ZJ` ,D4sB]nefaҫƓFVҔT.bco{;Zďi4B gK+*3 q-θ3+,y:ih,PS,^d\qfWھxfyD# .4#̮ia3CWr@MxuW|W]*`-(M(W0[i9w#ZfQ@VRؠ1@ N^DYJqE XE^HmĕE{ %,:WL(p}29V*tpOn@XUSDxv:˵Z ogU(FtF#M M>C>ϤKܵW+aZ̠&xO(AXZp_II9.S>Oa\'sWhUA|, !zڣh#(a"=G|rR>"hĵqffW+hk]j!YҗrV7=V1E|Vr{$40?q>K056_QalXHݪw'Q є .(8;p'4/T@*2S>asȐ+p~Q-hVt8Kbc 9g?0|ٞ&\ [ U_~瘻}ls}0n_3eR] Azd&R3{Gɇ$i|:.*%dsq_E#8_4|/8B'OױcSѧLVGn oEyʧ$aO{x -061^=qffW^R|4e%Z[=m| >Ȋ-lmn6o\ٕ/*hDag&l4A3 I ͓!hsOdED&EN> yaunB 0bEQ/%rMK?] !MKگM_k3xU/iQt,?"TK#3£0ՙD3ph^?0k WyDAǢ!p{RaY^ڎ~+}HZBC0A!2vFr&a=+ќMYx69|ײ,S5Т[>Ja@iuTa#0c R|5 #pA~ +y:kqւK>Yho5o\ձN DF\- K/mRf\6b g lHKOZF@rz;~ǀq5@n~(j-x5))-ء꡴z} By M- [i ..|/Q Cx@J0쩷!0dž0 f0D !k,Wc'D ~* o\M? S1m Hus/+ܫ}uzT N!$ vB~Ad鈸e!kS񘣢A~dBt1l+X^p? "1!fW&ld2A,3+肶꺚ws4V45g0߸cwK D]%h0 ̌+xl"4]=U0e@>1`xo; n1ڭMj\zX UZ:cU~/ zi.؈_{fFh {`85=y!U avqwP:7ݱ}\S`a=hh%_pCVyW|࿨,P)70eL*lg 81@tu f ̗?*Q`{T*j"lI$YI۪ R\׺yLAC M4xY?T^Z#Zp6.ఌ +0vvO[m]ep܏`T.f\-7t&pcD_]1UD/*i׃""!r@s ꢜhݼ\.!l :\7jBE%v@qގ@}uHRc$r8yR4y+/uQ>WB+ nׯb_bg0@t& kC~6 $ja |'+``U*%WM'Y|v*cS !Pe$v2JhŤHKK*w%Ii'dV )M>c3Έ +0vO[qQa +Mб鬜+  5h0߸3m4A3 tg}[[J'(s@vE LzTJ?`8&A֙ν|AFtiR Zh(R":Xo[][\J$Jx}n}yz3e?È,ׂ տo/$550qDjd'X4ڶpY|7.RI'JViy|ǹH;$WIjjCJ^HDJ 7ꥑ1h!Xf 7)5–t򩐎rTrٌ+0 :N<첚Sh4.,W~vYqёf W`fvÚ g6Nnoe^Gx `l*fNFUѯR{9/VEL埤 EWл8ɫAʫ#bT|^ mMup-aũzop`tw}`^"ŌGHyBWfq~`~D?O k9.F~ӿK1"g!x1§GKXL "a0a(Ŵ#7Q:4Cv*Aqup }Jĵ~b $@fb /, ̮MU5Չd/zqff7qW/k q;Nv,A .mP@_Oj`rM ߅5\߽sF{?rw6R[997QTN$Eb?T^B{3oQ59׻tvӧFw댡8V7NeH¿`[ԟ)K-XjW?Q4D7TՆ(|\&"ǵ~ARb6ܑ$죋rh[4,!#W`e-ZA>{諅R&dQ.e4 kzZ^`\qf:WڲwQ0"YՆ+033K7403=w0VoDqYL Z%^xm UCSb *=P %xT;?GŠVu[?zP8Q-W9KC꿎1ηhix<-"]_x?2Gٴz `*)O:/:Y+{Lޓ cݒZCNB_"XF$@qW FNE_b +R ^z)a̙4j]IWiuB˝ WͯXʍ$zu5r22Si5 x! L6ô̌+0Y 0~Pu5U+033ag4Xf\2]}Nv_kA/cם.A/?uL0ވzavAGdrO5\Yi!?Y|'Wx4( 1Nk)Ts7tpcHHi5c`=Z~{pK+0f>v bRPVJ$l`~6})(AA0!5C XDK 0x^aVg&1Ft$4UA>*FA"IJ u0<[ r}6}?`f\qW`ffv6}403 l/3/G8QI;<r;[i02doӿBdHT8N9j{ MZ/K#i=Z# řK|@X51MEntw1wso~Mstg Q[ZedE2qDc~ gbڈZrqJR5嚣)!Ȅo@5tZ(e=#~^t ۹cx%ćHubj/ cX-/:9J2JJI X _bwRuq3i /s IR#ut2Q|S!y YD]@- 5J93AAn>>EWr_>v7 2ZhDMPUD!`'Yj] K`)"fcr},d$ 04ciSQ 9#CqDӁs&-WN>dBR%v衵7:ܯ&Ms 6``LUORt+)ؤ_D:$F\D3uOAt-Ě_ϙV~(suSaV7hFƹi>T\ͳ8:(jNRdHhHCoH/X N@e.W451iW` ~q]M%hmf7W0 c{ZAp n*[.{X SմiJ$j tN%Ϳk s9tr AOq//{ =^S*ҐzB .[ha=`< y{n [\.k nL=fz?IUԨ`lB\U%u)D%2"1Ԡ6(tAkb5"KAUN!lh@}TT3٥7Xs hkaYj歭xgi%\yO$2w6Wu03̸ +0*[޺ؿfkN s&wBtk~0r=5;q(p7陋u*`>TZJ &`h:-/ՒU! ^bb7iĽK8P|o:@|րmGƻ]w?r (5 4c:$:룼Hg``.Q6xeOSj JVL"kՒ,WPoW kX#t]'WԊ ]+PfeB(83A_ %=`ZbqxI0QS e9gd`=L'qf Y48qgf3f0 ̮[`fwN$=?b(Qb~ʻQUOۣa@wExQcy18Z<]tizB4/1}@a[ S*x*MCjǝ-$,wBAlO⸟A6[ܯGZaJ#+ZRkEd b5&ʸjb*s(gX\|U!`κaPDV̓ kM "ru gEK0rXF%7|ܻu D5)$ğ4ǣH]>-y\λY`n͌+0ag9q]9lef@|chqr7Nzڃת> ]hWk0|R=A p/Pur6^,.G+(~A 6x7A/ EGhg5QjIUKHrGo9S#/@@> $)Z˯34g?)A:ލjY&"^zcF#i@Ef Ucx*) Z[Ɋ%D\4175b;.Tp hvII6AW;SW %9-[A2 ^=poP$濥ZWu h~|E 0MoiU:U/MŴ@H&\٤aGHx%?K(x3@W_w=w|F%!I!9Bq rPSY;5taUA\8+ߧ9YJDā}^NXFR,33GRtlTf0FƼIɟ'2Lay[ q}= hYoЦ1arT33 ̌+C~Goo>ޟue033F Lqop") &(C+aIP~կӽȹwWA.XO.Р Tz%)]?/,i@Q 9P2&GdRyi ){#܇2;]BELj6kiaPE_oe87ңx@LK ˴٘'00M)J+kxKXSz$rB=E`_fW0+B>๎ER^x+033lq&l4A  0ԥ^pnKv>, &N`b D6 iG]%xXOq(@'x`?) iT8A 6оT~n٪Xd끽s+}LqT۩93s`'v.xYީ*PǦDSELd ،zhCB)2B33 ̌+87W8vqC< +033{l*'2fϹqMϠ*5=;wۿ (w=\9+DF4_^T5hVӒ>trBp(J,-DXhf^?fJ`vaBܾH Tۛݯ&/L +*_JBZa>H"(9Lb%PPcv-QF~ s)Ĩ'١h L1B.S@IhBjJR1{-%*۸Uhg 8_#3Y4^RdA l7N̸3 q`p`<… >7n8erW`\{g4m\Et٧xr1 iPE2,TlwhN6M@ɗn(}ۧIc]BBy8N{AԃXh{1n9KH-3c<2v6Z3 9Wz{tuv\9+0Z-ڿ\ Rs"yC@<`uX;R~YA, =&n_> l ^2Xnb|'KUBL"l₀f0IZ7t258~ڀG~w{\U#ʍLzu<_|% ! /wvp5R^1)Ê o3AUEG-1J䰔63ˆ2i(Q<]{"PYl>04hghx/0@c(3{xټe̓qMʰ*3 .+w\q]6 &Z&Jw U\_k~ /Sܢ3'T-(=R@ ,4A MŴ*bL^WDi%j|ң+eνvS7wn_>1tܫ A||{ 5Nۙ]&ȷRz:){Y"uP$E !FxɲL{OȅyrDIUV4DsY94>Z[ǧ(vrF;!3Ѵgep>EW`fnv_ø ̮} Wpl*13ڝv>\&ݩ@E.x!_E(/ EԮlVȯ8 x:@y?;TAȪJ ,kH.TnZ/#S+s~{6Y6]V&Z-[( F@ bLHH2syŪ GԒF9T${0dJ$N0w@/>*+7C$Y]#g^DA.:gbh.djNt&scK _VL  \+p89k?auɭo=VUqg6cAٲΆ=[Uv( 9># Le^Vq_]p[z{eڏw3!3{BWI~Of!KTh4|hS᪑0s ;sclYv&V6f3} a߷2,@q׳z-9##A(>2` A^kYpJKq4K-&n¯, c4Cw@x+3S6}?;բKZ{N2kõ㗬<}}0ԣ=Zk=w<>7E6B3jP,Ӥ $!Nn!(aB]V"O@*˩d`_}p#Ͻ*FyzU½0V}i&{^l \`Z" b= gl(T {; 4|tњ B<_Vuչ_ ?ƙ~Ls#Do|Ja$ͨ ._{Ы2N ~7燙%xD4h$|x_acOާ`o3j'\ʕwL2NglSC#dYuy#dR€2i;X0*2;txn|Pӈ9,j%w"MNZ3XZ% \wZARCH$W5@t8\+p8~Z@o{<ԣ?\ǣ=3O:ik}24XV0E{gWa_Suu4 :4'I2]̯e#13͐NpDw@`9H6ȃ,? [WoP9& 4fB]RVGå[¿{1|pgWX-b\ ͌ʶ\~5aJ3u__[-uL*|]Xw&%$0B)t0k0֥Yz>" -GCph&>})e=[,b9ԉc(l⯥T}PAEU-wj`I 7pgqVpevu467SΎxN]+p8KT`hSif>E`;(ZA)]0 @H]rkaС$D/-ξCW'`E =d C. {;o4*>$RM8~aqK4UI'i=b8|7z2aZP Qѯ^ B0-BBەcU -)qlW3rȪbD=#O)RD2uW|ۣʝXCWɿ_E /%!#77؄9taXsc攲1_#oZp pr}\ "Φ QoOOC?%B:4q &~+ 9Y^7qQ70"!Hw4Nyf˚*n!nuG`0c(\ >7|!f4fpl&abLc6:~ +`-0nLJ, ˪ ge ~#4FvK 5V$r|ix7yFf0z{a)FKɷ$摌&1}xwsf88Vp  nh A\1l^9 1$o07yC.! Z=[i d 43_CTj3O"·.*3D$YE9$8Vp Dž` `tgPE~σQZ,:(Y*fON¾qE&0ɀ(B/ *O۫ai>'%5-ѩQ j۸^G`ݒ$$z2؝?f<V7Cad0,cjq)UC=#wI(K΋'v,2 {0f/=-[ٮKlJK%.BidFLu^SJcZ%&XC/ͷXc5:R3Ex,fSvb ZpZ8OW_k~x )G`ܽvI>WV^WI_Hd!`T,mZ`YEFը*pa[M 2=%f]{ 'n ^q&V,"w<>;x`,gDd?hE“Ll)mfsz4 ꖉ2,Kj]H%\ c-D$n\(m06jC{uq/CMp]}A nŠqF;#f3;֌nL _$-%˟`upZ8ߏK(굂[.?J JPNc vq%J73"cJ}/&aM|'Pмe'3A5Gh| [V&9IB-S8SгY[? O)uOH#LFdg%mB 'ߓ cS% /uxlG%P}r]18ΖnV*^ul{_YUW*Gد{#')(h:ߪTP}57?L1TL, ?f\(p8\+pVkD!ȟ24X|M C\ F7gq2{&{lAYb֥M| c¿)~oI ޠ6Fb-mlQ َA6b&X;ڜk6q=YcqRoG9$o<,= ˜[.NQW˱Gq.;Y`9B#d@+7 a JVC㤘klW7pZVp8~qf8iUĩ߂핧~9 '>w6F;xpbj7eK_~hZ)єZ"fAnKFHcU=)Ӄv \e rI]Nj/ `ΧX]JօqSΔuclTj.uuLpA7{wӌR2^J]HĔ"HH#WsQN63$#n qxDM$A^+av%.Yhc}̧E XQ-^SLH Zk㗄nh // 64!g`И%қͻ`Fe?#[c?i5aXzE?D΁QADj C KEpYz+g?sOPQ'D7a;0)og3N#/3,|-Ŝϒ8QO Z5=GR5C,$%׈|LO{DmQLJWyCc2kob2q%LQoPKK$ h58+!4)}SN1G!`ia 4l_>M aVwg5~\R~IMf?[tBMrqlÛPAf 7kFDNyYڨ8?ŰǤfH'S^0C7U2% Ŷסt|#iĴ zX:4Z6q]xCxB&VZC)96u<õk~VZp^74wlUUo_rY-dF-I;I4n(|Bu+ ܍Jd7dy MȻe:IŞ+kmU?Ģ ̫ )!<+8Jy=qsœtB{>3gqq:%E<wަrtUl =ê*0=ϋȷ!moRZ"UPozK9/IS)>T/2ž:JBdU`;,Gii*k p74_9@xa֙E]]wPTdZ6YhV$ {p :Y&i[웰TS!doLk\? M?-R*U`-8ލ0}j>kEpٓQlR1LI)Sbe3\3L*!-hL+# #t3 =%f; 9,^4f*XIR>fۤ qHKAN:2;^}$0FY88\+õ o,mh]Ew18dvO+Rm()do7.M.x刢mh q!#0y*{_0=Θe_;mLoŊyn _֔! V.6%+̄pyGʰ-0-v+_&['e ˊ̬o<PmqV; NDaCPl `H+)8s" sb-SE_#R0r3Y!?')kI(Lp~l KYCõk~VZxOokhP˙ -YA^H.B?jo"<Csi[L|>Z5\N(ޣ뙸Cr3Vtpe,涢nJ^'^g_ G'•0/ӟPBI&GQ y ԰q?&5˘q:nV:.%wͬFguS穏X/(sF+Q2޸CϢ^]^E->Q.ȵŸNx.&S׃#ѥ-'ɢbݮ'Pnscʚ PeiODm>/rx0q>!GAx'@Tֈ>ULruE2)[2;8;)aR΍̧D&O,d:%=C5gvה9=nb]4夆CC$g !տh\5^Hg[-pVp \+p8}lxCP{_ W?^>Dc_Yv14lsBGP12.Ƴ{k +CNYs b;[X`+laֆy=+ UK¦$',8y~8˕G˔eϿ$ثv>f](;UaL 1y? wϦC]I1M!fUxY?4E >|\C*$3ZcߢdpZkVp8޿![yG׳"Oj$/O`^VM0KinQ`IVx1(mZ QhoTxO D/-we2H<=lجz?3*r!O*špU&ȅi[Ÿ\.mI9M BB-[W mWٞLq/:$)Y5GI dSX# O/UvUCaΰ,vb!+`V1a4Z^Gy:c'1cR٩q\ZZk8 H?ehrr|<a OOpNiS5*fmr.?`53}8ةdpQTY }?Μf* Μ7&b;V0p\bVwm n.RoZan] ?[dߘ{O,.VX2, |!w+Y YK씧ڇQ+dOhbIS}b$25^PE' F3UʃuNg:/3Zc4S6mbHzrVi x lCY#&<@BȬpp 㗍LCq-8e[n>,QǀfgjipcaG558Uq]Ku5u0*F9Ly7#dՎzKXĔF9ƙ&R0Q"0 >~oO3aHԪ ̆,gLRlq,$T _S^ܯ@ϕO*[,ӓ@_qZZAŬsJJ(8 eRhYC)Tr0&HxԺ%1\po._h-jR)  c1jPcmNkuviB[=g*)y_ڮvg1p\10_B1PSK)A-,f)v{(Z:,r`*O xSõõ \+p8_fch0z~GllTXmإi]AfHIK/3!Y˜ ưHBlʘ~JgO!{ϓiW?"|xRmYr>:/br3^18BA9?'aTr|<:16ܜwcNb1 R3RF%&Q*CeaG^0/GuXחyN8<_p O)Zõõ \+p8_漫+fPoa[w/o EւU- I0 E  W!s'ӊd3P*J^x/`^y=H}?ӈBiS2j8[(_yn70kIk?Ìqk2SeYGP$a Ʋy9`FX !#Q&%:eU둔4_DZ@kbL~T\p8\+p8\+õMÂw֐0)֟2]e+F=VsRjAFrJ̼Y(A#[c7Bg9zZk pp8 f + d? +1q^q0:A2o#\-<$$ZpOCbzQg0=_VpZ^{wrs|Hr0h&n}P{iCřL[10k |<qDW[fJS,(E,`T;!C<"O&fv31g%1!* [#[gRQcOqjm5̓DbF^n<";``{-9Vp }Rϊ..߀:QP(pkn|Q+H(m8u)Md hDT2N:?K^5x[JUׄeVI(p󏰖#(vGFd8 aR~9|J׌p2X.ށa HYǦePr$'ᢞ-=C|[OAf2'L̬' =ͦ=IR<\cnd2 ߏZk pp8ާ24L৽Pf'$W.DRzfpV .usa!6\$L9Dϧr!k/kܵKu??\'4ht#֙+"(+hJ#p? d|)%3~ԃu-V`kFLxmĬo畭g[Fk9&[ɣ:]'n%zt׸w)cZk pp8(YxHz#lq624K}j^$vxn)7> lF9CyMf{ŷEoKL@ &SĨgK0Ɔ2߀n/C{ôg  3^ $ /ycɷ8&Y$ڇu,P){X:gؓ==(Z#nv,3ea~mlT%/u V:"mþ-)#p88\+õP CRȖ@o`%̤X`Vbqז?F`zB컟wcw˟dĐj`̺[0_'|3|z~X8ܳ&>dSsscIy06Ife!;8YHq'.RP@;I% 'F.,xp]_d{U9\_io0zNS>0kJy'̊ZQơ ]X-s+lכpmHaԒeF䋘kA)9֛@@Xhcc;Qx %!]VSɕ ~R(p8\+pVkq'Ia&,Ai.byl%O,3Kk4`-$$wCo3K .0@|GdM`l39i07|Hl>?Z.&EadY+8Kx1s_Va%7ognā&?G /TaˬK*35;8OKB ȝHeɹ^}~O1õk~Vp8JJԵ*lԂCZVC@cM,<^8tu/^SYr/7*4á }"Ke;%"o΁ia-L2ɯL!s`MZg Cܰt`' ˷V Ics 䴮I] g*6,>UZõ?\+pp\h&9׈ןEhNٜJmRk'OК΃6k R&\BK89 ~搃6k!W.I'eP^h }+|r#AI(*48ro GTЭ̄l ǥ˙+pA>W1 V#Hp+3j1~\Va f`kLY$.K Zõ?\+pp\ pԿzv8"?.cp£J!h&v_1T;$Fa)I9&8m 7`*ʕ̪"?.Kaz*\~k(\3w@ᏫQ`1.ST ?@i$ X'aN>PF4h~4y T=DN`MʈXϛV`k;kRzH%'6-:TԻ%?B?+8rFۋ/j+|#_]0sTÐ Y*@˧4>W<=ɢo5kdWLx=ogDUZKt0q[Yc<r f5 xU9Q=Fy)ǐ$Dĩic% sy_O415Xõk~VZḀq5v Twz'XV^&&I9lCp:l[[ 9S"ykI[nr bitjR*Bnڹ9^Q6L{-kcb<\3@`}{ yU+S2G<{az+& ]lf4or~V4Oq_ 9Lug`<ۙꐊ;FT#P`2rOd/;yR^RZ2õk~VZḰa=&B 5οVzIf!xkJvPqPVe0JRA W%@81.k %.l)3%Hz"f=n10'-2 RjhqeQni#พGx 0| ݁]$x=q(XOCQr0U"a`+֮Q]RLlõk~VZ1?;o^Cp[!O) ,Q?/ tT[-0&US~(L)9?'/12oQs-Γ? q#3}4Ն; @F(U2Zݐ4pNp1Qg;_Ec,<;RCTOxM08Yͬ=[cϓ:$wjd< Yގ>k VZpȽoW߷`˾ׂz){).ˆ[.\ Y o7QzRA&`Z簄`ӥoJ 9}0{4|hSo |*lSy~##W48#-Ja]Ie]Bli7'Im0#&TQ͘q6 m)F#X03l& }$$k m(+.F6*gHri…Zõg߮Vp8\%$|L~w@ 0֔LFp.Qmw3$1^Xl;%s2 4כ"I0yث%x vPP)z튓'`G!RK";ІDPD A` QV1V\#qBZZk8p9 0|ѳF~IΛ 6 CA4Ӄa7~`vX-բ:̄V:6457|XtYNB7ORJ'[ehI2, )OZBD.zVQpk&rq?ŏiq>5 v$6rBP9: jT?ZZk8A*?h70f ez9{lK?9棢:Q 2~H({P.Ǎ-|kQr+eYu@[ WpUu2p3E`|Cb^FLÚ3,s>"Sd Aԋ^ֲ"3LcZ6I%ia- FyAqݦ&[|u>\GA*y Cxp88VZpkqrvM:9uL bIV[-"X: I볔QU~‹@7OlROOYUn]_n 3xb_ˋa=.ˊm=+<bcD[4h^N1ýEAoT׃or&ԋ!6?E7QLc`nveq Va.au[yh`fdDPõõ \+p82| *=FܼĚt aYĠ U[A7rrD2ǀ $#L `bmuRXB-PoKoVqI0.Ʒpkˉp%f=@yk?aH6!O8)U$B9!FrvA;96}+A'< ?# _(kXaICdH?B9^kp8\+p8\+p89 8Q"Ծ>cK 7u3,a/ ślDn7n`}WdK\%nRu 䌙EB=cm'Í$4s#%pgӋw݄:1F6EFAvȝ/ [Yl2+#ǣ,[h Aъ)6#8N}ƙ(#4).~AVJgRdZZk8߅%d U U;`\x5"l59c؅{+goVӐV@y*>&c1Xv Vs#?^lf4Dygߍ{ uR2! NK(Oe a S `)̹ăVzNicᥗIuAD;iј9ނ2HY(4 kkVp8? *[qhl5!yD7W0HwR~XVeVkPʸ 'SD3FSPrSbws*HÉy$Qc`bmPNj2(E"Opc1)= 쯳.;_40V^[DGٙȇaB,T6j{MM֞'b9cYQTXl1rZTpp (4 ) aEL'^=?OUM U6`XQ}epnXiD{j@`FHOtXjeX072>  @tYg{%#;-|8$gҪ [)h%2) x[E]mZRc ?{\6fxI!1-עR|uB9q!XNBBC!9_pp AE_$a %!"Ĉ@B/#]iXq\c9fz6uhĐp9TOJ|3#'d?W 3ZCpK.L+pDD ϨJ 26ó,8fCֱKVN ?k;AL-2 N3ՕLܵeMjI0E4 ë\S#p88Zp*5Գ[" 9߯)daiॲ/uG5aVQ=u=+Ϫ C3@y[1[? L;O1E'F^"쒑B䢰ᐛV|VWCيWr>]U!<;_4-#q1g2|-ڤ싒GDVNxGL6jU+8opVpVk ۉEf3cxxt+@-"Ζb6R`_L#62xh,.!R3,BP3'[Tg0 ,cU-̿9}4 \q;lP1atJKR0\\rxɜ/z=Ԩ"K2@=y$L1Ą!v]*ZΙ3fu;ZZ8φjBcgoV#qn7X!%CCV~)eU "m6~9e7i&*t `IaXZJyA+"̕c{l=4kyзbݾ k8\+õQű zl-(m+ܿ^-. z*M5YF`9Ui0˺ϩ|S )v8cᲦW &ô &+ZOs/ &zVǿ2Ӌ |;Q6֟7p.ne,Mɤc^;(00>}@0V)+Uxõ Zp(G @{vBhNELXp|'E}ܲI9QuD)@kɁEք?ɆgvU_jUGALC7s.]v0]8$nuj8#ZE/1N]$us[dSyh!q~mB̵`=?WP0 [ oZk pp8~!,~0B,{Y#S\ir8cɷ8݊xL qKxJLUƸ'| 2^҂80>~7GÌ ˈ*8*ih9P~Nn~7?N9Q6I"h@6LXhcGÌF3y\p`- l"UBZS“LcC0uQ1i.010s2Z)mc3pc d-ԏSey8k8\+õ9QIӽ ";Ga^w,>&f`ԃfF'[%!d{=%*1HrES#b' USlG+; 3bS~j̐q7 0Vdj|ЦGa+WXy* d8 ea) /3Bv $8k8\+õQA:rxHmXmqdK?I$|X~S zUWяr}:Qv0O}V ]N:'ϴP a&`Ml˅-Bq0[h7pK|KZf>u?QЏ-u,TDU~~ 4X >$}#ə6nl. OɬċЈsM>2?!9dư/ eoTC-Vv3^79dFDTR8k8\+õ0Ыעv-henaT$R'(ƂYrZT7&ہfYdLam_ ֆ?|:O[~Lpo'k0-:HB铌0ek:>^dUw9gH$lO5c#+Z I>l fZ3b3)74x38kk~Vp8߸u^ EKשL C,{>RfoS)$4y(!MxZNy&aʓ9B"&"[d t\w1h8prJ(.VZYEa'Ҍ0 XyP4%^ hE7QQۉaa\ĤJ9dxuusr Q?2Iz3T4 õ ZḐag@[`ǏruܒYs[Y9QY9GwP<po2aF6L*1y)-XyƤu7Bǝ1S^Cxr$ pƎ=p.(kG0P_yn'-W| Z+B1%n2X ^9¼_tC74p8Vp DžT7u(%oAjFB+qgT0ƯitIYmS³\SPH2l(:\>:L'0/\VjaT>(ПV E'bz1,Tuެ3+eu8D^&1&%$L_w3c Pt ԨDx$g)D3*saH(~^Rr'hVrBZIQ|9;bRDk0#.LB˛u@3{էU`I)R.f'fpP1Wp1.;)a3"<$ 'y\5x74p88VZx`TGqܽA},R|V9Jw aXrPĀ!Dz7~znSrB^d`I1FM1}+c1VBR Ӑf~*lU`뒨rD \-!N{ slq7[t88VZ ClCX4xi+NanRေIٟ?Mzވe ȫ>'O8.̈́pXȅiBs&%d~V"*jTdPTQ:ɾ`73يb>t#D id9^ 56^ϡb׹-,?BrSpVpVZk7 k8!:i*(mZYXv?$e A#6124tU™[ZfBLƃC=0-fᒱh[Jjh:p$#\WV"IY `./*+q"6GG#܃2DUmF s+9V#Jt2M74p88VZ AS^ Hw#GI?{ !F~6H~&N)'!?g%(E6=*uGT&̈FÇvuQ(͐MN| (Aګ[T21$2 i`''1%kWq ^W+걸PDTFEa ]!pVpVZkׅۉVWJ;%8()M[wQ NSS~I5FlFp L2< {BE"\Rv 5>2.(0] q2ksC'udPn#CN ecS`eY0!1+` &2X _ O kkVp8~eE{w5ltoT@KQA}6c$4y4)Q MV@Z x*.04~5{sq{C0&ePVQ V"T@JTeVDE <Ƞ aHBy8-w$${o:{=$ؼ^]'Lu= ^Ε.'pZ>zI>#ڈ DV^+.q%ﱠx W+K&X8%K읔^5~$wΔ\X Hs -Ȗ& 2b6.üLϐyY]<0[,i&o/[ VTJpF'I3DȤFe$J/uDKcR𰹅\g,%W]%5D[$13*[3QB?Q٩v1'$Q,6"LlI2KFۮtG[ W+ Jc'Krd*?}E"ټO\Ͼ5_-pbz'ROD5HkfDK o  ## t XUYR2V<3^a!TBNȕ;_pɉT32W"H$Cc0StG,".n؆DF 3GpxZ.,MF b' r fC %}+'j"xxy.+\+@Q@!i.Rdnɑu]G!0K$ː=`^KXӞ&d7ȓ"Ll43\AśzVl&롃V`v)qx[ fE=?_=!לfti9n`&#Kdܑ㚓剝jdmN2aY91,aH|) :O}d +R`* WW+t${=!Jj˗9["K%̔:Q@g{ `@^'_W$H:Iޞ \E|Uj5e_?Z5O˹LB%f\P7rtn/$m3#lT u |/}Gu$˥~t!3 "!:_)#] ,<##4Cw= B垟w#YC Έ|8 s4ܸK1 pW&leY@)2`c~:G-)mN3MD;<3` ϤY2>ެ$gV4S|T Vìvqj^hVRmIATi%Is\jV- $OO5qV9[Me`4Dɔ/H$/4$j nKH!0BT@yqRPIP_WOሜ"=\&(h\@e$LIdQ?{z~3zҨ5Bz$ɤTOl=_,0-ּO1 8j~iLY>qTkDkvD*"T' ڈ MR*7g&"Y>]&$In0Wdu2#BK ~0m07#O#A1OwxBtWpY W@ pM+& mT4I:GH&AIMH:ewЖydԁ^p!Ӥ&|s-s}6)5+/?7!)R1Jy 2_` Pcȯ72LYfB.Bl~i ,arFu#M!_Jه]$n, Q$ (ౠc< *oK:F^ yl%C$c #ɎO$zcS08i&>m"b1,=ȧ"jnZ&[XĚQ:R@i!a8/$E#ěIr1䐇5ϕDudzbWE ^!](]!ED<.>ח=5 S? WW+yIJ^Eɉfb˼@0 S͂Gz@p=MIc.9/3&8h8pL_g񿞽[U\_'ժcXU: &yWWR1|Y`L%(t »id&_b $Ǐ!_ w**y.R"F3|'d<}A2נe J?)h0abZhWWW]H[#“XXyO\J2kt=?OLA ?,4ᐙbhd>./ejCV vU}/ժgUO5 DZ笣^I?O-Th ar_iraN3RlbC?` yiUh3_#Yk\փh-% "e2s_iyiݧ_; yqf Bz@!Ɏ=WPeSVO5QVX*ɏNKlQ )Im+K 2o#Xmb8)ן ~%ޠFt* ݌8#ҕXL*3UȐMUT/SpW WWRIlexXWgL=@QȨŒ/3%.0#SLs!>Yz[uNYYZM|3dAF(͖uDXädQPWE)abc`[ I.GGL(!0Ʋ37;'gxAc60 ]_\UEG)h[ p.P޿CUE c0#dٷ9VZԣBl7D^ 6p,h''յ77)"%IEh)pX_YJ.V& Px\+0Ȳfe~dIR@ExBɬw2ˇH{)l؟% {LgvnAZ [2VLL . ti4KW0^T\(CȗA1Jc&EcQ*Rd.ݰA,iYoB +"T(h+ pP~% "$qH|eM!\J&I'oCE72_ {N5fX}GߞndjWifRx\+"D>\vzr%G.Be(GrbY>C tNK>yJ2EK]&_;^- |PW+ +,pP^")@'@͟jg;%&-DSedX5O[-Xw¦Z}X&b%?<$L|ɬ( -N FB!_.Fw$Ȱβ&ϐ.$R$vVSޱn~Ra{JjcJWPɠW+.\VBl%H-ydօ2' pI~Is%ϐ$}OJn^'ߪo5ε|R-_(c$/ʵ "e-n,mcdɁ2=L|T#2=Pj$fg/qr^3-;Q"%͸ʊ[AtW+TBZ+2Qk2߼(od}% FuHlz,x %e7zP]d¬d./Zl^qIȓD2چe%LO.S@E YP)֕7WP.h\WP93V肝VOqiJ&(\;G$yM^}(bs3-L%Y E&H*[U~$"rNdLH4 _E8co R \<3A]87T Z5Ai8"}Km"Zkay\WPIuaG$n0ub~wGH.._ ;}]0ժo5JC&Һ&w;%+ϕN\t|y_`q, L\Sc/c/d #&'EDdFJ|ײБ\W+I-dO9RP0 6cSe[5\VhF"M\y =[)0K.T_'.hPhM-/3Rk5NJ[VK W*Ê\'KLrMJj+Yv槬ZV-V#V|d"Ab9`J抩* Ru" ~b)kv _H*I1QrrzV+UE p\+ qP%~Br R= Œ.j9`Gm Idl@U]R]p_s*3K9fj@Nb8)B]f r%wAXfY9VH̔JՅyr; iؠg\W+(> =XF1-k1V9Q,g-&!@ !o$) YD?Y|Bȁ(1;͚A|.)bG*$dL̈́9Q)o.- # ,3E W+8/~/87?Q--y)(e) 3zHa@.o-eT5²A pt2 <͏/E |*K%K dBY [)iQ;-Y'2 (g4~$u"DMlu G+ W@ r3Kr|ש|1T2gED{ K@؀H)fãrY CF |'{J"c\"9yfB BdY #uZB42W+bJcYӤL뺅GMHcFAf㦪K>`dH=WdQf<f\ -k$U!V&JtD=\WWW.uMd)uxR^2Yf@|3 I?"Xڐ GfTeM9,8q^g,A+~N\pJ?l 0(1 btI=/nA0Z I˻R@u/oꇣeD lYIR'Z%f˩)ȏ;W+ *+#oäPYzP |#~(]2`؀hNN)6G-C!Dɧ+,S ]v9ptxFFp+ pP. KJe~ 3!_md.zFA L5Wf"lJ5G?+G}dY)T+\ \oR[ W&v؀<+9!'W $ȗ㲳8>mi2R8\ J3 * %(h|)b0^&d7Ȑ12f`NzYFhE+S GK&J<\\vW@d߸\@e(E X1*r=" >- ^v^+G}(fpArIFLdYSdI,k 08.6`6|EVI,eT8`YO"/U R^5c<\A\Qe$%Rͧyz[" \¡3" B,k ,# eB4D"xAQ+Tlc]rG?fZJΖ,e=lYo3W pJ :iQ>Z+ W@W+\A\@e_\0 \p p  W+ W+\ W\A. &W`pqq> ܿG+Ep+ 5j=xH߶mkTdS'.]2`!]A@3z768[bc5iEtuq@pp]7oСC5fҍ~^zjժ~m6|uڵ+:K.E|֭֕{|h *zA Wm "#TU>eؘnk}___[c67(2:(Q \ ]1Qݺuٳ#΄w @͚5b ԨQ p >vk-Q \ ]ApL裏تjU_v| ;l9ܶmےի(WHʒ zWбc1G/^Ο~t!*2b;cܸl7OBsǎQ'Bp %<+\\+N2ޡ]vccu A|h'N ۷EEEPܮvWD 1YgWF'O/Q \ B]AϛצMFvضm۪U]7T!pC<#u>} M:ٕj|ԁ{>u2GyB p+ r3,  p+ W+ \gU Aa} p((W+@uWpYbY.0pp]AvvV <WpY"Ү@o|\\NW< +r \'\spP]˕Yy-+0𘸂U<dffT~C pA@9w؏>Wo_}sZ*y pA@ywi\\GWox_u~{\llŻw/?2 \9( =-cË tiŊw^~e\spP]AZjP;mݺuСj@m|O<ؘӧ 8tȐwLL8;>$<ޯӯ^߷O{w>gȈEvۭZtT/^zW+`@e-< ,^ܣG[p!I"¯:ݨ6Ϊ7\ Ty .+8z\mTQW+`WpqCd؉:u7jHe>q1jC}^n/@m4 `wm81>.~L7Ȉ3u]_&~wz2-b|ӧN>3vsy pA@9w1Cֲۍ1`>|N:z =ڵʲUҽc/xnw:o7:/n]Aa} p(o܇ \ p p+ pA \/`W@W\QvrWff p $l\ pA p+A`W\ p++3U\x \p p\n=rJuRm:xnxR p++ |||ն 5jԮ]-ߕ vjǩI +hԨaLtʄE#*2b^{m {(+P}]I .+ > }ؘfܹwWЮ]yjgg=8O <[oM>|A W˷F {߯r[o 6}m۶UVu.^)]uiӦs~A Wu)7hЀ pP&+([WgFջwo:*+;nF$t+\\W_Ax \ *+(A%D< WP ]Aff]ρ p\A <&`W+ \p\A p+ W+\W@\ p W++\W+ \\V+ƒ>oժUׯ׻wӸ*moV{]~Q- p ܲW_}EmW@\1nX;o-jQ\ p TDڵk 4ܟ5:u[բq .DGGoZjU^n믝뮻:nׯ4h_W-ZXv ֤I*UW߆_Bբ};&&_~u{RRq\TxWLPQǎ.<55eΟTJ,]SW^zѢE \qbȐ'T3fLWO>9$޷?xܹs/W+@v*U?::tmcƌCJ[TTdzz۶jJ;ֳgݣ[ZbyI~Wo_wuj;"L\\hݺ5WPa( P]Ǐ{]у>uEԒ}W@\HLLSN5BBW^v턄񻚑lq;VW+J ֭>/RKK(ӧ{G ]N 55%**ިQ#CmC\*+hڴ?~[\_pDig}fO/wnR[|l4h%e p`Ѣ !CxIK(͈8TZ5<._kmӦͷ~l2I???__n  pPQ]W+p\ pPJWƃ W+\W@\ p W+W\ p pA Wȃ W+\ TL%p+lm۶<+\W W+\W+W+ (=5kּO^>ӖsS 88m۶j#::"z{wW. ݲo߾;SJ?" WP\Axxxf͖.]rBBB:v8sL\bԩǏW7/ޝGydW+\@esG4i={\ן^ܩ/l7vݹsyD+m;v̙ {YF ٳvB:{ªU6mԬY3/tIu,X`5k֬-[:TУG +HLLlҤInn/i衇|}}|$jժuaǎvGMYdɒF9o˸޽{7+UVvvLaȐ!sQiСCtȑ+Vh߾;3n喕+W\y5h>jر= 6euy#F(eWxy晃Ν;Wݦyyy۴i=s/n &ddd8ozRz\ *+]vffLkMIIQ*oҤƪ =55 y;8JLLt۳Yf111j̙3 dɒW޴iSu_j#..yݻ͛U̽J?6m*ZWeqz#Go.]}|||jժvBjORp&ά*˞8qb~n&뿧mWV-??_m啦+mҤ=yjLG;ڵk5ԩw^yw~?c.] =U;@es *F]<*?AemnݺN:m/qiiivUZYss&LX~Çu 7DFF nڭ[7wCNNǮ\.ܹs6mZѣw} W@A\J ]'d (CWڨQKfff޽o\l' $g{973fLiqM69 ..No<800P]wmPM5:;rq۷wծ{AAq%\~~wE|ۭ[7__߇z(>>r˗k׮qӧO~Trrr^ZldɒRp)n`O>!3z쩞U탂tΝ;o喪U:8r^ǝK ԏC6 W @A\9WP)!   \^WpW%  BǒE 6[|0WP ]AH˿:|(02"\SgO>~*촊'NTqxАǃCU;|Tő*: :b* 8_}*P{]*bUٵSO.@u2:*"*L9qnJAAeq1G~ WP\ER˛+`AAQ摜<^hWP\Ȍr -2DEW=W+W+ .l ಸ˲.KU=O>ݧOBUw^v:uD}jժ^{e˖իWܹ}Tcddd߾}ձ<66V5N?k>QTR~x (d\%T$Wӧ' J=Tcv/^&7NnG͘1cΜ9jg5jTDDR-@ح[y_}驩/ҫn .|яqk pK3++VZnn?_ݾ}YfRF ˥333}}}F.]8´~yu)+ pSٳgu/ҩS'جY {taÆvW=|$/{zΙ3gE/I6;;;߿nݺ͟??++KI&z y4տ'c6f͚B^1AGժUСÎ;W \Wp!C=''gɒ%CՍrʕ+].׼y4h 6e1g9x`nnܹsGeO7{1׮]{n}gJǍg_iӦf͚?ǎWNԩUR@ 55U]ý<+;vlzzvE{Sq^^ފ+p\+8rГkUycVǍ 9V@]OJJPio7*Sj֬YLL8sشi\׼ys/{E/l۷ovvV-[wR233Uj&S-iii'N5t-DMAAA5<MժU~Z8].h{hW6,,gڵꏮu-S]꼜wƨ=|ǖ+n۶m\} z䝟:﮸% kX^pqWs?_\A黂?'t``XhÇ=܈g%?vww? zy,^:d7_;]A ?O?fT_Y=6u{~{mB]½[nV)/_]v$mLNNիWd7XR۷ ͑#GwΨS3~x˩R eƁy={G^N'|RHOO:th=AmoUcTTT׮]Ujχ~./PBWxw}5*vy-TZ'+ 4?Ƨ~_7nܹjC;Y.(nXcEtujWзϣW.??7w}|<{־M|㍭pP\u|ݲ|r-kS;vܿwW]ypƍ6mmhrsy^"wW4ݹ,t@9WTf (TҩB+W W\TZWpx0p\W\W+\W+W+ p\%槥 .lU 6]}I\%C [lJ( pKYlvJ t/?`]:=5wu! pZЮVZ˿Z F=?kzo|nD͚5nj~W\͛6tM{v>8mo_oKPۋX?`WKW+0`+8tО`6Xf믿~v{&ŗ%t%$\ p <^DK W ypĤe9;vNqs8g |i_'9C^ԫ=gϾsoo~6jgcl۟8鳗?ޝ{s_<)s'Nf}w?;ùgϜ?S9s`x \\VZ%zg9x`nnܹsGo喕+W\.7h>dر*WwWSOeff~jû+gË;Gw ǀ^fm8G_h hYY&4.W˕ukʔΖ_9wppڵkۻ+hڴinnڈk޼nOogb%[w6:uJm$''}=]Aq>[1{ߟS/ _'999٢~]?y*3ueii)i)krjjʯ'MMv/+zGUO/]-e&Nد_nZc^mh\A Ү$ Jy᳕?E~%Wpy][muu-)nܸ;w0a>\BWl)b-ZWPNtE[\Ayp=gQ BCC5jtRݻoe˖%Ń Tz}ݺN:{MJJ1b^$xܪ??QF]+(zŕzn+\W(nzwDE|IѤX={T;o>((H7._]v7>}^$lРܹi֭۷oߔpEx>})cXtVp\TxWP&\b}v/  p+T p+ p+wxn+ WP] p+\@epٳf͚͚5{<;w}w>˗'W 6mp+w ;Ss`֬=z}nhH N8۶mjw7m}!'tdWpX]{s=70`]wWa /wCݰ~}|lРAݺu #5sfOu]ƍ_SSo߾k׆#I& tptOaަM4qWK+B= m@W ts9GW+].viWN-o,YdȐ!z߿s/c=6駟Ο>Ϟ=_~={?~n]޻waÆW @W+Np:O? GӦM۷on1cΝ̙sYgOǎw3_|1WUU]{ St} ''|r8n{s΂SN:)uuu @W+83V\g8=ƍ?AѣGݻ`x+]:EWPpo|pȐ!رc,XK/OO8p]NWPQQ;@W+xWSS~SO={{g믹 UW]pp>o޼A FχgVWW_p StE;>={r)SL3gΠA***&N?AޱcLj#“ܢ+?GWЕ v}g @W+]A.]53Sl @W+]A/{K<^~Oϩ#oSGe_ٯU~*zRoV~i\ ]y*c|ͷV~嶪~S U֝U[uۤۿWu]U'WOA]wW`JVOZ]UU=z{~TfNjrsOW( g+ ]A]Q]t++ @W+@W+@WdWktZW` t tt]]++]]++] ]t@W@W+]+ @W t+t] ]t@W`)@W tt@W+@W tt@W+@W tt]]] t t@W@W t t@W@W t+t] ]t@W@W+]+ @W t+t]]+ ]]+ ]]@W@W+@W++]]++]]+ @W t+t] ]t@W@W+]+ @W t"t@W+@W tt@W+@W tt@W+@W++ i@W@W t t@W@W t t@W@W+]+ @W t+t] ]t@W@W+]+ ]]+ ]]+  t tt]]++]]++] ]t@W@W+]+ @W t+t] ]t@W`)@W tt@W+@W tt@W+@W tt]]] t t@W@W t t@W@W t+t] ]t@W@W+]+ @W t+t]]+ ]]+ ]]@W@W+@W++]]++]]+ @W t+t] ]t@WooW왥w~},N{UJAJ췍ք-lr']]+X-ڷEӇ\}ˬeK' sWx4l&BW+uӪ*׮Yo 'o, K[f-9)HXZWM@W@W nm|ss_/%\ܷn"%a}ˬ+^7(755M@W@W )Á57'ӼwO{̹Om"%adu55W]yަMAn ]_456>G~h߾̟>M.1fBi%VW$W͛6s9Gnܳ'V|].o_8AeO=8? C3k~퇏nvɈ1H{%, lܰaW\q_W+ v5WX~/{)$|4G~hՏmp.1fBi%VW$W5WFܶuKrϭ]]+PNٺeo?~ݫɁU}ZΒ ?_GڲyS tto޴qMm㵺?)Y5"%adu RWdl6]]+VUs6oP2b}jΒ ];Ka6]]+X o\H\duv( B,CDn߲y@WQ̞1yoe,npPU9!e?Fh٧u{w#z;/^{[^W_3lU-̻odrۄԁmTHxlYtyXb$_%?ySn;p 8hwD*xHƓ53ϑ!?G>#OGPEfEqn)'a8'?QsNs`P^,9={{>sO>O0_Z!7}kۨ\cƶ`AY[>}?oO׿>q cq DDз!:٧d*]|ay~sx#m;}q!o>hV0Zjяfl{#Y2H r{>;z Zz 3/+xU0{vԯA(뚺F'F]IO;-^zʏj32YS5mZtхF-, zOovʙ *wǎI-xrXa󞨺#d!цl]]OOjL*k L[UgH3u?Z.ZDDSwaOvK~e kT_R4eJsrvѻߝ?MݧqݤIcY; !d޼G& Oç WpgO{f l{]AتBPǬɓH$gR7ߌ΍Z.WUE^~]Wcdwj{̚alDsDg~D곟w_o_|jܷo (9+2:5~UWLj2\4aBt5!k ]?O…%ӒgHWYcHdޢR4ο*kG1L#g?%P6Mɕ:VC{́o|%KCrˍ7}H%OOw\J>zI-믫 HyW;w3rd|r) YS~}s$,QN@YFwª/LMZ7k ]AxaJU?-93-9ϫ1Nvj ޢRHOvgCw}F|O /l9‡?90~4/3˳J6]O+_EK~tѽÓ   .HyWtr_n%W] ?s޼ < kn1.{~[_}R'䬸/w^}n9c}{Gy,[>u; ]}uks;wOq㢯|%"@XO'Ó 3<5kZ_cG4bD<3l3'dM՝w߹~Μ Ua"(knh"/kV9cȭ}ƷGNÇ %'593S@Cd'mG:t/,NNC)Ǣ_pbRTDD:yw<]9 &!ކc R?Q8.:ƚˌ{ ?v nO9&.–!w!P|šhAEWWOOt]6׊+?q#gǎ=]'ҡ7M+p+效8 {>;Z#΢}|s|a3|R_@y%""‼x.bgQMM|޽[dd'|G DW """\DĦIt""""EDlvo!y@nn6MSۮ@DDDDDDDr]@DDDDDDDRdt5"""""""" ( endstream endobj 1527 0 obj << /Length 3027 /Filter /FlateDecode >> stream xڕY6޿b;^4-QWX mq9m å͋U{_,rH3Ù/o܄*8nwW(*-2^GAzvSV]y;B՗uyyM߷?\m־eQ[߾?y8'roo~Û|4caY 5޶M7I|^WHq]6}{1|eNQZ==pPͱo3c^ViFI;.BZѵwl;!…]YUr~];my׬r]6УM:xmc aJkt85Bx-*FEh)%mkA͵fgMw)^vݗ_dezW ]m;f6[mZȯ>NW~S,ӱ*AɆ[2C=qLΐ Y(;1Ϡ]b PIZ ʛMJ Z[$V9Sx<PLc}.dUs&TNDC=^L䨡{Ṿcx(hcq./n8l[<cЋbN{A()mWTZ5-~JY3 =?MI?3#y%I-4Q_E;L-kim rq"t~i|U\D֋_$6m,@bA "+TYp(AXP-EdӞn ZoE?NqPrrrM'v=7% !h?LB/ÿM'/r^dBCtn5bUhrY 0ٚ~ѠӴ͟ƶr@5rVK)PӴI0k)/[™/x; ~|2Pr@QB=;rP>^(1E)V¸[s7X0$BzqoC//sV $Q䦳Rb{ی_l(7(݇f]lqa[b틘 ? 8}*(S3 &@Tf8 R4g1hWeڪ9.f0;;pA!6Moi"9~d  LSr+WUjy{!sIƼROy!h ڼe^V`l˹S/Ldn|,1f+Fo!]+*㜊c ĵ$.ҁy=խyx2 wl!N&/Y*!WXj%; 昄)q10A`}9A&L6`2?˜H7KTlpue4=&DLnQ?Иg!T^aRwRh7ו,ӄqs#)*avv3-kJ'r,qa[Jec5ϯ#@)N.rzjJL/fcJP|:hms*?1ޒgRBGMzL!o Të5TE:A`vFwa򕇒4`??.({ ^VGC,cy:5]ZNaI$ӯ- /C)3sXz!Hr ~}Τŝ q"Ղ~bo:"NZ.>FCo>F񽕊dH HVitA+7;?S%lŐ }ɯƌʂb'y97J%1r( biJ^N"/x5FjZ lUxOBtLy$A5e?a, P{kxA,W./e㵱 1?N&ϥalV̂@~5,ObsIs*yTT!0 ݩ ?=W=FvNZ[.n@'^2ȏLvh6ԍϲ*|#"u{6g*qAڻ"HΊ"v;`~#xZ)}arQM dpݚ:X ` LhuЛy35̮OK=ъ(:Sjbx/v:S); [)+p7~x endstream endobj 1532 0 obj << /Length 772 /Filter /FlateDecode >> stream xڵU[o0~﯈@B),nC֡!Tn &j8%v6mI {@UssI_YD1AiH!& D0S7Ӛ$q3?:n<{/$u2$v"?Ce$tes/O^F'wݵyKk8ȢeLm9t/6#%l-]WOY1ilI&$uB ^b (\ 2Ê!Z-:[2 J@N55UUuQqe4,Nt5jHA7z-1BpX @vcZy\}Ds0a8Nn|ro6u jRHA(bPe]{XJ:5=qns-'*eW3;ʺWmT -ڴ  랧$>䢨R#x#UhʷDB^I r(fpLhaiZ&z*uICǖ<<q)||Z;1ה\.cfér˵|)?SQmQ區cO0)^,<ϛ2pQqqm?R )5hV_S}+U+^JVƽFo /ݺd`vj7uܕe f~(@#g|ְ endstream endobj 1524 0 obj << /Type /XObject /Subtype /Image /Width 2116 /Height 836 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 1534 0 R /Length 108673 /Filter /FlateDecode >> stream xxTe@GJuihQqAbc-R_Y. RBQ:) [H=MzB_rLIÄ|ofILI^6OǗ;DDDDD*"!>NW>XU"O8ߜ}UDDDDD*))!A DDDDDIeqj+P.u5t.W[9atQB MT"""""QPB} 8DDDDD }||^VNEܚπHeԼ2$1͟{XDDDDD'e[#Jj9QNEdTą67GB@DDDD2j2$1^&5{K^)TVR kMqWw DDDDD*+cDDDDD+vv9Pme/R kM@DDDD22w """"b͝ޝW[e.K]sش UҜ5eM09zkT"""""QwӮ誺h2gnۖ#"b=wK6\뀈XU箻{w%*wY蚲ϏM+0S\5[S2@D22vEԑ3'n"_M:gxf:G-]ӜE2mwFh[W.2|{m 7\}h6LϙU>XkADl[U[e.K]Q5St5:AoM;*ʠ2 ۝Qz;?qp?qzO➱]~qrxb|<8o,bbDD4͎LR3uQ~n@BZ/XT+I6JBĴo,*)K7zVu?vV[e.K]Soe9k˪{{*HoM@D2 DD**C~U惾oߴ9q!qS&~/NJmʗ?0jsOfuф|C&t@AQCR"*1;(V^*ʑ4 ^gp0d&)W-|{ "V.+i?e.K]SӋM3)jM8htM@D2 DD**z{Q__;ӾN>)hK'L>Kƽ=f/8uW_{}zNݽu.9Vp _ƿ"b~ؽpݻ,etM5L/7zgM)RTHe]ei;Vq;:>39<.:߿*>}\=1㕭UR- ʐRoeܢ;$g'F%fm>2nI:l;}2n8pi)Nxӥ{E+)n;/ʂʓ˯?MkmLmvFW[e.K]SӋM3ቆ{)RTHe]e,aTFM4i]Уŋ~ϟyO^e "9Zn+he(xk_Dɭ7H|gލגǧ匙E#R{Dc "M7v5y {E^蹺a DD*@D22Ru憇42/:xa~H|mliq˼v{e "MxG׮=g2VeZì6h K̾>ӥ(P&dd zU{-rDyGYxY5O0v23U="?TW0fbMV9S2 *ʨXQ_JWx;r㎟-,n]mܲ&MčEL'9H|9QN7 ÕU9s3.Ur0eJUvﲔ5|04khN@D2 DD**c|h۳8&AB: c[7X$^z\W<+ZʐT Э 9ҟoo\mݻ,etM5L/7zgUWLN@D2 DD**c&&'hB4w<>O`]wmEѴ_3g7&WƛVnnVFٵ܂V_8r֖{ o$d#wYpcL+n_?"%\ٽ[Rmݻ,etM5L/7Ma5E*ʠ2C95M?9"" #޿E%e)F'e]V.37+kʓBc3$F.Ǥ+pl+3 KĂRgI)ѳ$g˧QY ǽ&r\t&8a񰏗&DD\}OU*g)wY5 ieM3:_ å /[S2 *ʨ0>S'4L&IOɃA(ZM?䀂$ƊuY}BM]Ҳg9ͪ_"Q^^^v<.%aߧևS'$Nw88ne(W*eQVwφ$~|xҚS_ti%4]?"Y.޿$}WʔY]29R5nF'9@D2 DD*.+c*9d̾G}}/>TsѨ\ޚQ0rf"ort c6w /*kxG}U&W:fvrpӾ;֌M!"m7v߭ ZY]k 5He "RT""Qwae#ذT+c̟j "bG*^bU_e[Q)RT""RuW/!"mNel櫁xqc>#*wYa)RT""RuW߯ BD6m"""""b(Ae """"bW~5#]HOCDDDDDJS_2@DDDDD* DDDDDD*ae""""""VC* DDDDD2HKMADDDDDT"""""RHe """""aqA 4^Wv&$kj7=bTAe """m_)ɕ)[3L\pZ6mz]O<>Irwz/L"#""""ֺTHepnTOGuKINRqí2ʠ2 DDDDĺ : 2x Abe\ 0`@VlW]:*]4E^Tx?#ӥLܣ];'Çʴݻvr*Q^X/_ iDDDD2 *IeȮ2ZV{O q+/7n5͹"ݫ{睱g^2_77׾}aޣq||2̙3Eӧ[x…k2ٱcDG-Y qkW*@DDDDa:h߾e|)FeTvQdpڪĞ={ocnݒnz<_u 2yFu)(z_5kڷoj[bMnժU3jڴ-ZHtbeR{'D/^?iDDDD2 *Ie$%&TlkMWA hެY:db4Dʕ˃ԩU+ _)&CѻfۻG&ٽ[;wlWVv9sf}ݯJջ׈(Ae """"镁ʢ@*geh*.6ϷnSHePT""""6HLT_DDDDWRT"""""T"""""R qՐ@DDDDD* DDDDD2=X DDDDD5koWDDk]<\\]\]\ָrpiJ?9/u^l`γ9ygNS9}N9}1N|,q3ߟi8=qķӗ?z2P~tdPT-7DGEʼvZqQQeq^W\\|c(%%eeeBiDz?rX-* *SwlߞyzQ1-5ż9@{usܼ mV'O‚‚D;ָnEhg2f@񮻃a#T""Ae@㩌u^%%%N%ለY*ca 2 *Oex{ .2~nխ_^ڑ*ʠ2@DD*@D2[eDG}G:tx衇fΘL\z72 D2 1|ٳ '~2m6zeyVn*""@ePHePP+㮻Q/ܮmZ])""@ePHePP+{SLV_mk{'-,,:t^9Ѽyf͚z]v':99iF. Ȉ!Cia1x`Xh֭[V2B.tlDD*ʠ2q]t?xZ/#G~3G=ݓ~kժrP˖(Cg} qf^9;z45%?T޻MNJq3t/5z]2AH72 D2gei{n֬Aa',$'e/yFi [}Ah蕎;*;tpr 45xƔL%"MlDD*ʠ2_up.;VVoz.]rsYXXl_ RM6Uo͚5AZjJ-Vһ/7&y||LWFLt4TTTѦM'$'s=;zꛯ>y?)1Ʀ}&*m6o?Rk2^Rz7>cjw-֭1Qm۶2ʠ2ʠ202Ǝ3s sgeg`|_6mzE+O.}YKKKWԔd75ZG>r7igkۧO\մirO?aeTץћX[>De|* * * 3+#$5i{ϓiCBv֭m6 ,P߷wϣ>*'/Sٱ IֳgǏ)"_xa-[XGnyQ)ǫѴiӄx2ӧO}'TPTTFexsg9u2>.N~!"֮E5T1Q{woOd8iokzIYҼyu>>ڊ׮|Gڶmd2^;S G}]v˗-2@D2 2*ؘheKj2jn\Ld5J;;:D])---aWB\Ο;# V2DwU+C|yyyJeU떖R@ePTPF+#&*rqql*(/O[ssroTZZKNJ/1 q1TTP*c l.+0w _e$&ZWRzϛZigNeP@ePT4ʐwhXve[~6"¨ * *FWJeP@ePTP^  * **cǎ6m!ȑ:{V㬺=PgQ`& ٜTTP*^Ͽ^zQ2rr 7}t']_I^޽rYwQYz^zЈPFʑ#~}xvvYUFimP+mwWK6Q@eP@eP@eU|<~*cڴi/__>>>3f̐#ӧO5k~a;;;Μ9So![wOOOk׮~>irQQQ{aE( b2̙;2SV "?//O,û U|)Pz!(hT?nw[{e* * * 2N8{w{PO? w]xo-{ozی1c~Mt)))QWvVVV`vvvetחAzz ~XrC,û ը ف55%}}%1==-2cfeuwtsqsuqqvqtrqX.+]V;hy;^RK;MYBo;Mf;}Gt|{Vc9dߊN_דr7 2 2 2VFll쫯ZVVy՗lXȶ'(,,|dcoiiӽ{w? #Ftҥ[n %mYU2(//7q]ڭ иibTVEy5W2Ν9)=ws ~ً_8/x>_pQ$\ C/aW"C計ؘx1.F1QLKJONJ޹mz7 2 2 2V?xzzGzURR XjըQdޜطwWv.Y|̩];vjT* * *.*C1O[\\TZZXoSZmޏ/Ԥ'{^^ W٬t?s-M+㝱c yw2ʠ2ʠ22i)IW |TND'JfVF.mYl7X=7o~.aRy޼9+ppX޾}f͚992@D2 2 D*iNeyΜ2WlW\<ny2{]z߆99:HhP@e "RTPT"bW]wu [ʏe2Ξ9eoS@e "RTPT"bW֟7!~\DcG/<[;X}'[* DD**@D|?C^W߹}ne*ʠ2ʠ22vmgO\ձc˖*ѢEϜ:1z(* DD2jRg5o!,Dᜋcݛ5kv}5S}'[ڵuVVӦR@ePT@ +C=.ѢE ӡѶmZuBED?_%1ʈ U+#:*B8I * * * 3*C ֳ̯͛ OBD**@D**Ì=}O>EV뾚 fV^\->d;-,\`Kn=<,mڴYhTAe "Aem\>{RbOvvZ2 L'J^;z45%?T'H(ѡ{Dq|`cc-J֡22 D2 +C5%9Iceں)۷ĐAh蕎;" ϊ;xD (0@D*ʠ2ʠ26 Oz׻vb4Nye4mT#26`,uܬY4PHePT"RTf2꧞zꛯ>yэ 5mۤ$'Xteo^yU * *@D*۩2$1Zhy-[:kTdǍS5m44 ի eG}o)v}je%%&?@D*ʠ2ʠ26 ͛!v֭m6 ,P:t&&T2t8pܘ={8~ڿ_٩I&VV˝*@D*F^ 2bcwnBeAe "Aeq٪U+ ⿞07;%Dl!?1 2 D2 2n:utŀ)!b +Omfߍ뽩 2 D2 2tHOKNLDɓE#2 2 hp{KOt+{9$}y-^xaӽ<=7okUo02 * *ʠ2 zUӧN2cǎ'N +c+޻CVm6DϘ>41_CB#%9ʠ2 *ʠ2 2nMeHU~uA>5]A#I RP`-&KhL2 * *ʠ2 \yyyUO:U^teL6 d_[MftӮgBChaa!Bo헐qdD!ﴰ{洌壌Hewp1+Rdo;cMT\Y3g1B9;z45%?4JS)lُrSz!, 8A Pq_|U sg 2 *ʠ2ʠ2vR~]wڵKri1nZ>lll+=&&Ɯ~o_S3+]v1Q2m׶wwxȈpK8 4Jǎ %:*AyWh_ nfeϘ:uآ_yVF6 2 *ʠ2ʠ2 V+!Jbq!WF fΜ{KLT/(N3+iӦi4iR3R<=,--n+(cb8SsYXXl_M`*?-ZT2d* *ʠ2 2 +C74V^j*ӉaNe(TFll9OJJ}Y9௻Q 5o׶򌩸ؘmۘ~'\믫htzkmmlڷoOeT2N<׿UG{o͛?\sgN)jef$zwTs*ʠ2 * *n(..}Q^xIJ2#Mͩ %4FwK*)S&ϝ;G7ub<=>ST6WQwM*߿/=ȑRSlmc2δtuqoZKeTN8r[Je9|9e?.9rR͕]tS@ePTAeAeWEEEyyHWBC>LDe̚>PTݛ!}7csww0:*Ri)UV˗/SOzō`_ܿtȐa7}Qg%U(c&*}{RM4QRʨ_/]۶mFq 2ڴisɐK2_Je<߿p *ʠ2 2 =+Pcԙ3fG*#6:jmӧN2\{Ғƶ2no+TF&MDpP4RΜzOI-[ر*ʠ2 * *n(,,ɮ+WJAE,)jهS&*M3֭[UAK/{ 2 *ʠ2ʠ2Z@;پ9|Rݺu'[qXլY326mzy* * * *nʬ 8vP>XXX<߿'ؼqCnҤ$Jeҋ2*@**ʀۤ22fԊTּ2/2ĀK$"¢#տū2ʠ2ʠ2ඩZ{X* *@**+CV+RHePTRT4ʘ6yb\l,[YϕZsWPHeP@ePHePЀ*#6&zS'z]99)578(pZ"HeP@ePHePP*#91 ξ\VVƆged$'Ĥ@Nk"#sssK#@eAe Ae@C̫Οqɴ'OXߔʨ+l|<\.,,`#TTT 2E%?V. *@*TrWc} u^TPTRTPvaeDܶ*@**C_GߠBe`} QNw}X* * * *@uTPTRTPT2ʠ22@e AePX)Iɉ ¤ĴdVF~~TPTAeP@e*CQ^vo{m\Ϟ:)2 *ʠ2 _)AΎ',---).. g@ePT@etN:YZZ?իйs={ʦLTFrRGdDxyc"2<=!.2 * *hq^1' ԱVݴiӧ~ZPǒ?իj0U ֍RzϛZig-[_2 2 *Vڵ3Lʎ4 u֭*C Ν;?2쬗Z#C~ *ʠ2ʠ2 ]FJa޽իGҥ|ԭ_<}9ՠpСCe޽{T @ePHePTPTР+C/+vpp2eĉ׮][RRuI&)/<==vկ_*U嬢p @ePHePTPTР+C9sT51tJ(322FѥKnݺT2\kkheTFM*C;e˖JBB7on޼oY2gLϘ2ʠ2ʠ2 *UoB[휉?>>{邺W_]hCCCV @e԰2qVVܹsGeb$Faa!AeP@eP@ePTTFWF00aN2V4hǎPق2ʧʓrrri>`FF @e(QZ-P{5@eԤ2>fǎTG{sgNǗM{yF* * *ʠ2h>rȮ];W^U 8PAoA9;w0`@^7n\ @ebehڿ/8--_;_z%]/_.N3M6~UO<Çի6o۶\$?2{c%?p2>|f#GUS.\0OWuڅ**ʠ2 2Oe4())?1c#Ǐxbaag}7_JS)rʢ 6 (eW?Azy\̫2 **je~'u]ۉ E:tɖAllLN 99!C;vlOOOӽx'QhҤ|hڤfaWB^e;} [l{* *ʠ2 2 *UFQQQ^7|Yn]%1ԋ6m~Xw11ǎ5ˆTFAA~vvV5o@O/ZZ>$㈈AI SzuO4:slJ帷ZóRUϪp|x!(ࢨT6bxeQȈ0WFGDW2 **aUlKY6䍤22TcTAePfKY6䍥22fTUߕXKeP<@ePTa&lIeiۦʠ2x,ʠ2 *Lfzgِ7f5* *2 *2dGk }u'T[+҉pWurrrZZjQJ;*h et~wSSSkke@ePT@#!9 *Kw­ _Ik=.$7}<## *VÇoz#eNqj666}[b2 *˨Vnz^XTR{ˆ~.Sno>=uuZslb|1傪T |%]Tfz5hlAQ:HPLQeʕ.o:+3e.;0u>ޕd'[=mLdxB\iʢUFlLm[ 2L, TFeg̙3dC=ggg)))}`B?jed 3O* *XgUOYse_xrfyM)R=]_VM`b#z: lTc DepƼ?mu׮]۳gϠArrrԋ222Ǐ߷o_G(tǝ;w.//AYY2< 2 2cVUtLԼ-ZNӝsK\/;ϋ3?ET6ʨW7*Cj8O_}E߿?44{V^ybcFO* *XWΨ}z%>yo2..t㥩.~.tRܑÙ柢* *U=!5Jݺu ɱ2Ĵi֬YSTT4k,30z PHeP@e4riUOx]L,欌]dj K>Nӝ%d^^?S9@e Aeq<3pܹszrrr2Dffȑ#zm۶==QeCNe AecTR2>9^eCNe AecTRTTTƟ)]@e /;2 2 2/5N* ~@e Ae ~)]@e /;2 2 2tT2ʠ2h lTR*@**A0#@\lR5,(&{u 2eTTTF`ާ75stלhl@tV 2eTTTF_Uӛj|93<KUZH@*_v@ePHeP@e4^TT9N{#dKdpl2pC& ((.S/q:!%Ps}sˮ9AD$iJNP=~Gh|z_{4Vd|^ay0y_\*s<һa@e @ePHeP@e\P51!2 l VnT98~ڍ+z0WXZkTR*AVFbu +vё *zg?o/#tThag\Z! FE2 2-ڝ: -.-v%>{_.NPHe *ʠ2 2؞hTR*ʠ2 *6tT2 **ʠ2 *ʐ4(= **ʠ2 *22 2 2 ٳgST@̗2ʠ2 *Rl޼YΝ;WjTAe hFh42 2 *hF;ft"AeP>K?ç&NFsF hh4^@ePHe2pedg陝|W RTpxZyAy[B4 MFѤi4V dTTPT@|iڒʠ2 [3@=f|EkLx3۩'U_q鈊+*@* *UF~~^Vڒʠ2 _XSfF3_h\5M>犏*T\:b؊ŗ2*hpwjFmIePT⹊WK8hIS_i4W|T.~ťW|/@e T`+C^[RTg;_*@*2 ۬2ڒʠ2 *2 *2ʰNNNJKMev6TAePTAePTT@TFRZKbpPgtd{x*2 *ʠ2 *ʠ2j^i))\/&%&$'U[9]quZslb|<{x*2w?U?̔TUgI3ZթR v=, G#:j0 6 a68v,c~I|xfے7穷~۷T|``````Y7^}Ggۦ{:6t?w۴a?K/?22,2,,,,22M^|iW^x_Q:;e<`A" 63xի;^vox 0رr%]@ 2ZZ?JE 4 f")"ѠiKw l [anjӆ_xÃee Ĝ9u+ZE˖HQ]}MaBe'ƏLE׀G2, ,gU"*I&ReuDZ>5 Efz 9 7VؿNQUUJ\9;c8P"Tam,G|eXXb-#zĀ4rjH<&:F `h``P)Rrfm1gTji>lح)SGǥ XXeev; ,qrssXXeeQԀ\egGGKХNTrT&DTŨ'zXIÔeeXXAk????S $1wѣkԌaa1)&OqdMn&Y?Y Uqϰp 4 Tma_14\!:Ch 5*[}[N@p,,nM]Keee@UM*E#'&%p <2 0!64xţm ۷<=H*YXXeeWQR=bг-2y% yɩz5G]+4} ۑ%Q;C223}?eWF ٬K.wv`Usv鷞F:s6m I62SXXee <cHms]=5{ ZcY}#xaHiגV)DT͚<~ s223~z{]g5 Lhh b*w#*}ɭ3P|wXu) ϋqk,e 3kP .rF0tL ƒ%r(:E{ 4 jE/*v)U1^"Q%'?A>K4|Ff JbE:Ly (-eeby??ua&:6 Kf agav47'e::h D" aԪ7|H>_NM2V`h`GʫHTtUiHiFjNz1DƿU(x(ȩqj.X(NNXX|^uw׷ìeee95cJ-$1#Gz7N&yq)y3:$b,L]DIikK>OK([22, ,(`[FKj V*Sq)iw|25EtXMyt 1XX|~z󍆆 ,,,>1jZw0,ς)`^6lPu5qR!XeeeXX2FM6Ej%e"@Ŵ/22>A =@O}[kXXq->{^11222 Ԙ :BZ]-I IwKOŸV'idp5vlRjdUcԾ!{&ULX2)3fhrKٰ`h`D1ErCFjOŸV'is<;#}:rd#6=re+eea}{sXXX|&@`ahiob46M[a&]]-mxʚii) w$+eA?iTڷO. &Ǝ19. hÿ22Ӱ?w޾Q ,,,>=L MCT_/RVJą yuX6Μ+A'8ƍ6u*͝K8AGHȸI!<7v#ԤBv`h`U ݋119rj>O>Q:o.}he* }+|X%GZ/!;O2>xnTO1cʡx~i 3֬k2C]/%{reGKK!++V$]RZ,HN2i8-R3 @8R.d܅qLH"S,dDݧL(Re4R}* sΏ~CtCl}:,mN ,,>%z222,#R]U%Z%epy16+)טrsyLsmْjkbR5/O|ԡT[k4eeXX|i&j#ѯyrwňcmVmTc*ԞwϨ񬗥2mhZ9-۳6DC)yA>.L edxW|xMփeeegEC--yO3g 듈 ZOc$L,ciuu2VN޵K L_O!\êZٚf1Q#EmIR9,222+E VQ⬘Oߦ׻]YA߭HڰnfC]:+&2N^*H Δ72 2Fe^}`| i?=/s JEgH *xG;qso f,0 3PLq aZ48T Z`*r1E*A&&ڄ,]DӣRQw锁h5ۮ(yHyy^FheeY7^}Ggۦ{:6t?w۴a?K/?22+EwUΙ3aƊl6\$CTC$_Y#ϝ7OyoL$eTW^v1_F͛IE)f߻W_ܹRʂ<,,2201_fȩ|T_xXuV]ԍ( UZݝ2*:PRբy&o\!h/[pk%XF 7/^zs_]yW^~``@f$::QYb`L@ri}"%㡇ߔ2P'ORO9sF4 $3U*A-X@ѝwYaG;D%o ʼn``p\ 3V{vH{Uء:BAxanQ Y(`SN{A(ݒ">B{%LW=r>+a:\ >@/cƔ0F+M)O4nwUt*Ž%]s4up-yu|4Y7T(݅;s:xӪ Du_Wy?#eXXXTUIŊh7Ɖ(T S[+:i1a7CD&#z{2WItѣ|yb3=^Yƅ aE8RƘ"4YUpV74BKN f#T>߬B-^~wEi)5,#.,eXXX| nnq-&봞q_.0Ғ(ϲn/T.GMM"xÇ%A#HY"`ua* _5[ɍ)>%Ǐ `7 bC +0US4SZƐ]MVEUѧiU4MQQF5ঌ_&27M5CF3-:|S`h``pC0n͘A"m$wVz+ysb௽I)l&$w_ {iΜOb>H`YCϋ olAQG|IdfD),222#YymC'!L k$PLӌ #݄ǟU-c@Ս]3XBj^jTq1'CUju FXeee#d\)-)7j_Z%ҥeBEW"tN*~5kJPƎ%Φ-ŝ֯OƷH%b0N#+8uv /#LI {+Hn&ML Kf̐ǎѺutnũV?b/IXybzb2JeXXX|V"Ap $y7Uy\-R-ј6Z&/Ytx?DM?[V:&틛K_Fi0&dUC9#nzȑQ`h``abEMtj%aV$*3gmq\"歸V7xEWdh=%޼9q^ e 8 kg]%md0xp;eIԩ( r%ȧ=>o6,222`$LJ#hEuRtRpZG^QEU0aP-k'h]\0U 8AĚ%JJ2+nmN3j0)y4i gX%~f]sM` sΝ" +-nh[1~|rww`vjQ"1*hVh#ɓoL,ڻ:Q۷KI+2da5N- H>mʤI,llLsaXدaU֨ `h``p}7ҕoӕbBu:d*z:mеLtk]U85ZO|h$)Cqi}ezГ;R*LTwU=1OD5ҲTk.GX @/ ho/2"Tsa6жm"RSøq4vl"ܹ8uJ>nţ,#<%-WL1c<(,I,|)<}<1zb<[.'mx9 m.B @/ LӉB{ +- !t\qE+Du݉}iМhC(<Ƣ^/Fi͠[Ȩ񢎙FcHU;%MI`h``aҞ\)z_cX({ϳ&L8q^hXYQbrԩ_O/,,y\ G5o4eor𬺺Ɣ.֚驧!ggGeXXX|z#݁<׽Z `7=Ul{"˰ ;fÐNoROG^r|Ӑ'̅..ɢU LuDRSUpeKN{E< !a2, ,,>+os[XA m-p萸!L 3'yo " e}V;n}I1e2ݡXsG.gΎŅfp!ZZʹݧ~g9r.%tQVsK,%<*B,eXXX|Ad7(T͟TJrR˴*j_֓I WTV)RE9k[;l}U D5!YNӪ* ,}>1[xiI"(X(,z{٬Stu%i*UںUY|&Z2b0iH ^|yW O}eGm+dDXJK8!CLI||6k g`ׇ]ݿ`rC0kLS-ඈkUR^?*oS9]92z, eUNkŠ8L|PR˺sb]'eݣROyEUauS^MA7`Չ¢1^.oGą"d9;laMzI\V! ׋+,X "azYaV;y2IO %OG/SP:Ep(4"eU\(4v!tJzľ62TZ+K;tNѤϪâYkaw ^xldH{@F%yCuA1-d M,222 NhiI» UUI(N_\ V~ZpFuqENʙLn,Z$EΕe$Jg r R޽kl&YSS%ۂ?B\d5kd s ֖UiͰF/`h``iS)~F suRVdgG[DI])XE>R=|P3w5a}KjC*ҋ(U<#M~!z4m܂w謠aͰJ# 4 DTU%n^ ~#M#0Tj:r$I8xP7 o 6o#T"1D|&%|9}h==)/{mdI /Xh.&j[HߵÄ!={֯VQa`2, ,,>2zV yZݕPi2.tXj(i!TJ!커Ǡ+)% 6CjN7i(iw{CֺRCǐ4Y?LWzZ0dUҧ) 4 LW5`ˉyaȌ:,^nJX6/ҒhPD D顿kk׮$[1y|mm"X֭t⋃Q٨+IQTa*"|´#ctv҆ 9R @kL4¤ Ke^P2})8Npe{y]_?:euF"Q`NYq᭚a9#,>c)f2n?:I uWUxEvq<%-xXb$ 4 瓗Wڻ7y"K\)LX4ܿhQbz.yL$ .[&6 O>ѣbp<{{e}qf' O_e` Y`snV*W5oU S]W{I\EBIQ8#*RQ-oS=F^ǑQM$v:5amn61WHFDo IEzGxǝC2, ,,>氈,]B%:啬:6!25Mcrg( ;wJI!mm#O"jB>/k |=Gbؘo55IL|'>դIm &[X,hXa88Μ)A2, ,,>J"^-*B,{ 1FX==DOGrIU1 .ӟZȨ{bփzZj7?G;#zQK[` #Ef >tp><{22, ,,e%i?2>_XqXؿ_J9w(96M# Td$?mG;nhTK7FXZn{4 ݰ3T}ĵ1LX-{ج`j}_h`e=}*T.^0n{2P]`Dk],U:+2D5; 8~Tmtk![)r9 rCu8#V7,϶k4*B?2Ģ1xc[9F/`Y֓\*АQU*ѻQmj}m~Rkp0.o=UOpqU`3Yw-*gԺcYJ%b@ L+[Y*~~NtEMŰ ^#I,2225m*z^tw'҆PXͥEMX&Lcq=tuI1z1zYች0dL{eNڱCŋEJ07ݼY4 6v]nBF2E&LFt+z==ռzI:,ZI]S#ˆpޮcxeXXXPJ\($ѪbAIa3z_:$6j{vq|F6=**Z0NփRPU(y!)򔍜 9U"ҕfjCkkouX|VJW*vCpg`@CCt0f!iGj+[}+$m_,b/~&I!QXimm9I'^.Q+50&O"QkHM*nVJEUT_Hlxp:5:Axs"̜YsF&#n~p~qt9,222 R}Q_wwR>4;,| +-hJi_4;g\_.pSޓ}MX!7<2]Eod 3ݣaTI!TߤP ,222V)X LM0i`?~ fc~V1;R>5L59cnr$zzƋ[OHKVF.Y"F={os-]ZUvɬ3DCÚ#b9Dxq@" Sw)=U"W&  4 MrF>JԂ3tEN}p5FM^}:~+ )xh5YHtx(U .-$#!7ܜ}^|ܑNAr.s\v 5jz)JeXXX CH拚y{oUn6SXH^`y\3Li}6q(ԏ29c*:~lwڤT*n,⑦h.jjDؾ=zyP,5"Z`h``0 n4QϏs߽u+j,={ 5jQHIpA.qCe^?*R%h t U yj|-`*cd}׌zO jj 3j<1:w-Z\Y?%_a<"?x3y5%g?>)ZߟD PeXXX C F_XթVS_dpHpX6B/ެ,YKhdK2.ސa@'lE O= P OvF.~+apeXXXp"x*%!3fZ\N[ "K&bQy*6OT2,o Nd *A͙SQfmmrm_mA  YB|9'L|h^٥.Fe0pO\e 2, ,,9|3;0-ߔ&"4Uu}ZjuF^K6Yt_") 't39*Pf.qtthE+D[֓\0 YZ=:U1&E8yZ}V*7Z:FeXXXp"{UXI`LJ0ݺ:)㻻yяܹb໡)3YTkkJ) #om{UWXfȧشI4pf;>0=zkyp)1o^0>v,_JtxGd?.#ZǰRaY 4 D*{2 F>%u kv)_=㗩_2YU*::;;LIAgUȫ@q4/r Gt;>]vF-qNj^ܢft\!ц( dЫZcdLF 2, ,,А«5k$)c$?gΤ8&"|eI,9uJTW˲ɓ2=%1x"1Z%3̎1didla?Ra sC̷_X3jg`իLa 4 0鐉^[iTZ*ӷoQG)82=vаd#$, Yc(I*YHJz&Ou,/cXhn_}wOh8sDwy8y't 22 @b$y_,JI%_eE1RMZBZ%׼ŨFBzHƬY,eX<)|ۛx"^0'U˂DUCCb- ~@nInY.ɰQZ,-ɑL: 4 0}8bRhWG=Ac JӾ0䅡 #0Tʵ ȸqS<Cѵ0&E/ܯq4V%WU9vJ +H[Zr^;+zeXXXİrʕs[&SLw0]#| |ldgC;wʛɓkCP.b1o:$JGw756& B2,#+vMTN'aKE0ˆ!9 t K|%wD#2'ͅ @(+(Wӑwܕ| U#8&T Fe*)UjFջC݂䕬 (OuQ ZdؔBb'Q-)yLl(EĶ(?I^aad*)DJ2, ,,őIL)$Yyo {wEu)c ԭJŖ-R13.ySsL7L. 7 %Kd_^6 &zpcQ x;iĚOaj*M`?Aߨ,KQͥԛRw^EjAZ-5h4xAXB̩ҚQAU(1ಅiDӧ6]c3>S#G~XXF_HU @nfۋz{9oŔT(-e:wN }d|>Ǝ-OzMV)IEB,1xEikKt5k$CB..\y<Ơ',X ׷ߞ<2/ޞ(Y-9sF2y_71P,ɔB2, ,,/I?i vN%S4 TDD :MXqD\"Y.\T!Na(\V)!V݇xAO|LV嵊TUf!KBǑF9 EM=Ur2 @nfP { lm][ hv׶5Ctccd 3u*=`"bXDK :͘!G$G2H7$p@̛GǏK]z9^[7c 9 O4'd>2A4ÇŵQ($*Lz{e`;گd?Cg5eXXXp!^ikv-*GVB/cz+Z!0*aѪvnReiAf[wB|22b\VE#dmoIwC72Mj0KZ}ҦHv٨$Ԥ<{5\=yC?oOO#ɚi4 4 L#0 .doС$$?ǎa ciK[:vqeΝ2Ν+Q_׋Or,q+M dJԩIlG8KZDQ|1i_`DyDQݪU2?oO5{zDR AF @nBLeąRnmx+ ˰wȅVCkO׹}&6=j8Ry◪)[ KbS}ёC Qlg+xftPb֧zC_5 {a3ڊQmYb? ?zQ2*KoXeee7ABz{E2Z"{LDoI(+dHSS̽d _/C>"5/cx SLO 2.#IE?L˰n e8N9ÁCyQSCw!Vk+vXt3R|uGJΟ<,222P0ݡY[ E$B6D{+,{z E{z7~/`ҔEw:z+|T.yH^snKZevx'DO"sKD& HSDeXXXpS9s1cNXϸqtôz ^HzvL G)jj 鮻BdL&$d) |Um`S>s\'OJ,[<rMw^d1#IeXeee72QE gd]0D)ԤD^2bD=[_ۛ2怘(.p.$.+$b;i9U=b'ѻZj򀏔熧]!"`yM*="2, ,,`j`255_ț(#,' ,.xoK2b0a}[Ip}Sb8v,QxIFFs3Otܹ!f*9s&qŊĈ̍{ƎU`p#rɏϜ)ۙarL/l>l/ۈKeXXXp#譢nm腼~Ψ|/S2 5/cHݥ"A*D57Kȅ7xÒa,t#䉛o Cg[ D,\( +Wpw/m"6o{˦Rn-ks'ٓdvey%x +)/$bM.72,Y"lmM~~i*52, ,,Bd1(a**\$ZL}U hk6 r="~M yUzD/T:X 2H鼞)ik1Ӵ3?RQYcI;VvX<|[X}L ^ L6gҤn‹pP%Vȼ0ugڕĂ;2 3܂-zL@1q?OQz%2, ,,lq]cP]uP!`?T#މ5b=~YBc,n C>rI:5JQ=UnR6R e[BedF Iu=~L]IA-U4Uٮd0,222٬HLEg[4_%56&cY`2lxQq"̝+wnjEa:}Z["w'l 'LH^O,1ay&/ZF>/҉^óپDt#"a e~XaVZ40 emTC g,`^Gj7`h``MJH{|P䤰1.hGaN ]gS[cQl7{XԪ *jMR9Ajp1]'4C$>W Ӽ:V@FIkaT]$K܂Qx^9UV @!X~Xeee7B<+iEVoŒaw'vvhuubsx&c!}<I($Q)NGAjLY*k K滥R6l/I j2>1Uu._#(ji=ea\ԧ;wR3K;RG(t(xd9ҽ @3XĪUs%lRzasJ7[S F x̚52W^%̗ܜO$g}ڼaG.쨼ɓvdX`+p+eVXժ[}*ITXQƾ]&zFhTHWT(#c@u>@gm9\gʹCϨ""EߴKґC/*T :ֳZՐӞ{~ZLTxүnRpjm_2,222 ViTfΤ'KJOM!A_>:.]e _F7wijnNFSi}}"%ji3Nngptuɲd D@YDMnAظQFer+#v$>so"?.*u[["X}- 4 f@ʓ)F"OfUL8$,A{P?DKZ]P(zDSQGJ/X9)GLƏ[:I,!E0h`$O慌/EƊVy[{\r #b)DttVlTaHll2,Ȼ_w<"*/[gd}6> D3X9}~5_Q wcR5WzUHQϻt ,222LhhHc W|yTRZ- 6yQdI9"R&+]ş(-K";͉|+E=`oS[43e̙Du oK'o?m@_ZRwFsvX)5CF%A#oXeeeZF^+x,>ز',2;Eaa>/F>*Իs$?)!%ֻeX.\d$XEgt>ɫ*p)= !oAR^5]EݷS|aji)mXeee7 ̼,EB,Z$._U%!|IbQ8= 2E,YyuovE] V% ?qB c„$;^:.7sN`#+\Cv\X<~\9k0v6&rF?L̲aF ZƒMSD׬e &#W,,22KA1rO~f=Rԟ/W|lDUއ:N)YH{w`ZKxY eܢ*pDo"zBi]v,'j=!ΫqUҵ+t])1`h`𥡪*-EBE"IK~{uo76&wa5VJ*Yb_{o f0/D"ZI}WUXZ<Nq~=-_.zF)u/3f$5MdYa+P6m.]*|/H*aR]if?G-d)rN @',"y8Q?JM UzFc5R pV_?O[ Ca]Hk|fZ+Rxh /ELXGtj.E#zT+!5/Li{eeeXX|0)N޽1nTjnN 0Ǘ 1a 0!d* 5=sFbzOK3>/feZm#XK~[Ç8v`(ґ#7#S&!|Y?5q wNT°qj!!(|ԪS_R5,,22FäYGpDpaa?}WJi6[#sLTC*ޏS5+wV FdY]35k~&im/hG߇*W(DhU2 @n`EpRʕ"mXڵBL®`/b|~}!i"|v=Yە?釱 sah* 3#l5+d >L>(`|nQ4L|PSXQ#> A˰7iW]{7ԡ*ٿ%7i_ @/i'L>d/Ҟ7 79auTXɾ6c˽%MS!_|ء޻` ~nʅE{L~G˺4sQ%(3_222, ,~8 LǏKL] 3h3)lY^_/Y|f VɊG.>@4~.gΔlW>_tw'Z>bLڰ<"9 tk,Y"md,1Lŭ/'``_&̔)gbesz\ ȹ@Dt\c#W!QPrtcX eE(E-H4!=vP!*[e\ɹ$rL1XXXeeWoIM&=46 HQ&*fo[uX3ĉD8p@J) r_Y#.Q4Y;V4` $:_ ݭE deeXX|ĉ9ޡ-a@Ϲ1|' ( xO|b*u֠Hl7,n xI\VE#%l% Oc6"Nڟ*c4νczgeeeXXh 1gN"%İ`a8dZ[+_,_.>Kbhn+c+/T;ɟ}|RD=NU"sS[;)iZ/nMT{Dr+3ˉyڽlEص+b2ƄΔOjDݫه?!e``&C<:u12ϚW|Z!ӗn| >j´J#*7d2^cXlEjtG˩LSлݪS 76N+*ʜQQfI.ȬK!`Xeeex٬(`7.^H % 7<(N'ʼn5YeJT}hڨ7{(lNz۸߬殦o-7]RF-:͝4(H |%pD2h, #d $,0@:$c??ر8oϜl!7H{5y7xE)V"Cjz`2s0a|u2_ hO͘6M 9_M 24P,CM]zE}'Dc}zq`qD<%AxPz'62c8}T0$Aˉ2m/(dK{JQ"WYT$7kQLiYfjjek6l76aS֎C27ů Sc?|ܛ6'gLh0O7MG̖^RXk^2 Yb̿SaL10>c)9FYyϨØ ۆ~ܞzV`??n9O$^E!3w a LJm EoDo6f.!Q1̘/SjYfeiKx3v3U&p~Nx.~6;'gLhǦaK6 7'?IQb)x_S#??ۆۀ-~\q0>)^O0p|聯v`]^T 524P,C _c m&j߇m #h7O}7ߛ[cNŽNhܗ O;b `Lŋm7bnNӠi=a`"Q0̅8>DՍe$w1wQfeiYfڃwZm߂_QWcz9> ܕ3&i+\GCYh"+C?̼݆ؓhS {-0(` 314P,CMM u24P6^p؊bg(hr\+ d47xDGGJ/%Fp)Xh J+_ߑGUWg>8}^48Ȯ]XKq)ŕv[`*f~X ^>u`0rC'=bČ'iYfe26^)t_ҧ!)m:J<i &EI*6 1h"TR;|$94$[ PթJ.UETGzhVĸFGF4P,CMM u24PdVXW,Q -X7Nۇ9XoCil?r|8'r1Frr,hˆL?~xU]'}'qc,֭pjf8fjB`J{{ú! d;4ƅ "XrxpY@"FR~qQN[)J4,CMM u2~9ѕ~L!OtʚlG\Ke !Y"0bFD(DG;`gGZ#!^"wl7qQOEI Z/1(qG,C 24PS,C] 5jL`DoL.[[J?2EE(aܶsvxpdžȶ Qt>|b@mkc>E?a<WЯ6/IHV@U> ^\S3 :N =rsMw9w2G`{nEx:9Auv!_v UۘM]EIW,C 5525PS%ILȸ͑)YXk/p8:0N8p7 W3>c$XAȈxbٖg̓ll"J!!'eiC*K`] 524P,C IfS"Q|.g06ᵿގ-]zayလ9s&5 p!ܜ9c1CCA?e 쥘~4ژT6o7ZaS$-3k֘AugLu5 ^KU7֮5{sӡH 0jVQjj2/7[Әu%fLfeiY/oA)=Bd׋4 ,t5/3*)1)Vpᦑq*9F.t `\,#n̳D`S$+S *EU-gt2(Q`GR)A"tUx'6hYfjjekk02`gчOJK3gZc|Ɓ8/YqRƘ`ʕ 4{Ƹ#?o̗-'):%_z_C}wP;]Ixk88apȹؿ?tN[+7'b5 8p: oȹsH`KK^_97YfjjekZ1]VE ߖD+!oRg9@@>aM;Gt;l)ÂTe./Q/"cX I+663 7<bsN8TQ\X,k4\a+`]">^/_/ 24PS,C] 5_BI'I1D{5 АGDQ%4WᢧO1+c"mxp.Ykp$-JhCڋȻyvVÃw,&\ W2<fjeiYfjGզ E1VF`b$[(,ĺIXEjx:wF,ŕ䑡SF >2*3gرDsD|~T~=,HYGmˈF-v8pXadOٵ$lۆ~TI p >99Vx#Uf B 24P,CM:_(*רR@(ӕ"&:iq+:E;;yLĽ>2Hq(Gxu2BtnYzySh0@^jg=)t@$ tѐ-ANiYfjjekvlTYcyzSLXpx |.z{FӉ8+JeDM4ZSJ`̙VV7b~h|ƘkQV~\ @|()UX5/^²eL7<DTnX?PqD ^Yfjjekv=,(ʽIxI=/v(&R|۟nK/_N FtFg 7"ye$ҩ!A4XmuMh%8JԣQ:iBU  zhER^r#bo 24,CMM u2Ԯ7xϥ Ηx_QamRR30Z8d fapت;պc1\},+c>!J(n1>Rg'M g@DNdBK+UUen=Sa =@ а¸R7 CMM 5525PSHWN ̰InIHuT)!GTJ1,o"H_7 w f0e0`"=$AS2x:!*xG+9G j")#e2@dЇn.fjjekvHuupͨ>oheakyӛT4v3L1 ̪k"9Gm'(,ers͖-HЀGk)\aŘ1ìZeN**,1k6LAW6]]Yp+'c=xϼC&@a;m,|u2D4PS,C] 2&UW9I*$5BÀE EߍyHiIͼwF#/08AɅ\0B"Ue$8,a:_b0 n`)/G2&%CiR%%xjfx1nq/h̜p1|1L fgDfǝwZrwcǟː 7aq74PS,C] 2&U'Qcz1n=XFһא|f<=hzBFU*La"qlbPghnL26Ռ,2(`M u&:CB+(&y"4yF_! j͡%O J#$2Yfeh6<閛px3r% \ >`(B֬!X| &}F&Xű H80`~+0`<4(M,qo!q38h::QEP@Ȇ='lk^URZ*/?!Bkk}H,~obIa.ԕ4PS,C] 2&dC$Fbq0 R?*,l @S; \IAISy3bz  \ZLce b]  jP! z:J"\%DRzkH8Cɯ[<ڕޘfjjekYD7f78oгs'r(c$##wVZjE`0L0c;7jZe0logіKMSCp s,lԄ, lې17l@wQ xEE\O.pE,')\v@N|a' >9ýa5524P,C nyD8E"hY-e]EwFũRSz*L12Iy,X54JPK2`\s-n\d嘼y4 U9!gPǀ~B%&c="cK\"])Fz{/RM 5525,CmxEg΅!eAd4,[f SXࣼ'jkS<F64>/(@bʕ)^F &<ڼ̒%i X"TMn)82gBFv>Ѓ`7ՅBO#qB%181ůZ[4q=; 'u!8넬}[3Jlɉ'E6IXlo"$ZzI_¶H <;DT-1"1mg84PS,C] 2&:TD"2z+^!PXvWԃ\/:: O0_&V= 75Y nDf@:q,#ALXhƌ0@ =v,3Ρ( ]](aaÇS 0i%a'>ÅaT\j[6Yfeh69!O-NU:˺&*yB1ghxtu" T?*(וJ3~"f(Kt _t](w(T#~B K`Hw#.D3(4ʌ˘vVTiYfeMRc]Vu.\0N{sQ纳K6=% -!Ëz;wb4˰7x-G,AzXlo}5^Y@?D(*Hĺu0ĵKT1Z+D?6`<vݍԳfȇNiCd34{؀#C?A7S\Sld>h4PS,C] 2&E%YP5a1$_lic^bJ/:0MF1l'd-BHGb2>B+F Q?\Oq5Ѭ0-"QA(I2!ad'qڳzTƿDme0b-os8Ķx O_8G), 524P,C Il❍!o~Ӓ Ƅ?fy 'O=+TM̙+,͚Ǯ]8V<1/`ge "7ߌ̈%K0`i)gq" ` 7gΤ غ,X`ho{AQŨD~>rF…v'|={P֜Ap%3#Gc.C\øR34PS,C] 2&ӿbPC7p 6*1npT "\ R娈S:WI%ܡJT]2 t1tlBOJM* YFڋEPE˚dxD@6I:'`hWaZ]!X {0*G<2k_40UN+*5CM 5525,CmRڭb$Tg\<7R'2DX<'SP]^d+>0 'p<̚1V:WN<#aC-jjeiYfj&K*; `FEb#TJybCP^*XC" *("CIW<5И3Q5hBE<%>qZ4PS,C] 2&q>K+zMXL MFNNJS:|F"L1UUx=,\Z  j&efzzE`Xn.b ^g 5{T69c~AAQ[t0} `D"6 ývF4.ͤXEiYfeM cYml/,|D`!hVFBg'X ;ho,.RhzSRb#cs,X RZj6oF7ü e.6'F,]Xמafpf@vڊ^ L,+Ã>,II^7JG4jT% ݿD5524P,C I`>A F̂0q PŠۘ~cz1ϤcaP|u$6J7ۅmBOi猩&6Y2Oqzp&$N%KqN0ur)VD;9UnP"MzKqb,M[q%*T吣FOdsT,CMM u24PVLA8`.-3ݻ00!DpC9cٲT̶poYG 0r(`JN8o} u.  ]'p3"l>!2LSL9ijB͋pVM h&9nmŃ݋U`Û7[9vb1Ȕ d=_%),M\4PS,C] 2&B>H)2qHZgy !F5Ɓ RyEB+WbP¡И$q 1J?&h Oq27dj#aqЮ ȳ_\#H4M_EܫEG"MFRkLiYfeM.Y,yQXWӢ"D.vdb*ˮ0Lkyf- CW~0b5tڊTX~[j6* 2.$ %}ynGW&G];:%Q(A-KQ?`s`D g9,D¯|4^`_EXYݳvWa+q2`pmmPfjjekY䰘P 2>1H1?5f:G7]48OӼMoKZ;y#"Sx w83)GL"X6>K1[KrQ7GiX{?4PӺ7W̓:FXZ( LxddY &Z~v@] 5wcފ7e(,ug  сrL|UWg%7g|uϳrrqũ_`F3;JK#5kTŸݛp!bP#s :B]k!g0Jl; jhvȑA+oxgD:Yfeh6q-N7qDGˍy."B1}tco<툨?pB{'ՙDV{:BIRʱ6,gԴ}9(12cš\ j`(Fq' x'#4xNa: ,]p@W,[#O7,NͨǪvfwfjjh @d8>xu܌wn, 2Ex|2Dl.TZkk-pLdb6%r%s<B?v-]RS+*,\ GcUAX3gNڢ0:m6 lg'2ml-Bxc}(ӓGMM uu25,CmB[@`  XOwA\`:|dD=aZ/ň ݄}D= C[)S()Ԑ>X$̋ZЖJbU,fIqtdm8r8kΒBL;ћSj'PWWWW,CMW3ڊejj}AH4;V^riii/]Uo9z 'kF9y :um޺u1R'LA&sL9 24 jUj A| OU0 !,kWRfeh6YrqW/!B/ŰFx">6F+U?Y+mɔH6d AAkp.*lA3$ _6,zi11_()nًD09I3.z pԣi_24PWWW,C dy᤮_+z?~܊VZNM` W)2["pa ~㋊pD"M& 0-] 4 doCLhoG"C;F8݇De)oX>}v};3?wtQ94PWWW,C gq!L/pRݏzU"1/ f}WԏFaݸ8&H"NA/" * 8:Dt bERq$"oޗ%]FgE4D-Hv$ɛ4OHVR,C]]]] 2&q(w S6-*Kr.-E "LM\`#ŘU\Ɗy" TVzUUVVScyWFPfK`y3g~Xxj6$N܍obHimgVt{H-;*RٖAQS,C]]]] 2&ED-LT0ZuЄAc MYrD cW-'1ޓ`(d"M?%4Ae (@#zp@mi1@edo~.Z:S<6m*5525,Cmr}F%`WC:Lf8@ kzX 0Np5`d3" a5dymIw<Ώ,' jÑssqٴn1Nc ppi!8tXP,C]]]] 2&R!lF7R$6%"!H04*6UOD{m@J?JBq{Q/.#&YR?Xa)NŚi l'DF|(}{A!k,Gg=)*2J(@dPh篐 !F:E#$S8CM uuuu24P4uU*`TNC۱6 `5 n\h"b ItvZ<;s. HO$P}jCd`L;gbXcaٱb"A 8 Xf-X\ŋ, ܴ pմ5݆"/斗cXatW=:ᓁ$~$-}YfeM8 ҽzJʣOQ(|]W̊J%.o!G*F#{q&Qy@c\0’LD7AY|02H:TkW3}d,">{&F9MPyD=9ۑW-q-Eƒ>WS,C]]]] 2&1vl+.ƢReVbCnnJbTH95Z~^Yb - ^P* =8pB {ELۑcJJr |SJK@Yb}Fd" ,/"<xSQdaB[pp~cLp lޞ`>(ppy'΅𡦦YfeM\ bL톸@ty E&"EH(!8>2zp\ FJPIj0!!Q@A"x%= T'HCB1#8c0A e,alT;YACGiq8k|CMM uuuu24Ppx\3QNp4 cV^1[[QrnEDýYU쏂T)*< M)KiYfjbqX#!L:8%_'{X)H |D ` ?*ipB3H$xPG@-LH,EVHdC5q՘bDy̧$*JD;T1?& I{/_1~L|4'NUS4gk$4q}D!D o[P]7֘7i|m}iYfjfk:R";vDS`u _N)xg_[0‡,M̼ lق! n!HlތX '9@D`C,7a ;rܖbXg~JE1`0,p!}J|ĺF=f϶ #o+iYfjBt-Q*Kn׼yJtBjgUy >I bw;Y4gq8In njrOV|EE+)5؊,&%OF6F !%}.S,C]]]] 2&|3^} u,dPSc-4 eR|s1~s3rCBD}=΅g%@}}c9r Mm [Vm#-u ~L(sC`؂ax~>kg95 axi Fy9pޒ+ W>?,WJPS,C]]]] 2&}wK`0)t"b. 1B[0R⩘o4ecGԆ}4M53B wN:WyדƆ#ϧvETx>"b"WDM a #~؈59pߛ?{ؿ]y&+,;P}fjj"D N"Hᰏ ,3>؈| W.ɯU׮EzgD]fۀ|{kxJ"a>yl,YV/!/0I%%h$j8^gD5U,sv۶ 955a8D(d֬P٤ . f x 0fែWP 524PWW,C IcQ"/I84tb'7] UrI `8U\c$D`y41 <)ʴש6J5 s(,m23{>PTTt'Cuuuu2Ԯ͘an"[߉) x-_^n N?0;hfp0UQu5 X)hjV;vXF:p81VfH"5D ]`~˪hm1ІӭY-[8z|0`/VfͲzdWaR ̙zNCMM 25,CmbF]&vc^+W$ O"Q bD҂!b"&S JM~P Z1JB%<5m8hI)JEG0JǙO՘t4^XNjoR-ꐔp KTyd8<5O1U+W{^7n|5PSuԩXpGFMհ8tl485TW#p8]Tߎ TD"aG]W(@{͚ǁzYUhj2\a+YVA!)fcǬ>8|vu!Q\lƽmj7'ШЀG` oU3FD#Yfeh6y-h4?IՙJQRJ-ŌyBe_;F˅ό@QJ#aFl8|OF6S,"6<р9@Ĩg8,#@FaUd ?'Oa0*[o5FNxO"L QSYƱyyy?яnkhζ֖nO }ٿ'>p;#4u?yOY;TWWW,CM:C˖!kosr,  dOd=<g[9p. >،MpƉqJ?{2&I&رڅ`[oM0 ,bA>BM bsnl3jۋ56mBȂ8kՅ;*UEE?B==xm0uk2 höaPhR٨C|4,C]]] 2&PBt _Y?1j1<;\KWhc5Db3v^sT|1?1="h?FF Hz&$qLX"I0rQBJUyըv=Op.Ib@7>6V e WO@ u\{yOss0|,}C?^/,~`EhYcP]]]] 5e3f Qի- dnh0QP vc9|u_WgUUAG5Y=|XꡇӔ)s<˂spF%nݜ$kI=K\ 7Ehg>#^FЌ m$ 1'cMJWh#4??~ܡfjjŸ ޞ Q+8<}}({L曑z577[nE~Sz )8 #h!b,,**l) :YnacPػ̞ݱvzp=766spص GGN錿ppQ#GimbB0z!cK#jjehYfjBrz'F@HĬ a+_k B=)!#M~4?ȎӋ}_|[trG/_CAab=_YcP]]]] 5bj;ڌx?_UWc;=lD"ttw#Fiͦ*G*>đL`w[LN?}|VT mb ĿoSSL!qZۥ1,YHlfp8nhZ;Ra| q*&8[ %pdˡ4,C]]] 2&]}ING~8]˟$DcXnYec+~`$i\įCBU?&G+#|1R`X!bD#Dk"̥D #\ɩb*cjT$~Thfw yI ?E)"ZRj4Ȟۼ{>|.ms֬Y߹yG6-\@ HlvPyWM L={όYcP]]]] 5b\֩K%"xGM ,˖3gАװa^?tB|XGJG\lb%<Ode˾ۋ0Gqۆ~&e֚Çuu ;`̡C(z8l_G6_3GRx|: s5524PWW,C d\)6Seac'(G7I>-4T*D؜~UcAӈF(PL II|")^cm{HHY`1I0Ey*!5B"B84AJSW#Q/!9ȕXfhRP1!xi)[nN2=ň8'N6Gٿs(`h- öaݙ33 6DjQnܑ>a km:fekYڤ !U 5>{(DX6_N_[Ɖk3\ 咽0Ex"c{%m!;`T0˸(M5D{q'}ue֝>+>a2x9:|UP,C uuu24P{w5rF}=̟:e*+qnNjoJJp46[ۊOEjjp0*Y`#GpwމSl 0!e,V@6`@Kl0 DhmE;|, \ɢ9nL1a>,l 07@jjehYfjϢB|0o[xqAagIL [D(E!Pу5ǫm衒`Խ1Z$DJǶpS"2UAFX#J@I+t$պ:ICRW*Q-T, >"J.e| fekYd7W~郻~wU_MIo3vPP-d`пs'S   TZO8wTW#E2`iIip 9Q 0;s=|SpסA8Ԛ5 s@xEB'LAHōd}@NQ[k\1QRb} QJMM 25,Cm+?JG|>E=?!a\) $x趏e$4X B. ˊ \X'}qN$Me`@1M^1&GsF2yLR^B@O"pDF 7ˀsZ] 5flp|P۳f}4__< [,Mv>Ԡ`e%:`LUU 8ho TT ^Gaf>*t*+8BN=v ̡` j $&0k[9zvltxks*(=NX7iiYfeMV,xajo$mK7_Lj}?~fpѧ6Կ_$ \շ_3) %7 ڕ#t$BDH6$=x!1FK#pEtb#NRbj7tH.%kl 055"a'Yb/m76CVKX1xakߺ5%` ulp;<9{$ ??B'ىTW܉ _ss…2?|\9]a82W]'0C/CkLiYfeMn7T# GD hL\W*"lz̧+?(30֭<~"NcQb;^-w٘2V0\?Fgna<KHqUO6zޣ9]Wi*I;Sj"US{ߛfe7f.\S)P@!F/+CCy 0K┊ sv n"#y<'<LsHAKK`S1>$Kã\ VDEKKWP"p:X6峚-"2|3 "cwf+iYfeM (]5-c^ (e"еEaC}%M BE<,"]_$ t"$W'bBsph3eic UP{f 4SgD*Pq*YD<ƪEE2Byj$/z^l,C] 5wP\j fmYE N` pqX,*;57#Q m@>B*7rXr4`Wr, D fF0!`;KJpa ӧ-w[HyEO`pvڊq$/z;adx1S=@(y=2M`0jje_z^25,CmCEHh ],\ h~H{iz`SR"r-4 u[1J\& RGe1YU16.5hH1sSQ?Fh/ K q#ǐ&N cT*K6MИB@QI"ؓHzXλv /G\r5 eq=zkY;ڌjB#xb\jLڬׇ@#P0OOSpĊdwtX*ǩSy҂۰1'Nrե Ϡ ;<:z0`L ݻtv$ς9cz{8Ƃp|?ö"@vX׌ߏBĄA|򉜰4пekY$;YWЉ1-vtL|c$ hA =Bg00=)>Q9K&EJF$ X#0P2X cN}$:]vF&DٮYfjjXwڻL7p3q|ϢE"z5b̊R\o򡑛+T@WW} 5&X/ъ`~+ض G0ʕS45NtL0Dص 8ƍtvYrr,zѓƥSX05DH̀8a)_iuy5P,C Io wtE΂o I!.AWj~J3 >0n4T [dpa45B" 1$ ChiϗiVAJ'0JLyEA yDX./zғPBmBgoyճ] u2Ϩnf0:;_hjJ2fKIߏuu)6_GV;l  1RB̏`Ĺs-gΠ`*C$H#"VQB"zӘ `|mOQ!_ą呔 TqB1ֹIQ}v@*A&P1cf}^>r2ٔ3ϫekXn.*D#NQ\l[j`ܹfgDS/ldQV#sͷN}{;pra~D?B! ߎvh:v w|a^ye%bS`=+hAVjW*`o8CϖU"wfp d8fehYfeMz G"pID bxU`".e`>AI<3 ]Op؁ [ȘԿY }^ebkHE&)Tq:.FE:5_3^U0!FcOCCދUSY~:_<>ygʵko󿯺s25PS{ jPT["7)0_FPF_`8VX !] Gٸ@2` _q/1hY jjdmB,QPGg'x́KM)W,5l/ijsPNYfehYfjXK*C0›`bTcIaIvB tEj0!IG0 ;hBO#"zPoVӗ3REpbPiE'%]ĥ#DҫB ( b993/B$*/ԈJM,g?}sLP=>y[qO5P,CMS*,0gs$~ӧ[xE÷mC$&ų{~(O.5_*NٺAt* oa8ª"2 m`:ć,_srp#zV[1V tOYgqURbXYA:̞m7? SX^FCMM 24,C] 2&ó%=|R80*JR7ɩo\" ר,_ DQV1 fQ B1Qm+8*CP5x9XEaaj IլQ0zHꏞ/o0$f%a#너1?6i!*t ^D$F7Dx0LQ_ 1iەx99LE3F,,M~6צ6/W렱nW7k/\_ hp痿GϞ}7|tx#>yΟqv%p_[Wҋ/@ uΫek_Xxqa&vv"xxW9z)֮E2¬YV0c @?+nXFÖ-Fm]64rsab'2&Ԅ U,YA*+S(<~\+AYcTQ"m^kL)f‡-vM"ZjjehYfeh6鱌v0)+OknOGKqY!ӥ=s:z(QLIA"AĉCk1R R)XIҘ@!A4q"d @Gh')yRXOowKe*GEU킩+,q+6::>OAӟtoCn.Gb@cԩ%-M@ mH7|cehYfjϸX.7_ Vގ BA k U`8 Lp!ȑ#hHjؾO ;Wee n3q-[8|ԎNDtЀ*ϸ,/|`=fehYfeMVx .a[D*䫁ڍyЀϛn;?@{/^ϿK ~端\{7y3\ u2=1?sʪU )h7W^yÇ 2E{ݞ+},Ene \@! 5&-ˈ4 :Ma'f=SX~J3ݰ[lb&W[=̜">ތ֯7xwfWb9FH既QNw58xuZs2(;8+]c#1Nr2rEwF^2..Pd}nvTr=t2veQ e2.% MvG6 㨵QqȚR)V|X?_nuRю$%J.={yl;8RsQVrqbIfVZY [fG<dse5wFEr"2RJʩ˗iʋm x&O?J|G> Qԩӟ Mu^}4j^#׻hႃT?81 )6t;GtpYfA=",=D#(5ӪUfӊ2Å3Z(f4!!MZ -;vHN{R1iӥ|G%v";n;L[ \.p (y{,T"D>ƪxd<5i*ݱuG*) +Uiw:uB: ժ1U׌wu(G׷ P8>X]T*~I Q/ajiKuse$'*ٕۚw6ɯL0r;vzv\[?Ro^ەx{ B)/htn_rq^&\e\#ngV%l jb3Gr|/k%]`#:5]}8C1aF, qo,gNYܬpw2zR2֬1t1;M5u@(DN & G˱JwB:{P \.p ( IDKaVQO"rpǮzx"Odbjmϳi*m­W2\r"ߙˌRGm{ c5SVԕ}ډ;yGgXB0uҕ0GHJqo"t~2+v|9\^tU[Tڮhe \)n1ΝB'0+"#]OEuGl]HlnNpcjKyfØ1`B',\izN*9U$Ze \.J0:ȿ<*XOuxz;O\3R"|nƣV*gڊEFY]UFL2˳0&+̨ԚUjo] H"Gm&g% ړ`yf|a2g)J*H#ЪBx (Y.RJ{=?2^\ex.C/nzcJ:p{]c>_]!oO-u/;\n  0_ZK3~vdt}z1kcƘ[ʞ}xIU9l k-3 (wwk rU7.v1U9a}CLj!! /M=Ǝu͎eoV^2tC e0zqˀbf|j5W CnQחwfdJ*؁VcM5JeTl z 㼚iaS):aUoDVN4 cz5[ YDOGU~֖$:G ;1^/W017[xT! 8vH׋<@T\-znͧ:S6v]SVM`?׍أG+FG3/Mb&ݺO`o9,x93w6SO=|m6n4yoaXvNK_{Ȼ53g5[Աy7|.Μ2>Á)<[2us e@F u@McaLq<7VMA`O#/oc=gRD<_G$Cʉj *YHT(Ǚ,QU8lXA,c _^NX) jZ*9VUl .`+q&OFa41ʳx08zp׋<@T׳ugt%DfR`W[!kFt}d?c|] / Q>2L1{όUyIGg":Uѵv[ ]J"r 9!R{ #_=In!0GeĪ` =U? ;n 7tΚ*^$+j+c]"=Ǫy"lBUsp]sSjo #][UCG+^t58rP׋<@T\-i|Сf ̿Ӯ:GQ3P-N#Jp-6<(2"aցdV?u__P).Q pU8"];P-_eҥZWgCڮpdZs2(݇BDÆ]ĬYO11f톼ncc fl7m2S/\6EE]m\OE%;>}\]31+Ddo]vp='}km'y'g8fyOd…f h.!\e2c?kAhFY("7EY_;ZWgr+JEuH K"ՔS<+ "QReX.Xz!:˯.F5~Q! ZyXUOmӎU`[Djh9;+ȕ&;ZG8F>W̷-)t!\)"gPk2)S\eff:V.f6vo_߾ݬ7lҳW=YŠ39L}f^R!+'O.C{wn֞Ip f[pW0`9ԬYfr!-##]qORܠ"oW基ƫ{sCnγși=;h2e \.JQVfUQV(WaG"U#:Ĩ#O'Y #Qei?|aIE('5_^(vQjWa(.CN S㭹н0d+}o/lXe1\U^a ril,^#?rVI p@Mo59CPe  ]P0n[73nx )}XP |`JW[m/dPz*{%xH7L/6]{lyWx+fKɓRݒCW%HNfՆlyNC:w6'l/Z \.#unL֮5Y,Zd'7wcJoxY[s=MWGYתt\7C}+W%!-îde2.%@+/WUTE=j.b5Vҡ+)I]ŨbZH,ުJQK />SoVuGT@6ᶩ@xJvX)CZ)SkUl5wT@+| SV)@\O*o]NgDzvAj*vLSe \P:ХkU۷ݺ_xR!/᪶͘պBN n 4 .욡[]taN.dMgVC !&O6Zqi){2+Yjv!V:% 7R:}YvdPC 2[iz̛ ";)_3/D7׽!Tn # io"_*߰ϜsIWnj1/:Ɉ2dH3wʨs'CWc١nnOչyEHB^[r}n qtˮ3ٺՌ?|u!wճ5y"˧2 W{{*\.2pPzS'RHS}]o ThKԴQ'TE|c*pU[cR1v"ґ/$R9Gc"De|^&&Z:DRɷdqyHTJ:e&TU!gOs$Jx+;xcz+\.2҃zj]* YcXW[ $KH4okofɆF٧Yѣ9_4drMێ0t).0/CNc*3AisR|dazsAWsD^5xmbeo r D#/mn$&^ CdK}2ψHD_n'ҕ,K8.p (=ؽcլM;"@+戱`k)$KKT{jffaz?ʑ4UB7ue5+W̲͗&!kk=a2rC~BWJ#}Ldc(rtq2J (ڄDu/4~UD>8:}GZ.XuyF/+Vk~g;WAY1RDY )P@eV;!K֫/Y]CH+J[nZ_*:R+܊ltpu&aAsSN4hP X={wޥ[.Q p8 5MJ%0v~/o Y~aw}jsgsXBSsHD7ioW.C _uU `vx=-ӧG}7;홠z4*`W}vxѰtkC蹧3}~Ѐ, e@)>Q;k+5ʱR:[ z`j=GڈUEYj'^>Kxb=HdUDZݺu۽{7.po"[7Ȑe=Q35ÇPzm3ts]kռk;k0B" 35:ͦO76kf|kvܹ5k֌1~u7nW^^e.Q @@ \]?1###_nڴSJ e 2p2֭{EYu|O ˠpd YFӦMu]FVVwM ˠ,p*2d/C2pTe2.Xeݻw_~Ϟ=O8A ˠ,p \eP \e2e p e.pT.@ \.Q e \.p ˠ@ 2B D7.!\e@b\p pP\e2B\B2p@!e .B \2B\.!p e2B \2pU+p e \.p9%c{=/& 2p@ \2B\.!p D7\e2. F@ \ep!e.!p \B2p!e.!p e2Bp\FA\î_eB\.!e@)tTV< 8B2p!e@IrƯ%! >%e2@2p(x0f.?EDb _whhۮ,^T|rݤɆ ڃns.:uezO{jժjժ4ABe p GFrڧwnMN:>mԨ79cm:lh$'-\ 88|zJxbC+3uj챣Gd^B \.!e?B};YYسڵkڶmۮ+\q+.㗟r[t~Y~wJE!\.e2eǒesϊ˽VP! ǷʕKKM${׃".@2pPJ\FjUSSǎ6uj͚5 » ٧ծ߻ABe p (.lٲ{{G[O6e˖]Fhhx9=8\2sP^!e2B \`ѱcNJ*صmڴ{ƍ>c.MCBBʔ)#˘p.v?/UV\<9".@2pw.$IF*U!p \B\FR``78z!C:u!e2B \2q+Thݺ;che2p!\.JX5 dMߺo7wΫ^<)n@Mp222&"gW޵+77ܹsgϜ9#K9O>uClj%.Mpe` 6oe䏷|xgʿTq*5%99cG9|׽%[2p & \!5yҿsrrΝ;gde'V 2p 2s.\bq~V 2pM22N޽$ \!D;e`:B-㏖O?N:~,|s-2p Y.ӁaYFNvglݰvl{ݚ?#d lB,@,On޸>7';+3#9,V \!Dt IssitcGؿ/-5,@e20b/#;++3#Cge`+BdR2)So~s{N:@׮s5_~Weewsz Y@12dgyZvJ]#GkƎ+kd=@P 5 ›e,Ct\2еǩEf͚Y/e,O&d~e?~L?֕*U*_|&M֯_|Kǎ?]qu֮]J*>qdnݺoQ╕YF[nݻG~d⏍eݻw\r``O|oqdA}odyXYӧwa~|/_gz5..Nƌy[]²ϾWikL]Eʛ%iR}pdam>07ql(Y l7!(Yp->Ǐ_-Æ mҤBnvѬLe{LG֪U+ݮ|+ c{w,9r8%%Y%2Xxd{l>4mصWϛ{_#Y@2\`+X Y@12 Čl{Q~r*TػwONH+Mvvs}ٲeGʕVe2O[zM21˸dBa6#(ڵ||A~lq8}QjժrRR,,_ 0 oBYFZ{W P2J͛gϙ3~l.YNL|_={>jp6m}&e,/ecd*} ٌ,ȑ3Neʔ9tUجXf͚ 4شis}RRR߾}+VضmoL(Y_ l7!(YFpg"e2! \!D\!D\.ӁYY.["e.Ӂ"e.@oBt _ 2! \2! \.["e`:B7+8%2p Y.Ӂ. lB,t _ e`+Bd e`:B1\.[ބ, B~!2p@!& kw-[pJo%Y.[7Wt[yYsL2@\sA].[d e`:, VMt[IVY.JܛmLrcn}lʗ/z"-:~u6lע>oo-{7ଊmuvر#""" r?pzzM}Y.4عsgoڵk4$1] |7͛7x}2p((˸){Č5X7 W'V% q[Tzr7z表]aFFŋybbCg*F>=??d GqСܽ{M6, v:Љ^[ZE <2iӦ^sn}FAW4,h|ߜwu,_9Rܲ !//r8_S*UTlW2p.cС&MW_5k֌, vu۶mkٲeid60󙙙wyc5jhʕb=T#ː}Κ5r ؿE\Ӥ]]A޼WW^2dWwSzsrrdynruٳ'_-,˲~#4hY}#G\|5K/Կ' Q.׾bŊΛ7OV~|kܾ}eƍ̋{r 2p.RJgϞc 41FEEMNO78pּ~f͚U5ݻ]їg/ j e.2jժ?ARN?2!ʾ 'Np!5k<},9Qԓ+YsQ<;[v{ԩ͛W_r)ݮ׽y=eZ*`Aj#9繭[uNdٞWkwo͚5:tp~~USLw?98ڵkɞwt ]Zjn z̋{r2p.# ''"%|oP8s61<ՓO>)C#F"h߾; ,22gQlY\G&2c圣MOk2eWG6Kĉw~]w2d *T\y>MG0tǕ z ].\?Bvn]tqi}wO\mݖ&t9y'P\9bw[w r={.>nǕȖK,yǼۥ?^n]s;xw!yPYsСn'w}C ڵ/:zrΫqǼ]?Ox 8_~gϞwo3/Oy!e k׮mѢ5%|opq(za,?~FfnFO> Y^HpG_^} (YF޽ۼ{キdLF/vzgBz v,'O:SclܸeW~얏]e^z'.\ k+%%1bę3gfΜF8mܸqSLqMp%.22Ү];6mtΝ%{dҰaCoڇ;HNNn۶mŊ;t萚ZHOyݎbŊիҖJ*g϶W~g5*SsZ&-8wU޼>͛xܵkW?on[ny?I&Ŀ6Njܸۄ׻/4 s9_ uQ W$^+mڴ]vBB="_M y~=Wϋ!e? ]мys^n]'I<ǁ'eS^e˖݀,>hSN"vj/G_wJNKB .ed?Ǐ槷+--jժ{}Yƚ/SW~gIo|EYx8Cqy2p%V4e2a9sfܸq<ݥ*Ulܸ1''gݺu#˸,e22,逛ڴic u֭XbDDÇo'% X<7_}waߒ-q e`:, 0@\.o%Y.[d e02 \2p ~2p e.[d e,, 2 d e7e\| \e`:, 0@e`:$e`+, F&@\.[6Y.Ls2peeM ~ʗ/z?>8,, 7?a߾}_zKvZ{zC+ڙ8P'eY,#geeez.c̘13f̰"<~'5eC;C7!U =/_%gҶmjժM6zzz*Vؾ}'OrժU=p2p˰]ŋ4h- 5pyɖ /;vˋB7lؠ?H+W2lk ,hժŋ%d@e+˖-|-S dAz,ʔ'뮻|\rΟ?oS,[SunyYFA72pP]'4l033ӷp{?CU,Ï0@\vTF )իW7u,RSS el2::zݺuvZjbG+Ν;v&wql# Ǐ,Оke2tj:t,p-.RJgϞ-h, cǎ땍5ZrennT\e<999;dwuo/@ Yt֭kݺOY5WeԬYӲ FFn[>:uڼysvvv18oOOa:2pt999ZjBJJJ:u6;wӏx"©Sd |5f \uq]tqۃ>xUYFٲeu|-S *T\yeY.Jhܸ?`̙3 >>,ۖaĉݻw뮻[x]yYvEAYF!kg \22˨Q̬^}8*Y۵xaD@\k׮mѢYùs|l2::zݺuv*d\qԭ[Y :oBp\ƸqLv>l᳌^z2dه5hܸs,#[7,+f?sjrrrmV~}1n޽{^RWp' J20fx/_~՞wҥrʿo~Ǐ/22BdWeܹ}zkڵccc,_,ބ,!2nXa\zu@@g1nܸCfeeedd=g! B%;8tPPPPBBBnn޽{¦MFA@AB,C˗w۸UV}^޷oOdd1B%;:tI~W͚5# @9c k2RSS۵kWBf:cƌz9*(Fz9;;[Idd1B%; /^-Z Zp^yɿo*U7n۶~/[ZjN3ޡC+o^Edd1B-۷ܹsϝ;'~_~#Fr\\U!p^eQA?>b2lǠI61ȹkn蹏EܾO}y;oyO<;M7day4o=59MRĘ7ijiq/Ny%.vFW_s΍p~rsBx-[p{~u.RJgϞQF+W͝?~*UbFVXqwl-wؑ7x` e *%.3׬YӲeWOȫE2ʕ+,V (_e׻{>ڋ ذ/j[;NsgΜ9>q?X|Urb$rsrv~7~iﵸǒ?Svڹ'N kժ' )))u! \a˖-k2e {ܫW/_,_mzꀀ%ĉzꩬ,[7cƌǓeYF\FsW~ Bd7ob\?\Z;m۶/_\Tr۷12p Pc t[I@L25jݫסիW?,>tzj2ڶmۮ+\q!Y.*ٽq Ldn.#--AjժUBǏC@cʫ5([lZj,W1#2/+ }\ e2B%~)\.o%Y2w>iҤ䤤cǎ:_.!KQZ5CTVZ\ֱGMZfM\ e2B3eel2 2*U~]}ի2Bd<=,ڳǫu㓓|w_oe 2p|bP[I27nOV͞5nk߷O#kwŊe2>CVtk |.!D*qwV*V׽{;v5>ƵqMCBBʔ)#C]2{u}m0 [$ p*\cۮE2֛oTV~<ޯ12r <ؿ pAlh2@˰2HԶ ZZ^e2Յ/}wG"7qÆ辽{.U;oޱUZ&eXVhVIjV@hp`LJ>}+&ښ>b+#999c82vL$ +- I-Ϛv9|-={VUVWF~ l{v #2ﯬ8UJK gOVhVId0+ne Px߈?>OQFs;vlԶcShѡVƄ  _[[gx쇿VƸqz*+?y_Wb+v3w{.2H -78ZhVI`on3fg~O3fL:5L>2-Cˈ;w^u_2330ujeEE|e̚5=FopHdEo[~#;;;+}pu+aehp +$2v owvСC{ۯ2c 2:lWhSk3᧿kjɖaeheX$et1sӧ;{[nIKK߿QQ&?;Knp|@䤦1"H+-,;;;%%%-//_:o޼~E"„fddĎ~-eZae2 - +$v[S߾}7ophĉO?tlٲA5}?v}2233A4Eеkq&F-HHN2Z$eheX$etҕ1jԨ3&=i5heobz Ҳ75s o*҇hLFFFyZFK!- I-CXVI-jeܹ / ߍ7#ǪAZ #Gh5k\<3_.Yؼ1׭Y6nB{d횷{7z;U,zg[W\]Fp[ Zae@nVIjV@hQokkk 2 2 2 Ϛ2:Q+$ + +$ +ó + eXVhVIjqe - I-C- I-@zuG- I-- I-ʀAjZARˀZAZe2 2 2 +aeXZehVIjVhVIjVAR˰2 Zaeae+c#F֭[޽gϞҥ)+**FգGs=wر2Hjm24"-5 }?[$ -C- I-S⬬KmٲK_ܹsۡe̘1cԩhfw}ARhӕSa>L俽+eheX$et1ux UV]y2{Ŏo~k$YUoq9X$ -C- I-Soڴ-9r$vPVVޖ'/m|fϞ=`%##&vK-n+#lݻVFO pE$HOѷO +cS኏=01>}.2HjVZAZF6!rss  E&G}og|I8$''k$vX[6mxW0uʨ[\rٿ\]O>9̸;;[n'}/?VI-2@˰2HRhѽ{4!233A4DP~iB˨J]Ə9e2URSSG o~piXs<rsCʸf2HjVZAZFlذ!KƎc o E&FFF]]]fffj$S[6my^ŷx-c+Z9y¬x/{?9Z}syeAR˰2 2 2e$??dȐxnEmmmzzzBhҲ[ưav;.))k ZFޙ|#;;2 xwjs!2{!W]u~+۫8!L4{i$),,ܿz˸h4ZWW7o޼3gj$v{U991=S?9Inn~0VI-2@˰2HR8]+cʕW]uU$۷… /))>|xjjjNNNYYYBhp;w^[޽{mG#G2Hj2^K^VX]ty_~+ci' +G_;+aeheX$eXZI-Vƶ01ӮAR˰2 8ZAZe27IjVhVAR˰2 -p|hS2' I-C- I-C8ƖgaaaݛG7~tر>`eeÇ㎻xaeX$ +C- I-XΈD"MСC׭[ZFZZZmmm?eXVI-2@˰2HR8]-,;;;%%%-//_:o޼~5>TK-2K/$ejg̘?g1hVIv {fY}]]+v`eheX$y+7jhӖPPPtڴih\oD7~t_|^8eʔg}v͚5ZeXV3XˈXZhVIuZFhӖY]]}鎟L)\ZQQR8[FO>yxo|H'2-ʰ2H:ǔeaesL|ȑp&%%5},ly7eZaet)+C- I:]-####s'2ZzN2z/=\-2 +sLYZhVI:jǏ^F8>ޖQXXؽ{냟-#77פ4ih|exa\mesLieX$SgR())>|xƔSVVv-#N$i%dtƖw/| III\pwQWWeZFG^ozffylٴa4p{f I2@˰2H9 Ϛ2:˝{pA1eeaesLY5etq%6X]Я}-|kWzK.w^]v;ʘ3oY$cʰ2lnVI:ǔe2N֭۶67|wrO7mX?__&|;G<Ele²C?۷A9 +aesLYZ-Ԯ-642zݷnYk~;Vk|/~sLYV- I瘲2 ZƩ]]vٟyӆ_=2'2?ز)0C+#~&rUH$l'2H:ǔae2 t)+Ce-^?xР8cbw>ZYW+z{f$gO+sLYV- I瘲2 ZƩ]rX=y?WاOz$2nloiL++㋗\?6ѵkW+sLYV- I瘲2 ZƩ];wؼ1_?޻׼ګt)+C- I瘲2Τ+ +$c- I瘲2hРY={ +>+9 + +VA瘲2:ڳ]_7@˰2Oh4گ_6m2-ʰ2ΌQ[[3dȐ OxDkWu}=%%%ݽ{W]p>wСCw3 H$ҵk{o7ݻ';;;555;}&|f/ cƌIKK^}I ׿>[`SVZA+ʠsLq7vm7==?|~m @˰2se/7ߜ}oϟ? 7{ \#s\ y}_lz|;VT/X'&lw[~Ā~&^+7~UUU?SVZA+ʠsLޕk׮>}Յwn qJndС֭;-9-tqYl馛VX=}Q8(++MOOo6m } .Hf_7bĈ˗55 s  nK**>nV^>pG8-VsLYZ-ʠae9:ʘ9swy_YYy-߿hD\z[n m8999ᯅp#씔𶼼<~yD ^^:UUZӸ2^xp; ذ/aߓ4III^7 mƝp^k zkizpmzi׮][?9mK׊MSVg^˰2heXt2>ܷo͛76.8qO?аlٲA5}?vDAAA^^^iӦEU+Aᴷ64h-7.}aeԾݏ~GOzzz<ٳM޽{p^,u\557n]f4|&V޽mvne8ǔe2 ZVc㯌˗6,p;V BxŊ7|s8[_|pЫWCN+"33觯坑3B[~""-2ye7nx߆Okea+#́3nܷ⧢ ^wʔ)9%`WONN..;⊿zkjc zO:_jm ?sKYϤkM8|x555 \UU5`piyy 71إcƌIMMMx~7~YZZ8x׷!JJJn0''M^Y @˰2 +t)+C-ʠAr)+5m2Zz -2 +sLYVhVIr)+4-vhVA9 + +$c-h g2-ʰ2H:ǔaeaesLYe;naexB9 + +sL9ǔ5eX$SV@˰2H:ǔaeh{aesLYeX$SVgMhVA9 + +$c2hVI:ǔZaet)+2t +$cJ- I瘲2_wБ2 t)+ +$cʀhZA9`eaesLYZ- I瘲2@˰2 1eeXZehVI:ǔZA1eeh + SVZA1+c#F֭[޽gϞҥ)SD~i +$cJ-ʰ2H:ǔ(..Zti]]ݖ-[/͝;}ZF}}ѣOm2-C˰2H9 2 t3leL:rժUW^yeC[NeX$SZhVA9VVF7m9;(++NII oZF6>g0`@ᥗ^:zOZeZaeeaeq6!rss  E&G}ُe2 2 2 +ae2w~f?DfffuuO_;###!=~iB˨je2 2 2 +ae2 aÆ/.];NNNo*MJJJH_2Zh +$ - + eXG!CĎ322b?yQ[[ZLeX$eheXVI-8u֞={.]EEE]tSO=hW K#Haaov-aeeaeX$ +㔬+W^uUHo߾ .dᩩ999eee K wyv ZAZZae2 +C - I-- I-2hVAR˰2 2 2 -aeaeaeX$ +2-C˰2HjZZAZe2 2 2 ++C - I-- I-2hVAR˰2 2 2 -aeaeaeX$ +#;I2 2 2 2 4 _WjVIjVhVIjVgMhVAR˰2 2 Zaeh{aeaeaeae@ + e- I-2hVIjVhVAR˰2wetx?t*]D k^wuݻwѣرc+**:˳]:@˰2 ZeaeZFݻwo3.'|So~󛝨e 2 +aeheX$e1-#3"H+WJKK2hVIjZhVAR˰2NeeggK͛ׯ_Ƨje|CdeeuQQQ:bĈJ+Zae2 - +eOohh(((ˋ_:mڴh4g.Ne,Zhƌe4b'N\vC/^W + eXZhVI-Ch|ȑp&%%5}>dZǍwNiKF8"eXVI-2@˰2HjZFe֦@h鵿m6nܸ7vgM[j@@˰2 Zeae-c2 w}8 R\\5meL0a͚5ZdW_E@˰2 Zeae2i%%%ÇOMM)++;Ɩ'4 ^D}ݻw]87JKK;--9-ʰ2HjVZAZF3gN>=y{orKZZZ6I^upކpPQQ:bĈp#씔𶼼<~yD ["geezaeX$ +C- I-VÇypކE'N|-[6hРOǎL`pppڵk:xI&2rssÇ(((ˋ_:mڴh4ZXXDZ",Zhƌe=u?cO]+ e@- I-î˗6,p;ݻw]]]K"~bŊo9z/b8իסCAiii>}Zi fdd/w+䦛n:x`~""--O>9|p`}}}K@mMMMr- e@- I-#QF%1iѱvJի>++=[ ǭHȑ# MJJjC4ƍۻwo=kz,-3k 2;bo*}ٻ{2 Z 2 2:عs^X__ٺpVBȑ#'O絿 ZaeaeaeϚ-#ZAR2 2 2 -iWzh4-cǶ2 Z 2 2 -@;+Y+?>e; ++ +$ +Cuޛ9_Fm{vh#sאַܳʰ2HjV + eVF&[w {2]UKg=iSåo*Ί?޻gw ʰ2HjV _@hae2p\+n޸䣪ʊY${ںes ʰ2HjgHWıababq 'F-c[ ~߽k'Iƽ{vmٴ!U44?dll¿"ne$ib$ibhe7o| ׍$z I*;cN14\ȓ/l%"IzxC}'31ZjZI2A/>/RU"IzxC}'<1 $=!e$ >H-$IrHj$IzxC}ZI2HA9$e$ >H-$IrHAj$IzxC}A-$IrHAj$IzxCR I҃Z$IoHR I҃}ZIސt2H $=!e$A> e$ IA $=!e$ >H-$IrHj$}s}tA9 $=!>e$AIAj$IzxCR I҃}}P I2H tA7 $=!>e$I}$e$A>H-$IoHj$IzC}ZIސ-(g8%[jDo'F-$I$Of[I$I2H$Ij$I$ $IZI$Id$I$ɓ I$yj'I$I$Id|M endstream endobj 1534 0 obj << /Type /XObject /Subtype /Image /Width 2116 /Height 836 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 3453 /Filter /FlateDecode >> stream x!  )¥M endstream endobj 1537 0 obj << /Length 838 /Filter /FlateDecode >> stream xڕV[o0~`}ډ\!\ǤvD+>1Ħ^CU7ώ\b|\Y{= uўGkHX yxٵ` Ft!n\̜γ&'C~97sodms+)~[ݑ$) 8mlSѽcZ]>*XVJ! YO!IPje `Tg/,$iQC.zJ睰v9*{'pM΢v[Vg)d׼Nz t/Z-/Jo=D5TtƟ.xN?K72Gg?M endstream endobj 1542 0 obj << /Length 812 /Filter /FlateDecode >> stream xڭV]o0}H6+䋐(nU[SI0 vd;t;Ts8>28^ 6:qԱMujxvێQ <eJHT'aNmNV2eJ2\̝p/?vmY45 `i#͒Dg%>MSl8\}=VM8B@Wv|s7p Ne).2F\rn~_%JK^JOfM1ϼ%TR3l</V¨ߏQ Y%JaBג"  '1uK,`CNyq?k`4w ]!`,[籦Wf^I!J~%Hbw_7B\;s"Tߕ,E!XlBC6 BLnw0mWys%w0A]+o aڍhMт?`"$4A!B ^=p#xU &V8 6+ŐN(Ibz㦦\-}'BNڲ>fhdnz{RQmgh6[-Omv 8 d2 endstream endobj 1546 0 obj << /Length 744 /Filter /FlateDecode >> stream xڥ]o0+Wt(٤nm'bH5xlg@! r|b}|].Ǯ131Vac0m˝=]0,Ķ`Hb YA4s}Av(c9CN1 UZS(Ԙzbsn/r:1ǭiFeZܗ/8 rהjm4` iq=?yEz!R(8kϖETTeHMNnU`&яqܶ+"ʵDEELH#NulE#G]*TSTڌ:gXL-/~cCvJmI6W Gǵ*e2 E;U&X9d4Omy"+NF.Oق &X"}\Pxzީd9w= jݮttC$˨@k6  6W_ՙ:;wp?3mŢ4N3ގ&}&RΧ+WLr?nu) "8=ZV:mM沲 u/ eOGz:\&v^QXKCu2hfhLK..FMN,Rz14 ǼUs)vrX3`gSpr.U{kr endstream endobj 1559 0 obj << /Length 2611 /Filter /FlateDecode >> stream xڝɒ۸5-6erOTuO2LI)R@{Rc;'7v6J̢~}UF~WYYA]W𴲃izy" o~<}fW j~Q N'^ġW7cm`*^uՎ/,&uQgy׽0D08TB_} ? G\/ _/SM?w(׀V=_B+7zz (`zhecJ3,A/x14~jꐍ8j4A2 M&C?ЇguxxhږWR??Ƚ_/yuViDhUCW+mlk \f%[QRz~Z̽C6s'#7:)va|7Op?C t42B,Ŭ 9Rm h r {U=BٺE^}OnX}\εSN#CEX]=Ѯ W a$9 f~$?1AӬB~-J"o[ihϿX~Ovo$0{Px/K{p59h@nY7st[+j9٪ oڴ"hTUwhڱ"N&:ׂoDd\ a"I_W[e̍{͙IMz #þ(f \2ĸ#27ˡik > #cY@H`88 'nểD҅܈/8=4#ee(gW|"hI+^1 ֺ1<˒L| O7CJ3mCP !A2(eaN8j<|FYlМbs :Q&=V͎36}O.@I:($F#OF=.jAubqkp8p1),~^fmsO$dU=?l®ٺf`؟aI7t k1J@I[#`3@aDK4ݬd{ &۩E!Orpf--"/_)C~(DAT yoZple>cJC%έ\cS|J@(uMktYz8Ě"T\\wϛsP $&1ѧoxP]!GWn.eє;娰.%c}RqZ- 2_HՅfj!WAPs% y tCcr- ˜L\U%K,.:VqTf)D"Ơk3L ,%RR"Ko,`A}aNNa?Fz>m90s3OیVVX^dSjӸ,j$!V.D5.i]L[bU Qᩚ^q9/52cY_)yZC2$H_DZg]\n 0mq승(VFj$wm|{{8Á!BPďwӼvӞh:)R~39TSv(2a.?Z4 D??~;[36L9'6mS?-<(1>i%E'E.\$ŗ-_qQa< f$Ӵʗ-$)|FDžK;"`$:c7݀ߢ2enۧ'm8߅;alGO{K =LycH(.JaYmR#)Qi{m_ك,1tBed{EخLԘEҘ%J}eN!,V/KHꁆ?'spWad&b`, ưd g#REFEnCzjR]sIZU+YqJCz1`` $ÒJ\qFh,?8pDdC1L쉔 j(!M )m e{md:G 2q8fzz4rg2?n֨J}O< (E+O5>޺6=h@rpٳp!F =ﹹ8%Aʰ1s!HXzܛJ)(9^N%İtSh؆aѿ: 1Եig?/$k endstream endobj 1563 0 obj << /Length 3993 /Filter /FlateDecode >> stream xڭˎ_;Z^{AMAbwˣz?zz4EbXow޼wEX*veqF:Un[87m^r7^ 4̵Eg&Ayov셻Z~dtK$ !{ I0I{a,'ːV wgVAQ; Cv*aH{@kMpc_CZ4Tf% I nbl?MWV`k#n.NUIw竕6!mX; 5W R>ofߵ8o/{.-PgZP ]!c iL8p5128-u–Ā.]:a4~bX8Fq3Y.lޢԍe9.F( A 2#"4ʳb]* /؅}ĻO&'XwЦFgloj@sޞlsٸM&]* f|4%$$a)!^(]2=\kh{:jgߡ;˰4QY )lx LRImƾie泥{,}<225ĘR˥X3 &Zqq9, \X& x1(7=L WX0 հ Zga-t H>#{ HRBr-J0ŰAZ^u^O$ IŀnfXIT9 |-YNCo{eD5ȃ]'C텲Rdn#D-cjpk܃DFZޥQhsڽ>آlXO 6xjv'Ci^")#DŽݺݔ0&O^i~8u.j-PM]W@ ]wMϵ+1y؉.,m0a3Y+5B܂Cw|\CBꑡT;+p CM(NGKk'oX/QYӔ2*4\I8䠊b@ (ng&(:K0\zp fS ;ҟj@T\Ly`$g98r9r!T 0̿艟ؑBY1FQ*JSV.8G>Ov5jCwr1BجƇ jf(<@~0eCvj/mGflJ[Ypy#P8B2Aks¶}+v-XJ|{C;3ė\1@b\־)hW /D]~ġբ&*IU`0ͥ/$iixhalaaҕ/$e[R-e6丷&|uPʗz&sIbd\ARh[~0aj< ZŽ|t|aMXs 87Ju 6ɮj%e!l1\@%!E%-rԫTcUŀ,qŚxIE>z]ݫ^a:;RNíiW?* uiyX7^Fj3Bk)SW6^J(Y2I\eF{|I} 0הxUST/ܿ>)|6*1l&h a*d#|h*?lbTrU4 Uⅱ I0ʋr,ϯxF M1a4c7Kap<4I|1fQ\>_,# : /<߽/rb'T hm} ѹ)&( Y9JBMd+,0I囸 V佷}aDÙQLHI(:@ӟK@bnDqjVq sTʈVrw +WuEuy_Kj\[9-xU6/YMoׁQ9nѵeߺL#wXr+L)Hi"勠IeФcWL+y^,Œu'(^T':Lla-diA;I c"P>9=^8.WU=vqYԗO H<'&,Z.6R=z|-U9yY~stFrY>7.1AR3 j+{ra:0. [-}YZ=. Rc=ϯxĆz,:rgs:I<>!9#);=cϔQ@" ׊+X|h({^ $fVoqvQTrz, < 2)dU`#g,YP@?ץ / !Mw.Kdtk=WK{ea &kouc-ܾ:^%WiJLQӜ Tp<9[5yY܅TeKTce(~)ϪslGHޤLv(_k O+/÷]!*= :ѕ R:5sR(t]en 0K|F{L vC>{ɵUx~Jp)?oዩ^@|8KJ{]C-$M2NK@%%Nd8Bc=רE]'q!oyzӗ75a>ga|͟n1"! _jJ^`!p[lYg#`J\S6WHda]-L,9|1_3$P%IV}X^A}f|ﴳpWh!FJqƋC=aџYu:̲ut7 ^R!ǐ!E2yIW$T endstream endobj 1567 0 obj << /Length 1423 /Filter /FlateDecode >> stream xڭWMs6WHTEIֱ;&&9$laJ A6U ML' \,>v߾c/ \l^(P4#Wu\kӛ2.>yy\,JR,GldY\?/RfYrfF&]B%i!<9%L>-x,c"95f\fIib%MZ׵eն:lf4}nC< ޘ>L~u'MXzenku/$T%2Z[7jlצKQ8V7{9/tsnL07u8rajF78Y$m;_+HJq0}0,=h`,'R*^fJ@(gJ.8?{T)aN^Oh9a9牢3)C_InHXJYVpŘ>XG3p1+h55'㵶}kXq&S2"\)Ud@<=j%!W>hմC8rksW%}`L7.d3;+U9OB/q M(LA&%&qƺEAiCa 93GdqQɦ56l"40u  \?80II2Hn2c2XzS9-⁕;c(r!<:8xyO1%qrR$BqIEgDb%a\cFiuMU|W1?b Bm8#,˒[D4HAK)zUU50`qj7q̳ڎtËObۆS5n[=1NhߚC~d^UѢ 9#hM}SY&6R!EE^Vw=F :۟ںU0kC#V/[,znSwς)*!V9mk؉`x}sHN5qr_ ^#Ѵ-*@]ҵHÔ_QEzE l_vNz@rϛ( 7Ai  =qxݡw3+$A)"{vR\͵CEh@♀5"rx|9|r.="tޓ_$FW2c$_OU-`ncכŎluj E*zBE,kŢ bzHü?L'E?N]W[#yMd dү9NqgZ endstream endobj 1468 0 obj << /Type /ObjStm /N 100 /First 967 /Length 2162 /Filter /FlateDecode >> stream xY[o[~ׯ< X Z4HR`[_Z[R%v}$GdHr>H9 əo$)g 2b4/~(H1+AKC4YY )1upJ&cLѰ &&:Y0uM u,f++V2{ (sq=Pdȕ QбЁP[N_!q*th RP-U.G]RP:ST_g.*&.JamV(R1V$+(>*%:ԳuȀR$8ǜ^ț@*F(TfPQ*M^6@J 0U6ƼEmRC3R]B8KU(p# AA0V,xT HPYl 5}V>q&[B&X٫L,wG:s4,E%2IJe G= ՕUeCܤRt b a_ ɤd @`5ktsƋJt]RV3&G񽃃^9BT2i~?1` Aq矟gdo2cNze?19 Q8Δ`=0A#}q/ bLCuv M Oi48N̑i>zh<۰Ň˶|m2֜u|܎wvb# Hpc9]^Dt%g;C*Ym4"U`iUjeFd7'91D:mrw:2*?n|l>X:މI F|( 6_Lz?N_V,NA^': @Q;2 CfAQS࠮м7_}LlըmNv1]N70~; Gms3894=IBZgf~"oACnQm@$V{)8i@gf#_t$PzMhQl8| T BTD6Ni{?ߜZH[gѝHRymVKj/VE&O$ن hh;Ŋ^-H="}%&sx8"UxH{?Pe;εEP+vUkɎuUjұi8fM4y:JsXH&%sPxXacZbmMHInA~'-3{5iȫa<՞ʫɭ$o n6dQ*vEMȃٺr%//2y4{T-(Lbgz^LJi!Ζݚe4ɠ)ݞ*\; W OZe&MPn/ɿK;G+ӪU1`E&"Ӽo<^Ont p]*RoP5.f5=4Dʪ&d1ّ^:L qs <'œ9Ř\DYezlѣ:.edхqZFh+^X! YEzo/32$ب30bӓIJd'˛',{I%=(M{o;x1yM )&egeFXhk noƃɞ D-(bSgsʹBbS,`zzG^#BaݬyٿSA\L=y4rD^Nqۋys}:_ ^;z썋!.bԶ^{ܡZbқdgo##Z:[2mf[7tZ۸z;w:I͋Wy{4~(.%|(.>fƈ<O0̑73 Ёyr]8vX:d Pz;GOi}Eՙȩ mgT)>3^% B#9/{F0{IMB'`=cI֩?{. endstream endobj 1589 0 obj << /Length1 2497 /Length2 20846 /Length3 0 /Length 22275 /Filter /FlateDecode >> stream xڌTj ! 5twwt7 C - )-%)}f7kX h(T5-A@M ,`cdac@Ѵ;#Gقa! 4CdRf`2 ` 8crHyZY ' $ : z;??/qG@ ltd0sh,l` A'd; zzz9\E`: Eb75ۿ ++8Z .N@W$;@C^ /c0; @N;YX͜mV@{% `doaf`f1t3 ,\mn,nqd+ N GG l]{{N O' +['KhX;j9ٺmYn666^>a+3o%_b_g3 BokAu3@*,m-sʟ1_2W[/dld,AN1")W)!2s9<\^RU3WNV H@"  =3 YC6n6 /G+ߊdGoho >! \5%@W'6\h&cT[k3Hp['*t<*nYBNSJ;Y,=\]ͼQ n/;H-^6  V W& `K/`xUJAbAV?AdP T HE| $`U 4 .aAj AZt H-zEZ 3 ~E2H8:kX-!L"@*׀Bfn6p4 :#I/sA1pS $ ? ? Xȳjn qu??@Aqs|M:9tRi<jg3,.H# Dyj>?I! G↘A"BOeGl @=App&B?A"]* wWH@?@/IdލpFDAy` x)`hhZ0, [63KNco{D4Y"Sz؝"کsUO4t)WAuR/uC0)t8Éq17Ƈ[srpMnJG^q-h0(Q<00?{Mmn|ĩpHVMGUcuI)];gJǝ\MYQIz|$T="]Ԧtieǘp2s8g8ҋֆ |@l|ʰ|42sh߃Ղ_|h/ݭ_]o T@ݯOA ,&/U~(nT-O鍧N*wG۞{m/r`޳tU}l#J\q6q~ӕ+n؆.K6? dP:p6D!)V).+u Enj4;`v}<5<߻VM^6SXw}Mخ([M390i(QZ,pQm?9s!/oI&TP|2rtjҴmeY`eU4]Zz&~?LìH+-2/WT}xV?ƞ~_j]qڏދEEW^) c)MlAOUVrgd#B[fPƾ ~ 9L:Bi[5b~.H['>zR slWq-:uiQ-+>lۨ̄5w&rgQ@\-X'h0NCěNa`N1Zs;6RœXk$Z1cj3&Yl&*&"`015=xtX LdB;% ߓp^ ;-%Qwg֋4zy<&`:Jbu]Atj02tE/`,AViK`,!]჉K%bYȡ *I_2}J50B`MS`oEJm .[nR]u4S֕%U|qQ[}28RJc~&s/,fGiZ4cJh=Ar2GX5~ޓgj6\ڈ8:Y|%Ɂ=ЏszOƋ ̧*KtIQX.tl fB=CEI}чx5.%1Rł5W`,vF񰉙w MFG~A `g\$vl+ϑA /,Ps77M߫Hy2u"X|Ms,whȧAw`wYGiA QCx7\O˻rԏj|Bh4^Q*~Hl o4oPr1֊J0d?>-,/:k4F݃ nߘ * %prj|<4]ejK*њ8yMY%3tI&M|pvw臭 \8Yż4mێB;VL(`={3e`Z1wr;kM4 i&͟>(k{'iSHz%T9sUs =[Hzl%R'@!QRxbI&Z$΅LRd^V<&Z_oh'4*0҉?kT[wn7<~J?^cc ǣ.nMxg|f)96'xsL&Q5`_J!0l "" өT(F$S5{ŪR`3>.*_Z8 umwljײˑLϫ2qNo FQWIe;򸾛 la\^Et|j=ڊK,vZe ɓ D݇I̝/f[d#s_[j? i)f>g7^Hoj**`*Sox }R+sR3ݷGtB,YSr-ro"J{`UySF-~jj˦'ozV4\iŢ_C9'LM9ױ8a(1p3-uj2B̌%Z@OvyiAqBlS(-n2]4e{,΃R+Z!M!C־|JQDޟ&/AOI7m'*tKYg?ڳáowT/ߝx1"Gok䳾eފ# -PE߳b!2J<(7 5f{'jŖ0YgH ٬xd͈6zeiFҙɺɋg&mﱖ9$Woֈݫޤ_{@xrT9h {WhD2-[ȱz6ė2y{i`%Od;.qz-\E*RTGM%ZF/ J^:iXzp+`OدOߡjh)7-9?#`~WdI;Ըfd\,Sׅd/bm/IBq1l%AA}ͣ8ưRu|;Wlu-7GیN1II4UW뿣L2ib ̒=?U%;Mx o 3`"TXܘg (.\@ ck іXK/_`H?f| d+CrN tbpPh&:mav?bX@o73EU>&K)*ؑ]{0ro4wycpinrRs(TB-2p4 %gk]6y26w>YGx6<q$+b$ϏnPl"k >vXɢZ) _YFׅQ+-B'87bu}uin7- ?t3UE+~rkAHgQ0ޜhp4Jb،F0_hۭ!KWukCW&ˁV5N񍋯}Ea'`7yx+ {s7Ff?s$Sxj*9۬?^Ğ&!CԊ'h-O#8b9-F `1-#hqt9oDyޜ 2)=PAsݐ_k/X1fsXM -0еO=h?'AXw IL5ؽ4}0DaxO808$#e_mH`ۘ /J$2>9Br%h֘4'D-&uK!x"ѝVd<`HE.L֚Nꮒ Il*>*cH˔F͇h2@Sa؍{Vy_߻`Y Fnspve:p;K{Es$^澼&%CmPwCCU.e,ZGo*$è'ҭц,ہ=1(>c)|7|I.*,V6T!`l`qQ|!/Qff,#2'o!ޥ8}$K.kV}0V;٫f+{5_Uh{_c- rnrZc06M-Wr1S}}Za 5O$#u3%B{&k ts`lú^%_|i@2EqA01ս \;Bdvvgyqe8{OWVK x.|>Q^ h%nG̅wCV <ٌ&/@')?2qNlXQ [6qhk"u߸V*XpC{&EV>R~p.qBNI |$AMN]qyRXNg4=yɈZӔ<-Eiq:2ޢs΅Xe./ \)hXBDNhl_XUx`=奆-L;{^Q2!q3QUƓ2~WPZGMNq{?'|8P74=U*<↨z͌mghsэ~A<͢PZ z&JqJpS Q~EGe3K& ޹PuW ƚj3OBsJ#Af֓T B?F[OB&voitwAd5` TwHx+Z5Q!{)͘^(S<%h j}ĕŭUϜ1]@SɿN7={mކ:ihKyH{VسlR.?t:8p2sz Ը_IŨ > M8Nx8(l߄PM"P_*=),5SKszE2膘5vSo"yː~kA**oc %;=EH2ao<Q@)J?W`|-~IJ˧ ^zE`QECĚ ۜ`| }'k ٚЩY5=t? q{Hu+ =lsYx ?F=/G}=GJ/KfEA9U:F7UInoEℑh|NڞqCt]wx;N~*YӛC]U S7o[4-d&)oL{[Wb! oAmnGZ%K=VNoE;1\/J+n#/A*_{SZr~]k;#і9lZ]ܺO만a?"&> `ٴΛо{Q/&x.Z [=x>5͜H^[?le&%vpb֝XV8j;wD+]9F68/˳fT#8|\up#\e$p6<=\8$"%=#IδRN`) @[hH (Lc1u :uDM~/3F擏C 2I>˱~_O2'Ā2;L8*eOFef0:|ٓS Ɗ' $(Z۴=Gak( >i-eQh 2  5:Av ioO+j$iŽfh ^Ywo|̲g;Ⅹ}Yu+xiCb3}sҨ}!5sfAriS(wqV/OtY̘dko#bvN{{;^ -r-CDi[KP(^ pNjT˸2a9$dҗww`>նWsMX]<gwKKU8EV2;~X!vwjz]-9 IpK>8|' uE_~=GN^@p$fhZY3njz~􍎵Hʢ4~Դ*wl}Ri .ԅ6<|jh7?=e`^V8܏ŒkI`]8;id&XEQ2dVE^kobb=+62VxtbU?T x?9yW1YǞ tg L*; OPl被B AZ^et Y:  㦑Qܭ:-жp_yCvȕ_zO#7+[n9&S/ FZszztrY,E?#m_y~\_dy\YW(, xSmDE$@2.Gg~%Q1Uj5yֶ xAU%ߦh3c#_gslF2[srVܔܖM$h:,,$Ki:d6OmQs[J (:Qęw)V#$5җYLhu%XH}RB#oG$V޷'ˬմNvK'4^lTc@0c뵪1N1xߗp.:2Ӭ1nوkr=]ȹB0>sLZ2Ny/ݪ ,x2G$t+'t:: 2H!amWnX46L Eթ02Cx SF+mOzgm5^U4} ~jEݐ}8v[RoE}V߆HuISy ҝ5_WJƉF $$bU4~N7EOPL u.1D3Vc m(-!rjs"A׌M> |IPac|l[_BA@GRoR]kfuo 4"W @$_fc;ݜL$|NO~&ۉI-kvM>4,z8Рx[J囘K)7,̚5- zg?k7fR"(sүuC%yhIzHjW-K&`5죢 ECZRvi+ g3cboct%xQhe?S}Y#Upn(y>(&T@nO[TOv]j9ī0L|UΐxJ43=?OY}5c CP&ETe*;V7E{Vo2w W'w!2e|9B){' V[Un&Ԕ [xcY9oׂZza1X\ eGo~o7=Z"z?Lp]1m&q%=qU-onh3=Ց;|G6՜uף[щY'ГUX$agֻ^S'ZA5贋]b|儲QrP{}SRmp.l׹=DJ̤7 q/r+Q'H}p=HT]9} Q!۳یm+5u*t[?Ǟ8/ҷeG6yͥ`vc"_Uyî<~P"Z'Vu3c` .H؏~Vhףu 6M |h4-b'Q p+.t _TKKMA#IdzKY(I%i1eŸff!4J#cQ&{DċWL$ 1=]C?t)Ɵl D2SFP$/]g+ar tq᭮^$1Pvc`&!v()O>ZVHMaMz`竔uksM }Eo%p*t}#@CʢxYNz2+5Ț@.|SS-bd$K2s82yQΠIP '|D^EyRR XI~;w^(hW٦7j@0CGAs4pdRdل( A/Ҋ)#%kUnǼGj%{~T9"|VҾ0R5$~ J!悓ߟҊ'Uӵ)U5;}ʿ9OS;|ocoR뇟MF57(q ٟuΝ:(P"3Ebk~ꪍ=6OwG#>Ca=OӖ.ɝGu3tD3t7j(+g>EN#rse%328Alߨb}, x{M"~B/&׏f@^8'jvGs]"0xN5bEgӨ߲R3Gg]_M7Nh𪸑y;5cmFr/hnOUer18k$Zj#^JxP pHp7n!G.OF<& ||x⋐k-F@ !0G~( !0u\IH ڕ6- .R_ :),_Ld~K^/ J3,RN|4mxБ2L=ӇDEܒ\VN p&:\:WewogγEk3(FG8I?6csRe~~ iDpt<}6*ZMa%`~oH[RNx26<,vBƎPwddlږsq}r[`DP$Ee{uW '|}~䓱[{?~|3l962Z$~꟡ܖyAa^/E DtKUwZĞK VO}lP7ڬP:9byW'ʳ`S[^8XʯUpKաÙN{c14ّʒ48Ts-gTdod ̏D:g$,Zi6FbeK,hbn+Ogʊh0b2W²Iah3G~tKY/ڥ2(7^L>V=GAhA0^#C?"xJbYzXEj|U7H1 ȵEPA*mЬP 3Qo;ʝ d(;sUkyy^#P{3 pܒ)dl$yo t\* Y:mZo.1tC#d;QC4 N-dN6}}A+qy \ f4R_/L"%_5O̵V6%BWRdF$6]p QW~WH3Lm<_euzJa!QCrhWjՑ"LۀFBO!3jUH`~/ <ᖙpimm^J0S߮ 3ϻ.m3!" GISֺNɴ bvȒ3D FhZfUML|D ,4mpqʆpG /Wb_e4F.f2CL}:IVYѠatgP֏}?Dk%N{`@0CC횤RM΃th E]m`LvsCp 0Rý2.q\as= dm*h7v*rX-ctÔK:nJ% S袟l٘bw]ƱFry $x>DPIٽ6-ToK[!k8^&1rJFʉL9(U"_=X@bw S  p$f?Ā}-X5^*Wo™`p]AR*2E') aez(ƣhYB.IĊ&겍d'9؃F-z<>3625xp8nf9fl֢8fqs%/n1|@oZ(JpkQx!v )PTy1Ճ wegeq8ݷ/IuZb?:U2~Jz(%(5WO0g^#4.(_vL\6,"5JMW7U]bi9@1MFY p$lι[zn-r]Y7th7/M)*v%_iH`}UO E9#Ꮩ0HYL)u F/SrkeTf}O> [*N5Љ|UÎٚ?6 '#fc$ ,o\CXDX!$LCl9.Ȋff]G;M]~/ >z@j_e< C9u2l ((.V ͍>~Y}Zn,?x9AU7ܣ ׷da|0mX2zZj#)\w?أԃ-2CلƟWq&ͮoٹ.ם:(,r&@u< )V%A(hvUZFu  )h[;LZ[B>η7]w@ aquӤC`~f 'JKa'͌>ӏi.M_H{mi>]#,fhYAi*O;N $D{ п> x_:զ"2 $emhlrrI!܋OԉOUM7Eֆn޹zϩ,%i66Ik}(Zg.uPW0ۦ c*r6qN†Y(\E=HQ=HS׫n;dR9f\*P ^$Csn-4#3qQ8dxӉng(ib(\8[x!g#WϒW€cv(yU-I@ӝOokcu?Qo.v=S|gBdъ5 -+E^K虢ٰz3>&CLLM܄" '仯@f澷6!,ηh;k^zh$v"J]|P{]W8X]*.fnDSH>q&+=b*}@q @l7~Nn] ,[X&z9Hwj&q$H3=x0}) Q.˧kD@瓠c8?dF` &Wr&sc:%jyiԊ6tBtwmc˻;v L @\&1o %u]Y*_PM}8qxFʔV@`Ӣ欌g(V?Gsbu |/a͛5p-33kX ꁤ:wQr* ]:{m37\8Μ0d,*>CAf] t~+2azn$(=3A7ޚS Ӭ2Ef iN3w j ZH:+5b*N9@-ί>4RJeHqiNrśE j힔R+Uk,,AlN-|sy."u'@!_[Gt_-vpIi&+ꍘ?kc]dNO/Gbx>H@HK eg|!:|͚d9`?1\ĒrFKПg* b\\A֛R픞hJΔ.UdDoL'_|,%+U):n@PDpAWu;%S@fd<}_ÛJW 8c4_?ފk6@g_N/xIipzO4٩9 dɵy?Iդ)}_]'[\@%>([grMOgR`o{YS~L,t32M|矐_!DpFn+v[I饦?=L Gb_%QBD;d t޵1g*я{>[{$D-_#bHtTk)Fss),ᕊ)ts"+P*:*DFQ8otGkZ"|t/~bYT*o܌J Gbp;+/kŢgmfq}u9Ub.P5F1s #l֬r?u~6q𗾔3hQ)T3[?{*X^Mx|go K)f" 2M'cӦ~4 r#ɦ aB֟ G/Z l'.]JL 2Yn֒P22gCu0a&W)ysC o8}P<Y~䚒+PbrYcgYiO92'gb`*Y,)IWPB O:a|8Ebv8*c/bي5JG/[/`.p fN:$\T,4\ *۷ѵ 6f +s**&#Gږ} >Op yJ6,j7ݧ28/1FO cg:pV^y8ܱx@s*H}CzyN 4MY o<6cqߤ;|mod*?*G5FuNeCv26xdP NNy/׊j!-4ǡ򉢶[H s_p)^HfWR )]7kϾOP!#4 1 j@IKC 1~f(˺ȥVG>z$@ %ګH v"eP aцj!XfY?GX@Sc ]O)nm }Xdp' Wc%Z~ݔU4^`^ܼUiSPpE9Hʠ锁'*掲O]ב"xU?fMUJP]VQ?  j1pUKBLdZ> stream xڌP[ӆ apgpwww-Np']CpsjfZݫ{ݽTYQ$ Sfa03113"PR[ځ@ rvvt3}MQ f`app23Xy 7q6(0d@.bN^֖Vy@cF `b{;@lmfP0qٿg439Y\' /dbl)Hv\@ s_&KcB[Yˠha /Y\޷9j2%'ÿwq,L, v{%Pgrte8hb$ET& Յ/¼Y\ĭAfurm=|C0wsj8XtɈ} Ϛ%}<ͬ%Prmdk]]b:|i_B`a[LA/,l c~o?_3x0sG;?_1PB\ACUߒku0rY9X,,l<.foUeOD GϿDW?B4ZfPt|gO3s0=v9Mnﳡ>!U u36W qo]$=A֮fVj{p;k_# 3ϜC6GSJ895{gg/c9]߷,QNP䯥'(@? !6/q1Cbe{>?OSTC1U{L?w}=Lл>? WSqx?|we/tGnb|h|h|e|e|f sNdNﺝGyQ?钿 wy??ı=Z?SVΠ]?6W^J\$c}7ܙ9;~2  2CX^p4 X#B7!0KJ 6:3x^$immWNx礹6%Q(Auzai g`DQ]xf-d3x,eG7n|G>)Ϻձ=jN9ėXOAsyYxd0ptsw9o$ ~l>[qO.]xĐwcT>ɲ>%Eec, QM>גv.NnN6S١>Sȭ*ye1qS9"4`zCLaa"~@? u%Vl*7[Api9MNo^C'a$ŏ{nKezt^nQhrV'YBc ߹KLL ",oy'Kg"̫EͿN˔MIzD*VO/XٴuE1Mt2p.V+  uƣP NF !lԵ龷Aۣjᥞ"gԎ"X!>Qn{O: еKwBrCbGWBx1SP|Ui|̐r^K\a^c tWOƒ o l҅!{*ð$( L_<[p㥔ФcGs.sȭΥׁ{K1v8T$F.Vc "qhB/j5g 5u ѷW wHzwtϬj! >~Qم J3BOmQ,4J O|/:@Z2շ<әBtH:EFvSI {Wo@ ӄK'A۵^EUS\:*mNkE.G5y~SCCI vBSI{A~X2MI\}~QAn~DS#3VM]syzi9Sf i6b ?8?~YW0kcY.Ƣ1|V&qdA} ~*fRC*{b17B^ _Aڿʰ|\Ccß7Y*(~r.&->zi"̹6_P|lCh2n{GY0$|;^B]JHf+>\1לc?C %XLF49<,U/vtMsc:D?[t*1ZX yA Xk~y(*$X ;\`|$^˯gdDNalS+!h5 JNFdϪVb$W"_=L;ج%Bڟz?$b?RϾ@I`9yP[JLd$[%,ۚ>f41e-1i?S2L{0ѳQl 4 W $]eۿ"O|vk*"9{>AOų .EYRJV79'%Y]`+|$DϜx#=q AƴzÉ(§'ϬfnͪE%#7–&Px+ԣH/]Ķg9[JspD$.cLbT+4$whNT ~fe<`N;e= 5هW wSޤ"C,0%f.H:^pZN"e +3[qOM)"O=mRn6tFK+$gĊ^Q׈f;|vCR-onk#B]lig:+S[-B=]OGMޥf.80z/acZk/-n,$Bƾ:M!yf@Wl|U9(*IƙXqP\v)p[\l(rR7 FOf$G4F/Y{`+T?N_E>d(y&w:1 *p#pMCAI=ZE6uTWw,sPFG-k&~BL5j@hȊէU E#2j9\@S9(Z8l-ME+`uz]Ͱ$MNr=y)pUV\ch[_5}2W>R`ԑ@20z!HVHaSǪ KU&G}'&*b3,>w֪›MlI)e$fJΐ{c0 ,Iu`a1`'S:΃PJCD VB1ůNr2ܔƼ-1"ņEh^O9UH?x&)[CW_K"l[] _ %O_IO,3H5D&G 0v=8 ;LHo"wɇ0_ qcL󛀉RukiR}cy{gqx`O#2WS.G.hî DŽ Osrcm@r'F.K[xluۺEUOI5woG 3^o=h.#Y޽k֖i̵5ܽ]l8yv]L;Zf4-Zoe:N d oNp`(>"=l;"-6غQ_xdVxIn8ֳ~jNۨJW2ncOxI584eiѼ|2e!sd677!h9ٰ`2Bs;λ#Hqɔ i,h^6ejc"? ׀Y &%^Wcο)%_, s 7bVKrmcs7E:Σ%l3bI/bӲ'}IA~4`A_NT3Zϲ~,̆ӿC q{C[;^-kDIh(%3`X hi^Xs7JWHeÂ(rF3Fv o` _Q!QDLuƊ6[QMV~݋0Dhgԧt!E)3CU١-p1|# m8 T 6QD[^Jòf.tY$}sBkM;qI;r^As,k~ՅύnMˆ 6 2H%RP:(=鏊a%޲Тy DIqe/Em|zR(fAmPt!y|mH qC KW޼i eg4-*3! *`ٟL:{B]>ל%)DЄ+˩vjb 壂 a̸*XW>pAt-=j5(`($3#e|~mWKnO0eEMEr̬;A&L/f&)QWn4=JBvwnE GC~ }d+'`}!{fgΪԋ)LBkNIQ٠9wP9#/2?-MA:67] ʅG\٪q ԍ EJi!x6dz xA_^>(Zkr~ t2t__؅v(9W^2vì*m 6&CTBGÏ\#C21:Z:1R"38`֕AˢW4[\eT=0Ũ FJu%?GEf} VHC[tMM3$'˭` }6 -競vSa > =BYse.GI owdKn\4Is[r K5e%_dh5;fo|aXӨ|v44ضl5wƒKsia6RU'.4Jm#!Gs{K}᭱n|ߓJJK>@]Ѭ駧d3ss Aeh|L$Mq #[܁t".JXhB<#2BQ奄j0ڛ5ނMx;RՄ&f`!=9=JeI?ߺfQAhNTG P X" eDB+er鷭VJsP:%FD 1B @ =2ԾdgFPmKúՊ' OXZmmOCn>o¶].S[ʛ 5YmWrL5yvol,7* x4CH'ńm_JWX"'Pȏqa1P_LCjf 7}R{&ns.eIl`F2o `Ș*.{ arh_lOKK{O {\COdkeǫ =Y7g>M> &@odqV W1şkWh 1D ghIwiREGʲ~ɹ8eSbQNHbݙf'[Ԇ&}DU!e(>-<ħ%va=XŏI~|Us(xRJ*1;rHI,>C\SI7p7+ofzv_3 i1;_`Mo}uSE4ZwT1](8Wo?\C=RqR(+vug2|;IMbA Au2 {8 RSb=Ǟ8x+ *+)nzӁ.)MLڞHυoma#dI) ԝ +Lr!&á4 \g ;[U &&B7gaܩ.vMvL/j#1nDqA̽k~֯;sW VLUV;w{2QUҦmIn-o@I)+sq#j6$SS3->8?\ÚmC~r" KS`G $TĤJ%=(&f?Ĝ,Ŵq*\;} ?vwiR>s)}Ld&Ȭŏ"'ikD߬a<mk$ {B5p$MRWN xpPFo,VBZY%~JS#,f*]Hr GtDO jR5(rXԣ:v{]FX9#Qz>#|Hq[uaYEn",yo T h蔊CRch-0]FQ&~VU_M׬}0v.|Ed}%E%m*.SA)0؁ ,& );2%( 1i~ޒg4c"d@E1Bl~Сsv+> V[*'NU2uux> ]f^yKRA>exa||![>9&*Jǩ4k,w&}=c@F [6Jl,;G9F|?!< 7#mt)Q (FVU[4Cb|pݳC7/i9YJƍ0XWMhWY:DnV>5E>Ȫ'Z2Op`1])3k!rÉQ<3RWE#z,ST:n-ۙ}*`[IN|X,qò:ncX|M7Ӥ.e>78brJuLeS3EցMOҟNxT;g9[柺&H9AR$u\yF=޿B ,l!z[}Da̟e,DI A5Ơ2jhMjoS}&gM@t  +X˒Pє+# T& #ʩ^5J&JE ]-l*5'6O`tKOg|c3 nE.^%/0b^kZ61~d"ֽġ?)B,CWpOG\1I/z#h&Jx\MÄ.ZAOP-&޺㮽sGlE +~I@0~u) ZB@*u^$퉀X"zoT4:# SV܃ǧbfE![)K2KK7 Ve2퇮[aN^AAgdIDSۿGXBij۔9~ڳ7]-eƾ։Tc:ʵ'6q.*Vyo8p8N8BzѸuMF44@wr!(8{BYv䀞]ז.$zS~z,S'J&$jm;k=}ZhDۈjKSR %58zEh7Yo1 >`fn0MN Azo8~5qaC"B>bQ )rU:}.㠪`G,0Rr!ksl-rr1]UdXwGX'Kb"n^߈)_owVH~w{S qŘoh9qȽ3fseÖvǮ"k\$d?,][sw<}~$u성u^M-b,+y\"-u}LZmSlF!æ?3}mN=PZgaϚ5eU_XQV~:uo^Ye.rI3F˃:4)ۆ_5.{qA8dz{bN=Xt2s ՀoG1c5fhWkjzCOZT "5跥NA.uP _JdKoO٘jj^z7n`-!p: @ x؁1_mB+>qL,leO)&V*3G|ٮcZiPB!X$KE'Ͼ {e5gi*e.0p.)Qj>o#Q牧Wv̪:{ۮg?fqۘ". qVޑu"iR^ <@h NDO>t\$6KNkq_>W[k$}b|Fo'"fN?qQLv[Nq4蕦&* ! bW)gR"m@j`vB &[ªD|z"ֶþY1=> Ojc .Կye%LN+H)$?e=ahYL'@| HIdeFgTDvj<,4R%MFh!\Avi 3XH$`c>nu\-Ve 82fw 5\<]9UF\ i}Gx>UPDpN rs5!H BY2uP2Ҟ'OG1 rovɧy߬(Q{#Fsltir&BK0ۣ0OYv<8Rlys s)$SQVtGN6ƒ-@7&yK7=BW&Ȥa(EKmz VƑOeD FO[N)1דE[&a0QRG;AF3j:yzQS19VBeDHؿý@m24.pS~Rkw7)0}em~1J#۝pf|KI09SX"\Bl\Ȝb R0F9|~ѥvWg`Fp.T1>V rNXs e/ [cq)Q/]3%̖-ET_R2Ll!qmhLM=?pGD]C+)vcxI&Мmձgp3ʴsUϘWkF͞%DY/Wp6ţka`s=@3 _dPf^{kEC=Ԫ½C|$@Ij>'%Ɗ3[~EOYD[p1 Zh&at_Z ~/=.كӓX}ʖO(x쭜-3j.~8HY\GyOBKΑdS5|6 5b4)Db./z绉AKzPL3-{aۅf$jD (ZRR@~kT=ڟ>IHk1.~yOLFo Ymʭ6j v*07^V r(|U!fy?k/b"lEV/h/1 TnjOjd>-s]Cq_LP*;]spoͶ淰=绖@_c8jbU\h9!-QGcGe31 ._8YqLmxV W_{kgGo##5wet68:܍lzˆOGgu HU(^PC`6kptDz#MRl+znơ3ADZ h{ 4[O w;E)5e{e|0yΎo@e#܈R tm^lY]1Ktexȹ]t@-a9qRxZ9u.W.s*B$xmt;V ߴ_kMxXTYۭ?K%uhI$h.9Sv~(t\b\zLczkMAxb='-S+.5ңG¦N#R# Dtsn[v瓶% )^e*D3l2>9F.`>)$mСɧ*{B%MvTiJ5^ *g#2E}e0[1ف{术ϠخgUM~jaQERo>]%]ZK\>;ءjD8^"[sȥ ei0ѡO\uFADM'qo$+a4Pk޼~A66%]Scɢh~p=AkL - /2i-!LE*٭b5CiYG}1Q` 9[PB.XHbb:L2 M];] 3 S"pFffG[˺yAL&N=qɱ!0Sy>{O D좈IGRˏ=qQʊi~qRusW4IćFK~ g5/LUzA\mv$( -bpO!=Tܫӿ ycjkdMEީ!"4mzQpWF)Mො'sMeraMdsAG>w?!8.3}h@n 4v f .<#E2B! (HRU$ %N-=g V1R@[{|{RlLOzL56׷Kp|}@]MIbό1<3zEo˙ԭ'{pҨ9]TlP߷ 1 DzwFx?BPNJRyFYyDIT̖e~1gFFZVB74Xu7)Fw8n&4cϜ{~_ϯXZ#sp^f MS&##mpd Dَ7+Y'r]p]3RŨ,2anYq"!ݞ7.T~n ůY'B\)vi~i~$!V7IZ\q// &'[Aat\bo7kп] .&(R{{N {I0TLG[#! cpqeM Q40YG.@mzܬ7\w6=U3Jp{U}ij; fyPvW6ܣaԹ]k1+i3̫>屚4z0Ln SOKPr •_#,D0jHqYhRU>4v{vd5Z߆D,pPd&GFBfx|\u(~1@D-P?@=q+‚d2+Y|/"z:\UTӹT|N걨0]NԖUȿiS۶Z a ;5R.m|'|I\y̓}Lpak%[BKelF¹uJBdM;}teg-Sy Doaſ:B6d(-my66Ʃ.wοFI@hr#eZ37 !H0݃@+2;#']`Jδ!7d_brq nH5S0iP Jh(xOhγIA U؉ {9ȨRgĻtGY [3QAqF z$Lͦ1Y͒I;XI.U9e`Oe~Ĭy22_0Y+d5N&(:=ra(_ endstream endobj 1593 0 obj << /Length1 1677 /Length2 9513 /Length3 0 /Length 10585 /Filter /FlateDecode >> stream xڍweT-Fw; Ahqkpw!{@Gf̽xvծS>>zjU ,sqq$$t489l\'? zm0G6vzI;=Qvyg'7O_!"&2vP;#$tzGД )(G8@ ,OMmPSR_Z:9 :AaLW%@(ۂn i qӥ5wr5O)) <h)Tv$'bG)bg0؀*2lNnNc;DcGS12jwrdsw3ڂ1~O >;GlmuCblϮeqpIz2ac;x9889`ԒwMw{?O}x{CO! OGc0 '' b0[@0dqq< !''93ٸCueeȼaP7'Kpryy=OXU!_̡?xڿ|+(C #}^ӧ/o1,2581m!6q&I%J'/ OqK@m'dq;yqqi8@f'S??TbV:B~@OQ{-thO vPR`O3xO51v6;SCo9hM"~?H.KFOq} r\vA^;_)lOsn//` >ev|ZӿS! S*?3 t!sPS@*q2Wvه 7Ҥ.;j/sϊwNnZ;*zl!~.D4W׊ln5'rs̵ѡkmgfAQ1T W?PٰF"QI*$'&F(d~ qϗCR.Ew^(&7In~@aՄrwןs UL9warP<lyuT jru{7q(w*4ћdN~&=|ZL\|H"+WJ JYH*-t<.kq<c>е  HUk0Ѕ\~M5%ţӞmI`nJ5 6g.|y^rNU\<J#qSYE Ev)icc+x8*g\P1- R=-þ-?pW-k` qWÓoZd$4*H_W>Ma<+ΤQ~p'e u@Ǭ| OyiK + ׍LŮRg>чHG竤// MҪ<2km'v>7<\bMni8 VxƷ7H?ѵ,{24ܛmOUσoc͖B%òʇ3m؞$Ej"~ΫafO-]H  39wS46Lx o$Ձ6A*㙮(<@qDfkmp*.:leX+bbq ޫr@ىKJt'E10.[k%Nװvx b<ƿ_ՅxquJ) U "q!t* kު˾qz'Q\$p͊z pYR&ea-flڲ/2fu@i8`;,֠7N hK%8T&(R7m7S+\v2`JĖI&%ISw9+:g(4IIxeiidL47,NO+j| S%vw l'Lb$B\\VZU^_7q(lU K=X/Ky0 ~ғTOW^Ery rrqw9>ٖ 2,Yd<IU)Y/\ V+ػ$Lʩ~tPҊi\! ,+tTor)/x M7*$/vmi3{ ^ ڼCm mPc~Dq-HTiU^䦠]—m%`9٫`'Z&cwof"#> oUc# %Dowژ T"†#JX^ 1x"f =GU>vQ5rY˴<{GO)CynܰHu A5-=*X+{|E&~`F"-H2C5z팴1]=5 MEah' .]xX=E-Mu^ O_#TXeEgM>G*_nTEytj#scM7VpUqcMEsY \4jkq^-H>ƞEg1 I^N^_MѻtEq5C<.+bY?l Ie'FtY5J.(AF:Ӡ[\|SUk}qA(gsaWױ  "F)rfߧ^6}Ř0$EJ`ݩX8QxYFRjx _lAWRwH#fH,E4&o_%z03/tcᴷ\ ,^%60!)K kpd֧5fGljC'>B4UjB9ɘ-o9I%.ژ,dCoGaURzi q2t׫(.ln>l2TzzW~;o.":%]ԕNC@ ucK R E``n԰-%n; 9&jg=i*tfGć|$$.!ԪwAh>xqQDQ"~"]b%1LD*3Ѻ >˄([g5NfgcV?ֽ|nSVQ]ItA[940 3Aj+#ywzhW]j^<@S4lō/z!xo#Ԏ[VE!>WRف PBaI7WК5D Ob)j2ND:mT^Jڜ(٭Yh&~#⣪W{q޼lFBjY1cYvcNQ!k( ] yn\yNG /bA&-˜DAR-TY0sI: -SfnK&mNH;2Z"Wc 3ȧ-TW܋٫3l'-`md3WWsݰ ս.w#A\{ɎMZsơ떴|Kc5فN4$lmZ5M͕ ]w7/uk;t#_vPy)-v[I[W1_.ՀX]Lpb1>bu[ޖsj_P 5UvW@w'f4"$>?O|ƚSޜt2$Z&Iȋ۽v ~V$t!u u,,=>+$L瑱Xl0|S㝶pdB]0{f<96[qTkبC/=Ѽ_ރ(/=q"ֵA֟޴h5lv/aWC_FfD,|z, ȩUVH 8v%KCcS:$ĸߊs l+:"k;q '+.>ڱWQM Ĩ A1~ ƵzjSUSt+[(ʞ:D aVc< p%qc\ZDr-F}gf &Ž 1ɶ~xs!Ēé-GFd3wyQjJp^l;ZUm-*d־ A,˃!l)H~u\*?,.{>[>e(T`ӡmRݮatU$m<o7/q?yKr L4!HV4ffq;xna4w֚~lͤ,RIMx)â]wv|y݄G$P]p.{JlJ3T~YfT hKʴ"ʦ <@ּnI EIys<)o C:KJvmgS^0* -G:.duGAAґ\9jĊ"nCi'n9!F9.ħ{s~WѯKCHJaWqFrɶ~iXe.]x꩹ Qgv^j08ئֹ6iJ)a&c8\ƘQˣ{Њ)Y]jk:W$E%y7u3}vhQxna4F@) l"BYEE wᒪe?-"̏+xk i֐e.w6|`>YK!S:iAUS˚M$#\"UXz˄Tqd"WV6]t:kAΝ2m=Uwbo[#>*/Qb~oX&9[6]D_#P8QmAKB Rﮇ-2weeC,ynyO$ gj4KNn@.Sun0B:^u!J͏~M.dYt{Cj$h=I<<5/4%y>r4^ ;wC߾8-B^ @$XhZ|smʟ/$9 eh]}ze9o6FY5f?rL̇eU8fɳ:bq=_W|o#G~RMiߝ|r"n**j:vcZF[p2NfG՜>ysMo_Mhٝp%/2ů |Y;QuÔPRo t 1(gw;& f  an$#|V"Ygoqwv,Md.(F(B)DMk#^)^3 |@?T L+RZ@Q16 \v"9ɚ2w[#[m?G׏?N:3ayh o̎dOjXtz\p%G4E|Jfg@lK_P|֖i'>4NOĽ,snq͘qCb,*҈AV kcSԹҗ-E+*5+%B=CLKl S?%/=;rc~фûeo+S&*y\ ^(U'cufI&NTp:,%Ηy];s0EYS~ "aKI] GVrqe|Z~ }@|0PkL(aռդ%>eo6hg(-F'zv@2"R¸p/[+~2=͗TM¤"R,IoF x^Wr03ഷ&H(Psd$ߝ~DkC3)*}oS^i+]űLyT\`(AlOO w#v$`66ƏB-S*mȵɏN?c r ̘$|e97pw2kx/L>yǸJ\jAW'gpjD#F=/K-]G]%3\93y$ 95U!( 0 x&p6̛ŵbP t-`Y"N P*`Zet\ UPgEQBc kMLZ7:eDYb[C[ﶾOHNen!IXOI@#EV%~Kpʜct!r"U$wSNA04Kr3҅ uehx@Y֮hϔ)%t|~*dhY`͢3e7ơզ<; =?\CCXsWtp'd5m>9:>(r3OG#?HTAP)||Κq*#$TIcph{Қl"۞ɽc =ɣKő@|-sG!CQlj H:.9L]֞p t7RfacHZTgO7{#&1oڋ*nZg@;D"* 1`[l '!,Zj*}\o2# ƌrpI^Vh%6SPji25Ёc /I:L3|Vˎ>z@^]lx,!I۽f͂#02X=yY*܋p (O/hP.YK6(9!cƠݴC/knpg ?%+*ZPZuA^sA~]'r4c1_ZǨˎq'o\;^~~kQЯ찕*ȯٖ֙dT:-zD°ޝNF sUcVgС_xsاGOmk7Fwa\ԥ~D/[Pũ_SlS' v;l=cC.FgP0&%q!eQxe&A/ b>LӸMCr*[@ʑ#D?= ϨjKl24 KdL?zMV@ͿBIІ7uOo._ }YB/g6@mGt-Ex IW6 _'eabCdn-1w.997PM ci (;.m] B:}у*krցgÞwZp7 "3E/ӪwbˑKBwu)!mȔqzd":~d/P}.1bf;5ԧ1 ɿ#ܠMQn@>1>Ji8H `ANĤ2$lgnZ-䒵Q WK]oLT^(l:܆{Wr9iyW]dPɤyd,]?jz<{Bep=Xӎ'g g}_mq l.B]>xyޭ1QlFdX7bd/kЫuCЫ#X?:l4 qIMوJ ^p$dd-K[Hśr endstream endobj 1595 0 obj << /Length1 1625 /Length2 8657 /Length3 0 /Length 9697 /Filter /FlateDecode >> stream xڍ47n-fڻ% FDl]jSjMV{o]~?}Oy|}D)AX@p$'P *-|\@ /> i[Ϥut!"8BA[,yTEv>S   ED8dA(PFNL27G56_0+GX)os= 56"dFaP\Y#"...\ {'.8+hA((hWm\Lkm% ``(:nTPd??ݟֿ࿍A`0w0;(@]^ _D@߹Rmv9 `vrp  G:O6ލ.p% Uف[{ Ut+GfEBOKl+ /zBAHGgǿE<< X@`pߊpfzd)s+Ik(iUZii++><};W ؟ˡWԟB qP?'`o<χoy$lg'C.3@Tg_>VB`UBnE new/aN0W(D[Iֽ @8~}x<@nOl{qq*"^S_'+ 9:o ܮBG oMz,,$%A a7o+[nȿ /(  E o]9 ަ_6{7OΎ}ܷ= AP0,oSpV&E¹6 xf9!7b2@~GM˳C J7N:M+:ȉG DhҴ"yh4xm&"'mS1.*456}HQ|$Y8z$}>oIpZ2sshRΞYvPe>c DN,R٬{ydR 2mHGٚ'u!b. s]HĊpSbYhFϳ1œa*lXpK%;N. }XsQPZ$ȼ.bςCY3 z)*Gle+qYOۄh6Kr_=P}o\w94Q3#^\ϏJP 4KLց= 3 ۖMk]j&)u n;!`P>9b ̓H%&ZșE\ٓD23Yf'Qq:b۾%޲;+@B7W4$ē9Ś_,L1dJ=$^Y(JA&GDYX}z+$#IN0r/[W(&ǹ.ۚ r ?RZG.^+g$g/=JNs8{\Ohahҵj}`ExMJAFaK!,wOuk++>/,MR:y \g=Z ~40fF8TAAz~qubemn!YH֩昿9olo&nx}*p^ƭ3i [_Wk7u9 UY(*#x+DހX(DC,98%(Zr'fЩ4u@ٮ>Jhd vJ=?8TzIoPUא&Eb7X`z\:yU&i *톿ʯH:SHD;Z:/,PnP3Ndc==.qYOmS*gʩ%w9y69M_|dt8[t, %'4eCGE'Oz#EʦzU~ S < xb]LQ+@v}U\2tOT(aIcX.mn1nē^2' \^zTN|?b)]127¾Mw`\RC~QG U <j mp/ϡN`/)R)z JSeq>*wԆ2>7fw}˥Wte`Z2F:sbDm'1`iwi-NVaBPj<VYjeߗذ .C֥_B4tU+2|&Z(C.њmyIpiO枣1c>"IJ+rN~d `^>$Xٮ#*l}aq$'/wwl.g/fwY$Q|6AW koE>(=subNˮ=һD-"6*ёTiwJ8Z3&H{Usc:pn>ݧ[ɰlY6U`0i[[g=/w_?(B3ux +"O5Mò{/ڽǭC_< 3ݸOe./g 4-Z!wFg$!lo:p ,Q\W.)=\ vOR{=v; L55v M$4u 5Ufg:;bHxDt@bi1q!>ЄqcxօbGZW:7!lBE~Mfa|klt*%`%^rFm8߷rQ'fÁ #+ZƱHnh" H$; SR}(_ ɝ|+=qOylIY4_wy_X,׀- R{u!, +U؃ n  on>漊\y:9*,<|?MJGUDkj.& hv}DӸ*qjD :CͅQ[R3SqIf^:]O/Ԃw846ˎ]z:YMŇ2i $>rpl% t5#>-|N4e?zyaѳo4OPlM tU Ëk*j"bECJ--K Q +IA,orMZj+8B''u#rZiڋ'Ӊʊx1A 癃 fxoZ &cg 8Ndоj[V,OPTTpfI4iRTxvBàmf d1.9܉!ND]5>-HmWIt ]NO>+; h>97 \{@ *G6_6[+ ߫`9,PaN2kp+ȴpY= I\3jV"mjXRG9dҚ]y{,&QC#:E@S8Ԡ&mU,t]ZlPր;ݸb{P *|eԊZM_d{5bԪZoP@~&Rf(d9nQ|ɰ&6;fkUs4 7d#OPBΊEY/Wotq F۟#8%uVT\>Ǔ<Ԉ-ofP:Uq+)+siG+A\qS] cBW)؋QrnCӲLv wNWrB^(ͱxC>s{4nhjdl38l,V/3fOu 2[{wsY]Ius^#jS\Jv%0tޓ#!X ]s%#F 'yCt$~W &%="` *2w]enfFSB#^v6--]]QSG) kK՗Jjrdފ k$wu#HZ:?sx.Zӑz9>{%ctBsC XAl*M6u&]f!\F'pxZeR)}QRЯq\zD_:3r"D9[+9l\mXP[serWOj*d*<M' *XIn|}q\GSM"K` >qm%q, L"׵`RԷl3fV)d`t;2G4y,tU>ՊSHk#Vw+qf*ǥR/\\ί=~q{;c3{fa2ɣ^GBOEDwbOx,SXͽ~j=*vOp8@JijW\R53X Y)..gi<3&߇e7P.ɚk0m^yXEru#-:{&3hs2GP `)h xa>aԇ]bM,_xhO2LB@, BGքgv(/^3†4 ЅfH62!]1m{IM-z}_5?Mpzy8oCW ^D*wOHHq؁O 36(;kTdػ?օ쒁h̹0R6JS 7Vw5 <۪y#Ёe>a߳!ۡ&EE+pw;5̷v+5֕]aq}pf ьh.lP:9!'pZsz:[BM;QgDH‰oŇ墠9\ɶÚ'6j9 &V&yh~Q6>2y0rz [YFJ(pH`dCg/ <=݇Fϣ;߂]<>|% ԑEx1x1RgV c? f=7alIRHHaE {DV 'D-Y lqxSPsDp)p|C6on{xSlc-g$ o_7)=j6~cB^8njtk})vQ_nmKmvsԸ7 UQ-1,xc|zi(' g!n;9h(GMJ̖}̐;xMigʣ,9fB +d|.Np? w2<_ӕ;NEb&U>$yxN (5"~"' B{}w C,{n2V+Zdrl+|(;샛(;&dJf` Lrs(r_/;NO/3ha0`7*(ˮqV{~Sj$ͪwɗ8tDz Hj#&m Lhvȇs LfRֻyO /E͈iO& >R6SMWeӞB)p*o Dc_;ڪtm]G`͌\=`{-;EPImzi2ӻu7pNMWrI.o?k%#Iǀe}%O_@ߊk|Sc˹ųk)ss35P \ DfvL>:4UܞqClyi&m5JC O%$YɋH+1PP9oh:2kXẂuCxd?tk,5yہPm|#ow%M4M7;4ƚ.?S\~ag>:NJ=ta$؄u3 !m#v=xب&Nz!;`(TS\ZG^ ھ7m{kGśIQX+Gc(x~̳uU<}"醳[RQ{O{_/yDj$˾w@DOQf_)-mD!"e7axvot`1Y.Z3iΊ#TU(/QbSWUgb,*,S6F u$uc^?|QN3Bk@4pJjmwb1}ĝu>ԔţöcE4uUBӮ\n T9{+:3z~?^!ϡ^L6-?gp*mzg*TvU"TW.[@gMhP.Æ2`jɐr7/?'OJK0Pdh3N=$(C]idK3%9Pq çN %L{t:)Ludm+^T'rFGϩk2:&g0=[#e1UBom)(/I8O0^1Εx 77-)%门CeFY=,,xN|UcM1`ˉ@K#9R 7뫵URS~ġ/%[d\u#æm}f(I9^ DŽEܓE\>S+"]NOt)}ӄ+m(EUqI#o+y/_~Rz3Hr7FiݱBj^\'#tWMP"fId &ymMhzgOTk)O9ty wqv@.Uyً~kV/s*6+j:>'+hxx$'?׿%'o:?3mpWG߃$h~QxBjoy=sxaZj sMwZQ 7m"+a#j~ INedp"Q2=KĀA,z4?ÿtn"`<{XÑ9DPuiYĎ:Y0!! c}:gPէ@r.56tg#h 2Nl)/Ћ|aM m M=fMܜ䇻-gKe`%THqɟ-᛫gw)~ endstream endobj 1597 0 obj << /Length1 1651 /Length2 8661 /Length3 0 /Length 9737 /Filter /FlateDecode >> stream xڍTo7tH# RFmn[$A nAB iTysuYaU;O$ P@ !~Hr-'d7 PX(! `Z F u`MW@@TR@L@e'ЄCJ0BiA@0 hvvB@? C8r('! AxB[ O0v"TP^`B H=@gih?45?3@PW@OU]0? uۢ ( PU0HàǬnssS" v:\wn {8 ZDńEwc8o1?8 p@ :@?~H'Bx@S߈P@`Cl!Pw?1Poc~?Oh]}5㈁&<RQ   aq!3CUDpw~z|w58.Ѕ p' Ky p#(WoE94nPW,Є@C^55:{j5P`(;' SEB!Pӟd49\}A{@C rAO^DCЫu鸞(@}є@#zy!pw.tA E"QP$F 1ۿ4C N|5]5fգ { G f_]ǿP? :Fh@gqA ;Ts]xyƘ4aƹ X>j@ez5(7gNLu_@ʹKWy#zS>f-Gf3wS̐`4KWd|g#&w0b'X%ŋTUL3]4GAt!vxCaWİ'1/thIw^&{U ^ g "WfPƫ6]xE+n@2WyO,bN6{* DAf|^3VlҴ/޻TE3*Bgnob嗇 ᜼:27{ mkUxsv^ .rFL >pj7-Yo 6'"fT [ ߼:T{Z@RUP.6^mԿ{R{ VP&Yw;F~/ў&|o+dqYV.rn0+kjU0)zHIӶCCsB^ڜ3@,STe@7D*WM8y} dsUjX{Dܶ?`AE%7h"%|7?'jaXX<+/c{~0bjEQ~*$P8Ъb:>5Rn{ӚX׻_ư "nʖw#>EpJ\L1pIp]p#!Ifai ?[;S ,QNk΃T}ppbnz*|t+sgɊG]k/F:B!^XOb5D $Xo@֦5coGEGb@?]o\dw[$ b{{RtPe?ȶbluQ60EIl;Ҟ WN _d//:+pg8NFp| 1 6aWn}:Sls>#|+EM#v?*|Al#Zi~h,)\Q-rrdE/!|l8~qwggV\8S?XUcߏƶmiHYkj5Y s~v3|EyV&9a K7\}k©@/7 F8rraDG3 >kwZQo MSmtӖOrS_=7x>ҊYl7>OZ ߤ!2=[tKb Wq69 3M3վ1 )í}3js >r}66PL9kNtUH'Z>2 ǥV"*!l7#vKXxbwL$QDG 懔Q5i-{aBʕ*z5y8 y KCoWC:3H> [cۯ]"]:S;e Ff~3{4pTfS%I-PjQ_,ɨ.[ٚ]>2exY6ߏFU1_ 6y^uE:|N[ n鉚S0xQV3a+!Y 'kGJ8o=ZNo12/F7EKCRUur] uvT7g,>/@:PtdZµpow{"=V@akmX\<>nwYTڥu/Q.KYr^(-|KzS2ݠ?n،V;52J_%5,]l~œJLiG֪TQDވ9>k͸xG/Iz(#vch-Y4r AzF ! 4/ Nj\\JI`5nJf|&'UJNAŮL]}V*qO$\ UBO{6F2Zr*Z~\cayM}S@\t45AGMvt3J-t>n}n }L# n 3S?I䅽92]Ym\l㩏Ӫ71_g4/q_q>.(7әe 53Ǹ7wnc2Z.UB/_3p$Z(^$(x*$<0T&3!qou[YGg>f3!t^WCWcM~`M8LNsK}I)6]\{$_1v9kGc4X\<0(9k`kZ8&溁'ͫ撞W 2xz^ȵRڴ bH`2%37s*m|}A0z ,2}T_p_iˁ>({ 1*~-m[Lꚗ&kPfz6 ߅ټxvnB[P1(Fe}g }Jᚵ~Uk(NPQOI3$cYQl|L^6Ч'F/ :bo,-qOڲO\⛃3dcE2 {|>Yw,вi4;ՈZVRNz@:'0V'6{ύ;|c{Â"N[m"=6g3\6?޼00jw&"BVo:l)3C,q6#b'Dޙ {>w7ߞyIO͗E#RtU%}>B$煠}eއSD^5u^3'lr^!`&G!9rWEZ % Vrw-J;~L/©4a.|$T>_EM)_.|;l_0_rߵl[qLQ[˯3q{,Rdnu1dPlZzyGx|Q24 h%w]sr<2呎]sSy-WSwN*g <;VqmU>rz/={-2\3@5iO<5jȸ_̾v"''s!RNkcX1>47ӟHlCU b 5y C٘¬6YܻLVN* NXgn}ى*{QRz HS r9 *dƨb|Ϸ<%-Nj[Fx $nE*_YjP⎾j=<qkFPZ#'܍}/K?Z *(hqu[eGdQ9n-UUd<02~H7/֞M+ףq7sj3NsʵXPa.I--"|D'{4ߨvh+OnUV°.-n=\x ҹqjDKwo9"\[su)͸pUq <=95g9ob17?N<1>+^23Ѱ}ھ퇅`vA4>_s R;{m H"R{gN \Z.|#a{fɌaҴRHr 2a{䢍Gu}ɏhP_jc],9 MoM"ZhVwyRz0 epX9Soz>I߶={C1{5}WQ%OX,s ^#$nQz6`}k)z80]Nq\}]L?DWtyԏi!Wo$&Jv{S Ao="CŦ uv|v blz נ$Sy' R^cyvTӞ4QM{ȫ6+o`Ex1Mux>s3@q256Ba~UsxRd;wV1g BVof/j/Izd)InZ}ΐ]NlGokjU|"sBNaw~%T0:G(0SȜ>%X0:k"54YŧoՐ}38Y9!xB H'lA]34Qv@س4 /K4)8,b$l oRܟRL!qsPb2.P3L\NQsӆOX^-ۈ\fXeXf6c3͙+Ɔ;I\30D3e?[YƺǶ/xޒ'j 'ct{?^ bN;fŶz8#Pن+4J,e}Z@ne*9lO]T#{?Z K]l # endstream endobj 1599 0 obj << /Length1 1497 /Length2 7268 /Length3 0 /Length 8270 /Filter /FlateDecode >> stream xڍT[6L( 2t% ҝ03"))% H# 4(RRߨ}kzf_w}73 !<|y ?.3>ˌlqsa wHӀN(,w(<6 *qeAm^t3  =#Ѓ`G \yyx@QQ~*2#]H-n;(AaTG!0nPo)R{@߯VHyaN>/ ~@7D smA:?U`p/Y52B2y~W@JNNl7WRXhP#ȟQր@=׫!Cf87POhC`?B=06Af9u`G9!!s(p_/$ |p@"!96zd ` wf R__P " Dnb^N psCR-4$qg`*Yj/qĨ c~| DJ^V;^Cś/'~tu>gtJgPifP=/rCѦ~]33֚$/b%6͎Uřd4b{fA S UT j^ .vEzm2!%i+ r񯳋ʏCG#ds54ZE,_4icf6w:ͫ>1¿Wv\hG}kg]+sV-l 2p^Ǜ(7|+.z>5W-V|"UswEHr t7%0VaG@H%%{-dS U]?+e,B/xTr;2qJ'J`6N怟O0ДlAr hjgx6\. )$YzpB/5/ 8ރ횹mlAy#b8F OO*EYuHXn7'oJ )F|Iϛ]^9~83CrMIQ 3 9KH.k.؁FuCK we5io'uڶ_^Lyտ~KiŞS&V~񝘎'했i`#s\$`T&X:J冗eR,#g m-cI?Ջ.LƆwt+@,s OT\˜ֻ{woNg*r 92-*ۛ_DhLTyƒZz7hx7LZaΊZ!k #J>p0k#{rsګT̫^uHnV-NۇFt~&n;.Jz+mNU Y J3ѐSt˓Z|B4^ XNu1[({{Vxpڱ bK])~n<I(][,[IrNq(KѶ"~[U9y,]}!dɆ}=[:QbM =ۯqDS;6C^4'F=[h jFzCA&|ےj}{,j(0ᛪ6 tzMF=SQD hԌFZO(vaDOV_9-7%|#.hub%40<`RR3N|ry$ UaF&16XBlTt޴}g;- U$B$?TОZ Q} JMEО/ G uڌ){Q/{V`P|5Hqcx֜qmFdkx=U,5*ԄJc/T; #'^p@ s&k.x:1 e܏HS^ 3F @LpGF7"x}(mqw.P]-6jQ7f[btmOmKgwoN:z]xTDUo0?3=DLA4wG&3z݇W:e_ /՚#%W a!iWF hFm)ee% MBgznhYs:`7Y[w} l͟IcҸ;a׉ч\Ix|L]UUܴg5YWH{z׳Q7 R짶s8g8ܼNMiI+,/WthOλUROa~u~piWZ@IAQخFqƸQzy:c)NĢsUHtm)cI={$U y4YKBg-3ZN*+`3/JP%SKRe!>{v-#S檏S[>\_.N0?vw}Ž eqB<"joCQS%C4պ2D+iAcD<5@b`lRZjB-}'u ǥu$o(#;hqk^0DR,$$:=.6tm p}cxOے7ahWz#y?=_B&P9>=`-̦{oc=^b`*% .1L۞y$>|oO䍮ta p*ι[@1j)Ƶ~]HI"@GT~w:)?w|>"8͒$~ +xf%ÎY\*5}dJH8 *+[J/}%Eˠ= 1 䊝EVKC2aѹK5reLH]-hP!c9ncFnv'Mxf0Bp/U}5.<-;Cj ҍ3gCx^m_ź0$ڋZ&).52-9:.qF6m{V+_K^0]')j7ٖI/ۤ C~~h'v})3Do5,%x5 &"z{#49ytF];Ifqk2N?Yz^Q0y.#,Rj B '4*70'%.Cc [odc'̟^$4~܃}K :쵘se¦$hi4MKI~sBlmJσhA֓yts1GȦJe Ƈ/<ƀJ`H=x^Oc{R1N^}*O≤GN$;bdIr/4ڍL/T )[w݋M?hV.OBVyy Qf:l. ]= ⻡d$>|xvnK̹mk_S-5DhPP X*h7^e ۯ_tG^S8z@Lz#<ƕv29[ߊu'5 t:c@֢M..[w99i ȡzzW2b3fHNDSU#f_KQ=9RO;p0wY9*gxo}6M-H2?P\,u-yJJf=o2AUǫ㝷E/3* }gg>բ$ks;6dI|}?p…Eh2}=Mf쪛p(/?6.4J1&kۼoUWO#&S Ф$Iׯ08cr&(75%uuMHw$nN; u wM,.c2!ny$a>vzyТ<{!ihe44g[.>IM$Ū\ >kK=5a^l&N!ؙgYl^=Vh9~؟1xBHzi@M[Ayz O8ؕ|u+q O)< HQ}SV`ՊAQwA3M *u8ui'/ !ju3Wž /0\r(0_ʳ.75|m(vrz>K=*c.7χE"ߙ2; IK\6~0&hu#tDFC=n[7<1?v99ȡˉn%6 p3UF^&/$ʃr>kb>S>f];FybX_y32pح/r6$rZcarqfO]=ȟeYz|X"vRtڧ%:=|o#xH&w~^-F"xZz4Lzpl6\Ѽv&/&E%SE(=V?%L(Ok~NNMQg)m^ R)lJ!Le+ {ț3^LUp t.RVtxjl8rPg ɾI~I`/\^(T؎a/.j5Up:  }1[kD齤Ԓ c~ \ GayZ쐶=RB]n] qvL03ܟD֒ybd3"SC׻_Iw4k{qLX$D^M'su[uYrkqe>1ǧь0Ҫ$gV9Hë^ÜG_1l6nm3e < ;"#d.ܱl$f.!'Ov0ۍk<5@75&/R?T<Wt="9j) SP9iq@z=EI ْh#HncQ" 1ٝA UL$~yvX[/Ͱ =Mf$laC== WE\U' (g89S%4ly;p̌=r8|4+PkE^eBʓ4nb|Z';e\)9ӺҺoSsQ %ϗm{}qG2t!(ysmeT>Bl6HSTovslp:pWk95)vBGZa endstream endobj 1601 0 obj << /Length1 2842 /Length2 24575 /Length3 0 /Length 26151 /Filter /FlateDecode >> stream xڌPi n݃`]!@pwwM C%UT1w:)Pޕ `e`feeGҰv#F:X;a 4q$L\Av97[?Cg>9@ `tAwprr#֌qhjE43;Y]VՑÃ΅RajP݁_ Lgƌ@аv[`a f@{ 7{s3.Pvm#ؘu_:lbf`hbemo ]=]& Ml]@MMmMLA17HL@ Y~UY\h3 Tv/;`amon+ s7GM{k'7?& o%:fV,kx9R2qtpXZ[A_>.&@O` G$ZAw豂f hm~_e]EeEm3W'& ad0s~ n-Kbb?<[8xTX2tFPr2@{YX@?/_G//o IK64nPt-5ʊ@sk7u5evXY=CȽ=Pjс_* hRsqLM@!.hĆ6tJ`\_7E7Fo,/E_ `,ҿ;E7FE7qQ@\#E_E7qQ@\~#E7q@\~#o/q@LE .&.Ivy77u61{]X^f".33[h7_3bl @;s?d >Sˏh%l ,>A73c%뗹@@8AݵraԻw@PiL Tw?Rg.Q{2+Ew38)_%qp] N G3Ô/sjhGLwS!7_쿅[0pp$o_4G_c_3G@eM thget\ '. JbftZ9P+\=8 A{AEMwfnΠuSV_c@' aa?sp](ΘՎv*ςs l]MfhP$OEgzذOFqj;8 D1ivzS* J>GnyħL4JLfa\1=QLa䌿1 (]g^`w§#12I#,;SZm޳Y41e y=Z-Ҿ}dm;7 LC s;ș\(ӵxBlF&hǗW4ՑSc7Дn_~a"K6zI+% rQ.m,{қ'h BVV7н#D\/}Ε:֧l=0 ^^M;S 8$3Ci2$?Ш6LW0Ky*or_ PqJUEz0jUirmG27 ޘoTTb8hݟWy Eoh}PrQN(ݚ78s'kA|*~`,)ZP?{`0/Qԋ_/g?v;Z0Lh%H F1Bu| u޹[d'(}lK8\Qiqds[WkQ/MDu߀kǃ#PbXBc22U"لlM,Ҙ&jϫX?B*t)$5'vr~xJTGo[P&fM"(e_o}#yg %0C59&B SC2,}eBEzﳸk9uL,wEDD̬ aU$K0ԜWbDžz8UDIcY$le^Z3WWsתjk3xpFr:xp_ ɀ-"s57:˻pȿwPD4œJF_{!kGVȭ3l5q&Qf;c MEBe87!ݯiW=%öGN5%-F仧E >dϘwZrӄS*i]%y]jHoV8:յjn O{0c"A7(c[[l.7̚7(Qm(7 6O51 >+#U8ZZymS(֌moT̒X K?Ki>uhDZVwg-Bִ_><]ބS vPUT2Rw1|wba [UW7Ko~^Q_$(K)`B :oIao&#p) s2Z-*7am>^Ý\=NuW>k<;zi6A8›>oQp/K\W6Q,$Gqf=yvSD3kYϊHb b?yv?~'>Φ4 d~6Qrst?-(m#)7+7ӭ+!sCT5k.賃lR)kO Z^?' (RJ/CnKx?Rb7W=Pܖx6)_ ;_u8` @ 8tQ οQdRx_F!8/i3ҥWA:Y\8D j} [5aLAos=eyl;$Gۭ '0p*cE{>ĢA"0AH+!eވg=VB++`jKa{G%&Jї/[k\|7Tܘ(Si|Qj物cPK=s.xُym'B* SyFה?z:A *2*JU٥WJGk5fTC3dU4{#$H9<D8d{'}֖ e+-j7(A S\ӏ o6qu.^?:("G\pp-T%I pHuQK\wi~$B&j]y퓦og^u) &`{N!=4,ܴNT<վYdM1cˆ: -j eDO5T\i'O˄ #]63O lW '2D?~em.3N17qHB&,m;s9aGhqb&o]Jm?ur bz%0br[;øqQ8K LD]:Y- n3 K*HKʤJ˫mb+ی:9t\e/Zr-rd= EIiҷښϾO7 M:} lFd:"e^FIF})䞇9`ruFJ8+M X{mHB^|Ie?V[mzEg% {%c-4v~N $H֤ 9"[)4j-AD]ёc6[L Z6yK^x4LRn{X%|Uۄ$t*M~mAR()2k}oEE-9ѪRolo?pN=T1)r~}7EnSlGc{YuxT"ac58ہB&|vt[Td@/ 6A˛WN=2sN @ϙ'W~HE<N'@@"w?TH"˸Ms?Odr {R4Er\ۘ,Q5 )f;k{6ô mt7fCr9tMH1*Q`ZE)v^L^Ov kK)"ª^akZמ hhhYbAg=Db̈$=!~]sI 3}sCˋq Qg H4o‚EP5gѸeIӂo!fyeY}q}84] mKeZ@,TY+ YAW}nio܆f; i(Y$AR'fDn@}HoAL:fDE][I(Y:"{ ~ܬ'L/8$UD8fNjxOavذM~s~~sa'}Y2\**pqI،jDuYL7. lپ/m+ۆep0K)Q0wtQ [!XJdU:EEԸ),L6pnoﶗ#Ls+E;*բ4A}8}_&~HOȨt֐lk1}T3HCfpN%ڼ ieAu0r\`bqǼc29aT/ N @j^IĭCᳶ2w9*}QCj=yeF~*ِV]u&nd&<һ11 )VR?{DIr4(Rm]wV^2;#ی#(Vz8_ss޿\]ׂ>Rp2ERToԄoϊ}2:͔kM'N$9??mAZI&i*d2URyI #:՘ ~=۞j0KrA61@$*m EW|=cgV.4@~%S'fC^ IY# nsX&}ɓ%hq1ef7 KRu0Gƛinms6Eзpsصs:XޓA\YVpQc^)%?p*pEv1Irhv\kɋR̥{hj1th8lcZ?qDpa·}f+ 5QKºd`WOs%;yBXCߠѱc0"I]({lp W:"9)\` Sw1ahҒi3oVa=v=5 54d]M~&|hZzp_wX!(BAw^ͱ" W0.j k"icPPC|J%CA(MZ?>%Xljְ+;%E@}]xL);i`_6J1$TpT!$2fGf? ڃUڽͅ KHVW̫P4ǀ8@xǴӖSa.dX}0`5_.q$I:I)/*ұK5_r=J-BPL {8h30VQX q2 b o[br?Fc-I W u:l]"|#=ǓR䚡QcRS8nuHQm-6CNhGS*ztGAJIH9=.ᒐ!a| :EȦ)OrqiAJ4X;{0"D~8,q>_W]\<2 >k.JPYnbyIz|GnP &^8;| *Xnp +Aԁ.c/C7oB [)V,bZ 4opP *Ò1'xvR1AN 7[$rOq1B9{O4itɪ|ԍL?n>ɔOz%~R}9V.I쿏Ե?ࣟ2]8§vn]JT(+PMvzul縠#0?dlb`s-E޳˂Ik7R\]jQe::s*N,.LW};oTv)qbu&exhF뽫r_∤7^z0,p=#F/&u/JUPa sVGWʶ]U, xCh益wYTLbW2QX74iCۃvݠe,v>O1Sa;ğyݞIL?0jTa|AåQ l_uMx\7A'݊)V[!q.j<*m{BH؛v/G-:hf{s;Ét'g4z6_",˛^kZŵbv4K^jYa|;9Ҷ ylX^6oNX]238K|@lՀvTa;VU{YsۥP]I\yxjKEMou<T?C}(sN#2T +@D~r*gxrw[w= dOx"x+ \YAޕCe>'TtNg:#Ae{a(o-C_16n}J?S]  W@r5H: OI UX%#-mKu'_k#H CZ3xU.qxLXx47wAK*%7U*?[Ut.P2]"6}gRh(^Jb&,HujWU\u +:ym d'Z-?D_ BЗ8TikFk(]7"dքZ;DYTiH\|k 'H" l8~5 'g;G$`@2'[WiwJ)%]mc0 {,$q48 ~KCJxr%l&zTp̣9լoUžziCY[^*5:dDYÈ_G 6kQc^L~rM95nS%Q߉*Ã5AIbBlT&nLID!/-ޘV 䙵7)^`73c bqH{ٯw? 1[G+^KoZJ~z]sB9l|R_/kU|Ie|kf|"{y.A^@rHD4sBU7Z%LH%F&B.q'yx7Mӎo'rR-ⱤH0PEz"êcQEBL ?̡&f۰n,Qr(X'&d',ԻҮBo$Qd? ˤ\զo|h'Z.ᬌBٗ*FA9GvՔOA ] zr|2})Y噚%}?:R@yQk:q ;zZ?yʣK[F,Nė|sHjM}sDC< '=/lgQ% PQrĨ+a6^Oo&ʈ6ute;1cJrft]2!y=J~ ś\޵Xevb4pZ5aQf O=N&BNQJgM265_ysރa"@N^FGib/4|S˟uch4TTPrZ9NՋ$'pwoQ1'A\T/HjGN,<<-%:Lw`Hǫ%οvEniBPvuR?X9n,3赩٠lf،; D^! H tˣlآjQ6='U ފ%6E#MmvV?~tj}>$m /sJq9dŕId;ȗ] ~ݟ}v+8XROJXN!#Ԉ)zCW` lJG4y0ufh;ŹEGa[ŖMͮYccFS_q}~Tv?]Eh J"}G1yTUi\q-G'hPd(f]ϸ#B<>$Rҝ"#^vU35>B|Xp}8y/b&MCX|qfqObk,  x@%G Ijr0FYI ~[̍XÏ&V5y;_r{~ԻA,'C傖rv_ڢ^*7…ԉ!.>K%DȌO M"i&flHZEgq{z&I«Hnڃ/_ qTq rp[zE]j kU($8 <ضDM9ve҈>ۡ'yP#s][ uFz R;7_? jh.$"iTd`JgrE'IO@`a5Uw4̉rԆZ벜F!~rjz7R[+Ŧ]2!_ǽJwg u?M-LbnA9׃j!',|Q/פ;b1"=Ԋ\ >|r؍a:v=pbR|˷%a-ߧ%g&B7M)B=,ѽ4(H\:KYacfid<ӧ|Wά]x Lh0Đ<&C<ʋi[zK-vSpn*^B}\SDi{]v|rh_v|ar1<Tk'&)$3sLƕdзzڌTiFׯS!JlkV۲Ze&C;\eWJ0 SYٶm{eQHO6:u1%x(_ҕNoO}"Bcl 7GN6r6B 8J9U˔!naX+;ETöҟ_qKM2F (1z#<ҽ!  *E5G Y*6?У(^SXH}/t,\d'i dw]AMK55 [1~?mͱ=u ETUD{;o„aG7ζU :)'R%909٨yeN| k*?b%Nj=i"` ֘. bҏ(K]ze~L"%xg.,LĬ4$827l#{c?Qĉ0Xa'=kѾQP{_Y?_֡iE6SAQ:*r$Y'q~t&^7{dZqk*-[}-V 'oG'9 Է^uPd13*-ʙX_rvKݤ/'_?84\tl{.6~ O%wZZai,]rE\5|G Ca[8BI\b ش[aQwSX(^ze.6cd?z׊G(]LET P,NMPNdX%ݜm4ɼjļc73O~Y2JDc+A;j.hUu?ĎOy)а`PzaBČ EeKUK2ہDj(2|$ flF}.?뵄ZGWa/b>WE i{`_ \7:Ӫy\K( -5JtKD jdKٮbОEhB{%.QSRk>o@1MBX|ӾlX,P~쭇*" d2]*>w_,aT6yڣ$۷FJߍBzdb%Q!Rh%W1ח2cE/l ]D󹸆uE 8xgOz,벒bL[WEB;D%lZRdfZWU\FL~)?Laex˲w9Ojp[Ъ#p a)!2VM?ΊvgC>A 2UiHIr<{t|-6C?q#i$]2[p;´heY7 re #+Ye?6v{&TO|:ԝkRG"[gcCbLIϹfda]|j6DDz=0wulcQ30i$(b;{l,7,ь\BA籂s+R( f_qFc-&SwE ~WV@UDӲ)M4sT!tQ<\ ,IxĽ894+QtR@,%H3V-b@KD6{ Z[ExýNr SlUP]1OGۉI] ;# /Jo~4A`qЁf;_ Ze_sm*lFbB/ rOOf0vl;cmntHHi :Xy1UIU 1Ї"^F/l })__)4y M%c:I:M_a3ΆMmOxc BG8h2}ZD˩c)*-{%XUA![uǡZA4H^Xhg:(FriQɈGKp.Ps"V1Ia$7WEKU=z.L+Ij54^ʏDHFLs'?dr1Kˆ82sԠ`4ܤرO۩ hzS":g3h\Ⲓ e P?S?ű) ?B6Ew]HUi>Y}@VL^a K뢸B3|νB[ yMYޤYpz8`g?3ːfӫTxSߝwjBɊ^-/ػ/%ˎ-:1*GYApv֣T_k+$3yήuoRc6X"ٓ|V~VGlx|eoQKME֌lyZ ~mR76stg OAk:~N \HIQ79{~= f+2%yL3NGlM k3N~Ʈܢ",|vǽ>Bm/֛x*˺F)(W*ql"@'7)Lⳗ1ǪnϾMxBbyDg3~s#'D8(4*H(R=@H 甾8#K]-ebK#a6 2$(, z5Osewbq[.A*|@5V eD Jw"l sGTHʑڧay Z9J~A05d<ɿS(/kcYA^kݪ͇|~\ׄl^QSL=L "+r0+Z:*q*&V>΍_H>ߔ11|wc La~ 抂}M#3Ng^psߑG&s @y#yAo}kL@-Ѡ|kR|KeM‘\ٯ֥fuՀI""FAw!y%tlx׺kHåRy(}z*8:K2db-.[HIO8qJ~.cX)V qiʡ+Ab:݄.sgġ\DŽLs-M^ʬ+AUm򾸽IO{ "4({-]ʏX·-.Rr@@Ƴx.9>m 0 \Wk9\c {LMT{G{b!FJt;y<l\򺡘y~} :Bi~Wgo4W4KɻPaۉ1,1V-1A6OCi-dՕH^GZu oޛ̔dzsPH-5r1la[ TQ ZqA~$VvTSE$jݔG.Ⴆy_Q ~:07W!. ɼ뛾$4u@ G;(B:E;QLd/<@BF65 ۱.@ˀ_9K*>Dc2 'WzyepM2T9E2bV&IeUGߝ$J Pt%!)BJhC@{O_KqNbOŬd#sx2d1D"V#IuCeCOX\"eeԋ:΄A;QpPܘҢPVMVc YtU#KK =y54)4K:nW&ieK!+踧zO) M]N[|V%G@h9p&nK E3Et*Ȍ`v ęGxٍY! IT |xoc,Ao,^LF/n @%LD ߊ" bqwA4m0.b\J,lҐ/hW\MS~\{' |z T/ȜeΟ&F&2;/)LD6)Kv&{8yP[ǙMSiEհ"Vb?{0Tc-qF},R%)gLgq[pn{賸5½6}9?7|nC\8]v7OTDW`ˡۘW۲.8COY?;5y4-_]Fe hTYjU&Id+pyk㚚{#kAuY=z ec\.]׵I^zo*FDP̿8T/|1{: @ 9:iS;%~V7$+eaoIN I!ʇClJ.^vEbJ8*lg)\[W ,T (/'LcyHv!C߳ު|PEwHhnn7eD"5.;=+Q2v>hU`련Y"!I 8EeW@~ז@䠹b}oM츰4( &N٥%ء_)ȏs %"Zrr#]}BVj)tTJ$] RPEg4xnyѻ}hfdBsvT| xZ^(E򽲚0,Q+h]~U{r-MĄd`($s“Tp0>'m.ӣIϚtEsJIcmS,tfHöc*{+H[ǏŸar7?rzJ6 ~CLnwh3HdAdU<]v׻•Rr[ %N\ռ]i~w۔-2RC, j)xXRmyqqV2eOZ; RZ+|@ӣ\S++нL HD8uE #.dng z7]z;VU8dI2\< TWғ"GT#B4g6$Vf!\%#oRzV\e:K)tW@=%_210?x0>lzك B<~~I?7ry8D/Uwgg,{١zN 95:vWwMpﬓML08K =4[Ni)>psTic 1j=R<ųj9nb܉[ Z8.+!I ĻO7=pYv~KCfh-G2.mwcY_okҖ/tшtSŒgD1{1AM%Q7A/#^,PhQ=dԶ岰qi6s˱SK fk&s;ʫڮ]]IMW//NӣȫME}7&4X@nE)wn V@X)Kf E,r(i 'P`N˝miߦS,cu ]^l[陂O2f1oGuV($F-fŷe=- Ot~;}3FR4OD f3@;+c}kW'zHpD87DPy'y1#oRQV1SEz 8 7ǖ88:ge2c2L6^zS4_VBAJږL3^%JUJ|h{/0!1`c]d0yk6]XHoFX/l:Bn}HΙCg̰k;Dk|MPs\ jЀéH׳@ @m]<-C2Zѩ pq 563<0A' qJ"' #B2* AiԳӪE~LEEX}Z >/o_Rl+trֆQnx2l&0L|=0(`2 72;8!p忼`ȗ LB^$0e^81}1{A/||%J&ݥXMu25s+6vOٚGxqd饑~-&{vw}ekϟ &F*\, + ϡsg EH" \$X+L60`Z6v&"FQ0XL\-y(`ߚ"NS6XD](V˔1TF0V,7AҫC0Vޠi,kħV)5BH OaKnD/S9;ws"vMl XwA]+ >pz zBG뱮r8΂ViXjEX&.g鮈;.H,FiDMkoIhs=IgﱉĉkdF@:&EH?{IOS0͋0$X(I:MK\{Sߝ/2R7JqzVvt97C R(BUWYk$D,0xkϿM&)dx}!ATu6! GHPEst)!R߹nl*&"| ^wO&8aS{Sih5$iGp('`}4s`Dˍ"S.~ZMLKS7cpma])k1)Tck+T%J5j"F>%A%; 4qr$TC{ ,4y @#@^ eWL[VC5Fr!#!Kv} Q+|;!I]i,thŠ?Y0p秈#ʔPGZfuB[06d0aR=@m#=|̣KoGxܸ"?K =FK;GczX Ols.y}H@'A靻؋ e>n!*M2֦ q37 (]#MlhCY{U\m10`[ޖH7|\ PaМE]8n\@}+C5WCˆ5 *3{ !Aӗ[Lރ)}RP…r lj(!Im-JkN|+ P,f2gh粘h΍Ͷ6 tKCZ)IGڅyݮL}7ӜΕ۪&!RL^+R5k:r' ;{":7ch1FI6w=T,ʊ^tm>ǾQbés-M B`* ]u]۽;.YݱP4 L+Jf7p;MF7x[Y5/?ǵ&VZKS  S ďH sاp"\s6&Hz .RkrI}7d\~xٚerF4ɞx*hZj3#* qݧODd>Ԙ܃C[&_Oi/|(P7sODrӾ'Y4rͤ'zùy@r\H+Ґ"6w)tKKZ1Z͒.AFRAmדߦk⍧QPM,o9%uh M{˳)zG\bn 38̼MB a5U[RIJ$~ámx_]L7zKiHYPS: TQh_/iZ>\?+3vLJ9[H9S.N9YX0%K0aw]FE #UQߠN7 cP;Dua`D(>W%q:|~濸#w(3X?@e%(a,/vKg By رbkB+,C2͘9PJ11d`B%Q x, cp:M~Or$;) ~;ԫ5Ε}tY>(79=1u|㹳~9l0{ nG pǞB^j>OHo{8Qs})n |k]h3ԜΪsWZ"T?eб"].`AZ~_uǨY/sJKtꑙ[OM:d'.ltcryM0Jp$tQmlZ8V:6p|1Om"m9됄ḙqRW^T4*^*⚏pZfYU7 ,N"pr܏ Nm1 OXEdr`Ϙt}x5nw6xhM-8h~q%o%T ;pr j#Ȳ)1_S`/uc`I78Pˁ~2%DB-\ZE5X/@ {фC4 _|@Eլ/ "q\u7;if" hGn= @s'/ GW5Neҍ/cm׉i&!J+\P,gnuo8<,i>b\e@xd{T_A80=M73>^C|7&E%rJ g43P^2F|0/Z:Y|[:\ov7_zm9!C\y7Vtdʓw+J˅;>#^@ Ȉ&2+9 G:` b (`B`P-T &lo{᧧ěEo)S,Qß(~>IܼΞ nIkl^OORLsɐc!A',&GhВ_y«|]hqSn3'.̰ВB1q[B^Uɶ/jVFvwkܟ1HG syI<&}N,޽Ww%Fg6w]kh?.%. x}YPu#OIg"HD)q5 qAPl1pS k;H,tT(7v5ԇ.&RQT&iV?ja4@Ư2ݷ>ΖQA|a'm+Xo 30ȫe:gHM,'V~ҹ .n/EnbZ+m9-]]ڤb8%c|'ݜC_¾4+%P Dp2Cepxnxt{zCI? yL"t830=85h)~_4lmA بE.N*`;*IAYa#ȃdjBe){ "jbMO w]SVijV#OF,ƑE,\ޛmUlWLm\ͮlYy|8^z#nV m#cɵzGrM,!HwĬhֿOw9(J֑H?g 1Z8BQ#jJ56tICn^-`6v,?T2TEz*ˊ#9uҾ[txõ[o&O\ !ĹcEcfB0}P_tvG6cpaRb>iNm*bҬUP>C5(\(@Lߪz/xxC-i˭۽|Vh`,cAfv odFy7=yYbQZޱ\;C? endstream endobj 1603 0 obj << /Length1 1532 /Length2 7593 /Length3 0 /Length 8614 /Filter /FlateDecode >> stream xڍtTl6t ,JwwJ , ˲,Kt HHwt4t H#O}svwff孝N0$7?@AC_''̬ABq L` ާD4`5W(_/"/*脐(  ˬD@lbrN;"'PFzG 6);$.ttqBʰs!H;.p[~h2eA\9 ݁00 W5?Ђap re*N@Np @`:¬P|Z~P E.<./wY f!]pOd`N0  kW8 VU rg FDŅ`gd';}ܓBl?.@70pzZk B`Vwmx`P˫lg'bO:yq110?o@_w* 'M/U1JO2os{#:\b'We">-m*-0xc&~;Ն;`Oܶύaz jsC< ^őЙ-*xeQ/s2c!p| :=$cPݏ,6]Zpf6C?%g~F9]RI]w|aԽ@`a`E'S},ޱ1K(ڪ+.xȝTNXO|*k֘#L׎<#F]0<v:rhyxY]KmF{>ВǠԑD& (ݩs{ڑ5!Pz51[5E]&x -&MČm[{xU;m}}_7 e<~sل>Ji]Bq$l]-<-4݇LJ|RuvM =({Ѧ]qF0dc" D  ?N%M] B.k;Ş|[IJ*.>*bU@`̗4ܜvuzn@m1гPvsS%֛Sq4a]H"gP{5L*|C_/c[⯪>"wW^eaٟ6 >glyJ'*rm0W^;Ⱦ|3M:l)af8Xmdit=7T§ߛu Λ 𵷖&q֊&#U=8Fltѩ<*6D90XߗeEkW ؒj,&P]5%˶*ZJ#u =2Yl%>J-qx[ԗ^Z._|AARyB7gZ 41k'%K}FRBa9nn6wj.`K#eJ.QOeG<<2a'dt& xTn퍴xRv:(T8q'8G8as9yl9z;$훏yOZTFw3gÇm<J%`WVn&9Ւ7HDXrJy|}'<FWNC9 a)'ۚTq zlA_#ǔѢp֦fP.#ZHתRn& 5Zvcjiu2$nٓجJ k'Ɂo'i9=!֌xo8r:?oPU)Z:[1U_ Y |q+4ީri5aRCBqB5R-< kg=0nckbTkh2}iQh^5$7_zI/|2&AQ^%b;g*^zė@*m 믝I]9S7ֱܼke` hk}GQXvi_])_iuϵ ߻o{|2!j$qEMOlUKN#{X$x٢TTrPD"0R8skKg 9?;zT3b7"*ƚp$!,s+I8Thnu/Q #pR\BOo ~2Jj>C2(Fc)pq1˅hfۢ8A_g^sẄ/.*/ (~v9jD0bltb4CP^LR4]e㝈dP;7 vR-m*fZs7Z7-[TPvy\FcMwFd,_J1\~NəK4+ yZ4 9s?`<5#hrK=WMܖQkU"W>}=~\j?؜ﰦliRJ M3Q~:c(EcW,z+ 4;*DwCE~'Y GB<+3Yir0 z Zk}q~CbDUO+_ךFc-2MЄCemoT4Nt|rC=Ջ͝Z7!&<\LTŚ?.\d,Cⲁѥl왵+CdqTha_a,ǕtGڹtˣ2EFO1_ň^h?Va{߷Qvys9M8A(*;qgf2Íg * <"7LwkG'ʇP]b{zQX u9`B zXV 6ks~ t-GA;Ժ^6I aVO6 -&b& {rݦj8*kxj?Ikә- _ pjY=pCQQ:7;!8iHK yT_d'^=_" j+!_̌t CsS :nkĈqGq>k&brJ0Mv6fKȮ\KA𬝳70-;!k|vlEv>+CPdfaTxųbCcĂGyN? Kc!숌{;nޕie˘R'|㋷y} kURƯc( $鈷u0?md5ТSy9*5I6 oi73*#MWH}LuMcs(>o]) u3L&֋t7 Th_REP8o~*:sB5e.Ͷ?UqCLcal[E* b Uo:6?`e2*nCD$e3ߩ{)=P|cN5^pDGo#QO~P{$&S"9,TN>썜΁/^^a3&}+uZzoFv6rn$D.xL:}=+EVc'Ho=yT[*M^ɂW6 c8FUux)H~Y?!'Re2^. [YbldD9I\ܖiyw/QM"y+NossTuޱj2{R:n$eBF36ࠞ|Tז;vB,$<97;(YfˋV0$4|㾻+G&lN UkNLdEt_[f^9KIYh9{L_n.\M]8.dvw^2ZV0]t65Ҽ"i<cCI4W*P0Ȭ v˫<3 "[Q[. ڒ܌jdOm@W9eۭ>}3Os*?>ԛMiFh(;gwdugؼ by S92qGcR~`,! gKE>dT 5 `Tdz(zZյ9w)/ꩪF4mu\e4W5vjrm'a\ W+F‡{I N*O>غ p= +ɭkjx߻˜ sOkM1=CuV?}Jg͵as-0N?!-v#KVfaxh+6g*YMꌞUQdz"64ɔKEti PNBe:%,zYҋ̉sۅY-73,x yr./nhkY擻bkKIbf9B_ lF;  w.G.qr' 9WĹq627iᄃ~U9&78dg ƆZ\  z2ly76~BЅs\с^f2m;?O~>sfQBҗē)/\BTnDygc-%TYi.^t"2$bt@Ǧ:XqK#ǯnN2B> stream xڍwT\ H Cww7H  030 HKH !)%pG׺wZ3<;y~^kht9a` Ȫ@^N Ap0.T?p0@: PqupDE@(# .A sClSZX‚Ҏ`8 v`GV . Fx+$ rtm%X@4@8qzv?`]  uABpl@ YvO;ݟѿAAVV0G'@M5NZr9 7dt}q@AZBpt8b+ ֲ0GG0~r8 \jCX@6(X:qC!ή`e?=?-B3ae+ `؀?8. 70wz;nn5 B8dG`?! Rx+3aPKPFOA7M2207ps  g_Z ȟwQjAvpS 'h:)h?wO/(:822?V#O;RŮdGÐ}oWCM:UBv4G(@arr!A =7 aG ~u}+W8ҿ=V80+ѐ!ҏ9Fŧ 3X8,5A+ҩC=3J}~zڈޖ*'zR>7>[Q:U] {=>ͮi^OrǘN3X̐b 8XzLz7vT% w7x'bkRǥ˜飏2i*dsޯWgH;F8p;l2{i÷320Ss'VYiSJr,I9\TYP>ltaLi:֣UNЬ[?'}>8ʱ-/[UČ[u8y}^.{/'cN< G*8wxڒ Ss1B̶ȧ:+:$p6ٝWZSjÈ+ ?js(/~&T>U=I KР}ˣ+ϥ,]~~^GʫDɽK<]qj#KoIFѱX fd;&2\'Ԃ)*(8/|0<9\\oZ3u]& .^eH^{zc9ǴD'wjތ%΅)ʁgh~QFG,9 BZ F>sr IaP@rM눰U6@ibGD9GƝ7;##3+yy3yAΩ\~/L乗۲Vg%ԅEke(g Im?qpTlHM>q8'>TZ@mV^ ag>|&z>U~M%LhAO(GA"X5$!w>3)+^Uu/JMr}p̤}cMf㙙>SҝaٮP_NtKԪvۏ|loTS'bso?Z~=]/t>dW8ؾ?~~GF>;R,j<3 j5&8sFVm;amx/gy(cXS{jhnOc%&BOb 4Ҳ۩aJ X[L'9{!FS*v'?ej]J6+6rrꘕIҰ__3+"'r[VS.9=p!%ZXKR+%"偟LFCg#t2 $ԉBaEy))'׶ x)))thgclUbgF칩Mr7Ցc<;9:,\q*[ЁK ) m_jPme^?u;7S7|J~u/.d3,>kb)aNٙji9QSi$hXk+N#t3+aqny.IFNcZfw>w}#QPd$?bU |wΖN_Kv\7o~sW`DZ;ָa{`Pq^~Ð|V%q[8*Q8T.@˓ܽt|]wTeS@-jzڍc: NK ݪ>%>O2㉕ӛ-zm|-ƌ9L=߱xC-єKmcoʤ;jP>b.=f P`[8tnL=SFbQiZmِ3V Fi_U{LDI%n#rf#ybd=lFOTh&~A)Ce:IlN9SxN''60]LA<SJԐ5o%pcN_¾S&ut{9~|5;Qs>NA:Y`4Ǥg46:J"~51'I3/u͐Td'3'x3rB7α)UjC91vN$7XL3mj\ TA7ˆFMV|X#.\-Z}AXLJySrڦ >?>g3mIΨ2:>Tݾ*t0OD;CR"2_Պyp-(?O{9;4
ay!XcW%HUcn][͛پXPvC|ji1٢l:PgGGpM']KdR1~3˺wT~'WDػ nJ2 W1[RR=؜I?n##_BY~m-L~)rqCG$;+ԝkK.rU_me9l||:-ra&z~'nQx˕L\ѧڑx17֧Nцj yNgW ^̶:XѮJ7d%) w /ҟ7 Qډc+aP;+.Z%84/xtσ/x¤Mt_>Gf/uI6xLj{U͙="r.9<Ғ UXwyUXc%HWoYT΀ 3yʥRtugCS/o&Τ"zȃkz-"A„ h&\aGe- 5\{mK;1?sⅯ?R>wV!}WʃO4}P3ш͓kd'_nPiЕ $5H/qoot99EۭBnGRSb+ZlsGċCb;Wj*9 gZfe]6{zȾ#@a6/] NSv>26ߕ4˯8C~c!&B7(//.4?ihߑ 3Te ,;j$$[7"AguthA:hm=)/1+ͮ*s=ϱz,p* p L^格+|dukhp$[[ǷBj~L/~.(rҽh@*"ac1Ok.иkK5|/^jT$[ OU821m~9>O1v4eȞѧF՘Q|!(=R O)\7`14dv$>AT~NWz>${k5i~l_Oa\ x-f9nC݁EK &bc|2zE$NUFI0tZ3tu&L[B%nk{97 IL}Pv:|{sM3 .t$VeyBA3 v>q7 W7/mAEÛ3 _GvĐ]G H-M-Oll$̔5F.ߖ>0!b-͊v|Fr3dS N#"8}-):3nC=]5xN,퓜ڄ=nԂXJ'O\st((W=ܯnAֺ*r^5'vaC:ߞaVcxakD /Qw;%p?*MPxz!)-.t?i͛^+Š\DH~<jKQԈJ`z@9zWw ivj>@~Ş:U:0mg;>zN7BRWƢ%-woytwCDƲۡ>MG:7őh uؘe aԌ5Vˀ "ꎍ7/ZO|k}/3ldK M?=o+1#8 S}^cͦI][U s/8z"prP)>^9&i`~BNF‡֥vIp%:BT ?ӕ.VŏsWʘ@ndR=0#R2L|Oa}yGݻ2*YRq)u9|NL{o]a~a6cS^>c;{QYi#sOVFn5[\ǒG- 1Rc 54KEYA8&BzTb喊T{Km3ӿ 8<8^,)0zg!5 xYKKf.G,7%pLMBrxsr4Y{%n֮ LU/s4\`0^ endstream endobj 1607 0 obj << /Length1 1512 /Length2 7327 /Length3 0 /Length 8339 /Filter /FlateDecode >> stream xڍvT>%1:QlAc QR ) HHH(!!J M;;g{繞3>.c3Qg\ĈB@5S ,!O(@!ï bp: 3@!~@"-`_(_y: 4ꢐp4O puvk  !rr2"Ӂ*^p_ @1np/܎0' C1A*!p Ġ^h10qp_3]! h@\0P_8x"`p$tq{tFp D w?B 'Ca07@]p&#"B=(\>:~ T1Bqd"1h14CЯ2K@:H |_8 wAm@?./ ~ $g1@)0,#}@Wq oo';( tQ"\ 1~P:m 3:]H?q0y_D 6'<-g3&KUĊEť@D\([5"<:HP s\1(mR` U_dP/gП~00@ߡ?o ߗ@k" \yOnB#~=3@Q_>ܬ#sNѵB$?bi_`bb F^8íb(`6پuuwkܩH TԌd;6^u(3a!$ikݔ ַյNY78Ƅ@fa ۣGv;){9U(/.;g;K?@x><Swfx`Bzbc'IWصXڼE~drՒG ӘNN"fX8`vxYM$WzH# *rO^~lS}? ӞyIw߼eI9|+)GnYj-՞W=mTͲmY/ B{fHT9k^ʆãY{Tص]?Qw +T] ˵K|Am::-TN ~Jk._JQC(» z@rZp8CKF`-2OwufguO)a%ʺb8XqS:VomtN9Uv <9Swj2lc6@^? 'sSy0֏EphTɬ{(G^9=u ^SlpBSI؞?dR $x@}}3 #c]@P+eP̎::+ճ2v1uh5Zw$ܸz"j]:[˳3ô^&zUQ^Xhl\pͿQS]Z>VX3դN?6y/1hO&_'P5FiyOv-J/m[ZAΆqƫ{R~ak9"j5 ic[16Y^,*e|Ya[=ĖƣBN -%m2 Xo߲K+Ŵ>|;dVPeutjq0=-Eqƃ{#x}ouW(Xb`&wS?/OWlJYY,X4D<D> ΋#ݪu[͞ĦoTۍRhz:~|rcgt#\_j[w˫\wZk4SЗrֶ}sZ |oET-cBL1j+BУRA4 cF>Dee>5Q ly{:a8y$;W5'R?+6i^auZL(ҿ YU{9ũ"Сz[40 pGL#D4Pwz'5w d&|? ۺl3z m=VlKAn=ߐP(GtȞR],!((o@NɃu 房x@b48ʴ'rR}RP%wz;͒`tovKqg1O2 k4[jӍF,+PXR_u3'x-U7%S25"{כmXsN2I{'syљm+GM(yRs PWbsqH(9ۗSAWhlXEI⠶tZB떞ʵ3*;#XLi`yĝ'2SOƈHgaC~-/G!rz2=7e}{Ù@ }>_ᢧh qvuJ_Y-gyCotY4=/T4Îe<~͹EME4^ĽlėB y B8N!sy<}JF:h vQgqZ< wQ'ѴK%Zi90 =44GFL%.WT(4E)ϾJ~)HE_oF< #VZ0$X{礰:~[4ra?%a/3vHGUOR _r58y(A7$p5mnz^CYF~,EI>2Z_2Ӻ$d~iik2dD5rs6hnG]cŇ#[>Jž8O:Ԩ'=S3zb#,PY9 Qm2Y/ƽ[D~UPM^"gq;MDhYrzr'Oo}]8*2os6:[KX徼x{|h>If&oYun nb2Fh +%UUH*._UW(SZRik %ۄY%*" 4$׼7v'Wnp)<76s+k;5~!*.) Nݙa `KY{AQSorNգA!ţQkti`(<\3FşJtzxo&ΘDLL޺fZ/6]{"4\~Q~HmK"UWu~{mہf @DA+ybN0K[5Ao6lћ+N4"WB+u3LhD*,Rq8:sG1?%_^bE6KJ$v[0 09>"Xt|C֞Ki1_nQ q^u-pWaJAҐh gոӝ(D ޗ߯B7 鈙d_1yXWw6y}5-H Y-v{u{Z@nrbA8N(1-~R_$pX@X\FC|yNv׸~aRJ<^A+`L׻qV!\L9Y;UM")97 ڳK9i]L,^m'AY#ݭ:}3o>5i5Ⲗ laIu{O:gr7G%Cy i97uex &d\=ᄎyսP#IH |!&K.*M&؜-託['/O;SyFذ{L,󨾝,e&֫jSidiݖă뵘|Ҁ@g*0exAx5q\1I~__'F>_)-Nk7Sլ[}K= \>1}#Lg$Ʀӡ#S;5u=UDѹ)>" ?W 9s&e iE;Sp~oj=SWXM~wcM"wXdYgGx:"Krٹ-L ʙ|Bgm| ޺F坄{I{Y9Aw# 7n"V%(ӿ,^fV-.:%N87؀*Sweyˁaxb۬ROEgT9u<{΄ sPEOnad?Xeٙ%ϦfF%XQPxUPw ^N:uB :FGFHI8=$l} +n4XQaq1UtpU ]cͬ–xUSQFhkkU#+%uFp18t[p|6+;ϳ|\QtAB|7&dR*"f9:qn 磵Dq({a E_S 4VכCդRkDoYF'@Ɨ%矓9Hɓ#@#]DFU̘E0m"xai)ShCkz|wԟj> stream xڍP\ 4ww h%w܃ sޫcښcՔdjv@);[gFV&>* RRdig#]&an`g uX\||,,69$\-M LY;[)yИXyyv-Ml F@M@5;Kpvcfvssc2qbs4eY:[TN@GW)/E#Ę(Nٙ99 x?&#PX_ p+F&&v6F3K$%05dojd 22~7;q# ߿98Z;;19YbW"KښmOh^ujmkfg3K[S(3kZ:e$m.B#3:8YXXyY@Ă񲷳SX\gG?XY&c-Ÿbٿ{-, `'2y1J: JJL`ddp|7Re#'_k  -OP{c p]_Q_#K5y[>.`_K4tZg5NR@SeKg zdi Ts0X_%N[|_=Rc9:y 7qXߗ\l]|fv,_,% ^`1KAlf? ,Tޣ(GQjYzS㿈=~^H88̦fl?t?y'`'wb@X,ZSY߹#lwW?QڿlA@?t9X-u*p}}T=3?!9(7 ;5+fe}G Y+NN@m,+{FB4t򝞳? ^XSwoGJ9}_//D h`gŪK}(ބ,ާ4ZF%NGd [h;47"ˤ/^Z`CUڟ U~N N 'bT~q lspAQǼw^?P2_%\>P2G8{ƙuv#wT6$Kg-asRͩ_clK0Ewѫhq,us|&tH㹧zxۀrK&2jM:,#bUv]7wRŰ|>Ӊ?rvjCK3{Cl{6Xɏ }OMێ ~ix1xef呧7tCj2N~0ݐ8&J-ߪDKnnjj4wi-' Q!RhTw<zh7"wl IguQ*FP_-}KI42D6f%Οfڴ][ºz230~^<^*h%j)z-#xQq^|j 4|Nf(=0q*M=!S|\XwsL*Ci۲ڛꞍ{@'#9 ݃1: I(`4uϟ`u^r䪟nv$PeH! A b%euQ2.4w׫ ulG@BL:\ ;6 SR-kŐUX[p^}-ݏH6JqFZ?7ʰ9bMDajnneD+.&ֲ[L1 3ARdhDB./q6ἢ˛aTAr$iu1Maq+z5r~}⼩푯]$dBqz")rUKV}Aq7 Pd;_B{ɐ܎!mޛ. x ( JqJ{8>E}oM6 8U>Ҽjff 689'hjN` BG\Cg l^X뜯I.bukXO~$텧g\ "~2&ѧUF_2@sJЋ[;f |E bMKb{Z=nj$U*ߴ- |ŁId=L?+{Z̛f4Q ׬_e{LFr!U bdj.䜵+ %#w`_TJۆ{fTLحf;d8l&t&[xOgarn!6 G /"T5D r:Pm,)kh(#+Pro7ּG 7^M $]ײҧ*;t|D]ð1C F\~:p_ETq{,Ƿig"s8?D߶l *{b};/dؑ,9nJ}.!MN_WyL}ˋ֜U,`WUO\M"˼vn& 瓧.JxL!ɟ(!H1 p/z!ģ@ >`5c˝=AtD<| p&);f Vd>0g+!:!CmݖL~)do2b ,G| BoT:L3C5$ /fvB/`b:dǪhfq'<<^N솮Yo] w8qr j87I)E`[-CfUh)Ɏ o25_,y͝_/G'?wX+e h^ qm2l|14der}w`%cw}+l,S}_^Y3*իb 9̫|~,#byf *HjL3|lǀ1:Y6bg((Le!DQyi,YNuC 5* J`A'Ỏ܇!뚊nK⣫qޢ.}XԾ[0_ (r9Ż\^3=zy|f$" @zizSBMTcDf"*叶Q(YiR:y;HCzaك؂8ⲝD.NZHQuK`;qp(` wa-~!MM|V[Vf`Ӌk=4atR+t$tR7MWm8B `c ʰc%:SvLճE>OI279Dv%}4ťLJXϠNܾrڠ(~*o6558y Cih*h3jQ7ћ˚HԦdL5![.3rbRHO,Erg403V)Bt#2qpXOV&ue,ILf n2VYEw>[Ÿe"O?;9J(V|8%r߯=3~$bg3;7Eԙ+)IQp2'|u5]xlđs:Q@ͣQXcDRkPG3Y-oF 2rwm?쇉ᕨ%D†-\6s:Oc1b ɚk:^;Uް@aa{ƅ2J՘Sk?V,s4n//SDɉY }Hr[h9P׹Q~%/}>+AK'F3)TAH /YL0Ui^7vE6>tawn}U Юޏڐap7 6srYUotbG6eDnk& #5 )_I699=U?Ĥ^9O^[Svo-<-9:dt֠߃>Iy];[vAʟIU7wZ2 {[ Ƌe=V tLJ>ӑG0]RzzXYNpv*@# @ tg=|BO- $')RfP|vwRS,22-;df,3Sis1o)(V ?pZpY}|+s_H )-Oy1}wxl.{IHu D(mR'S9 E<]?.AT\7f_o71v>~SxS -ˡΠp1%uT]w.U>>v El}o[O=;4ּBꍿ%Ndb0){iOQcSx2|A)g?k׸ oZ2;U<l:Qojai1npz#pw8'xm0%6icΪI S̏bS3x۞6(v GZ vY>5䁡1I8u(O11tg+wt%ͅlkCflD= jߤ|-uhqcr!Q3k3JL9RX48r#]tIɯuVXL 1᪠p0$U% Ľok/Ӏ3׭9d=ƏmZ̒2SˀqN_/}jtX~ lBÆ&QNc*~0U](ZeZNx D0Ѱfr#"X=qXbI,4Z$mfgW2dQZ(z#Dp+%81N;xylbkDvx-m.Ӑ7sf5SR%}6/Y~cTA5Oϼnƕ0¹[/w1F6rNO TdnPseZL1l{枛B%xíˌ = gj1z&W1bxNJiR p!AT^MP*zZ,><GGM42lB'4$u&"ds1z.@4,Qvqvq=3,V7>*~L O˨t1m}†6+ /: ܏M!M4:݁}Gբ%^mu"WAI,Ẏ4y |8͓dEXp[[t-`.\[$ϙLawjN'5|_K"GQVes,fvLpUKg +J,.'V6;"tWfb Rكp . )fT5igW >I/ g~ ~VvC1tOMrVDC-f~ ch>ͨ"h[k g`6sT_gxa;#oDa%;(.!,a%GzP^3F e Ԟ}e6 qWJL2 /E#mKvda`†\ ۏD<`2=>ӤnlXAf\qW b=_lԿY,b=Ĭ`.3x*D=F3M`ntR'S9R;K!.Nw' C"_k' YSdWG~-mA29r-ȝ*|*.Lsߎǧs|e焼PiTztFSuPp"%1=yt ?VuwM1d_Y !%Es& 6}s.Ig{걲ot8W2\a|U72' pxS=" i#!%؜xY]x5CkkN*}g7&k|jtpsmjl!|l1WlZjOeN8Zo\#ߥ-*]{{87yw>_ϋԣ,U/žf4\J@>IMv_Kwr_9Ȳ(tu>.x=y +NOzy|$~Kx*ā XH&WW5q$GH{SY] ~7:E;eW&㦅 U E yjЇ[F6cuGe?~*2mh~ נ#[\DHYR{ְs@5%> GP}RC㓀+@*Tܺ)c 5~iQǃw>kTN9ܞjTdowz/uH?Ѥs mR g|wHdq6lG1I C(R7s.f\1ҟ-gC=:MkvHي.^tuogk=lG+x0WhًVS^7S-˻>SZ“=P:$Y\rQxt۹p!CA00>N#iZE*[~ߜ.>xXJxt*lĞokj-T7xoG^+2gzC-7J.h`e3Iuq 5W,K\*9B[39o͇ߕnJ9Ifn ]$_66gj;ӃDb Cv /`,S0F-iS ahŬy>[XYeoI wE݁So`;㝈w>Uį= UQBAM@WSj>/H`uRu6_3>dUCg>˕8qjĈ;Y[h2 Lp~Lhcq뾾hXED$ۣ['I( yr6N1حV3EDR`v?͇j :bP?g[I֞ݙ;:ΆRZy{bshbQHXZ+J2yUvjWv8 31 !t/, &ȩa)sǣcɖĊRr+ĵv:1͠dD K+ ,Hw? &|40%o{{CmpnG۞UЧ8o ahXE?' ]AgSBLE\rQMeMS P30ϳU7tRYlaW0rSYreV< !0'c`w,XR7>)ų_|aUPp܌3eDG{*M߽PR7e`j Kx̬*_([.l)B.|@Wհu/T0U[1/*Yr.FzR||~-bp&q/nscYolSj݌2nINA /Q)WBK%(_еۜS8 >-x&{V9; .< h!r`RnTvhT j?yEfsĭEJF|7#unOX^wMF5_Lޖ俅Z>U6d\HrͲ&5)>Ѝ+ 85F>015e9 ᵴIKO!:W%Hz@ G zbNO1V<>\C%=kE-ծiuUAN0yk 0`R#˘c(j.Y7#;^,4*sPƛ7;eCLu2`>;; b*ra'@ :΋p([ώ^1Я Qp5i(q 3o>ekcJ)UHțQI{h \Kd2*NpJ6WCY沤Ua]%a󶣣N|-al+ bQ*?61#.v?2M:isGSis2 un"z? #ŷub͡e] 3 xHMwO[~BV"QALl\lBPX,Bt!8A=؀ эW9c"1O;zH"@tF9`Lu=8P9C 3-xB ΈBl}"%Sϝ*WjY0}SͽߎA'g=BIY<=g"0l;&jC->* A?oܕj/ ҩ+ /@ѻ^c3s( wImSwb%ԃSK-OUf7}(%N%_33V6Gԋfa k(3.YW,XV#jF >gKJIӮV%RFܩة+(u^T_ TJj,_e:*Cm !^Z{!ʦZ[}s 0&}A>$%Бl./^&QP:7i`R,V0Rk5e1Sgئ~nm9=Ml Y 6` _zac%UdC-Kpiyv%bNlk?ԳJlȔ-dAMA'9@!Pg"νªzjaцEoSoPA[wxy 6߻!_"Nkkc0S7&Xˡ=eӔ*eY>lTls`L(U[0z0jqXHL& p)ͼnKy==Yqw-L d6~/g*dʂLu#tV̯mOm2W}o4`9?r oJ? tT@[S|eqckۿ,F>X!F$>=\4'KV'S5 tr+IY!sn_֯b/]ÕЛhnW$C#R֒٦3S~* wrP3 )= Mj\Z4Fd0[i+a8 گ+ O/V&1x?4nw!4,'~iQ?#3`E_P^#ƌu9Sdэ*Wx6K[0_'naB/QvI EN-юMU%["<:T Irژ+h&.8=Npr!%AUiĭߣ;~0TYT\(|6"*Y`,fw̻:\SW$hOB󑆉P;.7 G%ڦ=ḘF䢥!tn-)<QeU qM3>htWFo`ٛV<"Ə=!G)BX@hϟiʷ.9b* @ܭUH# &ؼbU>WЅ-_9uIFRW%D<0$;7J QraI'WҿlYe Y>h4$!d;ߥ(jrbڽ%(0Ad|#'zÃ2)8F,ͅQ}Xwy75Oa 0_= naCjO־I=ᡓTPȡwꬕ@U+dA~5Qsg G4+<ݵ|hOJ`6c]c 2#"T}5D+)8;._i<Nf(,g^O}ZC> )b.ѮYRyX&ݴ-vv,K ͌N%X%eo1 MNs̺|uN_& gpܪ}ox&}-+G}j{sa'' 3clf,G(bf; 6c 8/ZJ$_H$EAvqS1l#%NƤ[384:½dU=,tc^>m;gヌ;9,Qor*+X>; SgM7n9跃B)*-!;=/%ꬫoX>< wqS⊌>q ]OA _9:^b O`K&ڭgge ݫ(F;?w.*zf, ™rXsue,l1U=0S@Cz]M5x9O=/dqh|T37[zo O]9dCFX [DBOX7"TEEԃQ3 #r)Jm\{gh1ASڗ3"k߈E޴e~!I_F_'9~>LW>ӫ3WCSrnU$j۶k:Aj@Hnzr-((M&Ϳ=2"#-'W1Ux=įL*,lXwF[o~e2ۂ0{gdH3HGQphaѭV8k|= \Dҭ2hʃ/I{~ڳw."[ⅱN[^ `9rXG-ΚQTz?4s>wZ/A`HʑT|8G)!8[l![aOxkwE~q_L>RUQ)9 d͓fsV{!Qp`42w2?Wʒnwh).{:9rU,¡6cE6| endstream endobj 1611 0 obj << /Length1 1496 /Length2 6647 /Length3 0 /Length 7651 /Filter /FlateDecode >> stream xڍxT۶5EzSz@z t !@ $HBEzM.RTJW{G={?{#c$ߞ\;ac{'o (>A~@Q  BllP 7Nf qEBpPtPhL B;j# 7@P (*!(&@%;@!H6E+#wB 8@r8+A0# Ay# "! rF#\exPCl(t@ΐ? P_G;@0(GCW:@Y/^ +ݟ_ 0{A;( UGyx /G @ǃAP{ >f uA!P/ҠYnpvQH_SBs\'8 EE}QWテCP ;*`m 9 \vh?AC(W7"B(  'wv4 k+`DOד%Za8[,LEՄ>!q( ((( 3ϿNoQ=#:&GƆ :!1PF wO`9?v3g7z6 䯁ֆBݜ۪gDn9~p(R Ճifkp uG섾[6AГϺp0 @ /+ zVm!%#PJtvmaAl@`'$ t7 Bî 0oat A8=ۿfExBdЖ*y:ϸ m f"(>ZxYOVHכ* =|!'h.M-ܽϗwqhK\"Kg ybml2qLCx6䚹PtJʜFmŒ6cf]@=&#wp3T7ƌƝ)\x-Ye1;]@R"[9w *1G]AT459}܏^a:{Š;j"ҹsنD"xY*m1N3*ayԌܚ1DqəL} 'YBҰ_*]LfRlzX:̎ nyO^vCM [; TA Y[]ENs+5'\cyzmrS,$dZk:$S82y-tpt@-%x;8V 6BVymOu84P[ W fAbsy ?)J;Y;30E,YjG~x#uS{¦_U%V^/Ҥ*Ȣr܀ɮPLrzΞˏ JrgKځ>؄JD'ɉ@uBp~ ze uktCYͥi'7jz^oVaz_ ~GWoY5o'NpƨGFz5v>w?Ulo1ؠŦ/L.5r`6=qX[fKv!م{"T̝x oI$YNվpjJC0~QxH.Wh-k(ۡ. _Rm[)9|=Z.\TH؜|3P<[}3F0N+#ff'];?&I%_aswW0dr?Ųa>|78>l5=fВ!,5~=4@WJW spuP#|+7+G" dL%g#g|"Fzx鳠ķKAxRq2"`=6E~.qrAukސvPi8/!Ρ *@*xa]kF< KoYFWѳ5i=SN^dqujI^.J}KdGa}P߲mUeY؂}! =׫>譳ki|jЖuJ;_c=G! nA_t;]׻*ͯh ? !(1_Gek~iz|T˕q4grl0/'|r5x@rck:㜡RԣW$ߪM)8CBu9ԙQZWIpě7b#b_]o;6c l|CcK4QU{=Mqg"Oxؕ\v+IgkR━z 5 J 6X᮳Ƣ*GXMkY'/7}L Zr|jkX kUaڀ"{a{4_kꧽG:C}#n1<#X*Gњ?l8]QqfA~9C+ V=voa.`x])/+jp x&%_e f2L -4Gz=m/q2̊ 3v]M_yZ^&(qo}S-qoŹ.SbwFN1{']A; ?W wkzu 柈x>رUMeܙ$dg)z\jF>viwc?2 Sċ4$~US[AͼOQ @eoFoyx8eCj{ɏ=v?"+_\\*UKN2\ulb;FC+M%Ndz[$?i1a~Ob%9J0P5os 'wVirojv`sxO}g =S3nؒB֙058Owa-(ڗ@J= |@9g~雍vB8tn(j^ըMLL^':2K1oy%E>cb_X8a^Ze]=iJ ]_ eB!ti' |Ypv9GUU/Xoʏ/Sm+0+4Q'8JD[ןxTZڏ;x #1"Ֆ:<-_%PmپQN/Y$g2^XsEz;:9Z>ت5_V6+b~~ӯ|mPB%rta6?ɒ[_n 5|ؽ%sq,bkr^ppS_?5 4?DIэ8 ˖ 9p 7V.,{\|6SFGZܢϘ#dG{6ۭ)wS߳@jdd}+MI=x2GvVNEj)\FF9N?ƭFIQ+hr!եJ:O= ɀJQ8[T|…]u3ǚ)z2vA]M(w3az-sdO"5i\/7yEiQtzʉѹK`XOy˨YDBXΙzҪw@iΗ{dW8ڪ0D fj 6uj> !Vf#Y4ļ/XUJ)Mʺy7RͱH7w(NjN9Z4`[oF*R{ύ^-5stG7'~qIf-9nbH7k6ۏ4gM|re'cK-/$Lh$)ܙf.J*0%ݎ,6[Pc6|Iujd&$Iz4$Q(/0 E6+VT7ku>(㳩>z ̭|dv1M[RH,;7.˯R:[Nkd5BTXD2k<_5B4,c#[AȍOd'+Qo~ѹŁd^Wb1Bg(Z[J3̋QRu_4"[_Mlyan&Q~%<]Tq<`~m9h٭3ݩDgbq ,g t^j"~/Dvs$ZYyFpWk$r19SSM'~ >.)$G^w=翞(n^uW(EďMdǷU$d;P)S t=ĎBudL. J[1L+9B2QPuHԙ}uEN fާ=HAqR(U,g< 1(<83r)lxjI1x_{#+;jR*dKS8w4{;7Ĝ<kPǻ~:+k@2Hs]yPNHe`pȅӟj;NIvIl'UθVRm݋'.I> %w4<;SEィj ۊ4e.+'||MMibiR^ 6b0fv}/{|سn˛1:>cdqR1 lyi5&x&;*݉K!RZϏ[L É-׏sY&`6ޒ^㏕'q> lF8iÕ뀰!D=:[bcZp1=~_rO΍ C$r5],6?ŧn,>fx<ϱ@CNA:OX2?*tjZyw b,4J&}AE5JbhZhAO0bc2 IIӋ듑ܺ? Gr3SSCۛ[b)f2kO?oʋURrd>Ee.Y:7d9bS0[K*zӦU -o1bO3|P5}ZJ֑cחdw=@7 ` ss-w|Wv{c~M?!$~ "ˆ"h$O< \}QR;`?54nOE${7EYJ|hHk9wշk߾Q> {M0( =Hz#@x87VJ~r8cX0pQo?|@d3&2> 1Vn3pR>~8c>ߔIRy88f,zÊ"xz,d2xѨ\ZTvhz@?Ksj,)i皳/w!Ͱ-! VӤD7O,C\ևtvMs:dm_sl59 PdIH#t*?p\2"; M3sg<;=(Y i|DHn(R8#dgpL,cMm?!f3_F'0:~[]`JY'5wZaD݊@`>18K1;Kt*7cGCe}t77m(Zve^Ëm';K*!B"jrJ9F”X8 mE:FZM{0d 1BNj֜;T1?|>6h3Mt7f]+2"*fQ (q_S_>ެx2"nB\8ܮ ;+MᔷǏv“ Ǭcd%(bŎɉfg#CSb#ήŖ\7syҠXt%ռn-쑳UԦ2.LKʩRMq>+V_Coߕm0sk]q 9}:B:DvYɇkXR{Dbd84C}9Gwʜ\ڝ r|;I+I˧ƍo#7;u\SWe   endstream endobj 1613 0 obj << /Length1 2107 /Length2 17040 /Length3 0 /Length 18310 /Filter /FlateDecode >> stream xڌP\4.qq 4Bp Npwwww`!pH߫{sՋLUI (bbcfH(iʱXY9YY4m@n6NpewC%'G= `ge+?@ wr!PI89{XY@kN`a t17u(MN6@YX<==Mܘ\6 k: El75f*ۿN OSW ]`octt{wqw޳4*@+ˀ17ܿ dPVdyڻ9z؛])@ZL `]mAnn6qd+1K9ZH898An'i 4?wo7?/,Z6.@9ۼȬ +++/;/z[@/;_g'g; %}_1̀V6w|`}?6_^O[̢'#oU;y|8L\66vN RUSWrNx?d{mA}?ojy v7E[zMlm>PrzkB+-lVd#bVs/BdnYO3s8Ul{۽[[ YWdz#O;0;:]N5 "_"X$ ^`/aHA?"qX JEQT({?=AzS=39q̝ '_?u ߑNߣ[w?ߩkNP^]w~H?8kuww˻zRsWfof?g^ϳ{q|g'No?a&8?@/9򂓹@mMhC';'u ΞǡZ/Kb]sя[ov8vF~8umЖf~SBOn &V8MC7t.W2M4 gHѰxHbbsrnע?SGٹvVJmS ONn2Np(Lfzߴ~5sȔۛދSj܂OB~/eFc$@)YYESSV&)$ ط/=}ZÜX=<`閜9Z8٠wm~4:5ΆQx7P=,+vx=xT֋*HEuLrJO=y>&g2FurɔmIBj]÷ZAOx>/g6o_3/uRˆ,'s]bD$~ )L%QAK#^V9[?c.]^<:aQ l|Wjq%bXKf3١]VdYӒs 1VKSrʵGj9?!d8 `а0Yi)'u=ubbOU^+u_ MIytg |`R}e;5Qom Ep`+ @8hi],CF1ՆT3eoA@ᑄ%Z`LfuyJdCDՊ#@<՝n}NqX E Evt9%-<syɒ̇2l%"%>7A<*8zņ٨p> 9ŨNE͐n` (3̲1}nP9j3qR6]gzf|NU0㄃$ Z~Z# H嶤:y.!jx y[}6F5EN2a*dT. JQ*sE]7GުISeJ* X] j(3mpm);,J +J _$pNCZ[Y‚7SK_Qe`x{T|ɿdyް\M0.}kBs`oGceGxMR_! .ov,`3:PNgҮ|+RS&Yaiw &Iۜ6I,m>-%xLUa =.\qI#rRR'2p7PQ9Wu)뵖Ag pG261.4 QO(_;jVT&CO0HZ GܺHZ%AǦ{ A)h|,Jˆ?[at-3=IO-zblxjɨU,쯼 ֒Y mq$>MI34WbXL`i踰FJ Q\eɒ|GuV>N(E?"V?lQұ[o1FÖ[Y=:P#?o/8`vƩ>ͳQb.nU̟bZˈLj{ޮpۯ龜  iq.rB Hkr3GeV8*VAݶ33>ͼT (FUl|PTl}K-7F Zr>{5n8`4%62#fQod';!=fuS8ï稷AZ.=_v[ f$쏁l.[ˌUqMy >ըnq:=F cJ-HlxsuAC, b4 Fadi$w\,Y#d!o\Qiȅr{=<.Ou6"c>\.Z 7MZ6wv~腋4Q_gSI_umk³嗇mۖbhx}gLL\sHԹgURyoN)K9ѕIvz:F%Zp\(Z 49"KT8g!"#z̼$Ӛ₌ON WQ(Itu@'tX!XzF3A9`v1|{ꌅ=(b#Ki !wv|$9ܘoTaJD"e6"ԍX ã@VEd[B~ %j/Wzecq} W[ wCBr+כOTm!t(22WcDeICD$:%)gub9^Mlc;8_PA1Lq05,vmΓvƓXwu!I[ۗL'ݖZt]ciG9E%B[-[kOU?tk 'Cq`GG>c&r[pzffHg}~yUPlpr.\gtQdބg*d첌Q NM;Y?$,ߋ0dl\J#E&=SaSD.{FܨNX0tphlE*%~YHѯ1&{KaB&q,epjE edi 2E^pxUu2rłD?AnqftF⪁Kg1Hz%¶vRBkkťjSO^ѢܻmB;Yrdqe%K>֚%$eda1y6> v>ر83`VB[슜FEF[Xa]ev N-_4#ri~m-ha"QuRO*݋_;Dwҗx_ ^a۞jj<˭U\é޳@1&NP 9zTvYj=l@쩺Q$ cl#{]fMl$wi!YX0T=a\ܟ~{;ط:r8h+iRO>oxFC"z(\aтN|4mNR¼oCTrdD2 (.^ث:T~DoX-uud!\w+RN=Q5exBty6,Ry"1kv wP[V17yZ6PFJfY #5\0tMxFze% yKܬ#IEOu#5 T&`u'&e)j]ۓ7Yr>4i!Y +a``HFցRT頎e.l%J9[-p<|d+LGOeF+D^1f"5r?T86nvT/j_c]Sf%!#yI_E"4S 嚟Ckť;]qFT4\̇( S[R;,XvGmX/^֨` dJ?/ HuKy ;yR)bev5`:~ )հ%Ӏ daH/udyqHȈJbsKQ(foy,쫟?aAܕ|݈`V_N$tDjI:]iݯ0'gik=$)ؐ+#c!ID#n<09rp\pURI( D֬_tR+h=k3`N HR4XM! .PDa4n](ϯdKfݷpDc0R%^˶T?~\(N`Nzˢga ~U!2k@#Uk3/-ǧ%BA6CGaC$3oJ5GS98mΟ /p̍cIעvmnMvߠlB8tqo^rP,Q |MZ5->CeeMFBıEjO;gs `_ZP`) DR'v@1MrlC8 *E &Pr6&|] I1K*aVN|7[|.FM Ϲ?x`ʖ Y=EhOìŽ#RO<T@wIq|:9RtDui[wd6iGд];4d |]ߊB &g$ͶRn3s;4k>swWO I'3}2OP"XtƩ{Ux GCA&+ƸmcY& wCp|v!sCm"JvRm #4>Nߊ3\dDP1d6D5nUz YlrɱNAm Gy&Ùװk!iݒRLc$BiUd:11ed;:|FaHEVWP%xp UgEXN9gac̒JC2;V]I sJ%BCɘ{X3aq>噽6U(Kn(y`+@# {}unՕ gd&nD-_5^ߍ~,.&|6ptUW24um';IĬ/QARdS+VLO0w1$/F|\fv)+M)@Y+Kzk̔-WE{8T&^6wTC«_r_E TIb~΀g;K~^RpCt!3w^ `c'WMf)ە 0gւ|mJBU\>"x{RƔ"i"\iag1;^$o5bLeKʳkJg_25PJ5_c!;n4ΪLq} 9vd׈P[+8|SI#s D9@OOsK;qF`Ѣez&ۿȟwGLV1% nDgpև B; m)ZPg3Y2B㳫Г1E6 0*28۽D7Bgkc_յQ0<z50(?ƨ4hYo Kr=|tv_Ĭ=zr2ov%o^+ Lc)@ƋZQP|, _5LZwCw/ݴ{aPD)"{'%p_B"0E,N8tuI^V;q$(3}%:X1nWů8hzK,L ɸ Ů5KꝸU|+(KT @t_3ʔY`$.Iy1j^x7Hwsu\g_bk!>]1K&f)T6Fk6˟vyylM9?c\虹VJk|ĀW턋q9 Hݡ-~P|-^1}ǫ Noop'% ?w3RA~Ug룥riP;6Z|dV=,uEl=ɏV1R(?R`k[n-S ^4dFpҤr |v{|(1a5ͺ>0H+PBZD*&!7}ss09&1Ywӝh%,*ܔn%+>/8ڂ<7m>jo?djx/+N: =r xӵBUGxu=yGE^ڤ;) "U^T`or>!Y:]lS)E JE[qSYϗe${K M{ SpDֻqdҷLsĤa/#IZ wfbʥ|ctYn X8a~u#̉dJ'58C' Z(:!Pjb '+OBXFv ]j'Ub{h97ًVtEg_$ZEN®B/aJ*Mu Kj5T#fI?-oP~ }a `ZH:4+W/j_jߓ=I(@{?g,-"/W::b//q6m]j<'U[l8|g AxƢF+0c۞OYZt!W4*LqD@(Hxp\pΙ;ZUz;xTL=ˤ ij/nՁ! 1$W2l7o| 4!6!'=#:4> 98loDDw!{`~XjA~ }cC ,:my$k3+p!`vΧXSN%=^mn |M)8>2SSf޵[rLp?KLS^ւ7\AmOEULxYS PKH;4H_(́'ӇK*P_65m+j22!^%_*Pc+VXkiҧNtT(ޝjY1Ўo6e]sKc-ɝ,|kS&wwi\Ǔ;EOn)vfHoBbBE:z(4mq&@q40}TWU_+[zQ.7 w@+zrt !x^)y3Q;&ꩳL ?PT_s1 P DSܤrRՕ@ j0_=YވbWAM@'V&1v:9)=ɝuC kLdtsgZ)]Pؼ*JYfl~Z,u7[c( 2MrgtoaT >agnf;+:,闆%ݠ^nac,8:pxLAUXk< IDr^(~\ZG6tEaAιVx$>nt1]ѧh`2M;/ОxW*}HXS9q~!!U}1=2xDSl|7?Җ"A!M;7/2³NK/AiPkU$2] fT3ϛ><av"d҉|ƇFI%m f؁?y I1Lݗ+` x4v]N =B۫hBƨ9rcb2~> CQ Yx*HI;AyZ>}|6Χ 6}pw-M ~ [b6RQ{p8 j~'| 𾿊eoM @{Nr#o$kRoZ2hȗnuY7f!n}0._N?A0؅Z M0.dA7fzDqLqB\U>'DU;&%ZEbR/<]qYWOed$vH`=gu*9zQO]$Er&0ST3ߦy#uuX[5Q9e?A`mښu/4DFRp~oBJ@mW|9 M͎+H#D#V4Ttu9rMEY-FnBwk|52`сɞ&ǧ- :T a^885djIBʷ"/7PU3J;Kx,tSA6E%+Ϸl[s\ > / 7#F!)HkZAh\Y*l>׿zYnxwkp()ߐ) ) idLi/%ke81(ǭ >d3}mJtNYXQ"N6Tf'DEfv;7<>z8M2A V>)bb%x9ّAKNh_8^nqozQG|DJJSVI n2Sl I_cs*!X&B'rdyXR%"q /zG~A}P)BW,ұcӵN8ywF8 wz8JS'|BKjkd6OAJ O&e^Z&So+6>t2GK"*-c84dyDh>K-{Olpb >ВU0 cpO9xS3} dRL촵pmQPlu%qי/(\w_ 5Ƃc{+S#o#Ը^UL[;243;[ :QJ:A>=A%I:c͌fV8+o|Pzŗi@x:тGN|zҧm6+&\i\Ti|SXEG`"xk9X߰ V1WT("0Jw"2A]Oz=B eTC- r)6bܦCslT>lTyqzvpoDN5mLC kbRu|hU~tܡ6SD]ŠZ PJ "x;%51ϐDO|p=D Z߉ zs kRCդ/-!QBf^^ţ8VI͖H laa :UoERP=<ܱUxM>lX=Y:;rV~Pnt2)sC)ܨMeu_:!e=;>౉|Y2.3LݸXNsOfxFvImg 髉ŬUqӐtxT@Dbs懛U=ZycD- SbT-ykQۖ!\Wu~Ŵ9hyrNDHg8/N^\+]q6%V\A1C ^{5!e#p~L0'(ke)L@Mxq)^Jn k=>P -?_R%@)c0^%T &[էBjȭ(z[rqL ۘkӓe>%DV(99Ɉmns63=UF-TPͭoP q\, 7c9I׭.VSfU!LE>7HCL/o$^uuKbʃ2`XՄm4t9nL9cLܝxpE+4T,EP\*W*rƌ%ڱ҉*VquZxs0Wu~.$G ƸFk!ӗL \J2|#B(QNAvp8܋RN(m>1qLa7Ítvv ~$TT`h&גksjbYIŐg3ի .Ԏ: {7Z@ /f{ω}:Se9VxFH<>W%a B-ʊPdh`v# !{WdHFls*gNYawU$ #0WBpJz3g?CPegRYpu+Qr -t)Hw.臚+ <ԣom&hfLʶ~a{<ebX R})Kh+(: 11>%Eċ9]|6iɒiO%rXT9=8~ gu@rB18xd VH>Id$!yTAE- MZM"s/k (X.pv%4XVeg]*CeM"4)yr42ivᵶ+Kk/ J #;-V/gxjU/9ՔmpTG'H,>VB* ˗W)  $?z+Iw#q@j 5~c y|<+5a-?c$r9Oo_@\!F/{+lOv&`,H']c^EmI Vj%ɶUÍGdhjט^,NW&:NmGC)jԻ)YйpMcHMI34RGvr|v7Ul.% ;3e$$<ֆl=R"~pJd*@X[ qزk %$)^'q@zat~QEzOV"ٽ{=!!~`n` "l<{2:?ј 4~ _wڨmz|N^]dc da{St3]ׁk#2?u?'ګT+. *G#qS@JI<+ɥdTheDjZ&1[J*N 2hBuԜgp5~(ߞŲmwKgx.(fPbm& *`feՕHG81"@#Bj9ywGSTtf.bsCon{e!e)P>XsTPGɰ;=],zi*u]\է9mh`eQŮG:Tn۰g勛͓SZ{r%]>!8;SUvr %J~Z,ߌ9peٸu0ԕ> "NlaO+ފʥ yA} ]\XEZ ܵ_塓7s[&& O=y#zDOL;\ x^*=Y (0!am^Y|3ch~3ϙtmKr!IIZH%A#)}>qЅ|JPre@}^BKstˌ&`;/"tT UQyrRi)@8;$;>:Ebh캈c8v҅n=.F~gN 4ESBei?dˎ\ ӏ4#:NQYaxt&)FjvϼDY;=xpq`eAHJ>AEȰd*SyVnF2"G'UaщVFZ5$\MJY:mIY96Ǒ [D4ۍ>TGHy撂(R&_Ja?4D63!*2tKTDPx!´y!>Y AU)abbab,g+7z۔ Ez[d|%yNK=柿f5c0ǣ&Ta&˞1|c۞RԗΫP| ]2s*P OApyOAXxA +錺6Qٱ'>F!kܟ| >P>[>r~,AC$go3m"CiI>/Wc6. # LP); ;VV"T+r2۱G dztmC։b419"y,= y [Y|u2r31SEN pvcXEBNWZ9?wT>ֽL<)NU:cj洫\na7u.o1p# ,;?u/1mIJl XWhO0]p{}ˈ]kѬsp]{Em)F! RWoODH#Eɾazx,DCwm5ѱ14ڈ]8n'2Z.ni̾xwǛHN/bϟy%F00MGw丕l#=kTwnu ly:Bү/-U~azq,3g>ۚo,98#i 5NwPNvWKPC~+dbV*ӵŕpަY4/Vxj&7D[Y^VVKfy$: t "QȤˣyS-Ef2,CBc\??]A;ż$ԮAHvQX1^ͳk`f  I,|R8%Y TNVoq֙{ HšH rCE0oGO 2.̀aSPxi^s>ޓK3W8dNK̑P >"0Tl~`ft²$Q•pAb WaIslbveܴ!^)s#+i2c^ `6'm֯t'vԌw5:Ǣ?䔻¿2Bkxg&pBw!h塪0;Hg(F?iah`ՍPwq`|K8UU֕NANwQ'ޝw%>!oOXPqg|4f-n"҂6F #=d;2>'lh>lzTg65eEZD^!P;bY`飠g)jt:㧔gUJET5s^m-N:?5~ d:bDH{cQOܧxy%C!S8P(j[Zq endstream endobj 1615 0 obj << /Length1 1549 /Length2 7945 /Length3 0 /Length 8971 /Filter /FlateDecode >> stream xڍTT. H Hw4H H3 CC# J#R(tJ )E]g9ys?{?ϴ88̍# Uy<<|\<hay{i =?!\n.G_eYf- wrX'uX7{|B6P/:0;$g̽ - #+ ^Vvܿh{;C~;|{? 勰\!~vakb aS ߟ+ `s/? ɽ¬0G1̓?)픑{|9@;g?WOEEOe96lv #cN*WY-F~6P=;fq?#0{sxC P/3Z0{8Bagp׽s?ѳr[GY ^g_ZC~Kݧ9lXVXpDܖ#{dw__\!n?WLpܮeakz!V> kv n%j_tY-Mɹ>8SoMcS#XV/?jFmb#jpAtyz(l]*QB];Jk9ږfq62mEqv,{\8(1Q|8(ҙ͕2'Z@4 W]+soT;;UN3w$Ӷ:)UGLk?^6Z"?hjq&X_ vV~zpi2o!2V%|*"dN3T{sLe==awQȮ4!,X9UjcDhA6ՈVyrZlH/P[B!yZNJ??Γ܌0MAlGv]Ǔq)PX^$pHUhI٥!PR솷i+5cG.;=}\4Ƹ# @הDXEzY%1==:=aVTj.AjcSl 1)izQ>rGbT Q|x@y1w0DkW)/B1 >Z]6|Hz醛F %#H_iu haBgrO[Ȋ]Ū( %]PCh)>'D{1> u۽TĨ${T1ڷ9S/)( aG~ҷFBݕCHH5ٵ^%}8ʟ?!(D8gQ# Pv/&y!fvMuMWB~̆osՆĨS̊__ QS|B*\]ZepŇzSvdh /t&>h,r/b_]{/n1dO``lΜ#"v0s-]=9C 4+6>4j/k lvt=7AM(RhPA7/h]H׊A P\ui6:k#LA0etR56" !j&ƨ M(0Klє2K<5lyu~dS~*’mOIELXQT{Z} Ɨ`vˆj9P] jަDra/Aw}$_#W?ЬPzhIO%Ϗ;  xR4\ c֒9MW%f:R#UKu˔XrNʌb%¸.Ԟ!r髳鲉Lvm9ȥg;3RqDz?ط_IՁrK^ N-?^uE rBBSxm_)P#KN!8,W`+UӖs0}1^E$'T=R_CP&v(Z' KN{$)lL rkP71c OhwpHbʌsl32YP{4: kFLшfs Mf-IVvTk}SY^z&c5M-.N; =SNaNkO{ SH8[0JhlفF"'~+az#|JGo󦹯t@|$8G %p;{'x:Nc*`Mwg]}Ϻ*xm{<.z0:&CNbO@_Nq}nSЬo,^ZkfI*#Nwm/,>B$c_-#ϓB㒻t*[la[RoH&pCOxdPԹI \zWsٻxuEf]y HF7hS$n7; 7WFI~t* "JW jxwz̼}4V,BM7ڕ9?"Vg3Y0{GIRT^-PLIaIT֔3m\Ҟǹ>t,熄w|rWzul1$s]gL8R$iEڥuO}rN)v *v+\i5q\Oh)”ySpf,'yz@ V41x5D`ڳ"` |A I:Hɓ%:cH9$|іRhܧP6ϧn9ͲoLh%*C^`,mɛ% eoƔ+_DM&Ra ({H2AsM `1NB Ad(+b/OI\WYzv-xA˕~@m)̫U{wVE,BGlr<~bR/G7d̡܉y9r#Af5in!)xJn~lSQ80UfY ޅ,4~MG.fG$6GYh'1R6vZ%|! 6/OJ]mOv^_8SZA% t(=wV\鬿xVfr`W$XU:3'&G.w9#"ɠ]ίuX2_M\I֨qmZF\ƙ(N[dmXq.d,KXwmTwmg)[|a#k]z(ff警_ֆ qJs.Oh4>KE>ި^P[f۹f|9tuԢ$*G{OIq*^g.󳸵FVk]?l&+(A˃9wߺ+p#pkF;kL]wJiى$g1EyeUu&B{j`{>e?*sstd׺[`>f5!qptq?B1xs,jOSމAy-GYlLA7uq&E<㥟j5|MRGd M)U^G{Hho)96{||\„%/Sy"3ZϔwUq?ށ )4@U!>B)&Wǿrra:r;(ѲW1uGZW)s9Axmj~<η -JGͷ q&y6e|Xz'q u 'Y)*ij.0%HNYT[zJ!d*c !(˛ Mjd6A~,=Y!x:Hފ>*so(|Hʰ/y)HgbFhjT#*%E*xi_K[* T xq~nSU~Ƽa-^_R Be[; RfL銺vJVyQ`k,ۑ OխsJd+(nl59,;lO|tX`ElU#su0Pc1UuYD>5EJK>l4L&<ڴ=H-&`AOe\d ?Z T˨h!g3>C-"AY$XQ91x !5gˏ?k l5T~>a&JYė 38޹>Sp0s"P,0$+!( Lw^5j}cugVl+q%8xBXkTZWC?Ow*N07cΫ)Z> ($ʚ賄;?9,bP!!_$ s^.pWIS*ܬղ[G ZT_ydž.Ђ}^F;FD'6s{BEMB\)6=f_~jb7nG=ЂDzվ< V(K%"TMMӄg*\7D$&N_'h&2ˋ|)~mh1#_PH֗H%9=\ g-.w!"԰Qg鋥5V kRx hPLw=]o3&ΨyO\L=Y٘?uI.p(lDrS<⋒ S-!Q( uDY<!(Fs4T#oY(Nz],֕ϋq>&!vυU`Ὅ|] ݟ|*\l<8tyޥsa C& +H^;(qk%LFI˂V aڃa[eӔƀ"H)G& >j8=[Ay'×O>Jl? o"}q*ķmYq/@= =6Fy O笣 I5|'& cm_mkU74mwWExW}gһcWūF—MUz|2L ٭2.֙)`wr>k1?0Nb|k6i ltQB7̬ɨ4Ç>T3pҋ1.R]3?:UQ/6޳!S-4E@.eR`͘XpQR Ig#LNp;Pbzi`jYf/p%ƇEׯY+z-$iu1 -K2|+3phc" QӃ8[ۺ VCD#)S<]Hyh^j{GBM#e%.#6EU=8QjI J58FƸ\0|Q!YVIi8؅@2 cR4)}w33Xk=Q?iFr"Jo]*>#.lqޚ@d Y߾-fr{XzymT kՃ1nHza \E` w B;bǝy%g7%TlTޘ*ğWʓH|8ēHwAgJ򜰞l!`.e>1(A|P3pL)k|cuk0D2U^ '>T3Z$T]0` Օ"ݧl^.wRHUgi\uqRZAD*)4MEY5&\H0߱ddaH^~(Q:՞::ɫ_h͋K;e<{"Ь@TJ*O/vga{PrF]|ҭGh'~S@'Krٶ [ҧd4]ۄNMe=Ίd$UI_?'>fG6]˯#==•KCY"Ϸd!{eMV~/:g%}c|-48\\OY؉w.Ĉ}^~pP@]լ 2b$Bf}OyUU&]L{Y)1oyBIwЛ3e~r3C3$_?AWUJYQ6BbW^Y!zHa7EtWs$ʷѥ R7W$ͅƇH( =Qm%?G*gNI{sn`qN˔ʡFOܯz?(aW ğIWN!W%晔*/NdWbV8$}&N5KFYzBeTZ.ɠu xbMj`:JO:xqgFocx~ie 2N2iGs.%a=Qg#I M8~-7ɧeٴd<+,,e4IkIkShJ͜5ݯ"͖~CȧkώEhꊲn4F{ ?܎-ҿdVTjCAڍݶJ#)L*WP'=o5;qݥov.a:{ț1p< :Sk'rF9s#9gjtf_  0/^Nr&奸YW@crwߖ( / o{\E IVvI:LItM8j 1& ObTըwTi3>*̓ ^tJč[q+dIEr}Që׬Tض \,XȮyV``V`* 6F>OM}EzJ2a5YQ*ʝAlAvDKoS4ҾAkb$=㈅ VR?c ٱYqd H++pS^CJw`A8(R4N{,A^kc/n֥%},sv"#$뙊8MwNVz̾7Bp-g|I])2!{ycV;*^..rh㔮4T/Q|?rYTtqt)wT endstream endobj 1617 0 obj << /Length1 1425 /Length2 6356 /Length3 0 /Length 7320 /Filter /FlateDecode >> stream xڍTTkPn@ifbfAJAIFJCBPTqιw{׬ͷ]glz H;* JF` (*qr1?0 #R-@ `2F"(tG $.D@ɿ()2 nh 04wt` @ n0 A!'# 0DB0J8a0RB7xW 8 `h fIqf&D 0rH7`W8@c3<0`~ $ܟ쟅_(A+ % W4]!v؀_'T,?PB]RY{*{% A<2bWd]HowI]`!0GpJ<0F_NO p`?"?4 ?AA@$ c_] /Ts8?$@7,x /tX-@gKy UOW_n_ᆸ]}`6 5^em=?`  GAbB@8 1PBkpL`aa}UP}A Dc?vMa> B 1c"9VVo°S )v 쎝PO =_ -"a5aU Lނ"b$}QGU>(ɜ}}x^s㳷EJ.\]WK.Ե^u{'?N)3ZSfG(ޑv`H~N`c&sSMN{Bĸ1 %$Dq2^(V+LMoGwn^[,1mmkenM}Qv0[{)'u1䵕 v[J,FO*#}SqTKsjS$|$rdӫzh=7ɏ2K=~vCuн~`ג3 =C+bfFxaeX݀N/AopQ$u)Ьs7:jhc ӣ5P'ξ5|ynKlt9#8cCrڎwU,u5;bjIh|b'bD 9ZQXì^G[ĕ @zr3e*VF-NUV~/q$OMbvdg/يF'u XʃiuòFujs-GSJgb9iY]MY<ε8wZ_#C>SSnX܆8aL51>N0jJ7S7Z.DX sY3O[*]7Hb9[ne'Ry>h}bvrp8: xv<֣W3'hR'Տ8C6హ/I'3uܛcZS]923Y7TUftYlS@_uI\% "t {{5'>{;|dvLv'Ty1tz3q78۵ WI0Egջc`HAōPZTm^[Jֻp~M<6 1HY4Cc ae^"AsW_즇̒5L;9mv.o-R*SI~kܬjnjy]gJUJ+ң15rW0; ڛEm+}'#ַuR5K@+;.%kfjľ fcB??,m|netpOWQTܓЕ#fUzw>[f5ː^}|PBy=yRlظ5Ki2PΉ' kמF3D5-{R+wbwJ‹~#T-شzǐYpe4%/  QZ7Zs+DŽ"ػ/JB&MT sO[}6Jfal@WG@MqY.ե!M%Xe;;>\xfGK(XiYӜί eJ{?b̛&oѐM y J'B_ڝ}&j"}bg0H"Ixv]$eKо31"v^zGq|靳I<-Y2%6zT !]ζa[_Ɏgh2lح\07_]2؀g0U$jz}k9O: okd?u%ư2xfTj?i0 \\$nM>XX ̘Q)O6ai ls*6J|ͳ2E{]sJ fIHFjuy.EDQ]M(Z֖/qZA Pl#νFW jn!Nf8}Qtͅ!Px{k#*aspsb`I !wRvNۂgigYڎ~D4I  pQJxֹ3?,$uL+ogT" L@Z6ШB\X4`ηX)9B (!Ŀ)>b`.‹ѐ|z4%`ᓣ V,v\pU/4('Z7f3wiG8@؊41>ĩhaYe?dGY;vc>vI'!,{d~*C"&eP ꮑ52ל=vhU NznD ){L` t'BޑoqLF]B)֩ ,S^Yl^wR__anroUU^͒ԓt(!=tve hBwןk{AQ)tWΌЃAYhJU_ =k-<ڝs`#4lʔҚV?5Y{#QM(WWB9ei(]V0Q^ibڿRM2ƶ$E) Gx?0Rfg[1?]RY3/Տd4U,Ix;ޤ6m==ddNv̚Y^-Pl3R5+F 4 f#G$_)*G 'gw½e_ikS\[VuΟK%޼bgpwϬ+z:낎SS[$uJ[Moߌ2:`.:|N؛uSӒ•u?n~,JbBЁŶ[Rv^ ,lcyɵ!gI(3{:n/w߭VEQ(,HLF5EC&eCf/-$ɐjw"qkE6O`Y>\&2Ӿ7`F#6J輝$goe6-l\Lu1fÖYx]]%eѯ$t#|!g;zϣ\|L)?$ Np5a3#0oFU62fݟcnά23lT9 |X/\Ϧ!anckILnv,LG4| m칩 ׂvSfPqmwlߧ4(bX{T0:/.}DC}9);|dS6~}P~Mr<=g8  Y.rRؿ,0n2Ij}Nؓy~tVܖOd8ṌswMvv Fg>#[.-tVa2ɤ^j`-U}&v E8EVn0^ݪ !e{ T^k VbJS`ST%͓ L'mRHfM &)&ܲk2)򓑠߇?/|ʺLo8z*dڟX ڎ6eQ:'@)`S{6Pkݯi:lH:ѧİڝ2WjKQ}]?p{ \F?+PӘ$ݙMdrbXlxذ&P'd!sW糮fśIs0zn>H:^zj#)@dIGU/jqRNIAuݭ`Oem%uKDѝҪB2?<5j|PDu3DJd#ADŽt#eeW;< Y~'4ְE3H*y!,Fn"P300y܌Q@e͙c.sQ1Qh0@W#)ݮ65C RެOn"EqPT̵d52I;f?b/ x ?few9HuH>6mJyE9 }/oE*P9߆X^v#A,jQ4Xʛ93["Vܴ|uɢGEҚ[gr̵=T̵]_QX{{@·[K)Q*/!13u3\<_d ,l=]PO/  endstream endobj 1619 0 obj << /Length1 2791 /Length2 19781 /Length3 0 /Length 21367 /Filter /FlateDecode >> stream xڌP-!wwwg  ܝ@ K&{szYݽ{=PQVc57J۹02YY,,L,,l 刔@'gN@cLl`ouXXXXl,,5wH LY{;3"4V^^nDmN Sc;%fo x3;3-b P:܀f_ƶ1!R-AQٛ;` h >jgtdJ@ǀwqL/G :y,  @IJÅ`lg|dcl6+uc o~ΦN g&g/̿܀,ig&nok sqF h '͵w/2ٙaartHm!Y],,,O>Э]<ʟn=˾.Vs!=0FkD ,3ɚMHmz3gT68[wݼj:s7>kb+̱i*odYE5lZ&~RѮ7'|z2x,6NKć_2wԌP_ӛKIRj)3 C w7SpWX9;:3D@Yi[x sV#)(b5y0y\ )  r8B5o »Zae)oL'yc{I~XfDgKDZmҕȄsc.9 wi|({ڮ0G|tpmr{חF2@l~6-&'T(h:)2R{Z* I~e[ѹ!\Ց S\ҰFꨈ9nT55[=q7e0՜O䗢'ƒbG{+"u|4ZԻ abeNcyI:1,=*trI %RBF$ 4IpiHrhr(B9ʊ | jl"\rօ p_K29Z~!̹x 2.+q[Rp/6LW୅6Ė1q<8>Q) m4̧F4ޞ`_P Ekni׋#Snf7_r0WSW%$k40:r5+Ja)Ch^1x?uygr۔|0$ ߉]j{Hc.6۴65YudH~{PJ@PT퓾wt'i]PHx83cb?։6vmDd=G 8I-J0嬰El$ @nGĄ,1Y.yXfrQ~*jFg5UN1dg^P7HeזL#MYx7^y_%hyE3]S&_UU{ay47@er!t[|'cu< h  Q@g YF Uric>tb0+ZV*|玏+'Fu Cf>!(Ҳ/^͙o;u)B>,A}U(.X3>ww/7X#+!ivBͺ/NC5Nx=/e9 sUqBFA~1j}2yI+ϙ\<̥M$ܵާ3t#[[5z󚿲xd9) y0dL?Gqˍ|I[K|9u3v]"TkT^gTEW8zޗe4nHOi45@JMT{^D Sg"/`fQλu|GpN0N xԋ,l`y5e0{aG&,NtǗj@L'x}J{#䯺zN Ƈg2 e`.6A JɥǨNw&3zSˆZUɈV(y\:9Q0&Y*^OrIM>0 \ؒj Y<:9 ^Kx z@$6 g5 . f߇@-5V&7E'G-W*6oʷz!xK(0ZB62:”U;-nd0qe}<Í筸]IIm2 dCY [&b9C<>+ߤ'xn`Δ-|ڃT{;0:Fk: 9ɗu\a$.Wzp/`d͒6^ڊc.+/ׂX`~G7L*="TC8VC!W(jjfwt(NV^M^䃍=JGUԟR8˰0~`gGy&ST ecW٥òAS&}UshcU +O$%)@}; lϖfp{y'oA jm/U0]$*}ٽ' qHE/Ӧ Niq-@![$Y9&dĖuΤhCYkz'"N5AYʄ8<%:͸v-XSޏh]^f|]p>z',ͪ}`{=bNHX|Iyݼ]P,isESTuER=EUWg]x- s¼fJ$mmjϞu2s n֞'83rYyV\a,!a, 1TS9N ,lqTM !sοu^zZ8dl$ZuݵO|ʋ\8EIJ2TYkϘd5d4sbNy[vmz6dqA-t:ȤpZ@ WD/E^[2oBPԃ["U(f IJs 7$Sxz5n29R.1dtZ_u/ 蚳V{jOH跍ٺfNp=*K24b̷cGh~j8υk P= !-j<<@EE)MCՅ꣥Ksr8VaXd7lLKHVdq~J%^63% I;hU4w w$&s8= Jv<8ÏCeUo$B߳¶B3GlJf+&LgDT&2p-YoJ` &i~F O "۔yj ݜ4~ }kTffўW8}20&|a!~XM#/t9{#CUy^$pP~d2q{ޠvWl;OS6,4 (bx4CvP9O#%qUHFq 6ef^~~UAJ|al*hDm(wfrwξlQ*.q@QPq&>$~Gl&s 甸ѩH'?C5t5ĕAXD@R\I3$)yJeӚƯ~½!GlGad(+Iyp7D5q]2 l{I(f@9z7ҭnў,B d$E'*2Mjb2QsnKqghj 2 -" t B9 Ky)%ܢ#FB[f~o$yO 4EF_QJfrb#е!R)jP8Vk~i|^Ρޔ3*c/ 2gCTocWBq# 3}=}0tM+kU[:='&%.屬LM =ӏn7+-kc^ aHCScNp_7e4RxL-i_. n@gc\*7kdD(e M,trN$0rz57ؓA"#^:*_ _G# .k#/hsCI񦎔]rΊ,B˭Sa-a>-|Uh0tS^>Rn*i/G1 Aє}/ =_@:̴~Cޞ[ңYԬ t F״6%i!or61wV|N,5s5}KS.7m-U֘ʖB='v9\#U4a/ DPc<ӫb[.ZGZ}{w'E~|zj~cwe~whPom6KQzGI|6=1n)AV۴ QZ^Q^N/0'4,b!T%j< -p944N#ț*f(^#i\G CM@Y<'?LWٰ#/?[VTTFhղp'ږ!`+-d4n>wM]8C%ЕyBR[Nj  3V|V+W`:c1|cw_گ ,Ä^r%KZ/!@&g{?Q_K\|iJx  #,r51XBlR&ӚXՒNњۿWcgб|ӆRV9,D Ȏ]y-52(UdKLHY&.#[lTCC65,;Ϣ iH,hgw_WM &bKީ2RYPfk",boH᚝*{W-Oҍ7$5_jгȏdBZPǍllJOOpOs*L zIH:8 r<2;Ts,E"8=zBt#*;I^w9Qt! eY;J_W 6׈#o"od> W]!\Ӛވ,9LK lUM?N#j";0 aBkOAIOcSjڔ"l ul[-S^/~Iliz XĒpVMp*m:4+ = J"K!Цy @";~FBu=T`G3;՜ b@wS67DINUAPey<@mp̖qmiNXQ*zh}ѤcH$LHaaNáp{OVW*ځdMרlrq%r嬥7$+sO\1 G p끶IF?-Z޼#tf{Gֺt%_%W݇ڗ"r+Y Vp:Gu9PZf=d,xaשر@?s+$sySq<*=UxMse8Q>x`?L"d ߒ/o_]ʥ=/␴+O-Vg9S¸Q<ܾi=)/u7݃oϷu>lV19 z Ϝ9Aͪ4W,|E XȐ]cNcixyVIAQHDMtkډZ'nNmuiGlbT;aEDmڮoCVV&8d{wW M̡z2KNiDZa.@5M / ۛ%Ηvv/Ei7~ sMNi۰fBq|T#ɋece(hZҤW"JJșʠ ӕ?,^SL5KOT;ïjpHCS&sIǙV3r,P\2|(JELp%g]$Ў>T=W9sѥm@Dg+;v% ϱx=+v{bVO7A~΄7`ˬxNxNa.H kAB։/:/$y/ 2>*Å!ˏptOP*Yț #}=?A/N%w5/tX{2ZuoL3PTAz2h-p%L0QQ[3Pe]*FXn  MNuB/xYDg{,Y8*={ݛN,6Oճ (38}ɄrWxk6 AH$ Z8/fKJ06vhNq<HxGnbD 4'y!81)YR>-Xzig5uofpFyQZr(!@ 7A?K'M.'P'cAT ܲ+azO46q #j.JT`^&9^\`JJ/yl_ &;ĵԻv ^(=7., `JS/y'ULVRj|z!-m'V+-Iz,A7!]J|AmcAJDJCn(F 5z|P$n]jƇJ"@/PK+ObI@9+pۣZ'vr6zq ?-|0{XO__v)`xX%9Sb$|c<ݳXꍽN#i^%1ˮmX#AK Mr74GLY'.Firڼ9ϻݍEqxdk)7-O hcz&)F\GhoiQmNU\X4[/Y۬vu̘$ R\Bd5mYd߼4T7ž/v k~)#pHVA/1\J= !(QnP(7OHh *0Qj A+ ՜>>3fx(D>lfkIT7Ϫ~j?/)DST0qk1%.'bj+VJg{WKy6nYmj+zkXN_2€Mȼ&b|%C_3!@!xG]BE\0?\` ߷Ё.x7$^؟Lv@h:Zhpi|ZEt~Z VCVIg/-dztkdW⒎ vd{2:MQjljv=qi4e' J9` WŞi1 J燠nG }K?ߪc;iS'g< )(J?m]lF@NVI0NnڙmFLAu/ lgT'p jSۡTuT:ڥ;a~Bc RX?ʚL .@хLf9]%'^f*/cBu͟$r) Lo'}8Z/_D[[#*ĜjLCDzy ă$!*)a`o.DhZ^2y!>oYO3-W?:1bg~I@\U oo3vpAc}7CG?&0y g&aL4Vבr;\$,HxW0fQٯOyZ Q81QO"o3zy_|Im˼T߂W5=qjF.{=vM^~IAvvzm:虣́0sc>Tf7Ms5FW p|Ԙs>\ZT8+nDzkw1)X ~8M 薘.J{Τ1ch8{Mĥ~..1'aGm<BL!C{C7ŏ{HD;ZsNK4,4Sxfs$Mjy?7:x {*a#)IQ"CUh`+FWl]1vdcبAP-ޱ/]} N8}I oRqg,?gHYO&蛂K5=\7VT#?"r?Kzi:@g.6qq2ҪzQjmLߖs_Н,A860&GEƄ8{mbG]XZt6F)؉CՇ?(VdOK> F۫%A$% HW#L/*U.=F퐻XsՅV0{܄75R9 0ކ FIs*s(@54y5kPDI{Dޘ 0croSb= R4 NI|3x^K.z,S !UxͰy[jM-ݚz~K.{_#g$VIAf_.+ :CNS#a%]2Yi6gR2]՜tO_~ou;6dIlvM|lja&f VRrS{'%G'$?\UޥUu:i S_1]W~8U٥Tpw [`m8ڏѠ1<#2N%_ʮ`/fJYaQSD29@39Pޗ,oּ->Zů,E^.2x?m7Ec߳ĎQz֎NHR~W)[÷E^]M[ؽi\K͔uaRuR>d[Co}\JKQP$u ;;R>s#ɡ!#Bl1?b%MfbҚ~M eZNQ`' 8LNCLM zG:AZUPrAMx;{𶺶aikG~u%G+ i0JFdUf\|oo@դ{S* קgZ Z:=FfLzDvGs *_~ -.YH3Q~RaFpXHF@ ɳ/_gmC ;3s_$ܨïʚqDn{w M(=8=|"<7(J`)ؚ !CC1K3~8{83#v䷫bCA3{> !=5XEa˞ >f#(_S+Lk @Q1A(U-%wѷ77M՝h˥TYte0wVEG(9SvhC A'Z`?HF/(NE\Ecv1𫊻?C0 >*)\v RT4$nh+;'_b`=clM gy`n{1^:6j5hs6HS_0g9aCԷm,*_Jɲ! f:]t:G_6};̿# u͝F*-06kM,O|]0>1EZ܂W|`)z!ՂJS w+${e7AtY6}e3+(vr3V:Q7/0 M.x[V<5kPMYl5*9}'4S$Mɳb|@,Yt Mjۓx͑9g:iI9HLgaN.77RTdϟ;\o8$\2+nvqɩ.7sA{E©= tZɮNk! a{c5x$&(w1Qɾ+@OSN>Gn.C/Ł K$/?>W[[&fG@ 퓇xI3hTjdZZ*!p'\lLf/ ޖtφת,^#4Ó([|]=_N:oH[w?6P{$F'j>6#emv4Bxwf*7Hܢ8-"y9➂TW}^,8(wW]`jc*@*aT~L%`mԩnk@Y[K|GUYf  <'Se؏Ba/Ca0 t 0IZeuWVNL F-203!,A~k^M[y;/삽/\,&aTDovR}>6cLq_MA6?iM"RjA/\̉FVf}CL0/Ŋkj)m'|y#w 7?~Aram¥5-tmqݖ''?[cQ)l;ә0YarK*_i/0⛺O)EO/".g7>FO7yg^d7|''/;X8+چzXnٹǠD`yZ̬}U ]9p\MP-QjK܉^BFhFf zM3wKҡO޺հ5vx2V9)c ΒYC-;קٟ MKSk_Llҹ a& zNI9Ÿ=V7F1o{+%ȅZgX\Ʊlw8b#p"ydEA_< %_k>8iqh_nA[tU\uCK7o){%iۧ==V|8Վ P ]A:a.BO~.eɶ; ӗ}{fd #0,]ZvW4"Pz*'8޵>hJþش$vll)4-6-)# ł6_B;s][uiY%Tn{RS} +WDGxw6,[q?";J6%WVdepx<ƙϵ }ú;MX:?pVj[]G̞| 1zߙ&xfv$6*SgVյբe7||_tQ*UTb;屍.K>I!"~Ñ & D^Y&oc5.JW#SvpM.r5-;#I@ZөwތeQq=v\XcKzDRr6~x%p(dk~/pLi|]{r&%]ǤIqypT>c67K# {̆ Aķaf _+YC[I/'ԩ(`#`VZ5l:L8}Uv+NxJ[r@%DV+^2X!F Re<^vu[{Xbݮ"픵=3A$DtNZ%C7gbT@lfQs7V((^C ViWBoƶWL&6$,:>|`7/1§k$>ƇBoS/.VNf<0OiZk^Yۄ FMC"Qf˃TZE0ɢ晴VkI}ћ0H^I} ώXq֔IrT"z+˜;5Κ /z.N?Uk&aMɓH#|cg7ަ9wzfH:̯ېC)1fbk5L"sG_[2$N\3޽s߮ V"'BѤFC ^t'w)6!ٝ#X7=7Ѻ'LTB4j :0?Φ52*y*8C@h4{⩌n^ʅjY1`FM:41mDm#-'Tޏ;64j/T3E:Y#] |D"$b{OF{:T%mq L#FJ}3`Yԫ7h`oԆݣ<ba|x -x=Ts>ðk"͗-H"O୍v{Wfg+wv S3-b*(JS~PR_(RN:Q<qSObot0c2 {`tNzY|`%`nʞ$]v Q=ufپb#ƷlaX/4W EbT n2>#-]-EPw;7wsC%DIb{ܫ&%eTSŚ]˜8[l pJNZ2TQ'MxGfjcKk#tjNb,pǻۃtTNjւ:AQ64@Rv]]%@܉ã E'.LWv.gG%*EFg4bxD%@[7R zd ̶kRaV\:^5K\*ACLPq蛪cSSE8tHo?+Y ЃIv\/;n~G/CՐ6zuJU0 0@ Gl6]C<dj~*c/Z/qfh;6l@KPMI*,M?'!xSMscGBS &Nq)s#L!c2d37֔ĸDBȬd8)bX6jE&!,qpuM oC DžK GTi(u mW>qGk -ewD4>[}Q~u%b:5>J.hŠǁpeHɧj~\ͶZHqOJ=H(8ڪN^*^ZTsUXcڒ:Z)?cևW,fWowVTuN/~OX|Jaىe{SBUL:eɽAUr}ٸ{i^v`FjWus$D\`+4s ?cbGcKINՊO!jwa0yP֥iܓ |:j{5}q35 ޠՁުu_i=NEo9wrߘLcu LaG`C'r2aKBQMn4=" E6hbde麜 ,@!Z R!^=SYgr<Zq\ޢ4C M?.yڅ2!w+a",~&Cw$I쇼BF 78 4BX%AIJ8Q;k:ʀ+XDw r4#Iis)ʇIм*3.^ՖX3=sƄ7ᄔȚs=# b#dF\@%-UFڞ=)eS1 CL16tC$\m=%ZG滒 (Q|=qLaD"{&s P)q4^ےN3XNY6 SdBv("W }viC6DtCvوeMG6Hx1ʕf,]g>U|Gz(w.PA |w&@Y;>ohq2{G#Ŵ.(fJhKIЋp*ƎCN?MIeni]'AjEC*&tm8VLb~|Rq^ |RKxMvj>M[|ό 9WF IL J?5 ؘp&G䶡|ͪJ\@Q!}Pt͑9$"Sc$%n&fk2c*X )8/pM`RRiY6C#$5ӹ?ajCTOf[sT@v[TaMQ":~iݺ z V&i쨗(0&Zf̣w3br`a:?&>둣nN-,U< u;Ϝ& y<`] y5ͽ@N+"SڸVLʉ6`lw T^TS%@ץ2atk,AoĮ,ERȸp^qrA2Ue iƅgꆊ s?yc}zXD?)ߡ쓗k,s)39ߠ6P7B/|̰wK1Tɐ2Լ:>2QK} [=BJQTȟ椰 q}_)y{GdV[565 K+ne`/_(s4[+Y\qtwR˅\YϞx,WqoWxO>WzB[e] pk ^dCTBL5_9;=XrutFԴXyD!-kTny {Y]uKIw&`c_;i>wTPu1 YK`AY_ENgOqزfu>5!wL{ʧW]iՃm,iY%IE|˛+n8uF:0ʥJMVNǍzwHQ0;#L8l] /V>^敢0Ef|BCx5#DΝpǎƘϾ5E>ڟdw%|9їAGN-< _!rv2 \ǩidX!ssxPZsGHY0I 4]gU# ?%fW_ v5iWgX;]Cl&̢r17sb.GA wQAԙE5Ě_Lh~vޣ6$¼F\YXAav 17ZκϹ< Sp\K?xwwV 1aH#ɲ<%< pk%}!_KsVjg̓ͅllZbm㧾vPEn'%A/dnRMQtDY5>یnBAj}#ɫBITnzT#P񚲁H{]DwZZzSt) e,IpX+QnngZ E7sRv,?l_%ӔxݘKPV[Mkݫ/wQ9s&IlX;~9RQA7A+ )JLjY++]Zɒq[CAUF$g # =XO:J8 O(-)Py+_M 3#F|$:{3RȀoP(rC(-DkF0~H.% DƟ}{C<2Ȟø PF: ĉ[аjoà1 @ۛa„|шԃO uY~2K&U{zZnhɊՙ,?I`}>%&{R{$ K> stream xڍt 4mؾ0Y-ٗ03[N1K33 FEe'%KRCd'e!Kh}gΙ^IQk;]4cD"R0M@`ʊ0DRO%`~!'0d DO I-HDԇ&\M`0_$&`ţ EDP $/2 Ap 5t@CƣDIa<($#_2Z8*K SDzRI3Ge?<b(/ lI,!=O#a~H2 < C)>D4 ;s Cl#@y8\gDH^H?x \JH"z+I|/O@ۭ##] *"㽨E E!OVx2?zI~ODcd}ljxoc; ` nl;[fPCy/e`X 9OAb*p~o4E1gDvЌ4 m}~s' M"o_1á;H4PPRVJ*_ڷH`LXCxvd K# ]N330 ~+-uۑxp}fX 7c-0h&T$!3i5mO̯k x"ƚDo7\9Pva!EBoB@H /%8wm6U$` $2dJ54(j˴ "f~Yzw@8J*3;  B@I; ҎV ;y)@D@Rvن(ʇLߚO~0"- yR+0֦ް0j(;aE9#Gx{i6K=Ny]H.v#ksq*Dse/u:d:o4֒*c.v=_]]!BvE^nJ ʂNLդ%pC_<=CfہZC2Bd)7T Y>Vb!A䲙c(^"w"gKޓaR kgZ /{-~frdռ2 njm'J$qk~q6`W k=y餚4s~zaiAC;7]a9_A >?ȹcWߨ')t\jWYL.57|[^=>վ׋K(2(Nns:9Of|gEr`YkNdY.{Ebjus$+1jUl}S{+E͹JR RN gǝv8A^a4 #*E. 4Z|{xCfYP/BzVz7nGF>y'y7$,fpYBǧGJ孆[%@WӂEt.%jL}4Gd֏T%MޓLnW?9"=rkJW6dhgxuލ5 }{HCX]Dஎj8`,Lя_-kD9X~%vd[$et*(&ۂ0gv]T5 }&FѿõH0ݹ27C:2Łs1=uSsBe}Tii& xC@qU IJV<1[w>TaR.|<Rpd곙uh1ֱLtYL} =͚ 0]v4{⍯骙A{ \XtiXf@ctKz^3״|Y- nɧ,e_ c(5(p{;7jmB콬[$?c }')kܨ2:wt>>m\"yO̯IG_A~U o43)FIqC1W.3a áh{w[rd %2ouq^z'Rx=5#vR) +5^^ٲsUZ*܂?-03 =h s}p[R~yOxhʛ$W@XA.|<߹UׯGEQ_э1' Zs=ʎ/RzERx*V11zk(:6b:Lx*l2_~DN _;c᫉U+Jl<hSR{(|ͪ6E'bw}gʽ%y=HFPtzn_"j]T؊wK~W{ƨǽԗ-_v4*2dPx0i6JV}Uu>G+M6ڇ)h†kNiEE6^)cVpwY.=(e)4zÿs.E')mX MI_QMBBLME\OK.AEch%/~?| 6քan{eeE 6j{v{&K2Ou4ԹE޳lwv``Ӓxd)`ђPZFn6^En#qsmA k5~~9W}>za0}6'蝋nc9lP7hF$^9W(a-\_ӺӾkꯨJj };OԼV۾ToN VGhv>9u.L9ERHƸ;b$e"DCTڻVvs܌r1anC߃a"tWF"c&R['{&mG& /4*)_o=02׫[{lf)nwdP)!QyЗ[PĆ]P2MxP];9CvŜnڝ79?pLu ^ Wckoe =P}o,F۳*eU;\|[p!A4/ ̙,8`KkX;?X~x0ƿbs)n"H?D }U9o3@~Cio̹P&Mg[[D}*8eu2o_r+xSoU5lS^[E NCӝ𩴦7`7-]Z{25!_WD[ųu8q_/=5zӣ~BݱO<|iɳ;f@>w[>x鲕x%>Pcm=]Pi͇+ҕKj)ڗXo}CD}cgnbk [ mh~d>%R{%#IQ#0.9JCH-g3)ZD[7dȋr. fjm}/#P8PhP9;p]^-=%Y;_z&]r md Bګ̽—9Ƙ]asqNJDV2|rWSDn\)8wB-os3]Y.tޥy"L8&I eq%ǬbXv_hOjPHea=fd?ѹnNj|a {v{Cxi%{oqU alLtSs,C endstream endobj 1623 0 obj << /Length1 1644 /Length2 3392 /Length3 0 /Length 4421 /Filter /FlateDecode >> stream xڍt 4}~RH$Pdl%],!z3f coQd/lI(Kd{-I$R3̽}_ODL'ۃdMG*)G"Ѭ""f9 R2I A:M, 3$D%dQrH$F"~:)&֓ I2 h|(G'T_@ P r[pX`9PEqW 1e'Mc]p2Q&xhN)H)  a]"]oFvya) )HB$u!H~? ᆰ =@=.2H$R^ sBl7qM5 ύ8@ Q @x~XQ(O{Б@bReh7`_B“ID[EXkkXꘈG˦N$eIdKw>=PO?H!``A@7m2H?+,ېe۲?f+" : C2tZ<\kգaHjA sڢ%@ىhB6_@D]zMЪL tLW"ͫCX ÊȅPyA-^8LB]@n.TA@`7U[V6g'//Ŷ=RS^~w6pX{r%-3*O0|pjMsʔʵ'ځ.'Z|kbC/So_9$#<~2RS\c3)Fv$E\"_Jz)ÿ|juGG7W;L0wD?Gިp{-(|:io7ߎć8c+sPiVv#vI˥&kօk"QA]&UIYvT"|e)ḎWзEW8{ZaU/"ژ\99I{?fεOͨ}H|ypgJ5<ړ|-Vή5*MNwjwkO*hK6U!0:1f)9Ş%/Ou,6^jz|NKyibqTbηrΚ~fK&s5% H93jR=/pY?z rȽs~ڨEڻBާwG”F웧E RzJt: GJmJũL:W݋غwhEE |XnaahdCor x.gS8:_<Mnz򍮖 xWv\M_R'&2 ̋)U #)6/y| ɮ4Ï*8M(l6뤶%fքĥx}p|HvX;jV\ AN63= *Jl*d#_*οvV8K#Y!2y_l|<۠{ BUvHGM4  Mc{խqk"NqG*tO(`K̜C))ӫ99. 5z|,觊m w) Ƣ ,GN8)ˌX5kΗo?hݸ_'A}Zz&B/gW^f2_nr8cB]*kqUY#yWIkp|6GwQwDӂeo]u'D~lT}o[N/#7wk$}ckMkV3#{ci=!1k˵N*6g(&&s32%P=;h5k501) |fN{I*Rȵ/RWѸn<ͩ^euG"`+ gd4>ϜOB ni& *i ׿f9ۼrQg衢Cw?61`Z6~~r Ha\F+=XAyZfDd:cO-3 X7 S =\'lha%,Jd&aeYzdהh3pt\4kڙ{C0R]tzE\}4Q>\CX}/om&ųQIRBo|^p+ tMCupp_NH1^,{5_ܔ`qrXv~틿þ q_8<c-n7Q”`՛]t ;TŬ ;(F~1)T7ktgv%aFYF&*p~ng譍{ZXyncH֬i]xjՎ^K^jM\y,w"O~ԗ}Kn}T4R8.!gms*ͳ >݁xlͅ s7rzƮirE8<θWrT(qyGcD9 [/;kQdá<'C/> stream xO%i*:ZP$5Sv0kk X@iⳎY䬓 >2÷X :ŢL^!M@Z:yXDI3Z1 FPE%Y . j.Mzpi8/Dư|PJѤNLj2P`gВ"SΠ5"˂&4R% % 3Pp =jžAt1 D\IK+,x`Ʒw B8 +5"J1F}W!vѼA ud4z$ V& Ȣ=1]{wx V!@hL+P5 5 ]QCXkV. ʁTF@S67$(] )asxwE$E/SaJ62ϲ wYt"xFIk3ev&Cg{!z 4Id`=rfuhފa#!(l qS0Lx{҈g%<@*yo0I̸˙aSG;vX0+Cy!{"kOѐi,A:zohsĹ>L!QQq3_J&>Jcl=Sy{Q1>yuK|Z7oY! BTz2@`hmmFLk&7#$kLA];R˟n=Y3;HYWKxXrOt9IMi_GM4@ -)* ss'*ԂO79ȸǖx_S# ן3L2![Vq]L`ǔGohLt,`hn7C~h>ۼBIygD)fe-ReHK EnWRdi ͐GXzA98GuO Ϻ92I'`?(T2=gP2cb)K |s77P7ya_la)[G|Se[10GHptہG:kݜJ O6j3`,Ђ(m'=!kL':ai9)KhoyE;33.VޱĪ,(/ ^d".@дcLxYW6m/kiުM&: KH^O齣pc5,E ~6uip#f>kLT;]i-]^>RWJ=0̓E-a8;^S95t|&: ܈1Q' {^4SGa9VlGYK;e i2 uo/X:`hhCkݚ<Ц&uqٌw,=bFA%)F;=MϬk=lzeD|ptt2Mpt ҼĿec+SZY6D?9 h !Wh];[rXK,zb{ǞxU]ˋ͓zq\߼=>~=>|VIxq,x{y = Tfxq^~ d(||8[~|x>ѹ'E/qC<cD$S\" q$^_+q,^q"ފwXxyvy|!NE-/N/ħ%Z D/W"}K?Oq&ŅX^R\WU}qV0"Wjyy*ήzYXu Yo˪ۥ_7]-%U.M|o4+Y?g?=9A)0I3~gϲJdOua4.ilzהGm7nRg''dϧNyK[ּp'4n fBsl@f:+U!#ʩʦSYNSЅFʾ%9RYū-%.J>DM'Zߋa.9ܨkncT8No븼M.|F93 gƝ­t7坱lss'NջVWp޲6ܮZ9juU*-72tjӧr6z2s]#JSND$R&jP)z;ekhoM65/SE.z;eߐxIs3۠{Z픎=:zrZlOA+. )RZ6{iwR-9(^\Bsq,N^zC6lY_Tہt=\+n۔^_󏗫z?U7?p 4t8!Ҧ ,xW[TB<>yԞ (=YNfQh/|CQTmGŶDA?lAGuo/j{f/ Mq\7(xZh4˚K[- R7s["ءO"lݓmIi b]%֖q(& 0G_@@R -n C[z10-x;p@~+m*;WZ?Poqߊ>[Fq}yrW۱c~x`;\/e)@]jK{C2-08l ӏqA;{WU0z+yg[a3% -oo_ z 5vr{¾0J^ߍ%F_A ӓ!;[1 0+uDNU1ގIU%*2dMy&♨clIe6v$Vn ͈ 5d\ʈo8gl~ﱲ2K tdG)]XL 0 ߁9,2 M=QwaXY Y+I]޳ܨ ԐS@yC&Ph|]|fW9ܼ٘YeK7[%[mzsUb1鉉vrgMcs9xuF[lm 4!LL_DSW);S4:_!fu:+7KgQTgxij5fx^^-w깡I vRvnfSWn)ͬ֩9bGaL.lGKӢ:խtwIsC+&AκAG߱4,Y_՝B ($FF*iV9(y.'B硠戩ܸgbaas8 <ޛ=O1O.rGkL.۹YZ=s1sNѲƬ:kYk[ףeFhvg{;fj3k{ӳ}W}bbͬ{Yfݕfgm{7c*ֳ=1wXYǺZھWX=]=jzA=nRQV{IMZU/)k endstream endobj 1675 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.14)/Keywords() /CreationDate (D:20160531122152+10'00') /ModDate (D:20160531122152+10'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) kpathsea version 6.1.1) >> endobj 1629 0 obj << /Type /ObjStm /N 96 /First 879 /Length 2899 /Filter /FlateDecode >> stream xڍZ[o\ ~8B݀ vvf"N2p<=._g45qb#%ؙD3v؜W g@Mq oDoLQ͒C\MB @6@.O )ph )_Yv!vѢ K٢]*sLvHByٴ`R`fII9g0)1&<1)rr嘔.K(Ǥ\vi\a"  yĽ`B! xFd 0U_1]U"GLz '/DY@rJ)S\?!`j3BHk !%K xL(@SDTİzI "O[HENKC}H`ʖb7%;ꂈg {K.b P ۈ5*($Cd)0GL8EQe1 ReԴ9Q64a<Ӳč aX-?H_zuuqG|toGnI{Zu-yc5mi>%5_ _F/+WE)}aU_9N:#Fq ۇcc#!AZPr11A,"bV4 DȤђZZEV /Q.WlnWOdE9jU yW(Bc;lmиAc0]kE 檅͕ 62Vhey˗e æ/Q[DQV׊6p{7~]4]cnEgY\r,ʢd5mUfcpVӊ`+Qi5Jhi#z“ps Yf67/&q_':SnBmt+vĶy3)_ioES M'/`寇ço%3>ʻ{u<}9<=>g?n??=pW-dd00/r*jPwn +eiA SF˹&w(:)Xh ]B%SO:'4h:븾yG4+sDcpN # rtfA% p'Q$,NV5H.$:!z;گ FVV953?n}K}%z P^Hrq&E;$(ghoE;u=/]3ӱMmcI'xnVܝ +͝Ab&,%oPJ} s__.]3y&@}[*]~}Tr}(@탷*j>}{zHOϴA*jCE*} ϼO5VC*PY O(u-ϳ5|b'|b%6Vd1|@6_ŚQpjoh~xswL_~ޓ;}~/y>%i}5g/7w^]}wo^5T{rLB?0kM endstream endobj 1676 0 obj << /Type /XRef /Index [0 1677] /Size 1677 /W [1 3 1] /Root 1674 0 R /Info 1675 0 R /ID [ ] /Length 4277 /Filter /FlateDecode >> stream x%yt\yj/5WyF,KdYem^dyIX^)p@C p I)4tH@fzJ$H~G]tw/ > B ?yyd3`@s8 gW0,%<+Q,r~`C\?"nwx^/ou 3f'O_Ϟ9W]i1`X%ul.Q%*3D`fi,Q%aF+ ZR]k8h|y_o:t˳yNֺ WnHr ʱqǮ&,&Ǿɱo翝[dză}gksx'{gޯq:1FɷCyyG'CaC:D^uXXhLa 2uW6oߤ˼wuWIc^*3֚W{~nVμ%kUzS4h^Ŋ6Rhȼ+h^섢ag+1E` M`3 L` v` L=`/`̂H`G1@%gΡzfR>*uD1eTS"Ǟ5o7j;j^Eu}:޼QtY}PtY}PtY.PoY- 63H}BWE_p X V^:jN^ւ~`,:\Gy߯x#7 wvy~$},k60}P7V|G!+ Ғ9EX {Ȋ[dXVmV@s Kigy  @E.\,;.!KOB }Ng)ҳUT "`XŠZܱ_~g"WnqrRf.fk>vn7ȍks9.PZiTTem-rˊzP @=X@#h@K>@@En9ydNi7XcTo_E|NiEJߺ}{X}(`l`+u8ЇIL`i 춲~t̂`JFfa i҅V\C iUJ;XɎ9`4ZZ;n3Jʾo!'SҞ{ZiUīJU:bUkG.@#k*ت>ߥT4k5تߘUTb5TQ%U[KJK"P*>>i>i>i>&~wiU>_W*1{U𱫀hZV;Xinhx9WdJ"y2'ӼҼ ac uX;k$$ tZtDKݤ-Zu(_P֡i7j\MG1t5{ Ҙ?M( mN0h锢 =ZhȢgݡhE?uEFHS.i%=nںɢwlѻVŢ{rE_S4aמV͢]7iw4u;-]m~q)t*6C3,"mr+͘fOJ-MwvՊ1+($nF!ShmgԔ?ޘþO9aflph!~ 97+4X"/["_դh׮UP`Š]N[̿}N zOQ~^QٰjEEO+1W*5ՙz_%fO/Th*j2[}9gŬ&JQjJmVE@hҖ V tՠ t5>u``OSÀij+M:̀hj+聦:~gj7˙6S{~@35^z$S'SGe:d5'Op 9!qqNGj|Q[w,EbK> Y96'梠TY*j;,jzL@0vjߺI[\o_)cc,sˬJcsiCchs mn՞s]V+!kh?#뷆ָi3ȹ^kXy4|:bԚ6 [s*7S>d=Tt,Sk ƭOU-t,wNK9լa* ArjV39g,,m=D3Sc9gSԝ> sַ7>γX*iaBfamU_Ydu@zڪ.q5~խmV[lkj.hffA4uf-6qPw)Pk7t7Iҷ\Nh'WvOT2΢|7PO0G hN.wЭ=;8(Xoϼ]IڮÀfŮvc;1t `7f+NjI:?t,7Hvf1Wf8j}hy6`epD&l}ʕL Xאּ6)"-2,dǵ,V*e N+Z?sLihKҰT[dϯIc)^x?xWF,(9V|vRi甪8_)$l𕏔 tkeC?T}l+ֆ{[d܃[)KVqijo-0Tf؆LzdJf /ܔpId 4`*iVm*2$#g[xx@!-hC /%6|W+_ܣF*.RTn#[U;U 1EU63mFEQN)mtz\Q^[Q:}fz5#mjnU$  F0lc^]\XIjկ֝м#Z'e|Η#VIRkZת"Mn%$]vU}-kS Zҥ*8HVZ{b;oAZ5$f9{2g?_* endstream endobj startxref 4518535 %%EOF 3Depict-0.0.19/docs/manual-latex/manual.log0000644000175000017500000006161212723172505017772 0ustar pcuserpcuserThis is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) (format=pdflatex 2016.5.5) 31 MAY 2016 12:21 entering extended mode restricted \write18 enabled. %&-line parsing enabled. **manual.tex (./manual.tex LaTeX2e <2011/06/27> Babel <3.9h> and hyphenation patterns for 2 languages loaded. (/usr/share/texlive/texmf-dist/tex/latex/base/article.cls Document Class: article 2007/10/19 v1.4h Standard LaTeX document class (/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo File: size10.clo 2007/10/19 v1.4h Standard LaTeX file (size option) ) \c@part=\count79 \c@section=\count80 \c@subsection=\count81 \c@subsubsection=\count82 \c@paragraph=\count83 \c@subparagraph=\count84 \c@figure=\count85 \c@table=\count86 \abovecaptionskip=\skip41 \belowcaptionskip=\skip42 \bibindent=\dimen102 ) (/usr/share/texlive/texmf-dist/tex/latex/preprint/fullpage.sty Package: fullpage 1999/02/23 1.1 (PWD) \FP@margin=\skip43 ) (/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty Package: graphicx 1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR) (/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty Package: keyval 1999/03/16 v1.13 key=value parser (DPC) \KV@toks@=\toks14 ) (/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty Package: graphics 2009/02/05 v1.0o Standard LaTeX Graphics (DPC,SPQR) (/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty Package: trig 1999/03/16 v1.09 sin cos tan (DPC) ) (/usr/share/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg File: graphics.cfg 2010/04/23 v1.9 graphics configuration of TeX Live ) Package graphics Info: Driver file: pdftex.def on input line 91. (/usr/share/texlive/texmf-dist/tex/latex/pdftex-def/pdftex.def File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX (/usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty Package: infwarerr 2010/04/08 v1.3 Providing info/warning/error messages (HO) ) (/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty Package: ltxcmds 2011/11/09 v1.22 LaTeX kernel commands for general use (HO) ) \Gread@gobject=\count87 )) \Gin@req@height=\dimen103 \Gin@req@width=\dimen104 ) (/usr/share/texlive/texmf-dist/tex/latex/url/url.sty \Urlmuskip=\muskip10 Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. ) (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty Package: hyperref 2012/11/06 v6.83m Hypertext links for LaTeX (/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty Package: hobsub-hyperref 2012/05/28 v1.13 Bundle oberdiek, subset hyperref (HO) (/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty Package: hobsub-generic 2012/05/28 v1.13 Bundle oberdiek, subset generic (HO) Package: hobsub 2012/05/28 v1.13 Construct package bundles (HO) Package hobsub Info: Skipping package `infwarerr' (already loaded). Package hobsub Info: Skipping package `ltxcmds' (already loaded). Package: ifluatex 2010/03/01 v1.3 Provides the ifluatex switch (HO) Package ifluatex Info: LuaTeX not detected. Package: ifvtex 2010/03/01 v1.5 Detect VTeX and its facilities (HO) Package ifvtex Info: VTeX not detected. Package: intcalc 2007/09/27 v1.1 Expandable calculations with integers (HO) Package: ifpdf 2011/01/30 v2.3 Provides the ifpdf switch (HO) Package ifpdf Info: pdfTeX in PDF mode is detected. Package: etexcmds 2011/02/16 v1.5 Avoid name clashes with e-TeX commands (HO) Package etexcmds Info: Could not find \expanded. (etexcmds) That can mean that you are not using pdfTeX 1.50 or (etexcmds) that some package has redefined \expanded. (etexcmds) In the latter case, load this package earlier. Package: kvsetkeys 2012/04/25 v1.16 Key value parser (HO) Package: kvdefinekeys 2011/04/07 v1.3 Define keys (HO) Package: pdftexcmds 2011/11/29 v0.20 Utility functions of pdfTeX for LuaTeX (HO ) Package pdftexcmds Info: LuaTeX not detected. Package pdftexcmds Info: \pdf@primitive is available. Package pdftexcmds Info: \pdf@ifprimitive is available. Package pdftexcmds Info: \pdfdraftmode found. Package: pdfescape 2011/11/25 v1.13 Implements pdfTeX's escape features (HO) Package: bigintcalc 2012/04/08 v1.3 Expandable calculations on big integers (HO ) Package: bitset 2011/01/30 v1.1 Handle bit-vector datatype (HO) Package: uniquecounter 2011/01/30 v1.2 Provide unlimited unique counter (HO) ) Package hobsub Info: Skipping package `hobsub' (already loaded). Package: letltxmacro 2010/09/02 v1.4 Let assignment for LaTeX macros (HO) Package: hopatch 2012/05/28 v1.2 Wrapper for package hooks (HO) Package: xcolor-patch 2011/01/30 xcolor patch Package: atveryend 2011/06/30 v1.8 Hooks at the very end of document (HO) Package atveryend Info: \enddocument detected (standard20110627). Package: atbegshi 2011/10/05 v1.16 At begin shipout hook (HO) Package: refcount 2011/10/16 v3.4 Data extraction from label references (HO) Package: hycolor 2011/01/30 v1.7 Color options for hyperref/bookmark (HO) ) (/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional ) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/auxhook.sty Package: auxhook 2011/03/04 v1.3 Hooks for auxiliary files (HO) ) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty Package: kvoptions 2011/06/30 v3.11 Key value format for package options (HO) ) \@linkdim=\dimen105 \Hy@linkcounter=\count88 \Hy@pagecounter=\count89 (/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def File: pd1enc.def 2012/11/06 v6.83m Hyperref: PDFDocEncoding definition (HO) ) \Hy@SavedSpaceFactor=\count90 (/usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive ) Package hyperref Info: Hyper figures OFF on input line 4443. Package hyperref Info: Link nesting OFF on input line 4448. Package hyperref Info: Hyper index ON on input line 4451. Package hyperref Info: Plain pages OFF on input line 4458. Package hyperref Info: Backreferencing OFF on input line 4463. Package hyperref Info: Implicit mode ON; LaTeX internals redefined. Package hyperref Info: Bookmarks ON on input line 4688. \c@Hy@tempcnt=\count91 LaTeX Info: Redefining \url on input line 5041. \XeTeXLinkMargin=\dimen106 \Fld@menulength=\count92 \Field@Width=\dimen107 \Fld@charsize=\dimen108 Package hyperref Info: Hyper figures OFF on input line 6295. Package hyperref Info: Link nesting OFF on input line 6300. Package hyperref Info: Hyper index ON on input line 6303. Package hyperref Info: backreferencing OFF on input line 6310. Package hyperref Info: Link coloring OFF on input line 6315. Package hyperref Info: Link coloring with OCG OFF on input line 6320. Package hyperref Info: PDF/A mode OFF on input line 6325. LaTeX Info: Redefining \ref on input line 6365. LaTeX Info: Redefining \pageref on input line 6369. \Hy@abspage=\count93 \c@Item=\count94 \c@Hfootnote=\count95 ) Package hyperref Message: Driver (autodetected): hpdftex. (/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def File: hpdftex.def 2012/11/06 v6.83m Hyperref driver for pdfTeX \Fld@listcount=\count96 \c@bookmark@seq@number=\count97 (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty Package: rerunfilecheck 2011/04/15 v1.7 Rerun checks for auxiliary files (HO) Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 82. ) \Hy@SectionHShift=\skip44 ) (/usr/share/texlive/texmf-dist/tex/latex/placeins/placeins.sty Package: placeins 2005/04/18 v 2.2 ) (/usr/share/texlive/texmf-dist/tex/latex/wrapfig/wrapfig.sty \wrapoverhang=\dimen109 \WF@size=\dimen110 \c@WF@wrappedlines=\count98 \WF@box=\box26 \WF@everypar=\toks15 Package: wrapfig 2003/01/31 v 3.6 ) (./manual.aux) \openout1 = `manual.aux'. LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 14. LaTeX Font Info: ... okay on input line 14. LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 14. LaTeX Font Info: ... okay on input line 14. LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 14. LaTeX Font Info: ... okay on input line 14. LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 14. LaTeX Font Info: ... okay on input line 14. LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 14. LaTeX Font Info: ... okay on input line 14. LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 14. LaTeX Font Info: ... okay on input line 14. LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 14. LaTeX Font Info: ... okay on input line 14. (/usr/share/texlive/texmf-dist/tex/context/base/supp-pdf.mkii [Loading MPS to PDF converter (version 2006.09.02).] \scratchcounter=\count99 \scratchdimen=\dimen111 \scratchbox=\box27 \nofMPsegments=\count100 \nofMParguments=\count101 \everyMPshowfont=\toks16 \MPscratchCnt=\count102 \MPscratchDim=\dimen112 \MPnumerator=\count103 \makeMPintoPDFobject=\count104 \everyMPtoPDFconversion=\toks17 ) (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty Package: epstopdf-base 2010/02/09 v2.5 Base part for package epstopdf (/usr/share/texlive/texmf-dist/tex/latex/oberdiek/grfext.sty Package: grfext 2010/08/19 v1.1 Manage graphics extensions (HO) ) Package grfext Info: Graphics extension search list: (grfext) [.png,.pdf,.jpg,.mps,.jpeg,.jbig2,.jb2,.PNG,.PDF,.JPG,.JPE G,.JBIG2,.JB2,.eps] (grfext) \AppendGraphicsExtensions on input line 452. (/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv e )) \AtBeginShipoutBox=\box28 Package hyperref Info: Link coloring OFF on input line 14. (/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty Package: nameref 2012/10/27 v2.43 Cross-referencing by name of section (/usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty Package: gettitlestring 2010/12/03 v1.4 Cleanup title references (HO) ) \c@section@level=\count105 ) LaTeX Info: Redefining \ref on input line 14. LaTeX Info: Redefining \pageref on input line 14. LaTeX Info: Redefining \nameref on input line 14. (./manual.out) (./manual.out) \@outlinefile=\write3 \openout3 = `manual.out'. <./figures/CoverImage.png, id=345, 1312.905pt x 974.64125pt> File: ./figures/CoverImage.png Graphic file (type png) Package pdftex.def Info: ./figures/CoverImage.png used on input line 25. (pdftex.def) Requested size: 469.75502pt x 348.72903pt. LaTeX Font Info: External font `cmex10' loaded for size (Font) <12> on input line 38. LaTeX Font Info: External font `cmex10' loaded for size (Font) <8> on input line 38. LaTeX Font Info: External font `cmex10' loaded for size (Font) <6> on input line 38. LaTeX Font Info: External font `cmex10' loaded for size (Font) <24.88> on input line 39. LaTeX Font Info: External font `cmex10' loaded for size (Font) <20.74> on input line 39. LaTeX Font Info: External font `cmex10' loaded for size (Font) <17.28> on input line 39. [1 {/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} <./figures/CoverImage.png>] (./manual.toc LaTeX Font Info: External font `cmex10' loaded for size (Font) <7> on input line 2. LaTeX Font Info: External font `cmex10' loaded for size (Font) <5> on input line 2. [1 ] [2]) \tf@toc=\write4 \openout4 = `manual.toc'. [3] <./figures/compilation.pdf, id=460, 489.83pt x 262.58101pt> File: ./figures/compilation.pdf Graphic file (type pdf) Package pdftex.def Info: ./figures/compilation.pdf used on input line 77. (pdftex.def) Requested size: 328.82707pt x 176.27693pt. Underfull \hbox (badness 3260) in paragraph at lines 82--83 []\OT1/cmr/m/n/10 Open source pro-grams are [] Underfull \hbox (badness 6477) in paragraph at lines 82--83 \OT1/cmr/m/n/10 only the ex-e-cutable code, [] pdfTeX warning (ext4): destination with the same identifier (name{page.1}) has been already used, duplicate ignored \relax l.88 N ote that there are restrictions on what may be done with the program, ... [1 <./figures/compilation.pdf>] LaTeX Font Info: Try loading font information for OMS+cmr on input line 104. (/usr/share/texlive/texmf-dist/tex/latex/base/omscmr.fd File: omscmr.fd 1999/05/25 v2.5h Standard LaTeX font definitions ) LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10> not available (Font) Font shape `OMS/cmsy/m/n' tried instead on input line 104. Overfull \hbox (3.63295pt too wide) in paragraph at lines 115--116 \OT1/cmr/m/n/10 Assistance with this pro-gram may be freely ob-tained over the In-ter-net at []$\OT1/cmtt/m/n/10 http : / / threedepict . sourceforge . [] [2] [3] <./figures/interface.png, id=779, 1026.83624pt x 682.55pt> File: ./figures/interface.png Graphic file (type png) Package pdftex.def Info: ./figures/interface.png used on input line 148. (pdftex.def) Requested size: 399.29463pt x 265.41231pt. [4 <./figures/interface.png>] <./figures/tree-layout.png, id=786, 804.39651pt x 578.94554pt> File: ./figures/tree-layout.png Graphic file (type png) Package pdftex.def Info: ./figures/tree-layout.png used on input line 165. (pdftex.def) Requested size: 281.85587pt x 202.86365pt. <./figures/camera.pdf, id=788, 579.76598pt x 383.834pt> File: ./figures/camera.pdf Graphic file (type pdf) Package pdftex.def Info: ./figures/camera.pdf used on input line 191. (pdftex.def) Requested size: 328.82707pt x 217.70413pt. [5 <./figures/tree-layout.png>] [6 <./figures/camera.pdf>] <./figures/spectrum -raw.png, id=879, 1199.48125pt x 848.16875pt> File: ./figures/spectrum-raw.png Graphic file (type png) Package pdftex.def Info: ./figures/spectrum-raw.png used on input line 221. (pdftex.def) Requested size: 399.29463pt x 282.34259pt. <./figures/console.png, id=882, 1199.48125pt x 848.16875pt> File: ./figures/console.png Graphic file (type png) Package pdftex.def Info: ./figures/console.png used on input line 238. (pdftex.def) Requested size: 399.29463pt x 282.34259pt. [7 <./figures/spectrum-raw.png>] [8 <./figures/console.png>] [9] <./figures/ra ngeDropdown.png, id=907, 954.56625pt x 804.00375pt> File: ./figures/rangeDropdown.png Graphic file (type png) Package pdftex.def Info: ./figures/rangeDropdown.png used on input line 304. (pdftex.def) Requested size: 399.29463pt x 336.30525pt. LaTeX Warning: `h' float specifier changed to `ht'. <./figures/rangedSpectrum.png, id=911, 1087.06125pt x 625.33624pt> File: ./figures/rangedSpectrum.png Graphic file (type png) Package pdftex.def Info: ./figures/rangedSpectrum.png used on input line 323. (pdftex.def) Requested size: 399.29463pt x 229.70096pt. LaTeX Warning: `h' float specifier changed to `ht'. <./figures/rangedSpectrumCloud.png, id=914, 1087.06125pt x 625.33624pt> File: ./figures/rangedSpectrumCloud.png Graphic file (type png) Package pdftex.def Info: ./figures/rangedSpectrumCloud.png used on input line 3 34. (pdftex.def) Requested size: 399.29463pt x 229.70096pt. LaTeX Warning: `h' float specifier changed to `ht'. [10] <./figures/quickStartConcLayout.png, id=924, 1373.13pt x 905.3825pt> File: ./figures/quickStartConcLayout.png Graphic file (type png) Package pdftex.def Info: ./figures/quickStartConcLayout.png used on input line 346. (pdftex.def) Requested size: 399.29463pt x 263.27258pt. LaTeX Warning: `h' float specifier changed to `ht'. <./figures/quickStartIonInfoLayout.png, id=928, 869.2475pt x 629.35126pt> File: ./figures/quickStartIonInfoLayout.png Graphic file (type png) Package pdftex.def Info: ./figures/quickStartIonInfoLayout.png used on input li ne 360. (pdftex.def) Requested size: 399.29463pt x 289.10176pt. LaTeX Warning: `h' float specifier changed to `ht'. [11 <./figures/rangeDropdown.png (PNG copy)>] [12 <./figures/rangedSpectrum.png >] [13 <./figures/rangedSpectrumCloud.png> <./figures/quickStartConcLayout.png> ] [14 <./figures/quickStartIonInfoLayout.png>] <./figures/generic-filter.png, id=953, 4353.20471pt x 2563.45941pt> File: ./figures/generic-filter.png Graphic file (type png) Package pdftex.def Info: ./figures/generic-filter.png used on input line 385. (pdftex.def) Requested size: 399.29463pt x 235.12141pt. [15 <./figures/generic-filter.png>] <./figures/tree-propagate.pdf, id=963, 1518.55293pt x 800.81699pt> File: ./figures/tree-propagate.pdf Graphic file (type pdf) Package pdftex.def Info: ./figures/tree-propagate.pdf used on input line 404. (pdftex.def) Requested size: 399.29463pt x 210.56586pt. <./figures/Stash-operation.png, id=965, 1068.99374pt x 608.2725pt> File: ./figures/Stash-operation.png Graphic file (type png) Package pdftex.def Info: ./figures/Stash-operation.png used on input line 426. (pdftex.def) Requested size: 399.29463pt x 227.20132pt. [16 <./figures/tree-propagate.pdf>] [17 <./figures/Stash-operation.png>] [18] <./figures/rangeedit-clash.png, id=1289, 1609.01125pt x 825.0825pt> File: ./figures/rangeedit-clash.png Graphic file (type png) Package pdftex.def Info: ./figures/rangeedit-clash.png used on input line 488. (pdftex.def) Requested size: 422.77664pt x 216.79514pt. <./figures/rangeEditOverlay.png, id=1292, 1609.01125pt x 825.0825pt> File: ./figures/rangeEditOverlay.png Graphic file (type png) Package pdftex.def Info: ./figures/rangeEditOverlay.png used on input line 500. (pdftex.def) Requested size: 422.77664pt x 216.79514pt. [19] [20 <./figures/rangeedit-clash.png> <./figures/rangeEditOverlay.png>] <./figures/exportanimDialogFilterView.png, id=1310, 1380.15625pt x 800.9925pt> File: ./figures/exportanimDialogFilterView.png Graphic file (type png) Package pdftex.def Info: ./figures/exportanimDialogFilterView.png used on input line 522. (pdftex.def) Requested size: 422.77664pt x 245.35957pt. <./figures/exportanimParamDialog.png, id=1311, 1376.14125pt x 801.99625pt> File: ./figures/exportanimParamDialog.png Graphic file (type png) Package pdftex.def Info: ./figures/exportanimParamDialog.png used on input line 532. (pdftex.def) Requested size: 422.77664pt x 246.38904pt. [21 <./figures/exportanimDialogFilterView.png (PNG copy)>] <./figures/exportanimDialogConflict.png, id=1320, 1382.16376pt x 801.99625pt> File: ./figures/exportanimDialogConflict.png Graphic file (type png) Package pdftex.def Info: ./figures/exportanimDialogConflict.png used on input l ine 542. (pdftex.def) Requested size: 422.77664pt x 245.31215pt. <./figures/exportanimDialogPropString.png, id=1322, 1237.62375pt x 763.85374pt> File: ./figures/exportanimDialogPropString.png Graphic file (type png) Package pdftex.def Info: ./figures/exportanimDialogPropString.png used on input line 554. (pdftex.def) Requested size: 422.77664pt x 260.93065pt. <./figures/exportanimDialogFrameView.png, id=1323, 1237.62375pt x 763.85374pt> File: ./figures/exportanimDialogFrameView.png Graphic file (type png) Package pdftex.def Info: ./figures/exportanimDialogFrameView.png used on input line 568. (pdftex.def) Requested size: 422.77664pt x 260.93065pt. [22 <./figures/exportanimParamDialog.png (PNG copy)>] [23 <./figures/exportani mDialogConflict.png (PNG copy)> <./figures/exportanimDialogPropString.png (PNG copy)>] [24 <./figures/exportanimDialogFrameView.png (PNG copy)>] [25] [26] [27 ] [28] [29] LaTeX Warning: `!h' float specifier changed to `!ht'. [30] [31] [32] LaTeX Warning: `!h' float specifier changed to `!ht'. [33] LaTeX Warning: `!h' float specifier changed to `!ht'. [34] [35] <./figures/voxel-representations.png, id=1434, 1615.03375pt x 1027.84pt> File: ./figures/voxel-representations.png Graphic file (type png) Package pdftex.def Info: ./figures/voxel-representations.png used on input line 1114. (pdftex.def) Requested size: 422.77664pt x 269.06708pt. [36] [37 <./figures/voxel-representations.png>] [38] [39] [40] [41] <./figures/externalProgScilab.png, id=1484, 1686.3pt x 847.165pt> File: ./figures/externalProgScilab.png Graphic file (type png) Package pdftex.def Info: ./figures/externalProgScilab.png used on input line 13 61. (pdftex.def) Requested size: 422.77664pt x 212.38535pt. [42 <./figures/externalProgScilab.png>] [43] [44] [45] <./figures/externalProgPython.png, id=1505, 1465.475pt x 856.19875pt> File: ./figures/externalProgPython.png Graphic file (type png) Package pdftex.def Info: ./figures/externalProgPython.png used on input line 15 42. (pdftex.def) Requested size: 399.29463pt x 233.28014pt. [46 <./figures/externalProgPython.png>] [47] <./figures/externalProgBash.png, id=1517, 1385.175pt x 876.27374pt> File: ./figures/externalProgBash.png Graphic file (type png) Package pdftex.def Info: ./figures/externalProgBash.png used on input line 1616 . (pdftex.def) Requested size: 399.29463pt x 252.5886pt. [48 <./figures/externalProgBash.png>] LaTeX Font Info: Try loading font information for OMS+cmtt on input line 167 3. LaTeX Font Info: No file OMScmtt.fd. on input line 1673. LaTeX Font Warning: Font shape `OMS/cmtt/m/n' undefined (Font) using `OMS/cmsy/m/n' instead (Font) for symbol `textbraceleft' on input line 1673. <./figures/externalProgCpp.png, id=1524, 2123.935pt x 839.135pt> File: ./figures/externalProgCpp.png Graphic file (type png) Package pdftex.def Info: ./figures/externalProgCpp.png used on input line 1681. (pdftex.def) Requested size: 399.29463pt x 157.74715pt. [49] [50 <./figures/externalProgCpp.png>] [51] [52] [53] [54] (./manual.bbl [55]) Package atveryend Info: Empty hook `BeforeClearDocument' on input line 1926. [56] Package atveryend Info: Empty hook `AfterLastShipout' on input line 1926. (./manual.aux) Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 1926. Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 1926. Package rerunfilecheck Info: File `manual.out' has not changed. (rerunfilecheck) Checksum: 5D9DF5F8101C21D1BE54E57385EA4596;5634. LaTeX Font Warning: Some font shapes were not available, defaults substituted. Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 1926. ) Here is how much of TeX's memory you used: 5703 strings out of 495028 86896 string characters out of 6181498 165302 words of memory out of 5000000 8626 multiletter control sequences out of 15000+600000 13156 words of font info for 46 fonts, out of 8000000 for 9000 14 hyphenation exceptions out of 8191 29i,11n,28p,1058b,447s stack positions out of 5000i,500n,10000p,200000b,80000s Output written on manual.pdf (60 pages, 4523074 bytes). PDF statistics: 1676 PDF objects out of 1728 (max. 8388607) 1296 compressed objects within 13 object streams 214 named destinations out of 1000 (max. 500000) 816 words of extra memory for PDF output out of 10000 (max. 10000000) 3Depict-0.0.19/docs/manual-latex/manual.blg0000644000175000017500000000155712723172474017764 0ustar pcuserpcuserThis is BibTeX, Version 0.99d (TeX Live 2013/Debian) Capacity: max_strings=35307, hash_size=35307, hash_prime=30011 The top-level auxiliary file: manual.aux The style file: unsrt.bst Database file #1: manual.bib You've used 7 entries, 1791 wiz_defined-function locations, 493 strings with 4873 characters, and the built_in function-call counts, 1680 in all, are: = -- 137 > -- 98 < -- 0 + -- 35 - -- 28 * -- 136 := -- 288 add.period$ -- 22 call.type$ -- 7 change.case$ -- 6 chr.to.int$ -- 0 cite$ -- 7 duplicate$ -- 63 empty$ -- 153 format.name$ -- 28 if$ -- 363 int.to.chr$ -- 0 int.to.str$ -- 7 missing$ -- 8 newline$ -- 38 num.names$ -- 7 pop$ -- 13 preamble$ -- 1 purify$ -- 0 quote$ -- 0 skip$ -- 20 stack$ -- 0 substring$ -- 109 swap$ -- 7 text.length$ -- 0 text.prefix$ -- 0 top$ -- 0 type$ -- 0 warning$ -- 0 while$ -- 13 width$ -- 8 write$ -- 78 3Depict-0.0.19/docs/manual-latex/manual.out0000644000175000017500000001300212723172505020006 0ustar pcuserpcuser\BOOKMARK [1][-]{section.1}{Foreword}{}% 1 \BOOKMARK [2][-]{subsection.1.1}{Introduction}{section.1}% 2 \BOOKMARK [3][-]{subsubsection.1.1.1}{Background}{subsection.1.1}% 3 \BOOKMARK [3][-]{subsubsection.1.1.2}{What is Open Source?}{subsection.1.1}% 4 \BOOKMARK [2][-]{subsection.1.2}{Requirements}{section.1}% 5 \BOOKMARK [2][-]{subsection.1.3}{Platform specific notes}{section.1}% 6 \BOOKMARK [2][-]{subsection.1.4}{Getting help}{section.1}% 7 \BOOKMARK [2][-]{subsection.1.5}{Who wrote this program?}{section.1}% 8 \BOOKMARK [2][-]{subsection.1.6}{Alternate documentation}{section.1}% 9 \BOOKMARK [2][-]{subsection.1.7}{Helping out}{section.1}% 10 \BOOKMARK [1][-]{section.2}{Basics}{}% 11 \BOOKMARK [2][-]{subsection.2.1}{Getting started}{section.2}% 12 \BOOKMARK [3][-]{subsubsection.2.1.1}{Licence}{subsection.2.1}% 13 \BOOKMARK [3][-]{subsubsection.2.1.2}{Installing the program}{subsection.2.1}% 14 \BOOKMARK [2][-]{subsection.2.2}{Understanding the interface}{section.2}% 15 \BOOKMARK [3][-]{subsubsection.2.2.1}{The Filter Tree}{subsection.2.2}% 16 \BOOKMARK [3][-]{subsubsection.2.2.2}{The 3D View}{subsection.2.2}% 17 \BOOKMARK [3][-]{subsubsection.2.2.3}{Plot area}{subsection.2.2}% 18 \BOOKMARK [3][-]{subsubsection.2.2.4}{Console}{subsection.2.2}% 19 \BOOKMARK [3][-]{subsubsection.2.2.5}{Tools panel}{subsection.2.2}% 20 \BOOKMARK [2][-]{subsection.2.3}{Usage fundamentals}{section.2}% 21 \BOOKMARK [1][-]{section.3}{Quick start}{}% 22 \BOOKMARK [2][-]{subsection.3.1}{Loading data}{section.3}% 23 \BOOKMARK [2][-]{subsection.3.2}{Loading an analysis}{section.3}% 24 \BOOKMARK [2][-]{subsection.3.3}{Ranging}{section.3}% 25 \BOOKMARK [2][-]{subsection.3.4}{Spectrum}{section.3}% 26 \BOOKMARK [2][-]{subsection.3.5}{Composition profiles}{section.3}% 27 \BOOKMARK [2][-]{subsection.3.6}{Counting Points and measuring volume}{section.3}% 28 \BOOKMARK [2][-]{subsection.3.7}{Concentration surface and slices}{section.3}% 29 \BOOKMARK [1][-]{section.4}{Understanding the program}{}% 30 \BOOKMARK [2][-]{subsection.4.1}{Filters}{section.4}% 31 \BOOKMARK [2][-]{subsection.4.2}{Trees}{section.4}% 32 \BOOKMARK [2][-]{subsection.4.3}{Stashes}{section.4}% 33 \BOOKMARK [2][-]{subsection.4.4}{Plots}{section.4}% 34 \BOOKMARK [2][-]{subsection.4.5}{Cameras}{section.4}% 35 \BOOKMARK [2][-]{subsection.4.6}{Effects}{section.4}% 36 \BOOKMARK [2][-]{subsection.4.7}{Program actions}{section.4}% 37 \BOOKMARK [3][-]{subsubsection.4.7.1}{Save}{subsection.4.7}% 38 \BOOKMARK [3][-]{subsubsection.4.7.2}{Undo}{subsection.4.7}% 39 \BOOKMARK [3][-]{subsubsection.4.7.3}{Raw Data}{subsection.4.7}% 40 \BOOKMARK [3][-]{subsubsection.4.7.4}{Export Menu}{subsection.4.7}% 41 \BOOKMARK [3][-]{subsubsection.4.7.5}{Ranging dialog}{subsection.4.7}% 42 \BOOKMARK [3][-]{subsubsection.4.7.6}{Autosave}{subsection.4.7}% 43 \BOOKMARK [3][-]{subsubsection.4.7.7}{Export Animation}{subsection.4.7}% 44 \BOOKMARK [1][-]{section.5}{Detailed Reference}{}% 45 \BOOKMARK [2][-]{subsection.5.1}{Data types}{section.5}% 46 \BOOKMARK [3][-]{subsubsection.5.1.1}{Ions}{subsection.5.1}% 47 \BOOKMARK [3][-]{subsubsection.5.1.2}{Plots}{subsection.5.1}% 48 \BOOKMARK [3][-]{subsubsection.5.1.3}{Range}{subsection.5.1}% 49 \BOOKMARK [3][-]{subsubsection.5.1.4}{Voxels}{subsection.5.1}% 50 \BOOKMARK [3][-]{subsubsection.5.1.5}{Drawables}{subsection.5.1}% 51 \BOOKMARK [2][-]{subsection.5.2}{Filters}{section.5}% 52 \BOOKMARK [3][-]{subsubsection.5.2.1}{Data load}{subsection.5.2}% 53 \BOOKMARK [3][-]{subsubsection.5.2.2}{Downsampling}{subsection.5.2}% 54 \BOOKMARK [3][-]{subsubsection.5.2.3}{Ion Information}{subsection.5.2}% 55 \BOOKMARK [3][-]{subsubsection.5.2.4}{Ranging}{subsection.5.2}% 56 \BOOKMARK [3][-]{subsubsection.5.2.5}{Bounding Box}{subsection.5.2}% 57 \BOOKMARK [3][-]{subsubsection.5.2.6}{Clipping}{subsection.5.2}% 58 \BOOKMARK [3][-]{subsubsection.5.2.7}{Spectrum}{subsection.5.2}% 59 \BOOKMARK [3][-]{subsubsection.5.2.8}{Profile}{subsection.5.2}% 60 \BOOKMARK [3][-]{subsubsection.5.2.9}{Spatial Analysis}{subsection.5.2}% 61 \BOOKMARK [3][-]{subsubsection.5.2.10}{Clustering analysis}{subsection.5.2}% 62 \BOOKMARK [3][-]{subsubsection.5.2.11}{External Program}{subsection.5.2}% 63 \BOOKMARK [3][-]{subsubsection.5.2.12}{Annotation}{subsection.5.2}% 64 \BOOKMARK [3][-]{subsubsection.5.2.13}{Voxels}{subsection.5.2}% 65 \BOOKMARK [3][-]{subsubsection.5.2.14}{Ion Colour}{subsection.5.2}% 66 \BOOKMARK [3][-]{subsubsection.5.2.15}{Ion Transform}{subsection.5.2}% 67 \BOOKMARK [1][-]{section.6}{Attributions}{}% 68 \BOOKMARK [1][-]{section.7}{Licence}{}% 69 \BOOKMARK [1][-]{section.8}{Appendices}{}% 70 \BOOKMARK [2][-]{subsection.8.1}{Paths}{section.8}% 71 \BOOKMARK [2][-]{subsection.8.2}{File formats}{section.8}% 72 \BOOKMARK [3][-]{subsubsection.8.2.1}{State file}{subsection.8.2}% 73 \BOOKMARK [3][-]{subsubsection.8.2.2}{Range files}{subsection.8.2}% 74 \BOOKMARK [3][-]{subsubsection.8.2.3}{POS files}{subsection.8.2}% 75 \BOOKMARK [3][-]{subsubsection.8.2.4}{Text files}{subsection.8.2}% 76 \BOOKMARK [2][-]{subsection.8.3}{External Program Examples}{section.8}% 77 \BOOKMARK [3][-]{subsubsection.8.3.1}{Scilab}{subsection.8.3}% 78 \BOOKMARK [3][-]{subsubsection.8.3.2}{Python}{subsection.8.3}% 79 \BOOKMARK [3][-]{subsubsection.8.3.3}{Bash}{subsection.8.3}% 80 \BOOKMARK [3][-]{subsubsection.8.3.4}{C/C++}{subsection.8.3}% 81 \BOOKMARK [2][-]{subsection.8.4}{Modifying the program}{section.8}% 82 \BOOKMARK [3][-]{subsubsection.8.4.1}{Development tools}{subsection.8.4}% 83 \BOOKMARK [3][-]{subsubsection.8.4.2}{Getting yourself set up}{subsection.8.4}% 84 \BOOKMARK [3][-]{subsubsection.8.4.3}{Changing stuff}{subsection.8.4}% 85 3Depict-0.0.19/docs/manual-latex/manual.tex0000644000175000017500000037210512716174467020026 0ustar pcuserpcuser\documentclass[10pt]{article} \usepackage{fullpage, graphicx, url} \usepackage{hyperref} \usepackage{placeins} \setlength{\parskip}{1ex} \setlength{\parindent}{0ex} \title{User Manual} \date{Version} \author{} \usepackage{wrapfig} \begin{document} \begin{titlepage} \begin{center} \vspace{3 cm} \Huge \textbf{3Depict}\\[1.0cm] \textsc{\Large Valued point cloud visualisation and analysis}\\ \hrulefill \\[1.0cm] \begin{center} \includegraphics[width=\textwidth,keepaspectratio=true]{./figures/CoverImage.png} % CoverImage.png: 1308x957 pixel, 72dpi, 46.14x33.76 cm, bb=0 0 1308 957 \end{center} \vspace{1.0 cm} { \Huge \bfseries User manual}\\[0.4cm] \vspace{1.0 cm} \begin{minipage}{0.5\textwidth} \begin{flushleft} \large \emph{Website:}\\ \url{http://threedepict.sourceforge.net/}\end{flushleft} \end{minipage} \begin{minipage}{0.3\textwidth} \begin{flushright} \large \emph{Version:} \\ 0.0.19, May 2016\end{flushright} \end{minipage} \vfill \end{center} \end{titlepage} \clearpage \pagenumbering{roman} \tableofcontents \clearpage \pagenumbering{arabic} \title{3Depict -- Visualisation and Analysis for Atom Probe} \widowpenalty = 10000 \section{Foreword} \subsection{Introduction} \emph{3Depict} is an open source computer program designed for the analysis of point clouds with an associated scalar value. The software is designed around interactive data analysis, with a view to combine rapid feedback, ease of use and flexibility in a single system. At time of writing, \emph{3Depict} is in the so-called ``alpha'' prototyping stage, and should be used where helpful, but may contain rough-edges. \emph{3Depict} is designed purely for post-processing of 3D point data, and was originally primarily targeted to users of Atom Probe Tomography. Other users (\emph{e.g.} in astronomical, geospatial or digital preservation fields) may find the program useful, and are encouraged to seek assistance. \subsubsection{Background} \emph{3Depict} attempts to fill a perceived need for freely available flexible point data visualisation. This program is designed to manipulate and modify point data in a way which the author has otherwise not found a suitable program to do. With this program, point data can be visualised using a fully implemented camera system, edited with directly interactive objects, and subjected to various analysis algorithms. A real-time plotting system is also provided to generate analyses of your data on the fly. External programs can be engaged as part of the system to create new analyses that ``clip into'' the analysis. \subsubsection{What is Open Source?} \begin{wrapfigure}{r}{0.7\textwidth} \includegraphics[width=0.7 \textwidth,keepaspectratio=true]{./figures/compilation.pdf} % camera.pdf: 578x382 pixel, 72dpi, 20.39x13.48 cm, bb=0 0 578 382 \caption{Closed-source programs only provide the final application, are neither human readable nor modifiable, and will only work on a specific platform. By contrast open source programs distribute the source-code as well as the application. The source code is the core logic which can be made to work on many platforms due to the invariance of the program logic.} \label{fig:compilation} \end{wrapfigure} Open source programs are programs which distribute not only the executable code, which is understood by the computer (so called machine code), but also provides the version of the program as it was written by the developers as well. This provides external users with the possibility of modification or verification of the program behaviour, either by themselves, or by engaging a third party. With the source code one can verify the correctness of the system, alter behaviour or otherwise modify the program, or even reuse sub-sections of the program elsewhere. Modifications to the program itself may include migrating the program to newer or older systems, adding new functionality, or correcting errors in the program implementation. To provide the user with these capabilities, the program is distributed with a so-called \textit{libre} copyright licence. The program is distributed at no cost to the end user, and the copyright attached to the program explicitly allows modification and re-distribution (copying) of the program to other parties. Note that there are restrictions on what may be done with the program, for example it is in violation of the licence to claim ownership of the program, or to use technical measures to prevent access to the program, or modification thereof. The licence used in the program is a generic one shared by many free (as in freedom) software programs. If you have been charged for this program, it is suggested that you request a refund and obtain a free copy from the main website, as listed on the front cover of this document. If you wish to have the full licence details (GNU General Public Licence Version 3 (or any later version)), please see the \texttt{COPYING} file distributed with this program. If this is not available, please see the project website, or perform an Internet search for the licence name. \subsection{Requirements} Due to the design of the program, the program should run under Linux, Mac, BSD and Windows machines. The program does not rely on CPU specific features, and thus should be able to be run under x86, x86-64, arm, or whatever. Basically, it should run just about anywhere. Every effort is expended by the author to ensure that the program can be run on as many devices as possible; if your platform is not supported, it may be possible for either you, or the author to generate executables for your system. See the section ``Getting Help'' for contact details. The minimum requirements for running \emph{3Depict} are not known. The author wrote a substantial portion of the program on a machine with only 4 and 12~GB drives, and a 1.6~GHz processor, which normally runs at 800~MHz and has 1~GB of RAM. There is no clear reason that it would not run on even lower-spec machines. Whilst a higher spec machine may run the program faster, intelligent use of the programs ``filter'' system may allow for complex analyses even on low-end machines. If you are experiencing 3D graphics problems, first ensure that other 3D programs do not experience the same problems. Otherwise, please contact the authors for assistance -- there should be no requirement for vendor-specific hardware. Note however that the exact appearance of the 3D view is dependent upon your hardware, and may have small changes between different platforms. \subsection{Platform specific notes} Note that whilst every effort is made to ensure that the program will run on a variety of systems, small system-specific quirks may be evident, particularly on platforms to which the authors do not use regularly (\emph{e.g.}\ windows). Secondly, due to slight differences between platforms some functions may be remapped to other mouse/key combinations. Mac: \begin{itemize} \item \texttt{Ctrl} keys may sometimes be mapped to the \texttt{Command} (clover) key. \end{itemize} Windows: \begin{itemize} \item \texttt{Ctrl+Tab} cannot be used as a key combination, as this is reserved for switching between user interface elements. \texttt{Ctrl+Alt} is used instead. \end{itemize} \subsection{Getting help} Assistance with this program may be freely obtained over the Internet at \url{http://threedepict.sourceforge.net}. Questions regarding use of the program, feature or bug reports will be attended to as soon as possible. Contact options include email (via the online web-form), or an online forum. If the program crashes in a predictable manner (\emph{i.e.}\ you know how to trigger it), this is a bug and needs to be fixed. Please report the bug in this case, so we can fix it as quickly as possible. If the program crashes in an unpredictable fashion, please still report it as best you can, and we will try to fix it if we can isolate the problem from the description. For advanced users, we would appreciate backtraces, packages, and any other relevant information in both of these cases. \subsection{Who wrote this program?} This program was written by D. Haley, in his spare time. A. Ceguerra provided additional development from Version~0.0.2 and provided assistance with debugging and fixing the Macintosh version, and providing executable versions of the program for OSX in 0.0.1. \subsection{Alternate documentation} For the more visually inclined, screencasts of the program have been created, and are available on the project website. These videos exhibit basic use of the program for various simple analyses. At time of writing, the only literature available for the program is this document, and the online screencasts. If you have questions, please contact us through the website, where we will reply as soon as possible. \subsection{Helping out} \emph{3Depict} takes time to develop, and no doubt could be better than it is now. However, this doesn't all just magically happen -- people have to put the work in. Development time by the authors is split between testing the program, reproducing bugs, coming up with new ideas for program changes, editing documentation, making pretty pictures, maintaining websites, and even developing the program. We would always appreciate assistance with this work. You don't have to be able to write computer programs. For example, we would like to translate the program into other languages. If you can translate a spreadsheet table into another language, this is helpful. If you can work out what triggers particular bugs, this is helpful. If you can improve this document, this is also really helpful. Of course, if you can program (C/C++) and are willing to help, grab a copy of source from our website contact the authors, because a little code goes a long way. \section{Basics} \subsection{Getting started} \subsubsection{Licence} \label{sec:licence} This program is distributed under the GNU General Public Licence Version 3 (GPLV3+), an \textit{open-source} licence. Information on the copyright of this program is available under the \texttt{COPYING} file in the program directory, or online (\emph{e.g.}\ \url{http://www.gnu.org/licenses/gpl-3.0.txt} or \url{https://en.wikipedia.org/wiki/GPLv3}). The basic premise is that you may copy the program, modify and distribute such modified versions or derivative works only under the same licence, whether a part or the entirety of the program is used. The licence forbids technical restrictions on users further redistributing the program. \subsubsection{Installing the program} The installation method for the program depends upon your chosen operating system. The most up-to-date notes are available on the project website. It is highly recommended that, in general, you do not simply download random programs from the Internet and execute them if a version is available in a trusted software repository. At time of writing (Oct, 2013), installers are available for windows, Debian and Fedora-like linuxes, and some versions of Mac OSX. \subsection{Understanding the interface} The program interface consists of three different views. On the left, there is the data, cameras and tools panes, with are used to generate data for visualisation, and to provide an interface into changing properties in a structured manner. On the right, the view is split into two sections; at the top, there is the 3D view. At the bottom are the plotting, raw data and console output panels. \begin{figure}[ht] \centering \includegraphics[width=0.85 \textwidth,keepaspectratio=true]{./figures/interface.png} % camera.pdf: 578x382 pixel, 72dpi, 20.39x13.48 cm, bb=0 0 578 382 \caption{Interface layout. The 3D view, plot panel and filter tree are labelled.} \label{fig:interfaceLayout} \end{figure} Each pane may be hidden, either by double clicking the ``sash'' between the two panes, by selecting the respective item from the view menu or by its keyboard shortcut key as listed in the menu. At the very bottom of the program, a status bar is shown -- here messages are shown to provide hints on how to use the program, or to communicate information relating to the program's internal state. \subsubsection{The Filter Tree} Understanding the filter tree is very important to being able to use \emph{3Depict} to meet your needs. The reason it is called a tree, is because it is a graphical representation of the mathematical ``Tree'' - where each node in the tree can have a ``parent'', or several ``child'' nodes. In \emph{3Depict}, each node in the tree is called a ``filter'' --- the filter modifies data coming from its parent in some manner specific to the type of filter, and the options chosen for that filter. \begin{figure}[ht] \centering \includegraphics[width=0.6 \textwidth,keepaspectratio=true]{./figures/tree-layout.png} % camera.pdf: 578x382 pixel, 72dpi, 20.39x13.48 cm, bb=0 0 578 382 \caption{General concept for the tree layout. Trees have ``parent'' and ``child'' relationships betwene members} \label{fig:treelayout} \end{figure} The filter tree is quite important in \emph{3Depict}, and the ability to change it is also a very powerful tool. You can copy, move (by dragging the nodes) or even store sections of the tree (by using the ``stash'' panel) , allowing you to assemble the tree in whatever manner you find useful to your analysis. Using the tree is discussed in more detail in Section~\ref{sec:treebehaviour}. You can also change the names of the filters to help you identify which filter is which, simply by clicking once on the label. The filter tree may, depending on how it is laid out, show small warning symbols next to the tree - these usually indicate that you have built the tree in a manner which may be either non-helpful (\emph{e.g.} the output of one filter cannot be used by the other), or that the configuration might generate misleading results. There are currently two levels for this - ``Error'' and ``Warning''. Warnings can be ignored safely if you know what they mean - for example you might be attempting to calculate the density of your point cloud, but you have only partially loaded the data -- 3Depict will detect this case and issue the warning. Not all incorrect configurations are warned about -- you must think about the construction of the tree carefully when working with the program. Different structures can generate radically different results. \FloatBarrier \subsubsection{The 3D View} The 3D view is used to show the three-dimensional objects generated during a data analysis, and provides a direct method of interaction with the 3D Scene. Through the use of the mouse (or other pointing device), the 3D view can be manipulated to change the view position and orientations. Some objects in the 3D view are interactive, and will be indicated by an overlay in the top right of the window when the pointer is on top of such an object. \paragraph{Basic movement} \begin{figure}[ht] \centering \includegraphics[width=0.7 \textwidth,keepaspectratio=true]{./figures/camera.pdf} % camera.pdf: 578x382 pixel, 72dpi, 20.39x13.48 cm, bb=0 0 578 382 \caption{Basic camera layout. Each camera has a position, an up direction and a target. The 3D view is as seen by the camera. Cameras may be saved and recalled to return to specific views. Try to realise it is not the object that moves, but rather yourself.} \label{fig:camera-basics} \end{figure} The 3D view represents your camera into a 3D scene of your construction; it is by manipulation of cameras that the view is interacted with; so you may zoom, orbit, pan, roll or swivel the camera view. If you are lost at any time, you may reset the view by tapping the space bar. To change the axis along which the view is reset, hold the \texttt{Ctrl} or \texttt{Shift} buttons whilst resetting. Double tapping the space bar will cause the axis to be viewed from the reverse direction. The basic 3D view consists of a ``target'' based camera, so when you move the camera, the camera will orbit around this target. To interact with a scene, hold down the left mouse button and move the mouse to control the camera. The basic keys for controlling the camera move mode (left click) are\footnote{As stated previously, mac systems do not use the Ctrl key.}: \begin{itemize} \item \textbf{No key}: Orbit camera \item \textbf{Ctrl}: Pan camera \item \textbf{Tab}: Swivel camera (Look about) \item \textbf{Ctrl +Tab} (Windows \textbf{Ctrl+Alt}): Roll camera around viewport centre. Note that the rolling motion is controlled by the position of the mouse click. \item \textbf{Space/Shift+Space/Ctrl+Space}: Reset camera bounds and position to look along X,Y or Z axes respectively. \item \textbf{+/-}: Zoom in/out. \end{itemize} For any motion, the \texttt{Shift} key may be used to increase the camera move speed. Scrolling on the window zooms in or out. For a perspective camera, zooming is performed by moving the camera closer to the object. For an orthographic camera, zooming simply scales the view, whilst holding the camera position constant. \subsubsection{Plot area} The available plots are listed on the right hand side of the plot view panel. You can select the active plot from the list. The items in the list take their name from the filter from which they originates name (there are exceptions to this rule, \emph{i.e.}\ composition profiles). Several plots may be drawn at once by holding down the \texttt{Ctrl} key when selecting the plot to draw from the plot list box. \begin{figure}[ht] \centering \includegraphics[width=0.85 \textwidth,keepaspectratio=true]{./figures/spectrum-raw.png} % camera.pdf: 578x382 pixel, 72dpi, 20.39x13.48 cm, bb=0 0 578 382 \caption{Raw data pane, with associated spectrum displayed. Data can be selected, and saved for external manipulation as desired.} \label{fig:raw-basics} \end{figure} Raw data is visible in the ``raw'' tab (Figure~\ref{fig:raw-basics}), and will show the output data from the selected plots, with the axis labels for each plot. The data can be saved to a file from this view. \subsubsection{Console} Each filter may optionally generate console output. In the case, a text area will contain messages from the filter to the user. An example of the messaging area, and the messages are displayed in Figure~\ref{fig:console-basics}. As can be seen in this figure, if a message has been generated from a filter, but is not the messaging area is not active, the console tab will display a small marker to denote new messages pending for review. The exact marker that is shown is dependant upon the operating system. \begin{figure}[ht] \centering \includegraphics[width=0.85 \textwidth,keepaspectratio=true]{./figures/console.png} % camera.pdf: 578x382 pixel, 72dpi, 20.39x13.48 cm, bb=0 0 578 382 \caption{Console tab, with sample console messages. The inset shows how the tab will appear if messages are pending whilst the console itself is hidden.} \label{fig:console-basics} \end{figure} \subsubsection{Tools panel} The tools panel offers several options on changes to the way the program operates internally. \begin{itemize} \item \textbf{Smooth and Translucent objects}: This enables so-called ``alpha blending'' in the 3D scene, where appropriate which allows for non-opaque objects, and anti-aliased objects. This mode alters the way in which objects are rendered in the 3D scene and is in effect a quality-appearance tradeoff. Most of the time you will probably want it set to ON. The program may render the 3D scene slightly faster if this is disabled. \item \textbf{3D lighting}: 3D objects do not look very 3D if you are only seeing them on a 2D screen. Computer graphics works around this by simulating the effect of having a 3D lighting source. This might provide minor performance improvements if disabled, at the cost of clarity of rendering. \item \textbf{Fast and weak random}: This setting is a program wide setting that switches the strength of the random number generator. However, for more robust statistical results, it is recommended that this be disabled when computing final values. When enabled, the program will use a Linear Shift Feedback Register using a maximal length Galois polynomial to generate numbers required for random sampling. This has the advantageous property of being a somewhat random entirely non-repeating sequence that is fast to generate, but having sufficient decorrelative strength against most inputs to provide the appearance of random sampling. \item \textbf{Limit Output Points}: This setting controls the maximum number of points that will be drawn in the 3D display. The internal calculations will perform the same computations, regardless of this value. This value allows for drawing performance tuning. Higher numbers will show more points, and will slow down the computation. Lower numbers will speed up the computation at the cost of visual inaccuracy. \item \textbf{Enable filter caching}: This alters the way in which the program processes the filter tree. Normally, the program performs what is known as a depth-first search, and propagates data generated by the program from one filter to the other. Intermediate copies are kept by the filters themselves to speed up recomputation. However, this strategy has a large downside, which is memory consumption. Disabling this will reduce memory consumption by filters, but will mean that any change to the filter tree, no matter how small, will cause the entire tree to be recomputed, including data loading. \end{itemize} \subsection{Usage fundamentals} Initially the program window will appear with only the default world axes visible. To provide a more interesting view, it is necessary to inject data into the program. To do so, select the File menu, and then select using ``Open''. At time of writing, only two formats are currently supported. Firstly are ``POS'' files, and secondly are text files, each which consist of X,Y,Z and a values (usually mass-to-charge)\footnote{For a technical description of the POS file format see Section~\ref{sec:posformat}. For a description of suitable text formats see~\ref{sec:textformat}}. To load a file, navigate to an existing POS file on your disk. If you do not have a POS or text file, small example files are available on the project website, on the documentation page. Upon selecting the file and then \texttt{Open}/\texttt{OK}, the file will be loaded into the viewport. Note that the entire file is not loaded, but rather a random selection of elements in the file. Loading this file populates a small treeview on the data pane (at the left). This tree is referred to as the ``analysis'' tree, and each item in the tree is called a ``filter''. The tree is responsible for producing the output data in the scene, and a good understanding of the behaviour of this tree is required to extract the maximum benefit from the program. Each item in the tree has a list of properties that can be modified. For example, the amount of data loaded by the ``pos load'' filter can be altered by selecting the ``pos load'' item from the tree, then in the grid below, entering in the new amount of data to load (you can set this to 0 to load the entire file). Thus, each filter can be individually altered to change its behaviour. However, each filter acts upon the output of the filter that is a ``parent'' to it (in the case of not having a previous filter, each filter will act as if it had no incoming data). Thus the arrangement of each filter in the tree is critical to the output of the program. In order to modify the layout of tree, you may add new and move, copy or remove existing components of the tree. Changes to the tree, or any filter contained therein, may be undone using the ``Undo'' menu item, or with the keyboard shortcut \texttt{Ctrl-Z}. Each filter's behaviour is outlined in Section~\ref{sec:filter}. More information on the tree behaviour is given in Section~\ref{sec:treebehaviour}. Note that with every modification of the tree, the 3D scene and any plots will be recomputed. The time of computation is dependent upon the amount of data that is to be analysed, and can be reduced through sampling or volume restriction methods. By default, each filter may cache its own output, in order to speed repeated computations. To delete an item, simply select the item to delete with the mouse, and then use either the \texttt{Delete} or \texttt{Backspace} keys on your keyboard. Note that clicking on an already selected item will activate the name edit mode. To exit this mode, press \texttt{Escape}. New items can be added to the tree by selecting the filter to add from the dropdown box immediately above the tree. When selecting a new filter to add; an element in the tree must be selected, where the new filter will be placed. If there is no item selected, an error will be shown in the status bar. Once an item is added, the filter tree is thus modified and a recomputation of the scene will occur. Approximate progress on the filter update is visible in the status bar. During an update, only limited interaction with the program is permitted. An update may be cancelled at any time with the \texttt{escape} key. \section{Quick start} Several quick notes are provided here as examples of how to perform specific measurements/calculations. Whilst this is not an exhaustive list of measurements that can be made in \emph{3Depict}, this section is targeted towards new users who wish to use the program to perform quick or common measurements. \subsection{Loading data} \label{sec:quickStartLoadData} To load data, one must first have data to load in the form of either a "POS" formatted file (see Section~\ref{sec:posformat}), or as a text file (using english notation, four columns - see Section~\ref{sec:textformat}). To load the data, use the Open command in the File menu. Alternatively, one can drag and drop the file onto the program. \subsection{Loading an analysis} You may have an existing analysis file, which you can use to load both the data, and any associated analysis information (plots, clustering, clipping, etc.), which for example may have been undertaken by a separate user. To load it, you require a ``package'' from the previous user, which will be a folder containing a XML file, and any data files that are required. As for loading data, you can either directly open the analysis with File$\rightarrow$Open, or by dropping it onto the program. Note that by default, the program will not load all the data in the file - a sampling will be performed. Careful use of data sampling will allow for a much more rapid and interactive analysis of large datasets - many of the algorithms running times do not scale directly with the size of the dataset. Reducing the number of ions can, in some cases, result in a significant reduction in run time (\emph{e.g.} halving the number of ions for some algorithms can result in a run time of a quarter required for the full dataset). \subsection{Ranging} \label{sec:quickStartRangedData} The program can be used to mark particular sections of the spectrum as belonging to a particular ``range'' of values. Each value can be tagged with a specific name for the range, and an associated colour, which will be used to mark the points in the 3D display. \begin{figure}[h] \centering \includegraphics[width=0.85 \textwidth,keepaspectratio=true]{./figures/rangeDropdown.png} \caption{Opening a range file can be done from either the filter drop down, or by dropping a rangefile onto the program. You must first have data loaded (as shown by the red points).} \label{fig:rangeDropdown} \end{figure} To perform ranging, you must first have a valid rangefile. As of time of writing, (July, 2013 - 0.0.14), the program is unable to generate these from the UI. It is possible to write the file by hand, or using a separate program - details on manually writing the file can be found in Section~\ref{sec:rangeFormat}. To perform ranging, the data must be first loaded into the program. The range information can be loaded in two ways, by dropping a valid rangefile onto the program, or by using the filter dropdown (Figure~\ref{fig:rangeDropdown}), whereby a window will open that will allow for the selection of a valid range file. Once loaded, you can select the ranging filter and enable/disable ions and ranges you do not wish to see. By default unranged ions are not emitted from a range filter, so will not be seen unless ``Drop Unranged'' is unselected. \subsection{Spectrum} To see the mass spectrum for a selected data, the ``spectrum'' filter must be used. First load the required data (as per Section~\ref{sec:quickStartLoadData}), then select the data filter in the tree, and select ``Spectrum'' from the filter drop-down. This will display the spectrum without any overlaid ranges. To get the desired signal/noise level, you may wish to either alter the sampling level in the Pos Data (Load Limit value), or disable sampling. Changing the spectrum bin width until the spectrum appears as desired is also recommended. \begin{figure}[h] \centering \includegraphics[width=0.85 \textwidth,keepaspectratio=true]{./figures/rangedSpectrum.png} \caption{Ranged spectrum shown only the data that is within the selected ranging windows. The ``Drop unranged'' option can be used to show all the data, and thus the complete spectrum.} \label{fig:rangedSpectrum} \end{figure} To display the ranged spectrum, simply use the sequence \texttt{Data$\rightarrow$Ranging$\rightarrow$Spectrum}, as shown in Figure~\ref{fig:rangedSpectrum}. To see the ions outside existing ranges, untick ``drop unranged`` from the range filter. Note that as the data is converted into a spectrum, the 3D view will disappear. To see both the spectrum and the point data at the same time, use the configuration shown in Figure~\ref{fig:rangedSpectrumWithCloud}. \begin{figure}[h] \centering \includegraphics[width=0.85 \textwidth,keepaspectratio=true]{./figures/rangedSpectrumCloud.png} \caption{This layout can be used to simultaneously display both the point cloud and the ranged spectrum.} \label{fig:rangedSpectrumWithCloud} \end{figure} \subsection{Composition profiles} To display a composition profile, you first require a ranged dataset (see Section~\ref{sec:quickStartRangedData}). Once done, first select the range filter, then choose a concentration profile from the drop down. Note that as the data has now been converted into a concentration profile, the point cloud will disappear (although the concentration profile cylinder is visible, and is computing the correct result). To see both the data and the concentration profile at the same time, use the configuration shown in Figure~\ref{fig:quickStartConcLayout}. \begin{figure}[h] \centering \includegraphics[width=0.85 \textwidth,keepaspectratio=true]{./figures/quickStartConcLayout.png} \caption{This layout can be used to show both point data and a concentration profile simultaneously.} \label{fig:quickStartConcLayout} \end{figure} \subsection{Counting Points and measuring volume} To compute the absolute counts of the number of ions that are visible in the dataset, use the ``Ion information'' filter, as shown in Figure~\ref{fig:quickStartIonInfoLayout}. To compute the ion count, check the ``count'' box. To compute the dataset volume, select the ''volume'' checkbox, and the desired algorithm (For algorithm details see Section~\ref{sec:FilterIonInformation}). The results are displayed in the console window (Figure~\ref{fig:quickStartIonInfoLayout}). \begin{figure}[h] \centering \includegraphics[width=0.85 \textwidth,keepaspectratio=true]{./figures/quickStartIonInfoLayout.png} \caption{Ion count and volume data can be displayed from the ion information filter. The output is displayed in the console window.} \label{fig:quickStartIonInfoLayout} \end{figure} \subsection{Concentration surface and slices} To generate iso-concentration surfaces, or to create 2D slices in your data for visualising information such as concentration fields, a voxelisation must first be conducted. Load some ranged data (Section~\ref{sec:quickStartRangedData}), and then select the range filter and choose ``Voxelisation''. This will cause the dataset to disappear until you configure the voxelisation parameters appropriately. To compute a concentration field, change the normalisation mode to ``All ions (Conc)'', then select the ions that are to be included. To visualise the result, change the ``representation'' mode to either isosurface or 2D slice. The upper and lower bounds of the 2D slice are auto computed. However, for the isosurface one must choose the value that the isosurface is spanning. For non-concentration modes, after computation of the voxel field, the upper and lower bounds of the field are shown in the console window, and can aid in selecting the desired isosurface value. For normalised modes (\emph{i.e.} concentration), one would set the values between 0 and 1. \FloatBarrier \section{Understanding the program} \subsection{Filters} Filters form \emph{the} key component of the program. These are the tools by which data is analysed and modified, in order to generate the visual representation that is needed by the end users. The basic idea behind a filter is that each filter may perform arbitrary operations on ``data streams''. These data streams are sent to and from each filter, flowing through the tree. \begin{figure}[htp] \centering \includegraphics[keepaspectratio=true,width=0.85 \textwidth]{./figures/generic-filter.png} % generic-filter.png: 10x603 pixel, 17dpi, 153.75x90.54 cm, bb=0 0 4358 2567 \caption{Basic concept of a filter. Data goes in, data comes out. The filter may perform any operation on the data coming in or out as it chooses. The data streams coming in are restricted to certain types of data, as shown. } \label{fig:basic-filter} \end{figure} The basic idea of a filter is illustrated in Figure~\ref{fig:basic-filter}. \emph{3Depict}'s flexibility is that these filters can be arranged in any way that makes sense to the end user. There is no restriction on placement of filters -- some placements may be totally useless, others may be exceedingly useful. It is up to the creativity of the end user to determine whether any single arrangements meets their needs. \subsection{Trees} \label{sec:treebehaviour} The tree is a flexible and powerful system for constructing your own analyses, after some use this will become a familiar and readily modifiable system for performing your analyses, however the initial structure of the program may take some getting used to. If you are familiar with programs such as \emph{Paraview}, you may already be familiar with this concept. The filter tree essentially is a system for injection, manipulation and display of the data in the program. The tree becomes an ``assembly line'' for the view of data in the 3D and plot views. The nodes of the tree are the filters that act on or insert data into the analysis. Each node in the tree may be considered in what is called a ``parent-child'' relationship. Each element in the tree (except the first) has a ``parent'', and thus may have their own ``child'' elements. Each ``parent'' may, in fact, have many children. Data may be considered to propagate from the ``root'' of the tree downwards, with each filter in a direct line somehow modifying the data from above in some way. When data reaches the end of the filter tree it is ``picked up'' by any of the 3D view, plot or console panels, depending upon the nature of the data. The basic method for data flow is that a parent gives a copy of the data it has processed to its ``children'' to modify in some way. Each ``child'' has its own copy\footnote{Technical note: the ``copy'' system is at the discretion of each filter. Child filters are given a reference to the parent data which restricts modification of the parent's data by the children; children may or may not duplicate this data, propagate or terminate the reference.} of the data from the parent, which it modifies. In turn this child then gives a copy of the data to each of its own children. If a filter has no children it then passes the data to either the 3D view, the plot view or the console view, depending upon the data type. \begin{figure}[ht] \centering \includegraphics[width=0.85 \textwidth]{./figures/tree-propagate.pdf} % tree-propagate.pdf: 1513x798 pixel, 72dpi, 53.38x28.15 cm, bb=0 0 1513 798 \caption{Data propagation in a tree for a particular arrangement of filters. Data is propagated from a parent filter to its children.} \label{fig:datapropagate} \end{figure} Using this method, one may create a variety of different analyses; for example, one may wish to subsample data before performing a time-consuming spatial analysis, or one may wish to clip the data to remove unwanted sections before generation of a value spectrum. The flexibility of the filter system supports this concept. Note that items in the filter tree can be moved. You may move any filter to a new parent by dragging with the mouse. In order to copy instead of move, hold down the \texttt{Ctrl} whilst moving to duplicate the filter, rather than moving it. You may also rename filters in the tree; The filter name may be used by the filter to generate its output, \emph{e.g.}\ spectrum plots will take the plot title from the filter name. \subsection{Stashes} Instead of enabling or disabling sections of the tree, the program supports ``stashes'' as a place to put sections of the analysis tree for later use without using them in the analysis section. To create a ``stash'', select a section of the filter tree to ``stash'', then in the ``stashed filters'' dropdown on the data tab, type the name of the stash you wish to create (this is up to you), and press \texttt{Enter}. Once done, a duplicate of the subtree specified (\emph{i.e.}\ all the filters below the selected one, and the selected one too), is made. This process is shown in Figure~\ref{fig:stash-creation}. You can view the contents of the stash by selecting the button next to the stash dropdown, and you may delete stashes however you cannot edit them. \begin{figure}[ht] \centering \includegraphics[width=0.85 \textwidth,keepaspectratio=true]{./figures/Stash-operation.png} % Stash-operation.png: 1065x606 pixel, 72dpi, 37.57x21.38 cm, bb=0 0 1065 606 \caption{Creating a stash from the filter tree. New stashes will appear in the dropdown and can be selected to recall subtrees to insert into the filter tree.} \label{fig:stash-creation} \end{figure} To use a stash, select a filter in the tree and then click the dropdown button on the stash combo box, and then select the stash you wish to use. This will place the stash as a child of the selected filter. Note that the stash can be used multiple times. \subsection{Plots} Any plots generated by the filter system are displayed in the plot pane. It is possible to zoom or pan the view as required by dragging or \texttt{shift} dragging the plot respectively. Double-clicking the plot returns the plot back to its original scaling. The associated numbers used to generate the selected plots are shown in the ``Raw'' tab. Note that plots can contain ``regions'', such as generated by a range file. In this case, each region may be manipulated in-situ, by dragging the regions sides, or its centre to alter or move the region respectively. These modifications will be propagated back to the original filter. Each plot is either logarithmic, or linear in scaling. Mixing these two types of plot will result in the y-axis stating that there are mixed data types in the plot. The log/linear mode is determined by the filter that generates the plot. Note that due to internal limitations (fixed plot palette in the underlying library), the colours observed in the plot may be slightly different from those specified by the filter. \subsection{Cameras} To fully understand the camera model, it is necessary to understand the parameters in the camera property tab. Initially there is only the default camera, which is unnamed. By entering in a name for the camera, you can access the properties for that particular camera. By entering in more names, you can create multiple cameras, saving the position of existing cameras as you go. This can allow you to jump between different camera views as desired. One can select the position of the camera, a position that the camera is always looking at (target), the camera ``up'' direction, and the field of view. Furthermore, the camera type (perspective or orthogonal) can also be selected. With the exception of the field of view, these parameters are dynamically modified when interacting with the 3D scene (see section X). The camera field of view, however requires special mention. The field of view of the camera is the angle that the camera look at. Human vision is around 120*, and is much narrower for suffers of tunnel vision (say, 30*). A bird has a full 360 degree field of view (it can see in all directions without needing to turn its head). By default the camera is set to 90*. To get the ``fish-bowl'' effect, where close objects appear very large, this number can be increased. To get an effective orthogonal camera, this number can be set very low. Note that changing this value will also have the apparent effect of zooming the camera in or out, so tapping \texttt{space} to reset the camera view is recommended for large changes. \subsection{Effects} The effects tab allows for altering the appearance of the 3D output data, without changing the data itself. Current effects are anaglyphic 3D (colour-based 3D glasses), and visual clipping. \subsection{Program actions} \subsubsection{Save} The current programs state can be saved to an ``XML'' state file for later analysis\footnote{See Section~\ref{sec:xmlstatefile} for more information.}. Note that opening an existing program state file will erase your current state. If you wish to merge the two states together into a single analysis, use the ``merge'' option. Note that as this file references, but does not contain, the data files needed for the analysis, this file cannot be moved between computers and expected to ``just work''. However, to overcome this, the program provides the ability to export an analysis ``package'', which contains all the data necessary to move these files between computers with ease, regardless of platform. This feature is explained in the ``Export'' section. \subsubsection{Undo} The program has an undo feature which can be used to abort the last changes to the filter tree. Note that for memory reasons, the results of the computation are not stored, and will need to be recomputed. Note that there is also a ``redo'' function, which allows for undone changes to be restored. \subsubsection{Raw Data} The raw data pane may be used to obtain the raw XY data used to generate the plots. This can either by copied and pasted, or alternately saved to file. \subsubsection{Export Menu} Plots, images, ion data and animations may be exported from the program. The output format for 3D images is the ``Portable Network Graphic (PNG)'' format; these are supported by almost all image viewers. For plots, you may save in either (Scalable Vector Graphic (SVG)) or ``PNG'' forms. Note that due to the nature of the SVG files, no resolution is needed, and the image can be reproduced at any scale. Furthermore the SVG can be used later to generate PNG images at the required size for output (We recommend the program \textit{Inkscape}). Alternately saving as PNG can be done, and you will be prompted for the desired image size. Exporting Ion data can be done in several ways; you may export only the visible ions, or alternately, you may export only a subset (for example one or two ranges) of the data, depending upon the filter that the data emerged from (\emph{i.e.}\ per leaf filter). The output format will be in Big-endian ``POS'' format, as detailed in the Appendix, Section~\ref{sec:posformat}. Modified range files may be exported in whole. Currently the only supported export format is the oak-ridge``RNG'' format Using simple animations of the 3D data can be constructed, where the current camera is orbited 360 degrees around its target location. The result is saved as an image sequence, which can be converted into an AVI using programs such as \emph{ImageJ}, or \emph{ffmpeg} to convert the constructed image sequence into a video file. More complex, filter based animations are covered in more detail in~\ref{sec:animationExport} Finally one can export the entire analysis state, including all required data using the export analysis package option. This will create a folder which contains all the files needed to reproduce the current program state elsewhere. Note that this imports all referenced data files, so the package can become quite large, but should be fully portable to any other system by simply copying the created folder. Inside the folder, the program state will be stored as a state file, and can be accessed by simply opening this state file. \subsubsection{Ranging dialog} The ranging dialog allows for the complete editing of range files within the program. The range files can be arbitrarily modified, as desired. To access the range dialog, this can be obtained from the Edit->Range menu. However, this is only accessible if there are range and spectra available from within the range tree. Note that, at this time (0.0.15), the altered ranges will not be persistent between 3Depict sessions. An initial range file that can be loaded into the filter tree is required at this time. The dialog is split in two, with a tab panel on the left and a spectrum on the right. If there are several spectra that are rangeable, the spectrum can be selected from the tab panel. Once selected, any existing ranges can be moved and interacted with using the right hand view. Unlike the ranging area, the ranges shown in the spectrum can be moved arbitrarily - \emph{i.e.}, they may overlap, or otherwise be moved past one another. This allows for completely unconstrained editing of the spectrum. Clashes will be shown with a red marker a the top of the spectrum (Figure~\ref{fig:rangeEditClash}), and must be resolved before the changes can be committed. New species and ranges can be added using the Add/Remove buttons in the ``Ranges'' tab. First select the grid you wish to edit, then add the new range. Note that if the range is not fully specified, it will be highlighted in the grid - you must set each field in the grid prior to use. \begin{figure} \begin{center} \includegraphics[width=0.9 \textwidth,keepaspectratio=true]{./figures/rangeedit-clash.png} \caption{Range editing dialog, showing clash between species} \label{fig:rangeEditClash} \end{center} \end{figure} From the overlay tab, custom ``molecular'' combinations can be shown on the plot as stick markers, each stick's amplitude shows the natural abundance for the predicted isotopes\footnote{This is set by the naturalAbundance.xml file. Customised abundances can be set there, \emph{e.g.} for isotopic studies.}. To specify a multiple ion, you need to provide the chemical formula in the tab. In Figure~\ref{fig:rangeEditOverlay}, the species ``TiO'' is shown. Similarly, ions such as ``TiO2'' ($\mathrm{TiO}_2$) and ``Ti2O'' ($\mathrm{Ti}_2\mathrm{O}$)could be displayed. Note that the overlay to be specified is case sensitive, \emph{e.g.} ``PB2'' (hypothetically, Phosphorous diboride) is different to ``Pb2'' (Lead-2 complex), and thus only the appropriate case will be accepted by the program. Due to the exponential (and thus highly computationally costly) nature of large fragments, only fragments with 10 components will be accepted (\emph{e.g.} C20 will be rejected, as with 2 C species, there are $2^{20}$ solutions). \begin{figure} \begin{center} \includegraphics[width=0.9 \textwidth,keepaspectratio=true]{./figures/rangeEditOverlay.png} \caption{Range editing dialog, showing molecular overlays.} \label{fig:rangeEditOverlay} \end{center} \end{figure} \subsubsection{Autosave} The program will generate an autosave file periodically. If the program crashes, it will look for an autosave file and prompt you to restore it. Note that only the program settings are saved, not the intermediate data, so recomputation will be necessary. If the autosave fails to load, then the autosave file will be archived in your 3Depict configuration folder; in this case, please consider sending the failed file to the developers. For configuration locations, see the paths Section~\ref{sec:3DepictPaths} \subsubsection{Export Animation} \label{sec:animationExport}As of \emph{3Depict} 0.0.12, it is now possible to automate the modify filter-refresh cycle. Specifically this allows for the animation of any property in any filter in the current filter tree. For example, if one wished to create an animation of a slice through of a POS file, one could create a clip filter, then interpolate the 3D point property to move the clip object automatically between animation frames. Note that the output of animation is not restricted to images only, it can output any data that can normally be exported. In the Figure~\ref{fig:animateFilterView} the main window for animation can be seen, here it is possible to select the filters and properties that are to be animated. Depending upon the type of property selected (\emph{e.g.} number, colour, string, multiple choice), the selection dialog shown will be different. To select the property that is to be animated, first one must select the filter, similar to how this is done in the main window. Once this is done, the properties currently set for that filter will be used as the default properties for the animation. To change the property, simply double click the property listing on th desired entry. Depending upon the entry type of property selected, as previously mentioned, you will be shown a differing dialog. For example, here the numerical property has been selected, and the dialog for setting animation parameters is displayed (Figure~\ref{fig:animateParamDialog}). \begin{figure} \begin{center} \includegraphics[width=0.9 \textwidth,keepaspectratio=true]{./figures/exportanimDialogFilterView.png} \caption{Overview of animation dialog with ``filter view'' active; left hand area of the window shows standard tree view, right hand window shows properties that are to be animated.} \label{fig:animateFilterView} \end{center} \end{figure} \begin{figure} \begin{center} \includegraphics[width=0.9 \textwidth,keepaspectratio=true]{./figures/exportanimParamDialog.png} \caption{Numerical input window for setting parameters for animation} \label{fig:animateParamDialog} \end{center} \end{figure} By setting the start and end frame of the property, as well as the values desired at the start and the end, then the property of the filter will be changed during the animation. Any properties not listed in the grid will remain at their current values. Conflicting values are not allowed, for example, specifying the same property to have two different values at the same time. Such errors will be displayed in the filter view, as seen in Figure~\ref{fig:animateParamConflict}. \begin{figure} \begin{center} \includegraphics[width=0.9 \textwidth,keepaspectratio=true]{./figures/exportanimDialogConflict.png} \caption{Conflicting filter properties shown, highlighted to show the conflicting values in the animation property grid.} \label{fig:animateParamConflict} \centering \end{center} \end{figure} The properties selected for a filter will be linearly interpolated from start to finish, so, for example, setting a property at frame 1 to ``1'', and frame 10 to ``10'', each frame between will change as 1,2,3...,9,10. This can be done for multiple properties at any one time. Similarly for colours, the interpolation will be done linearly on the colour's red/green/blue value, so, similarly, colours can also be animated. Whilst linear interpolation can be done for colours, points and digit values, it is not possible to do this for so-called ``strings'' (text values); these values must be treated specially, as shown in Figure~\ref{fig:animatePropString}. \begin{figure} \begin{center} \includegraphics[width=0.9 \textwidth,keepaspectratio=true]{./figures/exportanimDialogPropString.png} \caption{Setting string properties using the string input dialog, via manual entry.} \label{fig:animatePropString} \centering \end{center} \end{figure} In this case either each string must be individually specified, as shown in the figure, or alternately, one must supply a text file, with one line per string to be used as input --- this can be selected via the ``open'' button. \begin{figure} \begin{center} \includegraphics[width=0.9 \textwidth,keepaspectratio=true]{./figures/exportanimDialogFrameView.png} \caption{Overview of animation dialog with ``frame view'' active; right hand region of the window shows the values of the animation for each frame, on the left hand side are the outputs that the user wishes to obtain.} \label{fig:animateFrameView} \end{center} \end{figure} Once the desired properties have been set in the filter view, then one proceeds to the frame view in order to review the animation by examining the properties that will be obtained in each filter, frame-by-frame. If you are familiar with this dialog, then it is easy to simply examine this quickly to ensure that the properties that were intended have been obtained. Now, having ensured that this is the case, it can be seen that the "OK" button cannot be pressed at this time. Firstly, the desired outputs, and the directory that they will be sent to during the animation process must be specified. Once the output directory is set, the desired outputs, normally either images, or points are to be selected as required. The checkbox `` '', if set, will cause only the changes that actually alter the computation internal computation to be saved. As an example, if one was to animate the ``Load Limit'' property of the ``Pos Data'' filter, and the file to be opened was only 1~MB, but the animation proceeded as 0.5, 0.6... , 1.0,1.1... , when the sampling value exceeds 1~MB, there is no effect on the computation, thus the program will not save data on frames that do not alter the output. \section{Detailed Reference} \subsection{Data types} Different data can propagate through the filtering system before it is seen in the 3D view. The currently available types are ions, plots, range, voxels and drawable object types. Although these are used internally by the program, understanding the type system may enable more advanced use of the program. If you are not interested in this, skip to the next section. \subsubsection{Ions} Each ion represents a point in space, which has a value type associated with the point. For example, one might consider a point in a dataset where positions represent atomic positions, and the value is the measured atomic mass. Ions are grouped together by different filters, and each group may be represented with a unique colour and size. \subsubsection{Plots} Plots can be passed between filters to allow for a 2D graphical representation of whatever it is that the filter computes. Plots are a X-Y paired set of scalar values, which are finally given a visual representation as a plot. Plots have a title, and a label, and may represented either on a linear scale, or a logarithmic one. \subsubsection{Range} This is a special datatype which propagates information through the filter tree. The data represents non-overlapping regions of the value space which are to be tagged as belonging to a certain group. This data type has no actual output into the 3D scene, but can alter the manner in which ``downstream'' filters process incoming information. For example, if a profile filter is used after a range, it will split up its measurements into a per-tag ``range'' section. \subsubsection{Voxels} Voxels is shorthand for ``volume pixel'' and is a rectilinear region of space, divided up into an equally spaced rectangular grid. Voxels can currently be represented by a point cloud, where each point has a given colour and transparency, or by a triangulated surface (an iso-surface) which represents the contouring surface for a given scalar value. \subsubsection{Drawables} 3D primitives can be injected into the data stream to assist in the final representation of the scene. Items such as spheres, lines triangles or text can be placed in the final scene. \subsection{Filters} In this section, the detailed behaviour of the various filters available in \emph{3Depict} is outlined. Recall that each filter interacts with other filters and the visualisation environment by generation and propagation of various filter types. At the most abstract level, there are three ways that filters can interact with the data -- the list given below provides a may (optional) or will (guaranteed) output. \begin{itemize} \item \textbf{Emit:} Emitting a new data stream into the filter output (Yes: filter may emit, No: filter will not emit). \item \textbf{Use:} Using a new data stream for internal calculations (Yes: filter may use, No: filter will not use). \item \textbf{Block:} Preventing an incoming stream from propagating to the output (Yes: filter will block, No: filter will not block). \end{itemize} This section describes each filter in turn, the fundamentals of the internal computation, and provides a table describing which datastreams are emitted, used or blocked during the filter's refresh cycle. \label{sec:filter} \subsubsection{Data load} The data load filter injects 3D point+value data into the analysis tree. Points are loaded from a file by one of several different methods. By default, random data is selected from the file. This filter can be created using the ``load'' function from the file menu. Note that the default settings will only load a random subset of the data in order to speed analysis. If you require all data to be loaded, then you will need to alter the filter settings. \begin{itemize} \item \textbf{Number of columns}: Number of floating point values in a single record. Defaults to 4. \item \textbf{X}: Position in record to use as X value. Defaults to 0. \item \textbf{Y}: Position in record to use as Y value. Defaults to 1. \item \textbf{Z}: Position in record to use as Z value. Defaults to 2. \item \textbf{Value}: Position in record to use as associated scalar value. Defaults to 3. \item \textbf{Enabled}: Disable/enable the filter. \item \textbf{Monitor}: Monitors the timestamp of the input file for changes -- if the timestamp on the file changes, then the data file will be reloaded, and the filter tree refreshed. This is useful when generating data files programatically. \item \textbf{Ion colour}: Colour of the ions from the 3D view. \item \textbf{Ion size}: Default size of points in 3D view. \item \textbf{Filename}: name of the file to load the data form. \item \textbf{Load limit}: The maximum quantity of data to load from the file. If set to 0, then the entire file is loaded. Otherwise a random sub-selection of the file is loaded. Note that random selection reduces memory cost, but if it is more than a few percent of the file size, may be slower to load. \end{itemize} Information on acceptable data file formats is provided in the Appendix, in Sections~\ref{sec:posformat} and~\ref{sec:textformat}. {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table}[!Htb] \caption{Propagation matrix for Data load.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & Yes & No & No\\ Plot & No & No & No\\ Drawable & No & No & No\\ Range & No & No & No\\ Voxel & No & No & No \\ \hline \end{tabular} \end{center} \end{table} }% \pagebreak \FloatBarrier \subsubsection{Downsampling} Randomly samples ions from the input stream. Can operate either to generate a fixed number at the output, or to take a fixed percentage of the input. If range information is provided, this can be done on a per-species level. \begin{itemize} \item \textbf{Fraction}: Approximate random fraction of the data to load. Must be between [0,1]. \item \textbf{Max count}: The approximate number of ions to load. \item \textbf{By count}: Specifies whether to use a fixed count, or a fixed fraction \end{itemize} {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table}[!h] \caption{Propagation matrix for Downsampling.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & Yes & No & Yes\\ Plot & No & No & No\\ Drawable & No & No & No\\ Range & No & If available & No\\ Voxel & No & No & No \\ \hline \end{tabular} \end{center} \end{table} }% \FloatBarrier \subsubsection{Ion Information} \label{sec:FilterIonInformation} This filter allows for the computation of ion counts in any input streams, as well as volume estimation. If a range stream is present in its input, (\emph{i.e.}\ a Ranging is a parent of this filter) then the filter will perform per-species computation of the value. \begin{itemize} \item \textbf{Compositions}: Enable computation of the number of numbers of different ions (if ranged), or total ions in the input streams. \item \textbf{Normalise}: Normalise the composition values. This only has an effect if there is a range input stream. \item \textbf{Volume}: Enable estimation of the volume of space occupied by the ion streams. There are several algorithms for doing this: \begin{itemize} \item \textbf{Rectilinear volume}: Computes the volume of the minimal axis aligned rectangular prism, or bounding box, that can hold all the points in the input stream. Except for truly spherical datasets, the reported value will be a function of the data orientation. \item \textbf{Convex hull}: Computes the volume of the minimal convex enclosing polygonal object, known as the convex hull. This is parameter free, but may cause gaps in the data to be estimated as part of the volume. \end{itemize} \end{itemize} {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table}[!h] \caption{Propagation matrix for Ion Information.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & No & Yes & Yes\\ Plot & No & No & Yes\\ Drawable & No & No & Yes\\ Range & No & Yes & Yes\\ Voxel & No & No & Yes \\ \hline \end{tabular} \end{center} \end{table} }% \FloatBarrier \subsubsection{Ranging} \label{sec:rangeFilter} This allows for the cropping and segregation of ions in 3D space by their scalar values. Each range loaded from the file may be enabled, either at the ion level (groups of ranges) or at the range level. The range values may be altered; however these may not overlap at any time. Note that these can be edited graphically (to some extent) if used in a mass spectrum. At time of writing, \emph{3Depict} cannot be used to generate range files, only write them. \begin{itemize} \item \textbf{Filename}: This is the name of the file to use as the range source. So-called ORNL ``rng'' files, Cameca ``env'' files and Imago/Cameca ``RRNG'' files are accepted. For information on the accepted file formats, see the Appendix, Section~\ref{sec:rangeFormat}. \item \textbf{Drop unranged}: This causes any ions not ranged to be silently dropped from the filter output. This is best enabled for 3D viewing, and best disabled for spectrum plotting \end{itemize} {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table} \caption{Propagation matrix for Ranging.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & Yes & Yes & Yes\\ Plot & No & No & No\\ Drawable & No & No & No\\ Range & No & No & Yes\\ Voxel & No & No & No \\ \hline \end{tabular} \end{center} \end{table} }% \FloatBarrier \subsubsection{Bounding Box} The bounding box creates a 3D box surrounding any point data in the input stream. The box uses relative coordinates, and has a specifiable font size, colour and line thickness. Several styles of bounding box may be chosen from a predefined list. {% \begin{table}[!h] \caption{Propagation matrix for Bounding Box.} \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & No & Maybe & No\\ Plot & No & No & No\\ Drawable & Maybe & No & No \\ Range & No & No & No\\ Voxel & No & No & No \\ \hline \end{tabular} \end{center} \end{table} }% Note that if the bounding box option ``visibility'' is set to false, then no drawable item (\emph{i.e.}\ the bounding box) will be emitted. \FloatBarrier \subsubsection{Clipping} This filter allows for the rejection of data that does not lie within some given boundary. Possible boundaries are plane, sphere and cylinder. For example, if the sphere mode is set, ions within the sphere will be kept and propagated. Ions outside the sphere boundary will be dropped. The clipping object can be placed in 3D by dragging the in-scene object around. Note that holding down Ctrl and shift whilst dragging alter the plane of motion (in-screen, across screen etc). \begin{itemize} \item \textbf{Mode}: Select the fundamental primitive used to divide the incoming ions into two groups (inside and outside). Sphere, Cylinder and Plane modes are available. \item \textbf{Invert clip}: Reverse the action of the filter, \emph{i.e.}\ swap the definition of ``inside'' and ``outside''. \item Various positioning parameters; These can be typed in manually, or set by manipulating the clipping object in the 3D view with the mouse. \end{itemize} {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table}[!h] \caption{Propagation matrix for Clipping.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & Yes & Yes & Yes\\ Plot & No & No & No\\ Drawable & No & Maybe & No \\ Range & No & No & No\\ Voxel & No & No & No \\ \hline \end{tabular} \end{center} \end{table} }% If the drawing primitive is set to be shown, then a drawable stream will be emitted from the filter. \FloatBarrier \subsubsection{Spectrum} This will generate a histogram of the ``value'' of ions passing through the filter. Note that no output other than the histogram is generated. Plots can be assigned a colour, set to logarithmic or non-logarithmic mode, or restricted to only cover a specific region. The plot title is taken from the filter name, some limited \LaTeX is supported (note that the ``$\backslash$'' symbol is a special \LaTeX command; you may need to use ``$\backslash$$\backslash$'' to represent a single ``$\backslash$'' in the title), for example to type ``My Spectrum A$\backslash$B'' you would actually name the filter ``My Spectrum A$\backslash$$\backslash$B''. \begin{itemize} \item \textbf{Bin Size} : The width of each histogram bin to use when computing the spectrum. \item \textbf{Normalisation}: This option will rescale the spectrum, when enabled. When disabled, the spectrum will be plotted on a per-count basis. One normalisation mode is to rescale the data using te maximum value across the entire plot. Otherwise, a normalisation can be performed within two bounds. \item \textbf{Background (Mode)} : This option allows for the selects the method for removing the background from the given data. \item \textbf{Logarithmic} : Specifies if the displayed plot is to be drawn in log mode (ticked), or in linear mode (unticked) \begin{itemize} \item \textbf{Flat TOF} : this mode uses a sqrt-mass (as mass is proportional to the square of the TOF) extract and fit method to estimate the background in the spectrum. This uses the data between the specified start and end mass to perform fitting. If insufficient data has been obtained to validate the fit (binned data must form a gaussian distribution, anderson test), then no corrected spectrum is created, and a message is generated. \item \textbf{Mass Start} : This specifies the start of the cutoff window for choosing the data. The window must span a region of background. \item \textbf{Mass End} : This specifies the end of the cutoff window for choosing the data. .\end{itemize} e that for \end{itemize} {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table}[!h] \caption{Propagation matrix for Spectrum.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & No & Yes & Yes\\ Plot & Yes & No & Yes\\ Drawable & No & No & Yes \\ Range & No & No & Yes\\ Voxel & No & No & Yes \\ \hline \end{tabular} \end{center} \end{table} }% \FloatBarrier \subsubsection{Profile} The profile filter conducts a density or ``compositional'' analysis of a given sub-region of 3D space. The action of the profile filter depends upon whether the incoming ions have been ``ranged''. If not, then the profile filter generates a density profile of the ions inside a cylindrical volume by count, which is visible in the 3D view. If the ions have been ranged, then the frequencies are on a per-species basis. \emph{Properties} \begin{itemize} \item \textbf{Normalise}: The action of this option converts the density into a fractional one. For ranged ions, this is the local composition. For unranged ions this is the relative density. \end{itemize} {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table}[!h] \caption{Propagation matrix for Profile.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & No & Yes & No\\ Plot & Yes & No & No\\ Drawable & Maybe & No & No \\ Range & No & If available & No \\ Voxel & No & No & No \\ \hline \end{tabular} \end{center} \end{table} }% Drawable will be emitted if the ``Show Primitive'' option is selected. \FloatBarrier \subsubsection{Spatial Analysis} This filter conducts spatially oriented data analysis of incoming ions, and reassigns the `value' component of the ion data. The nature of the reassignment depends upon the selected algorithm and the incoming data itself. Note that the exact values computed by the spatial algorithms may be affected by subsampling; however trends are usually unaffected, provided the number of incoming data elements is sufficiently large. \paragraph{Algorithms}: \begin{itemize} \item \textbf{Local Density}: This computes the local density of the ions on either a nearest neighbour, or a fixed distance metric. The density is then assigned as the point value. Note that the number of points to be examined increases rapidly in the fixed distance metric, and may rapidly become untenable. Clipping the volume of data to reduce the time is an option, however surface effects can occur. \item \textbf{Density filtering}: computes density as per local density, however ions are retained (or not) depending upon a chosen cutoff density, whilst retaining the original point value. \item \textbf{Radial distribution}: Computes the local environment for each ion, and generates a histogram of the number of points within a spherical section surrounding each ion. \item \textbf{Axial distribution} : Computes the so-called ``directional RDF'' or 1D RDF, which can be used to measure spatial correlations between points. \item \textbf{Binomial distribution} : Computes the binomial distribution probabilities for the dataset, using the method of Moody et al~\cite{Moody2008}. \item \textbf{Point em/re-placement} : Replace or load points with specified points from a file, using subtract, intersect and union modes \end{itemize} Local density and density filtering algorithms are relatively simple, and mostly are self-contained concepts. This can be used to identify the local density in your dataset, which in the case of APT, originates due to limitations in the technique. For the Radial Distribution Function (RDF) algorithm , this can be used to examine local correlations between points, which may or may not exist in your dataset. The RDF technique is covered in several standard textbooks on APT~\cite{Gault2012}. \paragraph{Radial Distribution:} The radial distribution function counts pair-pair distances between species. This can be used to find local tests whereby certain point types are more likely to be present at given distances from one another. Note that the distribution often requires normalisation by $y=x^2$, at this time this is not implemented and needs to be done manually. \paragraph{Axial Distribution:} Axial distribution functions are covered in technical literature where they find use in APT and be referred to via a number of differing names, such as ``SDM''s~\cite{Geiser2007}, atom-vicinity~\cite{Boll2007}, or directional pair-correlation functions. The axial distribution function implementation in \emph{3Depict}, allows for users to select and drag out the region to be analysed, with the axis of the cylinder providing both the cropping orientation and the axial direction in which to perform the calculation. \paragraph{Binomial:} The binomial distribution function can be used to test for randomness in the spatial distribution of the points. The program computes a ``p'' value, which is the probability that the observed data was drawn from a randomly distributed (at the scale of the analysis) set of values on fixed data points. Grouping is performed by a grid-extrusion algorithm, which assigns each set of points in the dataset to a given bin, and thus a given count in the output histogram. The output histogram shows number of occurrences of the observation that a bin contains a given number of counts. This method (or any statistical test) cannot prove randomness, only non-randomness, which may come from many sources. One must be careful when using this mode (or any statistical test), and careful reading of the available literature is recommended. \emph{3Depict} does not implement the two-pass method of Moody for computing grid sizes at this time (October, 2013), but rather performs only the first pass. \paragraph{Point em/re-placement} : This function allows for merging points in the current data, $A$ from another file, $B$. There are several operating modes, ``subtract'',``intersect'' and ``union''. In the subtract mode, points which have a matching element in $B$ will be removed. In intersect mode, \emph{only} points that have a matching point in the file will be retained - the value to be assigned to the point is taken from $B$. Similarly, in union mode, both $A$ and $B$ are loaded, but overlapping points in $A$ will be removed and the value taken from $B$. Only POS files are supported in this mode. Text files cannot be used at this time. The match tolerance parameter controls how close the match must be to eliminate points. {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table}[!h] \caption{Propagation matrix for Spatial Analysis.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & Maybe & Maybe & No\\ Plot & Maybe & No & No\\ Drawable & No & No & No \\ Range & No & Maybe & No \\ Voxel & No & No & No \\ \hline \end{tabular} \end{center} \end{table} }% Ion, plot and range emit and usage patterns are dependant upon the selected algorithm. Local density and density filtering do not emit plots, and density filtering does allow range propagation. \FloatBarrier \subsubsection{Clustering analysis} The cluster analysis filter is designed to aid in the detection and analysis of spatial clustering in segregated data. Cluster analyses are used to determine the extent of non-random spatial relationships between dataset members. The cluster analysis filter must be preceded by a ``ranging'' filter in order to allow for identification of different value types in the dataset The method works by identifying two data types -- ``core'' and ``bulk'' members of the dataset (in APT these are usually called ``solute'' and ``matrix''). The program attempts to determine adjacencies between core elements, and to group them together, extracting them from the bulk of the dataset. To do this, the filter uses the scalar value associated with each point to classify it. Range data (which must be present as a parent filter), is used to identify regions of value to classify value regions. Each of these regions then can be selected to belong to either the ``core'' group or the bulk group -- but not both. The clustering algorithm implemented in \emph{3Depict} is a modification of the clustering algorithm outlined in Stephenson \emph{et al}\cite{Stephenson07}, and to a lesser extent Hyde \emph{et al}~\cite{Hyde10} and Vaumousse and Cerezo~\cite{Vaumousse03}\footnote{These sources are not freely available. Some of these concepts are discussed by in this work which is available online: ``Design in Light Alloys by Understanding the Solute Clustering Processes During the Early Stages of Age Hardening in Al-Cu-Mg Alloys''; \url{http://hdl.handle.net/2123/4008}.}. Parameter Description: \begin{itemize} \item \textbf{Core classification distance}: This distance is the maximum distance between which items initially marked ``core'' by their value can be separated from another core point (up to Core kNN Max) in order to not be discounted in the clustering. This aids in removing isolated points that are initially marked as core. This option is disabled if the value is set to 0. \item \textbf{Core kNN max}: The Core k-th nearest neighbour maximum for core classification. This modifies the core classification stage, only looking up to some max kNN (unclassified core only) for other core points \end{itemize} Algorithm Description; each of these is conducted in sequence to generate the final clustered output. \begin{itemize} \item \textbf{Core Classification (Optional,\emph{Core Classify Dist} nonzero)}: Core classification; work only on core ions (bulk is ignored). Each ``core'' point has sphere of specified size placed around it, if point's kth-NN is within a given radius, then it is used as core, otherwise it is rejected to ``bulk''. \item \textbf{Cluster Construction}: A ``backbone'' is constructed using the core points (after classification). Each core point has a sphere placed around it of fixed size; if it contacts another point, then these are considered as part of the same cluster. \item \textbf{Bulk Inclusion (Optional, \emph{Bulk Link Dist} nonzero)}: For each cluster, every point has a sphere placed around it. Bulk points that lie within this union of spheres are assigned to the cluster. This assignment is unambiguous \emph{iff} this radius is smaller than half that for the cluster construction step \item \textbf{Bulk Erosion (Optional, \emph{Erode Dist} nonzero)}: Each unclustered bulk ion has a sphere placed around it. This sphere strips out clustered ``bulk'' points from the cluster and returns them to the unclustered data. This is only done once (\emph{i.e.}, not iterative). \end{itemize} Note that there are more steps listed in the filter progress due to the need to generate data query structures. Several post-processing options are available as part of the filter. The size distribution (number of items) can be computed, as can the composition. A frequency table is generated and printed to the program console. Note that the ``count bulk'' parameter specifies whether to include points classified as ``bulk'' in these frequency and chemistry tables or not. Whilst much effort has been placed into optimisation of the clustering algorithm, the query itself is quite slow. The clustering algorithm is best operated on a small region of data to optimise the parameters prior to applying the algorithm to the full dataset. {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table}[!h] \caption{Propagation matrix for Clustering Analysis.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & Yes & Yes & Yes\\ Plot & Maybe & No & No\\ Drawable & No & No & No \\ Range & No & Yes & No \\ Voxel & No & No & No \\ \hline \end{tabular} \end{center} \end{table} }% \FloatBarrier \subsubsection{External Program} This allows the program to run external commands on the system in order to link into other programs. Note: Loading a state file with this filter will result in the user being prompted to the existence of ``potentially hazardous elements'' in the filter tree, and will give the user the option of removing them. If you are presented with this warning you are highly recommended to discard these elements unless you know better, as it is possible for arbitrary computer programs to be executed if you accept these elements. Short example programs for transferring data into and out of \emph{3Depict} are given in the appendix, Section~\ref{sec:externalProgExample}. \paragraph{Command syntax: } The syntax for specifying the program command uses \% as the escape character. If you wish to pass a single \% to the command line, you can use \%\%. \%i will be substituted with the first pos file's name, repeated uses will use the second, third and so on-th pos file name. If there are not enough incoming ion streams to be converted to pos files, then the filter will report an error. You can use \%I to substitute all pos files (space separated) to the command line at once. Similarly \%p and \%P will substitute for plots. Unrecognised \% sequences will be considered an error. \paragraph{Prior to program execution:} Ion data coming into this filter will be saved in the folder ``inPos'' inside the specified working directory, with the prefix ``pos'', in the pos format (Section~\ref{sec:posformat}). Plots will be saved as tab separated files with the prefix ``xy''. If there is no input to the filter, and thus no files, the program will not be run. By default, the program that is executed will have these files passed as arguments to the function, appended to the output if no \% syntax is used. At this point, the target command will be run. \emph{3Depict} will halt at this point, and await the completion of the underlying program. \paragraph{After program execution:} Once the program is run, any .pos files (\emph{i.e.}\ any files matching `*.pos') in the working directory will be loaded back as ion streams. Similarly any `*.xy' files will also be loaded. .xy files should be ASCII files, and should have a multiple of 2 columns (one for x, one for y) separated by a valid delimiter. The x and y column lengths must also match for each x-y pair. Valid delimiters are tab, comma and space. At time of writing, there is currently no way to specify the plot colour or style. The x-y values will, by default be connected with line, thus a single value will not be clearly visible Input files will be semi-randomly named to mitigate ``collision'' problems in the case that multiple instances of \emph{3Depict} are being used. {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table}[!h] \caption{Propagation matrix for External Program.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & Maybe & Yes & Yes\\ Plot & Maybe & Yes & Yes\\ Drawable & No & No & Yes \\ Range & No & No & Yes \\ Voxel & No & No & Yes \\ \hline \end{tabular} \end{center} \end{table} }% \FloatBarrier \subsubsection{Annotation} The annotation filter allows for insertion of 3D annotations into the 3D scene. The annotations that are allowable include linear and angular measurements, as well as textual markers and text+line pointing markers. Each annotation mode has an associated colour which is specifiable. \paragraph{Text} Displays a 3D textual marker in the 3D scene, using a fixed font. \begin{itemize} \item \textbf{Annotation}: The text to display. \item \textbf{Origin}: The position of the lower left hand corner of the text bounding box in 3D space. \item \textbf{Up Direction}: The vector that is associated with the up direction of the text glyphs. Note that altering this may cause the across direction to change, due to the orthogonality requirement. \item \textbf{Across Dir}: The across direction for the text, which corresponds to the left-to-right reading direction. Similarly to the up-direction altering this may cause the up direction to change to maintain orthogonality. \item \textbf{Text Size}: The size of the text glyphs, in world units. \end{itemize} \paragraph{Arrow, Arrow with Text} Displays an arrow from one position to the other. This can be directly interacted with in the 3D scene. The Arrow+Text mode allows for a specifiable arrow and associated text point in 3D space in one. \paragraph{Angle Measurement} Displays a 3D widget which can be used to mark angular relations in 3D space. \begin{itemize} \item \textbf{Up dir} Controls the up direction for the text glyphs. Note that altering this value may cause the across direction to change in order to maintain orthogonality. \item \textbf{Across dir} Controls the across direction for the text. Note that altering this value may cause the up direction to change, to maintain orthogonality. \item \textbf{Reflexive} If selected, the reflexive (exterior) angle will be displayed, rather than the interior angle for the angular measurement. \item \textbf{Show Angle} Will display the angle measured by the marker in the 3D scene, if selected. \item \textbf{Text Size} Controls the text size for the angle measurement, if the angle is shown. \item \textbf{Digit format} Controls the number of significant digits to use, such as '\#\#.\#\#', which will show (for example), 10.78 as the degree value. Use \#, or 0-9 as placeholders to specify the format. Allowable decimal separators are period (.) and comma (,). \item \textbf{Sphere size} Sets the size of the sphere widgets which are used to manipulate and draw the angular measurement positions. \end{itemize} {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table}[!h] \caption{Propagation matrix for Annotation.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & No & No & No\\ Plot & No & No & No\\ Drawable & Yes & No & No \\ Range & No & No & No \\ Voxel & No & No & No \\ \hline \end{tabular} \end{center} \end{table} }% \FloatBarrier \subsubsection{Voxels} This filter discretises space into a series of 3D cubed regions, known as ``Voxels'' (Volume Pixels). Voxels can be used to alter a point cloud into a discrete volume of counts associated with each region. For example, the number of points inside each cube can be used as the counting metric, the number of points of a certain ion type, or the ratio of the number of points within a given region. At this time, there are three representations for Voxels: \begin{itemize} \item Point Cloud - usses a colour value to display the value stored in the voxel, with a grid of points based at the centre of each voxel. \item Axial Slice - \item Isosurface - Visually segment regions of high and low intensity within the data volume, by building a dividing surface between these two regions \end{itemize} If a range file is present in the input, this can be used to perform per-range computations, such as ratio voxelisation specific to particular species. Figure~\ref{fig:voxeliseDisplayType} shows the different representations on the same input data. \begin{figure} \centering \includegraphics[keepaspectratio=true,width=0.9 \textwidth]{./figures/voxel-representations.png} \caption{Voxelisation filter, showing different representations. Left to right shows point cloud, axial slice and isosurface mode on the same dataset} \label{fig:voxeliseDisplayType} \end{figure} Note that the limits of the values associated with the voxels will be printed on the console after the filter has refreshed -- this can be used, for example, to set the limits for isosurface representation. {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table}[!h] \caption{Propagation matrix for Voxels.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & No & Yes & Yes\\ Plot & No & No & Yes\\ Drawable & Yes & No & No\\ Range & No & Yes & No\\ Voxel & Yes & No & Yes\\ \hline \end{tabular} \end{center} \end{table} }% \FloatBarrier \subsubsection{Ion Colour} This filter allows for the association of a particular colour to an ion, based upon the value of the ion, and the desired colour scheme. By selecting a start and end value for the colour scheme, Points can be given a colour that interpolates between these two values. The ion's value (as, for example, visible in a spectrum histogram) is used to set the colour for that point. {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table}[!h] \caption{Propagation matrix for Ion Colour.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & Yes & Yes & Yes\\ Plot & No & No & No \\ Drawable & Yes & No & No\\ Range & No & No & No\\ Voxel & No & No & No\\ \hline \end{tabular} \end{center} \end{table} }% \FloatBarrier \subsubsection{Ion Transform} This filter allows for the transformation of the XYZ or value of a given point, based upon the chosen filtering algorithm. The available algorithms for transformation of a point are as given: \begin{itemize} \item \textbf{Translate}: Slide the dataset. \item \textbf{Scale}: Increase or decrease the size of the dataset. \item \textbf{Rotate}: Rotate the dataset around a given axis, by a given angle. \emph{E.g.}\ to rotate around the Z axis, set the axis to (0,0,1) , and provide the desired rotation. Euler angles are not used due to their mathematical singularities. \item \textbf{Value shuffle}: Scramble the values associated with each point -- \emph{i.e.}\ randomly re-assign each point some point's value, randomly picked from the dataset. Every value in the initial dataset will be present in the final dataset, in exactly the same frequency. \item \textbf{Spatial Noise}: Apply some noise to the value associated with each point, from a chosen noise distribution. \item \textbf{Translate value}: Move the value associated with each by a specified amount (\emph{i.e.}, $Value_{new} = Value_{orig} + someValue$). \end{itemize} {% \newcommand{\mc}[3]{\multicolumn{#1}{#2}{#3}} \begin{table}[!h] \caption{Propagation matrix for Ion Transform.} \begin{center} \begin{tabular}{llll} \hline \mc{1}{c}{\textbf{\underline{Stream}}} & \mc{1}{c}{\textbf{\underline{Emit}}} & \mc{1}{c}{\textbf{\underline{Use}}} & \mc{1}{c } {\textbf{\underline{Block}}}\\ \hline \\ [-2.2ex] Ion & Yes & Yes & Yes\\ Plot & No & No & No \\ Drawable & Maybe & No & No\\ Range & No & No & No\\ Voxel & No & No & No\\ \hline \end{tabular} \end{center} \end{table} }% A drawable will only be emitted if the ``show marker'' option is selected. \section{Attributions} \begin{itemize} \item The source code image is a derivative work of \url{http://commons.wikimedia.org/wiki/File:User_icon_2.svg} and \url{http://commons.wikimedia.org/wiki/C_cplusplus_compilation_process.svg}. \item The camera image is a derivative work of \url{http://commons.wikimedia.org/wiki/File:Icon_Camera.svg}. \end{itemize} \section{Licence} This document is licenced under the Creative Commons 3.0 ShareAlike licence. \url{http://creativecommons.org/licenses/by-sa/3.0/} \section{Appendices} \label{sec:appendix} \subsection{Paths} \label{sec:3DepictPaths} \emph{3Depict} uses one of several different paths for storing configuration and autosave information, depending upon your host operating system. \begin{itemize} \item Linux-like : your home directory, in th .3Depict folder. \emph{e.g.} \path{/home/someuser/.3Depict/} \item Mac OSX :\path{/Users/someuser/Documents/.3Depict/} \item Windows : usually \path{C:\Documents} \path{and} \path{settings\someuser\Documents\.3Depict\} %Sigh - path macro doesn't work with whitespace! \end{itemize} \subsection{File formats} \subsubsection{State file} \label{sec:xmlstatefile} The state file is an XML file, which is generated by \emph{3Depict}. XML is short for eXtensible Markup Language, and describes a basic format for data layout. In XML files, the file consists of elements, attributes and text. Each element is marked by the use of angle brackets, as in ``$<$element$>$''. Each element must have a start and an end marker, for example $<$element$>$ is the start marker, and must be followed by its end marker $<$/element$>$. These elements can be nested or in sequence, but cannot be mixed (it is wrong to say $<$element1$>$$<$element2$>$$<$/element1$>$$<$/element2$>$). A full description of the XML language is beyond the scope of this document, however many resources can be found online to explain the concept. The extensible bit means that \emph{3Depict} can define its own elements. Hence the exact format is subject to change from version to version.\footnote{Technical note: As of time of writing, the authors have not created a Document Type Descriptor (DTD) for the file which fully describes the file format. This may be done in future versions.} This is due to the rapidly changing nature of the filter properties. Unfortunately the most up-to-date documentation for the file format is the source code itself. For those who may be inclined to try to emulate this, you may wish to look at the VisController::saveState routine, and the \emph{Filter}::writeState routines. However, in general the file is divided into several sections. Below is an example file. \begin{verbatim} \end{verbatim} The state consists of the program version, to check that the program can actually interpret the file, a background colour, and the filter tree. Optional elements which are not shown in this example include the stash data, and the camera information (here there is only the default camera). The filter tree is shown, with a pos load filter as the top level element, which has a child element of iondownsample. Note that the attributes of each element are dependant upon the filter. Again due to the rapidly changing nature of the program, this is subject to change. \subsubsection{Range files} \label{sec:rangeFormat} \emph{3Depict}'s interpretation of the Oak-Ridge format for range files is given below. The original specification is available in the book \textit{Miller, Atom probe: Analysis at the atomic scale}, (Kluwer Academic/Plenum Publishers, ISBN 0306464152). Additional information on the format is given by the PoSaP program, which to the author's knowledge is not online. Unfortunately, the specification given for the file is weakly stated, and is open to different interpretations. \emph{3Depict} is designed to be as resilient as possible to variations that have been encountered, however it may be that there are alternate interpretations with which the authors are not familiar, and the code is thus unable to interpret. A simple example file is given below, and is nominally in the ASCII 1 byte per character format. The original specification, to the authors knowledge, predates the UTF-8 and extended codepage support for non English languages. Thus non-English languages are not part of the file format - each should use the ``C'' locale for reading and writing, to avoid localisation concerns. \begin{verbatim} 1 2 Aluminium Al 1 1 1 Al ------------- Al . 10.0 150 1 . 150 200.2 1 \end{verbatim} The first line consists of two unsigned integers, separated by a space. The first integer is the number of unique ion types, and the second is the number of ranges. The next lines are taken as pairs. The first entry in the pair is the name of the ``ion''. The next entry consists of four parts. The first entry is a space terminated string, and is the shorthand name for the element. The next three elements are floating point values in the range of $[0,1]$, and are the colour of the ions that are ranged, with each element being the red, green and blue component in turn (\emph{i.e.} cubic RGB space). The final string is, to the authors' knowledge, unused, and is ignored by \emph{3Depict}. This is repeated for each element pair, as specified by the first integer in the file. Each entry must be uniquely named, both in short and long names. The next line can nominally be ignored, however it should contain the dash character from positions 1 to 13, followed by a space separated list (with leading space) of the short names, as specified above. Sequence positions are \emph{not} obtained from the dash list, but rather from the order they appear in the file. Following this is a 2D table (space separated). The first column appears vestigial. The second and third columns contain the start and end ``range'' values for each ion. Note that these do not have to be in the same sequence as the original specification. These range values must be non-overlapping, and can be any 32 bit floating point number (other than NaN). The next columns are the range table, and specify which ions the range corresponds. In the \emph{3Depict} implementation, the table should have only entries of 0 or 1, and the row (from column 3) should to exactly 1. Files where this is not the case may be accepted, however the exact interpretation for non 0/1 entries is unclear, and not specified in the file, so will be essentially treated as either a 0 or 1 value. A more complex example is given below. \begin{verbatim} 3 3 Magnesium Mg 0.0 0.0 0.0 Copper Cu 0.0 0.0 0.0 Nickel Ni 0.0 0.0 0.0 ------------- Mg Cu Ni . 25 27 1 0 0 . 25 33 0 1 0 . 55.6 59 0 0 1 \end{verbatim} Note that\emph{3Depict} guarantees to be able to read its own range files, and will do its best to read files generated by any major external program (within reason). If you have a file that you believe should be accepted, please contact the author. \subsubsection{POS files} \label{sec:posformat} This file is a four-field fixed width record file, with an integer number of entries. The file is uncompressed raw 32 bit IEEE754 floating point data, and can be loaded using most languages relatively easily. Note that the order of the floating point numbers ``endian-ness'' is fixed as big-endian. The floating point values are X,Y,Z and an arbitrary scalar value. The file may not contain invalid (Not-a-Number ``NaN'') values. \emph{3Depict} will accept files with different numbers of records (eg XYZ only, or XYZMI (where I is ignored)), but this must be manually specified in the DataLoadFilter. \subsubsection{Text files} \label{sec:textformat} The text files that are accepted by \emph{3Depict} must be ASCII formatted, and consist of at least four columns of data, separated by an acceptable delimiter. The accepted delimiters are currently tab, space and comma. The numeric format must be in the English locale, \emph{i.e.}\ with a period used as the decimal separator, consisting of the digits 0--9 and the + and - symbols. Each file may have a contiguous header that does not consist of this format, however if ANY portion of the header is interpretable as per the above, this will be considered to be the end of the header, and the remainder of the file is the file body. All lines in the file body must be interpretable as per the above. Note that due to the need to do multiple passes over the text file to interpret it, and the need to do string to binary conversions, this will be considerably slower than using a POS formatted file for large inputs. \subsection{External Program Examples} \label{sec:externalProgExample} The ``external program'' filter can be used to transfer data on-the-fly between \emph{3Depict} and a separate program, allowing for an extension of the capabilities of \emph{3Depict}, without requiring direct modification of \emph{3Depict} itself. This is targeted at advanced users who wish to connect other programs to \emph{3Depict}, as part of their analysis toolchain. Here short, simple example programs are given in several languages. Specifically, we provide examples for \emph{Scilab}, \emph{Python}, \emph{Bash} and \emph{C/C++} - representing an accessible breadth of differing programming languages. In each language the fundamental principles of loading and returning data to and from \emph{3Depict} is the same. Each example will load an input file, generated from \emph{3Depict}, optionally alter the data, and then return the modified data back to \emph{3Depict}. The examples are for instructive purposes only, and do not reflect the optimal implementation of the specific task, in order to simplify the presented program. Not all features of the external program filter are presented in this Appendix. For the full documentation on the filter, see Section~\ref{sec:rangeFilter}. Files for the sample programs can be generated from the following inline examples, or alternately, can be downloaded form their respective URLs \begin{itemize} \item Scilab - \url{http://threedepict.sourceforge.net/samples/externalprogram/loadPos.sci} \item Python - \url{http://threedepict.sourceforge.net/samples/externalprogram/python-example.py} \item BASH - \url{http://threedepict.sourceforge.net/samples/externalprogram/bash-example.sh} \item C++ - \url{http://threedepict.sourceforge.net/samples/externalprogram/cpp-example.cpp} \end{itemize} \subsubsection{Scilab} This example uses the computational package \emph{Scilab} can be used with \emph{3Depict}. Scilab is available online, at \url{http://scilab.org} and is a general numerical computing package. In this example, the script simply opens a file, moves the point cloud by -1,-1,-1, then saves the output. The output, and input (due to the Bounding box filter) are both visible in Figure~\ref{fig:externalProgScilabSample} - note the offset induced by the script. During refresh of the filter tree, the \emph{Scilab} interface appears, performs its computation, and then exits, as instructed by the script. Any desired computation could be performed at this stage - exiting \emph{Scilab} can also be done at any time by the user by removing the final exit instruction. This procedure may be useful if interactive querying of the dataset was desired. \begin{figure} \begin{center} \includegraphics[keepaspectratio=true,width=0.9 \textwidth]{./figures/externalProgScilab.png} \caption{Example program screenshot using the \emph{Scilab} sample script. The \%i value in the command line instructs \emph{3Depict} to take the first (and only the first) ion stream, and save it as an input file for the external program. } \label{fig:externalProgScilabSample} % externalProgBash.png: 1381x875 pixel, 72dpi, 48.71x30.86 cm, bb=0 0 1381 875 \end{center} \end{figure} Note that as shown in the figure \emph{Scilab} is called using its `-args' parameter, which avoids \emph{Scilab} from attempting to parse the arguments you wish to pass to the script as its own. Further note that this example will not work if any filename or directory (including the working directory) contains a space, due to this behaviour. In this case, \emph{3Depict} was launched from its own folder, which does not contain a space. \begin{verbatim} //Example function for loading, manipulating and writing // pos files in scilab, for integrating with 3Depict's // external program filter //------- function [errState, x,y,z,m]=loadPos(filename) x=[];y=[]; z=[]; m=[]; //get filesize [fileInf,ierr] = fileinfo(filename) filesize=fileInf(1); //ensure filesize has 16 as a factor. if ( modulo(filesize,16) ~= 0 ) errState=1; return end numEntries=filesize/16; //Open the file for read only, in binary mode [fd, err] = mopen(filename,'rb'); //Check to see we are A-OK if err ~= 0 errState=2; return end //Read the data in as floating point values in big-endian format data=mget(numEntries,'fb',fd); //check read OK if merror(fd) errState=3; mclose(fd); return end //Unsplice data, which was stored as xyzmxyzmxyzm... x=data(1:4:$)'; y=data(2:4:$)'; z=data(3:4:$)'; m=data(4:4:$)'; clear data; mclose(fd) errState=0; endfunction function err=writePos(filename,x,y,z,m) //Check that the array sizes match sizes = [ length(x), length(y),length(z),length(m)]; if max(sizes) ~= min(sizes) err=1; return end //Open the file write, in binary mode [fd, errState] = mopen(filename,'wb'); if(errState) err=2; return; end //Build a matrix to dump the data into // in xyzmxyzmxyzm form data=zeros(sizes(1)*4,1); data(1:4:$) = x; data(2:4:$) = y; data(3:4:$) = z; data(4:4:$) = m; mput(data,'fb',fd); //Check for io error if merror(fd) ~=0 mclose(fd); err=3; return; end err=0; mclose(fd); endfunction //------- //START OF SCRIPT //Inform scilab we may need lots of ram. stacksize('max'); //Strip out the script arguments from the general scilab arguments argsArray=sciargs(); realArgs=[]; numArgs =length(length(argsArray)); //'cause length() is dumb on strings. for i=1:numArgs if argsArray(i) == '-args' & i != length(argsArray); realArgs=argsArray(i+1:$); end end if( length(argsArray) == 0) error('no file to open!'); end //Load the first argument [errState, x, y, z, m] = loadPos(realArgs(1)); if errState error( strcat(['Unable to load posfile, :( ' realArgs(1)])); else printf('Opened file: %s ',realArgs(1)); end //Draw the point cloud scf drawlater plot3d1(x,y,z) f=gcf(); pointCloud=f.children.children; pointCloud.surface_mode="off"; pointCloud.mark_mode="on"; drawnow //plot a histogram of m, avoiding the error where m has no span // by artifically adding two elements, if needed. scf(); if max(m) ~= min(m) histplot(100,m); else histplot(100,[min(m)-1; m; max(m)+1]); end //Now shift each point around x=x-1; y=y-1; z=z-1; //now write the file back err=writePos('output.pos',x,y,z,m); if err~= 0 error('failed to write posfile, :('); end //Kill Scilab, because were done and would like to go back to 3Depict. exit \end{verbatim} \subsubsection{Python} This example demonstrates using \emph{Python} to interact with \emph{3Depict}. The following example does very little - it simply loads all input pos files (due to the \%I in the program invocation), and merges the contents. The results of the computation are shown in Figure~\ref{fig:externalProgPythonSample}. \begin{figure} \begin{center} \includegraphics[keepaspectratio=true,width=0.85 \textwidth]{./figures/externalProgPython.png} \caption{Example program screenshot without and with the Python test example present. Note that the program merges ion streams into a single pos file, which is re-loaded as a single ion stream, as marked by the arrows.} \label{fig:externalProgPythonSample} % externalProgBash.png: 1381x875 pixel, 72dpi, 48.71x30.86 cm, bb=0 0 1381 875 \end{center} \end{figure} \begin{verbatim} #!/usr/bin/python import sys import os #Function to append the contents of one file to another def appendFile(sourceFile,targetFile): try : fileSrc = open(sourceFile,"rb") fileTarget = open(targetFile,"ab") #Extremely inefficient!! byte = fileSrc.read(1) while byte != "" : fileTarget.write(byte) byte=fileSrc.read(1) except IOError: return 1 return 0 def main(): argv = sys.argv #Name of file that we will dump our results to OUTPUT_POSFILE="output.pos" #Remove any old files from previous runs if os.path.isfile(OUTPUT_POSFILE) : os.remove(OUTPUT_POSFILE) # do nothing if we have no arguments if(len(argv) < 2) : return 0; #Loop over all our inputs, then for .pos files, # create one big file with all data merged for i in argv[1:] : print "given file :" + i fileExt = i[-3:]; if fileExt == "pos" : if appendFile(i,OUTPUT_POSFILE): return 1; #Output to file failed, for some reason else : print "appended file to " + OUTPUT_POSFILE else : #Filename did not end in .pos, lets ignore it. print "File :" + i + " does not appear to be a pos file" return 0 if __name__ == "__main__": sys.exit(main()) \end{verbatim} \subsubsection{Bash} The following trivial program shows how \emph{3Depict} can be used send data to and from Bourne Again SHell (\emph{BASH}) programs. \emph{3Depict} was launched with one pos file, and an external program filter, as shown in Figure~\ref{fig:externalProgBashSample}. The script used in the test, named ``test.sh'' and placed in the specified working directory (see figure), is given below. The object of the script is only to demonstrate that the script can be used to perform arbitrary actions, not to perform any actual data manipulations. \begin{figure} \begin{center} \includegraphics[keepaspectratio=true,width=0.85 \textwidth]{./figures/externalProgBash.png} \caption{Example program screenshot when using the BASH test example.} \label{fig:externalProgBashSample} % externalProgBash.png: 1381x875 pixel, 72dpi, 48.71x30.86 cm, bb=0 0 1381 875 \end{center} \end{figure} \begin{verbatim} #!/bin/bash BYTES_PER_RECORD=16 echo "Num args : "$# echo "Working Directory:" $(pwd) #Cleanup any previous script-output file rm script-output-3Depict-input.pos for (( i=1; i<=$#; i++ )); do #Get the name of the input file eval arg=\$$i echo "Input file: $arg" #Print some info about the file echo "File size:" $(filesize $arg) " Bytes" NUM_IONS=$(expr $(filesize $arg) / $BYTES_PER_RECORD) echo "Num Ions:" $NUM_IONS #Copy the output into the working directory, so that 3Depict's # scanning of the working directory # for .pos files will find it cat $arg >> script-output-3Depict-input.pos done exit 0 \end{verbatim} The output from running the refresh cycle is given, as it appears on the program console (to replicate this mac/windows users may need to redirect the output to a file in order to see the output text (this can be done in bash), or mac users may launch \emph{3Depict} from terminal.app). Firstly, note that the \emph{same file} is written to each time - \emph{3Depict} does not delete the ``script-output-3Depict-input.pos``, so if this is named differently between refreshes, multiple pos files would be generated and \emph{3Depict} would load them all. Finally, the statement \texttt{exit 0} is used to ensure that \emph{3Depict} knows that the program terminated successfully. Recall that returning a nonzero value will inform \emph{3Depict} that some error occurred during processing, and thus it will abort further data processing. \begin{verbatim} Working Directory: /home/username/3Depict/src Input file: /home/username/3Depict/src//inputData/pointdataDNUlfP.pos File size: 5242880 Bytes Num Ions: 327680 \end{verbatim} The output from the program will be similar to the following text. \begin{verbatim} given file :/home/auser/Desktop/3Depict/src//inputData/pointdatad7hfUw.pos appended file to output.pos \end{verbatim} \subsubsection{C/C++} For \emph{C/C++}, an example is given. The example here is somewhat more complex than the rest, as in this case, we do not simply treat the data as a series of bytes, bt we additionally perform the data transformation steps required to get it into a usable form (ie as a list of correctly ordered bytes in memory, in a useful variable). This was not done for the previous examples. Note that as C/C++ are compiled languages, it is necessary to be able to be able to generate a binary (executable) version of the program - this procedure is not described here, but users are encouraged to be comfortable with this process before attempting to implement the following examples for themselves. The exact procedure for doing this is outside of the scope for this document - you will require a compiler, such as \emph{gcc}'s \emph{g++} compiler, which you will most likely want to install from some form of package management system, such as the \emph{APT}, \emph{yum} or \emph{zypper} systems on linux, \emph{Xcode} or \emph{Macports} on Mac OSX, or \emph{Cygwin} or \emph{tdm-gcc/msys} under windows. Being able to compile a program file to produce an executable binary (under windows `EXE') that consists only of \texttt{int main() \{\} } is a definite prerequisite. For this program, once your compiler is installed, and assuming you use \emph{gcc}, the normal procedure is to place the following code into a text file called \texttt{example.cpp}, then run \texttt{g++ example.cpp -Wall -o example}, to produce the binary. You must be execute that command in the same folder as the example.cpp file is located. This produces a binary file, called ``example'' under linux/OSX or ``example.exe'' under windows, now setting up \emph{3Depict} as per Figure~\ref{fig:externalProgCppSample}, several ranged ionstreams are passed to the program, which are merged into a single file. This single file is detected automatically by \emph{3Depict}, as it is a file ending in ``.pos'', and is located in the working directory - it is thus assumed to be loadable. \begin{figure} \begin{center} \includegraphics[keepaspectratio=true,width=0.85 \textwidth]{./figures/externalProgCpp.png} \caption{Example program screenshot without and with the C++ test example present..} \label{fig:externalProgCppSample} % externalProgBash.png: 1381x875 pixel, 72dpi, 48.71x30.86 cm, bb=0 0 1381 875 \end{center} \end{figure} \begin{verbatim} #include #include #include #include using namespace std; enum { ENDIAN_LITTLE, ENDIAN_BIG, ENDIAN_DUNNO, }; int endian=ENDIAN_DUNNO; const int ENDIAN_TEST=1; //Run-time detection of CPU endian-ness //--- inline int is_bigendian() { return (*(char*)&ENDIAN_TEST) == 0 ;} inline int is_littleendian() { return (*(char*)&ENDIAN_TEST) == 1 ;} void detectEndianNess() { if(is_littleendian()) endian=ENDIAN_LITTLE; else if (is_bigendian()) endian=ENDIAN_BIG; else endian=ENDIAN_DUNNO; } //--- struct POS_DATA { float values[4]; }; //A routine for flipping data bytes around between // big and little endian IEEE754 format void floatSwapBytes(float *inFloat) { //Use a union to avoid strict-aliasing error union FloatSwapUnion{ float f; char c[4]; } ; FloatSwapUnion fa,fb; fa.f = *inFloat; fb.c[0] = fa.c[3]; fb.c[1] = fa.c[2]; fb.c[2] = fa.c[1]; fb.c[3] = fa.c[0]; *inFloat=fb.f; } //A not-particularly efficient pos-file loader // returns true on success, false on failure bool loadPosFile(const std::string &str,vector &p) { //open file for "binary" access mode ifstream file(str.c_str(),ios::binary); //Check file opened OK if(!file) return false; //open failed //Check filesize (in bytes) // we do this by jumping to the end, // asking the offset, then jumping back to the start // as this is very cross-platform (but probably inefficient) file.seekg(0,std::ios::end); size_t fileSize=file.tellg(); file.seekg(0,std::ios::beg); //Filesize must be 4 4 byte floats if(fileSize %16) return false; //OK, now read the contents size_t numEntries=fileSize/16; POS_DATA pd; for(size_t ui=0;ui &p) { //This function assumes floats are 4 bytes if(sizeof(float) !=4) return false; //Open the file for output ofstream file(filename.c_str(),ios::binary); if(!file) return false; if(endian == ENDIAN_LITTLE) { //On little endian machines, loading is a little complicated // as we need to convert the pos output back to big-endian mode // first float values[4]; for(size_t ui=0;ui args; for(int ui=1;ui p; try { for(size_t ui=0;ui &v, unsigned int mask) diff -r e500a2602f86 src/backend/filter.h --- a/src/backend/filter.h Sun Jul 20 15:44:52 2014 +0100 +++ b/src/backend/filter.h Sun Jul 20 15:49:30 2014 +0100 @@ -71,6 +71,7 @@ FILTER_TYPE_VOXELS, FILTER_TYPE_IONINFO, FILTER_TYPE_ANNOTATION, + FILTER_TYPE_TEMPLATE, FILTER_TYPE_ENUM_END // not a filter. just end of enum }; diff -r e500a2602f86 src/backend/filters/allFilter.cpp --- a/src/backend/filters/allFilter.cpp Sun Jul 20 15:44:52 2014 +0100 +++ b/src/backend/filters/allFilter.cpp Sun Jul 20 15:49:30 2014 +0100 @@ -104,6 +104,9 @@ case FILTER_TYPE_ANNOTATION: f = new AnnotateFilter; break; + case FILTER_TYPE_TEMPLATE: + f = new TemplateFilter; + break; default: ASSERT(false); } diff -r e500a2602f86 src/backend/filters/allFilter.h --- a/src/backend/filters/allFilter.h Sun Jul 20 15:44:52 2014 +0100 +++ b/src/backend/filters/allFilter.h Sun Jul 20 15:49:30 2014 +0100 @@ -32,6 +32,7 @@ #include "voxelise.h" #include "ionInfo.h" #include "annotation.h" +#include "filterTemplate.h" //!Returns true if the string is a valid filter name bool isValidFilterName(const std::string &s); diff -r e500a2602f86 src/gui/mainFrame.cpp --- a/src/gui/mainFrame.cpp Sun Jul 20 15:44:52 2014 +0100 +++ b/src/gui/mainFrame.cpp Sun Jul 20 15:49:30 2014 +0100 @@ -116,7 +116,7 @@ //MainFrame's constructor //--- These settings must be modified concomitantly. -const unsigned int FILTER_DROP_COUNT=14; +const unsigned int FILTER_DROP_COUNT=15; const char * comboFilters_choices[FILTER_DROP_COUNT] = { @@ -134,6 +134,7 @@ NTRANS("Range File"), NTRANS("Spat. Analysis"), NTRANS("Voxelisation"), + NTRANS("Template") }; //Mapping between filter ID and combo position @@ -152,6 +153,7 @@ FILTER_TYPE_RANGEFILE, FILTER_TYPE_SPATIAL_ANALYSIS, FILTER_TYPE_VOXELS, + FILTER_TYPE_TEMPLATE, }; //---- diff -r 036cf664e28d docs/developers/filter-template.patch --- a/docs/developers/filter-template.patch Sun Aug 24 14:17:50 2014 +0100 +++ b/docs/developers/filter-template.patch Sun Aug 24 14:18:26 2014 +0100 @@ -1,97 +0,0 @@ -diff -r e500a2602f86 src/Makefile.am ---- a/src/Makefile.am Sun Jul 20 15:44:52 2014 +0100 -+++ b/src/Makefile.am Sun Jul 20 15:49:30 2014 +0100 -@@ -38,7 +38,7 @@ - backend/filters/compositionProfile.cpp backend/filters/spatialAnalysis.cpp \ - backend/filters/clusterAnalysis.cpp backend/filters/ionInfo.cpp \ - backend/filters/annotation.cpp backend/filters/geometryHelpers.cpp \ -- backend/filters/algorithms/binomial.cpp -+ backend/filters/algorithms/binomial.cpp backend/filters/filterTemplate.cpp - - FILTER_HEADER_FILES = backend/filters/allFilter.h backend/filters/filterCommon.h \ - backend/filters/dataLoad.h backend/filters/ionDownsample.h \ -@@ -48,7 +48,7 @@ - backend/filters/compositionProfile.h backend/filters/spatialAnalysis.h \ - backend/filters/clusterAnalysis.h backend/filters/ionInfo.h \ - backend/filters/annotation.h backend/filters/geometryHelpers.h \ -- backend/filters/algorithms/binomial.h -+ backend/filters/algorithms/binomial.h backend/filters/algorithms/filterTemplate.h - - BACKEND_SOURCE_FILES = backend/animator.cpp backend/filtertreeAnalyse.cpp backend/filtertree.cpp \ - backend/APT/ionhit.cpp backend/APT/APTFileIO.cpp backend/APT/APTRanges.cpp backend/APT/abundanceParser.cpp \ -diff -r e500a2602f86 src/backend/filter.cpp ---- a/src/backend/filter.cpp Sun Jul 20 15:44:52 2014 +0100 -+++ b/src/backend/filter.cpp Sun Jul 20 15:49:30 2014 +0100 -@@ -63,7 +63,8 @@ - "clusteranalysis", - "voxelise", - "ioninfo", -- "annotation" -+ "annotation", -+ "template" - }; - - size_t numElements(const vector &v, unsigned int mask) -diff -r e500a2602f86 src/backend/filter.h ---- a/src/backend/filter.h Sun Jul 20 15:44:52 2014 +0100 -+++ b/src/backend/filter.h Sun Jul 20 15:49:30 2014 +0100 -@@ -71,6 +71,7 @@ - FILTER_TYPE_VOXELS, - FILTER_TYPE_IONINFO, - FILTER_TYPE_ANNOTATION, -+ FILTER_TYPE_TEMPLATE, - FILTER_TYPE_ENUM_END // not a filter. just end of enum - }; - -diff -r e500a2602f86 src/backend/filters/allFilter.cpp ---- a/src/backend/filters/allFilter.cpp Sun Jul 20 15:44:52 2014 +0100 -+++ b/src/backend/filters/allFilter.cpp Sun Jul 20 15:49:30 2014 +0100 -@@ -104,6 +104,9 @@ - case FILTER_TYPE_ANNOTATION: - f = new AnnotateFilter; - break; -+ case FILTER_TYPE_TEMPLATE: -+ f = new TemplateFilter; -+ break; - default: - ASSERT(false); - } -diff -r e500a2602f86 src/backend/filters/allFilter.h ---- a/src/backend/filters/allFilter.h Sun Jul 20 15:44:52 2014 +0100 -+++ b/src/backend/filters/allFilter.h Sun Jul 20 15:49:30 2014 +0100 -@@ -32,6 +32,7 @@ - #include "voxelise.h" - #include "ionInfo.h" - #include "annotation.h" -+#include "filterTemplate.h" - - //!Returns true if the string is a valid filter name - bool isValidFilterName(const std::string &s); -diff -r e500a2602f86 src/gui/mainFrame.cpp ---- a/src/gui/mainFrame.cpp Sun Jul 20 15:44:52 2014 +0100 -+++ b/src/gui/mainFrame.cpp Sun Jul 20 15:49:30 2014 +0100 -@@ -116,7 +116,7 @@ - //MainFrame's constructor - - //--- These settings must be modified concomitantly. --const unsigned int FILTER_DROP_COUNT=14; -+const unsigned int FILTER_DROP_COUNT=15; - - const char * comboFilters_choices[FILTER_DROP_COUNT] = - { -@@ -134,6 +134,7 @@ - NTRANS("Range File"), - NTRANS("Spat. Analysis"), - NTRANS("Voxelisation"), -+ NTRANS("Template") - }; - - //Mapping between filter ID and combo position -@@ -152,6 +153,7 @@ - FILTER_TYPE_RANGEFILE, - FILTER_TYPE_SPATIAL_ANALYSIS, - FILTER_TYPE_VOXELS, -+ FILTER_TYPE_TEMPLATE, - }; - //---- - diff -r 036cf664e28d src/Makefile.am --- a/src/Makefile.am Sun Aug 24 14:17:50 2014 +0100 +++ b/src/Makefile.am Sun Aug 24 14:18:26 2014 +0100 @@ -38,7 +38,7 @@ backend/filters/compositionProfile.cpp backend/filters/spatialAnalysis.cpp \ backend/filters/clusterAnalysis.cpp backend/filters/ionInfo.cpp \ backend/filters/annotation.cpp backend/filters/geometryHelpers.cpp \ - backend/filters/algorithms/binomial.cpp + backend/filters/algorithms/binomial.cpp backend/filters/filterTemplate.cpp FILTER_HEADER_FILES = backend/filters/allFilter.h backend/filters/filterCommon.h \ backend/filters/dataLoad.h backend/filters/ionDownsample.h \ @@ -48,7 +48,7 @@ backend/filters/compositionProfile.h backend/filters/spatialAnalysis.h \ backend/filters/clusterAnalysis.h backend/filters/ionInfo.h \ backend/filters/annotation.h backend/filters/geometryHelpers.h \ - backend/filters/algorithms/binomial.h + backend/filters/algorithms/binomial.h backend/filters/algorithms/filterTemplate.h BACKEND_SOURCE_FILES = backend/animator.cpp backend/filtertreeAnalyse.cpp backend/filtertree.cpp \ backend/APT/ionhit.cpp backend/APT/APTFileIO.cpp backend/APT/APTRanges.cpp backend/APT/abundanceParser.cpp \ diff -r 036cf664e28d src/backend/filter.cpp --- a/src/backend/filter.cpp Sun Aug 24 14:17:50 2014 +0100 +++ b/src/backend/filter.cpp Sun Aug 24 14:18:26 2014 +0100 @@ -63,7 +63,8 @@ "clusteranalysis", "voxelise", "ioninfo", - "annotation" + "annotation", + "template" }; size_t numElements(const vector &v, unsigned int mask) diff -r 036cf664e28d src/backend/filter.h --- a/src/backend/filter.h Sun Aug 24 14:17:50 2014 +0100 +++ b/src/backend/filter.h Sun Aug 24 14:18:26 2014 +0100 @@ -71,6 +71,7 @@ FILTER_TYPE_VOXELS, FILTER_TYPE_IONINFO, FILTER_TYPE_ANNOTATION, + FILTER_TYPE_TEMPLATE, FILTER_TYPE_ENUM_END // not a filter. just end of enum }; diff -r 036cf664e28d src/backend/filters/allFilter.cpp --- a/src/backend/filters/allFilter.cpp Sun Aug 24 14:17:50 2014 +0100 +++ b/src/backend/filters/allFilter.cpp Sun Aug 24 14:18:26 2014 +0100 @@ -104,6 +104,9 @@ case FILTER_TYPE_ANNOTATION: f = new AnnotateFilter; break; + case FILTER_TYPE_TEMPLATE: + f = new TemplateFilter; + break; default: ASSERT(false); } diff -r 036cf664e28d src/backend/filters/allFilter.h --- a/src/backend/filters/allFilter.h Sun Aug 24 14:17:50 2014 +0100 +++ b/src/backend/filters/allFilter.h Sun Aug 24 14:18:26 2014 +0100 @@ -32,6 +32,7 @@ #include "voxelise.h" #include "ionInfo.h" #include "annotation.h" +#include "filterTemplate.h" //!Returns true if the string is a valid filter name bool isValidFilterName(const std::string &s); diff -r 036cf664e28d src/gui/mainFrame.cpp --- a/src/gui/mainFrame.cpp Sun Aug 24 14:17:50 2014 +0100 +++ b/src/gui/mainFrame.cpp Sun Aug 24 14:18:26 2014 +0100 @@ -121,7 +121,7 @@ //MainFrame's constructor //--- These settings must be modified concomitantly. -const unsigned int FILTER_DROP_COUNT=14; +const unsigned int FILTER_DROP_COUNT=15; const char * comboFilters_choices[FILTER_DROP_COUNT] = { @@ -139,6 +139,7 @@ NTRANS("Range File"), NTRANS("Spat. Analysis"), NTRANS("Voxelisation"), + NTRANS("Template") }; //Mapping between filter ID and combo position @@ -157,6 +158,7 @@ FILTER_TYPE_RANGEFILE, FILTER_TYPE_SPATIAL_ANALYSIS, FILTER_TYPE_VOXELS, + FILTER_TYPE_TEMPLATE, }; //---- 3Depict-0.0.19/NEWS0000644000175000017500000000001612640746376013173 0ustar pcuserpcuserSee changelog 3Depict-0.0.19/missing0000755000175000017500000002557712640746376014116 0ustar pcuserpcuser#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2006-05-10.23 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case $1 in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $1 in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: 3Depict-0.0.19/ChangeLog0000644000175000017500000007652212723152365014254 0ustar pcuserpcuser* ?? Jun 2016 : 0.0.19 Features: - New "Local concentration" algorithm in spatial analysis filter - Add text and VTK export to Export Pos dialog - Experimental Background fitting in spectra User Visible Changes: - Camera re-orientation buttons have been added. Previously you could get a similar effect using keyboard shortcuts, eg Ctrl+Space - Fixed breakage to monitor mode - Only show erosion clustering parameter if bulk linking is enabled - Fixes for hanging when loading some files under windows - Fix broken point em/replacement (set operation) mode in spatial analysis - Fix missing and incorrectly labelled denominator property in voxelisation - Refresh button now changes to "Abort" during calculations for all platforms (Previously windows only) - Fix loading of rangefile data in filter tree, broken in 0.0.18 - Improve progress reporting for some filters - Fix opengl rendering on OSX (Previously resizes would cause scene to be distorted or clipped) - Minor improvements to point colour and size tracking - Fix bug in point replace mode where square distance was used instead of regular distance. Technical Bugfixes/changes: - Many minor memory leaks fixed - Fixes for C++11 compilation - Many small crash bugs fixed - Fix analysis state lost if loading state failed - Fix name collision detection in package export - will now check for origin of file, not just name - Fix race bug in voxel summation, caught by unit tests. * 05 Apr 2015 : 0.0.18 * 05 Apr 2015 : 0.0.18 Features: - User interface now uses its own CPU. Should be much more responsive during refreshes - Spectra can be normalised to allow for easier inter-spectra comparison. Several normalisation modes have been added. - Clustering ellipse fitting implemented. Can now determine best-fit ellipsoids on clusters, and plot them in 2D to identify lath/rod/sphere/disc shapes - Voxelisation filter now supports fast blurring User Visible Changes: - Axial slice in voxelisation can now be made translucent - More noticable progress feedback, now as a progress "spinner" Technical bugfixes/changes: - Significant refactoring of internals to allow for threading. - State has been made more prominent, viscontrol less. - New "TreeState" object created - New library added for voxelisation/image support : libvigra * 01 Sep 2014 : 0.0.17 Features - Upgrade to wxWidgets 3 (wx3) - Now using wx3 property grid. Property grid interaction greatly improved. - Categories collapsible - file browse buttons - One-click check buttons/dropdown - Set (Subtraction/Union/Intersection) operations on points - Can, eg load data from separate file after performing operations on primary file User Visible Changes - Fix bug in left/right panel startup size setting - Exporting images with colour bar now works correctly - Cursor now shows OS' busy status during refresh - Files no longer disappear from recent when loading - Fix range propagation behaviour when using spatial analysis - Clustering now supports cluster ID->value mode (Feature request) - Status messages are now queued, so they won't be missed - Fixed profile minimum events not working Technical bugfixes/changes: - wxWidgets < 2.9 (prior to 2010) no longer supported - Remove 2.8 conditional code - Mathgl < 2.0 (prior to 2011) no longer supported - Remove 1.x conditional code - Fix relatively frequent crashes when sampling data files under parallel mode - 2D plots (f(x,y) and scatter+size) now supported, but no filter actually currently uses this - All filter properties must have a group title - Fix crash in mac OSX if expected data files not found - Refactoring for filter caching and property setting - Fix linker failure when using distcc * 01 Mar 2014 : 0.0.16 Features: - Added experimental LAWATAP (ATO) file support - Please send sample files! User Visible Changes: - Animation state now saved/restored - Plot interaction should be much faster - Minor UI improvements - Filter tree now persistent when interacting, where possible - Mouse hover shows name on plot regions (ranges) - Show user prompt when no filters present - Nicer text fonts - Clustering filter properties simplified - Nicer looking logarithmic plots - Left plot panel now remembers size correctly - Minor 3D drawing fixes - Fixed inside-out cones on bounding box Z-axis - Fixed line-overlap-arrow with large annotation arrow linewidths - Allow loading text files with 3 columns - Fixed random_shuffle not being seeded in transform relabel - Composition profiles now have "min count" mode - Rotating camera image output was broken in version 0.0.15 - fixed - Prevent creation of "stretched" image output Technical bugfixes/changes: - Linux automated UI checking, based on dogtail - Bugfix for caching errors in 0.0.15 tarball (already fixed in binary releases, and in repo) - many filters would incorrectly emit input data after caching - Many minor memory leaks and bugs fixed, due to Coverity scan - No longer launch 3Depict from windows installer - Windows UAC bug : no API for launching unprivileged processes from privileged ones - Fix crash with some tree configurations - Unit tests now check for installed files presence - Fix crash when linked against some mathgl-2 versions - Fixed SVG saving under non-english locales - Add support for qhull2012 - Fixed caching parameter ineffective, due to fraction->percent bug - Fixed packages with anaglyph effect not loading * 01 Dec 2013 : 0.0.15 Features - Range editing dialog : Rangefiles can be modified via a dialog available from the "edit" menu - A Range filter and a spectra filter must be present first - "Overlays" can be used to generate isotopic distributions for comparison - "Binomial analysis" algorithm, (Moody et al, 2011) for data randomness testing User Visible Changes: - Middle double click to zoomout on plots - Improved user feedback in transform filter - Better console output, messages now persistent - Progress dialog for animation - Colour bar auto-changes colour on light backgrounds - Colour maps now reversible - Orthogonal camera can be selected by default - Improved RRNG and ENV support - ENV 0.3 supported User Visible Bugfixes: - Image export fixed wrong aspect ratio ion output images - Fix plot export dialog when (png/svg) extension given - Fix tree/property grid not always synchronised - Fix "jumping" of movable objects after interaction - Fix custom filter names not being saved correctly - Fix undo not recorded after tree copy - Fix axial dist aborting problem - Fix loading of .xy files from external program filter - Fix hang when disabling weak/fast randomisation - Fix intermittent problems with spatial analysis filter aborting - Fix incorrect parsing of external program commands - Fix state file loading in downsample filter, fixed count mode - Fix camera animation continually asking if you want to save, after animation completion - Fix colour interpolation in animate dialog Technical bugfixes/changes: - Fix hang when filters given directories as input (linux) - Fix bug in extern filter where data would be output even on empty command - Better out-of-memory exception handling at refresh level - Various memory leak fixes - Refactoring - filter caching - unit testing - scene opengl init - More unit testing - Remove plot pane polling for region change * 20 Jul 2013 : 0.0.14 Features: - 2D slice render mode for voxels. Can now visualise voxel data using colourised planes - show voxel values on a given slice - Animated spin-progress icon to show refresh status - Automatic, but optional, limiting of point count in 3D display - Improved responsiveness of program to user when working with large datasets. Enabled by default. - Downsampling no longer added when loading datasets - New "double-ORNL rng" rangefile support User Visible Bugfixes/Changes: - Fix "blinking"/flicker problems in 3D scene when changing properties - Improved tracking of changes to state - Current filename - Current directory - Changes to state (eg, for asking to save at exit) - Fix state load/save bugs - Orthogonal camera scaling - stash handling - Add new tree warnings - Composition biasing warning for rangefile->composition pairs - Missing required parent filter (eg clustering) - More caching in voxel filter, for better performance - Better axis handling for plot window - Better handling of cylinder objects during interaction - Improved performance in some cases when ranging - On Mac OSX, manual now stored locally - New "quick start" section in documentation - Ranged ions/volume now reported correctly by ion info filter Technical Bugfixes/Features: - Split viscontrol and analysis state into separate modules - Minor improvements to rangefile loading - Improved assertion checking for selection bindings - Remove needless templating of selection devices - Continuous Integration script for cppcheck - Minor opengl enhancement (performance & error reporting) * 12 Apr 2013 : 0.0.13 Features: - Spherical composition profile support - Added axial distribution mode to spatial analysis (directional RDF) - New build for windows 64 (no parallel build available yet) User Visible Bugfixes/Changes: - Fix crash if unable to obtain RSS feed when checking for updates from behind proxy (Windows only) - Rangefiles now correctly load when altering name property - Copy/pasting from the raw data grid now works. - Plot now updates when scrolling, rather than just during mouse motion - Fix refresh loop in Data Load filter when "monitor" active and "enabled" inactive. - Fix RDF generating error/crashes when passing < 4 points - Fix voxel filtering not preserving intensity correctly - Fix crash bug on OSX during animate - Fix animate dialog, where wrong text box updated on frame change - Animate dialog "remove" button now works correctly - Clipping algorithm now uses multiple CPUs - RDF algorithm (max dist) now uses multiple CPUs - The default camera now is stored and loaded when saving state - Ion information filter now emits warnings if sampling is enabled by a parent - Warning on export of plot's without legend fixed - Fix bug where gl window did not update after sash move on some video drivers - Not providing an extention when exporting plots now causes prompt, rather than error - Fixed filters not staying selected when loading new data files - More locking of UI elements during refresh - Improve view splitter startup behaviour Technical Bugfixes/Features: - Mathgl >= 1.11 (Nov 2010) now required as hard dependency, earlier versions will not compile - Mathgl 2.x now supported - Refactored clipping and concentration profile code into single geometry handler - Refactored often copy-pasted XML writer code back to "filter common" functions - Fixed bug whereby if user preference had been altered for pos data, with loadlimit=0, then loading would cancel if this value was not changed in the filter property, and sampling was set. - Improved wx correctness in property grid - Tentative support in "getDeps" script for CentOS6 - Refactor APTClasses & basics functions into several more manageable parts - Better RNG support (negative ranges, range lines starting with a digit) - More extensive unit testing - Fix double-free bug for certain topologies in filter tree - Fix memory leak when aborting refresh - Cross compilation script for mingw-win64 and 32 - Source code relayout to reflect overall design - Fix several minor assertion errors - Remove several redundant scene update calls in main window - Re-enable OSX checking for updates - Fix incorrect progress reporting when ranging - Improved release QA checking * Nov 2012 : 0.0.12 Features: - Animation tool for performing "sweeps" of filter properties - can change a filter properties and export images, point data, plots etc. for each step in the property - Can sweep multiple properties simultaneously - Use for exporting videos/animations of parameter changes - Each filter property now has built-in tooltip help text - New warning for possible compositional biasing in composition results User Visible Bugfixes/Changes: - Point input starting with "." no longer incorrectly rejected - Fix arrow heads being shown for some objects where they should not be - Improved RNG file reader, fixed some multiple ions being rejected when they should not be - Performance increase in transform filter, ion shuffle mode, due to better shuffle strategy, and more parallelism - Fix progress reporting in transform filter, shuffle mode - RRNG files without colour data will now have random colour assignments, instead of black. - Some performance increases in point generation and display - More property group naming - Fix spectrum plot resetting itself to default values if no valid input - Fix some malformatted RRNG files could cause crash - Fix vertical "sash"/splitter motion not causing 3D view to update - Fix crash when loading large posfiles in external program filter Technical Bugfixes/Features: - Added Event logger code, for better user feedback from assertion failures - More workarounds for mathgl library infinite loop problems, which occur due to floating point aliasing - Fix segfault in point parsing routines - Improved UI locking during scene refresh, limiting scope for callback re-entrancy, which caused some crashes. - Fixed several small memory leaks - More unit testing, and fix some non-working unit tests, eg transform shuffle, which wasn't checking shuffled state correctly, and hence did very little - Minor openMP fixes - Many cppcheck fixes - mostly stylistic, or minor performance improvements * 1 Jul, 2012 : 0.0.11 Features: - Filter tree is now scanned for common errors, with a clickable warning message for detected errors, e.g.: - Filters connected that cannot have any effect - Filters connected that may alter the outcome of density dependant analyses, due to sampling. - Spatial analysis now has "density filtering" mode. - Bounding box has new draw modes "dimension" and "box only" - User manual has been expanded, now provides more detail on filters, and specific examples for the External Program filter for multiple programming languages (Scilab/bash/python/C++). User Visible Bugfixes/Changes: - Clustering core mode in core-link algorithm has been fixed (Core dist > 0) - Previously program would crash/generate nonsense results. - Fixed voxels not showing if transparency set to zero in point cloud mode - Multiple-autosave and resolution selection dialog usability improvements - Fix Undo not working after deleting filters - Recent files that do not exist are removed from recent files menu - External Program option "Clear cache" now correctly updates after selection. - Spatial analysis colour change for plot no long requires recomputation. - Bulk distance > 0.5*Link distance now emits warning in cluster filter, previously was incorrectly set to > 1.0*Link distance. - Tree no longer completely disables user interaction during refresh. - Lines now have conical arrow heads where appropriate (eg annotation). - Package state restores now correctly restore working directory information, fixing load failures for some external resources. - Fix cluster cropping/nmin not loading correctly from state files. - Fix bug where ion downsampler might not propagate range data - Cluster filter restores ions better when dragging/dropping between different range file parents - Fix ion export not working correctly, due to change in viscontrol behaviour for 0.0.10 Technical Bugfixes/Features: - Improvements to dependency fetch script "getDeps" for Mac OSX Lion. - Several small memory leaks fixed - Speed improvements by removing initialiser on ionhit data class - More unit test cases for filters - More strict emit/use/block patterns for spatial analysis, bound box and external program * 1 Apr, 2012 : 0.0.10 Features: - Improved aborting behaviour for filters User Visible Bugfixes/Changes: - In cluster filter, datasets consisting of "core" only can now be clustered. Previously some "bulk" was required, due to programming error. - Fix drag/drop loading bugs - Fix multiple data files not being accepted at command line - Fix crash-on-exit in OSX 10.7 bug - Improved rangefile reader - more tolerant of oddly formatted rangefiles - Fix bug where downsample filter would not update ion selection if parent rangefile filter was altered. - Data loading can now use custom string for data name - defaults to "mass-to-charge" - Plot region dragging now disallowed if region not shown (ie lies outside visible data area). - Fix bug in plot panel, where I beam would not show if user did Y zoom starting below plot X axis - Fix bug in plot zooming, where a perfectly X or perfectly Y zoom (ie mouse moved exactly horizontally or vertically) would fail to zoom. - Fix bug in clip & composition cylinder where perfectly horizontal (XY plane) would result in incorrect direction for analysis. - Better drag/drop support when dropping into tree "base" - now will only allow filters that can be a data source on top level. - Most buttons/checkboxes/spinbuttons etc ("controls") now have tool tips when hovering mouse. - Several previously untranslated items added to translation database - Minor layout change to ion info properties. Technical Bugfixes/Features: - Major internal reorganisation (refactor) of viscontrol. Now split into two parts, a tree manipulator & refresher (FilterTree), and UI/backend sync (Viscontroller)- Some export dialogs now take advantage of tree cache, making exporting dialog appearance faster in complex filter trees. - More unit tests for filters, rangefiles and filter trees. - Some export dialogs now take advantage of tree cache, making exporting dialog appearance faster in complex filter trees. - Improved dependency retrieval script, making porting a bit easier. - More QA checking in release script - Compiles against GCC 4.7. - Re-enable convex hull based algorithms in OSX. - Remove unnecessary #includes. - Some code de-duplication, thanks to pmd.sourceforge.net - Hidden debug only Autosave with ctrl+insert. - Fix memory leaks in filter devices, rangefile filter - Property keys now throw assertion error if not unique. - Fix small array overrun in NN histogram generation in RDF filter - Fix MK1 KD tree stack underrun for some trees. - Properties in XML files are now escaped and unescaped, avoiding malformatted/broken state and configuration files, if using any of "<>&" in saved elements. * Dec 17, 2011 : 0.0.9 Features: - Rangefile filter now has "all ions/ranges" enable/disable option - Autosave dialog now shows timestamp on file, eg "autosave.123.xml, one day ago" - Density computation in volume estimation filter - Implement scroll-to-zoom in plots - Rangefiles can now be dropped onto program to open. User Visible Bugfixes/Changes: - Fix crash-on-load due to strict floating point checks under some wxGtk (linux) systems (Reported by users) - Fix text file loading when loadlimit is 0. - Fix hang when loading incorrectly formatted text files - Fix bug where primitives might not show from transform filter until forcing a refresh - Spectrum filter no longer resets bincount when no data passed to it. - Composition profile now matches 3D cylinder size when using fixed number of bins. (Reported by user) - Fix bug where only line plots could be selected for plot dropdowns. - Fix random crash/weirdness bug when dragging 3D items. - Fix several internal debug dialogs being shown in wx2.9 (OSX 10.7)\ - Fix non-responsive dialogs in wx2.9 (OSX 10.7) - Fix occasional corruption of volume estimate in IonInfo filter - Better colouring of ranges in plot area (now uses exact colour, not closest from fixed palette) - Better error messages when failing to load data files - Fix config file error message for new 3Depict installs - Fix double message dialog when failing to load autosave - Fix bug where dataset would appear rotated when changing view axis for certain orientations. - Fix various bugs in autosave dialog Technical Bugfixes/Features: - Implement quality assurance code : unit testing of most filters, add release build checks. - Cluster filter now can do morphology (ellipse fit), but user frontend incomplete. - Many small memory leak fixes - Fix corner case bug in cluster analysis filter where small data corruption could occur for very small datasets. - Fix duplication of final range in rangefile - Fix large memory leak in convex hull estimation. - More strict checking for source dependencies in configure script - Marginally faster data loading by removing unneeded shuffle operation - More correct and strict rangefile checking - Fix bogus error in debug mode when dragging mouse move rate slider to max in pref. dialog - Fix bogus error in debug mode when using smoothing filter on voxels - Colourbar overlay no longer affected by scene lighting. - Fix bug where editing a property, then switching cameras can cause hang in debug mode. * Sep 30, 2011 : 0.0.8 Features: - Data files can now be monitored for changes, prompting auto-reloading of filter tree if file changes. - Multiple autosave files (per running program copy) are now supported - Annotation filter, including angle measurement, text annotation, and linear measurement. User Visible Bugfixes/Changes: - Voxel smoothing option now works if smoothing kernel is larger than dataset (i.e. small bin numbers or large sigma values). - Fix bug in density scaling (this was prev. included in some builds) - Fix bug in refreshing code which would not cause tree to be loaded correctly in some filter combination cases (such as pos Load->pos Load) - Fix preferences not respected when loading data files - Fix text files not selectable by default from load menu - Minor changes to ion info filter - Fix segfault if loading text data files with too few columns Technical Bugfixes/Features: - wxWidgets 2.9 support (incl. source build now supported under OSX 10.7, in theory) - Minor correctness improvements to configure script - wxWidgets correctness fixes (assertion failures etc). - Fix build for libpng 1.4 (infopp_NULL -> NULL) - Respect user choice of system background in plot area * Jul 30, 2011 : 0.0.7 Features: - Improved isosurface computation, incl. data filtering. - Foreign language support - German translation (de_DE). - Ion Info filter : volume and composition estimation. User Visible Bugfixes/Changes: - Periodic update checks (Unmanaged systems only, ie OSX, windows). - Improved window positioning on startup. - Fix voxel state saving - now restores range selections. - Fix cropping with camera coordinates incorrect behaviour due to numeric instabilities. - Fix range file reading under locales with non-english decimal separators. - Better handling of relative paths in analysis packages. - Ion transform filter now has "value transform" mode - Faster voxel computations (caching + cache introspection) - Improved crop controls -- better reset behaviour. - Fix pointcloud representation off-by-1/2 voxel pitch. - Fix bug where zooming repeatedly in 2D plot caused hang - Manually changing composition profile Cylinder axis respects lock axis magnitude setting. - Fix off-by-one in tick computation for bounding box. - Fix value setting when changing between clip objects - OpenGL status is now checked upon startup. Technical Bugfixes/Features: - Rewrote plot code to allow for more extensible plotting. - Improved checking of filter stream outut. - Checking of block masks against emit. - Other misc. checking. - Depth sorting framework for improved transparency rendering. - Removed many small memory leaks in parsing & UI. - Improved numerical stability in some rotation operations * May 16, 2011 : 0.0.6 Features: - Text data file loading - Cameras can now be locked - Add noise mode to transform filter (gaussian/white) User Visible Bugfixes/Changes: - Clustering algorithm now gives sensible results. - Previous implementation was wrong in several respects. Now should behave correctly, even on corner cases. - Now performs bounds-in-sphere check for large queries, significantly improving the scaling characteristics of the search when using large bulk link radii - Fix crash when moving range on empty data - Workaround for wxWidgets bug where recent file list >9 items would not load - Fix bug in undo/redo where tree may not reset correctly if it contains range data after undo/redo op. Technical Bugfixes/Features: - Significantly more complex refresh system, now performs type analysis on tree to determine minimal subsections of tree to refresh. Now filters that cannot cache well will penalise the refresh system much less. - Fix corner case bug in LFSR selection routines (power of two selection from same size array results in single duplicate). - Fix opengl bug with isosurface draw which appears up under some video card/driver combinations, which lead to undefined video behaviour (bad glPopAttrib()/glEnd() ordering) - Fix incorrect "loaded file" message if uninterpretable pos file loaded. - Fix error in plot causing assertion error during mouseover - Fix plot behaviour when all data == 0. * March 27, 2011 : 0.0.5 Features: - Clustering algorithm - Modification of methods of Stephenson et al.; this includes Max. Sep algorithm. See manual for algorithm description and parameter details - Value shuffle mode in transform filter - Mouse preferences for zoom and other controls User Visible Bugfixes/Changes: - Add hint to resolution dialog to maintain aspect ratio in output plots by default - Mac binary now distributed through packagemaker. Technical Bugfixes/Features: - Major code refactor; simplify code layout to aid further code development, speed compilation - Fix "press shift to refresh" hint not working - Fix voxels not reporting cache size - Fix possible crash bug in double click plot when no plot visible. - Filters now support named sections in property sets - Disallow zero sized ion streams from rangefiles - Fix off-by-one bug in boundcube set func (can cause assertion error) - Improve progress reporting for LSFR random selections * January 23, 2011 : 0.0.4 Features: - Preferences dialog - User defined defaults for each filter - Window startup behaviour - Postprocessing effects - Interactive/fast depth buffer based cropping - Analgyphic (oldschool coloured glasses) stereo - Fullscreen now has "partial" and "really" fullscreen modes - Ion downsampling filter now aware of ranges User Visible Bugfixes/Changes: - Improved parsing of points, so more styles of 3D point entry is allowed, eg when cutting/pasting from scilab - Plot now zooms in X or Y only by double clicking below axis - Some sections that were supposed to be paralellised, but were not due to typos, now actually are. - Fix bugs in state file writing for ion clipping (non saved var) - Fix parallelism in KD tree building - RDF was not paralellised, and could not be aborted - Voxels no longer crash due to non-ion input - Fix assertion errors when working with cylinder clipping tools - Fix overlays hints being drawn "below" other points in the scene (disable depth buffer, and draw last) Technical Bugfixes/Features: - Improve compilation structure to simplify builds under all platforms, particularly when using paralell or similar - Various crash fixes due to re-entry bugs - Fix a few unititalised variables (eg spat. analysis ->cache on plot) - Implement "effects" framework to allow insertion of arbitrary openGL calls using derived effects classes. - Some internal refactoring to reduce code duplication (Filter generation) * November 29, 2010 : 0.0.3 Features: - Added range interaction on-plot - Show marker for transform in mass-centre && boundbox mode. Allow user to show or hide marker. - Add drag and drop support for files - Add on-screen colourbar for ion colour - Add axis drawing - Added better error messages to XML file read - Added RDF filter - Add mode to lock cylinder magnitude during rotation - Plot panning (hold shift key) - Filters can report stepwise progress - Improvements to manual. User Visible Bugfixes: - Better error messages for PNG/SVG plot save - Fix bug in binding which caused object to move more than it should during 3D drag - Set dialog default item focus - Fix escape key not working in dialogs - Switch ms-windows camera roll to use alt, rather than tab, because ctrl+tab advances through controls, regardless of focus - Remove buggy parallel code in rotation filter - Fix transform filter behaviour to +origin after rotate - Fix bugs in transform filter - origin behaviour - copying/stashing filter - Fix bug whereby region colours in mass spectrum had green and blue channels swapped (typo) - Fix for crash when exporting images at high resolutions, due to uncaught std::bad_alloc in conjunction with a missing return after popping up dialog box - Fix bug with loading multiple files at command line - Fix bug in voxels where axis aligned data caused crash - Fixed animation tiling - Ensure visibility reset actually resets to looking down +ve axis - Change plot axis to show log_10 rather than just log() during log mode - Fixed interaction overlay drawing transparency Technical Bugs/Features: - Really fast "random" sampling. - Fix memory leak where textures were continually reloaded at every use due to bad name handling - Fix incorrect usage of std::unique that was leading to assertion failure - Make conjugation in quaternions implicit for even faster quaternion rotations. - Fix bug in GenericLoadFloatFile, where the output vector was too small for cols<4, resulting in memory overflow - Fix bug in transform filter where data limits were required for ion data sizes < 2 - Fixes for spatial analysis filter - Catch and report errors to console, rather than crash. - Fixes to plot bound get function with multiple plots - Only returns visible plots now - Fix aspect ratio not set during scene overlay draw - Added export analysis package - Added abort to rendering sequence - Fix assertion error during refresh due to bad total filter count after ion export - Fix bug in BoundCube::setBounds where incorrect assignment for z was made - Valgrind out two crash bugs due to uninitialised memory * September 24, 2010: 0.0.2 - Files with arbitrary number of data channels can now be loaded, but only one channel at a time can be analysed. - Many functions are now openMP parallelised, and thus will take advantage of multiple CPUs, if enabled at compile time - Simple animation support (PNG sequences in an orbit) - Voxelisation support; voxel data can be generated using the new Voxelise filter. Supported visualisation methods are Isosurfaces and point clouds. - Undo/redo support : filter operations can now be undone, and redone. - Windows build: we now have a windows build. - Improved rangefile parsing. This should now work on every range file I have ever met. If you have one where it does not work, let us know. - Several filters have been improved to be easier to use (eg transform filter) - Some core functions have been optimised (eg rotation, composition profiles), and should be significantly faster. - Many bugfixes -- program should be significantly more stable, but requires testing (please help us with this if you can ) * August 11, 2010 : Released 0.0.1 - Initial release 3Depict-0.0.19/Makefile.am0000644000175000017500000000016112640746376014531 0ustar pcuserpcuserSUBDIRS = src EXTRA_DIST = config.rpath packaging/ m4/ docs/ translations/ test/ data/ ACLOCAL_AMFLAGS = -Im4 3Depict-0.0.19/acinclude.m40000644000175000017500000003030712640746376014673 0ustar pcuserpcuser dnl @synopsis AX_CHECK_GLU dnl dnl Check for GLU. If GLU is found, the required preprocessor and linker flags dnl are included in the output variables "GLU_CFLAGS" and "GLU_LIBS", dnl respectively. This macro adds the configure option dnl "--with-apple-opengl-framework", which users can use to indicate that dnl Apple's OpenGL framework should be used on Mac OS X. If Apple's OpenGL dnl framework is used, the symbol "HAVE_APPLE_OPENGL_FRAMEWORK" is defined. If dnl no GLU implementation is found, "no_glu" is set to "yes". dnl dnl @version 1.2 dnl @author Braden McDaniel dnl AC_DEFUN([AX_CHECK_GLU], [AC_REQUIRE([AX_CHECK_GL])dnl AC_REQUIRE([AC_PROG_CXX])dnl GLU_CFLAGS="${GL_CFLAGS}" AS_IF([test X$with_apple_opengl_framework != Xyes], [AC_CACHE_CHECK([for OpenGL Utility library], [ax_cv_check_glu_libglu], [ax_cv_check_glu_libglu="no" ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" LIBS="" ax_check_libs="-lglu32 -lGLU" for ax_lib in ${ax_check_libs}; do AS_IF([test X$ax_compiler_ms = Xyes], [ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'`], [ax_try_lib="${ax_lib}"]) LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}" # # libGLU typically links with libstdc++ on POSIX platforms. # However, setting the language to C++ means that test program # source is named "conftest.cc"; and Microsoft cl doesn't know what # to do with such a file. # AC_LANG_PUSH([C++]) AS_IF([test X$ax_compiler_ms = Xyes], [AC_LANG_PUSH([C])]) AC_LINK_IFELSE([AC_LANG_PROGRAM([[ # if HAVE_WINDOWS_H && defined(_WIN32) # include # endif # include ]], [[gluBeginCurve(0)]])], [ax_cv_check_glu_libglu="${ax_try_lib}"; break]) AS_IF([test X$ax_compiler_ms = Xyes], [AC_LANG_POP([C])]) AC_LANG_POP([C++]) done LIBS=${ax_save_LIBS} CPPFLAGS=${ax_save_CPPFLAGS}]) AS_IF([test X$ax_cv_check_glu_libglu = Xno], [no_glu=yes; GLU_CFLAGS=""; GLU_LIBS=""], [GLU_LIBS="${ax_cv_check_glu_libglu} ${GL_LIBS}"]) ]) AC_SUBST([GLU_CFLAGS]) AC_SUBST([GLU_LIBS]) ]) dnl @synopsis AX_CHECK_GL dnl dnl Check for an OpenGL implementation. If GL is found, the required compiler dnl and linker flags are included in the output variables "GL_CFLAGS" and dnl "GL_LIBS", respectively. This macro adds the configure option dnl "--with-apple-opengl-framework", which users can use to indicate that dnl Apple's OpenGL framework should be used on Mac OS X. If Apple's OpenGL dnl framework is used, the symbol "HAVE_APPLE_OPENGL_FRAMEWORK" is defined. If dnl no GL implementation is found, "no_gl" is set to "yes". dnl dnl @version 1.8 dnl @author Braden McDaniel dnl AC_DEFUN([AX_CHECK_GL], [AC_REQUIRE([AC_PATH_X])dnl AC_REQUIRE([ACX_PTHREAD])dnl # # There isn't a reliable way to know we should use the Apple OpenGL framework # without a configure option. A Mac OS X user may have installed an # alternative GL implementation (e.g., Mesa), which may or may not depend on X. # AC_ARG_WITH([apple-opengl-framework], [AC_HELP_STRING([--with-apple-opengl-framework], [use Apple OpenGL framework (Mac OS X only)])]) AS_IF([test "X$with_apple_opengl_framework" = "Xyes"], [AC_DEFINE([HAVE_APPLE_OPENGL_FRAMEWORK], [1], [Use the Apple OpenGL framework.]) GL_LIBS="-framework OpenGL"], [AC_LANG_PUSH([C]) AX_LANG_COMPILER_MS AS_IF([test X$ax_compiler_ms = Xno], [GL_CFLAGS="${PTHREAD_CFLAGS}"; GL_LIBS="${PTHREAD_LIBS} -lm"]) # # Use x_includes and x_libraries if they have been set (presumably by # AC_PATH_X). # AS_IF([test "X$no_x" != "Xyes"], [AS_IF([test -n "$x_includes"], [GL_CFLAGS="-I${x_includes} ${GL_CFLAGS}"])] AS_IF([test -n "$x_libraries"], [GL_LIBS="-L${x_libraries} -lX11 ${GL_LIBS}"])) AC_CHECK_HEADERS([windows.h]) AC_CACHE_CHECK([for OpenGL library], [ax_cv_check_gl_libgl], [ax_cv_check_gl_libgl="no" ax_save_CPPFLAGS="${CPPFLAGS}" CPPFLAGS="${GL_CFLAGS} ${CPPFLAGS}" ax_save_LIBS="${LIBS}" LIBS="" ax_check_libs="-lopengl32 -lGL" for ax_lib in ${ax_check_libs}; do AS_IF([test X$ax_compiler_ms = Xyes], [ax_try_lib=`echo $ax_lib | sed -e 's/^-l//' -e 's/$/.lib/'`], [ax_try_lib="${ax_lib}"]) LIBS="${ax_try_lib} ${GL_LIBS} ${ax_save_LIBS}" AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ # if HAVE_WINDOWS_H && defined(_WIN32) # include # endif # include ]], [[glBegin(0)]])], [ax_cv_check_gl_libgl="${ax_try_lib}"; break]) done LIBS=${ax_save_LIBS} CPPFLAGS=${ax_save_CPPFLAGS}]) AS_IF([test "X${ax_cv_check_gl_libgl}" = "Xno"], [no_gl="yes"; GL_CFLAGS=""; GL_LIBS=""], [GL_LIBS="${ax_cv_check_gl_libgl} ${GL_LIBS}"]) AC_LANG_POP([C])]) AC_SUBST([GL_CFLAGS]) AC_SUBST([GL_LIBS]) ])dnl dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/acx_pthread.html dnl AC_DEFUN([ACX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_SAVE AC_LANG_C acx_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) AC_MSG_RESULT($acx_pthread_ok) if test x"$acx_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthread or # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags" ;; esac if test x"$acx_pthread_ok" = xno; then for flag in $acx_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" ;; pthread-config) AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_TRY_LINK([#include ], [pthread_t th; pthread_join(th, 0); pthread_attr_init(0); pthread_cleanup_push(0, 0); pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], [acx_pthread_ok=yes]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT($acx_pthread_ok) if test "x$acx_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$acx_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: threads are created detached by default # and the JOINABLE attribute has a nonstandard name (UNDETACHED). AC_MSG_CHECKING([for joinable pthread attribute]) AC_TRY_LINK([#include ], [int attr=PTHREAD_CREATE_JOINABLE;], ok=PTHREAD_CREATE_JOINABLE, ok=unknown) if test x"$ok" = xunknown; then AC_TRY_LINK([#include ], [int attr=PTHREAD_CREATE_UNDETACHED;], ok=PTHREAD_CREATE_UNDETACHED, ok=unknown) fi if test x"$ok" != xPTHREAD_CREATE_JOINABLE; then AC_DEFINE(PTHREAD_CREATE_JOINABLE, $ok, [Define to the necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_RESULT(${ok}) if test x"$ok" = xunknown; then AC_MSG_WARN([we do not know how to create joinable pthreads]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with cc_r AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) else PTHREAD_CC="$CC" fi AC_SUBST(PTHREAD_LIBS) AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else acx_pthread_ok=no $2 fi AC_LANG_RESTORE ])dnl ACX_PTHREAD 3Depict-0.0.19/COPYING0000644000175000017500000010451312640746376013536 0ustar pcuserpcuser GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . 3Depict-0.0.19/depcomp0000755000175000017500000005601612640746376014064 0ustar pcuserpcuser#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: 3Depict-0.0.19/Makefile.in0000644000175000017500000006177212723165573014555 0ustar pcuserpcuser# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in AUTHORS COPYING ChangeLog INSTALL NEWS \ README TODO compile config.guess config.rpath config.sub \ depcomp install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ftgl.m4 $(top_srcdir)/m4/gsl.m4 \ $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEBUG_FLAGS = @DEBUG_FLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FREETYPE_CONFIG = @FREETYPE_CONFIG@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ FT_INCLUDES = @FT_INCLUDES@ FT_LIBS = @FT_LIBS@ GETTEXT_LIBS = @GETTEXT_LIBS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MGL_CFLAGS = @MGL_CFLAGS@ MGL_LIBS = @MGL_LIBS@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENMP_FLAGS = @OPENMP_FLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ QHULL_CFLAGS = @QHULL_CFLAGS@ QHULL_LIBS = @QHULL_LIBS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ XMLCONFIG = @XMLCONFIG@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src EXTRA_DIST = config.rpath packaging/ m4/ docs/ translations/ test/ data/ ACLOCAL_AMFLAGS = -Im4 all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: 3Depict-0.0.19/config.sub0000755000175000017500000010224012640746376014461 0ustar pcuserpcuser#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2009-04-17' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: 3Depict-0.0.19/README0000644000175000017500000000325112716174467013360 0ustar pcuserpcuserIf you want the manual, or a "how to use" for this program, See the web page for the latest documentation, at http://threedepict.sourceforge.net. Most users should obtain a "binary" version from the website. If you are trying to build from source, the webpage is recommended, but otherwise, install the required dependencies (see website for more details) and then, from the command-line run: ./configure make make install to build the default-mode (single-threaded, debug on ) program. Interesting configure flags (see "./configure --help" for more options): --enable-openmp-parallel : Enable multi-CPU mode (for multi-CPU sections of the program) via the "openMP" framework --disable-debug-checks : Disable debug checks. This makes the program much faster, but less likely to catch program bugs --disable-ubsan : Disable undefined behaviour santiser. Makes the program go faster, but undefined program behaviour (bugs) will not be as readily detected --enable-experimental-cpp11 : Enables experimental C++11 support. Some Dependencies: libxml2 qhull gsl ftgl mathgl libpng wxwidgets gettext vigra Remember, for dependencies under linux platforms you must install the -dev, or -devel packages, in order to allow compilation For those with no idea how to install the dependencies, you can *try* running the "getDeps.sh" script in the packaging/deps/ folder, but it is not guaranteed to work on your system. For those under Windows, we recommend to install a different OS (eg debian, ubuntu - maybe in a Virtual machine) then "cross-compile". This is not trivial, but you can look at the deps/mingw-debian-cross/bootstrap.sh script as a starting point. 3Depict-0.0.19/configure.ac0000644000175000017500000003401112717201575014754 0ustar pcuserpcuserAC_INIT([3Depict], [0.0.19]) AM_INIT_AUTOMAKE([foreign subdir-objects]) AC_PROG_CXX AC_PROG_CC AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile src/Makefile]) m4_include([m4/ax_compare_version.m4]) #Ok, lets try using gcc style precompiled headers. AM_CONDITIONAL(USE_PRECOMPILED_HEADERS, 1) #Check sizeof AC_CHECK_SIZEOF(size_t) # Support {host_os} variable AC_CANONICAL_HOST dnl Test for wx-widgets dnl ---------- AM_OPTIONS_WXCONFIG case "${host_os}" in *mingw*) #Windows requires 3.1, as there is a bug with wxPropertyGrid modification during events # under GTK we use a hack to workaround, by keeping two grids, and flipping them in and out. #This doesn't work properly under windows. wx3.1 is not available under linux # (using repositories) at this time. AM_PATH_WXCONFIG(3.1.0, wxWin=1) ;; *) AM_PATH_WXCONFIG(3.0.0, wxWin=1) esac if test "$wxWin" != 1; then AC_MSG_ERROR([ wxWidgets must be installed on your system but wx-config script couldnt be found. Please check that wx-config is in path, the directory where wxWidgets libraries are installed (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH or equivalent variable and wxWidgets version is above the minimum specified above. ]) fi #Append the --gl-libs flag WX_LIBS="$WX_LIBS `$WX_CONFIG_PATH --libs gl,propgrid`" WANT_WINDRES="no" case "${host_os}" in *mingw*) #wx-config is a little unreliable in cross-compile mode # Manually append -DUNICODE to cppflags/cxxflags WX_CXXFLAGS="$WX_CXXFLAGS -DUNICODE" WX_CPPFLAGS="$WX_CPPFLAGS -DUNICODE" WANT_WINDRES="yes" ;; esac AC_MSG_RESULT([Want windres... $WANT_WINDRES]) AM_CONDITIONAL([HAVE_WINDRES], [ test x"$WANT_WINDRES" == "xyes"] ) AC_SUBST(WX_LIBS) dnl ---------- # Check for xml-config (libxml2 configuration utility) # ------------ # Test from icecast library (GPL) AC_ARG_WITH(xml-config, [ --with-xml-config=PATH use xml-config in PATH to find libxml ]) have_xml="no" if test "$with_xml_config" != "no" then if test -n "$with_xml_config" -a "$with_xml_config" != "yes" then XMLCONFIG="$with_xml_config" if ! test -x "$XMLCONFIG" then AC_MSG_ERROR([$with_xml_config cannot be run]) fi else AC_CHECK_PROGS(XMLCONFIG, [xml2-config xml-config]) fi if test -n "$XMLCONFIG" then AC_DEFINE(HAVE_LIBXML, 1, [Define if you have the GNOME XML library]) have_xml="yes" else AC_MSG_ERROR([Unable to locate the configuration utility xml-config: specify with --with-xml-config, or ensure it is your PATH environment variable]) fi XML_LIBS="`$XMLCONFIG --libs`" XML_CFLAGS="`$XMLCONFIG --cflags`" AC_SUBST(XML_CFLAGS) AC_SUBST(XML_LIBS) fi AM_CONDITIONAL(USE_XML, test "$have_xml" = "yes") #---------------- # Check for FT2 dnl ---------- #FT2 teset from the graphviz library configure.ac FREETYPE_DIR="yes" AC_ARG_WITH(freetype, [ --with-freetype=DIR where to find the freetype 2.x library], FREETYPE_DIR=$withval) if test "x$FREETYPE_DIR" = "xno"; then AC_MSG_ERROR(FREETYPE2 library disabled) else if test "x$FREETYPE_DIR" != "xyes"; then AC_PATH_PROG(FREETYPE_CONFIG,freetype-config,,[$FREETYPE_DIR/bin:$PATH]) else AC_PATH_PROG(FREETYPE_CONFIG,freetype-config) fi if test -n "$FREETYPE_CONFIG"; then if test "x$FREETYPE_DIR" != "xyes"; then FT_INCLUDES="`$FREETYPE_CONFIG --cflags` -I$FREETYPE_DIR/include" else FT_INCLUDES=`$FREETYPE_CONFIG --cflags` fi ft_libtool=`$FREETYPE_CONFIG --libtool` # check that it really exists (FreeBSD apparently forgot to insttall it!) if test -f "$ft_libtool"; then FT_LIBTOOL="$ft_libtool" else FT_LIBTOOL="" fi FT_LIBS=`$FREETYPE_CONFIG --libs` FT_LDFLAGS=`echo " $FT_LIBS" |sed 's/ -l[[^ ]][[^ ]]*//g'` else if test "x$FREETYPE_DIR" != "xyes"; then FT_INCLUDES="-I$FREETYPE_DIR/include/freetype2 -I$FREETYPE_DIR/include" FT_LDFLAGS="-L$FREETYPE_DIR/lib" FT_LIBS="-lfreetype" else FT_INCLUDES="" FT_LDFLAGS="" FT_LIBS="" fi FT_LIBTOOL="" fi save_CPPFLAGS=$CPPFLAGS save_LDFLAGS=$LDFLAGS CPPFLAGS="$CPPFLAGS $FT_INCLUDES" LDFLAGS="$LDFLAGS $FT_LDFLAGS" AC_CHECK_HEADERS(ft2build.h) if test `eval echo '${'$as_ac_Header'}'` = yes; then AC_CHECK_LIB(freetype,main, [FT_LIBS="$FT_LIBS" AC_DEFINE_UNQUOTED(HAVE_LIBFREETYPE,1,[Define if you have the FREETYPE2 library])], [AC_MSG_ERROR(Error: FREETYPE2 library not available - no libfreetype.)]) else AC_MSG_ERROR(Required FREETYPE2 library not available - no ft2build.h) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS AC_SUBST(FT_INCLUDES) AC_SUBST(FT_LIBS) fi dnl ---------- #Check for FTGL using custom script. dnl ---------- AX_CHECK_FTGL() #Not doing anything??? AC_SUBST(FTGL_CFLAGS) AC_SUBST(FTGL_LIBS) dnl ---------- #Check for qhull dnl-------------- AC_ARG_WITH(libqhull-flags, [ --with-libqhull-flags=PATH : specify compiler flags for libqhull]) AC_ARG_WITH(libqhull-link, [ --with-libqhull-link=PATH : specify linker flag (library) for libqhull]) if test x"$with_libqhull_flags" != x"" ; then QHULL_CFLAGS="$with_libqhull_flags" fi AC_SUBST([QHULL_CFLAGS]) #Attempt to compile a test program CFLAGS_ORIG="$CFLAGS" CFLAGS="$CFLAGS $QHULL_CFLAGS" AC_CHECK_HEADER([qhull/qhull_a.h],[AC_DEFINE(HAVE_QHULL,[],[Have got libqhull headers])], [AC_MSG_ERROR([Required libqhull headers not found (looking for qhull/qhull_a.h)])]) if test x"$with_libqhull_link" != x"" ; then QHULL_LIBS="$with_libqhull_link" else QHULL_LIBS="-lqhull" fi LIBS_ORIG="$LIBS" LIBS="$LIBS $QHULL_LIBS $LDFLAGS" AC_CHECK_LIB(qhull, qh_qhull, [AC_DEFINE(HAVE_QHULL,[],[qhull compilation OK])] , AC_MSG_ERROR([You must have libqhull installed and be able to compile a sample program. compiler flags can be set using the with-libqhull-flags and with-libqhull-link parameters ])) CFLAGS="$CFLAGS_ORIG" LIBS="$LIBS_ORIG" AC_SUBST([QHULL_LIBS]) dnl-------------- #Check for libpng dnl-------------- AC_ARG_WITH(libpng-flags, [ --with-libpng-flags=PATH : specify compiler flags for libpng]) AC_ARG_WITH(libpng-link, [ --with-libpng-link=PATH : specify linker flag (library) for libpng]) #set libpng's compiler flags if test x"$with_libpng_flags" != x"" ; then PNG_CFLAGS="$with_libpng_flags" fi AC_SUBST(PNG_CFLAGS) #set libpng's link flags if test x"$with_libpng_link" != x"" ; then PNG_LIBS="$with_libpng_link" else AC_CHECK_LIB([png],[png_create_write_struct_2] , [PNG_LIBS=-lpng], [PNG_USE_PKG_CFG=yes],-lm) if test x"$PNG_USE_PKG_CFG" == x"yes" ; then PKG_CHECK_MODULES(PNG, libpng >= 1.2) fi fi AC_SUBST(PNG_LIBS) #Attempt to compile a test program CFLAGS_ORIG="$CFLAGS" CFLAGS="$CFLAGS $PNG_CFLAGS" AC_CHECK_HEADER([png.h],[AC_DEFINE(HAVE_PNG,[],[Have got libpng headers])], [AC_MSG_ERROR([Required libpng headers not found (looking for png.h])]) LIBS_ORIG="$LIBS" LIBS="$LIBS $PNG_LIBS $LDFLAGS" AC_CHECK_LIB(png, png_sig_cmp, [AC_DEFINE(HAVE_PNG,[],[PNG compilation OK])] , AC_MSG_ERROR([You must have libpng installed and be able to compile sample program]), -lz -lm) CFLAGS="$CFLAGS_ORIG" LIBS="$LIBS_ORIG" dnl-------------- #Check for opengl #------------ #Try linking against gluSphere windows usese -lglu32; mac?? ; linux -lGLU case "${host_os}" in mingw*|windows*|winnt) #win32 opengl names GL_LIBS="-lglu32 -lopengl32" #Add GLEW dependency for opengl > 1.1 GL_LIBS="$GL_LIBS -lglew32" AC_SUBST(GL_LIBS) AC_PROG_LN_S AC_PROG_RANLIB ;; darwin*) #This is handled by the --with-apple-opengl-framework #option already. Nothing to do here ;; *) AC_CHECK_LIB(GLU, gluSphere, GL_LIBS="$GL_LIBS -lglu", [AC_MSG_ERROR([Could not find GLU library])]) GL_LIBS="-lGL -lGLU" AC_SUBST(GL_LIBS) ;; esac #------------ #Check for Mathgl dnl ---------- CFLAGS_ORIG="$CFLAGS" LDFLAGS_ORIG="$LDFLAGS" AC_ARG_WITH(mgl-flags, [ --with-mgl-flags=PATH : specify compiler flags for mathgl]) if test x"$with_mgl_flags" != x"" ; then MGL_CFLAGS="$with_mgl_flags" AC_SUBST(MGL_CFLAGS) fi CFLAGS="$CFLAGS $MGL_CFLAGS" AC_ARG_WITH(mgl-libs, [ --with-mgl-libs=PATH : specify linker flag (library) for mathgl]) if test x"$with_mgl_libs" != x"" ; then MGL_LIBS="$with_mgl_libs" else MGL_LIBS="-lmgl" fi AC_SUBST(MGL_LIBS) LDFLAGS="$LDFLAGS $MGL_LIBS" # mathgl2.x uses mgl_cf.h for c functions. AC_LANG_PUSH([C++]) AC_DEFINE(USE_MGL2, 1 , ["Enable mgl2 support"]) AC_CHECK_HEADER("mgl2/mgl_cf.h",[],[AC_MSG_ERROR(["mgl2 specified, but header mgl2/mgl_cf.h not found"])],[]) AC_LANG_POP([C++]) CFLAGS="$CFLAGS_ORIG" LDFLAGS="$LDFLAGS_ORIG" dnl ------- #Check for gsl dnl ------- AC_ARG_WITH(gsl-flags, [ --with-gsl-flags=PATH : specify compiler flags for gsl]) AC_ARG_WITH(gsl-libs, [ --with-gsl-libs=PATH : specify linker flag (library) for gsl]) if test x"$with_gsl_flags" != x"" ; then GSL_CFLAGS="$with_gsl_flags" fi if test x"$with_gsl_libs" != x"" ; then GSL_LIBS="$with_gsl_libs" else AX_PATH_GSL([1.1],[],[AC_MSG_WARN(["Could not find GNU Scientific Library.. You should install this, as it is needed by mathgl. Otherwise, you can override it with --with-gsl-link and --with-gsl-flags. For example you might use the gsl-config program to spit out the needed libs."])]) fi dnl ----------- #Check for libintl dnl ----------------- AC_MSG_CHECKING( [ for libintl ] ); AC_ARG_WITH(intl-libs, [ --with-intl-libs=FLAGS: specify linker flags (library) for internationalisation libs]) if test x"$with_intl_libs" != x"" ; then GETTEXT_LIBS="$with_intl_libs" AC_SUBST(GETTEXT_LIBS) AC_MSG_RESULT( [ specified ]); else case "${host_os}" in darwin*) #Darwin requires explicit libintl GETTEXT_LIBS="-lintl -liconv" AC_SUBST(GETTEXT_LIBS) AC_MSG_RESULT( [ $GETTEXT_LIBS ]); ;; mingw*|windows*|winnt) GETTEXT_LIBS="-lintl" AC_SUBST(GETTEXT_LIBS) AC_MSG_RESULT( [ $GETTEXT_LIBS ]); ;; *) #elsewhere it appears to be part of libc. or something. AC_MSG_RESULT( [ no ]); ;; esac fi dnl ----------------- dnl ----------------- AC_LANG_PUSH([C++]) AC_CHECK_HEADER([vigra/multi_array.hxx],[AC_DEFINE(HAVE_VIGRA,[],[Have got vigra headers])], [AC_MSG_ERROR([Required vigra headers not found (looking for vigra/multi_array.hxx)])]) AC_LANG_POP([C++]) dnl ----------------- #Should we compile with openMP? AC_ARG_ENABLE(openmp-parallel, [ --enable-openmp-parallel Enable OpenMP multi-CPU usage; requires GCC > 4.2 for parallel STL support ]) #Should we enable or disable debug checking? AC_ARG_ENABLE(debug-checks, [ --disable-debug-checks Disable any debug checking, provides faster operation, but less information needed to debug internal problems, or to provide problem reports to developers ],[enable_debug_checks="no"],[enable_debug_checks="yes"]) AC_ARG_ENABLE(ubsan, [ --disable-ubsan Disable undefined behaviour sanitizer. Only takes effect on certain ubsan supporting compilers. Useful for working around ubsan aborts that you cant fix (eg 3rd party libs ], [ enable_no_ubsan="yes"],[enable_no_ubsan="no"]) AC_ARG_ENABLE(experimental-cpp11, [ --enable-experimental-cpp11 Enable experimental C++11 support. Requires a full C++11 compiler (eg gcc/clang).]) if test x"$enable_openmp_parallel" != x"" ; then OPENMP_FLAGS="-fopenmp -D_GLIBCXX_PARALLEL" AC_SUBST(OPENMP_FLAGS) fi if test x"$enable_debug_checks" == x"yes" ; then if test x"$enable_openmp_parallel" != x"" ; then #Note that GLIBCXX_DEBUG cannot exist with GLIBCXX_PARALLEL DEBUG_FLAGS="-DDEBUG" else DEBUG_FLAGS="-DDEBUG -D_GLIBCXX_DEBUG" fi AC_SUBST(DEBUG_FLAGS) if test x"$GCC" = x"yes" ; then # Strip optimsation flags from debug build #-- changequote({,}) CFLAGS=`echo "$CFLAGS" | sed -e 's/-O[0-9s]*//g'` CXXFLAGS=`echo "$CXXFLAGS" | sed -e 's/-O[0-9s]*//g'` changequote([,]) CFLAGS="$CFLAGS -g" CXXFLAGS="$CXXFLAGS -g" #-- #Check for UbSan availability #-- if test x"${enable_no_ubsan}" == x"no" ; then USE_UBSAN="no" case "${host_os}" in *inux*) GCC_VER=`gcc --version | head -n 1 | awk '{ print $(NF)}'` AX_COMPARE_VERSION( [ $GCC_VER ], ge, 4.9, [ USE_UBSAN="yes" ] , [ USE_UBSAN="no" ]) AX_COMPARE_VERSION( [ $GCC_VER ], ge, 6.0, [ USE_UBSAN_GCC6="yes" ] , [ USE_UBSAN_GCC6="no" ]) ;; esac if test x"$USE_UBSAN" == x"yes" ; then CFLAGS="$CFLAGS -fsanitize=address -fsanitize=undefined -fsanitize=return -fsanitize=integer-divide-by-zero -fsanitize=vla-bound -fsanitize=null -fsanitize=signed-integer-overflow" CXXFLAGS="$CXXFLAGS -fsanitize=address -fsanitize=undefined -fsanitize=return -fsanitize=integer-divide-by-zero -fsanitize=vla-bound -fsanitize=null -fsanitize=signed-integer-overflow" LDFLAGS="$LDFLAGS -fsanitize=address -fsanitize=undefined -fsanitize=return " AC_MSG_RESULT(["Enabling Gcc-UbSan"]); fi if test x"$USE_UBSAN_GCC6" == x"yes" ; then CFLAGS="$CFLAGS -fsanitize=bounds-strict" CXXFLAGS="$CXXFLAGS -fsanitize=bounds-strict" LDFLAGS="$LDFLAGS -fsanitize=bounds-strict" AC_MSG_RESULT(["Enabling More Gcc-UbSan (gcc6)"]); fi fi #-- fi else echo x"$enable_debug_checks" echo x"no" if test x"$enable_debug_checks" != x"no" ; then AC_MSG_ERROR(["Well something isnt right, debug checks should be enabled or disabled (yes/no), was $enable_debug_checks"]) fi fi if test x"$enable_experimental_cpp11" == x"yes" ; then #Should work for gcc/clang CXXFLAGS="$CXXFLAGS --std=c++11" fi if test x"$CXX" = xdistcc ; then AC_MSG_RESULT(["Adding distcc link flags"]); #Add -lstdc++ to libs for distcc LIBS="$LIBS -lstdc++" fi # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL AC_C_CONST AC_TYPE_SIZE_T AC_TYPE_UINT64_T # Checks for library functions. AC_CHECK_FUNCS([atexit sqrt]) AC_CHECK_FUNCS([floor getcwd gettimeofday isascii memset ]) AC_CHECK_FUNCS([pow setlocale strdup sysinfo]) AC_C_INLINE() #check for some headers AC_CHECK_HEADERS([fenv.h libintl.h sys/time.h]) AC_CHECK_TYPES([ptrdiff_t]) #Check platform specific headers case "${host_os}" in darwin*) AC_CHECK_HEADERS([mach/mach.h]) ;; *) ;; esac AC_PROG_INSTALL AC_OUTPUT 3Depict-0.0.19/packaging/0000755000175000017500000000000012723200271014400 5ustar pcuserpcuser3Depict-0.0.19/packaging/checkBuild.sh0000755000175000017500000000402212640746376017015 0ustar pcuserpcuser#!/bin/bash #Location of HG repository to open REPOSITORY_PATH= CHECKOUT_PATH= BINARY=./src/3Depict PROJECTNAME=3Depict #Abort note file ABORT_MSG_FILE=NOTE_ABORT #Number of simultaneous processes when building NUM_PROC=2 notifyAbort() { echo `cat $ABORT_MSG_FILE` #TODO: Do we have a reliable SMTP system that we know how to use?? rm $ABORT_MSG_FILE echo "$CHECKOUT_PATH may need to be removed before re-running this script" exit 1 } #-- Check variables are set -- # TODO: This is not neat, but I don't have internet and don't think # we can loop over empty items. NOTCONFIGURED=0 if [ x$REPOSITORY_PATH == x"" ] ; then NOTCONFIGURED=1 fi if [ x$CHECKOUT_PATH == x"" ] ; then NOTCONFIGURED=1 fi if [ x$BINARY == x"" ] ; then NOTCONFIGURED=1 fi if [ x$PROJECTNAME == x"" ] ; then NOTCONFIGURED=1 fi if [ $NOTCONFIGURED -ne 0 ] ; then echo "PATHS NOT CONFIGURED -- CONFIGUREPATHS FIRST, THEN DELETE THIS ERROR MESSAGE" exit 1 fi #------ if [ x`which hg` == x"" ] ; then echo "hg binary not available in $PATH. Aborting" > $ABORT_MSG_FILE notifyAbort fi if [ -d $CHECKOUT_PATH ] ; then echo "target destination for checkout ($CHECKOUT_PATH) not empty!" > $ABORT_MSG_FILE notifyAbort fi mkdir -p $CHECKOUT_PATH pushd $CHECKOUT_PATH hg clone $REPOSITORY_PATH if [ $? -ne 0 ] ; then echo "repository checkout failed!" > $ABORT_MSG_FILE notifyAbort fi if [ ! -d $PROJECTNAME ] ; then echo "Odd, 3depict checked out, but no code dir found" > $ABORT_MSG_FILE notifyAbort fi cd $PROJECTNAME #Initiate the configuration ./configure --enable-debug-checks --enable-openmp-parallel if [ $? -ne 0 ] ; then echo "Configure failed!" > $ABORT_MSG_FILE notifyAbort fi make -j $NUM_PROC if [ $? -ne 0 ] ; then echo "Build failed" > $ABORT_MSG_FILE notifyAbort fi if [ ! -f $BINARY ] ; then echo "Weird, binary is missing!" > $ABORT_MSG_FILE notifyAbort fi #Run the unit tests $BINARY -t if [ $? -ne 0 ] ; then echo "Unit test failure! Fix it Fix it Fix it! Fix it! " > $ABORT_MSG_FILE exit 1 fi popd rm -rf $CHECKOUT_PATH 3Depict-0.0.19/packaging/howToRelease.txt0000644000175000017500000000344312640746376017571 0ustar pcuserpcuser== HOW TO PREP A RELEASE - A ROUGH GUIDE == -- Pre-tarball tasks -- * Ensure basic compilation works. * Ensure basic unit tests work, using ubsan/valgrind. * Run cppcheck, fixing any major issues (extras/cppcheck.sh) * Run coverity, fixing any major issues (extras/coverity.sh) * Review any outstanding bug reports * Update Changelog * Run "makeTranslations update" from translations dir to rebuild translation database - remove any dead translations * Merge code into "threedepict" sf repository, then work from that repo * Copy, or link, makeTarball.sh into base 3depict dir * Run makeTarball.sh, fixing any error messages - this may take a few runs - may need to build PDFs * Tarball will now be in tarball/3Depict-version.tar.gz * Update RPMs * Update DEBs * Optionally, ensure mac compilation works * Ensure windows compilation works - suggest using mingw cross comp. dir * Merge updated RPM/ DEB and windows installer files and any source changes ------------------------ -- Tarball generation -- * Re-run makeTarball.sh, fixing any new errors ------------------------ -- Installer uploading -- * Convert Changelog to dos format, and rename Changelog.txt * Upload Changelog * Upload PDF manual * Rebuild doxygen documentation & upload * Upload new tarball -> sourceforge website * Update news, download pages to point to new tarball - maybe other pages? * Build windows installers (64 and 32 bit) - test windows installers under wine (quick but inaccurate), then under real windows * Upload windows installers - update RSS file * Update DEB in debian-science repo - ensure lintian clean, and request upload * Update RPM in fedora-updates - ensure rpmlint clean, then upload to testing. * Update PPAs in Ubuntu-linux, where possible * Update download page to point to new installer ------------------------- 3Depict-0.0.19/packaging/debian/0000755000175000017500000000000012723177532015637 5ustar pcuserpcuser3Depict-0.0.19/packaging/debian/menu0000755000175000017500000000017112640746376016536 0ustar pcuserpcuser?package(3depict):needs="X11" section="Applications/Science/Data Analysis"\ title="3depict" command="/usr/bin/3depict" 3Depict-0.0.19/packaging/debian/control0000755000175000017500000000175612640746376017264 0ustar pcuserpcuserSource: 3depict Section: science Priority: optional Maintainer: Debian Science Maintainers Uploaders: D Haley Build-Depends: debhelper (>= 9), dpkg-dev (>= 1.16.1~), libgl1-mesa-dev | libgl-dev, libpng-dev | libpng15-dev, libqhull-dev, libwxgtk3.0-dev, libftgl-dev, libxml2-dev, libmgl-dev (>= 2.0), automake Standards-Version: 3.9.5 Homepage: http://threedepict.sourceforge.net/index.html Vcs-Git: git://anonscm.debian.org/debian-science/packages/3depict.git Vcs-Browser: http://anonscm.debian.org/gitweb/?p=debian-science/packages/3depict.git Package: 3depict Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: visualisation and analysis for single valued point data This program provides a graphical interface for the scientific analysis of real valued point data (x,y,z,value). This is primarily targeted towards Atom probe tomography applications, but may prove useful to other applications as well. 3Depict-0.0.19/packaging/debian/3depict.install0000755000175000017500000000020612640746376020571 0ustar pcuserpcuserdata/textures/*png usr/share/3depict/textures/ data/*dtd usr/share/3depict/ data/*txt usr/share/3depict/ data/*xml usr/share/3depict/ 3Depict-0.0.19/packaging/debian/watch0000755000175000017500000000012112640746376016673 0ustar pcuserpcuserversion=3 http://sf.net/threedepict/3Depict-(\d+[0-9\-\.r]+)\.tar.gz \ debian 3Depict-0.0.19/packaging/debian/manpages0000755000175000017500000000002112640746376017357 0ustar pcuserpcuserdebian/3depict.1 3Depict-0.0.19/packaging/debian/rules0000755000175000017500000000434412640746376016732 0ustar pcuserpcuser#!/usr/bin/make -f %: dh $@ --parallel override_dh_auto_configure: LDFLAGS="$(LDFLAGS) -Wl,--as-needed" dh_auto_configure -- --prefix=/usr \ --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info \ --enable-openmp-parallel --disable-debug-checks --with-libpng-link="-lpng" --with-libpng-flags="-L/lib" --with-ftgl-prefix="/usr" override_dh_clean: dh_testdir dh_testroot rm -f build-stamp [ ! -f Makefile ] || $(MAKE) distclean rm -f config.status config.cache #Prevent quilt 3.0 from annoyingly convoluting config.log with #a patch rm -f config.log dh_clean override_dh_auto_install: dh_auto_install #rename 3Depict (real program name) to debian-friendly 3depict mv $(CURDIR)/debian/3depict/usr/bin/3Depict $(CURDIR)/debian/3depict/usr/bin/3depict mkdir -p $(CURDIR)/debian/3depict/usr/share/doc/3depict/ echo "Copyright 2013 D Haley " > $(CURDIR)/debian/3depict/usr/share/doc/3depict/copyright echo "See /usr/share/common-licenses/GPL-1 for copyright info" >> $(CURDIR)/debian/3depict/usr/share/doc/3depict/copyright #Install files that cannot be handled by .install due to rename #--- #Install .desktop file (for XFCE) install -Dp -m 644 $(CURDIR)/packaging/3Depict.desktop $(CURDIR)/debian/3depict/usr/share/applications/3depict.desktop #install icon (both SVG and XPM) into pixmaps install -Dp -m 644 $(CURDIR)/data/3Depict.xpm $(CURDIR)/debian/3depict/usr/share/pixmaps/3depict.xpm install -Dp -m 644 $(CURDIR)/data/textures/tex-source/3Depict-icon.svg $(CURDIR)/debian/3depict/usr/share/pixmaps/3depict.svg install -Dp -m 644 $(CURDIR)/docs/manual-latex/manual.pdf $(CURDIR)/debian/3depict/usr/share/3depict/3depict-manual.pdf #--- #Install the pre-built locale files that are shipped with the tarball. #translation sources (.po) files are in the translations/ folder. #remap a few locale names as needed #-- sh -c "mv locales/de_DE/ locales/de/" mkdir -p $(CURDIR)/debian/3depict/usr/share/locale/ cp -R locales/* $(CURDIR)/debian/3depict/usr/share/locale/ #undo locale renaming sh -c "mv locales/de/ locales/de_DE/" # convert installed 3Depict.mo files to lowercase find $(CURDIR)/debian/3depict/usr/share/locale/ -name 3Depict.mo | xargs rename 's/3Depict.mo/3depict.mo/' #-- 3Depict-0.0.19/packaging/debian/docs0000755000175000017500000000003112640746376016515 0ustar pcuserpcuserAUTHORS NEWS README TODO 3Depict-0.0.19/packaging/debian/changelog0000644000175000017500000001150412723175626017514 0ustar pcuserpcuser3depict (0.0.19-1) unstable; urgency=medium * -- D Haley Tue, 31 May 2016 12:00:39 +1000 3depict (0.0.18-1) unstable; urgency=medium * Update to upstream 0.0.17 -- D Haley Sun, 26 Apr 2014 12:00:00 +0100 3depict (0.0.17-1) unstable; urgency=medium * Update to upstream 0.0.17 -- D Haley Sun, 28 Sep 2014 16:07:00 +0100 3depict (0.0.16-2.1) unstable; urgency=medium * Non-maintainer upload at maintainer's request. * Update BD on libwxgtk2.8-dev to libwxgtk3.0-dev | libwxgtk2.8-dev. (Really Closes: #746609) -- Olly Betts Fri, 25 Jul 2014 10:55:36 +1200 3depict (0.0.16-2) unstable; urgency=medium * Add wx 3.0 startup patch (Closes: #746609) -- D Haley Mon, 09 Jun 2014 22:54:00 +0100 3depict (0.0.16-1) unstable; urgency=medium * Update to upstream 0.0.16 -- D Haley Thu, 24 Apr 2014 00:56:00 +0100 3depict (0.0.15-3) unstable; urgency=medium * Adjust dependencies to force mgl>=2 (Closes: #737284) -- D Haley Wed, 12 Feb 2014 22:14:51 +0100 3depict (0.0.15-2) unstable; urgency=medium * Really remove unit tests (Closes: #730100) * Adjust ac_header for mgl detection * Apply upstream patch for cache bug * Add missing files to debian/copyright -- D Haley Mon, 20 Jan 2014 06:25:38 +0100 3depict (0.0.15-1) unstable; urgency=low * update to upstream * Remove unit tests (Closes: #730100) * Upstream has updated autotools (Closes: #727842) -- D Haley Sun, 01 Dec 2013 18:25:12 +0100 3depict (0.0.14-1) unstable; urgency=low * Update to upstream, 0.0.14 * Enable mathgl2.x configure option * Modify build-depends, libmgl-dev >= 2.1.32 -- D Haley Sat, 20 Jul 2013 18:31:32 +0200 3depict (0.0.13-1) unstable; urgency=low * Upload to unstable -- D Haley Fri, 17 May 2013 00:52:39 +0200 3depict (0.0.13-1~exp1) experimental; urgency=low * New upstream release * Update maintainer email * Remove README.source * Update to compat level 9 * Set standards version to 3.9.4 * Drop DM-Upload-Allowed * Update debian copyright to DEP5 * Drop debian/dirs * Convert rules to use dh override_ * Add DEP3-headers to patches -- D Haley Sat, 13 Apr 2013 02:06:15 +0200 3depict (0.0.12-1) experimental; urgency=low [ D Haley ] * New upstream release * upstream-post-0.0.12-fixes.patch: new patch taken from upstream [ Sylvestre Ledru ] * Standards-Version updated to version 3.9.3 [ Sébastien Villemot ] * Refreshed patches -- D Haley Sat, 24 Nov 2012 23:54:29 +0100 3depict (0.0.10-1) unstable; urgency=low * New upstream release -- D Haley Sun, 1 Apr 2012 19:33:32 +0100 3depict (0.0.9-1) unstable; urgency=low * Update to upstream 0.0.9 * Close powerpc bug fixed by 0.0.8-1 (Closes: #655682) * Close mgl font parsing bug fixed by mathgl upstream (Closes: #623431) * Fix unclean source package (Closes: #643039) -- D Haley Sun, 18 Dec 2011 19:33:32 +0100 3depict (0.0.8-1) unstable; urgency=low * Update to upstream 0.0.8 * Fix powerpc build due to overridden define -- D Haley Sun, 23 Oct 2011 17:18:41 +0100 3depict (0.0.7-1) unstable; urgency=low [ D Haley ] * Update to new upstream version * Include manual in tarball * Include upstream patches for correcting density profile computation and refresh branch computation [ Sylvestre Ledru ] * Switch to dpkg-source 3.0 (quilt) format -- Sylvestre Ledru Mon, 15 Aug 2011 23:35:55 +0200 3depict (0.0.6-1) unstable; urgency=low * New upstream version * Patch for new debian font dir layout (hierarchy, not flat) * Revert to quilt 1.0 format, as 3.0 does not patch in build -- D Haley Tue, 31 May 2011 22:23:53 +0100 3depict (0.0.5-1) unstable; urgency=low [ Sylvestre Ledru ] * watch file added * Switch to dpkg-source 3.0 (quilt) format * New upstream version -- D Haley Tue, 12 Apr 2011 17:44:06 +0200 3depict (0.0.4-1) unstable; urgency=low * New upstream version -- D Haley Sun, 16 Jan 2011 17:16:31 +0000 3depict (0.0.3-1) unstable; urgency=low * New upstream version -- D Haley Thu, 25 Nov 2010 23:28:28 +0000 3depict (0.0.2-1) unstable; urgency=low * New upstream version * Enable parallel build -- D Haley Wed, 22 Sep 2010 20:09:24 +0100 3depict (0.0.1-2) unstable; urgency=low * Remove patches for mathgl 1.9 compatibility due to new mathgl 1.10 -- D Haley Sat, 21 Aug 2010 08:55:13 +1000 3depict (0.0.1-1) unstable; urgency=low * Initial release (Closes: #592460) -- D Haley Mon, 09 Aug 2010 21:23:50 +0100 3Depict-0.0.19/packaging/debian/compat0000755000175000017500000000000212640746376017046 0ustar pcuserpcuser9 3Depict-0.0.19/packaging/debian/3depict.10000755000175000017500000000343212640746376017267 0ustar pcuserpcuser.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH 3DEPICT "1" "July 24, 2011" .\" Please adjust this date whenever revising the manpage. .SH NAME 3Depict \- 3D scalar point cloud visualization and analysis .SH SYNOPSIS .B 3depict .RI ... .br .SH DESCRIPTION This manual page documents briefly the .B 3Depict command .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fB3depict\fP is a program that allows for visualisation and analysis of point datasets with associated spectral data. .PP Note that the program is a best-effort system. It is by no means guaranteed that the algorithms in this program are free form errors in implementation, or follow conventions for any specific user-application. .SH OPTIONS This program has no command line options, other than a sequence of data or XML files to open, the XML files being containing a previous program state (this may be generated from within the program's graphical interface). Currently the program can read "POS" (position) formatted files, which are simply uncompressed sequences of 4-byte floats (IEEE 597) in (x,y,z,value) form. All other work is done through the graphical interface. .PP As a further note, the XML file format has not been stabilised for the 0.0.x series; and may change between revisions .SH AUTHOR 3Depict was written by D. Haley in 2012 .SH HOMEPAGE 3Depict Project Home : http://threedepict.sourceforge.net .PP This manual page was written by D Haley , for the Debian project (and may be used by others). 3Depict-0.0.19/packaging/debian/copyright0000755000175000017500000000607212640746376017610 0ustar pcuserpcuserFormat: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: 3Depict Upstream: http://threedepict.sourceforge.net Files: * Copyright: 3Depict is Copyright (C) 2013 by D Haley. License: GPL-3+ On Debian systems the full text of the GNU General Public License v3 can be found in the `/usr/share/common-licenses/GPL-3' file. Files: docs/manual-latex/manual.tex Copyright: Copyright (C) 2013 by D Haley. License: CC-BY-SA 3.0 The work (as defined below) is provided under the terms of this creative commons public license ("CCPL"; or "license"). The work is protected by copyright and/or other applicable law. any use of the work other than as authorized under this license or copyright law is prohibited. By exercising any rights to the work provided here, you accept and agree to be bound by the terms of this license. to the extent this license may be considered to be a contract, the licensor grants you the rights contained here in consideration of your acceptance of such terms and conditions. Files: debian/* Copyright: Copyright 2013, D Haley License: GPL-3+ On Debian systems the full text of the GNU General Public License v3 can be found in the `/usr/share/common-licenses/GPL-3' file. Files:data/textures/*rrow*png data/textures/*rrow*svg data/textures/tex-source/*rrow*svg data/textures/*enlarge*png data/textures/tex-source/*enlarge.svg Copyright: Copyright 2006, Everaldo Coelho Source: https://commons.wikimedia.org/wiki/Crystal_clear License: LGPL-2+ On Debian systems the full text of the Lesser GNU General Public License v2 can be found in the `/usr/share/common-licenses/LGPL-2' file. Files: data/textures/tex-source/*mouse.svg data/textures/*mouse*png Copyright: Copyright 2007, User:Darklama Source: https://commons.wikimedia.org/wiki/File:Left_clicked_mouse.svg License: GFDL-1.2 On Debian systems the full text of the GNU Free Documentation License v1.2 can be found in the `/usr/share/common-licenses/GFDL-1.2' file. Files: data/textures/tex-source/*phere.svg data/textures/tex-source/*phere.png Copyright: Copyright 2003-2004, David Vignoni Source: www.icon-king.com/projects/nuvola// License: LGPL-2+ On Debian systems the full text of the Lesser GNU General Public License v2 can be found in the `/usr/share/common-licenses/LGPL-2' file. Files: docs/web/style.css Copyright: Copyright 2006, Minamalistic-design Source: http://www.minimalistic-design.com/minimalistic.zip License: GPL-2+ On Debian systems the full text of the Lesser GNU General Public License v2 can be found in the `/usr/share/common-licenses/LGPL-2' file. Files: src/gl/tr.cpp src/gl/tr.h Copyright: Copyright 2005, Brian Paul Source: http://www.mesa3d.org/brianp/TR.html License: GPL-2+ On Debian systems the full text of the GNU General Public License v2 can be found in the `/usr/share/common-licenses/GPL-2' file. Files: data/naturalAbundance.xml Copyright: Copyright 2008, Metamolecular Source: http://metamolecular.com License: expat On Debian systems the full text of th expat license can be found in the `/usr/share/common-licenses/expat' file. 3Depict-0.0.19/packaging/debian/source/0000755000175000017500000000000012640746376017145 5ustar pcuserpcuser3Depict-0.0.19/packaging/debian/source/local-options0000755000175000017500000000005212640746376021653 0ustar pcuserpcuserunapply-patches abort-on-upstream-changes 3Depict-0.0.19/packaging/debian/source/format0000755000175000017500000000001412640746376020356 0ustar pcuserpcuser3.0 (quilt) 3Depict-0.0.19/packaging/debian/patches/0000755000175000017500000000000012640746376017274 5ustar pcuserpcuser3Depict-0.0.19/packaging/debian/patches/lowercase-textdomain.patch0000644000175000017500000000133012640746376024450 0ustar pcuserpcuserDescription: Debian uses different text domain for the lang files Forwarded: not-needed Author: D Haley --- 3depict-0.0.16.orig/src/3Depict.cpp +++ 3depict-0.0.16/src/3Depict.cpp @@ -166,7 +166,7 @@ else { //Set the gettext language - textdomain( PROGRAM_NAME ); + textdomain( "3depict"); setlocale (LC_ALL, ""); #ifdef __WXMAC__ bindtextdomain( PROGRAM_NAME, paths->GetResourcesDir().mb_str(wxConvUTF8) ); @@ -198,8 +198,8 @@ break; } #else - bindtextdomain( PROGRAM_NAME, "/usr/share/locale" ); - bind_textdomain_codeset(PROGRAM_NAME, "utf-8"); + bindtextdomain( "3depict", "/usr/share/locale" ); + bind_textdomain_codeset("3depict", "utf-8"); #endif } } 3Depict-0.0.19/packaging/debian/patches/FTGL-lowercase.patch0000644000175000017500000000064512640746376023040 0ustar pcuserpcuserDescription: Debian uses lowercase lib names. Forwarded: not-needed Author: D Haley --- 3depict-0.0.16.orig/configure +++ 3depict-0.0.16/configure @@ -6129,7 +6129,7 @@ if test "x$ftgl_prefix" != "x" ; then #use the supplied CFLAGS. assume LIBS FTGL_CFLAGS="-I$ftgl_prefix/include/ -L$ftgl_prefix/lib/" - FTGL_LIBS="-lFTGL" + FTGL_LIBS="-lftgl" else HAVE_PKG=$(basename $(which pkg-config)) 3Depict-0.0.19/packaging/debian/patches/debian-desktop-naming.patch0000644000175000017500000000071212640746376024455 0ustar pcuserpcuserDescription: Debian packages are lowercase, but upstream uses uppercase "D" Forwarded: not-needed Author: D Haley --- 3depict-0.0.16.orig/packaging/3Depict.desktop +++ 3depict-0.0.16/packaging/3Depict.desktop @@ -2,8 +2,8 @@ Version=1.0 Type=Application Comment=Valued point cloud visualisation and analysis -TryExec=3Depict -Exec=3Depict %F -Icon=3Depict -Name=3Depict +TryExec=3depict +Exec=3depict %F +Icon=3depict +Name=3depict 3Depict-0.0.19/packaging/debian/patches/series0000644000175000017500000000006712640746376020514 0ustar pcuserpcuserdebian-desktop-naming.patch lowercase-textdomain.patch 3Depict-0.0.19/packaging/manpage/0000755000175000017500000000000012640746376016033 5ustar pcuserpcuser3Depict-0.0.19/packaging/manpage/3Depict.10000644000175000017500000000375512640746376017422 0ustar pcuserpcuser.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH 3DEPICT "1" "July 24, 2011" .\" Please adjust this date whenever revising the manpage. .SH NAME 3Depict \- 3D scalar point cloud visualization and analysis .SH SYNOPSIS .B 3depict .RI ... .br .SH DESCRIPTION This manual page documents briefly the .B 3Depict command .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fB3depict\fP is a program that allows for visualisation and analysis of point datasets with associated spectral data. Specifically, the program was written to handle the data associated with atom probe tomography, but is applicable to other areas, such as astronomy, laser scanning and any point-based data source. .PP Note that the program is a best-effort system. It is by no means guaranteed that the algorithms in this program are free from errors in implementation, or follow conventions for any specific user-application. .SH OPTIONS This program has no command line options, other than a sequence of data or XML files to open, the XML files being containing a previous program state (this may be generated from within the program's graphical interface). Currently the program can read "POS" (position) formatted files, which are simply uncompressed sequences of 4-byte floats (IEEE 597) in (x,y,z,value) form. All other work is done through the graphical interface. .PP As a further note, the XML file format has not been stabilised for the 0.0.x series; and may change between revisions. .SH AUTHOR 3Depict was written by D. Haley & A. Ceguerra in 2011 .SH HOMEPAGE 3Depict Project Home : http://threedepict.sourceforge.net .PP This manual page was written by D Haley , for the Debian project (and may be used by others). 3Depict-0.0.19/packaging/RPM/0000755000175000017500000000000012723177532015053 5ustar pcuserpcuser3Depict-0.0.19/packaging/RPM/3Depict-0.0.19-font-path.patch0000644000175000017500000000213112640746376022013 0ustar pcuserpcuserdiff -r 7abb69436c2b src/wx/wxcomponents.cpp --- src/wx/wxcomponents.cpp Sat Aug 02 05:39:24 2014 -0400 +++ src/wx/wxcomponents.cpp Sat Aug 02 05:40:51 2014 -0400 @@ -547,16 +547,17 @@ //(Oh look Ma, I'm autoconf!) const char *dirs[] = { ".", - "/usr/share/fonts/truetype", //Old debian + "/usr/local/share/fonts/truetype", // User fonts "/usr/share/fonts/truetype/freefont", // New debian "/usr/share/fonts/truetype/ttf-dejavu", //New debian - "/usr/local/share/fonts/truetype", // User fonts + "/usr/share/fonts/truetype", //Old debian + "/usr/share/fonts/dejavu", //Fedora "/usr/X11R6/lib/X11/fonts/truetype", "/usr/X11R6/lib64/X11/fonts/truetype", - "/usr/lib/X11/fonts/truetype",// Fedora 32 - "/usr/lib64/X11/fonts/truetype", //Fedora 64 - "/usr/local/lib/X11/fonts/truetype", // Fedora 32 new - "/usr/local/lib64/X11/fonts/truetype",// Fedora 64 new + "/usr/lib/X11/fonts/truetype", + "/usr/lib64/X11/fonts/truetype", + "/usr/local/lib/X11/fonts/truetype", + "/usr/local/lib64/X11/fonts/truetype", "", }; //MUST end with "". 3Depict-0.0.19/packaging/RPM/3Depict-0.0.19-manual-pdf-loc.patch0000644000175000017500000000104612640746376022716 0ustar pcuserpcuserdiff -r 7abb69436c2b src/gui/mainFrame.cpp --- src/gui/mainFrame.cpp Sat Aug 02 05:39:24 2014 -0400 +++ src/gui/mainFrame.cpp Sat Aug 02 05:40:32 2014 -0400 @@ -2840,9 +2840,9 @@ string s; s=locateDataFile("3Depict-manual.pdf"); - //Also Debian makes us use the lowercase "D", so check there too. - if(!s.size()) - s=locateDataFile("3depict-manual.pdf"); + //Also Fedora has diff dir + if(!wxFileExists(s)) + s="/usr/share/doc/3Depict-0.0.8/3Depict-0.0.8-manual.pdf"; //FIXME: under windows, currently we use "manual.pdf" if(!s.size()) 3Depict-0.0.19/packaging/RPM/3Depict.spec0000644000175000017500000001643712723176454017237 0ustar pcuserpcuserName: 3Depict Version: 0.0.19 Release: 1%{?dist} Summary: Valued 3D point cloud visualization and analysis Group: Applications/Engineering License: GPLv3+ URL: http://threedepict.sourceforge.net Source0: http://downloads.sourceforge.net/threedepict/%{name}-%{version}.tar.gz #Mathgl for plotting BuildRequires: mathgl-devel #Mesa for GLU BuildRequires: libGL-devel #Libxml2 for file parsing BuildRequires: libxml2-devel #FTGL for 3d fonts BuildRequires: ftgl-devel #libpng for textures BuildRequires: libpng-devel #Desktop file utils for installing desktop file BuildRequires: desktop-file-utils #WX widgets BuildRequires: wxGTK3-devel #Vigra, for voxelisation BuildRequires: vigra-devel #PDF latex build #BuildRequires: tex(latex) #Required for surface removal algorithms BuildRequires: qhull-devel #Fedora specific PDF dir. Patch0: %{name}-%{version}-manual-pdf-loc.patch #Fedora specific font dir Patch1: %{name}-%{version}-font-path.patch %description This software is designed to help users visualize and analyze 3D point clouds with an associated real value, in a fast and flexible fashion. It is specifically targeted to atom probe tomography applications, but may be useful for general scalar valued point data purposes. %prep %setup -q %patch0 %patch1 %if 0%{?fedora} > 24 # Installation directory has changed sed -i -e 's,qhull/qhull_a.h,libqhull/qhull_a.h,' \ src/backend/filters/filterCommon.h \ src/backend/filters/algorithms/rdf.cpp \ configure configure.ac # Avoid rerunning the autotools touch -r aclocal.m4 configure configure.ac %endif %build #Due to bug 1077718, wx-config cannot be specified, due to # wx2/wx3 conflict. %configure --disable-debug-checks --enable-openmp-parallel --with-wx-config=wx-config-3.0 make %{?_smp_mflags} %install make install DESTDIR=%{buildroot} # Install the textures mkdir -p %{buildroot}%{_datadir}/%{name}/textures cp -p data/textures/*png %{buildroot}%{_datadir}/%{name}/textures/ #Install the manpage install -Dp -m 644 packaging/manpage/%{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 desktop-file-install \ --dir %{buildroot}%{_datadir}/applications \ packaging/%{name}.desktop mkdir -p %{buildroot}%{_datadir}/pixmaps/ install -Dp -m 644 data/textures/tex-source/%{name}-icon.svg %{buildroot}%{_datadir}/pixmaps/%{name}.svg #install language files #-- #Remap locale names mv locales/de_DE/ locales/de/ mkdir -p %{buildroot}/%{_datadir}/locale/ cp -R locales/* %{buildroot}/%{_datadir}/locale/ #Restore the internal build's locale naming mv locales/de/ locales/de_DE/ #-- #Move the documentation such that it is picked up by the doc macro mv docs/manual-latex/manual.pdf %{name}-%{version}-manual.pdf #Locale stuff %find_lang %{name} %files -f %{name}.lang %license COPYING %doc AUTHORS ChangeLog README TODO %{name}-%{version}-manual.pdf %{_bindir}/%{name} %dir %{_datadir}/%{name}/ %dir %{_datadir}/%{name}/textures %{_datadir}/%{name}/textures/*.png %{_datadir}/applications/%{name}.desktop %{_mandir}/man1/%{name}.1.* %{_datadir}/pixmaps/*.svg %changelog * Wed Jun 01 2016 D Haley - 0.0.19-1 - Update to 0.0.19 - Remove gcc patch, fixed upstream * Fri Apr 29 2016 Ralf Corsépius - 0.0.18-7 - Rebuild for qhull-2015.2-1. - Reflect qhull_a.h's location having changed. * Tue Mar 8 2016 Orion Poplawski - 0.0.18-6 - Add patch for fix compilation with gcc 6 * Mon Feb 22 2016 Orion Poplawski - 0.0.18-5 - Rebuild for gsl 2.1 - Cleanup spec * Wed Feb 03 2016 Fedora Release Engineering - 0.0.18-4 - Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild * Sun Nov 29 2015 Kalev Lember - 0.0.18-3 - Rebuilt for libmgl soname bump * Tue Jun 16 2015 Fedora Release Engineering - 0.0.18-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild * Fri May 01 2015 D Haley - 0.0.18-1 - Update to 0.0.18 * Sat Oct 11 2014 D Haley - 0.0.17-2 - Rebuild for mathgl 2.3 * Sun Sep 28 2014 D Haley - 0.0.17-1 - Update to 0.0.17 * Fri Jun 06 2014 Fedora Release Engineering - 0.0.16-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild * Sat Apr 26 2014 D Haley - 0.0.16-1 - Update to 0.0.16 * Wed Feb 12 2014 D Haley - 0.0.15-4 - Rebuild for mgl * Wed Feb 05 2014 D Haley - 0.0.15-3 - Rebuild for new mgl - Add upstream patches * Sun Jan 26 2014 D Haley - 0.0.15-2 - Rebuild for new mgl * Sun Dec 01 2013 D Haley - 0.0.15-1 - Update to 0.0.15 * Fri Aug 02 2013 Fedora Release Engineering - 0.0.14-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild * Sat Jul 20 2013 D Haley - 0.0.14-1 - Update to 0.0.14 * Tue Jun 25 2013 D Haley - 0.0.13-2 - Enable mathgl2 * Fri Apr 12 2013 D Haley - 0.0.13-1 - Update to 0.0.13 * Sat Mar 23 2013 D Haley - 0.0.12-4 - Add aarch 64 patch for bug 924960, until next version * Wed Feb 13 2013 Fedora Release Engineering - 0.0.12-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild * Sun Dec 9 2012 D Haley - 0.0.12-2 - Import bugfixes from upstream for plot UI and crash fixes * Sun Nov 25 2012 D Haley - 0.0.12-1 - Update to 0.0.12 * Mon Apr 2 2012 D Haley - 0.0.10-1 - Update to 0.0.10 * Tue Feb 28 2012 Fedora Release Engineering - 0.0.9-4 - Rebuilt for c++ ABI breakage * Thu Jan 12 2012 D Haley - 0.0.9-3 - Patch to fix FTFBS for gcc 4.7 * Thu Jan 12 2012 Fedora Release Engineering - 0.0.9-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild * Sat Dec 17 2011 D Haley - 0.0.9-1 - Update to 0.0.9 * Tue Dec 06 2011 Adam Jackson - 0.0.8-3 - Rebuild for new libpng * Sat Oct 29 2011 D Haley - 0.0.8-2 - Post release fixes for various crash bugs * Sun Oct 23 2011 D Haley - 0.0.8-1 - Update to 0.0.8 * Sun Aug 14 2011 D Haley - 0.0.7-1 - Update to 0.0.7 * Fri May 20 2011 D Haley - 0.0.6-1 - Update to 0.0.6 * Sun Mar 27 2011 D Haley - 0.0.5-1 - New upstream release * Sun Mar 13 2011 D Haley - 0.0.4-3 - Patch opengl startup code -- peek at gl context. Possible fix for bug 684390 * Sat Feb 12 2011 D Haley - 0.0.4-2 - Fix bug 677016 - 3Depict no built with rpm opt flags * Sat Jan 22 2011 D Haley - 0.0.4-1 - Update to 0.0.4 * Fri Nov 26 2010 D Haley - 0.0.3-1 - Update to 0.0.3 * Tue Oct 5 2010 D Haley - 0.0.2-3 - Use tex(latex) virtual package in preference to texlive-latex * Mon Oct 4 2010 D Haley - 0.0.2-2 - Add latex build for manual * Sat Sep 25 2010 D Haley - 0.0.2-1 - Update to 0.0.2 - Address comments in package review * Sun Aug 08 2010 D Haley - 0.0.1-1 - Initial package 3Depict-0.0.19/packaging/check3Depict-cross.sh0000755000175000017500000000340312640746376020402 0ustar pcuserpcuser#!/bin/bash #A script for checking that the cross-compilation build still compiles #You probably want to set up your own environment first, then customise # this script, rather than trying to use it as a base for cross-compilation CROSS_BASEDIR= #Abort notice file ABORT_MSG_FILE=/tmp/NOTE_ABORT #Project directory, relative to CROSS_BASEDIR PROJECTDIR=3Depict if [ ! -d $CROSS_BASEDIR ] ; then echo "Cross compilation base dir missing :" $CROSS_BASEDIR exit 1 fi if [ ! -d $CROSS_BASEDIR/$PROJECT ] ; then echo "Cross compilation base dir missing :" $CROSS_BASEDIR exit 1 fi #Number of simultaneous processes when building NUM_PROC=3 notifyAbort() { cat $ABORT_MSG_FILE rm $ABORT_MSG_FILE exit 1 } cd $CROSS_BASEDIR/$PROJECT #Set the cross compilation path PATH=$CROSS_BASEDIR/bin:$PATH hg pull if [ $? -ne 0 ] ; then echo "Pull failed!" >> $ABORT_MSG_FILE notifyAbort fi hg up -r tip if [ $? -ne 0 ] ; then echo "Update failed!" >> $ABORT_MSG_FILE notifyAbort fi make distclean if [ $? -ne 0 ] ; then echo "cross compile did not clean!" > $ABORT_MSG_FILE notifyAbort fi #Initiate the configuration export CPPFLAGS="-I${CROSS_BASEDIR}/include/ -DUNICODE" export LDFLAGS=-L${CROSS_BASEDIR}/lib/ #openmp is, out of the box, not supported by the cross-compiler. # Bug : http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=625779 # Looks like its an easy fix, but we would need our own private version ./configure --host=x86_64-w64-mingw32 --enable-debug-checks if [ $? -ne 0 ] ; then echo "Configure failed!" > $ABORT_MSG_FILE notifyAbort fi make -j $NUM_PROC if [ $? -ne 0 ] ; then echo "Build failed" > $ABORT_MSG_FILE notifyAbort fi if [ ! -f $BINARY ] ; then echo "Weird, binary is missing!" > $ABORT_MSG_FILE notifyAbort fi echo "Build succeeded" 3Depict-0.0.19/packaging/deps/0000755000175000017500000000000012640746376015356 5ustar pcuserpcuser3Depict-0.0.19/packaging/deps/sources/0000755000175000017500000000000012640746376017041 5ustar pcuserpcuser3Depict-0.0.19/packaging/deps/sources/mgl_data_png.patch0000644000175000017500000000003212640746376022471 0ustar pcuserpcuser23a24 > #include 3Depict-0.0.19/packaging/deps/sources/mgl_export.patch0000644000175000017500000000053512640746376022245 0ustar pcuserpcuser235c235 < if(gz) gzprintf(fp, "%s", buf); --- > if(gz) gzprintf((gzFile_s*)fp, "%s", buf); 246c246 < void *fp = gz ? gzopen(fname,"wt") : fopen(fname,"wt"); --- > void *fp = gz ? gzopen(fname,"wt") : (void*)fopen(fname,"wt"); 258c258 < if(gz) gzclose(fp); else fclose((FILE *)fp); --- > if(gz) gzclose((gzFile_s*)fp); else fclose((FILE *)fp); 3Depict-0.0.19/packaging/deps/sources/mgl_eps.patch0000644000175000017500000000131612640746376021511 0ustar pcuserpcuser306,308c306,308 < < bool gz = fname[strlen(fname)-1]=='z'; < void *fp = gz ? gzopen(fname,"wt") : fopen(fname,"wt"); --- > > bool gz = fname[strlen(fname)-1]=='z'; > void *fp = ( gz ? gzopen(fname,"wt") : (void *)fopen(fname,"wt")); 456c456 < if(gz) gzclose(fp); else fclose((FILE *)fp); --- > if(gz) gzclose((gzFile_s*)fp); else fclose((FILE *)fp); 466,467c466,467 < bool gz = fname[strlen(fname)-1]=='z'; < void *fp = gz ? gzopen(fname,"wt") : fopen(fname,"wt"); --- > bool gz = fname[strlen(fname)-1]=='z'; > void *fp = (gz ? gzopen(fname,"wt") : (void *)fopen(fname,"wt")); 623c623 < if(gz) gzclose(fp); else fclose((FILE *)fp); --- > if(gz) gzclose((gzFile_s*)fp); else fclose((FILE *)fp); 3Depict-0.0.19/packaging/deps/getDeps0000755000175000017500000005261712640746376016712 0ustar pcuserpcuser#!/bin/bash # # getDeps- The dependency handler you're using when your not using # a dependency handler. (Downloads dependencies for 3Depict) # Copyright (C) 2012, D Haley, AV Ceguerra # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # function setFullDeps { #Dependency ID, URL and name DEPIDS=( 0 1 2 3 4 5) DEPNAMES=( libpng freetype ftgl wxwidgets mathgl qhull) DEPURLS=(https://sourceforge.net/projects/libpng/files/libpng15/older-releases/1.5.4/libpng-1.5.4.tar.gz \ https://sourceforge.net/projects/freetype/files/freetype2/2.4.6/freetype-2.4.6.tar.gz \ http://downloads.sourceforge.net/project/ftgl/FTGL%20Source/2.1.3%7Erc5/ftgl-2.1.3-rc5.tar.gz \ http://downloads.sourceforge.net/project/wxwindows/2.8.11/wxWidgets-2.8.11.tar.gz \ http://sourceforge.net/projects/mathgl/files/mathgl/mathgl%201.11.2/mathgl-1.11.2.tar.gz/download \ http://www.qhull.org/download/qhull-2011.1-src.tgz) DEPFILENAMES=(libpng-1.5.4.tar.gz \ freetype-2.4.6.tar.gz \ ftgl-2.1.3-rc5.tar.gz \ wxWidgets-2.8.11.tar.gz \ mathgl-1.11.2.tar.gz \ qhull-2011.1-src.tgz) DEPMDSUM=(dea4d1fd671160424923e92ff0cdda78 \ 1dc4af24a86e2f78a49ac6b520a81ec5 \ fcf4d0567b7de9875d4e99a9f7423633 \ ce80389e1b70d6a518c80b7b715b763e\ acd33e68911d9506f60d769dce23f95e \ a65061cf2a6e6581182f4df0f3667a8e) } function setMacDeps { # All deps are available via macports OS_VERSION=`sw_vers -productVersion |sed 's/\.[0-9]*$//'` } function installMacPorts { #check to see if it's installed if [ x"`which port`" == x"" ] ; then echo "macports will now be installed..." echo "OS_VERSION = $OS_VERSION" if [ x"$OS_VERSION" == x"10.5" ] ; then curl -O https://distfiles.macports.org/MacPorts/MacPorts-2.0.3-10.5-Leopard.dmg hdiutil attach MacPorts-2.0.3-10.5-Leopard.dmg elif [ x"$OS_VERSION" == x"10.6" ] ; then curl -O https://distfiles.macports.org/MacPorts/MacPorts-2.0.3-10.6-SnowLeopard.dmg hdiutil attach MacPorts-2.0.3-10.6-SnowLeopard.dmg elif [ x"$OS_VERSION" == x"10.7" ] ; then curl -O https://distfiles.macports.org/MacPorts/MacPorts-2.0.3-10.7-Lion.dmg hdiutil attach MacPorts-2.0.3-10.7-Lion.dmg else echo "Mac OS X $OS_VERSION not supported by this script. You'll need to install dependencies manually." exit 1 fi if [ $? -ne 0 ] ; then echo "macports dmg could not be mounted" exit 1 fi # use installer to install macports to /opt/local sudo installer -pkg /Volumes/MacPorts-2.0.3/MacPorts-2.0.3.pkg -target / hdiutil detach /Volumes/MacPorts-2.0.3/ echo "sourcing .profile after macports installation" . ~/.profile echo "updating macports ports tree to latest..." sudo port selfupdate if [ $? -ne 0 ] ; then echo "macports was not successful in updating ports tree" exit 1 fi else echo "macports is already already installed." fi } function setSuseDeps { DEPIDS=( 0) DEPNAMES=( mathgl) DEPURLS=( http://sourceforge.net/projects/mathgl/files/mathgl/mathgl%202.2.2/mathgl-2.2.2.1.tar.gz/download) DEPFILENAMES=( mathgl-2.2.2.1.tar.gz) DEPMDSUM=( cdee2784ce2f18ab9014bbd204b8589f) } function setCentOS6Deps { DEPIDS=( 0) DEPNAMES=( mathgl) DEPURLS=( http://sourceforge.net/projects/mathgl/files/mathgl/mathgl%202.2.2/mathgl-2.2.2.1.tar.gz/download) DEPFILENAMES=( mathgl-2.2.2.1.tar.gz) DEPMDSUM=( cdee2784ce2f18ab9014bbd204b8589f) } function detectProxy() { #Check the http proxy variable if [ x"$http_proxy" == x"" ] ; then if [ x"$OS_NAME" == x"Darwin" ] ; then ##Are we using mac? Try to get the proxy automagically #PROXY=`system_profiler |grep "Auto Configure URL" | sed 's/^[ ]*//' | sort | uniq | awk {'sub(/^.*:[ \t]*/, "", $0); print $0;'}` PROXY=`system_profiler SPNetworkDataType|grep "HTTP Proxy Server" | sed 's/^[ ]*//' |sort | uniq | awk {'sub(/^.*:[ \t]*/, "", $0); print $0;'}` PROXYPORT=`system_profiler SPNetworkDataType|grep "HTTP Proxy Port" | sed 's/^[ ]*//' |sort | uniq | awk {'sub(/^.*:[ \t]*/, "", $0); print $0;'}` if [ x"$PROXY" != x"" ] ; then echo "using proxy as : $PROXY:$PROXYPORT ; hope this works" export http_proxy=$PROXY:$PROXYPORT fi echo "using $http_proxy as the proxy server" else echo "Proxy not found... Maybe you dont need one." echo " You can set one by passing it as an argument (./getdeps nameofproxy), if required" echo " eg: ./getdeps your_proxy_server:12345" echo echo "Or you can set it at the command line with " echo " export http_proxy=your_proxy_server:12345" echo "(where 12345 is the proxy server \"port\"), usually 8080 or 8000" fi else echo "using $http_proxy as the proxy server" fi } function parseArgs() { if [ $# -gt 1 ] ; then echo "usage : getDeps [proxyserver]" exit 1 elif [ $# -eq 1 ] ; then export http_proxy=$1 echo "using $1 as the proxy server" else #User did not specify a proxy as argument - try to detect echo "detecting proxy..." detectProxy fi } function testCompiler() { echo "int main(int argc, char *argv[]) { return 0; } ; " > gcctest.c gcc gcctest.c -o gcctest if [ ! -f gcctest ] ; then echo "You do not have gcc (GNU compiler frontend) installed?? Install it into your PATH, then try again." exit 1 fi rm gcctest.c gcctest echo "int main(int argc, char *argv[]) { return 0; } ; " > gcctest.cpp g++ gcctest.cpp -o gcctest if [ ! -f gcctest ] ; then echo "You do not have g++ (C++ compiler) installed?? Install it into your PATH, then try again." exit 1 fi rm gcctest.cpp gcctest } function handleMacDistro() { #Ensure fink/homebrew are not installed for i in fink homebrew do if [ x"`which $i`" != x"" ] ; then echo "$i was detected on your system - getDeps assumes macports is in use. Either install deps manually using fink, or use macports..." exit 1 fi done # install deps except mathgl echo "installing some 3Depict dependencies..." sudo port install wget libpng freetype ftgl wxWidgets-3.0 dylibbundler qhull gsl cmake libtool pkgconfig vigra mathgl if [ $? -ne 0 ] ; then echo "macports was not successful in getting the dependencies" exit 1 fi } function handleLinuxDistro() { #Attempt to detect some popular linux distros echo "Trying to detect your linux system type. " echo "If this fails, you should just try to use your package manager to do this" GUESS_DISTRIB_BY_PKGMAN="no" if [ x`which lsb_release` == x"" ] ; then GUESS_DISTRIB_BY_PKGMAN="yes" else # we have an lsb_release command - use it! DISTRIBUTOR=`lsb_release -i -s` if [ $? -eq 0 ] ; then if [ x$DISTRIBUTOR == x"Debian" ] ; then LINUXDISTRO="DebianLike" elif [ x$DISTRIBUTOR == x"Ubuntu" ] ; then LINUXDISTRO="DebianLike" elif [ x$DISTRIBUTOR == x"LinuxMint" ] ; then LINUXDISTRO="DebianLike" elif [ x$DISTRIBUTOR == x"SUSE LINUX" ] ; then LINUXDISTRO="SuseLike" elif [ x$DISTRIBUTOR == x"Fedora" ] ; then LINUXDISTRO="RedhatLike" elif [ x$DISTRIBUTOR == x"CentOS" ] ; then LINUXDISTRO="CentOS6" elif [ x`echo $DISTRIBUTOR | grep -i redhat` != x"" ] ; then LINUXDISTRO="RedhatLike" else GUESS_DISTRIB_BY_PKGMAN="yes" fi else LINUXDISTRO="Unknown" fi fi #Try to guess based upon package manager binary if [ x"$GUESS_DISTRIB_BY_PKGMAN" != x"no" ] ; then if [ x`which apt-get` != x"" ] ; then LINUXDISTRO="DebianLike" elif [ x`which yum` != x"" ] ; then LINUXDISTRO="RedhatLike" elif [ x`which zypper` != x"" ] ; then LINUXDISTRO="SuseLike" else LINUXDISTRO="Unknown" fi fi case $LINUXDISTRO in DebianLike) echo "System appears to be Debian-esque (debian/ubuntu/mint...)." echo "Running apt-get:" #TODO: Remove libvigra dep. This will eventually roll into build-dep for 3depict sudo apt-get build-dep 3depict && sudo apt-get install make g++ && sudo apt-get install libvigraimpex-dev if [ $? -ne 0 ] ; then echo "Failed to install build-dependencies" exit 1 else echo "All done." exit 0 fi ;; RedhatLike) echo "System appears to be redhat like" sudo yum groupinstall "Development Tools" if [ $? -ne 0 ] ; then echo "Yum installation failed" exit 1 fi sudo yum install yum-utils if [ $? -ne 0 ] ; then echo "Yum installation failed" exit 1 fi sudo yum-builddep 3Depict if [ $? -ne 0 ] ; then echo "Yum installation failed" exit 1 fi ;; CentOS6) echo "System appears to be CentOS6-like?" sudo yum groupinstall "Development Tools" && sudo yum install yum-utils libxml2-devel wxGTK-devel gsl-devel rpmdevtools if [ $? -ne 0 ] ; then echo "Yum installation failed" exit 1 fi echo " OK, so this gets tricky. Centos doesn't ship mathgl. So we have to grab it from fedora's Git repository, and build the RPM, the install that." echo "Getting mgl dependencies" sudo yum install gsl-devel libpng-devel libtool-ltdl-devel libtool swig freeglut-devel \ libjpeg-devel libtiff-devel qt4-devel wxGTK-devel giflib-devel \ info texi2html texinfo-tex cmake libXmu-devel lua-devel python-devel echo "Return code :" $? if [ $? -ne 0 ] ; then echo "Yum installation failed" exit 1 fi if [ x`which git` == x"" ] ; then echo "Installing git...." sudo yum install git if [ $? -ne 0 ] ; then echo "Yum git installation failed" exit 1 fi fi if [ ! -d mathgl ] ; then git clone git://pkgs.fedoraproject.org/mathgl.git if [ $? -ne 0 ] ; then echo "git clone failed - couldn't retreive mathgl spec and patch data" exit 1 elif [ ! -d mathgl ] ; then echo "Git clone succeded, but couldn't locate checkout dir, \"mathgl\"" exit 1 fi fi cd mathgl if [ $? -ne 0 ] ; then echo "Something went wrong when trying to check out the version of the repository we wanted" exit 1 fi if [ ! -f ~/rpmbuild/SOURCES ] ; then rpmdev-setuptree if [ $? -ne 0 ] ; then echo "Could not set up rpm development tree ??" exit 1 fi fi cp mathgl.spec ~/rpmbuild/SPECS/ cp *patch ~/rpmbuild/SOURCES/ MATHGLVER=2.2.2.1 setCentOS6Deps pushd ~/rpmbuild/SOURCES/ runDownloads checkHashes mv sources/mathgl-${MATHGLVER}.tar.gz . popd #HACK : Strip out the optional buildrequires from the spec file for i in hdf-devel hdf5-static fltk-devel qtwebkit-devel libharu-devel octave-devel openmpi-deve mpich-devel do sed -i "s/$i//" ~/rpmbuild/SPECS/mathgl.spec done sed -i 's/^\s*BuildRequires:\s*$//' ~/rpmbuild/SPECS/mathgl.spec echo "---------------- NOTICE ----------------" echo " CentOS is missing most of the optional dependencies for mathgl. " echo " this script cannot do the work required to install mathgl. " echo " An RPM \"Spec\" file has been left in ~/rpmbuild/SPECS/" echo " go there, tweak that file and use \"rpmbuild -ba mathgl.spec\" to build it." echo " This is not straightforwards - work is needed to make centos and mathgl play nice" echo " libvigra has not been intalled on your system. Please install it before compiling 3depict" exit 0; ;; SuseLike) echo "System appears to be suse-like" sudo zypper install -t devel_C_C++ && sudo zypper install libxml2-devel wxGTK-devel ftgl-devel libpng14-devel freetype2-devel qhull-devel echo "Installed as much as is available from repo. Still need some extra deps... Proceeding to source install" setSuseDeps ;; *) #Call setFullDeps to set depnames for error message below setFullDeps echo "--------" echo "Are you sure you need to run this?? " echo "You are running some unrecognised version of linux " echo "you should use your package manager to install these " echo "libraries : ${DEPNAMES[*]}" echo echo "Refusing to continue, otherwise script could break your system..." echo "--------" echo exit 1 ;; esac } function runDownloads() { echo "OK, we need to download some libraries, compile them, and try to install them." echo " This is a bit of a long-shot, but this script will try to do this automagically." echo " Ensure your net connection is good." echo "---------" echo "Let's go!" echo "---------" HAVE_ALL_DEPS=0 if [ -d sources ] ; then echo "OK, found the \"sources\" folder. Cool" else echo "making the source folder" mkdir sources fi echo "Looking for dependencies" for i in ${DEPIDS[*]} do j=${DEPFILENAMES[$i]} k=${DEPURLS[$i]} if [ ! -f "sources/$j" ] ; then echo "Missing sources/$j. Will attempt to download" case $OS_NAME in Darwin) wget $k -O sources/$j ;; *) if [ x`which curl` == x"" ] ; then echo "the program -curl- was not present. Aborting" echo "Need the files:" echo ${DEPFILENAMES[*]} echo "supposedly at:" echo ${DEPURLS[*]} echo "try to find these online, and place in the sources folder" fi #use CURL to download the file and save it to source/$k curl -L --progress-bar $k -o sources/$j ;; esac if [ $? -ne 0 ] ; then echo "Couldn't download dependency : $j, from $k :" echo "try to find it online, and put it in the sources folder" fi if [ ! -f "sources/$j" ] ; then echo echo "That's not right... i was told it was downloaded, but now I can't find it." echo "Something is wrong, you may have to download the file yourself," echo " and place it in the sources folder" echo echo "Try $k" echo "or look online for \"$j\"" echo echo "will continue in 8 seconds..." sleep 8 fi else echo "found $j; this is good" fi done echo echo echo " -------------------------" echo echo } function checkHashes() { for i in ${DEPIDS[*]} do j=${DEPFILENAMES[$i]} case $OS_NAME in Darwin) #Mac OSX has an undocumented md5sum compat function. Use it HASH_SUM=`md5 sources/$j | awk {'sub(/^.*= [ \t]*/, "", $0); print $0;'}` ;; *) HASH_SUM=`md5sum sources/$j | awk {'sub(/^.*= [ \t]*/, "", $0); print $0;'} | awk '{print $1}'` ;; esac if [ x"$HASH_SUM" != x"${DEPMDSUM[$i]}" ] ; then echo "Warning! The file contents for sources/$j appear to be wrong (hash mismatch). " echo "I recommend pressing ctrl+c and downloading the file manually and overwriting it" echo "continuing in 20 seconds. Press ctrl+c to abort (recommended)" sleep 20 else echo " $j looks OK. Good -- moving on" sleep 1 fi done } function prepBuildDir() { echo "------------------------------" echo " Extraction" echo if [ -d decompress ] ; then echo "deleting existing decompress folder" rm -rf ./decompress fi echo " Decompressing archives; this can be slow..." mkdir -p decompress if [ $? -ne 0 ] ; then echo "Oh dear, I couldn't make a folder called \"decompress\". Thats odd. Giving up" exit 1 fi cd decompress for i in ${DEPIDS[*]} do j=${DEPFILENAMES[$i]} echo "Extracting $j" if [ x"`echo $j | grep \.tar\.gz`" != x"" ] ; then tar -zxf ../sources/$j elif [ x"`echo $j | grep \.tar\.bz2`" != x"" ] ; then tar -jxf ../sources/$j elif [ x"`echo $j | grep \.tgz`" != x"" ] ; then tar -zxf ../sources/$j elif [ x"`echo $j | grep \.zip`" != x"" ] ; then unzip ../sources/$j else echo "$j apparently not a tar-gz or zip file! Aborting!" exit 1 fi if [ $? -ne 0 ] ; then echo "There was a problem extracting $j, aborting" exit 1 fi done sleep 2 } #-----------Entry point------------ OS_NAME=`uname` parseArgs $* #Each platform needs to be initialised in a different way case $OS_NAME in Darwin) #Mac OSX has an undocumented md5sum compat function. Use it setMacDeps installMacPorts handleMacDistro sleep 1; ;; MINGW*) #This doesn't work under windows. echo "This is not functional under windows, due to the difficulty of providing a robust tool chain." echo "---------------" echo " If you want to fix this, please do, and send me the fix!" echo "---------------" exit 1 ;; Linux) handleLinuxDistro ;; *) echo "Your platform was not recognised. Program will proceed, but may fail" sleep 1 setFullDeps ;; esac testCompiler runDownloads echo "So it looks like we have downloaded all the files." echo "I'm just going to check the integrity of these files first." echo checkHashes prepBuildDir echo "------------------------------" echo " Compilation" ######## for i in ${DEPIDS[*]} do j=${DEPFILENAMES[$i]} #Strip the extension from the filename if [ x"`echo $j | grep \.tar\.gz`" != x"" ] ; then foldername=${j%.tar.gz} elif [ x"`echo $j | grep \.tar\.bz2`" != x"" ] ; then foldername=${j%.tar.bz2} elif [ x"`echo $j | grep \.tgz`" != x"" ] ; then foldername=${j%.tgz} elif [ x"`echo $j | grep \.zip`" != x"" ] ; then foldername=${j%.zip} else echo "$j apparently not a tar-gz or zip file! Aborting!" exit 1 fi pushd $foldername echo "Attempting to compile ${DEPNAMES[$i]}" case "${DEPNAMES[$i]}" in libpng) # Compile libpng case "$OS_NAME" in Linux) make -f scripts/makefile.linux ;; *) echo "Unable to build libpng, unknown platform" exit 1 ;; esac if [ $? -ne 0 ] ; then echo "Damn. Unable to build. Aborting" exit 1 fi echo "I want to install ${DEPNAMES[$i]} to the system:" #install sudo make install -f scripts/makefile.linux if [ $? -ne 0 ] ; then echo "Damn. Unable to install. Aborting" exit 1 fi ;; wxwidgets) # Configure wxwidgets; to let it find this bits its wants ./configure --enable-unicode --with-opengl if [ $? -ne 0 ] ; then echo "Damn. Unable to configure. Aborting" exit 1 fi echo "OK, configure was good. Building, this will take a while" sleep 2 make if [ $? -ne 0 ] ; then echo "Damn. Unable to build. Aborting" exit 1 fi echo "I want to install ${DEPNAMES[$i]} to the system:" #install sudo make install if [ $? -ne 0 ] ; then echo "Damn. Unable to install. Aborting" exit 1 fi ;; freetype) # Configure freetype ./configure if [ $? -ne 0 ] ; then echo "Damn. unable to configure. aborting" exit 1 fi echo "OK, configure was good. Building, this will take a while" sleep 2 make if [ $? -ne 0 ] ; then echo "Damn. unable to build. aborting" exit 1 fi echo "I want to install ${DEPNAMES[$i]} to the system:" #install sudo make install if [ $? -ne 0 ] ; then echo "Damn. unable to install. aborting" exit 1 fi ;; ftgl) echo "Re-arranging build directory" #FTGL has a tilde in the filename, but not the download, move it. mv "ftgl-2.1.3~rc5" "ftgl-2.1.3-rc5" # Configure ftgl ./configure CXXFLAGS="-fpermissive" if [ $? -ne 0 ] ; then echo "Damn. unable to configure. aborting" exit 1 fi echo "OK, configure was good. Building, this will take a while" sleep 2 make if [ $? -ne 0 ] ; then echo "Damn. unable to build. aborting" exit 1 fi echo "I want to install ${DEPNAMES[$i]} to the system:" #install sudo make install if [ $? -ne 0 ] ; then echo "Damn. unable to install. aborting" exit 1 fi ;; mathgl) # Configure mathgl. Disable GNU scientific library to remove that dependency if [ x"$OS_NAME" == x"Darwin" ] ; then PNGDIR=/opt/local PNGLIBS=" CXXFLAGS=-I$PNGDIR/include LDFLAGS=-L$PNGDIR/lib " echo $PNGLIBS pwd #patch mgl/mgl_eps.cpp < ../../sources/mgl_eps.patch #patch mgl/mgl_export.cpp < ../../sources/mgl_export.patch #After upgrade to 1.5.13, this patch required. #patch mgl/mgl_data_png.cpp < ../../sources/mgl_data_png.patch #patch src/obj.cpp < ../../patches/macosx/mathgl2/diff-obj.c.patch #patch src/prc/writePRC.h < ../../patches/macosx/mathgl2/diff-prc-writePRC.h.patch cmake . patch ./CMakeCache.txt < ../../../../patches/0.0.17/macosx/mathgl2/CMakeCache.txt.patch fi #./configure --disable-gsl $PNGLIBS cmake . if [ $? -ne 0 ] ; then echo "Damn. unable to configure. aborting" exit 1 fi echo "OK, configure was good. Building, this will take a while" sleep 2 make if [ $? -ne 0 ] ; then echo "Damn. unable to build. aborting" exit 1 fi echo "I want to install ${DEPNAMES[$i]} to the system:" #install sudo make install ldconfig if [ $? -ne 0 ] ; then echo "Mathgl said it failed, but is known to misreport. Continuing in 10 seconds" sleep 10 fi ;; qhull) if [ x`which cmake` == "" ] ; then echo "Cmake not found on your system. This is needed to build qhull (sigh.). You can install it from http://www.cmake.org/cmake/resources/software.html" else #build cmake . make #OK, lets install! echo "I want to install ${DEPNAMES[$i]} to the system:" sudo make install if [ $? -ne 0 ] ; then echo "Damn. unable to install. aborting" exit 1 fi fi ;; *) echo "There is a bug in the script. I do not know the dependency ${DEPNAMES[$i]}. Aborting" exit 1 ;; esac popd done ######## echo "------------------------------" echo " All done!" echo echo " You should hopefully be able to build and run 3Depict now!" echo echo 3Depict-0.0.19/packaging/deps/patches/0000755000175000017500000000000012640746376017005 5ustar pcuserpcuser3Depict-0.0.19/packaging/deps/patches/macosx/0000755000175000017500000000000012640746376020277 5ustar pcuserpcuser3Depict-0.0.19/packaging/deps/patches/macosx/mathgl2/0000755000175000017500000000000012640746376021635 5ustar pcuserpcuser3Depict-0.0.19/packaging/deps/patches/macosx/mathgl2/diff-obj.c.patch0000644000175000017500000000052012640746376024554 0ustar pcuserpcuser--- decompress/mathgl-2.1.3.1/src/obj.cpp 2013-05-08 17:39:36.000000000 +1000 +++ sources/mathgl-2x/src/obj.cpp 2013-11-08 22:20:50.000000000 +1100 @@ -35,10 +35,6 @@ #include #include #include -#include -#ifdef __GNUC__ -#include -#endif #include #include 3Depict-0.0.19/packaging/deps/patches/macosx/mathgl2/diff-prc-writePRC.h.patch0000644000175000017500000000122712640746376026275 0ustar pcuserpcuser--- decompress/mathgl-2.1.3.1/src/prc/writePRC.h 2013-05-08 17:39:33.000000000 +1000 +++ sources/mathgl-2x/src/prc/writePRC.h 2013-11-08 22:20:46.000000000 +1100 @@ -24,9 +24,6 @@ #include #include #include -#ifdef __GNUC__ -#include -#endif #include #include #include @@ -224,11 +221,7 @@ void addKey(const PRCSingleAttribute &key) { attribute_keys.push_back(key); } std::deque attribute_keys; }; -#ifdef __GNUC__ -typedef __gnu_cxx::slist PRCAttributeList; -#else typedef std::list PRCAttributeList; -#endif class PRCAttributes { 3Depict-0.0.19/packaging/mingw-debian-cross/0000755000175000017500000000000012716174467020113 5ustar pcuserpcuser3Depict-0.0.19/packaging/mingw-debian-cross/build-wx-3.0.sh0000755000175000017500000001120412640746376022501 0ustar pcuserpcuser#!/bin/bash BASE=`pwd` BUILD_STATUS_FILE="$BASE/build-status" PATCH_STATUS_FILE="$BASE/patch-status" PATCHES_WXWIDGETS_PRE="" #wxWidgets-2.8.12-mingw64-1.patch configure-wxbool-patch" PATCHES_WXWIDGETS_POST="wx-config-sysroot.patch" if [ ! -f host_val ] ; then echo "Please select 32 or 64 bit by typing \"32\" or \"64\" (32/64)" read HOST_VAL case $HOST_VAL in 32) HOST_VAL="i686-w64-mingw32" ;; 64) HOST_VAL="x86_64-w64-mingw32" ;; *) echo "Didn't understand HOST_VAL. You can override this by editing the script" exit 1 ;; esac #Save for next run echo $HOST_VAL > host_val else HOST_VAL=`cat host_val` fi if [ $HOST_VAL != "x86_64-w64-mingw32" ] && [ $HOST_VAL != i686-w64-mingw32 ] ; then echo "Unknown HOST_VAL" exit 1 fi PREFIX=/ NUM_PROCS=4 if [ `id -u` -eq 0 ]; then echo "This script should not be run as root." echo " If you know what you are doing, you can disable this check, but be aware you _can_ break your system by doing this." exit 1; fi function applyPatches() { for i in $APPLY_PATCH_ARG do if [ x"`cat $PATCH_STATUS_FILE | grep "$i"`" != x"" ] ; then echo "Patch already applied :" $i continue fi echo "Applying patch:" $i patch -tN -p$PATCH_LEVEL < $BASE/patches/$i if [ $? -ne 0 ] ; then echo "Failed applying patch :" $i exit 1 fi echo "applied patch" echo $i >> $PATCH_STATUS_FILE done } function isBuilt() { if [ x`cat ${BUILD_STATUS_FILE} | grep $ISBUILT_ARG` != x"" ] ; then ISBUILT=1 else ISBUILT=0 fi } function build_wx() { NAME="libwx" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd wxWidgets-3.0* >/dev/null if [ $? -ne 0 ] ; then echo "wxwidgets dir missing, or duplicated?" exit 1 fi make clean # APPLY_PATCH_ARG=$PATCHES_WXWIDGETS_PRE # applyPatches #WX_DISABLE="--disable-compat26 --disable-ole --disable-dataobj --disable-ipc --disable-apple_ieee --disable-zipstream --disable-protocol_ftp --disable-mshtmlhelp --disable-aui --disable-mdi --disable-postscript --disable-datepick --disable-splash --disable-wizarddlg --disable-joystick --disable-loggui --disable-debug --disable-logwin --disable-logdlg --disable-tarstream --disable-fs_archive --disable-fs_inet --disable-fs_zip --disable-snglinst --disable-sound --without-regex --disable-svg --disable-webview --disable-markup --disable-banner-window --disable-calendar --disable-mediactrl --disable-stc --disable-timepick --disable-treebook --disable-toolbook --disable-finddlg --disable-prefseditor --disable-editablebox --disable-compat28 --disable-ftp --disable-ole --disable-arcstream --disable-dialupman --disable-sound --disable-protocol_ftp --disable-html --disable-htmlhelp --disable-ribbon --disable-tarstrema --disable-zipstream --disable-propgrid --disable-richtext --disable-richtooltip" ./configure --host=$HOST_VAL --enable-monolithic --disable-compat28 --disable-propgrid --enable-shared --disable-static --with-opengl --enable-msw --prefix=/ || { echo "wxwidgets configure failed"; exit 1; } #TODO: Where is this coming from ??? for i in `find ./ -name Makefile | grep -v samples | grep -v wxPython` do sed -i "s@-luuid-L@ -luuid -L@" $i done make -j $NUM_PROCS || { echo "wxwidgets build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "wxwidgets install failed"; exit 1; } popd >/dev/null popd >/dev/null pushd ./bin/ unlink wx-config cp `find ${BASE}/lib/wx/config/ -name \*unicode-3.0` wx-config APPLY_PATCH_ARG=$PATCHES_WXWIDGETS_POST PATCH_LEVEL=0 #applyPatches PATCH_LEVEL=1 sed -i "s@REPLACE_BASENAME@${BASE}@" wx-config || { echo "Failed to update wx-config with build root,. Aborting"; exit 1; } popd pushd ./lib/ ln -s wx-2.8/wx/ wx popd echo ${NAME} >> $BUILD_STATUS_FILE } #Install cross compiler #--- case ${HOST_VAL} in x86_64-w64-mingw32) if [ x"$DIST_NAME" == x"Ubuntu" ] || [ x"$DIST_NAME" == x"LinuxMint" ] ; then MINGW_PACKAGES="mingw-w64-dev g++-mingw-w64-x86-64" else MINGW_PACKAGES="mingw-w64-x86-64-dev g++-mingw-w64-x86-64" fi HOST_EXT="win64" ;; i686-w64-mingw32) MINGW_PACKAGES="gcc-mingw32" HOST_EXT="win32" ;; *) echo "Unknown host... please install deps manually,or alter script" exit 1 ;; esac #set our needed environment variables PATH=${BASE}/bin/:/usr/$HOST_VAL/bin/:$PATH export CXX=${HOST_VAL}-g++ export CPP=${HOST_VAL}-cpp export CC=${HOST_VAL}-gcc export CPPFLAGS=-I${BASE}/include/ export CFLAGS=-I${BASE}/include/ export CXXFLAGS=-I${BASE}/include/ export LDFLAGS=-L${BASE}/lib/ export RANLIB=${HOST_VAL}-ranlib export LIBS="-L${BASE}/lib/" DESTDIR=${BASE} build_wx # I'm not sure I've done this 100% right. Check wx-config output 3Depict-0.0.19/packaging/mingw-debian-cross/bootstrap.sh0000755000175000017500000011731212716174467022474 0ustar pcuserpcuser#!/bin/bash #Script to bootstrap 3Depict cross-compilation under debian # and debian-like systems # Note that building wx requires ~8GB of ram (or swap) # Its unlikely that this script will work first-time, or even second-time # you will need to do quite some work to be able to make this run #--- Determine which system we wish to build for #HOST_VAL=x86_64-w64-mingw32 #For mingw64 (windows 64 bit) #HOST_VAL=i686-w64-mingw32 #For mingw32 (Windows 32 bit) if [ ! -f host_val ] ; then echo "Please select 32 or 64 bit by typing \"32\" or \"64\" (32/64)" read HOST_VAL case $HOST_VAL in 32) HOST_VAL="i686-w64-mingw32" ;; 64) HOST_VAL="x86_64-w64-mingw32" ;; *) echo "Didn't understand HOST_VAL. You can override this by editing the script" exit 1 ;; esac #Save for next run echo $HOST_VAL > host_val else HOST_VAL=`cat host_val` fi if [ $HOST_VAL != "x86_64-w64-mingw32" ] && [ $HOST_VAL != i686-w64-mingw32 ] ; then echo "Unknown HOST_VAL" exit 1 else case $HOST_VAL in x86_64-w64-mingw32) BITS_VAL=64 ;; i686-w64-mingw32) BITS_VAL=32 ;; *) echo "Should not have got here - bug!" exit 1 ;; esac fi #---- if [ ! -d code/3Depict ] || [ ! -f code/3Depict/src/3Depict.cpp ] ; then echo "3Depict code dir, \"code/3Depict\", appears to be missing. Please place 3Depict source code in this location" echo "Aborting" exit 1 fi BASE=`pwd` PREFIX=/ NUM_PROCS=4 IS_RELEASE=0 if [ `id -u` -eq 0 ]; then echo "This script should not be run as root." echo " If you know what you are doing, you can disable this check, but be aware you _can_ break your system by doing this." exit 1; fi #2) own patch for fixing wx-config's lack of sysroot support #PATCHES_WXWIDGETS_PRE="wx_changeset_76890.diff" PATCHES_WXWIDGETS_POST="wx-config-sysroot.patch" #1) Zlib no longer needs to explicitly link libc, and will fail if it tries PATCHES_ZLIB="zlib-no-lc.patch" #1) Override some configure patches to bypass false positive failures PATCHES_FTGL="ftgl-disable-doc" PATCHES_FTGL_POSTCONF="ftgl-override-configure-2" #Fix compilation error with iconv, where alias2_lookup function # is incorrectly declared as inline on non GNUC builds PATCHES_ICONV="iconv-fix-alias2.patch" #1) gettext-tools fails in various places, but we don't actually need it, so turn it off #2) gettext fails to correctly determine windows function call prefix. # should be fixed for gettext > 0.18.1.1 ? # https://lists.gnu.org/archive/html/bug-gettext/2012-12/msg00071.html PATCHES_GETTEXT="gettext-fix-configure-versions" #gettext-win32-prefix PATCHES_GLEW="glew-makefile.base" PATCHES_MATHGL="mathgl-openmp-linker-flag mathgl-disable-things" PATCHES_QHULL="qhull-ptr.patch" PATCH_LIST="$PATCHES_WXWIDGETS_POST $PATCHES_GSL $PATCHES_ZLIB $PATCHES_LIBPNG $PATCHES_GETTEXT $PATCHES_FTGL $PATCHES_GLEW $PATCHES_MATHGL $PATCHES_FTGL_POSTCONF $PATCHES_ICONV $PATCHES_QHULL" BUILD_STATUS_FILE="$BASE/build-status" PATCH_STATUS_FILE="$BASE/patch-status" PATCH_LEVEL=1 function isBuilt() { if [ x`cat ${BUILD_STATUS_FILE} | grep $ISBUILT_ARG` != x"" ] ; then ISBUILT=1 else ISBUILT=0 fi } function applyPatches() { for i in $APPLY_PATCH_ARG do if [ x"`cat $PATCH_STATUS_FILE | grep -x "$i"`" != x"" ] ; then echo "Patch already applied :" $i continue fi echo "Applying patch:" $i patch -tN -p$PATCH_LEVEL < $BASE/patches/$i if [ $? -ne 0 ] ; then echo "Failed applying patch :" $i exit 1 fi echo "applied patch" echo $i >> $PATCH_STATUS_FILE done } function install_mingw() { echo "Checking mingw install" #install mingw and libtool (we will need it...) GET_PACKAGES=""; for i in $MINGW_PACKAGES do if [ x`dpkg --get-selections | grep ^$i | awk '{print $1}' ` != x"$i" ] ; then GET_PACKAGES="$GET_PACKAGES $i"; fi done if [ x"$GET_PACKAGES" != x"" ] ; then echo "Requesting install of mingw :" $GET_PACKAGES sudo apt-get install $GET_PACKAGES libtool || { echo "Mingw install failed"; exit 1 ; } fi } function grabDeps() { pushd deps 2>/dev/null DEB_PACKAGES="qhull expat freetype ftgl gettext gsl libpng libxml2 mathgl tiff zlib glew libvigraimpex" if [ x$DIST_NAME == x"Ubuntu" ] || [ x$DIST_NAME == x"LinuxMint" ] ; then LIBJPEGNAME="libjpeg6b" else #Libjpeg seems to be forked/renamed very frequently in debian # Likely a new libjpeg will need to be picked each time this script is run LIBJPEGNAME="libjpeg9" fi DEB_PACKAGES="$DEB_PACKAGES $LIBJPEGNAME" GET_PACKAGES="" for i in $DEB_PACKAGES do FNAME=`ls packages/${i}_*.orig.* 2> /dev/null` #If filename is empty, we will need to retreive it from # interwebs if [ x"$FNAME" == x"" ] ; then GET_PACKAGES="${GET_PACKAGES} $i" fi done #grab packages if they are not already on-disk if [ x"$GET_PACKAGES" != x"" ] ; then apt-get source $GET_PACKAGES if [ $? -ne 0 ] ; then echo "Package retrieval failed" echo "apt-get source failed... Maybe check internet connection, then try updating package database, then re-run?" echo " other possibilities could include, eg, that the required package is not available in the debian archive.." exit 1 fi #Strip patches from the build and patch status files, # if we are retriving new packages for i in $GET_PACKAGES do grep -v $i ../build-status > tmp mv tmp ../build-status grep -v $i ../patch-status > tmp mv tmp ../patch-status done fi #Move debian stuff into packages folder if [ x"$GET_PACKAGES" != x"" ] ; then mv *.orig.* *.debian.* *.dsc *.diff.* packages fi #Check that we have untarred all the required packages # (eg we downloaded one, and wiped it at some stage) # if not, pull the package out, and re-build it GET_PACKAGES="" for i in $DEB_PACKAGES do #if we have a package file (dsc), and no folder, add it to the list of packages FNAME=`ls packages/$i*dsc 2> /dev/null` DNAME=`ls -ld $i* | grep ^d | awk '{print $NF}'` if [ x"$FNAME" != x"" ] && [ x"$DNAME" == x"" ] ; then GET_PACKAGES="${GET_PACKAGES} $i" fi done #Unpack pre-existing package for i in $GET_PACKAGES do mv packages/$i*.* . || { echo "existing package extraction failed "; exit 1; } dpkg-source -x $i*dsc #move package back mv ${i}_*.* packages/ #wipe record of any patches for this package grep -v $i ../patch-status > tmp mv tmp ../patch-status #wipe record of build grep -v $i ../build-status > tmp mv tmp ../build-status done #extract libiconv if needed #-- LIBICONV=libiconv-1.14 if [ ! -f packages/${LIBICONV}.tar.gz ] ; then wget "http://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz" || { echo "Libiconv download failed "; exit 1; } mv ${LIBICONV}.tar.gz packages/ fi #Check for SHA1 goodness if [ x`sha1sum packages/${LIBICONV}.tar.gz | awk '{print $1}'` != x"be7d67e50d72ff067b2c0291311bc283add36965" ] ; then echo "SHA1 sum mismatch for libiconv" exit 1 fi #Extract if [ ! -d ${LIBICONV} ] ; then tar -zxf packages/${LIBICONV}.tar.gz || { echo "failed extracting iconv "; exit 1; } fi #--- #We also need to install nsis, though it is not a strict "dependency" per-se. if [ x`which makensis` == x"" ] ; then echo "Installing nsis via apt-get"; sudo apt-get install nsis || { echo "Failed installation"; exit 1; } fi popd 2> /dev/null } function createBaseBinaries() { pushd bin >/dev/null #Create symlinks to the compiler, which will be in our # primary path, and thus override the normal compiler #use ccache if it is around if [ x`which ccache` != x"" ] ; then echo -n "Enabling ccache support..." USE_CCACHE=1 else echo -n "Making direct compiler symlinks..." USE_CCACHE=0 fi for i in g++ cpp gcc c++ do #Skip existing links if [ -f ${HOST_VAL}-$i ] || [ -L ${HOST_VAL}-$i ] ; then continue; fi if [ $USE_CCACHE == 1 ] ; then ln -s `which ccache` ${HOST_VAL}-$i else ln -s `which ${HOST_VAL}-$i` fi if [ $? -ne 0 ] ; then echo "Failed when making compiler symlinks" exit 1 fi done echo "done" popd >/dev/null } function fix_la_file { #Need to fix .la files which have wrong path # due to libtool not liking cross-compile pushd lib/ >/dev/null sed -i 's@//lib@'${BASE}/lib@ ${FIX_LA_FILE_ARG}*.la sed -i 's@/lib/lib/@/lib/@' ${FIX_LA_FILE_ARG}*.la popd >/dev/null } function build_zlib() { ISBUILT_ARG="zlib" isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd zlib-* >/dev/null if [ $? -ne 0 ] ; then echo "Zlib dir missing, or duplicated?" exit 1 fi make clean rm -f configure.log ./configure --prefix="/" || { echo "ZLib configure failed"; exit 1; } APPLY_PATCH_ARG="$PATCHES_ZLIB" applyPatches make -j $NUM_PROCS || { echo "ZLib build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "ZLib install failed"; exit 1; } #Move the .so to a .dll mv ${BASE}/lib/libz.so ${BASE}/lib/libz.dll #Remove the static zlib. We don't want it rm $BASE/lib/libz.a popd >/dev/null popd >/dev/null echo "zlib" >> $BUILD_STATUS_FILE } function build_glew() { ISBUILT_ARG="glew" isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi #Perform dynamic modification of patch if [ x"`grep HOST_VAL patches/glew-makefile.base`" == x"" -o x"`grep BASEDIR patches/glew-makefile.base`" == x"" ] ; then echo "patches/glew-makefile did not contain replacement keywords" exit 1 fi #Modify the patch appropriately cp patches/glew-makefile.base patches/glew-makefile sed -i "s@HOST_VAL@$HOST_VAL@" patches/glew-makefile sed -i "s@BASEDIR@$BASE@" patches/glew-makefile pushd deps >/dev/null pushd glew-* >/dev/null if [ $? -ne 0 ] ; then echo "glew dir missing, or duplicated?" exit 1 fi APPLY_PATCH_ARG="glew-makefile" applyPatches make clean rm -f configure.log LD=$CC make -j $NUM_PROCS || { echo "glew build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "glew install failed"; exit 1; } popd >/dev/null popd >/dev/null #remove static library, as this can be incorrectly caught by linker # leading to confusing messages rm ${BASE}/lib/libglew*.a echo "glew" >> $BUILD_STATUS_FILE } function build_libpng() { ISBUILT_ARG="libpng" isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd libpng-* >/dev/null if [ $? -ne 0 ] ; then echo "libpng dir missing, or duplicated?" exit 1 fi make clean ./configure --host=$HOST_VAL --enable-shared --disable-static || { echo "Libpng configure failed"; exit 1; } #Hack to strip linker version script # eg as discussed : # https://github.com/Pivosgroup/buildroot-linux/issues/2 # The error is not 100% clear. if the build script has # access to standard debian -I paths, then it goes away # version script documentation is sparse to non-existant. # the only really useful thing i've found is this: # http://www.akkadia.org/drepper/dsohowto.pdf sed -i 's/.*version-script.*//' Makefile Makefile.am make -j $NUM_PROCS || { echo "libpng build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "libpng install failed"; exit 1; } #The new libpng shoudl install (when it works, which it does not for us) # the headers in a new subfolder, which is not compatible with most buildsystems # so make some symlinks #--- # First simulate libpng's installer working (TODO: Why is this not working? It did before..) mkdir -p ../../include/libpng12/ cp -p png.h pngconf.h ../../include/libpng12/ # Then actually make the symlinks pushd ../../include/ > /dev/null ln -s libpng12/pngconf.h ln -s libpng12/png.h popd >/dev/null #Aaand it doesn't install the libraries, so do that too. cp -p .libs/*.dll $BASE/lib/ cp -p .libs/*.la $BASE/lib/ #---- #Remove superseded libpng3 rm ${BASE}/lib/libpng-3* ln -s ${BASE}/lib/libpng12-0.dll ${BASE}/lib/libpng.dll popd >/dev/null popd >/dev/null FIX_LA_FILE_ARG=libpng fix_la_file echo "libpng" >> $BUILD_STATUS_FILE } function build_libxml2() { NAME="libxml2" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null LIBXMLVER=`ls -d libxml2-* | sed 's/libxml2-//'` pushd libxml2-* >/dev/null if [ $? -ne 0 ] ; then echo "libxml2 dir missing, or duplicated?" exit 1 fi #Libxml 2.8 and up doesn't need patching. # note that --compare-versions returns 0 on truth, and 1 on false dpkg --compare-versions $LIBXMLVER lt 2.8 if [ $? -eq 0 ] ; then echo "WARNING : Previous attempts to use libxml2 < 2.8 have failed." echo " it is recommended to manually obtain the .dsc,.orig.tar.gz and .debian.tar.gz from" echo " http://packages.debian.org/source/wheezy/libxml2 . download these, then replace the .dsc,.orig.tar.gz and .debian.tar.gz in deps/packages/" exit 1 fi make clean #Modifications # Disable python, because sys/select.h is not in mingw ./configure --host=$HOST_VAL --without-lzma --without-python --without-html --without-http --without-ftp --without-push --without-writer --without-push --without-legacy --without-xpath --without-iconv --enable-shared=yes --enable-static=no --prefix=/ || { echo "Libxml2 configure failed"; exit 1; } make -j $NUM_PROCS || { echo "libxml2 build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "libxml2 install failed"; exit 1; } popd >/dev/null popd >/dev/null FIX_LA_FILE_ARG=libxml2 fix_la_file #For compat, link libxml2/libxml to libxml/ pushd include >/dev/null ln -s libxml2/libxml libxml popd >/dev/null #The dll gets installed into bin/, link it to lib/ pushd lib > /dev/null ln -s ../bin/libxml2-[0-9]*.dll popd > /dev/null echo ${NAME} >> $BUILD_STATUS_FILE } function build_libjpeg() { NAME=$LIBJPEGNAME ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd ${NAME}*[0-9]* >/dev/null if [ $? -ne 0 ] ; then echo "${NAME} dir missing, or duplicated?" exit 1 fi make clean autoconf ./configure --host=$HOST_VAL --enable-shared --disable-static --prefix=/ || { echo "$NAME configure failed"; exit 1; } make -j $NUM_PROCS || { echo "$NAME build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "$NAME install failed"; exit 1; } #DLL needs to be copied into lib manually cp -p .libs/${NAME}-[0-9]*.dll $BASE/lib/ popd >/dev/null popd >/dev/null FIX_LA_FILE_ARG=$NAME fix_la_file echo ${NAME} >> $BUILD_STATUS_FILE } function build_libtiff() { NAME="libtiff" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd tiff*[0-9]* >/dev/null if [ $? -ne 0 ] ; then echo "libtiff dir missing, or duplicated?" exit 1 fi ./configure --host=$HOST_VAL --enable-shared --disable-static --prefix=/ || { echo "Libtiff configure failed"; exit 1; } make -j $NUM_PROCS || { echo "libtiff build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "libtiff install failed"; exit 1; } #DLL needs to be copied into lib manually cp -p .libs/${NAME}-[0-9]*.dll $BASE/lib/ popd >/dev/null popd >/dev/null FIX_LA_FILE_ARG=libtiff fix_la_file echo ${NAME} >> $BUILD_STATUS_FILE } function build_qhull2012() { NAME="libqhull" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd qhull-* >/dev/null if [ $? -ne 0 ] ; then echo "qhull dir missing, or duplicated?" exit 1 fi make clean # We have an internal COMPILE_ASSERT test for ptr_intT length #if using win64, then ensure that there is only the correct long long version # of the pointer #if [ `egrep "typedef .* ptr_intT" src/libqhull/mem.h | wc -l` -ne 1 ] ; then # echo "There appears to be multiple ptr_intT types in qhull's mem.h. Qhull normally picks the wrong one. Aborting- please fix" # exit 1 #fi sed -i "s/ gcc$/${HOST_VAL}-gcc/" Makefile sed -i "s/ g++$/${HOST_VAL}-g++/" Makefile make SO="dll" -j $NUM_PROCS find ./ -name \*dll -exec cp {} ${BASE}/bin/ make SO="dll" -j $NUM_PROCS || { echo "qhull build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "qhull install failed"; exit 1; } popd >/dev/null popd >/dev/null ln -s ${BASE}/include/libqhull ${BASE}/include/qhull FIX_LA_FILE_ARG=libqhull fix_la_file echo ${NAME} >> $BUILD_STATUS_FILE } function build_qhull2015() { NAME="libqhull" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd qhull-* >/dev/null if [ $? -ne 0 ] ; then echo "qhull dir missing, or duplicated?" exit 1 fi #delete the qhull directories that do NOT correspond to the version of qhull we want to build rm -rf src/libqhull src/libqhullcpp src/libqhullstatic* APPLY_PATCH_ARG="$PATCHES_QHULL" applyPatches make clean cp ../../patches/qhull2015-cmakefile-replacement CMakeLists.txt # TODO: Technically, deleting CMakeCache doesn't solve all caching problems. Cached data can remain elsewhere # This seems to stem from cmakes stubborn approach of "we only allow out-of-source-tree builds". # This is annoying, as in-tree building is very common, and natural for small projects. It also allows incremental building. # IMHO, once I manually alter a cmakefile, the cache should fucking well work out that it is out-of-date, as I keep getting nasty suprises. # https://cmake.org/Bug/view.php?id=14820 . rm -f CMakeCache.txt cmake -DCMAKE_INSTALL_PREFIX="$BASE" -DCMAKE_TOOLCHAIN_FILE=../../patches/cmake-toolchain$BITS_VAL #TODO: Better test (using c) #if using win64, then ensure that there is only the correct long long version # of the pointer if [ `egrep "typedef .* ptr_intT" src/libqhull_r/mem_r.h | wc -l` -ne 1 ] ; then echo "There appears to be multiple ptr_intT types in qhull's mem.h. Qhull normally picks the wrong one. Aborting- please fix" exit 1 fi sed -i "s/ gcc$/${HOST_VAL}-gcc/" Makefile sed -i "s/ g++$/${HOST_VAL}-g++/" Makefile make SO="dll" -j $NUM_PROCS find ./ -name \*dll -exec cp {} ${BASE}/bin/ make SO="dll" -j $NUM_PROCS || { echo "qhull build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "qhull install failed"; exit 1; } popd >/dev/null popd >/dev/null ln -s ${BASE}/include/libqhull ${BASE}/include/qhull FIX_LA_FILE_ARG=libqhull fix_la_file echo ${NAME} >> $BUILD_STATUS_FILE } function build_qhull2009() { NAME="libqhull" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd qhull-* >/dev/null if [ $? -ne 0 ] ; then echo "qhull dir missing, or duplicated?" exit 1 fi ./configure --host=$HOST_VAL --enable-shared --disable-static --prefix=/ || { echo "$NAME configure failed"; exit 1; } sed -i "s/ gcc$/${HOST_VAL}-gcc/" Makefile sed -i "s/ g++$/${HOST_VAL}-g++/" Makefile make SO="dll" -j $NUM_PROCS find ./ -name \*dll -exec cp {} ${BASE}/bin/ make SO="dll" -j $NUM_PROCS || { echo "qhull build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "qhull install failed"; exit 1; } popd >/dev/null popd >/dev/null ln -s ${BASE}/include/libqhull ${BASE}/include/qhull FIX_LA_FILE_ARG=libqhull fix_la_file echo ${NAME} >> $BUILD_STATUS_FILE } #FIXME: This does not work. Qhull uses a strange combination of cmake # and hand makefiles, so propagating correct cross-compiling # parameters is quite tricky function build_qhull2015() { NAME="libqhull" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd qhull-* >/dev/null if [ $? -ne 0 ] ; then echo "qhull dir missing, or duplicated?" exit 1 fi rm -f CMakeCache.txt cmake -DCMAKE_INSTALL_PREFIX="$BASE" -DCMAKE_TOOLCHAIN_FILE=../../patches/cmake-toolchain$BITS_VAL make -j $NUM_PROCS || exit 1 make install popd >/dev/null popd >/dev/null echo ${NAME} >> $BUILD_STATUS_FILE } function build_expat() { NAME="libexpat" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd expat-** >/dev/null if [ $? -ne 0 ] ; then echo "expat dir missing, or duplicated?" exit 1 fi ./configure --host=$HOST_VAL --enable-shared --disable-static --prefix=/ || { echo "$NAME configure failed"; exit 1; } make -j $NUM_PROCS || { echo "$NAME build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "$NAME install failed"; exit 1; } #DLL needs to be copied into lib manually cp -p .libs/${NAME}-[0-9]*.dll $BASE/lib/ popd >/dev/null popd >/dev/null FIX_LA_FILE_ARG=libexpat fix_la_file echo ${NAME} >> $BUILD_STATUS_FILE } function build_gsl() { NAME="libgsl" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd gsl-* >/dev/null if [ $? -ne 0 ] ; then echo "gsl dir missing, or duplicated?" exit 1 fi make clean mkdir -p doc echo "all:" > doc/Makefile.in echo "install:" >> doc/Makefile.in echo "clean:" >> doc/Makefile.in APPLY_PATCH_ARG=$PATCHES_GSL applyPatches ./configure --host=$HOST_VAL --enable-shared --disable-static --prefix=/ || { echo "gsl configure failed"; exit 1; } make -j $NUM_PROCS || { echo "gsl build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "gsl install failed"; exit 1; } popd >/dev/null popd >/dev/null FIX_LA_FILE_ARG=libgsl fix_la_file echo ${NAME} >> $BUILD_STATUS_FILE } function build_wx() { NAME="libwx" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd wx[Ww]idgets* >/dev/null if [ $? -ne 0 ] ; then echo "wxwidgets dir missing, or duplicated?" exit 1 fi WX_VER=`grep "WX_RELEASE =" Makefile` if [ x"${WX_VER}" == x"3.0" ] ; then echo "WX needs to be at least 3.1, but is 3.0..." exit 1 fi make clean WX_DISABLE="--disable-compat26 --disable-compat28 --disable-ole --disable-dataobj --disable-ipc --disable-apple_ieee --disable-zipstream --disable-protocol_ftp --disable-mshtmlhelp --disable-aui --disable-mdi --disable-postscript --disable-datepick --disable-splash --disable-wizarddlg --disable-joystick --disable-loggui --disable-debug --disable-logwin --disable-logdlg --disable-tarstream --disable-fs_archive --disable-fs_inet --disable-fs_zip --disable-snglinst --disable-sound --disable-variant --without-regex" ./configure --host=$HOST_VAL --enable-shared --disable-static --with-opengl --enable-unicode --without-regex --prefix=/ || { echo "wxwidgets configure failed"; exit 1; } #TODO: Where is this coming from ??? for i in `find ./ -name Makefile | grep -v samples | grep -v wxPython` do sed -i "s@-luuid-L@ -luuid -L@" $i done make -j $NUM_PROCS || { echo "wxwidgets build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "wxwidgets install failed"; exit 1; } popd >/dev/null popd >/dev/null pushd ./bin/ if [ -l wx-config ] ; then unlink wx-config fi #Search for the wx-config file. It get installed into /lib/wx, but has # unusual naming conventions WX_CONFIG_FILE=`find ${BASE}/lib/wx/config/ -type f -executable -name \*release-\*` if [ x"$WX_CONFIG_FILE" == x"" ] ; then WX_CONFIG_FILE=`find ${BASE}/lib/wx/config/ -type f -executable -name \*-unicode-\*3.1` fi if [ x"$WX_CONFIG_FILE" == x"" ] ; then WX_CONFIG_FILE=`find ${BASE}/lib/wx/config/ -type f -executable -name x\*mingw32-msw-unicode-\*` fi if [ x"$WX_CONFIG_FILE" == x"" ] ; then echo "Couldn't find the wx-config script." exit 1 fi cp $WX_CONFIG_FILE wx-config APPLY_PATCH_ARG=$PATCHES_WXWIDGETS_POST PATCH_LEVEL=0 applyPatches PATCH_LEVEL=1 sed -i "s@REPLACE_BASENAME@${BASE}@" wx-config || { echo "Failed to update wx-config with build root,. Aborting"; exit 1; } popd pushd ./lib/ ln -s wx-${WX_VER}/wx/ wx popd pushd ./include/wx-${WX_VER}/wx/msw/ if [ x$BITS_VAL == 64 ] ; then cp amd64.manifest wx.manifest fi popd echo ${NAME} >> $BUILD_STATUS_FILE } function build_freetype() { NAME="libfreetype" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd freetype-* >/dev/null if [ $? -ne 0 ] ; then echo "freetype dir missing, or duplicated?" exit 1 fi tar -xjf freetype-[0-9]*bz2 || { echo "freetype decompress failed" ; exit 1; } pushd freetype-[0-9]* make clean ./configure --host=$HOST_VAL --enable-shared --disable-static --without-png --with-harfbuzz=no --prefix=/ || { echo "freetype configure failed"; exit 1; } make -j $NUM_PROCS || { echo "freetype build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "freetype install failed"; exit 1; } popd >/dev/null popd >/dev/null popd >/dev/null FIX_LA_FILE_ARG=libfreetype fix_la_file #freetype has moved headers. Add symlink for backwards compat pushd include >/dev/null ln -s freetype2/freetype/ popd >/dev/null echo ${NAME} >> $BUILD_STATUS_FILE } function build_libiconv() { NAME="iconv" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd libiconv-* >/dev/null if [ $? -ne 0 ] ; then echo "libiconv dir missing, or duplicated?" exit 1 fi APPLY_PATCH_ARG=$PATCHES_ICONV applyPatches make clean ./configure --host=$HOST_VAL --enable-shared --disable-static --prefix=/ || { echo "libiconv configure failed"; exit 1; } make -j $NUM_PROCS || { echo "libiconv build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "libiconv install failed"; exit 1; } popd >/dev/null popd >/dev/null FIX_LA_FILE_ARG=libiconv fix_la_file echo ${NAME} >> $BUILD_STATUS_FILE } function build_gettext() { NAME="gettext" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd gettext-* >/dev/null if [ $? -ne 0 ] ; then echo "$NAME dir missing, or duplicated?" exit 1 fi make clean APPLY_PATCH_ARG=$PATCHES_GETTEXT applyPatches automake ./configure --host=$HOST_VAL --disable-threads --enable-shared --disable-static --prefix=/ || { echo "$NAME configure failed"; exit 1; } make -j $NUM_PROCS || { echo "$NAME build failed"; exit 1; } make install DESTDIR="$BASE"|| { echo "$NAME install failed"; exit 1; } #FIXME: I had to copy the .lib, .la and .a files manually # I don't know why the makefile does not do this. CPSUCCESS=0 for i in `ls gettext-runtime/intl/.libs/libintl*.{la,lib,a,dll}` do cp $i ${BASE}/lib/ if [ $? -eq 0 ] ; then CPSUCCESS=1; fi done if [ $CPSUCCESS -eq 0 ] ; then { echo "semi-manual copy of libintl failed"; exit 1; } fi popd >/dev/null popd >/dev/null FIX_LA_FILE_ARG=libintl fix_la_file FIX_LA_FILE_ARG=libcharset fix_la_file echo ${NAME} >> $BUILD_STATUS_FILE } function build_mathgl() { NAME="libmgl" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd mathgl-* >/dev/null if [ $? -ne 0 ] ; then echo "mathgl dir missing, or duplicated?" exit 1 fi make clean APPLY_PATCH_ARG=$PATCHES_MATHGL applyPatches if [ -d $BASEDIR/include/mgl2 ] ; then echo "there are mgl2 headers already installed. Abort abort!"\ exit 1 fi rm -f CMakeCache.txt LIBS=-lpng cmake -Denable-gsl="yes" -Denable-mpi="no" -DCMAKE_INSTALL_PREFIX="$BASE" -DCMAKE_TOOLCHAIN_FILE=../../patches/cmake-toolchain$BITS_VAL -DPNG_PNG_INCLUDE_DIR=${BASEDIR}/include/ make -j $NUM_PROCS if [ x"`find ./ -name \*dll`" == x"" ] ; then echo "Did cmake fail to make a DLL? Cmake rarely builds cleanly, but I should be able to find the DLL..." exit 1 fi make install ln -s ${BASE}/include/mgl2 ${BASE}/include/mgl popd >/dev/null popd >/dev/null FIX_LA_FILE_ARG=libmgl fix_la_file echo ${NAME} >> $BUILD_STATUS_FILE } function build_libvigra() { NAME="libvigra" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd libvigraimpex-* >/dev/null if [ $? -ne 0 ] ; then echo "$NAME dir missing, or duplicated?" exit 1 fi make clean APPLY_PATCH_ARG=$PATCHES_LIBVIGRA applyPatches cmake -DCMAKE_INSTALL_PREFIX="$BASE" -DCMAKE_TOOLCHAIN_FILE=../../patches/cmake-toolchain$BITS_VAL -DPNG_PNG_INCLUDE_DIR=${BASEDIR}/include/ make -j $NUM_PROCS make install || { echo "$NAME install failed"; exit 1; } popd >/dev/null popd >/dev/null FIX_LA_FILE_ARG=libmgl fix_la_file echo ${NAME} >> $BUILD_STATUS_FILE } function build_ftgl() { NAME="libftgl" ISBUILT_ARG=${NAME} isBuilt if [ $ISBUILT -eq 1 ] ; then return; fi pushd deps >/dev/null pushd ftgl-* >/dev/null if [ $? -ne 0 ] ; then echo "ftgl dir missing, or duplicated?" exit 1 fi make clean APPLY_PATCH_ARG="$PATCHES_FTGL" applyPatches autoreconf libtoolize APPLY_PATCH_ARG="$PATCHES_FTGL_POSTCONF" applyPatches #rename GLU to glu32 and gl to opengl32 sed -i s/'\-lGLU'/-lglu32/ configure sed -i s/'\-lGL'/-lopengl32/ configure #configure tries to link against wrong prototypes. Override this sed -i 's/char glBegin() ;//' configure sed -i 's/char gluNewTess ();//' configure sed -i 's/return glBegin ()/return 0;/' configure sed -i 's/return gluNewTess ()/return 0;/' configure sed -i 's/return glBegin(GL_POINTS)/return 0;/' configure ./configure --host=$HOST_VAL --enable-shared --disable-static --prefix=/ || { echo "ftgl configure failed"; exit 1; } #MAkefile refers to ECHO variable for reporting completion, which does not exist sed -i 's/ECHO_C =/ECHO=echo/' Makefile sed -i "s@-I//@-I${BASE}/@" Makefile sed -i 's/ECHO_C =/ECHO=echo/' Makefile #HACK - find all -I// and -L// and replace them with something sane find ./ -name Makefile -exec sed -i "s@-I//@-I${BASE}/@" {} \; find ./ -name Makefile -exec sed -i "s@-L//@-L${BASE}/@" {} \; LIBS="-lfreetype -lz" make -j $NUM_PROCS || { echo "ftgl build failed"; exit 1; } DESTDIR="$BASE" make install || { echo "ftgl install failed"; exit 1; } #HACK: Ftgl doesn't install the dll correctly. Just do it by hand cp src/.libs/libftgl-*dll ${BASE}/lib/ || { echo "FTGL dll could not be installed." ; exit 1; } pushd $BASE/lib/ ln -s libftgl-*dll libftgl.dll popd > /dev/null popd >/dev/null popd >/dev/null FIX_LA_FILE_ARG=libftgl fix_la_file echo ${NAME} >> $BUILD_STATUS_FILE } function createDirLayout() { NEEDED_DIRS="bin lib include deps/packages" for i in $NEEDED_DIRS do if [ ! -d $i ] ; then mkdir -p $i; fi done } function checkPatchesExist() { echo -n "checking patches exist..." if [ x"$PATCH_LIST" == x"" ] ; then return; fi if [ ! -d patches ] ; then echo "Patch directory does not exist, but patches are needed" echo "Need : " $PATCH_LIST exit 1 fi for i in $PATCH_LIST do if [ ! -f "patches/$i" ] ; then echo "patches/$i" does not exist exit 1; fi done echo "done" } #Ensure we are running under a whitelisted host function checkHost() { echo -n "Host checks... " if [ x`which uname` == x"" ] ; then echo "Uname missing... Shouldn't be... Can't determine arch - bailing out." exit 1 fi if [ x`uname -s` != x"Linux" ] ; then echo "This is only meant to run under linux.. and probably only debian-like systems." exit 1 fi HOSTTYPE=`uname -m` if [ x"$HOSTTYPE" != x"x86_64" ] ; then echo "This only works on x86_64 builder machines - you'll need to modify the script to handle other arches. Sorry." exit 1 fi BINARIES_NEEDED="apt-get sudo patch grep sed awk" for i in $BINARIES_NEEDED do if [ x`which $i` == x"" ] ; then echo "Missing binary : $i - aborting" exit 1 fi done if [ x`which lsb_release` != x"" ] ; then #Possible results # Debian, LinuxMint,Ubuntu,(others) DIST_NAME=`lsb_release -i | awk -F: '{print $2}' | sed 's/\s//g'` if [ x$DIST_NAME != x"Debian" ] ; then echo "This is meant to target debian. I'm not sure if it will work on your system. You'll need to work that out." echo "Sleeping for 4 seconds." sleep 4 fi fi echo "done" } #Build 3Depict function build_3Depict() { pushd code/3Depict make distclean autoreconf automake --add-missing CONF_FLAG="--host=$HOST_VAL --with-libqhull-link=-lqhull" if [ $IS_RELEASE -ne 0 ] ; then CONF_FLAG="$CONF_FLAG --disable-debug-checks --enable-openmp-parallel" fi FTGL_CFLAGS="-I${BASE}/include/freetype2/" CFLAGS="$CFLAGS -DUNICODE -Dqh_QHpointer" CPPFLAGS="${CPPFLAGS} -DUNICODE -Dqh_QHpointer" ./configure $CONF_FLAG if [ $? -ne 0 ] ; then echo "Failed 3Depict configure" exit 1 fi #comment out the rpl_malloc and rpl_realloc calls sed -i 's@^#define \([a-z]*\) rpl_@//#define \1 rpl_@' config.h #sanity check that windres is activated if [ x`grep HAVE_WINDRES_TRUE config.log | grep '#' ` != x"" ] ; then echo "Windres appears to be commented out. Shouldn't be for windows builds" exit 1 fi #Check that wx's manifest matches our arch MANIFEST=`find ../../include/ -name wx.manifest` if [ x"$MANIFEST" == x"" ] ; then echo "Didnt' find manifest!" exit 1 fi case $BITS_VAL in 32) MANIFEST_TARG=x86 MANIFEST_NOT=amd64 ;; 64) MANIFEST_TARG=amd64 MANIFEST_NOT=x86 ;; esac if [ x"`grep -i $MANIFEST_TARG $MANIFEST`" == x"" ] ; then echo "Manifest arch does not match!" echo " file examined: $MANIFEST" echo " Expected :" $MANIFEST_TARG exit 1 fi if [ x"`grep -i $MANIFEST_NOT $MANIFEST`" != x"" ] ; then echo "Manifest arch does not match!" echo " file examined: $MANIFEST" echo " This should be missing, but isnt:" $MANIFEST_NOT exit 1 fi #HACK - strip all makefiles of -D_GLIBCXX_DEBUG # mingw & GLIBCXX_DEBG don't play nice find ./ -name Makefile -exec sed -i 's/-D_GLIBCXX_DEBUG//g' {} \; #HACK - find all -I// and -L// and replace them with something sane find ./ -name Makefile -exec sed -i "s@-I//@-I${BASE}/@" {} \; find ./ -name Makefile -exec sed -i "s@-L//@-L${BASE}/@" {} \; #Actually perform build make -j$NUM_PROCS if [ $? -ne 0 ] ; then echo "Failed 3Depict build" exit 1 fi #if the locales are missing, try to rebuild them if [ x`find locales/ -name \*.mo` = x"" ] ; then if [ x`which msgmerge` == x"" ] ; then echo "Translations do not appear to be built for 3depict. Need to install translation builder, gettext." sudo apt-get install gettext fi pushd translations ./makeTranslations || { echo "Translation build failed."; exit 1; } mkdir -p ../locales/ for i in *.mo do TARGDIR=../locales/`echo $i | sed ' s/\.mo//' | sed 's/3Depict_//'` mkdir -p $TARGDIR cp $i $TARGDIR/ done popd fi popd > /dev/null } #Build the nsis package function make_package() { if [ x"$HOST_EXT" != x"win64" ] ; then echo "WRONG HOST EXT!" exit 1 fi pushd ./code/3Depict 2> /dev/null #Check that the PDF manual has been built if [ ! -f docs/manual-latex/manual.pdf ] ; then echo "PDF Manual not built. Building" pushd docs/manual-latex pdflatex manual.tex && bibtex manual && pdflatex manual.tex || { echo " Manual not pre-built, and failed to build. Aborting" ; exit 1; } popd if [ ! -f docs/manual-latex/manual.pdf ] ; then echo "Failed to build manual, even though latex completed with no errors. Aborting " exit 1; fi fi NSI_FILE=./windows-installer.nsi #copy as needed # Due to debian bug : #704828, makensis cannot correctly handle symlinks, # so don't use symlinks if [ ! -f `basename $NSI_FILE` ] ; then cp ./packaging/mingw-debian-cross/windows-installer.nsi . fi if [ ! -f $NSI_FILE ] ; then echo "NSI file missing whilst trying to build package" exit 1; fi #Check NSI file has PROGRAMFILES / PROGRAMFILES64 set if [ x"`grep PROGRAMFILES64 $NSI_FILE`" == x"" -a $BITS_VAL == 64 ] ; then echo "NSI file should contain PROGRAMFILES64 output path." exit 1; else if [ x"`grep PROGRAMFILES64 $NSI_FILE`" != x"" -a $BITS_VAL == 32 ] ; then echo "NSI file contained 64 bit install dir, but this is 32" exit 1; fi fi echo -n " Copying dll files... " SYSTEM_DLLS="(ADVAPI32.dll|COMCTL32.DLL|COMDLG32.DLL|GDI32.dll|KERNEL32.dll|ole32.dll|OLEAUT32.dll|RPCRT4.dll|SHELL32.DLL|USER32.dll|WINMM.DLL|WINSPOOL.DRV|WSOCK32.DLL|GLU32.dll|OPENGL32.dll|msvcrt.dll|WS2_32.dll|SHLWAPI.dll|VERSION.dll)" DLL_FILES=`${HOST_VAL}-objdump -x src/3Depict.exe | grep 'DLL Name:' | awk '{print $3}' | egrep -i -v ${SYSTEM_DLLS}` FOUND_DLLS="" SYS_DIR=/usr/lib/gcc/${HOST_VAL}/ echo "DEBUG :" $DLL_FILES rm -f tmp-dlls tmp-found-dlls #copy the DLL files from system or # from the build locations while [ x"$DLL_FILES" != x"" ] ; do echo $DLL_FILES | tr '\ ' '\n' > tmp-dlls DLL_FILES=`cat tmp-dlls | sort | uniq` echo "Looking for these:" $DLL_FILES echo "Have found these:" $FOUND_DLLS for i in $DLL_FILES do HAVE_DLL=0 for j in ${BASE}/lib/ ${BASE}/bin/ $SYS_DIR /usr/${HOST_VAL}/lib/ do FIND_RES=`find $j -name $i | head -n 1` if [ x$FIND_RES != x"" ] ; then HAVE_DLL=1; cp $FIND_RES ./src/ FOUND_DLLS="$FOUND_DLLS `basename $FIND_RES`" break; fi done if [ $HAVE_DLL -eq 0 ] ; then echo "Couldnt find DLL :" echo " $i " echo " looked in ${BASE}/lib/ and $SYS_DIR" exit 1; fi done #Update the list of dll files echo $FOUND_DLLS |tr '\ ' '\n' | sort | uniq > tmp-found-dlls DLL_FILES=`${HOST_VAL}-objdump -x ./src/3Depict.exe ./src/*dll | grep 'DLL Name:' | awk '{print $3}' | egrep -i -v ${SYSTEM_DLLS} | grep -iv -f tmp-found-dlls | sort | uniq` done echo "done." if [ $IS_RELEASE -ne 0 ] ; then #Strip debugging information pushd src/ > /dev/null strip *.dll *.exe popd > /dev/null fi #Check for differeent DLL types (eg 32/64) DLL_FILE_OUT=""; for i in $FOUND_DLLS do J=`file $i | awk -F: '{print $2}' | sed 's/\s*//'` if [ x"$DLL_FILE_OUT" == x"" ] ; then DLL_FILE_OUT=$j else if [ x"$DLL_FILE_OUT" != x"$j" ] ; then echo "DLL Mismatched file info. $i" exit 1 fi fi done if [ x"`cat windows-installer.nsi | grep INSERT_DLLS_HERE`" == x"" ] || [ x"`cat windows-installer.nsi | grep INSERT_UNINST_DLLS_HERE`" == x"" ] ; then echo "DLL insertion/removal tokens not found. Was looking for INSERT_DLLS_HERE and INSERT_UNINST_DLLS_HERE" exit 1 fi #Insert DLL names automatically cp windows-installer.nsi tmp.nsi echo $FOUND_DLLS | sed 's/ /\n/g' | sed 's@^@ File \"src\\@' | sed 's/$/\"/' > tmp-insert perl -ne 's/^ ;INSERT_DLLS_HERE/`cat tmp-insert$1`/e;print' tmp.nsi >tmp2.nsi mv tmp2.nsi tmp.nsi echo $FOUND_DLLS | sed 's/ /\n/g' | sed 's@^@ Delete \"$INSTDIR\\@' | sed 's/$/\"/' > tmp-insert perl -ne 's/^ ;INSERT_UNINST_DLLS_HERE/`cat tmp-insert$1`/e;print' tmp.nsi > tmp2.nsi mv tmp2.nsi tmp.nsi #TODO: Why is perl converting this to dos? dos2unix tmp.nsi NSI_FILE=tmp.nsi makensis `basename $NSI_FILE` || { echo "makensis failed" ; exit 1; } echo "-------------------" VERSION=`cat $NSI_FILE | grep "define PRODUCT_VERSION " | awk '{print $3}' | sed s/\"//g | sed s/\s*$//` if [ $IS_RELEASE -ne 0 ] ; then echo "Release mode enabled:" TARGET_FILE=3Depict-$VERSION-$HOST_EXT.exe else echo "Release mode disabled:" TARGET_FILE=3Depict-${VERSION}-${HOST_EXT}-debug.exe fi mv 3Depict-setup.exe $TARGET_FILE echo "File written to : `pwd`/$TARGET_FILE" echo "-------------------" popd > /dev/null } #Check that we have a suitable host system checkHost #Check we have the patches we need checkPatchesExist #build the dirs we need createDirLayout #Install cross compiler #--- case ${HOST_VAL} in x86_64-w64-mingw32) if [ x"$DIST_NAME" == x"Ubuntu" ] || [ x"$DIST_NAME" == x"LinuxMint" ] ; then MINGW_PACKAGES="mingw-w64-dev g++-mingw-w64-x86-64" else MINGW_PACKAGES="mingw-w64-x86-64-dev g++-mingw-w64-x86-64" fi HOST_EXT="win64" ;; i686-w64-mingw32) MINGW_PACKAGES="gcc-mingw-w64-i686 g++-mingw-w64-i686" HOST_EXT="win32" ;; *) echo "Unknown host... please install deps manually,or alter script" exit 1 ;; esac #install the compiler install_mingw #--- #Create the binaries we need createBaseBinaries #Obtain the needed dependencies grabDeps #set our needed environment variables PATH=${BASE}/bin/:/usr/$HOST_VAL/bin/:$PATH export CXX=${HOST_VAL}-g++ export CPP=${HOST_VAL}-cpp export CC=${HOST_VAL}-gcc export CPPFLAGS=-I${BASE}/include/ export CFLAGS=-I${BASE}/include/ export CXXFLAGS=-I${BASE}/include/ export LDFLAGS=-L${BASE}/lib/ export RANLIB=${HOST_VAL}-ranlib export LIBS="-L${BASE}/lib/" DESTDIR=${BASE} build_zlib build_libtiff build_libpng build_libjpeg build_libxml2 build_gsl build_qhull2012 #build_qhull2015 build_expat build_freetype build_libiconv build_gettext build_ftgl build_glew build_libvigra build_mathgl build_wx build_3Depict make_package 3Depict-0.0.19/packaging/mingw-debian-cross/windows-installer.nsi0000755000175000017500000001254012716174467024320 0ustar pcuserpcuser; Script generated by the HM NIS Edit Script Wizard. ; HM NIS Edit Wizard helper defines !define PRODUCT_NAME "3Depict" !define PRODUCT_VERSION "0.0.19" !define PRODUCT_PUBLISHER "D. Haley, A. Ceguerra" !define PRODUCT_WEB_SITE "http://threedepict.sourceforge.net" !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\3Depict.exe" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define PRODUCT_UNINST_ROOT_KEY "HKLM" SetCompressor /FINAL /SOLID lzma SetCompressorDictSize 64 !include "x64.nsh" ; MUI 1.67 compatible ------ !include "MUI.nsh" ; MUI Settings !define MUI_ABORTWARNING !define MUI_ICON "src/myAppIcon.ico" !define MUI_UNICON "src/myAppIcon.ico" !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP "data/textures/tex-source/3Depict-icon-hires.png" !define MUI_HEADERIMAGE_RIGHT ; Welcome page !insertmacro MUI_PAGE_WELCOME ; License page !insertmacro MUI_PAGE_LICENSE "COPYING" ; Directory page !insertmacro MUI_PAGE_DIRECTORY ; Instfiles page !insertmacro MUI_PAGE_INSTFILES ; Finish page ;!define MUI_FINISHPAGE_RUN "$INSTDIR\3Depict.exe" ;!insertmacro MUI_PAGE_FINISH ; Uninstaller pages !insertmacro MUI_UNPAGE_INSTFILES ; Language files !insertmacro MUI_LANGUAGE "English" ; MUI end ------ Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" OutFile "3Depict-setup.exe" InstallDir "$PROGRAMFILES64\3Depict" InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" ShowInstDetails show ShowUnInstDetails show Section "3Depict program" SEC01 SetOutPath "$INSTDIR" SetOverwrite ifnewer File "src\3Depict.exe" File "docs\manual-latex\manual.pdf" ;INSERT_DLLS_HERE CreateDirectory "$SMPROGRAMS\3Depict" CreateShortCut "$SMPROGRAMS\3Depict\3Depict.lnk" "$INSTDIR\3Depict.exe" CreateShortCut "$DESKTOP\3Depict.lnk" "$INSTDIR\3Depict.exe" ;Language translations installation CreateDirectory "locales" SetOverwrite try SetOutPath "$INSTDIR\locales\" File /r locales\*.* SetOutPath "$INSTDIR\textures\" File "data\textures\Left-Right-arrow.png" File "data\textures\Left_clicked_mouse.png" File "data\textures\Right-arrow.png" File "data\textures\Right_clicked_mouse.png" File "data\textures\animProgress0.png" File "data\textures\animProgress1.png" File "data\textures\animProgress2.png" File "data\textures\enlarge.png" File "data\textures\keyboard-alt.png" File "data\textures\keyboard-command.png" File "data\textures\keyboard-ctrl.png" File "data\textures\keyboard-shift.png" File "data\textures\keyboard-tab.png" File "data\textures\middle_clicked_mouse.png" File "data\textures\plot_slide_x.png" File "data\textures\plot_zoom_reset.png" File "data\textures\plot_zoom_x.png" File "data\textures\plot_zoom_y.png" File "data\textures\rotateArrow.png" File "data\textures\scroll_wheel_mouse.png" SetOutPath "$INSTDIR" File "data\3Depict.xpm" File "data\atomic-mass-table.dtd" File "data\naturalAbundance.xml" File "data\startup-tips.txt" SectionEnd Section -AdditionalIcons WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" CreateShortCut "$SMPROGRAMS\3Depict\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" CreateShortCut "$SMPROGRAMS\3Depict\Uninstall.lnk" "$INSTDIR\uninst.exe" SectionEnd Section -Post WriteUninstaller "$INSTDIR\uninst.exe" WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\3Depict.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\3Depict.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" SectionEnd Function un.onUninstSuccess HideWindow MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was successfully removed from your computer." FunctionEnd Function un.onInit MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove $(^Name)?" IDYES +2 Abort FunctionEnd Section Uninstall Delete "$INSTDIR\${PRODUCT_NAME}.url" Delete "$INSTDIR\uninst.exe" RMDir /r "$INSTDIR\textures" RMDir "$INSTDIR\textures" RMDir /r "$INSTDIR\locales" RMDir "$INSTDIR\locales" Delete "$INSTDIR\3Depict.xpm" Delete "$INSTDIR\atomic-mass-table.dtd" Delete "$INSTDIR\naturalAbundance.xml" Delete "$INSTDIR\startup-tips.txt" Delete "$INSTDIR\3Depict.exe" Delete "$INSTDIR\manual.pdf" ;This is a token that should be replaced with the DLLS to uninstall ;INSERT_UNINST_DLLS_HERE Delete "$SMPROGRAMS\3Depict\Uninstall.lnk" Delete "$SMPROGRAMS\3Depict\Website.lnk" Delete "$SMPROGRAMS\3Depict\manual.pdf" Delete "$DESKTOP\3Depict.lnk" Delete "$SMPROGRAMS\3Depict\3Depict.lnk" RMDir "$SMPROGRAMS\3Depict" RMDir "$INSTDIR\textures" RMDir "$INSTDIR" DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}" SetAutoClose true SectionEnd 3Depict-0.0.19/packaging/mingw-debian-cross/patches/0000755000175000017500000000000012716174467021542 5ustar pcuserpcuser3Depict-0.0.19/packaging/mingw-debian-cross/patches/ftgl-disable-doc0000644000175000017500000000135612640746376024572 0ustar pcuserpcuserdiff -r 798a38fb8fc4 Makefile.am --- a/Makefile.am Sat Nov 16 16:50:20 2013 +0100 +++ b/Makefile.am Sat Nov 16 16:50:44 2013 +0100 @@ -1,7 +1,7 @@ ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = src test demo docs +SUBDIRS = src DIST_SUBDIRS = $(SUBDIRS) msvc pkgconfigdir = $(libdir)/pkgconfig diff -r b330fd541a40 configure.ac --- a/configure.ac Sat Nov 16 16:54:52 2013 +0100 +++ b/configure.ac Sat Nov 16 16:55:34 2013 +0100 @@ -65,6 +65,7 @@ # Build HTML documentatin? AC_PATH_PROG(DOXYGEN, doxygen, no) +DOXYGEN="no" AM_CONDITIONAL(HAVE_DOXYGEN, test "x$DOXYGEN" != "xno") # Build PDF documentation? @@ -91,6 +92,7 @@ AC_MSG_RESULT(no) fi fi +LATEX="no" AM_CONDITIONAL(HAVE_LATEX, test "x${LATEX}" != "xno") AC_CONFIG_FILES([ 3Depict-0.0.19/packaging/mingw-debian-cross/patches/gettext-disable-tools0000644000175000017500000000323612716174467025714 0ustar pcuserpcuserdiff -r fc8ef26fbd29 Makefile.am --- a/Makefile.am Fri Apr 22 23:17:46 2016 +0100 +++ b/Makefile.am Fri Apr 22 23:20:55 2016 +0100 @@ -19,7 +19,7 @@ AUTOMAKE_OPTIONS = 1.5 gnu no-dependencies ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = gnulib-local gettext-runtime gettext-tools +SUBDIRS = gnulib-local gettext-runtime changelog_etc = \ gettext-runtime/ChangeLog.0 \ @@ -57,10 +57,12 @@ m4/libtool.m4 # Additional dependencies for configure, due to the use of autoconf --trace. -$(srcdir)/configure: $(srcdir)/gettext-runtime/configure.ac $(srcdir)/gettext-tools/configure.ac +$(srcdir)/configure: $(srcdir)/gettext-runtime/configure.ac # Verify that some files are the same. distcheck-hook: + +distcheck-hook-disable: cmp -s gettext-runtime/po/Makefile.in.in gettext-tools/po/Makefile.in.in cmp -s gettext-runtime/po/Rules-quot gettext-tools/po/Rules-quot cmp -s gettext-runtime/po/boldquot.sed gettext-tools/po/boldquot.sed diff -r fc8ef26fbd29 Makefile.in --- a/Makefile.in Fri Apr 22 23:17:46 2016 +0100 +++ b/Makefile.in Fri Apr 22 23:20:55 2016 +0100 @@ -312,7 +312,7 @@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = 1.5 gnu no-dependencies ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = gnulib-local gettext-runtime gettext-tools +SUBDIRS = gnulib-local gettext-runtime changelog_etc = \ gettext-runtime/ChangeLog.0 \ gettext-runtime/doc/ChangeLog.0 \ @@ -839,6 +839,8 @@ # Verify that some files are the same. distcheck-hook: + +distcheck-hook-disable: cmp -s gettext-runtime/po/Makefile.in.in gettext-tools/po/Makefile.in.in cmp -s gettext-runtime/po/Rules-quot gettext-tools/po/Rules-quot cmp -s gettext-runtime/po/boldquot.sed gettext-tools/po/boldquot.sed 3Depict-0.0.19/packaging/mingw-debian-cross/patches/glew-makefile0000644000175000017500000000232312716174467024176 0ustar pcuserpcuserdiff -r ec3d3c4b0904 Makefile --- a/Makefile Sat Apr 23 00:47:08 2016 +0100 +++ b/Makefile Sat Apr 23 00:48:25 2016 +0100 @@ -28,20 +28,14 @@ ## ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ## THE POSSIBILITY OF SUCH DAMAGE. -include config/version +include config/Makefile.mingw + SHELL = /bin/sh -SYSTEM ?= $(shell config/config.guess | cut -d - -f 3 | sed -e 's/[0-9\.]//g;') -SYSTEM.SUPPORTED = $(shell test -f config/Makefile.$(SYSTEM) && echo 1) -ifeq ($(SYSTEM.SUPPORTED), 1) -include config/Makefile.$(SYSTEM) -else -$(error "Platform '$(SYSTEM)' not supported") -endif - -GLEW_PREFIX ?= /usr -GLEW_DEST ?= /usr +SYSTEM = x86_64-w64-mingw32 +GLEW_PREFIX ?= /home/pcuser/mingw64 +GLEW_DEST ?= /home/pcuser/mingw64 BINDIR ?= $(GLEW_DEST)/bin LIBDIR ?= $(GLEW_DEST)/lib INCDIR ?= $(GLEW_DEST)/include/GL diff -r 9bbbd8b43e5b config/Makefile.mingw --- a/config/Makefile.mingw Sun Jun 29 17:24:13 2014 +0100 +++ b/config/Makefile.mingw Sun Jun 29 17:25:52 2014 +0100 @@ -1,7 +1,4 @@ NAME = glew32 -# use gcc for linking, with ld it does not work -CC := gcc -LD := gcc LN := CFLAGS.SO = -DGLEW_BUILD LDFLAGS.GL = -lopengl32 -lgdi32 -luser32 -lkernel32 LDFLAGS.EXTRA = -L/mingw/lib 3Depict-0.0.19/packaging/mingw-debian-cross/patches/ftgl-mingw32-prototype0000644000175000017500000000320612640746376025751 0ustar pcuserpcuser--- a/configure 2013-04-06 23:46:42.000000000 +0200 +++ b/configure 2013-03-24 15:08:57.000000000 +0100 @@ -22541,12 +22541,15 @@ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ - -#include +#ifdef __cplusplus +extern "C" +#endif +char glBegin (); int main () { -glBegin (GL_LINES); +return glBegin (); + ; return 0; } _ACEOF @@ -22591,12 +22594,15 @@ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ - -#include +#ifdef __cplusplus +extern "C" +#endif +char glBegin (); int main () { -glBegin (GL_LINES); +return glBegin (); + ; return 0; } _ACEOF @@ -23005,12 +23011,15 @@ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ - -#include +#ifdef __cplusplus +extern "C" +#endif +char gluNewTess (); int main () { - GLUquadricObj *p=gluNewQuadric(); +return gluNewTess (); + ; return 0; } _ACEOF @@ -23055,11 +23064,15 @@ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#include +#ifdef __cplusplus +extern "C" +#endif +char gluNewTess (); int main () { - GLUquadricObj *p=gluNewQuadric(); +return gluNewTess (); + ; return 0; } _ACEOF 3Depict-0.0.19/packaging/mingw-debian-cross/patches/qhull2015-cmakefile-replacement0000644000175000017500000005141612716174467027344 0ustar pcuserpcuser# CMakeLists.txt -- CMake configuration file for qhull, qhull6, and related programs # # To install CMake # Download from http://www.cmake.org/download/ # # To find the available targets for CMake -G "..." # cmake --help # # To build with MSYS/mingw # cd build && cmake -G "MSYS Makefiles" .. && cmake .. # make # make install # # To uninstall on unix or MSYS/mingw # xargs rm Empty(); - - m_dictName.clear(); - - m_currentCategory = NULL; - m_lastCaptionBottomnest = 1; - m_itemsAdded = 0; - - m_virtualHeight = 0; - m_vhCalcPending = 0; + // If handling wxPG event then every property item must be + // deleted individually (and with deferral). + if ( m_pPropGrid && m_pPropGrid->m_processedEvent ) + { + wxPropertyGridIterator it; + for ( it = m_pPropGrid->GetIterator(wxPG_ITERATE_ALL); + !it.AtEnd(); + it++ ) + { + DoDelete(*it, true); + } + } + else + { + m_regularArray.Empty(); + if ( m_abcArray ) + m_abcArray->Empty(); + + m_dictName.clear(); + + m_currentCategory = NULL; + m_lastCaptionBottomnest = 1; + m_itemsAdded = 0; + + m_virtualHeight = 0; + m_vhCalcPending = 0; + } } 3Depict-0.0.19/packaging/mingw-debian-cross/patches/wxWidgets-2.8.12-mingw64-1.patch0000644000175000017500000005355312640746376026740 0ustar pcuserpcuserdiff --strip-trailing-cr -Nur wxWidgets-2.8.12/configure wxWidgets-2.8.12.patched/configure --- wxWidgets-2.8.12/configure 2011-03-22 19:59:37 +0800 +++ wxWidgets-2.8.12.patched/configure 2011-04-07 11:33:02 +0800 @@ -27805,10 +27805,10 @@ case "${host}" in x86_64-*-mingw32* ) - LIBS="$LIBS -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -lwctl3d32 -ladvapi32 -lwsock32 -lgdi32" + LIBS="$LIBS -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -ladvapi32 -lws2_32 -lgdi32" ;; * ) - LIBS="$LIBS -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -lctl3d32 -ladvapi32 -lwsock32 -lgdi32" + LIBS="$LIBS -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -ladvapi32 -lws2_32 -lgdi32" ;; esac if test "$wxUSE_ACCESSIBILITY" = "yes" ; then diff --strip-trailing-cr -Nur wxWidgets-2.8.12/include/wx/msw/menuitem.h wxWidgets-2.8.12.patched/include/wx/msw/menuitem.h --- wxWidgets-2.8.12/include/wx/msw/menuitem.h 2011-03-22 20:00:56 +0800 +++ wxWidgets-2.8.12.patched/include/wx/msw/menuitem.h 2011-04-07 12:35:30 +0800 @@ -54,7 +54,7 @@ // the id for a popup menu is really its menu handle (as required by // ::AppendMenu() API), so this function will return either the id or the // menu handle depending on what we're - int GetRealId() const; + WXWPARAM GetRealId() const; // mark item as belonging to the given radio group void SetAsRadioGroupStart(); diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/aui/framemanager.cpp wxWidgets-2.8.12.patched/src/aui/framemanager.cpp --- wxWidgets-2.8.12/src/aui/framemanager.cpp 2011-03-22 19:59:45 +0800 +++ wxWidgets-2.8.12.patched/src/aui/framemanager.cpp 2011-04-07 11:43:23 +0800 @@ -974,7 +974,7 @@ if (pinfo.name.empty() || already_exists) { pinfo.name.Printf(wxT("%08lx%08x%08x%08lx"), - ((unsigned long)pinfo.window) & 0xffffffff, + ((unsigned long)(intptr_t)pinfo.window) & 0xffffffff, (unsigned int)time(NULL), #ifdef __WXWINCE__ (unsigned int)GetTickCount(), diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/common/debugrpt.cpp wxWidgets-2.8.12.patched/src/common/debugrpt.cpp --- wxWidgets-2.8.12/src/common/debugrpt.cpp 2011-03-22 19:59:40 +0800 +++ wxWidgets-2.8.12.patched/src/common/debugrpt.cpp 2011-04-07 11:43:57 +0800 @@ -54,6 +54,8 @@ #include "wx/zipstrm.h" #endif // wxUSE_ZIPSTREAM +#include + WX_CHECK_BUILD_OPTIONS("wxQA") // ---------------------------------------------------------------------------- diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/common/filefn.cpp wxWidgets-2.8.12.patched/src/common/filefn.cpp --- wxWidgets-2.8.12/src/common/filefn.cpp 2011-03-22 19:59:41 +0800 +++ wxWidgets-2.8.12.patched/src/common/filefn.cpp 2011-04-07 11:44:23 +0800 @@ -70,6 +70,8 @@ #endif #endif // __GNUWIN32__ + #include + // io.h is needed for _get_osfhandle() // Already included by filefn.h for many Windows compilers #if defined __MWERKS__ || defined __CYGWIN__ diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/common/utilscmn.cpp wxWidgets-2.8.12.patched/src/common/utilscmn.cpp --- wxWidgets-2.8.12/src/common/utilscmn.cpp 2011-03-22 19:59:42 +0800 +++ wxWidgets-2.8.12.patched/src/common/utilscmn.cpp 2011-04-07 13:34:01 +0800 @@ -822,7 +822,7 @@ //hInstApp member is only valid if the function fails, in which case it //receives one of the following error values, which are less than or //equal to 32. - const int nResult = (int) sei.hInstApp; + const intptr_t nResult = (intptr_t)sei.hInstApp; // Firefox returns file not found for some reason, so make an exception // for it diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/dcprint.cpp wxWidgets-2.8.12.patched/src/msw/dcprint.cpp --- wxWidgets-2.8.12/src/msw/dcprint.cpp 2011-03-22 20:00:53 +0800 +++ wxWidgets-2.8.12.patched/src/msw/dcprint.cpp 2011-04-07 12:01:29 +0800 @@ -319,7 +319,7 @@ } - HGLOBAL hDevMode = (HGLOBAL)(DWORD) data->GetDevMode(); + HGLOBAL hDevMode = (HGLOBAL) data->GetDevMode(); DEVMODE *lpDevMode = hDevMode ? (DEVMODE *)::GlobalLock(hDevMode) : NULL; diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/frame.cpp wxWidgets-2.8.12.patched/src/msw/frame.cpp --- wxWidgets-2.8.12/src/msw/frame.cpp 2011-03-22 20:00:53 +0800 +++ wxWidgets-2.8.12.patched/src/msw/frame.cpp 2011-04-07 12:11:13 +0800 @@ -855,7 +855,7 @@ HDC hdc = ::BeginPaint(GetHwnd(), &ps); // Erase background before painting or we get white background - MSWDefWindowProc(WM_ICONERASEBKGND, (WORD)(LONG)ps.hdc, 0L); + MSWDefWindowProc(WM_ICONERASEBKGND, (intptr_t)ps.hdc, 0L); if ( hIcon ) { @@ -1085,7 +1085,7 @@ const wxIcon& icon = GetIcon(); HICON hIcon = icon.Ok() ? GetHiconOf(icon) : (HICON)GetDefaultIcon(); - rc = (long)hIcon; + rc = (intptr_t)hIcon; // WXLRESULT is int64 in win64 processed = rc != 0; } break; diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/helpwin.cpp wxWidgets-2.8.12.patched/src/msw/helpwin.cpp --- wxWidgets-2.8.12/src/msw/helpwin.cpp 2011-03-22 20:00:54 +0800 +++ wxWidgets-2.8.12.patched/src/msw/helpwin.cpp 2011-04-07 12:15:22 +0800 @@ -98,7 +98,7 @@ wxString str = GetValidFilename(m_helpFile); - return (WinHelp(GetSuitableHWND(this), (const wxChar*) str, HELP_PARTIALKEY, (DWORD)(const wxChar*) k) != 0); + return (WinHelp(GetSuitableHWND(this), (const wxChar*) str, HELP_PARTIALKEY, (intptr_t)(const wxChar*) k) != 0); } // Can't close the help window explicitly in WinHelp diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/mdi.cpp wxWidgets-2.8.12.patched/src/msw/mdi.cpp --- wxWidgets-2.8.12/src/msw/mdi.cpp 2011-03-22 20:00:54 +0800 +++ wxWidgets-2.8.12.patched/src/msw/mdi.cpp 2011-04-07 12:22:05 +0800 @@ -763,7 +763,7 @@ wxWindowCreationHook hook(this); m_hWnd = (WXHWND)::SendMessage(GetWinHwnd(parent->GetClientWindow()), - WM_MDICREATE, 0, (LONG)(LPSTR)&mcs); + WM_MDICREATE, 0, (intptr_t)&mcs); if ( !m_hWnd ) { @@ -1433,14 +1433,14 @@ { success = true; ::InsertMenu(hmenu, i, MF_BYPOSITION | MF_POPUP | MF_STRING, - (UINT)subMenu, _("&Window")); + (intptr_t)subMenu, _("&Window")); break; } } if ( !success ) { - ::AppendMenu(hmenu, MF_POPUP, (UINT)subMenu, _("&Window")); + ::AppendMenu(hmenu, MF_POPUP, (intptr_t)subMenu, _("&Window")); } } diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/menu.cpp wxWidgets-2.8.12.patched/src/msw/menu.cpp --- wxWidgets-2.8.12/src/msw/menu.cpp 2011-03-22 20:00:54 +0800 +++ wxWidgets-2.8.12.patched/src/msw/menu.cpp 2011-04-07 13:37:06 +0800 @@ -370,19 +370,19 @@ // id is the numeric id for normal menu items and HMENU for submenus as // required by ::AppendMenu() API - UINT id; + UINT_PTR id; wxMenu *submenu = pItem->GetSubMenu(); if ( submenu != NULL ) { wxASSERT_MSG( submenu->GetHMenu(), wxT("invalid submenu") ); submenu->SetParent(this); - id = (UINT)submenu->GetHMenu(); + id = (intptr_t)submenu->GetHMenu(); flags |= MF_POPUP; } else { - id = pItem->GetId(); + id = pItem->GetRealId(); } @@ -963,7 +963,7 @@ for ( i = 0, it = m_menus.begin(); i < count; i++, it++ ) { if ( !::AppendMenu((HMENU)m_hMenu, MF_POPUP | MF_STRING, - (UINT)(*it)->GetHMenu(), + (intptr_t)(*it)->GetHMenu(), m_titles[i]) ) { wxLogLastError(wxT("AppendMenu")); @@ -1035,7 +1035,7 @@ int mswpos = MSWPositionForWxMenu(GetMenu(pos),pos); - UINT id; + UINT_PTR id; UINT flagsOld = ::GetMenuState((HMENU)m_hMenu, mswpos, MF_BYPOSITION); if ( flagsOld == 0xFFFFFFFF ) { @@ -1048,7 +1048,7 @@ { // HIBYTE contains the number of items in the submenu in this case flagsOld &= 0xff; - id = (UINT)::GetSubMenu((HMENU)m_hMenu, mswpos); + id = (intptr_t)::GetSubMenu((HMENU)m_hMenu, mswpos); } else { @@ -1124,7 +1124,7 @@ if ( !::InsertMenu(GetHmenu(), (UINT)mswpos, MF_BYPOSITION | MF_POPUP | MF_STRING, - (UINT)GetHmenuOf(menu), title) ) + (intptr_t)GetHmenuOf(menu), title) ) { wxLogLastError(wxT("InsertMenu")); } @@ -1191,7 +1191,7 @@ #else if ( !::InsertMenu(GetHmenu(), mswpos, MF_BYPOSITION | MF_POPUP | MF_STRING, - (UINT)GetHmenuOf(menu), title) ) + (intptr_t)GetHmenuOf(menu), title) ) { wxLogLastError(wxT("InsertMenu")); } @@ -1250,7 +1250,7 @@ } #else if ( !::AppendMenu(GetHmenu(), MF_POPUP | MF_STRING, - (UINT)submenu, title) ) + (intptr_t)submenu, title) ) { wxLogLastError(wxT("AppendMenu")); } diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/menuitem.cpp wxWidgets-2.8.12.patched/src/msw/menuitem.cpp --- wxWidgets-2.8.12/src/msw/menuitem.cpp 2011-03-22 20:00:54 +0800 +++ wxWidgets-2.8.12.patched/src/msw/menuitem.cpp 2011-04-07 12:37:02 +0800 @@ -186,9 +186,14 @@ // ---- // return the id for calling Win32 API functions -int wxMenuItem::GetRealId() const +WXWPARAM wxMenuItem::GetRealId() const { - return m_subMenu ? (int)m_subMenu->GetHMenu() : GetId(); + // we must use ids in unsigned short range with Windows functions, if we + // pass ids > USHRT_MAX to them they get very confused (e.g. start + // generating WM_COMMAND messages with negative high word of wParam), so + // use the cast to ensure the id is in range + return m_subMenu ? (intptr_t)m_subMenu->GetHMenu() + : static_cast(GetId()); } // get item state diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/pen.cpp wxWidgets-2.8.12.patched/src/msw/pen.cpp --- wxWidgets-2.8.12/src/msw/pen.cpp 2011-03-22 20:00:54 +0800 +++ wxWidgets-2.8.12.patched/src/msw/pen.cpp 2011-04-07 12:47:35 +0800 @@ -172,9 +172,9 @@ case wxSTIPPLE: logb.lbStyle = BS_PATTERN ; if (M_PENDATA->m_stipple.Ok()) - logb.lbHatch = (LONG)M_PENDATA->m_stipple.GetHBITMAP(); + logb.lbHatch = (intptr_t)M_PENDATA->m_stipple.GetHBITMAP(); else - logb.lbHatch = (LONG)0; + logb.lbHatch = (intptr_t)0; break; case wxBDIAGONAL_HATCH: logb.lbStyle = BS_HATCHED; diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/printdlg.cpp wxWidgets-2.8.12.patched/src/msw/printdlg.cpp --- wxWidgets-2.8.12/src/msw/printdlg.cpp 2011-03-22 20:00:54 +0800 +++ wxWidgets-2.8.12.patched/src/msw/printdlg.cpp 2011-04-07 12:51:01 +0800 @@ -175,10 +175,10 @@ wxWindowsPrintNativeData::~wxWindowsPrintNativeData() { - HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; + HGLOBAL hDevMode = (HGLOBAL) m_devMode; if ( hDevMode ) GlobalFree(hDevMode); - HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames; + HGLOBAL hDevNames = (HGLOBAL) m_devNames; if ( hDevNames ) GlobalFree(hDevNames); } @@ -190,8 +190,8 @@ bool wxWindowsPrintNativeData::TransferTo( wxPrintData &data ) { - HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; - HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames; + HGLOBAL hDevMode = (HGLOBAL) m_devMode; + HGLOBAL hDevNames = (HGLOBAL) m_devNames; if (!hDevMode) { @@ -396,8 +396,8 @@ bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data ) { - HGLOBAL hDevMode = (HGLOBAL)(DWORD) m_devMode; - HGLOBAL hDevNames = (HGLOBAL)(DWORD) m_devNames; + HGLOBAL hDevMode = (HGLOBAL) m_devMode; + HGLOBAL hDevNames = (HGLOBAL) m_devNames; WinPrinter printer; LPTSTR szPrinterName = (LPTSTR)data.GetPrinterName().wx_str(); @@ -493,7 +493,7 @@ else { hDevMode = pd.hDevMode; - m_devMode = (void*)(long) hDevMode; + m_devMode = (void*)(intptr_t) hDevMode; pd.hDevMode = NULL; // We'll create a new DEVNAMEs structure below. @@ -502,7 +502,7 @@ pd.hDevNames = NULL; // hDevNames = pd->hDevNames; - // m_devNames = (void*)(long) hDevNames; + // m_devNames = (void*)(intptr_t) hDevNames; // pd->hDevnames = NULL; } @@ -688,7 +688,7 @@ } // TODO: I hope it's OK to pass some empty strings to DEVNAMES. - m_devNames = (void*) (long) wxCreateDevNames(wxEmptyString, data.GetPrinterName(), wxEmptyString); + m_devNames = (void*) (intptr_t) wxCreateDevNames(wxEmptyString, data.GetPrinterName(), wxEmptyString); return true; } @@ -820,13 +820,13 @@ if (pd->hDevNames) GlobalFree(pd->hDevNames); - pd->hDevMode = (HGLOBAL)(DWORD) native_data->GetDevMode(); + pd->hDevMode = (HGLOBAL) native_data->GetDevMode(); native_data->SetDevMode( (void*) NULL); // Shouldn't assert; we should be able to test Ok-ness at a higher level //wxASSERT_MSG( (pd->hDevMode), wxT("hDevMode must be non-NULL in ConvertToNative!")); - pd->hDevNames = (HGLOBAL)(DWORD) native_data->GetDevNames(); + pd->hDevNames = (HGLOBAL) native_data->GetDevNames(); native_data->SetDevNames( (void*) NULL); @@ -897,9 +897,9 @@ if (native_data->GetDevMode()) { // Make sure we don't leak memory - GlobalFree( (HGLOBAL)(DWORD) native_data->GetDevMode() ); + GlobalFree( (HGLOBAL) native_data->GetDevMode() ); } - native_data->SetDevMode( (void*)(long) pd->hDevMode ); + native_data->SetDevMode( (void*)(intptr_t) pd->hDevMode ); pd->hDevMode = NULL; } @@ -909,9 +909,9 @@ if (native_data->GetDevNames()) { // Make sure we don't leak memory - GlobalFree((HGLOBAL)(DWORD) native_data->GetDevNames()); + GlobalFree((HGLOBAL) native_data->GetDevNames()); } - native_data->SetDevNames((void*)(long) pd->hDevNames); + native_data->SetDevNames((void*)(intptr_t) pd->hDevNames); pd->hDevNames = NULL; } diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/tbar95.cpp wxWidgets-2.8.12.patched/src/msw/tbar95.cpp --- wxWidgets-2.8.12/src/msw/tbar95.cpp 2011-03-22 20:00:54 +0800 +++ wxWidgets-2.8.12.patched/src/msw/tbar95.cpp 2011-04-07 12:53:09 +0800 @@ -802,8 +802,8 @@ TBREPLACEBITMAP replaceBitmap; replaceBitmap.hInstOld = NULL; replaceBitmap.hInstNew = NULL; - replaceBitmap.nIDOld = (UINT) oldToolBarBitmap; - replaceBitmap.nIDNew = (UINT) hBitmap; + replaceBitmap.nIDOld = (intptr_t) oldToolBarBitmap; + replaceBitmap.nIDNew = (intptr_t) hBitmap; replaceBitmap.nButtons = nButtons; if ( !::SendMessage(GetHwnd(), TB_REPLACEBITMAP, 0, (LPARAM) &replaceBitmap) ) @@ -832,7 +832,7 @@ { TBADDBITMAP addBitmap; addBitmap.hInst = 0; - addBitmap.nID = (UINT) hBitmap; + addBitmap.nID = (intptr_t) hBitmap; if ( ::SendMessage(GetHwnd(), TB_ADDBITMAP, (WPARAM) nButtons, (LPARAM)&addBitmap) == -1 ) { @@ -912,7 +912,7 @@ { const wxString& label = tool->GetLabel(); if ( !label.empty() ) - button.iString = (int)label.c_str(); + button.iString = (intptr_t)label.c_str(); } button.idCommand = tool->GetId(); diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/textctrl.cpp wxWidgets-2.8.12.patched/src/msw/textctrl.cpp --- wxWidgets-2.8.12/src/msw/textctrl.cpp 2011-03-22 20:00:54 +0800 +++ wxWidgets-2.8.12.patched/src/msw/textctrl.cpp 2011-04-07 12:54:27 +0800 @@ -960,7 +960,7 @@ // finally, stream it in the control EDITSTREAM eds; wxZeroMemory(eds); - eds.dwCookie = (DWORD)&wpc; + eds.dwCookie = (intptr_t)&wpc; // the cast below is needed for broken (very) old mingw32 headers eds.pfnCallback = (EDITSTREAMCALLBACK)wxRichEditStreamIn; @@ -1013,7 +1013,7 @@ EDITSTREAM eds; wxZeroMemory(eds); - eds.dwCookie = (DWORD)&data; + eds.dwCookie = (intptr_t)&data; eds.pfnCallback = wxRichEditStreamOut; ::SendMessage diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/thread.cpp wxWidgets-2.8.12.patched/src/msw/thread.cpp --- wxWidgets-2.8.12/src/msw/thread.cpp 2011-03-22 20:00:54 +0800 +++ wxWidgets-2.8.12.patched/src/msw/thread.cpp 2011-04-07 13:32:55 +0800 @@ -522,7 +522,7 @@ return (THREAD_RETVAL)-1; } - rc = (THREAD_RETVAL)thread->Entry(); + rc = (THREAD_RETVAL)(intptr_t)thread->Entry(); } wxCATCH_ALL( wxTheApp->OnUnhandledException(); ) @@ -842,7 +842,7 @@ break; } - if ( (DWORD)rc != STILL_ACTIVE ) + if ( (intptr_t)rc != STILL_ACTIVE ) break; // give the other thread some time to terminate, otherwise we may be @@ -1000,7 +1000,7 @@ // could we set all bits? if ( level != 0 ) { - wxLogDebug(_T("bad level %u in wxThread::SetConcurrency()"), level); + wxLogDebug(_T("bad level %Iu in wxThread::SetConcurrency()"), level); return false; } @@ -1162,7 +1162,7 @@ } #ifdef wxUSE_BEGIN_THREAD - _endthreadex((unsigned)status); + _endthreadex((unsigned)(intptr_t)status); #else // !VC++ ::ExitThread((DWORD)status); #endif // VC++/!VC++ diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/tooltip.cpp wxWidgets-2.8.12.patched/src/msw/tooltip.cpp --- wxWidgets-2.8.12/src/msw/tooltip.cpp 2011-03-22 20:00:54 +0800 +++ wxWidgets-2.8.12.patched/src/msw/tooltip.cpp 2011-04-07 13:12:26 +0800 @@ -106,7 +106,7 @@ uFlags |= TTF_TRANSPARENT; } - uId = (UINT)hwndOwner; + uId = (intptr_t)hwndOwner; } }; diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/toplevel.cpp wxWidgets-2.8.12.patched/src/msw/toplevel.cpp --- wxWidgets-2.8.12/src/msw/toplevel.cpp 2011-03-22 20:00:54 +0800 +++ wxWidgets-2.8.12.patched/src/msw/toplevel.cpp 2011-04-07 13:13:54 +0800 @@ -1122,7 +1122,7 @@ { // restore focus to the child which was last focused unless we already // have it - wxLogTrace(_T("focus"), _T("wxTLW %08x activated."), (int) m_hWnd); + wxLogTrace(_T("focus"), _T("wxTLW %p activated."), (intptr_t) m_hWnd); wxWindow *winFocus = FindFocus(); if ( !winFocus || wxGetTopLevelParent(winFocus) != this ) @@ -1157,9 +1157,9 @@ } wxLogTrace(_T("focus"), - _T("wxTLW %08x deactivated, last focused: %08x."), - (int) m_hWnd, - (int) (m_winLastFocused ? GetHwndOf(m_winLastFocused) + _T("wxTLW %p deactivated, last focused: %p."), + (intptr_t) m_hWnd, + (intptr_t) (m_winLastFocused ? GetHwndOf(m_winLastFocused) : NULL)); event.Skip(); diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/utils.cpp wxWidgets-2.8.12.patched/src/msw/utils.cpp --- wxWidgets-2.8.12/src/msw/utils.cpp 2011-03-22 20:00:54 +0800 +++ wxWidgets-2.8.12.patched/src/msw/utils.cpp 2011-04-07 13:14:32 +0800 @@ -713,7 +713,7 @@ return -1; } - wxON_BLOCK_EXIT1(::CloseHandle, hProcess); + wxON_BLOCK_EXIT1((WINBOOL (*)(void *))::CloseHandle, hProcess); bool ok = true; switch ( sig ) diff --strip-trailing-cr -Nur wxWidgets-2.8.12/src/msw/window.cpp wxWidgets-2.8.12.patched/src/msw/window.cpp --- wxWidgets-2.8.12/src/msw/window.cpp 2011-03-22 20:00:55 +0800 +++ wxWidgets-2.8.12.patched/src/msw/window.cpp 2011-04-07 13:17:11 +0800 @@ -2596,8 +2596,8 @@ // trace all messages - useful for the debugging #ifdef __WXDEBUG__ wxLogTrace(wxTraceMessages, - wxT("Processing %s(hWnd=%08lx, wParam=%8lx, lParam=%8lx)"), - wxGetMessageName(message), (long)hWnd, (long)wParam, lParam); + wxT("Processing %s(hWnd=%Ix, wParam=%Ix, lParam=%Ix)"), + wxGetMessageName(message), (intptr_t)hWnd, (intptr_t)wParam, (intptr_t)lParam); #endif // __WXDEBUG__ wxWindowMSW *wnd = wxFindWinFromHandle((WXHWND) hWnd); @@ -3438,7 +3438,7 @@ wxWindow *wxFindWinFromHandle(WXHWND hWnd) { - return (wxWindow*)wxWinHandleHash->Get((long)hWnd); + return (wxWindow*)wxWinHandleHash->Get((intptr_t)hWnd); } void wxAssociateWinWithHandle(HWND hWnd, wxWindowMSW *win) @@ -3452,20 +3452,20 @@ #ifdef __WXDEBUG__ if ( oldWin && (oldWin != win) ) { - wxLogDebug(wxT("HWND %X already associated with another window (%s)"), - (int) hWnd, win->GetClassInfo()->GetClassName()); + wxLogDebug(wxT("HWND %IX already associated with another window (%s)"), + (intptr_t) hWnd, win->GetClassInfo()->GetClassName()); } else #endif // __WXDEBUG__ if (!oldWin) { - wxWinHandleHash->Put((long)hWnd, (wxWindow *)win); + wxWinHandleHash->Put((intptr_t)hWnd, (wxWindow *)win); } } void wxRemoveHandleAssociation(wxWindowMSW *win) { - wxWinHandleHash->Delete((long)win->GetHWND()); + wxWinHandleHash->Delete((intptr_t)win->GetHWND()); } // ---------------------------------------------------------------------------- 3Depict-0.0.19/packaging/mingw-debian-cross/patches/cmake-toolchain640000644000175000017500000000140612640746376024676 0ustar pcuserpcuser# this one is important SET(CMAKE_SYSTEM_NAME Windows) #this one not so much SET(CMAKE_SYSTEM_VERSION 1) # specify the cross compiler #SET(CMAKE_CXX_COMPILER CXX_REPLACE) #SET(CMAKE_C_COMPILER C_REPLACE) SET(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) SET(CMAKE_RC_COMPILER /usr/bin/x86_64-w64-mingw32-windres) # where is the target environment #SET(CMAKE_FIND_ROOT_PATH PWD_REPLACE) SET(CMAKE_FIND_ROOT_PATH /home/pcuser/mingw64/) SET(ZLIB_LIBRARY -lz) SET(PNG_LIBRARY -lpng) # search for programs in the build host directories #SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # for libraries and headers in the target directories SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 3Depict-0.0.19/packaging/mingw-debian-cross/patches/ftgl-override-configure0000644000175000017500000000102112640746376026207 0ustar pcuserpcuser--- a/configure 2013-02-24 18:53:11.000000000 +0100 +++ b/configure 2013-02-23 13:07:55.000000000 +0100 @@ -22481,7 +22481,6 @@ int main () { -glBegin(GL_POINTS) ; return 0; } @@ -22544,11 +22543,10 @@ #ifdef __cplusplus extern "C" #endif -char glBegin (); -int +#include + int main () { -return glBegin (); ; return 0; } @@ -23014,11 +23011,10 @@ #ifdef __cplusplus extern "C" #endif -char gluNewTess (); -int +#include + int main () { -return gluNewTess (); ; return 0; } 3Depict-0.0.19/packaging/mingw-debian-cross/patches/cmake-toolchain320000644000175000017500000000152212640746376024670 0ustar pcuserpcuser# this one is important SET(CMAKE_SYSTEM_NAME Windows) #this one not so much SET(CMAKE_SYSTEM_VERSION 1) # specify the cross compiler #SET(CMAKE_CXX_COMPILER CXX_REPLACE) #SET(CMAKE_C_COMPILER C_REPLACE) SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc) SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) SET(CMAKE_RC_COMPILER /usr/bin/i686-w64-mingw32-windres) # where is the target environment #SET(CMAKE_FIND_ROOT_PATH PWD_REPLACE) SET(CMAKE_FIND_ROOT_PATH /home/pcuser/mingw32/) SET(ZLIB_LIBRARY -lz) SET(PNG_LIBRARY -lpng) set(CMAKE_SHARED_LINKER_FLAGS " -Wl,--no-undefined -L/home/pcuser/mingw32/lib/") # search for programs in the build host directories #SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # for libraries and headers in the target directories SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 3Depict-0.0.19/packaging/mingw-debian-cross/patches/configure-wxbool-patch0000644000175000017500000000105312640746376026052 0ustar pcuserpcuserdiff -r b625ea013cd8 configure --- a/configure Sat Nov 16 00:00:48 2013 +0100 +++ b/configure Sat Nov 16 00:01:50 2013 +0100 @@ -26629,7 +26629,7 @@ else wxUSE_LIBJPEG=sys - if test "$wxUSE_MSW" = 1; then + if test 0 = 1; then echo "$as_me:$LINENO: checking for boolean" >&5 echo $ECHO_N "checking for boolean... $ECHO_C" >&6 if test "${ac_cv_type_boolean+set}" = set; then 3Depict-0.0.19/packaging/mingw-debian-cross/patches/mathgl-disable-things0000644000175000017500000001314012716174467025633 0ustar pcuserpcuserdiff -r 5d7a3ac5d87d CMakeLists.txt --- a/CMakeLists.txt Sat Apr 23 01:11:46 2016 +0100 +++ b/CMakeLists.txt Sat Apr 23 01:14:12 2016 +0100 @@ -94,17 +94,17 @@ set(MGL_LIB_INSTALL_DIR "lib" CACHE STRING "Set library install directory") string(TIMESTAMP MGL_NIGHT "%d.%m.%y") -option(enable-double "Enable double precision in MathGL library" ON) -option(enable-mpi "Enable mpi" ON) -option(enable-opengl "Enable OpenGL support" ON) -option(enable-all-docs "Enable all documentation building") +option(enable-double "Enable double precision in MathGL library" OFF) +option(enable-mpi "Enable mpi" OFF) +option(enable-opengl "Enable OpenGL support" OFF) +option(enable-all-docs "Enable all documentation building" OFF) #option(enable-doc "Enable documentation building") option(enable-all "Enable all core features") -option(enable-all-widgets "Enable all Widgets") -option(enable-all-swig "Enable all SWIG based interfaces") +option(enable-all-widgets "Enable all Widgets" OFF) +option(enable-all-swig "Enable all SWIG based interfaces" OFF) option(enable-rvalue "Enable move constructor support (need C++11)" OFF) -option(enable-pthread "Enable POSIX threads support" ON) -option(enable-pthr-widget "Enable POSIX threads for widgets" ON) +option(enable-pthread "Enable POSIX threads support" OFF) +option(enable-pthr-widget "Enable POSIX threads for widgets" OFF) option(enable-openmp "Enable OpenMP support" OFF) if(enable-pthread AND enable-openmp) @@ -114,7 +114,7 @@ option(enable-lgpl "Enable only LGPL part of MathGL") option(enable-mgl2 "Use names 'libmgl2-*' instead of 'libmgl-*'") option(enable-ltdl "Enable loading modules support" ON) -CMAKE_DEPENDENT_OPTION(enable-doc-site "Enable HTML documentation for website" OFF "NOT enable-all-docs" ON) +CMAKE_DEPENDENT_OPTION(enable-doc-site "Enable HTML documentation for website" OFF "NOT enable-all-docs" O) CMAKE_DEPENDENT_OPTION(enable-doc-html "Enable HTML documentation" OFF "NOT enable-all-docs" ON) CMAKE_DEPENDENT_OPTION(enable-doc-info "Enable INFO documentation" OFF "NOT enable-all-docs" ON) CMAKE_DEPENDENT_OPTION(enable-doc-pdf-ru "Enable Russian PDF documentation" OFF "NOT enable-all-docs" ON) @@ -128,16 +128,16 @@ CMAKE_DEPENDENT_OPTION(enable-png "Enable png support" ON "NOT enable-all" ON) CMAKE_DEPENDENT_OPTION(enable-jpeg "Enable jpeg support" ON "NOT enable-all" ON) MGL_DEPENDENT_OPTION(enable-gsl "Enable gsl support" ON "NOT enable-lgpl" ON "NOT enable-all" ON) -MGL_DEPENDENT_OPTION(enable-hdf4 "Enable hdf4 support" ON "NOT enable-lgpl" ON "NOT enable-all" ON) -MGL_DEPENDENT_OPTION(enable-hdf5 "Enable hdf5 support" ON "NOT enable-lgpl" ON "NOT enable-all" ON) -CMAKE_DEPENDENT_OPTION(enable-pdf "Enable pdf support" ON "NOT enable-all" ON) -CMAKE_DEPENDENT_OPTION(enable-gif "Enable gif support" ON "NOT enable-all" ON) -CMAKE_DEPENDENT_OPTION(enable-glut "Enable glut support" ON "NOT enable-all-widgets" ON) -CMAKE_DEPENDENT_OPTION(enable-fltk "Enable fltk widget" ON "NOT enable-all-widgets" ON) -CMAKE_DEPENDENT_OPTION(enable-wx "Enable wxWidget widget" ON "NOT enable-all-widgets" ON) -CMAKE_DEPENDENT_OPTION(enable-qt4 "Enable Qt4 widget" OFF "NOT enable-all-widgets" ON) -CMAKE_DEPENDENT_OPTION(enable-qt5 "Enable Qt5 widget" ON "NOT enable-all-widgets" ON) -CMAKE_DEPENDENT_OPTION(enable-qt5asqt "Set Qt5 as default libmgl-qt" ON "enable-qt5" ON) +MGL_DEPENDENT_OPTION(enable-hdf4 "Enable hdf4 support" OFF "NOT enable-lgpl" OFF "NOT enable-all" OFF) +MGL_DEPENDENT_OPTION(enable-hdf5 "Enable hdf5 support" OFF "NOT enable-lgpl" OFF "NOT enable-all" OFF) +CMAKE_DEPENDENT_OPTION(enable-pdf "Enable pdf support" OFF "NOT enable-all" OFF) +CMAKE_DEPENDENT_OPTION(enable-gif "Enable gif support" OFF "NOT enable-all" OFF) +CMAKE_DEPENDENT_OPTION(enable-glut "Enable glut support" OFF "NOT enable-all-widgets" OFF) +CMAKE_DEPENDENT_OPTION(enable-fltk "Enable fltk widget" OFF "NOT enable-all-widgets" OFF) +CMAKE_DEPENDENT_OPTION(enable-wx "Enable wxWidget widget" OFF "NOT enable-all-widgets" OFF) +CMAKE_DEPENDENT_OPTION(enable-qt4 "Enable Qt4 widget" OFF "NOT enable-all-widgets" OFF) +CMAKE_DEPENDENT_OPTION(enable-qt5 "Enable Qt5 widget" OFF "NOT enable-all-widgets" OFF) +CMAKE_DEPENDENT_OPTION(enable-qt5asqt "Set Qt5 as default libmgl-qt" OFF "enable-qt5" OFF) if(UNIX AND enable-rvalue) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") @@ -149,11 +149,11 @@ set(QT_ENABLED ON) endif(enable-qt4 OR enable-qt5) -CMAKE_DEPENDENT_OPTION(enable-json-sample "Enable JSON sample" ON "QT_ENABLED" ON) -MGL_DEPENDENT_OPTION(enable-python "Enable python interface" ON "NOT enable-lgpl" ON "NOT enable-all-swig" ON) -MGL_DEPENDENT_OPTION(enable-lua "Enable Lua (v.5.1) interface" OFF "NOT enable-lgpl" ON "NOT enable-all-swig" ON) -MGL_DEPENDENT_OPTION(enable-octave "Enable octave interface" ON "NOT enable-lgpl" ON "NOT enable-all-swig" ON) -MGL_DEPENDENT_OPTION(enable-octave-install "Octave interface will install for all users" ON "NOT enable-lgpl" ON "NOT enable-all-swig" ON) +CMAKE_DEPENDENT_OPTION(enable-json-sample "Enable JSON sample" OFF "QT_ENABLED" OFF) +MGL_DEPENDENT_OPTION(enable-python "Enable python interface" OFF "NOT enable-lgpl" OFF "NOT enable-all-swig" OFF) +MGL_DEPENDENT_OPTION(enable-lua "Enable Lua (v.5.1) interface" OFF "NOT enable-lgpl" OFF "NOT enable-all-swig" OFF) +MGL_DEPENDENT_OPTION(enable-octave "Enable octave interface" OFF "NOT enable-lgpl" OFF "NOT enable-all-swig" OFF) +MGL_DEPENDENT_OPTION(enable-octave-install "Octave interface will install for all users" OFF "NOT enable-lgpl" OFF "NOT enable-all-swig" OFF) include_directories( ${MathGL_SOURCE_DIR}/include ${MathGL_BINARY_DIR}/include) set(MGL_INCLUDE_PATH "${CMAKE_INSTALL_PREFIX}/include/mgl2") 3Depict-0.0.19/packaging/mingw-debian-cross/patches/qhull-ptr.patch0000644000175000017500000000121512716174467024512 0ustar pcuserpcuserdiff -r ec21eff71acf src/libqhull_r/mem_r.h --- a/src/libqhull_r/mem_r.h Sun Apr 24 16:13:34 2016 +0100 +++ b/src/libqhull_r/mem_r.h Sun Apr 24 16:15:10 2016 +0100 @@ -88,13 +88,7 @@ Qhull uses int instead of size_t except for system calls such as malloc, qsort, qh_malloc, etc. This matches Qt convention and is easier to work with. */ -#if (defined(__MINGW64__)) && defined(_WIN64) typedef long long ptr_intT; -#elif (_MSC_VER) && defined(_WIN64) -typedef long long ptr_intT; -#else -typedef long ptr_intT; -#endif /*---------------------------------- 3Depict-0.0.19/packaging/mingw-debian-cross/patches/wx-config-sysroot.patch0000644000175000017500000000130712640746376026205 0ustar pcuserpcuser--- wx-config 2013-02-23 15:56:01.000000000 +0100 +++ ./wx-config-fixed 2013-02-23 15:08:17.000000000 +0100 @@ -900,12 +900,13 @@ # delegate out to anything in that prefix, then reset the build # tree prefix to provide the correct output for using this # uninstalled wx build. Or put more simply: +sysroot=REPLACE_BASENAME prefix=${this_prefix-$prefix} exec_prefix=${this_exec_prefix-$exec_prefix} -includedir="${prefix}/include" -libdir="${exec_prefix}/lib" -bindir="${exec_prefix}/bin" +includedir="${sysroot}${prefix}/include" +libdir="${sysroot}${exec_prefix}/lib" +bindir="${sysroot}${exec_prefix}/bin" # Trivial queries we can answer now. [ -z "$output_option_prefix" ] || echo $prefix 3Depict-0.0.19/packaging/mingw-debian-cross/patches/mathgl-fix-pthread-and-linking0000644000175000017500000000317412716174467027350 0ustar pcuserpcuserdiff -r 9fbd31e8af49 CMakeLists.txt --- a/CMakeLists.txt Sun Sep 20 14:25:16 2015 +0100 +++ b/CMakeLists.txt Sun Sep 20 14:26:23 2015 +0100 @@ -12,9 +12,9 @@ set(MathGL_VERSION_MINOR 2.2) set(MathGL_SOVERSION 7.2.0) -set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,relro") -set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro") +set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -lpng") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -lpng") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpng") MACRO(MGL_DEPENDENT_OPTION option doc default depends1 force1 depends2 force2) IF(${option}_ISSET MATCHES "^${option}_ISSET$") @@ -61,7 +61,7 @@ set(MGL_LIB_INSTALL_DIR "lib" CACHE STRING "Set library install directory") -option(enable-double "Enable double precision in MathGL library" OFF) +option(enable-double "Enable double precision in MathGL library" ON) option(enable-simple "Slightly increase drawing speed but disable mglDataA class") option(enable-mpi "Enable mpi" OFF) option(enable-opengl "Enable OpenGL support" OFF) @@ -70,7 +70,7 @@ option(enable-all "Enable all core features") option(enable-all-widgets "Enable all Widgets" OFF) option(enable-all-swig "Enable all SWIG based interfaces" OFF) -option(enable-pthread "Enable POSIX threads support" ON) +option(enable-pthread "Enable POSIX threads support" OFF) option(enable-openmp "Enable OpenMP support" OFF) option(enable-lgpl "Enable only LGPL part of MathGL") option(enable-mgl2 "Use names 'libmgl2-*' instead of 'libmgl-*'") 3Depict-0.0.19/packaging/mac/0000755000175000017500000000000012716174467015163 5ustar pcuserpcuser3Depict-0.0.19/packaging/mac/1compile.sh0000755000175000017500000000072212640746376017234 0ustar pcuserpcuser#!/bin/sh cp makeMacOSXApp ../.. cp -R 3Depict.app ../.. cd ../.. time ./makeMacOSXApp --update-config=yes --parallel=no --debug=yes > out.txt 2>&1 #check compile OK if [ $? -eq 0 ] ; then echo "Finished compiling" else echo "Failed" vi out.txt exit 1 fi time ./3Depict.app/Contents/MacOS/3Depict -t > out2.txt 2>&1 #Check return value from debug if [ $? -eq 0 ] ; then echo "Finished testing" else echo "Failed" vi out2.txt exit 1 fi 3Depict-0.0.19/packaging/mac/makeMacOSXApp0000755000175000017500000000452512716174467017510 0ustar pcuserpcuser#!/bin/bash # #This is configured to be specific to the mac build machine. # Do not assume that this will work on any given mac system export PATH=/opt/local/bin:$PATH:/opt//local/Library/Frameworks/wxWidgets.framework/Versions/wxWidgets/3.0/bin #This will make the mac .app bundle if [ $1 = '--update-config=yes' ]; then echo "Updating configuration files" if [ $2 = '--parallel=yes' ]; then echo "Building parallel" SHOULD_PARALLEL="--enable-openmp-parallel" fi if [ $3 = '--debug=no' ]; then echo "Building debug off" DISABLE_DEBUG="--disable-debug-checks" fi CFLAGS="$CFLAGS -I/opt/local/include " \ LDFLAGS="$LDFLAGS -L/opt/local/lib " \ CXXFLAGS="$CXXFLAGS -std=c++11 -D_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_ -I/opt/local/include " \ ./configure $SHOULD_PARALLEL $DISABLE_DEBUG if [ $? -ne 0 ]; then echo "Configure unsuccessful - exiting" exit 1 fi make clean fi read -p "have you changed the makefile?" yn CFLAGS="$CFLAGS -I/opt/local/include " \ LDFLAGS="$LDFLAGS -L/opt/local/lib " \ CXXFLAGS="$CXXFLAGS -std=c++11 -D_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_ -I/opt/local/include " \ make -j8 if [ $? -ne 0 ]; then echo "Make unsuccessful - exiting" exit 1 fi fi echo "Updating .app bundle..." mkdir -p ./3Depict.app/Contents/MacOS/ mkdir -p ./3Depict.app/Contents/Resources/textures/ mkdir -p ./3Depict.app/Contents/libs/ cp ./src/3Depict ./3Depict.app/Contents/MacOS/3Depict cp data/textures/tex-source/3Depict-icon.icns ./3Depict.app/Contents/Resources/3Depict-icon.icns touch ./3Depict.app/Contents/PkgInfo touch ./3Depict.app/Contents/Info.plist #copy all information from data folder cp ./data/* ./3Depict.app/Contents/Resources/ #Update gettext translation #---- echo "Updating translation files..." cd ./translations;./makeTranslations;cd .. for i in `ls ./translations/3Depict_*.mo` do j=`echo $i | sed 's/.\/translations\/3Depict_//' | sed 's/.mo//'` mkdir -p ./3Depict.app/Contents/Resources/$j/LC_MESSAGES/ cp $i ./3Depict.app/Contents/Resources/$j/LC_MESSAGES/3Depict.mo echo "$i $j" done #---- # relabel libraries for packaging if [ x`which dylibbundler` == x"" ] ; then echo "dyllibbundler command does not appear to be available. Package built, but cannot relabel libaries to use in-package versions" exit 1 fi dylibbundler -od -b -x ./3Depict.app/Contents/MacOS/3Depict -d ./3Depict.app/Contents/libs echo "Done" 3Depict-0.0.19/packaging/mac/2compile.sh0000755000175000017500000000060712640746376017237 0ustar pcuserpcuser#!/bin/bash cp makeMacOSXApp ../.. cp -R 3Depict.app ../.. cd ../.. time ./makeMacOSXApp --update-config=no > out.txt 2>&1 if [ $? -eq 0 ] ; then echo "Finished compiling" else echo "Failed" vi out.txt exit 1 fi time ./3Depict.app/Contents/MacOS/3Depict -t > out2.txt 2>&1 if [ $? -eq 0 ] ; then echo "Finished testing" else echo "Failed" vi out2.txt exit 1 fi 3Depict-0.0.19/packaging/mac/3Depict.app/0000755000175000017500000000000012640746376017235 5ustar pcuserpcuser3Depict-0.0.19/packaging/mac/3Depict.app/Contents/0000755000175000017500000000000012640746376021032 5ustar pcuserpcuser3Depict-0.0.19/packaging/mac/3Depict.app/Contents/PkgInfo0000644000175000017500000000001012640746376022301 0ustar pcuserpcuserAPPL????3Depict-0.0.19/packaging/mac/3Depict.app/Contents/Info.plist0000644000175000017500000000316012640746376023002 0ustar pcuserpcuser BuildMachineOSBuild 13A603 CFBundleDevelopmentRegion en CFBundleExecutable 3Depict CFBundleIconFile 3Depict-icon CFBundleIdentifier net.sourceforge.threedepict.-Depict CFBundleInfoDictionaryVersion 6.0 CFBundleName 3Depict CFBundlePackageType APPL CFBundleShortVersionString BUNDLE_VERSION CFBundleSignature ???? CFBundleVersion BUNDLE_VERSION DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild 5A3005 DTPlatformVersion GM DTSDKBuild 13A595 DTSDKName macosxMAC_OS_VER DTXcode 0502 DTXcodeBuild 5A3005 LSMinimumSystemVersion MAC_OS_VER NSHumanReadableCopyright 3Depict Copyright (C) 2011 3Depict team This program comes with ABSOLUTELY NO WARRANTY This is free software, and you are welcome to redistribute it under certain conditions NSMainNibFile MainMenu NSPrincipalClass NSApplication 3Depict-0.0.19/packaging/mac/3Depict.app/Contents/Resources/0000755000175000017500000000000012640746376023004 5ustar pcuserpcuser3Depict-0.0.19/packaging/mac/3Depict.app/Contents/Resources/Base.lproj/0000755000175000017500000000000012640746376025003 5ustar pcuserpcuser3Depict-0.0.19/packaging/mac/3Depict.app/Contents/Resources/Base.lproj/MainMenu.nib0000644000175000017500000010475112640746376027216 0ustar pcuserpcuserbplist00OPX$versionX$objectsY$archiverT$top#$*/IJRSTYZbcghilp  $)*+,-29>CDEFJQUZ[\]^binopqrv}',-./3:?@ABFMQVWXY]dijklpw{ #()*+,08=>?@AELQRSTUYafghijnuz{|}~    !%,12349@EJKLOPQV]bcdefkrwxyz{   ")./015<ABCDHOTUVW[bfklmnry~    !%,12348?DEFGKRWXYZ^ejklmqx}~ $%&'+26;<=>BINOPQU\abcdhotuvw{NSXYZdqvwxy~       % & ' + , 5 > H M N O P U V h q z       ! " # $ ) * + 0 : ? @ A B F K L M R \ a b c d i j }        & / 9 > ? @ A F G H T \ a b c l t y z { r5D^abcdefghHijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFILU$null VNSRoot]NSConnections\NSOidsValues_NSObjectsValues]NSObjectsKeys_NSAccessibilityOidsValues_NSVisibleWindows_NSAccessibilityOidsKeys_NSAccessibilityConnectorsV$classZNSOidsKeys.,P- !"[NSClassName]NSApplication%&'(Z$classnameX$classes^NSCustomObject')XNSObject+,.ZNS.objects-0123456789:;<=>?@ABCDEF=H\NSWindowRect_NSUserInterfaceItemIdentifierYNSMaxSize]NSWindowTitle\NSWindowView_NSWindowIsRestorable\NSScreenRect_NSWindowBackingYNSWTFlags]NSWindowClass[NSViewClass_NSWindowStyleMask tx _{{335, 390}, {480, 360}}KLMNOPQYNS.stringUNSDevUNSKey W3Depict Y371.titleW3Depict%&UV_NSLocalizableStringWX)_NSLocalizableStringXNSStringXNSWindow[\]=_`a_NSNextResponder[NSFrameSizeXNSvFlagsZ{480, 360}%&deVNSViewdf)[NSResponder_{{0, 0}, {2560, 1418}}_ {10000000000000, 10000000000000}%&jk_NSWindowTemplatej)%&mn\NSMutableSetmo)UNSSet+qǯUrstuvwxyz{|}~ƀ,3:BIPW^ekryƀ̀Ԁ܀ &,2;BIPW^ekqx~ÁɁρՁہ $+17=CIOXNSSource]NSDestinationWNSLabel "[AppDelegateXdelegate%&_NSNibOutletConnector)^NSNibConnector-πVwindow*+]NSMnemonicLocVNSMenu_NSKeyEquivModMaskYNSOnImageZNSKeyEquivWNSTitle\NSMixedImage)#"'[NSMenuItemsVNSNameq KLMN _Bring All to Front! W5.title_Bring All to FrontP ^NSResourceName$&%WNSImage_NSMenuCheckmark%&  _NSCustomResource ) $&(_NSMenuMixedState%&ZNSMenuItem)_arrangeInFront:%&_NSNibControlConnector)^NSNibConnector-2+!")#1.'KLMN&'( XMinimize0/X23.titleXMinimizeQm_performMiniaturize:.049+47)5#"6';<=q^[tKLMN@AB ]About 3Depict87X58.title]About 3Depict_orderFrontStandardAboutPanel:GH;A+KNO<)#@='RSz|qKLMNWXY eOpen &?>X72.titleeOpen &Qo]openDocument:_`CH+Kfg<)#GD'KLMNklm UCloseFEX73.titleUCloseQw]performClose:stJO+Kz{<)#NK'KLMN eSave &MLX75.titleeSave &Qs]saveDocument:QV+K<)#UR'KLMN ]Page Setup...TSX77.title]Page Setup...QP^runPageLayout:X]+K<)#\Y'KLMN fPrint &[ZX78.titlefPrint &QpVprint:_d+K<)#c`'KLMN SNewbaX82.titleSNewQn\newDocument:fj+K)<#"g'KLMNҀ _Revert to SavedihY112.title_Revert to Saved_revertDocumentToSaved:lq+m)#"n'qKLMN ZClear MenupoY126.titleZClear Menu_clearRecentDocuments:sx+45)#wt'KLMN \Hide 3DepictvuY134.title\Hide 3DepictQhUhide:z+4  5)#~{'KLMN \Quit 3Depict}|Y136.title\Quit 3DepictQq "]NSApplicationZterminate: +4!%5)#w'KLMN)*+ [Hide OthersY145.title[Hide Others_hideOtherApplications:01 +485)#"'KLMN<=> XShow AllY150.titleXShow All_unhideAllApplications:CD‏+GK򀐀)#"'NOqKLMNSTU ]Stop SpeakingY195.title]Stop Speaking]stopSpeaking:Z[‖+Gb򀐀)#"'KLMNfgh ^Start SpeakingY196.title^Start Speaking^startSpeaking:mn“+qtu򀝀)#'xyqKLMN}~ TCopyY197.titleTCopyQcUcopy:․+q򀝀)#'KLMN ZSelect AllY198.titleZSelect AllQaZselectAll:‫+q򀝀)#'KLMN SCutY199.titleSCutQxTcut:′+򀳀)#'qKLMN _Check Document NowY201.title_Check Document NowQ;^checkSpelling:›+q򀝀)#"'KLMNӀ VDeleteY202.titleVDeleteWdelete:ŀ+q򀝀)#Ā'KLMN UPasteÀY203.titleUPasteQvVpaste:ǀ̀+򀳀)#ˀȀ'KLMN _Show Spelling and GrammarʀY204.title_Show Spelling and GrammarQ:_showGuessPanel:΀Ӏ+q򀝀)#Ҁπ'KLMN   TUndoрY207.titleTUndoQzUundo:Հۀ+DUNSTagր)#ڀ׀' !qKLMN%&' YFind NextـY208.titleYFind NextQg_performFindPanelAction:-.݀+456ր)#ހ'KLMN:;< eFind &Y209.titleeFind &Qf_performFindPanelAction:BC+IJր)#'KLMNNOP _Jump to SelectionY210.title_Jump to SelectionQj_centerSelectionInVisibleArea:VW+]^_ր)#'KLMNcde ]Find PreviousY213.title]Find PreviousQG_performFindPanelAction:kl+qrs򀝀)#'KLMNwxy TRedoY215.titleTRedoQZUredo:+򀳀)#"'KLMN _Check Spelling While TypingY219.title_Check Spelling While Typing_toggleContinuousSpellChecking:+ր)#'KLMN _Use Selection for FindY221.title_Use Selection for FindQe_performFindPanelAction: +)#"'KLMN TZoom Y239.titleTZoom\performZoom: +! )#'qKLMǸ \Show ToolbarY297.title\Show ToolbarQt_toggleToolbarShown:+ )#"'KLMN oCustomize Toolbar &Y298.titleoCustomize Toolbar &_runToolbarCustomizationPalette:+򀳀)#"'KLMN _Check Grammar With SpellingY346.title_Check Grammar With Spelling_toggleGrammarChecking: %+45!)#"'qKLMN  _Smart Copy/Paste$#Y350.title_Smart Copy/Paste_toggleSmartInsertDelete:'++D!)#ځ('KLMN \Smart Quotes*)Y351.title\Smart Quotes_!toggleAutomaticQuoteSubstitution:"#-1+]^*!)#.'KLMN./0 [Smart Links0/Y354.title[Smart Links_toggleAutomaticLinkDetection:56738:+:>4)#5'BCDqӁсKLMNGHI ZShow Fonts76Y389.titleZShow Fonts M"9]NSFontManager_orderFrontFontPanel:R6T<8A+:ZD[4)#@='KLMN_`a TBold?>Y390.titleTBoldQb]addFontTrait:g6iC8H+:o5p4)#GD'KLMNtuv VItalicFEY391.titleVItalicQi]addFontTrait:|}JO+:4)#NK'KLMN YUnderlineMLY392.titleYUnderlineQuZunderline:6Q8V+:^4)#UR'KLMN VBiggerTSY394.titleVBiggerQ+[modifyFont:6X8]+:4)#\Y'KLMN WSmaller[ZY395.titleWSmallerQ-[modifyFont:_d+:4)#c`'KLMNɀ [Show ColorsbaY401.title[Show ColorsQC_orderFrontColorPanel:fj+:!t4)#g'KLMN݀ ZCopy StyleihY403.titleZCopy StyleYcopyFont:lp+:!4)#ām'KLMN [Paste StyleonY404.title[Paste StyleZpasteFont:rw+)s#"t'qKLMN [Use DefaultvuY406.title[Use DefaultYunscript:  y}+)s#"z'KLMN [Superscript|{Y407.title[Superscript\superscript: +')s#"'KLMN+,- YSubscriptY408.titleYSubscriptZsubscript:23+:)s#"'KLMN>?@ URaiseY409.titleURaise^raiseBaseline:EF+M)s#"'KLMNQRS ULowerY410.titleULower^lowerBaseline:XY+]`)#"'cdqKLMNhij [Use DefaultY412.title[Use Default_useStandardLigatures:op+]w)#"'KLMN{|} XUse NoneY413.titleXUse None_turnOffLigatures:+])#"'KLMN WUse AllY414.titleWUse All_useAllLigatures:+)#"'ہށqKLMN [Use DefaultY416.title[Use Default_useStandardKerning:+)#"'KLMN XUse NoneY417.titleXUse None_turnOffKerning:+)#"'KLMǸ WTightenY418.titleWTighten_tightenKerning:+)#"'KLMN VLoosenY419.titleVLoosen^loosenKerning:€+)#"'qKLMN _Make Upper CaseY452.title_Make Upper Case^uppercaseWord:āȀ+)#"ŀ'KLMN  _Correct Spelling AutomaticallyǁY454.title_Correct Spelling Automatically_"toggleAutomaticSpellingCorrection:ʁ΀+)!#"ˀ'KLMN _Show SubstitutionśY457.title_Show Substitutions_orderFrontSubstitutionsPanel:"#ЁԀ+*)!#"р'KLMN./0 \Smart DashesӁY460.title\Smart Dashes_ toggleAutomaticDashSubstitution:56ցڀ+=)!#"׀'KLMNABC _Text ReplacementفY462.title_Text Replacement_toggleAutomaticTextReplacement:HI܁+P)#"݀'KLMNTUV _Make Lower Case߁Y465.title_Make Lower Case^lowercaseWord:[\+c)#"'KLMNghi ZCapitalizeY466.titleZCapitalize_capitalizeWord:no+q!uv򀝀)#'KLMNz{| _Paste and Match StyleY485.title_Paste and Match StyleQV_pasteAsPlainText:+)#'q(&)KLMN \3Depict HelpY492.title\3Depict HelpQ?YshowHelp:+)#'qKLMN ZAlign LeftY498.titleZAlign LeftQ{ZalignLeft:+)#'KLMN VCenterY499.titleVCenterQ|\alignCenter: +)#"'KLMNՀ WJustify Y500.titleWJustify_alignJustified: +)# 'KLMN [Align RightY501.title[Align RightQ}[alignRight:+)#"'KLMN ZShow RulerY505.titleZShow Ruler\toggleRuler:+t )#'KLMN ZCopy RulerY506.titleZCopy RulerZcopyRuler:#+)#ā 'KLMN!"# [Paste Ruler"!Y507.title[Paste Ruler[pasteRuler:()%*+-0)&#"''34qKLMN89: X Default)(Y510.titleX Default_ makeBaseWritingDirectionNatural:?@,0+-G)&#"-'KLMNKLM ^ Left to Right/.Y511.title^ Left to Right_$makeBaseWritingDirectionLeftToRight:RS26+-Z)&#"3'KLMN^_` ^ Right to Left54Y512.title^ Right to Left_$makeBaseWritingDirectionRightToLeft:ef8<+-m)&#"9'KLMNqrs X Default;:Y515.titleX Default_ makeTextWritingDirectionNatural:xy>B+-)&#"?'KLMN ^ Left to RightA@Y516.title^ Left to Right_$makeTextWritingDirectionLeftToRight:DH+-)&#"E'KLMN ^ Right to LeftGFY517.title^ Right to Left_$makeTextWritingDirectionRightToLeft:JN+!4ր)# K'KLMN oFind and Replace &MLY534.titleoFind and Replace &_performFindPanelAction:%&^NSMutableArray)WNSArray+M4.0KG_sqkmn-VB""5H[GZC:5Rg| ]Xo 2E!#&,--/(?R34ex8<@DF-@6QV54_afglrsszu<_;}mlCJfQX΀耺ր݁JՀǀā!ʁ 'Ё-ց܁ǁ́43<CJԁQXՁց߁sry_fl &%,2  8>D  -! 8+PQRqUR*KLMNUVW YAMainMenuTSX29.titleYAMainMenu+[ǧ<@FVu!Oefg44noXNSTargetYNSSubmenuXNSActionQ)#"55WZ'KLMNstu W3DepictYXX56.titleW3Depict^submenuAction:KLMN{|} W3Depict]\X57.titleW3Depict+ǫ.04_afgrsszO4AA]NSIsSeparator\NSIsDisabled5) #` `'P45)#eb'KLMN lPreferences &dcY129.titlelPreferences &Q,4AA5) #` `'efg45)#"llhk'KLMN XServicesjiY131.titleXServices^submenuAction:ȁqompKLMǸ XServicesjnY130.title+ǠO__NSServicesMenu%&VNSMenu)4AA5) #` `'4AA5) #` `'\_NSAppleMenuefgKKQ)#"<<vy'KLMN TFilexwX83.titleTFile^submenuAction:KLMN TFilex{X81.title+ ǪG_s_;}CJfQXOefgK  <)#"mm~'KLMN    [Open RecentY124.title[Open Recent^submenuAction:KLMN " # $ [Open RecentY125.title[Open Recent+ (ǡ׀lO__NSRecentDocumentsMenuKAA<) #` `'KAA<) #` `'efgqq E FQ)#"'KLMN J K L TEditY217.titleTEdit^submenuAction:KLMN R K T TEditY205.title+ Wǯkmn΀耺OqAA򀝀) #` `'qAA򀝀) #` `'efgq 򀝀)#"րց'KLMN TFindY218.titleTFind^submenuAction:KLMN TFindY220.titleTFind+ Ǧ-VB݁JՀOefgq 򀝀)#"'KLMN _Spelling and GrammarY216.title_Spelling and Grammar^submenuAction:KLMN _Spelling and GrammarY200.title_Spelling and Grammar+ ǦǀāOAA򀳀)# ` `'efgq 򀝀)#"!!'KLMN Հ ]SubstitutionsY348.title]Substitutions^submenuAction:KLMN ݀ ]SubstitutionsY349.title]Substitutions+ ǧ""5ʁ 'Ё-ցOAA!)# ` `'efgq 򀝀)#"'KLMN  _TransformationsY450.title_Transformations^submenuAction:KLMN   _TransformationsY451.title_Transformations+ ǣH[܁OefgqGG  򀝀)#"'KLMN   VSpeechY211.titleVSpeech^submenuAction:KLMN & ' ( VSpeechY212.titleVSpeech+ ,ǢZCOefg 7 8Q)#"ǁǁÁƀ'KLMN < = > VFormatŁY375.titleVFormat^submenuAction: C DȁˁqKLMN H I J VFormatʁY376.titleVFormat+ NǢ&́Oefg:: Y Zǀ)#"44́Ѐ'KLMN ^ _ ` TFontρY377.titleTFont^submenuAction:KLMN f _ h TFontρY388.title+ kǯ5Rg| !#3<CJԁQXՁց߁_flO:AA4)# ` `':AA4)# ` `'efg: 4)#"ׁڀ'KLMN TKernفY397.titleTKern^submenuAction:KLMN TKern݁Y415.titleTKern+ ǤҁOefg:]] 4)#"'KLMN YLigaturesY398.titleYLigatures^submenuAction:KLMN ŀ YLigaturesY411.title+ ǣXoOefg: 4)#"ss'KLMN ۀ XBaselineY399.titleXBaseline^submenuAction:KLMN XBaselineY405.titleXBaseline+ ǥ 2EryO:AA4)# ` `':AA4)# ` `'[_NSFontMenuefg  ǀ)#"'KLMN   TTextY496.titleTText^submenuAction:KLMN    TTextY497.title+ Ǫ,-8 OAA)# ` `'efg-- 6 7)#"&&'KLMN ; < = _Writing DirectionY503.title_Writing Direction^submenuAction:KLMN C D E _Writing DirectionY508.title_Writing Direction+ Iǩ/(?R34ex%,2  8>DO-A Z&)#" 'KLMN ^ _ ` YParagraphY509.titleYParagraph-AA&)# ` `'-A r&)#"  'KLMN v w x YSelection  Y514.titleYSelectionAA)# ` `'efg Q)#"  'KLMN TViewY295.titleTView^submenuAction:KLMN TViewY296.title+ Ǣҁ Oefg Q)#"'KLMN VWindowX19.titleVWindow^submenuAction:KLMN VWindowX24.title+ ǤD-OAA) #` `'^_NSWindowsMenuefg Q)#""%'KLMN ؀ THelp$#Y490.titleTHelp^submenuAction:KLMN THelp$'Y491.title+ ǡO[_NSHelpMenu[_NSMainMenu%& )+ M44444444444KKKKKKKKKKqqqqqqqqqqqqqqqGG::::::::::]]]::::::&----------<@F-QV55555g555555Qu<<<}m<<<<<<<Qրրրրրր!!!!!!!Qǁ́444444444ց4߁4sssss44444ǁ&&&&&&&&&Q  QQ!++ M4.0KG_sqkmn-VB""5H[GZC:5Rg| ]Xo 2E!#&,--/(?R34ex8<@DF-@6rstuvwxyz{|}~ƀQV54_afglrsszu<_;}mlCJfQX΀耺ր݁JՀǀā!ʁ 'Ё-ց܁ǁ́43<CJԁQXՁց߁sry_fl &%,2  8>D  -! 8,3:BIPW^ekryƀ̀Ԁ܀ &,2;BIPW^ekqx~ÁɁρՁہ $+17=CI++ sM t u v w x y z { | } ~        !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÁāŁƁǁȁɁʁˁ́́΁ρЁсҁӁԁՁցׁ؁فځہ܁݁ށ߁     +     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~+GǠO+JM+%&MN^NSIBObjectDataM)_NSKeyedArchiverQR]IB.objectdata"+5:?  # = Y ` k m o r u x { }    : G g q          1 B L R X Z b d f p x      " ) 5 N q z k m o q s u w y { }    !$'*-0369<?BEHK\es{}  /=DXbmu.024<NWjo|~ +-/1357HJSUW`ik<IKMOprtvxz| )+135>DFTaceg02@BDM[]ly{}#%')+-/@BFHJSWYfsuwy 468:<>@QTWZ]np{} ')/@BDFHikmoqsu .0<>@JVo|~  /13579;HKNQbdrtv *79;=^`bdfhjwz}*,7DFHJkmoqsuw%')3HJYfhjl  !#)+-7=?FSUWYz|~')+-/13DFKMOY^`fsuwy$&(*OQSUWY[]np{}      % 9 ; [ h j l n !! ! ! !.!0!2!4!6!8!:!K!M!R!T!V!`!e!g!m!z!|!~!!!!!!!!!!!!!!" "+"8":"="?"d"f"h"j"m"o"r"t"""""""""""""####!###&#(#9#;#@#C#F#P#U#b#o#r#u#w###################$$$"$%$'$H$K$M$O$Q$T$V$g$i$$$$$$$$$$%%!%#%%%'%*%,%=%?%]%`%c%m%%%%%%%%%%%%%%%%&&&&(&+&.&8&K&f&s&v&y&{&&&&&&&&&&&&&&''''"'$'I'L'N'P'R'U'W'h'j'v'y'|'''''''''''''''((((((,(.(9(<(?(I(T(](`(b(p((((((((((((((((((())))%)()+).)0)U)X)Z)\)_)b)d)u)w)~)))))))))))))))))))** * **!*#*.*?*B*E*H*J*o*r*t*v*y*|*~***************+++++ + ++ +"+*+-+0+:+B+D+P+]+`+c+e++++++++++++++++++++, ,#,%,',),,,.,?,A,L,O,R,\,g,q,~,,,,,,,,,,,,,,,,,,-- -----/-2-4-6-9-;-H-K-N-Q-b-d-p-s-v-------------------....+...1.3.P.R.U.W.Y.\.^.o.q.{.~..................../ ///+/./1/3/P/R/U/W/Y/\/^/o/q/w/z/}//////////////////000000!0-0E0R0U0X0Z0w0y0|0~00000000000000011111 1 111!1)1,1/191A1T1a1d1g1i111111111111111111122 222-2/222426292;2L2N2W2Z2]2g2p222222222222222222233333393;3>3@3B3E3G3X3Z3a3d3g3q3x33333333333333333344444$434@4C4F4H4e4g4i4k4m4p4r444444445 5 555.505355575:5<5M5O5d5g5j5t5555555555555556 6 666&6I6V6Y6\6^6{6}66666666666667777 7&7(7+7-7/72747E7G7Y7\7_7i7{777777777777777777888"8%8(8*8K8M8O8Q8T8W8Y8j8l8888888888888889999999!9$95979D9G9J9T9a9c9m9z9}9999999999999999999::::::!:#:D:G:I:K:N:Q:S:d:f:m:p:s:}::::::::::::::::::::;;;%;(;+;-;N;Q;S;U;X;[;];n;p;|;;;;;;;;;;;;;;;;;;;<<< <<<,<9<<>>>$>&>)>+>->0>2>C>E>T>W>Z>d>s>>>>>>>>>>>>>>>>?? ??B?O?R?U?W?t?v?y?{?}??????????????@ @@@@@@@+@-@<@?@B@L@[@@@@@@@@@@@@@@@@@@AA*A7A:A=A?AdAfAhAjAlAnAqAsAAAAAAAABBBB!B*CYC[C^CaCcCeChCkCnCqCtCwCyC{C}CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDD DDDDDDDD D#D&D)D,D/D2D5D8D;D>DADDDGDJDMDPDSDVDYD\D_DbDeDhDkDnDqDtDwDzD}DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEEE E EE E"E,E/E2E;EEENE]E`EcEfEiElEoErEuEEEEEEEEEEEEEEEEEEEFFF%F'F/F2F5F>FFFOFfFhFkFnFqFtFwFyF{F}FFFFFFFFFFFFFFFFFFGGGG GGG5G8G;GEG^G`GGGGGGGGGGGGGGGGGGGGGGGGHHH H1H4H7H:H=HNHPHYH\H_HiHrHsHvHHHHHHHHHHHHHHIIIII I I IIIIILINIPIRITIVIYI\I^IoIqIvIyI|IIIIIIIIIIIIIIIIIIIIIIJ%J'J)J+J-J/J1J4J7J9JJJLJXJ[J^JhJtJJJJJJJJJJJJJKKKKKKKKK!KJKLKNKOKQKTKUKXKZKKKKKKKKKKKKKKKKKKKKKKKLL L*L,L.L1L3L5L7L:LLALDLGLJLMLPLSL|L~LLLLLLLLLLLLLLLLLLLLLLLMMMMMMM!M$M.M3MBMSMUMZM]M`MjMoMxMMMMMMMMMMMMMMMMMMMMNNNNN'N6NGNIN`NcNfNpNNNNNNNNNNNNNNNNNNNOOOOOOOO"O%O'O8O:OHOKONOXOfOuOOOOOOOOOOOOOOOOOP P PPPPPPPPCPEPGPIPKPNPQPTPWPYPjPlP~PPPPPPPPPPPPPQQ Q QQQ?QAQCQEQGQIQKQNQQQSQdQfQmQpQsQ}QQQQQQQQQQQQQQRRRR R RRRRRR*R,R3R6R9RCRJRYRfRiRlRoRRRRRRRRRRRRRRRRRRRRRRSS SSSSS$S3SDSFSKSNSQS[SdSSSSSSSSSSSSSSSSSSSSSSSSSSSTTTTTT T!T$T&TOTRTTTVTXT[T^TaTdTfTwTyT~TTTTTTTTTTTTTTTTTTTUUUU U"U%U(U+U.U0UAUCUMUPUSU]UgUvUUUUUUUUUUUUUUUUUUUUUUVVVVV!V+V4VCVTVVV_VbVeVoVxVVVVVVVVVVVVVVVVVVVVWWWWWW WW?WBWDWFWHWKWNWQWTWVWgWiWnWqWtW~WWWWWWWWWWWWWWWWWWWWWXX!X#X%X&X)X*X-X/XXX[X]X_XaXdXgXjXmXoXXXXXXXXXXXXXYYYY0Y3Y6Y9YZHZRZwZzZ|Z~ZZZZZZZZZZZZZZZZZZZZZZ[[[[ [#[&[0[9[>[A[D[G[t[w[y[{[}[[[[[[[[[[[[[[[[[[[[\\\\ \ \\9\;\=\>\@\C\D\G\I\X\\\\\\\\\\\\\\\\\\\\\\\\]]] ]]]&]/]4]=^l^n^p^s^v^x^z^|^~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^____ _ ________!_$_'_*_-_0_3_6_9_<_?_B_E_H_K_N_Q_T_W_Z_]_`_c_f_i_l_o_r_u_x_{_~___________________________________________aaaaaaaaaaaaaaaabbbbb b bbbbbbbbb!b#b&b(b*b,b/b1b3b5b8b:bdAdDdGdJdMdPdYf4f7f:f=f@fCfFfIfLfOfRfUfXf[f^fafdfgfjfmfpfsfvfyf|fffffffffffffffffffffffffffffffffffffffffffgggg g ggggggg!g$g'g*g-g0g3g6g9ghAhDhGhJhMhPhShVhYh\h_hbhehhhkhnhqhthwhzh}hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiii i i iiiiiiiiii!i#i%i'i)i+i-i/i1i3i5i7i9i;i=i?iAiCiEiGiIiKiMiOiQiSiUiWiYi[i]i_iaicieigiiikimioiqisiuiwiyi{i}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjjjj j j jjjjjjjjjj!j#j%j'j)j+j-j/j1j3j5j7j9j;j=j?jAjCjEjGjIjKjMjOjQjSjUjWjYj[j]j_jajcjejgjijkjmjojqjsjujwjyj{j}jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkkk!Sk#3Depict-0.0.19/packaging/mac/3Depict.app/Contents/Resources/Assets.car0000644000175000017500000022307012640746376024741 0ustar pcuserpcuserBOMStoreРU ERRATCR@(#)PROGRAM:CoreUI PROJECT:CoreUI-231 ibtoold-5.0.2LTFv;y=Ftreetreetreetree RStree tree treetreeQtreeSkCoreThemeCheckBoxIDCheckBox kCoreThemeRadioButtonIDRadio Button kCoreThemePushButtonIDPush Button kCoreThemeBevelButtonIDBevel ButtonLSkCoreThemeBevelButtonRoundIDBevel Button RoundkCoreThemeComboBoxButtonIDCombo Box ButtonkCoreThemeDisclosureButtonIDDisclosure Button kCoreThemeTabButtonIDTab ButtonOQ! #"%$'&)(+*-,/.1032547698;:=<?>A@CBEDGFIHKJMLONQPSRUTWVYX[Z]\_^a`cbedgfihkjmlonqpsrutwvyx{z}|~tmfk   ONTSIZES GLYPHS BEZELS FACETKEYS ELEMENT_INFO PART_INFO     ! #"%$'&)(+*-,/.1032547698;:=<?>A@CBEDGFIHKJMLONQPSRUTWVYX[Z]\_^a`cbedgfihkjmlonqpsrutwvyx{z}|~kCoreThemeGlassButtonIDGlass Push Button kCoreThemeBasicButtonIDBasic Button kCoreThemePopUpButtonIDPop-Up ButtonkCoreThemeSquarePopUpButtonIDSquare Pop-Up ButtonkCoreThemePullDownButtonIDPull-Down Button Rounded kCoreThemeSquarePullDownButtonIDPull-Down Button SquarekCoreThemeBoxIDBoxkCoreThemeMenuIDMenukCoreThemeScrollerIDScroller kCoreThemeSplitViewIDSplitViewkCoreThemeStepperElementIDStepperkCoreThemeTabViewElementIDTab View kCoreThemeTableViewElementIDTable View kCoreThemeTextFieldElementIDText FieldkCoreThemeWindowIDWindowkCoreThemePatternsElementIDPatterns kCoreThemeButtonGlyphsIDButton GlyphskCoreThemeBezelElementIDBezel kCoreThemeProgressBarIDProgress Bar kCoreThemeImageWellIDImage WellkCoreThemeSliderIDSliderkCoreThemeDialIDDial kCoreThemeDrawerIDDrawer!kCoreThemeToolbarIDToolbar"kCoreThemeCursorsIDCursors#kCoreThemeTimelineIDTimeline$kCoreThemeZoomBarIDZoom Bar% kCoreThemeZoomSliderIDZoom Slider&kCoreThemeIconsIDIcons'#kCoreThemeListColorPickerScrollerIDList Color Picker Scroller( kCoreThemeColorPanelIDColor Panel*kCoreThemeBrowserIDBrowser+ kCoreThemeNavIDNav Panel, kCoreThemeSearchFieldIDSearch Field- kCoreThemeFontPanelIDFont Panel.kCoreThemeScrubberIDScrubber/kCoreThemeTexturedWindowIDTextured Window0kCoreThemeUtilityWindowIDUtility Window1 kCoreThemeTransientColorPickerIDTransient Color Picker2kCoreThemeSegmentedScrubberIDSegmented Scrubber3kCoreThemeCommandsIDCommands4 kCoreThemePathControlIDPath Control5kCoreThemeCustomButtonIDCustom Button for Zero Code6kCoreThemeZeroCodePlaceHolderIDZero Code Place Holder7 kCoreThemeRuleEditorIDRule Editor8 kCoreThemeTokenFieldIDToken Field9 kCoreThemePopUpTableViewArrowsIDPopUp Arrows for TableViews:#kCoreThemePullDownTableViewArrowsIDPullDown Arrow for TableViews;kCoreThemeComboBoxTableArrowIDCombo Box Arrow for TableViews<kCoreThemeRuleEditorPopUpIDRule Editor - PopUp Button=kCoreThemeRuleEditorStepperIDRule Editor - Stepper>kCoreThemeRuleEditorComboBoxIDRule Editor - ComboBox?#kCoreThemeRuleEditorActionButtonsIDRule Editor - Action Buttons@ kCoreThemeColorSliderIDColor SliderA#kCoreThemeGradientControlGradientIDControl GradientB kCoreThemeGradientControlBezelIDGradient BezelC kCoreThemeMegaTrackballIDMegaTrackballOkCoreThemeToolbarRaisedEffectIDToolbar Raised EffectPkCoreThemeSidebarRaisedEffectIDSidebar Raised EffectQ!kCoreThemeLoweredEmbossedEffectIDLowered Embossed EffectR %kCoreThemeTitlebarRaisedEffectIDFullscreen/TAL Window Controls EffectS#kCoreThemeSegmentedControlRoundedIDSegmented Control RoundedT$kCoreThemeSegmentedControlTexturedIDSegmented Control TexturedU kCoreThemeNamedElementIDNamed ElementVkCoreThemeLetterpressEffectIDLetterpress Emboss EffectWkCoreThemeRoundRectButtonIDRound Rect ButtonX kCoreThemeButtonRoundIDRound ButtonYkCoreThemeButtonRoundTexturedIDTextured Round ButtonZkCoreThemeButtonRoundHelpIDRound Help Button[kCoreThemeScrollerOverlayIDScroll Bar Overlay\kCoreThemeScrollViewFrameIDScroll View Frame]kCoreThemePopoverIDPopover^kCoreThemeLightContentEffectIDLight Content EffectkCoreThemeBasicPartIDBasic - Basic Part kCoreThemeTitlebarControlsIDBasic Button - Titlebar ControlskCoreThemeShowHideButtonIDBasic Button - Show Hide ButtonkCoreThemeBoxPrimaryIDBox - Primary BoxkCoreThemeBoxSecondaryIDBox - Secondary BoxkCoreThemeBoxMetalIDBox - Metal BoxkCoreThemeBoxWellIDBox - Well BoxkCoreThemeMenuGlyphsIDMenu - Menu GlyphskCoreThemeCornerIDScroller - Corner kCoreThemeSlotIDScroller - Slot #kCoreThemeThumbIDScroller / Zoom / SplitView - Thumb kCoreThemeNoArrowIDScroller - No Arrow !kCoreThemeSingleArrowIDScroller / Toolbar - Single Arrow kCoreThemeDoubleArrowMinEndIDScroller - Double Arrow Min EndkCoreThemeDoubleArrowMaxEndIDScroller - Double Arrow Max EndkCoreThemeDividerIDSplitView - DividerkCoreThemeTabViewPrimaryTabIDTab View - Primary TabkCoreThemeTabViewSecondaryTabIDTab View - Secondary TabkCoreThemeTabViewRodIDTab View - Tab View RodkCoreThemeTabViewLargeRodIDTab View - Large RodkCoreThemeTabViewSmallRodIDTab View - Small RodkCoreThemeTabViewMiniRodIDTab View - Mini RodkCoreThemeTabViewPaneIDTab View - Tab PanekCoreThemePrimaryListHeaderIDTable View - Primary ListHeader!kCoreThemeSecondaryListHeaderIDTable View - Secondary ListHeaderkCoreThemeListHeaderGlyphsIDTable View - ListHeader GlyphskCoreThemeTitlebarIDWindow - Title BarkCoreThemeWindowButtonsIDWindow - ButtonskCoreThemeResizeControlIDWindow - Resize ControlkCoreThemeDoubleArrowIDToolbar - Double ArrowkCoreThemeToolbarIconsIDToolbar - Toolbar IconskCoreThemeToolbarSpacerIconsIDToolbar - Spacer Icons kCoreThemeProgressBackgroundIDProgress Bar - Background!"kCoreThemeProgressBarDeterminateIDProgress Bar - Determinate"$kCoreThemeProgressBarIndeterminateIDProgress Bar - Indeterminate#kCoreThemeSliderTrackIDSlider - Track$kCoreThemeSliderKnobIDSlider - Knob% kCoreThemeSliderTickIDSlider - Tick&kCoreThemeThumbnailBezelIDBezel - Thumbnail'kCoreThemeColorSwatchBezelIDBezel - Color Swatch(kCoreThemeRoundBezelIDText Field - Round Text Field)kCoreThemeSquareBezelIDText Field - Square Text Field+kCoreThemeStandardCursorsIDCursors - Standard Cursors,kCoreThemeTimelineStreamIDTimeline - Stream-kCoreThemeTimelineClipIDTimeline - Clip. kCoreThemeTimelineSelectedClipIDTimeline - Selected Clip/kCoreThemeTimelineLockOverlayIDTimeline - Lock Overlay1kCoreThemeTimelineLockedGlyphIDTimeline - Locked Glyph2kCoreThemePlayHeadIDTimeline / Zoom Bar - Play Head3#kCoreThemeTimelineTrackSizeButtonIDTimeline - Track Size Button4kCoreThemeTimeCodeIconIDTimeline - Time Code Icon5+kCoreThemeGlassRoundButtonIDGlass Button / Button Glyphs - Round Button6!0kCoreThemeGlassVisibilityButtonIDGlass Button / Button Glyphs - Visibility Button7kCoreThemeTabButtonSingletonIDTab Button - Singleton8kCoreThemeTabButtonMatrixIDTab Button - Matrix9"4kCoreThemeSampleGlyphsTabButtonsIDButton Glyphs - Sample Glyphs for Tab Matrix Buttons:'7kCoreThemeSampleGlyphsSingleTabButtonIDButton Glyphs - Sample Glyphs for Singleton Tab Buttons=kCoreThemeLargeTextBezelIDBezel - Large Text Bezel>kCoreThemeDisplayTextBezelIDText Field - Display Text Bezel?kCoreThemeSlideOutBezelIDDrawer - Slideout BezelAkCoreThemeDrawerAffordanceIDDrawer - AffordanceB kCoreThemeDimpleIDDial - DimpleCkCoreThemeDisclosureTriangleIDDisclosure - TriangleDkCoreThemeDisclosureKnobIDDisclosure - KnobEkCoreThemeDisclosureGlyphIDDisclosure - GlyphF$kCoreThemeTypeAlignGlyphIDButton Glyphs - Type Alignment GlyphG"kCoreThemeTypeLeadingGlyphIDButton Glyphs - Type Leading GlyphH!kCoreThemeFontPanelGlyphsIDButton Glyphs - Font Panel GlyphsIkCoreThemePreferencesIDIcons - PreferencesJkCoreThemeNoteGlyphIDIcons - Note GlyphKkCoreThemePreviewBezelIDBezel - Preview BezelL*kCoreThemeGlassHelpButtonIDGlass Button / Button Glyphs - Help ButtonMkCoreThemeColumnResizerIDBrowser - Column ResizeNkCoreThemeSearchButtonIDSearch Field - Search ButtonOkCoreThemeCancelButtonIDSearch Field - Cancel ButtonPkCoreThemeSnapBackButtonIDSearch Field - SnapBack ButtonQ&kCoreThemeArrowsIDScrubber / Segmented Scrubber - ArrowsRkCoreThemeScopeButtonIDNav Panel - Scope ButtonSkCoreThemePreviewButtonIDNav Panel - Preview ButtonTkCoreThemeWindowTextureIDTextured Window - ScratchesU!kCoreThemeWindowTextureGradientIDTextured Window - GradientVkCoreThemeWindowRoundCornerIDWindow - Round CornerWkCoreThemeUnifiedWindowFillIDUnified Toolbar - GradientXkCoreThemeMenuBarIDMenu - Menu BarYkCoreThemeAppleMenuIDMenu - Apple MenuZkCoreThemeBoxMatteWellIDBox - Matte Well Box[%kCoreThemeTransientColorPickerImageIDTransient Color Picker - Image\.(kCoreThemeTransientColorPickerImageGrayscaleIDTransient Color Picker - Grayscale Image],-kCoreThemeTransientColorWellButtonLeftPartIDTransient Color Picker - Color Well Left Part^--kCoreThemeTransientColorWellButtonSeparatorIDTransient Color Picker - Color Well Separator_-.kCoreThemeTransientColorWellButtonRightPartIDTransient Color Picker - Color Well Right Part`.5kCoreThemeTransientColorWellButtonLeftPartLgIDTransient Color Picker - Color Well (Large) Left Parta/5kCoreThemeTransientColorWellButtonSeparatorLgIDTransient Color Picker - Color Well (Large) Separatorb/6kCoreThemeTransientColorWellButtonRightPartLgIDTransient Color Picker - Color Well (Large) Right PartckCoreThemeCaretIDSegmented Scrubber - Caretd%kCoreThemeScrubbingArrowsIDSegmented Scrubber - Scrubbing ArrowsekCoreThemeCommandIconsIDCommands - IconsfkCoreThemeCommandKeyCapIDCommands - Key CapgkCoreThemeCommandInfoIDCommands - Extra KeyPad GlyphshkCoreThemePathControlDividerIDPath Control - DividerikCoreThemePathControlNavBarIDPath Control - Navagation BarjkCoreThemeBoxRaisedIDBox - Raised BoxkkCoreThemeBoxInsetIDBox - Inset BoxlkCoreThemeCommandsSearchFocusCommands - Searching FocusmkCoreThemeCommandsSearchOverlayCommands - Searching OverlaypkCoreThemeTableViewChevronIDTableView - ChevronqkCoreThemeZoomSmallGlyphIDZero Code - Small GlyphrkCoreThemeZoomLargeGlyphIDZero Code - Large GlyphskCoreThemeCommandKeyCapPatchIDCommands - Key Cap Patcht!kCoreThemeNavigateBackwardIDButton Glyphs - Navigate Backwardu kCoreThemeNavigateForwardIDButton Glyphs - Navigate ForwardwkCoreThemeGroupWellIDBox - Group Well Boxx$/kCoreThemeTableViewScrubbingArrowsIDSegmented Scrubber - TableView Scrubbing ArrowsykCoreThemeProgressSpinningIDProgress Indicator - Spinningz)kCoreThemeLabelBulletRoundIDRule Editor - Label Bullets Round (Tiger){+kCoreThemeLabelSelectorRoundIDRule Editor - Label Selectors Round (Tiger)|,kCoreThemeLabelBulletSquareIDRule Editor - Label Bullets Square (Leopard)}.kCoreThemeLabelSelectorSquareIDRule Editor - Label Selectors Square (Leopard)~%-kCoreThemeDisclosureTriangleSidebarIDDisclosure - Nav Sidebar Highlighted Triangle!kCoreThemeActionMenuGlyphIDButton Glyphs - Action Menu Glyph0*kCoreThemeTransientColorPickerSwatchBackgroundIDTransient Color Picker - Swatch Background%kCoreThemeSegmentedControlSeparatorIDSegmented Control SeparatorkCoreThemeColorLabelPatternsIDColor Label PatternskCoreThemeMegaTrackballPuckIDMegaTrackball - PuckkCoreThemeMegaTrackballGlyphsIDMegaTrackball - Glyphs%kCoreThemeMegaTrackballBaseGradientIDMegaTrackball - Base Gradient kCoreThemeMegaTrackballHueRingIDMegaTrackball - Hue Ring' kCoreThemeMegaTrackballBaseShadowMaskIDMegaTrackball - Base Shadow MaskkCoreThemeMegaTrackballCenterIDMegaTrackball - CenterkCoreThemeZoomUnifiedGlyphIDIcons - Unified Zoom!kCoreThemeSegmentedControlBezelIDSegmented Control BezelkCoreThemeBrowserBranchIDBrowser - Branch Image+"kCoreThemePaneCapLoweredMenuIndicatorPartIDPane Cap - Lowered Menu Indicator,#kCoreThemePaneCapCenteredMenuIndicatorPartIDPane Cap - Centered Menu Indicator)!kCoreThemePaneCapPopUpMenuIndicatorPartIDPane Cap - Pop Up Menu Indicator$kCoreThemeCloseButtonGlyphIDContent Tab View -Close Button GlyphkCoreThemeContentTabViewTabIDContent Tab View - Tab% kCoreThemeContentTabViewMenuChevronIDContent Tab View - Menu Chevron" kCoreThemeContentViewMenuGrabberIDContent Tab View - Menu Grabber&%kCoreThemeContentViewMenuButtonGlyphIDContent Tab View - Menu Button Glyph-,kCoreThemeContentViewMenuThumbnailHighlightIDContent Tab View - Menu Thumbnail Highlight(kCoreThemeNavPushButtonPartIDNav Panel - Scope Bar Push (Save) ButtonkCoreThemePaneCapHeaderIDPane Cap HeaderkCoreThemePaneCapFooterIDPane Cap Footer kCoreThemeWindowOverlayPatternIDWindow - Overlay Pattern!kCoreThemeWindowBackgroundImageIDWindow - Background Image kCoreThemeWindowBottomGradientIDWindow - Bottom GradientkCoreThemeImageEffectIDImage Effect DefinitionkCoreThemeTextEffectIDText Effect DefinitionkCoreThemeMenuSeparatorIDMenu Seperator kCoreThemeArtworkImageIDArtwork Image#kCoreThemeWindowTitlebarSeparatorIDWindow Titlebar SeparatorkCoreThemeMenuPartIDMenu Background kCoreThemeMenuItemPartIDMenu Item kCoreThemeNamedEffectIDNamed EffectkCoreThemeExpandedThumbIDScroller - Expanded Thumb%kCoreThemeTokenFieldTokenBackgroundIDToken Field - Token Background*#kCoreThemeProgressBarDeterminateCompleteIDProgress Bar Complete - Determinate(!kCoreThemeProgressBarDeterminateShadowIDProgress Bar Shadow - Determinate'kCoreThemeProgressSpinningDeterminateIDProgress Spinner - DeterminatekCoreThemePopoverBackgroundIDPopover - Popover Background!"kCoreThemePopoverAreaOfInterestIDPopover - Popover Area of Interest  CARHEADER RENDITIONSCOLORSFONTS FONTSIZES GLYPHS BEZELS FACETKEYS ELEMENT_INFO PART_INFO KEYFORMAT ($^4$(D$=UK4^e4sv,44D$$RD+$VT)$ZU+UEeK6u5e2u'0+, :9vs:v?vvv"$v#F&v'l)*..'+ KO+z~-%+'.2 RVrv ""$ #15)^bE)" @D+os'$1/*.>lp7$+;=A=~))C#HkoD=:26<rvG+;+/6ei.<<@[_MDF>B-os>4+<X\454"'+:ei/DA%)/X\3+)0#+NR'y}<.@/3Dw{D.;04?sw577"&5[_2DH%)Bko.185GK7<? DMQH-,+)-3`d8;= =]a3/@ >MQ>;G9VZOY <FJ6^fLP:C8 7HL'sw;35"&FlpFD248/gk5M8-1<mq<@@597pt;<C6::tx?*.4OSK^aeibc26klm3H 09=3pt=<B7;-hl+?C!%7\`99>EaeC1[<@A…MQ'+Q|ÀUZ37D{bH-1:ko9ŨŬ=J7;@{O=8KO@ǏǓ7U#'W~ȂRH $<`dMɱɵJSVZaʻʿM 0@D0tx@˸˼B@BF6|̀4̴̸/-D`d+͏͓)ͼ+:)-Kx|UQ&*Mw{AϼK,<v+4UI&hK3Depict-0.0.19/packaging/mac/3Depict.app/Contents/Resources/en.lproj/0000755000175000017500000000000012640746376024533 5ustar pcuserpcuser3Depict-0.0.19/packaging/mac/3Depict.app/Contents/Resources/en.lproj/Credits.rtf0000644000175000017500000000066412640746376026653 0ustar pcuserpcuser{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} {\colortbl;\red255\green255\blue255;} \paperw9840\paperh8400 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural \f0\b\fs24 \cf0 Engineering: \b0 \ Some people\ \ \b Human Interface Design: \b0 \ Some other people\ \ \b Testing: \b0 \ Hopefully not nobody\ \ \b Documentation: \b0 \ Whoever\ \ \b With special thanks to: \b0 \ Mom\ } 3Depict-0.0.19/packaging/mac/3Depict.app/Contents/Resources/en.lproj/InfoPlist.strings0000644000175000017500000000013412640746376030053 0ustar pcuserpcuser/* Localized versions of Info.plist keys */ 3Depict-0.0.19/packaging/mac/3package.sh0000755000175000017500000000412512716174467017202 0ustar pcuserpcuser#!/bin/bash PROGRAM_NAME=3Depict cp makeMacOSXApp ../.. cp -R ${PROGRAM_NAME}.app ../.. cd ../.. echo "" > compile echo "" > install-sh make clean > out.txt 2>&1 make distclean > out.txt 2>&1 autoreconf >> out.txt 2>&1 #Pull version number out of configure VERSION=`cat ./configure.ac | grep '^\s*AC_INIT(' | awk -F, '{ print $2 } ' | sed 's/\s*\[//' | sed 's/\]\s*//' | sed 's/\ //g' | sed 's/)//g'` BUILT_PROGRAMS_DIR=. MAC_OS_VER=`sw_vers | grep ProductVersion | awk '{print $2}'` YEAR=`date | awk '{print $NF}'` #Fix some semi-constant values #=== INFO_PLIST="./3Depict.app/Contents/Info.plist" #Set program version sed "s/BUNDLE_VERSION/${VERSION}/" ${INFO_PLIST} > tmp.txt #Set year sed "s/3Depict Copyright (C) 20[123][0-9]/${DATEYEAR}/" tmp.txt > tmp2.txt #Set minimum OS numbber sed "s/MIN_OS_VER/${MAC_OS_VER}/" tmp2.txt > ${INFO_PLIST} rm tmp.txt tmp2.txt #=== time ./makeMacOSXApp --update-config=yes --parallel=no --debug=no > out.txt 2>&1 if [ x"`tail -1 out.txt`" == x"Done" ] ; then echo "Finished compiling" else echo "Failed" vi out.txt exit 1 fi #Perform some QA checks #-- #TODO: Check debug symbols are stripped #Ensure that program name not screwed up by XCode if [ x`grep ${INFO_PLIST} -Depict` != x"" ] ; then echo "Program name incorrectly stored in package, is listed as _Depict, rather than $PROGRAM_NAME" exit 1 fi #ensure that we have some .vfm files in here if [ x`find ./ -name \*.vfm` == x"" ] ; then echo "No VFM files (mathgl fonts) found!" exit 1 fi #ensure that we have some .pdf files in here if [ x`find ./ -name \*.pdf` == x"" ] ; then echo "WARNING: No PDF files (manual) found!" sleep 1 fi #ensure that some .mo (translation files) are here if [ x`find ./ -name \*.mo` == x"" ] ; then echo "WARNING : No mo files (translations) found!" sleep 1 fi #-- ARCHIVE_FILENAME=`echo "${BUILT_PROGRAMS_DIR}/${PROGRAM_NAME}-${VERSION}-${MAC_OS_VER}.pkg"` pkgbuild --root "${PROGRAM_NAME}.app" \ --identifier "net.sourceforge.threedepict.${PROGRAM_NAME}" \ --version "${VERSION}" \ --install-location "/Applications/${PROGRAM_NAME}.app" \ ${ARCHIVE_FILENAME} 3Depict-0.0.19/packaging/3Depict.desktop0000644000175000017500000000023612640746376017312 0ustar pcuserpcuser[Desktop Entry] Version=1.0 Type=Application Comment=Valued point cloud visualisation and analysis TryExec=3Depict Exec=3Depict %F Icon=3Depict Name=3Depict 3Depict-0.0.19/packaging/makeTarball.sh0000755000175000017500000002222212723164270017166 0ustar pcuserpcuser#!/bin/bash MSG_FILE=tmp-messages #Should we use clang if available? USE_CLANG=0 if [ x`uname | grep Linux` != x"" ] ; then NUM_PROCS=`cat /proc/cpuinfo | grep cores | uniq | sed 's/.*:\s*//'` else #For other platforms, guess! NUM_PROCS=4 fi HG_ROOT=`hg root` pushd $HG_ROOT if [ ! -f configure ] ; then echo "Configure not found in root (hg root). Are you runing this from inside the repository?" exit 1 fi #Don't overwrite message file while [ -f $MSG_FILE ] ; do MSG_FILE=tmp-$MSG_FILE done #Check build for combinations of # - enable/disable parallel # - debug checking # - C++11 # - ubsan #------- #CONF_ARGS=("--enable-openmp-parallel" "--disable-debug-checks " " --enable-debug-checks " " --enable-openmp-parallel --disable-debug-checks " " --enable-ubsan --enable-openmp-parallel " " --enable-ubsan " ) for i in ${CONF_ARGS[*]} do if [ -f Makefile ] ; then make distclean fi ./configure "$i" if [ $? -ne 0 ] ; then echo "test-configuration failed to configure: arguments are $i" exit 1 fi if [ ! -f Makefile ] ; then echo "Configure claimed everything was OK, but did not create a Makefile" exit 1 fi make -j $NUM_PROCS if [ $? -ne 0 ] ; then echo "failed to build: arguments are $i" exit 1 fi #Check for unit test availability, and run them # where possible pushd src TEST_FLAG=`./3Depict --help 2>&1 | grep "\-\-test"` if [ x"$TEST_FLAG" != x"" ] ; then ./3Depict -t if [ $? -ne 0 ] ; then echo "Unit tests failed for configure flag : $i" exit 1 fi fi popd make distclean done if [ x"`which clang`" != x"" ] && [ $USE_CLANG -ne 0 ] ; then #OK, we have clang CXX=clang++ C=clang CFLAGS=-std=c++11 CXXFLAGS=-std=c++11 ./configure if [ $? -ne 0 ] ; then echo "configuration failed to configure with clang" exit 1 fi if [ ! -f Makefile ] ; then echo "Configure claimed everything was OK, but did not create a Makefile" exit 1 fi make -j $NUM_PROCS if [ $? -ne 0 ] ; then #If we fail to build with clang, we don't care. We just want to see how far we can get. # Clang seems to have a lot of problems at link time, # which we don't see with gcc. echo "Failed to build with clang. Ignoring" else pushd src/ ./3Depict -t if [ $? -ne 0 ] ; then echo "Unit tests failed for configure flag : $i" exit 1 fi popd make distclean fi fi if [ ! -f compile ] ; then touch compile fi ./configure if [ $? -ne 0 ] ; then echo "Something went wrong with configure. Cannot continue" exit 1 fi rm -rf autom4te.cache #Build program make -j $NUM_PROCS if [ $? -ne 0 ] ; then echo "make failed"; exit 1; fi #Build distributable tarball make dist -j $NUM_PROCS if [ $? -ne 0 ] ; then echo "make dist failed"; exit 1; fi #Various release-time checks #---- echo "--------- RUNNING SANITY CHECKS -------" #Check version VER=`ls 3depict-*gz | sed 's/^3depict-\([0-9\.]*\).tar.gz$/\1/' ` echo "Version is apparently :" $VER if [ x"`grep $VER .hgtags`" == x"" ] ; then echo " NOTICE: version number not seen in HG file..." >> $MSG_FILE else echo " NOTICE: Version number exists in HG (OK)" >> $MSG_FILE fi #Check version number in various files is set concomitantly. if [ x"`grep $VER ChangeLog`" == x"" ] ; then echo " WARNING: Program version not set to match between configure.ac. and ChangeLog">> $MSG_FILE fi if [ x"`grep PROGRAM_VERSION src/common/constants.cpp | grep $VER`" == x"" ] ; then echo " WARNING: Program version not set to match between configure.ac. and constants.cpp">> $MSG_FILE fi #Check version number in deb & rpm if [ x"`head -n 1 packaging/debian/changelog |grep 3depict | grep $VER`" = x"" ] ; then echo " WARNING: Program version does not match between configure.ac and packaging/debian/changelog" >> $MSG_FILE fi if [ x"` grep '^Version:' packaging/RPM/3Depict.spec | grep $VER`" = x"" ] ; then echo " WARNING: Program version does not match between configure.ac and packaging/RPM/3Depict.spec" >> $MSG_FILE fi if [ x"` grep 'PRODUCT_VERSION' packaging/mingw-debian-cross/windows-installer.nsi | grep $VER`" = x"" ] ; then echo " WARNING: Program version does not match between configure.ac and packaging/mingw-debian-cross/windows-installer.nsi" >> $MSG_FILE fi #Check latex manual if [ x"`grep --after-context=2 'Version:' docs/manual-latex/manual.tex | grep $VER`" == x"" ] ; then echo " WARNING: Program version does not match between configure.ac and docs/manual-latex/manual.tex" >> $MSG_FILE fi #Check that the fp exceptions are disabled. if [ x"`grep feenableexcept src/3Depict.cpp | egrep -v '^\s*//'`" != x"" ] ; then echo " WARNING: Floating point exceptions still appear to be enabled..." >> $MSG_FILE fi #check that we are not using preprocessor macros incorrectly #Apple preprocessor is exactly __APPLE__ RES=`find src/ -name *.cpp -exec grep APPLE {} \; | egrep '^\s*#' | grep -v EFFECTS_WORKAROUND | grep -v __APPLE__` if [ x"$RES" != x"" ] ; then echo " WARNING: possible incorrect APPLE preprocessor token..." >> $MSG_FILE echo "$RES" >> $MSG_FILE fi RES=`find src/ -name *.h -exec grep APPLE {} \; | egrep '^\s*#' | grep -v EFFECTS_WORKAROUND | grep -v __APPLE__` if [ x"$RES" != x"" ] ; then echo " WARNING: possible incorrect APPLE preprocessor token..." >> $MSG_FILE echo "$RES" >> $MSG_FILE fi #Check for editor ~ files and orig files SOMEFILES=`find ./ -name \*~` if [ x"$SOMEFILES" != x"" ] ; then echo " WARNING : Found some maybe-backup files (~ extension)" >> $MSG_FILE echo "$FILES" >> $MSG_FILE fi SOMEFILES=`find ./ -name \*.orig` if [ x"$SOMEFILES" != x"" ] ; then echo " WARNING : Found some maybe-backup files (\"orig\" extension)" >> $MSG_FILE echo "$FILES" >> $MSG_FILE fi SOMEFILES=`find ./ -name \*.rej` if [ x"$SOMEFILES" != x"" ] ; then echo " WARNING : Found some maybe-backup files (\"rej\" extension)" >> $MSG_FILE echo "$FILES" >> $MSG_FILE fi #Check that PDF manual is built PDF_FILE=docs/manual-latex/manual.pdf if [ ! -f ] ; then echo " WARNING : PDF manual was not found -- has it been compiled?" >> $MSG_FILE echo "$FILES" >> $MSG_FILE else #Check PDF is actually a pdf if [ x"`file $PDF_FILE | grep "PDF document" `" == x"" ] ; then echo " WARNING : PDF manual found, but does not appear to be a valid PDF?" >> $MSG_FILE echo "$FILES" >> $MSG_FILE fi fi #Check for outstanding mercurial changes SOME_LINES=`hg diff | wc -l` if [ x"$SOME_LINES" != x"0" ] ; then echo " WARNING : Oustanding mercurial changes! Normally should commit fixes!" >> $MSG_FILE fi #Check translation files for "span" element - transifex has a bad habit of encoding whitspace SPAN_ELEMENT=`cat translations/3Depict_*po | grep "> $MSG_FILE fi #Run licensecheck over files, if available if [ x`which licensecheck` != x"" ] ; then LIC_CHECK_OUT=`licensecheck -r --ignore=".*\.(sh|sci|py|tex|js)$" . | grep -v "GPL (v[23] or later)" | grep -v "GENERATED FILE" | grep -v "MPL" | grep -v "tarball/"` if [ x"$LIC_CHECK_OUT" != x"" ] ; then echo "WARNING:" $LIC_CHECK_OUT >> $MSG_FILE fi fi #---- rm -rf tarball mkdir tarball pushd tarball tar -zxf ../3depict-$VER.tar.gz rm ../3depict-$VER.tar.gz #Autoconf buggers up the name case mv 3depict-$VER 3Depict-$VER #--- Translation stuff-- #Build the translation files pushd ../translations ./makeTranslations mkdir -p ../tarball/3Depict-$VER/translations cp 3Depict*.mo ../tarball/3Depict-$VER/translations/ popd #copy the manual cp ../docs/manual-latex/manual.pdf ./tarball/3Depict-$VER/docs/manual-latex/ pushd 3Depict-$VER/translations/ #Move the .mo file to the correct subdir for i in `ls *.mo` do LOCALEVAL=`basename $i | sed 's/\.mo//' | sed 's/3Depict_//'` mkdir -p locales/$LOCALEVAL/LC_MESSAGES mv $i locales/$LOCALEVAL/LC_MESSAGES/3Depict.mo done if [ -d locales ] ; then mv locales ../ else echo "ERROR: No Locales built.. Aborting" exit 1 fi popd #-------------- # Configure stuffs up the directories marked as extra-dist # if you don't use a trailing slash, some versions of configure die # if you do, other versions of configure add it as a subdir of itself # so lets just "fix it" #-------- pushd 3Depict-$VER/ for i in textures tex-source glade-skeleton do if [ -d src/$i/$i ] ; then mv src/$i/$i/* src/$i/ rmdir src/$i/$i/ fi done for i in packaging docs m4 translations deps test data do if [ -d $i/$i ] ; then mv $i/$i/* $i/ rmdir $i/$i/ fi done popd #make the final source tarball tar -cz 3Depict-$VER > 3Depict-$VER.tar.gz popd #------ #OK, now try unpacking the thing, then building it. mkdir tarball/extract/ if [ $? -ne 0 ] ; then echo "failed to make tarball extract dir" fi pushd tarball/extract tar -zxf ../3Depict-$VER.tar.gz pushd 3Depict-$VER; ./configure if [ $? -ne 0 ] ; then echo "didn't configure after tarball extract" fi make -j$NUM_PROCS if [ $? -ne 0 ] ; then echo "rebuilding tarball failed." else echo "tarball rebuild OK!" fi popd popd #-------- if [ -f $MSG_FILE ] ; then echo "------------- SUMMARY ----------" cat $MSG_FILE echo "--------------------------------" rm $MSG_FILE fi popd 3Depict-0.0.19/compile0000644000175000017500000000000012723154265014030 0ustar pcuserpcuser3Depict-0.0.19/INSTALL0000644000175000017500000002247312640746376013540 0ustar pcuserpcuserInstallation Instructions ************************* This file is automatically generated by autotools. For a quicker and simpler introduction, read the "README" file Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. 3Depict-0.0.19/translations/0000755000175000017500000000000012723200271015175 5ustar pcuserpcuser3Depict-0.0.19/translations/3Depict_de_DE.po0000644000175000017500000043717612723162703020101 0ustar pcuserpcuser# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # epix1234 , 2011. # , 2011, 2012. # , 2011. msgid "" msgstr "" "Project-Id-Version: 3Depict\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-05-31 11:15+1000\n" "PO-Revision-Date: 2012-07-09 08:21+0000\n" "Last-Translator: epix1234 \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/3depict/" "language/de_DE/)\n" "Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: ../src/gui/glPane.cpp:642 msgid "Use shift/ctrl-space or double tap to alter reset axis" msgstr "" "Verwenden Sie Shift / Strng-Leertaste oder doppeltippen, um Achsen " "zurückzusetzen oder zu verändern" #: ../src/gui/glPane.cpp:938 msgid "Image progress" msgstr "Bild Fortschritt" #: ../src/gui/glPane.cpp:939 msgid "Rendering tiles..." msgstr "Rendering tiles..." #: ../src/gui/glPane.cpp:1132 msgid "Animation progress" msgstr "Animation-Fortschritt" #: ../src/gui/glPane.cpp:1133 msgid "Rendering sequence..." msgstr "Renderreihenfolge..." #: ../src/gui/glPane.cpp:1171 msgid "Saving Image " msgstr "Speichere Bild " #: ../src/gui/glPane.cpp:1171 ../src/gui/mainFrame.cpp:4401 #: ../src/gui/mainFrame.cpp:4405 ../src/gui/mainFrame.cpp:4418 #: ../src/backend/filters/dataLoad.cpp:321 msgid " of " msgstr " von " #: ../src/gui/dialogs/ExportRngDialog.cpp:40 msgid "Range Sources" msgstr "Range Sources" #: ../src/gui/dialogs/ExportRngDialog.cpp:42 msgid "Details" msgstr "Details" #: ../src/gui/dialogs/ExportRngDialog.cpp:53 msgid "Source Filter" msgstr "Source Filter" #: ../src/gui/dialogs/ExportRngDialog.cpp:54 #: ../src/backend/filters/rangeFile.cpp:656 msgid "Ions" msgstr "Ionen" #: ../src/gui/dialogs/ExportRngDialog.cpp:55 #: ../src/gui/dialogs/rangeEditDialog.cpp:1587 #: ../src/backend/filters/voxelise.cpp:834 #: ../src/backend/filters/rangeFile.cpp:723 msgid "Ranges" msgstr "Ranges" #: ../src/gui/dialogs/ExportRngDialog.cpp:88 msgid "Param" msgstr "Param." #: ../src/gui/dialogs/ExportRngDialog.cpp:89 #: ../src/gui/dialogs/animateFilterDialog.cpp:1200 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:105 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:352 #: ../src/backend/filters/dataLoad.cpp:581 msgid "Value" msgstr "Wert" #: ../src/gui/dialogs/ExportRngDialog.cpp:90 msgid "Value2" msgstr "Wert2" #: ../src/gui/dialogs/ExportRngDialog.cpp:97 msgid "Ion Name" msgstr "Ionenname" #: ../src/gui/dialogs/ExportRngDialog.cpp:98 msgid "Num Ranges" msgstr "Num Ranges" #: ../src/gui/dialogs/ExportRngDialog.cpp:116 #: ../src/gui/dialogs/rangeEditDialog.cpp:696 ../src/backend/filter.cpp:53 msgid "Ion" msgstr "Ion" #: ../src/gui/dialogs/ExportRngDialog.cpp:117 msgid "Range Start" msgstr "Range Anfang" #: ../src/gui/dialogs/ExportRngDialog.cpp:118 msgid "Range end" msgstr "Range Ende" #: ../src/gui/dialogs/ExportRngDialog.cpp:151 ../src/gui/mainFrame.cpp:2376 msgid "Save pos..." msgstr "pos speichern..." #: ../src/gui/dialogs/ExportRngDialog.cpp:152 msgid "" "Cameca/Ametek RRNG (*.rrng)|*.rrng|ORNL format RNG (*.rng)|*.rng|Cameca ENV " "(*.env)|*.env|All Files (*)|*" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:184 ../src/gui/mainFrame.cpp:1463 #: ../src/gui/mainFrame.cpp:1638 ../src/gui/mainFrame.cpp:1713 #: ../src/gui/mainFrame.cpp:2266 ../src/gui/mainFrame.cpp:2443 #: ../src/gui/mainFrame.cpp:2556 msgid "Unable to save. Check output destination can be written to." msgstr "" "Speichern nicht möglich. Bitte überprüfen Sie ob der Ausgabepfad " "schreibgeschützt ist." #: ../src/gui/dialogs/ExportRngDialog.cpp:187 ../src/gui/mainFrame.cpp:1463 #: ../src/gui/mainFrame.cpp:1588 ../src/gui/mainFrame.cpp:1637 #: ../src/gui/mainFrame.cpp:1713 ../src/gui/mainFrame.cpp:2265 #: ../src/gui/mainFrame.cpp:2338 ../src/gui/mainFrame.cpp:2442 #: ../src/gui/mainFrame.cpp:2555 ../src/wx/wxcomponents.cpp:204 msgid "Save error" msgstr "Fehler speichern" #: ../src/gui/dialogs/ExportRngDialog.cpp:253 msgid "Export Range" msgstr "Range exportieren" #: ../src/gui/dialogs/ExportRngDialog.cpp:258 msgid "List of rangefiles in filter tree" msgstr "Liste der Rangedateien im Filterbaum" #: ../src/gui/dialogs/ExportRngDialog.cpp:260 msgid "Detailed view of selected range" msgstr "Detailierte Ansicht des ausgewählten Range" #: ../src/gui/dialogs/animateFilterDialog.cpp:92 msgid "Cameca/Ametek RRNG" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:93 msgid "Oak-Ridge RNG" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:94 msgid "Cameca/Ametek ENV" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:156 msgid "Key frames" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:157 msgid "Output Data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:158 msgid "Filters and properties" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:164 msgid "Dir : " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:167 msgid "Output only when refresh required" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:169 msgid "Data Types:" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:170 msgid "3D Images" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:171 msgid "File Prefix: " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:173 msgid "Size : " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:175 msgid "..." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:176 msgid "Point data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:177 #: ../src/gui/dialogs/rangeEditDialog.cpp:1586 msgid "Plots" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:178 msgid "Voxel data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:179 msgid "Range files" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:180 msgid "Format" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:197 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:104 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:350 msgid "Frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:702 msgid "transition frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:702 #: ../src/gui/mainFrame.cpp:1690 msgid "Frame count" msgstr "Bildanzahl" #: ../src/gui/dialogs/animateFilterDialog.cpp:774 msgid "Key frame : Colour" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:827 msgid "File existed, but was unable to read or interpret file contents." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:828 msgid "String load failed" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:849 msgid "Keyframe : decimal" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:858 msgid "Keyframe : integer" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:867 msgid "Keyframe : 3D Point" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:995 msgid "Select or create new folder" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1175 msgid "Export Animation" msgstr "Animation exportieren" #: ../src/gui/dialogs/animateFilterDialog.cpp:1176 msgid "Select filter" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1177 msgid "Select property" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1179 #: ../src/gui/dialogs/animateFilterDialog.cpp:1198 msgid "Filter" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1180 #: ../src/gui/dialogs/animateFilterDialog.cpp:1199 msgid "Property" msgstr "Eigenschaft" #: ../src/gui/dialogs/animateFilterDialog.cpp:1181 #: ../src/backend/filters/annotation.cpp:545 #: ../src/backend/filters/annotation.cpp:551 #: ../src/backend/filters/transform.cpp:1150 #: ../src/backend/filters/ionDownsample.cpp:465 #: ../src/backend/filters/spatialAnalysis.cpp:1173 msgid "Mode" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1182 #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:68 msgid "Start Frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1183 #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:70 msgid "End Frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1184 msgid "Keyframe table" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1185 msgid "Remove the selected keyframe from the table" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1186 msgid "Enter where the animation frames will be exported to" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1187 msgid "Browse to directory where the animation frames will be exported to" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1189 msgid "" "Title for files, result will be saved as #-name.png, where # is image number." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1190 msgid "Target resolution (image size)" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1191 msgid "Select frame for property display" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1192 msgid "Enter frame number to change frame (eg 1/20)" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1193 msgid "Save point data (POS files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1194 msgid "Save plots (as text files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1195 msgid "Save voxel data (raw files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1196 msgid "Save range files in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1201 msgid "Animation parameters for current frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1202 msgid "Abort animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1203 msgid "Run Animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1274 msgid "Filter view" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1275 msgid "Frame view" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:37 ../src/backend/filter.cpp:476 #: ../src/backend/filter.cpp:479 msgid "Error" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:39 msgid "Warning" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:42 #: ../src/gui/dialogs/filterErrorDialog.cpp:52 msgid "Filter Errors" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:49 msgid "Stashes" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:52 msgid "Stashed Tree" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:54 msgid "Properties" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:60 msgid "Stash Name" msgstr "Stash Name" #: ../src/gui/dialogs/StashDialog.cpp:61 msgid "Filter Count" msgstr "Filter Count" #: ../src/gui/dialogs/StashDialog.cpp:94 msgid "Stashed Trees" msgstr "Stashed Trees" #: ../src/gui/dialogs/StashDialog.cpp:97 msgid "Erase stashed item" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:98 msgid "Filter view for current stash" msgstr "Filteransicht für den aktuellen Stash" #: ../src/gui/dialogs/StashDialog.cpp:99 msgid "Settings for selected filter in current stash" msgstr "Einstellungen für den ausgewählten Stash" #: ../src/gui/dialogs/StashDialog.cpp:100 msgid "Available stashes" msgstr "Verfügbare Stash" #: ../src/gui/dialogs/resolutionDialog.cpp:45 msgid "Width :" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:47 msgid "Height :" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:50 #: ../src/gui/dialogs/prefDialog.cpp:85 msgid "Reset" msgstr "Zurücksetzen" #: ../src/gui/dialogs/resolutionDialog.cpp:336 msgid "Resolution Selection" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:39 msgid "Remove &All" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:123 msgid "Restore state?" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:133 msgid "Multiple autosave states were found; would you like to restore one?" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:45 msgid "Start Frame: " msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:47 msgid "From File" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:50 msgid "From Table" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:240 msgid "Select text file..." msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:241 msgid "Text files (*.txt)|*.txt;|All Files (*)|*" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:342 msgid "String Keyframes" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:344 msgid "Frame at which to start string sequence" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:345 msgid "Frame offset for data start" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:346 msgid "File to use as string data source, one value per row" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:347 msgid "Select file to use as data source" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:348 msgid "Use table below for data source" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:354 msgid "Add new data rows to table, hold shift/cmd to insert multiple rows" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:355 msgid "Remove selected strings from table" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:356 msgid "Abort value selection and return to previous window" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:357 msgid "Accept data values" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:60 msgid "Keyframe Data" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:61 msgid "Transition" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:64 msgid "Step" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:65 msgid "Ramp" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:73 msgid "Initial Value" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:74 msgid "startColour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:75 msgid "Final Value" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:76 msgid "endColour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:250 msgid "Key Frame : Colour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:252 msgid "Colour at the start of the transtition" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:253 msgid "Colour at end of transition" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:73 msgid "Panel Display" msgstr "Panel Display" #: ../src/gui/dialogs/prefDialog.cpp:75 msgid "Online Updates" msgstr "Online Updates" #: ../src/gui/dialogs/prefDialog.cpp:77 ../src/gui/dialogs/prefDialog.cpp:560 msgid "Startup" msgstr "Startup" #: ../src/gui/dialogs/prefDialog.cpp:78 msgid "Camera Speed" msgstr "Kamerageschwindigkeit" #: ../src/gui/dialogs/prefDialog.cpp:79 msgid "Available Filters" msgstr "Verfügbare Filter" #: ../src/gui/dialogs/prefDialog.cpp:84 msgid "Reset All" msgstr "Alle zurücksetzen" #: ../src/gui/dialogs/prefDialog.cpp:87 msgid "Show all panels" msgstr "Zeige alle Fenster" #: ../src/gui/dialogs/prefDialog.cpp:88 msgid "Remember last" msgstr "Zuletzt verwendet" #: ../src/gui/dialogs/prefDialog.cpp:89 msgid "Show Selected" msgstr "Zeige Auswahl" #: ../src/gui/dialogs/prefDialog.cpp:92 msgid "Control Pane" msgstr "Kontrollfenster" #: ../src/gui/dialogs/prefDialog.cpp:93 msgid "Raw Data Panel" msgstr "Rohdatenfenster" #: ../src/gui/dialogs/prefDialog.cpp:94 ../src/gui/mainFrame.cpp:691 msgid "Plot List" msgstr "Plotliste" #: ../src/gui/dialogs/prefDialog.cpp:96 msgid "Periodically notify about available updates" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:98 msgid "Prefer orthographic at startup" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:99 msgid "Move Rate" msgstr "Bewegungsgeschwindigkeit" #: ../src/gui/dialogs/prefDialog.cpp:100 ../src/gui/dialogs/prefDialog.cpp:104 msgid "(slow)" msgstr "(langsam)" #: ../src/gui/dialogs/prefDialog.cpp:102 ../src/gui/dialogs/prefDialog.cpp:106 msgid "(fast)" msgstr "(schnell)" #: ../src/gui/dialogs/prefDialog.cpp:103 msgid "Zoom Rate" msgstr "Zoomgeschwindigkeit" #: ../src/gui/dialogs/prefDialog.cpp:416 msgid "Show all panels when starting program" msgstr "Zeige alle Fenster beim Programmstart" #: ../src/gui/dialogs/prefDialog.cpp:419 msgid "Show panels visible at last shutdown when starting program" msgstr "Beim Programmstart zuletzt eingeschaltete Fenster anzeigen." #: ../src/gui/dialogs/prefDialog.cpp:426 msgid "Show selected panels when starting program" msgstr "Zeige ausgewählte Fenster beim Programmstart" #: ../src/gui/dialogs/prefDialog.cpp:475 msgid "Preferences" msgstr "Voreinstellungen" #: ../src/gui/dialogs/prefDialog.cpp:477 msgid "Set the method of panel layout when starting the program" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:480 msgid "" "Lets the program check the internet to see if updates to the program version " "are available, then notifies you about updates now and again." msgstr "" "Lässt das Programm via Internet überprüfen ob Updates für diese " "Programmversion verfügbar sind. Danach informiert es über die neuen Updates." #: ../src/gui/dialogs/prefDialog.cpp:482 msgid "" "By default, use an orthographic camera at startup. State files will override " "this preference." msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:483 msgid "Camera translation, orbit and swivel rates. " msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:484 msgid "Camera zooming rate." msgstr "Zoomgeschwindigkeit der Kamera" #: ../src/gui/dialogs/prefDialog.cpp:486 msgid "Reset the filter initial values back to program defaults" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:487 msgid "Reset all filter initial values back to program defaults" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:559 msgid "Filt. Default" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:561 msgid "Camera" msgstr "Kamera" #: ../src/gui/dialogs/ExportPos.cpp:63 msgid "Export:" msgstr "Exportieren:" #: ../src/gui/dialogs/ExportPos.cpp:64 #: ../src/backend/filters/boundingBox.cpp:567 msgid "Visible" msgstr "Sichtbar" #: ../src/gui/dialogs/ExportPos.cpp:65 msgid "Selected Data" msgstr "Daten auswählen" #: ../src/gui/dialogs/ExportPos.cpp:67 msgid "Available Data" msgstr "Verfügbare Daten" #: ../src/gui/dialogs/ExportPos.cpp:73 msgid "Selection" msgstr "Auswahl" #: ../src/gui/dialogs/ExportPos.cpp:98 ../src/gui/dialogs/ExportPos.cpp:101 msgid "Index" msgstr "Index" #: ../src/gui/dialogs/ExportPos.cpp:99 ../src/gui/dialogs/ExportPos.cpp:102 #: ../src/backend/filters/profile.cpp:604 #: ../src/backend/filters/spatialAnalysis.cpp:2520 #: ../src/backend/filters/spatialAnalysis.cpp:2613 #: ../src/backend/filters/spatialAnalysis.cpp:2673 #: ../src/backend/filters/spatialAnalysis.cpp:3628 #: ../src/backend/filters/spatialAnalysis.cpp:3831 #: ../src/backend/filters/spatialAnalysis.cpp:3890 #: ../src/backend/filters/spectrumPlot.cpp:65 msgid "Count" msgstr "Anzahl" #: ../src/gui/dialogs/ExportPos.cpp:451 msgid "Export Pos Data" msgstr "POS Daten exportieren" #: ../src/gui/dialogs/ExportPos.cpp:454 msgid "Tree of filters, select leaves to show ion data." msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:456 msgid "Add all data from all filters" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:457 msgid "Add all data from currently selected filter" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:458 msgid "Add selected data from currently selected filter" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:221 msgid "Show Overlays" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:246 msgid "e.g. H2O" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:561 #: ../src/gui/dialogs/rangeEditDialog.cpp:695 ../src/gui/mainFrame.cpp:5966 #: ../src/backend/filter.cpp:54 msgid "Plot" msgstr "Plot" #: ../src/gui/dialogs/rangeEditDialog.cpp:562 msgid "Short Name" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:563 msgid "Long Name" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:564 #: ../src/backend/filters/annotation.cpp:901 #: ../src/backend/filters/voxelise.cpp:976 #: ../src/backend/filters/profile.cpp:1155 #: ../src/backend/filters/spectrumPlot.cpp:676 msgid "Colour" msgstr "Farbe" #: ../src/gui/dialogs/rangeEditDialog.cpp:697 #: ../src/backend/filters/annotation.cpp:605 #: ../src/backend/filters/annotation.cpp:646 #: ../src/backend/filters/annotation.cpp:815 msgid "Start" msgstr "Anfang" #: ../src/gui/dialogs/rangeEditDialog.cpp:698 #: ../src/backend/filters/annotation.cpp:613 #: ../src/backend/filters/annotation.cpp:655 #: ../src/backend/filters/annotation.cpp:823 msgid "End" msgstr "Ende" #: ../src/gui/dialogs/rangeEditDialog.cpp:1260 msgid "Range or ion?" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1261 msgid "Select type to add" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1542 msgid "Range Editor" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1546 msgid "Enable or disable all overlays" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1547 msgid "Entered overlays, use delete to remove" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1548 msgid "Available plots for ranging" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1549 msgid "Enter species to display as overlay, e.g. SiO2" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1550 msgid "Editable ranges" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1551 msgid "Editable ions" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1588 msgid "Overlay" msgstr "" #: ../src/gui/mainFrame.cpp:119 msgid "New camera name..." msgstr "Neuer Kameraname..." #: ../src/gui/mainFrame.cpp:120 msgid "New stash name..." msgstr "" #: ../src/gui/mainFrame.cpp:125 msgid "New Filter..." msgstr "" #: ../src/gui/mainFrame.cpp:142 ../src/backend/filters/annotation.cpp:560 #: ../src/backend/filters/annotation.cpp:664 #: ../src/backend/filters/annotation.h:96 msgid "Annotation" msgstr "Kommentar" #: ../src/gui/mainFrame.cpp:143 msgid "Bounding Box" msgstr "Begrenzungs-Box" #: ../src/gui/mainFrame.cpp:144 ../src/backend/filters/ionClip.cpp:629 #: ../src/backend/filters/ionClip.h:66 msgid "Clipping" msgstr "Zuschneiden" #: ../src/gui/mainFrame.cpp:145 ../src/backend/filters/clusterAnalysis.h:151 msgid "Cluster Analysis" msgstr "Clusteranalyse" #: ../src/gui/mainFrame.cpp:146 msgid "Compos. Profiles" msgstr "Konz.Profil" #: ../src/gui/mainFrame.cpp:147 msgid "Downsampling" msgstr "Datenreduktion" #: ../src/gui/mainFrame.cpp:148 msgid "Extern. Prog." msgstr "Ext. Progr." #: ../src/gui/mainFrame.cpp:149 msgid "Ion Colour" msgstr "Ionenfarbe" #: ../src/gui/mainFrame.cpp:150 msgid "Ion Info" msgstr "Ion Info" #: ../src/gui/mainFrame.cpp:151 msgid "Ion Transform" msgstr "Ionentransform." #: ../src/gui/mainFrame.cpp:152 ../src/backend/filters/spectrumPlot.h:76 msgid "Spectrum" msgstr "Spektrum" #: ../src/gui/mainFrame.cpp:153 msgid "Range File" msgstr "Rangedatei" #: ../src/gui/mainFrame.cpp:154 ../src/backend/filters/spatialAnalysis.h:202 msgid "Spat. Analysis" msgstr "Räumliche Analyse" #: ../src/gui/mainFrame.cpp:155 ../src/backend/filters/voxelise.h:122 msgid "Voxelisation" msgstr "Voxelisation" #: ../src/gui/mainFrame.cpp:451 msgid "OpenGL Failed" msgstr "OpenGL fehlgeschlagen" #: ../src/gui/mainFrame.cpp:452 ../src/gui/mainFrame.cpp:454 msgid "" "Unable to initialise the openGL (3D) panel. Program cannot start. Please " "check your video drivers." msgstr "" "Kann das OpenGL (3D)-Panel nicht initialisieren. Das Programm kann nicht " "gestartet werden. Bitte überprüfen Sie Ihren Video-Treiber." #: ../src/gui/mainFrame.cpp:475 msgid "&Open...\tCtrl+O" msgstr "&Öffnen...\tCtrl+O" #: ../src/gui/mainFrame.cpp:475 msgid "Open state file" msgstr "Statusdatei öffnen" #: ../src/gui/mainFrame.cpp:476 msgid "&Merge...\tCtrl+Shift+O" msgstr "&Zusammenführen...\tCtrl+Shift+O" #: ../src/gui/mainFrame.cpp:476 msgid "Merge other file" msgstr "Merge other file" #: ../src/gui/mainFrame.cpp:480 msgid "&Recent" msgstr "&Letzte" #: ../src/gui/mainFrame.cpp:481 msgid "&Save\tCtrl+S" msgstr "&Speichern\tCtrl+S" #: ../src/gui/mainFrame.cpp:481 msgid "Save state to file" msgstr "Status in Datei speichern" #: ../src/gui/mainFrame.cpp:483 msgid "Save &As...\tCtrl+Shift+S" msgstr "Speichern &als...\tCtrl+Shift+S" #: ../src/gui/mainFrame.cpp:483 msgid "Save current state to new file" msgstr "Aktuellen Status als neue Datei speichern" #: ../src/gui/mainFrame.cpp:486 msgid "&Plot...\tCtrl+P" msgstr "&Plot...\tCtrl+P" #: ../src/gui/mainFrame.cpp:486 msgid "Export Current Plot" msgstr "Aktuellen Plot exportieren" #: ../src/gui/mainFrame.cpp:487 msgid "&Image...\tCtrl+I" msgstr "&Bild...\tCtrl+I" #: ../src/gui/mainFrame.cpp:487 msgid "Export Current 3D View" msgstr "Aktuelle 3D Ansicht exportieren" #: ../src/gui/mainFrame.cpp:488 msgid "Ion&s...\tCtrl+N" msgstr "Ion&en...\tCtrl+N" #: ../src/gui/mainFrame.cpp:488 msgid "Export Ion Data" msgstr "Ionendaten exportieren" #: ../src/gui/mainFrame.cpp:489 msgid "Ran&ges...\tCtrl+G" msgstr "Ran&ges...\tCtrl+G" #: ../src/gui/mainFrame.cpp:489 msgid "Export Range Data" msgstr "Rangedaten exportieren" #: ../src/gui/mainFrame.cpp:490 msgid "&Animate Filters...\tCtrl+T" msgstr "" #: ../src/gui/mainFrame.cpp:490 msgid "Export Animated Filter" msgstr "" #: ../src/gui/mainFrame.cpp:491 msgid "Ani&mate Camera...\tCtrl+M" msgstr "" #: ../src/gui/mainFrame.cpp:491 msgid "Export Animated Camera" msgstr "" #: ../src/gui/mainFrame.cpp:492 msgid "Pac&kage...\tCtrl+K" msgstr "Pa&ket...\tCtrl+K" #: ../src/gui/mainFrame.cpp:492 msgid "Export analysis package" msgstr "Analysepaket exportieren" #: ../src/gui/mainFrame.cpp:494 msgid "&Export" msgstr "&Exportieren" #: ../src/gui/mainFrame.cpp:497 msgid "&Quit\tCtrl+Q" msgstr "&Beenden\tCtrl+Q" #: ../src/gui/mainFrame.cpp:497 ../src/gui/mainFrame.cpp:499 msgid "Exit Program" msgstr "Programm beenden" #: ../src/gui/mainFrame.cpp:499 msgid "E&xit" msgstr "E&xit" #: ../src/gui/mainFrame.cpp:501 msgid "&File" msgstr "&Datei" #: ../src/gui/mainFrame.cpp:505 msgid "&Background Colour...\tCtrl+B" msgstr "&Hintergrundfarbe...\tCtrl+B" #: ../src/gui/mainFrame.cpp:505 msgid "Change background colour" msgstr "Hintergrundfarbe ändern" #: ../src/gui/mainFrame.cpp:509 msgid "&Control Pane\tF2" msgstr "&Kontrollfenster\tF2" #: ../src/gui/mainFrame.cpp:509 ../src/gui/mainFrame.cpp:512 msgid "Toggle left control pane" msgstr "Linkes Kontrollfenster ein/aus schalten" #: ../src/gui/mainFrame.cpp:512 msgid "&Control Pane\tAlt+C" msgstr "&Kontrollfenster\tAlt+C" #: ../src/gui/mainFrame.cpp:518 msgid "&Raw Data Pane\tF3" msgstr "&Rohdatenfenster\tF3" #: ../src/gui/mainFrame.cpp:518 ../src/gui/mainFrame.cpp:521 msgid "Toggle raw data pane (bottom)" msgstr "Rohdatenfenster (unten)" #: ../src/gui/mainFrame.cpp:521 msgid "&Raw Data Pane\tAlt+R" msgstr "&Rohdatenfenster\tAlt+R" #: ../src/gui/mainFrame.cpp:525 msgid "&Plot List\tF4" msgstr "&Plot Liste\tF4" #: ../src/gui/mainFrame.cpp:525 ../src/gui/mainFrame.cpp:527 msgid "Toggle plot list" msgstr "Plotliste ein/aus schalten" #: ../src/gui/mainFrame.cpp:527 msgid "&Plot List\tAlt+P" msgstr "&Plot Liste\tAlt+P" #: ../src/gui/mainFrame.cpp:533 msgid "&Legend\tCtrl+L" msgstr "&Legende\tCtrl+L" #: ../src/gui/mainFrame.cpp:533 msgid "Toggle Legend display" msgstr "Legende anzeigen ein/aus" #: ../src/gui/mainFrame.cpp:535 msgid "P&lot..." msgstr "P&lot..." #: ../src/gui/mainFrame.cpp:536 msgid "&Axis\tCtrl+Shift+I" msgstr "&Achsen\tCtrl+Shift+I" #: ../src/gui/mainFrame.cpp:536 msgid "Toggle World Axis display" msgstr "Hauptachsen ein/aus schalten" #: ../src/gui/mainFrame.cpp:541 msgid "&Fullscreen mode\tF11" msgstr "&Vollbildmodus\tF11" #: ../src/gui/mainFrame.cpp:541 ../src/gui/mainFrame.cpp:543 msgid "Next fullscreen mode: with toolbars" msgstr "Nächster Vollbildmodus: ohne Werkzeugleisten" #: ../src/gui/mainFrame.cpp:543 msgid "&Fullscreen mode\tCtrl+Shift+F" msgstr "&Vollbildmodus\tCtrl+Shift+F" #: ../src/gui/mainFrame.cpp:548 msgid "&Undo\tCtrl+Z" msgstr "&Zurück\tCtrl+Z" #: ../src/gui/mainFrame.cpp:550 msgid "&Redo\tCtrl+Y" msgstr "&Wiederholen\tCtrl+Y" #: ../src/gui/mainFrame.cpp:553 msgid "&Range" msgstr "" #: ../src/gui/mainFrame.cpp:556 msgid "&Preferences" msgstr "&Voreinstellungen" #: ../src/gui/mainFrame.cpp:558 msgid "&Edit" msgstr "&Bearbeiten" #: ../src/gui/mainFrame.cpp:561 msgid "&View" msgstr "&Ansicht" #: ../src/gui/mainFrame.cpp:563 msgid "&Help...\tCtrl+H" msgstr "&Hilfe...\tCtrl+H" #: ../src/gui/mainFrame.cpp:563 msgid "Show help files and documentation" msgstr "Hilfedateien und Dokumentation anzeigen" #: ../src/gui/mainFrame.cpp:564 msgid "&Contact..." msgstr "&Kontakt..." #: ../src/gui/mainFrame.cpp:564 msgid "Open contact page" msgstr "Kontaktseite öffnen" #: ../src/gui/mainFrame.cpp:566 msgid "&About..." msgstr "Über 3Depict..." #: ../src/gui/mainFrame.cpp:566 msgid "Information about this program" msgstr "Informationen zu diesem Programm" #: ../src/gui/mainFrame.cpp:567 msgid "&Help" msgstr "&Hilfe" #: ../src/gui/mainFrame.cpp:569 msgid "Stashed Filters" msgstr "Zwischengelagerte Filter" #: ../src/gui/mainFrame.cpp:574 msgid "New Filters" msgstr "" #: ../src/gui/mainFrame.cpp:604 msgid "Auto Refresh" msgstr "" "Autom.\n" "aktualisieren" #: ../src/gui/mainFrame.cpp:610 msgid "Filter settings" msgstr "Filtereinstellungen" #: ../src/gui/mainFrame.cpp:613 msgid "Camera Name" msgstr "Kameraname" #: ../src/gui/mainFrame.cpp:625 msgid "Resize to Fit" msgstr "" #: ../src/gui/mainFrame.cpp:627 msgid "3D Post-processing" msgstr "3D Nachbearbeitung" #: ../src/gui/mainFrame.cpp:629 msgid "Enable Cropping" msgstr "Zuschneiden aktivieren" #: ../src/gui/mainFrame.cpp:631 ../src/gui/mainFrame.cpp:642 msgid "x-y" msgstr "x-y" #: ../src/gui/mainFrame.cpp:632 ../src/gui/mainFrame.cpp:643 msgid "x-z" msgstr "x-z" #: ../src/gui/mainFrame.cpp:633 ../src/gui/mainFrame.cpp:644 msgid "y-x" msgstr "y-x" #: ../src/gui/mainFrame.cpp:634 ../src/gui/mainFrame.cpp:645 msgid "y-z" msgstr "y-z" #: ../src/gui/mainFrame.cpp:635 ../src/gui/mainFrame.cpp:646 msgid "z-x" msgstr "z-x" #: ../src/gui/mainFrame.cpp:636 ../src/gui/mainFrame.cpp:647 msgid "z-y" msgstr "z-y" #: ../src/gui/mainFrame.cpp:651 msgid "Use camera coordinates" msgstr "Verwende Kamerakoordinaten" #: ../src/gui/mainFrame.cpp:652 msgid "dX" msgstr "dX" #: ../src/gui/mainFrame.cpp:654 msgid "dY" msgstr "dY" #: ../src/gui/mainFrame.cpp:656 msgid "dZ" msgstr "dZ" #: ../src/gui/mainFrame.cpp:658 msgid "Enable Anaglyphic Stereo" msgstr "Anaglyphic Stereo aktivieren" #: ../src/gui/mainFrame.cpp:659 msgid "Flip Channels" msgstr "Kanäle tauschen" #: ../src/gui/mainFrame.cpp:660 msgid "Anaglyph Mode" msgstr "Anaglyphmodus" #: ../src/gui/mainFrame.cpp:662 msgid "Red-Blue" msgstr "Rot-Blau" #: ../src/gui/mainFrame.cpp:663 msgid "Red-Green" msgstr "Rot-Grün" #: ../src/gui/mainFrame.cpp:664 msgid "Red-Cyan" msgstr "Rot-Zyan" #: ../src/gui/mainFrame.cpp:665 msgid "Green-Magenta" msgstr "Grün-Magenta" #: ../src/gui/mainFrame.cpp:669 msgid "Baseline Separation" msgstr "Basislinienabstand" #: ../src/gui/mainFrame.cpp:671 ../src/backend/filters/annotation.cpp:906 #: ../src/backend/filters/voxelise.cpp:938 #: ../src/backend/filters/voxelise.cpp:1106 #: ../src/backend/filters/profile.cpp:1164 #: ../src/backend/filters/boundingBox.cpp:731 #: ../src/backend/filters/dataLoad.cpp:666 #: ../src/backend/filters/spectrumPlot.cpp:683 msgid "Appearance" msgstr "" #: ../src/gui/mainFrame.cpp:672 msgid "Smooth && translucent objects" msgstr "Glatte && durchsichtige Objekte" #: ../src/gui/mainFrame.cpp:674 msgid "3D lighting" msgstr "3D Beleuchtung" #: ../src/gui/mainFrame.cpp:677 msgid "Performance" msgstr "" #: ../src/gui/mainFrame.cpp:678 msgid "Fast and weak randomisation." msgstr "Schnelle aber schwache Randomisierung" #: ../src/gui/mainFrame.cpp:680 msgid "Limit Output Pts" msgstr "" #: ../src/gui/mainFrame.cpp:685 msgid "Filter caching" msgstr "Filter zwischenspeichern" #: ../src/gui/mainFrame.cpp:687 msgid "Max. Ram usage (%)" msgstr "Max. RAM-Nutzung (%)" #: ../src/gui/mainFrame.cpp:759 msgid "Warning: Your configuration file appears to be invalid:\n" msgstr "Warnung: Ihre Konfigurationsdatei scheint ungültig zu sein.\n" #: ../src/gui/mainFrame.cpp:760 msgid "\tConfig Load: " msgstr "\tConfig Load: " #: ../src/gui/mainFrame.cpp:1054 msgid "Current state has not been saved, would you like to save it now?" msgstr "" #: ../src/gui/mainFrame.cpp:1055 msgid "State changed" msgstr "" #: ../src/gui/mainFrame.cpp:1073 msgid "Readable files (*.xml, *.pos, *.txt,*.csv, *.ato)" msgstr "Lesbare Dateien (*.xml, *.pos, *.txt,*.csv,*.ato)" #: ../src/gui/mainFrame.cpp:1075 msgid "XML State File (*.xml)" msgstr "" #: ../src/gui/mainFrame.cpp:1076 msgid "POS File (*.pos)" msgstr "" #: ../src/gui/mainFrame.cpp:1077 msgid "LAWATAP ATO File (*.ato)" msgstr "" #: ../src/gui/mainFrame.cpp:1078 msgid "Text File (*.txt, *.csv)" msgstr "" #: ../src/gui/mainFrame.cpp:1079 msgid "All Files (*)" msgstr "" #: ../src/gui/mainFrame.cpp:1092 ../src/gui/mainFrame.cpp:1141 msgid "Select Data or State File..." msgstr "Daten oder Statusdatei auswählen..." #: ../src/gui/mainFrame.cpp:1142 msgid "" "3Depict file (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS File (*.pos)|*.pos|" "XML State File (*.xml)|*.xml|All Files (*)|*" msgstr "" "3Depictdateien (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS Datei (*.pos)|*." "pos|XML Status Datei (*.xml)|*.xml|All Files (*)|*" #: ../src/gui/mainFrame.cpp:1153 msgid "Merged file." msgstr "Datei zusammengeführt." #: ../src/gui/mainFrame.cpp:1256 msgid "Tip: You can use ⌘ (command) to merge" msgstr "Tip: Sie können ⌘ (command) zum Zusammenführen verwenden" #: ../src/gui/mainFrame.cpp:1258 msgid "Tip: You can use ctrl to merge" msgstr "Tip: Sie können strg zum Zusammen führen verwenden" #: ../src/gui/mainFrame.cpp:1292 msgid "Load error" msgstr "Fehler beim Laden" #: ../src/gui/mainFrame.cpp:1293 msgid "" "Error loading state file.\n" "See console for more info." msgstr "" "Fehler beim Laden der Statusdatei.\n" "Konsole für mehr Informationen." #: ../src/gui/mainFrame.cpp:1301 msgid "" "This state file contains filters that can be unsafe to run\n" "Do you wish to remove these before continuing?." msgstr "" "Diese Statusdatei enthält Filter deren Anwendung möglicherweise unsicher " "ist. Wollen Sie diese entfernen." #: ../src/gui/mainFrame.cpp:1302 msgid "Security warning" msgstr "Sicherheitswarnung" #: ../src/gui/mainFrame.cpp:1484 ../src/gui/mainFrame.cpp:1580 #: ../src/gui/mainFrame.cpp:2010 msgid "Unable to save" msgstr "Speichern nicht möglich" #: ../src/gui/mainFrame.cpp:1485 msgid "No plot available. Please create a plot before exporting." msgstr "Kein Plot vefügbar. Plot muss vor dem Exportieren erzeugt werden." #: ../src/gui/mainFrame.cpp:1489 msgid "Save plot..." msgstr "Plot speichern..." #: ../src/gui/mainFrame.cpp:1490 msgid "" "By Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*." "svg|PNG File (*.png)|*.png|All Files (*)|*" msgstr "" "Dateierweiterung (svg,png)|*.svg;*.png|Skalierbare Vektorgrafik (*.svg)|*." "svg|PNG Datei (*.png)|*.png|Alle Dateien (*)|*" #: ../src/gui/mainFrame.cpp:1544 msgid "Select type for save" msgstr "" #: ../src/gui/mainFrame.cpp:1545 msgid "Choose file type" msgstr "" #: ../src/gui/mainFrame.cpp:1565 ../src/gui/mainFrame.cpp:1622 #: ../src/gui/mainFrame.cpp:1658 msgid "Choose resolution" msgstr "Auflösung auswählen" #: ../src/gui/mainFrame.cpp:1581 msgid "Unknown file extension. Please use \"svg\" or \"png\"" msgstr "Unbekannte Dateierweiterung. Bitte verwenden Sie \"svg\" oder \"png\"" #: ../src/gui/mainFrame.cpp:1592 msgid "Saved plot: " msgstr "Gespeicherter Plot:" #: ../src/gui/mainFrame.cpp:1599 ../src/gui/mainFrame.cpp:1651 msgid "Save Image..." msgstr "Speichere Bild..." #: ../src/gui/mainFrame.cpp:1600 ../src/gui/mainFrame.cpp:1652 msgid "PNG File (*.png)|*.png|All Files (*)|*" msgstr "PNG Datei (*.png)|*.png|Alle Dateien (*)|*" #: ../src/gui/mainFrame.cpp:1614 msgid "File already exists. Overwrite?" msgstr "" #: ../src/gui/mainFrame.cpp:1615 ../src/gui/mainFrame.cpp:2407 #: ../src/gui/mainFrame.cpp:2513 ../src/gui/mainFrame.cpp:2536 msgid "Overwrite?" msgstr "Überschreiben?" #: ../src/gui/mainFrame.cpp:1642 ../src/gui/mainFrame.cpp:1718 msgid "Saved 3D View :" msgstr "Gespeicherte 3D Ansicht" #: ../src/gui/mainFrame.cpp:1672 msgid "Program limitation" msgstr "Programmeinschränkung" #: ../src/gui/mainFrame.cpp:1673 msgid "" "Limitation on the screenshot dimension; please ensure that both width and " "height exceed the initial values,\n" " or that they are smaller than the initial values.\n" " If this bothers, please submit a bug." msgstr "" "Beschränkung der Screenshot Dimensionen; stellen Sie bitte sicher, dass " "Breite und Höhe die ursprünglichen Werte überschreiten, oder dass diese " "kleiner als die ursprünglichen Werte sind. Sollte Sie dies stören, melden " "Sie bitte einen Bug." #: ../src/gui/mainFrame.cpp:1690 msgid "Number of frames" msgstr "Bilderanzahl" #: ../src/gui/mainFrame.cpp:1744 msgid "Abo&rt" msgstr "" #: ../src/gui/mainFrame.cpp:1746 msgid "&Refresh" msgstr "" #: ../src/gui/mainFrame.cpp:1855 msgid "Cannot animate with no filters." msgstr "" #: ../src/gui/mainFrame.cpp:1933 msgid "Animating" msgstr "" #: ../src/gui/mainFrame.cpp:1934 msgid "Performing refresh" msgstr "" #: ../src/gui/mainFrame.cpp:1960 msgid "Filter property change failed" msgstr "" #: ../src/gui/mainFrame.cpp:1982 msgid "Refresh failed on frame :" msgstr "" #: ../src/gui/mainFrame.cpp:2011 msgid "Image save failed for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2036 msgid "Ion save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2037 msgid "Unable to save ions for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2068 msgid "Plot save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2069 msgid "Unable to save plot or frame " msgstr "" #: ../src/gui/mainFrame.cpp:2110 msgid "Range save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2111 msgid "Unable to save range for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2140 msgid "Voxel save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2141 msgid "Unable to save voxels for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2170 msgid "Animate failed" msgstr "" #: ../src/gui/mainFrame.cpp:2194 ../src/gui/mainFrame.cpp:2360 #: ../src/gui/mainFrame.cpp:2468 msgid "No filters means no data to export" msgstr "Keine Filter bedeutet keine Daten zum Exportieren" #: ../src/gui/mainFrame.cpp:2208 msgid "Package name" msgstr "Paketname" #: ../src/gui/mainFrame.cpp:2209 msgid "Package directory name" msgstr "Paketverzeichnis" #: ../src/gui/mainFrame.cpp:2211 msgid "AnalysisPackage" msgstr "Analysepaket" #: ../src/gui/mainFrame.cpp:2224 msgid "Package folder already exists, won't overwrite." msgstr "Paketverzeichnis existiert bereits. Werde es nicht überschreiben." #: ../src/gui/mainFrame.cpp:2225 msgid "Not available" msgstr "Nicht verfügbar" #: ../src/gui/mainFrame.cpp:2250 msgid "" "Package folder creation failed\n" "check writing to this location is possible." msgstr "" "Anlegen des Paketverzeichnisses fehlgeschlagen\n" "Überprüfen Sie ob der angegenbene Ort schreibgeschützt ist." #: ../src/gui/mainFrame.cpp:2251 msgid "Folder creation failed" msgstr "Anlegen des Ordners ist fehlgeschlagen" #: ../src/gui/mainFrame.cpp:2271 msgid "Copying" msgstr "kopiere" #: ../src/gui/mainFrame.cpp:2272 msgid "Copying referenced files" msgstr "Copying referenced files" #: ../src/gui/mainFrame.cpp:2338 msgid "Error copying file" msgstr "Fehler beim Kopieren der Datei" #: ../src/gui/mainFrame.cpp:2347 msgid "Saved package: " msgstr "Gespeicherte Pakete: " #: ../src/gui/mainFrame.cpp:2371 msgid "Export" msgstr "Exportieren" #: ../src/gui/mainFrame.cpp:2377 msgid "" "POS Data (*.pos)|*.pos|Text File (*.txt)|*.txt|VTK Legacy (*.vtk)|*.vtk|All " "Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2406 ../src/gui/mainFrame.cpp:2512 msgid "File already exists, overwrite?" msgstr "Datei existiert bereits. Überschreiben?" #: ../src/gui/mainFrame.cpp:2447 msgid "Saved ions: " msgstr "Gespeicherte Ionen:" #: ../src/gui/mainFrame.cpp:2472 msgid "Export Ranges" msgstr "Range exportieren" #: ../src/gui/mainFrame.cpp:2494 msgid "Save state..." msgstr "Speichere Status..." #: ../src/gui/mainFrame.cpp:2495 msgid "XML state file (*.xml)|*.xml|All Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2535 msgid "Files have been referred to using relative paths. Keep relative paths?" msgstr "" "Auf Dateien wurde mit relativen Pfaden verwiesen. Relative Pfade beibehalten?" #: ../src/gui/mainFrame.cpp:2568 msgid "Saved state: " msgstr "Gespeicherter Status: " #: ../src/gui/mainFrame.cpp:2644 msgid "Range editor" msgstr "" #: ../src/gui/mainFrame.cpp:2901 msgid "Manual not found locally. Launching web browser" msgstr "Anleitung konnte lokal nicht gefunden werden. Starte Webbrowser" #: ../src/gui/mainFrame.cpp:2910 msgid "Opening contact page in external web browser" msgstr "Öffne Kontaktseite in externem Browser" #: ../src/gui/mainFrame.cpp:2918 msgid "No filter stashes to edit." msgstr "Keine Filterstashes zum Bearbeiten." #: ../src/gui/mainFrame.cpp:2922 msgid "Filter Stashes" msgstr "Filter Stashes" #: ../src/gui/mainFrame.cpp:2939 msgid "Quick and dirty analysis for point data." msgstr "\"Quick and dirty\" Analyse von Punktdaten." #: ../src/gui/mainFrame.cpp:2949 msgid "Compiled with wx Version: " msgstr "Kompiliert mit wx Version: " #: ../src/gui/mainFrame.cpp:2970 msgid "Press enter to store new stash" msgstr "Eingabe drücken um neuen Filterstash zu speichern" #: ../src/gui/mainFrame.cpp:2976 msgid "Press enter to restore stash" msgstr "Eingabe drücken um Stash wiederherzustellen" #: ../src/gui/mainFrame.cpp:3009 msgid "Unable to create stash, selection invalid" msgstr "Stash kann nicht erstellt werden, Auswahl ungültig" #: ../src/gui/mainFrame.cpp:3016 msgid "Created new filter tree stash" msgstr "Neuer Filterstash wurde erzeugt" #: ../src/gui/mainFrame.cpp:3123 msgid "Filter type not a data source - can't be at tree base" msgstr "" #: ../src/gui/mainFrame.cpp:3263 msgid "Moving - Hold ⌘ (command) to copy" msgstr "Verschieben - Halte ⌘ (command) um zu kopieren" #: ../src/gui/mainFrame.cpp:3265 msgid "Moving - Hold control to copy" msgstr "Verschieben - Halte Strg zum kopieren" #: ../src/gui/mainFrame.cpp:3604 msgid "Press enter to store new camera" msgstr "Eingabe drücken um neue Kamera zu speichern" #: ../src/gui/mainFrame.cpp:3606 msgid "Press enter to restore camera" msgstr "Eingabe drücken um Kamera wiederherzustellen" #: ../src/gui/mainFrame.cpp:3631 ../src/gui/mainFrame.cpp:3672 msgid "Restored camera: " msgstr "Wiederhergestellte Kamera: " #: ../src/gui/mainFrame.cpp:3649 msgid "Stored camera: " msgstr "Gespeicherte Kamera: " #: ../src/gui/mainFrame.cpp:3735 msgid "Select an item from the filter tree before choosing a new filter" msgstr "" "Aktivieren Sie zuerst ein Punkt aus dem Filterverlauf bevor Sie einen neuen " "Filter auswählen" #: ../src/gui/mainFrame.cpp:3737 msgid "Load data source (file->open) before choosing a new filter" msgstr "Lade Datenquelle (Datei->öffnen) vor dem Auswählen eines neuen Filters" #: ../src/gui/mainFrame.cpp:3763 msgid "Select RNG File..." msgstr "RNG Datei auswählen..." #: ../src/gui/mainFrame.cpp:3784 msgid "Failed reading range file." msgstr "Fehler beim Lesen der Rangedatei." #: ../src/gui/mainFrame.cpp:3788 msgid "Error loading file" msgstr "Fehler beim Laden der Datei" #: ../src/gui/mainFrame.cpp:3849 ../src/gui/mainFrame.cpp:3944 #: ../src/gui/mainFrame.cpp:5449 ../src/gui/mainFrame.cpp:5968 msgid "Cons." msgstr "Kons." #: ../src/gui/mainFrame.cpp:3907 msgid "Refresh Aborted." msgstr "Aktualisieren abgebrochen" #: ../src/gui/mainFrame.cpp:3948 msgid "*Cons." msgstr "" #: ../src/gui/mainFrame.cpp:3950 msgid "§Cons." msgstr "§Kons." #: ../src/gui/mainFrame.cpp:4007 msgid "Complete" msgstr "" #: ../src/gui/mainFrame.cpp:4105 msgid "msgs" msgstr "" #: ../src/gui/mainFrame.cpp:4146 msgid "Autosave complete." msgstr "Autosave beendet." #: ../src/gui/mainFrame.cpp:4350 msgid "Aborting...." msgstr "" #: ../src/gui/mainFrame.cpp:4416 msgid "Updated." msgstr "Updated." #: ../src/gui/mainFrame.cpp:4425 msgid "Calculating..." msgstr "" #: ../src/gui/mainFrame.cpp:4428 msgid "\\% Done (Esc aborts)" msgstr "\\% fertig (Esc abbrechen)" #: ../src/gui/mainFrame.cpp:4430 msgid "\\% Done" msgstr "\\% fertig" #: ../src/gui/mainFrame.cpp:4704 msgid "Tip: You can shift-click to force full refresh, if required" msgstr "Tipp: Verwende shift-click um komplettes Aktualisieren zu erzwingen" #: ../src/gui/mainFrame.cpp:4766 msgid "No data to save" msgstr "Keine Daten zum Sichern" #: ../src/gui/mainFrame.cpp:4950 msgid "Aborting..." msgstr "Abbrechen..." #: ../src/gui/mainFrame.cpp:4956 msgid "" "Waiting for refresh to abort. Exiting could lead to the program " "backgrounding. Exit anyway? " msgstr "" "Waiting for refresh to abort. Exiting could lead to the program " "backgrounding. Exit anyway? " #: ../src/gui/mainFrame.cpp:4957 ../src/gui/mainFrame.cpp:4977 msgid "Confirmation request" msgstr "Bestätigungsabfrage" #: ../src/gui/mainFrame.cpp:4976 msgid "Are you sure you wish to exit 3Depict?" msgstr "Sind Sie sicher, dass Sie 3Depict beenden wollen?" #: ../src/gui/mainFrame.cpp:5314 ../src/gl/cameras.cpp:627 #: ../src/gl/cameras.cpp:730 msgid "Orthogonal" msgstr "Orthogonal" #: ../src/gui/mainFrame.cpp:5477 msgid "Update Notice: New version " msgstr "Updatenotiz: Neue Version " #: ../src/gui/mainFrame.cpp:5477 msgid " found online." msgstr " online gefunden." #: ../src/gui/mainFrame.cpp:5481 msgid "Online Check: " msgstr "Überprüfe online:" #: ../src/gui/mainFrame.cpp:5481 msgid " is up-to-date." msgstr "ist up-to-date." #: ../src/gui/mainFrame.cpp:5571 msgid "An auto-save state was found, would you like to restore it?." msgstr "Ein auto-save Status wurde gefunden. Wollen Sie ihn wiederherstellen?" #: ../src/gui/mainFrame.cpp:5572 msgid "Autosave" msgstr "Automatisch speichern" #: ../src/gui/mainFrame.cpp:5579 msgid "Unable to load autosave file.." msgstr "Kann Autosavedatei nicht laden.." #: ../src/gui/mainFrame.cpp:5770 msgid "List of available filters" msgstr "Liste der verfügbaren Filter" #: ../src/gui/mainFrame.cpp:5772 msgid "Tree - drag to move items, hold ⌘ for copy. Tap delete to remove items" msgstr "" #: ../src/gui/mainFrame.cpp:5774 msgid "" "Tree - drag to move items, hold Ctrl for copy. Tap delete to remove items." msgstr "" #: ../src/gui/mainFrame.cpp:5776 msgid "" "Enable/Disable automatic updates of data when filter change takes effect" msgstr "" "Ein/Ausschalten vom automatischen Aktualisieren der Daten wenn Änderungen am " "Filter wirksam werden" #: ../src/gui/mainFrame.cpp:5779 msgid "" "Enable/Disable \"Alpha blending\" (transparency) in rendering system. " "Blending is used to smooth objects (avoids artefacts known as \"jaggies\") " "and to make transparent surfaces. Disabling will provide faster rendering " "but look more blocky" msgstr "" "Ein/Ausschalten des \"Alpha blending\" (Transparenz) im Rendersystem. Dieses " "wird verwendet um ebene Objekte (vermeidet Artefakte bekannt als jaggies) " "und transparente Oberflächen zu generieren. Ausschalten erlaubt schnelleres " "Renden führt jedoch zu blockigerer Darstellung." #: ../src/gui/mainFrame.cpp:5780 msgid "" "Enable/Disable lighting calculations in rendering, for objects that request " "this. Lighting provides important depth cues for objects comprised of 3D " "surfaces. Disabling may allow faster rendering in complex scenes" msgstr "" "Ein/Ausschalten der Beleuchtungseffekte beim Rendern von Objekten die dies " "anfordern. Beleuchtung bietet wichtige 'depth cues' für mit 3D Oberflächen " "umrandete Objekte. Deaktivieren erlaubt u.U. schnelleres Rendern bei " "komplizierten Szenen." #: ../src/gui/mainFrame.cpp:5781 msgid "" "Enable/Disable weak randomisation (Galois linear feedback shift register). " "Strong randomisation uses a much slower random selection method, but " "provides better protection against inadvertent correlations, and is " "recommended for final analyses" msgstr "" "Ein/Ausschalten der schwachen Randomisierung (Galois linear feedback shift " "register). Starke Randomisierung verwendet einen viel langsamere " "Auswahlmethode bietet dafür aber einen besseren Schutz gegen unbeabsichtigte " "Korrelationen und wird für die endgültige Analyse empfohlen." #: ../src/gui/mainFrame.cpp:5783 msgid "" "Limit the number of points that can be displayed in the 3D scene. Does not " "affect filter tree calculations. Disabling this can severely reduce " "performance, due to large numbers of points being visible at once." msgstr "" #: ../src/gui/mainFrame.cpp:5784 msgid "" "Enable/Disable caching of intermediate results during filter updates. " "Disabling caching will use less system RAM, though changes to any filter " "property will cause the entire filter tree to be recomputed, greatly slowing " "computations" msgstr "" "Ein/Ausschalten des Zwischenspeicherns von Ergebnissen während " "Filteraktualisierungen. Dies verbraucht weniger RAM, führt jedoch dazu, dass " "bei Änderungen der Filterparameter der ganze Filterbaum neu berechnet wird. " "Dies erhöht den Rechenaufwand deutlich." #: ../src/gui/mainFrame.cpp:5786 msgid "Camera data information" msgstr "Kamerainformation" #: ../src/gui/mainFrame.cpp:5790 msgid "Enable/disable visual effects on final 3D output" msgstr "Ein/Ausschalten von visuellen Effekten in der finalen 3D Ausgabe." #: ../src/gui/mainFrame.cpp:5792 msgid "Enable cropping post-process effect" msgstr "Cropping post-Prozess Effect einschalten" #: ../src/gui/mainFrame.cpp:5795 msgid "" "Colour based 3D effect enable/disable - requires appropriate colour filter " "3D glasses." msgstr "" "Farbbasierte 3D-Effekte ein/ausschalten - erfordert geeignete 3D-Brillen" #: ../src/gui/mainFrame.cpp:5796 msgid "Glasses colour mode" msgstr "Brillenfarbmodus" #: ../src/gui/mainFrame.cpp:5798 msgid "" "Level of separation between left and right images, which sets 3D depth to " "visual distortion tradeoff" msgstr "" "Level of separation between left and right images, which sets 3D depth to " "visual distortion tradeoff" #: ../src/gui/mainFrame.cpp:5802 msgid "X" msgstr "X" #: ../src/gui/mainFrame.cpp:5803 msgid "Y" msgstr "Y" #: ../src/gui/mainFrame.cpp:5804 msgid "Save raw data to file" msgstr "Speichere Rohdaten in Datei" #: ../src/gui/mainFrame.cpp:5805 msgid "Copy raw data to clipboard" msgstr "Kopiere Rohdaten in die Zwischenablage" #: ../src/gui/mainFrame.cpp:5806 msgid "Manage \"stashed\" data." msgstr "" #: ../src/gui/mainFrame.cpp:5807 msgid "Program text output" msgstr "Programm Textausgabe" #: ../src/gui/mainFrame.cpp:5808 msgid "Select active camera, or type to create new named camera" msgstr "" #: ../src/gui/mainFrame.cpp:5809 msgid "Remove the selected camera" msgstr "Ausgewählte Kamera entfernen" #: ../src/gui/mainFrame.cpp:5810 msgid "Perform cropping from coordinate frame of camera" msgstr "" #: ../src/gui/mainFrame.cpp:5811 msgid "" "Set the maximum amount of RAM to use in order to speed repeat computations" msgstr "" #: ../src/gui/mainFrame.cpp:5812 msgid "Collapse the filter tree" msgstr "" #: ../src/gui/mainFrame.cpp:5813 msgid "Expand the filter tree" msgstr "" #: ../src/gui/mainFrame.cpp:5814 msgid "Process the filter tree, hold shift to purge cached filter data" msgstr "" #: ../src/gui/mainFrame.cpp:5928 msgid "Crop" msgstr "Zuschneiden" #: ../src/gui/mainFrame.cpp:5929 msgid "Stereo" msgstr "Stereo" #: ../src/gui/mainFrame.cpp:5946 #: ../src/backend/filters/externalProgram.cpp:596 #: ../src/backend/filters/ionColour.cpp:308 #: ../src/backend/filters/spectrumPlot.cpp:612 msgid "Data" msgstr "Daten" #: ../src/gui/mainFrame.cpp:5947 msgid "Cam" msgstr "Cam" #: ../src/gui/mainFrame.cpp:5948 msgid "Post" msgstr "Post" #: ../src/gui/mainFrame.cpp:5949 msgid "Tools" msgstr "Werkz." #: ../src/gui/mainFrame.cpp:5967 msgid "Raw" msgstr "Roh" #: ../src/gui/mainFrame.cpp:6010 msgid "Align Camera" msgstr "" #: ../src/gui/mathglPane.cpp:259 msgid "No plots selected." msgstr "Kein Plot ausgewählt." #: ../src/gui/mathglPane.cpp:1201 msgid "" "Unable to allocate requested memory.\n" " Try a lower resolution, or save as vector (SVG)." msgstr "" "Kann den notwendigen Speicher nicht zuordnen. Versuche eine geringer " "Auflösung oder speichere als Vektografik (svg)." #: ../src/gui/mathglPane.cpp:1203 msgid "Plotting functions returned an error:\n" msgstr "Plot-Funktion meldete einen Fehler:\n" #: ../src/gui/mathglPane.cpp:1205 msgid "File readback check failed" msgstr "File readback check failed" #: ../src/gui/mathglPane.cpp:1207 msgid "Filesize during readback appears to be zero." msgstr "Filesize during readback appears to be zero." #: ../src/backend/filter.cpp:55 msgid "2D Plot" msgstr "" #: ../src/backend/filter.cpp:56 msgid "Draw" msgstr "Zeichnen" #: ../src/backend/filter.cpp:57 msgid "Range" msgstr "Range" #: ../src/backend/filter.cpp:58 msgid "Voxel" msgstr "Voxel" #: ../src/backend/filter.cpp:192 ../src/backend/filters/ionColour.cpp:411 msgid "Aborted" msgstr "Abgebrochen" #: ../src/backend/state.cpp:151 msgid "" "This file is a \"state\" file for the 3Depict program, and stores " "information about a particular analysis session. This file should be a valid " "\"XML\" file" msgstr "" "Diese Datei ist ein \"Status\" Datei für das Programm 3Depict. Sie speichert " "Informationen über die jeweiligen Analysesitzung. Dies sollte ein gültige " "\"XML\" Datei sein." #: ../src/backend/state.cpp:319 msgid "Failed to allocate parser" msgstr "Kann Parser nicht zuordnen" #: ../src/backend/state.cpp:354 msgid "" "Unable to retrieve root node in input state file... Is this really a non-" "empty XML file?" msgstr "" #: ../src/backend/state.cpp:361 msgid "Base state node missing. Is this really a state XML file??" msgstr "" #: ../src/backend/state.cpp:390 msgid "State was created by a newer version of this program.. " msgstr "Status wurde von einer neueren Version dieses Programmes erstellt.. " #: ../src/backend/state.cpp:391 msgid "file reading will continue, but may fail." msgstr "Datei wird weiter eingelesen kann aber unter Umständen fehlschlagen." #: ../src/backend/state.cpp:396 msgid "" "Warning, unparseable version number in state file. File reading will " "continue, but may fail" msgstr "" "Warnung: Nicht lesbare Versionsnummer in Statusdatei. Datei wird weiter " "eingelesen kann aber unter Umständen fehlschlagen." #: ../src/backend/state.cpp:403 msgid "Unable to find the \"writer\" node" msgstr "Kann \"writer\" node nicht finden" #: ../src/backend/state.cpp:413 msgid "Unable to find the \"backcolour\" node." msgstr "Unable to find the \"backcolour\" node." #: ../src/backend/state.cpp:420 msgid "\"backcolour\" node missing \"r\" value." msgstr "\"backcolour\" node fehlt \"r\" Wert." #: ../src/backend/state.cpp:425 msgid "Unable to interpret \"backColour\" node's \"r\" value." msgstr "Kann \"backColour\" node's \"r\" Wert nicht interpretieren." #: ../src/backend/state.cpp:433 msgid "\"backcolour\" node missing \"g\" value." msgstr "\"backcolour\" node fehlt \"g\" Wert." #: ../src/backend/state.cpp:439 msgid "Unable to interpret \"backColour\" node's \"g\" value." msgstr "Kann \"backColour\" node's \"g\" Wert nicht interpretieren." #: ../src/backend/state.cpp:447 msgid "\"backcolour\" node missing \"b\" value." msgstr "\"backcolour\" node fehlt \"b\" Wert." #: ../src/backend/state.cpp:453 msgid "Unable to interpret \"backColour\" node's \"b\" value." msgstr "Kann \"backColour\" node's \"b\" Wert nicht interpretieren." #: ../src/backend/state.cpp:460 msgid "\"backcolour\"s rgb values must be in range [0,1]" msgstr "\"backcolour\"s rgb Wert muss im Bereich [0,1] liegen" #: ../src/backend/state.cpp:488 msgid "Unable to find or interpret \"showaxis\" node" msgstr "Kann \"showaxis\" node nicht interpretieren" #: ../src/backend/state.cpp:532 msgid "Unable to locate \"filtertree\" node." msgstr "Kann \"filtertree\" node nicht finden." #: ../src/backend/state.cpp:548 msgid "Cameras section missing \"active\" node." msgstr "Cameras section fehlt \"active\" node." #: ../src/backend/state.cpp:556 msgid "Unable to find property \"value\" for \"cameras->active\" node." msgstr "Kann \"Eigenschaftswert\" für \"Kamera->aktiv\" Node nicht finden." #: ../src/backend/state.cpp:562 msgid "Unable to interpret property \"value\" for \"cameras->active\" node." msgstr "" "Kann \"Eigenschaftswert\" für \"Kamera->aktiv\" Node nicht interpretieren." #: ../src/backend/state.cpp:582 msgid "Failed to interpret camera state for camera : " msgstr "" #: ../src/backend/state.cpp:590 msgid "Unable to interpret the camera type for camera : " msgstr "Kann den Kameratype nicht interpretieren für :" #: ../src/backend/state.cpp:648 msgid "Unable to locate stash name for stash " msgstr "Kann den Stashnamen für Stash nicht finden" #: ../src/backend/state.cpp:655 msgid "Empty stash name for stash " msgstr "Leerer Stashname für Stash" #: ../src/backend/state.cpp:664 msgid "No filter tree for stash:" msgstr "" #: ../src/backend/state.cpp:670 msgid "For stash " msgstr "Für Stash " #: ../src/backend/state.cpp:702 msgid "Unrecognised effect :" msgstr "Nichterkannter Effekt :" #: ../src/backend/state.cpp:712 msgid "Duplicate effect found" msgstr "Doppelter Effekt gefunden" #: ../src/backend/state.cpp:712 msgid " cannot use." msgstr "kann nicht verwenden." #: ../src/backend/state.cpp:722 msgid "Error reading effect : " msgstr "Fehler beim Lesen:" #: ../src/backend/state.cpp:927 msgid "-merge" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:44 ../src/backend/APT/APTFileIO.cpp:79 #: ../src/backend/APT/APTFileIO.cpp:103 msgid "Error opening file" msgstr "Fehler beim Öffnen der Datei" #: ../src/backend/APT/APTFileIO.cpp:45 msgid "Only found header, no data" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:46 msgid "Unable to reopen file after first scan" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:47 msgid "Error whilst reading file contents" msgstr "Fehler beim Lesen des Dateiinhaltes" #: ../src/backend/APT/APTFileIO.cpp:48 ../src/backend/APT/APTFileIO.cpp:49 msgid "Unexpected file format" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:50 msgid "Insufficient memory to continue" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:54 msgid "Memory allocation failure on POS load" msgstr "Speicherzuweisungsfeher beim Laden der pos-Datei" #: ../src/backend/APT/APTFileIO.cpp:55 msgid "Error opening pos file" msgstr "Fehler beim Öffnen der pos-Datei" #: ../src/backend/APT/APTFileIO.cpp:56 msgid "Pos file empty" msgstr "Pos-Datei ist leer" #: ../src/backend/APT/APTFileIO.cpp:57 msgid "Pos file size appears to have non-integer number of entries" msgstr "" "Pos-Dateigröße scheint eine nicht ganzzahlige Anzahl an Einträgen zu haben" #: ../src/backend/APT/APTFileIO.cpp:58 msgid "Error reading from pos file (after open)" msgstr "Fehler beim Lesen aus pos-Datei (nach dem öffnen)" #: ../src/backend/APT/APTFileIO.cpp:59 msgid "Error - Found NaN in pos file" msgstr "Fehler - Fand NaN in pos-Datei" #: ../src/backend/APT/APTFileIO.cpp:60 msgid "Error - Found Inf in pos file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:61 msgid "Pos load aborted by interrupt." msgstr "Pos laden durch Interrupt abgebrochen." #: ../src/backend/APT/APTFileIO.cpp:80 msgid "No numerical data found" msgstr "Keine numerischen Daten gefunden" #: ../src/backend/APT/APTFileIO.cpp:81 msgid "Error re-opening file, after first scan" msgstr "Fehler beim nochmaligen Öffnen der Datei nach dem ersten Scan" #: ../src/backend/APT/APTFileIO.cpp:82 msgid "Unable to read file contents after open" msgstr "Kann den Dateiinhalt nach dem Öffnen nich lesen" #: ../src/backend/APT/APTFileIO.cpp:83 msgid "Error interpreting field in file" msgstr "Fehler beim Interpretieren eine Feldes in der Datei" #: ../src/backend/APT/APTFileIO.cpp:84 msgid "Incorrect number of fields in file" msgstr "Die Datei enthält eine falsche Anzahl von Feldern" #: ../src/backend/APT/APTFileIO.cpp:85 ../src/backend/APT/APTFileIO.cpp:107 msgid "Unable to allocate memory to store data" msgstr "Kann Speicher nicht zuordnen" #: ../src/backend/APT/APTFileIO.cpp:104 msgid "File is empty" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:105 msgid "Filesize does not match expected format" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:106 msgid "File version number not <4, as expected" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:108 msgid "Unable to detect endian-ness in file" msgstr "" #: ../src/backend/APT/APTRanges.cpp:48 msgid "Error opening file, check name and permissions." msgstr "Fehler beim Öffnen der Datei, überprüfe Namen und Berechtigungen." #: ../src/backend/APT/APTRanges.cpp:49 msgid "" "Error interpreting range file header, expecting ion count and range count, " "respectively." msgstr "" "Fehler beim Rangedatei interpretieren, erwarte Ionenanzahl bzw. Rangeanzahl." #: ../src/backend/APT/APTRanges.cpp:50 msgid "" "Range file appears to be empty, check file is a proper range file and is not " "empty." msgstr "" "Rangedatei scheint leer zu sein. Prüfe ob die Datei wirklich ein Rangedatei " "und nicht leer ist." #: ../src/backend/APT/APTRanges.cpp:51 msgid "Error reading the long name for ion." msgstr "Fehler beim Lesen des langen Namens für Ion." #: ../src/backend/APT/APTRanges.cpp:52 msgid "Error reading the short name for ion." msgstr "Fehler beim Lesen des kurzen Namens für Ion." #: ../src/backend/APT/APTRanges.cpp:53 msgid "" "Error reading colour data in the file, expecting 3 decimal values, space " "separated." msgstr "" "Fehler beim Lesen der Farbinformationen in der Datei. Erwarte 3, durch " "Leerzeichen getrennte, Dezimalwerte." #: ../src/backend/APT/APTRanges.cpp:54 msgid "" "Tried skipping to table separator line (line with dashes), but did not find " "it." msgstr "" #: ../src/backend/APT/APTRanges.cpp:55 msgid "" "Number of ions in the table header did not match the number specified at the " "start of the file" msgstr "" #: ../src/backend/APT/APTRanges.cpp:56 msgid "" "Unexpected failure whilst trying to skip over range lead-in data (bit before " "range start value)" msgstr "" #: ../src/backend/APT/APTRanges.cpp:57 msgid "" "Range table had an incorrect number of entries, should be 2 or 3 + number of " "ranges" msgstr "" #: ../src/backend/APT/APTRanges.cpp:58 msgid "Unable to read range start and end values" msgstr "Kann Anfangs und Endwert des Range nicht lesen" #: ../src/backend/APT/APTRanges.cpp:59 msgid "Unable to read range table entry" msgstr "Kann Rangetabelleneintrag nich lesen" #: ../src/backend/APT/APTRanges.cpp:60 msgid "" "Error reading file, unexpected format, are you sure it is a proper range " "file?" msgstr "" "Fehler beim Lesen der Datei: Unerwartetes Format, sind Sie sicher, dass dies " "eine korrekte Rangedatei ist?" #: ../src/backend/APT/APTRanges.cpp:61 msgid "" "Too many ranges appeared to have range entries with no usable data (eg, all " "blank)" msgstr "Zu viele Ranges scheinen ungültige Einträge zu haben (z.B. alle leer)" #: ../src/backend/APT/APTRanges.cpp:62 msgid "" "Range file appears to contain malformed data, check things like start and " "ends of m/c are not equal or flipped." msgstr "" #: ../src/backend/APT/APTRanges.cpp:63 msgid "Range file appears to be inconsistent (eg, overlapping ranges)" msgstr "Rangedatei schein inkonsistent zu sein (z.B. überlappende Ranges)" #: ../src/backend/APT/APTRanges.cpp:64 msgid "No ion name mapping found for multiple ion." msgstr "" #: ../src/backend/APT/APTRanges.cpp:65 msgid "Polyatomic extension range matches multiple masses in first section" msgstr "" #: ../src/backend/APT/APTRanges.cpp:66 msgid "Range file is exceedingly large. Refusing to open" msgstr "" #: ../src/backend/APT/APTRanges.cpp:1404 msgid "" "Range headings do not match order of the ions listed in the name " "specifications. The name specification ordering will be used when reading " "the range table, as the range heading section is declared as a comment in " "the file-format specifications, and is not to be intepreted by this program. " "Check range-species associations actually match what you expect." msgstr "" #: ../src/backend/filters/annotation.cpp:73 msgid "Arrow" msgstr "Pfeil" #: ../src/backend/filters/annotation.cpp:74 msgid "Text" msgstr "Text" #: ../src/backend/filters/annotation.cpp:75 msgid "Arrow+Text" msgstr "Pfeil+Text" #: ../src/backend/filters/annotation.cpp:76 msgid "Angle" msgstr "Winkel" #: ../src/backend/filters/annotation.cpp:77 msgid "Ruler" msgstr "Lineal" #: ../src/backend/filters/annotation.cpp:524 msgid "Enable" msgstr "" #: ../src/backend/filters/annotation.cpp:527 msgid "Enable/disable annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:548 msgid "Type or style of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:564 #: ../src/backend/filters/annotation.cpp:668 msgid "Text of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:568 #: ../src/backend/filters/ionClip.cpp:529 #: ../src/backend/filters/ionClip.cpp:551 #: ../src/backend/filters/ionClip.cpp:573 #: ../src/backend/filters/ionClip.cpp:610 #: ../src/backend/filters/transform.cpp:1233 #: ../src/backend/filters/transform.cpp:1260 #: ../src/backend/filters/transform.cpp:1286 #: ../src/backend/filters/profile.cpp:1013 #: ../src/backend/filters/profile.cpp:1051 #: ../src/backend/filters/spatialAnalysis.cpp:1041 ../src/gl/cameras.cpp:603 msgid "Origin" msgstr "Ursprung" #: ../src/backend/filters/annotation.cpp:572 msgid "Position of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:576 #: ../src/backend/filters/annotation.cpp:683 #: ../src/backend/filters/annotation.cpp:742 #: ../src/backend/filters/annotation.cpp:831 msgid "Up dir" msgstr "Up dir" #: ../src/backend/filters/annotation.cpp:580 #: ../src/backend/filters/annotation.cpp:835 msgid "Vector for up direction of annotation text" msgstr "" #: ../src/backend/filters/annotation.cpp:584 #: ../src/backend/filters/annotation.cpp:690 #: ../src/backend/filters/annotation.cpp:734 #: ../src/backend/filters/annotation.cpp:839 msgid "Across dir" msgstr "Across dir" #: ../src/backend/filters/annotation.cpp:588 #: ../src/backend/filters/annotation.cpp:843 msgid "Reading direction for annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:593 #: ../src/backend/filters/annotation.cpp:675 #: ../src/backend/filters/annotation.cpp:769 msgid "Text size" msgstr "Textgröße" #: ../src/backend/filters/annotation.cpp:597 #: ../src/backend/filters/annotation.cpp:679 #: ../src/backend/filters/annotation.cpp:851 msgid "Relative size of annotation text" msgstr "" #: ../src/backend/filters/annotation.cpp:609 #: ../src/backend/filters/annotation.cpp:650 msgid "3D position for tail of arrow" msgstr "" #: ../src/backend/filters/annotation.cpp:617 #: ../src/backend/filters/annotation.cpp:659 msgid "3D Position to which arrow points" msgstr "" #: ../src/backend/filters/annotation.cpp:620 #: ../src/backend/filters/annotation.cpp:730 msgid "Positioning" msgstr "" #: ../src/backend/filters/annotation.cpp:625 #: ../src/backend/filters/annotation.cpp:697 msgid "Tip radius" msgstr "" #: ../src/backend/filters/annotation.cpp:629 msgid "Size of the arrow head" msgstr "" #: ../src/backend/filters/annotation.cpp:633 msgid "Line size" msgstr "" #: ../src/backend/filters/annotation.cpp:637 msgid "Thickness of line used to draw arrow stem" msgstr "" #: ../src/backend/filters/annotation.cpp:671 msgid "Options" msgstr "" #: ../src/backend/filters/annotation.cpp:707 msgid "Position A" msgstr "Position A" #: ../src/backend/filters/annotation.cpp:711 msgid "Location of first non-central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:715 msgid "Origin " msgstr "Ursprung " #: ../src/backend/filters/annotation.cpp:719 msgid "Location of central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:723 msgid "Position B" msgstr "Position B" #: ../src/backend/filters/annotation.cpp:727 msgid "Location of second non-central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:738 msgid "Reading direction for angle text" msgstr "" #: ../src/backend/filters/annotation.cpp:743 msgid "Vector for up direction of angle text" msgstr "" #: ../src/backend/filters/annotation.cpp:751 msgid "Reflexive" msgstr "Reflexive" #: ../src/backend/filters/annotation.cpp:754 msgid "Measure interor (enabled) or exterior angle (disabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:759 msgid "Show Angle" msgstr "Zeige Winkel" #: ../src/backend/filters/annotation.cpp:763 msgid "Display angle text (when enabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:773 msgid "Size of angle text" msgstr "" #: ../src/backend/filters/annotation.cpp:791 msgid "Digit format" msgstr "Zahlenformat" #: ../src/backend/filters/annotation.cpp:795 msgid "" "Format of angle text; # for numeral position, '.' for separator, eg ##.## " "gives 12.34" msgstr "" #: ../src/backend/filters/annotation.cpp:801 #: ../src/backend/filters/annotation.cpp:886 msgid "Sphere size" msgstr "Kugelgröße" #: ../src/backend/filters/annotation.cpp:805 #: ../src/backend/filters/annotation.cpp:890 msgid "Marker sphere size for manipulating tool" msgstr "" #: ../src/backend/filters/annotation.cpp:819 msgid "Ruler beginning 3D location" msgstr "" #: ../src/backend/filters/annotation.cpp:827 msgid "Ruler finish 3D location" msgstr "" #: ../src/backend/filters/annotation.cpp:848 #: ../src/backend/filters/boundingBox.cpp:715 msgid "Font Size" msgstr "Schriftgröße" #: ../src/backend/filters/annotation.cpp:857 msgid "Fixed ticks" msgstr "Fixe Marker" #: ../src/backend/filters/annotation.cpp:860 msgid "" "Use fixed (enabled) number of text markers, or one every fixed distance " "(disabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:867 msgid "Num Ticks" msgstr "Anzahl Marker" #: ../src/backend/filters/annotation.cpp:870 msgid "Number of tick marks along ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:877 msgid "Tick Spacing" msgstr "Markerabstand" #: ../src/backend/filters/annotation.cpp:880 msgid "Distance between tick marks along ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:904 msgid "Colour for ruler and ticks" msgstr "" #: ../src/backend/filters/ionClip.cpp:65 ../src/backend/filters/profile.cpp:53 msgid "Sphere" msgstr "Kugel" #: ../src/backend/filters/ionClip.cpp:66 msgid "Plane" msgstr "Ebene" #: ../src/backend/filters/ionClip.cpp:67 msgid "Cylinder" msgstr "Zylinder" #: ../src/backend/filters/ionClip.cpp:68 msgid "Aligned box" msgstr "Ausgerichtete Box" #: ../src/backend/filters/ionClip.cpp:498 #: ../src/backend/filters/profile.cpp:991 msgid "Primitive" msgstr "Primitiv" #: ../src/backend/filters/ionClip.cpp:501 msgid "Shape of clipping object" msgstr "" #: ../src/backend/filters/ionClip.cpp:507 #: ../src/backend/filters/profile.cpp:997 msgid "Show Primitive" msgstr "Zeige Primitiv" #: ../src/backend/filters/ionClip.cpp:510 msgid "Display the 3D interaction object" msgstr "" #: ../src/backend/filters/ionClip.cpp:515 msgid "Invert Clip" msgstr "Invertiere Clip" #: ../src/backend/filters/ionClip.cpp:518 msgid "" "Switch between retaining points inside (false) and outside (true) of " "primitive" msgstr "" #: ../src/backend/filters/ionClip.cpp:532 #: ../src/backend/filters/profile.cpp:1054 msgid "Position for centre of sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:537 #: ../src/backend/filters/ionClip.cpp:597 #: ../src/backend/filters/profile.cpp:1037 #: ../src/backend/filters/profile.cpp:1059 #: ../src/backend/filters/spatialAnalysis.cpp:134 #: ../src/backend/filters/spatialAnalysis.cpp:1058 msgid "Radius" msgstr "Radius" #: ../src/backend/filters/ionClip.cpp:540 #: ../src/backend/filters/profile.cpp:1062 msgid "Radius of sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:554 msgid "Position that plane passes through" msgstr "" #: ../src/backend/filters/ionClip.cpp:559 msgid "Plane Normal" msgstr "Plane Normal" #: ../src/backend/filters/ionClip.cpp:562 msgid "Perpendicular direction for plane" msgstr "" #: ../src/backend/filters/ionClip.cpp:576 msgid "Centre of cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:581 #: ../src/backend/filters/transform.cpp:1294 #: ../src/backend/filters/profile.cpp:1021 #: ../src/backend/filters/spatialAnalysis.cpp:1049 msgid "Axis" msgstr "Achse" #: ../src/backend/filters/ionClip.cpp:584 msgid "Positive vector for cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:589 #: ../src/backend/filters/profile.cpp:1029 msgid "Lock Axis Mag." msgstr "Achsen Vergr. sperren" #: ../src/backend/filters/ionClip.cpp:592 msgid "Prevent changing length of cylinder during 3D interaction" msgstr "" #: ../src/backend/filters/ionClip.cpp:600 #: ../src/backend/filters/profile.cpp:1040 #: ../src/backend/filters/spatialAnalysis.cpp:1061 msgid "Radius of cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:613 msgid "Centre of axis aligned box" msgstr "" #: ../src/backend/filters/ionClip.cpp:618 msgid "Corner offset" msgstr "Corner offset" #: ../src/backend/filters/ionClip.cpp:621 msgid "Vector to corner of box" msgstr "" #: ../src/backend/filters/voxelise.cpp:111 msgid "None (Raw count)" msgstr "Keine (Roh count)" #: ../src/backend/filters/voxelise.cpp:112 msgid "Volume (Density)" msgstr "Volumen (Dichte)" #: ../src/backend/filters/voxelise.cpp:113 msgid "All Ions (conc)" msgstr "Alle Ionen (Konz)" #: ../src/backend/filters/voxelise.cpp:114 msgid "Ratio (Num/Denom)" msgstr "Verhältnis (Zähler/Nenner)" #: ../src/backend/filters/voxelise.cpp:118 msgid "Point Cloud" msgstr "Punktwolke" #: ../src/backend/filters/voxelise.cpp:119 msgid "Isosurface" msgstr "Isosurface" #: ../src/backend/filters/voxelise.cpp:120 msgid "Axial slice" msgstr "" #: ../src/backend/filters/voxelise.cpp:124 #: ../src/backend/filters/voxelise.cpp:130 #: ../src/backend/filters/algorithms/mass.cpp:25 #: ../src/backend/filters/spectrumPlot.cpp:76 ../src/backend/plot.cpp:28 msgid "None" msgstr "Keiner" #: ../src/backend/filters/voxelise.cpp:125 msgid "Gaussian (blur)" msgstr "" #: ../src/backend/filters/voxelise.cpp:126 msgid "Lapl. of Gauss. (edges)" msgstr "" #: ../src/backend/filters/voxelise.cpp:131 msgid "Linear" msgstr "" #: ../src/backend/filters/voxelise.cpp:564 msgid "Voxel Limits (min,max): (" msgstr "Voxel Grenzen (min,max): (" #: ../src/backend/filters/voxelise.cpp:709 msgid "Fixed width" msgstr "Fixe Breite" #: ../src/backend/filters/voxelise.cpp:713 msgid "If true, use fixed size voxels, otherwise use fixed count" msgstr "" #: ../src/backend/filters/voxelise.cpp:719 msgid "Bin width x" msgstr "Bin-Breite x" #: ../src/backend/filters/voxelise.cpp:723 msgid "Voxel size in X direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:727 msgid "Bin width y" msgstr "Bin-Breite y" #: ../src/backend/filters/voxelise.cpp:730 msgid "Voxel size in Y direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:736 msgid "Bin width z" msgstr "Bin-Breite Z" #: ../src/backend/filters/voxelise.cpp:739 msgid "Voxel size in Z direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:746 msgid "Num bins x" msgstr "Anzahl Bins x" #: ../src/backend/filters/voxelise.cpp:750 msgid "Number of voxels to use in X direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:755 msgid "Num bins y" msgstr "Anzahl Bins y" #: ../src/backend/filters/voxelise.cpp:758 msgid "Number of voxels to use in Y direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:764 msgid "Num bins z" msgstr "Anzahl Bins z" #: ../src/backend/filters/voxelise.cpp:766 msgid "Number of voxels to use in Z direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:796 msgid "Normalise by" msgstr "Normalisieren mit" #: ../src/backend/filters/voxelise.cpp:799 msgid "Method to use to normalise scalar value in each voxel" msgstr "" #: ../src/backend/filters/voxelise.cpp:802 msgid "Computation" msgstr "" #: ../src/backend/filters/voxelise.cpp:809 #: ../src/backend/filters/spatialAnalysis.cpp:1233 #: ../src/backend/filters/spatialAnalysis.cpp:1254 msgid "Numerator" msgstr "Zähler" #: ../src/backend/filters/voxelise.cpp:812 msgid "Parmeter \"a\" used in fraction (a/b) to get voxel value" msgstr "" #: ../src/backend/filters/voxelise.cpp:829 msgid "Enable this ion for numerator" msgstr "" #: ../src/backend/filters/voxelise.cpp:841 #: ../src/backend/filters/voxelise.cpp:862 #: ../src/backend/filters/spatialAnalysis.cpp:1261 #: ../src/backend/filters/spatialAnalysis.cpp:1280 msgid "Denominator" msgstr "Nenner" #: ../src/backend/filters/voxelise.cpp:844 msgid "Parameter \"b\" used in fraction (a/b) to get voxel value" msgstr "" #: ../src/backend/filters/voxelise.cpp:858 msgid "Enable this ion for denominator contribution" msgstr "" #: ../src/backend/filters/voxelise.cpp:880 #: ../src/backend/filters/voxelise.cpp:911 msgid "Filtering" msgstr "Filtern" #: ../src/backend/filters/voxelise.cpp:884 msgid "Smoothing method to use on voxels" msgstr "" #: ../src/backend/filters/voxelise.cpp:887 msgid "Processing" msgstr "" #: ../src/backend/filters/voxelise.cpp:893 msgid "Standard Dev" msgstr "" #: ../src/backend/filters/voxelise.cpp:897 msgid "Filtering Scale" msgstr "" #: ../src/backend/filters/voxelise.cpp:903 msgid "Kernel Size" msgstr "" #: ../src/backend/filters/voxelise.cpp:907 msgid "" "Filter radius, in multiples of std. dev. Larger -> slower, more accurate" msgstr "" #: ../src/backend/filters/voxelise.cpp:927 msgid "Representation" msgstr "Representation" #: ../src/backend/filters/voxelise.cpp:930 msgid "3D display method" msgstr "" #: ../src/backend/filters/voxelise.cpp:941 msgid "Spot size" msgstr "Spot size" #: ../src/backend/filters/voxelise.cpp:944 msgid "Size of the spots to use for display" msgstr "" #: ../src/backend/filters/voxelise.cpp:949 #: ../src/backend/filters/voxelise.cpp:984 #: ../src/backend/filters/voxelise.cpp:1056 msgid "Transparency" msgstr "Transparenz" #: ../src/backend/filters/voxelise.cpp:952 msgid "How \"see through\" each point is (0 - opaque, 1 - invisible)" msgstr "" #: ../src/backend/filters/voxelise.cpp:961 msgid "Surf. param." msgstr "" #: ../src/backend/filters/voxelise.cpp:964 msgid "Isovalue" msgstr "Isovalue" #: ../src/backend/filters/voxelise.cpp:967 msgid "Scalar value to show as isosurface" msgstr "" #: ../src/backend/filters/voxelise.cpp:972 #: ../src/backend/filters/voxelise.cpp:1037 #: ../src/backend/filters/spatialAnalysis.cpp:2344 #: ../src/backend/filters/spatialAnalysis.cpp:2397 msgid "Surface" msgstr "Oberfläche" #: ../src/backend/filters/voxelise.cpp:979 msgid "Colour of isosurface" msgstr "" #: ../src/backend/filters/voxelise.cpp:987 #: ../src/backend/filters/voxelise.cpp:1059 msgid "How \"see through\" each facet is (0 - opaque, 1 - invisible)" msgstr "" #: ../src/backend/filters/voxelise.cpp:998 msgid "Slice param." msgstr "" #: ../src/backend/filters/voxelise.cpp:1006 msgid "Slice Axis" msgstr "" #: ../src/backend/filters/voxelise.cpp:1009 msgid "Normal for the planar slice" msgstr "" #: ../src/backend/filters/voxelise.cpp:1016 msgid "Slice Coord" msgstr "" #: ../src/backend/filters/voxelise.cpp:1019 msgid "Fractional coordinate that slice plane passes through" msgstr "" #: ../src/backend/filters/voxelise.cpp:1024 msgid "Interp. Mode" msgstr "" #: ../src/backend/filters/voxelise.cpp:1032 msgid "Interpolation mode for direction normal to slice" msgstr "" #: ../src/backend/filters/voxelise.cpp:1048 msgid "Colour mode" msgstr "" #: ../src/backend/filters/voxelise.cpp:1051 #: ../src/backend/filters/ionColour.cpp:261 msgid "Colour scheme used to assign points colours by value" msgstr "" #: ../src/backend/filters/voxelise.cpp:1064 #: ../src/backend/filters/ionColour.cpp:273 msgid "Show Bar" msgstr "Zeige Balken" #: ../src/backend/filters/voxelise.cpp:1071 msgid "Auto Bounds" msgstr "" #: ../src/backend/filters/voxelise.cpp:1072 msgid "Auto-compute min/max values in map" msgstr "" #: ../src/backend/filters/voxelise.cpp:1082 #: ../src/backend/filters/ionColour.cpp:294 msgid "Map start" msgstr "" #: ../src/backend/filters/voxelise.cpp:1083 #: ../src/backend/filters/ionColour.cpp:295 msgid "Assign points with this value to the first colour in map" msgstr "" #: ../src/backend/filters/voxelise.cpp:1090 #: ../src/backend/filters/ionColour.cpp:302 msgid "Map end" msgstr "" #: ../src/backend/filters/voxelise.cpp:1091 #: ../src/backend/filters/ionColour.cpp:303 msgid "Assign points with this value to the last colour in map" msgstr "" #: ../src/backend/filters/transform.cpp:84 msgid "Translate" msgstr "Translate" #: ../src/backend/filters/transform.cpp:85 msgid "Scale (isotropic)" msgstr "" #: ../src/backend/filters/transform.cpp:86 msgid "Scale (anisotropic)" msgstr "" #: ../src/backend/filters/transform.cpp:87 msgid "Rotate" msgstr "Rotieren" #: ../src/backend/filters/transform.cpp:88 msgid "Value Shuffle" msgstr "" #: ../src/backend/filters/transform.cpp:89 msgid "Spatial Noise" msgstr "" #: ../src/backend/filters/transform.cpp:90 msgid "Translate Value" msgstr "Translate Wert" #: ../src/backend/filters/transform.cpp:91 msgid "Crop Value" msgstr "" #: ../src/backend/filters/transform.cpp:95 msgid "Specify" msgstr "Angeben" #: ../src/backend/filters/transform.cpp:96 msgid "Boundbox Centre" msgstr "Boundbox Zentrum" #: ../src/backend/filters/transform.cpp:97 msgid "Mass Centre" msgstr "Massen-Zentrum" #: ../src/backend/filters/transform.cpp:1008 #: ../src/backend/filters/clusterAnalysis.cpp:1956 #: ../src/backend/filters/spatialAnalysis.cpp:635 #: ../src/backend/filters/spatialAnalysis.cpp:2298 #: ../src/backend/filters/spatialAnalysis.cpp:2727 #: ../src/backend/filters/spatialAnalysis.cpp:3016 #: ../src/backend/filters/spatialAnalysis.cpp:3689 #: ../src/backend/filters/spatialAnalysis.cpp:3952 #: ../src/backend/filters/spatialAnalysis.cpp:4165 msgid "Collate" msgstr "Abgleichen" #: ../src/backend/filters/transform.cpp:1027 msgid "Mass-to-Charge (Da/e)" msgstr "" #: ../src/backend/filters/transform.cpp:1081 msgid "Shuffle" msgstr "" #: ../src/backend/filters/transform.cpp:1105 msgid "Splice" msgstr "" #: ../src/backend/filters/transform.cpp:1153 msgid "Algorithm to use to transform point data" msgstr "" #: ../src/backend/filters/transform.cpp:1157 #: ../src/backend/filters/ionInfo.cpp:546 #: ../src/backend/filters/clusterAnalysis.cpp:943 #: ../src/backend/filters/clusterAnalysis.cpp:951 #: ../src/backend/filters/spatialAnalysis.cpp:800 #: ../src/backend/filters/spatialAnalysis.cpp:808 msgid "Algorithm" msgstr "Algorithmus" #: ../src/backend/filters/transform.cpp:1170 msgid "Origin mode" msgstr "" #: ../src/backend/filters/transform.cpp:1173 msgid "Select how transform origin is computed" msgstr "" #: ../src/backend/filters/transform.cpp:1178 msgid "Show marker" msgstr "Zeige Markierung" #: ../src/backend/filters/transform.cpp:1182 msgid "Display an interactive object to set transform origin" msgstr "" #: ../src/backend/filters/transform.cpp:1184 msgid "Display a small marker to denote transform origin" msgstr "" #: ../src/backend/filters/transform.cpp:1200 msgid "Translation" msgstr "Translation" #: ../src/backend/filters/transform.cpp:1203 msgid "Translation vector for transform" msgstr "" #: ../src/backend/filters/transform.cpp:1215 msgid "Offset" msgstr "" #: ../src/backend/filters/transform.cpp:1219 msgid "Scalar to use to offset each point's associated value" msgstr "" #: ../src/backend/filters/transform.cpp:1236 #: ../src/backend/filters/transform.cpp:1263 msgid "Origin of scale trasnform" msgstr "" #: ../src/backend/filters/transform.cpp:1243 #: ../src/backend/filters/transform.cpp:1270 msgid "Scale Fact." msgstr "Skalierungsfaktor" #: ../src/backend/filters/transform.cpp:1246 #: ../src/backend/filters/transform.cpp:1273 msgid "Enlargement factor for scaling around origin" msgstr "" #: ../src/backend/filters/transform.cpp:1289 msgid "Origin of rotation" msgstr "" #: ../src/backend/filters/transform.cpp:1297 msgid "Axis around which to revolve" msgstr "" #: ../src/backend/filters/transform.cpp:1302 msgid "Angle (deg)" msgstr "Winkel (deg)" #: ../src/backend/filters/transform.cpp:1305 msgid "Angle to perform rotation (ACW, as viewed from axis towards origin)" msgstr "" #: ../src/backend/filters/transform.cpp:1322 msgid "Noise Type" msgstr "" #: ../src/backend/filters/transform.cpp:1325 msgid "Method to use to degrade point data" msgstr "" #: ../src/backend/filters/transform.cpp:1332 msgid "Noise level" msgstr "" #: ../src/backend/filters/transform.cpp:1334 msgid "Standard dev." msgstr "Standardabweichung" #: ../src/backend/filters/transform.cpp:1342 msgid "Amplitude of noise" msgstr "" #: ../src/backend/filters/transform.cpp:1356 msgid "Min Value" msgstr "" #: ../src/backend/filters/transform.cpp:1360 msgid "Minimum value to use for crop" msgstr "" #: ../src/backend/filters/transform.cpp:1364 msgid "Max Value" msgstr "" #: ../src/backend/filters/transform.cpp:1368 msgid "Maximum value to use for crop" msgstr "" #: ../src/backend/filters/transform.cpp:1377 msgid "Transform Params" msgstr "Transformationsparameter" #: ../src/backend/filters/transform.cpp:1738 msgid "White" msgstr "" #: ../src/backend/filters/transform.cpp:1740 msgid "Gaussian" msgstr "" #: ../src/backend/filters/externalProgram.cpp:259 msgid "Collate Input" msgstr "" #: ../src/backend/filters/externalProgram.cpp:348 msgid "Execute" msgstr "" #: ../src/backend/filters/externalProgram.cpp:389 msgid "Collate output" msgstr "" #: ../src/backend/filters/externalProgram.cpp:564 #: ../src/backend/filters/externalProgram.cpp:578 msgid "Command" msgstr "Befehl" #: ../src/backend/filters/externalProgram.cpp:567 msgid "" "Full command to send to operating system. See manual for escape sequence " "meanings" msgstr "" #: ../src/backend/filters/externalProgram.cpp:571 msgid "Work Dir" msgstr "Arbeitsverzeichnis" #: ../src/backend/filters/externalProgram.cpp:574 msgid "Directory to run the command in" msgstr "" #: ../src/backend/filters/externalProgram.cpp:581 msgid "Cleanup input" msgstr "Bereinige Eingabe" #: ../src/backend/filters/externalProgram.cpp:584 msgid "Erase input files when command completed" msgstr "" #: ../src/backend/filters/externalProgram.cpp:589 msgid "Cache" msgstr "Zwischenspeicher" #: ../src/backend/filters/externalProgram.cpp:592 msgid "" "Assume program does not alter its output, unless inputs from 3Depict are " "altered" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:26 msgid "Flat TOF" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:33 msgid "INsufficient bins to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:34 msgid "Insufficient counts to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:35 msgid "Insufficient data to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:36 msgid "Data did not appear to be random noise - cannot fit noise level" msgstr "" #: ../src/backend/filters/ionInfo.cpp:37 msgid "Rectilinear" msgstr "Geradlinig" #: ../src/backend/filters/ionInfo.cpp:38 msgid "Convex hull" msgstr "Konvexe Hülle" #: ../src/backend/filters/ionInfo.cpp:200 msgid "No ions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:226 #: ../src/backend/filters/spectrumPlot.cpp:432 msgid "" "Background fit failed - input data was considered ill formed (gauss-test)" msgstr "" #: ../src/backend/filters/ionInfo.cpp:227 msgid "Following data has not been corrected" msgstr "" #: ../src/backend/filters/ionInfo.cpp:279 msgid "--Counts--" msgstr "- Anzahl -" #: ../src/backend/filters/ionInfo.cpp:289 msgid "Total Ranged\t" msgstr "Gesamt ranged\t" #: ../src/backend/filters/ionInfo.cpp:294 msgid "Total (incl. unranged)\t" msgstr "Total (inkl. nicht geranged)" #: ../src/backend/filters/ionInfo.cpp:307 msgid "n/a" msgstr "" #: ../src/backend/filters/ionInfo.cpp:317 #: ../src/backend/filters/ionDownsample.cpp:496 msgid "Unranged" msgstr "Nicht Geranged" #: ../src/backend/filters/ionInfo.cpp:330 msgid "Number of points : " msgstr "Anzahl der Punkte: " #: ../src/backend/filters/ionInfo.cpp:359 msgid "Rectilinear Bounds : " msgstr "Geradlinige Grenzen:" #: ../src/backend/filters/ionInfo.cpp:364 msgid "Volume (len^3): " msgstr "Volumen (Läng.^3)" #: ../src/backend/filters/ionInfo.cpp:381 msgid "Convex Volume (len^3): " msgstr "Konvexes Volumen (Läng.^3)" #: ../src/backend/filters/ionInfo.cpp:384 msgid "Unable to compute volume" msgstr "Kann Volumen nicht berechnen" #: ../src/backend/filters/ionInfo.cpp:413 msgid "Ranged Density (pts/vol):" msgstr "Ranged Dichte (pts / vol):" #: ../src/backend/filters/ionInfo.cpp:418 msgid "Total Density (pts/vol):" msgstr "Gesamtdichte (pts / vol):" #: ../src/backend/filters/ionInfo.cpp:445 msgid "Compositions" msgstr "Zusammensetzungen" #: ../src/backend/filters/ionInfo.cpp:446 msgid "Display compositional data for points in console" msgstr "" #: ../src/backend/filters/ionInfo.cpp:450 msgid "Counts" msgstr "Anzahl" #: ../src/backend/filters/ionInfo.cpp:451 msgid "Display count data for points in console" msgstr "" #: ../src/backend/filters/ionInfo.cpp:458 msgid "Ion data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:462 #: ../src/backend/filters/profile.cpp:1107 #: ../src/backend/filters/clusterAnalysis.cpp:1108 #: ../src/backend/filters/spatialAnalysis.cpp:1116 msgid "Normalise" msgstr "Normalisieren" #: ../src/backend/filters/ionInfo.cpp:466 msgid "Normalise count data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:530 msgid "Volume" msgstr "Volumen" #: ../src/backend/filters/ionInfo.cpp:533 msgid "Compute volume for point data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:549 msgid "Select volume counting technique" msgstr "" #: ../src/backend/filters/ionInfo.cpp:562 msgid "Volume data" msgstr "" #: ../src/backend/filters/rangeFile.cpp:120 #: ../src/backend/filters/rangeFile.h:96 msgid "Ranging" msgstr "Ranging" #: ../src/backend/filters/rangeFile.cpp:560 #: ../src/backend/filters/rangeFile.cpp:580 #: ../src/backend/filters/dataLoad.cpp:484 #: ../src/backend/filters/dataLoad.cpp:505 msgid "File" msgstr "Datei" #: ../src/backend/filters/rangeFile.cpp:563 msgid "File to use for range data" msgstr "" #: ../src/backend/filters/rangeFile.cpp:573 msgid "Drop unranged" msgstr "Nicht gerangete ausschalten" #: ../src/backend/filters/rangeFile.cpp:575 msgid "Remove unranged points when generating output" msgstr "" #: ../src/backend/filters/rangeFile.cpp:585 msgid "Legend" msgstr "" #: ../src/backend/filters/rangeFile.cpp:587 msgid "Display colour legend for enabled ions" msgstr "" #: ../src/backend/filters/rangeFile.cpp:591 msgid "View" msgstr "" #: ../src/backend/filters/rangeFile.cpp:607 msgid "All Ions" msgstr "Alle Ionen" #: ../src/backend/filters/rangeFile.cpp:608 msgid "Enable/disable all ions at once" msgstr "" #: ../src/backend/filters/rangeFile.cpp:616 msgid "Species" msgstr "" #: ../src/backend/filters/rangeFile.cpp:623 msgid "IonID " msgstr "IonID " #: ../src/backend/filters/rangeFile.cpp:624 msgid "Enable/disable specified ion" msgstr "" #: ../src/backend/filters/rangeFile.cpp:634 msgid "Active Ion " msgstr "Actives Ion " #: ../src/backend/filters/rangeFile.cpp:636 msgid "If true, ion is used in output" msgstr "" #: ../src/backend/filters/rangeFile.cpp:646 msgid "Colour " msgstr "Farbe" #: ../src/backend/filters/rangeFile.cpp:650 msgid "Colour used to represent ion" msgstr "" #: ../src/backend/filters/rangeFile.cpp:673 msgid "All Ranges" msgstr "Alle Range" #: ../src/backend/filters/rangeFile.cpp:674 msgid "Enable/disable all ranges" msgstr "" #: ../src/backend/filters/rangeFile.cpp:689 msgid "Active Rng " msgstr "Activer Rng " #: ../src/backend/filters/rangeFile.cpp:692 msgid "" "Enable/disable specified range (ion must also be enabled to activiate range)" msgstr "" #: ../src/backend/filters/rangeFile.cpp:696 msgid "Ion " msgstr "Ion " #: ../src/backend/filters/rangeFile.cpp:699 msgid "Name of ion associate to this range" msgstr "" #: ../src/backend/filters/rangeFile.cpp:708 msgid "Start rng " msgstr "Start rng " #: ../src/backend/filters/rangeFile.cpp:711 msgid "Start value for range" msgstr "" #: ../src/backend/filters/rangeFile.cpp:716 msgid "End rng " msgstr "End rng " #: ../src/backend/filters/rangeFile.cpp:719 msgid "Stopping value for range`" msgstr "" #: ../src/backend/filters/profile.cpp:51 msgid "Cylinder (axial)" msgstr "" #: ../src/backend/filters/profile.cpp:52 msgid "Cylinder (radial)" msgstr "" #: ../src/backend/filters/profile.cpp:591 msgid "Distance" msgstr "Abstand" #: ../src/backend/filters/profile.cpp:599 msgid "Fraction" msgstr "Anteil" #: ../src/backend/filters/profile.cpp:601 msgid "Density (\\frac{\\#}{len^3})" msgstr "Dichte (\\frac{\\#}{len^3})" #: ../src/backend/filters/profile.cpp:628 msgid "Freq. Profile" msgstr "Häufigkeitsprofil" #: ../src/backend/filters/profile.cpp:680 msgid "No data remained in profile - cannot display result" msgstr "" #: ../src/backend/filters/profile.cpp:967 msgid "Total Density" msgstr "" #: ../src/backend/filters/profile.cpp:971 msgid "Do not do per-species analysis, perform density computation only" msgstr "" #: ../src/backend/filters/profile.cpp:985 msgid "Primitive type" msgstr "" #: ../src/backend/filters/profile.cpp:989 msgid "Basic shape to use for profile" msgstr "" #: ../src/backend/filters/profile.cpp:1001 msgid "Display the 3D composition profile interaction object" msgstr "" #: ../src/backend/filters/profile.cpp:1016 #: ../src/backend/filters/spatialAnalysis.cpp:1044 msgid "Position for centre of cylinder" msgstr "" #: ../src/backend/filters/profile.cpp:1024 msgid "Vector between ends of cylinder" msgstr "" #: ../src/backend/filters/profile.cpp:1032 msgid "Prevent length of cylinder changing during interaction" msgstr "" #: ../src/backend/filters/profile.cpp:1075 msgid "Fixed Bin Num" msgstr "Fix. Bin-Anz." #: ../src/backend/filters/profile.cpp:1078 msgid "" "If true, use a fixed number of bins for profile, otherwise use fixed step " "size" msgstr "" #: ../src/backend/filters/profile.cpp:1085 #: ../src/backend/filters/spatialAnalysis.cpp:887 #: ../src/backend/filters/spatialAnalysis.cpp:1021 msgid "Num Bins" msgstr "Bin-Anz." #: ../src/backend/filters/profile.cpp:1090 msgid "Number of bins to use for profile" msgstr "" #: ../src/backend/filters/profile.cpp:1096 #: ../src/backend/filters/spectrumPlot.cpp:580 msgid "Bin width" msgstr "Bin-Breite" #: ../src/backend/filters/profile.cpp:1102 msgid "Size of each bin in profile" msgstr "" #: ../src/backend/filters/profile.cpp:1111 msgid "Convert bin counts into relative frequencies in each bin" msgstr "" #: ../src/backend/filters/profile.cpp:1115 msgid "Min. events" msgstr "" #: ../src/backend/filters/profile.cpp:1119 msgid "Drop data that does not have this many events" msgstr "" #: ../src/backend/filters/profile.cpp:1122 msgid "Settings" msgstr "" #: ../src/backend/filters/profile.cpp:1144 #: ../src/backend/filters/spectrumPlot.cpp:669 msgid "Plot Type" msgstr "Plot Type" #: ../src/backend/filters/profile.cpp:1147 msgid "Visual style for plot" msgstr "" #: ../src/backend/filters/profile.cpp:1158 msgid "Colour of plot" msgstr "" #: ../src/backend/filters/profile.cpp:1174 msgid "Err. Estimator" msgstr "Fehlerschätzer" #: ../src/backend/filters/profile.cpp:1177 msgid "Method of estimating error associated with each bin" msgstr "" #: ../src/backend/filters/profile.cpp:1184 msgid "Avg. Window" msgstr "" #: ../src/backend/filters/profile.cpp:1187 msgid "Number of bins to include in moving average filter" msgstr "" #: ../src/backend/filters/profile.cpp:1191 msgid "Error analysis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:64 msgid "Box only" msgstr "" #: ../src/backend/filters/boundingBox.cpp:65 msgid "Tick" msgstr "" #: ../src/backend/filters/boundingBox.cpp:66 msgid "Dimension" msgstr "" #: ../src/backend/filters/boundingBox.cpp:571 msgid "If true, show box, otherwise hide box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:584 msgid "Style" msgstr "" #: ../src/backend/filters/boundingBox.cpp:587 msgid "Box display mode" msgstr "" #: ../src/backend/filters/boundingBox.cpp:590 msgid "Display mode" msgstr "" #: ../src/backend/filters/boundingBox.cpp:599 msgid "Fixed Tick Num" msgstr "Fixed Tick Num" #: ../src/backend/filters/boundingBox.cpp:603 msgid "" "If true, evenly use specified number of ticks. Otherwise, use distance to " "determine tick count" msgstr "" #: ../src/backend/filters/boundingBox.cpp:611 msgid "Num X" msgstr "Num X" #: ../src/backend/filters/boundingBox.cpp:614 msgid "Tick count in X direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:619 msgid "Num Y" msgstr "Num Y" #: ../src/backend/filters/boundingBox.cpp:622 msgid "Tick count in Y direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:627 msgid "Num Z" msgstr "Num Z" #: ../src/backend/filters/boundingBox.cpp:630 msgid "Tick count in Z direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:636 msgid "Spacing X" msgstr "X-Abstand" #: ../src/backend/filters/boundingBox.cpp:640 msgid "Distance between ticks on X axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:644 msgid "Spacing Y" msgstr "Y-Abstand" #: ../src/backend/filters/boundingBox.cpp:648 msgid "Distance between ticks on Y axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:652 msgid "Spacing Z" msgstr "Z-Abstand" #: ../src/backend/filters/boundingBox.cpp:656 msgid "Distance between ticks on Z axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:664 msgid "Ticks X" msgstr "" #: ../src/backend/filters/boundingBox.cpp:668 msgid "Display tick marks on X axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:672 msgid "Ticks Y" msgstr "" #: ../src/backend/filters/boundingBox.cpp:676 msgid "Display tick marks on Y axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:680 msgid "Ticks Z" msgstr "" #: ../src/backend/filters/boundingBox.cpp:684 msgid "Display tick marks on Z axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:687 msgid "Tick marks" msgstr "" #: ../src/backend/filters/boundingBox.cpp:694 msgid "Box Colour" msgstr "Box Farbe" #: ../src/backend/filters/boundingBox.cpp:698 msgid "Colour of the bounding box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:703 msgid "Line thickness" msgstr "Linienbreite" #: ../src/backend/filters/boundingBox.cpp:707 msgid "Thickness of the lines used to draw the box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:718 msgid "Relative size for text" msgstr "" #: ../src/backend/filters/boundingBox.cpp:723 msgid "Abs. Coords" msgstr "" #: ../src/backend/filters/boundingBox.cpp:726 msgid "Show labels using aboslute coo-ordinates" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:191 msgid "Sampling" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:447 msgid "By Count" msgstr "Nach Anzahl" #: ../src/backend/filters/ionDownsample.cpp:450 msgid "Sample up to a fixed number of ions" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:456 msgid "Per Species" msgstr "Nach Spezies" #: ../src/backend/filters/ionDownsample.cpp:460 msgid "Use species specific (from ranging) sampling values" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:489 msgid "Sampling value for species" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:505 #: ../src/backend/filters/ionDownsample.cpp:529 msgid "Sampling rates" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:513 msgid "Output Count" msgstr "Ausgabe Anzahl" #: ../src/backend/filters/ionDownsample.cpp:516 msgid "Sample up to this value of points" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:521 msgid "Out Fraction" msgstr "Ausgabe Anteil" #: ../src/backend/filters/ionDownsample.cpp:525 msgid "Sample this fraction of points" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:84 #: ../src/backend/filters/clusterAnalysis.cpp:1060 msgid "Size Distribution" msgstr "Größenverteilung" #: ../src/backend/filters/clusterAnalysis.cpp:85 msgid "Chemistry Distribution" msgstr "Chemische Verteilung" #: ../src/backend/filters/clusterAnalysis.cpp:503 msgid "No range data. Can't cluster." msgstr "Keine Rangedaten. Clusteranalyse nicht möglich." #: ../src/backend/filters/clusterAnalysis.cpp:514 msgid "" "No ranges selected for cluster \"core\". Cannot continue with clustering." msgstr "" "Kein Range für cluster \"core\" ausgewählt. Kann mit Clusteranalyse nicht " "weitermachen." #: ../src/backend/filters/clusterAnalysis.cpp:523 msgid "" "No ranges selected for cluster \"bulk\". Cannot continue with clustering." msgstr "" "Kein Range für \"bulk\" ausgewählt. Kann mit Clusteranalyse nicht " "weitermachen." #: ../src/backend/filters/clusterAnalysis.cpp:689 msgid "Morphology Plot" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:690 msgid "\\lambda_1:\\lambda_2 ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:691 msgid "\\lambda_2:\\lambda_3 ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:736 msgid "No clusters had sufficient dimensionality to compute singular values" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:794 msgid "Found :" msgstr "Gefunden:" #: ../src/backend/filters/clusterAnalysis.cpp:796 msgid " clusters" msgstr " Cluster" #: ../src/backend/filters/clusterAnalysis.cpp:888 msgid "Compositions (fractional, core+bulk)" msgstr "Zusammensetzungen (fractional, core+bulk)" #: ../src/backend/filters/clusterAnalysis.cpp:890 msgid "Compositions (fractional, core only)" msgstr "Zusammensetzungen (fractional, core only)" #: ../src/backend/filters/clusterAnalysis.cpp:908 msgid "Frequencies (core+bulk)" msgstr "Häufigkeiten (core+bulk)" #: ../src/backend/filters/clusterAnalysis.cpp:939 msgid "Core Link + Erode" msgstr "Core Link + Erode" #: ../src/backend/filters/clusterAnalysis.cpp:947 msgid "Cluster algorithm mode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:958 msgid "Core Classify" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:961 msgid "" "Enable core-classifcation pre-step in clustering (Stephenson et al, 2007)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:967 msgid "Core Classify Dist" msgstr "Core Classify Dist" #: ../src/backend/filters/clusterAnalysis.cpp:970 msgid "Restrict only atoms by distance to be cluster sources" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:975 msgid "Classify Knn Max" msgstr "Classify Knn Max" #: ../src/backend/filters/clusterAnalysis.cpp:978 msgid "" "Require that the kth NN (this number) is within the classify distance, to be " "a cluster source" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:984 msgid "Core Link Dist" msgstr "Core Link Dist" #: ../src/backend/filters/clusterAnalysis.cpp:987 msgid "Distance between clusters to allow linking" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:992 msgid "Bulk Link" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:995 #: ../src/backend/filters/clusterAnalysis.cpp:1012 msgid "Enable linking of non-cluster species - eg for composition analysis " msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1002 msgid "Bulk Link (Envelope) Dist" msgstr "Bulk Link (Envelope) Dist" #: ../src/backend/filters/clusterAnalysis.cpp:1005 msgid "" "Distance from core points that form cluster that is used to grab surrounding " "bulk points" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1009 msgid "Erosion" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1018 msgid "Erode Dist" msgstr "Erode Dist" #: ../src/backend/filters/clusterAnalysis.cpp:1021 msgid "" "Distance from unclustered material in which bulk points are eroded from " "cluster" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1028 msgid "Clustering Params" msgstr "Cluster Parameter" #: ../src/backend/filters/clusterAnalysis.cpp:1033 msgid "Size Cropping" msgstr "Größeneinschrankungen" #: ../src/backend/filters/clusterAnalysis.cpp:1036 msgid "Remove clusters based upon size distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1043 msgid "Min Size" msgstr "Min Größe" #: ../src/backend/filters/clusterAnalysis.cpp:1046 msgid "Remove clusters below this size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1051 msgid "Max Size" msgstr "Max Größe" #: ../src/backend/filters/clusterAnalysis.cpp:1054 msgid "Remove clusters above this size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1063 msgid "Show number of clusters as a function of cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1069 msgid "Log Scale" msgstr "Log. Skala" #: ../src/backend/filters/clusterAnalysis.cpp:1072 msgid "Use logarithmic scale for size distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1079 msgid "Morphology Dist." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1082 msgid "Create a plot showing cluster aspect ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1088 msgid "Cluster Id" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1091 msgid "Assign cluster output a unique per-cluster value (id)." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1098 msgid "Chemistry Dist." msgstr "Chemistry Dist." #: ../src/backend/filters/clusterAnalysis.cpp:1101 msgid "Create a plot showing chemistry for each cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1111 msgid "Convert cluster counts to composition" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1117 msgid "Postprocess" msgstr "Postprozess" #: ../src/backend/filters/clusterAnalysis.cpp:1136 msgid "If selected, use as \"core\" ion type (can make clusters)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1141 msgid "Core Ranges" msgstr "Core Ranges" #: ../src/backend/filters/clusterAnalysis.cpp:1147 msgid "Enable/Disable All" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1152 msgid "Enable/disable all ions" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1165 msgid "" "If selected, use as \"bulk\" ion type (can be included in existing clusters)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1170 msgid "Bulk Ranges" msgstr "Bulk Ranges" #: ../src/backend/filters/clusterAnalysis.cpp:1186 msgid "Max. Sep + Erode" msgstr "Max. Sep + Erode" #: ../src/backend/filters/clusterAnalysis.cpp:1939 msgid " --------------------------- Parameter selection notice ------------- " msgstr " --------------------------- Parameterauswahl Notiz ------------- " #: ../src/backend/filters/clusterAnalysis.cpp:1940 msgid "You have specified a bulk distance larger than half your link distance." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1941 msgid "" "You can do this; thats OK, but the output is no longer independent of the " "computational process;" msgstr "" "Sie könne das machen, das ist in Ordnung, aber die Ausgabe ist nicht länger " "unabhängig vom Berechnungsprozess" #: ../src/backend/filters/clusterAnalysis.cpp:1942 msgid "" "This will be a problem in the case where two or more clusters can equally " "lay claim to a \"bulk\" ion. " msgstr "" "Dies ist ein Problem wenn zwei oder mehrere Cluster auf dasselbe \"bulk\" " "Ion Anspruch erheben. " #: ../src/backend/filters/clusterAnalysis.cpp:1943 msgid "" " If your inter-cluster distance is sufficiently large (larger than your bulk " "linking distance), then you can get away with this." msgstr "" " If your inter-cluster distance is sufficiently large (larger than your bulk " "linking distance), then you can get away with this." #: ../src/backend/filters/clusterAnalysis.cpp:1944 msgid "" " In theory it is possible to \"join\" the clusters, but this has not been " "implemented for speed reasons." msgstr "" "Theoretisch ist es möglich die Cluster zu 'verbinden', dies wurde jedoch aus " "Gescheindigkeitsgründen nicht implementiert." #: ../src/backend/filters/clusterAnalysis.cpp:1945 msgid "" "If you want this, please contact the author, or just use the source to add " "this in yourself." msgstr "" "Sollten Sie dies wollen, kontaktieren Sie den Autor oder verwenden Sie den " "Sourcecode um es selbst hinzuzufügen." #: ../src/backend/filters/clusterAnalysis.cpp:1946 msgid "---------------------------------------------------------------------- " msgstr "---------------------------------------------------------------------- " #: ../src/backend/filters/clusterAnalysis.cpp:1975 msgid "Build Core" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2003 msgid "Core" msgstr "Kern" #: ../src/backend/filters/clusterAnalysis.cpp:2126 msgid "Bulk" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2204 msgid "Erode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2282 msgid "Re-Collate" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2337 msgid "Classify Core" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2428 msgid "Build Bulk" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2676 #: ../src/backend/filters/clusterAnalysis.cpp:2879 msgid "Cluster Size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2677 #: ../src/backend/filters/clusterAnalysis.cpp:2883 msgid "Frequency" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2881 msgid "Composition" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:123 msgid "Local Density" msgstr "Lokale Dichte" #: ../src/backend/filters/spatialAnalysis.cpp:124 msgid "Density Filtering" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:125 msgid "Radial Distribution" msgstr "Radial Distribution" #: ../src/backend/filters/spatialAnalysis.cpp:126 msgid "Axial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:127 msgid "Binomial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:128 msgid "Point Em/Replacement" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:129 msgid "Local Concentration" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:133 msgid "Neighbour Count" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:643 msgid "Load" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:660 #: ../src/backend/filters/spatialAnalysis.cpp:2330 #: ../src/backend/filters/spatialAnalysis.cpp:2383 #: ../src/backend/filters/spatialAnalysis.cpp:2733 #: ../src/backend/filters/spatialAnalysis.cpp:3022 #: ../src/backend/filters/spatialAnalysis.cpp:3540 #: ../src/backend/filters/spatialAnalysis.cpp:4184 msgid "Build" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:705 #: ../src/backend/filters/spatialAnalysis.cpp:3558 #: ../src/backend/filters/spatialAnalysis.cpp:4073 #: ../src/backend/filters/spatialAnalysis.cpp:4201 msgid "Compute" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:803 msgid "Spatial analysis algorithm to use" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:827 #: ../src/backend/filters/spatialAnalysis.cpp:878 msgid "Stop Mode" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:830 msgid "Method to use to terminate algorithm when examining each point" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:837 msgid "NN Max" msgstr "NN Max" #: ../src/backend/filters/spatialAnalysis.cpp:840 msgid "Maximum number of neighbours to examine" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:847 msgid "Normalise bins" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:850 msgid "" "Normalise counts by binwidth. Needed when comparing NN histograms against " "one another" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:856 msgid "Show Random" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:859 msgid "Show a fitted (density matched) theoretical distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:870 msgid "Dist Max" msgstr "Abst. Max." #: ../src/backend/filters/spatialAnalysis.cpp:873 msgid "Maximum distance from each point for search" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:890 #: ../src/backend/filters/spatialAnalysis.cpp:1024 msgid "Number of bins for output 1D RDF plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:896 msgid "Surface Remove" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:899 msgid "" "Exclude surface as part of source to minimise bias in RDF (at cost of " "increased noise)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:906 msgid "Remove Dist" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:909 msgid "Minimum distance to remove from surface" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:917 #: ../src/backend/filters/spatialAnalysis.cpp:1029 msgid "Plot colour " msgstr "Plotfarbe " #: ../src/backend/filters/spatialAnalysis.cpp:920 #: ../src/backend/filters/spatialAnalysis.cpp:1032 msgid "Colour of output plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:924 #: ../src/backend/filters/spatialAnalysis.cpp:1010 #: ../src/backend/filters/spatialAnalysis.cpp:1015 #: ../src/backend/filters/spatialAnalysis.cpp:1064 #: ../src/backend/filters/spatialAnalysis.cpp:1103 msgid "Alg. Params." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:937 #: ../src/backend/filters/spatialAnalysis.cpp:1207 msgid "Source" msgstr "Quelle" #: ../src/backend/filters/spatialAnalysis.cpp:940 msgid "Ions to use for initiating RDF search" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:953 #: ../src/backend/filters/spatialAnalysis.cpp:1223 #: ../src/backend/filters/spatialAnalysis.cpp:1249 msgid "Enable/disable ion as source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:958 #: ../src/backend/filters/spatialAnalysis.cpp:1228 msgid "Source Ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:965 ../src/gl/cameras.cpp:611 msgid "Target" msgstr "Ziel" #: ../src/backend/filters/spatialAnalysis.cpp:968 #: ../src/backend/filters/spatialAnalysis.cpp:1264 msgid "Enable/disable all ions as target" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:980 #: ../src/backend/filters/spatialAnalysis.cpp:1276 msgid "Enable/disable this ion as target" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:984 msgid "Target Ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:994 msgid "Cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:997 msgid "Remove points with local density above/below this value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1003 msgid "Retain Upper" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1006 msgid "Retain either points with density above (enabled) or below cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1052 msgid "Vector between centre and end of cylinder" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1071 #: ../src/backend/filters/spatialAnalysis.cpp:3827 #: ../src/backend/filters/spatialAnalysis.cpp:3886 msgid "Block size" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1074 msgid "Number of ions to use per block" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1081 msgid "Max Block Aspect" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1084 msgid "" "Maximum allowable block aspect ratio. Blocks above this aspect are " "discarded. Setting too high decreases correlation strength. Too low causes " "loss of statistical power." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1095 msgid "Extrusion Direction" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1098 msgid "Direction in which blocks are extended during construction." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1107 msgid "Plot Counts" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1110 msgid "Show the counts in the binomial histogram" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1119 msgid "" "Normalise the counts in the binomial histogram to a probability density " "function" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1133 msgid "Display Grid" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1142 msgid "View Options" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1148 msgid "Data File" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1152 msgid "Pos file of points to subtract/replace/etc" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1157 msgid "Match Tol." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1160 msgid "Tolerance to allow for matching" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1176 msgid "Replacment condition" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1182 msgid "Replace value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1185 msgid "Use value data from file when replacing ions" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1190 msgid "Replacement" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1210 msgid "Enable/disable all ions as source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1236 msgid "Ions to use as Numerator for conc. calculation" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1785 msgid "Spatial analysis aborted by user" msgstr "Spatial analysis aborted by user" #: ../src/backend/filters/spatialAnalysis.cpp:1786 msgid "Insufficient memory to complete analysis" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1787 msgid "Required range data not present" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1788 msgid "Insufficient memory for binomial. Reduce input size?" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1789 msgid "Insufficient points to continue" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1790 msgid "Unable to load file" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2437 #: ../src/backend/filters/spatialAnalysis.cpp:2756 #: ../src/backend/filters/spatialAnalysis.cpp:3046 msgid "Analyse" msgstr "Analyse" #: ../src/backend/filters/spatialAnalysis.cpp:2516 #: ../src/backend/filters/spatialAnalysis.cpp:2606 #: ../src/backend/filters/spatialAnalysis.cpp:2672 msgid "Radial Distance" msgstr "Radialer Abstand" #: ../src/backend/filters/spatialAnalysis.cpp:2518 #: ../src/backend/filters/spatialAnalysis.cpp:2611 msgid "Count/Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2523 #: ../src/backend/filters/spatialAnalysis.cpp:2616 msgid "NN Freq." msgstr "NN Freq." #: ../src/backend/filters/spatialAnalysis.cpp:2663 msgid "Warning, " msgstr "Warnung, " #: ../src/backend/filters/spatialAnalysis.cpp:2664 msgid "" " points were unable to find neighbour points that exceeded the search " "radius, and thus terminated prematurely" msgstr "" " Punkte konnten keine Nachbapunkte die den Suchradius überschritten finden " "und beendeten vorzeitig." #: ../src/backend/filters/spatialAnalysis.cpp:2674 msgid " RDF" msgstr " RDF" #: ../src/backend/filters/spatialAnalysis.cpp:2952 #: ../src/backend/filters/spatialAnalysis.cpp:3251 msgid "Number Density (\\#/Vol^3)" msgstr "Number Density (\\#/Vol^3)" #: ../src/backend/filters/spatialAnalysis.cpp:2977 #: ../src/backend/filters/spatialAnalysis.cpp:3271 msgid "Warning," msgstr "Warnung," #: ../src/backend/filters/spatialAnalysis.cpp:2978 #: ../src/backend/filters/spatialAnalysis.cpp:3272 msgid " points were un-analysable. These have been dropped" msgstr " points were un-analysable. These have been dropped" #: ../src/backend/filters/spatialAnalysis.cpp:3000 #: ../src/backend/filters/spatialAnalysis.cpp:3294 msgid "And so on..." msgstr "Und so weiter..." #: ../src/backend/filters/spatialAnalysis.cpp:3376 msgid "Extract" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3449 msgid "Reduce" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3604 msgid "Insufficient points to complete analysis" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3627 msgid "Axial Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3629 msgid " 1D Dist. Func." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3698 msgid "Binomial" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3829 #: ../src/backend/filters/spatialAnalysis.cpp:3888 msgid "Rel. Frequency" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3966 msgid "Build Numerator" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3980 msgid "Build Denominator" msgstr "" #: ../src/backend/filters/ionColour.cpp:257 msgid "Colour Map" msgstr "Farbtabelle" #: ../src/backend/filters/ionColour.cpp:265 msgid "Reverse map" msgstr "" #: ../src/backend/filters/ionColour.cpp:266 msgid "Reverse the colour scale" msgstr "" #: ../src/backend/filters/ionColour.cpp:279 msgid "Opacity" msgstr "" #: ../src/backend/filters/ionColour.cpp:286 msgid "Num Colours" msgstr "" #: ../src/backend/filters/ionColour.cpp:288 msgid "Number of unique colours to use in colour map" msgstr "" #: ../src/backend/filters/dataLoad.cpp:61 msgid "Auto" msgstr "" #: ../src/backend/filters/dataLoad.cpp:62 msgid "Little" msgstr "" #: ../src/backend/filters/dataLoad.cpp:63 msgid "Big" msgstr "" #: ../src/backend/filters/dataLoad.cpp:66 msgid "POS Data" msgstr "Pos-Daten" #: ../src/backend/filters/dataLoad.cpp:67 msgid "Text Data" msgstr "Text-Daten" #: ../src/backend/filters/dataLoad.cpp:68 msgid "ATO Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:248 msgid " does not exist" msgstr " existiert nicht" #: ../src/backend/filters/dataLoad.cpp:275 msgid "Reading File" msgstr "" #: ../src/backend/filters/dataLoad.cpp:290 #: ../src/backend/filters/dataLoad.cpp:303 #: ../src/backend/filters/dataLoad.cpp:347 #: ../src/backend/filters/dataLoad.cpp:358 #: ../src/backend/filters/dataLoad.cpp:418 msgid "Error loading file: " msgstr "Fehler beim Laden der Datei: " #: ../src/backend/filters/dataLoad.cpp:320 msgid "Sampling is active, loaded " msgstr "" #: ../src/backend/filters/dataLoad.cpp:321 msgid " available." msgstr "" #: ../src/backend/filters/dataLoad.cpp:329 msgid "Loaded entire dataset, " msgstr "" #: ../src/backend/filters/dataLoad.cpp:329 #: ../src/backend/filters/dataLoad.cpp:428 msgid " points." msgstr "" #: ../src/backend/filters/dataLoad.cpp:373 msgid "" "Data file contained incorrect number of columns -- should be 3 or 4, was " msgstr "" #: ../src/backend/filters/dataLoad.cpp:427 msgid "Loaded dataset, " msgstr "" #: ../src/backend/filters/dataLoad.cpp:460 msgid "" "Warning:One or more bounds of the loaded data approaches the limits of " "numerical stability for the internal data type(magnitude too large). " "Consider rescaling data before loading" msgstr "" "Warnung: Eine oder mehrere Grenzen der geladenen Daten erreichen das Limit " "der numerischen Stabilität des internen Datentyps (Größenordnung zu groß). " "Erwägen Sie die Daten vor dem Laden zu skalieren. " #: ../src/backend/filters/dataLoad.cpp:485 msgid "File from which to load data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:488 msgid "" "Readable files (*.xml, *.pos, *.txt,*.csv, *.ato)|*.xml;*.pos;*.txt;*.csv;*." "ato|All Files|*" msgstr "" #: ../src/backend/filters/dataLoad.cpp:498 msgid "File type" msgstr "Dateityp" #: ../src/backend/filters/dataLoad.cpp:500 msgid "Type of file to be loaded" msgstr "" #: ../src/backend/filters/dataLoad.cpp:515 msgid "Entries per point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:516 msgid "Number of decimal values in file per 3D point (normally 4)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:535 msgid "File \"Endianness\"" msgstr "" #: ../src/backend/filters/dataLoad.cpp:536 msgid "On-disk data storage format. If file won't load, just try each" msgstr "" #: ../src/backend/filters/dataLoad.cpp:561 msgid "Relative offset of each entry in file for point's X position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:569 msgid "Relative offset of each entry in file for point's Y position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:577 msgid "Relative offset of each entry in file for point's Z position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:585 msgid "" "Relative offset of each entry in file to use for scalar value of 3D point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:588 msgid "Value Label" msgstr "" #: ../src/backend/filters/dataLoad.cpp:592 msgid "Name for the scalar value associated with each point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:595 msgid "Format params." msgstr "" #: ../src/backend/filters/dataLoad.cpp:601 msgid "Enabled" msgstr "Aktiviert" #: ../src/backend/filters/dataLoad.cpp:605 msgid "Load this file?" msgstr "" #: ../src/backend/filters/dataLoad.cpp:616 msgid "Sample data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:619 msgid "" "Perform random selection on file contents, instead of loading entire file" msgstr "" #: ../src/backend/filters/dataLoad.cpp:626 msgid "Load Limit (MB)" msgstr "Ladelimit (MB)" #: ../src/backend/filters/dataLoad.cpp:629 msgid "Limit for size of data to load" msgstr "" #: ../src/backend/filters/dataLoad.cpp:636 msgid "Monitor" msgstr "Monitor" #: ../src/backend/filters/dataLoad.cpp:640 msgid "" "Watch file timestamp to track changes to file contents from other programs" msgstr "" #: ../src/backend/filters/dataLoad.cpp:644 msgid "Load params." msgstr "" #: ../src/backend/filters/dataLoad.cpp:651 msgid "Default colour " msgstr "Bevorzugte Farbe " #: ../src/backend/filters/dataLoad.cpp:654 msgid "Default colour for points, if not overridden by other filters" msgstr "" #: ../src/backend/filters/dataLoad.cpp:659 msgid "Draw Size" msgstr "Draw Size" #: ../src/backend/filters/dataLoad.cpp:662 msgid "Default size for points, if not overridden by other filters" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:77 msgid "Maximum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:78 msgid "Max in limit" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:79 msgid "Probability" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:170 msgid "Extrema" msgstr "Extrema" #: ../src/backend/filters/spectrumPlot.cpp:219 msgid "count" msgstr "Anzahl" #: ../src/backend/filters/spectrumPlot.cpp:304 msgid "Mixed data" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:445 msgid "Background:" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:504 msgid "Relative " msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:507 msgid "Probability Density" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:584 msgid "Step size for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:589 msgid "Auto Min/max" msgstr "Auto Min/max" #: ../src/backend/filters/spectrumPlot.cpp:593 msgid "Automatically compute spectrum upper and lower bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:598 msgid "Min" msgstr "Min" #: ../src/backend/filters/spectrumPlot.cpp:601 msgid "Starting position for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:606 msgid "Max" msgstr "Max" #: ../src/backend/filters/spectrumPlot.cpp:609 msgid "Ending position for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:617 msgid "Logarithmic" msgstr "Logarithmisch" #: ../src/backend/filters/spectrumPlot.cpp:620 msgid "Convert the plot to logarithmic mode" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:632 msgid "Normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:635 msgid "Rescale the plot height, to make inter-spectrum comparisons easier" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:642 msgid "Lower Bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:646 msgid "Do not use data below this x-value for normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:650 msgid "Upper Bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:654 msgid "Do not use data above this x-value for normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:672 msgid "Visual style of plot" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:679 msgid "Colour of plotted spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:694 msgid "Model" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:697 msgid "Fitting method to use" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:708 msgid "Fit Start" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:709 msgid "Start mass value for fitting background" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:715 msgid "Fit End" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:716 msgid "End mass value for fitting background" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:729 msgid "Corr. Only" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:730 msgid "Only show corrected spectrum, not fit" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:738 msgid "Background Mode" msgstr "" #: ../src/backend/configFile.cpp:187 msgid "Config file present, but is not valid (root node test)" msgstr "Konfigurationsdatei vorhanden, aber nicht gültig (root node test)" #: ../src/backend/configFile.cpp:228 msgid "Unable to interpret recent file entry" msgstr "Kann den letzten Dateieintrag nicht interpretieren" #: ../src/backend/configFile.cpp:268 msgid "Unable to determine filter type in defaults listing." msgstr "Kann den Filtertyp im Defaultslisting nicht bestimmen." #: ../src/backend/configFile.cpp:605 msgid "Online access for non win32/apple platforms is intentionally disabled, " msgstr "" "Onlinezugang für nicht Win32/apple systeme wurde absichtlich deaktiviert." #: ../src/backend/configFile.cpp:606 msgid "" "regardless of the settings you use here. Use your package manager to keep up-" "to-date" msgstr "" "Nutzen Sie Ihren Paketmanager um up-to-date zu sein unabhängig von den " "Einstellungen die Sie hier verwenden" #: ../src/backend/filtertreeAnalyse.cpp:223 msgid "" "Parent filter has no output, but filter requires input -- there is no point " "in placing a child filter here." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:224 msgid "Leaf-only filter with child" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:234 msgid "" "Parent filters' output will be blocked by child, without use. Parent results " "will be dropped." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:235 #: ../src/backend/filtertreeAnalyse.cpp:249 msgid "Bad parent->child pair" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:248 msgid "" "First filter does not output anything useable by child filter. Child filter " "not useful." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:328 msgid "Spatial results possibly altered" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:329 msgid "" "Filters and settings selected that could alter reported results that depend " "upon density. Check to see if spatial sampling may be happening in the " "filter tree - this warning is provisional only." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:397 msgid "Filter needs parent \"" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:398 msgid "" "\" but does not have one. Filter may not function correctly until this " "parent is given." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:399 msgid "Filter missing needed parent" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:430 msgid "Bad range filter settings" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:431 msgid "" "Rangefile set to drop unranged data, however a child filter requires it." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:613 msgid "Composition results possibly altered" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:614 msgid "" "Filters and settings selected that could bias reported composition. Check to " "see if species biasing may occcur in the filter tree - this warning is " "provisional only." msgstr "" #: ../src/backend/plot.cpp:29 msgid "Moving avg." msgstr "Gleit.Durchschn." #: ../src/backend/plot.cpp:33 msgid "Lines" msgstr "Linien" #: ../src/backend/plot.cpp:34 msgid "Bars" msgstr "Block" #: ../src/backend/plot.cpp:35 msgid "Steps" msgstr "Stufen" #: ../src/backend/plot.cpp:36 msgid "Stem" msgstr "Stem" #: ../src/backend/plot.cpp:37 msgid "Points" msgstr "Punkte" #: ../src/backend/plot.cpp:39 msgid "Density" msgstr "" #: ../src/backend/plot.cpp:40 msgid "Scatter" msgstr "" #: ../src/backend/plot.cpp:739 ../src/backend/plot.cpp:747 msgid "Multiple data types" msgstr "" #: ../src/backend/plot.cpp:1581 msgid "error" msgstr "Fehler" #: ../src/backend/plot.cpp:1821 msgid "Amplitude" msgstr "" #: ../src/backend/filtertree.cpp:1151 msgid "WARNING: Skipping node " msgstr "WARNUNG: Skipping node " #: ../src/backend/filtertree.cpp:1151 msgid " as it was not recognised" msgstr " wurde nicht erkannt." #: ../src/backend/filtertree.cpp:1189 msgid "Error processing node: " msgstr "Fehler beim Verarbeiten von Node: " #: ../src/gl/cameras.cpp:596 msgid "Lock" msgstr "Sperren" #: ../src/gl/cameras.cpp:617 msgid "Up Dir." msgstr "Up Dir." #: ../src/gl/cameras.cpp:625 ../src/gl/cameras.cpp:728 msgid "Perspective" msgstr "Perspektivisch" #: ../src/gl/cameras.cpp:631 msgid "Projection" msgstr "Projektion" #: ../src/gl/cameras.cpp:640 msgid "Field of View (deg)" msgstr "Bildausschnitt" #: ../src/gl/cameras.cpp:646 msgid "View size" msgstr "Anzeigegröße" #: ../src/3Depict.cpp:397 msgid "File : " msgstr "Datei : " #: ../src/3Depict.cpp:397 msgid " does not exist. Skipping" msgstr " existiert nicht. Überspringe" #: ../src/common/constants.cpp:22 msgid "" "Range Files (*.rng; *.env; *.rrng)|*.rng;*.env;*.rrng;*.RRNG;*.RNG;*.ENV|RNG " "File (*.rng)|*.rng;*.RNG|Environment File (*.env)|*.env;*.ENV|RRNG Files (*." "rrng)|*.rrng;*.RRNG|All Files (*)|*" msgstr "" #: ../src/common/basics.cpp:183 msgid "in the future?" msgstr "in Zukunft?" #: ../src/common/basics.cpp:234 msgid "a decade ago" msgstr "vor zehn Jahren" #: ../src/common/basics.cpp:235 msgid "a year ago" msgstr "vor einem Jahr" #: ../src/common/basics.cpp:236 msgid "a month ago" msgstr "vor einem Monat" #: ../src/common/basics.cpp:237 msgid "a week ago" msgstr "vor einer Woche" #: ../src/common/basics.cpp:238 msgid "a day ago" msgstr "gestern" #: ../src/common/basics.cpp:239 msgid "an hour ago" msgstr "vor einer Stunde" #: ../src/common/basics.cpp:240 msgid "45 minutes ago" msgstr "vor 45 Minuten" #: ../src/common/basics.cpp:241 msgid "30 minutes ago" msgstr "vor 30 Minuten" #: ../src/common/basics.cpp:242 msgid "20 minutes ago" msgstr "vor 20 Minuten" #: ../src/common/basics.cpp:243 msgid "15 minutes ago" msgstr "vor 15 Minuten" #: ../src/common/basics.cpp:244 msgid "10 minutes ago" msgstr "vor 10 Minuten" #: ../src/common/basics.cpp:245 msgid "5 minutes ago" msgstr "vor 5 Minuten" #: ../src/common/basics.cpp:246 msgid "a minute ago" msgstr "vor einer Minute" #: ../src/common/basics.cpp:247 msgid "30 seconds ago" msgstr "vor 30 Sekunden" #: ../src/common/basics.cpp:248 msgid "10 seconds ago" msgstr "vor 10 Sekunden" #: ../src/common/basics.cpp:249 msgid "a second ago" msgstr "vor einer Sekunde" #: ../src/common/basics.cpp:254 msgid "a few decades ago" msgstr "vor einigen Dekaden" #: ../src/common/basics.cpp:255 msgid "a few years ago" msgstr "vor einigen Jahren" #: ../src/common/basics.cpp:256 msgid "a few months ago" msgstr "vor einigen Monaten" #: ../src/common/basics.cpp:257 msgid "a few weeks ago" msgstr "vor einigen Wochen" #: ../src/common/basics.cpp:258 msgid "a few days ago" msgstr "vor einigen Tagen" #: ../src/common/basics.cpp:259 msgid "a few hours ago" msgstr "vor einigen Stunden" #: ../src/common/basics.cpp:266 msgid "a few minutes ago" msgstr "vor einigen Minuten" #: ../src/common/basics.cpp:269 msgid "a few seconds ago" msgstr "vor einigen Sekunden" #: ../src/common/basics.cpp:296 msgid "moments ago" msgstr "kürzlich" #: ../src/common/colourmap.cpp:242 msgid "Jet" msgstr "Jet" #: ../src/common/colourmap.cpp:243 msgid "Hot" msgstr "Heiss" #: ../src/common/colourmap.cpp:244 msgid "Cold" msgstr "Kalt" #: ../src/common/colourmap.cpp:245 msgid "Grey" msgstr "Grau" #: ../src/common/colourmap.cpp:246 msgid "Cyclic" msgstr "Cyclic" #: ../src/common/colourmap.cpp:247 msgid "General" msgstr "Allgemein" #: ../src/common/colourmap.cpp:248 msgid "Blue" msgstr "Blau" #: ../src/common/colourmap.cpp:249 msgid "Pseudo-Random" msgstr "Pseudo-Random" #: ../src/wx/wxcomponents.cpp:191 msgid "Save Data..." msgstr "Datei speichern..." #: ../src/wx/wxcomponents.cpp:192 msgid "Text File (*.txt)|*.txt|All Files (*)|*" msgstr "Text Datei (*.txt)|*.txt|Alle Dateien (*)|*" #: ../src/wx/wxcomponents.cpp:204 msgid "Error saving file. Check output dir is writable." msgstr "" "Fehler beim Schreiben der Datei. Stellen Sie sicher, dass das " "Zielverzeichnis nicht schreibgeschüzt ist." #: ../src/backend/filters/dataLoad.h:135 msgid "Pos Data" msgstr "POS-Daten" #: ../src/backend/filters/ionInfo.h:103 msgid "Ion info" msgstr "Ioneninfo" #: ../src/backend/filters/externalProgram.h:69 msgid "Ext. Program" msgstr "Ext. Programm" #: ../src/backend/filters/ionColour.h:63 msgid "Spectral Colour" msgstr "Spectral Farbe" #: ../src/backend/filters/profile.h:123 msgid "Comp. Prof." msgstr "Konz. Prof." #: ../src/backend/filters/ionDownsample.h:79 msgid "Ion Sampler" msgstr "Ion Sampler" #: ../src/backend/filters/boundingBox.h:76 msgid "Bound box" msgstr "Begrenzungs-Box" #: ../src/backend/filters/transform.h:71 msgid "Ion. Transform" msgstr "Ion. Transformieren" #: ../src/wx/wxcomponents.h:82 msgid "treeCtrl" msgstr "" #: ../data/startup-tips.txt:5 msgid "" "You can reset the main view by tapping the space bar. Hold down modifier " "keys like shift,ctrl to change the axis. Double tap to switch which axis to " "look down" msgstr "" #: ../data/startup-tips.txt:6 msgid "" "You can delete filters from the tree by selecting them, then tapping delete?" msgstr "" #: ../data/startup-tips.txt:7 msgid "" "Multiple languages are supported? You can translate the program into your " "own language at https://www.transifex.com/projects/p/3depict/" msgstr "" #: ../data/startup-tips.txt:8 msgid "" "Package files can be easily shared to allow others to view your analysis, " "using the File->Export->Package menu item" msgstr "" #: ../data/startup-tips.txt:9 msgid "" "You can export plots to SVG \"Vector\" format, for easier editing - edit " "your plots in inkscape!" msgstr "" #: ../data/startup-tips.txt:10 msgid "You can access the manual from the Help menu" msgstr "" #: ../data/startup-tips.txt:11 msgid "You can change filter defaults using the Edit->Preferences menu item" msgstr "" #: ../data/startup-tips.txt:12 msgid "" "You can overlay multiple plots at once, by selecting more than on plot at a " "time (e.g. using Ctrl)" msgstr "" #: ../data/startup-tips.txt:13 msgid "" "Calculations are much faster (more than linear speedup) when working with " "smaller datasets - try sampling, or clipping out a small region to work " "faster, then remove the sampling when you are ready" msgstr "" #: ../data/startup-tips.txt:14 msgid "" "You can abort most calculations either by pressing Escape (OSX/Linux), or by " "using the Abort button (Windows)" msgstr "" #: ../data/startup-tips.txt:15 msgid "" "That anyone can contribute to improving this program, even without knowing " "about computer programming?" msgstr "" #: ../data/startup-tips.txt:16 msgid "" "You can load more than one file at a time, then either operate on the " "separately, or together" msgstr "" #: ../data/startup-tips.txt:17 msgid "" "You can have more than one range file for different parts of your dataset" msgstr "" #: ../data/startup-tips.txt:18 msgid "" "Cameras can be saved and retrieved whenever you like, using the camera tab" msgstr "" #: ../data/startup-tips.txt:19 msgid "" "Subsections of the filter tree can be saved to the \"Stashed filters\" drop-" "down" msgstr "" #: ../data/startup-tips.txt:20 msgid "" "The console tab along the bottom often shows useful messages from filters. " "When new messages appear, a small symbol is shown on the tab" msgstr "" #: ../data/startup-tips.txt:21 msgid "" "The raw data used for any plot can be accessed from the \"Raw\" tab on the " "bottom panel" msgstr "" #: ../data/startup-tips.txt:22 msgid "" "You can ask questions about the program, or using it on your data on our " "forums (https://sourceforge.net/p/threedepict/discussion/general/)" msgstr "" #: ../data/startup-tips.txt:23 msgid "" "By creating a camera, you can switch between orthographic and perspective " "views" msgstr "" #: ../data/startup-tips.txt:24 msgid "" "You can open multiple files at once, and get a side-by-side view by " "translating (shifting) one of the datasets to one side" msgstr "" #~ msgid "ORNL format RNG (*.rng)|*.rng|All Files (*)|*" #~ msgstr "ORNL Format RNG (*.rng)|*.rng|Alle Dateien (*)|*" #~ msgid "POS Data (*.pos)|*.pos|All Files (*)|*" #~ msgstr "POS-Daten (*.pos)|*.pos|All Files (*)|*" #~ msgid "Mass-to-Charge (amu/e)" #~ msgstr "Masse-zu-Ladung (amu/e)" #~ msgid "Last Outputs" #~ msgstr "Letzte Ausgabe" #~ msgid "Type" #~ msgstr "Type" #~ msgid "Num" #~ msgstr "Num" #~ msgid "Aborted." #~ msgstr "Abgebrochen" #~ msgid "Gaussian (2𝜎)" #~ msgstr "Gauss (2𝜎)" #~ msgid "Zero" #~ msgstr "Null" #~ msgid "Bounce" #~ msgstr "Bounce" #~ msgid "Kernel Bins" #~ msgstr "Kernel Bins" #~ msgid "Exterior values" #~ msgstr "Exterior values" #~ msgid "Inconsistent number of columns found" #~ msgstr "Inkonsistente Anzahl an Spalten gefunden" #~ msgid "Tile " #~ msgstr "Tile " #~ msgid "Filter Defaults" #~ msgstr "Filtervoreinstellungen" #~ msgid "Notice" #~ msgstr "Notiz" #~ msgid "For security reasons, defaults are not modifiable for this filter" #~ msgstr "" #~ "Aus Sicherheitsgründen können die Voreinstellungen für diesen Filter " #~ "nicht geändert werden." #~ msgid "Pref" #~ msgstr "Pref" #~ msgid "New stash name...." #~ msgstr "Neuer Stashname..." #~ msgid "" #~ "Range Files (*rng; *env; *rrng)|*rng;*env;*rrng|RNG File (*.rng)|*.rng|" #~ "Environment File (*.env)|*.env|RRNG Files (*.rrng)|*.rrng|All Files (*)|*" #~ msgstr "" #~ "Rangedatei (*rng; *env; *rrng)|*rng;*env;*rrng|RNG File (*.rng)|*.rng|" #~ "Environment Datei (*.env)|*.env|RRNG Files (*.rrng)|*.rrng|Alle Dateien " #~ "(*)|*" #~ msgid "Next Fullscreen mode: none" #~ msgstr "Nächster Vollbildmodus: keiner" #~ msgid "Next Fullscreen mode: complete" #~ msgstr "Nächster Vollbildmodus: vollständig" #~ msgid "Next Fullscreen mode: with toolbars" #~ msgstr "Nächster Vollbildmodus: mit Werkzeugleisten" #~ msgid "Next Mode: No fullscreen" #~ msgstr "Nächster Modus: Kein Vollbild" #~ msgid "Next Mode: fullscreen w/o toolbar" #~ msgstr "Nächster Modus: Vollbild ohne Werkzeugleiste" #~ msgid "Next Mode: fullscreen with toolbar" #~ msgstr "Nächster Modus: Vollbild mit Werkzeugleiste" #~ msgid "displays this message" #~ msgstr "zeigt diese Nachricht" #~ msgid "inputfile" #~ msgstr "Eingabedatei" #~ msgid "Error processing command line" #~ msgstr "Fehler beim Ausführen der Kommandozeile" #~ msgid "Unable to set working directory" #~ msgstr "Kann Arbeitsverzeichnis nicht festlegen" #~ msgid "Error saving posfile result for external program" #~ msgstr "Fehler beim Speichern von Posdateiergebnis für externes Programm" #~ msgid "Error saving plot result for externalprogram" #~ msgstr "Fehler beim Speichern von Posdateiergebnis für externes Programm" #~ msgid "Error creating temporary directory" #~ msgstr "Fehler beim Anlegen des temporären Verzeichnisses" #~ msgid "Detected unusable number of columns in plot" #~ msgstr "Detected unusable number of columns in plot" #~ msgid "Unable to parse plot result from external program" #~ msgstr "Unable to parse plot result from external program" #~ msgid "Unable to load ions from external program" #~ msgstr "Kann Ionen von externem Programm nicht laden" #~ msgid "Unable to perform commandline substitution" #~ msgstr "Unable to perform commandline substitution" #~ msgid "Error executing external program" #~ msgstr "Fehler beim Ausführen von externem Programm" #~ msgid "Clustering aborted" #~ msgstr "Clustering abgebrochen" #~ msgid "No core ions for cluster" #~ msgstr "Keine Kernionen für Cluster" #~ msgid "No bulk ions for cluster" #~ msgstr "Keine Bulkionen für Cluster" #~ msgid "Voxelisation aborted" #~ msgstr "Voxelisation abgebrochen" #~ msgid "Out of memory" #~ msgstr "Zu wenig Speicher" #~ msgid "Unable to perform filter convolution" #~ msgstr "Kann Filter convolution nicht durchführen" #~ msgid "Voxelisation bounds are invalid" #~ msgstr "Voxelisation Grenzen sin ungültig" #~ msgid "Too many bins in comp. profile." #~ msgstr "Zu viele Bins im Konzentrationsprofil." #~ msgid "Not enough memory for comp. profile." #~ msgstr "Nicht genug Speicher für Konz.-Profil." #~ msgid "Aborted composition prof." #~ msgstr "Konzentrationspr. abgebr." #~ msgid "Insufficient data to complete analysis." #~ msgstr "Ungenügend Daten zum Fertigstellen der Analyse." #~ msgid "Unable to allocate memory" #~ msgstr "Kann Speicher nicht zuweisen" #~ msgid "Downsample Aborted" #~ msgstr "Datenreduktion abgebrochen" #~ msgid "Insuffient memory for downsample" #~ msgstr "Nicht genug Speicher zur Datenreduktion" #~ msgid "Insufficient memory for operation" #~ msgstr "Nicht genügend Speicher für Operation" #~ msgid "Bug? Problem with qhull library, cannot run convex hull." #~ msgstr "" #~ "Bug? Problem mit qhull Bibliothek. Kann convex hull nicht ausführen." #~ msgid "Insufficient memory for spectrum filter." #~ msgstr "Nicht genügend Speicher für Spektrumfilter" #~ msgid "Bad bincount value in spectrum filter." #~ msgstr "Falsche Binanzahl im Spektrumfilter." #~ msgid "Ranging aborted by user" #~ msgstr "Ranging durch User abgebrochen" #~ msgid "Insufficient memory for range" #~ msgstr "Nicht genug Speicher für Range" #~ msgid "" #~ " Unable to merge stashes correctly. This is improbable, so please report " #~ "this." #~ msgstr "" #~ " Kann stashes nicht korrekt zusammenführen. Dies ist nicht möglich bitte " #~ "melden Sie das." 3Depict-0.0.19/translations/3Depict_base.pot0000644000175000017500000036412212723162703020225 0ustar pcuserpcuser# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2016-05-31 11:15+1000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/gui/glPane.cpp:642 msgid "Use shift/ctrl-space or double tap to alter reset axis" msgstr "" #: ../src/gui/glPane.cpp:938 msgid "Image progress" msgstr "" #: ../src/gui/glPane.cpp:939 msgid "Rendering tiles..." msgstr "" #: ../src/gui/glPane.cpp:1132 msgid "Animation progress" msgstr "" #: ../src/gui/glPane.cpp:1133 msgid "Rendering sequence..." msgstr "" #: ../src/gui/glPane.cpp:1171 msgid "Saving Image " msgstr "" #: ../src/gui/glPane.cpp:1171 ../src/gui/mainFrame.cpp:4401 #: ../src/gui/mainFrame.cpp:4405 ../src/gui/mainFrame.cpp:4418 #: ../src/backend/filters/dataLoad.cpp:321 msgid " of " msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:40 msgid "Range Sources" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:42 msgid "Details" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:53 msgid "Source Filter" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:54 #: ../src/backend/filters/rangeFile.cpp:656 msgid "Ions" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:55 #: ../src/gui/dialogs/rangeEditDialog.cpp:1587 #: ../src/backend/filters/voxelise.cpp:834 #: ../src/backend/filters/rangeFile.cpp:723 msgid "Ranges" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:88 msgid "Param" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:89 #: ../src/gui/dialogs/animateFilterDialog.cpp:1200 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:105 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:352 #: ../src/backend/filters/dataLoad.cpp:581 msgid "Value" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:90 msgid "Value2" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:97 msgid "Ion Name" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:98 msgid "Num Ranges" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:116 #: ../src/gui/dialogs/rangeEditDialog.cpp:696 ../src/backend/filter.cpp:53 msgid "Ion" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:117 msgid "Range Start" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:118 msgid "Range end" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:151 ../src/gui/mainFrame.cpp:2376 msgid "Save pos..." msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:152 msgid "" "Cameca/Ametek RRNG (*.rrng)|*.rrng|ORNL format RNG (*.rng)|*.rng|Cameca ENV " "(*.env)|*.env|All Files (*)|*" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:184 ../src/gui/mainFrame.cpp:1463 #: ../src/gui/mainFrame.cpp:1638 ../src/gui/mainFrame.cpp:1713 #: ../src/gui/mainFrame.cpp:2266 ../src/gui/mainFrame.cpp:2443 #: ../src/gui/mainFrame.cpp:2556 msgid "Unable to save. Check output destination can be written to." msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:187 ../src/gui/mainFrame.cpp:1463 #: ../src/gui/mainFrame.cpp:1588 ../src/gui/mainFrame.cpp:1637 #: ../src/gui/mainFrame.cpp:1713 ../src/gui/mainFrame.cpp:2265 #: ../src/gui/mainFrame.cpp:2338 ../src/gui/mainFrame.cpp:2442 #: ../src/gui/mainFrame.cpp:2555 ../src/wx/wxcomponents.cpp:204 msgid "Save error" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:253 msgid "Export Range" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:258 msgid "List of rangefiles in filter tree" msgstr "" #: ../src/gui/dialogs/ExportRngDialog.cpp:260 msgid "Detailed view of selected range" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:92 msgid "Cameca/Ametek RRNG" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:93 msgid "Oak-Ridge RNG" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:94 msgid "Cameca/Ametek ENV" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:156 msgid "Key frames" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:157 msgid "Output Data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:158 msgid "Filters and properties" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:164 msgid "Dir : " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:167 msgid "Output only when refresh required" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:169 msgid "Data Types:" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:170 msgid "3D Images" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:171 msgid "File Prefix: " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:173 msgid "Size : " msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:175 msgid "..." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:176 msgid "Point data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:177 #: ../src/gui/dialogs/rangeEditDialog.cpp:1586 msgid "Plots" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:178 msgid "Voxel data" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:179 msgid "Range files" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:180 msgid "Format" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:197 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:104 #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:350 msgid "Frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:702 msgid "transition frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:702 #: ../src/gui/mainFrame.cpp:1690 msgid "Frame count" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:774 msgid "Key frame : Colour" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:827 msgid "File existed, but was unable to read or interpret file contents." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:828 msgid "String load failed" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:849 msgid "Keyframe : decimal" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:858 msgid "Keyframe : integer" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:867 msgid "Keyframe : 3D Point" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:995 msgid "Select or create new folder" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1175 msgid "Export Animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1176 msgid "Select filter" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1177 msgid "Select property" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1179 #: ../src/gui/dialogs/animateFilterDialog.cpp:1198 msgid "Filter" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1180 #: ../src/gui/dialogs/animateFilterDialog.cpp:1199 msgid "Property" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1181 #: ../src/backend/filters/annotation.cpp:545 #: ../src/backend/filters/annotation.cpp:551 #: ../src/backend/filters/transform.cpp:1150 #: ../src/backend/filters/ionDownsample.cpp:465 #: ../src/backend/filters/spatialAnalysis.cpp:1173 msgid "Mode" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1182 #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:68 msgid "Start Frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1183 #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:70 msgid "End Frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1184 msgid "Keyframe table" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1185 msgid "Remove the selected keyframe from the table" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1186 msgid "Enter where the animation frames will be exported to" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1187 msgid "Browse to directory where the animation frames will be exported to" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1189 msgid "" "Title for files, result will be saved as #-name.png, where # is image number." msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1190 msgid "Target resolution (image size)" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1191 msgid "Select frame for property display" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1192 msgid "Enter frame number to change frame (eg 1/20)" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1193 msgid "Save point data (POS files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1194 msgid "Save plots (as text files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1195 msgid "Save voxel data (raw files) in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1196 msgid "Save range files in output folder?" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1201 msgid "Animation parameters for current frame" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1202 msgid "Abort animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1203 msgid "Run Animation" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1274 msgid "Filter view" msgstr "" #: ../src/gui/dialogs/animateFilterDialog.cpp:1275 msgid "Frame view" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:37 ../src/backend/filter.cpp:476 #: ../src/backend/filter.cpp:479 msgid "Error" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:39 msgid "Warning" msgstr "" #: ../src/gui/dialogs/filterErrorDialog.cpp:42 #: ../src/gui/dialogs/filterErrorDialog.cpp:52 msgid "Filter Errors" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:49 msgid "Stashes" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:52 msgid "Stashed Tree" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:54 msgid "Properties" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:60 msgid "Stash Name" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:61 msgid "Filter Count" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:94 msgid "Stashed Trees" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:97 msgid "Erase stashed item" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:98 msgid "Filter view for current stash" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:99 msgid "Settings for selected filter in current stash" msgstr "" #: ../src/gui/dialogs/StashDialog.cpp:100 msgid "Available stashes" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:45 msgid "Width :" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:47 msgid "Height :" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:50 #: ../src/gui/dialogs/prefDialog.cpp:85 msgid "Reset" msgstr "" #: ../src/gui/dialogs/resolutionDialog.cpp:336 msgid "Resolution Selection" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:39 msgid "Remove &All" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:123 msgid "Restore state?" msgstr "" #: ../src/gui/dialogs/autosaveDialog.cpp:133 msgid "Multiple autosave states were found; would you like to restore one?" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:45 msgid "Start Frame: " msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:47 msgid "From File" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:50 msgid "From Table" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:240 msgid "Select text file..." msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:241 msgid "Text files (*.txt)|*.txt;|All Files (*)|*" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:342 msgid "String Keyframes" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:344 msgid "Frame at which to start string sequence" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:345 msgid "Frame offset for data start" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:346 msgid "File to use as string data source, one value per row" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:347 msgid "Select file to use as data source" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:348 msgid "Use table below for data source" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:354 msgid "Add new data rows to table, hold shift/cmd to insert multiple rows" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:355 msgid "Remove selected strings from table" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:356 msgid "Abort value selection and return to previous window" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp:357 msgid "Accept data values" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:60 msgid "Keyframe Data" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:61 msgid "Transition" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:64 msgid "Step" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:65 msgid "Ramp" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:73 msgid "Initial Value" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:74 msgid "startColour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:75 msgid "Final Value" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:76 msgid "endColour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:250 msgid "Key Frame : Colour" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:252 msgid "Colour at the start of the transtition" msgstr "" #: ../src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp:253 msgid "Colour at end of transition" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:73 msgid "Panel Display" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:75 msgid "Online Updates" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:77 ../src/gui/dialogs/prefDialog.cpp:560 msgid "Startup" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:78 msgid "Camera Speed" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:79 msgid "Available Filters" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:84 msgid "Reset All" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:87 msgid "Show all panels" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:88 msgid "Remember last" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:89 msgid "Show Selected" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:92 msgid "Control Pane" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:93 msgid "Raw Data Panel" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:94 ../src/gui/mainFrame.cpp:691 msgid "Plot List" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:96 msgid "Periodically notify about available updates" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:98 msgid "Prefer orthographic at startup" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:99 msgid "Move Rate" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:100 ../src/gui/dialogs/prefDialog.cpp:104 msgid "(slow)" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:102 ../src/gui/dialogs/prefDialog.cpp:106 msgid "(fast)" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:103 msgid "Zoom Rate" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:416 msgid "Show all panels when starting program" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:419 msgid "Show panels visible at last shutdown when starting program" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:426 msgid "Show selected panels when starting program" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:475 msgid "Preferences" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:477 msgid "Set the method of panel layout when starting the program" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:480 msgid "" "Lets the program check the internet to see if updates to the program version " "are available, then notifies you about updates now and again." msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:482 msgid "" "By default, use an orthographic camera at startup. State files will override " "this preference." msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:483 msgid "Camera translation, orbit and swivel rates. " msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:484 msgid "Camera zooming rate." msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:486 msgid "Reset the filter initial values back to program defaults" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:487 msgid "Reset all filter initial values back to program defaults" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:559 msgid "Filt. Default" msgstr "" #: ../src/gui/dialogs/prefDialog.cpp:561 msgid "Camera" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:63 msgid "Export:" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:64 #: ../src/backend/filters/boundingBox.cpp:567 msgid "Visible" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:65 msgid "Selected Data" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:67 msgid "Available Data" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:73 msgid "Selection" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:98 ../src/gui/dialogs/ExportPos.cpp:101 msgid "Index" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:99 ../src/gui/dialogs/ExportPos.cpp:102 #: ../src/backend/filters/profile.cpp:604 #: ../src/backend/filters/spatialAnalysis.cpp:2520 #: ../src/backend/filters/spatialAnalysis.cpp:2613 #: ../src/backend/filters/spatialAnalysis.cpp:2673 #: ../src/backend/filters/spatialAnalysis.cpp:3628 #: ../src/backend/filters/spatialAnalysis.cpp:3831 #: ../src/backend/filters/spatialAnalysis.cpp:3890 #: ../src/backend/filters/spectrumPlot.cpp:65 msgid "Count" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:451 msgid "Export Pos Data" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:454 msgid "Tree of filters, select leaves to show ion data." msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:456 msgid "Add all data from all filters" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:457 msgid "Add all data from currently selected filter" msgstr "" #: ../src/gui/dialogs/ExportPos.cpp:458 msgid "Add selected data from currently selected filter" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:221 msgid "Show Overlays" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:246 msgid "e.g. H2O" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:561 #: ../src/gui/dialogs/rangeEditDialog.cpp:695 ../src/gui/mainFrame.cpp:5966 #: ../src/backend/filter.cpp:54 msgid "Plot" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:562 msgid "Short Name" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:563 msgid "Long Name" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:564 #: ../src/backend/filters/annotation.cpp:901 #: ../src/backend/filters/voxelise.cpp:976 #: ../src/backend/filters/profile.cpp:1155 #: ../src/backend/filters/spectrumPlot.cpp:676 msgid "Colour" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:697 #: ../src/backend/filters/annotation.cpp:605 #: ../src/backend/filters/annotation.cpp:646 #: ../src/backend/filters/annotation.cpp:815 msgid "Start" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:698 #: ../src/backend/filters/annotation.cpp:613 #: ../src/backend/filters/annotation.cpp:655 #: ../src/backend/filters/annotation.cpp:823 msgid "End" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1260 msgid "Range or ion?" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1261 msgid "Select type to add" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1542 msgid "Range Editor" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1546 msgid "Enable or disable all overlays" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1547 msgid "Entered overlays, use delete to remove" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1548 msgid "Available plots for ranging" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1549 msgid "Enter species to display as overlay, e.g. SiO2" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1550 msgid "Editable ranges" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1551 msgid "Editable ions" msgstr "" #: ../src/gui/dialogs/rangeEditDialog.cpp:1588 msgid "Overlay" msgstr "" #: ../src/gui/mainFrame.cpp:119 msgid "New camera name..." msgstr "" #: ../src/gui/mainFrame.cpp:120 msgid "New stash name..." msgstr "" #: ../src/gui/mainFrame.cpp:125 msgid "New Filter..." msgstr "" #: ../src/gui/mainFrame.cpp:142 ../src/backend/filters/annotation.cpp:560 #: ../src/backend/filters/annotation.cpp:664 #: ../src/backend/filters/annotation.h:96 msgid "Annotation" msgstr "" #: ../src/gui/mainFrame.cpp:143 msgid "Bounding Box" msgstr "" #: ../src/gui/mainFrame.cpp:144 ../src/backend/filters/ionClip.cpp:629 #: ../src/backend/filters/ionClip.h:66 msgid "Clipping" msgstr "" #: ../src/gui/mainFrame.cpp:145 ../src/backend/filters/clusterAnalysis.h:151 msgid "Cluster Analysis" msgstr "" #: ../src/gui/mainFrame.cpp:146 msgid "Compos. Profiles" msgstr "" #: ../src/gui/mainFrame.cpp:147 msgid "Downsampling" msgstr "" #: ../src/gui/mainFrame.cpp:148 msgid "Extern. Prog." msgstr "" #: ../src/gui/mainFrame.cpp:149 msgid "Ion Colour" msgstr "" #: ../src/gui/mainFrame.cpp:150 msgid "Ion Info" msgstr "" #: ../src/gui/mainFrame.cpp:151 msgid "Ion Transform" msgstr "" #: ../src/gui/mainFrame.cpp:152 ../src/backend/filters/spectrumPlot.h:76 msgid "Spectrum" msgstr "" #: ../src/gui/mainFrame.cpp:153 msgid "Range File" msgstr "" #: ../src/gui/mainFrame.cpp:154 ../src/backend/filters/spatialAnalysis.h:202 msgid "Spat. Analysis" msgstr "" #: ../src/gui/mainFrame.cpp:155 ../src/backend/filters/voxelise.h:122 msgid "Voxelisation" msgstr "" #: ../src/gui/mainFrame.cpp:451 msgid "OpenGL Failed" msgstr "" #: ../src/gui/mainFrame.cpp:452 ../src/gui/mainFrame.cpp:454 msgid "" "Unable to initialise the openGL (3D) panel. Program cannot start. Please " "check your video drivers." msgstr "" #: ../src/gui/mainFrame.cpp:475 msgid "&Open...\tCtrl+O" msgstr "" #: ../src/gui/mainFrame.cpp:475 msgid "Open state file" msgstr "" #: ../src/gui/mainFrame.cpp:476 msgid "&Merge...\tCtrl+Shift+O" msgstr "" #: ../src/gui/mainFrame.cpp:476 msgid "Merge other file" msgstr "" #: ../src/gui/mainFrame.cpp:480 msgid "&Recent" msgstr "" #: ../src/gui/mainFrame.cpp:481 msgid "&Save\tCtrl+S" msgstr "" #: ../src/gui/mainFrame.cpp:481 msgid "Save state to file" msgstr "" #: ../src/gui/mainFrame.cpp:483 msgid "Save &As...\tCtrl+Shift+S" msgstr "" #: ../src/gui/mainFrame.cpp:483 msgid "Save current state to new file" msgstr "" #: ../src/gui/mainFrame.cpp:486 msgid "&Plot...\tCtrl+P" msgstr "" #: ../src/gui/mainFrame.cpp:486 msgid "Export Current Plot" msgstr "" #: ../src/gui/mainFrame.cpp:487 msgid "&Image...\tCtrl+I" msgstr "" #: ../src/gui/mainFrame.cpp:487 msgid "Export Current 3D View" msgstr "" #: ../src/gui/mainFrame.cpp:488 msgid "Ion&s...\tCtrl+N" msgstr "" #: ../src/gui/mainFrame.cpp:488 msgid "Export Ion Data" msgstr "" #: ../src/gui/mainFrame.cpp:489 msgid "Ran&ges...\tCtrl+G" msgstr "" #: ../src/gui/mainFrame.cpp:489 msgid "Export Range Data" msgstr "" #: ../src/gui/mainFrame.cpp:490 msgid "&Animate Filters...\tCtrl+T" msgstr "" #: ../src/gui/mainFrame.cpp:490 msgid "Export Animated Filter" msgstr "" #: ../src/gui/mainFrame.cpp:491 msgid "Ani&mate Camera...\tCtrl+M" msgstr "" #: ../src/gui/mainFrame.cpp:491 msgid "Export Animated Camera" msgstr "" #: ../src/gui/mainFrame.cpp:492 msgid "Pac&kage...\tCtrl+K" msgstr "" #: ../src/gui/mainFrame.cpp:492 msgid "Export analysis package" msgstr "" #: ../src/gui/mainFrame.cpp:494 msgid "&Export" msgstr "" #: ../src/gui/mainFrame.cpp:497 msgid "&Quit\tCtrl+Q" msgstr "" #: ../src/gui/mainFrame.cpp:497 ../src/gui/mainFrame.cpp:499 msgid "Exit Program" msgstr "" #: ../src/gui/mainFrame.cpp:499 msgid "E&xit" msgstr "" #: ../src/gui/mainFrame.cpp:501 msgid "&File" msgstr "" #: ../src/gui/mainFrame.cpp:505 msgid "&Background Colour...\tCtrl+B" msgstr "" #: ../src/gui/mainFrame.cpp:505 msgid "Change background colour" msgstr "" #: ../src/gui/mainFrame.cpp:509 msgid "&Control Pane\tF2" msgstr "" #: ../src/gui/mainFrame.cpp:509 ../src/gui/mainFrame.cpp:512 msgid "Toggle left control pane" msgstr "" #: ../src/gui/mainFrame.cpp:512 msgid "&Control Pane\tAlt+C" msgstr "" #: ../src/gui/mainFrame.cpp:518 msgid "&Raw Data Pane\tF3" msgstr "" #: ../src/gui/mainFrame.cpp:518 ../src/gui/mainFrame.cpp:521 msgid "Toggle raw data pane (bottom)" msgstr "" #: ../src/gui/mainFrame.cpp:521 msgid "&Raw Data Pane\tAlt+R" msgstr "" #: ../src/gui/mainFrame.cpp:525 msgid "&Plot List\tF4" msgstr "" #: ../src/gui/mainFrame.cpp:525 ../src/gui/mainFrame.cpp:527 msgid "Toggle plot list" msgstr "" #: ../src/gui/mainFrame.cpp:527 msgid "&Plot List\tAlt+P" msgstr "" #: ../src/gui/mainFrame.cpp:533 msgid "&Legend\tCtrl+L" msgstr "" #: ../src/gui/mainFrame.cpp:533 msgid "Toggle Legend display" msgstr "" #: ../src/gui/mainFrame.cpp:535 msgid "P&lot..." msgstr "" #: ../src/gui/mainFrame.cpp:536 msgid "&Axis\tCtrl+Shift+I" msgstr "" #: ../src/gui/mainFrame.cpp:536 msgid "Toggle World Axis display" msgstr "" #: ../src/gui/mainFrame.cpp:541 msgid "&Fullscreen mode\tF11" msgstr "" #: ../src/gui/mainFrame.cpp:541 ../src/gui/mainFrame.cpp:543 msgid "Next fullscreen mode: with toolbars" msgstr "" #: ../src/gui/mainFrame.cpp:543 msgid "&Fullscreen mode\tCtrl+Shift+F" msgstr "" #: ../src/gui/mainFrame.cpp:548 msgid "&Undo\tCtrl+Z" msgstr "" #: ../src/gui/mainFrame.cpp:550 msgid "&Redo\tCtrl+Y" msgstr "" #: ../src/gui/mainFrame.cpp:553 msgid "&Range" msgstr "" #: ../src/gui/mainFrame.cpp:556 msgid "&Preferences" msgstr "" #: ../src/gui/mainFrame.cpp:558 msgid "&Edit" msgstr "" #: ../src/gui/mainFrame.cpp:561 msgid "&View" msgstr "" #: ../src/gui/mainFrame.cpp:563 msgid "&Help...\tCtrl+H" msgstr "" #: ../src/gui/mainFrame.cpp:563 msgid "Show help files and documentation" msgstr "" #: ../src/gui/mainFrame.cpp:564 msgid "&Contact..." msgstr "" #: ../src/gui/mainFrame.cpp:564 msgid "Open contact page" msgstr "" #: ../src/gui/mainFrame.cpp:566 msgid "&About..." msgstr "" #: ../src/gui/mainFrame.cpp:566 msgid "Information about this program" msgstr "" #: ../src/gui/mainFrame.cpp:567 msgid "&Help" msgstr "" #: ../src/gui/mainFrame.cpp:569 msgid "Stashed Filters" msgstr "" #: ../src/gui/mainFrame.cpp:574 msgid "New Filters" msgstr "" #: ../src/gui/mainFrame.cpp:604 msgid "Auto Refresh" msgstr "" #: ../src/gui/mainFrame.cpp:610 msgid "Filter settings" msgstr "" #: ../src/gui/mainFrame.cpp:613 msgid "Camera Name" msgstr "" #: ../src/gui/mainFrame.cpp:625 msgid "Resize to Fit" msgstr "" #: ../src/gui/mainFrame.cpp:627 msgid "3D Post-processing" msgstr "" #: ../src/gui/mainFrame.cpp:629 msgid "Enable Cropping" msgstr "" #: ../src/gui/mainFrame.cpp:631 ../src/gui/mainFrame.cpp:642 msgid "x-y" msgstr "" #: ../src/gui/mainFrame.cpp:632 ../src/gui/mainFrame.cpp:643 msgid "x-z" msgstr "" #: ../src/gui/mainFrame.cpp:633 ../src/gui/mainFrame.cpp:644 msgid "y-x" msgstr "" #: ../src/gui/mainFrame.cpp:634 ../src/gui/mainFrame.cpp:645 msgid "y-z" msgstr "" #: ../src/gui/mainFrame.cpp:635 ../src/gui/mainFrame.cpp:646 msgid "z-x" msgstr "" #: ../src/gui/mainFrame.cpp:636 ../src/gui/mainFrame.cpp:647 msgid "z-y" msgstr "" #: ../src/gui/mainFrame.cpp:651 msgid "Use camera coordinates" msgstr "" #: ../src/gui/mainFrame.cpp:652 msgid "dX" msgstr "" #: ../src/gui/mainFrame.cpp:654 msgid "dY" msgstr "" #: ../src/gui/mainFrame.cpp:656 msgid "dZ" msgstr "" #: ../src/gui/mainFrame.cpp:658 msgid "Enable Anaglyphic Stereo" msgstr "" #: ../src/gui/mainFrame.cpp:659 msgid "Flip Channels" msgstr "" #: ../src/gui/mainFrame.cpp:660 msgid "Anaglyph Mode" msgstr "" #: ../src/gui/mainFrame.cpp:662 msgid "Red-Blue" msgstr "" #: ../src/gui/mainFrame.cpp:663 msgid "Red-Green" msgstr "" #: ../src/gui/mainFrame.cpp:664 msgid "Red-Cyan" msgstr "" #: ../src/gui/mainFrame.cpp:665 msgid "Green-Magenta" msgstr "" #: ../src/gui/mainFrame.cpp:669 msgid "Baseline Separation" msgstr "" #: ../src/gui/mainFrame.cpp:671 ../src/backend/filters/annotation.cpp:906 #: ../src/backend/filters/voxelise.cpp:938 #: ../src/backend/filters/voxelise.cpp:1106 #: ../src/backend/filters/profile.cpp:1164 #: ../src/backend/filters/boundingBox.cpp:731 #: ../src/backend/filters/dataLoad.cpp:666 #: ../src/backend/filters/spectrumPlot.cpp:683 msgid "Appearance" msgstr "" #: ../src/gui/mainFrame.cpp:672 msgid "Smooth && translucent objects" msgstr "" #: ../src/gui/mainFrame.cpp:674 msgid "3D lighting" msgstr "" #: ../src/gui/mainFrame.cpp:677 msgid "Performance" msgstr "" #: ../src/gui/mainFrame.cpp:678 msgid "Fast and weak randomisation." msgstr "" #: ../src/gui/mainFrame.cpp:680 msgid "Limit Output Pts" msgstr "" #: ../src/gui/mainFrame.cpp:685 msgid "Filter caching" msgstr "" #: ../src/gui/mainFrame.cpp:687 msgid "Max. Ram usage (%)" msgstr "" #: ../src/gui/mainFrame.cpp:759 msgid "Warning: Your configuration file appears to be invalid:\n" msgstr "" #: ../src/gui/mainFrame.cpp:760 msgid "\tConfig Load: " msgstr "" #: ../src/gui/mainFrame.cpp:1054 msgid "Current state has not been saved, would you like to save it now?" msgstr "" #: ../src/gui/mainFrame.cpp:1055 msgid "State changed" msgstr "" #: ../src/gui/mainFrame.cpp:1073 msgid "Readable files (*.xml, *.pos, *.txt,*.csv, *.ato)" msgstr "" #: ../src/gui/mainFrame.cpp:1075 msgid "XML State File (*.xml)" msgstr "" #: ../src/gui/mainFrame.cpp:1076 msgid "POS File (*.pos)" msgstr "" #: ../src/gui/mainFrame.cpp:1077 msgid "LAWATAP ATO File (*.ato)" msgstr "" #: ../src/gui/mainFrame.cpp:1078 msgid "Text File (*.txt, *.csv)" msgstr "" #: ../src/gui/mainFrame.cpp:1079 msgid "All Files (*)" msgstr "" #: ../src/gui/mainFrame.cpp:1092 ../src/gui/mainFrame.cpp:1141 msgid "Select Data or State File..." msgstr "" #: ../src/gui/mainFrame.cpp:1142 msgid "" "3Depict file (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS File (*.pos)|*.pos|" "XML State File (*.xml)|*.xml|All Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:1153 msgid "Merged file." msgstr "" #: ../src/gui/mainFrame.cpp:1256 msgid "Tip: You can use ⌘ (command) to merge" msgstr "" #: ../src/gui/mainFrame.cpp:1258 msgid "Tip: You can use ctrl to merge" msgstr "" #: ../src/gui/mainFrame.cpp:1292 msgid "Load error" msgstr "" #: ../src/gui/mainFrame.cpp:1293 msgid "" "Error loading state file.\n" "See console for more info." msgstr "" #: ../src/gui/mainFrame.cpp:1301 msgid "" "This state file contains filters that can be unsafe to run\n" "Do you wish to remove these before continuing?." msgstr "" #: ../src/gui/mainFrame.cpp:1302 msgid "Security warning" msgstr "" #: ../src/gui/mainFrame.cpp:1484 ../src/gui/mainFrame.cpp:1580 #: ../src/gui/mainFrame.cpp:2010 msgid "Unable to save" msgstr "" #: ../src/gui/mainFrame.cpp:1485 msgid "No plot available. Please create a plot before exporting." msgstr "" #: ../src/gui/mainFrame.cpp:1489 msgid "Save plot..." msgstr "" #: ../src/gui/mainFrame.cpp:1490 msgid "" "By Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*." "svg|PNG File (*.png)|*.png|All Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:1544 msgid "Select type for save" msgstr "" #: ../src/gui/mainFrame.cpp:1545 msgid "Choose file type" msgstr "" #: ../src/gui/mainFrame.cpp:1565 ../src/gui/mainFrame.cpp:1622 #: ../src/gui/mainFrame.cpp:1658 msgid "Choose resolution" msgstr "" #: ../src/gui/mainFrame.cpp:1581 msgid "Unknown file extension. Please use \"svg\" or \"png\"" msgstr "" #: ../src/gui/mainFrame.cpp:1592 msgid "Saved plot: " msgstr "" #: ../src/gui/mainFrame.cpp:1599 ../src/gui/mainFrame.cpp:1651 msgid "Save Image..." msgstr "" #: ../src/gui/mainFrame.cpp:1600 ../src/gui/mainFrame.cpp:1652 msgid "PNG File (*.png)|*.png|All Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:1614 msgid "File already exists. Overwrite?" msgstr "" #: ../src/gui/mainFrame.cpp:1615 ../src/gui/mainFrame.cpp:2407 #: ../src/gui/mainFrame.cpp:2513 ../src/gui/mainFrame.cpp:2536 msgid "Overwrite?" msgstr "" #: ../src/gui/mainFrame.cpp:1642 ../src/gui/mainFrame.cpp:1718 msgid "Saved 3D View :" msgstr "" #: ../src/gui/mainFrame.cpp:1672 msgid "Program limitation" msgstr "" #: ../src/gui/mainFrame.cpp:1673 msgid "" "Limitation on the screenshot dimension; please ensure that both width and " "height exceed the initial values,\n" " or that they are smaller than the initial values.\n" " If this bothers, please submit a bug." msgstr "" #: ../src/gui/mainFrame.cpp:1690 msgid "Number of frames" msgstr "" #: ../src/gui/mainFrame.cpp:1744 msgid "Abo&rt" msgstr "" #: ../src/gui/mainFrame.cpp:1746 msgid "&Refresh" msgstr "" #: ../src/gui/mainFrame.cpp:1855 msgid "Cannot animate with no filters." msgstr "" #: ../src/gui/mainFrame.cpp:1933 msgid "Animating" msgstr "" #: ../src/gui/mainFrame.cpp:1934 msgid "Performing refresh" msgstr "" #: ../src/gui/mainFrame.cpp:1960 msgid "Filter property change failed" msgstr "" #: ../src/gui/mainFrame.cpp:1982 msgid "Refresh failed on frame :" msgstr "" #: ../src/gui/mainFrame.cpp:2011 msgid "Image save failed for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2036 msgid "Ion save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2037 msgid "Unable to save ions for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2068 msgid "Plot save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2069 msgid "Unable to save plot or frame " msgstr "" #: ../src/gui/mainFrame.cpp:2110 msgid "Range save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2111 msgid "Unable to save range for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2140 msgid "Voxel save failed" msgstr "" #: ../src/gui/mainFrame.cpp:2141 msgid "Unable to save voxels for frame " msgstr "" #: ../src/gui/mainFrame.cpp:2170 msgid "Animate failed" msgstr "" #: ../src/gui/mainFrame.cpp:2194 ../src/gui/mainFrame.cpp:2360 #: ../src/gui/mainFrame.cpp:2468 msgid "No filters means no data to export" msgstr "" #: ../src/gui/mainFrame.cpp:2208 msgid "Package name" msgstr "" #: ../src/gui/mainFrame.cpp:2209 msgid "Package directory name" msgstr "" #: ../src/gui/mainFrame.cpp:2211 msgid "AnalysisPackage" msgstr "" #: ../src/gui/mainFrame.cpp:2224 msgid "Package folder already exists, won't overwrite." msgstr "" #: ../src/gui/mainFrame.cpp:2225 msgid "Not available" msgstr "" #: ../src/gui/mainFrame.cpp:2250 msgid "" "Package folder creation failed\n" "check writing to this location is possible." msgstr "" #: ../src/gui/mainFrame.cpp:2251 msgid "Folder creation failed" msgstr "" #: ../src/gui/mainFrame.cpp:2271 msgid "Copying" msgstr "" #: ../src/gui/mainFrame.cpp:2272 msgid "Copying referenced files" msgstr "" #: ../src/gui/mainFrame.cpp:2338 msgid "Error copying file" msgstr "" #: ../src/gui/mainFrame.cpp:2347 msgid "Saved package: " msgstr "" #: ../src/gui/mainFrame.cpp:2371 msgid "Export" msgstr "" #: ../src/gui/mainFrame.cpp:2377 msgid "" "POS Data (*.pos)|*.pos|Text File (*.txt)|*.txt|VTK Legacy (*.vtk)|*.vtk|All " "Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2406 ../src/gui/mainFrame.cpp:2512 msgid "File already exists, overwrite?" msgstr "" #: ../src/gui/mainFrame.cpp:2447 msgid "Saved ions: " msgstr "" #: ../src/gui/mainFrame.cpp:2472 msgid "Export Ranges" msgstr "" #: ../src/gui/mainFrame.cpp:2494 msgid "Save state..." msgstr "" #: ../src/gui/mainFrame.cpp:2495 msgid "XML state file (*.xml)|*.xml|All Files (*)|*" msgstr "" #: ../src/gui/mainFrame.cpp:2535 msgid "Files have been referred to using relative paths. Keep relative paths?" msgstr "" #: ../src/gui/mainFrame.cpp:2568 msgid "Saved state: " msgstr "" #: ../src/gui/mainFrame.cpp:2644 msgid "Range editor" msgstr "" #: ../src/gui/mainFrame.cpp:2901 msgid "Manual not found locally. Launching web browser" msgstr "" #: ../src/gui/mainFrame.cpp:2910 msgid "Opening contact page in external web browser" msgstr "" #: ../src/gui/mainFrame.cpp:2918 msgid "No filter stashes to edit." msgstr "" #: ../src/gui/mainFrame.cpp:2922 msgid "Filter Stashes" msgstr "" #: ../src/gui/mainFrame.cpp:2939 msgid "Quick and dirty analysis for point data." msgstr "" #: ../src/gui/mainFrame.cpp:2949 msgid "Compiled with wx Version: " msgstr "" #: ../src/gui/mainFrame.cpp:2970 msgid "Press enter to store new stash" msgstr "" #: ../src/gui/mainFrame.cpp:2976 msgid "Press enter to restore stash" msgstr "" #: ../src/gui/mainFrame.cpp:3009 msgid "Unable to create stash, selection invalid" msgstr "" #: ../src/gui/mainFrame.cpp:3016 msgid "Created new filter tree stash" msgstr "" #: ../src/gui/mainFrame.cpp:3123 msgid "Filter type not a data source - can't be at tree base" msgstr "" #: ../src/gui/mainFrame.cpp:3263 msgid "Moving - Hold ⌘ (command) to copy" msgstr "" #: ../src/gui/mainFrame.cpp:3265 msgid "Moving - Hold control to copy" msgstr "" #: ../src/gui/mainFrame.cpp:3604 msgid "Press enter to store new camera" msgstr "" #: ../src/gui/mainFrame.cpp:3606 msgid "Press enter to restore camera" msgstr "" #: ../src/gui/mainFrame.cpp:3631 ../src/gui/mainFrame.cpp:3672 msgid "Restored camera: " msgstr "" #: ../src/gui/mainFrame.cpp:3649 msgid "Stored camera: " msgstr "" #: ../src/gui/mainFrame.cpp:3735 msgid "Select an item from the filter tree before choosing a new filter" msgstr "" #: ../src/gui/mainFrame.cpp:3737 msgid "Load data source (file->open) before choosing a new filter" msgstr "" #: ../src/gui/mainFrame.cpp:3763 msgid "Select RNG File..." msgstr "" #: ../src/gui/mainFrame.cpp:3784 msgid "Failed reading range file." msgstr "" #: ../src/gui/mainFrame.cpp:3788 msgid "Error loading file" msgstr "" #: ../src/gui/mainFrame.cpp:3849 ../src/gui/mainFrame.cpp:3944 #: ../src/gui/mainFrame.cpp:5449 ../src/gui/mainFrame.cpp:5968 msgid "Cons." msgstr "" #: ../src/gui/mainFrame.cpp:3907 msgid "Refresh Aborted." msgstr "" #: ../src/gui/mainFrame.cpp:3948 msgid "*Cons." msgstr "" #: ../src/gui/mainFrame.cpp:3950 msgid "§Cons." msgstr "" #: ../src/gui/mainFrame.cpp:4007 msgid "Complete" msgstr "" #: ../src/gui/mainFrame.cpp:4105 msgid "msgs" msgstr "" #: ../src/gui/mainFrame.cpp:4146 msgid "Autosave complete." msgstr "" #: ../src/gui/mainFrame.cpp:4350 msgid "Aborting...." msgstr "" #: ../src/gui/mainFrame.cpp:4416 msgid "Updated." msgstr "" #: ../src/gui/mainFrame.cpp:4425 msgid "Calculating..." msgstr "" #: ../src/gui/mainFrame.cpp:4428 msgid "\\% Done (Esc aborts)" msgstr "" #: ../src/gui/mainFrame.cpp:4430 msgid "\\% Done" msgstr "" #: ../src/gui/mainFrame.cpp:4704 msgid "Tip: You can shift-click to force full refresh, if required" msgstr "" #: ../src/gui/mainFrame.cpp:4766 msgid "No data to save" msgstr "" #: ../src/gui/mainFrame.cpp:4950 msgid "Aborting..." msgstr "" #: ../src/gui/mainFrame.cpp:4956 msgid "" "Waiting for refresh to abort. Exiting could lead to the program " "backgrounding. Exit anyway? " msgstr "" #: ../src/gui/mainFrame.cpp:4957 ../src/gui/mainFrame.cpp:4977 msgid "Confirmation request" msgstr "" #: ../src/gui/mainFrame.cpp:4976 msgid "Are you sure you wish to exit 3Depict?" msgstr "" #: ../src/gui/mainFrame.cpp:5314 ../src/gl/cameras.cpp:627 #: ../src/gl/cameras.cpp:730 msgid "Orthogonal" msgstr "" #: ../src/gui/mainFrame.cpp:5477 msgid "Update Notice: New version " msgstr "" #: ../src/gui/mainFrame.cpp:5477 msgid " found online." msgstr "" #: ../src/gui/mainFrame.cpp:5481 msgid "Online Check: " msgstr "" #: ../src/gui/mainFrame.cpp:5481 msgid " is up-to-date." msgstr "" #: ../src/gui/mainFrame.cpp:5571 msgid "An auto-save state was found, would you like to restore it?." msgstr "" #: ../src/gui/mainFrame.cpp:5572 msgid "Autosave" msgstr "" #: ../src/gui/mainFrame.cpp:5579 msgid "Unable to load autosave file.." msgstr "" #: ../src/gui/mainFrame.cpp:5770 msgid "List of available filters" msgstr "" #: ../src/gui/mainFrame.cpp:5772 msgid "Tree - drag to move items, hold ⌘ for copy. Tap delete to remove items" msgstr "" #: ../src/gui/mainFrame.cpp:5774 msgid "" "Tree - drag to move items, hold Ctrl for copy. Tap delete to remove items." msgstr "" #: ../src/gui/mainFrame.cpp:5776 msgid "" "Enable/Disable automatic updates of data when filter change takes effect" msgstr "" #: ../src/gui/mainFrame.cpp:5779 msgid "" "Enable/Disable \"Alpha blending\" (transparency) in rendering system. " "Blending is used to smooth objects (avoids artefacts known as \"jaggies\") " "and to make transparent surfaces. Disabling will provide faster rendering " "but look more blocky" msgstr "" #: ../src/gui/mainFrame.cpp:5780 msgid "" "Enable/Disable lighting calculations in rendering, for objects that request " "this. Lighting provides important depth cues for objects comprised of 3D " "surfaces. Disabling may allow faster rendering in complex scenes" msgstr "" #: ../src/gui/mainFrame.cpp:5781 msgid "" "Enable/Disable weak randomisation (Galois linear feedback shift register). " "Strong randomisation uses a much slower random selection method, but " "provides better protection against inadvertent correlations, and is " "recommended for final analyses" msgstr "" #: ../src/gui/mainFrame.cpp:5783 msgid "" "Limit the number of points that can be displayed in the 3D scene. Does not " "affect filter tree calculations. Disabling this can severely reduce " "performance, due to large numbers of points being visible at once." msgstr "" #: ../src/gui/mainFrame.cpp:5784 msgid "" "Enable/Disable caching of intermediate results during filter updates. " "Disabling caching will use less system RAM, though changes to any filter " "property will cause the entire filter tree to be recomputed, greatly slowing " "computations" msgstr "" #: ../src/gui/mainFrame.cpp:5786 msgid "Camera data information" msgstr "" #: ../src/gui/mainFrame.cpp:5790 msgid "Enable/disable visual effects on final 3D output" msgstr "" #: ../src/gui/mainFrame.cpp:5792 msgid "Enable cropping post-process effect" msgstr "" #: ../src/gui/mainFrame.cpp:5795 msgid "" "Colour based 3D effect enable/disable - requires appropriate colour filter " "3D glasses." msgstr "" #: ../src/gui/mainFrame.cpp:5796 msgid "Glasses colour mode" msgstr "" #: ../src/gui/mainFrame.cpp:5798 msgid "" "Level of separation between left and right images, which sets 3D depth to " "visual distortion tradeoff" msgstr "" #: ../src/gui/mainFrame.cpp:5802 msgid "X" msgstr "" #: ../src/gui/mainFrame.cpp:5803 msgid "Y" msgstr "" #: ../src/gui/mainFrame.cpp:5804 msgid "Save raw data to file" msgstr "" #: ../src/gui/mainFrame.cpp:5805 msgid "Copy raw data to clipboard" msgstr "" #: ../src/gui/mainFrame.cpp:5806 msgid "Manage \"stashed\" data." msgstr "" #: ../src/gui/mainFrame.cpp:5807 msgid "Program text output" msgstr "" #: ../src/gui/mainFrame.cpp:5808 msgid "Select active camera, or type to create new named camera" msgstr "" #: ../src/gui/mainFrame.cpp:5809 msgid "Remove the selected camera" msgstr "" #: ../src/gui/mainFrame.cpp:5810 msgid "Perform cropping from coordinate frame of camera" msgstr "" #: ../src/gui/mainFrame.cpp:5811 msgid "" "Set the maximum amount of RAM to use in order to speed repeat computations" msgstr "" #: ../src/gui/mainFrame.cpp:5812 msgid "Collapse the filter tree" msgstr "" #: ../src/gui/mainFrame.cpp:5813 msgid "Expand the filter tree" msgstr "" #: ../src/gui/mainFrame.cpp:5814 msgid "Process the filter tree, hold shift to purge cached filter data" msgstr "" #: ../src/gui/mainFrame.cpp:5928 msgid "Crop" msgstr "" #: ../src/gui/mainFrame.cpp:5929 msgid "Stereo" msgstr "" #: ../src/gui/mainFrame.cpp:5946 #: ../src/backend/filters/externalProgram.cpp:596 #: ../src/backend/filters/ionColour.cpp:308 #: ../src/backend/filters/spectrumPlot.cpp:612 msgid "Data" msgstr "" #: ../src/gui/mainFrame.cpp:5947 msgid "Cam" msgstr "" #: ../src/gui/mainFrame.cpp:5948 msgid "Post" msgstr "" #: ../src/gui/mainFrame.cpp:5949 msgid "Tools" msgstr "" #: ../src/gui/mainFrame.cpp:5967 msgid "Raw" msgstr "" #: ../src/gui/mainFrame.cpp:6010 msgid "Align Camera" msgstr "" #: ../src/gui/mathglPane.cpp:259 msgid "No plots selected." msgstr "" #: ../src/gui/mathglPane.cpp:1201 msgid "" "Unable to allocate requested memory.\n" " Try a lower resolution, or save as vector (SVG)." msgstr "" #: ../src/gui/mathglPane.cpp:1203 msgid "Plotting functions returned an error:\n" msgstr "" #: ../src/gui/mathglPane.cpp:1205 msgid "File readback check failed" msgstr "" #: ../src/gui/mathglPane.cpp:1207 msgid "Filesize during readback appears to be zero." msgstr "" #: ../src/backend/filter.cpp:55 msgid "2D Plot" msgstr "" #: ../src/backend/filter.cpp:56 msgid "Draw" msgstr "" #: ../src/backend/filter.cpp:57 msgid "Range" msgstr "" #: ../src/backend/filter.cpp:58 msgid "Voxel" msgstr "" #: ../src/backend/filter.cpp:192 ../src/backend/filters/ionColour.cpp:411 msgid "Aborted" msgstr "" #: ../src/backend/state.cpp:151 msgid "" "This file is a \"state\" file for the 3Depict program, and stores " "information about a particular analysis session. This file should be a valid " "\"XML\" file" msgstr "" #: ../src/backend/state.cpp:319 msgid "Failed to allocate parser" msgstr "" #: ../src/backend/state.cpp:354 msgid "" "Unable to retrieve root node in input state file... Is this really a non-" "empty XML file?" msgstr "" #: ../src/backend/state.cpp:361 msgid "Base state node missing. Is this really a state XML file??" msgstr "" #: ../src/backend/state.cpp:390 msgid "State was created by a newer version of this program.. " msgstr "" #: ../src/backend/state.cpp:391 msgid "file reading will continue, but may fail." msgstr "" #: ../src/backend/state.cpp:396 msgid "" "Warning, unparseable version number in state file. File reading will " "continue, but may fail" msgstr "" #: ../src/backend/state.cpp:403 msgid "Unable to find the \"writer\" node" msgstr "" #: ../src/backend/state.cpp:413 msgid "Unable to find the \"backcolour\" node." msgstr "" #: ../src/backend/state.cpp:420 msgid "\"backcolour\" node missing \"r\" value." msgstr "" #: ../src/backend/state.cpp:425 msgid "Unable to interpret \"backColour\" node's \"r\" value." msgstr "" #: ../src/backend/state.cpp:433 msgid "\"backcolour\" node missing \"g\" value." msgstr "" #: ../src/backend/state.cpp:439 msgid "Unable to interpret \"backColour\" node's \"g\" value." msgstr "" #: ../src/backend/state.cpp:447 msgid "\"backcolour\" node missing \"b\" value." msgstr "" #: ../src/backend/state.cpp:453 msgid "Unable to interpret \"backColour\" node's \"b\" value." msgstr "" #: ../src/backend/state.cpp:460 msgid "\"backcolour\"s rgb values must be in range [0,1]" msgstr "" #: ../src/backend/state.cpp:488 msgid "Unable to find or interpret \"showaxis\" node" msgstr "" #: ../src/backend/state.cpp:532 msgid "Unable to locate \"filtertree\" node." msgstr "" #: ../src/backend/state.cpp:548 msgid "Cameras section missing \"active\" node." msgstr "" #: ../src/backend/state.cpp:556 msgid "Unable to find property \"value\" for \"cameras->active\" node." msgstr "" #: ../src/backend/state.cpp:562 msgid "Unable to interpret property \"value\" for \"cameras->active\" node." msgstr "" #: ../src/backend/state.cpp:582 msgid "Failed to interpret camera state for camera : " msgstr "" #: ../src/backend/state.cpp:590 msgid "Unable to interpret the camera type for camera : " msgstr "" #: ../src/backend/state.cpp:648 msgid "Unable to locate stash name for stash " msgstr "" #: ../src/backend/state.cpp:655 msgid "Empty stash name for stash " msgstr "" #: ../src/backend/state.cpp:664 msgid "No filter tree for stash:" msgstr "" #: ../src/backend/state.cpp:670 msgid "For stash " msgstr "" #: ../src/backend/state.cpp:702 msgid "Unrecognised effect :" msgstr "" #: ../src/backend/state.cpp:712 msgid "Duplicate effect found" msgstr "" #: ../src/backend/state.cpp:712 msgid " cannot use." msgstr "" #: ../src/backend/state.cpp:722 msgid "Error reading effect : " msgstr "" #: ../src/backend/state.cpp:927 msgid "-merge" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:44 ../src/backend/APT/APTFileIO.cpp:79 #: ../src/backend/APT/APTFileIO.cpp:103 msgid "Error opening file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:45 msgid "Only found header, no data" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:46 msgid "Unable to reopen file after first scan" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:47 msgid "Error whilst reading file contents" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:48 ../src/backend/APT/APTFileIO.cpp:49 msgid "Unexpected file format" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:50 msgid "Insufficient memory to continue" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:54 msgid "Memory allocation failure on POS load" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:55 msgid "Error opening pos file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:56 msgid "Pos file empty" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:57 msgid "Pos file size appears to have non-integer number of entries" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:58 msgid "Error reading from pos file (after open)" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:59 msgid "Error - Found NaN in pos file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:60 msgid "Error - Found Inf in pos file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:61 msgid "Pos load aborted by interrupt." msgstr "" #: ../src/backend/APT/APTFileIO.cpp:80 msgid "No numerical data found" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:81 msgid "Error re-opening file, after first scan" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:82 msgid "Unable to read file contents after open" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:83 msgid "Error interpreting field in file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:84 msgid "Incorrect number of fields in file" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:85 ../src/backend/APT/APTFileIO.cpp:107 msgid "Unable to allocate memory to store data" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:104 msgid "File is empty" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:105 msgid "Filesize does not match expected format" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:106 msgid "File version number not <4, as expected" msgstr "" #: ../src/backend/APT/APTFileIO.cpp:108 msgid "Unable to detect endian-ness in file" msgstr "" #: ../src/backend/APT/APTRanges.cpp:48 msgid "Error opening file, check name and permissions." msgstr "" #: ../src/backend/APT/APTRanges.cpp:49 msgid "" "Error interpreting range file header, expecting ion count and range count, " "respectively." msgstr "" #: ../src/backend/APT/APTRanges.cpp:50 msgid "" "Range file appears to be empty, check file is a proper range file and is not " "empty." msgstr "" #: ../src/backend/APT/APTRanges.cpp:51 msgid "Error reading the long name for ion." msgstr "" #: ../src/backend/APT/APTRanges.cpp:52 msgid "Error reading the short name for ion." msgstr "" #: ../src/backend/APT/APTRanges.cpp:53 msgid "" "Error reading colour data in the file, expecting 3 decimal values, space " "separated." msgstr "" #: ../src/backend/APT/APTRanges.cpp:54 msgid "" "Tried skipping to table separator line (line with dashes), but did not find " "it." msgstr "" #: ../src/backend/APT/APTRanges.cpp:55 msgid "" "Number of ions in the table header did not match the number specified at the " "start of the file" msgstr "" #: ../src/backend/APT/APTRanges.cpp:56 msgid "" "Unexpected failure whilst trying to skip over range lead-in data (bit before " "range start value)" msgstr "" #: ../src/backend/APT/APTRanges.cpp:57 msgid "" "Range table had an incorrect number of entries, should be 2 or 3 + number of " "ranges" msgstr "" #: ../src/backend/APT/APTRanges.cpp:58 msgid "Unable to read range start and end values" msgstr "" #: ../src/backend/APT/APTRanges.cpp:59 msgid "Unable to read range table entry" msgstr "" #: ../src/backend/APT/APTRanges.cpp:60 msgid "" "Error reading file, unexpected format, are you sure it is a proper range " "file?" msgstr "" #: ../src/backend/APT/APTRanges.cpp:61 msgid "" "Too many ranges appeared to have range entries with no usable data (eg, all " "blank)" msgstr "" #: ../src/backend/APT/APTRanges.cpp:62 msgid "" "Range file appears to contain malformed data, check things like start and " "ends of m/c are not equal or flipped." msgstr "" #: ../src/backend/APT/APTRanges.cpp:63 msgid "Range file appears to be inconsistent (eg, overlapping ranges)" msgstr "" #: ../src/backend/APT/APTRanges.cpp:64 msgid "No ion name mapping found for multiple ion." msgstr "" #: ../src/backend/APT/APTRanges.cpp:65 msgid "Polyatomic extension range matches multiple masses in first section" msgstr "" #: ../src/backend/APT/APTRanges.cpp:66 msgid "Range file is exceedingly large. Refusing to open" msgstr "" #: ../src/backend/APT/APTRanges.cpp:1404 msgid "" "Range headings do not match order of the ions listed in the name " "specifications. The name specification ordering will be used when reading " "the range table, as the range heading section is declared as a comment in " "the file-format specifications, and is not to be intepreted by this program. " "Check range-species associations actually match what you expect." msgstr "" #: ../src/backend/filters/annotation.cpp:73 msgid "Arrow" msgstr "" #: ../src/backend/filters/annotation.cpp:74 msgid "Text" msgstr "" #: ../src/backend/filters/annotation.cpp:75 msgid "Arrow+Text" msgstr "" #: ../src/backend/filters/annotation.cpp:76 msgid "Angle" msgstr "" #: ../src/backend/filters/annotation.cpp:77 msgid "Ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:524 msgid "Enable" msgstr "" #: ../src/backend/filters/annotation.cpp:527 msgid "Enable/disable annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:548 msgid "Type or style of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:564 #: ../src/backend/filters/annotation.cpp:668 msgid "Text of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:568 #: ../src/backend/filters/ionClip.cpp:529 #: ../src/backend/filters/ionClip.cpp:551 #: ../src/backend/filters/ionClip.cpp:573 #: ../src/backend/filters/ionClip.cpp:610 #: ../src/backend/filters/transform.cpp:1233 #: ../src/backend/filters/transform.cpp:1260 #: ../src/backend/filters/transform.cpp:1286 #: ../src/backend/filters/profile.cpp:1013 #: ../src/backend/filters/profile.cpp:1051 #: ../src/backend/filters/spatialAnalysis.cpp:1041 ../src/gl/cameras.cpp:603 msgid "Origin" msgstr "" #: ../src/backend/filters/annotation.cpp:572 msgid "Position of annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:576 #: ../src/backend/filters/annotation.cpp:683 #: ../src/backend/filters/annotation.cpp:742 #: ../src/backend/filters/annotation.cpp:831 msgid "Up dir" msgstr "" #: ../src/backend/filters/annotation.cpp:580 #: ../src/backend/filters/annotation.cpp:835 msgid "Vector for up direction of annotation text" msgstr "" #: ../src/backend/filters/annotation.cpp:584 #: ../src/backend/filters/annotation.cpp:690 #: ../src/backend/filters/annotation.cpp:734 #: ../src/backend/filters/annotation.cpp:839 msgid "Across dir" msgstr "" #: ../src/backend/filters/annotation.cpp:588 #: ../src/backend/filters/annotation.cpp:843 msgid "Reading direction for annotation" msgstr "" #: ../src/backend/filters/annotation.cpp:593 #: ../src/backend/filters/annotation.cpp:675 #: ../src/backend/filters/annotation.cpp:769 msgid "Text size" msgstr "" #: ../src/backend/filters/annotation.cpp:597 #: ../src/backend/filters/annotation.cpp:679 #: ../src/backend/filters/annotation.cpp:851 msgid "Relative size of annotation text" msgstr "" #: ../src/backend/filters/annotation.cpp:609 #: ../src/backend/filters/annotation.cpp:650 msgid "3D position for tail of arrow" msgstr "" #: ../src/backend/filters/annotation.cpp:617 #: ../src/backend/filters/annotation.cpp:659 msgid "3D Position to which arrow points" msgstr "" #: ../src/backend/filters/annotation.cpp:620 #: ../src/backend/filters/annotation.cpp:730 msgid "Positioning" msgstr "" #: ../src/backend/filters/annotation.cpp:625 #: ../src/backend/filters/annotation.cpp:697 msgid "Tip radius" msgstr "" #: ../src/backend/filters/annotation.cpp:629 msgid "Size of the arrow head" msgstr "" #: ../src/backend/filters/annotation.cpp:633 msgid "Line size" msgstr "" #: ../src/backend/filters/annotation.cpp:637 msgid "Thickness of line used to draw arrow stem" msgstr "" #: ../src/backend/filters/annotation.cpp:671 msgid "Options" msgstr "" #: ../src/backend/filters/annotation.cpp:707 msgid "Position A" msgstr "" #: ../src/backend/filters/annotation.cpp:711 msgid "Location of first non-central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:715 msgid "Origin " msgstr "" #: ../src/backend/filters/annotation.cpp:719 msgid "Location of central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:723 msgid "Position B" msgstr "" #: ../src/backend/filters/annotation.cpp:727 msgid "Location of second non-central vertex" msgstr "" #: ../src/backend/filters/annotation.cpp:738 msgid "Reading direction for angle text" msgstr "" #: ../src/backend/filters/annotation.cpp:743 msgid "Vector for up direction of angle text" msgstr "" #: ../src/backend/filters/annotation.cpp:751 msgid "Reflexive" msgstr "" #: ../src/backend/filters/annotation.cpp:754 msgid "Measure interor (enabled) or exterior angle (disabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:759 msgid "Show Angle" msgstr "" #: ../src/backend/filters/annotation.cpp:763 msgid "Display angle text (when enabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:773 msgid "Size of angle text" msgstr "" #: ../src/backend/filters/annotation.cpp:791 msgid "Digit format" msgstr "" #: ../src/backend/filters/annotation.cpp:795 msgid "" "Format of angle text; # for numeral position, '.' for separator, eg ##.## " "gives 12.34" msgstr "" #: ../src/backend/filters/annotation.cpp:801 #: ../src/backend/filters/annotation.cpp:886 msgid "Sphere size" msgstr "" #: ../src/backend/filters/annotation.cpp:805 #: ../src/backend/filters/annotation.cpp:890 msgid "Marker sphere size for manipulating tool" msgstr "" #: ../src/backend/filters/annotation.cpp:819 msgid "Ruler beginning 3D location" msgstr "" #: ../src/backend/filters/annotation.cpp:827 msgid "Ruler finish 3D location" msgstr "" #: ../src/backend/filters/annotation.cpp:848 #: ../src/backend/filters/boundingBox.cpp:715 msgid "Font Size" msgstr "" #: ../src/backend/filters/annotation.cpp:857 msgid "Fixed ticks" msgstr "" #: ../src/backend/filters/annotation.cpp:860 msgid "" "Use fixed (enabled) number of text markers, or one every fixed distance " "(disabled)" msgstr "" #: ../src/backend/filters/annotation.cpp:867 msgid "Num Ticks" msgstr "" #: ../src/backend/filters/annotation.cpp:870 msgid "Number of tick marks along ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:877 msgid "Tick Spacing" msgstr "" #: ../src/backend/filters/annotation.cpp:880 msgid "Distance between tick marks along ruler" msgstr "" #: ../src/backend/filters/annotation.cpp:904 msgid "Colour for ruler and ticks" msgstr "" #: ../src/backend/filters/ionClip.cpp:65 ../src/backend/filters/profile.cpp:53 msgid "Sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:66 msgid "Plane" msgstr "" #: ../src/backend/filters/ionClip.cpp:67 msgid "Cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:68 msgid "Aligned box" msgstr "" #: ../src/backend/filters/ionClip.cpp:498 #: ../src/backend/filters/profile.cpp:991 msgid "Primitive" msgstr "" #: ../src/backend/filters/ionClip.cpp:501 msgid "Shape of clipping object" msgstr "" #: ../src/backend/filters/ionClip.cpp:507 #: ../src/backend/filters/profile.cpp:997 msgid "Show Primitive" msgstr "" #: ../src/backend/filters/ionClip.cpp:510 msgid "Display the 3D interaction object" msgstr "" #: ../src/backend/filters/ionClip.cpp:515 msgid "Invert Clip" msgstr "" #: ../src/backend/filters/ionClip.cpp:518 msgid "" "Switch between retaining points inside (false) and outside (true) of " "primitive" msgstr "" #: ../src/backend/filters/ionClip.cpp:532 #: ../src/backend/filters/profile.cpp:1054 msgid "Position for centre of sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:537 #: ../src/backend/filters/ionClip.cpp:597 #: ../src/backend/filters/profile.cpp:1037 #: ../src/backend/filters/profile.cpp:1059 #: ../src/backend/filters/spatialAnalysis.cpp:134 #: ../src/backend/filters/spatialAnalysis.cpp:1058 msgid "Radius" msgstr "" #: ../src/backend/filters/ionClip.cpp:540 #: ../src/backend/filters/profile.cpp:1062 msgid "Radius of sphere" msgstr "" #: ../src/backend/filters/ionClip.cpp:554 msgid "Position that plane passes through" msgstr "" #: ../src/backend/filters/ionClip.cpp:559 msgid "Plane Normal" msgstr "" #: ../src/backend/filters/ionClip.cpp:562 msgid "Perpendicular direction for plane" msgstr "" #: ../src/backend/filters/ionClip.cpp:576 msgid "Centre of cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:581 #: ../src/backend/filters/transform.cpp:1294 #: ../src/backend/filters/profile.cpp:1021 #: ../src/backend/filters/spatialAnalysis.cpp:1049 msgid "Axis" msgstr "" #: ../src/backend/filters/ionClip.cpp:584 msgid "Positive vector for cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:589 #: ../src/backend/filters/profile.cpp:1029 msgid "Lock Axis Mag." msgstr "" #: ../src/backend/filters/ionClip.cpp:592 msgid "Prevent changing length of cylinder during 3D interaction" msgstr "" #: ../src/backend/filters/ionClip.cpp:600 #: ../src/backend/filters/profile.cpp:1040 #: ../src/backend/filters/spatialAnalysis.cpp:1061 msgid "Radius of cylinder" msgstr "" #: ../src/backend/filters/ionClip.cpp:613 msgid "Centre of axis aligned box" msgstr "" #: ../src/backend/filters/ionClip.cpp:618 msgid "Corner offset" msgstr "" #: ../src/backend/filters/ionClip.cpp:621 msgid "Vector to corner of box" msgstr "" #: ../src/backend/filters/voxelise.cpp:111 msgid "None (Raw count)" msgstr "" #: ../src/backend/filters/voxelise.cpp:112 msgid "Volume (Density)" msgstr "" #: ../src/backend/filters/voxelise.cpp:113 msgid "All Ions (conc)" msgstr "" #: ../src/backend/filters/voxelise.cpp:114 msgid "Ratio (Num/Denom)" msgstr "" #: ../src/backend/filters/voxelise.cpp:118 msgid "Point Cloud" msgstr "" #: ../src/backend/filters/voxelise.cpp:119 msgid "Isosurface" msgstr "" #: ../src/backend/filters/voxelise.cpp:120 msgid "Axial slice" msgstr "" #: ../src/backend/filters/voxelise.cpp:124 #: ../src/backend/filters/voxelise.cpp:130 #: ../src/backend/filters/algorithms/mass.cpp:25 #: ../src/backend/filters/spectrumPlot.cpp:76 ../src/backend/plot.cpp:28 msgid "None" msgstr "" #: ../src/backend/filters/voxelise.cpp:125 msgid "Gaussian (blur)" msgstr "" #: ../src/backend/filters/voxelise.cpp:126 msgid "Lapl. of Gauss. (edges)" msgstr "" #: ../src/backend/filters/voxelise.cpp:131 msgid "Linear" msgstr "" #: ../src/backend/filters/voxelise.cpp:564 msgid "Voxel Limits (min,max): (" msgstr "" #: ../src/backend/filters/voxelise.cpp:709 msgid "Fixed width" msgstr "" #: ../src/backend/filters/voxelise.cpp:713 msgid "If true, use fixed size voxels, otherwise use fixed count" msgstr "" #: ../src/backend/filters/voxelise.cpp:719 msgid "Bin width x" msgstr "" #: ../src/backend/filters/voxelise.cpp:723 msgid "Voxel size in X direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:727 msgid "Bin width y" msgstr "" #: ../src/backend/filters/voxelise.cpp:730 msgid "Voxel size in Y direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:736 msgid "Bin width z" msgstr "" #: ../src/backend/filters/voxelise.cpp:739 msgid "Voxel size in Z direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:746 msgid "Num bins x" msgstr "" #: ../src/backend/filters/voxelise.cpp:750 msgid "Number of voxels to use in X direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:755 msgid "Num bins y" msgstr "" #: ../src/backend/filters/voxelise.cpp:758 msgid "Number of voxels to use in Y direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:764 msgid "Num bins z" msgstr "" #: ../src/backend/filters/voxelise.cpp:766 msgid "Number of voxels to use in Z direction" msgstr "" #: ../src/backend/filters/voxelise.cpp:796 msgid "Normalise by" msgstr "" #: ../src/backend/filters/voxelise.cpp:799 msgid "Method to use to normalise scalar value in each voxel" msgstr "" #: ../src/backend/filters/voxelise.cpp:802 msgid "Computation" msgstr "" #: ../src/backend/filters/voxelise.cpp:809 #: ../src/backend/filters/spatialAnalysis.cpp:1233 #: ../src/backend/filters/spatialAnalysis.cpp:1254 msgid "Numerator" msgstr "" #: ../src/backend/filters/voxelise.cpp:812 msgid "Parmeter \"a\" used in fraction (a/b) to get voxel value" msgstr "" #: ../src/backend/filters/voxelise.cpp:829 msgid "Enable this ion for numerator" msgstr "" #: ../src/backend/filters/voxelise.cpp:841 #: ../src/backend/filters/voxelise.cpp:862 #: ../src/backend/filters/spatialAnalysis.cpp:1261 #: ../src/backend/filters/spatialAnalysis.cpp:1280 msgid "Denominator" msgstr "" #: ../src/backend/filters/voxelise.cpp:844 msgid "Parameter \"b\" used in fraction (a/b) to get voxel value" msgstr "" #: ../src/backend/filters/voxelise.cpp:858 msgid "Enable this ion for denominator contribution" msgstr "" #: ../src/backend/filters/voxelise.cpp:880 #: ../src/backend/filters/voxelise.cpp:911 msgid "Filtering" msgstr "" #: ../src/backend/filters/voxelise.cpp:884 msgid "Smoothing method to use on voxels" msgstr "" #: ../src/backend/filters/voxelise.cpp:887 msgid "Processing" msgstr "" #: ../src/backend/filters/voxelise.cpp:893 msgid "Standard Dev" msgstr "" #: ../src/backend/filters/voxelise.cpp:897 msgid "Filtering Scale" msgstr "" #: ../src/backend/filters/voxelise.cpp:903 msgid "Kernel Size" msgstr "" #: ../src/backend/filters/voxelise.cpp:907 msgid "" "Filter radius, in multiples of std. dev. Larger -> slower, more accurate" msgstr "" #: ../src/backend/filters/voxelise.cpp:927 msgid "Representation" msgstr "" #: ../src/backend/filters/voxelise.cpp:930 msgid "3D display method" msgstr "" #: ../src/backend/filters/voxelise.cpp:941 msgid "Spot size" msgstr "" #: ../src/backend/filters/voxelise.cpp:944 msgid "Size of the spots to use for display" msgstr "" #: ../src/backend/filters/voxelise.cpp:949 #: ../src/backend/filters/voxelise.cpp:984 #: ../src/backend/filters/voxelise.cpp:1056 msgid "Transparency" msgstr "" #: ../src/backend/filters/voxelise.cpp:952 msgid "How \"see through\" each point is (0 - opaque, 1 - invisible)" msgstr "" #: ../src/backend/filters/voxelise.cpp:961 msgid "Surf. param." msgstr "" #: ../src/backend/filters/voxelise.cpp:964 msgid "Isovalue" msgstr "" #: ../src/backend/filters/voxelise.cpp:967 msgid "Scalar value to show as isosurface" msgstr "" #: ../src/backend/filters/voxelise.cpp:972 #: ../src/backend/filters/voxelise.cpp:1037 #: ../src/backend/filters/spatialAnalysis.cpp:2344 #: ../src/backend/filters/spatialAnalysis.cpp:2397 msgid "Surface" msgstr "" #: ../src/backend/filters/voxelise.cpp:979 msgid "Colour of isosurface" msgstr "" #: ../src/backend/filters/voxelise.cpp:987 #: ../src/backend/filters/voxelise.cpp:1059 msgid "How \"see through\" each facet is (0 - opaque, 1 - invisible)" msgstr "" #: ../src/backend/filters/voxelise.cpp:998 msgid "Slice param." msgstr "" #: ../src/backend/filters/voxelise.cpp:1006 msgid "Slice Axis" msgstr "" #: ../src/backend/filters/voxelise.cpp:1009 msgid "Normal for the planar slice" msgstr "" #: ../src/backend/filters/voxelise.cpp:1016 msgid "Slice Coord" msgstr "" #: ../src/backend/filters/voxelise.cpp:1019 msgid "Fractional coordinate that slice plane passes through" msgstr "" #: ../src/backend/filters/voxelise.cpp:1024 msgid "Interp. Mode" msgstr "" #: ../src/backend/filters/voxelise.cpp:1032 msgid "Interpolation mode for direction normal to slice" msgstr "" #: ../src/backend/filters/voxelise.cpp:1048 msgid "Colour mode" msgstr "" #: ../src/backend/filters/voxelise.cpp:1051 #: ../src/backend/filters/ionColour.cpp:261 msgid "Colour scheme used to assign points colours by value" msgstr "" #: ../src/backend/filters/voxelise.cpp:1064 #: ../src/backend/filters/ionColour.cpp:273 msgid "Show Bar" msgstr "" #: ../src/backend/filters/voxelise.cpp:1071 msgid "Auto Bounds" msgstr "" #: ../src/backend/filters/voxelise.cpp:1072 msgid "Auto-compute min/max values in map" msgstr "" #: ../src/backend/filters/voxelise.cpp:1082 #: ../src/backend/filters/ionColour.cpp:294 msgid "Map start" msgstr "" #: ../src/backend/filters/voxelise.cpp:1083 #: ../src/backend/filters/ionColour.cpp:295 msgid "Assign points with this value to the first colour in map" msgstr "" #: ../src/backend/filters/voxelise.cpp:1090 #: ../src/backend/filters/ionColour.cpp:302 msgid "Map end" msgstr "" #: ../src/backend/filters/voxelise.cpp:1091 #: ../src/backend/filters/ionColour.cpp:303 msgid "Assign points with this value to the last colour in map" msgstr "" #: ../src/backend/filters/transform.cpp:84 msgid "Translate" msgstr "" #: ../src/backend/filters/transform.cpp:85 msgid "Scale (isotropic)" msgstr "" #: ../src/backend/filters/transform.cpp:86 msgid "Scale (anisotropic)" msgstr "" #: ../src/backend/filters/transform.cpp:87 msgid "Rotate" msgstr "" #: ../src/backend/filters/transform.cpp:88 msgid "Value Shuffle" msgstr "" #: ../src/backend/filters/transform.cpp:89 msgid "Spatial Noise" msgstr "" #: ../src/backend/filters/transform.cpp:90 msgid "Translate Value" msgstr "" #: ../src/backend/filters/transform.cpp:91 msgid "Crop Value" msgstr "" #: ../src/backend/filters/transform.cpp:95 msgid "Specify" msgstr "" #: ../src/backend/filters/transform.cpp:96 msgid "Boundbox Centre" msgstr "" #: ../src/backend/filters/transform.cpp:97 msgid "Mass Centre" msgstr "" #: ../src/backend/filters/transform.cpp:1008 #: ../src/backend/filters/clusterAnalysis.cpp:1956 #: ../src/backend/filters/spatialAnalysis.cpp:635 #: ../src/backend/filters/spatialAnalysis.cpp:2298 #: ../src/backend/filters/spatialAnalysis.cpp:2727 #: ../src/backend/filters/spatialAnalysis.cpp:3016 #: ../src/backend/filters/spatialAnalysis.cpp:3689 #: ../src/backend/filters/spatialAnalysis.cpp:3952 #: ../src/backend/filters/spatialAnalysis.cpp:4165 msgid "Collate" msgstr "" #: ../src/backend/filters/transform.cpp:1027 msgid "Mass-to-Charge (Da/e)" msgstr "" #: ../src/backend/filters/transform.cpp:1081 msgid "Shuffle" msgstr "" #: ../src/backend/filters/transform.cpp:1105 msgid "Splice" msgstr "" #: ../src/backend/filters/transform.cpp:1153 msgid "Algorithm to use to transform point data" msgstr "" #: ../src/backend/filters/transform.cpp:1157 #: ../src/backend/filters/ionInfo.cpp:546 #: ../src/backend/filters/clusterAnalysis.cpp:943 #: ../src/backend/filters/clusterAnalysis.cpp:951 #: ../src/backend/filters/spatialAnalysis.cpp:800 #: ../src/backend/filters/spatialAnalysis.cpp:808 msgid "Algorithm" msgstr "" #: ../src/backend/filters/transform.cpp:1170 msgid "Origin mode" msgstr "" #: ../src/backend/filters/transform.cpp:1173 msgid "Select how transform origin is computed" msgstr "" #: ../src/backend/filters/transform.cpp:1178 msgid "Show marker" msgstr "" #: ../src/backend/filters/transform.cpp:1182 msgid "Display an interactive object to set transform origin" msgstr "" #: ../src/backend/filters/transform.cpp:1184 msgid "Display a small marker to denote transform origin" msgstr "" #: ../src/backend/filters/transform.cpp:1200 msgid "Translation" msgstr "" #: ../src/backend/filters/transform.cpp:1203 msgid "Translation vector for transform" msgstr "" #: ../src/backend/filters/transform.cpp:1215 msgid "Offset" msgstr "" #: ../src/backend/filters/transform.cpp:1219 msgid "Scalar to use to offset each point's associated value" msgstr "" #: ../src/backend/filters/transform.cpp:1236 #: ../src/backend/filters/transform.cpp:1263 msgid "Origin of scale trasnform" msgstr "" #: ../src/backend/filters/transform.cpp:1243 #: ../src/backend/filters/transform.cpp:1270 msgid "Scale Fact." msgstr "" #: ../src/backend/filters/transform.cpp:1246 #: ../src/backend/filters/transform.cpp:1273 msgid "Enlargement factor for scaling around origin" msgstr "" #: ../src/backend/filters/transform.cpp:1289 msgid "Origin of rotation" msgstr "" #: ../src/backend/filters/transform.cpp:1297 msgid "Axis around which to revolve" msgstr "" #: ../src/backend/filters/transform.cpp:1302 msgid "Angle (deg)" msgstr "" #: ../src/backend/filters/transform.cpp:1305 msgid "Angle to perform rotation (ACW, as viewed from axis towards origin)" msgstr "" #: ../src/backend/filters/transform.cpp:1322 msgid "Noise Type" msgstr "" #: ../src/backend/filters/transform.cpp:1325 msgid "Method to use to degrade point data" msgstr "" #: ../src/backend/filters/transform.cpp:1332 msgid "Noise level" msgstr "" #: ../src/backend/filters/transform.cpp:1334 msgid "Standard dev." msgstr "" #: ../src/backend/filters/transform.cpp:1342 msgid "Amplitude of noise" msgstr "" #: ../src/backend/filters/transform.cpp:1356 msgid "Min Value" msgstr "" #: ../src/backend/filters/transform.cpp:1360 msgid "Minimum value to use for crop" msgstr "" #: ../src/backend/filters/transform.cpp:1364 msgid "Max Value" msgstr "" #: ../src/backend/filters/transform.cpp:1368 msgid "Maximum value to use for crop" msgstr "" #: ../src/backend/filters/transform.cpp:1377 msgid "Transform Params" msgstr "" #: ../src/backend/filters/transform.cpp:1738 msgid "White" msgstr "" #: ../src/backend/filters/transform.cpp:1740 msgid "Gaussian" msgstr "" #: ../src/backend/filters/externalProgram.cpp:259 msgid "Collate Input" msgstr "" #: ../src/backend/filters/externalProgram.cpp:348 msgid "Execute" msgstr "" #: ../src/backend/filters/externalProgram.cpp:389 msgid "Collate output" msgstr "" #: ../src/backend/filters/externalProgram.cpp:564 #: ../src/backend/filters/externalProgram.cpp:578 msgid "Command" msgstr "" #: ../src/backend/filters/externalProgram.cpp:567 msgid "" "Full command to send to operating system. See manual for escape sequence " "meanings" msgstr "" #: ../src/backend/filters/externalProgram.cpp:571 msgid "Work Dir" msgstr "" #: ../src/backend/filters/externalProgram.cpp:574 msgid "Directory to run the command in" msgstr "" #: ../src/backend/filters/externalProgram.cpp:581 msgid "Cleanup input" msgstr "" #: ../src/backend/filters/externalProgram.cpp:584 msgid "Erase input files when command completed" msgstr "" #: ../src/backend/filters/externalProgram.cpp:589 msgid "Cache" msgstr "" #: ../src/backend/filters/externalProgram.cpp:592 msgid "" "Assume program does not alter its output, unless inputs from 3Depict are " "altered" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:26 msgid "Flat TOF" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:33 msgid "INsufficient bins to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:34 msgid "Insufficient counts to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:35 msgid "Insufficient data to perform fit" msgstr "" #: ../src/backend/filters/algorithms/mass.cpp:36 msgid "Data did not appear to be random noise - cannot fit noise level" msgstr "" #: ../src/backend/filters/ionInfo.cpp:37 msgid "Rectilinear" msgstr "" #: ../src/backend/filters/ionInfo.cpp:38 msgid "Convex hull" msgstr "" #: ../src/backend/filters/ionInfo.cpp:200 msgid "No ions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:226 #: ../src/backend/filters/spectrumPlot.cpp:432 msgid "" "Background fit failed - input data was considered ill formed (gauss-test)" msgstr "" #: ../src/backend/filters/ionInfo.cpp:227 msgid "Following data has not been corrected" msgstr "" #: ../src/backend/filters/ionInfo.cpp:279 msgid "--Counts--" msgstr "" #: ../src/backend/filters/ionInfo.cpp:289 msgid "Total Ranged\t" msgstr "" #: ../src/backend/filters/ionInfo.cpp:294 msgid "Total (incl. unranged)\t" msgstr "" #: ../src/backend/filters/ionInfo.cpp:307 msgid "n/a" msgstr "" #: ../src/backend/filters/ionInfo.cpp:317 #: ../src/backend/filters/ionDownsample.cpp:496 msgid "Unranged" msgstr "" #: ../src/backend/filters/ionInfo.cpp:330 msgid "Number of points : " msgstr "" #: ../src/backend/filters/ionInfo.cpp:359 msgid "Rectilinear Bounds : " msgstr "" #: ../src/backend/filters/ionInfo.cpp:364 msgid "Volume (len^3): " msgstr "" #: ../src/backend/filters/ionInfo.cpp:381 msgid "Convex Volume (len^3): " msgstr "" #: ../src/backend/filters/ionInfo.cpp:384 msgid "Unable to compute volume" msgstr "" #: ../src/backend/filters/ionInfo.cpp:413 msgid "Ranged Density (pts/vol):" msgstr "" #: ../src/backend/filters/ionInfo.cpp:418 msgid "Total Density (pts/vol):" msgstr "" #: ../src/backend/filters/ionInfo.cpp:445 msgid "Compositions" msgstr "" #: ../src/backend/filters/ionInfo.cpp:446 msgid "Display compositional data for points in console" msgstr "" #: ../src/backend/filters/ionInfo.cpp:450 msgid "Counts" msgstr "" #: ../src/backend/filters/ionInfo.cpp:451 msgid "Display count data for points in console" msgstr "" #: ../src/backend/filters/ionInfo.cpp:458 msgid "Ion data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:462 #: ../src/backend/filters/profile.cpp:1107 #: ../src/backend/filters/clusterAnalysis.cpp:1108 #: ../src/backend/filters/spatialAnalysis.cpp:1116 msgid "Normalise" msgstr "" #: ../src/backend/filters/ionInfo.cpp:466 msgid "Normalise count data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:530 msgid "Volume" msgstr "" #: ../src/backend/filters/ionInfo.cpp:533 msgid "Compute volume for point data" msgstr "" #: ../src/backend/filters/ionInfo.cpp:549 msgid "Select volume counting technique" msgstr "" #: ../src/backend/filters/ionInfo.cpp:562 msgid "Volume data" msgstr "" #: ../src/backend/filters/rangeFile.cpp:120 #: ../src/backend/filters/rangeFile.h:96 msgid "Ranging" msgstr "" #: ../src/backend/filters/rangeFile.cpp:560 #: ../src/backend/filters/rangeFile.cpp:580 #: ../src/backend/filters/dataLoad.cpp:484 #: ../src/backend/filters/dataLoad.cpp:505 msgid "File" msgstr "" #: ../src/backend/filters/rangeFile.cpp:563 msgid "File to use for range data" msgstr "" #: ../src/backend/filters/rangeFile.cpp:573 msgid "Drop unranged" msgstr "" #: ../src/backend/filters/rangeFile.cpp:575 msgid "Remove unranged points when generating output" msgstr "" #: ../src/backend/filters/rangeFile.cpp:585 msgid "Legend" msgstr "" #: ../src/backend/filters/rangeFile.cpp:587 msgid "Display colour legend for enabled ions" msgstr "" #: ../src/backend/filters/rangeFile.cpp:591 msgid "View" msgstr "" #: ../src/backend/filters/rangeFile.cpp:607 msgid "All Ions" msgstr "" #: ../src/backend/filters/rangeFile.cpp:608 msgid "Enable/disable all ions at once" msgstr "" #: ../src/backend/filters/rangeFile.cpp:616 msgid "Species" msgstr "" #: ../src/backend/filters/rangeFile.cpp:623 msgid "IonID " msgstr "" #: ../src/backend/filters/rangeFile.cpp:624 msgid "Enable/disable specified ion" msgstr "" #: ../src/backend/filters/rangeFile.cpp:634 msgid "Active Ion " msgstr "" #: ../src/backend/filters/rangeFile.cpp:636 msgid "If true, ion is used in output" msgstr "" #: ../src/backend/filters/rangeFile.cpp:646 msgid "Colour " msgstr "" #: ../src/backend/filters/rangeFile.cpp:650 msgid "Colour used to represent ion" msgstr "" #: ../src/backend/filters/rangeFile.cpp:673 msgid "All Ranges" msgstr "" #: ../src/backend/filters/rangeFile.cpp:674 msgid "Enable/disable all ranges" msgstr "" #: ../src/backend/filters/rangeFile.cpp:689 msgid "Active Rng " msgstr "" #: ../src/backend/filters/rangeFile.cpp:692 msgid "" "Enable/disable specified range (ion must also be enabled to activiate range)" msgstr "" #: ../src/backend/filters/rangeFile.cpp:696 msgid "Ion " msgstr "" #: ../src/backend/filters/rangeFile.cpp:699 msgid "Name of ion associate to this range" msgstr "" #: ../src/backend/filters/rangeFile.cpp:708 msgid "Start rng " msgstr "" #: ../src/backend/filters/rangeFile.cpp:711 msgid "Start value for range" msgstr "" #: ../src/backend/filters/rangeFile.cpp:716 msgid "End rng " msgstr "" #: ../src/backend/filters/rangeFile.cpp:719 msgid "Stopping value for range`" msgstr "" #: ../src/backend/filters/profile.cpp:51 msgid "Cylinder (axial)" msgstr "" #: ../src/backend/filters/profile.cpp:52 msgid "Cylinder (radial)" msgstr "" #: ../src/backend/filters/profile.cpp:591 msgid "Distance" msgstr "" #: ../src/backend/filters/profile.cpp:599 msgid "Fraction" msgstr "" #: ../src/backend/filters/profile.cpp:601 msgid "Density (\\frac{\\#}{len^3})" msgstr "" #: ../src/backend/filters/profile.cpp:628 msgid "Freq. Profile" msgstr "" #: ../src/backend/filters/profile.cpp:680 msgid "No data remained in profile - cannot display result" msgstr "" #: ../src/backend/filters/profile.cpp:967 msgid "Total Density" msgstr "" #: ../src/backend/filters/profile.cpp:971 msgid "Do not do per-species analysis, perform density computation only" msgstr "" #: ../src/backend/filters/profile.cpp:985 msgid "Primitive type" msgstr "" #: ../src/backend/filters/profile.cpp:989 msgid "Basic shape to use for profile" msgstr "" #: ../src/backend/filters/profile.cpp:1001 msgid "Display the 3D composition profile interaction object" msgstr "" #: ../src/backend/filters/profile.cpp:1016 #: ../src/backend/filters/spatialAnalysis.cpp:1044 msgid "Position for centre of cylinder" msgstr "" #: ../src/backend/filters/profile.cpp:1024 msgid "Vector between ends of cylinder" msgstr "" #: ../src/backend/filters/profile.cpp:1032 msgid "Prevent length of cylinder changing during interaction" msgstr "" #: ../src/backend/filters/profile.cpp:1075 msgid "Fixed Bin Num" msgstr "" #: ../src/backend/filters/profile.cpp:1078 msgid "" "If true, use a fixed number of bins for profile, otherwise use fixed step " "size" msgstr "" #: ../src/backend/filters/profile.cpp:1085 #: ../src/backend/filters/spatialAnalysis.cpp:887 #: ../src/backend/filters/spatialAnalysis.cpp:1021 msgid "Num Bins" msgstr "" #: ../src/backend/filters/profile.cpp:1090 msgid "Number of bins to use for profile" msgstr "" #: ../src/backend/filters/profile.cpp:1096 #: ../src/backend/filters/spectrumPlot.cpp:580 msgid "Bin width" msgstr "" #: ../src/backend/filters/profile.cpp:1102 msgid "Size of each bin in profile" msgstr "" #: ../src/backend/filters/profile.cpp:1111 msgid "Convert bin counts into relative frequencies in each bin" msgstr "" #: ../src/backend/filters/profile.cpp:1115 msgid "Min. events" msgstr "" #: ../src/backend/filters/profile.cpp:1119 msgid "Drop data that does not have this many events" msgstr "" #: ../src/backend/filters/profile.cpp:1122 msgid "Settings" msgstr "" #: ../src/backend/filters/profile.cpp:1144 #: ../src/backend/filters/spectrumPlot.cpp:669 msgid "Plot Type" msgstr "" #: ../src/backend/filters/profile.cpp:1147 msgid "Visual style for plot" msgstr "" #: ../src/backend/filters/profile.cpp:1158 msgid "Colour of plot" msgstr "" #: ../src/backend/filters/profile.cpp:1174 msgid "Err. Estimator" msgstr "" #: ../src/backend/filters/profile.cpp:1177 msgid "Method of estimating error associated with each bin" msgstr "" #: ../src/backend/filters/profile.cpp:1184 msgid "Avg. Window" msgstr "" #: ../src/backend/filters/profile.cpp:1187 msgid "Number of bins to include in moving average filter" msgstr "" #: ../src/backend/filters/profile.cpp:1191 msgid "Error analysis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:64 msgid "Box only" msgstr "" #: ../src/backend/filters/boundingBox.cpp:65 msgid "Tick" msgstr "" #: ../src/backend/filters/boundingBox.cpp:66 msgid "Dimension" msgstr "" #: ../src/backend/filters/boundingBox.cpp:571 msgid "If true, show box, otherwise hide box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:584 msgid "Style" msgstr "" #: ../src/backend/filters/boundingBox.cpp:587 msgid "Box display mode" msgstr "" #: ../src/backend/filters/boundingBox.cpp:590 msgid "Display mode" msgstr "" #: ../src/backend/filters/boundingBox.cpp:599 msgid "Fixed Tick Num" msgstr "" #: ../src/backend/filters/boundingBox.cpp:603 msgid "" "If true, evenly use specified number of ticks. Otherwise, use distance to " "determine tick count" msgstr "" #: ../src/backend/filters/boundingBox.cpp:611 msgid "Num X" msgstr "" #: ../src/backend/filters/boundingBox.cpp:614 msgid "Tick count in X direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:619 msgid "Num Y" msgstr "" #: ../src/backend/filters/boundingBox.cpp:622 msgid "Tick count in Y direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:627 msgid "Num Z" msgstr "" #: ../src/backend/filters/boundingBox.cpp:630 msgid "Tick count in Z direction" msgstr "" #: ../src/backend/filters/boundingBox.cpp:636 msgid "Spacing X" msgstr "" #: ../src/backend/filters/boundingBox.cpp:640 msgid "Distance between ticks on X axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:644 msgid "Spacing Y" msgstr "" #: ../src/backend/filters/boundingBox.cpp:648 msgid "Distance between ticks on Y axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:652 msgid "Spacing Z" msgstr "" #: ../src/backend/filters/boundingBox.cpp:656 msgid "Distance between ticks on Z axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:664 msgid "Ticks X" msgstr "" #: ../src/backend/filters/boundingBox.cpp:668 msgid "Display tick marks on X axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:672 msgid "Ticks Y" msgstr "" #: ../src/backend/filters/boundingBox.cpp:676 msgid "Display tick marks on Y axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:680 msgid "Ticks Z" msgstr "" #: ../src/backend/filters/boundingBox.cpp:684 msgid "Display tick marks on Z axis" msgstr "" #: ../src/backend/filters/boundingBox.cpp:687 msgid "Tick marks" msgstr "" #: ../src/backend/filters/boundingBox.cpp:694 msgid "Box Colour" msgstr "" #: ../src/backend/filters/boundingBox.cpp:698 msgid "Colour of the bounding box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:703 msgid "Line thickness" msgstr "" #: ../src/backend/filters/boundingBox.cpp:707 msgid "Thickness of the lines used to draw the box" msgstr "" #: ../src/backend/filters/boundingBox.cpp:718 msgid "Relative size for text" msgstr "" #: ../src/backend/filters/boundingBox.cpp:723 msgid "Abs. Coords" msgstr "" #: ../src/backend/filters/boundingBox.cpp:726 msgid "Show labels using aboslute coo-ordinates" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:191 msgid "Sampling" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:447 msgid "By Count" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:450 msgid "Sample up to a fixed number of ions" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:456 msgid "Per Species" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:460 msgid "Use species specific (from ranging) sampling values" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:489 msgid "Sampling value for species" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:505 #: ../src/backend/filters/ionDownsample.cpp:529 msgid "Sampling rates" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:513 msgid "Output Count" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:516 msgid "Sample up to this value of points" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:521 msgid "Out Fraction" msgstr "" #: ../src/backend/filters/ionDownsample.cpp:525 msgid "Sample this fraction of points" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:84 #: ../src/backend/filters/clusterAnalysis.cpp:1060 msgid "Size Distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:85 msgid "Chemistry Distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:503 msgid "No range data. Can't cluster." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:514 msgid "" "No ranges selected for cluster \"core\". Cannot continue with clustering." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:523 msgid "" "No ranges selected for cluster \"bulk\". Cannot continue with clustering." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:689 msgid "Morphology Plot" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:690 msgid "\\lambda_1:\\lambda_2 ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:691 msgid "\\lambda_2:\\lambda_3 ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:736 msgid "No clusters had sufficient dimensionality to compute singular values" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:794 msgid "Found :" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:796 msgid " clusters" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:888 msgid "Compositions (fractional, core+bulk)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:890 msgid "Compositions (fractional, core only)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:908 msgid "Frequencies (core+bulk)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:939 msgid "Core Link + Erode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:947 msgid "Cluster algorithm mode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:958 msgid "Core Classify" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:961 msgid "" "Enable core-classifcation pre-step in clustering (Stephenson et al, 2007)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:967 msgid "Core Classify Dist" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:970 msgid "Restrict only atoms by distance to be cluster sources" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:975 msgid "Classify Knn Max" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:978 msgid "" "Require that the kth NN (this number) is within the classify distance, to be " "a cluster source" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:984 msgid "Core Link Dist" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:987 msgid "Distance between clusters to allow linking" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:992 msgid "Bulk Link" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:995 #: ../src/backend/filters/clusterAnalysis.cpp:1012 msgid "Enable linking of non-cluster species - eg for composition analysis " msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1002 msgid "Bulk Link (Envelope) Dist" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1005 msgid "" "Distance from core points that form cluster that is used to grab surrounding " "bulk points" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1009 msgid "Erosion" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1018 msgid "Erode Dist" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1021 msgid "" "Distance from unclustered material in which bulk points are eroded from " "cluster" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1028 msgid "Clustering Params" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1033 msgid "Size Cropping" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1036 msgid "Remove clusters based upon size distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1043 msgid "Min Size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1046 msgid "Remove clusters below this size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1051 msgid "Max Size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1054 msgid "Remove clusters above this size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1063 msgid "Show number of clusters as a function of cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1069 msgid "Log Scale" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1072 msgid "Use logarithmic scale for size distribution" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1079 msgid "Morphology Dist." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1082 msgid "Create a plot showing cluster aspect ratio" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1088 msgid "Cluster Id" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1091 msgid "Assign cluster output a unique per-cluster value (id)." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1098 msgid "Chemistry Dist." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1101 msgid "Create a plot showing chemistry for each cluster size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1111 msgid "Convert cluster counts to composition" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1117 msgid "Postprocess" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1136 msgid "If selected, use as \"core\" ion type (can make clusters)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1141 msgid "Core Ranges" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1147 msgid "Enable/Disable All" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1152 msgid "Enable/disable all ions" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1165 msgid "" "If selected, use as \"bulk\" ion type (can be included in existing clusters)" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1170 msgid "Bulk Ranges" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1186 msgid "Max. Sep + Erode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1939 msgid " --------------------------- Parameter selection notice ------------- " msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1940 msgid "You have specified a bulk distance larger than half your link distance." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1941 msgid "" "You can do this; thats OK, but the output is no longer independent of the " "computational process;" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1942 msgid "" "This will be a problem in the case where two or more clusters can equally " "lay claim to a \"bulk\" ion. " msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1943 msgid "" " If your inter-cluster distance is sufficiently large (larger than your bulk " "linking distance), then you can get away with this." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1944 msgid "" " In theory it is possible to \"join\" the clusters, but this has not been " "implemented for speed reasons." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1945 msgid "" "If you want this, please contact the author, or just use the source to add " "this in yourself." msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1946 msgid "---------------------------------------------------------------------- " msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:1975 msgid "Build Core" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2003 msgid "Core" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2126 msgid "Bulk" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2204 msgid "Erode" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2282 msgid "Re-Collate" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2337 msgid "Classify Core" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2428 msgid "Build Bulk" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2676 #: ../src/backend/filters/clusterAnalysis.cpp:2879 msgid "Cluster Size" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2677 #: ../src/backend/filters/clusterAnalysis.cpp:2883 msgid "Frequency" msgstr "" #: ../src/backend/filters/clusterAnalysis.cpp:2881 msgid "Composition" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:123 msgid "Local Density" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:124 msgid "Density Filtering" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:125 msgid "Radial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:126 msgid "Axial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:127 msgid "Binomial Distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:128 msgid "Point Em/Replacement" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:129 msgid "Local Concentration" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:133 msgid "Neighbour Count" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:643 msgid "Load" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:660 #: ../src/backend/filters/spatialAnalysis.cpp:2330 #: ../src/backend/filters/spatialAnalysis.cpp:2383 #: ../src/backend/filters/spatialAnalysis.cpp:2733 #: ../src/backend/filters/spatialAnalysis.cpp:3022 #: ../src/backend/filters/spatialAnalysis.cpp:3540 #: ../src/backend/filters/spatialAnalysis.cpp:4184 msgid "Build" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:705 #: ../src/backend/filters/spatialAnalysis.cpp:3558 #: ../src/backend/filters/spatialAnalysis.cpp:4073 #: ../src/backend/filters/spatialAnalysis.cpp:4201 msgid "Compute" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:803 msgid "Spatial analysis algorithm to use" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:827 #: ../src/backend/filters/spatialAnalysis.cpp:878 msgid "Stop Mode" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:830 msgid "Method to use to terminate algorithm when examining each point" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:837 msgid "NN Max" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:840 msgid "Maximum number of neighbours to examine" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:847 msgid "Normalise bins" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:850 msgid "" "Normalise counts by binwidth. Needed when comparing NN histograms against " "one another" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:856 msgid "Show Random" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:859 msgid "Show a fitted (density matched) theoretical distribution" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:870 msgid "Dist Max" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:873 msgid "Maximum distance from each point for search" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:890 #: ../src/backend/filters/spatialAnalysis.cpp:1024 msgid "Number of bins for output 1D RDF plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:896 msgid "Surface Remove" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:899 msgid "" "Exclude surface as part of source to minimise bias in RDF (at cost of " "increased noise)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:906 msgid "Remove Dist" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:909 msgid "Minimum distance to remove from surface" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:917 #: ../src/backend/filters/spatialAnalysis.cpp:1029 msgid "Plot colour " msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:920 #: ../src/backend/filters/spatialAnalysis.cpp:1032 msgid "Colour of output plot" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:924 #: ../src/backend/filters/spatialAnalysis.cpp:1010 #: ../src/backend/filters/spatialAnalysis.cpp:1015 #: ../src/backend/filters/spatialAnalysis.cpp:1064 #: ../src/backend/filters/spatialAnalysis.cpp:1103 msgid "Alg. Params." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:937 #: ../src/backend/filters/spatialAnalysis.cpp:1207 msgid "Source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:940 msgid "Ions to use for initiating RDF search" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:953 #: ../src/backend/filters/spatialAnalysis.cpp:1223 #: ../src/backend/filters/spatialAnalysis.cpp:1249 msgid "Enable/disable ion as source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:958 #: ../src/backend/filters/spatialAnalysis.cpp:1228 msgid "Source Ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:965 ../src/gl/cameras.cpp:611 msgid "Target" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:968 #: ../src/backend/filters/spatialAnalysis.cpp:1264 msgid "Enable/disable all ions as target" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:980 #: ../src/backend/filters/spatialAnalysis.cpp:1276 msgid "Enable/disable this ion as target" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:984 msgid "Target Ion" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:994 msgid "Cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:997 msgid "Remove points with local density above/below this value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1003 msgid "Retain Upper" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1006 msgid "Retain either points with density above (enabled) or below cutoff" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1052 msgid "Vector between centre and end of cylinder" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1071 #: ../src/backend/filters/spatialAnalysis.cpp:3827 #: ../src/backend/filters/spatialAnalysis.cpp:3886 msgid "Block size" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1074 msgid "Number of ions to use per block" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1081 msgid "Max Block Aspect" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1084 msgid "" "Maximum allowable block aspect ratio. Blocks above this aspect are " "discarded. Setting too high decreases correlation strength. Too low causes " "loss of statistical power." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1095 msgid "Extrusion Direction" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1098 msgid "Direction in which blocks are extended during construction." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1107 msgid "Plot Counts" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1110 msgid "Show the counts in the binomial histogram" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1119 msgid "" "Normalise the counts in the binomial histogram to a probability density " "function" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1133 msgid "Display Grid" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1142 msgid "View Options" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1148 msgid "Data File" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1152 msgid "Pos file of points to subtract/replace/etc" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1157 msgid "Match Tol." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1160 msgid "Tolerance to allow for matching" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1176 msgid "Replacment condition" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1182 msgid "Replace value" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1185 msgid "Use value data from file when replacing ions" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1190 msgid "Replacement" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1210 msgid "Enable/disable all ions as source" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1236 msgid "Ions to use as Numerator for conc. calculation" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1785 msgid "Spatial analysis aborted by user" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1786 msgid "Insufficient memory to complete analysis" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1787 msgid "Required range data not present" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1788 msgid "Insufficient memory for binomial. Reduce input size?" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1789 msgid "Insufficient points to continue" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:1790 msgid "Unable to load file" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2437 #: ../src/backend/filters/spatialAnalysis.cpp:2756 #: ../src/backend/filters/spatialAnalysis.cpp:3046 msgid "Analyse" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2516 #: ../src/backend/filters/spatialAnalysis.cpp:2606 #: ../src/backend/filters/spatialAnalysis.cpp:2672 msgid "Radial Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2518 #: ../src/backend/filters/spatialAnalysis.cpp:2611 msgid "Count/Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2523 #: ../src/backend/filters/spatialAnalysis.cpp:2616 msgid "NN Freq." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2663 msgid "Warning, " msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2664 msgid "" " points were unable to find neighbour points that exceeded the search " "radius, and thus terminated prematurely" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2674 msgid " RDF" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2952 #: ../src/backend/filters/spatialAnalysis.cpp:3251 msgid "Number Density (\\#/Vol^3)" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2977 #: ../src/backend/filters/spatialAnalysis.cpp:3271 msgid "Warning," msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:2978 #: ../src/backend/filters/spatialAnalysis.cpp:3272 msgid " points were un-analysable. These have been dropped" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3000 #: ../src/backend/filters/spatialAnalysis.cpp:3294 msgid "And so on..." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3376 msgid "Extract" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3449 msgid "Reduce" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3604 msgid "Insufficient points to complete analysis" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3627 msgid "Axial Distance" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3629 msgid " 1D Dist. Func." msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3698 msgid "Binomial" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3829 #: ../src/backend/filters/spatialAnalysis.cpp:3888 msgid "Rel. Frequency" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3966 msgid "Build Numerator" msgstr "" #: ../src/backend/filters/spatialAnalysis.cpp:3980 msgid "Build Denominator" msgstr "" #: ../src/backend/filters/ionColour.cpp:257 msgid "Colour Map" msgstr "" #: ../src/backend/filters/ionColour.cpp:265 msgid "Reverse map" msgstr "" #: ../src/backend/filters/ionColour.cpp:266 msgid "Reverse the colour scale" msgstr "" #: ../src/backend/filters/ionColour.cpp:279 msgid "Opacity" msgstr "" #: ../src/backend/filters/ionColour.cpp:286 msgid "Num Colours" msgstr "" #: ../src/backend/filters/ionColour.cpp:288 msgid "Number of unique colours to use in colour map" msgstr "" #: ../src/backend/filters/dataLoad.cpp:61 msgid "Auto" msgstr "" #: ../src/backend/filters/dataLoad.cpp:62 msgid "Little" msgstr "" #: ../src/backend/filters/dataLoad.cpp:63 msgid "Big" msgstr "" #: ../src/backend/filters/dataLoad.cpp:66 msgid "POS Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:67 msgid "Text Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:68 msgid "ATO Data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:248 msgid " does not exist" msgstr "" #: ../src/backend/filters/dataLoad.cpp:275 msgid "Reading File" msgstr "" #: ../src/backend/filters/dataLoad.cpp:290 #: ../src/backend/filters/dataLoad.cpp:303 #: ../src/backend/filters/dataLoad.cpp:347 #: ../src/backend/filters/dataLoad.cpp:358 #: ../src/backend/filters/dataLoad.cpp:418 msgid "Error loading file: " msgstr "" #: ../src/backend/filters/dataLoad.cpp:320 msgid "Sampling is active, loaded " msgstr "" #: ../src/backend/filters/dataLoad.cpp:321 msgid " available." msgstr "" #: ../src/backend/filters/dataLoad.cpp:329 msgid "Loaded entire dataset, " msgstr "" #: ../src/backend/filters/dataLoad.cpp:329 #: ../src/backend/filters/dataLoad.cpp:428 msgid " points." msgstr "" #: ../src/backend/filters/dataLoad.cpp:373 msgid "" "Data file contained incorrect number of columns -- should be 3 or 4, was " msgstr "" #: ../src/backend/filters/dataLoad.cpp:427 msgid "Loaded dataset, " msgstr "" #: ../src/backend/filters/dataLoad.cpp:460 msgid "" "Warning:One or more bounds of the loaded data approaches the limits of " "numerical stability for the internal data type(magnitude too large). " "Consider rescaling data before loading" msgstr "" #: ../src/backend/filters/dataLoad.cpp:485 msgid "File from which to load data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:488 msgid "" "Readable files (*.xml, *.pos, *.txt,*.csv, *.ato)|*.xml;*.pos;*.txt;*.csv;*." "ato|All Files|*" msgstr "" #: ../src/backend/filters/dataLoad.cpp:498 msgid "File type" msgstr "" #: ../src/backend/filters/dataLoad.cpp:500 msgid "Type of file to be loaded" msgstr "" #: ../src/backend/filters/dataLoad.cpp:515 msgid "Entries per point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:516 msgid "Number of decimal values in file per 3D point (normally 4)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:535 msgid "File \"Endianness\"" msgstr "" #: ../src/backend/filters/dataLoad.cpp:536 msgid "On-disk data storage format. If file won't load, just try each" msgstr "" #: ../src/backend/filters/dataLoad.cpp:561 msgid "Relative offset of each entry in file for point's X position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:569 msgid "Relative offset of each entry in file for point's Y position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:577 msgid "Relative offset of each entry in file for point's Z position" msgstr "" #: ../src/backend/filters/dataLoad.cpp:585 msgid "" "Relative offset of each entry in file to use for scalar value of 3D point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:588 msgid "Value Label" msgstr "" #: ../src/backend/filters/dataLoad.cpp:592 msgid "Name for the scalar value associated with each point" msgstr "" #: ../src/backend/filters/dataLoad.cpp:595 msgid "Format params." msgstr "" #: ../src/backend/filters/dataLoad.cpp:601 msgid "Enabled" msgstr "" #: ../src/backend/filters/dataLoad.cpp:605 msgid "Load this file?" msgstr "" #: ../src/backend/filters/dataLoad.cpp:616 msgid "Sample data" msgstr "" #: ../src/backend/filters/dataLoad.cpp:619 msgid "" "Perform random selection on file contents, instead of loading entire file" msgstr "" #: ../src/backend/filters/dataLoad.cpp:626 msgid "Load Limit (MB)" msgstr "" #: ../src/backend/filters/dataLoad.cpp:629 msgid "Limit for size of data to load" msgstr "" #: ../src/backend/filters/dataLoad.cpp:636 msgid "Monitor" msgstr "" #: ../src/backend/filters/dataLoad.cpp:640 msgid "" "Watch file timestamp to track changes to file contents from other programs" msgstr "" #: ../src/backend/filters/dataLoad.cpp:644 msgid "Load params." msgstr "" #: ../src/backend/filters/dataLoad.cpp:651 msgid "Default colour " msgstr "" #: ../src/backend/filters/dataLoad.cpp:654 msgid "Default colour for points, if not overridden by other filters" msgstr "" #: ../src/backend/filters/dataLoad.cpp:659 msgid "Draw Size" msgstr "" #: ../src/backend/filters/dataLoad.cpp:662 msgid "Default size for points, if not overridden by other filters" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:77 msgid "Maximum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:78 msgid "Max in limit" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:79 msgid "Probability" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:170 msgid "Extrema" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:219 msgid "count" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:304 msgid "Mixed data" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:445 msgid "Background:" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:504 msgid "Relative " msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:507 msgid "Probability Density" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:584 msgid "Step size for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:589 msgid "Auto Min/max" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:593 msgid "Automatically compute spectrum upper and lower bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:598 msgid "Min" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:601 msgid "Starting position for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:606 msgid "Max" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:609 msgid "Ending position for spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:617 msgid "Logarithmic" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:620 msgid "Convert the plot to logarithmic mode" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:632 msgid "Normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:635 msgid "Rescale the plot height, to make inter-spectrum comparisons easier" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:642 msgid "Lower Bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:646 msgid "Do not use data below this x-value for normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:650 msgid "Upper Bound" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:654 msgid "Do not use data above this x-value for normalisation" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:672 msgid "Visual style of plot" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:679 msgid "Colour of plotted spectrum" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:694 msgid "Model" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:697 msgid "Fitting method to use" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:708 msgid "Fit Start" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:709 msgid "Start mass value for fitting background" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:715 msgid "Fit End" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:716 msgid "End mass value for fitting background" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:729 msgid "Corr. Only" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:730 msgid "Only show corrected spectrum, not fit" msgstr "" #: ../src/backend/filters/spectrumPlot.cpp:738 msgid "Background Mode" msgstr "" #: ../src/backend/configFile.cpp:187 msgid "Config file present, but is not valid (root node test)" msgstr "" #: ../src/backend/configFile.cpp:228 msgid "Unable to interpret recent file entry" msgstr "" #: ../src/backend/configFile.cpp:268 msgid "Unable to determine filter type in defaults listing." msgstr "" #: ../src/backend/configFile.cpp:605 msgid "Online access for non win32/apple platforms is intentionally disabled, " msgstr "" #: ../src/backend/configFile.cpp:606 msgid "" "regardless of the settings you use here. Use your package manager to keep up-" "to-date" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:223 msgid "" "Parent filter has no output, but filter requires input -- there is no point " "in placing a child filter here." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:224 msgid "Leaf-only filter with child" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:234 msgid "" "Parent filters' output will be blocked by child, without use. Parent results " "will be dropped." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:235 #: ../src/backend/filtertreeAnalyse.cpp:249 msgid "Bad parent->child pair" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:248 msgid "" "First filter does not output anything useable by child filter. Child filter " "not useful." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:328 msgid "Spatial results possibly altered" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:329 msgid "" "Filters and settings selected that could alter reported results that depend " "upon density. Check to see if spatial sampling may be happening in the " "filter tree - this warning is provisional only." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:397 msgid "Filter needs parent \"" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:398 msgid "" "\" but does not have one. Filter may not function correctly until this " "parent is given." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:399 msgid "Filter missing needed parent" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:430 msgid "Bad range filter settings" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:431 msgid "" "Rangefile set to drop unranged data, however a child filter requires it." msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:613 msgid "Composition results possibly altered" msgstr "" #: ../src/backend/filtertreeAnalyse.cpp:614 msgid "" "Filters and settings selected that could bias reported composition. Check to " "see if species biasing may occcur in the filter tree - this warning is " "provisional only." msgstr "" #: ../src/backend/plot.cpp:29 msgid "Moving avg." msgstr "" #: ../src/backend/plot.cpp:33 msgid "Lines" msgstr "" #: ../src/backend/plot.cpp:34 msgid "Bars" msgstr "" #: ../src/backend/plot.cpp:35 msgid "Steps" msgstr "" #: ../src/backend/plot.cpp:36 msgid "Stem" msgstr "" #: ../src/backend/plot.cpp:37 msgid "Points" msgstr "" #: ../src/backend/plot.cpp:39 msgid "Density" msgstr "" #: ../src/backend/plot.cpp:40 msgid "Scatter" msgstr "" #: ../src/backend/plot.cpp:739 ../src/backend/plot.cpp:747 msgid "Multiple data types" msgstr "" #: ../src/backend/plot.cpp:1581 msgid "error" msgstr "" #: ../src/backend/plot.cpp:1821 msgid "Amplitude" msgstr "" #: ../src/backend/filtertree.cpp:1151 msgid "WARNING: Skipping node " msgstr "" #: ../src/backend/filtertree.cpp:1151 msgid " as it was not recognised" msgstr "" #: ../src/backend/filtertree.cpp:1189 msgid "Error processing node: " msgstr "" #: ../src/gl/cameras.cpp:596 msgid "Lock" msgstr "" #: ../src/gl/cameras.cpp:617 msgid "Up Dir." msgstr "" #: ../src/gl/cameras.cpp:625 ../src/gl/cameras.cpp:728 msgid "Perspective" msgstr "" #: ../src/gl/cameras.cpp:631 msgid "Projection" msgstr "" #: ../src/gl/cameras.cpp:640 msgid "Field of View (deg)" msgstr "" #: ../src/gl/cameras.cpp:646 msgid "View size" msgstr "" #: ../src/3Depict.cpp:397 msgid "File : " msgstr "" #: ../src/3Depict.cpp:397 msgid " does not exist. Skipping" msgstr "" #: ../src/common/constants.cpp:22 msgid "" "Range Files (*.rng; *.env; *.rrng)|*.rng;*.env;*.rrng;*.RRNG;*.RNG;*.ENV|RNG " "File (*.rng)|*.rng;*.RNG|Environment File (*.env)|*.env;*.ENV|RRNG Files (*." "rrng)|*.rrng;*.RRNG|All Files (*)|*" msgstr "" #: ../src/common/basics.cpp:183 msgid "in the future?" msgstr "" #: ../src/common/basics.cpp:234 msgid "a decade ago" msgstr "" #: ../src/common/basics.cpp:235 msgid "a year ago" msgstr "" #: ../src/common/basics.cpp:236 msgid "a month ago" msgstr "" #: ../src/common/basics.cpp:237 msgid "a week ago" msgstr "" #: ../src/common/basics.cpp:238 msgid "a day ago" msgstr "" #: ../src/common/basics.cpp:239 msgid "an hour ago" msgstr "" #: ../src/common/basics.cpp:240 msgid "45 minutes ago" msgstr "" #: ../src/common/basics.cpp:241 msgid "30 minutes ago" msgstr "" #: ../src/common/basics.cpp:242 msgid "20 minutes ago" msgstr "" #: ../src/common/basics.cpp:243 msgid "15 minutes ago" msgstr "" #: ../src/common/basics.cpp:244 msgid "10 minutes ago" msgstr "" #: ../src/common/basics.cpp:245 msgid "5 minutes ago" msgstr "" #: ../src/common/basics.cpp:246 msgid "a minute ago" msgstr "" #: ../src/common/basics.cpp:247 msgid "30 seconds ago" msgstr "" #: ../src/common/basics.cpp:248 msgid "10 seconds ago" msgstr "" #: ../src/common/basics.cpp:249 msgid "a second ago" msgstr "" #: ../src/common/basics.cpp:254 msgid "a few decades ago" msgstr "" #: ../src/common/basics.cpp:255 msgid "a few years ago" msgstr "" #: ../src/common/basics.cpp:256 msgid "a few months ago" msgstr "" #: ../src/common/basics.cpp:257 msgid "a few weeks ago" msgstr "" #: ../src/common/basics.cpp:258 msgid "a few days ago" msgstr "" #: ../src/common/basics.cpp:259 msgid "a few hours ago" msgstr "" #: ../src/common/basics.cpp:266 msgid "a few minutes ago" msgstr "" #: ../src/common/basics.cpp:269 msgid "a few seconds ago" msgstr "" #: ../src/common/basics.cpp:296 msgid "moments ago" msgstr "" #: ../src/common/colourmap.cpp:242 msgid "Jet" msgstr "" #: ../src/common/colourmap.cpp:243 msgid "Hot" msgstr "" #: ../src/common/colourmap.cpp:244 msgid "Cold" msgstr "" #: ../src/common/colourmap.cpp:245 msgid "Grey" msgstr "" #: ../src/common/colourmap.cpp:246 msgid "Cyclic" msgstr "" #: ../src/common/colourmap.cpp:247 msgid "General" msgstr "" #: ../src/common/colourmap.cpp:248 msgid "Blue" msgstr "" #: ../src/common/colourmap.cpp:249 msgid "Pseudo-Random" msgstr "" #: ../src/wx/wxcomponents.cpp:191 msgid "Save Data..." msgstr "" #: ../src/wx/wxcomponents.cpp:192 msgid "Text File (*.txt)|*.txt|All Files (*)|*" msgstr "" #: ../src/wx/wxcomponents.cpp:204 msgid "Error saving file. Check output dir is writable." msgstr "" #: ../src/backend/filters/dataLoad.h:135 msgid "Pos Data" msgstr "" #: ../src/backend/filters/ionInfo.h:103 msgid "Ion info" msgstr "" #: ../src/backend/filters/externalProgram.h:69 msgid "Ext. Program" msgstr "" #: ../src/backend/filters/ionColour.h:63 msgid "Spectral Colour" msgstr "" #: ../src/backend/filters/profile.h:123 msgid "Comp. Prof." msgstr "" #: ../src/backend/filters/ionDownsample.h:79 msgid "Ion Sampler" msgstr "" #: ../src/backend/filters/boundingBox.h:76 msgid "Bound box" msgstr "" #: ../src/backend/filters/transform.h:71 msgid "Ion. Transform" msgstr "" #: ../src/wx/wxcomponents.h:82 msgid "treeCtrl" msgstr "" #: ../data/startup-tips.txt:5 msgid "" "You can reset the main view by tapping the space bar. Hold down modifier " "keys like shift,ctrl to change the axis. Double tap to switch which axis to " "look down" msgstr "" #: ../data/startup-tips.txt:6 msgid "" "You can delete filters from the tree by selecting them, then tapping delete?" msgstr "" #: ../data/startup-tips.txt:7 msgid "" "Multiple languages are supported? You can translate the program into your " "own language at https://www.transifex.com/projects/p/3depict/" msgstr "" #: ../data/startup-tips.txt:8 msgid "" "Package files can be easily shared to allow others to view your analysis, " "using the File->Export->Package menu item" msgstr "" #: ../data/startup-tips.txt:9 msgid "" "You can export plots to SVG \"Vector\" format, for easier editing - edit " "your plots in inkscape!" msgstr "" #: ../data/startup-tips.txt:10 msgid "You can access the manual from the Help menu" msgstr "" #: ../data/startup-tips.txt:11 msgid "You can change filter defaults using the Edit->Preferences menu item" msgstr "" #: ../data/startup-tips.txt:12 msgid "" "You can overlay multiple plots at once, by selecting more than on plot at a " "time (e.g. using Ctrl)" msgstr "" #: ../data/startup-tips.txt:13 msgid "" "Calculations are much faster (more than linear speedup) when working with " "smaller datasets - try sampling, or clipping out a small region to work " "faster, then remove the sampling when you are ready" msgstr "" #: ../data/startup-tips.txt:14 msgid "" "You can abort most calculations either by pressing Escape (OSX/Linux), or by " "using the Abort button (Windows)" msgstr "" #: ../data/startup-tips.txt:15 msgid "" "That anyone can contribute to improving this program, even without knowing " "about computer programming?" msgstr "" #: ../data/startup-tips.txt:16 msgid "" "You can load more than one file at a time, then either operate on the " "separately, or together" msgstr "" #: ../data/startup-tips.txt:17 msgid "" "You can have more than one range file for different parts of your dataset" msgstr "" #: ../data/startup-tips.txt:18 msgid "" "Cameras can be saved and retrieved whenever you like, using the camera tab" msgstr "" #: ../data/startup-tips.txt:19 msgid "" "Subsections of the filter tree can be saved to the \"Stashed filters\" drop-" "down" msgstr "" #: ../data/startup-tips.txt:20 msgid "" "The console tab along the bottom often shows useful messages from filters. " "When new messages appear, a small symbol is shown on the tab" msgstr "" #: ../data/startup-tips.txt:21 msgid "" "The raw data used for any plot can be accessed from the \"Raw\" tab on the " "bottom panel" msgstr "" #: ../data/startup-tips.txt:22 msgid "" "You can ask questions about the program, or using it on your data on our " "forums (https://sourceforge.net/p/threedepict/discussion/general/)" msgstr "" #: ../data/startup-tips.txt:23 msgid "" "By creating a camera, you can switch between orthographic and perspective " "views" msgstr "" #: ../data/startup-tips.txt:24 msgid "" "You can open multiple files at once, and get a side-by-side view by " "translating (shifting) one of the datasets to one side" msgstr "" 3Depict-0.0.19/translations/makeTranslations0000755000175000017500000000427712640746376020477 0ustar pcuserpcuser#!/bin/bash #I wrote this because autoconf is confusing as bloody hell. #I just need to copy some files into a place where gettext will expect them #I Shouldn't need to create some mega ultimate makefile.am for that, then #follow some random poorly documented hierarchy and naming system. (Looking at you gettextize!) #Usage: makeTranslation [install|update] #extract program name from sources -- Now with added case sensitivity hack! PROGRAM_NAME=`cat ../src/common/constants.cpp | grep PROGRAM_NAME | awk -F= '{print $2}' | sed 's/;//g' | sed 's/\"//g' | sed 's/;//' | sed 's/^\s*//'` #Where do we want to install the translations? (if using this script). TRANSLATION_INSTALL="/usr/share/locale/" #Space separated list of maintained locales MAINTAINED_LOCALES="de_DE" echo "Program name is $PROGRAM_NAME" if [ x"$PROGRAM_NAME" == x"" ] ; then echo "Unable to extract program name. Aborting" exit 1; fi if [ $# -eq 0 ] ; then echo "Creating binary translation files.." #Create binary versions of gettext translation files for i in *.po do #Quick check to see if we have any "" elements in the files if [ x"`grep ' tmp.pot mv tmp.pot ${PROGRAM_NAME}_${i}.po done echo "Replacing base template" msgmerge -N ${PROGRAM_NAME}_base.pot update.pot > tmp.pot mv tmp.pot ${PROGRAM_NAME}_base.pot rm update.pot fi fi 3Depict-0.0.19/translations/checkTranslationDupes.py0000755000175000017500000000063712640746376022100 0ustar pcuserpcuser#!/usr/bin/python import sys import re filename="3Depict_de_DE.po" f = open(filename) if not f: sys.exit("Unable to open file. Exiting") curLine=0 while True: curLine=curLine+1; s=f.readline(); if(not s): break; if re.match("msgid.*",s): msgid=s[6:]; elif re.match("msgstr.*",s): msgstr=s[7:]; if(msgid == msgstr and re.match(".*[A-z].*",msgid)): print "Duplicate id at " + str(curLine) 3Depict-0.0.19/translations/3Depict_de_DE.mo0000644000175000017500000012714012723200201020043 0ustar pcuserpcuserc45L& 3!3F03w3f3_4d4 ~4 44444434m5$5$5$5/5 $6.6A6 ^6j6~6666666666 7#737 D7R7 b7 o7|777 7 7 7777G7 .898H8W8f8u888 8w8*9 99G9 O9 [9 f9 r9 ~9 999 9<9 9: : :(: .::: M:&X:: : : ::::::::; ; !; -; 9;E; J;T; d; q;|; ;;u;!<'<+< 2< ><K<c<&x<<<<<< ===*=<=A=I=P= X=Vc== === =$>$,>6Q>>> >> >>>>??(?:? I? U?c?i?p?????? ???? @@@ &@3@ 8@ B@P@g@m@@@#@@HA BBC0DDDD EEE;E NEXoEEE4E%F/8FhFF'FSFGN+G(zG$G%G0G"H BHOHVHgH~HHH HH HHH H II"I=IWItIIIII IFI,!J NJ[JjJyJJ J JJ J J JJ K K K(K 1K =KKKcKkK KKK\KK"L%L+L JLVLZL _LjLsL |L LLLLLL LLLLdmMMNNN!NN:N 4O ?OMORO aO kO/wO OOOOO%O P P(P,P5P =PGP#eP PPPP#PPP"Q*Q9BQ|QQGQGQ=RBR SR ]R jRxR R RRRR R R RRRR SS!SG0SxSS S,SSS S S S TT&TDTMT`T/wTJT T T U U U+U 1U>U CU MU WU&dU UUUU;UU V V'V ,V 8VDVbVVV VVV VV W(W:WJW^WeWwW }W W W WSW>X?XYX`XhXzX~X1X XXXX X XY Y&YAYWYjYyY YYYYY Y YY Y Z ZZ5Z HZVZ fZsZ Z Z Z ZZZZ@Z :[ H[-R[ [[[ [[%[![ \:\*P\ {\\\\ \ \ \ \\ \]$]4]=] D] P] Z]h] n]y] ]] ]7]]]]]^ ^^ ^'"^ J^T^j^eW_ _;_`'%`M`c`}```R`aa7a Pa^a oaya a a'aVa!b):b4db+b<b%c (cbIc2c2c2dAEd%d1dd#d&"e'Ie)qe ee;e1f9fBfXf`fgfff6fff fffgg"g(g BgOg\ggg g[g83hlhi(i*i`,i iii i iiiiijj1jAj Qj ^j jj wj j jjjjjj)jj jTjHkLkPkTkXk\k`khk mBm\m{mYn^ntnnnnnnn3nd!o!o!o!o3o p1pFp bpnpp p ppppppqq qAqTqfquqqqqqqqqrr r #rG-r urrrrrrrrr|r{s s s s s s s ss ss tEt btpt xttt tt t1tt u uu/uEuWuiu|uuuu u u u uuuuv vv 9v EvxQvvvv vvww$8w]wvwwwww wwwx xxx xH)xrx yxx xx)x)xByVykyqyyy&yyyyy zz -z 9zGzNzUz uzzzzzzz+zz z {{{-{ 6{@{\{v{|{{{({{c}l}p~cA| Ȁ̀ ր3/LćC.DL!">ւkj2-2-`i# -9OoɅ  &2!:\%w(M,V &̇   $0&Ah w   ̈ֈ qr2 ݉   0:K_f lwd| q~$ȌH׌ 2@H ^ i?wƍ ʍ֍0->V Zfn%0ގ-A#Y1} BЏ0*O[W *<M V aou{  őґJ\q'Ò ̒ ֒* CM^Bom *8 ?L[ an s } $ ” ɔӔM&4 [ fq v-,,2NWn )Җ  ! / <`GB 261F x ؘ0 ?M`|)Й .JdxΚ$?]Wƛ*Λ  "0%C'i;-ޜ $7W ^ l v  Ɲ՝ޝ   (3 LDZ ȞԞٞ ޞ+ !k˟^7 C4<Zs'ӡH4;Xr  ˢu^3{6)@%Qw77V7Hƥ2/B r$,0.$EjZAާ /GOVqze&7JP kx\ {=|p $.HP`r¬׬0@O`gjmpEw ɭlӭ@DHLPTXZJR @jF|*t31d+VpzW 5+'ubcd R#&BZ516>?~:!.Xw[L:zBmt ?2$4 )Tv/gU+b9UK]Nb9E)a$`1;{W)lsiA =` q=V[.[%6I<Fe/3M8l6]\qD{Q0"LfI2kN'_#rCEGyn;7V/-& 5M#8~f(0 "AwG47I*<P=( p;| -?$Ki@ DX3(yv^e,OK-sWm>J\Aa"<Oh87c:SnP0QSN} _OPCYE!a>xF@kUBZ` LCH%o'SD&r*Y!XHM_}jTc ,g%R^HoGJT\Qx 2,h9.]^ Y 4u Config Load: --------------------------- Parameter selection notice ------------- If your inter-cluster distance is sufficiently large (larger than your bulk linking distance), then you can get away with this. In theory it is possible to "join" the clusters, but this has not been implemented for speed reasons. RDF as it was not recognised cannot use. clusters does not exist does not exist. Skipping found online. is up-to-date. of points were un-analysable. These have been dropped points were unable to find neighbour points that exceeded the search radius, and thus terminated prematurely"backcolour" node missing "b" value."backcolour" node missing "g" value."backcolour" node missing "r" value."backcolour"s rgb values must be in range [0,1]&About...&Axis Ctrl+Shift+I&Background Colour... Ctrl+B&Contact...&Control Pane Alt+C&Control Pane F2&Edit&Export&File&Fullscreen mode Ctrl+Shift+F&Fullscreen mode F11&Help&Help... Ctrl+H&Image... Ctrl+I&Legend Ctrl+L&Merge... Ctrl+Shift+O&Open... Ctrl+O&Plot List Alt+P&Plot List F4&Plot... Ctrl+P&Preferences&Quit Ctrl+Q&Raw Data Pane Alt+R&Raw Data Pane F3&Recent&Redo Ctrl+Y&Save Ctrl+S&Undo Ctrl+Z&View(fast)(slow)---------------------------------------------------------------------- --Counts--10 minutes ago10 seconds ago15 minutes ago20 minutes ago30 minutes ago30 seconds ago3D Post-processing3D lighting3Depict file (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS File (*.pos)|*.pos|XML State File (*.xml)|*.xml|All Files (*)|*45 minutes ago5 minutes agoAbortedAborting...Across dirActive Ion Active Rng AlgorithmAligned boxAll IonsAll Ions (conc)All RangesAn auto-save state was found, would you like to restore it?.Anaglyph ModeAnalyseAnalysisPackageAnd so on...AngleAngle (deg)Animation progressAnnotationAre you sure you wish to exit 3Depict?ArrowArrow+TextAuto Min/maxAuto RefreshAutosaveAutosave complete.Available DataAvailable FiltersAvailable stashesAxisBarsBaseline SeparationBin widthBin width xBin width yBin width zBlueBound boxBoundbox CentreBounding BoxBox ColourBulk Link (Envelope) DistBulk RangesBy CountBy Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*.svg|PNG File (*.png)|*.png|All Files (*)|*CacheCamCameraCamera NameCamera SpeedCamera data informationCamera zooming rate.Cameras section missing "active" node.Change background colourChemistry Dist.Chemistry DistributionChoose resolutionClassify Knn MaxCleanup inputClippingCluster AnalysisClustering ParamsColdCollateColourColour Colour MapColour based 3D effect enable/disable - requires appropriate colour filter 3D glasses.CommandComp. Prof.Compiled with wx Version: Compos. ProfilesCompositionsCompositions (fractional, core only)Compositions (fractional, core+bulk)Config file present, but is not valid (root node test)Confirmation requestCons.Control PaneConvex Volume (len^3): Convex hullCopy raw data to clipboardCopyingCopying referenced filesCoreCore Classify DistCore Link + ErodeCore Link DistCore RangesCorner offsetCountCountsCreated new filter tree stashCropCyclicCylinderDataDefault colour DenominatorDensity (\frac{\#}{len^3})Detailed view of selected rangeDetailsDigit formatDist MaxDistanceDownsamplingDrawDraw SizeDrop unrangedDuplicate effect foundE&xitEmpty stash name for stash Enable Anaglyphic StereoEnable CroppingEnable cropping post-process effectEnable/Disable "Alpha blending" (transparency) in rendering system. Blending is used to smooth objects (avoids artefacts known as "jaggies") and to make transparent surfaces. Disabling will provide faster rendering but look more blockyEnable/Disable automatic updates of data when filter change takes effectEnable/Disable caching of intermediate results during filter updates. Disabling caching will use less system RAM, though changes to any filter property will cause the entire filter tree to be recomputed, greatly slowing computationsEnable/Disable lighting calculations in rendering, for objects that request this. Lighting provides important depth cues for objects comprised of 3D surfaces. Disabling may allow faster rendering in complex scenesEnable/Disable weak randomisation (Galois linear feedback shift register). Strong randomisation uses a much slower random selection method, but provides better protection against inadvertent correlations, and is recommended for final analysesEnable/disable visual effects on final 3D outputEnabledEndEnd rng Erode DistErr. EstimatorError - Found NaN in pos fileError copying fileError interpreting field in fileError interpreting range file header, expecting ion count and range count, respectively.Error loading fileError loading file: Error loading state file. See console for more info.Error opening fileError opening file, check name and permissions.Error opening pos fileError processing node: Error re-opening file, after first scanError reading colour data in the file, expecting 3 decimal values, space separated.Error reading effect : Error reading file, unexpected format, are you sure it is a proper range file?Error reading from pos file (after open)Error reading the long name for ion.Error reading the short name for ion.Error saving file. Check output dir is writable.Error whilst reading file contentsExit ProgramExportExport AnimationExport Current 3D ViewExport Current PlotExport Ion DataExport Pos DataExport RangeExport Range DataExport RangesExport analysis packageExport:Ext. ProgramExtern. Prog.ExtremaFailed reading range file.Failed to allocate parserFast and weak randomisation.Field of View (deg)FileFile : File already exists, overwrite?File readback check failedFile typeFiles have been referred to using relative paths. Keep relative paths?Filesize during readback appears to be zero.Filter CountFilter StashesFilter cachingFilter settingsFilter view for current stashFilteringFixed Bin NumFixed Tick NumFixed ticksFixed widthFlip ChannelsFolder creation failedFont SizeFor stash Found :FractionFrame countFreq. ProfileFrequencies (core+bulk)GeneralGlasses colour modeGreen-MagentaGreyHotIf you want this, please contact the author, or just use the source to add this in yourself.Image progressIncorrect number of fields in fileIndexInformation about this programInvert ClipIonIon Ion ColourIon InfoIon NameIon SamplerIon TransformIon infoIon&s... Ctrl+NIon. TransformIonID IonsIsosurfaceIsovalueJetLets the program check the internet to see if updates to the program version are available, then notifies you about updates now and again.Level of separation between left and right images, which sets 3D depth to visual distortion tradeoffLimitation on the screenshot dimension; please ensure that both width and height exceed the initial values, or that they are smaller than the initial values. If this bothers, please submit a bug.Line thicknessLinesList of available filtersList of rangefiles in filter treeLoad Limit (MB)Load data source (file->open) before choosing a new filterLoad errorLocal DensityLockLock Axis Mag.Log ScaleLogarithmicManual not found locally. Launching web browserMass CentreMaxMax SizeMax. Ram usage (%)Max. Sep + ErodeMemory allocation failure on POS loadMerge other fileMerged file.MinMin SizeMonitorMove RateMoving - Hold control to copyMoving - Hold ⌘ (command) to copyMoving avg.NN Freq.NN MaxNew camera name...Next fullscreen mode: with toolbarsNo data to saveNo filter stashes to edit.No filters means no data to exportNo numerical data foundNo plot available. Please create a plot before exporting.No plots selected.No range data. Can't cluster.No ranges selected for cluster "bulk". Cannot continue with clustering.No ranges selected for cluster "core". Cannot continue with clustering.NoneNone (Raw count)NormaliseNormalise byNot availableNum BinsNum RangesNum TicksNum XNum YNum ZNum bins xNum bins yNum bins zNumber Density (\#/Vol^3)Number of framesNumber of points : NumeratorOnline Check: Online UpdatesOnline access for non win32/apple platforms is intentionally disabled, Open contact pageOpen state fileOpenGL FailedOpening contact page in external web browserOriginOrigin OrthogonalOut FractionOutput CountOverwrite?P&lot...PNG File (*.png)|*.png|All Files (*)|*POS DataPac&kage... Ctrl+KPackage directory namePackage folder already exists, won't overwrite.Package folder creation failed check writing to this location is possible.Package namePanel DisplayParamPer SpeciesPerspectivePlanePlane NormalPlotPlot ListPlot TypePlot colour Plotting functions returned an error: Point CloudPointsPos DataPos file emptyPos file size appears to have non-integer number of entriesPos load aborted by interrupt.Position APosition BPostPostprocessPreferencesPress enter to restore cameraPress enter to restore stashPress enter to store new cameraPress enter to store new stashPrimitiveProgram limitationProgram text outputProjectionPropertyPseudo-RandomQuick and dirty analysis for point data.Radial DistanceRadial DistributionRadiusRan&ges... Ctrl+GRangeRange FileRange SourcesRange StartRange endRange file appears to be empty, check file is a proper range file and is not empty.Range file appears to be inconsistent (eg, overlapping ranges)Ranged Density (pts/vol):RangesRangingRatio (Num/Denom)RawRaw Data PanelReadable files (*.xml, *.pos, *.txt,*.csv, *.ato)RectilinearRectilinear Bounds : Red-BlueRed-CyanRed-GreenReflexiveRefresh Aborted.Remember lastRemove the selected cameraRendering sequence...Rendering tiles...RepresentationResetReset AllRestored camera: RotateRulerSave &As... Ctrl+Shift+SSave Data...Save Image...Save current state to new fileSave errorSave plot...Save pos...Save raw data to fileSave state to fileSave state...Saved 3D View :Saved ions: Saved package: Saved plot: Saved state: Saving Image Scale Fact.Security warningSelect Data or State File...Select RNG File...Select an item from the filter tree before choosing a new filterSelected DataSelectionSettings for selected filter in current stashShow AngleShow BarShow PrimitiveShow SelectedShow all panelsShow all panels when starting programShow help files and documentationShow markerShow panels visible at last shutdown when starting programShow selected panels when starting programSize CroppingSize DistributionSmooth && translucent objectsSourceSource FilterSpacing XSpacing YSpacing ZSpat. AnalysisSpatial analysis aborted by userSpecifySpectral ColourSpectrumSphereSphere sizeSpot sizeStandard dev.StartStart rng StartupStash NameStashed FiltersStashed TreesState was created by a newer version of this program.. StemStepsStereoStored camera: SurfaceTargetTextText DataText File (*.txt)|*.txt|All Files (*)|*Text sizeThis file is a "state" file for the 3Depict program, and stores information about a particular analysis session. This file should be a valid "XML" fileThis state file contains filters that can be unsafe to run Do you wish to remove these before continuing?.This will be a problem in the case where two or more clusters can equally lay claim to a "bulk" ion. Tick SpacingTip: You can shift-click to force full refresh, if requiredTip: You can use ctrl to mergeTip: You can use ⌘ (command) to mergeToggle Legend displayToggle World Axis displayToggle left control paneToggle plot listToggle raw data pane (bottom)Too many ranges appeared to have range entries with no usable data (eg, all blank)ToolsTotal (incl. unranged) Total Density (pts/vol):Total Ranged Transform ParamsTranslateTranslate ValueTranslationTransparencyUnable to allocate memory to store dataUnable to allocate requested memory. Try a lower resolution, or save as vector (SVG).Unable to compute volumeUnable to create stash, selection invalidUnable to determine filter type in defaults listing.Unable to find or interpret "showaxis" nodeUnable to find property "value" for "cameras->active" node.Unable to find the "backcolour" node.Unable to find the "writer" nodeUnable to initialise the openGL (3D) panel. Program cannot start. Please check your video drivers.Unable to interpret "backColour" node's "b" value.Unable to interpret "backColour" node's "g" value.Unable to interpret "backColour" node's "r" value.Unable to interpret property "value" for "cameras->active" node.Unable to interpret recent file entryUnable to interpret the camera type for camera : Unable to load autosave file..Unable to locate "filtertree" node.Unable to locate stash name for stash Unable to read file contents after openUnable to read range start and end valuesUnable to read range table entryUnable to saveUnable to save. Check output destination can be written to.Unknown file extension. Please use "svg" or "png"UnrangedUnrecognised effect :Up Dir.Up dirUpdate Notice: New version Updated.Use camera coordinatesUse shift/ctrl-space or double tap to alter reset axisValueValue2View sizeVisibleVolumeVolume (Density)Volume (len^3): VoxelVoxel Limits (min,max): (VoxelisationWARNING: Skipping node Waiting for refresh to abort. Exiting could lead to the program backgrounding. Exit anyway? Warning,Warning, Warning, unparseable version number in state file. File reading will continue, but may failWarning: Your configuration file appears to be invalid: Warning:One or more bounds of the loaded data approaches the limits of numerical stability for the internal data type(magnitude too large). Consider rescaling data before loadingWork DirXYYou can do this; thats OK, but the output is no longer independent of the computational process;Zoom Rate\% Done\% Done (Esc aborts)a day agoa decade agoa few days agoa few decades agoa few hours agoa few minutes agoa few months agoa few seconds agoa few weeks agoa few years agoa minute agoa month agoa second agoa week agoa year agoan hour agocountdXdYdZerrorfile reading will continue, but may fail.in the future?moments agoregardless of the settings you use here. Use your package manager to keep up-to-datex-yx-zy-xy-zz-xz-y§Cons.Project-Id-Version: 3Depict Report-Msgid-Bugs-To: POT-Creation-Date: 2016-05-31 11:15+1000 PO-Revision-Date: 2012-07-09 08:21+0000 Last-Translator: epix1234 Language-Team: German (Germany) (http://www.transifex.com/projects/p/3depict/language/de_DE/) Language: de_DE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1) Config Load: --------------------------- Parameterauswahl Notiz ------------- If your inter-cluster distance is sufficiently large (larger than your bulk linking distance), then you can get away with this.Theoretisch ist es möglich die Cluster zu 'verbinden', dies wurde jedoch aus Gescheindigkeitsgründen nicht implementiert. RDF wurde nicht erkannt.kann nicht verwenden. Cluster existiert nicht existiert nicht. Überspringe online gefunden.ist up-to-date. von points were un-analysable. These have been dropped Punkte konnten keine Nachbapunkte die den Suchradius überschritten finden und beendeten vorzeitig."backcolour" node fehlt "b" Wert."backcolour" node fehlt "g" Wert."backcolour" node fehlt "r" Wert."backcolour"s rgb Wert muss im Bereich [0,1] liegenÜber 3Depict...&Achsen Ctrl+Shift+I&Hintergrundfarbe... Ctrl+B&Kontakt...&Kontrollfenster Alt+C&Kontrollfenster F2&Bearbeiten&Exportieren&Datei&Vollbildmodus Ctrl+Shift+F&Vollbildmodus F11&Hilfe&Hilfe... Ctrl+H&Bild... Ctrl+I&Legende Ctrl+L&Zusammenführen... Ctrl+Shift+O&Öffnen... Ctrl+O&Plot Liste Alt+P&Plot Liste F4&Plot... Ctrl+P&Voreinstellungen&Beenden Ctrl+Q&Rohdatenfenster Alt+R&Rohdatenfenster F3&Letzte&Wiederholen Ctrl+Y&Speichern Ctrl+S&Zurück Ctrl+Z&Ansicht(schnell)(langsam)---------------------------------------------------------------------- - Anzahl -vor 10 Minutenvor 10 Sekundenvor 15 Minutenvor 20 Minutenvor 30 Minutenvor 30 Sekunden3D Nachbearbeitung3D Beleuchtung3Depictdateien (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS Datei (*.pos)|*.pos|XML Status Datei (*.xml)|*.xml|All Files (*)|*vor 45 Minutenvor 5 MinutenAbgebrochenAbbrechen...Across dirActives Ion Activer Rng AlgorithmusAusgerichtete BoxAlle IonenAlle Ionen (Konz)Alle RangeEin auto-save Status wurde gefunden. Wollen Sie ihn wiederherstellen?AnaglyphmodusAnalyseAnalysepaketUnd so weiter...WinkelWinkel (deg)Animation-FortschrittKommentarSind Sie sicher, dass Sie 3Depict beenden wollen?PfeilPfeil+TextAuto Min/maxAutom. aktualisierenAutomatisch speichernAutosave beendet.Verfügbare DatenVerfügbare FilterVerfügbare StashAchseBlockBasislinienabstandBin-BreiteBin-Breite xBin-Breite yBin-Breite ZBlauBegrenzungs-BoxBoundbox ZentrumBegrenzungs-BoxBox FarbeBulk Link (Envelope) DistBulk RangesNach AnzahlDateierweiterung (svg,png)|*.svg;*.png|Skalierbare Vektorgrafik (*.svg)|*.svg|PNG Datei (*.png)|*.png|Alle Dateien (*)|*ZwischenspeicherCamKameraKameranameKamerageschwindigkeitKamerainformationZoomgeschwindigkeit der KameraCameras section fehlt "active" node.Hintergrundfarbe ändernChemistry Dist.Chemische VerteilungAuflösung auswählenClassify Knn MaxBereinige EingabeZuschneidenClusteranalyseCluster ParameterKaltAbgleichenFarbeFarbeFarbtabelleFarbbasierte 3D-Effekte ein/ausschalten - erfordert geeignete 3D-BrillenBefehlKonz. Prof.Kompiliert mit wx Version: Konz.ProfilZusammensetzungenZusammensetzungen (fractional, core only)Zusammensetzungen (fractional, core+bulk)Konfigurationsdatei vorhanden, aber nicht gültig (root node test)BestätigungsabfrageKons.KontrollfensterKonvexes Volumen (Läng.^3)Konvexe HülleKopiere Rohdaten in die ZwischenablagekopiereCopying referenced filesKernCore Classify DistCore Link + ErodeCore Link DistCore RangesCorner offsetAnzahlAnzahlNeuer Filterstash wurde erzeugtZuschneidenCyclicZylinderDatenBevorzugte Farbe NennerDichte (\frac{\#}{len^3})Detailierte Ansicht des ausgewählten RangeDetailsZahlenformatAbst. Max.AbstandDatenreduktionZeichnenDraw SizeNicht gerangete ausschaltenDoppelter Effekt gefundenE&xitLeerer Stashname für StashAnaglyphic Stereo aktivierenZuschneiden aktivierenCropping post-Prozess Effect einschaltenEin/Ausschalten des "Alpha blending" (Transparenz) im Rendersystem. Dieses wird verwendet um ebene Objekte (vermeidet Artefakte bekannt als jaggies) und transparente Oberflächen zu generieren. Ausschalten erlaubt schnelleres Renden führt jedoch zu blockigerer Darstellung.Ein/Ausschalten vom automatischen Aktualisieren der Daten wenn Änderungen am Filter wirksam werdenEin/Ausschalten des Zwischenspeicherns von Ergebnissen während Filteraktualisierungen. Dies verbraucht weniger RAM, führt jedoch dazu, dass bei Änderungen der Filterparameter der ganze Filterbaum neu berechnet wird. Dies erhöht den Rechenaufwand deutlich.Ein/Ausschalten der Beleuchtungseffekte beim Rendern von Objekten die dies anfordern. Beleuchtung bietet wichtige 'depth cues' für mit 3D Oberflächen umrandete Objekte. Deaktivieren erlaubt u.U. schnelleres Rendern bei komplizierten Szenen.Ein/Ausschalten der schwachen Randomisierung (Galois linear feedback shift register). Starke Randomisierung verwendet einen viel langsamere Auswahlmethode bietet dafür aber einen besseren Schutz gegen unbeabsichtigte Korrelationen und wird für die endgültige Analyse empfohlen.Ein/Ausschalten von visuellen Effekten in der finalen 3D Ausgabe.AktiviertEndeEnd rng Erode DistFehlerschätzerFehler - Fand NaN in pos-DateiFehler beim Kopieren der DateiFehler beim Interpretieren eine Feldes in der DateiFehler beim Rangedatei interpretieren, erwarte Ionenanzahl bzw. Rangeanzahl.Fehler beim Laden der DateiFehler beim Laden der Datei: Fehler beim Laden der Statusdatei. Konsole für mehr Informationen.Fehler beim Öffnen der DateiFehler beim Öffnen der Datei, überprüfe Namen und Berechtigungen.Fehler beim Öffnen der pos-DateiFehler beim Verarbeiten von Node: Fehler beim nochmaligen Öffnen der Datei nach dem ersten ScanFehler beim Lesen der Farbinformationen in der Datei. Erwarte 3, durch Leerzeichen getrennte, Dezimalwerte.Fehler beim Lesen:Fehler beim Lesen der Datei: Unerwartetes Format, sind Sie sicher, dass dies eine korrekte Rangedatei ist?Fehler beim Lesen aus pos-Datei (nach dem öffnen)Fehler beim Lesen des langen Namens für Ion.Fehler beim Lesen des kurzen Namens für Ion.Fehler beim Schreiben der Datei. Stellen Sie sicher, dass das Zielverzeichnis nicht schreibgeschüzt ist.Fehler beim Lesen des DateiinhaltesProgramm beendenExportierenAnimation exportierenAktuelle 3D Ansicht exportierenAktuellen Plot exportierenIonendaten exportierenPOS Daten exportierenRange exportierenRangedaten exportierenRange exportierenAnalysepaket exportierenExportieren:Ext. ProgrammExt. Progr.ExtremaFehler beim Lesen der Rangedatei.Kann Parser nicht zuordnenSchnelle aber schwache RandomisierungBildausschnittDateiDatei : Datei existiert bereits. Überschreiben?File readback check failedDateitypAuf Dateien wurde mit relativen Pfaden verwiesen. Relative Pfade beibehalten?Filesize during readback appears to be zero.Filter CountFilter StashesFilter zwischenspeichernFiltereinstellungenFilteransicht für den aktuellen StashFilternFix. Bin-Anz.Fixed Tick NumFixe MarkerFixe BreiteKanäle tauschenAnlegen des Ordners ist fehlgeschlagenSchriftgrößeFür Stash Gefunden:AnteilBildanzahlHäufigkeitsprofilHäufigkeiten (core+bulk)AllgemeinBrillenfarbmodusGrün-MagentaGrauHeissSollten Sie dies wollen, kontaktieren Sie den Autor oder verwenden Sie den Sourcecode um es selbst hinzuzufügen.Bild FortschrittDie Datei enthält eine falsche Anzahl von FeldernIndexInformationen zu diesem ProgrammInvertiere ClipIonIon IonenfarbeIon InfoIonennameIon SamplerIonentransform.IoneninfoIon&en... Ctrl+NIon. TransformierenIonID IonenIsosurfaceIsovalueJetLässt das Programm via Internet überprüfen ob Updates für diese Programmversion verfügbar sind. Danach informiert es über die neuen Updates.Level of separation between left and right images, which sets 3D depth to visual distortion tradeoffBeschränkung der Screenshot Dimensionen; stellen Sie bitte sicher, dass Breite und Höhe die ursprünglichen Werte überschreiten, oder dass diese kleiner als die ursprünglichen Werte sind. Sollte Sie dies stören, melden Sie bitte einen Bug.LinienbreiteLinienListe der verfügbaren FilterListe der Rangedateien im FilterbaumLadelimit (MB)Lade Datenquelle (Datei->öffnen) vor dem Auswählen eines neuen FiltersFehler beim LadenLokale DichteSperrenAchsen Vergr. sperrenLog. SkalaLogarithmischAnleitung konnte lokal nicht gefunden werden. Starte WebbrowserMassen-ZentrumMaxMax GrößeMax. RAM-Nutzung (%)Max. Sep + ErodeSpeicherzuweisungsfeher beim Laden der pos-DateiMerge other fileDatei zusammengeführt.MinMin GrößeMonitorBewegungsgeschwindigkeitVerschieben - Halte Strg zum kopierenVerschieben - Halte ⌘ (command) um zu kopierenGleit.Durchschn.NN Freq.NN MaxNeuer Kameraname...Nächster Vollbildmodus: ohne WerkzeugleistenKeine Daten zum SichernKeine Filterstashes zum Bearbeiten.Keine Filter bedeutet keine Daten zum ExportierenKeine numerischen Daten gefundenKein Plot vefügbar. Plot muss vor dem Exportieren erzeugt werden.Kein Plot ausgewählt.Keine Rangedaten. Clusteranalyse nicht möglich.Kein Range für "bulk" ausgewählt. Kann mit Clusteranalyse nicht weitermachen.Kein Range für cluster "core" ausgewählt. Kann mit Clusteranalyse nicht weitermachen.KeinerKeine (Roh count)NormalisierenNormalisieren mitNicht verfügbarBin-Anz.Num RangesAnzahl MarkerNum XNum YNum ZAnzahl Bins xAnzahl Bins yAnzahl Bins zNumber Density (\#/Vol^3)BilderanzahlAnzahl der Punkte: ZählerÜberprüfe online:Online UpdatesOnlinezugang für nicht Win32/apple systeme wurde absichtlich deaktiviert.Kontaktseite öffnenStatusdatei öffnenOpenGL fehlgeschlagenÖffne Kontaktseite in externem BrowserUrsprungUrsprung OrthogonalAusgabe AnteilAusgabe AnzahlÜberschreiben?P&lot...PNG Datei (*.png)|*.png|Alle Dateien (*)|*Pos-DatenPa&ket... Ctrl+KPaketverzeichnisPaketverzeichnis existiert bereits. Werde es nicht überschreiben.Anlegen des Paketverzeichnisses fehlgeschlagen Überprüfen Sie ob der angegenbene Ort schreibgeschützt ist.PaketnamePanel DisplayParam.Nach SpeziesPerspektivischEbenePlane NormalPlotPlotlistePlot TypePlotfarbe Plot-Funktion meldete einen Fehler: PunktwolkePunktePOS-DatenPos-Datei ist leerPos-Dateigröße scheint eine nicht ganzzahlige Anzahl an Einträgen zu habenPos laden durch Interrupt abgebrochen.Position APosition BPostPostprozessVoreinstellungenEingabe drücken um Kamera wiederherzustellenEingabe drücken um Stash wiederherzustellenEingabe drücken um neue Kamera zu speichernEingabe drücken um neuen Filterstash zu speichernPrimitivProgrammeinschränkungProgramm TextausgabeProjektionEigenschaftPseudo-Random"Quick and dirty" Analyse von Punktdaten.Radialer AbstandRadial DistributionRadiusRan&ges... Ctrl+GRangeRangedateiRange SourcesRange AnfangRange EndeRangedatei scheint leer zu sein. Prüfe ob die Datei wirklich ein Rangedatei und nicht leer ist.Rangedatei schein inkonsistent zu sein (z.B. überlappende Ranges)Ranged Dichte (pts / vol):RangesRangingVerhältnis (Zähler/Nenner)RohRohdatenfensterLesbare Dateien (*.xml, *.pos, *.txt,*.csv,*.ato)GeradlinigGeradlinige Grenzen:Rot-BlauRot-ZyanRot-GrünReflexiveAktualisieren abgebrochenZuletzt verwendetAusgewählte Kamera entfernenRenderreihenfolge...Rendering tiles...RepresentationZurücksetzenAlle zurücksetzenWiederhergestellte Kamera: RotierenLinealSpeichern &als... Ctrl+Shift+SDatei speichern...Speichere Bild...Aktuellen Status als neue Datei speichernFehler speichernPlot speichern...pos speichern...Speichere Rohdaten in DateiStatus in Datei speichernSpeichere Status...Gespeicherte 3D AnsichtGespeicherte Ionen:Gespeicherte Pakete: Gespeicherter Plot:Gespeicherter Status: Speichere Bild SkalierungsfaktorSicherheitswarnungDaten oder Statusdatei auswählen...RNG Datei auswählen...Aktivieren Sie zuerst ein Punkt aus dem Filterverlauf bevor Sie einen neuen Filter auswählenDaten auswählenAuswahlEinstellungen für den ausgewählten StashZeige WinkelZeige BalkenZeige PrimitivZeige AuswahlZeige alle FensterZeige alle Fenster beim ProgrammstartHilfedateien und Dokumentation anzeigenZeige MarkierungBeim Programmstart zuletzt eingeschaltete Fenster anzeigen.Zeige ausgewählte Fenster beim ProgrammstartGrößeneinschrankungenGrößenverteilungGlatte && durchsichtige ObjekteQuelleSource FilterX-AbstandY-AbstandZ-AbstandRäumliche AnalyseSpatial analysis aborted by userAngebenSpectral FarbeSpektrumKugelKugelgrößeSpot sizeStandardabweichungAnfangStart rng StartupStash NameZwischengelagerte FilterStashed TreesStatus wurde von einer neueren Version dieses Programmes erstellt.. StemStufenStereoGespeicherte Kamera: OberflächeZielTextText-DatenText Datei (*.txt)|*.txt|Alle Dateien (*)|*TextgrößeDiese Datei ist ein "Status" Datei für das Programm 3Depict. Sie speichert Informationen über die jeweiligen Analysesitzung. Dies sollte ein gültige "XML" Datei sein.Diese Statusdatei enthält Filter deren Anwendung möglicherweise unsicher ist. Wollen Sie diese entfernen.Dies ist ein Problem wenn zwei oder mehrere Cluster auf dasselbe "bulk" Ion Anspruch erheben. MarkerabstandTipp: Verwende shift-click um komplettes Aktualisieren zu erzwingenTip: Sie können strg zum Zusammen führen verwendenTip: Sie können ⌘ (command) zum Zusammenführen verwendenLegende anzeigen ein/ausHauptachsen ein/aus schaltenLinkes Kontrollfenster ein/aus schaltenPlotliste ein/aus schaltenRohdatenfenster (unten)Zu viele Ranges scheinen ungültige Einträge zu haben (z.B. alle leer)Werkz.Total (inkl. nicht geranged)Gesamtdichte (pts / vol):Gesamt ranged TransformationsparameterTranslateTranslate WertTranslationTransparenzKann Speicher nicht zuordnenKann den notwendigen Speicher nicht zuordnen. Versuche eine geringer Auflösung oder speichere als Vektografik (svg).Kann Volumen nicht berechnenStash kann nicht erstellt werden, Auswahl ungültigKann den Filtertyp im Defaultslisting nicht bestimmen.Kann "showaxis" node nicht interpretierenKann "Eigenschaftswert" für "Kamera->aktiv" Node nicht finden.Unable to find the "backcolour" node.Kann "writer" node nicht findenKann das OpenGL (3D)-Panel nicht initialisieren. Das Programm kann nicht gestartet werden. Bitte überprüfen Sie Ihren Video-Treiber.Kann "backColour" node's "b" Wert nicht interpretieren.Kann "backColour" node's "g" Wert nicht interpretieren.Kann "backColour" node's "r" Wert nicht interpretieren.Kann "Eigenschaftswert" für "Kamera->aktiv" Node nicht interpretieren.Kann den letzten Dateieintrag nicht interpretierenKann den Kameratype nicht interpretieren für :Kann Autosavedatei nicht laden..Kann "filtertree" node nicht finden.Kann den Stashnamen für Stash nicht findenKann den Dateiinhalt nach dem Öffnen nich lesenKann Anfangs und Endwert des Range nicht lesenKann Rangetabelleneintrag nich lesenSpeichern nicht möglichSpeichern nicht möglich. Bitte überprüfen Sie ob der Ausgabepfad schreibgeschützt ist.Unbekannte Dateierweiterung. Bitte verwenden Sie "svg" oder "png"Nicht GerangedNichterkannter Effekt :Up Dir.Up dirUpdatenotiz: Neue Version Updated.Verwende KamerakoordinatenVerwenden Sie Shift / Strng-Leertaste oder doppeltippen, um Achsen zurückzusetzen oder zu verändernWertWert2AnzeigegrößeSichtbarVolumenVolumen (Dichte)Volumen (Läng.^3)VoxelVoxel Grenzen (min,max): (VoxelisationWARNUNG: Skipping node Waiting for refresh to abort. Exiting could lead to the program backgrounding. Exit anyway? Warnung,Warnung, Warnung: Nicht lesbare Versionsnummer in Statusdatei. Datei wird weiter eingelesen kann aber unter Umständen fehlschlagen.Warnung: Ihre Konfigurationsdatei scheint ungültig zu sein. Warnung: Eine oder mehrere Grenzen der geladenen Daten erreichen das Limit der numerischen Stabilität des internen Datentyps (Größenordnung zu groß). Erwägen Sie die Daten vor dem Laden zu skalieren. ArbeitsverzeichnisXYSie könne das machen, das ist in Ordnung, aber die Ausgabe ist nicht länger unabhängig vom BerechnungsprozessZoomgeschwindigkeit\% fertig\% fertig (Esc abbrechen)gesternvor zehn Jahrenvor einigen Tagenvor einigen Dekadenvor einigen Stundenvor einigen Minutenvor einigen Monatenvor einigen Sekundenvor einigen Wochenvor einigen Jahrenvor einer Minutevor einem Monatvor einer Sekundevor einer Wochevor einem Jahrvor einer StundeAnzahldXdYdZFehlerDatei wird weiter eingelesen kann aber unter Umständen fehlschlagen.in Zukunft?kürzlichNutzen Sie Ihren Paketmanager um up-to-date zu sein unabhängig von den Einstellungen die Sie hier verwendenx-yx-zy-xy-zz-xz-y§Kons.3Depict-0.0.19/config.guess0000755000175000017500000013036112640746376015023 0ustar pcuserpcuser#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: 3Depict-0.0.19/src/0000755000175000017500000000000012723200266013247 5ustar pcuserpcuser3Depict-0.0.19/src/gui/0000755000175000017500000000000012723200266014033 5ustar pcuserpcuser3Depict-0.0.19/src/gui/mainFrame.h0000644000175000017500000004515512716456550016130 0ustar pcuserpcuser/* * 3Depict.h - main program header * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #if !(wxCHECK_VERSION(3,1,0)) #if ( defined(__WIN32__) || defined(__WIN64__) ) #error "Your wx version is too low for windows. You need wx 3.1 or greater, due to wx bug 16222." #else #define FIX_WXPROPGRID_16222 #endif #endif // begin wxGlade: ::dependencies #include #include #include #include #include #include #include #include #include #include #include #include // end wxGlade //Local stuff #include "wx/wxcommon.h" #include "wx/wxcomponents.h" #include "glPane.h" #include "mathglPane.h" #include "cropPanel.h" // cropping tools #include "backend/viscontrol.h" #include "backend/configFile.h" #ifndef THREEDEPICT_H #define THREEDEPICT_H class FileDropTarget; class RefreshThread; enum { MESSAGE_ERROR=1, MESSAGE_INFO, MESSAGE_HINT, //lowest priority message in the queue. Only one HINT can be in queue at a time MESSAGE_NONE // pseudo-message to wipe all messages }; //This is used to create and run a worker thread that will perform a refresh calculation class RefreshThread: public wxThread { private: RefreshController *refreshControl; wxWindow *targetWindow; public: RefreshThread(wxWindow *target,RefreshController *rc); ~RefreshThread(); //!Used internally by wxwidgets to launch thread void *Entry(); void abort() {ASSERT(false);} }; class MainWindowFrame: public wxFrame { public: // begin wxGlade: MainWindowFrame::ids // end wxGlade MainWindowFrame(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_FRAME_STYLE); virtual ~MainWindowFrame(); //Drop the following files onto the given window XY coordinates. void OnDropFiles(const wxArrayString &files, int x, int y); bool isCurrentlyUpdatingScene() const { return currentlyUpdatingScene;}; void linkCropWidgets(); wxSize getNiceWindowSize() const ; //Obtain the filterId that is associated with the given tree node. // returns false if it is not able to do so (eg invalid TreeItemId) bool getTreeFilterId(const wxTreeItemId &tId, size_t &filterId) const; private: // begin wxGlade: MainWindowFrame::methods void set_properties(); void do_layout(); // end wxGlade //Force a re-layout of the filter property grid void do_filtergrid_prop_layout(); //Force a re-layout of the camera property grid void do_cameragrid_prop_layout(); bool refreshThreadActive() { return refreshThread && refreshThread->IsRunning();}; //!Queue up a status message for display void showStatusMessage(const char *message, unsigned int messageType=MESSAGE_ERROR); //!Queue up a status message for display void statusMessage(const char *message, unsigned int messageType=MESSAGE_ERROR); //!Update the progress information in the status bar void updateProgressStatus(); //!Perform an update to the 3D Scene. Returns false if refresh failed bool doSceneUpdate(bool ensureResultVisible=false); //!Complete the scene update. Returns false if failed void finishSceneUpdate(unsigned int errCode); //!Wrapper for viscontrol's update function, as we need to // prevent wx from firing events during tree update void updateWxTreeCtrl( wxTreeCtrl *t, const Filter *f=0); //!Update the post-processing effects in the 3D scene. void updatePostEffects(); //!Load a file into the panel given the full path to the file bool loadFile(const wxString &dataFile,bool merge=false,bool noUpdate=false); //!Load any errors that were detected in the last refresh into the filter tree void setFilterTreeAnalysisImages(); //!Update the effects UI from some effects vector void updateFxUI(const std::vector &fx); void setLockUI(bool amlocking,unsigned int lockMode); //Did the opengl panel initialise correctly? bool glPanelOK; //!Scene - user interaction interface "visualisation control" VisController visControl; //!Refresh control thread RefreshThread *refreshThread; //!Refresh control object RefreshController *refreshControl; //!Program on-disk configuration class ConfigFile configFile; //!Blocking bool to prevent functions from responding to programatically generated wx events bool programmaticEvent; //!A flag stating if the first update needs a refresh after GL window OK bool requireFirstUpdate; //!Have we set the combo cam/stash text in this session? bool haveSetComboCamText,haveSetComboStashText; //!Are we in the middle of updating the scene? bool currentlyUpdatingScene; //!Have we aborted an update bool haveAborted; //!Should the gui ensure that the refresh result is visible at the next update? bool ensureResultVisible; //!source item when dragging a filter in the tree control wxTreeItemId *filterTreeDragSource; //!Drag and drop functionality FileDropTarget *dropTarget; //!Current fullscreen status unsigned int fullscreenState; //!Did the main frame's constructor complete OK? bool initedOK; //Pointer to version check thread, occasionally initialised at startup to // check online for new program updates VersionCheckThread *verCheckThread; //Map to convert filter drop down choices to IDs std::map filterMap; //TODO: Refactor - remove me. // True if there are pending updates for the mathgl window bool plotUpdates; //List of pending messages to show in status bar // first int is priority (eg MESSAGE_ERROR), string is message std::list > statusQueue; protected: wxTimer *statusTimer; //One-shot timer that is used to clear the status bar wxTimer *updateTimer; //Periodically calls itself to check for updates from user interaction wxTimer *progressTimer; //Periodically calls itself to refresh progress status wxTimer *autoSaveTimer; //Periodically calls itself to create an autosave state file wxMenuItem *checkMenuControlPane; wxMenuItem *checkMenuRawDataPane; wxMenuItem *checkMenuSpectraList; wxMenuItem *menuViewFullscreen; wxMenuItem *checkViewLegend; wxMenuItem *checkViewWorldAxis; wxMenuItem *editUndoMenuItem,*editRedoMenuItem; wxMenuItem *editRangeMenuItem; wxMenuItem *fileSave; wxMenu *recentFilesMenu; wxMenu *fileMenu; wxMenu *fileExport; wxFileHistory *recentHistory; ProgressData lastProgressData; // begin wxGlade: MainWindowFrame::attributes wxStaticBox* sizerAlignCam_staticbox; wxMenuBar* MainFrame_Menu; wxStatusBar* MainFrame_statusbar; wxStaticText* lblSettings; wxComboBox* comboStash; wxButton* btnStashManage; wxStaticLine* stashFilterStaticSep; wxStaticText* filteringLabel; wxComboBox* comboFilters; TextTreeCtrl* treeFilters; wxCheckBox* checkAutoUpdate; wxButton* refreshButton; wxButton* btnFilterTreeExpand; wxButton* btnFilterTreeCollapse; wxBitmapButton* btnFilterTreeErrs; wxPanel* filterTreePane; wxStaticText* propGridLabel; wxPropertyGrid* gridFilterPropGroup; #ifdef FIX_WXPROPGRID_16222 wxPropertyGrid *backFilterPropGrid; #endif wxPanel* filterPropertyPane; wxSplitterWindow* filterSplitter; wxPanel* noteData; wxStaticText* labelCameraName; wxComboBox* comboCamera; wxButton* buttonRemoveCam; wxStaticLine* cameraNamePropertySepStaticLine; wxPropertyGrid* gridCameraProperties; #ifdef FIX_WXPROPGRID_16222 wxPropertyGrid* backCameraPropGrid; #endif wxButton* buttonAlignCamXPlus; wxButton* buttonAlignCamYPlus; wxButton* buttonAlignCamZPlus; wxButton* buttonAlignCamXMinus; wxButton* buttonAlignCamYMinus; wxButton* buttonAlignCamZMinus; wxCheckBox* checkAlignCamResize; wxScrolledWindow* noteCamera; wxCheckBox* checkPostProcessing; wxCheckBox* checkFxCrop; wxCheckBox* checkFxCropCameraFrame; wxComboBox* comboFxCropAxisOne; CropPanel* panelFxCropOne; wxComboBox* comboFxCropAxisTwo; CropPanel* panelFxCropTwo; wxStaticText* labelFxCropDx; wxTextCtrl* textFxCropDx; wxStaticText* labelFxCropDy; wxTextCtrl* textFxCropDy; wxStaticText* labelFxCropDz; wxTextCtrl* textFxCropDz; wxPanel* noteFxPanelCrop; wxCheckBox* checkFxEnableStereo; wxStaticText* lblFxStereoMode; wxComboBox* comboFxStereoMode; wxStaticBitmap* bitmapFxStereoGlasses; wxStaticText* labelFxStereoBaseline; wxSlider* sliderFxStereoBaseline; wxCheckBox* checkFxStereoLensFlip; wxPanel* noteFxPanelStereo; wxNotebook* noteEffects; wxPanel* notePost; wxStaticText* labelAppearance; wxCheckBox* checkAlphaBlend; wxCheckBox* checkLighting; wxStaticLine* static_line_1; wxStaticText* labelPerformance; wxCheckBox* checkWeakRandom; wxCheckBox* checkLimitOutput; wxTextCtrl* textLimitOutput; wxCheckBox* checkCaching; wxStaticText* labelMaxRamUsage; wxSpinCtrl* spinCachePercent; wxPanel* noteTools; wxNotebook* notebookControl; wxPanel* panelLeft; wxPanel* panelView; BasicGLPane* panelTop; MathGLPane* panelSpectra; wxStaticText* plotListLabel; wxListBox* plotList; wxPanel* window_2_pane_2; wxSplitterWindow* splitterSpectra; CopyGrid* gridRawData; wxButton* btnRawDataSave; wxButton* btnRawDataClip; wxPanel* noteRaw; wxTextCtrl* textConsoleOut; wxPanel* noteDataViewConsole; wxNotebook* noteDataView; wxPanel* panelBottom; wxSplitterWindow* splitTopBottom; wxPanel* panelRight; wxSplitterWindow* splitLeftRight; // end wxGlade //Set the state for the state menu void setSaveStatus(); //Perform camera realignment void realignCameraButton(unsigned int direction); DECLARE_EVENT_TABLE(); public: void OnFileOpen(wxCommandEvent &event); // wxGlade: void OnFileMerge(wxCommandEvent &event); // wxGlade: void OnFileSave(wxCommandEvent &event); // wxGlade: void OnFileSaveAs(wxCommandEvent &event); // wxGlade: void OnFileExportPlot(wxCommandEvent &event); // wxGlade: void OnFileExportImage(wxCommandEvent &event); // wxGlade: void OnFileExportIons(wxCommandEvent &event); // wxGlade: void OnFileExportRange(wxCommandEvent &event); // wxGlade: void OnViewBackground(wxCommandEvent &event); // wxGlade: void OnFileExit(wxCommandEvent &event); // wxGlade: void OnEditUndo(wxCommandEvent &event); // wxGlade: void OnEditRedo(wxCommandEvent &event); // wxGlade: void OnEditRange(wxCommandEvent &event); // wxGlade: void OnEditPreferences(wxCommandEvent &event); // wxGlade: void OnViewControlPane(wxCommandEvent &event); // wxGlade: void OnViewRawDataPane(wxCommandEvent &event); // wxGlade: void OnHelpHelp(wxCommandEvent &event); // wxGlade: void OnHelpContact(wxCommandEvent &event); // wxGlade: void OnHelpAbout(wxCommandEvent &event); // wxGlade: void OnComboStashText(wxCommandEvent &event); // wxGlade: void OnComboStashEnter(wxCommandEvent &event); // wxGlade: void OnComboStash(wxCommandEvent &event); // wxGlade: void OnButtonStashDialog(wxCommandEvent &event); // wxGlade: void OnTreeEndDrag(wxTreeEvent &event); // wxGlade: void OnTreeKeyDown(wxKeyEvent &event); // wxGlade: void OnTreeDeleteItem(wxTreeEvent &event); // wxGlade: void OnTreeSelectionChange(wxTreeEvent &event); // wxGlade: void OnTreeBeginDrag(wxTreeEvent &event); // wxGlade: void OnTreeSelectionPreChange(wxTreeEvent &event); // wxGlade: void OnBtnExpandTree(wxCommandEvent &event); // wxGlade: void OnBtnCollapseTree(wxCommandEvent &event); // wxGlade: void OnBtnFilterTreeErrs(wxCommandEvent &event); // wxGlade: void OnComboCameraText(wxCommandEvent &event); // wxGlade: void OnGridFilterPropertyChange(wxPropertyGridEvent &event); // wxGlade: void OnGridFilterDClick(wxPropertyGridEvent &event); // wxGlade: void OnComboCameraEnter(wxCommandEvent &event); // wxGlade: void OnComboCamera(wxCommandEvent &event); // wxGlade: void OnButtonRemoveCam(wxCommandEvent &event); // wxGlade: void OnButtonAlignCameraXPlus(wxCommandEvent &event); // wxGlade: void OnButtonAlignCameraYPlus(wxCommandEvent &event); // wxGlade: void OnButtonAlignCameraZPlus(wxCommandEvent &event); // wxGlade: void OnButtonAlignCameraXMinus(wxCommandEvent &event); // wxGlade: void OnButtonAlignCameraYMinus(wxCommandEvent &event); // wxGlade: void OnButtonAlignCameraZMinus(wxCommandEvent &event); // wxGlade: void OnCheckPostProcess(wxCommandEvent &event); // wxGlade: void OnFxCropCheck(wxCommandEvent &event); // wxGlade: void OnFxCropCamFrameCheck(wxCommandEvent &event); // wxGlade: void OnFxCropAxisOne(wxCommandEvent &event); // wxGlade: void OnFxCropAxisTwo(wxCommandEvent &event); // wxGlade: void OnFxStereoEnable(wxCommandEvent &event); // wxGlade: void OnFxStereoCombo(wxCommandEvent &event); // wxGlade: void OnFxStereoBaseline(wxScrollEvent &event); // wxGlade: void OnFxStereoLensFlip(wxCommandEvent &event); // wxGlade: void OnCheckAlpha(wxCommandEvent &event); // wxGlade: void OnCheckLighting(wxCommandEvent &event); // wxGlade: void OnCheckWeakRandom(wxCommandEvent &event); // wxGlade: void OnSpectraListbox(wxCommandEvent &event); // wxGlade: void OnCheckLimitOutput(wxCommandEvent &event); // wxGlade: void OnTextLimitOutput(wxCommandEvent &event); // wxGlade: void OnTextLimitOutputEnter(wxCommandEvent &event); // wxGlade: void OnCheckCacheEnable(wxCommandEvent &event); // wxGlade: void OnCacheRamUsageSpin(wxSpinEvent &event); // wxGlade: void OnComboFilterEnter(wxCommandEvent &event); // void OnComboFilter(wxCommandEvent &event); // void OnComboFilterText(wxCommandEvent &event); // wxGlade: void OnStatusBarTimer(wxTimerEvent &event); // void OnProgressTimer(wxTimerEvent &event); void OnProgressAbort(wxCommandEvent &event); void OnViewFullscreen(wxCommandEvent &event); void OnButtonRefresh(wxCommandEvent &event); void OnButtonGridCopy(wxCommandEvent &event); void OnButtonGridSave(wxCommandEvent &event); void OnRawDataUnsplit(wxSplitterEvent &event); void OnFilterPropDoubleClick(wxSplitterEvent &event); void OnControlUnsplit(wxSplitterEvent &event); void OnControlSplitMove(wxSplitterEvent &event); void OnFilterSplitMove(wxSplitterEvent &event); void OnTopBottomSplitMove(wxSplitterEvent &event); void OnSpectraUnsplit(wxSplitterEvent &event); void OnViewSpectraList(wxCommandEvent &event); void OnViewPlotLegend(wxCommandEvent &event); void OnViewWorldAxis(wxCommandEvent &event); void OnClose(wxCloseEvent &evt); void OnComboCameraSetFocus(wxFocusEvent &evt); void OnComboStashSetFocus(wxFocusEvent &evt); void OnNoteDataView(wxNotebookEvent &evt); void OnGridCameraPropertyChange(wxPropertyGridEvent &event); // wxGlade: void OnFileExportVideo(wxCommandEvent &event); void OnFileExportFilterVideo(wxCommandEvent &event); void OnFileExportPackage(wxCommandEvent &event); void OnRecentFile(wxCommandEvent &event); // wxGlade: void OnTreeBeginLabelEdit(wxTreeEvent &evt); void OnTreeEndLabelEdit(wxTreeEvent &evt); void OnUpdateTimer(wxTimerEvent &evt); void OnAutosaveTimer(wxTimerEvent &evt); void OnCheckUpdatesThread(wxCommandEvent &evt); void OnFinishRefreshThread(wxCommandEvent &evt); #ifdef FIX_WXPROPGRID_16222 void OnIdle(wxIdleEvent &evt); #endif void SetCommandLineFiles(wxArrayString &files); //return type of file, based upon heuristic check static unsigned int guessFileType(const std::string &file); //Check to see if the user wants a tip file void checkShowTips(); //See if the user wants to save the current state void checkAskSaveState(); //Check to see if we need to reload an autosave file (and reload it, as needed) void checkReloadAutosave(); //Restore user UI defaults from config file (except panel defaults, which // due to wx behviour need to be done after window show) void restoreConfigDefaults(); //Restore panel layout defaults void restoreConfigPanelDefaults(); void onPanelSpectraUpdate() {plotUpdates=true;} ; bool initOK() const {return initedOK;} void finaliseStartup(); //This is isolated from the layout code, due to "bug" 4815 in wx. The splitter window //does not know how to choose a good size until the window is shown void fixSplitterWindow() { filterSplitter->SplitHorizontally(filterTreePane,filterPropertyPane); restoreConfigPanelDefaults(); }; //Update the enabled status for the range entry in the edit menu void updateEditRangeMenu(); }; // wxGlade: end class class FileDropTarget : public wxFileDropTarget { private: MainWindowFrame *frame; public: FileDropTarget(MainWindowFrame *f) { frame = f; } virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& files) { frame->OnDropFiles(files, x, y); return true; }; }; #endif 3Depict-0.0.19/src/gui/glade-skeleton/0000755000175000017500000000000012716174467016750 5ustar pcuserpcuser3Depict-0.0.19/src/gui/glade-skeleton/animateFilterDialog.wxg0000644000175000017500000012230612640746376023407 0ustar pcuserpcuser /*\n * animateFilterDialog - GUI for animate filter\n * Copyright (C) 2012, D. Haley, A Ceguerra \n \n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n \n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n \n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n Export Animation Enter parameters for exporting animatio frames wxVERTICAL wxEXPAND 0 Filter view Frame view Enter animation key frames for each filter's property wxHORIZONTAL wxEXPAND 0 wxSPLIT_VERTICAL filterRightPane filterLeftPane wxVERTICAL wxALL|wxEXPAND 3 Select filter ID_FILTER_TREE_CTRL OnFilterTreeCtrlSelChanged wxALL|wxEXPAND 3 ID_PROPERTY_GRID Select property; double click to fill key frames with default values 1 1 1 10 1 1 1 wxGrid.wxGridSelectCells Property Value OnPropGridDClick OnFilterGridCellEditorShow wxVERTICAL wxEXPAND 0 wxHORIZONTAL wxALL|wxEXPAND 3 ID_FILTER_GRID_CTRL Key frame table 1 1 1 0 1 1 1 wxGrid.wxGridSelectCells Filter Property Mode Start Frame End Frame OnAnimateDClick wxALL|wxEXPAND 3 wxHORIZONTAL wxALIGN_CENTER_HORIZONTAL 0 REMOVE Remove the selected key frame from the table ID_BUTTON_FRAME_REMOVE OnButtonKeyFrameRemove Viewer for animation parameters for each frame wxHORIZONTAL wxEXPAND 0 wxVERTICAL wxALL|wxEXPAND 4 wxHORIZONTAL wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL 3 1 Enter or browse to directory where the animation frames will be exported to wxEXPAND 0 Enter where the animation frames will be exported to ID_TEXTBOX_WORKDIR OnOutputDirText wxLEFT|wxRIGHT 2 OPEN Browse to directory where the animation frames will be exported to ID_BUTTON_WORKDIR OnButtonWorkDir wxBOTTOM|wxEXPAND 5 wxHORIZONTAL 0 20 20 0 1 ID_CHECK_ONLYDATACHANGE OnCheckOutDataChange wxTOP|wxBOTTOM|wxEXPAND 3 1 wxTOP|wxBOTTOM 4 1 wxLEFT|wxTOP 3 1 ID_CHECK_IMAGE_OUT OnCheckImageOutput wxEXPAND 0 wxVERTICAL wxALL|wxEXPAND 3 wxHORIZONTAL wxLEFT|wxALIGN_CENTER_VERTICAL 3 1 Enter the target resolution (width) wxALL|wxEXPAND 4 Enter the target resolution (width) ID_TEXTBOX_IMAGEPREFIX OnImageFilePrefix wxALL|wxEXPAND 3 wxHORIZONTAL wxLEFT|wxALIGN_CENTER_VERTICAL 3 1 Enter the target resolution (width) wxALL|wxEXPAND 4 Enter the target resolution (width) ID_TEXTBOX_IMAGESIZE OnTextImageSize wxALL 4 ID_BUTTON_IMAGE_RES OnBtnResolution wxLEFT|wxBOTTOM 3 ID_CHECK_POINT_OUNT OnCheckPointOutput wxLEFT|wxTOP 3 ID_CHECK_PLOT_OUT OnCheckPlotOutput wxLEFT|wxTOP|wxBOTTOM 3 ID_CHECK_VOXEL_OUT OnCheckVoxelOutput wxALL 3 ID_CHECK_RANGE_OUT OnCheckRangeOutput wxLEFT|wxBOTTOM|wxEXPAND 5 wxHORIZONTAL wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL 3 1 wxLEFT|wxRIGHT|wxEXPAND 3 -1 ID_COMBO_RANGE_TYPE ORNL RNG CAMECA RRNG CAMECA ENV OnRangeTypeCombo 0 20 20 wxLEFT|wxRIGHT|wxEXPAND 5 1 wxALL|wxEXPAND 3 wxVERTICAL wxALL|wxEXPAND 3 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 1 Use the slider or enter the frame to view animation parameters wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL 5 Slider to select frame ID_FRAME_SLIDER 1, 1 1 OnFrameSlider wxALIGN_CENTER_VERTICAL 0 Enter frame number ID_FRAME_TEXTBOX OnTextFrame wxEXPAND 0 ID_FILTER_PROPERTY_VALUE_GRID Animation parameters for current frame 1 1 1 0 1 1 1 wxGrid.wxGridSelectCells Filter Property Value wxEXPAND 0 wxHORIZONTAL wxEXPAND 0 1 20 wxALL|wxALIGN_BOTTOM 3 CANCEL Abort animation OnButtonCancel wxALL|wxALIGN_BOTTOM 3 OK Run Animation OnButtonOK 3Depict-0.0.19/src/gui/glade-skeleton/rangeDialog.wxg0000644000175000017500000005011012640746376021710 0ustar pcuserpcuser enum\n{\n ID_CHECK_SHOW_OVERLAY=wxID_ANY+1,\n ID_SPLIT_LEFTRIGHT,\n ID_GRID_RANGES,\n ID_BTN_RANGE_ADD,\n ID_BTN_RANGE_REMOVE,\n ID_COMBO_OVERLAY_MANAGE_SET,\n ID_COMBO_SIMPLE_OVERLAY,\n ID_LIST_MANAGE_SET_ENTRIES,\n ID_LIST_MANAGE_SET_VALUES,\n ID_LIST_OVERLAY_COMBINED,\n ID_LIST_OVERLAY_COMBINED_CMPNT,\n ID_LIST_OVERLAY_COMBINED_SELECTION,\n ID_LIST_OVERLAY_SIMPLE,\n ID_LIST_OVERLAY_SIMPLE_CMPNT,\n ID_LIST_PLOTS,\n ID_MANAGE_SET_MORE,\n ID_PLOT_AREA,\n ID_TEXT_FILTER_COMBINED,\n ID_TEXT_FILTER_SIMPLE_CMPNT,\n\n}; Range Editor wxHORIZONTAL wxEXPAND 0 wxSPLIT_VERTICAL ID_SPLIT_LEFTRIGHT panelSplitRight panelSplitLeft OnSashVerticalUnsplit wxHORIZONTAL wxEXPAND 0 Plots Ranges Overlay ID_NOTE_TOOL wxVERTICAL wxEXPAND 0 0 ID_LIST_PLOTS OnListPlots wxALL|wxALIGN_RIGHT 5 1 OnCheckSpectrumOnly wxVERTICAL wxALL|wxEXPAND 4 ID_GRID_RANGES 1 1 1 10 1 1 1 wxGrid.wxGridSelectCells A B C OnGridRangesCellChange wxALL|wxEXPAND 4 wxHORIZONTAL 0 20 20 wxALL 4 ADD ID_BTN_RANGE_ADD OnBtnRangeAdd wxALL 4 REMOVE ID_BTN_RANGE_REMOVE OnBtnRangeRemove wxVERTICAL wxEXPAND 0 wxVERTICAL wxALL 5 ID_CHECK_SHOW_OVERLAY OnCheckShowOvelay wxEXPAND 0 wxVERTICAL wxALL|wxEXPAND 2 wxVERTICAL wxEXPAND 0 ID_TEXT_FILTER_SIMPLE_CMPNT OnTextFilterSimple wxEXPAND 0 ID_LIST_OVERLAY_SIMPLE OnListOverlaySimpleDelete wxVERTICAL wxEXPAND 0 ID_PLOT_AREA wxRIGHT|wxEXPAND|wxALIGN_CENTER_HORIZONTAL 4 wxHORIZONTAL 0 20 20 wxALL 4 OK OnBtnOK wxALL 4 CANCEL OnBtnCancel 3Depict-0.0.19/src/gui/glade-skeleton/mainWindow.wxg0000644000175000017500000026773212716174467021634 0ustar pcuserpcuser //Constant identifiers for binding events in wxwidgets "event table"\n enum {\n \n //File menu\n ID_MAIN_WINDOW= wxID_ANY+1,\n \n ID_FILE_EXIT,\n ID_FILE_OPEN,\n ID_FILE_MERGE,\n ID_FILE_SAVE,\n ID_FILE_SAVEAS,\n ID_FILE_EXPORT_PLOT,\n ID_FILE_EXPORT_IMAGE,\n ID_FILE_EXPORT_IONS,\n ID_FILE_EXPORT_RANGE,\n ID_FILE_EXPORT_ANIMATION,\n ID_FILE_EXPORT_FILTER_ANIMATION,\n ID_FILE_EXPORT_PACKAGE,\n \n //Edit menu\n ID_EDIT_UNDO,\n ID_EDIT_REDO,\n ID_EDIT_RANGE,\n ID_EDIT_PREFERENCES,\n \n //Help menu\n ID_HELP_ABOUT,\n ID_HELP_HELP,\n ID_HELP_CONTACT,\n \n //View menu\n ID_VIEW_BACKGROUND,\n ID_VIEW_CONTROL_PANE,\n ID_VIEW_RAW_DATA_PANE,\n ID_VIEW_SPECTRA,\n ID_VIEW_PLOT_LEGEND,\n ID_VIEW_WORLDAXIS,\n ID_VIEW_FULLSCREEN,\n //Left hand note pane\n ID_NOTEBOOK_CONTROL,\n ID_NOTE_CAMERA,\n ID_NOTE_DATA,\n ID_NOTE_PERFORMANCE,\n ID_NOTE_TOOLS,\n ID_NOTE_VISUALISATION,\n //Lower pane\n ID_PANEL_DATA,\n ID_PANEL_VIEW,\n ID_NOTE_SPECTRA,\n ID_NOTE_RAW,\n ID_GRID_RAW_DATA,\n ID_BUTTON_GRIDCOPY,\n ID_LIST_PLOTS,\n \n //Splitter IDs\n ID_SPLIT_LEFTRIGHT,\n ID_SPLIT_FILTERPROP,\n ID_SPLIT_TOP_BOTTOM,\n ID_SPLIT_SPECTRA,\n ID_RAWDATAPANE_SPLIT,\n ID_CONTROLPANE_SPLIT,\n \n //Camera panel \n ID_COMBO_CAMERA,\n ID_GRID_CAMERA_PROPERTY,\n \n //Filter panel \n ID_COMBO_FILTER,\n ID_COMBO_STASH,\n ID_BTN_STASH_MANAGE,\n ID_CHECK_AUTOUPDATE,\n ID_FILTER_NAMES,\n ID_GRID_FILTER_PROPERTY,\n ID_LIST_FILTER,\n ID_TREE_FILTERS,\n ID_BUTTON_REFRESH,\n ID_BTN_EXPAND,\n ID_BTN_COLLAPSE,\n ID_BTN_FILTERTREE_ERRS,\n \n //Effects panel\n ID_EFFECT_ENABLE,\n ID_EFFECT_CROP_ENABLE,\n ID_EFFECT_CROP_AXISONE_COMBO,\n ID_EFFECT_CROP_PANELONE,\n ID_EFFECT_CROP_PANELTWO,\n ID_EFFECT_CROP_AXISTWO_COMBO,\n ID_EFFECT_CROP_CHECK_COORDS,\n ID_EFFECT_CROP_TEXT_DX,\n ID_EFFECT_CROP_TEXT_DY,\n ID_EFFECT_CROP_TEXT_DZ,\n ID_EFFECT_STEREO_ENABLE,\n ID_EFFECT_STEREO_COMBO,\n ID_EFFECT_STEREO_BASELINE_SLIDER,\n ID_EFFECT_STEREO_LENSFLIP,\n \n //Options panel\n ID_CHECK_ALPHA,\n ID_CHECK_LIGHTING,\n ID_CHECK_LIMIT_POINT_OUT,\n ID_TEXT_LIMIT_POINT_OUT,\n ID_CHECK_CACHING,\n ID_CHECK_WEAKRANDOM,\n ID_SPIN_CACHEPERCENT,\n \n //Misc\n ID_PROGRESS_ABORT,\n ID_STATUS_TIMER,\n ID_PROGRESS_TIMER,\n ID_UPDATE_TIMER,\n ID_AUTOSAVE_TIMER,\n \n \n };\n 3Depict 1 1 ID_FILE_OPEN Open Open state file OnFileOpen ID_FILE_MERGE Merge "Merge other file" OnFileMerge ID_FILE_SAVE Save Save state to file OnFileSave ID_FILE_SAVEAS MenuSaveAs Save current state to new file OnFileSaveAs --- --- ID_FILE_EXPORT_PLOT Export Current Plot OnFileExportPlot ID_FILE_EXPORT_IMAGE Export Current 3D View OnFileExportImage ID_FILE_EXPORT_IONS Export Ion Data OnFileExportIons ID_FILE_EXPORT_RANGE Export Range Data OnFileExportRange ID_FILE_EXIT Exit Exit Program OnFileExit ID_MENU_EDIT_UNDO menuEditUndo OnEditUndo ID_MENU_EDIT_REDO menuEditRedo OnEditRedo --- --- ID_EDIT_RANGE menuEditRange OnEditRange --- --- ID_MENU_EDIT_PREFERENCES menuEditPreferences OnEditPreferences ID_VIEW_BACKGROUND, Change background colour OnViewBackground --- --- ID_VIEW_CONTROL_PANE MenuControlPane Enable or disable the left control pane 1 OnViewControlPane ID_VIEW_RAW_DATA_PANE MenuRawDataPane Enable or disable the raw data pane (bottom of right panel) 1 OnViewRawDataPane ID_VIEW_SPECTRA MenuViewSPectra 1 --- --- ID_HELP_HELP MenuHelp Show help files and documentation OnHelpHelp ID_HELP_CONTACT Open contact page OnHelpContact --- --- ID_HELP_ABOUT MenuAbout Information about this program OnHelpAbout MainFrame_statusbar wxHORIZONTAL wxEXPAND 0 wxSPLIT_VERTICAL ID_SPLIT_LEFTRIGHT panelView panelLeft wxVERTICAL wxLEFT|wxBOTTOM|wxEXPAND 2 Data Cam Post Tools ID_NOTEBOOK_CONTROL 10, 10 1 ID_NOTE_DATA wxVERTICAL 0 1 wxEXPAND 0 wxHORIZONTAL wxLEFT|wxRIGHT|wxBOTTOM|wxEXPAND 3 0 ID_COMBO_SETTINGS OnComboStash OnComboStashText OnComboStashEnter wxALIGN_CENTER 0 ID_BTN_STASH_MANAGE, OnButtonStashDialog wxEXPAND 0 1 0 1 wxEXPAND 0 wxSPLIT_HORIZONTAL filterPropertyPane filterTreePane wxHORIZONTAL wxEXPAND 0 wxVERTICAL wxLEFT|wxRIGHT|wxEXPAND 4 -1 List of available filters ID_FILTER_NAMES Range File Downsampling Mass Spectrum Clipping Compos. Profiles Bounding Box Ion Colour Ion Transform OnFilterNameCombo OnFilterNameComboText OnFilterNameComoEnter wxLEFT|wxBOTTOM|wxEXPAND 3 Tree of data filters ID_TREE_FILTERS OnTreeBeginDrag OnTreeDeleteItem OnTreeEndDrag OnTreeItemTooltip OnTreeKeyDown OnTreeSelectionChange OnTreeSelectionPreChange wxTOP 8 1 wxBOTTOM|wxEXPAND 5 wxEXPAND 0 wxVERTICAL 0 1 Enable/Disable automatic updates of data when filter change takes effect ID_CHECK_AUTOUPDATE 0 10 10 wxALL 2 REFRESH wxEXPAND 0 wxVERTICAL 0 1 wxLEFT|wxEXPAND 4 ID_GRID_FILTER_PROPERTY 1 1 1 3 1 0 1 wxGrid.wxGridSelectCells Property Value OnGridFilterPropertyChange 10, 10 1 ID_NOTE_CAMERA wxVERTICAL 0 1 wxTOP|wxBOTTOM|wxEXPAND 4 wxHORIZONTAL 0 -1 ID_COMBO_CAMERA OnEventComboBox OnEventText OnEventTextEnter wxLEFT|wxRIGHT 2 REMOVE OnButtonRemoveCam wxEXPAND 0 1 wxEXPAND 0 ID_GRID_CAMERA_PROPERTIES Camera data information 1 1 1 4 1 0 1 wxGrid.wxGridSelectRows Property Value 0 wxVERTICAL 0 wxHORIZONTAL wxALL|wxALIGN_CENTER 5 Align camera view to this axis ID_BUTTON_ALIGNCAM_XPLUS OnButtonAlignCameraXPlus wxALL|wxALIGN_CENTER 5 ID_BUTTON_ALIGNCAM_YPLUS OnButtonAlignCameraYPlus wxALL|wxALIGN_CENTER 5 ID_BUTTON_ALIGNCAM_ZPLUS OnButtonAlignCameraZPlus wxALIGN_CENTER 0 wxHORIZONTAL wxALL|wxALIGN_CENTER 5 ID_BUTTON_ALIGNCAM_XMINUS OnButtonAlignCameraXMinus wxALL|wxALIGN_CENTER 5 ID_BUTTON_ALIGNCAM_YMINUS OnButtonAlignCameraYMinus wxALL|wxALIGN_CENTER 5 ID_BUTTON_ALIGNCAM_ZMINUS OnButtonAlignCameraZMinus wxALL|wxALIGN_CENTER 4 Resize view to fit 3D data wxVERTICAL wxALL 5 Enable/disable visual effects on final 3D output OnCheckPostProcess wxEXPAND 0 Crop Stereo wxVERTICAL wxALL 6 Enable cropping post-process effect ID_EFFECT_CROP_ENABLE OnFxCropCheck wxLEFT 15 OnFxCropCamFrame wxLEFT|wxRIGHT|wxTOP|wxEXPAND 5 wxHORIZONTAL wxEXPAND|wxALIGN_CENTER 0 wxVERTICAL wxRIGHT|wxBOTTOM|wxEXPAND|wxALIGN_CENTER_HORIZONTAL 5 0 ID_EFFECT_CROP_AXISONE_COMBO x-y x-z y-x y-z z-x z-y OnFxCropAxisOne wxRIGHT|wxEXPAND|wxALIGN_CENTER|wxSHAPED 5 ID_EFFECT_CROP_PANELONE_COMBO #54fff4 wxEXPAND|wxALIGN_CENTER 0 wxVERTICAL wxLEFT|wxBOTTOM|wxEXPAND 5 0 ID_EFFECT_CROP_AXISTWO_COMBO x-y x-z y-x y-z z-x z-y OnFxCropAxisTwo wxLEFT|wxEXPAND|wxALIGN_CENTER|wxSHAPED 5 ID_EFFECT_CROP_PANELTWO_COMBO #ff4fe2 wxBOTTOM|wxEXPAND|wxALIGN_CENTER 5 2 0,1,2 3 0,1 2 2 wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL 0 1 0 ID_EFFECT_CROP_TEXT_DX wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL 0 1 0 ID_EFFECT_CROP_TEXT_DY wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL 0 1 0 ID_EFFECT_CROP_TEXT_DZ wxVERTICAL wxLEFT|wxTOP 6 Colour based 3D effect enable/disable OnFxStereoEnable 0 20 20 wxBOTTOM|wxEXPAND 15 wxHORIZONTAL wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL 5 1 wxLEFT 5 0 Glasses colour mode Red-Blue Red-Green Red-Cyan Half Colour Mixed Colour OnFxStereoCombo 0 1 wxEXPAND 0 wxHORIZONTAL wxLEFT|wxTOP 5 1 wxLEFT|wxRIGHT|wxTOP|wxEXPAND 5 Level of separation between left and right images, which sets 3D depth to visual distortion tradeoff OnFxStereoBaseline wxLEFT 5 Reverse output 3D channels (to negate a flip in 3D lens layout) OnFxStereoLensFlip wxVERTICAL wxTOP 3 1 wxLEFT|wxTOP|wxBOTTOM 5 ID_CHECK_ALPHA, OnCheckAlpha wxLEFT|wxTOP|wxBOTTOM 6 ID_CHECK_LIGHTING OnCheckLighting wxEXPAND 0 1 wxTOP 3 1 wxLEFT|wxTOP|wxBOTTOM 5 ID_CHECK_WEAKRANDOM OnCheckWeakRandom wxLEFT|wxEXPAND 5 wxHORIZONTAL wxRIGHT 3 1 Limit the number of points in the 3D view OnCheckLimitOutput wxLEFT 4 2000000 OnTextLimitOutput OnTextLimitOutputEnter wxLEFT|wxTOP|wxBOTTOM 5 OnCheckCacheEnable wxTOP|wxEXPAND 5 wxHORIZONTAL wxRIGHT|wxALIGN_RIGHT 5 1 5 0, 100 50 OnCacheRamUsageSpin 3Depict-0.0.19/src/gui/glade-skeleton/errorDialog.wxg0000644000175000017500000001405312640746376021753 0ustar pcuserpcuser Filter Errors 551, 414 wxVERTICAL wxEXPAND 0 wxHORIZONTAL wxLEFT|wxRIGHT|wxTOP|wxEXPAND 6 wxEXPAND 0 wxVERTICAL 0 10 10 wxTOP|wxEXPAND 5 wxHORIZONTAL 0 1 wxALIGN_CENTER_VERTICAL 0 1 wxTOP|wxEXPAND 6 wxHORIZONTAL 0 1 wxALIGN_CENTER_VERTICAL 0 1 0 20 20 wxALL|wxALIGN_RIGHT 5 OK wxID_OK 3Depict-0.0.19/src/gui/glade-skeleton/preferencesDialog.wxg0000644000175000017500000007164212640746376023132 0ustar pcuserpcuser Preferences 640, 487 wxVERTICAL wxEXPAND 0 Pref Startup Camera wxHORIZONTAL wxEXPAND 0 wxVERTICAL 0 1 wxEXPAND 0 0 ID_LIST_FILTERS OnListClick 0 20 20 wxEXPAND 0 wxVERTICAL wxEXPAND 0 ID_GRID_PROPERTIES 0 1 1 1 1 1 OnFilterCellClick OnFilterCellChange wxEXPAND 0 wxHORIZONTAL 0 Reset all filter initial values back to program defaults 0 Reset the filter initial values back to program defaults 0 20 20 wxVERTICAL wxALL|wxEXPAND 5 wxVERTICAL 0 0 Set the method of panel layout when starting the program ID_START_COMBO_PANEL Always show Remember Specify OnStartupPanelCombo wxEXPAND 0 wxHORIZONTAL 0 20 20 wxEXPAND 0 wxVERTICAL 0 ID_START_CHECK_CONTROL OnStartupCheckControl 0 ID_START_CHECK_RAWDATA OnStartupCheckRawData 0 ID_START_CHECK_PLOTLIST OnStartupCheckPlotList wxALL|wxEXPAND 5 wxVERTICAL 0 Lets the program check the internet to see if updates to the program version are available, then notifies you about updates now and again. wxVERTICAL wxEXPAND 0 wxHORIZONTAL wxALL 5 By default, use an orthographic camera at startup. State files will override this preference. OnCheckPreferOrtho wxEXPAND 0 wxVERTICAL wxEXPAND 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 1 0 20 20 wxALIGN_CENTER_VERTICAL 0 1 wxEXPAND|wxALIGN_CENTER_VERTICAL 0 Camera translation, orbit and swivel rates. ID_MOUSE_MOVE_SLIDER 1, 100 1 OnMouseMoveSlider wxALIGN_CENTER_VERTICAL 0 1 wxEXPAND 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 1 0 20 20 wxALIGN_CENTER_VERTICAL 0 1 wxEXPAND|wxALIGN_CENTER_VERTICAL 0 Camera zooming rate. ID_MOUSE_ZOOM_SLIDER 1, 100 1 OnMouseZoomSlider wxALIGN_CENTER_VERTICAL 0 1 ID_MOUSE_ZOOM_SLIDER wxEXPAND 0 wxHORIZONTAL wxEXPAND 0 20 20 wxTOP 8 OK wxLEFT|wxTOP|wxBOTTOM 8 CANCEL 0 20 10 3Depict-0.0.19/src/gui/glade-skeleton/animateSubDialogs/0000755000175000017500000000000012640746376022343 5ustar pcuserpcuser3Depict-0.0.19/src/gui/glade-skeleton/animateSubDialogs/realKeyFrameDialog.wxg0000644000175000017500000004121612640746376026565 0ustar pcuserpcuser enum{\nID_COMBO_TRANSITION,\nID_TEXT_FINAL_VALUE,\nID_TEXT_FRAME_START,\nID_TEXT_INITIAL_VALUE,\n}; Key Frame :Number wxVERTICAL 0 5 20 wxEXPAND 0 wxHORIZONTAL 0 20 10 wxEXPAND 0 wxVERTICAL 0 10 20 wxEXPAND 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 14 1 wxLEFT|wxALIGN_CENTER_VERTICAL 5 -1 ID_COMBO_TRANSITION Step Ramp OnComboTransition wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 5 1 wxLEFT|wxALIGN_CENTER_VERTICAL 4 ID_TEXT_FRAME_START OnTextStartFrame wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 12 1 wxLEFT|wxALIGN_CENTER_VERTICAL 4 ID_TEXT_FRAME_START OnTextEndFrame 0 10 20 wxLEFT|wxRIGHT|wxEXPAND 5 1 wxEXPAND 0 wxVERTICAL 0 20 20 wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 5 1 wxLEFT|wxALIGN_CENTER_VERTICAL 4 ID_TEXT_INITIAL_VALUE OnTextInitialValue wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 9 1 wxLEFT|wxALIGN_CENTER_VERTICAL 4 ID_TEXT_FINAL_VALUE OnTextFinalValue 0 20 20 0 20 10 wxEXPAND 0 wxHORIZONTAL 0 20 20 wxALL 4 CANCEL OnButtonCancel wxALL 4 OK OnButtonOK 3Depict-0.0.19/src/gui/glade-skeleton/animateSubDialogs/colourChooserDialog.wxg0000644000175000017500000004616012640746376027047 0ustar pcuserpcuser enum{\nID_COMBO_TRANSITION,\nID_TEXT_FINAL_VALUE,\nID_TEXT_FRAME_START,\nID_TEXT_INITIAL_VALUE,\n}; Key Frame : Colour wxVERTICAL 0 5 20 wxEXPAND 0 wxHORIZONTAL 0 20 10 wxEXPAND 0 wxVERTICAL 0 10 20 wxEXPAND 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 14 1 wxLEFT|wxALIGN_CENTER_VERTICAL 5 -1 ID_COMBO_TRANSITION Step Ramp OnComboTransition wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 5 1 wxLEFT|wxALIGN_CENTER_VERTICAL 4 ID_TEXT_FRAME_START OnTextStartFrame wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 12 1 wxLEFT|wxALIGN_CENTER_VERTICAL 4 ID_TEXT_FRAME_START OnTextEndFrame 0 10 20 wxLEFT|wxRIGHT|wxEXPAND 5 1 wxEXPAND 0 wxVERTICAL 0 20 20 wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL 0 20 20 wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL 0 1 wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL 3 Colour at the start of the transtition OnBtnStartColour 0 20 20 wxEXPAND|wxALIGN_CENTER_VERTICAL 0 wxHORIZONTAL 0 20 20 wxRIGHT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL 9 1 wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL 3 Colour at end of transition OnBtnEndColour 0 20 20 0 20 20 0 20 10 wxEXPAND 0 wxHORIZONTAL 0 20 20 wxALL 4 CANCEL wxID_CANCEL OnButtonCancel wxALL 4 OK wxID_OK OnButtonOK 3Depict-0.0.19/src/gui/glade-skeleton/animateSubDialogs/stringKeyFrameDialog.wxg0000644000175000017500000002622712640746376027155 0ustar pcuserpcuser enum\n{\nID_TEXT_START_FRAME,\nID_RADIO_FROM_FILE,\nID_TEXT_FROM_FILE,\nID_RADIO_FROM_TABLE,\nID_GRID_STRINGS\n}; String Keyframes Frame at which to start string sequence 595, 412 wxVERTICAL wxALL|wxEXPAND 6 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 1 wxLEFT|wxALIGN_CENTER_VERTICAL 6 Frame offset for data start ID_TEXT_START_FRAME OnTextStart 0 20 20 wxALL|wxEXPAND 6 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 ID_RADIO_FROM_FILE OnFileRadio wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL 6 File to use as string data source, one value per row ID_TEXT_FROM_FILE OnTextFilename wxLEFT|wxRIGHT 6 OPEN Select file to use as data source wxID_OPEN OnBtnChooseFile wxLEFT 6 Use table below for data source ID_RADIO_FROM_TABLE OnTableRadio wxEXPAND 0 wxHORIZONTAL wxALL|wxEXPAND 5 ID_GRID_STRINGS 1 1 1 0 1 1 1 wxGrid.wxGridSelectCells Frame Value OnGridCellChange OnGridEditorShown wxRIGHT|wxEXPAND 5 wxVERTICAL wxBOTTOM 5 ADD Add new data rows to table wxID_ADD OnBtnAdd 0 REMOVE Remove selected strings from table wxID_REMOVE OnBtnRemove wxEXPAND 0 wxHORIZONTAL 0 20 20 wxALL 5 CANCEL Abort value selection and return to previous window wxID_CANCEL wxALL 5 OK Accept data values wxID_OK 3Depict-0.0.19/src/gui/glade-skeleton/animateSubDialogs/choiceKeyFrameDialog.wxg0000644000175000017500000001241612640746376027074 0ustar pcuserpcuser enum\n{\nID_TEXT_FRAME,\nID_COMBO_CHOICE\n}; Key Frame wxVERTICAL wxALL|wxEXPAND 10 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 20 1 wxLEFT|wxALIGN_CENTER_VERTICAL 5 ID_TEXT_FRAME OnFrameText wxLEFT|wxRIGHT|wxTOP|wxEXPAND 10 wxHORIZONTAL wxRIGHT|wxALIGN_CENTER_VERTICAL 5 1 wxLEFT 5 -1 ID_COMBO_CHOICE OnChoiceCombo wxALL|wxEXPAND 5 wxHORIZONTAL 0 20 20 wxRIGHT 5 CANCEL wxID_CANCEL wxLEFT 5 OK wxID_OK 3Depict-0.0.19/src/gui/glade-skeleton/autosaveDialog.wxg0000644000175000017500000000715112640746376022452 0ustar pcuserpcuser enum\n{\nID_LIST_STATES=wxID_ANY+1,\nID_REMOVE_ALL Restore state? wxVERTICAL wxLEFT|wxRIGHT|wxTOP|wxALIGN_CENTER_HORIZONTAL 6 1 wxALL|wxEXPAND 8 0 wxEXPAND 0 wxHORIZONTAL wxLEFT|wxBOTTOM 8 0 20 20 wxLEFT|wxRIGHT|wxBOTTOM 8 CANCEL wxRIGHT|wxBOTTOM 8 OK 3Depict-0.0.19/src/gui/glade-skeleton/resDialog.wxg0000644000175000017500000002571312640746376021420 0ustar pcuserpcuser enum\n{\n ID_RESET=wxID_ANY+1,\n ID_SPIN_WIDTH,\n ID_SPIN_HEIGHT,\n ID_LOCK_ASPECT\n}; Resolution Selection wxVERTICAL wxEXPAND 0 wxHORIZONTAL 0 20 10 wxLEFT|wxEXPAND 8 wxVERTICAL 0 20 20 wxEXPAND 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 1 wxALL|wxALIGN_CENTER_VERTICAL 8 ID_SPIN_WIDTH OnSpinWidth wxEXPAND 0 wxHORIZONTAL wxALIGN_CENTER_VERTICAL 0 1 wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL 5 ID_SPIN_HEIGHT OnSpinHeight wxALIGN_CENTER_VERTICAL 3 ID_LOCK_ASPECT OnCheckLockAspect 0 20 20 0 10 10 wxEXPAND 0 1 wxALL|wxEXPAND 5 wxEXPAND 0 1 wxTOP|wxBOTTOM|wxEXPAND 5 wxHORIZONTAL wxALL 5 ID_RESET OnBtnRefresh 0 20 20 wxALL 5 OK OnBtnOK wxALL 5 CANCEL OnBtnCancel 3Depict-0.0.19/src/gui/glPane.h0000644000175000017500000001237212716174467015436 0ustar pcuserpcuser/* * gLPane.h - WxWidgets opengl Pane. * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef GLPANE_H #define GLPANE_H #include "gl/scene.h" #include "gl/tr.h" #include #include #include class BasicGLPane : public wxGLCanvas { private: wxGLContext *context; Scene *currentScene; wxStatusBar *parentStatusBar; wxTimer *parentStatusTimer; unsigned int statusDelay; #ifdef __APPLE__ bool requireContextUpdate; #endif //In some implementation of openGL in wx. //calling GL funcs before Paint() will crash program bool paneInitialised; //Is the user engaged in a drag operation? bool dragging; //Where is the start of the mouse drag? wxPoint draggingStart; bool lastMoveShiftDown; //True if an object has been mouse-overed for selection bool selectionMode; //The scene ID value for the currently selected object unsigned int curSelectedObject; //The scene ID value for object currently being "hovered" over unsigned int hoverObject; //!Last mouseflags/keyflags during selection event unsigned int lastMouseFlags,lastKeyFlags; //Test for a object selection. Returns -1 if no selection //or object ID if selection OK. Also sets lastSelected & scene unsigned int selectionTest(const wxPoint &p, bool &shouldRedraw); //Test for a object hover under cursor Returns -1 if no selection //or object ID if selection OK. Also sets last hover and scene unsigned int hoverTest(const wxPoint &p, bool &shouldRedraw); //!Are there updates to the camera Properties due to camera motion? bool haveCameraUpdates; //!Are we currently applying a device in the scene? bool applyingDevice; //Parameters for modifying mouse speed float mouseZoomFactor,mouseMoveFactor; unsigned int lastKeyDoubleTap; wxTimer *keyDoubleTapTimer; //build a TR tile context to allow drawing the image in chunks. // width and height are the output image size. // wantAlpha is used if we want to retrieve the alpha (transpar.) channel TRcontext *generateTileContext(unsigned int width, unsigned int height, unsigned char *buffer, bool wantAlpha=false) const; public: bool displaySupported() const; void setScene(Scene *s) { currentScene=s;} //Enable/Disable the scene interaction for user objects? void setSceneInteractionAllowed(bool enabled=true); //!Must be called before user has a chance to perform interaction void setParentStatus(wxStatusBar *statusBar, wxTimer *timer,unsigned int statDelay) { parentStatusBar=statusBar;parentStatusTimer=timer;statusDelay=statDelay;}; bool hasCameraUpdates() const {return haveCameraUpdates;}; void clearCameraUpdates() {haveCameraUpdates=false;}; BasicGLPane(wxWindow* parent); ~BasicGLPane(); void resized(wxSizeEvent& evt); int getWidth(); int getHeight(); //Panel will not update if a child window for some platforms, using // normal wx reresh code. Force it. // See, eg http://stackoverflow.com/questions/6458451/force-repaint-of-wxpython-window-wxmpl-plot void forceRedraw(); void setMouseMoveFactor(float f) { mouseMoveFactor=f;}; void setMouseZoomFactor(float f) { mouseZoomFactor=f;}; //!Is the window initialised? bool isInited() { return paneInitialised;} //!Set the background colour (openGL clear colour) void setGlClearColour(float r,float g,float b); //!Pull in the colour from the scene void updateClearColour(); //!Render the view using the scene void render(wxPaintEvent& evt); //!Construct a 3D viewport, ready for openGL output. Returns false if initialisation failed bool prepare3DViewport(int topleft_x, int topleft_y, int bottomrigth_x, int bottomrigth_y); //!Save an image to file, return false on failure bool saveImage(unsigned int width, unsigned int height,const char *filename, bool showProgress=true, bool needPostPaint=true); //!Save an image sequence to files by orbiting the camera bool saveImageSequence(unsigned int width, unsigned int height, unsigned int nFrames, wxString &path, wxString &prefix, wxString &extension); //!Get the background colour void getGlClearColour(float &r,float &g,float &b) { currentScene->getBackgroundColour(r,g,b);} // events void mouseMoved(wxMouseEvent& event); void mouseDown(wxMouseEvent& event); void mouseWheelMoved(wxMouseEvent& event); void mouseReleased(wxMouseEvent& event); void rightClick(wxMouseEvent& event); void mouseLeftWindow(wxMouseEvent& event); void keyPressed(wxKeyEvent& event); void keyReleased(wxKeyEvent& event); void charEvent(wxKeyEvent& event); void OnEraseBackground(wxEraseEvent &); void OnAxisTapTimer(wxTimerEvent &); bool setFullscreen(bool fullscreen); bool setMouseVisible(bool visible); DECLARE_EVENT_TABLE() }; #endif 3Depict-0.0.19/src/gui/glPane.cpp0000644000175000017500000006400012716174467015764 0ustar pcuserpcuser/* * glPane.cpp - OpenGL panel implementation * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "wx/wxcommon.h" #include "common/stringFuncs.h" #include "gl/select.h" #include "glPane.h" // include OpenGL #ifdef __WXMAC__ #include "OpenGL/glu.h" #include "OpenGL/gl.h" #else #include #include #endif #include "common/translation.h" //Unclear why, but windows does not allow GL_BGR, //needs some other define BGR_EXT (NFI), which is 0x80E0 #if defined(WIN32) || defined(WIN64) #define GL_BGR 0x80E0 #endif using std::string; enum { ID_KEYPRESS_TIMER=wxID_ANY+1, }; //Double tap delay (ms), for axis reversal const unsigned int DOUBLE_TAP_DELAY=500; BEGIN_EVENT_TABLE(BasicGLPane, wxGLCanvas) EVT_MOTION(BasicGLPane::mouseMoved) EVT_ERASE_BACKGROUND(BasicGLPane::OnEraseBackground) EVT_LEFT_DOWN(BasicGLPane::mouseDown) EVT_LEFT_UP(BasicGLPane::mouseReleased) EVT_MIDDLE_UP(BasicGLPane::mouseReleased) EVT_MIDDLE_DOWN(BasicGLPane::mouseDown) EVT_RIGHT_UP(BasicGLPane::mouseReleased) EVT_RIGHT_DOWN(BasicGLPane::mouseDown) EVT_LEAVE_WINDOW(BasicGLPane::mouseLeftWindow) EVT_SIZE(BasicGLPane::resized) EVT_KEY_DOWN(BasicGLPane::keyPressed) EVT_KEY_UP(BasicGLPane::keyReleased) EVT_MOUSEWHEEL(BasicGLPane::mouseWheelMoved) EVT_PAINT(BasicGLPane::render) EVT_TIMER(ID_KEYPRESS_TIMER,BasicGLPane::OnAxisTapTimer) END_EVENT_TABLE() //Controls camera pan/translate/pivot speed; Radii per pixel or distance/pixel const float CAMERA_MOVE_RATE=0.05; // Controls zoom speed, in err, zoom units.. Ahem. const float CAMERA_SCROLL_RATE=0.05; //Zoom speed for keyboard const float CAMERA_KEYBOARD_SCROLL_RATE=1; int attribList[] = {WX_GL_RGBA, WX_GL_DEPTH_SIZE, 16, WX_GL_DOUBLEBUFFER, 1, 0,0}; BasicGLPane::BasicGLPane(wxWindow* parent) : wxGLCanvas(parent, wxID_ANY, attribList) { haveCameraUpdates=false; applyingDevice=false; paneInitialised=false; keyDoubleTapTimer=new wxTimer(this,ID_KEYPRESS_TIMER); lastKeyDoubleTap=(unsigned int)-1; context=0; mouseMoveFactor=mouseZoomFactor=1.0f; dragging=false; lastMoveShiftDown=false; selectionMode=false; lastKeyFlags=lastMouseFlags=0; #ifdef __APPLE__ requireContextUpdate=false; #endif } BasicGLPane::~BasicGLPane() { keyDoubleTapTimer->Stop(); delete keyDoubleTapTimer; if(context) delete context; } bool BasicGLPane::displaySupported() const { return IsDisplaySupported(attribList); } void BasicGLPane::setSceneInteractionAllowed(bool enabled) { currentScene->lockInteraction(!enabled); } unsigned int BasicGLPane::selectionTest(const wxPoint &p,bool &shouldRedraw) { if(currentScene->isInteractionLocked()) { shouldRedraw=false; return -1; } //TODO: Refactor. Much of this could be pushed into the scene, //and hence out of this wx panel. //Push on the matrix stack glPushMatrix(); GLint oldViewport[4]; glGetIntegerv(GL_VIEWPORT, oldViewport); //5x5px picking region. Picking is done by modifying the view //to enlarge the selected region. glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPickMatrix(p.x, oldViewport[3]-p.y,5, 5, oldViewport); glMatrixMode(GL_MODELVIEW); int lastSelected = currentScene->getLastSelected(); int selectedObject=currentScene->glSelect(); //If the object selection hasn't changed, we don't need to redraw //if it has changed, we should redraw shouldRedraw = (lastSelected !=selectedObject); //Restore the previous matirx glPopMatrix(); //Restore the viewport int w, h; GetClientSize(&w, &h); glViewport(0, 0, (GLint) w, (GLint) h); return selectedObject; } unsigned int BasicGLPane::hoverTest(const wxPoint &p,bool &shouldRedraw) { if(currentScene->isInteractionLocked()) { shouldRedraw=false; return -1; } //Push on the matrix stack glPushMatrix(); GLint oldViewport[4]; glGetIntegerv(GL_VIEWPORT, oldViewport); //5x5px picking region. Picking is done by modifying the view //to enlarge the selected region. glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPickMatrix(p.x, oldViewport[3]-p.y,5, 5, oldViewport); glMatrixMode(GL_MODELVIEW); unsigned int lastHover = currentScene->getLastHover(); unsigned int hoverObject=currentScene->glSelect(false); //FIXME: Should be able to make this more efficient shouldRedraw = lastHover!=(unsigned int)-1; //Set the scene's hover value currentScene->setLastHover(hoverObject); currentScene->setHoverMode(hoverObject != (unsigned int)-1); //Restore the previous matirx glPopMatrix(); //Restore the viewport int w, h; GetClientSize(&w, &h); glViewport(0, 0, (GLint) w, (GLint) h); return hoverObject; } void BasicGLPane::forceRedraw() { //Force a paint update for the scene wxPaintEvent ptEvent; wxPostEvent(this,ptEvent); #ifdef WIN32 //Hack for windows. Does not redraw otherwise. // Refresh and Update in tandom dont work. Show(false); Show(true); #endif } // some useful events to use void BasicGLPane::mouseMoved(wxMouseEvent& event) { if (applyingDevice) return; enum { CAM_MOVE, //Movement of some kind CAM_TRANSLATE, //translate camera CAM_PIVOT, //Pivot around view and across directions CAM_ROLL //Roll around view direction }; if(selectionMode ) { if(currentScene->isInteractionLocked()) { event.Skip(); return; } wxPoint p=event.GetPosition(); unsigned int mouseFlags=0; unsigned int keyFlags=0; wxMouseState wxm = wxGetMouseState(); if(wxm.CmdDown()) keyFlags|=FLAG_CMD; if(wxm.ShiftDown()) keyFlags|=FLAG_SHIFT; if(wxm.LeftIsDown()) mouseFlags|= SELECT_BUTTON_LEFT; if(wxm.RightIsDown()) mouseFlags|= SELECT_BUTTON_RIGHT; if(wxm.MiddleIsDown()) mouseFlags|= SELECT_BUTTON_MIDDLE; //We can get a mouse move event which reports no buttons before a mouse-up event, //this occurs frequently under windows, but sometimes under GTK if(!mouseFlags) { event.Skip(); return; } int w, h; GetClientSize(&w, &h); currentScene->applyDevice((float)draggingStart.x/(float)w, (float)draggingStart.y/(float)h, p.x/(float)w,p.y/(float)h, keyFlags,mouseFlags, false); lastMouseFlags=mouseFlags; lastKeyFlags=keyFlags; Refresh(); return; } if(!dragging) { wxPoint p=event.GetPosition(); //Do a hover test bool doRedraw=false; hoverTest(p,doRedraw); if(doRedraw) Refresh(); return; } wxPoint draggingCurrent = event.GetPosition(); //left-right and up-down move values float lrMove,udMove; //Movement rate multiplier -- initialise to user value float camMultRate=mouseMoveFactor; if(event.m_shiftDown) { //Commit the current temp cam using the last camera rate //and then restart the motion. if(!lastMoveShiftDown && currentScene->haveTempCam()) currentScene->commitTempCam(); camMultRate*=5.0f; lastMoveShiftDown=true; } else { //Commit the current temp cam using the last camera rate //and then restart the motion. if(lastMoveShiftDown && currentScene->haveTempCam()) currentScene->commitTempCam(); lastMoveShiftDown=false; } lrMove=CAMERA_MOVE_RATE*camMultRate*(draggingCurrent.x - draggingStart.x); udMove=CAMERA_MOVE_RATE*camMultRate*(draggingCurrent.y - draggingStart.y); lrMove*=2.0f*M_PI/180.0; udMove*=2.0f*M_PI/180.0; unsigned int camMode=0; //Decide camera movement mode bool translateMode; translateMode=event.CmdDown(); bool swingMode; #if defined(WIN32) || defined(WIN64) || defined(__APPLE__) swingMode=wxGetKeyState(WXK_ALT); #else swingMode=wxGetKeyState(WXK_TAB); #endif if(translateMode && !swingMode) camMode=CAM_TRANSLATE; else if(swingMode && !translateMode) camMode=CAM_PIVOT; else if(swingMode && translateMode) camMode=CAM_ROLL; else camMode=CAM_MOVE; switch(camMode) { case CAM_TRANSLATE: currentScene->discardTempCam(); currentScene->setTempCam(); currentScene->getTempCam()->translate(lrMove,-udMove); break; case CAM_PIVOT: currentScene->discardTempCam(); currentScene->setTempCam(); currentScene->getTempCam()->pivot(lrMove,udMove); break; case CAM_MOVE: currentScene->setTempCam(); currentScene->getTempCam()->move(lrMove,udMove); break; case CAM_ROLL: currentScene->setTempCam(); currentScene->getTempCam()->roll(atan2(udMove,lrMove)); break; default: ASSERT(false); break; } if(!event.m_leftDown) { dragging=false; currentScene->commitTempCam(); } haveCameraUpdates=true; Refresh(false); } void BasicGLPane::mouseDown(wxMouseEvent& event) { wxPoint p=event.GetPosition(); //Do not re-trigger if dragging or doing a scene update. //This can cause a selection test to occur whilst //a temp cam is activated in the scene, or a binding refresh is underway, //which is currently considered bad if(!dragging && !applyingDevice && !selectionMode && !currentScene->isInteractionLocked()) { //Check to see if the user has clicked an object in the scene bool redraw; selectionTest(p,redraw); //If the selected object is valid, then //we did select an object. Treat this as a selection event if(currentScene->getLastSelected() != (unsigned int)-1) { selectionMode=true; currentScene->setSelectionMode(true); } else { //we aren't setting, it -- it shouldn't be the case ASSERT(selectionMode==false); //Prevent right button from triggering camera drag if(!event.LeftDown()) { event.Skip(); return; } //If not a valid selection, this is a camera drag. dragging=true; } draggingStart = event.GetPosition(); //Set keyboard focus to self, to receive key events SetFocus(); if(redraw) Refresh(); } } void BasicGLPane::mouseWheelMoved(wxMouseEvent& event) { const float SHIFT_MULTIPLIER=5; float cameraMoveRate=-(float)event.GetWheelRotation()/(float)event.GetWheelDelta(); cameraMoveRate*=mouseZoomFactor; if(event.ShiftDown()) cameraMoveRate*=SHIFT_MULTIPLIER; cameraMoveRate*=CAMERA_SCROLL_RATE; //Move by specified delta currentScene->getActiveCam()->forwardsDolly(cameraMoveRate); //if we are using a temporary camera, update that too if(currentScene->haveTempCam()) currentScene->getTempCam()->forwardsDolly(cameraMoveRate); haveCameraUpdates=true; Refresh(); } void BasicGLPane::mouseReleased(wxMouseEvent& event) { if(currentScene->isInteractionLocked()) { event.Skip(); return; } if(selectionMode ) { //If user releases all buttons, then allow the up if(!event.LeftIsDown() && !event.RightIsDown() && !event.MiddleIsDown()) { wxPoint p=event.GetPosition(); int w, h; GetClientSize(&w, &h); applyingDevice=true; currentScene->applyDevice((float)draggingStart.x/(float)w, (float)draggingStart.y/(float)h, p.x/(float)w,p.y/(float)h, lastKeyFlags,lastMouseFlags, true); applyingDevice=false; selectionMode=false; currentScene->setSelectionMode(selectionMode); Refresh(); } event.Skip(); return; } if(currentScene->haveTempCam()) currentScene->commitTempCam(); currentScene->finaliseCam(); haveCameraUpdates=true; dragging=false; Refresh(); } void BasicGLPane::rightClick(wxMouseEvent& event) { } void BasicGLPane::mouseLeftWindow(wxMouseEvent& event) { if(selectionMode) { wxPoint p=event.GetPosition(); int w, h; GetClientSize(&w, &h); applyingDevice=true; currentScene->applyDevice((float)draggingStart.x/(float)w, (float)draggingStart.y/(float)h, p.x/(float)w,p.y/(float)h, lastKeyFlags,lastMouseFlags, true); selectionMode=false; currentScene->setSelectionMode(selectionMode); Refresh(); applyingDevice=false; event.Skip(); return; } if(event.m_leftDown) { if(currentScene->haveTempCam()) { currentScene->commitTempCam(); dragging=false; } } } void BasicGLPane::keyPressed(wxKeyEvent& event) { switch(event.GetKeyCode()) { case WXK_SPACE: { unsigned int visibleDir; //Use modifier keys to alter the direction of visibility //First compute the part of the keymask that does not //reflect the double tap // needs to be control in apple as cmd-space open spotlight unsigned int keyMask; #ifdef __APPLE__ keyMask = (event.RawControlDown() ? 1 : 0); #else keyMask = (event.CmdDown() ? 1 : 0); #endif keyMask |= (event.ShiftDown() ? 2 : 0); //Now determine if we are the same mask as last time bool isKeyDoubleTap=(lastKeyDoubleTap==keyMask); //double tapping allows for selection of reverse direction keyMask |= ( isKeyDoubleTap ? 4 : 0); visibleDir=-1; //Hardwire key combo->Mapping switch(keyMask) { //Space only case 0: visibleDir=3; break; //Command down +space case 1: visibleDir=0; break; //Shift +space case 2: visibleDir=2; break; //NO CASE 3 //Double+space case 4: visibleDir=5; break; //Doublespace+Cmd case 5: visibleDir=4; break; //Space+Double+shift case 6: visibleDir=1; break; default: ; } if(visibleDir!=(unsigned int)-1) { if(isKeyDoubleTap) { //It was a double tap. Reset the tapping and stop the timer lastKeyDoubleTap=(unsigned int)-1; keyDoubleTapTimer->Stop(); } else { lastKeyDoubleTap=keyMask & (~(0x04)); keyDoubleTapTimer->Start(DOUBLE_TAP_DELAY,wxTIMER_ONE_SHOT); } currentScene->ensureVisible(visibleDir); parentStatusBar->SetStatusText(TRANS("Use shift/ctrl-space or double tap to alter reset axis")); parentStatusBar->SetBackgroundColour(*wxCYAN) ; parentStatusTimer->Start(statusDelay,wxTIMER_ONE_SHOT); Refresh(); haveCameraUpdates=true; } } break; default: event.Skip(true); } } void BasicGLPane::setGlClearColour(float r, float g, float b) { ASSERT(r >= 0.0f && r <= 1.0f); ASSERT(g >= 0.0f && g <= 1.0f); ASSERT(b >= 0.0f && b <= 1.0f); currentScene->setBackgroundColour(r,g,b); Refresh(); } void BasicGLPane::keyReleased(wxKeyEvent& event) { float cameraMoveRate=CAMERA_KEYBOARD_SCROLL_RATE; if(event.ShiftDown()) cameraMoveRate*=5; bool update=true; switch(event.GetKeyCode()) { case '-': case '_': case WXK_NUMPAD_SUBTRACT: case WXK_SUBTRACT: { //Do a backwards dolly by fixed amount currentScene->getActiveCam()->forwardsDolly(cameraMoveRate); if(currentScene->haveTempCam()) currentScene->getTempCam()->forwardsDolly(cameraMoveRate); break; } case '+': case '=': case WXK_NUMPAD_ADD: case WXK_ADD: case WXK_NUMPAD_EQUAL: { //Reverse direction of motion cameraMoveRate= -cameraMoveRate; //Do a forwards dolly by fixed amount currentScene->getActiveCam()->forwardsDolly(cameraMoveRate); if(currentScene->haveTempCam()) currentScene->getTempCam()->forwardsDolly(cameraMoveRate); break; } default: event.Skip(true); update=false; } if(update) Refresh(); } void BasicGLPane::resized(wxSizeEvent& evt) { prepare3DViewport(0,0,getWidth(),getHeight()); wxClientDC *dc=new wxClientDC(this); Refresh(); #ifdef __APPLE__ requireContextUpdate=true; #endif delete dc; } bool BasicGLPane::prepare3DViewport(int tlx, int tly, int brx, int bry) { if(!paneInitialised) return false; //Prevent NaN. if(!(bry-tly)) return false; GLint dims[2]; glGetIntegerv(GL_MAX_VIEWPORT_DIMS, dims); //Ensure that the openGL function didn't tell us porkies //but double check for the non-debug builds next line ASSERT(dims[0] && dims[1]); //check for exceeding max viewport and we have some space if(dims[0] <(brx-tlx) || dims[1] < bry-tly || (!dims[0] || !dims[1] )) return false; glViewport( tlx, tly, brx-tlx, bry-tly); float aspect = (float)(brx-tlx)/(float)(bry-tly); currentScene->setWinSize(brx-tlx,bry-tly); currentScene->setAspect(aspect); //Set modelview and projection matrices to the identity // matrix { glMatrixMode( GL_PROJECTION ); glLoadIdentity(); } { glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); } return true; } int BasicGLPane::getWidth() { return GetClientSize().x; } int BasicGLPane::getHeight() { return GetClientSize().y; } void BasicGLPane::render( wxPaintEvent& evt ) { //Prevent calls to openGL if pane not visible if (!IsShown()) return; if(!context) { context = new wxGLContext(this); SetCurrent(*context); #ifdef __APPLE__ requireContextUpdate=false; #endif } if(!paneInitialised) { paneInitialised=true; prepare3DViewport(0,0,getWidth(),getHeight()); } //Apple requires a context update on each resize, for some reason // https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/OpenGL-MacProgGuide/opengl_contexts/opengl_contexts.html //and // https://forums.wxwidgets.org/viewtopic.php?f=23&t=41592&p=168346 #ifdef __APPLE__ if(requireContextUpdate) { SetCurrent(*context); prepare3DViewport(0,0,getWidth(),getHeight()); requireContextUpdate=false; } #endif wxPaintDC(this); currentScene->draw(); glFlush(); SwapBuffers(); } void BasicGLPane::OnEraseBackground(wxEraseEvent &evt) { //Do nothing. This is to help eliminate flicker apparently } void BasicGLPane::updateClearColour() { float rClear,gClear,bClear; currentScene->getBackgroundColour(rClear,gClear,bClear); //Can't set the opengl window without a proper context ASSERT(paneInitialised); setGlClearColour(rClear,gClear,bClear); //Let openGL know that we have changed the colour. glClearColor( rClear, gClear, bClear,1.0f); } TRcontext *BasicGLPane::generateTileContext(unsigned int width, unsigned int height, unsigned char *imageBuffer, bool alpha) const { int panelWidth,panelHeight; GetClientSize(&panelWidth,&panelHeight); //Create TR library tile context TRcontext *tr = trNew(); //Tile size trTileSize(tr,panelWidth,panelHeight,0); //Set overall image size trImageSize(tr, width, height); //Set buffer for overall image if(alpha) trImageBuffer(tr, GL_RGBA, GL_UNSIGNED_BYTE, imageBuffer); else trImageBuffer(tr, GL_RGB, GL_UNSIGNED_BYTE, imageBuffer); //Set the row order for the image trRowOrder(tr, TR_BOTTOM_TO_TOP); return tr; } bool BasicGLPane::saveImage(unsigned int width, unsigned int height, const char *filename, bool showProgress, bool needPostPaint) { GLint dims[2]; glGetIntegerv(GL_MAX_VIEWPORT_DIMS, dims); //Opengl should not be giving us zero dimensions here. // if it does, just abandon saving the image as a fallback ASSERT(dims[0] && dims[1]); if(!dims[0] || !dims[1]) return false; //create new image wxImage *image = new wxImage(width,height); unsigned char *imageBuffer= (unsigned char*) malloc(3*(width)*height); if(!imageBuffer) return false; glLoadIdentity(); const Camera *cm = currentScene->getActiveCam(); //We cannot seem to draw outside the current viewport. //in a cross platform manner. //fall back to stitching the image together by hand //Initialise tile data TRcontext *tr; //Inform the tiling system about our camera config float aspect=currentScene->getAspect(); { float farPlane; tr=generateTileContext(width,height, imageBuffer); BoundCube bc = currentScene->getBound(); farPlane = 1.5*bc.getMaxDistanceToBox(cm->getOrigin()); if(cm->getProjectionMode() == PROJECTION_MODE_PERSPECTIVE) { if(cm->type() == CAM_LOOKAT) { const CameraLookAt *cl =(const CameraLookAt*) currentScene->getActiveCam(); trPerspective(tr,cl->getFOV()/2.0,currentScene->getAspect(), cl->getNearPlane(),farPlane); } else { //At this time there are no cameras of this type ASSERT(false); } } else { float orthoScale = cm->getOrthoScale(); trOrtho(tr,-orthoScale*aspect,orthoScale*aspect, -orthoScale,orthoScale,0.0f,farPlane); } } //Obtain tile count from the renderer & init progress //-- unsigned int totalTiles; { unsigned int nRow,nCol,nPass; nRow=trGet(tr,TR_ROWS); nCol=trGet(tr,TR_COLUMNS); if(currentScene->hasOverlays()) nPass = 2; else nPass=1; totalTiles=nRow*nCol*nPass; } wxProgressDialog *wxD=0; showProgress=showProgress && ( totalTiles > 1); if(showProgress) { wxD = new wxProgressDialog(TRANS("Image progress"), TRANS("Rendering tiles..."), totalTiles); } //-- //We have to do two passes. First we have to // do a 3D pass, then we have to separately // draw the overlays. // As we have 2 cameras, one for the normal scene // and one for the overlay, we build the images, // then merge the images, rather than trying to composite the entire scene in situ. //PASS 1: //-------------- //HACK: Flip the all but scene's light z coordinate // for some reason, the frustum has an inversion // somewhere in the coordinate system, and I can't find it! // inverting the tile frustum ends up with the depth test // also inverting. const bool FLIP_LIGHT_HACK=true; //x,y,z and w axis. const bool IMPORTANT_AXIS[4]={true,false,true,false}; //opengl light has 4 float oldLightPos[4]; if(FLIP_LIGHT_HACK) { currentScene->getLightPos(oldLightPos); float newLightPos[4]; for(size_t ui=0;ui<4;ui++) { if(IMPORTANT_AXIS[ui]) newLightPos[ui]=oldLightPos[ui]; else newLightPos[ui]=-oldLightPos[ui]; } currentScene->setLightPos(newLightPos); } if(showProgress) wxD->Show(); //Loop through the tiles/ // note that 2D overlays will not be drawn in this pass unsigned int thisTileNum=0; int haveMoreTiles=1; while(haveMoreTiles) { thisTileNum++; //Manually set the camera //-- glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); if(cm->type() == CAM_LOOKAT) ((const CameraLookAt *)cm)->lookAt(); //-- //Start the tile trBeginTile(tr); currentScene->draw(true); glPopMatrix(); //ending the tile copies // data haveMoreTiles=trEndTile(tr); if(showProgress) wxD->Update(thisTileNum); } if(FLIP_LIGHT_HACK) { //re-set light coordinates currentScene->setLightPos(oldLightPos); } trDelete(tr); //Transfer pointer to image, which will perform free-ing of the buffer image->SetData(imageBuffer); //HACK : Tiling function returns upside-down image. Fix in post-process // argument is to set mirror axis such that x axis is unchanged *image=image->Mirror(false); //-------------- //PASS 2 //-------------- if(currentScene->hasOverlays()) { //alllocate RGBA (4-channel) image imageBuffer= (unsigned char*) malloc(4*(width)*height); if(!imageBuffer) return false; tr=generateTileContext(width,height,imageBuffer,true); trOrtho(tr,0.0f,aspect, 0.0f,1.0f,-1.0f,1.0f); haveMoreTiles=1; float rClear,gClear,bClear; currentScene->getBackgroundColour(rClear,gClear,bClear); glClearColor( rClear, gClear, bClear,0.0f); //I am unclear why, but the faces are reversed glDisable(GL_CULL_FACE); while(haveMoreTiles) { thisTileNum++; //Start the tile trBeginTile(tr); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); currentScene->drawOverlays(true); //ending the tile copies // data haveMoreTiles=trEndTile(tr); if(showProgress) wxD->Update(thisTileNum); } glEnable(GL_CULL_FACE); //restore the GL clear colour updateClearColour(); ///unpack the tile buffer into a wx image wxImage imageOverlay(width,height); imageOverlay.InitAlpha(); //FIXME: HACK - using "blue screen" effect //don't use background as mask colour. // use depth buffer or gl alpha unsigned char clear[3]; clear[0] = (unsigned char)rClear*255.0f; clear[1] = (unsigned char)gClear*255.0f; clear[2] = (unsigned char)bClear*255.0f; const unsigned char *mask = clear; copyRGBAtoWXImage(width,height,imageBuffer,imageOverlay,mask); free(imageBuffer); combineWxImage(*image,imageOverlay); //Free the tile buffer trDelete(tr); } //-------------- bool isOK=image->SaveFile(filename,wxBITMAP_TYPE_PNG); if(showProgress) wxD->Destroy(); delete image; if (needPostPaint) { wxPaintEvent event; wxPostEvent(this,event); } return isOK; } void BasicGLPane::OnAxisTapTimer(wxTimerEvent &evt) { lastKeyDoubleTap=(unsigned int)-1; } bool BasicGLPane::saveImageSequence(unsigned int resX, unsigned int resY, unsigned int nFrames, wxString &path,wxString &prefix, wxString &ext) { //OK, lets animate! // ASSERT(!currentScene->haveTempCam()); std::string outFile; wxProgressDialog *wxD = new wxProgressDialog(TRANS("Animation progress"), TRANS("Rendering sequence..."), nFrames,this,wxPD_CAN_ABORT|wxPD_APP_MODAL ); wxD->Show(); std::string tmpStr,tmpStrTwo; stream_cast(tmpStrTwo,nFrames); Camera *origCam=currentScene->getActiveCam()->clone(); for(unsigned int ui=0;uiclone(); modifiedCam->move(angle,0); currentScene->setActiveCam(modifiedCam); //Save the result outFile = string(stlStr(path))+ string("/") + string(stlStr(prefix))+digitStr+ string(".") + string(stlStr(ext)); if(!saveImage(resX,resY,outFile.c_str(),false, false)) { currentScene->setActiveCam(origCam); return false; } //Update the progress bar stream_cast(tmpStr,ui+1); //Tell user which image from the animation we are saving tmpStr = std::string(TRANS("Saving Image ")) + tmpStr + std::string(TRANS(" of ")) + tmpStrTwo + "..."; if(!wxD->Update(ui,tmpStr)) break; Refresh(); } currentScene->setActiveCam(origCam); //Discard the current temp. cam to return the scene back to normal currentScene->discardTempCam(); wxD->Destroy(); wxPaintEvent event; wxPostEvent(this,event); return true; } 3Depict-0.0.19/src/gui/dialogs/0000755000175000017500000000000012723200266015455 5ustar pcuserpcuser3Depict-0.0.19/src/gui/dialogs/rangeEditDialog.h0000644000175000017500000001657712640746376020707 0ustar pcuserpcuser// -*- C++ -*- generated by wxGlade 0.6.5 on Fri May 3 00:54:04 2013 #ifndef RANGEEDITDIALOG_H #define RANGEEDITDIALOG_H #include #include // begin wxGlade: ::dependencies #include #include #include #include // end wxGlade #include #include #include //#include "wx/checkedlistctrl.h" #include "backend/plot.h" #include "../mathglPane.h" #include "backend/APT/abundanceParser.h" class PendingRange { private: //are the start/second entries valid? bool validStart,validEnd, validParent; //Start and end of the range float start,end; //Parent ion id size_t parentId; //Range file that "owns" this pending range RangeFile *rngPtr; public: PendingRange(RangeFile *parentRange); //Obtain the range file that owns this pending range RangeFile *getRangePtr() const { return rngPtr;} //Set the end of the range void setEnd(float f) { end=f; validEnd=true;} //Set the Start of the range void setStart(float f) { start=f;validStart=true;} //Set the parent ion in the owning rangefile void setParentId(size_t v) {ASSERT(v < rngPtr->getNumIons()); parentId=v; validParent=true;} //Returns true if all the data set for the pending range is valid bool isFinished() const; //Applies the changes to the parent rangefile void commit(); //obtain range start float getStart() const; //obtain range end float getEnd() const; //obtain range parent ion name std::string getIonName() const; }; class PendingIon { private: //Range file that will own the ion when added RangeFile *rngPtr; //Range colour RGBf colour; //Short and long names for this ion std::string shortName, longName; //True if these values have been set and are valid when commited to the rangefile bool validColour, validShortName,validLongName; public: PendingIon(RangeFile *r); RangeFile *getRangePtr() const { return rngPtr;} //Set the colour of the pending ion, and set validity void setColour(const RGBf &r); //Obtain a colour for the ion (the set if valid, or a default) RGBf getColour() const; //obtain the short name for the ion, or a default (may be empty) std::string getShortName() const; //Set the short name for the ion, and set validity void setShortName(const std::string &newName); //obtain the long name for the ion, or a default (may be empty) std::string getLongName() const; //Set the long name for the ion, and set validity void setLongName(const std::string &newName); //True if the ion is fully valid bool isFinished() const; //Commit the pending ion to the rangefile void commit() const; }; class RangeEditorDialog: public wxDialog { public: // begin wxGlade: RangeEditorDialog::ids // end wxGlade RangeEditorDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); private: bool haveSetTextFocus; // begin wxGlade: RangeEditorDialog::methods void set_properties(); void do_layout(); // end wxGlade std::map listToPlotIDs; //Store the mapping between grid offsets and the // ionID (2nd in pair) for the current range std::map gridIonIds,gridRangeIds; //Currently selected range RangeFile *currentRange; //Map original range file filiter to new modified rangefile // modified rangefiles data is stored here std::map modifiedRanges; //Mapping of plot ID -> rangefile filter, for ranges that have their own parent std::map plotToRangeFileMap; //Plots that exist, but do not have a range mapping std::set ignoreList; //Mapping of plot ID -> rangefile std::map plotNewRanges; //Row value for range/ion entries that the user has not fully completed std::vector incompleteRanges; std::vector incompleteIons; //position in incomplete ion offset where the normal ranges/ions finish // and the Pending(Range/Ion)s start. size_t incompleteRangeOffset,incompleteIonOffset; //Plot data that contains information about plots to show, and // through that the original range information PlotWrapper plotWrap; size_t lastFocused; //Blocker variable to allow functions to bail out // during programatically generated events bool programmaticEvent; AbundanceData abundanceData; void setCurrentRange(size_t forceSelected=-1); void generateListEntries(); //Generate (and set) the current plot region data from stored rangefile info void generatePlotRegions(); //Generate the list of overlays void generateOverlayList(const std::vector &overlays) ; //Rebuild the range entry grid void generateRangeEntries(size_t rowVisibleHint=(size_t)-1); //Rebuild the ion entry grid void generateIonEntries(size_t rowVisibleHint=(size_t)-1); protected: // begin wxGlade: RangeEditorDialog::attributes wxListBox* listPlots; wxPanel* noteLeftPlots; wxGrid* gridRanges; wxGrid* gridIons; wxButton* btnRangeIonAdd; wxButton* btnRangeIonRemove; wxPanel* noteLeftRanges; wxCheckBox* checkShowOverlay; wxTextCtrl* textOverlayCmpnt; wxCheckListBox* listOverlay; wxPanel* noteLeftOverlay; wxNotebook* notebookLeft; wxPanel* panelSplitLeft; MathGLPane* plotPanel; wxButton* btnOK; wxButton* btnCancel; wxPanel* panelSplitRight; wxSplitterWindow* splitVertical; void setRangeReady(); // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnListPlots(wxCommandEvent &event); // wxGlade: virtual void OnGridRangesCellChange(wxGridEvent &event); // wxGlade: virtual void OnGridRangeClick(wxGridEvent &event); // wxGlade: virtual void OnGridIonClick(wxGridEvent &event); // wxGlade: virtual void OnGridRangesEditorShown(wxGridEvent &event); // wxGlade: virtual void OnGridIonsEditorShown(wxGridEvent &event); // wxGlade: virtual void OnGridIonsCellChange(wxGridEvent &event); // wxGlade: virtual void OnBtnRangeIonAdd(wxCommandEvent &event); // wxGlade: virtual void OnBtnRangeIonRemove(wxCommandEvent &event); // wxGlade: virtual void OnCheckShowOverlay(wxCommandEvent &event); // wxGlade: virtual void OnBtnOK(wxCommandEvent &event); // wxGlade: virtual void OnBtnCancel(wxCommandEvent &event); // wxGlade: virtual void OnSashVerticalDClick(wxSplitterEvent &event); // wxGlade: virtual void OnListOverlayCheck(wxCommandEvent &event); virtual void OnListOverlayKeyDown(wxListEvent &event); virtual void OnTextOverlay(wxCommandEvent &event); virtual void OnTextOverlayEnter(wxCommandEvent &event); virtual void OnTextOverlaySetFocus(wxFocusEvent &event); void onPlotUpdate(); void setPlotWrapper(const PlotWrapper &p); //Obtain a pointer to the modified range. The pointer is only valid for the lifetime of the dialog void getModifiedRanges(std::map &modRanges) const; virtual ~RangeEditorDialog(); }; // wxGlade: end class #endif // RANGEEDITDIALOG_H 3Depict-0.0.19/src/gui/dialogs/ExportPos.h0000644000175000017500000000744012640746376017615 0ustar pcuserpcuser/* * ExportPos.h - Point data export dialog * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #ifndef EXPORTPOS_H #define EXPORTPOS_H // begin wxGlade: ::dependencies // end wxGlade // begin wxGlade: ::extracode // end wxGlade #include "backend/filtertree.h" class ExportPosDialog: public wxDialog { public: // begin wxGlade: ExportPosDialog::ids // end wxGlade ExportPosDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); ~ExportPosDialog(); private: FilterTree filterTree; std::map filterMap; //!Have we refreshed the filterstream data list? bool haveRefreshed; //!Should we be exporting selected ions (false) or visible ions (true) bool exportVisible; //!List containing filter and ion streams to export std::list > > outputData; //!vector containing currently available filter streams std::vector availableFilterData; //List containing currently selected filter streams std::list selectedFilterData; //!Use selectedFilterData to draw wx widget void updateSelectedList(); // begin wxGlade: ExportPosDialog::methods void set_properties(); void do_layout(); // end wxGlade protected: // begin wxGlade: ExportPosDialog::attributes wxStaticText* lblExport; wxRadioButton* radioVisible; wxRadioButton* radioSelection; wxTreeCtrl* treeData; wxStaticText* lblAvailableData; wxListCtrl* listAvailable; wxButton* btnAddData; wxButton* btnAddNode; wxButton* btnAddAll; wxPanel* panel_2; wxStaticText* label_4; wxListCtrl* listSelected; wxButton* btnSave; wxButton* btnCancel; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnVisibleRadio(wxCommandEvent &event); // wxGlade: virtual void OnSelectedRadio(wxCommandEvent &event); // wxGlade: virtual void OnTreeFiltersSelChanged(wxTreeEvent &event); // wxGlade: virtual void OnBtnAddAll(wxCommandEvent &event); // wxGlade: virtual void OnBtnAddData(wxCommandEvent &event); // wxGlade: virtual void OnBtnAddNode(wxCommandEvent &event); // wxGlade: virtual void OnSave(wxCommandEvent &event); // wxGlade: virtual void OnCancel(wxCommandEvent &event); // wxGlade: virtual void OnListAvailableItemActivate(wxListEvent &event); // wxGlade: virtual void OnListSelectedItemActivate(wxListEvent &event); // wxGlade: virtual void OnListSelectedItemKeyDown(wxListEvent &event); // wxGlade: void initialiseData(FilterTree &f); void enableSelectionControls(bool enabled); void getExportVec(std::vector &v) const; void swapFilterTree(FilterTree &f) { f.swap(filterTree);haveRefreshed=false;} }; // wxGlade: end class #endif // EXPORTPOS_H 3Depict-0.0.19/src/gui/dialogs/ExportRngDialog.cpp0000644000175000017500000002022512716174467021251 0ustar pcuserpcuser/* * ExportRngDialog.cpp - "Range" data export dialog * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "ExportRngDialog.h" #include "wx/wxcommon.h" #include "backend/filters/rangeFile.h" #include // begin wxGlade: ::extracode // end wxGlade enum { ID_LIST_ACTIVATE=wxID_ANY+1, }; ExportRngDialog::ExportRngDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) { // begin wxGlade: ExportRngDialog::ExportRngDialog lblRanges = new wxStaticText(this, wxID_ANY, TRANS("Range Sources")); listRanges = new wxListCtrl(this, ID_LIST_ACTIVATE, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER); label_3 = new wxStaticText(this, wxID_ANY, TRANS("Details")); gridDetails = new wxGrid(this, wxID_ANY); btnOK = new wxButton(this, wxID_SAVE, wxEmptyString); btnCancel = new wxButton(this, wxID_CANCEL, wxEmptyString); btnOK->SetFocus(); set_properties(); do_layout(); // end wxGlade //Add columns to report listviews listRanges->InsertColumn(0,TRANS("Source Filter")); listRanges->InsertColumn(1,TRANS("Ions")); listRanges->InsertColumn(2,TRANS("Ranges")); } BEGIN_EVENT_TABLE(ExportRngDialog, wxDialog) // begin wxGlade: ExportRngDialog::event_table EVT_LIST_ITEM_ACTIVATED(ID_LIST_ACTIVATE, ExportRngDialog::OnListRangeItemActivate) EVT_BUTTON(wxID_SAVE, ExportRngDialog::OnSave) EVT_BUTTON(wxID_CANCEL, ExportRngDialog::OnCancel) // end wxGlade END_EVENT_TABLE(); void ExportRngDialog::OnListRangeItemActivate(wxListEvent &event) { updateGrid(event.GetIndex()); selectedRange=event.GetIndex(); } void ExportRngDialog::updateGrid(unsigned int index) { const RangeFileFilter *rangeData; rangeData=(RangeFileFilter *)rngFilters[index]; gridDetails->BeginBatch(); if (gridDetails->GetNumberCols()) gridDetails->DeleteCols(0,gridDetails->GetNumberCols()); if (gridDetails->GetNumberRows()) gridDetails->DeleteRows(0,gridDetails->GetNumberRows()); gridDetails->AppendCols(3); gridDetails->SetColLabelValue(0,TRANS("Param")); gridDetails->SetColLabelValue(1,TRANS("Value")); gridDetails->SetColLabelValue(2,TRANS("Value2")); unsigned int nRows; nRows=rangeData->getRange().getNumIons()+rangeData->getRange().getNumRanges() + 4; gridDetails->AppendRows(nRows); gridDetails->SetCellValue(0,0,TRANS("Ion Name")); gridDetails->SetCellValue(0,1,TRANS("Num Ranges")); unsigned int row=1; std::string tmpStr; unsigned int maxNum; maxNum=rangeData->getRange().getNumIons(); //Add ion data, then range data for(unsigned int ui=0;uiSetCellValue(row,0,(rangeData->getRange().getName(ui))); stream_cast(tmpStr,rangeData->getRange().getNumRanges(ui)); gridDetails->SetCellValue(row,1,(tmpStr)); row++; } row++; gridDetails->SetCellValue(row,0,TRANS("Ion")); gridDetails->SetCellValue(row,1,TRANS("Range Start")); gridDetails->SetCellValue(row,2,TRANS("Range end")); row++; maxNum=rangeData->getRange().getNumRanges(); for(unsigned int ui=0;ui rngPair; unsigned int ionID; rngPair=rangeData->getRange().getRange(ui); ionID=rangeData->getRange().getIonID(ui); gridDetails->SetCellValue(row,0, (rangeData->getRange().getName(ionID))); stream_cast(tmpStr,rngPair.first); gridDetails->SetCellValue(row,1,(tmpStr)); stream_cast(tmpStr,rngPair.second); gridDetails->SetCellValue(row,2,(tmpStr)); row++; } gridDetails->EndBatch(); } void ExportRngDialog::OnSave(wxCommandEvent &event) { if(rngFilters.empty()) EndModal(wxID_CANCEL); //create a file chooser for later. wxFileDialog *wxF = new wxFileDialog(this,TRANS("Save pos..."), wxT(""), wxT(""),TRANS("Cameca/Ametek RRNG (*.rrng)|*.rrng|ORNL format RNG (*.rng)|*.rng|Cameca ENV (*.env)|*.env|All Files (*)|*"),wxFD_SAVE); //Show, then check for user cancelling export dialog if(wxF->ShowModal() == wxID_CANCEL) { wxF->Destroy(); return; } std::string dataFile = stlStr(wxF->GetPath()); unsigned int selectedFormat= wxF->GetFilterIndex(); unsigned int rngFormat=RANGE_FORMAT_RRNG; switch(selectedFormat) { case 0: rngFormat=RANGE_FORMAT_RRNG; break; case 1: rngFormat=RANGE_FORMAT_ORNL; break; case 2: rngFormat=RANGE_FORMAT_ENV; break; default: ASSERT(false); } if(((RangeFileFilter *)(rngFilters[selectedRange]))-> getRange().write(dataFile.c_str(),rngFormat)) { std::string errString; errString=TRANS("Unable to save. Check output destination can be written to."); wxMessageDialog *wxD =new wxMessageDialog(this,(errString) ,TRANS("Save error"),wxOK|wxICON_ERROR); wxD->ShowModal(); wxD->Destroy(); return; } EndModal(wxID_OK); } void ExportRngDialog::OnCancel(wxCommandEvent &event) { EndModal(wxID_CANCEL); } // wxGlade: add ExportRngDialog event handlers void ExportRngDialog::addRangeData(std::vector rangeData) { #ifdef DEBUG //This function should only receive rangefile filters for(unsigned int ui=0;uigetType() == FILTER_TYPE_RANGEFILE); #endif rngFilters.resize(rangeData.size()); std::copy(rangeData.begin(),rangeData.end(),rngFilters.begin()); updateRangeList(); if(rangeData.size()) { //Use the first item to populate the grid updateGrid(0); //select the first item listRanges->SetItemState(0, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); selectedRange=0; } } void ExportRngDialog::updateRangeList() { listRanges->DeleteAllItems(); for(unsigned int ui=0;uiInsertItem(0, (rangeData->getUserString())); unsigned int nIons,nRngs; nIons = rangeData->getRange().getNumIons(); nRngs = rangeData->getRange().getNumIons(); stream_cast(tmpStr,nIons); listRanges->SetItem(itemIndex, 1, (tmpStr)); stream_cast(tmpStr,nRngs); listRanges->SetItem(itemIndex, 2, (tmpStr)); } } void ExportRngDialog::set_properties() { // begin wxGlade: ExportRngDialog::set_properties SetTitle(TRANS("Export Range")); gridDetails->CreateGrid(0, 0); gridDetails->SetRowLabelSize(0); gridDetails->SetColLabelSize(0); listRanges->SetToolTip(TRANS("List of rangefiles in filter tree")); gridDetails->EnableEditing(false); gridDetails->SetToolTip(TRANS("Detailed view of selected range")); // end wxGlade } void ExportRngDialog::do_layout() { // begin wxGlade: ExportRngDialog::do_layout wxBoxSizer* sizer_2 = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizer_3 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_14 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_15 = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizer_16 = new wxBoxSizer(wxVERTICAL); sizer_16->Add(lblRanges, 0, wxLEFT|wxTOP, 5); sizer_16->Add(listRanges, 1, wxALL|wxEXPAND, 5); sizer_14->Add(sizer_16, 1, wxEXPAND, 0); sizer_14->Add(10, 20, 0, 0, 0); sizer_15->Add(label_3, 0, wxLEFT|wxTOP, 5); sizer_15->Add(gridDetails, 1, wxALL|wxEXPAND, 5); sizer_14->Add(sizer_15, 1, wxEXPAND, 0); sizer_2->Add(sizer_14, 1, wxEXPAND, 0); sizer_3->Add(20, 20, 1, 0, 0); sizer_3->Add(btnOK, 0, wxALL, 5); sizer_3->Add(btnCancel, 0, wxALL, 5); sizer_2->Add(sizer_3, 0, wxEXPAND, 0); SetSizer(sizer_2); sizer_2->Fit(this); Layout(); // end wxGlade } 3Depict-0.0.19/src/gui/dialogs/filterErrorDialog.h0000644000175000017500000000347412640746376021274 0ustar pcuserpcuser/* * filterErrorDialog.h - Dialog for displaying error notices computed from filter tree * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.3 on Sun Jun 24 00:03:00 2012 #include #include // begin wxGlade: ::dependencies // end wxGlade #ifndef FILTERERRORDIALOG_H #define FILTERERRORDIALOG_H // begin wxGlade: ::extracode // end wxGlade class FilterErrorDialog: public wxDialog { public: // begin wxGlade: FilterErrorDialog::ids // end wxGlade FilterErrorDialog(wxWindow* parent, int id=wxID_ANY, const wxString& title=wxT(""), const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); void SetText(const std::vector &text); private: // begin wxGlade: FilterErrorDialog::methods void set_properties(); void do_layout(); // end wxGlade protected: // begin wxGlade: FilterErrorDialog::attributes wxTextCtrl* textErrorMessage; wxStaticBitmap* bitmapError; wxStaticText* labelError; wxStaticBitmap* bitmapWarning; wxStaticText* labelWarning; wxButton* btnOK; // end wxGlade }; // wxGlade: end class #endif // FILTERERRORDIALOG_H 3Depict-0.0.19/src/gui/dialogs/animateFilterDialog.cpp0000644000175000017500000011255012720725230022071 0ustar pcuserpcuser/* * animateFilterDialog.cpp - Framewise animation of filter properties * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade b48da20df8f4++ on Mon May 7 22:48:14 2012 #include "animateFilterDialog.h" #include "resolutionDialog.h" #include "wx/propertyGridUpdater.h" #include "./animateSubDialogs/realKeyFrameDialog.h" #include "./animateSubDialogs/colourKeyFrameDialog.h" #include "./animateSubDialogs/stringKeyFrameDialog.h" #include "./animateSubDialogs/choiceKeyFrameDialog.h" // begin wxGlade: ::extracode // end wxGlade #include #include "common/translation.h" #include "common/stringFuncs.h" #include "wx/wxcomponents.h" enum { ID_FILTER_TREE_CTRL, ID_PROPERTY_GRID, ID_ANIMATION_GRID_CTRL, ID_BUTTON_FRAME_REMOVE, ID_TEXTBOX_WORKDIR, ID_BUTTON_WORKDIR, ID_CHECK_IMAGE_OUT, ID_TEXTBOX_IMAGEPREFIX, ID_TEXTBOX_IMAGESIZE, ID_BUTTON_IMAGE_RES, ID_CHECK_ONLYDATACHANGE, ID_CHECK_POINT_OUT, ID_CHECK_PLOT_OUT, ID_CHECK_VOXEL_OUT, ID_CHECK_RANGE_OUT, ID_COMBO_RANGE_TYPE, ID_SPLIT_FILTERVIEW, ID_FRAME_SLIDER, ID_FRAME_TEXTBOX, ID_BTN_OK, ID_BTN_CANCEL, ID_FILTER_PROPERTY_VALUE_GRID }; enum { CELL_FILTERNAME, CELL_PROPERTYNAME, CELL_KEYINTERPMODE, CELL_STARTFRAME, CELL_ENDFRAME }; enum { FRAME_CELL_FILTERNAME, FRAME_CELL_PROPNAME, FRAME_CELL_VALUE }; const size_t RANGE_FORMAT_NUM_OPTIONS=3; //TODO: This should be merged into aptclasses? const char *extension[RANGE_FORMAT_NUM_OPTIONS] = { "rrng", "rng", "env" }; const char * comboRange_choices[RANGE_FORMAT_NUM_OPTIONS] = { NTRANS("Cameca/Ametek RRNG"), NTRANS("Oak-Ridge RNG"), NTRANS("Cameca/Ametek ENV") }; using std::string; using std::cout; using std::endl; using std::pair; using std::vector; using std::set; using std::map; template bool getRealKeyFrame(FrameProperties &frameProp, FilterProperty &filterProp, RealKeyFrameDialog *r) { if( r->ShowModal() != wxID_OK) { r->Destroy(); return false; } //Copy out the data obtained from the dialog size_t transitionMode; T value; transitionMode=r->getTransitionMode(); frameProp.setInterpMode(transitionMode); value=r->getStartValue(); stream_cast(filterProp.data,value); frameProp.addKeyFrame(r->getStartFrame(),filterProp); //Add end value as needed switch(transitionMode) { case TRANSITION_STEP: break; case TRANSITION_INTERP: value=r->getEndValue(); stream_cast(filterProp.data,value); frameProp.addKeyFrame(r->getEndFrame(),filterProp); break; default: ASSERT(false); } r->Destroy(); return true; } ExportAnimationDialog::ExportAnimationDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxMAXIMIZE_BOX|wxMINIMIZE_BOX) { // begin wxGlade: ExportAnimationDialog::ExportAnimationDialog viewNotebook = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0); frameViewPane = new wxPanel(viewNotebook, wxID_ANY); filterViewPane = new wxPanel(viewNotebook, wxID_ANY); splitPaneFilter = new wxSplitterWindow(filterViewPane, ID_SPLIT_FILTERVIEW, wxDefaultPosition, wxDefaultSize, wxSP_3D|wxSP_BORDER); filterRightPane = new wxPanel(splitPaneFilter, wxID_ANY); filterLeftPane = new wxPanel(splitPaneFilter, wxID_ANY); keyFramesSizer_staticbox = new wxStaticBox(filterRightPane, -1, TRANS("Key frames")); outputDataSizer_staticbox = new wxStaticBox(frameViewPane, -1, TRANS("Output Data")); filterPropertySizer_staticbox = new wxStaticBox(filterLeftPane, -1, TRANS("Filters and properties")); filterTreeCtrl =new wxTreeCtrl(filterLeftPane,ID_FILTER_TREE_CTRL , wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS|wxTR_NO_LINES|wxTR_HIDE_ROOT|wxTR_DEFAULT_STYLE|wxSUNKEN_BORDER|wxTR_EDIT_LABELS); propertyGrid = new wxPropertyGrid(filterLeftPane, ID_PROPERTY_GRID,wxDefaultPosition,wxDefaultSize,PROPERTY_GRID_STYLE); animationGrid = new wxGrid(filterRightPane, ID_ANIMATION_GRID_CTRL); keyFrameRemoveButton = new wxButton(filterRightPane, wxID_REMOVE, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); labelWorkDir = new wxStaticText(frameViewPane, wxID_ANY, TRANS("Dir : ")); textWorkDir = new wxTextCtrl(frameViewPane, ID_TEXTBOX_WORKDIR, wxEmptyString); buttonWorkDir = new wxButton(frameViewPane, wxID_OPEN, wxEmptyString); checkOutOnlyChanged = new wxCheckBox(frameViewPane, ID_CHECK_ONLYDATACHANGE, TRANS("Output only when refresh required")); outputDataSepLine = new wxStaticLine(frameViewPane, wxID_ANY); labelDataType = new wxStaticText(frameViewPane, wxID_ANY, TRANS("Data Types:")); checkImageOutput = new wxCheckBox(frameViewPane, ID_CHECK_IMAGE_OUT, TRANS("3D Images")); lblImageName = new wxStaticText(frameViewPane, wxID_ANY, TRANS("File Prefix: ")); textImageName = new wxTextCtrl(frameViewPane, ID_TEXTBOX_IMAGEPREFIX, wxEmptyString); labelImageSize = new wxStaticText(frameViewPane, wxID_ANY, TRANS("Size : ")); textImageSize = new wxTextCtrl(frameViewPane, ID_TEXTBOX_IMAGESIZE, wxEmptyString, wxDefaultPosition,wxDefaultSize, wxTE_READONLY ); buttonImageSize = new wxButton(frameViewPane, ID_BUTTON_IMAGE_RES, TRANS("...")); checkPoints = new wxCheckBox(frameViewPane, ID_CHECK_POINT_OUT, TRANS("Point data")); checkPlotData = new wxCheckBox(frameViewPane, ID_CHECK_PLOT_OUT, TRANS("Plots")); checkVoxelData = new wxCheckBox(frameViewPane, ID_CHECK_VOXEL_OUT, TRANS("Voxel data")); checkRangeData = new wxCheckBox(frameViewPane, ID_CHECK_RANGE_OUT, TRANS("Range files")); labelRangeFormat = new wxStaticText(frameViewPane, wxID_ANY, TRANS("Format")); //Workaround for wx bug http://trac.wxwidgets.org/ticket/4398 wxSortedArrayString rangeNames; for(unsigned int ui=0;uicomboRange_choices offset. rangeMap[TRANS(str)] = ui; //Add to filter name wxArray wxString wxStrTrans = TRANS(str); rangeNames.Add(wxStrTrans); } comboRangeFormat = new wxChoice(frameViewPane, ID_COMBO_RANGE_TYPE, wxDefaultPosition, wxDefaultSize, rangeNames); comboRangeFormat->SetSelection(0); static_line_1 = new wxStaticLine(frameViewPane, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL); labelFrame = new wxStaticText(frameViewPane, wxID_ANY, TRANS("Frame")); frameSlider = new wxSlider(frameViewPane, ID_FRAME_SLIDER, 0, 0, 1); textFrame = new wxTextCtrl(frameViewPane, ID_FRAME_TEXTBOX, wxEmptyString); framePropGrid = new wxGrid(frameViewPane, ID_FILTER_PROPERTY_VALUE_GRID); cancelButton = new wxButton(this, wxID_CANCEL, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); okButton = new wxButton(this, wxID_OK, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); set_properties(); do_layout(); // end wxGlade //Manually tuned splitter parameters splitPaneFilter->SetMinimumPaneSize(220); int w, h; GetClientSize(&w,&h); float sashFrac=0.4; splitPaneFilter->SetSashPosition((int)(sashFrac*w)); programmaticEvent=true; //-- set up the default properties for dialog back-end data //Plot check status wantPlotOutput=checkPlotData->IsChecked(); wantImageOutput=checkImageOutput->IsChecked(); wantIonOutput=checkPoints->IsChecked(); wantPlotOutput=checkPlotData->IsChecked(); wantVoxelOutput=checkVoxelData->IsChecked(); wantRangeOutput=checkRangeData->IsChecked(); wantOnlyChanges=checkOutOnlyChanged->IsChecked(); comboRangeFormat->Enable(checkRangeData->IsChecked()); rangeExportMode=RANGE_FORMAT_RRNG; currentFrame=0; existsConflicts=false; //--- programmaticEvent=false; } ExportAnimationDialog::~ExportAnimationDialog() { filterTree=0; } BEGIN_EVENT_TABLE(ExportAnimationDialog, wxDialog) // begin wxGlade: ExportAnimationDialog::event_table EVT_TREE_SEL_CHANGED(ID_FILTER_TREE_CTRL, ExportAnimationDialog::OnFilterTreeCtrlSelChanged) EVT_PG_SELECTED(ID_PROPERTY_GRID, ExportAnimationDialog::OnFilterGridCellSelected) EVT_PG_CHANGING(ID_PROPERTY_GRID, ExportAnimationDialog::OnFilterGridCellChanging) EVT_TREE_SEL_CHANGED(ID_FILTER_TREE_CTRL, ExportAnimationDialog::OnFilterTreeCtrlSelChanged) EVT_GRID_CMD_EDITOR_SHOWN(ID_FILTER_TREE_CTRL, ExportAnimationDialog::OnAnimateGridCellEditorShow) EVT_SPLITTER_UNSPLIT(ID_SPLIT_FILTERVIEW, ExportAnimationDialog::OnFilterViewUnsplit) EVT_BUTTON(wxID_REMOVE, ExportAnimationDialog::OnButtonKeyFrameRemove) EVT_TEXT(ID_TEXTBOX_WORKDIR, ExportAnimationDialog::OnOutputDirText) EVT_BUTTON(wxID_OPEN, ExportAnimationDialog::OnButtonWorkDir) EVT_CHECKBOX(ID_CHECK_ONLYDATACHANGE, ExportAnimationDialog::OnCheckOutDataChange) EVT_CHECKBOX(ID_CHECK_IMAGE_OUT, ExportAnimationDialog::OnCheckImageOutput) EVT_TEXT(ID_TEXTBOX_IMAGEPREFIX, ExportAnimationDialog::OnImageFilePrefix) EVT_BUTTON(ID_BUTTON_IMAGE_RES, ExportAnimationDialog::OnBtnResolution) EVT_CHECKBOX(ID_CHECK_POINT_OUT, ExportAnimationDialog::OnCheckPointOutput) EVT_CHECKBOX(ID_CHECK_PLOT_OUT, ExportAnimationDialog::OnCheckPlotOutput) EVT_CHECKBOX(ID_CHECK_VOXEL_OUT, ExportAnimationDialog::OnCheckVoxelOutput) EVT_CHECKBOX(ID_CHECK_RANGE_OUT, ExportAnimationDialog::OnCheckRangeOutput) EVT_CHOICE(ID_COMBO_RANGE_TYPE, ExportAnimationDialog::OnRangeTypeCombo) EVT_COMMAND_SCROLL(ID_FRAME_SLIDER, ExportAnimationDialog::OnFrameViewSlider) EVT_TEXT(ID_FRAME_TEXTBOX, ExportAnimationDialog::OnTextFrame) EVT_BUTTON(ID_BTN_CANCEL, ExportAnimationDialog::OnButtonCancel) EVT_BUTTON(ID_BTN_OK, ExportAnimationDialog::OnButtonOK) // end wxGlade END_EVENT_TABLE(); void ExportAnimationDialog::setDefImSize(unsigned int w, unsigned int h) { imageWidth=w; imageHeight=h; string sFirst,sSecond; stream_cast(sFirst,imageWidth); stream_cast(sSecond,imageHeight); textImageSize->SetValue((string(sFirst+string("x")+sSecond))); imageSizeOK=true; } bool ExportAnimationDialog::getModifiedTree(size_t frame, FilterTree &t,bool &needsUp) const { vector propsAtFrame; vector propIds; propertyAnimator.getPropertiesAtFrame(frame,propIds,propsAtFrame); needsUp=false; for(size_t ui=0;ui > &pathMapping) { //Copy the animation state propertyAnimator=prop; vector > newMapping; //Obtain our updated mapping getPathMapping(newMapping,true); map idRemap; //TODO: Smarter algorithm (sort & compare heads) // - also better handling of renaming for nonces. for(size_t ui=0;ui we need to examine the animation state, and only // keep paths we recognise, rewriting the id values propertyAnimator.updateMappings(idRemap); } void ExportAnimationDialog::prepare() { vector dummyVec; upWxTreeCtrl(*filterTree,filterTreeCtrl,filterMap, dummyVec,NULL); updateOKButton(); } void ExportAnimationDialog::updateFilterViewGrid() { //Empty the grid animationGrid->BeginBatch(); if(animationGrid->GetNumberRows()) animationGrid->DeleteRows(0,animationGrid->GetNumberRows()); animationGrid->AppendRows(propertyAnimator.getNumProps()); for(size_t ui=0;uigetProperties(filtPropGroup); FilterProperty filtProp; filtProp=filtPropGroup.getPropValue(frameProps.getPropertyKey()); animationGrid->SetCellValue(ui,CELL_FILTERNAME, (filterPtr->getUserString())); animationGrid->SetCellValue(ui,CELL_PROPERTYNAME, (filtProp.name)); animationGrid->SetCellValue(ui,CELL_KEYINTERPMODE, (INTERP_NAME[frameProps.getInterpMode()])); string str; stream_cast(str,frameProps.getMinFrame()); animationGrid->SetCellValue(ui,CELL_STARTFRAME, (str)); stream_cast(str,frameProps.getMaxFrame()); animationGrid->SetCellValue(ui,CELL_ENDFRAME, (str)); } animationGrid->EndBatch(); //Check for conflicting rows in the animation dialog, // and highlight them in colour set conflictRows; if(!propertyAnimator.checkSelfConsistent(conflictRows)) { existsConflicts=true; for(std::set::const_iterator it=conflictRows.begin(); it!=conflictRows.end();++it) { wxGridCellAttr *colourRowAttr=new wxGridCellAttr; colourRowAttr->SetBackgroundColour(wxColour(*wxCYAN)); animationGrid->SetRowAttr(*it,colourRowAttr); } } } void ExportAnimationDialog::updateFrameViewGrid() { ASSERT(currentFrame <= frameSlider->GetMax()); //Empty the grid framePropGrid->BeginBatch(); if(framePropGrid->GetNumberRows()) framePropGrid->DeleteRows(0,animationGrid->GetNumberRows()); framePropGrid->EndBatch(); std::set conflictProps; if(!propertyAnimator.checkSelfConsistent(conflictProps)) return; vector alteredProperties; vector propertyIds; //Grab the properties that have been modified from their initial value // and then refill the grid with this data propertyAnimator.getPropertiesAtFrame(currentFrame, propertyIds,alteredProperties); framePropGrid->AppendRows(alteredProperties.size()); for(size_t ui=0; uigetUserString(); FilterPropGroup p; FilterProperty prop; //obtain filter properties filterMap.at(idFilter)->getProperties(p); prop=p.getPropValue(alteredProperties[ui].getPropertyKey()); propertyName=prop.name; std::string animatedValue; animatedValue=propertyAnimator.getInterpolatedFilterData( alteredProperties[ui].getFilterId(),prop.key,currentFrame); //-- //Modify the grid properties with the appropriate data framePropGrid->SetCellValue(ui,FRAME_CELL_FILTERNAME, (filterName)); framePropGrid->SetCellValue(ui,FRAME_CELL_PROPNAME, (propertyName)); framePropGrid->SetCellValue(ui,FRAME_CELL_VALUE, (animatedValue)); } } void ExportAnimationDialog::updateFrameViewSlider() { programmaticEvent=true; //reset the range on the frame slider size_t maxFrameVal; maxFrameVal=propertyAnimator.getMaxFrame(); frameSlider->SetMin(0); frameSlider->SetMax(maxFrameVal); //Update the textbox std::string textCurrent,textMax; stream_cast(textCurrent,frameSlider->GetValue()); stream_cast(textMax,propertyAnimator.getMaxFrame()); textCurrent= (textCurrent + std::string("/") + textMax); textFrame->SetValue( (textCurrent)); programmaticEvent=false; } void ExportAnimationDialog::OnTextFrame(wxCommandEvent &event) { if(programmaticEvent) return; string s; s=stlStr(textFrame->GetValue()); bool parseOK=true; size_t pos; size_t frameCur; pos = s.find('/'); if(pos==string::npos) parseOK=false; else { string first,last; first = s.substr(0,pos); last=s.substr(pos+1); if(stream_cast(frameCur,first)) parseOK=false; size_t frameEnd; if(stream_cast(frameEnd,last)) parseOK=false; } if(!parseOK) textFrame->SetBackgroundColour(*wxCYAN); else { textFrame->SetBackgroundColour(wxNullColour); currentFrame=frameCur; updateFrameViewGrid(); } imageSizeOK=parseOK; update(); } void ExportAnimationDialog::OnFrameViewSlider(wxScrollEvent &event) { programmaticEvent=true; size_t sliderVal=frameSlider->GetValue(); std::string frameText,tmp; stream_cast(frameText,sliderVal); frameText+= "/"; stream_cast(tmp,frameSlider->GetMax()); frameText+=tmp; textFrame->SetValue( (frameText)); currentFrame=sliderVal; updateFrameViewGrid(); programmaticEvent=false; } void ExportAnimationDialog::OnButtonCancel(wxCommandEvent &event) { event.Skip(); } void ExportAnimationDialog::update() { programmaticEvent=true; updateFilterViewGrid(); updateFrameViewGrid(); updateFrameViewSlider(); updateOKButton(); programmaticEvent=false; } void ExportAnimationDialog::OnFilterTreeCtrlSelChanged(wxTreeEvent &event) { //Get the parent filter pointer wxTreeItemId id=filterTreeCtrl->GetSelection();; if(id !=filterTreeCtrl->GetRootItem() && id.IsOk()) { wxTreeItemData *parentData=filterTreeCtrl->GetItemData(id); updateFilterPropertyGrid(propertyGrid, filterMap[((wxTreeUint *)parentData)->value],""); } event.Skip(); } void ExportAnimationDialog::OnFilterGridCellChanging(wxPropertyGridEvent &event) { //very odd behaviour. Bool options trigger the first time, but // not on the second time. Perhaps we can veto the event // dynamically to catch this case? event.SetValidationFailureBehavior(0); event.Veto(); } void ExportAnimationDialog::OnFilterGridCellSelected(wxPropertyGridEvent &event) { event.Veto(); wxTreeItemId tId=filterTreeCtrl->GetSelection();; if(tId ==filterTreeCtrl->GetRootItem() || !tId.IsOk()) return; //Get the filter ID value size_t filterId; wxTreeItemData *tData=filterTreeCtrl->GetItemData(tId); filterId = ((wxTreeUint *)tData)->value; //grab the key from the property grid size_t key; std::string keyStr; wxPGProperty *pgp; pgp= event.GetProperty(); if(!pgp) { cerr << "wxBUG: wx returned a null item for the event's property. THat makes no sense." << endl; event.Veto(); return; } keyStr=event.GetProperty()->GetName(); if(stream_cast(key,keyStr)) { cerr << "Wx bug? Should not be firing on a column that has no key" << endl; return; } cerr << "Keystr was :" << keyStr << endl; const Filter *f; f=filterMap.at(filterId); //Obtain the filter property that was selected by the user //-- FilterPropGroup propGroup; f->getProperties(propGroup); FilterProperty filterProp; filterProp=propGroup.getPropValue(key); //-- //Create a property entry for this, and get values from user FrameProperties frameProp(filterId,key); switch(filterProp.type) { case PROPERTY_TYPE_BOOL: { wxTextEntryDialog *teD = new wxTextEntryDialog(this,TRANS("transition frame"),TRANS("Frame count"), wxT("0"),(long int)wxOK|wxCANCEL); std::string s; size_t frameValue; do { if(teD->ShowModal() == wxID_CANCEL) { teD->Destroy(); return; } s=stlStr(teD->GetValue()); } while(stream_cast(frameValue,s)); ASSERT(filterProp.data == "1" || filterProp.data == "0"); //Find the last property for the filter from the animator // if available std::string sData; sData=propertyAnimator.getInterpolatedFilterData(filterId, key,std::min(frameValue, propertyAnimator.getMaxFrame())); if(!sData.empty()) { ASSERT(sData == "0" || sData == "1"); filterProp.data=sData; } //Flip the data if(filterProp.data == "1") filterProp.data="0"; else filterProp.data="1"; frameProp.setInterpMode(INTERP_STEP); frameProp.addKeyFrame(frameValue,filterProp); teD->Destroy(); break; } case PROPERTY_TYPE_CHOICE: { vector choiceVec; unsigned int activeChoice; choiceStringToVector(filterProp.data,choiceVec,activeChoice); ChoiceKeyFrameDialog *cD = new ChoiceKeyFrameDialog(this, wxID_ANY,wxT("")); cD->setChoices(choiceVec); if( cD->ShowModal() != wxID_OK) { cD->Destroy(); return; } filterProp.data=cD->getChoice(); frameProp.setInterpMode(INTERP_STEP); frameProp.addKeyFrame(cD->getStartFrame(),filterProp); cD->Destroy(); break; } case PROPERTY_TYPE_COLOUR: { ColourKeyFrameDialog *colDlg = new ColourKeyFrameDialog(this, wxID_ANY,TRANS("Key frame : Colour")) ; if( colDlg->ShowModal() != wxID_OK) { colDlg->Destroy(); return; } //Copy out the data obtained from the dialog size_t transitionMode; transitionMode=colDlg->getTransitionMode(); frameProp.setInterpMode(transitionMode); filterProp.data=colDlg->getStartValue(); frameProp.addKeyFrame(colDlg->getStartFrame(),filterProp); //Add end value as needed switch(transitionMode) { case TRANSITION_STEP: break; case TRANSITION_INTERP: filterProp.data=colDlg->getEndValue(); frameProp.setInterpMode(INTERP_LINEAR_COLOUR); frameProp.addKeyFrame(colDlg->getEndFrame(),filterProp); break; default: ASSERT(false); } colDlg->Destroy(); break; } case PROPERTY_TYPE_STRING: { //Create and show the string keyframe input dialog StringKeyFrameDialog *sd = new StringKeyFrameDialog(this, wxID_ANY,wxT("")); if(sd->ShowModal() != wxID_OK) { sd->Destroy(); return; } //set the interpolator to step-by-step interp frameProp.setInterpMode(INTERP_LIST); //Grab the data vector we need to insert the keyframes vector dataVec; if(!sd->getStrings(dataVec)) { sd->Destroy(); wxMessageDialog *wxD =new wxMessageDialog(this, TRANS("File existed, but was unable to read or interpret file contents."), TRANS("String load failed"),wxICON_ERROR|wxOK); wxD->ShowModal(); wxD->Destroy(); return; } for(size_t ui=0;uigetStartFrame()+ui,filterProp); } sd->Destroy(); break; } case PROPERTY_TYPE_REAL: { RealKeyFrameDialog *r = new RealKeyFrameDialog(this, wxID_ANY,TRANS("Keyframe : decimal")); if(!getRealKeyFrame(frameProp,filterProp,r)) return; frameProp.setInterpMode(r->getTransitionMode()); break; } case PROPERTY_TYPE_INTEGER: { RealKeyFrameDialog *r = new RealKeyFrameDialog(this, wxID_ANY,TRANS("Keyframe : integer")); if(!getRealKeyFrame(frameProp,filterProp,r)) return; frameProp.setInterpMode(r->getTransitionMode()); break; } case PROPERTY_TYPE_POINT3D: { RealKeyFrameDialog *r = new RealKeyFrameDialog(this, wxID_ANY,TRANS("Keyframe : 3D Point")); if(!getRealKeyFrame(frameProp,filterProp,r)) return; //Animator needs special Linear ramping code, so select that // if user chooses a linear ramp if(frameProp.getInterpMode()==INTERP_LINEAR_FLOAT) frameProp.setInterpMode(INTERP_LINEAR_POINT3D); else frameProp.setInterpMode(r->getTransitionMode()); break; } default: ASSERT(false); // that should cover all data types... propertyGrid->ClearSelection(); return; } //Add property to animator propertyAnimator.addProp(frameProp); //update the user interface controls update(); propertyGrid->ClearSelection(); } void ExportAnimationDialog::OnFrameGridCellEditorShow(wxGridEvent &event) { event.Veto(); } void ExportAnimationDialog::OnFilterViewUnsplit(wxSplitterEvent &evt) { evt.Veto(); } void ExportAnimationDialog::OnAnimateGridCellEditorShow(wxGridEvent &event) { event.Veto(); } void ExportAnimationDialog::OnButtonKeyFrameRemove(wxCommandEvent &event) { if(!animationGrid->GetNumberRows()) return; //Obtain the IDs of the selected rows, or partially selected rows //Rectangular selection // This is an undocumented class AFAIK. :( wxGridCellCoordsArray arrayTL(animationGrid->GetSelectionBlockTopLeft()); wxGridCellCoordsArray arrayBR(animationGrid->GetSelectionBlockBottomRight()); //Row prefix or header selection const wxArrayInt& selectedRows(animationGrid->GetSelectedRows()); vector rowsToKill; if(arrayTL.Count() && arrayBR.Count()) { wxGridCellCoords coordTL = arrayTL.Item(0); wxGridCellCoords coordBR = arrayBR.Item(0); size_t rows = coordBR.GetRow() - coordTL.GetRow() +1; rowsToKill.resize(rows); for(size_t r=0; rGetGridCursorRow()); propertyAnimator.removeKeyFrames(rowsToKill); //update user interface update(); } void ExportAnimationDialog::updateOKButton() { bool badStatus=false; badStatus|=workDir.empty(); badStatus|=filterMap.empty(); badStatus|=(imagePrefix.empty() && wantImageOutput); badStatus|=(propertyAnimator.getNumProps() == 0); //Ensure that there were no inconsistent properties in // the animation std::set inconsistentProps; badStatus|=!propertyAnimator.checkSelfConsistent(inconsistentProps); okButton->Enable(!badStatus); } void ExportAnimationDialog::OnOutputDirText(wxCommandEvent &event) { if(programmaticEvent) return; if(!wxDirExists(textWorkDir->GetValue())) { textWorkDir->SetBackgroundColour(*wxCYAN); workDir.clear(); } else { textWorkDir->SetBackgroundColour(wxNullColour); workDir=stlStr(textWorkDir->GetValue()); } //update the user interface controls update(); } void ExportAnimationDialog::OnButtonWorkDir(wxCommandEvent &event) { //Pop up a directory dialog, to choose the base path for the new folder wxDirDialog *wxD = new wxDirDialog(this, TRANS("Select or create new folder"), wxFileSelectorDefaultWildcardStr, wxFD_SAVE); unsigned int res; res = wxD->ShowModal(); while(res != wxID_CANCEL) { //If dir exists, exit if(wxDirExists(wxD->GetPath())) break; res=wxD->ShowModal(); } //User aborted directory choice. if(res==wxID_CANCEL) { wxD->Destroy(); return; } textWorkDir->SetValue(wxD->GetPath()); workDir=stlStr(textWorkDir->GetValue()); wxD->Destroy(); //update the user interface controls update(); } void ExportAnimationDialog::OnCheckOutDataChange(wxCommandEvent &event) { if(programmaticEvent) return; wantOnlyChanges=checkOutOnlyChanged->IsChecked(); } void ExportAnimationDialog::OnCheckImageOutput(wxCommandEvent &event) { if(programmaticEvent) return; wantImageOutput=checkImageOutput->IsChecked(); //update UI (eg OK button) update(); } void ExportAnimationDialog::OnImageFilePrefix(wxCommandEvent &event) { if(programmaticEvent) return; imagePrefix=stlStr(textImageName->GetValue()); //update UI (eg OK button) update(); } void ExportAnimationDialog::OnBtnResolution(wxCommandEvent &event) { ResolutionDialog *r = new ResolutionDialog(this,wxID_ANY,wxT("Choose Resolution")); r->setRes(imageWidth,imageHeight,true); if(r->ShowModal() != wxID_OK) { r->Destroy(); return; } imageWidth=r->getWidth(); imageHeight=r->getHeight(); string sWidth,sHeight; stream_cast(sWidth,imageWidth); stream_cast(sHeight,imageHeight); string s; s=sWidth+"x" + sHeight; textImageSize->SetValue((s)); r->Destroy(); } void ExportAnimationDialog::OnCheckPointOutput(wxCommandEvent &event) { wantIonOutput=checkPoints->IsChecked(); } void ExportAnimationDialog::OnCheckPlotOutput(wxCommandEvent &event) { wantPlotOutput=checkPlotData->IsChecked(); } void ExportAnimationDialog::OnCheckVoxelOutput(wxCommandEvent &event) { wantVoxelOutput=checkVoxelData->IsChecked(); } void ExportAnimationDialog::OnCheckRangeOutput(wxCommandEvent &event) { wantRangeOutput=checkRangeData->IsChecked(); comboRangeFormat->Enable(checkRangeData->IsChecked()); } void ExportAnimationDialog::OnRangeTypeCombo(wxCommandEvent &event) { rangeExportMode=event.GetSelection(); } void ExportAnimationDialog::OnButtonOK(wxCommandEvent &event) { event.Skip(); } size_t ExportAnimationDialog::getRangeFormat() const { return rangeExportMode; } void ExportAnimationDialog::getAnimationState(PropertyAnimator &prop, vector > &mapping) const { prop=propertyAnimator; getPathMapping(mapping); } void ExportAnimationDialog::getPathMapping(vector > &mapping,bool allowMissing) const { ASSERT(filterTree->size()); std::map pathMapping; filterTree->serialiseToStringPaths(pathMapping); vector idsInUse; propertyAnimator.getIdList(idsInUse); for(size_t ui=0;ui::const_iterator it; it=filterMap.find(idsInUse[ui]); //if we allow missing elements, then skip processing this ID if(allowMissing && it == filterMap.end()) continue; ASSERT(it!=filterMap.end()); const Filter *f; f=it->second; //record the string name for the map std::string path; path=(pathMapping[f]); mapping.push_back(make_pair(path,idsInUse[ui])); } } // wxGlade: add ExportAnimationDialog event handlers void ExportAnimationDialog::set_properties() { // begin wxGlade: ExportAnimationDialog::set_properties SetTitle(TRANS("Export Animation")); filterTreeCtrl->SetToolTip(TRANS("Select filter")); propertyGrid->SetToolTip(TRANS("Select property")); animationGrid->CreateGrid(0, 5); animationGrid->SetColLabelValue(0, TRANS("Filter")); animationGrid->SetColLabelValue(1, TRANS("Property")); animationGrid->SetColLabelValue(2, TRANS("Mode")); animationGrid->SetColLabelValue(3, TRANS("Start Frame")); animationGrid->SetColLabelValue(4, TRANS("End Frame")); animationGrid->SetToolTip(TRANS("Keyframe table")); keyFrameRemoveButton->SetToolTip(TRANS("Remove the selected keyframe from the table")); textWorkDir->SetToolTip(TRANS("Enter where the animation frames will be exported to")); buttonWorkDir->SetToolTip(TRANS("Browse to directory where the animation frames will be exported to")); checkImageOutput->SetValue(1); textImageName->SetToolTip(TRANS("Title for files, result will be saved as #-name.png, where # is image number.")); textImageSize->SetToolTip(TRANS("Target resolution (image size)")); frameSlider->SetToolTip(TRANS("Select frame for property display")); textFrame->SetToolTip(TRANS("Enter frame number to change frame (eg 1/20)")); checkPoints->SetToolTip(TRANS("Save point data (POS files) in output folder?")); checkPlotData->SetToolTip(TRANS("Save plots (as text files) in output folder?")); checkVoxelData->SetToolTip(TRANS("Save voxel data (raw files) in output folder?")); checkRangeData->SetToolTip(TRANS("Save range files in output folder?")); framePropGrid->CreateGrid(0, 3); framePropGrid->SetColLabelValue(0, TRANS("Filter")); framePropGrid->SetColLabelValue(1, TRANS("Property")); framePropGrid->SetColLabelValue(2, TRANS("Value")); framePropGrid->SetToolTip(TRANS("Animation parameters for current frame")); cancelButton->SetToolTip(TRANS("Abort animation")); okButton->SetToolTip(TRANS("Run Animation")); // end wxGlade } void ExportAnimationDialog::do_layout() { // begin wxGlade: ExportAnimationDialog::do_layout wxBoxSizer* animateSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* globalButtonSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* frameViewSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* propGridSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* frameSliderSizer = new wxBoxSizer(wxHORIZONTAL); wxStaticBoxSizer* outputDataSizer = new wxStaticBoxSizer(outputDataSizer_staticbox, wxVERTICAL); wxBoxSizer* rangeFileDropDownSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* outputImageOptionsSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* imageSizeSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* filePrefixSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_1 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* outputDirHorizSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* filterViewPaneSizerH = new wxBoxSizer(wxHORIZONTAL); wxStaticBoxSizer* keyFramesSizer = new wxStaticBoxSizer(keyFramesSizer_staticbox, wxVERTICAL); wxBoxSizer* keyFrameButtonSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* animationGridSizer = new wxBoxSizer(wxHORIZONTAL); wxStaticBoxSizer* filterPropertySizer = new wxStaticBoxSizer(filterPropertySizer_staticbox, wxVERTICAL); filterPropertySizer->Add(filterTreeCtrl, 1, wxALL|wxEXPAND, 3); filterPropertySizer->Add(propertyGrid, 1, wxALL|wxEXPAND, 3); filterLeftPane->SetSizer(filterPropertySizer); animationGridSizer->Add(animationGrid, 1, wxALL|wxEXPAND, 3); keyFramesSizer->Add(animationGridSizer, 1, wxEXPAND, 0); keyFrameButtonSizer->Add(keyFrameRemoveButton, 0, 0, 0); keyFramesSizer->Add(keyFrameButtonSizer, 0, wxALL|wxEXPAND, 3); filterRightPane->SetSizer(keyFramesSizer); splitPaneFilter->SplitVertically(filterLeftPane, filterRightPane); filterViewPaneSizerH->Add(splitPaneFilter, 1, wxEXPAND, 0); filterViewPane->SetSizer(filterViewPaneSizerH); outputDirHorizSizer->Add(labelWorkDir, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 3); outputDirHorizSizer->Add(textWorkDir, 1, wxEXPAND, 0); outputDirHorizSizer->Add(buttonWorkDir, 0, wxLEFT|wxRIGHT, 2); outputDataSizer->Add(outputDirHorizSizer, 0, wxALL|wxEXPAND, 4); sizer_1->Add(20, 20, 0, 0, 0); sizer_1->Add(checkOutOnlyChanged, 0, 0, 0); outputDataSizer->Add(sizer_1, 0, wxBOTTOM|wxEXPAND, 5); outputDataSizer->Add(outputDataSepLine, 0, wxTOP|wxBOTTOM|wxEXPAND, 3); outputDataSizer->Add(labelDataType, 0, wxTOP|wxBOTTOM, 4); outputDataSizer->Add(checkImageOutput, 0, wxLEFT|wxTOP, 3); filePrefixSizer->Add(lblImageName, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 3); filePrefixSizer->Add(textImageName, 1, wxALL|wxEXPAND, 4); outputImageOptionsSizer->Add(filePrefixSizer, 0, wxALL|wxEXPAND, 3); imageSizeSizer->Add(labelImageSize, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 3); imageSizeSizer->Add(textImageSize, 1, wxALL|wxEXPAND, 4); imageSizeSizer->Add(buttonImageSize, 0, wxALL, 4); outputImageOptionsSizer->Add(imageSizeSizer, 0, wxALL|wxEXPAND, 3); outputDataSizer->Add(outputImageOptionsSizer, 0, wxEXPAND, 0); outputDataSizer->Add(checkPoints, 1, wxLEFT|wxBOTTOM, 3); outputDataSizer->Add(checkPlotData, 1, wxLEFT|wxTOP, 3); outputDataSizer->Add(checkVoxelData, 1, wxLEFT|wxTOP|wxBOTTOM, 3); outputDataSizer->Add(checkRangeData, 1, wxALL, 3); rangeFileDropDownSizer->Add(labelRangeFormat, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 3); rangeFileDropDownSizer->Add(comboRangeFormat, 1, wxLEFT|wxRIGHT|wxEXPAND, 3); outputDataSizer->Add(rangeFileDropDownSizer, 0, wxLEFT|wxBOTTOM|wxEXPAND, 5); outputDataSizer->Add(20, 20, 2, 0, 0); frameViewSizer->Add(outputDataSizer, 1, wxEXPAND, 0); frameViewSizer->Add(static_line_1, 0, wxLEFT|wxRIGHT|wxEXPAND, 5); frameSliderSizer->Add(labelFrame, 0, wxALIGN_CENTER_VERTICAL, 0); frameSliderSizer->Add(frameSlider, 1, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); frameSliderSizer->Add(textFrame, 0, wxALIGN_CENTER_VERTICAL, 0); propGridSizer->Add(frameSliderSizer, 0, wxALL|wxEXPAND, 3); propGridSizer->Add(framePropGrid, 1, wxEXPAND, 0); frameViewSizer->Add(propGridSizer, 2, wxALL|wxEXPAND, 3); frameViewPane->SetSizer(frameViewSizer); viewNotebook->AddPage(filterViewPane, TRANS("Filter view")); viewNotebook->AddPage(frameViewPane, TRANS("Frame view")); animateSizer->Add(viewNotebook, 1, wxEXPAND, 0); globalButtonSizer->Add(20, 1, 1, wxEXPAND, 0); globalButtonSizer->Add(cancelButton, 0, wxALL|wxALIGN_BOTTOM, 3); globalButtonSizer->Add(okButton, 0, wxALL|wxALIGN_BOTTOM, 3); animateSizer->Add(globalButtonSizer, 0, wxEXPAND, 0); SetSizer(animateSizer); animateSizer->Fit(this); Layout(); // end wxGlade } 3Depict-0.0.19/src/gui/dialogs/filterErrorDialog.cpp0000644000175000017500000000665112640746376021627 0ustar pcuserpcuser/* * filterErrorDialog.cpp - Dialog for displaying error notices computed from filter tree * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.3 on Sun Jun 24 00:03:00 2012 #include "filterErrorDialog.h" #include "wx/wxcommon.h" #include "common/translation.h" //Art for buttons #include // begin wxGlade: ::extracode // end wxGlade using std::string; FilterErrorDialog::FilterErrorDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) { // begin wxGlade: FilterErrorDialog::FilterErrorDialog textErrorMessage = new wxTextCtrl(this, wxID_ANY, wxEmptyString,wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE|wxTE_READONLY); bitmapError = new wxStaticBitmap(this, wxID_ANY, wxArtProvider::GetBitmap(wxART_ERROR)); labelError = new wxStaticText(this, wxID_ANY, TRANS("Error")); bitmapWarning = new wxStaticBitmap(this, wxID_ANY,wxArtProvider::GetBitmap(wxART_WARNING)); labelWarning = new wxStaticText(this, wxID_ANY, TRANS("Warning")); btnOK = new wxButton(this, wxID_OK, wxEmptyString); SetTitle(TRANS("Filter Errors")); set_properties(); do_layout(); // end wxGlade } void FilterErrorDialog::set_properties() { // begin wxGlade: FilterErrorDialog::set_properties SetTitle(TRANS("Filter Errors")); SetSize(wxSize(551, 414)); // end wxGlade } void FilterErrorDialog::SetText(const std::vector &text) { std::string bigMessage; for(unsigned int ui=0;uiClear(); textErrorMessage->AppendText((bigMessage)); } void FilterErrorDialog::do_layout() { // begin wxGlade: FilterErrorDialog::do_layout wxBoxSizer* sizerMain = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerTop = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerKey = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerWarn = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerError = new wxBoxSizer(wxHORIZONTAL); sizerTop->Add(textErrorMessage, 4, wxLEFT|wxRIGHT|wxTOP|wxEXPAND, 6); sizerKey->Add(10, 10, 0, 0, 0); sizerError->Add(bitmapError, 0, 0, 0); sizerError->Add(labelError, 0, wxALIGN_CENTER_VERTICAL, 0); sizerKey->Add(sizerError, 0, wxTOP|wxEXPAND, 5); sizerWarn->Add(bitmapWarning, 0, 0, 0); sizerWarn->Add(labelWarning, 0, wxALIGN_CENTER_VERTICAL, 0); sizerKey->Add(sizerWarn, 0, wxTOP|wxEXPAND, 6); sizerKey->Add(20, 20, 0, 0, 0); sizerTop->Add(sizerKey, 1, wxEXPAND, 0); sizerMain->Add(sizerTop, 1, wxEXPAND, 0); sizerMain->Add(btnOK, 0, wxALL|wxALIGN_RIGHT, 5); SetSizer(sizerMain); Layout(); // end wxGlade } 3Depict-0.0.19/src/gui/dialogs/autosaveDialog.h0000644000175000017500000000526412640746376020623 0ustar pcuserpcuser/* * autosaveDialog.h - Selection dialog on recovery from autosave files * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.5 on Thu Jun 7 12:47:44 2012 #include // begin wxGlade: ::dependencies // end wxGlade #ifndef AUTOSAVEDIALOG_H #define AUTOSAVEDIALOG_H #include // begin wxGlade: ::extracode enum { ID_LIST_STATES = wxID_ANY+1, ID_REMOVE_ALL }; // end wxGlade class AutosaveDialog: public wxDialog { public: // begin wxGlade: AutosaveDialog::ids // end wxGlade AutosaveDialog(wxWindow* parent, int id=wxID_ANY, const wxString& title=wxT(""), const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); private: // begin wxGlade: AutosaveDialog::methods void set_properties(); void do_layout(); // end wxGlade //! the index of the selected item, -1 otherwise size_t selectedItem; //True if the remove all button was // depressed bool haveRemovedItems; protected: // begin wxGlade: AutosaveDialog::attributes wxListBox* listStates; wxButton* btnRemoveAll; wxButton* btnCancel; wxButton* btnOK; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnListStates(wxCommandEvent &event); // wxGlade: virtual void OnListStatesDClick(wxCommandEvent &event); // wxGlade: virtual void OnRemoveAll(wxCommandEvent &event); // wxGlade: virtual void OnCancel(wxCommandEvent &event); // wxGlade: virtual void OnOK(wxCommandEvent &event); // wxGlade: //Set the items that are to be displayed in the listbox. void setItems(const std::vector &items); //!Get the item that was selected, returning the position of the selected // item in the original vector unsigned int getSelectedItem() const { return selectedItem;}; //Has the user require cited to remove items? bool removedItems() const {return haveRemovedItems;}; }; // wxGlade: end class #endif // AUTOSAVEDIALOG_H 3Depict-0.0.19/src/gui/dialogs/StashDialog.h0000644000175000017500000000473512640746376020060 0ustar pcuserpcuser/* * stashdialog.h - "Stash" filter storage edit dialog header * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef STASHDIALOG_H #define STASHDIALOG_H #include #include #include #include // end wxGlade #include "./backend/filtertree.h" class VisController; // begin wxGlade: ::extracode #include // end wxGlade class StashDialog: public wxDialog { public: // begin wxGlade: StashDialog::ids // end wxGlade StashDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); void setVisController(VisController *s); private: FilterTree curTree; std::vector > filterTreeMapping; UniqueIDHandler uniqueIds; // begin wxGlade: StashDialog::methods void set_properties(); void do_layout(); void updateList(); void updateGrid(); void updateTree(); bool getStashIdFromList(unsigned int &stashId); // end wxGlade VisController *visControl; protected: // begin wxGlade: StashDialog::attributes wxStaticText* label_5; wxListCtrl* listStashes; wxButton* btnRemove; wxStaticText* label_6; wxTreeCtrl* treeFilters; wxStaticText* label_7; wxPropertyGrid* gridProperties; wxButton* btnOK; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnListKeyDown(wxListEvent &event); // wxGlade: virtual void OnListSelected(wxListEvent &event); // wxGlade: virtual void OnTreeSelChange(wxTreeEvent &event); // wxGlade: virtual void OnGridEditor(wxPropertyGridEvent &event); virtual void OnBtnRemove(wxCommandEvent &event); void ready(); }; // wxGlade: end class #endif // STASHDIALOG_H 3Depict-0.0.19/src/gui/dialogs/prefDialog.h0000644000175000017500000001270612640746376017727 0ustar pcuserpcuser// -*- C++ -*- generated by wxGlade HG on Fri Dec 3 22:26:29 2010 /* * prefDialog.h - program preferences management dialog * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef PREFDIALOG_H #define PREFDIALOG_H #include // begin wxGlade: ::dependencies #include #include "wx/wxcomponents.h" // end wxGlade class Filter; // begin wxGlade: ::extracode // end wxGlade //As a courtesy, we do not allow online update checking under linux //its pointless, as linux systems usually have proper package management #if defined( __linux__) #define DISABLE_ONLINE_UPDATE #endif class PrefDialog: public wxDialog { private: // begin wxGlade: PrefDialog::methods void set_properties(); void do_layout(); // end wxGlade //the user specified defaults. This class must clean up this pointer std::vector filterDefaults; //!Current default filter setting (def. filter panel). Is null iff using hard-coded version Filter *curFilter; bool programmaticEvent; //!Generate the list of filters which can have their defaults set void createFilterListing(); //!Enable/disable the check controls ont he startup panel as needed void setStartupCheckboxEnables(unsigned int comboSel); //!Update the filter property grid, as needed void updateFilterProp(const Filter *f); //!Percentile speeds for mouse zoom and move unsigned int mouseZoomRatePercent,mouseMoveRatePercent; protected: // begin wxGlade: PrefDialog::attributes wxStaticBox* sizerCamSpeed_staticbox; wxStaticBox* sizer_7_staticbox; wxStaticBox* updateSizer_staticbox; wxStaticBox* sizer_2_staticbox; wxStaticBox* filterPropSizer_staticbox; wxStaticText* lblFilters; wxListBox* listFilters; wxPropertyGrid* filterGridProperties,*backFilterPropGrid; wxButton* filterBtnResetAllFilters; wxButton* filterResetDefaultFilter; wxPanel* panelFilters; wxComboBox* comboPanelStartMode; wxCheckBox* chkControl; wxCheckBox* chkRawData; wxCheckBox* chkPlotlist; #ifndef DISABLE_ONLINE_UPDATE wxCheckBox* checkAllowOnlineUpdate; #endif wxPanel* panelStartup; wxCheckBox* chkPreferOrtho; wxStaticText* lblMoveSpeed; wxStaticText* labelSlowCamMoveRate; wxSlider* sliderCamMoveRate; wxStaticText* labelFastCamMoveRate; wxStaticText* lblZoomSpeed; wxStaticText* labelSlowCamZoomRate; wxSlider* sliderCamZoomRate; wxStaticText* labelSlowFastZoomRate; wxPanel* notePrefPanels_pane_3; wxNotebook* notePrefPanels; wxButton* btnOK; wxButton* btnCancel; // end wxGlade DECLARE_EVENT_TABLE(); public: // begin wxGlade: PrefDialog::ids // end wxGlade PrefDialog(wxWindow* parent, int id=wxID_ANY, const wxString& title=wxT("Preferences"), const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER); virtual ~PrefDialog(); virtual void OnFilterCellChange(wxPropertyGridEvent &event); // wxGlade: virtual void OnFilterListClick(wxCommandEvent &event); // wxGlade: virtual void OnResetFilterButton(wxCommandEvent &event); // wxGlade: virtual void OnResetFilterAllButton(wxCommandEvent &event); // wxGlade: virtual void OnIdle(wxIdleEvent &evt); //set the filter defaults. note that the incoming pointers are cloned, and control is NOT transferred to this class void setFilterDefaults(const std::vector &defs); //Get the filter defaults. Note clones are returned, not the originals void getFilterDefaults(std::vector &defs) const; void setPanelDefaults(unsigned int panelMode, bool panelControl, bool panelRaw,bool panelPlotlist); void getPanelDefaults(unsigned int &panelMode, bool &panelControl, bool &panelRaw,bool &panelPlotlist) const; #ifndef DISABLE_ONLINE_UPDATE bool getAllowOnlineUpdate() const { return checkAllowOnlineUpdate->IsChecked();}; void setAllowOnlineUpdate(bool allowed) { checkAllowOnlineUpdate->SetValue(allowed);}; #endif void setMouseZoomRate(unsigned int rate) { mouseZoomRatePercent=rate;}; void setMouseMoveRate(unsigned int rate) { mouseMoveRatePercent=rate;}; bool getPreferOrthoCam() const { return chkPreferOrtho->IsChecked();} void setPreferOrthoCam(bool prefer) const { return chkPreferOrtho->SetValue(prefer);} unsigned int getMouseZoomRate() const { return mouseZoomRatePercent;}; unsigned int getMouseMoveRate() const { return mouseMoveRatePercent;}; virtual void OnStartupPanelCombo(wxCommandEvent &event); // wxGlade: virtual void OnCheckPreferOrtho(wxCommandEvent &event); // wxGlade: void OnMouseMoveSlider(wxScrollEvent &event); void OnMouseZoomSlider(wxScrollEvent &event); //Force a re-layout of the filter property grid void do_filtergrid_prop_layout(); void initialise(); void cleanup(); }; // wxGlade: end class #endif // PREFDIALOG_H 3Depict-0.0.19/src/gui/dialogs/StashDialog.cpp0000644000175000017500000002324512640746376020410 0ustar pcuserpcuser/* * StashDialog.cpp - filter "Stash" tree editing and viewing dialog * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "StashDialog.h" #include "wx/wxcommon.h" #include "wx/wxcomponents.h" #include "wx/propertyGridUpdater.h" #include "common/translation.h" #include "./backend/viscontrol.h" #include using std::pair; using std::string; using std::stack; using std::vector; // begin wxGlade: ::extracode // end wxGlade enum { ID_TREE_FILTERS=wxID_ANY+1, ID_GRID_FILTER, ID_LIST_STASH, }; StashDialog::StashDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, style) { // begin wxGlade: StashDialog::StashDialog label_5 = new wxStaticText(this, wxID_ANY, TRANS("Stashes")); listStashes = new wxListCtrl(this, ID_LIST_STASH, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER); btnRemove = new wxButton(this, wxID_REMOVE, wxEmptyString); label_6 = new wxStaticText(this, wxID_ANY, TRANS("Stashed Tree")); treeFilters = new wxTreeCtrl(this, ID_TREE_FILTERS, wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS|wxTR_NO_LINES|wxTR_DEFAULT_STYLE|wxSUNKEN_BORDER|wxTR_HIDE_ROOT); label_7 = new wxStaticText(this, wxID_ANY, TRANS("Properties")); gridProperties = new wxPropertyGrid(this, ID_GRID_FILTER); btnOK = new wxButton(this, wxID_OK, wxEmptyString); //Due to a bug in wx, empty reports throw an assertion // 'unknown list item format", when there are no columns listStashes->InsertColumn(0,TRANS("Stash Name")); listStashes->InsertColumn(1,TRANS("Filter Count")); set_properties(); do_layout(); // end wxGlade } void StashDialog::ready() { updateList(); updateGrid(); updateTree(); } BEGIN_EVENT_TABLE(StashDialog, wxDialog) // begin wxGlade: StashDialog::event_table EVT_LIST_KEY_DOWN(ID_LIST_STASH, StashDialog::OnListKeyDown) EVT_BUTTON(wxID_REMOVE, StashDialog::OnBtnRemove) EVT_LIST_ITEM_SELECTED(ID_LIST_STASH, StashDialog::OnListSelected) EVT_TREE_SEL_CHANGED(ID_TREE_FILTERS, StashDialog::OnTreeSelChange) EVT_PG_CHANGING(ID_GRID_FILTER,StashDialog::OnGridEditor) // end wxGlade END_EVENT_TABLE(); void StashDialog::setVisController(VisController *s) { visControl=s; } void StashDialog::set_properties() { // begin wxGlade: StashDialog::set_properties SetTitle(TRANS("Stashed Trees")); SetSize(wxSize(600, 430)); btnRemove->SetToolTip(TRANS("Erase stashed item")); treeFilters->SetToolTip(TRANS("Filter view for current stash")); gridProperties->SetToolTip(TRANS("Settings for selected filter in current stash")); listStashes->SetToolTip(TRANS("Available stashes")); // end wxGlade } void StashDialog::OnGridEditor(wxPropertyGridEvent &evt) { //Silence error mesages evt.SetValidationFailureBehavior(0); evt.Veto(); } void StashDialog::OnListKeyDown(wxListEvent &event) { switch(event.GetKeyCode()) { case WXK_DELETE: { //Spin through the selected items int item=-1; for ( ;; ) { item = listStashes->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if ( item == -1 ) break; visControl->state.eraseStash(listStashes->GetItemData(item)); } //Update the filter list updateList(); updateTree(); updateGrid(); } } } void StashDialog::OnListSelected(wxListEvent &event) { updateTree(); updateGrid(); } void StashDialog::OnTreeSelChange(wxTreeEvent &event) { updateGrid(); } void StashDialog::updateList() { //Generate the stash selection list //Clear the existing list listStashes->Freeze(); listStashes->DeleteAllItems(); unsigned int nStashes=visControl->state.getStashCount(); //Fill it with "stash" entries //Add columns to report listviews for (unsigned int ui=0; ui stash; long itemIdx; visControl->state.copyStashedTree(ui,stash); //First item is the stash name itemIdx = listStashes->InsertItem(ui,stash.first); //Second column is num filters stream_cast(strTmp,stash.second.size()); listStashes->SetItem(itemIdx,1,(strTmp)); //Set the stash ID as the list data item //this is the key to the stash val listStashes->SetItemData(itemIdx,ui); } listStashes->Thaw(); } void StashDialog::updateGrid() { gridProperties->Clear(); if(!treeFilters->GetCount()) return; //Get the selection from the current tree wxTreeItemId id; id=treeFilters->GetSelection(); if(!id.IsOk() || id == treeFilters->GetRootItem()) return; unsigned int stashId; //Retrieve the stash ID if(!getStashIdFromList(stashId)) return; //Tree data contains unique identifier for vis control to do matching wxTreeItemData *tData=treeFilters->GetItemData(id); unsigned int filterIdx = ((wxTreeUint *)tData)->value; FilterTree t; visControl->state.copyStashedTree(stashId,t); Filter *targetFilter=0; unsigned int pos=0; //Spin through the tree iterators until we hit the target index for(tree::iterator it=t.depthBegin();it!=t.depthEnd(); ++it) { if(pos == filterIdx) { targetFilter=*it; break; } pos++; } ASSERT(targetFilter); updateFilterPropertyGrid(gridProperties,targetFilter,""); } bool StashDialog::getStashIdFromList(unsigned int &stashId) { //Get the currently selected item //Spin through the selected items int item=-1; unsigned int numItems=0; for ( ;; ) { item = listStashes->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if ( item == -1 ) break; numItems++; } //error if not only a single selected if(numItems !=1) return false; item=-1; item = listStashes->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); stashId = listStashes->GetItemData(item); return true; } void StashDialog::updateTree() { treeFilters->DeleteAllItems(); unsigned int stashId; //Get the selected stash and build the tree control if(!getStashIdFromList(stashId)) return; visControl->state.copyStashedTree(stashId,curTree); uniqueIds.clear(); //REBUILD TREE //===== stack treeIDs; wxTreeItemId visibleTreeId; //Warning: this generates an event, //most of the time (some windows versions do not according to documentation) treeFilters->DeleteAllItems(); filterTreeMapping.clear(); int lastDepth=0; //Add dummy root node. This will be invisible to wxTR_HIDE_ROOT controls wxTreeItemId tid; tid=treeFilters->AddRoot(wxT("TreeBase")); unsigned int curTreePos=0; // Push on stack to prevent underflow, but don't keep a copy, // as we will never insert or delete this from the UI treeIDs.push(tid); //Depth first add unsigned int pos=0; for(tree::pre_order_iterator filtIt=curTree.depthBegin(); filtIt!=curTree.depthEnd(); ++filtIt) { //Push or pop the stack to make it match the iterator position if( lastDepth > curTree.depth(filtIt)) { while(curTree.depth(filtIt) +1 < (int)treeIDs.size()) treeIDs.pop(); } else if( lastDepth < curTree.depth(filtIt)) { treeIDs.push(tid); } lastDepth=curTree.depth(filtIt); //This will use the user label or the type string. tid=treeFilters->AppendItem(treeIDs.top(), ((*filtIt)->getUserString())); treeFilters->SetItemData(tid,new wxTreeUint(pos)); pos++; //Record mapping to filter for later reference filterTreeMapping.push_back(std::make_pair(curTreePos,*filtIt)); curTreePos++; } //===== } void StashDialog::OnBtnRemove(wxCommandEvent &event) { //Spin through the list, to find the selected items vector itemsToRemove; int item=-1; for ( ;; ) { item = listStashes->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if ( item == -1 ) break; itemsToRemove.push_back(listStashes->GetItemData(item)); } visControl->state.eraseStashes(itemsToRemove); ready(); } void StashDialog::do_layout() { // begin wxGlade: StashDialog::do_layout wxBoxSizer* sizer_17 = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizer_19 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_18 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_21 = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizer_20 = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizer_22 = new wxBoxSizer(wxHORIZONTAL); sizer_17->Add(9, 8, 0, 0, 0); sizer_20->Add(label_5, 0, wxLEFT, 5); sizer_20->Add(listStashes, 1, wxLEFT|wxRIGHT|wxEXPAND, 5); sizer_22->Add(btnRemove, 0, wxLEFT|wxALIGN_RIGHT, 6); sizer_20->Add(sizer_22, 0, wxTOP|wxEXPAND, 8); sizer_18->Add(sizer_20, 1, wxLEFT|wxEXPAND, 5); sizer_18->Add(15, 20, 0, 0, 0); sizer_21->Add(label_6, 0, 0, 4); sizer_21->Add(treeFilters, 1, wxRIGHT|wxEXPAND, 5); sizer_21->Add(label_7, 0, wxTOP, 10); sizer_21->Add(gridProperties, 1, wxRIGHT|wxBOTTOM|wxEXPAND, 5); sizer_18->Add(sizer_21, 1, wxRIGHT|wxEXPAND, 5); sizer_17->Add(sizer_18, 1, wxEXPAND, 0); sizer_17->Add(20, 20, 0, 0, 0); sizer_19->Add(20, 20, 1, 0, 0); sizer_19->Add(btnOK, 0, wxALL, 5); sizer_17->Add(sizer_19, 0, wxEXPAND, 0); SetSizer(sizer_17); Layout(); // end wxGlade } 3Depict-0.0.19/src/gui/dialogs/resolutionDialog.h0000644000175000017500000000627612640746376021203 0ustar pcuserpcuser/* * resolutionDialog.h - Resolution chooser dialog * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.3 on Mon May 7 00:46:06 2012 #include // begin wxGlade: ::dependencies #include // end wxGlade #ifndef RESOLUTIONDIALOG_H #define RESOLUTIONDIALOG_H //!resolution chooser dialog class ResolutionDialog: public wxDialog { public: // begin wxGlade: ResolutionDialog::ids // end wxGlade ResolutionDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); private: //Resolution width and height or the final output unsigned int resWidth,resHeight; //!Reset value for resolution unsigned int resOrigWidth,resOrigHeight; //!Programmatic event counter // Non-zero if event is being generated programatically int programmaticEvent; //!aspect ratio that is to be used for locking user input float aspect; // begin wxGlade: ResolutionDialog::methods void set_properties(); void do_layout(); // end wxGlade //!Finish up the dialog void finishDialog(); //!Update the drawn image representing the output shape void updateImage(); //!Draw the image rectangle void drawImageRectangle(wxDC *dc); protected: // begin wxGlade: ResolutionDialog::attributes wxStaticText* labelWidth; wxTextCtrl* textWidth; wxStaticText* labelHeight; wxTextCtrl* textHeight; wxStaticLine* static_line_2; wxButton* btnReset; wxButton* btnOK; wxButton* button_2; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnTextWidth(wxCommandEvent &event); // wxGlade: virtual void OnTextHeight(wxCommandEvent &event); // wxGlade: virtual void OnBtnReset(wxCommandEvent &event); // wxGlade: virtual void OnBtnOK(wxCommandEvent &event); // wxGlade: virtual void OnBtnCancel(wxCommandEvent &event); // wxGlade: virtual void OnMouseWheelWidth(wxMouseEvent &event); virtual void OnMouseWheelHeight(wxMouseEvent &event); virtual void OnKeypress(wxKeyEvent &evt); //!get the width as entered in the dialog unsigned int getWidth() const {return resWidth;}; //!Get the height as entered in the dialog box unsigned int getHeight() const {return resHeight;}; //!Set the resolution and update text boxes void setRes(unsigned int w, unsigned int h, bool asReset=false); }; // wxGlade: end class #endif // RES_H 3Depict-0.0.19/src/gui/dialogs/resolutionDialog.cpp0000644000175000017500000002200212640746376021517 0ustar pcuserpcuser/* * resolutionDialog.cpp - Resolution chooser dialog * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.3 on Mon May 7 00:46:06 2012 #include "resolutionDialog.h" #include "wx/wxcommon.h" #include "common/translation.h" #include // begin wxGlade: ::extracode // end wxGlade enum { ID_RESET=wxID_ANY+1, ID_TEXT_WIDTH, ID_TEXT_HEIGHT, }; const float MOUSEWHEEL_RATE_MULTIPLIER=1.0f; ResolutionDialog::ResolutionDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) { // begin wxGlade: ResolutionDialog::ResolutionDialog labelWidth = new wxStaticText(this, wxID_ANY, TRANS("Width :"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); textWidth = new wxTextCtrl(this, ID_TEXT_WIDTH, wxT("")); labelHeight = new wxStaticText(this, wxID_ANY, TRANS("Height :")); textHeight = new wxTextCtrl(this, ID_TEXT_HEIGHT, wxT("")); static_line_2 = new wxStaticLine(this, wxID_ANY); btnReset = new wxButton(this, ID_RESET, TRANS("Reset")); btnOK = new wxButton(this, wxID_OK, wxEmptyString); button_2 = new wxButton(this, wxID_CANCEL, wxEmptyString); textWidth->Bind(wxEVT_MOUSEWHEEL, &ResolutionDialog::OnMouseWheelWidth, this); textHeight->Bind(wxEVT_MOUSEWHEEL, &ResolutionDialog::OnMouseWheelHeight, this); set_properties(); do_layout(); // end wxGlade programmaticEvent=0; updateImage(); btnOK->SetFocus(); } BEGIN_EVENT_TABLE(ResolutionDialog, wxDialog) // begin wxGlade: ResolutionDialog::event_table EVT_TEXT(ID_TEXT_WIDTH, ResolutionDialog::OnTextWidth) EVT_TEXT(ID_TEXT_HEIGHT, ResolutionDialog::OnTextHeight) EVT_BUTTON(ID_RESET, ResolutionDialog::OnBtnReset) EVT_BUTTON(wxID_OK, ResolutionDialog::OnBtnOK) EVT_BUTTON(wxID_CANCEL, ResolutionDialog::OnBtnCancel) EVT_KEY_DOWN(ResolutionDialog::OnKeypress) // end wxGlade END_EVENT_TABLE(); void ResolutionDialog::updateImage() { wxPaintEvent paintEvt; wxPostEvent(this,paintEvt); } void ResolutionDialog::setRes(unsigned int w, unsigned int h, bool asReset) { //Increment programmatic lock counter programmaticEvent++; std::string s; stream_cast(s,w); textWidth->SetValue((s)); stream_cast(s,h); textHeight->SetValue((s)); resWidth=w; resHeight=h; //do we want to use this as the reset value? if(asReset) { resOrigWidth=w; resOrigHeight=h; ASSERT(resOrigWidth); aspect=(float)resOrigHeight/(float)resOrigWidth; } programmaticEvent--; } void ResolutionDialog::OnTextWidth(wxCommandEvent &event) { if(programmaticEvent) return; programmaticEvent++; //Validate that string is numerical //--- wxString s =event.GetString(); std::string textStr; textStr=stlStr(s); if(textStr.find_first_not_of("0123456789")!=std::string::npos ) { stream_cast(textStr,resWidth); textWidth->SetValue((textStr)); programmaticEvent--; return; } //--- int width; textStr = stlStr(textWidth->GetValue()); if(stream_cast(width,textStr)) { programmaticEvent--; return; } resWidth=width; //if we are locking the aspect ratio, set the other text box to have the same ratio ASSERT(aspect > std::numeric_limits::epsilon()); resHeight=(unsigned int)(width*aspect); stream_cast(textStr,resHeight); textHeight->SetValue((textStr)); updateImage(); programmaticEvent--; } void ResolutionDialog::OnTextHeight(wxCommandEvent &event) { if(programmaticEvent) return; programmaticEvent++; //Validate that string is numerical //--- wxString s =event.GetString(); std::string textStr; textStr=stlStr(s); if(textStr.find_first_not_of("0123456789")!=std::string::npos ) { stream_cast(textStr,resHeight); textHeight->SetValue((textStr)); programmaticEvent--; return; } //--- int height; textStr = stlStr(textHeight->GetValue()); if(stream_cast(height,textStr)) { programmaticEvent--; return; } resHeight=height; //if we are locking the aspect ratio, set the other text box to preserve the same ratio ASSERT(aspect > std::numeric_limits::epsilon()); resWidth=(unsigned int)(height/aspect); stream_cast(textStr,resWidth); textWidth->SetValue((textStr)); updateImage(); programmaticEvent--; } void ResolutionDialog::OnBtnReset(wxCommandEvent &event) { setRes(resOrigWidth,resOrigHeight); } void ResolutionDialog::OnBtnOK(wxCommandEvent &event) { finishDialog(); } void ResolutionDialog::OnBtnCancel(wxCommandEvent &event) { EndModal(wxID_CANCEL); } void ResolutionDialog::OnMouseWheelWidth(wxMouseEvent &event) { bool haveCtrl,haveShift; haveShift=event.ShiftDown(); haveCtrl=event.CmdDown(); //normal move rate float moveRate=(float)event.GetWheelRotation()/(float)event.GetWheelDelta()*MOUSEWHEEL_RATE_MULTIPLIER; //scroll rate multiplier for this scroll event { float multiplier; if(haveShift) multiplier=5.0f; else if(haveCtrl) multiplier=10.0f; else multiplier=1.0f; moveRate*=multiplier; } if(resWidth+moveRate <= 0) return; programmaticEvent++; setRes((unsigned int)(resWidth+moveRate),resHeight); //if we are locking the aspect ratio, set the other text box to preserve the same ratio ASSERT(aspect > std::numeric_limits::epsilon()); std::string textStr; resHeight=(unsigned int)(resWidth*aspect); stream_cast(textStr,resHeight); textHeight->SetValue((textStr)); updateImage(); programmaticEvent--; } void ResolutionDialog::OnMouseWheelHeight(wxMouseEvent &event) { bool haveCtrl,haveShift; haveShift=event.ShiftDown(); haveCtrl=event.CmdDown(); //normal move rate float moveRate=(float)event.GetWheelRotation()/(float)event.GetWheelDelta()*MOUSEWHEEL_RATE_MULTIPLIER; //scroll rate multiplier for this scroll event { float multiplier; if(haveShift) multiplier=5.0f; else if(haveCtrl) multiplier=10.0f; else multiplier=1.0f; moveRate*=multiplier; } if(resHeight+moveRate <= 0) return; programmaticEvent++; setRes(resWidth,(unsigned int)(resHeight+moveRate)); //if we are locking the aspect ratio, set the other text box to preserve the same ratio ASSERT(aspect > std::numeric_limits::epsilon()); std::string textStr; resWidth=(unsigned int)(resHeight/aspect); stream_cast(textStr,resWidth); textWidth->SetValue((textStr)); updateImage(); programmaticEvent--; } void ResolutionDialog::OnKeypress(wxKeyEvent &evt) { if( evt.GetKeyCode() == WXK_RETURN) finishDialog(); evt.Skip(); } // wxGlade: add ResolutionDialog event handlers void ResolutionDialog::finishDialog() { //programmatic event counter should be decremented to zero ASSERT(!programmaticEvent); textWidth->Unbind(wxEVT_MOUSEWHEEL, &ResolutionDialog::OnMouseWheelWidth, this); textHeight->Unbind(wxEVT_MOUSEWHEEL, &ResolutionDialog::OnMouseWheelHeight, this); EndModal(wxID_OK); } void ResolutionDialog::set_properties() { // begin wxGlade: ResolutionDialog::set_properties SetTitle(TRANS("Resolution Selection")); // end wxGlade } void ResolutionDialog::do_layout() { // begin wxGlade: ResolutionDialog::do_layout wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* upperSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* leftSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* heightTextSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* widthTextSizer = new wxBoxSizer(wxHORIZONTAL); upperSizer->Add(10, 20, 0, 0, 0); leftSizer->Add(20, 20, 2, 0, 0); widthTextSizer->Add(labelWidth, 0, wxALIGN_CENTER_VERTICAL, 0); widthTextSizer->Add(textWidth, 0, wxALL|wxALIGN_CENTER_VERTICAL, 8); leftSizer->Add(widthTextSizer, 1, wxEXPAND, 0); heightTextSizer->Add(labelHeight, 0, wxALIGN_CENTER_VERTICAL, 0); heightTextSizer->Add(textHeight, 0, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5); leftSizer->Add(heightTextSizer, 1, wxEXPAND, 0); leftSizer->Add(20, 20, 2, 0, 0); upperSizer->Add(leftSizer, 0, wxLEFT|wxEXPAND, 8); upperSizer->Add(10, 10, 0, 0, 0); mainSizer->Add(upperSizer, 1, wxEXPAND, 0); mainSizer->Add(static_line_2, 0, wxEXPAND, 0); buttonSizer->Add(btnReset, 0, wxALL, 5); buttonSizer->Add(20, 20, 1, 0, 0); buttonSizer->Add(btnOK, 0, wxALL, 5); buttonSizer->Add(button_2, 0, wxALL, 5); mainSizer->Add(buttonSizer, 0, wxTOP|wxBOTTOM|wxEXPAND, 5); SetSizer(mainSizer); mainSizer->Fit(this); Layout(); // end wxGlade } 3Depict-0.0.19/src/gui/dialogs/animateFilterDialog.h0000644000175000017500000002233212640746376021553 0ustar pcuserpcuser/* * animateFilterDialog - GUI for animate filter * Copyright (C) 2015, D. Haley, A Ceguerra * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef ANIMATEFILTERDIALOG_H #define ANIMATEFILTERDIALOG_H #include // begin wxGlade: ::dependencies #include #include #include #include #include // end wxGlade #include "backend/animator.h" #include "backend/viscontrol.h" //for upWxTreeCtrl // begin wxGlade: ::extracode // end wxGlade enum { FILENAME_IMAGE, FILENAME_IONS, FILENAME_RANGE, FILENAME_PLOT, FILENAME_VOXEL }; enum { RANGE_OAKRIDGE, RANGE_AMETEK_RRNG, RANGE_AMETEK_ENV, RANGE_FORMATNAME_END }; class ExportAnimationDialog: public wxDialog { public: // begin wxGlade: ExportAnimationDialog::ids // end wxGlade ExportAnimationDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); ~ExportAnimationDialog(); //!Must be called before displaying dialog, and after setting tree void prepare(); //obtain the desired filename for a particular type of output std::string getFilename(unsigned int frame, unsigned int nameType, unsigned int number=0) const ; //Obtain the desired width of the output image unsigned int getImageWidth() const { return imageWidth;} //Obtain the desired height of the output image unsigned int getImageHeight() const { return imageHeight;}; //Get the number of frames that are in the animation sequence size_t getNumFrames() const { return propertyAnimator.getMaxFrame();} //Return a modified version f the filter tree, applying the changes requested // by the user bool getModifiedTree(size_t frame, FilterTree &t,bool &needUp) const; //Set the tree that we are to work with void setTree(const FilterTree &origTree) { filterTree=&origTree;}; //Does the user want to obtain image output? bool wantsImages() const { return wantImageOutput;} //Does the user want to obtain plot output? bool wantsPlots() const { return wantPlotOutput;} //Does the user want to obtain ion output? bool wantsIons() const { return wantIonOutput;} //Does the user want to obtain range output? bool wantsRanges() const { return wantRangeOutput;} //Does the user want to obtain range output? bool wantsVoxels() const { return wantVoxelOutput;} //Does the user want all data output, or only when the data // changes (needs a refresh) bool wantsOnlyChanges() const { return wantOnlyChanges;} //!Obtain the format the user wants to save ranges in size_t getRangeFormat() const; //! Obtain the current state from the animation (keyframes) // the second element provides the mappings for the property animator to // filter tree path locations void getAnimationState(PropertyAnimator &prop, std::vector > &pathMapping) const ; //!Obtain the current state from the animation void setAnimationState(const PropertyAnimator &prop, const std::vector > &pathMapping); //!Obtain the filter tree path string->animation ID mapping void getPathMapping(std::vector > &mapping, bool allowMissing=false) const; void setDefImSize(unsigned int w, unsigned int h) ; private: //!Tree of filters that can be manipulated const FilterTree *filterTree; //!Mapping from ID of filter to the pointer in the filter tree std::map filterMap; //!Mapping to allow for converting entry of RNG selection combo into // the correct range enum value std::map rangeMap; //!Default height/width desired for output images size_t imageWidth,imageHeight; bool imageSizeOK; PropertyAnimator propertyAnimator; //!Working directory for outputting data std::string workDir; std::string imagePrefix; //!True if any con bool existsConflicts; //!true if the user has selected image output functionality bool wantImageOutput; //!True if the user has requested ion data output bool wantIonOutput; //!True if the user wants plots output bool wantPlotOutput; //!True if the user wants to save voxel data bool wantVoxelOutput; //!True if the user wants to save range data bool wantRangeOutput; //!True if the user only wants to save data if it changes bool wantOnlyChanges; //!Current frame that the user wants to see in the frame view size_t currentFrame; //!Type of rangefile to export size_t rangeExportMode; //viewport aspect ratio for image output float imageAspectRatio; //Used to jump out of wx events that are generated by // the code, rather than the user, eg text events bool programmaticEvent; //UI update function void update(); //Enable/disable the OK button depending upon dialog state void updateOKButton(); //update function for frame view page, grid control void updateFilterViewGrid(); //update function for frame view page, grid contorl void updateFrameViewGrid(); //Updates the slider on the frame view page void updateFrameViewSlider(); // begin wxGlade: ExportAnimationDialog::methods void set_properties(); void do_layout(); // end wxGlade protected: // begin wxGlade: ExportAnimationDialog::attributes wxStaticBox* outputDataSizer_staticbox; wxStaticBox* keyFramesSizer_staticbox; wxStaticBox* filterPropertySizer_staticbox; wxTreeCtrl* filterTreeCtrl; wxPropertyGrid* propertyGrid; wxPanel* filterLeftPane; wxGrid* animationGrid; wxButton* keyFrameRemoveButton; wxPanel* filterRightPane; wxSplitterWindow* splitPaneFilter; wxPanel* filterViewPane; wxStaticText* labelWorkDir; wxTextCtrl* textWorkDir; wxButton* buttonWorkDir; wxCheckBox* checkOutOnlyChanged; wxStaticLine* outputDataSepLine; wxStaticText* labelDataType; wxCheckBox* checkImageOutput; wxStaticText* lblImageName; wxTextCtrl* textImageName; wxStaticText* labelImageSize; wxTextCtrl* textImageSize; wxButton* buttonImageSize; wxCheckBox* checkPoints; wxCheckBox* checkPlotData; wxCheckBox* checkVoxelData; wxCheckBox* checkRangeData; wxStaticText* labelRangeFormat; wxChoice* comboRangeFormat; wxStaticLine* static_line_1; wxStaticText* labelFrame; wxSlider* frameSlider; wxTextCtrl* textFrame; wxGrid* framePropGrid; wxPanel* frameViewPane; wxNotebook* viewNotebook; wxButton* cancelButton; wxButton* okButton; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnFilterTreeCtrlSelChanged(wxTreeEvent &event); // wxGlade: virtual void OnFilterGridCellChanging(wxPropertyGridEvent &event); // wxGlade: virtual void OnFilterGridCellSelected(wxPropertyGridEvent &event); // wxGlade: virtual void OnAnimateGridCellEditorShow(wxGridEvent &event); // wxGlade: virtual void OnFrameGridCellEditorShow(wxGridEvent &event); // wxGlade: virtual void OnButtonKeyFrameRemove(wxCommandEvent &event); // wxGlade: virtual void OnOutputDirText(wxCommandEvent &event); // wxGlade: virtual void OnButtonWorkDir(wxCommandEvent &event); // wxGlade: virtual void OnCheckOutDataChange(wxCommandEvent &event); // wxGlade: virtual void OnCheckImageOutput(wxCommandEvent &event); // wxGlade: virtual void OnImageFilePrefix(wxCommandEvent &event); // wxGlade: virtual void OnBtnResolution(wxCommandEvent &event); // wxGlade: virtual void OnCheckPointOutput(wxCommandEvent &event); // wxGlade: virtual void OnCheckPlotOutput(wxCommandEvent &event); // wxGlade: virtual void OnCheckVoxelOutput(wxCommandEvent &event); // wxGlade: virtual void OnCheckRangeOutput(wxCommandEvent &event); // wxGlade: virtual void OnRangeTypeCombo(wxCommandEvent &event); // wxGlade: virtual void OnFrameViewSlider(wxScrollEvent &event); // wxGlade: virtual void OnTextFrame(wxCommandEvent &event); // wxGlade: virtual void OnButtonCancel(wxCommandEvent &event); // wxGlade: virtual void OnButtonOK(wxCommandEvent &event); // wxGlade: virtual void OnFilterViewUnsplit(wxSplitterEvent &event); // wxGlade: }; // wxGlade: end class #endif // ANIMATEFILTERDIALOG_H 3Depict-0.0.19/src/gui/dialogs/autosaveDialog.cpp0000644000175000017500000001051612640746376021152 0ustar pcuserpcuser/* * autosaveDialog.cpp - Selection of autosaves for hard program restarts * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.5 on Thu Jun 7 12:47:44 2012 #include "autosaveDialog.h" #include "wx/wxcommon.h" #include "common/translation.h" // begin wxGlade: ::extracode // end wxGlade AutosaveDialog::AutosaveDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) { selectedItem=(size_t)-1; haveRemovedItems=false; // begin wxGlade: AutosaveDialog::AutosaveDialog const wxString *listStates_choices = NULL; listStates = new wxListBox(this, ID_LIST_STATES, wxDefaultPosition, wxDefaultSize, 0, listStates_choices, wxLB_SINGLE|wxLB_NEEDED_SB); btnRemoveAll = new wxButton(this, ID_REMOVE_ALL, TRANS("Remove &All")); btnCancel = new wxButton(this, wxID_CANCEL, wxEmptyString); btnOK = new wxButton(this, wxID_OK, wxEmptyString); btnOK->Enable(false); set_properties(); do_layout(); // end wxGlade //Force setting focus on the list control, because otherwise, pressing ESCAPE doesn't work for the user listStates->SetFocus(); } BEGIN_EVENT_TABLE(AutosaveDialog, wxDialog) // begin wxGlade: AutosaveDialog::event_table EVT_LISTBOX_DCLICK(ID_LIST_STATES, AutosaveDialog::OnListStatesDClick) EVT_LISTBOX(ID_LIST_STATES, AutosaveDialog::OnListStates) EVT_BUTTON(ID_REMOVE_ALL, AutosaveDialog::OnRemoveAll) EVT_BUTTON(wxID_CANCEL, AutosaveDialog::OnCancel) EVT_BUTTON(wxID_OK, AutosaveDialog::OnOK) // end wxGlade END_EVENT_TABLE(); void AutosaveDialog::OnListStates(wxCommandEvent &event) { //Get the first selected item selectedItem= listStates->GetSelection(); //Enable the OK button if and only if there is a valid // selection btnOK->Enable(selectedItem != -1); } void AutosaveDialog::OnListStatesDClick(wxCommandEvent &event) { EndModal(wxID_OK); } void AutosaveDialog::OnRemoveAll(wxCommandEvent &event) { selectedItem=-1; btnOK->Enable(false); haveRemovedItems=true; btnRemoveAll->Enable(false); listStates->Clear(); listStates->Enable(false); //Force setting focus now on the cancel button , //because otherwise, pressing ESCAPE doesn't work // on the list control btnCancel->SetFocus(); } void AutosaveDialog::OnCancel(wxCommandEvent &event) { EndModal(wxID_CANCEL); } void AutosaveDialog::OnOK(wxCommandEvent &event) { //Require an item to be selected ASSERT(selectedItem != -1) EndModal(wxID_OK); } // wxGlade: add AutosaveDialog event handlers void AutosaveDialog::setItems( const std::vector &newItems) { for(size_t ui=0;uiInsert((newItems[ui]),ui); } void AutosaveDialog::set_properties() { // begin wxGlade: AutosaveDialog::set_properties SetTitle(TRANS("Restore state?")); // end wxGlade } void AutosaveDialog::do_layout() { // begin wxGlade: AutosaveDialog::do_layout wxBoxSizer* sizer_1 = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizer_2 = new wxBoxSizer(wxHORIZONTAL); wxStaticText* labelHeader = new wxStaticText(this, wxID_ANY, TRANS("Multiple autosave states were found; would you like to restore one?"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE); sizer_1->Add(labelHeader, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 8); sizer_1->Add(listStates, 1, wxALL|wxEXPAND, 8); sizer_2->Add(btnRemoveAll, 0, wxLEFT|wxBOTTOM, 8); sizer_2->Add(20, 20, 1, 0, 0); sizer_2->Add(btnCancel, 0, wxLEFT|wxRIGHT|wxBOTTOM, 8); sizer_2->Add(btnOK, 0, wxRIGHT|wxBOTTOM, 8); sizer_1->Add(sizer_2, 0, wxEXPAND, 0); SetSizer(sizer_1); sizer_1->Fit(this); Layout(); // end wxGlade } 3Depict-0.0.19/src/gui/dialogs/animateSubDialogs/0000755000175000017500000000000012723200266021050 5ustar pcuserpcuser3Depict-0.0.19/src/gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.h0000644000175000017500000000523612640746376025244 0ustar pcuserpcuser/* * choiceKeyFrameDialog.h - Keyframe selection for optioned properties * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.5 on Sun Sep 23 22:52:41 2012 #include // begin wxGlade: ::dependencies // end wxGlade #include #ifndef CHOICEKEYFRAMEDIALOG_H #define CHOICEKEYFRAMEDIALOG_H // begin wxGlade: ::extracode enum { ID_TEXT_FRAME, ID_COMBO_CHOICE }; // end wxGlade class ChoiceKeyFrameDialog: public wxDialog { public: // begin wxGlade: ChoiceKeyFrameDialog::ids // end wxGlade ChoiceKeyFrameDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); //Set the choices that are allowed to be selected void setChoices(const std::vector &choices,size_t defaultChoice=0); //Obtain the choice from the user size_t getChoiceIndex() const { return choice;}; std::string getChoice() const { return choiceStrings[choice];}; size_t getStartFrame() const { return startFrame;} private: // begin wxGlade: ChoiceKeyFrameDialog::methods void set_properties(); void do_layout(); // end wxGlade //List of choices that can go into the combo box std::vector choiceStrings; //Drop-down value chosen by user size_t choice; //True if the start frame entered by user is valid bool startFrameOK; //Current start frame size_t startFrame; //enable or disable the OK button based upon validation results void updateOKButton(); //build up the combo box items void buildCombo(size_t defaultChoice); protected: // begin wxGlade: ChoiceKeyFrameDialog::attributes wxStaticText* labelFrame; wxTextCtrl* textFrame; wxStaticText* labelSelection; wxComboBox* comboChoice; wxButton* btnCancel; wxButton* btnOK; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnChoiceCombo(wxCommandEvent &event); // wxGlade: virtual void OnFrameText(wxCommandEvent &event); // wxGlade: }; // wxGlade: end class #endif // CHOICEKEYFRAMEDIALOG_H 3Depict-0.0.19/src/gui/dialogs/animateSubDialogs/realKeyFrameDialog.h0000644000175000017500000002537112717201575024727 0ustar pcuserpcuser/* * realKeyFrameDialog.h - Real value keyframe selection dialog * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.5 on Tue Aug 28 22:07:07 2012 #ifndef REALKEYFRAMEDIALOG_H #define REALKEYFRAMEDIALOG_H // begin wxGlade: ::dependencies // end wxGlade #include "wx/wxcommon.h" enum { TRANSITION_STEP, TRANSITION_INTERP, TRANSITION_END }; // begin wxGlade: ::extracode enum { ID_COMBO_TRANSITION, ID_TEXT_FRAME_START, ID_TEXT_FRAME_END, ID_TEXT_FINAL_VALUE, ID_TEXT_INITIAL_VALUE, }; // end wxGlade template class RealKeyFrameDialog: public wxDialog { public: // begin wxGlade: RealKeyFrameDialog::ids // end wxGlade RealKeyFrameDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); //!Return the keyframe transition style selected by user size_t getTransitionMode() const { return transitionMode;} //!Return the initial frame from user size_t getEndFrame() const { return endFrame;} //!Return the start frame, as was given by user size_t getStartFrame() const { return startFrame;} //!Return the initial value, as given by user T getEndValue() const { return endValue;} //!Return the start value, as was given by user T getStartValue() const { return startValue;} private: size_t transitionMode; size_t startFrame, endFrame; T startValue, endValue; bool startFrameOK,endFrameOK; bool startValueOK,endValueOK; void updateOKButton(); // begin wxGlade: RealKeyFrameDialog::methods void set_properties(); void do_layout(); // end wxGlade protected: // begin wxGlade: RealKeyFrameDialog::attributes wxStaticBox* sizerMainArea_staticbox; wxStaticText* labelTransition; wxComboBox* comboTransition; wxStaticText* labelFrameStart; wxTextCtrl* textFrameStart; wxStaticText* labelFrameEnd; wxTextCtrl* textFrameEnd; wxStaticLine* verticalLine; wxStaticText* labelStartVal; wxTextCtrl* textStartVal; wxStaticText* labelEndVal; wxTextCtrl* textEndVal; wxButton* buttonCancel; wxButton* buttonOK; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnComboTransition(wxCommandEvent &event); // wxGlade: virtual void OnTextStartFrame(wxCommandEvent &event); // wxGlade: virtual void OnTextEndFrame(wxCommandEvent &event); // wxGlade: virtual void OnTextStartValue(wxCommandEvent &event); // wxGlade: virtual void OnTextEndValue(wxCommandEvent &event); // wxGlade: }; // wxGlade: end class using std::string; bool validatePoint3D(wxTextCtrl *t, Point3D &i) { bool isOK; std::string s; s= stlStr(t->GetValue()); //string cannot be empty bool condition; condition = s.empty() || !i.parse(s); if(condition) { //OK, so bad things happened. Prevent the user from doing this isOK=false; //if it is bad and non-empty, highlight it as such // if it is empty, then just set it to normal colour if(s.empty()) t->SetBackgroundColour(wxNullColour); else t->SetBackgroundColour(*wxCYAN); } else { t->SetBackgroundColour(wxNullColour); isOK=true; } return isOK; } template RealKeyFrameDialog::RealKeyFrameDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxMAXIMIZE_BOX|wxMINIMIZE_BOX) { // begin wxGlade: RealKeyFrameDialog::RealKeyFrameDialog sizerMainArea_staticbox = new wxStaticBox(this, -1, wxT("Keyframe Data")); labelTransition = new wxStaticText(this, wxID_ANY, wxT("Transition")); //FIXME: This is declared in animator.h, use it! const wxString comboTransition_choices[] = { wxT("Step"), wxT("Ramp") }; comboTransition = new wxComboBox(this, ID_COMBO_TRANSITION, wxT(""), wxDefaultPosition, wxDefaultSize, 2, comboTransition_choices, wxCB_DROPDOWN|wxCB_READONLY); labelFrameStart = new wxStaticText(this, wxID_ANY, wxT("Start Frame"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); textFrameStart = new wxTextCtrl(this, ID_TEXT_FRAME_START, wxEmptyString); labelFrameEnd = new wxStaticText(this, wxID_ANY, wxT("End Frame"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); textFrameEnd = new wxTextCtrl(this, ID_TEXT_FRAME_END, wxEmptyString); verticalLine = new wxStaticLine(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL); labelStartVal = new wxStaticText(this, wxID_ANY, wxT("Start Value"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); textStartVal = new wxTextCtrl(this, ID_TEXT_INITIAL_VALUE, wxEmptyString); labelEndVal = new wxStaticText(this, wxID_ANY, wxT("End Value"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); textEndVal = new wxTextCtrl(this, ID_TEXT_FINAL_VALUE, wxEmptyString); buttonCancel = new wxButton(this, wxID_CANCEL, wxEmptyString); buttonOK = new wxButton(this, wxID_OK, wxEmptyString); startFrameOK=endFrameOK=startValueOK=endValueOK=false; const int DEFAULT_TRANSITION=TRANSITION_INTERP; comboTransition->SetSelection(DEFAULT_TRANSITION); transitionMode=DEFAULT_TRANSITION; set_properties(); do_layout(); // end wxGlade } BEGIN_EVENT_TABLE_TEMPLATE1(RealKeyFrameDialog, wxDialog,T) // begin wxGlade: RealKeyFrameDialog::event_table EVT_COMBOBOX(ID_COMBO_TRANSITION, RealKeyFrameDialog::OnComboTransition) EVT_TEXT(ID_TEXT_FRAME_START, RealKeyFrameDialog::OnTextStartFrame) EVT_TEXT(ID_TEXT_FRAME_END, RealKeyFrameDialog::OnTextEndFrame) EVT_TEXT(ID_TEXT_INITIAL_VALUE, RealKeyFrameDialog::OnTextStartValue) EVT_TEXT(ID_TEXT_FINAL_VALUE, RealKeyFrameDialog::OnTextEndValue) // end wxGlade END_EVENT_TABLE(); template void RealKeyFrameDialog::updateOKButton() { bool isOK=true; isOK&=startFrameOK; //step transitions need to be handled without end frame isOK&=endFrameOK || transitionMode==TRANSITION_STEP; //Ensure start frame is > end frame if(isOK && transitionMode != TRANSITION_STEP) { isOK&=(startFrameSetBackgroundColour(*wxCYAN); textFrameEnd->SetBackgroundColour(*wxCYAN); } else { textFrameStart->SetBackgroundColour(wxNullColour); textFrameEnd->SetBackgroundColour(wxNullColour); } } isOK&=startValueOK; isOK&=endValueOK || transitionMode==TRANSITION_STEP; buttonOK->Enable(isOK); } template void RealKeyFrameDialog::OnComboTransition(wxCommandEvent &event) { ASSERT(event.GetInt() < TRANSITION_END); transitionMode=event.GetInt(); textEndVal->Enable(transitionMode != TRANSITION_STEP); textFrameEnd->Enable(transitionMode!=TRANSITION_STEP); } template void RealKeyFrameDialog::OnTextStartFrame(wxCommandEvent &event) { startFrameOK=validateTextAsStream(textFrameStart,startFrame); updateOKButton(); } template void RealKeyFrameDialog::OnTextEndFrame(wxCommandEvent &event) { endFrameOK=validateTextAsStream(textFrameEnd,endFrame); updateOKButton(); } template void RealKeyFrameDialog::OnTextStartValue(wxCommandEvent &event) { startValueOK=validateTextAsStream(textStartVal,startValue); updateOKButton(); } template<> void RealKeyFrameDialog::OnTextStartValue(wxCommandEvent &evt) { startValueOK=validatePoint3D(textStartVal,startValue); updateOKButton(); } template void RealKeyFrameDialog::OnTextEndValue(wxCommandEvent &event) { endValueOK=validateTextAsStream(textEndVal,endValue); updateOKButton(); } template<> void RealKeyFrameDialog::OnTextEndValue(wxCommandEvent &evt) { endValueOK=validatePoint3D(textEndVal,endValue); updateOKButton(); } // wxGlade: add RealKeyFrameDialog event handlers template void RealKeyFrameDialog::set_properties() { // begin wxGlade: RealKeyFrameDialog::set_properties comboTransition->SetSelection(-1); // end wxGlade } template void RealKeyFrameDialog::do_layout() { // begin wxGlade: RealKeyFrameDialog::do_layout wxBoxSizer* sizerTop = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerBUttons = new wxBoxSizer(wxHORIZONTAL); wxStaticBoxSizer* sizerMainArea = new wxStaticBoxSizer(sizerMainArea_staticbox, wxHORIZONTAL); wxBoxSizer* sizerRight = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerRightEnd = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerRightStart = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerLeft = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerEndFrame = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerStartFrame = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerTransition = new wxBoxSizer(wxHORIZONTAL); sizerTop->Add(20, 5, 0, 0, 0); sizerMainArea->Add(10, 20, 0, 0, 0); sizerLeft->Add(20, 10, 0, 0, 0); sizerTransition->Add(labelTransition, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 14); sizerTransition->Add(comboTransition, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5); sizerLeft->Add(sizerTransition, 1, wxEXPAND, 0); sizerStartFrame->Add(labelFrameStart, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); sizerStartFrame->Add(textFrameStart, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 4); sizerLeft->Add(sizerStartFrame, 1, wxEXPAND, 0); sizerEndFrame->Add(labelFrameEnd, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 12); sizerEndFrame->Add(textFrameEnd, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 4); sizerLeft->Add(sizerEndFrame, 1, wxEXPAND, 0); sizerLeft->Add(20, 10, 0, 0, 0); sizerMainArea->Add(sizerLeft, 1, wxEXPAND, 0); sizerMainArea->Add(verticalLine, 0, wxLEFT|wxRIGHT|wxEXPAND, 5); sizerRight->Add(20, 20, 1, 0, 0); sizerRightStart->Add(labelStartVal, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); sizerRightStart->Add(textStartVal, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 4); sizerRight->Add(sizerRightStart, 1, wxEXPAND, 0); sizerRightEnd->Add(labelEndVal, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 9); sizerRightEnd->Add(textEndVal, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 4); sizerRight->Add(sizerRightEnd, 1, wxEXPAND, 0); sizerRight->Add(20, 20, 1, 0, 0); sizerMainArea->Add(sizerRight, 1, wxEXPAND, 0); sizerMainArea->Add(10, 20, 0, 0, 0); sizerTop->Add(sizerMainArea, 1, wxEXPAND, 0); sizerBUttons->Add(20, 20, 1, 0, 0); sizerBUttons->Add(buttonCancel, 0, wxALL, 4); sizerBUttons->Add(buttonOK, 0, wxALL, 4); sizerTop->Add(sizerBUttons, 0, wxEXPAND, 0); SetSizer(sizerTop); sizerTop->Fit(this); Layout(); // end wxGlade } #endif // REALKEYFRAMEDIALOG_H 3Depict-0.0.19/src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.h0000644000175000017500000000607112640746376025313 0ustar pcuserpcuser/* * colourKeyFrameDialog.h -Colour property keyframe selection dialog * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.5 on Fri Sep 14 09:37:57 2012 #ifndef COLOURKEYFRAMEDIALOG_H #define COLOURKEYFRAMEDIALOG_H #include // begin wxGlade: ::dependencies #include // end wxGlade // begin wxGlade: ::extracode // end wxGlade class ColourKeyFrameDialog: public wxDialog { public: // begin wxGlade: ColourKeyFrameDialog::ids // end wxGlade ColourKeyFrameDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); size_t getTransitionMode() const { return transitionMode;}; //Get the staring colour as a hex string std::string getStartValue() const; //Get the ending colour as a hex string std::string getEndValue() const; size_t getStartFrame() const ; size_t getEndFrame() const ; private: // begin wxGlade: ColourKeyFrameDialog::methods void set_properties(); void do_layout(); // end wxGlade //Starting red, green and blue values for transition unsigned char startRed,startGreen, startBlue; unsigned char endRed,endGreen, endBlue; size_t startFrame,endFrame; size_t transitionMode; bool startFrameOK,endFrameOK; //!Update the OK button's enabled/disabled state // based upon text field validity void updateOKButton(); //!Update the colour chooser buttons appearance void updateButtonColours(); protected: // begin wxGlade: ColourKeyFrameDialog::attributes wxStaticBox* sizerMainArea_staticbox; wxStaticText* labelTransition; wxComboBox* comboTransition; wxStaticText* labelFrameStart; wxTextCtrl* textFrameStart; wxStaticText* labelFrameEnd; wxTextCtrl* textFrameEnd; wxStaticLine* verticalLine; wxStaticText* labelStartVal; wxButton* btnStartColour; wxStaticText* labelFinalVal; wxButton* btnEndColour; wxButton* buttonCancel; wxButton* buttonOK; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnComboTransition(wxCommandEvent &event); // wxGlade: virtual void OnTextStartFrame(wxCommandEvent &event); // wxGlade: virtual void OnTextEndFrame(wxCommandEvent &event); // wxGlade: virtual void OnBtnStartColour(wxCommandEvent &event); // wxGlade: virtual void OnBtnEndColour(wxCommandEvent &event); // wxGlade: }; // wxGlade: end class #endif // COLOURKEYFRAMEDIALOG_H 3Depict-0.0.19/src/gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp0000644000175000017500000000753012640746376025576 0ustar pcuserpcuser/* * choiceKeyFrameDialog.cpp - Keyframe selection for optioned properties * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.5 on Sun Sep 23 22:52:41 2012 #include "choiceKeyFrameDialog.h" // begin wxGlade: ::extracode // end wxGlade #include "wx/wxcommon.h" ChoiceKeyFrameDialog::ChoiceKeyFrameDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE) { // begin wxGlade: ChoiceKeyFrameDialog::ChoiceKeyFrameDialog labelFrame = new wxStaticText(this, wxID_ANY, wxT("Frame")); textFrame = new wxTextCtrl(this, ID_TEXT_FRAME, wxEmptyString); labelSelection = new wxStaticText(this, wxID_ANY, wxT("Selection")); comboChoice = new wxComboBox(this, ID_COMBO_CHOICE, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN|wxCB_SIMPLE|wxCB_READONLY); btnCancel = new wxButton(this, wxID_CANCEL, wxEmptyString); btnOK = new wxButton(this, wxID_OK, wxEmptyString); startFrameOK=false; set_properties(); do_layout(); // end wxGlade } BEGIN_EVENT_TABLE(ChoiceKeyFrameDialog, wxDialog) // begin wxGlade: ChoiceKeyFrameDialog::event_table EVT_COMBOBOX(ID_COMBO_CHOICE, ChoiceKeyFrameDialog::OnChoiceCombo) EVT_TEXT(ID_TEXT_FRAME, ChoiceKeyFrameDialog::OnFrameText) // end wxGlade END_EVENT_TABLE(); void ChoiceKeyFrameDialog::OnChoiceCombo(wxCommandEvent &event) { choice=comboChoice->GetSelection(); } void ChoiceKeyFrameDialog::OnFrameText(wxCommandEvent &event) { if(validateTextAsStream(textFrame,startFrame)) startFrameOK=true; updateOKButton(); } // wxGlade: add ChoiceKeyFrameDialog event handlers void ChoiceKeyFrameDialog::updateOKButton() { btnOK->Enable(startFrameOK); } void ChoiceKeyFrameDialog::buildCombo(size_t defaultChoice) { ASSERT(choiceStrings.size()); comboChoice->Clear(); for(size_t ui=0;uiAppend((choiceStrings[ui])); comboChoice->SetSelection(defaultChoice); } void ChoiceKeyFrameDialog::setChoices(const std::vector &choices, size_t defChoice) { choiceStrings=choices; buildCombo(defChoice); choice=defChoice; } void ChoiceKeyFrameDialog::set_properties() { // begin wxGlade: ChoiceKeyFrameDialog::set_properties SetTitle(wxT("Key Frame")); // end wxGlade } void ChoiceKeyFrameDialog::do_layout() { // begin wxGlade: ChoiceKeyFrameDialog::do_layout wxBoxSizer* frameSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* buttonSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* comboSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* textSizer = new wxBoxSizer(wxHORIZONTAL); textSizer->Add(labelFrame, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 20); textSizer->Add(textFrame, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5); frameSizer->Add(textSizer, 0, wxALL|wxEXPAND, 10); comboSizer->Add(labelSelection, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); comboSizer->Add(comboChoice, 0, wxLEFT, 5); frameSizer->Add(comboSizer, 0, wxLEFT|wxRIGHT|wxTOP|wxEXPAND, 10); buttonSizer->Add(20, 20, 1, 0, 0); buttonSizer->Add(btnCancel, 0, wxRIGHT, 5); buttonSizer->Add(btnOK, 0, wxLEFT, 5); frameSizer->Add(buttonSizer, 0, wxALL|wxEXPAND, 5); SetSizer(frameSizer); frameSizer->Fit(this); Layout(); // end wxGlade } 3Depict-0.0.19/src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.h0000644000175000017500000000625612640746376025323 0ustar pcuserpcuser/* * stringKeyFrameDialog.h -String value keyframe selection dialog * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.5 on Sat Sep 22 21:13:08 2012 #include // begin wxGlade: ::dependencies #include // end wxGlade #include #ifndef STRINGKEYFRAMEDIALOG_H #define STRINGKEYFRAMEDIALOG_H class StringKeyFrameDialog: public wxDialog { public: // begin wxGlade: StringKeyFrameDialog::ids // end wxGlade StringKeyFrameDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); //!Data size_t getStartFrame() const ; bool getStrings(std::vector &res) const; private: // begin wxGlade: StringKeyFrameDialog::methods void set_properties(); void do_layout(); // end wxGlade //!Should we be using a file as the string data source? bool dataSourceFromFile; //!File to use as the data source std::string dataFilename; //!Initial frame to use for value strings size_t startFrame; //strings that are to be used as the data for each frame std::vector valueStrings; //!Check to see if the various data elements are OK bool startFrameOK, filenameOK,gridOK; //Enable/disable OK button, checking dialog content validity void updateOKButton(); //Build the grid UI from the internal string value data void buildGrid(); protected: // begin wxGlade: StringKeyFrameDialog::attributes wxStaticText* labelStartFrame; wxTextCtrl* textStartFrame; wxRadioButton* radioFromFile; wxTextCtrl* textFilename; wxButton* btnChooseFile; wxRadioButton* radioFromTable; wxGrid* gridStrings; wxButton* btnStringAdd; wxButton* btnRemove; wxButton* btnCancel; wxButton* btnOK; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnTextStart(wxCommandEvent &event); // wxGlade: virtual void OnFileRadio(wxCommandEvent &event); // wxGlade: virtual void OnTextFilename(wxCommandEvent &event); // wxGlade: virtual void OnBtnChooseFile(wxCommandEvent &event); // wxGlade: virtual void OnTableRadio(wxCommandEvent &event); // wxGlade: virtual void OnGridCellChange(wxGridEvent &event); // wxGlade: virtual void OnGridEditorShown(wxGridEvent &event); // wxGlade: virtual void OnBtnAdd(wxCommandEvent &event); // wxGlade: virtual void OnBtnRemove(wxCommandEvent &event); // wxGlade: }; // wxGlade: end class #endif // STRINGKEYFRAMEDIALOG_H 3Depict-0.0.19/src/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp0000644000175000017500000002647312640746376025661 0ustar pcuserpcuser/* * stringKeyFrameDialog.cpp - String value keyframe selection dialog * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.5 on Sat Sep 22 21:13:08 2012 #include "stringKeyFrameDialog.h" #include "common/translation.h" #include "wx/wxcommon.h" using std::string; using std::vector; // begin wxGlade: ::extracode enum { ID_TEXT_START_FRAME, ID_RADIO_FROM_FILE, ID_TEXT_FROM_FILE, ID_RADIO_FROM_TABLE, ID_GRID_STRINGS }; // end wxGlade StringKeyFrameDialog::StringKeyFrameDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) { // begin wxGlade: StringKeyFrameDialog::StringKeyFrameDialog labelStartFrame = new wxStaticText(this, wxID_ANY, TRANS("Start Frame: ")); textStartFrame = new wxTextCtrl(this, ID_TEXT_START_FRAME, wxEmptyString); radioFromFile = new wxRadioButton(this, ID_RADIO_FROM_FILE, TRANS("From File")); textFilename = new wxTextCtrl(this, ID_TEXT_FROM_FILE, wxEmptyString); btnChooseFile = new wxButton(this, wxID_OPEN, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); radioFromTable = new wxRadioButton(this, ID_RADIO_FROM_TABLE, TRANS("From Table")); gridStrings = new wxGrid(this, ID_GRID_STRINGS); btnStringAdd = new wxButton(this, wxID_ADD, wxEmptyString); btnRemove = new wxButton(this, wxID_REMOVE, wxEmptyString); btnCancel = new wxButton(this, wxID_CANCEL, wxEmptyString); btnOK = new wxButton(this, wxID_OK, wxEmptyString); set_properties(); do_layout(); // end wxGlade startFrame=0; startFrameOK=filenameOK=false; string s; stream_cast(s,startFrame); textStartFrame->SetValue((s)); radioFromFile->SetValue(true); dataSourceFromFile=radioFromFile->GetValue(); } BEGIN_EVENT_TABLE(StringKeyFrameDialog, wxDialog) // begin wxGlade: StringKeyFrameDialog::event_table EVT_TEXT(ID_TEXT_START_FRAME, StringKeyFrameDialog::OnTextStart) EVT_RADIOBUTTON(ID_RADIO_FROM_FILE, StringKeyFrameDialog::OnFileRadio) EVT_TEXT(ID_TEXT_FROM_FILE, StringKeyFrameDialog::OnTextFilename) EVT_BUTTON(wxID_OPEN, StringKeyFrameDialog::OnBtnChooseFile) EVT_RADIOBUTTON(ID_RADIO_FROM_TABLE, StringKeyFrameDialog::OnTableRadio) EVT_GRID_CMD_CELL_CHANGED(ID_GRID_STRINGS, StringKeyFrameDialog::OnGridCellChange) EVT_GRID_CMD_EDITOR_SHOWN(ID_GRID_STRINGS, StringKeyFrameDialog::OnGridEditorShown) EVT_BUTTON(wxID_ADD, StringKeyFrameDialog::OnBtnAdd) EVT_BUTTON(wxID_REMOVE, StringKeyFrameDialog::OnBtnRemove) // end wxGlade END_EVENT_TABLE(); size_t StringKeyFrameDialog::getStartFrame() const { ASSERT(startFrameOK); return startFrame; } void StringKeyFrameDialog::buildGrid() { gridStrings->BeginBatch(); //Empty the grid if(gridStrings->GetNumberCols()) gridStrings->DeleteCols(0,gridStrings->GetNumberCols()); if(gridStrings->GetNumberRows()) gridStrings->DeleteRows(0,gridStrings->GetNumberRows()); gridStrings->AppendCols(2); gridStrings->SetColLabelValue(0,TRANS("Frame")); gridStrings->SetColLabelValue(1,TRANS("Value")); gridStrings->AppendRows(valueStrings.size()); wxGridCellAttr *readOnlyColAttr=new wxGridCellAttr; readOnlyColAttr->SetReadOnly(true); gridStrings->SetColAttr(0,readOnlyColAttr); for(size_t ui=0;uiSetCellValue(ui,0,(pos)); gridStrings->SetCellValue(ui,1,(valueStrings[ui])); } gridStrings->EndBatch(); } bool StringKeyFrameDialog::getStrings(vector &res) const { if(dataSourceFromFile) { vector > dataVec; if(loadTextStringData(dataFilename.c_str(), dataVec,"\t")) return false; res.reserve(dataVec.size()); for(size_t ui=0;uiGetValue(); if(dataSourceFromFile) { //Disable grid & enable text box gridStrings->Enable(false); textFilename->Enable(true); btnChooseFile->Enable(true); } else { //Enable grid & disable text box gridStrings->Enable(true); textFilename->Enable(false); btnChooseFile->Enable(false); } } void StringKeyFrameDialog::OnTableRadio(wxCommandEvent &event) { dataSourceFromFile=!radioFromTable->GetValue(); if(dataSourceFromFile) { //Disable grid & enable text box gridStrings->Enable(false); textFilename->Enable(true); btnChooseFile->Enable(true); } else { //Enable grid & disable text box gridStrings->Enable(true); textFilename->Enable(false); btnChooseFile->Enable(false); } } void StringKeyFrameDialog::OnTextFilename(wxCommandEvent &event) { if(!wxFileExists(textFilename->GetValue())) { textFilename->SetBackgroundColour(*wxCYAN); filenameOK=false; dataFilename.clear(); } else { textFilename->SetBackgroundColour(wxNullColour); filenameOK=true; dataFilename=stlStr(textFilename->GetValue()); } updateOKButton(); } void StringKeyFrameDialog::updateOKButton() { bool isOK=true; isOK&=startFrameOK; if(dataSourceFromFile) isOK&=filenameOK; else isOK&=(bool)(valueStrings.size()); btnOK->Enable(isOK); } void StringKeyFrameDialog::OnGridCellChange(wxGridEvent &event) { std::string s; s=stlStr(gridStrings->GetCellValue(event.GetRow(),event.GetCol())); valueStrings[event.GetRow()] = s; } void StringKeyFrameDialog::OnGridEditorShown(wxGridEvent &event) { event.Skip(); wxLogDebug(wxT("Event handler (StringKeyFrameDialog::OnGridEditorShown) not implemented yet")); //notify the user that he hasn't implemented the event handler yet } void StringKeyFrameDialog::OnBtnChooseFile(wxCommandEvent &event) { //Pop up a directory dialog, to choose the base path for the new folder wxFileDialog *wxD = new wxFileDialog(this,TRANS("Select text file..."), wxT(""), wxT(""),TRANS("Text files (*.txt)|*.txt;|All Files (*)|*"),wxFD_OPEN|wxFD_FILE_MUST_EXIST); unsigned int res; res = wxD->ShowModal(); while(res != wxID_CANCEL) { //If dir exists, exit if(wxFileExists(wxD->GetPath())) break; res=wxD->ShowModal(); } //User aborted directory choice. if(res==wxID_CANCEL) { wxD->Destroy(); return; } textFilename->SetValue(wxD->GetPath()); wxD->Destroy(); } void StringKeyFrameDialog::OnBtnAdd(wxCommandEvent &event) { wxMouseState wxm = wxGetMouseState(); if(wxm.ShiftDown()) valueStrings.resize(valueStrings.size() + 5,""); else if (wxm.CmdDown()) valueStrings.resize(valueStrings.size() + 10,""); else valueStrings.push_back(""); buildGrid(); updateOKButton(); } void StringKeyFrameDialog::OnBtnRemove(wxCommandEvent &event) { if(!gridStrings->GetNumberRows()) return; // Whole selected rows. const wxArrayInt& rows(gridStrings->GetSelectedRows()); for (size_t i = rows.size(); i--; ) { valueStrings.erase(valueStrings.begin() + rows[i], valueStrings.begin()+rows[i]+1); } if(!rows.size()) { //Obtain the IDs of the selected rows, or partially selected rows wxGridCellCoordsArray selectedRows = gridStrings->GetSelectedCells(); wxGridCellCoordsArray arrayTL(gridStrings->GetSelectionBlockTopLeft()); wxGridCellCoordsArray arrayBR(gridStrings->GetSelectionBlockBottomRight()); //This is an undocumented class AFAIK. :( if(arrayTL.Count() && arrayBR.Count()) { //Grab the coordinates f the selection block, // top left (TL) and bottom right (BR) wxGridCellCoords coordTL = arrayTL.Item(0); wxGridCellCoords coordBR = arrayBR.Item(0); size_t rows = coordBR.GetRow() - coordTL.GetRow()+1; ASSERT(coordTL.GetRow()+rows-1GetGridCursorRow(); ASSERT(rowToKillSetToolTip(TRANS("Frame offset for data start")); textFilename->SetToolTip(TRANS("File to use as string data source, one value per row")); btnChooseFile->SetToolTip(TRANS("Select file to use as data source")); radioFromTable->SetToolTip(TRANS("Use table below for data source")); gridStrings->CreateGrid(0, 2); gridStrings->SetColLabelValue(0, TRANS("Frame")); gridStrings->SetColSize(0, 1); gridStrings->SetColLabelValue(1, TRANS("Value")); gridStrings->SetColSize(1, 3); btnStringAdd->SetToolTip(TRANS("Add new data rows to table, hold shift/cmd to insert multiple rows")); btnRemove->SetToolTip(TRANS("Remove selected strings from table")); btnCancel->SetToolTip(TRANS("Abort value selection and return to previous window")); btnOK->SetToolTip(TRANS("Accept data values")); // end wxGlade } void StringKeyFrameDialog::do_layout() { // begin wxGlade: StringKeyFrameDialog::do_layout wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* footerSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* gridAreaSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* gridButtonSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* fromFileSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* startFrameSizer = new wxBoxSizer(wxHORIZONTAL); startFrameSizer->Add(labelStartFrame, 0, wxALIGN_CENTER_VERTICAL, 0); startFrameSizer->Add(textStartFrame, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 6); startFrameSizer->Add(20, 20, 1, 0, 0); mainSizer->Add(startFrameSizer, 0, wxALL|wxEXPAND, 6); fromFileSizer->Add(radioFromFile, 0, wxALIGN_CENTER_VERTICAL, 0); fromFileSizer->Add(textFilename, 1, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 6); fromFileSizer->Add(btnChooseFile, 0, wxLEFT|wxRIGHT, 6); mainSizer->Add(fromFileSizer, 0, wxALL|wxEXPAND, 6); mainSizer->Add(radioFromTable, 0, wxLEFT, 6); gridAreaSizer->Add(gridStrings, 1, wxALL|wxEXPAND, 5); gridButtonSizer->Add(btnStringAdd, 0, wxBOTTOM, 5); gridButtonSizer->Add(btnRemove, 0, 0, 0); gridAreaSizer->Add(gridButtonSizer, 0, wxRIGHT|wxEXPAND, 5); mainSizer->Add(gridAreaSizer, 1, wxEXPAND, 0); footerSizer->Add(20, 20, 1, 0, 0); footerSizer->Add(btnCancel, 0, wxALL, 5); footerSizer->Add(btnOK, 0, wxALL, 5); mainSizer->Add(footerSizer, 0, wxEXPAND, 0); SetSizer(mainSizer); Layout(); // end wxGlade } 3Depict-0.0.19/src/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp0000644000175000017500000002340212717201575025633 0ustar pcuserpcuser/* * colourKeyFrameDialog.cpp - Colour property keyframe selection dialog * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade 0.6.5 on Fri Sep 14 09:37:57 2012 #include "colourKeyFrameDialog.h" #include "common/stringFuncs.h" #include "wx/wxcommon.h" #include "common/translation.h" #include //TODO: Currently we change the foreground text in a button to set colour. // better would be to use a "swatch" using std::string; // begin wxGlade: ::extracode enum{ ID_COMBO_TRANSITION, ID_BTN_START_VALUE, ID_BTN_FINAL_VALUE, ID_TEXT_INITIAL_VALUE, ID_TEXT_FRAME_START, ID_TEXT_FRAME_END }; // end wxGlade //FIXME: Is currently duplicated from realKeyframeDialog. Needs to be // unified enum { TRANSITION_STEP, TRANSITION_INTERP, TRANSITION_END }; ColourKeyFrameDialog::ColourKeyFrameDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxMAXIMIZE_BOX|wxMINIMIZE_BOX) { // begin wxGlade: ColourKeyFrameDialog::ColourKeyFrameDialog sizerMainArea_staticbox = new wxStaticBox(this, -1, TRANS("Keyframe Data")); labelTransition = new wxStaticText(this, wxID_ANY, TRANS("Transition")); //FIXME: THis is declared in animator.h - use that def. const wxString comboTransition_choices[] = { TRANS("Step"), TRANS("Ramp") }; comboTransition = new wxComboBox(this, ID_COMBO_TRANSITION, wxT(""), wxDefaultPosition, wxDefaultSize, 2, comboTransition_choices, wxCB_DROPDOWN|wxCB_READONLY); labelFrameStart = new wxStaticText(this, wxID_ANY, TRANS("Start Frame"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); textFrameStart = new wxTextCtrl(this, ID_TEXT_FRAME_START, wxEmptyString); labelFrameEnd = new wxStaticText(this, wxID_ANY, TRANS("End Frame"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); textFrameEnd = new wxTextCtrl(this, ID_TEXT_FRAME_END, wxEmptyString); verticalLine = new wxStaticLine(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL); labelStartVal = new wxStaticText(this, wxID_ANY, TRANS("Initial Value"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); btnStartColour = new wxButton(this, ID_BTN_START_VALUE, TRANS("startColour"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); labelFinalVal = new wxStaticText(this, wxID_ANY, TRANS("Final Value"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); btnEndColour = new wxButton(this, ID_BTN_FINAL_VALUE, TRANS("endColour"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT); buttonCancel = new wxButton(this, wxID_CANCEL, wxEmptyString); buttonOK = new wxButton(this, wxID_OK, wxEmptyString); comboTransition->SetSelection(1); transitionMode=TRANSITION_INTERP; endFrameOK=startFrameOK=false; startRed=startGreen=startBlue=0; endRed=endGreen=endBlue=0; updateOKButton(); updateButtonColours(); set_properties(); do_layout(); // end wxGlade } BEGIN_EVENT_TABLE(ColourKeyFrameDialog, wxDialog) // begin wxGlade: ColourKeyFrameDialog::event_table EVT_COMBOBOX(ID_COMBO_TRANSITION, ColourKeyFrameDialog::OnComboTransition) EVT_TEXT(ID_TEXT_FRAME_START, ColourKeyFrameDialog::OnTextStartFrame) EVT_TEXT(ID_TEXT_FRAME_END, ColourKeyFrameDialog::OnTextEndFrame) EVT_BUTTON(ID_BTN_START_VALUE, ColourKeyFrameDialog::OnBtnStartColour) EVT_BUTTON(ID_BTN_FINAL_VALUE, ColourKeyFrameDialog::OnBtnEndColour) // end wxGlade END_EVENT_TABLE(); size_t ColourKeyFrameDialog::getStartFrame() const { ASSERT(startFrameOK); return startFrame; } size_t ColourKeyFrameDialog::getEndFrame() const { ASSERT(endFrameOK); return endFrame; } std::string ColourKeyFrameDialog::getEndValue() const { ASSERT(transitionMode!=TRANSITION_STEP); ColourRGBA rgb(endRed,endGreen,endBlue); return rgb.rgbString(); } std::string ColourKeyFrameDialog::getStartValue() const { ColourRGBA rgb(startRed,startGreen,startBlue); return rgb.rgbString(); } void ColourKeyFrameDialog::OnComboTransition(wxCommandEvent &event) { ASSERT(event.GetInt() < TRANSITION_END); transitionMode=event.GetInt(); btnEndColour->Enable(transitionMode != TRANSITION_STEP); textFrameEnd->Enable(transitionMode!=TRANSITION_STEP); } void ColourKeyFrameDialog::OnTextStartFrame(wxCommandEvent &event) { startFrameOK=validateTextAsStream(textFrameStart,startFrame); updateOKButton(); } void ColourKeyFrameDialog::OnTextEndFrame(wxCommandEvent &event) { endFrameOK=validateTextAsStream(textFrameEnd,endFrame); updateOKButton(); } void ColourKeyFrameDialog::OnBtnStartColour(wxCommandEvent &event) { wxColourData d; wxColourDialog *colDg=new wxColourDialog(this->GetParent(),&d); if( colDg->ShowModal() == wxID_OK) { wxColour c; //Change the colour c=colDg->GetColourData().GetColour(); startRed=c.Red(); startGreen=c.Green(); startBlue=c.Blue(); updateButtonColours(); } delete colDg; } void ColourKeyFrameDialog::OnBtnEndColour(wxCommandEvent &event) { wxColourData d; wxColourDialog *colDg=new wxColourDialog(this->GetParent(),&d); if( colDg->ShowModal() == wxID_OK) { wxColour c; //Change the colour c=colDg->GetColourData().GetColour(); endRed=c.Red(); endGreen=c.Green(); endBlue=c.Blue(); updateButtonColours(); } colDg->Destroy(); } void ColourKeyFrameDialog::updateOKButton() { bool isOK=true; isOK&=startFrameOK; isOK&= (endFrameOK || transitionMode == TRANSITION_STEP) ; if(isOK) { if(transitionMode == TRANSITION_INTERP) { //Ensure start frame is > end frame, // if we are using interp mode isOK&=(startFrameSetBackgroundColour(*wxCYAN); if(transitionMode == TRANSITION_INTERP) textFrameEnd->SetBackgroundColour(*wxCYAN); else textFrameEnd->SetBackgroundColour(wxNullColour); } else { textFrameStart->SetBackgroundColour(wxNullColour); textFrameEnd->SetBackgroundColour(wxNullColour); } } //Enable the OK button if all properties are set appropriately buttonOK->Enable(isOK); } void ColourKeyFrameDialog::updateButtonColours() { wxColour colD; colD.Set(startRed,startGreen,startBlue); btnStartColour->SetForegroundColour(colD); colD.Set(endRed,endGreen,endBlue); btnEndColour->SetForegroundColour(colD); } // wxGlade: add ColourKeyFrameDialog event handlers void ColourKeyFrameDialog::set_properties() { // begin wxGlade: ColourKeyFrameDialog::set_properties SetTitle(TRANS("Key Frame : Colour")); comboTransition->SetSelection(-1); btnStartColour->SetToolTip(TRANS("Colour at the start of the transtition")); btnEndColour->SetToolTip(TRANS("Colour at end of transition")); // end wxGlade } void ColourKeyFrameDialog::do_layout() { // begin wxGlade: ColourKeyFrameDialog::do_layout wxBoxSizer* sizerTop = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerBUttons = new wxBoxSizer(wxHORIZONTAL); wxStaticBoxSizer* sizerMainArea = new wxStaticBoxSizer(sizerMainArea_staticbox, wxHORIZONTAL); wxBoxSizer* sizerRight = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerRightFinal = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerRightInitial = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerLeft = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerEndFrame = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerStartFrame = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerTransition = new wxBoxSizer(wxHORIZONTAL); sizerTop->Add(20, 5, 0, 0, 0); sizerMainArea->Add(10, 20, 0, 0, 0); sizerLeft->Add(20, 10, 0, 0, 0); sizerTransition->Add(labelTransition, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 14); sizerTransition->Add(comboTransition, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5); sizerLeft->Add(sizerTransition, 1, wxEXPAND, 0); sizerStartFrame->Add(labelFrameStart, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); sizerStartFrame->Add(textFrameStart, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 4); sizerLeft->Add(sizerStartFrame, 1, wxEXPAND, 0); sizerEndFrame->Add(labelFrameEnd, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 12); sizerEndFrame->Add(textFrameEnd, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 4); sizerLeft->Add(sizerEndFrame, 1, wxEXPAND, 0); sizerLeft->Add(20, 10, 0, 0, 0); sizerMainArea->Add(sizerLeft, 2, wxEXPAND, 0); sizerMainArea->Add(verticalLine, 0, wxLEFT|wxRIGHT|wxEXPAND, 5); sizerRight->Add(20, 20, 1, 0, 0); sizerRightInitial->Add(20, 20, 1, 0, 0); sizerRightInitial->Add(labelStartVal, 2, wxRIGHT|wxALIGN_CENTER_VERTICAL, 0); sizerRightInitial->Add(btnStartColour, 0, wxALL|wxALIGN_CENTER_VERTICAL, 3); sizerRightInitial->Add(20, 20, 1, 0, 0); sizerRight->Add(sizerRightInitial, 1, wxEXPAND, 0); sizerRightFinal->Add(20, 20, 1, 0, 0); sizerRightFinal->Add(labelFinalVal, 2, wxRIGHT|wxALIGN_CENTER_VERTICAL, 9); sizerRightFinal->Add(btnEndColour, 0, wxALL|wxALIGN_CENTER_VERTICAL, 3); sizerRightFinal->Add(20, 20, 1, 0, 0); sizerRight->Add(sizerRightFinal, 1, wxEXPAND, 0); sizerRight->Add(20, 20, 1, 0, 0); sizerMainArea->Add(sizerRight, 2, wxEXPAND, 0); sizerMainArea->Add(10, 20, 0, 0, 0); sizerTop->Add(sizerMainArea, 1, wxEXPAND, 0); sizerBUttons->Add(20, 20, 1, 0, 0); sizerBUttons->Add(buttonCancel, 0, wxALL, 4); sizerBUttons->Add(buttonOK, 0, wxALL, 4); sizerTop->Add(sizerBUttons, 0, wxEXPAND, 0); SetSizer(sizerTop); sizerTop->Fit(this); Layout(); // end wxGlade } 3Depict-0.0.19/src/gui/dialogs/ExportRngDialog.h0000644000175000017500000000456212640746376020724 0ustar pcuserpcuser/* * ExportRngDialog.h - Range data export dialog * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef EXPORTRNGDIALOG_H #define EXPORTRNGDIALOG_H #include // begin wxGlade: ::dependencies #include #include // end wxGlade #include #include class VisController; class Filter; class ExportRngDialog: public wxDialog { public: // begin wxGlade: ExportRngDialog::ids // end wxGlade ExportRngDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_DIALOG_STYLE); private: //!Vis controller pointer FIXME: Can we downgrade this to const? VisController *visControl; //!vector containing currently available filter streams std::vector rngFilters; // begin wxGlade: ExportRngDialog::methods void set_properties(); void do_layout(); // end wxGlade //!Use filter data to draw wx widget void updateRangeList(); //!Draw details of selected range into grid void updateGrid(unsigned int index); unsigned int selectedRange; protected: // begin wxGlade: ExportRngDialog::attributes wxStaticText* lblRanges; wxListCtrl* listRanges; wxStaticText* label_3; wxGrid* gridDetails; wxButton* btnOK; wxButton* btnCancel; // end wxGlade DECLARE_EVENT_TABLE(); public: virtual void OnListRangeItemActivate(wxListEvent &event); // wxGlade: virtual void OnSave(wxCommandEvent &event); // wxGlade: virtual void OnCancel(wxCommandEvent &event); // wxGlade: void addRangeData(std::vector rangeData); }; // wxGlade: end class #endif // EXPORTRNGDIALOG_H 3Depict-0.0.19/src/gui/dialogs/prefDialog.cpp0000644000175000017500000004500012640746376020253 0ustar pcuserpcuser/* * prefDialog.cpp - mathgl plot wrapper class * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // -*- C++ -*- generated by wxGlade HG on Fri Dec 3 22:26:29 2010 #include "prefDialog.h" #include "backend/filters/allFilter.h" #include "backend/viscontrol.h" #include "common/stringFuncs.h" #include "wx/wxcommon.h" #include "wx/wxcomponents.h" #include "wx/propertyGridUpdater.h" #include using std::vector; // begin wxGlade: ::extracode // end wxGlade enum { ID_LIST_FILTERS = wxID_ANY+1, ID_GRID_PROPERTIES, ID_BTN_RESET_FILTER, ID_BTN_RESET_FILTER_ALL, ID_START_CHECK_CONTROL, ID_START_CHECK_PLOTLIST, ID_START_CHECK_RAWDATA, ID_START_COMBO_PANEL, ID_CHECK_PREFER_ORTHO, ID_MOUSE_MOVE_SLIDER, ID_MOUSE_ZOOM_SLIDER, }; //Number that enum { STARTUP_COMBO_SELECT_SHOW_ALL, STARTUP_COMBO_SELECT_REMEMBER, STARTUP_COMBO_SELECT_SPECIFY }; PrefDialog::PrefDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, style) { // begin wxGlade: prefDialog::prefDialog notePrefPanels = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0); notePrefPanels_pane_3 = new wxPanel(notePrefPanels, wxID_ANY); panelStartup = new wxPanel(notePrefPanels, wxID_ANY); panelFilters = new wxPanel(notePrefPanels, wxID_ANY); sizer_2_staticbox = new wxStaticBox(panelStartup, -1, TRANS("Panel Display")); #ifndef DISABLE_ONLINE_UPDATE updateSizer_staticbox = new wxStaticBox(panelStartup, -1, TRANS("Online Updates")); #endif sizer_7_staticbox = new wxStaticBox(notePrefPanels_pane_3, wxID_ANY, TRANS("Startup")); sizerCamSpeed_staticbox = new wxStaticBox(notePrefPanels_pane_3, -1, TRANS("Camera Speed")); lblFilters = new wxStaticText(panelFilters, wxID_ANY, TRANS("Available Filters")); listFilters = new wxListBox(panelFilters, ID_LIST_FILTERS, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_SINGLE|wxLB_SORT); filterGridProperties =new wxPropertyGrid(panelFilters, ID_GRID_PROPERTIES, wxDefaultPosition,wxDefaultSize,PROPERTY_GRID_STYLE); filterGridProperties->SetExtraStyle(PROPERTY_GRID_EXTRA_STYLE); filterBtnResetAllFilters = new wxButton(panelFilters, ID_BTN_RESET_FILTER_ALL, TRANS("Reset All")); filterResetDefaultFilter = new wxButton(panelFilters, ID_BTN_RESET_FILTER, TRANS("Reset")); const wxString comboPanelStartMode_choices[] = { NTRANS("Show all panels"), NTRANS("Remember last"), NTRANS("Show Selected") }; comboPanelStartMode = new wxComboBox(panelStartup, ID_START_COMBO_PANEL, wxT(""), wxDefaultPosition, wxDefaultSize, 3, comboPanelStartMode_choices, wxCB_SIMPLE|wxCB_DROPDOWN|wxCB_READONLY); chkControl = new wxCheckBox(panelStartup, ID_START_CHECK_CONTROL, TRANS("Control Pane")); chkRawData = new wxCheckBox(panelStartup, ID_START_CHECK_RAWDATA, TRANS("Raw Data Panel")); chkPlotlist = new wxCheckBox(panelStartup, ID_START_CHECK_PLOTLIST, TRANS("Plot List")); #ifndef DISABLE_ONLINE_UPDATE checkAllowOnlineUpdate = new wxCheckBox(panelStartup, wxID_ANY, TRANS("Periodically notify about available updates")); #endif chkPreferOrtho = new wxCheckBox(notePrefPanels_pane_3, wxID_ANY, TRANS("Prefer orthographic at startup")); lblMoveSpeed = new wxStaticText(notePrefPanels_pane_3, wxID_ANY, TRANS("Move Rate"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE); labelSlowCamMoveRate = new wxStaticText(notePrefPanels_pane_3,wxID_ANY, TRANS("(slow)")); sliderCamMoveRate = new wxSlider(notePrefPanels_pane_3, ID_MOUSE_MOVE_SLIDER, 25, 1, 400,wxDefaultPosition,wxDefaultSize,wxSL_HORIZONTAL|wxSL_LABELS); labelFastCamMoveRate = new wxStaticText(notePrefPanels_pane_3, wxID_ANY, TRANS("(fast)")); lblZoomSpeed = new wxStaticText(notePrefPanels_pane_3, wxID_ANY, TRANS("Zoom Rate"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE); labelSlowCamZoomRate = new wxStaticText(notePrefPanels_pane_3, wxID_ANY, TRANS("(slow)")); sliderCamZoomRate = new wxSlider(notePrefPanels_pane_3, ID_MOUSE_ZOOM_SLIDER, 25, 1, 400,wxDefaultPosition,wxDefaultSize,wxSL_HORIZONTAL|wxSL_LABELS); labelSlowFastZoomRate = new wxStaticText(notePrefPanels_pane_3, wxID_ANY, TRANS("(fast)")); btnOK = new wxButton(this, wxID_OK, wxEmptyString); btnCancel = new wxButton(this, wxID_CANCEL, wxEmptyString); bool enable=(comboPanelStartMode->GetSelection() == STARTUP_COMBO_SELECT_SPECIFY); chkRawData->Enable(enable); chkControl->Enable(enable); chkPlotlist->Enable(enable); comboPanelStartMode->SetSelection(0); programmaticEvent=false; curFilter=0; backFilterPropGrid=0; set_properties(); do_layout(); // end wxGlade } PrefDialog::~PrefDialog() { filterGridProperties->Destroy(); } BEGIN_EVENT_TABLE(PrefDialog, wxDialog) // begin wxGlade: PrefDialog::event_table EVT_LISTBOX(ID_LIST_FILTERS, PrefDialog::OnFilterListClick) EVT_PG_CHANGING(ID_GRID_PROPERTIES, PrefDialog::OnFilterCellChange) EVT_BUTTON(ID_BTN_RESET_FILTER,PrefDialog::OnResetFilterButton) EVT_BUTTON(ID_BTN_RESET_FILTER_ALL,PrefDialog::OnResetFilterAllButton) EVT_COMBOBOX(ID_START_COMBO_PANEL, PrefDialog::OnStartupPanelCombo) EVT_CHECKBOX(ID_CHECK_PREFER_ORTHO, PrefDialog::OnCheckPreferOrtho) EVT_COMMAND_SCROLL(ID_MOUSE_ZOOM_SLIDER, PrefDialog::OnMouseZoomSlider) EVT_COMMAND_SCROLL(ID_MOUSE_MOVE_SLIDER, PrefDialog::OnMouseMoveSlider) EVT_IDLE(PrefDialog::OnIdle) // end wxGlade END_EVENT_TABLE(); void PrefDialog::createFilterListing() { listFilters->Clear(); wxString s; vector v; for(size_t ui=0;uitypeString()); v.push_back(filterDefaults[ui]->getType()); listFilters->Append(s); } std::sort(v.begin(),v.end()); unsigned int pos=0; for(unsigned int ui=0;ui=v.size() || v[pos] != ui) { //This is a bit of a hack, but it works. Filter *t; t=makeFilter(ui); s = (t->typeString()); listFilters->Append(s); delete t; } else pos++; } } void PrefDialog::initialise() { createFilterListing(); //Transfer the movement rates from class to the slider ASSERT(mouseZoomRatePercent >=sliderCamZoomRate->GetMin() && mouseZoomRatePercent <=sliderCamZoomRate->GetMax()); ASSERT(mouseMoveRatePercent >=sliderCamMoveRate->GetMin() && mouseMoveRatePercent <=sliderCamMoveRate->GetMax()); sliderCamZoomRate->SetValue(mouseZoomRatePercent); sliderCamMoveRate->SetValue(mouseMoveRatePercent); } void PrefDialog::cleanup() { for(unsigned int ui=0;ui &defs) const { defs.resize(filterDefaults.size()); for(unsigned int ui=0;uicloneUncached(); } void PrefDialog::setFilterDefaults(const vector &defs) { filterDefaults.resize(defs.size()); for(unsigned int ui=0;uicloneUncached(); } void PrefDialog::OnIdle(wxIdleEvent &evt) { //This is required due to a bug in wx's propertygrid // see wx bug #16222 if(backFilterPropGrid) { delete backFilterPropGrid; backFilterPropGrid=0; } } void PrefDialog::OnFilterListClick(wxCommandEvent &event) { //get the string associated with the current click string s; //Check to see if we need to delete the current filter //or if we have it as a default if(find(filterDefaults.begin(),filterDefaults.end(), curFilter) == filterDefaults.end()) delete curFilter; Filter *f=0; s=stlStr(listFilters->GetString(event.GetSelection())); for(size_t ui=0;uigetUserString() == s) { f=filterDefaults[ui]; break; } } if(!f) f=makeFilterFromDefUserString(s); ASSERT(f); updateFilterProp(f); curFilter=f; } void PrefDialog::OnFilterCellChange(wxPropertyGridEvent &event) { event.SetValidationFailureBehavior(0); //Disallow programmatic event from causing filter update (stack loop->overflow) if(programmaticEvent) { event.Veto(); return; } //Grab the changed value std::string value,keyStr; value = getPropValueFromEvent(event); size_t key; keyStr=event.GetProperty()->GetName(); stream_cast(key,keyStr); bool needUpdate; curFilter->setProperty(key,value,needUpdate); if(find(filterDefaults.begin(),filterDefaults.end(), curFilter) == filterDefaults.end()) filterDefaults.push_back(curFilter); //Build the new property grid in an aside, // due to wx bug, backFilterPropGrid= new wxPropertyGrid(panelFilters,ID_GRID_PROPERTIES, wxDefaultPosition,wxDefaultSize,PROPERTY_GRID_STYLE); filterGridProperties->SetExtraStyle(PROPERTY_GRID_EXTRA_STYLE); std::swap(backFilterPropGrid,filterGridProperties); updateFilterProp(curFilter); do_filtergrid_prop_layout(); //reforce layout code programmaticEvent=false; } void PrefDialog::OnResetFilterButton(wxCommandEvent &evt) { if(!curFilter) { evt.Skip(); return; } //Erase the filter from the modified defaults list for(size_t ui=0;uiGetString( listFilters->GetSelection())); curFilter=makeFilterFromDefUserString(s); //Update the prop grid updateFilterProp(curFilter); break; } } } void PrefDialog::OnResetFilterAllButton(wxCommandEvent &evt) { if(!curFilter) { evt.Skip(); return; } //Check to see if we have it in the non-"true" default list for(size_t ui=0;uiGetString( listFilters->GetSelection())); curFilter=makeFilterFromDefUserString(s); updateFilterProp(curFilter); } void PrefDialog::updateFilterProp(const Filter *f) { if(!(f->canBeHazardous())) { filterGridProperties->Enable(true); updateFilterPropertyGrid(filterGridProperties,f,""); } else { //If the filter is potentially hazardous, //then we will disallow editing of the properties. //and give a notice to that effect filterGridProperties->Freeze(); filterGridProperties->Enable(false); filterGridProperties->Clear(); filterGridProperties->Append(new wxPropertyCategory(string("Not Editable for security reasons"))); filterGridProperties->Thaw(); } } //-------------- End Filter page----------------------- void PrefDialog::OnCheckPreferOrtho(wxCommandEvent &event) { event.Skip(); // notify the user that he hasn't implemented the event handler yet wxLogDebug(wxT("Event handler (PrefDialog::OnCheckPreferOrtho) not implemented yet")); } //-------------- Startup panel page----------------------- void PrefDialog::OnStartupPanelCombo(wxCommandEvent &event) { setStartupCheckboxEnables(event.GetSelection()); } void PrefDialog::setStartupCheckboxEnables(unsigned int value) { bool enable=( value == STARTUP_COMBO_SELECT_SPECIFY); chkRawData->Enable(enable); chkControl->Enable(enable); chkPlotlist->Enable(enable); switch(value) { case STARTUP_COMBO_SELECT_SHOW_ALL: comboPanelStartMode->SetToolTip(TRANS("Show all panels when starting program")); break; case STARTUP_COMBO_SELECT_REMEMBER: comboPanelStartMode->SetToolTip(TRANS("Show panels visible at last shutdown when starting program")); chkRawData->SetValue(true); chkControl->SetValue(true); chkPlotlist->SetValue(true); break; case STARTUP_COMBO_SELECT_SPECIFY: comboPanelStartMode->SetToolTip(TRANS("Show selected panels when starting program")); break; default: ASSERT(false); } } void PrefDialog::setPanelDefaults(unsigned int panelMode, bool panelControl, bool panelRaw,bool panelPlotlist) { ASSERT(panelMode < comboPanelStartMode->GetCount()); chkRawData->SetValue(panelRaw); chkControl->SetValue(panelControl); chkPlotlist->SetValue(panelPlotlist); comboPanelStartMode->SetSelection(panelMode); setStartupCheckboxEnables(panelMode); } void PrefDialog::getPanelDefaults(unsigned int &panelMode, bool &panelControl, bool &panelRaw,bool &panelPlotlist) const { panelControl=chkControl->IsChecked(); panelRaw=chkRawData->IsChecked(); panelPlotlist=chkPlotlist->IsChecked(); panelMode=comboPanelStartMode->GetSelection(); } //-------------- End Startup panel page----------------------- //------------Mouse page ----------- void PrefDialog::OnMouseZoomSlider(wxScrollEvent &event) { mouseZoomRatePercent=sliderCamZoomRate->GetValue(); } void PrefDialog::OnMouseMoveSlider(wxScrollEvent &event) { mouseMoveRatePercent=sliderCamMoveRate->GetValue(); } //------------End mouse page------------- // wxGlade: add PrefDialog event handlers void PrefDialog::set_properties() { // begin wxGlade: PrefDialog::set_properties SetTitle(TRANS("Preferences")); SetSize(wxSize(640, 487)); comboPanelStartMode->SetToolTip(TRANS("Set the method of panel layout when starting the program")); comboPanelStartMode->SetSelection(0); #ifndef DISABLE_ONLINE_UPDATE checkAllowOnlineUpdate->SetToolTip(TRANS("Lets the program check the internet to see if updates to the program version are available, then notifies you about updates now and again.")); #endif chkPreferOrtho->SetToolTip(TRANS("By default, use an orthographic camera at startup. State files will override this preference.")); sliderCamMoveRate->SetToolTip(TRANS("Camera translation, orbit and swivel rates. ")); sliderCamZoomRate->SetToolTip(TRANS("Camera zooming rate.")); filterResetDefaultFilter->SetToolTip(TRANS("Reset the filter initial values back to program defaults")); filterBtnResetAllFilters->SetToolTip(TRANS("Reset all filter initial values back to program defaults")); // end wxGlade } void PrefDialog::do_layout() { // begin wxGlade: PrefDialog::do_layout wxBoxSizer* panelSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* exitButtonSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_5 = new wxBoxSizer(wxVERTICAL); sizerCamSpeed_staticbox->Lower(); wxStaticBoxSizer* sizerCamSpeed = new wxStaticBoxSizer(sizerCamSpeed_staticbox, wxVERTICAL); wxBoxSizer* sizer_6_copy = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_6 = new wxBoxSizer(wxHORIZONTAL); sizer_7_staticbox->Lower(); wxStaticBoxSizer* sizer_7 = new wxStaticBoxSizer(sizer_7_staticbox, wxHORIZONTAL); wxBoxSizer* sizer_1 = new wxBoxSizer(wxVERTICAL); #ifndef DISABLE_ONLINE_UPDATE wxStaticBoxSizer* updateSizer = new wxStaticBoxSizer(updateSizer_staticbox, wxVERTICAL); #endif wxStaticBoxSizer* sizer_2 = new wxStaticBoxSizer(sizer_2_staticbox, wxVERTICAL); wxBoxSizer* sizer_3 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_4 = new wxBoxSizer(wxVERTICAL); do_filtergrid_prop_layout(); // filterPropSizer_staticbox->Lower(); #if defined(__WIN32) || defined(__WIN64) sizer_2->Add(comboPanelStartMode, 0, wxBOTTOM|wxFIXED_MINSIZE, 4); #else sizer_2->Add(comboPanelStartMode, 0, 0,0); #endif sizer_3->Add(20, 20, 0, 0, 0); sizer_4->Add(chkControl, 0, 0, 0); sizer_4->Add(chkRawData, 0, 0, 0); sizer_4->Add(chkPlotlist, 0, 0, 0); sizer_3->Add(sizer_4, 1, wxEXPAND, 0); sizer_2->Add(sizer_3, 1, wxEXPAND, 0); sizer_1->Add(sizer_2, 0, wxALL|wxEXPAND, 5); #ifndef DISABLE_ONLINE_UPDATE updateSizer->Add(checkAllowOnlineUpdate, 0, 0, 0); sizer_1->Add(updateSizer, 0, wxALL|wxEXPAND, 5); #endif panelStartup->SetSizer(sizer_1); sizer_7->Add(chkPreferOrtho, 0, wxALL, 5); sizer_5->Add(sizer_7, 0, wxEXPAND, 0); sizer_6->Add(lblMoveSpeed, 0, 0, 0); sizer_6->Add(20, 20, 0, 0, 0); sizer_6->Add(labelSlowCamMoveRate, 0, 0, 0); #if defined(__WIN32) || defined(__WIN64) sizer_6->Add(sliderCamMoveRate, 1, 0, 0); #else sizer_6->Add(sliderCamMoveRate, 1, wxEXPAND|0, 0); #endif sizer_6->Add(labelFastCamMoveRate, 0, 0, 0); sizerCamSpeed->AddStretchSpacer(); sizerCamSpeed->Add(sizer_6, 1, wxEXPAND, 0); sizerCamSpeed->AddStretchSpacer(); sizer_6_copy->Add(lblZoomSpeed, 0, 0, 0); sizer_6_copy->Add(20, 20, 0, 0, 0); sizer_6_copy->Add(labelSlowCamZoomRate, 0, 0, 0); #if defined(__WIN32) || defined(__WIN64) sizer_6_copy->Add(sliderCamZoomRate, 1, wxEXPAND|0, 0); #else sizer_6_copy->Add(sliderCamZoomRate, 1, 0, 0); #endif sizer_6_copy->Add(labelSlowFastZoomRate, 0, 0, 0); sizerCamSpeed->Add(sizer_6_copy, 1, wxEXPAND, 0); sizerCamSpeed->AddStretchSpacer(); sizer_5->Add(sizerCamSpeed, 1, wxEXPAND, 0); notePrefPanels_pane_3->SetSizer(sizer_5); notePrefPanels->AddPage(panelFilters, TRANS("Filt. Default")); notePrefPanels->AddPage(panelStartup, TRANS("Startup")); notePrefPanels->AddPage(notePrefPanels_pane_3, TRANS("Camera")); panelSizer->Add(notePrefPanels, 2, wxEXPAND, 0); exitButtonSizer->Add(20, 20, 1, wxEXPAND, 0); exitButtonSizer->Add(btnOK, 0, wxTOP, 8); exitButtonSizer->Add(btnCancel, 0, wxLEFT|wxTOP|wxBOTTOM, 8); exitButtonSizer->Add(10, 20, 0, 0, 0); panelSizer->Add(exitButtonSizer, 0, wxEXPAND, 0); SetSizer(panelSizer); Layout(); // end wxGlade } void PrefDialog::do_filtergrid_prop_layout() { panelFilters->SetSizer(NULL); wxBoxSizer* filterPropSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* filterRightSideSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* resetButtonSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* filterLeftSizer = new wxBoxSizer(wxVERTICAL); filterLeftSizer->Add(lblFilters, 0, 0, 0); filterLeftSizer->Add(listFilters, 1, wxEXPAND, 0); filterPropSizer->Add(filterLeftSizer, 1, wxEXPAND, 0); filterPropSizer->Add(20, 20, 0, 0, 0); filterRightSideSizer->Add(filterGridProperties, 1, wxEXPAND, 0); resetButtonSizer->Add(filterBtnResetAllFilters, 0, 0, 0); resetButtonSizer->Add(filterResetDefaultFilter, 0, 0, 0); resetButtonSizer->Add(20, 20, 1, 0, 0); filterRightSideSizer->Add(resetButtonSizer, 0, wxEXPAND, 0); filterPropSizer->Add(filterRightSideSizer, 2, wxEXPAND, 0); panelFilters->SetSizer(filterPropSizer); panelFilters->Fit(); panelFilters->Layout(); } 3Depict-0.0.19/src/gui/dialogs/ExportPos.cpp0000644000175000017500000003477612716174467020164 0ustar pcuserpcuser/* * ExportPos.cpp - POS file export dialog implementation * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "ExportPos.h" #include "wx/wxcommon.h" #include "wx/wxcomponents.h" #include "common/translation.h" #include // begin wxGlade: ::extracode // end wxGlade wxWindow *exportPosYieldWindow=0; bool abortOp; wxStopWatch *exportPosDelayTime=0; using std::list; using std::pair; using std::string; using std::vector; enum { ID_BTN_ADDDATA=wxID_ANY+1, ID_BTN_ADDNODE, ID_BTN_ADDALL, ID_TREE_FILTERS, ID_LIST_SELECTED, ID_LIST_AVAILABLE, ID_RADIO_VISIBLE, ID_RADIO_SELECTION, }; ExportPosDialog::ExportPosDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) { haveRefreshed=false; exportVisible=true; // begin wxGlade: ExportPosDialog::ExportPosDialog lblExport = new wxStaticText(this, wxID_ANY, TRANS("Export:")); radioVisible = new wxRadioButton(this,ID_RADIO_VISIBLE , TRANS("Visible")); radioSelection = new wxRadioButton(this,ID_RADIO_SELECTION , TRANS("Selected Data")); treeData = new wxTreeCtrl(this, ID_TREE_FILTERS, wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS|wxTR_NO_LINES|wxTR_HIDE_ROOT|wxTR_DEFAULT_STYLE|wxSUNKEN_BORDER); lblAvailableData = new wxStaticText(this, wxID_ANY, TRANS("Available Data")); listAvailable = new wxListCtrl(this, ID_LIST_AVAILABLE, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER|wxLC_VRULES); btnAddData = new wxButton(this, ID_BTN_ADDDATA, wxT(">")); btnAddNode = new wxButton(this,ID_BTN_ADDNODE, wxT(">>")); btnAddAll = new wxButton(this, ID_BTN_ADDALL, wxT(">>>")); panel_2 = new wxPanel(this, wxID_ANY); label_4 = new wxStaticText(this, wxID_ANY, TRANS("Selection")); listSelected = new wxListCtrl(this, ID_LIST_SELECTED, wxDefaultPosition, wxDefaultSize, wxLC_REPORT|wxSUNKEN_BORDER); btnSave = new wxButton(this, wxID_SAVE, wxEmptyString); btnCancel = new wxButton(this, wxID_CANCEL, wxEmptyString); btnSave->SetFocus(); set_properties(); do_layout(); // end wxGlade //Disable most everything. enableSelectionControls(false); //Assign global variables their init value //-- ASSERT(!exportPosYieldWindow); exportPosYieldWindow=this; ASSERT(!exportPosDelayTime); //Should not have been inited yet. exportPosDelayTime = new wxStopWatch(); //-- //Add columns to report listviews listSelected->InsertColumn(0,TRANS("Index")); listSelected->InsertColumn(1,TRANS("Count")); listAvailable->InsertColumn(0,TRANS("Index")); listAvailable->InsertColumn(1,TRANS("Count")); } ExportPosDialog::~ExportPosDialog() { delete exportPosDelayTime; exportPosDelayTime=0; exportPosYieldWindow=0; //Should have called cleanup before exiting. ASSERT(!haveRefreshed); } BEGIN_EVENT_TABLE(ExportPosDialog, wxDialog) // begin wxGlade: ExportPosDialog::event_table EVT_BUTTON(ID_BTN_ADDDATA, ExportPosDialog::OnBtnAddData) EVT_BUTTON(ID_BTN_ADDNODE, ExportPosDialog::OnBtnAddNode) EVT_BUTTON(ID_BTN_ADDALL, ExportPosDialog::OnBtnAddAll) EVT_RADIOBUTTON(ID_RADIO_VISIBLE, ExportPosDialog::OnVisibleRadio) EVT_RADIOBUTTON(ID_RADIO_SELECTION, ExportPosDialog::OnSelectedRadio) EVT_TREE_SEL_CHANGED(ID_TREE_FILTERS, ExportPosDialog::OnTreeFiltersSelChanged) EVT_LIST_ITEM_ACTIVATED(ID_LIST_AVAILABLE, ExportPosDialog::OnListAvailableItemActivate) EVT_LIST_ITEM_ACTIVATED(ID_LIST_SELECTED, ExportPosDialog::OnListSelectedItemActivate) EVT_LIST_KEY_DOWN(ID_LIST_SELECTED, ExportPosDialog::OnListSelectedItemKeyDown) EVT_BUTTON(wxID_SAVE, ExportPosDialog::OnSave) EVT_BUTTON(wxID_CANCEL, ExportPosDialog::OnCancel) // end wxGlade END_EVENT_TABLE() void ExportPosDialog::initialiseData(FilterTree &f) { ASSERT(!haveRefreshed) //Steal the filter tree contents f.swap(filterTree); vector dummyPersist; upWxTreeCtrl(filterTree,treeData,filterMap,dummyPersist,0); vector devices; ProgressData p; std::vector > consoleStrings; ATOMIC_BOOL wantAbort; wantAbort=false; filterTree.refreshFilterTree(outputData,devices,consoleStrings,p,wantAbort); //Delete all filter items that came out of refresh, other than ion streams filterTree.safeDeleteFilterList(outputData,STREAM_TYPE_IONS,true); haveRefreshed=true; } void ExportPosDialog::OnVisibleRadio(wxCommandEvent &event) { //This event can fire BEFORE the dialog is shown (after initing) // under MSW/wx3.1 if(!haveRefreshed) return; exportVisible=true; listAvailable->DeleteAllItems(); enableSelectionControls(false); } void ExportPosDialog::OnSelectedRadio(wxCommandEvent &event) { ASSERT(haveRefreshed); exportVisible=false; enableSelectionControls(true); } void ExportPosDialog::OnTreeFiltersSelChanged(wxTreeEvent &event) { wxTreeItemId id; id=treeData->GetSelection(); if(!id.IsOk() || id== treeData->GetRootItem()) { event.Skip(); return; } //Tree data contains unique identifier for vis control to do matching wxTreeItemData *tData=treeData->GetItemData(id); //Clear the available list listAvailable->DeleteAllItems(); availableFilterData.clear(); const Filter *targetFilter=filterMap[((wxTreeUint *)tData)->value]; typedef std::pair > filterOutputData; //Spin through the output list, looking for this filter's contribution for(list::iterator it=outputData.begin();it!=outputData.end();++it) { //Is this the filter we are looking for? if(it->first == targetFilter) { //huzzah. std::string label; for(unsigned int ui=0;uisecond.size();ui++) { const IonStreamData *ionData; ionData=(const IonStreamData *)((it->second)[ui]); wxColour c; c.Set((unsigned char)(ionData->r*255), (unsigned char)(ionData->g*255),(unsigned char)(ionData->b*255)); //Add the item using the index as a str stream_cast(label,ui); listAvailable->InsertItem(ui,(label)); size_t basicCount; basicCount=ionData->getNumBasicObjects(); stream_cast(label,basicCount); listAvailable->SetItem(ui,1,(label)); listAvailable->SetItemBackgroundColour(ui,c); availableFilterData.push_back((it->second)[ui]); } } } } void ExportPosDialog::OnListAvailableItemActivate(wxListEvent &event) { unsigned int item=event.GetIndex(); //If the selected item is not already in the "selected filter" list, add it if(find(selectedFilterData.begin(),selectedFilterData.end(), availableFilterData[item]) == selectedFilterData.end()) selectedFilterData.push_back(availableFilterData[item]); //Update the selection list updateSelectedList(); } void ExportPosDialog::OnListSelectedItemActivate(wxListEvent &event) { unsigned int item=event.GetIndex(); unsigned int thisIdx=0; for(list::iterator it=selectedFilterData.begin(); it!=selectedFilterData.end(); ++it) { if(thisIdx == item) { selectedFilterData.erase(it); break; } thisIdx++; } //Update the selection list updateSelectedList(); } void ExportPosDialog::OnListSelectedItemKeyDown(wxListEvent &event) { switch(event.GetKeyCode()) { case WXK_DELETE: { //Spin through the selected items int item=-1; for ( ;; ) { item = listSelected->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if ( item == -1 ) break; list::iterator it; it=find(selectedFilterData.begin(),selectedFilterData.end(), availableFilterData[item]); //If the selected item is not already in the "selected filter" list, add it if(it != selectedFilterData.end()) selectedFilterData.erase(it); } //Update the selection list updateSelectedList(); } } } void ExportPosDialog::OnBtnAddAll(wxCommandEvent &event) { selectedFilterData.clear(); typedef std::pair > filterOutputData; for(list::iterator it=outputData.begin();it!=outputData.end();++it) { for(unsigned int uj=0;ujsecond.size();uj++) selectedFilterData.push_back(it->second[uj]); } updateSelectedList(); } void ExportPosDialog::OnBtnAddData(wxCommandEvent &event) { int item=-1; for ( ;; ) { item = listAvailable->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if ( item == -1 ) break; //Disallow addition of duplicate entries if(find(selectedFilterData.begin(),selectedFilterData.end(), availableFilterData[item]) == selectedFilterData.end()) selectedFilterData.push_back(availableFilterData[item]); } updateSelectedList(); } void ExportPosDialog::updateSelectedList() { //Clear the available list listSelected->DeleteAllItems(); unsigned int idx=0; std::string label; for(list::iterator it=selectedFilterData.begin(); it!=selectedFilterData.end(); ++it) { const IonStreamData *ionData; ionData=(const IonStreamData *)(*it); wxColour c; c.Set((unsigned char)(ionData->r*255), (unsigned char)(ionData->g*255), (unsigned char)(ionData->b*255)); //Add the item using the index as a str stream_cast(label,idx); listSelected->InsertItem(idx,(label)); size_t basicCount; basicCount=ionData->getNumBasicObjects(); stream_cast(label,basicCount); listSelected->SetItem(idx,1,(label)); listSelected->SetItemBackgroundColour(idx,c); idx++; } if(listSelected->GetItemCount()) { btnSave->Enable(); } else btnSave->Disable(); } void ExportPosDialog::OnBtnAddNode(wxCommandEvent &event) { //Spin through the selected items for (int item=0;itemGetItemCount(); item++) { //If the selected item is not already in the "selected filter" list, add it if(find(selectedFilterData.begin(),selectedFilterData.end(), availableFilterData[item]) == selectedFilterData.end()) selectedFilterData.push_back(availableFilterData[item]); } updateSelectedList(); } void ExportPosDialog::OnSave(wxCommandEvent &event) { exportVisible=(radioVisible->GetValue()); EndModal(wxID_OK); } void ExportPosDialog::OnCancel(wxCommandEvent &event) { EndModal(wxID_CANCEL); } void ExportPosDialog::getExportVec(std::vector &v) const { typedef std::pair > filterOutputData; //Incoming vector should be empty ASSERT(v.empty()); //If the user has selected "visible", then all outputs are to be exported if(exportVisible) { v.reserve(outputData.size()); for(list::const_iterator it=outputData.begin(); it!=outputData.end();++it) { for(unsigned int ui=0;uisecond.size();ui++) { v.push_back(it->second[ui]); //Ensure pointer is valid by forcing a dereference ASSERT(v.back()->getStreamType() == STREAM_TYPE_IONS); } } } else { //If the user wants to perform custom picking, then only "selected" to be //exported v.reserve(selectedFilterData.size()); for(list::const_iterator it=selectedFilterData.begin(); it!=selectedFilterData.end(); ++it) { v.push_back(*it); } } } // wxGlade: add ExportPosDialog event handlers void ExportPosDialog::set_properties() { // begin wxGlade: ExportPosDialog::set_properties SetTitle(TRANS("Export Pos Data")); // end wxGlade treeData->SetToolTip(TRANS("Tree of filters, select leaves to show ion data.")); btnAddAll->SetToolTip(TRANS("Add all data from all filters")); btnAddNode->SetToolTip(TRANS("Add all data from currently selected filter")); btnAddData->SetToolTip(TRANS("Add selected data from currently selected filter")); radioVisible->SetValue(TRUE); } void ExportPosDialog::enableSelectionControls(bool enabled) { //Enable/disable controls that are used for selection treeData->Enable(enabled); listAvailable->Enable(enabled); btnAddData->Enable(enabled); btnAddNode->Enable(enabled); btnAddAll->Enable(enabled); listSelected->Enable(enabled); //If the selection control is enabled, //bring the tree back to life //otherwise, grey it out. if(enabled) { treeData->ExpandAll(); treeData->SetForegroundColour(wxNullColour); btnSave->Enable(listSelected->GetItemCount()); } else { treeData->CollapseAll(); treeData->SetForegroundColour(*wxLIGHT_GREY); treeData->Unselect(); btnSave->Enable(); } } void ExportPosDialog::do_layout() { // begin wxGlade: ExportPosDialog::do_layout wxBoxSizer* sizer_4 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_12 = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizer_13 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_11 = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizer_9 = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizer_10 = new wxBoxSizer(wxVERTICAL); sizer_4->Add(10, 20, 0, 0, 0); sizer_9->Add(lblExport, 0, wxTOP|wxBOTTOM, 5); sizer_9->Add(radioVisible, 0, 0, 0); sizer_9->Add(radioSelection, 0, 0, 0); sizer_10->Add(treeData, 1, wxTOP|wxBOTTOM|wxEXPAND, 6); sizer_10->Add(lblAvailableData, 0, 0, 0); sizer_10->Add(listAvailable, 1, wxBOTTOM|wxEXPAND, 5); sizer_9->Add(sizer_10, 1, wxEXPAND, 0); sizer_4->Add(sizer_9, 1, wxALL|wxEXPAND, 5); sizer_11->Add(20, 200, 0, 0, 0); sizer_11->Add(btnAddData, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 10); sizer_11->Add(btnAddNode, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 10); sizer_11->Add(btnAddAll, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 10); sizer_11->Add(panel_2, 1, wxEXPAND, 0); sizer_4->Add(sizer_11, 0, wxEXPAND, 0); sizer_12->Add(20, 40, 0, 0, 0); sizer_12->Add(label_4, 0, wxTOP|wxBOTTOM, 6); sizer_12->Add(listSelected, 1, wxEXPAND, 0); sizer_12->Add(20, 20, 0, 0, 0); sizer_13->Add(20, 20, 1, 0, 0); sizer_13->Add(btnSave, 0, wxLEFT|wxRIGHT|wxBOTTOM|wxALIGN_BOTTOM, 6); sizer_13->Add(btnCancel, 0, wxBOTTOM|wxALIGN_BOTTOM, 6); sizer_12->Add(sizer_13, 0, wxEXPAND, 0); sizer_4->Add(sizer_12, 1, wxALL|wxEXPAND, 5); SetSizer(sizer_4); sizer_4->Fit(this); Layout(); // end wxGlade } 3Depict-0.0.19/src/gui/dialogs/rangeEditDialog.cpp0000644000175000017500000011372712640746376021235 0ustar pcuserpcuser/* * rangeEditDialog.h - Point data export dialog * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "rangeEditDialog.h" #include "wx/wxcommon.h" #include "wx/wxcomponents.h" #include "common/translation.h" #include "backend/filters/rangeFile.h" #include #include using std::pair; using std::vector; using std::map; using std::set; using std::string; // begin wxGlade: ::extracode enum { ID_CHECK_SHOW_OVERLAY=wxID_ANY+1, ID_SPLIT_LEFTRIGHT, ID_GRID_IONS, ID_GRID_RANGES, ID_BTN_RANGE_ADD, ID_BTN_RANGE_REMOVE, ID_LIST_OVERLAY, ID_LIST_PLOTS, ID_MANAGE_SET_MORE, ID_TEXT_FILTER_CMPNT, ID_PLOT_AREA, }; // end wxGlade enum { ION_COL_PLOT=0, ION_COL_SHORTNAME, ION_COL_LONGNAME, ION_COL_COLOUR, ION_COL_ENUM_END }; enum { RNG_COL_PLOT=0, RNG_COL_PARENT_ION, RNG_COL_START, RNG_COL_END, RNG_COL_ENUM_END }; enum { GRID_FOCUS_NONE, GRID_FOCUS_IONS, GRID_FOCUS_RANGES }; //Rangefile filter -> range file mapping typedef typedef map RFMAP ; PendingRange::PendingRange(RangeFile *rng) { validStart=false; validEnd=false; validParent=false; rngPtr=rng; } void PendingRange::commit() { ASSERT(isFinished()); rngPtr->addRange(start,end,parentId); } float PendingRange::getStart() const { if(validStart) return start; else return 0.0f; } float PendingRange::getEnd() const { if(validEnd) return end; else return 1.0f; } std::string PendingRange::getIonName() const { if(!validParent) return ""; ASSERT(parentId < rngPtr->getNumIons()); return rngPtr->getName(parentId); } bool PendingRange::isFinished() const { if(!validEnd || !validStart) return false; if(!validParent) return false; if( end <=start) return false; return true; } PendingIon::PendingIon(RangeFile *rng) { rngPtr=rng; validColour=validShortName=validLongName=false; colour.red=colour.green=colour.blue=0.5f; } void PendingIon::setShortName(const std::string &n) { shortName=n; validShortName = (rngPtr->getIonID(shortName.c_str()) == (unsigned int)-1); } void PendingIon::setLongName(const std::string &n) { longName=n; validLongName = (rngPtr->getIonID(shortName.c_str(),false) == (unsigned int)-1); } void PendingIon::setColour(const RGBf &c) { colour=c; validColour=true; } RGBf PendingIon::getColour() const { return colour; } std::string PendingIon::getShortName() const { if(validShortName) return shortName; else return string(""); } std::string PendingIon::getLongName() const { if(validLongName) return longName; else return string(""); } bool PendingIon::isFinished() const { //Check to see if we have valid user data if (! (validShortName && validLongName && validColour)) return false; //Disallow existing ion names if(rngPtr->getIonID(longName.c_str(),false) != (unsigned int)-1 || rngPtr->getIonID(shortName.c_str()) != (unsigned int) -1) return false; return true; } void PendingIon::commit() const { rngPtr->addIon(shortName,longName,colour); } RangeEditorDialog::RangeEditorDialog(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxDialog(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxMAXIMIZE_BOX|wxMINIMIZE_BOX) { // begin wxGlade: RangeEditorDialog::RangeEditorDialog splitVertical = new wxSplitterWindow(this, ID_SPLIT_LEFTRIGHT, wxDefaultPosition, wxDefaultSize, wxSP_3D|wxSP_BORDER); panelSplitRight = new wxPanel(splitVertical, wxID_ANY); panelSplitLeft = new wxPanel(splitVertical, wxID_ANY); notebookLeft = new wxNotebook(panelSplitLeft, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_LEFT); noteLeftOverlay = new wxPanel(notebookLeft, wxID_ANY); noteLeftRanges = new wxPanel(notebookLeft, wxID_ANY); noteLeftPlots = new wxPanel(notebookLeft, wxID_ANY); listPlots = new wxListBox(noteLeftPlots, ID_LIST_PLOTS, wxDefaultPosition, wxDefaultSize, 0,(const wxString*) NULL); gridIons= new wxGrid(noteLeftRanges, ID_GRID_IONS); gridRanges = new wxGrid(noteLeftRanges, ID_GRID_RANGES); btnRangeIonAdd = new wxButton(noteLeftRanges,wxID_ADD, wxEmptyString); btnRangeIonRemove = new wxButton(noteLeftRanges, wxID_REMOVE, wxEmptyString); checkShowOverlay = new wxCheckBox(noteLeftOverlay, ID_CHECK_SHOW_OVERLAY, TRANS("Show Overlays")); textOverlayCmpnt = new wxTextCtrl(noteLeftOverlay, ID_TEXT_FILTER_CMPNT, wxEmptyString, wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER); listOverlay = new wxCheckListBox(noteLeftOverlay, ID_LIST_OVERLAY, wxDefaultPosition, wxDefaultSize, 0); plotPanel = new MathGLPane(panelSplitRight, ID_PLOT_AREA); btnOK = new wxButton(panelSplitRight, wxID_OK, wxEmptyString); btnCancel = new wxButton(panelSplitRight, wxID_CANCEL, wxEmptyString); set_properties(); do_layout(); // end wxGlade std::string fileLoc = locateDataFile("naturalAbundance.xml"); if(!fileLoc.empty()) abundanceData.open(fileLoc.c_str()); UpdateHandler h = (UpdateHandler)&RangeEditorDialog::onPlotUpdate; plotPanel->registerUpdateHandler(this,h); plotPanel->enableRegionSelfUpdate(true); lastFocused=GRID_FOCUS_NONE; currentRange=0; checkShowOverlay->SetValue(true); haveSetTextFocus=false; textOverlayCmpnt->SetValue(TRANS("e.g. H2O")); textOverlayCmpnt->Bind(wxEVT_SET_FOCUS, &RangeEditorDialog::OnTextOverlaySetFocus, this); } RangeEditorDialog::~RangeEditorDialog() { textOverlayCmpnt->Unbind(wxEVT_SET_FOCUS, &RangeEditorDialog::OnTextOverlaySetFocus, this); } BEGIN_EVENT_TABLE(RangeEditorDialog, wxDialog) // begin wxGlade: RangeEditorDialog::event_table EVT_LISTBOX(ID_LIST_PLOTS, RangeEditorDialog::OnListPlots) // EVT_LIST_ITEM_SELECTED(ID_LIST_OVERLAY, RangeEditorDialog::OnListOverlaySelected) EVT_LIST_KEY_DOWN(ID_LIST_OVERLAY, RangeEditorDialog::OnListOverlayKeyDown) EVT_TEXT(ID_TEXT_FILTER_CMPNT,RangeEditorDialog::OnTextOverlay) EVT_TEXT(ID_TEXT_FILTER_CMPNT,RangeEditorDialog::OnTextOverlay) EVT_TEXT_ENTER(ID_TEXT_FILTER_CMPNT,RangeEditorDialog::OnTextOverlayEnter) EVT_CHECKBOX(ID_CHECK_SHOW_OVERLAY, RangeEditorDialog::OnCheckShowOverlay) EVT_GRID_CMD_CELL_CHANGED(ID_GRID_RANGES, RangeEditorDialog::OnGridRangesCellChange) EVT_GRID_CMD_CELL_CHANGED(ID_GRID_IONS, RangeEditorDialog::OnGridIonsCellChange) EVT_GRID_CMD_CELL_LEFT_CLICK(ID_GRID_RANGES,RangeEditorDialog::OnGridRangeClick) EVT_GRID_CMD_CELL_LEFT_CLICK(ID_GRID_IONS,RangeEditorDialog::OnGridIonClick) EVT_GRID_CMD_EDITOR_SHOWN(ID_GRID_RANGES,RangeEditorDialog::OnGridRangesEditorShown) EVT_GRID_CMD_EDITOR_SHOWN(ID_GRID_IONS,RangeEditorDialog::OnGridIonsEditorShown) EVT_BUTTON(wxID_ADD, RangeEditorDialog::OnBtnRangeIonAdd) EVT_BUTTON(wxID_REMOVE, RangeEditorDialog::OnBtnRangeIonRemove) EVT_CHECKLISTBOX(ID_LIST_OVERLAY, RangeEditorDialog::OnListOverlayCheck) EVT_BUTTON(wxID_OK, RangeEditorDialog::OnBtnOK) EVT_BUTTON(wxID_CANCEL, RangeEditorDialog::OnBtnCancel) EVT_SPLITTER_DCLICK(ID_SPLIT_LEFTRIGHT, RangeEditorDialog::OnSashVerticalDClick) // end wxGlade END_EVENT_TABLE(); void RangeEditorDialog::getModifiedRanges(map &modRanges) const { //modRanges.reserve(modifiedRanges.size()); for(RFMAP::const_iterator it = modifiedRanges.begin() ; it!= modifiedRanges.end(); ++it) { const RangeFile *r = &(it->first->getRange()); modRanges[r]=&(it->second); } } void RangeEditorDialog::onPlotUpdate() { #ifdef DEBUG size_t lastEditedRegion,lastEditedPlot; plotPanel->getLastEdited(lastEditedPlot,lastEditedRegion); ASSERT(lastEditedRegion!= -1); ASSERT(lastEditedPlot != -1); #endif generateRangeEntries(); generateIonEntries(); setRangeReady(); } void RangeEditorDialog::setPlotWrapper(const PlotWrapper &p) { plotWrap = p; plotWrap.setEnableHighlightOverlap(); //Find all unique ranges //-- vector > > regions; plotWrap.getRegions(regions,false); std::set ranges; for(size_t ui=0;uigetType() != FILTER_TYPE_RANGEFILE) { //ignore this plot ignoreList.insert(regions[ui].first); continue; } //Remember that we need to (shortly) create a new rangefile for this ranges.insert((const RangeFileFilter *)parentFilt); //Create a mapping between the plot and its owned rangefile plotToRangeFileMap[regions[ui].first]=(const RangeFileFilter*)parentFilt; } //-- //create a copy of the range file that are the to-be-modified ranges for(set::const_iterator it=ranges.begin(); it != ranges.end(); ++it) { modifiedRanges[*it]=((*it)->getRange()); modifiedRanges[*it].setEnforceConsistent(false); } //Now, change the behaviour of region updating for the plot wrapper // to update our new rangefile objects plotWrap.switchOutRegionParent(modifiedRanges); //Set the plot panel to use the appropriate plot wrapper plotPanel->setPlotWrapper(&plotWrap,false); //Generate the list entries generateListEntries(); setCurrentRange(); //Find all the plots in the wrapper, and add them to the list generateIonEntries(); generateRangeEntries(); //Hack to ensure we select something at startup // only if there is nothing selected, and the plot list has items if(currentRange && !plotPanel->getNumVisible() && listPlots->GetCount() > 0) { { ASSERT(listPlots->GetSelection() !=wxNOT_FOUND); unsigned int plotID; plotID=listToPlotIDs[listPlots->GetSelection()]; plotWrap.setVisible(plotID); plotPanel->Refresh(); } } } void RangeEditorDialog::setCurrentRange(size_t forceSelected) { //IF we have no plots, // we cannot have any current range if(!listPlots->GetCount()) { currentRange=0; return; } //Get the currently selected plot unsigned int curPlotID; if(forceSelected == (size_t) -1) { ASSERT(listPlots->GetCount()); int selectedItem=listPlots->GetSelection(); if(selectedItem== wxNOT_FOUND ) { currentRange=0; return; } curPlotID=listToPlotIDs[selectedItem]; } else { curPlotID=listToPlotIDs[forceSelected]; } //If we don't have a new range for this plot, alter // the parent of any regions in the plot if(plotNewRanges.find(curPlotID) == plotNewRanges.end()) { ASSERT(plotToRangeFileMap.find(curPlotID) != plotToRangeFileMap.end()); currentRange=&(modifiedRanges[plotToRangeFileMap[curPlotID]]); } else { //Either create a new, or set the old Rangefile to assign to this plot currentRange=&(plotNewRanges[curPlotID]); } } void RangeEditorDialog::generatePlotRegions() { RegionGroup r; if(!currentRange) return; //Go through each entry in the current range, and create a // region in the plot that corresponds to it for(size_t ui=0;uigetNumRanges();ui++) { PlotRegion p(PlotRegion::ACCESS_MODE_RANGEFILE,currentRange); RGBf col; //set region colour col = currentRange->getColour(currentRange->getIonID((unsigned int)ui)); p.r = col.red; p.g = col.green; p.b = col.blue; p.id = ui; p.bounds.clear(); p.bounds.push_back(currentRange->getRange(ui)); r.regions.push_back(p); } ASSERT(listPlots->GetSelection() != -1); //Send the current range data to the current plot unsigned int plotID; plotID = listToPlotIDs[listPlots->GetSelection()]; //reassign new region group plotWrap.setRegionGroup(plotID,r); //Update plot plotPanel->Refresh(); } void RangeEditorDialog::generateListEntries() { programmaticEvent=true; vector plotIDs; plotWrap.getPlotIDs(plotIDs); listPlots->Freeze(); listPlots->Clear(); //Add the plots that the user can get for(size_t ui=0;uiAppend((title)); listToPlotIDs[idx]=plotIDs[ui]; } //If there is only one spectrum, select it if(listPlots->GetCount() >= 1 ) listPlots->SetSelection(0); listPlots->Thaw(); programmaticEvent=false; } void RangeEditorDialog::generateOverlayList(const vector &overlays) { //Build the list of enabled overlays listOverlay->Clear(); for(size_t ui=0;uiInsert((overlays[ui].title),ui); listOverlay->Check(ui,overlays[ui].enabled); } } void RangeEditorDialog::generateIonEntries(size_t rowVisibleHint) { programmaticEvent=true; //Withhold drawing updates until we are done. gridIons->Freeze(); int viewStartX,viewStartY; gridIons->GetViewStart(&viewStartX,&viewStartY); //Reset the ion grid //-- if(gridIons->GetNumberCols()) gridIons->DeleteCols(0,gridIons->GetNumberCols()); if(gridIons->GetNumberRows()) gridIons->DeleteRows(0,gridIons->GetNumberRows()); gridIons->AppendCols(4); gridIons->SetColLabelValue(ION_COL_PLOT,TRANS("Plot")); gridIons->SetColLabelValue(ION_COL_SHORTNAME,TRANS("Short Name")); gridIons->SetColLabelValue(ION_COL_LONGNAME,TRANS("Long Name")); gridIons->SetColLabelValue(ION_COL_COLOUR,TRANS("Colour")); //-- gridIonIds.clear(); //Get the currently selected plot int curPlot=listPlots->GetSelection(); //If no plot slected, abort update if(curPlot == (unsigned int) wxNOT_FOUND || !currentRange) { gridIons->Thaw(); programmaticEvent=false; return; } std::string title; title=plotWrap.getTitle(curPlot); //Colour to use for incomplete ions/ranges wxColour incomplColour; //A light blue colour incomplColour.Set(162,162,255); size_t curIonRow=0; //Fill in the ion grid gridIons->AppendRows(currentRange->getNumIons()); for(size_t uj=0;ujgetNumIons();uj++) { //Set the ionID from the row gridIonIds[uj]=curIonRow; gridIons->SetCellValue(curIonRow, ION_COL_PLOT,(title)); gridIons->SetCellValue(curIonRow, ION_COL_SHORTNAME,(currentRange->getName(uj))); gridIons->SetCellValue(curIonRow, ION_COL_LONGNAME,(currentRange->getName(uj,false))); //set the colour wxGridCellAttr *attr = gridIons->GetOrCreateCellAttr(curIonRow,ION_COL_COLOUR); RGBf col=currentRange->getColour(uj); unsigned char r,g,b,a; r=col.red*255.0f; g=col.green*255.0f; b=col.blue*255.0f; a=255; attr->SetBackgroundColour(wxColour(r,g,b,a)); attr->DecRef(); curIonRow++; } //Add the incomplete ions incompleteIonOffset=currentRange->getNumIons(); gridIons->AppendRows(incompleteIons.size()); for(size_t ui=0;uiSetCellValue(curIonRow, ION_COL_PLOT,(title)); gridIons->SetCellValue(curIonRow, ION_COL_SHORTNAME,(incompleteIons[ui].getShortName())); gridIons->SetCellValue(curIonRow, ION_COL_LONGNAME,(incompleteIons[ui].getLongName())); //set the colour wxGridCellAttr *attr = gridIons->GetOrCreateCellAttr(curIonRow,ION_COL_COLOUR); RGBf col=incompleteIons[ui].getColour(); unsigned char r,g,b,a; r=col.red*255.0f; g=col.green*255.0f; b=col.blue*255.0f; a=255; attr->SetBackgroundColour(wxColour(r,g,b,a)); attr->DecRef(); for(size_t uj=0;ujSetCellBackgroundColour(curIonRow,uj,incomplColour); } curIonRow++; } gridIons->Scroll(viewStartX,viewStartY); if(rowVisibleHint!=(size_t)-1) { ASSERT(rowVisibleHint < gridIons->GetNumberRows()); gridIons->MakeCellVisible(rowVisibleHint,0); } gridIons->Thaw(); programmaticEvent=false; } void RangeEditorDialog::generateRangeEntries(size_t rowVisibleHint) { programmaticEvent=true; gridRanges->Freeze(); int viewStartX,viewStartY; gridRanges->GetViewStart(&viewStartX,&viewStartY); vector > > regions; plotWrap.getRegions(regions); //OK, so we have each plot and the regions it contains //lets filter that down to the regions we can actually see //Reset the range grid //--- if(gridRanges->GetNumberCols()) gridRanges->DeleteCols(0,gridRanges->GetNumberCols()); if(gridRanges->GetNumberRows()) gridRanges->DeleteRows(0,gridRanges->GetNumberRows()); gridRanges->AppendCols(4); gridRanges->SetColLabelValue(0,TRANS("Plot")); gridRanges->SetColLabelValue(1,TRANS("Ion")); gridRanges->SetColLabelValue(2,TRANS("Start")); gridRanges->SetColLabelValue(3,TRANS("End")); //--- gridRangeIds.clear(); //Get the currently selected plot int curPlot=listPlots->GetSelection(); //If no plot slected, abort update if(curPlot == (unsigned int) wxNOT_FOUND || !currentRange) { gridRanges->Thaw(); return; } //Colour to use for incomplete ions/ranges wxColour incomplColour; //A light blue colour incomplColour.Set(162,162,255); std::string title; title=plotWrap.getTitle(curPlot); //Fill in the range grid size_t curRangeRow=0; gridRanges->AppendRows(currentRange->getNumRanges()); for(size_t ui=0;uigetNumRanges();ui++) { gridRangeIds[ui]=curRangeRow; pair rangeBound; rangeBound=currentRange->getRange(ui); std::string ionName; ionName=currentRange->getName(currentRange->getIonID((unsigned int)ui)); gridRanges->SetCellValue(curRangeRow,RNG_COL_PLOT,(title)); gridRanges->SetCellValue(curRangeRow,RNG_COL_PARENT_ION,(ionName)); std::string tmpStr; stream_cast(tmpStr,rangeBound.first); gridRanges->SetCellValue(curRangeRow,RNG_COL_START,(tmpStr)); stream_cast(tmpStr,rangeBound.second); gridRanges->SetCellValue(curRangeRow,RNG_COL_END,(tmpStr)); curRangeRow++; } //Add the pending rows gridRanges->AppendRows(incompleteRanges.size()); incompleteRangeOffset=currentRange->getNumRanges(); for(size_t ui=0;uiSetCellValue(curRangeRow,RNG_COL_PLOT,(title)); gridRanges->SetCellValue(curRangeRow,RNG_COL_PARENT_ION,(ionName)); std::string tmpStr; stream_cast(tmpStr,incompleteRanges[ui].getStart()); gridRanges->SetCellValue(curRangeRow,RNG_COL_START,(tmpStr)); stream_cast(tmpStr,incompleteRanges[ui].getEnd()); gridRanges->SetCellValue(curRangeRow,RNG_COL_END,(tmpStr)); for(size_t uj=0;ujSetCellBackgroundColour(curRangeRow,uj,incomplColour); curRangeRow++; } gridRanges->Scroll(viewStartX,viewStartY); if(rowVisibleHint!=(size_t)-1) { ASSERT(rowVisibleHint < gridRanges->GetNumberRows()); gridRanges->MakeCellVisible(rowVisibleHint,0); } gridRanges->Thaw(); programmaticEvent=false; } void RangeEditorDialog::OnListPlots(wxCommandEvent &event) { if(programmaticEvent) return; setCurrentRange(event.GetSelection()); plotWrap.hideAll(); //Set the plot visibility for each plot for(unsigned int ui=0;uiGetCount(); ui++) { unsigned int plotID; plotID = listToPlotIDs[ui]; //Set the plot visibility to match selection plotWrap.setVisible(plotID,listPlots->IsSelected(ui)); } plotPanel->Refresh(); } void RangeEditorDialog::setRangeReady() { bool isReady=true; for(RFMAP::const_iterator it=modifiedRanges.begin(); it!=modifiedRanges.end(); ++it) { if(!it->second.isSelfConsistent() ) { isReady=false; break; } } btnOK->Enable(isReady); } void RangeEditorDialog::OnGridRangesEditorShown(wxGridEvent &event) { event.Skip(); wxLogDebug(wxT("Event handler (RangeEditorDialog::OnGridRangesEditorShown) not implemented yet")); //notify the user that he hasn't implemented the event handler yet } void RangeEditorDialog::OnGridIonsEditorShown(wxGridEvent &event) { if(event.GetRow() < incompleteIonOffset) { //We are editing a regular ion, not an incomplete ion size_t ionId=gridIonIds[event.GetRow()]; ASSERT(ionId < currentRange->getNumIons()); switch(event.GetCol()) { case ION_COL_PLOT: //Can't edit this column event.Veto(); break; case ION_COL_COLOUR: { //Pop up a dialog asking for colour input RGBf rgbf=currentRange->getColour(ionId); wxColourData d; d.SetColour(wxColour((unsigned char)(rgbf.red*255), (unsigned char)(rgbf.green*255), (unsigned char)(rgbf.blue*255), (unsigned char)(255))); wxColourDialog *colDg=new wxColourDialog(this,&d); //Check to see if user actually put in a colour if( colDg->ShowModal() != wxID_OK) { event.Veto(); delete colDg; return; } //Update the colour data in the range wxColour c; c=colDg->GetColourData().GetColour(); rgbf.red=c.Red()/255.0f; rgbf.green=c.Green()/255.0f; rgbf.blue=c.Blue()/255.0f; currentRange->setColour(ionId,rgbf); //Change the colour in the grid wxGridCellAttr *attr = gridIons->GetOrCreateCellAttr( event.GetRow(),ION_COL_COLOUR); attr->SetBackgroundColour(c); delete colDg; //We have to veto the edit event so that the user // doesn't get a text box to type into event.Veto(); //We need to update the plot regions, as they // will have changed colour generatePlotRegions(); break; } case ION_COL_SHORTNAME: case ION_COL_LONGNAME: { //Nothing to do until edit is complete break; } default: ASSERT(false); } } else { size_t delta=event.GetRow() - incompleteIonOffset; switch(event.GetCol()) { case ION_COL_LONGNAME: case ION_COL_SHORTNAME: event.Skip(); break; case ION_COL_PLOT: event.Veto(); break; case ION_COL_COLOUR: { RGBf rgbf=incompleteIons[delta].getColour(); wxColourData d; d.SetColour(wxColour((unsigned char)(rgbf.red*255), (unsigned char)(rgbf.green*255), (unsigned char)(rgbf.blue*255), (unsigned char)(255))); wxColourDialog *colDg=new wxColourDialog(this,&d); if( colDg->ShowModal() != wxID_OK) { delete colDg; return; } wxColour c; //Change the colour c=colDg->GetColourData().GetColour(); rgbf.red=c.Red()/255.0f; rgbf.green=c.Green()/255.0f; rgbf.blue=c.Blue()/255.0f; incompleteIons[delta].setColour(rgbf); delete colDg; //Check to see if the incomplete ion is now done // if so, commit it to the rangefile if(incompleteIons[delta].isFinished()) { incompleteIons[delta].commit(); std::swap(incompleteIons[delta],incompleteIons.back()); incompleteIons.pop_back(); generateIonEntries(); } else { unsigned char r,g,b,a; r=rgbf.red*255.0f; g=rgbf.green*255.0f; b=rgbf.blue*255.0f; a=255; gridIons->SetCellBackgroundColour(event.GetRow(), ION_COL_COLOUR,wxColour(r,g,b,a)); } event.Veto(); break; } default: ASSERT(false); } } setRangeReady(); } void RangeEditorDialog::OnGridRangesCellChange(wxGridEvent &event) { if(programmaticEvent) return; programmaticEvent=true; std::string newContent; newContent=stlStr(gridRanges->GetCellValue(event.GetRow(),event.GetCol())); if(event.GetRow() >= incompleteRangeOffset) { //Process an incomplete range in the grid size_t delta=event.GetRow() - incompleteRangeOffset; RangeFile &r = *(incompleteRanges[delta].getRangePtr()); switch(event.GetCol()) { case RNG_COL_PLOT: break; case RNG_COL_PARENT_ION: { //Check to see if we have the ion name already unsigned int newID = r.getIonID(newContent); if( newID== (unsigned int)-1) { event.Veto(); programmaticEvent=false; return; } incompleteRanges[delta].setParentId(newID); break; } case RNG_COL_START: { float tmp; if(stream_cast(tmp,newContent)) { event.Veto(); programmaticEvent=false; return; } incompleteRanges[delta].setStart(tmp); break; } case RNG_COL_END: { float tmp; if(stream_cast(tmp,newContent)) { event.Veto(); programmaticEvent=false; return; } incompleteRanges[delta].setEnd(tmp); break; } default: { ASSERT(false); } } //if the range is complete, add it if(incompleteRanges[delta].isFinished()) { incompleteRanges[delta].commit(); std::swap(incompleteRanges[delta],incompleteRanges.back()); incompleteRanges.pop_back(); } generateRangeEntries(); //Re-generate the plot regions, as they have been changed now generatePlotRegions(); programmaticEvent=false; return; } //We have a pre-existing range that is being modified //Find out which range was latered size_t rangeId; rangeId=gridRangeIds[event.GetRow()]; switch(event.GetCol()) { case RNG_COL_PLOT: break; case RNG_COL_PARENT_ION: { unsigned int newID = currentRange->getIonID(newContent); if( newID== (unsigned int)-1) { event.Veto(); programmaticEvent=false; return; } currentRange->setIonID(rangeId,newID); break; } case RNG_COL_START: { float f; if(stream_cast(f,newContent)) { event.Veto(); programmaticEvent=false; return; } //Disallow inversion of range start/end if(f >=currentRange->getRange(rangeId).second) { event.Veto(); programmaticEvent=false; return; } currentRange->setRangeStart(rangeId,f); break; } case RNG_COL_END: { float f; if(stream_cast(f,newContent)) { event.Veto(); programmaticEvent=false; return; } //Disallow inversion of range start/end if(f <=currentRange->getRange(rangeId).first) { event.Veto(); programmaticEvent=false; return; } currentRange->setRangeEnd(rangeId,f); break; } default: ASSERT(false); } //Re-generate the altered plot regions generatePlotRegions(); programmaticEvent=false; setRangeReady(); } void RangeEditorDialog::OnGridIonsCellChange(wxGridEvent &event) { if(programmaticEvent) return; std::string newContent; newContent=stlStr(gridIons->GetCellValue(event.GetRow(),event.GetCol())); if(event.GetRow()>= incompleteIonOffset) { size_t delta=event.GetRow() - incompleteIonOffset; PendingIon &p = incompleteIons[delta]; switch(event.GetCol()) { case ION_COL_PLOT: //Can't edit this column event.Veto(); break; case ION_COL_COLOUR: //Already handled break; case ION_COL_SHORTNAME: { //Check to see if the name already exists, if it does, then veto the event if(p.getRangePtr()->getIonID(newContent.c_str()) == (unsigned int) - 1) p.setShortName(newContent); else event.Veto(); break; } case ION_COL_LONGNAME: { //Check to see if the name already exists, if it does, then veto the event if(p.getRangePtr()->getIonID(newContent.c_str(),false) == (unsigned int) - 1) p.setLongName(newContent); else event.Veto(); break; } default: ASSERT(false); } //if the range is complete, add it if(incompleteIons[delta].isFinished()) { incompleteIons[delta].commit(); std::swap(incompleteIons[delta],incompleteIons.back()); incompleteIons.pop_back(); generateIonEntries(); } return; } //Find out which ion was latered size_t ionId; ionId=gridIonIds[event.GetRow()]; switch(event.GetCol()) { case ION_COL_COLOUR: //already handled on cell editor shown- do nothing break; case ION_COL_SHORTNAME: currentRange->setIonShortName(ionId,newContent); break; case ION_COL_LONGNAME: currentRange->setIonLongName(ionId,newContent); break; case ION_COL_PLOT: //veto event.Veto(); break; default: ASSERT(false); } setRangeReady(); } void RangeEditorDialog::OnGridRangeClick(wxGridEvent &cmd) { lastFocused=GRID_FOCUS_RANGES; cmd.Skip(); } void RangeEditorDialog::OnGridIonClick(wxGridEvent &cmd) { lastFocused=GRID_FOCUS_IONS; cmd.Skip(); } void RangeEditorDialog::OnBtnRangeIonAdd(wxCommandEvent &event) { //If there are no grids then the user cannot focus them, // so in this case, give the user the option of selecting what action to take if(lastFocused == GRID_FOCUS_NONE || !gridRanges->GetNumberRows() || !gridIons->GetNumberRows()) { wxArrayString wxStrs; wxStrs.Add(("Ion")); wxStrs.Add(("Range")); wxSingleChoiceDialog *wxD = new wxSingleChoiceDialog(this, TRANS("Range or ion?"), TRANS("Select type to add"),wxStrs,(void **)NULL,wxDEFAULT_DIALOG_STYLE|wxOK|wxCENTRE); wxD->ShowModal(); if(wxD->GetSelection() == 0) lastFocused=GRID_FOCUS_IONS; else lastFocused=GRID_FOCUS_RANGES; } //Update either the range or ion grid with a new pending item. ASSERT(currentRange); switch(lastFocused) { case GRID_FOCUS_RANGES: { incompleteRanges.push_back(PendingRange(currentRange)); size_t visibleRowHint=gridRanges->GetNumberRows(); generateRangeEntries(visibleRowHint); break; } case GRID_FOCUS_IONS: { incompleteIons.push_back(PendingIon(currentRange)); size_t visibleRowHint=gridIons->GetNumberRows(); generateIonEntries(visibleRowHint); break; } default: ASSERT(false); } setRangeReady(); } void RangeEditorDialog::OnBtnRangeIonRemove(wxCommandEvent &event) { switch(lastFocused) { case GRID_FOCUS_RANGES: { size_t row=gridRanges->GetGridCursorRow(); //TODO: Better selection handling // - grids are notoriously bad at selection in wx if(!gridRanges->GetNumberRows() || row == wxNOT_FOUND) break; if(row < incompleteRangeOffset) { //Find the mapping between the range, then kill it size_t rangeId = gridRangeIds[row]; //Kill the range currentRange->eraseRange(rangeId); } else { size_t delta=row - incompleteRangeOffset; //Remove the pending range std::swap(incompleteRanges[delta], incompleteRanges.back()); incompleteRanges.pop_back(); } //relayout the grid generateRangeEntries(); //Update plot generatePlotRegions(); break; } case GRID_FOCUS_IONS: { size_t row=gridIons->GetGridCursorRow(); //TODO: Better selection handling // - grids are notoriously bad at selection in wx if(!gridIons->GetNumberRows() || row == wxNOT_FOUND) break; if(row < incompleteIonOffset) { //Find the mapping between the range, then kill it size_t ionId = gridIonIds[row]; //Kill the ion, and any of its ranges currentRange->eraseIon(ionId); } else { size_t delta=row - incompleteIonOffset; //Remove the pending range std::swap(incompleteIons[delta], incompleteIons.back()); incompleteIons.pop_back(); } //relayout the grids, then update plot generateIonEntries(); generateRangeEntries(); generatePlotRegions(); break; } case GRID_FOCUS_NONE: { break; } default: ASSERT(false); } setRangeReady(); } void RangeEditorDialog::OnCheckShowOverlay(wxCommandEvent &event) { plotWrap.overlays.setEnabled(event.IsChecked()); plotPanel->Refresh(); } void RangeEditorDialog::OnBtnOK(wxCommandEvent &event) { EndModal(wxID_OK); } void RangeEditorDialog::OnBtnCancel(wxCommandEvent &event) { EndModal(wxID_CANCEL); } void RangeEditorDialog::OnListOverlayCheck(wxCommandEvent &event) { long index=event.GetInt(); bool isChecked; isChecked=listOverlay->IsChecked(index); plotWrap.overlays.setEnabled(index,isChecked); plotPanel->Refresh(); } void RangeEditorDialog::OnListOverlayKeyDown(wxListEvent &event) { //Check for delete key if(event.GetKeyCode() != WXK_DELETE) return; long index=event.GetIndex(); plotWrap.overlays.erase(index); generateOverlayList(plotWrap.overlays.getOverlays()); plotPanel->Refresh(); } void RangeEditorDialog::OnSashVerticalDClick(wxSplitterEvent &event) { event.Veto(); } void RangeEditorDialog::OnTextOverlay(wxCommandEvent &event) { std::string compoundString; compoundString=stlStr(textOverlayCmpnt->GetValue()); vector > ionFragments; if(RangeFile::decomposeIonNames(compoundString,ionFragments)) { textOverlayCmpnt->SetDefaultStyle(wxTextAttr(*wxBLUE)); } else { textOverlayCmpnt->SetDefaultStyle(wxTextAttr(wxNullColour)); } } void RangeEditorDialog::OnTextOverlaySetFocus(wxFocusEvent &event) { if(!haveSetTextFocus) { haveSetTextFocus=true; textOverlayCmpnt->SetValue(wxT("")); } else event.Skip(); } void RangeEditorDialog::OnTextOverlayEnter(wxCommandEvent &event) { //Obtain the user input for the text control std::string compoundString; compoundString = stlStr(textOverlayCmpnt->GetValue()); //break the users' input into vector > ionFragments; if(!RangeFile::decomposeIonNames(compoundString,ionFragments)) return; //Check to see if each component has a matching symbol for all elements //---- bool symbolsFound; vector indicies; vector symbols; //Get the indices for each gragment symbols.resize(ionFragments.size()); for(size_t ui=0;uiSetBackgroundColour(wxColour(*wxCYAN)); return; } textOverlayCmpnt->SetBackgroundColour(wxNullColour); //---- //Get the intensity distribution //---- vector fragmentCount; size_t totalFragments=0; fragmentCount.resize(ionFragments.size()); for(size_t ui=0;ui MAX_FRAGMENT_COUNT) { textOverlayCmpnt->SetBackgroundColour(wxColour(*wxCYAN)); return; } //Number of times to "fold" the intensity distribution const size_t MAX_FOLD_VALUE=3; OVERLAY_DATA overlay; overlay.title=compoundString; overlay.enabled=true; for(size_t ui=0;ui > massDist; abundanceData.generateIsotopeDist(indicies,fragmentCount,massDist,ui+1); for(size_t uj=0;ujRefresh(); } // wxGlade: add RangeEditorDialog event handlers void RangeEditorDialog::set_properties() { // begin wxGlade: RangeEditorDialog::set_properties SetTitle(TRANS("Range Editor")); gridRanges->CreateGrid(0, 3); gridIons->CreateGrid(0, 3); checkShowOverlay->SetToolTip(TRANS("Enable or disable all overlays")); listOverlay->SetToolTip(TRANS("Entered overlays, use delete to remove")); listPlots->SetToolTip(TRANS("Available plots for ranging")); textOverlayCmpnt->SetToolTip(TRANS("Enter species to display as overlay, e.g. SiO2")); gridRanges->SetToolTip(TRANS("Editable ranges")); gridIons->SetToolTip(TRANS("Editable ions")); // end wxGlade } void RangeEditorDialog::do_layout() { // begin wxGlade: RangeEditorDialog::do_layout wxBoxSizer* topSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerRight = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerBottom = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerNote = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerOverlayPane = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerOverlay = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerOverlayContainer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerOverlayLeft = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerRanges = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerRangeBottom = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerPlotList = new wxBoxSizer(wxVERTICAL); sizerPlotList->Add(listPlots, 1, wxEXPAND, 0); noteLeftPlots->SetSizer(sizerPlotList); sizerRanges->Add(gridIons, 1, wxALL|wxEXPAND, 4); sizerRanges->Add(gridRanges, 1, wxALL|wxEXPAND, 4); sizerRangeBottom->Add(20, 20, 1, 0, 0); sizerRangeBottom->Add(btnRangeIonAdd, 0, wxALL, 4); sizerRangeBottom->Add(btnRangeIonRemove, 0, wxALL, 4); sizerRanges->Add(sizerRangeBottom, 0, wxALL|wxEXPAND, 4); noteLeftRanges->SetSizer(sizerRanges); sizerOverlay->Add(checkShowOverlay, 0, wxALL, 5); sizerOverlayLeft->Add(textOverlayCmpnt, 0, wxEXPAND, 0); sizerOverlayContainer->Add(sizerOverlayLeft, 0, wxALL|wxEXPAND, 2); sizerOverlayContainer->Add(listOverlay, 1, wxEXPAND, 0); sizerOverlay->Add(sizerOverlayContainer, 1, wxEXPAND, 0); sizerOverlayPane->Add(sizerOverlay, 1, wxEXPAND, 0); noteLeftOverlay->SetSizer(sizerOverlayPane); notebookLeft->AddPage(noteLeftPlots, TRANS("Plots")); notebookLeft->AddPage(noteLeftRanges, TRANS("Ranges")); notebookLeft->AddPage(noteLeftOverlay, TRANS("Overlay")); sizerNote->Add(notebookLeft, 1, wxEXPAND, 0); panelSplitLeft->SetSizer(sizerNote); sizerRight->Add(plotPanel, 1, wxEXPAND, 0); sizerBottom->Add(20, 20, 1, 0, 0); sizerBottom->Add(btnOK, 0, wxALL, 4); sizerBottom->Add(btnCancel, 0, wxALL, 4); sizerRight->Add(sizerBottom, 0, wxRIGHT|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 4); panelSplitRight->SetSizer(sizerRight); splitVertical->SplitVertically(panelSplitLeft, panelSplitRight); topSizer->Add(splitVertical, 1, wxEXPAND, 0); SetSizer(topSizer); topSizer->Fit(this); Layout(); // end wxGlade } 3Depict-0.0.19/src/gui/mainFrame.cpp0000644000175000017500000052231512720624201016442 0ustar pcuserpcuser/* * mainFrame.cpp - Main 3Depict window * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifdef __APPLE__ //FIXME: workaround for UI layout under apple platform // wxMac appears to have problems with nested panels. #define APPLE_EFFECTS_WORKAROUND 1 #endif enum { WINDOW_LOCK_REFRESH, WINDOW_LOCK_PROPEDIT, WINDOW_LOCK_NONE }; //OS specific stuff #ifdef __APPLE__ #include "CoreFoundation/CoreFoundation.h" #endif #include "mainFrame.h" //wxWidgets stuff #include #include #include #include #include #include #include #include #include #include // Needed for wxLaunchDefaultApplication //extra imports #undef I // Not sure who is defining this, but it is causing problems - mathgl? #include "common/voxels.h" //Custom program dialog windows #include "gui/dialogs/StashDialog.h" //Stash editor #include "gui/dialogs/resolutionDialog.h" // resolution selection dialog #include "gui/dialogs/ExportRngDialog.h" // Range export dialog #include "gui/dialogs/ExportPos.h" // Ion export dialog #include "gui/dialogs/prefDialog.h" // Preferences dialog #include "gui/dialogs/autosaveDialog.h" // startup autosave dialog for multiple load options #include "gui/dialogs/filterErrorDialog.h" // Dialog for displaying details for filter analysis error messages #include "gui/dialogs/animateFilterDialog.h" // Dialog for performing property sweeps on filters #include "gui/dialogs/rangeEditDialog.h" // Dialog for performing editing rangefiles #include "common/stringFuncs.h" //Program Icon #include "art.h" //Filter imports #include "backend/filters/rangeFile.h" #include "backend/filters/dataLoad.h" #include "wx/propertyGridUpdater.h" #include #include #include #include #include #include using std::vector; using std::string; using std::pair; using std::map; using std::make_pair; using std::list; using std::max; using std::stack; //milliseconds before clearing status bar (by invoking a status timer event) const unsigned int STATUS_TIMER_DELAY=10000; //Milliseconds between querying viscontrol for needing update const unsigned int UPDATE_TIMER_DELAY=50; //Milliseconds between progress bar updates const unsigned int PROGRESS_TIMER_DELAY=40; //Seconds between autosaves const unsigned int AUTOSAVE_DELAY=180; //Default window size const unsigned int DEFAULT_WIN_WIDTH=1024; const unsigned int DEFAULT_WIN_HEIGHT=800; //minimum startup window size const unsigned int MIN_WIN_WIDTH=100; const unsigned int MIN_WIN_HEIGHT=100; //!Number of pages in the panel at the bottom const unsigned int NOTE_CONSOLE_PAGE_OFFSET= 2; //The conversion factor from the baseline shift slider to camera units const float BASELINE_SHIFT_FACTOR=0.0002f; const char *cameraIntroString=NTRANS("New camera name..."); const char *stashIntroString=NTRANS("New stash name..."); #if (defined(__WIN32) || defined(__WIN64)) //Being non-empty string causes segfault under wine. Don't know why const char *ADD_FILTER_TEXT=""; #else const char *ADD_FILTER_TEXT=NTRANS("New Filter..."); #endif //Name of autosave state file. MUST end in .xml middle const char *AUTOSAVE_PREFIX= "autosave."; const char *AUTOSAVE_SUFFIX=".xml"; //This is the dropdown matching list. This must match //the order for comboFilters_choices, as declared in //MainFrame's constructor //--- These settings must be modified concomitantly. const unsigned int FILTER_DROP_COUNT=14; const char * comboFilters_choices[FILTER_DROP_COUNT] = { NTRANS("Annotation"), NTRANS("Bounding Box"), NTRANS("Clipping"), NTRANS("Cluster Analysis"), NTRANS("Compos. Profiles"), NTRANS("Downsampling"), NTRANS("Extern. Prog."), NTRANS("Ion Colour"), NTRANS("Ion Info"), NTRANS("Ion Transform"), NTRANS("Spectrum"), NTRANS("Range File"), NTRANS("Spat. Analysis"), NTRANS("Voxelisation"), }; //Mapping between filter ID and combo position const unsigned int comboFiltersTypeMapping[FILTER_DROP_COUNT] = { FILTER_TYPE_ANNOTATION, FILTER_TYPE_BOUNDBOX, FILTER_TYPE_IONCLIP, FILTER_TYPE_CLUSTER_ANALYSIS, FILTER_TYPE_PROFILE, FILTER_TYPE_IONDOWNSAMPLE, FILTER_TYPE_EXTERNALPROC, FILTER_TYPE_IONCOLOURFILTER, FILTER_TYPE_IONINFO, FILTER_TYPE_TRANSFORM, FILTER_TYPE_SPECTRUMPLOT, FILTER_TYPE_RANGEFILE, FILTER_TYPE_SPATIAL_ANALYSIS, FILTER_TYPE_VOXELS, }; //---- //Constant identifiers for binding events in wxwidgets "event table" enum { //File menu ID_MAIN_WINDOW= wxID_ANY+1000, // There is a bug under MSW where wxID_ANY+1 causes collisions with some controls with implicit IDs... ID_FILE_EXIT, ID_FILE_OPEN, ID_FILE_MERGE, ID_FILE_SAVE, ID_FILE_SAVEAS, ID_FILE_EXPORT_PLOT, ID_FILE_EXPORT_IMAGE, ID_FILE_EXPORT_IONS, ID_FILE_EXPORT_RANGE, ID_FILE_EXPORT_ANIMATION, ID_FILE_EXPORT_FILTER_ANIMATION, ID_FILE_EXPORT_PACKAGE, //Edit menu ID_EDIT_UNDO, ID_EDIT_REDO, ID_EDIT_RANGE, ID_EDIT_PREFERENCES, //Help menu ID_HELP_ABOUT, ID_HELP_HELP, ID_HELP_CONTACT, //View menu ID_VIEW_BACKGROUND, ID_VIEW_CONTROL_PANE, ID_VIEW_RAW_DATA_PANE, ID_VIEW_SPECTRA, ID_VIEW_PLOT_LEGEND, ID_VIEW_WORLDAXIS, ID_VIEW_FULLSCREEN, //Left hand note pane ID_NOTEBOOK_CONTROL, ID_NOTE_CAMERA, ID_NOTE_DATA, ID_NOTE_PERFORMANCE, ID_NOTE_TOOLS, ID_NOTE_VISUALISATION, //Lower pane ID_PANEL_DATA, ID_PANEL_VIEW, ID_NOTE_SPECTRA, ID_NOTE_RAW, ID_GRID_RAW_DATA, ID_BUTTON_GRIDCOPY, ID_LIST_PLOTS, //Splitter IDs ID_SPLIT_LEFTRIGHT, ID_SPLIT_FILTERPROP, ID_SPLIT_TOP_BOTTOM, ID_SPLIT_SPECTRA, ID_RAWDATAPANE_SPLIT, ID_CONTROLPANE_SPLIT, //Camera panel ID_COMBO_CAMERA, ID_GRID_CAMERA_PROPERTY, ID_BUTTON_ALIGNCAM_XMINUS, ID_BUTTON_ALIGNCAM_XPLUS, ID_BUTTON_ALIGNCAM_YMINUS, ID_BUTTON_ALIGNCAM_YPLUS, ID_BUTTON_ALIGNCAM_ZMINUS, ID_BUTTON_ALIGNCAM_ZPLUS, //Filter panel ID_COMBO_FILTER, ID_COMBO_STASH, ID_BTN_STASH_MANAGE, ID_CHECK_AUTOUPDATE, ID_FILTER_NAMES, ID_GRID_FILTER_PROPERTY, ID_LIST_FILTER, ID_TREE_FILTERS, ID_BUTTON_REFRESH, ID_BTN_EXPAND, ID_BTN_COLLAPSE, ID_BTN_FILTERTREE_ERRS, //Effects panel ID_EFFECT_ENABLE, ID_EFFECT_CROP_ENABLE, ID_EFFECT_CROP_AXISONE_COMBO, ID_EFFECT_CROP_PANELONE, ID_EFFECT_CROP_PANELTWO, ID_EFFECT_CROP_AXISTWO_COMBO, ID_EFFECT_CROP_CHECK_COORDS, ID_EFFECT_CROP_TEXT_DX, ID_EFFECT_CROP_TEXT_DY, ID_EFFECT_CROP_TEXT_DZ, ID_EFFECT_STEREO_ENABLE, ID_EFFECT_STEREO_COMBO, ID_EFFECT_STEREO_BASELINE_SLIDER, ID_EFFECT_STEREO_LENSFLIP, //Options panel ID_CHECK_ALPHA, ID_CHECK_LIGHTING, ID_CHECK_LIMIT_POINT_OUT, ID_TEXT_LIMIT_POINT_OUT, ID_CHECK_CACHING, ID_CHECK_WEAKRANDOM, ID_SPIN_CACHEPERCENT, //Misc ID_PROGRESS_ABORT, ID_STATUS_TIMER, ID_PROGRESS_TIMER, ID_UPDATE_TIMER, ID_AUTOSAVE_TIMER, }; enum { FILE_OPEN_TYPE_UNKNOWN=1, FILE_OPEN_TYPE_XML=2, FILE_OPEN_TYPE_POS=4, FILE_OPEN_TYPE_TEXT=8, FILE_OPEN_TYPE_LAWATAP_ATO=16, }; void setWxTreeImages(wxTreeCtrl *t, const map &artFilters) { #if defined(__WIN32) || defined(__WIN64) || defined(__APPLE__) const int winTreeIconSize=9; wxImageList *imList = new wxImageList(winTreeIconSize,winTreeIconSize); #else wxImageList *imList = new wxImageList; #endif //map to map wxArtIDs to position in the image list map artMap; size_t offset=0; //Construct an image list for the tree for(map::const_iterator it=artFilters.begin();it!=artFilters.end();++it) { #if defined(__WIN32) || defined(__WIN64) || defined(__APPLE__) imList->Add(wxBitmap(wxBitmap(wxArtProvider::GetBitmap(it->second)). ConvertToImage().Rescale(winTreeIconSize, winTreeIconSize))); #else imList->Add(wxArtProvider::GetBitmap(it->second)); #endif artMap[it->second] = offset; offset++; } //Assign the image list - note wx will delete the image list here - we don't need to. t->AssignImageList(imList); //Now do a DFS run through the tree, checking to see if any of the elements need // a particular image std::stack items; if (t->GetRootItem().IsOk()) items.push(t->GetRootItem()); while (!items.empty()) { wxTreeItemId next = items.top(); items.pop(); //Get the filter pointer //-- size_t tItemVal; wxTreeItemData *tData; tData=t->GetItemData(next); tItemVal=((wxTreeUint *)tData)->value; //-- map::const_iterator it; it = artFilters.find(tItemVal); if (next != t->GetRootItem() && it!=artFilters.end()) t->SetItemImage(next,artMap[it->second]); else { t->SetItemImage(next,-1); } wxTreeItemIdValue cookie; wxTreeItemId nextChild = t->GetFirstChild(next, cookie); while (nextChild.IsOk()) { items.push(nextChild); nextChild = t->GetNextSibling(nextChild); } } return; } void clearWxTreeImages(wxTreeCtrl *t) { t->AssignImageList(NULL); } MainWindowFrame::MainWindowFrame(wxWindow* parent, int id, const wxString& title, const wxPoint& pos, const wxSize& size, long style): wxFrame(parent, id, title, pos, size, style) { COMPILE_ASSERT( (THREEDEP_ARRAYSIZE(comboFilters_choices) + 1 ) == FILTER_TYPE_ENUM_END); initedOK=false; plotUpdates=false; programmaticEvent=false; fullscreenState=0; verCheckThread=0; refreshThread=0; refreshControl=0; ensureResultVisible=false; lastProgressData.reset(); //Set up the program icon handler wxArtProvider::Push(new MyArtProvider); SetIcon(wxArtProvider::GetIcon(wxT("MY_ART_ID_ICON"))); //Set up the drag and drop handler dropTarget = new FileDropTarget(this); SetDropTarget(dropTarget); //Set up the recently used files menu // Note that this cannot exceed 9. Items show up, but do not trigger events. // This is bug 12141 in wxWidgets : http://trac.wxwidgets.org/ticket/12141 ASSERT(configFile.getMaxHistory() <=9); recentHistory= new wxFileHistory(configFile.getMaxHistory()); programmaticEvent=false; currentlyUpdatingScene=false; statusTimer = new wxTimer(this,ID_STATUS_TIMER); updateTimer= new wxTimer(this,ID_UPDATE_TIMER); progressTimer= new wxTimer(this,ID_PROGRESS_TIMER); autoSaveTimer= new wxTimer(this,ID_AUTOSAVE_TIMER); requireFirstUpdate=true; //Set up keyboard shortcuts "accelerators" wxAcceleratorEntry entries[1]; entries[0].Set(0,WXK_ESCAPE,ID_PROGRESS_ABORT); wxAcceleratorTable accel(1, entries); SetAcceleratorTable(accel); // begin wxGlade: MainWindowFrame::MainWindowFrame splitLeftRight = new wxSplitterWindow(this, ID_SPLIT_LEFTRIGHT, wxDefaultPosition, wxDefaultSize, wxSP_3D|wxSP_BORDER); panelRight = new wxPanel(splitLeftRight, wxID_ANY); splitTopBottom = new wxSplitterWindow(panelRight, ID_SPLIT_TOP_BOTTOM, wxDefaultPosition, wxDefaultSize, wxSP_3D|wxSP_BORDER); noteDataView = new wxNotebook(splitTopBottom, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_LEFT); noteDataViewConsole = new wxPanel(noteDataView, wxID_ANY); noteRaw = new wxPanel(noteDataView, ID_NOTE_RAW); splitterSpectra = new wxSplitterWindow(noteDataView, ID_SPLIT_SPECTRA, wxDefaultPosition, wxDefaultSize, wxSP_3D|wxSP_BORDER); window_2_pane_2 = new wxPanel(splitterSpectra, wxID_ANY); panelTop = new BasicGLPane(splitTopBottom); glPanelOK = panelTop->displaySupported(); if(!glPanelOK) { wxErrMsg(this,TRANS("OpenGL Failed"), TRANS("Unable to initialise the openGL (3D) panel. Program cannot start. Please check your video drivers.") ); std::cerr << TRANS("Unable to initialise the openGL (3D) panel. Program cannot start. Please check your video drivers.") << std::endl; return; } panelTop->setScene(&visControl.scene); panelLeft = new wxPanel(splitLeftRight, wxID_ANY); notebookControl = new wxNotebook(panelLeft, ID_NOTEBOOK_CONTROL, wxDefaultPosition, wxDefaultSize, wxNB_RIGHT); noteTools = new wxPanel(notebookControl, ID_NOTE_PERFORMANCE, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); notePost = new wxPanel(notebookControl, wxID_ANY); noteEffects = new wxNotebook(notePost, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_LEFT); noteFxPanelStereo = new wxPanel(noteEffects, wxID_ANY); noteFxPanelCrop = new wxPanel(noteEffects, wxID_ANY); noteCamera = new wxScrolledWindow(notebookControl, ID_NOTE_CAMERA, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); noteData = new wxPanel(notebookControl, ID_NOTE_DATA, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); filterSplitter = new wxSplitterWindow(noteData,ID_SPLIT_FILTERPROP , wxDefaultPosition, wxDefaultSize, wxSP_3D|wxSP_BORDER); filterPropertyPane = new wxPanel(filterSplitter, wxID_ANY); //topPanelSizer_staticbox = new wxStaticBox(panelTop, -1, wxT("")); filterTreePane = new wxPanel(filterSplitter, wxID_ANY); MainFrame_Menu = new wxMenuBar(); fileMenu = new wxMenu(); fileMenu->Append(ID_FILE_OPEN, TRANS("&Open...\tCtrl+O"), TRANS("Open state file"), wxITEM_NORMAL); fileMenu->Append(ID_FILE_MERGE, TRANS("&Merge...\tCtrl+Shift+O"), TRANS("Merge other file"), wxITEM_NORMAL); recentFilesMenu=new wxMenu(); recentHistory->UseMenu(recentFilesMenu); fileMenu->AppendSubMenu(recentFilesMenu,TRANS("&Recent")); fileSave = fileMenu->Append(ID_FILE_SAVE, TRANS("&Save\tCtrl+S"), TRANS("Save state to file"), wxITEM_NORMAL); fileSave->Enable(false); fileMenu->Append(ID_FILE_SAVEAS, TRANS("Save &As...\tCtrl+Shift+S"), TRANS("Save current state to new file"), wxITEM_NORMAL); fileMenu->AppendSeparator(); fileExport = new wxMenu(); fileExport->Append(ID_FILE_EXPORT_PLOT, TRANS("&Plot...\tCtrl+P"), TRANS("Export Current Plot"), wxITEM_NORMAL); fileExport->Append(ID_FILE_EXPORT_IMAGE, TRANS("&Image...\tCtrl+I"), TRANS("Export Current 3D View"), wxITEM_NORMAL); fileExport->Append(ID_FILE_EXPORT_IONS, TRANS("Ion&s...\tCtrl+N"), TRANS("Export Ion Data"), wxITEM_NORMAL); fileExport->Append(ID_FILE_EXPORT_RANGE, TRANS("Ran&ges...\tCtrl+G"), TRANS("Export Range Data"), wxITEM_NORMAL); fileExport->Append(ID_FILE_EXPORT_FILTER_ANIMATION, TRANS("&Animate Filters...\tCtrl+T"), TRANS("Export Animated Filter"), wxITEM_NORMAL); fileExport->Append(ID_FILE_EXPORT_ANIMATION, TRANS("Ani&mate Camera...\tCtrl+M"), TRANS("Export Animated Camera"), wxITEM_NORMAL); fileExport->Append(ID_FILE_EXPORT_PACKAGE, TRANS("Pac&kage...\tCtrl+K"), TRANS("Export analysis package"), wxITEM_NORMAL); fileMenu->AppendSubMenu(fileExport,TRANS("&Export")); fileMenu->AppendSeparator(); #ifdef __APPLE__ fileMenu->Append(ID_FILE_EXIT, TRANS("&Quit\tCtrl+Q"), TRANS("Exit Program"), wxITEM_NORMAL); #else fileMenu->Append(ID_FILE_EXIT, TRANS("E&xit"), TRANS("Exit Program"), wxITEM_NORMAL); #endif MainFrame_Menu->Append(fileMenu, TRANS("&File")); wxMenu* wxglade_tmp_menu_1 = new wxMenu(); wxglade_tmp_menu_1->Append(ID_VIEW_BACKGROUND, TRANS("&Background Colour...\tCtrl+B"),TRANS("Change background colour")); wxglade_tmp_menu_1->AppendSeparator(); //Separator #ifndef __APPLE__ checkMenuControlPane= wxglade_tmp_menu_1->Append(ID_VIEW_CONTROL_PANE, TRANS("&Control Pane\tF2"), TRANS("Toggle left control pane"), wxITEM_CHECK); #else checkMenuControlPane= wxglade_tmp_menu_1->Append(ID_VIEW_CONTROL_PANE, TRANS("&Control Pane\tAlt+C"), TRANS("Toggle left control pane"), wxITEM_CHECK); #endif checkMenuControlPane->Check(); #ifndef __APPLE__ checkMenuRawDataPane= wxglade_tmp_menu_1->Append(ID_VIEW_RAW_DATA_PANE, TRANS("&Raw Data Pane\tF3"), TRANS("Toggle raw data pane (bottom)"), wxITEM_CHECK); #else checkMenuRawDataPane= wxglade_tmp_menu_1->Append(ID_VIEW_RAW_DATA_PANE, TRANS("&Raw Data Pane\tAlt+R"), TRANS("Toggle raw data pane (bottom)"), wxITEM_CHECK); #endif checkMenuRawDataPane->Check(); #ifndef __APPLE__ checkMenuSpectraList=wxglade_tmp_menu_1->Append(ID_VIEW_SPECTRA, TRANS("&Plot List\tF4"),TRANS("Toggle plot list"), wxITEM_CHECK); #else checkMenuSpectraList=wxglade_tmp_menu_1->Append(ID_VIEW_SPECTRA, TRANS("&Plot List\tAlt+P"),TRANS("Toggle plot list"), wxITEM_CHECK); #endif checkMenuSpectraList->Check(); wxglade_tmp_menu_1->AppendSeparator(); //Separator wxMenu* viewPlot= new wxMenu(); checkViewLegend=viewPlot->Append(ID_VIEW_PLOT_LEGEND,TRANS("&Legend\tCtrl+L"),TRANS("Toggle Legend display"),wxITEM_CHECK); checkViewLegend->Check(); wxglade_tmp_menu_1->AppendSubMenu(viewPlot,TRANS("P&lot...")); checkViewWorldAxis=wxglade_tmp_menu_1->Append(ID_VIEW_WORLDAXIS,TRANS("&Axis\tCtrl+Shift+I"),TRANS("Toggle World Axis display"),wxITEM_CHECK); checkViewWorldAxis->Check(); wxglade_tmp_menu_1->AppendSeparator(); //Separator #ifndef __APPLE__ menuViewFullscreen=wxglade_tmp_menu_1->Append(ID_VIEW_FULLSCREEN, TRANS("&Fullscreen mode\tF11"),TRANS("Next fullscreen mode: with toolbars")); #else menuViewFullscreen=wxglade_tmp_menu_1->Append(ID_VIEW_FULLSCREEN, TRANS("&Fullscreen mode\tCtrl+Shift+F"),TRANS("Next fullscreen mode: with toolbars")); #endif wxMenu *Edit = new wxMenu(); editUndoMenuItem = Edit->Append(ID_EDIT_UNDO,TRANS("&Undo\tCtrl+Z")); editUndoMenuItem->Enable(false); editRedoMenuItem = Edit->Append(ID_EDIT_REDO,TRANS("&Redo\tCtrl+Y")); editRedoMenuItem->Enable(false); Edit->AppendSeparator(); editRangeMenuItem=Edit->Append(ID_EDIT_RANGE,TRANS("&Range")); editRangeMenuItem->Enable(false); Edit->AppendSeparator(); Edit->Append(ID_EDIT_PREFERENCES,TRANS("&Preferences")); MainFrame_Menu->Append(Edit, TRANS("&Edit")); MainFrame_Menu->Append(wxglade_tmp_menu_1, TRANS("&View")); wxMenu* Help = new wxMenu(); Help->Append(ID_HELP_HELP, TRANS("&Help...\tCtrl+H"), TRANS("Show help files and documentation"), wxITEM_NORMAL); Help->Append(ID_HELP_CONTACT, TRANS("&Contact..."), TRANS("Open contact page"), wxITEM_NORMAL); Help->AppendSeparator(); Help->Append(ID_HELP_ABOUT, TRANS("&About..."), TRANS("Information about this program"), wxITEM_NORMAL); MainFrame_Menu->Append(Help, TRANS("&Help")); SetMenuBar(MainFrame_Menu); lblSettings = new wxStaticText(noteData, wxID_ANY, TRANS("Stashed Filters")); comboStash = new wxComboBox(noteData, ID_COMBO_STASH, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN|wxTE_PROCESS_ENTER|wxCB_SORT); btnStashManage = new wxButton(noteData, ID_BTN_STASH_MANAGE, wxT("..."),wxDefaultPosition,wxSize(28,28)); filteringLabel = new wxStaticText(noteData, wxID_ANY, TRANS("New Filters")); //Workaround for wx bug http://trac.wxwidgets.org/ticket/4398 //Combo box wont sort even when asked under wxGTK<3.0 // use sortedArrayString, rather than normal arraystring wxSortedArrayString filterNames; for(unsigned int ui=0;uicomboFilters_choices offset. filterMap[TRANS(str)] = ui; //Add to filter name wxArray wxString wxStrTrans = TRANS(str); filterNames.Add(wxStrTrans); } comboFilters = new wxComboBox(filterTreePane, ID_COMBO_FILTER, TRANS(ADD_FILTER_TEXT), wxDefaultPosition, wxDefaultSize, filterNames, wxCB_DROPDOWN|wxCB_SORT); comboFilters->Enable(false); treeFilters = new TextTreeCtrl(filterTreePane, ID_TREE_FILTERS, wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS|wxTR_NO_LINES|wxTR_HIDE_ROOT|wxTR_DEFAULT_STYLE|wxSUNKEN_BORDER|wxTR_EDIT_LABELS); vector msgs; msgs.push_back("No data loaded:"); msgs.push_back("open file, then add filters"); treeFilters->setMessages(msgs); checkAutoUpdate = new wxCheckBox(filterTreePane, ID_CHECK_AUTOUPDATE, TRANS("Auto Refresh")); refreshButton = new wxButton(filterTreePane, wxID_REFRESH, wxEmptyString); btnFilterTreeExpand= new wxButton(filterTreePane, ID_BTN_EXPAND, wxT("▼"),wxDefaultPosition,wxSize(30,30)); btnFilterTreeCollapse = new wxButton(filterTreePane, ID_BTN_COLLAPSE, wxT("▲"),wxDefaultPosition,wxSize(30,30)); btnFilterTreeErrs = new wxBitmapButton(filterTreePane,ID_BTN_FILTERTREE_ERRS,wxArtProvider::GetBitmap(wxART_INFORMATION),wxDefaultPosition,wxSize(40,40)); propGridLabel = new wxStaticText(filterPropertyPane, wxID_ANY, TRANS("Filter settings")); gridFilterPropGroup = new wxPropertyGrid(filterPropertyPane, ID_GRID_FILTER_PROPERTY,wxDefaultPosition,wxDefaultSize,PROPERTY_GRID_STYLE); gridFilterPropGroup->SetExtraStyle(PROPERTY_GRID_EXTRA_STYLE); labelCameraName = new wxStaticText(noteCamera, wxID_ANY, TRANS("Camera Name")); comboCamera = new wxComboBox(noteCamera, ID_COMBO_CAMERA, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN|wxTE_PROCESS_ENTER ); buttonRemoveCam = new wxButton(noteCamera, wxID_REMOVE, wxEmptyString); cameraNamePropertySepStaticLine = new wxStaticLine(noteCamera, wxID_ANY); gridCameraProperties = new wxPropertyGrid(noteCamera,ID_GRID_CAMERA_PROPERTY, wxDefaultPosition,wxDefaultSize,PROPERTY_GRID_STYLE); buttonAlignCamXPlus = new wxButton(noteCamera, ID_BUTTON_ALIGNCAM_XPLUS, "X+"); buttonAlignCamYPlus = new wxButton(noteCamera, ID_BUTTON_ALIGNCAM_YPLUS, "Y+"); buttonAlignCamZPlus = new wxButton(noteCamera, ID_BUTTON_ALIGNCAM_ZPLUS, "Z+"); buttonAlignCamXMinus = new wxButton(noteCamera, ID_BUTTON_ALIGNCAM_XMINUS, "X-"); buttonAlignCamYMinus = new wxButton(noteCamera, ID_BUTTON_ALIGNCAM_YMINUS, "Y-"); buttonAlignCamZMinus = new wxButton(noteCamera, ID_BUTTON_ALIGNCAM_ZMINUS, "Z-"); checkAlignCamResize = new wxCheckBox(noteCamera, wxID_ANY, _("Resize to Fit"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); #ifndef APPLE_EFFECTS_WORKAROUND checkPostProcessing = new wxCheckBox(notePost, ID_EFFECT_ENABLE, TRANS("3D Post-processing")); #endif checkFxCrop = new wxCheckBox(noteFxPanelCrop, ID_EFFECT_CROP_ENABLE, TRANS("Enable Cropping")); const wxString comboFxCropAxisOne_choices[] = { TRANS("x-y"), TRANS("x-z"), TRANS("y-x"), TRANS("y-z"), TRANS("z-x"), TRANS("z-y") }; comboFxCropAxisOne = new wxComboBox(noteFxPanelCrop, ID_EFFECT_CROP_AXISONE_COMBO, wxT(""), wxDefaultPosition, wxDefaultSize, 6, comboFxCropAxisOne_choices, wxCB_SIMPLE|wxCB_DROPDOWN|wxCB_READONLY); panelFxCropOne = new CropPanel(noteFxPanelCrop, ID_EFFECT_CROP_AXISONE_COMBO, wxDefaultPosition,wxDefaultSize,wxEXPAND); const wxString comboFxCropAxisTwo_choices[] = { TRANS("x-y"), TRANS("x-z"), TRANS("y-x"), TRANS("y-z"), TRANS("z-x"), TRANS("z-y") }; comboFxCropAxisTwo = new wxComboBox(noteFxPanelCrop, ID_EFFECT_CROP_AXISTWO_COMBO, wxT(""), wxDefaultPosition, wxDefaultSize, 6, comboFxCropAxisTwo_choices, wxCB_SIMPLE|wxCB_DROPDOWN|wxCB_READONLY); panelFxCropTwo = new CropPanel(noteFxPanelCrop, ID_EFFECT_CROP_AXISTWO_COMBO,wxDefaultPosition,wxDefaultSize,wxEXPAND); checkFxCropCameraFrame = new wxCheckBox(noteFxPanelCrop,ID_EFFECT_CROP_CHECK_COORDS,TRANS("Use camera coordinates")); labelFxCropDx = new wxStaticText(noteFxPanelCrop, wxID_ANY, TRANS("dX")); textFxCropDx = new wxTextCtrl(noteFxPanelCrop, ID_EFFECT_CROP_TEXT_DX, wxEmptyString); labelFxCropDy = new wxStaticText(noteFxPanelCrop, wxID_ANY, TRANS("dY")); textFxCropDy = new wxTextCtrl(noteFxPanelCrop, ID_EFFECT_CROP_TEXT_DY, wxEmptyString); labelFxCropDz = new wxStaticText(noteFxPanelCrop, wxID_ANY, TRANS("dZ")); textFxCropDz = new wxTextCtrl(noteFxPanelCrop, ID_EFFECT_CROP_TEXT_DZ, wxEmptyString); checkFxEnableStereo = new wxCheckBox(noteFxPanelStereo, ID_EFFECT_STEREO_ENABLE, TRANS("Enable Anaglyphic Stereo")); checkFxStereoLensFlip= new wxCheckBox(noteFxPanelStereo, ID_EFFECT_STEREO_LENSFLIP, TRANS("Flip Channels")); lblFxStereoMode = new wxStaticText(noteFxPanelStereo, wxID_ANY, TRANS("Anaglyph Mode"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE); const wxString comboFxStereoMode_choices[] = { TRANS("Red-Blue"), TRANS("Red-Green"), TRANS("Red-Cyan"), TRANS("Green-Magenta"), }; comboFxStereoMode = new wxComboBox(noteFxPanelStereo, ID_EFFECT_STEREO_COMBO, wxT(""), wxDefaultPosition, wxDefaultSize, 4, comboFxStereoMode_choices, wxCB_DROPDOWN|wxCB_SIMPLE|wxCB_READONLY); bitmapFxStereoGlasses = new wxStaticBitmap(noteFxPanelStereo, wxID_ANY, wxNullBitmap); labelFxStereoBaseline = new wxStaticText(noteFxPanelStereo, wxID_ANY, TRANS("Baseline Separation")); sliderFxStereoBaseline = new wxSlider(noteFxPanelStereo,ID_EFFECT_STEREO_BASELINE_SLIDER, 20, 0, 100); labelAppearance = new wxStaticText(noteTools, wxID_ANY, TRANS("Appearance")); checkAlphaBlend = new wxCheckBox(noteTools,ID_CHECK_ALPHA , TRANS("Smooth && translucent objects")); checkAlphaBlend->SetValue(true); checkLighting = new wxCheckBox(noteTools, ID_CHECK_LIGHTING, TRANS("3D lighting")); checkLighting->SetValue(true); static_line_1 = new wxStaticLine(noteTools, wxID_ANY); labelPerformance = new wxStaticText(noteTools, wxID_ANY, TRANS("Performance")); checkWeakRandom = new wxCheckBox(noteTools, ID_CHECK_WEAKRANDOM, TRANS("Fast and weak randomisation.")); checkWeakRandom->SetValue(true); checkLimitOutput = new wxCheckBox(noteTools, ID_CHECK_LIMIT_POINT_OUT, TRANS("Limit Output Pts")); std::string tmpStr; // stream_cast(tmpStr,visControl.getIonDisplayLimit()); textLimitOutput = new wxTextCtrl(noteTools, ID_TEXT_LIMIT_POINT_OUT, (tmpStr), wxDefaultPosition,wxDefaultSize,wxTE_PROCESS_ENTER ); checkCaching = new wxCheckBox(noteTools, ID_CHECK_CACHING, TRANS("Filter caching")); checkCaching->SetValue(true); labelMaxRamUsage = new wxStaticText(noteTools, wxID_ANY, TRANS("Max. Ram usage (%)"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT); spinCachePercent = new wxSpinCtrl(noteTools, ID_SPIN_CACHEPERCENT, wxT("50"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 100); panelView = new wxPanel(panelTop, ID_PANEL_VIEW); panelSpectra = new MathGLPane(splitterSpectra, wxID_ANY); plotListLabel = new wxStaticText(window_2_pane_2, wxID_ANY, TRANS("Plot List")); plotList = new wxListBox(window_2_pane_2, ID_LIST_PLOTS, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_MULTIPLE|wxLB_NEEDED_SB); gridRawData = new CopyGrid(noteRaw, ID_GRID_RAW_DATA); btnRawDataSave = new wxButton(noteRaw, wxID_SAVE, wxEmptyString); btnRawDataClip = new wxButton(noteRaw, wxID_COPY, wxEmptyString); textConsoleOut = new wxTextCtrl(noteDataViewConsole, wxID_ANY, wxEmptyString,wxDefaultPosition, wxDefaultSize,wxTE_MULTILINE|wxTE_READONLY); MainFrame_statusbar = CreateStatusBar(3, 0); set_properties(); do_layout(); #ifdef FIX_WXPROPGRID_16222 backCameraPropGrid=0; backFilterPropGrid=0; #endif //Disable post-processing #ifndef APPLE_EFFECTS_WORKAROUND checkPostProcessing->SetValue(false); noteFxPanelCrop->Enable(false); noteFxPanelStereo->Enable(false); #else //Disable effects panel stereo controls explicitly comboFxStereoMode->Enable(false); sliderFxStereoBaseline->Enable(false); checkFxStereoLensFlip->Enable(false); //Disable Crop controls explicitly checkFxCropCameraFrame->Enable(false); comboFxCropAxisOne->Enable(false); panelFxCropOne->Enable(false); comboFxCropAxisTwo->Enable(false); panelFxCropTwo->Enable(false); textFxCropDx->Enable(false); textFxCropDy->Enable(false); textFxCropDz->Enable(false); labelFxCropDx->Enable(false); labelFxCropDy->Enable(false); labelFxCropDz->Enable(false); #endif //Link the crop panels in the post section appropriately panelFxCropOne->link(panelFxCropTwo,CROP_LINK_BOTH); panelFxCropTwo->link(panelFxCropOne,CROP_LINK_BOTH); //Manually tuned splitter parameters. filterSplitter->SetMinimumPaneSize(180); filterSplitter->SetSashGravity(0.8); splitLeftRight->SetSashGravity(0.15); splitTopBottom->SetSashGravity(0.85); splitterSpectra->SetSashGravity(0.82); //Set callback for mathgl plot panelSpectra->registerUpdateHandler(this, (UpdateHandler)&MainWindowFrame::onPanelSpectraUpdate); //Inform top panel about timer and timeouts panelTop->setParentStatus(MainFrame_statusbar,statusTimer,STATUS_TIMER_DELAY); panelTop->clearCameraUpdates(); // end wxGlade if(configFile.read() == CONFIG_ERR_BADFILE) { textConsoleOut->AppendText(TRANS("Warning: Your configuration file appears to be invalid:\n")); wxString wxS = TRANS("\tConfig Load: "); wxS+= ( configFile.getErrMessage()); textConsoleOut->AppendText(wxS); } else restoreConfigDefaults(); //Try to set the window size to a nice size SetSize(getNiceWindowSize()); initedOK=true; // Set the limit value checkbox and text field with the // value obtained from the configuration file unsigned int ionLimit=visControl.getIonDisplayLimit(); checkLimitOutput->SetValue((ionLimit!=0)); if(ionLimit) { std::string sValue; stream_cast(sValue,visControl.getIonDisplayLimit()); textLimitOutput->SetValue(sValue); } #ifndef DISABLE_ONLINE_UPDATE wxDateTime datetime = wxDateTime::Today(); //Annoy the user, on average, every (% blah) days. const int CHECK_FREQUENCY=7; //Generate a pseudorandom number of fixed sequence LinearFeedbackShiftReg lfsr; //Set the period to 2^9 (power of 2 > weeksinyear*daysinweek) lfsr.setMaskPeriod(9); lfsr.setState(109); //Use a fixed random seed, to ensure that users will be in-sync for checking unsigned int offset = datetime.GetWeekOfYear()*7 + datetime.GetWeekDay(); while(offset--) lfsr.clock(); //Discard a whole bunch of entires //Everyone will get the same pseudorandom number on the same day. size_t pseudorandomVal=lfsr.clock(); ASSERT(pseudorandomVal); //shouldn't be zero, or LFSR is in bad state if( configFile.getAllowOnlineVersionCheck() && !(pseudorandomVal %CHECK_FREQUENCY)) { verCheckThread=new VersionCheckThread(this); verCheckThread->Create(); verCheckThread->Run(); } #endif } MainWindowFrame::~MainWindowFrame() { //Delete and stop all the timers. delete statusTimer; delete updateTimer; delete autoSaveTimer; delete progressTimer; //delete the file history pointer delete recentHistory; //Bindings did not get initialised, if glpane is not OK, // so abort, rather than disconnecting if(!glPanelOK) return; //wxwidgets can crash if objects are ->Connect-ed in // wxWindowBase::DestroyChildren(), so Disconnect before destructing comboCamera->Unbind(wxEVT_SET_FOCUS, &MainWindowFrame::OnComboCameraSetFocus, this); comboStash->Unbind(wxEVT_SET_FOCUS, &MainWindowFrame::OnComboStashSetFocus, this); noteDataView->Unbind(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, &MainWindowFrame::OnNoteDataView, this); treeFilters->Unbind(wxEVT_KEY_DOWN,&MainWindowFrame::OnTreeKeyDown,this); } void MainWindowFrame::finaliseStartup() { updateTimer->Start(UPDATE_TIMER_DELAY,wxTIMER_CONTINUOUS); autoSaveTimer->Start(AUTOSAVE_DELAY*1000,wxTIMER_CONTINUOUS); } BEGIN_EVENT_TABLE(MainWindowFrame, wxFrame) EVT_TIMER(ID_STATUS_TIMER,MainWindowFrame::OnStatusBarTimer) EVT_TIMER(ID_PROGRESS_TIMER,MainWindowFrame::OnProgressTimer) EVT_TIMER(ID_UPDATE_TIMER,MainWindowFrame::OnUpdateTimer) EVT_TIMER(ID_AUTOSAVE_TIMER,MainWindowFrame::OnAutosaveTimer) #ifdef FIX_WXPROPGRID_16222 EVT_IDLE(MainWindowFrame::OnIdle) #endif EVT_SPLITTER_UNSPLIT(ID_SPLIT_TOP_BOTTOM, MainWindowFrame::OnRawDataUnsplit) EVT_SPLITTER_UNSPLIT(ID_SPLIT_LEFTRIGHT, MainWindowFrame::OnControlUnsplit) EVT_SPLITTER_UNSPLIT(ID_SPLIT_SPECTRA, MainWindowFrame::OnSpectraUnsplit) EVT_SPLITTER_DCLICK(ID_SPLIT_FILTERPROP, MainWindowFrame::OnFilterPropDoubleClick) EVT_SPLITTER_DCLICK(ID_SPLIT_LEFTRIGHT, MainWindowFrame::OnControlUnsplit) EVT_SPLITTER_SASH_POS_CHANGED(ID_SPLIT_LEFTRIGHT, MainWindowFrame::OnControlSplitMove) EVT_SPLITTER_SASH_POS_CHANGED(ID_SPLIT_TOP_BOTTOM, MainWindowFrame::OnTopBottomSplitMove) EVT_SPLITTER_SASH_POS_CHANGED(ID_SPLIT_FILTERPROP, MainWindowFrame::OnFilterSplitMove) // begin wxGlade: MainWindowFrame::event_table EVT_MENU(ID_FILE_OPEN, MainWindowFrame::OnFileOpen) EVT_MENU(ID_FILE_MERGE, MainWindowFrame::OnFileMerge) EVT_MENU(ID_FILE_SAVE, MainWindowFrame::OnFileSave) EVT_MENU(ID_FILE_SAVEAS, MainWindowFrame::OnFileSaveAs) EVT_MENU(ID_FILE_EXPORT_PLOT, MainWindowFrame::OnFileExportPlot) EVT_MENU(ID_FILE_EXPORT_IMAGE, MainWindowFrame::OnFileExportImage) EVT_MENU(ID_FILE_EXPORT_IONS, MainWindowFrame::OnFileExportIons) EVT_MENU(ID_FILE_EXPORT_RANGE, MainWindowFrame::OnFileExportRange) EVT_MENU(ID_FILE_EXPORT_ANIMATION, MainWindowFrame::OnFileExportVideo) EVT_MENU(ID_FILE_EXPORT_FILTER_ANIMATION, MainWindowFrame::OnFileExportFilterVideo) EVT_MENU(ID_FILE_EXPORT_PACKAGE, MainWindowFrame::OnFileExportPackage) EVT_MENU(ID_FILE_EXIT, MainWindowFrame::OnFileExit) EVT_MENU(ID_EDIT_UNDO, MainWindowFrame::OnEditUndo) EVT_MENU(ID_EDIT_REDO, MainWindowFrame::OnEditRedo) EVT_MENU(ID_EDIT_RANGE, MainWindowFrame::OnEditRange) EVT_MENU(ID_EDIT_PREFERENCES, MainWindowFrame::OnEditPreferences) EVT_MENU(ID_VIEW_BACKGROUND, MainWindowFrame::OnViewBackground) EVT_MENU(ID_VIEW_CONTROL_PANE, MainWindowFrame::OnViewControlPane) EVT_MENU(ID_VIEW_RAW_DATA_PANE, MainWindowFrame::OnViewRawDataPane) EVT_MENU(ID_VIEW_SPECTRA, MainWindowFrame::OnViewSpectraList) EVT_MENU(ID_VIEW_PLOT_LEGEND, MainWindowFrame::OnViewPlotLegend) EVT_MENU(ID_VIEW_WORLDAXIS, MainWindowFrame::OnViewWorldAxis) EVT_MENU(ID_VIEW_FULLSCREEN, MainWindowFrame::OnViewFullscreen) EVT_MENU(ID_HELP_HELP, MainWindowFrame::OnHelpHelp) EVT_MENU(ID_HELP_CONTACT, MainWindowFrame::OnHelpContact) EVT_MENU(ID_HELP_ABOUT, MainWindowFrame::OnHelpAbout) EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, MainWindowFrame::OnRecentFile) EVT_BUTTON(wxID_REFRESH,MainWindowFrame::OnButtonRefresh) EVT_BUTTON(wxID_COPY,MainWindowFrame::OnButtonGridCopy) EVT_BUTTON(wxID_SAVE,MainWindowFrame::OnButtonGridSave) EVT_TEXT(ID_COMBO_STASH, MainWindowFrame::OnComboStashText) EVT_TEXT_ENTER(ID_COMBO_STASH, MainWindowFrame::OnComboStashEnter) EVT_COMBOBOX(ID_COMBO_STASH, MainWindowFrame::OnComboStash) EVT_TREE_END_DRAG(ID_TREE_FILTERS, MainWindowFrame::OnTreeEndDrag) EVT_TREE_SEL_CHANGING(ID_TREE_FILTERS, MainWindowFrame::OnTreeSelectionPreChange) EVT_TREE_SEL_CHANGED(ID_TREE_FILTERS, MainWindowFrame::OnTreeSelectionChange) EVT_TREE_DELETE_ITEM(ID_TREE_FILTERS, MainWindowFrame::OnTreeDeleteItem) EVT_TREE_BEGIN_DRAG(ID_TREE_FILTERS, MainWindowFrame::OnTreeBeginDrag) EVT_BUTTON(ID_BTN_EXPAND, MainWindowFrame::OnBtnExpandTree) EVT_BUTTON(ID_BTN_COLLAPSE, MainWindowFrame::OnBtnCollapseTree) EVT_BUTTON(ID_BTN_FILTERTREE_ERRS, MainWindowFrame::OnBtnFilterTreeErrs) EVT_PG_CHANGING(ID_GRID_FILTER_PROPERTY, MainWindowFrame::OnGridFilterPropertyChange) EVT_PG_CHANGING(ID_GRID_CAMERA_PROPERTY, MainWindowFrame::OnGridCameraPropertyChange) EVT_PG_DOUBLE_CLICK(ID_GRID_FILTER_PROPERTY, MainWindowFrame::OnGridFilterDClick) EVT_TEXT(ID_COMBO_CAMERA, MainWindowFrame::OnComboCameraText) EVT_TEXT_ENTER(ID_COMBO_CAMERA, MainWindowFrame::OnComboCameraEnter) EVT_BUTTON(wxID_REMOVE, MainWindowFrame::OnButtonRemoveCam) EVT_BUTTON(ID_BUTTON_ALIGNCAM_XPLUS, MainWindowFrame::OnButtonAlignCameraXPlus) EVT_BUTTON(ID_BUTTON_ALIGNCAM_YPLUS, MainWindowFrame::OnButtonAlignCameraYPlus) EVT_BUTTON(ID_BUTTON_ALIGNCAM_ZPLUS, MainWindowFrame::OnButtonAlignCameraZPlus) EVT_BUTTON(ID_BUTTON_ALIGNCAM_XMINUS, MainWindowFrame::OnButtonAlignCameraXMinus) EVT_BUTTON(ID_BUTTON_ALIGNCAM_YMINUS, MainWindowFrame::OnButtonAlignCameraYMinus) EVT_BUTTON(ID_BUTTON_ALIGNCAM_ZMINUS, MainWindowFrame::OnButtonAlignCameraZMinus) EVT_CHECKBOX(ID_CHECK_ALPHA, MainWindowFrame::OnCheckAlpha) EVT_CHECKBOX(ID_CHECK_LIGHTING, MainWindowFrame::OnCheckLighting) EVT_CHECKBOX(ID_CHECK_CACHING, MainWindowFrame::OnCheckCacheEnable) EVT_CHECKBOX(ID_CHECK_WEAKRANDOM, MainWindowFrame::OnCheckWeakRandom) EVT_SPINCTRL(ID_SPIN_CACHEPERCENT, MainWindowFrame::OnCacheRamUsageSpin) EVT_COMBOBOX(ID_COMBO_CAMERA, MainWindowFrame::OnComboCamera) EVT_COMBOBOX(ID_COMBO_FILTER, MainWindowFrame::OnComboFilter) EVT_TEXT(ID_COMBO_FILTER, MainWindowFrame::OnComboFilterText) EVT_BUTTON(ID_BTN_STASH_MANAGE, MainWindowFrame::OnButtonStashDialog) EVT_LISTBOX(ID_LIST_PLOTS, MainWindowFrame::OnSpectraListbox) EVT_CLOSE(MainWindowFrame::OnClose) EVT_TREE_END_LABEL_EDIT(ID_TREE_FILTERS,MainWindowFrame::OnTreeEndLabelEdit) EVT_TREE_BEGIN_LABEL_EDIT(ID_TREE_FILTERS,MainWindowFrame::OnTreeBeginLabelEdit) //Post-processing stuff EVT_CHECKBOX(ID_EFFECT_ENABLE, MainWindowFrame::OnCheckPostProcess) EVT_CHECKBOX(ID_EFFECT_CROP_ENABLE, MainWindowFrame::OnFxCropCheck) EVT_CHECKBOX(ID_EFFECT_CROP_CHECK_COORDS, MainWindowFrame::OnFxCropCamFrameCheck) EVT_COMBOBOX(ID_EFFECT_CROP_AXISONE_COMBO, MainWindowFrame::OnFxCropAxisOne) EVT_COMBOBOX(ID_EFFECT_CROP_AXISTWO_COMBO, MainWindowFrame::OnFxCropAxisTwo) EVT_CHECKBOX(ID_EFFECT_STEREO_ENABLE, MainWindowFrame::OnFxStereoEnable) EVT_CHECKBOX(ID_EFFECT_STEREO_LENSFLIP, MainWindowFrame::OnFxStereoLensFlip) EVT_COMBOBOX(ID_EFFECT_STEREO_COMBO, MainWindowFrame::OnFxStereoCombo) EVT_COMMAND_SCROLL(ID_EFFECT_STEREO_BASELINE_SLIDER, MainWindowFrame::OnFxStereoBaseline) EVT_TEXT(ID_TEXT_LIMIT_POINT_OUT, MainWindowFrame::OnTextLimitOutput) EVT_TEXT_ENTER(ID_TEXT_LIMIT_POINT_OUT, MainWindowFrame::OnTextLimitOutputEnter) EVT_CHECKBOX(ID_CHECK_LIMIT_POINT_OUT, MainWindowFrame::OnCheckLimitOutput) EVT_COMMAND(wxID_ANY, RemoteUpdateAvailEvent, MainWindowFrame::OnCheckUpdatesThread) EVT_COMMAND(wxID_ANY, RefreshCompleteEvent, MainWindowFrame::OnFinishRefreshThread) // end wxGlade END_EVENT_TABLE(); RefreshThread::RefreshThread(wxWindow *target,RefreshController *rC) : wxThread(wxTHREAD_JOINABLE) { ASSERT(rC); refreshControl=rC; targetWindow=target; } RefreshThread::~RefreshThread() { } void *RefreshThread::Entry() { wxCommandEvent event( RefreshCompleteEvent); event.SetInt(0); //pack the unsigned int into the event unsigned int i=refreshControl->refresh(); event.SetInt((int)i); wxPostEvent(targetWindow,event); return 0; } #ifdef FIX_WXPROPGRID_16222 void MainWindowFrame::OnIdle(wxIdleEvent &evt) { if(backFilterPropGrid) { delete backFilterPropGrid; backFilterPropGrid=0; } if(backCameraPropGrid) { delete backCameraPropGrid; backCameraPropGrid=0; } } #endif unsigned int MainWindowFrame::guessFileType(const std::string &dataFile) { //Split the filename into chunks: path, volume, name and extension //the format of this is OS dependant, but wxWidgets can deal with this. wxFileName fname; wxString volume,path,name,ext; bool hasExt; fname.SplitPath((dataFile),&volume, &path,&name,&ext, &hasExt); //Test the extension to determine what we will do //TODO: This is really lazy, and I should use something like libmagic. std::string extStr; extStr=lowercase(stlStr(ext)); if( extStr == std::string("xml")) return FILE_OPEN_TYPE_XML; if( extStr == std::string("txt")) return FILE_OPEN_TYPE_TEXT; if( extStr == std::string("pos")) return FILE_OPEN_TYPE_POS; if( extStr == std::string("ato")) return FILE_OPEN_TYPE_LAWATAP_ATO; return FILE_OPEN_TYPE_UNKNOWN; } bool MainWindowFrame::getTreeFilterId(const wxTreeItemId &tId, size_t &filterId) const { if(!tId.IsOk()) return false; //Disallow obtaining the filterID for the root item if(tId == treeFilters->GetRootItem()) return false; wxTreeItemData *tData=treeFilters->GetItemData(tId); filterId = ((wxTreeUint *)tData)->value; return true; } void MainWindowFrame::checkAskSaveState() { if(visControl.stateIsModified()) { wxMessageDialog wxD (this, TRANS("Current state has not been saved, would you like to save it now?") ,TRANS("State changed"),wxYES_NO|wxICON_QUESTION|wxYES_DEFAULT ); wxD.SetAffirmativeId(wxID_YES); wxD.SetEscapeId(wxID_NO); if ( wxD.ShowModal()== wxID_YES) { wxCommandEvent event; OnFileSave(event); } } } void MainWindowFrame::OnFileOpen(wxCommandEvent &event) { //Do not allow any action if a scene update is in progress ASSERT(!refreshThreadActive()); vector > validTypes; validTypes.push_back( make_pair(TRANS("Readable files (*.xml, *.pos, *.txt,*.csv, *.ato)"), "*.xml;*XML;*.pos;*,POS;*.txt;*.TXT;*.csv;*.CSV;*.ato;*.ATO") ); validTypes.push_back( make_pair(TRANS("XML State File (*.xml)"),"*.xml;*.XML")); validTypes.push_back( make_pair(TRANS("POS File (*.pos)"),"*.pos;*.POS")); validTypes.push_back( make_pair(TRANS("LAWATAP ATO File (*.ato)"),"*.ato;*.ATO")); validTypes.push_back( make_pair(TRANS("Text File (*.txt, *.csv)"),"*.csv;*.txt;*.CSV;*.TXT")); validTypes.push_back( make_pair(TRANS("All Files (*)"),"*")); std::string totalStr; totalStr=validTypes[0].first + std::string("|") + validTypes[0].second; for(unsigned int ui=1;uiClear(); //Get vis controller to update tree control to match internal // structure. Retain tree selection & visibility if we currently // have a valid selection size_t filterId; if(getTreeFilterId(treeFilters->GetSelection(),filterId)) { visControl.setWxTreeFilterViewPersistence(filterId); } //Load the file if(!loadFile(wxF.GetPath())) { //If the load failed, do not try to set the // selection & visibility visControl.clearTreeFilterViewPersistence(); return; } std::string tmp; tmp = stlStr(wxF.GetPath()); configFile.addRecentFile(tmp); //Update the "recent files" menu recentHistory->AddFileToHistory(wxF.GetPath()); } void MainWindowFrame::OnFileMerge(wxCommandEvent &event) { ASSERT(!refreshThreadActive()); //Load a file, either a state file, or a new pos file, or text file wxFileDialog wxF(this,TRANS("Select Data or State File..."), wxT(""), wxT(""),TRANS("3Depict file (*.xml, *.pos,*.txt)|*.xml;*.pos;*.txt|POS File (*.pos)|*.pos|XML State File (*.xml)|*.xml|All Files (*)|*"),wxFD_OPEN|wxFD_FILE_MUST_EXIST); //Show the file dialog if( (wxF.ShowModal() == wxID_CANCEL)) return; textConsoleOut->Clear(); //Load the file if(!loadFile(wxF.GetPath(),true)) return; statusMessage(TRANS("Merged file."),MESSAGE_INFO); setSaveStatus(); } void MainWindowFrame::OnDropFiles(const wxArrayString &files, int x, int y) { //We can't alter the filter state if we are refreshing if(refreshThreadActive()) return; textConsoleOut->Clear(); wxMouseState wxm = wxGetMouseState(); //Try opening the files as range (if ext. agrees) // or as bool loaded =false; bool rangeLoaded=false; for(unsigned int ui=0;uiGetCount()) { //Check the extension to see if it should be a range file wxFileName fileName; fileName.Assign(files[ui]); ext=stlStr(fileName.GetExt()); for(size_t uj=0;ujGetSelection(),filterId)) return; RangeFile rng; string s; s=stlStr(files[ui]); if(rng.openGuessFormat(s.c_str())) { rangeOK=true; rangeLoaded=true; //Load rangefile & construct filter RangeFileFilter *f; f=(RangeFileFilter *)configFile.getDefaultFilter(FILTER_TYPE_RANGEFILE); //Copy across the range data f->setRangeData(rng); f->setRangeFilename(s.c_str()); //Add the filter, using the seelcted // item as the parent visControl.state.treeState.addFilter(f,false,filterId); //update the tree control updateWxTreeCtrl(treeFilters); } else { //OK, we need to let the user know something went wrong. //Less annoying than a dialog, but the statusbar is going //to be useless, as it will be overwritten during the subsequent //refresh (when we treat this as a pos file). //FIXME: Something needs to go here... A queue for messages? } } } //--- //If it is a pos file, just handle it by trying to load if(!rangeOK) { //If command down, load first file using this, //then merge the rest if(!loaded) loaded=loadFile(files[ui],!wxm.CmdDown()); else loaded=loadFile(files[ui],true); } } if(!wxm.CmdDown() && files.Count()) { #ifdef __APPLE__ statusMessage(TRANS("Tip: You can use ⌘ (command) to merge"),MESSAGE_HINT); #else statusMessage(TRANS("Tip: You can use ctrl to merge"),MESSAGE_HINT); #endif } if(loaded || rangeLoaded) doSceneUpdate(); } bool MainWindowFrame::loadFile(const wxString &fileStr, bool merge,bool noUpdate) { ASSERT(!refreshThreadActive()); //Don't try to alter viscontrol if we are refreshing. That would be bad. std::string dataFile = stlStr(fileStr); unsigned int fileType=guessFileType(dataFile); if(fileType == FILE_OPEN_TYPE_XML) { std::stringstream ss; //Load the file as if it were an XML file if(!visControl.state.load(dataFile.c_str(),merge,ss)) { std::string str; str=ss.str(); textConsoleOut->AppendText((str)); //Note that the parent window must be NULL // if the parent window is not visible (eg autosave startup) wxWindow *parentWin=NULL; if(this->IsShown()) parentWin=this; wxErrMsg(parentWin,TRANS("Load error"), TRANS("Error loading state file.\nSee console for more info.")); return false; } if(visControl.state.treeState.getTreeRef().hasHazardousContents()) { wxMessageDialog wxD(this, TRANS("This state file contains filters that can be unsafe to run\nDo you wish to remove these before continuing?.") ,TRANS("Security warning"),wxYES_NO|wxICON_WARNING|wxYES_DEFAULT ); wxD.SetAffirmativeId(wxID_YES); wxD.SetEscapeId(wxID_NO); if(wxD.ShowModal()!= wxID_NO) visControl.state.treeState.stripHazardousContents(); } //Update the background colour if(panelTop->isInited()) panelTop->updateClearColour(); checkViewWorldAxis->Check(visControl.state.getWorldAxisMode()); visControl.scene.setWorldAxisVisible(visControl.state.getWorldAxisMode()); visControl.updateCameraComboBox(comboCamera); //Only update the camera grid if we have a valid uniqueID if(visControl.state.getNumCams() > 1) { //set the active camera visControl.setActiveCam(visControl.state.getActiveCam()); //Use the active cam to update the grid. visControl.updateCameraPropGrid(gridCameraProperties, visControl.state.getActiveCam()); } else { //Reset the camera property fields & combo box gridCameraProperties->Clear(); comboCamera->SetValue((TRANS(cameraIntroString))); } //reset the stash combo box comboStash->SetValue((TRANS(stashIntroString))); //Check to see if we have any effects that we need to enable vector effs; visControl.scene.getEffects(effs); if(!effs.empty()) { //OK, we have some effects; we will need to update the UI updateFxUI(effs); } fileSave->Enable(true); //Update the stash combo box visControl.updateStashComboBox(comboStash); gridFilterPropGroup->Clear(); } else { FilterTree fTree; Filter *posFilter; posFilter= configFile.getDefaultFilter(FILTER_TYPE_DATALOAD); //Bastardise the default settings such that it knows to use the correct // file type, based upon file extension unsigned int fileMode; if(fileType == FILE_OPEN_TYPE_TEXT) fileMode=DATALOAD_TEXT_FILE; else if(fileType == FILE_OPEN_TYPE_LAWATAP_ATO) fileMode=DATALOAD_LAWATAP_ATO_FILE; else fileMode=DATALOAD_FLOAT_FILE; ((DataLoadFilter*)posFilter)->setFileMode(fileMode); ((DataLoadFilter*)posFilter)->setFilename(dataFile); //Remember the filter that we wish to keep visible after altering // tree control. // adding filters will invalidate IDs, so this needs to be set now size_t filterId; if(getTreeFilterId(treeFilters->GetSelection(),filterId)) visControl.setWxTreeFilterViewPersistence(filterId); //Append a new filter to the filter tree fTree.addFilter(posFilter,0); visControl.state.treeState.addFilterTree(fTree,true,0); } updateWxTreeCtrl(treeFilters); if(!noUpdate) return doSceneUpdate(true); return true; } void MainWindowFrame::OnRecentFile(wxCommandEvent &event) { if(refreshThreadActive()) return; wxString f(recentHistory->GetHistoryFile(event.GetId() - wxID_FILE1)); if (!f.empty()) { textConsoleOut->Clear(); //Remember the filter that we wish to keep visible after altering // tree control. // adding filters will invalidate IDs, so this needs to be set now size_t filterId; if(getTreeFilterId(treeFilters->GetSelection(),filterId)) visControl.setWxTreeFilterViewPersistence(filterId); bool loadOK=false; if(!wxFileExists(f)) statusMessage("File does not exist",MESSAGE_ERROR); else { //See if the user wants to save the current state if(guessFileType(stlStr(f)) == FILE_OPEN_TYPE_XML) checkAskSaveState(); //start the loading sequence. Note that this is done // in a rear thread, so we cannot be totally sure it worked yet loadOK=loadFile(f); } if(!loadOK) { //Didn't load? We don't want it. visControl.clearTreeFilterViewPersistence(); recentHistory->RemoveFileFromHistory(event.GetId()-wxID_FILE1); configFile.removeRecentFile(stlStr(f)); } setSaveStatus(); } } void MainWindowFrame::OnFileSave(wxCommandEvent &event) { std::string saveFilename=visControl.state.getFilename(); //Save menu should not be selectable if there is no file to save to. ASSERT(!saveFilename.empty()); //If the file does not exist, use saveas instead if( saveFilename.empty() || !wxFileExists((saveFilename))) { OnFileSaveAs(event); return; } std::map dummyMap; //Try to save the viscontrol state if(!visControl.state.save(saveFilename.c_str(),dummyMap,false)) { wxErrMsg(this,TRANS("Save error"),TRANS("Unable to save. Check output destination can be written to.")); } else { //Update the recent files, and the menu. configFile.addRecentFile(saveFilename); recentHistory->AddFileToHistory((saveFilename)); std::string tmpStr; tmpStr= std::string("Saved state: ") + saveFilename; statusMessage(tmpStr.c_str(),MESSAGE_INFO); } setSaveStatus(); } void MainWindowFrame::OnFileExportPlot(wxCommandEvent &event) { if(!panelSpectra->getNumVisible()) { wxErrMsg(this,TRANS("Unable to save"), TRANS("No plot available. Please create a plot before exporting.")); return; } wxFileDialog wxF(this,TRANS("Save plot..."), wxT(""), wxT(""),TRANS("By Extension (svg,png)|*.svg;*.png|Scalable Vector Graphics File (*.svg)|*.svg|PNG File (*.png)|*.png|All Files (*)|*"),wxFD_SAVE); if( wxF.ShowModal() == wxID_CANCEL) return; std::string dataFile = stlStr(wxF.GetPath()); //Split the filename into chunks: path, volume, name and extension //the format of this is OS dependant, but wxWidgets can deal with this. std::string strExt; { wxFileName fname; wxString volume,path,name,ext; bool hasExt; fname.SplitPath(wxF.GetPath(),&volume, &path,&name,&ext, &hasExt); strExt=stlStr(ext); strExt = lowercase(strExt); } unsigned int errCode; enum { EXT_SVG, EXT_PNG, EXT_NONE }; const char *extensions[] = {"png","svg",""}; size_t extId = EXT_NONE; for(size_t ui=0;uisaveSVG(dataFile); else if (strExt == "png") { //Show a resolution chooser dialog ResolutionDialog d(this,wxID_ANY,TRANS("Choose resolution")); int plotW,plotH; panelSpectra->GetClientSize(&plotW,&plotH); d.setRes(plotW,plotH,true); if(d.ShowModal() == wxID_CANCEL) return; errCode=panelSpectra->savePNG(dataFile,d.getWidth(),d.getHeight()); } else { ASSERT(false); wxErrMsg(this,TRANS("Unable to save"), TRANS("Unknown file extension. Please use \"svg\" or \"png\"")); return; } //Did we save OK? If not, let the user know if(errCode) { wxErrMsg(this,TRANS("Save error"),panelSpectra->getErrString(errCode)); } else { dataFile=std::string(TRANS("Saved plot: ")) + dataFile; statusMessage(dataFile.c_str(),MESSAGE_INFO); } } void MainWindowFrame::OnFileExportImage(wxCommandEvent &event) { wxFileDialog wxF(this,TRANS("Save Image..."), wxT(""), wxT(""),TRANS("PNG File (*.png)|*.png|All Files (*)|*"),wxFD_SAVE); std::string dataFile; do { if( (wxF.ShowModal() == wxID_CANCEL)) return; dataFile=stlStr(wxF.GetPath()); //ask user for confirm if file exists if(!wxFileExists(wxF.GetPath())) break; wxMessageDialog wxMd(this,TRANS("File already exists. Overwrite?"), TRANS("Overwrite?"),wxYES_NO|wxICON_WARNING); if( wxMd.ShowModal() == wxID_YES) break; } while(true); //Show a resolution chooser dialog ResolutionDialog d(this,wxID_ANY,TRANS("Choose resolution")); //Use the current res as the dialog default int w,h; panelTop->GetClientSize(&w,&h); d.setRes(w,h,true); //Show dialog, skip save if user cancels dialog if(d.ShowModal() == wxID_CANCEL) return; bool saveOK=panelTop->saveImage(d.getWidth(),d.getHeight(),dataFile.c_str()); if(!saveOK) { wxErrMsg(this,TRANS("Save error"), TRANS("Unable to save. Check output destination can be written to.")); } else { dataFile=std::string(TRANS("Saved 3D View :")) + dataFile; statusMessage(dataFile.c_str(),MESSAGE_INFO); } } void MainWindowFrame::OnFileExportVideo(wxCommandEvent &event) { wxFileDialog wxF(this,TRANS("Save Image..."), wxT(""), wxT(""),TRANS("PNG File (*.png)|*.png|All Files (*)|*"),wxFD_SAVE); if( (wxF.ShowModal() == wxID_CANCEL)) return; //Show a resolution chooser dialog ResolutionDialog d(this,wxID_ANY,TRANS("Choose resolution")); //Use the current res as the dialog default int w,h; panelTop->GetClientSize(&w,&h); d.setRes(w,h,true); //Show dialog, skip save if user cancels dialo if(d.ShowModal() == wxID_CANCEL) return; if((d.getWidth() < w && d.getHeight() > h) || (d.getWidth() > w && d.getHeight() < h) ) { wxErrMsg(this, TRANS("Program limitation"), TRANS("Limitation on the screenshot dimension; please ensure that both width and height exceed the initial values,\n or that they are smaller than the initial values.\n If this bothers, please submit a bug.")) ; return; } wxFileName fname; wxString volume,path,name,ext; bool hasExt; fname.SplitPath(wxF.GetPath(),&volume, &path,&name,&ext, &hasExt); if(!hasExt) ext=wxT("png"); ///TODO: This is nasty and hackish. We should present a nice, //well laid out dialog for frame count (show angular increment) wxTextEntryDialog teD(this,TRANS("Number of frames"),TRANS("Frame count"), wxT("180"),(long int)wxOK|wxCANCEL); unsigned int numFrames=0; std::string strTmp; do { if(teD.ShowModal() == wxID_CANCEL) return; strTmp = stlStr(teD.GetValue()); }while(stream_cast(numFrames,strTmp)); bool saveOK=panelTop->saveImageSequence(d.getWidth(),d.getHeight(), numFrames,path,name,ext); if(!saveOK) { wxErrMsg(this,TRANS("Save error"),TRANS("Unable to save. Check output destination can be written to.")); } else { std::string dataFile = stlStr(wxF.GetPath()); dataFile=std::string(TRANS("Saved 3D View :")) + dataFile; statusMessage(dataFile.c_str(),MESSAGE_INFO); } //Force a paint update for the scene, to ensure aspect ratio information is preserved wxPaintEvent ptEvent; wxPostEvent(panelTop,ptEvent); } void MainWindowFrame::setLockUI(bool locking=true, unsigned int lockMode=WINDOW_LOCK_REFRESH) { unsigned int nUndo,nRedo; nUndo=visControl.state.treeState.getUndoSize(); nRedo=visControl.state.treeState.getRedoSize(); switch(lockMode) { case WINDOW_LOCK_REFRESH: { unsigned int nFilters; nFilters = visControl.state.treeState.size(); comboFilters->Enable(!locking && nFilters); if(locking) refreshButton->SetLabel(TRANS("Abo&rt")); else refreshButton->SetLabel(TRANS("&Refresh")); refreshButton->Enable(nFilters); btnFilterTreeErrs->Enable(!locking); treeFilters->Enable(!locking); editUndoMenuItem->Enable(!locking && nUndo); editRedoMenuItem->Enable(!locking && nRedo); fileMenu->Enable(ID_FILE_OPEN,!locking); fileMenu->Enable(ID_FILE_MERGE,!locking); gridFilterPropGroup->Enable(!locking); comboStash->Enable(!locking); //Locking of the tools pane checkWeakRandom->Enable(!locking); checkCaching->Enable(!locking); spinCachePercent->Enable(!locking); textLimitOutput->Enable(!locking); checkLimitOutput->Enable(!locking); fileMenu->Enable(ID_FILE_OPEN,!locking); fileMenu->Enable(ID_FILE_MERGE,!locking); //Save menu needs to be handled specially in the case of an unlock // as determining if it can be enabled needs work if(!locking) fileMenu->Enable(ID_FILE_SAVE,false); else setSaveStatus(); fileMenu->Enable(ID_FILE_SAVEAS,!locking); for(size_t ui=0;uiGetMenuItemCount();ui++) { wxMenuItem *m; m=recentFilesMenu->FindItemByPosition(ui); m->Enable(!locking); } fileExport->Enable(ID_FILE_EXPORT_ANIMATION,!locking); fileExport->Enable(ID_FILE_EXPORT_FILTER_ANIMATION,!locking); fileExport->Enable(ID_FILE_EXPORT_PACKAGE,!locking); panelSpectra->limitInteraction(locking); break; } case WINDOW_LOCK_PROPEDIT: { comboFilters->Enable(!locking); refreshButton->Enable(!locking); btnFilterTreeErrs->Enable(!locking); comboStash->Enable(!locking); treeFilters->Enable(!locking); editUndoMenuItem->Enable(!locking && nUndo); editRedoMenuItem->Enable(!locking && nRedo); fileMenu->Enable(ID_FILE_OPEN,!locking); fileMenu->Enable(ID_FILE_MERGE,!locking); fileMenu->Enable(ID_FILE_SAVEAS,!locking); //Save menu needs to be handled specially in the case of an unlock // as determining if it can be enabled needs work if(!locking) fileMenu->Enable(ID_FILE_SAVE,false); else setSaveStatus(); //Lock/unlock all the recent files entries for(size_t ui=0;uiGetMenuItemCount();ui++) { wxMenuItem *m; m=recentFilesMenu->FindItemByPosition(ui); m->Enable(!locking); } fileExport->Enable(ID_FILE_EXPORT_ANIMATION,!locking); fileExport->Enable(ID_FILE_EXPORT_FILTER_ANIMATION,!locking); fileExport->Enable(ID_FILE_EXPORT_PACKAGE,!locking); //Locking of the tools pane checkWeakRandom->Enable(!locking); checkCaching->Enable(!locking); checkLimitOutput->Enable(!locking); textLimitOutput->Enable(!locking); spinCachePercent->Enable(!locking); //Lock panel spectra, so we cannot alter things like ranges panelSpectra->limitInteraction(locking); break; } default: ASSERT(false); } } void MainWindowFrame::OnFileExportFilterVideo(wxCommandEvent &event) { //Don't let the user run the animation dialog if they have // no filters open if(!visControl.state.treeState.size()) { statusMessage(TRANS("Cannot animate with no filters.")); return; } //Cannot proceed until refresh is completed or aborted if(refreshThreadActive()) return; int w, h; panelTop->GetClientSize(&w,&h); ExportAnimationDialog *exportDialog = new ExportAnimationDialog(this, wxID_ANY, wxEmptyString); exportDialog->setDefImSize(w,h); //FIXME: Tree ownership is very complex, making code here brittle // - order of operations for initing the export dialog is important // Getting/Setting animation state requires the filtertree to // be under exportDialog's control FilterTree treeWithCache; //Steal the filter tree, and give the pointer to the export dialog // viscontrol now has an empty tree, so watch out. visControl.state.treeState.swapFilterTree(treeWithCache); //supply a copy of the filter tree (w/o cache) to export dialog exportDialog->setTree(treeWithCache); //Set the saved animation properties, as needed { PropertyAnimator p; vector > pathMap; visControl.state.getAnimationState(p,pathMap); if(p.getMaxFrame()) { exportDialog->setAnimationState(p,pathMap); } } exportDialog->prepare(); //Display Animate dialog bool dialogErr; dialogErr=(exportDialog->ShowModal() == wxID_CANCEL); //even if user aborts, record the state of the animation { PropertyAnimator propAnim; vector > pathMap; exportDialog->getAnimationState(propAnim,pathMap); //restore the cache to viscontrol visControl.state.treeState.swapFilterTree(treeWithCache); visControl.state.setAnimationState(propAnim,pathMap); } //Stop processing here if user aborted if(dialogErr) { exportDialog->Destroy(); return; } //Stop timer based events, and lock UI //-- updateTimer->Stop(); autoSaveTimer->Stop(); //-- size_t numFrames; numFrames=exportDialog->getNumFrames(); //Display modal progress dialog //-- wxProgressDialog *prog; prog = new wxProgressDialog(TRANS("Animating"), TRANS("Performing refresh"),numFrames,this,wxPD_CAN_ABORT|wxPD_APP_MODAL ); prog->Show(); //-- currentlyUpdatingScene=true; string errMessage; bool needAbortDlg=false; //Modify the tree. for(size_t ui=0;uiUpdate(ui)) break; bool needsUp; //steal tree, including caches, from viscontrol visControl.state.treeState.swapFilterTree(treeWithCache); //Modify the tree, as needed, altering cached data if(!exportDialog->getModifiedTree(ui,treeWithCache,needsUp)) { std::string s; stream_cast(ui,s); errMessage = TRANS("Filter property change failed") + s; needAbortDlg=true; break; } //restore tree to viscontrol visControl.state.treeState.swapFilterTree(treeWithCache); //Perform update if(needsUp || !exportDialog->wantsOnlyChanges()) { typedef std::vector STREAMOUT; std::list outData; std::list outStreams; std::vector > cMessages; ProgressData progData; //First try to refresh the tree if(visControl.state.treeState.refresh(outData,cMessages,progData)) { std::string tmpStr; stream_cast(tmpStr,ui); errMessage=TRANS("Refresh failed on frame :") + tmpStr; needAbortDlg=true; break; } //Now obtain the output streams as a flat list for(list::iterator it=outData.begin(); it!=outData.end();++it) outStreams.push_back(it->second); try { if(exportDialog->wantsImages()) { // Update the scene contents. visControl.updateScene(outStreams,false); panelTop->forceRedraw(); //Attempt to save the image to disk if(!panelTop->saveImage(exportDialog->getImageWidth(), exportDialog->getImageHeight(), exportDialog->getFilename(ui,FILENAME_IMAGE).c_str(),false,false)) { pair errMsg; string tmpStr; stream_cast(tmpStr,ui); errMsg.first=TRANS("Unable to save"); errMsg.second = TRANS("Image save failed for frame "); errMsg.second+=tmpStr; throw errMsg; } } if(exportDialog->wantsIons()) { //merge all the output streams into one vector mergedStreams; for(list::iterator it=outStreams.begin(); it!=outStreams.end();++it) { size_t origSize; origSize=mergedStreams.size(); mergedStreams.resize( origSize+ it->size()); std::copy(it->begin(),it->end(),mergedStreams.begin() +origSize); } if(IonStreamData::exportStreams(mergedStreams,exportDialog->getFilename(ui,FILENAME_IONS))) { pair errMsg; string tmpStr; stream_cast(tmpStr,ui); errMsg.first=TRANS("Ion save failed"); errMsg.second = TRANS("Unable to save ions for frame "); errMsg.second+=tmpStr; throw errMsg; } } if(exportDialog->wantsPlots()) { size_t plotNumber=0; //Save each plot by name, where possible for(list::iterator it=outStreams.begin(); it!=outStreams.end();++it) { for(size_t uj=0;ujsize();uj++) { //Skip non plot output if((*it)[uj]->getStreamType() != STREAM_TYPE_PLOT ) continue; //Save the plot output std::string filename; const PlotStreamData* p = (const PlotStreamData*)(*it)[uj]; filename = exportDialog->getFilename(ui,FILENAME_PLOT,plotNumber); plotNumber++; if(!p->save(filename.c_str())) { pair errMsg; string tmpStr; stream_cast(tmpStr,ui); errMsg.first=TRANS("Plot save failed"); errMsg.second = TRANS("Unable to save plot or frame "); errMsg.second+=tmpStr; throw errMsg; } } } } if(exportDialog->wantsRanges()) { size_t rangeNum=0; //TODO: Integrate enums for rangefiles? map rangeEnumMap; rangeEnumMap[RANGE_OAKRIDGE] = RANGE_FORMAT_ORNL; rangeEnumMap[RANGE_AMETEK_RRNG] = RANGE_FORMAT_RRNG; rangeEnumMap[RANGE_AMETEK_ENV] = RANGE_FORMAT_ENV; //Save each range for(list::iterator it=outStreams.begin(); it!=outStreams.end();++it) { for(size_t uj=0;ujsize();uj++) { //Skip non plot output if((*it)[uj]->getStreamType() != STREAM_TYPE_RANGE) continue; //Save the plot output std::string filename; const RangeStreamData* p = (const RangeStreamData*)(*it)[uj]; filename = exportDialog->getFilename(ui,FILENAME_RANGE,rangeNum); size_t format; format=rangeEnumMap.at(exportDialog->getRangeFormat()); if(!p->save(filename.c_str(),format)) { pair errMsg; string tmpStr; stream_cast(tmpStr,ui); errMsg.first=TRANS("Range save failed"); errMsg.second = TRANS("Unable to save range for frame "); throw errMsg; } } } } if(exportDialog->wantsVoxels()) { size_t offset=0; for(list::iterator it=outStreams.begin(); it!=outStreams.end();++it) { for(size_t uj=0;ujsize();uj++) { if( ((*it)[uj])->getStreamType() != STREAM_TYPE_VOXEL) continue; const VoxelStreamData *v; v=(const VoxelStreamData*)(*it)[uj]; std::string filename = exportDialog->getFilename(ui,FILENAME_VOXEL,offset); if(v->data->writeFile(filename.c_str())) { pair errMsg; string tmpStr; stream_cast(tmpStr,ui); errMsg.first=TRANS("Voxel save failed"); errMsg.second = TRANS("Unable to save voxels for frame "); errMsg.second+=tmpStr; throw errMsg; } offset++; } } } } catch(std::pair &errMsg) { errMessage=errMsg.first + "\n" + errMsg.second; //clean up data FilterTree::safeDeleteFilterList(outData); needAbortDlg=true; break; } //Clean up date from this run, releasing stream pointers. FilterTree::safeDeleteFilterList(outData); outStreams.clear(); } } if(needAbortDlg) wxErrMsg(this,TRANS("Animate failed"),errMessage); currentlyUpdatingScene=false; //Re-run the scene update for the original case, // this allows for things like the selection bindings to be reinitialised. doSceneUpdate(); //Restore UI and timers //-- prog->Destroy(); exportDialog->Destroy(); panelTop->Enable(true); updateTimer->Start(UPDATE_TIMER_DELAY,wxTIMER_CONTINUOUS); autoSaveTimer->Start(AUTOSAVE_DELAY*1000,wxTIMER_CONTINUOUS); //-- } void MainWindowFrame::OnFileExportPackage(wxCommandEvent &event) { if(!treeFilters->GetCount()) { statusMessage(TRANS("No filters means no data to export"),MESSAGE_ERROR); return; } //Determine if we want to export a debug package (hold CTRL+SHIFT during export menu select) bool wantDebugPack; { bool shiftState=wxGetKeyState(WXK_SHIFT); bool ctrlState= wxGetKeyState(WXK_CONTROL); wantDebugPack=(shiftState && ctrlState); } //This could be nicer, or reordered wxTextEntryDialog wxTD(this,TRANS("Package name"), TRANS("Package directory name"),wxT(""),wxOK|wxCANCEL); wxTD.SetValue(TRANS("AnalysisPackage")); if(wxTD.ShowModal() == wxID_CANCEL) return; //Pop up a directory dialog, to choose the base path for the new folder unsigned int res; wxDirDialog wxD(this); res = wxD.ShowModal(); wxMessageDialog wxMesD(this,TRANS("Package folder already exists, won't overwrite.") ,TRANS("Not available"),wxOK|wxICON_ERROR); while(res != wxID_CANCEL) { //Dir cannot exist yet, as we want to make it. if(wxDirExists(wxD.GetPath() +wxFileName::GetPathSeparator() + wxTD.GetValue())) { wxMesD.ShowModal(); res=wxD.ShowModal(); } else break; } //User aborted directory choice. if(res==wxID_CANCEL) return; wxString folder; folder=wxD.GetPath() + wxFileName::GetPathSeparator() + wxTD.GetValue() + wxFileName::GetPathSeparator(); //Check to see that the folder actually exists if(!wxMkdir(folder)) { wxMessageDialog wxMesD(this,TRANS("Package folder creation failed\ncheck writing to this location is possible.") ,TRANS("Folder creation failed"),wxOK|wxICON_ERROR); wxMesD.ShowModal(); return; } //OK, so the folder exists, lets make the XML state file std::string dataFile = string(stlStr(folder)) + "state.xml"; std::map fileMapping; //Try to save the viscontrol state if(!visControl.state.save(dataFile.c_str(),fileMapping,true)) { wxErrMsg(this,TRANS("Save error"), TRANS("Unable to save. Check output destination can be written to.")); } else { //Copy the files in the mapping wxProgressDialog wxP(TRANS("Copying"), TRANS("Copying referenced files"),fileMapping.size()); wxP.Show(); for(map::iterator it=fileMapping.begin(); it!=fileMapping.end();++it) { //Hack, if we are exporting a debugging package, // pos files should be // only copied for the first CHUNKSIZE bytes bool copyError; bool isPosFile; copyError=false;isPosFile=false; string strName=it->first; if(strName.size() > 4) { strName=strName.substr(strName.size()-4); if(strName == ".pos") isPosFile=true; } size_t filesize; const size_t CHUNKSIZE=1024*1024*2; filesize=0; if(wantDebugPack && isPosFile) getFilesize(it->second.c_str(),filesize); //If we want a debugging package, then only copy the first part of the file if(wantDebugPack && isPosFile && filesize > CHUNKSIZE) { std::ifstream inputF(it->second.c_str(),std::ios::binary); if(!inputF) { copyError=true; break; } //copy one chunk char *c = new char[CHUNKSIZE]; std::string outfname; outfname=stlStr(folder) + it->first; std::ofstream of(outfname.c_str(),std::ios::binary); if(!of) { delete[] c; copyError=true; break; } inputF.read(c,CHUNKSIZE); of.write(c,CHUNKSIZE); delete[] c; } else { //if the file exists, then try to copy it to the local folder. // The file might be optional, and therefore blank, so it is not an error // to not have the file existing if(wxFileExists(it->second)) copyError=!wxCopyFile((it->second),folder+(it->first)); else copyError=false; } if(copyError) { wxErrMsg(this,TRANS("Save error"),TRANS("Error copying file")); return; } wxP.Update(); } wxString s; s=wxString(TRANS("Saved package: ")) + folder; if(wantDebugPack) { s+=(" (debug mode)"); } statusMessage(stlStr(s).c_str(),MESSAGE_INFO); } } void MainWindowFrame::OnFileExportIons(wxCommandEvent &event) { if(!treeFilters->GetCount()) { statusMessage(TRANS("No filters means no data to export"),MESSAGE_ERROR); return; } //Steal the filter tree (including caches) from viscontrol FilterTree f; visControl.state.treeState.switchoutFilterTree(f); //Load up the export dialog ExportPosDialog *exportDialog=new ExportPosDialog(this,wxID_ANY,TRANS("Export")); exportDialog->initialiseData(f); //create a file chooser for later. The format string is special as we use it to demux the // format later wxFileDialog wxF(this,TRANS("Save pos..."), wxT(""), wxT(""),TRANS("POS Data (*.pos)|*.pos|Text File (*.txt)|*.txt|VTK Legacy (*.vtk)|*.vtk|All Files (*)|*"),wxFD_SAVE); //If the user cancels the file chooser, //drop them back into the export dialog. do { cerr << "Show dialog" << __FILE__ << " :" << __LINE__ << endl; //Show, then check for user cancelling export dialog if(exportDialog->ShowModal() == wxID_CANCEL) { //Take control of the filter tree back from the export dialog, // and return it to visControl exportDialog->swapFilterTree(f); visControl.state.treeState.swapFilterTree(f); exportDialog->Destroy(); //Need this to reset the ID values updateWxTreeCtrl(treeFilters); return; } } while( (wxF.ShowModal() == wxID_CANCEL)); //Check for user abort in file chooser //Check file already exists (no overwrite without asking) if(wxFileExists(wxF.GetPath())) { wxMessageDialog wxD(this,TRANS("File already exists, overwrite?") ,TRANS("Overwrite?"),wxOK|wxCANCEL|wxICON_QUESTION); if(wxD.ShowModal() == wxID_CANCEL) { //Take control of the filter tree back from the export dialog, // and return it to visControl exportDialog->swapFilterTree(f); visControl.state.treeState.swapFilterTree(f); //Need this to reset the ID values updateWxTreeCtrl(treeFilters); exportDialog->Destroy(); return; } } std::string dataFile = stlStr(wxF.GetPath()); //Retrieve the ion streams that we need to save vector exportVec; exportDialog->getExportVec(exportVec); //Using the wildcard constant selected, set if we want text or pos unsigned int format; if(wxF.GetFilterIndex() == 0) format = IONFORMAT_POS; else if(wxF.GetFilterIndex() == 1) format = IONFORMAT_TEXT; else format = IONFORMAT_VTK; //write the ion streams to disk if(IonStreamData::exportStreams(exportVec,dataFile,format)) { wxErrMsg(this,TRANS("Save error"), TRANS("Unable to save. Check output destination can be written to.")); } else { dataFile=std::string(TRANS("Saved ions: ")) + dataFile; statusMessage(dataFile.c_str(),MESSAGE_INFO); } //Take control of the filter tree back from the export dialog, // and return it to visControl exportDialog->swapFilterTree(f); visControl.state.treeState.swapFilterTree(f); //Call ->Destroy to invoke destructor, which will safely delete the //filterstream pointers it generated exportDialog->Destroy(); //Need this to reset the ID values updateWxTreeCtrl(treeFilters); } void MainWindowFrame::OnFileExportRange(wxCommandEvent &event) { if(!treeFilters->GetCount()) { statusMessage(TRANS("No filters means no data to export"), MESSAGE_ERROR); return; } ExportRngDialog *rngDialog = new ExportRngDialog(this,wxID_ANY,TRANS("Export Ranges"), wxDefaultPosition,wxSize(600,400)); vector rangeData; //Retrieve all the range filters in the viscontrol visControl.state.treeState.getFiltersByType(rangeData,FILTER_TYPE_RANGEFILE); //pass this to the range dialog rngDialog->addRangeData(rangeData); if(rngDialog->ShowModal() == wxID_CANCEL) { rngDialog->Destroy(); return; } rngDialog->Destroy(); } void MainWindowFrame::OnFileSaveAs(wxCommandEvent &event) { //Show a file save dialog wxFileDialog wxF(this,TRANS("Save state..."), wxT(""), wxT(""),TRANS("XML state file (*.xml)|*.xml|All Files (*)|*"),wxFD_SAVE); //Show, then check for user cancelling dialog if( (wxF.ShowModal() == wxID_CANCEL)) return; std::string dataFile = stlStr(wxF.GetPath()); wxFileName fname; wxString volume,path,name,ext; bool hasExt; fname.SplitPath(wxF.GetPath(),&volume, &path,&name,&ext, &hasExt); //Check file already exists (no overwrite without asking) if(wxFileExists(wxF.GetPath())) { wxMessageDialog wxD(this,TRANS("File already exists, overwrite?") ,TRANS("Overwrite?"),wxOK|wxCANCEL|wxICON_QUESTION); if(wxD.ShowModal() == wxID_CANCEL) return; } if(hasExt) { //Force the string to end in ".xml" std::string strExt; strExt=stlStr(ext); strExt = lowercase(strExt); if(strExt != "xml") dataFile+=".xml"; } else dataFile+=".xml"; bool oldRelPath=visControl.state.getUseRelPaths(); //Check to see if we have are using relative paths, //and if so, do any of our filters if(visControl.state.getUseRelPaths() && visControl.state.hasStateOverrides()) { wxMessageDialog wxD(this,TRANS("Files have been referred to using relative paths. Keep relative paths?") ,TRANS("Overwrite?"),wxYES|wxNO|wxICON_QUESTION); wxD.SetEscapeId(wxID_NO); wxD.SetAffirmativeId(wxID_YES); //Just for the moment, set relative paths to false, if the user asks. //we will restore this later if(wxD.ShowModal() == wxID_NO) { oldRelPath=true; visControl.state.setUseRelPaths(false); } } std::map dummyMap; //Try to save the viscontrol state if(!visControl.state.save(dataFile.c_str(),dummyMap,false)) { wxErrMsg(this,TRANS("Save error"), TRANS("Unable to save. Check output destination can be written to.")); } else { std::string tmpStr; tmpStr=stlStr(wxF.GetPath()); visControl.state.setFilename(tmpStr); //Update the recent files, and the menu. configFile.addRecentFile(dataFile); recentHistory->AddFileToHistory((dataFile)); dataFile=std::string(TRANS("Saved state: ")) + dataFile; statusMessage(dataFile.c_str(),MESSAGE_INFO); } //Restore the relative path behaviour visControl.state.setUseRelPaths(oldRelPath); setSaveStatus(); } void MainWindowFrame::OnFileExit(wxCommandEvent &event) { //Close query is handled by OnClose() Close(); } void MainWindowFrame::OnEditUndo(wxCommandEvent &event) { visControl.state.treeState.popUndoStack(); //Get vis controller to update tree control to match internal // structure. Retain tree selection & visibility if we currently // have a valid selection size_t filterId; if(getTreeFilterId(treeFilters->GetSelection(),filterId)) visControl.setWxTreeFilterViewPersistence(filterId); //Update tree control updateWxTreeCtrl(treeFilters); if(getTreeFilterId(treeFilters->GetSelection(),filterId)) { //Update property grid visControl.updateFilterPropGrid(gridFilterPropGroup,filterId); } else { gridFilterPropGroup->Clear(); } doSceneUpdate(); } void MainWindowFrame::OnEditRedo(wxCommandEvent &event) { visControl.state.treeState.popRedoStack(); size_t filterId; if(getTreeFilterId(treeFilters->GetSelection(),filterId)) visControl.setWxTreeFilterViewPersistence(filterId); //Update tree control updateWxTreeCtrl(treeFilters); //If we can still get the ID, lets use it if(getTreeFilterId(treeFilters->GetSelection(),filterId)) { //Update property grid visControl.updateFilterPropGrid(gridFilterPropGroup, filterId); } else { gridFilterPropGroup->Clear(); } doSceneUpdate(); } void MainWindowFrame::OnEditRange(wxCommandEvent &event) { RangeEditorDialog *r = new RangeEditorDialog(this,wxID_ANY,TRANS("Range editor")); r->setPlotWrapper(*(visControl.getPlotWrapper())); if(r->ShowModal() == wxID_CANCEL) { r->Destroy(); return; } //Obtain the modified rangefiles from the dialog map modifiedRanges; r->getModifiedRanges(modifiedRanges); //Pass the modified rangefiles to viscontrol visControl.state.treeState.modifyRangeFiles(modifiedRanges); r->Destroy(); doSceneUpdate(); } void MainWindowFrame::OnEditPreferences(wxCommandEvent &event) { //Create a new preference dialog PrefDialog *p = new PrefDialog(this,wxID_ANY,wxT("Preferences")); //TODO: Refactor preference dialog to accept a config file object vector filterDefaults; //obtain direct copies of the cloned Filter pointers configFile.getFilterDefaults(filterDefaults); p->setFilterDefaults(filterDefaults); //Get the default mouse/camera parameters unsigned int mouseZoomRate,mouseMoveRate; bool preferOrthoCamera; mouseZoomRate=configFile.getMouseZoomRate(); mouseMoveRate=configFile.getMouseMoveRate(); preferOrthoCamera=configFile.getWantStartupOrthoCam(); unsigned int panelMode; //Set Panel startup flags bool rawStartup,controlStartup,plotStartup; controlStartup=configFile.getPanelEnabled(CONFIG_STARTUPPANEL_CONTROL); rawStartup=configFile.getPanelEnabled(CONFIG_STARTUPPANEL_RAWDATA); plotStartup=configFile.getPanelEnabled(CONFIG_STARTUPPANEL_PLOTLIST); panelMode=configFile.getStartupPanelMode(); p->setPanelDefaults(panelMode,controlStartup,rawStartup,plotStartup); #ifndef DISABLE_ONLINE_UPDATE p->setAllowOnlineUpdate(configFile.getAllowOnlineVersionCheck()); #endif p->setMouseZoomRate(mouseZoomRate); p->setMouseMoveRate(mouseMoveRate); p->setPreferOrthoCam(preferOrthoCamera); //Initialise panel p->initialise(); //show panel if(p->ShowModal() !=wxID_OK) { p->cleanup(); p->Destroy(); return; } filterDefaults.clear(); //obtain cloned copies of the pointers p->getFilterDefaults(filterDefaults); mouseZoomRate=p->getMouseZoomRate(); mouseMoveRate=p->getMouseMoveRate(); preferOrthoCamera=p->getPreferOrthoCam(); panelTop->setMouseZoomFactor((float)mouseZoomRate/100.0f); panelTop->setMouseMoveFactor((float)mouseMoveRate/100.0f); configFile.setMouseZoomRate(mouseZoomRate); configFile.setMouseMoveRate(mouseMoveRate); configFile.setWantStartupOrthoCam(preferOrthoCamera); //Note that this transfers control of pointer to the config file configFile.setFilterDefaults(filterDefaults); //Retrieve pane settings, and pass to config manager p->getPanelDefaults(panelMode,controlStartup,rawStartup,plotStartup); configFile.setPanelEnabled(CONFIG_STARTUPPANEL_CONTROL,controlStartup,true); configFile.setPanelEnabled(CONFIG_STARTUPPANEL_RAWDATA,rawStartup,true); configFile.setPanelEnabled(CONFIG_STARTUPPANEL_PLOTLIST,plotStartup,true); configFile.setStartupPanelMode(panelMode); #ifndef DISABLE_ONLINE_UPDATE configFile.setAllowOnline(p->getAllowOnlineUpdate()); configFile.setAllowOnlineVersionCheck(p->getAllowOnlineUpdate()); #endif p->cleanup(); p->Destroy(); } void MainWindowFrame::OnViewBackground(wxCommandEvent &event) { //retrieve the current colour from the openGL panel float r,g,b; panelTop->getGlClearColour(r,g,b); //Show a wxColour choose dialog. wxColourData d; d.SetColour(wxColour((unsigned char)(r*255),(unsigned char)(g*255), (unsigned char)(b*255),(unsigned char)(255))); wxColourDialog *colDg=new wxColourDialog(this->GetParent(),&d); if( colDg->ShowModal() == wxID_OK) { wxColour c; //Change the colour c=colDg->GetColourData().GetColour(); //Scale colour ranges to 0-> 1 and set in the gl pane panelTop->setGlClearColour(c.Red()/255.0f,c.Green()/255.0f,c.Blue()/255.0f); } panelTop->forceRedraw(); } void MainWindowFrame::OnViewControlPane(wxCommandEvent &event) { if(event.IsChecked()) { if(!splitLeftRight->IsSplit()) { const float SPLIT_FACTOR=0.3; int x,y; GetClientSize(&x,&y); splitLeftRight->SplitVertically(panelLeft, panelRight,(int)(SPLIT_FACTOR*x)); configFile.setPanelEnabled(CONFIG_STARTUPPANEL_CONTROL,true); } } else { if(splitLeftRight->IsSplit()) { splitLeftRight->Unsplit(panelLeft); configFile.setPanelEnabled(CONFIG_STARTUPPANEL_CONTROL,false); } } } void MainWindowFrame::OnViewRawDataPane(wxCommandEvent &event) { if(event.IsChecked()) { if(!splitTopBottom->IsSplit()) { const float SPLIT_FACTOR=0.3; int x,y; GetClientSize(&x,&y); splitTopBottom->SplitHorizontally(panelTop, noteDataView,(int)(SPLIT_FACTOR*x)); configFile.setPanelEnabled(CONFIG_STARTUPPANEL_RAWDATA,true); } } else { if(splitTopBottom->IsSplit()) { splitTopBottom->Unsplit(); configFile.setPanelEnabled(CONFIG_STARTUPPANEL_RAWDATA,false); } } } void MainWindowFrame::OnViewSpectraList(wxCommandEvent &event) { if(event.IsChecked()) { if(!splitterSpectra->IsSplit()) { const float SPLIT_FACTOR=0.6; int x,y; splitterSpectra->GetClientSize(&x,&y); splitterSpectra->SplitVertically(panelSpectra, window_2_pane_2,(int)(SPLIT_FACTOR*x)); configFile.setPanelEnabled(CONFIG_STARTUPPANEL_PLOTLIST,true); } } else { if(splitterSpectra->IsSplit()) { splitterSpectra->Unsplit(); configFile.setPanelEnabled(CONFIG_STARTUPPANEL_PLOTLIST,false); } } } void MainWindowFrame::OnViewPlotLegend(wxCommandEvent &event) { panelSpectra->setLegendVisible(event.IsChecked()); panelSpectra->Refresh(); } void MainWindowFrame::OnViewWorldAxis(wxCommandEvent &event) { visControl.scene.setWorldAxisVisible(event.IsChecked()); panelTop->forceRedraw(); } void MainWindowFrame::OnHelpHelp(wxCommandEvent &event) { //First attempt to locate the local copy of the manual. string s; s=locateDataFile("3Depict-manual.pdf"); //Also Debian makes us use the lowercase "D", so check there too. if(!s.size()) s=locateDataFile("3depict-manual.pdf"); //FIXME: under windows, currently we use "manual.pdf" if(!s.size()) s=locateDataFile("manual.pdf"); //If we found it, use the default program associated with that data file bool launchedOK=false; if( wxFileExists((s)) && s.size()) { //we found the manual. Launch the default handler. launchedOK=wxLaunchDefaultApplication((s)); } //Still no go? Give up and launch a browser. if(!launchedOK) { std::string helpFileLocation("http://threedepict.sourceforge.net/documentation.html"); wxLaunchDefaultBrowser((helpFileLocation),wxBROWSER_NEW_WINDOW); statusMessage(TRANS("Manual not found locally. Launching web browser"),MESSAGE_INFO); } } void MainWindowFrame::OnHelpContact(wxCommandEvent &event) { std::string contactFileLocation("http://threedepict.sourceforge.net/contact.html"); wxLaunchDefaultBrowser((contactFileLocation),wxBROWSER_NEW_WINDOW); statusMessage(TRANS("Opening contact page in external web browser"),MESSAGE_INFO); } void MainWindowFrame::OnButtonStashDialog(wxCommandEvent &event) { if(!visControl.state.getStashCount()) { statusMessage(TRANS("No filter stashes to edit."),MESSAGE_ERROR); return; } StashDialog *s = new StashDialog(this,wxID_ANY,TRANS("Filter Stashes")); s->setVisController(&visControl); s->ready(); s->ShowModal(); s->Destroy(); //Stash list may have changed. Force update visControl.updateStashComboBox(comboStash); } void MainWindowFrame::OnHelpAbout(wxCommandEvent &event) { wxAboutDialogInfo info; info.SetName((PROGRAM_NAME)); info.SetVersion((PROGRAM_VERSION)); info.SetDescription(TRANS("Quick and dirty analysis for point data.")); info.SetWebSite(wxT("https://threedepict.sourceforge.net/")); info.AddDeveloper(wxT("D. Haley")); info.AddDeveloper(wxT("A. Ceguerra")); //GNU GPL v3 info.SetCopyright(_T("Copyright (C) 2015 3Depict team\n This software is licenced under the GPL Version 3.0 or later\n This program comes with ABSOLUTELY NO WARRANTY.\nThis is free software, and you are welcome to redistribute it\nunder certain conditions; Please see the file COPYING in the program directory for details")); info.AddArtist(_T("Thanks go to all who have developed the libraries that I use, which make this program possible.\n This includes the wxWidgets team, Alexy Balakin (MathGL), the FTGL and freetype people, the GNU Scientific Library contributors, the tree.h guy (Kasper Peeters) and more.")); info.AddArtist(wxString(TRANS("Compiled with wx Version: " )) + wxString(wxSTRINGIZE_T(wxVERSION_STRING))); wxArrayString s; s.Add(_T("Deutsch (German) : Erich (de)")); info.SetTranslators(s); wxAboutBox(info); } void MainWindowFrame::OnComboStashText(wxCommandEvent &event) { std::string s; s=stlStr(comboStash->GetValue()); if(!s.size()) return; int n = comboStash->FindString(comboStash->GetValue()); if ( n== wxNOT_FOUND ) statusMessage(TRANS("Press enter to store new stash"),MESSAGE_HINT); else { //The combo generates an ontext event when a string //is selected (yeah, I know, weird..) Block this case. if(comboStash->GetSelection() != n) statusMessage(TRANS("Press enter to restore stash"),MESSAGE_HINT); } } void MainWindowFrame::OnComboStashEnter(wxCommandEvent &event) { //The user has pressed enter, in the combo box. If there is an existing stash of this name, //use it. Otherwise store the current tree control as part of the new stash std::string userText; userText=stlStr(comboStash->GetValue()); //Forbid names with no text content userText=stripWhite(userText); if(!userText.size()) return; unsigned int stashPos = (unsigned int ) -1; unsigned int nStashes = visControl.state.getStashCount(); for(unsigned int ui=0;uiGetSelection(),filterId)) { statusMessage(TRANS("Unable to create stash, selection invalid"),MESSAGE_ERROR); return; } visControl.state.stashFilters(filterId,userText.c_str()); visControl.updateStashComboBox(comboStash); statusMessage(TRANS("Created new filter tree stash"),MESSAGE_INFO); } else { //Stash exists, process as if we selected it OnComboStash(event); } //clear the text in the combo box comboStash->SetValue(wxT("")); } void MainWindowFrame::OnComboFilterText(wxCommandEvent &event) { //prevent user from modifying text #ifndef __APPLE__ comboFilters->ChangeValue(TRANS(ADD_FILTER_TEXT)); #endif } void MainWindowFrame::OnComboStash(wxCommandEvent &event) { //Find the stash associated with this item wxListUint *l; l =(wxListUint*)comboStash->GetClientObject(comboStash->GetSelection()); size_t filterId; //Get the parent filter from the tree selection if(getTreeFilterId(treeFilters->GetSelection(),filterId)) { //Get the parent filter pointer const Filter *parentFilter= visControl.state.treeState.getFilterById(filterId); visControl.state.addStashedToFilters(parentFilter,l->value); updateWxTreeCtrl(treeFilters, parentFilter); if(checkAutoUpdate->GetValue()) doSceneUpdate(); } //clear the text in the combo box comboStash->SetValue(wxT("")); } void MainWindowFrame::OnTreeEndDrag(wxTreeEvent &event) { if(refreshThreadActive()) { event.Veto(); return; } //Should be enforced by ::Allow() in start drag. ASSERT(filterTreeDragSource && filterTreeDragSource->IsOk()); //Allow tree to be manhandled, so you can move filters around wxTreeItemId newParent = event.GetItem(); bool needRefresh=false; size_t sId; if(!getTreeFilterId(*filterTreeDragSource,sId)) return; wxMouseState wxm = wxGetMouseState(); //if we have a parent node to reparent this to if(newParent.IsOk()) { size_t pId; if(!getTreeFilterId(newParent,pId)) return; //Copy elements from a to b, if a and b are not the same if(pId != sId) { visControl.setWxTreeFilterViewPersistence(sId); visControl.setWxTreeFilterViewPersistence(pId); //If command button down (ctrl or clover on mac), //then copy, otherwise move if(wxm.CmdDown()) needRefresh=visControl.state.treeState.copyFilter(sId,pId); else needRefresh=visControl.state.treeState.reparentFilter(sId,pId); } } else { const Filter *fSource = visControl.state.treeState.getFilterById(sId); //Only filters that are a data source are allowed to be in the base. if( fSource->isPureDataSource()) { if(wxm.CmdDown()) needRefresh=visControl.state.treeState.copyFilter(sId,0); else needRefresh=visControl.state.treeState.reparentFilter(sId,0); } else statusMessage(TRANS("Filter type not a data source - can't be at tree base"),MESSAGE_ERROR); } if(needRefresh ) { //Refresh the treecontrol updateWxTreeCtrl(treeFilters); //We have finished the drag statusMessage("",MESSAGE_NONE); if(checkAutoUpdate->GetValue()) doSceneUpdate(); } delete filterTreeDragSource; filterTreeDragSource=0; } void MainWindowFrame::OnTreeSelectionPreChange(wxTreeEvent &event) { if(refreshThreadActive()) { event.Veto(); return; } } void MainWindowFrame::OnTreeSelectionChange(wxTreeEvent &event) { if(programmaticEvent) return; ASSERT(!refreshThreadActive()) size_t filterId; if(!getTreeFilterId(treeFilters->GetSelection(),filterId)) { gridFilterPropGroup->Clear(); return; } comboFilters->Enable(); visControl.updateFilterPropGrid(gridFilterPropGroup, filterId); panelTop->forceRedraw(); } void MainWindowFrame::updateEditRangeMenu() { vector filtersRange,filtersSpectra; visControl.state.treeState.getFiltersByType(filtersRange,FILTER_TYPE_RANGEFILE); visControl.state.treeState.getFiltersByType(filtersSpectra,FILTER_TYPE_SPECTRUMPLOT); //Only show the menu item if we have both ranges and plots in our // filter tree bool wantEnable = filtersRange.size() && filtersSpectra.size(); editRangeMenuItem->Enable(wantEnable); } void MainWindowFrame::OnTreeDeleteItem(wxTreeEvent &event) { if(refreshThreadActive()) { ASSERT(false); //Shouldn't happen, but might have... event.Veto(); return; } //This event is only generated programatically, // we do not have to handle the direct deletion. } void MainWindowFrame::OnTreeBeginLabelEdit(wxTreeEvent &event) { if(refreshThreadActive() ) { ASSERT(false); event.Veto(); return; } } void MainWindowFrame::OnTreeEndLabelEdit(wxTreeEvent &event) { if(event.IsEditCancelled()) return; //There is a case where the tree doesn't quite clear //when there is an editor involved. if(visControl.state.treeState.size()) { std::string s; s=stlStr(event.GetLabel()); if(s.size()) { size_t filterId; if(!getTreeFilterId(treeFilters->GetSelection(),filterId)) return; //If the string has been changed, then we need to update visControl.state.treeState.setFilterString(filterId,s); //We need to reupdate the scene, in order to re-fill the //spectra list box doSceneUpdate(); } else { event.Veto(); // Disallow blank strings. } } } void MainWindowFrame::OnTreeBeginDrag(wxTreeEvent &event) { if(refreshThreadActive() ) { ASSERT(false); //shouldn't happen (should lock), but might event.Veto(); return; } //No dragging if editing, or if no filters if(treeFilters->GetEditControl() || event.GetItem() == treeFilters->GetRootItem()) { event.Veto(); return; } //Record the drag source wxTreeItemId t = event.GetItem(); if(t.IsOk()) { filterTreeDragSource = new wxTreeItemId; *filterTreeDragSource =t; event.Allow(); #ifdef __APPLE__ statusMessage(TRANS("Moving - Hold ⌘ (command) to copy"),MESSAGE_HINT); #else statusMessage(TRANS("Moving - Hold control to copy"),MESSAGE_HINT); #endif } } void MainWindowFrame::OnBtnExpandTree(wxCommandEvent &event) { treeFilters->ExpandAll(); } void MainWindowFrame::OnBtnCollapseTree(wxCommandEvent &event) { treeFilters->CollapseAll(); } void MainWindowFrame::OnBtnFilterTreeErrs(wxCommandEvent &event) { //Grab the error strings vector res; visControl.state.treeState.getAnalysisResults(res); ASSERT(res.size()); vector errStrings; for(unsigned int ui=0;uigetUserString() + "\n"; } errStrings.push_back(s); s.clear(); } res.clear(); FilterErrorDialog *f= new FilterErrorDialog(this); f->SetText(errStrings); f->ShowModal(); delete f; } void MainWindowFrame::OnTreeKeyDown(wxKeyEvent &event) { if(currentlyUpdatingScene) { return; } const wxKeyEvent k = event; switch(k.GetKeyCode()) { case WXK_BACK: case WXK_DELETE: { wxTreeItemId id; if(!treeFilters->GetCount()) return; id=treeFilters->GetSelection(); if(!id.IsOk() || id == treeFilters->GetRootItem()) return; //TODO: Refactor out wxTreeItem... code, into separate routine // that only spits out viscontrol Ids //Rebuild the tree control, ensuring that the parent is visible, //if it has a parent (recall root node of wx control is hidden) //Get the parent & its data wxTreeItemId parent = treeFilters->GetItemParent(id); wxTreeItemData *parentData=treeFilters->GetItemData(parent); //Tree data contains unique identifier for vis control to do matching wxTreeItemData *tData=treeFilters->GetItemData(id); //Remove the item from the Tree visControl.state.treeState.removeFilterSubtree(((wxTreeUint *)tData)->value); //Clear property grid gridFilterPropGroup->Clear(); if(parent !=treeFilters->GetRootItem()) { ASSERT(parent.IsOk()); // should be - base node should always exist. //Ensure that the parent stays visible visControl.setWxTreeFilterViewPersistence( ((wxTreeUint*)parentData)->value); updateWxTreeCtrl(treeFilters); //OK, so those old Id s are no longer valid, //as we just rebuilt the tree. We need new ones //Parent is now selected parent=treeFilters->GetSelection(); parentData=treeFilters->GetItemData(parent); //Update the filter property grid with the parent's data visControl.updateFilterPropGrid(gridFilterPropGroup, ((wxTreeUint *)parentData)->value); } else { if(parent.IsOk()) updateWxTreeCtrl(treeFilters); } //Force a scene update, independent of if autoUpdate is enabled. doSceneUpdate(); break; } default: event.Skip(); } } void MainWindowFrame::OnGridFilterPropertyChange(wxPropertyGridEvent &event) { //Silence error mesages // we will handle validation in the backend event.SetValidationFailureBehavior(0); if(programmaticEvent || currentlyUpdatingScene || refreshThreadActive()) { event.Veto(); return; } programmaticEvent=true; //Should only be in the second col size_t filterId; if(!getTreeFilterId(treeFilters->GetSelection(),filterId)) { programmaticEvent=false; return; } //Obtain the key/value pairing that we are about to set std::string newValue,keyStr; newValue=getPropValueFromEvent(event); size_t key; keyStr=event.GetProperty()->GetName(); stream_cast(key,keyStr); //Try to apply the new value bool needUpdate; if(!visControl.state.treeState.setFilterProperty(filterId, key,newValue,needUpdate)) { event.Veto(); programmaticEvent=false; return; } if(needUpdate && checkAutoUpdate->GetValue()) doSceneUpdate(); else clearWxTreeImages(treeFilters); #ifdef FIX_WXPROPGRID_16222 //See wx bug #16222 - cannot modify a property grid's contents // from a change event. Must work in a side-object then swap //-- backFilterPropGrid= new wxPropertyGrid(filterPropertyPane,ID_GRID_FILTER_PROPERTY, wxDefaultPosition,wxDefaultSize,PROPERTY_GRID_STYLE); backFilterPropGrid->SetExtraStyle(PROPERTY_GRID_EXTRA_STYLE); visControl.updateFilterPropGrid(backFilterPropGrid,filterId, stlStr(gridFilterPropGroup->SaveEditableState())); int columnPos = gridFilterPropGroup->GetSplitterPosition(); std::swap(backFilterPropGrid,gridFilterPropGroup); do_filtergrid_prop_layout(); //Restore the original splitter position gridFilterPropGroup->SetSplitterPosition(columnPos); //-- #else visControl.updateFilterPropGrid(gridFilterPropGroup,filterId, stlStr(gridFilterPropGroup->SaveEditableState())); #endif programmaticEvent=false; } void MainWindowFrame::OnGridFilterDClick(wxPropertyGridEvent &event) { Refresh(); } void MainWindowFrame::OnGridCameraPropertyChange(wxPropertyGridEvent &event) { //Check for inited OK. Seem to be getting called before //do_layout is complete. if(programmaticEvent || !initedOK) { event.Veto(); return; } programmaticEvent=true; std::string eventType,newValue; eventType=event.GetValue().GetType(); if(eventType == "long") { //Either integer property or enum //integer property wxLongLong ll; ll=event.GetValue().GetLong(); const wxPGChoices &choices = event.GetProperty()->GetChoices(); if(!choices.IsOk()) { stream_cast(newValue,ll); } else { //So wx makes life hard here. We need to do a dance to get the selection // as a string unsigned int ul; ul=ll.ToLong(); wxArrayString arrStr; arrStr=choices.GetLabels(); newValue=arrStr[ul]; } } else { //We don't need colour props in camera // not implemented ASSERT(eventType != "wxColour"); newValue = event.GetValue().GetString(); } std::string keyStr; size_t key; keyStr=event.GetProperty()->GetName(); stream_cast(key,keyStr); //Get the camera ID value wxListUint *l; int n = comboCamera->FindString(comboCamera->GetValue()); if(n == wxNOT_FOUND) { programmaticEvent=false; return; } l =(wxListUint*) comboCamera->GetClientObject(n); ASSERT(l); size_t cameraId; cameraId = l->value; //Set property visControl.setCamProperty(cameraId,key,newValue); #ifdef FIX_WXPROPGRID_16222 //FIXME :Need to send the new grid, not the old, due to wx bug //See wx bug #16222 - cannot modify a property grid's contents // from a change event. Must work in a side-objectm then swap //-- backCameraPropGrid= new wxPropertyGrid(noteCamera,ID_GRID_CAMERA_PROPERTY, wxDefaultPosition,wxDefaultSize,PROPERTY_GRID_STYLE); backCameraPropGrid->SetExtraStyle(PROPERTY_GRID_EXTRA_STYLE); visControl.updateCameraPropGrid(backCameraPropGrid,cameraId); int columnPos =gridCameraProperties->GetSplitterPosition(); std::swap(backCameraPropGrid,gridCameraProperties); do_cameragrid_prop_layout(); gridCameraProperties->SetSplitterPosition(columnPos); #else visControl.updateCameraPropGrid(gridCameraProperties,cameraId); #endif #ifdef __WIN32 //Move the splitter panel splitLeftRight->SetSashPosition(splitLeftRight->GetSashPosition()+1); splitLeftRight->SetSashPosition(splitLeftRight->GetSashPosition()-1); #endif //Ensure that the GL panel shows latest cam orientation panelTop->forceRedraw(); programmaticEvent=false; } void MainWindowFrame::OnComboCameraText(wxCommandEvent &event) { std::string s; s=stlStr(comboCamera->GetValue()); if(!s.size()) return; int n = comboCamera->FindString(comboCamera->GetValue()); if ( n== wxNOT_FOUND ) statusMessage(TRANS("Press enter to store new camera"),MESSAGE_HINT); else statusMessage(TRANS("Press enter to restore camera"),MESSAGE_HINT); } void MainWindowFrame::OnComboCameraEnter(wxCommandEvent &event) { std::string camName; camName=stlStr(comboCamera->GetValue()); //Disallow cameras with no name if (camName.empty()) return; //Search for the camera's position in the combo box int n = comboCamera->FindString(comboCamera->GetValue()); //If we have found the camera... if ( n!= wxNOT_FOUND ) { //Select the combo box item comboCamera->Select(n); //Set this camera as thew new camera wxListUint *l; l =(wxListUint*) comboCamera->GetClientObject(comboCamera->GetSelection()); visControl.setActiveCam(l->value); std::string s = std::string(TRANS("Restored camera: ") ) +stlStr(comboCamera->GetValue()); statusMessage(s.c_str(),MESSAGE_INFO); //refresh the camera property grid visControl.updateCameraPropGrid(gridCameraProperties ,l->value); setSaveStatus(); //force redraw in 3D pane panelTop->forceRedraw(); } else { ASSERT(camName.size()); //Create a new camera for the scene. visControl.state.addCam(camName,true); std::string s = std::string(TRANS("Stored camera: " )) + stlStr(comboCamera->GetValue()); statusMessage(s.c_str(),MESSAGE_INFO); visControl.updateCameraComboBox(comboCamera); visControl.updateCameraPropGrid(gridCameraProperties, visControl.state.getActiveCam()); panelTop->forceRedraw(); setSaveStatus(); } } void MainWindowFrame::OnComboCamera(wxCommandEvent &event) { //Set the active camera wxListUint *l; l =(wxListUint*) comboCamera->GetClientObject(comboCamera->GetSelection()); visControl.setActiveCam(l->value); visControl.updateCameraPropGrid(gridCameraProperties,l->value); std::string s = std::string(TRANS("Restored camera: ") ) +stlStr(comboCamera->GetValue()); statusMessage(s.c_str(),MESSAGE_INFO); panelTop->forceRedraw(); setSaveStatus(); } void MainWindowFrame::OnComboCameraSetFocus(wxFocusEvent &event) { if(!haveSetComboCamText) { //Even if we have int pos; pos = comboCamera->FindString(comboCamera->GetValue()); //clear the text if it is the introduction string, or something // we don't have in the camera if(pos == wxNOT_FOUND) comboCamera->SetValue(wxT("")); haveSetComboCamText=true; event.Skip(); return; } event.Skip(); } void MainWindowFrame::OnComboStashSetFocus(wxFocusEvent &event) { if(!haveSetComboStashText) { comboStash->SetValue(wxT("")); haveSetComboStashText=true; event.Skip(); return; } event.Skip(); } void MainWindowFrame::OnComboFilterEnter(wxCommandEvent &event) { if(currentlyUpdatingScene || refreshThreadActive()) { ASSERT(false); //this should not happen return; } OnComboFilter(event); } void MainWindowFrame::OnComboFilter(wxCommandEvent &event) { if(currentlyUpdatingScene) return; size_t filterId; if(!getTreeFilterId(treeFilters->GetSelection(),filterId)) { if(treeFilters->GetCount()) statusMessage(TRANS("Select an item from the filter tree before choosing a new filter")); else statusMessage(TRANS("Load data source (file->open) before choosing a new filter")); comboFilters->SetSelection(wxNOT_FOUND); comboFilters->ChangeValue(TRANS(ADD_FILTER_TEXT)); return; } //Perform the appropriate action for the particular filter, //or use the default action for every other filter bool haveErr=false; //Convert the string into a filter ID based upon our mapping wxString s; s=comboFilters->GetString(event.GetSelection()); size_t filterType; filterType=filterMap[stlStr(s)]; ASSERT(stlStr(s) == TRANS(comboFilters_choices[filterType])); Filter *f; switch(comboFiltersTypeMapping[filterType]) { case FILTER_TYPE_RANGEFILE: { ///Prompt user for file wxFileDialog wxF(this,TRANS("Select RNG File..."),wxT(""),wxT(""), TRANS(RANGEFILE_WX_CONSTANT),wxFD_OPEN|wxFD_FILE_MUST_EXIST); if( (wxF.ShowModal() == wxID_CANCEL)) { haveErr=true; break; } //Load rangefile & construct filter f=configFile.getDefaultFilter(FILTER_TYPE_RANGEFILE); std::string dataFile = stlStr(wxF.GetPath()); RangeFileFilter *r = (RangeFileFilter*)f; r->setRangeFilename(dataFile); if(!r->updateRng()) { std::string errString; errString = TRANS("Failed reading range file."); errString += "\n"; errString+=r->getRange().getErrString(); wxErrMsg(this,TRANS("Error loading file"),errString); delete f; haveErr=true; break; } break; } default: { ASSERT(filterType < FILTER_TYPE_ENUM_END); //Generate the appropriate filter f=configFile.getDefaultFilter(comboFiltersTypeMapping[filterType]); } } if(haveErr) { //Clear the combo box comboFilters->SetSelection(wxNOT_FOUND); comboFilters->ChangeValue(TRANS(ADD_FILTER_TEXT)); return; } //Add the filter to viscontrol visControl.state.treeState.addFilter(f,false,filterId); //Rebuild tree control updateWxTreeCtrl(treeFilters,f); if(checkAutoUpdate->GetValue()) doSceneUpdate(); comboFilters->SetSelection(wxNOT_FOUND); comboFilters->ChangeValue(TRANS(ADD_FILTER_TEXT)); //update prop grid #ifdef FIX_WXPROPGRID_16222 ASSERT(!backFilterPropGrid); #endif updateFilterPropertyGrid(gridFilterPropGroup,f); } bool MainWindowFrame::doSceneUpdate(bool ensureVisible) { //Update scene ASSERT(!currentlyUpdatingScene); //Suspend the update timer, and start the progress timer updateTimer->Stop(); currentlyUpdatingScene=true; haveAborted=false; statusMessage("",MESSAGE_NONE); noteDataView->SetPageText(NOTE_CONSOLE_PAGE_OFFSET,TRANS("Cons.")); //Disable tree filters,refresh button and undo setLockUI(true); if(!requireFirstUpdate) textConsoleOut->Clear(); //Set focus on the main frame itself, so that we can catch escape key presses SetFocus(); wxBusyCursor busyCursor; //reset the progress timer animation visControl.scene.resetProgressAnim(); ensureResultVisible=ensureVisible; ASSERT(!refreshControl); refreshControl = new RefreshController(visControl.state.treeState); refreshThread=new RefreshThread(this,refreshControl); progressTimer->Start(PROGRESS_TIMER_DELAY); refreshThread->Create(); refreshThread->Run(); return true; } void MainWindowFrame::updateWxTreeCtrl( wxTreeCtrl *t, const Filter *f) { programmaticEvent=true; //This routines causes, (during the call..) wx to process the tree // selection code. we have to block the selection processing // with the programmaticEvent var visControl.updateWxTreeCtrl(t,f); programmaticEvent=false; } void MainWindowFrame::finishSceneUpdate(unsigned int errCode) { ASSERT(refreshThread); //If there was an error, then //display it if(errCode) { const ProgressData &p=refreshControl->curProg; statusTimer->Start(STATUS_TIMER_DELAY); if(errCode) { std::string errString; //FIXME: This is a hack where we use the numerical value to encode the error's source. //We should not do this, but instead replace the errCode with an error object that contains both code, object and some way to extract the string if(errCode == FILTER_ERR_ABORT) { errString = TRANS("Refresh Aborted."); MainFrame_statusbar->SetStatusText("",1); } else if(errCode getErrString(errCode); } else { errString=FilterTree::getRefreshErrString(errCode); } statusMessage(errString.c_str(),MESSAGE_ERROR); } } else { visControl.updateScene(refreshControl); updateProgressStatus(); } currentlyUpdatingScene=false; //Restore the UI elements to their interactive state setLockUI(false); panelSpectra->Refresh(false); updateEditRangeMenu(); //Add (or hide) a little "Star" to inform the user there is some info available if(textConsoleOut->IsEmpty() || noteDataView->GetSelection()==NOTE_CONSOLE_PAGE_OFFSET) noteDataView->SetPageText(NOTE_CONSOLE_PAGE_OFFSET,TRANS("Cons.")); else { #if defined(__WIN32) || defined(__WIN64) noteDataView->SetPageText(NOTE_CONSOLE_PAGE_OFFSET,TRANS("*Cons.")); #else noteDataView->SetPageText(NOTE_CONSOLE_PAGE_OFFSET,TRANS("§Cons.")); #endif } setFilterTreeAnalysisImages(); visControl.updateRawGrid(); setSaveStatus(); //Force a paint update for the scene panelTop->forceRedraw(); } void MainWindowFrame::OnFinishRefreshThread(wxCommandEvent &event) { ASSERT(refreshControl); //The tree itself should not be refreshing once the thread has completed. ASSERT(!visControl.state.treeState.isRefreshing()); progressTimer->Stop(); vector > consoleMessages; consoleMessages=refreshControl->getConsoleMessages(); const Filter *lastFilter =0; for(size_t ui=0; uiAppendText("-------------\n"); textConsoleOut->AppendText(consoleMessages[ui].first->getUserString() + "\n"); textConsoleOut->AppendText("-------------\n"); } textConsoleOut->AppendText(consoleMessages[ui].second + "\n"); } textConsoleOut->AppendText("\n"); finishSceneUpdate((unsigned int)event.GetInt()); //First wait for the refresh thread to terminate refreshThread->Wait(); delete refreshThread; refreshThread=0; delete refreshControl; refreshControl=0; if(!event.GetInt()) { //Set the progress string to complete, if no error MainFrame_statusbar->SetStatusText("",0); MainFrame_statusbar->SetStatusText(TRANS("Complete"),1); MainFrame_statusbar->SetStatusText("",2); } if(ensureResultVisible) { //If we are using the default camera, //move it to make sure that it is visible if(visControl.state.getNumCams() == 1) visControl.scene.ensureVisible(CAMERA_DIR_YPLUS); ensureResultVisible=false; } //restart the update timer, to check for updates from the backend updateTimer->Start(UPDATE_TIMER_DELAY); } void MainWindowFrame::setFilterTreeAnalysisImages() { vector lastErrs; visControl.state.treeState.getAnalysisResults(lastErrs); //Show the error button if required btnFilterTreeErrs->Show(!lastErrs.empty()); if(lastErrs.empty()) { treeFilters->AssignImageList(NULL); return; } //Maps filters to their maximal severity level map severityMapping; for(size_t ui=0;ui::iterator it; it = severityMapping.find(filt); //If doesn't exist, put one in. If it does exist, keep only max. severity msg if(it == severityMapping.end()) severityMapping[filt] = lastErrs[ui].severity; else it->second = std::max(lastErrs[ui].severity,severityMapping[filt]); } } //Map filters into icons map iconSettings; { //Maps particular severity values into icons map severityIconMapping; severityIconMapping[ANALYSE_SEVERITY_ERROR] = wxART_ERROR; severityIconMapping[ANALYSE_SEVERITY_WARNING] =wxART_WARNING; for(map::const_iterator it=severityMapping.begin();it!=severityMapping.end(); ++it) { size_t id; id=visControl.state.treeState.getIdByFilter(it->first); iconSettings[id] = severityIconMapping[it->second]; } } //apply the filter->icon mapping setWxTreeImages(treeFilters,iconSettings); } void MainWindowFrame::OnStatusBarTimer(wxTimerEvent &event) { if(statusQueue.empty()) { //clear the status bar colour, then wipe the status text from each field MainFrame_statusbar->SetBackgroundColour(wxNullColour); for(unsigned int ui=0; ui<3; ui++) MainFrame_statusbar->SetStatusText(wxT(""),ui); //Stop the status timer, as we are done statusTimer->Stop(); } else { //update the status bar with the next // message std::string msg,tmpStr; if(statusQueue.size() > 1) { stream_cast(tmpStr,statusQueue.size()); msg = tmpStr + string(" ") + TRANS("msgs"); msg+=" : "; } msg+= statusQueue.front().second, showStatusMessage(msg.c_str(), statusQueue.front().first); statusQueue.pop_front(); } } void MainWindowFrame::OnProgressTimer(wxTimerEvent &event) { updateProgressStatus(); } void MainWindowFrame::OnAutosaveTimer(wxTimerEvent &event) { //Save a state file to the configuration dir //with the title "autosave.xml" // wxString filePath = (configFile.getConfigDir()); unsigned int pid; pid = wxGetProcessId(); std::string pidStr; stream_cast(pidStr,pid); filePath+=wxFileName::GetPathSeparator()+ string(AUTOSAVE_PREFIX) + (pidStr) + string(AUTOSAVE_SUFFIX); //Save to the autosave file std::string s; s= stlStr(filePath); //Only save if we have autosave data if(visControl.state.hasStateData()) { std::map dummyMap; if(visControl.state.save(s.c_str(),dummyMap,false)) statusMessage(TRANS("Autosave complete."),MESSAGE_INFO); else { //The save failed, but may have left an incomplete file lying around if(wxFileExists(filePath)) wxRemoveFile(filePath); } } } void MainWindowFrame::OnUpdateTimer(wxTimerEvent &event) { programmaticEvent=true; //TODO: HACK AROUND: force tree filter to relayout under wxGTK and Mac #ifndef __WXMSW__ //Note: Calling this under windows causes the dropdown box that hovers over the top of this to //be closed, rendering the dropdown useless. That took ages to work out. treeFilters->GetParent()->Layout(); #endif if(requireFirstUpdate && !refreshThreadActive()) { doSceneUpdate(); requireFirstUpdate=false; } //see if we need to update the post effects due to user interaction //with the crop panels if(panelFxCropOne->hasUpdate() || panelFxCropTwo->hasUpdate()) { updatePostEffects(); panelFxCropOne->clearUpdate(); panelFxCropOne->clearUpdate(); } //Check viscontrol to see if it needs an update, such as //when the user interacts with an object when it is not //in the process of refreshing. //Don't attempt to update if already updating, or last //update aborted bool visUpdates=visControl.state.treeState.hasUpdates(); bool monitorUpdates=visControl.state.treeState.hasMonitorUpdates(); //I can has updates? if((visUpdates || plotUpdates|| monitorUpdates ) && !refreshThreadActive()) { if(visUpdates) visControl.state.treeState.applyBindingsToTree(); if(plotUpdates) { //FIXME: Hack. Rather than simply clearing the //cache globally, consider actually working out //which filter had the update, and refreshing that //filter only. Here we assume that only Rangefiles //can trigger an update visControl.state.treeState.clearCacheByType(FILTER_TYPE_RANGEFILE); } doSceneUpdate(); } plotUpdates=false; //Check the openGL pane to see if the camera property grid needs refreshing if(panelTop->hasCameraUpdates()) { //Use the current combobox value to determine which camera is the //current camera in the property grid visControl.transferSceneCameraToState(); int n = comboCamera->FindString(comboCamera->GetValue()); if(n != wxNOT_FOUND) { wxListUint *l; l =(wxListUint*) comboCamera->GetClientObject(n); visControl.updateCameraPropGrid(gridCameraProperties,l->value); } panelTop->clearCameraUpdates(); setSaveStatus(); } if(visUpdates) { size_t filterId; if(!getTreeFilterId(treeFilters->GetSelection(),filterId)) { programmaticEvent=false; return; } visControl.updateFilterPropGrid(gridFilterPropGroup,filterId); } programmaticEvent=false; } void MainWindowFrame::statusMessage(const char *message, unsigned int type) { if(type == MESSAGE_NONE) { statusTimer->Stop(); statusQueue.clear(); //clear the status bar colour, then wipe the status text from each field MainFrame_statusbar->SetBackgroundColour(wxNullColour); for(unsigned int ui=0; ui<3; ui++) MainFrame_statusbar->SetStatusText(wxT(""),ui); } else { if(statusTimer->IsRunning()) { //go through and strip // other hints for(list >::iterator it=statusQueue.begin(); it!=statusQueue.end(); ) { if(it->first != MESSAGE_HINT) { ++it; continue; } it=statusQueue.erase(it); } //Emplace our message statusQueue.push_back(make_pair(type,message)); //keep only unique messages list >::iterator tmpIt; tmpIt= std::unique(statusQueue.begin(),statusQueue.end()); statusQueue.erase(tmpIt,statusQueue.end()); if(!statusQueue.empty()) showStatusMessage(statusQueue.begin()->second.c_str(),statusQueue.begin()->first); } else { showStatusMessage(message,type); statusTimer->Start(STATUS_TIMER_DELAY); } } } void MainWindowFrame::showStatusMessage(const char *message, unsigned int type) { //Wx does not support statusbar colouring under MSW // using this can result in visual oddness #if !(defined(__WIN32) || defined(__WIN64)) switch(type) { case MESSAGE_ERROR: MainFrame_statusbar->SetBackgroundColour(*wxGREEN); break; case MESSAGE_INFO: MainFrame_statusbar->SetBackgroundColour(*wxCYAN); break; case MESSAGE_HINT: MainFrame_statusbar->SetBackgroundColour(wxNullColour); break; default: ASSERT(false); } #endif MainFrame_statusbar->SetStatusText((message),0); } void MainWindowFrame::updateProgressStatus() { //we can get some "left over" events that are queued but not processed // from the main thread if(!refreshThreadActive()) return; std::string progressString,filterProg; //If we have no tree, don't update the progress if(!visControl.state.treeState.size()) return; //Request a panel refresh, so we update the opengl spinner panelTop->Refresh(); //The refresh should still be present if we are using this function if(haveAborted) { progressString=TRANS("Aborting...."); progressTimer->Stop(); //Supress any future events visControl.scene.progressCircle.setMaxStep(0); } else { //Check for new progress data const ProgressData &p=refreshControl->curProg; ASSERT(p.filterProgress <=100 || p.filterProgress==(unsigned int) -1); if(p == lastProgressData || !p.maxStep) return; //This shouldn't happen, but prevent >100% progress from being reported unsigned int cappedProgress; if (p.filterProgress!=(unsigned int)-1) cappedProgress = std::min(p.filterProgress,(unsigned int)100); else cappedProgress = 0; //Inform progress circle in scene about current progress visControl.scene.progressCircle.setCurFilter(p.totalProgress); visControl.scene.progressCircle.setMaxStep(p.maxStep); visControl.scene.progressCircle.setNumFilters(p.totalNumFilters); visControl.scene.progressCircle.setProgress(cappedProgress); visControl.scene.progressCircle.setStep(p.step); lastProgressData=p; //Update the text progress { ASSERT(p.totalProgress <= visControl.state.treeState.size()); //Create a string from the total and percentile progresses std::string totalProg,totalCount,step,maxStep; stream_cast(filterProg,cappedProgress); stream_cast(totalProg,p.totalProgress); stream_cast(totalCount,p.totalNumFilters); stream_cast(step,p.step); stream_cast(maxStep,p.maxStep); ASSERT(p.step <=p.maxStep); if(p.curFilter) { if(!p.maxStep) progressString = totalProg+TRANS(" of ") + totalCount + " (" + p.curFilter->typeString() +")"; else { progressString = totalProg+TRANS(" of ") + totalCount + " (" + p.curFilter->typeString() + ", " + step + "/" + maxStep + ": " + p.stepName+")"; } } else { //If we have no filter, then we must be done if the totalProgress is //equal to the total count. if(totalProg == totalCount) progressString = TRANS("Updated."); else progressString = totalProg + TRANS(" of ") + totalCount; } //Show the abort notice if we have hit 100% if( p.filterProgress == (unsigned int) -1) { filterProg=TRANS("Calculating..."); } else if(p.filterProgress != 100 && p.filterProgress < p.totalNumFilters) filterProg+=TRANS("\% Done (Esc aborts)"); else filterProg+=TRANS("\% Done"); } } MainFrame_statusbar->SetBackgroundColour(wxNullColour); MainFrame_statusbar->SetStatusText(wxT(""),0); MainFrame_statusbar->SetStatusText((progressString),1); MainFrame_statusbar->SetStatusText((filterProg),2); } void MainWindowFrame::updatePostEffects() { visControl.scene.clearEffects(); //Do we need post-processing? #ifndef APPLE_EFFECTS_WORKAROUND if(!checkPostProcessing->IsChecked()) return; #endif if( checkFxCrop->IsChecked()) { wxString ws; string s; ws=comboFxCropAxisOne->GetValue(); s =stlStr(ws); //String encodes permutation (eg "x-y"). unsigned int axisPerm[4]; axisPerm[0] =(unsigned int)(s[0] -'x')*2; axisPerm[1] = (unsigned int)(s[0] -'x')*2+1; axisPerm[2] =(unsigned int)(s[2] -'x')*2; axisPerm[3] = (unsigned int)(s[2] -'x')*2+1; //Get the crop data, and generate an effect BoxCropEffect *b = new BoxCropEffect; //Assume, that unless otherwise specified //the default crop value is zero float array[6]; float tmpArray[4]; for(unsigned int ui=0;ui<6;ui++) array[ui]=0; //Permute the indices for the crop fractions, then assign panelFxCropOne->getCropValues(tmpArray); for(unsigned int ui=0;ui<4;ui++) array[axisPerm[ui]] = tmpArray[ui]; ws=comboFxCropAxisTwo->GetValue(); s =stlStr(ws); axisPerm[0] =(unsigned int)(s[0] -'x')*2; axisPerm[1] = (unsigned int)(s[0] -'x')*2+1; axisPerm[2] =(unsigned int)(s[2] -'x')*2; axisPerm[3] = (unsigned int)(s[2] -'x')*2+1; panelFxCropTwo->getCropValues(tmpArray); for(unsigned int ui=0;ui<4;ui++) array[axisPerm[ui]] = tmpArray[ui]; b->setFractions(array); //Should we be using the camera frame? b->useCamCoords(checkFxCropCameraFrame->IsChecked()); //Send the effect to the scene if(b->willDoSomething()) { visControl.scene.addEffect(b); visControl.scene.setEffects(true); //Update the dx,dy and dz boxes BoundCube bcTmp; bcTmp=visControl.scene.getBound(); b->getCroppedBounds(bcTmp); if(!checkFxCropCameraFrame->IsChecked()) { float delta; delta=bcTmp.getBound(0,1)-bcTmp.getBound(0,0); stream_cast(s,delta); textFxCropDx->SetValue((s)); delta=bcTmp.getBound(1,1)-bcTmp.getBound(1,0); stream_cast(s,delta); textFxCropDy->SetValue((s)); delta=bcTmp.getBound(2,1)-bcTmp.getBound(2,0); stream_cast(s,delta); textFxCropDz->SetValue((s)); } else { textFxCropDx->SetValue(wxT("")); textFxCropDy->SetValue(wxT("")); textFxCropDz->SetValue(wxT("")); } //well, we dealt with this update. panelFxCropOne->clearUpdate(); panelFxCropTwo->clearUpdate(); } else { textFxCropDx->SetValue(wxT("")); textFxCropDy->SetValue(wxT("")); textFxCropDz->SetValue(wxT("")); delete b; //we should let this return true, //so that an update takes hold } } if(checkFxEnableStereo->IsChecked()) { AnaglyphEffect *anaglyph = new AnaglyphEffect; unsigned int sel; sel=comboFxStereoMode->GetSelection(); anaglyph->setMode(sel); int v=sliderFxStereoBaseline->GetValue(); float shift=((float)v)*BASELINE_SHIFT_FACTOR; anaglyph->setBaseShift(shift); anaglyph->setFlip(checkFxStereoLensFlip->IsChecked()); visControl.scene.addEffect(anaglyph); } panelTop->forceRedraw(); } void MainWindowFrame::updateFxUI(const vector &effs) { //Here we pull information out from the effects and then //update the ui controls accordingly Freeze(); for(unsigned int ui=0;uigetType()) { case EFFECT_BOX_CROP: { const BoxCropEffect *e=(const BoxCropEffect*)effs[ui]; //Enable the checkbox checkFxCrop->SetValue(true); //set the combos back to x-y y-z comboFxCropAxisOne->SetSelection(0); comboFxCropAxisTwo->SetSelection(1); //Temporarily de-link the panels panelFxCropOne->link(0,CROP_LINK_NONE); panelFxCropTwo->link(0,CROP_LINK_NONE); //Set the crop values for(unsigned int ui=0;ui<6;ui++) { if(ui<4) panelFxCropOne->setCropValue(ui, e->getCropValue(ui)); else if(ui > 2) panelFxCropTwo->setCropValue(ui-2, e->getCropValue(ui)); } //Ensure that the values that went in were valid panelFxCropOne->makeCropValuesValid(); panelFxCropTwo->makeCropValuesValid(); //Restore the panel linkage panelFxCropOne->link(panelFxCropTwo,CROP_LINK_BOTH); panelFxCropTwo->link(panelFxCropOne,CROP_LINK_BOTH); break; } case EFFECT_ANAGLYPH: { const AnaglyphEffect *e=(const AnaglyphEffect*)effs[ui]; //Set the slider from the base-shift value float shift; shift=e->getBaseShift(); sliderFxStereoBaseline->SetValue( (unsigned int)(shift/BASELINE_SHIFT_FACTOR)); //Set the stereo drop down colour unsigned int mode; mode = e->getMode(); ASSERT(mode < comboFxStereoMode->GetCount()); comboFxStereoMode->SetSelection(mode); //Enable the stereo mode checkFxEnableStereo->SetValue(true); break; } default: ASSERT(false); } } //Re-enable the effects UI as needed if(!effs.empty()) { #ifndef APPLE_EFFECTS_WORKAROUND checkPostProcessing->SetValue(true); noteFxPanelCrop->Enable(); noteFxPanelStereo->Enable(); #endif visControl.scene.setEffects(true); } Thaw(); } //This routine is used by other UI processes to trigger an abort void MainWindowFrame::OnProgressAbort(wxCommandEvent &event) { if(!haveAborted) visControl.state.treeState.setAbort(); haveAborted=true; } void MainWindowFrame::OnViewFullscreen(wxCommandEvent &event) { if(programmaticEvent) return; programmaticEvent=true; ShowFullScreen(!fullscreenState); fullscreenState=(fullscreenState+1)%2; programmaticEvent=false; } void MainWindowFrame::OnButtonRefresh(wxCommandEvent &event) { //TODO: Remove this line when wx bug 16222 is fixed if(!gridCameraProperties || !gridFilterPropGroup) return; //Run abort code as needed if(currentlyUpdatingScene || refreshThreadActive()) { OnProgressAbort(event); return; } //dirty hack to get keyboard state. wxMouseState wxm = wxGetMouseState(); if(wxm.ShiftDown()) { visControl.state.treeState.purgeFilterCache(); } else { if(checkCaching->IsChecked()) statusMessage(TRANS("Tip: You can shift-click to force full refresh, if required"),MESSAGE_HINT); } doSceneUpdate(); } void MainWindowFrame::OnRawDataUnsplit(wxSplitterEvent &event) { checkMenuRawDataPane->Check(false); configFile.setPanelEnabled(CONFIG_STARTUPPANEL_RAWDATA,false); } void MainWindowFrame::OnFilterPropDoubleClick(wxSplitterEvent &event) { //Disallow unsplitting of filter property panel event.Veto(); } void MainWindowFrame::OnControlSplitMove(wxSplitterEvent &event) { //For some reason, the damage rectangle is not updated // for the tree ctrl treeFilters->Refresh(); } void MainWindowFrame::OnTopBottomSplitMove(wxSplitterEvent &event) { Refresh(); panelTop->forceRedraw(); } void MainWindowFrame::OnFilterSplitMove(wxSplitterEvent &event) { //For some reason, the damage rectangle is not updated // for the tree ctrl treeFilters->Refresh(); } void MainWindowFrame::OnControlUnsplit(wxSplitterEvent &event) { //Make sure that the LHS panel is removed, rather than the default (right) splitLeftRight->Unsplit(panelLeft); checkMenuControlPane->Check(false); configFile.setPanelEnabled(CONFIG_STARTUPPANEL_CONTROL,false); } void MainWindowFrame::OnSpectraUnsplit(wxSplitterEvent &event) { checkMenuSpectraList->Check(false); configFile.setPanelEnabled(CONFIG_STARTUPPANEL_PLOTLIST,false); } void MainWindowFrame::OnButtonGridCopy(wxCommandEvent &event) { gridRawData->copyData(); } void MainWindowFrame::OnButtonGridSave(wxCommandEvent &event) { if(!gridRawData->GetNumberRows()||!gridRawData->GetNumberCols()) { statusMessage(TRANS("No data to save"),MESSAGE_ERROR); return; } gridRawData->saveData(); } void MainWindowFrame::OnCheckAlpha(wxCommandEvent &event) { visControl.scene.setAlpha(event.IsChecked()); panelTop->forceRedraw(); } void MainWindowFrame::OnCheckLighting(wxCommandEvent &event) { visControl.scene.setLighting(event.IsChecked()); panelTop->forceRedraw(); } void MainWindowFrame::OnCheckCacheEnable(wxCommandEvent &event) { if(event.IsChecked()) { visControl.state.treeState.setCachePercent((unsigned int)spinCachePercent->GetValue()); } else { visControl.state.treeState.setCachePercent(0); visControl.state.treeState.purgeFilterCache(); doSceneUpdate(); } } void MainWindowFrame::OnCheckWeakRandom(wxCommandEvent &event) { Filter::setStrongRandom(!event.IsChecked()); doSceneUpdate(); } void MainWindowFrame::OnCheckLimitOutput(wxCommandEvent &event) { size_t limitVal; if(event.IsChecked()) { bool isOK=validateTextAsStream(textLimitOutput,limitVal); if(!isOK) return; } else limitVal=0; visControl.setIonDisplayLimit(limitVal); doSceneUpdate(); configFile.setMaxPoints(limitVal); } void MainWindowFrame::OnTextLimitOutput(wxCommandEvent &event) { //Under GTK wx3.0, this fires during object construction if(!initedOK) return; size_t limitVal; bool isOK=validateTextAsStream(textLimitOutput,limitVal); if(!isOK) return; if(checkLimitOutput->IsChecked()) { visControl.setIonDisplayLimit(limitVal); configFile.setMaxPoints(limitVal); } } void MainWindowFrame::OnTextLimitOutputEnter(wxCommandEvent &event) { size_t limitVal; bool isOK=validateTextAsStream(textLimitOutput,limitVal); if(!isOK) return; if(checkLimitOutput->IsChecked()) { visControl.setIonDisplayLimit(limitVal); doSceneUpdate(); } //If we set the limit to zero this is a special case // that disables the limit, so untick the checkbox to make it clear to the // user that we are not using this any more if(limitVal == 0) checkLimitOutput->SetValue(false); } void MainWindowFrame::OnCacheRamUsageSpin(wxSpinEvent &event) { ASSERT(event.GetPosition() >= 0 &&event.GetPosition()<=100); visControl.state.treeState.setCachePercent(event.GetPosition()); } void MainWindowFrame::OnButtonRemoveCam(wxCommandEvent &event) { std::string camName; camName=stlStr(comboCamera->GetValue()); if (!camName.size()) return; int n = comboCamera->FindString(comboCamera->GetValue()); if ( n!= wxNOT_FOUND ) { wxListUint *l; l =(wxListUint*) comboCamera->GetClientObject(n); visControl.state.removeCam(l->value); comboCamera->Delete(n); programmaticEvent=true; comboCamera->SetValue(wxT("")); gridCameraProperties->Clear(); programmaticEvent=false; setSaveStatus(); // There is one camera that we cannot access // TODO: This logic should not be here, but in the widget update if(visControl.state.getNumCams() > 1) { visControl.updateCameraComboBox(comboCamera); visControl.updateCameraPropGrid(gridCameraProperties,visControl.state.getActiveCam()); } else gridCameraProperties->Clear(); } } void MainWindowFrame::OnSpectraListbox(wxCommandEvent &event) { //This function gets called programatically by //doSceneUpdate. Prevent interaction. if(refreshThreadActive()) return; //Get the currently selected item //Spin through the selected items for(unsigned int ui=0;uiGetCount(); ui++) { unsigned int plotID; //Retrieve the uniqueID plotID = visControl.getPlotID(ui); panelSpectra->setPlotVisible(plotID,plotList->IsSelected(ui)); } panelSpectra->Refresh(); //The raw grid contents may change due to the list selection //change. Update the grid visControl.updateRawGrid(); } void MainWindowFrame::OnClose(wxCloseEvent &event) { if(refreshThreadActive()) { if(!haveAborted) { refreshThread->abort(); haveAborted=true; statusMessage(TRANS("Aborting..."),MESSAGE_INFO); return; } else { wxMessageDialog wxD(this, TRANS("Waiting for refresh to abort. Exiting could lead to the program backgrounding. Exit anyway? "), TRANS("Confirmation request"),wxOK|wxCANCEL|wxICON_ERROR); if(wxD.ShowModal() != wxID_OK) { event.Veto(); return; } } } else { //If the program is being forced by the OS to shut down, don't ask the user for abort, // as we can't abort it anyway. if(event.CanVeto()) { if(visControl.stateIsModified()) { //Prompt for close wxMessageDialog wxD(this, TRANS("Are you sure you wish to exit 3Depict?"),\ TRANS("Confirmation request"),wxOK|wxCANCEL|wxICON_ERROR); if(wxD.ShowModal() != wxID_OK) { event.Veto(); return; } } } } //Remove the autosave file if it exists, as we are shutting down neatly. //Get self PID std::string pidStr; unsigned int pid; pid=wxGetProcessId(); stream_cast(pidStr,pid); wxString filePath =(configFile.getConfigDir()); filePath+=string("/") + string(AUTOSAVE_PREFIX) + pidStr+ string(AUTOSAVE_SUFFIX); if(wxFileExists(filePath)) wxRemoveFile(filePath); //Remember current window size for next time wxSize winSize; winSize=GetSize(); configFile.setInitialAppSize(winSize.GetWidth(),winSize.GetHeight()); //Remember the sash positions for next time, as fractional values fo // the window size, but only if split (as otherwise frac could exceed 1) float frac; if(splitLeftRight->IsSplit()) { frac =(float) splitLeftRight->GetSashPosition()/winSize.GetWidth(); configFile.setLeftRightSashPos(frac); } if(splitTopBottom->IsSplit()) { frac = (float) splitTopBottom->GetSashPosition()/winSize.GetHeight(); configFile.setTopBottomSashPos(frac); } if(filterSplitter->IsSplit()) { frac= (float)filterSplitter->GetSashPosition()/winSize.GetHeight(); configFile.setFilterSashPos(frac); } if(splitterSpectra->IsSplit()) { frac = (float)splitterSpectra->GetSashPosition()/winSize.GetWidth(); configFile.setPlotListSashPos(frac); } winSize=noteDataView->GetSize(); //Try to save the configuration configFile.write(); if(verCheckThread) { if(!verCheckThread->isComplete()) { //Kill it. verCheckThread->Kill(); } else verCheckThread->Wait(); } //Terminate the program Destroy(); } void MainWindowFrame::realignCameraButton(unsigned int direction) { if(checkAlignCamResize->IsChecked()) visControl.scene.ensureVisible(direction); else { //move the camera from its current position to the target direction Camera *cam=visControl.scene.getActiveCam(); if(cam->type() == CAM_LOOKAT) { BoundCube bc = visControl.scene.getBound(); CameraLookAt *cLook=(CameraLookAt*)cam; cLook->setTarget(bc.getCentroid()); cLook->repositionAroundTarget(direction); //set the "up" direction that we use by default Point3D p; switch(direction) { case CAMERA_DIR_XPLUS: p=Point3D(0,0,1); break; case CAMERA_DIR_YPLUS: p=Point3D(0,0,1); break; case CAMERA_DIR_ZPLUS: p=Point3D(0,1,0); break; case CAMERA_DIR_XMINUS: p=Point3D(0,0,-1); break; case CAMERA_DIR_YMINUS: p=Point3D(0,0,-1); break; case CAMERA_DIR_ZMINUS: p=Point3D(0,-1,0); break; } cLook->setUpDirection(p); } } panelTop->forceRedraw(); } void MainWindowFrame::OnButtonAlignCameraXPlus(wxCommandEvent &event) { realignCameraButton(CAMERA_DIR_XPLUS); } void MainWindowFrame::OnButtonAlignCameraYPlus(wxCommandEvent &event) { realignCameraButton(CAMERA_DIR_YPLUS); } void MainWindowFrame::OnButtonAlignCameraZPlus(wxCommandEvent &event) { realignCameraButton(CAMERA_DIR_ZPLUS); } void MainWindowFrame::OnButtonAlignCameraXMinus(wxCommandEvent &event) { realignCameraButton(CAMERA_DIR_XMINUS); } void MainWindowFrame::OnButtonAlignCameraYMinus(wxCommandEvent &event) { realignCameraButton(CAMERA_DIR_YMINUS); } void MainWindowFrame::OnButtonAlignCameraZMinus(wxCommandEvent &event) { realignCameraButton(CAMERA_DIR_ZMINUS); } void MainWindowFrame::OnCheckPostProcess(wxCommandEvent &event) { #ifdef APPLE_EFFECTS_WORKAROUND //FIXME: I have disabled this under apple ASSERT(false); #endif //Disable the entire UI panel noteFxPanelCrop->Enable(event.IsChecked()); noteFxPanelStereo->Enable(event.IsChecked()); visControl.scene.setEffects(event.IsChecked()); updatePostEffects(); setSaveStatus(); panelTop->forceRedraw(); } void MainWindowFrame::OnFxCropCheck(wxCommandEvent &event) { //Disable/enable the other UI controls on the crop effects page //Include the text labels to give them that "greyed-out" look checkFxCropCameraFrame->Enable(event.IsChecked()); comboFxCropAxisOne->Enable(event.IsChecked()); panelFxCropOne->Enable(event.IsChecked()); comboFxCropAxisTwo->Enable(event.IsChecked()); panelFxCropTwo->Enable(event.IsChecked()); textFxCropDx->Enable(event.IsChecked()); textFxCropDy->Enable(event.IsChecked()); textFxCropDz->Enable(event.IsChecked()); labelFxCropDx->Enable(event.IsChecked()); labelFxCropDy->Enable(event.IsChecked()); labelFxCropDz->Enable(event.IsChecked()); setSaveStatus(); updatePostEffects(); } void MainWindowFrame::OnFxCropCamFrameCheck(wxCommandEvent &event) { updatePostEffects(); } void MainWindowFrame::OnFxCropAxisOne(wxCommandEvent &event) { linkCropWidgets(); updatePostEffects(); } void MainWindowFrame::OnFxCropAxisTwo(wxCommandEvent &event) { linkCropWidgets(); updatePostEffects(); } void MainWindowFrame::linkCropWidgets() { //Adjust the link mode for the //two crop panels as needed unsigned int linkMode=0; string first[2],second[2]; wxString s; string tmp; //TODO: Don't parse output, but actually // wire in axis selection s=comboFxCropAxisOne->GetValue(); tmp=stlStr(s); first[0]=tmp[0]; second[0]=tmp[2]; s=comboFxCropAxisTwo->GetValue(); tmp=stlStr(s); first[1]=tmp[0]; second[1]=tmp[2]; if(first[0] == first[1] && second[0] == second[1]) { //First and second axis match? then link both axes linkMode=CROP_LINK_BOTH; } else if(first[0] == second[1] && second[0] == first[1]) linkMode=CROP_LINK_BOTH_FLIP; //Fipped axis linkage else if(first[0] == first[1]) linkMode=CROP_LINK_LR; //left right libnkage else if(second[0] == second[1]) linkMode=CROP_LINK_TB; //top pottom linkage else if(second[0] == first[1]) { //tb-lr flip panelFxCropOne->link(panelFxCropTwo,CROP_LINK_TB_FLIP); panelFxCropTwo->link(panelFxCropOne,CROP_LINK_LR_FLIP); } else if(second[1]== first[0]) { //lr-tb flip panelFxCropOne->link(panelFxCropTwo,CROP_LINK_LR_FLIP); panelFxCropTwo->link(panelFxCropOne,CROP_LINK_TB_FLIP); } else { //Pigeonhole principle says we can't get here. ASSERT(false); } if(linkMode) { panelFxCropOne->link(panelFxCropTwo,linkMode); panelFxCropTwo->link(panelFxCropOne,linkMode); } } void MainWindowFrame::OnFxStereoEnable(wxCommandEvent &event) { comboFxStereoMode->Enable(event.IsChecked()); sliderFxStereoBaseline->Enable(event.IsChecked()); checkFxStereoLensFlip->Enable(event.IsChecked()); updatePostEffects(); } void MainWindowFrame::OnFxStereoLensFlip(wxCommandEvent &event) { updatePostEffects(); } void MainWindowFrame::OnFxStereoCombo(wxCommandEvent &event) { updatePostEffects(); } void MainWindowFrame::OnFxStereoBaseline(wxScrollEvent &event) { updatePostEffects(); } void MainWindowFrame::restoreConfigDefaults() { std::vector strVec; //Set the files that are listed in the recent files //menu configFile.getRecentFiles(strVec); for(unsigned int ui=0; uiAddFileToHistory((strVec[ui])); //Set the mouse zoom speeds float zoomRate,moveRate; zoomRate=configFile.getMouseZoomRate(); moveRate=configFile.getMouseMoveRate(); panelTop->setMouseZoomFactor((float)zoomRate/100.0f); panelTop->setMouseMoveFactor((float)moveRate/100.0f); //If the config file has a max points value stored, use it, // but don't force a refresh, as we will do that later if(configFile.getHaveMaxPoints()) { std::string s; stream_cast(s,configFile.getMaxPoints()); textLimitOutput->SetValue((s)); visControl.setIonDisplayLimit(configFile.getMaxPoints()); } if(configFile.getWantStartupOrthoCam()) { visControl.state.setCamProperty(visControl.state.getActiveCam(), CAMERA_KEY_LOOKAT_PROJECTIONMODE,TRANS("Orthogonal")); visControl.setActiveCam(visControl.state.getActiveCam()); } } void MainWindowFrame::checkShowTips() { //Show startup tip dialog as needed if(configFile.wantStartupTips()) { std::string tipFile; tipFile=locateDataFile("startup-tips.txt"); if(!tipFile.empty()) { const unsigned int ROUGH_NUMBER_TIPS=22; wxTipProvider *tipProvider = wxCreateFileTipProvider((tipFile), (size_t) ((float)rand()/(float)RAND_MAX*(float)ROUGH_NUMBER_TIPS)); if(tipProvider) { bool wantTipsAgain=wxShowTip(this, tipProvider); delete tipProvider; configFile.setWantStartupTips(wantTipsAgain); } } else { WARN(false,"Tip file not found at startup, but user wanted it..."); } } } void MainWindowFrame::restoreConfigPanelDefaults() { //Set the panel defaults (hidden/shown) // and their sizes wxSize winSize; winSize=getNiceWindowSize(); float val,oldGravity; if(!configFile.getPanelEnabled(CONFIG_STARTUPPANEL_CONTROL)) { splitLeftRight->Unsplit(panelLeft); checkMenuControlPane->Check(false); } else { val=configFile.getLeftRightSashPos(); if(val > std::numeric_limits::epsilon()) { oldGravity=splitLeftRight->GetSashGravity(); splitLeftRight->SetSashGravity(1.0); splitLeftRight->SetSashPosition((int)(val*(float)winSize.GetWidth())); splitLeftRight->SetSashGravity(oldGravity); } } if(!configFile.getPanelEnabled(CONFIG_STARTUPPANEL_RAWDATA)) { splitTopBottom->Unsplit(); checkMenuRawDataPane->Check(false); } else { val=configFile.getTopBottomSashPos(); if(val > std::numeric_limits::epsilon()) { oldGravity=splitTopBottom->GetSashGravity(); splitTopBottom->SetSashGravity(1.0); splitTopBottom->SetSashPosition((int)(val*(float)winSize.GetHeight())); splitTopBottom->SetSashGravity(oldGravity); } } //Set default or nice position for plotlist panel if(!configFile.getPanelEnabled(CONFIG_STARTUPPANEL_PLOTLIST)) { splitterSpectra->Unsplit(); checkMenuSpectraList->Check(false); } else { winSize=noteDataView->GetSize(); val=configFile.getPlotListSashPos(); if(val > std::numeric_limits::epsilon()) { oldGravity=splitterSpectra->GetSashGravity(); splitterSpectra->SetSashGravity(1.0); splitterSpectra->SetSashPosition((int)(val*(float)winSize.GetWidth())); splitterSpectra->SetSashGravity(oldGravity); } } //set nice position for filter splitter (in left side of main window) if(configFile.configLoadedOK()) { val=configFile.getFilterSashPos(); winSize=noteData->GetSize(); if(val > std::numeric_limits::epsilon()) { oldGravity=filterSplitter->GetSashGravity(); filterSplitter->SetSashGravity(1.0); filterSplitter->SetSashPosition((int)(val*(float)winSize.GetHeight())); filterSplitter->SetSashGravity(oldGravity); } } } // wxGlade: add MainWindowFrame event handlers void MainWindowFrame::SetCommandLineFiles(wxArrayString &files) { textConsoleOut->Clear(); bool loadedOK=false; //Load them up as data. for(unsigned int ui=0;uiSetPageText(NOTE_CONSOLE_PAGE_OFFSET,TRANS("Cons.")); //Keep processing evt.Skip(); } void MainWindowFrame::OnCheckUpdatesThread(wxCommandEvent &evt) { //Check to see if we have a new version or not, and //what that version number is ASSERT(verCheckThread->isComplete()); //Check to see if we got the version number OK. // this might have failed, e.g. if the user has no net connection, // or the remote RSS is not parseable if(verCheckThread->isRetrieveOK()) { string remoteMax=verCheckThread->getVerStr().c_str(); vector maxVers; maxVers.push_back(remoteMax); maxVers.push_back(PROGRAM_VERSION); string s; if(getMaxVerStr(maxVers) !=PROGRAM_VERSION) { //Use status bar message to notify user about update s = string(TRANS("Update Notice: New version ")) + remoteMax + TRANS(" found online."); } else { s=string(TRANS("Online Check: " ))+string(PROGRAM_NAME) + TRANS(" is up-to-date."); } statusMessage(s.c_str(),MESSAGE_INFO); } //Wait for, then delete the other thread, as we are done with it verCheckThread->Wait(); verCheckThread=0; } void MainWindowFrame::checkReloadAutosave() { wxString configDirPath =(configFile.getConfigDir()); configDirPath+=("/") ; if(!wxDirExists(configDirPath)) return; //obtain a list of autosave xml files //-- wxArrayString *dirListing= new wxArrayString; std::string s; s=std::string(AUTOSAVE_PREFIX) + std::string("*") + std::string(AUTOSAVE_SUFFIX); wxString fileMask = (s); wxDir::GetAllFiles(configDirPath,dirListing,fileMask,wxDIR_FILES); if(!dirListing->GetCount()) { delete dirListing; return; } //-- unsigned int prefixLen; prefixLen = stlStr(configDirPath).size() + strlen(AUTOSAVE_PREFIX) + 1; //For convenience, Construct a mapping to the PIDs from the string //-- map autosaveNamePIDMap; for(unsigned int ui=0;uiGetCount(); ui++) { std::string tmp; tmp = stlStr(dirListing->Item(ui)); //File name should match specified glob. ASSERT(tmp.size() >=(strlen(AUTOSAVE_PREFIX) + strlen(AUTOSAVE_SUFFIX))); //Strip the non-glob bit out of the string tmp = tmp.substr(prefixLen-1,tmp.size()-(strlen(AUTOSAVE_SUFFIX) + prefixLen-1)); unsigned int pid; if(stream_cast(pid,tmp)) continue; autosaveNamePIDMap[stlStr(dirListing->Item(ui))] = pid; } delete dirListing; //-- //Filter on process existence and name match. //--- for(map::iterator it=autosaveNamePIDMap.begin(); it!=autosaveNamePIDMap.end();) { //Note that map does not have a return value for erase in C++second) && processMatchesName(it->second,PROGRAM_NAME) ) autosaveNamePIDMap.erase(it++); //Note postfix! else ++it; } //-- //A little messy, but handles two cases of dialog // one, where one file is either loaded, or deleted // two, where one of multiple files are either loaded, all deleted or none deleted vector removeFiles; //Do we want to full erase the files in removeFiles (true) // or move (false) bool doErase=false; if(autosaveNamePIDMap.size() == 1) { //If we have exactly one autosave, ask the user about loading it wxString filePath=(autosaveNamePIDMap.begin()->first); wxMessageDialog wxD(this, TRANS("An auto-save state was found, would you like to restore it?.") ,TRANS("Autosave"),wxCANCEL|wxOK|wxICON_QUESTION|wxYES_DEFAULT ); if(wxD.ShowModal()!= wxID_CANCEL) { if(!loadFile(filePath,false,true)) { doErase=true; statusMessage(TRANS("Unable to load autosave file.."),MESSAGE_ERROR); } else { doErase=false; requireFirstUpdate=true; //Prevent the program from allowing save menu usage //into autosave file std::string tmpStr; visControl.state.setFilename(tmpStr); setSaveStatus(); } removeFiles.push_back(stlStr(filePath)); } } else if(autosaveNamePIDMap.size() > 1) { //OK, so we have more than one autosave, from dead 3depict processes. //ask the user which one they would like to load vector > filenamesAndTimes; for(map::iterator it=autosaveNamePIDMap.begin(); it!=autosaveNamePIDMap.end();++it) { time_t timeStamp=wxFileModificationTime((it->first)); filenamesAndTimes.push_back(make_pair(timeStamp,it->first)); } //Sort filenamesAndTimes by decreasing age, so that newest appears at // top of dialog ComparePairFirstReverse cmp; std::sort(filenamesAndTimes.begin(),filenamesAndTimes.end(),cmp); vector autoSaveChoices; time_t now = wxDateTime::Now().GetTicks(); for(size_t ui=0;uisetItems(autoSaveChoices); int dlgResult; dlgResult=dlg->ShowModal(); //Show the dialog to get a choice from the user //We need to load a file if, and only if, // autosaves were not purged if(dlgResult == wxID_OK) { if(!dlg->removedItems()) { requireFirstUpdate=true; std::string tmpStr; tmpStr =filenamesAndTimes[dlg->getSelectedItem()].second; if(loadFile((tmpStr),false,true)) { //Prevent the program from allowing save menu usage //into autosave file doErase=true; } else doErase=false; //If it either does, or doesn't work, //there is little point in keeping it removeFiles.push_back(tmpStr); } else { for(unsigned int ui=0;uiremovedItems()) { for(unsigned int ui=0;uiEnable( visControl.stateIsModified() && visControl.state.getFilename().size()); } wxSize MainWindowFrame::getNiceWindowSize() const { wxDisplay *disp=new wxDisplay; wxRect r = disp->GetClientArea(); bool haveDisplaySizePref; unsigned int xPref,yPref; haveDisplaySizePref=configFile.getInitialAppSize(xPref,yPref); //So Min size trumps all // - then client area // - then saved setting // - then default size wxSize winSize; if(haveDisplaySizePref) winSize.Set(xPref,yPref); else { winSize.Set(DEFAULT_WIN_WIDTH,DEFAULT_WIN_HEIGHT); } //Override using minimal window sizes winSize.Set(std::max(winSize.GetWidth(),(int)MIN_WIN_WIDTH), std::max(winSize.GetHeight(),(int)MIN_WIN_HEIGHT)); //Shrink to display size, as needed winSize.Set(std::min(winSize.GetWidth(),r.GetWidth()), std::min(winSize.GetHeight(),r.GetHeight())); delete disp; return winSize; } void MainWindowFrame::set_properties() { // begin wxGlade: MainWindowFrame::set_properties SetTitle((PROGRAM_NAME)); comboFilters->SetSelection(-1); comboFilters->SetToolTip(TRANS("List of available filters")); #ifdef __APPLE__ treeFilters->SetToolTip(TRANS("Tree - drag to move items, hold ⌘ for copy. Tap delete to remove items")); #else treeFilters->SetToolTip(TRANS("Tree - drag to move items, hold Ctrl for copy. Tap delete to remove items.")); #endif checkAutoUpdate->SetToolTip(TRANS("Enable/Disable automatic updates of data when filter change takes effect")); checkAutoUpdate->SetValue(true); checkAlphaBlend->SetToolTip(TRANS("Enable/Disable \"Alpha blending\" (transparency) in rendering system. Blending is used to smooth objects (avoids artefacts known as \"jaggies\") and to make transparent surfaces. Disabling will provide faster rendering but look more blocky")); checkLighting->SetToolTip(TRANS("Enable/Disable lighting calculations in rendering, for objects that request this. Lighting provides important depth cues for objects comprised of 3D surfaces. Disabling may allow faster rendering in complex scenes")); checkWeakRandom->SetToolTip(TRANS("Enable/Disable weak randomisation (Galois linear feedback shift register). Strong randomisation uses a much slower random selection method, but provides better protection against inadvertent correlations, and is recommended for final analyses")); checkLimitOutput->SetToolTip(TRANS("Limit the number of points that can be displayed in the 3D scene. Does not affect filter tree calculations. Disabling this can severely reduce performance, due to large numbers of points being visible at once.")); checkCaching->SetToolTip(TRANS("Enable/Disable caching of intermediate results during filter updates. Disabling caching will use less system RAM, though changes to any filter property will cause the entire filter tree to be recomputed, greatly slowing computations")); gridCameraProperties->SetToolTip(TRANS("Camera data information")); noteCamera->SetScrollRate(10, 10); #ifndef APPLE_EFFECTS_WORKAROUND checkPostProcessing->SetToolTip(TRANS("Enable/disable visual effects on final 3D output")); #endif checkFxCrop->SetToolTip(TRANS("Enable cropping post-process effect")); comboFxCropAxisOne->SetSelection(0); comboFxCropAxisTwo->SetSelection(0); checkFxEnableStereo->SetToolTip(TRANS("Colour based 3D effect enable/disable - requires appropriate colour filter 3D glasses.")); comboFxStereoMode->SetToolTip(TRANS("Glasses colour mode")); comboFxStereoMode->SetSelection(0); sliderFxStereoBaseline->SetToolTip(TRANS("Level of separation between left and right images, which sets 3D depth to visual distortion tradeoff")); gridRawData->CreateGrid(10, 2); gridRawData->EnableEditing(false); gridRawData->EnableDragRowSize(false); gridRawData->SetColLabelValue(0, TRANS("X")); gridRawData->SetColLabelValue(1, TRANS("Y")); btnRawDataSave->SetToolTip(TRANS("Save raw data to file")); btnRawDataClip->SetToolTip(TRANS("Copy raw data to clipboard")); btnStashManage->SetToolTip(TRANS("Manage \"stashed\" data.")); textConsoleOut->SetToolTip(TRANS("Program text output")); comboCamera->SetToolTip(TRANS("Select active camera, or type to create new named camera")); buttonRemoveCam->SetToolTip(TRANS("Remove the selected camera")); checkFxCropCameraFrame->SetToolTip(TRANS("Perform cropping from coordinate frame of camera")); spinCachePercent->SetToolTip(TRANS("Set the maximum amount of RAM to use in order to speed repeat computations")); btnFilterTreeCollapse->SetToolTip(TRANS("Collapse the filter tree")); btnFilterTreeExpand->SetToolTip(TRANS("Expand the filter tree")); refreshButton->SetToolTip (TRANS("Process the filter tree, hold shift to purge cached filter data")); // end wxGlade // panelSpectra->setPlotWrapper(visControl.getPlotWrapper(),false); //Set the controls that the viscontrol needs to interact with //TODO: Require these via the constructor ? visControl.setRawGrid(gridRawData); //Raw data grid visControl.setPlotList(plotList); visControl.setConsole(textConsoleOut); refreshButton->Enable(false); comboCamera->Bind(wxEVT_SET_FOCUS, &MainWindowFrame::OnComboCameraSetFocus, this); comboStash->Bind(wxEVT_SET_FOCUS, &MainWindowFrame::OnComboStashSetFocus, this); noteDataView->Bind(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, &MainWindowFrame::OnNoteDataView, this); treeFilters->Bind(wxEVT_KEY_DOWN,&MainWindowFrame::OnTreeKeyDown, this); //Only required for 2.9 gridCameraProperties->Clear(); int widths[] = {-4,-2,-1}; MainFrame_statusbar->SetStatusWidths(3,widths); } void MainWindowFrame::do_layout() { // begin wxGlade: MainWindowFrame::do_layout wxBoxSizer* topSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerLeft = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerTools = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerToolsRamUsage = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_1 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* postProcessSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerFxStereo = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerSetereoBaseline = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerStereoCombo = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* cropFxSizer = new wxBoxSizer(wxVERTICAL); wxFlexGridSizer* sizerFxCropGridLow = new wxFlexGridSizer(3, 2, 2, 2); wxBoxSizer* cropFxBodyCentreSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* rightPanelSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* textConsoleSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* rawDataGridSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* rawDataSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* plotListSizery = new wxBoxSizer(wxVERTICAL); wxBoxSizer* topPanelSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerFxCropRHS = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizerFxCropLHS = new wxBoxSizer(wxVERTICAL); wxBoxSizer* filterPaneSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* filterTreeLeftRightSizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* filterRightOfTreeSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* filterMainCtrlSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* stashRowSizer = new wxBoxSizer(wxHORIZONTAL); filterPaneSizer->Add(lblSettings, 0, 0, 0); stashRowSizer->Add(comboStash, 1, wxLEFT|wxRIGHT|wxBOTTOM|wxEXPAND, 3); stashRowSizer->Add(btnStashManage, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0); filterPaneSizer->Add(stashRowSizer, 0, wxEXPAND, 0); filterPaneSizer->Add(filteringLabel, 0, 0, 0); filterMainCtrlSizer->Add(comboFilters, 0, wxLEFT|wxRIGHT|wxEXPAND, 4); filterMainCtrlSizer->Add(treeFilters, 3, wxLEFT|wxBOTTOM|wxEXPAND, 3); filterTreeLeftRightSizer->Add(filterMainCtrlSizer, 3, wxEXPAND, 0); filterRightOfTreeSizer->Add(checkAutoUpdate, 0, 0, 0); filterRightOfTreeSizer->Add(10, 10, 0, 0, 0); filterRightOfTreeSizer->Add(refreshButton, 0, wxALL, 2); filterRightOfTreeSizer->Add(20, 20, 0, 0, 0); filterRightOfTreeSizer->Add(btnFilterTreeCollapse, 0, wxLEFT, 6); filterRightOfTreeSizer->Add(btnFilterTreeExpand, 0, wxLEFT, 6); filterRightOfTreeSizer->Add(10, 10, 0, 0, 0); filterRightOfTreeSizer->Add(btnFilterTreeErrs,0,wxLEFT,6); btnFilterTreeErrs->Show(false); filterTreeLeftRightSizer->Add(filterRightOfTreeSizer, 2, wxEXPAND, 0); filterTreePane->SetSizer(filterTreeLeftRightSizer); do_filtergrid_prop_layout(); // filterSplitter->SplitHorizontally(filterTreePane, filterPropertyPane);//DISABLED This has to be done later to get the window to work. filterPaneSizer->Add(filterSplitter, 1, wxEXPAND, 0); noteData->SetSizer(filterPaneSizer); do_cameragrid_prop_layout(); #ifndef APPLE_EFFECTS_WORKAROUND postProcessSizer->Add(checkPostProcessing, 0, wxALL, 5); #endif cropFxSizer->Add(checkFxCrop, 0, wxALL, 6); cropFxSizer->Add(checkFxCropCameraFrame, 0, wxLEFT, 15); sizerFxCropLHS->Add(comboFxCropAxisOne, 0, wxRIGHT|wxBOTTOM|wxEXPAND, 5); sizerFxCropLHS->Add(panelFxCropOne, 1, wxRIGHT|wxEXPAND| 5); cropFxBodyCentreSizer->Add(sizerFxCropLHS, 1, wxEXPAND, 0); sizerFxCropRHS->Add(comboFxCropAxisTwo, 0, wxLEFT|wxBOTTOM|wxEXPAND, 5); sizerFxCropRHS->Add(panelFxCropTwo, 1, wxLEFT|wxEXPAND, 5); cropFxBodyCentreSizer->Add(sizerFxCropRHS, 1, wxEXPAND, 0); cropFxSizer->Add(cropFxBodyCentreSizer, 1, wxLEFT|wxRIGHT|wxTOP|wxEXPAND, 5); sizerFxCropGridLow->Add(labelFxCropDx, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 0); sizerFxCropGridLow->Add(textFxCropDx, 0, 0, 0); sizerFxCropGridLow->Add(labelFxCropDy, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 0); sizerFxCropGridLow->Add(textFxCropDy, 0, 0, 0); sizerFxCropGridLow->Add(labelFxCropDz, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 0); sizerFxCropGridLow->Add(textFxCropDz, 0, 0, 0); sizerFxCropGridLow->AddGrowableRow(0); sizerFxCropGridLow->AddGrowableRow(1); sizerFxCropGridLow->AddGrowableRow(2); sizerFxCropGridLow->AddGrowableCol(0); sizerFxCropGridLow->AddGrowableCol(1); cropFxSizer->Add(sizerFxCropGridLow, 0, wxBOTTOM|wxEXPAND, 5); noteFxPanelCrop->SetSizer(cropFxSizer); sizerFxStereo->Add(checkFxEnableStereo, 0, wxLEFT|wxTOP, 6); sizerFxStereo->Add(20, 20, 0, 0, 0); sizerStereoCombo->Add(lblFxStereoMode, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5); sizerStereoCombo->Add(comboFxStereoMode, 0, wxLEFT, 5); sizerStereoCombo->Add(bitmapFxStereoGlasses, 0, 0, 0); sizerFxStereo->Add(sizerStereoCombo, 0, wxBOTTOM|wxEXPAND, 15); sizerSetereoBaseline->Add(labelFxStereoBaseline, 0, wxLEFT|wxTOP, 5); sizerSetereoBaseline->Add(sliderFxStereoBaseline, 1, wxLEFT|wxRIGHT|wxTOP|wxEXPAND, 5); sizerFxStereo->Add(sizerSetereoBaseline, 0, wxEXPAND, 0); sizerFxStereo->Add(checkFxStereoLensFlip, 0, wxLEFT, 5); noteFxPanelStereo->SetSizer(sizerFxStereo); noteEffects->AddPage(noteFxPanelCrop, TRANS("Crop")); noteEffects->AddPage(noteFxPanelStereo, TRANS("Stereo")); postProcessSizer->Add(noteEffects, 1, wxEXPAND, 0); notePost->SetSizer(postProcessSizer); sizerTools->Add(labelAppearance, 0, wxTOP, 3); sizerTools->Add(checkAlphaBlend, 0, wxLEFT|wxTOP|wxBOTTOM, 5); sizerTools->Add(checkLighting, 0, wxLEFT|wxTOP|wxBOTTOM, 6); sizerTools->Add(static_line_1, 0, wxEXPAND, 0); sizerTools->Add(labelPerformance, 0, wxTOP, 3); sizerTools->Add(checkWeakRandom, 0, wxLEFT|wxTOP|wxBOTTOM, 5); sizer_1->Add(checkLimitOutput, 0, wxRIGHT, 3); sizer_1->Add(textLimitOutput, 0, wxLEFT, 4); sizerTools->Add(sizer_1, 0, wxLEFT|wxEXPAND, 5); sizerTools->Add(checkCaching, 0, wxLEFT|wxTOP|wxBOTTOM, 5); sizerToolsRamUsage->Add(labelMaxRamUsage, 0, wxRIGHT, 5); sizerToolsRamUsage->Add(spinCachePercent, 0, 0, 5); sizerTools->Add(sizerToolsRamUsage, 1, wxTOP|wxEXPAND, 5); noteTools->SetSizer(sizerTools); notebookControl->AddPage(noteData, TRANS("Data")); notebookControl->AddPage(noteCamera, TRANS("Cam")); notebookControl->AddPage(notePost, TRANS("Post")); notebookControl->AddPage(noteTools, TRANS("Tools")); sizerLeft->Add(notebookControl, 1, wxLEFT|wxBOTTOM|wxEXPAND, 2); panelLeft->SetSizer(sizerLeft); topPanelSizer->Add(panelView, 1, wxEXPAND, 0); panelTop->SetSizer(topPanelSizer); plotListSizery->Add(plotListLabel, 0, 0, 0); plotListSizery->Add(plotList, 1, wxEXPAND, 0); window_2_pane_2->SetSizer(plotListSizery); splitterSpectra->SplitVertically(panelSpectra, window_2_pane_2); rawDataGridSizer->Add(gridRawData, 3, wxEXPAND, 0); rawDataSizer->Add(20, 20, 1, 0, 0); rawDataSizer->Add(btnRawDataSave, 0, wxLEFT, 2); rawDataSizer->Add(btnRawDataClip, 0, wxLEFT, 2); rawDataGridSizer->Add(rawDataSizer, 0, wxTOP|wxEXPAND, 5); noteRaw->SetSizer(rawDataGridSizer); textConsoleSizer->Add(textConsoleOut, 1, wxEXPAND, 0); noteDataViewConsole->SetSizer(textConsoleSizer); noteDataView->AddPage(splitterSpectra, TRANS("Plot")); noteDataView->AddPage(noteRaw, TRANS("Raw")); noteDataView->AddPage(noteDataViewConsole, TRANS("Cons.")); splitTopBottom->SplitHorizontally(panelTop, noteDataView); rightPanelSizer->Add(splitTopBottom, 1, wxEXPAND, 0); panelRight->SetSizer(rightPanelSizer); splitLeftRight->SplitVertically(panelLeft, panelRight); topSizer->Add(splitLeftRight, 1, wxEXPAND, 0); SetSizer(topSizer); topSizer->Fit(this); Layout(); // end wxGlade // // GTK fix hack thing. reparent window panelTop->Reparent(splitTopBottom); //Set the combo text haveSetComboCamText=false; comboCamera->SetValue((TRANS(cameraIntroString))); haveSetComboStashText=false; comboStash->SetValue((TRANS(stashIntroString))); } void MainWindowFrame::do_filtergrid_prop_layout() { wxBoxSizer* filterPropGridSizer = new wxBoxSizer(wxVERTICAL); filterPropGridSizer->Add(propGridLabel, 0, 0, 0); filterPropGridSizer->Add(gridFilterPropGroup, 1, wxLEFT|wxEXPAND, 4); filterPropertyPane->SetSizer(filterPropGridSizer); filterPropertyPane->Fit(); filterPropGridSizer->Fit(filterPropertyPane); Layout(); filterSplitter->UpdateSize(); } void MainWindowFrame::do_cameragrid_prop_layout() { sizerAlignCam_staticbox = new wxStaticBox(noteCamera, wxID_ANY, _("Align Camera")); wxBoxSizer* camPaneSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* camTopRowSizer = new wxBoxSizer(wxHORIZONTAL); sizerAlignCam_staticbox->Lower(); wxStaticBoxSizer* sizerAlignCam = new wxStaticBoxSizer(sizerAlignCam_staticbox, wxVERTICAL); wxBoxSizer* sizerCamAlignMinus = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizerCamAlignPlus = new wxBoxSizer(wxHORIZONTAL); camPaneSizer->Add(labelCameraName, 0, 0, 0); camTopRowSizer->Add(comboCamera, 3, 0, 0); camTopRowSizer->Add(buttonRemoveCam, 0, wxLEFT|wxRIGHT, 2); camPaneSizer->Add(camTopRowSizer, 0, wxTOP|wxBOTTOM|wxEXPAND, 4); camPaneSizer->Add(cameraNamePropertySepStaticLine, 0, wxEXPAND, 0); camPaneSizer->Add(gridCameraProperties, 1, wxEXPAND, 0); sizerCamAlignPlus->Add(buttonAlignCamXPlus, 0, wxALIGN_CENTER|wxALL, 5); sizerCamAlignPlus->Add(buttonAlignCamYPlus, 0, wxALIGN_CENTER|wxALL, 5); sizerCamAlignPlus->Add(buttonAlignCamZPlus, 0, wxALIGN_CENTER|wxALL, 5); sizerAlignCam->Add(sizerCamAlignPlus, 0, 0, 0); sizerCamAlignMinus->Add(buttonAlignCamXMinus, 0, wxALIGN_CENTER|wxALL, 5); sizerCamAlignMinus->Add(buttonAlignCamYMinus, 0, wxALIGN_CENTER|wxALL, 5); sizerCamAlignMinus->Add(buttonAlignCamZMinus, 0, wxALIGN_CENTER|wxALL, 5); sizerAlignCam->Add(sizerCamAlignMinus, 0, wxALIGN_CENTER, 0); sizerAlignCam->Add(checkAlignCamResize, 0, wxALIGN_CENTER|wxALL, 4); camPaneSizer->Add(sizerAlignCam, 1, 0, 0); noteCamera->SetSizer(camPaneSizer); noteCamera->Fit(); //camPaneSizer->Fit(); noteCamera->Layout(); //noteCamera->UpdateSize(); } 3Depict-0.0.19/src/gui/mathglPane.cpp0000644000175000017500000010360312717201575016631 0ustar pcuserpcuser/* * mathglPane.cpp - mathgl-wx interface panel control * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "wx/wxcomponents.h" #include "mathglPane.h" #include "wx/wxcommon.h" #include "common/translation.h" #include "backend/plot.h" #ifndef pow10 #define pow10(x) pow(10,x) #endif #include using std::string; using std::vector; //Panning speed modifier const float MGL_PAN_SPEED=2.0f; //Mathgl uses floating point loop computation, and can get stuck. Limit zoom precision const float MGL_ZOOM_LIMIT=10.0f*sqrt(std::numeric_limits::epsilon()); //Mouse action types enum { MOUSE_MODE_DRAG, //Free mouse drag on plot MOUSE_MODE_DRAG_PAN, //dragging mouse using a "panning" action MOUSE_MODE_DRAG_REGION, //Dragging a region MOUSE_MODE_ENUM_END }; //Do the particular enums require a redraw? const bool MOUSE_ACTION_NEEDS_REDRAW[] = { false,true,true,false}; enum { PLOT_TEXTURE_ZOOM_X, PLOT_TEXTURE_ZOOM_Y, PLOT_TEXTURE_ZOOM_RESET, PLOT_TEXTURE_SLIDE_X, PLOT_TEXTURE_ENUM_END }; const char *mglTextureFile[] = { "textures/plot_zoom_x.png", "textures/plot_zoom_y.png", "textures/plot_zoom_reset.png", "textures/plot_slide_x.png" }; using std::ifstream; using std::ios; BEGIN_EVENT_TABLE(MathGLPane, wxPanel) EVT_MOTION(MathGLPane::mouseMoved) EVT_LEFT_DOWN(MathGLPane::leftMouseDown) EVT_LEFT_UP(MathGLPane::leftMouseReleased) EVT_MIDDLE_DOWN(MathGLPane::middleMouseDown) EVT_MIDDLE_UP(MathGLPane::middleMouseReleased) EVT_RIGHT_DOWN(MathGLPane::rightClick) EVT_LEAVE_WINDOW(MathGLPane::mouseLeftWindow) EVT_LEFT_DCLICK(MathGLPane::mouseDoubleLeftClick) EVT_MIDDLE_DCLICK(MathGLPane::mouseDoubleLeftClick) EVT_SIZE(MathGLPane::resized) EVT_KEY_DOWN(MathGLPane::keyPressed) EVT_KEY_UP(MathGLPane::keyReleased) EVT_MOUSEWHEEL(MathGLPane::mouseWheelMoved) EVT_PAINT(MathGLPane::render) END_EVENT_TABLE(); enum { AXIS_POSITION_INTERIOR=1, AXIS_POSITION_LOW_X=2, AXIS_POSITION_LOW_Y=4, }; void zoomBounds(float minV,float maxV, float centre, float zoomFactor,float &newMin, float &newMax) { ASSERT(minV < maxV); ASSERT(minV< centre && maxV > centre); ASSERT(zoomFactor > 0); //find deltas, then multiply them out float lowerDelta,upperDelta; lowerDelta = (centre-minV); upperDelta = (maxV-centre); upperDelta*=zoomFactor; lowerDelta*=zoomFactor; ASSERT(upperDelta > 0 && lowerDelta > 0); //compute new bounds newMin= centre - lowerDelta; newMax= centre + upperDelta; ASSERT(newMin <=newMax); } MathGLPane::MathGLPane(wxWindow* parent, int id) : wxPanel(parent, id, wxDefaultPosition, wxDefaultSize) { COMPILE_ASSERT(THREEDEP_ARRAYSIZE(MOUSE_ACTION_NEEDS_REDRAW) == MOUSE_MODE_ENUM_END + 1); COMPILE_ASSERT(THREEDEP_ARRAYSIZE(mglTextureFile) == PLOT_TEXTURE_ENUM_END); hasResized=true; limitInteract=false; mouseDragMode=MOUSE_MODE_ENUM_END; leftWindow=true; thePlot=0; gr=0; lastEditedPlot=lastEditedRegion=-1; regionSelfUpdate=false; plotIsLogarithmic=false; SetBackgroundStyle(wxBG_STYLE_CUSTOM); } MathGLPane::~MathGLPane() { if(gr) delete gr; } void MathGLPane::setPanCoords() const { float xMin,xMax,yMin,yMax; thePlot->getBounds(xMin,xMax,yMin,yMax); float pEndX, pStartX,dummy; toPlotCoords(draggingCurrent.x,draggingCurrent.y,pEndX,dummy); toPlotCoords(draggingStart.x,draggingStart.y,pStartX,dummy); float offX = pEndX-pStartX; //This is not needed if re-using mgl object! // - not sure why! //offX*=xMax-xMin; //Modify for speed offX*=MGL_PAN_SPEED; thePlot->setBounds(origPanMinX+offX/2,+origPanMaxX + offX/2.0, yMin,yMax); } bool MathGLPane::readyForInput() const { return (thePlot && gr && !thePlot->isInteractionLocked() && thePlot->getNumTotal()); } unsigned int MathGLPane::getAxisMask(int x, int y) const { //Retrieve XY position in graph coordinate space // from XY coordinate in window space. float mglCurX, mglCurY; if(!toPlotCoords(x,y,mglCurX,mglCurY)) return 0; unsigned int retVal=0; if(mglCurX < gr->Self()->GetOrgX('x')) retVal |=AXIS_POSITION_LOW_X; if(mglCurY < gr->Self()->GetOrgY('y')) retVal |=AXIS_POSITION_LOW_Y; if(!retVal) retVal=AXIS_POSITION_INTERIOR; return retVal; } void MathGLPane::setPlotWrapper(PlotWrapper *newPlot,bool takeOwnPtr) { thePlot=newPlot; Refresh(); } void MathGLPane::render(wxPaintEvent &event) { wxAutoBufferedPaintDC *dc=new wxAutoBufferedPaintDC(this); if(!thePlot || thePlot->isInteractionLocked() ) { delete dc; return; } bool hasChanged; hasChanged=thePlot->hasChanged(); int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h) { delete dc; return; } //Set the enabled and disabled plots unsigned int nItems=thePlot->getNumVisible(); wxFont font; font.SetFamily(wxFONTFAMILY_SWISS); if(font.IsOk()) dc->SetFont(font); if(!nItems) { #ifdef __WXGTK__ wxBrush *b = new wxBrush; b->SetColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BACKGROUND)); dc->SetBackground(*b); dc->SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); #endif #if !defined(__APPLE__) dc->Clear(); #endif int clientW,clientH; GetClientSize(&clientW,&clientH); wxString str=TRANS("No plots selected."); dc->GetMultiLineTextExtent(str,&w,&h); dc->DrawText(str,(clientW-w)/2, (clientH-h)/2); #ifdef __WXGTK__ delete b; #endif delete dc; return; } #ifdef DEBUG bool doTrap=getTrapfpe(); if(doTrap) trapfpe(false); #endif //If the plot has changed, been resized or is performing // a mouse action that requires updating, we need to update it //likewise if we don't have a plot, we need one. if(!gr || hasChanged || hasResized || MOUSE_ACTION_NEEDS_REDRAW[mouseDragMode]) { //clear the plot drawing entity if(!gr) { gr = new mglGraph(0,w,h); #ifdef __APPLE__ //apparenty bug in mgl under osx - font wont load, // use random string to force fallback gr->LoadFont("asdfrandom"); #endif } else { gr->SetSize(w,h); } //change the plot by panningOneD it before we draw. //if we need to if(mouseDragMode==MOUSE_MODE_DRAG_PAN) setPanCoords(); //Draw the plot thePlot->drawPlot(gr,plotIsLogarithmic); #ifdef DEBUG if(strlen(gr->Message())) { std::cerr << "Mathgl reports error:" << gr->Message() << std::endl; } #endif thePlot->resetChange(); hasResized=false; //Copy the plot's memory buffer into a wxImage object, then draw it char *rgbdata = (char*)malloc(w*h*3); gr->GetRGB((char*)rgbdata,w*h*3); imageCacheBmp=wxBitmap(wxImage(w,h,(unsigned char*)rgbdata,true)); free(rgbdata); } #ifdef DEBUG if(doTrap) trapfpe(true); #endif dc->DrawBitmap(wxBitmap(imageCacheBmp),0,0); //If we are engaged in a dragging operation //draw the nice little bits we need switch(mouseDragMode) { case MOUSE_MODE_DRAG: { //Draw a rectangle between the start and end positions wxCoord tlX,tlY,wRect,hRect; if(draggingStart.x < draggingCurrent.x) { tlX=draggingStart.x; wRect = draggingCurrent.x - tlX; } else { tlX=draggingCurrent.x; wRect = draggingStart.x - tlX; } if(draggingStart.y < draggingCurrent.y) { tlY=draggingStart.y; hRect = draggingCurrent.y - tlY; } else { tlY=draggingCurrent.y; hRect = draggingStart.y - tlY; } #if wxCHECK_VERSION(3,1,0) dc->SetBrush(wxBrush(*wxBLUE,wxBRUSHSTYLE_TRANSPARENT)); #else dc->SetBrush(wxBrush(*wxBLUE,wxTRANSPARENT)); #endif const int END_MARKER_SIZE=5; //If the cursor is wholly below //the axis, draw a line rather than abox unsigned int startMask, endMask; startMask=getAxisMask(draggingStart.x, draggingStart.y); endMask=getAxisMask(draggingCurrent.x, draggingCurrent.y); if( (startMask & AXIS_POSITION_LOW_X) && (endMask & AXIS_POSITION_LOW_X) ) { if( !((startMask &AXIS_POSITION_LOW_Y) && (endMask & AXIS_POSITION_LOW_Y))) { //left of X-Axis event //Draw a little I beam. dc->DrawLine(draggingStart.x,tlY, draggingStart.x,tlY+hRect); dc->DrawLine(draggingStart.x-END_MARKER_SIZE,tlY+hRect, draggingStart.x+END_MARKER_SIZE,tlY+hRect); dc->DrawLine(draggingStart.x-END_MARKER_SIZE,tlY, draggingStart.x+END_MARKER_SIZE,tlY); } } else if( (startMask & AXIS_POSITION_LOW_Y) && (endMask & AXIS_POSITION_LOW_Y) ) { //below Y axis event //Draw a little |-| beam. dc->DrawLine(tlX,draggingStart.y, tlX+wRect,draggingStart.y); dc->DrawLine(tlX+wRect,draggingStart.y-END_MARKER_SIZE, tlX+wRect,draggingStart.y+END_MARKER_SIZE); dc->DrawLine(tlX,draggingStart.y-END_MARKER_SIZE, tlX,draggingStart.y+END_MARKER_SIZE); } else dc->DrawRectangle(tlX,tlY,wRect,hRect); break; } case MOUSE_MODE_DRAG_REGION: { drawRegionDraggingOverlay(dc); break; } case MOUSE_MODE_DRAG_PAN: break; case MOUSE_MODE_ENUM_END: { drawInteractOverlay(dc); break; } default: ASSERT(false); } delete dc; } void MathGLPane::resized(wxSizeEvent& evt) { hasResized=true; Refresh(); } void MathGLPane::updateMouseCursor() { int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h || !thePlot ) return; //Set cursor to normal by default if(!readyForInput()) { SetCursor(wxNullCursor); return; } //Update mouse cursor //--------------- //Draw a rectangle between the start and end positions //If we are using shift, we slide along X axis anyway if(wxGetKeyState(WXK_SHIFT)) SetCursor(wxCURSOR_SIZEWE); else { //If the cursor is wholly beloe //the axis, draw a line rather than abox unsigned int axisMask=getAxisMask(curMouse.x,curMouse.y); float xMin,xMax,yMin,yMax; thePlot->getBounds(xMin,xMax,yMin,yMax); //Look at mouse position relative to the axis position //to determine the cursor style. switch(axisMask) { case AXIS_POSITION_LOW_X: //left of X-Axis event, draw up-down arrow SetCursor(wxCURSOR_SIZENS); break; case AXIS_POSITION_LOW_Y: //Below Y axis, draw line // to x axis SetCursor(wxCURSOR_SIZEWE); break; case AXIS_POSITION_INTERIOR: //SetCursor(wxCURSOR_MAGNIFIER); SetCursor(wxNullCursor); break; default: SetCursor(wxNullCursor); ; } } //--------------- } bool MathGLPane::getRegionUnderCursor(const wxPoint &mousePos, unsigned int &plotId, unsigned int ®ionId) const { ASSERT(gr); //Convert the mouse coordinates to data coordinates. float xM,yM; toPlotCoords(mousePos.x,mousePos.y,xM,yM); mglPoint pMouse(xM,yM); if(!readyForInput()) return false; //Only allow range interaction within the plot bb if(pMouse.x > gr->Self()->Max.x || pMouse.x < gr->Self()->Min.x) return false; //check if we actually have a region if(!thePlot->getRegionIdAtPosition(pMouse.x,pMouse.y,plotId,regionId)) return false; return true; } void MathGLPane::mouseMoved(wxMouseEvent& event) { leftWindow=false; if(!readyForInput()) { mouseDragMode=MOUSE_MODE_ENUM_END; return; } curMouse=event.GetPosition(); switch(mouseDragMode) { case MOUSE_MODE_DRAG: if(!event.m_leftDown) mouseDragMode=MOUSE_MODE_ENUM_END; else draggingCurrent=event.GetPosition(); break; case MOUSE_MODE_DRAG_PAN: //Can only be dragging with shift/left or middle down // we might not receive an left up if the user // exits the window and then releases the mouse if(!((event.m_leftDown && event.m_shiftDown) || event.m_middleDown)) mouseDragMode=MOUSE_MODE_ENUM_END; else draggingCurrent=event.GetPosition(); break; default: ; } //Check if we are still dragging if(!(event.m_leftDown || event.m_middleDown) || limitInteract) mouseDragMode=MOUSE_MODE_ENUM_END; else draggingCurrent=event.GetPosition(); updateMouseCursor(); Refresh(); } void MathGLPane::mouseDoubleLeftClick(wxMouseEvent& event) { if(!readyForInput()) return; //Cancel any mouse drag mode mouseDragMode=MOUSE_MODE_ENUM_END; int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h ) return; unsigned int axisMask=getAxisMask(curMouse.x,curMouse.y); switch(axisMask) { case AXIS_POSITION_LOW_X: //left of X-Axis -- plot Y zoom thePlot->disableUserAxisBounds(false); break; case AXIS_POSITION_LOW_Y: //Below Y axis; plot X Zoom thePlot->disableUserAxisBounds(true); break; case AXIS_POSITION_INTERIOR: //reset plot bounds thePlot->disableUserBounds(); break; default: //bottom corner thePlot->disableUserBounds(); } Refresh(); } void MathGLPane::mouseDoubleMiddleClick(wxMouseEvent &event) { mouseDoubleLeftClick(event); } void MathGLPane::oneDMouseDownAction(bool leftDown,bool middleDown, bool alternateDown, int dragX,int dragY) { ASSERT(thePlot->getNumVisible()); float xMin,xMax,yMin,yMax; thePlot->getBounds(xMin,xMax,yMin,yMax); //Set the interaction mode if(leftDown && !alternateDown ) { int axisMask; axisMask = getAxisMask(curMouse.x,curMouse.y); draggingStart = wxPoint(dragX,dragY); //check to see if we have hit a region unsigned int plotId,regionId; if(!limitInteract && !(axisMask &(AXIS_POSITION_LOW_X | AXIS_POSITION_LOW_Y)) && getRegionUnderCursor(curMouse,plotId,regionId)) { PlotRegion r; thePlot->getRegion(plotId,regionId,r); //TODO: Implement a more generic region handler? ASSERT(thePlot->plotType(plotId) == PLOT_MODE_1D); float mglStartX,mglStartY; toPlotCoords(draggingStart.x, draggingStart.y,mglStartX,mglStartY); //Get the type of move, and the region //that is being moved, as well as the plot that this //region belongs to. regionMoveType=computeRegionMoveType(mglStartX,mglStartY, r); startMouseRegion=regionId; startMousePlot=plotId; mouseDragMode=MOUSE_MODE_DRAG_REGION; } else mouseDragMode=MOUSE_MODE_DRAG; } if( (leftDown && alternateDown) || middleDown) { mouseDragMode=MOUSE_MODE_DRAG_PAN; draggingStart = wxPoint(dragX,dragY); origPanMinX=xMin; origPanMaxX=xMax; } } void MathGLPane::twoDMouseDownAction(bool leftDown,bool middleDown, bool alternateDown, int dragX,int dragY) { ASSERT(thePlot->getNumVisible()); float xMin,xMax,yMin,yMax; thePlot->getBounds(xMin,xMax,yMin,yMax); //Set the interaction mode if(leftDown && !alternateDown ) { draggingStart = wxPoint(dragX,dragY); mouseDragMode=MOUSE_MODE_DRAG; } if( (leftDown && alternateDown) || middleDown) { mouseDragMode=MOUSE_MODE_DRAG_PAN; draggingStart = wxPoint(dragX,dragY); origPanMinX=xMin; origPanMaxX=xMax; origPanMinY=yMin; origPanMaxY=yMax; } } void MathGLPane::leftMouseDown(wxMouseEvent& event) { if(!readyForInput()) return; int w,h; w=h=0; GetClientSize(&w,&h); if(!w || !h) return; //mathgl can't handle coordinate transformations with negative values if(event.GetPosition().x > w || event.GetPosition().y > h || event.GetPosition().x < 0 || event.GetPosition().y < 0) return; switch(thePlot->getVisibleMode()) { case PLOT_MODE_1D: oneDMouseDownAction(event.LeftDown(),false, event.ShiftDown(), event.GetPosition().x, event.GetPosition().y); break; case PLOT_MODE_2D: case PLOT_MODE_ENUM_END: //Do nothing twoDMouseDownAction(event.LeftDown(),false, event.ShiftDown(), event.GetPosition().x, event.GetPosition().y); break; default: ASSERT(false); } event.Skip(); } void MathGLPane::middleMouseDown(wxMouseEvent &event) { if(!readyForInput()) return; int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h) return; switch(thePlot->getVisibleMode()) { case PLOT_MODE_1D: oneDMouseDownAction(false,event.MiddleDown(), event.ShiftDown(), event.GetPosition().x, event.GetPosition().y); break; case PLOT_MODE_ENUM_END: //Do nothing break; default: ASSERT(false); } event.Skip(); } void MathGLPane::mouseWheelMoved(wxMouseEvent& event) { //If no valid plot, don't do anything if(!readyForInput()) return; //no action if currently dragging if(!(mouseDragMode==MOUSE_MODE_ENUM_END)) return; unsigned int axisMask=getAxisMask(curMouse.x,curMouse.y); //Bigger numbers mean faster. const float SCROLL_WHEEL_ZOOM_RATE=0.20; float zoomRate=(float)event.GetWheelRotation()/(float)event.GetWheelDelta(); zoomRate=zoomRate*SCROLL_WHEEL_ZOOM_RATE; //Convert from additive space to multiplicative float zoomFactor; if(zoomRate > 0.0f) { zoomFactor=1.0/(1.0+zoomRate); ASSERT(zoomFactor> 1.0f); } else { zoomFactor=(1.0-zoomRate); ASSERT(zoomFactor < 1.0f); } //retrieve the mouse position mglPoint mousePos; float mglX,mglY; toPlotCoords(curMouse.x,curMouse.y,mglX,mglY); mousePos=mglPoint(mglX,mglY); float xPlotMin,xPlotMax,yPlotMin,yPlotMax; float xMin,xMax,yMin,yMax; //Get the current bounds for the plot thePlot->getBounds(xMin,xMax,yMin,yMax); //Get the absolute bounds for the plot thePlot->scanBounds(xPlotMin,xPlotMax,yPlotMin,yPlotMax); //Zoom around the point switch(axisMask) { //below x axis -> y zoom only case AXIS_POSITION_LOW_X: { float newYMin,newYMax; //work out existing bounds on zooming zoomBounds(yMin,yMax,mousePos.y, zoomFactor, newYMin,newYMax); //clamp to plot newYMin=std::max(yPlotMin,newYMin); newYMax=std::min(yPlotMax,newYMax); if(newYMax- newYMin> MGL_ZOOM_LIMIT) thePlot->setBounds(xMin,xMax,newYMin,newYMax); break; } //Below y axis -> x zoom only case AXIS_POSITION_LOW_Y: { float newXMin,newXMax; //work out existing bounds on zooming zoomBounds(xMin,xMax,mousePos.x, zoomFactor, newXMin,newXMax); newXMin=std::max(xPlotMin,newXMin); newXMax=std::min(xPlotMax,newXMax); if(newXMax - newXMin > MGL_ZOOM_LIMIT) thePlot->setBounds(newXMin,newXMax,yMin,yMax); break; } //Zoom both axes case AXIS_POSITION_INTERIOR: { float newXMax,newXMin; float newYMax,newYMin; //work out existing bounds on zooming zoomBounds(xMin,xMax,mousePos.x, zoomFactor, newXMin,newXMax); zoomBounds(yMin,yMax,mousePos.y, zoomFactor, newYMin,newYMax); newXMin=std::max(xPlotMin,newXMin); newXMax=std::min(xPlotMax,newXMax); newYMin=std::max(yPlotMin,newYMin); newYMax=std::min(yPlotMax,newYMax); if(newXMax - newXMin > MGL_ZOOM_LIMIT && newYMax - newYMin > MGL_ZOOM_LIMIT) thePlot->setBounds(newXMin,newXMax,newYMin,newYMax); break; } default: ; } Refresh(); } void MathGLPane::leftMouseReleased(wxMouseEvent& event) { if(!readyForInput()) return; //!Do we have region updates? bool haveUpdates=false; switch(mouseDragMode) { case MOUSE_MODE_DRAG: { wxPoint draggingEnd = event.GetPosition(); updateDragPos(draggingEnd); Refresh(); break; } case MOUSE_MODE_DRAG_REGION: { if(!limitInteract) { //we need to tell viscontrol that we have done a region //update float mglX,mglY; toPlotCoords(curMouse.x,curMouse.y,mglX,mglY); lastEditedRegion=startMouseRegion; lastEditedPlot=startMousePlot; //Send the movement to the parent filter thePlot->moveRegion(startMousePlot,startMouseRegion, regionSelfUpdate,regionMoveType, mglX,mglY); haveUpdates=true; } Refresh(); break; } default: ; } mouseDragMode=MOUSE_MODE_ENUM_END; Refresh(); if(haveUpdates) { for(size_t ui=0;ui u; u=updateHandlers[ui]; //Call the function UpdateHandler h = u.second; wxWindow *w=u.first; (w->*h)(); } } } void MathGLPane::middleMouseReleased(wxMouseEvent& event) { if(!readyForInput()) return; if(mouseDragMode == MOUSE_MODE_DRAG_PAN) { mouseDragMode=MOUSE_MODE_ENUM_END; //Repaint Refresh(); } } void MathGLPane::updateDragPos(const wxPoint &draggingEnd) const { ASSERT(mouseDragMode== MOUSE_MODE_DRAG); unsigned int startX, endX,startY,endY; int w,h; GetSize(&w,&h); //Define the rectangle if(draggingEnd.x > draggingStart.x) { startX=draggingStart.x; endX=draggingEnd.x; } else { startX=draggingEnd.x; endX=draggingStart.x; } if(h-draggingEnd.y > h-draggingStart.y) { startY=draggingStart.y; endY=draggingEnd.y; } else { startY=draggingEnd.y; endY=draggingStart.y; } //Check that the start and end were not the same (i.e. null zoom in all cases) if(startX == endX && startY == endY ) return ; //Compute the MGL coords mglPoint pStart,pEnd; float mglX,mglY; if(!toPlotCoords(startX,startY,mglX,mglY)) return; pStart= mglPoint(mglX,mglY); if(!toPlotCoords(endX,endY,mglX,mglY)) return; pEnd = mglPoint(mglX,mglY); mglPoint cA; cA.x=gr->Self()->GetOrgX('x'); cA.y=gr->Self()->GetOrgY('y'); float currentAxisX,currentAxisY; currentAxisX=cA.x; currentAxisY=cA.y; if(pStart.x < currentAxisX && pEnd.x < currentAxisX ) { if(pStart.y < currentAxisY && pEnd.y < currentAxisY ) { //corner event return ; // Do nothing } else { //Check if can't do anything with this, as it is a null zoom if(startY == endY) return; //left of X-Axis event //Reset the axes such that the //zoom is only along one dimension (y) pStart.x = gr->Self()->Min.x; pEnd.x = gr->Self()->Max.x; } } else if(pStart.y < currentAxisY && pEnd.y < currentAxisY ) { //Check if can't do anything with this, as it is a null zoom if(startX == endX) return; //below Y axis event //Reset the axes such that the //zoom is only along one dimension (x) pStart.y = gr->Self()->Min.y; pEnd.y = gr->Self()->Max.y; } //now that we have the rectangle defined, //Allow for the plot to be zoomed // float minXZoom,maxXZoom,minYZoom,maxYZoom; minXZoom=std::min(pStart.x,pEnd.x); maxXZoom=std::max(pStart.x,pEnd.x); minYZoom=std::min(pStart.y,pEnd.y); maxYZoom=std::max(pStart.y,pEnd.y); //Enforce zoom limit to avoid FP aliasing if(maxXZoom - minXZoom > MGL_ZOOM_LIMIT && maxYZoom - minYZoom > MGL_ZOOM_LIMIT) { thePlot->setBounds(minXZoom,maxXZoom, minYZoom,maxYZoom); } } void MathGLPane::rightClick(wxMouseEvent& event) { } void MathGLPane::mouseLeftWindow(wxMouseEvent& event) { leftWindow=true; Refresh(); } void MathGLPane::keyPressed(wxKeyEvent& event) { if(!readyForInput()) return; updateMouseCursor(); } void MathGLPane::keyReleased(wxKeyEvent& event) { if(!readyForInput()) return; updateMouseCursor(); } unsigned int MathGLPane::savePNG(const std::string &filename, unsigned int width, unsigned int height) { if(gr) delete gr; ASSERT(filename.size()); try { gr = new mglGraph(0, width,height); } catch(std::bad_alloc) { gr=0; return MGLPANE_ERR_BADALLOC; } gr->SetWarn(0,""); bool dummy; thePlot->drawPlot(gr,dummy); gr->WritePNG(filename.c_str()); bool doWarn; doWarn=gr->GetWarn(); if(doWarn) { lastMglErr= gr->Self()->Mess; delete gr; gr=0; return MGLPANE_ERR_MGLWARN; } delete gr; gr=0; //Hack. mathgl does not return an error value from its writer //function :(. Check to see that the file is openable, and nonzero sized ifstream f(filename.c_str(),ios::binary); if(!f) return MGLPANE_FILE_REOPEN_FAIL; f.seekg(0,ios::end); if(!f.tellg()) return MGLPANE_FILE_UNSIZED_FAIL; return 0; } unsigned int MathGLPane::saveSVG(const std::string &filename) { ASSERT(filename.size()); mglGraph *grS; grS = new mglGraph(); bool dummy; thePlot->drawPlot(grS,dummy); grS->SetWarn(0,""); //Mathgl does not set locale prior to writing SVG // do this by hand pushLocale("C",LC_NUMERIC); grS->WriteSVG(filename.c_str()); popLocale(); bool doWarn; doWarn=grS->GetWarn(); if(doWarn) { lastMglErr=grS->Self()->Mess; delete grS; grS=0; return MGLPANE_ERR_MGLWARN; } delete grS; //Hack. mathgl does not return an error value from its writer //function :(. Check to see that the file is openable, and nonzero sized ifstream f(filename.c_str(),ios::binary); if(!f) return MGLPANE_FILE_REOPEN_FAIL; f.seekg(0,ios::end); if(!f.tellg()) return MGLPANE_FILE_UNSIZED_FAIL; return 0; } void MathGLPane::setPlotVisible(unsigned int plotId, bool visible) { thePlot->setVisible(plotId,visible); } std::string MathGLPane::getErrString(unsigned int errCode) { switch(errCode) { case MGLPANE_ERR_BADALLOC: return std::string(TRANS("Unable to allocate requested memory.\n Try a lower resolution, or save as vector (SVG).")); case MGLPANE_ERR_MGLWARN: return std::string(TRANS("Plotting functions returned an error:\n"))+ lastMglErr; case MGLPANE_FILE_REOPEN_FAIL: return std::string(TRANS("File readback check failed")); case MGLPANE_FILE_UNSIZED_FAIL: return std::string(TRANS("Filesize during readback appears to be zero.")); default: ASSERT(false); } ASSERT(false); } unsigned int MathGLPane::computeRegionMoveType(float dataX,float dataY,const PlotRegion &r) const { switch(r.bounds.size()) { case 1: ASSERT(dataX >= r.bounds[0].first && dataX <=r.bounds[0].second); //Can have 3 different aspects. Left, Centre and Right return REGION_MOVE_EXTEND_XMINUS+(unsigned int)(3.0f*((dataX-r.bounds[0].first)/ (r.bounds[0].second- r.bounds[0].first))); default: ASSERT(false); } ASSERT(false); } void MathGLPane::drawInteractOverlay(wxDC *dc) const { int w,h; w=0;h=0; GetClientSize(&w,&h); ASSERT(w && h); if(curMouse.x < 0 || curMouse.y < 0 || curMouse.x > w || curMouse.y > h) return; //Draw the overlay if outside the // axes unsigned int axisMask=getAxisMask(curMouse.x,curMouse.y); unsigned int regionId,plotId; if(getRegionUnderCursor(curMouse,plotId,regionId)) { if(axisMask == AXIS_POSITION_INTERIOR) { PlotRegion r; thePlot->getRegion(plotId,regionId,r); wxPen *drawPen; //Select pen colour depending upon whether interaction // is allowed if(limitInteract) { #if wxCHECK_VERSION(3,1,0) drawPen = new wxPen(*wxLIGHT_GREY,2,wxPENSTYLE_SOLID); #else drawPen= new wxPen(*wxLIGHT_GREY,2,wxSOLID); #endif } else { #if wxCHECK_VERSION(3,1,0) drawPen = new wxPen(*wxBLACK,2,wxPENSTYLE_SOLID); #else drawPen= new wxPen(*wxBLACK,2,wxSOLID); #endif } dc->SetPen(*drawPen); //Draw two arrows < > over the centre of the plot //--------- //Use inverse drawing function so that we don't get //black-on-black type drawing. //Other option is to use inverse outlines. dc->SetLogicalFunction(wxINVERT); const int ARROW_SIZE=8; float pMouseX,pMouseY; //Convert the mouse coordinates to data coordinates. if(!toPlotCoords(curMouse.x,curMouse.y,pMouseX,pMouseY)) { delete drawPen; return; } unsigned int regionMoveType=computeRegionMoveType(pMouseX,pMouseY,r); switch(regionMoveType) { //Left hand side of region case REGION_MOVE_EXTEND_XMINUS: dc->DrawLine(curMouse.x-ARROW_SIZE,h/2-ARROW_SIZE, curMouse.x-2*ARROW_SIZE, h/2); dc->DrawLine(curMouse.x-2*ARROW_SIZE, h/2, curMouse.x-ARROW_SIZE,h/2+ARROW_SIZE); break; //right hand side of region case REGION_MOVE_EXTEND_XPLUS: dc->DrawLine(curMouse.x+ARROW_SIZE,h/2-ARROW_SIZE, curMouse.x+2*ARROW_SIZE, h/2); dc->DrawLine(curMouse.x+2*ARROW_SIZE, h/2, curMouse.x+ARROW_SIZE,h/2+ARROW_SIZE); break; //centre of region case REGION_MOVE_TRANSLATE_X: dc->DrawLine(curMouse.x-ARROW_SIZE,h/2-ARROW_SIZE, curMouse.x-2*ARROW_SIZE, h/2); dc->DrawLine(curMouse.x-2*ARROW_SIZE, h/2, curMouse.x-ARROW_SIZE,h/2+ARROW_SIZE); dc->DrawLine(curMouse.x+ARROW_SIZE,h/2-ARROW_SIZE, curMouse.x+2*ARROW_SIZE, h/2); dc->DrawLine(curMouse.x+2*ARROW_SIZE, h/2, curMouse.x+ARROW_SIZE,h/2+ARROW_SIZE); break; default: ASSERT(false); } dc->SetLogicalFunction(wxCOPY); delete drawPen; //--------- //Draw the label for the species being hovered. //--------- string labelText; labelText = r.getName(); wxSize textSize=dc->GetTextExtent((labelText)); dc->DrawText((labelText),curMouse.x-textSize.GetWidth()/2, h/2-(textSize.GetHeight() + 1.5*ARROW_SIZE)); //--------- } } else { //Draw small helper icons in top right of window // TODO: Multiple images, and image cache vector textureIDs; if(axisMask & AXIS_POSITION_LOW_X && (axisMask & AXIS_POSITION_LOW_Y)) textureIDs.push_back(PLOT_TEXTURE_ZOOM_RESET); else if (axisMask & AXIS_POSITION_LOW_X) textureIDs.push_back((PLOT_TEXTURE_ZOOM_Y)); else if (axisMask & AXIS_POSITION_LOW_Y) { textureIDs.push_back(PLOT_TEXTURE_ZOOM_X); textureIDs.push_back(PLOT_TEXTURE_SLIDE_X); } const float THUMB_FRACTION=0.1; const unsigned int MIN_THUMB_SIZE=10; unsigned int thumbSize=THUMB_FRACTION*std::min(h,w); if(thumbSize > MIN_THUMB_SIZE) { for(size_t ui=0;uiDrawBitmap(img,position[0],position[1]); } } } } } bool MathGLPane::toPlotCoords(int winX, int winY,float &resX, float &resY) const { int width, height; GetClientSize(&width,&height); if(winX < 0 || winY<0 || winX > width || winY > height) { WARN(false,"DEBUG ONLY - was outside window coord"); return false; } ASSERT(gr); mglPoint pt = gr->CalcXYZ(winX,winY); resX=pt.x; if(plotIsLogarithmic) { float plotMinY,plotMaxY; plotMinY=gr->Self()->Min.y; plotMaxY=gr->Self()->Max.y; float proportion =(pt.y-plotMinY)/(plotMaxY-plotMinY); float tmp = proportion*(log10(plotMaxY)-log10(plotMinY)) + log10(plotMinY); resY=pow10(tmp); } else resY=pt.y; return true; } bool MathGLPane::toWinCoords(float plotX, float plotY, float &winX, float &winY) const { mglPoint tmp; tmp=gr->CalcScr(mglPoint(plotX,plotY)); winX=tmp.x; winY=tmp.y; if(plotIsLogarithmic) { //FIXME: IMPLEMENT ME WARN(false,"NOT IMPLEMENTED FOR LOG MODE"); return true; } else return true; } void MathGLPane::drawRegionDraggingOverlay(wxDC *dc) const { int w,h; w=0;h=0; GetClientSize(&w,&h); ASSERT(w && h); //Well, we are dragging the region out some. //let us draw a line from the original X position to //the current mouse position/nearest region position float regionLimitX,regionLimitY; if(!toPlotCoords(curMouse.x,curMouse.y,regionLimitX,regionLimitY)) return; ASSERT(thePlot->plotType(startMousePlot) == PLOT_MODE_1D); //See where extending the region is allowed up to. thePlot->findRegionLimit(startMousePlot,startMouseRegion, regionMoveType, regionLimitX,regionLimitY); float testX,testY; toWinCoords(regionLimitX,regionLimitY,testX,testY); int deltaDrag = testX-draggingStart.x; //Draw some text above the cursor to indicate the current position std::string str; stream_cast(str,regionLimitX); wxString wxs; wxs=(str); wxCoord textW,textH; dc->GetTextExtent(wxs,&textW,&textH); wxFont font; font.SetFamily(wxFONTFAMILY_SWISS); if(font.IsOk()) dc->SetFont(font); wxPen *arrowPen; #if wxCHECK_VERSION(3,1,0) arrowPen= new wxPen(*wxBLACK,2,wxPENSTYLE_SOLID); #else arrowPen= new wxPen(*wxBLACK,2,wxSOLID); #endif dc->SetPen(*arrowPen); const int ARROW_SIZE=8; dc->SetLogicalFunction(wxINVERT); //draw horiz line dc->DrawLine(testX,h/2, draggingStart.x,h/2); if(deltaDrag > 0) { dc->DrawText(wxs,testX-textW,h/2-textH*2); //Draw arrow head to face right dc->DrawLine(testX,h/2, testX-ARROW_SIZE, h/2-ARROW_SIZE); dc->DrawLine(testX, h/2, testX-ARROW_SIZE,h/2+ARROW_SIZE); } else { dc->DrawText(wxs,testX,h/2-textH*2); //Draw arrow head to face left dc->DrawLine(testX,h/2, testX+ARROW_SIZE, h/2-ARROW_SIZE); dc->DrawLine(testX, h/2, testX+ARROW_SIZE,h/2+ARROW_SIZE); } float mglCurMouseX,mglCurMouseY; if(!toPlotCoords(curMouse.x,curMouse.y,mglCurMouseX,mglCurMouseY)) { dc->SetLogicalFunction(wxCOPY); delete arrowPen; return; } switch(regionMoveType) { case REGION_MOVE_EXTEND_XMINUS: case REGION_MOVE_EXTEND_XPLUS: //No extra markers; we are cool as is break; case REGION_MOVE_TRANSLATE_X: { //This needs to be extended to support more //plot types. ASSERT(thePlot->plotType(startMousePlot) == PLOT_MODE_1D); //Draw "ghost" limits markers for move, //these appear as moving vertical bars to outline //where the translation result will be for both //upper and lower PlotRegion reg; thePlot->getRegion(startMousePlot,startMouseRegion,reg); //Convert form window to mathgl coordinates float mglDragStartX,mglDragStartY; if(!toPlotCoords(draggingStart.x,draggingStart.y, mglDragStartX,mglDragStartY)) break; float newLower,newUpper; newLower = reg.bounds[0].first + (mglCurMouseX-mglDragStartX); newUpper = reg.bounds[0].second + (mglCurMouseX-mglDragStartX); float newLowerX,newUpperX,dummy; toWinCoords(newLower,0.0f,newLowerX,dummy); toWinCoords(newUpper,0.0f,newUpperX,dummy); dc->DrawLine(newLowerX,h/2+2*ARROW_SIZE,newLowerX,h/2-2*ARROW_SIZE); dc->DrawLine(newUpperX,h/2+2*ARROW_SIZE,newUpperX,h/2-2*ARROW_SIZE); break; } default: ASSERT(false); break; } dc->SetLogicalFunction(wxCOPY); delete arrowPen; } 3Depict-0.0.19/src/gui/art.h0000644000175000017500000000220712640746376015012 0ustar pcuserpcuser/* * art.h - Program icons header * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef ART_H #define ART_H #include #include "../data/3Depict.xpm" class MyArtProvider : public wxArtProvider { public: MyArtProvider() {} virtual ~MyArtProvider() {} protected: wxBitmap CreateBitmap(const wxArtID& id, const wxArtClient& client, const wxSize& size) { if (id == _T("MY_ART_ID_ICON")) return wxBitmap(_Depict); wxBitmap b; return b; } }; #endif // ART_H 3Depict-0.0.19/src/gui/cropPanel.h0000644000175000017500000000575712640746376016164 0ustar pcuserpcuser/* * wxCropPanel.cpp - cropping window for user interaction * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef WXCROPPANEL_H #define WXCROPPANEL_H #include //Selection method enum { SELECT_MODE_NONE, SELECT_MODE_SIDE, SELECT_MODE_CENTRE, SELECT_MODE_CORNER, SELECT_MODE_END_ENUM }; enum { CROP_LINK_NONE, CROP_LINK_LR, CROP_LINK_LR_FLIP, CROP_LINK_TB, CROP_LINK_TB_FLIP, CROP_LINK_BOTH, CROP_LINK_BOTH_FLIP, }; class CropPanel : public wxPanel { private: //!A panel to force the linkage to (link crop border positions) CropPanel *linkedPanel; //!The link mode for the other panel unsigned int linkMode; //!True if event generated programmatically (blocker bool) bool programmaticEvent; //!Cropping %ages for window float crop[4]; //Mouse coords and crop coords at drag start (0->1) float mouseAtDragStart[2]; float cropAtDragStart[4]; //!Selection mode and index for different crop edges/corners/centre unsigned int selMode,selIndex; //!Is the control currently being dragged by the user with the mouse? bool dragging; //!True if the crop array has been modified. bool hasUpdates; bool validCoords() const; void draw() ; //!Get the "best" crop widget as defined by coordinates (in 0->1 space) //returns the index of the selected item as parameter unsigned int getBestCropWidget(float xMouse,float yMouse, unsigned int &idx) const; DECLARE_EVENT_TABLE(); public: CropPanel(wxWindow * parent, wxWindowID id = wxID_ANY, const wxPoint & pos = wxDefaultPosition, const wxSize & size = wxDefaultSize, long style = wxTAB_TRAVERSAL) ; bool hasUpdate(){return hasUpdates;}; void clearUpdate(){hasUpdates=false;}; void getCropValues(float *array) const; //!Directly set the crop value, (0->1), index can be 0->3 void setCropValue(unsigned int index, float v); void makeCropValuesValid(); //!Link this panel's updates to another. Use CROP_LINK_NONE to disable void link(CropPanel *otherPanel,unsigned int mode); void OnEraseBackground(wxEraseEvent& event); void mouseMove(wxMouseEvent& event); void mouseDown(wxMouseEvent& event); void mouseReleased(wxMouseEvent& event); void mouseLeftWindow(wxMouseEvent& event); void mouseDoubleLeftClick(wxMouseEvent& event); void onPaint(wxPaintEvent& evt); void onResize(wxSizeEvent& evt); void updateLinked(); ~CropPanel() {}; }; #endif 3Depict-0.0.19/src/gui/cropPanel.cpp0000644000175000017500000003343612717201575016502 0ustar pcuserpcuser/* * wxCropPanel.cpp - cropping window for user interaction * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "cropPanel.h" #include #include "common/assertion.h" #include //Crop array indices enum { CROP_LEFT, CROP_TOP, CROP_RIGHT, CROP_BOTTOM, CROP_ENUM_END }; BEGIN_EVENT_TABLE(CropPanel, wxPanel) EVT_PAINT(CropPanel::onPaint) EVT_MOTION(CropPanel::mouseMove) EVT_LEFT_DOWN(CropPanel::mouseDown) EVT_LEFT_UP(CropPanel::mouseReleased) EVT_LEAVE_WINDOW(CropPanel::mouseLeftWindow) EVT_LEFT_DCLICK(CropPanel::mouseDoubleLeftClick) EVT_ERASE_BACKGROUND(CropPanel::OnEraseBackground) EVT_SIZE(CropPanel::onResize) END_EVENT_TABLE() CropPanel::CropPanel(wxWindow * parent, wxWindowID id, const wxPoint & pos,const wxSize & size,long style) : wxPanel(parent, id, pos, size, style) { SetBackgroundStyle(wxBG_STYLE_CUSTOM); programmaticEvent=false; crop[0]=crop[1]=crop[2]=crop[3]=0.2; selMode=SELECT_MODE_NONE; dragging=false; linkedPanel=0; linkMode=CROP_LINK_NONE; hasUpdates=false; } void CropPanel::OnEraseBackground(wxEraseEvent &event) { //Intentionally do nothing, to suppress background erase } void CropPanel::mouseMove(wxMouseEvent &event) { int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h) return; //Do our calculations in reduced coordinates (0->1); float xMouse,yMouse; wxPoint mousePos =event.GetPosition(); //Add a 1px border around control xMouse=(float)(mousePos.x+1)/(float)(w-2); yMouse=(float)(mousePos.y+1)/(float)(h-2); if(!dragging) { unsigned int index; selMode=getBestCropWidget(xMouse,yMouse,index); //Update the currently selected index as needed if(selMode == SELECT_MODE_SIDE || selMode == SELECT_MODE_CORNER) selIndex=index; } else { float origCrop[4]; for(unsigned int ui=0;ui<4;ui++) origCrop[ui]=crop[ui]; switch(selMode) { case SELECT_MODE_NONE: ASSERT(false); // Can't be dragging nothing, can we. break; case SELECT_MODE_SIDE: { // we are dragging one of the side crop walls switch(selIndex) { case 0: crop[selIndex ] =xMouse; break; case 1: crop[selIndex ] = yMouse; break; case 2: crop[selIndex]=1.0-xMouse; break; case 3: crop[selIndex]=1.0-yMouse; break; } break; } case SELECT_MODE_CORNER: { //we are dragging one of the corners switch(selIndex) { case 0: crop[0] =xMouse; crop[1]=yMouse; break; case 1: crop[1]=yMouse; crop[2] =1.0-xMouse; break; case 2: crop[2] =1.0-xMouse; crop[3]=1.0-yMouse; break; case 3: crop[3] =1.0-yMouse; crop[0]=xMouse; break; } break; } case SELECT_MODE_CENTRE: { //OK, we have to move them based upon the original drag //coordinates float delta[2]; delta[0]=xMouse-mouseAtDragStart[0]; delta[1]=yMouse-mouseAtDragStart[1]; for(unsigned int ui=0;ui<4;ui++) { float flip; if(ui<2) flip=1.0; else flip=-1; crop[ui]=cropAtDragStart[ui]+delta[ui&1]*flip; } break; } } //Check the result is still valid if(!validCoords()) { //Try to only adjust the invalid coordinates, //to make the motion a little "smoother" for(unsigned int ui=0;ui<4;ui++) { if(crop[ui] > 1.0 || crop[ui] < 0.0) crop[ui]=origCrop[ui]; } //See if our quick fix solved the coord validity if(!validCoords()) { //restore the original coords for(unsigned int ui=0;ui<4;ui++) crop[ui]=origCrop[ui]; } } if(linkedPanel) updateLinked(); hasUpdates=true; } Refresh(); } unsigned int CropPanel::getBestCropWidget(float xMouse, float yMouse,unsigned int &index) const { unsigned int bestSelMode=SELECT_MODE_NONE; int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h) return bestSelMode; float meanPx = 1.0/(1.0/(w-2) + 1.0/(h-2)); unsigned int minIndex; float minDist=std::numeric_limits::max(); float x,y; //work our way clockwise around the corners //finding the minimum distance for(unsigned int ui=0;ui<4;ui++) { //Check this corner switch(ui) { case 0: //Top left corner x=crop[CROP_LEFT]; y=crop[CROP_TOP]; break; case 1: //Top right corner x=1.0-crop[CROP_RIGHT]; y=crop[CROP_TOP]; break; case 2: //Bottom right corner x=1.0-crop[CROP_RIGHT]; y=1.0-crop[CROP_BOTTOM]; break; case 3: //Bottom left corner x=crop[CROP_LEFT]; y=1.0-crop[CROP_BOTTOM]; break; default: ASSERT(false); } float tmpDist; tmpDist=(xMouse-x)*(xMouse-x) + (yMouse-y)*(yMouse-y); if(tmpDist < minDist) { minIndex=ui; minDist=tmpDist; } } minDist=sqrtf(minDist); bool haveCorner; const float MIN_CUTOFF_DISTANCE= 3; //Do we have a corner minimum? haveCorner= ((int)(minDist*meanPx) < MIN_CUTOFF_DISTANCE); bool haveCentre; float meanX = (float)(crop[0] + (1.0-crop[2]))*0.5; float meanY = (float)(crop[1] + (1.0-crop[3]))*0.5; float centreDist; centreDist=sqrtf((xMouse-meanX)*(xMouse-meanX) + (yMouse-meanY)*(yMouse-meanY)); //Check the centre, which is allowed to trump the corners if(haveCorner) haveCentre=(centreDist< minDist); else haveCentre=(meanPx*centreDist) < MIN_CUTOFF_DISTANCE; unsigned int sideIndex; bool haveSide=false; //OK, well, we are allowed to have a side match, check that. if(fabs(crop[CROP_LEFT] - xMouse)*meanPx < MIN_CUTOFF_DISTANCE) { haveSide=true; sideIndex=CROP_LEFT; } //OK, well, we are allowed to have a side match, check that. else if(fabs((1.0-crop[CROP_RIGHT]) - xMouse)*meanPx < MIN_CUTOFF_DISTANCE) { haveSide=true; sideIndex=CROP_RIGHT; } else if(fabs(crop[CROP_TOP] - yMouse)*meanPx < MIN_CUTOFF_DISTANCE) { haveSide=true; sideIndex=CROP_TOP; } else if(fabs((1.0- crop[CROP_BOTTOM]) - yMouse)*meanPx < MIN_CUTOFF_DISTANCE) { haveSide=true; sideIndex=CROP_BOTTOM; } //!Prioritise selection mode if(haveCentre) { bestSelMode=SELECT_MODE_CENTRE; } else if(haveCorner) { bestSelMode=SELECT_MODE_CORNER; index=minIndex; } else if(haveSide) { bestSelMode=SELECT_MODE_SIDE; index=sideIndex; } else { bestSelMode=SELECT_MODE_NONE; } return bestSelMode; } void CropPanel::mouseDoubleLeftClick(wxMouseEvent& event) { //set the snap position using a bitmask int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h) return; unsigned int index; float xMouse,yMouse; wxPoint mousePos =event.GetPosition(); //Add a 1px border around control xMouse=(float)(mousePos.x+1)/(float)(w-2); yMouse=(float)(mousePos.y+1)/(float)(h-2); switch(getBestCropWidget(xMouse,yMouse,index)) { //Just reset the crop values //if we are at the centre or side case SELECT_MODE_NONE: case SELECT_MODE_CENTRE: { for(unsigned int ui=0;ui<4;ui++) crop[ui]=0; break; } case SELECT_MODE_SIDE: { //Ok, lets reset just this side crop[index]=0; break; } case SELECT_MODE_CORNER: { crop[index]=0; crop[(index+1)%4]=0; break; } default: ASSERT(false); } Refresh(); if(linkedPanel) updateLinked(); hasUpdates=true; event.Skip(); } void CropPanel::mouseLeftWindow(wxMouseEvent& event) { if(!dragging) selMode=SELECT_MODE_NONE; } void CropPanel::mouseDown(wxMouseEvent &event) { //set the snap position using a bitmask int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h) return; //Do our calculations in reduced coordinates (0->1); wxPoint mousePos =event.GetPosition(); mouseAtDragStart[0]=(float)(mousePos.x+1)/(float)(w-2); mouseAtDragStart[1]=(float)(mousePos.y+1)/(float)(h-2); ASSERT(validCoords()); if(selMode != SELECT_MODE_NONE) dragging=true; for(unsigned int ui=0;ui<4;ui++) cropAtDragStart[ui] = crop[ui]; } void CropPanel::mouseReleased(wxMouseEvent &event) { dragging=false; selMode=SELECT_MODE_NONE; selIndex=0; Refresh(); } bool CropPanel::validCoords() const { float sum; sum=(crop[CROP_LEFT] + crop[CROP_RIGHT]); //Draw the four crop markers if(sum > 1.00f) return false; sum=(crop[CROP_TOP] + crop[CROP_BOTTOM]); if( sum> 1.00f) return false; for(unsigned int ui=0;ui<4;ui++) { if(crop[ui] < 0.0) return false; } return true; } void CropPanel::onPaint(wxPaintEvent &event) { draw(); } void CropPanel::draw() { ASSERT(validCoords()); wxAutoBufferedPaintDC *dc=new wxAutoBufferedPaintDC(this); wxBrush *b = new wxBrush; b->SetColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BACKGROUND)); dc->Clear(); int w,h; w=0;h=0; GetClientSize(&w,&h); if(!w || !h) { delete dc; return; } //Drawing coords int lineX[8],lineY[8]; //Draw lines lineX[0]=lineX[1]=(int)(crop[CROP_LEFT]*(float)w); lineX[2]=0; lineX[3]=w; lineX[4]=lineX[5]=(int)((1.0-crop[CROP_RIGHT])*(float)w); lineX[6]=w; lineX[7]=0; lineY[0]=0; lineY[1]=h; lineY[2]=lineY[3]=(int)(crop[CROP_TOP]*(float)h); lineY[4]=0; lineY[5]=h; lineY[6]=lineY[7]=(int)((1.0-crop[CROP_BOTTOM])*(float)h); //Draw greyed out section //-- wxPen *noPen; #if wxCHECK_VERSION(3,1,0) noPen = new wxPen(*wxBLACK,1,wxPENSTYLE_TRANSPARENT); #else noPen = new wxPen(*wxBLACK,1,wxTRANSPARENT); #endif b->SetColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BACKGROUND)); dc->SetBrush(*b); dc->SetPen(*noPen); dc->DrawRectangle(0,0,lineX[0],h); dc->DrawRectangle(0,0,w,lineY[2]); dc->DrawRectangle(0,lineY[6],w,h-lineY[6]); dc->DrawRectangle(lineX[4],0,w-lineX[4],h); delete noPen; delete b; //-- wxPen *highPen,*normalPen; highPen= new wxPen(*wxBLUE,2,wxSOLID); normalPen= new wxPen(*wxBLACK,2,wxSOLID); dc->SetPen(*normalPen); if(selMode!=SELECT_MODE_SIDE) { dc->SetPen(*normalPen); for(unsigned int ui=0;ui<8;ui+=2) dc->DrawLine(lineX[ui],lineY[ui],lineX[ui+1],lineY[ui+1]); } else { for(unsigned int ui=0;ui<8;ui+=2) { if(selIndex== ui/2) dc->SetPen(*highPen); else dc->SetPen(*normalPen); dc->DrawLine(lineX[ui],lineY[ui],lineX[ui+1],lineY[ui+1]); } dc->SetPen(*normalPen); } if(selMode == SELECT_MODE_CORNER) { //Draw the corner markers float xC,yC; float sizeX,sizeY; sizeX=sizeY=8; switch(selIndex) { case 0: xC=crop[CROP_LEFT]; yC=crop[CROP_TOP]; sizeX=-sizeX; sizeY=-sizeY; break; case 1: xC=1.0-crop[CROP_RIGHT]; yC=crop[CROP_TOP]; sizeY=-sizeY; break; case 2: xC=1.0-crop[CROP_RIGHT]; yC=1.0-crop[CROP_BOTTOM]; break; case 3: sizeX=-sizeX; xC=crop[CROP_LEFT]; yC=1.0-crop[CROP_BOTTOM]; break; default: ASSERT(false); } xC=xC*(float)w; yC=yC*(float)h; //Draw the corner dc->SetPen(*highPen); dc->DrawLine(wxCoord(xC + 2.0f*sizeX), wxCoord(yC+sizeY), wxCoord(xC+sizeX),wxCoord(yC+sizeY)); dc->DrawLine(wxCoord(xC+sizeX), wxCoord(yC+sizeY), wxCoord(xC+sizeX),wxCoord(yC+2.0f*sizeY)); dc->SetPen(*normalPen); } float meanX = (float)w*(crop[0] + (1.0-crop[2]))*0.5; float meanY = (float)h*(crop[1] + (1.0-crop[3]))*0.5; dc->DrawCircle((int)meanX,(int)meanY,1); if(selMode==SELECT_MODE_CENTRE) { dc->SetPen(*highPen); dc->DrawCircle((int)meanX,(int)meanY,4); } delete dc; delete highPen; delete normalPen; } void CropPanel::updateLinked() { ASSERT(linkedPanel); switch(linkMode) { case CROP_LINK_NONE: return; case CROP_LINK_LR: linkedPanel->crop[CROP_LEFT]=crop[CROP_LEFT]; linkedPanel->crop[CROP_RIGHT]=crop[CROP_RIGHT]; break; case CROP_LINK_LR_FLIP: linkedPanel->crop[CROP_BOTTOM]=crop[CROP_LEFT]; linkedPanel->crop[CROP_TOP]=crop[CROP_RIGHT]; break; case CROP_LINK_TB: linkedPanel->crop[CROP_BOTTOM]=crop[CROP_BOTTOM]; linkedPanel->crop[CROP_TOP]=crop[CROP_TOP]; break; case CROP_LINK_TB_FLIP: linkedPanel->crop[CROP_LEFT]=crop[CROP_BOTTOM]; linkedPanel->crop[CROP_RIGHT]=crop[CROP_TOP]; break; case CROP_LINK_BOTH: linkedPanel->crop[CROP_LEFT]=crop[CROP_LEFT]; linkedPanel->crop[CROP_RIGHT]=crop[CROP_RIGHT]; linkedPanel->crop[CROP_BOTTOM]=crop[CROP_BOTTOM]; linkedPanel->crop[CROP_TOP]=crop[CROP_TOP]; break; case CROP_LINK_BOTH_FLIP: linkedPanel->crop[CROP_BOTTOM]=crop[CROP_LEFT]; linkedPanel->crop[CROP_TOP]=crop[CROP_RIGHT]; linkedPanel->crop[CROP_LEFT]=crop[CROP_BOTTOM]; linkedPanel->crop[CROP_RIGHT]=crop[CROP_TOP]; break; default: ASSERT(false); } linkedPanel->Refresh(); } void CropPanel::link(CropPanel *panel,unsigned int mode) { linkMode=mode; if(linkMode== CROP_LINK_NONE) linkedPanel=0; else { linkedPanel=panel; for(unsigned int ui=0;uicrop[ui]=crop[ui]; } } void CropPanel::getCropValues(float *array) const { array[0]=crop[CROP_LEFT]; array[1]=crop[CROP_RIGHT]; array[2]=crop[CROP_TOP]; array[3]=crop[CROP_BOTTOM]; } void CropPanel::setCropValue(unsigned int index, float v) { ASSERT(index<=CROP_BOTTOM); crop[index]=v; } void CropPanel::makeCropValuesValid() { for(size_t ui=0;ui<4;ui++) { crop[ui]=std::max(crop[ui],0.0f); crop[ui]=std::min(crop[ui],1.0f); } if(crop[CROP_LEFT] + crop[CROP_RIGHT] >1) crop[CROP_LEFT]=crop[CROP_RIGHT]=0.2f; if(crop[CROP_TOP] + crop[CROP_BOTTOM] >1) crop[CROP_TOP]=crop[CROP_BOTTOM]=0.2f; } void CropPanel::onResize(wxSizeEvent &evt) { #ifndef __WXMAC__ wxPaintEvent paintEvt; wxPostEvent(this,paintEvt); #endif } 3Depict-0.0.19/src/gui/mathglPane.h0000644000175000017500000001500612640746376016305 0ustar pcuserpcuser/* * mathglPanel.h - WxWidgets plotting panelf or interaction with mathgl * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef MATHGLPANE_H #define MATHGLPANE_H #include "backend/plot.h" #include // begin wxGlade: ::extracode // end wxGlade //Error codes enum { MGLPANE_ERR_BADALLOC=1, MGLPANE_ERR_MGLWARN, MGLPANE_FILE_REOPEN_FAIL, MGLPANE_FILE_UNSIZED_FAIL, MGLPANE_ERRMAX, }; typedef int (wxWindow::*UpdateHandler)(); class MathGLPane: public wxPanel { private: wxBitmap imageCacheBmp; std::vector > updateHandlers; //Current mouse position wxPoint curMouse; //!Has the mouse left the window? bool leftWindow; //!Last error reported by mathgl std::string lastMglErr; //!What is the user currently doing with the mouse? unsigned int mouseDragMode; //Last region that was interacted with size_t lastEditedRegion,lastEditedPlot; //!Has the window resized since the last draw? bool hasResized; //!Start and currentlocations for the drag wxPoint draggingStart,draggingCurrent; //!Original bounds during panning operations. float origPanMinX, origPanMaxX; //1D and 2D actions float origPanMinY, origPanMaxY; //2D actions //!region used at mouse down unsigned int startMouseRegion,startMousePlot,regionMoveType; //!Should we be limiting interaction to //things that won't modify filters (eg region dragging) bool limitInteract; //!Pointer to the plot data holding class // TODO: Make const, as this should be owned by the analysis state PlotWrapper *thePlot; //!True if regions should update themselves bool regionSelfUpdate; //!True if last plot was in log mode. plot pointer (gr) must exist or this is not valid bool plotIsLogarithmic; //!Pointer to the mathgl renderer mglGraph *gr; //!Caching check vector for plot visibility std::vector lastVisible; //!Update the mouse cursor style, based upon mouse position void updateMouseCursor(); //!Compute the "aspect" for a given region; ie which grab handle type // does this position correspond to unsigned int computeRegionMoveType(float dataX,float dataY, const PlotRegion &r) const; //!Draw the interaction overlay objects // like the ability to drag etc. void drawInteractOverlay(wxDC *dc) const; //Draw the region Overlays (dragging arrows, bounds etc) void drawRegionDraggingOverlay(wxDC *dc) const; // void updateDragPos(const wxPoint &event) const; //Get the bitmask for the cursor position (below/above axis) from //the specified window coordinates (use LH window coordinates, as from wx) unsigned int getAxisMask(int x, int y) const ; //Action to perform when showing 1D plots and mouse down event occurs void oneDMouseDownAction(bool leftDown,bool middleMouseDown, bool alternateDown, int dragX,int dragY); //Action to perform when showing 2D plots and mouse down event occurs void twoDMouseDownAction(bool leftDown,bool middleMouseDown, bool alternateDown, int dragX,int dragY); //Update plot bounds with any user panning action void setPanCoords() const; bool readyForInput() const; //Convert window coordinates to plot coordintes. // - must be within window frame // returns false if not able to convert (eg outside window) bool toPlotCoords(int winX, int winY,float &resX, float &resY) const; bool toWinCoords(float plotX, float plotY, float &winX, float &winY) const; public: MathGLPane(wxWindow* parent, int id); virtual ~MathGLPane(); void setVisibleItems(std::vector &newVisible) ; //Set the plot pointer for this class to manipulate void setPlotWrapper(PlotWrapper *plots, bool takeOwnPtr=true); std::string getErrString(unsigned int code); void enableRegionSelfUpdate(bool enable) { regionSelfUpdate=enable;} //save an SVG file unsigned int saveSVG(const std::string &filename); //Save a PNG file unsigned int savePNG(const std::string &filename, unsigned int width,unsigned int height); //Get the number of visible plots unsigned int getNumVisible() const {return thePlot->getNumVisible();}; //!Get the region under the cursor. Returns region num [0->...) or //numeric_limits::max() if nothing. bool getRegionUnderCursor(const wxPoint &mousePos, unsigned int &plotId, unsigned int ®ionId) const; //Returns the ID of the last edited region void getLastEdited(size_t &lastPlot,size_t &lastRegion) const { lastRegion=lastEditedRegion; lastPlot=lastEditedPlot;}; //Add a callback for the given window that will be called when the panel needs updating void registerUpdateHandler(wxWindow *w, UpdateHandler handler) { updateHandlers.push_back(std::make_pair(w,handler));}; //Resize event for window void resized(wxSizeEvent& evt); //Draw window event void render(wxPaintEvent& evt); //!wx Event that triggers on mouse movement on grah void mouseMoved(wxMouseEvent& event); //Left mouse depress on window void middleMouseDown(wxMouseEvent& event); //Right mouse depress on window void leftMouseDown(wxMouseEvent& event); //Mouse doubleclick on window void mouseDoubleLeftClick(wxMouseEvent& event); //Mouse doubleclick on window void mouseDoubleMiddleClick(wxMouseEvent& event); //Mousewheel Scroll event void mouseWheelMoved(wxMouseEvent& event); //Button being released inside box void leftMouseReleased(wxMouseEvent& event); //! Middle mouse button has been let go void middleMouseReleased(wxMouseEvent& event); //Right button down-release void rightClick(wxMouseEvent& event); //Button leaving client area void mouseLeftWindow(wxMouseEvent& event); void keyPressed(wxKeyEvent& event); void keyReleased(wxKeyEvent& event); //Select, by ID, which plot we would like to set to being shown void setPlotVisible(unsigned int plotID, bool visible); //Show/hide legent void setLegendVisible(bool visible){thePlot->setLegendVisible(visible);} //Prevent the user from interacting with the plot void limitInteraction(bool doLimit=true){ limitInteract=doLimit;}; protected: DECLARE_EVENT_TABLE() }; #endif 3Depict-0.0.19/src/3Depict.rc0000644000175000017500000000007112640746376015105 0ustar pcuserpcusermyAppIcon ICON "myAppIcon.ico" #include "wx/msw/wx.rc" 3Depict-0.0.19/src/winconsole.cpp0000644000175000017500000000321312640746376016151 0ustar pcuserpcuser/* * Winconsole.cpp - windows debugging console implementation * Copyright (C) 2010, William W. * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ //Prevent #if defined(__WIN32) || defined(__WIN64) // winconsole.cpp #include "winconsole.h" #include #include #include winconsole::winconsole() { // create a winconsole window AllocConsole(); // redirect std::cout to our winconsole window m_old_cout = std::cout.rdbuf(); m_out.open("CONOUT$"); std::cout.rdbuf(m_out.rdbuf()); // redirect std::cerr to our winconsole window m_old_cerr = std::cerr.rdbuf(); m_err.open("CONOUT$"); std::cerr.rdbuf(m_err.rdbuf()); // redirect std::cin to our winconsole window m_old_cin = std::cin.rdbuf(); m_in.open("CONIN$"); std::cin.rdbuf(m_in.rdbuf()); } winconsole::~winconsole() { // reset the standard streams std::cin.rdbuf(m_old_cin); std::cerr.rdbuf(m_old_cerr); std::cout.rdbuf(m_old_cout); // remove the winconsole window FreeConsole(); } #endif 3Depict-0.0.19/src/backend/0000755000175000017500000000000012723200266014636 5ustar pcuserpcuser3Depict-0.0.19/src/backend/filter.cpp0000644000175000017500000005707212723164073016647 0ustar pcuserpcuser/* * filter.cpp - modular data filter implementation * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "filter.h" #include "plot.h" #include "common/stringFuncs.h" #include "common/translation.h" #include "wx/wxcomponents.h" #include "common/voxels.h" #include "backend/APT/vtk.h" #include #include #ifdef _OPENMP #include #endif using std::list; using std::vector; using std::string; using std::pair; using std::make_pair; using std::endl; using std::deque; bool Filter::strongRandom= false; ATOMIC_BOOL *Filter::wantAbort= 0; const char *STREAM_NAMES[] = { NTRANS("Ion"), NTRANS("Plot"), NTRANS("2D Plot"), NTRANS("Draw"), NTRANS("Range"), NTRANS("Voxel")}; //Internal names for each filter const char *FILTER_NAMES[] = { "posload", "iondownsample", "rangefile", "spectrumplot", "ionclip", "ioncolour", "compositionprofile", "boundingbox", "transform", "externalprog", "spatialanalysis", "clusteranalysis", "voxelise", "ioninfo", "annotation" }; size_t numElements(const vector &v, unsigned int mask) { size_t nE=0; for(unsigned int ui=0;uigetStreamType() & mask)) nE+=v[ui]->getNumBasicObjects(); } return nE; } template<> bool Filter::applyPropertyNow(bool &prop, const std::string &val, bool &needUp) { needUp=false; bool tmp; if(!boolStrDec(val,tmp)) return false; //return true, as technically, we did something OK // but erasing the cache, and re-setting the value is pointless if(tmp == prop) return true; prop=tmp; clearCache(); needUp=true; return true; } template<> bool Filter::applyPropertyNow(Point3D &prop, const std::string &val, bool &needUp) { needUp=false; Point3D newPt; if(!newPt.parse(val)) return false; //return true, as technically, we did something OK // but erasing the cache, and re-setting the value is pointless if(newPt== prop) return true; prop=newPt; clearCache(); needUp=true; return true; } template<> bool Filter::applyPropertyNow(std::string &prop, const std::string &val, bool &needUp) { needUp=false; //return true, as it is technically ok that we did this if(val == prop) return true; prop=val; clearCache(); needUp=true; return true; } void Filter::cacheAsNeeded(FilterStreamData *stream) { if(cache) { stream->cached=1; filterOutputs.push_back(stream); cacheOK=true; } else { stream->cached=0; } } //Used by the setProperties to demultiplex "mux" one values into two separate data points // this is a bit of a hack, and decreases the available range to each type to 16 bits void Filter::demuxKey(unsigned int key, unsigned int &keyType, unsigned int &ionOffset) { keyType = key >> 16; ionOffset = key & 0xFFFF; } unsigned int Filter::muxKey(unsigned int keyType, unsigned int ionOffset) { unsigned int key; key = keyType << 16; key|=ionOffset; return key; } std::string Filter::getErrString(unsigned int errCode) const { //First see if we have a generic error code, before attempting to // switch to a specific error code std::string errString; errString = getBaseErrString(errCode); if(!errString.empty()) return errString; return this->getSpecificErrString(errCode); } //If we recognise a base error string, check that std::string Filter::getBaseErrString(unsigned int errCode) { if(errCode == FILTER_ERR_ABORT) return TRANS("Aborted"); return string(""); } #ifdef DEBUG bool FilterProperty::checkSelfConsistent() const { //Filter data type must be known ASSERT(type < PROPERTY_TYPE_ENUM_END); ASSERT(name.size()); //Check each item is parseable as its own type switch(type) { case PROPERTY_TYPE_BOOL: { if(data != "0" && data != "1") return false; break; } case PROPERTY_TYPE_REAL: { float f; if(stream_cast(f,data)) return false; break; } case PROPERTY_TYPE_COLOUR: { ColourRGBA rgba; if(!rgba.parse(data)) return false; break; } case PROPERTY_TYPE_CHOICE: { if(!isMaybeChoiceString(data)) return false; break; } case PROPERTY_TYPE_POINT3D: { Point3D p; if(!p.parse(data)) return false; break; } case PROPERTY_TYPE_INTEGER: { int i; if(stream_cast(i,data)) return false; break; } default: { //Check for the possibility that a choice string is mistyped // - this has happened. However, its possible to get a false positive if(isMaybeChoiceString(data)) { WARN(false, "Possible property not set as choice? It seems to be a choice string..."); } } } return true; } #endif void FilterPropGroup::addProperty(const FilterProperty &prop, size_t group) { #ifdef DEBUG prop.checkSelfConsistent(); #endif if(group >=groupCount) { #ifdef DEBUG WARN(!(group > (groupCount+1)),"Appeared to add multiple groups in one go - not wrong, just unusual."); #endif groupCount=std::max(group+1,groupCount); groupNames.resize(groupCount,string("")); } keyGroupings.push_back(make_pair(prop.key,group)); properties.push_back(prop); } void FilterPropGroup::setGroupTitle(size_t group, const std::string &str) { ASSERT(group &vec) const { ASSERT(targetGroup s; //Check that each key is unique in the keyGroupings list for(size_t ui=0;ui::max(); hardMaxX=hardMaxY=std::numeric_limits::max(); } void PlotStreamData::autoSetHardBounds() { if(xyData.size()) { hardMinX=std::numeric_limits::max(); hardMinY=std::numeric_limits::max(); hardMaxX=-std::numeric_limits::max(); hardMaxY=-std::numeric_limits::max(); for(size_t ui=0;ui=0 ASSERT(!(logarithmic && hardMinY < 0) ); //hardMin should be <=hardMax //-- ASSERT(hardMinX<=hardMaxX); ASSERT(hardMinY<=hardMaxY); //-- //Needs to have a title ASSERT(dataLabel.size()); //If we have regions that can be interacted with, need to have parent ASSERT(!(regionID.size() && !regionParent)); //Must have valid trace style ASSERT(plotStylegetNumIons() == enabledIons.size()); ASSERT(rangeFile->getNumRanges() == enabledIons.size()); } #endif FilterStreamData::FilterStreamData() : parent(0),cached((unsigned int)-1) { } FilterStreamData::FilterStreamData(const Filter *theParent) : parent(theParent),cached((unsigned int)-1) { } unsigned int IonStreamData::exportStreams(const std::vector &selectedStreams, const std::string &outFile, unsigned int format) { ASSERT(format < IONFORMAT_ENUM_END); //test file open, and truncate file to zero bytes std::ofstream f(outFile.c_str(),std::ios::trunc); if(!f) return 1; f.close(); if(format != IONFORMAT_VTK) { for(unsigned int ui=0; uigetStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *ionData; ionData=((const IonStreamData *)(selectedStreams[ui])); //Append this ion stream to the posfile IonHit::appendFile(ionData->data,outFile.c_str(),format); } } } } else { //we don't have an append function, as VTK's legacy // format does not really support this AFAIK. //so we accumulate first. vector ionvec; //-- unsigned int numIons=0; for(unsigned int ui=0; uigetStreamType()) { case STREAM_TYPE_IONS: { numIons+=selectedStreams[ui]->getNumBasicObjects(); break; } } } ionvec.reserve(numIons); for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *ionData; ionData=((const IonStreamData *)(selectedStreams[ui])); for(unsigned int uj=0;ujdata.size();uj++) ionvec.push_back(ionData->data[uj]); break; } } } if(vtk_write_legacy(outFile,VTK_ASCII,ionvec)) return 1; //-- } return 0; } IonStreamData::IonStreamData() : r(1.0f), g(0.0f), b(0.0f), a(1.0f), ionSize(2.0f), valueType("Mass-to-Charge (amu/e)") { streamType=STREAM_TYPE_IONS; } IonStreamData::IonStreamData(const Filter *f) : FilterStreamData(f), r(1.0f), g(0.0f), b(0.0f), a(1.0f), ionSize(2.0f), valueType("Mass-to-Charge (amu/e)") { streamType=STREAM_TYPE_IONS; } void IonStreamData::estimateIonParameters(const std::vector &inData) { map ionSizeMap; map, unsigned int> ionColourMap; std::string lastStr; //Sum up the relative frequencies for(unsigned int ui=0; uigetStreamType() != STREAM_TYPE_IONS) continue; //Keep a count of the number of times we see a particlar // size/colour combination map::iterator itSize; map ,unsigned int>::iterator itData; const IonStreamData* p; p= ((const IonStreamData*)inData[ui]); itSize=ionSizeMap.find(p->ionSize); if(itSize == ionSizeMap.end()) ionSizeMap[p->ionSize]=1; else ionSizeMap[p->ionSize]++; vector tmpRgba; tmpRgba.push_back(p->r); tmpRgba.push_back(p->g); tmpRgba.push_back(p->b); tmpRgba.push_back(p->a); itData = ionColourMap.find(tmpRgba); if(itData == ionColourMap.end()) ionColourMap[tmpRgba]=1; else ionColourMap[tmpRgba]++; if(lastStr.empty()) lastStr=p->valueType ; else lastStr = "Mixed types"; } const vector *tmp=0; size_t min=0; //find the most frequent ion colour for(map, unsigned int>::iterator it=ionColourMap.begin(); it!=ionColourMap.end(); ++it) { if(it->second > min) { tmp = &(it->first); min=it->second; } } //Find the most frequent ion size float tmpSize=1.0; min=0; for(map::iterator it=ionSizeMap.begin(); it!=ionSizeMap.end(); ++it) { if(it->second > min) { tmpSize = it->first; min=it->second; } } ionSize=tmpSize; if(tmp && tmp->size() == 4) { r=(*tmp)[0]; g=(*tmp)[1]; b=(*tmp)[2]; a=(*tmp)[3]; } if(lastStr.size()) valueType=lastStr; else valueType.clear(); } void IonStreamData::estimateIonParameters(const IonStreamData *i) { vector v; v.push_back(i); estimateIonParameters(v); } void IonStreamData::clear() { data.clear(); } IonStreamData *IonStreamData::cloneSampled(float fraction) const { IonStreamData *out = new IonStreamData; out->r=r; out->g=g; out->b=b; out->a=a; out->ionSize=ionSize; out->valueType=valueType; out->parent=parent; out->cached=0; out->data.reserve(fraction*data.size()*0.9f); RandNumGen rng; rng.initTimer(); for(size_t ui=0;uidata.push_back(data[ui]); } return out; } size_t IonStreamData::getNumBasicObjects() const { return data.size(); } VoxelStreamData::VoxelStreamData() : representationType(VOXEL_REPRESENT_POINTCLOUD), r(1.0f),g(0.0f),b(0.0f),a(0.3f), splatSize(2.0f),isoLevel(0.5f) { streamType=STREAM_TYPE_VOXEL; data = new Voxels; } VoxelStreamData::VoxelStreamData(const Filter *f) : FilterStreamData(f), representationType(VOXEL_REPRESENT_POINTCLOUD), r(1.0f),g(0.0f),b(0.0f),a(0.3f), splatSize(2.0f),isoLevel(0.5f) { streamType=STREAM_TYPE_VOXEL; data = new Voxels; } VoxelStreamData::~VoxelStreamData() { if(data) delete data; } size_t VoxelStreamData::getNumBasicObjects() const { return data->getSize(); } void VoxelStreamData::clear() { data->clear(); } RangeStreamData::RangeStreamData() : rangeFile(0) { streamType = STREAM_TYPE_RANGE; } RangeStreamData::RangeStreamData(const Filter *f) : FilterStreamData(f), rangeFile(0) { streamType = STREAM_TYPE_RANGE; } bool RangeStreamData::save(const char *filename, size_t format) const { return !rangeFile->write(filename,format); } Filter::Filter() : cache(true), cacheOK(false) { COMPILE_ASSERT( THREEDEP_ARRAYSIZE(STREAM_NAMES) == NUM_STREAM_TYPES); for(unsigned int ui=0;uicached); delete filterOutputs[ui]; } filterOutputs.clear(); } bool Filter::haveCache() const { return cacheOK; } void Filter::getSelectionDevices(vector &outD) const { outD.resize(devices.size()); std::copy(devices.begin(),devices.end(),outD.begin()); #ifdef DEBUG for(unsigned int ui=0;ui > tmp; outD[ui]->getModifiedBindings(tmp); tmp.clear(); } #endif } void Filter::propagateCache(vector &getOut) const { ASSERT(filterOutputs.size()); //Convert to const pointers (C++ workaround) //-- vector tmpOut; tmpOut.resize(filterOutputs.size()); std::copy(filterOutputs.begin(),filterOutputs.end(),tmpOut.begin()); //-- propagateStreams(tmpOut,getOut); } void Filter::propagateStreams(const vector &dataIn, vector &dataOut,size_t mask,bool invertMask) { //Propagate any inputs that we don't normally block if(invertMask) mask=~mask; for(size_t ui=0;uigetStreamType() & mask) dataOut.push_back(dataIn[ui]); } } unsigned int Filter::collateIons(const vector &dataIn, vector &outVector, ProgressData &prog, size_t totalDataSize) { if(totalDataSize==(size_t)-1) totalDataSize=numElements(dataIn,STREAM_TYPE_IONS); ASSERT(totalDataSize== numElements(dataIn,STREAM_TYPE_IONS)); outVector.resize(totalDataSize); size_t offset=0; for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *d; d=((const IonStreamData *)dataIn[ui]); size_t dataSize=d->data.size(); #pragma omp parallel for if(dataSize > OPENMP_MIN_DATASIZE) for(size_t ui=0;uidata[ui]; if(Filter::wantAbort) return FILTER_ERR_ABORT; offset+=d->data.size(); break; } } } return 0; } void Filter::updateOutputInfo(const std::vector &dataOut) { //Reset the number of output streams to zero for(unsigned int ui=0;uigetStreamType()) < NUM_STREAM_TYPES); numStreamsLastRefresh[getBitNum(dataOut[ui]->getStreamType())]++; } } unsigned int Filter::getNumOutput(unsigned int streamType) const { ASSERT(streamType < NUM_STREAM_TYPES); return numStreamsLastRefresh[streamType]; } std::string Filter::getUserString() const { if(userString.size()) return userString; else return typeString(); } void Filter::initFilter(const std::vector &dataIn, std::vector &dataOut) { dataOut.resize(dataIn.size()); std::copy(dataIn.begin(),dataIn.end(),dataOut.begin()); } ProgressData::ProgressData() { step=0; maxStep=0; curFilter=0; filterProgress=0; totalProgress=0; totalNumFilters=0; } bool ProgressData::operator==( const ProgressData &oth) const { if(filterProgress!=oth.filterProgress || (totalProgress!=oth.totalProgress) || (totalNumFilters!=oth.totalNumFilters) || (step!=oth.step) || (maxStep!=oth.maxStep) || (curFilter!=oth.curFilter )|| (stepName!=oth.stepName) ) return false; return true; } const ProgressData &ProgressData::operator=(const ProgressData &oth) { filterProgress=oth.filterProgress; totalProgress=oth.totalProgress; totalNumFilters=oth.totalNumFilters; step=oth.step; maxStep=oth.maxStep; curFilter=oth.curFilter; stepName=oth.stepName; return *this; } #ifdef DEBUG extern Filter *makeFilter(unsigned int ui); extern Filter *makeFilter(const std::string &s); bool Filter::boolToggleTests() { //Each filter should allow user to toggle any boolean value // here we just test the default visible ones for(unsigned int ui=0;uigetProperties(propGroupOrig); for(size_t ui=0;uisetProperty(p.key,p.data,needUp); //Re-get properties to find altered property FilterPropGroup propGroup; f->getProperties(propGroup); FilterProperty p2; p2 = propGroup.getPropValue(p.key); //Check the property values TEST(p2.data == p.data,"displayed bool property can't be toggled"); //Toggle value back to original status if(p2.data== "0") p2.data= "1"; else p2.data= "0"; //re-set value to toggled version f->setProperty(p2.key,p2.data,needUp); //Re-get properties to see if original value is restored FilterPropGroup fp2; f->getProperties(fp2); p = fp2.getPropValue(p2.key); TEST(p.data== p2.data,"failed trying to set bool value back to original after toggle"); } delete f; } return true; } bool Filter::helpStringTests() { //Each filter should provide help text for each property // here we just test the default visible ones for(unsigned int ui=0;uigetProperties(propGroup); for(size_t ui=0;ui. */ #include "state.h" #include "common/translation.h" #include "common/xmlHelper.h" #include "common/stringFuncs.h" const unsigned int MAX_UNDO_SIZE=10; #include #include using std::vector; using std::string; using std::pair; using std::make_pair; using std::map; using std::endl; //TODO: Remove me? //FIXME: Global - need to make part of AnalysisState. // then provide references as needed //true if modification to state has occurred int stateModifyLevel=STATE_MODIFIED_NONE; void setStateModifyLevel(int newLevel) { stateModifyLevel=std::max(newLevel,stateModifyLevel); } int getStateModifyLevel() { return stateModifyLevel; } AnalysisState::AnalysisState() { useRelativePathsForSave=false; activeCamera=0; savedCameras.push_back(new CameraLookAt); plotLegendEnable=true; rBack=gBack=bBack=0; } void AnalysisState::operator=(const AnalysisState &oth) { clear(); treeState=oth.treeState; stashedTrees=oth.stashedTrees; effects.resize(oth.effects.size()); for(size_t ui=0;uiclone(); savedCameras.resize(oth.savedCameras.size()); for(size_t ui=0;uiclone(); enabledStartupPlots=oth.enabledStartupPlots; plotLegendEnable=oth.plotLegendEnable; fileName=oth.fileName; workingDir=oth.workingDir; useRelativePathsForSave=oth.useRelativePathsForSave; rBack=oth.rBack; gBack=oth.gBack; bBack=oth.bBack; worldAxisMode=oth.worldAxisMode; activeCamera=oth.activeCamera; animationState=oth.animationState; animationPaths=oth.animationPaths; } AnalysisState::~AnalysisState() { clear(); } void AnalysisState::clear() { treeState.clear(); stashedTrees.clear(); clearCams(); clearEffects(); enabledStartupPlots.clear(); fileName.clear(); workingDir.clear(); } void AnalysisState::clearCams() { for(size_t ui=0;ui &fileMapping, bool writePackage, bool setStateModifyLevel) const { //Open file for output std::ofstream f(cpFilename); if(!f) return false; //Write header, also use local language if available const char *headerMessage = NTRANS("This file is a \"state\" file for the 3Depict program, and stores information about a particular analysis session. This file should be a valid \"XML\" file"); f << "" <" << endl; f<" << endl; //write general settings //--------------- f << tabs(1) << "" << endl; f << tabs(1) << "" << endl; //write plot status f << tabs(1) << "" << endl; for(size_t ui=0;ui" << endl; } f<" << endl; if(useRelativePathsForSave) { //Save path information //Note: When writing packages, //- we don't want to leak path names to remote systems //and //- we cannot assume that directory structures are preserved between systems //so don't keep working directory in this case. if(writePackage || workingDir.empty() ) { //Are we saving the sate as a package, if so //make sure we let other 3depict loaders know //that we want to use relative paths f << tabs(1) << ""<< endl; } else { //Not saving a package, however we could be, //for example, be autosaving a load-from-package. //We want to keep relative paths, but //want to be able to find files if something goes askew f << tabs(1) << ""<< endl; } } //--------------- //Write filter tree //--------------- if(!treeState.getTreeRef().saveXML(f,fileMapping,writePackage,useRelativePathsForSave)) return false; //--------------- //Save all cameras. f <" << endl; //First camera is the "working" camera, which is unnamed f << tabs(2) << "" << endl; for(unsigned int ui=0;uiwriteState(f,STATE_FORMAT_XML,2); } f <" << endl; if(stashedTrees.size()) { f << tabs(1) << "" << endl; for(unsigned int ui=0;ui" << endl; stashedTrees[ui].second.saveXML(f,fileMapping, writePackage,useRelativePathsForSave,3); f << tabs(2) << "" << endl; } f << tabs(1) << "" << endl; } //Save any effects if(effects.size()) { f <" << endl; for(unsigned int ui=0;uiwriteState(f,STATE_FORMAT_XML,1); f <" << endl; } //Save any animation data if(animationState.getMaxFrame()) { //Write the flattened tree - "path" - data f << tabs(1) << "" << endl; f << tabs(2) << "" << endl; for(unsigned int ui=0;ui" << endl; } f << tabs(2) << "" << endl; animationState.writeState(f,STATE_FORMAT_XML,2); f << tabs(1) << "" << endl; } //Close XMl tag. f<< "" << endl; //Debug check to ensure we have written a valid xml file ASSERT(isValidXML(cpFilename)); if(setStateModifyLevel) stateModifyLevel=STATE_MODIFIED_NONE; return true; } bool AnalysisState::loadInternal(const char *cpFilename, bool doMerge, std::ostream &errStream) { if(doMerge) { //create another state, and then perform merge AnalysisState otherState; bool loadOK; loadOK= otherState.load(cpFilename,false,errStream); if(!loadOK) return loadOK; this->merge(otherState); return true; } clear(); //Load the state from an XML file //here we use libxml2's loading routines //http://xmlsoft.org/ //Tutorial: http://xmlsoft.org/tutorial/xmltutorial.pdf xmlDocPtr doc; xmlParserCtxtPtr context; context =xmlNewParserCtxt(); if(!context) { errStream << TRANS("Failed to allocate parser") << std::endl; return false; } //Open the XML file doc = xmlCtxtReadFile(context, cpFilename, NULL,XML_PARSE_NOENT|XML_PARSE_NONET); if(!doc) return false; //release the context xmlFreeParserCtxt(context); //By default, lets not use relative paths useRelativePathsForSave=false; //Lets do some parsing goodness //ahh parsing - verbose and boring FilterTree newFilterTree; vector newCameraVec; vector newEffectVec; vector > newStashes; std::string stateDir=onlyDir(cpFilename); try { std::stack nodeStack; //retrieve root node xmlNodePtr nodePtr = xmlDocGetRootElement(doc); //Umm where is our root node guys? if(!nodePtr) { errStream << TRANS("Unable to retrieve root node in input state file... Is this really a non-empty XML file?") << endl; throw 1; } //This *should* be an threeDepict state file if(xmlStrcmp(nodePtr->name, (const xmlChar *)"threeDepictstate")) { errStream << TRANS("Base state node missing. Is this really a state XML file??") << endl; throw 1; } //push root tag nodeStack.push(nodePtr); //Now in threeDepictstate tag nodePtr = nodePtr->xmlChildrenNode; xmlChar *xmlString; //check for version tag & number if(!XMLHelpFwdToElem(nodePtr,"writer")) { xmlString=xmlGetProp(nodePtr, (const xmlChar *)"version"); if(xmlString) { string tmpVer; tmpVer =(char *)xmlString; //Check to see if only contains 0-9 period and "-" characters (valid version number) if(tmpVer.find_first_not_of("0123456789.-")== std::string::npos) { //Check between the writer reported version, and the current program version vector vecStrs; vecStrs.push_back(tmpVer); vecStrs.push_back(PROGRAM_VERSION); if(getMaxVerStr(vecStrs)!=PROGRAM_VERSION) { errStream << TRANS("State was created by a newer version of this program.. ") << TRANS("file reading will continue, but may fail.") << endl ; } } else { errStream<< TRANS("Warning, unparseable version number in state file. File reading will continue, but may fail") << endl; } xmlFree(xmlString); } } else { errStream<< TRANS("Unable to find the \"writer\" node") << endl; throw 1; } //Get the background colour //==== float rTmp,gTmp,bTmp; if(XMLHelpFwdToElem(nodePtr,"backcolour")) { errStream<< TRANS("Unable to find the \"backcolour\" node.") << endl; throw 1; } xmlString=xmlGetProp(nodePtr,(const xmlChar *)"r"); if(!xmlString) { errStream<< TRANS("\"backcolour\" node missing \"r\" value.") << endl; throw 1; } if(stream_cast(rTmp,(char *)xmlString)) { errStream<< TRANS("Unable to interpret \"backColour\" node's \"r\" value.") << endl; throw 1; } xmlFree(xmlString); xmlString=xmlGetProp(nodePtr,(const xmlChar *)"g"); if(!xmlString) { errStream<< TRANS("\"backcolour\" node missing \"g\" value.") << endl; throw 1; } if(stream_cast(gTmp,(char *)xmlString)) { errStream<< TRANS("Unable to interpret \"backColour\" node's \"g\" value.") << endl; throw 1; } xmlFree(xmlString); xmlString=xmlGetProp(nodePtr,(const xmlChar *)"b"); if(!xmlString) { errStream<< TRANS("\"backcolour\" node missing \"b\" value.") << endl; throw 1; } if(stream_cast(bTmp,(char *)xmlString)) { errStream<< TRANS("Unable to interpret \"backColour\" node's \"b\" value.") << endl; throw 1; } if(rTmp > 1.0 || gTmp>1.0 || bTmp > 1.0 || rTmp < 0.0 || gTmp < 0.0 || bTmp < 0.0) { errStream<< TRANS("\"backcolour\"s rgb values must be in range [0,1]") << endl; throw 1; } rBack=rTmp; gBack=gTmp; bBack=bTmp; xmlFree(xmlString); nodeStack.push(nodePtr); if(!XMLHelpFwdToElem(nodePtr,"userelativepaths")) { useRelativePathsForSave=true; //Try to load the original working directory, if possible if(!XMLGetAttrib(nodePtr,workingDir,"origworkdir")) workingDir.clear(); } nodePtr=nodeStack.top(); //==== //Get the axis visibility if(!XMLGetNextElemAttrib(nodePtr,worldAxisMode,"showaxis","value")) { errStream << TRANS("Unable to find or interpret \"showaxis\" node") << endl; throw 1; } //Get plot legend status. // TODO: Deprecate failure check: this is new as of 0.0.16 release (internal ) { xmlNodePtr tmpStatPtr=nodePtr; //Find list of which plots are enabled if(!XMLHelpFwdToElem(tmpStatPtr,"plotstatus")) { //Is the legend enabled? bool enableLegend; if(!XMLHelpGetProp(enableLegend,tmpStatPtr,"legend")) plotLegendEnable=enableLegend; //find plot listing xmlNodePtr enablePlotPtr=tmpStatPtr->xmlChildrenNode; while(enablePlotPtr) { if(XMLHelpFwdToElem(enablePlotPtr,"enableplot")) break; string filterPath; unsigned int plotID; //just abort loading this section if we can't find the filter if(XMLHelpGetProp(plotID,enablePlotPtr,"id")) break; if(XMLHelpGetProp(filterPath,enablePlotPtr,"filter")) break; enabledStartupPlots.push_back(make_pair(unescapeXML(filterPath),plotID)); } } } //find filtertree data if(XMLHelpFwdToElem(nodePtr,"filtertree")) { errStream << TRANS("Unable to locate \"filtertree\" node.") << endl; throw 1; } //Load the filter tree if(newFilterTree.loadXML(nodePtr,errStream,stateDir)) throw 1; //Read camera states, if present nodeStack.push(nodePtr); if(!XMLHelpFwdToElem(nodePtr,"cameras")) { //Move to camera active tag nodePtr=nodePtr->xmlChildrenNode; if(XMLHelpFwdToElem(nodePtr,"active")) { errStream << TRANS("Cameras section missing \"active\" node.") << endl; throw 1; } //read ID of active cam xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) { errStream<< TRANS("Unable to find property \"value\" for \"cameras->active\" node.") << endl; throw 1; } if(stream_cast(activeCamera,xmlString)) { errStream<< TRANS("Unable to interpret property \"value\" for \"cameras->active\" node.") << endl; throw 1; } xmlFree(xmlString); //Spin through the list of each camera while(!XMLHelpNextType(nodePtr,XML_ELEMENT_NODE)) { std::string tmpStr; tmpStr =(const char *)nodePtr->name; Camera *thisCam; thisCam=0; //work out the camera type if(tmpStr == "persplookat") { thisCam = new CameraLookAt; if(!thisCam->readState(nodePtr->xmlChildrenNode)) { std::string s =TRANS("Failed to interpret camera state for camera : "); errStream<< s << newCameraVec.size() << endl; throw 1; } } else { errStream << TRANS("Unable to interpret the camera type for camera : ") << newCameraVec.size() << endl; throw 1; } ASSERT(thisCam); //Discard any cameras that are non-unique There is a bug in some of the writer functions, // so we can receive invalid data. We have to enforce validity bool haveCameraAlready; haveCameraAlready=false; for(unsigned int ui=0; uigetUserString() == newCameraVec[ui]->getUserString()) { haveCameraAlready=true; #ifdef DEBUG cerr << "Found duplicate camera, ignoring" << endl; #endif break; } } if(!haveCameraAlready) newCameraVec.push_back(thisCam); else { delete thisCam; thisCam=0; } } } //Now the cameras are loaded into a temporary vector. We will // copy them into the scene soon nodePtr=nodeStack.top(); nodeStack.pop(); nodeStack.push(nodePtr); //Read stashes if present if(!XMLHelpFwdToElem(nodePtr,"stashedfilters")) { nodeStack.push(nodePtr); //Move to stashes nodePtr=nodePtr->xmlChildrenNode; while(!XMLHelpFwdToElem(nodePtr,"stash")) { string stashName; FilterTree newStashTree; newStashTree.clear(); //read name of stash xmlString=xmlGetProp(nodePtr,(const xmlChar *)"name"); if(!xmlString) { errStream << TRANS("Unable to locate stash name for stash ") << newStashTree.size()+1 << endl; throw 1; } stashName=(char *)xmlString; if(!stashName.size()) { errStream << TRANS("Empty stash name for stash ") << newStashTree.size()+1 << endl; throw 1; } xmlNodePtr tmpNode; tmpNode=nodePtr->xmlChildrenNode; if(XMLHelpFwdToElem(tmpNode,"filtertree")) { errStream << TRANS("No filter tree for stash:") << stashName << endl; throw 1; } if(newStashTree.loadXML(tmpNode,errStream,stateDir)) { errStream << TRANS("For stash ") << newStashTree.size()+1 << endl; throw 1; } //if there were any valid elements loaded (could be empty, for exmapl) if(newStashTree.size()) newStashes.push_back(make_pair(stashName,newStashTree)); } nodePtr=nodeStack.top(); nodeStack.pop(); } nodePtr=nodeStack.top(); nodeStack.pop(); //Read effects, if present nodeStack.push(nodePtr); //Read effects if present if(!XMLHelpFwdToElem(nodePtr,"effects")) { std::string tmpStr; nodePtr=nodePtr->xmlChildrenNode; while(!XMLHelpNextType(nodePtr,XML_ELEMENT_NODE)) { tmpStr =(const char *)nodePtr->name; Effect *e; e = makeEffect(tmpStr); if(!e) { errStream << TRANS("Unrecognised effect :") << tmpStr << std::endl; throw 1; } //Check the effects are unique for(unsigned int ui=0;uigetType()== e->getType()) { delete e; errStream << TRANS("Duplicate effect found") << tmpStr << TRANS(" cannot use.") << std::endl; throw 1; } } nodeStack.push(nodePtr); //Parse the effect if(!e->readState(nodePtr)) { errStream << TRANS("Error reading effect : ") << e->getName() << std::endl; throw 1; } nodePtr=nodeStack.top(); nodeStack.pop(); newEffectVec.push_back(e); } } nodeStack.pop(); nodePtr=nodeStack.top(); if(!XMLHelpFwdToElem(nodePtr,"animationstate")) { nodePtr=nodePtr->xmlChildrenNode; if(!nodePtr) throw 1; if(XMLHelpFwdToElem(nodePtr,"animationtree")) throw 1; //Save this location nodeStack.push(nodePtr); nodePtr=nodePtr->xmlChildrenNode; if(!nodePtr) throw 1; vector > animationPathTmp; //Read the "flattened animation tree while(!XMLHelpFwdToElem(nodePtr,"entry")) { std::string path; size_t val; if(XMLHelpGetProp(val,nodePtr,"key")) throw 1; //read the flattened tree "path" data //-- xmlChar *xmlString; //grab the xml property xmlString = xmlGetProp(nodePtr,(const xmlChar *)"path"); if(!xmlString) throw 1; path=(char *)xmlString; xmlFree(xmlString); //-- animationPathTmp.push_back(make_pair(path,val)); } nodePtr=nodeStack.top(); nodeStack.pop(); if(XMLHelpFwdToElem(nodePtr,"propertyanimator")) throw 1; nodePtr=nodePtr->xmlChildrenNode; if(!nodePtr) throw 1; //Try to load animation state animationState.loadState(nodePtr); animationPaths.swap(animationPathTmp); } nodePtr=nodeStack.top(); nodeStack.pop(); nodeStack.push(nodePtr); } catch (int) { //Code threw an error, just say "bad parse" and be done with it xmlFreeDoc(doc); return false; } xmlFreeDoc(doc); //Check that stashes are uniquely named // do brute force search, as there are unlikely to be many stashes for(unsigned int ui=0;uigetUserString().size()) { savedCameras.push_back(newCameraVec[ui]); } else if (!defaultSet) { ASSERT(savedCameras.size()); delete savedCameras[0]; savedCameras[0]=newCameraVec[ui]; defaultSet=true; } } fileName=cpFilename; if(workingDir.empty()) { char *wd; #if defined(__APPLE__) //Apple defines a special getcwd that just works wd = getcwd(NULL, 0); #elif defined(WIN32) || defined(WIN64) //getcwd under POSIX is not clearly defined, it requires // an input number of bytes that are enough to hold the path, // however it does not define how one goes about obtaining the // number of bytes needed. char *wdtemp = (char*)malloc(PATH_MAX*20); wd=getcwd(wdtemp,PATH_MAX*20); if(!wd) { free(wdtemp); return false; } #else //GNU extension, which just does it (tm). wd = get_current_dir_name(); #endif workingDir=wd; free(wd); } // state is overwritten setStateModifyLevel(STATE_MODIFIED_NONE); #ifdef DEBUG checkSane(); #endif //Perform sanitisation on results return true; } bool AnalysisState::load(const char *cpFilename, bool doMerge,std::ostream &errStream ) { AnalysisState otherState; if(!otherState.loadInternal(cpFilename,doMerge,errStream)) return false; *this=otherState; return true; } void AnalysisState::merge(const AnalysisState &otherState) { setStateModifyLevel(STATE_MODIFIED_DATA); //If we are merging, then there is a chance //of a name-clash. We avoid this by trying to append -merge continuously vector > newStashes; newStashes.resize(otherState.stashedTrees.size()); for(size_t ui=0;ui &newCameraVec = otherState.savedCameras; for(unsigned int ui=0;uigetUserString().empty()) continue; //Keep trying new names appending "-merge" each time to obtain a new, and hopefully unique name // Abort after many times unsigned int maxCount; maxCount=100; while(camNameExists(newCameraVec[ui]->getUserString()) && --maxCount) { newCameraVec[ui]->setUserString(newCameraVec[ui]->getUserString()+"-merge"); } //If we have any attempts left, then it worked if(maxCount) savedCameras.push_back(newCameraVec[ui]->clone()); } } bool AnalysisState::camNameExists(const std::string &s) const { for(size_t ui=0; uigetUserString() == s ) return true; } return false; } int AnalysisState::getWorldAxisMode() const { return worldAxisMode; } void AnalysisState::copyCams(vector &cams) const { ASSERT(!cams.size()); cams.resize(savedCameras.size()); for(size_t ui=0;uiclone(); } void AnalysisState::copyCamsByRef(vector &camRef) const { camRef.resize(savedCameras.size()); for(size_t ui=0;ui=savedCameras.size()) activeCamera=0; } void AnalysisState::addCamByClone(const Camera *c) { setStateModifyLevel(STATE_MODIFIED_ANCILLARY); savedCameras.push_back(c->clone()); } void AnalysisState::addCam(const std::string &camName, bool makeActive) { //Disallow unnamed cameras ASSERT(camName.size()); //Duplicate the current camera, and give it a new name Camera *c=getCam(getActiveCam())->clone(); c->setUserString(camName); setStateModifyLevel(STATE_MODIFIED_ANCILLARY); savedCameras.push_back(c); if(makeActive) activeCamera=savedCameras.size()-1; } bool AnalysisState::setCamProperty(size_t offset, unsigned int key, const std::string &str) { if(offset == activeCamera) setStateModifyLevel(STATE_MODIFIED_VIEW); else setStateModifyLevel(STATE_MODIFIED_ANCILLARY); return savedCameras[offset]->setProperty(key,str); } std::string AnalysisState::getCamName(size_t offset) const { return savedCameras[offset]->getUserString(); } bool AnalysisState::getUseRelPaths() const { return useRelativePathsForSave; } void AnalysisState::getBackgroundColour(float &r, float &g, float &b) const { r=rBack; g=gBack; b=bBack; } void AnalysisState::getAnimationState( PropertyAnimator &p, vector > &animPth) const { p=animationState; animPth=animationPaths; } void AnalysisState::copyEffects(vector &e) const { e.clear(); for(size_t ui=0;uiclone(); } void AnalysisState::setBackgroundColour(float r, float g, float b) { if(rBack != r || gBack!=g || bBack!=b) setStateModifyLevel(STATE_MODIFIED_VIEW); rBack=r; gBack=g; bBack=b; } void AnalysisState::setWorldAxisMode(unsigned int mode) { if(mode) setStateModifyLevel(STATE_MODIFIED_VIEW); worldAxisMode=mode; } void AnalysisState::setCamerasByCopy(vector &c, unsigned int active) { setStateModifyLevel(STATE_MODIFIED_DATA); clearCams(); savedCameras.swap(c); activeCamera=active; } void AnalysisState::setCameraByClone(const Camera *c, unsigned int offset) { ASSERT(offset < savedCameras.size()); delete savedCameras[offset]; savedCameras[offset]=c->clone(); if(offset == activeCamera) setStateModifyLevel(STATE_MODIFIED_VIEW); else setStateModifyLevel(STATE_MODIFIED_ANCILLARY); } void AnalysisState::setEffectsByCopy(const vector &e) { setStateModifyLevel(STATE_MODIFIED_VIEW); clearEffects(); effects.resize(e.size()); for(size_t ui=0;uiclone(); } void AnalysisState::setUseRelPaths(bool useRel) { useRelativePathsForSave=useRel; } void AnalysisState::setWorkingDir(const std::string &work) { if(work!=workingDir) setStateModifyLevel(STATE_MODIFIED_DATA); workingDir=work; } void AnalysisState::setStashedTreesByClone(const vector > &s) { setStateModifyLevel(STATE_MODIFIED_ANCILLARY); stashedTrees=s; } void AnalysisState::addStashedTree(const std::pair &s) { setStateModifyLevel(STATE_MODIFIED_ANCILLARY); stashedTrees.push_back(s); } void AnalysisState::addStashedToFilters(const Filter *parentFilter, unsigned int stashOffset) { //Save current filter state to undo stack treeState.pushUndoStack(); //Retrieve the specified stash pair f; copyStashedTree(stashOffset,f); treeState.addFilterTree(f.second,parentFilter); } void AnalysisState::copyStashedTrees(std::vector > &s) const { s=stashedTrees; } void AnalysisState::copyStashedTree(size_t offset,std::pair &s) const { s=stashedTrees[offset]; } void AnalysisState::copyStashedTree(size_t offset,FilterTree &s) const { s=stashedTrees[offset].second; } void AnalysisState::stashFilters(unsigned int filterId, const char *stashName) { //Obtain the parent filter that we const Filter *target = treeState.getFilterById(filterId); FilterTree newTree; const FilterTree &curTree = treeState.getTreeRef(); curTree.cloneSubtree(newTree,target); addStashedTree(std::make_pair(string(stashName),newTree)); } //Get the stash name std::string AnalysisState::getStashName(size_t offset) const { ASSERT(offset < stashedTrees.size()); return stashedTrees[offset].first; } #ifdef DEBUG void AnalysisState::checkSane() const { ASSERT(activeCamera < savedCameras.size()); ASSERT(rBack >=0.0f && rBack <=1.0f && gBack <= 1.0f && gBack >=0.0f && bBack >=0.0f && bBack <=1.0f); } #endif void AnalysisState::eraseStash(size_t offset) { ASSERT(offset < stashedTrees.size()); setStateModifyLevel(STATE_MODIFIED_ANCILLARY); stashedTrees.erase(stashedTrees.begin() + offset); } void AnalysisState::eraseStashes(std::vector &offsets) { std::sort(offsets.begin(),offsets.end()); ASSERT(std::unique(offsets.begin(),offsets.end()) == offsets.end()); setStateModifyLevel(STATE_MODIFIED_ANCILLARY); for(unsigned int ui=offsets.size();ui>0;) { ui--; stashedTrees.erase(stashedTrees.begin() + offsets[ui]); } } bool AnalysisState::hasStateOverrides() const { if(treeState.hasStateOverrides()) return true; for(size_t ui=0;ui idInUse(filterMap.size()+1,false); for(map::const_iterator it=filterMap.begin();it!=filterMap.end();++it) { idInUse[it->first] = true; } //Find which ID we can use for inserting stuff into the filtermap size_t idToUse; for(size_t ui=0;uinew filter * tree::pre_order_iterator itB; itB=filterTree.depthBegin(); std::map filterRemap; for(tree::pre_order_iterator itA=f.depthBegin(); itA!=f.depthEnd(); ++itA) { ASSERT(itB != filterTree.depthEnd()); filterRemap[*itA]=*itB; ++itB; } //Overwrite the internal map for(map::iterator it=filterMap.begin();it!=filterMap.end();++it) it->second=filterRemap[it->second]; //Swap the internal tree with our clone f.swap(filterTree); } //!Duplicate a branch of the tree to a new position. Do not copy cache, bool TreeState::copyFilter(size_t toCopy, size_t newParent,bool copyToRoot) { pushUndoStack(); bool ret; if(copyToRoot) ret=filterTree.copyFilter(filterMap[toCopy],0); else ret=filterTree.copyFilter(filterMap[toCopy],filterMap[newParent]); if(ret) { //Delete the filtermap, as the current data is not valid anymore filterMap.clear(); } return ret; } const Filter* TreeState::getFilterById(size_t filterId) const { //If triggering this assertion, check that //::updateWxTreeCtrl called after calling addFilterTree. ASSERT(filterMap.size()); //Check that the mapping exists ASSERT(filterMap.find(filterId)!=filterMap.end()); return filterMap.at(filterId); } size_t TreeState::getIdByFilter(const Filter* f) const { for(map::const_iterator it=filterMap.begin(); it!=filterMap.end();++it) { if(it->second == f) return it->first; } ASSERT(false); return (size_t)-1; } void TreeState::getFiltersByType(std::vector &filters, unsigned int type) const { filterTree.getFiltersByType(filters,type); } void TreeState::setCachePercent(unsigned int newPct) { filterTree.setCachePercent(newPct); } void TreeState::removeFilterSubtree(size_t filterId) { //Save current filter state to undo stack pushUndoStack(); filterTree.removeSubtree(filterMap[filterId]); //FIXME: Faster implementation involving removal from map //-- map newMap; for(map::iterator it=filterMap.begin(); it!=filterMap.end();++it) { if(filterTree.contains(it->second)) newMap[it->first] = it->second; } newMap.swap(filterMap); //-- } bool TreeState::reparentFilter(size_t filter, size_t newParent) { //Save current filter state to undo stack pushUndoStack(); //Try to reparent this filter. It might not work, if, for example // the new parent is actually a child of the filter we are trying to // assign the parent to. if(!filterTree.reparentFilter(filterMap[filter],filterMap[newParent])) { //Didn't work. Pop the undo stack, to reverse our //push, but don't restore it, // as this would cost us our filter caches popUndoStack(false); return false; } return true; } bool TreeState::setFilterProperty(size_t filterId, unsigned int key, const std::string &value, bool &needUpdate) { //Save current filter state to undo stack //for the case where the property change is good pushUndoStack(); bool setOK; setOK=filterTree.setFilterProperty(filterMap[filterId],key,value,needUpdate); if(!setOK) { //Didn't work, so we need to discard the undo //Pop the undo stack, but don't restore it - // restoring would destroy the cache popUndoStack(false); } return setOK; } void TreeState::setFilterString(size_t filterId, const std::string &s) { Filter *f; f = filterMap[filterId]; f->setUserString(s); } unsigned int TreeState::refresh(std::list &refreshData, std::vector > &consoleMessages, ProgressData &curProg) { //Attempt to acquire a lock. Return -1 if locking fails wxMutexLocker lock(amRefreshing); if(!lock.IsOk()) { ASSERT(false); // should not get here. Caller should not // try to double-refresh return -1; } ASSERT(refreshData.empty()) //Analyse the filter tree structure for any errors //-- fta.analyse(filterTree); //-- //Reset the progress back to zero curProg.reset(); //clear old devices selectionDevices.clear(); //Remove any updates pendingUpdates=false; wantAbort=false; //Run the tree refresh system. unsigned int errCode; errCode=filterTree.refreshFilterTree(refreshData,selectionDevices, consoleMessages,curProg,wantAbort); //return error code, if any return errCode; } void TreeState::pushUndoStack() { if(undoFilterStack.size() > MAX_UNDO_SIZE) undoFilterStack.pop_front(); undoFilterStack.push_back(filterTree); redoFilterStack.clear(); } void TreeState::popUndoStack(bool restorePopped) { ASSERT(undoFilterStack.size()); //Save the current filters to the redo stack. // note that the copy constructor will generate a clone for us. redoFilterStack.push_back(filterTree); if(redoFilterStack.size() > MAX_UNDO_SIZE) redoFilterStack.pop_front(); if(restorePopped) { //Swap the current filter cache out with the undo stack result filterTree.swap(undoFilterStack.back()); } //Pop the undo stack undoFilterStack.pop_back(); setStateModifyLevel(STATE_MODIFIED_DATA); } void TreeState::popRedoStack() { ASSERT(undoFilterStack.size() <=MAX_UNDO_SIZE); undoFilterStack.push_back(filterTree); //Swap the current filter cache out with the redo stack result filterTree.swap(redoFilterStack.back()); //Pop the redo stack redoFilterStack.pop_back(); setStateModifyLevel(STATE_MODIFIED_DATA); } void TreeState::applyBindings(const std::vector > &bindings) { if(!bindings.size()) return; pushUndoStack(); for(unsigned int ui=0;ui::iterator it=filterTree.depthBegin(); it!=filterTree.depthEnd();++it) { if(*it == bindings[ui].first) { //We are modifying the contents of //the filter, this could make a change that //modifies output so we need to clear //all subtree caches to force reprocessing filterTree.clearCache(*it,false); (*it)->setPropFromBinding(bindings[ui].second); #ifdef DEBUG haveBind=true; #endif break; } } ASSERT(haveBind); } } void TreeState::applyBindingsToTree() { //Clear any updates pendingUpdates=false; //Retrieve all the modified bindings vector > bindings; for(unsigned int ui=0;uigetModifiedBindings(bindings); applyBindings(bindings); //Clear the modifications to the selection devices for(unsigned int ui=0;uiresetModifiedBindings(); } bool TreeState::hasUpdates() const { return pendingUpdates; } bool TreeState::hasMonitorUpdates() const { for(tree::iterator it=filterTree.depthBegin(); it!=filterTree.depthEnd();++it) { if((*it)->monitorNeedsRefresh()) return true; } return false; } #ifdef DEBUG #include "./filters/ionDownsample.h" bool testStateReload(); bool runStateTests() { return testStateReload(); } bool testStateReload() { AnalysisState someState; someState.setWorldAxisMode(0); someState.setBackgroundColour(0,0,0); FilterTree tree; IonDownsampleFilter *f = new IonDownsampleFilter; tree.addFilter(f,NULL); ASSERT(tree.size()); someState.addStashedTree(make_pair("someStash",tree)); ASSERT(tree.size()); someState.treeState.swapFilterTree(tree); std::string saveString; genRandomFilename(saveString); map dummyMapping; if(!someState.save(saveString.c_str(),dummyMapping,false)) { WARN(false, "Unable to save file.. write permissions? Skipping test"); return true; } someState.clear(); std::ofstream strm; TEST(someState.load(saveString.c_str(),false,strm),"State load"); TEST(someState.getStashCount() == 1,"Stash save+load"); std::pair stashOut; someState.copyStashedTree(0,stashOut); TEST(stashOut.first == "someStash","Stash name conservation"); rmFile(saveString); return true; } #endif 3Depict-0.0.19/src/backend/filter.h0000644000175000017500000005616112716174467016324 0ustar pcuserpcuser/* * filter.h - Data filter header file. * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef FILTER_H #define FILTER_H class Filter; class FilterStreamData; class ProgressData; class RangeFileFilter; #include "APT/ionhit.h" #include "APT/APTFileIO.h" #include "APT/APTRanges.h" #include "common/constants.h" #include "gl/select.h" #include "gl/drawables.h" #include "common/stringFuncs.h" #include "common/array2D.h" template class Voxels; //ifdef inclusion as there is some kind of symbol clash... #ifdef ATTRIBUTE_PRINTF #pragma push_macro("ATTRIBUTE_PRINTF") #include #pragma pop_macro(" ATTRIBUTE_PRINTF") #else #include #undef ATTRIBUTE_PRINTF #endif #include const unsigned int NUM_CALLBACK=50000; const unsigned int IONDATA_SIZE=4; //!Filter types -- must match array FILTER_NAMES enum { FILTER_TYPE_DATALOAD, FILTER_TYPE_IONDOWNSAMPLE, FILTER_TYPE_RANGEFILE, FILTER_TYPE_SPECTRUMPLOT, FILTER_TYPE_IONCLIP, FILTER_TYPE_IONCOLOURFILTER, FILTER_TYPE_PROFILE, FILTER_TYPE_BOUNDBOX, FILTER_TYPE_TRANSFORM, FILTER_TYPE_EXTERNALPROC, FILTER_TYPE_SPATIAL_ANALYSIS, FILTER_TYPE_CLUSTER_ANALYSIS, FILTER_TYPE_VOXELS, FILTER_TYPE_IONINFO, FILTER_TYPE_ANNOTATION, FILTER_TYPE_ENUM_END // not a filter. just end of enum }; extern const char *FILTER_NAMES[]; //Stream data types. note that bitmasks are occasionally used, so we are limited in //the number of stream types that we can have. //Current bitmask using functions are // VisController::safeDeleteFilterList const unsigned int NUM_STREAM_TYPES=6; const unsigned int STREAMTYPE_MASK_ALL= ((1<<(NUM_STREAM_TYPES)) -1 ) & 0x000000FF; enum { STREAM_TYPE_IONS=1, STREAM_TYPE_PLOT=2, STREAM_TYPE_PLOT2D=4, STREAM_TYPE_DRAW=8, STREAM_TYPE_RANGE=16, STREAM_TYPE_VOXEL=32 }; //Keys for binding IDs enum { BINDING_CYLINDER_RADIUS=1, BINDING_SPHERE_RADIUS, BINDING_CYLINDER_ORIGIN, BINDING_SPHERE_ORIGIN, BINDING_PLANE_ORIGIN, BINDING_CYLINDER_DIRECTION, BINDING_PLANE_DIRECTION, BINDING_RECT_TRANSLATE, BINDING_RECT_CORNER_MOVE }; extern const char *STREAM_NAMES[]; //Representations enum { //VoxelStreamData VOXEL_REPRESENT_POINTCLOUD, VOXEL_REPRESENT_ISOSURF, VOXEL_REPRESENT_AXIAL_SLICE, VOXEL_REPRESENT_END }; //Error codes for each of the filters. //These can be passed to the getErrString() function for //a human readable error message //--- enum { FILE_TYPE_NULL, FILE_TYPE_XML, FILE_TYPE_POS }; //!Generic filter error codes enum { FILTER_ERR_ABORT = 1000000, }; //--- // //!Return the number of elements in a vector of filter data - i.e. the sum of the number of objects within each stream. Only masked streams (STREAM_TYPE_*) will be counted size_t numElements(const std::vector &vm, unsigned int mask=STREAMTYPE_MASK_ALL); //!Abstract base class for data types that can propagate through filter system class FilterStreamData { protected: unsigned int streamType; public: //!Parent filter pointer const Filter *parent; //!Tells us if the filter has cached this data for later use. //this is a boolean value, but not declared as such, as there //are debug traps to tell us if this is not set by looking for non-boolean values. unsigned int cached; FilterStreamData(); FilterStreamData(const Filter *); virtual ~FilterStreamData() {}; virtual size_t getNumBasicObjects() const =0; //!Returns an integer unique to the class to identify type (yes rttid...) virtual unsigned int getStreamType() const {return streamType;} ; //!Free mem held by objects virtual void clear()=0; #ifdef DEBUG //Cross-checks fields to determine if (best guess) ///data structure has a sane combination of values virtual void checkSelfConsistent() const {} #endif }; class FilterProperty { public: //!Human readable short help (tooltip) for each of the keys std::string helpText; //!Data type for this element unsigned int type; //!Unique key value for this element size_t key; //!Property data std::string data; //!Secondary property data // - eg for file, contains wildcard mask for filename std::string dataSecondary; //!name of property std::string name; bool checkSelfConsistent() const; }; class FilterPropGroup { private: //!The groupings for the keys in contained properties. // First entry is the key ID, second is he group that it belongs to std::vector > keyGroupings; //!Names for each group of keys. std::vector groupNames; //!Key information std::vector properties; size_t groupCount; public: FilterPropGroup() { groupCount=0;} //!Add a property to a grouping void addProperty(const FilterProperty &prop, size_t group); //!Set the title text for a particular group void setGroupTitle(size_t group, const std::string &str); //!Obtain the title of the nth group void getGroupTitle(size_t group, std::string &str) const ; //Obtain a property by its key const FilterProperty &getPropValue(size_t key) const; //Retrieve the number of groups size_t numGroups() const { return groupCount;}; bool hasProp(size_t key) const; //Get number of keys size_t numProps() const { return properties.size(); } //Erase all stored information void clear() { groupNames.clear();keyGroupings.clear(); properties.clear(); groupCount=0;} //!Grab all properties from the specified group void getGroup(size_t group, std::vector &groupVec) const; //Confirm a particular group exists bool hasGroup(size_t group) const; //!Get the nth key const FilterProperty &getNthProp(size_t nthProp) const { return properties[nthProp];}; #ifdef DEBUG void checkConsistent() const; #endif }; //!Point with m-t-c value data class IonStreamData : public FilterStreamData { public: IonStreamData(); IonStreamData(const Filter *f); void clear(); //Sample the data vector to the specified fraction void sample(float fraction); //Duplicate this object, but only using a sampling of the data // vector. The retuned object must be deleted by the // caller. Cached status is *not* duplicated IonStreamData *cloneSampled(float fraction) const; size_t getNumBasicObjects() const; //Ion colour + transparancy in [0,1] colour space. float r,g,b,a; //Ion Size in 2D opengl units float ionSize; //!The name for the type of data -- nominally "mass-to-charge" std::string valueType; //!Apply filter to input data stream std::vector data; //!export given filterstream data pointers as ion data static unsigned int exportStreams(const std::vector &selected, const std::string &outFile, unsigned int format=IONFORMAT_POS); //!Use heuristics to guess best display parameters for this ionstream. May attempt to leave them alone void estimateIonParameters(const std::vector &inputData); void estimateIonParameters(const IonStreamData *inputFilter); }; //!Point with m-t-c value data class VoxelStreamData : public FilterStreamData { public: VoxelStreamData(); ~VoxelStreamData(); VoxelStreamData( const Filter *f); size_t getNumBasicObjects() const ; void clear(); unsigned int representationType; float r,g,b,a; float splatSize; float isoLevel; //!Apply filter to input data stream Voxels *data; }; //!Plotting data class PlotStreamData : public FilterStreamData { public: PlotStreamData(); PlotStreamData(const Filter *f); bool save(const char *filename) const; //erase plot contents void clear() {xyData.clear();}; //Get data size size_t getNumBasicObjects() const { return xyData.size();}; //Use the contained XY data to set hard plot bounds void autoSetHardBounds(); //plot colour float r,g,b,a; //plot trace mode - enum PLOT_TRACE unsigned int plotStyle; //plot mode - enum PLOT_MODE unsigned int plotMode; //use logarithmic mode? bool logarithmic; //title for data std::string dataLabel; //Label for X, Y axes std::string xLabel,yLabel; //!When showing raw XY data, is the data // label a better descriptor of Y than the y-label? bool useDataLabelAsYDescriptor; //!XY data pairs for plotting curve std::vector > xyData; //!Rectangular marked regions std::vector > regions; std::vector regionTitle; //!Region colours std::vector regionR,regionB,regionG; //!Region indices from parent region std::vector regionID; //!Region parent filter pointer, used for matching interaction // with region to parent property Filter *regionParent; //!Parent filter index unsigned int index; //!Error bar mode PLOT_ERROR errDat; //!Hard bounds that cannot be exceeded when drawing plot float hardMinX,hardMaxX,hardMinY,hardMaxY; #ifdef DEBUG //Cross-checks fields to determine if (best guess) ///data structure has a sane combination of values virtual void checkSelfConsistent() const; #endif }; //!2D Plotting data class Plot2DStreamData : public FilterStreamData { public: Plot2DStreamData(); Plot2DStreamData(const Filter *f); //erase plot contents void clear() {xyData.clear();}; size_t getNumBasicObjects() const; //title for data std::string dataLabel; //Label for X, Y axes std::string xLabel,yLabel; unsigned int plotType; //!Structured XY data pairs for plotting curve Array2D xyData; //Only rqeuired for xy plots float xMin,xMax,yMin,yMax; float r,g,b,a; //!Unstructured XY points std::vector > scatterData; //optional intensity data for scatter plots std::vector scatterIntensity; //Do we want to plot the scatter intensity in lgo mode? bool scatterIntensityLog; //!Parent filter index unsigned int index; #ifdef DEBUG void checkSelfConsistent() const; #endif }; //!Drawable objects, for 3D decoration. class DrawStreamData: public FilterStreamData { public: //!Vector of 3D objects to draw. std::vector drawables; //!constructor DrawStreamData(){ streamType=STREAM_TYPE_DRAW;}; DrawStreamData(const Filter *f){ streamType=STREAM_TYPE_DRAW;}; //!Destructor ~DrawStreamData(); //!Returns 0, as this does not store basic object types -- i.e. is not for data storage per se. size_t getNumBasicObjects() const { return 0; } //!Erase the drawing vector, deleting its components void clear(); #ifdef DEBUG //Cross-checks fields to determine if (best guess) ///data structure has a sane combination of values void checkSelfConsistent() const; #endif }; //!Range file propagation class RangeStreamData : public FilterStreamData { public: //!range file filter from whence this propagated. Do not delete[] pointer at all, this class does not OWN the range data //it merely provides access to existing data. RangeFile *rangeFile; //Enabled ranges from source filter std::vector enabledRanges; //Enabled ions from source filter std::vector enabledIons; //!constructor RangeStreamData(); RangeStreamData(const Filter *f); //!Destructor ~RangeStreamData() {}; //!save the range data to a file bool save(const char *filename, size_t format) const; //!Returns 0, as this does not store basic object types -- i.e. is not for data storage per se. size_t getNumBasicObjects() const { return 0; } //!Unlink the pointer void clear() { rangeFile=0;enabledRanges.clear();enabledIons.clear();}; #ifdef DEBUG void checkSelfConsistent() const ; #endif }; //!Abstract base filter class. class Filter { protected: bool cache, cacheOK; static bool strongRandom; //!Array of the number of streams propagated on last refresh //This is initialised to -1, which is considered invalid unsigned int numStreamsLastRefresh[NUM_STREAM_TYPES]; //!Temporary console output. Should be only nonzero size if messages are present //after refresh, until cache is cleared std::vector consoleOutput; //!User settable labelling string (human readable ID, etc etc) std::string userString; //Filter output cache std::vector filterOutputs; //!User interaction "Devices" associated with this filter std::vector devices; //Collate ions from filterstream data into an ionhit vector static unsigned int collateIons(const std::vector &dataIn, std::vector &outVector, ProgressData &prog, size_t totalDataSize=(size_t)-1); //!Propagate the given input data to an output vector static void propagateStreams(const std::vector &dataIn, std::vector &dataOut,size_t mask=STREAMTYPE_MASK_ALL,bool invertMask=false) ; //!Propagate the cache into output void propagateCache(std::vector &dataOut) const; //Set a property, without any checking of the new value // -clears cache on change // - and skipping if no actual change between old and new prop // returns true if change applied OK. template bool applyPropertyNow(T &oldProp,const std::string &newVal, bool &needUp); //place a stream object into the filter cache, if required // does not place object into filter output - you need to do that yourself void cacheAsNeeded(FilterStreamData *s); //!Get the generic (applies to any filter) error codes static std::string getBaseErrString(unsigned int errCode); //!Get the per-filter error codes virtual std::string getSpecificErrString(unsigned int errCode) const=0; public: Filter() ; virtual ~Filter(); //Abort pointer . This must be nonzero during filter refreshes static ATOMIC_BOOL *wantAbort; //Pure virtual functions //==== //!Duplicate filter contents, excluding cache. virtual Filter *cloneUncached() const = 0; //!Apply filter to new data, updating cache as needed. Vector of returned pointers must be deleted manually, first checking ->cached. virtual unsigned int refresh(const std::vector &dataIn, std::vector &dataOut, ProgressData &progress ) =0; //!Erase cache virtual void clearCache(); //!Erase any active devices virtual void clearDevices(); //!Get (approx) number of bytes required for cache virtual size_t numBytesForCache(size_t nObjects) const =0; //!return type ID virtual unsigned int getType() const=0; //!Return filter type as std::string virtual std::string typeString()const =0; //!Get the properties of the filter, in key-value form. First vector is for each output. virtual void getProperties(FilterPropGroup &propertyList) const =0; //!Set the properties for the nth filter, //!needUpdate tells us if filter output changes due to property set //Note that if you modify a result without clearing the cache, //then any downstream decision based upon that may not be noted in an update //Take care. virtual bool setProperty(unsigned int key, const std::string &value, bool &needUpdate) = 0; //!Get the human readable error string associated with a particular error code during refresh(...). Do *not* override this for specific filter errors. Override getSpecificErrString std::string getErrString(unsigned int code) const; //!Dump state to output stream, using specified format /* Current supported formats are STATE_FORMAT_XML */ virtual bool writeState(std::ostream &f, unsigned int format, unsigned int depth=0) const = 0; //!Read state from XML stream, using xml format /* Current supported formats are STATE_FORMAT_XML */ virtual bool readState(xmlNodePtr& n, const std::string &packDir="") = 0; //!Get the bitmask encoded list of filterStreams that this filter blocks from propagation. // i.e. if this filterstream is passed to refresh, it is not emitted. // This MUST always be consistent with ::refresh for filters current state. virtual unsigned int getRefreshBlockMask() const =0; //!Get the bitmask encoded list of filterstreams that this filter emits from ::refresh. // This MUST always be consistent with ::refresh for filters current state. virtual unsigned int getRefreshEmitMask() const = 0; //!Mask of filter streams that will be examined by the filter in its computation. // note that output may be emitted as a pass-through even if the use is not set // - check emitmask if needed virtual unsigned int getRefreshUseMask() const =0; //==== //!Return the unique name for a given filter -- DO NOT TRANSLATE std::string trueName() const { return FILTER_NAMES[getType()];}; //!Initialise the filter's internal state using limited filter stream data propagation //NOTE: CONTENTS MAY NOT BE CACHED. virtual void initFilter(const std::vector &dataIn, std::vector &dataOut); //!Return the XML elements that refer to external entities (i.e. files) which do not move with the XML files. At this time, only files are supported. These will be looked for on the filesystem and moved as needed virtual void getStateOverrides(std::vector &overrides) const {}; //!Enable/disable caching for this filter void setCaching(bool enableCache) {cache=enableCache;}; //!Have cached output data? bool haveCache() const; //!Return a user-specified string, or just the typestring if user set string not active virtual std::string getUserString() const ; //!Set a user-specified string return value is virtual void setUserString(const std::string &str) { userString=str;}; //!Modified version of writeState for packaging. By default simply calls writeState. //value overrides override the values returned by getStateOverrides. In order. virtual bool writePackageState(std::ostream &f, unsigned int format, const std::vector &valueOverrides,unsigned int depth=0) const {return writeState(f,format,depth);}; //!Get the selection devices for this filter. MUST be called after refresh() /*No checking is done that the selection devices will not interfere with one * another at this level (for example setting two devices on one primitve, * with the same mouse/key bindings). So dont do that. */ void getSelectionDevices(std::vector &devices) const; //!Update the output statistics for this filter (num items of streams of each type output) void updateOutputInfo(const std::vector &dataOut); //!Set the binding value for a float virtual void setPropFromBinding(const SelectionBinding &b)=0; //!Set a region update virtual void setPropFromRegion(unsigned int method, unsigned int regionID, float newPos); //!Can this filter perform actions that are potentially a security concern? virtual bool canBeHazardous() const {return false;} ; //!Get the number of outputs for the specified type during the filter's last refresh unsigned int getNumOutput(unsigned int streamType) const; //!Get the filter messages from the console. To erase strings, either call erase, or erase cahche void getConsoleStrings(std::vector &v) const { v=consoleOutput;}; void clearConsole() { consoleOutput.clear();}; //!Should filters use strong randomisation (where applicable) or not? static void setStrongRandom(bool strongRand) {strongRandom=strongRand;}; //Check to see if the filter needs to be refreshed virtual bool monitorNeedsRefresh() const { return false;}; //Are we a pure data source - i.e. can function with no input virtual bool isPureDataSource() const { return false;}; //Can we be a useful filter, even if given no input specified by the Use mask? virtual bool isUsefulAsAppend() const { return false;} template static void getStreamsOfType(const std::vector &vec, std::vector &dataOut); #ifdef DEBUG //!Run all the registered unit tests for this filter virtual bool runUnitTests() { std::cerr << "No test for " << typeString() << std::endl; return true;} ; //!Is the filter caching? bool cacheEnabled() const {return cache;}; static bool boolToggleTests() ; static bool helpStringTests() ; #endif //These functions are private for non-debug builds, to allow unit tests to access these #ifndef DEBUG protected: #endif //!Hack to merge/extract two bits of information into a single property key. //It does this by abusing some bitshifting, to make use of usually unused key range static void demuxKey(unsigned int key, unsigned int &keyType, unsigned int &ionOffset); static unsigned int muxKey(unsigned int keyType, unsigned int ionOffset); }; template void Filter::getStreamsOfType(const std::vector &vec, std::vector &dataOut) { T dummyInstance; for(size_t ui=0;uigetStreamType() == dummyInstance.getStreamType()) dataOut.push_back((const T*)vec[ui]); } } //Template specialisations & def for applyPropertyNow //-- template<> bool Filter::applyPropertyNow(Point3D &prop, const std::string &val, bool &needUp); template<> bool Filter::applyPropertyNow(bool &prop, const std::string &val, bool &needUp); template<> bool Filter::applyPropertyNow(std::string &prop, const std::string &val, bool &needUp); template bool Filter::applyPropertyNow(T &prop, const std::string &val, bool &needUp) { // no update initially needed needUp=false; //convert to type T std::string s; s=stripWhite(val); T tmp; if(stream_cast(tmp,s)) return false; //return true, as it is technically ok that we assign to self. // needUp however stays false, as the property is the same. if(tmp == prop) return true; prop=tmp; clearCache(); needUp=true; return true; } //-- //!Class that tracks the progress of scene updates class ProgressData { public: //!Progress of filter (out of 100, or -1 for no progress information) for current filter unsigned int filterProgress; //!Number of filters (n) that we have processed (n out of m filters) unsigned int totalProgress; //!number of filters which need processing for this update unsigned int totalNumFilters; //!Current step unsigned int step; //!Maximum steps unsigned int maxStep; //!Pointer to the current filter that is being updated. const Filter *curFilter; //!Name of current operation, if specified std::string stepName; ProgressData(); bool operator==(const ProgressData &o) const; const ProgressData &operator=(const ProgressData &o); void reset() { filterProgress=(unsigned int) -1; totalProgress=step=maxStep=0;curFilter=0; totalNumFilters=1; stepName.clear();}; void clock() { filterProgress=(unsigned int)-1; step=maxStep=0;curFilter=0;totalProgress++; stepName.clear();}; }; #endif 3Depict-0.0.19/src/backend/APT/0000755000175000017500000000000012723200266015262 5ustar pcuserpcuser3Depict-0.0.19/src/backend/APT/APTFileIO.h0000644000175000017500000000530512716174467017131 0ustar pcuserpcuser/* * APTClasses.h - Generic APT components header * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef APTCLASSES_H #define APTCLASSES_H #include "common/basics.h" class IonHit; using std::vector; class IonHit; extern const char *POS_ERR_STRINGS[]; extern const char *ION_TEXT_ERR_STRINGS[]; extern const char *LAWATAP_ATO_ERR_STRINGS[]; extern const char *TEXT_LOAD_ERR_STRINGS[]; //!Errors that can be encountered when openning pos files enum posErrors { POS_ALLOC_FAIL=1, POS_OPEN_FAIL, POS_EMPTY_FAIL, POS_SIZE_MODULUS_ERR, POS_READ_FAIL, POS_NAN_LOAD_ERROR, POS_INF_LOAD_ERROR, POS_ABORT_FAIL, POS_ERR_FINAL // Not actually an error, but tells us where the end of the num is. }; //!Load a pos file directly into a single ion list /*! Pos files are fixed record size files, with data stored as 4byte * big endian floating point. (IEEE 574?). Data is stored as * x,y,z,mass/charge. * */ //!Load a pos file into a T of IonHits unsigned int GenericLoadFloatFile(unsigned int inputnumcols, unsigned int outputnumcols, const unsigned int index[], vector &posIons,const char *posFile, unsigned int &progress, ATOMIC_BOOL &wantAbort); unsigned int LimitLoadPosFile(unsigned int inputnumcols, unsigned int outputnumcols, const unsigned int index[], vector &posIons,const char *posFile, size_t limitCount, unsigned int &progress, ATOMIC_BOOL &wantAbort,bool strongRandom); unsigned int limitLoadTextFile(unsigned int numColsTotal, vector > &data,const char *posFile, const char *deliminator, const size_t limitCount, unsigned int &progress, ATOMIC_BOOL &wantAbort,bool strongRandom); //Load a CAMECA LAWATAP "ATO" formatted file. // - This is a totally different format to the "FlexTAP" ato format //Supported versions are "version 3" // Force endian : 0 - do not force, autodetect, 1 - force little, 2- force big unsigned int LoadATOFile(const char *fileName, vector &ions, unsigned int &progressm, ATOMIC_BOOL &wantAbort, unsigned int forceEndian=0); #ifdef DEBUG bool testFileIO(); #endif #endif 3Depict-0.0.19/src/backend/APT/vtk.h0000644000175000017500000000262112716174467016257 0ustar pcuserpcuser/* * vtk.h - VTK file Import-export * Copyright (C) 2016, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VTK_H #define VTK_H #include #include #include "ionhit.h" #include "common/voxels.h" enum { VTK_ERR_FILE_OPEN_FAIL=1, VTK_ERR_NOT_IMPLEMENTED, VTK_ERR_ENUM_END }; enum { VTK_ASCII, VTK_BINARY, VTK_FORMAT_ENUM_END }; //write ions to a VTK (paraview compatible) file. // FIXME : This currenly only supports ASCII mode. // Need binary mode because of the large files we have unsigned int vtk_write_legacy(const std::string &filename, unsigned int format, const std::vector &ions); unsigned int vtk_write_legacy(const std::string &filename, unsigned int format, const Voxels &vox); #ifdef DEBUG //unit testing bool testVTKExport(); #endif #endif 3Depict-0.0.19/src/backend/APT/APTFileIO.cpp0000644000175000017500000006100512640746376017463 0ustar pcuserpcuser/* * APTClasses.h - Generic APT components code * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "APTFileIO.h" #include "ionhit.h" #include "../../common/stringFuncs.h" #include "../../common/basics.h" #include "../../common/translation.h" #include #include using std::pair; using std::string; using std::vector; using std::ifstream; using std::make_pair; const size_t PROGRESS_REDUCE=5000; //--------- const char *TEXT_LOAD_ERR_STRINGS[] = { "", NTRANS("Error opening file"), NTRANS("Only found header, no data"), NTRANS("Unable to reopen file after first scan"), NTRANS("Error whilst reading file contents"), NTRANS("Unexpected file format"), NTRANS("Unexpected file format"), NTRANS("Insufficient memory to continue"), }; const char *POS_ERR_STRINGS[] = { "", NTRANS("Memory allocation failure on POS load"), NTRANS("Error opening pos file"), NTRANS("Pos file empty"), NTRANS("Pos file size appears to have non-integer number of entries"), NTRANS("Error reading from pos file (after open)"), NTRANS("Error - Found NaN in pos file"), NTRANS("Error - Found Inf in pos file"), NTRANS("Pos load aborted by interrupt.") }; //--------- //Text file error codes and strings //--------- enum { TEXT_ERR_OPEN=1, TEXT_ERR_ONLY_HEADER, TEXT_ERR_REOPEN, TEXT_ERR_READ_CONTENTS, TEXT_ERR_FORMAT, TEXT_ERR_ALLOC_FAIL, TEXT_ERR_ENUM_END //not an error, just end of enum }; const char *ION_TEXT_ERR_STRINGS[] = { "", NTRANS("Error opening file"), NTRANS("No numerical data found"), NTRANS("Error re-opening file, after first scan"), NTRANS("Unable to read file contents after open"), NTRANS("Error interpreting field in file"), NTRANS("Incorrect number of fields in file"), NTRANS("Unable to allocate memory to store data"), }; //--------- //ATO formatted files error codes and associated strings //--------- enum { LAWATAP_ATO_OPEN_FAIL=1, LAWATAP_ATO_EMPTY_FAIL, LAWATAP_ATO_SIZE_ERR, LAWATAP_ATO_VERSIONCHECK_ERR, LAWATAP_ATO_MEM_ERR, LAWATAP_ATO_BAD_ENDIAN_DETECT, LAWATAP_ATO_ENUM_END }; const char *LAWATAP_ATO_ERR_STRINGS[] = { "", NTRANS("Error opening file"), NTRANS("File is empty"), NTRANS("Filesize does not match expected format"), NTRANS("File version number not <4, as expected"), NTRANS("Unable to allocate memory to store data"), NTRANS("Unable to detect endian-ness in file") }; //--------- unsigned int LimitLoadPosFile(unsigned int inputnumcols, unsigned int outputnumcols, const unsigned int index[], vector &posIons,const char *posFile, size_t limitCount, unsigned int &progress, ATOMIC_BOOL &wantAbort,bool strongSampling) { //Function is only defined for 4 columns here. ASSERT(outputnumcols == 4); //buffersize must be a power of two and at least outputnumcols*sizeof(float) const unsigned int NUMROWS=1; const unsigned int BUFFERSIZE=inputnumcols * sizeof(float) * NUMROWS; const unsigned int BUFFERSIZE2=outputnumcols * sizeof(float) * NUMROWS; char *buffer=new char[BUFFERSIZE]; if(!buffer) return POS_ALLOC_FAIL; char *buffer2=new char[BUFFERSIZE2]; if(!buffer2) { delete[] buffer; return POS_ALLOC_FAIL; } //open pos file std::ifstream CFile(posFile,std::ios::binary); if(!CFile) { delete[] buffer; delete[] buffer2; return POS_OPEN_FAIL; } CFile.seekg(0,std::ios::end); size_t fileSize=CFile.tellg(); if(!fileSize) { delete[] buffer; delete[] buffer2; return POS_EMPTY_FAIL; } CFile.seekg(0,std::ios::beg); //calculate the number of points stored in the POS file size_t pointCount=0; size_t maxIons; size_t maxCols = inputnumcols * sizeof(float); //regular case if(fileSize % maxCols) { delete[] buffer; delete[] buffer2; return POS_SIZE_MODULUS_ERR; } maxIons =fileSize/maxCols; limitCount=std::min(limitCount,maxIons); //If we are going to load the whole file, don't use a sampling method to do it. if(limitCount == maxIons) { //Close the file CFile.close(); delete[] buffer; delete[] buffer2; //Try opening it using the normal functions return GenericLoadFloatFile(inputnumcols, outputnumcols, index, posIons,posFile,progress, wantAbort); } //Use a sampling method to load the pos file std::vector ionsToLoad; try { posIons.resize(limitCount); RandNumGen rng; rng.initTimer(); unsigned int dummy; randomDigitSelection(ionsToLoad,maxIons,rng, limitCount,dummy,strongSampling); } catch(std::bad_alloc) { delete[] buffer; delete[] buffer2; return POS_ALLOC_FAIL; } //sort again //NOTE: I tried to use a functor here to get progress // It was not stable with parallel sort std::sort(ionsToLoad.begin(),ionsToLoad.end()); unsigned int curProg = PROGRESS_REDUCE; //TODO: probably not very nice to the disk drive. would be better to //scan ahead for contiguous data regions, and load that where possible. //Or switch between different algorithms based upon ionsToLoad.size()/ std::ios::pos_type nextIonPos; for(size_t ui=0;ui &posIons,const char *posFile, unsigned int &progress, ATOMIC_BOOL &wantAbort) { ASSERT(outputnumcols==4); //Due to ionHit.setHit //buffersize must be a power of two and at least sizeof(float)*outputnumCols const unsigned int NUMROWS=512; const unsigned int BUFFERSIZE=inputnumcols * sizeof(float) * NUMROWS; const unsigned int BUFFERSIZE2=outputnumcols * sizeof(float) * NUMROWS; char *buffer=new char[BUFFERSIZE]; if(!buffer) return POS_ALLOC_FAIL; char *buffer2=new char[BUFFERSIZE2]; if(!buffer2) { delete[] buffer; return POS_ALLOC_FAIL; } //open pos file std::ifstream CFile(posFile,std::ios::binary); if(!CFile) { delete[] buffer; delete[] buffer2; return POS_OPEN_FAIL; } CFile.seekg(0,std::ios::end); size_t fileSize=CFile.tellg(); if(!fileSize) { delete[] buffer; delete[] buffer2; return POS_EMPTY_FAIL; } CFile.seekg(0,std::ios::beg); //calculate the number of points stored in the POS file IonHit hit; size_t pointCount=0; //regular case size_t curBufferSize=BUFFERSIZE; size_t curBufferSize2=BUFFERSIZE2; if(fileSize % (inputnumcols * sizeof(float))) { delete[] buffer; delete[] buffer2; return POS_SIZE_MODULUS_ERR; } try { posIons.resize(fileSize/(inputnumcols*sizeof(float))); } catch(std::bad_alloc) { delete[] buffer; delete[] buffer2; return POS_ALLOC_FAIL; } while(fileSize < curBufferSize) { curBufferSize = curBufferSize >> 1; curBufferSize2 = curBufferSize2 >> 1; } //Technically this is dependent upon the buffer size. unsigned int curProg = 10000; size_t ionP=0; int maxCols = inputnumcols * sizeof(float); int maxPosCols = outputnumcols * sizeof(float); do { //Taking curBufferSize chunks at a time, read the input file while((size_t)CFile.tellg() <= fileSize-curBufferSize) { CFile.read(buffer,curBufferSize); if(!CFile.good()) { delete[] buffer; delete[] buffer2; return POS_READ_FAIL; } for (unsigned int j = 0; j < NUMROWS; j++) // iterate through rows { for (unsigned int i = 0; i < outputnumcols; i++) // iterate through floats { memcpy(&(buffer2[j * maxPosCols + i * sizeof(float)]), &(buffer[j * maxCols + index[i] * sizeof(float)]), sizeof(float)); } } unsigned int ui; for(ui=0; ui> 1 ; curBufferSize2 = curBufferSize2 >> 1 ; }while(curBufferSize2 >= IonHit::DATA_SIZE); ASSERT((unsigned int)CFile.tellg() == fileSize); delete[] buffer; delete[] buffer2; return 0; } //TODO: Add progress unsigned int limitLoadTextFile(unsigned int maxCols, vector > &data,const char *textFile, const char *delim, const size_t limitCount, unsigned int &progress, ATOMIC_BOOL &wantAbort,bool strongRandom) { ASSERT(maxCols); ASSERT(textFile); vector newLinePositions; std::vector subStrs; //Do a brute force scan through the dataset //to locate newlines. char *buffer; const int BUFFER_SIZE=16384; //This is totally a guess. I don't know what is best. ifstream CFile(textFile,std::ios::binary); if(!CFile) return TEXT_ERR_OPEN; //seek to the end of the file //to get the filesize size_t maxPos,curPos; CFile.seekg(0,std::ios::end); maxPos=CFile.tellg(); CFile.close(); CFile.open(textFile); curPos=0; //Scan through file for end of header. //we define this as the split value being able to generate //1) Enough data to make interpretable columns //2) Enough columns that can be interpreted. while(CFile.good() && !CFile.eof() && curPos < maxPos) { string s; curPos = CFile.tellg(); getline(CFile,s); if(!CFile.good()) return TEXT_ERR_READ_CONTENTS; splitStrsRef(s.c_str(),delim,subStrs); stripZeroEntries(subStrs); //Skip unstreamable lines bool unStreamable; unStreamable=false; for(unsigned int ui=0; ui=maxPos) return TEXT_ERR_ONLY_HEADER; CFile.close(); //Re-open the file in binary mode to find the newlines CFile.open(textFile,std::ios::binary); if(!CFile) return TEXT_ERR_REOPEN; //Jump to beyond the header CFile.seekg(curPos); //keep a beginning of file marker newLinePositions.push_back(curPos); bool seenNumeric=false; buffer = new char[BUFFER_SIZE]; while(CFile.good() && !CFile.eof() && curPos < maxPos) { size_t bytesToRead; if(!CFile.good()) { delete[] buffer; return TEXT_ERR_READ_CONTENTS; } //read up to BUFFER_SIZE bytes from the file //but only if they are available bytesToRead = std::min(maxPos-curPos,(size_t)BUFFER_SIZE); CFile.read(buffer,bytesToRead); //check that this buffer contains numeric info for(unsigned int ui=0;ui= '0' && buffer[ui] <='9') seenNumeric=true; } curPos+=bytesToRead; } //Don't keep any newline that hits the end of the file, but do keep a zero position if(newLinePositions.size()) newLinePositions.pop_back(); CFile.close(); //OK, so now we know where those pesky endlines are. This gives us jump positions //to new lines in the file. Each component must have some form of numeric data //preceding it. That numeric data may not be fully parseable, but we assume it is until we know better. // //If it is *not* parseable, just throw an error when we find that out. //If we are going to load the whole file, don't use a sampling method to do it. if(limitCount >=newLinePositions.size()) { delete[] buffer; vector header; //Just use the non-sampling method to load. if(loadTextData(textFile,data,header,delim)) return TEXT_ERR_FORMAT; return 0; } //Generate some random positions to load std::vector dataToLoad; try { data.resize(limitCount); RandNumGen rng; rng.initTimer(); unsigned int dummy; randomDigitSelection(dataToLoad,newLinePositions.size(),rng, limitCount,dummy,strongRandom); } catch(std::bad_alloc) { delete[] buffer; return TEXT_ERR_ALLOC_FAIL; } //check for abort before/after sort, as this is a long process that we cannot // safely abort if(wantAbort) { delete[] buffer; return POS_ABORT_FAIL; } //Sort the data such that we are going to //always jump forwards in the file; better disk access and whatnot. std::sort(dataToLoad.begin(),dataToLoad.end()); //check again for abort if(wantAbort) { delete[] buffer; return POS_ABORT_FAIL; } //OK, so we have a list of newlines //that we can use as entry points for random seek. //We also have some random entry points (sorted). // Now re-open the file in text mode and try to load the // data specified at the offsets //Open file in text mode CFile.open(textFile); if(!CFile) { delete[] buffer; return TEXT_ERR_REOPEN; } //OK, now jump to each of the random positions, //as dictated by the endline position //and attempt a parsing there. subStrs.clear(); for(size_t ui=0;ui &ions, unsigned int &progress, ATOMIC_BOOL &wantAbort,unsigned int forceEndian) { //open pos file std::ifstream CFile(fileName,std::ios::binary); if(!CFile) return LAWATAP_ATO_OPEN_FAIL; //Get the filesize CFile.seekg(0,std::ios::end); size_t fileSize=CFile.tellg(); //There are differences in the format, unfortunately. // Gault et al, Atom Probe Microscopy says // - there are 14 entries of 4 bytes, // totalling "44" bytes - which cannot be correct. They however, // say that the XYZ is added later. // - Header is 2 32 binary // - File is serialised as little-endian // - Various incompatible versions exist. Unclear how to distinguish // Larson et al say that // - there are 14 fields // - Header byte 0x05 (0-indexed) is version number, and only version 3 is outlined // - Pulsenumber can be subject to FP aliasing (bad storage, occurs for values > ~16.7M ), // - Aliasing errors must be handled, if reading this field // - File is in big-endian //In summary, we assume there are 14 entries, 4 bytes each, after an 8 byte header. // we assume that the endian-ness must be auto-detected somehow, as no sources // agree on file endian-ness. If we cannot detect it, we assume little endian //Header (8 bytes), record 14 entries, 4 bytes each const size_t LAWATAP_ATO_HEADER_SIZE=8; const size_t LAWATAP_ATO_RECORD_SIZE = 14*4; const size_t LAWATAP_ATO_MIN_FILESIZE = 8 + LAWATAP_ATO_RECORD_SIZE; if(fileSize < LAWATAP_ATO_MIN_FILESIZE) return LAWATAP_ATO_EMPTY_FAIL; //calculate the number of points stored in the POS file IonHit hit; size_t pointCount=0; if((fileSize - LAWATAP_ATO_HEADER_SIZE) % (LAWATAP_ATO_RECORD_SIZE)) return LAWATAP_ATO_SIZE_ERR; //Check that the version number, stored at offxet 0x05 (1-indexed), is 3. CFile.seekg(4); unsigned int versionByte; CFile.read((char*)&versionByte,sizeof(unsigned int)); //Assume that we can have a new version that doesn't affect the readout // assume that earlier versions are compatible. This means, for a random byte // in a random length (modulo) file, // we have a 1-4/255 chance of rejection from this test, and a 1/56 chance of // rejection from filesize, giving a ~0.02% chance of incorrect acceptance. if(!versionByte || versionByte > 4) return LAWATAP_ATO_VERSIONCHECK_ERR; pointCount = (fileSize-LAWATAP_ATO_HEADER_SIZE)/LAWATAP_ATO_RECORD_SIZE; try { ions.resize(pointCount); } catch(std::bad_alloc) { return LAWATAP_ATO_MEM_ERR; } //Heuristic to detect endianness. // - Randomly sample 100 pts from file, and check to see if, when interpreted either way, // there are any NaN // bool endianFlip; if(forceEndian) { ASSERT(forceEndian < 3); #ifdef __LITTLE_ENDIAN__ endianFlip=(forceEndian == 2); #elif __BIG_ENDIAN endianFlip=(forceEndian == 1); #endif } else { //Auto-detect endianness from file content size_t numToCheck=std::min(pointCount,(size_t)100); //Indicies of points to check vector randomNumbers; unsigned int dummy; RandNumGen rng; rng.initTimer(); randomDigitSelection(randomNumbers,pointCount,rng, numToCheck,dummy,wantAbort); //Make the traverse in ascending order std::sort(randomNumbers.begin(),randomNumbers.end()); //One for no endian-flip, one for flip bool badFloat[2]={ false,false }; //Track the presence of unreasonably large numbers bool veryLargeNumber[2] = { false,false }; //Skip through several records, looking for bad float data, float *buffer = new float[LAWATAP_ATO_RECORD_SIZE/4]; for(size_t ui=0;ui 1000.0f || fabs(buffer[10]) > 1000.0f) veryLargeNumber[0] = true; //Swap and try again floatSwapBytes(buffer+3); floatSwapBytes(buffer+6); floatSwapBytes(buffer+10); if( buffer[3] < -1000.0f) veryLargeNumber[1] = true; if( fabs(buffer[6]) > 1000.0f || fabs(buffer[10]) > 1000.0f) veryLargeNumber[1] = true; } delete[] buffer; //Now summarise the results //If we have a disagreement about bad-float-ness, // or stupid-number ness. then choose the good one. // Otherwise abandon detection if(badFloat[0] != badFloat[1]) { endianFlip=(badFloat[0]); } else if(veryLargeNumber[0] != veryLargeNumber[1]) { endianFlip=veryLargeNumber[0]; } else { //Assume little endian #ifdef __LITTLE_ENDIAN__ endianFlip= false; #else endianFlip=true; #endif } } //File records consist of 14 fields, some of which may not be initialised. // each being 4-byte IEEE little-endian float // It is unknown how to detect initialised state. // Field Data // 0-3 x,y,z,m/c in Angstrom (x,yz) or Da (m/c) // 4 clusterID, if set // - Ignore this field, as this information is redundant // 5 Approximate Pulse #, due to Float. Pt. limitation // 6 Standing Voltage (kV) // 7 TOF (us) (maybe corrected? maybe not?) // 8-9 Detector position (cm) // 10 Pulse voltage (kV) // 11 "Virtual voltage" for reconstruction. // - Ignore this field, as this information is redundant // 12,13 Fourier intensity // - Ignore these fields, as this information is redundant //Attempt to detect CFile.seekg(8); float *buffer = new float[LAWATAP_ATO_RECORD_SIZE/4]; size_t curPos=0; if(endianFlip) { //Read and swap while((size_t)CFile.tellg() < fileSize) { CFile.read((char*)buffer,LAWATAP_ATO_RECORD_SIZE); for(size_t ui=0;ui ions; //Load using auto-detection of endinanness TEST(!LoadATOFile(filename.c_str(),ions,dummyProgress,wantAbort),"ATO load test (auto endianness)"); TEST(ions.size() == 100,"ion size check"); TEST((ions[0].getPos().sqrDist(Point3D(1,1,0)) < sqrtf(std::numeric_limits::epsilon())),"Checking read/write OK"); //Load using auto-detection of endinanness //Load, forcing assuming cont4ents are little endianness as requried TEST(!LoadATOFile(filename.c_str(),ions,dummyProgress,wantAbort,1),"ATO load test (forced endianness)"); TEST(ions.size() == 100,"ion size check"); TEST((ions[0].getPos().sqrDist(Point3D(1,1,0)) < sqrtf(std::numeric_limits::epsilon())),"checking read/write OK"); rmFile(filename); return true; } #endif 3Depict-0.0.19/src/backend/APT/ionhit.cpp0000644000175000017500000001461212716174467017303 0ustar pcuserpcuser/* * ionhit.cpp - Ion event data class * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "ionhit.h" #ifdef _OPENMP #include #endif using std::vector; IonAxisCompare::IonAxisCompare() { } IonAxisCompare::IonAxisCompare(unsigned int newAxis) { ASSERT(newAxis<3); axis=newAxis; } void IonAxisCompare::setAxis(unsigned int newAxis) { axis=newAxis; } IonHit::IonHit() { //At this point I deliberately don't initialise the point class //as in DEBUG mode, the point class will catch failure to init } IonHit::IonHit(float *buffer) { pos.setValueArr(buffer); massToCharge=buffer[3]; } IonHit::IonHit(const IonHit &obj2) : massToCharge(obj2.massToCharge), pos(obj2.pos) { } IonHit::IonHit(const Point3D &p, float newMass) : massToCharge(newMass), pos(p) { } void IonHit::setMassToCharge(float newMass) { massToCharge=newMass; } float IonHit::getMassToCharge() const { return massToCharge; } void IonHit::setPos(const Point3D &p) { pos=p; } #ifdef __LITTLE_ENDIAN__ void IonHit::switchEndian() { pos.switchEndian(); floatSwapBytes(&(massToCharge)); } #endif const IonHit &IonHit::operator=(const IonHit &obj) { massToCharge=obj.massToCharge; pos = obj.pos; return *this; } float IonHit::operator[](unsigned int idx) const { ASSERT(idx <4); if(idx < 3) return pos[idx]; else return massToCharge; } //!Create an pos file from a vector of IonHits unsigned int IonHit::makePos(const vector &ionVec, const char *filename) { std::ofstream CFile(filename,std::ios::binary); float floatBuffer[4]; if (!CFile) return 1; for (unsigned int ui=0; ui &points, const char *name, unsigned int format) { switch(format) { case IONFORMAT_POS: { //Write a "pos" formatted file std::ofstream posFile(name,std::ios::binary|std::ios::app); if(!posFile) return 1; float data[4]; for(unsigned int ui=0; ui< points.size(); ui++) { points[ui].makePosData(data); posFile.write((char *)data, 4*sizeof(float)); } if(posFile.good()) return 0; else return 1; } case IONFORMAT_TEXT: { std::ofstream textFile(name,std::ios::app); if(!textFile) return 1; for(unsigned int ui=0;ui &ions, vector &p) { p.resize(ions.size()); #pragma omp parallel for for(size_t ui=0;ui &points,Point3D ¢roid) { centroid=Point3D(0,0,0); size_t nPoints=points.size(); #ifdef _OPENMP //Parallel version //-- vector centroids(omp_get_max_threads(),Point3D(0,0,0)); #pragma omp parallel for for(size_t ui=0;ui &points,BoundCube &b) { ASSERT(points.size()); #ifndef _OPENMP float bounds[3][2]; for(unsigned int ui=0;ui<3;ui++) { bounds[ui][0]=std::numeric_limits::max(); bounds[ui][1]=-std::numeric_limits::max(); } for(unsigned int ui=0; ui cubes(nT); for(unsigned int ui=0;ui h; IonHit hit; hit.setMassToCharge(1); for(size_t ui=0;ui<8;ui++) { hit.setPos(Point3D(ui&4 >> 2,ui&2 >> 1,ui&1)); h.push_back(hit); } BoundCube bc; IonHit::getBoundCube(h,bc); TEST(bc.isValid(),"check boundcube"); BoundCube biggerBox; for(size_t ui=0;ui<3;ui++) { biggerBox.setBound(ui,0,-1.5f); biggerBox.setBound(ui,1,1.5f); } TEST(biggerBox.contains(bc),"Check boundcube size"); return true; } #endif 3Depict-0.0.19/src/backend/APT/abundanceParser.cpp0000644000175000017500000002376612640746376021120 0ustar pcuserpcuser/* * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "abundanceParser.h" #include "common/xmlHelper.h" #include "common/stringFuncs.h" #include #include #include #include #include #include #include #include using std::vector; using std::pair; using std::make_pair; using std::map; using std::string; const char *ABUNDANCE_ERROR[] = { "Unable to read abundance data (opening file)", "Unable to create XML reader.", "Bad property found in XML file", "XML document did not match expected layout (DTD validation)", "Unable to find required node during parse", "Root node missing, expect !", "Found incorrect root node. Expected " }; const char *AbundanceData::getErrorText(size_t errorCode) { ASSERT(errorCode < ABUNDANCE_ERROR_ENUM_END); return ABUNDANCE_ERROR[errorCode]; } size_t AbundanceData::numIsotopes() const { size_t v=0; for(size_t ui=0;uivalid) { if(strict) { xmlFreeDoc(doc); xmlFreeParserCtxt(context); return ABUNDANCE_ERROR_FAILED_VALIDATION; } else { std::cerr << "Unable to validate XML file. Continuing anyway.." << std::endl; } } } try { //retrieve root node std::stack nodeStack; xmlNodePtr nodePtr = xmlDocGetRootElement(doc); if(!nodePtr) throw ABUNDANCE_ERROR_MISSING_ROOT_NODE; //This *should* be an abundance file if(xmlStrcmp(nodePtr->name, (const xmlChar *)"atomic-mass-table")) throw ABUNDANCE_ERROR_WRONG_ROOT_NODE; nodeStack.push(nodePtr); nodePtr=nodePtr->xmlChildrenNode; while(!XMLHelpFwdToElem(nodePtr,"entry")) { ISOTOPE_DATA curIsoData; if(XMLHelpGetProp(curIsoData.symbol,nodePtr,"symbol")) throw ABUNDANCE_ERROR_BAD_VALUE; if(XMLHelpGetProp(curIsoData.atomicNumber,nodePtr,"atomic-number")) throw ABUNDANCE_ERROR_BAD_VALUE; nodeStack.push(nodePtr); nodePtr=nodePtr->xmlChildrenNode; //Move to natural-abundance child if(XMLHelpFwdToElem(nodePtr,"natural-abundance")) throw ABUNDANCE_ERROR_MISSING_NODE; nodePtr=nodePtr->xmlChildrenNode; vector curIsotopes; //TODO: value checking while(!XMLHelpFwdToElem(nodePtr,"isotope")) { //Spin to mass node if(XMLHelpGetProp(curIsoData.massNumber,nodePtr,"mass-number")) throw ABUNDANCE_ERROR_MISSING_NODE; nodeStack.push(nodePtr); nodePtr=nodePtr->xmlChildrenNode; //Spin to mass node if(XMLHelpFwdToElem(nodePtr,"mass")) throw ABUNDANCE_ERROR_MISSING_NODE; if(XMLHelpGetProp(curIsoData.mass,nodePtr,"value")) throw ABUNDANCE_ERROR_BAD_VALUE; if(XMLHelpGetProp(curIsoData.massError,nodePtr,"error")) throw ABUNDANCE_ERROR_BAD_VALUE; else curIsoData.massError=0; //spin to abundance node if(XMLHelpFwdToElem(nodePtr,"abundance")) throw ABUNDANCE_ERROR_MISSING_NODE; if(XMLHelpGetProp(curIsoData.abundance,nodePtr,"value")) throw ABUNDANCE_ERROR_BAD_VALUE; if(XMLHelpGetProp(curIsoData.abundanceError,nodePtr,"error")) throw ABUNDANCE_ERROR_BAD_VALUE; else curIsoData.abundanceError=0; curIsotopes.push_back(curIsoData); nodePtr=nodeStack.top(); nodePtr=nodePtr->next; nodeStack.pop(); } isotopeData.push_back(curIsotopes); curIsotopes.clear(); nodePtr=nodeStack.top(); nodeStack.pop(); nodePtr=nodePtr->next; } } catch( int &excep) { xmlFreeDoc(doc); xmlFreeParserCtxt(context); return excep; } xmlFreeDoc(doc); xmlFreeParserCtxt(context); return 0; } size_t AbundanceData::symbolIndex(const char *symbol) const { for(size_t ui=0;ui &elementIdx, const vector &frequency, vector > &massDist, size_t chargeCount) const { ASSERT(chargeCount); ASSERT(frequency.size() == elementIdx.size()); //Search out the given isotopes, and compute the peaks // that would be seen for this isotope combination //map of vectors for the available isotopes map > > isotopeMassDist; vector bulkConcentration(frequency.size()); size_t total=std::accumulate(frequency.begin(),frequency.end(),0); for(size_t ui=0;ui > thisIsotope; for(size_t uj=0;uj > peakProbs; for(size_t ui=0;ui >::const_iterator isoBegin,isoEnd; isoBegin = isotopeMassDist[elementIdx[ui]].begin(); isoEnd = isotopeMassDist[elementIdx[ui]].end(); vector > newProbs; //If this is the very first item in our list, // simply push on the value, rather than modifying the // distribution if(peakProbs.empty()) { //The masses will be added to, and the probabilities multipled for(vector >::const_iterator it=isoBegin; it!=isoEnd;++it) peakProbs.push_back(*it); } else { for(size_t uj=0;uj >::const_iterator it=isoBegin; it!=isoEnd;++it) { pair newMass; newMass.first=peakProbs[uj].first+it->first; newMass.second=peakProbs[uj].second*it->second; newProbs.push_back(newMass); } } peakProbs.swap(newProbs); newProbs.clear(); } } } float tolerance=sqrt(std::numeric_limits::epsilon()); vector killPeaks(peakProbs.size(),false); //Find the non-unique peaks and sum them for(size_t ui=0;ui 0.0f) { peakProbs[ui].second+=peakProbs[uj].second; peakProbs[uj].second=0.0f; killPeaks[uj]=true; } } } vectorMultiErase(peakProbs,killPeaks); massDist.swap(peakProbs); for(size_t ui=0;ui &symbols,vector &indices) const { indices.resize(symbols.size()); for(size_t ui=0;ui using std::set; void AbundanceData::checkErrors() const { //Ensure all isotopes sum to 1-ish // Rounding errors limit our correctness here. for(size_t ui=0;ui uniqNums; uniqNums.clear(); for(size_t uj=0; uj elements; vector concentrations; elements.push_back(ironIndex); concentrations.push_back(1); std::vector > massDist; massTable.generateIsotopeDist(elements,concentrations,massDist); TEST(massDist.size() == 4, "Iron has 4 isotopes"); massTable.checkErrors(); return true; } #endif 3Depict-0.0.19/src/backend/APT/APTRanges.h0000644000175000017500000002537712716174467017254 0ustar pcuserpcuser/* * APTRanges.h - Atom probe rangefile class * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef APTRANGES_H #define APTRANGES_H #include #include #include #include "backend/APT/ionhit.h" #include "common/basics.h" enum{ RANGE_ERR_OPEN =1, RANGE_ERR_FORMAT_HEADER, RANGE_ERR_EMPTY, RANGE_ERR_FORMAT_LONGNAME, RANGE_ERR_FORMAT_SHORTNAME, RANGE_ERR_FORMAT_COLOUR, RANGE_ERR_FORMAT_TABLESEPARATOR, RANGE_ERR_FORMAT_TABLEHEADER_NUMIONS, RANGE_ERR_FORMAT_RANGE_DUMMYCHARS, RANGE_ERR_FORMAT_RANGETABLE, RANGE_ERR_FORMAT_MASS_PAIR, RANGE_ERR_FORMAT_TABLE_ENTRY, RANGE_ERR_FORMAT, RANGE_ERR_DATA_TOO_MANY_USELESS_RANGES, RANGE_ERR_DATA_FLIPPED, RANGE_ERR_DATA_INCONSISTENT, RANGE_ERR_DATA_NOMAPPED_IONNAME, RANGE_ERR_NONUNIQUE_POLYATOMIC, RANGE_ERR_FILESIZE, RANGE_ERR_ENUM_END }; //Number of elements stored in the table const unsigned int NUM_ELEMENTS=119; enum{ RANGE_FORMAT_ORNL, RANGE_FORMAT_DBL_ORNL, RANGE_FORMAT_ENV, RANGE_FORMAT_RRNG, RANGE_FORMAT_END_OF_ENUM //not a format, just end of enumueration. }; //!Data storage and retrieval class for various range files class RangeFile { private: //These vectors will contain the number of ions //The first element is the shortname for the Ion //the second is the full name std::vector > ionNames; //This holds the colours for the ions std::vector colours; //This will contains the number of ranges // //This holds the min and max masses for the range std::vector > ranges; //The ion ID number for each range //FIXME: Convert to proper uniqueID system std::vector ionIDs; //Should we enforce range consistency? bool enforceConsistency; unsigned int errState; //Warning messages, used when loading rangefiles std::vector warnMessages; //!Erase the contents of the rangefile void clear(); //!Load an ORNL formatted "RNG" rangefile // caller must supply and release file pointer unsigned int openRNG(FILE *fp); //Read the header section of an RNG file static unsigned int readRNGHeader(FILE *fpRange, std::vector > &strNames, std::vector &fileColours, unsigned int &numRanges, unsigned int &numIons); //Read the range frequency table static unsigned int readRNGFreqTable(FILE *fpRange, char *inBuffer, const unsigned int numIons, const unsigned int numRanges, const std::vector > &names, std::vector &colHeaders, std::vector &tableEntries, std::vector > &massData, std::vector &warnings); unsigned int openDoubleRNG(FILE *fp); //!Load an RRNG file // caller must supply and release file pointer unsigned int openRRNG(FILE *fp); //!Load an ENV file // caller must supply and release file pointer unsigned int openENV(FILE *fp); //Strip charge state from ENV ion names static std::string envDropChargeState(const std::string &strName); public: RangeFile(); const RangeFile& operator=(const RangeFile &other); //!Open a specified range file, returns zero on success, nonzero on failure unsigned int open(const char *rangeFile, unsigned int format=RANGE_FORMAT_ORNL); //!Open a specified range file - returns true on success bool openGuessFormat(const char *rangeFile); //!is the extension string the same as that for a range file? I don't advocate this method, but it is convenient in a pinch. static bool extensionIsRange(const char *ext); //!Grab a vector that contains all the extensions that are valid for range files static void getAllExts(std::vector &exts); //Attempt to detect the file format of an unknown rangefile. // returns enum value on success, or RANGE_FORMAT_END_OF_ENUM on failure static unsigned int detectFileType(const char *file); void setEnforceConsistent(bool shouldEnforce=true) { enforceConsistency=shouldEnforce;} //!Performs checks for self consistency. bool isSelfConsistent() const; //!Print the translated error associated with the current range file state void printErr(std::ostream &strm) const; //!Retrieve the translated error associated with the current range file state std::string getErrString() const; //!Get the number of unique ranges unsigned int getNumRanges() const; //!Get the number of ranges for a given ion ID unsigned int getNumRanges(unsigned int ionID) const; //!Get the number of unique ions unsigned int getNumIons() const; //!Retrieve the start and end of a given range as a pair(start,end) std::pair getRange(unsigned int ) const; //!Retrieve the start and end of a given range as a pair(start,end) std::pair &getRangeByRef(unsigned int ); //!Retrieve a given colour from the ion ID RGBf getColour(unsigned int) const; //!Set the colour using the ion ID void setColour(unsigned int, const RGBf &r); //!Retrieve the colour from a given ion ID //!Get the ion's ID from a specified mass /*! Returns the ions ID if there exists a range that * contains this mass. Otherwise (unsigned int)-1 is returned */ unsigned int getIonID(float mass) const; //!Get the ion ID from a given range ID /*!No validation checks are performed outside debug mode. Ion range *must* exist*/ unsigned int getIonID(unsigned int range) const; //!Get the ion ID from its short or long name, returns -1 if name does not exist. Case must match unsigned int getIonID(const char *name, bool useShortName=true) const; unsigned int getIonID(const std::string &name) const {return getIonID(name.c_str());}; //!Set the ion ID for a given range void setIonID(unsigned int range, unsigned int newIonId); //!returns true if a specified mass is ranged bool isRanged(float mass) const; //! Returns true if an ion is ranged bool isRanged(const IonHit &) const; //!Clips out ions that are not inside the range void range(std::vector &ionHits); //!Clips out ions that dont match the specified ion name /*! Returns false if the ion name given doesn't match * any in the rangefile (case sensitive) */ bool range(std::vector &ionHits, std::string shortIonName); //!Clip out only a specific subset of ions // Selected ions *MUST* be of the same size as getNumIons() void rangeByIon(const std::vector & ions, const std::vector &selectedIons, std::vector &output) const; //!Clips out ions that dont lie in the specified range number /*! Returns false if the range does not exist * any in the rangefile (case sensitive) */ bool rangeByID(std::vector &ionHits, unsigned int range); void rangeByRangeID(std::vector &ionHits, unsigned int rangeID); //!Get the short name or long name of a specified ionID /*! Pass shortname=false to retireve the long name * ionID passed in must exist. No checking outside debug mode */ std::string getName(unsigned int ionID,bool shortName=true) const; std::string getName(const IonHit &ion, bool shortName) const; //!set the short name for a given ion void setIonShortName(unsigned int ionID, const std::string &newName); //!Set the long name for a given ion void setIonLongName(unsigned int ionID, const std::string &newName); //!Check to see if an atom is ranged /*! Returns true if rangefile holds at least one range with shortname * corresponding input value. Case sensitivity search is default */ bool isRanged(std::string shortName, bool caseSensitive=true); //!Write the rangefile to the specified output stream (default ORNL format) unsigned int write(std::ostream &o,size_t format=RANGE_FORMAT_ORNL) const; //!WRite the rangefile to a file (ORNL format) unsigned int write(const char *datafile, size_t format=RANGE_FORMAT_ORNL) const; //!Return the atomic number of the element from either the long or short version of the atomic name /* * Short name takes precedence * * Example : if range is "H" or "Hydrogen" function returns 1 * Returns 0 on error (bad atomic name) */ unsigned int atomicNumberFromRange(unsigned int range) const; //!Get atomic number from ion ID unsigned int atomicNumberFromIonID(unsigned int ionID) const; //!Get a range ID from mass to charge unsigned int getRangeID(float mass) const; //!Swap a range file with this one void swap(RangeFile &rng); //!Move a range's mass to a new location bool moveRange(unsigned int range, bool limit, float newMass); //!Move both of a range's masses to a new location bool moveBothRanges(unsigned int range, float newLow, float newHigh); //!Add a range to the rangefile. Returns ID number of added range // if adding successful, (unsigned int)-1 otherwise. /// If enforceConsistency is true, this will disallow addition of ranges that // collide with existing ranges unsigned int addRange(float start, float end, unsigned int ionID); //Add the ion to the database returns ion ID if successful, -1 otherwise unsigned int addIon(const std::string &shortName, const std::string &longName, const RGBf &ionCol); bool setRangeStart(unsigned int rangeID, float v); bool setRangeEnd(unsigned int rangeID, float v); //Erase given range void eraseRange(size_t rangeId) ; //erase given ions and associated rnagefes) void eraseIon(size_t ionId); //can we decompose all composed ranges in this file into // other components that already exist within this range? bool isSelfDecomposable() const; //Generate a secondary rangefile with decomposable ranges as needed. bool decompose(RangeFile &rng) const; //Obtain the decompsiition for this range. This maps composed ranges to their decomposed ones. // - This will perform a decompsition if needed, and return false if not self decomposable. bool getDecomposition( std::map > > &decomposition) const; //Break a given string down into a series of substring-count pairs depicting basic ionic components static bool decomposeIonNames(const std::string &name, std::vector > &fragments); }; #endif 3Depict-0.0.19/src/backend/APT/ionhit.h0000644000175000017500000000651112716174467016747 0ustar pcuserpcuser/* * ionhit.h - Ion event data class * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef IONHIT_H #define IONHIT_H #include "common/basics.h" class Point3D; //TODO: Move to member of ionHit itself //!Allowable export ion formats enum { IONFORMAT_POS=1, IONFORMAT_TEXT, IONFORMAT_VTK, IONFORMAT_ENUM_END }; //!This is a data holding class for POS file ions, from /* Pos ions are typically obtained via reconstructed apt detector hits * and are of form (x,y,z mass/charge) */ class IonHit { private: float massToCharge; // mass to charge ratio in Atomic Mass Units per (charge on electron) Point3D pos; //position (xyz) in nm public: IonHit(); IonHit(float *); //copy constructor IonHit(const IonHit &); IonHit(const Point3D &p, float massToCharge); //Size of data when stored in a file record static const unsigned int DATA_SIZE = 16; void setHit(float *arr) { pos.setValueArr(arr); massToCharge=arr[3];}; void setMassToCharge(float newMassToCharge); void setPos(const Point3D &pos); void setPos(float fX, float fY, float fZ) { pos.setValue(fX,fY,fZ);}; Point3D getPos() const; inline const Point3D &getPosRef() const {return pos;}; //returns true if any of the 4 data pts are NaN bool hasNaN(); //returns true if any of the 4 data pts are +-inf bool hasInf(); #ifdef __LITTLE_ENDIAN__ void switchEndian(); #endif //this does the endian switch for you //but you must supply a valid array. void makePosData(float *floatArr) const; float getMassToCharge() const; //Helper functions //-- //get the points from a vector of of ionhits static void getPoints(const std::vector &ions, std::vector &pts); //Get the bounding cube from a vector of ionhits static void getBoundCube(const std::vector &p, BoundCube &b); //Get the centroid from a vector of ion hits static void getCentroid(const std::vector &points, Point3D ¢roid); //Add these points to a formatted file static unsigned int appendFile(const std::vector &points, const char *name, const unsigned int format=IONFORMAT_POS); //Save a pos file, overwriting any previous data at this location static unsigned int makePos(const std::vector &points, const char *name); //--- const IonHit &operator=(const IonHit &obj); float operator[](unsigned int ui) const; IonHit operator+(const Point3D &obj); }; class IonAxisCompare { private: unsigned int axis; public: IonAxisCompare(); IonAxisCompare(unsigned int newAxis) ; void setAxis(unsigned int newAxis); inline bool operator()(const IonHit &p1,const IonHit &p2) const {return p1.getPos()[axis]. */ #include "APTRanges.h" #include "ionhit.h" #include "../../common/constants.h" #include "../../common/stringFuncs.h" #include "../../common/translation.h" #include #include #include #include #include using std::string; using std::vector; using std::pair; using std::make_pair; using std::map; using std::set; using std::accumulate; //Arbitrary maximum range file line size const size_t MAX_LINE_SIZE = 16536; //Arbitrary maximum range file size, in bytes const size_t MAX_RANGEFILE_SIZE = 20*1024*1024; const char *rangeErrStrings[] = { "", NTRANS("Error opening file, check name and permissions."), NTRANS("Error interpreting range file header, expecting ion count and range count, respectively."), NTRANS("Range file appears to be empty, check file is a proper range file and is not empty."), NTRANS("Error reading the long name for ion."), NTRANS("Error reading the short name for ion."), NTRANS("Error reading colour data in the file, expecting 3 decimal values, space separated."), NTRANS("Tried skipping to table separator line (line with dashes), but did not find it."), NTRANS("Number of ions in the table header did not match the number specified at the start of the file"), NTRANS("Unexpected failure whilst trying to skip over range lead-in data (bit before range start value)"), NTRANS("Range table had an incorrect number of entries, should be 2 or 3 + number of ranges"), NTRANS("Unable to read range start and end values"), NTRANS("Unable to read range table entry"), NTRANS("Error reading file, unexpected format, are you sure it is a proper range file?"), NTRANS("Too many ranges appeared to have range entries with no usable data (eg, all blank)"), NTRANS("Range file appears to contain malformed data, check things like start and ends of m/c are not equal or flipped."), NTRANS("Range file appears to be inconsistent (eg, overlapping ranges)"), NTRANS("No ion name mapping found for multiple ion."), NTRANS("Polyatomic extension range matches multiple masses in first section"), NTRANS("Range file is exceedingly large. Refusing to open"), }; const char *RANGE_EXTS[] = { "rng", "env", "rng", "rrng", ""}; //List of symbols in the periodic table const char *elementList[] = { "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc","Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Uut", "Fl", "Uup", "Lv", "Uus", "Uuo", "" }; //Known issues - will not decompose brackets, eg Fe(OH)2 bool RangeFile::decomposeIonNames(const std::string &name, std::vector > &fragments) { size_t lastMarker=0; size_t digitMarker=0; if(!name.size()) return true; //Atomic naming systems use uppercase ascii // letters, like "A" in Au, or Ag as delimiters. // // numerals are multipliers, and are forbidden // for the first char... if(!isascii(name[0]) || isdigit(name[0]) || islower(name[0])) return false; //true - was last, or now am on ion name //false - am still on multiplier int nameMode=true; for(size_t ui=1;ui toKill(fragments.size(),false); for(size_t ui=0;ui &composedNames, const vector > &namesToFind, size_t &matchOffset) { //Decomposition of composed names. std::vector > > fragmentVec; //break each composed name into a vector of decomposed fragments // and the multiplicity //of that fragment (eg, AuHg2 would become { Au ,1} {Hg,2}) fragmentVec.reserve(composedNames.size()); for(std::map::const_iterator it=composedNames.begin(); it!=composedNames.end();++it) { vector > frags; if(!RangeFile::decomposeIonNames(it->first,frags)) frags.clear(); fragmentVec.push_back(frags); frags.clear(); } //Try to match all fragments in "namesToFind" (name-frequency pairings) //in the master list of fragments of // which consists of the decomposed composed names (fragmentVec entries) //If the decomposed fragments wholly constitute the //master list, then thats good, and we have a match. //Note that the master list will not necessarily be in //the same order as the fragment list //match tally for fragments vector excludedMatch; excludedMatch.resize(fragmentVec.size(),false); for(size_t uj=0;uj curFrag; curFrag=namesToFind[uj]; for(size_t ui=0;ui elementSet; { size_t offset=0; while(strlen(elementList[offset])) { elementSet.insert(elementList[offset]); offset++; } } f << "[Ions]" << endl; f << "Number=" << ionNames.size() << endl; for(size_t ui=0;ui MAX_RANGEFILE_SIZE) return RANGE_ERR_FILESIZE; FILE *fpRange; fpRange=fopen(rangeFilename,"r"); if (fpRange== NULL) { errState = RANGE_ERR_OPEN; return errState; } pushLocale("C",LC_NUMERIC); size_t errCode; switch(fileFormat) { case RANGE_FORMAT_ORNL: { errCode=openRNG(fpRange); break; } //Cameca "ENV" file format.. I have a couple of examples, but nothing more. //There is no specification of this format publicly available case RANGE_FORMAT_ENV: { errCode=openENV(fpRange); break; } //Imago (now Cameca), "RRNG" file format. Again, neither standard //nor formal specification exists (sigh). Purely implemented by example. case RANGE_FORMAT_RRNG: errCode=openRRNG(fpRange); break; //Cameca "double" rng format, in the wild as of mid 2013 case RANGE_FORMAT_DBL_ORNL: errCode=openDoubleRNG(fpRange); break; default: ASSERT(false); fclose(fpRange); popLocale(); return RANGE_ERR_FORMAT; } popLocale(); fclose(fpRange); if(errCode) { errState=errCode; return errState; } //Run self consistency check on freshly loaded data if(!isSelfConsistent()) { errState=RANGE_ERR_DATA_INCONSISTENT; return errState; } return 0; } bool RangeFile::openGuessFormat(const char *rangeFilename) { //Check the filesize before attempting to guess the format size_t fileSize; getFilesize(rangeFilename,fileSize); if(fileSize > MAX_RANGEFILE_SIZE) { errState=RANGE_ERR_FILESIZE; return false; } //Try to auto-detect the filetype unsigned int assumedFileFormat; assumedFileFormat=detectFileType(rangeFilename); if(assumedFileFormat < RANGE_FORMAT_END_OF_ENUM) { if(!open(rangeFilename,assumedFileFormat)) return true; } //Use the guessed format unsigned int errStateRestore; errStateRestore=errState; //If that failed, go to plan B-- Brute force. //try all readers bool openOK=false; for(unsigned int ui=0;ui char *ret; ret=fgets((char *)inBuffer, MAX_LINE_SIZE, fpRange); while(ret && strlen(ret) < MAX_LINE_SIZE-1 && ret[0] != '-') { ret=fgets((char *)inBuffer, MAX_LINE_SIZE, fpRange); } if(!ret || strlen(ret) >= MAX_LINE_SIZE -1) { delete[] inBuffer; return RANGE_ERR_FORMAT; } //Read the "polyatomic extension" line errCode=tmpRange[1].openRNG(fpRange); if(errCode) { delete[] inBuffer; return errCode; } //Now merge the two range files by using the mass pair data as a key //Find the matching ranges //range IDs from first and second file who have matching range values vector< pair > rangeMatches; //IonID from the first dataset that we will need to replace vector overrideIonID; for(size_t ui=0;ui uniqItems=overrideIonID; std::sort(uniqItems.begin(),uniqItems.end()); if(std::unique(uniqItems.begin(),uniqItems.end()) != uniqItems.end()) { delete[] inBuffer; return RANGE_ERR_NONUNIQUE_POLYATOMIC; } } //Replace ionnames with new ion name and colour for(size_t ui=0;ui char *ret; ret=fgets((char *)inBuffer, MAX_LINE_SIZE, fpRange); if(!ret || strlen(ret) >= MAX_LINE_SIZE-1) { delete[] inBuffer; return RANGE_ERR_FORMAT; } // read the column header line ret=fgets((char *)inBuffer, MAX_LINE_SIZE, fpRange); if(!ret || strlen(ret) >= MAX_LINE_SIZE-1) { delete[] inBuffer; return RANGE_ERR_FORMAT; } //We should be at the line which has lots of dashes if(inBuffer[0] != '-') { delete[] inBuffer; return RANGE_ERR_FORMAT_TABLESEPARATOR; } //Load the rangefile frequency table vector colHeaders; vector frequencyEntries; { vector warnings; vector > massData; errCode=readRNGFreqTable(fpRange,inBuffer,numIons,numRanges,ionNames, colHeaders, frequencyEntries,massData,warnings); if(errCode) { delete[] inBuffer; return errCode; } warnings.swap(warnMessages); ranges.swap(massData); } //Because of a certain software's output //it can generate a range listing like this (table +example colour line only) // // these are invalid according to white book // and the "Atom Probe Microscopy", (Springer series in Materials Science // vol. 160) descriptions // // Cu2 1.0 1.0 1.0 (Cu2) // ------------Cu Ni Mg Si CuNi4 Mg3Si2 Cu2 // . 12.3 23.5 1 4 0 0 0 0 0 // . 32.1 43.2 0 0 3 2 0 0 0 // . 56.7 89.0 2 0 0 0 0 0 0 // // which we get blamed for not supporting :( // //So, we have to scan the lists of ions, and create //tentative "combined" ion names, from the list of ions at the top. // //However, this violates the naming system in the "white book" (Miller, Atom probe: Analysis at the atomic scale) // scheme, which might allow something like // U235U238 // as a single range representing a single ion. So they bastardise it by placing the zero columns // as a hint marker. Technically speaking, the zero column entries should not exist // in the format - as they would correspond to a non-existent species (or rather, an unreferenced species). // To check the case of certain programs using cluster ions like this, we have to engage in some // hacky-heuristics, check for // - Columns with only zero entries, // - which have combined numerical headers // // Then handle this as a separate case. FFS. //-- Build a sparse vector of composed ions std::map composeMap; for(size_t uj=0;uj > > unassignedMultiples; //Loop through each range's freq table entries, to determine if // the ion is composed (has more than one "1" in multiplicity listing) for(size_t ui=0;ui freqEntries; size_t freq; //Find the nonzero entries in this row //-- freqEntries.clear(); freq=0; for(size_t uj=0;ujfirst); } else if (freq > 1) { if(composeMap.empty()) { //We have a multiple, but no way of composing it! // we will need to build our own table entry. // For now, just store the freq tableentry unassignedMultiples.push_back(make_pair(ui,freqEntries)); ionIDs.push_back(-2); } else { //More complex case // ion appears to be composed of multiple fragments. //First entry is the ion name, second is the number of times it occurs // (ie value in freq table, on this range line) vector > entries; for(map::iterator it=freqEntries.begin();it!=freqEntries.end();++it) entries.push_back(make_pair(ionNames[it->first].first,it->second)); //try to match the composed name to the entries size_t offset; if(!matchComposedName(composeMap,entries,offset)) { //We failed to match the ion against a composed name. // cannot deal with this case. // // we can't just build a new ion name, // as we don't have a colour specification for this. // // We can't use the regular ion name, without // tracking multiplicity (and then what to do with it in every case - // seems only a special case for composition? eg. // Is it a sep. species when clustering? Who knows!) delete[] inBuffer; return RANGE_ERR_DATA_NOMAPPED_IONNAME; } ASSERT(offset < ionNames.size()); ionIDs.push_back( offset); } } else //0 { //Range was useless - had no nonzero values //in frequency table. //Set to bad ionID - we will kill this later. ionIDs.push_back(-1); } } //Loop through any ranges with a bad ionID (== -1), then delete them by popping for(size_t ui=0;ui > newNames; for(size_t ui=0;ui O3Cu2Au //-- { vector > flatData; std::map &m=unassignedMultiples[ui].second; for(std::map::const_iterator it=m.begin(); it!=m.end();++it) flatData.push_back(make_pair(it->first,it->second)); std::sort(flatData.begin(),flatData.end(),cmp); string nameStr; for(size_t uj=0;uj >::iterator it=newNames.begin(); it!=newNames.end();++it) { for(size_t ui=0;uisecond.size();ui++) { ASSERT(ionIDs[it->second[ui]] == (size_t)-2); ionIDs[it->second[ui]] =ionNames.size(); } ionNames.push_back(make_pair(it->first,it->first)); //make a new random colour RGBf col; col.red=rand()/(float)std::numeric_limits::max(); col.green=rand()/(float)std::numeric_limits::max(); col.blue=rand()/(float)std::numeric_limits::max(); colours.push_back(col); } } delete[] inBuffer; return 0; } unsigned int RangeFile::detectFileType(const char *rangeFile) { enum { STATUS_NOT_CHECKED=0, STATUS_IS_NOT, STATUS_IS_MAYBE, }; #if !defined(__WIN32__) && !defined(__WIN64) //Under posix platforms (linux) directories can be opened by fopen. disallow if(isNotDirectory(rangeFile) == false) return RANGE_FORMAT_END_OF_ENUM; #endif //create a fail-on-unimplemnted type detection scheme vector typeStatus(RANGE_FORMAT_END_OF_ENUM,STATUS_NOT_CHECKED); //Check for RNG/Double RNG //-- //first line in file should be two digits { std::ifstream f(rangeFile); if(!f) return RANGE_FORMAT_END_OF_ENUM; std::string tmpStr; size_t nCount; //retrieve the line getline(f,tmpStr); //strip exterior whitespace tmpStr=stripWhite(tmpStr); //break it apart vector strs; splitStrsRef(tmpStr.c_str()," ",strs); //Drop the whitepace stripZeroEntries(strs); if( strs.size() != 2) { //OK, quick parse failed. give up typeStatus[RANGE_FORMAT_ORNL]=STATUS_IS_NOT; typeStatus[RANGE_FORMAT_DBL_ORNL]=STATUS_IS_NOT; goto skipoutRNGChecks; } //Check for two space separated markers, parsable as ints size_t nIons,nRanges; bool castRes[2]; castRes[0]=stream_cast(nIons,strs[0]); castRes[1]=stream_cast(nRanges,strs[1]); if( castRes[0] || castRes[1]) { //OK, quick parse failed. give up typeStatus[RANGE_FORMAT_ORNL]=STATUS_IS_NOT; typeStatus[RANGE_FORMAT_DBL_ORNL]=STATUS_IS_NOT; goto skipoutRNGChecks; } typeStatus[RANGE_FORMAT_ORNL]=STATUS_IS_MAYBE; typeStatus[RANGE_FORMAT_DBL_ORNL]=STATUS_IS_MAYBE; //spin forwards to find dash line nCount=2*nIons+1; while(nCount--) { getline(f,tmpStr); //shouldn't hit eof if(f.eof() || (!f.good()) ) { tmpStr.clear(); break; } } if(!tmpStr.size() || tmpStr[0] != '-') { typeStatus[RANGE_FORMAT_ORNL]=STATUS_IS_NOT; typeStatus[RANGE_FORMAT_DBL_ORNL]=STATUS_IS_NOT; goto skipoutRNGChecks; } //Now, spin forwards until we either hit EOF or our double-dash marker while( ! (f.eof() || f.bad()) ) { if(!getline(f,tmpStr)) break; if(tmpStr.size() > 2 && tmpStr[0] == '-' && tmpStr[1] == '-') { //OK, we saw a double dash. Thats forbidden under // ORNL , and allowable under double ORNL typeStatus[RANGE_FORMAT_ORNL]=STATUS_IS_NOT; break; } } if(!f.good()) { //we did not see a double-dash, must be a vanilla ORNL file typeStatus[RANGE_FORMAT_DBL_ORNL]=STATUS_IS_NOT; } skipoutRNGChecks: ; } //-- //Check for RRNG, if RNG did not match //-- if(typeStatus[RANGE_FORMAT_ORNL] != STATUS_IS_MAYBE && typeStatus[RANGE_FORMAT_DBL_ORNL] !=STATUS_IS_MAYBE) { std::ifstream f(rangeFile); if(!f) return RANGE_FORMAT_END_OF_ENUM; //Check for existence of lines that match format section std::vector sections; sections.push_back("[ions]"); sections.push_back("[ranges]"); vector haveSection(sections.size(),false); bool foundAllSections=false; //Scan through each line, looking for a matching section header while((!f.eof()) &&f.good()) { //Get line, stripped of whitespace std::string tmpStr; getline(f,tmpStr); tmpStr=stripWhite(tmpStr); //See if we have this header for(size_t ui=0;ui > &strNames, vector &fileColours, unsigned int &numRanges, unsigned int &numIons) { char *inBuffer= new char[MAX_LINE_SIZE]; //Read out the number of ions and ranges in the file if(fscanf(fpRange, "%64u %64u", &numIons, &numRanges) != 2) { delete[] inBuffer; return RANGE_ERR_FORMAT_HEADER; } if (!(numIons && numRanges)) { delete[] inBuffer; return RANGE_ERR_EMPTY; } RGBf colourStruct; pair namePair; //Read ion short and full names as well as colour info for(unsigned int i=0; i > &names, vector &colHeaders, vector &tableEntries, vector > &massData, vector &warnings) { string entry; char *ptrBegin; ptrBegin=inBuffer; while(*ptrBegin && *ptrBegin == '-') ptrBegin++; splitStrsRef(ptrBegin," \n",colHeaders); if(!colHeaders.size() ) { return RANGE_ERR_FORMAT_TABLESEPARATOR; } //remove whitespace from each entry for(size_t ui=0;ui 1) { if(colHeaders.size() !=numIons) { // Emit warning return RANGE_ERR_FORMAT_TABLEHEADER_NUMIONS; } //Strip any trailing newlines off the last of the colheaders, // to avoid dos->unix conversion problems std::string str = colHeaders[colHeaders.size() -1]; if(str[str.size() -1 ] == '\n') colHeaders[colHeaders.size()-1]=str.substr(0,str.size()-1); //Each column header should match the original ion name for(size_t ui=1;ui massPair; for(unsigned int i=0; i entries; std::string tmpStr; tmpStr=stripWhite(inBuffer); splitStrsRef(tmpStr.c_str()," ",entries); stripZeroEntries(entries); //Should be two entries for the mass pair, // one entry per ion, and optionally one // entry for the marker (not used) if(entries.size() != numIons + 2 && entries.size() !=numIons+3) { return RANGE_ERR_FORMAT_RANGETABLE; } size_t entryOff; entryOff=0; //if we have a leading entry, ignore it if(entries.size() == numIons +3) entryOff=1; if(stream_cast(massPair.first,entries[entryOff])) { return RANGE_ERR_FORMAT_MASS_PAIR; } if(stream_cast(massPair.second,entries[entryOff+1])) { return RANGE_ERR_FORMAT_MASS_PAIR; } if(massPair.first >= massPair.second) { return RANGE_ERR_DATA_FLIPPED; } massData.push_back(massPair); //Load the range data line entryOff+=2; for(unsigned int j=0; j strVec; //Read file until we get beyond the range length while(!beyondRanges && !feof(fpRange) ) { if(!fgets((char *)inBuffer, MAX_LINE_SIZE, fpRange) || strlen(inBuffer) >=MAX_LINE_SIZE-1) { delete[] inBuffer; return RANGE_ERR_FORMAT; } //Trick to "strip" the buffer nullifyMarker(inBuffer,'#'); string s; s=inBuffer; s=stripWhite(s); if(!s.size()) continue; //If we have if(!haveSeenRevHeader && (s== "Rev_2.0")) { haveSeenRevHeader=true; continue; } //Try different delimiters to split string splitStrsRef(s.c_str(),"\t ",strVec); stripZeroEntries(strVec); //Drop any entry data including and after ';'. // Revision 0.3 files show this ;, but it is not clear what // it is supposed to be for. Sample files I have show only zeros in these positions for(size_t ui=0;ui1.0 || colourStruct.red < 0.0f || colourStruct.green >1.0 || colourStruct.green < 0.0f || colourStruct.blue >1.0 || colourStruct.blue < 0.0f ) { delete[] inBuffer; return RANGE_ERR_FORMAT; } colours.push_back(colourStruct); } else { //Well thats not right, //we should be looking at the first entry in the //range block.... delete[] inBuffer; return RANGE_ERR_FORMAT; } } if(haveNameBlock) { //We are finished if(strVec.size() == 5) { unsigned int thisIonID; thisIonID=(unsigned int)-1; strVec[0] = envDropChargeState(strVec[0]); for(unsigned int ui=0;ui rangeEnd) { delete[] inBuffer; return RANGE_ERR_FORMAT; } ranges.push_back(std::make_pair(rangeStart,rangeEnd)); ionIDs.push_back(thisIonID); } else beyondRanges=true; } } } delete[] inBuffer; //Must have encountered a name and range sections, // with at least one range if(!haveNumRanges || ! haveNameBlock) return RANGE_ERR_FORMAT; //Note that the in-file reported number of ions might actually be too big //as we "fold" some ions together (eg Si_+ and Si_2+ for us are both considered Si) if(ionNames.empty() || ionNames.size() > numIons || ranges.size() > numRanges) return RANGE_ERR_FORMAT; //There should be more data following the range information. // if not, this is not really an env file if(feof(fpRange)) { return RANGE_ERR_FORMAT; } return 0; } unsigned int RangeFile::openRRNG(FILE *fpRange) { clear(); char *inBuffer = new char[MAX_LINE_SIZE]; unsigned int numRanges; unsigned int numBasicIons; //Different "blocks" that can be read enum { BLOCK_NONE, BLOCK_IONS, BLOCK_RANGES, }; unsigned int curBlock=BLOCK_NONE; bool haveSeenIonBlock; haveSeenIonBlock=false; numRanges=0; numBasicIons=0; vector basicIonNames; while (!feof(fpRange)) { if(!fgets((char *)inBuffer, MAX_LINE_SIZE, fpRange) || strlen(inBuffer) >=MAX_LINE_SIZE-1) break; //Trick to "strip" the buffer, assuming # is a comment nullifyMarker(inBuffer,'#'); string s; s=inBuffer; s=stripWhite(s); if (!s.size()) continue; if (lowercase(s) == "[ions]") { curBlock=BLOCK_IONS; continue; } else if (lowercase(s) == "[ranges]") { curBlock=BLOCK_RANGES; continue; } switch (curBlock) { case BLOCK_NONE: break; case BLOCK_IONS: { //The ion section in RRNG seems almost completely redundant. //This does not actually contain information about the ions //in the file (this is in the ranges section). //Rather it tells you what the constituents are from which //complex ions may be formed. Apply Palm to Face. vector split; splitStrsRef(s.c_str(),'=',split); if (split.size() != 2) { delete[] inBuffer; return RANGE_ERR_FORMAT; } std::string stmp; stmp=lowercase(split[0]); haveSeenIonBlock=true; if (stmp == "number") { //Should not have set the //number of ions yet. if (numBasicIons !=0) { delete[] inBuffer; return RANGE_ERR_FORMAT; } //Set the number of ions if(stream_cast(numBasicIons, split[1])) { delete[] inBuffer; return RANGE_ERR_FORMAT; } if (numBasicIons == 0) { delete[] inBuffer; return RANGE_ERR_FORMAT; } } else if (split[0].size() >3) { stmp = lowercase(split[0].substr(0,3)); if (stmp == "ion") { //OK, its an ion. basicIonNames.push_back(split[1]); if (basicIonNames.size() > numBasicIons) { delete[] inBuffer; return RANGE_ERR_FORMAT; } } else { delete[] inBuffer; return RANGE_ERR_FORMAT; } } break; } case BLOCK_RANGES: { //Although it looks like the blocks are independent. //it is more complicated to juggle a parser with them //out of dependency order, as a second pass would //need to be done. if (!haveSeenIonBlock) { delete[] inBuffer; return RANGE_ERR_FORMAT; } vector split; if (s.size() > 6) { splitStrsRef(s.c_str(),'=',split); if (split.size() != 2) { delete[] inBuffer; return RANGE_ERR_FORMAT; } if (lowercase(split[0].substr(0,5)) == "numbe") { //Should not have set the num ranges yet if (numRanges) { delete[] inBuffer; return RANGE_ERR_FORMAT; } if (stream_cast(numRanges,split[1])) { delete[] inBuffer; return RANGE_ERR_FORMAT; } if (!numRanges) { delete[] inBuffer; return RANGE_ERR_FORMAT; } } else if ( lowercase(split[0].substr(0,5)) == "range") { //Try to decode a range line, as best we can. //These appear to come in a variety of flavours, //which makes this section quite long. //OK, so the format here is a bit weird //we first have to strip the = bit //then we have to step across fields, //I assume the fields are in order (or missing) //* denotes 0 or more, + denotes 1 or more, brackets denote grouping // Vol: [0-9]* ([A-z]+: [0-9]+)* (Name:[0-9]*([A-z]+[0-9]*)+ Color:[0-F][0-F][0-F][0-F][0-F][0-F] // Examples: // Range1=31.8372 32.2963 Vol:0.01521 Zn:1 Color:999999 // or // Range1=31.8372 32.2963 Zn:1 Color:999999 // or // Range1=95.3100 95.5800 Vol:0.04542 Zn:1 Sb:1 Color:00FFFF // or // Range1=95.3100 95.5800 Vol:0.04542 Name:1Zn1Sb1 Color:00FFFF // or // Range1=95.3100 95.5800 Vol:0.04542 Zn:1 Sb:1 Name:1Zn1Sb1 Color:00FFFF // or // Range1= 95.3100 95.5800 Color:00FFFF Vol:0.04542 Zn:1 Sb:1 Name:1Zn1Sb1 //Starting positions (string index) //of range start and end //Range1=31.8372 32.2963 Vol:0.01521 Zn:1 Color:999999 // ^rngmid ^rngend string rngStart,rngEnd; string strTmp=stripWhite(split[1]); //Split the remaining field into key:value pairs, with whitespace delimiters split.clear(); splitStrsRef(strTmp.c_str(),"\t ",split); stripZeroEntries(split); //Need a minimum of 4 entries here if(split.size() < 4) return RANGE_ERR_FORMAT; //First two contains the range data rngStart=split[0]; rngEnd=split[1]; //Remove the two leading elements, the rest are : separated split.erase(split.begin()); split.erase(split.begin()); //Retrieve the remaining fields RGBf col; bool haveColour,haveNameField; haveColour=false; haveNameField=false; string strIonNameTmp,strNameFieldValue; for (unsigned int ui=0; ui 0 unsigned int uintVal; if (stream_cast(uintVal,value) || !uintVal) { delete[] inBuffer; return RANGE_ERR_FORMAT; } //If it is 1, then use straight name. Otherwise try to give it a //chemical formula look by mixing in the multiplicity after the key if (uintVal==1) strIonNameTmp+=key; else strIonNameTmp+=key+value; } } if (!haveColour ) { //Okay, so a colour wasn't provided. // to make our users lives a bit less // boring, lets just use some semi-random ones col.red=rand()/(float)std::numeric_limits::max(); col.green=rand()/(float)std::numeric_limits::max(); col.blue=rand()/(float)std::numeric_limits::max(); } //Get the range values float rngStartV,rngEndV; if(strIonNameTmp.size() || haveNameField) { if (stream_cast(rngStartV,rngStart)) { delete[] inBuffer; return RANGE_ERR_FORMAT; } if (stream_cast(rngEndV,rngEnd)) { delete[] inBuffer; return RANGE_ERR_FORMAT; } } //So the ion field appears to be optional (that is, //ivas emits RRNGs that do not contain an ion listed in the //ion field). It is unclear what the purpose of these lines is, //so we shall ignore it, in preference to aborting if(strIonNameTmp.size()) { //Check to see if we have this ion. //If we don't, we create a new one. //if we do, we check that the colours match //and if not reject the file parsing. unsigned int pos=(unsigned int)(-1); for (unsigned int ui=0; ui '9') { chargeStrStop =ui; break; } } //Strip off the charge value, to get the ion name strNameFieldValue =strNameFieldValue.substr(chargeStrStop,strNameFieldValue.size()-chargeStrStop); //Check to see if we have this ion. //If we dont, we create a new one. //if we do, we check that the colours match //and if not reject the file parsing. unsigned int pos=(unsigned int)(-1); for (unsigned int ui=0; ui &exts) { //subtract one for the guard terminator, which // we do not want to return exts.resize(THREEDEP_ARRAYSIZE(RANGE_EXTS)-1); for(unsigned int ui=0;ui ranges[uj].first && ranges[ui].first < ranges[uj].second ) return false; if(ranges[ui].second > ranges[uj].first && ranges[ui].second < ranges[uj].second ) return false; //check for not spanning a range if(ranges[ui].first < ranges[uj].first && ranges[ui].second > ranges[uj].second) return false; //Check for range duplication if(ranges[ui].first == ranges[uj].first && ranges[ui].second == ranges[uj].second) return false; } } //Ensure that the names don't clash for(size_t ui=0;ui= ranges[ui].first && mass <= ranges[ui].second ) return true; } return false; } bool RangeFile::isRanged(const IonHit &ion) const { return isRanged(ion.getMassToCharge()); } bool RangeFile::range(vector &ions, string ionShortName) { vector rangedVec; //find the Ion ID of what we want unsigned int targetIonID=(unsigned int)-1; for(unsigned int ui=0; ui subRanges; for(unsigned int ui=0; ui= ranges[subRanges[uj]].first && ions[ui].getMassToCharge() <= ranges[subRanges[uj]].second ) { rangedVec.push_back(ions[ui]); break; } } } //Do the switcheroonie //such that the un-ranged ions are destroyed //and the ranged ions are kept ions.swap(rangedVec); return true; } void RangeFile::range(vector &ions) { vector rangedVec; unsigned int numIons=ions.size(); rangedVec.reserve(numIons); for(unsigned int ui=0; ui &ions, unsigned int rangeID) { vector rangedVec; unsigned int numIons=ions.size(); rangedVec.reserve(numIons); for(unsigned int ui=0; ui= ranges[rangeID].first && ions[ui].getMassToCharge() <= ranges[rangeID].second ) { rangedVec.push_back(ions[ui]); break; } } //Do the switcheroonie //such that the un-ranged ions are destroyed //and the ranged ions are kept ions.swap(rangedVec); } void RangeFile::rangeByIon(const std::vector & ions, const vector &selectedIons, vector &output) const { output.clear(); //TODO: Play with openmp, to see if this is faster. // There will be problems with synchronising writes to the output. // Could try a sampling algorithm to estimate output size for(size_t ui=0;ui RangeFile::getRange(unsigned int ui) const { return ranges[ui]; } pair &RangeFile::getRangeByRef(unsigned int ui) { return ranges[ui]; } RGBf RangeFile::getColour(unsigned int ui) const { ASSERT(ui < colours.size()); return colours[ui]; } unsigned int RangeFile::getIonID(float mass) const { unsigned int numRanges = ranges.size(); for(unsigned int ui=0; ui= ranges[ui].first && mass <= ranges[ui].second ) return ionIDs[ui]; } return (unsigned int)-1; } unsigned int RangeFile::getRangeID(float mass) const { unsigned int numRanges = ranges.size(); for(unsigned int ui=0; ui= ranges[ui].first && mass <= ranges[ui].second ) return ui; } return (unsigned int)-1; } unsigned int RangeFile::getIonID(unsigned int range) const { ASSERT(range < ranges.size()); return ionIDs[range]; } unsigned int RangeFile::getIonID(const char *name, bool useShortName) const { if(useShortName) { //find the first element in the sequence for(unsigned int ui=0; ui &ionHits, unsigned int rng) { //This is a bit slack, could be faster, but should work. return range(ionHits,ionNames[rng].first); } bool RangeFile::isRanged(string shortName, bool caseSensitive) { if(caseSensitive) { for(unsigned int ui=ionNames.size(); ui--; ) { if(ionNames[ui].first == shortName) return true; } } else { for(unsigned int ui=ionNames.size(); ui--; ) { //perform a series of case independent //string comparisons string str; str = ionNames[ui].first; if(str.size() !=shortName.size()) continue; bool next; next=false; for(unsigned int ui=str.size(); ui--; ) { if(tolower(str[ui]) != tolower(shortName[ui])) { next=true; break; } } if(!next) return true; } } return false; } void RangeFile::setColour(unsigned int id, const RGBf &r) { ASSERT(id < colours.size()); colours[id] = r; } void RangeFile::setIonShortName(unsigned int id, const std::string &newName) { ionNames[id].first=newName; } void RangeFile::setIonLongName(unsigned int id, const std::string &newName) { ionNames[id].second = newName; } bool RangeFile::setRangeStart(unsigned int rangeId, float v) { ASSERT(!enforceConsistency || isSelfConsistent()); float &f=ranges[rangeId].first; float tmp; tmp=f; f=v; //TODO: I think this does excess calculatioN? if(enforceConsistency && !isSelfConsistent()) { //restore original value f=tmp; return false; } return true; } bool RangeFile::setRangeEnd(unsigned int rangeId, float v) { ASSERT(!enforceConsistency || isSelfConsistent()); float &f=ranges[rangeId].second; float tmp; tmp=f; f=v; //TODO: I think this does excess calculatioN? if(enforceConsistency && !isSelfConsistent()) { //restore original value f=tmp; return false; } return true; } void RangeFile::swap(RangeFile &r) { using std::swap; swap(ionNames,r.ionNames); swap(colours,r.colours); swap(ranges,r.ranges); swap(ionIDs,r.ionIDs); swap(warnMessages,r.warnMessages); swap(errState,r.errState); } bool RangeFile::moveRange(unsigned int rangeId, bool upperLimit, float newMass) { if(enforceConsistency) { //Check for moving past other part of range -- "inversion" if(upperLimit) { //Move upper range if(newMass <= ranges[rangeId].first) return false; } else { if(newMass >= ranges[rangeId].second) return false; } //Check that moving this range will not cause any overlaps with //other ranges for(unsigned int ui=0; ui ranges[ui].first)) return false; if((ranges[rangeId].first < ranges[ui].second && newMass > ranges[ui].second)) return false; } else { //moving low range //check for overlap on first if((ranges[rangeId].second > ranges[ui].first && newMass < ranges[ui].first)) return false; if((ranges[rangeId].second > ranges[ui].second && newMass < ranges[ui].second)) return false; } } } if(upperLimit) ranges[rangeId].second = newMass; else ranges[rangeId].first= newMass; return true; } bool RangeFile::moveBothRanges(unsigned int rangeId, float newLow, float newHigh) { //Check that moving this range will not cause any overlaps with //other ranges for(unsigned int ui=0; ui ranges[ui].first)) return false; if((ranges[rangeId].first < ranges[ui].second && newHigh > ranges[ui].second)) return false; //moving low range //check for overlap on first if((ranges[rangeId].second > ranges[ui].first && newLow < ranges[ui].first)) return false; if((ranges[rangeId].second > ranges[ui].second && newLow < ranges[ui].second)) return false; } ranges[rangeId].second = newHigh; ranges[rangeId].first= newLow; return true; } unsigned int RangeFile::addRange(float start, float end, unsigned int parentIonID) { ASSERT(start < end); if(enforceConsistency) { //Ensure that they do NOT overlap for(unsigned int ui=0;ui ranges[ui].first && start<=ranges[ui].second) return -1; if(end > ranges[ui].first && end<=ranges[ui].second) return -1; //check for start/end spanning range entirely if(start < ranges[ui].first && end > ranges[ui].second) return -1; } } //Got this far? Good - valid range. Insert it and move on ionIDs.push_back(parentIonID); ranges.push_back(std::make_pair(start,end)); #ifdef DEBUG if(enforceConsistency) { ASSERT(isSelfConsistent()); } #endif return ranges.size(); } unsigned int RangeFile::addIon(const std::string &shortN, const std::string &longN, const RGBf &newCol) { for(unsigned int ui=9; ui killRange(ranges.size(),false); for(size_t ui=0;uiionId) ionIDs[ui]--; #ifdef DEBUG ASSERT(ionIDs[ui] < ionNames.size()); #endif } } bool RangeFile::decompose(RangeFile &rng) const { //find the list of decomposables rng=*this; for(size_t ui=0; ui > fragments; if(!decomposeIonNames(ionNames[ui].first,fragments)) return false; for(size_t uj=0; uj::max(); col.green=rand()/(float)std::numeric_limits::max(); col.blue=rand()/(float)std::numeric_limits::max(); //Create a new ion to support this fragment rng.addIon(fragments[uj].first,fragments[uj].first,col); } } } ASSERT(rng.isSelfDecomposable()); return true; } bool RangeFile::isSelfDecomposable() const { for(size_t ui=0; ui > fragments; if(!decomposeIonNames(ionNames[ui].first,fragments)) return false; //ion cannot be decomposed into smaller fragments. //This is not a decomposable rangefile if(getIonID(ionNames[ui].first) == -1) return false; } return true; } bool RangeFile::getDecomposition(std::map > > &decomposition) const { decomposition.clear(); //TODO: Convert to cached, statified map? for(size_t ui=0;ui > thisFragment; if(!decomposeIonNames(ionNames[ui].first,thisFragment)) return false; //convert the name,count pairs to ionID, count pairs vector > fragmentAsRanges; fragmentAsRanges.resize(thisFragment.size()); for(size_t uj=0;uj. */ #include "vtk.h" #include using std::endl; using std::vector; using std::string; using std::cerr; //Adapted with permission (2016) from mVTK, by // guillaume flandin unsigned int vtk_write_legacy(const std::string &filename, unsigned int format, const std::vector &ions) { std::ofstream f; if(format != VTK_ASCII) { cerr << "Binary mode is not implemented" << endl; return VTK_ERR_NOT_IMPLEMENTED; } f.open(filename.c_str()); if(!f) return VTK_ERR_FILE_OPEN_FAIL; f << "# vtk DataFile Version 2.0\n"; f << "Saved using AtomProbe Tools\n"; f << "ASCII\n\n"; f << "DATASET UNSTRUCTURED_GRID\n"; f << "POINTS " << ions.size() << " float\n"; //Write ion data which is the support points for later scalar data for(unsigned int ui=0;ui unsigned int vtk_write_legacy(const std::string &filename, unsigned int format, const Voxels &vox) { std::ofstream f; if(format != VTK_ASCII) { cerr << "Binary mode is not implemented" << endl; return VTK_ERR_NOT_IMPLEMENTED; } f.open(filename.c_str()); if(!f) return VTK_ERR_FILE_OPEN_FAIL; f << "# vtk DataFile Version 3.0\n"; f << "Saved using AtomProbe Tools\n"; f << "ASCII\n\n"; size_t nx,ny,nz; vox.getSize(nx,ny,nz); f << "DATASET RECTILINEAR_GRID\n"; f << "DIMENSIONS " << nx << " " << ny << " " << nz << endl; f << "X_COORDINATES " << nx << " float" << endl; for(unsigned int ui=0;ui ions; //make a cube of ions, each with a differing mass. for(unsigned int ui=0;ui<8;ui++) ions.push_back(IonHit(Point3D(ui &1, (ui & 2) >>1, (ui &4) >>2),ui)); //export it TEST(vtk_write_legacy("debug.vtk",VTK_ASCII,ions) == 0,"VTK write"); Voxels v; v.resize(3,3,3); v.setData(0,0,0,1); v.setData(1,0,0,2); v.setData(2,0,0,3); v.setData(2,1,0,4); vtk_write_legacy("debug-vox.vtk",VTK_ASCII,v); return true; } #endif 3Depict-0.0.19/src/backend/APT/abundanceParser.h0000644000175000017500000000635212640746376020555 0ustar pcuserpcuser/* * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef ABUNDANCE_H #define ABUNDANCE_H #include #include #include // Example //====== // |------| // | 2 |<- mass number // | H |<- Symbol // | 1 |<- atomic number // |------| // 2.014101 <- mass // 0.00000000006 <- mass error // 0.000115 <- abundance // 0.000070 <- abundance error //====== struct ISOTOPE_DATA { std::string symbol; size_t massNumber,atomicNumber; float mass; float massError; //positive if known, zero if unknown float abundance; float abundanceError; //positive if known, zero if unknown }; //!Class to load abundance information for natural isotopse class AbundanceData { enum { ABUNDANCE_ERR_BAD_DOC=1, ABUNDANCE_ERR_NO_CONTEXT, ABUNDANCE_ERROR_BAD_VALUE, ABUNDANCE_ERROR_FAILED_VALIDATION, ABUNDANCE_ERROR_MISSING_NODE, ABUNDANCE_ERROR_MISSING_ROOT_NODE, ABUNDANCE_ERROR_WRONG_ROOT_NODE, ABUNDANCE_ERROR_ENUM_END }; //!vector of atoms, containing a vector of isotope datasets // First vector is indexed by atomic number std::vector > isotopeData; //atomic numbers for each atom's isotope entry // this is esentially a lookup (isotope # -> atom #) std::vector atomicNumber; //Check the abundance table for inconsistenceis void checkErrors() const; public: //!Attempt to open the abundance data file, return 0 on success size_t open(const char *file, bool strict=false); static const char *getErrorText(size_t errorCode); size_t numIsotopes() const; size_t numElements() const; //Return the elemnl //case sensitive, must match chemistry style Upper[lower], eg Fe. size_t symbolIndex(const char *symbol) const; //Return a vector of symbol indices void getSymbolIndices(const std::vector &symbols,std::vector &indices) const; std::string elementName(size_t elemIdx ) const { return isotopeData[elemIdx][0].symbol;} const std::vector &isotopes(size_t offset) const { return isotopeData[offset];} //Compute the mass-probability distribution for a set of ions void generateIsotopeDist(const std::vector &elementIdx, const std::vector &frequency, std::vector > &massDist,size_t solutionCharge=1) const; void generateSingleAtomDist(size_t atomIdx, unsigned int repeatCount, std::vector > &massDist,size_t solutionCharge=1) const; const ISOTOPE_DATA &isotope(size_t elementIdx, size_t isotopeIdx) const; #ifdef DEBUG //Run the unit esting code static bool runUnitTests(const char *tableFile); #endif }; #endif 3Depict-0.0.19/src/backend/configFile.h0000644000175000017500000001434112640746376017076 0ustar pcuserpcuser/* * configFile.h - Configuration file management header * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef CONFIGFILE_H #define CONFIGFILE_H #include #include "backend/filter.h" //!Startup panel identifiers. enum { CONFIG_STARTUPPANEL_RAWDATA, CONFIG_STARTUPPANEL_CONTROL, CONFIG_STARTUPPANEL_PLOTLIST, CONFIG_STARTUPPANEL_END_ENUM }; enum { CONFIG_PANELMODE_NONE, CONFIG_PANELMODE_REMEMBER, CONFIG_PANELMODE_SPECIFY, CONFIG_PANELMODE_END_ENUM }; enum { CONFIG_ERR_NOFILE=1, CONFIG_ERR_BADFILE, CONFIG_ERR_NOPARSER }; class ConfigFile { private: std::deque recentFiles; std::vector filterDefaults; //!Did the configuration load from file OK? bool configLoadOK; //!Panel std::vector startupPanelView; //!Any errors that occur during file IO. Set by class members during read()/write() std::string errMessage; //!Method for showing/hiding panel at startup unsigned int panelMode; //!Initial application window size in pixels unsigned int initialSizeX,initialSizeY; //!Do we have a valid initial app size? bool haveInitialAppSize; //!Percentile speeds for mouse zoom and move unsigned int mouseZoomRatePercent,mouseMoveRatePercent; //!Want startup orthographic cam bool wantStartupOrthoCam; //!Master allow the program to do stuff online check. This is AND-ed, so cannot override disabled items bool allowOnline; //!Should the program perform online version number checking? bool allowOnlineVerCheck; //!fractional initial positions of sashes in main UI float leftRightSashPos,topBottomSashPos, filterSashPos,plotListSashPos; //!True if config has a valid maxPoints value bool haveMaxPoints; //!Max. number of points to display in 3D scene // 0 for unlimited size_t maxPointsScene; //!Does the user want to be shown a startup tip dialog? bool doWantStartupTips; public: ConfigFile(); ~ConfigFile(); void addRecentFile(const std::string &str); void getRecentFiles(std::vector &filenames) const; void removeRecentFile(const std::string &str); unsigned int read(); bool write(); bool configLoadedOK() const { return configLoadOK;} //Create the configuration folder, if needed. static bool createConfigDir() ; //Get the configuration dir path static std::string getConfigDir(); std::string getErrMessage() const { return errMessage;}; static unsigned int getMaxHistory(); //Get a vector of the default filter pointers void getFilterDefaults(std::vector &defs); //Set the default filter pointers (note this will take ownership of the pointer) void setFilterDefaults(const std::vector &defs); //Get a clone of the default filter for a given type, //even if it is not in the array (use hardcoded) Filter *getDefaultFilter(unsigned int type) const; bool getHaveMaxPoints() const { return haveMaxPoints;} size_t getMaxPoints() const { return maxPointsScene;} void setMaxPoints(size_t maxP) { haveMaxPoints=true; maxPointsScene=maxP;} //!Return startup status of UI panels bool getPanelEnabled(unsigned int panelID) const; //!Return startup status of UI panels void setPanelEnabled(unsigned int panelID,bool enabled, bool permanent=false); //!Get the mouse movement rate (for all but zoom) unsigned int getMouseMoveRate() const { return mouseMoveRatePercent; } //!Get the mouse movement rate for zoom unsigned int getMouseZoomRate() const { return mouseZoomRatePercent; } //Set the mouse zoom rate(percent) void setMouseZoomRate(unsigned int rate) { mouseZoomRatePercent=rate;}; //Set the mouse move rate (percent) void setMouseMoveRate(unsigned int rate) { mouseMoveRatePercent=rate;}; //!Return the current panelmode unsigned int getStartupPanelMode() const; //!Set the mode to use for recalling the startup panel layout void setStartupPanelMode(unsigned int panelM); //!Returns true if we have a suggested initial window size; with x & y being the suggestion bool getInitialAppSize(unsigned int &x, unsigned int &y) const; //!Set the initial window suggested size void setInitialAppSize(unsigned int x, unsigned int y); bool getAllowOnlineVersionCheck() const; //!Set if the program is allowed to access network resources void setAllowOnline(bool v); //!Set if the program is allowed to phone home to get latest version #s void setAllowOnlineVersionCheck(bool v); //!Set the position for the main window left/right sash void setLeftRightSashPos(float fraction); //!Set the position for the top/bottom sash void setTopBottomSashPos(float fraction); //!Set the position for the filter property/tree sash void setFilterSashPos(float fraction); //!Set the position for the plot list panel void setPlotListSashPos(float fraction); //!Set the position for the main window left/right sash float getLeftRightSashPos() const { return leftRightSashPos;}; //!Set the position for the top/bottom sash float getTopBottomSashPos() const{ return topBottomSashPos;} //!Set the position for the filter property/tree sash float getFilterSashPos() const { return filterSashPos;}; //!Set the position for the plot list panel float getPlotListSashPos()const { return plotListSashPos;}; //!Does the user want startup tips bool wantStartupTips() const { return doWantStartupTips;} //!Set if tips are to be shown on startup void setWantStartupTips(bool want) { doWantStartupTips=want;} //!Get if user wants an orhtographic camera on startup bool getWantStartupOrthoCam() const { return wantStartupOrthoCam;} void setWantStartupOrthoCam(bool want) { wantStartupOrthoCam=want;} }; #endif 3Depict-0.0.19/src/backend/viscontrol.cpp0000644000175000017500000004715612716174467017600 0ustar pcuserpcuser/* * viscontrol.h - Visualisation control header; "glue" between user interface and scene * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "viscontrol.h" #include #include "wx/propertyGridUpdater.h" #include "wx/wxcomponents.h" #include "common/voxels.h" using std::list; using std::vector; using std::pair; bool VisController::isInstantiated = false; //TODO: Remove me, and refactor filters bool dummyRefreshCallback(bool dummy) { return true; } RefreshController::RefreshController(TreeState &tC) { treeState=&tC; } RefreshController::~RefreshController() { } unsigned int RefreshController::refresh() { ASSERT(treeState); return treeState->refresh(refreshData,consoleMessages,curProg); } bool VisController::stateIsModified(unsigned int minLevel) const { return state.hasStateData() && getStateModifyLevel(); } void VisController::transferSceneCameraToState() { const Camera *c=scene.getActiveCam(); state.setCameraByClone(c,state.getActiveCam()); } void VisController::setCamProperty(size_t offset, unsigned int key, const std::string &value) { state.setCamProperty(offset,key,value); if(offset == state.getActiveCam()) scene.setActiveCamByClone(state.getCam(offset)); } void VisController::setWxTreeFilterViewPersistence(size_t filterId) { persistentFilters.push_back(state.treeState.getFilterById(filterId)); } void VisController::updateCameraPropGrid(wxPropertyGrid *g, size_t camId) const { ASSERT(g); const Camera *c; c= state.getCam(camId); updateCameraPropertyGrid(g,c); } void VisController::updateFilterPropGrid(wxPropertyGrid *g,size_t filterId, const std::string &stateStr) const { ASSERT(g); const Filter *targetFilter; targetFilter=state.treeState.getFilterById(filterId); ASSERT(targetFilter); updateFilterPropertyGrid(g,targetFilter,stateStr); } void VisController::updateScene(RefreshController *r) { //Strip data out of the refresh controller (drop the parent filter data) list &sceneData = r->getRefreshData(); list< vector > dataOnly; for(list::iterator it=sceneData.begin(); it!=sceneData.end();++it) { vector t; t.resize(it->second.size()); std::copy(it->second.begin(),it->second.end(),t.begin()); dataOnly.push_back(t); } updateScene(dataOnly,false); } void VisController::updateScene(list > &sceneData, bool releaseData) { //Plot window should be set ASSERT(plotSelList) //Lock the opengl scene interaction, // to prevent user interaction (e.g. devices) during callbacks scene.lockInteraction(); targetPlots.lockInteraction(); //Buffer to transfer to scene vector sceneDrawables; targetPlots.clear(true); //Clear, but preserve selection information. //Names for plots vector > plotLabels; //rate-limit the number of drawables to show in the scene map throttleMap; throttleSceneInput(sceneData,throttleMap); //-- Build buffer of new objects to send to scene for(list > ::iterator it=sceneData.begin(); it!=sceneData.end(); ++it) { ASSERT(it->size()); for(unsigned int ui=0;uisize(); ui++) { //Filter must specify whether it is cached or not. Other values //are inadmissible, but useful to catch uninitialised values ASSERT((*it)[ui]->cached == 0 || (*it)[ui]->cached == 1); //set to true if we need to free up ram pointed to by // scene object iterator bool deleteIt; deleteIt=false; switch((*it)[ui]->getStreamType()) { case STREAM_TYPE_IONS: { //Create a new group for this stream. // We have to have individual groups // because of colouring/sizing concerns. DrawManyPoints *curIonDraw; curIonDraw=new DrawManyPoints; //Obtain the ion data pointer. // note that we have to use the throttled points // (in throttlemap) if they are there, to prevent // overloading the display system. const IonStreamData *ionData; ionData=((const IonStreamData *)((*it)[ui])); if(throttleMap.find(ionData) != throttleMap.end()) { ionData=throttleMap[ionData]; } curIonDraw->resize(ionData->data.size()); //Slice out just the coordinate data for the // ion pointer, run callback immediately // after, as its a long operation #pragma omp parallel for shared(curIonDraw,ionData) for(size_t ui=0;uidata.size();ui++) curIonDraw->setPoint(ui,ionData->data[ui].getPosRef()); //Set the colour from the ionstream data curIonDraw->setColour(ionData->r, ionData->g, ionData->b, ionData->a); //set the size from the ionstream data curIonDraw->setSize(ionData->ionSize); //Randomly shuffle the ion data before we draw it curIonDraw->shuffle(); //place in special holder for ions, // as we need to accumulate for display-listing // later. sceneDrawables.push_back(curIonDraw); break; } case STREAM_TYPE_PLOT: { const PlotStreamData *plotData; plotData=((PlotStreamData *)((*it)[ui])); //The plot should have some data in it. ASSERT(plotData->getNumBasicObjects()); //The plot should have an index, so we can keep //filter choices between refreshes (where possible) ASSERT(plotData->index !=(unsigned int)-1); //Construct a new plot unsigned int plotID; //No other plot mode is currently implemented. ASSERT(plotData->plotMode == PLOT_MODE_1D); //Create a 1D plot Plot1D *plotNew= new Plot1D; plotNew->setData(plotData->xyData); plotNew->setLogarithmic(plotData->logarithmic); plotNew->titleAsRawDataLabel=plotData->useDataLabelAsYDescriptor; plotNew->setErrMode(plotData->errDat); //Construct any regions that the plot may have for(unsigned int ui=0;uiregions.size();ui++) { //add a region to the plot, //using the region data stored //in the plot stream plotNew->regionGroup.addRegion(plotData->regionID[ui], plotData->regionTitle[ui], plotData->regions[ui].first, plotData->regions[ui].second, plotData->regionR[ui], plotData->regionG[ui], plotData->regionB[ui],plotData->regionParent); } //transfer the axis labels plotNew->setStrings(plotData->xLabel, plotData->yLabel,plotData->dataLabel); //set the appearance of the plot //plotNew->setTraceStyle(plotStyle); plotNew->setColour(plotData->r,plotData->g,plotData->b); plotNew->parentObject=plotData->parent; plotNew->parentPlotIndex=plotData->index; plotID=targetPlots.addPlot(plotNew); plotLabels.push_back(make_pair(plotID,plotData->dataLabel)); break; } //TODO: Merge back into STREAM_TYPE_PLOT case STREAM_TYPE_PLOT2D: { const Plot2DStreamData *plotData; plotData=((Plot2DStreamData *)((*it)[ui])); //The plot should have some data in it. ASSERT(plotData->getNumBasicObjects()); //The plot should have an index, so we can keep //filter choices between refreshes (where possible) ASSERT(plotData->index !=(unsigned int)-1); unsigned int plotID; PlotBase *plotNew; switch(plotData->plotType) { case PLOT_2D_DENS: { //Create a 2D plot plotNew= new Plot2DFunc; //set the plot info ((Plot2DFunc*)plotNew)->setData(plotData->xyData, plotData->xMin, plotData->xMax, plotData->yMin,plotData->yMax); break; } case PLOT_2D_SCATTER: { //Create a 2D plot Plot2DScatter *p = new Plot2DScatter; //set the plot info if(plotData->scatterIntensity.size()) p->setData(plotData->scatterData,plotData->scatterIntensity); else p->setData(plotData->scatterData); p->scatterIntensityLog=plotData->scatterIntensityLog; plotNew=p; break; } default: ASSERT(false); } //transfer the axis labels plotNew->setStrings(plotData->xLabel, plotData->yLabel,plotData->dataLabel); //transfer the parent info plotNew->parentObject=plotData->parent; plotNew->parentPlotIndex=plotData->index; plotID=targetPlots.addPlot(plotNew); // ----- plotLabels.push_back(make_pair(plotID,plotData->dataLabel)); break; } case STREAM_TYPE_DRAW: { DrawStreamData *drawData; drawData=((DrawStreamData *)((*it)[ui])); //Retrieve vector const std::vector *drawObjs; drawObjs = &(drawData->drawables); //Loop through vector, Adding each object to the scene if(drawData->cached) { //Create a *copy* for scene. Filter still holds //originals, and will dispose of the pointers accordingly for(unsigned int ui=0;uisize();ui++) sceneDrawables.push_back((*drawObjs)[ui]->clone()); } else { //Place the *pointers* to the drawables in the scene // list, to avoid copying for(unsigned int ui=0;uisize();ui++) sceneDrawables.push_back((*drawObjs)[ui]); //Although we do not delete the drawable objects //themselves, we do delete the container //Zero-size the internal vector to //prevent vector destructor from deleting pointers //we have transferred ownership of to scene drawData->drawables.clear(); deleteIt=true; } break; } case STREAM_TYPE_RANGE: //silently drop rangestreams break; case STREAM_TYPE_VOXEL: { //Technically, we are violating const-ness VoxelStreamData *vSrc = (VoxelStreamData *)((*it)[ui]); //Create a new Field3D Voxels *v = new Voxels; //Make a copy if cached; otherwise just steal it. if(vSrc->cached) vSrc->data->clone(*v); else v->swap(*(vSrc->data)); switch(vSrc->representationType) { case VOXEL_REPRESENT_POINTCLOUD: { DrawField3D *d = new DrawField3D; d->setField(v); d->setColourMapID(0); d->setColourMinMax(); d->setBoxColours(vSrc->r,vSrc->g,vSrc->b,vSrc->a); d->setPointSize(vSrc->splatSize); d->setAlpha(vSrc->a); d->wantsLight=false; sceneDrawables.push_back(d); break; } case VOXEL_REPRESENT_ISOSURF: { DrawIsoSurface *d = new DrawIsoSurface; d->swapVoxels(v); d->setColour(vSrc->r,vSrc->g, vSrc->b,vSrc->a); d->setScalarThresh(vSrc->isoLevel); d->wantsLight=true; sceneDrawables.push_back(d); break; } default: ASSERT(false); delete v; ; } break; } } //delete drawables as needed if( (!(*it)[ui]->cached && releaseData) || deleteIt) { //Ensure that we didnt force deletion of a cached obejct ASSERT(deleteIt != (*it)[ui]->cached); delete (*it)[ui]; (*it)[ui]=0; } } } //Free the rate-limited points for(map::iterator it =throttleMap.begin(); it!=throttleMap.end();++it) { delete it->second; } throttleMap.clear(); //--- //Construct an OpenGL display list from the dataset //Check how many points we have. Too many can cause the display list to crash size_t totalIonCount=0; for(unsigned int ui=0;uigetType() == DRAW_TYPE_MANYPOINT) totalIonCount+=((const DrawManyPoints*)(sceneDrawables[ui]))->getNumPts(); } //Must lock UI controls, or not run callback from here on in! //========== //Update the plotting UI contols //----------- plotSelList->Clear(); // erase wx list plotMap.clear(); for(size_t ui=0;uiAppend((plotLabels[ui].second)); plotMap[ui] = plotLabels[ui].first; } //If there is only one spectrum, select it if(plotSelList->GetCount() == 1 ) plotSelList->SetSelection(0); else if( plotSelList->GetCount() > 1) { //Otherwise try to use the last visibility information //to set the selection targetPlots.bestEffortRestoreVisibility(); } for(unsigned int ui=0; uiGetCount();ui++) { #if defined(__WIN32__) || defined(__WIN64__) //Bug under windows. SetSelection(wxNOT_FOUND) does not work for multi-selection list boxes plotSelList->SetSelection(-1, false); #else plotSelList->SetSelection(wxNOT_FOUND); //Clear selection #endif for(unsigned int ui=0; uiGetCount();ui++) { //Retrieve the uniqueID unsigned int plotID; plotID=plotMap[ui]; if(targetPlots.isPlotVisible(plotID)) plotSelList->SetSelection(ui); } } targetPlots.lockInteraction(false); //----------- scene.clearObjs(); scene.clearRefObjs(); //For speed, we have to treat ions specially. // for now, use a display list (these are no longer recommended in opengl, // but they are much easier to use than extensions) vector drawIons; for(size_t ui=0;uigetType() == DRAW_TYPE_MANYPOINT) { drawIons.push_back((DrawManyPoints*)sceneDrawables[ui]); sceneDrawables.erase(sceneDrawables.begin()+ui); ui--; } } if(totalIonCount < MAX_NUM_DRAWABLE_POINTS && drawIons.size() >1) { //Try to use a display list where we can. //note that the display list requires a valid bounding box, //so single point entities, or overlapped points can //produce an invalid bounding box DrawDispList *displayList; displayList = new DrawDispList(); bool listStarted=false; for(unsigned int ui=0;uigetBoundingBox(b); if(b.isValid()) { if(!listStarted) { displayList->startList(false); listStarted=true; } displayList->addDrawable(drawIons[ui]); delete drawIons[ui]; } else scene.addDrawable(drawIons[ui]); } if(listStarted) { displayList->endList(); scene.addDrawable(displayList); } else delete displayList; } else { for(unsigned int ui=0;ui > &sceneData, std::map &throttleMap) const { //Count the number of input ions, as we may need to perform culling, if(!limitIonOutput) return; size_t inputIonCount=0; for(list >::const_iterator it=sceneData.begin(); it!=sceneData.end(); ++it) inputIonCount+=numElements(*it,STREAM_TYPE_IONS); //If limit is higher than what we have, no culling required if(limitIonOutput >=inputIonCount) return; //Need to cull float cullFraction = (float)limitIonOutput/(float)inputIonCount; for(list >::iterator it=sceneData.begin(); it!=sceneData.end(); ++it) { for(unsigned int ui=0;uisize(); ui++) { if((*it)[ui]->getStreamType() != STREAM_TYPE_IONS) continue; //Obtain the ion data pointer const IonStreamData *ionData; ionData=((const IonStreamData *)((*it)[ui])); //Duplicate this object, then forget // about the old one. The freeing will be done by //the refresh thread as needed, so don't free here. // We can't modify the input, even when uncached, // as the object is const IonStreamData *newIonData; newIonData=ionData->cloneSampled(cullFraction); throttleMap[ionData] = newIonData; } } } void VisController::updateRawGrid() const { vector > > plotData; vector > labels; //grab the data for the currently visible plots targetPlots.getRawData(plotData,labels); //Clear the grid if(targetRawGrid->GetNumberCols()) targetRawGrid->DeleteCols(0,targetRawGrid->GetNumberCols()); if(targetRawGrid->GetNumberRows()) targetRawGrid->DeleteRows(0,targetRawGrid->GetNumberRows()); unsigned int curCol=0; for(unsigned int ui=0;uiAppendCols(plotData[ui].size()); ASSERT(labels[ui].size() == plotData[ui].size()); startCol=curCol; for(unsigned int uj=0;ujSetColLabelValue(curCol,(s)); curCol++; } //set the data for(unsigned int uj=0;uj targetRawGrid->GetNumberRows()) targetRawGrid->AppendRows(plotData[ui][uj].size()-targetRawGrid->GetNumberRows()); for(unsigned int uk=0;ukSetCellValue(uk,startCol,(tmpStr)); } startCol++; } } } void VisController::updateWxTreeCtrl(wxTreeCtrl *t, const Filter *visibleFilt) { map filterMap; upWxTreeCtrl(state.treeState.getTreeRef(),t, filterMap,persistentFilters,visibleFilt); cerr << "Rebuilt filter map" <Clear() under MSW causes a crash while(comboStash->GetCount()) comboStash->Delete(0); unsigned int nStashes = state.getStashCount(); for(unsigned int ui=0;uiAppend(stashName,(wxClientData *)u); ASSERT(comboStash->GetClientObject(comboStash->GetCount()-1)); } } void VisController::updateCameraComboBox(wxComboBox *comboCamera) const { //Update the camera dropdown //HACK: Calling ->Clear() under MSW causes a crash while(comboCamera->GetCount()) comboCamera->Delete(0); size_t nCams = state.getNumCams(); //The start from 1 is a hack to avoid the unnamed camera for(unsigned int ui=1;uiAppend(camName, (wxClientData *)new wxListUint(ui)); //If this is the active cam (1) set the selection and (2) remember //the ID if(ui == state.getActiveCam()) comboCamera->SetSelection(ui-1); } } size_t VisController::getPlotID(size_t position) const { ASSERT(plotMap.size()); ASSERT(plotMap.find(position)!=plotMap.end()); return plotMap.find(position)->second; } void VisController::setActiveCam(unsigned int newActive) { //set the active camera in state, then clone it to the scene state.setActiveCam(newActive); scene.setActiveCam(state.getCam(newActive)->clone()); } 3Depict-0.0.19/src/backend/filters/0000755000175000017500000000000012723200266016306 5ustar pcuserpcuser3Depict-0.0.19/src/backend/filters/clusterAnalysis.h0000644000175000017500000001506612717273627021672 0ustar pcuserpcuser/* * clusterAnalysis.h - Cluster analysis on valued point clouds * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef CLUSTERANALYSIS_H #define CLUSTERANALYSIS_H #include "../filter.h" #include "../../common/translation.h" #include "algorithms/K3DTree-mk2.h" #include #include //!Cluster analysis filter class ClusterAnalysisFilter : public Filter { private: //Clustering algorithm to use unsigned int algorithm; //Algorithm parameters //--- //Do we want to enable the core-classification pre-step bool enableCoreClassify; //Core-linkage "core" classification distance float coreDist; //Coring kNN maximum unsigned int coreKNN; //Link distance for core float linkDist; //Enable bulk linking step bool enableBulkLink; //Link distance for bulk float bulkLink; //Enable erosion step bool enableErosion; //Erosion distance for bulk from nonclustered bulk float dErosion; //convert clusters mass to an ID #? bool wantClusterID; //--- //post processing options //Minimum/max number of "core" entires to qualify as, //well, a meaningful cluster bool wantCropSize; size_t nMin,nMax; bool wantClusterSizeDist,logClusterSize; //Do we want the composition data for the cluster bool wantClusterComposition, normaliseComposition; //Do we want a morphological analysis bool wantClusterMorphology; //!Do we have range data to use bool haveRangeParent; //!The names of the incoming ions std::vector ionNames; //!Which ions are core/builk for a particular incoming range? std::vector ionCoreEnabled,ionBulkEnabled; unsigned int buildKDTrees(std::vector &coreIons, std::vector &bulkIons,K3DTreeMk2 &coreTree,K3DTreeMk2 &bulkTree, ProgressData &prog) const; //Do cluster refresh using Link Algorithm (Core + max sep) unsigned int refreshLinkClustering(const std::vector &dataIn, std::vector< std::vector > &clusteredCore, std::vector > &clusteredBulk,ProgressData &progress); //Helper function to create core and bulk std::vectors of ions from input ionstreams void createRangedIons(const std::vector &dataIn, std::vector &core,std::vector &bulk, ProgressData &p) const; //Check to see if there are any core or bulk ions enabled respectively. void checkIonEnabled(bool &core, bool &bulk) const; static void buildRangeEnabledMap(const RangeStreamData *r, std::map &rangeEnabledMap); //Strip out clusters with a given number of elements bool stripClusterBySize(std::vector > &clusteredCore, std::vector > &clusteredBulk, bool countBulk, ProgressData &p) const; //Build a plot that is the cluster size distribution as a function of cluster size PlotStreamData *clusterSizeDistribution(const std::vector > &solutes, const std::vector > &matrix) const; //Build plots that are the cluster size distribution as // a function of cluster size, specific to each ion type. void genCompositionVersusSize(const std::vector > &clusteredCore, const std::vector > &clusteredBulk, const RangeFile *rng, std::vector &plots) const; #ifdef DEBUG bool paranoidDebugAssert(const std::vector > &core, const std::vector > &bulk) const; //Check to see if the singular value routine is working static bool singularValueTest(); #endif ///Find the best fit ellipse, per Karnesky et al to a set of IonHit events. Returned values are a pair : [ centroid, vector ] static void getEllipsoidalFit(const std::vector &coreAtoms, const std::vector &bulkAtoms, std::pair< Point3D, std::vector > &ellipseData); public: ClusterAnalysisFilter(); //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; //!Initialise filter prior to tree propagation virtual void initFilter(const std::vector &dataIn, std::vector &dataOut); //!Returns -1, as range file cache size is dependant upon input. virtual size_t numBytesForCache(size_t nObjects) const; //!Returns FILTER_TYPE_SPATIAL_ANALYSIS unsigned int getType() const { return FILTER_TYPE_CLUSTER_ANALYSIS;}; //update filter unsigned int refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress); //!Get the type string for this filter virtual std::string typeString() const { return std::string(TRANS("Cluster Analysis"));}; std::string getSpecificErrString(unsigned int i) const; //!Get the properties of the filter, in key-value form. First std::vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter bool setProperty(unsigned int key, const std::string &value, bool &needUpdate); //!Dump state to output stream, using specified format bool writeState(std::ostream &f,unsigned int format, unsigned int depth=0) const; //!Read the state of the filter from XML file. If this //fails, filter will be in an undefined state. bool readState(xmlNodePtr &node, const std::string &packDir); //!Get the stream types that will be dropped during ::refresh unsigned int getRefreshBlockMask() const; //!Get the stream types that will be generated during ::refresh unsigned int getRefreshEmitMask() const; //!Get the stream types that will be generated during ::refresh unsigned int getRefreshUseMask() const; //!Set internal property value using a selection binding (Disabled, this filter has no bindings) void setPropFromBinding(const SelectionBinding &b) ; #ifdef DEBUG bool wantParanoidDebug; bool runUnitTests(); #endif }; #endif 3Depict-0.0.19/src/backend/filters/rangeFile.h0000644000175000017500000001205212640746376020372 0ustar pcuserpcuser/* * rangeFile.h - bins ions into different value ranges given an input range file * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef RANGEFILE_H #define RANGEFILE_H #include "../filter.h" #include "../../common/translation.h" enum { RANGE_KEY_RANGE_ACTIVE=1, RANGE_KEY_DROP_UNRANGED, RANGE_KEY_RANGE_FILENAME, RANGE_KEY_ENABLE_LEGEND, RANGE_KEY_ENABLE_ALL_IONS, //Limited to ~100K ions RANGE_KEY_ENABLE_ALL_RANGES=100000, }; //!Range file filter class RangeFileFilter : public Filter { private: std::string rngName; //!Vector of chars stating if user has enabled a particular range or not std::vector enabledRanges; //!Vector of chars stating if user has enabled a particular Ion or not. std::vector enabledIons; //!Whether to drop unranged ions in our output bool dropUnranged; //!Assumed file format when loading. unsigned int assumedFileFormat; void guessFormat(const std::string &s); //!range file object RangeFile rng; //Show a legend of enabled ions bool showLegend; //create a legend drawable. Note that the pointer // will not be deleted by this function DrawStreamData *createLegend() const; public: //!Set the format to assume when loading file void setFormat(unsigned int format); std::vector getEnabledRanges() const {return enabledRanges;}; void setEnabledRanges(const std::vector &i) {enabledRanges = i;}; std::vector getEnabledIons() const {return enabledIons;}; RangeFileFilter(); //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; void setRangeFilename(std::string filename){rngName=filename;}; //!Returns -1, as range file cache size is dependant upon input. virtual size_t numBytesForCache(size_t nObjects) const; //!Returns FILTER_TYPE_RANGEFILE unsigned int getType() const { return FILTER_TYPE_RANGEFILE;}; //!Propagates a range stream data through the filter init stage. Blocks any other range stream datas virtual void initFilter(const std::vector &dataIn, std::vector &dataOut); //update filter unsigned int refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress); //!Force a re-read of the rangefile, returning false on failure, true on success bool updateRng(); const RangeFile &getRange() const { return rng;}; //!Set the internal data using the specified range object void setRangeData(const RangeFile &newRange); virtual std::string typeString() const { return std::string(TRANS("Ranging"));}; //Types that will be dropped during ::refresh unsigned int getRefreshBlockMask() const; //Types that are emitted by filer during ::refrash unsigned int getRefreshEmitMask() const; //Types that are possibly used by filer during ::refrash unsigned int getRefreshUseMask() const; //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter bool setProperty(unsigned int key, const std::string &value, bool &needUpdate); //!Set a region update virtual void setPropFromRegion(unsigned int method, unsigned int regionID, float newPos); //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Dump state to output stream, using specified format bool writeState(std::ostream &f,unsigned int format, unsigned int depth=0) const; //!Modified version of writeState for packaging. By default simply calls writeState. //value overrides override the values returned by getStateOverrides. In order. virtual bool writePackageState(std::ostream &f, unsigned int format, const std::vector &valueOverrides,unsigned int depth=0) const; //!Read the state of the filter from XML file. If this //fails, filter will be in an undefined state. bool readState(xmlNodePtr &node, const std::string &packDir); //!filter has state overrides virtual void getStateOverrides(std::vector &overrides) const; //!Set internal property value using a selection binding (Disabled, this filter has no bindings) void setPropFromBinding(const SelectionBinding &b) ; bool getDropUnranged() const { return dropUnranged; } #ifdef DEBUG bool runUnitTests(); #endif }; #endif 3Depict-0.0.19/src/backend/filters/dataLoad.h0000644000175000017500000001322512640746376020212 0ustar pcuserpcuser/* * dataLoad.h - Load data from various file sources * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef DATALOAD_H #define DATALOAD_H #include "../filter.h" #include "../../common/basics.h" #include "../../common/translation.h" enum { DATALOAD_FLOAT_FILE, DATALOAD_TEXT_FILE, DATALOAD_LAWATAP_ATO_FILE }; enum { DATALOAD_KEY_FILE, DATALOAD_KEY_FILETYPE, DATALOAD_KEY_SAMPLE, DATALOAD_KEY_SIZE, DATALOAD_KEY_COLOUR, DATALOAD_KEY_IONSIZE, DATALOAD_KEY_ENABLED, DATALOAD_KEY_VALUELABEL, DATALOAD_KEY_SELECTED_COLUMN0, DATALOAD_KEY_SELECTED_COLUMN1, DATALOAD_KEY_SELECTED_COLUMN2, DATALOAD_KEY_SELECTED_COLUMN3, DATALOAD_KEY_NUMBER_OF_COLUMNS, DATALOAD_KEY_ENDIANNESS, DATALOAD_KEY_MONITOR }; class DataLoadFilter:public Filter { protected: //!filename from which the ions are being loaded std::string ionFilename; //!Type of file to open unsigned int fileType; //!Whether to randomly sample dataset during load or not bool doSample; //!Maximum number of ions to load, if performing sampling size_t maxIons; //!Default ion colour vars ColourRGBAf rgbaf; //!Default ion size (view size) float ionSize; //!Number of columns & type of file unsigned int numColumns; static const unsigned int INDEX_LENGTH = 4; //!index of columns into pos file, if pos data is visualised as a set of float record presented as a table (one line per record) unsigned int index[INDEX_LENGTH];//x,y,z,value //!Is pos load enabled? bool enabled; //!Volume restricted load? bool volumeRestrict; //!volume restriction bounds, not sorted BoundCube bound; //Epoch timestamp for the mointored file. -1 if invalid time_t monitorTimestamp; //File size for monitored file size_t monitorSize; //Do we want to be monitoring //the timestamp of the file bool wantMonitor; //!string to use in error situation, set during ::refresh std::string errStr; //!String to use to set the value type std::string valueLabel; //!Endian read mode unsigned int endianMode; public: DataLoadFilter(); //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; //!Set the source string void setFilename(const char *name); void setFilename(const std::string &name); void guessNumColumns(); //!Set the filter to either use text or pos as requested, // this does not require exposing the file parameter key void setFileMode(unsigned int mode); //!Get filter type (returns FILTER_TYPE_DATALOAD) unsigned int getType() const { return FILTER_TYPE_DATALOAD;}; //!Get (approx) number of bytes required for cache virtual size_t numBytesForCache(size_t nOBjects) const; //!Refresh object data unsigned int refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress); void updatePosData(); virtual std::string typeString() const { return std::string(TRANS("Pos Data"));} //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter bool setProperty( unsigned int key, const std::string &value, bool &needUpdate); //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Dump state to output stream, using specified format bool writeState(std::ostream &f,unsigned int format, unsigned int depth=0) const; //!write an overridden filename version of the state virtual bool writePackageState(std::ostream &f, unsigned int format, const std::vector &valueOverrides,unsigned int depth=0) const; //!Read the state of the filter from XML file. If this //fails, filter will be in an undefined state. bool readState(xmlNodePtr &node, const std::string &packDir); //!Get the block mask for this filter (bitmaks of streams blocked from propagation during ::refresh) virtual unsigned int getRefreshBlockMask() const; //!Get the refresh mask for this filter (bitmaks of streams emitted during ::refresh) virtual unsigned int getRefreshEmitMask() const; //!Get the refresh use mask for this filter (bitmaks of streams possibly used during ::refresh) virtual unsigned int getRefreshUseMask() const; //!Pos filter has state overrides virtual void getStateOverrides(std::vector &overrides) const; //!Set internal property value using a selection binding (Disabled, this filter has no bindings) void setPropFromBinding(const SelectionBinding &b) ; //!Get the label for the chosen value column std::string getValueLabel(); //!Return if we need monitoring or not virtual bool monitorNeedsRefresh() const; //Are we a pure data source - i.e. can function with no input virtual bool isPureDataSource() const { return true;}; //Can we be a useful filter, even if given no input specified by the Use mask? virtual bool isUsefulAsAppend() const { return true;} #ifdef DEBUG bool runUnitTests(); #endif }; #endif 3Depict-0.0.19/src/backend/filters/ionInfo.h0000644000175000017500000001171612640746376020105 0ustar pcuserpcuser/* * ionInfo.h -Filter to compute various properties of valued point cloud * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef IONINFO_H #define IONINFO_H #include "../filter.h" #include "../../common/translation.h" enum { IONINFO_KEY_TOTALS=1, IONINFO_KEY_NORMALISE, IONINFO_KEY_VOLUME, IONINFO_KEY_VOLUME_ALGORITHM, IONINFO_KEY_BACKMODE, IONINFO_KEY_BACK_MASSSTART, IONINFO_KEY_BACK_MASSEND, IONINFO_KEY_BACK_BINSIZE }; //!Ion derived information filter, things like volume, composition, etc. class IonInfoFilter : public Filter { private: //!Do we want to know information about the number of ions/composition bool wantIonCounts; //!Do we want to normalise the ion count data? bool wantNormalise; //!Parent rangefile in tree RangeStreamData *range; //!Do we want to know about the volume bool wantVolume; //!Method for volume computation unsigned int volumeAlgorithm; //Side length for filled cube volume estimation float cubeSideLen; //mode for performing background correction unsigned int fitMode; //start/end mass for background correction float massBackStart, massBackEnd; //binwidth to use when performing background correction float binWidth; #ifdef DEBUG float lastVolume; #endif //!String for size_t volumeEstimationStringFromID(const char *str) const; //Convex hull volume estimation routine. //returns 0 on success. global "qh " "object" will contain //the hull. Volume is computed. static unsigned int convexHullEstimateVol(const std::vector &data, float &vol); public: //!Constructor IonInfoFilter(); //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; //Perform filter intialisation, for pre-detection of range data virtual void initFilter(const std::vector &dataIn, std::vector &dataOut); //!Apply filter to new data, updating cache as needed. Vector // of returned pointers must be deleted manually, first checking // ->cached. unsigned int refresh(const std::vector &dataIn, std::vector &dataOut, ProgressData &progress); //!Get (approx) number of bytes required for cache size_t numBytesForCache(size_t nObjects) const; //!return type ID unsigned int getType() const { return FILTER_TYPE_IONINFO;} //!Return filter type as std::string std::string typeString() const { return std::string(TRANS("Ion info"));}; //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter, //!needUpdate tells us if filter output changes due to property set bool setProperty( unsigned int key, const std::string &value, bool &needUpdate); void setPropFromBinding( const SelectionBinding &b) ; //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Dump state to output stream, using specified format /* Current supported formats are STATE_FORMAT_XML */ bool writeState(std::ostream &f, unsigned int format, unsigned int depth) const; //!Read state from XML stream, using xml format /* Current supported formats are STATE_FORMAT_XML */ bool readState(xmlNodePtr& n, const std::string &packDir=""); //!Get the bitmask encoded list of filterStreams that this filter blocks from propagation. // i.e. if this filterstream is passed to refresh, it is not emitted. // This MUST always be consistent with ::refresh for filters current state. unsigned int getRefreshBlockMask() const; //!Get the bitmask encoded list of filterstreams that this filter emits from ::refresh. // This MUST always be consistent with ::refresh for filters current state. unsigned int getRefreshEmitMask() const; //!Get the bitmask encoded list of filterstreams that this filter may use during ::refresh. unsigned int getRefreshUseMask() const; //!Does the filter need unranged input? bool needsUnrangedData() const; #ifdef DEBUG bool runUnitTests(); //Debugging function only; must be called after refresh. //Returns the last estimation for volume. float getLastVolume() { float tmp=lastVolume; lastVolume=0;return tmp; } #endif }; #endif 3Depict-0.0.19/src/backend/filters/annotation.cpp0000644000175000017500000012406312716174467021211 0ustar pcuserpcuser/* * annotation.cpp - 3D annotations filter for 3depict * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "annotation.h" #include "filterCommon.h" using std::string; using std::vector; using std::pair; using std::make_pair; //grab size when doing convex hull calculations const unsigned int HULL_GRAB_SIZE=4096; enum { KEY_POSITION=1, KEY_MODE, KEY_ENABLE, KEY_UPVEC, KEY_ACROSSVEC, KEY_ANNOTATE_TEXT, KEY_TARGET, KEY_COLOUR, KEY_ARROW_SIZE, KEY_TEXTSIZE, KEY_LINESIZE, KEY_REFLEXIVE, KEY_SPHERE_ANGLE_SIZE, KEY_ANGLE_TEXT_VISIBLE, KEY_ANGLE_FORMAT_STRING, KEY_LINEAR_FONTSIZE, KEY_LINEAR_NUMTICKS, KEY_LINEAR_FIXED_TICKS, KEY_LINEAR_TICKSPACING, KEY_ANGLE_POS_ZERO, KEY_ANGLE_POS_ONE, KEY_ANGLE_POS_TWO }; enum { BINDING_TEXT_ORIGIN=1, BINDING_ARROW_ORIGIN, BINDING_ARROW_VECTOR, BINDING_ANGLE_ORIGIN, BINDING_ANGLE_FIRST, BINDING_ANGLE_SECOND, BINDING_ANGLE_SPHERERADIUS, BINDING_LINEAR_ORIGIN, BINDING_LINEAR_TARGET, BINDING_LINEAR_SPHERERADIUS }; const char *annotationModeStrings[] = { NTRANS("Arrow"), NTRANS("Text"), NTRANS("Arrow+Text"), NTRANS("Angle"), NTRANS("Ruler") }; AnnotateFilter::AnnotateFilter() : annotationMode(ANNOTATION_TEXT), position(Point3D(0,0,0)), target(Point3D(1,0,0)), upVec(Point3D(0,0,1)), acrossVec(Point3D(0,1,0)), textSize(1.0f), annotateSize(1.0f), sphereMarkerSize(1.5f),rgba(0,0,1), active(true),showAngleText(true), reflexAngle(true), angleFormatPreDecimal(0),angleFormatPostDecimal(0), linearFixedTicks(true),linearMeasureTicks(10),linearMeasureSpacing(10.0f), fontSizeLinearMeasure(5) { COMPILE_ASSERT(THREEDEP_ARRAYSIZE(annotationModeStrings) == ANNOTATION_MODE_END); annotationMode=ANNOTATION_TEXT; anglePos[0]=Point3D(0,0,0); anglePos[1]=Point3D(0,5,5); anglePos[2]=Point3D(0,-5,5); textSize=1; annotateSize=1; sphereMarkerSize=1.5; active=true; showAngleText=true; reflexAngle=false; fontSizeLinearMeasure=5; linearMeasureTicks=10; linearFixedTicks=true; linearMeasureSpacing=10.0f; lineSize=1.0f; angleFormatPreDecimal=angleFormatPostDecimal=0; cacheOK=false; cache=true; //By default, we should cache, but decision is made higher up } Filter *AnnotateFilter::cloneUncached() const { AnnotateFilter *p=new AnnotateFilter(); p->annotationMode=annotationMode; p->position=position; p->target=target; p->upVec=upVec; p->acrossVec=acrossVec; for(unsigned int ui=0;ui<3; ui++) p->anglePos[ui]=anglePos[ui]; p->annotateText=annotateText; p->textSize=textSize; p->annotateSize=annotateSize; p->sphereMarkerSize=sphereMarkerSize; p->rgba=rgba; p->active=active; p->showAngleText=showAngleText; p->reflexAngle=reflexAngle; p->angleFormatPreDecimal=angleFormatPreDecimal; p->angleFormatPostDecimal=angleFormatPostDecimal; p->fontSizeLinearMeasure=fontSizeLinearMeasure; p->linearFixedTicks=linearFixedTicks; p->linearMeasureSpacing=linearMeasureSpacing; p->linearMeasureTicks=linearMeasureTicks; p->lineSize=lineSize; //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->userString=userString; return p; } unsigned int AnnotateFilter::refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress) { //Clear selection devices, first deleting any we have clearDevices(); //Pipe everything through propagateStreams(dataIn,getOut); //If we are not enabled, do not draw anything into the output if(!active) return 0; DrawStreamData *d; d = new DrawStreamData; d->parent=this; //Draw text output as needed if( annotationMode == ANNOTATION_TEXT || annotationMode== ANNOTATION_TEXT_WITH_ARROW) { DrawGLText *dt; dt = new DrawGLText(getDefaultFontFile().c_str(),FTGL_POLYGON); dt->setString(annotateText); dt->setOrigin(position); dt->setUp(upVec); dt->setColour(rgba.r(),rgba.g(),rgba.b(),rgba.a()); dt->setTextDir(acrossVec); dt->setSize((unsigned int)textSize); dt->setAlignment(DRAWTEXT_ALIGN_CENTRE); dt->canSelect=true; SelectionDevice *s = new SelectionDevice(this); SelectionBinding bind[1]; bind[0].setBinding(SELECT_BUTTON_LEFT,0,DRAW_TEXT_BIND_ORIGIN, BINDING_TEXT_ORIGIN,dt->getOrigin(),dt); bind[0].setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(bind[0]); devices.push_back(s); d->drawables.push_back(dt); } //Draw annotation mode as needed if(annotationMode==ANNOTATION_ARROW || annotationMode==ANNOTATION_TEXT_WITH_ARROW) { DrawVector *dv; dv = new DrawVector; dv->setOrigin(position); dv->setVector(target-position); dv->setArrowSize(annotateSize); dv->setColour(rgba.r(),rgba.g(),rgba.b(),rgba.a()); dv->setLineSize(lineSize); dv->canSelect=true; dv->wantsLight=true; SelectionDevice *s = new SelectionDevice(this); SelectionBinding bind[2]; bind[0].setBinding(SELECT_BUTTON_LEFT,0,DRAW_VECTOR_BIND_TARGET, BINDING_ARROW_VECTOR,dv->getVector(),dv); bind[0].setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(bind[0]); bind[1].setBinding(SELECT_BUTTON_LEFT,FLAG_SHIFT,DRAW_VECTOR_BIND_ORIGIN, BINDING_ARROW_ORIGIN,dv->getOrigin(),dv); bind[1].setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(bind[1]); devices.push_back(s); d->drawables.push_back(dv); } if(annotationMode == ANNOTATION_ANGLE_MEASURE) { //Draw the three spheres that are the handles //for the angle motion for(unsigned int ui=0;ui<3;ui++) { DrawSphere *dS; SelectionDevice *s= new SelectionDevice(this); SelectionBinding bind[2]; dS=new DrawSphere; dS->setOrigin(anglePos[ui]); dS->setRadius(sphereMarkerSize); dS->setColour(rgba.r(),rgba.g(),rgba.b(),rgba.a()); dS->canSelect=true; dS->wantsLight=true; //Create binding for sphere translation. //Note that each binding is a bit different, as it //affects each sphere separately. bind[0].setBinding(SELECT_BUTTON_LEFT,0,DRAW_SPHERE_BIND_ORIGIN, BINDING_ANGLE_ORIGIN+ui,anglePos[ui],dS); bind[0].setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(bind[0]); //Create binding for sphere scaling, each binding is the same bind[1].setBinding(SELECT_BUTTON_LEFT,FLAG_SHIFT,DRAW_SPHERE_BIND_RADIUS, BINDING_ANGLE_SPHERERADIUS,dS->getRadius(),dS); bind[1].setInteractionMode(BIND_MODE_FLOAT_TRANSLATE); bind[1].setFloatLimits(0,std::numeric_limits::max()); s->addBinding(bind[1]); devices.push_back(s); d->drawables.push_back(dS); } //Now draw the two lines that form the angle DrawVector *dv; dv=new DrawVector; dv->setOrigin(anglePos[0]); dv->setVector(anglePos[1]-anglePos[0]); dv->setColour(rgba.r(),rgba.g(),rgba.b(),rgba.a()); dv->setDrawArrow(false); d->drawables.push_back(dv); dv=new DrawVector; dv->setOrigin(anglePos[0]); dv->setVector(anglePos[2]-anglePos[0]); dv->setColour(rgba.r(),rgba.g(),rgba.b(),rgba.a()); dv->setDrawArrow(false); d->drawables.push_back(dv); //If required, //show the text that //indicates the included or reflexive angle if(showAngleText) { std::string angleString; Point3D d1,d2; float angleVal=0; d1=anglePos[1]-anglePos[0]; d2=anglePos[2]-anglePos[0]; //Work out the angle if there is a non-degenerate vector. //otherwise set it to the "undefined" value of zero if(fabs(d1.dotProd(d2)) > sqrtf(std::numeric_limits::epsilon())) angleVal =d1.angle(d2); if(reflexAngle) angleVal=2.0*M_PI-angleVal; angleVal=180.0f/M_PI*angleVal; angleVal=fmod(angleVal,360.0f); //FIXME: print specifier computation is still a bit off if(angleFormatPreDecimal+angleFormatPostDecimal) { //One space for the decimal, one for the null //and the rest for the actual integer size_t num; num = angleFormatPreDecimal+angleFormatPostDecimal+1; char *buf = new char[num+1]; std::string tmp,formatStr; formatStr="%"; if(angleFormatPreDecimal) { stream_cast(tmp,angleFormatPreDecimal + angleFormatPostDecimal+2); formatStr+=std::string("0") + tmp; } if(angleFormatPostDecimal) { stream_cast(tmp,angleFormatPostDecimal); formatStr+="."; formatStr+=tmp; } formatStr+="f"; snprintf(buf,num,formatStr.c_str(),angleVal); angleString=buf; delete[] buf; } else stream_cast(angleString, angleVal); //Place the string appropriately DrawGLText *dt; dt = new DrawGLText(getDefaultFontFile().c_str(),FTGL_POLYGON); dt->setString(angleString); dt->setAlignment(DRAWTEXT_ALIGN_CENTRE); //Place the text using //a factor of the text size in //the direction of the average //of the two vector components Point3D averageVec(1,0,0); if(averageVec.sqrMag() > std::numeric_limits::epsilon()) { averageVec = (d1+d2)*0.5f; averageVec.normalise(); averageVec*=textSize*1.1; if(reflexAngle) averageVec.negate(); } dt->setOrigin(anglePos[0]+averageVec); //Use user-specifications for colour, //size and orientation dt->setUp(upVec); dt->setColour(rgba.r(),rgba.g(),rgba.b(),rgba.a()); dt->setTextDir(acrossVec); dt->setSize((unsigned int)textSize); d->drawables.push_back(dt); } } if(annotationMode == ANNOTATION_LINEAR_MEASURE) { DrawVector *dv; dv = new DrawVector; dv->setOrigin(position); dv->setColour(rgba.r(),rgba.g(),rgba.b(),rgba.a()); dv->setVector(target-position); dv->setDrawArrow(false); d->drawables.push_back(dv); //Compute the tick spacings vector tickSpacings; if(linearFixedTicks) { tickSpacingsFromFixedNum(0,sqrtf(target.sqrDist(position)), linearMeasureTicks,tickSpacings); } else { tickSpacingsFromInterspace(0,sqrtf(target.sqrDist(position)), linearMeasureSpacing,tickSpacings); } if(tickSpacings.size()) { Point3D measureNormal; measureNormal = target-position; measureNormal.normalise(); //Construct the drawable text object for(unsigned int ui=0;uisetColour(rgba.r(),rgba.g() ,rgba.b(),rgba.a()); dT->setOrigin(measureNormal*tickSpacings[ui] + position); dT->setUp(upVec); dT->setTextDir(acrossVec); dT->setSize((unsigned int)fontSizeLinearMeasure); string s; stream_cast(s,tickSpacings[ui]); dT->setString(s); d->drawables.push_back(dT); } //Now draw the end markers //Start marker DrawSphere *dS; dS = new DrawSphere; dS->setRadius(sphereMarkerSize); dS->setOrigin(position); dS->setColour(rgba.r(),rgba.g(),rgba.b(),rgba.a()); dS->canSelect=true; dS->wantsLight=true; SelectionDevice *s= new SelectionDevice(this); SelectionBinding bind[4]; //Create binding for sphere translation. //Note that each binding is a bit different, as it //affects each sphere separately. bind[0].setBinding(SELECT_BUTTON_LEFT,0,DRAW_SPHERE_BIND_ORIGIN, BINDING_LINEAR_ORIGIN,position,dS); bind[0].setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(bind[0]); //Create binding for sphere scaling, each binding is the same bind[1].setBinding(SELECT_BUTTON_LEFT,FLAG_SHIFT,DRAW_SPHERE_BIND_RADIUS, BINDING_LINEAR_SPHERERADIUS,dS->getRadius(),dS); bind[1].setInteractionMode(BIND_MODE_FLOAT_TRANSLATE); bind[1].setFloatLimits(0,std::numeric_limits::max()); s->addBinding(bind[1]); devices.push_back(s); d->drawables.push_back(dS); //Now do the second sphere (end marker) s= new SelectionDevice(this); dS = new DrawSphere; dS->setRadius(sphereMarkerSize); dS->setOrigin(target); dS->setColour(rgba.r(),rgba.g(),rgba.b(),rgba.a()); dS->canSelect=true; dS->wantsLight=true; bind[2].setBinding(SELECT_BUTTON_LEFT,0,DRAW_SPHERE_BIND_ORIGIN, BINDING_LINEAR_TARGET,target,dS); bind[2].setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(bind[2]); //Create binding for sphere scaling, each binding is the same bind[3].setBinding(SELECT_BUTTON_LEFT,FLAG_SHIFT,DRAW_SPHERE_BIND_RADIUS, BINDING_LINEAR_SPHERERADIUS,dS->getRadius(),dS); bind[3].setInteractionMode(BIND_MODE_FLOAT_TRANSLATE); bind[3].setFloatLimits(0,std::numeric_limits::max()); s->addBinding(bind[3]); devices.push_back(s); d->drawables.push_back(dS); } } d->cached=0; getOut.push_back(d); return 0; } size_t AnnotateFilter::numBytesForCache(size_t nObjects) const { return 0; } void AnnotateFilter::getProperties(FilterPropGroup &propertyList) const { string tmpStr; FilterProperty p; size_t curGroup=0; tmpStr=boolStrEnc(active); p.name=TRANS("Enable"); p.data=tmpStr; p.key=KEY_ENABLE; p.helpText=TRANS("Enable/disable annotation"); p.type=PROPERTY_TYPE_BOOL; propertyList.addProperty(p,curGroup); if(!active) return; vector > choices; for(unsigned int ui=0;ui::epsilon()) return false; acrossVec=normVec.crossProd(newPt); ASSERT(acrossVec.sqrMag() > std::numeric_limits::epsilon()); if(!(upVec == newPt)) { upVec=newPt; needUpdate=true; } break; } case KEY_ACROSSVEC: { //This sets the up direction //which must be normal to the //across direction for the text. // //Compute the normal component of acrossVec. //and override that. // //Be careful not to "invert" the text, so it //does not show. Point3D newPt; if(!newPt.parse(value)) return false; newPt.normalise(); //Use double-cross-product method //to orthogonalise the two vectors Point3D normVec; normVec=newPt.crossProd(upVec); if(normVec.sqrMag() < std::numeric_limits::epsilon()) return false; upVec=normVec.crossProd(newPt); ASSERT(upVec.sqrMag() > std::numeric_limits::epsilon()); if(!(acrossVec == newPt)) { acrossVec=newPt; needUpdate=true; } break; } case KEY_POSITION: { if(!applyPropertyNow(position,value,needUpdate)) return false; break; } case KEY_TARGET: { if(!applyPropertyNow(target,value,needUpdate)) return false; break; } case KEY_ANGLE_POS_ZERO: { if(!applyPropertyNow(anglePos[0],value,needUpdate)) return false; break; } case KEY_ANGLE_POS_ONE: { if(!applyPropertyNow(anglePos[1],value,needUpdate)) return false; break; } case KEY_ANGLE_POS_TWO: { if(!applyPropertyNow(anglePos[2],value,needUpdate)) return false; break; } case KEY_ARROW_SIZE: { if(!applyPropertyNow(annotateSize,value,needUpdate)) return false; break; } case KEY_ANNOTATE_TEXT: { if(!applyPropertyNow(annotateText,value,needUpdate)) return false; break; } case KEY_COLOUR: { ColourRGBA tmpRgba; tmpRgba.parse(value); if(tmpRgba != rgba) { rgba = tmpRgba.toRGBAf(); needUpdate=true; } else needUpdate=false; break; } case KEY_TEXTSIZE: { float tmp; stream_cast(tmp,value); if(fabs(tmp-textSize) > std::numeric_limits::epsilon() && tmp > sqrtf(std::numeric_limits::epsilon())) { needUpdate=true; textSize=tmp; } break; } case KEY_REFLEXIVE: { if(!applyPropertyNow(reflexAngle,value,needUpdate)) return false; break; } case KEY_SPHERE_ANGLE_SIZE: { if(!applyPropertyNow(sphereMarkerSize,value,needUpdate)) return false; break; } case KEY_ANGLE_TEXT_VISIBLE: { if(!applyPropertyNow(showAngleText,value,needUpdate)) return false; break; } case KEY_ANGLE_FORMAT_STRING: { //Must contain only #,[0-9] if(value.find_first_not_of("#,.0123456789")!=std::string::npos) return false; if(value.size()) { //Must contain 0 or 1 separator. size_t sepCount; sepCount=std::count(value.begin(),value.end(),','); sepCount+=std::count(value.begin(),value.end(),'.'); if(sepCount > 1) return false; //If we have a separator, //split into two parts if(sepCount) { size_t decPos; decPos=value.find_first_of(",."); angleFormatPreDecimal=decPos; angleFormatPostDecimal=value.size()-(decPos+1); } else angleFormatPreDecimal=value.size(); } else angleFormatPreDecimal=angleFormatPostDecimal=0; needUpdate=true; break; } case KEY_LINEAR_FONTSIZE: { if(!applyPropertyNow(fontSizeLinearMeasure,value,needUpdate)) return false; break; } case KEY_LINEAR_FIXED_TICKS: { if(!applyPropertyNow(linearFixedTicks,value,needUpdate)) return false; break; } case KEY_LINEAR_NUMTICKS: { if(!applyPropertyNow(linearMeasureTicks,value,needUpdate)) return false; break; } case KEY_LINEAR_TICKSPACING: { if(!applyPropertyNow(linearMeasureSpacing,value,needUpdate)) return false; break; } case KEY_LINESIZE: { float tmp; if(stream_cast(tmp,value)) return false; if(tmp == lineSize || tmp <0) return false; lineSize=tmp; needUpdate=true; break; } default: ASSERT(false); } return true; } std::string AnnotateFilter::getSpecificErrString(unsigned int code) const { ASSERT(false); } bool AnnotateFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<" << trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; for(unsigned int ui=0;ui<3;ui++) f << tabs(depth+2) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; //DEPRECATE: rename this element. It has been repurposed. f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth) << "" << endl; break; } default: ASSERT(false); return false; } return true; } bool AnnotateFilter::readState(xmlNodePtr &nodePtr, const std::string &stateFileDir) { using std::string; string tmpStr; xmlChar *xmlString; //Retrieve user string //=== if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //=== //Annotation mode if(!XMLGetNextElemAttrib(nodePtr,annotationMode,"annotationmode","value")) return false; if(annotationMode >=ANNOTATION_MODE_END) return false; //position if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"position","value")) return false; if(!position.parse(tmpStr)) return false; if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"target","value")) return false; if(!target.parse(tmpStr)) return false; if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"upvec","value")) return false; if(!upVec.parse(tmpStr)) return false; if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"acrossvec","value")) return false; if(!acrossVec.parse(tmpStr)) return false; //Ensure acrossVec/upvec orthogonal if(!upVec.orthogonalise(acrossVec)) return false; xmlNodePtr tmpPtr; tmpPtr=nodePtr; if(XMLHelpFwdToElem(nodePtr,"anglepos")) return false; if(!nodePtr->xmlChildrenNode) return false; nodePtr=nodePtr->xmlChildrenNode; for(unsigned int ui=0;ui<3;ui++) { if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"position","value")) return false; if(!anglePos[ui].parse(tmpStr)) return false; } nodePtr=tmpPtr; //If it fails, thats OK, just use the empty string. if(!XMLGetNextElemAttrib(nodePtr,annotateText,"annotatetext","value")) annotateText=""; if(!XMLGetNextElemAttrib(nodePtr,textSize,"textsize","value")) return false; if(!XMLGetNextElemAttrib(nodePtr,annotateSize,"annotatesize","value")) return false; if(annotateSize <0.0f) return false; if(!XMLGetNextElemAttrib(nodePtr,sphereMarkerSize,"sphereanglesize","value")) return false; if(sphereMarkerSize<0.0f) return false; if(!XMLGetNextElemAttrib(nodePtr,lineSize,"linesize","value")) return false; if(lineSize<0.0f) return false; //TODO: we have a standardised parsexmlColour func, use it if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"colour","value")) return false; ColourRGBA tmpRgba; if(!tmpRgba.parse(tmpStr)) return false; rgba=tmpRgba.toRGBAf(); if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"active","value")) return false; if(!boolStrDec(tmpStr,active)) return false; if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"showangletext","value")) return false; if(!boolStrDec(tmpStr,showAngleText)) return false; if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"reflexangle","value")) return false; if(!boolStrDec(tmpStr,reflexAngle)) return false; if(!XMLGetNextElemAttrib(nodePtr,angleFormatPreDecimal,"angleformat","predecimal")) return false; if(!XMLGetAttrib(nodePtr,angleFormatPostDecimal,"predecimal")) return false; return true; } unsigned int AnnotateFilter::getRefreshBlockMask() const { return 0; } unsigned int AnnotateFilter::getRefreshEmitMask() const { return STREAM_TYPE_DRAW; } unsigned int AnnotateFilter::getRefreshUseMask() const { //annotate only adds to the ignore mask, so // we now essentially ignore all inputs, other than pass-through return 0; } void AnnotateFilter::setPropFromBinding(const SelectionBinding &b) { switch(b.getID()) { case BINDING_ARROW_ORIGIN: { Point3D dv; dv=target-position; b.getValue(position); target=position+dv; break; } case BINDING_LINEAR_ORIGIN: case BINDING_TEXT_ORIGIN: { b.getValue(position); break; } case BINDING_LINEAR_TARGET: case BINDING_ARROW_VECTOR: { b.getValue(target); break; } case BINDING_ANGLE_ORIGIN: b.getValue(anglePos[0]); break; case BINDING_ANGLE_FIRST: b.getValue(anglePos[1]); break; case BINDING_ANGLE_SECOND: b.getValue(anglePos[2]); break; case BINDING_ANGLE_SPHERERADIUS: b.getValue(sphereMarkerSize); break; default: ASSERT(false); } } #ifdef DEBUG //Test the ruler functionality bool rulerTest(); //Test the angle measurement tool bool angleTest(); //Test the pointing arrow annotation bool arrowTest(); //Test the text+arrow functionality bool textArrowTest(); bool AnnotateFilter::runUnitTests() { if(!rulerTest()) return false; if(!angleTest()) return false; if(!arrowTest()) return false; if(!textArrowTest()) return false; return true; } bool rulerTest() { vector streamIn,streamOut; AnnotateFilter*f=new AnnotateFilter; f->setCaching(false); bool needUp; std::string s; //Set linear ruler mode TEST(f->setProperty(KEY_MODE,TRANS(annotationModeStrings[ANNOTATION_LINEAR_MEASURE]),needUp),"Set prop"); //Set ruler position & length stream_cast(s,Point3D(0,0,0)); TEST(f->setProperty(KEY_POSITION,s,needUp),"Set prop"); stream_cast(s,Point3D(1,1,1)); TEST(f->setProperty(KEY_TARGET,s,needUp),"Set prop"); stream_cast(s,sqrtf(2)/10); TEST(f->setProperty(KEY_LINEAR_TICKSPACING,s,needUp),"Set prop"); ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"Refresh error code"); delete f; TEST(streamOut.size(),"stream size"); //Count the number of text object types size_t textCount,vecCount,otherDrawCount; textCount=vecCount=otherDrawCount=0; for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_DRAW: { const DrawStreamData* d; d= (const DrawStreamData*)streamOut[ui]; for(unsigned int ui=0;uidrawables.size();ui++) { switch(d->drawables[ui]->getType()) { case DRAW_TYPE_GLTEXT: textCount++; break; case DRAW_TYPE_VECTOR: vecCount++; break; default: otherDrawCount++; break; } } break; } default: ; } } //We should have a line, one would hope TEST(vecCount>0,"Number of lines in ruler test"); //Floating pt errors, and not setting the zero could alter this //so it should be close to, but not exactly 10 TEST(textCount == 10 || textCount == 9 || textCount == 11, "Number of lines in ruler test"); for(unsigned int ui=0;ui streamIn,streamOut; AnnotateFilter*f=new AnnotateFilter; f->setCaching(false); bool needUp; std::string s; //Set arrow annotation mode TEST(f->setProperty(KEY_MODE, TRANS(annotationModeStrings[ANNOTATION_ANGLE_MEASURE]),needUp),"set property"); //Set position & target for arrow const Point3D ANGLE_ORIGIN(0,0,0); const Point3D ANGLE_A(0,0,1); const Point3D ANGLE_B(0,1,0); stream_cast(s,ANGLE_ORIGIN); TEST(f->setProperty(KEY_ANGLE_POS_ONE,s,needUp),"Set prop"); stream_cast(s,ANGLE_A); TEST(f->setProperty(KEY_ANGLE_POS_ZERO,s,needUp),"Set prop"); stream_cast(s,ANGLE_B); TEST(f->setProperty(KEY_ANGLE_POS_TWO,s,needUp),"Set prop"); ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"Refresh error code"); delete f; TEST(streamOut.size(),"stream size"); //Count the number of text object types size_t vecCount,otherDrawCount,textDrawCount,sphereDrawCount; vecCount=otherDrawCount=textDrawCount=sphereDrawCount=0; for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_DRAW: { const DrawStreamData* d; d= (const DrawStreamData*)streamOut[ui]; for(unsigned int ui=0;uidrawables.size();ui++) { switch(d->drawables[ui]->getType()) { case DRAW_TYPE_VECTOR: vecCount++; break; case DRAW_TYPE_GLTEXT: textDrawCount++; break; case DRAW_TYPE_SPHERE: sphereDrawCount++; break; default: otherDrawCount++; break; } } break; } default: ; } } TEST(textDrawCount,"angle text drawable"); TEST(vecCount,"angle arms drawable"); TEST(sphereDrawCount,"sphere marker drawable"); TEST(!otherDrawCount,"unexpected drawable in angle measure"); for(unsigned int ui=0;ui streamIn,streamOut; AnnotateFilter*f=new AnnotateFilter; f->setCaching(false); bool needUp; std::string s; //Set arrow annotation mode TEST(f->setProperty(KEY_MODE, TRANS(annotationModeStrings[ANNOTATION_ARROW]),needUp),"Set arrow mode Property"); //Set position & target for arrow const Point3D ARROW_ORIGIN(-1,-1,-1); const Point3D ARROW_TARGET(1,1,1); stream_cast(s,ARROW_ORIGIN); TEST(f->setProperty(KEY_POSITION,s,needUp),"Set position prop"); stream_cast(s,ARROW_TARGET); TEST(f->setProperty(KEY_TARGET,s,needUp),"Set target prop"); ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"refresh error code"); delete f; TEST(streamOut.size(),"stream size"); //Count the number of text object types size_t vecCount,otherDrawCount; vecCount=otherDrawCount=0; for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_DRAW: { const DrawStreamData* d; d= (const DrawStreamData*)streamOut[ui]; for(unsigned int ui=0;uidrawables.size();ui++) { switch(d->drawables[ui]->getType()) { case DRAW_TYPE_VECTOR: { vecCount++; const DrawVector *dv; dv= (const DrawVector*)d->drawables[ui]; bool testV; testV=(dv->getOrigin() == ARROW_ORIGIN); TEST(testV,"Origin test"); break; } default: otherDrawCount++; break; } } break; } default: ; } } //We should have a line, one would hope TEST(vecCount==1,"Number of lines"); TEST(otherDrawCount==0,"Draw count"); for(unsigned int ui=0;ui streamIn,streamOut; AnnotateFilter*f=new AnnotateFilter; f->setCaching(false); bool needUp; std::string s; //Set linear ruler mode TEST(f->setProperty(KEY_MODE, TRANS(annotationModeStrings[ANNOTATION_TEXT_WITH_ARROW]),needUp),"Set Property"); //Set ruler position & length const Point3D ARROW_ORIGIN(-1,-1,-1); const Point3D ARROW_TARGET(1,1,1); stream_cast(s,ARROW_ORIGIN); TEST(f->setProperty(KEY_POSITION,s,needUp),"Set prop"); stream_cast(s,ARROW_TARGET); TEST(f->setProperty(KEY_TARGET,s,needUp),"Set prop"); ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"Refresh error code"); delete f; TEST(streamOut.size(),"stream size"); //Count the number of text object types size_t vecCount,textCount,otherDrawCount; vecCount=textCount=otherDrawCount=0; for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_DRAW: { const DrawStreamData* d; d= (const DrawStreamData*)streamOut[ui]; for(unsigned int ui=0;uidrawables.size();ui++) { switch(d->drawables[ui]->getType()) { case DRAW_TYPE_VECTOR: { vecCount++; const DrawVector *dv; dv= (const DrawVector*)d->drawables[ui]; bool testV; testV=(dv->getOrigin() == ARROW_ORIGIN); TEST(testV,"Origin test"); break; } case DRAW_TYPE_GLTEXT: textCount++; break; default: otherDrawCount++; break; } } break; } default: ; } } //We should have a line, one would hope TEST(vecCount==1,"Number of lines"); TEST(textCount==1,"Number of text objects"); TEST(otherDrawCount==0,"No other draw items"); for(unsigned int ui=0;ui. */ #include "ionClip.h" #include "geometryHelpers.h" #include "filterCommon.h" #include using std::vector; using std::string; using std::pair; using std::make_pair; using std::map; //!Error codes enum { CALLBACK_FAIL=1, BAD_ALLOC, IONCLIP_ERR_ENUM_END }; //!Possible primitive types for ion clipping enum { PRIMITIVE_SPHERE, PRIMITIVE_PLANE, PRIMITIVE_CYLINDER, PRIMITIVE_AAB, //Axis aligned box PRIMITIVE_END //Not actually a primitive, just end of enum }; enum { KEY_ORIGIN=1, KEY_PRIMITIVE_TYPE, KEY_RADIUS, KEY_PRIMITIVE_SHOW, KEY_PRIMITIVE_INVERTCLIP, KEY_NORMAL, KEY_CORNER, KEY_AXIS_LOCKMAG, }; const char *PRIMITIVE_NAMES[] = { NTRANS("Sphere"), NTRANS("Plane"), NTRANS("Cylinder"), NTRANS("Aligned box") }; unsigned int primitiveID(const std::string &str) { for(unsigned int ui=0;uiprimitiveType=primitiveType; p->invertedClip=invertedClip; p->showPrimitive=showPrimitive; p->vectorParams.resize(vectorParams.size()); p->scalarParams.resize(scalarParams.size()); std::copy(vectorParams.begin(),vectorParams.end(),p->vectorParams.begin()); std::copy(scalarParams.begin(),scalarParams.end(),p->scalarParams.begin()); p->lockAxisMag = lockAxisMag; //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->userString=userString; return p; } //!Get approx number of bytes for caching output size_t IonClipFilter::numBytesForCache(size_t nObjects) const { //Without full processing, we cannot tell, so provide upper estimate. return nObjects*IONDATA_SIZE; } //!update filter unsigned int IonClipFilter::refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress) { ASSERT(vectorParams.size() || scalarParams.size()); //Clear selection devices, first deleting any we have clearDevices(); if(showPrimitive) { //TODO: This is a near-copy of compositionProfile.cpp - refactor //construct a new primitive, do not cache DrawStreamData *drawData=new DrawStreamData; drawData->parent =this; switch(primitiveType) { case PRIMITIVE_SPHERE: { //Add drawable components DrawSphere *dS = new DrawSphere; dS->setOrigin(vectorParams[0]); dS->setRadius(scalarParams[0]); //FIXME: Alpha blending is all screwed up. May require more //advanced drawing in scene. (front-back drawing). //I have set alpha=1 for now. dS->setColour(0.5,0.5,0.5,1.0); dS->setLatSegments(40); dS->setLongSegments(40); dS->wantsLight=true; drawData->drawables.push_back(dS); //Set up selection "device" for user interaction //Note the order of s->addBinding is critical, //as bindings are selected by first match. //==== //The object is selectable dS->canSelect=true; SelectionDevice *s = new SelectionDevice(this); SelectionBinding b[3]; //Apple doesn't have right click, so we need //to hook up an additional system for them. //Don't use ifdefs, as this would be useful for //normal laptops and the like. b[0].setBinding(SELECT_BUTTON_LEFT,FLAG_CMD,DRAW_SPHERE_BIND_ORIGIN, BINDING_SPHERE_ORIGIN,dS->getOrigin(),dS); b[0].setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b[0]); //Bind the drawable object to the properties we wish //to be able to modify b[1].setBinding(SELECT_BUTTON_LEFT,0,DRAW_SPHERE_BIND_RADIUS, BINDING_SPHERE_RADIUS,dS->getRadius(),dS); b[1].setInteractionMode(BIND_MODE_FLOAT_TRANSLATE); b[1].setFloatLimits(0,std::numeric_limits::max()); s->addBinding(b[1]); b[2].setBinding(SELECT_BUTTON_RIGHT,0,DRAW_SPHERE_BIND_ORIGIN, BINDING_SPHERE_ORIGIN,dS->getOrigin(),dS); b[2].setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b[2]); devices.push_back(s); //===== break; } case PRIMITIVE_PLANE: { const float drawScale=10.0f; //Origin + normal ASSERT(vectorParams.size() == 2); //Add drawable components DrawSphere *dS = new DrawSphere; dS->setOrigin(vectorParams[0]); dS->setRadius(drawScale/10); dS->setColour(0.5,0.5,0.5,1.0); dS->setLatSegments(40); dS->setLongSegments(40); dS->wantsLight=true; drawData->drawables.push_back(dS); DrawVector *dV = new DrawVector; dV->setOrigin(vectorParams[0]); dV->setVector(vectorParams[1]*drawScale); dV->wantsLight=true; drawData->drawables.push_back(dV); //Set up selection "device" for user interaction //==== //The object is selectable dS->canSelect=true; dV->canSelect=true; SelectionDevice *s = new SelectionDevice(this); SelectionBinding b[2]; //Bind the drawable object to the properties we wish //to be able to modify //Bind orientation to vector left click b[0].setBinding(SELECT_BUTTON_LEFT,0,DRAW_VECTOR_BIND_ORIENTATION, BINDING_PLANE_DIRECTION, dV->getVector(),dV); b[0].setInteractionMode(BIND_MODE_POINT3D_ROTATE); b[0].setFloatLimits(0,std::numeric_limits::max()); s->addBinding(b[0]); //Bind translation to sphere left click b[1].setBinding(SELECT_BUTTON_LEFT,0,DRAW_SPHERE_BIND_ORIGIN, BINDING_PLANE_ORIGIN,dS->getOrigin(),dS); b[1].setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b[1]); devices.push_back(s); //===== break; } case PRIMITIVE_CYLINDER: { //Origin + normal ASSERT(vectorParams.size() == 2); //Add drawable components DrawCylinder *dC = new DrawCylinder; dC->setOrigin(vectorParams[0]); dC->setRadius(scalarParams[0]); dC->setColour(0.5,0.5,0.5,1.0); dC->setSlices(40); dC->setLength(sqrtf(vectorParams[1].sqrMag())); dC->setDirection(vectorParams[1]); dC->wantsLight=true; drawData->drawables.push_back(dC); //Set up selection "device" for user interaction //==== //The object is selectable dC->canSelect=true; //Start and end radii must be the same (not a //tapered cylinder) dC->lockRadii(); SelectionDevice *s = new SelectionDevice(this); SelectionBinding b; //Bind the drawable object to the properties we wish //to be able to modify //Bind left + command button to move b.setBinding(SELECT_BUTTON_LEFT,FLAG_CMD,DRAW_CYLINDER_BIND_ORIGIN, BINDING_CYLINDER_ORIGIN,dC->getOrigin(),dC); b.setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b); //Bind left + shift to change orientation b.setBinding(SELECT_BUTTON_LEFT,FLAG_SHIFT,DRAW_CYLINDER_BIND_DIRECTION, BINDING_CYLINDER_DIRECTION,dC->getDirection(),dC); if(lockAxisMag) b.setInteractionMode(BIND_MODE_POINT3D_ROTATE_LOCK); else b.setInteractionMode(BIND_MODE_POINT3D_ROTATE); s->addBinding(b); //Bind right button to changing position b.setBinding(SELECT_BUTTON_RIGHT,0,DRAW_CYLINDER_BIND_ORIGIN, BINDING_CYLINDER_ORIGIN,dC->getOrigin(),dC); b.setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b); //Bind middle button to changing orientation b.setBinding(SELECT_BUTTON_MIDDLE,0,DRAW_CYLINDER_BIND_DIRECTION, BINDING_CYLINDER_DIRECTION,dC->getDirection(),dC); if(lockAxisMag) b.setInteractionMode(BIND_MODE_POINT3D_ROTATE_LOCK); else b.setInteractionMode(BIND_MODE_POINT3D_ROTATE); s->addBinding(b); //Bind left button to changing radius b.setBinding(SELECT_BUTTON_LEFT,0,DRAW_CYLINDER_BIND_RADIUS, BINDING_CYLINDER_RADIUS,dC->getRadius(),dC); b.setInteractionMode(BIND_MODE_FLOAT_TRANSLATE); b.setFloatLimits(0,std::numeric_limits::max()); s->addBinding(b); devices.push_back(s); //===== break; } case PRIMITIVE_AAB: { //Centre + corner ASSERT(vectorParams.size() == 2); ASSERT(scalarParams.size() == 0); //Add drawable components DrawRectPrism *dR = new DrawRectPrism; dR->setAxisAligned(vectorParams[0]-vectorParams[1], vectorParams[0] + vectorParams[1]); dR->setColour(0.5,0.5,0.5,1.0); dR->setDrawMode(DRAW_FLAT); dR->wantsLight=true; drawData->drawables.push_back(dR); //Set up selection "device" for user interaction //==== //The object is selectable dR->canSelect=true; SelectionDevice *s = new SelectionDevice(this); SelectionBinding b[2]; //Bind the drawable object to the properties we wish //to be able to modify //Bind orientation to sphere left click b[0].setBinding(SELECT_BUTTON_LEFT,0,DRAW_RECT_BIND_TRANSLATE, BINDING_RECT_TRANSLATE, vectorParams[0],dR); b[0].setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b[0]); b[1].setBinding(SELECT_BUTTON_RIGHT,0,DRAW_RECT_BIND_CORNER_MOVE, BINDING_RECT_CORNER_MOVE, vectorParams[1],dR); b[1].setInteractionMode(BIND_MODE_POINT3D_SCALE); s->addBinding(b[1]); devices.push_back(s); //===== break; } default: ASSERT(false); } drawData->cached=0; getOut.push_back(drawData); } //use the cached copy of the data if we have it. if(cacheOK) { for(unsigned int ui=0;uigetStreamType() != STREAM_TYPE_IONS) getOut.push_back(dataIn[ui]); } progress.filterProgress=100; return 0; } IonStreamData *d=0; try { std::map,size_t> primitiveTypeMap; using std::make_pair; //map the primitive enum type, and the clip inversion state // to the CropHelper clip mode primitiveTypeMap[make_pair((size_t)PRIMITIVE_SPHERE,false)]=CROP_SPHERE_INSIDE; primitiveTypeMap[make_pair((size_t)PRIMITIVE_SPHERE,true)]=CROP_SPHERE_OUTSIDE; primitiveTypeMap[make_pair((size_t)PRIMITIVE_PLANE,false)]=CROP_PLANE_FRONT; primitiveTypeMap[make_pair((size_t)PRIMITIVE_PLANE,true)]=CROP_PLANE_BACK; primitiveTypeMap[make_pair((size_t)PRIMITIVE_CYLINDER,false)]=CROP_CYLINDER_INSIDE_AXIAL; primitiveTypeMap[make_pair((size_t)PRIMITIVE_CYLINDER,true)]=CROP_CYLINDER_OUTSIDE; primitiveTypeMap[make_pair((size_t)PRIMITIVE_AAB,false)]=CROP_AAB_INSIDE; primitiveTypeMap[make_pair((size_t)PRIMITIVE_AAB,true)]=CROP_AAB_OUTSIDE; size_t mode; mode = primitiveTypeMap[make_pair(primitiveType,invertedClip)]; size_t totalSize=numElements(dataIn); CropHelper cropper(totalSize,mode,vectorParams,scalarParams ); float minProg,maxProg; size_t cumulativeSize=0; for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { d=new IonStreamData; d->parent=this; minProg=cumulativeSize/(float)totalSize; cumulativeSize+=d->data.size(); maxProg=cumulativeSize/(float)totalSize; //Filter input data to output data. if(cropper.runFilter(((const IonStreamData *)dataIn[ui])->data, d->data,minProg,maxProg,progress.filterProgress)) { delete d; return CALLBACK_FAIL; } if(d->data.size()) { //Copy over other attributes d->r = ((IonStreamData *)dataIn[ui])->r; d->g = ((IonStreamData *)dataIn[ui])->g; d->b =((IonStreamData *)dataIn[ui])->b; d->a =((IonStreamData *)dataIn[ui])->a; d->ionSize =((IonStreamData *)dataIn[ui])->ionSize; //getOut is const, so shouldn't be modified cacheAsNeeded(d); getOut.push_back(d); d=0; } else delete d; break; } default: //Just copy across the ptr, if we are unfamiliar with this type getOut.push_back(dataIn[ui]); break; } } } catch(std::bad_alloc) { if(d) delete d; return BAD_ALLOC; } progress.filterProgress=100; return 0; } //!Get the properties of the filter, in key-value form. First vector is for each output. void IonClipFilter::getProperties(FilterPropGroup &propertyList) const { ASSERT(vectorParams.size() || scalarParams.size()); FilterProperty p; size_t curGroup=0; //Let the user know what the valid values for Primitive type string tmpStr; vector > choices; choices.push_back(make_pair((unsigned int)PRIMITIVE_SPHERE , primitiveStringFromID(PRIMITIVE_SPHERE))); choices.push_back(make_pair((unsigned int)PRIMITIVE_PLANE , primitiveStringFromID(PRIMITIVE_PLANE))); choices.push_back(make_pair((unsigned int)PRIMITIVE_CYLINDER , primitiveStringFromID(PRIMITIVE_CYLINDER))); choices.push_back(make_pair((unsigned int)PRIMITIVE_AAB, primitiveStringFromID(PRIMITIVE_AAB))); tmpStr= choiceString(choices,primitiveType); p.name=TRANS("Primitive"); p.data=tmpStr; p.type=PROPERTY_TYPE_CHOICE; p.helpText=TRANS("Shape of clipping object"); p.key=KEY_PRIMITIVE_TYPE; propertyList.addProperty(p,curGroup); stream_cast(tmpStr,showPrimitive); p.key=KEY_PRIMITIVE_SHOW; p.name=TRANS("Show Primitive"); p.data= tmpStr; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Display the 3D interaction object"); propertyList.addProperty(p,curGroup); stream_cast(tmpStr,invertedClip); p.key=KEY_PRIMITIVE_INVERTCLIP; p.name=TRANS("Invert Clip"); p.data= tmpStr; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Switch between retaining points inside (false) and outside (true) of primitive"); propertyList.addProperty(p,curGroup); switch(primitiveType) { case PRIMITIVE_SPHERE: { ASSERT(vectorParams.size() == 1); ASSERT(scalarParams.size() == 1); stream_cast(tmpStr,vectorParams[0]); p.key=KEY_ORIGIN; p.name=TRANS("Origin"); p.data= tmpStr; p.type=PROPERTY_TYPE_POINT3D; p.helpText=TRANS("Position for centre of sphere"); propertyList.addProperty(p,curGroup); stream_cast(tmpStr,scalarParams[0]); p.key=KEY_RADIUS; p.name=TRANS("Radius"); p.data=tmpStr; p.type=PROPERTY_TYPE_REAL; p.helpText=TRANS("Radius of sphere"); propertyList.addProperty(p,curGroup); break; } case PRIMITIVE_PLANE: { ASSERT(vectorParams.size() == 2); ASSERT(scalarParams.size() == 0); stream_cast(tmpStr,vectorParams[0]); p.key=KEY_ORIGIN; p.name=TRANS("Origin"); p.data=tmpStr; p.type=PROPERTY_TYPE_POINT3D; p.helpText=TRANS("Position that plane passes through"); propertyList.addProperty(p,curGroup); stream_cast(tmpStr,vectorParams[1]); p.key=KEY_NORMAL; p.name=TRANS("Plane Normal"); p.data= tmpStr; p.type=PROPERTY_TYPE_POINT3D; p.helpText=TRANS("Perpendicular direction for plane"); propertyList.addProperty(p,curGroup); break; } case PRIMITIVE_CYLINDER: { ASSERT(vectorParams.size() == 2); ASSERT(scalarParams.size() == 1); stream_cast(tmpStr,vectorParams[0]); p.key=KEY_ORIGIN; p.name=TRANS("Origin"); p.data= tmpStr; p.type=PROPERTY_TYPE_POINT3D; p.helpText=TRANS("Centre of cylinder"); propertyList.addProperty(p,curGroup); stream_cast(tmpStr,vectorParams[1]); p.key=KEY_NORMAL; p.name=TRANS("Axis"); p.data= tmpStr; p.type=PROPERTY_TYPE_POINT3D; p.helpText=TRANS("Positive vector for cylinder"); propertyList.addProperty(p,curGroup); tmpStr=boolStrEnc(lockAxisMag); p.key=KEY_AXIS_LOCKMAG; p.name=TRANS("Lock Axis Mag."); p.data=tmpStr; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Prevent changing length of cylinder during 3D interaction"); propertyList.addProperty(p,curGroup); stream_cast(tmpStr,scalarParams[0]); p.key=KEY_RADIUS; p.name=TRANS("Radius"); p.data=tmpStr; p.type=PROPERTY_TYPE_POINT3D; p.helpText=TRANS("Radius of cylinder"); propertyList.addProperty(p,curGroup); break; } case PRIMITIVE_AAB: { ASSERT(vectorParams.size() == 2); ASSERT(scalarParams.size() == 0); stream_cast(tmpStr,vectorParams[0]); p.key=KEY_ORIGIN; p.name=TRANS("Origin"); p.data= tmpStr; p.type=PROPERTY_TYPE_POINT3D; p.helpText=TRANS("Centre of axis aligned box"); propertyList.addProperty(p,curGroup); stream_cast(tmpStr,vectorParams[1]); p.key=KEY_CORNER; p.name=TRANS("Corner offset"); p.data=tmpStr; p.type=PROPERTY_TYPE_POINT3D; p.helpText=TRANS("Vector to corner of box"); propertyList.addProperty(p,curGroup); break; } default: ASSERT(false); } propertyList.setGroupTitle(curGroup,TRANS("Clipping")); } //!Set the properties for the nth filter. Returns true if prop set OK bool IonClipFilter::setProperty(unsigned int key, const std::string &value, bool &needUpdate) { needUpdate=false; switch(key) { case KEY_PRIMITIVE_TYPE: { unsigned int newPrimitive; newPrimitive=primitiveID(value); if(newPrimitive == (unsigned int)-1) return false; primitiveType=newPrimitive; switch(primitiveType) { //If we are switching between essentially //similar data types, don't reset the data. //Otherwise, wipe it and try again case PRIMITIVE_SPHERE: if(vectorParams.size() !=1) { vectorParams.clear(); vectorParams.push_back(Point3D(0,0,0)); } if(scalarParams.size()!=1) { scalarParams.clear(); scalarParams.push_back(10.0f); } break; case PRIMITIVE_PLANE: if(vectorParams.size() >2) { vectorParams.clear(); vectorParams.push_back(Point3D(0,0,0)); vectorParams.push_back(Point3D(0,1,0)); } else if (vectorParams.size() ==2) { vectorParams[1].normalise(); } else if(vectorParams.size() ==1) { vectorParams.push_back(Point3D(0,1,0)); } scalarParams.clear(); break; case PRIMITIVE_CYLINDER: if(vectorParams.size()>2) { vectorParams.resize(2); } else if(vectorParams.size() ==1) { vectorParams.push_back(Point3D(0,1,0)); } else if(!vectorParams.size()) { vectorParams.push_back(Point3D(0,0,0)); vectorParams.push_back(Point3D(0,1,0)); } if(scalarParams.size()!=1) { scalarParams.clear(); scalarParams.push_back(10.0f); } break; case PRIMITIVE_AAB: if(vectorParams.size() >2) { vectorParams.clear(); vectorParams.push_back(Point3D(0,0,0)); vectorParams.push_back(Point3D(1,1,1)); } else if(vectorParams.size() ==1) { vectorParams.push_back(Point3D(1,1,1)); } //check to see if any components of the //corner offset are zero; we disallow a //zero, 1 or 2 dimensional box for(unsigned int ui=0;ui<3;ui++) { vectorParams[1][ui]=fabs(vectorParams[1][ui]); if(vectorParams[1][ui] ::epsilon()) vectorParams[1][ui] = 1; } scalarParams.clear(); break; default: ASSERT(false); } clearCache(); needUpdate=true; return true; } case KEY_ORIGIN: { if(!applyPropertyNow(vectorParams[0],value,needUpdate)) return false; break; } case KEY_CORNER: { if(!applyPropertyNow(vectorParams[1],value,needUpdate)) return false; break; } case KEY_RADIUS: { if(!applyPropertyNow(scalarParams[0],value,needUpdate)) return false; break; } case KEY_NORMAL: { ASSERT(vectorParams.size() >=2); Point3D newPt; if(!newPt.parse(value)) return false; if(primitiveType == PRIMITIVE_CYLINDER) { if(lockAxisMag && newPt.sqrMag() > sqrtf(std::numeric_limits::epsilon())) { newPt.normalise(); newPt*=sqrtf(vectorParams[1].sqrMag()); } } if(!(vectorParams[1] == newPt )) { vectorParams[1] = newPt; needUpdate=true; clearCache(); } return true; } case KEY_PRIMITIVE_SHOW: { if(!applyPropertyNow(showPrimitive,value,needUpdate)) return false; break; } case KEY_PRIMITIVE_INVERTCLIP: { if(!applyPropertyNow(invertedClip,value,needUpdate)) return false; break; } case KEY_AXIS_LOCKMAG: { if(!applyPropertyNow(lockAxisMag,value,needUpdate)) return false; break; } default: ASSERT(false); return false; } ASSERT(vectorParams.size() || scalarParams.size()); return true; } //!Get the human readable error string associated with a particular error code during refresh(...) std::string IonClipFilter::getSpecificErrString(unsigned int code) const { const char *errCode[] = { "", "Insufficient mem. for Ionclip", "Ionclip Aborted" }; COMPILE_ASSERT(THREEDEP_ARRAYSIZE(errCode) == IONCLIP_ERR_ENUM_END); ASSERT(code < IONCLIP_ERR_ENUM_END); return errCode[code]; } bool IonClipFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<"<< trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; writeVectorsXML(f,"vectorparams",vectorParams, depth+1); writeScalarsXML(f,"scalarparams",scalarParams,depth+1); f << tabs(depth) << "" << endl; break; } default: ASSERT(false); return false; } return true; } bool IonClipFilter::readState(xmlNodePtr &nodePtr, const std::string &stateFileDir) { //Retrieve user string //=== if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlChar *xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //=== std::string tmpStr; //Retrieve primitive type //==== if(!XMLGetNextElemAttrib(nodePtr,primitiveType,"primitivetype","value")) return false; if(primitiveType >= PRIMITIVE_END) return false; //==== //Retrieve clip inversion //==== // if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"invertedclip","value")) return false; if(!boolStrDec(tmpStr,invertedClip)) return false; //==== //Retrieve primitive visibility //==== if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"showprimitive","value")) return false; if(!boolStrDec(tmpStr,showPrimitive)) return false; //==== //Retrieve axis lock mode //==== if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"lockaxismag","value")) return false; if(!boolStrDec(tmpStr,lockAxisMag)) return false; //==== //Retrieve vector parameters //=== if(XMLHelpFwdToElem(nodePtr,"vectorparams")) return false; if(!readVectorsXML(nodePtr,vectorParams)) return false; //=== //Retrieve scalar parameters //=== if(XMLHelpFwdToElem(nodePtr,"scalarparams")) return false; if(!readScalarsXML(nodePtr,scalarParams)) return false; //=== //Check the scalar params match the selected primitive switch(primitiveType) { case PRIMITIVE_SPHERE: if(vectorParams.size() != 1 || scalarParams.size() !=1) return false; break; case PRIMITIVE_PLANE: case PRIMITIVE_AAB: if(vectorParams.size() != 2 || scalarParams.size() !=0) return false; break; case PRIMITIVE_CYLINDER: if(vectorParams.size() != 2 || scalarParams.size() !=1) return false; break; default: ASSERT(false); return false; } ASSERT(vectorParams.size() || scalarParams.size()); return true; } unsigned int IonClipFilter::getRefreshBlockMask() const { return STREAM_TYPE_IONS ; } unsigned int IonClipFilter::getRefreshEmitMask() const { if(showPrimitive) return STREAM_TYPE_IONS | STREAM_TYPE_DRAW; else return STREAM_TYPE_IONS ; } unsigned int IonClipFilter::getRefreshUseMask() const { return STREAM_TYPE_IONS; } void IonClipFilter::setPropFromBinding(const SelectionBinding &b) { switch(b.getID()) { case BINDING_CYLINDER_RADIUS: case BINDING_SPHERE_RADIUS: b.getValue(scalarParams[0]); break; case BINDING_CYLINDER_ORIGIN: case BINDING_SPHERE_ORIGIN: case BINDING_PLANE_ORIGIN: case BINDING_RECT_TRANSLATE: b.getValue(vectorParams[0]); break; case BINDING_CYLINDER_DIRECTION: b.getValue(vectorParams[1]); break; case BINDING_PLANE_DIRECTION: { Point3D p; b.getValue(p); p.normalise(); vectorParams[1] =p; break; } case BINDING_RECT_CORNER_MOVE: { //Prevent the corner offset from acquiring a vector //with a negative component. Point3D p; b.getValue(p); for(unsigned int ui=0;ui<3;ui++) { p[ui]=fabs(p[ui]); //Should be positive if(p[ui] ::epsilon()) return; } vectorParams[1]=p; break; } default: ASSERT(false); } clearCache(); } #ifdef DEBUG //Create a synthetic dataset of points // returned pointer *must* be deleted by caller. //Span must have 3 elements, and for best results should be co-prime with // one another; eg all prime numbers IonStreamData *synthData(const unsigned int span[],unsigned int numPts); //Test the spherical clipping primitive bool sphereTest(); //Test the plane primitive bool planeTest(); //Test the cylinder primitive bool cylinderTest(const Point3D &pAxis, const unsigned int *span, float testRadius); //Test the axis-aligned box primitve bool rectTest(); bool IonClipFilter::runUnitTests() { if(!sphereTest()) return false; if(!planeTest()) return false; unsigned int span[]={ 5, 7, 9 }; const float TEST_RADIUS=3.0f; Point3D axis; axis=Point3D(1,2,3); if(!cylinderTest(axis,span,TEST_RADIUS)) return false; axis=Point3D(0,1,0); if(!cylinderTest(axis,span,TEST_RADIUS)) return false; if(!rectTest()) return false; return true; } bool sphereTest() { //Build some points to pass to the filter vector streamIn,streamOut; unsigned int span[]={ 5, 7, 9 }; const unsigned int NUM_PTS=10000; IonStreamData *d=synthData(span,NUM_PTS); streamIn.push_back(d); IonClipFilter *f=new IonClipFilter; f->setCaching(false); bool needUp; std::string s; TEST(f->setProperty(KEY_PRIMITIVE_TYPE, primitiveStringFromID(PRIMITIVE_SPHERE),needUp),"Set Prop"); Point3D pOrigin((float)span[0]/2,(float)span[1]/2,(float)span[2]/2); stream_cast(s,pOrigin); TEST(f->setProperty(KEY_ORIGIN,s,needUp),"Set prop"); const float TEST_RADIUS=1.2f; stream_cast(s,TEST_RADIUS); TEST(f->setProperty(KEY_RADIUS,s,needUp),"Set prop"); TEST(f->setProperty(KEY_PRIMITIVE_SHOW,"0",needUp),"Set prop"); //Do the refresh ProgressData p; f->refresh(streamIn,streamOut,p); delete f; delete d; TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); TEST(streamOut[0]->getNumBasicObjects() > 0, "clipped point count"); const IonStreamData *dOut=(IonStreamData*)streamOut[0]; for(unsigned int ui=0;uidata.size();ui++) { Point3D p; p=dOut->data[ui].getPos(); TEST(sqrtf(p.sqrDist(pOrigin)) <= TEST_RADIUS,"Sphere containment"); } delete dOut; return true; } bool planeTest() { //Build some points to pass to the filter vector streamIn,streamOut; unsigned int span[]={ 5, 7, 9 }; const unsigned int NUM_PTS=10000; IonStreamData *d=synthData(span,NUM_PTS); streamIn.push_back(d); IonClipFilter *f=new IonClipFilter; f->setCaching(false); bool needUp; std::string s; TEST(f->setProperty(KEY_PRIMITIVE_TYPE, primitiveStringFromID(PRIMITIVE_PLANE),needUp),"set prop"); Point3D pOrigin((float)span[0]/2,(float)span[1]/2,(float)span[2]/2); stream_cast(s,pOrigin); TEST(f->setProperty(KEY_ORIGIN,s,needUp),"Set prop"); Point3D pPlaneDir(1,2,3); stream_cast(s,pPlaneDir); TEST(f->setProperty(KEY_NORMAL,s,needUp),"Set prop"); TEST(f->setProperty(KEY_PRIMITIVE_SHOW,"0",needUp),"Set prop"); //Do the refresh ProgressData p; f->refresh(streamIn,streamOut,p); delete f; delete d; TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); const IonStreamData *dOut=(IonStreamData*)streamOut[0]; for(unsigned int ui=0;uidata.size();ui++) { Point3D p; p=dOut->data[ui].getPos(); p=p-pOrigin; TEST(p.dotProd(pPlaneDir) >=0, "Plane direction"); } delete dOut; return true; } bool cylinderTest(const Point3D &pAxis, const unsigned int *span, float testRadius) { //Build some points to pass to the filter vector streamIn,streamOut; const unsigned int NUM_PTS=10000; IonStreamData *d=synthData(span,NUM_PTS); streamIn.push_back(d); IonClipFilter*f=new IonClipFilter; f->setCaching(false); bool needUp; std::string s; TEST(f->setProperty(KEY_PRIMITIVE_TYPE, primitiveStringFromID(PRIMITIVE_CYLINDER),needUp),"Set prop"); Point3D pOrigin((float)span[0]/2,(float)span[1]/2,(float)span[2]/2); stream_cast(s,pOrigin); TEST(f->setProperty(KEY_ORIGIN,s,needUp),"Set prop"); stream_cast(s,pAxis); TEST(f->setProperty(KEY_NORMAL,s,needUp),"Set prop"); stream_cast(s,testRadius); TEST(f->setProperty(KEY_RADIUS,s,needUp),"Set prop"); TEST(f->setProperty(KEY_PRIMITIVE_SHOW,"0",needUp),"Set prop"); //Do the refresh ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"Refresh error code"); delete f; delete d; TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); const IonStreamData *dOut=(IonStreamData*)streamOut[0]; DrawCylinder *dC = new DrawCylinder; dC->setRadius(testRadius); dC->setOrigin(pOrigin); float len = sqrtf(pAxis.sqrMag()); Point3D axisNormal(pAxis); axisNormal.normalise(); dC->setDirection(pAxis); dC->setLength(len); BoundCube b; dC->getBoundingBox(b); delete dC; b.expand(sqrtf(std::numeric_limits::epsilon())); for(unsigned int ui=0;uidata.size();ui++) { Point3D p; p=dOut->data[ui].getPos(); //FIXME: This fails, but appears to work, depending upon the // tests I put it through??? TEST(b.containsPt(p), "Bounding box containment"); } delete dOut; return true; } bool rectTest() { //Build some points to pass to the filter vector streamIn,streamOut; unsigned int span[]={ 5, 7, 9 }; const unsigned int NUM_PTS=10000; IonStreamData *d=synthData(span,NUM_PTS); streamIn.push_back(d); IonClipFilter*f=new IonClipFilter; f->setCaching(false); bool needUp; std::string s; TEST(f->setProperty(KEY_PRIMITIVE_TYPE, primitiveStringFromID(PRIMITIVE_AAB),needUp),"set prop"); TEST(f->setProperty(KEY_PRIMITIVE_SHOW,"0",needUp),"Set prop"); TEST(f->setProperty(KEY_PRIMITIVE_INVERTCLIP,"0",needUp),"Set prop"); Point3D pOrigin(span[0],span[1],span[2]); pOrigin*=0.25f; stream_cast(s,pOrigin); TEST(f->setProperty(KEY_ORIGIN,s,needUp),"Set prop"); Point3D pCorner(span[0],span[1],span[2]); pCorner*=0.25f; stream_cast(s,pCorner); TEST(f->setProperty(KEY_CORNER,s,needUp),"Set prop"); ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"Refresh error code"); delete f; delete d; TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); const IonStreamData *dOut=(IonStreamData*)streamOut[0]; BoundCube b; b.setBounds(pOrigin-pCorner,pOrigin+pCorner); for(unsigned int ui=0;uidata.size();ui++) { Point3D p; p=dOut->data[ui].getPos(); TEST(b.containsPt(p), "Bounding box containment"); } delete dOut; return true; } IonStreamData *synthData(const unsigned int span[], unsigned int numPts) { IonStreamData *d = new IonStreamData; for(unsigned int ui=0;uidata.push_back(h); } return d; } #endif 3Depict-0.0.19/src/backend/filters/voxelise.cpp0000644000175000017500000014507512716174467020703 0ustar pcuserpcuser/* * voxelise.cpp - Compute 3D binning (voxelisation) of point clouds * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "voxelise.h" #include "common/colourmap.h" #include "filterCommon.h" #include enum { KEY_FIXEDWIDTH, KEY_NBINSX, KEY_NBINSY, KEY_NBINSZ, KEY_WIDTHBINSX, KEY_WIDTHBINSY, KEY_WIDTHBINSZ, KEY_COUNT_TYPE, KEY_NORMALISE_TYPE, KEY_SPOTSIZE, KEY_TRANSPARENCY, KEY_COLOUR, KEY_ISOLEVEL, KEY_VOXEL_REPRESENTATION_MODE, KEY_VOXEL_SLICE_COLOURAUTO, KEY_MAPEND, KEY_MAPSTART, KEY_SHOW_COLOURBAR, KEY_VOXEL_COLOURMODE, KEY_VOXEL_SLICE_AXIS, KEY_VOXEL_SLICE_OFFSET, KEY_VOXEL_SLICE_INTERP, KEY_FILTER_MODE, KEY_FILTER_RATIO, KEY_FILTER_STDEV, KEY_ENABLE_NUMERATOR, KEY_ENABLE_DENOMINATOR }; //!Normalisation method enum { VOXELISE_NORMALISETYPE_NONE,// straight count VOXELISE_NORMALISETYPE_VOLUME,// density VOXELISE_NORMALISETYPE_ALLATOMSINVOXEL, // concentration VOXELISE_NORMALISETYPE_COUNT2INVOXEL,// ratio count1/count2 VOXELISE_NORMALISETYPE_MAX // keep this at the end so it's a bookend for the last value }; //!Filtering mode enum { VOXELISE_FILTERTYPE_NONE, VOXELISE_FILTERTYPE_GAUSS, VOXELISE_FILTERTYPE_LAPLACE, VOXELISE_FILTERTYPE_MAX // keep this at the end so it's a bookend for the last value }; //Boundary behaviour for filtering enum { VOXELISE_FILTERBOUNDMODE_ZERO, VOXELISE_FILTERBOUNDMODE_BOUNCE, VOXELISE_FILTERBOUNDMODE_MAX// keep this at the end so it's a bookend for the last value }; //Error codes and corresponding strings //-- enum { VOXELISE_ABORT_ERR=1, VOXELISE_MEMORY_ERR, VOXELISE_CONVOLVE_ERR, VOXELISE_BOUNDS_INVALID_ERR, VOXELISE_ERR_ENUM_END }; //-- //!Can we keep the cached contents, when transitioning from // one representation to the other- this is only the case // when _KEEPCACHE [] is true for both representations const bool VOXEL_REPRESENT_KEEPCACHE[] = { true, true, false }; const char *NORMALISE_TYPE_STRING[] = { NTRANS("None (Raw count)"), NTRANS("Volume (Density)"), NTRANS("All Ions (conc)"), NTRANS("Ratio (Num/Denom)"), }; const char *REPRESENTATION_TYPE_STRING[] = { NTRANS("Point Cloud"), NTRANS("Isosurface"), NTRANS("Axial slice") }; const char *VOXELISE_FILTER_TYPE_STRING[]={ NTRANS("None"), NTRANS("Gaussian (blur)"), NTRANS("Lapl. of Gauss. (edges)"), }; const char *VOXELISE_SLICE_INTERP_STRING[]={ NTRANS("None"), NTRANS("Linear") }; //This is not a member of voxels.h, as the voxels do not have any concept of the IonHit int countPoints(Voxels &v, const std::vector &points, bool noWrap) { size_t x,y,z; size_t binCount[3]; v.getSize(binCount[0],binCount[1],binCount[2]); unsigned int downSample=MAX_CALLBACK; for (size_t ui=0; ui= 0.0f); //Prevent wrap-around errors if (noWrap) { if (value > v.getData(x,y,z)) v.setData(x,y,z,value); } else { v.setData(x,y,z,value); } } } } return 0; } // == Voxels filter == VoxeliseFilter::VoxeliseFilter() : fixedWidth(false), normaliseType(VOXELISE_NORMALISETYPE_NONE) { COMPILE_ASSERT(THREEDEP_ARRAYSIZE(NORMALISE_TYPE_STRING) == VOXELISE_NORMALISETYPE_MAX); COMPILE_ASSERT(THREEDEP_ARRAYSIZE(VOXELISE_FILTER_TYPE_STRING) == VOXELISE_FILTERTYPE_MAX ); COMPILE_ASSERT(THREEDEP_ARRAYSIZE(REPRESENTATION_TYPE_STRING) == VOXEL_REPRESENT_END); COMPILE_ASSERT(THREEDEP_ARRAYSIZE(VOXEL_REPRESENT_KEEPCACHE) == VOXEL_REPRESENT_END); splatSize=1.0f; rgba=ColourRGBAf(0.5,0.5,0.5,0.9f); isoLevel=0.5; filterRatio=3.0; filterMode=VOXELISE_FILTERTYPE_NONE; gaussDev=0.5; representation=VOXEL_REPRESENT_POINTCLOUD; colourMap=0; autoColourMap=true; colourMapBounds[0]=0; colourMapBounds[1]=1; //Fictitious bounds. bc.setBounds(Point3D(0,0,0),Point3D(1,1,1)); for (unsigned int i = 0; i < INDEX_LENGTH; i++) nBins[i] = 50; calculateWidthsFromNumBins(binWidth,nBins); numeratorAll = false; denominatorAll = true; sliceInterpolate=VOX_INTERP_NONE; sliceAxis=0; sliceOffset=0.5; showColourBar=false; cacheOK=false; cache=true; //By default, we should cache, but decision is made higher up rsdIncoming=0; } Filter *VoxeliseFilter::cloneUncached() const { VoxeliseFilter *p=new VoxeliseFilter(); p->splatSize=splatSize; p->rgba=rgba; p->isoLevel=isoLevel; p->filterMode=filterMode; p->filterRatio=filterRatio; p->gaussDev=gaussDev; p->representation=representation; p->normaliseType=normaliseType; p->numeratorAll=numeratorAll; p->denominatorAll=denominatorAll; p->bc=bc; for(size_t ui=0;uinBins[ui] = nBins[ui]; p->binWidth[ui] = binWidth[ui]; } p->enabledIons[0].resize(enabledIons[0].size()); std::copy(enabledIons[0].begin(),enabledIons[0].end(),p->enabledIons[0].begin()); p->enabledIons[1].resize(enabledIons[1].size()); std::copy(enabledIons[1].begin(),enabledIons[1].end(),p->enabledIons[1].begin()); if(rsdIncoming) { p->rsdIncoming=new RangeStreamData(); *(p->rsdIncoming) = *rsdIncoming; } else p->rsdIncoming=0; p->colourMap = colourMap; p->nColours = nColours; p->showColourBar = showColourBar; p->autoColourMap = autoColourMap; p->colourMapBounds[0] = colourMapBounds[0]; p->colourMapBounds[1] = colourMapBounds[1]; p->sliceInterpolate = sliceInterpolate; p->sliceAxis = sliceAxis; p->sliceOffset = sliceOffset; p->cache=cache; p->cacheOK=false; p->userString=userString; return p; } void VoxeliseFilter::clearCache() { voxelCache.clear(); Filter::clearCache(); } size_t VoxeliseFilter::numBytesForCache(size_t nObjects) const { //if we are using fixed width, we know the answer. //otherwise we dont until we are presented with the boundcube. //TODO: Modify the function description to pass in the boundcube if(!fixedWidth) return nBins[0]*nBins[1]*nBins[2]*sizeof(float); else return 0; } void VoxeliseFilter::initFilter(const std::vector &dataIn, std::vector &dataOut) { const RangeStreamData *c=0; //Determine if we have an incoming range for (size_t i = 0; i < dataIn.size(); i++) { if(dataIn[i]->getStreamType() == STREAM_TYPE_RANGE) { c=(const RangeStreamData *)dataIn[i]; break; } } //we no longer (or never did) have any incoming ranges. Not much to do if(!c) { //delete the old incoming range pointer if(rsdIncoming) delete rsdIncoming; rsdIncoming=0; enabledIons[0].clear(); //clear numerator options enabledIons[1].clear(); //clear denominator options //Prevent normalisation type being set incorrectly // if we have no incoming range data if(normaliseType == VOXELISE_NORMALISETYPE_ALLATOMSINVOXEL || normaliseType == VOXELISE_NORMALISETYPE_COUNT2INVOXEL) normaliseType= VOXELISE_NORMALISETYPE_NONE; } else { //If we didn't have an incoming rsd, then make one up! if(!rsdIncoming) { rsdIncoming = new RangeStreamData; *rsdIncoming=*c; //set the numerator to all disabled enabledIons[0].resize(rsdIncoming->rangeFile->getNumIons(),0); //set the denominator to have all enabled enabledIons[1].resize(rsdIncoming->rangeFile->getNumIons(),1); } else { //OK, so we have a range incoming already (from last time) //-- the question is, is it the same //one we had before //Do a pointer comparison (its a hack, yes, but it should work) if(rsdIncoming->rangeFile != c->rangeFile) { //hmm, it is different. well, trash the old incoming rng delete rsdIncoming; rsdIncoming = new RangeStreamData; *rsdIncoming=*c; //set the numerator to all disabled enabledIons[0].resize(rsdIncoming->rangeFile->getNumIons(),0); //set the denominator to have all enabled enabledIons[1].resize(rsdIncoming->rangeFile->getNumIons(),1); } } } } unsigned int VoxeliseFilter::refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress) { //Disallow copying of anything in the blockmask. Copy everything else propagateStreams(dataIn,getOut,getRefreshBlockMask(),true); //use the cached copy if we have it. if(cacheOK) { propagateCache(getOut); return 0; } Voxels voxelData; if(!voxelCache.getSize()) { Point3D minP,maxP; bc.setInverseLimits(); for (size_t i = 0; i < dataIn.size(); i++) { //Check for ion stream types. Block others from propagation. if (dataIn[i]->getStreamType() != STREAM_TYPE_IONS) continue; const IonStreamData *is = (const IonStreamData *)dataIn[i]; //Don't work on empty or single object streams (bounding box needs to be defined) if (is->getNumBasicObjects() < 2) continue; BoundCube bcTmp; IonHit::getBoundCube(is->data,bcTmp); //Bounds could be invalid if, for example, we had coplanar axis aligned points if (!bcTmp.isValid()) continue; bc.expand(bcTmp); } //No bounding box? Tough cookies if (!bc.isValid() || bc.isFlat()) return VOXELISE_BOUNDS_INVALID_ERR; bc.getBounds(minP,maxP); if (fixedWidth) calculateNumBinsFromWidths(binWidth, nBins); else calculateWidthsFromNumBins(binWidth, nBins); //Disallow empty bounding boxes (ie, produce no output) if(minP == maxP) return 0; //Rebuild the voxels from the point data Voxels vsDenom; voxelData.init(nBins[0], nBins[1], nBins[2], bc); voxelData.fill(0); if (normaliseType == VOXELISE_NORMALISETYPE_COUNT2INVOXEL || normaliseType == VOXELISE_NORMALISETYPE_ALLATOMSINVOXEL) { //Check we actually have incoming data ASSERT(rsdIncoming); vsDenom.init(nBins[0], nBins[1], nBins[2], bc); vsDenom.fill(0); } const IonStreamData *is; if(rsdIncoming) { for (size_t i = 0; i < dataIn.size(); i++) { //Check for ion stream types. Don't use anything else in counting if (dataIn[i]->getStreamType() != STREAM_TYPE_IONS) continue; is= (const IonStreamData *)dataIn[i]; //Count the numerator ions if(is->data.size()) { //Check what Ion type this stream belongs to. Assume all ions //in the stream belong to the same group unsigned int ionID; ionID = getIonstreamIonID(is,rsdIncoming->rangeFile); bool thisIonEnabled; if(ionID!=(unsigned int)-1) thisIonEnabled=enabledIons[0][ionID]; else thisIonEnabled=false; if(thisIonEnabled) { countPoints(voxelData,is->data,true); } } //If the user requests normalisation, compute the denominator dataset if (normaliseType == VOXELISE_NORMALISETYPE_COUNT2INVOXEL) { if(is->data.size()) { //Check what Ion type this stream belongs to. Assume all ions //in the stream belong to the same group unsigned int ionID; ionID = rsdIncoming->rangeFile->getIonID(is->data[0].getMassToCharge()); bool thisIonEnabled; if(ionID!=(unsigned int)-1) thisIonEnabled=enabledIons[1][ionID]; else thisIonEnabled=false; if(thisIonEnabled) countPoints(vsDenom,is->data,true); } } else if (normaliseType == VOXELISE_NORMALISETYPE_ALLATOMSINVOXEL) { countPoints(vsDenom,is->data,true); } if(*Filter::wantAbort) return VOXELISE_ABORT_ERR; } //Perform normalsiation if (normaliseType == VOXELISE_NORMALISETYPE_VOLUME) voxelData.calculateDensity(); else if (normaliseType == VOXELISE_NORMALISETYPE_COUNT2INVOXEL || normaliseType == VOXELISE_NORMALISETYPE_ALLATOMSINVOXEL) voxelData /= vsDenom; } else { //No range data. Just count for (size_t i = 0; i < dataIn.size(); i++) { if(dataIn[i]->getStreamType() == STREAM_TYPE_IONS) { is= (const IonStreamData *)dataIn[i]; countPoints(voxelData,is->data,true); if(*Filter::wantAbort) return VOXELISE_ABORT_ERR; } } ASSERT(normaliseType != VOXELISE_NORMALISETYPE_COUNT2INVOXEL && normaliseType!=VOXELISE_NORMALISETYPE_ALLATOMSINVOXEL); if (normaliseType == VOXELISE_NORMALISETYPE_VOLUME) voxelData.calculateDensity(); } vsDenom.clear(); //Perform voxel filtering switch(filterMode) { case VOXELISE_FILTERTYPE_NONE: break; case VOXELISE_FILTERTYPE_GAUSS: { voxelData.isotropicGaussianSmooth(gaussDev,filterRatio); break; } case VOXELISE_FILTERTYPE_LAPLACE: { voxelData.laplaceOfGaussian(gaussDev,filterRatio); break; } default: ASSERT(false); } voxelCache=voxelData; } else { //Use the cached value voxelData=voxelCache; } float min,max; voxelData.minMax(min,max); string sMin,sMax; stream_cast(sMin,min); stream_cast(sMax,max); consoleOutput.push_back(std::string(TRANS("Voxel Limits (min,max): (") + sMin + string(",")) + sMax + ")"); //Update the bounding cube { Point3D p1,p2; voxelData.getBounds(p1,p2); lastBounds.setBounds(p1,p2); } switch(representation) { case VOXEL_REPRESENT_ISOSURF: case VOXEL_REPRESENT_POINTCLOUD: { VoxelStreamData *vs = new VoxelStreamData(); vs->parent=this; std::swap(*(vs->data),voxelData); vs->representationType= representation; vs->splatSize = splatSize; vs->isoLevel=isoLevel; vs->r=rgba.r(); vs->g=rgba.g(); vs->b=rgba.b(); vs->a=rgba.a(); if(cache) { vs->cached=1; cacheOK=true; filterOutputs.push_back(vs); } else vs->cached=0; //Store the voxels on the output getOut.push_back(vs); break; } case VOXEL_REPRESENT_AXIAL_SLICE: { DrawStreamData *d = new DrawStreamData; //Create the voxel slice float minV,maxV; { DrawTexturedQuad *dq = new DrawTexturedQuad(); getTexturedSlice(voxelData,sliceAxis,sliceOffset, sliceInterpolate,minV,maxV,*dq); dq->setColour(1,1,1,rgba.a()); dq->canSelect=true; SelectionDevice *s = new SelectionDevice(this); SelectionBinding b; //Bind translation to sphere left click b.setBinding(SELECT_BUTTON_LEFT,0,DRAW_QUAD_BIND_ORIGIN, BINDING_PLANE_ORIGIN,dq->getOrigin(),dq); b.setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b); devices.push_back(s); d->drawables.push_back(dq); } if(showColourBar) d->drawables.push_back(makeColourBar(minV,maxV,255,colourMap)); d->cached=0; d->parent=this; getOut.push_back(d); cacheOK=false; } } //Copy the inputs into the outputs, provided they are not voxels return 0; } void VoxeliseFilter::setPropFromBinding(const SelectionBinding &b) { switch(b.getID()) { case BINDING_PLANE_ORIGIN: { ASSERT(representation == VOXEL_REPRESENT_AXIAL_SLICE); ASSERT(lastBounds.isValid()); //Convert the world coordinate value into a // fractional value of voxel bounds Point3D p; float f; b.getValue(p); f=p[sliceAxis]; float minB,maxB; minB = lastBounds.getBound(sliceAxis,0); maxB = lastBounds.getBound(sliceAxis,1); sliceOffset= (f -minB)/(maxB-minB); sliceOffset=std::min(sliceOffset,1.0f); sliceOffset=std::max(sliceOffset,0.0f); ASSERT(sliceOffset<=1 && sliceOffset>=0); break; } default: ASSERT(false); } } std::string VoxeliseFilter::getNormaliseTypeString(int type){ ASSERT(type < VOXELISE_NORMALISETYPE_MAX); return TRANS(NORMALISE_TYPE_STRING[type]); } std::string VoxeliseFilter::getRepresentTypeString(int type) { ASSERT(type > choices; unsigned int defaultChoice=normaliseType; tmpStr=getNormaliseTypeString(VOXELISE_NORMALISETYPE_NONE); choices.push_back(make_pair((unsigned int)VOXELISE_NORMALISETYPE_NONE,tmpStr)); tmpStr=getNormaliseTypeString(VOXELISE_NORMALISETYPE_VOLUME); choices.push_back(make_pair((unsigned int)VOXELISE_NORMALISETYPE_VOLUME,tmpStr)); if(rsdIncoming) { //Concentration mode tmpStr=getNormaliseTypeString(VOXELISE_NORMALISETYPE_ALLATOMSINVOXEL); choices.push_back(make_pair((unsigned int)VOXELISE_NORMALISETYPE_ALLATOMSINVOXEL,tmpStr)); //Ratio is only valid if we have a way of separation for the ions i.e. range tmpStr=getNormaliseTypeString(VOXELISE_NORMALISETYPE_COUNT2INVOXEL); choices.push_back(make_pair((unsigned int)VOXELISE_NORMALISETYPE_COUNT2INVOXEL,tmpStr)); } else { //prevent the case where we used to have an incoming range stream, but now we don't. // selected item within choice string must still be valid if(normaliseType > VOXELISE_NORMALISETYPE_VOLUME) defaultChoice= VOXELISE_NORMALISETYPE_NONE; } tmpStr= choiceString(choices,defaultChoice); p.name=TRANS("Normalise by"); p.data=tmpStr; p.type=PROPERTY_TYPE_CHOICE; p.helpText=TRANS("Method to use to normalise scalar value in each voxel"); p.key=KEY_NORMALISE_TYPE; propertyList.addProperty(p,curGroup); propertyList.setGroupTitle(curGroup,TRANS("Computation")); curGroup++; // numerator if (rsdIncoming) { p.name=TRANS("Numerator"); p.data=boolStrEnc(numeratorAll); p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Parmeter \"a\" used in fraction (a/b) to get voxel value"); p.key=KEY_ENABLE_NUMERATOR; propertyList.addProperty(p,curGroup); ASSERT(rsdIncoming->enabledIons.size()==enabledIons[0].size()); ASSERT(rsdIncoming->enabledIons.size()==enabledIons[1].size()); //Look at the numerator for(unsigned int ui=0; uienabledIons.size(); ui++) { string str; str=boolStrEnc(enabledIons[0][ui]); //Append the ion name with a checkbox p.name=rsdIncoming->rangeFile->getName(ui); p.data=str; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Enable this ion for numerator"); p.key=muxKey(KEY_ENABLE_NUMERATOR,ui); propertyList.addProperty(p,curGroup); } propertyList.setGroupTitle(curGroup,TRANS("Ranges")); curGroup++; } if (normaliseType == VOXELISE_NORMALISETYPE_COUNT2INVOXEL && rsdIncoming) { p.name=TRANS("Denominator"); p.data=boolStrEnc(denominatorAll ); p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Parameter \"b\" used in fraction (a/b) to get voxel value"); p.key=KEY_ENABLE_DENOMINATOR; propertyList.addProperty(p,curGroup); for(unsigned int ui=0; uienabledIons.size(); ui++) { string str; str=boolStrEnc(enabledIons[1][ui]); //Append the ion name with a checkbox p.key=muxKey(KEY_ENABLE_DENOMINATOR,ui); p.data=str; p.name=rsdIncoming->rangeFile->getName(ui); p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Enable this ion for denominator contribution"); propertyList.addProperty(p,curGroup); } propertyList.setGroupTitle(curGroup,TRANS("Denominator")); curGroup++; } //Start a new set for filtering //---- //TODO: Other filtering? threshold/median? laplacian? etc choices.clear(); //Post-filtering method for(unsigned int ui=0;ui slower, more accurate"); propertyList.addProperty(p,curGroup); } propertyList.setGroupTitle(curGroup,TRANS("Filtering")); curGroup++; //---- //start a new group for the visual representation //---------------------------- choices.clear(); tmpStr=getRepresentTypeString(VOXEL_REPRESENT_POINTCLOUD); choices.push_back(make_pair((unsigned int)VOXEL_REPRESENT_POINTCLOUD,tmpStr)); tmpStr=getRepresentTypeString(VOXEL_REPRESENT_ISOSURF); choices.push_back(make_pair((unsigned int)VOXEL_REPRESENT_ISOSURF,tmpStr)); tmpStr=getRepresentTypeString(VOXEL_REPRESENT_AXIAL_SLICE); choices.push_back(make_pair((unsigned int)VOXEL_REPRESENT_AXIAL_SLICE,tmpStr)); tmpStr= choiceString(choices,representation); p.name=TRANS("Representation"); p.data=tmpStr; p.type=PROPERTY_TYPE_CHOICE; p.helpText=TRANS("3D display method"); p.key=KEY_VOXEL_REPRESENTATION_MODE; propertyList.addProperty(p,curGroup); switch(representation) { case VOXEL_REPRESENT_POINTCLOUD: { propertyList.setGroupTitle(curGroup,TRANS("Appearance")); stream_cast(tmpStr,splatSize); p.name=TRANS("Spot size"); p.data=tmpStr; p.type=PROPERTY_TYPE_REAL; p.helpText=TRANS("Size of the spots to use for display"); p.key=KEY_SPOTSIZE; propertyList.addProperty(p,curGroup); stream_cast(tmpStr,1.0-rgba.a()); p.name=TRANS("Transparency"); p.data=tmpStr; p.type=PROPERTY_TYPE_REAL; p.helpText=TRANS("How \"see through\" each point is (0 - opaque, 1 - invisible)"); p.key=KEY_TRANSPARENCY; propertyList.addProperty(p,curGroup); break; } case VOXEL_REPRESENT_ISOSURF: { //-- Isosurface parameters -- propertyList.setGroupTitle(curGroup,TRANS("Surf. param.")); stream_cast(tmpStr,isoLevel); p.name=TRANS("Isovalue"); p.data=tmpStr; p.type=PROPERTY_TYPE_REAL; p.helpText=TRANS("Scalar value to show as isosurface"); p.key=KEY_ISOLEVEL; propertyList.addProperty(p,curGroup); //-- propertyList.setGroupTitle(curGroup,TRANS("Surface")); curGroup++; //-- Isosurface appearance -- p.name=TRANS("Colour"); p.data=rgba.toColourRGBA().rgbString(); p.type=PROPERTY_TYPE_COLOUR; p.helpText=TRANS("Colour of isosurface"); p.key=KEY_COLOUR; propertyList.addProperty(p,curGroup); stream_cast(tmpStr,1.0-rgba.a()); p.name=TRANS("Transparency"); p.data=tmpStr; p.type=PROPERTY_TYPE_REAL; p.helpText=TRANS("How \"see through\" each facet is (0 - opaque, 1 - invisible)"); p.key=KEY_TRANSPARENCY; propertyList.addProperty(p,curGroup); //---- break; } case VOXEL_REPRESENT_AXIAL_SLICE: { //-- Slice parameters -- propertyList.setGroupTitle(curGroup,TRANS("Slice param.")); vector > choices; choices.push_back(make_pair(0,"x")); choices.push_back(make_pair(1,"y")); choices.push_back(make_pair(2,"z")); p.name=TRANS("Slice Axis"); p.data=choiceString(choices,sliceAxis); p.type=PROPERTY_TYPE_CHOICE; p.helpText=TRANS("Normal for the planar slice"); p.key=KEY_VOXEL_SLICE_AXIS; propertyList.addProperty(p,curGroup); choices.clear(); stream_cast(tmpStr,sliceOffset); p.name=TRANS("Slice Coord"); p.data=tmpStr; p.type=PROPERTY_TYPE_REAL; p.helpText=TRANS("Fractional coordinate that slice plane passes through"); p.key=KEY_VOXEL_SLICE_OFFSET; propertyList.addProperty(p,curGroup); p.name=TRANS("Interp. Mode"); for(unsigned int ui=0;uisplatSize=splatSize; } } } break; } case KEY_TRANSPARENCY: { float f; if(stream_cast(f,value)) return false; if(f < 0.0f || f > 1.0) return false; needUpdate=true; //Alpha is opacity, which is 1-transparancy rgba.a(1.0f-f); //Go in and manually adjust the cached //entries to have the new value, rather //than doing a full recomputation if(cacheOK) { for(unsigned int ui=0;uia=rgba.a(); } } break; } case KEY_ISOLEVEL: { float f; if(stream_cast(f,value)) return false; if(f <= 0.0f) return false; needUpdate=true; isoLevel=f; //Go in and manually adjust the cached //entries to have the new value, rather //than doing a full recomputation if(cacheOK) { for(unsigned int ui=0;uiisoLevel=isoLevel; } } break; } case KEY_COLOUR: { ColourRGBA tmpRGBA; if(!tmpRGBA.parse(value)) return false; if(tmpRGBA.toRGBAf() != rgba) { rgba=tmpRGBA.toRGBAf(); needUpdate=true; } //Go in and manually adjust the cached //entries to have the new value, rather //than doing a full recomputation if(cacheOK) { for(unsigned int ui=0;uir=rgba.r(); d->g=rgba.g(); d->b=rgba.b(); } } break; } case KEY_VOXEL_REPRESENTATION_MODE: { unsigned int i; for (i = 0; i < VOXEL_REPRESENT_END; i++) if (value == getRepresentTypeString(i)) break; if (i == VOXEL_REPRESENT_END) return false; needUpdate=true; //Go in and manually adjust the cached //entries to have the new value, rather //than doing a full recomputation //TODO: Can we instead of caching the Stream, simply cache the voxel data? representation=i; if(cacheOK && (VOXEL_REPRESENT_KEEPCACHE[i] && VOXEL_REPRESENT_KEEPCACHE[representation])) { for(unsigned int ui=0;uirepresentationType=representation; } } else { clearCache(); } break; } case KEY_ENABLE_NUMERATOR: { bool b; if(stream_cast(b,value)) return false; //Set them all to enabled or disabled as a group for (size_t i = 0; i < enabledIons[0].size(); i++) enabledIons[0][i] = b; numeratorAll = b; needUpdate=true; clearCache(); break; } case KEY_ENABLE_DENOMINATOR: { bool b; if(stream_cast(b,value)) return false; //Set them all to enabled or disabled as a group for (size_t i = 0; i < enabledIons[1].size(); i++) enabledIons[1][i] = b; denominatorAll = b; needUpdate=true; clearCache(); break; } case KEY_FILTER_MODE: { //Locate the current string unsigned int i; for (i = 0; i < VOXELISE_FILTERTYPE_MAX; i++) { if (value == getFilterTypeString(i)) break; } if (i == VOXELISE_FILTERTYPE_MAX) return false; if(i!=filterMode) { needUpdate=true; filterMode=i; clearCache(); } break; } case KEY_FILTER_RATIO: { float i; if(stream_cast(i,value)) return false; //forbid negative sizes if(i <= 0) return false; if(i != filterRatio) { needUpdate=true; filterRatio=i; clearCache(); } break; } case KEY_FILTER_STDEV: { float i; if(stream_cast(i,value)) return false; //forbid negative sizes if(i <= 0) return false; if(i != gaussDev) { needUpdate=true; gaussDev=i; clearCache(); } break; } case KEY_VOXEL_SLICE_COLOURAUTO: { bool b; if(!boolStrDec(value,b)) return false; //if the result is different, the //cache should be invalidated if(b!=autoColourMap) { needUpdate=true; autoColourMap=b; //Clear the generic filter cache, but // not the voxel cache Filter::clearCache(); } break; } case KEY_VOXEL_SLICE_AXIS: { unsigned int i; string axisLabels[3]={"x","y","z"}; for (i = 0; i < 3; i++) if( value == axisLabels[i]) break; if( i >= 3) return false; if(i != sliceAxis) { needUpdate=true; //clear the generic filter cache (i.e. cached outputs) //but not the voxel cache Filter::clearCache(); sliceAxis=i; } break; } case KEY_VOXEL_SLICE_INTERP: { unsigned int i; for (i = 0; i < VOX_INTERP_ENUM_END; i++) if( value == TRANS(VOXELISE_SLICE_INTERP_STRING[i])) break; if( i >= VOX_INTERP_ENUM_END) return false; if(i != sliceInterpolate) { needUpdate=true; //clear the generic filter cache (i.e. cached outputs) //but not the voxel cache Filter::clearCache(); sliceInterpolate=i; } break; } case KEY_VOXEL_SLICE_OFFSET: { float f; if(stream_cast(f,value)) return false; if(f < 0.0f || f > 1.0f) return false; if( f != sliceOffset) { needUpdate=true; //clear the generic filter cache (i.e. cached outputs) //but not the voxel cache Filter::clearCache(); sliceOffset=f; } break; } case KEY_VOXEL_COLOURMODE: { unsigned int tmpMap; tmpMap=(unsigned int)-1; for(unsigned int ui=0;ui=NUM_COLOURMAPS || tmpMap ==colourMap) return false; //clear the generic filter cache (i.e. cached outputs) //but not the voxel cache Filter::clearCache(); needUpdate=true; colourMap=tmpMap; break; } case KEY_SHOW_COLOURBAR: { bool b; if(!boolStrDec(value,b)) return false; //if the result is different, the //cache should be invalidated if(b!=showColourBar) { needUpdate=true; showColourBar=b; //clear the generic filter cache (i.e. cached outputs) //but not the voxel cache Filter::clearCache(); } break; } case KEY_MAPSTART: { float f; if(stream_cast(f,value)) return false; if(f >= colourMapBounds[1]) return false; if(f!=colourMapBounds[0]) { needUpdate=true; colourMapBounds[0]=f; //clear the generic filter cache (i.e. cached outputs) //but not the voxel cache Filter::clearCache(); } break; } case KEY_MAPEND: { float f; if(stream_cast(f,value)) return false; if(f <= colourMapBounds[0]) return false; if(f!=colourMapBounds[1]) { needUpdate=true; colourMapBounds[1]=f; //clear the generic filter cache (i.e. cached outputs) //but not the voxel cache Filter::clearCache(); } break; } default: { unsigned int subKeyType,offset; demuxKey(key,subKeyType,offset); //Check for jump to denominator or numerator section // TODO: This is a bit of a hack. if (subKeyType==KEY_ENABLE_DENOMINATOR) { bool b; if(!boolStrDec(value,b)) return false; enabledIons[1][offset]=b; if (!b) { denominatorAll = false; } needUpdate=true; clearCache(); } else if (subKeyType == KEY_ENABLE_NUMERATOR) { bool b; if(!boolStrDec(value,b)) return false; enabledIons[0][offset]=b; if (!b) { numeratorAll = false; } needUpdate=true; clearCache(); } else { ASSERT(false); } break; } } return true; } std::string VoxeliseFilter::getSpecificErrString(unsigned int code) const { const char *errStrs[]={ "", "Voxelisation aborted", "Out of memory", "Unable to perform filter convolution", "Voxelisation bounds are invalid", }; COMPILE_ASSERT(THREEDEP_ARRAYSIZE(errStrs) == VOXELISE_ERR_ENUM_END); ASSERT(code < VOXELISE_ERR_ENUM_END); return errStrs[code]; } bool VoxeliseFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<" << trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+2) << "" << endl; for(unsigned int ui=0;ui" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+2) << "" << endl; for(unsigned int ui=0;ui" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" <" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth) << "" << endl; break; } default: ASSERT(false); return false; } return true; } bool VoxeliseFilter::readState(xmlNodePtr &nodePtr, const std::string &stateFileDir) { using std::string; string tmpStr; xmlChar *xmlString; stack nodeStack; //Retrieve user string //=== if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //=== //Retrieve fixedWidth mode if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"fixedwidth","value")) return false; if(!boolStrDec(tmpStr,fixedWidth)) return false; //Retrieve nBins if(XMLHelpFwdToElem(nodePtr,"nbins")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"values"); if(!xmlString) return false; std::vector v1; splitStrsRef((char *)xmlString,',',v1); for (size_t i = 0; i < INDEX_LENGTH && i < v1.size(); i++) { if(stream_cast(nBins[i],v1[i])) return false; if(nBins[i] <= 0) return false; } xmlFree(xmlString); //Retrieve bin width if(XMLHelpFwdToElem(nodePtr,"binwidth")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"values"); if(!xmlString) return false; std::vector v2; splitStrsRef((char *)xmlString,',',v2); for (size_t i = 0; i < INDEX_LENGTH && i < v2.size(); i++) { if(stream_cast(binWidth[i],v2[i])) return false; if(binWidth[i] <= 0) return false; } xmlFree(xmlString); //Retrieve normaliseType if(!XMLGetNextElemAttrib(nodePtr,normaliseType,"normalisetype","value")) return false; if(normaliseType >= VOXELISE_NORMALISETYPE_MAX) return false; //Look for the enabled ions bit //------- // if(!XMLHelpFwdToElem(nodePtr,"enabledions")) { nodeStack.push(nodePtr); if(!nodePtr->xmlChildrenNode) return false; nodePtr=nodePtr->xmlChildrenNode; //enabled ions for numerator if(XMLHelpFwdToElem(nodePtr,"numerator")) return false; nodeStack.push(nodePtr); if(!nodePtr->xmlChildrenNode) return false; nodePtr=nodePtr->xmlChildrenNode; while(nodePtr) { char c; //Retrieve representation if(!XMLGetNextElemAttrib(nodePtr,c,"enabled","value")) break; if(c == '1') enabledIons[0].push_back(true); else enabledIons[0].push_back(false); nodePtr=nodePtr->next; } nodePtr=nodeStack.top(); nodeStack.pop(); //enabled ions for denominator if(XMLHelpFwdToElem(nodePtr,"denominator")) return false; if(!nodePtr->xmlChildrenNode) return false; nodeStack.push(nodePtr); nodePtr=nodePtr->xmlChildrenNode; while(nodePtr) { char c; //Retrieve representation if(!XMLGetNextElemAttrib(nodePtr,c,"enabled","value")) break; if(c == '1') enabledIons[1].push_back(true); else enabledIons[1].push_back(false); nodePtr=nodePtr->next; } nodeStack.pop(); nodePtr=nodeStack.top(); nodeStack.pop(); //Check that the enabled ions size makes at least some sense... if(enabledIons[0].size() != enabledIons[1].size()) return false; } //------- //Retrieve representation if(!XMLGetNextElemAttrib(nodePtr,representation,"representation","value")) return false; if(representation >=VOXEL_REPRESENT_END) return false; //------- //Retrieve representation if(!XMLGetNextElemAttrib(nodePtr,isoLevel,"isovalue","value")) return false; //Retrieve colour //==== if(XMLHelpFwdToElem(nodePtr,"colour")) return false; ColourRGBAf tmpRgba; if(!parseXMLColour(nodePtr,tmpRgba)) return false; rgba=tmpRgba; //==== //try to retrieve slice, where possible if(!XMLHelpFwdToElem(nodePtr,"axialslice")) { xmlNodePtr sliceNodes; sliceNodes=nodePtr->xmlChildrenNode; if(!sliceNodes) return false; if(!XMLGetNextElemAttrib(sliceNodes,sliceOffset,"offset","value")) return false; sliceOffset=std::min(sliceOffset,1.0f); sliceOffset=std::max(sliceOffset,0.0f); if(!XMLGetNextElemAttrib(sliceNodes,sliceInterpolate,"interpolate","value")) return false; if(sliceInterpolate >=VOX_INTERP_ENUM_END) return false; if(!XMLGetNextElemAttrib(sliceNodes,sliceAxis,"axis","value")) return false; if(sliceAxis > 2) sliceAxis=2; if(!XMLGetNextElemAttrib(sliceNodes,showColourBar,"colourbar","show")) return false; if(!XMLGetAttrib(sliceNodes,autoColourMap,"auto")) return false; if(!XMLGetAttrib(sliceNodes,colourMapBounds[0],"min")) return false; if(!XMLGetAttrib(sliceNodes,colourMapBounds[1],"max")) return false; if(colourMapBounds[0] >= colourMapBounds[1]) return false; } return true; } unsigned int VoxeliseFilter::getRefreshBlockMask() const { //Ions, plots and voxels cannot pass through this filter return STREAM_TYPE_IONS | STREAM_TYPE_PLOT | STREAM_TYPE_VOXEL; } unsigned int VoxeliseFilter::getRefreshEmitMask() const { return STREAM_TYPE_VOXEL | STREAM_TYPE_DRAW; } unsigned int VoxeliseFilter::getRefreshUseMask() const { return STREAM_TYPE_IONS | STREAM_TYPE_RANGE; } void VoxeliseFilter::getTexturedSlice(const Voxels &v, size_t axis,float offset, size_t interpolateMode, float &minV,float &maxV,DrawTexturedQuad &texQ) const { ASSERT(axis < 3); size_t dim[3]; //dim0 and 2 are the in-plane axes. dim3 is the normal axis v.getSize(dim[0],dim[1],dim[2]); switch(axis) { //x-normal case 0: rotate3(dim[0],dim[1],dim[2]); std::swap(dim[0],dim[1]); break; //y-normal case 1: rotate3(dim[2],dim[1],dim[0]); break; //z-normal case 2: std::swap(dim[0],dim[1]); break; } ASSERT(dim[0] >0 && dim[1] >0); texQ.resize(dim[0],dim[1],3); //Generate the texture from the voxel data //--- float *data = new float[dim[0]*dim[1]]; ASSERT(offset >=0 && offset <=1.0f); v.getInterpSlice(axis,offset,data,interpolateMode); if(autoColourMap) { minV=minValue(data,dim[0]*dim[1]); maxV=maxValue(data,dim[0]*dim[1]); } else { minV=colourMapBounds[0]; maxV=colourMapBounds[1]; } ASSERT(minV <=maxV); unsigned char rgb[3]; for(size_t ui=0;ui ionVec; ionVec.resize(5); ionVec[0].setPos(Point3D(0.1,0.1,0.1)); ionVec[1].setPos(Point3D(0.1,0.0,0.1)); ionVec[2].setPos(Point3D(0.0,0.1,0.1)); ionVec[3].setPos(Point3D(0.1,0.1,0.0)); ionVec[4].setPos(Point3D(0.0,0.1,0.0)); for(unsigned int ui=0;uidata,ionVec); size_t numIons=ionData->data.size(); VoxeliseFilter *f = new VoxeliseFilter; f->setCaching(false); bool needUpdate; TEST(f->setProperty(KEY_NBINSX,"4",needUpdate),"num bins x"); TEST(f->setProperty(KEY_NBINSY,"4",needUpdate),"num bins y"); TEST(f->setProperty(KEY_NBINSZ,"4",needUpdate),"num bins z"); vector streamIn,streamOut; streamIn.push_back(ionData); ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"Refresh error code"); delete f; TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_VOXEL,"Stream type"); const VoxelStreamData *v= (const VoxelStreamData*)streamOut[0]; TEST(v->data->max() <=numIons, "voxel max less than input stream") TEST(v->data->min() >= 0.0f,"voxel counting minimum sanity"); float dataSum; sumVoxels(*(v->data),dataSum); TEST(fabs(dataSum - (float)numIons ) < sqrtf(std::numeric_limits::epsilon()),"voxel counting all input ions "); delete ionData; delete streamOut[0]; return true; } bool voxelMultiCountTest() { //Test counting multiple data streams containing ranged data vector streamIn,streamOut; vector ionVec; ionVec.resize(5); ionVec[0].setPos(Point3D(0.1,0.1,0.1)); ionVec[1].setPos(Point3D(0.1,0.0,0.1)); ionVec[2].setPos(Point3D(0.0,0.1,0.1)); ionVec[3].setPos(Point3D(0.1,0.1,0.0)); ionVec[4].setPos(Point3D(0.0,0.1,0.0)); IonStreamData *ionData[2]; RangeStreamData *rngStream; rngStream = new RangeStreamData; rngStream->rangeFile= new RangeFile; RGBf col; col.red=col.green=col.blue=1.0f; //create several input ion streams, each //containing the above data, but with differeing //mass to charge values. // - we range this data though! const unsigned int MAX_NUM_RANGES=2; for(unsigned int ui=0;uirangeFile->addIon(sTmp,sTmp,col); rngStream->rangeFile->addRange((float)ui-0.5f,(float)ui+0.5f,ionNum); //Change m/c value for ion for(unsigned int uj=0;ujdata.resize(ionVec.size()); std::copy(ionVec.begin(),ionVec.end(),ionData[ui]->data.begin()); streamIn.push_back(ionData[ui]); } rngStream->enabledIons.resize(rngStream->rangeFile->getNumIons()); rngStream->enabledRanges.resize(rngStream->rangeFile->getNumRanges()); streamIn.push_back(rngStream); VoxeliseFilter *f = new VoxeliseFilter; //Initialise range data f->initFilter(streamIn,streamOut); f->setCaching(false); bool needUpdate; TEST(f->setProperty(KEY_NBINSX,"4",needUpdate),"num bins x"); TEST(f->setProperty(KEY_NBINSY,"4",needUpdate),"num bins y"); TEST(f->setProperty(KEY_NBINSZ,"4",needUpdate),"num bins z"); TEST(f->setProperty(KEY_NORMALISE_TYPE, TRANS(NORMALISE_TYPE_STRING[VOXELISE_NORMALISETYPE_ALLATOMSINVOXEL]),needUpdate), "Set normalise mode"); ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"Refresh error code"); delete f; for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_VOXEL,"Stream type"); const VoxelStreamData *v= (const VoxelStreamData*)streamOut[1]; TEST(v->data->max() <=1.0f, "voxel max less than input stream") TEST(v->data->min() >= 0.0f,"voxel counting minimum sanity"); //all data should lie between 0 and 1 for(unsigned int ui=0;uidata->getSize();ui++) { float val; val=v->data->getData(ui); ASSERT( val >= 0 && val <= 1.0f); } delete v; delete rngStream->rangeFile; delete rngStream; return true; } bool VoxeliseFilter::runUnitTests() { if(!voxelSingleCountTest()) return false; if(!voxelMultiCountTest()) return false; return true; } #endif 3Depict-0.0.19/src/backend/filters/transform.cpp0000644000175000017500000015055512716457006021050 0ustar pcuserpcuser/* * transform.cpp - Perform geometrical transform operations on point clouds * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "transform.h" #include "filterCommon.h" using std::vector; using std::string; using std::pair; using std::make_pair; enum { KEY_MODE, KEY_SCALEFACTOR, KEY_SCALEFACTOR_ANISOTROPIC, KEY_ORIGIN, KEY_TRANSFORM_SHOWORIGIN, KEY_ORIGINMODE, KEY_NOISELEVEL, KEY_NOISETYPE, KEY_ROTATE_ANGLE, KEY_ROTATE_AXIS, KEY_ORIGIN_VALUE, KEY_CROP_MINIMUM, KEY_CROP_MAXIMUM, }; //Possible transform modes (scaling, rotation etc) enum { MODE_TRANSLATE, MODE_SCALE_ISOTROPIC, MODE_SCALE_ANISOTROPIC, MODE_ROTATE, MODE_VALUE_SHUFFLE, MODE_SPATIAL_NOISE, MODE_TRANSLATE_VALUE, MODE_CROP_VALUE, MODE_ENUM_END }; //!Possible mode for selection of origin in transform filter enum { ORIGINMODE_SELECT, ORIGINMODE_CENTREBOUND, ORIGINMODE_MASSCENTRE, ORIGINMODE_END, // Not actually origin mode, just end of enum }; //!Possible noise modes enum { NOISETYPE_GAUSSIAN, NOISETYPE_WHITE, NOISETYPE_END }; //!Error codes enum { ERR_NOMEM=1, TRANSFORM_ERR_ENUM_END }; const char *TRANSFORM_MODE_STRING[] = { NTRANS("Translate"), NTRANS("Scale (isotropic)"), NTRANS("Scale (anisotropic)"), NTRANS("Rotate"), NTRANS("Value Shuffle"), NTRANS("Spatial Noise"), NTRANS("Translate Value"), NTRANS("Crop Value") }; const char *TRANSFORM_ORIGIN_STRING[]={ NTRANS("Specify"), NTRANS("Boundbox Centre"), NTRANS("Mass Centre") }; //=== Transform filter === TransformFilter::TransformFilter() { COMPILE_ASSERT(THREEDEP_ARRAYSIZE(TRANSFORM_MODE_STRING) == MODE_ENUM_END); COMPILE_ASSERT(THREEDEP_ARRAYSIZE(TRANSFORM_ORIGIN_STRING) == ORIGINMODE_END); randGen.initTimer(); transformMode=MODE_TRANSLATE; originMode=ORIGINMODE_SELECT; noiseType=NOISETYPE_WHITE; //Set up default value vectorParams.resize(1); vectorParams[0] = Point3D(0,0,0); showPrimitive=true; showOrigin=false; cacheOK=false; cache=false; } Filter *TransformFilter::cloneUncached() const { TransformFilter *p=new TransformFilter(); //Copy the values p->vectorParams.resize(vectorParams.size()); p->scalarParams.resize(scalarParams.size()); std::copy(vectorParams.begin(),vectorParams.end(),p->vectorParams.begin()); std::copy(scalarParams.begin(),scalarParams.end(),p->scalarParams.begin()); p->showPrimitive=showPrimitive; p->originMode=originMode; p->transformMode=transformMode; p->showOrigin=showOrigin; p->noiseType=noiseType; //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->userString=userString; return p; } size_t TransformFilter::numBytesForCache(size_t nObjects) const { return nObjects*sizeof(IonHit); } DrawStreamData* TransformFilter::makeMarkerSphere(SelectionDevice* &s) const { //construct a new primitive, do not cache DrawStreamData *drawData=new DrawStreamData; drawData->parent=this; //Add drawable components DrawSphere *dS = new DrawSphere; dS->setOrigin(vectorParams[0]); dS->setRadius(1); //FIXME: Alpha blending is all screwed up. May require more //advanced drawing in scene. (front-back drawing). //I have set alpha=1 for now. dS->setColour(0.2,0.2,0.8,1.0); dS->setLatSegments(40); dS->setLongSegments(40); dS->wantsLight=true; drawData->drawables.push_back(dS); s=0; //Set up selection "device" for user interaction //Note the order of s->addBinding is critical, //as bindings are selected by first match. //==== //The object is selectable if (originMode == ORIGINMODE_SELECT ) { dS->canSelect=true; s=new SelectionDevice(this); SelectionBinding b; b.setBinding(SELECT_BUTTON_LEFT,0,DRAW_SPHERE_BIND_ORIGIN, BINDING_SPHERE_ORIGIN,dS->getOrigin(),dS); b.setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b); } drawData->cached=0; return drawData; } unsigned int TransformFilter::refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress) { //use the cached copy if we have it. if(cacheOK) { //Propagate non-ion-types into output propagateStreams(dataIn,getOut, getRefreshBlockMask(),true); propagateCache(getOut); return 0; } //The user is allowed to choose the mode by which the origin is computed //so set the origin variable depending upon this switch(originMode) { case ORIGINMODE_CENTREBOUND: { BoundCube masterB; masterB.setInverseLimits(); #pragma omp parallel for for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_IONS) { const IonStreamData* ions; ions = (const IonStreamData*)dataIn[ui]; if(ions->data.size()) { IonHit::getBoundCube(ions->data,thisB); #pragma omp critical masterB.expand(thisB); } } } if(!masterB.isValid()) vectorParams[0]=Point3D(0,0,0); else vectorParams[0]=masterB.getCentroid(); break; } case ORIGINMODE_MASSCENTRE: { Point3D massCentre(0,0,0); size_t numCentres=0; #pragma omp parallel for for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_IONS) { const IonStreamData* ions; ions = (const IonStreamData*)dataIn[ui]; if(ions->data.size()) { Point3D thisCentre; thisCentre=Point3D(0,0,0); for(unsigned int uj=0;ujdata.size();uj++) thisCentre+=ions->data[uj].getPosRef(); massContrib=thisCentre*1.0/(float)ions->data.size(); #pragma omp critical massCentre+=massContrib; numCentres++; } } } vectorParams[0]=massCentre*1.0/(float)numCentres; break; } case ORIGINMODE_SELECT: break; default: ASSERT(false); } //If the user is using a transform mode that requires origin selection if(showOrigin && (transformMode == MODE_ROTATE || transformMode == MODE_SCALE_ANISOTROPIC || transformMode == MODE_SCALE_ISOTROPIC) ) { SelectionDevice *s; DrawStreamData *d=makeMarkerSphere(s); if(s) devices.push_back(s); cacheAsNeeded(d); getOut.push_back(d); } //Apply the transformations to the incoming //ion streams, generating new outgoing ion streams with //the modified positions size_t totalSize=numElements(dataIn); //If there are no ions, nothing to do. // just copy non-ion input to output if(!totalSize) { for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_IONS) continue; getOut.push_back(dataIn[ui]); } return 0; } if( transformMode != MODE_VALUE_SHUFFLE) { //Don't cross the streams. Why? It would be bad. // - I'm fuzzy on the whole good-bad thing, what do you mean bad? // - Every ion in the data body can be operated on independently. // FIXME: I'm still not clear why that is bad. Might have something to do with tracking range parent IDs, or somesuch // may or may not be relevant today // OK, important safety tip. size_t n=0; for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { //Set up scaling output ion stream IonStreamData *d=new IonStreamData; d->parent=this; const IonStreamData *src = (const IonStreamData *)dataIn[ui]; try { d->data.resize(src->data.size()); } catch(std::bad_alloc) { delete d; return ERR_NOMEM; } d->r = src->r; d->g = src->g; d->b = src->b; d->a = src->a; d->ionSize = src->ionSize; d->valueType=src->valueType; ASSERT(src->data.size() <= totalSize); #ifdef _OPENMP unsigned int curProg=PROGRESS_REDUCE; //Parallel version bool spin=false; #pragma omp parallel for shared(spin,n) for(unsigned int ui=0;uidata.size();ui++) { if(spin) continue; if(!curProg--) { unsigned int thisT=omp_get_thread_num(); #pragma omp critical { n+=NUM_CALLBACK; progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); } if(thisT == 0) { if(*Filter::wantAbort) spin=true; } } //set the position for the given ion d->data[ui].setPos((src->data[ui].getPosRef() - origin)*scaleFactor+origin); d->data[ui].setMassToCharge(src->data[ui].getMassToCharge()); } if(spin) { delete d; return FILTER_ERR_ABORT; } #else //Single threaded version size_t pos=0; //Copy across the ions into the target for(vector::const_iterator it=src->data.begin(); it!=src->data.end(); ++it) { //set the position for the given ion d->data[pos].setPos((it->getPosRef() - origin)*scaleFactor+origin); d->data[pos].setMassToCharge(it->getMassToCharge()); //update progress progress.filterProgress= (unsigned int)((float)(n++)/((float)totalSize)*100.0f); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } pos++; } ASSERT(pos == d->data.size()); #endif ASSERT(d->data.size() == src->data.size()); cacheAsNeeded(d); getOut.push_back(d); break; } default: //Just copy across the ptr, if we are unfamiliar with this type getOut.push_back(dataIn[ui]); break; } break; } case MODE_SCALE_ANISOTROPIC: { //We are going to scale the incoming point data //around the specified origin. ASSERT(vectorParams.size() == 2); Point3D origin=vectorParams[0]; Point3D transformVec=vectorParams[1]; switch(dataIn[ui]->getStreamType()) { case STREAM_TYPE_IONS: { //Set up scaling output ion stream IonStreamData *d=new IonStreamData; d->parent=this; const IonStreamData *src = (const IonStreamData *)dataIn[ui]; try { d->data.resize(src->data.size()); } catch(std::bad_alloc) { delete d; return ERR_NOMEM; } d->r = src->r; d->g = src->g; d->b = src->b; d->a = src->a; d->ionSize = src->ionSize; d->valueType=src->valueType; ASSERT(src->data.size() <= totalSize); #ifdef _OPENMP unsigned int curProg=PROGRESS_REDUCE; //Parallel version bool spin=false; #pragma omp parallel for shared(spin) for(unsigned int ui=0;uidata.size();ui++) { unsigned int thisT=omp_get_thread_num(); if(spin) continue; if(!curProg--) { #pragma omp critical { n+=NUM_CALLBACK; progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); } if(thisT == 0) { if(*Filter::wantAbort) spin=true; } } //set the position for the given ion d->data[ui].setPos((src->data[ui].getPosRef() - origin)*transformVec+origin); d->data[ui].setMassToCharge(src->data[ui].getMassToCharge()); } if(spin) { delete d; return FILTER_ERR_ABORT; } #else //Single threaded version size_t pos=0; //Copy across the ions into the target for(vector::const_iterator it=src->data.begin(); it!=src->data.end(); ++it) { //set the position for the given ion d->data[pos].setPos((it->getPosRef() - origin)*transformVec+origin); d->data[pos].setMassToCharge(it->getMassToCharge()); progress.filterProgress= (unsigned int)((float)(n++)/((float)totalSize)*100.0f); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } pos++; } ASSERT(pos == d->data.size()); #endif ASSERT(d->data.size() == src->data.size()); cacheAsNeeded(d); getOut.push_back(d); break; } default: //Just copy across the ptr, if we are unfamiliar with this type getOut.push_back(dataIn[ui]); break; } break; } case MODE_TRANSLATE: { //We are going to scale the incoming point data //around the specified origin. ASSERT(vectorParams.size() == 1); ASSERT(scalarParams.size() == 0); Point3D origin =vectorParams[0]; switch(dataIn[ui]->getStreamType()) { case STREAM_TYPE_IONS: { //Set up scaling output ion stream IonStreamData *d=new IonStreamData; d->parent=this; const IonStreamData *src = (const IonStreamData *)dataIn[ui]; try { d->data.resize(src->data.size()); } catch(std::bad_alloc) { delete d; return ERR_NOMEM; } d->r = src->r; d->g = src->g; d->b = src->b; d->a = src->a; d->ionSize = src->ionSize; d->valueType=src->valueType; ASSERT(src->data.size() <= totalSize); #ifdef _OPENMP //Parallel version unsigned int curProg=PROGRESS_REDUCE; bool spin=false; #pragma omp parallel for shared(spin) for(unsigned int ui=0;uidata.size();ui++) { if(spin) continue; if(!curProg--) { #pragma omp critical { n+=PROGRESS_REDUCE; progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); } if(omp_get_thread_num() == 0) { if(*Filter::wantAbort) spin=true; } } //set the position for the given ion d->data[ui].setPos((src->data[ui].getPosRef() - origin)); d->data[ui].setMassToCharge(src->data[ui].getMassToCharge()); } if(spin) { delete d; return FILTER_ERR_ABORT; } #else //Single threaded version size_t pos=0; //Copy across the ions into the target for(vector::const_iterator it=src->data.begin(); it!=src->data.end(); ++it) { //set the position for the given ion d->data[pos].setPos((it->getPosRef() - origin)); d->data[pos].setMassToCharge(it->getMassToCharge()); //update progress every CALLBACK ions progress.filterProgress= (unsigned int)((float)(n++)/((float)totalSize)*100.0f); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } pos++; } ASSERT(pos == d->data.size()); #endif ASSERT(d->data.size() == src->data.size()); cacheAsNeeded(d); getOut.push_back(d); break; } default: //Just copy across the ptr, if we are unfamiliar with this type getOut.push_back(dataIn[ui]); break; } break; } case MODE_TRANSLATE_VALUE: { //We are going to scale the incoming point data //around the specified origin. ASSERT(vectorParams.size() == 0); ASSERT(scalarParams.size() == 1); float origin =scalarParams[0]; switch(dataIn[ui]->getStreamType()) { case STREAM_TYPE_IONS: { //Set up scaling output ion stream IonStreamData *d=new IonStreamData; d->parent=this; const IonStreamData *src = (const IonStreamData *)dataIn[ui]; try { d->data.resize(src->data.size()); } catch(std::bad_alloc) { delete d; return ERR_NOMEM; } d->r = src->r; d->g = src->g; d->b = src->b; d->a = src->a; d->ionSize = src->ionSize; d->valueType=src->valueType; ASSERT(src->data.size() <= totalSize); unsigned int curProg=NUM_CALLBACK; #ifdef _OPENMP //Parallel version bool spin=false; #pragma omp parallel for shared(spin) for(unsigned int ui=0;uidata.size();ui++) { unsigned int thisT=omp_get_thread_num(); if(spin) continue; if(!curProg--) { #pragma omp critical { n+=NUM_CALLBACK; progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); } if(thisT == 0) { if(*Filter::wantAbort) spin=true; } } //set the position for the given ion d->data[ui].setPos((src->data[ui].getPosRef())); d->data[ui].setMassToCharge(src->data[ui].getMassToCharge()+origin); } if(spin) { delete d; return FILTER_ERR_ABORT; } #else //Single threaded version size_t pos=0; //Copy across the ions into the target for(vector::const_iterator it=src->data.begin(); it!=src->data.end(); ++it) { //set the position for the given ion d->data[pos].setPos((it->getPosRef())); d->data[pos].setMassToCharge(it->getMassToCharge() + origin); //update progress every CALLBACK ions if(!curProg--) { n+=NUM_CALLBACK; progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } curProg=NUM_CALLBACK; } pos++; } ASSERT(pos == d->data.size()); #endif ASSERT(d->data.size() == src->data.size()); cacheAsNeeded(d); getOut.push_back(d); break; } default: //Just copy across the ptr, if we are unfamiliar with this type getOut.push_back(dataIn[ui]); break; } break; } case MODE_CROP_VALUE: { ASSERT(scalarParams.size() == 2); switch(dataIn[ui]->getStreamType()) { case STREAM_TYPE_IONS: { //Set up scaling output ion stream IonStreamData *d=new IonStreamData; d->parent=this; const IonStreamData *src = (const IonStreamData *)dataIn[ui]; for(unsigned int uj=0;ujdata.size();uj++) { float v; v=src->data[uj].getMassToCharge(); if(v >=scalarParams[0] && v < scalarParams[1]) d->data.push_back(src->data[uj]); } d->estimateIonParameters(src); cacheAsNeeded(d); getOut.push_back(d); } } } break; case MODE_ROTATE: { Point3D origin=vectorParams[0]; switch(dataIn[ui]->getStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *src = (const IonStreamData *)dataIn[ui]; //Set up output ion stream IonStreamData *d=new IonStreamData; d->parent=this; try { d->data.resize(src->data.size()); } catch(std::bad_alloc) { delete d; return ERR_NOMEM; } d->estimateIonParameters(src); //We are going to rotate the incoming point data //around the specified origin. ASSERT(vectorParams.size() == 2); ASSERT(scalarParams.size() == 1); Point3D axis =vectorParams[1]; axis.normalise(); float angle=scalarParams[0]*M_PI/180.0f; unsigned int curProg=NUM_CALLBACK; Point3f rotVec,p; rotVec.fx=axis[0]; rotVec.fy=axis[1]; rotVec.fz=axis[2]; Quaternion q1; //Generate the rotating quaternion quat_get_rot_quat(&rotVec,-angle,&q1); ASSERT(src->data.size() <= totalSize); size_t pos=0; //TODO: Parallelise rotation //Copy across the ions into the target for(vector::const_iterator it=src->data.begin(); it!=src->data.end(); ++it) { p.fx=it->getPosRef()[0]-origin[0]; p.fy=it->getPosRef()[1]-origin[1]; p.fz=it->getPosRef()[2]-origin[2]; quat_rot_apply_quat(&p,&q1); //set the position for the given ion d->data[pos].setPos(p.fx+origin[0], p.fy+origin[1],p.fz+origin[2]); d->data[pos].setMassToCharge(it->getMassToCharge()); //update progress every CALLBACK ions if(!curProg--) { n+=NUM_CALLBACK; progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } curProg=NUM_CALLBACK; } pos++; } ASSERT(d->data.size() == src->data.size()); cacheAsNeeded(d); getOut.push_back(d); break; } default: getOut.push_back(dataIn[ui]); break; } break; } case MODE_SPATIAL_NOISE: { ASSERT(scalarParams.size() ==1 && vectorParams.size()==0); switch(dataIn[ui]->getStreamType()) { case STREAM_TYPE_IONS: { //Set up scaling output ion stream IonStreamData *d=new IonStreamData; d->parent=this; const IonStreamData *src = (const IonStreamData *)dataIn[ui]; try { d->data.resize(src->data.size()); } catch(std::bad_alloc) { delete d; return ERR_NOMEM; } d->r = src->r; d->g = src->g; d->b = src->b; d->a = src->a; d->ionSize = src->ionSize; d->valueType=src->valueType; float scaleFactor=scalarParams[0]; ASSERT(src->data.size() <= totalSize); unsigned int curProg=NUM_CALLBACK; //NOTE: This *cannot* be parallelised without parallelising the random // number generator safely. If using multiple random number generators, // one would need to ensure sufficient entropy in EACH generator. This // is not trivial to prove, and so has not been done here. Bootstrapping // each random number generator using non-random seeds could be problematic // same as feeding back a random number into other rng instances // // One solution is to use the unix /dev/urandom interface or the windows // cryptographic API, alternatively use the TR1 header's Mersenne twister with // multi-seeding: // http://theo.phys.sci.hiroshima-u.ac.jp/~ishikawa/PRNG/mt_stream_en.html switch(noiseType) { case NOISETYPE_WHITE: { for(size_t ui=0;uidata.size();ui++) { Point3D pt; pt.setValue(0,randGen.genUniformDev()-0.5f); pt.setValue(1,randGen.genUniformDev()-0.5f); pt.setValue(2,randGen.genUniformDev()-0.5f); pt*=scaleFactor; //set the position for the given ion d->data[ui].setPos(src->data[ui].getPosRef() + pt); d->data[ui].setMassToCharge(src->data[ui].getMassToCharge()); if(!curProg--) { curProg=NUM_CALLBACK; progress.filterProgress= (unsigned int)((float)(ui)/((float)totalSize)*100.0f); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } } } break; } case NOISETYPE_GAUSSIAN: { for(size_t ui=0;uidata.size();ui++) { Point3D pt; pt.setValue(0,randGen.genGaussDev()); pt.setValue(1,randGen.genGaussDev()); pt.setValue(2,randGen.genGaussDev()); pt*=scaleFactor; //set the position for the given ion d->data[ui].setPos(src->data[ui].getPosRef() + pt); d->data[ui].setMassToCharge(src->data[ui].getMassToCharge()); if(!curProg--) { curProg=NUM_CALLBACK; progress.filterProgress= (unsigned int)((float)(ui)/((float)totalSize)*100.0f); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } } } break; } } ASSERT(d->data.size() == src->data.size()); cacheAsNeeded(d); getOut.push_back(d); break; } default: getOut.push_back(dataIn[ui]); break; } break; } } } } else { progress.step=1; progress.filterProgress=0; progress.stepName=TRANS("Collate"); progress.maxStep=3; if(*Filter::wantAbort) return FILTER_ERR_ABORT; //we have to cross the streams (I thought that was bad?) // - Each dataset is no longer independent, and needs to // be mixed with the other datasets. Bugger; sounds mem. expensive. //Set up output ion stream IonStreamData *d=new IonStreamData; d->parent=this; //TODO: Better output colouring/size //Set up ion metadata d->r = 0.5; d->g = 0.5; d->b = 0.5; d->a = 0.5; d->ionSize = 2.0; d->valueType=TRANS("Mass-to-Charge (Da/e)"); size_t curPos=0; vector massData; //TODO: Ouch. Memory intensive -- could do a better job //of this? try { massData.resize(totalSize); d->data.resize(totalSize); } catch(std::bad_alloc) { return ERR_NOMEM; } //merge the datasets for(size_t ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *src = (const IonStreamData *)dataIn[ui]; //Loop through the ions in this stream, and copy its data value #pragma omp parallel for shared(massData,d,curPos,src) for(size_t uj=0;ujdata.size();uj++) { massData[uj+curPos] = src->data[uj].getMassToCharge(); d->data[uj+curPos].setPos(src->data[uj].getPos()); } if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } curPos+=src->data.size(); break; } default: getOut.push_back(dataIn[ui]); break; } } progress.step=2; progress.filterProgress=0; progress.stepName=TRANS("Shuffle"); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } //Shuffle the value data.TODO: callback functor #ifndef HAVE_CPP1X std::srand(time(0)); std::random_shuffle(massData.begin(),massData.end()); #else std::mt19937_64 r; r.seed(time(0)); std::shuffle(massData.begin(),massData.end(),r); #endif if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } progress.step=3; progress.filterProgress=0; progress.stepName=TRANS("Splice"); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } //Set the output data by splicing together the //shuffled values and the original position info #pragma omp parallel for shared(d,massData) for(size_t uj=0;ujdata[uj].setMassToCharge(massData[uj]); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } massData.clear(); cacheAsNeeded(d); getOut.push_back(d); } return 0; } void TransformFilter::getProperties(FilterPropGroup &propertyList) const { FilterProperty p; size_t curGroup=0; string tmpStr; vector > choices; for(unsigned int ui=0;ui > choices; for(unsigned int ui=0;ui::epsilon()) return false; if(!(vectorParams[1] == newPt )) { vectorParams[1] = newPt; needUpdate=true; clearCache(); } return true; } case KEY_ORIGINMODE: { size_t i; for (i = 0; i < ORIGINMODE_END; i++) if (value == TRANS(getOriginTypeString(i).c_str())) break; if( i == ORIGINMODE_END) return false; if(originMode != i) { originMode = i; needUpdate=true; clearCache(); } return true; } case KEY_TRANSFORM_SHOWORIGIN: { if(!applyPropertyNow(showOrigin,value,needUpdate)) return false; break; } case KEY_NOISETYPE: { size_t i; for (i = 0; i < NOISETYPE_END; i++) if (value == TRANS(getNoiseTypeString(i).c_str())) break; if( i == NOISETYPE_END) return false; if(noiseType != i) { noiseType = i; needUpdate=true; clearCache(); } break; } case KEY_CROP_MINIMUM: { ASSERT(scalarParams.size() ==2); if(!applyPropertyNow(scalarParams[0],value,needUpdate)) return false; break; } case KEY_CROP_MAXIMUM: { ASSERT(scalarParams.size() ==2); if(!applyPropertyNow(scalarParams[1],value,needUpdate)) return false; break; } default: ASSERT(false); } return true; } std::string TransformFilter::getSpecificErrString(unsigned int code) const { const char *errStrs[] = { "", "Unable to allocate memory"//Caught a memory issue, }; COMPILE_ASSERT(THREEDEP_ARRAYSIZE(errStrs) == TRANSFORM_ERR_ENUM_END); ASSERT(code < TRANSFORM_ERR_ENUM_END); return errStrs[code]; } bool TransformFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<" << trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << ""<"<"<"<" << endl; break; } default: ASSERT(false); return false; } return true; } bool TransformFilter::readState(xmlNodePtr &nodePtr, const std::string &stateFileDir) { //Retrieve user string //=== if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlChar *xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //=== //Retrieve transformation type //==== if(!XMLGetNextElemAttrib(nodePtr,transformMode,"transformmode","value")) return false; if(transformMode>= MODE_ENUM_END) return false; //==== //Retrieve origination type //==== if(!XMLGetNextElemAttrib(nodePtr,originMode,"originmode","value")) return false; if(originMode>= ORIGINMODE_END) return false; //==== //Retrieve origination type //==== if(!XMLGetNextElemAttrib(nodePtr,originMode,"noisetype","value")) return false; if(noiseType>= NOISETYPE_END) return false; //==== //Retrieve origination type //==== if(!XMLGetNextElemAttrib(nodePtr,originMode,"showorigin","value")) return false; //==== //Retrieve vector parameters //=== if(XMLHelpFwdToElem(nodePtr,"vectorparams")) return false; xmlNodePtr tmpNode=nodePtr; if(!readVectorsXML(nodePtr,vectorParams)) return false; //=== nodePtr=tmpNode; //Retrieve scalar parameters //=== if(XMLHelpFwdToElem(nodePtr,"scalarparams")) return false; if(!readScalarsXML(nodePtr,scalarParams)) return false; //=== //Check the scalar params match the selected primitive switch(transformMode) { case MODE_TRANSLATE: if(vectorParams.size() != 1 || scalarParams.size() !=0) return false; break; case MODE_SCALE_ISOTROPIC: if(vectorParams.size() != 1 || scalarParams.size() !=1) return false; break; case MODE_SCALE_ANISOTROPIC: if(vectorParams.size() != 2 || scalarParams.size() !=0) return false; break; case MODE_ROTATE: if(vectorParams.size() != 2 || scalarParams.size() !=1) return false; break; case MODE_TRANSLATE_VALUE: if(vectorParams.size() != 0 || scalarParams.size() !=1) return false; break; case MODE_VALUE_SHUFFLE: case MODE_SPATIAL_NOISE: break; case MODE_CROP_VALUE: { if(vectorParams.size() != 0 || scalarParams.size() !=2) return false; break; } default: ASSERT(false); return false; } return true; } unsigned int TransformFilter::getRefreshBlockMask() const { //Only ions cannot go through this filter. return STREAM_TYPE_IONS; } unsigned int TransformFilter::getRefreshEmitMask() const { if(showPrimitive) return STREAM_TYPE_IONS | STREAM_TYPE_DRAW; else return STREAM_TYPE_IONS; } unsigned int TransformFilter::getRefreshUseMask() const { return STREAM_TYPE_IONS; } void TransformFilter::setPropFromBinding(const SelectionBinding &b) { switch(b.getID()) { case BINDING_SPHERE_ORIGIN: b.getValue(vectorParams[0]); break; default: ASSERT(false); } clearCache(); } std::string TransformFilter::getOriginTypeString(unsigned int i) { ASSERT(ispan. //span must be a 3-wide array, and numPts will be generated. //each entry in the array should be coprime for optimal results. //filter pointer must be deleted. IonStreamData *synthDataPoints(unsigned int span[],unsigned int numPts); bool rotateTest(); bool translateTest(); bool scaleTest(); bool scaleAnisoTest(); bool shuffleTest(); class MassCompare { public: inline bool operator()(const IonHit &h1,const IonHit &h2) const {return h1.getMassToCharge()data.push_back(h); } return d; } bool rotateTest() { //Simulate some data to send to the filter vector streamIn,streamOut; IonStreamData *d= new IonStreamData; RandNumGen rng; rng.initTimer(); const unsigned int NUM_PTS=10000; //Build a sphere of data points //by rejection method d->data.reserve(NUM_PTS/2); for(unsigned int ui=0;uidata.push_back(h); } } streamIn.push_back(d); //Set up the filter itself //--- TransformFilter *f=new TransformFilter; f->setCaching(false); bool needUp; string s; TEST(f->setProperty(KEY_MODE, TRANS(TRANSFORM_MODE_STRING[MODE_ROTATE]),needUp),"Set transform mode"); float tmpVal; tmpVal=rng.genUniformDev()*M_PI*2.0; stream_cast(s,tmpVal); TEST(f->setProperty(KEY_ROTATE_ANGLE,s,needUp),"Set rotate angle"); Point3D tmpPt; //NOTE: Technically there is a nonzero chance of this failing. tmpPt=Point3D(rng.genUniformDev()-0.5f, rng.genUniformDev()-0.5f, rng.genUniformDev()-0.5f); stream_cast(s,tmpPt); TEST(f->setProperty(KEY_ROTATE_AXIS,s,needUp),"set rotate axis"); TEST(f->setProperty(KEY_ORIGINMODE, TRANS(TRANSFORM_ORIGIN_STRING[ORIGINMODE_MASSCENTRE]),needUp),"Set origin"); TEST(f->setProperty(KEY_TRANSFORM_SHOWORIGIN,"0",needUp),"Set no-show origin"); //--- //OK, so now do the rotation //Do the refresh ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"refresh error code"); delete f; TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); TEST(streamOut[0]->getNumBasicObjects() == d->data.size(),"Ion count invariance"); const IonStreamData *outData=(IonStreamData*)streamOut[0]; Point3D massCentre[2]; massCentre[0]=massCentre[1]=Point3D(0,0,0); //Now check that the mass centre has not moved for(unsigned int ui=0;uidata.size();ui++) massCentre[0]+=d->data[ui].getPos(); for(unsigned int ui=0;uidata.size();ui++) massCentre[1]+=outData->data[ui].getPos(); TEST((massCentre[0]-massCentre[1]).sqrMag() < 2.0*sqrtf(std::numeric_limits::epsilon()),"mass centre invariance"); //Rotating a sphere around its centre of mass // should not massively change the bounding box // however we don't quite have a sphere, so we could have (at the most extreme, // a cube) BoundCube bc[2]; IonHit::getBoundCube(d->data,bc[0]); IonHit::getBoundCube(outData->data,bc[1]); float volumeRat; volumeRat = bc[0].volume()/bc[1].volume(); TEST(volumeRat > 0.5f && volumeRat < 2.0f, "volume ratio test"); delete streamOut[0]; delete d; return true; } bool translateTest() { RandNumGen rng; rng.initTimer(); //Simulate some data to send to the filter vector streamIn,streamOut; IonStreamData *d; const unsigned int NUM_PTS=10000; unsigned int span[]={ 5, 7, 9 }; d=synthDataPoints(span,NUM_PTS); streamIn.push_back(d); Point3D offsetPt; //Set up the filter itself //--- TransformFilter *f=new TransformFilter; bool needUp; string s; TEST(f->setProperty(KEY_MODE, TRANSFORM_MODE_STRING[MODE_TRANSLATE],needUp),"set translate mode"); //NOTE: Technically there is a nonzero chance of this failing. offsetPt=Point3D(rng.genUniformDev()-0.5f, rng.genUniformDev()-0.5f, rng.genUniformDev()-0.5f); offsetPt[0]*=span[0]; offsetPt[1]*=span[1]; offsetPt[2]*=span[2]; stream_cast(s,offsetPt); TEST(f->setProperty(KEY_ORIGIN,s,needUp),"Set Origin"); TEST(f->setProperty(KEY_TRANSFORM_SHOWORIGIN,"0",needUp),"Set display origin"); //--- //Do the refresh ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"Refresh error code"); delete f; TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); TEST(streamOut[0]->getNumBasicObjects() == d->data.size(),"Ion count invariance"); const IonStreamData *outData=(IonStreamData*)streamOut[0]; //Bound cube should move exactly as per the translation BoundCube bc[2]; IonHit::getBoundCube(d->data,bc[0]); IonHit::getBoundCube(outData->data,bc[1]); for(unsigned int ui=0;ui<3;ui++) { for(unsigned int uj=0;uj<2;uj++) { float f; f=bc[0].getBound(ui,uj) -bc[1].getBound(ui,uj); TEST(fabs(f-offsetPt[ui]) < sqrtf(std::numeric_limits::epsilon()), "bound translation"); } } delete d; delete streamOut[0]; return true; } bool scaleTest() { //Simulate some data to send to the filter vector streamIn,streamOut; IonStreamData *d; RandNumGen rng; rng.initTimer(); const unsigned int NUM_PTS=10000; unsigned int span[]={ 5, 7, 9 }; d=synthDataPoints(span,NUM_PTS); streamIn.push_back(d); //Set up the filter itself //--- TransformFilter *f=new TransformFilter; bool needUp; string s; //Switch to scale mode (isotropic) TEST(f->setProperty(KEY_MODE, TRANS(TRANSFORM_MODE_STRING[MODE_SCALE_ISOTROPIC]),needUp),"Set scale mode"); //Switch to mass-centre origin TEST(f->setProperty(KEY_ORIGINMODE, TRANS(TRANSFORM_ORIGIN_STRING[ORIGINMODE_MASSCENTRE]),needUp),"Set origin->mass mode"); float scaleFact; //Pick some scale, both positive and negative. if(rng.genUniformDev() > 0.5) scaleFact=rng.genUniformDev()*10; else scaleFact=0.1f/(0.1f+rng.genUniformDev()); stream_cast(s,scaleFact); TEST(f->setProperty(KEY_SCALEFACTOR,s,needUp),"Set scalefactor"); //Don't show origin marker TEST(f->setProperty(KEY_TRANSFORM_SHOWORIGIN,"0",needUp),"Set show origin") //--- //Do the refresh ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"refresh error code"); delete f; TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); TEST(streamOut[0]->getNumBasicObjects() == d->data.size(),"Ion count invariance"); const IonStreamData *outData=(IonStreamData*)streamOut[0]; //Scaling around its centre of mass // should scale the bounding box by the cube of the scale factor BoundCube bc[2]; IonHit::getBoundCube(d->data,bc[0]); IonHit::getBoundCube(outData->data,bc[1]); float cubeOfScale=scaleFact*scaleFact*scaleFact; float volumeDelta; volumeDelta=fabs(bc[1].volume()/cubeOfScale - bc[0].volume() ); TEST(volumeDelta < 100.0f*sqrtf(std::numeric_limits::epsilon()), "scaled volume test"); delete streamOut[0]; delete d; return true; } bool scaleAnisoTest() { //Simulate some data to send to the filter vector streamIn,streamOut; IonStreamData *d; RandNumGen rng; rng.initTimer(); const unsigned int NUM_PTS=10000; unsigned int span[]={ 5, 7, 9 }; d=synthDataPoints(span,NUM_PTS); streamIn.push_back(d); //Set up the filter itself //--- TransformFilter *f=new TransformFilter; bool needUp; string s; //Switch to scale mode (isotropic) TEST(f->setProperty(KEY_MODE, TRANS(TRANSFORM_MODE_STRING[MODE_SCALE_ANISOTROPIC]),needUp),"Set scale mode"); //Switch to mass-centre origin TEST(f->setProperty(KEY_ORIGINMODE, TRANS(TRANSFORM_ORIGIN_STRING[ORIGINMODE_MASSCENTRE]),needUp),"Set origin->mass mode"); Point3D scaleFact; //Pick some random scale vector, both positive and negative. scaleFact=Point3D(rng.genUniformDev()*10,rng.genUniformDev()*10,rng.genUniformDev()*10); stream_cast(s,scaleFact); TEST(f->setProperty(KEY_SCALEFACTOR_ANISOTROPIC,s,needUp),"Set scalefactor"); //Don't show origin marker TEST(f->setProperty(KEY_TRANSFORM_SHOWORIGIN,"0",needUp),"Set show origin") //--- //Do the refresh ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"refresh error code"); delete f; TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); TEST(streamOut[0]->getNumBasicObjects() == d->data.size(),"Ion count invariance"); delete streamOut[0]; delete d; return true; } bool shuffleTest() { //Simulate some data to send to the filter vector streamIn,streamOut; IonStreamData *d; RandNumGen rng; rng.initTimer(); const unsigned int NUM_PTS=1000; unsigned int span[]={ 5, 7, 9 }; d=synthDataPoints(span,NUM_PTS); streamIn.push_back(d); //Set up the filter itself //--- TransformFilter *f=new TransformFilter; bool needUp; //Switch to shuffle mode TEST(f->setProperty(KEY_MODE, TRANS(TRANSFORM_MODE_STRING[MODE_VALUE_SHUFFLE]),needUp),"refresh error code"); //--- //OK, so now run the shuffle //Do the refresh ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"refresh error code"); delete f; TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); TEST(streamOut[0]->getNumBasicObjects() == d->data.size(),"Ion count invariance"); TEST(streamOut[0]->getNumBasicObjects() == d->data.size(),"Ion count invariance"); IonStreamData *outData=(IonStreamData*)streamOut[0]; //Check to see that the output masses each exist in the input, //but are not in the same sequence //--- bool sequenceDifferent=false; for(size_t ui=0;uidata.size();ui++) { if(d->data[ui].getMassToCharge() != outData->data[ui].getMassToCharge()) { sequenceDifferent=true; break; } } TEST(sequenceDifferent, "Should be shuffled - Prob. of sequence being identical in both orig & shuffled cases is very low"); //Sort masses MassCompare cmp; std::sort(outData->data.begin(),outData->data.end(),cmp); std::sort(d->data.begin(),d->data.end(),cmp); for(size_t ui=0;uidata.size();ui++) { TEST(d->data[ui].getMassToCharge() == outData->data[ui].getMassToCharge(),"Shuffle + Sort mass should be the same"); } delete streamOut[0]; delete d; return true; } #endif 3Depict-0.0.19/src/backend/filters/spatialAnalysis.h0000644000175000017500000002137012716174467021642 0ustar pcuserpcuser/* * spatialAnalysis.h - Perform various data analysis on 3D point clouds * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef SPATIALANALYSIS_H #define SPATIALANALYSIS_H #include "../filter.h" #include "../../common/translation.h" //!Spatial analysis filter class SpatialAnalysisFilter : public Filter { private: //!Colour to use for output plots ColourRGBAf rgba; //!Which algorithm to use unsigned int algorithm; //!Stopping criterion unsigned int stopMode; //!NN stopping criterion (max) unsigned int nnMax; //!Distance maximum float distMax; //!Do we have range data to use (is nonzero) bool haveRangeParent; //!The names of the incoming ions std::vector ionNames; //!Are the sources/targets enabled for a particular incoming range? std::vector ionSourceEnabled,ionTargetEnabled; //!work out which ions to count in the numerator vs denominator std::vector ionNumeratorEnabled,ionDenominatorEnabled; //RDF specific params //-------- //RDF bin count unsigned int numBins; //!Optional convex hull reduction bool excludeSurface; //!Surface reduction distance (convex hull) float reductionDistance; //!Change the NN histograms from counts to counts/nm // - this allows comparing different binwidth histograms bool normaliseNNHist; //!Do we want to display theoretical random NN distances on top? bool wantRandomNNHist; //-------- //Density filtering specific params //------- //Do we keep points with density >= cutoff (true), or // points with density < cutoff (false) bool keepDensityUpper; //Cutoff value when performing density filtering float densityCutoff; //!Vector paramaters for different primitives std::vector vectorParams; //!Scalar paramaters for different primitives std::vector scalarParams; //Reset the scalar and vector parameters // to their defaults, if the required parameters // are not available void resetParamsAsNeeded(); //------- //Binomial specific algorithms //-------- //Number of ions to target when segmenting unsigned int numIonsSegment; //Maximum aspect ratio permissible for grid entry float maxBlockAspect; //The step size in the composition space float binWidth; //Direction in which to perform grid extrusion size_t extrusionDirection; //Do we show the frequency plot? bool showBinomialFrequencies; bool showNormalisedBinomialFrequencies; //Do we show the theoretical frequency distributions? bool showTheoreticFrequencies; //Do we show the overlaid extruded grid? bool showGridOverlay; //-------- //Replace specific code //--------- //file to use as other data source std::string replaceFile; //replacement operator mode unsigned int replaceMode; //distance up to which to allow replacement float replaceTolerance; //should we replace the current mass by the other file's ? bool replaceMass; //--------- //Radial distribution function - creates a 1D histogram of spherical atom counts, centered around each atom size_t algorithmRDF(ProgressData &progress, size_t totalDataSize, const std::vector &dataIn, std::vector &getOut,const RangeFile *rngF); //Local density function - places a sphere around each point to compute per-point density size_t algorithmDensity(ProgressData &progress, size_t totalDataSize, const std::vector &dataIn, std::vector &getOut); //Density filter function - same as density function, but then drops points from output // based upon their local density and some density cutoff data size_t algorithmDensityFilter(ProgressData &progress, size_t totalDataSize, const std::vector &dataIn, std::vector &getOut); size_t algorithmAxialDf(ProgressData &progress, size_t totalDataSize, const std::vector &dataIn, std::vector &getOut,const RangeFile *rngF); size_t algorithmBinomial(ProgressData &progress, size_t totalDataSize, const std::vector &dataIn, std::vector &getOut,const RangeFile *rngF); size_t algorithmReplace(ProgressData &progress, size_t totalDataSize, const std::vector &dataIn, std::vector &getOut); //Local concentration algorithm, as described by 10.1016/j.jnucmat.2014.03.034 // TODO: Better reference? // - I think implementations pre-date this paper, as I know of this algorithm from much earlier than 2014 size_t algorithmLocalConcentration(ProgressData &progress, size_t totalDataSize, const std::vector &dataIn, std::vector &getOut, const RangeFile *rngF); //Create a 3D manipulable cylinder as an output drawable // using the parameters stored inside the vector/scalar params // both parameters are outputs from this function void createCylinder(DrawStreamData* &d, SelectionDevice * &s) const; //Wrapper routeine to create the appropriate selection // device for whatever algorithm is in use; device list will be appended to // and if needed, output object will be generated void createDevice(std::vector &getOut); //From the given input ions, filter them down using the user // selection for ranges. If sourceFilter is true, filter by user // source selection, otherwise by user target selection void filterSelectedRanges(const std::vector &ions, bool sourceFilter, const RangeFile *rngF, std::vector &output) const; public: SpatialAnalysisFilter(); //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; //!Initialise filter prior to tree propagation virtual void initFilter(const std::vector &dataIn, std::vector &dataOut); //!Returns -1, as range file cache size is dependant upon input. virtual size_t numBytesForCache(size_t nObjects) const; //!Returns FILTER_TYPE_SPATIAL_ANALYSIS unsigned int getType() const { return FILTER_TYPE_SPATIAL_ANALYSIS;}; //update filter unsigned int refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress); //!Get the type string for this fitler virtual std::string typeString() const { return std::string(TRANS("Spat. Analysis"));}; //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter bool setProperty(unsigned int key, const std::string &value, bool &needUpdate); //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Dump state to output stream, using specified format bool writeState(std::ostream &f,unsigned int format, unsigned int depth=0) const; //!write an overridden filename version of the state virtual bool writePackageState(std::ostream &f, unsigned int format, const std::vector &valueOverrides,unsigned int depth=0) const; //Obtain the state file override void getStateOverrides(std::vector &externalAttribs) const; //!Read the state of the filter from XML file. If this //fails, filter will be in an undefined state. bool readState(xmlNodePtr &node, const std::string &packDir); //!Get the stream types that will be dropped during ::refresh unsigned int getRefreshBlockMask() const; //!Get the stream types that will be generated during ::refresh unsigned int getRefreshEmitMask() const; //!Get the stream types that will be possibly used during ::refresh unsigned int getRefreshUseMask() const; //!Set internal property value using a selection binding void setPropFromBinding(const SelectionBinding &b) ; //Set the filter's Title "user string" void setUserString(const std::string &s); #ifdef DEBUG bool runUnitTests(); #endif }; #endif 3Depict-0.0.19/src/backend/filters/externalProgram.h0000644000175000017500000000700412640746376021651 0ustar pcuserpcuser/* * externalProgram.h - Call out external programs as data sources/sinks * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef EXTERNALPROGRAM_H #define EXTERNALPROGRAM_H #include "../filter.h" #include "../../common/translation.h" enum { EXTERNALPROGRAM_KEY_COMMAND, EXTERNALPROGRAM_KEY_WORKDIR, EXTERNALPROGRAM_KEY_ALWAYSCACHE, EXTERNALPROGRAM_KEY_CLEANUPINPUT }; //!External program filter class ExternalProgramFilter : public Filter { //!The command line strings; prior to expansion std::string commandLine; //!Working directory for program std::string workingDir; //!Always cache output from program bool alwaysCache; //!Erase generated input files for ext. program after running? bool cleanInput; static size_t substituteVariables(const std::string &commandStr, const std::vector &ions, const std::vector &plots, std::string &substitutedCommand); public: //!As this launches external programs, this could be misused. bool canBeHazardous() const {return true;} ExternalProgramFilter(); virtual ~ExternalProgramFilter(){}; Filter *cloneUncached() const; //!Returns cache size as a function fo input virtual size_t numBytesForCache(size_t nObjects) const; //!Returns FILTER_TYPE_EXTERNALPROC unsigned int getType() const { return FILTER_TYPE_EXTERNALPROC;}; //update filter unsigned int refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress); virtual std::string typeString() const { return std::string(TRANS("Ext. Program"));}; //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter bool setProperty(unsigned int key, const std::string &value, bool &needUpdate); //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Dump state to output stream, using specified format bool writeState(std::ostream &f,unsigned int format, unsigned int depth=0) const; //!Read the state of the filter from XML file. If this //fails, filter will be in an undefined state. bool readState(xmlNodePtr &node, const std::string &packDir); //!Get the stream types that will be dropped during ::refresh unsigned int getRefreshBlockMask() const; //!Get the stream types that will be generated during ::refresh unsigned int getRefreshEmitMask() const; //!Get the stream types possibly used during ::refresh unsigned int getRefreshUseMask() const; //!Set internal property value using a selection binding (Disabled, this filter has no bindings) void setPropFromBinding(const SelectionBinding &b) ; #ifdef DEBUG bool runUnitTests(); bool substituteTest(); #endif }; #endif 3Depict-0.0.19/src/backend/filters/filterCommon.h0000644000175000017500000001360412720624201021115 0ustar pcuserpcuser/* * filterCommon.h - Helper routines for filter classes * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef FILTERCOMMON_H #define FILTERCOMMON_H #include "../filter.h" #include "common/stringFuncs.h" #include "common/basics.h" #include "common/xmlHelper.h" #include "backend/APT/APTRanges.h" //QHull library #ifdef __POWERPC__ #pragma push_macro("__POWERPC__") #define __POWERPC__ 1 #endif extern "C" { #include } #ifdef __POWERPC__ #pragma pop_macro("__POWERPC__") #endif enum { HULL_ERR_NO_MEM=1, HULL_ERR_USER_ABORT, HULL_ERR_ENUM_END }; //TODO: Namespace this into the filter base class? const size_t PROGRESS_REDUCE=5000; //serialise 3D std::vectors to specified output stream in XML format void writeVectorsXML(std::ostream &f, const char *containerName, const std::vector &vectorParams, unsigned int depth); //Serialise out "enabled" ions as XML. If the iput vectors are not of equal length, // no data will be written void writeIonsEnabledXML(std::ostream &f, const char *containerName, const std::vector &enabledState, const std::vector &names, unsigned int depth); //Read an enabled ions file as XML void readIonsEnabledXML(xmlNodePtr nodePtr, vector &enabledStatus, vector &names); //serialise 3D scalars to specified output stream in XML format // - depth is tab indentation depth // - container name for : (newline) template void writeScalarsXML(std::ostream &f, const char *containerName, const std::vector &scalarParams, unsigned int depth) { f << tabs(depth) << "<" << containerName << ">" << std::endl; for(unsigned int ui=0; ui" << std::endl; f << tabs(depth) << "" << std::endl; } //Nodeptr must be pointing at container node template bool readScalarsXML(xmlNodePtr nodePtr,std::vector &scalarParams) { std::string tmpStr; nodePtr=nodePtr->xmlChildrenNode; scalarParams.clear(); while(!XMLHelpFwdToElem(nodePtr,"scalar")) { xmlChar *xmlString; T v; //Get value xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(v,tmpStr)) return false; scalarParams.push_back(v); } return true; } //serialise 3D std::vectors to specified output stream in XML format bool readVectorsXML(xmlNodePtr nodePtr, std::vector &vectorParams); //Parse a "colour" node, extracting rgba data bool parseXMLColour(xmlNodePtr &nodePtr, ColourRGBAf &rgbaf); //Returns the ion stream's range ID from the rangefile, if and only if it every ion in input // is ranged tht way. Otherwise returns -1. unsigned int getIonstreamIonID(const IonStreamData *d, const RangeFile *r); inline void assignIonData(Point3D &p, const IonHit &h) { p = h.getPosRef(); } inline void assignIonData(IonHit &p, const IonHit &h) { p = h; } //!Extend a point data vector using some ion data. // Offset is the position to start inserting in the destination array. // Will fail if user abort is detected template unsigned int extendDataVector(std::vector &dest, const std::vector &vIonData, unsigned int &progress, size_t offset) { unsigned int curProg=NUM_CALLBACK; unsigned int n =offset; #ifdef _OPENMP //Parallel version bool spin=false; #pragma omp parallel for shared(spin) for(size_t ui=0;ui &dataIn); //Compute the convex hull of a set of input points from fiilterstream data unsigned int computeConvexHull(const std::vector &data, unsigned int *progress, std::vector &hullPts, bool wantVolume, bool freeHull=true); //Compute the convex hull of a set of input points unsigned int computeConvexHull(const std::vector &data, unsigned int *progress, const bool &abortPtr, std::vector &hullPts, bool wantVolume, bool freeHull=true); //Release the memory held by qhull, and notify the computeConvexHull routines that this has been done void freeConvexHull(); //Draw a colour bar DrawColourBarOverlay *makeColourBar(float minV, float maxV,size_t nColours,size_t colourMap, bool reverseMap=false, float alpha=1.0f) ; //Create a temporary filename, optionally providing an extension to use/ // - note that any subdirs will be automatically created if needed. std::string createTmpFilename(const char *dir=NULL,const char *extension=NULL); #endif 3Depict-0.0.19/src/backend/filters/spectrumPlot.h0000644000175000017500000000764712640746376021215 0ustar pcuserpcuser/* * spectrumPlot.h - Compute histograms of values for valued 3D point data * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef SPECTRUMPLOT_H #define SPECTRUMPLOT_H #include "../filter.h" #include "../../common/translation.h" //!Spectrum plot filter class SpectrumPlotFilter : public Filter { private: //minimum and maximum plot bounds float minPlot,maxPlot; //step size to use for histogram binning float binWidth; //automatically determine plot limits? bool autoExtrema; //plots should be sown in log mode? bool logarithmic; //perform fitting unsigned int fitMode; // when fitting, only show the corrected spectrum, rather than fit itself bool showOnlyCorrected; //start/end of mass values to use when fitting mass spectrum float massBackStart, massBackEnd; //Vector of spectra. Each spectra is comprised of a sorted Y data std::vector< std::vector > spectraCache; ColourRGBAf rgba; unsigned int plotStyle; //!Normalisation mode for scaling plot intensity unsigned int normaliseMode; //!Lower and upper bound for normalisation of spectrum. // used to "crop" spectra when searching for normalisation std::pair normaliseBounds; void normalise(std::vector > &spectrumData) const; public: SpectrumPlotFilter(); //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; //!Returns FILTER_TYPE_SPECTRUMPLOT unsigned int getType() const { return FILTER_TYPE_SPECTRUMPLOT;}; //!Get approx number of bytes for caching output size_t numBytesForCache(size_t nObjects) const; //!update filter unsigned int refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress); virtual std::string typeString() const { return std::string(TRANS("Spectrum"));}; //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter. Returns true if prop set OK bool setProperty(unsigned int key, const std::string &value, bool &needUpdate); //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Set the user string. void setUserString(const std::string &s); //!Dump state to output stream, using specified format bool writeState(std::ostream &f,unsigned int format, unsigned int depth=0) const; //!Read the state of the filter from XML file. If this //fails, filter will be in an undefined state. bool readState(xmlNodePtr &node, const std::string &packDir); //!Get the stream types that will be dropped during ::refresh unsigned int getRefreshBlockMask() const; //!Get the stream types that will be generated during ::refresh unsigned int getRefreshEmitMask() const; //!Get the stream types that will be possibly used during ::refresh unsigned int getRefreshUseMask() const; //!Set internal property value using a selection binding (Disabled, this filter has no bindings) void setPropFromBinding(const SelectionBinding &b) ; //!Does the filer need unranged data to operate? bool needsUnrangedData() const; #ifdef DEBUG bool runUnitTests() ; #endif }; #endif 3Depict-0.0.19/src/backend/filters/allFilter.cpp0000644000175000017500000000565212716174467020757 0ustar pcuserpcuser/* * allFilter.cpp - factory functions for filter classes * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "allFilter.h" //Filter "factory" type function. If this gets too big, //we could use a pre-populated hashtable in //a static class to speed things up. //returns null pointer if string is invalid Filter *makeFilter(const std::string &s) { Filter *f; unsigned int type=(unsigned int)-1; for(unsigned int ui=0;uitrueName() == s); #endif return f; } bool isValidFilterName(const std::string &s) { for(unsigned int ui=0;uitypeString()) return t; delete t; } ASSERT(false); } 3Depict-0.0.19/src/backend/filters/externalProgram.cpp0000644000175000017500000005257712640746376022223 0ustar pcuserpcuser/* * externalProgram.cpp - Call out external programs as a datasource/sink * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "externalProgram.h" #include "filterCommon.h" #include "../../wx/wxcommon.h" #include "backend/APT/APTFileIO.h" #include "backend/plot.h" #include #include using std::vector; using std::string; using std::pair; using std::make_pair; //!Error codes enum { COMMANDLINE_FAIL=1, SYSTEM_EXEC_FAIL, SETWORKDIR_FAIL, WRITEPOS_FAIL, WRITEPLOT_FAIL, MAKEDIR_FAIL, PLOTCOLUMNS_FAIL, READPLOT_FAIL, READPOS_FAIL, SUBSTITUTE_FAIL, COMMAND_FAIL, EXT_PROG_ERR_ENUM_END, }; //=== External program filter === ExternalProgramFilter::ExternalProgramFilter() : alwaysCache(false), cleanInput(true) { cacheOK=false; cache=false; } Filter *ExternalProgramFilter::cloneUncached() const { ExternalProgramFilter *p=new ExternalProgramFilter(); //Copy the values p->workingDir=workingDir; p->commandLine=commandLine; p->alwaysCache=alwaysCache; p->cleanInput=cleanInput; //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->userString=userString; return p; } size_t ExternalProgramFilter::numBytesForCache(size_t nObjects) const { if(alwaysCache) return 0; else return (size_t)-1; //Say we don't know, we are not going to cache anyway. } size_t ExternalProgramFilter::substituteVariables(const std::string &commandStr, const vector &ionOutputNames, const vector &plotOutputNames,std::string &substitutedCommand) { vector commandLineSplit; splitStrsRef(commandStr.c_str(),' ',commandLineSplit); //Nothing to do if(commandLineSplit.empty()) return 0; //Construct the command, using substitution string command; unsigned int ionOutputPos,plotOutputPos; ionOutputPos=plotOutputPos=0; command = commandLineSplit[0]; for(unsigned int ui=1;ui &dataIn, std::vector &getOut, ProgressData &progress) { //use the cached copy if we have it. if(cacheOK) { propagateCache(getOut); progress.filterProgress=100; return 0; } if(commandLine.empty()) { progress.filterProgress=100; return 0; } vector ionOutputNames,plotOutputNames; //Compute the bounding box of the incoming streams string s; wxString tempDir; if(workingDir.size()) tempDir=((workingDir) +wxT("/inputData")); else tempDir=(wxT("inputData")); //Create a temporary dir if(!wxDirExists(tempDir) ) { //Audacity claims that this can return false even on //success (NoiseRemoval.cpp, line 148). //I was having problems with this function too; //so use their workaround wxMkdir(tempDir); if(!wxDirExists(tempDir) ) return MAKEDIR_FAIL; } progress.maxStep=3; progress.step=1; progress.stepName=TRANS("Collate Input"); for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *i; i = (const IonStreamData * )(dataIn[ui]); if(i->data.empty()) break; //Save the data to a file wxString tmpStr; tmpStr=wxFileName::CreateTempFileName(tempDir+ wxT("/pointdata")); //wxwidgets has no suffix option... annoying. wxRemoveFile(tmpStr); s = stlStr(tmpStr); s+=".pos"; if(IonHit::makePos(i->data,s.c_str())) { //Uh-oh problem. Clean up and exit return WRITEPOS_FAIL; } ionOutputNames.push_back(s); break; } case STREAM_TYPE_PLOT: { const PlotStreamData *i; i = (const PlotStreamData * )(dataIn[ui]); if(i->xyData.empty()) break; //Save the data to a file wxString tmpStr; tmpStr=wxFileName::CreateTempFileName(tempDir + wxT("/plot")); //wxwidgets has no suffix option... annoying. wxRemoveFile(tmpStr); s = stlStr(tmpStr); s+= ".xy"; if(!writeTextFile(s.c_str(),i->xyData)) { //Uh-oh problem. Clean up and exit return WRITEPLOT_FAIL; } plotOutputNames.push_back(s); break; } default: break; } } //Nothing to do. if(plotOutputNames.empty() && ionOutputNames.empty()) { progress.filterProgress=100; return 0; } std::string substitutedCommand; size_t errCode; errCode=substituteVariables(commandLine,ionOutputNames,plotOutputNames, substitutedCommand); if(errCode) return errCode; //If we have a specific working dir; use it. Otherwise just use curdir wxString origDir = wxGetCwd(); if(workingDir.size()) { //Set the working directory before launching if(!wxSetWorkingDirectory((workingDir))) return SETWORKDIR_FAIL; } else { if(!wxSetWorkingDirectory(wxT("."))) return SETWORKDIR_FAIL; } int result; progress.step=2; progress.stepName=TRANS("Execute"); //Execute the program //TODO: IO redirection - especially under windows? result=std::system(substitutedCommand.c_str()); if(result == -1) return SYSTEM_EXEC_FAIL; if(cleanInput) { //If program returns error, this was a problem //delete the input files. for(unsigned int ui=0;uiGetAllFiles((workingDir),a,wxT("*.pos"),wxDIR_FILES); else dir->GetAllFiles(wxGetCwd(),a,wxT("*.pos"),wxDIR_FILES); progress.step=3; progress.stepName=TRANS("Collate output"); //read the output files, which is assumed to be any "pos" file //in the working dir for(unsigned int ui=0;uiCount(); ui++) { wxULongLong size; size = wxFileName::GetSize((*a)[ui]); if( (size !=0) && size!=wxInvalidSize) { //Load up the pos file string sTmp; wxString wxTmpStr; wxTmpStr=(*a)[ui]; sTmp = stlStr(wxTmpStr); unsigned int dummy; IonStreamData *d = new IonStreamData(); d->parent=this; //TODO: some kind of secondary file for specification of //ion attribs? d->r = 1.0; d->g=0; d->b=0; d->a=1.0; d->ionSize = 2.0; unsigned int index2[] = { 0, 1, 2, 3 }; if(GenericLoadFloatFile(4, 4, index2, d->data,sTmp.c_str(),dummy,*(Filter::wantAbort))) { delete d; delete dir; return READPOS_FAIL; } if(alwaysCache) { d->cached=1; filterOutputs.push_back(d); } else d->cached=0; getOut.push_back(d); } } a->Clear(); if(workingDir.size()) dir->GetAllFiles((workingDir),a,wxT("*.xy"),wxDIR_FILES); else dir->GetAllFiles(wxGetCwd(),a,wxT("*.xy"),wxDIR_FILES); //read the output files, which is assumed to be any "pos" file //in the working dir for(unsigned int ui=0;uiCount(); ui++) { wxULongLong size; size = wxFileName::GetSize((*a)[ui]); if( (size !=0) && size!=wxInvalidSize) { string sTmp; wxString wxTmpStr; wxTmpStr=(*a)[ui]; sTmp = stlStr(wxTmpStr); vector > dataVec; vector header; //Possible delimiters to try when loading file //try each in turn const char *delimString ="\t, "; if(loadTextData(sTmp.c_str(),dataVec,header,delimString)) { delete dir; return READPLOT_FAIL; } //Check that the input has the correct size for(unsigned int uj=0;ujparent=this; d->r = 0.0; d->g=1.0; d->b=0; d->a=1.0; d->index=uj; d->plotMode=PLOT_MODE_1D; d->plotStyle=PLOT_LINE_LINES; //set the title to the filename (trim the .xy extension //and the working directory name) string tmpFilename; tmpFilename=sTmp.substr(workingDir.size(),sTmp.size()- workingDir.size()-3); d->dataLabel=getUserString() + string(":") + onlyFilename(tmpFilename); if(applyLabels) { //set the xy-labels to the column headers d->xLabel=header[uj]; d->yLabel=header[uj+1]; } else { d->xLabel="x"; d->yLabel="y"; } d->xyData.resize(dataVec[uj].size()); ASSERT(dataVec[uj].size() == dataVec[uj+1].size()); for(unsigned int uk=0;ukxyData[uk]=make_pair(dataVec[uj][uk], dataVec[uj+1][uk]); } if(alwaysCache) { d->cached=1; filterOutputs.push_back(d); } else d->cached=0; getOut.push_back(d); } } } if(alwaysCache) cacheOK=true; delete dir; delete a; progress.filterProgress=100; return 0; } void ExternalProgramFilter::getProperties(FilterPropGroup &propertyList) const { std::string tmpStr; size_t curGroup=0; FilterProperty p; p.name=TRANS("Command"); p.data= commandLine; p.type=PROPERTY_TYPE_STRING; p.helpText=TRANS("Full command to send to operating system. See manual for escape sequence meanings"); p.key=EXTERNALPROGRAM_KEY_COMMAND; propertyList.addProperty(p,curGroup); p.name=TRANS("Work Dir"); p.data= workingDir; p.type=PROPERTY_TYPE_DIR; p.helpText=TRANS("Directory to run the command in"); p.key=EXTERNALPROGRAM_KEY_WORKDIR; propertyList.addProperty(p,curGroup); propertyList.setGroupTitle(curGroup,TRANS("Command")); curGroup++; tmpStr=boolStrEnc(cleanInput); p.name=TRANS("Cleanup input"); p.data=tmpStr; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Erase input files when command completed"); p.key=EXTERNALPROGRAM_KEY_CLEANUPINPUT; propertyList.addProperty(p,curGroup); tmpStr=boolStrEnc(alwaysCache); p.name=TRANS("Cache"); p.data=tmpStr; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Assume program does not alter its output, unless inputs from 3Depict are altered"); p.key=EXTERNALPROGRAM_KEY_ALWAYSCACHE; propertyList.addProperty(p,curGroup); propertyList.setGroupTitle(curGroup,TRANS("Data")); } bool ExternalProgramFilter::setProperty( unsigned int key, const std::string &value, bool &needUpdate) { needUpdate=false; switch(key) { case EXTERNALPROGRAM_KEY_COMMAND: { if(!applyPropertyNow(commandLine,value,needUpdate)) return false; break; } case EXTERNALPROGRAM_KEY_WORKDIR: { if(workingDir!=value) { //Check the directory exists if(!wxDirExists((value))) return false; workingDir=value; needUpdate=true; clearCache(); } break; } case EXTERNALPROGRAM_KEY_ALWAYSCACHE: { if(!applyPropertyNow(alwaysCache,value,needUpdate)) return false; break; } case EXTERNALPROGRAM_KEY_CLEANUPINPUT: { if(!applyPropertyNow(cleanInput,value,needUpdate)) return false; break; } default: ASSERT(false); } return true; } std::string ExternalProgramFilter::getSpecificErrString(unsigned int code) const { const char *errStrs[] = { "", "Error processing command line", "Unable to launch external program", "Unable to set working directory", "Error saving posfile result for external program", "Error saving plot result for externalprogram", "Error creating temporary directory", "Detected unusable number of columns in plot", "Unable to parse plot result from external program", "Unable to load ions from external program", "Unable to perform commandline substitution", "Error executing external program, returned nonzero" }; COMPILE_ASSERT(THREEDEP_ARRAYSIZE(errStrs) == EXT_PROG_ERR_ENUM_END); ASSERT(code < EXT_PROG_ERR_ENUM_END); return errStrs[code]; } void ExternalProgramFilter::setPropFromBinding(const SelectionBinding &b) { ASSERT(false); } bool ExternalProgramFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<" << trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth) << "" << endl; break; } default: ASSERT(false); return false; } return true; } bool ExternalProgramFilter::readState(xmlNodePtr &nodePtr, const std::string &stateFileDir) { //Retrieve user string if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlChar *xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //Retrieve command if(XMLHelpFwdToElem(nodePtr,"commandline")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"name"); if(!xmlString) return false; commandLine=(char *)xmlString; xmlFree(xmlString); //Retrieve working dir if(XMLHelpFwdToElem(nodePtr,"workingdir")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"name"); if(!xmlString) return false; workingDir=(char *)xmlString; xmlFree(xmlString); //get should cache string tmpStr; if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"alwayscache","value")) return false; if(!boolStrDec(tmpStr,alwaysCache)) return false; //check readable if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"cleaninput","value")) return false; if(!boolStrDec(tmpStr,cleanInput)) return false; return true; } unsigned int ExternalProgramFilter::getRefreshBlockMask() const { //Absolutely nothing can go through this filter. return 0; } unsigned int ExternalProgramFilter::getRefreshEmitMask() const { //Can only generate ion streams and plot streams return STREAM_TYPE_IONS | STREAM_TYPE_PLOT; } unsigned int ExternalProgramFilter::getRefreshUseMask() const { return STREAM_TYPE_IONS | STREAM_TYPE_PLOT; } #ifdef DEBUG #include using std::auto_ptr; using std::ifstream; bool echoTest() { int errCode; #if !defined(__WIN32__) && !defined(__WIN64__) errCode=system("echo testing... > /dev/null"); #else errCode=system("echo testing... > NUL"); #endif if(errCode) { WARN(false,"Unable to perform echo test on this system -- echo missing?"); return true; } ExternalProgramFilter* f = new ExternalProgramFilter; f->setCaching(false); bool needUp; string s; wxString tmpFilename; tmpFilename=wxFileName::CreateTempFileName(wxT("")); s = string(" echo test > ") + stlStr(tmpFilename); TEST(f->setProperty(EXTERNALPROGRAM_KEY_COMMAND,s,needUp),"Set prop"); //Simulate some data to send to the filter vector streamIn,streamOut; ProgressData p; f->refresh(streamIn,streamOut,p); s=stlStr(tmpFilename); ifstream file(s.c_str()); TEST(file,"echo retrieval"); wxRemoveFile(tmpFilename); delete f; return true; } IonStreamData* createTestPosData(unsigned int numPts) { IonStreamData* d= new IonStreamData; d->data.resize(numPts); for(unsigned int ui=0;uidata[ui].setPos(ui,ui,ui); d->data[ui].setMassToCharge(ui); } return d; } bool posTest() { const unsigned int NUM_PTS=100; auto_ptr someData; someData.reset(createTestPosData(NUM_PTS)); ExternalProgramFilter* f = new ExternalProgramFilter; f->setCaching(false); bool needUp; string s; wxString tmpFilename,tmpDir; tmpDir=wxFileName::GetTempDir(); #if defined(__WIN32__) || defined(__WIN64__) tmpDir=tmpDir + wxT("\\3Depict\\"); #else tmpDir=tmpDir + wxT("/3Depict/"); #endif if(wxDirExists(tmpDir)) { wxFileName dirFile(tmpDir); dirFile.Rmdir( wxPATH_RMDIR_RECURSIVE); } wxMkdir(tmpDir); std::string randName; genRandomFilename(randName); tmpFilename = tmpDir + "/" + randName + ".pos"; s ="mv -f \%i " + tmpFilename; ASSERT(tmpFilename.size()); TEST(f->setProperty(EXTERNALPROGRAM_KEY_COMMAND,s,needUp),"Set prop"); TEST(f->setProperty(EXTERNALPROGRAM_KEY_WORKDIR,stlStr(tmpDir),needUp),"Set prop"); //Simulate some data to send to the filter vector streamIn,streamOut; streamIn.push_back(someData.get()); ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"refresh error code"); //Should have exactly one stream, which is an ion stream TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); TEST(streamOut[0]->getNumBasicObjects() ==NUM_PTS,"Number of ions"); const IonStreamData* out =(IonStreamData*) streamOut[0]; for(unsigned int ui=0;uidata.size();ui++) { TEST(out->data[ui].getPos() == someData->data[ui].getPos(),"position"); TEST(out->data[ui].getMassToCharge() == someData->data[ui].getMassToCharge(),"position"); } wxRemoveFile(tmpFilename); wxRmdir(tmpDir+wxT("inputData")); wxRmdir(tmpDir); delete streamOut[0]; delete f; return true; } bool ExternalProgramFilter::substituteTest() { vector ionNames,plotNames; plotNames.push_back("some Plot.xy"); ionNames.push_back("my \"pos file.pos"); string commandLine; commandLine="echo \"My ions are \'%i\'\""; string resultString; TEST(!substituteVariables(commandLine,ionNames,plotNames,resultString),"substitution fail"); TEST(resultString == "echo \"My ions are \'my \"pos file.pos\'\"","substitution fail"); commandLine=" echo (\"%i\")"; TEST(!substituteVariables(commandLine,ionNames,plotNames,resultString),"substitution fail"); TEST(resultString == " echo (\"my \"pos file.pos\")","substitution fail"); return true; } bool ExternalProgramFilter::runUnitTests() { if(!echoTest()) return false; #ifndef __APPLE__ if(!posTest()) return false; if(!substituteTest()) return false; #endif return true; } #endif 3Depict-0.0.19/src/backend/filters/algorithms/0000755000175000017500000000000012723200266020457 5ustar pcuserpcuser3Depict-0.0.19/src/backend/filters/algorithms/binomial.cpp0000644000175000017500000005261312640746376023003 0ustar pcuserpcuser/* * binomial.cpp - Binomia distribution randomness testing * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "binomial.h" #include "common/basics.h" #include #include #include #include #include #include using std::pair; using std::vector; using std::map; using std::unique; template class CompareMagFloating { public: inline bool operator()(const T &a,const T &b) const {return fabs(a) < fabs(b); } }; const unsigned int BINOMIAL_LOWCOUNT_SKEW_THRESHOLD =5; //Helper functions //--- //Obtain an index to the row-major coordinate in array int rowMajorOffset(unsigned int x, unsigned int y, unsigned int nY); //obtain xy position from array index void rowMajorIndicies(unsigned int idx, unsigned int nY, unsigned int &x, unsigned int &y); //set the non-extrusion coordinates for a grid entry void setGridABCoords(unsigned int binIdx, unsigned int *direction,unsigned int *nBins, float *binLen, const BoundCube &totalBound, GRID_ENTRY &gridEntry); //--- int countBinnedIons(const std::vector &ions, const RangeFile *rng, const std::vector &selectedIons, const SEGMENT_OPTION &segmentOptions, vector &completedGridEntries) { //Step 1 - filter the ions to only the ranges we want to examine std::vector filteredIons; //Convert the selection into a map. map selectionMapping; for(size_t ui=0;uigetNumIons()); selectionMapping[selectedIons[ui]] = ui; } //Filter ions by ranging for(size_t ui=0;uigetIonID(ions[ui].getMassToCharge()); //Skip unranged ions if(ionID == (unsigned int)-1) continue; filteredIons.push_back(ions[ui]); } //Obtain the bounding box for the filtered ions BoundCube totalBound; IonHit::getBoundCube(filteredIons,totalBound); // Sort the ions according to their Z value //-- unsigned int extrusionAxis=segmentOptions.extrusionDirection; IonAxisCompare axisCmp(extrusionAxis); std::sort(filteredIons.begin(), filteredIons.end(),axisCmp); //-- unsigned int direction[2]; float binLen[2]; unsigned int nBins[2]; direction[0]=(extrusionAxis+1)%3; direction[1]=(extrusionAxis+2)%3; float targetL; //For now, only support autodetection of grid switch(segmentOptions.strategy) { case BINOMIAL_SEGMENT_AUTO_BRICK: { //Attempt to compute the number of ions to segment //The target volume for each grid cube float desiredVolume; desiredVolume= (float)segmentOptions.nIons/(float)filteredIons.size()*totalBound.volume(); //Compute the target cube size targetL = powf(desiredVolume,1.0f/3.0f); //Compute the actual bin size, by attempting // to make them as even as possible for(size_t ui=0; ui<2;ui++) { float s; s= totalBound.getSize(direction[ui]); nBins[ui] = s/targetL+1; binLen[ui] = s/nBins[ui]+1; } break; } default: ASSERT(false); } //Now extrude the grid through the points in the given extrusion direction GRID_ENTRY *gridEntries; size_t nGrids=nBins[0]*nBins[1]; try { gridEntries = new GRID_ENTRY[nGrids]; } catch(std::bad_alloc) { return BINOMIAL_NO_MEM; } #ifdef DEBUG BoundCube wrappingBound=totalBound; wrappingBound.expand(0.1f); #endif //Initialise the grid entries //-- float zStart = totalBound.getBound(extrusionAxis,0); #pragma omp parallel for for(size_t ui=0;uigetIonID(filteredIons[ui].getMassToCharge()); ASSERT(range!=(unsigned int)-1); //convert range ID to selection ID //TODO: It might be faster not use the map, but rather // to use a fixed (but oversized) array to do the idx remapping. // the mem cost is pretty negligible for any sensible use case ASSERT(selectionMapping.find(range) != selectionMapping.end()); selectionId= selectionMapping.find(range)->second; //Increment the nIons for the given bin gridEntries[binIdx].nIons[selectionId]++; gridEntries[binIdx].totalIons++; //Update grid end gridEntries[binIdx].endPt[extrusionAxis]=ionOffset[extrusionAxis]; //Check to see if we need to finish this grid entry if(gridEntries[binIdx].totalIons ==segmentOptions.nIons) { #ifdef DEBUG //Set the grid end gridEntries[binIdx].endPt[extrusionAxis] = filteredIons[ui].getPos()[extrusionAxis]; #endif completedGridEntries.push_back(gridEntries[binIdx]); //Reset the grid for the next round // TODO: Should we initialise zStart to this ion, // or should we snap it to the next ion we encounter? gridEntries[binIdx].startPt[extrusionAxis] =filteredIons[ui].getPos()[extrusionAxis]; gridEntries[binIdx].endPt[extrusionAxis]=filteredIons[ui].getPos()[extrusionAxis]; //Set the box x-y (where extrusion=z) coordinates. setGridABCoords(binIdx,direction,nBins, binLen,totalBound,gridEntries[binIdx]); //Set the start for the next grid, but not the end gridEntries[binIdx].startPt.setValue(extrusionAxis,gridEntries[binIdx].startPt[extrusionAxis]); for(size_t ui=0;ui killEntries; killEntries.resize(completedGridEntries.size()); for(size_t ui=0;ui segmentOptions.extrudeMaxRatio) || (aspect < 1.0f/segmentOptions.extrudeMaxRatio)); killEntries[ui]=doKill; } vectorMultiErase(completedGridEntries,killEntries); return 0; } //Vector output is a vector of frequency vectors void genBinomialHistogram(const vector &completedGridEntries, unsigned int nSelected, BINOMIAL_HIST &binHist) { vector > &mapIonFrequencies = binHist.mapIonFrequencies; mapIonFrequencies.resize(nSelected); for(size_t ui=0;ui::iterator it; size_t val; val=completedGridEntries[ui].nIons[uj]; it=mapIonFrequencies[uj].find(val); //Add these ions to the running total if(it==mapIonFrequencies[uj].end()) { //we don't have an entry for this total, so make a new one mapIonFrequencies[uj][val]=1; } else { //we do have an entry, so accumulate it->second++; } } } //Compute the normalised frequencies vector > &normFreq= binHist.normalisedFrequencies; normFreq.resize(mapIonFrequencies.size()); for(size_t ui=0;ui::const_iterator it; size_t total; total=0; for(it=mapIonFrequencies[ui].begin(); it!=mapIonFrequencies[ui].end();++it) { total+=it->second; } //Create the entries for the normalised frequency, watching out for /= 0 for(it=mapIonFrequencies[ui].begin(); it!=mapIonFrequencies[ui].end();++it) { if(total) { normFreq[ui][it->first]=(double)it->second/(double)total; } else { normFreq[ui][it->first]=0; } } } } void computeBinomialStats(const vector &gridEntries, const BINOMIAL_HIST &binHist, unsigned int nSelected, BINOMIAL_STATS &stats) { stats.nBlocks=gridEntries.size(); stats.nIons=gridEntries[0].totalIons; //Compute mean //-- stats.mean.resize(nSelected); for(size_t ui=0;ui nChiCounted; nChiCounted.resize(nSelected,0); stats.chiSquare.resize(nSelected,0); CompareMagFloating cmpMag; for(size_t ui=0;ui sortedNumbers; sortedNumbers.clear(); for(map::const_iterator it=binHist.mapIonFrequencies[ui].begin(); it!=binHist.mapIonFrequencies[ui].end();++it) { //Theoretical number of observation (probability*trials) // of the binomial double binThrObs; //The number of times we observed (numInBlock) ions. unsigned int nTimesObs; nTimesObs=it->second; //Don't count bins with a low count, as per Moody et al, we set this to 5. // This can skew the chi-square statistic if(nTimesObs first) of ion binThrObs=gsl_ran_binomial_pdf (it->first,p,nTotal)*stats.nBlocks; if(!binThrObs) continue; //Compute difference between experimental and theoretical dist func, for this bin double delta; delta=(nTimesObs-binThrObs); sortedNumbers.push_back(delta*delta/binThrObs); nChiCounted[ui]++; } std::sort(sortedNumbers.begin(),sortedNumbers.end(),cmpMag); stats.chiSquare[ui]=std::accumulate(sortedNumbers.begin(), sortedNumbers.end(),0.0); } //-- //Compute the normalised comparison coefficient, "mu" // Moody et al, Microscopy Research and Techniques. 2008 //--- stats.comparisonCoeff.resize(nSelected); for(size_t ui=0;ui bool testBinomialBinning(); bool testBinomialGSLChi(); bool testBinomialRandomnessTruePositive(); bool testBinomialRandomnessTrueNegative(); bool testBinomial() { TEST(testBinomialGSLChi(),"Binomial GSL"); TEST(testBinomialBinning(),"Binomial Binning"); TEST(testBinomialRandomnessTruePositive(),"Binomial random correctly detected"); TEST(testBinomialRandomnessTrueNegative(),"Binomial non-random correclty deteced"); return true; } void generateTestGridEntries(vector &gridEntries, unsigned int &nSelected, double underSkewFactor, double PVAL, double NTRIALS, unsigned int NSAMPLE) { nSelected=2; gsl_rng *r=gsl_rng_alloc(gsl_rng_ranlxs2); timeval tv; gettimeofday(&tv,NULL); long seed =tv.tv_usec+tv.tv_sec; gsl_rng_set(r, seed); // set seed gridEntries.resize(NSAMPLE); //Fake some binomially sampled data. // The first species will be binomially distributed. The second // is fixed to allow the first to fill quota for(size_t ui=0;ui gridEntries; generateTestGridEntries(gridEntries,nSelected,1.2,PVAL,NTRIALS,NSAMPLE); //Build the frequency histograms BINOMIAL_HIST binHist; genBinomialHistogram(gridEntries,nSelected,binHist); //Compute chi-square //----------------- double chiSq=0; for(map::iterator it = binHist.mapIonFrequencies[0].begin(); it!=binHist.mapIonFrequencies[0].end();++it) { double delta,expected; //This function computes the probability p(k) of obtaining k from a binomial distribution with parameters p and n, // gsl_ran_binomial_pdf(k,p,n) expected = gsl_ran_binomial_pdf(it->first,PVAL,NTRIALS)*NSAMPLE; delta=it->second-expected; chiSq+=delta*delta/expected; } //----------------- double pValue=1.0-gsl_cdf_chisq_P(chiSq,binHist.mapIonFrequencies[0].size()-1); //Check non-random detected (use a high threshold, as we might run this a lot, // and triggering failure should be done carefully) TEST(pValue < 0.2,"Confirmation of randomness by pvalue"); BINOMIAL_STATS binStats; computeBinomialStats(gridEntries,binHist,nSelected,binStats); TEST(binStats.pValue[0] < 0.2,"Confirmation of binomial stats pvalue"); TEST(binStats.pValueOK[0],"Pvalue reported as correctly computed"); TEST(fabs(binStats.pValue[0]-pValue)< 0.01,"cross-check pvalue computation"); return true; } bool testBinomialRandomnessTruePositive() { //Probability of an individual event being first type const double PVAL=0.7; //Number of trials per sample const double NTRIALS=100; //Number of total samples const unsigned int NSAMPLE=500; //Make a fake dataset //--- unsigned int nSelected; vector gridEntries; generateTestGridEntries(gridEntries,nSelected,1.0,PVAL,NTRIALS,NSAMPLE); //--- //Build the frequency histograms BINOMIAL_HIST binHist; genBinomialHistogram(gridEntries,nSelected,binHist); //Compute chi-square //----------------- double chiSq=0; vector sortedNumbers; for(map::iterator it = binHist.mapIonFrequencies[0].begin(); it!=binHist.mapIonFrequencies[0].end();++it) { //TODO: There are correction factors that we could use here, rather than a full discard if(it->second < BINOMIAL_LOWCOUNT_SKEW_THRESHOLD) continue; double delta,expected; //This function computes the probability p(k) of obtaining k from a binomial distribution with parameters p and n, // gsl_ran_binomial_pdf(k,p,n) expected = gsl_ran_binomial_pdf(it->first,PVAL,NTRIALS)*NSAMPLE; delta=it->second-expected; sortedNumbers.push_back(delta/expected); } CompareMagFloating cmpMag; std::sort(sortedNumbers.begin(),sortedNumbers.end(),cmpMag); chiSq=std::accumulate(sortedNumbers.begin(),sortedNumbers.end(),0.0f); //----------------- if(sortedNumbers.size() <=2) { //Skip tests if no frequency is above the skew threshold WARN(false,"Unlikely (but possible) situation occured - all binomial ions were insufficiently frequent. skipping Chi-square"); } else { double pValue=1.0-gsl_cdf_chisq_P(chiSq,binHist.mapIonFrequencies[0].size()-1); //Its random, but because we might run this test a lot, set a very low statistical threhsold TEST(pValue > 0.00001,"Confirmation of randomness by pvalue"); BINOMIAL_STATS binStats; computeBinomialStats(gridEntries,binHist,nSelected,binStats); TEST(binStats.pValue[0] > 0.00001,"Confirmation of binomial stats pvalue"); TEST(binStats.pValueOK[0],"Pvalue reported as correctly computed"); //Note that this next test is quite wide, as the pvalues are for // *two different observation underlying probabilities*. //In one, the binomial prob is known (PVAL, e.g. =0.7), in the other we estimate it //from observation - which has an error associated with it due to the //finite number of observations (e.g. pObs = 0.698). Chi-square is quite sensitive to this //difference. TEST(fabs(binStats.pValue[0]-pValue)/pValue < 2.0,"cross-check pvalue computation"); } return true; } bool testBinomialGSLChi() { //A p-table says we should get for chisq=3.94, and df = 10, p ~= 0.95 //-- double pdf=1.0-gsl_cdf_chisq_P(3.94,10); TEST(fabs(pdf - 0.95) < 0.01,"Check chi-square distribution definition (chi=3.94,df=10)"); pdf=1.0-gsl_cdf_chisq_P(10.83,1); TEST(fabs(pdf - 0.001) < 0.005,"Check Chi-square distribution definition (chi=10.83,df=1)"); pdf=1.0-gsl_cdf_chisq_P(94.9543,100); TEST(fabs(pdf-0.6238) < 0.001, "Check chi-square, chi=94.9543. Df=100"); //--- return true; } bool testBinomialBinning() { RangeFile rng; RGBf col; col.red=1.0f; col.green=col.blue=0.0f; rng.addIon("A","A",col); col.red=0.0f; col.blue=1.0f; rng.addIon("B","B",col); rng.addRange(0.5,1.5,rng.getIonID("B")); rng.addRange(1.5,2.5,rng.getIonID("B")); vector ions; ions.resize(100); RandNumGen rnd; rnd.initTimer(); for(unsigned int ui=0;ui<100; ui++) { ions[ui].setPos(rnd.genUniformDev(), rnd.genUniformDev(), rnd.genUniformDev()); ions[ui].setMassToCharge( 1 + (ui %2)); } vector selectedIons; selectedIons.push_back(0); selectedIons.push_back(1); vector g; SEGMENT_OPTION segOpt; segOpt.nIons=10; segOpt.extrusionDirection=0; segOpt.extrudeMaxRatio=1000; segOpt.strategy=BINOMIAL_SEGMENT_AUTO_BRICK; //Perform binomial segmentation TEST(!countBinnedIons(ions,&rng,selectedIons,segOpt,g), "binomial binning (auto brick mode)"); //Check that the number of grids is less than the number of ions TEST(g.size() < ions.size()/segOpt.nIons,"Full bricks only"); size_t total=0; for(size_t ui=0;ui::const_iterator it= binomialHistogram.mapIonFrequencies[ui].begin(); it!=binomialHistogram.mapIonFrequencies[ui].end();++it) { binnedTotal+=it->second; } TEST(binnedTotal < segOpt.nIons, "Number of observations at given freq should be < number total observations"); } return true; } #endif 3Depict-0.0.19/src/backend/filters/algorithms/K3DTree-mk2.cpp0000644000175000017500000006563012716174467023104 0ustar pcuserpcuser/* * K3DTree-mk2.cpp : 3D Point KD tree - precise implementation * Copyright (C) 2015 D. Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "K3DTree-mk2.h" #include "backend/APT/ionhit.h" #include #include using std::stack; using std::vector; using std::pair; unsigned int *K3DTreeMk2::progress=0; //Pointer for aborting during build process ATOMIC_BOOL *K3DTreeMk2::abort=0; class NodeWalk { public: size_t index; BoundCube cube; unsigned int depth; NodeWalk(unsigned int idx, BoundCube bc, unsigned int dpth) : index(idx), cube(bc), depth(dpth) {}; }; void K3DTreeMk2::resetPts(std::vector &p, bool clear) { //Compute bounding box for indexedPoints treeBounds.setBounds(p); indexedPoints.resize(p.size()); #pragma omp parallel for for(size_t ui=0;ui &p, bool clear) { indexedPoints.resize(p.size()); nodes.resize(p.size()); if(p.empty()) return; //Compute bounding box for indexedPoints IonHit::getBoundCube(p,treeBounds); #pragma omp parallel for for(size_t ui=0;ui > limits; stack buildStatus; stack splitStack; //Data runs from 0 to size-1 INCLUSIVE limits.push(make_pair(0,indexedPoints.size()-1)); buildStatus.push(BUILT_NONE); splitStack.push((size_t)-1); AxisCompareMk2 axisCmp; size_t numSeen=0; // for progress reporting size_t splitIndex=0; size_t *childPtr; #ifdef DEBUG for(size_t ui=0;uilimits.top().first) { //There is; we have to branch again limits.push(make_pair( limits.top().first,splitIndex-1)); buildStatus.push(BUILT_NONE); //Set the child pointer, as we don't know //the correct value until the next sort. childPtr=&nodes[splitIndex].childLeft; } else { //There is not. Set the left branch to null nodes[splitIndex].childLeft=(size_t)-1; } splitStack.push(splitIndex); break; } case BUILT_LEFT: { //Either of these cases results in use //handling the right branch. buildStatus.top()++; splitIndex=splitStack.top(); //Check to see if there is any right data if(splitIndex &pts) const { if(!treeBounds.intersects(origin,radius)) return; //parent walking queue. This contains initial parent indices that // lie within the sphere. const float sqrRadius=radius*radius; //contains all completely contained points (these points and children are in sphere) std::queue idxQueue; //queue of points whose children are partly in the sphere std::queue nodeQueue; nodeQueue.push(NodeWalk(treeRoot,treeBounds,0)); while(!nodeQueue.empty()) { size_t nodeIdx; BoundCube curCube; unsigned int depth,axis; nodeIdx = nodeQueue.front().index; curCube=nodeQueue.front().cube; depth = nodeQueue.front().depth; axis=depth %3; nodeQueue.pop() ; //obtain the left and right cubes, and see if they // -exist // -intersect the spehre // - if intersects, are they contained entirely by the sphere BoundCube leftCube,rightCube; if(nodes[nodeIdx].childLeft != (size_t) -1) { leftCube=curCube; leftCube.bounds[axis][1]=indexedPoints[nodeIdx].first[axis]; if(leftCube.intersects(origin,sqrRadius) ) { if(leftCube.containedInSphere(origin,sqrRadius)) { ASSERT(indexedPoints[nodeIdx].first.sqrDist(origin) < radius*radius); idxQueue.push(nodes[nodeIdx].childLeft); } else nodeQueue.push(NodeWalk(nodes[nodeIdx].childLeft,leftCube,depth+1)); } } if(nodes[nodeIdx].childRight != (size_t) -1) { rightCube=curCube; rightCube.bounds[axis][0]=indexedPoints[nodeIdx].first[axis]; if(rightCube.intersects(origin,sqrRadius) ) { if(rightCube.containedInSphere(origin,sqrRadius)) { //If the right-hand cube is contained within (origin,radius) sphere, then so are all its chilren ASSERT(indexedPoints[nodeIdx].first.sqrDist(origin) < sqrRadius); idxQueue.push(nodes[nodeIdx].childRight); } else nodeQueue.push(NodeWalk(nodes[nodeIdx].childRight,rightCube,depth+1)); } } if(indexedPoints[nodeIdx].first.sqrDist(origin) < sqrRadius) pts.push_back(nodeIdx); } pts.reserve(idxQueue.size()); //Walk the idx queue to enumerate all children that are in the sphere while(!idxQueue.empty()) { size_t curIdx; curIdx=idxQueue.front(); ASSERT(indexedPoints[curIdx].first.sqrDist(origin) < sqrRadius); if(nodes[curIdx].childLeft != (size_t)-1) idxQueue.push(nodes[curIdx].childLeft); if(nodes[curIdx].childRight !=(size_t) -1) idxQueue.push(nodes[curIdx].childRight); ASSERT(curIdx < nodes.size()); pts.push_back(curIdx); idxQueue.pop(); } } size_t K3DTreeMk2::findNearestUntagged(const Point3D &searchPt, const BoundCube &domainCube, bool shouldTag, size_t pseudoRoot) { //Tree must be built! ASSERT(treeRoot < nodes.size() && maxDepth <=nodes.size()) enum { NODE_FIRST_VISIT, //First visit is when you descend the tree NODE_SECOND_VISIT, //Second visit is when you come back from ->Left() NODE_THIRD_VISIT // Third visit is when you come back from ->Right() }; size_t nodeStack[maxDepth+1]; float domainStack[maxDepth+1][2]; unsigned int visitStack[maxDepth+1]; size_t bestPoint; size_t curNode; BoundCube curDomain; unsigned int visit; unsigned int stackTop; unsigned int curAxis; float bestDistSqr; float tmpEdge; if(nodes.empty()) return -1; bestPoint=(size_t)-1; bestDistSqr =std::numeric_limits::max(); curDomain=domainCube; visit=NODE_FIRST_VISIT; curAxis=0; stackTop=0; //Start at median of array, which is top of tree, //by definition, unless an alternative entry point is given size_t startNode; if(pseudoRoot==(size_t) -1) startNode=treeRoot; else startNode=pseudoRoot; curNode=startNode; //check start node if(!nodes[curNode].tagged) { float tmpDistSqr; tmpDistSqr = indexedPoints[curNode].first.sqrDist(searchPt); if(tmpDistSqr < bestDistSqr) { bestDistSqr = tmpDistSqr; bestPoint=curNode; } } do { switch(visit) { //Examine left branch case NODE_FIRST_VISIT: { if(searchPt[curAxis] < indexedPoints[curNode].first[curAxis]) { if(nodes[curNode].childLeft!=(size_t)-1) { //Check bounding box when shrunk overlaps best //estimate sphere tmpEdge= curDomain.bounds[curAxis][1]; curDomain.bounds[curAxis][1] = indexedPoints[curNode].first[curAxis]; if(!curDomain.intersects(searchPt,bestDistSqr)) { curDomain.bounds[curAxis][1] = tmpEdge; visit++; continue; } //Preserve our current state. nodeStack[stackTop]=curNode; visitStack[stackTop] = NODE_SECOND_VISIT; //Oh, It will be. It will be. domainStack[stackTop][1] = tmpEdge; domainStack[stackTop][0]= curDomain.bounds[curAxis][0]; stackTop++; //Update the current information curNode=nodes[curNode].childLeft; visit=NODE_FIRST_VISIT; curAxis++; curAxis%=3; continue; } } else { if(nodes[curNode].childRight!=(size_t)-1) { //Check bounding box when shrunk overlaps best //estimate sphere tmpEdge= curDomain.bounds[curAxis][0]; curDomain.bounds[curAxis][0] = indexedPoints[curNode].first[curAxis]; if(!curDomain.intersects(searchPt,bestDistSqr)) { curDomain.bounds[curAxis][0] =tmpEdge; visit++; continue; } //Preserve our current state. nodeStack[stackTop]=curNode; visitStack[stackTop] = NODE_SECOND_VISIT; //Oh, It will be. It will be. domainStack[stackTop][0] = tmpEdge; domainStack[stackTop][1]= curDomain.bounds[curAxis][1]; stackTop++; //Update the information curNode=nodes[curNode].childRight; visit=NODE_FIRST_VISIT; curAxis++; curAxis%=3; continue; } } visit++; //Fall through } //Examine right branch case NODE_SECOND_VISIT: { if(searchPt[curAxis]< indexedPoints[curNode].first[curAxis]) { if(nodes[curNode].childRight!=(size_t)-1) { //Check bounding box when shrunk overlaps best //estimate sphere tmpEdge= curDomain.bounds[curAxis][0]; curDomain.bounds[curAxis][0] = indexedPoints[curNode].first[curAxis]; if(!curDomain.intersects(searchPt,bestDistSqr)) { curDomain.bounds[curAxis][0] = tmpEdge; visit++; continue; } nodeStack[stackTop]=curNode; visitStack[stackTop] = NODE_THIRD_VISIT; domainStack[stackTop][0] = tmpEdge; domainStack[stackTop][1]= curDomain.bounds[curAxis][1]; stackTop++; //Update the information curNode=nodes[curNode].childRight; visit=NODE_FIRST_VISIT; curAxis++; curAxis%=3; continue; } } else { if(nodes[curNode].childLeft!=(size_t)-1) { //Check bounding box when shrunk overlaps best //estimate sphere tmpEdge= curDomain.bounds[curAxis][1]; curDomain.bounds[curAxis][1] = indexedPoints[curNode].first[curAxis]; if(!curDomain.intersects(searchPt,bestDistSqr)) { curDomain.bounds[curAxis][1] = tmpEdge; visit++; continue; } //Preserve our current state. nodeStack[stackTop]=curNode; visitStack[stackTop] = NODE_THIRD_VISIT; domainStack[stackTop][1] = tmpEdge; domainStack[stackTop][0]= curDomain.bounds[curAxis][0]; stackTop++; //Update the information curNode=nodes[curNode].childLeft; visit=NODE_FIRST_VISIT; curAxis++; curAxis%=3; continue; } } visit++; //Fall through } case NODE_THIRD_VISIT: { //Decide if we should promote the current node //to "best" (i.e. nearest untagged) node. //To promote, it mustn't be tagged, and it must //be closer than cur best estimate. if(!nodes[curNode].tagged) { float tmpDistSqr; tmpDistSqr = indexedPoints[curNode].first.sqrDist(searchPt); if(tmpDistSqr < bestDistSqr) { bestDistSqr = tmpDistSqr; bestPoint=curNode; } } //DEBUG ASSERT(stackTop%3 == curAxis) // if(curAxis) curAxis--; else curAxis=2; ASSERT(stackTop < maxDepth+1); if(stackTop) { stackTop--; visit=visitStack[stackTop]; curNode=nodeStack[stackTop]; curDomain.bounds[curAxis][0]=domainStack[stackTop][0]; curDomain.bounds[curAxis][1]=domainStack[stackTop][1]; ASSERT((stackTop)%3 == curAxis); } break; } default: ASSERT(false); } //Keep going until we meet the root node for the third time (one left, one right, one finish) }while(!(curNode== startNode && visit== NODE_THIRD_VISIT)); if(bestPoint != (size_t) -1) nodes[bestPoint].tagged|=shouldTag; return bestPoint; } size_t K3DTreeMk2::findNearestWithSkip(const Point3D &searchPt, const BoundCube &domainCube, const std::set &skipPts, size_t pseudoRoot) const { //Tree must be built! ASSERT(treeRoot < nodes.size() && maxDepth <=nodes.size()) enum { NODE_FIRST_VISIT, //First visit is when you descend the tree NODE_SECOND_VISIT, //Second visit is when you come back from ->Left() NODE_THIRD_VISIT // Third visit is when you come back from ->Right() }; size_t nodeStack[maxDepth+1]; float domainStack[maxDepth+1][2]; unsigned int visitStack[maxDepth+1]; size_t bestPoint; size_t curNode; BoundCube curDomain; unsigned int visit; unsigned int stackTop; unsigned int curAxis; float bestDistSqr; float tmpEdge; if(nodes.empty()) return -1; bestPoint=(size_t)-1; bestDistSqr =std::numeric_limits::max(); curDomain=domainCube; visit=NODE_FIRST_VISIT; curAxis=0; stackTop=0; //Start at median of array, which is top of tree, //by definition, unless an alternative entry point is given size_t startNode; if(pseudoRoot==(size_t) -1) startNode=treeRoot; else startNode=pseudoRoot; curNode=startNode; //check start node and that we have not seen this already if(!(nodes[curNode].tagged || (skipPts.find(curNode) !=skipPts.end() )) ) { float tmpDistSqr; tmpDistSqr = indexedPoints[curNode].first.sqrDist(searchPt); if(tmpDistSqr < bestDistSqr) { bestDistSqr = tmpDistSqr; bestPoint=curNode; } } do { switch(visit) { //Examine left branch case NODE_FIRST_VISIT: { if(searchPt[curAxis] < indexedPoints[curNode].first[curAxis]) { if(nodes[curNode].childLeft!=(size_t)-1) { //Check bounding box when shrunk overlaps best //estimate sphere tmpEdge= curDomain.bounds[curAxis][1]; curDomain.bounds[curAxis][1] = indexedPoints[curNode].first[curAxis]; if(!curDomain.intersects(searchPt,bestDistSqr)) { curDomain.bounds[curAxis][1] = tmpEdge; visit++; continue; } //Preserve our current state. nodeStack[stackTop]=curNode; visitStack[stackTop] = NODE_SECOND_VISIT; //Oh, It will be. It will be. domainStack[stackTop][1] = tmpEdge; domainStack[stackTop][0]= curDomain.bounds[curAxis][0]; stackTop++; //Update the current information curNode=nodes[curNode].childLeft; visit=NODE_FIRST_VISIT; curAxis++; curAxis%=3; continue; } } else { if(nodes[curNode].childRight!=(size_t)-1) { //Check bounding box when shrunk overlaps best //estimate sphere tmpEdge= curDomain.bounds[curAxis][0]; curDomain.bounds[curAxis][0] = indexedPoints[curNode].first[curAxis]; if(!curDomain.intersects(searchPt,bestDistSqr)) { curDomain.bounds[curAxis][0] =tmpEdge; visit++; continue; } //Preserve our current state. nodeStack[stackTop]=curNode; visitStack[stackTop] = NODE_SECOND_VISIT; //Oh, It will be. It will be. domainStack[stackTop][0] = tmpEdge; domainStack[stackTop][1]= curDomain.bounds[curAxis][1]; stackTop++; //Update the information curNode=nodes[curNode].childRight; visit=NODE_FIRST_VISIT; curAxis++; curAxis%=3; continue; } } visit++; //Fall through } //Examine right branch case NODE_SECOND_VISIT: { if(searchPt[curAxis]< indexedPoints[curNode].first[curAxis]) { if(nodes[curNode].childRight!=(size_t)-1) { //Check bounding box when shrunk overlaps best //estimate sphere tmpEdge= curDomain.bounds[curAxis][0]; curDomain.bounds[curAxis][0] = indexedPoints[curNode].first[curAxis]; if(!curDomain.intersects(searchPt,bestDistSqr)) { curDomain.bounds[curAxis][0] = tmpEdge; visit++; continue; } nodeStack[stackTop]=curNode; visitStack[stackTop] = NODE_THIRD_VISIT; domainStack[stackTop][0] = tmpEdge; domainStack[stackTop][1]= curDomain.bounds[curAxis][1]; stackTop++; //Update the information curNode=nodes[curNode].childRight; visit=NODE_FIRST_VISIT; curAxis++; curAxis%=3; continue; } } else { if(nodes[curNode].childLeft!=(size_t)-1) { //Check bounding box when shrunk overlaps best //estimate sphere tmpEdge= curDomain.bounds[curAxis][1]; curDomain.bounds[curAxis][1] = indexedPoints[curNode].first[curAxis]; if(!curDomain.intersects(searchPt,bestDistSqr)) { curDomain.bounds[curAxis][1] = tmpEdge; visit++; continue; } //Preserve our current state. nodeStack[stackTop]=curNode; visitStack[stackTop] = NODE_THIRD_VISIT; domainStack[stackTop][1] = tmpEdge; domainStack[stackTop][0]= curDomain.bounds[curAxis][0]; stackTop++; //Update the information curNode=nodes[curNode].childLeft; visit=NODE_FIRST_VISIT; curAxis++; curAxis%=3; continue; } } visit++; //Fall through } case NODE_THIRD_VISIT: { //Decide if we should promote the current node //to "best" (i.e. nearest untagged) node. //To promote, it mustn't be tagged, and it must //be closer than cur best estimate. if(!(nodes[curNode].tagged || (skipPts.find(curNode) !=skipPts.end()) ) ) { float tmpDistSqr; tmpDistSqr = indexedPoints[curNode].first.sqrDist(searchPt); if(tmpDistSqr < bestDistSqr) { bestDistSqr = tmpDistSqr; bestPoint=curNode; } } //DEBUG ASSERT(stackTop%3 == curAxis) // if(curAxis) curAxis--; else curAxis=2; ASSERT(stackTop < maxDepth+1); if(stackTop) { stackTop--; visit=visitStack[stackTop]; curNode=nodeStack[stackTop]; curDomain.bounds[curAxis][0]=domainStack[stackTop][0]; curDomain.bounds[curAxis][1]=domainStack[stackTop][1]; ASSERT((stackTop)%3 == curAxis); } break; } default: ASSERT(false); } //Keep going until we meet the root node for the third time (one left, one right, one finish) }while(!(curNode== startNode && visit== NODE_THIRD_VISIT)); return bestPoint; } void K3DTreeMk2::getTreesInSphere(const Point3D &pt, float sqrDist, const BoundCube &domainCube, vector > &contiguousBlocks ) const { using std::queue; using std::pair; using std::make_pair; if(treeRoot == (size_t) -1) return; queue nodeQueue; queue axisQueue; queue boundQueue; queue > limitQueue; nodeQueue.push(treeRoot); boundQueue.push(domainCube); axisQueue.push(0); limitQueue.push(make_pair(0,nodes.size()-1)); do { BoundCube tmpCube; tmpCube=boundQueue.front(); ASSERT(nodeQueue.size() == boundQueue.size() && nodeQueue.size() == axisQueue.size() && nodeQueue.size() == limitQueue.size()); //There are three cases here. // - KD limits for this subdomain // wholly contained by sphere // > contiguous subtree is interior. // - KD Limits for this subdomain partially // contained by sphere. // > some subtree may be interior -- refine. // - Does not intersect, do nothing. if(tmpCube.containedInSphere(pt,sqrDist)) { //We are? Interesting. We must be a contiguous block from our lower //to upper limits contiguousBlocks.push_back(limitQueue.front()); } else if(tmpCube.intersects(pt,sqrDist)) { size_t axis,curNode; //Not wholly contained... but our kids might be! axis=axisQueue.front(); curNode=nodeQueue.front(); if(nodes[curNode].childLeft !=(size_t)-1) { //Construct left hand domain tmpCube=boundQueue.front(); //Set upper bound tmpCube.bounds[axis][1] = indexedPoints[curNode].first[axis]; if(tmpCube.intersects(pt,sqrDist)) { //We have to examine left child. nodeQueue.push(nodes[curNode].childLeft); boundQueue.push(tmpCube); limitQueue.push(make_pair( limitQueue.front().first,curNode-1)); axisQueue.push((axis+1)%3); } } if(nodes[curNode].childRight !=(size_t)-1) { //Construct right hand domain tmpCube=boundQueue.front(); //Set lower bound tmpCube.bounds[axis][0] = indexedPoints[curNode].first[axis]; if(tmpCube.intersects(pt,sqrDist)) { //We have to examine right child. nodeQueue.push(nodes[curNode].childRight); boundQueue.push(tmpCube); limitQueue.push(make_pair(curNode+1,limitQueue.front().second )); axisQueue.push((axis+1)%3); } } } axisQueue.pop(); limitQueue.pop(); boundQueue.pop(); nodeQueue.pop(); } while(!nodeQueue.empty()); } size_t K3DTreeMk2::getBoxInTree(const BoundCube &box) const { ASSERT(treeRoot !=(size_t)-1); BoundCube curB; curB=treeBounds; int curNode=treeRoot; int curAxis=0; //user-supplied box can overlap tree area (and thus not contain the box, by loop test) // intersect the box with the tree bounds, such that it fits BoundCube subBox; subBox = curB.makeUnion(box); //If our box-to-find fits inside the current bounds, // keep refining our search area while(curB.contains(subBox)) { //Check for the tree's split axis float axisPosition; axisPosition= indexedPoints[curNode].first[curAxis]; switch(box.segmentTriple(curAxis,axisPosition)) { //query axis is below box - move lower bound up, by searching right child case 0: { curB.setBound(curAxis, 0,axisPosition); if(nodes[curNode].childRight == (size_t) -1) return curNode; curNode=nodes[curNode].childRight; break; } //intersects case 1: //Nothing we can do any more - return current node as new pseudo-root return curNode; //query axis is above target box - move upper bound down, and refine along left child case 2: { curB.setBound(curAxis,1,axisPosition); if(nodes[curNode].childLeft == (size_t) -1) return curNode; curNode=nodes[curNode].childLeft; break; } default: ASSERT(false); } curAxis++; curAxis%=3; } return curNode; } size_t K3DTreeMk2::tagCount() const { size_t count=0; for(size_t ui=0;ui &tagsToClear) { #pragma omp parallel for for(size_t ui=0;ui pts; K3DTreeMk2 tree; //First test with single point //-- pts.push_back(Point3D(0,0,0)); tree.resetPts(pts,false); //build TEST(tree.build(),"Tree build"); Point3D searchPt=Point3D(1,0,0); BoundCube dummyCube; tree.getBoundCube(dummyCube); size_t resultIdx; resultIdx=tree.findNearestUntagged(searchPt,dummyCube,false); //Only one point to find - should find it TEST(resultIdx == 0,"K3D Mk2, single point test"); //Get the contiguous nodes BoundCube testBox; testBox.setBounds(Point3D(-2,-2,-2),Point3D(2,2,2)); TEST(tree.getBoxInTree(testBox) == 0,"subtree test"); //--- //Now, try adding more points //--- pts.push_back(Point3D(1,1,1)); pts.push_back(Point3D(1.1,0.9,0.95)); tree.resetPts(pts,false); TEST(tree.build(),"Tree build"); testBox.setBounds(Point3D(1.05,0.5,0.5),Point3D(1.5,1.5,1.5)); TEST(tree.getBoxInTree(testBox)==2,"subtree test pt2"); //--- return true; } #endif 3Depict-0.0.19/src/backend/filters/algorithms/K3DTree.h0000644000175000017500000001251212640746376022051 0ustar pcuserpcuser/* * K3DTree.h - limited precision KD tree implementation * Copyright (C) 2015 D. Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef K3DTREE_H #define K3DTREE_H #include "common/basics.h" //For BoundCube class K3DNode; class AxisCompare; class K3DTree; //!Functor allowing for sorting of points in 3D /*! Used by KD Tree to sort points based around which splitting axis is being used * once the axis is set, points will be ranked based upon their relative value in * that axis only */ class AxisCompare { private: unsigned int axis; public: AxisCompare(); void setAxis(unsigned int Axis); inline bool operator()(const Point3D &p1,const Point3D &p2) const {return p1[axis]::iterator pts_start, std::vector::iterator pts_end, unsigned int depth ); size_t curNodeCount; //Counter for build operations static unsigned int *progress; //Progress counter static const ATOMIC_BOOL *abort; //aborting flag public: //KD Tree constructor K3DTree(); //!Cleans up tree, deallocates nodes ~K3DTree(); static void setProgressPtr(unsigned int *ptr){progress=ptr;} static void setAbortFlag(const ATOMIC_BOOL *ptr){abort=ptr;} /*! Builds a balanced KD tree from a list of points * This call is being passed by copy in order to prevent * re-ordering of the points. It may be worth having two calls * a pass by ref version where the points get scrambled and this one * which preserves input point ordering (due to the copy) */ void build(std::vector pts); /*! Builds a balanced KD tree from a list of points * This uses a pass by ref where the points get scrambled (sorted). * Resultant tree should be identical to that generated by build() */ void buildByRef(std::vector &pts); //Tree walker that counts the number of nodes //void verify(); //! Clean the tree void kill(); //!Find the nearest point to a given P that lies outsid some dead zone /*!deadDistSqr can be used ot disallow exact matching on NN searching * simply pass epsilon =std::numeric_limits::epsilon() * (#include ) * Boundcube is the bounding box around the entire dataset */ const Point3D *findNearest(const Point3D &, const BoundCube &, float deadDistSqr) const; //!Find the nearest N points /*!Finds the nearest N points, that lie outside a * dead distance of deadDistSqr. k is the number to find */ void findKNearest(const Point3D & sourcePoint, const BoundCube& treeDomain, unsigned int numNNs, std::vector &results, float deadDistSqr=0.0f) const; //!Textual output of tree. tabs are used to separate different levels of the tree /*!The output from this function can be quite large for even modest trees. * Recommended for debugging only*/ void dump(std::ostream &) const; //!Print the number of nodes stored in the tree inline unsigned int nodeCount() const{return treeSize;}; }; #endif 3Depict-0.0.19/src/backend/filters/algorithms/rdf.cpp0000644000175000017500000006512412716174467021765 0ustar pcuserpcuser /* * rdf.cpp - Radial distribution function implentation * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "rdf.h" #include "../filterCommon.h" #include using std::vector; #ifdef _OPENMP #include #endif //QHull library //Build fix for qhull ; wx defines powerpc without //assigning a value, causing build fail on powerpc #ifdef __POWERPC__ #pragma push_macro("__POWERPC__") #define __POWERPC__ 1 #endif extern "C" { #include } #ifdef __POWERPC__ #pragma pop_macro("__POWERPC__") #endif const unsigned int CALLBACK_REDUCE=5000; enum PointDir{ POINTDIR_TOGETHER =0, POINTDIR_IN_COMMON, POINTDIR_APART }; //!Check which way vectors attached to two 3D points "point", /*! Two vectors may point "together", /__\ "apart" \__/ or * "In common" /__/ or \__\ */ unsigned int vectorPointDir(const Point3D &pA, const Point3D &pB, const Point3D &vC, const Point3D &vD) { //Check which way vectors attached to two 3D points "point", // - "together", "apart" or "in common" //calculate AB.CA, BA.DB float dot1 = (pB-pA).dotProd(vC - pA); float dot2= (pA - pB).dotProd(vD - pB); //We shall somewhat arbitrarily call perpendicular cases "together" if(dot1 ==0.0f || dot2 == 0.0f) return POINTDIR_TOGETHER; //If they have opposite signs, then they are "in common" if(( dot1 < 0.0f && dot2 > 0.0f) || (dot1 > 0.0f && dot2 < 0.0f) ) return POINTDIR_IN_COMMON; if( dot1 < 0.0f && dot2 <0.0f ) return POINTDIR_APART; ASSERT(dot1 > 0.0f && dot2 > 0.0f ); return POINTDIR_TOGETHER; } //! Returns the shortest distance between a line segment and a given point /* The inputs are the ends of the line segment and the point. Uses the formula that * \f$ * D = \abs{\vec{PE}}\f$ * \f[ * \mathrm{~if~} \vec{PA} \cdot \vec{AB} > 0 * \rightarrow \vec{PE} = \vec{A} * \f] * \f[ * \mathrm{~if~} \vec{AB} \cdot \vec{PB} > 0 ~\&~ \vec{PA} \cdot \vec{AB} < 0 * \rightarrow \vec{PB} \cdot \frac{\vec{AB}}{\abs{\vec{AB}}} * \f] * \f[ * \mathrm{~if~} \vec{PB} \cdot \vec{AB} < 0 * \rightarrow \vec{B} * \f] */ float distanceToSegment(const Point3D &fA, const Point3D &fB, const Point3D &p) { //If the vectors a pointing "together" then use point-line formula if(vectorPointDir(fA,fB,p,p) == POINTDIR_TOGETHER) { Point3D closestPt; Point3D vAB= fB-fA; //Use formula d^2 = |(B-A)(cross)(A-P)|^2/|B-A|^2 return sqrtf( (vAB.crossProd(fA-p)).sqrMag()/(vAB.sqrMag())); } return sqrtf( std::min(fB.sqrDist(p), fA.sqrDist(p)) ); } //!Find the distance between a point, and a triangular facet -- may be positive or negative /* The inputs are the facet points (ABC) and the point P. * distance is shortest using standard plane version * \f$ D = \vec{AB} \cdot \vec{n} \f$ * iff dot products to each combination of \f$ \left( AP,BP,CP \right) \leq 0 \f$ * otherwise closest point is on the boundary of the simplex. * tested by shortest distance to each line segment (E is shortest pt. AB is line segement) * \f$ \vec{E} = \frac{\vec{AB}}{|\vec{AB}|} * ( \vec{PB} \cdot \vec{AB})\f$ */ float distanceToFacet(const Point3D &fA, const Point3D &fB, const Point3D &fC, const Point3D &p, const Point3D &normal) { //This will check the magnitude of the incoming normal ASSERT( fabs(sqrtf(normal.sqrMag()) - 1.0f) < 2.0* std::numeric_limits::epsilon()); unsigned int pointDir[3]; pointDir[0] = vectorPointDir(fA,fB,p,p); pointDir[1] = vectorPointDir(fA,fC,p,p); pointDir[2] = vectorPointDir(fB,fC,p,p); //They can never be "APART" if the //vectors point to the same pt ASSERT(pointDir[0] != POINTDIR_APART); ASSERT(pointDir[1] != POINTDIR_APART); ASSERT(pointDir[2] != POINTDIR_APART); //Check to see if any of them are "in common" if(pointDir[0] > 0 || pointDir[1] >0 || pointDir[2] > 0) { //if so, we have to check each edge for its closest point //then pick the best float bestDist[3]; bestDist[0] = distanceToSegment(fA,fB,p); bestDist[1] = distanceToSegment(fA,fC,p); bestDist[2] = distanceToSegment(fB,fC,p); return std::min(bestDist[0],std::min(bestDist[1],bestDist[2])); } float temp; temp = fabs((p-fA).dotProd(normal)); //check that the other points were not better than this! ASSERT(sqrtf(fA.sqrDist(p)) >= temp - std::numeric_limits::epsilon()); ASSERT(sqrtf(fB.sqrDist(p)) >= temp - std::numeric_limits::epsilon()); ASSERT(sqrtf(fC.sqrDist(p)) >= temp - std::numeric_limits::epsilon()); //Point lies above/below facet, use plane formula return temp; } //A bigger MAX_NN_DISTS is better because you will attempt to grab more ram //however there is a chance that memory allocation can fail, which currently I do not grab safely const unsigned int MAX_NN_DISTS = 0x8000000; //96 MB samples at a time //obtains all the input points from ions that lie inside the convex hull after //it has been shrunk such that the closest distance from the hull to the original data //is reductionDim unsigned int GetReducedHullPts(const vector &points, float reductionDim, unsigned int *progress, ATOMIC_BOOL &wantAbort, vector &pointResult) { //TODO: This could be made to use a fixed amount of ram, by //partitioning the input points, and then //computing multiple hulls. //Take the resultant hull points, then hull again. This would be //much more space efficient, and more easily parallellised //Alternately, compute a for a randoms K set of points, and reject //points that lie in the hull from further computation //Need at least 4 points to define a hull in 3D if(points.size() < 4) return 1; unsigned int dummyProg; vector theHull; if(computeConvexHull(points,progress,wantAbort,theHull,false,false)) return 2; Point3D midPoint(0,0,0); for(size_t ui=0;uisimplicial); vertex = (vertexT *)curFac->vertices->e[ui].p; while(vertex) { //copy the vertex info into the pt array (ptArray[ui])[0] = vertex->point[0]; (ptArray[ui])[1] = vertex->point[1]; (ptArray[ui])[2] = vertex->point[2]; //aggregate pyramidal points pyramidCentroid += ptArray[ui]; //increment before updating vertex //to allow checking for NULL termination ui++; vertex = (vertexT *)curFac->vertices->e[ui].p; } //note that this counter has been post incremented. ASSERT(ui ==3); vol = pyramidVol(ptArray,midPoint); ASSERT(vol>=0); //Find the midpoint of the pyramid, this will be the //same as its centre of mass. pyramidCentroid*= 0.25f; hullCentroid = hullCentroid + (pyramidCentroid*vol); massPyramids+=vol; curFac=curFac->next; } hullCentroid *= 1.0f/massPyramids; float minDist=std::numeric_limits::max(); //find the smallest distance between the centroid and the //convex hull curFac=qh facet_list; while(curFac != qh facet_tail) { float temp; Point3D vertexPt[3]; //The shortest distance from the plane to the point //is the dot product of the UNIT normal with //A-B, where B is on plane, A is point in question for(unsigned int ui=0; ui<3; ui++) { vertexT *vertex; //grab vertex vertex = ((vertexT *)curFac->vertices->e[ui].p); vertexPt[ui] = Point3D(vertex->point[0],vertex->point[1],vertex->point[2]); } //Find the distance between hull centroid and a given facet temp = distanceToFacet(vertexPt[0],vertexPt[1],vertexPt[2],hullCentroid, Point3D(curFac->normal[0],curFac->normal[1],curFac->normal[2])); if(temp < minDist) minDist = temp; curFac=curFac->next; } //shrink the convex hull such that it lies at //least reductionDim from the original surface of //the convex hull float scaleFactor; scaleFactor = 1 - reductionDim/ minDist; if(scaleFactor < 0.0f) return RDF_ERR_NEGATIVE_SCALE_FACT; //now scan through the input points and see if they //lie in the reduced convex hull vertexT *vertex = qh vertex_list; unsigned int ui=0; while(vertex !=qh vertex_tail) { //Translate around hullCentroid before scaling, //then undo translation after scale //Modify the vertex data such that it is scaled around the hullCentroid vertex->point[0] = (vertex->point[0] - hullCentroid[0])*scaleFactor + hullCentroid[0]; vertex->point[1] = (vertex->point[1] - hullCentroid[1])*scaleFactor + hullCentroid[1]; vertex->point[2] = (vertex->point[2] - hullCentroid[2])*scaleFactor + hullCentroid[2]; vertex = vertex->next; ui++; } //if the dot product of the normal with the point vector of the //considered point P, to any vertex on all of the facets of the //convex hull F1, F2, ... , Fn is negative, //then P does NOT lie inside the convex hull. pointResult.reserve(points.size()/2); curFac = qh facet_list; //minimum distance from centroid to convex hull for(unsigned int ui=points.size(); ui--;) { float fX,fY,fZ; double *ptArr,*normalArr; fX =points[ui][0]; fY = points[ui][1]; fZ = points[ui][2]; //loop through the facets curFac = qh facet_list; while(curFac != qh facet_tail) { //Dont ask. It just grabs the first coords of the vertex //associated with this facet ptArr = ((vertexT *)curFac->vertices->e[0].p)->point; normalArr = curFac->normal; //if the dotproduct is negative, then the point vector from the //point in question to the surface is in opposite to the outwards facing //normal, which means the point lies outside the hull if (dotProduct( (float)ptArr[0] - fX, (float)ptArr[1] - fY, (float)ptArr[2] - fZ, normalArr[0], normalArr[1], normalArr[2]) >= 0) { curFac=curFac->next; continue; } goto reduced_loop_next; } //we passed all tests, point is inside convex hull pointResult.push_back(points[ui]); reduced_loop_next: ; } freeConvexHull(); return 0; } //!Generate an NN histogram using NN-max cutoffs unsigned int generateNNHist( const vector &pointList, const K3DTree &tree,unsigned int nnMax, unsigned int numBins, vector > &histogram, float *binWidth , unsigned int *progressPtr, ATOMIC_BOOL &wantAbort) { if(pointList.size() <=nnMax) return RDF_ERR_INSUFFICIENT_INPUT_POINTS; //Disallow exact matching for NNs float deadDistSqr; deadDistSqr= std::numeric_limits::epsilon(); //calclate NNs BoundCube cube; cube.setBounds(pointList); //Allocate and assign the initial max distances float *maxSqrDist= new float[nnMax]; for(unsigned int ui=0; ui nnPoints; tree.findKNearest(pointList[ui],cube, nnMax,nnPoints,deadDistSqr); for(unsigned int uj=0; ujsqrDist(pointList[ui]); if(temp > maxSqrDist[uj]) maxSqrDist[uj] = temp; } //Callbacks to perform UI updates as needed if(!(callbackReduce--)) { #ifdef _OPENMP #pragma omp critical { numAnalysed+=CALLBACK_REDUCE; *progressPtr= (unsigned int)((float)(numAnalysed)/((float)pointList.size())*100.0f); if(wantAbort) spin=true; } #else *progressPtr= (unsigned int)((float)(ui)/((float)pointList.size())*50.0f); if(wantAbort) { delete[] maxSqrDist; return RDF_ABORT_FAIL; } #endif callbackReduce=CALLBACK_REDUCE; } } #ifdef _OPENMP if(spin) { delete[] maxSqrDist; return RDF_ABORT_FAIL; } #endif float maxOfMaxDists=0; float *maxDist=new float[nnMax]; for(unsigned int ui=0; ui nnPoints; #ifdef _OPENMP if(spin) continue; #endif tree.findKNearest(pointList[ui],cube, nnMax, nnPoints); for(unsigned int uj=0; ujsqrDist(pointList[ui])); offsetTemp = (unsigned int)(temp/binWidth[uj]); //Prevent overflow due to temp/binWidth exceeding array dimension //as (temp is <= binwidth, not < binWidth) if(offsetTemp == numBins) offsetTemp--; ASSERT(offsetTemp < nnMax*numBins); (histogram[uj])[offsetTemp]++; } //Callbacks to perform UI updates as needed #ifdef _OPENMP if(!(callbackReduce--)) { #pragma omp critical { *progressPtr= (unsigned int)((float)(numAnalysed)/((float)pointList.size())*50.0f + 50.0f); if(wantAbort) spin=true; numAnalysed+=CALLBACK_REDUCE; } callbackReduce=CALLBACK_REDUCE; } #else if(!(callbackReduce--)) { *progressPtr= (unsigned int)((float)(ui)/((float)pointList.size())*50.0f + 50.0f); if(wantAbort) { delete[] maxSqrDist; return RDF_ABORT_FAIL; } callbackReduce=CALLBACK_REDUCE; } #endif } delete[] maxSqrDist; #ifdef _OPENMP if(spin) return RDF_ABORT_FAIL; #endif return 0; } unsigned int generate1DAxialDistHist(const vector &pointList, const K3DTree &tree, const Point3D &axisDir, unsigned int *histogram, float distMax, unsigned int numBins, unsigned int *progressPtr, ATOMIC_BOOL &wantAbort) { ASSERT(fabs(axisDir.sqrMag() -1.0f) < sqrt(std::numeric_limits::epsilon())); #ifdef DEBUG for(unsigned int ui=0;ui epsilon deadDistSqr=std::numeric_limits::epsilon(); sqrDist=0; sourcePoint=pointList[ui]; while(deadDistSqr < maxSqrDist) { //Grab the nearest point nearPt = tree.findNearest(sourcePoint, cube, deadDistSqr); if(nearPt) { //Cacluate the sq of the distance to the point sqrDist = nearPt->sqrDist(sourcePoint); //if sqrDist is = maxSqrdist then this will cause //the histogram indexing to trash alternate memory //- this is bad - prevent this please. if(sqrDist < maxSqrDist) { //Compute the projection of // the point onto the axis of the // primary analysis direction float distance; distance=(*nearPt-sourcePoint).dotProd(axisDir); //update the histogram with the new position. // centre of the distribution function lies at the analysis point, // and can be either negative or positive. // Shift the zero to the center of the histogram int offset=(int)(((0.5f*distance)/distMax+0.5f)*(float)numBins); if(offset < (int)numBins && offset >=0) { #pragma omp critical histogram[offset]++; } } //increase the dead distance to the last distance deadDistSqr = sqrDist+std::numeric_limits::epsilon(); } else { //Oh no, we had a problem, somehow we couldn't find enough #pragma omp critical warnBiasCount++; break; } } //Run callbacks as needed if(!(callbackReduce--)) { #pragma omp critical { numAnalysed+=CALLBACK_REDUCE_VAL; *progressPtr= (unsigned int)((float)(numAnalysed)/((float)pointList.size())*100.0f); if(wantAbort) { #ifdef _OPENMP spin=true; #else return RDF_ABORT_FAIL; #endif } } callbackReduce=CALLBACK_REDUCE_VAL; } } #ifdef _OPENMP if(spin) return RDF_ABORT_FAIL; #endif *progressPtr=100; return 0; } unsigned int generate1DAxialNNHist(const vector &pointList, const K3DTree &tree, const Point3D &axisDir, unsigned int *histogram, float &binWidth, unsigned int nnMax, unsigned int numBins, unsigned int *progressPtr, ATOMIC_BOOL &wantAbort) { #ifdef DEBUG for(unsigned int ui=0;ui::epsilon(); //calclate NNs BoundCube cube; cube.setBounds(pointList); //Allocate and assign the initial max distances float *maxAxialDist= new float[nnMax]; for(unsigned int ui=0; ui nnPoints; tree.findKNearest(pointList[ui],cube, nnMax,nnPoints,deadDistSqr); for(unsigned int uj=0; uj maxAxialDist[uj]) maxAxialDist[uj] = temp; } //Callbacks to perform UI updates as needed if(!(callbackReduce--)) { #ifdef _OPENMP #pragma omp critical { numAnalysed+=CALLBACK_REDUCE; *progressPtr= (unsigned int)((float)(numAnalysed)/((float)pointList.size())*100.0f); if(wantAbort) spin=true; } #else *progressPtr= (unsigned int)((float)(ui)/((float)pointList.size())*100.0f); if(wantAbort) { delete[] maxAxialDist; return RDF_ABORT_FAIL; } #endif callbackReduce=CALLBACK_REDUCE; } } #ifdef _OPENMP if(spin) { delete[] maxAxialDist; return RDF_ABORT_FAIL; } #endif float maxOfMaxDists=0; for(unsigned int ui=0; ui nnPoints; #ifdef _OPENMP if(spin) continue; #endif tree.findKNearest(pointList[ui],cube, nnMax, nnPoints); for(unsigned int uj=0; uj=0) { //TODO: OpenMP could use multiple histograms // rather than locking #pragma omp critical histogram[offset]++; } } //Callbacks to check for abort as needed #ifdef _OPENMP if(!(callbackReduce--)) { #pragma omp critical { *progressPtr= (unsigned int)((float)(numAnalysed)/((float)pointList.size())*100.0f); if(wantAbort) spin=true; numAnalysed+=CALLBACK_REDUCE; } callbackReduce=CALLBACK_REDUCE; } #else if(!(callbackReduce--)) { *progressPtr= (unsigned int)((float)(ui)/((float)pointList.size())*100.0f); if(wantAbort) { delete[] maxAxialDist; return RDF_ABORT_FAIL; } callbackReduce=CALLBACK_REDUCE; } #endif } delete[] maxAxialDist; #ifdef _OPENMP if(spin) return RDF_ABORT_FAIL; #endif return 0; } //!Generate an NN histogram using distance max cutoffs. Input histogram must be zeroed, unsigned int generateDistHist(const vector &pointList, const K3DTree &tree, unsigned int *histogram, float distMax, unsigned int numBins, unsigned int &warnBiasCount, unsigned int *progressPtr,ATOMIC_BOOL &wantAbort) { #ifdef DEBUG for(unsigned int ui=0;ui epsilon deadDistSqr=std::numeric_limits::epsilon(); sqrDist=0; sourcePoint=pointList[ui]; while(deadDistSqr < maxSqrDist) { //Grab the nearest point nearPt = tree.findNearest(sourcePoint, cube, deadDistSqr); if(nearPt) { //Cacluate the sq of the distance to the point sqrDist = nearPt->sqrDist(sourcePoint); //if sqrDist is = maxSqrdist then this will cause //the histogram indexing to trash alternate memory //- this is bad - prevent this please. if(sqrDist < maxSqrDist) { //Add the point to the histogram #ifdef _OPENMP threadHist[(size_t) ((sqrtf(sqrDist/maxSqrDist)*(float)numBins))] [omp_get_thread_num()]++; #else histogram[(size_t)((sqrtf(sqrDist/maxSqrDist)*(float)numBins))]++; #endif } //increase the dead distance to the last distance deadDistSqr = sqrDist+std::numeric_limits::epsilon(); } else { //Oh no, we had a problem, somehow we couldn't find enough #pragma omp critical warnBiasCount++; break; } if(!(callbackReduce--)) { #ifdef _OPENMP #pragma omp critical { numAnalysed+=numAnalysedThread; *progressPtr= (unsigned int)((float)(numAnalysed)/((float)pointList.size())*100.0f); if(wantAbort) spin=true; } if(spin) break; numAnalysedThread=0; #else *progressPtr= (unsigned int)((float)(ui)/((float)pointList.size())*100.0f); if(wantAbort) return RDF_ABORT_FAIL; #endif callbackReduce=CALLBACK_REDUCE; } } #ifdef _OPENMP numAnalysedThread++; #endif } #ifdef _OPENMP if(spin) return RDF_ABORT_FAIL; for (size_t i = 0; i < numBins; i++) { for (size_t j = 0; j < omp_get_max_threads(); j++) histogram[i] += threadHist[i][j]; } #endif //Calculations complete! return 0; } void generateKnnTheoreticalDist(const std::vector &radii, float density, unsigned int nn, std::vector &nnDist) { ASSERT(density >=0); ASSERT(nn>0); //Reference :Stephenson, 2009, simplified using D=3 //Distribution requires evaluation of : //- the gamma function gamma(5/2) const float GAMMA_2PT5 = 1.32934038817914; // - power of pi : pi^(D/2) const float PI_POW_D_2 = pow(M_PI,3.0/2.0); const float LAMBDA_FACTOR = PI_POW_D_2/GAMMA_2PT5; double pBase,lambda; //radius independent component lambda = density*LAMBDA_FACTOR; pBase = 3.0/gsl_sf_fact(nn-1); pBase*= pow(lambda,nn); nnDist.resize(radii.size()); for(size_t ui=0;ui. */ #ifndef MASS_H #define MASS_H #include #include #include #include #include #include #include "../../filter.h" enum { FIT_MODE_NONE, FIT_MODE_CONST_TOF, FIT_MODE_ENUM_END, }; //Matching strings for FIT_MODE enum. ENUM_END does not have a string extern const char *BACKGROUND_MODE_STRING[FIT_MODE_ENUM_END]; struct BACKGROUND_PARAMS { enum { FIT_FAIL_MIN_REQ_BINS=1, FIT_FAIL_AVG_COUNTS, FIT_FAIL_INSUFF_DATA, FIT_FAIL_DATA_NON_GAUSSIAN, FIT_FAIL_END }; //background fitting mode to use unsigned int mode; //-- start/end window for const tof background fit float massStart, massEnd; //step size in bins for fitting histogram float binWidth; //result parameters // for FIT_MODE_CONST_TOF, this uses float intensity,stdev; //FIXME: the units of this are not fully coherent. Should be in units of (counts/sqrt(amu)) }; template void meanAndStdev(const std::vector &f,float &meanVal, float &stdevVal,bool normalCorrection=true) { meanVal=0; for(size_t ui=0;ui &dataIn, BACKGROUND_PARAMS ¶ms) ; // Build a histogram of the background // - Start and end mass, and step size (to get bin count). // tofBackIntensity is the intensity level per unit time in the background, as obtained by doFitBackground // the histogram is void createMassBackground(float massStart, float massEnd, unsigned int nBinsMass, float tofBackIntensity, vector &histogram); //Anderson. test statistic for gaussian-ness. Returns false if input has insufficient points for test (2 items) //Implented for unknown (derived from data) mean & variance // reject statistic if output has this prob. of non-normality: // 15% - 0.576 // 10% - 0.656 // 5% - 0.787 //2.5% - 0.918 // 1% - 1.092 //See, eg // http://itl.nist.gov/div898/handbook/eda/section3/eda35e.htm template bool andersonDarlingStatistic(std::vector vals, float &meanV, float &stdevVal, float &statistic, size_t &undefCount, bool computeMeanAndStdev=true) { size_t n=vals.size(); //we cannot compute this without more data if(n <= 1) return false; if(computeMeanAndStdev) meanAndStdev(vals,meanV,stdevVal); //Bring assumed gauss data into a normal dist for(size_t ui=0;ui normedPhi,lonCdf; std::vector normedPhiOK; normedPhiOK.resize(n,true); normedPhi.resize(n); for(size_t ui=0;ui::epsilon()) normedPhiOK[ui]=false; } lonCdf.resize(n); for(size_t ui=0;ui Undefined } //-- //Compute anderson-darling statistic //-- undefCount=0; double sumV=0.0; for(size_t i=0;i 0.0) sumV+=(2.0*(i+1.0)-1.0)*(lonCdf[i] + log(v)); else undefCount++; } n=n-undefCount; statistic=-(double)n - sumV/(double)n; //Perform correction of Shorak & Wellner statistic*=(1.0 + 4.0/(double)n + 25/(double(n)*double(n))); //-- //my name... is neo return true; } void makeHistogram(const std::vector &data, float start, float end, float step, std::vector &histVals); #ifdef DEBUG //Unit test function for anderson statistics. Should be able to check that gaussian numbers are in fact gaussian bool testAnderson(); //Check that the background fitting routine can fit // a random TOF data histogram bool testBackgroundFitMaths(); #endif #endif 3Depict-0.0.19/src/backend/filters/algorithms/binomial.h0000644000175000017500000000647612640746376022456 0ustar pcuserpcuser/* * binomial.h - Binomia distribution randomness testing * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef BINOMIAL_H #define BINOMIAL_H #include "common/mathfuncs.h" #include "backend/APT/ionhit.h" #include "backend/APT/APTRanges.h" #include enum { BINOMIAL_SEGMENT_AUTO_BRICK, BINOMIAL_SEGMENT_END }; struct SEGMENT_OPTION { //Segmentation mode size_t strategy; //Target number of ions in each segment size_t nIons; //Directin for extrusion size_t extrusionDirection; //Extrusion options //-- //Maximum allowed distance for grid extrusion float extrudeMaxRatio; //-- }; struct BINOMIAL_HIST { //TODO: Each vector is actually the same length. Could place in side // another object instead. // each element in vector is for each ion type. Map element inside // the vector provides a table of observed counts and their frequency. std::vector > mapIonFrequencies; // Same as above vector, however, this computes the normalised distribution // i.e., the experimental P distribution std::vector > normalisedFrequencies; std::vector > theoreticFrequencies; std::vector > theoreticNormalisedFrequencies; }; struct BINOMIAL_STATS { std::vector mean,chiSquare, comparisonCoeff,pValue; std::vector pValueOK; size_t nBlocks,nIons; }; struct GRID_ENTRY { //Start and end coordinates for the grid. // the algorithm itself only needs the extrusion axis, however for the // visualisation, we use the full coordinates Point3D startPt,endPt; std::vector nIons; //FIXME: This does not need to be here. unsigned int totalIons; }; //Binomial algorithm error codes enum { BINOMIAL_NO_MEM=1, BINOMIAL_ERR_END }; //Compute the experimental binomial distribution for the specified ions. int countBinnedIons(const std::vector &ions, const RangeFile *rng, const std::vector &selectedIons, const SEGMENT_OPTION &segmentOptions, std::vector &completedGridEntries); //Generate a vector of ion frequencies in histogram of segment counts, void genBinomialHistogram(const std::vector &completedGridEntries, unsigned int nSelected, BINOMIAL_HIST &binHist); //convert grid frequencies to compositions void binomialConvert(const std::vector > &ionFrequencies,float binWidth, std::vector > &ionConcentrations); void computeBinomialStats(const std::vector &gridEntries,const BINOMIAL_HIST &binHist, unsigned int nSelected, BINOMIAL_STATS &binStats); #ifdef DEBUG //Perform unit tests on binomial algorithm bool testBinomial(); #endif #endif 3Depict-0.0.19/src/backend/filters/algorithms/K3DTree-mk2.h0000644000175000017500000001447512716174467022552 0ustar pcuserpcuser/* * K3DTreeMk2.h - Precise KD tree implementation * Copyright (C) 2015 D. Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef K3DTREEMK2_H #define K3DTREEMK2_H #include #include #include #include "common/basics.h" #include "backend/APT/ionhit.h" //This is the second revision of my KD tree implementation //The goals here are, as compared to the first // - Improved build performance by minimising memory allocation calls // and avoiding recursive implementations // - index based construction for smaller in-tree storage //!Functor allowing for sorting of points in 3D /*! Used by KD Tree to sort points based around which splitting axis is being used * once the axis is set, points will be ranked based upon their relative value in * that axis only */ class AxisCompareMk2 { private: unsigned int axis; public: void setAxis(unsigned int Axis){axis=Axis;}; inline bool operator()(const std::pair &p1,const std::pair &p2) const {return p1.first[axis] > indexedPoints; //!Tree node array (stores parent->child relations) std::vector nodes; //!total size of array size_t arraySize; //!Which entry is the root of the tree? size_t treeRoot; BoundCube treeBounds; static unsigned int *progress; //Progress counter static ATOMIC_BOOL *abort; //set to true if build should abort. Must be initalised prior to build public: //KD Tree constructor K3DTreeMk2(){}; //!Cleans up tree, deallocates nodes ~K3DTreeMk2(){}; static void setProgressPtr(unsigned int *ptr){progress=ptr;} static void setAbortFlag(ATOMIC_BOOL *ptr){abort=ptr;} //Reset the points void resetPts(std::vector &pts, bool clear=true); void resetPts(std::vector &pts, bool clear=true); //Set a pointer that can be used to indicate that we need to abort build static void setAbortPtr(bool *abortFlag); //Set a pointer that can be used to write the current progress static void setProgressPointer(unsigned int *p) ; /*! Builds a balanced KD tree from a list of points * previously set by "resetPts". returns false if callback returns * false; */ bool build(); void getBoundCube(BoundCube &b); //!Textual output of tree. tabs are used to separate different levels of the tree /*!The output from this function can be quite large for even modest trees. * Recommended for debugging only*/ void dump(std::ostream &,size_t depth=0, size_t offset=-1) const; //Find the nearest "untagged" point's internal index. //Mark the found point as "tagged" in the tree. Returns -1 on failure (no untagged points) // optionaly, a sub-root branch of the tree can be specified, eg based upon range query, // in order to speed up search size_t findNearestUntagged(const Point3D &queryPt, const BoundCube &b, bool tag=true,size_t pseudoRoot=(size_t)-1); //Find the nearest "untagged" point's internal index. // Skip any of the listed points. size_t findNearestWithSkip(const Point3D &queryPt, const BoundCube &b,const std::set &skipPts, size_t pseudoRoot=(size_t)-1) const; //Find the indicies of all points that lie within the // sphere (pts < radius) of given radius, centered upon // this origin void ptsInSphere(const Point3D &origin, float radius, std::vector &pts) const; //!Get the contigous node IDs for a subset of points in the tree that are contained // within a sphere positioned about pt, with a sqr radius of sqrDist. // - This does *NOT* get *all* points - only some. // - It should be faster than using findNearestUntagged repeatedly // for large enough sqrDist. // - It does not check tags. void getTreesInSphere(const Point3D &pt, float sqrDist, const BoundCube &domainCube, std::vector > &contigousBlocks ) const; //!Get the smallest contigous bounds that will contain a box. // - new sub-tree root is returned. // function may only be called if tree is initalised size_t getBoxInTree(const BoundCube &box) const; //Obtain a point from its internal index const Point3D *getPt(size_t index) const ; //Obtain a point from its internal index const Point3D &getPtRef(size_t index) const ; //reset the specified "tags" in the tree void clearTags(std::vector &tagsToClear); //Convert the "tree index" (the position in the tree) into the original point offset in the input array size_t getOrigIndex(size_t treeIndex) const ; //Erase tree contents void clear() { nodes.clear(); indexedPoints.clear();}; //mark a point as "tagged" (or untagged,if tagVal=false) via its tree index. void tag(size_t tagID,bool tagVal=true) ; //obtain the tag status for a given point, using the tree index bool getTag(size_t treeIndex) const ; //obtain the number of points in the tree size_t size() const; //Find the position of the root node in the tree size_t rootIdx() const { return treeRoot;} //Find the number of tagged items in the tree size_t tagCount() const; //reset all tagged points to untagged void clearAllTags(); }; #ifdef DEBUG //KD tree internal unit tests // - return true on OK, false on fail bool K3DMk2Tests(); #endif #endif 3Depict-0.0.19/src/backend/filters/algorithms/rdf.h0000644000175000017500000000701712640746376021427 0ustar pcuserpcuser/* * rdf.h - Radial distribution function implementation header * Copyright (C) 2015 D. Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef RDF_H #define RDF_H #include "K3DTree.h" //RDF error codes enum { RDF_ERR_NEGATIVE_SCALE_FACT=1, RDF_ERR_INSUFFICIENT_INPUT_POINTS, RDF_FILE_OPEN_FAIL, RDF_ABORT_FAIL }; //!Generate the NN histogram specified up to a given NN unsigned int generateNNHist( const std::vector &pointList, const K3DTree &tree,unsigned int nnMax, unsigned int numBins, std::vector > &histogram, float *binWidth, unsigned int *progressPtr,ATOMIC_BOOL &wantAbort); //!Generate an NN histogram using distance max cutoffs. Input histogram must be zeroed, //if a voxelsname is given, a 3D RDF will be recorded. in this case voxelBins must be nonzero unsigned int generateDistHist(const std::vector &pointList, const K3DTree &tree, unsigned int *histogram, float distMax, unsigned int numBins, unsigned int &warnBiasCount, unsigned int *progressPtr,ATOMIC_BOOL &wantAbort); //!Returns a subset of points guaranteed to lie at least reductionDim inside hull of input points /*! Calculates the hull of the input ions and then scales the hull such that the * smallest distance between the scaled hull and the original hull is exactly * reductionDim */ unsigned int GetReducedHullPts(const std::vector &pts, float reductionDim, unsigned int *progress, ATOMIC_BOOL &wantAbort, std::vector &returnIons ); //Return a 1D histogram of NN frequencies, by projecting the NNs within a given search onto a specified axis, stopping at some fixed sstance // radius onto a specified vector prior to histogram summation. // - axisDir must be normalised. unsigned int generate1DAxialDistHist(const std::vector &pointList, const K3DTree &tree, const Point3D &axisDir, unsigned int *histogram, float distMax, unsigned int numBins, unsigned int *progressPtr, ATOMIC_BOOL &wantAbort); //Generate a 1D distribution of NN distances s projected onto a specified axis // Inputs are the axis to project onto, a prezeroed 1D histogram array (size numBIns), // and the input data points (search src) and tree (search target) // Outputs are the histogram values , and the bin width for the histogram unsigned int generate1DAxialNNHist(const std::vector &pointList, const K3DTree &tree, const Point3D &axisDir, unsigned int *histogram, float &binWidth, unsigned int nnMax, unsigned int numBins, unsigned int *progressPtr, ATOMIC_BOOL &wantAbort); //generate the Knn probability distribution for a given nn occurring at a radius in 3D space // with a fixed density parameter. Radii are the positions to evaluate the distribution // nnDist will store the answer. It is required that both density >=0 and nn >0. void generateKnnTheoreticalDist(const std::vector &radii, float density, unsigned int nn, std::vector &nnDist); #endif 3Depict-0.0.19/src/backend/filters/algorithms/K3DTree.cpp0000644000175000017500000002762412640746376022416 0ustar pcuserpcuser/* * K3DTree.cpp : 3D Point KD tree * Copyright (C) 2015 D. Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "K3DTree.h" #include "backend/APT/ionhit.h" using std::vector; unsigned int *K3DTree::progress=0; //Pointer for aborting during build process const ATOMIC_BOOL *K3DTree::abort=0; //Axis compare //========== AxisCompare::AxisCompare() : axis(0) { } void AxisCompare::setAxis(unsigned int sortAxis) { axis=sortAxis; } //========== //K3D node //========== void K3DNode::setLoc(const Point3D &locNew) { loc=locNew; } Point3D K3DNode::getLoc() const { return loc; } void K3DNode::deleteChildren() { if(childLeft) { childLeft->deleteChildren(); delete childLeft; childLeft=0; } if(childRight) { childRight->deleteChildren(); delete childRight; childRight=0; } } void K3DNode::dump(std::ostream &strm, unsigned int depth) const { for(unsigned int ui=0;uidump(strm,depth+1); if(childRight) childRight->dump(strm,depth+1); } //=========== //K3D Tree //============= K3DTree::K3DTree() : treeSize(0),maxDepth(0),root(0) { } K3DTree::~K3DTree() { kill(); } /*void K3DTree::verify() { std::stack nodeStack; std::stack visitStack; K3DNode *curNode; curNode=root; unsigned int visit=0; unsigned int totalVisits; totalVisits=1; unsigned int measuredDepth=0; std::stack bounds; BoundCube curBounds; //Set to limits of floating point curBounds.setInverseLimits(); bounds.push(curBounds); unsigned int curAxis=0; do { //Check to see what the max. depth of the tree really is if(visitStack.size() > measuredDepth) measuredDepth=visitStack.size(); switch(visit) { //Examine left branch case 0: { //verifyChildren(curNode) if(curNode->left()) { curBounds.bounds[curAxis][1] = curNode->getLocVal(curAxis); totalVisits++; curAxis++; visitStack.push(1); nodeStack.push(curNode); visit=0; curNode=curNode->left(); ASSERT(curBounds.containsPt(curNode->getLoc())); continue; } visit++; break; } //Examine right branch case 1: { if(curNode->right()) { curBounds.bounds[curAxis][0] = curNode->getLocVal(curAxis); totalVisits++; curAxis++; visitStack.push(2); nodeStack.push(curNode); visit=0; curNode=curNode->right(); ASSERT(curBounds.containsPt(curNode->getLoc())); continue; } visit++; break; } //Go up case 2: { curNode=nodeStack.top(); nodeStack.pop(); visit=visitStack.top(); visitStack.pop(); curAxis--; break; } } //Keep going until we meet the root node for the third time (one left, one right, one finish) }while(!(curNode==root && visit== 2)); std::cerr << "===COMPARE===" << std::endl; std::cerr << " -<<>>-" << std::endl; std::cerr << "Nodes walked : " << totalVisits << std::endl; std::cerr << "Measered Depth: " << measuredDepth << std::endl; std::cerr << " -<<>>-" << std::endl; std::cerr << "Tree reports # nodes: " << treeSize << std::endl; std::cerr << "Tree reports Max Depth: " << maxDepth << std::endl; }*/ void K3DTree::kill() { if(root) { root->deleteChildren(); delete root; root=0; treeSize=0; } } //Build the KD tree void K3DTree::build(vector pts) { ASSERT(progress); // Check progress pointer is inited ASSERT(abort); //Check abort pointer is initialised //che. to see if the pts vector is empty if(!pts.size()) { maxDepth=0; return; } if(root) kill(); treeSize=pts.size(); maxDepth=1; root=buildRecurse(pts.begin(), pts.end(),0); } //Build the KD tree, shuffling original void K3DTree::buildByRef(vector &pts) { //che. to see if the pts vector is empty if(!pts.size()) { maxDepth=0; return; } if(root) kill(); treeSize=pts.size(); maxDepth=1; *progress=0; curNodeCount=0; root=buildRecurse(pts.begin(), pts.end(),0); } K3DNode *K3DTree::buildRecurse(vector::iterator pts_start, vector::iterator pts_end, unsigned int depth) { K3DNode *node= new K3DNode; unsigned int curAxis=depth%3; unsigned int ptsSize=pts_end - pts_start - 1;//pts.size()-1 node->setAxis(curAxis); //if we are deeper, then record that if(depth > maxDepth) maxDepth=depth; unsigned int median =(ptsSize)/2; //set up initial node AxisCompare axisCmp; axisCmp.setAxis(curAxis); //Find the median value in the current axis sort(pts_start,pts_end,axisCmp); //allocate node (this stores a copy of the point) and set. node->setLoc(*(pts_start + median)); if(median) { //Abort recursion if we need to abort if(*abort) node->setLeft(0); else { //process data as per normal node->setLeft(buildRecurse(pts_start,pts_start + median,depth+1)); *progress= (unsigned int)((float)curNodeCount/(float)treeSize*100.0f); } } else node->setLeft(0); if(median!=ptsSize) { //Only do process if not aborting if(*abort) node->setRight(0); else { node->setRight(buildRecurse(pts_start + median + 1, pts_end,depth+1)); *progress= (unsigned int)((float)curNodeCount/(float)treeSize*100.0f); } } else node->setRight(0); curNodeCount++; return node; } void K3DTree::dump( std::ostream &strm) const { if(root) root->dump(strm,0); } const Point3D *K3DTree::findNearest(const Point3D &searchPt, const BoundCube &domainCube, const float deadDistSqr) const { enum { NODE_FIRST_VISIT, //First visit is when you descend the tree NODE_SECOND_VISIT, //Second visit is when you come back from ->Left() NODE_THIRD_VISIT // Third visit is when you come back from ->Right() }; //The stacks are for the nodes above the current Node. const K3DNode *nodeStack[maxDepth+1]; float domainStack[maxDepth+1][2]; unsigned int visitStack[maxDepth+1]; const Point3D *bestPoint; const K3DNode *curNode; BoundCube curDomain; unsigned int visit; unsigned int stackTop; unsigned int curAxis; float bestDistSqr; float tmpEdge; //Set the root as the best estimate bestPoint =0; bestDistSqr =std::numeric_limits::max(); curDomain=domainCube; visit=NODE_FIRST_VISIT; curAxis=0; stackTop=0; curNode=root; do { switch(visit) { //Examine left branch case NODE_FIRST_VISIT: { if(searchPt[curAxis] < curNode->getLocVal(curAxis)) { if(curNode->left()) { //Check bounding box when shrunk overlaps best //estimate sphere tmpEdge= curDomain.bounds[curAxis][1]; curDomain.bounds[curAxis][1] = curNode->getLocVal(curAxis); if(bestPoint && !curDomain.intersects(*bestPoint,bestDistSqr)) { curDomain.bounds[curAxis][1] = tmpEdge; visit++; continue; } //Preserve our current state. nodeStack[stackTop]=curNode; visitStack[stackTop] = NODE_SECOND_VISIT; //Oh, It will be. It will be. domainStack[stackTop][1] = tmpEdge; domainStack[stackTop][0]= curDomain.bounds[curAxis][0]; stackTop++; //Update the current information curNode=curNode->left(); visit=NODE_FIRST_VISIT; curAxis++; curAxis%=3; continue; } } else { if(curNode->right()) { //Check bounding box when shrunk overlaps best //estimate sphere tmpEdge= curDomain.bounds[curAxis][0]; curDomain.bounds[curAxis][0] = curNode->getLocVal(curAxis); if(bestPoint && !curDomain.intersects(*bestPoint,bestDistSqr)) { curDomain.bounds[curAxis][0] =tmpEdge; visit++; continue; } //Preserve our current state. nodeStack[stackTop]=curNode; visitStack[stackTop] = NODE_SECOND_VISIT; //Oh, It will be. It will be. domainStack[stackTop][0] = tmpEdge; domainStack[stackTop][1]= curDomain.bounds[curAxis][1]; stackTop++; //Update the information curNode=curNode->right(); visit=NODE_FIRST_VISIT; curAxis++; curAxis%=3; continue; } } visit++; //Fall through } //Examine right branch case NODE_SECOND_VISIT: { if(searchPt[curAxis]< curNode->getLocVal(curAxis)) { if(curNode->right()) { //Check bounding box when shrunk overlaps best //estimate sphere tmpEdge= curDomain.bounds[curAxis][0]; curDomain.bounds[curAxis][0] = curNode->getLocVal(curAxis); if(bestPoint && !curDomain.intersects(*bestPoint,bestDistSqr)) { curDomain.bounds[curAxis][0] = tmpEdge; visit++; continue; } nodeStack[stackTop]=curNode; visitStack[stackTop] = NODE_THIRD_VISIT; //Oh, It will be. It will be. domainStack[stackTop][0] = tmpEdge; domainStack[stackTop][1]= curDomain.bounds[curAxis][1]; stackTop++; //Update the information curNode=curNode->right(); visit=NODE_FIRST_VISIT; curAxis++; curAxis%=3; continue; } } else { if(curNode->left()) { //Check bounding box when shrunk overlaps best //estimate sphere tmpEdge= curDomain.bounds[curAxis][1]; curDomain.bounds[curAxis][1] = curNode->getLocVal(curAxis); if(bestPoint && !curDomain.intersects(*bestPoint,bestDistSqr)) { curDomain.bounds[curAxis][1] = tmpEdge; visit++; continue; } //Preserve our current state. nodeStack[stackTop]=curNode; visitStack[stackTop] = NODE_THIRD_VISIT; //Oh, It will be. It will be. domainStack[stackTop][1] = tmpEdge; domainStack[stackTop][0]= curDomain.bounds[curAxis][0]; stackTop++; //Update the information curNode=curNode->left(); visit=NODE_FIRST_VISIT; curAxis++; curAxis%=3; continue; } } visit++; //Fall through } //Go up case NODE_THIRD_VISIT: { float tmpDistSqr; tmpDistSqr = curNode->sqrDist(searchPt); if(tmpDistSqr < bestDistSqr && tmpDistSqr > deadDistSqr) { bestDistSqr = tmpDistSqr; bestPoint=curNode->getLocRef(); } //DEBUG ASSERT(stackTop%3 == curAxis) // if(curAxis) curAxis--; else curAxis=2; ASSERT(stackTop < maxDepth+1); if(stackTop) { stackTop--; visit=visitStack[stackTop]; curNode=nodeStack[stackTop]; curDomain.bounds[curAxis][0]=domainStack[stackTop][0]; curDomain.bounds[curAxis][1]=domainStack[stackTop][1]; ASSERT((stackTop)%3 == curAxis) } break; } default: ASSERT(false); } //Keep going until we meet the root nde for the third time (one left, one right, one finish) }while(!(curNode==root && visit== NODE_THIRD_VISIT)); return bestPoint; } void K3DTree::findKNearest(const Point3D &searchPt, const BoundCube &domainCube, unsigned int num, vector &bestPts, float deadDistSqr) const { //find the N nearest points bestPts.clear(); bestPts.reserve(num); for(unsigned int ui=0; uisqrDist(searchPt); deadDistSqr = sqrDist+std::numeric_limits::epsilon(); } } //============= 3Depict-0.0.19/src/backend/filters/algorithms/mass.cpp0000644000175000017500000001715312716174467022154 0ustar pcuserpcuser/* * mass.h - Algorithms for computing mass backgrounds * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "mass.h" #include using std::vector; //Background modes const char *BACKGROUND_MODE_STRING[FIT_MODE_ENUM_END] = {NTRANS("None"), NTRANS("Flat TOF")}; std::string getFitError(unsigned int errMsg) { ASSERT(errMsg < BACKGROUND_PARAMS::FIT_FAIL_END); const char * errorMsgs[BACKGROUND_PARAMS::FIT_FAIL_END] = { NTRANS("INsufficient bins to perform fit"), NTRANS("Insufficient counts to perform fit"), NTRANS("Insufficient data to perform fit"), NTRANS("Data did not appear to be random noise - cannot fit noise level") }; return std::string(TRANS(errorMsgs[errMsg])); } //Make a linearly spaced histogram with the given spacings //TODO: Less lazy implementation void makeHistogram(const vector &data, float start, float end, float step, vector &histVals) { ASSERT(start < end); ASSERT(step > std::numeric_limits::epsilon()); gsl_histogram *h = gsl_histogram_alloc((end-start)/step); gsl_histogram_set_ranges_uniform(h,start,end); for(size_t ui=0; uin); for(size_t ui=0;uin; ui++) histVals[ui]=h->bin[ui]; gsl_histogram_free(h); } unsigned int doFitBackground(const vector &dataIn, BACKGROUND_PARAMS &backParams) { ASSERT(backParams.mode == FIT_MODE_CONST_TOF); vector ionData; Filter::getStreamsOfType(dataIn,ionData); vector sqrtFiltMass; for(size_t ui=0;uidata.size(); uj++) { float curMass; curMass=ionData[ui]->data[uj].getMassToCharge(); if( curMass >=backParams.massStart && curMass <= backParams.massEnd) { sqrtFiltMass.push_back(sqrtf(curMass)); } } } //Minimum required counts per bin to have sufficient statistics const unsigned int MIN_REQUIRED_AVG_COUNTS=10; const unsigned int MIN_REQUIRED_BINS=10; size_t nBinsTof = (sqrt(backParams.massEnd) - sqrt(backParams.massStart)) / backParams.binWidth; float filterStep = (sqrt(backParams.massEnd) - sqrt(backParams.massStart) )/ nBinsTof; //we cannot perform a test with fewer than this number of bins if ( nBinsTof < MIN_REQUIRED_BINS) return BACKGROUND_PARAMS::FIT_FAIL_MIN_REQ_BINS; float averageCounts = sqrtFiltMass.size()/ (float)nBinsTof; if( averageCounts < MIN_REQUIRED_AVG_COUNTS) return BACKGROUND_PARAMS::FIT_FAIL_AVG_COUNTS; //Check that the TOF-space histogram is gaussian vector histogram; makeHistogram(sqrtFiltMass,sqrt(backParams.massStart), sqrt(backParams.massEnd), filterStep,histogram); float andersonStat,meanVal; size_t undefCount; if(!andersonDarlingStatistic(histogram,meanVal,backParams.stdev,andersonStat, undefCount)) //TODO: Error message regarding fit failure return BACKGROUND_PARAMS::FIT_FAIL_INSUFF_DATA; //Rejection threshold for Anderson statistic // - either we didn't have enough samples, // - or we failed the null hypothesis test of Gaussian-ness // Rejection of null hypothesis at 99% confidence occurs at 1.092 [NIST]. // we use much more than this, in case batch processing/familywise error is present // two slightly overlapping Gaussians can trigger at the 1.8 level const float STATISTIC_THRESHOLD=3.0; if(andersonStat > STATISTIC_THRESHOLD || undefCount == histogram.size()) return BACKGROUND_PARAMS::FIT_FAIL_DATA_NON_GAUSSIAN; //Intensity PER BIN in TOF space backParams.intensity= meanVal; return 0; } //Start and end mass, and step size (to get bin count). // tofBackIntensity is the intensity level per unit time in the background, as obtained by doFitBackground // the histogram is void createMassBackground(float massStart, float massEnd, unsigned int nBinsMass, float tofBackIntensity, vector &histogram) { const float MC_BIN_STEP = (massEnd-massStart)/nBinsMass; //compute fitted value analytically histogram.resize(nBinsMass); for(size_t ui=0;ui data; data.resize(30); for(size_t ui=0;ui 2.0f) { ASSERT(false); return false; } //check anderson statistic TEST(s >=0 && s < 1.5,"Anderson gauss test statistic"); TEST(EQ_TOLV(meanV,0.0f,0.2f),"Gaussian mean"); TEST(EQ_TOLV(stdV,1.0f,0.2f),"Gaussian mean"); return true; } bool testBackgroundFitMaths() { RandNumGen rng; rng.initTimer(); //make some random data which is flat in TOF space // then convert to m/c space IonStreamData *ionData; ionData = new IonStreamData; const unsigned int NUM_IONS =100000; //Simulate a histogram of NUM_IONS // between a lower and upper limit. // This is flat in TOF space, with mean intensity // given by NUM_IONS/NUM_BINS //--- const float TOF_LIMIT[2] = { 0.0,100}; vector rawData; ionData->data.resize(NUM_IONS); rawData.resize(NUM_IONS); for(size_t ui=0;uidata[ui]= IonHit(Point3D(0,0,0),simTof); rawData[ui] = simTof; } //Now perform the fit in m/c space, and after, check that it matches the anticipated m/c histogram. //--- //compute the mass histogram numerically vector massData; massData.resize(NUM_IONS); for(size_t ui=0;ui massHist; //Recompute the bin step parameter, as the stepping in m/c space to yield // the same number of bins will e radially different const float NBINS_TOF = 20; const float NBINS_MASS= NBINS_TOF; const float MASS_LIMIT[2] = {TOF_LIMIT[0]*TOF_LIMIT[0], TOF_LIMIT[1]*TOF_LIMIT[1]}; //time-space intensity per unit time const float TOF_MEAN_INT= NUM_IONS/(TOF_LIMIT[1] - TOF_LIMIT[0]); const float MC_BIN_STEP = (MASS_LIMIT[1]-MASS_LIMIT[0])/NBINS_MASS; makeHistogram(massData,MASS_LIMIT[0],MASS_LIMIT[1],MC_BIN_STEP,massHist); //compute fitted value analytically vector fittedMassHist; createMassBackground(MASS_LIMIT[0],MASS_LIMIT[1],NBINS_MASS,TOF_MEAN_INT,fittedMassHist); //check that the numerical and analytical results match. // notably, skip the first one as the fit is unstable for(size_t ui=1;ui. */ #include "ionInfo.h" #include "filterCommon.h" #include "algorithms/mass.h" using std::vector; using std::string; using std::pair; using std::make_pair; enum { VOLUME_MODE_RECTILINEAR=0, VOLUME_MODE_CONVEX, VOLUME_MODE_END }; const char *volumeModeString[] = { NTRANS("Rectilinear"), NTRANS("Convex hull") }; enum { ERR_USER_ABORT=1, ERR_BAD_QHULL, IONINFO_ERR_ENUM_END }; bool getRectilinearBounds(const std::vector &dataIn, BoundCube &bound, unsigned int *progress, unsigned int totalSize) { bound.setInvalid(); vector overflow; size_t n=0; for(size_t ui=0;uigetStreamType() == STREAM_TYPE_IONS) { const IonStreamData *ions; ions = ( const IonStreamData *)dataIn[ui]; n+=ions->data.size(); BoundCube c; if(ions->data.size() >1) { ions = (const IonStreamData*)dataIn[ui]; IonHit::getBoundCube(ions->data,c); if(c.isValid()) { if(bound.isValid()) bound.expand(c); else bound=c; } } else { //Do we have single ions in their own //data structure? if so, they don't have a bound //on their own, but may have one collectively. if(ions->data.size()) overflow.push_back(ions->data[0].getPos()); } *progress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); if(*Filter::wantAbort) return false; } } //Handle any single ions if(overflow.size() > 1) { BoundCube c; c.setBounds(overflow); if(bound.isValid()) bound.expand(c); else bound=c; } else if(bound.isValid() && overflow.size() == 1) bound.expand(overflow[0]); return true; } IonInfoFilter::IonInfoFilter() : wantIonCounts(true), wantNormalise(false), range(0), wantVolume(false), volumeAlgorithm(VOLUME_MODE_RECTILINEAR), cubeSideLen(1.0f), fitMode(FIT_MODE_NONE), massBackStart(1.2),massBackEnd(1.8),binWidth(0.05) { cacheOK=false; cache=true; //By default, we should cache, but decision is made higher up } void IonInfoFilter::initFilter(const std::vector &dataIn, std::vector &dataOut) { const RangeStreamData *c=0; //Determine if we have an incoming range for (size_t i = 0; i < dataIn.size(); i++) { if(dataIn[i]->getStreamType() == STREAM_TYPE_RANGE) { c=(const RangeStreamData *)dataIn[i]; break; } } //we no longer (or never did) have any incoming ranges. Not much to do if(!c) { //delete the old incoming range pointer if(range) delete range; range=0; } else { //If we didn't have an incoming rsd, then make one up! if(!range) { range= new RangeStreamData; *range=*c; } else { //OK, so we have a range incoming already (from last time) //-- the question is, is it the same one we had before ? //Do a pointer comparison (its a hack, yes, but it should work) if(range->rangeFile != c->rangeFile) { //hmm, it is different. well, trash the old incoming rng delete range; range = new RangeStreamData; *range=*c; } } } } Filter *IonInfoFilter::cloneUncached() const { IonInfoFilter *p=new IonInfoFilter(); p->wantIonCounts=wantIonCounts; p->wantVolume=wantVolume; p->wantNormalise=wantNormalise; p->cubeSideLen=cubeSideLen; p->volumeAlgorithm=volumeAlgorithm; //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->userString=userString; return p; } unsigned int IonInfoFilter::refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress) { //Count the number of ions input size_t numTotalPoints = numElements(dataIn,STREAM_TYPE_IONS); size_t numRanged=0; if(!numTotalPoints) { consoleOutput.push_back((TRANS("No ions"))); return 0; } //Compute ion counts/composition as needed if(wantIonCounts) { std::string str; //Count the number of ions if(range) { float intensity=0; if(fitMode!= FIT_MODE_NONE) { BACKGROUND_PARAMS backParams; backParams.massStart=massBackStart; backParams.massEnd=massBackEnd; backParams.binWidth=binWidth; backParams.mode=fitMode; //fit a constant tof (1/sqrt (mass)) type background if(doFitBackground(dataIn,backParams)) { //display a warning that the background failed consoleOutput.push_back(TRANS("Background fit failed - input data was considered ill formed (gauss-test)")); consoleOutput.push_back(TRANS("Following data has not been corrected")); } else { intensity=backParams.intensity; } } vector numIons; ASSERT(range); const RangeFile *r=range->rangeFile; numIons.resize(r->getNumIons()+1,0); //count ions per-species. Add a bin on the end for unranged for(size_t ui=0;uigetStreamType() != STREAM_TYPE_IONS) continue; const IonStreamData *i; i = (const IonStreamData *)dataIn[ui]; for(size_t uj=0;ujdata.size(); uj++) { unsigned int idIon; idIon = r->getIonID(i->data[uj].getMassToCharge()); if(idIon != (unsigned int) -1) numIons[idIon]++; else numIons[numIons.size()-1]++; } } if(intensity > 0) { for(unsigned int ui=0;uigetNumRanges(); ui++) { pair masses; float integral; //compute the integral of the fitted background, then subtract this from the // ion count masses=r->getRange(ui); integral = 2.0f*intensity*(sqrtf(masses.second) - sqrtf(masses.first)); numIons[r->getIonID(ui)]-=integral; } } stream_cast(str,numTotalPoints); str=std::string(TRANS("--Counts--") ); consoleOutput.push_back(str); //sum all ions *except* the unranged. for(size_t ui=0;uigetName(ui)) + std::string("\t") + str; else { //output unranged count str=std::string(TRANS("Unranged")) + std::string("\t") + str; } consoleOutput.push_back(str); } str=std::string("----------"); consoleOutput.push_back(str); } else { //ok, no ranges -- just give us the total stream_cast(str,numTotalPoints); str=std::string(TRANS("Number of points : ") )+ str; consoleOutput.push_back(str); } } float computedVol=0; //Compute volume as needed if(wantVolume) { switch(volumeAlgorithm) { case VOLUME_MODE_RECTILINEAR: { BoundCube bound; if(!getRectilinearBounds(dataIn,bound, &(progress.filterProgress),numTotalPoints)) return ERR_USER_ABORT; if(bound.isValid()) { Point3D low,hi; string tmpLow,tmpHi,s; bound.getBounds(low,hi); computedVol=bound.volume(); stream_cast(tmpLow,low); stream_cast(tmpHi,hi); s=TRANS("Rectilinear Bounds : "); s+= tmpLow + " / " + tmpHi; consoleOutput.push_back(s); stream_cast(s,computedVol); consoleOutput.push_back(string(TRANS("Volume (len^3): ")) + s); } break; } case VOLUME_MODE_CONVEX: { //OK, so here we need to do a convex hull estimation of the volume. unsigned int err; err=convexHullEstimateVol(dataIn,computedVol); if(err) return err; std::string s; stream_cast(s,computedVol); if(computedVol>0) { consoleOutput.push_back(string(TRANS("Convex Volume (len^3): ")) + s); } else consoleOutput.push_back(string(TRANS("Unable to compute volume"))); break; } default: ASSERT(false); } #ifdef DEBUG lastVolume=computedVol; #endif } //"Pairwise events" - where we perform an action if both //These if(wantIonCounts && wantVolume) { if(computedVol > sqrtf(std::numeric_limits::epsilon())) { float density; std::string s; if(range) { density=(float)numRanged/computedVol; stream_cast(s,density); consoleOutput.push_back(string(TRANS("Ranged Density (pts/vol):")) + s ); } density=(float)numTotalPoints/computedVol; stream_cast(s,density); consoleOutput.push_back(string(TRANS("Total Density (pts/vol):")) + s ); } } return 0; } size_t IonInfoFilter::numBytesForCache(size_t nObjects) const { return 0; } void IonInfoFilter::getProperties(FilterPropGroup &propertyList) const { string str; FilterProperty p; size_t curGroup=0; vector > choices; string tmpStr; stream_cast(str,wantIonCounts); p.key=IONINFO_KEY_TOTALS; if(range) { p.name=TRANS("Compositions"); p.helpText=TRANS("Display compositional data for points in console"); } else { p.name=TRANS("Counts"); p.helpText=TRANS("Display count data for points in console"); } p.data= str; p.type=PROPERTY_TYPE_BOOL; propertyList.addProperty(p,curGroup); propertyList.setGroupTitle(curGroup,TRANS("Ion data")); if(wantIonCounts && range) { stream_cast(str,wantNormalise); p.name=TRANS("Normalise"); p.data=str; p.key=IONINFO_KEY_NORMALISE; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Normalise count data"); propertyList.addProperty(p,curGroup); /* p.name=TRANS("Back. Correct"); choices.clear(); for(unsigned int ui=0;ui=massBackEnd) return false; if(!applyPropertyNow(massBackStart,value,needUpdate)) return false; break; } case IONINFO_KEY_BACK_MASSEND: { float tmpMass; if(stream_cast(tmpMass,value)) return false; if(tmpMass <=massBackStart) return false; if(!applyPropertyNow(massBackEnd,value,needUpdate)) return false; break; } case IONINFO_KEY_VOLUME_ALGORITHM: { unsigned int newAlg=VOLUME_MODE_END; for(unsigned int ui=0;ui massBackEnd - massBackStart) tmpWidth=massBackEnd-massBackStart; binWidth=tmpWidth; break; } default: ASSERT(false); } return true; } std::string IonInfoFilter::getSpecificErrString(unsigned int code) const { const char *errStrs[] = { "", "Aborted", "Bug? Problem with qhull library, cannot run convex hull.", }; COMPILE_ASSERT(THREEDEP_ARRAYSIZE(errStrs) == IONINFO_ERR_ENUM_END); ASSERT(code < IONINFO_ERR_ENUM_END); return errStrs[code]; } void IonInfoFilter::setPropFromBinding(const SelectionBinding &b) { ASSERT(false); } unsigned int IonInfoFilter::convexHullEstimateVol(const vector &data, float &volume) { volume=0; //TODO: replace with real progress unsigned int dummyProgress; //Compute the convex hull, leaving the qhull data structure intact const bool NO_FREE_QHULL=false; const bool WANT_QHULL_VOL=true; vector hullPts; if(computeConvexHull(data,&dummyProgress, hullPts,WANT_QHULL_VOL,NO_FREE_QHULL)) return ERR_BAD_QHULL; Point3D midPt(0,0,0); for(size_t ui=0;ui" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth) << "" << endl; break; } default: ASSERT(false); return false; } return true; } bool IonInfoFilter::readState(xmlNodePtr &nodePtr, const std::string &stateFileDir) { using std::string; string tmpStr; xmlChar *xmlString; //Retrieve user string if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //-- if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"wantioncounts","value")) return false; if(!boolStrDec(tmpStr,wantIonCounts)) return false; //--= //-- if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"wantnormalise","value")) return false; if(!boolStrDec(tmpStr,wantNormalise)) return false; //--= //-- if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"wantvolume","value")) return false; if(!boolStrDec(tmpStr,wantVolume)) return false; //--= //-- unsigned int tmpInt; if(!XMLGetNextElemAttrib(nodePtr,tmpInt,"volumealgorithm","value")) return false; if(tmpInt >=VOLUME_MODE_END) return false; volumeAlgorithm=tmpInt; //--= //-- float tmpFloat; if(!XMLGetNextElemAttrib(nodePtr,tmpFloat,"cubesidelen","value")) return false; if(tmpFloat <= 0.0f) return false; cubeSideLen=tmpFloat; //--= //Retrieve background fitting mode, if we have it // Only available 3Depict >= 0.0.18 // internal rev > 3e41b89299f4 if(!XMLHelpFwdToElem(nodePtr,"background")) { if(XMLHelpGetProp(fitMode,nodePtr,"mode")) return false; if(!nodePtr->xmlChildrenNode) return false; xmlNodePtr tmpNode=nodePtr; nodePtr=nodePtr->xmlChildrenNode; if(!XMLGetNextElemAttrib(nodePtr,massBackStart,"fitwindow","start")) return false; if(XMLHelpGetProp(massBackEnd,nodePtr,"end")) return false; nodePtr=tmpNode; } return true; } unsigned int IonInfoFilter::getRefreshBlockMask() const { return STREAMTYPE_MASK_ALL; } unsigned int IonInfoFilter::getRefreshEmitMask() const { return 0; } unsigned int IonInfoFilter::getRefreshUseMask() const { return STREAM_TYPE_IONS | STREAM_TYPE_RANGE; } bool IonInfoFilter::needsUnrangedData() const { return fitMode == FIT_MODE_CONST_TOF; } #ifdef DEBUG void makeBox(float boxSize,IonStreamData *d) { d->data.clear(); for(unsigned int ui=0;ui<8;ui++) { IonHit h; float x,y,z; x= (float)(ui &1)*boxSize; y= (float)((ui &2) >> 1)*boxSize; z= (float)((ui &4) >> 2)*boxSize; h.setPos(Point3D(x,y,z)); h.setMassToCharge(1); d->data.push_back(h); } } void makeSphereOutline(float radius, float angularStep, IonStreamData *d) { d->clear(); ASSERT(angularStep > 0.0f); unsigned int numAngles=(unsigned int)( 180.0f/angularStep); for( unsigned int ui=0; ui0.5 longit = (float)((int)ui-(int)(numAngles/2))/(float)(numAngles); //longitude test longit*=180.0f; for( unsigned int uj=0; uj1 latit = (float)((int)uj)/(float)(numAngles); latit*=180.0f; float x,y,z; x=radius*cos(longit)*sin(latit); y=radius*sin(longit)*sin(latit); z=radius*cos(latit); IonHit h; h.setPos(Point3D(x,y,z)); h.setMassToCharge(1); d->data.push_back(h); } } } bool volumeBoxTest() { //Construct a few boxes, then test each of their volumes IonStreamData *d=new IonStreamData(); const float SOMEBOX=7.0f; makeBox(7.0,d); //Construct the filter, and then set up the options we need IonInfoFilter *f = new IonInfoFilter; f->setCaching(false); //activate volume measurement bool needUp; TEST(f->setProperty(IONINFO_KEY_VOLUME,"1",needUp),"Set prop"); string s; stream_cast(s,(int)VOLUME_MODE_RECTILINEAR); //Can return false if algorithm already selected. Do not // test return f->setProperty(IONINFO_KEY_VOLUME_ALGORITHM, s,needUp); vector streamIn,streamOut; streamIn.push_back(d); ProgressData p; f->refresh(streamIn,streamOut,p); //No ions come out of the info TEST(streamOut.empty(),"stream size test"); vector consoleStrings; f->getConsoleStrings(consoleStrings); //weak test for the console string size TEST(consoleStrings.size(), "console strings existence test"); //Ensure that the rectilinear volume is the same as // the theoretical value float volMeasure,volReal;; volMeasure=f->getLastVolume(); volReal =SOMEBOX*SOMEBOX*SOMEBOX; TEST(fabs(volMeasure -volReal) < 10.0f*sqrtf(std::numeric_limits::epsilon()), "volume estimation test (rect)"); //Try again, but with convex hull stream_cast(s,(int)VOLUME_MODE_CONVEX); f->setProperty(IONINFO_KEY_VOLUME_ALGORITHM, s,needUp); TEST(!f->refresh(streamIn,streamOut,p), "refresh"); volMeasure=f->getLastVolume(); TEST(fabs(volMeasure -volReal) < 10.0f*sqrtf(std::numeric_limits::epsilon()), "volume estimation test (convex)"); delete d; delete f; return true; } bool volumeSphereTest() { //Construct a few boxes, then test each of their volumes IonStreamData *d=new IonStreamData(); const float OUTLINE_RADIUS=7.0f; const float ANGULAR_STEP=2.0f; makeSphereOutline(OUTLINE_RADIUS,ANGULAR_STEP,d); //Construct the filter, and then set up the options we need IonInfoFilter *f = new IonInfoFilter; f->setCaching(false); //activate volume measurement bool needUp; TEST(f->setProperty(IONINFO_KEY_VOLUME,"1",needUp),"Set prop"); //Can return false if the default algorithm is the same // as the selected algorithm f->setProperty(IONINFO_KEY_VOLUME_ALGORITHM, volumeModeString[VOLUME_MODE_RECTILINEAR],needUp); vector streamIn,streamOut; streamIn.push_back(d); ProgressData p; f->refresh(streamIn,streamOut,p); //No ions come out of the info TEST(streamOut.empty(),"stream size test"); vector consoleStrings; f->getConsoleStrings(consoleStrings); //weak test for the console string size TEST(consoleStrings.size(), "console strings existence test"); float volMeasure,volReal; volMeasure=f->getLastVolume(); //Bounding box for sphere is diameter^3. volReal =8.0f*OUTLINE_RADIUS*OUTLINE_RADIUS*OUTLINE_RADIUS; TEST(fabs(volMeasure -volReal) < 0.05*volReal,"volume test (rect est of sphere)"); //Try again, but with convex hull TEST(f->setProperty(IONINFO_KEY_VOLUME_ALGORITHM, volumeModeString[VOLUME_MODE_CONVEX],needUp),"Set prop"); vector dummy; f->getConsoleStrings(dummy); TEST(!f->refresh(streamIn,streamOut,p),"refresh error code"); volMeasure=f->getLastVolume(); //Convex volume of sphere volReal =4.0f/3.0f*M_PI*OUTLINE_RADIUS*OUTLINE_RADIUS*OUTLINE_RADIUS; TEST(fabs(volMeasure -volReal) < 0.05*volReal, "volume test, convex est. of sphere"); TEST(consoleStrings.size(), "console strings existence test"); delete d; delete f; return true; } bool IonInfoFilter::runUnitTests() { if(!volumeBoxTest()) return false; if(!volumeSphereTest()) return false; return true; } #endif 3Depict-0.0.19/src/backend/filters/allFilter.h0000644000175000017500000000303212716174467020412 0ustar pcuserpcuser/* * allFilter.h - Filter class factory header * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef ALLFILTER_H #define ALLFILTER_H #include "boundingBox.h" #include "ionDownsample.h" #include "dataLoad.h" #include "profile.h" #include "externalProgram.h" #include "ionClip.h" #include "ionColour.h" #include "rangeFile.h" #include "clusterAnalysis.h" #include "spatialAnalysis.h" #include "spectrumPlot.h" #include "transform.h" #include "voxelise.h" #include "ionInfo.h" #include "annotation.h" //!Returns true if the string is a valid filter name bool isValidFilterName(const std::string &s); //!Create a "true default" filter from its true name string Filter *makeFilter(const std::string &s) ; //!Create a true default filter from its enum value FILTER_TYPE_* Filter *makeFilter(unsigned int ui) ; //!Create a true default filter from its type string Filter *makeFilterFromDefUserString(const std::string &s) ; #endif 3Depict-0.0.19/src/backend/filters/rangeFile.cpp0000644000175000017500000010502012716174467020723 0ustar pcuserpcuser/* * rangeFile.cpp - bins ions into different value ranges given an input range file * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "rangeFile.h" #include "filterCommon.h" #include #include using std::map; using std::vector; using std::string; const unsigned int NUM_ROWS_ION=3; const unsigned int NUM_ROWS_RANGE=4; //!Error codes enum { RANGEFILE_ABORT_FAIL=1, RANGEFILE_BAD_ALLOC, RANGEFILE_ERR_ENUM_END }; //== Range File Filter == RangeFileFilter::RangeFileFilter() { dropUnranged=true; showLegend=false; assumedFileFormat=RANGE_FORMAT_ORNL; } Filter *RangeFileFilter::cloneUncached() const { RangeFileFilter *p=new RangeFileFilter(); p->rng = rng; p->rngName=rngName; p->enabledRanges.resize(enabledRanges.size()); std::copy(enabledRanges.begin(),enabledRanges.end(), p->enabledRanges.begin()); p->enabledIons.resize(enabledIons.size()); std::copy(enabledIons.begin(),enabledIons.end(), p->enabledIons.begin()); p->assumedFileFormat=assumedFileFormat; p->dropUnranged=dropUnranged; //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->userString=userString; return p; } void RangeFileFilter::initFilter(const std::vector &dataIn, std::vector &dataOut) { //Copy any input, except range files to output for(size_t ui=0;uigetStreamType() != STREAM_TYPE_RANGE) dataOut.push_back(dataIn[ui]); } //Reset any changed number of ions ASSERT(rng.getNumRanges() == enabledRanges.size() && rng.getNumIons() == enabledIons.size()); //Create a rangestream data to push through the init phase if(rng.getNumIons() && rng.getNumRanges()) { RangeStreamData *rngData=new RangeStreamData; rngData->parent=this; rngData->rangeFile=&rng; rngData->enabledRanges.resize(enabledRanges.size()); std::copy(enabledRanges.begin(),enabledRanges.end(),rngData->enabledRanges.begin()); rngData->enabledIons.resize(enabledIons.size()); std::copy(enabledIons.begin(),enabledIons.end(),rngData->enabledIons.begin()); rngData->cached=0; dataOut.push_back(rngData); } } unsigned int RangeFileFilter::refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress) { //use the cached copy of the data if we have it. if(cacheOK) { propagateCache(getOut); //We don't cache anything but our modification //to the ion stream data types. so we propagate //these. propagateStreams(dataIn,getOut,getRefreshBlockMask(),true); return 0; } progress.filterProgress=0; progress.stepName=TRANS("Ranging"); progress.step=1; progress.maxStep=1; ASSERT(enabledRanges.size() == rng.getNumRanges()); ASSERT(enabledIons.size() == rng.getNumIons()); //See if we have enabled ranges and ions bool haveEnabled; haveEnabled= (std::find(enabledRanges.begin(), enabledRanges.end(),(char)1) !=enabledRanges.end()) && (std::find(enabledIons.begin(), enabledIons.end(),(char)1) !=enabledIons.end()); //Nothing enabled? Nothing to do! if(!(!haveEnabled && dropUnranged)) { vector d; //Split the output up into chunks, one for each range, //Extra 1 for unranged ions d.resize(rng.getNumIons()+1); bool haveDefIonColour=false; //GCC complains about this, but this is protected by haveDefIonColour. RGBf defIonColour; //Try to maintain ion size if possible bool haveIonSize,sameSize; // have we set the ionSize? float ionSize; haveIonSize=false; sameSize=true; vector dSizes; dSizes.resize(d.size(),0); size_t totalSize=numElements(dataIn); //Check to see if there are any enabled ranges //Generate output filter streams. for(unsigned int ui=0;uiparent=this; } const unsigned int RANGE_ALLOC_STEP=157; //is prime - less likely to form sequence? if(!haveEnabled) { //There are no enabled ranges at all. dSizes.back()=totalSize; } else { //Step 1: Do a first sweep to obtain range sizes needed // then reserve the same amount of mem as we need on the output //======================== //Don't examine every ion to determine the allocation size. // perform step-wise examination of dataset for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { #ifdef _OPENMP //Create a unique array for each thread, so they don't try //to modify the same data structure unsigned int nT =omp_get_max_threads(); vector *dSizeArr = new vector[nT]; for(unsigned int uk=0;ukdata.size();uj+=RANGE_ALLOC_STEP) { #ifdef _OPENMP unsigned int thisT=omp_get_thread_num(); #endif if(spin) continue; //get the range ID for this particular ion. unsigned int rangeID; rangeID=rng.getRangeID(src->data[uj].getMassToCharge()); //If ion is unranged, then it will have a rangeID of -1 if(rangeID != (unsigned int)-1 && enabledRanges[rangeID] ) { unsigned int ionID=rng.getIonID(rangeID); //if we are going to keep the ion //then increment this array size if(enabledIons[ionID]) { #ifdef _OPENMP dSizeArr[thisT][ionID]++; #else dSizes[ionID]++; #endif } } //update progress periodically if(!curProg--) { #pragma omp critical { n+=NUM_CALLBACK; progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); curProg=NUM_CALLBACK; if(*Filter::wantAbort) spin=true; } } } if(spin) { #ifdef _OPENMP delete[] dSizeArr; #endif return RANGEFILE_ABORT_FAIL; } #ifdef _OPENMP //Merge the arrays back together for(unsigned int uk=0;ukdata.reserve(dSizes[ui]*1.05f*RANGE_ALLOC_STEP+10); } catch(std::bad_alloc) { for(size_t ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { //Set the default (unranged) ion colour, by using //the first input ion colour. if(!haveDefIonColour) { defIonColour.red = ((IonStreamData *)dataIn[ui])->r; defIonColour.green = ((IonStreamData *)dataIn[ui])->g; defIonColour.blue = ((IonStreamData *)dataIn[ui])->b; haveDefIonColour=true; } //Check for ion size consistency if(haveIonSize) { sameSize &= (fabs(ionSize-((const IonStreamData *)dataIn[ui])->ionSize) < std::numeric_limits::epsilon()); } else { ionSize=((const IonStreamData *)dataIn[ui])->ionSize; haveIonSize=true; } unsigned int curProg=NUM_CALLBACK; const size_t off=d.size()-1; for(vector::const_iterator it=((const IonStreamData *)dataIn[ui])->data.begin(); it!=((const IonStreamData *)dataIn[ui])->data.end(); ++it) { unsigned int rangeID; rangeID=rng.getRangeID(it->getMassToCharge()); //If ion is unranged, then it will have a rangeID of -1 if(rangeID != (unsigned int)-1) { unsigned int ionID; ionID=rng.getIonID(rangeID); //Only retain the ion if the ionID and rangeID are enabled if(enabledRanges[rangeID] && enabledIons[ionID]) { ASSERT(ionID < enabledRanges.size()); d[ionID]->data.push_back(*it); } } else if(!dropUnranged)//If it is unranged, then the rangeID is still -1 (as above). { d[off]->data.push_back(*it); } //update progress periodically if(!curProg--) { n+=NUM_CALLBACK; progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); curProg=NUM_CALLBACK; if(*Filter::wantAbort) { //Free space allocated for output ion streams... for(unsigned int ui=0;uidata.resize(totalSize); size_t off=0; for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { const vector &ionHitVec=((const IonStreamData *)dataIn[ui])->data; vector &outputVec=(d.back())->data; #pragma omp parallel for for(size_t ui=0;uir=rngCol.red; d[ui]->g=rngCol.green; d[ui]->b=rngCol.blue; d[ui]->a=1.0; } //If all the ions are the same size, then propagate //Otherwise use the default ionsize if(haveIonSize && sameSize) { for(unsigned int ui=0;uiionSize=ionSize; } //Set the unranged colour if(haveDefIonColour && d.size()) { d[d.size()-1]->r = defIonColour.red; d[d.size()-1]->g = defIonColour.green; d[d.size()-1]->b = defIonColour.blue; d[d.size()-1]->a = 1.0f; } //remove any zero sized ranges for(unsigned int ui=0;uidata.size())) { delete d[ui]; std::swap(d[ui],d.back()); d.pop_back(); } else ui++; } //====================================== //Having ranged all streams, merge them back into one ranged stream. for(unsigned int ui=0;uiparent=this; rngData->rangeFile=&rng; rngData->enabledRanges.resize(enabledRanges.size()); std::copy(enabledRanges.begin(),enabledRanges.end(),rngData->enabledRanges.begin()); rngData->enabledIons.resize(enabledIons.size()); std::copy(enabledIons.begin(),enabledIons.end(),rngData->enabledIons.begin()); cacheAsNeeded(rngData); getOut.push_back(rngData); cacheOK=cache; progress.filterProgress=100; return 0; } bool RangeFileFilter::updateRng() { if(!rng.openGuessFormat(rngName.c_str())) return false; unsigned int nRng = rng.getNumRanges(); enabledRanges.resize(nRng,(char)1); unsigned int nIon = rng.getNumIons(); enabledIons.resize(nIon,(char)1); return true; } void RangeFileFilter::setRangeData(const RangeFile &rngNew) { rng=rngNew; unsigned int nRng = rng.getNumRanges(); enabledRanges.resize(nRng,1); unsigned int nIon = rng.getNumIons(); enabledIons.resize(nIon,1); clearCache(); } size_t RangeFileFilter::numBytesForCache(size_t nObjects) const { //The byte requirement is input dependant return (nObjects*(size_t)IONDATA_SIZE); } void RangeFileFilter::getProperties(FilterPropGroup &p) const { using std::string; FilterProperty prop; //Ensure that the file is specified if(!rngName.size()) return; size_t curGroup=0; prop.name=TRANS("File"); //Wx- acceptable string format prop.type=PROPERTY_TYPE_FILE; prop.helpText=TRANS("File to use for range data"); prop.key=RANGE_KEY_RANGE_FILENAME; prop.data=rngName; prop.dataSecondary=TRANS(RANGEFILE_WX_CONSTANT); p.addProperty(prop,curGroup); std::string tmpStr; tmpStr=boolStrEnc(dropUnranged); prop.name=TRANS("Drop unranged"); prop.type=PROPERTY_TYPE_BOOL; prop.helpText=TRANS("Remove unranged points when generating output"); prop.key=RANGE_KEY_DROP_UNRANGED; prop.data=tmpStr; p.addProperty(prop,curGroup); p.setGroupTitle(curGroup,TRANS("File")); curGroup++; prop.name = TRANS("Legend"); prop.type = PROPERTY_TYPE_BOOL; prop.helpText = TRANS("Display colour legend for enabled ions"); prop.key= RANGE_KEY_ENABLE_LEGEND; prop.data=boolStrEnc(showLegend); p.addProperty(prop,curGroup); p.setGroupTitle(curGroup,TRANS("View")); curGroup++; //--- //Option to disable/enable all ions if(rng.getNumIons()) { string str="1"; for(unsigned int uj=0;uj thisRange; thisRange = rng.getRange(ui); string rangeVal; stream_cast(rangeVal,thisRange.first); prop.name=string(TRANS("Start rng "))+suffix; prop.data=rangeVal; prop.type=PROPERTY_TYPE_REAL; prop.helpText=TRANS("Start value for range"); prop.key=RANGE_KEY_ENABLE_ALL_RANGES + NUM_ROWS_RANGE*ui +3; p.addProperty(prop,curGroup); stream_cast(rangeVal,thisRange.second); prop.name=string(TRANS("End rng "))+suffix; prop.data=rangeVal; prop.type=PROPERTY_TYPE_REAL; prop.helpText=TRANS("Stopping value for range`"); prop.key=RANGE_KEY_ENABLE_ALL_RANGES+NUM_ROWS_RANGE*ui+4; p.addProperty(prop,curGroup); } p.setGroupTitle(curGroup,TRANS("Ranges")); } //---- } bool RangeFileFilter::setProperty(unsigned int key, const std::string &value, bool &needUpdate) { using std::string; needUpdate=false; switch(key) { case RANGE_KEY_RANGE_FILENAME: { if(value != rngName) { std::string tmp; tmp=rngName; rngName=value; RangeFile tmpRange = rng; //Check to see if the new file can actually be opened if(!updateRng()) { rngName=tmp; rng=tmpRange; return false; } needUpdate=true; } else return false; if(needUpdate) clearCache(); break; } case RANGE_KEY_DROP_UNRANGED: //Enable/disable unranged dropping { if(!applyPropertyNow(dropUnranged,value,needUpdate)) return false; break; } case RANGE_KEY_ENABLE_LEGEND: { if(!cacheOK || !cache) { if(!applyPropertyNow(showLegend,value,needUpdate)) return false; break; } //Manually decode the value, then fiddle with the cache // so we don't invalidate it and cause a full recomputation bool newShow; if(!boolStrDec(value,newShow)) return false; if(showLegend == newShow) return false; if(showLegend) { //disabling legend, find it and destroy it in cache, rather // than recomputing all ranging for(size_t ui=0; uigetStreamType() == STREAM_TYPE_DRAW) { delete filterOutputs[ui]; std::swap(filterOutputs[ui],filterOutputs.back()); filterOutputs.pop_back(); break; } } } else { //enabling legend, create the new legened and add it to the cache DrawStreamData *ds = createLegend(); ds->cached=1; filterOutputs.push_back(ds); } showLegend=newShow; needUpdate=true; break; } case RANGE_KEY_ENABLE_ALL_RANGES: { bool allEnable; if(!boolStrDec(value,allEnable)) return false; //set them to the opposite of whatever we have now //if any single one needs a change, then we need to //update for(unsigned int ui=0;ui9 for(unsigned int ui=0;ui rng.getNumRanges()) return false; rng.setIonID(rangeId,newID); needUpdate=true; break; } //Range start case 2: { //Check for valid data type conversion float newMass; if(stream_cast(newMass,value)) return false; //Ensure that it has actually changed if(newMass == rng.getRange(rangeId).first) return false; //Attempt to move the range to a new position if(!rng.moveRange(rangeId,0,newMass)) return false; needUpdate=true; break; } //Range end case 3: { //Check for valid data type conversion float newMass; if(stream_cast(newMass,value)) return false; //Ensure that it has actually changed if(newMass == rng.getRange(rangeId).second) return false; //Attempt to move the range to a new position if(!rng.moveRange(rangeId,1,newMass)) return false; needUpdate=true; break; } } if(needUpdate) clearCache(); } } } return true; } std::string RangeFileFilter::getSpecificErrString(unsigned int code) const { const char *errStrs[] ={ "", "Ranging aborted by user", "Insufficient memory for range", }; COMPILE_ASSERT(THREEDEP_ARRAYSIZE(errStrs) == RANGEFILE_ERR_ENUM_END); ASSERT(code < RANGEFILE_ERR_ENUM_END); return errStrs[code]; } void RangeFileFilter::setPropFromBinding(const SelectionBinding &b) { ASSERT(false); } void RangeFileFilter::setFormat(unsigned int format) { ASSERT(format < RANGE_FORMAT_END_OF_ENUM); assumedFileFormat=format; } bool RangeFileFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<" << trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << ""<< endl; for(unsigned int ui=0;ui" << endl; } f << tabs(depth+1) << ""<< endl; f << tabs(depth+1) << ""<< endl; for(unsigned int ui=0;ui" << endl; } f << tabs(depth+1) << ""<< endl; f << tabs(depth) << "" << endl; break; } default: ASSERT(false); return false; } return true; } bool RangeFileFilter::readState(xmlNodePtr &nodePtr, const std::string &stateFileDir) { //Retrieve user string //== if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlChar *xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //== //Retrieve file name //== //Retrieve file name if(XMLHelpFwdToElem(nodePtr,"file")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"name"); if(!xmlString) return false; rngName=(char *)xmlString; xmlFree(xmlString); //Override the string to strip leading ./ notation, as needed if( (stateFileDir.size()) && (rngName.size() > 2 && rngName.substr(0,2) == "./") ) { rngName=stateFileDir + rngName.substr(2); } rngName=convertFileStringToNative(rngName); //try using the extension name of the file to guess format if(!rng.openGuessFormat(rngName.c_str())) return false; //== //TODO: Deprecate me. Did not exist prior to 0.0.17/ // internal 3e88134daeea xmlNodePtr tmpNode=nodePtr; if(!XMLHelpFwdToElem(tmpNode,"legend")) { if(XMLHelpGetProp(showLegend,tmpNode,"enabled")) { return false; } } else showLegend=false; std::string tmpStr; //Retrieve range status //== if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"dropunranged","value")) return false; if(!boolStrDec(tmpStr,dropUnranged)) return false; //== //Retrieve enabled ions //=== if(XMLHelpFwdToElem(nodePtr,"enabledions")) return false; tmpNode=nodePtr; nodePtr=nodePtr->xmlChildrenNode; unsigned int ionID; bool enabled; //By default, turn ions off, but use state file to turn them on map tmpEnabledIons; map tmpCol; while(!XMLHelpFwdToElem(nodePtr,"ion")) { //Get ID value xmlString=xmlGetProp(nodePtr,(const xmlChar *)"id"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(ionID,tmpStr)) return false; if(ionID>= rng.getNumIons()) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"enabled"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(!boolStrDec(tmpStr,enabled)) return false; tmpEnabledIons[ionID]=enabled; xmlFree(xmlString); xmlString=xmlGetProp(nodePtr,(const xmlChar *)"colour"); if(!xmlString) return false; tmpStr=(char *)xmlString; ColourRGBA rgbaTmp; if(!rgbaTmp.parse(tmpStr)) return false; tmpCol[ionID]=rgbaTmp.toRGBAf().toRGBf(); xmlFree(xmlString); } //=== nodePtr=tmpNode; //Retrieve enabled ranges //=== if(XMLHelpFwdToElem(nodePtr,"enabledranges")) return false; tmpNode=nodePtr; nodePtr=nodePtr->xmlChildrenNode; //By default, turn ranges off (cause there are lots of them), and use state to turn them on map tmpEnabledRanges; unsigned int rngID; while(!XMLHelpFwdToElem(nodePtr,"range")) { //Get ID value xmlString=xmlGetProp(nodePtr,(const xmlChar *)"id"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(rngID,tmpStr)) return false; if(rngID>= rng.getNumRanges()) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"enabled"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(!boolStrDec(tmpStr,enabled)) return false; xmlFree(xmlString); tmpEnabledRanges[rngID]=enabled; } //=== enabledIons.resize(rng.getNumIons(),1); enabledRanges.resize(rng.getNumRanges(),1); //FIXME: HACK: store more data, to confirm validation //If we have the same number of ions, and the same number of ranges, // then update the values if(tmpEnabledIons.size() == rng.getNumIons()) { for(size_t ui=0;ui &externalAttribs) const { externalAttribs.push_back(rngName); } unsigned int RangeFileFilter::getRefreshBlockMask() const { return STREAM_TYPE_RANGE | STREAM_TYPE_IONS ; } unsigned int RangeFileFilter::getRefreshEmitMask() const { unsigned int retmask= STREAM_TYPE_RANGE | STREAM_TYPE_IONS; if(showLegend) retmask |= STREAM_TYPE_DRAW; return retmask; } unsigned int RangeFileFilter::getRefreshUseMask() const { return STREAM_TYPE_IONS ; } void RangeFileFilter::setPropFromRegion(unsigned int method, unsigned int regionID, float newPos) { ASSERT(regionID < rng.getNumRanges()); unsigned int rangeID = regionID; switch(method) { case REGION_MOVE_EXTEND_XMINUS: rng.moveRange(rangeID,false, newPos); break; case REGION_MOVE_TRANSLATE_X: { std::pair limits; limits=rng.getRange(rangeID); float delta; delta = (limits.second-limits.first)/2; rng.moveBothRanges(rangeID,newPos-delta,newPos+delta); break; } case REGION_MOVE_EXTEND_XPLUS: rng.moveRange(rangeID,true, newPos); break; default: ASSERT(false); } clearCache(); } bool RangeFileFilter::writePackageState(std::ostream &f, unsigned int format, const std::vector &valueOverrides, unsigned int depth) const { ASSERT(valueOverrides.size() == 1); //Temporarily modify the state of the filter, then call writestate string tmpFilename=rngName; //override const -- naughty, but we know what we are doing... const_cast(this)->rngName=valueOverrides[0]; bool result; result=writeState(f,format,depth); const_cast(this)->rngName=tmpFilename; return result; } DrawStreamData *RangeFileFilter::createLegend() const { //Create a legend bar, which shows the ions that are present DrawStreamData *dS = new DrawStreamData; dS->parent=this; DrawPointLegendOverlay *dl=new DrawPointLegendOverlay; dl->setPosition(0.1,0.1); for(unsigned int ui=0;uiaddItem(rng.getName(ui), curRGBf.red, curRGBf.green,curRGBf.blue); } dS->drawables.push_back(dl); return dS; } #ifdef DEBUG bool testRanged(); //bool testRangeWithOnOffs(); bool testUnranged(); bool RangeFileFilter::runUnitTests() { if(!testRanged()) return false; return true; } bool testUnranged() { return true; } bool testRanged() { vector streamIn,streamOut; //Synthesise data //----- IonStreamData *d = new IonStreamData; IonHit h; h.setPos(Point3D(1,1,1)); for(unsigned int ui=0;ui<100; ui++) { h.setMassToCharge(ui); d->data.push_back(h); } streamIn.push_back(d); //Now build some range data RangeFile rng; //Insert *non overlapping* ranges. const unsigned int NUM[]={10,14}; const unsigned int OFFSET[]={0,20}; string longName,shortName; RGBf col; col.red=col.green=col.blue=1; shortName="Bl"; longName="Blahium"; unsigned int ionID; ionID=rng.addIon(shortName,longName,col); rng.addRange((float)OFFSET[0],(float)(OFFSET[0]+NUM[0]-1),ionID); shortName="Pl"; longName="Palatherum"; ionID=rng.addIon(shortName,longName,col); rng.addRange((float)OFFSET[1],(float)(OFFSET[1]+NUM[1]-1),ionID); //----- //Run the range filter //-- RangeFileFilter *r = new RangeFileFilter; r->setCaching(false); r->setRangeData(rng); //Run the initialisation stage ProgressData prog; TEST(!r->refresh(streamIn,streamOut,prog),"Refresh error code"); //-- //Run the tests //--- vector numIons; for(unsigned int ui=0; uigetStreamType() == STREAM_TYPE_IONS) { numIons.push_back(streamOut[ui]->getNumBasicObjects()); const IonStreamData *dI; dI = (IonStreamData*)streamOut[ui]; for(unsigned int uj=0;ujdata[uj].getMassToCharge()), "Range containment"); } } } //Ion stream output - ranges + unranged TEST(numIons.size() == 2, "Ranged ionstream count"); TEST(std::find(numIons.begin(),numIons.end(),NUM[0]) != numIons.end(), "ion count test (1)"); TEST(std::find(numIons.begin(),numIons.end(),NUM[1]) != numIons.end(), "ion count test (2)"); for(unsigned int uj=0;uj. */ #ifndef IONCOLOUR_H #define IONCOLOUR_H #include "../filter.h" #include "../../common/translation.h" //!Ion colouring filter class IonColourFilter: public Filter { private: //!Colourmap to use /* 0 jetColorMap | 4 positiveColorMap * 1 hotColorMap | 5 negativeColorMap * 2 coldColorMap | 6 colorMap * 3 blueColorMap | 7 cyclicColorMap * 8 randColorMap | 9 grayColorMap */ unsigned int colourMap; bool reverseMap; //!map start & end (spectrum value to align start and end of map to) float mapBounds[2]; //!Number of unique colours to generate, max 256 unsigned int nColours; //!Should we display the colour bar? bool showColourBar; //Transparency value float alpha; public: IonColourFilter(); //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; //!Returns FILTER_TYPE_IONCOLOURFILTER unsigned int getType() const { return FILTER_TYPE_IONCOLOURFILTER;}; //!Get (approx) number of bytes required for cache virtual size_t numBytesForCache(size_t nObjects) const; //update filter unsigned int refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress); //!return string naming the human readable type of this class virtual std::string typeString() const { return std::string(TRANS("Spectral Colour"));} //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter bool setProperty( unsigned int key, const std::string &value, bool &needUpdate); //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Dump state to output stream, using specified format bool writeState(std::ostream &f,unsigned int format, unsigned int depth=0) const; //!Read the state of the filter from XML file. If this //fails, filter will be in an undefined state. bool readState(xmlNodePtr &node, const std::string &packDir); //!Get the stream types that will be dropped during ::refresh unsigned int getRefreshBlockMask() const; //!Get the stream types that will be generated during ::refresh unsigned int getRefreshEmitMask() const; //!Get the stream types that will be used during ::refresh unsigned int getRefreshUseMask() const; //!Set internal property value using a selection binding (Disabled, this filter has no bindings) void setPropFromBinding(const SelectionBinding &b); #ifdef DEBUG bool runUnitTests() ; #endif }; #endif 3Depict-0.0.19/src/backend/filters/voxelise.h0000644000175000017500000001363612640746376020345 0ustar pcuserpcuser/* * voxelise.h - Compute 3D binning (voxelisation) of point clouds * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VOXELISE_H #define VOXELISE_H #include "../filter.h" #include "common/voxels.h" #include "../../common/translation.h" //!Filter that does voxelisation for various primitives (copied from CompositionFilter) class VoxeliseFilter : public Filter { private: const static size_t INDEX_LENGTH = 3; //Enabled ions for numerator/denom std::vector enabledIons[2]; //!Stepping mode - fixed width or fixed number of bins bool fixedWidth; //Cache to use for voxel info Voxels voxelCache; //!number of bins (if using fixed bins) unsigned long long nBins[INDEX_LENGTH]; //!Width of each bin (if using fixed wdith) Point3D binWidth; //!boundcube for the input data points BoundCube bc; //!density-based or count-based unsigned int normaliseType; bool numeratorAll, denominatorAll; //This is filter's enabled ranges RangeStreamData *rsdIncoming; ColourRGBAf rgba; //!Filter mode to apply to data before output unsigned int filterMode; //!How do we treat boundaries when applying filters unsigned int filterBoundaryMode; //!Filter size, in units of gaussDevs float filterRatio; //!Gaussian filter standard deviation float gaussDev; //!3D Point Representation size float splatSize; //!Isosurface level float isoLevel; //!Default output representation mode unsigned int representation; //!Colour map to use when using axial slices unsigned int colourMap; //Number of colour levels for colour map size_t nColours; //Whether to show the colour map bar or not bool showColourBar; //Whether to use an automatic colour bound, or to use user spec bool autoColourMap; //Colour map start/end float colourMapBounds[2]; //Interpolation mode to use when slicing size_t sliceInterpolate; //Axis that is normal to the slice 0,1,2 => x,y,z size_t sliceAxis; //Fractional offset from lower bound of data cube [0,1] float sliceOffset; //Obtain a textured slice from the given voxel set void getTexturedSlice(const Voxels &f, size_t axis,float offset, size_t interpolateMode, float &minV, float &maxV, DrawTexturedQuad &texQ) const; BoundCube lastBounds; public: VoxeliseFilter(); ~VoxeliseFilter() { if(rsdIncoming) delete rsdIncoming;} //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; virtual void clearCache(); //!Get approx number of bytes for caching output size_t numBytesForCache(size_t nObjects) const; unsigned int getType() const { return FILTER_TYPE_VOXELS;}; virtual void initFilter(const std::vector &dataIn, std::vector &dataOut); //!update filter unsigned int refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress); virtual std::string typeString() const { return std::string(TRANS("Voxelisation"));}; //!Get the human-readable options for the normalisation, based upon enum static std::string getNormaliseTypeString(int type); //!Get the human-readable options for filtering, based upon enum static std::string getFilterTypeString(int type); //!Get the human-readable options for the visual representation (enum) static std::string getRepresentTypeString(int type); //!Get the human-readable options for boundary behaviour during filtering, based upon enum static std::string getFilterBoundTypeString(int type); //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter. Returns true if prop set OK bool setProperty(unsigned int key, const std::string &value, bool &needUpdate); //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Dump state to output stream, using specified format bool writeState(std::ostream &f,unsigned int format, unsigned int depth=0) const; //!Read the state of the filter from XML file. If this //fails, filter will be in an undefined state. bool readState(xmlNodePtr &node, const std::string &packDir); //!Get the stream types that will be dropped during ::refresh unsigned int getRefreshBlockMask() const; //!Get the stream types that will be generated during ::refresh unsigned int getRefreshEmitMask() const; //!Get the stream types that will be possibly ued during ::refresh unsigned int getRefreshUseMask() const; //!Set internal property value using a selection binding void setPropFromBinding(const SelectionBinding &b) ; //!calculate the widths of the bins in 3D void calculateWidthsFromNumBins(Point3D &widths, unsigned long long *nb) const{ Point3D low, high; bc.getBounds(low, high); for (unsigned int i = 0; i < 3; i++) { widths[i] = (high[i] - low[i])/(float)nb[i]; } } //!set the number of the bins in 3D void calculateNumBinsFromWidths(Point3D &widths, unsigned long long *nb) const{ Point3D low, high; bc.getBounds(low, high); for (unsigned int i = 0; i < 3; i++) { if (low[i] == high[i]) nb[i] = 1; else nb[i] = (unsigned long long)((high[i] - low[i])/(float)widths[i]) + 1; } } #ifdef DEBUG bool runUnitTests(); #endif }; #endif 3Depict-0.0.19/src/backend/filters/profile.cpp0000644000175000017500000014002712723151506020460 0ustar pcuserpcuser/* * profile.cpp - Compute composition or density profiles from valued point clouds * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "profile.h" #include "../plot.h" #include "filterCommon.h" #include "geometryHelpers.h" using std::vector; using std::string; using std::pair; using std::make_pair; using std::map; //!Possible primitive types for composition profiles enum { PRIMITIVE_CYLINDER_AXIAL, PRIMITIVE_CYLINDER_RADIAL, PRIMITIVE_SPHERE, PRIMITIVE_END, //Not actually a primitive, just end of enum }; //!Error codes enum { ERR_NUMBINS=1, ERR_MEMALLOC, ERR_ABORT, ERR_COMP_ENUM_END }; const char *PRIMITIVE_NAME[]={ NTRANS("Cylinder (axial)"), NTRANS("Cylinder (radial)"), NTRANS("Sphere") }; const float DEFAULT_RADIUS = 10.0f; const unsigned int MINEVENTS_DEFAULT =10; ProfileFilter::ProfileFilter() : primitiveType(PRIMITIVE_CYLINDER_AXIAL), showPrimitive(true), lockAxisMag(false),normalise(true), fixedBins(0), nBins(1000), binWidth(0.5f), minEvents(MINEVENTS_DEFAULT), rgba(0,0,1), plotStyle(0) { COMPILE_ASSERT(THREEDEP_ARRAYSIZE(PRIMITIVE_NAME) == PRIMITIVE_END); wantDensity=false; errMode.mode=PLOT_ERROR_NONE; errMode.movingAverageNum=4; vectorParams.push_back(Point3D(0.0,0.0,0.0)); vectorParams.push_back(Point3D(0,20.0,0.0)); scalarParams.push_back(DEFAULT_RADIUS); haveRangeParent=false; } //Puts an ion in its appropriate range position, given ionID mapping, //range data (if any), mass to charge and the output table void ProfileFilter::binIon(unsigned int targetBin, const RangeStreamData* rng, const map &ionIDMapping, vector > &frequencyTable, float massToCharge) { //if we have no range data, then simply increment its position in a 1D table //which will later be used as "count" data (like some kind of density plot) if(!rng) { ASSERT(frequencyTable.size() == 1); //There is a really annoying numerical boundary case //that makes the target bin equate to the table size. //disallow this. if(targetBin < frequencyTable[0].size()) { vector::iterator it; it=frequencyTable[0].begin()+targetBin; #pragma omp critical (*it)++; } return; } //We have range data, we need to use it to classify the ion and then increment //the appropriate position in the table unsigned int rangeID = rng->rangeFile->getRangeID(massToCharge); if(rangeID != (unsigned int)(-1) && rng->enabledRanges[rangeID]) { unsigned int ionID=rng->rangeFile->getIonID(rangeID); unsigned int pos; pos = ionIDMapping.find(ionID)->second; vector::iterator it; it=frequencyTable[pos].begin()+targetBin; #pragma omp critical (*it)++; } } Filter *ProfileFilter::cloneUncached() const { ProfileFilter *p = new ProfileFilter(); p->primitiveType=primitiveType; p->showPrimitive=showPrimitive; p->vectorParams.resize(vectorParams.size()); p->scalarParams.resize(scalarParams.size()); std::copy(vectorParams.begin(),vectorParams.end(),p->vectorParams.begin()); std::copy(scalarParams.begin(),scalarParams.end(),p->scalarParams.begin()); p->wantDensity=wantDensity; p->normalise=normalise; p->fixedBins=fixedBins; p->lockAxisMag=lockAxisMag; p->rgba=rgba; p->binWidth=binWidth; p->nBins = nBins; p->plotStyle=plotStyle; p->errMode=errMode; //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->userString=userString; return p; } void ProfileFilter::initFilter(const std::vector &dataIn, std::vector &dataOut) { //Check for range file parent for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_RANGE) { haveRangeParent=true; return; } } haveRangeParent=false; } unsigned int ProfileFilter::refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress) { //Clear selection devices // FIXME: Leaking drawables. clearDevices(); if(showPrimitive) { //TODO: This is a near-copy of ionClip.cpp - refactor //construct a new primitive, do not cache DrawStreamData *drawData=new DrawStreamData; drawData->parent=this; switch(primitiveType) { case PRIMITIVE_CYLINDER_AXIAL: case PRIMITIVE_CYLINDER_RADIAL: { //Origin + normal ASSERT(vectorParams.size() == 2); //Add drawable components DrawCylinder *dC = new DrawCylinder; dC->setOrigin(vectorParams[0]); dC->setRadius(scalarParams[0]); dC->setColour(0.5,0.5,0.5,0.3); dC->setSlices(40); dC->setLength(sqrtf(vectorParams[1].sqrMag())*2.0f); dC->setDirection(vectorParams[1]); dC->wantsLight=true; drawData->drawables.push_back(dC); //Set up selection "device" for user interaction //==== //The object is selectable dC->canSelect=true; //Start and end radii must be the same (not a //tapered cylinder) dC->lockRadii(); SelectionDevice *s = new SelectionDevice(this); SelectionBinding b; //Bind the drawable object to the properties we wish //to be able to modify //Bind left + command button to move b.setBinding(SELECT_BUTTON_LEFT,FLAG_CMD,DRAW_CYLINDER_BIND_ORIGIN, BINDING_CYLINDER_ORIGIN,dC->getOrigin(),dC); b.setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b); //Bind left + shift to change orientation b.setBinding(SELECT_BUTTON_LEFT,FLAG_SHIFT,DRAW_CYLINDER_BIND_DIRECTION, BINDING_CYLINDER_DIRECTION,dC->getDirection(),dC); if(lockAxisMag) b.setInteractionMode(BIND_MODE_POINT3D_ROTATE_LOCK); else b.setInteractionMode(BIND_MODE_POINT3D_ROTATE); s->addBinding(b); //Bind right button to changing position b.setBinding(SELECT_BUTTON_RIGHT,0,DRAW_CYLINDER_BIND_ORIGIN, BINDING_CYLINDER_ORIGIN,dC->getOrigin(),dC); b.setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b); //Bind middle button to changing orientation b.setBinding(SELECT_BUTTON_MIDDLE,0,DRAW_CYLINDER_BIND_DIRECTION, BINDING_CYLINDER_DIRECTION,dC->getDirection(),dC); if(lockAxisMag) b.setInteractionMode(BIND_MODE_POINT3D_ROTATE_LOCK); else b.setInteractionMode(BIND_MODE_POINT3D_ROTATE); s->addBinding(b); //Bind left button to changing radius b.setBinding(SELECT_BUTTON_LEFT,0,DRAW_CYLINDER_BIND_RADIUS, BINDING_CYLINDER_RADIUS,dC->getRadius(),dC); b.setInteractionMode(BIND_MODE_FLOAT_TRANSLATE); b.setFloatLimits(0,std::numeric_limits::max()); s->addBinding(b); devices.push_back(s); //===== break; } case PRIMITIVE_SPHERE: { //Add drawable components DrawSphere *dS = new DrawSphere; dS->setOrigin(vectorParams[0]); dS->setRadius(scalarParams[0]); //FIXME: Alpha blending is all screwed up. May require more //advanced drawing in scene. (front-back drawing). //I have set alpha=1 for now. dS->setColour(0.5,0.5,0.5,1.0); dS->setLatSegments(40); dS->setLongSegments(40); dS->wantsLight=true; drawData->drawables.push_back(dS); //Set up selection "device" for user interaction //Note the order of s->addBinding is critical, //as bindings are selected by first match. //==== //The object is selectable dS->canSelect=true; SelectionDevice *s = new SelectionDevice(this); SelectionBinding b[3]; //Apple doesn't have right click, so we need //to hook up an additional system for them. //Don't use ifdefs, as this would be useful for //normal laptops and the like. b[0].setBinding(SELECT_BUTTON_LEFT,FLAG_CMD,DRAW_SPHERE_BIND_ORIGIN, BINDING_SPHERE_ORIGIN,dS->getOrigin(),dS); b[0].setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b[0]); //Bind the drawable object to the properties we wish //to be able to modify b[1].setBinding(SELECT_BUTTON_LEFT,0,DRAW_SPHERE_BIND_RADIUS, BINDING_SPHERE_RADIUS,dS->getRadius(),dS); b[1].setInteractionMode(BIND_MODE_FLOAT_TRANSLATE); b[1].setFloatLimits(0,std::numeric_limits::max()); s->addBinding(b[1]); b[2].setBinding(SELECT_BUTTON_RIGHT,0,DRAW_SPHERE_BIND_ORIGIN, BINDING_SPHERE_ORIGIN,dS->getOrigin(),dS); b[2].setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b[2]); devices.push_back(s); //===== break; } default: ASSERT(false); } drawData->cached=0; getOut.push_back(drawData); } //Propagate all the incoming data (excluding ions) propagateStreams(dataIn,getOut,STREAM_TYPE_IONS,true); //use the cached copy of the data if we have it. if(cacheOK) { //propagate our cached plot data. propagateCache(getOut); ASSERT(filterOutputs.back()->getStreamType() == STREAM_TYPE_PLOT); progress.filterProgress=100; return 0; } //Ion Frequencies (composition specific if rangefile present) vector > ionFrequencies; RangeStreamData *rngData=0; for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_RANGE) { rngData =((RangeStreamData *)dataIn[ui]); break; } } unsigned int numBins, errCode; { float length; errCode=getBinData(numBins,length); if(!numBins) return 0; } if(errCode) return errCode; //Indirection vector to convert ionFrequencies position to ionID mapping. //Should only be used in conjunction with rngData == true std::map ionIDMapping,inverseIDMapping; //Allocate space for the frequency table if(rngData) { ASSERT(rngData->rangeFile); unsigned int enabledCount=0; for(unsigned int ui=0;uirangeFile->getNumIons();ui++) { //TODO: Might be nice to detect if an ions ranges //are all, disabled then if they are, enter this "if" //anyway if(rngData->enabledIons[ui]) { //Keep the forwards mapping for binning ionIDMapping.insert(make_pair(ui,enabledCount)); //Keep the inverse mapping for labelling inverseIDMapping.insert(make_pair(enabledCount,ui)); enabledCount++; } } //Nothing to do. if(!enabledCount) return 0; try { ionFrequencies.resize(enabledCount); //Allocate and Initialise all elements to zero #pragma omp parallel for for(unsigned int ui=0;ui primitiveMap; primitiveMap[PRIMITIVE_CYLINDER_AXIAL] = CROP_CYLINDER_INSIDE_AXIAL; primitiveMap[PRIMITIVE_CYLINDER_RADIAL] = CROP_CYLINDER_INSIDE_RADIAL; primitiveMap[PRIMITIVE_SPHERE] = CROP_SPHERE_INSIDE; CropHelper dataMapping(totalSize,primitiveMap[primitiveType], vectorParams,scalarParams ); dataMapping.setMapMaxima(numBins); for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *dIon = (const IonStreamData*)dataIn[ui]; #ifdef _OPENMP //OpenMP abort is not v. good, simply spin instead of working bool spin=false; #endif //Process ion streams size_t nIons=dIon->data.size(); #pragma omp parallel for shared(n) for(size_t uj=0;ujdata[uj]); //Keep ion if inside cylinder if(targetBin!=(unsigned int)-1) { //Push data into the correct bin. // based upon eg ranging information and target 1D bin binIon(targetBin,rngData,ionIDMapping,ionFrequencies, dIon->data[uj].getMassToCharge()); } #ifdef _OPENMP #pragma omp atomic n++; //FIXME: Performance - we could use a separate non-sahred counter to reduce locking? if(omp_get_thread_num() == 0) { #endif progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); if(*Filter::wantAbort) { #ifdef _OPENMP spin=true; #else return ERR_ABORT; #endif } #ifdef _OPENMP } #endif } #ifdef _OPENMP //Check to see if we aborted the Calculation if(spin) return ERR_ABORT; #endif break; } default: //Do not propagate other types. break; } } #ifdef DEBUG ASSERT(ionFrequencies.size()); //Ion frequencies must be of equal length for(unsigned int ui=1;ui normalisationFactor; vector normalisationCount; normalisationFactor.resize(ionFrequencies[0].size()); normalisationCount.resize(ionFrequencies[0].size()); bool needNormalise=false; //Perform the appropriate normalisation if(!rngData && normalise) { // For density plots, normalise by // the volume of the primitive's shell switch(primitiveType) { case PRIMITIVE_CYLINDER_AXIAL: case PRIMITIVE_CYLINDER_RADIAL: { float dx; if(fixedBins) dx=(sqrtf(vectorParams[1].sqrMag())/(float)numBins); else dx=binWidth; needNormalise=true; float nFact; //Normalise by cylinder slice volume, pi*r^2*h. // This is the same in both radial and axial mode as the radial slices are equi-volume, // same as axial mode nFact=1.0/(M_PI*scalarParams[0]*scalarParams[0]*dx); for(unsigned int uj=0;uj (n+1)^3 -n^3 = (3*n^2) + (3*n) + 1 normalisationFactor[uj] = 1.0/(4.0/3.0*M_PI* dx*(3.0*((float)uj*(float)uj + uj) + 1.0)); } break; } default: ASSERT(false); } } else if(normalise && rngData) //compute normalisation values, if we are in composition mode { // the loops' nesting is reversed as we need to sum over distinct plots //Density profiles (non-ranged plots) have a fixed normalisation factor needNormalise=true; for(unsigned int uj=0;ujindex=ui; plotData[ui]->parent=this; plotData[ui]->xLabel= TRANS("Distance"); plotData[ui]->errDat=errMode; if(normalise) { //If we have composition, normalise against //sum composition = 1 otherwise use volume of bin //as normalisation factor if(rngData) plotData[ui]->yLabel= TRANS("Fraction"); else plotData[ui]->yLabel= TRANS("Density (\\frac{\\#}{len^3})"); } else plotData[ui]->yLabel= TRANS("Count"); //Give the plot a title like TRANS("Myplot:Mg" (if have range) or "MyPlot") (no range) if(rngData) { unsigned int thisIonID; thisIonID = inverseIDMapping.find(ui)->second; plotData[ui]->dataLabel = getUserString() + string(":") + rngData->rangeFile->getName(thisIonID); //Set the plot colour to the ion colour RGBf col; col=rngData->rangeFile->getColour(thisIonID); plotData[ui]->r =col.red; plotData[ui]->g =col.green; plotData[ui]->b =col.blue; } else { //If it only has one component, then //it's not really a composition profile is it? plotData[ui]->dataLabel= TRANS("Freq. Profile"); plotData[ui]->r = rgba.r(); plotData[ui]->g = rgba.g(); plotData[ui]->b = rgba.b(); plotData[ui]->a = rgba.a(); } plotData[ui]->xyData.reserve(ionFrequencies[ui].size()); //Go through each bin, then perform the appropriate normalisation for(unsigned int uj=0;ujxyData.push_back( std::make_pair(xPos, normFactor*(float)ionFrequencies[ui][uj])); } else { plotData[ui]->xyData.push_back( std::make_pair(xPos,ionFrequencies[ui][uj]) ); } } plotData[ui]->plotStyle = plotStyle; plotData[ui]->plotMode=PLOT_MODE_1D; //If we ended up with any data, display it // otherwise, trash the plot info if(plotData[ui]->xyData.size()) { cacheAsNeeded(plotData[ui]); getOut.push_back(plotData[ui]); } else { consoleOutput.push_back(TRANS("No data remained in profile - cannot display result")); delete plotData[ui]; } } progress.filterProgress=100; return 0; } std::string ProfileFilter::getSpecificErrString(unsigned int code) const { const char *errCodes[] = { "", "Too many bins in comp. profile.", "Not enough memory for comp. profile.", "Aborted composition prof." }; COMPILE_ASSERT(THREEDEP_ARRAYSIZE(errCodes) == ERR_COMP_ENUM_END); ASSERT(code < ERR_COMP_ENUM_END); return errCodes[code]; } bool ProfileFilter::setProperty( unsigned int key, const std::string &value, bool &needUpdate) { switch(key) { case PROFILE_KEY_DENSITY_ONLY: { if(!applyPropertyNow(wantDensity,value,needUpdate)) return false; break; } case PROFILE_KEY_BINWIDTH: { float newBinWidth; if(stream_cast(newBinWidth,value)) return false; if(newBinWidth < sqrtf(std::numeric_limits::epsilon())) return false; binWidth=newBinWidth; clearCache(); needUpdate=true; break; } case PROFILE_KEY_FIXEDBINS: { if(!applyPropertyNow(fixedBins,value,needUpdate)) return false; break; } case PROFILE_KEY_NORMAL: { Point3D newPt; if(!newPt.parse(value)) return false; if(primitiveType == PRIMITIVE_CYLINDER_AXIAL) { if(lockAxisMag && newPt.sqrMag() > sqrtf(std::numeric_limits::epsilon())) { newPt.normalise(); newPt*=sqrtf(vectorParams[1].sqrMag()); } } if(newPt.sqrMag() < sqrtf(std::numeric_limits::epsilon())) return false; if(!(vectorParams[1] == newPt )) { vectorParams[1] = newPt; needUpdate=true; clearCache(); } return true; } case PROFILE_KEY_MINEVENTS: { if(!applyPropertyNow(minEvents,value,needUpdate)) return false; break; } case PROFILE_KEY_NUMBINS: { unsigned int newNumBins; if(stream_cast(newNumBins,value)) return false; //zero bins disallowed if(!newNumBins) return false; nBins=newNumBins; clearCache(); needUpdate=true; break; } case PROFILE_KEY_ORIGIN: { if(!applyPropertyNow(vectorParams[0],value,needUpdate)) return false; return true; } case PROFILE_KEY_PRIMITIVETYPE: { unsigned int newPrimitive; newPrimitive=getPrimitiveId(value); if(newPrimitive >= PRIMITIVE_END) return false; //set the new primitive type primitiveType=newPrimitive; //set up the values for the new primitive type, // preserving data where possible switch(primitiveType) { case PRIMITIVE_CYLINDER_AXIAL: case PRIMITIVE_CYLINDER_RADIAL: { if(vectorParams.size() != 2) { if(vectorParams.size() <2 ) { vectorParams.clear(); vectorParams.push_back(Point3D(0,0,0)); vectorParams.push_back(Point3D(0,20,0)); } else vectorParams.resize(2); } if(scalarParams.size() != 1) { if (scalarParams.size() > 1) { scalarParams.clear(); scalarParams.push_back(DEFAULT_RADIUS); } else scalarParams.resize(1); } if(primitiveType == PRIMITIVE_CYLINDER_RADIAL) fixedBins=true; break; } case PRIMITIVE_SPHERE: { if(vectorParams.size() !=1) { if(vectorParams.size() >1) vectorParams.resize(1); else vectorParams.push_back(Point3D(0,0,0)); } if(scalarParams.size() !=1) { if(scalarParams.size() > 1) scalarParams.resize(1); else scalarParams.push_back(DEFAULT_RADIUS); } break; } default: ASSERT(false); } clearCache(); needUpdate=true; return true; } case PROFILE_KEY_RADIUS: { float newRad; if(stream_cast(newRad,value)) return false; if(newRad < sqrtf(std::numeric_limits::epsilon())) return false; if(scalarParams[0] != newRad ) { scalarParams[0] = newRad; needUpdate=true; clearCache(); } return true; } case PROFILE_KEY_SHOWPRIMITIVE: { if(!applyPropertyNow(showPrimitive,value,needUpdate)) return false; break; } case PROFILE_KEY_NORMALISE: { if(!applyPropertyNow(normalise,value,needUpdate)) return false; break; } case PROFILE_KEY_LOCKAXISMAG: { if(!applyPropertyNow(lockAxisMag,value,needUpdate)) return false; break; } case PROFILE_KEY_PLOTTYPE: { unsigned int tmpPlotType; tmpPlotType=plotID(value); if(tmpPlotType >= PLOT_LINE_NONE) return false; plotStyle = tmpPlotType; needUpdate=true; break; } case PROFILE_KEY_COLOUR: { ColourRGBA tmpRgba; if(!tmpRgba.parse(value)) return false; rgba=tmpRgba.toRGBAf(); needUpdate=true; break; } case PROFILE_KEY_ERRMODE: { unsigned int tmpMode; tmpMode=plotErrmodeID(value); if(tmpMode >= PLOT_ERROR_ENDOFENUM) return false; errMode.mode= tmpMode; needUpdate=true; break; } case PROFILE_KEY_AVGWINSIZE: { unsigned int tmpNum; if(stream_cast(tmpNum,value)) return false; if(tmpNum<=1) return false; errMode.movingAverageNum=tmpNum; needUpdate=true; break; } default: ASSERT(false); } if(needUpdate) clearCache(); return true; } void ProfileFilter::getProperties(FilterPropGroup &propertyList) const { bool doDensityPlot = (!haveRangeParent) || wantDensity; string str,tmpStr; FilterProperty p; size_t curGroup=0; if(haveRangeParent) { stream_cast(tmpStr,wantDensity); p.name=TRANS("Total Density"); p.data=tmpStr; p.key=PROFILE_KEY_DENSITY_ONLY; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Do not do per-species analysis, perform density computation only"); propertyList.addProperty(p,curGroup); } //Allow primitive selection if we have more than one primitive if(PRIMITIVE_END > 1) { //Choices for primitive type vector > choices; for(unsigned int ui=0;ui > choices; tmpStr=plotString(PLOT_LINE_LINES); choices.push_back(make_pair((unsigned int) PLOT_LINE_LINES,tmpStr)); tmpStr=plotString(PLOT_LINE_BARS); choices.push_back(make_pair((unsigned int)PLOT_LINE_BARS,tmpStr)); tmpStr=plotString(PLOT_LINE_STEPS); choices.push_back(make_pair((unsigned int)PLOT_LINE_STEPS,tmpStr)); tmpStr=plotString(PLOT_LINE_STEM); choices.push_back(make_pair((unsigned int)PLOT_LINE_STEM,tmpStr)); tmpStr= choiceString(choices,plotStyle); p.name=TRANS("Plot Type"); p.data=tmpStr; p.type=PROPERTY_TYPE_CHOICE; p.helpText=TRANS("Visual style for plot"); p.key=PROFILE_KEY_PLOTTYPE; propertyList.addProperty(p,curGroup); //If we are not doing per-species, then we need colour if(doDensityPlot) { //Convert the colour to a hex string p.name=TRANS("Colour"); p.data=rgba.toColourRGBA().rgbString(); p.type=PROPERTY_TYPE_COLOUR; p.helpText=TRANS("Colour of plot"); p.key=PROFILE_KEY_COLOUR; propertyList.addProperty(p,curGroup); } propertyList.setGroupTitle(curGroup,TRANS("Appearance")); curGroup++; choices.clear(); tmpStr=plotErrmodeString(PLOT_ERROR_NONE); choices.push_back(make_pair((unsigned int) PLOT_ERROR_NONE,tmpStr)); tmpStr=plotErrmodeString(PLOT_ERROR_MOVING_AVERAGE); choices.push_back(make_pair((unsigned int) PLOT_ERROR_MOVING_AVERAGE,tmpStr)); tmpStr= choiceString(choices,errMode.mode); p.name=TRANS("Err. Estimator"); p.data=tmpStr; p.type=PROPERTY_TYPE_CHOICE; p.helpText=TRANS("Method of estimating error associated with each bin"); p.key=PROFILE_KEY_ERRMODE; propertyList.addProperty(p,curGroup); if(errMode.mode == PLOT_ERROR_MOVING_AVERAGE) { stream_cast(tmpStr,errMode.movingAverageNum); p.name=TRANS("Avg. Window"); p.data=tmpStr; p.type=PROPERTY_TYPE_INTEGER; p.helpText=TRANS("Number of bins to include in moving average filter"); p.key=PROFILE_KEY_AVGWINSIZE; propertyList.addProperty(p,curGroup); } propertyList.setGroupTitle(curGroup,TRANS("Error analysis")); } unsigned int ProfileFilter::getBinData(unsigned int &numBins, float &length) const { //Number of bins, having determined if we are using //fixed bin count or not switch(primitiveType) { case PRIMITIVE_SPHERE: //radius of sphere length=scalarParams[0]; break; case PRIMITIVE_CYLINDER_AXIAL: //length of cylinder, full axis length length=sqrtf(vectorParams[1].sqrMag()); break; case PRIMITIVE_CYLINDER_RADIAL: //radius of cylinder length =scalarParams[0]; break; default: ASSERT(false); } if(fixedBins) numBins=nBins; else { switch(primitiveType) { case PRIMITIVE_CYLINDER_AXIAL: case PRIMITIVE_CYLINDER_RADIAL: case PRIMITIVE_SPHERE: { ASSERT(binWidth > std::numeric_limits::epsilon()); //Check for possible overflow if(length/binWidth > (float)std::numeric_limits::max()) return ERR_NUMBINS; numBins=(unsigned int)(length/binWidth); break; } default: ASSERT(false); } } return 0; } float ProfileFilter::getBinPosition(unsigned int nBin) const { unsigned int nBinsMax; float fullLen, xPos; getBinData(nBinsMax,fullLen); ASSERT(nBin < nBinsMax) xPos = ((float) nBin + 0.5)/(float)nBinsMax; if( primitiveType == PRIMITIVE_CYLINDER_RADIAL) { float maxPosSqr = fullLen*fullLen; //compute fraction xPos = sqrt ( xPos*maxPosSqr); } else { xPos = xPos*fullLen; } return xPos; } //!Get approx number of bytes for caching output size_t ProfileFilter::numBytesForCache(size_t nObjects) const { float length; unsigned int errCode, numBins; errCode=getBinData(numBins,length); if(errCode) return (unsigned int)-1; return (numBins*2*sizeof(float)); } bool ProfileFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<" << trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; for(unsigned int ui=0; ui" << endl; } f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; for(unsigned int ui=0; ui" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" <" << endl; f << tabs(depth) << "" << endl; break; } default: ASSERT(false); return false; } return true; } void ProfileFilter::setUserString(const std::string &str) { if(userString != str) { userString=str; clearCache(); } } bool ProfileFilter::readState(xmlNodePtr &nodePtr, const std::string &stateFileDir) { //Retrieve user string //=== if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlChar *xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //=== std::string tmpStr; //Retrieve primitive type //==== if(XMLHelpFwdToElem(nodePtr,"primitivetype")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to digit if(stream_cast(primitiveType,tmpStr)) return false; //FIXME: DEPRECATE 3Depict versions <=0.0.17 had only two primitives, // cylinder and sphere. /* if(versionCheckGreater(Filter::stateWriterVersion,("0.0.17"))) { //remap the primitive type as needed if(primitiveType == PRIMITIVE_CYLINDER_RADIAL) primitiveType=PRIMITIVE_SPHERE; } */ if(primitiveType >= PRIMITIVE_END) return false; xmlFree(xmlString); //==== //Retrieve primitive visibility //==== if(XMLHelpFwdToElem(nodePtr,"showprimitive")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(!boolStrDec(tmpStr,showPrimitive)) return false; xmlFree(xmlString); //==== //Retrieve axis lock mode //==== if(XMLHelpFwdToElem(nodePtr,"lockaxismag")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(!boolStrDec(tmpStr,lockAxisMag)) return false; xmlFree(xmlString); //==== //Retrieve vector parameters //=== if(XMLHelpFwdToElem(nodePtr,"vectorparams")) return false; xmlNodePtr tmpNode=nodePtr; nodePtr=nodePtr->xmlChildrenNode; vectorParams.clear(); while(!XMLHelpFwdToElem(nodePtr,"point3d")) { float x,y,z; //--Get X value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"x"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(x,tmpStr)) return false; //--Get Z value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"y"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(y,tmpStr)) return false; //--Get Y value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"z"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(z,tmpStr)) return false; vectorParams.push_back(Point3D(x,y,z)); } //=== nodePtr=tmpNode; //Retrieve scalar parameters //=== if(XMLHelpFwdToElem(nodePtr,"scalarparams")) return false; tmpNode=nodePtr; nodePtr=nodePtr->xmlChildrenNode; scalarParams.clear(); while(!XMLHelpFwdToElem(nodePtr,"scalar")) { float v; //Get value xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(v,tmpStr)) return false; scalarParams.push_back(v); } //=== //Check the scalar params match the selected primitive switch(primitiveType) { case PRIMITIVE_CYLINDER_AXIAL: case PRIMITIVE_CYLINDER_RADIAL: if(vectorParams.size() != 2 || scalarParams.size() !=1) return false; break; case PRIMITIVE_SPHERE: if(vectorParams.size() != 1 || scalarParams.size() !=1) return false; break; default: ASSERT(false); return false; } nodePtr=tmpNode; //Retrieve normalisation on/off //==== if(XMLHelpFwdToElem(nodePtr,"normalise")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(!boolStrDec(tmpStr,normalise)) return false; xmlFree(xmlString); //==== //Retrieve fixed bins on/off //==== if(XMLHelpFwdToElem(nodePtr,"fixedbins")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(!boolStrDec(tmpStr,fixedBins)) return false; xmlFree(xmlString); //==== //Retrieve num bins //==== if(XMLHelpFwdToElem(nodePtr,"nbins")) return false; if(XMLHelpGetProp(nBins,nodePtr,"value")) return false; if(XMLHelpGetProp(minEvents,nodePtr,"minevents")) { //FIXME: Deprecate me. minEvents=MINEVENTS_DEFAULT; } //==== //Retrieve bin width //==== if(XMLHelpFwdToElem(nodePtr,"binwidth")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(stream_cast(binWidth,tmpStr)) return false; xmlFree(xmlString); //==== //Retrieve colour //==== if(XMLHelpFwdToElem(nodePtr,"colour")) return false; if(!parseXMLColour(nodePtr,rgba)) return false; //==== //Retrieve plot type //==== if(XMLHelpFwdToElem(nodePtr,"plottype")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to digit if(stream_cast(plotStyle,tmpStr)) return false; if(plotStyle >= PLOT_LINE_NONE) return false; xmlFree(xmlString); //==== return true; } unsigned int ProfileFilter::getRefreshBlockMask() const { //Absolutely anything can go through this filter. return 0; } unsigned int ProfileFilter::getRefreshEmitMask() const { if(showPrimitive) return STREAM_TYPE_PLOT | STREAM_TYPE_DRAW; else return STREAM_TYPE_PLOT; } unsigned int ProfileFilter::getRefreshUseMask() const { return STREAM_TYPE_IONS | STREAM_TYPE_RANGE; } void ProfileFilter::setPropFromBinding(const SelectionBinding &b) { switch(b.getID()) { case BINDING_CYLINDER_RADIUS: case BINDING_SPHERE_RADIUS: b.getValue(scalarParams[0]); break; case BINDING_CYLINDER_ORIGIN: case BINDING_SPHERE_ORIGIN: b.getValue(vectorParams[0]); break; case BINDING_CYLINDER_DIRECTION: { Point3D pOld=vectorParams[1]; b.getValue(vectorParams[1]); //Test getting the bin data. // if something is wrong, abort float length; unsigned int numBins; unsigned int errCode= getBinData(numBins,length); if(errCode || !numBins) { vectorParams[1]=pOld; return; } break; } default: ASSERT(false); } clearCache(); } unsigned int ProfileFilter::getPrimitiveId(const std::string &primitiveName) { for(size_t ui=0;ui > &compositionData, vector &h); IonStreamData *synthLinearProfile(const Point3D &start, const Point3D &end, float radialSpread,unsigned int numPts); bool ProfileFilter::runUnitTests() { if(!testDensityCylinder()) return false; if(!testCompositionCylinder()) return false; return true; } bool testCompositionCylinder() { IonStreamData *d; const size_t NUM_PTS=10000; //Create a cylinder of data, forming a linear profile Point3D startPt(-1.0f,-1.0f,-1.0f),endPt(1.0f,1.0f,1.0f); d= synthLinearProfile(startPt,endPt, 0.5f, NUM_PTS); //Generate two compositions for the test dataset { vector > vecCompositions; vecCompositions.push_back(make_pair(2.0f,0.5f)); vecCompositions.push_back(make_pair(3.0f,0.5f)); synthComposition(vecCompositions,d->data); } //Build a faux rangestream RangeStreamData *rngStream; rngStream = new RangeStreamData; rngStream->rangeFile = new RangeFile; RGBf rgb; rgb.red=rgb.green=rgb.blue=1.0f; unsigned int aIon,bIon; std::string tmpStr; tmpStr="A"; aIon=rngStream->rangeFile->addIon(tmpStr,tmpStr,rgb); tmpStr="B"; bIon=rngStream->rangeFile->addIon(tmpStr,tmpStr,rgb); rngStream->rangeFile->addRange(1.5,2.5,aIon); rngStream->rangeFile->addRange(2.5,3.5,bIon); rngStream->enabledIons.resize(2,true); rngStream->enabledRanges.resize(2,true); //Construct the composition filter ProfileFilter *f = new ProfileFilter; //Build some points to pass to the filter vector streamIn,streamOut; bool needUp; std::string s; stream_cast(s,Point3D((startPt+endPt)*0.5f)); TEST(f->setProperty(PROFILE_KEY_ORIGIN,s,needUp),"set origin"); TEST(f->setProperty(PROFILE_KEY_MINEVENTS,"0",needUp),"set origin"); stream_cast(s,Point3D((endPt-startPt)*0.5f)); TEST(f->setProperty(PROFILE_KEY_NORMAL,s,needUp),"set direction"); TEST(f->setProperty(PROFILE_KEY_SHOWPRIMITIVE,"1",needUp),"Set cylinder visibility"); TEST(f->setProperty(PROFILE_KEY_NORMALISE,"1",needUp),"Disable normalisation"); TEST(f->setProperty(PROFILE_KEY_RADIUS,"5",needUp),"Set radius"); //Inform the filter about the range stream streamIn.push_back(rngStream); f->initFilter(streamIn,streamOut); streamIn.push_back(d); f->setCaching(false); ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"Refresh error code"); //2* plot, 1*rng, 1*draw TEST(streamOut.size() == 4, "output stream count"); delete d; std::map countMap; countMap[STREAM_TYPE_PLOT] = 0; countMap[STREAM_TYPE_DRAW] = 0; countMap[STREAM_TYPE_RANGE] = 0; for(unsigned int ui=0;uigetStreamType()) != countMap.end()); countMap[streamOut[ui]->getStreamType()]++; } TEST(countMap[STREAM_TYPE_PLOT] == 2,"Plot count"); TEST(countMap[STREAM_TYPE_DRAW] == 1,"Draw count"); TEST(countMap[STREAM_TYPE_RANGE] == 1,"Range count"); const PlotStreamData* plotData=0; for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_PLOT) { plotData = (const PlotStreamData *)streamOut[ui]; break; } } TEST(plotData,"Should have plot data"); TEST(plotData->xyData.size(),"Plot data size"); for(size_t ui=0;uixyData.size(); ui++) { TEST(plotData->xyData[ui].second <= 1.0f && plotData->xyData[ui].second >=0.0f,"normalised data range test"); } delete rngStream->rangeFile; for(unsigned int ui=0;ui > vecCompositions; vecCompositions.push_back(make_pair(2.0f,0.5f)); vecCompositions.push_back(make_pair(3.0f,0.5f)); synthComposition(vecCompositions,d->data); } ProfileFilter *f = new ProfileFilter; f->setCaching(false); //Build some points to pass to the filter vector streamIn,streamOut; streamIn.push_back(d); bool needUp; std::string s; stream_cast(s,Point3D((startPt+endPt)*0.5f)); TEST(f->setProperty(PROFILE_KEY_ORIGIN,s,needUp),"set origin"); stream_cast(s,Point3D((endPt-startPt))); TEST(f->setProperty(PROFILE_KEY_NORMAL,s,needUp),"set direction"); TEST(f->setProperty(PROFILE_KEY_SHOWPRIMITIVE,"1",needUp),"Set cylinder visibility"); TEST(f->setProperty(PROFILE_KEY_NORMALISE,"0",needUp),"Disable normalisation"); TEST(f->setProperty(PROFILE_KEY_RADIUS,"5",needUp),"Set radius"); ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"Refresh error code"); delete f; delete d; TEST(streamOut.size() == 2, "output stream count"); std::map countMap; countMap[STREAM_TYPE_PLOT] = 0; countMap[STREAM_TYPE_DRAW] = 0; for(unsigned int ui=0;uigetStreamType()) != countMap.end()); countMap[streamOut[ui]->getStreamType()]++; } TEST(countMap[STREAM_TYPE_PLOT] == 1,"Plot count"); TEST(countMap[STREAM_TYPE_DRAW] == 1,"Draw count"); const PlotStreamData* plotData=0; for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_PLOT) { plotData = (const PlotStreamData *)streamOut[ui]; break; } } float sum=0; for(size_t ui=0;uixyData.size(); ui++) sum+=plotData->xyData[ui].second; TEST(sum > NUM_PTS/1.2f,"Number points roughly OK"); TEST(sum <= NUM_PTS,"No overcounting"); for(unsigned int ui=0;ui > &compositionData, vector &h) { float fractionSum=0; for(size_t ui=0;ui > ionCuts; ionCuts.resize(compositionData.size()); //ionCuts.resize[compositionData.size()]; float runningSum=0; for(size_t ui=0;ui=ionCuts[uj].second) { newMass=ionCuts[uj].first; haveSetMass=true; break; } } }while(!haveSetMass); h[ui].setMassToCharge(newMass); } } //Create a line of points of fixed mass (1), with a top-hat radial spread function // so we end up with a cylinder of unit mass data along some start-end axis //you must free the returned value by calling "delete" IonStreamData *synthLinearProfile(const Point3D &start, const Point3D &end, float radialSpread,unsigned int numPts) { ASSERT((start-end).sqrMag() > std::numeric_limits::epsilon()); IonStreamData *d = new IonStreamData; IonHit h; h.setMassToCharge(1.0f); Point3D delta; delta=(end-start)*1.0f/(float)numPts; RandNumGen rngAxial; rngAxial.initTimer(); Point3D unitDelta; unitDelta=delta; unitDelta.normalise(); d->data.resize(numPts); for(size_t ui=0;ui::epsilon() && randomVector.angle(delta) < std::numeric_limits::epsilon()); randomVector=randomVector.crossProd(unitDelta); randomVector.normalise(); //create the point Point3D pt; pt=delta*(float)ui + start; //true location pt+=randomVector*radialSpread; h.setPos(pt); d->data[ui] =h; } return d; } #endif 3Depict-0.0.19/src/backend/filters/boundingBox.cpp0000644000175000017500000006546612716174467021330 0ustar pcuserpcuser/* * boundingBox.cpp - Place a bounding box around point datasets * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "boundingBox.h" #include "filterCommon.h" using std::vector; using std::string; using std::pair; using std::make_pair; enum { KEY_VISIBLE=1, KEY_COUNT_X, KEY_COUNT_Y, KEY_COUNT_Z, KEY_FONTSIZE, KEY_FONTCOLOUR, KEY_FIXEDOUT, KEY_LINECOLOUR, KEY_LINEWIDTH, KEY_SPACING_X, KEY_SPACING_Y, KEY_SPACING_Z, KEY_SHOW_TICKS_X, KEY_SHOW_TICKS_Y, KEY_SHOW_TICKS_Z, KEY_STYLE, KEY_ABSCOORDS }; enum { BOUNDINGBOX_ABORT_ERR, }; enum { BOUND_STYLE_BOX_ONLY, BOUND_STYLE_TICKS, BOUND_STYLE_DIMENSION, BOUND_STYLE_ENUM_END }; const char *BOUND_STYLE[] = { NTRANS("Box only"), NTRANS("Tick"), NTRANS("Dimension") }; //=== Bounding box filter == BoundingBoxFilter::BoundingBoxFilter() : isVisible(true), boundStyle(BOUND_STYLE_TICKS), fixedNumTicks(true), fontSize(5), absoluteCoords(false), lineColour(0,0,1.0f), lineWidth(2.0f), threeDText(true) { for(unsigned int ui=0;ui<3;ui++) { numTicks[ui]=12; tickSpacing[ui]=5.0f; enableTicks[ui]=true; } cacheOK=false; cache=false; } Filter *BoundingBoxFilter::cloneUncached() const { BoundingBoxFilter *p=new BoundingBoxFilter(); p->fixedNumTicks=fixedNumTicks; for(unsigned int ui=0;ui<3;ui++) { p->numTicks[ui]=numTicks[ui]; p->tickSpacing[ui]=tickSpacing[ui]; p->enableTicks[ui]=enableTicks[ui]; } p->isVisible=isVisible; p->boundStyle=boundStyle; p->absoluteCoords = absoluteCoords; p->threeDText=threeDText; p->lineWidth=lineWidth; p->fontSize=fontSize; //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->userString=userString; return p; } size_t BoundingBoxFilter::numBytesForCache(size_t nObjects) const { //we don't really know without examining full data. but guess return (size_t)10000; } void BoundingBoxFilter::drawTicks(const BoundCube &bTotal, DrawStreamData *d) const { //Add the rectangle drawable DrawRectPrism *dP = new DrawRectPrism; dP->setAxisAligned(bTotal); dP->setColour(lineColour.r(),lineColour.g(),lineColour.b(),lineColour.a()); dP->setLineWidth(lineWidth); d->drawables.push_back(dP); //Add the tick drawables Point3D tickOrigin,tickEnd; bTotal.getBounds(tickOrigin,tickEnd); float tmpTickSpacing[3]; float tmpTickCount[3]; if(fixedNumTicks) { for(unsigned int ui=0; ui<3;ui++) { ASSERT(numTicks[ui]); tmpTickSpacing[ui]=( (tickEnd[ui] - tickOrigin[ui])/(float)(numTicks[ui]-1)); tmpTickCount[ui]=numTicks[ui]; } } else { for(unsigned int ui=0; ui<3;ui++) { ASSERT(numTicks[ui]); tmpTickSpacing[ui]= tickSpacing[ui]; tmpTickCount[ui]=(unsigned int)((tickEnd[ui] - tickOrigin[ui])/tickSpacing[ui])+1; } } //flag to see if we have to draw the 0 corner later on bool tickSet=false; //Draw the ticks on the box perimeter. for(unsigned int ui=0;ui<3;ui++) { if(!enableTicks[ui]) continue; tickSet=true; Point3D tickVector; Point3D tickPosition; Point3D textVector; tickPosition=tickOrigin; switch(ui) { case 0: tickVector=Point3D(0,-1,-1); textVector=Point3D(0,1,0); break; case 1: tickVector=Point3D(-1,0,-1); textVector=Point3D(1,0,0); break; case 2: tickVector=Point3D(-1,-1,0); textVector=Point3D(1,1,0); break; } //TODO: This would be more efficient if we made some kind of //"comb" class? //Allow up to 128 chars char buffer[128]; for(unsigned int uj=0;ujsetDrawArrow(false); dV->setOrigin(tickPosition); dV->setVector(tickVector); dV->setColour(lineColour.r(),lineColour.g(), lineColour.b(), lineColour.a()); d->drawables.push_back(dV); //Don't draw the 0 value, as this gets repeated. //we will handle this separately if(uj) { DrawGLText *dT; //Draw the tick text if( threeDText) dT = new DrawGLText(getDefaultFontFile().c_str(),FTGL_POLYGON); else dT = new DrawGLText(getDefaultFontFile().c_str(),FTGL_BITMAP); float f; if(absoluteCoords) { f = tmpTickSpacing[ui]*uj + tickOrigin[ui]; } else f = tmpTickSpacing[ui]*uj; snprintf(buffer,127,"%2.0f",f); dT->setString(buffer); dT->setSize(fontSize); dT->setColour(lineColour.r(),lineColour.g(), lineColour.b(),lineColour.a()); dT->setOrigin(tickPosition + tickVector*2); dT->setUp(Point3D(0,0,1)); dT->setTextDir(textVector); dT->setAlignment(DRAWTEXT_ALIGN_RIGHT); d->drawables.push_back(dT); } } } if(!absoluteCoords && tickSet) { DrawGLText *dT; if(threeDText) dT = new DrawGLText(getDefaultFontFile().c_str(),FTGL_POLYGON); else dT = new DrawGLText(getDefaultFontFile().c_str(),FTGL_BITMAP); //Handle "0" text value dT->setString("0"); dT->setColour(lineColour.r(),lineColour.g(), lineColour.b(),lineColour.a()); dT->setSize(fontSize); dT->setOrigin(tickOrigin+ Point3D(-1,-1,-1)); dT->setAlignment(DRAWTEXT_ALIGN_RIGHT); dT->setUp(Point3D(0,0,1)); dT->setTextDir(Point3D(-1,-1,0)); d->drawables.push_back(dT); } } void BoundingBoxFilter::drawDimension(const BoundCube &bTotal, DrawStreamData *d) const { //Add the rectangle drawable DrawRectPrism *dP = new DrawRectPrism; dP->setAxisAligned(bTotal); dP->setColour(lineColour.r(),lineColour.g(), lineColour.b(),lineColour.a()); dP->setLineWidth(lineWidth); d->drawables.push_back(dP); //Add the arrows from the start to the end //Create the position from which to draw the tick origins Point3D tickOrigin,tickEnd; bTotal.getBounds(tickOrigin,tickEnd); const float ARROW_SCALE_FACTOR =0.03f; const float OFFSET=0.07f; Point3D halfPt; halfPt=(tickEnd-tickOrigin)*0.5f + tickOrigin; float maxLen; { Point3D delta; delta=tickEnd-tickOrigin; maxLen=std::max(std::max(delta[0],delta[1]),delta[2]); } float offset; offset=maxLen*OFFSET; Point3D centrePt[3]; centrePt[0] = Point3D(halfPt[0],tickOrigin[1]-offset,tickOrigin[2]-OFFSET); centrePt[1] = Point3D(tickOrigin[0]-offset,halfPt[1],tickOrigin[2]-OFFSET); centrePt[2] = Point3D(tickOrigin[0]-offset,tickOrigin[1] -OFFSET , halfPt[2]); //Draw the arrows around the edge of the box for(size_t ui=0;ui<3;ui++) { if(!enableTicks[ui]) continue; float len; len=(tickEnd[ui]-tickOrigin[ui])*0.5f; //Draw vector for the axis, and set arrow mode DrawVector *dV; dV= new DrawVector; dV->setColour(lineColour.r(),lineColour.g(), lineColour.b(),lineColour.a()); dV->wantsLight=true; dV->setArrowSize(maxLen*ARROW_SCALE_FACTOR); dV->setDoubleEnded(); Point3D p; p.setValue(0,0,0); p.setValue(ui,len); dV->setOrigin(centrePt[ui]-p); dV->setVector(p*2.0f); d->drawables.push_back(dV); } //Draw the values for the box dimensions, as text char *buffer=new char[128]; for(size_t ui=0;ui<3;ui++) { if(!enableTicks[ui]) continue; BoundCube textCube; DrawGLText *dT; dT = new DrawGLText(getDefaultFontFile().c_str(),FTGL_POLYGON); if(!absoluteCoords) { float len; len=(tickEnd[ui]-tickOrigin[ui]); snprintf(buffer,127,"%5.1f",len); } else { snprintf(buffer,127,"%5.1f , %5.1f", tickOrigin[ui], tickEnd[ui]); } dT->setString(buffer); dT->setSize(fontSize); dT->setColour(lineColour.r(),lineColour.g(), lineColour.b(),lineColour.a()); dT->setOrigin(centrePt[ui]); dT->setAlignment(DRAWTEXT_ALIGN_CENTRE); switch(ui) { case 0: dT->setUp(Point3D(0,0,1)); dT->setTextDir(Point3D(1,0,0)); break; case 1: dT->setUp(Point3D(1,0,0)); dT->setTextDir(Point3D(0,-1,0)); break; case 2: dT->setUp(Point3D(0,1,0)); dT->setTextDir(Point3D(0,0,1)); break; } d->drawables.push_back(dT); } delete[] buffer; } unsigned int BoundingBoxFilter::refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress) { if(!isVisible) { propagateStreams(dataIn,getOut); return 0; } //Compute the bounding box of the incoming streams BoundCube bTotal,bThis; bTotal.setInverseLimits(); size_t totalSize=numElements(dataIn); size_t n=0; Point3D p[4]; unsigned int ptCount=0; for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { bThis=bTotal; //Grab the first four points to define a volume. //then expand that volume using the boundcube functions. const IonStreamData *d =(const IonStreamData *) dataIn[ui]; size_t dataPos=0; unsigned int curProg=NUM_CALLBACK; while(ptCount < 4 && dataPos < d->data.size()) { for(unsigned int ui=0; uidata.size();ui++) { p[ptCount]=d->data[ui].getPosRef(); ptCount++; dataPos=ui; if(ptCount >=4) break; } } //Ptcount will be 4 if we have >=4 points in dataset if(ptCount < 4) break; bThis.setBounds(p,4); //Expand the bounding volume #ifdef _OPENMP //Parallel version unsigned int nT =omp_get_max_threads(); BoundCube *newBounds= new BoundCube[nT]; for(unsigned int ui=0;uidata.size();ui++) { unsigned int thisT=omp_get_thread_num(); //OpenMP does not allow exiting. Use spin instead if(spin) continue; if(!curProg--) { #pragma omp critical { n+=NUM_CALLBACK; progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); } if(thisT == 0) { if(*Filter::wantAbort) spin=true; } } newBounds[thisT].expand(d->data[ui].getPosRef()); } if(spin) { delete d; delete[] newBounds; return BOUNDINGBOX_ABORT_ERR; } for(unsigned int ui=0;uidata.size();ui++) { bThis.expand(d->data[ui].getPosRef()); if(!curProg--) { n+=NUM_CALLBACK; progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); if(*Filter::wantAbort) { delete d; return BOUNDINGBOX_ABORT_ERR; } } } #endif bTotal.expand(bThis); progress.filterProgress=100; break; } default: break; } //Copy the input data to the output getOut.push_back(dataIn[ui]); } //Append the bounding box if it is valid if(bTotal.isValid()) { DrawStreamData *d = new DrawStreamData; d->parent=this; switch(boundStyle) { case BOUND_STYLE_BOX_ONLY: { //Add the rectangle drawable DrawRectPrism *dP = new DrawRectPrism; dP->setAxisAligned(bTotal); dP->setColour(lineColour.r(),lineColour.g(), lineColour.b(),lineColour.a()); dP->setLineWidth(lineWidth); d->drawables.push_back(dP); break; } case BOUND_STYLE_TICKS: drawTicks(bTotal,d); break; case BOUND_STYLE_DIMENSION: drawDimension(bTotal,d); break; default: ASSERT(false); } d->cached=0; getOut.push_back(d); } return 0; } void BoundingBoxFilter::getProperties(FilterPropGroup &propertyList) const { FilterProperty p; size_t curGroup=0; string tmpStr; stream_cast(tmpStr,isVisible); p.name=TRANS("Visible"); p.data= tmpStr; p.key=KEY_VISIBLE; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("If true, show box, otherwise hide box"); propertyList.addProperty(p,curGroup); if(isVisible) { vector > choices; for(size_t ui=0;ui=BOUND_STYLE_ENUM_END) return false; if(ltmp == boundStyle) needUpdate=false; else { boundStyle=ltmp; needUpdate=true; clearCache(); } break; } case KEY_FIXEDOUT: { if(!applyPropertyNow(fixedNumTicks,value,needUpdate)) return false; break; } case KEY_COUNT_X: case KEY_COUNT_Y: case KEY_COUNT_Z: { ASSERT(fixedNumTicks); unsigned int newCount; if(stream_cast(newCount,value)) return false; //there is a start and an end tick, at least if(newCount < 2) return false; numTicks[key-KEY_COUNT_X]=newCount; needUpdate=true; break; } case KEY_LINECOLOUR: { ColourRGBA newLineColour; if(!newLineColour.parse(value)) return false; if(lineColour.toColourRGBA() != newLineColour) needUpdate=true; lineColour=newLineColour.toRGBAf(); needUpdate=true; break; } case KEY_LINEWIDTH: { float newWidth; if(stream_cast(newWidth,value)) return false; if(newWidth <= 0.0f) return false; lineWidth=newWidth; needUpdate=true; break; } case KEY_SPACING_X: case KEY_SPACING_Y: case KEY_SPACING_Z: { ASSERT(!fixedNumTicks); float newSpacing; if(stream_cast(newSpacing,value)) return false; if(newSpacing <= 0.0f) return false; tickSpacing[key-KEY_SPACING_X]=newSpacing; needUpdate=true; break; } case KEY_SHOW_TICKS_X: case KEY_SHOW_TICKS_Y: case KEY_SHOW_TICKS_Z: { bool enabled; if(stream_cast(enabled,value)) return false; enableTicks[key-KEY_SHOW_TICKS_X]=enabled; needUpdate=true; break; } case KEY_FONTSIZE: { if(!applyPropertyNow(fontSize,value,needUpdate)) return false; break; } case KEY_ABSCOORDS: { if(!applyPropertyNow(absoluteCoords,value,needUpdate)) return false; break; } default: ASSERT(false); } return true; } std::string BoundingBoxFilter::getSpecificErrString(unsigned int code) const { //Currently the only error is aborting return std::string("Aborted"); } void BoundingBoxFilter::setPropFromBinding(const SelectionBinding &b) { {ASSERT(false);} } bool BoundingBoxFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<" << trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << ""<"<" <" << endl; f << tabs(depth) << "" << endl; break; } default: ASSERT(false); return false; } return true; } bool BoundingBoxFilter::readState(xmlNodePtr &nodePtr, const std::string &stateFileDir) { //Retrieve user string //=== if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlChar *xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //=== std::string tmpStr; //Retrieve visibility //==== if(XMLHelpFwdToElem(nodePtr,"visible")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(!boolStrDec(tmpStr,isVisible)) return false; xmlFree(xmlString); //==== //Retrieve box style //==== if(XMLHelpFwdToElem(nodePtr,"boundstyle")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(stream_cast(boundStyle,tmpStr)) return false; xmlFree(xmlString); //==== //Retrieve fixed tick num //==== if(XMLHelpFwdToElem(nodePtr,"fixedticks")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(!boolStrDec(tmpStr,fixedNumTicks)) return false; xmlFree(xmlString); //==== //Retrieve num ticks //==== if(XMLHelpFwdToElem(nodePtr,"ticknum")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"x"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(stream_cast(numTicks[0],tmpStr)) return false; xmlFree(xmlString); xmlString=xmlGetProp(nodePtr,(const xmlChar *)"y"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(stream_cast(numTicks[1],tmpStr)) return false; xmlFree(xmlString); xmlString=xmlGetProp(nodePtr,(const xmlChar *)"z"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(stream_cast(numTicks[2],tmpStr)) return false; xmlFree(xmlString); //==== //Retrieve spacing //==== if(XMLHelpFwdToElem(nodePtr,"tickspacing")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"x"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(stream_cast(tickSpacing[0],tmpStr)) return false; if(tickSpacing[0] < 0.0f) return false; xmlFree(xmlString); xmlString=xmlGetProp(nodePtr,(const xmlChar *)"y"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(stream_cast(tickSpacing[1],tmpStr)) return false; if(tickSpacing[1] < 0.0f) return false; xmlFree(xmlString); xmlString=xmlGetProp(nodePtr,(const xmlChar *)"z"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(stream_cast(tickSpacing[2],tmpStr)) return false; if(tickSpacing[2] < 0.0f) return false; xmlFree(xmlString); //==== //Retrieve ticks enabled (3Depict > 0.0.18) //=== xmlNodePtr tmpNode=nodePtr; if(XMLHelpFwdToElem(nodePtr,"ticksenabled")) { //loading failed, use default (enabled) for(unsigned int ui=0; ui<3; ui++) enableTicks[ui] =true; nodePtr=tmpNode; } else { const char *XYZ[]={"x","y","z"}; for(unsigned int ui=0;ui<3;ui++) { xmlString=xmlGetProp(nodePtr,(const xmlChar *)XYZ[ui]); if(!xmlString) return false; tmpStr=(char *)xmlString; if(!boolStrDec(tmpStr,enableTicks[ui])) return false; xmlFree(xmlString); } } //=== //Retrieve line width //==== if(XMLHelpFwdToElem(nodePtr,"linewidth")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to digit if(stream_cast(lineWidth,tmpStr)) return false; if(lineWidth < 0) return false; xmlFree(xmlString); //==== //Retrieve font size //==== if(XMLHelpFwdToElem(nodePtr,"fontsize")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to digit if(stream_cast(fontSize,tmpStr)) return false; xmlFree(xmlString); //==== //Retrieve colour //==== if(XMLHelpFwdToElem(nodePtr,"colour")) return false; ColourRGBAf tmpCol; if(!parseXMLColour(nodePtr,tmpCol)) return false; lineColour=tmpCol; //==== //Retrieve absolute coordinates (only for 3Depict > 0.0.18) //==== if(XMLHelpFwdToElem(nodePtr,"absolutecoords")) absoluteCoords=false; else { std::string s; if(XMLHelpGetProp(s,nodePtr,"value")) return false; if(!boolStrDec(s,absoluteCoords)) return false; } //==== return true; } unsigned int BoundingBoxFilter::getRefreshBlockMask() const { //Everything goes through this filter return 0; } unsigned int BoundingBoxFilter::getRefreshEmitMask() const { if(isVisible) return STREAM_TYPE_DRAW; else return 0; } unsigned int BoundingBoxFilter::getRefreshUseMask() const { if(isVisible) return STREAM_TYPE_IONS; else return 0; } #ifdef DEBUG bool boxVolumeTest(); bool BoundingBoxFilter::runUnitTests() { if(!boxVolumeTest()) return false; return true; } bool boxVolumeTest() { //Synthesise data //--- IonStreamData *d = new IonStreamData; vector streamIn,streamOut; IonHit h; h.setMassToCharge(1); h.setPos(Point3D(0,0,1)); d->data.push_back(h); h.setPos(Point3D(0,1,0)); d->data.push_back(h); h.setPos(Point3D(1,0,0)); d->data.push_back(h); h.setPos(Point3D(0,0,0)); d->data.push_back(h); streamIn.push_back(d); //--- //Set up and run filter //--- BoundingBoxFilter *b = new BoundingBoxFilter; b->setCaching(false); bool needUp; TEST(b->setProperty(KEY_VISIBLE,"1",needUp),"Set prop"); ProgressData p; TEST(!b->refresh(streamIn,streamOut,p),"Refresh error code"); //--- //Run tests //--- BoundCube bc; bool havePrismDrawable=false; for(unsigned int ui=0;uigetStreamType() != STREAM_TYPE_DRAW) continue; DrawStreamData *drawData; drawData=(DrawStreamData*)streamOut[ui]; for(unsigned int uj=0;ujdrawables.size(); uj++) { DrawableObj *draw; draw= drawData->drawables[uj]; if(draw->getType() == DRAW_TYPE_RECTPRISM) { draw->getBoundingBox(bc); havePrismDrawable=true; break; } } if(havePrismDrawable) break; } TEST(havePrismDrawable, "bounding box existence test"); TEST(fabs(bc.volume() - 1.0f) < sqrt(std::numeric_limits::epsilon()), "Bounding volume test"); //Cleanup the emitted pointers for(unsigned int ui=0;ui. */ #ifndef IONCLIP_H #define IONCLIP_H #include "../filter.h" #include "../../common/translation.h" //!Ion spatial clipping filter class IonClipFilter : public Filter { protected: //!Number explaining basic primitive type /* Possible Modes: * Planar clip (origin + normal) * spherical clip (origin + radius) * Cylindrical clip (origin + axis + length) * Axis aligned box (origin + corner) */ unsigned int primitiveType; //!Whether to reverse the clip. True means that the interior is excluded bool invertedClip; //!Whether to show the primitive or not bool showPrimitive; //!Vector paramaters for different primitives std::vector vectorParams; //!Scalar paramaters for different primitives std::vector scalarParams; //Lock the primitive axis during for cylinder? bool lockAxisMag; public: IonClipFilter(); //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; //!Returns FILTER_TYPE_IONCLIP unsigned int getType() const { return FILTER_TYPE_IONCLIP;}; //!Get approx number of bytes for caching output size_t numBytesForCache(size_t nObjects) const; //!update filter unsigned int refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress); //!Return human readable name for filter virtual std::string typeString() const { return std::string(TRANS("Clipping"));}; //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter. Returns true if prop set OK bool setProperty(unsigned int key, const std::string &value, bool &needUpdate); //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Dump state to output stream, using specified format bool writeState(std::ostream &f,unsigned int format, unsigned int depth=0) const; //!Read the state of the filter from XML file. If this //fails, filter will be in an undefined state. bool readState(xmlNodePtr &node, const std::string &packDir); //!Get the stream types that will be dropped during ::refresh unsigned int getRefreshBlockMask() const; //!Get the stream types that will be generated during ::refresh unsigned int getRefreshEmitMask() const; //!Get the stream types that will be possibly used during ::refresh unsigned int getRefreshUseMask() const; //!Set internal property value using a selection binding void setPropFromBinding(const SelectionBinding &b); #ifdef DEBUG bool runUnitTests(); #endif }; #endif 3Depict-0.0.19/src/backend/filters/filterCommon.cpp0000644000175000017500000004143512716174467021476 0ustar pcuserpcuser/* * filterCommon.cpp - Helper routines for filter classes * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "filterCommon.h" #include "common/colourmap.h" #include "wx/wxcommon.h" //TODO: Work out where the payoff for this is //grab size when doing convex hull calculations const unsigned int HULL_GRAB_SIZE=4096; using std::ostream; using std::vector; using std::endl; using std::string; bool qhullInited=false; //Wrapper for qhull single-pass run unsigned int doHull(unsigned int bufferSize, double *buffer, vector &resHull, Point3D &midPoint, bool wantVolume, bool freeHullOnExit); void writeVectorsXML(ostream &f,const char *containerName, const vector &vectorParams, unsigned int depth) { f << tabs(depth+1) << "<" << containerName << ">" << endl; for(unsigned int ui=0; ui" << endl; } f << tabs(depth+1) << "" << endl; } void writeIonsEnabledXML(ostream &f, const char *containerName, const vector &enabledState, const vector &names, unsigned int depth) { if(enabledState.size()!=names.size()) return; f << tabs(depth) << "<" << containerName << ">" << endl; for(size_t ui=0;ui" << std::endl; } f << tabs(depth) << "" << endl; } void readIonsEnabledXML(xmlNodePtr nodePtr, vector &enabledStatus,vector &ionNames) { //skip conatainer name nodePtr=nodePtr->xmlChildrenNode; if(!nodePtr) return; enabledStatus.clear(); while(!XMLHelpFwdToElem(nodePtr,"ion")) { int enabled; if(!XMLGetAttrib(nodePtr,enabled,"enabled")) return ; std::string tmpName; if(!XMLGetAttrib(nodePtr,tmpName,"name")) return; enabledStatus.push_back(enabled); ionNames.push_back(tmpName); } } bool readVectorsXML(xmlNodePtr nodePtr, std::vector &vectorParams) { nodePtr=nodePtr->xmlChildrenNode; vectorParams.clear(); while(!XMLHelpFwdToElem(nodePtr,"point3d")) { std::string tmpStr; xmlChar* xmlString; float x,y,z; //--Get X value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"x"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(x,tmpStr)) return false; //--Get Z value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"y"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(y,tmpStr)) return false; //--Get Y value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"z"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(z,tmpStr)) return false; vectorParams.push_back(Point3D(x,y,z)); } return true; } bool parseXMLColour(xmlNodePtr &nodePtr, ColourRGBAf &rgba) { xmlChar *xmlString; float r,g,b,a; std::string tmpStr; //--red-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"r"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to digit if(stream_cast(r,tmpStr)) return false; //disallow negative or values gt 1. if(r < 0.0f || r > 1.0f) return false; xmlFree(xmlString); //--green-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"g"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to digit if(stream_cast(g,tmpStr)) { xmlFree(xmlString); return false; } xmlFree(xmlString); //disallow negative or values gt 1. if(g < 0.0f || g > 1.0f) return false; //--blue-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"b"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to digit if(stream_cast(b,tmpStr)) { xmlFree(xmlString); return false; } xmlFree(xmlString); //disallow negative or values gt 1. if(b < 0.0f || b > 1.0f) return false; //--Alpha-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"a"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to digit if(stream_cast(a,tmpStr)) { xmlFree(xmlString); return false; } xmlFree(xmlString); //disallow negative or values gt 1. if(a < 0.0f || a > 1.0f) return false; rgba.r(r); rgba.g(g); rgba.b(b); rgba.a(a); return true; } const RangeFile *getRangeFile(const std::vector &dataIn) { for(size_t ui=0;uigetStreamType() == STREAM_TYPE_RANGE) return ((const RangeStreamData*)(dataIn[ui]))->rangeFile; } ASSERT(false); } unsigned int getIonstreamIonID(const IonStreamData *d, const RangeFile *r) { if(d->data.empty()) return (unsigned int)-1; unsigned int tentativeRange; tentativeRange=r->getIonID(d->data[0].getMassToCharge()); //TODO: Currently, we have no choice but to brute force it. //In the future, it might be worth storing some data inside the IonStreamData itself //and to use that first, rather than try to brute force the result #ifdef _OPENMP bool spin=false; #pragma omp parallel for shared(spin) for(size_t ui=1;uidata.size();ui++) { if(spin) continue; if(r->getIonID(d->data[ui].getMassToCharge()) !=tentativeRange) spin=true; } //Not a range if(spin) return (unsigned int)-1; #else for(size_t ui=1;uidata.size();ui++) { if(r->getIonID(d->data[ui].getMassToCharge()) !=tentativeRange) return (unsigned int)-1; } #endif return tentativeRange; } //FIXME: Abort pointer? unsigned int computeConvexHull(const vector &data, unsigned int *progress, std::vector &curHull, bool wantVolume,bool freeHull) { size_t numPts; numPts=numElements(data,STREAM_TYPE_IONS); //Easy case of no data if(numPts < 4) return 0; double *buffer; double *tmp; //Use malloc so we can re-alloc buffer =(double*) malloc(HULL_GRAB_SIZE*3*sizeof(double)); if(!buffer) return HULL_ERR_NO_MEM; size_t bufferOffset=0; //Do the convex hull in steps for two reasons // 1) qhull chokes on large data // 2) we need to check for abort every now and again, so we have to // work in batches. Point3D midPoint; float maxSqrDist=-1; size_t n=0; for(size_t ui=0; uigetStreamType() != STREAM_TYPE_IONS) continue; const IonStreamData* ions=(const IonStreamData*)data[ui]; for(size_t uj=0; ujdata.size(); uj++) { //Do contained-in-sphere check if(!curHull.size() || midPoint.sqrDist(ions->data[uj].getPos())>= maxSqrDist) { //Copy point data into hull buffer buffer[3*bufferOffset]=ions->data[uj].getPos()[0]; buffer[3*bufferOffset+1]=ions->data[uj].getPos()[1]; buffer[3*bufferOffset+2]=ions->data[uj].getPos()[2]; bufferOffset++; //If we have hit the hull grab size, perform a hull if(bufferOffset == HULL_GRAB_SIZE) { bufferOffset+=curHull.size(); tmp=(double*)realloc(buffer, 3*bufferOffset*sizeof(double)); if(!tmp) { free(buffer); return HULL_ERR_NO_MEM; } buffer=tmp; //Copy in the old hull for(size_t uk=0; uk::max(); for(size_t ui=0; ui 4) { //Re-allocate the buffer to determine the last hull size tmp=(double*)realloc(buffer, 3*(bufferOffset+curHull.size())*sizeof(double)); if(!tmp) { free(buffer); return HULL_ERR_NO_MEM; } buffer=tmp; #pragma omp parallel for for(unsigned int ui=0; ui &data, unsigned int *progress, const bool &abortPtr,std::vector &curHull, bool wantVolume, bool freeHull) { //Easy case of no data if(data.size()< 4) return 0; double *buffer; double *tmp; //Use malloc so we can re-alloc buffer =(double*) malloc(HULL_GRAB_SIZE*3*sizeof(double)); if(!buffer) return HULL_ERR_NO_MEM; size_t bufferOffset=0; //Do the convex hull in steps for two reasons // 1) qhull chokes on large data // 2) we need to run the callback every now and again, so we have to // work in batches. Point3D midPoint; float maxSqrDist=-1; for(size_t uj=0; uj= maxSqrDist) { //Copy point data into hull buffer buffer[3*bufferOffset]=data[uj][0]; buffer[3*bufferOffset+1]=data[uj][1]; buffer[3*bufferOffset+2]=data[uj][2]; bufferOffset++; //If we have hit the hull grab size, perform a hull if(bufferOffset == HULL_GRAB_SIZE) { bufferOffset+=curHull.size(); tmp=(double*)realloc(buffer, 3*bufferOffset*sizeof(double)); if(!tmp) { free(buffer); return HULL_ERR_NO_MEM; } buffer=tmp; //Copy in the old hull for(size_t uk=0; uk::max(); for(size_t ui=0; ui 4) { //Re-allocate the buffer to determine the last hull size tmp=(double*)realloc(buffer, 3*(bufferOffset+curHull.size())*sizeof(double)); if(!tmp) { free(buffer); return HULL_ERR_NO_MEM; } buffer=tmp; #pragma omp parallel for for(unsigned int ui=0; ui &resHull, Point3D &midPoint, bool wantVolume , bool freeHullOnExit) { if(qhullInited) { qh_freeqhull(qh_ALL); int curlong,totlong; //This seems to be required? Cannot find any documentation on the difference // between qh_freeqhull and qh_memfreeshort. qhull appears to leak when just using qh_freeqhull qh_memfreeshort (&curlong, &totlong); qhullInited=false; } const int dim=3; //Now compute the new hull //Generate the convex hull //(result is stored in qh's globals :( ) //note that the input is "joggled" to //ensure simplicial facet generation //Qhull >=2012 has a "feature" where it won't accept null arguments for the output // there is no clear way to shut it up. FILE *outSquelch=0; #if defined(__linux__) || defined(__APPLE__) || defined(__BSD__) outSquelch=fopen("/dev/null","w"); #elif defined(__win32__) || defined(__win64__) outSquelch=fopen("NUL","w"); #endif if(!outSquelch) { //Give up, just let qhull output random statistics to stderr outSquelch=stderr; } //Joggle the output, such that only simplical facets are generated, Also compute area/volume const char *argsOptions[]= { "qhull QJ FA", "qhull QJ" }; const char *args; if(wantVolume) args = argsOptions[0]; else args=argsOptions[1]; qh_new_qhull( dim, bufferSize, buffer, false, (char *)args , outSquelch, //QHULL's interface is bizarre, no way to set null pointer in qhull 2012 - result is inf. loop in qhull_fprintf and error reporting func. outSquelch); qhullInited=true; if(outSquelch !=stderr) { fclose(outSquelch); } unsigned int numPoints=0; //count points //-- //OKay, whilst this may look like invalid syntax, //qh is actually a macro from qhull //that creates qh. or qh-> as needed numPoints = qh num_vertices; //-- midPoint=Point3D(0,0,0); if(!numPoints) return 0; //store points in vector //-- try { resHull.resize(numPoints); } catch(std::bad_alloc) { return HULL_ERR_NO_MEM; } //-- //Compute mean point //-- vertexT *vertex; vertex= qh vertex_list; int curPt=0; while(vertex != qh vertex_tail) { resHull[curPt]=Point3D(vertex->point[0], vertex->point[1], vertex->point[2]); midPoint+=resHull[curPt]; curPt++; vertex = vertex->next; } midPoint*=1.0f/(float)numPoints; //-- if(freeHullOnExit) { qh_freeqhull(qh_ALL); int curlong,totlong; //This seems to be required? Cannot find any documentation on the difference // between qh_freeqhull and qh_memfreeshort. qhull appears to leak when just using qh_freeqhull qh_memfreeshort (&curlong, &totlong); qhullInited=false; } return 0; } void freeConvexHull() { qh_freeqhull(qh_ALL); int curlong,totlong; //This seems to be required? Cannot find any documentation on the difference // between qh_freeqhull and qh_memfreeshort. qhull appears to leak when just using qh_freeqhull qh_memfreeshort (&curlong, &totlong); qhullInited=false; } DrawColourBarOverlay *makeColourBar(float minV, float maxV,size_t nColours,size_t colourMap, bool reverseMap, float alpha) { //Set up the colour bar. Place it in a draw stream type DrawColourBarOverlay *dc = new DrawColourBarOverlay; vector r,g,b; r.resize(nColours); g.resize(nColours); b.resize(nColours); for (unsigned int ui=0;uisetColourVec(r,g,b); dc->setSize(0.08,0.6); dc->setPosition(0.1,0.1); dc->setMinMax(minV,maxV); dc->setAlpha(alpha); return dc; } //creates a temporary filename for use std::string createTmpFilename(const char *dir,const char *extension) { wxString tmpFilename,tmpDir; if(!dir) { tmpDir=wxFileName::GetTempDir(); #if defined(__WIN32__) || defined(__WIN64__) tmpDir=tmpDir + wxT("\\3Depict\\"); #else tmpDir=tmpDir + wxT("/3Depict/"); #endif } else tmpDir=dir; if(!wxDirExists(tmpDir)) wxMkdir(tmpDir); tmpFilename=wxFileName::CreateTempFileName(tmpDir+ wxT("unittest-")); wxRemoveFile(tmpFilename); if(extension) tmpFilename+=wxT(".pos"); return stlStr(tmpFilename); } 3Depict-0.0.19/src/backend/filters/geometryHelpers.h0000644000175000017500000001201212640746376021650 0ustar pcuserpcuser/* * geometryHelpers.h - 3D Geometric operations helper classes * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef GEOMETRYHELPER_H #define GEOMETRYHELPER_H #include "backend/APT/ionhit.h" #include enum { CROP_SPHERE_INSIDE, CROP_SPHERE_OUTSIDE, CROP_PLANE_FRONT, CROP_PLANE_BACK, CROP_CYLINDER_INSIDE_AXIAL, CROP_CYLINDER_INSIDE_RADIAL, CROP_CYLINDER_OUTSIDE, CROP_AAB_OUTSIDE, CROP_AAB_INSIDE, CROP_ENUM_END }; enum { ERR_CROP_CALLBACK_FAIL=1, ERR_CROP_INSUFFICIENT_MEM, }; class CropHelper; //Type declaration for pointer to constant member function. // typename is in the middle of the declaration (i.e. "CropFuncPtr") typedef bool (CropHelper::* CropFuncPtr)(const Point3D &p) const; typedef unsigned int (CropHelper::* MapFuncPtr)(const Point3D &p) const; //Assistance class for helping cropping // see the end of this file (.h) for // mathematical description of each primitve class CropHelper { private: //Filter parameters // ---- size_t algorithm; //Geometric parameters, whose meaning is determined // by the choice of geometric algorithm Point3D pA,pB; //3D vector params float fA,fB; //scalar params Quaternion qA ; //rotation quaternion bool nearAxis; //true if rotation is near-zaxis (ie rotation doesn't need ot be done) bool invertedClip; size_t mapMax; //Mapping maxima. // -- //Helper values //--- //Algorithm to use CropFuncPtr cropFunc; MapFuncPtr mapFunc; size_t totalDataCount; //-- //Various testing point containment against primitive // functions //---- //PA - Cylinder origin //PB - Cylinder 1/2 axis vector //fA - Cylinder radius bool filterCylinderInside(const Point3D &p) const; //returns true if point p is wholly inside sphere //PA - sphere origin //fA - square of sphere radius bool filterSphereInside(const Point3D &p) const; //Returns true if point p is in front of the plane //pA - plane origin //pB - plane normal bool filterPlaneFront(const Point3D &p) const; //returns true if the point is inside the box //pA - Lower point of box //pB - upper point of box bool filterBoxInside(const Point3D &testPt) const; //---- //Mapping functions. returns 0 -> mapMax, along axial direction unsigned int mapCylinderInsideAxial(const Point3D &p) const; unsigned int mapCylinderInsideRadial(const Point3D &p) const; // unsigned int mapSphereInside(const Point3D &p) const; //Initialise the data variables for the specified cylinder void setupCylinder(Point3D origin, float radius,Point3D direction); //intialise the function pointer for the chosen algorithm void setAlgorithm(); //Run the input filtering in linear (single CPU) mode // allocHint, if >0 , is the recommended fraction of input to reserve // ahead of copying unsigned int runFilterLinear(const std::vector &dataIn, std::vector &dataOut,float allocHint, float minProg, float maxProg, unsigned int &prog); //Run the input filtering in parallel (multi CPU) mode unsigned int runFilterParallel(const std::vector &dataIn, std::vector &dataOut,float allocHint, float minProg, float maxProg, unsigned int &prog); public: //Input vectors and scalars represent the fundamental // basis for the desired geometry CropHelper(size_t totalData,size_t filterMode, std::vector &vectors, std::vector &scalars); //Filter the input ion data in order to generate output points // output data may contain previous data - this will be appended to, // not overwritten unsigned int runFilter(const std::vector &dataIn, std::vector &dataOut, float progStart, float progEnd,unsigned int &prog) ; void setMapMaxima(size_t maxima){ASSERT(maxima); mapMax=maxima;}; //Map an ion from its 3D coordinate to a 1D coordinate along the // selected geometric primitive. Returns true if the ion is mappable (i.e. inside selected primitive mode) unsigned int mapIon1D(const IonHit &ionIn ) const; //Choose the cropping mode for the filter void setFilterMode(size_t filterMode); }; //Primitive Descriptions: What you need to pass in //--- //Sphere Primitive: // Vectors // 0 - Origin // Scalars // 0 - Radius //Cylinder Primitive // Vectors // 0 - Origin // 1 - Axis : This is the distance from one end of the cylinder // to the other, ie from the centre of one circle // end-cap to the other // Scalars // 0 - radius //--- #endif 3Depict-0.0.19/src/backend/filters/geometryHelpers.cpp0000644000175000017500000003047712640746376022222 0ustar pcuserpcuser/* * geometryHelpers.cpp - Various spatial geometry operators for point clouds * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "geometryHelpers.h" #include "backend/APT/ionhit.h" #include "backend/filter.h" #ifdef _OPENMP #include #endif using std::vector; const size_t DEFAULT_NUM_CALLBACK=5000; //These numbers have not been optimised. On a 2CPU system, I cannot find // a case where the // option is outrun by the linear one, over 3 averages //--- //Minimum number of input points before we will do reserve testing const size_t MIN_SAMPLE_TEST = 1000; //Minimim number of input points before we will engage a parallel algorithm const size_t MIN_PARALLELISE = 20000; //--- CropHelper::CropHelper( size_t totalData,size_t filterMode, vector &vectors, vector &scalars) { algorithm=filterMode; mapMax=0; invertedClip=false; switch(algorithm) { case CROP_SPHERE_OUTSIDE: invertedClip=true; case CROP_SPHERE_INSIDE: { ASSERT(vectors.size() == 1); ASSERT(scalars.size() == 1); ASSERT(scalars[0] >= 0.0f); fA=scalars[0]*scalars[0]; fB=scalars[0]; pA=vectors[0]; break; } case CROP_PLANE_BACK: invertedClip=true; case CROP_PLANE_FRONT: { ASSERT(vectors.size() == 2); ASSERT(scalars.size() == 0); pA=vectors[0]; pB=vectors[1]; break; } case CROP_CYLINDER_OUTSIDE: invertedClip=true; case CROP_CYLINDER_INSIDE_AXIAL: case CROP_CYLINDER_INSIDE_RADIAL: { ASSERT(vectors.size() == 2); ASSERT(scalars.size() == 1); setupCylinder(vectors[0],scalars[0],vectors[1]); break; } case CROP_AAB_OUTSIDE: invertedClip=true; case CROP_AAB_INSIDE: { ASSERT(vectors.size() ==2); ASSERT(scalars.size() == 0); pA=vectors[0]-vectors[1]; pB=vectors[0]+vectors[1]; break; } default: ASSERT(false); } setAlgorithm(); totalDataCount=totalData; } void CropHelper::setAlgorithm() { mapFunc=0; //Assign the desired member function switch(algorithm) { case CROP_SPHERE_OUTSIDE: case CROP_SPHERE_INSIDE: cropFunc=&CropHelper::filterSphereInside; mapFunc=&CropHelper::mapSphereInside; break; case CROP_PLANE_FRONT: case CROP_PLANE_BACK: cropFunc=&CropHelper::filterPlaneFront; break; case CROP_CYLINDER_OUTSIDE: case CROP_CYLINDER_INSIDE_AXIAL: cropFunc=&CropHelper::filterCylinderInside; mapFunc=&CropHelper::mapCylinderInsideAxial; break; case CROP_CYLINDER_INSIDE_RADIAL: cropFunc=&CropHelper::filterCylinderInside; mapFunc=&CropHelper::mapCylinderInsideRadial; break; case CROP_AAB_INSIDE: case CROP_AAB_OUTSIDE: cropFunc=&CropHelper::filterBoxInside; break; default: ASSERT(false); } } unsigned int CropHelper::runFilter(const vector &dataIn, vector &dataOut, float progressStart, float progressEnd, unsigned int &progress ) { //FIXME!: Shouldn't be using this here - should be obeying // system-wide rng preferences RandNumGen rng; rng.initTimer(); float allocHint=0; //If we have enough input data, try sampling // the input randomly to test if we can // pre-allocate enough space for output data if(dataIn.size() > MIN_SAMPLE_TEST) { const size_t SAMPLE_SIZE=30; vector samples; unsigned int dummy; randomDigitSelection(samples,dataIn.size(),rng, SAMPLE_SIZE,dummy); size_t tally=0; for(size_t ui=0;ui*cropFunc)(dataIn[samples[ui]].getPosRef())) ^ invertedClip) tally++; } allocHint = (float)tally/(float)SAMPLE_SIZE; } #ifndef _OPENMP return runFilterLinear(dataIn,dataOut,allocHint,progressStart,progressEnd,progress); #else if(dataIn.size() < MIN_PARALLELISE || rng.genUniformDev() < 0.5f) return runFilterLinear(dataIn,dataOut,allocHint,progressStart,progressEnd,progress); else { return runFilterParallel(dataIn,dataOut,allocHint,progressStart,progressEnd,progress); } #endif } unsigned int CropHelper::runFilterLinear(const vector &dataIn, vector &dataOut,float allocHint, float minProg,float maxProg, unsigned int &prog ) { if(allocHint > 0.0f) dataOut.reserve((unsigned int) ( (float)dataIn.size()*allocHint)); //Run the data filtering using a single threaded algorithm // copying to output if(!invertedClip) { for(size_t ui=0; ui*cropFunc)(dataIn[ui].getPosRef()))) dataOut.push_back(dataIn[ui]); if(ui & 100) prog = (float)ui/(float)dataIn.size() * (maxProg-minProg)+minProg; if(*Filter::wantAbort) return ERR_CROP_CALLBACK_FAIL; } } else { for(size_t ui=0; ui*cropFunc)(dataIn[ui].getPosRef()))) dataOut.push_back(dataIn[ui]); if(ui & 100) prog = (float)ui/(float)dataIn.size() * (maxProg-minProg)+minProg; if(*Filter::wantAbort) return ERR_CROP_CALLBACK_FAIL; } } prog=maxProg; return 0; } unsigned int CropHelper::runFilterParallel(const vector &dataIn, vector &dataOut, float allocHint, float minProg,float maxProg, unsigned int &prog ) { #ifdef _OPENMP size_t n=0; const size_t PROGRESS_REDUCE=5000; size_t curProg=PROGRESS_REDUCE; //Create a vector of indices for which // points successfully passed the test size_t nThreads=omp_get_max_threads(); vector inside[nThreads]; if(allocHint > 0.0f) { try { for(size_t ui=0;ui*cropFunc)(dataIn[ui].getPosRef())) ^ invertedClip) inside[omp_get_thread_num()].push_back(ui); //update progress every PROGRESS_REDUCE ions if(!curProg--) { #pragma omp critical { n+=PROGRESS_REDUCE; prog = (float)n/(float)dataIn.size() * (maxProg-minProg)+minProg; if(*Filter::wantAbort) spin=true; } curProg=PROGRESS_REDUCE; } } if(spin) return ERR_CROP_CALLBACK_FAIL; //map the successful ions into a single output block // -- vector offsets; offsets.resize(nThreads); size_t totalOut=0; for(size_t ui=0;ui 0.0f); } bool CropHelper::filterBoxInside(const Point3D &testPt) const { return (pA[0] < testPt[0] && pA[1] < testPt[1] && pA[2] < testPt[2] )&& (pB[0] > testPt[0] && pB[1] > testPt[1] && pB[2] > testPt[2] ) ; } bool CropHelper::filterCylinderInside(const Point3D &testPt) const { //pA - cylinder origin //fA - cylinder half length (origin to end, along axis) //fB - cylinder sqr radius //qA - rotation quaternion Point3D ptmp; if(nearAxis) { ptmp=testPt-pA; return (ptmp[2] < fA && ptmp[2] > -fA && ptmp[0]*ptmp[0]+ptmp[1]*ptmp[1] < fB); } else { Point3f p; //Translate to get position w respect to cylinder centre ptmp=testPt-pA; p.fx=ptmp[0]; p.fy=ptmp[1]; p.fz=ptmp[2]; //rotate ion position into cylindrical coordinates quat_rot_apply_quat(&p,&qA); //Check inside upper and lower bound of cylinder // and check inside cylinder radius return (p.fz < fA && p.fz > -fA && p.fx*p.fx+p.fy*p.fy < fB); } } unsigned int CropHelper::mapSphereInside(const Point3D &testPt) const { float radius; radius = sqrtf(testPt.sqrDist(pA)); if(radius <=fB) return (unsigned int) (mapMax*(radius/fB)); else return -1; } unsigned int CropHelper::mapCylinderInsideAxial( const Point3D &testPt) const { //pA - cylinder origin //fA - cylinder half length (origin to end, along axis) //fB - cylinder sqr radius //qA - rotation quaternion Point3D ptmp; float fZ; if(nearAxis) { ptmp=testPt-pA; if(!(ptmp[2] < fA && ptmp[2] > -fA && ptmp[0]*ptmp[0]+ptmp[1]*ptmp[1] < fB) ) return (unsigned int)-1; else fZ=ptmp[2]; } else { Point3f p; //Translate to get position w respect to cylinder centre ptmp=testPt-pA; p.fx=ptmp[0]; p.fy=ptmp[1]; p.fz=ptmp[2]; //rotate ion position into cylindrical coordinates quat_rot_apply_quat(&p,&qA); //Check inside upper and lower bound of cylinder // and check inside cylinder radius if(!(p.fz < fA && p.fz > -fA && p.fx*p.fx+p.fy*p.fy < fB)) return (unsigned int)-1; fZ=p.fz; } return (unsigned int)(((fZ+fA)/(2.0*fA))*(float)mapMax); } unsigned int CropHelper::mapCylinderInsideRadial( const Point3D &testPt) const { //pA - cylinder origin //fA - cylinder half length (origin to end, along axis) //fB - cylinder sqr radius //qA - rotation quaternion Point3D ptmp; float fSqrRad; if(nearAxis) { ptmp=testPt-pA; if(!(ptmp[2] < fA && ptmp[2] > -fA && ptmp[0]*ptmp[0]+ptmp[1]*ptmp[1] < fB) ) return (unsigned int)-1; else { fSqrRad=ptmp[0]*ptmp[0] + ptmp[1]*ptmp[1]; } } else { Point3f p; //Translate to get position w respect to cylinder centre ptmp=testPt-pA; p.fx=ptmp[0]; p.fy=ptmp[1]; p.fz=ptmp[2]; //rotate ion position into cylindrical coordinates quat_rot_apply_quat(&p,&qA); fSqrRad=p.fx*p.fx + p.fy*p.fy; //Check inside upper and lower bound of cylinder // and check inside cylinder radius if(!( (p.fz < fA && p.fz > -fA ) && fSqrRad < fB)) return (unsigned int)-1; } unsigned int mapPos; mapPos=(unsigned int)(fSqrRad/fB*(float)mapMax); ASSERT(mapPos < mapMax); //Area is constant in square space return mapPos; } //Direction is the axis along the full length of the cylinder void CropHelper::setupCylinder(Point3D origin,float radius, Point3D direction) { ASSERT(direction.sqrMag() > sqrtf(std::numeric_limits::epsilon())); ASSERT(radius > 0.0f); pA=origin; //cylinder half length fA=sqrtf(direction.sqrMag())/2.0f; //cylinder square radius fB=radius*radius; Point3D zDir(0.0f,0.0f,1.0f); direction.normalise(); float angle = zDir.angle(direction); //Check that we actually need to rotate, to avoid numerical singularity //when cylinder axis is too close to (or is) z-axis if(angle > sqrtf(std::numeric_limits::epsilon()) && angle < M_PI - sqrtf(std::numeric_limits::epsilon())) { //Cross product desired direction with //zDirection to produce rotation vector, that when applied // moves us from actual cylinder coordinates to normal cylindrical coordinates //bastardise the Z direction to become our rotation // axis that brings us back to Z. zDir = zDir.crossProd(direction); zDir.normalise(); Point3f rotVec; rotVec.fx=zDir[0]; rotVec.fy=zDir[1]; rotVec.fz=zDir[2]; //Generate the rotating quaternions quat_get_rot_quat(&rotVec,-angle,&qA); nearAxis=false; } else { //Too close to the Z-axis, rotation vector is unable //to be stably computed, and we don't need to rotate anyway nearAxis=true; } } unsigned int CropHelper::mapIon1D(const IonHit &ionIn) const { ASSERT(!invertedClip); ASSERT(mapFunc); ASSERT(mapMax); //return the 1D mapping for the ion, or -1 for not mappable unsigned int mappingPos; mappingPos=(this->*mapFunc)(ionIn.getPosRef()); ASSERT(mappingPos < mapMax || mappingPos == (unsigned int) -1); return mappingPos; } void CropHelper::setFilterMode(size_t filterMode) { ASSERT(filterMode < CROP_ENUM_END); algorithm=filterMode; setAlgorithm(); } 3Depict-0.0.19/src/backend/filters/profile.h0000644000175000017500000001224712716174467020144 0ustar pcuserpcuser/* * profile.h - Composition/density profiles of 3D point clouds * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef COMPPROFILE_H #define COMPPROFILE_H #include "../filter.h" #include "../../common/translation.h" #include enum { PROFILE_KEY_BINWIDTH=1, PROFILE_KEY_FIXEDBINS, PROFILE_KEY_DENSITY_ONLY, PROFILE_KEY_NORMAL, PROFILE_KEY_MINEVENTS, PROFILE_KEY_NUMBINS, PROFILE_KEY_ORIGIN, PROFILE_KEY_PLOTTYPE, PROFILE_KEY_PRIMITIVETYPE, PROFILE_KEY_RADIUS, PROFILE_KEY_SHOWPRIMITIVE, PROFILE_KEY_NORMALISE, PROFILE_KEY_COLOUR, PROFILE_KEY_ERRMODE, PROFILE_KEY_AVGWINSIZE, PROFILE_KEY_LOCKAXISMAG }; //!Filter that does composition or density profiles for various primitives class ProfileFilter : public Filter { private: //!Number explaining basic primitive type /* Possible Modes: * Cylindrical (origin + axis + length) */ unsigned int primitiveType; //!Whether to show the primitive or not bool showPrimitive; //Lock the primitive axis during for cylinder? bool lockAxisMag; //!Vector parameters for different primitives std::vector vectorParams; //!Scalar parameters for different primitives std::vector scalarParams; //! Does the user explicitly want a density plot? bool wantDensity; //!Frequency or percentile mode (0 - frequency; 1-normalised (ion freq)) bool normalise; //!Use fixed bins? bool fixedBins; //!number of bins (if using fixed bins) unsigned int nBins; //!Width of each bin (if using fixed width) float binWidth; //!Number of events required for an entry to be logged in a normalised // histogram unsigned int minEvents; //Plotting stuff //-- //colour of plot ColourRGBAf rgba; //Mode for plotting (eg lines, steps) unsigned int plotStyle; PLOT_ERROR errMode; //!Do we have a range file above us in our filter tree? This is set by ::initFilter bool haveRangeParent; //-- //!internal function for binning an ion dependant upon range data static void binIon(unsigned int targetBin, const RangeStreamData* rng, const std::map &ionIDMapping, std::vector > &frequencyTable, float massToCharge); static unsigned int getPrimitiveId(const std::string &s);; //obtain the size of each bin, and number of bins required for profile unsigned int getBinData(unsigned int &numBins, float &binLength) const; //Obtain the X coordinate of a given bin's centre, given the bin value float getBinPosition(unsigned int nBin) const; public: ProfileFilter(); //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; //!Returns FILTER_TYPE_PROFILE unsigned int getType() const { return FILTER_TYPE_PROFILE;}; //!Get approx number of bytes for caching output size_t numBytesForCache(size_t nObjects) const; //!Initialise filter, check for upstream range virtual void initFilter(const std::vector &dataIn, std::vector &dataOut); //!update filter unsigned int refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress); virtual std::string typeString() const { return std::string(TRANS("Comp. Prof."));}; //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter. Returns true if prop set OK bool setProperty(unsigned int key, const std::string &value, bool &needUpdate); //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Dump state to output stream, using specified format bool writeState(std::ostream &f,unsigned int format, unsigned int depth=0) const; //!Read the state of the filter from XML file. If this //fails, filter will be in an undefined state. bool readState(xmlNodePtr &node, const std::string &packDir); //!Get the stream types that will be dropped during ::refresh unsigned int getRefreshBlockMask() const; //!Get the stream types that will be generated during ::refresh unsigned int getRefreshEmitMask() const; //!Get the stream types that may be utilised in computation during ::refresh unsigned int getRefreshUseMask() const; //!Set internal property value using a selection binding void setPropFromBinding(const SelectionBinding &b) ; void setUserString(const std::string &s); #ifdef DEBUG bool runUnitTests() ; #endif }; #endif 3Depict-0.0.19/src/backend/filters/ionDownsample.cpp0000644000175000017500000005140012720625414021634 0ustar pcuserpcuser/* * ionDownsample.cpp - Filter to perform sampling without replacement on input ion data * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "../../common/translation.h" #include "filterCommon.h" #include "ionDownsample.h" using std::vector; using std::string; //!Downsampling filter enum { IONDOWNSAMPLE_BAD_ALLOC=1, IONDOWNSAMPLE_ERR_ENUM_END }; // == Ion Downsampling filter == IonDownsampleFilter::IonDownsampleFilter() { rng.initTimer(); fixedNumOut=true; fraction=0.1f; maxAfterFilter=5000; rsdIncoming=0; perSpecies=false; cacheOK=false; cache=true; //By default, we should cache, but decision is made higher up } void IonDownsampleFilter::initFilter(const std::vector &dataIn, std::vector &dataOut) { const RangeStreamData *c=0; //Determine if we have an incoming range for (size_t i = 0; i < dataIn.size(); i++) { if(dataIn[i]->getStreamType() == STREAM_TYPE_RANGE) { c=(const RangeStreamData *)dataIn[i]; dataOut.push_back(dataIn[i]); break; } } //we no longer (or never did) have any incoming ranges. Not much to do if(!c) { //delete the old incoming range pointer if(rsdIncoming) delete rsdIncoming; rsdIncoming=0; //Well, don't use per-species info anymore perSpecies=false; } else { //If we didn't have a previously incoming rsd, then make one up! // - we can't use a reference, as the rangestreams are technically transient, // so we have to copy. if(!rsdIncoming) { rsdIncoming = new RangeStreamData; *rsdIncoming=*c; if(ionFractions.size() != c->rangeFile->getNumIons()) { //set up some defaults; seeded from normal ionFractions.resize(c->rangeFile->getNumIons()+1,fraction); ionLimits.resize(c->rangeFile->getNumIons()+1,maxAfterFilter); } } else { //OK, so we have a range incoming already (from last time) //-- the question is, is it the same one we had before ? // //Do a pointer comparison (its a hack, yes, but it should work) if(rsdIncoming->rangeFile != c->rangeFile) { //hmm, it is different. well, trash the old incoming rng delete rsdIncoming; rsdIncoming = new RangeStreamData; *rsdIncoming=*c; ionFractions.resize(c->rangeFile->getNumIons()+1,fraction); ionLimits.resize(c->rangeFile->getNumIons()+1,maxAfterFilter); } else if(ionFractions.size() !=c->rangeFile->getNumIons()) { //well its the same range, but somehow the number of ions //have changed. Could be range was reloaded. ionFractions.resize(rsdIncoming->rangeFile->getNumIons()+1,fraction); ionLimits.resize(rsdIncoming->rangeFile->getNumIons()+1,maxAfterFilter); } //Ensure what is enabled and is disabled is up-to-date for(unsigned int ui=0;uienabledRanges.size();ui++) rsdIncoming->enabledRanges[ui] = c->enabledRanges[ui]; for(unsigned int ui=0;uienabledIons.size();ui++) rsdIncoming->enabledIons[ui] = c->enabledIons[ui]; } } ASSERT(ionLimits.size() == ionFractions.size()); } Filter *IonDownsampleFilter::cloneUncached() const { IonDownsampleFilter *p=new IonDownsampleFilter(); p->rng = rng; p->maxAfterFilter=maxAfterFilter; p->fraction=fraction; p->perSpecies=perSpecies; p->rsdIncoming=rsdIncoming; p->ionFractions.resize(ionFractions.size()); std::copy(ionFractions.begin(),ionFractions.end(),p->ionFractions.begin()); p->ionLimits.resize(ionLimits.size()); std::copy(ionLimits.begin(),ionLimits.end(),p->ionLimits.begin()); //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->userString=userString; p->fixedNumOut=fixedNumOut; return p; } size_t IonDownsampleFilter::numBytesForCache(size_t nObjects) const { if(fixedNumOut) { if(nObjects > maxAfterFilter) return maxAfterFilter*IONDATA_SIZE; else return nObjects*IONDATA_SIZE; } else { return (size_t)((float)(nObjects*IONDATA_SIZE)*fraction); } } unsigned int IonDownsampleFilter::refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress) { //use the cached copy if we have it. if(cacheOK) { propagateStreams(dataIn,getOut,STREAM_TYPE_IONS,true); propagateCache(getOut); return 0; } progress.step=1; progress.maxStep=1; progress.stepName=TRANS("Sampling"); size_t totalSize = numElements(dataIn,STREAM_TYPE_IONS); if(!perSpecies) { for(size_t ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { if(!totalSize) continue; IonStreamData *d; d=new IonStreamData; d->parent=this; try { if(fixedNumOut) { float frac; frac = (float)(((const IonStreamData*)dataIn[ui])->data.size())/(float)totalSize; randomSelect(d->data,((const IonStreamData *)dataIn[ui])->data, rng,maxAfterFilter*frac,progress.filterProgress, *wantAbort,strongRandom); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } } else { size_t n=0; //Reserve 90% of storage needed. //highly likely with even modest numbers of ions //that this will be exceeded d->data.reserve((size_t)(fraction*0.9*totalSize)); ASSERT(dataIn[ui]->getStreamType() == STREAM_TYPE_IONS); for(std::vector::const_iterator it=((const IonStreamData *)dataIn[ui])->data.begin(); it!=((const IonStreamData *)dataIn[ui])->data.end(); ++it) { if(rng.genUniformDev() < fraction) d->data.push_back(*it); progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } } } } catch(std::bad_alloc) { delete d; return IONDOWNSAMPLE_BAD_ALLOC; } //skip ion output sets with no ions in them if(d->data.empty()) { delete d; continue; } //Copy over other attributes d->r = ((IonStreamData *)dataIn[ui])->r; d->g = ((IonStreamData *)dataIn[ui])->g; d->b =((IonStreamData *)dataIn[ui])->b; d->a =((IonStreamData *)dataIn[ui])->a; d->ionSize =((IonStreamData *)dataIn[ui])->ionSize; d->valueType=((IonStreamData *)dataIn[ui])->valueType; //getOut is const, so shouldn't be modified cacheAsNeeded(d); getOut.push_back(d); break; } default: getOut.push_back(dataIn[ui]); break; } } } else { ASSERT(rsdIncoming); const IonStreamData *input; //Construct two vectors. One with the ion IDs for each input //ion stream. the other with the total number of ions in the input //for each ion type. There is an extra slot for unranged data vector numIons,ionIDVec; numIons.resize(rsdIncoming->rangeFile->getNumIons()+1,0); for(unsigned int uj=0;ujgetStreamType() == STREAM_TYPE_IONS) { input=(const IonStreamData*)dataIn[uj]; if(input->data.size()) { //Use the first ion to guess the identity of the entire stream unsigned int ionID; ionID=rsdIncoming->rangeFile->getIonID( input->data[0].getMassToCharge()); if(ionID != (unsigned int)-1) { numIons[ionID]+=input->data.size(); ionIDVec.push_back(ionID); } else { numIons[numIons.size()-1]+=input->data.size(); ionIDVec.push_back(numIons.size()-1); } } } } size_t n=0; unsigned int idPos=0; for(size_t ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { input=(const IonStreamData*)dataIn[ui]; //Don't process ionstreams that are empty if(input->data.empty()) continue; IonStreamData *d; d=new IonStreamData; d->parent=this; try { if(fixedNumOut) { //if we are building the fixed number for output, //then compute the relative fraction for this ion set float frac; frac = (float)(input->data.size())/(float)(numIons[ionIDVec[idPos]]); //The total number of ions is the specified value for this ionID, multiplied by //this stream's fraction of the total incoming data randomSelect(d->data,input->data, rng,(size_t)(frac*ionLimits[ionIDVec[idPos]]), progress.filterProgress,*wantAbort,strongRandom); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } } else { //Use the direct fractions as entered in by user. float thisFraction = ionFractions[ionIDVec[idPos]]; //Reserve 90% of storage needed. //highly likely (Poisson) with even modest numbers of ions //that this will be exceeded, and thus we won't over-allocate d->data.reserve((size_t)(thisFraction*0.9*numIons[ionIDVec[idPos]])); if(thisFraction) { for(vector::const_iterator it=input->data.begin(); it!=input->data.end(); ++it) { if(rng.genUniformDev() < thisFraction) d->data.push_back(*it); //update progress progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); if(*Filter::wantAbort) { delete d; return FILTER_ERR_ABORT; } } } } } catch(std::bad_alloc) { delete d; return IONDOWNSAMPLE_BAD_ALLOC; } if(d->data.size()) { //Copy over other attributes d->r = input->r; d->g = input->g; d->b =input->b; d->a =input->a; d->ionSize =input->ionSize; d->valueType=input->valueType; //getOut is const, so shouldn't be modified cacheAsNeeded(d); getOut.push_back(d); } else delete d; //next ion idPos++; break; } default: getOut.push_back(dataIn[ui]); break; } } } progress.filterProgress=100; return 0; } void IonDownsampleFilter::getProperties(FilterPropGroup &propertyList) const { FilterProperty p; size_t curGroup=0; string tmpStr; stream_cast(tmpStr,fixedNumOut); p.data=tmpStr; p.name=TRANS("By Count"); p.key=KEY_IONDOWNSAMPLE_FIXEDOUT; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Sample up to a fixed number of ions"); propertyList.addProperty(p,curGroup); if(rsdIncoming) { stream_cast(tmpStr,perSpecies); p.name=TRANS("Per Species"); p.data=tmpStr; p.key=KEY_IONDOWNSAMPLE_PERSPECIES; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Use species specific (from ranging) sampling values"); propertyList.addProperty(p,curGroup); } propertyList.setGroupTitle(curGroup,TRANS("Mode")); curGroup++; if(rsdIncoming && perSpecies) { unsigned int typeVal; if(fixedNumOut) typeVal=PROPERTY_TYPE_INTEGER; else typeVal=PROPERTY_TYPE_REAL; unsigned int numIons=rsdIncoming->enabledIons.size(); //create a single line for each for(unsigned int ui=0; uienabledIons[ui]) { if(fixedNumOut) stream_cast(tmpStr,ionLimits[ui]); else stream_cast(tmpStr,ionFractions[ui]); p.name=rsdIncoming->rangeFile->getName(ui); p.data=tmpStr; p.type=typeVal; p.helpText=TRANS("Sampling value for species"); p.key=KEY_IONDOWNSAMPLE_DYNAMIC+ui; propertyList.addProperty(p,curGroup); } } p.name=TRANS("Unranged"); if(fixedNumOut) stream_cast(tmpStr,ionLimits[numIons]); else stream_cast(tmpStr,ionFractions[numIons]); p.data=tmpStr; p.key=KEY_IONDOWNSAMPLE_DYNAMIC+numIons; propertyList.addProperty(p,curGroup); propertyList.setGroupTitle(curGroup,TRANS("Sampling rates")); } else { if(fixedNumOut) { stream_cast(tmpStr,maxAfterFilter); p.key=KEY_IONDOWNSAMPLE_COUNT; p.name=TRANS("Output Count"); p.data=tmpStr; p.type=PROPERTY_TYPE_INTEGER; p.helpText=TRANS("Sample up to this value of points"); } else { stream_cast(tmpStr,fraction); p.name=TRANS("Out Fraction"); p.data=tmpStr; p.key=KEY_IONDOWNSAMPLE_FRACTION; p.type=PROPERTY_TYPE_REAL; p.helpText=TRANS("Sample this fraction of points"); } propertyList.addProperty(p,curGroup); propertyList.setGroupTitle(curGroup,TRANS("Sampling rates")); } } bool IonDownsampleFilter::setProperty( unsigned int key, const std::string &value, bool &needUpdate) { needUpdate=false; switch(key) { case KEY_IONDOWNSAMPLE_FIXEDOUT: { if(!applyPropertyNow(fixedNumOut,value,needUpdate)) return false; break; } case KEY_IONDOWNSAMPLE_FRACTION: { float newFraction; if(stream_cast(newFraction,value)) return false; if(newFraction < 0.0f || newFraction > 1.0f) return false; //In the case of fixed number output, //our cache is invalidated if(!fixedNumOut) { needUpdate=true; clearCache(); } fraction=newFraction; break; } case KEY_IONDOWNSAMPLE_COUNT: { if(!applyPropertyNow(maxAfterFilter,value,needUpdate)) return false; break; } case KEY_IONDOWNSAMPLE_PERSPECIES: { if(!applyPropertyNow(perSpecies,value,needUpdate)) return false; break; } default: { ASSERT(rsdIncoming); ASSERT(key >=KEY_IONDOWNSAMPLE_DYNAMIC); ASSERT(key < KEY_IONDOWNSAMPLE_DYNAMIC+ionLimits.size()); ASSERT(ionLimits.size() == ionFractions.size()); unsigned int offset; offset=key-KEY_IONDOWNSAMPLE_DYNAMIC; //TODO: Disable this test - // offset >=ionLimits.size() did happen, but should not have. // Can't reproduce bug - something to do with wrong filter being given selected properties in UI ASSERT( offset < ionLimits.size()); if(offset >= ionLimits.size()) return false; //Dynamically generated list of downsamples if(fixedNumOut) { //Fixed count size_t v; if(stream_cast(v,value)) return false; ionLimits[offset]=v; } else { //Fixed fraction float v; if(stream_cast(v,value)) return false; if(v < 0.0f || v> 1.0f) return false; ionFractions[offset]=v; } needUpdate=true; clearCache(); break; } } return true; } std::string IonDownsampleFilter::getSpecificErrString(unsigned int code) const { const char *errStrs[] = { "", "Insuffient memory for downsample", }; COMPILE_ASSERT(THREEDEP_ARRAYSIZE(errStrs) == IONDOWNSAMPLE_ERR_ENUM_END); ASSERT(code < IONDOWNSAMPLE_ERR_ENUM_END); return errStrs[code]; } void IonDownsampleFilter::setPropFromBinding(const SelectionBinding &b) { ASSERT(false); } bool IonDownsampleFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<" << trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; writeScalarsXML(f,"fractions",ionFractions,depth+1); writeScalarsXML(f,"limits",ionLimits,depth+1); f << tabs(depth) << "" << endl; break; } default: ASSERT(false); return false; } return true; } bool IonDownsampleFilter::readState(xmlNodePtr &nodePtr, const std::string &stateFileDir) { using std::string; string tmpStr; xmlChar *xmlString; //Retrieve user string if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //Retrieve number out (yes/no) mode if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"fixednumout","value")) return false; if(!boolStrDec(tmpStr,fixedNumOut)) return false; //=== //Retrieve Fraction //=== if(!XMLGetNextElemAttrib(nodePtr,fraction,"fraction","value")) return false; //disallow negative or values gt 1. if(fraction < 0.0f || fraction > 1.0f) return false; //=== //Retreive maxafterfilter //--- if(!XMLGetNextElemAttrib(nodePtr,maxAfterFilter,"maxafterfilter","value")) return false; //--- //Retrieve "perspecies" attrib if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"perspecies","value")) return false; if(!boolStrDec(tmpStr,perSpecies)) return false; //Retrieve the ion per-species fractions //-- if(XMLHelpFwdToElem(nodePtr,"fractions")) return false; //Populate the ion fraction vector if(!readScalarsXML(nodePtr,ionFractions)) return false; //Retrieve the ion per-species fractions if(XMLHelpFwdToElem(nodePtr,"limits")) return false; if(!readScalarsXML(nodePtr,ionLimits)) return false; //-- if(ionLimits.size()!=ionFractions.size()) return false; return true; } unsigned int IonDownsampleFilter::getRefreshBlockMask() const { return STREAM_TYPE_IONS ; } unsigned int IonDownsampleFilter::getRefreshEmitMask() const { return STREAM_TYPE_IONS; } unsigned int IonDownsampleFilter::getRefreshUseMask() const { return STREAM_TYPE_RANGE | STREAM_TYPE_IONS; } //---------- //Unit testing for this class ///----- #ifdef DEBUG //Create a synthetic dataset of points // returned pointer *must* be deleted. Span must have 3 elements, // and for best results could be co-prime with one another; e.g. all prime numbers IonStreamData *synthDataPts(unsigned int span[],unsigned int numPts); //Test for fixed number of output ions bool fixedSampleTest(); //Test for variable number of output ions bool variableSampleTest(); //Unit tests bool IonDownsampleFilter::runUnitTests() { if(!fixedSampleTest()) return false; if(!variableSampleTest()) return false; return true; } bool fixedSampleTest() { //Simulate some data to send to the filter vector streamIn,streamOut; IonStreamData *d= new IonStreamData; const unsigned int NUM_PTS=10000; for(unsigned int ui=0;uidata.push_back(h); } streamIn.push_back(d); //Set up the filter itself IonDownsampleFilter *f=new IonDownsampleFilter; f->setCaching(false); bool needUp; string s; unsigned int numOutput=NUM_PTS/10; TEST(f->setProperty(KEY_IONDOWNSAMPLE_FIXEDOUT,"1",needUp),"Set prop"); stream_cast(s,numOutput); TEST(f->setProperty(KEY_IONDOWNSAMPLE_COUNT,s,needUp),"Set prop"); //Do the refresh ProgressData p; f->refresh(streamIn,streamOut,p); delete f; delete d; //Pass some tests TEST(streamOut.size() == 1, "Stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS, "stream type"); TEST(streamOut[0]->getNumBasicObjects() == numOutput, "output ions (basicobject)"); TEST( ((IonStreamData*)streamOut[0])->data.size() == numOutput, "output ions (direct)") delete streamOut[0]; return true; } bool variableSampleTest() { //Build some points to pass to the filter vector streamIn,streamOut; unsigned int span[]={ 5, 7, 9 }; const unsigned int NUM_PTS=10000; IonStreamData *d=synthDataPts(span,NUM_PTS); streamIn.push_back(d); IonDownsampleFilter *f=new IonDownsampleFilter; f->setCaching(false); bool needUp; TEST(f->setProperty(KEY_IONDOWNSAMPLE_FIXEDOUT,"0",needUp),"Set prop"); TEST(f->setProperty(KEY_IONDOWNSAMPLE_FRACTION,"0.1",needUp),"Set prop"); //Do the refresh ProgressData p; TEST(!(f->refresh(streamIn,streamOut,p)),"refresh error code"); delete f; delete d; TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); //It is HIGHLY improbable that it will be <1/10th of the requested number TEST(streamOut[0]->getNumBasicObjects() > 0.01*NUM_PTS && streamOut[0]->getNumBasicObjects() <= NUM_PTS,"ion fraction"); delete streamOut[0]; return true; } IonStreamData *synthDataPts(unsigned int span[], unsigned int numPts) { IonStreamData *d = new IonStreamData; for(unsigned int ui=0;uidata.push_back(h); } return d; } #endif ///----- 3Depict-0.0.19/src/backend/filters/ionDownsample.h0000644000175000017500000001022412640746376021314 0ustar pcuserpcuser/* * ionDownsample.h - Filter to perform sampling without replacement on input ion data * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef IONDOWNSAMPLE_H #define IONDOWNSAMPLE_H #include "../filter.h" enum { KEY_IONDOWNSAMPLE_FRACTION=1, KEY_IONDOWNSAMPLE_FIXEDOUT, KEY_IONDOWNSAMPLE_COUNT, KEY_IONDOWNSAMPLE_PERSPECIES, KEY_IONDOWNSAMPLE_ENABLE, //Dynamic area for this filter class. May validly use any index after this value KEY_IONDOWNSAMPLE_DYNAMIC, }; //!Random picker filter class IonDownsampleFilter : public Filter { private: RandNumGen rng; //When using fixed number output, maximum to allow out. size_t maxAfterFilter; //!Allow only a fixed number at output, alternate is random fraction (binomial dist). bool fixedNumOut; //Fraction to output float fraction; //!Should we use a per-species split or not? bool perSpecies; //This is filter's enabled ranges. 0 if we don't have a range RangeStreamData *rsdIncoming; //!Fractions to output for species specific std::vector ionFractions; std::vector ionLimits; public: IonDownsampleFilter(); //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; //!Returns FILTER_TYPE_IONDOWNSAMPLE unsigned int getType() const { return FILTER_TYPE_IONDOWNSAMPLE;}; //!Initialise filter prior to tree propagation virtual void initFilter(const std::vector &dataIn, std::vector &dataOut); //!Set mode, fixed num out/approximate out (fraction) void setControlledOut(bool controlled) {fixedNumOut=controlled;}; //!Set the number of ions to generate after the filtering (when using count based fitlering). void setFilterCount(size_t nMax) { maxAfterFilter=nMax;}; //!Get (approx) number of bytes required for cache virtual size_t numBytesForCache(size_t nObjects) const; //update filter unsigned int refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress); //!return string naming the human readable type of this class virtual std::string typeString() const { return std::string(TRANS("Ion Sampler"));} //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter bool setProperty( unsigned int key, const std::string &value, bool &needUpdate); //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Dump state to output stream, using specified format bool writeState(std::ostream &f,unsigned int format, unsigned int depth=0) const; //!Read the state of the filter from XML file. If this //fails, filter will be in an undefined state. bool readState(xmlNodePtr &node, const std::string &packDir); //!Set internal property value using a selection binding (Disabled, this filter has no bindings) void setPropFromBinding(const SelectionBinding &b) ; //!Get the stream types that will be dropped during ::refresh unsigned int getRefreshBlockMask() const; //!Get the stream types that will be generated during ::refresh unsigned int getRefreshEmitMask() const; //!Get the stream types that will be possibly used during ::refresh unsigned int getRefreshUseMask() const; #ifdef DEBUG //Fire off the unit tests for this class. returns false if *any* test fails bool runUnitTests(); #endif }; #endif 3Depict-0.0.19/src/backend/filters/boundingBox.h0000644000175000017500000000752012716174467020760 0ustar pcuserpcuser/* * boundingBox.h - Bounding boxes for 3D point data * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef BOUNDINGBOX_H #define BOUNDINGBOX_H #include "../filter.h" #include "../../common/translation.h" //!Bounding box filter class BoundingBoxFilter : public Filter { private: //!visibility bool isVisible; //!visual representation mode unsigned int boundStyle; //!Should tick positions be computed using fixed tick counts or spacing? bool fixedNumTicks; //!Number of ticks (XYZ) if using fixed num ticks unsigned int numTicks[3]; //!Spacing of ticks (XYZ) if using fixed spacing ticks float tickSpacing[3]; //!Enable/disable ticks on a given axis bool enableTicks[3]; //!Font size unsigned int fontSize; //!Should we use absolute coordinate values in box labels? bool absoluteCoords; //!Line colour ColourRGBAf lineColour; //!Line width float lineWidth; //!Use 3D text? bool threeDText; //!Draw tick-style bounding box and associated annotations void drawTicks(const BoundCube &bTotal,DrawStreamData *d) const; //!Draw "dimension" style bounding box and associated annotation void drawDimension(const BoundCube &bTotal, DrawStreamData *d) const; public: BoundingBoxFilter(); //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; //!Returns -1, as range file cache size is dependant upon input. virtual size_t numBytesForCache(size_t nObjects) const; //!Returns FILTER_TYPE_RANGEFILE unsigned int getType() const { return FILTER_TYPE_BOUNDBOX;}; //update filter unsigned int refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress); //!Force a re-read of the rangefile Return value is range file reading error code unsigned int updateRng(); virtual std::string typeString() const { return std::string(TRANS("Bound box"));}; //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter bool setProperty(unsigned int key, const std::string &value, bool &needUpdate); //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Dump state to output stream, using specified format bool writeState(std::ostream &f,unsigned int format, unsigned int depth=0) const; //!Read the state of the filter from XML file. If this //fails, filter will be in an undefined state. bool readState(xmlNodePtr &node, const std::string &packDir); //!Get the stream types that will be dropped during ::refresh unsigned int getRefreshBlockMask() const; //!Get the stream types that will be generated during ::refresh unsigned int getRefreshEmitMask() const; //!Refresh ignore mask, for filter streams that will not be utilised in the computation (except for pass-through) unsigned int getRefreshUseMask() const; //!Set internal property value using a selection binding (Disabled, this filter has no bindings) void setPropFromBinding(const SelectionBinding &b) ; #ifdef DEBUG bool runUnitTests() ; #endif }; #endif 3Depict-0.0.19/src/backend/filters/clusterAnalysis.cpp0000644000175000017500000025457412723151604022221 0ustar pcuserpcuser/* * clusterAnalysis.cpp - Perform clustering data analysis on valued point clouds * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "clusterAnalysis.h" #include "filterCommon.h" #include #include #include #include #include "../../common/gsl_helper.h" #include "backend/plot.h" using std::vector; using std::string; using std::pair; using std::make_pair; using std::map; using std::max; enum { KEY_CLUSTERANALYSIS_ALGORITHM, KEY_CORECLASSIFY_ENABLE, KEY_CORECLASSIFYDIST, KEY_CORECLASSIFYKNN, KEY_LINKDIST, KEY_BULKLINK_ENABLE, KEY_BULKLINK, KEY_ERODE_ENABLE, KEY_ERODEDIST, KEY_WANT_CLUSTERSIZEDIST, KEY_WANT_LOGSIZEDIST, KEY_WANT_COMPOSITIONDIST, KEY_WANT_CLUSTERMORPHOLOGY, KEY_WANT_CLUSTERID, KEY_NORMALISE_COMPOSITION, KEY_CROP_SIZE, KEY_SIZE_COUNT_BULK, KEY_CROP_NMIN, KEY_CROP_NMAX, KEY_BULK_ALL, KEY_CORE_OFFSET=100000, KEY_BULK_OFFSET=200000 }; enum { NOCORE_ERR=1, NOBULK_ERR, CLUSTER_ERR_ENUM_END }; enum { CLUSTER_LINK_ERODE, CLUSTER_ALGORITHM_ENUM_END, }; enum { COMPOSITION_NONE, COMPOSITION_UNNORMALISED, COMPOSITION_NORMALISED }; const char SIZE_DIST_DATALABEL[] =NTRANS("Size Distribution"); const char CHEM_DIST_DATALABEL[] =NTRANS("Chemistry Distribution"); using std::vector; //Optimisation tuning value; // number of points to expect in a KD query sphere before the bulk query pays off // in terms of algorithm speed const float SPHERE_PRESEARCH_CUTOFF = 75; //In link clustering, when we preform size cropping, do we awant to count bulk ions in our analysis? const bool WANT_COUNT_BULK_FORCROP=false; void makeFrequencyTable(const IonStreamData *i ,const RangeFile *r, std::vector > &freqTable) { ASSERT(r); ASSERT(i); unsigned int numThreads; #ifdef _OPENMP numThreads=omp_get_max_threads(); #else numThreads=1; #endif //Create a series of independent vectors,that we can sum into seperately, // based upon the number of threads vector ionHist; ionHist.resize(numThreads); for(size_t ui=0;uigetNumIons()]; for(size_t uj=0;ujgetNumIons();uj++) ionHist[ui][uj]=0; } #pragma omp parallel for for(size_t ui=0;uidata.size();ui++) { #ifdef _OPENMP unsigned int threadNum=omp_get_thread_num(); #endif unsigned int rangeId; rangeId= r->getIonID(i->data[ui].getMassToCharge()); if(rangeId!=(unsigned int)-1) { #ifdef _OPENMP ionHist[threadNum][rangeId]++; #else ionHist[0][rangeId]++; #endif } } #ifdef _OPENMP //we have to re-count the total, and tally the different threads //in the histogram for(size_t uj=0;ujgetNumIons();uj++) { for(size_t ui=1;uigetNumIons();uj++) freqTable.push_back(make_pair(r->getName(uj),ionHist[0][uj])); for(size_t ui=0;ui > &compTable) { std::vector > tab; makeFrequencyTable(i,r,tab); compTable.resize(tab.size()); size_t total=0; for(unsigned int ui=0;ui &resultValues, vector &resultVectors) { //Although this function *mostly* works on arbitrary datasizes, the vector is of course //fixed to being 3D.. ASSERT(numCols == 3 && numRows == 3); //Set up the output vector space, the eigen result space and //some scratch space for the program gsl_vector *eigenVals= gsl_vector_alloc(numCols); //Eigen value results gsl_matrix *eigenVecs= gsl_matrix_alloc(numCols,numCols); // Eigen vectors gsl_eigen_symmv_workspace *workspace = gsl_eigen_symmv_alloc(numCols); //scratch space //Decompose matrix. Note that input matrix is overwritten by gsl. gsl_eigen_symmv(m,eigenVals, eigenVecs,workspace); gsl_eigen_symmv_sort (eigenVals, eigenVecs, GSL_EIGEN_SORT_VAL_DESC); resultValues.clear(); for(size_t ui=0;ui &rangeEnabledMap) { //should be empty... ASSERT(rangeEnabledMap.empty()); //"Lagging" counter to track the mapping from ionID->enabled Ion ID. size_t count=0; for(size_t ui=0;uirangeFile->getNumIons();ui++) { if(r->enabledIons[ui]) { //Create map entry rangeEnabledMap[ui]=count; count++; } } } ClusterAnalysisFilter::ClusterAnalysisFilter() : algorithm(CLUSTER_LINK_ERODE), enableCoreClassify(false), coreDist(0.0f), coreKNN(1), linkDist(0.5f), enableBulkLink(false), bulkLink(0.25), enableErosion(false), dErosion(0.25), wantClusterID(false), wantCropSize(false), nMin(0),nMax(std::numeric_limits::max()), wantClusterSizeDist(false),logClusterSize(false), wantClusterComposition(true),normaliseComposition(true), wantClusterMorphology(false), haveRangeParent(false) { cacheOK=false; //By default, we should cache, but final decision is made higher up cache=true; #ifdef DEBUG wantParanoidDebug=false; #endif } Filter *ClusterAnalysisFilter::cloneUncached() const { ClusterAnalysisFilter *p=new ClusterAnalysisFilter; p->algorithm=algorithm; p->coreDist=coreDist; p->bulkLink=bulkLink; p->linkDist=linkDist; p->dErosion=dErosion; p->wantCropSize=wantCropSize; p->nMin=nMin; p->nMax=nMax; p->wantClusterSizeDist = wantClusterSizeDist; p->logClusterSize= logClusterSize; p->wantClusterComposition=wantClusterComposition; p->normaliseComposition = normaliseComposition; p->wantClusterMorphology= wantClusterMorphology; p->haveRangeParent=false; //lets assume not, and this will be reset at ::initFilter time p->ionNames.resize(ionNames.size()); std::copy(ionNames.begin(),ionNames.end(),p->ionNames.begin()); p->ionCoreEnabled.resize(ionCoreEnabled.size()); std::copy(ionCoreEnabled.begin(),ionCoreEnabled.end(),p->ionCoreEnabled.begin()); p->ionBulkEnabled.resize(ionBulkEnabled.size()); std::copy(ionBulkEnabled.begin(),ionBulkEnabled.end(),p->ionBulkEnabled.begin()); //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->userString=userString; return p; } void ClusterAnalysisFilter::initFilter(const std::vector &dataIn, std::vector &dataOut) { //Check for range file parent for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_RANGE) { const RangeStreamData *r; r = (const RangeStreamData *)dataIn[ui]; bool different=false; if(!haveRangeParent) { //well, things have may have changed, we didn't have a //range parent before. Or, we could have been loaded in from //a file. if(ionCoreEnabled.size() != r->rangeFile->getNumIons() || ionBulkEnabled.size() != r->rangeFile->getNumIons()) different=true; else { //The ion lengths are the same; if so, we can just fill in the gaps // -- the file does not store names; just sequence IDs. ionNames.clear(); ionNames.reserve(r->rangeFile->getNumRanges()); for(unsigned int uj=0;ujrangeFile->getNumIons();uj++) { if(r->enabledIons[uj]) ionNames.push_back(r->rangeFile->getName(uj)); } } } else { //OK, last time we had a range parent. Check to see //if the ion names are the same. If they are, keep the //current bools, iff the ion names are all the same unsigned int numEnabled=std::count(r->enabledIons.begin(), r->enabledIons.end(),1); if(ionNames.size() == numEnabled) { unsigned int pos=0; for(unsigned int uj=0;ujrangeFile->getNumIons();uj++) { //Only look at parent-enabled ranges if(r->enabledIons[uj]) { if(r->rangeFile->getName(uj) != ionNames[pos]) { different=true; break; } pos++; } } } else different=true; } haveRangeParent=true; if(different) { //OK, its different. we will have to re-assign, //but only allow the ranges enabled in the parent filter // vector oldIonNames; oldIonNames.swap(ionNames); ionNames.reserve(r->rangeFile->getNumRanges()); for(unsigned int uj=0;ujrangeFile->getNumIons();uj++) { if(r->enabledIons[uj]) ionNames.push_back(r->rangeFile->getName(uj)); } //Create new Core enabled/size enabled maps //try to preserve selection using ion naming, if possible //--- vector oldCoreEnable,oldBulkEnable; oldCoreEnable.swap(ionCoreEnabled); oldBulkEnable.swap(ionBulkEnabled); ionCoreEnabled.resize(ionNames.size(),false); ionBulkEnabled.resize(ionNames.size(),true); //TODO: Could replace double-search with keyed sort & match for(size_t ui=0;ui &dataIn, std::vector &getOut, ProgressData &progress) { // - cluster ID alters the mass, so we can't use this analysis // at the same time ASSERT(!(wantClusterID && wantClusterComposition)); //By default, copy inputs to output, unless it is an ion or range stream type. for(unsigned int ui=0;uigetStreamType(); //Block ions moving through filter; we modify them. // and also rangefiles, as we don't propagate these if(type != STREAM_TYPE_IONS && type!=STREAM_TYPE_RANGE) getOut.push_back(dataIn[ui]); } //use the cached copy if we have it. if(cacheOK) { propagateCache(getOut); return 0; } //OK, we actually have to do some work. //================ //Set K3D tree abort pointer and progress K3DTreeMk2::setAbortFlag(Filter::wantAbort); K3DTreeMk2::setProgressPtr(&progress.filterProgress); //Find out how much total size we need in points vector size_t totalDataSize=0; for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *d; d=((const IonStreamData *)dataIn[ui]); totalDataSize+=d->data.size(); } break; default: break; } } //Nothing to do. if(!totalDataSize) return 0; if(!haveRangeParent) { consoleOutput.push_back(string(TRANS("No range data. Can't cluster."))); return 0; } bool haveABulk,haveACore; checkIonEnabled(haveACore,haveABulk); //Check that the user has enabled something as core if(!haveACore) { consoleOutput.push_back( string(TRANS("No ranges selected for cluster \"core\". Cannot continue with clustering."))); return NOCORE_ERR; } //Check that the user has enabled something as matrix/bulk. if(!haveABulk && enableBulkLink) { consoleOutput.push_back( string(TRANS("No ranges selected for cluster \"bulk\". Cannot continue with clustering."))); return NOBULK_ERR; } #ifdef DEBUG for(unsigned int ui=0;ui > clusteredCore,clusteredBulk; switch(algorithm) { case CLUSTER_LINK_ERODE: { unsigned int errCode; errCode=refreshLinkClustering(dataIn,clusteredCore, clusteredBulk,progress); if(errCode) return errCode; break; } default: ASSERT(false); } #ifdef DEBUG /* If you are paranoid about the quality of the output, * This will enable running some sanity checks that do * not use the data structure involved in the clustering; * ie a secondary check. * However this is far too slow to enable by default, even in debug mode */ if(wantParanoidDebug) paranoidDebugAssert(clusteredCore,clusteredBulk); #endif if(wantCropSize) stripClusterBySize(clusteredCore,clusteredBulk,WANT_COUNT_BULK_FORCROP,progress); bool haveBulk,haveCore; haveBulk=clusteredBulk.size(); haveCore=clusteredCore.size(); if(!haveBulk && !haveCore) return 0; //we can't have bulk, but no core... ASSERT(!(haveBulk && !haveCore)); //------------- //Report the results back to the user //------------ //Cluster reporting. const RangeStreamData *r=0; for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_RANGE) { r = (const RangeStreamData *)dataIn[ui]; break; } } size_t curPlotIndex=0; //Generate size distribution if we need it. if(wantClusterSizeDist) { PlotStreamData *d; d=clusterSizeDistribution(clusteredCore,clusteredBulk); if(d) { d->index=curPlotIndex; curPlotIndex++; if(cache) { d->cached=1; filterOutputs.push_back(d); } else d->cached=0; getOut.push_back(d); } } //Generate composition distribution if we requested it if(wantClusterComposition) { vector plots; genCompositionVersusSize(clusteredCore,clusteredBulk,r->rangeFile,plots); for(unsigned int ui=0;uiindex=curPlotIndex; curPlotIndex++; if(cache) { plots[ui]->cached=1; filterOutputs.push_back(plots[ui]); } else plots[ui]->cached=0; getOut.push_back(plots[ui]); } } if(wantClusterMorphology) { //Compute the singular values for each cluster //which describe the cluster morphology, their basis vectors, and //the mass centre for the clusters //Sudbrack, C. : Decomposition behavior in model Ni-Al-Cr-X superalloys: // temporal evolution and compositional pathways on a nanoscale (Ph.D. Thesis, 2004) //http://arc.nucapt.northwestern.edu/refbase/files/Sudbrack_Ph.D._thesis_2004_6MB.pdf //Eigen values, //Mass centres of clusters & Eigen vectors vector > > singularVectors; vector > singularVals; singularVectors.resize(clusteredCore.size()); singularVals.resize(clusteredCore.size()); for(unsigned int ui=0;ui dummy; getEllipsoidalFit(clusteredCore[ui],dummy,singularVectors[ui]); } vector thisSingVals; thisSingVals.resize(3); for(unsigned int uj=0;uj<3;uj++) { thisSingVals[uj] =sqrtf(singularVectors[ui].second[uj].sqrMag()); } singularVals[ui].swap(thisSingVals); } //Ok, so we have the singular values, now create a //plot with the values in it Plot2DStreamData *p = new Plot2DStreamData; p->parent=this; p->plotType=PLOT_2D_SCATTER; p->dataLabel=TRANS("Morphology Plot"); p->xLabel=TRANS("\\lambda_1:\\lambda_2 ratio"); p->yLabel=TRANS("\\lambda_2:\\lambda_3 ratio"); p->scatterData.reserve(singularVals.size()); p->scatterIntensityLog=true; #pragma omp parallel for for(unsigned int ui=0; ui std::numeric_limits::epsilon()) { //sort the singular values vector v; v.resize(3); for(size_t uj=0;uj<3;uj++) v[uj]= singularVals[ui][uj]; std::sort(v.begin(),v.end()); if( v[0] < std::numeric_limits::epsilon() ) continue; //Plot (sec largest/largest) (y-coord) vs. ( sec. smallest/largest) (x-coord) eigenvalues //Keeping data in [0,1] range (thanks to AJL for pointing out the flip!) pair pr(v[0]/v[1],v[1]/v[2]); #pragma omp critical { p->scatterData.push_back(pr); p->scatterIntensity.push_back(clusteredCore[ui].size()); } } } if(p->scatterData.size()) { p->index=curPlotIndex; curPlotIndex++; cacheAsNeeded(p); getOut.push_back(p); } else { consoleOutput.push_back(TRANS("No clusters had sufficient dimensionality to compute singular values")); delete p; } //Draw the singular vectors in 3D, per cluster { DrawStreamData *singularVectorDraw = new DrawStreamData; singularVectorDraw->parent=this; singularVectorDraw->drawables.reserve(singularVectors.size()*3); //So the next thing we do, is create mini Axes for them at their respective coordinates //the length of each part of the axis shows the primary directions //for that part of the cluster for(unsigned int ui=0;ui=singularVectors[ui].second.size()) break; DrawVector *d; d= new DrawVector; d->setColour(uj ==0, uj == 1, uj ==2,1); d->setDrawArrow(false); Point3D start,semiAxis; semiAxis=singularVectors[ui].second[uj]; start=singularVectors[ui].first; //First in current singular pair is cluster origin d->setOrigin(start); //Second contains each individual thing d->setVector(semiAxis); singularVectorDraw->drawables.push_back(d); } } cacheAsNeeded(singularVectorDraw); getOut.push_back(singularVectorDraw); } } //Construct the output clustered data. IonStreamData *i = new IonStreamData; i->parent =this; std::string sDebugConsole,stmp; stream_cast(stmp,clusteredCore.size()); sDebugConsole=TRANS("Found :"); sDebugConsole+=stmp; sDebugConsole+= TRANS(" clusters"); consoleOutput.push_back(sDebugConsole); size_t totalSize=0; #pragma omp parallel for reduction(+:totalSize) for(size_t ui=0;uidata.resize(totalSize); if(wantClusterID) { //To prevent clusters ID from correlatiing with their position // which results in odd visual effects, randomise the ID a litlle; vector idShuffle; idShuffle.resize(clusteredCore.size()); for(unsigned int ui=0;uidata[copyPos]=clusteredCore[ui][uj]; copyPos++; } } clusteredCore.clear(); for(size_t ui=0;uidata[copyPos]=clusteredBulk[ui][uj]; copyPos++; } } clusteredBulk.clear(); //The result data is drawn grey... i->r=0.5f; i->g=0.5f; i->b=0.5f; i->a=1.0f; cacheAsNeeded(i); getOut.push_back(i); //Run cluster composition if it is wanted. if(wantClusterComposition) { ASSERT(r); if(normaliseComposition) { vector > compTable; makeCompositionTable(i,r->rangeFile,compTable); if(haveBulk) consoleOutput.push_back(TRANS("Compositions (fractional, core+bulk)")); else if(haveCore) consoleOutput.push_back(TRANS("Compositions (fractional, core only)")); std::string compString,tmp; for(unsigned int ui=0;ui > freqTable; makeFrequencyTable(i,r->rangeFile,freqTable); consoleOutput.push_back(TRANS("Frequencies (core+bulk)")); std::string freqString,tmp; for(unsigned int ui=0;ui 1) { vector > choices; tmpStr=TRANS("Core Link + Erode"); choices.push_back(make_pair((unsigned int)CLUSTER_LINK_ERODE,tmpStr)); tmpStr= choiceString(choices,algorithm); p.name=TRANS("Algorithm"); p.data=tmpStr; choices.clear(); p.type=PROPERTY_TYPE_CHOICE; p.helpText=TRANS("Cluster algorithm mode"); p.key=KEY_CLUSTERANALYSIS_ALGORITHM; propertyList.addProperty(p,curGroup); propertyList.setGroupTitle(curGroup,TRANS("Algorithm")); curGroup++; } if(algorithm == CLUSTER_LINK_ERODE) { p.name=TRANS("Core Classify"); p.data=boolStrEnc(enableCoreClassify); p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Enable core-classifcation pre-step in clustering (Stephenson et al, 2007)"); p.key=KEY_CORECLASSIFY_ENABLE; propertyList.addProperty(p,curGroup); if(enableCoreClassify) { stream_cast(tmpStr,coreDist); p.name=TRANS("Core Classify Dist"); p.data=tmpStr; p.type=PROPERTY_TYPE_REAL; p.helpText=TRANS("Restrict only atoms by distance to be cluster sources"); p.key=KEY_CORECLASSIFYDIST; propertyList.addProperty(p,curGroup); stream_cast(tmpStr,coreKNN); p.name=TRANS("Classify Knn Max"); p.data=tmpStr; p.type=PROPERTY_TYPE_INTEGER; p.helpText=TRANS("Require that the kth NN (this number) is within the classify distance, to be a cluster source"); p.key=KEY_CORECLASSIFYKNN; propertyList.addProperty(p,curGroup); } stream_cast(tmpStr,linkDist); p.name=TRANS("Core Link Dist"); p.data=tmpStr; p.type=PROPERTY_TYPE_REAL; p.helpText=TRANS("Distance between clusters to allow linking"); p.key=KEY_LINKDIST; propertyList.addProperty(p,curGroup); p.name=TRANS("Bulk Link"); p.data=boolStrEnc(enableBulkLink); p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Enable linking of non-cluster species - eg for composition analysis "); p.key=KEY_BULKLINK_ENABLE; propertyList.addProperty(p,curGroup); if(enableBulkLink) { stream_cast(tmpStr,bulkLink); p.name=TRANS("Bulk Link (Envelope) Dist"); p.data=tmpStr; p.type=PROPERTY_TYPE_REAL; p.helpText=TRANS("Distance from core points that form cluster that is used to grab surrounding bulk points"); p.key=KEY_BULKLINK; propertyList.addProperty(p,curGroup); p.name=TRANS("Erosion"); p.data=boolStrEnc(enableErosion); p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Enable linking of non-cluster species - eg for composition analysis "); p.key=KEY_ERODE_ENABLE; propertyList.addProperty(p,curGroup); if(enableErosion) { stream_cast(tmpStr,dErosion); p.name=TRANS("Erode Dist"); p.data=tmpStr; p.type=PROPERTY_TYPE_REAL; p.helpText=TRANS("Distance from unclustered material in which bulk points are eroded from cluster"); p.key=KEY_ERODEDIST; propertyList.addProperty(p,curGroup); } } } propertyList.setGroupTitle(curGroup,TRANS("Clustering Params")); curGroup++; tmpStr=boolStrEnc(wantCropSize); p.name=TRANS("Size Cropping"); p.data=tmpStr; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Remove clusters based upon size distribution"); p.key=KEY_CROP_SIZE; propertyList.addProperty(p,curGroup); if(wantCropSize) { stream_cast(tmpStr,nMin); p.name=TRANS("Min Size"); p.data=tmpStr; p.type=PROPERTY_TYPE_INTEGER; p.helpText=TRANS("Remove clusters below this size"); p.key=KEY_CROP_NMIN; propertyList.addProperty(p,curGroup); stream_cast(tmpStr,nMax); p.name=TRANS("Max Size"); p.data=tmpStr; p.type=PROPERTY_TYPE_INTEGER; p.helpText=TRANS("Remove clusters above this size"); p.key=KEY_CROP_NMAX; propertyList.addProperty(p,curGroup); } tmpStr=boolStrEnc(wantClusterSizeDist); p.name=TRANS("Size Distribution"); p.data=tmpStr; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Show number of clusters as a function of cluster size"); p.key=KEY_WANT_CLUSTERSIZEDIST; propertyList.addProperty(p,curGroup); if(wantClusterSizeDist) { tmpStr=boolStrEnc(logClusterSize); p.name=TRANS("Log Scale"); p.data=tmpStr; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Use logarithmic scale for size distribution"); p.key=KEY_WANT_LOGSIZEDIST; propertyList.addProperty(p,curGroup); } tmpStr=boolStrEnc(wantClusterMorphology); p.name=TRANS("Morphology Dist."); p.data=tmpStr; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Create a plot showing cluster aspect ratio"); p.key=KEY_WANT_CLUSTERMORPHOLOGY; propertyList.addProperty(p,curGroup); tmpStr=boolStrEnc(wantClusterID); p.name=TRANS("Cluster Id"); p.data=tmpStr; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Assign cluster output a unique per-cluster value (id)."); p.key=KEY_WANT_CLUSTERID; propertyList.addProperty(p,curGroup); if(!wantClusterID) { tmpStr=boolStrEnc(wantClusterComposition); p.name=TRANS("Chemistry Dist."); p.data=tmpStr; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Create a plot showing chemistry for each cluster size"); p.key=KEY_WANT_COMPOSITIONDIST; propertyList.addProperty(p,curGroup); if(wantClusterComposition) { tmpStr=boolStrEnc(normaliseComposition); p.name=TRANS("Normalise"); p.data=tmpStr; p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Convert cluster counts to composition"); p.key=KEY_NORMALISE_COMPOSITION; propertyList.addProperty(p,curGroup); } } propertyList.setGroupTitle(curGroup,TRANS("Postprocess")); curGroup++; if(haveRangeParent && ionNames.size()) { //Offset markers are used elsewhere. Must be in sync with //this code ASSERT(ionCoreEnabled.size() == ionBulkEnabled.size()); ASSERT(ionCoreEnabled.size() == ionNames.size()) for(size_t ui=0;uigetStreamType() == STREAM_TYPE_PLOT) { //OK, is this the plot? //We should match the title we used to generate it PlotStreamData *p; p=(PlotStreamData*)filterOutputs[ui]; if(p->dataLabel.substr(strlen(SIZE_DIST_DATALABEL)) ==SIZE_DIST_DATALABEL ) { //Yup, this is it.kill the distribution std::swap(filterOutputs[ui],filterOutputs.back()); filterOutputs.pop_back(); //Now, note we DONT break //here; as there is more than one } } } } else { //OK, we don't have one and we would like one. // We have to compute this. Wipe cache and start over clearCache(); } needUpdate=true; } break; } case KEY_WANT_LOGSIZEDIST: { string stripped=stripWhite(value); if(!(stripped == "1"|| stripped == "0")) return false; bool lastVal=logClusterSize; logClusterSize=(stripped == "1"); //If the result is different //we need to alter the output if(lastVal!=logClusterSize) { //Scan through the cached output, and modify //the size distribution. Having to recalc this //just for a log/non-log change //is a real pain -- so lets be smart and avoid this! for(size_t ui=0;uigetStreamType() == STREAM_TYPE_PLOT) { //OK, is this the plot? //We should match the title we used to generate it PlotStreamData *p; p=(PlotStreamData*)filterOutputs[ui]; if(p->dataLabel ==SIZE_DIST_DATALABEL ) { //Yup, this is it. Set the log status //and finish up p->logarithmic=logClusterSize; break; } } } needUpdate=true; } break; } case KEY_WANT_COMPOSITIONDIST: { string stripped=stripWhite(value); if(!(stripped == "1"|| stripped == "0")) return false; bool lastVal=wantClusterComposition; wantClusterComposition=(stripped=="1"); //if the result is different, e //remove the filter elements we no longer want. if(lastVal!=wantClusterComposition) { //If we don't want the cluster composition //just kill it from the cache and request an update if(!wantClusterComposition) { for(size_t ui=filterOutputs.size();ui;) { ui--; if(filterOutputs[ui]->getStreamType() == STREAM_TYPE_PLOT) { //OK, is this the plot? //We should match the title we used to generate it PlotStreamData *p; p=(PlotStreamData*)filterOutputs[ui]; if(p->dataLabel.substr(0,strlen(CHEM_DIST_DATALABEL)) ==CHEM_DIST_DATALABEL ) { //Yup, this is it.kill the distribution std::swap(filterOutputs[ui],filterOutputs.back()); filterOutputs.pop_back(); //Now, note we DONT break //here; as there is more than one } } } } else { //OK, we don't have one and we would like one. // We have to compute this. Wipe cache and start over clearCache(); } needUpdate=true; } break; } case KEY_NORMALISE_COMPOSITION: { string stripped=stripWhite(value); if(!(stripped == "1"|| stripped == "0")) return false; bool lastVal=normaliseComposition; normaliseComposition=(stripped == "1"); //if the result is different, the //cache should be invalidated if(lastVal!=normaliseComposition) { needUpdate=true; clearCache(); } //composition analysis is mutually // exclusive with ID wantClusterID=false; break; } case KEY_CROP_SIZE: { if(!applyPropertyNow(wantCropSize,value,needUpdate)) return false; break; } case KEY_CROP_NMIN: { size_t ltmp; if(stream_cast(ltmp,value)) return false; if( ltmp > nMax) return false; nMin=ltmp; needUpdate=true; clearCache(); break; } case KEY_CROP_NMAX: { size_t ltmp; if(stream_cast(ltmp,value)) return false; if(ltmp == 0) ltmp = std::numeric_limits::max(); if( ltmp < nMin) return false; nMax=ltmp; needUpdate=true; clearCache(); break; } case KEY_WANT_CLUSTERMORPHOLOGY: { if(!applyPropertyNow(wantClusterMorphology,value,needUpdate)) return false; break; } case KEY_WANT_CLUSTERID: { if(!applyPropertyNow(wantClusterID,value,needUpdate)) return false; //composition & id are mutually exclusive wantClusterComposition=false; break; } case KEY_BULK_ALL: { ASSERT(enableBulkLink); bool bVal; boolStrDec(value,bVal); std::fill(ionBulkEnabled.begin(),ionBulkEnabled.end(),bVal); //we have to maintain the core selection, so that //both core and bulk are not set at the same time if(bVal) std::fill(ionCoreEnabled.begin(),ionCoreEnabled.end(),!bVal); break; } default: { ASSERT( key >=KEY_CORE_OFFSET); //Set value is dictated by getProperties routine //and is the vector push back value if(key =KEY_CORE_OFFSET) { bool b; if(stream_cast(b,value)) return false; //Core ions; convert key value to array offset key-=KEY_CORE_OFFSET; //no need to update if(ionCoreEnabled[key] == b) return false; ionCoreEnabled[key]=b; //Check if we need to also need to disable //ion bulk to preserve mutual exclusiveness. if(ionBulkEnabled[key] == b && b) ionBulkEnabled[key]=0; clearCache(); needUpdate=true; } else if(key >=KEY_BULK_OFFSET) { bool b; if(stream_cast(b,value)) return false; //Core ions; convert key value to array offset key-=KEY_BULK_OFFSET; //no need to update if(ionBulkEnabled[key] == b) return false; ionBulkEnabled[key]=b; //Check if we need to also need to disable //ion core to preserve mutual exclusiveness if(ionCoreEnabled[key] == b && b) ionCoreEnabled[key]=0; clearCache(); needUpdate=true; } else { ASSERT(false); } } } return true; } bool ClusterAnalysisFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<" << trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; //Core-linkage algorithm parameters f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; //Cropping control f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; //Postprocessing f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; writeIonsEnabledXML(f,"core",ionCoreEnabled,ionNames,depth+2); writeIonsEnabledXML(f,"bulk",ionBulkEnabled,ionNames,depth+2); f << tabs(depth+1) << "" << endl; f << tabs(depth) << "" << endl; break; } default: ASSERT(false); return false; } return true; } size_t ClusterAnalysisFilter::numBytesForCache(size_t nObjects) const { return (size_t)nObjects*IONDATA_SIZE; } bool ClusterAnalysisFilter::readState(xmlNodePtr &nodePtr, const std::string &packDir) { using std::string; //Retrieve user string //=== if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlChar *xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //=== //Retrieve algorithm //====== if(!XMLGetNextElemAttrib(nodePtr,algorithm,"algorithm","value")) return false; if(algorithm >=CLUSTER_ALGORITHM_ENUM_END) return false; //=== //Retrieve parameter distances //=== switch(algorithm) { case CLUSTER_LINK_ERODE: { if(!XMLGetNextElemAttrib(nodePtr,coreDist,"coredist","value")) return false; if(coreDist<0) return false; if(!XMLGetNextElemAttrib(nodePtr,coreKNN,"coringknn","value")) return false; if(!coreKNN) return false; if(!XMLHelpGetProp(enableCoreClassify,nodePtr,"enabled")) { //FIXME : Deprecate this check - previously the enabled setting was specfied by // setting a value of zero for the link distance enableCoreClassify=!(bulkLink == 0); } if(!XMLGetNextElemAttrib(nodePtr,linkDist,"linkdist","value")) return false; if(linkDist<=0) return false; if(!XMLGetNextElemAttrib(nodePtr,bulkLink,"bulklink","value")) return false; if(bulkLink<0) return false; if(!XMLHelpGetProp(enableBulkLink,nodePtr,"enabled")) { //FIXME : Deprecate this check - previously the enabled setting was specfied by // setting a value of zero for the link distance enableBulkLink=!(bulkLink == 0); } if(!XMLGetNextElemAttrib(nodePtr,dErosion,"derosion","value")) return false; if(dErosion<0) return false; if(!XMLHelpGetProp(enableErosion,nodePtr,"enabled")) { //FIXME : Deprecate this check - previously the enabled setting was specfied by // setting a value of zero for the link distance enableErosion=!(dErosion== 0); } break; } default: { ASSERT(false); return false; } } //=== //Retrieve cropping info //=== xmlNodePtr tmpPtr; tmpPtr=nodePtr; if(!XMLGetNextElemAttrib(nodePtr,wantCropSize,"wantcropsize","value")) return false; nodePtr=tmpPtr; if(!XMLGetNextElemAttrib(nodePtr,nMin,"nmin","value")) return false; nodePtr=tmpPtr; if(!XMLGetNextElemAttrib(nodePtr,nMax,"nmax","value")) return false; nodePtr=tmpPtr; if(!XMLGetNextElemAttrib(nodePtr,wantClusterSizeDist,"wantclustersizedist","value")) return false; nodePtr=tmpPtr; if(!XMLGetNextElemAttrib(nodePtr,logClusterSize,"wantclustersizedist","logarithmic")) return false; tmpPtr=nodePtr; if(!XMLGetNextElemAttrib(nodePtr,wantClusterComposition,"wantclustercomposition","value")) return false; nodePtr=tmpPtr; if(!XMLGetNextElemAttrib(nodePtr,normaliseComposition,"wantclustercomposition","normalise")) return false; nodePtr=tmpPtr; if(!XMLGetNextElemAttrib(nodePtr,wantClusterMorphology,"wantclustermorphology","value")) return false; nodePtr=tmpPtr; if(!XMLGetNextElemAttrib(nodePtr,wantClusterID,"wantclustermorphology","value")) { //COMPAT_BREAK: compat fix, 0.0.16. wantClusterID=false; } else { wantClusterComposition=false; } //=== //erase current enabled list. ionCoreEnabled.clear(); ionBulkEnabled.clear(); //Retrieve enabled selections if(XMLHelpFwdToElem(nodePtr,"enabledions")) return false; //Jump to ion sequence (/ level) nodePtr=nodePtr->xmlChildrenNode; if(XMLHelpFwdToElem(nodePtr,"core")) return false; //Jump to level tmpPtr=nodePtr->xmlChildrenNode; while(!XMLHelpFwdToElem(tmpPtr,"ion")) { int enabled; if(!XMLGetAttrib(tmpPtr,enabled,"enabled")) return false; std::string tmpName; if(!XMLGetAttrib(tmpPtr,tmpName,"name")) return false; ionCoreEnabled.push_back(enabled); ionNames.push_back(tmpName); } if(XMLHelpFwdToElem(nodePtr,"bulk")) return false; tmpPtr=nodePtr->xmlChildrenNode; while(!XMLHelpFwdToElem(tmpPtr,"ion")) { int enabled; if(!XMLGetAttrib(tmpPtr,enabled,"enabled")) return false; ionBulkEnabled.push_back(enabled); } //Enforce that core and bulk cannot be on at the same time // - Check for overlaps between core and bulk enabling, // then turn off bulk if both are enabled size_t minSize=std::min(ionBulkEnabled.size(),ionCoreEnabled.size()); for(size_t ui=0;ui &dataIn, std::vector< std::vector > &clusteredCore, std::vector > &clusteredBulk,ProgressData &progress) { //Clustering algorithm, as per //Stephenson, L. T.; et al //Microscopy and Microanalysis, 2007, 13, 448-463 // //See also //Vaumousse & Cerezo, //Ultramicroscopy 95 (2003) 215–22 //Basic steps. Optional steps are denoted with a * // //1*) Core classification; work only on core ions (bulk is ignored) // - Each "core" ion has sphere of specified size placed around it, // if ion's kth-NN is within a given radius, then it is used as // core, otherwise it is rejected to "bulk" // //2) Cluster Construction: A "backbone" is constructed using // the core ions (after classification). // - Each ion has a sphere placed around it of fixed size; if it contacts // another ion, then these are considered as part of the same cluster. // //3*) Bulk inclusion step // - For each cluster, every ion has a sphere placed around it. Bulk // ions that lie within this union of spheres are assigned to the cluster // This assignment is unambiguous *iff* this radius is smaller than that // for the cluster construction step // //4*) Bulk Erosion step // - Each unclustered bulk ion has a sphere placed around it. This sphere // strips out ions from the cluster. This is only done once (ie, not iterative) // requires the bulk inclusion step from (3). // // In the implementation, there are more steps, due to data structure construction // and other computational concerns bool needErosion=enableErosion && enableBulkLink; unsigned int numClusterSteps=4; if(enableBulkLink) numClusterSteps+=2; if(needErosion && enableBulkLink) numClusterSteps++; if(enableCoreClassify) numClusterSteps++; //Quick sanity check if(enableBulkLink) { //It is mildly dodgy to use a "bulk" distance larger than your core distance //with relative dodgyness, depending upon cluster number density. // //This is because bulk components can "bridge", and assignment to the core //clusters will depend upon the order in which the ions are traversed. //At this point we should warn the user that this is the case, and suggest to them //that we hope they know what they are doing. if(bulkLink > linkDist/2.0) { consoleOutput.push_back(""); consoleOutput.push_back(TRANS(" --------------------------- Parameter selection notice ------------- ") ); consoleOutput.push_back(TRANS("You have specified a bulk distance larger than half your link distance.") ); consoleOutput.push_back(TRANS("You can do this; thats OK, but the output is no longer independent of the computational process;") ); consoleOutput.push_back(TRANS("This will be a problem in the case where two or more clusters can equally lay claim to a \"bulk\" ion. ") ); consoleOutput.push_back(TRANS(" If your inter-cluster distance is sufficiently large (larger than your bulk linking distance), then you can get away with this.") ); consoleOutput.push_back(TRANS(" In theory it is possible to \"join\" the clusters, but this has not been implemented for speed reasons.")); consoleOutput.push_back(TRANS("If you want this, please contact the author, or just use the source to add this in yourself.") ); consoleOutput.push_back(TRANS("---------------------------------------------------------------------- ") ); consoleOutput.push_back(""); } } //Collate the ions into "core", and "bulk" ions, based upon our ranging data //---------- progress.step=1; progress.filterProgress=0; progress.stepName=TRANS("Collate"); progress.maxStep=numClusterSteps; if(*Filter::wantAbort) return FILTER_ERR_ABORT; vector coreIons,bulkIons; createRangedIons(dataIn,coreIons,bulkIons,progress); if(coreIons.empty()) return 0; //---------- K3DTreeMk2 coreTree,bulkTree; BoundCube bCore,bBulk; //Build the core KD & bulk trees //---------- progress.step++; progress.filterProgress=0; progress.stepName=TRANS("Build Core"); if(*Filter::wantAbort) return FILTER_ERR_ABORT; unsigned int errCode; errCode=buildKDTrees(coreIons,bulkIons,coreTree,bulkTree,progress); if(errCode) return errCode; coreTree.getBoundCube(bCore); if(enableBulkLink) bulkTree.getBoundCube(bBulk); //---------- //Step 2 in the Process : Cluster Construction //==== //Loop over the solutes in the material, //running searches from each solute. Group them using a queue //that keeps on adding newly found solutes until it can find no more //within a given radius. This becomes one cluster. //Update progress stuff progress.step++; progress.filterProgress=0; progress.stepName=TRANS("Core"); if(*Filter::wantAbort) return FILTER_ERR_ABORT; vector > allCoreClusters,allBulkClusters; //When this queue is exhausted, move to the next cluster for(size_t ui=0;ui soluteCluster,dummy; //Queue for atoms in this cluster waiting to be checked //for their NNs. std::queue thisClusterQueue; //This solute is already clustered. move along. if(coreTree.getTag(ui)) continue; coreTree.tag(ui); //If the atom is not clustered, use it as a point from //which we start a search thisClusterQueue.push(ui); soluteCluster.push_back(ui); //Keep looping throughe queue until it is exhausted do { //search atom's position curPt=thisClusterQueue.front(); //Find all the points in a sphere around this one vector nnIdxs; coreTree.ptsInSphere(*(coreTree.getPt(curPt)),linkDist,nnIdxs); //Loop over this solute's NNs for(size_t uj=0;uj 0 || nMax <(size_t)-1) && wantCropSize ) { for(size_t ui=0;ui nMax) { allCoreClusters.back().swap(allCoreClusters[ui]); allCoreClusters.pop_back(); } else ui++; } } #ifdef DEBUG size_t coreClusterBeforeCount=allCoreClusters.size(); #endif //Step 3 in the Process : Bulk inclusion : AKA envelope //==== //If there is no bulk link step, we don't need to do that., //or any of the following stages if(enableBulkLink) { //Update progress stuff progress.step++; progress.filterProgress=0; progress.stepName=TRANS("Bulk"); if(*Filter::wantAbort) return FILTER_ERR_ABORT; if(bulkTree.size()) { bulkTree.getBoundCube(bBulk); //So-called "envelope" step. size_t prog=PROGRESS_REDUCE; //Now do the same thing with the matrix, but use the clusters as the "seed" //positions for(size_t ui=0;ui thisBulkCluster,dummy; for(size_t uj=0;uj nnIdxs; bulkTree.ptsInSphere(*(coreTree.getPt(curIdx)),bulkLink,nnIdxs); //loop over the points we found for(unsigned int uj=0;ujsqrDist( *(coreTree.getPt(curIdx)))< bulkLink*bulkLink); if(bulkTree.getTag(bulkTreeIdx)) continue; //Record as part of the cluster thisBulkCluster.push_back(bulkTreeIdx); bulkTree.tag(bulkTreeIdx); } //Update progress data as needed if(prog <=nnIdxs.size()) { prog=PROGRESS_REDUCE; //Progress may be a little non-linear if cluster sizes are not random progress.filterProgress= (unsigned int)(((float)ui/(float)allCoreClusters.size())*100.0f); if(*Filter::wantAbort) return FILTER_ERR_ABORT; } else prog-=nnIdxs.size(); } allBulkClusters.push_back(dummy); allBulkClusters.back().swap(thisBulkCluster); thisBulkCluster.clear(); } } } //==== #ifdef DEBUG size_t bulkClusterBeforeCount=allBulkClusters.size(); #endif //Step 4 in the Process : Bulk erosion //==== //Check if we need the erosion step if(needErosion && enableBulkLink) { //Update progress stuff progress.step++; progress.filterProgress=0; progress.stepName=TRANS("Erode"); if(*Filter::wantAbort) return FILTER_ERR_ABORT; //Now perform the "erosion" step, where we strip off previously //tagged matrix, if it is within a given distance of some untagged //matrix size_t numCounted=0; bool spin=false; const float dErosionSqr=dErosion*dErosion; #pragma omp parallel for for(size_t ui=0;uisqrDist( *(bulkTree.getPt(nnId)) ); if( curDistSqr < dErosionSqr) { //Bulk is to be eroded. Swap it with the vector tail //and pop it into oblivion. std::swap(allBulkClusters[ui][uj], allBulkClusters[ui].back()); allBulkClusters[ui].pop_back(); //Purposely do NOT advance the iterator, as we have //new data at our current position (or we have hit end of //array) } else uj++; } else uj++; } if(!(ui%PROGRESS_REDUCE)) { #pragma omp critical { numCounted+=PROGRESS_REDUCE; //Progress may be a little non-linear if cluster sizes are not random progress.filterProgress= (unsigned int)(((float)numCounted/(float)allBulkClusters.size())*100.0f); if(*Filter::wantAbort) spin=true; } } } if(spin) return FILTER_ERR_ABORT; } //=== if(*Filter::wantAbort) return FILTER_ERR_ABORT; //update progress progress.step++; progress.filterProgress=0; progress.stepName=TRANS("Re-Collate"); clusteredCore.resize(allCoreClusters.size()); clusteredBulk.resize(allBulkClusters.size()); ASSERT(coreClusterBeforeCount == allCoreClusters.size()); //Must be equal, independant of erosion/bulk link steps ASSERT(bulkClusterBeforeCount >= allBulkClusters.size()); //Must be <= after (optional) erosion step //Use a no-barrier construct, to avoid the //flush wait in the middle #pragma omp parallel { #pragma omp for for(size_t ui=0;ui &coreIons, vector & bulkIons, K3DTreeMk2 &coreTree, K3DTreeMk2 &bulkTree, ProgressData &progress) const { coreTree.resetPts(coreIons,false); if(!coreTree.build()) return FILTER_ERR_ABORT; BoundCube bCore; coreTree.getBoundCube(bCore); if(enableCoreClassify) { //Perform Clustering Stage (1) : clustering classification // This modifies the trees, so we have to do it here. //== progress.step++; progress.filterProgress=0; progress.stepName=TRANS("Classify Core"); if(*Filter::wantAbort) return FILTER_ERR_ABORT; vector coreOK; ASSERT(coreIons.size() == coreTree.size()); coreOK.resize(coreTree.size()); float coreDistSqr=coreDist*coreDist; //TODO: the trees internal Tags prevent us from parallelising this. // :(. If we could pass a tag map to the tree, this would solve the problem for(size_t ui=0;ui tagsToClear; //Don't match ourselves -- to do this we must "tag" this tree node before we start p=coreTree.getPt(ui); coreTree.tag(ui); tagsToClear.push_back(ui); k=1; //Loop through this ions NNs, seeing if the kth NN is within a given radius do { pNN=coreTree.findNearestUntagged(*p,bCore,true); tagsToClear.push_back(pNN); k++; }while( pNN !=(size_t)-1 && ksqrDist(*(coreTree.getPt(pNN))); coreOK[coreTree.getOrigIndex(ui)] = nnSqrDist < coreDistSqr; } //reset the tags, so we can find near NNs coreTree.clearTags(tagsToClear); tagsToClear.clear(); progress.filterProgress= (unsigned int)(((float)ui/(float)coreTree.size())*100.0f); if(*Filter::wantAbort) return FILTER_ERR_ABORT; } for(size_t ui=coreOK.size();ui;) { ui--; if(!coreOK[ui]) { //We have to convert the core ion to a bulk ion //as it is rejected. bulkIons.push_back(coreIons[ui]); coreIons[ui]=coreIons.back(); coreIons.pop_back(); } } //Re-Build the core KD tree coreTree.resetPts(coreIons,false); if(!coreTree.build()) return FILTER_ERR_ABORT; //== } coreTree.getBoundCube(bCore); //---------- //Build the bulk tree (eg matrix ions.), as needed if(enableBulkLink) { progress.step++; progress.filterProgress=0; progress.stepName=TRANS("Build Bulk"); if(*Filter::wantAbort) return FILTER_ERR_ABORT; bulkTree.resetPts(bulkIons,false); if(!bulkTree.build()) return FILTER_ERR_ABORT; } return 0; } #ifdef DEBUG bool ClusterAnalysisFilter::paranoidDebugAssert( const std::vector > &core, const std::vector > &bulk) const { for(size_t ui=0;ui &dataIn,vector &core, vector &bulk, ProgressData &p) const { //TODO: Progress reporting and callback ASSERT(haveRangeParent); const RangeStreamData *r=0; for(size_t ui=0;uigetStreamType() == STREAM_TYPE_RANGE) { r = (const RangeStreamData *)dataIn[ui]; break; } } ASSERT(r); ASSERT(r->rangeFile->getNumIons() >=ionCoreEnabled.size()); ASSERT(r->rangeFile->getNumIons() >=ionBulkEnabled.size()); //Maps the ionID for ranges in the PARENT rangeStreamData, to //array offsets in the ionEnabled vectors. // For example if ions 1 2 and 4 are enabled in the PARENT // then this maps to offsets 1 2 and 3 in the ion(Core/Bulk)Enabled vectors map rangeEnabledMap; buildRangeEnabledMap(r,rangeEnabledMap); ASSERT(rangeEnabledMap.size() == ionCoreEnabled.size()); unsigned int numIonsRanged=0; if(enableBulkLink) { for(size_t ui=0;uigetStreamType() == STREAM_TYPE_IONS) { const IonStreamData *d; d=(const IonStreamData *)dataIn[ui]; #pragma omp parallel for for(size_t ui=0;uidata.size();ui++) { unsigned int ionId; ionId=r->rangeFile->getIonID(d->data[ui].getMassToCharge()); if(ionId!=(unsigned int)-1) { if( ionCoreEnabled[rangeEnabledMap[ionId]]) { #pragma omp critical core.push_back(d->data[ui]); } else if(ionBulkEnabled[rangeEnabledMap[ionId]]) //mutually exclusive with core (both cannot be true) { #pragma omp critical bulk.push_back(d->data[ui]); } } } numIonsRanged++; } } } else { #pragma omp parallel for for(size_t ui=0;uigetStreamType() == STREAM_TYPE_IONS) { const IonStreamData *d; d=(const IonStreamData *)dataIn[ui]; for(size_t ui=0;uidata.size();ui++) { unsigned int ionId; ionId=r->rangeFile->getIonID(d->data[ui].getMassToCharge()); if(ionId!=(unsigned int)-1 && ionCoreEnabled[rangeEnabledMap[ionId]]) { #pragma omp critical core.push_back(d->data[ui]); } numIonsRanged++; } } } } } PlotStreamData* ClusterAnalysisFilter::clusterSizeDistribution(const vector > &core, const vector > &bulk) const { //each cluster is represented by one entry in core and bulk ASSERT(bulk.size() == core.size() || bulk.empty()); //Map that maps input number to frequency map countMap; size_t maxSize=0; if(bulk.size()) { ASSERT(bulk.size() == core.size()); for(size_t ui=0;uiparent=this; dist->r=1; dist->g=0; dist->b=0; dist->xLabel=TRANS("Cluster Size"); dist->yLabel=TRANS("Frequency"); dist->dataLabel=SIZE_DIST_DATALABEL; dist->logarithmic=logClusterSize; dist->plotStyle=PLOT_LINE_STEM; dist->plotMode=PLOT_MODE_1D; dist->xyData.resize(countMap.size()); std::copy(countMap.begin(),countMap.end(),dist->xyData.begin()); return dist; } bool ClusterAnalysisFilter::stripClusterBySize(vector > &clusteredCore, vector > &clusteredBulk, bool countBulk, ProgressData &progress) const { //TODO: Parallelise? Could create a vector of bools and then // spin through, find the ones we want to kill, then do a cull. // Progress reporting would be a bit more difficult. if(clusteredBulk.size()) { //should be the same numbers of bulk as core ASSERT(clusteredBulk.size() == clusteredCore.size()); for(size_t ui=clusteredCore.size();ui;) { ui--; //Count both bulk and core, and operate on both. size_t count; if(countBulk) count =clusteredCore[ui].size() + clusteredBulk[ui].size() ; else count =clusteredCore[ui].size(); if(count < nMin || count > nMax) { clusteredCore[ui].swap(clusteredCore.back()); clusteredCore.pop_back(); clusteredBulk[ui].swap(clusteredBulk.back()); clusteredBulk.pop_back(); } progress.filterProgress= (unsigned int)(((float)ui/(float)clusteredCore.size()+1)*100.0f); if(*Filter::wantAbort) return FILTER_ERR_ABORT; } } else { //OK, we haven't any bulk, but we just want to count core; //but operate on both for(size_t ui=clusteredCore.size();ui;) { ui--; if(clusteredCore[ui].size() < nMin || clusteredCore[ui].size() > nMax) { clusteredCore[ui].swap(clusteredCore.back()); clusteredCore.pop_back(); } progress.filterProgress= (unsigned int)(((float)ui/(float)clusteredCore.size()+1)*100.0f); if(*Filter::wantAbort) return FILTER_ERR_ABORT; } } return true; } void ClusterAnalysisFilter::genCompositionVersusSize(const vector > &clusteredCore, const vector > &clusteredBulk, const RangeFile *rng,vector &plots) const { ASSERT(rng && haveRangeParent) //Frequency of ions, as a function of composition. //The inner vector is the the array of frequencies //for this particular sie for each ion (ie, the array is of size rng->getNumIons) map > countMap; bool needCountBulk=clusteredBulk.size(); vector ionFreq; ionFreq.resize(rng->getNumIons(),0); //Create the frequency table, per ion //------- //TODO: Below, there is a multi-threaded version. When we are happy with the single-threaded code // try implementing the multi-threaded routine. //Count the cluster elements, then increment the frequency table if(needCountBulk) { ASSERT(clusteredBulk.size() == clusteredCore.size()); //Create entries of zero vectors for ion counting for(size_t ui=0;uigetIonID(clusteredCore[ui][uj].getMassToCharge()); countMap[curSize][offset]++; } for(size_t uj=0;ujgetIonID(clusteredBulk[ui][uj].getMassToCharge()); countMap[curSize][offset]++; } } } else { //Create entries of zero vectors for ion counting for(size_t ui=0;uigetIonID(clusteredCore[ui][uj].getMassToCharge()); //this should not happen, as to cluster the ion,it must be ranged ASSERT(offset!=(size_t)-1); countMap[curSize][offset]++; } } } //------- //Now that we have the freq table; we need to discard any elements that are not //completely empty across the map. // // A vector that tells us if a given ionID is zero for all map entries. I.e. not in cluster vector isZero; isZero.resize(rng->getNumIons(),true); for(map >::iterator it=countMap.begin(); it!=countMap.end();++it) { for(size_t ui=0;uisecond.size();ui++) { if(it->second[ui]) isZero[ui]=false; } } //Ok now we know which frequency values are non-zero. Good! // We need to build the plots, and their respective XY data, // also we should normalise the compositions (if needed). plots.reserve(rng->getNumIons()); for(size_t ui=0;uigetNumIons();ui++) { //we don't need to plot this, //as we didn't have any clustered ions of this type if(isZero[ui]) continue; //Make a new plot PlotStreamData *p; p=new PlotStreamData; p->parent=this; p->plotMode=PLOT_MODE_1D; RGBf ionColour; ionColour=rng->getColour(ui); //Colour it as per the range file p->r=ionColour.red; p->g=ionColour.green; p->b=ionColour.blue; p->xLabel=TRANS("Cluster Size"); if(normaliseComposition) p->yLabel=TRANS("Composition"); else p->yLabel=TRANS("Frequency"); p->dataLabel=string(CHEM_DIST_DATALABEL) + string(":") + rng->getName(ui); p->logarithmic=logClusterSize && !normaliseComposition; p->plotStyle=PLOT_LINE_STEM; p->xyData.resize(countMap.size()); size_t offset; offset=0; //set the data from our particular ion for(map > ::iterator it=countMap.begin();it!=countMap.end();++it) { p->xyData[offset].first=it->first; p->xyData[offset].second=it->second[ui]; //if we need to normalise compositions, we have to normalise over all //ion types for this cluster size (ie the sum of this vector) if(normaliseComposition) { size_t sum=0; for(size_t uk=0; uksecond.size();uk++) sum+=it->second[uk]; p->xyData[offset].second /=(float)sum; } offset++; } plots.push_back(p); } } //Sudbrack, C. : Decomposition behavior in model Ni-Al-Cr-X superalloys: // temporal evolution and compositional pathways on a nanoscale (Ph.D. Thesis, 2004) //http://arc.nucapt.northwestern.edu/refbase/files/Sudbrack_Ph.D._thesis_2004_6MB.pdf //============ //un-normalised deviation matrix summation (L, equation A1.1) void computeMatrixEntries(const vector &atoms,const Point3D &clusterCentre, gsl_matrix *m) { //TODO: ASsert matrix is 3x3 //Fill the data array with deviation vectors for(size_t ui=0;ui[y,z]; similarly, {x,z}, {x,y} b= (uj+2)%3; float v1,v2,vRes; v1 = delta[a]; v2 = delta[b]; vRes=v1*v1+v2*v2; float v; v=gsl_matrix_get(m,uj,uj); v+=vRes; gsl_matrix_set(m,uj,uj,v); } //compute off-diagonal terms. Note matrix is symmetric, // so we only need to compute xy,xz and yz // Written equation in sudbrack thesis is incorrect, and mixes distance^4 and // distance^2 float v; //xy v= gsl_matrix_get(m,0,1); v-=delta[0]*delta[1]; gsl_matrix_set(m,0,1,v); //xz v= gsl_matrix_get(m,0,2); v-=delta[0]*delta[2]; gsl_matrix_set(m,0,2,v); //yz v= gsl_matrix_get(m,1,2); v-=delta[1]*delta[2]; gsl_matrix_set(m,1,2,v); } //Mirror the off-diagonal terms float v; //yx v= gsl_matrix_get(m,0,1); gsl_matrix_set(m,1,0,v); //zx v= gsl_matrix_get(m,0,2); gsl_matrix_set(m,2,0,v); //zy v= gsl_matrix_get(m,1,2); gsl_matrix_set(m,2,1,v); } // NOTE: This is not the enclosing ellipse. For that, see: // Nima Moshtagh - "MINIMUM VOLUME ENCLOSING ELLIPSOIDS", U.Penn. // 10.1.1.116.7691. void ClusterAnalysisFilter::getEllipsoidalFit(const vector &coreAtoms, const vector &bulkAtoms, std::pair< Point3D, vector > &ellipseData) { gsl_matrix *m = gsl_matrix_alloc(3,3); gsl_matrix_set_zero(m); Point3D clusterCentre; if(bulkAtoms.size()) { //Compute the cluster's centre of mass (assuming unit mass per object) //--- Point3D centroid[2]; IonHit::getCentroid(coreAtoms,centroid[0]); IonHit::getCentroid(bulkAtoms,centroid[1]); //compute overall centroid float coreFactor,bulkFactor; coreFactor = coreAtoms.size()/(float)(coreAtoms.size() + bulkAtoms.size()); bulkFactor = bulkAtoms.size()/(float)(coreAtoms.size() + bulkAtoms.size()); clusterCentre= centroid[0]*coreFactor + centroid[1]*bulkFactor; //--- //compute the components of the distance deviation matrix computeMatrixEntries(coreAtoms,clusterCentre,m); computeMatrixEntries(bulkAtoms,clusterCentre,m); } else { IonHit::getCentroid(coreAtoms,clusterCentre); computeMatrixEntries(coreAtoms,clusterCentre,m); } //normalise matrix entries gsl_matrix_scale(m,1.0/(double)(coreAtoms.size() + bulkAtoms.size())); //std::cerr << "Fit matrix is :" << std::endl; //gslPrint(m); //compute SVD to obtain eigenvalues vector vals; vector pts; computeEigenValues(m,3,3,vals,pts); gsl_matrix_free(m); //Convert eigenvalues to their positive form //Check that the values are sorted in *descending* order (e1 >=e2 >=e3) ASSERT(vals[0] >=vals[1] && vals[1]>=vals[2]); //Convert to semi-axes of ellipse ellipseData.second.resize(3,Point3D(0,0,0)); float semiAxes[3]; for(size_t ui=0;ui<3;ui++) { unsigned int a,b,c; a=ui; b=(ui+1)%3; c=(ui+2)%3; if(vals[b] + vals[c] > vals[a]) { //sudbrack's example code does something different to the equations, and multiples by 2, // perhaps obtaining full diameter axis, rather than semi. semiAxes[ui]=sqrt(5.0/2.0*(vals[b] + vals[c] - vals[a])); } else { WARN(true,"Imaginary semi axis value - zeroing"); semiAxes[ui] =0; } } for(unsigned int ui=0;ui<3;ui++) { pts[ui]*=semiAxes[ui]; } ellipseData.first=clusterCentre; ellipseData.second.swap(pts); } //============ #ifdef DEBUG #include using std::auto_ptr; //Cluster Ids for generating cluster test datasets with genCluster enum { CLUSTER_UNITTEST_ISOLATED_WITH_BULK, CLUSTER_UNITTEST_ISOLATED, CLUSTER_UNITTEST_END }; //Cluster sizes generated by genCluster const unsigned int CLUSTER_SIZES[]= { 15, 9}; //Create a synthetic dataset of points for cluster IonStreamData *genCluster(unsigned int datasetID); //Test several isolated clusters bool isolatedClusterTest(); //Test the core mode of the core-link clustering algorithm bool coreClusterTest(); //Unit tests bool ClusterAnalysisFilter::runUnitTests() { if(!isolatedClusterTest()) return false; if(!coreClusterTest()) return false; if(!singularValueTest()) return false; return true; } IonStreamData *genCluster(unsigned int id) { IonStreamData*d = new IonStreamData; d->parent=0; IonHit a; switch(id) { case CLUSTER_UNITTEST_ISOLATED_WITH_BULK: { //Create a "cloud" of bulk, isolated from the // particle a.setMassToCharge(1); a.setPos(Point3D(2,2,4)); d->data.push_back(a); a.setPos(Point3D(4,0,1)); d->data.push_back(a); a.setPos(Point3D(-3,1,1)); d->data.push_back(a); a.setPos(Point3D(-2,1,2)); d->data.push_back(a); a.setPos(Point3D(-2,-1,2)); d->data.push_back(a); a.setPos(Point3D(-2,1,-2)); d->data.push_back(a); //Fall through; add in the core //from the other test } case CLUSTER_UNITTEST_ISOLATED: { a.setMassToCharge(1); //Create a little network of points //each at most 1 //unit distance from another a.setPos(Point3D(0,0,0)); d->data.push_back(a); a.setPos(Point3D(0,0,1)); d->data.push_back(a); a.setPos(Point3D(0,1,1)); d->data.push_back(a); a.setPos(Point3D(0,1,2)); d->data.push_back(a); a.setPos(Point3D(1,1,2)); d->data.push_back(a); a.setPos(Point3D(2,1,2)); d->data.push_back(a); a.setPos(Point3D(2,1,1)); d->data.push_back(a); a.setPos(Point3D(2,1,0)); d->data.push_back(a); a.setPos(Point3D(2,2,0)); d->data.push_back(a); break; } default: ASSERT(false); } ASSERT(CLUSTER_SIZES[id] == d->data.size()); ASSERT(d->data.size()); return d; } IonStreamData *genCoreTestCluster() { IonStreamData* d = new IonStreamData; d->parent=0; IonHit a; a.setMassToCharge(1); //Create two small groupings of points, //with one group of 3 linked by unit distance // then a second group of two further away // unit distance apart, // with one in between, spaced evenly between the two a.setPos(Point3D(0,0,0)); d->data.push_back(a); a.setPos(Point3D(0,1,0)); d->data.push_back(a); a.setPos(Point3D(1,0,0)); d->data.push_back(a); a.setPos(Point3D(0,0,2)); d->data.push_back(a); a.setPos(Point3D(0,0,4)); d->data.push_back(a); a.setPos(Point3D(0,-1,4)); d->data.push_back(a); return d; } //Test the "core-link + erode" algorithm // - no core classification // bool isolatedClusterTest() { //Build some points to pass to the filter vector streamIn,streamOut; //Create a range file with two //range datasets, A and B RangeFile r; RGBf filler; filler.red=filler.green=filler.blue=0.5f; unsigned int ionA,ionB; std::string shortName,longName; shortName="A"; longName="AType"; ionA=r.addIon(shortName,longName,filler); shortName="B"; longName="BType"; ionB=r.addIon(shortName,longName,filler); r.addRange(0.5,1.5,ionA); r.addRange(1.5,2.5,ionB); //Build a rangestream data RangeStreamData *rng = new RangeStreamData; rng->rangeFile=&r; rng->parent=0; rng->enabledIons.resize(r.getNumIons(),1); rng->enabledRanges.resize(r.getNumRanges(),1); //Create a cluster analysis filter ClusterAnalysisFilter *f=new ClusterAnalysisFilter; f->setCaching(false); f->wantParanoidDebug=true; streamIn.push_back(rng); f->initFilter(streamIn,streamOut); streamOut.clear(); //Enable A as core, and B as bulk bool needUp; TEST(f->setProperty(KEY_CORE_OFFSET,"1",needUp),"Set prop"); TEST(f->setProperty(KEY_CORECLASSIFYDIST,"0",needUp),"Set prop"); TEST(f->setProperty(KEY_LINKDIST,"1.1",needUp),"Set prop"); TEST(f->setProperty(KEY_BULKLINK,"1.1",needUp),"Set prop"); TEST(f->setProperty(KEY_ERODEDIST,"0",needUp),"Set prop"); //stop the plots TEST(f->setProperty(KEY_WANT_CLUSTERSIZEDIST,"0",needUp),"Set prop"); TEST(f->setProperty(KEY_WANT_COMPOSITIONDIST,"0",needUp),"Set prop"); for(unsigned int ui=0;uirefresh(streamIn,streamOut,p)),"Refresh err code"); //Kill the input ion stream, and remove old pointer delete d; streamIn.pop_back(); TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); //Use an auto_ptr so if the test fails, we still free ram { auto_ptr outD((const IonStreamData*)streamOut[0]); TEST(outD->data.size() == CLUSTER_SIZES[ui],"Cluster size"); switch(ui) { case CLUSTER_UNITTEST_ISOLATED: { for(unsigned int ui=0;uidata.size();ui++) { TEST(r.getIonID(outD->data[ui].getMassToCharge()) == ionA,"cluster ranging"); } break; } case CLUSTER_UNITTEST_ISOLATED_WITH_BULK: { //Check bulk contains bulk or core for(unsigned int ui=0;uidata.size();ui++) { unsigned int idIon; idIon=r.getIonID(outD->data[ui].getMassToCharge()); TEST( idIon== ionB || idIon == ionA,"cluster ranging "); } break; } default: ASSERT(false); } } streamOut.clear(); } delete rng; delete f; return true; } bool coreClusterTest() { //Build some points to pass to the filter vector streamIn,streamOut; //Create a range file with two //range datasets, A and B RangeFile r; RGBf filler; filler.red=filler.green=filler.blue=0.5f; unsigned int ionA,ionB; std::string shortName,longName; shortName="A"; longName="AType"; ionA=r.addIon(shortName,longName,filler); shortName="B"; longName="BType"; ionB=r.addIon(shortName,longName,filler); r.addRange(0.5,1.5,ionA); r.addRange(1.5,2.5,ionB); //Build a rangestream data RangeStreamData *rng = new RangeStreamData; rng->rangeFile=&r; rng->parent=0; rng->enabledIons.resize(r.getNumIons(),1); rng->enabledRanges.resize(r.getNumRanges(),1); //Create a cluster analysis filter ClusterAnalysisFilter *f=new ClusterAnalysisFilter; f->setCaching(false); f->wantParanoidDebug=true; streamIn.push_back(rng); f->initFilter(streamIn,streamOut); streamOut.clear(); //Enable A as core bool needUp; TEST(f->setProperty(KEY_CORE_OFFSET,"1",needUp),"Set core range"); TEST(f->setProperty(KEY_CORECLASSIFY_ENABLE,"1",needUp),"Enable core-classification"); TEST(f->setProperty(KEY_CORECLASSIFYDIST,"1.1",needUp),"Set core classification dist"); TEST(f->setProperty(KEY_CORECLASSIFYKNN,"1",needUp),"Set core classfication kNN"); TEST(f->setProperty(KEY_LINKDIST,"2.0",needUp),"set link distance"); TEST(f->setProperty(KEY_BULKLINK,"0",needUp),"set bulk distance"); TEST(f->setProperty(KEY_ERODEDIST,"0",needUp),"set erode distance"); //stop the plots TEST(f->setProperty(KEY_WANT_CLUSTERSIZEDIST,"0",needUp),"Set prop"); TEST(f->setProperty(KEY_WANT_COMPOSITIONDIST,"0",needUp),"Set prop"); IonStreamData *ionData = genCoreTestCluster(); streamIn.push_back(ionData); //Do the refresh ProgressData p; TEST(!(f->refresh(streamIn,streamOut,p)),"Refresh err code"); delete f; delete ionData; delete rng; TEST(streamOut.size() == 1,"stream count"); const IonStreamData *outD=(const IonStreamData*)streamOut[0];; TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); TEST(outD->data.size() == 5,"Total Cluster size"); delete outD; return true; } bool ClusterAnalysisFilter::singularValueTest() { gsl_matrix *m = gsl_matrix_alloc(3,3); gsl_matrix_set(m,0,0,1); gsl_matrix_set(m,0,1,3); gsl_matrix_set(m,0,2,0); gsl_matrix_set(m,1,0,3); gsl_matrix_set(m,1,1,-3); gsl_matrix_set(m,1,2,2); gsl_matrix_set(m,2,0,0); gsl_matrix_set(m,2,1,2); gsl_matrix_set(m,2,2,3); vector vals; vector pts; computeEigenValues(m,3,3,vals,pts); gsl_matrix_free(m); TEST(vals.size() == pts.size(),"Vector sizes"); TEST(vals.size() == 3,"vector size"); //check eigen values, sorted in desc. order TEST(EQ_TOL(vals[0] ,4.0) ,"Correct eigen value"); TEST(EQ_TOL(vals[1] ,2.0) ,"Correct eigen value"); TEST(EQ_TOL(vals[2] ,-5.000),"Correct eigen value"); pts.clear(); //check the matrix makes sense vector ionVec; ionVec.push_back(IonHit(Point3D(0,0,1),1)); ionVec.push_back(IonHit(Point3D(0,0,-1),1)); ionVec.push_back(IonHit(Point3D(1,0,0),1)); ionVec.push_back(IonHit(Point3D(-1,0,0),1)); ionVec.push_back(IonHit(Point3D(0,1,0),1)); ionVec.push_back(IonHit(Point3D(0,-1,0),1)); m = gsl_matrix_alloc(3,3); gsl_matrix_set_zero(m); computeMatrixEntries(ionVec,Point3D(0,0,0),m); //gslPrint(m); gsl_matrix_free(m); { vector dummy; pair > resultEllipse; getEllipsoidalFit(ionVec,dummy, resultEllipse); for(size_t ui=0;ui-0.51); } //generate some random points, then check for inside ellipse p = Point3D(2.0*SEMI_AXIS[0]*f[0], 2.0*SEMI_AXIS[1]*f[1], 2.0*SEMI_AXIS[2]*f[2]); //check if the pt is outside the ellipsoid Point3D ellipsePt; for(size_t ui=0;ui<3;ui++) ellipsePt[ui]=p[ui]/SEMI_AXIS[ui]; if( ellipsePt.sqrMag() < 1.0f) ionVec.push_back(IonHit(p,1.0)); } IonHit::makePos(ionVec,"test-ellipsoid.pos"); //Run the ellipsoidal fit. This will crash if any NaNs or imag. values // are generated. vector dummy; pair > resultEllipse; getEllipsoidalFit(ionVec,dummy, resultEllipse); for(size_t ui=0;ui<3;ui++) { TEST(fabs(sqrtf(resultEllipse.second[ui].sqrMag()) -SEMI_AXIS[ui]) < 0.25f,"Semi axes retrieval"); } return true; } #endif 3Depict-0.0.19/src/backend/filters/spatialAnalysis.cpp0000644000175000017500000034414412716174467022204 0ustar pcuserpcuser/* * spatialAnalysis.cpp - Perform various data analysis on 3D point clouds * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "spatialAnalysis.h" #include "algorithms/rdf.h" #include "geometryHelpers.h" #include "filterCommon.h" #include "algorithms/binomial.h" #include "algorithms/K3DTree-mk2.h" #include "backend/plot.h" #include "../APT/APTFileIO.h" using std::vector; using std::set; using std::string; using std::pair; using std::make_pair; using std::map; using std::list; enum { KEY_STOPMODE, KEY_ALGORITHM, KEY_DISTMAX, KEY_NNMAX, KEY_NNMAX_NORMALISE, KEY_NNMAX_SHOWRANDOM, KEY_NUMBINS, KEY_REMOVAL, KEY_REDUCTIONDIST, KEY_RETAIN_UPPER, KEY_CUTOFF, KEY_COLOUR, KEY_ENABLE_SOURCE_ALL, KEY_ENABLE_TARGET_ALL, KEY_ENABLE_NUMERATOR_ALL, KEY_ENABLE_DENOMINATOR_ALL, KEY_ORIGIN, KEY_NORMAL, KEY_RADIUS, KEY_NUMIONS, KEY_SHOW_BINOM_FREQ, KEY_SHOW_BINOM_NORM_FREQ, KEY_SHOW_BINOM_THEOR_FREQ, KEY_SHOW_BINOM_3D_GRID, KEY_BINOMIAL_MAX_ASPECT, KEY_BINOMIAL_EXTRUDE_DIR, KEY_REPLACE_FILE, KEY_REPLACE_TOLERANCE, KEY_REPLACE_ALGORITHM, KEY_REPLACE_VALUE, }; enum { KEYTYPE_ENABLE_SOURCE=1, KEYTYPE_ENABLE_TARGET, KEYTYPE_ENABLE_NUMERATOR, KEYTYPE_ENABLE_DENOMINATOR, }; enum { ALGORITHM_DENSITY, //Local density analysis ALGORITHM_DENSITY_FILTER, //Local density filtering ALGORITHM_RDF, //Radial Distribution Function ALGORITHM_AXIAL_DF, //Axial Distribution Function (aka atomvicinity, sdm, 1D rdf) ALGORITHM_BINOMIAL, //Binomial block method for statistical randomness testing ALGORITHM_REPLACE, //Remove, set or modify points using an external file ALGORITHM_LOCAL_CONCENTRATION, //Obtain a local concentration plot, as described by Hyde and Marquis (TODO : REF) ALGORITHM_ENUM_END, }; enum{ STOP_MODE_NEIGHBOUR, STOP_MODE_RADIUS, STOP_MODE_ENUM_END }; enum { REPLACE_MODE_SUBTRACT, REPLACE_MODE_INTERSECT, REPLACE_MODE_UNION, REPLACE_MODE_ENUM_END }; //!Error codes enum { ERR_ABORT_FAIL=1, ERR_BINOMIAL_NO_MEM, ERR_NO_RANGE, ERR_BINOMIAL_BIN_FAIL, INSUFFICIENT_SIZE_ERR, ERR_FILE_READ_FAIL, SPAT_ERR_END_OF_ENUM, }; // == NN analysis filter == //User visible names for the different algorithms const char *SPATIAL_ALGORITHMS[] = { NTRANS("Local Density"), NTRANS("Density Filtering"), NTRANS("Radial Distribution"), NTRANS("Axial Distribution"), NTRANS("Binomial Distribution"), NTRANS("Point Em/Replacement"), NTRANS("Local Concentration"), }; const char *STOP_MODES[] = { NTRANS("Neighbour Count"), NTRANS("Radius") }; //User viisble names for the replace sub-algorithms const char *REPLACE_ALGORITHMS[] = { "Subtract", "Intersect", "Union", }; //Switch to determine if algorithms need range propagation or not const bool WANT_RANGE_PROPAGATION[] = { false, true, false, false, false, true, false, }; //Default distance to use when performing axial distance computations const float DEFAULT_AXIAL_DISTANCE = 1.0f; const float DISTANCE_EPSILON=sqrt(std::numeric_limits::epsilon()); //Helper function for computing a weighted mean float weightedMean(const vector &x, const vector &y,bool zeroOutSingularity=true) { ASSERT(x.size() == y.size()); float num=0,denom=0; for(size_t ui=0;ui::epsilon()) return 0; } ASSERT(denom); return num/denom; } //Scan input datastreams to build two point vectors, // one of those with points specified as "target" // which is a copy of the input points //Returns 0 on no error, otherwise nonzero template size_t buildSplitPoints(const vector &dataIn, ProgressData &progress, size_t totalDataSize, const RangeFile *rngF, const vector &pSourceEnabled, const vector &pTargetEnabled, vector &pSource, vector &pTarget ) { size_t sizeNeeded[2]; sizeNeeded[0]=sizeNeeded[1]=0; //Presize arrays for(unsigned int ui=0; uigetStreamType()) { case STREAM_TYPE_IONS: { unsigned int ionID; const IonStreamData *d; d=((const IonStreamData *)dataIn[ui]); ionID=getIonstreamIonID(d,rngF); if(ionID == (unsigned int)-1) { //we have ungrouped ions, so work out size individually for(unsigned int uj=0;ujdata.size();uj++) { ionID = rngF->getIonID(d->data[uj].getMassToCharge()); if(ionID == (unsigned int)-1) continue; if(pSourceEnabled[ionID]) sizeNeeded[0]++; if(pTargetEnabled[ionID]) sizeNeeded[1]++; } break; } if(pSourceEnabled[ionID]) sizeNeeded[0]+=d->data.size(); if(pTargetEnabled[ionID]) sizeNeeded[1]+=d->data.size(); break; } default: break; } } pSource.resize(sizeNeeded[0]); pTarget.resize(sizeNeeded[1]); //Fill arrays size_t curPos[2]; curPos[0]=curPos[1]=0; for(unsigned int ui=0; uigetStreamType()) { case STREAM_TYPE_IONS: { unsigned int ionID; const IonStreamData *d; d=((const IonStreamData *)dataIn[ui]); ionID=getIonstreamIonID(d,rngF); if(ionID==(unsigned int)(-1)) { //we have ungrouped ions, so work out size individually for(unsigned int uj=0;ujdata.size();uj++) { ionID = rngF->getIonID(d->data[uj].getMassToCharge()); if(ionID == (unsigned int)-1) continue; if(pSourceEnabled[ionID]) { assignIonData(pSource[curPos[0]],d->data[uj]); curPos[0]++; } if(pTargetEnabled[ionID]) { assignIonData(pTarget[curPos[1]],d->data[uj]); curPos[1]++; } } break; } unsigned int dummyProgress=0; if(pSourceEnabled[ionID]) { if(extendDataVector(pSource,d->data, dummyProgress,curPos[0])) return ERR_ABORT_FAIL; curPos[0]+=d->data.size(); } if(pTargetEnabled[ionID]) { if(extendDataVector(pTarget,d->data, dummyProgress,curPos[1])) return ERR_ABORT_FAIL; curPos[1]+=d->data.size(); } break; } default: break; } } return 0; } SpatialAnalysisFilter::SpatialAnalysisFilter() { COMPILE_ASSERT(THREEDEP_ARRAYSIZE(STOP_MODES) == STOP_MODE_ENUM_END); COMPILE_ASSERT(THREEDEP_ARRAYSIZE(SPATIAL_ALGORITHMS) == ALGORITHM_ENUM_END); COMPILE_ASSERT(THREEDEP_ARRAYSIZE(WANT_RANGE_PROPAGATION) == ALGORITHM_ENUM_END); COMPILE_ASSERT(THREEDEP_ARRAYSIZE(REPLACE_ALGORITHMS) == REPLACE_MODE_ENUM_END); algorithm=ALGORITHM_DENSITY; nnMax=1; distMax=1; stopMode=STOP_MODE_NEIGHBOUR; haveRangeParent=false; //Default colour is red rgba=ColourRGBAf(1.0f,0,0); //RDF params numBins=100; excludeSurface=false; reductionDistance=distMax; normaliseNNHist=true; //Density filtering params densityCutoff=1.0f; keepDensityUpper=true; wantRandomNNHist=true; //Binomial parameters //-- numIonsSegment = 200; showBinomialFrequencies=true; showNormalisedBinomialFrequencies=true; showTheoreticFrequencies=true; extrusionDirection=0; maxBlockAspect=2; showGridOverlay=true; //-- //replace tolerance replaceTolerance=sqrtf(std::numeric_limits::epsilon()); replaceMode=REPLACE_MODE_SUBTRACT; replaceMass=true; cacheOK=false; cache=true; //By default, we should cache, but decision is made higher up } Filter *SpatialAnalysisFilter::cloneUncached() const { SpatialAnalysisFilter *p=new SpatialAnalysisFilter; p->rgba=rgba; p->algorithm=algorithm; p->stopMode=stopMode; p->nnMax=nnMax; p->distMax=distMax; p->numBins=numBins; p->excludeSurface=excludeSurface; p->reductionDistance=reductionDistance; p->normaliseNNHist = normaliseNNHist; p->wantRandomNNHist=wantRandomNNHist; p->keepDensityUpper=keepDensityUpper; p->densityCutoff=densityCutoff; p->numIonsSegment=numIonsSegment; p->maxBlockAspect=maxBlockAspect; p->binWidth=binWidth; p->extrusionDirection=extrusionDirection; p->showBinomialFrequencies=showBinomialFrequencies; p->showNormalisedBinomialFrequencies=showNormalisedBinomialFrequencies; p->showTheoreticFrequencies=showTheoreticFrequencies; p->showGridOverlay=showGridOverlay; p->replaceFile=replaceFile; p->replaceMode=replaceMode; p->replaceTolerance=replaceTolerance; p->replaceMass=replaceMass; //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->userString=userString; p->vectorParams=vectorParams; p->scalarParams=scalarParams; p->ionSourceEnabled=ionSourceEnabled; p->ionTargetEnabled=ionTargetEnabled; p->ionNumeratorEnabled=ionNumeratorEnabled; p->ionDenominatorEnabled=ionDenominatorEnabled; return p; } size_t SpatialAnalysisFilter::numBytesForCache(size_t nObjects) const { return nObjects*IONDATA_SIZE; } void SpatialAnalysisFilter::initFilter(const std::vector &dataIn, std::vector &dataOut) { //Check for range file parent for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_RANGE) { const RangeStreamData *r; r = (const RangeStreamData *)dataIn[ui]; if(WANT_RANGE_PROPAGATION[algorithm]) dataOut.push_back(dataIn[ui]); bool different=false; if(!haveRangeParent) { //well, things have changed, we didn't have a //range parent before. different=true; } else { //OK, last time we had a range parent. Check to see //if the ion names are the same. If they are, keep the //current bools, iff the ion names are all the same unsigned int numEnabled=std::count(r->enabledIons.begin(), r->enabledIons.end(),1); if(ionNames.size() == numEnabled) { unsigned int pos=0; for(unsigned int uj=0;ujrangeFile->getNumIons();uj++) { //Only look at parent-enabled ranges if(r->enabledIons[uj]) { if(r->rangeFile->getName(uj) != ionNames[pos]) { different=true; break; } pos++; } } } else different=true; } haveRangeParent=true; if(different) { //OK, its different. we will have to re-assign, //but only allow the ranges enabled in the parent filter ionNames.clear(); ionNames.reserve(r->rangeFile->getNumRanges()); for(unsigned int uj=0;ujrangeFile->getNumIons();uj++) { if(r->enabledIons[uj]) ionNames.push_back(r->rangeFile->getName(uj)); } ionSourceEnabled.resize(ionNames.size(),true); ionTargetEnabled.resize(ionNames.size(),true); ionNumeratorEnabled.resize(ionNames.size(),true); ionDenominatorEnabled.resize(ionNames.size(),true); } return; } } haveRangeParent=false; } void SpatialAnalysisFilter::createDevice(vector &getOut) { //Create the user interaction device required for the user // to interact with the algorithm parameters SelectionDevice *s=0; DrawStreamData *d= new DrawStreamData; d->parent=this; d->cached=0; switch(algorithm) { case ALGORITHM_AXIAL_DF: createCylinder(d,s); break; default: ; } if(s) { devices.push_back(s); getOut.push_back(d); } else delete d; } unsigned int SpatialAnalysisFilter::refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress) { //use the cached copy if we have it. if(cacheOK) { size_t mask=STREAM_TYPE_IONS; if(!WANT_RANGE_PROPAGATION[algorithm]) mask|=STREAM_TYPE_RANGE; //create selection device for this algrithm createDevice(getOut); //Propagate input streams as desired propagateStreams(dataIn,getOut,mask,true); //Propagate cached objects propagateCache(getOut); return 0; } //Set K3D tree abort pointer and progress K3DTree::setAbortFlag(Filter::wantAbort); K3DTree::setProgressPtr(&progress.filterProgress); K3DTreeMk2::setAbortFlag(Filter::wantAbort); K3DTreeMk2::setProgressPtr(&progress.filterProgress); //Find out how much total size we need in points vector size_t totalDataSize=numElements(dataIn,STREAM_TYPE_IONS); //Nothing to do, but propagate inputs if(!totalDataSize) { propagateStreams(dataIn,getOut,getRefreshBlockMask()); return 0; } const RangeFile *rngF=0; if(haveRangeParent) { //Check we actually have something to do if(!std::count(ionSourceEnabled.begin(), ionSourceEnabled.end(),true)) return 0; if(!std::count(ionTargetEnabled.begin(), ionTargetEnabled.end(),true)) return 0; rngF=getRangeFile(dataIn); } size_t result; //Run the algorithm switch(algorithm) { case ALGORITHM_DENSITY: result=algorithmDensity(progress,totalDataSize, dataIn,getOut); break; case ALGORITHM_RDF: result=algorithmRDF(progress,totalDataSize, dataIn,getOut,rngF); break; case ALGORITHM_DENSITY_FILTER: result=algorithmDensityFilter(progress,totalDataSize, dataIn,getOut); break; case ALGORITHM_AXIAL_DF: result=algorithmAxialDf(progress,totalDataSize, dataIn,getOut,rngF); break; case ALGORITHM_BINOMIAL: { if(!rngF) return ERR_NO_RANGE; result=algorithmBinomial(progress,totalDataSize, dataIn,getOut,rngF); break; } case ALGORITHM_REPLACE: result=algorithmReplace(progress,totalDataSize, dataIn,getOut); break; case ALGORITHM_LOCAL_CONCENTRATION: if(!rngF) return ERR_NO_RANGE; result=algorithmLocalConcentration(progress,totalDataSize, dataIn,getOut,rngF); break; default: ASSERT(false); } return result; } size_t SpatialAnalysisFilter::algorithmReplace(ProgressData &progress, size_t totalDataSize, const vector &dataIn, vector &getOut) { progress.maxStep=4; progress.step=1; progress.stepName=TRANS("Collate"); progress.filterProgress=0; //Merge the ions form the incoming streams vector inIons; Filter::collateIons(dataIn,inIons,progress,totalDataSize); progress.step=2; progress.stepName=TRANS("Load"); progress.filterProgress=0; vector fileIons; const unsigned int loadPositions[] = { 0,1,2,3}; //Load the other dataset unsigned int errCode=GenericLoadFloatFile(4,4,loadPositions, fileIons,replaceFile.c_str(),progress.filterProgress,*Filter::wantAbort); if(errCode) return ERR_FILE_READ_FAIL; progress.step=3; progress.stepName=TRANS("Build"); progress.filterProgress=0; //Build the search tree we will use to perform replacement K3DTreeMk2 tree; tree.resetPts(fileIons,false); if(!tree.build()) return ERR_ABORT_FAIL; BoundCube b; tree.getBoundCube(b); //map the offset of the nearest to //the tree ID vector nearestVec; nearestVec.resize(inIons.size()); //TODO: pair vector might be faster // as we can use it in sequence, and can use openmp map matchedMap; //Find the nearest point for all points in the dataset #pragma omp parallel for for(size_t ui=0;ui outIons; switch(replaceMode) { case REPLACE_MODE_SUBTRACT: { //In subtraction mode, we should have // at least this many ions if(inIons.size() > matchedMap.size()) outIons.reserve(inIons.size()-matchedMap.size()); // #pragma omp parallel for for(unsigned int ui=0;ui::iterator it; it=matchedMap.find(ui); if(it != matchedMap.end()) continue; #pragma omp critical outIons.push_back(inIons[ui]); } break; } case REPLACE_MODE_INTERSECT: { outIons.reserve(matchedMap.size()); if(replaceMass) { for(map::const_iterator it=matchedMap.begin();it!=matchedMap.end();++it) { outIons.push_back(fileIons[it->second]); ASSERT(fileIons[it->second].getPosRef().sqrDist(inIons[it->first].getPosRef()) < sqrReplaceTol); } } else { for(map::const_iterator it=matchedMap.begin();it!=matchedMap.end();++it) { outIons.push_back(inIons[it->first]); } } break; } case REPLACE_MODE_UNION: { ASSERT(false); break; } default: ASSERT(false); } //Only output ions if any were found if(outIons.size()) { IonStreamData *outData = new IonStreamData(this); outData->g = outData->b = outData->r = 0.5; outData->data.swap(outIons); cacheAsNeeded(outData); getOut.push_back(outData); } return 0; } void SpatialAnalysisFilter::getProperties(FilterPropGroup &propertyList) const { FilterProperty p; size_t curGroup=0; string tmpStr; vector > choices; for(unsigned int ui=0;ui > choices; choices.push_back(make_pair(1,"x")); choices.push_back(make_pair(2,"y")); choices.push_back(make_pair(0,"z")); p.name=TRANS("Extrusion Direction"); p.data=choiceString(choices,extrusionDirection); p.type=PROPERTY_TYPE_CHOICE; p.helpText=TRANS("Direction in which blocks are extended during construction."); p.key=KEY_BINOMIAL_EXTRUDE_DIR; propertyList.addProperty(p,curGroup); //-- propertyList.setGroupTitle(curGroup,TRANS("Alg. Params.")); curGroup++; p.name=TRANS("Plot Counts"); p.data=boolStrEnc(showBinomialFrequencies); p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Show the counts in the binomial histogram"); p.key=KEY_SHOW_BINOM_FREQ; propertyList.addProperty(p,curGroup); if(showBinomialFrequencies) { p.name=TRANS("Normalise"); p.data=boolStrEnc(showNormalisedBinomialFrequencies); p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Normalise the counts in the binomial histogram to a probability density function"); p.key=KEY_SHOW_BINOM_NORM_FREQ; propertyList.addProperty(p,curGroup); /* TODO: IMPLEMENT ME p.name=TRANS("Expected Freq"); p.data=boolStrEnc(showTheoreticFrequencies); p.type=PROPERTY_TYPE_BOOL; p.helpText=TRANS("Normalise the counts in the binomial histogram to a probability density function"); p.key=KEY_SHOW_BINOM_THEOR_FREQ; propertyList.addProperty(p,curGroup); */ p.name=TRANS("Display Grid"); p.data=boolStrEnc(showGridOverlay); p.type=PROPERTY_TYPE_BOOL; p.helpText="Show the extruded grid in the 3D view. This may be slow"; p.key=KEY_SHOW_BINOM_3D_GRID; propertyList.addProperty(p,curGroup); } propertyList.setGroupTitle(curGroup,TRANS("View Options")); break; } case ALGORITHM_REPLACE: { tmpStr = replaceFile; p.name=TRANS("Data File"); p.data=tmpStr; p.dataSecondary="Pos File (*.pos)|*.pos|All Files|*"; p.type=PROPERTY_TYPE_FILE; p.helpText=TRANS("Pos file of points to subtract/replace/etc"); p.key=KEY_REPLACE_FILE; propertyList.addProperty(p,curGroup); stream_cast(tmpStr,replaceTolerance); p.name=TRANS("Match Tol."); p.data=tmpStr; p.type=PROPERTY_TYPE_REAL; p.helpText=TRANS("Tolerance to allow for matching"); p.key=KEY_REPLACE_TOLERANCE; propertyList.addProperty(p,curGroup); vector > choices; for(unsigned int ui=0;ui=ALGORITHM_ENUM_END) return false; if(ltmp == ALGORITHM_LOCAL_CONCENTRATION && nnMax < 2) { nnMax=2; } algorithm=ltmp; resetParamsAsNeeded(); needUpdate=true; clearCache(); break; } case KEY_STOPMODE: { switch(algorithm) { case ALGORITHM_DENSITY: case ALGORITHM_DENSITY_FILTER: case ALGORITHM_RDF: case ALGORITHM_AXIAL_DF: case ALGORITHM_LOCAL_CONCENTRATION: { size_t ltmp=STOP_MODE_ENUM_END; for(unsigned int ui=0;ui=STOP_MODE_ENUM_END) return false; stopMode=ltmp; needUpdate=true; clearCache(); break; } default: //Should know what algorithm we use. ASSERT(false); break; } break; } case KEY_DISTMAX: { float ltmp; if(stream_cast(ltmp,value)) return false; if(ltmp<= 0.0) return false; distMax=ltmp; needUpdate=true; clearCache(); break; } case KEY_NNMAX: { unsigned int ltmp; if(stream_cast(ltmp,value)) return false; //NNmax should be nonzero at all times. For local concentration // should be at least 2 (as 1 == 100% all the time) if(ltmp==0 || (algorithm == ALGORITHM_LOCAL_CONCENTRATION && ltmp < 2)) return false; nnMax=ltmp; needUpdate=true; clearCache(); break; } case KEY_NNMAX_NORMALISE: { if(!applyPropertyNow(normaliseNNHist,value,needUpdate)) return false; break; } case KEY_NNMAX_SHOWRANDOM: { if(!applyPropertyNow(wantRandomNNHist,value,needUpdate)) return false; break; } case KEY_NUMBINS: { unsigned int ltmp; if(stream_cast(ltmp,value)) return false; if(ltmp==0) return false; numBins=ltmp; needUpdate=true; clearCache(); break; } case KEY_REDUCTIONDIST: { float ltmp; if(stream_cast(ltmp,value)) return false; if(ltmp<= 0.0) return false; reductionDistance=ltmp; needUpdate=true; clearCache(); break; } case KEY_REMOVAL: { if(!applyPropertyNow(excludeSurface,value,needUpdate)) return false; break; } case KEY_COLOUR: { ColourRGBA tmpRgba; if(!tmpRgba.parse(value)) return false; if(rgba.toColourRGBA() != tmpRgba) { rgba=tmpRgba.toRGBAf(); if(cacheOK) { for(size_t ui=0;uigetStreamType() == STREAM_TYPE_PLOT) { PlotStreamData *p; p =(PlotStreamData*)filterOutputs[ui]; p->r=rgba.r(); p->g=rgba.g(); p->b=rgba.b(); } } } needUpdate=true; } break; } case KEY_ENABLE_SOURCE_ALL: { ASSERT(haveRangeParent); bool allEnabled=true; for(unsigned int ui=0;ui::epsilon())) return false; if(scalarParams[0] != newRad ) { scalarParams[0] = newRad; needUpdate=true; clearCache(); } return true; } case KEY_NORMAL: { Point3D newPt; if(!newPt.parse(value)) return false; if(newPt.sqrMag() < sqrtf(std::numeric_limits::epsilon())) return false; if(!(vectorParams[1] == newPt )) { vectorParams[1] = newPt; needUpdate=true; clearCache(); } return true; } case KEY_ORIGIN: { if(!applyPropertyNow(vectorParams[0],value,needUpdate)) return false; return true; } case KEY_NUMIONS: { unsigned int ltmp; if(stream_cast(ltmp,value)) return false; if(ltmp<=1) return false; numIonsSegment=ltmp; needUpdate=true; clearCache(); break; } case KEY_SHOW_BINOM_FREQ: { if(!applyPropertyNow(showBinomialFrequencies,value,needUpdate)) return false; break; } case KEY_SHOW_BINOM_NORM_FREQ: { if(!applyPropertyNow(showNormalisedBinomialFrequencies,value,needUpdate)) return false; break; } case KEY_SHOW_BINOM_THEOR_FREQ: { if(!applyPropertyNow(showTheoreticFrequencies,value,needUpdate)) return false; break; } case KEY_BINOMIAL_MAX_ASPECT: { float ltmp; if(stream_cast(ltmp,value)) return false; if(ltmp<=1) return false; maxBlockAspect=ltmp; needUpdate=true; clearCache(); break; } case KEY_BINOMIAL_EXTRUDE_DIR: { map choices; choices["x"]=0; choices["y"]=1; choices["z"]=2; map::iterator it; it=choices.find(value); if(it == choices.end()) return false; extrusionDirection=it->second; needUpdate=true; clearCache(); break; } case KEY_SHOW_BINOM_3D_GRID: { if(!applyPropertyNow(showGridOverlay,value,needUpdate)) return false; break; } case KEY_REPLACE_FILE: { if(!applyPropertyNow(replaceFile,value,needUpdate)) return false; break; } case KEY_REPLACE_TOLERANCE: { if(!applyPropertyNow(replaceTolerance,value,needUpdate)) return false; break; } case KEY_REPLACE_ALGORITHM: { size_t newVal=REPLACE_MODE_ENUM_END; for(size_t ui=0;ui *vBool=0; switch(keyType) { case KEYTYPE_ENABLE_SOURCE: vBool=&ionSourceEnabled; break; case KEYTYPE_ENABLE_TARGET: vBool=&ionTargetEnabled; break; case KEYTYPE_ENABLE_NUMERATOR: vBool=&ionNumeratorEnabled; break; case KEYTYPE_ENABLE_DENOMINATOR: vBool=&ionDenominatorEnabled; break; default: ASSERT(false); } if(vBool) { bool lastVal = (*vBool)[ionOffset]; if(doEnable) (*vBool)[ionOffset]=true; else (*vBool)[ionOffset]=false; //if the result is different, the //cache should be invalidated if(lastVal!=(*vBool)[ionOffset]) { needUpdate=true; clearCache(); } } } } return true; } std::string SpatialAnalysisFilter::getSpecificErrString(unsigned int code) const { const char *errStrings[] = {"", TRANS("Spatial analysis aborted by user"), TRANS("Insufficient memory to complete analysis"), TRANS("Required range data not present"), TRANS("Insufficient memory for binomial. Reduce input size?"), TRANS("Insufficient points to continue"), TRANS("Unable to load file") }; COMPILE_ASSERT(THREEDEP_ARRAYSIZE(errStrings) == SPAT_ERR_END_OF_ENUM); ASSERT(code < SPAT_ERR_END_OF_ENUM); return std::string(errStrings[code]); } void SpatialAnalysisFilter::setUserString(const std::string &str) { //Which algorithms have plot outputs? const bool ALGORITHM_HAS_PLOTS[] = { false,false,true,true,true,false,false}; COMPILE_ASSERT(THREEDEP_ARRAYSIZE(ALGORITHM_HAS_PLOTS) == ALGORITHM_ENUM_END); if(userString != str && ALGORITHM_HAS_PLOTS[algorithm]) { userString=str; clearCache(); } else userString=str; } unsigned int SpatialAnalysisFilter::getRefreshBlockMask() const { //Anything but ions and ranges can go through this filter. if(!WANT_RANGE_PROPAGATION[algorithm]) return STREAM_TYPE_IONS | STREAM_TYPE_RANGE; else return STREAM_TYPE_IONS; } unsigned int SpatialAnalysisFilter::getRefreshEmitMask() const { switch(algorithm) { case ALGORITHM_RDF: return STREAM_TYPE_IONS | STREAM_TYPE_PLOT; case ALGORITHM_BINOMIAL: return STREAM_TYPE_PLOT | STREAM_TYPE_DRAW; case ALGORITHM_AXIAL_DF: return STREAM_TYPE_IONS | STREAM_TYPE_PLOT | STREAM_TYPE_DRAW; default: return STREAM_TYPE_IONS; } } unsigned int SpatialAnalysisFilter::getRefreshUseMask() const { return STREAM_TYPE_IONS; } bool SpatialAnalysisFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<" << trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" <" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; //-- Binomial parameters --- f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; //-------------------------- writeVectorsXML(f,"vectorparams",vectorParams,depth+1); writeScalarsXML(f,"scalarparams",scalarParams,depth+1); if(ionNames.size()) { writeIonsEnabledXML(f,"source",ionSourceEnabled,ionNames,depth+1); writeIonsEnabledXML(f,"target",ionTargetEnabled,ionNames,depth+1); writeIonsEnabledXML(f,"numerator",ionNumeratorEnabled,ionNames,depth+1); writeIonsEnabledXML(f,"denominator",ionDenominatorEnabled,ionNames,depth+1); } f << tabs(depth) << "" << endl; break; } default: ASSERT(false); return false; } return true; } void SpatialAnalysisFilter::getStateOverrides(std::vector &externalAttribs) const { externalAttribs.push_back(replaceFile); } bool SpatialAnalysisFilter::writePackageState(std::ostream &f, unsigned int format, const std::vector &valueOverrides, unsigned int depth) const { ASSERT(valueOverrides.size() == 1); //Temporarily modify the state of the filter, then call writestate string tmpReplaceFile=replaceFile; //override const and self-modify // this is quite naughty, but we know what we are doing... const_cast(this)->replaceFile=valueOverrides[0]; bool result; result=writeState(f,format,depth); //restore the filter state, such that the caller doesn't notice that this has been modified const_cast(this)->replaceFile=tmpReplaceFile; return result; } bool SpatialAnalysisFilter::readState(xmlNodePtr &nodePtr, const std::string &stateFileDir) { using std::string; string tmpStr; //Retrieve user string //=== if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlChar *xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //=== //Retrieve algorithm //====== if(!XMLGetNextElemAttrib(nodePtr,algorithm,"algorithm","value")) return false; if(algorithm >=ALGORITHM_ENUM_END) return false; //=== //Retrieve stop mode //=== if(!XMLGetNextElemAttrib(nodePtr,stopMode,"stopmode","value")) return false; if(stopMode >=STOP_MODE_ENUM_END) return false; //=== //Retrieve nnMax val //====== if(!XMLGetNextElemAttrib(nodePtr,nnMax,"nnmax","value")) return false; if(!nnMax) return false; //=== //Retrieve histogram normalisation //TODO: COMPAT : did not exist prior to 0.0.17 // internal 5033191f0c61 //====== xmlNodePtr tmpNode = nodePtr; if(!XMLGetNextElemAttrib(tmpNode,normaliseNNHist,"normalisennhist","value")) { normaliseNNHist=false; } //=== //Retrieve histogram normalisation //TODO: COMPAT : did not exist prior to 0.0.18 // internal revision : 2302dbbfb3dd //====== tmpNode = nodePtr; if(!XMLGetNextElemAttrib(tmpNode,wantRandomNNHist,"wantrandomnnhist","value")) { wantRandomNNHist=false; } //=== //Retrieve distMax val //====== if(!XMLGetNextElemAttrib(nodePtr,distMax,"distmax","value")) return false; if(distMax <=0.0) return false; //=== //Retrieve numBins val //====== if(!XMLGetNextElemAttrib(nodePtr,numBins,"numbins","value")) return false; if(!numBins) return false; //=== //Retrieve exclude surface on/off //=== if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"excludesurface","value")) return false; //check that new value makes sense if(!boolStrDec(tmpStr,excludeSurface)) return false; //=== //Get reduction distance //=== if(!XMLGetNextElemAttrib(nodePtr,reductionDistance,"reductiondistance","value")) return false; if(reductionDistance < 0.0f) return false; //=== //Retrieve colour //==== if(XMLHelpFwdToElem(nodePtr,"colour")) return false; ColourRGBAf tmpRgbaf; if(!parseXMLColour(nodePtr,tmpRgbaf)) return false; rgba=tmpRgbaf; //==== //Retrieve density cutoff & upper if(!XMLGetNextElemAttrib(nodePtr,densityCutoff,"densitycutoff","value")) return false; if(densityCutoff< 0.0f) return false; if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"keepdensityupper","value")) return false; //check that new value makes sense if(!boolStrDec(tmpStr,keepDensityUpper)) return false; //FIXME:COMPAT_BREAK : 3Depict <= internal fb7d66397b7b does not contain tmpNode=nodePtr; if(!XMLHelpFwdToElem(nodePtr,"replace")) { if(XMLHelpGetProp(replaceFile,nodePtr,"file")) return false; if(XMLHelpGetProp(replaceMode,nodePtr,"mode")) return false; if(replaceMode>REPLACE_MODE_ENUM_END) return false; if(XMLHelpGetProp(replaceTolerance,nodePtr,"tolerance")) return false; if(replaceTolerance < 0) return false; } else nodePtr=tmpNode; //FIXME:COMPAT_BREAK : 3Depict <= 1796:5639f6d50732 does not contain // this section tmpNode=nodePtr; if(!XMLHelpFwdToElem(nodePtr,"binomial")) { unsigned int nSegment; float maxAspect; //Retrieve segmentation count if(!XMLGetAttrib(nodePtr,nSegment,"numions")) return false; if(nSegment <= 1) return false; numIonsSegment=nSegment; //Retrieve and verify aspect ratio if(!XMLGetAttrib(nodePtr,maxAspect,"maxblockaspect")) return false; if(maxAspect<1.0f) return false; maxBlockAspect=maxAspect; //Get the extrusion direction unsigned int tmpExtr; if(!XMLGetAttrib(nodePtr,tmpExtr,"extrusiondirection")) return false; if(tmpExtr >=3) return false; extrusionDirection=tmpExtr; //Spin to binomial display if(XMLHelpFwdToElem(nodePtr,"binomialdisplay")) return false; if(!XMLGetAttrib(nodePtr,tmpStr,"freqs")) return false; if(!boolStrDec(tmpStr,showBinomialFrequencies)) return false; if(!XMLGetAttrib(nodePtr,tmpStr,"normalisedfreqs")) return false; if(!boolStrDec(tmpStr,showNormalisedBinomialFrequencies)) return false; if(!XMLGetAttrib(nodePtr,tmpStr,"theoreticfreqs")) return false; if(!boolStrDec(tmpStr,showTheoreticFrequencies)) return false; } else nodePtr=tmpNode; //FIXME: COMPAT_BREAK : Earlier versions of the state file <= 1441:adaa3a3daa80 // do not contain this section, so we must be fault tolerant // when we bin backwards compatability, do this one too. tmpNode=nodePtr; if(!XMLHelpFwdToElem(nodePtr,"scalarparams")) readScalarsXML(nodePtr,scalarParams); else nodePtr=tmpNode; if(!XMLHelpFwdToElem(nodePtr,"vectorparams")) readVectorsXML(nodePtr,vectorParams); else nodePtr=tmpNode; //FIXME: Remap the ion names we load from the file to the ion names that we // see in the rangefile vector ionNames; if(!XMLHelpFwdToElem(nodePtr,"source")) readIonsEnabledXML(nodePtr,ionSourceEnabled,ionNames); nodePtr=tmpNode; if(!XMLHelpFwdToElem(nodePtr,"target")) readIonsEnabledXML(nodePtr,ionTargetEnabled,ionNames); nodePtr=tmpNode; if(!XMLHelpFwdToElem(nodePtr,"numerator")) readIonsEnabledXML(nodePtr,ionNumeratorEnabled,ionNames); nodePtr=tmpNode; if(!XMLHelpFwdToElem(nodePtr,"denominator")) readIonsEnabledXML(nodePtr,ionDenominatorEnabled,ionNames); resetParamsAsNeeded(); return true; } void SpatialAnalysisFilter::setPropFromBinding(const SelectionBinding &b) { switch(b.getID()) { case BINDING_CYLINDER_RADIUS: b.getValue(scalarParams[0]); break; case BINDING_CYLINDER_DIRECTION: { Point3D p; b.getValue(p); if(p.sqrMag() > sqrtf(std::numeric_limits::epsilon())) vectorParams[1]=p; break; } case BINDING_CYLINDER_ORIGIN: b.getValue(vectorParams[0]); break; default: ASSERT(false); } clearCache(); } void SpatialAnalysisFilter::resetParamsAsNeeded() { //Perform any needed // transformations to internal vars switch(algorithm) { case ALGORITHM_AXIAL_DF: { if(vectorParams.size() !=2) { size_t oldSize=vectorParams.size(); vectorParams.resize(2); if(oldSize== 0) vectorParams[0]=Point3D(0,0,0); if(oldSize < 2) vectorParams[1]=Point3D(0,0,1); } if(scalarParams.size() !=1) { size_t oldSize=scalarParams.size(); scalarParams.resize(1); if(!oldSize) scalarParams[0]=DEFAULT_AXIAL_DISTANCE; } break; } default: //fall through ; } } void SpatialAnalysisFilter::filterSelectedRanges(const vector &ions, bool sourceFilter, const RangeFile *rngF, vector &output) const { if(sourceFilter) rngF->rangeByIon(ions,ionSourceEnabled,output); else rngF->rangeByIon(ions,ionTargetEnabled,output); } //FIXME: Move to filter common //Scan input datastreams to build a single point vector, // which is a copy of the input points //Returns 0 on no error, otherwise nonzero size_t buildMonolithicPoints(const vector &dataIn, ProgressData &progress, size_t totalDataSize, vector &p) { //Build monolithic point set //--- p.resize(totalDataSize); size_t dataSize=0; progress.filterProgress=0; if(*Filter::wantAbort) return FILTER_ERR_ABORT; for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *d; d=((const IonStreamData *)dataIn[ui]); if(extendDataVector(p,d->data, progress.filterProgress, dataSize)) return ERR_ABORT_FAIL; dataSize+=d->data.size(); } break; default: break; } } //--- return 0; } size_t SpatialAnalysisFilter::algorithmRDF(ProgressData &progress, size_t totalDataSize, const vector &dataIn, vector &getOut,const RangeFile *rngF) { progress.step=1; progress.stepName=TRANS("Collate"); progress.filterProgress=0; if(excludeSurface) progress.maxStep=4; else progress.maxStep=3; if(*Filter::wantAbort) return FILTER_ERR_ABORT; K3DTree kdTree; //Source points vector p; bool needSplitting; needSplitting=false; //We only need to split up the data if we have to if((size_t)std::count(ionSourceEnabled.begin(),ionSourceEnabled.end(),true)!=ionSourceEnabled.size() || (size_t)std::count(ionTargetEnabled.begin(),ionTargetEnabled.end(),true)!=ionTargetEnabled.size() ) needSplitting=true; if(haveRangeParent && needSplitting) { vector pts[2]; ASSERT(ionNames.size()); size_t errCode; if((errCode=buildSplitPoints(dataIn,progress,totalDataSize, rngF,ionSourceEnabled, ionTargetEnabled,pts[0],pts[1]))) return errCode; progress.step=2; progress.stepName=TRANS("Build"); //Build the tree using the target ions //(its roughly nlogn timing, but worst case n^2) kdTree.buildByRef(pts[1]); if(*Filter::wantAbort) return FILTER_ERR_ABORT; pts[1].clear(); //Remove surface points from sources if desired if(excludeSurface) { ASSERT(reductionDistance > 0); progress.step++; progress.stepName=TRANS("Surface"); if(*Filter::wantAbort) return FILTER_ERR_ABORT; //Take the input points, then use them //to compute the convex hull reduced //volume. vector returnPoints; errCode=GetReducedHullPts(pts[0],reductionDistance, &progress.filterProgress,*(Filter::wantAbort), returnPoints); if(errCode ==1) return INSUFFICIENT_SIZE_ERR; else if(errCode) { ASSERT(false); return ERR_ABORT_FAIL; } if(*Filter::wantAbort) return FILTER_ERR_ABORT; pts[0].clear(); //Forget the original points, and use the new ones p.swap(returnPoints); } else p.swap(pts[0]); } else { size_t errCode; if((errCode=buildMonolithicPoints(dataIn,progress,totalDataSize,p))) return errCode; progress.step=2; progress.stepName=TRANS("Build"); BoundCube treeDomain; treeDomain.setBounds(p); //Build the tree (its roughly nlogn timing, but worst case n^2) kdTree.buildByRef(p); if(*Filter::wantAbort) return FILTER_ERR_ABORT; //Remove surface points if desired if(excludeSurface) { ASSERT(reductionDistance > 0); progress.step++; progress.stepName=TRANS("Surface"); if(*Filter::wantAbort) return FILTER_ERR_ABORT; //Take the input points, then use them //to compute the convex hull reduced //volume. vector returnPoints; size_t errCode; if((errCode=GetReducedHullPts(p,reductionDistance, &progress.filterProgress, *Filter::wantAbort, returnPoints)) ) { if(errCode ==1) return INSUFFICIENT_SIZE_ERR; else if(errCode ==2) return ERR_ABORT_FAIL; else { ASSERT(false); return ERR_ABORT_FAIL; } } //Forget the original points, and use the new ones p.swap(returnPoints); if(*Filter::wantAbort) return FILTER_ERR_ABORT; } } //Let us perform the desired analysis progress.step++; progress.stepName=TRANS("Analyse"); //If there is no data, there is nothing to do. if(p.empty() || !kdTree.nodeCount()) return 0; //OK, at this point, the KD tree contains the target points //of interest, and the vector "p" contains the source points //of interest, whatever they might be. switch(stopMode) { case STOP_MODE_NEIGHBOUR: { //User is after an NN histogram analysis //Histogram is output as a per-NN histogram of frequency. vector > histogram; //Bin widths for the NN histograms (each NN hist //is scaled separately). The +1 is due to the tail bin //being the totals float *binWidth = new float[nnMax]; unsigned int errCode; //Run the analysis errCode=generateNNHist(p,kdTree,nnMax, numBins,histogram,binWidth, &(progress.filterProgress),*Filter::wantAbort); switch(errCode) { case 0: break; case RDF_ERR_INSUFFICIENT_INPUT_POINTS: { delete[] binWidth; return INSUFFICIENT_SIZE_ERR; } case RDF_ABORT_FAIL: { delete[] binWidth; return ERR_ABORT_FAIL; } default: ASSERT(false); } vector > histogramFloat; histogramFloat.resize(nnMax); //Normalise the NN histograms to a per bin width as required for(unsigned int ui=0;uiindex=ui; plotData[ui]->parent=this; plotData[ui]->plotMode=PLOT_MODE_1D; plotData[ui]->xLabel=TRANS("Radial Distance"); if(normaliseNNHist) plotData[ui]->yLabel=TRANS("Count/Distance"); else plotData[ui]->yLabel=TRANS("Count"); std::string tmpStr; stream_cast(tmpStr,ui+1); plotData[ui]->dataLabel=getUserString() + string(" ") +tmpStr + TRANS("NN Freq."); //Red plot. plotData[ui]->r=rgba.r(); plotData[ui]->g=rgba.g(); plotData[ui]->b=rgba.b(); plotData[ui]->xyData.resize(numBins); for(unsigned int uj=0;ujxyData[uj] = std::make_pair(dist, histogramFloat[ui][uj]); } cacheAsNeeded(plotData[ui]); getOut.push_back(plotData[ui]); } } //If requested, add a probability distribution. // we need to scale it to match the displayed observed // histogram if(wantRandomNNHist) { vector > nnTheoHist; nnTheoHist.resize(nnMax); #pragma omp parallel for for(unsigned int ui=0;ui evalDist; evalDist.resize(numBins); for(unsigned int uj=0;ujindex=ui+nnMax; plotData[ui]->parent=this; plotData[ui]->plotMode=PLOT_MODE_1D; plotData[ui]->xLabel=TRANS("Radial Distance"); // plotData[ui]->lineStyle=LINE_STYLE_DASH; if(normaliseNNHist) plotData[ui]->yLabel=TRANS("Count/Distance"); else plotData[ui]->yLabel=TRANS("Count"); std::string tmpStr; stream_cast(tmpStr,ui+1); plotData[ui]->dataLabel=getUserString() + string(" Random ") +tmpStr + TRANS("NN Freq."); //Red plot. plotData[ui]->r=rgba.r(); plotData[ui]->g=rgba.g(); plotData[ui]->b=rgba.b(); plotData[ui]->xyData.resize(numBins); for(unsigned int uj=0;ujxyData[uj] = std::make_pair(dist, nnTheoHist[ui][uj]); } cacheAsNeeded(plotData[ui]); getOut.push_back(plotData[ui]); } } delete[] binWidth; break; } case STOP_MODE_RADIUS: { unsigned int warnBiasCount=0; //Histogram is output as a histogram of frequency vs distance unsigned int *histogram = new unsigned int[numBins]; for(unsigned int ui=0;uiplotMode=PLOT_MODE_1D; plotData->index=0; plotData->parent=this; plotData->xLabel=TRANS("Radial Distance"); plotData->yLabel=TRANS("Count"); plotData->dataLabel=getUserString() + TRANS(" RDF"); plotData->r=rgba.r(); plotData->g=rgba.g(); plotData->b=rgba.b(); plotData->xyData.resize(numBins); for(unsigned int uj=0;ujxyData[uj] = std::make_pair(dist, histogram[uj]); } delete[] histogram; cacheAsNeeded(plotData); getOut.push_back(plotData); //Propagate non-ion/range data for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: case STREAM_TYPE_RANGE: //Do not propagate ranges, or ions break; default: getOut.push_back(dataIn[ui]); break; } } break; } default: ASSERT(false); } return 0; } size_t SpatialAnalysisFilter::algorithmDensity(ProgressData &progress, size_t totalDataSize, const vector &dataIn, vector &getOut) { vector p; size_t errCode; progress.step=1; progress.stepName=TRANS("Collate"); progress.maxStep=3; if((errCode=buildMonolithicPoints(dataIn,progress,totalDataSize,p))) return errCode; progress.step=2; progress.stepName=TRANS("Build"); progress.filterProgress=0; if(*Filter::wantAbort) return FILTER_ERR_ABORT; BoundCube treeDomain; treeDomain.setBounds(p); //Build the tree (its roughly nlogn timing, but worst case n^2) K3DTree kdTree; kdTree.buildByRef(p); if(*Filter::wantAbort) return FILTER_ERR_ABORT; p.clear(); //We don't need pts any more, as tree *is* a copy. //Its algorithm time! //---- //Update progress stuff size_t n=0; progress.step=3; progress.stepName=TRANS("Analyse"); progress.filterProgress=0; if(*Filter::wantAbort) return FILTER_ERR_ABORT; //List of points for which there was a failure //first entry is the point Id, second is the //dataset id. std::list > badPts; for(size_t ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *d; d=((const IonStreamData *)dataIn[ui]); IonStreamData *newD = new IonStreamData; newD->parent=this; //Adjust this number to provide more update than usual, because we //are not doing an o(1) task between updates; yes, it is a hack unsigned int curProg=NUM_CALLBACK/(10*nnMax); newD->data.resize(d->data.size()); if(stopMode == STOP_MODE_NEIGHBOUR) { bool spin=false; #pragma omp parallel for shared(spin) for(size_t uj=0;ujdata.size();uj++) { if(spin) continue; Point3D r; vector res; r=d->data[uj].getPosRef(); //Assign the mass to charge using nn density estimates kdTree.findKNearest(r,treeDomain,nnMax,res); if(res.size()) { float maxSqrRad; //Get the radius as the furthest object maxSqrRad= (res[res.size()-1]->sqrDist(r)); //Set the mass as the volume of sphere * the number of NN newD->data[uj].setMassToCharge(res.size()/(4.0/3.0*M_PI*powf(maxSqrRad,3.0/2.0))); //Keep original position newD->data[uj].setPos(r); } else { #pragma omp critical badPts.push_back(make_pair(uj,ui)); } res.clear(); //Update progress as needed if(!curProg--) { #pragma omp critical { n+=NUM_CALLBACK/(nnMax); progress.filterProgress= (unsigned int)(((float)n/(float)totalDataSize)*100.0f); if(*Filter::wantAbort) spin=true; curProg=NUM_CALLBACK/(nnMax); } } } if(spin) { delete newD; return ERR_ABORT_FAIL; } } else if(stopMode == STOP_MODE_RADIUS) { #ifdef _OPENMP bool spin=false; #endif float maxSqrRad = distMax*distMax; float vol = 4.0/3.0*M_PI*maxSqrRad*distMax; //Sphere volume=4/3 Pi R^3 #pragma omp parallel for shared(spin) firstprivate(treeDomain,curProg) for(size_t uj=0;ujdata.size();uj++) { Point3D r; const Point3D *res; float deadDistSqr; unsigned int numInRad; #ifdef _OPENMP if(spin) continue; #endif r=d->data[uj].getPosRef(); numInRad=0; deadDistSqr=0; //Assign the mass to charge using nn density estimates //TODO: Use multi-neareast search algorithm? do { res=kdTree.findNearest(r,treeDomain,deadDistSqr); //Check to see if we found something if(!res) { #pragma omp critical badPts.push_back(make_pair(uj, ui)); break; } if(res->sqrDist(r) >maxSqrRad) break; numInRad++; //Advance ever so slightly beyond the next ion deadDistSqr = res->sqrDist(r)+std::numeric_limits::epsilon(); //Update progress as needed if(!curProg--) { #pragma omp critical { progress.filterProgress= (unsigned int)((float)n/(float)totalDataSize*100.0f); if(*Filter::wantAbort) { #ifdef _OPENMP spin=true; #else delete newD; return ERR_ABORT_FAIL; #endif } } #ifdef _OPENMP if(spin) break; #endif curProg=NUM_CALLBACK/(10*nnMax); } }while(true); n++; //Set the mass as the volume of sphere * the number of NN newD->data[uj].setMassToCharge(numInRad/vol); //Keep original position newD->data[uj].setPos(r); } #ifdef _OPENMP if(spin) { delete newD; return ERR_ABORT_FAIL; } #endif } else { //Should not get here. ASSERT(false); } //move any bad points from the array to the end, then drop them //To do this, we have to reverse sort the array, then //swap the output ion vector entries with the end, //then do a resize. ComparePairFirst cmp; badPts.sort(cmp); badPts.reverse(); //Do some swappage size_t pos=1; for(std::list >::iterator it=badPts.begin(); it!=badPts.end();++it) { newD->data[(*it).first]=newD->data[newD->data.size()-pos]; } //Trim the tail of bad points, leaving only good points newD->data.resize(newD->data.size()-badPts.size()); if(newD->data.size()) { //Use default colours newD->r=d->r; newD->g=d->g; newD->b=d->b; newD->a=d->a; newD->ionSize=d->ionSize; newD->valueType=TRANS("Number Density (\\#/Vol^3)"); //Cache result as neede cacheAsNeeded(newD); getOut.push_back(newD); } else delete newD; } break; case STREAM_TYPE_RANGE: break; default: getOut.push_back(dataIn[ui]); break; } } progress.filterProgress=100; //If we have bad points, let the user know. if(!badPts.empty()) { std::string sizeStr; stream_cast(sizeStr,badPts.size()); consoleOutput.push_back(std::string(TRANS("Warning,")) + sizeStr + TRANS(" points were un-analysable. These have been dropped")); //Print out a list of points if we can size_t maxPrintoutSize=std::min(badPts.size(),(size_t)200); list >::iterator it; it=badPts.begin(); while(maxPrintoutSize--) { std::string s; const IonStreamData *d; d=((const IonStreamData *)dataIn[it->second]); Point3D getPos; getPos= d->data[it->first].getPosRef(); stream_cast(s,getPos); consoleOutput.push_back(s); ++it; } if(badPts.size() > 200) { consoleOutput.push_back(TRANS("And so on...")); } } return 0; } size_t SpatialAnalysisFilter::algorithmDensityFilter(ProgressData &progress, size_t totalDataSize, const vector &dataIn, vector &getOut) { vector p; size_t errCode; progress.step=1; progress.stepName=TRANS("Collate"); progress.maxStep=3; if((errCode=buildMonolithicPoints(dataIn,progress,totalDataSize,p))) return errCode; progress.step=2; progress.stepName=TRANS("Build"); progress.filterProgress=0; if(*Filter::wantAbort) return FILTER_ERR_ABORT; BoundCube treeDomain; treeDomain.setBounds(p); //Build the tree (its roughly nlogn timing, but worst case n^2) K3DTree kdTree; kdTree.buildByRef(p); //Update progress if(*Filter::wantAbort) return FILTER_ERR_ABORT; p.clear(); //We don't need pts any more, as tree *is* a copy. //Its algorithm time! //---- //Update progress stuff size_t n=0; progress.step=3; progress.stepName=TRANS("Analyse"); progress.filterProgress=0; if(*Filter::wantAbort) return FILTER_ERR_ABORT; //List of points for which there was a failure //first entry is the point Id, second is the //dataset id. std::list > badPts; for(size_t ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *d; d=((const IonStreamData *)dataIn[ui]); IonStreamData *newD = new IonStreamData; newD->parent=this; //Adjust this number to provide more update thanusual, because we //are not doing an o(1) task between updates; yes, it is a hack unsigned int curProg=NUM_CALLBACK/(10*nnMax); newD->data.reserve(d->data.size()); if(stopMode == STOP_MODE_NEIGHBOUR) { bool spin=false; #pragma omp parallel for shared(spin) for(size_t uj=0;ujdata.size();uj++) { if(spin) continue; Point3D r; vector res; r=d->data[uj].getPosRef(); //Assign the mass to charge using nn density estimates kdTree.findKNearest(r,treeDomain,nnMax,res); if(res.size()) { float maxSqrRad; //Get the radius as the furthest object maxSqrRad= (res[res.size()-1]->sqrDist(r)); float density; density = res.size()/(4.0/3.0*M_PI*powf(maxSqrRad,3.0/2.0)); if(xorFunc((density <=densityCutoff), keepDensityUpper)) { #pragma omp critical newD->data.push_back(d->data[uj]); } } else { #pragma omp critical badPts.push_back(make_pair(uj,ui)); } res.clear(); //Update progress as needed if(!curProg--) { #pragma omp critical { n+=NUM_CALLBACK/(nnMax); progress.filterProgress= (unsigned int)(((float)n/(float)totalDataSize)*100.0f); if(*Filter::wantAbort) spin=true; curProg=NUM_CALLBACK/(nnMax); } } } if(spin) { delete newD; return ERR_ABORT_FAIL; } } else if(stopMode == STOP_MODE_RADIUS) { #ifdef _OPENMP bool spin=false; #endif float maxSqrRad = distMax*distMax; float vol = 4.0/3.0*M_PI*maxSqrRad*distMax; //Sphere volume=4/3 Pi R^3 #pragma omp parallel for shared(spin) firstprivate(treeDomain,curProg) for(size_t uj=0;ujdata.size();uj++) { Point3D r; const Point3D *res; float deadDistSqr; unsigned int numInRad; #ifdef _OPENMP if(spin) continue; #endif r=d->data[uj].getPosRef(); numInRad=0; deadDistSqr=0; //Assign the mass to charge using nn density estimates do { res=kdTree.findNearest(r,treeDomain,deadDistSqr); //Check to see if we found something if(!res) { #pragma omp critical badPts.push_back(make_pair(uj, ui)); break; } if(res->sqrDist(r) >maxSqrRad) break; numInRad++; //Advance ever so slightly beyond the next ion deadDistSqr = res->sqrDist(r)+std::numeric_limits::epsilon(); //Update progress as needed if(!curProg--) { #pragma omp critical { progress.filterProgress= (unsigned int)((float)n/(float)totalDataSize*100.0f); if(*Filter::wantAbort) { #ifdef _OPENMP spin=true; #else delete newD; return ERR_ABORT_FAIL; #endif } } #ifdef _OPENMP if(spin) break; #endif curProg=NUM_CALLBACK/(10*nnMax); } }while(true); n++; float density; density = numInRad/vol; if(xorFunc((density <=densityCutoff), keepDensityUpper)) { #pragma omp critical newD->data.push_back(d->data[uj]); } } #ifdef _OPENMP if(spin) { delete newD; return ERR_ABORT_FAIL; } #endif } else { //Should not get here. ASSERT(false); } //move any bad points from the array to the end, then drop them //To do this, we have to reverse sort the array, then //swap the output ion vector entries with the end, //then do a resize. ComparePairFirst cmp; badPts.sort(cmp); badPts.reverse(); //Do some swappage size_t pos=1; for(std::list >::iterator it=badPts.begin(); it!=badPts.end();++it) { newD->data[(*it).first]=newD->data[newD->data.size()-pos]; } //Trim the tail of bad points, leaving only good points newD->data.resize(newD->data.size()-badPts.size()); if(newD->data.size()) { //Use default colours newD->r=d->r; newD->g=d->g; newD->b=d->b; newD->a=d->a; newD->ionSize=d->ionSize; newD->valueType=TRANS("Number Density (\\#/Vol^3)"); //Cache result as needed cacheAsNeeded(newD); getOut.push_back(newD); } else delete newD; } break; default: getOut.push_back(dataIn[ui]); break; } } //If we have bad points, let the user know. if(!badPts.empty()) { std::string sizeStr; stream_cast(sizeStr,badPts.size()); consoleOutput.push_back(std::string(TRANS("Warning,")) + sizeStr + TRANS(" points were un-analysable. These have been dropped")); //Print out a list of points if we can size_t maxPrintoutSize=std::min(badPts.size(),(size_t)200); list >::iterator it; it=badPts.begin(); while(maxPrintoutSize--) { std::string s; const IonStreamData *d; d=((const IonStreamData *)dataIn[it->second]); Point3D getPos; getPos= d->data[it->first].getPosRef(); stream_cast(s,getPos); consoleOutput.push_back(s); ++it; } if(badPts.size() > 200) { consoleOutput.push_back(TRANS("And so on...")); } } return 0; } void SpatialAnalysisFilter::createCylinder(DrawStreamData * &drawData, SelectionDevice * &s) const { //Origin + normal ASSERT(vectorParams.size() == 2); //Add drawable components DrawCylinder *dC = new DrawCylinder; dC->setOrigin(vectorParams[0]); dC->setRadius(scalarParams[0]); dC->setColour(0.5,0.5,0.5,0.3); dC->setSlices(40); dC->setLength(sqrtf(vectorParams[1].sqrMag())*2.0f); dC->setDirection(vectorParams[1]); dC->wantsLight=true; drawData->drawables.push_back(dC); //Set up selection "device" for user interaction //==== //The object is selectable dC->canSelect=true; //Start and end radii must be the same (not a //tapered cylinder) dC->lockRadii(); s = new SelectionDevice(this); SelectionBinding b; //Bind the drawable object to the properties we wish //to be able to modify //Bind left + command button to move b.setBinding(SELECT_BUTTON_LEFT,FLAG_CMD,DRAW_CYLINDER_BIND_ORIGIN, BINDING_CYLINDER_ORIGIN,dC->getOrigin(),dC); b.setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b); //Bind left + shift to change orientation b.setBinding(SELECT_BUTTON_LEFT,FLAG_SHIFT,DRAW_CYLINDER_BIND_DIRECTION, BINDING_CYLINDER_DIRECTION,dC->getDirection(),dC); b.setInteractionMode(BIND_MODE_POINT3D_ROTATE); s->addBinding(b); //Bind right button to changing position b.setBinding(SELECT_BUTTON_RIGHT,0,DRAW_CYLINDER_BIND_ORIGIN, BINDING_CYLINDER_ORIGIN,dC->getOrigin(),dC); b.setInteractionMode(BIND_MODE_POINT3D_TRANSLATE); s->addBinding(b); //Bind middle button to changing orientation b.setBinding(SELECT_BUTTON_MIDDLE,0,DRAW_CYLINDER_BIND_DIRECTION, BINDING_CYLINDER_DIRECTION,dC->getDirection(),dC); b.setInteractionMode(BIND_MODE_POINT3D_ROTATE); s->addBinding(b); //Bind left button to changing radius b.setBinding(SELECT_BUTTON_LEFT,0,DRAW_CYLINDER_BIND_RADIUS, BINDING_CYLINDER_RADIUS,dC->getRadius(),dC); b.setInteractionMode(BIND_MODE_FLOAT_TRANSLATE); b.setFloatLimits(0,std::numeric_limits::max()); s->addBinding(b); //===== } size_t SpatialAnalysisFilter::algorithmAxialDf(ProgressData &progress, size_t totalDataSize, const vector &dataIn, vector &getOut,const RangeFile *rngF) { //Need bins to perform histogram ASSERT(numBins); progress.step=1; progress.stepName=TRANS("Extract"); progress.filterProgress=0; progress.maxStep=4; //Ions inside the selected cylinder, // which are to be used as source points for dist. function query vector ionsInside; { //Crop out a cylinder as the source data CropHelper cropHelp(totalDataSize, CROP_CYLINDER_INSIDE_AXIAL, vectorParams,scalarParams); float minProg,maxProg; size_t cumulativeCount=0; //Run cropping over the input datastreams for(size_t ui=0; uigetStreamType() == STREAM_TYPE_IONS) { const IonStreamData* d; d=(const IonStreamData *)dataIn[ui]; size_t errCode; minProg=cumulativeCount/(float)totalDataSize; cumulativeCount+=d->data.size(); maxProg=cumulativeCount/(float)totalDataSize; errCode=cropHelp.runFilter(d->data,ionsInside, minProg,maxProg,progress.filterProgress); if(errCode == ERR_CROP_INSUFFICIENT_MEM) return INSUFFICIENT_SIZE_ERR; else if(errCode) { //If we fail, abort, but we should use // the appropriate error code ASSERT(errCode == ERR_CROP_CALLBACK_FAIL); break; } } } } if(*Filter::wantAbort) return ERR_ABORT_FAIL; //Now, the ions outside the targeting volume may be reduced vector ionsOutside; ionsOutside.resize(totalDataSize); //Build complete set of input data { size_t offset=0; for(size_t ui=0;uigetStreamType() != STREAM_TYPE_IONS) continue; //Copy input data in its entirety into a single vector const IonStreamData *d; d=(const IonStreamData*)dataIn[ui]; for(size_t uj=0;ujdata.size();uj++) { ionsOutside[offset]=d->data[uj]; offset++; } } } progress.step=2; progress.stepName=TRANS("Reduce"); progress.filterProgress=0; //TODO: Improve progress switch(stopMode) { case STOP_MODE_RADIUS: { //In this case we can pull a small trick - // do an O(n) pass to crop out the data we want, before doing the O(nlogn) tree build. // We however must build a slightly larger cylinder to do the crop vector vP; vector sP; vP=vectorParams; sP=scalarParams; //Expand radius to encapsulate cylinder contents+dMax sP[0]+= distMax; //Similarly expand axis (vp[0] is origin, vp[1] is zis) vP[1].extend(distMax); //Crop out a cylinder as the source data CropHelper cropHelp(totalDataSize, CROP_CYLINDER_INSIDE_AXIAL, vP,sP); vector tmp; size_t errCode=cropHelp.runFilter(ionsOutside,tmp,0,100,progress.filterProgress); switch(errCode) { case 0: break; case ERR_CROP_INSUFFICIENT_MEM: return INSUFFICIENT_SIZE_ERR; case ERR_CROP_CALLBACK_FAIL: return ERR_ABORT_FAIL; default: ASSERT(false); return ERR_ABORT_FAIL; } tmp.swap(ionsOutside); break; } case STOP_MODE_NEIGHBOUR: { //Nothing to do here! break; } default: ASSERT(false); } //We only need to slice down the data if required if(haveRangeParent) { #pragma omp parallel { //For the ions "inside", we only care about the // source data, not the target. Filter further using this info #pragma omp task { bool sourceReduce; sourceReduce=((size_t)std::count(ionSourceEnabled.begin(),ionSourceEnabled.end(),true) !=ionSourceEnabled.size()); if(sourceReduce) { vector tmp; filterSelectedRanges(ionsInside,true,rngF,tmp); ionsInside.swap(tmp); } } #pragma omp task { bool targetReduce; targetReduce=((size_t)std::count(ionTargetEnabled.begin(),ionTargetEnabled.end(),true) !=ionTargetEnabled.size() ); if(targetReduce) { vector tmp; filterSelectedRanges(ionsOutside,false,rngF,tmp); ionsOutside.swap(tmp); } } } } progress.step=3; progress.stepName=TRANS("Build"); progress.filterProgress=0; //Strip away the real value information, leaving just point data vector src,dest; IonHit::getPoints(ionsInside,src); ionsInside.clear(); IonHit::getPoints(ionsOutside,dest); ionsOutside.clear(); K3DTree tree; tree.buildByRef(dest); if(*Filter::wantAbort) return FILTER_ERR_ABORT; progress.step=4; progress.stepName=TRANS("Compute"); progress.filterProgress=0; unsigned int *histogram = new unsigned int[numBins]; for(unsigned int ui=0;uiplotMode=PLOT_MODE_1D; plotData->index=0; plotData->parent=this; plotData->xLabel=TRANS("Axial Distance"); plotData->yLabel=TRANS("Count"); plotData->dataLabel=getUserString() + TRANS(" 1D Dist. Func."); plotData->r=rgba.r(); plotData->g=rgba.g(); plotData->b=rgba.b(); plotData->xyData.resize(numBins); for(unsigned int uj=0;ujxyData[uj] = std::make_pair(dist, histogram[uj]); } cacheAsNeeded(plotData); getOut.push_back(plotData); } delete[] histogram; //Propagate non-ion/range data for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: case STREAM_TYPE_RANGE: //Do not propagate ranges, or ions break; default: getOut.push_back(dataIn[ui]); break; } } //create the selection device for this algorithm createDevice(getOut); return 0; } size_t SpatialAnalysisFilter::algorithmBinomial(ProgressData &progress, size_t totalDataSize, const vector &dataIn, vector &getOut,const RangeFile *rngF) { vector ions; progress.step=1; progress.stepName=TRANS("Collate"); progress.filterProgress=0; progress.maxStep=2; //Merge the ions form the incoming streams Filter::collateIons(dataIn,ions,progress,totalDataSize); //Tell user we are on next step progress.step++; progress.stepName=TRANS("Binomial"); progress.filterProgress=0; size_t errCode; SEGMENT_OPTION segmentOpts; segmentOpts.nIons=numIonsSegment; segmentOpts.strategy=BINOMIAL_SEGMENT_AUTO_BRICK; segmentOpts.extrusionDirection=extrusionDirection; segmentOpts.extrudeMaxRatio=maxBlockAspect; vector gridEntries; vector selectedIons; for(size_t ui=0;uiparent=this; for(size_t ui=0;uisetAxisAligned(gridEntries[ui].startPt, gridEntries[ui].endPt); dR->setColour(0.0f,1.0f,0.0f,1.0f); dR->setLineWidth(2); draw->drawables.push_back(dR); } draw->cached=1; filterOutputs.push_back(draw); getOut.push_back(draw); } //Vector of ion frequencies in histogram of segment counts, // each element in vector is for each ion type BINOMIAL_HIST binHist; genBinomialHistogram(gridEntries,selectedIons.size(),binHist); //If the histogram is empty, we cannot do any more if(!gridEntries.size()) return ERR_BINOMIAL_BIN_FAIL; BINOMIAL_STATS binStats; computeBinomialStats(gridEntries,binHist,selectedIons.size(),binStats); //Show binomial statistics consoleOutput.push_back(" ------ Binomial statistics ------"); string tmpStr; stream_cast(tmpStr,gridEntries.size()); consoleOutput.push_back(string("Block count:\t") + tmpStr); consoleOutput.push_back("Name\t\tMean\t\tChiSquare\t\tP_rand\t\tmu"); for(size_t ui=0;uigetName(selectedIons[ui]) + std::string("\t\t"); if(!binStats.pValueOK[ui]) { lineStr+="\t\t Not computable "; consoleOutput.push_back(lineStr); continue; } stream_cast(tmpStr,binStats.mean[ui]); lineStr+=tmpStr + string("\t\t"); stream_cast(tmpStr,binStats.chiSquare[ui]); lineStr+=tmpStr + string("\t\t"); stream_cast(tmpStr,binStats.pValue[ui]); lineStr+=tmpStr + string("\t\t"); stream_cast(tmpStr,binStats.comparisonCoeff[ui]); lineStr+=tmpStr ; consoleOutput.push_back(lineStr); } consoleOutput.push_back(" ---------------------------------"); ASSERT(binHist.mapIonFrequencies.size() == binHist.normalisedFrequencies.size()); if(!showBinomialFrequencies) return 0; for(size_t ui=0;uiindex=ui; plt->parent=this; plt->plotMode=PLOT_MODE_1D; plt->plotStyle=PLOT_LINE_STEM; plt->xLabel=TRANS("Block size"); if(showNormalisedBinomialFrequencies) plt->yLabel=TRANS("Rel. Frequency"); else plt->yLabel=TRANS("Count"); //set the title string ionName; ionName+=rngF->getName(selectedIons[ui]); plt->dataLabel = string("Binomial:") + ionName; //Set the colour to match that of the range RGBf colour; colour=rngF->getColour(selectedIons[ui]); plt->r=colour.red; plt->g=colour.green; plt->b=colour.blue; plt->xyData.resize(binHist.mapIonFrequencies[ui].size()); size_t offset=0; if(showNormalisedBinomialFrequencies) { for(map::const_iterator it=binHist.normalisedFrequencies[ui].begin(); it!=binHist.normalisedFrequencies[ui].end();++it) { plt->xyData[offset]=std::make_pair(it->first,it->second); offset++; } } else { for(map::const_iterator it=binHist.mapIonFrequencies[ui].begin(); it!=binHist.mapIonFrequencies[ui].end();++it) { plt->xyData[offset]=std::make_pair(it->first,it->second); offset++; } } cacheAsNeeded(plt); getOut.push_back(plt); } if(!showTheoreticFrequencies) return 0; for(size_t ui=0;uiindex=ui + binHist.mapIonFrequencies.size(); plt->parent=this; plt->plotMode=PLOT_MODE_1D; plt->plotStyle=PLOT_LINE_STEM; plt->xLabel=TRANS("Block size"); if(showNormalisedBinomialFrequencies) plt->yLabel=TRANS("Rel. Frequency"); else plt->yLabel=TRANS("Count"); //set the title string ionName; ionName+=rngF->getName(selectedIons[ui]); plt->dataLabel = string("Binomial (theory):") + ionName; //Set the colour to match that of the range RGBf colour; colour=rngF->getColour(selectedIons[ui]); plt->r=colour.red; plt->g=colour.green; plt->b=colour.blue; plt->xyData.resize(binHist.theoreticFrequencies[ui].size()); size_t offset=0; if(showNormalisedBinomialFrequencies) { for(map::const_iterator it=binHist.theoreticNormalisedFrequencies[ui].begin(); it!=binHist.theoreticNormalisedFrequencies[ui].end();++it) { plt->xyData[offset]=std::make_pair(it->first,it->second); offset++; } } else { for(map::const_iterator it=binHist.theoreticFrequencies[ui].begin(); it!=binHist.theoreticFrequencies[ui].end();++it) { plt->xyData[offset]=std::make_pair(it->first,it->second); offset++; } } cacheAsNeeded(plt); getOut.push_back(plt); } return 0; } size_t SpatialAnalysisFilter::algorithmLocalConcentration(ProgressData &progress, size_t totalDataSize, const vector &dataIn, vector &getOut,const RangeFile *rngF) { vector pSource; #ifdef _OPENMP bool spin=false; #endif if(stopMode == STOP_MODE_RADIUS) { vector numeratorPts,denominatorPts; progress.step=1; progress.stepName=TRANS("Collate"); progress.filterProgress=0; progress.maxStep=4; //Build the numerator and denominator points unsigned int errCode; errCode = buildSplitPoints(dataIn, progress, totalDataSize, rngF, ionNumeratorEnabled,ionDenominatorEnabled,numeratorPts,denominatorPts); if(errCode) return errCode; if(*Filter::wantAbort) return ERR_ABORT_FAIL; progress.step=2; progress.stepName = TRANS("Build Numerator"); progress.filterProgress=0; //Build the tree (its roughly nlogn timing, but worst case n^2) K3DTreeMk2 treeNumerator,treeDenominator; treeNumerator.resetPts(numeratorPts); if(*Filter::wantAbort) return ERR_ABORT_FAIL; treeNumerator.build(); if(*Filter::wantAbort) return ERR_ABORT_FAIL; progress.step=3; progress.stepName = TRANS("Build Denominator"); progress.filterProgress=0; treeDenominator.resetPts(denominatorPts); treeDenominator.build(); if(*Filter::wantAbort) return ERR_ABORT_FAIL; unsigned int sizeNeeded=0; //Count the array size that we need to store the points for(unsigned int ui=0; uigetStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *d; d=((const IonStreamData *)dataIn[ui]); unsigned int ionID; ionID=getIonstreamIonID(d,rngF); //Check to see if we have a grouped set of ions if(ionID == (unsigned int)-1) { //we have ungrouped ions, so work out size individually for(unsigned int uj=0;ujdata.size();uj++) { ionID = rngF->getIonID(d->data[uj].getMassToCharge()); if(ionID != (unsigned int)-1 && ionSourceEnabled[ionID]) sizeNeeded++; } break; } if(ionSourceEnabled[ionID]) sizeNeeded+=d->data.size(); } } } pSource.resize(sizeNeeded); //Build the array of output points //-- size_t curOffset=0; for(unsigned int ui=0; uigetStreamType()) { case STREAM_TYPE_IONS: { unsigned int ionID; const IonStreamData *d; d=((const IonStreamData *)dataIn[ui]); ionID=getIonstreamIonID(d,rngF); if(ionID==(unsigned int)(-1)) { //we have ungrouped ions, so work out size individually for(unsigned int uj=0;ujdata.size();uj++) { ionID = rngF->getIonID(d->data[uj].getMassToCharge()); if(ionID != (unsigned int)-1 && ionSourceEnabled[ionID]) { pSource[curOffset] = d->data[uj]; curOffset++; } } break; } if(ionSourceEnabled[ionID]) { std::copy(d->data.begin(),d->data.end(),pSource.begin()+curOffset); curOffset+=d->data.size(); } break; } default: break; } if(*Filter::wantAbort) return false; } ASSERT(curOffset == pSource.size()); //-- progress.step=4; progress.stepName = TRANS("Compute"); progress.filterProgress=0; //Loop through the array, and perform local search on each tree #pragma omp parallel for schedule(dynamic) for(unsigned int ui=0;ui ptsNum,ptsDenom; //Find the points that are within the search radius treeNumerator.ptsInSphere(pSource[ui].getPosRef(),distMax,ptsNum); treeDenominator.ptsInSphere(pSource[ui].getPosRef(),distMax,ptsDenom); //Check to see if there is any self-matching going on. Don't allow zero-distance matches // as this biases the composition towards the chosen source points //TODO: Is there a faster way to do this? We might be able to track the original index of the point // that we built, and map it back to the input? //-- unsigned int nCount,dCount; nCount=0; for(unsigned int uj=0;uj DISTANCE_EPSILON) nCount++; } dCount=0; for(unsigned int uj=0;uj DISTANCE_EPSILON) dCount++; } //-- //compute concentration if( nCount + dCount ) pSource[ui].setMassToCharge((float)nCount/(float)(nCount + dCount)*100.0f); else pSource[ui].setMassToCharge(-1.0f); #ifdef _OPENMP #pragma omp critical if(!omp_get_thread_num()) { #endif //let master thread do update progress.filterProgress= (unsigned int)((float)ui/(float)pSource.size()*100.0f); if(*Filter::wantAbort) { #ifndef _OPENMP return ERR_ABORT_FAIL; #else #pragma atomic spin=true; #endif } #ifdef _OPENMP } #endif } } else if(stopMode == STOP_MODE_NEIGHBOUR) { //Merge the numerator and denominator ions into a single search tree vector enabledSearchIons; enabledSearchIons.resize(rngF->getNumIons()); for(unsigned int ui=0;ui pTarget; //FIXME: This is highly memory inefficient - // we build points, then throw them awaway. // We should build and range at the same time buildSplitPoints(dataIn,progress,totalDataSize,rngF, ionSourceEnabled,enabledSearchIons, pSource, pTarget); if(*Filter::wantAbort) return ERR_ABORT_FAIL; if(pTarget.size() < nnMax) return INSUFFICIENT_SIZE_ERR; progress.step=2; progress.stepName=TRANS("Build"); progress.filterProgress=0; //Keep a copy of the mass to charge data vector dataMasses; dataMasses.resize(pTarget.size()); #pragma omp parallel for for(unsigned int ui=0;ui ptsFound; //Points from the tree we have already found. Abort if we cannot find enough NNs to satisfy search while(ptsFound.size() DISTANCE_EPSILON) ptsFound.insert(ptIdx); } unsigned int nCount; unsigned int dCount; nCount=dCount=0; //Count the number of numerator and denominator ions, using the masses we set aside earlier for(set::iterator it=ptsFound.begin(); it!=ptsFound.end(); ++it) { float ionMass; //check that the distance is non-zero, to force no self-matching ionMass = dataMasses[searchTree.getOrigIndex(*it)]; unsigned int ionID; ionID = rngF->getIonID(ionMass); //Ion can be either numerator or denominator OR BOTH. if(ionNumeratorEnabled[ionID]) nCount++; if(ionDenominatorEnabled[ionID]) dCount++; } //compute concentration pSource[ui].setMassToCharge((float)nCount/(float)(nCount + dCount)*100.0f); #ifdef _OPENMP if(!omp_get_thread_num()) { #endif //let master thread do update progress.filterProgress= (unsigned int)((float)ui/(float)pSource.size()*100.0f); if(*Filter::wantAbort) { #ifndef _OPENMP return ERR_ABORT_FAIL; #else #pragma atomic spin=true; #endif } #ifdef _OPENMP } #endif } } else { //Should not get here... ASSERT(false); return ERR_ABORT_FAIL; } #ifdef _OPENMP if(spin) { ASSERT(*Filter::wantAbort); return ERR_ABORT_FAIL; } #endif progress.filterProgress=100; if(pSource.size()) { IonStreamData *outData = new IonStreamData(this); //make a guess as to desired size/colour outData->estimateIonParameters(dataIn); //override colour to grey outData->g = outData->b = outData->r = 0.5; outData->valueType = "Relative Conc. (%)"; outData->data.swap(pSource); cacheAsNeeded(outData); getOut.push_back(outData); } return 0; } #ifdef DEBUG bool densityPairTest(); bool nnHistogramTest(); bool rdfPlotTest(); bool axialDistTest(); bool replaceTest(); bool localConcTestRadius(); bool localConcTestNN(); bool SpatialAnalysisFilter::runUnitTests() { if(!densityPairTest()) return false; if(!nnHistogramTest()) return false; if(!rdfPlotTest()) return false; if(!axialDistTest()) return false; if(!replaceTest()) return false; if(!localConcTestRadius()) return false; if(!localConcTestNN()) return false; return true; } bool densityPairTest() { //Build some points to pass to the filter vector streamIn,streamOut; IonStreamData*d = new IonStreamData; IonHit h; h.setMassToCharge(1); //create two points, 1 unit apart h.setPos(Point3D(0,0,0)); d->data.push_back(h); h.setPos(Point3D(0,0,1)); d->data.push_back(h); streamIn.push_back(d); //--------- //Create a spatial analysis filter SpatialAnalysisFilter *f=new SpatialAnalysisFilter; f->setCaching(false); //Set it to do an NN terminated density computation bool needUp; string s; s=TRANS(STOP_MODES[STOP_MODE_NEIGHBOUR]); TEST(f->setProperty(KEY_STOPMODE,s,needUp),"Set prop"); s=TRANS(SPATIAL_ALGORITHMS[ALGORITHM_DENSITY]); TEST(f->setProperty(KEY_ALGORITHM,s,needUp),"Set prop"); //Do the refresh ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"refresh OK"); delete f; //Kill the input ion stream delete d; streamIn.clear(); TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); const IonStreamData* dOut = (const IonStreamData*)streamOut[0]; TEST(dOut->data.size() == 2, "ion count"); for(unsigned int ui=0;ui<2;ui++) { TEST( fabs( dOut->data[0].getMassToCharge() - 1.0/(4.0/3.0*M_PI)) < sqrtf(std::numeric_limits::epsilon()),"NN density test"); } delete streamOut[0]; return true; } bool nnHistogramTest() { //Build some points to pass to the filter vector streamIn,streamOut; IonStreamData*d = new IonStreamData; IonHit h; h.setMassToCharge(1); //create two points, 1 unit apart h.setPos(Point3D(0,0,0)); d->data.push_back(h); h.setPos(Point3D(0,0,1)); d->data.push_back(h); streamIn.push_back(d); //Create a spatial analysis filter SpatialAnalysisFilter *f=new SpatialAnalysisFilter; f->setCaching(false); //Set it to do an NN terminated density computation bool needUp; TEST(f->setProperty(KEY_STOPMODE, STOP_MODES[STOP_MODE_NEIGHBOUR],needUp),"set stop mode"); TEST(f->setProperty(KEY_ALGORITHM, SPATIAL_ALGORITHMS[ALGORITHM_RDF],needUp),"set Algorithm"); TEST(f->setProperty(KEY_NNMAX,"1",needUp),"Set NNmax"); //Do the refresh ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"refresh OK"); delete f; streamIn.clear(); TEST(streamOut.size() == 2,"stream count"); delete streamOut[1]; //wont use this TEST(streamOut[0]->getStreamType() == STREAM_TYPE_PLOT,"plot outputting"); const PlotStreamData* dPlot=(const PlotStreamData *)streamOut[0]; float fMax=0; for(size_t ui=0;uixyData.size();ui++) { fMax=std::max(fMax,dPlot->xyData[ui].second); } TEST(fMax > 0 , "plot has nonzero contents"); //Kill the input ion stream delete d; delete dPlot; return true; } bool rdfPlotTest() { //Build some points to pass to the filter vector streamIn,streamOut; IonStreamData*d = new IonStreamData; IonHit h; h.setMassToCharge(1); //create two points, 1 unit apart h.setPos(Point3D(0,0,0)); d->data.push_back(h); h.setPos(Point3D(0,0,1)); d->data.push_back(h); streamIn.push_back(d); //Create a spatial analysis filter SpatialAnalysisFilter *f=new SpatialAnalysisFilter; f->setCaching(false); //Set it to do an NN terminated density computation bool needUp; TEST(f->setProperty(KEY_STOPMODE, TRANS(STOP_MODES[STOP_MODE_RADIUS]),needUp),"set stop mode"); TEST(f->setProperty(KEY_ALGORITHM, TRANS(SPATIAL_ALGORITHMS[ALGORITHM_RDF]),needUp),"set Algorithm"); TEST(f->setProperty(KEY_DISTMAX,"2",needUp),"Set NNmax"); //Do the refresh ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"refresh OK"); delete f; streamIn.clear(); TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_PLOT,"plot outputting"); const PlotStreamData* dPlot=(const PlotStreamData *)streamOut[0]; float fMax=0; for(size_t ui=0;uixyData.size();ui++) { fMax=std::max(fMax,dPlot->xyData[ui].second); } TEST(fMax > 0 , "plot has nonzero contents"); //kill output data delete dPlot; //Kill the input ion stream delete d; return true; } bool axialDistTest() { //Build some points to pass to the filter vector streamIn,streamOut; //Create some input data //-- IonStreamData*d = new IonStreamData; IonHit h; h.setMassToCharge(1); //create two points along axis h.setPos(Point3D(0,0,0)); d->data.push_back(h); h.setPos(Point3D(0.5,0.5,0.5)); d->data.push_back(h); streamIn.push_back(d); //-- //Create a spatial analysis filter SpatialAnalysisFilter *f=new SpatialAnalysisFilter; f->setCaching(false); //Set it to do an axial-dist calculation, // - NN mode termination, // - Axial mode // - /0 origin, /1 direction, r=1 // //--- bool needUp; string s; s=TRANS(SPATIAL_ALGORITHMS[ALGORITHM_AXIAL_DF]); TEST(f->setProperty(KEY_ALGORITHM,s,needUp),"Set prop (algorithm)"); s=TRANS(STOP_MODES[STOP_MODE_NEIGHBOUR]); TEST(f->setProperty(KEY_STOPMODE,s,needUp),"Set prop (stopmode)"); Point3D originPt(0,0,0), axisPt(1.1,1.1,1.1); float radiusCyl; radiusCyl = 1.0f; stream_cast(s,originPt); TEST(f->setProperty(KEY_ORIGIN,s,needUp),"Set prop (origin)"); stream_cast(s,axisPt); TEST(f->setProperty(KEY_NORMAL,s,needUp),"Set prop (axis)"); stream_cast(s,radiusCyl); TEST(f->setProperty(KEY_RADIUS,s,needUp),"Set prop (radius)"); TEST(f->setProperty(KEY_REMOVAL,"0",needUp),"Set prop (disable surface removal)"); //Do the refresh ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"Checking refresh code"); delete f; //Kill the input ion stream delete d; streamIn.clear(); //1 plot, one set of ions TEST(streamOut.size() == 2,"stream count"); size_t streamMask=0; for(size_t ui=0;uigetStreamType(); delete streamOut[ui]; } TEST(streamMask == ( STREAM_TYPE_DRAW | STREAM_TYPE_PLOT) , "Stream type checking"); return true; } bool replaceTest() { std::string ionFile=createTmpFilename(NULL,".pos"); vector ions; const unsigned int NIONS=10; for(unsigned int ui=0;uidata.swap(ions); //Create a spatial analysis filter SpatialAnalysisFilter *f=new SpatialAnalysisFilter; f->setCaching(false); //Set it to do a union calculation bool needUp; string s; s=TRANS(SPATIAL_ALGORITHMS[ALGORITHM_REPLACE]); TEST(f->setProperty(KEY_ALGORITHM,s,needUp),"Set prop"); TEST(f->setProperty(KEY_REPLACE_FILE,ionFile,needUp),"Set prop"); s=TRANS(REPLACE_ALGORITHMS[REPLACE_MODE_INTERSECT]); TEST(f->setProperty(KEY_REPLACE_ALGORITHM,s,needUp),"Set prop"); s="1"; TEST(f->setProperty(KEY_REPLACE_VALUE,s,needUp),"Set prop"); //Do the refresh ProgressData p; vector streamIn,streamOut; streamIn.push_back(d); TEST(!f->refresh(streamIn,streamOut,p),"refresh OK"); delete f; delete d; streamIn.clear(); TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); TEST(streamOut[0]->getNumBasicObjects() == NIONS,"Number objects"); //we should have taken the mass-to-charge from the file const IonStreamData *outIons = (const IonStreamData*)streamOut[0]; for(unsigned int ui=0;uidata[ui].getMassToCharge() == 1); } wxRemoveFile(ionFile); delete streamOut[0]; return true; } //--- Local concentration tests -- const IonStreamData *createLCIonStream() { IonStreamData*d = new IonStreamData; IonHit h; //create some points, of differing mass-to-charge //1 "A" ion, mass 1 //1 "B" ion, mass 2 //2 "C" ions,mass 3 h.setPos(Point3D(0,0,0)); h.setMassToCharge(1); d->data.push_back(h); h.setPos(Point3D(0.49,0.0,0.0)); h.setMassToCharge(2); d->data.push_back(h); h.setPos(Point3D(0.0,0.5,0.0)); h.setMassToCharge(3); d->data.push_back(h); h.setPos(Point3D(0.0,0.0,0.51)); h.setMassToCharge(3); d->data.push_back(h); return d; } RangeStreamData *createLCRangeStream() { //Create a fake rangefile RangeStreamData *r= new RangeStreamData; RangeFile *rng = new RangeFile; RGBf colour; colour.red=colour.blue=colour.green=0.5; unsigned int iid[3], rid[3]; iid[0] = rng->addIon("A","A",colour); iid[1] = rng->addIon("B","B",colour); iid[2] = rng->addIon("C","C",colour); rid[0]=rng->addRange(0.5,1.5,iid[0]); rid[1]=rng->addRange(1.51,2.5,iid[1]); rid[2]=rng->addRange(2.51,3.5,iid[2]); r->rangeFile=rng; r->enabledRanges.resize(3,1); r->enabledIons.resize(3,1); return r; } SpatialAnalysisFilter *createLCTestSpatialFilter(const vector &in) { //Create a spatial analysis filter SpatialAnalysisFilter *f=new SpatialAnalysisFilter; f->setCaching(false); //inform it about the rangefile vector< const FilterStreamData *> out; f->initFilter(in,out); //Set Filter to perform local concentration analysis // - dist termination, //--- bool needUp; string s; s=TRANS(SPATIAL_ALGORITHMS[ALGORITHM_LOCAL_CONCENTRATION]); if(!(f->setProperty(KEY_ALGORITHM,s,needUp)) ) { cerr << "Failed Set prop (algorithm)"; return 0; } //Set enable/disable status (one for each) // A ions - source. B ions - numerator, C ions - denominator for(unsigned int ui=0; ui<3; ui++) { if(ui!=0) { if(!(f->setProperty(Filter::muxKey(KEYTYPE_ENABLE_SOURCE,ui),"0",needUp)) ) return 0; } if(ui!=1) { if(!(f->setProperty(Filter::muxKey(KEYTYPE_ENABLE_NUMERATOR,ui),"0",needUp)) ) return 0; } if(ui!=2) { if(!(f->setProperty(Filter::muxKey(KEYTYPE_ENABLE_DENOMINATOR,ui),"0",needUp))) return 0; } } //--- return f; } bool localConcTestRadius() { //Build some points to pass to the filter vector streamIn,streamOut; //Create some input data //-- RangeStreamData *rngStream=createLCRangeStream(); streamIn.push_back(rngStream); streamIn.push_back(createLCIonStream()); //-- SpatialAnalysisFilter *f=createLCTestSpatialFilter(streamIn); f->initFilter(streamIn,streamOut); bool needUp; string s; s=TRANS(STOP_MODES[STOP_MODE_RADIUS]); TEST(f->setProperty(KEY_STOPMODE,s,needUp),"Failed Set prop (stop mode)"); s="1.0"; TEST(f->setProperty(KEY_DISTMAX,s,needUp),"Failed Set prop (maxDist)"); //Do the refresh ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"Checking refresh code"); delete f; //FIXME: Check the data coming out TEST(streamOut.size() == 1,"stream size"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); TEST(streamOut[0]->getNumBasicObjects() == 1,"output ion count"); IonStreamData *ionD = (IonStreamData *)streamOut[0]; float localConc = ionD->data[0].getMassToCharge(); TEST(EQ_TOL(localConc,1.0/3.0*100.0),"Local Concentration check"); delete rngStream->rangeFile; for(unsigned int ui=0;ui streamIn,streamOut; //Create some input data //-- RangeStreamData *rngStream=createLCRangeStream(); streamIn.push_back(rngStream); streamIn.push_back(createLCIonStream()); //-- SpatialAnalysisFilter *f=createLCTestSpatialFilter(streamIn); f->initFilter(streamIn,streamOut); bool needUp; string s; s=TRANS(STOP_MODES[STOP_MODE_NEIGHBOUR]); TEST(f->setProperty(KEY_STOPMODE,s,needUp),"Failed Set prop (stop mode)"); s="3"; TEST(f->setProperty(KEY_NNMAX,s,needUp),"Failed Set prop (nnMax)"); //Do the refresh ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"Checking refresh code"); delete f; //FIXME: Check the data coming out TEST(streamOut.size() == 1,"stream size"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS,"stream type"); TEST(streamOut[0]->getNumBasicObjects() == 1,"output ion count"); IonStreamData *ionD = (IonStreamData *)streamOut[0]; float localConc = ionD->data[0].getMassToCharge(); TEST(EQ_TOL(localConc,1.0/3.0*100.0),"Local Concentration check"); delete rngStream->rangeFile; for(unsigned int ui=0;ui. */ #ifndef TRANSFORM_H #define TRANSFORM_H #include "../filter.h" #include "../../common/translation.h" //!Affine transformation filter class TransformFilter : public Filter { private: //!Transform mode (scale, rotate, translate) unsigned int transformMode; //!Show origin if needed; bool showOrigin; //!Mode for selection of origin for transform unsigned int originMode; //!Mode for particular noise type unsigned int noiseType; //!Scalar values for transformation (scaling factors, rotation angle ) std::vector scalarParams; //!Vector values for transformation (translation or rotation vectors) std::vector vectorParams; //!Should we show the origin primitive markers? bool showPrimitive; static std::string getOriginTypeString(unsigned int i); static std::string getNoiseTypeString(unsigned int i); //!Make the marker sphere DrawStreamData* makeMarkerSphere(SelectionDevice* &s) const; //!random number generator RandNumGen randGen; public: TransformFilter(); //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; //!Returns -1, as range file cache size is dependant upon input. virtual size_t numBytesForCache(size_t nObjects) const; //!Returns FILTER_TYPE_TRANSFORM unsigned int getType() const { return FILTER_TYPE_TRANSFORM;}; //update filter unsigned int refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress); //!Force a re-read of the rangefile Return value is range file reading error code unsigned int updateRng(); virtual std::string typeString() const { return std::string(TRANS("Ion. Transform"));}; //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter bool setProperty(unsigned int key, const std::string &value, bool &needUpdate); //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Dump state to output stream, using specified format bool writeState(std::ostream &f,unsigned int format, unsigned int depth=0) const; //!Read the state of the filter from XML file. If this //fails, filter will be in an undefined state. bool readState(xmlNodePtr &node, const std::string &packDir); //!Get the stream types that will be dropped during ::refresh unsigned int getRefreshBlockMask() const; //!Get the stream types that will be generated during ::refresh unsigned int getRefreshEmitMask() const; //!Get the stream types that will be generated during ::refresh unsigned int getRefreshUseMask() const; //!Set internal property value using a selection binding (Disabled, this filter has no bindings) void setPropFromBinding(const SelectionBinding &b); #ifdef DEBUG bool runUnitTests(); #endif }; #endif 3Depict-0.0.19/src/backend/filters/ionColour.cpp0000644000175000017500000003520612716174467021010 0ustar pcuserpcuser/* * ionColour.cpp - Filter to create coloured batches of ions based upon value * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "ionColour.h" #include "filterCommon.h" #include "common/colourmap.h" using std::vector; using std::string; using std::pair; using std::make_pair; const unsigned int MAX_NUM_COLOURS=256; enum { KEY_IONCOLOURFILTER_COLOURMAP, KEY_IONCOLOURFILTER_MAPSTART, KEY_IONCOLOURFILTER_MAPEND, KEY_IONCOLOURFILTER_NCOLOURS, KEY_IONCOLOURFILTER_REVERSE, KEY_IONCOLOURFILTER_SHOWBAR, KEY_IONCOLOURFILTER_ALPHA, }; enum { IONCOLOUR_ABORT_ERR }; IonColourFilter::IonColourFilter() : colourMap(0),reverseMap(false), nColours(MAX_NUM_COLOURS),showColourBar(true), alpha(1.0f) { mapBounds[0] = 0.0f; mapBounds[1] = 100.0f; cacheOK=false; cache=true; //By default, we should cache, but decision is made higher up } Filter *IonColourFilter::cloneUncached() const { IonColourFilter *p=new IonColourFilter(); p->colourMap = colourMap; p->mapBounds[0]=mapBounds[0]; p->mapBounds[1]=mapBounds[1]; p->nColours =nColours; p->alpha = alpha; p->showColourBar =showColourBar; p->reverseMap=reverseMap; //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->userString=userString; return p; } size_t IonColourFilter::numBytesForCache(size_t nObjects) const { return (size_t)((float)(nObjects*IONDATA_SIZE)); } unsigned int IonColourFilter::refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress) { //use the cached copy if we have it. if(cacheOK) { ASSERT(filterOutputs.size()); propagateStreams(dataIn,getOut,getRefreshBlockMask(),true); propagateCache(getOut); return 0; } ASSERT(nColours >0 && nColours<=MAX_NUM_COLOURS); IonStreamData *d[nColours]; unsigned char rgb[3]; //RGB array //Build the colourmap values, each as a unique filter output for(unsigned int ui=0;uiparent=this; float value; value = (float)ui*(mapBounds[1]-mapBounds[0])/(float)nColours + mapBounds[0]; //Pick the desired colour map colourMapWrap(colourMap,rgb,value,mapBounds[0],mapBounds[1],reverseMap); d[ui]->r=rgb[0]/255.0f; d[ui]->g=rgb[1]/255.0f; d[ui]->b=rgb[2]/255.0f; d[ui]->a=1.0f; } //Try to maintain ion size if possible bool haveIonSize,sameSize; // have we set the ionSize? float ionSize; haveIonSize=false; sameSize=true; //Did we find any ions in this pass? bool foundIons=false; unsigned int totalSize=numElements(dataIn); unsigned int curProg=NUM_CALLBACK; size_t n=0; for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { foundIons=true; //Check for ion size consistency if(haveIonSize) { sameSize &= (fabs(ionSize-((const IonStreamData *)dataIn[ui])->ionSize) < std::numeric_limits::epsilon()); } else { ionSize=((const IonStreamData *)dataIn[ui])->ionSize; haveIonSize=true; } for(vector::const_iterator it=((const IonStreamData *)dataIn[ui])->data.begin(); it!=((const IonStreamData *)dataIn[ui])->data.end(); ++it) { //Work out the colour map assignment from the mass to charge. // linear assignment in range unsigned int colour; float tmp; tmp= (it->getMassToCharge()-mapBounds[0])/(mapBounds[1]-mapBounds[0]); tmp = std::max(0.0f,tmp); tmp = std::min(tmp,1.0f); colour=(unsigned int)(tmp*(float)(nColours-1)); d[colour]->data.push_back(*it); //update progress every CALLBACK ions if(!curProg--) { n+=NUM_CALLBACK; progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); curProg=NUM_CALLBACK; if(*Filter::wantAbort) { for(unsigned int ui=0;uidrawables.push_back(makeColourBar(mapBounds[0],mapBounds[1],nColours,colourMap,reverseMap,alpha)); d->parent=this; cacheAsNeeded(d); getOut.push_back(d); } //If all the ions are the same size, then propagate if(haveIonSize && sameSize) { for(unsigned int ui=0;uiionSize=ionSize; } //merge the results as needed if(cache) { for(unsigned int ui=0;uidata.size()) d[ui]->cached=1; else d[ui]->cached=0; if(d[ui]->data.size()) filterOutputs.push_back(d[ui]); } cacheOK=filterOutputs.size(); } else { for(unsigned int ui=0;uicached=0; } cacheOK=false; } //push the colours onto the output. cached or not (their status is set above). for(unsigned int ui=0;uidata.size()) getOut.push_back(d[ui]); else delete d[ui]; } return 0; } void IonColourFilter::getProperties(FilterPropGroup &propertyList) const { FilterProperty p; string tmpStr; vector > choices; size_t curGroup=0; for(unsigned int ui=0;ui=NUM_COLOURMAPS || tmpMap ==colourMap) return false; clearCache(); needUpdate=true; colourMap=tmpMap; break; } case KEY_IONCOLOURFILTER_REVERSE: { if(!applyPropertyNow(reverseMap,value,needUpdate)) return false; break; } case KEY_IONCOLOURFILTER_MAPSTART: { float tmpBound; if(stream_cast(tmpBound,value)) return false; if(tmpBound >=mapBounds[1]) return false; clearCache(); needUpdate=true; mapBounds[0]=tmpBound; break; } case KEY_IONCOLOURFILTER_MAPEND: { float tmpBound; if(stream_cast(tmpBound,value)) return false; if(tmpBound <=mapBounds[0]) return false; clearCache(); needUpdate=true; mapBounds[1]=tmpBound; break; } case KEY_IONCOLOURFILTER_NCOLOURS: { unsigned int numColours; if(stream_cast(numColours,value)) return false; clearCache(); needUpdate=true; //enforce 1->MAX_NUM_COLOURS range nColours=std::min(numColours,MAX_NUM_COLOURS); if(!nColours) nColours=1; break; } case KEY_IONCOLOURFILTER_SHOWBAR: { if(!applyPropertyNow(showColourBar,value,needUpdate)) return false; break; } case KEY_IONCOLOURFILTER_ALPHA: { if(!applyPropertyNow(alpha,value,needUpdate)) return false; break; } default: ASSERT(false); } return true; } std::string IonColourFilter::getSpecificErrString(unsigned int code) const { //Currently the only error is aborting return std::string(TRANS("Aborted")); } void IonColourFilter::setPropFromBinding(const SelectionBinding &b) { ASSERT(false); } bool IonColourFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<" << trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth) << "" << endl; break; } default: ASSERT(false); return false; } return true; } bool IonColourFilter::readState(xmlNodePtr &nodePtr, const std::string &stateFileDir) { //Retrieve user string //=== if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlChar *xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //=== std::string tmpStr; //Retrieve colourmap //==== if(XMLHelpFwdToElem(nodePtr,"colourmap")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to digit if(stream_cast(colourMap,tmpStr)) return false; if(colourMap>= NUM_COLOURMAPS) return false; xmlFree(xmlString); if(XMLHelpGetProp(alpha, nodePtr,"opacity")) { alpha=1.0f; } else { //clamp alpha to [0,1] alpha = std::max(0.0f,std::min(alpha,1.0f)); } //==== //Retrieve Extrema //=== float tmpMin,tmpMax; if(XMLHelpFwdToElem(nodePtr,"extrema")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"min"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to digit if(stream_cast(tmpMin,tmpStr)) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"max"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to digit if(stream_cast(tmpMax,tmpStr)) return false; xmlFree(xmlString); if(tmpMin > tmpMax) return false; mapBounds[0]=tmpMin; mapBounds[1]=tmpMax; //=== //Retrieve num colours //==== if(XMLHelpFwdToElem(nodePtr,"ncolours")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to digit if(stream_cast(nColours,tmpStr)) return false; xmlFree(xmlString); //==== //Retrieve num colours //==== if(XMLHelpFwdToElem(nodePtr,"showcolourbar")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to digit if(stream_cast(showColourBar,tmpStr)) return false; xmlFree(xmlString); //==== //Check for colour map reversal //===== if(XMLHelpFwdToElem(nodePtr,"reversemap")) { //Didn't exist prior to 0.0.15, assume off reverseMap=false; } else { xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; tmpStr=(char *)xmlString; //convert from string to bool if(!boolStrDec(tmpStr,reverseMap)) return false; } xmlFree(xmlString); //==== return true; } unsigned int IonColourFilter::getRefreshBlockMask() const { //Anything but ions can go through this filter. return STREAM_TYPE_IONS; } unsigned int IonColourFilter::getRefreshEmitMask() const { return STREAM_TYPE_DRAW | STREAM_TYPE_IONS; } unsigned int IonColourFilter::getRefreshUseMask() const { return STREAM_TYPE_IONS; } #ifdef DEBUG IonStreamData *sythIonCountData(unsigned int numPts, float mStart, float mEnd) { IonStreamData *d = new IonStreamData; d->data.resize(numPts); for(unsigned int ui=0; uidata[ui] =h; } return d; } bool ionCountTest() { const int NUM_PTS=1000; vector streamIn,streamOut; IonStreamData *d=sythIonCountData(NUM_PTS,0,100); streamIn.push_back(d); IonColourFilter *f = new IonColourFilter; f->setCaching(false); bool needUpdate; TEST(f->setProperty(KEY_IONCOLOURFILTER_NCOLOURS,"100",needUpdate),"Set prop"); TEST(f->setProperty(KEY_IONCOLOURFILTER_MAPSTART,"0",needUpdate),"Set prop"); TEST(f->setProperty(KEY_IONCOLOURFILTER_MAPEND,"100",needUpdate),"Set prop"); TEST(f->setProperty(KEY_IONCOLOURFILTER_SHOWBAR,"0",needUpdate),"Set prop"); ProgressData p; TEST(!f->refresh(streamIn,streamOut,p),"refresh error code"); delete f; delete d; TEST(streamOut.size() == 99,"stream count"); for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_IONS,"stream type"); } for(unsigned int ui=0;ui. */ #include "dataLoad.h" //Needed for modification time #include #include #include "../../wx/wxcommon.h" #include "filterCommon.h" #include "backend/APT/APTFileIO.h" using std::string; using std::pair; using std::make_pair; using std::endl; //Default number of ions to load const size_t MAX_IONS_LOAD_DEFAULT=5*1024*1024/(4*sizeof(float)); //5 MB worth. // Tp prevent the dropdown lists from getting too unwieldy, set an artificial maximum const unsigned int MAX_NUM_FILE_COLS=5000; //Allowable text file deliminators const char *TEXT_DELIMINATORS = "\t ,"; //Supported data types enum { FILEDATA_TYPE_POS, FILEDATA_TYPE_TEXT, FILEDATA_TYPE_ATO, FILEDATA_TYPE_ENUM_END, // Not a data type, just end of enum }; enum { ENDIAN_MODE_AUTO, ENDIAN_MODE_LITTLE, ENDIAN_MODE_BIG, ENDIAN_MODE_ENUM_END, }; const char *ENDIAN_MODE_STR[] = { NTRANS("Auto"), NTRANS("Little"), NTRANS("Big") }; const char *AVAILABLE_FILEDATA_TYPES[] = { NTRANS("POS Data"), NTRANS("Text Data"), NTRANS("ATO Data"), }; const char *DEFAULT_LABEL="Mass-to-Charge (Da/e)"; // == Pos load filter == DataLoadFilter::DataLoadFilter() : fileType(FILEDATA_TYPE_POS), doSample(true), maxIons(MAX_IONS_LOAD_DEFAULT), rgbaf(1.0f,0.0f,0.0f,1.0f),ionSize(2.0f), numColumns(4), enabled(true), volumeRestrict(false), monitorTimestamp(-1),monitorSize((size_t)-1),wantMonitor(false), valueLabel(TRANS(DEFAULT_LABEL)), endianMode(0) { COMPILE_ASSERT(THREEDEP_ARRAYSIZE(AVAILABLE_FILEDATA_TYPES) == FILEDATA_TYPE_ENUM_END); cache=true; bound.setInverseLimits(); for (unsigned int i = 0; i < numColumns; i++) { index[i] = i; } } Filter *DataLoadFilter::cloneUncached() const { DataLoadFilter *p=new DataLoadFilter; p->ionFilename=ionFilename; p->doSample=doSample; p->maxIons=maxIons; p->ionSize=ionSize; p->fileType=fileType; //Colours p->rgbaf=rgbaf; //Bounding volume p->bound.setBounds(bound); p->volumeRestrict=volumeRestrict; p->numColumns=numColumns; p->enabled=enabled; for(size_t ui=0;uiindex[ui]=index[ui]; //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->enabled=enabled; p->userString=userString; p->wantMonitor=wantMonitor; p->numColumns=numColumns; return p; } //TODO: Simplify me - enum not required void DataLoadFilter::setFileMode(unsigned int fileMode) { switch(fileMode) { case DATALOAD_TEXT_FILE: fileType=FILEDATA_TYPE_TEXT; break; case DATALOAD_FLOAT_FILE: fileType=FILEDATA_TYPE_POS; break; case DATALOAD_LAWATAP_ATO_FILE: fileType=FILEDATA_TYPE_ATO; break; default: ASSERT(false); } } void DataLoadFilter::setFilename(const char *name) { ionFilename = name; guessNumColumns(); } void DataLoadFilter::setFilename(const std::string &name) { ionFilename = name; guessNumColumns(); } void DataLoadFilter::guessNumColumns() { //Test the extension to determine what we will do string extension; if(ionFilename.size() > 4) extension = ionFilename.substr ( ionFilename.size() - 4, 4 ); //By default, return 4. If you want to have other file types, // uncomment the below numColumns=4; /* //Set extension to lowercase version for(size_t ui=0;ui &dataIn, std::vector &getOut, ProgressData &progress) { errStr=""; //use the cached copy if we have it. if(cacheOK) { bool doUseCache=true; //If we are monitoring the file, //the cache is only valid if we have //the same timestamp as on the file. if(wantMonitor) { if(!wxFile::Exists((ionFilename))) { monitorTimestamp=-1; monitorSize=-1; doUseCache=false; clearCache(); } else { //How can we have a valid cache if we don't //have a valid load time? ASSERT(monitorTimestamp!=-1 && monitorSize!=(size_t)-1); size_t fileSizeVal; getFilesize(ionFilename.c_str(),fileSizeVal); if(wxFileModificationTime((ionFilename)) ==monitorTimestamp || fileSizeVal!= monitorSize) { doUseCache=false; clearCache(); } } } //Use the cache if it is still OK, otherwise use //the full function if(doUseCache) { propagateCache(getOut); propagateStreams(dataIn,getOut); progress.filterProgress=100; return 0; } } //If theres no file, then there is not a lot we can do.. if(!wxFile::Exists((ionFilename))) { wxFileName f((ionFilename)); errStr= stlStr(f.GetFullName()) + TRANS(" does not exist"); return ERR_FILE_OPEN; } //If we have disable the filter, or we are are monitoring and //there is no file if(!enabled ||(wantMonitor && !wxFile::Exists((ionFilename))) ) { monitorTimestamp=-1; monitorSize=-1; propagateStreams(dataIn,getOut); return 0; } //Update the monitoring timestamp such that we know //when the file was last loaded monitorTimestamp = wxFileModificationTime((ionFilename)); size_t tmp; if(getFilesize(ionFilename.c_str(),tmp)) monitorSize=tmp; IonStreamData *ionData = new IonStreamData; ionData->parent=this; progress.step=1; progress.stepName=TRANS("Reading File"); progress.maxStep=1; unsigned int uiErr; switch(fileType) { case FILEDATA_TYPE_POS: { if(doSample) { //Load the pos file, limiting how much you pull from it if((uiErr = LimitLoadPosFile(numColumns, INDEX_LENGTH, index, ionData->data, ionFilename.c_str(), maxIons,progress.filterProgress,(*Filter::wantAbort),strongRandom))) { consoleOutput.push_back(string(TRANS("Error loading file: ")) + ionFilename); delete ionData; errStr=TRANS(POS_ERR_STRINGS[uiErr]); return uiErr; } } else { //Load the entirety of the file if((uiErr = GenericLoadFloatFile(numColumns, INDEX_LENGTH, index, ionData->data, ionFilename.c_str(), progress.filterProgress,(*Filter::wantAbort)))) { consoleOutput.push_back(string(TRANS("Error loading file: ")) + ionFilename); delete ionData; errStr=TRANS(POS_ERR_STRINGS[uiErr]); return uiErr; } } //warn the user if we have not loaded all the data. Users keep missing this //-- size_t fileSizeVal; getFilesize(ionFilename.c_str(),fileSizeVal); size_t numAvailable=fileSizeVal/(numColumns*sizeof(float)); if(ionData->data.size() < numAvailable) { string strNumLoaded,strNumAvailable; stream_cast(strNumLoaded,ionData->data.size()); stream_cast(strNumAvailable,numAvailable); consoleOutput.push_back(string(TRANS("Sampling is active, loaded ")) + strNumLoaded + string( TRANS(" of " ) ) + strNumAvailable + string(TRANS(" available."))); } else { string strNumAvailable; stream_cast(strNumAvailable,numAvailable); consoleOutput.push_back(string(TRANS("Loaded entire dataset, " )) + strNumAvailable + string(TRANS(" points."))); } //-- break; } case FILEDATA_TYPE_TEXT: { vector > outDat; vector headerData; if(doSample) { //Load the output data using a random sampling technique. Load up to 4 data columns if((uiErr=limitLoadTextFile(4,outDat,ionFilename.c_str(), TEXT_DELIMINATORS,maxIons,progress.filterProgress,(*Filter::wantAbort),strongRandom))) { consoleOutput.push_back(string(TRANS("Error loading file: ")) + ionFilename); delete ionData; errStr=TEXT_LOAD_ERR_STRINGS[uiErr]; return uiErr; } } else { //Load the entire text data using if((uiErr=loadTextData(ionFilename.c_str(),outDat,headerData,TEXT_DELIMINATORS))) { consoleOutput.push_back(string(TRANS("Error loading file: ")) + ionFilename); delete ionData; errStr=TEXT_LOAD_ERR_STRINGS[uiErr]; return uiErr; } } //Data output must be 3 or 4 entries if(outDat.size() !=4 && outDat.size() != 3) { std::string sizeStr; stream_cast(sizeStr,outDat.size()); consoleOutput.push_back( string(TRANS("Data file contained incorrect number of columns -- should be 3 or 4, was ")) + sizeStr ); delete ionData; errStr=TEXT_LOAD_ERR_STRINGS[ERR_FILE_FORMAT]; return ERR_FILE_FORMAT; } //All columns must have the same number of entries ASSERT(outDat[0].size() == outDat[1].size() && outDat[1].size() == outDat[2].size()); ionData->data.resize(outDat[0].size()); if(outDat.size() == 4) { ASSERT(outDat[2].size() == outDat[3].size()); #pragma omp parallel for for(unsigned int ui=0;uidata[ui].setPos(outDat[0][ui],outDat[1][ui],outDat[2][ui]); ionData->data[ui].setMassToCharge(outDat[3][ui]); } } else { #pragma omp parallel for for(unsigned int ui=0;uidata[ui].setPos(outDat[0][ui],outDat[1][ui],outDat[2][ui]); ionData->data[ui].setMassToCharge(ui); } } break; } case FILEDATA_TYPE_ATO: { //TODO: Load Ato file with sampling //Load the file if((uiErr = LoadATOFile(ionFilename.c_str(), ionData->data, progress.filterProgress,(*Filter::wantAbort)))) { consoleOutput.push_back(string(TRANS("Error loading file: ")) + ionFilename); delete ionData; errStr=TRANS(LAWATAP_ATO_ERR_STRINGS[uiErr]); return uiErr; } std::string tmpSize; stream_cast(tmpSize,ionData->data.size()); consoleOutput.push_back(string(TRANS("Loaded dataset, " )) + tmpSize + string(TRANS(" points."))); break; } default: ASSERT(false); } ionData->r = rgbaf.r(); ionData->g = rgbaf.g(); ionData->b = rgbaf.b(); ionData->a = rgbaf.a(); ionData->ionSize=ionSize; ionData->valueType=valueLabel; if(ionData->data.empty()) { //Shouldn't get here... ASSERT(false); delete ionData; return 0; } progress.filterProgress=100; BoundCube dataCube; IonHit::getBoundCube(ionData->data,dataCube); if(dataCube.isNumericallyBig()) { consoleOutput.push_back( TRANS("Warning:One or more bounds of the loaded data approaches " "the limits of numerical stability for the internal data type" "(magnitude too large). Consider rescaling data before loading")); } cacheAsNeeded(ionData); //Append the ion data getOut.push_back(ionData); propagateStreams(dataIn,getOut); return 0; } void DataLoadFilter::getProperties(FilterPropGroup &propertyList) const { FilterProperty p; size_t curGroup=0; p.type=PROPERTY_TYPE_FILE; p.key=DATALOAD_KEY_FILE; p.name=TRANS("File"); p.helpText=TRANS("File from which to load data"); p.data=ionFilename; //Wx- acceptable string format p.dataSecondary = TRANS("Readable files (*.xml, *.pos, *.txt,*.csv, *.ato)|*.xml;*.pos;*.txt;*.csv;*.ato|All Files|*") ; propertyList.addProperty(p,curGroup); vector > choices; for(unsigned int ui=0;ui > endianChoices; endianChoices.resize(ENDIAN_MODE_ENUM_END); for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_IONS) { IonStreamData *i; i=(IonStreamData *)filterOutputs[ui]; i->r=rgbaf.r(); i->g=rgbaf.g(); i->b=rgbaf.b(); i->a=rgbaf.a(); } } } needUpdate=true; } break; } case DATALOAD_KEY_IONSIZE: { float ltmp; if(stream_cast(ltmp,value)) return false; if(ltmp < 0) return false; ionSize=ltmp; //Check the cache, updating it if needed if(cacheOK) { for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_IONS) { IonStreamData *i; i=(IonStreamData *)filterOutputs[ui]; i->ionSize=ionSize; } } } needUpdate=true; break; } case DATALOAD_KEY_VALUELABEL: { if(value !=valueLabel) { valueLabel=value; needUpdate=true; //Check the cache, updating it if needed if(cacheOK) { for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_IONS) { IonStreamData *i; i=(IonStreamData *)filterOutputs[ui]; i->valueType=valueLabel; } } } } break; } case DATALOAD_KEY_SELECTED_COLUMN0: { unsigned int ltmp; if(stream_cast(ltmp,value)) return false; if(ltmp >= numColumns) return false; index[0]=ltmp; needUpdate=true; clearCache(); break; } case DATALOAD_KEY_SELECTED_COLUMN1: { unsigned int ltmp; if(stream_cast(ltmp,value)) return false; if(ltmp >= numColumns) return false; index[1]=ltmp; needUpdate=true; clearCache(); break; } case DATALOAD_KEY_SELECTED_COLUMN2: { unsigned int ltmp; if(stream_cast(ltmp,value)) return false; if(ltmp >= numColumns) return false; index[2]=ltmp; needUpdate=true; clearCache(); break; } case DATALOAD_KEY_SELECTED_COLUMN3: { unsigned int ltmp; if(stream_cast(ltmp,value)) return false; if(ltmp >= numColumns) return false; index[3]=ltmp; needUpdate=true; clearCache(); break; } case DATALOAD_KEY_NUMBER_OF_COLUMNS: { unsigned int ltmp; if(stream_cast(ltmp,value)) return false; if(ltmp >= MAX_NUM_FILE_COLS) return false; numColumns=ltmp; for (unsigned int i = 0; i < INDEX_LENGTH; i++) { index[i] = (index[i] < numColumns? index[i]: numColumns - 1); } needUpdate=true; clearCache(); break; } case DATALOAD_KEY_ENDIANNESS: { unsigned int ltmp; ltmp=(unsigned int)-1; for(unsigned int ui=0;ui=FILEDATA_TYPE_ENUM_END) return false; fileType=type; xmlFree(xmlString); } else fileType=FILEDATA_TYPE_POS; //Override the string, as needed if( (stateFileDir.size()) && (ionFilename.size() > 2 && ionFilename.substr(0,2) == "./") ) { ionFilename=stateFileDir + ionFilename.substr(2); } //Filenames need to be converted from unix format (which I make canonical on disk) into native format ionFilename=convertFileStringToNative(ionFilename); //Retrieve number of columns if(!XMLGetNextElemAttrib(nodePtr,numColumns,"columns","value")) return false; if(numColumns >= MAX_NUM_FILE_COLS) return false; //Retrieve index if(XMLHelpFwdToElem(nodePtr,"xyzm")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"values"); if(!xmlString) return false; std::vector v; splitStrsRef((char *)xmlString,',',v); for (unsigned int i = 0; i < INDEX_LENGTH && i < v.size(); i++) { if(stream_cast(index[i],v[i])) return false; if(index[i] >=numColumns) return false; } xmlFree(xmlString); //Retrieve enabled/disabled //-- unsigned int tmpVal; if(!XMLGetNextElemAttrib(nodePtr,tmpVal,"enabled","value")) return false; enabled=tmpVal; //-- //Retrieve monitor mode //-- xmlNodePtr nodeTmp; nodeTmp=nodePtr; if(XMLGetNextElemAttrib(nodePtr,tmpVal,"monitor","value")) wantMonitor=tmpVal; else { nodePtr=nodeTmp; wantMonitor=false; } //-- //Retrieve value type string (eg mass-to-charge, // or whatever the data type is) //-- nodeTmp=nodePtr; if(XMLHelpFwdToElem(nodePtr,"valuetype")) { nodePtr=nodeTmp; valueLabel=TRANS(DEFAULT_LABEL); } else { xmlChar *xmlString; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; valueLabel=(char *)xmlString; xmlFree(xmlString); } //-- //Get sampling enabled/disabled //--- //TODO: Remove me: // Note, in 3Depict-0.0.10 and lower, we did not have this option, // so some statefiles will exist without this. In the case it is not // found, we need to make it up { nodeTmp=nodePtr; bool needSampleState=false; if(!XMLGetNextElemAttrib(nodePtr,doSample,"dosample","value")) { nodePtr=nodeTmp; needSampleState=true; } //--- //Get max Ions //-- //TODO: Forbid zero values - don't do it now, as we previously used this // for disabling sampling, so some users' XML files will still have this if(!XMLGetNextElemAttrib(nodePtr,maxIons,"maxions","value")) return false; if(needSampleState) doSample=maxIons; //FIXME: Compatibility hack. User preferences from 3Depict <=0.0.10 // could cause == 0 maxIons, causing an assertion error in // ::refresh() due to no ions. Override this. // In the future, we should reject this as invalid, however // it was valid for 3Depict <= 0.0.10 if(!maxIons) maxIons=MAX_IONS_LOAD_DEFAULT; //-- } //Retrieve colour //==== if(XMLHelpFwdToElem(nodePtr,"colour")) return false; if(!parseXMLColour(nodePtr,rgbaf)) return false; //==== //Retrieve drawing size value //-- if(!XMLGetNextElemAttrib(nodePtr,ionSize,"ionsize","value")) return false; //check positive or zero if(ionSize <=0) return false; //-- return true; } unsigned int DataLoadFilter::getRefreshBlockMask() const { return 0; } unsigned int DataLoadFilter::getRefreshEmitMask() const { return STREAM_TYPE_IONS; } unsigned int DataLoadFilter::getRefreshUseMask() const { return 0; } std::string DataLoadFilter::getSpecificErrString(unsigned int code) const { ASSERT(errStr.size()); return errStr; } void DataLoadFilter::setPropFromBinding(const SelectionBinding &b) { ASSERT(false); } bool DataLoadFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<" << trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << ""<< endl; f << tabs(depth+1) << ""<< endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" <" << endl; f << tabs(depth) << "" << endl; break; } default: //Shouldn't get here, unhandled format string ASSERT(false); return false; } return true; } bool DataLoadFilter::writePackageState(std::ostream &f, unsigned int format, const std::vector &valueOverrides, unsigned int depth) const { ASSERT(valueOverrides.size() == 1); //Temporarily modify the state of the filter, then call writestate string tmpIonFilename=ionFilename; //override const -- naughty, but we know what we are doing... const_cast(this)->ionFilename=valueOverrides[0]; bool result; result=writeState(f,format,depth); const_cast(this)->ionFilename=tmpIonFilename; return result; } void DataLoadFilter::getStateOverrides(std::vector &externalAttribs) const { externalAttribs.push_back(ionFilename); } bool DataLoadFilter::monitorNeedsRefresh() const { //We can only actually effect an update if the // filter is enabled (and we actually want to monitor). // otherwise, we don't need to refresh if(enabled && wantMonitor) { //Check to see that the file exists, if // not fall back to the cache. if(!wxFile::Exists((ionFilename))) return cacheOK; size_t sizeVal; getFilesize(ionFilename.c_str(),sizeVal); if(sizeVal != monitorSize) return true; return( wxFileModificationTime((ionFilename)) !=monitorTimestamp); } return false; } #ifdef DEBUG bool posFileTest(); bool textFileTest(); bool DataLoadFilter::runUnitTests() { if(!posFileTest()) return false; if(!textFileTest()) return false; return true; } bool posFileTest() { //Synthesise data, then *save* it. const unsigned int NUM_PTS=133; vector hits; hits.resize(NUM_PTS); for(unsigned int ui=0; uisetCaching(false); bool needUp; TEST(d->setProperty(DATALOAD_KEY_FILE,posName,needUp),"Set prop"); TEST(d->setProperty(DATALOAD_KEY_SAMPLE,"0",needUp),"Set prop"); //--------- vector streamIn,streamOut; ProgressData prog; TEST(!d->refresh(streamIn,streamOut,prog),"Refresh error code"); delete d; TEST(streamOut.size() == 1, "Stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS, "Stream type"); TEST(streamOut[0]->getNumBasicObjects() == hits.size(), "Stream count"); #if defined(__LINUX__) || defined(__APPLE__) //Hackish method to delete file std::string s; s=string("rm -f ") + string(posName); system(s.c_str()); #endif delete streamOut[0]; return true; } bool textFileTest() { //write some random data // with a fixed seed value RandNumGen r; r.initialise(232635); const unsigned int NUM_PTS=1000; //TODO: do better than this const char *FILENAME="test-3mdfuneaascn.txt"; //see if we can open the file for input. If so, it must exist, //and thus we don't want to overwrite it, as it may contain useful data. std::ifstream inFile(FILENAME); if(inFile) { std::string s; s="Unwilling to execute file test, will not overwrite file :"; s+=FILENAME; s+=". Test is indeterminate"; WARN(false,s.c_str()); return true; } std::ofstream outFile(FILENAME); if(!outFile) { WARN(false,"Unable to create test output file. Unit test was indeterminate. Requires write access to excution path"); return true; } vector hitVec; hitVec.resize(NUM_PTS); //Write out the file outFile << "x y\tz\tValues" << endl; for(unsigned int ui=0;uisetCaching(false); bool needUp; TEST(d->setProperty(DATALOAD_KEY_FILE,FILENAME,needUp),"Set prop"); TEST(d->setProperty(DATALOAD_KEY_SAMPLE,"0",needUp),"Set prop"); //load all data //Load data as text file TEST(d->setProperty(DATALOAD_KEY_FILETYPE, AVAILABLE_FILEDATA_TYPES[FILEDATA_TYPE_TEXT],needUp),"Set prop"); //--------- vector streamIn,streamOut; ProgressData prog; TEST(!d->refresh(streamIn,streamOut,prog),"Refresh error code"); delete d; TEST(streamOut.size() == 1, "Stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_IONS, "Stream type"); TEST(streamOut[0]->getNumBasicObjects() == NUM_PTS,"Stream count"); #if defined(__LINUX__) || defined(__APPLE__) //Hackish method to delete file std::string s; s=string("rm -f ") + string(FILENAME); system(s.c_str()); #endif delete streamOut[0]; return true; } #endif 3Depict-0.0.19/src/backend/filters/spectrumPlot.cpp0000644000175000017500000007413512716174467021544 0ustar pcuserpcuser/* * spectrumPlot.cpp - Compute histograms of values for valued 3D point data * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "spectrumPlot.h" #include "algorithms/mass.h" #include "../plot.h" #include "filterCommon.h" using std::string; using std::vector; using std::pair; //!Error codes enum { SPECTRUM_BAD_ALLOC=1, SPECTRUM_BAD_BINCOUNT, SPECTRUM_ABORT_FAIL, SPECTRUM_ERR_ENUM_END, }; enum { KEY_SPECTRUM_BINWIDTH, KEY_SPECTRUM_AUTOEXTREMA, KEY_SPECTRUM_MIN, KEY_SPECTRUM_MAX, KEY_SPECTRUM_LOGARITHMIC, KEY_SPECTRUM_NORMALISE, KEY_SPECTRUM_NORMALISE_LOWERBOUND, KEY_SPECTRUM_NORMALISE_UPPERBOUND, KEY_SPECTRUM_PLOTTYPE, KEY_SPECTRUM_COLOUR, KEY_SPECTRUM_BACKMODE, KEY_SPECTRUM_BACKMODE_FLAT_START, KEY_SPECTRUM_BACKMODE_FLAT_END, KEY_SPECTRUM_CORRECTED_ONLY }; //Limit user to two :million: bins const unsigned int SPECTRUM_MAX_BINS=2000000; const unsigned int SPECTRUM_AUTO_MAX_BINS=45000; //String to use on plot's y label const char *YLABEL_STRING=NTRANS("Count"); enum { NORMALISE_NONE, NORMALISE_MAX, NORMALISE_MAX_IN_BOUND, NORMALISE_INTEGRAL_ONE, NORMALISE_ENUM_END }; const char *NORMALISE_STRING[] = {NTRANS("None"), NTRANS("Maximum"), NTRANS("Max in limit"), NTRANS("Probability"), }; SpectrumPlotFilter::SpectrumPlotFilter() { minPlot=0; maxPlot=150; autoExtrema=true; binWidth=0.05; plotStyle=0; logarithmic=1; fitMode=0; massBackStart=1.2; massBackEnd=1.9; showOnlyCorrected=false; normaliseMode=NORMALISE_NONE; normaliseBounds=std::make_pair(0.0,100.0); //Default to blue plot rgba = ColourRGBAf(0,0,1.0f,1.0f); } Filter *SpectrumPlotFilter::cloneUncached() const { SpectrumPlotFilter *p = new SpectrumPlotFilter(); p->minPlot=minPlot; p->maxPlot=maxPlot; p->binWidth=binWidth; p->autoExtrema=autoExtrema; p->rgba=rgba; p->plotStyle=plotStyle; p->logarithmic = logarithmic; p->fitMode = fitMode; p->massBackStart = massBackStart; p->massBackEnd = massBackEnd; p->normaliseMode=normaliseMode; p->normaliseBounds=normaliseBounds; p->showOnlyCorrected= showOnlyCorrected; //We are copying whether to cache or not, //not the cache itself p->cache=cache; p->cacheOK=false; p->userString=userString; return p; } //!Get approx number of bytes for caching output size_t SpectrumPlotFilter::numBytesForCache(size_t nObjects) const { //Check that we have good plot limits, and bin width. if not, we cannot estimate cache size if(minPlot ==std::numeric_limits::max() || maxPlot==-std::numeric_limits::max() || binWidth < sqrtf(std::numeric_limits::epsilon())) { return (size_t)(-1); } return (size_t)((float)(maxPlot- minPlot)/(binWidth))*2*sizeof(float); } unsigned int SpectrumPlotFilter::refresh(const std::vector &dataIn, std::vector &getOut, ProgressData &progress) { if(cacheOK) { //Only report the spectrum plot propagateCache(getOut); return 0; } size_t totalSize=numElements(dataIn,STREAM_TYPE_IONS); unsigned int nBins=2; if(totalSize) { //Determine min and max of input if(autoExtrema) { progress.maxStep=2; progress.step=1; progress.stepName=TRANS("Extrema"); size_t n=0; minPlot = std::numeric_limits::max(); maxPlot =-std::numeric_limits::max(); //Loop through each type of data unsigned int curProg=NUM_CALLBACK; for(unsigned int ui=0;uigetStreamType() == STREAM_TYPE_IONS) { IonStreamData *ions; ions = (IonStreamData *)dataIn[ui]; for(unsigned int uj=0;ujdata.size(); uj++) { minPlot = std::min(minPlot, ions->data[uj].getMassToCharge()); maxPlot = std::max(maxPlot, ions->data[uj].getMassToCharge()); if(!curProg--) { n+=NUM_CALLBACK; progress.filterProgress= (unsigned int)((float)(n)/((float)totalSize)*100.0f); curProg=NUM_CALLBACK; if(*Filter::wantAbort) return SPECTRUM_ABORT_FAIL; } } } } //Check that the plot values have been set (ie not same as initial values) if(minPlot !=std::numeric_limits::max() && maxPlot!=-std::numeric_limits::max() ) { //push them out a bit to make the edges visible maxPlot=maxPlot+1; minPlot=minPlot-1; } //Time to move to phase 2 progress.step=2; progress.stepName=TRANS("count"); } double delta = ((double)maxPlot - (double)(minPlot))/(double)binWidth; //Check that we have good plot limits. if(minPlot ==std::numeric_limits::max() || minPlot ==-std::numeric_limits::max() || fabs(delta) > std::numeric_limits::max() || // Check for out-of-range binWidth < sqrtf(std::numeric_limits::epsilon()) ) { //If not, then simply set it to some defaults. minPlot=0; maxPlot=1.0; binWidth=0.1; } //Estimate number of bins in floating point, and check for potential overflow . float tmpNBins = (float)((maxPlot-minPlot)/binWidth); //If using autoextrema, use a lower limit for max bins, //as we may just hit a nasty data point if(autoExtrema) tmpNBins = std::min(SPECTRUM_AUTO_MAX_BINS,(unsigned int)tmpNBins); else tmpNBins = std::min(SPECTRUM_MAX_BINS,(unsigned int)tmpNBins); nBins = (unsigned int)tmpNBins; if (!nBins) { nBins = 10; binWidth = (maxPlot-minPlot)/nBins; } } PlotStreamData *d; d=new PlotStreamData; try { d->xyData.resize(nBins); } catch(std::bad_alloc) { delete d; return SPECTRUM_BAD_ALLOC; } d->r =rgba.r(); d->g = rgba.g(); d->b = rgba.b(); d->a = rgba.a(); d->logarithmic=logarithmic; d->plotStyle = plotStyle; d->plotMode=PLOT_MODE_1D; d->index=0; d->parent=this; d->dataLabel = getUserString(); d->yLabel=TRANS(YLABEL_STRING); //Check all the incoming ion data's type name //and if it is all the same, use it for the plot X-axis std::string valueName; for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *ionD; ionD=(const IonStreamData *)dataIn[ui]; if(!valueName.size()) valueName=ionD->valueType; else { if(ionD->valueType != valueName) { valueName=TRANS("Mixed data"); break; } } } } } d->xLabel=valueName; //Look for any ranges in input stream, and add them to the plot //while we are doing that, count the number of ions too for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_RANGE: { const RangeStreamData *rangeD; rangeD=(const RangeStreamData *)dataIn[ui]; for(unsigned int uj=0;ujrangeFile->getNumRanges();uj++) { unsigned int ionId; ionId=rangeD->rangeFile->getIonID(uj); //Only append the region if both the range //and the ion are enabled if((rangeD->enabledRanges)[uj] && (rangeD->enabledIons)[ionId]) { //save the range as a "region" d->regions.push_back(rangeD->rangeFile->getRange(uj)); d->regionTitle.push_back(rangeD->rangeFile->getName(ionId)); d->regionID.push_back(uj); d->parent=this; //FIXME: Const correctness d->regionParent=(Filter*)rangeD->parent; RGBf colour; //Use the ionID to set the range colouring colour=rangeD->rangeFile->getColour(ionId); //push back the range colour d->regionR.push_back(colour.red); d->regionG.push_back(colour.green); d->regionB.push_back(colour.blue); } } break; } default: break; } } #pragma omp parallel for for(unsigned int ui=0;uixyData[ui].first = minPlot + ui*binWidth; d->xyData[ui].second=0; } //Compute the plot bounds d->autoSetHardBounds(); //Limit them to 1.0 or greater (due to log) d->hardMinY=std::min(1.0f,d->hardMaxY); //Number of ions currently processed size_t n=0; unsigned int curProg=NUM_CALLBACK; //Loop through each type of data for(unsigned int ui=0;uigetStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *ions; ions = (const IonStreamData *)dataIn[ui]; //Sum the data bins as needed for(unsigned int uj=0;ujdata.size(); uj++) { unsigned int bin; bin = (unsigned int)((ions->data[uj].getMassToCharge()-minPlot)/binWidth); //Dependant upon the bounds, //actual data could be anywhere. >=0 is implicit if( bin < d->xyData.size()) d->xyData[bin].second++; //update progress every CALLBACK ions if(!curProg--) { n+=NUM_CALLBACK; progress.filterProgress= (unsigned int)(((float)(n)/((float)totalSize))*100.0f); curProg=NUM_CALLBACK; if(*Filter::wantAbort) { delete d; return SPECTRUM_ABORT_FAIL; } } } break; } default: //Don't propagate any type. break; } } if(fitMode!= FIT_MODE_NONE) { BACKGROUND_PARAMS backParams; backParams.massStart=massBackStart; backParams.massEnd=massBackEnd; backParams.binWidth=binWidth; backParams.mode=fitMode; //fit a constant tof (1/sqrt (mass)) type background if(doFitBackground(dataIn,backParams)) { //display a warning that the background failed consoleOutput.push_back(TRANS("Background fit failed - input data was considered ill formed (gauss-test)")); } else { if (!showOnlyCorrected) { vector backgroundHist; createMassBackground(backParams.massStart,backParams.massEnd, nBins,backParams.intensity,backgroundHist); //Create a new plot which shows the spectrum's background PlotStreamData *plotBack = new PlotStreamData; plotBack->parent = this; plotBack->dataLabel=string(TRANS("Background:")) + d->dataLabel; plotBack->plotMode=d->plotMode; plotBack->xLabel=d->xLabel; plotBack->index=d->index+1; plotBack->yLabel=d->yLabel; plotBack->xyData.reserve(d->xyData.size()); float intensityPerBin = backParams.intensity; for(size_t ui=0;uixyData.size(); ui++) { //negative sqrt cannot does not work. Equation only valid for positive masses if(d->xyData[ui].first <=0) continue; plotBack->xyData.push_back( std::make_pair(d->xyData[ui].first, intensityPerBin/(2.0*sqrtf(d->xyData[ui].first)))); } cacheAsNeeded(plotBack); getOut.push_back(plotBack); } else { //Correct the mass spectrum that we display for(size_t ui=0;uixyData.size(); ui++) { //negative sqrt cannot does not work. Equation only valid for positive masses if(d->xyData[ui].first <=0) { d->xyData[ui].second =0; continue; } d->xyData[ui].second-=backParams.intensity/sqrtf(d->xyData[ui].first); } //prevent negative values in log mode if(logarithmic) { for(size_t ui=0;uixyData.size(); ui++) d->xyData[ui].second=std::max(0.0f,d->xyData[ui].second); } } } } if(normaliseMode != NORMALISE_NONE) { normalise(d->xyData); switch(normaliseMode) { case NORMALISE_MAX: case NORMALISE_MAX_IN_BOUND: d->yLabel=TRANS("Relative ") + d->yLabel; break; case NORMALISE_INTEGRAL_ONE: d->yLabel=TRANS("Probability Density"); break; default: ASSERT(false); } } cacheAsNeeded(d); getOut.push_back(d); return 0; } void SpectrumPlotFilter::normalise(vector > &xyData) const { float scaleFact=0; switch(normaliseMode) { case NORMALISE_NONE: return; case NORMALISE_MAX: for(size_t ui=0;ui=normaliseBounds.first) scaleFact=std::max(xyData[ui].second,scaleFact); } break; case NORMALISE_INTEGRAL_ONE: { #pragma omp parallel for reduction(+:scaleFact) for(size_t ui=0;ui 1) binDelta=xyData[1].first - xyData[0].first; scaleFact*=binDelta; break; } default: ASSERT(false); } if(scaleFact > 0 ) { #pragma omp parallel for for(size_t ui=0;ui > choices; string tmpStr; for(unsigned int ui=0;ui::epsilon()) return false; //Prevent overflow on next line if(maxPlot == std::numeric_limits::max() || minPlot == std::numeric_limits::min()) return false; if(newWidth < 0.0f || newWidth > (maxPlot - minPlot)) return false; needUpdate=true; binWidth=newWidth; clearCache(); break; } //Auto min/max case KEY_SPECTRUM_AUTOEXTREMA: { if(!applyPropertyNow(autoExtrema,value,needUpdate)) return false; break; } //Plot min case KEY_SPECTRUM_MIN: { if(autoExtrema) return false; float newMin; if(stream_cast(newMin,value)) return false; if(newMin >= maxPlot) return false; needUpdate=true; minPlot=newMin; clearCache(); break; } //Plot max case KEY_SPECTRUM_MAX: { if(autoExtrema) return false; float newMax; if(stream_cast(newMax,value)) return false; if(newMax <= minPlot) return false; needUpdate=true; maxPlot=newMax; clearCache(); break; } case KEY_SPECTRUM_LOGARITHMIC: { //Only allow valid values unsigned int valueInt; if(stream_cast(valueInt,value)) return false; //Only update as needed if(valueInt ==0 || valueInt == 1) { if(logarithmic != (bool)valueInt) { needUpdate=true; logarithmic=valueInt; } else needUpdate=false; } else return false; if(cacheOK) { //Change the output of the plot streams that //we cached, in order to avoid recomputation for(size_t ui=0;uigetStreamType() == STREAM_TYPE_PLOT ) { PlotStreamData *p; p =(PlotStreamData*)filterOutputs[ui]; p->logarithmic=logarithmic; } } } break; } //Plot type case KEY_SPECTRUM_PLOTTYPE: { unsigned int tmpPlotType; tmpPlotType=plotID(value); if(tmpPlotType >= PLOT_LINE_NONE) return false; plotStyle = tmpPlotType; needUpdate=true; //Perform introspection on //cache if(cacheOK) { for(size_t ui=0;uigetStreamType() == STREAM_TYPE_PLOT) { PlotStreamData *p; p =(PlotStreamData*)filterOutputs[ui]; p->plotStyle=plotStyle; } } } else { clearCache(); } break; } case KEY_SPECTRUM_COLOUR: { ColourRGBA tmpRgb; tmpRgb.parse(value); if(tmpRgb.toRGBAf() != rgba) { rgba=tmpRgb.toRGBAf(); needUpdate=true; } if(cacheOK) { for(size_t ui=0;uigetStreamType() == STREAM_TYPE_PLOT) { PlotStreamData *p; p =(PlotStreamData*)filterOutputs[ui]; p->r=rgba.r(); p->g=rgba.g(); p->b=rgba.b(); } } } else clearCache(); break; } case KEY_SPECTRUM_BACKMODE: { unsigned int newMode; for(size_t ui=0;ui=massBackEnd) return false; if(!applyPropertyNow(massBackStart,value,needUpdate)) return false; break; } case KEY_SPECTRUM_BACKMODE_FLAT_END: { float tmpEnd; if(stream_cast(tmpEnd,value)) return false; if( tmpEnd<=massBackStart) return false; if(!applyPropertyNow(massBackEnd,value,needUpdate)) return false; break; } case KEY_SPECTRUM_CORRECTED_ONLY: { if(!applyPropertyNow(showOnlyCorrected,value,needUpdate)) return false; break; } case KEY_SPECTRUM_NORMALISE: { unsigned int newMode; for(size_t ui=0;ui=normaliseBounds.second) return false; if(!applyPropertyNow(normaliseBounds.first,value,needUpdate)) return false; //TODO: Cache introspection? normaliseBounds.first=tmpVal; cacheOK=false; break; } case KEY_SPECTRUM_NORMALISE_UPPERBOUND: { float tmpVal; if(stream_cast(tmpVal,value)) return false; if( tmpVal<=normaliseBounds.first) return false; if(!applyPropertyNow(normaliseBounds.second,value,needUpdate)) return false; //TODO: Cache introspection? normaliseBounds.second=tmpVal; cacheOK=false; break; } default: ASSERT(false); break; } return true; } void SpectrumPlotFilter::setUserString(const std::string &s) { if(userString !=s) { userString=s; clearCache(); cacheOK=false; } } std::string SpectrumPlotFilter::getSpecificErrString(unsigned int code) const { const char *errStrs[] = { "", "Insufficient memory for spectrum filter.", "Bad bincount value in spectrum filter.", "Aborted." }; COMPILE_ASSERT(THREEDEP_ARRAYSIZE(errStrs) == SPECTRUM_ERR_ENUM_END); ASSERT(code < SPECTRUM_ERR_ENUM_END); return errStrs[code]; } void SpectrumPlotFilter::setPropFromBinding(const SelectionBinding &b) { ASSERT(false); } bool SpectrumPlotFilter::writeState(std::ostream &f,unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: { f << tabs(depth) << "<" << trueName() << ">" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" <" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth) << "" << endl; break; } default: ASSERT(false); return false; } return true; } bool SpectrumPlotFilter::readState(xmlNodePtr &nodePtr, const std::string &stateFileDir) { using std::string; string tmpStr; //Retrieve user string //=== if(XMLHelpFwdToElem(nodePtr,"userstring")) return false; xmlChar *xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); if(!xmlString) return false; userString=(char *)xmlString; xmlFree(xmlString); //=== //Retrieve Extrema //=== float tmpMin,tmpMax; if(XMLHelpFwdToElem(nodePtr,"extrema")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"min"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //convert from string to digit if(stream_cast(tmpMin,tmpStr)) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"max"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //convert from string to digit if(stream_cast(tmpMax,tmpStr)) return false; if(tmpMin >=tmpMax) return false; minPlot=tmpMin; maxPlot=tmpMax; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"auto"); if(!xmlString) return false; tmpStr=(char *)xmlString; if(!boolStrDec(tmpStr,autoExtrema)) { xmlFree(xmlString); return false; } xmlFree(xmlString); //=== //Retrieve bin width //==== // if(!XMLGetNextElemAttrib(nodePtr,binWidth,"binwidth","value")) return false; if(binWidth <= 0.0) return false; if(!autoExtrema && binWidth > maxPlot - minPlot) return false; //==== //Retrieve colour //==== if(XMLHelpFwdToElem(nodePtr,"colour")) return false; ColourRGBAf tmpRgba; if(!parseXMLColour(nodePtr,tmpRgba)) return false; rgba=tmpRgba; //==== //Retrieve logarithmic mode //==== if(!XMLGetNextElemAttrib(nodePtr,tmpStr,"logarithmic","value")) return false; if(!boolStrDec(tmpStr,logarithmic)) return false; //==== //Retrieve plot type //==== if(!XMLGetNextElemAttrib(nodePtr,plotStyle,"plottype","value")) return false; if(plotStyle >= PLOT_LINE_NONE) return false; //==== //Retrieve background fitting mode, if we have it // Only available 3Depict >= 0.0.18 // internal rev > 5e7b66e5ce3d xmlNodePtr tmpNode=nodePtr; if(!XMLHelpFwdToElem(nodePtr,"background")) { if(XMLHelpGetProp(fitMode,nodePtr,"mode")) return false; if(!nodePtr->xmlChildrenNode) return false; tmpNode=nodePtr; nodePtr=nodePtr->xmlChildrenNode; if(!XMLGetNextElemAttrib(nodePtr,massBackStart,"fitwindow","start")) return false; if(XMLHelpGetProp(massBackEnd,nodePtr,"end")) return false; if(!XMLGetNextElemAttrib(nodePtr,showOnlyCorrected,"showonlycorrected","value")) return false; nodePtr=tmpNode; } else { nodePtr=tmpNode; } // Only available 3Depict >= 0.0.18 // internal rev > 73289623683a tip if(!XMLHelpFwdToElem(nodePtr,"normalise")) { if(XMLHelpGetProp(normaliseMode,nodePtr,"mode")) return false; float tmpLow,tmpHigh; if(XMLHelpGetProp(tmpLow,nodePtr,"lowbound")) return false; if(XMLHelpGetProp(tmpHigh,nodePtr,"highbound")) return false; if(tmpLow >=tmpHigh) return false; normaliseBounds.first=tmpLow; normaliseBounds.second=tmpHigh; } else { //initialise to some default value normaliseBounds=std::make_pair(0,100); normaliseMode=NORMALISE_NONE; } return true; } unsigned int SpectrumPlotFilter::getRefreshBlockMask() const { //Absolutely nothing can go through this filter. return STREAMTYPE_MASK_ALL; } unsigned int SpectrumPlotFilter::getRefreshEmitMask() const { return STREAM_TYPE_PLOT; } unsigned int SpectrumPlotFilter::getRefreshUseMask() const { return STREAM_TYPE_IONS; } bool SpectrumPlotFilter::needsUnrangedData() const { return fitMode == FIT_MODE_CONST_TOF; } #ifdef DEBUG #include IonStreamData *synDataPoints(const unsigned int span[], unsigned int numPts) { IonStreamData *d = new IonStreamData; for(unsigned int ui=0;uidata.push_back(h); } return d; } bool countTest() { using std::auto_ptr; auto_ptr d; const unsigned int VOL[]={ 10,10,10 }; const unsigned int NUMPTS=100; d.reset(synDataPoints(VOL,NUMPTS)); SpectrumPlotFilter *f; f = new SpectrumPlotFilter; bool needUp; TEST(f->setProperty(KEY_SPECTRUM_LOGARITHMIC,"0",needUp),"Set prop"); ColourRGBA tmpRGBA(255,0,0); TEST(f->setProperty(KEY_SPECTRUM_COLOUR,tmpRGBA.rgbString(),needUp),"Set prop"); vector streamIn,streamOut; streamIn.push_back(d.get()); //OK, so now do the rotation //Do the refresh ProgressData p; f->setCaching(false); TEST(!f->refresh(streamIn,streamOut,p),"refresh error code"); delete f; TEST(streamOut.size() == 1,"stream count"); TEST(streamOut[0]->getStreamType() == STREAM_TYPE_PLOT,"stream type"); PlotStreamData *plot; plot = (PlotStreamData*)streamOut[0]; //Check the plot colour is what we want. TEST(fabs(plot->r -1.0f) < sqrtf(std::numeric_limits::epsilon()),"colour (r)"); TEST(plot->g< sqrtf(std::numeric_limits::epsilon()),"colour (g)"); TEST(plot->b < sqrtf(std::numeric_limits::epsilon()),"colour (b)"); //Count the number of ions in the plot, and check that it is equal to the number of ions we put in. float sumV=0; for(unsigned int ui=0;uixyData.size();ui++) sumV+=plot->xyData[ui].second; TEST(fabs(sumV - (float)NUMPTS) < std::numeric_limits::epsilon(),"ion count"); delete plot; return true; } bool SpectrumPlotFilter::runUnitTests() { if(!countTest()) return false; return true; } #endif 3Depict-0.0.19/src/backend/filters/annotation.h0000644000175000017500000001116512640746376020654 0ustar pcuserpcuser/* * annotation.h - 3D annotation header * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef ANNOTATION_H #define ANNOTATION_H #include "../filter.h" #include "../../common/translation.h" enum { ANNOTATION_ARROW, ANNOTATION_TEXT, ANNOTATION_TEXT_WITH_ARROW, ANNOTATION_ANGLE_MEASURE, ANNOTATION_LINEAR_MEASURE, ANNOTATION_MODE_END }; //!Filter to place drawing objects to help annotate // the 3D scene class AnnotateFilter : public Filter { private: //what style of annotation are we using? unsigned int annotationMode; //Position of annotation, thing to point at and text up/across vectors Point3D position, target, upVec,acrossVec; //Positions for angle measurement Point3D anglePos[3]; //annotation text string std::string annotateText; //Text display style, arrow annotation size, handle size for angle spheres float textSize,annotateSize,sphereMarkerSize,lineSize; //Annotation colour ColourRGBAf rgba; //Disable/enable annotation bool active; // Show included angle text bool showAngleText; //Show reflexive angle, instead of included angle when using angle annot. bool reflexAngle; //Angle format to use in 3D scene unsigned int angleFormatPreDecimal,angleFormatPostDecimal; //Using fixed spacings or not bool linearFixedTicks; //Number of ticks to use in linear measure unsigned int linearMeasureTicks; //Spacing to use between ticks if using fixed spacings float linearMeasureSpacing; //Font-size for linear measure object float fontSizeLinearMeasure; public: //!Constructor AnnotateFilter(); //!Duplicate filter contents, excluding cache. Filter *cloneUncached() const; //!Apply filter to new data, updating cache as needed. Vector // of returned pointers must be deleted manually, first checking // ->cached. unsigned int refresh(const std::vector &dataIn, std::vector &dataOut, ProgressData &progress); //!Get (approx) number of bytes required for cache size_t numBytesForCache(size_t nObjects) const; //!return type ID unsigned int getType() const { return FILTER_TYPE_ANNOTATION;} //!Return filter type as std::string std::string typeString() const { return std::string(TRANS("Annotation"));}; //!Get the properties of the filter, in key-value form. First vector is for each output. void getProperties(FilterPropGroup &propertyList) const; //!Set the properties for the nth filter, //!needUpdate tells us if filter output changes due to property set bool setProperty( unsigned int key, const std::string &value, bool &needUpdate); void setPropFromBinding( const SelectionBinding &b) ; //!Get the human readable error string associated with a particular error code during refresh(...) std::string getSpecificErrString(unsigned int code) const; //!Dump state to output stream, using specified format /* Current supported formats are STATE_FORMAT_XML */ bool writeState(std::ostream &f, unsigned int format, unsigned int depth) const; //!Read state from XML stream, using xml format /* Current supported formats are STATE_FORMAT_XML */ bool readState(xmlNodePtr& n, const std::string &packDir=""); //!Get the bitmask encoded list of filterStreams that this filter blocks from propagation. // i.e. if this filterstream is passed to refresh, it is not emitted. // This MUST always be consistent with ::refresh for filters current state. unsigned int getRefreshBlockMask() const; //!Get the bitmask encoded list of filterstreams that this filter emits from ::refresh. // This MUST always be consistent with ::refresh for filters current state. unsigned int getRefreshEmitMask() const; //!Get the refresh's ignore mask - filter streams that will not be considered // as part of the computation unsigned int getRefreshUseMask() const; //Can we be a useful filter, even if given no input specified by the Use mask? virtual bool isUsefulAsAppend() const { return true;} #ifdef DEBUG bool runUnitTests(); #endif }; #endif 3Depict-0.0.19/src/backend/viscontrol.h0000644000175000017500000001400512640746376017230 0ustar pcuserpcuser/* * viscontrol.h - Visualisation control header; "glue" between user interface and scene * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VISCONTROL_H #define VISCONTROL_H #include #include #include class VisController; class wxGrid; class wxTreeCtrl; #include "state.h" #include "filtertreeAnalyse.h" #include "filter.h" #include "gl/scene.h" #include "backend/plot.h" #include //!Tree controller class RefreshController { private: TreeState *treeState; //!Results of last refresh std::list refreshData; std::vector > consoleMessages; public: //Initialisation requires treecontroller RefreshController(TreeState &treeState); ~RefreshController(); //!Current progress ProgressData curProg; //!Refresh the tree-control's tree, and return error code // returns 0 on success, nonzero on failure (see TreeState::refreshFilterTree) unsigned int refresh(); std::list &getRefreshData() { return refreshData;}; std::vector > &getConsoleMessages() { return consoleMessages;}; }; //!Visualisation controller /*! * Keeps track of what visualisation controls the user has available * such as cameras, filters and data groups. * This is essentially responsible for interfacing between program * data structures and the user interface. * * Only one of these should be instantiated at any time . */ class VisController { private: static bool isInstantiated; //!Target Plot wrapper system PlotWrapper targetPlots; //!Target raw grid wxGrid *targetRawGrid; //!UI element for console output wxTextCtrl *textConsole; //!UI element for selecting plots from a list (for enable/disable) wxListBox *plotSelList; //!Maximum number of ions to pass to scene size_t limitIonOutput; //Filters that should be able to be seen next time we show // the wxTree control std::vector persistentFilters; //Map plot position to ID. TODO: Remove me std::map plotMap; //!Update the console strings void updateConsole(const std::vector &v, const Filter *f) const; //!Limit the number of objects we are sending to the scene void throttleSceneInput(std::list > &outputData, std::map &throttleMap) const; public: AnalysisState state; Scene scene; VisController() {ASSERT(!isInstantiated); isInstantiated=true; scene.setVisControl(this);}; void setActiveCam(unsigned int cam); //Returns true if current state has been modified since last save bool stateIsModified(unsigned int minLevel = STATE_MODIFIED_ANCILLARY) const; //Set the maximum number of ions to allow the scene to display void setIonDisplayLimit(size_t newLimit) { limitIonOutput=newLimit;} size_t getIonDisplayLimit() const { return limitIonOutput;} RefreshController &getRefreshControl() const; void clearScene() {scene.clearAll();}; //Return the selection devices obtained from the last refresh std::vector &getSelectionDevices() { return state.treeState.getSelectionDevices();}; //Apply bindings from any selection devices (3D object modifiers) to the tree void applyBindingsToTree() { state.treeState.applyBindingsToTree();} //Obtain updated camera from the scene and then commit it to the state void transferSceneCameraToState(); //set the camera property for the state, then transfer to scene void setCamProperty(size_t offset, unsigned int key, const std::string &value); //!Ask that next time we build the tree, this filter is kept visible/selected. // may be used repeatedly to make more items visible, // prior to calling updateWxTreeCtrl. // filterId must exist during call. void setWxTreeFilterViewPersistence(size_t filterId); //!Erase the filters that will persist in the view void clearTreeFilterViewPersistence() { persistentFilters.clear();} //!Write out the filters into a wxtreecontrol. // optional argument is the fitler to keep visible in the control void updateWxTreeCtrl(wxTreeCtrl *t,const Filter *f=0); //!Update a wxPropertyGrid with the properties for a given filter void updateFilterPropGrid(wxPropertyGrid *g,size_t filterId, const std::string &stateString="") const; //!Update a wxPropertyGrid with the properties for a given filter void updateCameraPropGrid(wxPropertyGrid *g,size_t cameraId) const; void updateCameraComboBox(wxComboBox *comboCamera) const; //Update the raw numerical data grid void updateRawGrid() const; void updateStashComboBox(wxComboBox *comboStash) const; //Update the 3D scene void updateScene(RefreshController *r); //update a scene, simply using some streams and whether we should release the data void updateScene(std::list > &sceneData, bool releaseData); //!Set the backend grid control for raw data void setRawGrid(wxGrid *theRawGrid){targetRawGrid=theRawGrid;}; //!get the plot wrapper : TODO: Deprecate me PlotWrapper *getPlotWrapper(){return &targetPlots;}; //Get a plot ID from the listbox position size_t getPlotID(size_t position) const ; //!Set the listbox for plot selection void setPlotList(wxListBox *box){plotSelList=box;}; //!Set the text console void setConsole(wxTextCtrl *t) { textConsole = t;} }; #endif 3Depict-0.0.19/src/backend/configFile.cpp0000644000175000017500000004242012640746376017430 0ustar pcuserpcuser/* * configFile.cpp - User configuration loading/saving * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "configFile.h" #include "wx/wxcommon.h" #include "backend/filters/allFilter.h" #include "common/stringFuncs.h" #include "common/xmlHelper.h" const char *CONFIG_FILENAME="config.xml"; const unsigned int MAX_RECENT=9; const unsigned int MAX_MOUSE_PERCENT= 400; #include using std::endl; using std::string; using std::deque; ConfigFile::ConfigFile() : configLoadOK(false), panelMode(CONFIG_PANELMODE_REMEMBER), haveInitialAppSize(false), mouseZoomRatePercent(100),mouseMoveRatePercent(100), wantStartupOrthoCam(false),allowOnline(true), allowOnlineVerCheck(true), leftRightSashPos(0), topBottomSashPos(0),filterSashPos(0),plotListSashPos(0), haveMaxPoints(false), maxPointsScene(0), doWantStartupTips(true) { } ConfigFile::~ConfigFile() { for(unsigned int ui=0;ui MAX_RECENT) recentFiles.pop_front(); } void ConfigFile::getRecentFiles(std::vector &files) const { files.resize(recentFiles.size()); std::copy(recentFiles.begin(),recentFiles.end(),files.begin()); } void ConfigFile::removeRecentFile(const std::string &str) { std::deque::iterator it; it=std::find(recentFiles.begin(),recentFiles.end(),str); if(it!=recentFiles.end()) recentFiles.erase(it); } void ConfigFile::getFilterDefaults(vector &defs) { defs.resize(filterDefaults.size()); std::copy(filterDefaults.begin(),filterDefaults.end(),defs.begin()); } void ConfigFile::setFilterDefaults(const vector &defs) { for(unsigned int ui=0;uicanBeHazardous())); } } bool ConfigFile::getInitialAppSize(unsigned int &x, unsigned int &y) const { if(haveInitialAppSize) { x=initialSizeX; y=initialSizeY; } return haveInitialAppSize; } void ConfigFile::setInitialAppSize(unsigned int x, unsigned int y) { haveInitialAppSize=true; initialSizeX=x; initialSizeY=y; } Filter *ConfigFile::getDefaultFilter(unsigned int type) const { for(unsigned int ui=0;uigetType()) { ASSERT(!filterDefaults[ui]->canBeHazardous()); return filterDefaults[ui]->cloneUncached(); } } return makeFilter(type); } unsigned int ConfigFile::read() { string filename; filename = getConfigDir() + std::string("/") + std::string(CONFIG_FILENAME); //Load the state from an XML file //here we use libxml2's loading routines //http://xmlsoft.org/ //Tutorial: http://xmlsoft.org/tutorial/xmltutorial.pdf xmlDocPtr doc; xmlParserCtxtPtr context; context =xmlNewParserCtxt(); if(!context) { return CONFIG_ERR_NOPARSER; } //Open the XML file again, but without DTD validation doc = xmlCtxtReadFile(context, filename.c_str(), NULL, XML_PARSE_NONET|XML_PARSE_NOENT); if(!doc) return CONFIG_ERR_NOFILE; //release the context xmlFreeParserCtxt(context); //retrieve root node xmlNodePtr nodePtr = xmlDocGetRootElement(doc); try { std::stack nodeStack; //Umm where is our root node guys? if(!nodePtr) throw 1; //push root tag nodeStack.push(nodePtr); //This *should* be an threeDepict state file if(xmlStrcmp(nodePtr->name, (const xmlChar *)"threeDepictconfig")) { errMessage=TRANS("Config file present, but is not valid (root node test)"); throw 1; } //push root node nodeStack.push(nodePtr); nodePtr=nodePtr->xmlChildrenNode; //push not quite root tag nodeStack.push(nodePtr); if(!XMLHelpFwdToElem(nodePtr,"initialwinsize")) { if(XMLGetAttrib(nodePtr, initialSizeX, "width") && XMLGetAttrib(nodePtr,initialSizeY,"height")) { if( initialSizeX >0 && initialSizeY > 0) haveInitialAppSize=true; } } nodePtr=nodeStack.top(); nodeStack.pop(); //Clean up current configuration recentFiles.clear(); if(!XMLHelpFwdToElem(nodePtr,"recent")) { nodeStack.push(nodePtr); nodePtr=nodePtr->xmlChildrenNode; std::string thisName; while(!XMLHelpFwdToElem(nodePtr,"file") && recentFiles.size() < MAX_RECENT) { xmlChar *xmlString; //read name of file xmlString=xmlGetProp(nodePtr,(const xmlChar *)"name"); if(!xmlString) { errMessage=TRANS("Unable to interpret recent file entry"); throw 1; } thisName=(char *)xmlString; recentFiles.push_back(thisName); xmlFree(xmlString); } } //restore old node nodePtr=nodeStack.top(); nodeStack.pop(); //Advance and push if(!nodePtr->next) goto nodeptrEndJump; nodePtr=nodePtr->next; nodeStack.push(nodePtr); if(!XMLHelpFwdToElem(nodePtr,"filterdefaults")) { nodePtr=nodePtr->xmlChildrenNode; if(nodePtr) { while(!XMLHelpNextType(nodePtr,XML_ELEMENT_NODE)) { string s; s=(char *)(nodePtr->name); Filter *f; f=makeFilter(s); if(!f) { errMessage=TRANS("Unable to determine filter type in defaults listing."); throw 1; } //potentially hazardous filters cannot have their //default properties altered. Quietly drop them if(!f->canBeHazardous()) { nodeStack.push(nodePtr); nodePtr=nodePtr->xmlChildrenNode; if(f->readState(nodePtr)) filterDefaults.push_back(f); nodePtr=nodeStack.top(); nodeStack.pop(); } } } } //restore old node nodePtr=nodeStack.top(); nodeStack.pop(); //Advance and push if(!nodePtr->next) goto nodeptrEndJump; nodePtr=nodePtr->next; nodeStack.push(nodePtr); if(!XMLHelpFwdToElem(nodePtr,"startuppanels")) { startupPanelView.resize(CONFIG_STARTUPPANEL_END_ENUM); std::string tmpStr; xmlChar *xmlString; xmlString=xmlGetProp(nodePtr,(xmlChar*)"mode"); if(xmlString) { tmpStr=(char*)xmlString; panelMode=CONFIG_PANELMODE_NONE; stream_cast(panelMode,tmpStr); if(panelMode >=CONFIG_PANELMODE_END_ENUM) panelMode=CONFIG_PANELMODE_NONE; xmlFree(xmlString); } if(panelMode) { xmlString=xmlGetProp(nodePtr,(xmlChar*)"rawdata"); if(xmlString) { tmpStr=(char *)xmlString; if(tmpStr == "1") startupPanelView[CONFIG_STARTUPPANEL_RAWDATA]=true; else startupPanelView[CONFIG_STARTUPPANEL_RAWDATA]=false; xmlFree(xmlString); } xmlString=xmlGetProp(nodePtr,(xmlChar*)"control"); if(xmlString) { tmpStr=(char *)xmlString; if(tmpStr == "1") startupPanelView[CONFIG_STARTUPPANEL_CONTROL]=true; else startupPanelView[CONFIG_STARTUPPANEL_CONTROL]=false; xmlFree(xmlString); } xmlString=xmlGetProp(nodePtr,(xmlChar*)"plotlist"); if(xmlString) { tmpStr=(char *)xmlString; if(tmpStr == "1") startupPanelView[CONFIG_STARTUPPANEL_PLOTLIST]=true; else startupPanelView[CONFIG_STARTUPPANEL_PLOTLIST]=false; xmlFree(xmlString); } } } //restore old node nodePtr=nodeStack.top(); nodeStack.pop(); //Advance and push, as needed if(!nodePtr->next) goto nodeptrEndJump; nodePtr=nodePtr->next; nodeStack.push(nodePtr); if(!XMLHelpFwdToElem(nodePtr,"mousedefaults")) { xmlNodePtr mouseDataNodePtr=nodePtr->xmlChildrenNode; if(mouseDataNodePtr) { nodeStack.push(mouseDataNodePtr); if(!XMLHelpFwdToElem(mouseDataNodePtr,"speed")) { unsigned int percentage; if(XMLGetAttrib(mouseDataNodePtr,percentage,"zoom") && percentage next; nodeStack.push(nodePtr); if(!XMLHelpFwdToElem(nodePtr,"netaccess")) { std::string tmpStr; xmlChar *xmlString; xmlString=xmlGetProp(nodePtr,(xmlChar*)"enabled"); if(xmlString) { tmpStr=(char *)xmlString; if(!(tmpStr == "1" || tmpStr == "0")) throw 1; allowOnline = (tmpStr == "1"); xmlFree(xmlString); } if(nodePtr->xmlChildrenNode) { nodePtr=nodePtr->xmlChildrenNode; if(!XMLHelpFwdToElem(nodePtr,"versioncheck")) { xmlChar *xmlString; xmlString=xmlGetProp(nodePtr,(xmlChar*)"enabled"); if(xmlString) { tmpStr=(char *)xmlString; if(!(tmpStr == "1" || tmpStr == "0")) throw 1; allowOnlineVerCheck = (tmpStr == "1"); xmlFree(xmlString); } } } } nodePtr=nodeStack.top(); nodeStack.pop(); nodeStack.push(nodePtr); if(!XMLHelpFwdToElem(nodePtr,"sashposition")) { if(nodePtr->xmlChildrenNode) { nodePtr=nodePtr->xmlChildrenNode; while(!XMLHelpFwdToElem(nodePtr,"pos")) { string name; if(XMLGetAttrib(nodePtr, name,"name")) { if(name == "topbottom") XMLGetAttrib(nodePtr,topBottomSashPos,"value"); if(name == "leftright") XMLGetAttrib(nodePtr,leftRightSashPos,"value"); if(name == "filter") XMLGetAttrib(nodePtr,filterSashPos,"value"); if(name == "plotlist") XMLGetAttrib(nodePtr,plotListSashPos,"value"); } nodePtr=nodePtr->next; } } } nodePtr=nodeStack.top(); nodeStack.pop(); nodeStack.push(nodePtr); haveMaxPoints=XMLGetNextElemAttrib(nodePtr,maxPointsScene,"maxdisplaypoints","value"); nodePtr=nodeStack.top(); nodeStack.pop(); nodeStack.push(nodePtr); //have we seen a startup tip entry? if(!XMLHelpFwdToElem(nodePtr,"startuptips")) { std::string str; XMLGetAttrib(nodePtr,str,"value"); //Check if the user wants startup tips. If we cant understand this, then say no. if(!boolStrDec(str,doWantStartupTips)) doWantStartupTips=false; } nodePtr=nodeStack.top(); nodeStack.pop(); nodeStack.push(nodePtr); //Does the user want, by default, an orthographic camera if(!XMLHelpFwdToElem(nodePtr,"wantorthocam")) { std::string str; XMLGetAttrib(nodePtr,str,"value"); //Check if the user wants ortho camera, if no idea, revert to not if(!boolStrDec(str,wantStartupOrthoCam)) wantStartupOrthoCam=false; } nodePtr=nodeStack.top(); nodeStack.pop(); nodeptrEndJump: ; } catch (int) { //Code threw an error, just say "bad parse" and be done with it xmlFreeDoc(doc); return CONFIG_ERR_BADFILE; } xmlFreeDoc(doc); configLoadOK=true; return 0; } bool ConfigFile::createConfigDir() { wxString filePath = (getConfigDir()); //Create the folder if it does not exist if(!wxDirExists(filePath)) { if(!wxMkdir(filePath)) return false; //Make it a hidden folder #if defined(__WIN32) || defined(__WIN64) SetFileAttributes(filePath.wc_str(),FILE_ATTRIBUTE_HIDDEN); #endif } return true; } std::string ConfigFile::getConfigDir() { wxStandardPaths &paths = wxStandardPaths::Get(); wxString filePath = paths.GetDocumentsDir()+("/.")+(PROGRAM_NAME); return stlStr(filePath); } bool ConfigFile::write() { string filename; if(!createConfigDir()) return false; filename = getConfigDir() + std::string("/") + std::string(CONFIG_FILENAME); //Open file for output std::ofstream f(filename.c_str()); if(!f) return false; //Write state open tag f<< "" << endl; f<" << endl; if(haveInitialAppSize) { f<" << endl; } f<" << endl; for(unsigned int ui=0;ui" << endl; f<< tabs(1) << "" << endl; f<< tabs(1) << "" << endl; for(unsigned int ui=0;uiwriteState(f,STATE_FORMAT_XML,2); f<< tabs(1) << "" << endl; if(startupPanelView.size()) { ASSERT(startupPanelView.size() == CONFIG_STARTUPPANEL_END_ENUM); f << tabs(1) << "" << endl; } f << tabs(1) << " " << endl; f << tabs(2) << "" << endl; f << tabs(1) << " " << endl; //Online access settings #if (!defined(__APPLE__) && !defined(WIN32)) f << tabs(1) <<"" << endl; #endif f << tabs(1) << " " << endl; f << tabs(2) << " " << endl; f << tabs(1) << "" << endl; //Online access settings f << tabs(1) << "" << endl; if(topBottomSashPos) f << tabs(2) << "" << endl; if(leftRightSashPos) f << tabs(2) << "" << endl; if(filterSashPos) f << tabs(2) << "" << endl; if(plotListSashPos) f << tabs(2) << "" << endl; f << tabs(1) << "" << endl; if(haveMaxPoints) f << tabs(1) << "" << endl; f << tabs(1) << "" <" <" << endl; ASSERT(isValidXML(filename.c_str())); return true; } bool ConfigFile::getPanelEnabled(unsigned int panelID) const { ASSERT(panelID < CONFIG_STARTUPPANEL_END_ENUM); switch(panelMode) { case CONFIG_PANELMODE_NONE: return true; case CONFIG_PANELMODE_REMEMBER: case CONFIG_PANELMODE_SPECIFY: if(startupPanelView.size()) { ASSERT(startupPanelView.size() == CONFIG_STARTUPPANEL_END_ENUM); return startupPanelView[panelID]; } else return true; default: ASSERT(false); } } void ConfigFile::setPanelEnabled(unsigned int panelID, bool enabled, bool permanent) { ASSERT(panelID < CONFIG_STARTUPPANEL_END_ENUM); //Create the vector as needed, filling with default of "enabled" if(startupPanelView.empty()) startupPanelView.resize(CONFIG_STARTUPPANEL_END_ENUM,true); ASSERT(startupPanelView.size() == CONFIG_STARTUPPANEL_END_ENUM); if(panelMode != CONFIG_PANELMODE_SPECIFY || permanent) startupPanelView[panelID] = enabled; } void ConfigFile::setStartupPanelMode(unsigned int panelM) { ASSERT(panelM < CONFIG_PANELMODE_END_ENUM); panelMode=panelM; } unsigned int ConfigFile::getStartupPanelMode() const { return panelMode; } bool ConfigFile::getAllowOnlineVersionCheck() const { #if defined(WIN32) || defined(__APPLE__) //windows don't have good package //management systems as yet, so we check, //iff the user opts in return allowOnlineVerCheck; #else //Linux and friends should NEVER look online. //as they have package management systems to do this. return false; #endif } void ConfigFile::setAllowOnline(bool v) { //Do not allow this setting to //be modified from the default for non-apple-non windows //platforms #if defined( __APPLE__) || defined(WIN32) allowOnline=v; #endif } void ConfigFile::setAllowOnlineVersionCheck(bool v) { //Do not allow this setting to //be modified from the default for non windows //platforms #if defined(WIN32) || defined(__APPLE__) allowOnlineVerCheck=v; #endif } void ConfigFile::setLeftRightSashPos(float fraction) { ASSERT(fraction <= 1.0f && fraction >=0.0f); leftRightSashPos=fraction; } void ConfigFile::setTopBottomSashPos(float fraction) { ASSERT(fraction <= 1.0f && fraction >=0.0f); topBottomSashPos=fraction; } void ConfigFile::setFilterSashPos(float fraction) { ASSERT(fraction <= 1.0f && fraction >=0.0f); filterSashPos=fraction; } void ConfigFile::setPlotListSashPos(float fraction) { ASSERT(fraction <= 1.0f && fraction >=0.0f); plotListSashPos=fraction; } 3Depict-0.0.19/src/backend/filtertreeAnalyse.cpp0000644000175000017500000004117312716174467021051 0ustar pcuserpcuser/* * filtertreeAnalyse.cpp - Performs correctness checking of filter trees * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "filtertreeAnalyse.h" //Needed to obtain filter data keys //---- #include "filters/allFilter.h" //---- #include bool filterIsSampling(const Filter *f) { bool affectsSampling=false; FilterPropGroup props; f->getProperties(props); switch(f->getType()) { case FILTER_TYPE_DATALOAD: { //Check if load limiting is on //Not strictly true. If data file is smaller (in MB) than this number // (which we don't know here), then this will be false. if(props.hasProp(DATALOAD_KEY_SAMPLE)) affectsSampling = (props.getPropValue(DATALOAD_KEY_SAMPLE).data!= "0"); else affectsSampling=false; break; } case FILTER_TYPE_IONDOWNSAMPLE: { FilterProperty p; if(props.hasProp(KEY_IONDOWNSAMPLE_FIXEDOUT)) { p=props.getPropValue(KEY_IONDOWNSAMPLE_FIXEDOUT); //If using fixed output mode, then // we may affect the output ion density // if the count is low. How low? // We don't know with the information to hand... affectsSampling=(p.data== "1"); } else { //If randomly sampling, then we are definitely affecting the results //if we are not including every ion if(props.hasProp(KEY_IONDOWNSAMPLE_FRACTION)) { p=props.getPropValue(KEY_IONDOWNSAMPLE_FRACTION); float sampleFrac; stream_cast(sampleFrac,p.data); affectsSampling=(sampleFrac < 1.0f); } else affectsSampling=false; } break; } } return affectsSampling; } bool affectedBySampling(const Filter *f, bool haveRngParent) { FilterPropGroup props; f->getProperties(props); bool affected=false; //See if filter is configured to affect spatial analysis switch(f->getType()) { case FILTER_TYPE_CLUSTER_ANALYSIS: { affected=haveRngParent; break; } case FILTER_TYPE_PROFILE: { FilterProperty p; p=props.getPropValue(PROFILE_KEY_NORMALISE); //If using normalise mode, and we do not have a range parent //then filter is in "density" plotting mode, which is affected by //this analysis affected= (p.data== "1" && !haveRngParent); break; } case FILTER_TYPE_SPATIAL_ANALYSIS: { affected=true; break; } } return affected; } bool needsRangeParent(const Filter *f) { switch(f->getType()) { case FILTER_TYPE_CLUSTER_ANALYSIS: return true; default: return false; } } unsigned int needsUnrangedData(const Filter *f) { if(f->getType() == FILTER_TYPE_IONINFO) { const IonInfoFilter *fInfo = (const IonInfoFilter *)f; return fInfo->needsUnrangedData(); } if(f->getType() == FILTER_TYPE_SPECTRUMPLOT) { const SpectrumPlotFilter *fSp = (const SpectrumPlotFilter *)f; return fSp->needsUnrangedData(); } return false; } void FilterTreeAnalyse::getAnalysisResults(std::vector &errs) const { errs.resize(analysisResults.size()); std::copy(analysisResults.begin(),analysisResults.end(),errs.begin()); } void FilterTreeAnalyse::analyse(const FilterTree &f) { clear(); f.getAccumulatedPropagationMaps(emitTypes,blockTypes); //Check for a data pair where the output is entirely blocked, // rendering computation of filter useless blockingPairError(f); //Check for spatial sampling altering some results in later analyses spatialSampling(f); //Check for compositional biasing altering some later anaylsis compositionAltered(f); //Check for filters that do not have a parent, which is required checkRequiredParent(f); //check for unranged data required by child checkUnrangedData(f); emitTypes.clear(); blockTypes.clear(); } void FilterTreeAnalyse::blockingPairError(const FilterTree &f) { //Examine the emit and block/use masks for each filter's parent (emit) // child relationship(block/use), such that in the case of a child filter that is expecting // a particular input, but the parent cannot generate it const tree &treeFilt=f.getTree(); for(tree::pre_order_iterator it = treeFilt.begin(); it!=treeFilt.end(); ++it) { tree_node_ *myNode=it.node->first_child; size_t parentEmit; parentEmit = emitTypes[(*it) ]| (*it)->getRefreshEmitMask(); while(myNode) { Filter *childFilter; childFilter = myNode->data; size_t curBlock,curUse; curBlock=blockTypes[childFilter] | childFilter->getRefreshBlockMask(); curUse=childFilter->getRefreshUseMask(); //If the child filter cannot use and blocks all parent emit values // emission of the all possible output filters, // then this is a bad filter pairing bool passedThrough; passedThrough=parentEmit & ~curBlock; if(!parentEmit && curUse) { FILTERTREE_ERR treeErr; treeErr.reportedFilters.push_back(childFilter); treeErr.reportedFilters.push_back(*it); treeErr.verboseReportMessage = TRANS("Parent filter has no output, but filter requires input -- there is no point in placing a child filter here."); treeErr.shortReportMessage = TRANS("Leaf-only filter with child"); treeErr.severity=ANALYSE_SEVERITY_ERROR; //This is definitely a bad thing. analysisResults.push_back(treeErr); } else if(!(parentEmit & curUse) && !passedThrough ) { FILTERTREE_ERR treeErr; treeErr.reportedFilters.push_back(childFilter); treeErr.reportedFilters.push_back(*it); treeErr.verboseReportMessage = TRANS("Parent filters' output will be blocked by child, without use. Parent results will be dropped."); treeErr.shortReportMessage = TRANS("Bad parent->child pair"); treeErr.severity=ANALYSE_SEVERITY_ERROR; //This is definitely a bad thing. analysisResults.push_back(treeErr); } //If the parent does not emit a usable objects //for the child filter, this is bad too. // - else if, so we don't double up on warnings else if( !(parentEmit & curUse) && !childFilter->isUsefulAsAppend()) { FILTERTREE_ERR treeErr; treeErr.reportedFilters.push_back(childFilter); treeErr.reportedFilters.push_back(*it); treeErr.verboseReportMessage = TRANS("First filter does not output anything useable by child filter. Child filter not useful."); treeErr.shortReportMessage = TRANS("Bad parent->child pair"); treeErr.severity=ANALYSE_SEVERITY_ERROR; //This is definitely a bad thing. analysisResults.push_back(treeErr); } //Move to next sibling myNode = myNode->next_sibling; } } } void FilterTreeAnalyse::spatialSampling(const FilterTree &f) { //True if spatial sampling is (probably) happening for children of //filter. vector affectedFilters; affectedFilters.push_back(FILTER_TYPE_CLUSTER_ANALYSIS); //If have range parent affectedFilters.push_back(FILTER_TYPE_PROFILE); //If using density affectedFilters.push_back(FILTER_TYPE_SPATIAL_ANALYSIS); affectedFilters.push_back(FILTER_TYPE_IONINFO); const tree &treeFilt=f.getTree(); for(tree::pre_order_iterator it(treeFilt.begin()); it!=treeFilt.end(); ++it) { //Check to see if we have a filter that can cause sampling if(filterIsSampling(*it)) { tree_node_ *childNode=it.node->first_child; if(childNode) { //TODO: Not the most efficient method of doing this... //shouldn't need to continually compute depth to iterate over children size_t minDepth=treeFilt.depth(it); for(tree::pre_order_iterator itJ(childNode); treeFilt.depth(itJ) > minDepth;++itJ) { //ignore filters that are not affected by spatial sampling size_t filterType; filterType=(*itJ)->getType(); if(std::find(affectedFilters.begin(),affectedFilters.end(),filterType)== affectedFilters.end()) continue; childNode=itJ.node; //Check to see if we have a "range" type ancestor // - we will need to know this in a second bool haveRngParent=false; { tree_node_ *ancestor; ancestor = childNode->parent; while(true) { if(ancestor->data->getType() == FILTER_TYPE_RANGEFILE) { haveRngParent=true; break; } if(!ancestor->parent) break; ancestor=ancestor->parent; } } if(affectedBySampling(*itJ,haveRngParent)) { FILTERTREE_ERR treeErr; treeErr.reportedFilters.push_back(*it); treeErr.reportedFilters.push_back(*itJ); treeErr.shortReportMessage=TRANS("Spatial results possibly altered"); treeErr.verboseReportMessage=TRANS("Filters and settings selected that could alter reported results that depend upon density. Check to see if spatial sampling may be happening in the filter tree - this warning is provisional only."); treeErr.severity=ANALYSE_SEVERITY_WARNING; analysisResults.push_back(treeErr); } } } //No need to walk child nodes it.skip_children(); } } } void FilterTreeAnalyse::checkRequiredParent(const FilterTree &f) { const tree &treeFilt=f.getTree(); vector::pre_order_iterator , size_t> > childrenNeedsParent; for(tree::pre_order_iterator it = treeFilt.begin(); it!=treeFilt.end(); ++it) { //Enumerate all the filters that need a range parent if(needsRangeParent(*it)) childrenNeedsParent.push_back(make_pair(it,(size_t)FILTER_TYPE_RANGEFILE)); } //Check each of the reported children, each time it was reported for(size_t ui=0;ui::pre_order_iterator it; size_t type; it = childrenNeedsParent[ui].first; type = childrenNeedsParent[ui].second; tree::pre_order_iterator parentIt; bool foundParent; foundParent=false; //walk back up the tree, to locate the parent (technically ancestor) // we are looking for while(treeFilt.depth(it)) { it= treeFilt.parent(it); if((*it)->getType() == type) { foundParent=true; break; } } //If we couldn't find a parent, then this is an error. // let the user know if(!foundParent) { std::string tmpStr; Filter *tmpFilt = makeFilter(type); tmpStr=tmpFilt->typeString(); delete tmpFilt; FILTERTREE_ERR treeErr; treeErr.reportedFilters.push_back(*(childrenNeedsParent[ui].first)); treeErr.verboseReportMessage = TRANS("Filter needs parent \"") + tmpStr + TRANS("\" but does not have one. Filter may not function correctly until this parent is given."); treeErr.shortReportMessage = TRANS("Filter missing needed parent"); treeErr.severity=ANALYSE_SEVERITY_ERROR; //This is definitely a bad thing. analysisResults.push_back(treeErr); } } } void FilterTreeAnalyse::checkUnrangedData(const FilterTree &f) { const tree &treeFilt=f.getTree(); for(tree::pre_order_iterator it(treeFilt.begin()); it!=treeFilt.end(); ++it) { //Check to see if we have a filter that can be affected by unranged data, missing or present if((*it)->getType() == FILTER_TYPE_RANGEFILE) { const RangeFileFilter *rngF = (const RangeFileFilter *)(*it); //we only need to investigate filters which drop data if( !rngF->getDropUnranged() ) continue; for(tree::pre_order_iterator itJ(it); itJ!=treeFilt.end();++itJ) { //we need ranged data, but don't have it. Warn if(needsUnrangedData(*itJ)) { FILTERTREE_ERR treeErr; treeErr.reportedFilters.push_back(*it); treeErr.reportedFilters.push_back(*itJ); treeErr.shortReportMessage=TRANS("Bad range filter settings"); treeErr.verboseReportMessage=TRANS("Rangefile set to drop unranged data, however a child filter requires it."); treeErr.severity=ANALYSE_SEVERITY_WARNING; analysisResults.push_back(treeErr); } } } } } bool filterAltersComposition(const Filter *f) { bool affectsComposition=false; FilterPropGroup props; f->getProperties(props); switch(f->getType()) { case FILTER_TYPE_IONDOWNSAMPLE: { FilterProperty p; if(!props.hasProp(KEY_IONDOWNSAMPLE_PERSPECIES)) return false; p=props.getPropValue(KEY_IONDOWNSAMPLE_PERSPECIES); const int GROUP_SAMPLING=1; if(p.data== "1" && props.hasGroup(GROUP_SAMPLING)) { vector propVec; props.getGroup(GROUP_SAMPLING,propVec); //If using per-species mode, then // we may affect the output ion composition // if we have differing values for(size_t ui=1;ui enabledIons,enabledRanges; enabledIons = r->getEnabledIons(); if(enabledIons.size() > 1) { size_t nEnabled=std::accumulate(enabledIons.begin(),enabledIons.end(),0); if(nEnabled > 0 && nEnabled < enabledIons.size()) return true; } enabledRanges=r->getEnabledRanges(); if(enabledRanges.size() > 1) { size_t nEnabled=std::accumulate(enabledRanges.begin(),enabledRanges.end(),0); if(nEnabled > 0 && nEnabled < enabledRanges.size()) return true; } break; } } return affectsComposition; } bool filterAffectedByComposition(const Filter *f, bool haveRngParent) { FilterPropGroup props; f->getProperties(props); bool affected=false; //See if filter is configured to affect spatial analysis switch(f->getType()) { case FILTER_TYPE_CLUSTER_ANALYSIS: { affected=haveRngParent; break; } case FILTER_TYPE_PROFILE: { FilterProperty p; p=props.getPropValue(PROFILE_KEY_NORMALISE); //Affected if using normalise mode, and we do have a range parent affected= (p.data== "1" && haveRngParent); break; } case FILTER_TYPE_SPATIAL_ANALYSIS: { affected=true; break; } } return affected; } //FIXME: This is largely a cut and paste of ::spatialSampling - could be unified through // function pointers and friends void FilterTreeAnalyse::compositionAltered(const FilterTree &f) { //True if composition biasing is (probably) happening for children of //filter. vector affectedFilters; affectedFilters.push_back(FILTER_TYPE_CLUSTER_ANALYSIS); //If have range parent affectedFilters.push_back(FILTER_TYPE_PROFILE); //By definition affectedFilters.push_back(FILTER_TYPE_IONINFO); //If using composition const tree &treeFilt=f.getTree(); for(tree::pre_order_iterator it(treeFilt.begin()); it!=treeFilt.end(); ++it) { //Check to see if we have a filter that can cause sampling if(filterAltersComposition(*it)) { tree_node_ *childNode=it.node->first_child; if(childNode) { //TODO: Not the most efficient method of doing this... //shouldn't need to continually compute depth to iterate over children size_t minDepth=treeFilt.depth(it); for(tree::pre_order_iterator itJ(childNode); treeFilt.depth(itJ) > minDepth;++itJ) { //ignore filters that are not affected by spatial sampling size_t filterType; filterType=(*itJ)->getType(); if(std::find(affectedFilters.begin(),affectedFilters.end(),filterType)== affectedFilters.end()) continue; childNode=itJ.node; //Check to see if we have a "range" type ancestor // - we will need to know this in a second bool haveRngParent=false; { tree_node_ *ancestor; ancestor = childNode->parent; while(true) { if(ancestor->data->getType() == FILTER_TYPE_RANGEFILE) { haveRngParent=true; break; } if(!ancestor->parent) break; ancestor=ancestor->parent; } } if(filterAffectedByComposition(*itJ,haveRngParent)) { FILTERTREE_ERR treeErr; treeErr.reportedFilters.push_back(*it); treeErr.reportedFilters.push_back(*itJ); treeErr.shortReportMessage=TRANS("Composition results possibly altered"); treeErr.verboseReportMessage=TRANS("Filters and settings selected that could bias reported composition. Check to see if species biasing may occcur in the filter tree - this warning is provisional only."); treeErr.severity=ANALYSE_SEVERITY_WARNING; analysisResults.push_back(treeErr); } } } //No need to walk child nodes it.skip_children(); } } } 3Depict-0.0.19/src/backend/filtertreeAnalyse.h0000644000175000017500000000512712640746376020515 0ustar pcuserpcuser/* * filtertree.h - Filter tree topology and data propagation handling * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef FILTERTREEANALYSE_H #define FILTERTREEANALYSE_H #include "filtertree.h" enum { ANALYSE_SEVERITY_WARNING, // Probable warning ANALYSE_SEVERITY_ERROR, // definite error ANALYSE_SEVERITY_END_ENUM // Not a severity, just end of enum }; struct FILTERTREE_ERR { //The filters that are associated with the error messages std::vector reportedFilters; //Error messages associated with the reported filters std::string verboseReportMessage,shortReportMessage; unsigned int severity; }; class FilterTreeAnalyse { private: std::vector analysisResults; //Accumulated emit and block masks for the filter tree // these are only valid during the call to ::analyse std::map emitTypes; //Whatever types can be emitted from this filer, considering this filter's ancestors in tree, not incl. self std::map blockTypes; //Whatever types can be blocked by this filter, considering this filter's children in tree, not incl. self //!Detect misconfiguration of the filter tree // where parent emits something that the child // cannot use void blockingPairError( const FilterTree &f); //!Detect case where algorithms that depend // upon there being no spatial sampling // are being used with sampling. void spatialSampling(const FilterTree &f); //check to see if there is a filter who is biasing composition void compositionAltered(const FilterTree &f); //check to see if there is a filter that needs a particular parent void checkRequiredParent(const FilterTree &f); //check to see if there is a filter that needs unranged data to work, // but does not have it void checkUnrangedData(const FilterTree &f); public: void analyse(const FilterTree &f); void getAnalysisResults(std::vector &errs) const; void clear() {analysisResults.clear();}; }; #endif 3Depict-0.0.19/src/backend/animator.cpp0000644000175000017500000003457512716174467017211 0ustar pcuserpcuser/* * animatior.cpp - animation interopolator implementation * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "animator.h" #include "common/stringFuncs.h" #include "common/basics.h" #include #include using std::string; using std::map; using std::vector; using std::pair; using std::make_pair; using std::endl; using std::set; const char *INTERP_NAME[] ={ "Step", "Linear", "RGB Linear", "List", "3D Linear", "3D Step" }; PropertyAnimator::PropertyAnimator() { } PropertyAnimator::PropertyAnimator(const PropertyAnimator &p) : keyFrames(p.keyFrames) { } void PropertyAnimator::getNthKeyFrame(size_t frameNum,FrameProperties &f) const { ASSERT(frameNum < keyFrames.size()); f=keyFrames[frameNum]; } size_t PropertyAnimator::getMaxFrame() const { size_t maxFrame=0; for(size_t ui=0; ui &vec) { std::sort(vec.begin(),vec.end()); //FIXME: LAME!! Very inefficient for(size_t ui=vec.size();ui;) { ui--; removeNthKeyFrame(vec[ui]); } } void PropertyAnimator::getPropertiesAtFrame(size_t keyframe, vector &propIds, vector &props) const { #ifdef DEBUG std::set conflicts; ASSERT(checkSelfConsistent(conflicts)); #endif std::set seenIds; //Find the frames that are active for(size_t ui=0;ui= keyframe && keyFrames[ui].getMinFrame() <=keyframe) { propIds.push_back(ui); props.push_back(keyFrames[ui]); seenIds.insert(keyFrames[ui].getFilterId()); } } //Map the filter Id's to the most recently active keyframe map bestFrames; //Find the frames that have been active, and not overridden by a newer frame // and are thus still in effect for(size_t ui=0;uikeyframe) continue; //OK, so we could be active, or there could be a newer //frame in effect we haven't seen if(bestFrames.find(filterId)==bestFrames.end()) { bestFrames[filterId] = ui; continue; } if(maxFrame >=keyFrames[bestFrames[filterId]].getMaxFrame()) { bestFrames[filterId]=ui; continue; } } //Now sweep up all the best frames for(map::iterator it=bestFrames.begin(); it!=bestFrames.end(); ++it) { propIds.push_back(it->second); props.push_back(keyFrames[it->second]); } } bool PropertyAnimator::checkSelfConsistent(std::set &conflictFrames) const { for(size_t ui=0;ui conflicts; ASSERT(checkSelfConsistent(conflicts)); #endif //Search for the unique keyframe that alters our target property for(size_t ui=0;ui=keyFrames[ui].getMinFrame() && frame <=keyFrames[ui].getMaxFrame() ) { keyFrameId=ui; break; } } if(keyFrameId==(size_t)-1) { //So there is no interpolated data within this run // check again for a "latest" modified version // and "hold" that value to generate our interpolated result //First in pair is frame ID, second is max frame that this occurred at std::vector > seenFrames; for(size_t ui=0;ui" << endl; for(size_t ui=0;ui" << endl; return true; } //Should be pointing to a propertyanimator node bool PropertyAnimator::loadState(xmlNodePtr &nodePtr) { keyFrames.clear(); while(!XMLHelpFwdToElem(nodePtr, "frame")) { xmlNodePtr childPtr; size_t filterId, propKey; //obtain the frame content XML pointer childPtr=nodePtr->xmlChildrenNode; if(!childPtr) return false; //Read the contents of this frame if(XMLHelpFwdToElem(childPtr,"filterid")) return false; if(XMLHelpGetProp(filterId,childPtr,"val")) return false; if(XMLHelpFwdToElem(childPtr,"propertykey")) return false; if(XMLHelpGetProp(propKey,childPtr,"val")) return false; //Read the tag and its children { FrameProperties fp(filterId,propKey); if(XMLHelpFwdToElem(childPtr,"framedata")) return false; xmlNodePtr framePtr; framePtr=childPtr->xmlChildrenNode; if(!framePtr) return false; do { size_t offsetVal; string data; if(XMLHelpFwdToElem(framePtr,"frame")) return false; if(XMLHelpGetProp(offsetVal,framePtr,"offset")) return false; if(XMLHelpGetProp(data,framePtr,"data")) return false; fp.addKeyFrame(offsetVal,data); } while(!XMLHelpFwdToElem(childPtr, "frame")) ; if(XMLHelpFwdToElem(framePtr,"interpdata")) return false; size_t mode; if(XMLHelpGetProp(mode,framePtr,"mode")) return false; fp.setInterpMode(mode); //save the keyframe keyFrames.push_back(fp); } } return true; } void PropertyAnimator::getIdList(vector &ids) const { set s; for(size_t ui=0;ui &newIdMap) { vector killItems; killItems.resize(keyFrames.size(),false); //Remap the keyframes that we can map for(size_t ui=0;ui::const_iterator it; it=newIdMap.find(oldId); //Update the mappings we can, // Delete keyFrames we cannot remap if(it == newIdMap.end()) killItems[ui]=true; else keyFrames[ui].remapId(it->second); } //Perform erase vectorMultiErase(keyFrames,killItems); } FrameProperties::FrameProperties(size_t idFilt,size_t idKey) { filterId=idFilt; propertyKey=idKey; } FrameProperties::~FrameProperties() { } void FrameProperties::setInterpMode(size_t mode) { ASSERT(mode::max(); for(size_t ui=0; ui" << endl; f <" << endl; f <" << endl; //Dump the frame data vector f << tabs(depth+1) << "" << endl; for(unsigned int ui=0;ui" << endl; } f << tabs(depth+2) << "" << endl; f << tabs(depth+1) << "" << endl; f << tabs(depth) << "" << endl; return true; } std::string InterpData::getInterpolatedData(const vector > &keyData,size_t frame) const { std::string resStr; switch(interpMode) { case INTERP_STEP: case INTERP_STEP_POINT3D: { ASSERT(keyData.size() ==1); ASSERT(keyData[0].first==frame) return keyData[0].second; } case INTERP_LINEAR_FLOAT: { ASSERT(keyData.size() ==2); float a, b; size_t startF,endF; //Either way around, it should successfully // transfer ASSERT(!stream_cast(a,keyData[0].second)); ASSERT(!stream_cast(b,keyData[1].second)); //Flip the key data such that it is the correct way 'round if(keyData[0].first < keyData[1].first) { stream_cast(a,keyData[0].second); stream_cast(b,keyData[1].second); startF=keyData[0].first; endF=keyData[1].first; } else { stream_cast(a,keyData[1].second); stream_cast(b,keyData[0].second); startF=keyData[0].first; endF=keyData[1].first; } //Obtain the linearly interpolated result float res; res=interpLinearRamp(startF,endF,frame,a,b); stream_cast(resStr,res); return resStr; } case INTERP_LINEAR_COLOUR: { ASSERT(keyData.size() ==2); //TODO: I don't have the internets here, // so I can't look up the RGB->HSV interpolation // matrix. HSV interpolation should look more natural //Perform linear RGB interpolation //Parse the colour start and end strings //--------- ColourRGBA tmpCol[2]; tmpCol[0].parse(keyData[0].second); tmpCol[1].parse(keyData[1].second); //--------- //Get and flip the key data such that it is the correct way 'round size_t startF,endF; if(keyData[0].first < keyData[1].first) { startF=keyData[0].first; endF=keyData[1].first; } else { startF=keyData[1].first; endF=keyData[0].first; } //interpolate the colour value ColourRGBAf interpCol; float delta; delta = (float)(frame - startF )/ (float)(endF - startF); interpCol=tmpCol[0].toRGBAf().interpolate(delta,tmpCol[1].toRGBAf()); return interpCol.toColourRGBA().rgbaString(); } case INTERP_LIST: { ASSERT(keyData.size()); size_t frameOffset=keyData[0].first; ASSERT(frame-frameOffset =startFrame && curFrame <=endFrame); float frac; frac = ((float)(curFrame-startFrame)) / (float)(endFrame - startFrame); return frac*(b-a) + a; } 3Depict-0.0.19/src/backend/animator.h0000644000175000017500000001245712640746376016651 0ustar pcuserpcuser/* * animator.h - animation classes for 3Depict * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef ANIMATOR_H #define ANIMATOR_H #include "filter.h" #include "common/xmlHelper.h" #include #include enum { INTERP_STEP, INTERP_LINEAR_FLOAT, INTERP_LINEAR_COLOUR, INTERP_LIST, INTERP_LINEAR_POINT3D, INTERP_STEP_POINT3D, INTERP_END }; extern const char *INTERP_NAME[]; class FrameProperties; class InterpData { public: size_t interpMode; //!Obtain the interpolated data at the specified frame, // for the properties given as a parameter. // should only be called for frames that lie within the interpolated // range std::string getInterpolatedData(const std::vector > &keyData,size_t frame) const; float interpLinearRamp(size_t startFrame, size_t endFrame, size_t curFrame, float a, float b) const; }; //!Frame-by-frame properties for a specific filter class FrameProperties { private: //ID of the filter that whose properties are to be altered size_t filterId; //Property Key for filter size_t propertyKey; //!First in pair is frame offset, second is property at that frame std::vector > frameData; //!Interpolation information InterpData interpData; public: FrameProperties() {}; FrameProperties(size_t filterIdVal,size_t propertyKeyVal); ~FrameProperties(); //!Get the minimal frame (which is affected) size_t getMinFrame() const; //!Get tha maximal frame (which is affected) size_t getMaxFrame() const; //!Add a key frame to the dataset void addKeyFrame(size_t frame, const FilterProperty &p); //!Add a key frame to the dataset void addKeyFrame(size_t frame, const std::string &p); //Set the interpolation mode void setInterpMode(size_t mode) ; //obtain the interpolation method size_t getInterpMode() const { return interpData.interpMode;}; size_t getFilterId() const { return filterId;} size_t getPropertyKey() const { return propertyKey;} std::string getInterpolatedData(size_t frame) const { return interpData.getInterpolatedData(frameData,frame);} //!Dump state to output stream, using specified format /* Current supported formats are STATE_FORMAT_XML. * Depth is indentation depth (for pretty-printing) */ bool writeState(std::ostream &f, unsigned int format, unsigned int depth=0) const ; bool loadState(xmlNodePtr &nodePtr ) ; void remapId(size_t newId); }; //!Animation of filter properties class PropertyAnimator { private: //Vector containing each properties new // value/key pairing std::vector keyFrames; public: PropertyAnimator(); PropertyAnimator(const PropertyAnimator &p); //!Are the properties self-consistent - returns true if OK bool checkSelfConsistent(std::set &conflictingFrames) const; //!Obtain the maximal frame for animation size_t getMaxFrame() const; //!Get all the properties that intersect or precede // a particular keyframe. void getPropertiesAtFrame(size_t keyframe, std::vector &propIds, std::vector &props) const; //Obtain the as-animated version of a specific filter for a particular frame. // returns empty string if the filter ID/key is not known. // Otherwise returns best-effort interpolated data std::string getInterpolatedFilterData(size_t id, size_t propKey, size_t frame) const; //-- Data modification funcs -- //!Add a property to the list of available props void addProp(const FrameProperties &p) { keyFrames.push_back(p);} //!Set a particlar property void setProp(size_t id, const FrameProperties &p); //!Remove frame by its unique ID void removeProp(size_t id); //!Remove all stored information void clear(); //!Get the number of properties stored size_t getNumProps() const { return keyFrames.size();} //Obtain the frame property by its position void getNthKeyFrame(size_t frameNum,FrameProperties &f) const ; //Remove this particular keyframe void removeNthKeyFrame(size_t frameNum); //Remove the specified key frames. Input vector contents will be sorted. void removeKeyFrames(std::vector &vec); //!Dump state to output stream, using specified format /* Current supported formats are STATE_FORMAT_XML. * Depth is indentation depth (for pretty-printing) */ bool writeState(std::ostream &f, unsigned int format, unsigned int depth=0) const; bool loadState(xmlNodePtr &nodePtr); //!Obtain the complete listing of IDs used internally void getIdList(std::vector &ids) const; //!Force the internal IDs for filters to a new value void updateMappings(const std::map &newMap); }; #endif 3Depict-0.0.19/src/backend/tree.hh0000644000175000017500000023570112640746376016145 0ustar pcuserpcuser/* * tree.hh - STL-like templated tree class. * Copyright (C) 2001-2009, Kasper Peeters * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // Distributed under the GNU General Public License version 3, // (eventually to be changed to the Boost Software License). /** The tree.hh library for C++ provides an STL-like container class for n-ary trees, templated over the data stored at the nodes. Various types of iterators are provided (post-order, pre-order, and others). Where possible the access methods are compatible with the STL or alternative algorithms are available. */ #ifndef tree_hh_ #define tree_hh_ #include #include #include #include #include #include #include #include // HP-style construct/destroy have gone from the standard, // so here is a copy. namespace kp { template void constructor(T1* p, T2& val) { new ((void *) p) T1(val); } template void constructor(T1* p) { new ((void *) p) T1; } template void destructor(T1* p) { p->~T1(); } } /// A node in the tree, combining links to other nodes as well as the actual data. template class tree_node_ { // size: 5*4=20 bytes (on 32 bit arch), can be reduced by 8. public: tree_node_ *parent; tree_node_ *first_child, *last_child; tree_node_ *prev_sibling, *next_sibling; T data; }; // __attribute__((packed)); template > > class tree { protected: typedef tree_node_ tree_node; public: /// Value of the data stored at a node. typedef T value_type; class iterator_base; class pre_order_iterator; class post_order_iterator; class sibling_iterator; class leaf_iterator; tree(); tree(const T&); tree(const iterator_base&); tree(const tree&); ~tree(); void operator=(const tree&); /// Base class for iterators, only pointers stored, no traversal logic. #ifdef __SGI_STL_PORT class iterator_base : public stlport::bidirectional_iterator { #else class iterator_base { #endif public: typedef T value_type; typedef T* pointer; typedef T& reference; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef std::bidirectional_iterator_tag iterator_category; iterator_base(); iterator_base(tree_node *); T& operator*() const; T* operator->() const; /// When called, the next increment/decrement skips children of this node. void skip_children(); void skip_children(bool skip); /// Number of children of the node pointed to by the iterator. unsigned int number_of_children() const; sibling_iterator begin() const; sibling_iterator end() const; tree_node *node; protected: bool skip_current_children_; }; /// Depth-first iterator, first accessing the node, then its children. class pre_order_iterator : public iterator_base { public: pre_order_iterator(); pre_order_iterator(tree_node *); pre_order_iterator(const iterator_base&); pre_order_iterator(const sibling_iterator&); bool operator==(const pre_order_iterator&) const; bool operator!=(const pre_order_iterator&) const; pre_order_iterator& operator++(); pre_order_iterator& operator--(); pre_order_iterator operator++(int); pre_order_iterator operator--(int); pre_order_iterator& operator+=(unsigned int); pre_order_iterator& operator-=(unsigned int); }; /// Depth-first iterator, first accessing the children, then the node itself. class post_order_iterator : public iterator_base { public: post_order_iterator(); post_order_iterator(tree_node *); post_order_iterator(const iterator_base&); post_order_iterator(const sibling_iterator&); bool operator==(const post_order_iterator&) const; bool operator!=(const post_order_iterator&) const; post_order_iterator& operator++(); post_order_iterator& operator--(); post_order_iterator operator++(int); post_order_iterator operator--(int); post_order_iterator& operator+=(unsigned int); post_order_iterator& operator-=(unsigned int); /// Set iterator to the first child as deep as possible down the tree. void descend_all(); }; /// Breadth-first iterator, using a queue class breadth_first_queued_iterator : public iterator_base { public: breadth_first_queued_iterator(); breadth_first_queued_iterator(tree_node *); breadth_first_queued_iterator(const iterator_base&); bool operator==(const breadth_first_queued_iterator&) const; bool operator!=(const breadth_first_queued_iterator&) const; breadth_first_queued_iterator& operator++(); breadth_first_queued_iterator operator++(int); breadth_first_queued_iterator& operator+=(unsigned int); private: std::queue traversal_queue; }; /// The default iterator types throughout the tree class. typedef pre_order_iterator iterator; typedef breadth_first_queued_iterator breadth_first_iterator; /// Iterator which traverses only the nodes at a given depth from the root. class fixed_depth_iterator : public iterator_base { public: fixed_depth_iterator(); fixed_depth_iterator(tree_node *); fixed_depth_iterator(const iterator_base&); fixed_depth_iterator(const sibling_iterator&); fixed_depth_iterator(const fixed_depth_iterator&); bool operator==(const fixed_depth_iterator&) const; bool operator!=(const fixed_depth_iterator&) const; fixed_depth_iterator& operator++(); fixed_depth_iterator& operator--(); fixed_depth_iterator operator++(int); fixed_depth_iterator operator--(int); fixed_depth_iterator& operator+=(unsigned int); fixed_depth_iterator& operator-=(unsigned int); tree_node *top_node; }; /// Iterator which traverses only the nodes which are siblings of each other. class sibling_iterator : public iterator_base { public: sibling_iterator(); sibling_iterator(tree_node *); sibling_iterator(const sibling_iterator&); sibling_iterator(const iterator_base&); bool operator==(const sibling_iterator&) const; bool operator!=(const sibling_iterator&) const; sibling_iterator& operator++(); sibling_iterator& operator--(); sibling_iterator operator++(int); sibling_iterator operator--(int); sibling_iterator& operator+=(unsigned int); sibling_iterator& operator-=(unsigned int); tree_node *range_first() const; tree_node *range_last() const; tree_node *parent_; private: void set_parent_(); }; /// Iterator which traverses only the leaves. class leaf_iterator : public iterator_base { public: leaf_iterator(); leaf_iterator(tree_node *, tree_node *top=0); leaf_iterator(const sibling_iterator&); leaf_iterator(const iterator_base&); bool operator==(const leaf_iterator&) const; bool operator!=(const leaf_iterator&) const; leaf_iterator& operator++(); leaf_iterator& operator--(); leaf_iterator operator++(int); leaf_iterator operator--(int); leaf_iterator& operator+=(unsigned int); leaf_iterator& operator-=(unsigned int); private: tree_node *top_node; }; /// Return iterator to the beginning of the tree. inline pre_order_iterator begin() const; /// Return iterator to the end of the tree. inline pre_order_iterator end() const; /// Return post-order iterator to the beginning of the tree. post_order_iterator begin_post() const; /// Return post-order end iterator of the tree. post_order_iterator end_post() const; /// Return fixed-depth iterator to the first node at a given depth from the given iterator. fixed_depth_iterator begin_fixed(const iterator_base&, unsigned int) const; /// Return fixed-depth end iterator. fixed_depth_iterator end_fixed(const iterator_base&, unsigned int) const; /// Return breadth-first iterator to the first node at a given depth. breadth_first_queued_iterator begin_breadth_first() const; /// Return breadth-first end iterator. breadth_first_queued_iterator end_breadth_first() const; /// Return sibling iterator to the first child of given node. sibling_iterator begin(const iterator_base&) const; /// Return sibling end iterator for children of given node. sibling_iterator end(const iterator_base&) const; /// Return leaf iterator to the first leaf of the tree. leaf_iterator begin_leaf() const; /// Return leaf end iterator for entire tree. leaf_iterator end_leaf() const; /// Return leaf iterator to the first leaf of the subtree at the given node. leaf_iterator begin_leaf(const iterator_base& top) const; /// Return leaf end iterator for the subtree at the given node. leaf_iterator end_leaf(const iterator_base& top) const; /// Return iterator to the parent of a node. template static iter parent(iter); /// Return iterator to the previous sibling of a node. template iter previous_sibling(iter) const; /// Return iterator to the next sibling of a node. template iter next_sibling(iter) const; /// Return iterator to the next node at a given depth. template iter next_at_same_depth(iter) const; /// Erase all nodes of the tree. void clear(); /// Erase element at position pointed to by iterator, return incremented iterator. template iter erase(iter); /// Erase all children of the node pointed to by iterator. void erase_children(const iterator_base&); /// Insert empty node as last/first child of node pointed to by position. template iter append_child(iter position); template iter prepend_child(iter position); /// Insert node as last/first child of node pointed to by position. template iter append_child(iter position, const T& x); template iter prepend_child(iter position, const T& x); /// Append the node (plus its children) at other_position as last/first child of position. template iter append_child(iter position, iter other_position); template iter prepend_child(iter position, iter other_position); /// Append the nodes in the from-to range (plus their children) as last/first children of position. template iter append_children(iter position, sibling_iterator from, sibling_iterator to); template iter prepend_children(iter position, sibling_iterator from, sibling_iterator to); /// Short-hand to insert topmost node in otherwise empty tree. pre_order_iterator set_head(const T& x); /// Insert node as previous sibling of node pointed to by position. template iter insert(iter position, const T& x); /// Specialisation of previous member. sibling_iterator insert(sibling_iterator position, const T& x); /// Insert node (with children) pointed to by subtree as previous sibling of node pointed to by position. template iter insert_subtree(iter position, const iterator_base& subtree); /// Insert node as next sibling of node pointed to by position. template iter insert_after(iter position, const T& x); /// Insert node (with children) pointed to by subtree as next sibling of node pointed to by position. template iter insert_subtree_after(iter position, const iterator_base& subtree); /// Replace node at 'position' with other node (keeping same children); 'position' becomes invalid. template iter replace(iter position, const T& x); /// Replace node at 'position' with subtree starting at 'from' (do not erase subtree at 'from'); see above. template iter replace(iter position, const iterator_base& from); /// Replace string of siblings (plus their children) with copy of a new string (with children); see above sibling_iterator replace(sibling_iterator orig_begin, sibling_iterator orig_end, sibling_iterator new_begin, sibling_iterator new_end); /// Move all children of node at 'position' to be siblings, returns position. template iter flatten(iter position); /// Move nodes in range to be children of 'position'. template iter reparent(iter position, sibling_iterator begin, sibling_iterator end); /// Move all child nodes of 'from' to be children of 'position'. template iter reparent(iter position, iter from); /// Replace node with a new node, making the old node a child of the new node. template iter wrap(iter position, const T& x); /// Move 'source' node (plus its children) to become the next sibling of 'target'. template iter move_after(iter target, iter source); /// Move 'source' node (plus its children) to become the previous sibling of 'target'. template iter move_before(iter target, iter source); sibling_iterator move_before(sibling_iterator target, sibling_iterator source); /// Move 'source' node (plus its children) to become the node at 'target' (erasing the node at 'target'). template iter move_ontop(iter target, iter source); /// Merge with other tree, creating new branches and leaves only if they are not already present. void merge(sibling_iterator, sibling_iterator, sibling_iterator, sibling_iterator, bool duplicate_leaves=false); /// Sort (std::sort only moves values of nodes, this one moves children as well). void sort(sibling_iterator from, sibling_iterator to, bool deep=false); template void sort(sibling_iterator from, sibling_iterator to, StrictWeakOrdering comp, bool deep=false); /// Compare two ranges of nodes (compares nodes as well as tree structure). template bool equal(const iter& one, const iter& two, const iter& three) const; template bool equal(const iter& one, const iter& two, const iter& three, BinaryPredicate) const; template bool equal_subtree(const iter& one, const iter& two) const; template bool equal_subtree(const iter& one, const iter& two, BinaryPredicate) const; /// Extract a new tree formed by the range of siblings plus all their children. tree subtree(sibling_iterator from, sibling_iterator to) const; void subtree(tree&, sibling_iterator from, sibling_iterator to) const; /// Exchange the node (plus subtree) with its sibling node (do nothing if no sibling present). void swap(sibling_iterator it); /// Exchange two nodes (plus subtrees) void swap(iterator, iterator); /// Count the total number of nodes. size_t size() const; /// Count the total number of nodes below the indicated node (plus one). size_t size(const iterator_base&) const; /// Check if tree is empty. bool empty() const; /// Compute the depth to the root or to a fixed other iterator. static int depth(const iterator_base&); static int depth(const iterator_base&, const iterator_base&); /// Determine the maximal depth of the tree. An empty tree has max_depth=-1. int max_depth() const; /// Determine the maximal depth of the tree with top node at the given position. int max_depth(const iterator_base&) const; /// Count the number of children of node at position. static unsigned int number_of_children(const iterator_base&); /// Count the number of siblings (left and right) of node at iterator. Total nodes at this level is +1. unsigned int number_of_siblings(const iterator_base&) const; /// Determine whether node at position is in the subtrees with root in the range. bool is_in_subtree(const iterator_base& position, const iterator_base& begin, const iterator_base& end) const; /// Determine whether the iterator is an 'end' iterator and thus not actually pointing to a node. bool is_valid(const iterator_base&) const; /// Determine the index of a node in the range of siblings to which it belongs. unsigned int index(sibling_iterator it) const; /// Inverse of 'index': return the n-th child of the node at position. static sibling_iterator child(const iterator_base& position, unsigned int); /// Return iterator to the sibling indicated by index sibling_iterator sibling(const iterator_base& position, unsigned int); /// Comparator class for iterators (compares pointer values; why doesn't this work automatically?) class iterator_base_less { public: bool operator()(const typename tree::iterator_base& one, const typename tree::iterator_base& two) const { return one.node < two.node; } }; tree_node *head, *feet; // head/feet are always dummy; if an iterator points to them it is invalid private: tree_node_allocator alloc_; void head_initialise_(); void copy_(const tree& other); /// Comparator class for two nodes of a tree (used for sorting and searching). template class compare_nodes { public: compare_nodes(StrictWeakOrdering comp) : comp_(comp) {}; bool operator()(const tree_node *a, const tree_node *b) { return comp_(a->data, b->data); } private: StrictWeakOrdering comp_; }; }; //template //class iterator_base_less { // public: // bool operator()(const typename tree::iterator_base& one, // const typename tree::iterator_base& two) const // { // txtout << "operatorclass<" << one.node < two.node << std::endl; // return one.node < two.node; // } //}; // template // bool operator<(const typename tree::iterator& one, // const typename tree::iterator& two) // { // txtout << "operator< " << one.node < two.node << std::endl; // if(one.node < two.node) return true; // return false; // } // // template // bool operator==(const typename tree::iterator& one, // const typename tree::iterator& two) // { // txtout << "operator== " << one.node == two.node << std::endl; // if(one.node == two.node) return true; // return false; // } // // template // bool operator>(const typename tree::iterator_base& one, // const typename tree::iterator_base& two) // { // txtout << "operator> " << one.node < two.node << std::endl; // if(one.node > two.node) return true; // return false; // } // Tree template tree::tree() { head_initialise_(); } template tree::tree(const T& x) { head_initialise_(); set_head(x); } template tree::tree(const iterator_base& other) { head_initialise_(); set_head((*other)); replace(begin(), other); } template tree::~tree() { clear(); alloc_.deallocate(head,1); alloc_.deallocate(feet,1); } template void tree::head_initialise_() { head = alloc_.allocate(1,0); // MSVC does not have default second argument feet = alloc_.allocate(1,0); head->parent=0; head->first_child=0; head->last_child=0; head->prev_sibling=0; //head; head->next_sibling=feet; //head; feet->parent=0; feet->first_child=0; feet->last_child=0; feet->prev_sibling=head; feet->next_sibling=0; } template void tree::operator=(const tree& other) { copy_(other); } template tree::tree(const tree& other) { head_initialise_(); copy_(other); } template void tree::copy_(const tree& other) { clear(); pre_order_iterator it=other.begin(), to=begin(); while(it!=other.end()) { to=insert(to, (*it)); it.skip_children(); ++it; } to=begin(); it=other.begin(); while(it!=other.end()) { to=replace(to, it); to.skip_children(); it.skip_children(); ++to; ++it; } } template void tree::clear() { if(head) while(head->next_sibling!=feet) erase(pre_order_iterator(head->next_sibling)); } template void tree::erase_children(const iterator_base& it) { // std::cout << "erase_children " << it.node << std::endl; if(it.node==0) return; tree_node *cur=it.node->first_child; tree_node *prev=0; while(cur!=0) { prev=cur; cur=cur->next_sibling; erase_children(pre_order_iterator(prev)); kp::destructor(&prev->data); alloc_.deallocate(prev,1); } it.node->first_child=0; it.node->last_child=0; // std::cout << "exit" << std::endl; } template template iter tree::erase(iter it) { tree_node *cur=it.node; assert(cur!=head); iter ret=it; ret.skip_children(); ++ret; erase_children(it); if(cur->prev_sibling==0) { cur->parent->first_child=cur->next_sibling; } else { cur->prev_sibling->next_sibling=cur->next_sibling; } if(cur->next_sibling==0) { cur->parent->last_child=cur->prev_sibling; } else { cur->next_sibling->prev_sibling=cur->prev_sibling; } kp::destructor(&cur->data); alloc_.deallocate(cur,1); return ret; } template typename tree::pre_order_iterator tree::begin() const { return pre_order_iterator(head->next_sibling); } template typename tree::pre_order_iterator tree::end() const { return pre_order_iterator(feet); } template typename tree::breadth_first_queued_iterator tree::begin_breadth_first() const { return breadth_first_queued_iterator(head->next_sibling); } template typename tree::breadth_first_queued_iterator tree::end_breadth_first() const { return breadth_first_queued_iterator(); } template typename tree::post_order_iterator tree::begin_post() const { tree_node *tmp=head->next_sibling; if(tmp!=feet) { while(tmp->first_child) tmp=tmp->first_child; } return post_order_iterator(tmp); } template typename tree::post_order_iterator tree::end_post() const { return post_order_iterator(feet); } template typename tree::fixed_depth_iterator tree::begin_fixed(const iterator_base& pos, unsigned int dp) const { typename tree::fixed_depth_iterator ret; ret.top_node=pos.node; tree_node *tmp=pos.node; unsigned int curdepth=0; while(curdepthfirst_child==0) { if(tmp->next_sibling==0) { // try to walk up and then right again do { if(tmp==ret.top_node) throw std::range_error("tree: begin_fixed out of range"); tmp=tmp->parent; if(tmp==0) throw std::range_error("tree: begin_fixed out of range"); --curdepth; } while(tmp->next_sibling==0); } tmp=tmp->next_sibling; } tmp=tmp->first_child; ++curdepth; } ret.node=tmp; return ret; } template typename tree::fixed_depth_iterator tree::end_fixed(const iterator_base& pos, unsigned int dp) const { assert(1==0); // FIXME: not correct yet: use is_valid() as a temporary workaround tree_node *tmp=pos.node; unsigned int curdepth=1; while(curdepthfirst_child==0) { tmp=tmp->next_sibling; if(tmp==0) throw std::range_error("tree: end_fixed out of range"); } tmp=tmp->first_child; ++curdepth; } return tmp; } template typename tree::sibling_iterator tree::begin(const iterator_base& pos) const { assert(pos.node!=0); if(pos.node->first_child==0) { return end(pos); } return pos.node->first_child; } template typename tree::sibling_iterator tree::end(const iterator_base& pos) const { sibling_iterator ret(0); ret.parent_=pos.node; return ret; } template typename tree::leaf_iterator tree::begin_leaf() const { tree_node *tmp=head->next_sibling; if(tmp!=feet) { while(tmp->first_child) tmp=tmp->first_child; } return leaf_iterator(tmp); } template typename tree::leaf_iterator tree::end_leaf() const { return leaf_iterator(feet); } template typename tree::leaf_iterator tree::begin_leaf(const iterator_base& top) const { tree_node *tmp=top.node; while(tmp->first_child) tmp=tmp->first_child; return leaf_iterator(tmp, top.node); } template typename tree::leaf_iterator tree::end_leaf(const iterator_base& top) const { return leaf_iterator(top.node, top.node); } template template iter tree::parent(iter position) { assert(position.node!=0); return iter(position.node->parent); } template template iter tree::previous_sibling(iter position) const { assert(position.node!=0); iter ret(position); ret.node=position.node->prev_sibling; return ret; } template template iter tree::next_sibling(iter position) const { assert(position.node!=0); iter ret(position); ret.node=position.node->next_sibling; return ret; } template template iter tree::next_at_same_depth(iter position) const { // We make use of a temporary fixed_depth iterator to implement this. typename tree::fixed_depth_iterator tmp(position.node); ++tmp; return iter(tmp); // assert(position.node!=0); // iter ret(position); // // if(position.node->next_sibling) { // ret.node=position.node->next_sibling; // } // else { // int relative_depth=0; // upper: // do { // ret.node=ret.node->parent; // if(ret.node==0) return ret; // --relative_depth; // } while(ret.node->next_sibling==0); // lower: // ret.node=ret.node->next_sibling; // while(ret.node->first_child==0) { // if(ret.node->next_sibling==0) // goto upper; // ret.node=ret.node->next_sibling; // if(ret.node==0) return ret; // } // while(relative_depth<0 && ret.node->first_child!=0) { // ret.node=ret.node->first_child; // ++relative_depth; // } // if(relative_depth<0) { // if(ret.node->next_sibling==0) goto upper; // else goto lower; // } // } // return ret; } template template iter tree::append_child(iter position) { assert(position.node!=head); assert(position.node); tree_node *tmp=alloc_.allocate(1,0); kp::constructor(&tmp->data); tmp->first_child=0; tmp->last_child=0; tmp->parent=position.node; if(position.node->last_child!=0) { position.node->last_child->next_sibling=tmp; } else { position.node->first_child=tmp; } tmp->prev_sibling=position.node->last_child; position.node->last_child=tmp; tmp->next_sibling=0; return tmp; } template template iter tree::prepend_child(iter position) { assert(position.node!=head); assert(position.node); tree_node *tmp=alloc_.allocate(1,0); kp::constructor(&tmp->data); tmp->first_child=0; tmp->last_child=0; tmp->parent=position.node; if(position.node->first_child!=0) { position.node->first_child->prev_sibling=tmp; } else { position.node->last_child=tmp; } tmp->next_sibling=position.node->first_child; position.node->prev_child=tmp; tmp->prev_sibling=0; return tmp; } template template iter tree::append_child(iter position, const T& x) { // If your program fails here you probably used 'append_child' to add the top // node to an empty tree. From version 1.45 the top element should be added // using 'insert'. See the documentation for further information, and sorry about // the API change. assert(position.node!=head); assert(position.node); tree_node* tmp = alloc_.allocate(1,0); kp::constructor(&tmp->data, x); tmp->first_child=0; tmp->last_child=0; tmp->parent=position.node; if(position.node->last_child!=0) { position.node->last_child->next_sibling=tmp; } else { position.node->first_child=tmp; } tmp->prev_sibling=position.node->last_child; position.node->last_child=tmp; tmp->next_sibling=0; return tmp; } template template iter tree::prepend_child(iter position, const T& x) { assert(position.node!=head); assert(position.node); tree_node* tmp = alloc_.allocate(1,0); kp::constructor(&tmp->data, x); tmp->first_child=0; tmp->last_child=0; tmp->parent=position.node; if(position.node->first_child!=0) { position.node->first_child->prev_sibling=tmp; } else { position.node->last_child=tmp; } tmp->next_sibling=position.node->first_child; position.node->first_child=tmp; tmp->prev_sibling=0; return tmp; } template template iter tree::append_child(iter position, iter other) { assert(position.node!=head); assert(position.node); sibling_iterator aargh=append_child(position, value_type()); return replace(aargh, other); } template template iter tree::prepend_child(iter position, iter other) { assert(position.node!=head); assert(position.node); sibling_iterator aargh=prepend_child(position, value_type()); return replace(aargh, other); } template template iter tree::append_children(iter position, sibling_iterator from, sibling_iterator to) { assert(position.node!=head); assert(position.node); iter ret=from; while(from!=to) { insert_subtree(position.end(), from); ++from; } return ret; } template template iter tree::prepend_children(iter position, sibling_iterator from, sibling_iterator to) { assert(position.node!=head); assert(position.node); iter ret=from; while(from!=to) { insert_subtree(position.begin(), from); ++from; } return ret; } template typename tree::pre_order_iterator tree::set_head(const T& x) { assert(head->next_sibling==feet); return insert(iterator(feet), x); } template template iter tree::insert(iter position, const T& x) { if(position.node==0) { position.node=feet; // Backward compatibility: when calling insert on a null node, // insert before the feet. } tree_node* tmp = alloc_.allocate(1,0); kp::constructor(&tmp->data, x); tmp->first_child=0; tmp->last_child=0; tmp->parent=position.node->parent; tmp->next_sibling=position.node; tmp->prev_sibling=position.node->prev_sibling; position.node->prev_sibling=tmp; if(tmp->prev_sibling==0) { if(tmp->parent) // when inserting nodes at the head, there is no parent tmp->parent->first_child=tmp; } else tmp->prev_sibling->next_sibling=tmp; return tmp; } template typename tree::sibling_iterator tree::insert(sibling_iterator position, const T& x) { tree_node* tmp = alloc_.allocate(1,0); kp::constructor(&tmp->data, x); tmp->first_child=0; tmp->last_child=0; tmp->next_sibling=position.node; if(position.node==0) { // iterator points to end of a subtree tmp->parent=position.parent_; tmp->prev_sibling=position.range_last(); tmp->parent->last_child=tmp; } else { tmp->parent=position.node->parent; tmp->prev_sibling=position.node->prev_sibling; position.node->prev_sibling=tmp; } if(tmp->prev_sibling==0) { if(tmp->parent) // when inserting nodes at the head, there is no parent tmp->parent->first_child=tmp; } else tmp->prev_sibling->next_sibling=tmp; return tmp; } template template iter tree::insert_after(iter position, const T& x) { tree_node* tmp = alloc_.allocate(1,0); kp::constructor(&tmp->data, x); tmp->first_child=0; tmp->last_child=0; tmp->parent=position.node->parent; tmp->prev_sibling=position.node; tmp->next_sibling=position.node->next_sibling; position.node->next_sibling=tmp; if(tmp->next_sibling==0) { if(tmp->parent) // when inserting nodes at the head, there is no parent tmp->parent->last_child=tmp; } else { tmp->next_sibling->prev_sibling=tmp; } return tmp; } template template iter tree::insert_subtree(iter position, const iterator_base& subtree) { // insert dummy iter it=insert(position, value_type()); // replace dummy with subtree return replace(it, subtree); } template template iter tree::insert_subtree_after(iter position, const iterator_base& subtree) { // insert dummy iter it=insert_after(position, value_type()); // replace dummy with subtree return replace(it, subtree); } // template // template // iter tree::insert_subtree(sibling_iterator position, iter subtree) // { // // insert dummy // iter it(insert(position, value_type())); // // replace dummy with subtree // return replace(it, subtree); // } template template iter tree::replace(iter position, const T& x) { kp::destructor(&position.node->data); kp::constructor(&position.node->data, x); return position; } template template iter tree::replace(iter position, const iterator_base& from) { assert(position.node!=head); tree_node *current_from=from.node; tree_node *start_from=from.node; tree_node *current_to =position.node; // replace the node at position with head of the replacement tree at from // std::cout << "warning!" << position.node << std::endl; erase_children(position); // std::cout << "no warning!" << std::endl; tree_node* tmp = alloc_.allocate(1,0); kp::constructor(&tmp->data, (*from)); tmp->first_child=0; tmp->last_child=0; if(current_to->prev_sibling==0) { if(current_to->parent!=0) current_to->parent->first_child=tmp; } else { current_to->prev_sibling->next_sibling=tmp; } tmp->prev_sibling=current_to->prev_sibling; if(current_to->next_sibling==0) { if(current_to->parent!=0) current_to->parent->last_child=tmp; } else { current_to->next_sibling->prev_sibling=tmp; } tmp->next_sibling=current_to->next_sibling; tmp->parent=current_to->parent; kp::destructor(¤t_to->data); alloc_.deallocate(current_to,1); current_to=tmp; // only at this stage can we fix 'last' tree_node *last=from.node->next_sibling; pre_order_iterator toit=tmp; // copy all children do { assert(current_from!=0); if(current_from->first_child != 0) { current_from=current_from->first_child; toit=append_child(toit, current_from->data); } else { while(current_from->next_sibling==0 && current_from!=start_from) { current_from=current_from->parent; toit=parent(toit); assert(current_from!=0); } current_from=current_from->next_sibling; if(current_from!=last) { toit=append_child(parent(toit), current_from->data); } } } while(current_from!=last); return current_to; } template typename tree::sibling_iterator tree::replace( sibling_iterator orig_begin, sibling_iterator orig_end, sibling_iterator new_begin, sibling_iterator new_end) { tree_node *orig_first=orig_begin.node; tree_node *new_first=new_begin.node; tree_node *orig_last=orig_first; while((++orig_begin)!=orig_end) orig_last=orig_last->next_sibling; tree_node *new_last=new_first; while((++new_begin)!=new_end) new_last=new_last->next_sibling; // insert all siblings in new_first..new_last before orig_first bool first=true; pre_order_iterator ret; while(1==1) { pre_order_iterator tt=insert_subtree(pre_order_iterator(orig_first), pre_order_iterator(new_first)); if(first) { ret=tt; first=false; } if(new_first==new_last) break; new_first=new_first->next_sibling; } // erase old range of siblings bool last=false; tree_node *next=orig_first; while(1==1) { if(next==orig_last) last=true; next=next->next_sibling; erase((pre_order_iterator)orig_first); if(last) break; orig_first=next; } return ret; } template template iter tree::flatten(iter position) { if(position.node->first_child==0) return position; tree_node *tmp=position.node->first_child; while(tmp) { tmp->parent=position.node->parent; tmp=tmp->next_sibling; } if(position.node->next_sibling) { position.node->last_child->next_sibling=position.node->next_sibling; position.node->next_sibling->prev_sibling=position.node->last_child; } else { position.node->parent->last_child=position.node->last_child; } position.node->next_sibling=position.node->first_child; position.node->next_sibling->prev_sibling=position.node; position.node->first_child=0; position.node->last_child=0; return position; } template template iter tree::reparent(iter position, sibling_iterator begin, sibling_iterator end) { tree_node *first=begin.node; tree_node *last=first; assert(first!=position.node); if(begin==end) return begin; // determine last node while((++begin)!=end) { last=last->next_sibling; } // move subtree if(first->prev_sibling==0) { first->parent->first_child=last->next_sibling; } else { first->prev_sibling->next_sibling=last->next_sibling; } if(last->next_sibling==0) { last->parent->last_child=first->prev_sibling; } else { last->next_sibling->prev_sibling=first->prev_sibling; } if(position.node->first_child==0) { position.node->first_child=first; position.node->last_child=last; first->prev_sibling=0; } else { position.node->last_child->next_sibling=first; first->prev_sibling=position.node->last_child; position.node->last_child=last; } last->next_sibling=0; tree_node *pos=first; for(;;) { pos->parent=position.node; if(pos==last) break; pos=pos->next_sibling; } return first; } template template iter tree::reparent(iter position, iter from) { if(from.node->first_child==0) return position; return reparent(position, from.node->first_child, end(from)); } template template iter tree::wrap(iter position, const T& x) { assert(position.node!=0); sibling_iterator fr=position, to=position; ++to; iter ret = insert(position, x); reparent(ret, fr, to); return ret; } template template iter tree::move_after(iter target, iter source) { tree_node *dst=target.node; tree_node *src=source.node; assert(dst); assert(src); if(dst==src) return source; if(dst->next_sibling) if(dst->next_sibling==src) // already in the right spot return source; // take src out of the tree if(src->prev_sibling!=0) src->prev_sibling->next_sibling=src->next_sibling; else src->parent->first_child=src->next_sibling; if(src->next_sibling!=0) src->next_sibling->prev_sibling=src->prev_sibling; else src->parent->last_child=src->prev_sibling; // connect it to the new point if(dst->next_sibling!=0) dst->next_sibling->prev_sibling=src; else dst->parent->last_child=src; src->next_sibling=dst->next_sibling; dst->next_sibling=src; src->prev_sibling=dst; src->parent=dst->parent; return src; } template template iter tree::move_before(iter target, iter source) { tree_node *dst=target.node; tree_node *src=source.node; assert(dst); assert(src); if(dst==src) return source; if(dst->prev_sibling) if(dst->prev_sibling==src) // already in the right spot return source; // take src out of the tree if(src->prev_sibling!=0) src->prev_sibling->next_sibling=src->next_sibling; else src->parent->first_child=src->next_sibling; if(src->next_sibling!=0) src->next_sibling->prev_sibling=src->prev_sibling; else src->parent->last_child=src->prev_sibling; // connect it to the new point if(dst->prev_sibling!=0) dst->prev_sibling->next_sibling=src; else dst->parent->first_child=src; src->prev_sibling=dst->prev_sibling; dst->prev_sibling=src; src->next_sibling=dst; src->parent=dst->parent; return src; } // specialisation for sibling_iterators template typename tree::sibling_iterator tree::move_before(sibling_iterator target, sibling_iterator source) { tree_node *dst=target.node; tree_node *src=source.node; tree_node *dst_prev_sibling; if(dst==0) { // must then be an end iterator dst_prev_sibling=target.parent_->last_child; assert(dst_prev_sibling); } else dst_prev_sibling=dst->prev_sibling; assert(src); if(dst==src) return source; if(dst_prev_sibling) if(dst_prev_sibling==src) // already in the right spot return source; // take src out of the tree if(src->prev_sibling!=0) src->prev_sibling->next_sibling=src->next_sibling; else src->parent->first_child=src->next_sibling; if(src->next_sibling!=0) src->next_sibling->prev_sibling=src->prev_sibling; else src->parent->last_child=src->prev_sibling; // connect it to the new point if(dst_prev_sibling!=0) dst_prev_sibling->next_sibling=src; else target.parent_->first_child=src; src->prev_sibling=dst_prev_sibling; if(dst) { dst->prev_sibling=src; src->parent=dst->parent; } src->next_sibling=dst; return src; } template template iter tree::move_ontop(iter target, iter source) { tree_node *dst=target.node; tree_node *src=source.node; assert(dst); assert(src); if(dst==src) return source; // remember connection points tree_node *b_prev_sibling=dst->prev_sibling; tree_node *b_next_sibling=dst->next_sibling; tree_node *b_parent=dst->parent; // remove target erase(target); // take src out of the tree if(src->prev_sibling!=0) src->prev_sibling->next_sibling=src->next_sibling; else src->parent->first_child=src->next_sibling; if(src->next_sibling!=0) src->next_sibling->prev_sibling=src->prev_sibling; else src->parent->last_child=src->prev_sibling; // connect it to the new point if(b_prev_sibling!=0) b_prev_sibling->next_sibling=src; else b_parent->first_child=src; if(b_next_sibling!=0) b_next_sibling->prev_sibling=src; else b_parent->last_child=src; src->prev_sibling=b_prev_sibling; src->next_sibling=b_next_sibling; src->parent=b_parent; return src; } template void tree::merge(sibling_iterator to1, sibling_iterator to2, sibling_iterator from1, sibling_iterator from2, bool duplicate_leaves) { sibling_iterator fnd; while(from1!=from2) { if((fnd=std::find(to1, to2, (*from1))) != to2) { // element found if(from1.begin()==from1.end()) { // full depth reached if(duplicate_leaves) append_child(parent(to1), (*from1)); } else { // descend further merge(fnd.begin(), fnd.end(), from1.begin(), from1.end(), duplicate_leaves); } } else { // element missing insert_subtree(to2, from1); } ++from1; } } template void tree::sort(sibling_iterator from, sibling_iterator to, bool deep) { std::less comp; sort(from, to, comp, deep); } template template void tree::sort(sibling_iterator from, sibling_iterator to, StrictWeakOrdering comp, bool deep) { if(from==to) return; // make list of sorted nodes // CHECK: if multiset stores equivalent nodes in the order in which they // are inserted, then this routine should be called 'stable_sort'. std::multiset > nodes(comp); sibling_iterator it=from, it2=to; while(it != to) { nodes.insert(it.node); ++it; } // reassemble --it2; // prev and next are the nodes before and after the sorted range tree_node *prev=from.node->prev_sibling; tree_node *next=it2.node->next_sibling; typename std::multiset >::iterator nit=nodes.begin(), eit=nodes.end(); if(prev==0) { if((*nit)->parent!=0) // to catch "sorting the head" situations, when there is no parent (*nit)->parent->first_child=(*nit); } else prev->next_sibling=(*nit); --eit; while(nit!=eit) { (*nit)->prev_sibling=prev; if(prev) prev->next_sibling=(*nit); prev=(*nit); ++nit; } // prev now points to the last-but-one node in the sorted range if(prev) prev->next_sibling=(*eit); // eit points to the last node in the sorted range. (*eit)->next_sibling=next; (*eit)->prev_sibling=prev; // missed in the loop above if(next==0) { if((*eit)->parent!=0) // to catch "sorting the head" situations, when there is no parent (*eit)->parent->last_child=(*eit); } else next->prev_sibling=(*eit); if(deep) { // sort the children of each node too sibling_iterator bcs(*nodes.begin()); sibling_iterator ecs(*eit); ++ecs; while(bcs!=ecs) { sort(begin(bcs), end(bcs), comp, deep); ++bcs; } } } template template bool tree::equal(const iter& one_, const iter& two, const iter& three_) const { std::equal_to comp; return equal(one_, two, three_, comp); } template template bool tree::equal_subtree(const iter& one_, const iter& two_) const { std::equal_to comp; return equal_subtree(one_, two_, comp); } template template bool tree::equal(const iter& one_, const iter& two, const iter& three_, BinaryPredicate fun) const { pre_order_iterator one(one_), three(three_); // if(one==two && is_valid(three) && three.number_of_children()!=0) // return false; while(one!=two && is_valid(three)) { if(!fun(*one,*three)) return false; if(one.number_of_children()!=three.number_of_children()) return false; ++one; ++three; } return true; } template template bool tree::equal_subtree(const iter& one_, const iter& two_, BinaryPredicate fun) const { pre_order_iterator one(one_), two(two_); if(!fun(*one,*two)) return false; if(number_of_children(one)!=number_of_children(two)) return false; return equal(begin(one),end(one),begin(two),fun); } template tree tree::subtree(sibling_iterator from, sibling_iterator to) const { tree tmp; tmp.set_head(value_type()); tmp.replace(tmp.begin(), tmp.end(), from, to); return tmp; } template void tree::subtree(tree& tmp, sibling_iterator from, sibling_iterator to) const { tmp.set_head(value_type()); tmp.replace(tmp.begin(), tmp.end(), from, to); } template size_t tree::size() const { size_t i=0; pre_order_iterator it=begin(), eit=end(); while(it!=eit) { ++i; ++it; } return i; } template size_t tree::size(const iterator_base& top) const { size_t i=0; pre_order_iterator it=top, eit=top; eit.skip_children(); ++eit; while(it!=eit) { ++i; ++it; } return i; } template bool tree::empty() const { pre_order_iterator it=begin(), eit=end(); return (it==eit); } template int tree::depth(const iterator_base& it) { tree_node* pos=it.node; assert(pos!=0); int ret=0; while(pos->parent!=0) { pos=pos->parent; ++ret; } return ret; } template int tree::depth(const iterator_base& it, const iterator_base& root) { tree_node* pos=it.node; assert(pos!=0); int ret=0; while(pos->parent!=0 && pos!=root.node) { pos=pos->parent; ++ret; } return ret; } template int tree::max_depth() const { int maxd=-1; for(tree_node *it = head->next_sibling; it!=feet; it=it->next_sibling) maxd=std::max(maxd, max_depth(it)); return maxd; } template int tree::max_depth(const iterator_base& pos) const { tree_node *tmp=pos.node; if(tmp==0 || tmp==head || tmp==feet) return -1; int curdepth=0, maxdepth=0; while(true) { // try to walk the bottom of the tree while(tmp->first_child==0) { if(tmp==pos.node) return maxdepth; if(tmp->next_sibling==0) { // try to walk up and then right again do { tmp=tmp->parent; if(tmp==0) return maxdepth; --curdepth; } while(tmp->next_sibling==0); } if(tmp==pos.node) return maxdepth; tmp=tmp->next_sibling; } tmp=tmp->first_child; ++curdepth; maxdepth=std::max(curdepth, maxdepth); } } template unsigned int tree::number_of_children(const iterator_base& it) { tree_node *pos=it.node->first_child; if(pos==0) return 0; unsigned int ret=1; // while(pos!=it.node->last_child) { // ++ret; // pos=pos->next_sibling; // } while((pos=pos->next_sibling)) ++ret; return ret; } template unsigned int tree::number_of_siblings(const iterator_base& it) const { tree_node *pos=it.node; unsigned int ret=0; // count forward while(pos->next_sibling && pos->next_sibling!=head && pos->next_sibling!=feet) { ++ret; pos=pos->next_sibling; } // count backward pos=it.node; while(pos->prev_sibling && pos->prev_sibling!=head && pos->prev_sibling!=feet) { ++ret; pos=pos->prev_sibling; } return ret; } template void tree::swap(sibling_iterator it) { tree_node *nxt=it.node->next_sibling; if(nxt) { if(it.node->prev_sibling) it.node->prev_sibling->next_sibling=nxt; else it.node->parent->first_child=nxt; nxt->prev_sibling=it.node->prev_sibling; tree_node *nxtnxt=nxt->next_sibling; if(nxtnxt) nxtnxt->prev_sibling=it.node; else it.node->parent->last_child=it.node; nxt->next_sibling=it.node; it.node->prev_sibling=nxt; it.node->next_sibling=nxtnxt; } } template void tree::swap(iterator one, iterator two) { // if one and two are adjacent siblings, use the sibling swap if(one.node->next_sibling==two.node) swap(one); else if(two.node->next_sibling==one.node) swap(two); else { tree_node *nxt1=one.node->next_sibling; tree_node *nxt2=two.node->next_sibling; tree_node *pre1=one.node->prev_sibling; tree_node *pre2=two.node->prev_sibling; tree_node *par1=one.node->parent; tree_node *par2=two.node->parent; // reconnect one.node->parent=par2; one.node->next_sibling=nxt2; if(nxt2) nxt2->prev_sibling=one.node; else par2->last_child=one.node; one.node->prev_sibling=pre2; if(pre2) pre2->next_sibling=one.node; else par2->first_child=one.node; two.node->parent=par1; two.node->next_sibling=nxt1; if(nxt1) nxt1->prev_sibling=two.node; else par1->last_child=two.node; two.node->prev_sibling=pre1; if(pre1) pre1->next_sibling=two.node; else par1->first_child=two.node; } } // template // tree::iterator tree::find_subtree( // sibling_iterator subfrom, sibling_iterator subto, iterator from, iterator to, // BinaryPredicate fun) const // { // assert(1==0); // this routine is not finished yet. // while(from!=to) { // if(fun(*subfrom, *from)) { // // } // } // return to; // } template bool tree::is_in_subtree(const iterator_base& it, const iterator_base& begin, const iterator_base& end) const { // FIXME: this should be optimised. pre_order_iterator tmp=begin; while(tmp!=end) { if(tmp==it) return true; ++tmp; } return false; } template bool tree::is_valid(const iterator_base& it) const { if(it.node==0 || it.node==feet || it.node==head) return false; else return true; } template unsigned int tree::index(sibling_iterator it) const { unsigned int ind=0; if(it.node->parent==0) { while(it.node->prev_sibling!=head) { it.node=it.node->prev_sibling; ++ind; } } else { while(it.node->prev_sibling!=0) { it.node=it.node->prev_sibling; ++ind; } } return ind; } template typename tree::sibling_iterator tree::sibling(const iterator_base& it, unsigned int num) { tree_node *tmp; if(it.node->parent==0) { tmp=head->next_sibling; while(num) { tmp = tmp->next_sibling; --num; } } else { tmp=it.node->parent->first_child; while(num) { assert(tmp!=0); tmp = tmp->next_sibling; --num; } } return tmp; } template typename tree::sibling_iterator tree::child(const iterator_base& it, unsigned int num) { tree_node *tmp=it.node->first_child; while(num--) { assert(tmp!=0); tmp=tmp->next_sibling; } return tmp; } // Iterator base template tree::iterator_base::iterator_base() : node(0), skip_current_children_(false) { } template tree::iterator_base::iterator_base(tree_node *tn) : node(tn), skip_current_children_(false) { } template T& tree::iterator_base::operator*() const { return node->data; } template T* tree::iterator_base::operator->() const { return &(node->data); } template bool tree::post_order_iterator::operator!=(const post_order_iterator& other) const { if(other.node!=this->node) return true; else return false; } template bool tree::post_order_iterator::operator==(const post_order_iterator& other) const { if(other.node==this->node) return true; else return false; } template bool tree::pre_order_iterator::operator!=(const pre_order_iterator& other) const { if(other.node!=this->node) return true; else return false; } template bool tree::pre_order_iterator::operator==(const pre_order_iterator& other) const { if(other.node==this->node) return true; else return false; } template bool tree::sibling_iterator::operator!=(const sibling_iterator& other) const { if(other.node!=this->node) return true; else return false; } template bool tree::sibling_iterator::operator==(const sibling_iterator& other) const { if(other.node==this->node) return true; else return false; } template bool tree::leaf_iterator::operator!=(const leaf_iterator& other) const { if(other.node!=this->node) return true; else return false; } template bool tree::leaf_iterator::operator==(const leaf_iterator& other) const { if(other.node==this->node && other.top_node==this->top_node) return true; else return false; } template typename tree::sibling_iterator tree::iterator_base::begin() const { if(node->first_child==0) return end(); sibling_iterator ret(node->first_child); ret.parent_=this->node; return ret; } template typename tree::sibling_iterator tree::iterator_base::end() const { sibling_iterator ret(0); ret.parent_=node; return ret; } template void tree::iterator_base::skip_children() { skip_current_children_=true; } template void tree::iterator_base::skip_children(bool skip) { skip_current_children_=skip; } template unsigned int tree::iterator_base::number_of_children() const { tree_node *pos=node->first_child; if(pos==0) return 0; unsigned int ret=1; while(pos!=node->last_child) { ++ret; pos=pos->next_sibling; } return ret; } // Pre-order iterator template tree::pre_order_iterator::pre_order_iterator() : iterator_base(0) { } template tree::pre_order_iterator::pre_order_iterator(tree_node *tn) : iterator_base(tn) { } template tree::pre_order_iterator::pre_order_iterator(const iterator_base &other) : iterator_base(other.node) { } template tree::pre_order_iterator::pre_order_iterator(const sibling_iterator& other) : iterator_base(other.node) { if(this->node==0) { if(other.range_last()!=0) this->node=other.range_last(); else this->node=other.parent_; this->skip_children(); ++(*this); } } template typename tree::pre_order_iterator& tree::pre_order_iterator::operator++() { assert(this->node!=0); if(!this->skip_current_children_ && this->node->first_child != 0) { this->node=this->node->first_child; } else { this->skip_current_children_=false; while(this->node->next_sibling==0) { this->node=this->node->parent; if(this->node==0) return *this; } this->node=this->node->next_sibling; } return *this; } template typename tree::pre_order_iterator& tree::pre_order_iterator::operator--() { assert(this->node!=0); if(this->node->prev_sibling) { this->node=this->node->prev_sibling; while(this->node->last_child) this->node=this->node->last_child; } else { this->node=this->node->parent; if(this->node==0) return *this; } return *this; } template typename tree::pre_order_iterator tree::pre_order_iterator::operator++(int) { pre_order_iterator copy = *this; ++(*this); return copy; } template typename tree::pre_order_iterator tree::pre_order_iterator::operator--(int) { pre_order_iterator copy = *this; --(*this); return copy; } template typename tree::pre_order_iterator& tree::pre_order_iterator::operator+=(unsigned int num) { while(num>0) { ++(*this); --num; } return (*this); } template typename tree::pre_order_iterator& tree::pre_order_iterator::operator-=(unsigned int num) { while(num>0) { --(*this); --num; } return (*this); } // Post-order iterator template tree::post_order_iterator::post_order_iterator() : iterator_base(0) { } template tree::post_order_iterator::post_order_iterator(tree_node *tn) : iterator_base(tn) { } template tree::post_order_iterator::post_order_iterator(const iterator_base &other) : iterator_base(other.node) { } template tree::post_order_iterator::post_order_iterator(const sibling_iterator& other) : iterator_base(other.node) { if(this->node==0) { if(other.range_last()!=0) this->node=other.range_last(); else this->node=other.parent_; this->skip_children(); ++(*this); } } template typename tree::post_order_iterator& tree::post_order_iterator::operator++() { assert(this->node!=0); if(this->node->next_sibling==0) { this->node=this->node->parent; this->skip_current_children_=false; } else { this->node=this->node->next_sibling; if(this->skip_current_children_) { this->skip_current_children_=false; } else { while(this->node->first_child) this->node=this->node->first_child; } } return *this; } template typename tree::post_order_iterator& tree::post_order_iterator::operator--() { assert(this->node!=0); if(this->skip_current_children_ || this->node->last_child==0) { this->skip_current_children_=false; while(this->node->prev_sibling==0) this->node=this->node->parent; this->node=this->node->prev_sibling; } else { this->node=this->node->last_child; } return *this; } template typename tree::post_order_iterator tree::post_order_iterator::operator++(int) { post_order_iterator copy = *this; ++(*this); return copy; } template typename tree::post_order_iterator tree::post_order_iterator::operator--(int) { post_order_iterator copy = *this; --(*this); return copy; } template typename tree::post_order_iterator& tree::post_order_iterator::operator+=(unsigned int num) { while(num>0) { ++(*this); --num; } return (*this); } template typename tree::post_order_iterator& tree::post_order_iterator::operator-=(unsigned int num) { while(num>0) { --(*this); --num; } return (*this); } template void tree::post_order_iterator::descend_all() { assert(this->node!=0); while(this->node->first_child) this->node=this->node->first_child; } // Breadth-first iterator template tree::breadth_first_queued_iterator::breadth_first_queued_iterator() : iterator_base() { } template tree::breadth_first_queued_iterator::breadth_first_queued_iterator(tree_node *tn) : iterator_base(tn) { traversal_queue.push(tn); } template tree::breadth_first_queued_iterator::breadth_first_queued_iterator(const iterator_base& other) : iterator_base(other.node) { traversal_queue.push(other.node); } template bool tree::breadth_first_queued_iterator::operator!=(const breadth_first_queued_iterator& other) const { if(other.node!=this->node) return true; else return false; } template bool tree::breadth_first_queued_iterator::operator==(const breadth_first_queued_iterator& other) const { if(other.node==this->node) return true; else return false; } template typename tree::breadth_first_queued_iterator& tree::breadth_first_queued_iterator::operator++() { assert(this->node!=0); // Add child nodes and pop current node sibling_iterator sib=this->begin(); while(sib!=this->end()) { traversal_queue.push(sib.node); ++sib; } traversal_queue.pop(); if(!traversal_queue.empty()) this->node=traversal_queue.front(); else this->node=0; return (*this); } template typename tree::breadth_first_queued_iterator tree::breadth_first_queued_iterator::operator++(int) { breadth_first_queued_iterator copy = *this; ++(*this); return copy; } template typename tree::breadth_first_queued_iterator& tree::breadth_first_queued_iterator::operator+=(unsigned int num) { while(num>0) { ++(*this); --num; } return (*this); } // Fixed depth iterator template tree::fixed_depth_iterator::fixed_depth_iterator() : iterator_base() { } template tree::fixed_depth_iterator::fixed_depth_iterator(tree_node *tn) : iterator_base(tn), top_node(0) { } template tree::fixed_depth_iterator::fixed_depth_iterator(const iterator_base& other) : iterator_base(other.node), top_node(0) { } template tree::fixed_depth_iterator::fixed_depth_iterator(const sibling_iterator& other) : iterator_base(other.node), top_node(0) { } template tree::fixed_depth_iterator::fixed_depth_iterator(const fixed_depth_iterator& other) : iterator_base(other.node), top_node(other.top_node) { } template bool tree::fixed_depth_iterator::operator==(const fixed_depth_iterator& other) const { if(other.node==this->node && other.top_node==top_node) return true; else return false; } template bool tree::fixed_depth_iterator::operator!=(const fixed_depth_iterator& other) const { if(other.node!=this->node || other.top_node!=top_node) return true; else return false; } template typename tree::fixed_depth_iterator& tree::fixed_depth_iterator::operator++() { assert(this->node!=0); if(this->node->next_sibling) { this->node=this->node->next_sibling; } else { int relative_depth=0; upper: do { if(this->node==this->top_node) { this->node=0; // FIXME: return a proper fixed_depth end iterator once implemented return *this; } this->node=this->node->parent; if(this->node==0) return *this; --relative_depth; } while(this->node->next_sibling==0); lower: this->node=this->node->next_sibling; while(this->node->first_child==0) { if(this->node->next_sibling==0) goto upper; this->node=this->node->next_sibling; if(this->node==0) return *this; } while(relative_depth<0 && this->node->first_child!=0) { this->node=this->node->first_child; ++relative_depth; } if(relative_depth<0) { if(this->node->next_sibling==0) goto upper; else goto lower; } } return *this; } template typename tree::fixed_depth_iterator& tree::fixed_depth_iterator::operator--() { assert(this->node!=0); if(this->node->prev_sibling) { this->node=this->node->prev_sibling; } else { int relative_depth=0; upper: do { if(this->node==this->top_node) { this->node=0; return *this; } this->node=this->node->parent; if(this->node==0) return *this; --relative_depth; } while(this->node->prev_sibling==0); lower: this->node=this->node->prev_sibling; while(this->node->last_child==0) { if(this->node->prev_sibling==0) goto upper; this->node=this->node->prev_sibling; if(this->node==0) return *this; } while(relative_depth<0 && this->node->last_child!=0) { this->node=this->node->last_child; ++relative_depth; } if(relative_depth<0) { if(this->node->prev_sibling==0) goto upper; else goto lower; } } return *this; // // // assert(this->node!=0); // if(this->node->prev_sibling!=0) { // this->node=this->node->prev_sibling; // assert(this->node!=0); // if(this->node->parent==0 && this->node->prev_sibling==0) // head element // this->node=0; // } // else { // tree_node *par=this->node->parent; // do { // par=par->prev_sibling; // if(par==0) { // FIXME: need to keep track of this! // this->node=0; // return *this; // } // } while(par->last_child==0); // this->node=par->last_child; // } // return *this; } template typename tree::fixed_depth_iterator tree::fixed_depth_iterator::operator++(int) { fixed_depth_iterator copy = *this; ++(*this); return copy; } template typename tree::fixed_depth_iterator tree::fixed_depth_iterator::operator--(int) { fixed_depth_iterator copy = *this; --(*this); return copy; } template typename tree::fixed_depth_iterator& tree::fixed_depth_iterator::operator-=(unsigned int num) { while(num>0) { --(*this); --(num); } return (*this); } template typename tree::fixed_depth_iterator& tree::fixed_depth_iterator::operator+=(unsigned int num) { while(num>0) { ++(*this); --(num); } return *this; } // Sibling iterator template tree::sibling_iterator::sibling_iterator() : iterator_base() { set_parent_(); } template tree::sibling_iterator::sibling_iterator(tree_node *tn) : iterator_base(tn) { set_parent_(); } template tree::sibling_iterator::sibling_iterator(const iterator_base& other) : iterator_base(other.node) { set_parent_(); } template tree::sibling_iterator::sibling_iterator(const sibling_iterator& other) : iterator_base(other), parent_(other.parent_) { } template void tree::sibling_iterator::set_parent_() { parent_=0; if(this->node==0) return; if(this->node->parent!=0) parent_=this->node->parent; } template typename tree::sibling_iterator& tree::sibling_iterator::operator++() { if(this->node) this->node=this->node->next_sibling; return *this; } template typename tree::sibling_iterator& tree::sibling_iterator::operator--() { if(this->node) this->node=this->node->prev_sibling; else { assert(parent_); this->node=parent_->last_child; } return *this; } template typename tree::sibling_iterator tree::sibling_iterator::operator++(int) { sibling_iterator copy = *this; ++(*this); return copy; } template typename tree::sibling_iterator tree::sibling_iterator::operator--(int) { sibling_iterator copy = *this; --(*this); return copy; } template typename tree::sibling_iterator& tree::sibling_iterator::operator+=(unsigned int num) { while(num>0) { ++(*this); --num; } return (*this); } template typename tree::sibling_iterator& tree::sibling_iterator::operator-=(unsigned int num) { while(num>0) { --(*this); --num; } return (*this); } template typename tree::tree_node *tree::sibling_iterator::range_first() const { tree_node *tmp=parent_->first_child; return tmp; } template typename tree::tree_node *tree::sibling_iterator::range_last() const { return parent_->last_child; } // Leaf iterator template tree::leaf_iterator::leaf_iterator() : iterator_base(0), top_node(0) { } template tree::leaf_iterator::leaf_iterator(tree_node *tn, tree_node *top) : iterator_base(tn), top_node(top) { } template tree::leaf_iterator::leaf_iterator(const iterator_base &other) : iterator_base(other.node), top_node(0) { } template tree::leaf_iterator::leaf_iterator(const sibling_iterator& other) : iterator_base(other.node), top_node(0) { if(this->node==0) { if(other.range_last()!=0) this->node=other.range_last(); else this->node=other.parent_; ++(*this); } } template typename tree::leaf_iterator& tree::leaf_iterator::operator++() { assert(this->node!=0); if(this->node->first_child!=0) { // current node is no longer leaf (children got added) while(this->node->first_child) this->node=this->node->first_child; } else { while(this->node->next_sibling==0) { if (this->node->parent==0) return *this; this->node=this->node->parent; if (top_node != 0 && this->node==top_node) return *this; } this->node=this->node->next_sibling; while(this->node->first_child) this->node=this->node->first_child; } return *this; } template typename tree::leaf_iterator& tree::leaf_iterator::operator--() { assert(this->node!=0); while (this->node->prev_sibling==0) { if (this->node->parent==0) return *this; this->node=this->node->parent; if (top_node !=0 && this->node==top_node) return *this; } this->node=this->node->prev_sibling; while(this->node->last_child) this->node=this->node->last_child; return *this; } template typename tree::leaf_iterator tree::leaf_iterator::operator++(int) { leaf_iterator copy = *this; ++(*this); return copy; } template typename tree::leaf_iterator tree::leaf_iterator::operator--(int) { leaf_iterator copy = *this; --(*this); return copy; } template typename tree::leaf_iterator& tree::leaf_iterator::operator+=(unsigned int num) { while(num>0) { ++(*this); --num; } return (*this); } template typename tree::leaf_iterator& tree::leaf_iterator::operator-=(unsigned int num) { while(num>0) { --(*this); --num; } return (*this); } #endif // Local variables: // default-tab-width: 3 // End: 3Depict-0.0.19/src/backend/plot.cpp0000644000175000017500000013122412640746376016342 0ustar pcuserpcuser/* * plot.cpp - mathgl plot wrapper class * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "plot.h" #include "common/stringFuncs.h" #include "common/translation.h" #include //!Plot error bar estimation strings const char *errModeStrings[] = { NTRANS("None"), NTRANS("Moving avg.") }; const char *plotTypeStrings[]= { NTRANS("Lines"), NTRANS("Bars"), NTRANS("Steps"), NTRANS("Stem"), NTRANS("Points"), (""), NTRANS("Density"), NTRANS("Scatter"), }; using std::string; using std::pair; using std::make_pair; using std::vector; //Axis min/max bounding box is disallowed to be exactly zero on any given axis // perform a little "push off" by this fudge factor const float AXIS_MIN_TOLERANCE=10*sqrtf(std::numeric_limits::epsilon()); //Mathgl uses some internal for(float=...) constructions, // which are just generally a bad idea, as they often won't terminate // as the precision is not guaranteed. Try to catch these by detecting this bool mglFloatTooClose(float a, float b) { //For small numbers an absolute delta can catch // too close values if(fabs(a-b) < sqrtf(std::numeric_limits::epsilon())) return true; const int FLOAT_ACC_MASK=0xffff0000; union FLT_INT { float f; int i; }; FLT_INT u; u.f=a; //For big numbers, we have to either bit-bash, or something u.i&=FLOAT_ACC_MASK; a=u.f; u.f=b; u.i&=FLOAT_ACC_MASK; b=u.f; if(fabs(a-b) < sqrtf(std::numeric_limits::epsilon())) return true; return false; } //Nasty string conversion functions. std::wstring strToWStr(const std::string& s) { std::wstring temp(s.length(),L' '); std::copy(s.begin(), s.end(), temp.begin()); return temp; } std::string wstrToStr(const std::wstring& s) { std::string temp(s.length(), ' '); std::copy(s.begin(), s.end(), temp.begin()); return temp; } std::string mglColourCode(float r, float g, float b) { ASSERT(r >=0.0f && g >=0.0f && b >=0.0f) ASSERT(r <=255.0f && g <=255.0f && b <=255.0f) ColourRGBA rgba(r*255.0,g*255.0,b*255.0); std::string s; //Make a #rrggbb hex string s=rgba.rgbString(); s=s.substr(1); return string("{x") + uppercase(s) + string("}"); } //TODO: Refactor these functions to use a common string map //----------- string plotString(unsigned int plotMode) { ASSERT(plotMode< PLOT_TYPE_ENUM_END); return TRANS(plotTypeStrings[plotMode]); } unsigned int plotID(const std::string &plotString) { COMPILE_ASSERT(THREEDEP_ARRAYSIZE(plotTypeStrings) == PLOT_TYPE_ENUM_END); for(unsigned int ui=0;ui &newPositions, bool updateSelf) { ASSERT(newPositions.size() >= bounds.size()); ASSERT(parentObject); //Update the parent object, using the requested access mode for the parent switch(accessMode) { case ACCESS_MODE_FILTER: { Filter *f; f = (Filter*)parentObject; f->setPropFromRegion(regionChangeType,id,newPositions[0]); break; } case ACCESS_MODE_RANGEFILE: { RangeFile *rng= (RangeFile *) parentObject; switch(regionChangeType) { case REGION_MOVE_EXTEND_XMINUS: { //Disallow zero sided region if(rng->getRangeByRef(id).second ==newPositions[0]) break; rng->getRangeByRef(id).first=newPositions[0]; break; } case REGION_MOVE_EXTEND_XPLUS: { //Disallow zero sided region if(rng->getRangeByRef(id).first==newPositions[0]) break; rng->getRangeByRef(id).second=newPositions[0]; break; } //move the centroid to the new absolute position case REGION_MOVE_TRANSLATE_X: { float delta; pair &bound=rng->getRangeByRef(id); delta = (bound.second-bound.first)/2; bound.first=newPositions[0]-delta; bound.second=newPositions[0]+delta; break; } default: ASSERT(false); } //Check for inversion if(rng->getRangeByRef(id).first > rng->getRangeByRef(id).second) { std::swap(rng->getRangeByRef(id).first, rng->getRangeByRef(id).second); } break; } default: ASSERT(false); } //Update own region data if(updateSelf) { switch(regionChangeType) { case REGION_MOVE_EXTEND_XMINUS: { bounds[0].first = newPositions[0]; break; } case REGION_MOVE_EXTEND_XPLUS: { bounds[0].second= newPositions[0]; break; } //move the centroid to the new absolute position case REGION_MOVE_TRANSLATE_X: { float delta; delta = (bounds[0].second-bounds[0].first)/2; bounds[0].first=newPositions[0]-delta; bounds[0].second=newPositions[0]+delta; break; } default: ASSERT(false); } //Check for inversion if(bounds[0].first > bounds[0].second) { std::swap(bounds[0].first, bounds[0].second); } } } std::string PlotRegion::getName() const { return label; } PlotWrapper::PlotWrapper() { //COMPILE_ASSERT(THREEDEP_ARRAYSIZE(plotTypeStrings) == PLOT_TYPE_ENUM_END); applyUserBounds=false; plotChanged=true; drawLegend=true; interactionLocked=false; highlightRegionOverlaps=false; } PlotWrapper::~PlotWrapper() { for(size_t ui=0;uiclone()); plottingData[ui] =pb; } plotChanged=p.plotChanged; lastVisiblePlots=p.lastVisiblePlots; plotIDHandler=p.plotIDHandler; applyUserBounds=p.applyUserBounds; xUserMin=p.xUserMin; yUserMin=p.yUserMin; xUserMax=p.xUserMax; yUserMax=p.yUserMax; highlightRegionOverlaps=p.highlightRegionOverlaps; drawLegend=p.drawLegend; interactionLocked=p.interactionLocked; return *this; } std::string PlotWrapper::getTitle(size_t plotId) const { unsigned int plotPos=plotIDHandler.getPos(plotId); return plottingData[plotPos]->getTitle(); } void PlotWrapper::getPlotIDs(vector &ids) const { plotIDHandler.getIds(ids); } //TODO: Refactor. Should not make the assumption that parentObject is a filter, // in here. Could be anything. size_t PlotWrapper::getParentType(size_t plotId) const { unsigned int plotPos=plotIDHandler.getPos(plotId); return ((const Filter*)plottingData[plotPos]->parentObject)->getType(); } unsigned int PlotWrapper::addPlot(PlotBase *p) { #ifdef DEBUG p->checkConsistent(); #endif plottingData.push_back(p); //assign a unique identifier to this plot, by which it can be referenced unsigned int uniqueID = plotIDHandler.genId(plottingData.size()-1); plotChanged=true; return uniqueID; } void PlotWrapper::clear(bool preserveVisiblity) { //Do our best to preserve visibility of //plots. lastVisiblePlots.clear(); if(preserveVisiblity) { //Remember which plots were visible, who owned them, and their index for(unsigned int ui=0;uivisible && plottingData[ui]->parentObject) { lastVisiblePlots.push_back(std::make_pair(plottingData[ui]->parentObject, plottingData[ui]->parentPlotIndex)); } } } else applyUserBounds=false; //Free the plotting data pointers for(size_t ui=0;uisetStrings(x,y,t); plotChanged=true; } void PlotWrapper::setTraceStyle(unsigned int plotUniqueID,unsigned int mode) { ASSERT(modesetPlotMode(mode); plotChanged=true; } void PlotWrapper::setColours(unsigned int plotUniqueID, float r,float g,float b) { unsigned int plotPos=plotIDHandler.getPos(plotUniqueID); plottingData[plotPos]->setColour(r,g,b); plotChanged=true; } void PlotWrapper::setBounds(float xMin, float xMax, float yMin,float yMax) { ASSERT(!interactionLocked); ASSERT(xMin::epsilon() && fabs(yUserMin -yMin)<=std::numeric_limits::epsilon()) { applyUserBounds=false; } plotChanged=true; } void PlotWrapper::getBounds(float &xMin, float &xMax, float &yMin,float &yMax) const { if(applyUserBounds) { xMin=xUserMin; yMin=yUserMin; xMax=xUserMax; yMax=yUserMax; } else scanBounds(xMin,xMax,yMin,yMax); ASSERT(xMin ::max(); xMax=-std::numeric_limits::max(); yMin=std::numeric_limits::max(); yMax=-std::numeric_limits::max(); for(unsigned int uj=0;ujvisible) continue; //Expand our bounding box to encompass that of this visible plot float tmpXMin,tmpXMax,tmpYMin,tmpYMax; plottingData[uj]->getBounds(tmpXMin,tmpXMax,tmpYMin,tmpYMax); xMin=std::min(xMin,tmpXMin); xMax=std::max(xMax,tmpXMax); yMin=std::min(yMin,tmpYMin); yMax=std::max(yMax,tmpYMax); } ASSERT(xMin < xMax && yMin <=yMax); } void PlotWrapper::bestEffortRestoreVisibility() { //Try to match up the last visible plots to the //new plots. Use index and owner as guiding data for(unsigned int uj=0;ujvisible=false; for(unsigned int ui=0; uiparentObject == lastVisiblePlots[ui].first && plottingData[uj]->parentPlotIndex == lastVisiblePlots[ui].second) { plottingData[uj]->visible=true; break; } } } lastVisiblePlots.clear(); plotChanged=true; } void PlotWrapper::getAppliedBounds(mglPoint &min, mglPoint &max) const { if(applyUserBounds) { ASSERT(yUserMax >=yUserMin); ASSERT(xUserMax >=xUserMin); max.x =xUserMax; max.y=yUserMax; min.x =xUserMin; min.y =yUserMin; } else { //Retrieve the bounds of the data that is in the plot float minX,maxX,minY,maxY; minX=std::numeric_limits::max(); maxX=-std::numeric_limits::max(); minY=std::numeric_limits::max(); maxY=-std::numeric_limits::max(); for(unsigned int ui=0;uivisible) { float tmpMinX,tmpMinY,tmpMaxX,tmpMaxY; plottingData[ui]->getBounds( tmpMinX,tmpMaxX,tmpMinY,tmpMaxY); minX=std::min(minX,tmpMinX); maxX=std::max(maxX,tmpMaxX); minY=std::min(minY,tmpMinY); maxY=std::max(maxY,tmpMaxY); } } min.x=minX; min.y=minY; max.x=maxX; max.y=maxY; } //"Push" bounds around to prevent min == max // This is a hack to prevent mathgl from inf. looping //--- if(mglFloatTooClose(min.x , max.x)) { min.x-=0.05; max.x+=0.05; } if(mglFloatTooClose(min.y , max.y)) max.y+=0.01; //------ } void PlotWrapper::getRawData(vector > > &data, std::vector > &labels) const { if(plottingData.empty()) return; //Determine if we have multiple types of plot. //if so, we cannot really return the raw data for this //in a meaningful fashion switch(getVisibleMode()) { case PLOT_MODE_1D: case PLOT_MODE_2D: { //Try to retrieve the raw data from the visible plots for(unsigned int ui=0;uivisible) { vector > thisDat,dummy; vector thisLabel; plottingData[ui]->getRawData(thisDat,thisLabel); //Data title size should hopefully be the same //as the label size ASSERT(thisLabel.size() == thisDat.size()); if(thisDat.size()) { data.push_back(dummy); data.back().swap(thisDat); labels.push_back(thisLabel); } } } break; } case PLOT_MODE_ENUM_END: case PLOT_MODE_MIXED: return; default: ASSERT(false); } } unsigned int PlotWrapper::getVisibleMode() const { unsigned int visibleMode=PLOT_MODE_ENUM_END; for(unsigned int ui=0;uivisible && plottingData[ui]->getPlotMode()!= visibleMode) { if(visibleMode == PLOT_MODE_ENUM_END) { visibleMode=plottingData[ui]->getMode(); continue; } else { visibleMode=PLOT_MODE_MIXED; break; } } } return visibleMode; } void PlotWrapper::getVisibleIDs(vector &visiblePlotIDs ) const { for(size_t ui=0;uiregionGroup.findRegionLimit(regionId,movementType,maxX,maxY); } void PlotWrapper::drawPlot(mglGraph *gr, bool &haveUsedLog) const { unsigned int visMode = getVisibleMode(); if(visMode == PLOT_MODE_ENUM_END || visMode == PLOT_MODE_MIXED) { //We don't handle the drawing case well here, so assert this. // calling code should check this case and ensure that it draws something // meaningful WARN(false,"Mixed calling code"); return; } //Un-fudger for mathgl plots bool haveMultiTitles=false; //Compute the bounding box in data coordinates std::string xLabel,yLabel,plotTitle; for(unsigned int ui=0;uivisible) { if(!xLabel.size()) xLabel=plottingData[ui]->getXLabel(); else { if(xLabel!=plottingData[ui]->getXLabel()) xLabel=string(TRANS("Multiple data types")); } if(!yLabel.size()) yLabel=plottingData[ui]->getYLabel(); else { if(yLabel!=plottingData[ui]->getYLabel()) yLabel=string(TRANS("Multiple data types")); } if(!haveMultiTitles && !plotTitle.size()) plotTitle=plottingData[ui]->getTitle(); else { if(plotTitle!=plottingData[ui]->getTitle()) { plotTitle=""; haveMultiTitles=true; } } } } string sX,sY; sX.assign(xLabel.begin(),xLabel.end()); //unicode conversion sY.assign(yLabel.begin(),yLabel.end()); //unicode conversion string sT; sT.assign(plotTitle.begin(), plotTitle.end()); //unicode conversion gr->Title(sT.c_str()); haveUsedLog=false; mglPoint min,max; //work out the bounding box for the plot, //and where the axis should cross getAppliedBounds(min,max); //set up the graph axes as needed switch(visMode) { case PLOT_MODE_1D: { //OneD connected value line plot f(x) bool useLogPlot=false; for(unsigned int ui=0;uivisible) continue; if(plottingData[ui]->getType()!= PLOT_MODE_1D) continue; if(((Plot1D*)plottingData[ui])->wantLogPlot()) useLogPlot=true; } haveUsedLog|=useLogPlot; //Allow for logarithmic mode, as needed. // mathgl does not like a zero coordinate for plotting if(min.y == 0 && useLogPlot) { float minYVal=0.1; for(size_t ui=0;uivisible || plottingData[ui]->getType() !=PLOT_MODE_1D) continue; float tmp ; tmp=((Plot1D*)plottingData[ui])->getSmallestNonzero(); if(tmp >0) minYVal=std::min(tmp,minYVal); } ASSERT(minYVal > 0); min.y=minYVal; } //tell mathgl about the bounding box gr->SetRanges(min,max); gr->SetOrigin(min); WARN((fabs(min.x-max.x) > sqrtf(std::numeric_limits::epsilon())), "WARNING: Mgl limits (X) too Close! Due to limitiations in MGL, This may inf. loop!"); WARN((fabs(min.y-max.y) > sqrtf(std::numeric_limits::epsilon())), "WARNING: Mgl limits (Y) too Close! Due to limitiations in MGL, This may inf. loop!"); if(useLogPlot) gr->SetFunc("","lg(y)"); else gr->SetFunc("",""); mglCanvas *canvas = dynamic_cast(gr->Self()); canvas->AdjustTicks("x"); canvas->SetTickTempl('x',"%g"); //Set the tick type canvas->Axis("xy"); //Build an X-Y crossing axis //--- //Loop through the plots, drawing them as needed for(unsigned int ui=0;uigetPlotMode() != PLOT_MODE_1D) continue; Plot1D *curPlot; curPlot=(Plot1D*)plottingData[ui]; //If a plot is not visible, it cannot own a region //nor have a legend in this run. if(!curPlot->visible) continue; curPlot->drawRegions(gr,min,max); curPlot->drawPlot(gr); if(drawLegend) { float r,g,b; curPlot->getColour(r,g,b); std::string mglColStr= mglColourCode(r,g,b); gr->AddLegend(curPlot->getTitle().c_str(),mglColStr.c_str()); } } //Prevent mathgl from dropping lines that straddle the plot bound. gr->SetCut(false); //if we have to draw overlapping regions, do so if(highlightRegionOverlaps) { vector > overlapId; vector > overlapXCoords; string colourCode=mglColourCode(1.0f,0.0f,0.0f); getRegionOverlaps(overlapId,overlapXCoords); float rMinY,rMaxY; const float ABOVE_AXIS_CONST = 0.1; rMinY = max.y + (max.y-min.y)*(ABOVE_AXIS_CONST-0.025); rMaxY = max.y + (max.y-min.y)*(ABOVE_AXIS_CONST+0.025); for(size_t ui=0; ui::epsilon())) continue; gr->FaceZ(mglPoint(rMinX,rMinY,-1),rMaxX-rMinX,rMaxY-rMinY, colourCode.c_str()); } } break; } case PLOT_MODE_2D: { gr->SetFunc("",""); gr->SetRanges(min,max); gr->SetOrigin(min); gr->Axis(); bool wantColourbar=false; for(unsigned int ui=0;uivisible) continue; Plot2DFunc *curPlot; curPlot=(Plot2DFunc*)plottingData[ui]; if(curPlot->getType() == PLOT_2D_DENS) { wantColourbar=true; } //If a plot is not visible, it cannot own a region //nor have a legend in this run. if(!curPlot->visible) continue; curPlot->drawPlot(gr); } if(wantColourbar) gr->Colorbar(); break; } default: ASSERT(false); } gr->Label('x',sX.c_str()); gr->Label('y',sY.c_str(),0); if(haveMultiTitles && drawLegend) gr->Legend(); overlays.draw(gr,min,max,haveUsedLog); } void PlotWrapper::hideAll() { for(unsigned int ui=0;uivisible=false; plotChanged=true; } void PlotWrapper::setVisible(unsigned int uniqueID, bool setVis) { unsigned int plotPos = plotIDHandler.getPos(uniqueID); plottingData[plotPos]->visible=setVis; plotChanged=true; } void PlotWrapper::getRegions(vector > > ®ions, bool visibleOnly) const { vector ids; getPlotIDs(ids); regions.resize(ids.size()); for(size_t ui=0;uivisible || !visibleOnly) regions[ui] = make_pair(ids[ui],b->regionGroup.regions); } } bool PlotWrapper::getRegionIdAtPosition(float x, float y, unsigned int &pId, unsigned int &rId) const { for(size_t ui=0;uivisible) continue; if(plottingData[ui]->regionGroup.getRegionIdAtPosition(x,y,rId)) { pId=ui; return true; } } return false; } void PlotWrapper::getRegionOverlaps(vector > &ids, vector< pair > &coords) const { ids.clear(); coords.clear(); for(size_t uk=0;ukregionGroup); r->getOverlaps(ids,coords); } } unsigned int PlotWrapper::getNumVisible() const { unsigned int num=0; for(unsigned int ui=0;uivisible) num++; } return num; } bool PlotWrapper::isPlotVisible(unsigned int plotID) const { return plottingData[plotIDHandler.getPos(plotID)]->visible; } void PlotWrapper::getRegion(unsigned int plotId, unsigned int regionId, PlotRegion ®ion) const { plottingData[plotIDHandler.getPos(plotId)]->regionGroup.getRegion(regionId,region); } unsigned int PlotWrapper::plotType(unsigned int plotId) const { return plottingData[plotIDHandler.getPos(plotId)]->getPlotMode(); } void PlotWrapper::moveRegion(unsigned int plotID, unsigned int regionId, bool regionSelfUpdate, unsigned int movementType, float newX, float newY) const { plottingData[plotIDHandler.getPos(plotID)]->regionGroup.moveRegion(regionId, movementType,regionSelfUpdate,newX,newY); } void PlotWrapper::switchOutRegionParent(std::map &switchMap) { for(size_t ui=0;uiregionGroup); for(size_t uj=0; ujregions.size();uj++) { //Obtain the parent filter f rthis region, then re-map it // to the rangefile Filter *parentFilt = rg->regions[uj].getParentAsFilter(); if(parentFilt->getType() != FILTER_TYPE_RANGEFILE) continue; RangeFileFilter *rngFilt = (RangeFileFilter *)parentFilt; ASSERT(switchMap.find(rngFilt) != switchMap.end()); //Set the update method to use the new rangefile rg->regions[uj].setUpdateMethod(PlotRegion::ACCESS_MODE_RANGEFILE, &(switchMap[rngFilt])); } } } void PlotWrapper::overrideLastVisible(vector< pair > &overridden) { lastVisiblePlots=overridden; } //----------- PlotBase::PlotBase() { parentObject=0; parentPlotIndex=(unsigned int)-1; visible=true; } void PlotBase::getColour(float &rN, float &gN, float &bN) const { rN=r; gN=g; bN=b; } void PlotBase::getBounds(float &xMin,float &xMax,float &yMin,float &yMax) const { xMin=minX; xMax=maxX; yMin=minY; yMax=maxY; ASSERT(yMin <=yMax); } void PlotBase::setStrings(const std::string &x, const std::string &y, const std::string &t) { xLabel = x; yLabel = y; title = t; } void PlotBase::copyBase(PlotBase *target) const { target->plotType=plotType; target->minX=minX; target->maxX=maxX; target->minY=minY; target->maxY=maxY; target->r=r; target->g=g; target->b=b; target->visible=visible; target->plotMode=plotMode; target->xLabel=xLabel; target->yLabel=yLabel; target->title=title; target->titleAsRawDataLabel=titleAsRawDataLabel; target->parentObject=parentObject; target->regionGroup=regionGroup; target->parentPlotIndex=parentPlotIndex; } unsigned int PlotBase::getType() const { return plotType; } unsigned int PlotBase::getMode() const { switch(plotType) { case PLOT_LINE_LINES: case PLOT_LINE_BARS: case PLOT_LINE_STEPS: case PLOT_LINE_STEM: case PLOT_LINE_POINTS: return PLOT_MODE_1D; case PLOT_2D_DENS: case PLOT_2D_SCATTER: return PLOT_MODE_2D; } ASSERT(false); } Plot1D::Plot1D() { //Set the default plot properties plotType=PLOT_LINE_LINES; plotMode=PLOT_MODE_1D; xLabel=""; yLabel=""; title=""; r=(0);g=(0);b=(1); } PlotBase *Plot1D::clone() const { Plot1D *p = new Plot1D; p->logarithmic=logarithmic; p->xValues=xValues; p->yValues=yValues; p->errBars=errBars; copyBase(p); return p; } void Plot1D::setErrMode(PLOT_ERROR mode) { errMode=mode; genErrBars(); } void Plot1D::genErrBars() { switch(errMode.mode) { case PLOT_ERROR_NONE: return; case PLOT_ERROR_MOVING_AVERAGE: { //FIXME: Has contiguous assumption implicit ASSERT(errMode.movingAverageNum); errBars.resize(yValues.size()); for(int ui=0;ui<(int)yValues.size();ui++) { float mean; mean=0.0f; //Compute the local mean for(int uj=0;uj<(int)errMode.movingAverageNum;uj++) { //TODO: Why are we using (int) here? int idx; idx= std::max(ui+uj-(int)errMode.movingAverageNum/2,0); idx=std::min(idx,(int)(yValues.size()-1)); ASSERT(idx<(int)yValues.size()); mean+=yValues[idx]; } mean/=(float)errMode.movingAverageNum; //Compute the local stddev float stddev; stddev=0; for(int uj=0;uj<(int)errMode.movingAverageNum;uj++) { int idx; idx= std::max(ui+uj-(int)errMode.movingAverageNum/2,0); idx=std::min(idx,(int)(yValues.size()-1)); stddev+=(yValues[idx]-mean)*(yValues[idx]-mean); } stddev=sqrtf(stddev/(float)errMode.movingAverageNum); errBars[ui]=stddev; } break; } } } void Plot1D::setData(const vector &vX, const vector &vY, const vector &vErr) { ASSERT(vX.size() == vY.size()); ASSERT(vErr.size() == vY.size() || !vErr.size()); //Fill up vectors with data xValues.resize(vX.size()); std::copy(vX.begin(),vX.end(),xValues.begin()); yValues.resize(vY.size()); std::copy(vY.begin(),vY.end(),yValues.begin()); errBars.resize(vErr.size()); std::copy(vErr.begin(),vErr.end(),errBars.begin()); //Compute minima and maxima of plot data, and keep a copy of it float maxThis=-std::numeric_limits::max(); float minThis=std::numeric_limits::max(); for(unsigned int ui=0;ui::max(); minThis=std::numeric_limits::max(); for(unsigned int ui=0;ui > &v) { vector dummyVar; setData(v,dummyVar); } void Plot1D::setData(const vector > &v,const vector &vErr) { //Fill up vectors with data xValues.resize(v.size()); yValues.resize(v.size()); for(unsigned int ui=0;ui &d, const vector &vErr, float &minV,float &maxV) { //Compute minima and maxima of plot data, and keep a copy of it float maxThis=-std::numeric_limits::max(); float minThis=std::numeric_limits::max(); for(unsigned int ui=0;ui &d, float &minV,float &maxV) { //Compute minima and maxima of plot data, and keep a copy of it float maxThis=-std::numeric_limits::max(); float minThis=std::numeric_limits::max(); // --------- Values --- for(unsigned int ui=0;ui > &d, float &minX,float &maxX, float &minY, float &maxY) { //Compute minima and maxima of plot data, and keep a copy of it float maxThisX=-std::numeric_limits::max(); float minThisX=std::numeric_limits::max(); // --------- Values --- for(unsigned int ui=0;ui::max(); float minThisY=std::numeric_limits::max(); // --------- Values --- for(unsigned int ui=0;ui=0.0f); ASSERT( gN <=1.0f&& gN >=0.0f); ASSERT( bN <=1.0f&& bN >=0.0f); r=rN; g=gN; b=bN; } bool Plot1D::isEmpty() const { ASSERT(xValues.size() == yValues.size()); return xValues.empty(); } void Plot1D::drawPlot(mglGraph *gr) const { #ifdef DEBUG checkConsistent(); #endif bool showErrs; mglData xDat,yDat,eDat; ASSERT(visible); //Make a copy of the data we need to use float *bufferX,*bufferY,*bufferErr; bufferX = new float[xValues.size()]; bufferY = new float[yValues.size()]; showErrs=errBars.size(); if(showErrs) bufferErr = new float[errBars.size()]; //Pre-process the data, before handing to mathgl //-- for(unsigned int uj=0;ujSetCut(true); gr->Plot(xDat,yDat,colourCode.c_str()); if(showErrs) gr->Error(xDat,yDat,eDat,colourCode.c_str()); gr->SetCut(false); break; case PLOT_LINE_BARS: gr->Bars(xDat,yDat,colourCode.c_str()); break; case PLOT_LINE_STEPS: //Same problem as for line plot. gr->SetCut(true); gr->Step(xDat,yDat,colourCode.c_str()); gr->SetCut(false); break; case PLOT_LINE_STEM: gr->SetCut(true); gr->Stem(xDat,yDat,colourCode.c_str()); gr->SetCut(false); break; case PLOT_LINE_POINTS: { std::string s; s = colourCode; //Mathgl uses strings to manipulate line styles s+=" "; //space means "no line" s+="x"; //x shaped point markers gr->SetCut(true); gr->Plot(xDat,yDat,s.c_str()); if(showErrs) gr->Error(xDat,yDat,eDat,s.c_str()); gr->SetCut(false); break; } default: ASSERT(false); break; } delete[] bufferX; delete[] bufferY; if(showErrs) delete[] bufferErr; } void Plot1D::getRawData(std::vector > &rawData, std::vector &labels) const { vector tmp,dummy; tmp.resize(xValues.size()); std::copy(xValues.begin(),xValues.end(),tmp.begin()); rawData.push_back(dummy); rawData.back().swap(tmp); tmp.resize(yValues.size()); std::copy(yValues.begin(),yValues.end(),tmp.begin()); rawData.push_back(dummy); rawData.back().swap(tmp); labels.push_back(xLabel); if(titleAsRawDataLabel) labels.push_back(title); else labels.push_back(yLabel); if(errBars.size()) { tmp.resize(errBars.size()); std::copy(errBars.begin(),errBars.end(),tmp.begin()); rawData.push_back(dummy); rawData.back().swap(tmp); labels.push_back(string(TRANS("error"))); } } void Plot1D::drawRegions(mglGraph *gr, const mglPoint &min,const mglPoint &max) const { //Mathgl palette colour name string colourCode; for(unsigned int uj=0;uj rMinX && rMaxY > rMinY) { colourCode = mglColourCode(regionGroup.regions[uj].r, regionGroup.regions[uj].g, regionGroup.regions[uj].b); gr->FaceZ(mglPoint(rMinX,rMinY,-1),rMaxX-rMinX,rMaxY-rMinY, colourCode.c_str()); } } } float Plot1D::getSmallestNonzero() const { float minNonzero=std::numeric_limits::max(); for(size_t ui=0;ui 0) minNonzero=std::min(yValues[ui] ,minNonzero); } if(minNonzero == std::numeric_limits::max()) return 0; else return minNonzero; } //-- //2D plotting code Plot2DFunc::Plot2DFunc() { plotMode = PLOT_MODE_2D; plotType=PLOT_2D_DENS; } void Plot2DFunc::setData(const Array2D &a, float xLow,float xHigh, float yLow, float yHigh) { xyValues=a; minX=xLow; maxX=xHigh; minY=yLow; maxY=yHigh; } bool Plot2DFunc::isEmpty() const { return xyValues.empty(); } PlotBase * Plot2DFunc::clone() const { Plot2DFunc *pb = new Plot2DFunc; pb->xyValues=xyValues; copyBase(pb); return pb; } void Plot2DFunc::drawPlot(mglGraph *graph) const { #ifdef DEBUG checkConsistent(); #endif size_t w,h; w=xyValues.width(); h=xyValues.height(); mglData xyData(w,h); #pragma omp parallel for for(size_t ui=0;uiAxis("xy"); graph->SetCut(false); graph->Dens(xAxis,yAxis,xyData); graph->SetCut(true); } void Plot2DFunc::getRawData(std::vector > &rawData, std::vector &labels) const { xyValues.unpack(rawData); labels.resize(rawData.size(),title); } //-- Plot2DScatter::Plot2DScatter() { plotType=PLOT_2D_SCATTER; scatterIntensityLog=false; } void Plot2DScatter::setData(const vector > &f) { points =f; computeDataBounds(f,minX,maxX,minY,maxY); } void Plot2DScatter::setData(const vector > &f, const vector &inten) { points =f; intensity=inten; computeDataBounds(f,minX,maxX,minY,maxY); } bool Plot2DScatter::isEmpty() const { return points.empty(); } PlotBase *Plot2DScatter::clone() const { Plot2DScatter *pb = new Plot2DScatter; pb->points=points; copyBase(pb); return pb; } void Plot2DScatter::drawPlot(mglGraph *graph) const { mglData xDat, yDat,sizeDat; float *bufX,*bufY; bufX = new float[points.size()]; if(!bufX) return; bufY = new float[points.size()]; if(!bufY) { delete[] bufX; return; } for(unsigned int ui=0;uiMark(xDat,yDat,sizeDat,"o",colourCode.c_str()); } void Plot2DScatter::getRawData(std::vector > &rawData, std::vector &labels) const { if(intensity.size()) { rawData.resize(3); for(unsigned int ui=0;ui<3;ui++) rawData[ui].resize(points.size()); for(unsigned int ui=0;ui x ) { id=ui; return true; } } return false; } void RegionGroup::getRegion(unsigned int offset, PlotRegion &r) const { r = regions[offset]; } void RegionGroup::addRegion(unsigned int regionID,const std::string &name, float start, float end, float rNew, float gNew, float bNew, Filter *parentFilter) { ASSERT(start =0.0 && rNew <= 1.0); ASSERT( gNew>=0.0 && gNew <= 1.0); ASSERT( bNew>=0.0 && bNew <= 1.0); PlotRegion region(PlotRegion::ACCESS_MODE_FILTER,parentFilter); //1D plots only have one bounding direction region.bounds.push_back(std::make_pair(start,end)); //Set the ID for the region region.id = regionID; region.label=name; #ifdef DEBUG //Ensure ID value is unique per parent for(size_t ui=0;ui mean) { //Disallow hitting other bounds for(unsigned int ui=0; ui mean && ui != offset) ) newPosX=std::min(newPosX,regions[ui].bounds[0].first); } } else { //Disallow hitting other bounds for(unsigned int ui=0; ui mean && ui != offset)) newPosX=std::min(newPosX,regions[ui].bounds[0].first); } //Dont allow past self left newPosX=std::max(newPosX,regions[offset].bounds[0].first); break; } default: ASSERT(false); } } void RegionGroup::moveRegion(unsigned int offset, unsigned int method, bool selfUpdate, float newPosX,float newPosY) { //TODO: Change function signature to handle vector directly, // rather than repackaging it? vector v; v.push_back(newPosX); v.push_back(newPosY); regions[offset].updateParent(method,v,selfUpdate); haveOverlapCache=false; } void RegionGroup::getOverlaps(vector > &ids, vector< pair > &coords) const { //Rebuild the cache as needed if(!haveOverlapCache) { overlapIdCache.clear(); overlapCoordsCache.clear(); //Loop through upper triangular region of cross, checking for overlap for(unsigned int ui=0;uiregionGroup=r; } void PlotOverlays::draw(mglGraph *gr, const mglPoint &boundMin, const mglPoint &boundMax,bool logMode ) const { if(!isEnabled) return; string colourCode; //Draw the overlays in black colourCode = mglColourCode(0.0,0.0,0.0); for(size_t ui=0;ui bufX,bufY; float maxV; maxV=-std::numeric_limits::max(); bufX.resize(overlayData[ui].coordData.size()); bufY.resize(overlayData[ui].coordData.size()); for(size_t uj=0;uj boundMin.x && bufX[uj]< boundMax.x && boundMin.y < bufY[uj]) { //Print labels near to the text const float STANDOFF_FACTOR=1.05; gr->Puts(mglPoint(bufX[uj],bufY[uj]*STANDOFF_FACTOR), overlayData[ui].title.c_str()); } } //Draw stems. gr->Stem(xDat,yDat,"k"); } } #ifdef DEBUG void PlotBase::checkConsistent() const { ASSERT(parentObject); ASSERT(parentPlotIndex != (unsigned int)-1); } #endif 3Depict-0.0.19/src/backend/filtertree.h0000644000175000017500000002010712640746376017173 0ustar pcuserpcuser/* * filtertree.h - Filter tree topology and data propagation handling * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef FILTERTREE_H #define FILTERTREE_H #include "tree.hh" #include "filter.h" #include #include #include typedef std::pair > FILTER_OUTPUT_DATA; //Generic filter tree refresh error codes enum { FILTERTREE_REFRESH_ERR_BEGIN=100000, FILTERTREE_REFRESH_ERR_MEM, FILTERTREE_REFRESH_ERR_ENUM_END }; //!Tree of filters, which link together to perform an analysis // this class allows for manupulating and execution of filters class FilterTree { private: //!Are we currently refreshing? mutable bool amRefreshing; //!Caching strategy unsigned int cacheStrategy; //!Maximum size for cache (percent of available ram). float maxCachePercent; //!Filters that provide and act upon datastreams. tree filters; //!Get the filter refresh seed points in tree, by examination of tree caches, block/emit of filters //and tree topology void getFilterRefreshStarts(std::vector::iterator > &propStarts) const; //!Obtain the tree nodes up until (but excluding) these nodes void getConsoleMessagesToNodes(std::vector::iterator> &nodes, std::vector > &messages) const; #ifdef DEBUG //!Check that the output of filter refresh functions void checkRefreshValidity(const std::vector< const FilterStreamData *> &curData, const Filter *refreshFilter) const; #endif //TODO: Move me to tree.hh //!Returns true if the testChild is a child of testParent. // returns false if testchild == testParent, or if the testParent // is not a parent of testChild. static bool isChild(const tree &treeInst, const tree::iterator &testParent, tree::iterator testChild); static size_t countChildFilters(const tree &treeInst, const std::vector::iterator> &nodes); public: FilterTree(); ~FilterTree(); FilterTree(const FilterTree &orig); void swap(FilterTree &); //Note that the = operator creates a *CLONE* of the orignal tree, // not an exact duplicate. underlying pointers will not be the same const FilterTree &operator=(const FilterTree &orig); //Return iterator to tree contents begin. tree::pre_order_iterator depthBegin() const { return filters.begin();}; //Return iterator to tree contents end tree::pre_order_iterator depthEnd() const { return filters.end();} //Return depth of a given iterator size_t maxDepth() const; size_t depth(const tree::pre_order_iterator &it) const ; //Get a reference to the underlying tree const tree &getTree() const { return filters;} //!Return the number of filters size_t size() const {return filters.size();}; //!Remove all tree contents void clear(); bool contains(const Filter *f) const; //Refresh functions //--- //!Run the initialisation stage of the filter processing void initFilterTree() const; bool setFilterProperty(Filter *f, unsigned int key, const std::string &value, bool &needUpdate); //!Refresh the entire filter tree. Whilst this is public, great care must be taken in // deleting the filterstream data correctly. To do this, use the "safeDeleteFilterList" function. unsigned int refreshFilterTree( std::list &outData, std::vector &devices,std::vector > &consoleMessages, ProgressData &curProg, ATOMIC_BOOL &abortRefresh) const; static std::string getRefreshErrString(unsigned int errCode); //!Safely delete data generated by refreshFilterTree(...). //a mask can be used to *prevent* STREAM_TYPE_blah from being deleted. Deleted items are removed from the list. static void safeDeleteFilterList(std::list &outData, size_t typeMask=STREAMTYPE_MASK_ALL, bool maskPrevents=false); //!compute the integrated (accumulated) propagation maps for emission and blocking. // For emission this value gives the possible types that // can be emitted from each filter. It is not possible to // emit types not in the mask // For blocking, give the types that cannot reach the tree output (leaf exit) void getAccumulatedPropagationMaps(std::map &emitTypes, std::map &blockTypes) const; bool isRefreshing() const { return amRefreshing;} //--- //!function for the loading of a filter tree from its XML representation unsigned int loadXML(const xmlNodePtr &treeParent, std::ostream &errStream, const std::string &stateDir); //Write out the filters into their XML representation bool saveXML(std::ofstream &f, std::map &fileMapping, bool writePackage, bool useRelativePaths, unsigned int minTabDepth=0) const; //!Convert tree to a series of flat strings representing the topology //TODO: COnvert to bimap void serialiseToStringPaths(std::map &serialisedPaths) const; void serialiseToStringPaths(std::map &serialisedPaths) const; //Topological alteration & examination functions //---------- //!Remove an element and all sub elements from the tree, void removeSubtree(Filter *f); //!Add a new filter to the tree. Note that pointer will be released // by filter destructor void addFilter(Filter *f, const Filter *parent); //!Add a new tree as a subtree to a node void addFilterTree(FilterTree &f, const Filter *parent); //!Move a branch of the tree to a new position bool reparentFilter(Filter *f, const Filter *newParent); //!Duplicate a branch of the tree to a new position. Do not copy cache, bool copyFilter(Filter *id, const Filter *newParent); //!Obtain a copy of the filters from the specified subtree, // including the target filter and its descendants void cloneSubtree(FilterTree &f,const Filter *targetFilt) const; //--------- //Filter alteration functions //--------- //!Set the filter user text bool setFilterString(Filter *, const std::string &s); //!Invalidate the cache of a given Filter and all its children. // set to 0 to clear all. void clearCache(const Filter *filt,bool includeSelf=true); //!Invalidate the cache of a given type of filter // and all their children. void clearCacheByType(unsigned int type); //!Return all of a given type of filter from the filter tree. Type must be the exact type of filter - it is not a mask void getFiltersByType(std::vector &filters, unsigned int type) const; //!Make the filter system safe (non-hazardous) void removeHazardousContents(); //!Used to remove potentially hazardous filters //(filters that can do nasty things to computers, like executing commands) //which may have come from unsafe sources void stripHazardousContents(); //!return true if the tree contains hazardous filters bool hasHazardousContents() const ; //!Force a wipe of all caches in the filter tree void purgeCache(); bool hasStateOverrides() const ; bool hasUpdates() const ; //--------- void setCachePercent(unsigned int newCache); //Overwrite the contents of the pointed-to range files with // the map contents void modifyRangeFiles(const std::map &toModify); size_t cacheCount(unsigned int typeMask = STREAMTYPE_MASK_ALL) const; }; #endif 3Depict-0.0.19/src/backend/filtertree.cpp0000644000175000017500000014155012720624201017511 0ustar pcuserpcuser/* * filtertree.cpp - Filter tree topology and data propagation handling * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "filtertree.h" #include "filters/allFilter.h" #include "common/xmlHelper.h" #include "common/stringFuncs.h" using std::string; enum { CACHE_DEPTH_FIRST=1, CACHE_NEVER, }; //Unlock helper class for toggling a boolean value at exit class AutoUnlocker { private: bool *lockBool; public: AutoUnlocker(bool *b) { lockBool= b; *lockBool=true;} ~AutoUnlocker() { *lockBool=false;} }; //Simple garbage collector for FilterTree::refresh // does not have to be efficient, as it is assumed that this is not a bottleneck class FilterRefreshCollector { private: //Pile of lists of pointers that we are tracking vector > nodes; //List of pointers we should *not* erase set forgottenNodes; //Find out if a filter tracks itself or not static bool tracksSelf(const FilterStreamData *p) { return p->cached;} #ifdef DEBUG void checkSanity(); #endif public: FilterRefreshCollector() {}; ~FilterRefreshCollector() ; //Add pointers that are to be garbage collected, if they don't maintain // their own ownership void trackPointers(const vector &vecPtrs); //Stop tracking the specified pointers void forgetPointers(const vector &vecPtrs); //clean up all pointers in list void collectAll(); unsigned int getLevel() const { return nodes.size();} void collectToLevel(unsigned int level); #ifdef DEBUG bool isTracked(const FilterStreamData *ptr) const; #endif }; #ifdef DEBUG void FilterRefreshCollector::checkSanity() { //Should never have a duplicate - flatten object to find out set s; for(size_t ui=0;ui::iterator it=nodes[ui].begin(); it!=nodes[ui].end(); ++it) { //Should never have something that tracks itself ASSERT(!tracksSelf(*it) ) //Check that we have not already inserted this ASSERT(s.find(*it) == s.end()) s.insert(*it); ASSERT(forgottenNodes.find(*it) == forgottenNodes.end()); } } s.clear(); } bool FilterRefreshCollector::isTracked(const FilterStreamData *ptr) const { for(unsigned int ui=0;ui::const_iterator it=nodes[ui].begin(); it!=nodes[ui].end(); ++it) { if(*it == ptr) return true; } } return false; } #endif FilterRefreshCollector::~FilterRefreshCollector() { #ifdef DEBUG checkSanity(); #endif collectAll(); } void FilterRefreshCollector::trackPointers(const vector &v) { //Just remember the pointers we want to track list lKeep; for(size_t ui=0;ui &v) { #ifdef DEBUG checkSanity(); #endif for(size_t uj=0;uj::iterator it; it=std::find(nodes[ui].begin(),nodes[ui].end(),v[uj]) ; if(it != nodes[ui].end()) { forgottenNodes.insert(*it); //We deleted the source of this, no need to continue // checking for this particular pointer. nodes[ui].erase(it); break; } } } } void FilterRefreshCollector::collectAll() { #ifdef DEBUG checkSanity(); #endif for(size_t ui=0;ui< nodes.size() ;ui++) { for(list::iterator it=nodes[ui].begin(); it!=nodes[ui].end(); ++it) delete *it; } nodes.clear(); } void FilterRefreshCollector::collectToLevel(unsigned int level) { #ifdef DEBUG checkSanity(); #endif for(size_t ui=level+1;ui::iterator it=nodes[ui].begin(); it!=nodes[ui].end(); ++it) delete *it; } nodes.resize(level); } const float DEFAULT_MAX_CACHE_PERCENT=50; void popPointerStack(std::stack > &inDataStack, unsigned int depth) { while(inDataStack.size() > depth) { //We no longer need this level inDataStack.pop(); } } FilterTree::FilterTree() { maxCachePercent=DEFAULT_MAX_CACHE_PERCENT; cacheStrategy=CACHE_DEPTH_FIRST; amRefreshing=false; } FilterTree::~FilterTree() { clear(); } FilterTree::FilterTree(const FilterTree &orig) : cacheStrategy(orig.cacheStrategy), maxCachePercent(orig.maxCachePercent), filters(orig.filters) { //Don't grab a direct copy of the tree, but rather an cloned duplicate, // without the internal cache data for(tree::pre_order_iterator it=filters.begin(); it!=filters.end();++it) (*it)=(*it)->cloneUncached(); amRefreshing=false; } size_t FilterTree::depth(const tree::pre_order_iterator &it) const { ASSERT(std::find(filters.begin(),filters.end(),*it)!=filters.end()); return filters.depth(it); } void FilterTree::swap(FilterTree &other) { std::swap(cacheStrategy,other.cacheStrategy); std::swap(maxCachePercent,other.maxCachePercent); std::swap(filters,other.filters); } const FilterTree &FilterTree::operator=(const FilterTree &orig) { ASSERT(!amRefreshing) clear(); cacheStrategy=orig.cacheStrategy; maxCachePercent=orig.maxCachePercent; //Make a duplicate of the filter pointers from the other tree // we will overwrite them in a second filters=orig.filters; //Don't grab a direct copy of the tree, but rather an cloned duplicate, // without the internal cache data. // No need to free here, as the orig tree still has the pointers for(tree::pre_order_iterator it=filters.begin(); it!=filters.end();++it) { (*it)=(*it)->cloneUncached(); } return *this; } size_t FilterTree::maxDepth() const { return filters.max_depth(); } void FilterTree::initFilterTree() const { vector< const FilterStreamData *> curData; stack > inDataStack; FilterRefreshCollector refreshCollector; //Do not allow stack to empty inDataStack.push(curData); refreshCollector.trackPointers(curData); //Depth-first search from root node, refreshing filters as we proceed. for(tree::pre_order_iterator filtIt=filters.begin(); filtIt!=filters.end(); ++filtIt) { //Step 0 : Pop the cache until we reach our current level, // deleting any pointers that would otherwise be lost. //--- size_t popLevel; popLevel=filters.depth(filtIt)+1; popPointerStack(inDataStack,popLevel); refreshCollector.collectToLevel(popLevel); ASSERT(refreshCollector.getLevel() == inDataStack.size()); //--- //Step 1: Take the stack top, and turn it into "curdata" using the filter // record the result on the stack //--- //Take the stack top, filter it and generate "curData" (*filtIt)->initFilter(inDataStack.top(),curData); #ifdef DEBUG //Peform some quick sanity checks for(unsigned int ui=0;uicached); } #endif //Step 2: Put output in the intermediary stack, //so it is available for any other children at this level. inDataStack.push(curData); //Track pointers for garbage collection refreshCollector.trackPointers(curData); curData.clear(); //--- } } void FilterTree::clear() { for(tree::iterator filterIt=filters.begin(); filterIt!=filters.end();++filterIt) delete (*filterIt); filters.clear(); } void FilterTree::getAccumulatedPropagationMaps(map &emitTypes, map &blockTypes) const { //Build the emit type map. This describes //what possible types can be emitted at any point in the tree. for(tree::iterator it=filters.begin_breadth_first(); it!=filters.end_breadth_first(); ++it) { //FIXME: HACK -- why does the BFS not terminate correctly? if(!filters.is_valid(it)) break; size_t curEmit; //Root node is special, does not combine with the //previous filter if(!filters.depth(it)) curEmit=(*it)->getRefreshEmitMask(); else { //Normal child. We need to remove any types that //are blocked (& (~blocked)), then add any types that are emitted //(|) curEmit=emitTypes[*(filters.parent(it))]; curEmit&=(~(*it)->getRefreshBlockMask() )& STREAMTYPE_MASK_ALL; curEmit|=(*it)->getRefreshEmitMask(); } ASSERT(curEmit < STREAMTYPE_MASK_ALL); emitTypes.insert(make_pair(*it,curEmit)); } //Build the accumulated block map; this describes //what types, if emitted, will NOT be propagated to the final output //Nor affect any downstream filters //TODO: Why not implement as a reverse BFS?? Would be more efficient... for(size_t ui=filters.max_depth()+1; ui; ) { ui--; for(tree::iterator it=filters.begin(); it!=filters.end(); ++it) { //Check to see if we are at the correct depth if(filters.depth(it) != ui) continue; //Initially assume that everything is passed through //filter int blockMask=0x0; if((*it)->haveCache()) { //Loop over the children of this filter, grab their block masks for(tree::sibling_iterator itJ=it.begin(); itJ!=it.end(); ++itJ) { if((*itJ)->haveCache()) { int curBlockMask; curBlockMask=(*itJ)->getRefreshBlockMask(); blockMask= (blockMask & curBlockMask); } else { blockMask&=0; //The only reason to keep looping is to //alter the blockmask. If it is at any point zero, //then the answer will be zero, due to the & operator. break; } } //OK, so we now know which filters the children will ALL block. //Combine this with our block list for this filter, and we this will give ush //the blocklist for this subtree section blockMask|=(*it)->getRefreshBlockMask(); } else blockMask=0; blockTypes.insert(make_pair(*it,blockMask)); } } } void FilterTree::getFilterRefreshStarts(vector::iterator > &propStarts) const { if(!filters.size()) return; const bool STUPID_ALGORITHM=false; if(STUPID_ALGORITHM) { //Stupid version //start at root every time propStarts.push_back(filters.begin()); } else { //Do something hopefully non-stupid. Here we examine the types of data that are //propagated through the tree, and which filters emit, or block transmission //of any given type (ie their output is influenced only by certain data types). //From this information, and the cache status of each filter //(recall caches only cache data generated inside the filter), it is possible to //skip certain initial element refreshes. //Block and emit adjuncts for tree map accumulatedEmitTypes,accumulatedBlockTypes; getAccumulatedPropagationMaps(accumulatedEmitTypes,accumulatedBlockTypes); vector::iterator > seedFilts; //BUild a filter->iterator mapping map::iterator > leafMap; for(tree::leaf_iterator it=filters.begin_leaf(); it!=filters.end_leaf(); ++it) leafMap[*it]=it; for(tree::iterator it=filters.begin_breadth_first(); it!=filters.end_breadth_first(); ++it) { //FIXME: HACK -- why does the BFS not terminate correctly? if(!filters.is_valid(it)) break; //Check to see if we have an insertion point above us. //if so, we cannot press on, as we have determined that //we must start higher up. // (TODO : Just terminate child enumeration for BFS // for seed filter iterators, instead of this hack-ish method bool isChildFilt; isChildFilt=false; for(unsigned int ui=0; ui::sibling_iterator itJ=filters.begin(it); itJ!=filters.end(it); ++itJ) blockMask&=accumulatedBlockTypes[*itJ]; if( emitMask & ((~blockMask) & STREAMTYPE_MASK_ALL)) { //Oh noes! we don't block, we will have to stop here, // for this subtree. We cannot go further down. seedFilts.push_back(it); } } propStarts.swap(seedFilts); } #ifdef DEBUG for(unsigned int ui=0; ui::iterator > &nodes, std::vector > &messages) const { //obtain a unique list of all filters who are parents of the nodes if(!nodes.size()) return; std::set filterSet; for(unsigned int ui=0;ui::iterator it; it=nodes[ui]; if(it==filters.begin()) filterSet.insert(*it); while(filters.is_valid(it) && filters.parent(it)!= filters.begin()) { filterSet.insert(*it); it=filters.parent(it); } } filterSet.insert(*(filters.begin())); //now loop through the filters and obtain the console messages for(set::iterator it=filterSet.begin();it!=filterSet.end();++it) { vector tmpMsgs; (*it)->getConsoleStrings(tmpMsgs); for(size_t ui=0;ui &outData, std::vector &devices, vector > &consoleMessages, ProgressData &curProg, ATOMIC_BOOL &abortRefresh) const { //initially, we should not want to abort refreshing ASSERT(!abortRefresh); //Tell the filter system about our abort flag Filter::wantAbort=&abortRefresh; //Lock the refresh state. AutoUnlocker unlocker(&amRefreshing); unsigned int errCode=0; if(!filters.size()) return 0; //Destroy any caches that belong to monitored filters that need //refreshing. Failing to do this can lead to filters being skipped //during the refresh for(tree::iterator filterIt=filters.begin(); filterIt!=filters.end();++filterIt) { //We need to clear the cache of *all* //downstream filters, as otherwise //their cache's could block our update. if((*filterIt)->monitorNeedsRefresh()) { for(tree::pre_order_iterator it(filterIt);it!= filters.end(); ++it) { //Do not traverse siblings if(filters.depth(filterIt) >= filters.depth(it) && it!=filterIt ) break; (*it)->clearCache(); } } } initFilterTree(); // -- Build data streams -- vector< const FilterStreamData *> curData; stack > inDataStack; FilterRefreshCollector refreshCollector; //Push some dummy data onto the stack to prime first-pass (call to refresh(..) requires stack //size to be non-zero) inDataStack.push(curData); std::set leafFilters; for(tree::leaf_iterator it=filters.begin_leaf(); it!=filters.end_leaf(); ++it) leafFilters.insert(*it); //Keep redoing the refresh until the user stops fiddling with the filter tree. vector::iterator> baseTreeNodes; baseTreeNodes.clear(); //Find the minimal starting locations for the refresh - eg. we can skip certain filters // depending upon filter cache status and dependency data, and just start from sub-nodes getFilterRefreshStarts(baseTreeNodes); curProg.totalNumFilters=countChildFilters(filters,baseTreeNodes)+baseTreeNodes.size(); for(unsigned int itPos=0;itPos::pre_order_iterator filtIt=baseTreeNodes[itPos]; filtIt!=filters.end(); ++filtIt) { //Check to see if this node is a child of the base node. //if not, move on. if( filtIt!= baseTreeNodes[itPos] && !isChild(filters,baseTreeNodes[itPos],filtIt)) continue; Filter *currentFilter; currentFilter=*filtIt; //Step 0 : Pop the cache until we reach our current level, // delete any pointers that would otherwise be lost. // Recall that the zero size in the stack may not correspond to the // tree root, but rather corresponds to the filter we started refreshing from //--- size_t popLevel; popLevel=filters.depth(filtIt) - filters.depth(baseTreeNodes[itPos])+1; popPointerStack(inDataStack,popLevel); refreshCollector.collectToLevel(popLevel); //--- //Step 1: Set up the progress system //--- curProg.clock(); curProg.curFilter=currentFilter; //--- //Step 2: Check if we should cache this filter or not. //Get the number of bytes that the filter expects to use //--- if(!currentFilter->haveCache()) { unsigned long long cacheBytes; if(inDataStack.empty()) cacheBytes=currentFilter->numBytesForCache(0); else cacheBytes=currentFilter->numBytesForCache(numElements(inDataStack.top())); if(cacheBytes != (unsigned long long)(-1)) { //As long as we have caching enabled, let us cache according to the //selected strategy switch(cacheStrategy) { case CACHE_NEVER: currentFilter->setCaching(false); break; case CACHE_DEPTH_FIRST: { float ramFreeForUse; ramFreeForUse= maxCachePercent/(float)100.0f*getAvailRAM(); bool cache; cache=((float)cacheBytes/(1024*1024) ) < ramFreeForUse; currentFilter->setCaching( cache); break; } } } else currentFilter->setCaching(false); } //--- //Step 3: Take the stack top, and turn it into "curdata" and refresh using the filter. // Record the result on the stack. // We also record any Selection devices that are generated by the filter. // This is the guts of the system. //--- // if(!currentFilter->haveCache()) currentFilter->clearConsole(); currentFilter->clearDevices(); curProg.maxStep=curProg.step=1; curProg.filterProgress=0; //Take the stack top, filter it and generate "curData" try { errCode=currentFilter->refresh(inDataStack.top(),curData,curProg); } catch(std::bad_alloc) { //Should catch bad mem cases in filter, wherever possible WARN(false,"Memory exhausted during refresh"); errCode=FILTERTREE_REFRESH_ERR_MEM; } #ifdef DEBUG //Perform sanity checks on filter output checkRefreshValidity(curData,currentFilter); ASSERT(curProg.step == curProg.maxStep || errCode); //when completing, we should have full progress std::string progWarn = std::string("Progress did not reach 100\% for filter: "); progWarn+=currentFilter->getUserString(); WARN( (curProg.filterProgress == 100 || errCode),progWarn.c_str()); #endif //Ensure that (1) yield is called, regardless of what filter does //(2) yield is called after 100% update curProg.filterProgress=100; vector curDevices; //Retrieve the user interaction "devices", and send them to the scene currentFilter->getSelectionDevices(curDevices); //Add them to the total list of devices for(size_t ui=0;ui tmpMessages; currentFilter->getConsoleStrings(tmpMessages); //Accumulate the messages consoleMessages.reserve(consoleMessages.size()+tmpMessages.size()); for(size_t ui=0;ui uniqSet; for(list::iterator it=outData.begin(); it!=outData.end();++it) { for(size_t ui=0;uisecond.size();ui++) uniqSet.insert(it->second[ui]); } //Clean up the output that we didn't use for(std::set::iterator it=uniqSet.begin(); it!=uniqSet.end(); ++it) { const FilterStreamData *data; data = *it; //Output data is uncached - it is our job to delete it if(!data->cached) delete data; } if(abortRefresh) return FILTER_ERR_ABORT; return errCode; } //Update the filter output statistics, e.g. num objects of each type output currentFilter->updateOutputInfo(curData); //If this is not a leaf, keep track of intermediary pointers if(leafFilters.find(currentFilter)== leafFilters.end()) { //The filter will generate a list of new pointers. If any out-going data //streams are un-cached, track them refreshCollector.trackPointers(curData); //Put this in the intermediary stack, //so it is available for any other children at this level. inDataStack.push(curData); } else if(curData.size()) { //The filter has created an output. Record it for passing to updateScene outData.push_back(make_pair(currentFilter,curData)); refreshCollector.forgetPointers(curData); } //Cur data is recorded either in outData or on the data stack curData.clear(); //--- } } popPointerStack(inDataStack,0); //Clean up any remaining intermediary pointers refreshCollector.collectAll(); //====Output scrubbing === //Should be no duplicate pointers in output data. //(this makes preventing double frees easier, and // minimises unnecessary output) //Construct a single list of all pointers in output, //checking for uniqueness. Delete duplicates std::set uniqueSet; for(list::iterator it=outData.begin();it!=outData.end(); ) { vector::iterator itJ; itJ=it->second.begin(); while(itJ!=it->second.end()) { //Each stream data pointer should only occur once in the entire lot. if(uniqueSet.find(*itJ) == uniqueSet.end()) { uniqueSet.insert(*itJ); ++itJ; } else { itJ=it->second.erase(itJ); } } if(it->second.empty()) it=outData.erase(it); else ++it; } //====== return 0; } string FilterTree::getRefreshErrString(unsigned int code) { const char *REFRESH_ERR_STRINGS[] = {"", "Insufficient memory for refresh", }; unsigned int delta=code-FILTERTREE_REFRESH_ERR_BEGIN; return string(REFRESH_ERR_STRINGS[delta]); } bool FilterTree::setFilterProperty(Filter *targetFilter, unsigned int key, const std::string &value, bool &needUpdate) { ASSERT(std::find(filters.begin(),filters.end(),targetFilter) != filters.end()); if(!targetFilter->setProperty(key,value,needUpdate)) return false; //If we no longer have a cache, and the filter needs an update, then we must //modify the downstream objects if(needUpdate) { for(tree::pre_order_iterator filtIt=filters.begin(); filtIt!=filters.end(); ++filtIt) { if(targetFilter == *filtIt) { //Kill all cache below filtIt for(tree::pre_order_iterator it(filtIt);it!= filters.end(); ++it) { //Do not traverse siblings if(filters.depth(filtIt) >= filters.depth(it) && it!=filtIt ) break; //Do not clear the cache for the target filter. //This is the responsibility of the setProperty function for the filter if(*it !=targetFilter) (*it)->clearCache(); } break; } } } initFilterTree(); return true; } void FilterTree::serialiseToStringPaths(std::map &serialisedPaths) const { stack pathStack; pathStack.push(""); set enumeratedPaths; //Unlikely text string that can be appended to tree path const char *PATH_NONCE="$>"; unsigned int lastDepth=0; for(tree::iterator filterIt=filters.begin(); filterIt!=filters.end();++filterIt) { //if this is a new depth, pop the stack until // we hit the correct level unsigned int curDepth; curDepth=depth(filterIt); //Add one for base element while(pathStack.size() > curDepth +1) { pathStack.pop(); lastDepth--; } std::string testPath; testPath = pathStack.top() + string("/") + (*filterIt)->typeString(); unsigned int nonceIncrement; nonceIncrement=0; while(enumeratedPaths.find(testPath) != enumeratedPaths.end()) { std::string tailStr; nonceIncrement++; stream_cast(tailStr,nonceIncrement); //Keep trying new path with nonce testPath=pathStack.top()+(*filterIt)->typeString() + string(PATH_NONCE) + tailStr; } enumeratedPaths.insert(testPath); const Filter *f; f=(const Filter*)(*filterIt); serialisedPaths.insert(make_pair(f,testPath)); pathStack.push(testPath); } ASSERT(serialisedPaths.size() == filters.size()); } void FilterTree::serialiseToStringPaths(map &serialisedPaths) const { //Build one-way mapping map singleMap; serialiseToStringPaths(singleMap); serialisedPaths.clear(); for(map::iterator it=singleMap.begin(); it!=singleMap.end();++it) { ASSERT(serialisedPaths.find(it->second) == serialisedPaths.end()); serialisedPaths[it->second]=it->first; } } unsigned int FilterTree::loadXML(const xmlNodePtr &treeParent, std::ostream &errStream,const std::string &stateFileDir) { clear(); //Parse the filter tree in the XML file. //generating a filter tree bool inTree=true; tree::iterator lastFilt=filters.begin(); tree::iterator lastTop=filters.begin(); stack::iterator> treeNodeStack; xmlNodePtr nodePtr = treeParent->xmlChildrenNode; //push root tag std::stack nodeStack; nodeStack.push(nodePtr); bool needCleanup=false; while (inTree) { //Jump to the next XML node at this depth if (XMLHelpNextType(nodePtr,XML_ELEMENT_NODE)) { //If there is not one, pop the tree stack if (!treeNodeStack.empty()) { //Pop the node stack for the XML and filter trees. nodePtr=nodeStack.top(); nodeStack.pop(); lastFilt=treeNodeStack.top(); treeNodeStack.pop(); } else { //Did we run out of stack? //then we have finished the tree. inTree=false; } continue; } Filter *newFilt; bool nodeUnderstood; newFilt=0; nodeUnderstood=true; //assume by default we understand, and set false if not //If we encounter a "children" node. Then we need to look at the children of this filter if (!xmlStrcmp(nodePtr->name,(const xmlChar*)"children")) { //Can't have children without parent if (!filters.size()) { needCleanup=true; break; } //Child node should have its own child if (!nodePtr->xmlChildrenNode) { needCleanup=true; break; } nodeStack.push(nodePtr); treeNodeStack.push(lastFilt); nodePtr=nodePtr->xmlChildrenNode; continue; } else { //Well, its not a "children" node, so it could //be a filter... Lets find out std::string tmpStr; tmpStr=(char *)nodePtr->name; if(isValidFilterName(tmpStr)) { newFilt=makeFilter(tmpStr); if (!newFilt->readState(nodePtr->xmlChildrenNode,stateFileDir)) { needCleanup=true; break; } } else { errStream << TRANS("WARNING: Skipping node ") << (const char *)nodePtr->name << TRANS(" as it was not recognised") << endl; nodeUnderstood=false; } } //Skip this item if (nodeUnderstood) { ASSERT(newFilt); //Add the new item the tree if (filters.empty()) lastFilt=filters.insert(filters.begin(),newFilt); else { if (!treeNodeStack.empty()) lastFilt=filters.append_child(treeNodeStack.top(),newFilt); else { lastTop=filters.insert(lastTop,newFilt); lastFilt=lastTop; } } } } //All good? if(!needCleanup) return 0; //OK, we hit an error, we need to delete any pointers on the //cleanup list if(nodePtr) errStream << TRANS("Error processing node: ") << (const char *)nodePtr->name << endl; clear(); //No good.. return 1; } bool FilterTree::saveXML(std::ofstream &f,std::map &fileMapping, bool writePackage, bool useRelativePaths, unsigned int minTabDepth) const { set existingFiles; f << tabs(minTabDepth+1) << "" << endl; //Depth-first search, enumerate all filters in depth-first fashion unsigned int depthLast=0; unsigned int child=0; for(tree::pre_order_iterator filtIt=filters.begin(); filtIt!=filters.end(); ++filtIt) { unsigned int depth; depth = filters.depth(filtIt); if(depth >depthLast) { while(depthLast++ < depth) { f << tabs(minTabDepth+depthLast+1); f << "" << endl; child++; } } else if (depth < depthLast) { while(depthLast-- > depth) { f << tabs(minTabDepth+depthLast+2); f << "" << endl; child--; } } //If we are writing a package, override the filter storage values if(writePackage || useRelativePaths) { vector valueOverrides; (*filtIt)->getStateOverrides(valueOverrides); //The overrides, at the moment, only are files. //So lets find them & move them for(unsigned int ui=0;ui::const_iterator it; it =fileMapping.find(valueOverrides[ui]); if(it == fileMapping.end()) { //map does not exist, so make it! fileMapping[newFilename]=valueOverrides[ui]; } else if (it->second !=valueOverrides[ui]) { //Keep adding a prefix until we find a valid new filename while(fileMapping.find(newFilename) != fileMapping.end()) newFilename="remap"+newFilename; //map does not exist, so make it! fileMapping[newFilename]=valueOverrides[ui]; } valueOverrides[ui] = newFilename; } if(!(*filtIt)->writePackageState(f,STATE_FORMAT_XML,valueOverrides,depth+2)) return false; } else { if(!(*filtIt)->writeState(f,STATE_FORMAT_XML,depth+2)) return false; } depthLast=depth; } //Close out filter tree. while(child--) { f << tabs(minTabDepth+child+2) << "" << endl; } f << tabs(minTabDepth+1) << "" << endl; return true; } bool FilterTree::hasHazardousContents() const { //Check the filter system for "hazardous" contents. // each filter defines what it believes is "hazardous" for(tree::pre_order_iterator it=filters.begin(); it!=filters.end(); ++it) { if ((*it)->canBeHazardous()) return true; } return false; } void FilterTree::stripHazardousContents() { for(tree::pre_order_iterator it=filters.begin(); it!=filters.end(); ++it) { if ((*it)->canBeHazardous()) { //delete filters from this branch for(tree::pre_order_iterator itj(it); itj!=filters.end(); ++itj) delete *itj; //nuke this branch it=filters.erase(it); --it; } } } bool FilterTree::isChild(const tree &treeInst, const tree::iterator &testParent, tree::iterator testChild) { // NOTE: A comparison against tree root (treeInst.begin())is INVALID // for trees that have multiple base nodes. while(treeInst.depth(testChild)) { testChild=treeInst.parent(testChild); if(testChild== testParent) return true; } return false; } bool FilterTree::contains(const Filter *f) const { return std::find(filters.begin(),filters.end(),f) != filters.end(); } size_t FilterTree::countChildFilters(const tree &treeInst, const vector::iterator> &nodes) { set childIts; for(size_t ui=0;ui::pre_order_iterator it=nodes[ui]; it!=treeInst.end();++it) childIts.insert(*it); } return childIts.size()-nodes.size(); } #ifdef DEBUG void FilterTree::checkRefreshValidity(const vector< const FilterStreamData *> &curData, const Filter *refreshFilter) const { //Filter outputs should // - never be null pointers. for(size_t ui=0; uiparent)); } //Filter outputs should // - never contain duplicate pointers for(size_t ui=0; uigetStreamType() & ~( STREAMTYPE_MASK_ALL)) == 0); switch(f->getStreamType()) { case STREAM_TYPE_IONS: { const IonStreamData *ionData; ionData=((const IonStreamData *)f); ASSERT(ionData->data.size()); break; } default: ; } } //Filter outputs should // - Always have isCached set to 0 or 1. // - Filter should report that it has a cache, if it is emitting cached objects bool hasSomeCached=false; for(size_t ui=0; uicached == 1 || curData[ui]->cached == 0); if(curData[ui]->parent == refreshFilter) hasSomeCached|=curData[ui]->cached; } ASSERT(!(hasSomeCached == false && refreshFilter->haveCache())); //Filter outputs for this filter should // -only be from those specified in filter emit mask for(size_t ui=0; uiparent) { cerr << "Warning: orphan filter stream (FilterStreamData::parent == 0)." << "This must be set when creating new filter streams in the ::refresh function for the filter." << endl; cerr << "Filter :" << refreshFilter->getUserString() << "Stream Type: " << STREAM_NAMES[getBitNum(curData[ui]->getStreamType())] << endl; } else if(curData[ui]->parent == refreshFilter) { //Check we emitted something that our parent's emit mask said we should // by performing bitwise ops ASSERT(curData[ui]->getStreamType() & refreshFilter->getRefreshEmitMask()); } } //plot output streams should only have known types //for various identifiers for(size_t ui=0; uigetStreamType() != STREAM_TYPE_PLOT) continue; const PlotStreamData *p; p =(const PlotStreamData*)curData[ui]; p->checkSelfConsistent(); } //Voxel output streams should only have known types for(size_t ui=0; uigetStreamType() != STREAM_TYPE_VOXEL) continue; const VoxelStreamData *p; p =(const VoxelStreamData*)curData[ui]; //Must have valid representation ASSERT(p->representationType< VOXEL_REPRESENT_END); } //Ensure that any output drawables that are selectable have // parent filters with selection devices for(size_t ui=0; uigetStreamType() != STREAM_TYPE_DRAW) continue; const DrawStreamData *p; p =(const DrawStreamData*)curData[ui]; for(size_t uj=0;ujdrawables.size();uj++) { if ( p->drawables[uj]->canSelect ) { vector devices; p->parent->getSelectionDevices(devices); ASSERT(devices.size()); for(size_t uk=0;ukgetNumBindings()); } //Drawables with selection devices cannot be cached ASSERT(!p->cached); } } } } #endif void FilterTree::safeDeleteFilterList( std::list &outData, size_t typeMask, bool maskPrevents) { //Loop through the list of vectors of filterstreamdata, then drop any elements that are deleted for(list ::iterator it=outData.begin(); it!=outData.end(); ) { vector killV; killV.resize(it->second.size(),false); //Note the No-op at the loop iterator. this is needed so we can safely .erase() for(size_t ui=0;uisecond.size();ui++) { const FilterStreamData* f; f= it->second[ui]; //Don't operate on streams if we have a nonzero mask, and the (mask is active XOR mask mode) //NOTE: the XOR flips the action of the mask. if maskprevents is true, then this logical switch //prevents the masked item from being deleted. If not, ONLY the masked types are deleted. //In any case, a zero mask makes this whole thing not do anything, and everything gets deleted. if(typeMask && ( ((bool)(f->getStreamType() & typeMask)) ^ !maskPrevents)) continue; //Output data is uncached - delete it if(!f->cached) delete f; killV[ui]=true; } vectorMultiErase(it->second,killV); //Check to see if this element still has any items in its vector. if not, //then discard the element if(!(it->second.size())) it=outData.erase(it); else ++it; } } void FilterTree::getFiltersByType(std::vector &filtersOut, unsigned int type) const { for(tree::iterator it=filters.begin(); it!=filters.end(); ++it) { if((*it)->getType() == type) filtersOut.push_back(*it); } } void FilterTree::purgeCache() { for(tree::iterator it=filters.begin();it!=filters.end();++it) (*it)->clearCache(); } bool FilterTree::hasStateOverrides() const { for(tree::iterator it=filters.begin(); it!=filters.end(); ++it) { vector overrides; (*it)->getStateOverrides(overrides); if(overrides.size()) return true; } return false; } void FilterTree::addFilter(Filter *f,const Filter *parentFilter) { if(parentFilter) { tree::iterator it= std::find(filters.begin(),filters.end(),parentFilter); ASSERT(it != filters.end()); //Add the child to the tree filters.append_child(it,f); } else { if(filters.empty()) filters.insert(filters.begin(),f); else filters.insert_after(filters.begin(),f); } //Topology has changed, notify filters initFilterTree(); } void FilterTree::addFilterTree(FilterTree &f, const Filter *parent) { //The insert_subtree and insert_subtree_after algorithms // apparently work across multiple trees, I think, after examining tree::merge if(parent) { tree::pre_order_iterator it; it=std::find(filters.begin(),filters.end(),parent); ASSERT(it!=filters.end()); it=filters.append_child(it,0); filters.insert_subtree(it,f.filters.begin()); filters.erase(it); } else { if(f.size()) { if(filters.empty()) filters.insert_subtree(filters.begin(),f.filters.begin()); else filters.insert_subtree_after(filters.begin(),f.filters.begin()); } } f.filters.clear(); } bool FilterTree::copyFilter(Filter *toCopy,const Filter *newParent) { //Copy a filter child to a different filter child if(newParent) { ASSERT(toCopy && newParent && !(toCopy==newParent)); //Look for both newparent and sibling iterators tree::iterator moveFilterIt,parenterIt; moveFilterIt=std::find(filters.begin(),filters.end(),toCopy); parenterIt=std::find(filters.begin(),filters.end(),newParent); ASSERT(moveFilterIt !=filters.end() && parenterIt != filters.end()); if(parenterIt == moveFilterIt) return false; //ensure that we are not trying to move a parent filter to one // of its children if(isChild(filters,moveFilterIt,parenterIt)) return false; //Move the "tomove" filter, and its children to be a child of the //newly nominated parent (DoCS* "adoption" you might say.) //*DoCs : Department of Child Services (bad taste .au joke) //Create a temporary tree and copy the contents into here tree tmpTree; tree::iterator node= tmpTree.insert(tmpTree.begin(),0); tmpTree.replace(node,moveFilterIt); //Note this doesn't kill the original //Replace each of the filters in the temporary_tree with a clone of the original for(tree::iterator it=tmpTree.begin();it!=tmpTree.end(); ++it) *it= (*it)->cloneUncached(); //In the original tree, create a new null node node = filters.append_child(parenterIt,0); //Replace the node with the tmpTree's contents filters.replace(node,tmpTree.begin()); initFilterTree(); return parenterIt != moveFilterIt; } else { //copy a selected base of the tree to a new base component //Look for both newparent and sibling iterators bool found = false; tree::iterator moveFilterIt; for(tree::iterator it=filters.begin(); it!=filters.end(); ++it) { if(*it == toCopy) { moveFilterIt=it; found=true; break; } } if(!found) return false; //Create a temporary tree and copy the contents into here tree tmpTree; tree::iterator node= tmpTree.insert(tmpTree.begin(),0); tmpTree.replace(node,moveFilterIt); //Note this doesn't kill the original //Replace each of the filters in the temporary_tree with a clone of the original for(tree::iterator it=tmpTree.begin();it!=tmpTree.end(); ++it) *it= (*it)->cloneUncached(); //In the original tree, create a new null node node = filters.insert_after(filters.begin(),0); //Replace the node with the tmpTree's contents filters.replace(node,tmpTree.begin()); initFilterTree(); return true; } ASSERT(false); } void FilterTree::removeSubtree(Filter *removeFilt) { ASSERT(removeFilt); //Remove element and all children for(tree::pre_order_iterator filtIt=filters.begin(); filtIt!=filters.end(); ++filtIt) { if(removeFilt == *filtIt) { for(tree::pre_order_iterator it(filtIt);it!= filters.end(); ++it) { //Do not traverse siblings if(filters.depth(filtIt) >= filters.depth(it) && it!=filtIt ) break; //Delete the children filters. delete *it; } //Remove the children from the tree filters.erase_children(filtIt); filters.erase(filtIt); break; } } //Topology has changed, notify filters initFilterTree(); } void FilterTree::cloneSubtree(FilterTree &f,const Filter *targetFilt) const { ASSERT(!f.filters.size()); //Should only be passing empty trees tree::iterator targetIt=std::find(filters.begin(),filters.end(),targetFilt); //Filter should exist. ASSERT(targetIt!=filters.end()); tree::iterator node= f.filters.insert(f.filters.begin(),0); f.filters.replace(node,targetIt); //Note this doesn't kill the original //Replace each of the filters in the output tree with a clone of the original //rather than the actual subtree for(tree::iterator it=f.filters.begin();it!=f.filters.end(); ++it) *it= (*it)->cloneUncached(); } void FilterTree::setCachePercent(unsigned int newCache) { ASSERT(newCache <= 100); if(!newCache) cacheStrategy=CACHE_NEVER; else { cacheStrategy=CACHE_DEPTH_FIRST; maxCachePercent=newCache; } } bool FilterTree::hasUpdates() const { for(tree::iterator it=filters.begin();it!=filters.end();++it) { if((*it)->monitorNeedsRefresh()) return true; } return false; } bool FilterTree::reparentFilter(Filter *f, const Filter *newParent) { ASSERT(f && !(f==newParent)); tree::iterator replaceNode,parentFilterIt ; tree::iterator moveFilterIt=filters.end(); //If we are moving to the base, then that is a special case. if(!newParent) { moveFilterIt=std::find(filters.begin(),filters.end(),f); } else { //Look for both newparent and sibling iterators bool found[2] = {false,false}; for(tree::iterator it=filters.begin(); it!=filters.end(); ++it) { if(!found[0]) { if(*it == f) { moveFilterIt=it; found[0]=true; } } if(!found[1]) { if(*it == newParent) { parentFilterIt=it; found[1]=true; } } if(found[0] && found[1] ) break; } ASSERT(parentFilterIt!=moveFilterIt); ASSERT(found[0] && found[1] ); //ensure that this is actually a parent-child relationship, and not the other way around! for(tree::pre_order_iterator it(moveFilterIt);it!= filters.end(); ++it) { //Do not traverse siblings if(filters.depth(moveFilterIt) >= filters.depth(it) && it!=moveFilterIt ) break; if(it == parentFilterIt) return false; } } ASSERT(moveFilterIt!=filters.end()); //clear the cache of filters //---- //clear children for(tree::pre_order_iterator it(moveFilterIt);it!= filters.end(); ++it) { //Do not traverse siblings if(filters.depth(moveFilterIt) == filters.depth(it)) continue; (*it)->clearCache(); } //Erase the cache of moveFilterIt, and then move it to a new location (*moveFilterIt)->clearCache(); if(!newParent) { //create a dummy node, ready to be replaced replaceNode=filters.insert_after(filters.begin(),0); } else { //Set the new target location to replace replaceNode= filters.append_child(parentFilterIt,0); } //---- //Create a dummy node after this parent //This doesn't actually nuke the original subtree, but rather copies it, //replacing the dummy node. filters.replace(replaceNode,moveFilterIt); //Nuke the original subtree filters.erase(moveFilterIt); //-------- //Topology of filter tree has changed. //some filters may need to know about this initFilterTree(); return true; } void FilterTree::clearCache(const Filter *filter,bool includeSelf) { if(!filter) { //Invalidate everything for(tree::iterator it=filters.begin(); it!=filters.end(); ++it) (*it)->clearCache(); } else { //Find the filter in the tree tree::iterator filterIt; for(tree::iterator it=filters.begin(); it!=filters.end(); ++it) { if(*it == filter) { filterIt=it; break; } } for(tree::pre_order_iterator it(filterIt);it!= filters.end(); ++it) { //Do not traverse siblings if(filters.depth(filterIt) >= filters.depth(it) && it!=filterIt ) break; //If we dont want to include self, then skip if( !includeSelf && *it == filter) continue; (*it)->clearCache(); } } } void FilterTree::clearCacheByType(unsigned int type) { //Build a list of all filters who we need to invalidate // Note that we cannot do this directly on the filter ptr, // as we also need to invalidate children, so re-use the clearCache function for(tree::iterator it=filters.begin(); it!=filters.end(); ++it) { if((*it)->getType() == type) clearCache(*it); } } size_t FilterTree::cacheCount(unsigned int typeMask) const { size_t count=0; for(tree::iterator it=filters.begin(); it!=filters.end(); ++it) { if(((*it)->getType() & typeMask) && (*it)->haveCache()) count++; } return count; } void FilterTree::modifyRangeFiles(const map &toModify) { for(tree::iterator it=filters.begin();it!=filters.end();++it) { //TODO: refactor to introduce filter->hasRange () ? if((*it)->getType() != FILTER_TYPE_RANGEFILE) continue; RangeFileFilter *rngFilt=(RangeFileFilter* )(*it); const RangeFile *r = &(rngFilt->getRange()); if( toModify.find(r) == toModify.end() ) continue; const RangeFile *modRng =toModify.at(r); rngFilt->setRangeData(*modRng); //Erase all downstream objects' caches clearCache(rngFilt,true); } } 3Depict-0.0.19/src/backend/plot.h0000644000175000017500000005024212716174467016007 0ustar pcuserpcuser/* * plot.h - plotting wraper for mathgl * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef PLOT_H #define PLOT_H #include "backend/filter.h" #include "common/array2D.h" #include #include #include #if defined(WIN32) || defined(WIN64) //Help mathgl out a bit: we don't need the GSL on this platform #define NO_GSL #endif #ifdef __APPLE__ #define typeof __typeof__ #endif //Use config header to determine if we need to enable mgl2 support #include "../config.h" #include //mathgl shadows std::isnan #undef isnan //Plot style/mode enum enum { PLOT_LINE_LINES=0, PLOT_LINE_BARS, PLOT_LINE_STEPS, PLOT_LINE_STEM, PLOT_LINE_POINTS, PLOT_LINE_NONE, // not a plot, just marker for enum break PLOT_2D_DENS, PLOT_2D_SCATTER, PLOT_TYPE_ENUM_END }; //This is the plot mode, // it can be determined as a function of the // plot-style/mode enum enum { PLOT_MODE_1D, PLOT_MODE_2D, PLOT_MODE_COLUMN, PLOT_MODE_MIXED, //special marker - different types of plots, when looking at multiple plots PLOT_MODE_ENUM_END //not a plot, just end of enum }; //!Return a human readable string for a given plot type std::string plotString(unsigned int plotMode); //!Return a human readable string for the plot error mode std::string plotErrmodeString(unsigned int errMode); //!Return the plot type given a human readable string unsigned int plotID(const std::string &plotString); //!Return the error mode type, given the human readable string unsigned int plotErrmodeID(const std::string &s); //!Data class for holding info about non-overlapping // interactive rectilinear "zones" overlaid on plots // update method must be set. class PlotRegion { private: size_t accessMode; void *parentObject; public: enum { ACCESS_MODE_FILTER, ACCESS_MODE_RANGEFILE, ACCESS_MODE_ENUM_END }; //Bounding limits for axial bind std::vector > bounds; //Bounding region colour float r,g,b; //The ID value for this region, used when interacting with parent object unsigned int id; std::string label; PlotRegion(); PlotRegion(size_t updateMethod,void *parentObject); const PlotRegion &operator=(const PlotRegion &r); //Alter the update method void setUpdateMethod(size_t updateMethod, void *parentObject); //Update the parent object using the curretn update method void updateParent(size_t method, const std::vector &newBounds, bool updateSelf=true); //Retrieve the parent as a filter object - must be in ACCESS_MODE_FILTER Filter *getParentAsFilter() const { ASSERT(accessMode==ACCESS_MODE_FILTER); return (Filter*)parentObject;}; RangeFile *getParentAsRangeFile() const { ASSERT(accessMode==ACCESS_MODE_RANGEFILE); return (RangeFile*)parentObject;}; std::string getName() const; }; //Handles an array of regions, for drawing and editing of the array class RegionGroup { private: //cache for region overlaps, to reduce need to search mutable std::vector > overlapIdCache; mutable std::vector > overlapCoordsCache; mutable bool haveOverlapCache; public: RegionGroup() { haveOverlapCache=false;}; //!Interactive, or otherwise marked plot regions std::vector regions; void clear() {regions.clear(); }; //!Append a region to the plot void addRegion(unsigned int regionId, const std::string &name, float start, float end, float r,float g, float b, Filter *parentFilter); //!Retrieve the ID of the non-overlapping region in X-Y space bool getRegionIdAtPosition(float x, float y, unsigned int &id) const; //!Retrieve a region using its ID void getRegion(unsigned int id, PlotRegion &r) const; //!Get the number of regions; size_t getNumRegions() const { return regions.size();}; //!Pass the region movement information to the parent filter object // newX and newY should be absolute positions. void moveRegion(unsigned int regionId, unsigned int method, bool selfUpdate, float newX, float newY); //!Obtain limit of motion for a given region movement type void findRegionLimit(unsigned int regionId, unsigned int movementType, float &maxX, float &maxY) const; void getOverlaps(std::vector > &ids, std::vector< std::pair > &coords) const; }; struct OVERLAY_DATA { //Coordinate and amplitude std::vector > coordData; //title for all of te specified overlay data std::string title; //If the overlay is enabled or not bool enabled; }; //!Thse are 1D-stem style overlays that can be used // to draw onto the plot class PlotOverlays { private: bool isEnabled; // List of the overlays that can be shown on the given plot std::vector overlayData; public: PlotOverlays() : isEnabled(true) {} //Add a new overlay to the plot void add(const OVERLAY_DATA &overlay) {overlayData.push_back(overlay);} //Draw the overlay on the current plot void draw(mglGraph *g, const mglPoint &boundMin, const mglPoint &boundMax,bool logMode) const; //Enable the specified overlay void setEnabled(size_t offset,bool isEnabled) {ASSERT(offset &getOverlays() const { return overlayData;}; }; //!Base class for data plotting class PlotBase { protected: //!Sub type of plot (eg lines, bars for 1D) unsigned int plotMode; //!xaxis label std::string xLabel; //!y axis label std::string yLabel; //!Plot title std::string title; //plot colour (for single coloured plots) float r,g,b; //The type of plot (ie what class is it?) unsigned int plotType; void copyBase(PlotBase *target) const; //Find the upper and lower limit of a given dataset static void computeDataBounds(const std::vector &d, float &minV,float &maxV) ; //Find the upper and lower limit of a given dataset static void computeDataBounds(const std::vector &d, const std::vector &errorBar, float &minV,float &maxV); //Find the upper and lower limit of a given dataset static void computeDataBounds(const std::vector > &d, float &minVx,float &maxVx,float &minVy, float &maxVy); public: PlotBase(); virtual ~PlotBase(){}; virtual PlotBase *clone() const = 0; //return the plot type unsigned int getType() const; //return the plot mode, which is derived // uniquely from the plot type unsigned int getMode() const; //!Bounding box for plot float minX,maxX,minY,maxY; //!Is trace visible? bool visible; //!Use the plot title for Y data label when exporting raw data // (true), or use the yLabel bool titleAsRawDataLabel; //!Pointer to some constant object that generated this plot const void *parentObject; //!integer to show which of the n plots that the parent generated //that this data is represented by unsigned int parentPlotIndex; RegionGroup regionGroup; //True if the plot has no data virtual bool isEmpty() const=0; //Draw the plot onto a given MGL graph virtual void drawPlot(mglGraph *graph) const=0; //!Return the true data bounds for this plot virtual void getBounds(float &xMin,float &xMax, float &yMin,float &yMax) const; //Retrieve the raw data associated with this plot. virtual void getRawData(std::vector > &f, std::vector &labels) const=0; //set the plot axis strings (x,y and title) void setStrings(const std::string &x, const std::string &y,const std::string &t); void setColour(float rNew, float gNew, float bNew); std::string getXLabel() const { return xLabel;} std::string getTitle() const { return title;} std::string getYLabel() const { return yLabel;} //Plot mode is, eg 2D or 1D plot unsigned int getPlotMode() const { return plotMode;} //FIXME: Deprecate me. Plot mode should be intrinsic void setPlotMode(unsigned int newMode) { plotMode= newMode;} void getColour(float &r, float &g, float &b) const ; #ifdef DEBUG void checkConsistent() const; #endif }; //!1D Function f(x) class Plot1D : public PlotBase { private: //!Should plot logarithm (+1) of data? Be careful of -ve values. bool logarithmic; //!Data std::vector xValues,yValues,errBars; //Do we want to draw error bars? PLOT_ERROR errMode; //Set the error bars for this plot void genErrBars(); public: Plot1D(); virtual bool isEmpty() const; virtual PlotBase *clone() const; //!Set the plot data from a pair and symmetric Y error void setData(const std::vector > &v); void setData(const std::vector > &v,const std::vector &symYErr); //!Set the plot data from two vectors and symmetric Y error void setData(const std::vector &vX, const std::vector &vY); void setData(const std::vector &vX, const std::vector &vY, const std::vector &symYErr); //!Move a region to a new location. void moveRegion(unsigned int region, unsigned int method, float newPos); //Draw the plot onto a given MGL graph virtual void drawPlot(mglGraph *graph) const; //Draw the associated regions void drawRegions(mglGraph *graph, const mglPoint &min, const mglPoint &max) const; //!Retrieve the raw data associated with the currently visible plots. //note that this is the FULL data not the zoomed data for the current user bounds void getRawData(std::vector > &rawData, std::vector &labels) const; //!Retrieve the ID of the non-overlapping region in X-Y space bool getRegionIdAtPosition(float x, float y, unsigned int &id) const; //!Retrieve a region using its ID void getRegion(unsigned int id, PlotRegion &r) const; //!Pass the region movement information to the parent filter object void moveRegion(unsigned int regionId, unsigned int method, float newX, float newY) const; //Get the region motion limits, to ensure that the selected region does not //overlap after a move operation. Note that the output variables will only //be set for the appropriate motion direction. Eg, an X only move will not //set limitY. void findRegionLimit(unsigned int regionId, unsigned int movementType, float &limitX, float &limitY) const; bool wantLogPlot() const { return logarithmic;}; void setLogarithmic(bool p){logarithmic=p;}; //obtain the smallest nonzero value, if possible (otherwise, returns 0) // - used to get limits for logarithmic plots, for example float getSmallestNonzero() const; //Set the current error mode void setErrMode(PLOT_ERROR newErrMode) ; }; //!2D function, f(x,y). class Plot2DFunc : public PlotBase { private: //2D array, for f(x,y) plots Array2D xyValues; public: Plot2DFunc(); virtual bool isEmpty() const; virtual PlotBase *clone() const; //Draw the plot onto a given MGL graph virtual void drawPlot(mglGraph *graph) const; //!Retrieve the raw data associated with the currently visible plots. //note that this is the FULL data not the zoomed data for the current user bounds void getRawData(std::vector > &rawData, std::vector &labels) const; void setData(const Array2D &a, float xLow, float xHigh, float yLow, float yHigh) ; }; //!2D scatter plot, {x,y}_i class Plot2DScatter : public PlotBase { private: std::vector > points; std::vector intensity; public: //Do we want to display the points in logarithmic terms? bool scatterIntensityLog; Plot2DScatter(); virtual bool isEmpty() const; virtual PlotBase *clone() const; //Draw the plot onto a given MGL graph virtual void drawPlot(mglGraph *graph) const; //!Retrieve the raw data associated with the currently visible plots. //note that this is the FULL data not the zoomed data for the current user bounds void getRawData(std::vector > &rawData, std::vector &labels) const; //reset the data stored in the plot void setData(const std::vector > &pts); void setData(const std::vector > &pts ,const std::vector &intens); }; //Wrapper class for containing multiple plots class PlotWrapper { protected: //!Has the plot changed since we last rendered it? bool plotChanged; //!Elements of the plot std::vector plottingData; //! Data regarding plots were visible previously // first pair entry is the parent object pointer. second is the parent plot index //TODO: Convert to serialised parent path std::vector > lastVisiblePlots; //Position independant ID handling for the //plots inserted into the vector UniqueIDHandler plotIDHandler; //!Use user-specified bounding values? bool applyUserBounds; //!User mininum bounds float xUserMin,yUserMin; //!User maximum bounds float xUserMax,yUserMax; //!Switch to enable or disable drawing of the plot legend bool drawLegend; //!is user interaction with the plot supposed to be locked? // - is used to ensure that when updating plot, UI control // will be hinted to take correct action bool interactionLocked; //!Do we want to highlight positions where regions overlap? bool highlightRegionOverlaps; void getAppliedBounds(mglPoint &min,mglPoint &max) const; public: //"stick" type overlays for marking amplitudes on top of the plot PlotOverlays overlays; //!Constructor PlotWrapper(); //!Destructor must delete target plots ~PlotWrapper(); const PlotWrapper &operator=(const PlotWrapper &oth); //Return the number of plots size_t numPlots() const { return plottingData.size();} //Retrieve the IDs for the stored plots void getPlotIDs(std::vector &ids) const ; //Retrieve the title of the plot std::string getTitle(size_t plotId) const; void setEnableHighlightOverlap(bool enable=true) { highlightRegionOverlaps=enable;} //get the type of parent filter that generated the plot size_t getParentType(size_t plotId) const; //True if user is not allowed to interact with plot bool isInteractionLocked() const { return interactionLocked;}; //Disallow interaction with plot (lock=true), or enable interaction (lock=false) void lockInteraction(bool lock=true) {interactionLocked=lock;}; //!Has the contents of the plot changed since the last call to resetChange? bool hasChanged() const { return plotChanged;}; void resetChange() { plotChanged=false;} //!Erase all the plot data void clear(bool preserveVisibility=false); //!Hide all plots (sets all visibility to false) void hideAll(); //!Set the visibilty of a plot, based upon its uniqueID void setVisible(unsigned int uniqueID, bool isVisible=true); //!Get the bounds for the plot void scanBounds(float &xMin,float &xMax,float &yMin,float &yMax) const; //Draw the plot onto a given MGL graph. Only one type (1D,2D etc) of plot may be visible void drawPlot(mglGraph *graph, bool &usingLogMode) const; //!Set the X Y and title strings void setStrings(unsigned int plotID, const char *x, const char *y, const char *t); void setStrings(unsigned int plotID,const std::string &x, const std::string &y,const std::string &t); //TODO: Type hack - should return const Filter * //!Get the parent object fo rthis plot const void *getParent(unsigned int plotID) { ASSERT(plotID < plottingData.size()); return plottingData[plotID]->parentObject;} unsigned int getParentIndex(unsigned int plotId) const { ASSERT(plotId < plottingData.size()); return plottingData[plotId]->parentPlotIndex;} //!Set the plotting mode. void setTraceStyle(unsigned int plotID,unsigned int mode); //!Set the plot colours void setColours(unsigned int plotID, float rN,float gN,float bN); //!Set the bounds on the plot void setBounds(float xMin, float xMax, float yMin,float yMax); //!Get the bounds for the plot void getBounds(float &xMin, float &xMax, float &yMin,float &yMax) const; //!Automatically use the data limits to compute bounds void resetBounds(); //!Get the number of visible plots unsigned int getNumVisible() const; //!Get the number of visible plots unsigned int getNumTotal() const { return plottingData.size(); }; //!Returns true if plot is visible, based upon its uniqueID. bool isPlotVisible(unsigned int plotID) const; void getVisibleIDs(std::vector &plotID) const; //!Disable user bounds void disableUserBounds(){plotChanged=true;applyUserBounds=false;}; //!Disable user axis bounds along one axis only void disableUserAxisBounds(bool xAxis); //!Do our best to restore the visibility of the plot to what it was //before the last clear based upon the plot data owner information. //Note that this will erase the last stored visibility data when complete. void bestEffortRestoreVisibility(); //!Set whether to enable the legend or not void setLegendVisible(bool vis) { drawLegend=vis;plotChanged=true;}; bool getLegendVisible() const { return drawLegend; } //!Add a plot to the list of available plots. Control of the pointer becomes //transferred to this class, so do *NOT* delete it after calling this function unsigned int addPlot(PlotBase *plot); //!Get the ID (return value) and the contents of the plot region at the given position. // Returns false if no region can be found, and true if valid region found bool getRegionIdAtPosition(float px, float py, unsigned int &plotId, unsigned int ®ionID ) const; //Return the region data for the given regionID/plotID combo void getRegion(unsigned int plotId, unsigned int regionId, PlotRegion &r) const; //Get all of the (id, regions) for plots. Bool allows for only the plots that are visible to be obtained void getRegions(std::vector > > ®ions, bool visibleOnly=true) const; //Return the ID and coordinates of any overlapping regions // - this only returns overlaps for individual plots - not between plots void getRegionOverlaps(std::vector > &ids, std::vector< std::pair > &coords) const; //!Retrieve the raw data associated with the selected plots. void getRawData(std::vector > > &data, std::vector > &labels) const; //!obtain the type of a plot, given the plot's uniqueID unsigned int plotType(unsigned int plotId) const; //Retrieve the types of visible plots unsigned int getVisibleMode() const; //!Obtain limit of motion for a given region movement type void findRegionLimit(unsigned int plotId, unsigned int regionId, unsigned int movementType, float &maxX, float &maxY) const; //!Pass the region movement information to the parent filter object void moveRegion(unsigned int plotID, unsigned int regionId, bool regionSelfUp, unsigned int movementType, float newX, float newY) const; //Change the regions to modify the given rangefiles, for each of the // rangefile filters in the map void switchOutRegionParent(std::map &switchMap); void setRegionGroup(size_t plotId, RegionGroup &r); //TODO: convert to serialised parent path //Override the last-visible selection. This allows for overriding which plots were selected, which is normally handled internally void overrideLastVisible(std::vector< std::pair > &overridden); }; #endif 3Depict-0.0.19/src/backend/state.h0000644000175000017500000003621312717205525016142 0ustar pcuserpcuser/* * state.h - user session state handler * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef STATE_H #define STATE_H #include #include #include "gl/cameras.h" #include "gl/effect.h" #include #include "tree.hh" #include "filtertree.h" #include "filtertreeAnalyse.h" #include "animator.h" //Unit tests #ifdef DEBUG bool runStateTests(); #endif void setStateModifyLevel(int newLevel); int getStateModifyLevel(); enum { STATE_MODIFIED_NONE=0, STATE_MODIFIED_VIEW, // the 3D view has chaged STATE_MODIFIED_ANCILLARY, //Eg stashes, inactive cameras, and other things that might get saved STATE_MODIFIED_DATA // actual data output is latered }; class TreeState { private: //!currently active tree FilterTree filterTree; //!ID handler that assigns each filter its own ID that // is guaranteed to be unique for the life of the filter // in the filterTree. These are not guaranteed to be dense //TODO: Can we const the filter pointer? std::map filterMap; //!Undo/redo stack for current state std::deque undoFilterStack,redoFilterStack; FilterTreeAnalyse fta; std::vector selectionDevices; void applyBindings(const std::vector > &bindings); //!True if there are pending updates from the user bool pendingUpdates; //re-entry catcher wxMutex amRefreshing; //Do we want to abort the refresh? This is passed to the tree // to signal if the primary thread would like to abort ATOMIC_BOOL wantAbort; public: TreeState() {pendingUpdates=false; wantAbort=false;} void operator=(const TreeState &otherState); unsigned int refresh(std::list &outData, std::vector > &consoleMessages, ProgressData &prog); //set the abort flag void setAbort() { wantAbort=true;} //are we refreshing? bool isRefreshing() const { return filterTree.isRefreshing();} //!Inform that it has new updates to filters from external sources (eg bindings) void setUpdates() { pendingUpdates=true;}; //!Returns true if the filter tree has updates that need to be processed bool hasUpdates() const; //!Returns true if the filter tree has updates via a filter monitor bool hasMonitorUpdates() const; //Obtain a clone of the active filter tree void cloneFilterTree(FilterTree &f) const {f=filterTree;}; const FilterTree &getTreeRef() const { return filterTree ;}; //!Add a new filter to the tree. Set isbase=false and parentID for not //setting a parent (ie making filter base) void addFilter(Filter *f, bool isBase, size_t parentId); //!Add a new subtree to the tree. Note that the tree will be cleared // as a result of this operation. Control of all pointers will be handled internally. // Currently, If you wish to use ::getFilterById you *must* rebuild the tree control with // ::updateWxTreeCtrl. This should be fixed. void addFilterTree(FilterTree &f,bool isBase=true, size_t parentId=(unsigned int)-1); //!Grab the filter tree from the internal one, and swap the // internal with a cloned copy of the internal. // Can be used eg, to steal the cache // Note that the contents of the incoming filter tree will be destroyed. // -> This implies the tree comes *OUT* of viscontrol, // and a tree cannot be inserted in via this function void switchoutFilterTree(FilterTree &f); //Perform a swap operation on the filter tree. // - *must* have same topology, or you must call updateWxTreeCtrl // - can be used to *insert* a tree into this function void swapFilterTree(FilterTree &f) { f.swap(filterTree);} void swapFilterMap(std::map &m) { filterMap.swap(m);} //!Duplicate a branch of the tree to a new position. Do not copy cache, bool copyFilter(size_t toCopy, size_t newParent,bool copyToRoot=false) ; //TODO: Deprecate me - filter information should not be leaking like this! //Get the ID of the filter from its actual pointer size_t getIdByFilter(const Filter* f) const; const Filter* getFilterById(size_t filterId) const; //!Return all of a given type of filter from the filter tree. Type must be the exact type of filter - it is not a mask void getFiltersByType(std::vector &filters, unsigned int type) const; //!Return the number of filters currently in the main tree size_t numFilters() const { return filterTree.size();}; //!Clear the cache for the filters void purgeFilterCache() { filterTree.purgeCache();}; //!Delete a filter and all its children void removeFilterSubtree(size_t filterId); //Move a filter from one part of the tree to another bool reparentFilter(size_t filterID, size_t newParentID); //!Set the properties using a key-value result /* * The return code tells whether to reject or accept the change. * need update tells us if the change to the filter resulted in a change to the scene */ bool setFilterProperty(size_t filterId,unsigned int key, const std::string &value, bool &needUpdate); //!Set the filter's string void setFilterString(size_t id, const std::string &s); //Modify rangefiles pointed to by given map to new Rangefile (second pointer) void modifyRangeFiles(const std::map &toModify) { filterTree.modifyRangeFiles(toModify);}; //!Clear all caches void clearCache(); //!Clear all caches void clearCacheByType(unsigned int type) { filterTree.clearCacheByType(type);}; void clear() { filterTree.clear();filterMap.clear() ;fta.clear(); } size_t size() const { return filterTree.size(); } //Push the filter tree undo stack void pushUndoStack(); //Pop the filter tree undo stack. If restorePopped is true, // then the internal filter tree is updated with the stack tree void popUndoStack(bool restorePopped=true); //Pop the redo stack, this unconditionally enforces an update of the // active internal tree void popRedoStack(); //Obtain the size of the undo stack size_t getUndoSize() const { return undoFilterStack.size();}; //obtain the size of the redo stack size_t getRedoSize() const { return redoFilterStack.size();}; //Clear undo/redo filter tree stacks void clearUndoRedoStacks() { undoFilterStack.clear(); redoFilterStack.clear();} void stripHazardousContents() { filterTree.stripHazardousContents();} //!Apply external filter modifications that have been changed due to bindings void applyBindingsToTree(); //!Get the analysis results for the last refresh void getAnalysisResults(std::vector &res) const { fta.getAnalysisResults(res);} //!Set the cache maximum ram usage (0->100) void setCachePercent(unsigned int newCache); bool hasStateOverrides() const { return filterTree.hasStateOverrides();} //Return the selection devices obtained from the last refresh std::vector &getSelectionDevices() { return selectionDevices;}; }; //The underlying data for any given state in the analysis toolchain class AnalysisState { private: //Items that should be written to file // on state save //=== //!Viewing cameras for looking at results std::vector savedCameras; //!Filter trees that have been designated as inactive, but // user would like to have them around for use std::vector > stashedTrees; //Scene modification 3D Effects std::vector effects; //Background colours float rBack,gBack,bBack; //Viewing mode for the world indication axes int worldAxisMode; //Camera user has currently activated size_t activeCamera; //Should the plot legend be enabled bool plotLegendEnable; //Filter path and ID of plots that need to be enabled at startup std::vector > enabledStartupPlots; //true if system should be using relative paths when // saving state bool useRelativePathsForSave; //!Working directory for saving std::string workingDir; //=== //file to save to std::string fileName; //!User-set animation properties PropertyAnimator animationState; //TODO: Migrte into some state wrapper class with animationState //Additional state information for animation std::vector > animationPaths; bool camNameExists(const std::string &s) const ; //Clear the effect vector void clearEffects(); //Clear the camera data vector void clearCams(); //Actual load function for loading internal state // this is used by ::load to mitigate actual "state" // class instance modifications on failure bool loadInternal(const char *cpFilename, bool merge, std::ostream &errStream); #ifdef DEBUG void checkSane() const; #endif public: TreeState treeState; AnalysisState(); ~AnalysisState(); //Wipe the state clean void clear(); void operator=(const AnalysisState &oth); //Load an XML representation of the analysis state // - returns true on success, false on fail // - errStream will have human readable messages in // the case that there is a failure // - merge will attempt to join the bool load(const char *cpFilename, bool merge, std::ostream &errStream); //save an XML-ised representation of the analysis sate // - Provides the on-disk to local name // mapping to use when saving. This needs to be copied by // the caller into the same dir as the XML file to be usable // - write package says if state should attempt to ensure that output // state is fully self-contained, and locally referenced bool save(const char *cpFilename, std::map &fileMapping, bool writePackage,bool setModifyLevel=true) const ; //Combine a separate state file into this one, avoiding clashes void merge(const AnalysisState &srcState); //Return the current state's filename std::string getFilename() const { return fileName; } //Return the current state's filename void setFilename(std::string &s) {fileName=s; } //obtain the world axis display state int getWorldAxisMode() const; //obtain the scene background colour void getBackgroundColour(float &r, float &g, float &b) const; //Set the background colour for the void setBackgroundColour(float r, float g, float b); //set the display mode for the world XYZ axes void setWorldAxisMode(unsigned int mode); // === Cameras === //Set the camera vector, clearing any existing cams // note that control of pointers will be taken void setCamerasByCopy(std::vector &c, unsigned int active); void setCameraByClone(const Camera *c, unsigned int offset) ; //Obtain the ID of the active camera size_t getActiveCam() const { ASSERT(activeCamera < savedCameras.size()) ; return activeCamera;}; //Set void setActiveCam(size_t offset) {ASSERT(offset < savedCameras.size()); activeCamera=offset; }; //Remove the camera at the specified offset void removeCam(size_t offset); const Camera *getCam(size_t offset) const; //Obtain a copy of the internal camera vector. // - must delete the copy manually. void copyCams(std::vector &cams) const; //Obtain a copy of the internal camera vector. // note that this reference has limited validity, and may be // invalidated if the state is modified void copyCamsByRef(std::vector &cams) const; size_t getNumCams() const { return savedCameras.size();} //Add a camera by cloning an existing camera void addCamByClone(const Camera *c); bool setCamProperty(size_t offset, unsigned int key, const std::string &value); std::string getCamName(size_t offset) const; //!Add a new camera to the scene void addCam(const std::string &camName, bool makeActive=false); //===== //Effect functions //=== //Set the effect vector void setEffectsByCopy(const std::vector &e); //Copy the internal effect vector. // -Must manually delete each pointer void copyEffects(std::vector &effects) const; //=== //Plotting functions //======= void setPlotLegend(bool enabled) {plotLegendEnable=enabled;} void setEnabledPlots(const std::vector > &enabledPlots) {enabledStartupPlots = enabledPlots;} void getEnabledPlots(std::vector > &enabledPlots) const { enabledPlots=enabledStartupPlots;} //Set whether to use relative paths in saved file void setUseRelPaths(bool useRel); //get whether to use relative paths in saved file bool getUseRelPaths() const; //Set the working directory to be specified when using relative paths void setWorkingDir(const std::string &work); //Set the working directory to be specified when using relative paths std::string getWorkingDir() const { return workingDir;}; ///Set the stashed filters to use internally void setStashedTreesByClone(const std::vector > &s); //Add an element to the stashed filters void addStashedTree( const std::pair &); //!Transform the subtree at the given point into a stash, and save it void stashFilters(unsigned int filterId, const char *stashName); //Retrieve the specified stashed filter void copyStashedTree(size_t offset, std::pair &) const; void copyStashedTree(size_t offset, FilterTree &) const; //retrieve all stashed filters void copyStashedTrees(std::vector > &stashList) const; //!Insert the given stash into the tree as a child of the given parent filter void addStashedToFilters(const Filter *parentFilter, unsigned int stashOffset); //Remove the stash at the specified offset. Numbers will // be reset, so previous offsets will no longer be valid void eraseStash(size_t offset); //Remove the given stashew at the specified offsets void eraseStashes(std::vector &offset); //Return the number of stash elements size_t getStashCount() const { return stashedTrees.size();} //Get the stash name std::string getStashName(size_t offset) const; //Returns true if there is any data in the stash or the active tree bool hasStateData() const { return (stashedTrees.size() || treeState.size());} //!Returns true if any of the filters (incl. stash) //return a state override (i.e. refer to external entities, such as files) bool hasStateOverrides() const ; void setAnimationState(const PropertyAnimator &p,const std::vector > &animPth) {animationState=p;animationPaths=animPth;} void getAnimationState( PropertyAnimator &p, std::vector > &animPth) const; }; #endif 3Depict-0.0.19/src/Makefile.am0000644000175000017500000001425612723166303015316 0ustar pcuserpcuserMSYS_PATH=/c/msys/1.0/local/include/ %.rc.o: $(WX_RESCOMP) $^ -o $@ 3Depict.rc 3Depict_LDFLAGS=$(LDFLAGS) $(FT_LDFLAGS) $(GSL_LIBS) $(MGL_LIBS) 3Depict_CXXFLAGS=$(CXXFLAGS) $(FT_INCLUDES) $(FTGL_CFLAGS) $(WX_CPPFLAGS) \ $(GL_FLAGS) $(GSL_CFLAGS) $(MGL_CFLAGS) $(XML_CFLAGS) $(PNG_CFLAGS) \ $(OPENMP_FLAGS) $(DEBUG_FLAGS) -pipe 3Depict_CFLAGS=$(CFLAGS) $(FT_INCLUDES) $(FTGL_CFLAGS) \ $(XML_CFLAGS) $(GSL_CFLAGS) $(MGL_CFLAGS) $(PNG_CFLAGS) $(QHULL_CFLAGS) \ $(OPENMP_FLAGS) $(DEBUG_FLAGS) -pipe 3Depict_LDADD=$(LIBS) $(GETTEXT_LIBS) $(WX_LIBS) $(MGL_LIBS) $(FTGL_LIBS) \ $(FT_LIBS) $(XML_LIBS) $(GSL_LIBS) $(GL_LIBS) $(GLU_LIBS) $(QHULL_LIBS) $(PNG_LIBS) bin_PROGRAMS= 3Depict #------- Common header files for all sub-modules COMMON_SOURCE_FILES = common/pngread.c common/stringFuncs.cpp common/constants.cpp common/xmlHelper.cpp\ common/colourmap.cpp common/voxels.cpp common/mathfuncs.cpp common/basics.cpp common/assertion.cpp \ common/mesh.cpp common/gsl_helper.cpp COMMON_HEADER_FILES = common/pngread.h common/stringFuncs.h common/constants.h common/xmlHelper.h common/colourmap.h \ common/mathfuncs.h common/basics.h common/translation.h common/endianTest.h common/assertion.h common/voxels.h \ common/array2D.h common/mesh.h common/gsl_helper.h #----------- #------- "Backend" calculation files (non-ui) ---------- FILTER_FILES = backend/filters/allFilter.cpp backend/filters/filterCommon.cpp \ backend/filters/dataLoad.cpp backend/filters/ionDownsample.cpp \ backend/filters/rangeFile.cpp backend/filters/voxelise.cpp \ backend/filters/spectrumPlot.cpp backend/filters/transform.cpp \ backend/filters/externalProgram.cpp backend/filters/ionClip.cpp \ backend/filters/ionColour.cpp backend/filters/boundingBox.cpp \ backend/filters/profile.cpp backend/filters/spatialAnalysis.cpp \ backend/filters/clusterAnalysis.cpp backend/filters/ionInfo.cpp \ backend/filters/annotation.cpp backend/filters/geometryHelpers.cpp \ backend/filters/algorithms/binomial.cpp backend/filters/algorithms/mass.cpp FILTER_HEADER_FILES = backend/filters/allFilter.h backend/filters/filterCommon.h \ backend/filters/dataLoad.h backend/filters/ionDownsample.h \ backend/filters/rangeFile.h backend/filters/voxelise.h backend/filters/spectrumPlot.h \ backend/filters/transform.h backend/filters/externalProgram.h backend/filters/ionClip.h \ backend/filters/ionColour.h backend/filters/boundingBox.h \ backend/filters/profile.h backend/filters/spatialAnalysis.h \ backend/filters/clusterAnalysis.h backend/filters/ionInfo.h \ backend/filters/annotation.h backend/filters/geometryHelpers.h \ backend/filters/algorithms/binomial.h backend/filters/algorithms/mass.h BACKEND_SOURCE_FILES = backend/animator.cpp backend/filtertreeAnalyse.cpp backend/filtertree.cpp \ backend/APT/ionhit.cpp backend/APT/APTFileIO.cpp backend/APT/APTRanges.cpp backend/APT/abundanceParser.cpp \ backend/APT/vtk.cpp \ backend/filters/algorithms/K3DTree.cpp backend/filters/algorithms/K3DTree-mk2.cpp\ backend/filter.cpp backend/filters/algorithms/rdf.cpp \ backend/viscontrol.cpp backend/state.cpp backend/plot.cpp backend/configFile.cpp BACKEND_HEADER_FILES = backend/animator.h backend/filtertreeAnalyse.h backend/filtertree.h\ backend/APT/ionhit.h backend/APT/APTFileIO.h backend/APT/APTRanges.h backend/APT/abundanceParser.h \ backend/APT/vtk.h backend/filters/algorithms/K3DTree.h backend/filters/algorithms/K3DTree-mk2.h \ backend/filter.h backend/filters/algorithms/rdf.h \ backend/viscontrol.h backend/state.h backend/plot.h backend/configFile.h \ backend/tree.hh #------------ #------------ OpenGL interface files OPENGL_HEADER_FILES = gl/scene.h gl/drawables.h gl/effect.h gl/textures.h gl/select.h gl/cameras.h gl/isoSurface.h gl/tr.h gl/glDebug.h OPENGL_SOURCE_FILES = gl/scene.cpp gl/drawables.cpp gl/effect.cpp gl/textures.cpp gl/select.cpp gl/cameras.cpp gl/isoSurface.cpp gl/tr.cpp #------------ #------------ Frontend (linked to UI in some way) files --- DIALOG_SOURCE_FILES = gui/dialogs/ExportPos.cpp gui/dialogs/ExportRngDialog.cpp gui/dialogs/prefDialog.cpp \ gui/dialogs/resolutionDialog.cpp gui/dialogs/StashDialog.cpp \ gui/dialogs/autosaveDialog.cpp gui/dialogs/filterErrorDialog.cpp \ gui/dialogs/animateFilterDialog.cpp \ gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp \ gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp \ gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp \ gui/dialogs/rangeEditDialog.cpp DIALOG_HEADER_FILES = gui/dialogs/ExportPos.h gui/dialogs/ExportRngDialog.h gui/dialogs/prefDialog.h \ gui/dialogs/StashDialog.h gui/dialogs/resolutionDialog.h \ gui/dialogs/autosaveDialog.h gui/dialogs/filterErrorDialog.h \ gui/dialogs/animateFilterDialog.h \ gui/dialogs/animateSubDialogs/realKeyFrameDialog.h \ gui/dialogs/animateSubDialogs/colourKeyFrameDialog.h \ gui/dialogs/animateSubDialogs/stringKeyFrameDialog.h \ gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.h \ gui/dialogs/rangeEditDialog.h GUI_SOURCE_FILES=gui/mainFrame.cpp gui/mathglPane.cpp gui/cropPanel.cpp gui/glPane.cpp $(DIALOG_SOURCE_FILES) GUI_HEADER_FILES=gui/mainFrame.h gui/mathglPane.h gui/cropPanel.h gui/art.h gui/glPane.h $(DIALOG_HEADER_FILES) BASE_SOURCE_FILES= 3Depict.cpp testing/testing.cpp wx/wxcommon.cpp wx/wxcomponents.cpp winconsole.cpp wx/propertyGridUpdater.cpp BASE_HEADER_FILES= testing/testing.h wx/wxcommon.h wx/wxcomponents.h winconsole.h wx/propertyGridUpdater.h TEST_SOURCE_FILES = testing/mglTesting.cpp TEST_HEADER_FILES = testing/mglTesting.h #----------- SOURCE_FILES= $(BASE_SOURCE_FILES) $(BASE_HEADER_FILES) $(GUI_SOURCE_FILES) $(GUI_HEADER_FILES) \ $(FILTER_FILES) $(FILTER_HEADER_FILES) \ ${BACKEND_SOURCE_FILES} ${BACKEND_HEADER_FILES} $(OPENGL_SOURCE_FILES) $(OPENGL_HEADER_FILES) \ $(COMMON_SOURCE_FILES) $(COMMON_HEADER_FILES) $(TEST_SOURCE_FILES) $(TEST_HEADER_FILES) 3Depict_SOURCES=$(SOURCE_FILES) #Do we have or need windows-XP "resource" files for look and feel? if HAVE_WINDRES 3Depict_SOURCES+=3Depict.rc 3Depict_LDADD+= 3Depict.rc.o endif #Tarball options EXTRA_DIST = gui/glade-skeleton myAppIcon.ico testing/filtertesting.cpp 3Depict-0.0.19/src/testing/0000755000175000017500000000000012723200266014724 5ustar pcuserpcuser3Depict-0.0.19/src/testing/testing.h0000644000175000017500000000174412640746376016577 0ustar pcuserpcuser/* * testing.cpp - unit testing framework * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef TESTING_H #define TESTING_H #ifdef DEBUG #include "backend/filtertree.h" #include "testing/mglTesting.h" //Run all the built-in unit tests. bool runUnitTests(); //Run the particular specified filter tree bool testFilterTree(const FilterTree &f); #endif #endif 3Depict-0.0.19/src/testing/filtertesting.cpp0000644000175000017500000002740012640746376020335 0ustar pcuserpcuser/* * filtertesting.cpp - unit testing implementation for filter code * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include using namespace std; //!Run each filter through its own unit test function bool filterTests(); //!Try cloning the filter from itself, and checking the filter // clone is identical bool filterCloneTests(); //!basic filter tree topology tests bool filterTreeTests(); //Test for bug present in 7199bb83f0ac (internal), // whereby Pos -> External -> Box would produce output, even if // external did nothing // Bug was due to incorrect handling of refresh input data stack bool filterRefreshNoOut(); //!Test a given filter tree that the refresh works bool testFilterTree(const FilterTree &f); //!Test a given filter tree that the refresh is successful, // then return the output. Must delete output with safeDeleteFilterList bool testFilterTree(const FilterTree &f, std::list > > &outData ) ; bool testFilterTree(const FilterTree &f) { std::list > > outData; testFilterTree(f,outData); f.safeDeleteFilterList(outData); return true; } bool testFilterTree(const FilterTree &f, std::list > > &outData ) { std::vector devices; std::vector > consoleMessages; ProgressData prog; #ifdef HAVE_CPP_1X ATOMIC_BOOL wantAbort(false); #else ATOMIC_BOOL wantAbort=false; #endif if(f.refreshFilterTree(outData,devices,consoleMessages,prog,wantAbort)) { f.safeDeleteFilterList(outData); return false; } typedef std::pair > FILTER_PAIR; for(list::iterator it=outData.begin(); it!=outData.end();++it) { cerr << it->first->getUserString() << ":" << endl; for(size_t ui=0;uisecond.size();ui++) { size_t streamType; streamType=ilog2(it->second[ui]->getStreamType()); ASSERT(streamTypesecond[ui]->getNumBasicObjects() << endl; } } //TODO: report on Xml contents f.safeDeleteFilterList(outData); return true; } bool filterTests() { //Instantiate various filters, then run their unit tests for(unsigned int ui=0; uirunUnitTests()) return false; delete f; } if(!Filter::boolToggleTests()) return false; if(!Filter::helpStringTests()) return false; if(!filterRefreshNoOut()) return false; if(!filterCloneTests()) return false; if(!filterTreeTests()) return false; return true; } bool filterCloneTests() { //Run the clone/uncloned versions of filter write functions //against each other and ensure //that their XML output is the same. Then check against //the read function. // // Without a user config file (with altered defaults), this is not a // "strong" test, as nothing is being altered inside the filter after // instantiation in the default case -- stuff can still be missed // in the cloneUncached, and won't be detected, but it does prevent cross-wiring. // ConfigFile configFile; configFile.read(); bool fileWarn=false; for(unsigned int ui=0; uicloneUncached(); //create the files string sOrig,sClone; { wxString wxs,tmpStr; tmpStr=wxT("3Depict-unit-test-a"); tmpStr=tmpStr+(f->getUserString()); wxs= wxFileName::CreateTempFileName(tmpStr); sOrig=stlStr(wxs); //write out one file from original object ofstream fileOut(sOrig.c_str()); if(!fileOut) { //Run a warning, but only once. WARN(fileWarn,"unable to open output xml file for xml test"); fileWarn=true; } f->writeState(fileOut,STATE_FORMAT_XML); fileOut.close(); //write out file from cloned object tmpStr=wxT("3Depict-unit-test-b"); tmpStr=tmpStr+(f->getUserString()); wxs= wxFileName::CreateTempFileName(tmpStr); sClone=stlStr(wxs); fileOut.open(sClone.c_str()); if(!fileOut) { //Run a warning, but only once. WARN(fileWarn,"unable to open output xml file for xml test"); fileWarn=true; } g->writeState(fileOut,STATE_FORMAT_XML); fileOut.close(); } //Now run diff //------------ string command; command = string("diff \'") + sOrig + "\' \'" + sClone + "\'"; wxArrayString stdOut; long res; res=wxExecute((command),stdOut, wxEXEC_BLOCK); string comment = f->getUserString() + string(" Orig: ")+ sOrig + string (" Clone:") +sClone+ string("Cloned filter output was different... (or diff not around?)"); TEST(res==0,comment.c_str()); //----------- //Check both files are valid XML TEST(isValidXML(sOrig.c_str()) ==true,"XML output of filter not valid..."); //Now, try to re-read the XML, and get back the filter, //then write it out again. //--- { xmlDocPtr doc; xmlParserCtxtPtr context; context =xmlNewParserCtxt(); if(!context) { WARN(false,"Failed allocating XML context"); return false; } //Open the XML file doc = xmlCtxtReadFile(context, sClone.c_str(), NULL,XML_PARSE_NONET|XML_PARSE_NOENT); //release the context xmlFreeParserCtxt(context); //retrieve root node xmlNodePtr nodePtr = xmlDocGetRootElement(doc); //Read the state file, then re-write it! g->readState(nodePtr); xmlFreeDoc(doc); ofstream fileOut(sClone.c_str()); g->writeState(fileOut,STATE_FORMAT_XML); //Re-run diff res=wxExecute((command),stdOut, wxEXEC_BLOCK); comment = f->getUserString() + string("Orig: ")+ sOrig + string (" Clone:") +sClone+ string("Read-back filter output was different... (or diff not around?)"); TEST(res==0,comment.c_str()); } //---- //clean up wxRemoveFile((sOrig)); wxRemoveFile((sClone)); delete f; delete g; } return true; } bool filterTreeTests() { FilterTree fTree; Filter *fA = new IonDownsampleFilter; Filter *fB = new IonDownsampleFilter; Filter *fC = new IonDownsampleFilter; Filter *fD = new IonDownsampleFilter; //Tree layout: //A //-> B // -> D //-> C fTree.addFilter(fA,0); fTree.addFilter(fB,fA); fTree.addFilter(fC,fA); fTree.addFilter(fD,fB); TEST(fTree.size() == 4,"Tree construction"); TEST(fTree.maxDepth() == 2, "Tree construction"); //Copy B's child to B. //A //-> B // -> D // -> E //-> C size_t oldSize; oldSize=fTree.size(); TEST(fTree.copyFilter(fD,fB),"copy test"); TEST(oldSize+1 == fTree.size(), "copy test"); TEST(fTree.maxDepth() == 2, " copy test"); //Remove B from tree fTree.removeSubtree(fB); TEST(fTree.size() == 2, "subtree remove test"); TEST(fTree.maxDepth() == 1, "subtree remove test"); fTree.clear(); Filter *f[4]; f[0] = new IonDownsampleFilter; f[1] = new IonDownsampleFilter; f[2] = new IonDownsampleFilter; f[3] = new IonDownsampleFilter; for(unsigned int ui=0;ui<4;ui++) { std::string s; stream_cast(s,ui); f[ui]->setUserString(s); } //build a new tree arrangement //0 // ->3 //1 // ->2 fTree.addFilter(f[0],0); fTree.addFilter(f[1],0); fTree.addFilter(f[2],f[1]); fTree.addFilter(f[3],f[0]); fTree.reparentFilter(f[1],f[3]); //Now : // 0 // ->3 // ->1 // ->2 TEST(fTree.size() == 4,"reparent test") TEST(fTree.maxDepth() == 3, "reparent test"); for(unsigned int ui=0;ui<4;ui++) { TEST(fTree.contains(f[ui]),"reparent test"); } FilterTree fSpareTree=fTree; fTree.addFilterTree(fSpareTree,f[2]); TEST(fTree.maxDepth() == 7,"reparent test"); //Test the swap function FilterTree fTmp; fTmp=fTree; //swap spare with working fTree.swap(fSpareTree); //spare should now be the same size as the original working TEST(fSpareTree.maxDepth() == fTmp.maxDepth(),"filtertree swap"); //swap working back fTree.swap(fSpareTree); TEST(fTree.maxDepth() == fTmp.maxDepth(),"filtertree swap"); bool needUp; ASSERT(fTree.setFilterProperty(f[0],KEY_IONDOWNSAMPLE_FRACTION,"0.5",needUp) || fTree.setFilterProperty(f[0],KEY_IONDOWNSAMPLE_COUNT,"10",needUp)); std::string tmpName; if(!genRandomFilename(tmpName) ) { //Build an XML file containing the filter tree // then try to load it try { //Create an XML file std::ofstream tmpFile(tmpName.c_str()); if(!tmpFile) throw false; tmpFile << "" << endl; //Dump tree contents into XML file std::map dummyMap; if(fTree.saveXML(tmpFile,dummyMap,false,true)) { tmpFile<< "" << endl; } else { WARN(true,"Unable to write to random file in current folder. skipping test"); } //Reparse tree //--- xmlDocPtr doc; xmlParserCtxtPtr context; context =xmlNewParserCtxt(); if(!context) { cout << "Failed to allocate parser" << std::endl; throw false; } //Open the XML file doc = xmlCtxtReadFile(context, tmpName.c_str(), NULL,XML_PARSE_NONET|XML_PARSE_NOENT); if(!doc) throw false; //release the context xmlFreeParserCtxt(context); //retrieve root node xmlNodePtr nodePtr = xmlDocGetRootElement(doc); if(!nodePtr) throw false; nodePtr=nodePtr->xmlChildrenNode; if(!nodePtr) throw false; //find filtertree data if(XMLHelpFwdToElem(nodePtr,"filtertree")) throw false; TEST(!fTree.loadXML(nodePtr,cerr,""),"Tree load test"); xmlFreeDoc(doc); //----- } catch(bool) { WARN(false,"Couldn't run XML reparse of output file - write permission?" ); wxRemoveFile((tmpName)); return true; } wxRemoveFile((tmpName)); } else { WARN(true,"Unable to open random file in current folder. skipping a test"); } return true; } bool filterRefreshNoOut() { //Create a file with some data in it string strData; wxString wxs,tmpStr; tmpStr=wxT("3Depict-unit-test-"); wxs= wxFileName::CreateTempFileName(tmpStr); tmpStr = tmpStr + wxs; strData=stlStr(wxs) + string(".txt"); //Create a text file with some dummy data { ofstream f(strData.c_str()); if(!f) { WARN(false,"Unable to write to dir, skipped unit test"); return true; } //Write out some usable data f << "1 2 3 4" << std::endl; f << "2 1 3 5" << std::endl; f << "3 2 1 6" << std::endl; f.close(); } DataLoadFilter *fData = new DataLoadFilter; Filter *fB = new ExternalProgramFilter; Filter *fC = new IonDownsampleFilter; //Set the data load filter fData->setFilename(strData); fData->setFileMode(DATALOAD_TEXT_FILE); bool needUp; TEST(fB->setProperty(EXTERNALPROGRAM_KEY_COMMAND,"",needUp),"set prop"); FilterTree fTree; fTree.addFilter(fData,0); fTree.addFilter(fB,fData); fTree.addFilter(fC,fB); std::list > > outData; TEST(testFilterTree(fTree,outData),"ext program tree test"); TEST(outData.empty(),"External program refresh test"); fTree.safeDeleteFilterList(outData); wxRemoveFile((strData)); return true; } 3Depict-0.0.19/src/testing/testing.cpp0000644000175000017500000003250312716174467017127 0ustar pcuserpcuser/* * testing.cpp - unit testing implementation * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "testing.h" #ifdef DEBUG #include #include #include #include #include "wx/wxcommon.h" #include "backend/filters/allFilter.h" #include "backend/APT/vtk.h" #include "backend/state.h" #include "backend/configFile.h" #include "backend/filters/algorithms/binomial.h" #include "backend/filters/algorithms/K3DTree-mk2.h" #include "backend/filters/algorithms/K3DTree.h" #include "backend/filters/algorithms/mass.h" #include "backend/APT/ionhit.h" #include "backend/APT/APTFileIO.h" #include "backend/APT/abundanceParser.h" #include "common/stringFuncs.h" #include "common/xmlHelper.h" #include "gl/isoSurface.h" const char *TESTING_RESOURCE_DIRS[] = { "../test/", "./test/" }; #include "filtertesting.cpp" using std::ifstream; using std::cerr; using std::endl; using std::map; //!Try loading each range file in the testing folder bool rangeFileLoadTests(); //!Some elementary function testing bool basicFunctionTests() ; //!Run a few checks on our XML helper functions bool XMLTests(); //!Check to see if manifest contents can be found bool locateDataTests(); bool abundanceTests(); //run the tests for algorithms/ bool algorithmTests(); //Check some external file formats that we can write to bool fileFormatTests(); bool basicFunctionTests() { TEST(testStringFuncs(),"String function test"); //Test point parsing routines { std::string testStr; testStr="0.0,1.0,1"; Point3D p; bool res=p.parse(testStr); ASSERT(res); ASSERT(p.sqrDist(Point3D(0,1,1)) < 0.1f); //test case causes segfault : found 30/9/12 testStr="0,0,,"; res=p.parse(testStr); ASSERT(!res); testStr="(0,0,0)"; res=p.parse(testStr); ASSERT(res); ASSERT(p.sqrDist(Point3D(0,0,0))<0.01f); } //Test some basics routines { TEST(rangesOverlap(0,3,1,2),"Overlap test a contain b"); TEST(rangesOverlap(1,2,0,3),"Overlap test b contain a"); TEST(rangesOverlap(0,2,1,3),"Overlap test a partial b (low)"); TEST(rangesOverlap(1,3,0,2),"Overlap test b partial a (high)"); TEST(rangesOverlap(2,3,1,4),"Overlap test a partial b (high)"); TEST(rangesOverlap(1,3,2,4),"Overlap test b partial a (low)"); TEST(!rangesOverlap(1,2,3,4),"Overlap test"); TEST(!rangesOverlap(3,4,1,2),"Overlap test"); } //Test the LFSR to a small extent (first 16 table entries) // -test is brute-force so we can't test much more without being slow LinearFeedbackShiftReg reg; TEST(reg.verifyTable(16),"Check LFSR table integrity"); return true; } bool runUnitTests() { //Set the abort pointer for the filter #ifdef HAVE_CPP_1X ATOMIC_BOOL abortFlag(false); #else ATOMIC_BOOL abortFlag=false; #endif Filter::wantAbort=&abortFlag; K3DTree::setAbortFlag(&abortFlag); K3DTreeMk2::setAbortFlag(&abortFlag); unsigned int progressVar=0; K3DTree::setProgressPtr(&progressVar); K3DTreeMk2::setProgressPtr(&progressVar); cerr << "Running unit tests..." ; if(!algorithmTests()) return false; if(!testIonHit()) return false; if(!filterTests()) return false; if(!rangeFileLoadTests()) return false; if(!basicFunctionTests()) return false; if(!XMLTests()) return false; if(!runVoxelTests()) return false; if(!runStateTests()) return false; if(!locateDataTests()) return false; if(!testFileIO()) return false; //MGL test is disabled, due to a bug in mathgl in debian testing // which causes threading segfaults. This is fixed in recent versions // if(!mglTest()) // return false; if(!abundanceTests()) return false; if(!testIsoSurface()) return false; if(!fileFormatTests()) return false; cerr << " OK" << endl << endl; return true; } bool rangeFileLoadTests() { //try to load all rng, rrng, and env files in ../tests or ./tests/ //whichever is first. wxString testDir; bool haveDir=false; size_t n; n = THREEDEP_ARRAYSIZE(TESTING_RESOURCE_DIRS); for(unsigned int ui=0;ui rangeExts; RangeFile::getAllExts(rangeExts); for(unsigned int ui=0;ui ionCountMap; map rangeCountMap; //set that contains list of entries that should fail set failSet; ionCountMap["test1.rng"]=10; rangeCountMap["test1.rng"]=6; ionCountMap["test2.rng"]=7; rangeCountMap["test2.rng"]=9; ionCountMap["test3.rng"]=19; rangeCountMap["test3.rng"]=59; failSet.insert("test4.rng"); ionCountMap["test5.rng"]=4; rangeCountMap["test5.rng"]=2; //After discussion with a sub-author of // "Atom Probe Microscopy". ISBN 1461434351 // and author of the RNG entry in the book, // it was agreed that the file shown in the book is invalid. // Multiple ions cannot be assigned in this fashion, // as there is no naming or colour data to match to failSet.insert("test6.rng"); ionCountMap["test7.rng"]=2; rangeCountMap["test7.rng"]=2; ionCountMap["test8.rng"]=2; rangeCountMap["test8.rng"]=2; ionCountMap["test9.rng"]=3; rangeCountMap["test9.rng"]=3; ionCountMap["test10.rng"]=3; rangeCountMap["test10.rng"]=3; ionCountMap["test11.rng"]=5; rangeCountMap["test11.rng"]=10; ionCountMap["test12.rng"]=5; rangeCountMap["test12.rng"]=10; ionCountMap["test1.rrng"]=1; rangeCountMap["test1.rrng"]=1; ionCountMap["test2.rrng"]=3; rangeCountMap["test2.rrng"]=6; ionCountMap["test3.rrng"]=8; rangeCountMap["test3.rrng"]=42; ionCountMap["test4.rrng"]=14; rangeCountMap["test4.rrng"]=15; ionCountMap["test5.rrng"]=1; rangeCountMap["test5.rrng"]=1; ionCountMap["test6.rrng"]=2; rangeCountMap["test6.rrng"]=4; ionCountMap["test1.env"]=1; rangeCountMap["test1.env"]=1; //Sort the array before we go any further, so that the output //each time is the same, regardless of how the files were //loaded into the dir. F.ex this makes diffing easier arrayStr.Sort(); //Now, check to see if each file is in fact a valid, loadable range file for(unsigned int ui=0;ui typeMapping; typeMapping["test1.rng"]=RANGE_FORMAT_ORNL; typeMapping["test2.rng"]=RANGE_FORMAT_ORNL; typeMapping["test3.rng"]=RANGE_FORMAT_ORNL; typeMapping["test5.rng"]=RANGE_FORMAT_ORNL; typeMapping["test7.rng"]=RANGE_FORMAT_ORNL; typeMapping["test8.rng"]=RANGE_FORMAT_ORNL; typeMapping["test9.rng"]=RANGE_FORMAT_ORNL; typeMapping["test10.rng"]=RANGE_FORMAT_ORNL; typeMapping["test11.rng"]=RANGE_FORMAT_ORNL; typeMapping["test12.rng"]=RANGE_FORMAT_DBL_ORNL; typeMapping["test1.rrng"]=RANGE_FORMAT_RRNG; typeMapping["test2.rrng"]=RANGE_FORMAT_RRNG; typeMapping["test3.rrng"]=RANGE_FORMAT_RRNG; typeMapping["test4.rrng"]=RANGE_FORMAT_RRNG; typeMapping["test5.rrng"]=RANGE_FORMAT_RRNG; typeMapping["test6.rrng"]=RANGE_FORMAT_RRNG; typeMapping["test1.env"]=RANGE_FORMAT_ENV; for(unsigned int ui=0;ui v; v.push_back(""); v.push_back(" \"\'&<>;"); v.push_back("&"); for(unsigned int ui=0;ui paths; paths.push_back("./test/manifest.txt"); paths.push_back("../test/manifest.txt"); paths.push_back("manifest.txt"); //Try some standard paths bool manifestOK=false; for(unsigned int ui=0;ui failures; unsigned int lineNum=0; unsigned int checkedCount=0; while(manifest) { lineNum++; std::string line; getline(manifest,line); line=stripWhite(line); if(line.empty() || line[0] == '#') continue; std::string arch,path; arch=line.substr(0,3); path=stripWhite(line.substr(4)); //Find out if we need to check this path // under our current arch bool check; check=false; if(arch == "all") check=true; else { //Check only if compiled for a specific arch if(arch == "win") { #if defined(__WIN32__) || defined(__WIN64) check=true; #endif } else if(arch == "lin") { #ifdef __linux__ check=true; #endif } else if(arch == "mac") { #ifdef __APPLE__ check=true; #endif } else { std::string errStr,tmp; errStr="Syntax error in manifest, line " ; stream_cast(tmp,lineNum); errStr+=lineNum; errStr+=". Should start with win/lin/mac/all"; TEST(false,errStr); } } if(check) { std::string newPath; newPath=locateDataFile(path.c_str()); ifstream f(newPath.c_str()); if(!f) { std::string errStr; errStr="Unable to locate: "; errStr+=path; failures.push_back(errStr); } else checkedCount++; } } if(failures.size()) { WARN(false,"Failed to locate files in manifest."); for(size_t ui=0;ui. */ #ifndef MGLTESTING_H #define MGLTESTING_H //!Run a quick test that mathgl is working bool mglTest(); #endif 3Depict-0.0.19/src/testing/mglTesting.cpp0000644000175000017500000000732312717201575017561 0ustar pcuserpcuser/* * mglTesting.cpp - unit testing implementation for mgl code * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifdef DEBUG #include #include #include #include #include "config.h" #include "common/assertion.h" #include #include "common/basics.h" #include "common/stringFuncs.h" //Create a fixed type of mathgl graph, then compare it to // a reference image (if possible) bool mglTest() { //something is wrong with mathgl's FP handling bool fpeTrapped=getTrapfpe(); if(fpeTrapped) trapfpe(false); unsigned int w=1024,h=768; mglGraph *grS; grS = new mglGraph(w,h); //Create some fake data mglData someDataX,someDataY; float *bufferX,*bufferY; bufferX=new float[100]; bufferY=new float[100]; for(unsigned int ui=0; ui<100; ui++) { bufferX[ui]=ui; bufferY[ui]=ui; } someDataX.Set(bufferX, 100); someDataY.Set(bufferY, 100); //Set up the plot area grS->SetRanges(0,100); grS->SetOrigin(mglPoint(0,0)); grS->Label('x',"axis one"); grS->Label('y',"axis two",0); grS->SetCut(true); //set up the axes a little mglCanvas *canvas = dynamic_cast(grS->Self()); canvas->AdjustTicks("x"); canvas->SetTickTempl('x',"%g"); canvas->Axis("xy"); grS->Plot(someDataX,someDataY,"r"); std::string s,t; genRandomFilename(t); s=t+".svg"; pushLocale("C",LC_NUMERIC); grS->WriteSVG(s.c_str()); popLocale(); //Check that the SVG was written { std::ifstream f(s.c_str()); if(!f) { WARN(false,"MGL Did not generate SVG"); delete[] bufferX; delete[] bufferY; delete grS; return false; } } //Check that mathgl was OK with this if(grS->GetWarn()) { WARN(false,"MGL functions returned an error"); std::cerr << "warncode :" << grS->Self()->GetWarn() << " message:" << grS->Message()<< std::endl; delete[] bufferX; delete[] bufferY; delete grS; return false; } //Try writing a PNG s=t+".png"; grS->WritePNG(s.c_str()); { std::ifstream f(s.c_str()); if(!f) { WARN(false,"MGL Did not generate PNG"); delete[] bufferX; delete[] bufferY; delete grS; return false; } } delete[] bufferX; delete[] bufferY; //Check that the PNG write was OK if(grS->GetWarn()) { WARN(false,"MGL functions returned an error"); std::cerr << "warncode :" << grS->Self()->GetWarn() << " message:" << grS->Message()<< std::endl; delete grS; return false; } delete grS; //TODO: write non-hack image comparison function { std::string call="/usr/bin/python ../extras/image-compare-hist.py "; call+=s; call += " ../test/ref-images/plot-ref.png"; if(!system(call.c_str())) { const char *FILE_COMPARE_OUT="img-compare-result-arkd.txt"; std::ifstream f(FILE_COMPARE_OUT); if(f) { float answer=std::numeric_limits::max(); f >> answer; //As an example, an "OK" image gave 177, a broken image 13000 const float THRESHOLD=2000; TEST(answer < THRESHOLD,"Image comparison failed") } rmFile(FILE_COMPARE_OUT); } else { WARN(false,"Unable to execute rather hacky image comparison code"); } } rmFile(s); rmFile(t+".svg"); if(fpeTrapped) trapfpe(true); return true; } #endif 3Depict-0.0.19/src/gl/0000755000175000017500000000000012723200266013651 5ustar pcuserpcuser3Depict-0.0.19/src/gl/cameras.cpp0000644000175000017500000005744612716174467016027 0ustar pcuserpcuser/* * cameras.cpp - opengl camera implementations * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "cameras.h" #include "common/xmlHelper.h" #include "common/stringFuncs.h" #include "common/constants.h" //MacOS is "special" and puts it elsewhere #ifdef __APPLE__ #include #else #include #endif #include "common/translation.h" #include "glDebug.h" #include #include using std::cerr; using std::endl; using std::string; //TODO: FIXME: Orthogonal camera zooming is very slow, compared to // perspective camera dolly. Check equations of motion for equivalence const float ORTHO_SPEED_HACK=1.05; Camera::Camera() : lock(false),origin(0.0f,0.0f,0.0f), viewDirection(0.0f,0.0f,-1.0f), upDirection(0.0f,0.0f,1.0f), orthoScale(1) { } Camera::~Camera() { } Point3D Camera::getOrigin() const { return origin; } Point3D Camera::getViewDirection() const { return viewDirection; } Point3D Camera::getUpDirection() const { return upDirection; } void Camera::setOrigin(const Point3D &pt) { if(lock) return; origin=pt; } void Camera::setViewDirection(const Point3D &pt) { if(lock) return; viewDirection=pt; viewDirection.normalise(); } void Camera::setUpDirection(const Point3D &pt) { if(lock) return; upDirection = pt; upDirection.normalise(); } void Camera::forwardsDolly(float moveRate) { if(lock) return; origin=origin+ viewDirection*moveRate; } void Camera::move(float moveLR, float moveUD) { if(lock) return; //Right is the cross product of up and //view direction (check sign) //Up is simply the up vector origin+=upDirection*moveUD + (upDirection.crossProd(viewDirection))*moveLR; } void Camera::translate(float moveLR, float moveUD) { if(lock) return; //This camera has no target. Just do plain move move(moveLR,moveUD); } void Camera::pivot(float lrRad, float udRad) { if(lock) return; Point3f viewNew, rotateAxis; //rotate normalised rOrig around axis one then two viewNew.fx=viewDirection[0]; viewNew.fy=viewDirection[1]; viewNew.fz=viewDirection[2]; //rotate around "right" axis Point3D tmp = upDirection.crossProd(viewDirection); rotateAxis.fx=tmp[0]; rotateAxis.fy=tmp[1]; rotateAxis.fz=tmp[2]; quat_rot(&viewNew,&rotateAxis,udRad); //rotate around original "up" axis rotateAxis.fx=upDirection[0]; rotateAxis.fy=upDirection[1]; rotateAxis.fz=upDirection[2]; quat_rot(&viewNew,&rotateAxis,lrRad); viewDirection[0] = rotateAxis.fx; viewDirection[1] = rotateAxis.fy; viewDirection[2] = rotateAxis.fz; } //===== //===== CameraLookAt::CameraLookAt() : target(Point3D(0,0,0)),fovAngle(90.0f), nearPlane(1.0f), frustumDistortion(0.0f) { origin=Point3D(0.0f,0.0f,1.0f); viewDirection=Point3D(0.0f,0.0f,-1.0f); upDirection=Point3D(0.0f,1.0f,0.0f); typeNum=CAM_LOOKAT; projectionMode=PROJECTION_MODE_PERSPECTIVE; } Camera *CameraLookAt::clone() const { CameraLookAt *retCam = new CameraLookAt; retCam->origin =origin; retCam->viewDirection=viewDirection; retCam->upDirection =upDirection; retCam->projectionMode=projectionMode; retCam->orthoScale=orthoScale; retCam->typeNum=typeNum; retCam->userString=userString; retCam->lock=lock; retCam->target = target; retCam->fovAngle = fovAngle; retCam->nearPlane=nearPlane; retCam->farPlane=farPlane; return retCam; } CameraLookAt::~CameraLookAt() { } void CameraLookAt::setTarget(const Point3D &pt) { ASSERT(pt.sqrDist(origin)>10.0f*std::numeric_limits::epsilon()); target=pt; recomputeViewDirection(); } Point3D CameraLookAt::getTarget() const { return target; } void CameraLookAt::setOrigin(const Point3D &newOrigin) { if(lock) return; ASSERT(newOrigin.sqrDist(target)>std::numeric_limits::epsilon()); origin=newOrigin; recomputeViewDirection(); } void CameraLookAt::apply(float aspect, const BoundCube &bc, bool loadIdentity) const { glMatrixMode (GL_PROJECTION); if(loadIdentity) glLoadIdentity(); farPlane = 1.5*bc.getMaxDistanceToBox(origin); switch(projectionMode) { case PROJECTION_MODE_PERSPECTIVE: { gluPerspective(fovAngle/2.0,aspect,nearPlane,farPlane); glMatrixMode(GL_MODELVIEW); break; } case PROJECTION_MODE_ORTHOGONAL: { glOrtho(-orthoScale*aspect,orthoScale*aspect,-orthoScale,orthoScale,nearPlane,farPlane); glMatrixMode(GL_MODELVIEW); break; } default: ASSERT(false); } ASSERT(origin.sqrDist(target)>std::numeric_limits::epsilon()); if(loadIdentity) glLoadIdentity(); lookAt(); } void CameraLookAt::lookAt() const { //This check should be valid, but it causes problems at startup on Wine, // for which I cannot track down the cause #if defined(DEBUG) && !(defined(__WIN32__) || defined(__WIN64__)) GLint mode; glGetIntegerv( GL_MATRIX_MODE, &mode); ASSERT(mode == GL_MODELVIEW || mode == GL_MODELVIEW_MATRIX); #endif //Set up the "look-at" matrix onto the current matrix mode. // this causes the camera to gluLookAt(origin[0],origin[1],origin[2], target[0],target[1],target[2], upDirection[0],upDirection[1],upDirection[2]); } void CameraLookAt::translate(float moveLR, float moveUD) { if(lock) return; float fovMultiplier=1.0f; if(projectionMode== PROJECTION_MODE_PERSPECTIVE) { //Try to move such that the target sweeps our field of view //at a constant rate. Standard normaliser is view length at //a 90* camera //Use tan.. to normalise motion rate //Prevent numerical error near tan( 90*) if(fovAngle < 175.0f) fovMultiplier = tan(fovAngle/2.0*M_PI/180.0); else fovMultiplier = tan(175.0f/2.0*M_PI/180.0); } moveLR=moveLR*sqrtf(target.sqrDist(origin)*fovMultiplier); moveUD=moveUD*sqrtf(target.sqrDist(origin)*fovMultiplier); origin+=upDirection*moveUD + (upDirection.crossProd(viewDirection))*moveLR; target+=upDirection*moveUD + (upDirection.crossProd(viewDirection))*moveLR; } void CameraLookAt::forwardsDolly(float moveRate) { if(lock) return; if(projectionMode == PROJECTION_MODE_PERSPECTIVE) { Point3D newOrigin; //Prevent camera orientation inversion, which occurs when moving past the target if(moveRate > sqrt(target.sqrDist(origin))) { if((target-origin).sqrMag() < sqrtf(std::numeric_limits::epsilon())) return; //Yes, this simplifies analytically. However i think the numerics come into play. float moveInv = 1.0/(fabs(moveRate) + std::numeric_limits::epsilon()); newOrigin=origin+viewDirection*moveInv/(1.0+moveInv); } else { //scale moverate by orbit distance moveRate = moveRate*sqrtf(target.sqrDist(origin)); newOrigin=origin+viewDirection*moveRate; } //Only accept origin change if it is sufficiently far from the target if(newOrigin.sqrDist(target)>sqrtf(std::numeric_limits::epsilon())) origin=newOrigin; } else { float deltaSqr; deltaSqr = (target-origin).sqrMag(); if(deltaSqr< sqrtf(std::numeric_limits::epsilon())) return; Point3D virtualOrigin; virtualOrigin = origin+viewDirection*moveRate; float factor; factor = virtualOrigin.sqrDist(target)/deltaSqr; if( factor > 1.0) factor*=ORTHO_SPEED_HACK; else factor/=ORTHO_SPEED_HACK; orthoScale*=factor; } } //Clockwise roll looking from camera view by rollRad radians void CameraLookAt::roll(float rollRad) { if(lock) return; Point3f rNew,rotateAxis; rotateAxis.fx=viewDirection[0]; rotateAxis.fy=viewDirection[1]; rotateAxis.fz=viewDirection[2]; rNew.fx=upDirection[0]; rNew.fy=upDirection[1]; rNew.fz=upDirection[2]; quat_rot(&rNew,&rotateAxis,rollRad); upDirection=Point3D(rNew.fx,rNew.fy,rNew.fz); recomputeUpDirection(); } void CameraLookAt::pivot(float leftRightRad,float updownRad) { if(lock) return; Point3f rNew,rotateAxis; Point3D tmp; //rotate normalised rOrig around axis one then two tmp=target-origin; rNew.fx=tmp[0]; rNew.fy=tmp[1]; rNew.fz=tmp[2]; //rotate around "right" axis tmp = upDirection.crossProd(viewDirection); tmp.normalise(); rotateAxis.fx=tmp[0]; rotateAxis.fy=tmp[1]; rotateAxis.fz=tmp[2]; quat_rot(&rNew,&rotateAxis,updownRad); Point3D newDir; newDir=Point3D(rNew.fx,rNew.fy,rNew.fz)+origin; //rotate around original "up" axis rotateAxis.fx=upDirection[0]; rotateAxis.fy=upDirection[1]; rotateAxis.fz=upDirection[2]; quat_rot(&rNew,&rotateAxis,leftRightRad); newDir+= Point3D(rNew.fx,rNew.fy,rNew.fz); target = target+newDir; target.normalise(); target*=sqrtf((target).sqrDist(origin)); recomputeViewDirection(); recomputeUpDirection(); } //Make a given bounding box visible, as much as possible void CameraLookAt::ensureVisible(const BoundCube &boundCube, unsigned int face) { if(lock) return; //Face is defined by the following net // 0 // 1 2 3 // 4 // 5 //2 is the face directed to the +ve x axis, //with the "up"" vector on the 3 aligned to z, //so "0" is parallel to the Z axis and is "visible" //from the top +ve side of the z axis (at sufficient distance) //To make the camera visible, we must place the camera //outside the box, on the correct face, //at sufficient distance to ensure that the face closest //to the box is visible at the current FOV. //Box centroid Point3D boxCentroid = boundCube.getCentroid(); //Vector from box face to camera Point3D faceOutVector, tmpUpVec; //I labelled a physical box to work this table out. float boxToFrontDist,faceSize[2]; switch(face) { case CAMERA_DIR_ZPLUS: faceOutVector = Point3D(0,0,1); boxToFrontDist=boundCube.getSize(2); tmpUpVec = Point3D(0,1,0); faceSize[0]=boundCube.getSize(0); faceSize[1]=boundCube.getSize(1); break; case CAMERA_DIR_YMINUS: faceOutVector = Point3D(0,-1,0); boxToFrontDist=boundCube.getSize(1); tmpUpVec = Point3D(1,0,0); faceSize[0]=boundCube.getSize(1); faceSize[1]=boundCube.getSize(0); break; case CAMERA_DIR_XPLUS: faceOutVector = Point3D(1,0,0); boxToFrontDist=boundCube.getSize(0); tmpUpVec = Point3D(0,0,1); faceSize[0]=boundCube.getSize(1); faceSize[1]=boundCube.getSize(2); break; case CAMERA_DIR_YPLUS: faceOutVector = Point3D(0,1,0); boxToFrontDist=boundCube.getSize(1); tmpUpVec =Point3D(1,0,0); faceSize[0]=boundCube.getSize(0); faceSize[1]=boundCube.getSize(2); break; case CAMERA_DIR_ZMINUS: faceOutVector = Point3D(0,0,-1); boxToFrontDist=boundCube.getSize(2); tmpUpVec = Point3D(0,1,0); faceSize[0]=boundCube.getSize(0); faceSize[1]=boundCube.getSize(1); break; case CAMERA_DIR_XMINUS: faceOutVector = Point3D(-1,0,0); boxToFrontDist=boundCube.getSize(0); tmpUpVec = Point3D(0,0,1); faceSize[0]=boundCube.getSize(1); faceSize[1]=boundCube.getSize(2); break; default: ASSERT(false); } //Convert box to front distance to vector from //centroid to front face. boxToFrontDist/=2.0f; float halfMaxFaceDim=std::max(faceSize[0],faceSize[1])/2.0; ASSERT(fovAngle > 0); //Set camera target to inside box target=boxCentroid; float outDistance; if(projectionMode == PROJECTION_MODE_PERSPECTIVE) { //Minimal camera distance is given trigonometrically. //Add additional 1 to ensure that nearplane does not clip object outDistance=1.0+boxToFrontDist+halfMaxFaceDim/tan((fovAngle*M_PI/180)/2.0f); } else { outDistance=boxToFrontDist+halfMaxFaceDim; } //Multiply by 1.4 to give a bit of border. origin=boxCentroid+faceOutVector*1.4*outDistance; orthoScale = sqrtf(target.sqrDist(origin))/2.0; //Set the default up direction upDirection=tmpUpVec; //Reset the view direction recomputeViewDirection(); //Ensure up direction orthogonal recomputeUpDirection(); nearPlane = 1; } void CameraLookAt::recomputeViewDirection() { viewDirection=origin-target; viewDirection.normalise(); } void CameraLookAt::recomputeUpDirection() { //Use cross product of view and up to generate an across vector. Point3D across; upDirection.normalise(); across = viewDirection.crossProd(upDirection); across.normalise(); //Regenerate up vector by reversing the cross with a normalised across vector upDirection = across.crossProd(viewDirection); upDirection.normalise(); } void CameraLookAt::move(float moveLRAngle, float moveUDAngle) { if(lock) return; //Think of the camera as moving around the surface of a sphere Point3f curOrig; curOrig.fx = origin[0] - target[0]; curOrig.fy = origin[1] - target[1]; curOrig.fz = origin[2] - target[2]; //Perform "up" rotation Point3D rotateAxis; rotateAxis=upDirection; Point3f r,u; r.fx = rotateAxis[0]; r.fy = rotateAxis[1]; r.fz = rotateAxis[2]; u.fx = upDirection[0]; u.fy = upDirection[1]; u.fz = upDirection[2]; //Perform quaternion rotation around this axis quat_rot(&curOrig,&r, moveLRAngle); quat_rot(&curOrig,&u, moveLRAngle); recomputeViewDirection(); //Perform across rotation rotateAxis =upDirection.crossProd(viewDirection).normalise(); r.fx = rotateAxis[0]; r.fy = rotateAxis[1]; r.fz = rotateAxis[2]; quat_rot(&curOrig,&r, moveUDAngle); //Get transformed coordinates origin[0] = target[0] + curOrig.fx; origin[1] = target[1] + curOrig.fy; origin[2] = target[2] + curOrig.fz; recomputeViewDirection(); } void CameraLookAt::getProperties(CameraProperties &p) const { p.clear(); CameraProperty cp; p.addGroup(); cp.name=TRANS("Lock"); cp.data=boolStrEnc(lock); cp.type=PROPERTY_TYPE_BOOL; cp.key=CAMERA_KEY_LOOKAT_LOCK; p.addEntry(cp); //Add origin cp.name=TRANS("Origin"); stream_cast(cp.data,origin); cp.type=PROPERTY_TYPE_POINT3D; cp.key=CAMERA_KEY_LOOKAT_ORIGIN; p.addEntry(cp); //Add came target pt stream_cast(cp.data,target); cp.name=TRANS("Target"); cp.type=PROPERTY_TYPE_POINT3D; cp.key=CAMERA_KEY_LOOKAT_TARGET; p.addEntry(cp); stream_cast(cp.data,upDirection); cp.name=TRANS("Up Dir."); cp.type=PROPERTY_TYPE_POINT3D; cp.key=CAMERA_KEY_LOOKAT_UPDIRECTION; p.addEntry(cp); //add camera projection options std::vector > choices; string tmp; tmp=TRANS("Perspective"); choices.push_back(make_pair((unsigned int)PROJECTION_MODE_PERSPECTIVE,tmp)); tmp=TRANS("Orthogonal"); choices.push_back(make_pair((unsigned int)PROJECTION_MODE_ORTHOGONAL,tmp)); cp.data=choiceString(choices,projectionMode); cp.name=TRANS("Projection"); cp.type=PROPERTY_TYPE_CHOICE; cp.key=CAMERA_KEY_LOOKAT_PROJECTIONMODE; p.addEntry(cp); switch(projectionMode) { case PROJECTION_MODE_PERSPECTIVE: stream_cast(cp.data,fovAngle); cp.name=TRANS("Field of View (deg)"); cp.type=PROPERTY_TYPE_REAL; cp.key=CAMERA_KEY_LOOKAT_FOV; break; case PROJECTION_MODE_ORTHOGONAL: stream_cast(cp.data,orthoScale); cp.name=TRANS("View size"); cp.type=PROPERTY_TYPE_REAL; cp.key=CAMERA_KEY_LOOKAT_ORTHOSCALE; break; default: ASSERT(false); } p.addEntry(cp); } bool CameraLookAt::setProperty(unsigned int key, const string &value) { switch(key) { case CAMERA_KEY_LOOKAT_LOCK: { if(value == "1") lock=true; else if (value == "0") lock=false; else return false; break; } case CAMERA_KEY_LOOKAT_ORIGIN: { Point3D newPt; if(!newPt.parse(value)) return false; //Disallow origin to be set to same as target if(newPt.sqrDist(target) < sqrtf(std::numeric_limits::epsilon())) return false; origin= newPt; break; } case CAMERA_KEY_LOOKAT_TARGET: { Point3D newPt; if(!newPt.parse(value)) return false; //Disallow origin to be set to same as target if(newPt.sqrDist(origin) < sqrtf(std::numeric_limits::epsilon())) return false; target = newPt; break; } case CAMERA_KEY_LOOKAT_UPDIRECTION: { Point3D newDir; if(!newDir.parse(value)) return false; //View direction and up direction may not be the same if(viewDirection.crossProd(newDir).sqrMag() < sqrtf(std::numeric_limits::epsilon())) return false; upDirection=newDir; //Internal up direction should be perp. to view direction. //use double cross product method to restore recomputeUpDirection(); break; } case CAMERA_KEY_LOOKAT_FOV: { float newFOV; if(stream_cast(newFOV,value)) return false; fovAngle=newFOV; break; } case CAMERA_KEY_LOOKAT_PROJECTIONMODE: { size_t ltmp; if(value == TRANS("Perspective")) ltmp=PROJECTION_MODE_PERSPECTIVE; else if( value == TRANS("Orthogonal")) { if(projectionMode!=PROJECTION_MODE_ORTHOGONAL) { //use the distance to the target as the orthographic //scaling size (size of parallel frustrum) orthoScale=sqrtf(target.sqrDist(origin)); } ltmp=PROJECTION_MODE_ORTHOGONAL; } else { ASSERT(false); return false; } projectionMode=ltmp; break; } case CAMERA_KEY_LOOKAT_ORTHOSCALE: { float newOrthoScale; if(stream_cast(newOrthoScale,value)) return false; orthoScale=newOrthoScale; break; } default: ASSERT(false); } return true; } bool CameraLookAt::writeState(std::ostream &f, unsigned int format, unsigned int nTabs) const { switch(format) { case STATE_FORMAT_XML: { using std::endl; //COMPAT_BREAK: "Persplookat" is f << tabs(nTabs) << "" << endl; f << tabs(nTabs+1) << "" << endl; f << tabs(nTabs+1) << "" << endl; f << tabs(nTabs+1) << "" << endl; if(lock) f<< tabs(nTabs+1) << "" << endl; else f<< tabs(nTabs+1) << "" << endl; f << tabs(nTabs+1) << "" << endl; f << tabs(nTabs+1) << "" << endl; f << tabs(nTabs+1) << "" << endl; f<< tabs(nTabs+1) << "" << endl; f<< tabs(nTabs+1) << "" << endl; f << tabs(nTabs) << "" << endl; break; } default: ASSERT(false); } return true; } bool CameraLookAt::readState(xmlNodePtr nodePtr) { //Retrieve user string if(!XMLGetNextElemAttrib(nodePtr,userString,"userstring","value")) userString=""; std::string tmpStr; //Retrieve projection mode if(!XMLGetNextElemAttrib(nodePtr,projectionMode,"projectionmode","value")) return false; if(projectionMode > PROJECTION_MODE_ENUM_END) return false; //Retrieve orthographic scaling if(!XMLGetNextElemAttrib(nodePtr,orthoScale,"orthoscale","value")) return false; if(orthoScale <=0 || std::isnan(orthoScale)) { orthoScale=1.0f; } float x,y,z; xmlChar *xmlString; //retrieve lock state if(XMLHelpFwdToElem(nodePtr,"lock")) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)"value"); std::string strTmp; strTmp=(char*)xmlString; if(strTmp == "1") lock=true; else if(strTmp == "0") lock=false; else return false; xmlFree(xmlString); //Retrieve origin //==== if(XMLHelpFwdToElem(nodePtr,"origin")) return false; //--Get X value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"x"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(x,tmpStr)) return false; //--Get Z value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"y"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(y,tmpStr)) return false; //--Get Y value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"z"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(z,tmpStr)) return false; origin=Point3D(x,y,z); //==== //Retrieve target //==== if(XMLHelpFwdToElem(nodePtr,"target")) return false; //--Get X value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"x"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(x,tmpStr)) return false; //--Get Z value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"y"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(y,tmpStr)) return false; //--Get Y value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"z"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(z,tmpStr)) return false; target=Point3D(x,y,z); //==== //Retrieve up direction //==== if(XMLHelpFwdToElem(nodePtr,"updirection")) return false; //--Get X value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"x"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(x,tmpStr)) return false; //--Get Z value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"y"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(y,tmpStr)) return false; //--Get Y value-- xmlString=xmlGetProp(nodePtr,(const xmlChar *)"z"); if(!xmlString) return false; tmpStr=(char *)xmlString; xmlFree(xmlString); //Check it is streamable if(stream_cast(z,tmpStr)) return false; upDirection=Point3D(x,y,z); //==== //Get the FOV angle //==== if(!XMLGetNextElemAttrib(nodePtr,fovAngle,"fovangle","value")) return false; if(fovAngle<=0) return false; //==== //Get the near plane //==== if(!XMLGetNextElemAttrib(nodePtr,nearPlane,"nearplane","value")) return false; //==== recomputeViewDirection(); return true; } float CameraLookAt::getViewWidth(float depth) const { if(projectionMode == PROJECTION_MODE_PERSPECTIVE) return depth*tan(fovAngle/2.0f*M_PI/180.0); else if(projectionMode == PROJECTION_MODE_ORTHOGONAL) return -orthoScale*2.0f; //FIXME: Why is this negative??! ASSERT(false); } void CameraLookAt::repositionAroundTarget(unsigned int direction) { //Try to reposition the camera around the target float distance = sqrt(origin.sqrDist(target)); Point3D faceOutVector; switch(direction) { case CAMERA_DIR_ZPLUS: faceOutVector = Point3D(0,0,1); faceOutVector*=distance; break; case CAMERA_DIR_YMINUS: faceOutVector = Point3D(0,-1,0); faceOutVector*=distance; break; case CAMERA_DIR_XPLUS: faceOutVector = Point3D(0,1,0); faceOutVector*=distance; break; case CAMERA_DIR_YPLUS: faceOutVector = Point3D(1,0,0); faceOutVector*=distance; break; case CAMERA_DIR_ZMINUS: faceOutVector = Point3D(0,0,-1); faceOutVector*=distance; break; case CAMERA_DIR_XMINUS: faceOutVector = Point3D(-1,0,0); faceOutVector*=distance; break; default: ASSERT(false); } setOrigin(target+faceOutVector); } std::ostream& operator<<(std::ostream &strm, const Camera &c) { strm << "origin: " << c.origin << std::endl; strm << "View Direction: " << c.viewDirection << std::endl; strm << "Up Direction: "<< c.upDirection << std::endl; return strm; } std::ostream& operator<<(std::ostream &strm, const CameraLookAt &c) { strm << "origin: " << c.origin << std::endl; strm << "Target : " << c.target << std::endl; strm << "View Direction: " << c.viewDirection << std::endl; strm << "Up Direction: "<< c.upDirection << std::endl; strm << "FOV (deg) : " << c.fovAngle << std::endl; strm << "Clip planes: " << c.nearPlane << " (near) " << std::endl; return strm; } 3Depict-0.0.19/src/gl/scene.h0000644000175000017500000002323612640746376015144 0ustar pcuserpcuser/* * scene.h - Opengl interaction header. * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef SCENE_H #define SCENE_H class Scene; class VisController; class Filter; #include "drawables.h" //Custom includes #include "effect.h" #include "glDebug.h" #include //!The scene class brings together elements such as objects, lights, and cameras //to enable scene rendering class Scene { private: bool glewInited; //!Viscontroller. Needed for notification of updates during selection binding VisController *visControl; //!Objects that will be used for drawing std::vector objects; //!Objects used for drawing that will not be destroyed std::vector refObjects; //!Various OpenGL effects std::vector effects; Camera *activeCam; //!Temporary override camera Camera *tempCam; //!Texture pool TexturePool texPool; //!Size of window in px (needed if doing 2D drawing) unsigned int winX,winY; //!Is there a camera set? bool cameraSet; //!Aspect ratio of output window (x/y) -- needed for cams float outWinAspect; //!Effect ID handler UniqueIDHandler effectIDs; //!Cube that holds the scene bounds BoundCube boundCube; //!True if user interaction (selection/hovering) is forbidden bool lockInteract; //!Tells the scene if we are in selection mode or not bool selectionMode; //!Tells us if we are in hover mode (should we draw hover overlays?) bool hoverMode; //!Last selected object from call to glSelect(). -1 if last // call failed to identify an item unsigned int lastSelected; //Prevent camera updates from being passed to opengl bool witholdCamUpdate; //!Last hovered object unsigned int lastHovered; //!Should alpha blending be used? bool useAlpha; //!Should lighting calculations be performed? bool useLighting; //!Should we be using effects? bool useEffects; //!Should the world axis be drawn? bool showAxis; //!Background colour float rBack,gBack,bBack; //!Have we attempted to load the progress animation bool attemptedLoadProgressAnim; //texture to use for progress animation DrawAnimatedOverlay progressAnimTex; //Lighting vector float lightPosition[4]; ///!Draw the hover overlays void drawHoverOverlay(); void drawProgressAnim() const; //!initialise the drawing window unsigned int initDraw(); void updateCam(const Camera *camToUse, bool loadIdentity) const; //reset the position of the overlay void updateProgressOverlay(); //!Draw a specified vector of objects void drawObjectVector(const std::vector &objects, bool &lightsOn, bool drawOpaques=true) const; //!Disable copy constructor by making private Scene &operator=(const Scene &); public: DrawProgressCircleOverlay progressCircle; //!Constructor Scene(); //!Destructor virtual ~Scene(); //!Set the vis control void setVisControl(VisController *v) { visControl=v;}; //!Draw the objects in the active window. May adjust cameras and compute bounding as needed. void draw(bool noUpdateCam=false); //!Draw the normal overlays void drawOverlays(bool noCamUpdate=false) const; //!clear rendering vectors void clearAll(); //!Clear drawing objects vector void clearObjs(); //! Clear the reference object vector void clearRefObjs(); //!Do we have overlay items? bool hasOverlays() const; //!Obtain the scene's light coordinates in camera relative space // requires an array of size 4 (xyzw) void getLightPos(float *f) const; //!Obtain the scene's light coordinates in camera relative space // requires an array of size 4 (xyzw) void setLightPos(const float *f); //!Set the aspect ratio of the output window. Required. void setAspect(float newAspect); //!retrieve aspect ratio (h/w) of output win float getAspect() const { return outWinAspect;}; //!Add a drawable object /*!Pointer must be set to a valid (allocated) object. *!Scene will delete upon call to clearAll, clearObjs or *!upon destruction */ void addDrawable(const DrawableObj *); //!Add a drawable to the reference only section /* Objects referred to will not be modified or destroyed * by this class. It will only be used for drawing purposes * It is up to the user to ensure that they are in a good state */ void addRefDrawable(const DrawableObj *); bool setProgressAnimation(const std::vector &animFiles); void resetProgressAnim() ; //!remove a drawable object void removeDrawable(unsigned int); //!Set the active camera directly // note that the pointer becomes "owned" by the scene. // any previous active camera will be deleted void setActiveCam(Camera *c); //! set the active camera void setActiveCamByClone(const Camera *c); //! get the active camera Camera *getActiveCam() ; //! get the active camera's location Point3D getActiveCamLoc() const; //!Construct (or refresh) a temporary camera /*! this temporary camera is discarded with * either killTempCam or reset to the active * camera with another call to setTempCam(). * The temporary camera overrides the existing camera setup */ void setTempCam(); //!Return pointer to active camera. Must init a temporary camera first! (use setTempCam) Camera *getTempCam() ; //!Make the temp camera permanent. void commitTempCam(); //!Discard the temporary camera void discardTempCam(); //!Are we using a temporary camera? bool haveTempCam() const { return tempCam!=0;}; //!Clone the active camera Camera *cloneActiveCam() const { return activeCam->clone(); }; //!Modify the active camera position to ensure that scene is visible void ensureVisible(unsigned int direction); //!Call if user has stopped interacting with camera briefly. void finaliseCam(); //!perform an openGL selection rendering pass. Return //closest object in depth buffer under position //if nothing, returns -1 unsigned int glSelect(bool storeSelection=true); //!Clear the current selection devices void clearDevices(); //!Apply the device given the following start and end //viewport coordinates. void applyDevice(float startX, float startY, float curX, float curY,unsigned int keyFlags, unsigned int mouseflags,bool permanent=true); // is interaction currently locked? bool isInteractionLocked() const { return lockInteract;} //!Prevent user interaction void lockInteraction(bool amLocking=true) { lockInteract=amLocking;}; //!Set selection mode true=select on, false=select off. //All this does internally is modify how drawing works. void setSelectionMode(bool selMode) { selectionMode=selMode;}; //!Set the hover mode to control drawing void setHoverMode(bool hMode) { hoverMode=hMode;}; //!Return the last object over which the cursor was hovered void setLastHover(unsigned int hover) { lastHovered=hover;}; //!Get the last selected object from call to glSelect() unsigned int getLastSelected() const { return lastSelected;}; //!Return the last object over which the cursor was hovered unsigned int getLastHover() const { return lastHovered;}; //!Duplicates the internal camera vector. return value is active camera //in returned vector unsigned int duplicateCameras(std::vector &cams) const; //!Get a copy of the effects pointers void getEffects(std::vector &effects) const; //!Set whether to use alpha blending void setAlpha(bool newAlpha) { useAlpha=newAlpha;}; //!Set whether to enable lighting void setLighting(bool newLight) { useLighting=newLight;}; //!Set whether to enable the XYZ world axes void setWorldAxisVisible(bool newAxis) { showAxis=newAxis;}; //!Get whether the XYZ world axes are enabled bool getWorldAxisVisible() const { return showAxis;}; //!Set window size void setWinSize(unsigned int x, unsigned int y) {winX=x;winY=y; updateProgressOverlay();} //!Get the scene bounding box BoundCube getBound() const { return boundCube;} //!Set the background colour void setBackgroundColour(float newR,float newG,float newB) { rBack=newR;gBack=newG;bBack=newB;}; void getBackgroundColour(float &newR,float &newG,float &newB) const { newR=rBack;newG=gBack;newB=bBack;}; //!Computes the bounding box for the scene. //this is locked to a minimum of 0.1 unit box around the origin. //this avoids nasty camera situations, where lookat cameras are sitting //on their targets, and don't know where to look. void computeSceneLimits(); //!Set whether to use effects or not void setEffects(bool enable) {useEffects=enable;} //!Set the effect vector /*! Pointers will become "owned" by scene * and will be deleted during destruction, clear, or next setEffectVec call * input vector will be cleared. */ void setEffectVec(std::vector &e); //!Add an effect unsigned int addEffect(Effect *e); //!Remove a given effect void removeEffect(unsigned int uniqueEffectID); //!Clear effects vector void clearEffects(); static std::string getGlVersion() { return std::string((char *)glGetString(GL_VERSION)); } }; #endif 3Depict-0.0.19/src/gl/select.cpp0000644000175000017500000001606412640746376015662 0ustar pcuserpcuser/* * select.cpp - filter selection binding implementation * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "common/mathfuncs.h" #include "common/assertion.h" #include "gl/drawables.h" #include "select.h" using std::vector; SelectionDevice::SelectionDevice(const Filter *p) : target(p) { } void SelectionDevice::addBinding(SelectionBinding b) { bindingVec.push_back(b); } bool SelectionDevice::getBinding(const DrawableObj *d,unsigned int mouseFlags, unsigned int keyFlags,SelectionBinding* &b) { unsigned int keyMask=0; bool found=false; for(unsigned int ui=0;uigetKeyFlags(); continue; } //OK, we already have one, but we can be "trumped" //by a more complex keymask. if( (keyMask & bindingVec[ui].getKeyFlags() )== keyMask) { b=&(bindingVec[ui]); keyMask=b->getKeyFlags(); } } } //This selection device does not match //the targeted object. return found; } void SelectionDevice::getModifiedBindings(vector > &bindings) { ASSERT(target); for(unsigned int ui=0;ui &b) const { ASSERT(b.empty()); for(unsigned int ui=0;ui::max(); fMax=std::numeric_limits::max(); dataType=BIND_TYPE_FLOAT; } void SelectionBinding::setBinding(unsigned int button, unsigned int modifierFlags, unsigned int actionId, unsigned int bindID, const Point3D &initValue, DrawableObj *d) { bindingId=bindID; drawActionId=actionId; obj=d; bindKeys=modifierFlags; bindButtons=button; cachedValPoint3D = initValue; dataType=BIND_TYPE_POINT3D; } void SelectionBinding::setInteractionMode(unsigned int newBindMode) { //Rotation cannot have associated key flags. These are reserved //for changing the orientation of the rotation bindMode=newBindMode; } void SelectionBinding::setFloatLimits(float newMin,float newMax) { fMin=newMin; fMax=newMax; } void SelectionBinding::applyTransform(const Point3D &worldVec, bool permanent) { vector scalars; vector vecs; float fTmp; switch(bindMode) { case BIND_MODE_FLOAT_SCALE: { //Compute the new scalar as the magnitude of the difference vector fTmp = sqrtf(worldVec.sqrMag()); fTmp = std::max(fMin,fTmp); fTmp = std::min(fMax,fTmp); scalars.push_back(fTmp); break; } case BIND_MODE_FLOAT_TRANSLATE: { //Compute the new scalar as an offset by the mag of the scalar fTmp =0.5*cachedValFloat+sqrtf(worldVec.sqrMag()); fTmp = std::max(fMin,fTmp); fTmp = std::min(fMax,fTmp); scalars.push_back(fTmp); cachedValFloat=fTmp; break; } case BIND_MODE_POINT3D_TRANSLATE: case BIND_MODE_POINT3D_SCALE: { vecs.push_back(cachedValPoint3D+worldVec); //Only apply if this is a permanent change, //otherwise we will get an integrating effect if(permanent) cachedValPoint3D+=worldVec; break; } case BIND_MODE_POINT3D_ROTATE: { if(worldVec.sqrMag() > sqrtf(std::numeric_limits::epsilon())) { vecs.push_back(worldVec); cachedValPoint3D = worldVec; } break; } case BIND_MODE_POINT3D_ROTATE_LOCK: { if(worldVec.sqrMag() > sqrtf(std::numeric_limits::epsilon())) { //Renormalise the vector back to the same scale as the cached value vecs.push_back(worldVec*sqrtf(cachedValPoint3D.sqrMag()/worldVec.sqrMag())); if(permanent) cachedValPoint3D=vecs.back(); } break; } default: ASSERT(false); } if(vecs.size() || scalars.size()) { //Force a recomputation of the internal parameters //for the drawable object. Whatever they are. obj->recomputeParams(vecs,scalars,drawActionId); valModified=true; } } void SelectionBinding::computeWorldVectorCoeffs(unsigned int buttonFlags, unsigned int modifierFlags,Point3D &xCoeffs,Point3D &yCoeffs) const { switch(bindMode) { case BIND_MODE_FLOAT_TRANSLATE: case BIND_MODE_FLOAT_SCALE: //It is of no concern. we are going to pass this to sqrmag //anyway during applyTransform. xCoeffs=Point3D(1,0,0); yCoeffs=Point3D(0,1,0); break; case BIND_MODE_POINT3D_TRANSLATE: case BIND_MODE_POINT3D_SCALE: case BIND_MODE_POINT3D_ROTATE: case BIND_MODE_POINT3D_ROTATE_LOCK: { if(modifierFlags == FLAG_CMD && bindKeys!=FLAG_CMD) { //Mouse movement in x sends you forwards //y movement sends you up down (wrt camera) xCoeffs=Point3D(0,0,1); yCoeffs=Point3D(0,1,0); } else if(modifierFlags == FLAG_SHIFT && bindKeys != FLAG_SHIFT) { //Mouse movement in x sends you across //y movement sends you forwards (wrt camera) xCoeffs=Point3D(1,0,0); yCoeffs=Point3D(0,0,1); } else { //For example: FLAG_NONE //IN plane with camera. xCoeffs=Point3D(1,0,0); yCoeffs=Point3D(0,1,0); } break; } default: ASSERT(false); } } void SelectionBinding::getValue(float &f) const { f=cachedValFloat; } void SelectionBinding::getValue(Point3D &f) const { f=cachedValPoint3D; } bool SelectionBinding::matchesDrawable(const DrawableObj *d, unsigned int mouseFlags, unsigned int keyFlags) const { //Object and mouseflags must match. keyflags must be nonzero after masking with bindKeys if(bindKeys) return (obj == d && mouseFlags == bindButtons && (keyFlags &bindKeys) == bindKeys); else return (obj == d && mouseFlags == bindButtons); }; bool SelectionBinding::matchesDrawable(const DrawableObj *d) const { return (obj == d); } 3Depict-0.0.19/src/gl/isoSurface.cpp0000644000175000017500000010024312716174467016477 0ustar pcuserpcuser/* * IsoSurface.cpp - Isosurface interface generation * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "isoSurface.h" #include "common/assertion.h" #include "common/voxels.h" #include #include #include using std::list; using std::map; using std::vector; using std::pair; using std::make_pair; #ifdef DEBUG template bool mapUnique(const std::map &m) { vector vec; vec.reserve(m.size()); for(typename std::map::const_iterator it = m.begin(); it!=m.end(); ++it) { if(std::find(vec.begin(),vec.end(),it->second) != vec.end()) return false; vec.push_back(it->second); } return true; } #endif //input vector "vec" must be sorted and unique template void removeElements( const std::vector &elems,std::vector &vec) { if(vec.empty() || elems.empty()) return; if(vec.size() == elems.size()) { vec.clear(); return; } size_t offset=vec.size()-1; //Run backwards, swapping out for(size_t ui=elems.size();ui--;) { ASSERT(ui <= offset); std::swap(vec[elems[ui]],vec[offset]); offset--; } vec.resize(offset+1); } void TriangleWithVertexNorm::computeACWNormal(Point3D &n) const { Point3D a,b; a = p[0]-p[1]; b = p[0]-p[2]; n=a.crossProd(b); n.normalise(); } void TriangleWithVertexNorm::safeComputeACWNormal(Point3D &n) const { Point3D a,b; a = p[0]-p[1]; b = p[0]-p[2]; n=a.crossProd(b); if(n.sqrMag() < sqrt(std::numeric_limits::epsilon()) ) n=Point3D(0,0,1); else n.normalise(); } float TriangleWithVertexNorm::computeArea() const { Point3D a,b; a = p[0]-p[1]; b = p[0]-p[2]; return a.crossProd(b).sqrMag(); } bool TriangleWithVertexNorm::isDegenerate() const { return (p[0].sqrDist(p[1]) < std::numeric_limits::epsilon() || p[0].sqrDist(p[2]) < std::numeric_limits::epsilon() || p[2].sqrDist(p[1]) < std::numeric_limits::epsilon()); } void TriangleWithVertexNorm::getCentroid(Point3D &c) const { c=p[0]; c+=p[1]; c+=p[2]; c*=1.0f/3.0f; } //This code is a modified version of the following: //============== // Marching Cubes Example Program // by Cory Bloyd (corysama@yahoo.com) // // A simple, portable and complete implementation of the Marching Cubes // and Marching Tetrahedrons algorithms in a single source file. // There are many ways that this code could be made faster, but the // intent is for the code to be easy to understand. // // For a description of the algorithm go to // http://astronomy.swin.edu.au/pbourke/modelling/polygonise/ // // The original code is public domain, and is used here under the GNU General Public Licence, V3 or later. // ========= // For any edge, if one vertex is inside of the surface and the other is outside of the surface // then the edge intersects the surface // For each of the 8 vertices of the cube can be two possible states : either inside or outside of the surface // For any cube the are 2^8=256 possible sets of vertex states // This table lists the edges intersected by the surface for all 256 possible vertex states // There are 12 edges. For each entry in the table, if edge #n is intersected, then bit #n is set to 1 int aiCubeEdgeFlags[256]= { 0x000, 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00, 0x190, 0x099, 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90, 0x230, 0x339, 0x033, 0x13a, 0x636, 0x73f, 0x435, 0x53c, 0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30, 0x3a0, 0x2a9, 0x1a3, 0x0aa, 0x7a6, 0x6af, 0x5a5, 0x4ac, 0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0, 0x460, 0x569, 0x663, 0x76a, 0x066, 0x16f, 0x265, 0x36c, 0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60, 0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0x0ff, 0x3f5, 0x2fc, 0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0, 0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x055, 0x15c, 0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950, 0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0x0cc, 0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0, 0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc, 0x0cc, 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0, 0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c, 0x15c, 0x055, 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650, 0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc, 0x2fc, 0x3f5, 0x0ff, 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0, 0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c, 0x36c, 0x265, 0x16f, 0x066, 0x76a, 0x663, 0x569, 0x460, 0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac, 0x4ac, 0x5a5, 0x6af, 0x7a6, 0x0aa, 0x1a3, 0x2a9, 0x3a0, 0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c, 0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x033, 0x339, 0x230, 0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c, 0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x099, 0x190, 0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c, 0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x000 }; // For each of the possible vertex states listed in aiCubeEdgeFlags there is a specific triangulation // of the edge intersection points. a2iTriangleConnectionTable lists all of them in the form of // 0-5 edge triples with the list terminated by the invalid value -1. // For example: a2iTriangleConnectionTable[3] list the 2 triangles formed when corner[0] // and corner[1] are inside of the surface, but the rest of the cube is not. // // I found this table in an example program someone wrote long ago. It was probably generated by hand int a2iTriangleConnectionTable[256][16] = { {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1}, {3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1}, {3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1}, {3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1}, {9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1}, {9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, {2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1}, {8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1}, {9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, {4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1}, {3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1}, {1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1}, {4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1}, {4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, {5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1}, {2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1}, {9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1}, {0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1}, {2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1}, {10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1}, {5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1}, {5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1}, {9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1}, {0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1}, {1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1}, {10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1}, {8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1}, {2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1}, {7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1}, {2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1}, {11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1}, {5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1}, {11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1}, {11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, {1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1}, {9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1}, {5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1}, {2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1}, {5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1}, {6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1}, {3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1}, {6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1}, {5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1}, {1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1}, {10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1}, {6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1}, {8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1}, {7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1}, {3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1}, {5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1}, {0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1}, {9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1}, {8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1}, {5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1}, {0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1}, {6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1}, {10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1}, {10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1}, {8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1}, {1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1}, {0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1}, {10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1}, {3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1}, {6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1}, {9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1}, {8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1}, {3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1}, {6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1}, {0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1}, {10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1}, {10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1}, {2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1}, {7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1}, {7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1}, {2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1}, {1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1}, {11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1}, {8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1}, {0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1}, {7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, {10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, {2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1}, {6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1}, {7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1}, {2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1}, {1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1}, {10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1}, {10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1}, {0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1}, {7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1}, {6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1}, {8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1}, {9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1}, {6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1}, {4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1}, {10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1}, {8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1}, {0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1}, {1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1}, {8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1}, {10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1}, {4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1}, {10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1}, {5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, {11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1}, {9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1}, {6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1}, {7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1}, {3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1}, {7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1}, {9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1}, {3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1}, {6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1}, {9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1}, {1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1}, {4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1}, {7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1}, {6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1}, {3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1}, {0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1}, {6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1}, {0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1}, {11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1}, {6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1}, {5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1}, {9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1}, {1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1}, {1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1}, {10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1}, {0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1}, {5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1}, {10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1}, {11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1}, {9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1}, {7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1}, {2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1}, {8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1}, {9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1}, {9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1}, {1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1}, {9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1}, {9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1}, {5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1}, {0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1}, {10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1}, {2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1}, {0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1}, {0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1}, {9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1}, {5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1}, {3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1}, {5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1}, {8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1}, {0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1}, {9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1}, {0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1}, {1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1}, {3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1}, {4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1}, {9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1}, {11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1}, {11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1}, {2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1}, {9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1}, {3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1}, {1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1}, {4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1}, {4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1}, {0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1}, {3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1}, {3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1}, {0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1}, {9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1}, {1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1} }; //a2fVertexOffset lists the positions, relative to vertex0, of each of the 8 vertices of a cube static const float a2fVertexOffset[8][3] = { {0.0, 0.0, 0.0},{1.0, 0.0, 0.0},{1.0, 1.0, 0.0},{0.0, 1.0, 0.0}, {0.0, 0.0, 1.0},{1.0, 0.0, 1.0},{1.0, 1.0, 1.0},{0.0, 1.0, 1.0} }; //The deltas for the vertex offsets. This is the int version of a2fVertexOffset const unsigned int VERTEX_OFFSET[8][3] = { {0, 0, 0},{1, 0, 0},{1, 1, 0},{0, 1, 0}, {0, 0, 1},{1, 0, 1},{1, 1, 1},{0, 1, 1} }; //a2iEdgeConnection lists the index of the endpoint vertices for each of the 12 edges of the cube static const int a2iEdgeConnection[12][2] = { {0,1}, {1,2}, {2,3}, {3,0}, {4,5}, {5,6}, {6,7}, {7,4}, {0,4}, {1,5}, {2,6}, {3,7} }; //a2fEdgeDirection lists the direction vector (vertex1-vertex0) for each edge in the cube static const float a2fEdgeDirection[12][3] = { {1.0, 0.0, 0.0},{0.0, 1.0, 0.0},{-1.0, 0.0, 0.0},{0.0, -1.0, 0.0}, {1.0, 0.0, 0.0},{0.0, 1.0, 0.0},{-1.0, 0.0, 0.0},{0.0, -1.0, 0.0}, {0.0, 0.0, 1.0},{0.0, 0.0, 1.0},{ 0.0, 0.0, 1.0},{0.0, 0.0, 1.0} }; //Mapping between edges as defined in a2iEdgeConenction, (and thus implicitly in edge table) //and the voxels.h definition int edgeRemap[12] ={ 0,6,1,4, 2,7,3,5, 8,10,11,9}; //vMarchingCubes iterates over the entire dataset, calling vMarchCube on each cube void marchingCubes(const Voxels &v,float isoValue, vector &tVec) { size_t nx,ny,nz; v.getSize(nx,ny,nz); ASSERT(nx > 1 && ny>1 && nz>1); //Don't try to isosurface a any volume with a unitary dimension. if(nx ==1 || ny ==1 || nz == 1) return; Point3D gridSpacing; gridSpacing=v.getPitch(); #ifdef DEBUG BoundCube boundC; boundC.setBounds(v.getMinBounds(),v.getMaxBounds()); #endif vector indexedTriVec; //Loop over the vertexs, with the mesh such that the //nominally cube centres are now on a grid that is dual //to the original grid (excluding the external boundary of course) #pragma omp parallel for for(size_t iX = 0; iX < nx-1; iX++) { int iEdgeFlags,iFlagIndex; for(size_t iY = 0; iY < ny-1; iY++) { for(size_t iZ = 0; iZ < nz-1; iZ++) { iEdgeFlags=iFlagIndex=0; Point3D position; //Lower left corner of cell for dual grid position=v.getPoint(iX,iY,iZ) + gridSpacing*0.5; //Find which vertices are inside of the surface and which are outside for(int iVertexTest = 0; iVertexTest < 8; iVertexTest++) { float f; f=v.getData(iX+VERTEX_OFFSET[iVertexTest][0], iY+VERTEX_OFFSET[iVertexTest][1], iZ+VERTEX_OFFSET[iVertexTest][2]); //Compute position in triangle and edge connection //tables if(f <= isoValue) iFlagIndex |= 1< > edgeTriMap; #pragma omp parallel for for(size_t ui=0;ui >::iterator it; it = edgeTriMap.find(indexedTriVec[ui].p[uj]); if(it == edgeTriMap.end()) { list seedList; seedList.push_back(ui); #pragma omp critical edgeTriMap.insert( make_pair(indexedTriVec[ui].p[uj],seedList)); } else { it->second.push_back(ui); } } } //Generate the position points for each edge map pointMap; for(map >::iterator it=edgeTriMap.begin(); it!=edgeTriMap.end(); ++it) { Point3D low,high,voxelFrameIntersection; float lowF,highF; if(pointMap.find((it->first)) != pointMap.end()) continue; //Low/high sides of edge's scalar values v.getEdgeEndApproxVals(it->first,lowF,highF); //Get the edge's low and high end node positions v.getEdgeEnds(it->first,low,high); //OK, now we have that, lets use the values to "lever" the //solution point note node locations for isosurface if(fabs(highF-lowF) < sqrt(std::numeric_limits::epsilon())) { //Prevent divide by zero voxelFrameIntersection=(low+high)*0.5; } else { //interpolate float alpha; alpha= (isoValue- lowF) / (highF- lowF); voxelFrameIntersection=low + (high-low)*alpha; } pointMap.insert(make_pair(it->first,voxelFrameIntersection)); } tVec.resize(indexedTriVec.size()); vector popTris; //Set all triangle vertices #pragma omp parallel for for(size_t ui=0;ui origNormal; origNormal.resize(indexedTriVec.size()); #pragma omp parallel for for(size_t ui=0;ui::iterator it=pointMap.begin(); it!=pointMap.end();++it) it->second=Point3D(0,0,0); //Construct the shared normals float smallNum=sqrt(std::numeric_limits::epsilon()); for(size_t ui=0;ui smallNum) { for(int uj=0;uj<3;uj++) pointMap.at((indexedTriVec[ui].p[uj]))+=origNormal[ui]*weight; } } //re-normalise normals for(map::iterator it=pointMap.begin(); it!=pointMap.end();++it) { if(it->second.sqrMag() > smallNum) it->second.normalise(); else it->second=Point3D(0,0,1); } //assign these normals to the vertices of each triangle #pragma omp parallel for for(size_t ui=0;ui data; data.resize(4,4,4); data.fill(0); data.setData(1,1,1,1.0); vector tVec; marchingCubes(data,0.5,tVec); TEST(!tVec.empty(),"isosurface exists"); //Should be 2 rect. pyramids back to back, with no bases TEST(tVec.size() == 8, "isosurf. triangle count"); //Ensure that all the points are contained within the original data bounding box Point3D pMin,pMax; data.getBounds(pMin,pMax); BoundCube b; b.setBounds(pMin,pMax); for(size_t ui=0;ui. */ #ifndef ISOSURFACE_H #define ISOSURFACE_H #include "common/voxels.h" class TriangleWithVertexNorm { public: Point3D p[3]; Point3D normal[3]; void getCentroid(Point3D &p) const; void computeACWNormal(Point3D &p) const; void safeComputeACWNormal(Point3D &p) const; float computeArea() const; bool isDegenerate() const; }; struct TriangleWithIndexedVertices { size_t p[3]; }; //Perform marching cube algorithm void marchingCubes(const Voxels &v,float isoValue, std::vector &tVec); #ifdef DEBUG bool testIsoSurface(); #endif #endif 3Depict-0.0.19/src/gl/textures.cpp0000644000175000017500000001704212640746376016263 0ustar pcuserpcuser/* * textures.cpp - texture wrapper class implementation * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #if defined(WIN32) || defined(WIN64) #include #endif #include "textures.h" #include "wx/wxcommon.h" #include "common/pngread.h" #include #include using std::vector; using std::string; const char *TEXTURE_OVERLAY_PNG[] = { "textures/Left_clicked_mouse.png", "textures/Left-Right-arrow.png", "textures/Right_clicked_mouse.png", "textures/rotateArrow.png", "textures/middle_clicked_mouse.png", "textures/scroll_wheel_mouse.png", "textures/enlarge.png", "textures/keyboard-ctrl.png", "textures/keyboard-command.png", "textures/keyboard-alt.png", "textures/keyboard-tab.png", "textures/keyboard-shift.png", }; TexturePool::~TexturePool() { closeAll(); } bool TexturePool::openTexture(const char *texName, unsigned int &texID) { std::string texPath; texPath = locateDataFile(texName); if(texPath.empty()) return false; //See if we already have this texture (use first frame as keyname) for(unsigned int ui=0;ui &fileNames, unsigned int &texId) { ASSERT(fileNames.size()); vector fullNames; fullNames.resize(fileNames.size()); for(size_t ui=0;uiwidth = width; dest->height = height; dest->data = new unsigned char[4*width*height]; for (y=0; ydata[z++] = texture_rows[y][x]; } } free_pngrowpointers(texture_rows,height); //Retrieve the in-use texture, which we will reset later if (type == GL_TEXTURE_1D) glGetIntegerv(GL_TEXTURE_BINDING_1D, &curtex); else glGetIntegerv(GL_TEXTURE_BINDING_2D, &curtex); glGenTextures(1, &(dest->glID)); glBindTexture(type, dest->glID); //Send texture to video card if (type == GL_TEXTURE_1D) { glTexImage1D(type, 0, GL_RGBA, dest->width, 0, GL_RGBA, GL_UNSIGNED_BYTE, dest->data); } else { glTexImage2D(type, 0, GL_RGBA, dest->width, dest->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, dest->data); } //Sett scale-down // and scale-up interpolation to LINEAR glTexParameteri(type, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(type, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //Restore the current opengl texture glBindTexture(type, curtex); return (0); } int pngTexture3D(texture *dest, const vector &fileNames) { if(fileNames.empty()) return 0; dest->depth=fileNames.size(); //Copy data from disk into temporary storage vector *dataArray=new vector[fileNames.size()]; for(size_t ui=0; uiwidth || height !=dest->height) { delete[] dataArray; free_pngrowpointers(texture_rows,height); return 3; } } //Copy data into texture structure dest->width = width; dest->height = height; dataArray[ui].resize(width*height*4); size_t arrayDest; arrayDest=0; for (size_t y=0; ydata = new unsigned char[4*dest->width*dest->height*dest->depth]; for(size_t ui=0;uidepth;ui++) { for(size_t uj=0;ujdata[offset++]=dataArray[ui][uj]; } } delete[] dataArray; glGenTextures(1, &(dest->glID)); glBindTexture(GL_TEXTURE_3D, dest->glID); //Send texture to video card glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, dest->width, dest->height, dest->depth, 0, GL_RGBA, GL_UNSIGNED_BYTE, dest->data); //Sett scale-down // and scale-up interpolation to LINEAR glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); return 0; } int pngTexture2D(texture* dest, const char* filename) { return (pngTexture(dest, filename, GL_TEXTURE_2D)); } int pngTexture1D(texture* dest, const char* filename) { return (pngTexture(dest, filename, GL_TEXTURE_1D)); } 3Depict-0.0.19/src/gl/drawables.cpp0000644000175000017500000016742712716174467016361 0ustar pcuserpcuser/* * drawables.cpp - opengl drawable objects cpp file * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #if defined(WIN32) || defined(WIN64) #include #endif #include "drawables.h" #include "common/colourmap.h" #include "common/voxels.h" #include "glDebug.h" const float DEPTH_SORT_REORDER_EPSILON = 1e-2; //Static class variables //==== const Camera *DrawableObj::curCamera = 0; float DrawableObj::backgroundR; float DrawableObj::backgroundG; float DrawableObj::backgroundB; bool DrawableObj::useAlphaBlend; TexturePool *DrawableObj::texPool=0; unsigned int DrawableObj::winX; unsigned int DrawableObj::winY; //== //Draw a cone pointing in the axisVec direction, positioned at // - (if translateAxis is true, origin+axisVec, otherwise origin) // - void drawCone(const Point3D &axisVec, const Point3D &origin, float radius, float numConeRadiiLen, size_t numSegments,bool translateAxis=false) { Point3D axis; axis =axisVec; if(axis.sqrMag() < sqrtf(std::numeric_limits::epsilon())) axis=Point3D(0,0,1); else axis.normalise(); //Tilt space to align to cone axis Point3D zAxis(0,0,1); float tiltAngle; tiltAngle = zAxis.angle(axis); Point3D rotAxis; rotAxis=zAxis.crossProd(axis); Point3D *ptArray = new Point3D[numSegments]; const float ROT_TOL=sqrtf(std::numeric_limits::epsilon()) ; //Only rotate if the angle is nonzero (note 2PI wraparound is possible from acos) if((tiltAngle > ROT_TOL || fabs(tiltAngle - 2*M_PI) > ROT_TOL) && rotAxis.sqrMag() > ROT_TOL) { //Draw an angled cone Point3f vertex,r; rotAxis.normalise(); r.fx=rotAxis[0]; r.fy=rotAxis[1]; r.fz=rotAxis[2]; //we have to rotate the cone points around the apex point for(unsigned int ui=0; ui ROT_TOL) { //Downwards pointing cone - note "-radius" for(unsigned int ui=0; ui 0.5f) { //"bright" scene, use black text contrastCol=0.0f; } else { //"Dark" background, use white text contrastCol=1.0f; } return contrastCol; } void DrawableObj::explode(std::vector &simpleObjects) { ASSERT(isExplodable()); } void DrawableObj::setTexPool(TexturePool *t) { if(texPool) delete texPool; texPool=t; } void DrawableObj::clearTexPool() { ASSERT(texPool); delete texPool; texPool=0; } Point3D DrawableObj::getCentroid() const { ASSERT(!isExplodable()); } //===== DrawPoint::DrawPoint() : origin(0.0f,0.0f,0.0f), r(1.0f), g(1.0f), b(1.0f), a(1.0f) { } DrawPoint::DrawPoint(float x, float y, float z) : origin(x,y,z), r(1.0f), g(1.0f), b(1.0f) { } DrawPoint::~DrawPoint() { } DrawableObj* DrawPoint::clone() const { DrawPoint *d = new DrawPoint(*this); return d; } void DrawPoint::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawPoint::setOrigin(const Point3D &pt) { origin = pt; } void DrawPoint::draw() const { glColor4f(r,g,b,a); glBegin(GL_POINT); glVertex3fv(origin.getValueArr()); glEnd(); } DrawVector::DrawVector() : origin(0.0f,0.0f,0.0f), vector(0.0f,0.0f,1.0f),drawArrow(true), arrowSize(1.0f),scaleArrow(true),doubleEnded(false), r(1.0f), g(1.0f), b(1.0f), a(1.0f), lineSize(1.0f) { } DrawVector::~DrawVector() { } DrawableObj* DrawVector::clone() const { DrawVector *d = new DrawVector(*this); return d; } void DrawVector::getBoundingBox(BoundCube &b) const { b.setBounds(origin,vector+origin); } void DrawVector::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawVector::setEnds(const Point3D &startNew, const Point3D &endNew) { origin = startNew; vector =endNew-startNew; } void DrawVector::setOrigin(const Point3D &pt) { origin = pt; } void DrawVector::setVector(const Point3D &pt) { vector= pt; } void DrawVector::draw() const { const unsigned int NUM_CONE_SEGMENTS=20; const float numConeRadiiLen = 1.5f; const float radius= arrowSize; glColor3f(r,g,b); //Disable lighting calculations for arrow stem glPushAttrib(GL_LIGHTING_BIT); glDisable(GL_LIGHTING); float oldLineWidth; glGetFloatv(GL_LINE_WIDTH,&oldLineWidth); glLineWidth(lineSize); glBegin(GL_LINES); if(drawArrow) { //Back off the distance a little, because otherwise the line can poke out // the sides of the cone. float backoffFactor = std::max(radius/sqrtf(vector.sqrMag()),0.0f); Point3D tmpVec=vector*(1.0f-backoffFactor) + origin; if(doubleEnded) { Point3D tmpOrigin; tmpOrigin = origin+vector*(backoffFactor); glVertex3fv(tmpOrigin.getValueArr()); glVertex3fv(tmpVec.getValueArr()); } else { glVertex3fv(origin.getValueArr()); glVertex3fv(tmpVec.getValueArr()); } } else { glVertex3fv(origin.getValueArr()); glVertex3f(vector[0]+origin[0],vector[1]+origin[1],vector[2]+origin[2]); } glEnd(); //restore the old line size glLineWidth(oldLineWidth); glPopAttrib(); //If we only wanted the line, then we are done here. if(arrowSize < sqrtf(std::numeric_limits::epsilon()) || !drawArrow) return ; //Now compute & draw the cone tip //---- drawCone(vector, origin, arrowSize, numConeRadiiLen,NUM_CONE_SEGMENTS,true); if(doubleEnded) drawCone(-vector,origin,arrowSize,numConeRadiiLen,NUM_CONE_SEGMENTS); //---- } void DrawVector::recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode) { switch(mode) { case DRAW_VECTOR_BIND_ORIENTATION: ASSERT(vecs.size() ==1 && scalars.size() ==0); vector=vecs[0]; break; case DRAW_VECTOR_BIND_ORIGIN: ASSERT(vecs.size() == 1 && scalars.size()==0); origin=vecs[0]; break; case DRAW_VECTOR_BIND_ORIGIN_ONLY: { ASSERT(vecs.size() == 1 && scalars.size()==0); Point3D dv; dv=vector-origin; origin=vecs[0]; vector=origin+dv; break; } case DRAW_VECTOR_BIND_TARGET: ASSERT(vecs.size() == 1 && scalars.size()==0); vector=vecs[0]-origin; break; default: ASSERT(false); } } DrawTriangle::DrawTriangle() : r(1.0f), g(1.0f),b(1.0f),a(1.0f) { } DrawTriangle::~DrawTriangle() { } DrawableObj* DrawTriangle::clone() const { DrawTriangle *d = new DrawTriangle(*this); return d; } void DrawTriangle::setVertex(unsigned int ui, const Point3D &pt) { ASSERT(ui < 3); vertices[ui] = pt; } void DrawTriangle::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawTriangle::draw() const { glColor4f(r,g,b,a); glBegin(GL_TRIANGLES); for(size_t ui=0;ui<3;ui++) glVertex3fv(vertices[ui].getValueArr()); glEnd(); } DrawableObj* DrawQuad::clone() const { DrawQuad *d = new DrawQuad(*this); return d; } void DrawQuad::getBoundingBox(BoundCube &b) const { b.setBounds(vertices,4); } void DrawQuad::draw() const { ASSERT(false); } void DrawQuad::setVertices(const Point3D *v) { for(size_t ui=0;ui<4;ui++) vertices[ui]=v[ui]; } void DrawQuad::setVertex(unsigned int v, const Point3D &p) { ASSERT(v <4); vertices[v] = p; } void DrawQuad::setColour(float rNew, float gNew, float bNew, float aNew) { ASSERT(rNew >=0 && rNew <=1.0f); ASSERT(gNew >=0 && gNew <=1.0f); ASSERT(bNew >=0 && bNew <=1.0f); ASSERT(aNew >=0 && aNew <=1.0f); for(unsigned int ui=0;ui<4; ui++) { r[ui]=rNew; g[ui]=gNew; b[ui]=bNew; a[ui]=aNew; } } Point3D DrawQuad::getOrigin() const { return Point3D::centroid(vertices,4); } void DrawQuad::recomputeParams(const vector &vecs, const vector &scalars, unsigned int mode) { switch(mode) { case DRAW_QUAD_BIND_ORIGIN: { ASSERT(vecs.size() ==1 && scalars.size() ==0); Point3D curOrig=getOrigin(); Point3D delta = vecs[0]-curOrig; for(size_t ui=0;ui<4;ui++) vertices[ui]+=delta; break; } default: ASSERT(false); } } DrawTexturedQuad::DrawTexturedQuad() :textureData(0), textureId((unsigned int)-1), noColour(false) , needsBinding(true) { } DrawTexturedQuad::DrawTexturedQuad(const DrawTexturedQuad &oth) { ASSERT(false); } DrawTexturedQuad::~DrawTexturedQuad() { //hack to work around static construct/destruct. // normally we use the texture pool do to everything if(texPool && textureId != -1) { texPool->closeTexture(textureId); textureId=-1; } if(textureData) delete[] textureData; } void DrawTexturedQuad::draw() const { if(needsBinding) { rebindTexture(); } ASSERT(glIsTexture(textureId)); glEnable(GL_TEXTURE_2D); glPushAttrib(GL_CULL_FACE); glDisable(GL_CULL_FACE); glBindTexture(GL_TEXTURE_2D,textureId); const float COORD_SEQ_X[]={ 0,0,1,1}; const float COORD_SEQ_Y[]={ 0,1,1,0}; if(!noColour) { glBegin(GL_QUADS); for(size_t ui=0;ui<4;ui++) { glColor4f(r[ui],g[ui],b[ui],a[ui]); glTexCoord2f(COORD_SEQ_X[ui],COORD_SEQ_Y[ui]); glVertex3fv(vertices[ui].getValueArr()); } glEnd(); } else { glBegin(GL_QUADS); for(size_t ui=0;ui<4;ui++) { glColor4f(1.0f,1.0f,1.0f,a[ui]); glTexCoord2f(COORD_SEQ_X[ui],COORD_SEQ_Y[ui]); glVertex3fv(vertices[ui].getValueArr()); } glEnd(); } glPopAttrib(); glDisable(GL_TEXTURE_2D); } //Call sequence // - resize destination for texture // - set texture by pixels // - rebind texture void DrawTexturedQuad::resize(size_t numX, size_t numY, unsigned int nChannels) { //reallocate texture as required if(textureData) { if( numX*numY*nChannels != nX*nY*channels) { delete[] textureData; textureData = new unsigned char[numX*numY*nChannels]; } } else textureData = new unsigned char[numX*numY*nChannels]; nX=numX; nY=numY; channels=nChannels; } void DrawTexturedQuad::rebindTexture(unsigned int mode) const { ASSERT(texPool); ASSERT(textureData); if(textureId == (unsigned int)-1) texPool->genTexID(textureId); ASSERT(!(mode == GL_RGB && channels !=3 )); ASSERT(!(mode == GL_RGBA && channels !=4 )); //Construct the texture glBindTexture(GL_TEXTURE_2D,textureId); glPixelStorei(GL_UNPACK_ALIGNMENT,1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); glTexImage2D(GL_TEXTURE_2D,0,mode,nX,nY, 0,mode,GL_UNSIGNED_BYTE,textureData); needsBinding=false; } void DrawTexturedQuad::setData(size_t x, size_t y, unsigned char *entry) { ASSERT(textureData); ASSERT(x < nX && y < nY); for(size_t ui=0;uir=r; d->g=g; d->b=b; d->a=a; d->origin=origin; d->radius=radius; d->latSegments=latSegments; d->longSegments=longSegments; d->q=gluNewQuadric(); return d; } void DrawSphere::getBoundingBox(BoundCube &b) const { for(unsigned int ui=0;ui<3;ui++) { b.setBound(ui,0,origin[ui] - radius); b.setBound(ui,1,origin[ui] + radius); } } void DrawSphere::setOrigin(const Point3D &p) { origin = p; } void DrawSphere::setLatSegments(unsigned int ui) { latSegments = ui; } void DrawSphere::setLongSegments(unsigned int ui) { longSegments = ui; } void DrawSphere::setRadius(float rad) { radius=rad; } void DrawSphere::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawSphere::draw() const { if(!q) return; glPushMatrix(); glTranslatef(origin[0],origin[1],origin[2]); glColor4f(r,g,b,a); gluSphere(q,radius,latSegments,longSegments); glPopMatrix(); } void DrawSphere::recomputeParams(const vector &vecs, const vector &scalars, unsigned int mode) { switch(mode) { case DRAW_SPHERE_BIND_ORIGIN: ASSERT(vecs.size() ==1 && scalars.size() ==0); origin=vecs[0]; break; case DRAW_SPHERE_BIND_RADIUS: ASSERT(scalars.size() == 1 && vecs.size()==0); radius=scalars[0]; break; default: ASSERT(false); } } //=========== DrawCylinder::DrawCylinder() : radius(1.0f), origin(0.0f,0.0f,0.0f), direction(0.0f,0.0f,1.0f), slices(4),stacks(4) { q= gluNewQuadric(); qCap[0]= gluNewQuadric(); if(qCap[0]) gluQuadricOrientation(qCap[0],GLU_INSIDE); qCap[1]= gluNewQuadric(); if(qCap[1]) gluQuadricOrientation(qCap[1],GLU_OUTSIDE); radiiLocked=false; } bool DrawCylinder::needsDepthSorting() const { return a< 1 && a > std::numeric_limits::epsilon(); } DrawCylinder::~DrawCylinder() { if(q) gluDeleteQuadric(q); if(qCap[0]) gluDeleteQuadric(qCap[0]); if(qCap[1]) gluDeleteQuadric(qCap[1]); } void DrawCylinder::setOrigin(const Point3D& pt) { origin=pt; } void DrawCylinder::setDirection(const Point3D &p) { direction=p; } void DrawCylinder::draw() const { if(!q || !qCap[0] || !qCap[1]) return; //Cross product desired direction with default //direction to produce rotation vector Point3D dir(0.0f,0.0f,1.0f); glPushMatrix(); glTranslatef(origin[0],origin[1],origin[2]); Point3D dirNormal(direction); dirNormal.normalise(); float length=sqrtf(direction.sqrMag()); float angle = dir.angle(dirNormal); if(angle < M_PI - sqrtf(std::numeric_limits::epsilon()) && angle > sqrtf(std::numeric_limits::epsilon())) { //we need to rotate dir = dir.crossProd(dirNormal); glRotatef(angle*180.0f/M_PI,dir[0],dir[1],dir[2]); } //OpenGL defined cylinder starting at 0 and going to length. I want it starting at 0 and going to+-l/2 glTranslatef(0,0,-length/2.0f); glColor4f(r,g,b,a); //Draw the end cap at z=0 if(radiiLocked) { gluDisk(qCap[0],0,radius,slices,1); gluCylinder(q,radius,radius, length,slices,stacks); //Draw the start cap at z=l glTranslatef(0,0,length); gluDisk(qCap[1],0,radius,slices,1); } else { ASSERT(false); } glPopMatrix(); } void DrawCylinder::setSlices(unsigned int i) { slices=i; } void DrawCylinder::setStacks(unsigned int i) { stacks=i; } void DrawCylinder::setRadius(float rad) { radius=rad; } void DrawCylinder::recomputeParams(const vector &vecs, const vector &scalars, unsigned int mode) { switch(mode) { case DRAW_CYLINDER_BIND_ORIGIN: ASSERT(vecs.size() ==1 && scalars.size() ==0); origin=vecs[0]; break; case DRAW_CYLINDER_BIND_DIRECTION: ASSERT(vecs.size() ==1 && scalars.size() ==0); direction=vecs[0]; break; case DRAW_CYLINDER_BIND_RADIUS: ASSERT(scalars.size() == 1 && vecs.size()==0); radius=scalars[0]; break; default: ASSERT(false); } } void DrawCylinder::setLength(float len) { ASSERT(direction.sqrMag()); direction=direction.normalise()*len; } void DrawCylinder::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawCylinder::getBoundingBox(BoundCube &b) const { float tmp; Point3D normAxis(direction); normAxis.normalise(); //Height offset for ending circles. //The joint bounding box of these two is the //overall bounding box Point3D offset; //X component tmp=sin(acos(normAxis.dotProd(Point3D(1,0,0)))); offset[0] = radius*tmp; //Y component tmp=sin(acos(normAxis.dotProd(Point3D(0,1,0)))); offset[1] = radius*tmp; //Z component tmp=sin(acos(normAxis.dotProd(Point3D(0,0,1)))); offset[2] = radius*tmp; vector p; p.resize(4); p[0]= offset+(direction*0.5+origin); p[1]= -offset+(direction*0.5+origin); p[2]= offset+(-direction*0.5+origin); p[3]= -offset+(-direction*0.5+origin); b.setBounds(p); } //====== DrawManyPoints::DrawManyPoints() : r(1.0f),g(1.0f),b(1.0f),a(1.0f), size(1.0f) { wantsLight=false; } DrawManyPoints::~DrawManyPoints() { } DrawableObj* DrawManyPoints::clone() const { DrawManyPoints *d = new DrawManyPoints(*this); return d; } void DrawManyPoints::getBoundingBox(BoundCube &b) const { //Update the cache as needed if(!haveCachedBounds) { haveCachedBounds=true; cachedBounds.setBounds(pts); } b=cachedBounds; return; } void DrawManyPoints::clear() { pts.clear(); } void DrawManyPoints::addPoints(const vector &vp) { pts.resize(pts.size()+vp.size()); std::copy(vp.begin(),vp.end(),pts.begin()); haveCachedBounds=false; } void DrawManyPoints::shuffle() { std::random_shuffle(pts.begin(),pts.end()); } void DrawManyPoints::resize(size_t resizeVal) { pts.resize(resizeVal); haveCachedBounds=false; } void DrawManyPoints::setPoint(size_t offset,const Point3D &p) { ASSERT(!haveCachedBounds); pts[offset]=p; } void DrawManyPoints::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawManyPoints::setSize(float f) { size=f; } void DrawManyPoints::draw() const { //Don't draw transparent objects if(a < std::numeric_limits::epsilon()) return; glPointSize(size); glBegin(GL_POINTS); glColor4f(r,g,b,a); //TODO: Consider Vertex buffer objects. would be faster, but less portable. for(unsigned int ui=0; uigetBoundingBox(b); boundBox.expand(b); d->draw(); } bool DrawDispList::endList() { glEndList(); ASSERT(boundBox.isValid()); listActive=false; return (glGetError() ==0); } void DrawDispList::draw() const { ASSERT(!listActive); //Cannot select display list objects, //as we cannot modify them without a "do-over". ASSERT(!canSelect); ASSERT(glIsList(listNum)); //Execute the list glPushMatrix(); glCallList(listNum); glPopMatrix(); } //======== DrawGLText::DrawGLText(std::string fontFile, unsigned int mode) :font(0),fontString(fontFile), curFontMode(mode), origin(0.0f,0.0f,0.0f), r(0.0),g(0.0),b(0.0),a(1.0), up(0.0f,1.0f,0.0f), textDir(1.0f,0.0f,0.0f), readDir(0.0f,0.0f,1.0f), isOK(true),ensureReadFromNorm(true) { font=0; switch(mode) { case FTGL_BITMAP: font = new FTGLBitmapFont(fontFile.c_str()); break; case FTGL_PIXMAP: font = new FTGLPixmapFont(fontFile.c_str()); break; case FTGL_OUTLINE: font = new FTGLOutlineFont(fontFile.c_str()); break; case FTGL_POLYGON: font = new FTGLPolygonFont(fontFile.c_str()); break; case FTGL_EXTRUDE: font = new FTGLExtrdFont(fontFile.c_str()); break; case FTGL_TEXTURE: font = new FTGLTextureFont(fontFile.c_str()); break; default: //Don't do this. Use valid font numbers ASSERT(false); font=0; } //In case of allocation failure or invalid font num if(!font || font->Error()) { isOK=false; return; } //Try to make it 100 point font->FaceSize(5); font->Depth(20); //Use unicode font->CharMap(ft_encoding_unicode); alignMode = DRAWTEXT_ALIGN_LEFT; } DrawGLText::DrawGLText(const DrawGLText &oth) : font(0), fontString(oth.fontString), curFontMode(oth.curFontMode), origin(oth.origin), r(oth.r), g(oth.g), b(oth.b), a(oth.a), up(oth.up), textDir(oth.textDir), readDir(oth.readDir),isOK(oth.isOK), ensureReadFromNorm(oth.ensureReadFromNorm) { font=0; switch(curFontMode) { case FTGL_BITMAP: font = new FTGLBitmapFont(fontString.c_str()); break; case FTGL_PIXMAP: font = new FTGLPixmapFont(fontString.c_str()); break; case FTGL_OUTLINE: font = new FTGLOutlineFont(fontString.c_str()); break; case FTGL_POLYGON: font = new FTGLPolygonFont(fontString.c_str()); break; case FTGL_EXTRUDE: font = new FTGLExtrdFont(fontString.c_str()); break; case FTGL_TEXTURE: font = new FTGLTextureFont(fontString.c_str()); break; default: //Don't do this. Use valid font numbers ASSERT(false); font=0; } //In case of allocation failure or invalid font num if(!font || font->Error()) { isOK=false; return; } //Try to make it 100 point font->FaceSize(5); font->Depth(20); //Use unicode font->CharMap(ft_encoding_unicode); } void DrawGLText::draw() const { if(!isOK) return; //Translate the drawing position to the origin Point3D offsetVec=textDir; float advance, halfHeight; { FTBBox box; box=font->BBox(strText.c_str()); advance=box.Upper().X()-box.Lower().X(); halfHeight=box.Upper().Y()-box.Lower().Y(); halfHeight/=2.0f; } switch(alignMode) { case DRAWTEXT_ALIGN_LEFT: break; case DRAWTEXT_ALIGN_CENTRE: offsetVec=offsetVec*advance/2.0f; break; case DRAWTEXT_ALIGN_RIGHT: offsetVec=offsetVec*advance; break; default: ASSERT(false); } glPushMatrix(); glPushAttrib(GL_CULL_FACE); glDisable(GL_CULL_FACE); if(curFontMode !=FTGL_BITMAP) { offsetVec=origin-offsetVec; glTranslatef(offsetVec[0],offsetVec[1],offsetVec[2]); //Rotate such that the new X-Y plane is set to the //desired text orientation. (ie. we want to draw the text in the //specified combination of updir-textdir, rather than in the X-y plane) //--- //Textdir and updir MUST be normal to one another ASSERT(textDir.dotProd(up) < sqrtf(std::numeric_limits::epsilon())); //rotate around textdir cross X, if the two are not the same Point3D newUp=up; float angle=textDir.angle(Point3D(1,0,0) ); if(angle > sqrtf(std::numeric_limits::epsilon())) { Point3D rotateAxis; rotateAxis = textDir.crossProd(Point3D(-1,0,0)); rotateAxis.normalise(); Point3f tmp,axis; tmp.fx=up[0]; tmp.fy=up[1]; tmp.fz=up[2]; axis.fx=rotateAxis[0]; axis.fy=rotateAxis[1]; axis.fz=rotateAxis[2]; glRotatef(angle*180.0f/M_PI,rotateAxis[0],rotateAxis[1],rotateAxis[2]); quat_rot(&tmp,&axis,angle); //angle is in radiians newUp[0]=tmp.fx; newUp[1]=tmp.fy; newUp[2]=tmp.fz; } //rotate new up direction into y around x axis angle = newUp.angle(Point3D(0,1,0)); if(angle > sqrtf(std::numeric_limits::epsilon()) && fabs(angle - M_PI) > sqrtf(std::numeric_limits::epsilon())) { Point3D rotateAxis; rotateAxis = newUp.crossProd(Point3D(0,-1,0)); rotateAxis.normalise(); glRotatef(angle*180.0f/M_PI,rotateAxis[0],rotateAxis[1],rotateAxis[2]); } //Ensure that the text is not back-culled (i.e. if the //text normal is pointing away from the camera, it does not //get drawn). Here we have to flip the normal, by spinning the //text by 180 around its up direction (which has been modified //by above code to coincide with the y axis. if(curCamera) { //This is not *quite* right in perspective mode //but is right in orthogonal Point3D textNormal,camVec; textNormal = up.crossProd(textDir); textNormal.normalise(); camVec = origin - curCamera->getOrigin(); //ensure the camera is not sitting on top of the text. if(camVec.sqrMag() > std::numeric_limits::epsilon()) { camVec.normalise(); if(camVec.dotProd(textNormal) < 0) { //move halfway along text, noting that //the text direction is now the x-axis glTranslatef(advance/2.0f,halfHeight,0); //spin text around its up direction 180 degrees glRotatef(180,0,1,0); //restore back to original position glTranslatef(-advance/2.0f,-halfHeight,0); } camVec=curCamera->getUpDirection(); if(camVec.dotProd(up) < 0) { //move halfway along text, noting that //the text direction is now the x-axis glTranslatef(advance/2.0f,halfHeight,0); //spin text around its front direction 180 degrees //no need to translate as text sits at its baseline glRotatef(180,0,0,1); //move halfway along text, noting that //the text direction is now the x-axis glTranslatef(-advance/2.0f,-halfHeight,0); } } } } else { //FIXME: The text ends up in a weird location //2D coordinate storage for bitmap text double xWin,yWin,zWin; //Compute the 2D coordinates double model_view[16]; glGetDoublev(GL_MODELVIEW_MATRIX, model_view); double projection[16]; glGetDoublev(GL_PROJECTION_MATRIX, projection); int viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); //Apply the openGL coordinate transformation pipeline to the //specified coords gluProject(offsetVec[0],offsetVec[1],offsetVec[2] ,model_view,projection,viewport, &xWin,&yWin,&zWin); glRasterPos3f(xWin,yWin,zWin); } //--- glColor4f(r,g,b,a); //Draw text if(curFontMode == FTGL_TEXTURE) { glPushAttrib(GL_ENABLE_BIT); glEnable(GL_TEXTURE_2D); font->Render(strText.c_str()); glPopAttrib(); } else font->Render(strText.c_str()); glPopAttrib(); glPopMatrix(); } DrawGLText::~DrawGLText() { if(font) delete font; } void DrawGLText::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawGLText::getBoundingBox(BoundCube &b) const { //Box forwards transformations // * Translation by [origin-textDir* (maxx - minx)] // * Rotate by textDir.angle([1 0 0 ]), around [ textdir x [ -1 0 0 ] ] // * Rotate by newUp.angle([0,1,0]), around [ newUp x [ 0 -1 0 ] ] if(isOK) { //Obtain the vertices around the untransformed text float minX,minY,minZ; float maxX,maxY,maxZ; font->BBox(strText.c_str(),minX,minY,minZ,maxX,maxY,maxZ); float dy=maxY-minY; b.setBounds(minX,minY,minZ, maxX,maxY,maxZ); vector p; b.getVertices(p,true); for(size_t ui=0;ui::epsilon()); Point3D r1Axis,r2Axis; bool degenR1,degenR2; r1Axis=Point3D(1,0,0); //Compute R1 axis, but do not apply //-- float r1Angle=r1Axis.angle(textDir); degenR1=( r1Angle < TOL_EPS || fabs(r1Angle-M_PI) < TOL_EPS ) ; Point3D newUp=up; if(!degenR1) { r1Axis=textDir.crossProd(r1Axis); r1Axis.normalise(); quat_rot(newUp,r1Axis,r1Angle); } //-- //Compute R2 axis //-- r2Axis=Point3D(0,-1,0); //In degenerate case, we don't do anything // otherwise we compute R2 //rotate new up direction into y around x axis float angle = newUp.angle(Point3D(0,1,0)); if(!degenR1 && (angle > sqrtf(std::numeric_limits::epsilon()) && fabs(angle - M_PI) > sqrtf(std::numeric_limits::epsilon())) ) { r2Axis= newUp.crossProd(Point3D(0,-1,0)); r2Axis.normalise(); } else r2Axis=up; //-- //Compute R2'(P) //-- float r2Angle=angle; degenR2 = r2Angle < TOL_EPS; if(!degenR2) { Point3f rotAx; rotAx.fx = r2Axis[0]; rotAx.fy = r2Axis[1]; rotAx.fz=r2Axis[2]; quat_rot_array(&p[0], p.size(), &rotAx,r2Angle); } //-- //Compute R1'(p) if(!degenR1) { Point3f rotAx; rotAx.fx = r1Axis[0]; rotAx.fy = r1Axis[1]; rotAx.fz=r1Axis[2]; quat_rot_array(&p[0], p.size(), &rotAx,-r1Angle); } for(size_t ui=0;ui &vecs, const vector &scalars, unsigned int mode) { switch(mode) { case DRAW_TEXT_BIND_ORIGIN: ASSERT(vecs.size() ==1 && scalars.size() ==0); origin=vecs[0]; break; default: ASSERT(false); } } DrawRectPrism::DrawRectPrism() : drawMode(DRAW_WIREFRAME), r(1.0f), g(1.0f), b(1.0f), a(1.0f), lineWidth(1.0f) { } DrawRectPrism::~DrawRectPrism() { } DrawableObj *DrawRectPrism::clone() const { DrawRectPrism *dR= new DrawRectPrism(*this); return dR; } void DrawRectPrism::getBoundingBox(BoundCube &b) const { b.setBounds(pMin[0],pMin[1],pMin[2], pMax[0],pMax[1],pMax[2]); } void DrawRectPrism::draw() const { ASSERT(r <=1.0f && g<=1.0f && b <=1.0f && a <=1.0f); ASSERT(r >=0.0f && g>=0.0f && b >=0.0f && a >=0.0f); if(!active) return; switch(drawMode) { case DRAW_WIREFRAME: { glLineWidth(lineWidth); drawBox(pMin,pMax,r,g,b,a); break; } case DRAW_FLAT: { glBegin(GL_QUADS); glColor4f(r,g,b,a); glNormal3f(0,0,-1); //Along the bottom glVertex3f(pMin[0],pMin[1],pMin[2]); glVertex3f(pMin[0],pMax[1],pMin[2]); glVertex3f(pMax[0],pMax[1],pMin[2]); glVertex3f(pMax[0],pMin[1],pMin[2]); //Up the side glNormal3f(1,0,0); glVertex3f(pMax[0],pMax[1],pMax[2]); glVertex3f(pMax[0],pMin[1],pMax[2]); glVertex3f(pMax[0],pMin[1],pMin[2]); glVertex3f(pMax[0],pMax[1],pMin[2]); //Over the top glNormal3f(0,0,1); glVertex3f(pMax[0],pMin[1],pMax[2]); glVertex3f(pMax[0],pMax[1],pMax[2]); glVertex3f(pMin[0],pMax[1],pMax[2]); glVertex3f(pMin[0],pMin[1],pMax[2]); //and back down glNormal3f(-1,0,0); glVertex3f(pMin[0],pMax[1],pMin[2]); glVertex3f(pMin[0],pMin[1],pMin[2]); glVertex3f(pMin[0],pMin[1],pMax[2]); glVertex3f(pMin[0],pMax[1],pMax[2]); //Now the other two sides glNormal3f(0,-1,0); glVertex3f(pMax[0],pMin[1],pMax[2]); glVertex3f(pMin[0],pMin[1],pMax[2]); glVertex3f(pMin[0],pMin[1],pMin[2]); glVertex3f(pMax[0],pMin[1],pMin[2]); glNormal3f(0,1,0); glVertex3f(pMax[0],pMax[1],pMax[2]); glVertex3f(pMax[0],pMax[1],pMin[2]); glVertex3f(pMin[0],pMax[1],pMin[2]); glVertex3f(pMin[0],pMax[1],pMax[2]); glEnd(); break; } default: ASSERT(false); } } void DrawRectPrism::setAxisAligned( const Point3D &p1, const Point3D &p2) { for(unsigned int ui=0; ui<3; ui++) { pMin[ui]=std::min(p1[ui],p2[ui]); pMax[ui]=std::max(p1[ui],p2[ui]); } } void DrawRectPrism::setAxisAligned( const BoundCube &b) { b.getBounds(pMin,pMax); } void DrawRectPrism::setColour(float rnew, float gnew, float bnew, float anew) { r=rnew; g=gnew; b=bnew; a=anew; } void DrawRectPrism::setLineWidth(float newLineWidth) { ASSERT(newLineWidth > 0.0f); lineWidth=newLineWidth; } void DrawRectPrism::recomputeParams(const vector &vecs, const vector &scalars, unsigned int mode) { switch(mode) { case DRAW_RECT_BIND_TRANSLATE: { ASSERT(vecs.size() ==1); Point3D delta; delta = (pMax - pMin)*0.5; //Object has been translated pMin = vecs[0]-delta; pMax = vecs[0]+delta; break; } case DRAW_RECT_BIND_CORNER_MOVE: { ASSERT(vecs.size() ==1); //Delta has changed, but origin should stay the same Point3D mean, corner; mean = (pMin + pMax)*0.5; //Prevent negative offset values, otherwise we can //get inside out boxes corner=vecs[0]; for(unsigned int ui=0;ui<3;ui++) corner[ui]= fabs(corner[ui]); pMin = mean-corner; pMax = mean+corner; break; } default: ASSERT(false); } } DrawableOverlay::~DrawableOverlay() { } DrawTexturedQuadOverlay::DrawTexturedQuadOverlay() : textureId(-1),textureOK(false) { } DrawTexturedQuadOverlay::~DrawTexturedQuadOverlay() { texPool->closeTexture(textureId); } void DrawTexturedQuadOverlay::draw() const { if(!textureOK) return; ASSERT(height == width); ASSERT(glIsTexture(textureId)); //TODO: Is this redundant? might be already handled // by scene? glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0, winX, winY, 0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,textureId); glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); // Draw overlay quad glColor3f(1.0f,1.0f,1.0f); glBegin(GL_QUADS); glTexCoord2f(0.0f,0.0f); glVertex3f(position[0]-height/2.0,position[1]-height/2.0,0.0); glTexCoord2f(0.0f,1.0f); glVertex3f(position[0]-height/2.0,position[1]+height/2.0,0.0); glTexCoord2f(1.0f,1.0f); glVertex3f(position[0]+height/2.0,position[1]+height/2.0,0.0); glTexCoord2f(1.0f,0.0f); glVertex3f(position[0]+height/2.0,position[1]-height/2.0,0.0); glEnd(); glDisable(GL_TEXTURE_2D); /* draw stuff */ glPopMatrix(); //Pop modelview matrix glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } bool DrawTexturedQuadOverlay::setTexture(const char *textureFile) { ASSERT(texPool); textureOK= texPool->openTexture(textureFile,textureId); return textureOK; } DrawProgressCircleOverlay::DrawProgressCircleOverlay() { stepProgress=0; step=0; maxStep=0; } DrawProgressCircleOverlay::~DrawProgressCircleOverlay() { } void DrawProgressCircleOverlay::reset() { stepProgress=0; maxStep=0; totalFilters=0; curFilter=0; } void DrawProgressCircleOverlay::draw( )const { if(!maxStep) return; ASSERT(curFilter <=totalFilters); //TODO: Is this redundant? might be already handled // by scene? glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0, winX, winY, 0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glDisable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); //size of gap to fit, in degrees const float FILTER_SPACING_ANGLE= 20.0f/(float)totalFilters; //Angular step when drawing wheel const float DEG_STEP= 2; //fraction of radius for inner section const float IN_RADIUS_FRACTION=0.85; //compute circle radius float radiusOut,radiusIn; radiusOut = std::min(height,width)/2.0f; radiusIn= radiusOut*IN_RADIUS_FRACTION; //Allows for gap between each step, and one at start and end float thetaPerFilter = (360.0f - FILTER_SPACING_ANGLE*(totalFilters))/totalFilters; //Draw the complete filters float curTheta=FILTER_SPACING_ANGLE/2.0f; for(size_t ui=1;ui &texFiles, float replayTime) { repeatInterval=replayTime; textureOK=texPool->openTexture3D(texFiles, textureId); return textureOK; } void DrawAnimatedOverlay::getAnimationStat(float &alpha , float &animDeltaTime) const { timeval t; gettimeofday(&t,NULL); animDeltaTime=(float)(t.tv_sec - animStartTime.tv_sec) + (t.tv_usec-animStartTime.tv_usec)/1.0e6; //Skip if we wish to show later if(animDeltaTime < delayBeforeShow) { alpha= 0; return; } animDeltaTime-=delayBeforeShow; if(fadeIn > 0.0f && (fadeIn > animDeltaTime) ) { alpha= (animDeltaTime )/(fadeIn) ; } else alpha= 1.0f; } void DrawAnimatedOverlay::draw() const { if(!textureOK) return; float alphaVal, animDeltaTime; getAnimationStat(alphaVal,animDeltaTime); if(alphaVal== 0.0f) return; float texCoordZ; texCoordZ=fmod(animDeltaTime,repeatInterval); texCoordZ/=repeatInterval; ASSERT(glIsTexture(textureId)); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0, winX, winY, 0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glEnable(GL_TEXTURE_3D); glBindTexture(GL_TEXTURE_3D,textureId); //TODO: Find correct blending mode. Default is good, but may change... // glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); // glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); // Draw overlay quad ASSERT(width == height); // width/height should be the same glColor4f(1.0f,1.0f,1.0f,alphaVal); glBegin(GL_QUADS); glTexCoord3f(0.0f,0.0f,texCoordZ); glVertex3f(position[0]-width/2.0,position[1]-width/2.0,0.0); glTexCoord3f(0.0f,1.0f,texCoordZ); glVertex3f(position[0]-width/2.0,position[1]+width/2.0,0.0); glTexCoord3f(1.0f,1.0f,texCoordZ); glVertex3f(position[0]+width/2.0,position[1]+width/2.0,0.0); glTexCoord3f(1.0f,0.0f,texCoordZ); glVertex3f(position[0]+width/2.0,position[1]-width/2.0,0.0); glEnd(); glDisable(GL_TEXTURE_3D); glPopMatrix(); //Pop modelview matrix glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); } DrawColourBarOverlay::DrawColourBarOverlay() { a=1.0; string f; f=getDefaultFontFile(); font = new FTGLPolygonFont(f.c_str()); }; DrawColourBarOverlay::DrawColourBarOverlay(const DrawColourBarOverlay &oth) { string f; f=getDefaultFontFile(); font = new FTGLPolygonFont(f.c_str()); a=oth.a; rgb=oth.rgb; min=oth.min; max=oth.max; height=oth.height; width=oth.width; position[0]=oth.position[0]; position[1]=oth.position[1]; }; void DrawColourBarOverlay::draw() const { //Draw quads float elemHeight; //80% of bar width is for the actual colour bar itself. float barWidth=0.8*width; elemHeight=height/(float)rgb.size(); glBegin(GL_QUADS); for(unsigned int ui=0;uiError()) { #ifdef DEBUG std::cerr << "Ah bugger. No font!" << std::endl; #endif return; } //FTGL units are a pain; The devs could not decide //whether to implement them in opengl coords or real coords //so they did neither, and implemented them in "points". //here we assume that we can transform 1 ftgl unit //to 1 opengl unit by inversion const float FTGL_DEFAULT_UNIT_SCALE=1.0/72.0; font->FaceSize(3); glDisable(GL_CULL_FACE); glPushMatrix(); glTranslatef(position[0]+width,position[1],0); string s; stream_cast(s,max); //Note negative sign to flip from y-down screen (opengl) to text dir //(y up) glScaled(FTGL_DEFAULT_UNIT_SCALE, -FTGL_DEFAULT_UNIT_SCALE,FTGL_DEFAULT_UNIT_SCALE); font->Render(s.c_str()); glPopMatrix(); glPushMatrix(); glTranslatef(position[0]+width,position[1]+height,0); stream_cast(s,min); //Note negative sign to flip from y-down screen (opengl) to text dir //(y up) glScaled(FTGL_DEFAULT_UNIT_SCALE, -FTGL_DEFAULT_UNIT_SCALE,FTGL_DEFAULT_UNIT_SCALE); font->Render(s.c_str()); glPopMatrix(); glEnable(GL_CULL_FACE); } DrawableObj *DrawColourBarOverlay::clone() const { DrawColourBarOverlay *newBar = new DrawColourBarOverlay(*this); return newBar; } void DrawColourBarOverlay::setColourVec(const vector &r, const vector &g, const vector &b) { ASSERT(r.size() == g.size()); ASSERT(g.size() == b.size()); rgb.resize(r.size()); for(unsigned int ui=0;ui0 && winY > 0); float curX = position[0]; float curY = position[1]; float delta = std::max(std::min(1.0f/legendItems.size(),0.02f),0.05f); float size = delta*0.9f; float maxTextWidth=0; if(font) font->FaceSize(1); for(unsigned int ui=0; uiv[0],f->v[1],f->v[2]); dCirc.draw(); //-- //Draw text, if possible if( font && !font->Error()) { float textGrey=getHighContrastValue(); glColor3f(textGrey,textGrey,textGrey); float fminX,fminY,fminZ; float fmaxX,fmaxY,fmaxZ; font->BBox(legendItems[ui].first.c_str(),fminX, fminY,fminZ,fmaxX,fmaxY,fmaxZ); glPushMatrix(); glTranslatef(curX+1.5*size,curY+0.85*size,0.0f); glScalef(size,-size,0); font->Render(legendItems[ui].first.c_str()); glPopMatrix(); maxTextWidth=std::max(fmaxX-fminX,maxTextWidth); } curY+=delta; } curX+=maxTextWidth + size; curY=position[1] + 0.5*delta; } } void DrawPointLegendOverlay::addItem(const std::string &s, float r, float g, float b) { RGBFloat rgb; rgb.v[0]=r; rgb.v[1]= g; rgb.v[2]= b; legendItems.push_back(make_pair(s,rgb)); } DrawField3D::DrawField3D() : ptsCacheOK(false), alphaVal(0.2f), pointSize(1.0f), drawBoundBox(true), boxColourR(1.0f), boxColourG(1.0f), boxColourB(1.0f), boxColourA(1.0f), volumeGrid(false), volumeRenderMode(0), field(0) { } DrawField3D::~DrawField3D() { if(field) delete field; } void DrawField3D::getBoundingBox(BoundCube &b) const { ASSERT(field) b.setBounds(field->getMinBounds(),field->getMaxBounds()); } void DrawField3D::setField(const Voxels *newField) { field=newField; } void DrawField3D::setRenderMode(unsigned int mode) { volumeRenderMode=mode; } void DrawField3D::setColourMinMax() { colourMapBound[0]=field->min(); colourMapBound[1]=field->max(); ASSERT(colourMapBound[0] <=colourMapBound[1]); } void DrawField3D::draw() const { if(alphaVal < sqrtf(std::numeric_limits::epsilon())) return; ASSERT(field); //Depend upon the render mode switch(volumeRenderMode) { case VOLUME_POINTS: { size_t fieldSizeX,fieldSizeY,fieldSizeZ; Point3D p; field->getSize(fieldSizeX,fieldSizeY, fieldSizeZ); Point3D delta; delta = field->getPitch(); delta*=0.5; if(!ptsCacheOK) { ptsCache.clear(); for(unsigned int uiX=0; uiXgetData(uiX,uiY,uiZ); if(v > std::numeric_limits::epsilon()) { RGBThis rgb; //Set colour and point loc colourMapWrap(colourMapID,rgb.v, field->getData(uiX,uiY,uiZ), colourMapBound[0],colourMapBound[1],false); ptsCache.push_back(make_pair(field->getPoint(uiX,uiY,uiZ)+delta,rgb)); } } } } ptsCacheOK=true; } if(alphaVal < 1.0f && useAlphaBlend) { //We need to generate some points, then sort them by distance //from eye (back to front), otherwise they will not blend properly std::vector > eyeDists; Point3D camOrigin = curCamera->getOrigin(); eyeDists.resize(ptsCache.size()); //Set up an original index for the eye distances #pragma omp parallel for for(unsigned int ui=0;uigetMinBounds(),field->getMaxBounds(), boxColourR, boxColourG,boxColourB,alphaUse); } } void DrawField3D::setAlpha(float newAlpha) { alphaVal=newAlpha; } void DrawField3D::setPointSize(float size) { pointSize=size; } void DrawField3D::setMapColours(unsigned int mapID) { ASSERT(mapID < NUM_COLOURMAPS); colourMapID= mapID; } void DrawField3D::setBoxColours(float rNew, float gNew, float bNew, float aNew) { boxColourR = rNew; boxColourG = gNew; boxColourB = bNew; boxColourA = aNew; } DrawIsoSurface::DrawIsoSurface() : cacheOK(false), drawMode(DRAW_SMOOTH), threshold(0.5f), r(0.5f), g(0.5f), b(0.5f), a(0.5f) { #ifdef DEBUG voxels=0; #endif } DrawIsoSurface::~DrawIsoSurface() { if(voxels) delete voxels; } bool DrawIsoSurface::needsDepthSorting() const { return a< 1 && a > std::numeric_limits::epsilon(); } void DrawIsoSurface::swapVoxels(Voxels *f) { std::swap(f,voxels); cacheOK=false; mesh.clear(); } void DrawIsoSurface::updateMesh() const { mesh.clear(); marchingCubes(*voxels, threshold,mesh); cacheOK=true; } void DrawIsoSurface::getBoundingBox(BoundCube &b) const { if(voxels) { b.setBounds(voxels->getMinBounds(), voxels->getMaxBounds()); } else b.setInverseLimits(); } void DrawIsoSurface::draw() const { if(a< sqrtf(std::numeric_limits::epsilon())) return; if(!cacheOK) { //Hmm, we don't have a cached copy of the isosurface mesh. //we will need to compute one, it would seem. updateMesh(); } //This could be optimised by using triangle strips //rather than direct triangles. if(a < 1.0f && useAlphaBlend ) { //We need to sort them by distance //from eye (back to front), otherwise they will not blend properly std::vector > eyeDists; Point3D camOrigin = curCamera->getOrigin(); eyeDists.resize(mesh.size()); //Set up an original index for the eye distances #pragma omp parallel for shared(camOrigin) for(unsigned int ui=0;ui 1,"Draw2D Circle, too few steps"); glColor4f(r,g,b,1.0f); if(filled) { glBegin(GL_TRIANGLE_FAN); //Central vertex glVertex2fv(centre); //vertices from [0,2PI) for(unsigned int ui=0;ui. */ #include "effect.h" #include "common/xmlHelper.h" #include "common/stringFuncs.h" #include "common/constants.h" //OpenGL includes //MacOS is "special" and puts it elsewhere #ifdef __APPLE__ #include #else #include #endif Camera* Effect::curCam=0; BoundCube Effect::bc; float MIN_CROP_FRACTION=0.0001; const unsigned int NUM_EFFECTS=2; const char *EFFECT_NAMES[] = { "boxcrop", "anaglyph" }; //factory functions Effect *makeEffect(unsigned int effectID) { Effect *e; switch(effectID) { case EFFECT_ANAGLYPH: e = new AnaglyphEffect; break; case EFFECT_BOX_CROP: e=new BoxCropEffect; break; default: ASSERT(false); } return e; } Effect *makeEffect(const std::string &str) { Effect *e=0; for(unsigned int ui=0;uigetType()]; } BoxCropEffect::BoxCropEffect() : openGLIdStart(0), useCamCoordinates(false) { effectType=EFFECT_BOX_CROP; } Effect *BoxCropEffect::clone() const { Effect *e = new BoxCropEffect; *e=*this; return e; } void BoxCropEffect::enable(unsigned int pass) const { //we only need to do anything on the first pass. All other passes are unchanged if(pass) return; //Compute the bounding box that is the clipped boundary Point3D pAAB[2]; //Axis aligned box bc.getBounds(pAAB[0],pAAB[1]); Point3D pCentre; pCentre = (pAAB[0] + pAAB[1])*0.5f; unsigned int glOffset=openGLIdStart; if(useCamCoordinates) { Point3f pBox[8]; for(unsigned int ui=0;ui<8;ui++) { //Counting in binary to generate box corner vertices. pBox[ui].fx = pAAB[(ui>>2) &1][0]; pBox[ui].fy = pAAB[(ui>>1) &1][1]; pBox[ui].fz = pAAB[ui&1][2]; } //Translate to rotate around the box centre for(unsigned int ui=0;ui<8;ui++) { pBox[ui].fx-=pCentre[0]; pBox[ui].fy-=pCentre[1]; pBox[ui].fz-=pCentre[2]; } Point3D x,y,z; //get camera orientation data z= curCam->getUpDirection(); y= curCam->getViewDirection(); //We need to first do a "passive" coordinate transformation on the box coordinates //to determine the box coordinates in camera basis vectors (after translation such tat //centre of box is in centre of world). //Active transformations are v'=Tv_orig. Passive transformation is that v_prime = T^-1 v_orig // z.normalise(); //Not needed, I think.. but can't hurt y.normalise(); x= z.crossProd(y); float angle; angle=z.angle(Point3D(0,0,1)); //If needed, perform a rotation to align the box up //vector with the camera up vector Point3f r; Point3D yTmpRot; if(fabs(angle) > sqrtf(std::numeric_limits::epsilon())) { Point3D rotateAxis; //Check for numerical stability problem when camera //& world z axes point exactly apart if( fabs(angle-M_PI) ::epsilon())) rotateAxis=Point3D(1,0,0); //Pick *any* vector in X-Y plane. else rotateAxis = z.crossProd(Point3D(0,0,1)); rotateAxis.normalise(); r.fx=rotateAxis[0]; r.fy=rotateAxis[1]; r.fz=rotateAxis[2]; for(unsigned int ui=0;ui<8;ui++) quat_rot(&(pBox[ui]),&r,angle); Point3f yRot; yRot.fx=0; yRot.fy=1; yRot.fz=0; quat_rot(&yRot,&r,angle); yTmpRot=Point3D(yRot.fx,yRot.fy,yRot.fz); ASSERT(yTmpRot.sqrMag() > sqrtf(std::numeric_limits::epsilon())); } else yTmpRot=Point3D(0,1,0); //Rotating around the z axis to set "spin" r.fx=z[0]; r.fy=z[1]; r.fz=z[2]; angle=y.angle(yTmpRot); if( fabs(angle) > sqrtf(std::numeric_limits::epsilon())) { //Spin the box around to match the final coordinate system for(unsigned int ui=0;ui<8;ui++) quat_rot(&(pBox[ui]),&r,angle); } //Now compute the box coordinates, then break their position //vectors (from box centre) down into the basis //coordinates of our camera Point3D pBoxVertices[8]; for(unsigned int ui=0;ui<8;ui++) pBoxVertices[ui]= Point3D(pBox[ui].fx, pBox[ui].fy,pBox[ui].fz); float dotValue[3]; dotValue[0]=dotValue[1]=dotValue[2]=-std::numeric_limits::max(); //Find the largest positive basis components (these form the camera BB limits) for(unsigned int ui=0;ui<8;ui++) { float tmp; tmp =x.dotProd(pBoxVertices[ui]); if(tmp > dotValue[0]) dotValue[0]=tmp; tmp =y.dotProd(pBoxVertices[ui]); if(tmp > dotValue[1]) dotValue[1]=tmp; tmp =z.dotProd(pBoxVertices[ui]); if(tmp > dotValue[2]) dotValue[2]=tmp; } //Compute the cropping deltas in the range [-1,1] float dC[6]; for(unsigned int ui=0;ui<6;ui++) { if(ui&1) { //upper dC[ui] =2.0*(0.5- cropFractions[ui]); } else { //Lower dC[ui]=2.0*(cropFractions[ui]-0.5); } } //Cropping delta * dotproduct *basisvector == crop point //Note the reversal of the Z and Y vectors pAAB[0] = pCentre + x*dotValue[0]*dC[0] +y*dotValue[1]*dC[2]+z*dotValue[2]*dC[4]; pAAB[1] = pCentre + x*dotValue[0]*dC[1] +y*dotValue[1]*dC[3]+z*dotValue[2]*dC[5]; //Draw crop iff crop fractions are +ve //X if(cropFractions[0] >=MIN_CROP_FRACTION) { doClip(pAAB[0],x,glOffset); glOffset++; } if(cropFractions[1] >=MIN_CROP_FRACTION) { doClip(pAAB[1],-x,glOffset); glOffset++; } //Y if(cropFractions[2] >=MIN_CROP_FRACTION) { doClip(pAAB[0],y,glOffset); glOffset++; } if(cropFractions[3] >=MIN_CROP_FRACTION) { doClip(pAAB[1],-y,glOffset); glOffset++; } //Z if(cropFractions[4] >=MIN_CROP_FRACTION) { doClip(pAAB[0],z,glOffset); glOffset++; } if(cropFractions[5] >=MIN_CROP_FRACTION) { doClip(pAAB[1],-z,glOffset++); glOffset++; } } else { pAAB[0] = pCentre + Point3D(0.5-cropFractions[0], 0.5-cropFractions[2],0.5-cropFractions[4])*(pAAB[0]-pCentre)*2.0; pAAB[1] = pCentre + Point3D(0.5-cropFractions[1], 0.5-cropFractions[3],0.5-cropFractions[5])*(pAAB[1]-pCentre)*2.0; for(unsigned int ui=0;ui<6;ui++) { Point3D normal; //Don't update minimum crop fractions if(cropFractions[ui] < MIN_CROP_FRACTION) continue; //Set up the normal & origin (use rectangular prism vertex as origin) normal=Point3D(0,0,0); normal.setValue(ui/2,1); if(ui&1) { normal=-normal; doClip(pAAB[1],normal,glOffset); } else doClip(pAAB[0],normal,glOffset); glOffset++; } } } void BoxCropEffect::doClip(const Point3D &origin, const Point3D &normal, unsigned int glOffset) const { double array[4]; //Ax + By + Cz + D =0. Prove from //n.dot(v-p_0)=0 array[0]=normal[0]; array[1]=normal[1]; array[2]=normal[2]; array[3] = -normal.dotProd(origin); glMatrixMode(GL_MODELVIEW); //Set up the effect glClipPlane(GL_CLIP_PLANE0 +glOffset, array); glEnable(GL_CLIP_PLANE0+glOffset); } void BoxCropEffect::disable() const { unsigned int startId=openGLIdStart; for(unsigned int ui=0; ui<6;ui++) { if(cropFractions[ui]>= MIN_CROP_FRACTION) { glDisable(GL_CLIP_PLANE0+startId); startId++; } } } bool BoxCropEffect::willDoSomething() const { for(unsigned int ui=0;ui<6;ui++) { if(cropFractions[ui]>=MIN_CROP_FRACTION) return true; } return false; } void BoxCropEffect::setFractions(const float *frac) { for(unsigned int ui=0;ui<6;ui++) cropFractions[ui]=frac[ui]; } float BoxCropEffect::getCropValue(unsigned int pos) const { ASSERT(pos<6); return cropFractions[pos]; } void BoxCropEffect::getCroppedBounds(BoundCube &b) const { Point3D pLow,pHi; b.getBounds(pLow,pHi); Point3D pCentre = (pLow+pHi)*0.5; pLow = pCentre + Point3D(0.5-cropFractions[0], 0.5-cropFractions[2],0.5-cropFractions[4])*(pLow-pCentre)*2.0; pHi = pCentre + Point3D(0.5-cropFractions[1], 0.5-cropFractions[3],0.5-cropFractions[5])*(pHi-pCentre)*2.0; b.setBounds(pLow,pHi); } bool BoxCropEffect::writeState(std::ofstream &f, unsigned int format, unsigned int depth) const { using std::endl; switch(format) { case STATE_FORMAT_XML: f << tabs(depth+1) << "" << endl; f << tabs(depth+2) << "" << endl; for(unsigned int ui=0;ui<6;ui++) { f << tabs(depth+3) << "" << endl; } f << tabs(depth+2) << "" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+1) << "" << endl; break; default: ASSERT(false); return false; } return true; } bool BoxCropEffect::readState(xmlNodePtr nodePtr) { using std::string; if(!nodePtr->xmlChildrenNode) return false; nodePtr=nodePtr->xmlChildrenNode; xmlNodePtr scalars; if(XMLHelpFwdToElem(nodePtr,"cropvalues")) return false; scalars=nodePtr->xmlChildrenNode; for(unsigned int ui=0;ui<6;ui++) { if(!XMLGetNextElemAttrib(scalars,cropFractions[ui],"scalar","value")) return false; } string s; if(!XMLGetNextElemAttrib(nodePtr,s,"usecamcoordinates","value")) return false; if(s=="0") useCamCoordinates=false; else if (s == "1") useCamCoordinates=true; else return false; return true; } AnaglyphEffect::AnaglyphEffect() : colourMode(ANAGLYPH_REDBLUE), eyeFlip(false), oldCam(0),baseShift(0.01f) { effectType=EFFECT_ANAGLYPH; } Effect *AnaglyphEffect::clone() const { Effect *e = new AnaglyphEffect; *e=*this; return e; } void AnaglyphEffect::enable(unsigned int passNumber) const { if(passNumber >1 || curCam->type() !=CAM_LOOKAT) return; if(passNumber==0) { ASSERT(!oldCam); oldCam=curCam->clone(); //Translate both the target, and the origin curCam->translate(baseShift,0); //Apply the frustum offset to restore the shifted focal plane ((CameraLookAt*)curCam)->setFrustumDistort(baseShift); } else { *curCam=*oldCam; //this time, in the reverse direction; //Translate both the target, and the origin curCam->translate(-baseShift,0); //Apply the frustum offset to restore the shifted focal plane ((CameraLookAt*)curCam)->setFrustumDistort(-baseShift); } //Different type of glasses use different colour masks. const bool maskArray[][6] = { {true,false,false,false,false,true}, //Red-blue {true,false,false,false,true,false}, //red-green {true,false,false,false,true,true}, // red-cyan {false,true,false,true,false,true} //green-magenta }; //Colour buffer masking method if(passNumber == 0) { glClear(GL_COLOR_BUFFER_BIT ); } else glClear(GL_DEPTH_BUFFER_BIT); //we flip either due to the pass, or because the user has //back to front glasses. unsigned int offset; if(passNumber ^ eyeFlip) offset=0; else offset=3; unsigned int idx = colourMode-ANAGLYPH_REDBLUE; glColorMask(maskArray[idx][offset],maskArray[idx][offset+1], maskArray[idx][offset+2],true); } void AnaglyphEffect::setMode(unsigned int mode) { ASSERT(colourMode" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+2) << "" << endl; f << tabs(depth+1) << "" << endl; break; default: ASSERT(false); return false; } return true; } bool AnaglyphEffect::readState(xmlNodePtr nodePtr) { using std::string; if(!nodePtr->xmlChildrenNode) return false; nodePtr=nodePtr->xmlChildrenNode; if(!XMLGetNextElemAttrib(nodePtr,colourMode,"colourmode","value")) return false; if(colourMode >= ANAGLYPH_HALF_COLOUR) return false; string s; if(!XMLGetNextElemAttrib(nodePtr,s,"eyeflip","value")) return false; if(s == "0") eyeFlip=false; else if(s == "1") eyeFlip=true; else return false; if(!XMLGetNextElemAttrib(nodePtr,baseShift,"baseshift","value")) return false; return true; } 3Depict-0.0.19/src/gl/select.h0000644000175000017500000001426312640746376015326 0ustar pcuserpcuser/* * select,h - Opengl interaction header. * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef SELECT_H #define SELECT_H #include class DrawableObj; class Filter; class Point3D; //Mouse button flags enum { SELECT_BUTTON_LEFT=1, SELECT_BUTTON_MIDDLE=2, SELECT_BUTTON_RIGHT=4 }; //!Keyboard keydown flags enum { FLAG_NONE=0, FLAG_CMD=1, //control (non-mac) or "clover" key (mac) FLAG_SHIFT=2, //Left or right shift key. }; //!Allowable binding modes enum { BIND_MODE_FLOAT_SCALE, //Object scaling only (fp value) BIND_MODE_FLOAT_TRANSLATE, //Floating point translation BIND_MODE_POINT3D_TRANSLATE, //3D point translation in 2D plane perpendicular to camera BIND_MODE_POINT3D_SCALE, //3D point translation in 2D plane perpendicular to camera; but indicate to user that this performs some kind of scaling operation BIND_MODE_POINT3D_ROTATE, //3D rotation in 2D plane perpendicular to camera BIND_MODE_POINT3D_ROTATE_LOCK, // 3D rotation in 2D plane perpendicular to camera, but with locked magnitude }; //!Bindable data types (data types that SelectionBinding can work with) enum { BIND_TYPE_FLOAT, BIND_TYPE_POINT3D }; //!This class is used to pool together a graphical representation (via the drawable), of //an object with its internal data structural representation. This allows the user //to grapple with the drawable representation and feed this into the scene. //This class binds ONE drawable object to a set of actions based upon key and button combinations. class SelectionBinding { private: //Pointer to drawable that generates selection events. //calls recomputeParams function DrawableObj *obj; //ID number for parent to know which of its bindings this is unsigned int bindingId; //ID number to bind the action for the drawable object unsigned int drawActionId; //Binding type unsigned int dataType; //Binding button (ORed together) unsigned int bindButtons; //Binding key (ORed together) unsigned int bindKeys; //Binding mode unsigned int bindMode; //Original value of data type (probably more mem efficient ot use a void*...) float cachedValFloat; Point3D cachedValPoint3D; bool valModified; //limits in floating point float fMin,fMax; public: SelectionBinding(); //!Returns true if this binding will be activated given the current flags bool isActive(unsigned int button,unsigned int curModifierFlags); //!Set the binding for a float DO NOT CACHE THE DRAWABLEOBJ-> THAT IS BAD void setBinding(unsigned int buttonFlags, unsigned int modifierFlags, unsigned int drawActionId, unsigned int bindingID, float initVal, DrawableObj *d); //!Set the binding for a Point3D. DO NOT CACHE THE DRAWABLEOBJ-> THAT IS BAD void setBinding(unsigned int buttonFlags, unsigned int modifierFlags, unsigned int drawActionId,unsigned int bindingID, const Point3D &initVal, DrawableObj *d); //!Set the interaction method. (example translate, scale, rotate etc) void setInteractionMode(unsigned int bindMode); //!Get the interaction mode unsigned int getInteractionMode() const { return bindMode;}; //!Get the mouse button unsigned int getMouseButtons() const { return bindButtons;}; //!Get the mouse button unsigned int getKeyFlags() const { return bindKeys;}; //!Set the limits for a floating point data type void setFloatLimits(float min,float max); //!Is this binding for the following object? bool matchesDrawable(const DrawableObj *d, unsigned int mouseFlags, unsigned int keyFlags) const; //!Is this binding for the following object? bool matchesDrawable(const DrawableObj *d) const; //!Apply the user ineraction specified. set permanent=true to //make it such that this is not undone during the next transform, //or call to reset() //worldvec is the vector along which to transform the object (subject to //interpretation by the "interaction mode" (bindmode) setting) void applyTransform(const Point3D &worldVec,bool permanent=false); //!Map the screen coords world coords, given the mouse and keyflags //coeffs are 0: right 1: forwards 2: up ( right hand rule) void computeWorldVectorCoeffs(unsigned int buttonFlags, unsigned int modifierFlags,Point3D &xCoeffs,Point3D &yCoeffs) const; //!Retrieve the current value from the drawable representation void getValue(float &f) const; //!Retreive the current value from the drawable representation void getValue(Point3D &p) const; unsigned int getID() const { return bindingId;}; //!True if the binding has modified the data bool modified() const {return valModified;}; void resetModified() { valModified=false; } }; class SelectionDevice { private: std::vector bindingVec; const Filter *target; public: //!Create a new selection device SelectionDevice(const Filter *p); //!Copy constructor (not implemented) SelectionDevice(const SelectionDevice ©Src); //!Bind a floating point type between the graphical and internal reps. //note that it is a BUG to attempt to bind any object that uses a //display list in its internal representation. void addBinding(SelectionBinding b); bool getBinding(const DrawableObj *d, unsigned int mouseFlags, unsigned int keyFlags, SelectionBinding* &b); bool getAvailBindings(const DrawableObj *d, std::vector &b) const; void getModifiedBindings(std::vector > &bindings); //!Return any devices that have been modified since their creation void resetModifiedBindings() ; size_t getNumBindings() const { return bindingVec.size(); } }; #endif 3Depict-0.0.19/src/gl/scene.cpp0000644000175000017500000005655512640746376015511 0ustar pcuserpcuser/* * scene.cpp - OpenGL 3D static scene implementation * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #if defined(WIN32) || defined(WIN64) #include #endif #include "scene.h" #include "./backend/viscontrol.h" #include "./backend/filter.h" using std::vector; using std::string; // const char ANIMATE_PROGRESS_BASENAME[] = { "textures/animProgress"}; unsigned int ANIMATE_PROGRESS_NUMFRAMES=3; Scene::Scene() : tempCam(0), cameraSet(true), outWinAspect(1.0f) { glewInited=false; visControl=0; lastHovered=lastSelected=(unsigned int)(-1); lockInteract=false; hoverMode=selectionMode=false; useAlpha=true; useLighting=true; useEffects=false; showAxis=true; attemptedLoadProgressAnim=false; witholdCamUpdate=false; //default to black rBack=gBack=bBack=0.0f; activeCam = new CameraLookAt; lightPosition[0]= 1.0; lightPosition[1]= 1.0; lightPosition[2]= 1.0; lightPosition[3]=0.0; DrawableObj::setTexPool(new TexturePool); } Scene::~Scene() { clearAll(); DrawableObj::clearTexPool(); delete activeCam; } unsigned int Scene::initDraw() { //Initialise GLEW #if defined(WIN32) || defined(WIN64) if(!glewInited) { unsigned int errCode; errCode=glewInit(); if(errCode!= GLEW_OK) { cerr << "Opengl context could not be created, aborting." << endl; cerr << "Glew reports:" << glewGetErrorString(errCode) << endl; //Blow up without opengl exit(1); } glewInited=true; } #endif glClearColor( rBack, gBack, bBack,1.0f ); glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); glEnable(GL_COLOR_MATERIAL); glColorMaterial ( GL_FRONT, GL_AMBIENT_AND_DIFFUSE ) ; glEnable(GL_POINT_SMOOTH); glEnable(GL_LINE_SMOOTH); //Will it blend? That is the question... // let the objects know about this, so they // can pick the right algorithm DrawableObj::setUseAlphaBlending(useAlpha); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); if(useAlpha) glEnable(GL_BLEND); else glDisable(GL_BLEND); glDisable(GL_LIGHTING); glEnable(GL_LIGHT0); glShadeModel(GL_SMOOTH); //Set up the scene lights //== //Set up default lighting const float light_ambient[] = { 0.0, 0.0, 0.0, 1.0 }; const float light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); // The direction the light shines in glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); //== //Use the active if set if(cameraSet) { if(!boundCube.isValid()) computeSceneLimits(); } //Attempt to load the progress animation, if we have not tried before if(!attemptedLoadProgressAnim) { attemptedLoadProgressAnim=true; //Load the animation textures vector animFiles; animFiles.resize(ANIMATE_PROGRESS_NUMFRAMES); string animFilename,tmpStr; for(size_t ui=0;uinumPassesNeeded()); } return passes; } bool Scene::hasOverlays() const { for(unsigned int ui=0;uiisOverlay()) return true; } for(unsigned int ui=0;uiisOverlay()) return true; } return false; } void Scene::updateCam(const Camera *camToUse, bool useIdent=true) const { Point3D lightNormal; camToUse->apply(outWinAspect,boundCube,useIdent); lightNormal=camToUse->getViewDirection(); glNormal3f(lightNormal[0],lightNormal[1],lightNormal[2]); } void Scene::updateProgressOverlay() { const float xPos= 0.85*winX; const float yPos=0.85*winY; progressAnimTex.setPosition(xPos,yPos); progressAnimTex.setSize(0.1*winX); //Draw the progress animation bar progressCircle.setPosition(xPos,yPos); progressCircle.setSize(0.15*winX); } void Scene::draw(bool noUpdateCam) { glError(); ASSERT(visControl); glPushMatrix(); Camera *camToUse; if(tempCam) camToUse=tempCam; else camToUse=activeCam; //Inform text about current camera, // so it can e.g. billboard if needed DrawableObj::setCurCamera(camToUse); DrawableObj::setWindowSize(winX,winY); DrawableObj::setBackgroundColour(rBack,gBack,bBack); Effect::setCurCam(camToUse); bool lightsOn=false; //Find number of passes to perform unsigned int numberTotalPasses; numberTotalPasses=initDraw(); if(cameraSet && !noUpdateCam) updateCam(camToUse); for(unsigned int passNumber=0; passNumberenable(passNumber); needCamUpdate|=effects[ui]->needCamUpdate(); } if(cameraSet && !noUpdateCam && needCamUpdate ) updateCam(camToUse); } if(showAxis) { if(useLighting) glEnable(GL_LIGHTING); DrawAxis a; a.setStyle(AXIS_IN_SPACE); a.setSize(boundCube.getLargestDim()); a.setPosition(boundCube.getCentroid()); a.draw(); if(useLighting) glDisable(GL_LIGHTING); } //First sub-pass with opaque objects //----------- //Draw the referenced objects drawObjectVector(refObjects,lightsOn,true); //Draw normal objects drawObjectVector(objects,lightsOn,true); //----------- //Second sub-pass with transparent objects //----------- //Draw the referenced objects drawObjectVector(refObjects,lightsOn,false); //Draw normal objects drawObjectVector(objects,lightsOn,false); //----------- } //Disable effects if(useEffects) { //Disable them in reverse order to simulate a stack-type //behaviour. for(unsigned int ui=effects.size();ui!=0;) { ui--; effects[ui]->disable(); } } glPopMatrix(); //Only draw 2D components if we // are using normal camera if(!noUpdateCam) { //Now draw 2D overlays if(!lockInteract&& lastHovered != (unsigned int)(-1) ) drawHoverOverlay(); drawOverlays(noUpdateCam); //Draw progress, if needed drawProgressAnim(); } glError(); } void Scene::drawObjectVector(const vector &drawObjs, bool &lightsOn, bool drawOpaques) const { for(unsigned int ui=0; uineedsDepthSorting() == drawOpaques) continue; //overlays need to be drawn later if(drawObjs[ui]->isOverlay()) continue; if(useLighting) { if(!drawObjs[ui]->wantsLight && lightsOn ) { //Object prefers doing its thing in the dark glDisable(GL_LIGHTING); lightsOn=false; } else if (drawObjs[ui]->wantsLight && !lightsOn) { glEnable(GL_LIGHTING); lightsOn=true; } } //If we are in selection mode, draw the bounding box //if the object is selected. if(ui == lastSelected && selectionMode) { //May be required for selection box drawing BoundCube bObject; DrawRectPrism p; //Get the bounding box for the object & draw it drawObjs[ui]->getBoundingBox(bObject); p.setAxisAligned(bObject); p.setColour(0,0.2,1,0.5); //blue-greenish if(lightsOn) glDisable(GL_LIGHTING); p.draw(); if(lightsOn) glEnable(GL_LIGHTING); } #ifdef DEBUG //Ensure that the gl matrix sizes are correctly restored int curDepth[3]; int oldMatMode; curDepth[0] = glCurStackDepth(GL_MODELVIEW_STACK_DEPTH); curDepth[1] = glCurStackDepth(GL_PROJECTION_STACK_DEPTH); curDepth[2] = glCurStackDepth(GL_TEXTURE_STACK_DEPTH); glGetIntegerv( GL_MATRIX_MODE, &oldMatMode); #endif drawObjs[ui]->draw(); #ifdef DEBUG ASSERT(curDepth[0] == glCurStackDepth(GL_MODELVIEW_STACK_DEPTH)); ASSERT(curDepth[1] == glCurStackDepth(GL_PROJECTION_STACK_DEPTH)); ASSERT(curDepth[2] == glCurStackDepth(GL_TEXTURE_STACK_DEPTH)); ASSERT(curDepth[0] && curDepth[1] && curDepth[2]); int newMatMode; glGetIntegerv( GL_MATRIX_MODE, &newMatMode); ASSERT(oldMatMode == newMatMode); #endif } } void Scene::drawOverlays(bool noUpdateCam) const { //Custom projection matrix glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); //Set the opengl camera state back into modelview mode if(!noUpdateCam) { //clear projection and modelview matrices glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0, outWinAspect, 1.0, 0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); } for(unsigned int ui=0;uiisOverlay()) { refObjects[ui]->draw(); } } for(unsigned int ui=0;uiisOverlay()) { objects[ui]->draw(); } } if(!noUpdateCam) { //op our modelview matrix glPopMatrix(); //ppop projection atrix glMatrixMode(GL_PROJECTION); glPopMatrix(); //return to modelview mode glMatrixMode(GL_MODELVIEW); } glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); } void Scene::drawHoverOverlay() { glEnable(GL_ALPHA_TEST); glDisable(GL_DEPTH_TEST); //Search for a binding bool haveBinding; haveBinding=false; //Prevent transparent areas from interacting //with the depth buffer glAlphaFunc(GL_GREATER,0.01f); vector binder; //!Devices for interactive object properties const std::vector &selectionDevices = visControl->getSelectionDevices(); for(unsigned int uj=0;ujgetAvailBindings(objects[lastHovered],binder)) { haveBinding=true; break; } } if(haveBinding) { glPushAttrib(GL_LIGHTING); glDisable(GL_LIGHTING); //Now draw some hints for the binding itself as a 2D overlay // //Draw the action type (translation, rotation etc) //and the button it is bound to DrawTexturedQuadOverlay binderIcons,mouseIcons,keyIcons; const float ICON_SIZE= 0.05; binderIcons.setSize(ICON_SIZE*winY); mouseIcons.setSize(ICON_SIZE*winY); keyIcons.setSize(ICON_SIZE*winY); unsigned int iconNum=0; for(unsigned int ui=0;uigetInteractionMode()) { case BIND_MODE_FLOAT_SCALE: case BIND_MODE_FLOAT_TRANSLATE: case BIND_MODE_POINT3D_SCALE: foundIconTex=binderIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_ENLARGE]); break; case BIND_MODE_POINT3D_TRANSLATE: foundIconTex=binderIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_TRANSLATE]); break; case BIND_MODE_POINT3D_ROTATE: case BIND_MODE_POINT3D_ROTATE_LOCK: foundIconTex=binderIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_ROTATE]); default: break; } //Draw the mouse action switch(binder[ui]->getMouseButtons()) { case SELECT_BUTTON_LEFT: foundMouseTex=mouseIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_LEFT_CLICK]); break; case SELECT_BUTTON_MIDDLE: foundMouseTex=mouseIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_MIDDLE_CLICK]); break; case SELECT_BUTTON_RIGHT: foundMouseTex=mouseIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_RIGHT_CLICK]); break; default: //The flags are or'd together, so we can get other combinations break; } bool foundKeyTex; foundKeyTex=false; //Draw the keyboard action, if any switch(binder[ui]->getKeyFlags()) { case FLAG_CMD: #ifdef __APPLE__ foundKeyTex=keyIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_COMMAND]); #else foundKeyTex=keyIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_CTRL]); #endif break; case FLAG_SHIFT: foundKeyTex=keyIcons.setTexture(TEXTURE_OVERLAY_PNG[TEXTURE_SHIFT]); break; default: //The flags are or'd together, so we can get other combinations break; } if(foundIconTex && foundMouseTex ) { const float SPACING=0.75*ICON_SIZE; if(foundKeyTex) { //Make room for keyTex binderIcons.setPosition((0.93+SPACING)*winX,ICON_SIZE*winY*(1+(float)iconNum)); keyIcons.setPosition(0.93*winX,ICON_SIZE*winY*(1+(float)iconNum)); mouseIcons.setPosition((0.93-SPACING)*winX,ICON_SIZE*winY*(1+(float)iconNum)); } else { binderIcons.setPosition(0.95*winX,ICON_SIZE*winY*(1+(float)iconNum)); mouseIcons.setPosition(0.90*winX,ICON_SIZE*winY*(1+(float)iconNum)); } binderIcons.draw(); mouseIcons.draw(); if(foundKeyTex) keyIcons.draw(); iconNum++; } } glPopAttrib(); } glDisable(GL_ALPHA_TEST); glEnable(GL_DEPTH_TEST); } void Scene::drawProgressAnim() const { if(!visControl->state.treeState.isRefreshing()) return; if(useLighting) glDisable(GL_LIGHTING); progressCircle.draw(); if(!progressAnimTex.isOK()) { if(useLighting) glEnable(GL_LIGHTING); return; } progressAnimTex.draw(); if(useLighting) glEnable(GL_LIGHTING); } void Scene::commitTempCam() { ASSERT(tempCam); std::swap(activeCam, tempCam); delete tempCam; tempCam=0; } void Scene::discardTempCam() { delete tempCam; tempCam=0; } void Scene::setTempCam() { //If a temporary camera is not set, set one. //if it is set, update it from the active camera if(!tempCam) tempCam =activeCam->clone(); else *tempCam=*activeCam; } void Scene::addDrawable(DrawableObj const *obj ) { objects.push_back(obj); BoundCube bc; obj->getBoundingBox(bc); if(bc.isValid()) boundCube.expand(bc); } void Scene::addRefDrawable(const DrawableObj *obj) { refObjects.push_back(obj); BoundCube bc; obj->getBoundingBox(bc); ASSERT(bc.isValid()); boundCube.expand(bc); } void Scene::clearAll() { //Invalidate the bounding cube boundCube.setInverseLimits(); clearObjs(); clearRefObjs(); } void Scene::clearObjs() { for(unsigned int ui=0; uiclone(); cameraSet=true; } void Scene::ensureVisible(unsigned int direction) { computeSceneLimits(); activeCam->ensureVisible(boundCube,direction); } void Scene::computeSceneLimits() { boundCube.setInverseLimits(); BoundCube b; for(unsigned int ui=0; uigetBoundingBox(b); if(b.isValid()) boundCube.expand(b); } for(unsigned int ui=0; uigetBoundingBox(b); if(b.isValid()) boundCube.expand(b); } if(!boundCube.isValid()) { //He's going to spend the rest of his life //in a one by one unit box. //If there are no objects, then set the bounds //to 1x1x1, centered around the origin boundCube.setBounds(-0.5,-0.5,-0.5, 0.5,0.5,0.5); } //NOw that we have a scene level bounding box, //we need to set the camera to ensure that //this box is visible ASSERT(boundCube.isValid()); //The scene bounds should be no less than 0.1 units BoundCube unitCube; Point3D centre; centre=boundCube.getCentroid(); unitCube.setBounds(centre+Point3D(0.05,0.05,0.05), centre-Point3D(0.05,0.05,0.05)); boundCube.expand(unitCube); } Camera *Scene::getActiveCam() { return activeCam; } Camera *Scene::getTempCam() { ASSERT(tempCam); return tempCam; } //Adapted from //http://chadweisshaar.com/robotics/docs/html/_v_canvas_8cpp-source.html //GPLv3+ permission obtained by email inquiry. unsigned int Scene::glSelect(bool storeSelected) { ASSERT(!lockInteract); glClear( GL_DEPTH_BUFFER_BIT ); //Shouldn't be using a temporary camera. //temporary cameras are only active during movement operations ASSERT(!tempCam); // Need to load a base name so that the other calls can replace it GLuint *selectionBuffer = new GLuint[512]; glSelectBuffer(512, selectionBuffer); glRenderMode(GL_SELECT); glInitNames(); if(!boundCube.isValid()) computeSceneLimits(); glPushMatrix(); //Apply the camera, but do NOT load the identity matrix, as //we have set the pick matrix activeCam->apply(outWinAspect,boundCube,false); //Set up the objects. Only NON DISPLAYLIST items can be selected. for(unsigned int ui=0; uicanSelect) objects[ui]->draw(); glPopName(); } //OpengGL Faq: //The number of hit records is returned by the call to //glRenderMode(GL_RENDER). Each hit record contains the following //information stored as unsigned ints: // // * Number of names in the name stack for this hit record // * Minimum depth value of primitives (range 0 to 2^32-1) // * Maximum depth value of primitives (range 0 to 2^32-1) // * Name stack contents (one name for each unsigned int). // //You can use the minimum and maximum Z values with the device //coordinate X and Y if known (perhaps from a mouse click) //to determine an object coordinate location of the picked //primitive. You can scale the Z values to the range 0.0 to 1.0, //for example, and use them in a call to gluUnProject(). glFlush(); GLint hits = glRenderMode(GL_RENDER); //The hit query records are stored in an odd manner //as the name stack is returned with it. This depends //upon how you have constructed your name stack during drawing //(clearly). I didn't bother fully understanding this, as it does //what I want. GLuint *ptr = selectionBuffer; GLuint *closestNames = 0; GLuint minZ = 0xffffffff; GLuint numClosestNames = 0; for ( int i=0; itype()) { case CAM_LOOKAT: ((CameraLookAt *)activeCam)->recomputeUpDirection(); break; } } void Scene::resetProgressAnim() { progressAnimTex.resetTime(); progressCircle.resetTime(); progressCircle.reset(); }; //Values are in the range [0 1]. void Scene::applyDevice(float startX, float startY, float curX, float curY, unsigned int keyFlags, unsigned int mouseFlags, bool permanent) { ASSERT(!lockInteract); if(lastSelected == (unsigned int) (-1)) return; //Object should be in object array, and be selectable ASSERT(lastSelected < objects.size()) ASSERT(objects[lastSelected]->canSelect); //Grab basis vectors. (up, forwards and //across from camera view.) //--- Point3D forwardsDir,upDir; forwardsDir=getActiveCam()->getViewDirection(); upDir=getActiveCam()->getUpDirection(); forwardsDir.normalise(); upDir.normalise(); Point3D acrossDir; acrossDir=forwardsDir.crossProd(upDir); acrossDir.normalise(); //--- //Compute the distance between the selected object's //centroid and the camera //--- float depth; BoundCube b; objects[lastSelected]->getBoundingBox(b); //Camera-> object vector Camera *cam=getActiveCam(); Point3D camToObject; //Get the vector to the object camToObject = b.getCentroid() - cam->getOrigin(); depth = camToObject.dotProd(forwardsDir); //--- //Compute the width of the camera view for the object at //the plane that intersects the object's centroid, and is //normal to the camera direction float viewWidth; switch(cam->type()) { case CAM_LOOKAT: viewWidth=((CameraLookAt*)cam)->getViewWidth(depth); break; default: ASSERT(false); } //We have the object number, but we don't know which binding //corresponds to this object. Search all bindings. It may be that more than one //binding is enabled for this object SelectionBinding *binder; vector activeBindings; std::vector &selectionDevices = visControl->getSelectionDevices(); for(unsigned int ui=0;uigetBinding( objects[lastSelected],mouseFlags,keyFlags,binder)) activeBindings.push_back(binder); } for(unsigned int ui=0;uicomputeWorldVectorCoeffs(mouseFlags,keyFlags, vectorCoeffs[0],vectorCoeffs[1]); //Apply vector coeffs, dependant upon binding worldVec = acrossDir*vectorCoeffs[0][0]*(curX-startX)*outWinAspect + upDir*vectorCoeffs[0][1]*(curX-startX)*outWinAspect + forwardsDir*vectorCoeffs[0][2]*(curX-startX)*outWinAspect + acrossDir*vectorCoeffs[1][0]*(curY-startY) + upDir*vectorCoeffs[1][1]*(curY-startY) + forwardsDir*vectorCoeffs[1][2]*(curY-startY); worldVec*=viewWidth; activeBindings[ui]->applyTransform(worldVec,permanent); } computeSceneLimits(); //Inform viscontrol about updates, if we have applied any if(activeBindings.size() && permanent) { visControl->state.treeState.setUpdates(); //If the viscontrol is in the middle of an update, //tell it to abort. if(visControl->state.treeState.isRefreshing()) visControl->state.treeState.setAbort(); } } void Scene::getEffects(vector &eff) const { eff.resize(effects.size()); for(unsigned int ui=0;ui &e) { clearEffects(); for(size_t ui=0;ui #else #include #endif typedef struct _TRctx TRcontext; typedef enum { TR_TILE_WIDTH = 100, TR_TILE_HEIGHT, TR_TILE_BORDER, TR_IMAGE_WIDTH, TR_IMAGE_HEIGHT, TR_ROWS, TR_COLUMNS, TR_CURRENT_ROW, TR_CURRENT_COLUMN, TR_CURRENT_TILE_WIDTH, TR_CURRENT_TILE_HEIGHT, TR_ROW_ORDER, TR_TOP_TO_BOTTOM, TR_BOTTOM_TO_TOP } TRenum; extern TRcontext *trNew(void); extern void trDelete(TRcontext *tr); extern void trTileSize(TRcontext *tr, GLint width, GLint height, GLint border); extern void trTileBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image); extern void trImageSize(TRcontext *tr, GLint width, GLint height); extern void trImageBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image); extern void trRowOrder(TRcontext *tr, TRenum order); extern GLint trGet(TRcontext *tr, TRenum param); extern void trOrtho(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); extern void trFrustum(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); extern void trPerspective(TRcontext *tr, GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar ); extern void trBeginTile(TRcontext *tr); //Returns zero if this was the last tile. extern int trEndTile(TRcontext *tr); extern void trRasterPos3f(TRcontext *tr, GLfloat x, GLfloat y, GLfloat z); #endif 3Depict-0.0.19/src/gl/tr.cpp0000644000175000017500000003073412640746376015030 0ustar pcuserpcuser//Tile Rendering Library, // http://www.mesa3d.org/brianp/TR.html /* TR Tile rendering library Copyright (C) 1997 Brian Paul This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* $Id: tr.c,v 1.9 1998/01/29 16:56:54 brianp Exp $ */ /* * $Log: tr.c,v $ * Revision 1.9 1998/01/29 16:56:54 brianp * allow trOrtho() and trFrustum() to be called at any time, minor clean-up * * Revision 1.8 1998/01/28 19:47:39 brianp * minor clean-up for C++ * * Revision 1.7 1997/07/21 17:34:38 brianp * added tile borders * * Revision 1.6 1997/07/21 15:47:35 brianp * renamed all "near" and "far" variables * * Revision 1.5 1997/04/26 21:23:25 brianp * added trRasterPos3f function * * Revision 1.4 1997/04/26 19:59:36 brianp * set CurrentTile to -1 before first tile and after last tile * * Revision 1.3 1997/04/22 23:51:15 brianp * added WIN32 header stuff, removed tabs * * Revision 1.2 1997/04/19 23:26:10 brianp * many API changes * * Revision 1.1 1997/04/18 21:53:05 brianp * Initial revision * */ /* * Tiled Rendering library * Version 1.1 * Copyright (C) Brian Paul */ #include "common/assertion.h" #include #include #ifdef WIN32 #include #endif #ifdef __APPLE__ #include #include #else #include #include #endif #include "tr.h" #define DEFAULT_TILE_WIDTH 256 #define DEFAULT_TILE_HEIGHT 256 #define DEFAULT_TILE_BORDER 0 struct _TRctx { /* Final image parameters */ GLint ImageWidth, ImageHeight; GLenum ImageFormat, ImageType; GLvoid *ImageBuffer; /* Tile parameters */ GLint TileWidth, TileHeight; GLint TileWidthNB, TileHeightNB; GLint TileBorder; GLenum TileFormat, TileType; GLvoid *TileBuffer; /* Projection parameters */ GLboolean Perspective; GLdouble Left; GLdouble Right; GLdouble Bottom; GLdouble Top; GLdouble Near; GLdouble Far; /* Misc */ TRenum RowOrder; GLint Rows, Columns; GLint CurrentTile; GLint CurrentTileWidth, CurrentTileHeight; GLint CurrentRow, CurrentColumn; GLint ViewportSave[4]; }; /* * Misc setup including computing number of tiles (rows and columns). */ static void Setup(TRcontext *tr) { if (!tr) return; tr->Columns = (tr->ImageWidth + tr->TileWidthNB - 1) / tr->TileWidthNB; tr->Rows = (tr->ImageHeight + tr->TileHeightNB - 1) / tr->TileHeightNB; tr->CurrentTile = 0; ASSERT(tr->Columns >= 0); ASSERT(tr->Rows >= 0); } TRcontext *trNew(void) { TRcontext *tr = (TRcontext *) calloc(1, sizeof(TRcontext)); if (tr) { tr->TileWidth = DEFAULT_TILE_WIDTH; tr->TileHeight = DEFAULT_TILE_HEIGHT; tr->TileBorder = DEFAULT_TILE_BORDER; tr->RowOrder = TR_BOTTOM_TO_TOP; tr->CurrentTile = -1; } return (TRcontext *) tr; } void trDelete(TRcontext *tr) { if (tr) free(tr); } void trTileSize(TRcontext *tr, GLint width, GLint height, GLint border) { if (!tr) return; ASSERT(border >= 0); ASSERT(width >= 1); ASSERT(height >= 1); ASSERT(width >= 2*border); ASSERT(height >= 2*border); tr->TileBorder = border; tr->TileWidth = width; tr->TileHeight = height; tr->TileWidthNB = width - 2 * border; tr->TileHeightNB = height - 2 * border; Setup(tr); } void trTileBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image) { if (!tr) return; tr->TileFormat = format; tr->TileType = type; tr->TileBuffer = image; } void trImageSize(TRcontext *tr, GLint width, GLint height) { if (!tr) return; tr->ImageWidth = width; tr->ImageHeight = height; Setup(tr); } void trImageBuffer(TRcontext *tr, GLenum format, GLenum type, GLvoid *image) { if (!tr) return; tr->ImageFormat = format; tr->ImageType = type; tr->ImageBuffer = image; } GLint trGet(TRcontext *tr, TRenum param) { if (!tr) return 0; switch (param) { case TR_TILE_WIDTH: return tr->TileWidth; case TR_TILE_HEIGHT: return tr->TileHeight; case TR_TILE_BORDER: return tr->TileBorder; case TR_IMAGE_WIDTH: return tr->ImageWidth; case TR_IMAGE_HEIGHT: return tr->ImageHeight; case TR_ROWS: return tr->Rows; case TR_COLUMNS: return tr->Columns; case TR_CURRENT_ROW: if (tr->CurrentTile<0) return -1; else return tr->CurrentRow; case TR_CURRENT_COLUMN: if (tr->CurrentTile<0) return -1; else return tr->CurrentColumn; case TR_CURRENT_TILE_WIDTH: return tr->CurrentTileWidth; case TR_CURRENT_TILE_HEIGHT: return tr->CurrentTileHeight; case TR_ROW_ORDER: return (GLint) tr->RowOrder; default: return 0; } } void trRowOrder(TRcontext *tr, TRenum order) { if (!tr) return; if (order==TR_TOP_TO_BOTTOM || order==TR_BOTTOM_TO_TOP) tr->RowOrder = order; } void trOrtho(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { if (!tr) return; tr->Perspective = GL_FALSE; tr->Left = left; tr->Right = right; tr->Bottom = bottom; tr->Top = top; tr->Near = zNear; tr->Far = zFar; } void trFrustum(TRcontext *tr, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { if (!tr) return; tr->Perspective = GL_TRUE; tr->Left = left; tr->Right = right; tr->Bottom = bottom; tr->Top = top; tr->Near = zNear; tr->Far = zFar; } void trPerspective(TRcontext *tr, GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar ) { GLdouble xmin, xmax, ymin, ymax; ymax = zNear * tan(fovy * 3.14159265 / 360.0); ymin = -ymax; xmin = ymin * aspect; xmax = ymax * aspect; trFrustum(tr, xmin, xmax, ymin, ymax, zNear, zFar); } void trBeginTile(TRcontext *tr) { GLint matrixMode; GLint tileWidth, tileHeight, border; GLdouble left, right, bottom, top; if (!tr) return; if (tr->CurrentTile <= 0) { Setup(tr); /* Save user's viewport, will be restored after last tile rendered */ glGetIntegerv(GL_VIEWPORT, tr->ViewportSave); } /* which tile (by row and column) we're about to render */ if (tr->RowOrder==TR_BOTTOM_TO_TOP) { tr->CurrentRow = tr->CurrentTile / tr->Columns; tr->CurrentColumn = tr->CurrentTile % tr->Columns; } else if (tr->RowOrder==TR_TOP_TO_BOTTOM) { tr->CurrentRow = tr->Rows - (tr->CurrentTile / tr->Columns) - 1; tr->CurrentColumn = tr->CurrentTile % tr->Columns; } else { /* This should never happen */ abort(); } ASSERT(tr->CurrentRow < tr->Rows); ASSERT(tr->CurrentColumn < tr->Columns); border = tr->TileBorder; /* Compute actual size of this tile with border */ if (tr->CurrentRow < tr->Rows-1) tileHeight = tr->TileHeight; else tileHeight = tr->ImageHeight - (tr->Rows-1) * (tr->TileHeightNB) + 2 * border; if (tr->CurrentColumn < tr->Columns-1) tileWidth = tr->TileWidth; else tileWidth = tr->ImageWidth - (tr->Columns-1) * (tr->TileWidthNB) + 2 * border; /* Save tile size, with border */ tr->CurrentTileWidth = tileWidth; tr->CurrentTileHeight = tileHeight; glViewport(0, 0, tileWidth, tileHeight); /* tile size including border */ /* save current matrix mode */ glGetIntegerv(GL_MATRIX_MODE, &matrixMode); glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* compute projection parameters */ left = tr->Left + (tr->Right - tr->Left) * (tr->CurrentColumn * tr->TileWidthNB - border) / tr->ImageWidth; right = left + (tr->Right - tr->Left) * tileWidth / tr->ImageWidth; bottom = tr->Bottom + (tr->Top - tr->Bottom) * (tr->CurrentRow * tr->TileHeightNB - border) / tr->ImageHeight; top = bottom + (tr->Top - tr->Bottom) * tileHeight / tr->ImageHeight; if (tr->Perspective) glFrustum(left, right, bottom, top, tr->Near, tr->Far); else glOrtho(left, right, bottom, top, tr->Near, tr->Far); /* restore user's matrix mode */ glMatrixMode(matrixMode); } int trEndTile(TRcontext *tr) { GLint prevRowLength, prevSkipRows, prevSkipPixels, prevAlignment; if (!tr) return 0; ASSERT(tr->CurrentTile>=0); /* be sure OpenGL rendering is finished */ glFlush(); /* save current glPixelStore values */ glGetIntegerv(GL_PACK_ROW_LENGTH, &prevRowLength); glGetIntegerv(GL_PACK_SKIP_ROWS, &prevSkipRows); glGetIntegerv(GL_PACK_SKIP_PIXELS, &prevSkipPixels); glGetIntegerv(GL_PACK_ALIGNMENT, &prevAlignment); if (tr->TileBuffer) { GLint srcX = tr->TileBorder; GLint srcY = tr->TileBorder; GLint srcWidth = tr->TileWidthNB; GLint srcHeight = tr->TileHeightNB; glReadPixels(srcX, srcY, srcWidth, srcHeight, tr->TileFormat, tr->TileType, tr->TileBuffer); } if (tr->ImageBuffer) { GLint srcX = tr->TileBorder; GLint srcY = tr->TileBorder; GLint srcWidth = tr->CurrentTileWidth - 2 * tr->TileBorder; GLint srcHeight = tr->CurrentTileHeight - 2 * tr->TileBorder; GLint destX = tr->TileWidthNB * tr->CurrentColumn; GLint destY = tr->TileHeightNB * tr->CurrentRow; /* setup pixel store for glReadPixels */ glPixelStorei(GL_PACK_ROW_LENGTH, tr->ImageWidth); glPixelStorei(GL_PACK_SKIP_ROWS, destY); glPixelStorei(GL_PACK_SKIP_PIXELS, destX); glPixelStorei(GL_PACK_ALIGNMENT, 1); /* read the tile into the final image */ glReadPixels(srcX, srcY, srcWidth, srcHeight, tr->ImageFormat, tr->ImageType, tr->ImageBuffer); } /* restore previous glPixelStore values */ glPixelStorei(GL_PACK_ROW_LENGTH, prevRowLength); glPixelStorei(GL_PACK_SKIP_ROWS, prevSkipRows); glPixelStorei(GL_PACK_SKIP_PIXELS, prevSkipPixels); glPixelStorei(GL_PACK_ALIGNMENT, prevAlignment); /* increment tile counter, return 1 if more tiles left to render */ tr->CurrentTile++; if (tr->CurrentTile >= tr->Rows * tr->Columns) { /* restore user's viewport */ glViewport(tr->ViewportSave[0], tr->ViewportSave[1], tr->ViewportSave[2], tr->ViewportSave[3]); tr->CurrentTile = -1; /* all done */ return 0; } else return 1; } /* * Replacement for glRastePos3f() which avoids the problem with invalid * raster pos. */ void trRasterPos3f(TRcontext *tr, GLfloat x, GLfloat y, GLfloat z) { if (tr->CurrentTile<0) { /* not doing tile rendering right now. Let OpenGL do this. */ glRasterPos3f(x, y, z); } else { GLdouble modelview[16], proj[16]; GLint viewport[4]; GLdouble winX, winY, winZ; /* Get modelview, projection and viewport */ glGetDoublev(GL_MODELVIEW_MATRIX, modelview); glGetDoublev(GL_PROJECTION_MATRIX, proj); viewport[0] = 0; viewport[1] = 0; viewport[2] = tr->CurrentTileWidth; viewport[3] = tr->CurrentTileHeight; /* Project object coord to window coordinate */ if (gluProject(x, y, z, modelview, proj, viewport, &winX, &winY, &winZ)){ /* set raster pos to window coord (0,0) */ glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0.0, tr->CurrentTileWidth, 0.0, tr->CurrentTileHeight, 0.0, 1.0); glRasterPos3f(0.0, 0.0, -winZ); /* Now use empty bitmap to adjust raster position to (winX,winY) */ { GLubyte bitmap[1] = {0}; glBitmap(1, 1, 0.0, 0.0, winX, winY, bitmap); } /* restore original matrices */ glPopMatrix(); /*proj*/ glMatrixMode(GL_MODELVIEW); glPopMatrix(); } } } 3Depict-0.0.19/src/gl/glDebug.h0000644000175000017500000000503312716174467015413 0ustar pcuserpcuser/* * glDebug.h - opengl debugging routines * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef GLDEBUG_H #define GLDEBUG_H //OpenGL debugging macro #if DEBUG #ifdef __APPLE__ #include #else #include #endif #include #define glError() { \ GLenum err = glGetError(); \ while (err != GL_NO_ERROR) { \ fprintf(stderr, "glError: %s caught at %s:%u\n", (char *)gluErrorString(err), __FILE__, (unsigned int)__LINE__); \ err = glGetError(); \ } \ } inline int glCurStackDepth(int stackDepthSelector) { ASSERT(stackDepthSelector == GL_MODELVIEW_STACK_DEPTH || stackDepthSelector == GL_PROJECTION_STACK_DEPTH || stackDepthSelector == GL_TEXTURE_STACK_DEPTH ); int gldepthdebug; glGetIntegerv (stackDepthSelector,&gldepthdebug); return gldepthdebug; } #define glStackDepths() { \ std::cerr << "OpenGL Stack Depths: ModelV:" \ << glCurStackDepth(GL_MODELVIEW_STACK_DEPTH) << " Pr: "\ << glCurStackDepth(GL_PROJECTION_STACK_DEPTH) << " Tex:" \ << glCurStackDepth(GL_TEXTURE_STACK_DEPTH) << std::endl;} inline void glPrintMatrix(int matrixMode ) { ASSERT(matrixMode == GL_PROJECTION_MATRIX || matrixMode == GL_MODELVIEW_MATRIX || matrixMode == GL_TEXTURE_MATRIX ); //Record old matrix mode, // then switch to new stack and retrieve the top float f[16]; { GLint oldMode; glGetIntegerv( GL_MATRIX_MODE, &oldMode); std::map remapMode; remapMode[GL_PROJECTION_MATRIX ] = GL_PROJECTION; remapMode[GL_MODELVIEW_MATRIX ] = GL_MODELVIEW; remapMode[GL_TEXTURE_MATRIX] = GL_TEXTURE; glMatrixMode (remapMode[matrixMode]); //retrieve glGetFloatv( matrixMode , f); glMatrixMode(oldMode); } std::cerr << "[ "; for(size_t ui=0; ui <4 ; ui++) { for(size_t uj=0;uj<4; uj++) { std::cerr << f[ui*4 + uj] << "\t" ; } if(ui !=3) std::cerr << std::endl; } std::cerr << " ] " << std::endl; } #else #define glStackDepths() #define glError() #endif #endif 3Depict-0.0.19/src/gl/effect.h0000644000175000017500000001242512640746376015301 0ustar pcuserpcuser/* * effect.h - opengl 3D effects header * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef EFFECT_H #define EFFECT_H #ifdef ATTRIBUTE_PRINTF #pragma push_macro("ATTRIBUTE_PRINTF") #include #pragma pop_macro(" ATTRIBUTE_PRINTF") #else #include #undef ATTRIBUTE_PRINTF #endif #include "cameras.h" //opengl allows up to 6 clipping planes const unsigned int MAX_OPENGL_CLIPPLANES=6; //Effect IDs enum { EFFECT_BOX_CROP=0, EFFECT_ANAGLYPH, EFFECT_ENUM_END }; enum{ //Colour mask methods ANAGLYPH_REDBLUE, ANAGLYPH_REDGREEN, ANAGLYPH_REDCYAN, ANAGLYPH_GREENMAGENTA, //Colour matrix +accumulation buffer methods ANAGLYPH_HALF_COLOUR, ANAGLYPH_MIXED, ANAGLYPH_ENUM_END //Not a method. end of enum }; class Effect { protected: static Camera *curCam; static BoundCube bc; unsigned int effectType; public: Effect(); virtual ~Effect() {}; virtual Effect *clone() const = 0; virtual void enable(unsigned int pass=0) const =0; virtual void disable() const=0; std::string getName() const; //Write the effect's state information to file virtual bool writeState(std::ofstream &f, unsigned int format, unsigned int depth) const=0; //read the effects state information from an XML file // Should be pointing to the top-level of effect element (eg ) virtual bool readState(xmlNodePtr n)=0; virtual bool needCamUpdate() const { return false;} //!Returns true if the effect has any influence on the output virtual bool willDoSomething() const=0; virtual unsigned int numPassesNeeded() const { return 1;} virtual unsigned int getType() const { return effectType;}; static void setCurCam(Camera *c) {curCam=c;} static void setBoundingCube(const BoundCube &c) {bc=c;} }; class BoxCropEffect : public Effect { private: //controlling ID values for gl plane. No more than MAX_OPENGL_CLIPPLANES allowed unsigned int openGLIdStart,openGLIdEnd; //Cropping margins (Fraction from edge towards opposite edge (complete)). 0->1. //Opposing edges must sum to 0->1. (xLo,xHi,yLo...) float cropFractions[6]; //!True if we should transform to camera coordinates before applying crop bool useCamCoordinates; //!Aspect ratio of output image float outputAspect; void doClip(const Point3D &origin, const Point3D & normal,unsigned int glOffset) const; public: BoxCropEffect(); virtual ~BoxCropEffect(){}; //Duplicate thi Effect *clone() const; //!Enable the clipping plane. Values *must* be set before calling void enable(unsigned int pass) const; //!DIsable the clipping plane void disable() const; //Write the effect's state information to file bool writeState(std::ofstream &f, unsigned int format, unsigned int depth) const; //read the effects state information from an XML file bool readState(xmlNodePtr n); //!Returns true if the effect has any influence on the output bool willDoSomething() const; //!Set the fractions of cube from margin //-- there should be 6 floats (x,y,z)_(low,high) (x_lo, x_hi....) // each low/hi should form a sum between 0 and 1. void setFractions(const float *fractionArray); void useCamCoords(bool enable){useCamCoordinates=enable;}; //!Alters the input box to generate cropping bounding box //note the box may be inside out if the cropping limits //exceed themselves.. void getCroppedBounds(BoundCube &b) const; float getCropValue(unsigned int pos) const; }; class AnaglyphEffect : public Effect { private: unsigned int colourMode; bool eyeFlip; mutable Camera *oldCam; float baseShift; public: AnaglyphEffect(); ~AnaglyphEffect(){}; //Duplicate thi Effect *clone() const; //!Enable the clipping plane. Values *must* be set before calling void enable(unsigned int pass) const; //!DIsable the clipping plane void disable() const; //Write the effect's state information to file bool writeState(std::ofstream &f, unsigned int format, unsigned int depth) const; //read the effects state information from an XML file bool readState(xmlNodePtr n); //!Whether we should be flipping the lens from its hard-coded left-right void setFlip(bool shouldFlip) {eyeFlip=shouldFlip;}; void setMode(unsigned int mode); void setBaseShift(float shift) { baseShift=shift;}; bool needCamUpdate() const { return true;} //!Returns true if the effect has any influence on the output bool willDoSomething() const {return true;}; virtual unsigned int numPassesNeeded() const { return 2;} float getBaseShift() const { return baseShift;}; unsigned int getMode() const { return colourMode;}; }; Effect *makeEffect(unsigned int effectID); Effect *makeEffect(const std::string &s); #endif 3Depict-0.0.19/src/gl/cameras.h0000644000175000017500000001756712716174467015474 0ustar pcuserpcuser/* * cameras.h - 3D cameras for opengl * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef CAMERAS_H #define CAMERAS_H #include "common/basics.h" //libxml2 headers #ifdef ATTRIBUTE_PRINTF #pragma push_macro("ATTRIBUTE_PRINTF") #include #pragma pop_macro(" ATTRIBUTE_PRINTF") #else #include #undef ATTRIBUTE_PRINTF #endif enum CAM_ENUM { CAM_FREE=1, CAM_LOOKAT }; enum { PROJECTION_MODE_PERSPECTIVE, PROJECTION_MODE_ORTHOGONAL, PROJECTION_MODE_ENUM_END //not a valid mode. }; //!Key types for property setting and getting properties enum { CAMERA_KEY_LOOKAT_LOCK, CAMERA_KEY_LOOKAT_ORIGIN, CAMERA_KEY_LOOKAT_TARGET, CAMERA_KEY_LOOKAT_UPDIRECTION, CAMERA_KEY_LOOKAT_FOV, CAMERA_KEY_LOOKAT_PROJECTIONMODE, CAMERA_KEY_LOOKAT_ORTHOSCALE }; //visible direction enum enum { CAMERA_DIR_ZPLUS, //0 CAMERA_DIR_YMINUS, //1 CAMERA_DIR_YPLUS, //2 CAMERA_DIR_XPLUS, //3 CAMERA_DIR_ZMINUS, //4 CAMERA_DIR_XMINUS, //5 }; class CameraProperty { public: unsigned int type; unsigned int key; std::string data; std::string name; }; class CameraProperties { public: std::vector > props; void clear() { props.clear();}; void addGroup() {props.resize(props.size()+1);} void addEntry(CameraProperty &p) { ASSERT(props.size()); props.back().push_back(p);} }; //!An abstract base class for a camera class Camera { protected: bool lock; //!Camera location Point3D origin; //!Direction camera is looking in Point3D viewDirection; //!Up direction for camera (required to work out "roll") Point3D upDirection; //!Projection mode (otho, perspective...)_ unsigned int projectionMode; //!The current orthographic scaling float orthoScale; //!Type number unsigned int typeNum; //!user string, e.g. camera name std::string userString; public: //!constructor Camera(); //!Destructor virtual ~Camera(); //!Duplication routine. Must delete returned pointer manually. virtual Camera *clone() const=0; //!Streaming output operator, presents human readable text friend std::ostream &operator<<(std::ostream &stream, const Camera &); //!Return the origin of the camera Point3D getOrigin() const; //!Return the view direction for the camera Point3D getViewDirection() const; //!Return the up direction for the camera Point3D getUpDirection() const; //!return the projection mode unsigned int getProjectionMode() const{ return projectionMode;}; float getOrthoScale() const { return orthoScale; } //!Set the camera's position virtual void setOrigin(const Point3D &); //!set the direction that the camera looks towards void setViewDirection(const Point3D &); //!set the direction that the camera considers "up" void setUpDirection(const Point3D &); //!Set the user string void setUserString(const std::string &newString){ userString=newString;}; //!Get the user string std::string getUserString() const { return userString;}; //!Do a forwards "dolly",where the camera moves along its viewing axis. In ortho mode, instead of moving along axis, a scaling is performed virtual void forwardsDolly(float dollyAmount); //!Move the camera origin virtual void move(float leftRightAmount,float UpDownAmount); //!Move the camera origin virtual void translate(float leftRightAmount,float UpDownAmount); //!pivot the camera /* First pivots the camera around the across direction * second pivot sthe camera around the up direction */ virtual void pivot(float rollAroundAcross, float rollaroundUp); //!Roll around the view direction virtual void roll(float roll) =0; //!Applies the camera settings to openGL. Ensures the far planes //is set to make the whole scene visible virtual void apply(float outputRatio,const BoundCube &b,bool loadIdentity=true) const=0; //!Ensures that the given boundingbox should look nice, and be visible virtual void ensureVisible(const BoundCube &b, unsigned int face=3)=0; //!Obtain the properties specific to a camera virtual void getProperties(CameraProperties &p) const =0; //!Set the camera property from a key & string pair virtual bool setProperty(unsigned int key, const std::string &value) =0; unsigned int type() const {return typeNum;}; //!Write the state of the camera virtual bool writeState(std::ostream &f, unsigned int format, unsigned int tabs) const =0; //!Read the state of the camera from XML document virtual bool readState(xmlNodePtr nodePtr)=0; }; //!A perspective camera that looks at a specific location class CameraLookAt : public Camera { protected: //!Location for camera to look at Point3D target; void recomputeViewDirection(); //!Perspective FOV float fovAngle; //!Near clipping plane distance. float nearPlane; //!Far plane is computed on-the-fly. cannot be set directly. Oh no! mutable. gross! mutable float farPlane; //!Distort to the viewing frustum. (eg for stero) ( a frustum is a rectangular pyramid with the top cut off) float frustumDistortion; public: //!Constructor CameraLookAt(); //!Streaming output operator, presents human readable text friend std::ostream &operator<<(std::ostream &stream, const CameraLookAt &); //!clone function Camera *clone() const; //!Destructor virtual ~CameraLookAt(); //!Set the look at target void setOrigin(const Point3D &); //!Set the look at target void setTarget(const Point3D &); //!Get the look at target Point3D getTarget() const; //!Get the camera's FOV angle (full angle across) float getFOV() const {return fovAngle;} float getNearPlane() const { return nearPlane; } //!Applies the view transform void apply(float outAspect, const BoundCube &boundCube,bool loadIdentity=true) const; //!Only apply the look-at opengl transform void lookAt() const; //!Do a forwards "dolly",where the camera moves along its viewing axis void forwardsDolly(float dollyAmount); //!Move the camera origin void move(float leftRightAmount,float UpDownAmount); //!Simulate pivot of camera /* Actually I pivot by moving the target internally. */ void pivot(float lrRad,float udRad); void translate(float lrTrans, float udTrans); //Clockwise roll looking from camera view by rollRad radians void roll(float rollRad); //!Ensure that up direction is perpendicular to view direction void recomputeUpDirection(); void repositionAroundTarget(unsigned int direction); //!Ensure that the box is visible /*! Face is set by cube net 0 1 2 3 4 5 2 is the face directed to the +ve x axis, with the "up"" vector on the 3 aligned to z, so "0" is perpendicular to the Z axis and is "visible" */ virtual void ensureVisible(const BoundCube &b, unsigned int face=3); //!Return the user-settable properties of the camera void getProperties(CameraProperties &p) const; //!Set the camera property from a key & string pair bool setProperty(unsigned int key, const std::string &value); //!Write the state of the camera bool writeState(std::ostream &f, unsigned int format, unsigned int tabs=0) const; //!Read the state of the camera bool readState(xmlNodePtr nodePtr) ; float getViewWidth(float depth) const; void setFrustumDistort(float offset){frustumDistortion=offset;}; }; #endif 3Depict-0.0.19/src/gl/drawables.h0000644000175000017500000010107212716174467016006 0ustar pcuserpcuser/* * drawables.h - Opengl drawable objects header * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef DRAWABLES_H #define DRAWABLES_H //MacOS is "special" and puts it elsewhere #ifdef __APPLE__ #include #else #include #endif #include #include "textures.h" #include "cameras.h" #include "isoSurface.h" template class Voxels; //TODO: Work out if there is any way of obtaining the maximum //number of items that can be drawn in an opengl context //For now Max it out at 10 million (~120MB of vertex data) const size_t MAX_NUM_DRAWABLE_POINTS=10; //OK, the new FTGL is fucked up. It actually uses defines from //freetype as arguments to #includes. Weird. So this sequence is important #include #include enum { FTGL_BITMAP=0, FTGL_PIXMAP, FTGL_OUTLINE, FTGL_POLYGON, FTGL_EXTRUDE, FTGL_TEXTURE }; //!Text aligment modes for DrawGLText enum { DRAWTEXT_ALIGN_LEFT, DRAWTEXT_ALIGN_CENTRE, DRAWTEXT_ALIGN_RIGHT, DRAWTEXT_ALIGN_ENUM_END }; //!Primitve drawing mode. (wireframe/solid) enum { DRAW_WIREFRAME, DRAW_FLAT, DRAW_SMOOTH, DRAW_END_ENUM //Not a mode, just a marker to catch end-of-enum }; //!Axis styles enum { AXIS_IN_SPACE }; //!Drawable types enum { DRAW_TYPE_POINT, DRAW_TYPE_MANYPOINT, DRAW_TYPE_VECTOR, DRAW_TYPE_TRIANGLE, DRAW_TYPE_QUAD, DRAW_TYPE_SPHERE, DRAW_TYPE_CYLINDER, DRAW_TYPE_DISPLAYLIST, DRAW_TYPE_GLTEXT, DRAW_TYPE_2D_CIRCLE, DRAW_TYPE_RECTPRISM, DRAW_TYPE_COLOURBAR, DRAW_TYPE_TEXTUREDOVERLAY, DRAW_TYPE_ANIMATEDOVERLAY, DRAW_TYPE_FIELD3D, DRAW_TYPE_ISOSURFACE, DRAW_TYPE_AXIS, DRAW_TYPE_LEGENDOVERLAY, DRAW_TYPE_PROGRESSCIRCLE_OVERLAY, }; //TODO: It seems unnecessary to have multiple types for the bind //!Binding enums. Needed to bind drawable selection //to internal modification actions inside the drawable enum { DRAW_SPHERE_BIND_ORIGIN, DRAW_SPHERE_BIND_RADIUS, DRAW_VECTOR_BIND_ORIENTATION, DRAW_VECTOR_BIND_ORIGIN_ONLY, DRAW_VECTOR_BIND_ORIGIN, DRAW_VECTOR_BIND_TARGET, DRAW_CYLINDER_BIND_ORIGIN, DRAW_CYLINDER_BIND_DIRECTION, DRAW_CYLINDER_BIND_RADIUS, DRAW_RECT_BIND_TRANSLATE, DRAW_RECT_BIND_CORNER_MOVE, DRAW_TEXT_BIND_ORIGIN, DRAW_QUAD_BIND_ORIGIN, //DRAW_TEXT_BIND_TEXTDIR, //FIXME: Implement me for annotation todo. //DRAW_TEXT_BIND_UPDIR, DRAW_BIND_ENUM_END }; //!An abstract bas class for drawing primitives class DrawableObj { protected: //!Is the drawable active? bool active; //!Is the object changed since last set? bool haveChanged; //!Pointer to current scene camera static const Camera *curCamera; //Background colour static float backgroundR,backgroundG,backgroundB; //Pointer to texture pool object static TexturePool *texPool; static bool useAlphaBlend; //Size of the opengl window static unsigned int winX,winY; static float getHighContrastValue(); public: //!Can be selected from openGL viewport interactively? bool canSelect; //!Wants lighting calculations active during render? bool wantsLight; static void setUseAlphaBlending(bool willBlend) { useAlphaBlend =willBlend;} //!Is this an overlay? By default, no virtual bool isOverlay() const { return false;} //!Constructor DrawableObj(); //Obtain the type mask for this drawable virtual unsigned int getType() const =0; //Obtain a copy of this object, which is still valid // after destruction of the original // Disallowed by default Implement in derived object! //TODO: Once most sub-objects have this function, make pure virtual virtual DrawableObj *clone() const {ASSERT(false); return 0;} //!Do we need to do element based depth sorting? virtual bool needsDepthSorting() const { return false; } ; //!Can we break this object down into constituent elements? virtual bool isExplodable() const { return false;}; //!Break object down into simple elements virtual void explode(std::vector &simpleObjects); virtual bool hasChanged() const { return haveChanged; } //!Set the active state of the object void setActive(bool active); //!Pure virtual function - draw the object virtual void draw() const =0; //!Set if user can interact with object, needed for opengl hit testing void setInteract(bool canAct){canSelect=canAct;}; virtual void getBoundingBox(BoundCube &b) const = 0; //!Drawable destructor virtual ~DrawableObj(); //!If we offer any kind of external pointer interface; use this to do a recomputation as needed. This is needed for selection binding behaviour virtual void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode) {}; //!Set the current camera static void setCurCamera(const Camera *c){curCamera=c;}; //!Set the current camera static void setTexPool(TexturePool *t); static void clearTexPool(); //!Get the centre of the object. Only valid if object is simple virtual Point3D getCentroid() const ; static void setWindowSize(unsigned int x, unsigned int y){winX=x;winY=y;}; static void setBackgroundColour(float r, float g,float b) {backgroundR=r; backgroundG=g;backgroundB=b;} }; //A single point drawing class class DrawPoint : public DrawableObj { protected: //!Point origin Point3D origin; //!Point colour (r,g,b,a) range: [0.0f,1.0f] float r,g,b,a; public: //!Constructor DrawPoint(); //!Constructor that takes in positional argments DrawPoint(float,float,float); //!Destructor virtual ~DrawPoint(); unsigned int getType() const {return DRAW_TYPE_POINT;} virtual DrawableObj *clone() const; //!Sets the color of the point to be drawn void setColour(float r, float g, float b, float alpha); //!Draws the points void draw() const; //!Sets the location of the poitns void setOrigin(const Point3D &); void getBoundingBox(BoundCube &b) const { b.setInvalid();}; Point3D getCentroid() const{ return origin;} }; //!A point drawing class - for many points of same size & colour class DrawManyPoints : public DrawableObj { protected: //!Vector of points to draw std::vector pts; //!Point colours (r,g,b,a) range: [0.0f,1.0f] float r,g,b,a; //!Size of the point float size; mutable bool haveCachedBounds; mutable BoundCube cachedBounds; public: //!Constructor DrawManyPoints(); //!Destructor virtual ~DrawManyPoints(); virtual unsigned int getType() const {return DRAW_TYPE_MANYPOINT;}; virtual DrawableObj *clone() const; //!Swap out the internal vector with an extenal one void swap(std::vector &); //!Remove all points void clear(); //!Add points into the drawing vector void addPoints(const std::vector &); //!Add a single point into the drawing vector, at a particular offset // *must call resize first* void setPoint(size_t offset,const Point3D &); //!Reset the number of many points to draw void resize(size_t newSize); //! set the color of the points to be drawn void setColour(float r, float g, float b, float alpha); //!Set the display size of the drawn poitns void setSize(float); //!Draw the points void draw() const; //!Shuffle the points to remove anisotropic drawing effects. Thus must be done prior to draw call. void shuffle(); //!Get the bounding box that encapuslates this object void getBoundingBox(BoundCube &b) const; //!return number of points size_t getNumPts() const { return pts.size();}; }; //!Draw a vector class DrawVector: public DrawableObj { protected: //!Vector origin Point3D origin; Point3D vector; //!Do we draw the arrow head? bool drawArrow; //!Radius of tail of arrow float arrowSize; //!Scale arrow head by vector size bool scaleArrow; //!Whether to draw the arrow head at both ends bool doubleEnded; //!Vector colour (r,g,b,a) range: [0.0f,1.0f] float r,g,b,a; //!Size of "tail" line to draw float lineSize; public: //!Constructor DrawVector(); //!Destructor virtual ~DrawVector(); virtual DrawableObj *clone() const; virtual unsigned int getType() const {return DRAW_TYPE_VECTOR;}; //!Set if we want to draw the arrow or not void setDrawArrow(bool wantDraw) { drawArrow=wantDraw;} //!Sets the color of the point to be drawn void setColour(float r, float g, float b, float alpha); //!Draws the points void draw() const; //!Sets the location of the poitns void setOrigin(const Point3D &); //!Sets the location of the poitns void setVector(const Point3D &); //Set the start/end of vector in one go void setEnds(const Point3D &start, const Point3D &end); //Set to draw both ends void setDoubleEnded(bool wantDoubleEnd=true){doubleEnded=wantDoubleEnd;}; //!Gets the arrow axis direction Point3D getVector() const { return vector;}; //!Gets the arrow axis direction Point3D getOrigin() const{ return origin;}; //!Set the arrowhead size void setArrowSize(float size) { arrowSize=size;} //!Set the "tail" line size void setLineSize(float size) { lineSize=size;} void getBoundingBox(BoundCube &b) const; //!Recompute the internal parameters using the input vector information void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode); }; //! A single colour triangle class DrawTriangle : public DrawableObj { protected: //!The vertices of the triangle Point3D vertices[3]; Point3D vertNorm[3]; //!Colour data - red, green, blue, alpha float r,g,b,a; public: //!Constructor DrawTriangle(); //!Destructor virtual ~DrawTriangle(); virtual DrawableObj *clone() const; virtual unsigned int getType() const {return DRAW_TYPE_TRIANGLE;}; //!Set one of three vertices (0-2) locations void setVertex(unsigned int, const Point3D &); //!Set the vertex normals void setVertexNorm(unsigned int, const Point3D &); //!Set the colour of the triangle void setColour(float r, float g, float b, float a); //!Draw the triangle void draw() const; //!Get bounding cube void getBoundingBox(BoundCube &b) const { b.setBounds(vertices,3);} }; //!A smooth coloured quad /* According to openGL, the quad's vertices need not be coplanar, * but they must be convex */ class DrawQuad : public DrawableObj { protected: //!Vertices of the quad Point3D vertices[4]; //!Colour data for the quad //!The lighting normal of the triangle /*! Lighting for this class is per triangle only no * per vertex lighting */ Point3D normal; //!Colours of the vertices (rgba colour model) float r[4],g[4],b[4],a[4]; public: //!Constructor DrawQuad() {}; //!Destructor virtual ~DrawQuad() {}; virtual DrawableObj *clone() const; virtual unsigned int getType() const {return DRAW_TYPE_QUAD;}; //!Get bounding cube virtual void getBoundingBox(BoundCube &b) const ; //!sets the vertices to defautl colours (r g b and white ) for each vertex respectively void colourVerticies(); //!Set vertex's location void setVertex(unsigned int, const Point3D &); void setVertices(const Point3D *); //!Set the colour of a vertex void setColour(unsigned int, float r, float g, float b, float a); //!Set the colour of all vertices void setColour(float r, float g, float b, float a); //!Update the normal to the surface from vertices /*!Uses the first 3 vertices to calculate the normal. */ void calcNormal(); //!Draw the triangle void draw() const; //!Gets the arrow axis direction Point3D getOrigin() const; //!Recompute the internal parameters using the input vector information // i.e. this is used for (eg) mouse interaction void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode); }; class DrawTexturedQuad : public DrawQuad { private: //TODO: Move this back // into the texture pool unsigned char *textureData; size_t nX,nY; size_t channels; size_t displayMode; //FIXME: This should be non-mutable. We need // to move texture rebinding to a pre-processing step, not at draw time //ID of the texture to use when drawing, -1 if not bound // to opengl mutable unsigned int textureId; //!FTGL font instance FTFont *font; //disallow resetting base colour to white bool noColour; //we can only bind from the main thread. // this is true by default, until the texture is bound mutable bool needsBinding; public: DrawTexturedQuad(); ~DrawTexturedQuad(); DrawTexturedQuad(const DrawTexturedQuad &d); //Resize the texture contents, destroying any existing contents void resize(size_t nx, size_t nY, unsigned int nChannels); //Draw the texture void draw() const; //Set the specified pixel in the texture to this value void setData(size_t x, size_t y, unsigned char *entry); //Send the texture to the video card. void rebindTexture(unsigned int mode=GL_RGB) const; void setUseColouring(bool useColouring) {noColour= !useColouring;}; }; //!A sphere drawing class DrawSphere : public DrawableObj { protected: //!Pointer to the GLU quadric doohicker GLUquadricObj *q; //!Origin of the object Point3D origin; //!Colour data - rgba float r,g,b,a; //!Sphere radius float radius; //!Number of lateral and longitudinal segments unsigned int latSegments,longSegments; public: //!Default Constructor DrawSphere(); //! Destructor virtual ~DrawSphere(); virtual DrawableObj *clone() const; virtual unsigned int getType() const {return DRAW_TYPE_SPHERE;}; //!Sets the location of the sphere's origin void setOrigin(const Point3D &p); //!Gets the location of the sphere's origin Point3D getOrigin() const { return origin;}; //!Set the number of lateral segments void setLatSegments(unsigned int); //!Set the number of longitudinal segments void setLongSegments(unsigned int); //!Set the radius void setRadius(float); //!get the radius float getRadius() const { return radius;}; //!Set the colour (rgba) of the object void setColour(float r,float g,float b,float a); //!Draw the sphere void draw() const; //!Get the bounding box that encapuslates this object void getBoundingBox(BoundCube &b) const ; //!Recompute the internal parameters using the input vector information // i.e. this is used for (eg) mouse interaction void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode); }; //!A tapered cylinder drawing class class DrawCylinder : public DrawableObj { protected: //!Pointer to quadric, required for glu. Note the caps are defined as well GLUquadricObj *q,*qCap[2]; //!Colours for cylinder float r,g,b,a; //!Cylinder start and end radii float radius; //!Length of the cylinder float length; //!Origin of base and direction of cylinder Point3D origin, direction; //!number of sectors (pie slices) unsigned int slices; //!number of vertical slices (should be 1 if endradius equals start radius unsigned int stacks; //!Do we lock the drawing to only use the first radius? bool radiiLocked; public: //!Constructor DrawCylinder(); //!Destructor virtual ~DrawCylinder(); virtual unsigned int getType() const {return DRAW_TYPE_CYLINDER;}; //!Set the location of the base of the cylinder void setOrigin(const Point3D &pt); //!Number of cuts perpendicular to axis - ie disks void setSlices(unsigned int i); //!Number of cuts along axis - ie segments void setStacks(unsigned int i); //!Gets the location of the origin Point3D getOrigin() const { return origin;}; //!Gets the cylinder axis direction Point3D getDirection() const{ return direction;}; //!Set end radius void setRadius(float val); //!get the radius float getRadius() const { return radius;}; //!Set the orientation of cylinder void setDirection(const Point3D &pt); //!Set the length of cylinder void setLength(float len); //!Set the color of the cylinder void setColour(float r,float g,float b,float a); //!Draw the clyinder void draw() const; //!Get the bounding box that encapuslates this object void getBoundingBox(BoundCube &b) const ; //!Recompute the internal parameters using the input vector information void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode); virtual bool needsDepthSorting() const; //!Lock (or unlock) the radius to the start radius (i.e. synch the two) void lockRadii(bool doLock=true) {radiiLocked=doLock;}; }; //!Drawing mode enumeration for scalar field enum { VOLUME_POINTS=0 }; //!A display list generating class /*! This class allows for the creation of display lists for openGL objects * You can use this class to create a display list which will allow you to * reference cached openGL calls already stored in the video card. * This can be used to reduce the overhead in the drawing routines */ class DrawDispList : public DrawableObj { private: //!Static variable for the next list number to generate unsigned int listNum; //!True if the list is active (collecting/accumulating) bool listActive; //!Bounding box of objects in display list BoundCube boundBox; public: //!Constructor DrawDispList(); //!Destructor virtual ~DrawDispList(); virtual unsigned int getType() const {return DRAW_TYPE_DISPLAYLIST;} //!Execute the display list void draw() const; //!Set it such that many openGL calls map to the display list. /*!If "execute" is true, the commands will be excuted after * accumulating the display list buffer * For a complete list of which calls map to the dispaly list, * see the openGL spec, "Display lists" */ bool startList(bool execute); //!Add a drawable object - list MUST be active /* If the list is not active, this will simply exectue * the draw function of the drawable */ void addDrawable(const DrawableObj *); //!Close the list - this *will* clear the gl error system bool endList(); //!Get bounding cube void getBoundingBox(BoundCube &b) const { b=boundBox;} }; //!A class to draw text obects using FTGL /*May not be the best way to do this. * MIght be better to have static instances * of each possible type of font, then * render the text appropriately */ class DrawGLText : public DrawableObj { private: //!FTGL font instance FTFont *font; //!Font string std::string fontString; //!Current font mode unsigned int curFontMode; //!Text string std::string strText; //!Origin of text Point3D origin; //!Alignment mode unsigned int alignMode; //!Colours for text float r,g,b,a; //Two vectors required to define //these should always give a dot prod of //zero //!Up direction for text Point3D up; //!Text flow direction Point3D textDir; //!Direction for which text should be legible /*! This will ensure that the text is legible from * the direction being pointed to by normal. It is * not the true normal of the quad. as the origin and the * up direction specify some of that data already */ Point3D readDir; //!True if no erro bool isOK; //!Ensure that the text is never mirrored from view direction bool ensureReadFromNorm; public: //!Constructor (font file & text mode) /* Valid font types are FTGL_x where x is * BITMAP * PIXMAP * OUTLINE * POLYGON * EXTRUDE * TEXTURE */ DrawGLText(std::string fontFile, unsigned int ftglTextMode); DrawGLText(const DrawGLText &other); //!Destructor virtual ~DrawGLText(); virtual unsigned int getType() const {return DRAW_TYPE_GLTEXT;} //!Set the size of the text (in points (which may be GL units, //unsure)) inline void setSize(unsigned int size) {if(isOK){font->FaceSize(size);}}; //!Set the depth of the text (in points, may be GL units, unsure) inline void setDepth(unsigned int depth) {if(isOK){font->Depth(depth);}}; //!Returs true if the class data is good inline bool ok() const {return isOK;}; //!Set the text string to be displayed inline void setString(const std::string &str) {strText=str;}; //!Render the text string void draw() const; //!Set the up direction for the text /*!Note that this must be orthogonal to * the reading direction */ inline void setUp(const Point3D &p) { up=p;up.normalise();}; //!Set the origin inline void setOrigin(const Point3D &p) { origin=p;}; //!Set the reading direction /*!The reading direction is the direction * from which the text should be legible * This direction is important only if ensureReadFromNorm * is set */ inline void setReadDir(const Point3D &p) { readDir=p;}; //!Set the text flow direction /*! This *must* be orthogonal to the up vector * i.e. forms a right angle with */ inline void setTextDir(const Point3D &p) {textDir=p;textDir.normalise();} //!Return the location of the lower-left of the text inline Point3D getOrigin() const {return origin;}; inline void setReadFromNorm(bool b) {ensureReadFromNorm=b;} //!Set the colour (rgba) of the object void setColour(float r,float g,float b,float a); //!Get the bounding box for the text void getBoundingBox(BoundCube &b) const; //!Set the text alignment (default is left) void setAlignment(unsigned int mode); //Binding parameter recomputation void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode); }; //!A class to draw rectangluar prisms class DrawRectPrism : public DrawableObj { private: //!Drawing mode, (line or surface); unsigned int drawMode; //!Colours for prism float r,g,b,a; //!Lower left and upper right of box Point3D pMin, pMax; //!Thickness of line float lineWidth; public: DrawRectPrism(); ~DrawRectPrism(); virtual unsigned int getType() const {return DRAW_TYPE_RECTPRISM;} virtual DrawableObj *clone() const; //!Draw object void draw() const; //!Set the draw mode void setDrawMode(unsigned int n) { drawMode=n;}; //!Set colour of box void setColour(float rnew, float gnew, float bnew, float anew=1.0f); //!Set thickness of box void setLineWidth(float lineWidth); //!Set up box as axis-aligned rectangle using two points void setAxisAligned(const Point3D &p1,const Point3D &p2); //!Set up box as axis-aligned rectangle using bounding box void setAxisAligned(const BoundCube &b); void getBoundingBox(BoundCube &b) const; //!Recompute the internal parameters using the input vector information void recomputeParams(const std::vector &vecs, const std::vector &scalars, unsigned int mode); }; struct RGBFloat { float v[3]; }; //Abstract class as base for overlays class DrawableOverlay : public DrawableObj { protected: //alpha (transparancy) value float a; //!Height and width of overlay (total) float height,width; //Fractional coordinates for the top left of the overlay float position[2]; public: DrawableOverlay() {} ; //Declared as pure virtual to force ABC virtual ~DrawableOverlay() =0; void setAlpha(float alpha) { a=alpha;}; void setSize(float widthN, float heightN) {height=heightN, width=widthN;} void setSize(float size) {width=height=size;}; void setPosition(float newTLX,float newTLY) { position[0]=newTLX; position[1]=newTLY;} void getBoundingBox(BoundCube &b) const {b.setInvalid();}; //!This is an overlay bool isOverlay() const {return true;}; }; class DrawColourBarOverlay : public DrawableOverlay { private: FTFont *font; //!Colours for each element std::vector rgb; //!Minimum and maximum values for the colour bar (for ticks) float min,max; public: DrawColourBarOverlay(); DrawColourBarOverlay(const DrawColourBarOverlay &o); ~DrawColourBarOverlay(){delete font;}; virtual DrawableObj *clone() const; virtual unsigned int getType() const {return DRAW_TYPE_COLOURBAR;} void setColourVec(const std::vector &r, const std::vector &g, const std::vector &b); //!Draw object void draw() const; void setMinMax(float minNew,float maxNew) { min=minNew;max=maxNew;}; }; //!A class to hande textures to draw class DrawTexturedQuadOverlay : public DrawableOverlay { private: unsigned int textureId; bool textureOK; public: DrawTexturedQuadOverlay(); ~DrawTexturedQuadOverlay(); virtual unsigned int getType() const {return DRAW_TYPE_TEXTUREDOVERLAY;} static void setWindowSize(unsigned int x, unsigned int y){winX=x;winY=y;}; //!Set the texture by name bool setTexture(const char *textureFile); //!Draw object void draw() const; }; //!Multi-frame texture - Animated overlay class DrawAnimatedOverlay : public DrawableOverlay { private: //ID of the texture to use when drawing, -1 if not bound // to opengl unsigned int textureId; timeval animStartTime; bool textureOK; //Time delta before repeating animation float repeatInterval; //Time before showing the image float delayBeforeShow; //Time for fadein after show float fadeIn; protected: void getAnimationStat(float &alpha, float &deltaTime) const; public: DrawAnimatedOverlay(); ~DrawAnimatedOverlay(); virtual unsigned int getType() const {return DRAW_TYPE_ANIMATEDOVERLAY;} //Set the time between repeats for the animation void setRepeatTime(float timeV) { repeatInterval=timeV;} //Set the time before the texture appears void setShowDelayTime(float showDelayTime) { ASSERT(showDelayTime >=0.0f); delayBeforeShow = showDelayTime;} //Set the time during which the alpha value will be ramped up. // activated after the delay time (ie time before 100% visible is fadeInTime + // delayTime. void setFadeInTime(float fadeInTime) { ASSERT(fadeInTime >=0.0f); fadeIn=fadeInTime;} //!Set the texture by name bool setTexture(const std::vector &textureFiles, float timeRepeat=1.0f); void resetTime() ; //!Draw object void draw() const; bool isOK() const { return textureOK; } }; //!Draw a progress (segments with completion) overlay class DrawProgressCircleOverlay : public DrawAnimatedOverlay { //Shows the progress of K filters, each with M steps, and each // step has a (0-100) progress. Result is drawn as filled arcs. // Each filter is one arc, and this is divided into steps. // each step then fills up private: //Progress in the current step, range [0,100] unsigned int stepProgress; //Number of steps in process unsigned int maxStep; //The step that we are currently in unsigned int step; //Number of filters that are to be analysed unsigned int totalFilters; //Filter that we are analysing (0->n-1) unsigned int curFilter; //Draw a 2D wheel shaped section. Complete variable toggles the style of the drawing from a completed, to a n incompleted segment void drawSection(unsigned int degreeStep, float rIn, float rOut,float startTheta, float stopTheta, bool complete) const; public: DrawProgressCircleOverlay(); ~DrawProgressCircleOverlay(); void setCurFilter(unsigned int v) { curFilter= v;} void setMaxStep(unsigned int v) { maxStep= v;} void setNumFilters(unsigned int v) { totalFilters= v;} void setProgress(unsigned int newProg) { ASSERT(newProg <=100); stepProgress = newProg;} void setStep(unsigned int v) { ASSERT(v<=maxStep); step= v;} void reset(); static void setWindowSize(unsigned int x, unsigned int y){winX=x;winY=y;}; virtual unsigned int getType() const {return DRAW_TYPE_PROGRESSCIRCLE_OVERLAY;} void draw() const; }; class DrawPointLegendOverlay : public DrawableOverlay { private: static bool quadSet; FTFont *font; //Items to draw n overlay, and colour to use to draw std::vector > legendItems; bool enabled; public: DrawPointLegendOverlay(); ~DrawPointLegendOverlay(); DrawPointLegendOverlay(const DrawPointLegendOverlay &); DrawableObj *clone() const; virtual unsigned int getType() const {return DRAW_TYPE_LEGENDOVERLAY;} void draw() const; void clear(); void addItem(const std::string &s, float r, float g, float b); }; struct RGBThis { unsigned char v[3]; }; //!This class allows for the visualisation of 3D scalar fields class DrawField3D : public DrawableObj { private: mutable std::vector > ptsCache; mutable bool ptsCacheOK; protected: //!Alpha transparancy of objects in field float alphaVal; //!Size of points in the field - //only meaningful if the render mode is set to alpha blended points float pointSize; //!True if the scalar field's bounding box is to be drawn bool drawBoundBox; //!Colours for the bounding boxes float boxColourR,boxColourG,boxColourB,boxColourA; //!True if volume grid is enabled bool volumeGrid; //!Colour map lower and upper bounds float colourMapBound[2]; //!Which colourmap to use unsigned int colourMapID; //!Sets the render mode for the 3D volume /* Possible modes * 0: Alpha blended points */ unsigned int volumeRenderMode; //!The scalar field - used to store data values const Voxels *field; public: //!Default Constructor DrawField3D(); //!Destructor virtual ~DrawField3D(); virtual unsigned int getType() const {return DRAW_TYPE_FIELD3D;} //!Get the bounding box for this object void getBoundingBox(BoundCube &b) const; //!Set the render mode (see volumeRenderMode variable for details) void setRenderMode(unsigned int); //!Set the field pointer void setField(const Voxels *field); //!Set the alpha value for elemnts void setAlpha(float alpha); //!Set the colour bar minima and maxima from current field values void setColourMinMax(); //!Set the colourMap ID void setColourMapID(unsigned int i){ colourMapID=i;}; //!Render the field void draw() const; //!Set the size of points void setPointSize(float size); //!Set the colours that ar ebeing used in the tempMap void setMapColours(unsigned int map); //!Set the coour of the bounding box void setBoxColours(float r, float g, float b, float a); }; class DrawIsoSurface: public DrawableObj { private: mutable bool cacheOK; //!should we draw the thing // - in wireframe // -Flat // -Smooth // unsigned int drawMode; //!Isosurface scalar threshold float threshold; Voxels *voxels; mutable std::vector mesh; //!Warning. Although I declare this as const, I do some naughty mutating to the cache. void updateMesh() const; //!Point colour (r,g,b,a) range: [0.0f,1.0f] float r,g,b,a; public: DrawIsoSurface(); ~DrawIsoSurface(); virtual unsigned int getType() const {return DRAW_TYPE_ISOSURFACE;} //!Transfer ownership of data pointer to class void swapVoxels(Voxels *v); //!Set the drawing method //Draw void draw() const; //!Set the isosurface value void setScalarThresh(float thresh) { threshold=thresh;cacheOK=false;mesh.clear();}; //!Get the bouding box (of the entire scalar field) void getBoundingBox(BoundCube &b) const ; //!Sets the color of the point to be drawn void setColour(float rP, float gP, float bP, float alpha) { r=rP;g=gP;b=bP;a=alpha;} ; //!Do we need depth sorting? bool needsDepthSorting() const; }; class DrawAxis : public DrawableObj { private: //!Drawing style unsigned int style; Point3D position; //!size float size; public: DrawAxis(); ~DrawAxis(); virtual unsigned int getType() const {return DRAW_TYPE_AXIS;} virtual DrawableObj *clone() const; //!Draw object void draw() const; void setStyle(unsigned int style); void setSize(float newSize); void setPosition(const Point3D &p); void getBoundingBox(BoundCube &b) const; }; //Draw a 2D filled circle class Draw2DCircle : public DrawableObj { private: float centre[2]; float angularStep; float radius; //Circle colour float r,g,b; //Should the circle be drawn as an outline, or as a filled object bool filled; public: Draw2DCircle(); void result() const; //Obtain the type mask for this drawable virtual unsigned int getType() const; virtual DrawableObj *clone() const; virtual void getBoundingBox(BoundCube &b) const; virtual void draw() const; void setCentre(float fx,float fy) { centre[0] = fx; centre[1]= fy;}; void setRadius(float r) { radius=r;} //Angular step in radiians void setAngularStep(float da) { angularStep = da;}; void setColour(float rP, float gP, float bP) { r=rP;g=gP;b=bP;} ; }; #endif 3Depict-0.0.19/src/gl/textures.h0000644000175000017500000000524512640746376015732 0ustar pcuserpcuser/* * textures.h - Texture control classes header * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef TEXTURES_H #define TEXTURES_H #include "common/basics.h" #ifdef CreateDialog #undef CreateDialog #endif #ifdef Yield #undef Yield #endif #ifdef __APPLE__ #include #include #else #include #include #endif #include #include //Named Textures enum { TEXTURE_LEFT_CLICK=0, TEXTURE_TRANSLATE, TEXTURE_RIGHT_CLICK, TEXTURE_ROTATE, TEXTURE_MIDDLE_CLICK, TEXTURE_SCROLL_WHEEL, TEXTURE_ENLARGE, TEXTURE_CTRL, TEXTURE_COMMAND, TEXTURE_ALT, TEXTURE_TAB, TEXTURE_SHIFT }; //Paths to named textures extern const char *TEXTURE_OVERLAY_PNG[]; typedef struct { GLuint glID; /* OpenGL name assigned by by glGenTexture*/ GLuint width; GLuint height; GLuint depth; unsigned char *data; } texture; class TexturePool { private: //Filename of textures, or "" if using a generated texture, bound to the texture data std::vector > openTextures; public: TexturePool() {} ; ~TexturePool(); //Open the texture specified by the following file, and //then return the texture ID; or just return the texture //if already loaded. Return true on success. bool openTexture(const char *texName,unsigned int &texID); //Open a set of identically sized images into a 3D texture object bool openTexture3D(const std::vector &texName,unsigned int &texID); void genTexID(unsigned int &textureID, size_t texType=GL_TEXTURE_2D) ; //Close the specified texture, using its texture ID void closeTexture(unsigned int texID); //Close all textures void closeAll(); }; //!Type can be GL_TEXTURE_1D or GL_TEXTURE_2D int pngTexture(texture* dest, const char* filename, GLenum type); //Read a stack of equi-sized PNG images into a 3D opengl texture int pngTexture3D(texture*, const std::vector &filenames); //read a single PNG image as an opengl texture int pngTexture2D(texture*, const char*); int pngTexture1D(texture*, const char*); #endif 3Depict-0.0.19/src/Makefile.in0000644000175000017500000070344612723166303015335 0ustar pcuserpcuser# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = 3Depict$(EXEEXT) #Do we have or need windows-XP "resource" files for look and feel? @HAVE_WINDRES_TRUE@am__append_1 = 3Depict.rc @HAVE_WINDRES_TRUE@am__append_2 = 3Depict.rc.o subdir = src DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ftgl.m4 $(top_srcdir)/m4/gsl.m4 \ $(top_srcdir)/m4/wxwin.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__3Depict_SOURCES_DIST = 3Depict.cpp testing/testing.cpp \ wx/wxcommon.cpp wx/wxcomponents.cpp winconsole.cpp \ wx/propertyGridUpdater.cpp testing/testing.h wx/wxcommon.h \ wx/wxcomponents.h winconsole.h wx/propertyGridUpdater.h \ gui/mainFrame.cpp gui/mathglPane.cpp gui/cropPanel.cpp \ gui/glPane.cpp gui/dialogs/ExportPos.cpp \ gui/dialogs/ExportRngDialog.cpp gui/dialogs/prefDialog.cpp \ gui/dialogs/resolutionDialog.cpp gui/dialogs/StashDialog.cpp \ gui/dialogs/autosaveDialog.cpp \ gui/dialogs/filterErrorDialog.cpp \ gui/dialogs/animateFilterDialog.cpp \ gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp \ gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp \ gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp \ gui/dialogs/rangeEditDialog.cpp gui/mainFrame.h \ gui/mathglPane.h gui/cropPanel.h gui/art.h gui/glPane.h \ gui/dialogs/ExportPos.h gui/dialogs/ExportRngDialog.h \ gui/dialogs/prefDialog.h gui/dialogs/StashDialog.h \ gui/dialogs/resolutionDialog.h gui/dialogs/autosaveDialog.h \ gui/dialogs/filterErrorDialog.h \ gui/dialogs/animateFilterDialog.h \ gui/dialogs/animateSubDialogs/realKeyFrameDialog.h \ gui/dialogs/animateSubDialogs/colourKeyFrameDialog.h \ gui/dialogs/animateSubDialogs/stringKeyFrameDialog.h \ gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.h \ gui/dialogs/rangeEditDialog.h backend/filters/allFilter.cpp \ backend/filters/filterCommon.cpp backend/filters/dataLoad.cpp \ backend/filters/ionDownsample.cpp \ backend/filters/rangeFile.cpp backend/filters/voxelise.cpp \ backend/filters/spectrumPlot.cpp backend/filters/transform.cpp \ backend/filters/externalProgram.cpp \ backend/filters/ionClip.cpp backend/filters/ionColour.cpp \ backend/filters/boundingBox.cpp backend/filters/profile.cpp \ backend/filters/spatialAnalysis.cpp \ backend/filters/clusterAnalysis.cpp \ backend/filters/ionInfo.cpp backend/filters/annotation.cpp \ backend/filters/geometryHelpers.cpp \ backend/filters/algorithms/binomial.cpp \ backend/filters/algorithms/mass.cpp \ backend/filters/allFilter.h backend/filters/filterCommon.h \ backend/filters/dataLoad.h backend/filters/ionDownsample.h \ backend/filters/rangeFile.h backend/filters/voxelise.h \ backend/filters/spectrumPlot.h backend/filters/transform.h \ backend/filters/externalProgram.h backend/filters/ionClip.h \ backend/filters/ionColour.h backend/filters/boundingBox.h \ backend/filters/profile.h backend/filters/spatialAnalysis.h \ backend/filters/clusterAnalysis.h backend/filters/ionInfo.h \ backend/filters/annotation.h backend/filters/geometryHelpers.h \ backend/filters/algorithms/binomial.h \ backend/filters/algorithms/mass.h backend/animator.cpp \ backend/filtertreeAnalyse.cpp backend/filtertree.cpp \ backend/APT/ionhit.cpp backend/APT/APTFileIO.cpp \ backend/APT/APTRanges.cpp backend/APT/abundanceParser.cpp \ backend/APT/vtk.cpp backend/filters/algorithms/K3DTree.cpp \ backend/filters/algorithms/K3DTree-mk2.cpp backend/filter.cpp \ backend/filters/algorithms/rdf.cpp backend/viscontrol.cpp \ backend/state.cpp backend/plot.cpp backend/configFile.cpp \ backend/animator.h backend/filtertreeAnalyse.h \ backend/filtertree.h backend/APT/ionhit.h \ backend/APT/APTFileIO.h backend/APT/APTRanges.h \ backend/APT/abundanceParser.h backend/APT/vtk.h \ backend/filters/algorithms/K3DTree.h \ backend/filters/algorithms/K3DTree-mk2.h backend/filter.h \ backend/filters/algorithms/rdf.h backend/viscontrol.h \ backend/state.h backend/plot.h backend/configFile.h \ backend/tree.hh gl/scene.cpp gl/drawables.cpp gl/effect.cpp \ gl/textures.cpp gl/select.cpp gl/cameras.cpp gl/isoSurface.cpp \ gl/tr.cpp gl/scene.h gl/drawables.h gl/effect.h gl/textures.h \ gl/select.h gl/cameras.h gl/isoSurface.h gl/tr.h gl/glDebug.h \ common/pngread.c common/stringFuncs.cpp common/constants.cpp \ common/xmlHelper.cpp common/colourmap.cpp common/voxels.cpp \ common/mathfuncs.cpp common/basics.cpp common/assertion.cpp \ common/mesh.cpp common/gsl_helper.cpp common/pngread.h \ common/stringFuncs.h common/constants.h common/xmlHelper.h \ common/colourmap.h common/mathfuncs.h common/basics.h \ common/translation.h common/endianTest.h common/assertion.h \ common/voxels.h common/array2D.h common/mesh.h \ common/gsl_helper.h testing/mglTesting.cpp \ testing/mglTesting.h 3Depict.rc am__dirstamp = $(am__leading_dot)dirstamp am__objects_1 = 3Depict-3Depict.$(OBJEXT) \ testing/3Depict-testing.$(OBJEXT) \ wx/3Depict-wxcommon.$(OBJEXT) \ wx/3Depict-wxcomponents.$(OBJEXT) 3Depict-winconsole.$(OBJEXT) \ wx/3Depict-propertyGridUpdater.$(OBJEXT) am__objects_2 = am__objects_3 = gui/dialogs/3Depict-ExportPos.$(OBJEXT) \ gui/dialogs/3Depict-ExportRngDialog.$(OBJEXT) \ gui/dialogs/3Depict-prefDialog.$(OBJEXT) \ gui/dialogs/3Depict-resolutionDialog.$(OBJEXT) \ gui/dialogs/3Depict-StashDialog.$(OBJEXT) \ gui/dialogs/3Depict-autosaveDialog.$(OBJEXT) \ gui/dialogs/3Depict-filterErrorDialog.$(OBJEXT) \ gui/dialogs/3Depict-animateFilterDialog.$(OBJEXT) \ gui/dialogs/animateSubDialogs/3Depict-colourKeyFrameDialog.$(OBJEXT) \ gui/dialogs/animateSubDialogs/3Depict-stringKeyFrameDialog.$(OBJEXT) \ gui/dialogs/animateSubDialogs/3Depict-choiceKeyFrameDialog.$(OBJEXT) \ gui/dialogs/3Depict-rangeEditDialog.$(OBJEXT) am__objects_4 = gui/3Depict-mainFrame.$(OBJEXT) \ gui/3Depict-mathglPane.$(OBJEXT) \ gui/3Depict-cropPanel.$(OBJEXT) gui/3Depict-glPane.$(OBJEXT) \ $(am__objects_3) am__objects_5 = $(am__objects_2) am__objects_6 = backend/filters/3Depict-allFilter.$(OBJEXT) \ backend/filters/3Depict-filterCommon.$(OBJEXT) \ backend/filters/3Depict-dataLoad.$(OBJEXT) \ backend/filters/3Depict-ionDownsample.$(OBJEXT) \ backend/filters/3Depict-rangeFile.$(OBJEXT) \ backend/filters/3Depict-voxelise.$(OBJEXT) \ backend/filters/3Depict-spectrumPlot.$(OBJEXT) \ backend/filters/3Depict-transform.$(OBJEXT) \ backend/filters/3Depict-externalProgram.$(OBJEXT) \ backend/filters/3Depict-ionClip.$(OBJEXT) \ backend/filters/3Depict-ionColour.$(OBJEXT) \ backend/filters/3Depict-boundingBox.$(OBJEXT) \ backend/filters/3Depict-profile.$(OBJEXT) \ backend/filters/3Depict-spatialAnalysis.$(OBJEXT) \ backend/filters/3Depict-clusterAnalysis.$(OBJEXT) \ backend/filters/3Depict-ionInfo.$(OBJEXT) \ backend/filters/3Depict-annotation.$(OBJEXT) \ backend/filters/3Depict-geometryHelpers.$(OBJEXT) \ backend/filters/algorithms/3Depict-binomial.$(OBJEXT) \ backend/filters/algorithms/3Depict-mass.$(OBJEXT) am__objects_7 = backend/3Depict-animator.$(OBJEXT) \ backend/3Depict-filtertreeAnalyse.$(OBJEXT) \ backend/3Depict-filtertree.$(OBJEXT) \ backend/APT/3Depict-ionhit.$(OBJEXT) \ backend/APT/3Depict-APTFileIO.$(OBJEXT) \ backend/APT/3Depict-APTRanges.$(OBJEXT) \ backend/APT/3Depict-abundanceParser.$(OBJEXT) \ backend/APT/3Depict-vtk.$(OBJEXT) \ backend/filters/algorithms/3Depict-K3DTree.$(OBJEXT) \ backend/filters/algorithms/3Depict-K3DTree-mk2.$(OBJEXT) \ backend/3Depict-filter.$(OBJEXT) \ backend/filters/algorithms/3Depict-rdf.$(OBJEXT) \ backend/3Depict-viscontrol.$(OBJEXT) \ backend/3Depict-state.$(OBJEXT) backend/3Depict-plot.$(OBJEXT) \ backend/3Depict-configFile.$(OBJEXT) am__objects_8 = gl/3Depict-scene.$(OBJEXT) \ gl/3Depict-drawables.$(OBJEXT) gl/3Depict-effect.$(OBJEXT) \ gl/3Depict-textures.$(OBJEXT) gl/3Depict-select.$(OBJEXT) \ gl/3Depict-cameras.$(OBJEXT) gl/3Depict-isoSurface.$(OBJEXT) \ gl/3Depict-tr.$(OBJEXT) am__objects_9 = common/3Depict-pngread.$(OBJEXT) \ common/3Depict-stringFuncs.$(OBJEXT) \ common/3Depict-constants.$(OBJEXT) \ common/3Depict-xmlHelper.$(OBJEXT) \ common/3Depict-colourmap.$(OBJEXT) \ common/3Depict-voxels.$(OBJEXT) \ common/3Depict-mathfuncs.$(OBJEXT) \ common/3Depict-basics.$(OBJEXT) \ common/3Depict-assertion.$(OBJEXT) \ common/3Depict-mesh.$(OBJEXT) \ common/3Depict-gsl_helper.$(OBJEXT) am__objects_10 = testing/3Depict-mglTesting.$(OBJEXT) am__objects_11 = $(am__objects_1) $(am__objects_2) $(am__objects_4) \ $(am__objects_5) $(am__objects_6) $(am__objects_2) \ $(am__objects_7) $(am__objects_2) $(am__objects_8) \ $(am__objects_2) $(am__objects_9) $(am__objects_2) \ $(am__objects_10) $(am__objects_2) am_3Depict_OBJECTS = $(am__objects_11) $(am__objects_2) 3Depict_OBJECTS = $(am_3Depict_OBJECTS) am__DEPENDENCIES_1 = 3Depict_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__append_2) 3Depict_LINK = $(CXXLD) $(3Depict_CXXFLAGS) $(CXXFLAGS) \ $(3Depict_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(3Depict_SOURCES) DIST_SOURCES = $(am__3Depict_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEBUG_FLAGS = @DEBUG_FLAGS@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FREETYPE_CONFIG = @FREETYPE_CONFIG@ FTGL_CFLAGS = @FTGL_CFLAGS@ FTGL_LIBS = @FTGL_LIBS@ FT_INCLUDES = @FT_INCLUDES@ FT_LIBS = @FT_LIBS@ GETTEXT_LIBS = @GETTEXT_LIBS@ GL_LIBS = @GL_LIBS@ GREP = @GREP@ GSL_CFLAGS = @GSL_CFLAGS@ GSL_CONFIG = @GSL_CONFIG@ GSL_LIBS = @GSL_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MGL_CFLAGS = @MGL_CFLAGS@ MGL_LIBS = @MGL_LIBS@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ OPENMP_FLAGS = @OPENMP_FLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PNG_CFLAGS = @PNG_CFLAGS@ PNG_LIBS = @PNG_LIBS@ QHULL_CFLAGS = @QHULL_CFLAGS@ QHULL_LIBS = @QHULL_LIBS@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_RESCOMP = @WX_RESCOMP@ WX_VERSION = @WX_VERSION@ XMLCONFIG = @XMLCONFIG@ XML_CFLAGS = @XML_CFLAGS@ XML_LIBS = @XML_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ MSYS_PATH = /c/msys/1.0/local/include/ 3Depict_LDFLAGS = $(LDFLAGS) $(FT_LDFLAGS) $(GSL_LIBS) $(MGL_LIBS) 3Depict_CXXFLAGS = $(CXXFLAGS) $(FT_INCLUDES) $(FTGL_CFLAGS) $(WX_CPPFLAGS) \ $(GL_FLAGS) $(GSL_CFLAGS) $(MGL_CFLAGS) $(XML_CFLAGS) $(PNG_CFLAGS) \ $(OPENMP_FLAGS) $(DEBUG_FLAGS) -pipe 3Depict_CFLAGS = $(CFLAGS) $(FT_INCLUDES) $(FTGL_CFLAGS) \ $(XML_CFLAGS) $(GSL_CFLAGS) $(MGL_CFLAGS) $(PNG_CFLAGS) $(QHULL_CFLAGS) \ $(OPENMP_FLAGS) $(DEBUG_FLAGS) -pipe 3Depict_LDADD = $(LIBS) $(GETTEXT_LIBS) $(WX_LIBS) $(MGL_LIBS) \ $(FTGL_LIBS) $(FT_LIBS) $(XML_LIBS) $(GSL_LIBS) $(GL_LIBS) \ $(GLU_LIBS) $(QHULL_LIBS) $(PNG_LIBS) $(am__append_2) #------- Common header files for all sub-modules COMMON_SOURCE_FILES = common/pngread.c common/stringFuncs.cpp common/constants.cpp common/xmlHelper.cpp\ common/colourmap.cpp common/voxels.cpp common/mathfuncs.cpp common/basics.cpp common/assertion.cpp \ common/mesh.cpp common/gsl_helper.cpp COMMON_HEADER_FILES = common/pngread.h common/stringFuncs.h common/constants.h common/xmlHelper.h common/colourmap.h \ common/mathfuncs.h common/basics.h common/translation.h common/endianTest.h common/assertion.h common/voxels.h \ common/array2D.h common/mesh.h common/gsl_helper.h #----------- #------- "Backend" calculation files (non-ui) ---------- FILTER_FILES = backend/filters/allFilter.cpp backend/filters/filterCommon.cpp \ backend/filters/dataLoad.cpp backend/filters/ionDownsample.cpp \ backend/filters/rangeFile.cpp backend/filters/voxelise.cpp \ backend/filters/spectrumPlot.cpp backend/filters/transform.cpp \ backend/filters/externalProgram.cpp backend/filters/ionClip.cpp \ backend/filters/ionColour.cpp backend/filters/boundingBox.cpp \ backend/filters/profile.cpp backend/filters/spatialAnalysis.cpp \ backend/filters/clusterAnalysis.cpp backend/filters/ionInfo.cpp \ backend/filters/annotation.cpp backend/filters/geometryHelpers.cpp \ backend/filters/algorithms/binomial.cpp backend/filters/algorithms/mass.cpp FILTER_HEADER_FILES = backend/filters/allFilter.h backend/filters/filterCommon.h \ backend/filters/dataLoad.h backend/filters/ionDownsample.h \ backend/filters/rangeFile.h backend/filters/voxelise.h backend/filters/spectrumPlot.h \ backend/filters/transform.h backend/filters/externalProgram.h backend/filters/ionClip.h \ backend/filters/ionColour.h backend/filters/boundingBox.h \ backend/filters/profile.h backend/filters/spatialAnalysis.h \ backend/filters/clusterAnalysis.h backend/filters/ionInfo.h \ backend/filters/annotation.h backend/filters/geometryHelpers.h \ backend/filters/algorithms/binomial.h backend/filters/algorithms/mass.h BACKEND_SOURCE_FILES = backend/animator.cpp backend/filtertreeAnalyse.cpp backend/filtertree.cpp \ backend/APT/ionhit.cpp backend/APT/APTFileIO.cpp backend/APT/APTRanges.cpp backend/APT/abundanceParser.cpp \ backend/APT/vtk.cpp \ backend/filters/algorithms/K3DTree.cpp backend/filters/algorithms/K3DTree-mk2.cpp\ backend/filter.cpp backend/filters/algorithms/rdf.cpp \ backend/viscontrol.cpp backend/state.cpp backend/plot.cpp backend/configFile.cpp BACKEND_HEADER_FILES = backend/animator.h backend/filtertreeAnalyse.h backend/filtertree.h\ backend/APT/ionhit.h backend/APT/APTFileIO.h backend/APT/APTRanges.h backend/APT/abundanceParser.h \ backend/APT/vtk.h backend/filters/algorithms/K3DTree.h backend/filters/algorithms/K3DTree-mk2.h \ backend/filter.h backend/filters/algorithms/rdf.h \ backend/viscontrol.h backend/state.h backend/plot.h backend/configFile.h \ backend/tree.hh #------------ #------------ OpenGL interface files OPENGL_HEADER_FILES = gl/scene.h gl/drawables.h gl/effect.h gl/textures.h gl/select.h gl/cameras.h gl/isoSurface.h gl/tr.h gl/glDebug.h OPENGL_SOURCE_FILES = gl/scene.cpp gl/drawables.cpp gl/effect.cpp gl/textures.cpp gl/select.cpp gl/cameras.cpp gl/isoSurface.cpp gl/tr.cpp #------------ #------------ Frontend (linked to UI in some way) files --- DIALOG_SOURCE_FILES = gui/dialogs/ExportPos.cpp gui/dialogs/ExportRngDialog.cpp gui/dialogs/prefDialog.cpp \ gui/dialogs/resolutionDialog.cpp gui/dialogs/StashDialog.cpp \ gui/dialogs/autosaveDialog.cpp gui/dialogs/filterErrorDialog.cpp \ gui/dialogs/animateFilterDialog.cpp \ gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp \ gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp \ gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp \ gui/dialogs/rangeEditDialog.cpp DIALOG_HEADER_FILES = gui/dialogs/ExportPos.h gui/dialogs/ExportRngDialog.h gui/dialogs/prefDialog.h \ gui/dialogs/StashDialog.h gui/dialogs/resolutionDialog.h \ gui/dialogs/autosaveDialog.h gui/dialogs/filterErrorDialog.h \ gui/dialogs/animateFilterDialog.h \ gui/dialogs/animateSubDialogs/realKeyFrameDialog.h \ gui/dialogs/animateSubDialogs/colourKeyFrameDialog.h \ gui/dialogs/animateSubDialogs/stringKeyFrameDialog.h \ gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.h \ gui/dialogs/rangeEditDialog.h GUI_SOURCE_FILES = gui/mainFrame.cpp gui/mathglPane.cpp gui/cropPanel.cpp gui/glPane.cpp $(DIALOG_SOURCE_FILES) GUI_HEADER_FILES = gui/mainFrame.h gui/mathglPane.h gui/cropPanel.h gui/art.h gui/glPane.h $(DIALOG_HEADER_FILES) BASE_SOURCE_FILES = 3Depict.cpp testing/testing.cpp wx/wxcommon.cpp wx/wxcomponents.cpp winconsole.cpp wx/propertyGridUpdater.cpp BASE_HEADER_FILES = testing/testing.h wx/wxcommon.h wx/wxcomponents.h winconsole.h wx/propertyGridUpdater.h TEST_SOURCE_FILES = testing/mglTesting.cpp TEST_HEADER_FILES = testing/mglTesting.h #----------- SOURCE_FILES = $(BASE_SOURCE_FILES) $(BASE_HEADER_FILES) $(GUI_SOURCE_FILES) $(GUI_HEADER_FILES) \ $(FILTER_FILES) $(FILTER_HEADER_FILES) \ ${BACKEND_SOURCE_FILES} ${BACKEND_HEADER_FILES} $(OPENGL_SOURCE_FILES) $(OPENGL_HEADER_FILES) \ $(COMMON_SOURCE_FILES) $(COMMON_HEADER_FILES) $(TEST_SOURCE_FILES) $(TEST_HEADER_FILES) 3Depict_SOURCES = $(SOURCE_FILES) $(am__append_1) #Tarball options EXTRA_DIST = gui/glade-skeleton myAppIcon.ico testing/filtertesting.cpp all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) testing/$(am__dirstamp): @$(MKDIR_P) testing @: > testing/$(am__dirstamp) testing/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) testing/$(DEPDIR) @: > testing/$(DEPDIR)/$(am__dirstamp) testing/3Depict-testing.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) wx/$(am__dirstamp): @$(MKDIR_P) wx @: > wx/$(am__dirstamp) wx/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) wx/$(DEPDIR) @: > wx/$(DEPDIR)/$(am__dirstamp) wx/3Depict-wxcommon.$(OBJEXT): wx/$(am__dirstamp) \ wx/$(DEPDIR)/$(am__dirstamp) wx/3Depict-wxcomponents.$(OBJEXT): wx/$(am__dirstamp) \ wx/$(DEPDIR)/$(am__dirstamp) wx/3Depict-propertyGridUpdater.$(OBJEXT): wx/$(am__dirstamp) \ wx/$(DEPDIR)/$(am__dirstamp) gui/$(am__dirstamp): @$(MKDIR_P) gui @: > gui/$(am__dirstamp) gui/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) gui/$(DEPDIR) @: > gui/$(DEPDIR)/$(am__dirstamp) gui/3Depict-mainFrame.$(OBJEXT): gui/$(am__dirstamp) \ gui/$(DEPDIR)/$(am__dirstamp) gui/3Depict-mathglPane.$(OBJEXT): gui/$(am__dirstamp) \ gui/$(DEPDIR)/$(am__dirstamp) gui/3Depict-cropPanel.$(OBJEXT): gui/$(am__dirstamp) \ gui/$(DEPDIR)/$(am__dirstamp) gui/3Depict-glPane.$(OBJEXT): gui/$(am__dirstamp) \ gui/$(DEPDIR)/$(am__dirstamp) gui/dialogs/$(am__dirstamp): @$(MKDIR_P) gui/dialogs @: > gui/dialogs/$(am__dirstamp) gui/dialogs/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) gui/dialogs/$(DEPDIR) @: > gui/dialogs/$(DEPDIR)/$(am__dirstamp) gui/dialogs/3Depict-ExportPos.$(OBJEXT): gui/dialogs/$(am__dirstamp) \ gui/dialogs/$(DEPDIR)/$(am__dirstamp) gui/dialogs/3Depict-ExportRngDialog.$(OBJEXT): \ gui/dialogs/$(am__dirstamp) \ gui/dialogs/$(DEPDIR)/$(am__dirstamp) gui/dialogs/3Depict-prefDialog.$(OBJEXT): gui/dialogs/$(am__dirstamp) \ gui/dialogs/$(DEPDIR)/$(am__dirstamp) gui/dialogs/3Depict-resolutionDialog.$(OBJEXT): \ gui/dialogs/$(am__dirstamp) \ gui/dialogs/$(DEPDIR)/$(am__dirstamp) gui/dialogs/3Depict-StashDialog.$(OBJEXT): \ gui/dialogs/$(am__dirstamp) \ gui/dialogs/$(DEPDIR)/$(am__dirstamp) gui/dialogs/3Depict-autosaveDialog.$(OBJEXT): \ gui/dialogs/$(am__dirstamp) \ gui/dialogs/$(DEPDIR)/$(am__dirstamp) gui/dialogs/3Depict-filterErrorDialog.$(OBJEXT): \ gui/dialogs/$(am__dirstamp) \ gui/dialogs/$(DEPDIR)/$(am__dirstamp) gui/dialogs/3Depict-animateFilterDialog.$(OBJEXT): \ gui/dialogs/$(am__dirstamp) \ gui/dialogs/$(DEPDIR)/$(am__dirstamp) gui/dialogs/animateSubDialogs/$(am__dirstamp): @$(MKDIR_P) gui/dialogs/animateSubDialogs @: > gui/dialogs/animateSubDialogs/$(am__dirstamp) gui/dialogs/animateSubDialogs/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) gui/dialogs/animateSubDialogs/$(DEPDIR) @: > gui/dialogs/animateSubDialogs/$(DEPDIR)/$(am__dirstamp) gui/dialogs/animateSubDialogs/3Depict-colourKeyFrameDialog.$(OBJEXT): \ gui/dialogs/animateSubDialogs/$(am__dirstamp) \ gui/dialogs/animateSubDialogs/$(DEPDIR)/$(am__dirstamp) gui/dialogs/animateSubDialogs/3Depict-stringKeyFrameDialog.$(OBJEXT): \ gui/dialogs/animateSubDialogs/$(am__dirstamp) \ gui/dialogs/animateSubDialogs/$(DEPDIR)/$(am__dirstamp) gui/dialogs/animateSubDialogs/3Depict-choiceKeyFrameDialog.$(OBJEXT): \ gui/dialogs/animateSubDialogs/$(am__dirstamp) \ gui/dialogs/animateSubDialogs/$(DEPDIR)/$(am__dirstamp) gui/dialogs/3Depict-rangeEditDialog.$(OBJEXT): \ gui/dialogs/$(am__dirstamp) \ gui/dialogs/$(DEPDIR)/$(am__dirstamp) backend/filters/$(am__dirstamp): @$(MKDIR_P) backend/filters @: > backend/filters/$(am__dirstamp) backend/filters/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) backend/filters/$(DEPDIR) @: > backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-allFilter.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-filterCommon.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-dataLoad.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-ionDownsample.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-rangeFile.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-voxelise.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-spectrumPlot.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-transform.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-externalProgram.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-ionClip.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-ionColour.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-boundingBox.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-profile.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-spatialAnalysis.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-clusterAnalysis.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-ionInfo.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-annotation.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/3Depict-geometryHelpers.$(OBJEXT): \ backend/filters/$(am__dirstamp) \ backend/filters/$(DEPDIR)/$(am__dirstamp) backend/filters/algorithms/$(am__dirstamp): @$(MKDIR_P) backend/filters/algorithms @: > backend/filters/algorithms/$(am__dirstamp) backend/filters/algorithms/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) backend/filters/algorithms/$(DEPDIR) @: > backend/filters/algorithms/$(DEPDIR)/$(am__dirstamp) backend/filters/algorithms/3Depict-binomial.$(OBJEXT): \ backend/filters/algorithms/$(am__dirstamp) \ backend/filters/algorithms/$(DEPDIR)/$(am__dirstamp) backend/filters/algorithms/3Depict-mass.$(OBJEXT): \ backend/filters/algorithms/$(am__dirstamp) \ backend/filters/algorithms/$(DEPDIR)/$(am__dirstamp) backend/$(am__dirstamp): @$(MKDIR_P) backend @: > backend/$(am__dirstamp) backend/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) backend/$(DEPDIR) @: > backend/$(DEPDIR)/$(am__dirstamp) backend/3Depict-animator.$(OBJEXT): backend/$(am__dirstamp) \ backend/$(DEPDIR)/$(am__dirstamp) backend/3Depict-filtertreeAnalyse.$(OBJEXT): backend/$(am__dirstamp) \ backend/$(DEPDIR)/$(am__dirstamp) backend/3Depict-filtertree.$(OBJEXT): backend/$(am__dirstamp) \ backend/$(DEPDIR)/$(am__dirstamp) backend/APT/$(am__dirstamp): @$(MKDIR_P) backend/APT @: > backend/APT/$(am__dirstamp) backend/APT/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) backend/APT/$(DEPDIR) @: > backend/APT/$(DEPDIR)/$(am__dirstamp) backend/APT/3Depict-ionhit.$(OBJEXT): backend/APT/$(am__dirstamp) \ backend/APT/$(DEPDIR)/$(am__dirstamp) backend/APT/3Depict-APTFileIO.$(OBJEXT): backend/APT/$(am__dirstamp) \ backend/APT/$(DEPDIR)/$(am__dirstamp) backend/APT/3Depict-APTRanges.$(OBJEXT): backend/APT/$(am__dirstamp) \ backend/APT/$(DEPDIR)/$(am__dirstamp) backend/APT/3Depict-abundanceParser.$(OBJEXT): \ backend/APT/$(am__dirstamp) \ backend/APT/$(DEPDIR)/$(am__dirstamp) backend/APT/3Depict-vtk.$(OBJEXT): backend/APT/$(am__dirstamp) \ backend/APT/$(DEPDIR)/$(am__dirstamp) backend/filters/algorithms/3Depict-K3DTree.$(OBJEXT): \ backend/filters/algorithms/$(am__dirstamp) \ backend/filters/algorithms/$(DEPDIR)/$(am__dirstamp) backend/filters/algorithms/3Depict-K3DTree-mk2.$(OBJEXT): \ backend/filters/algorithms/$(am__dirstamp) \ backend/filters/algorithms/$(DEPDIR)/$(am__dirstamp) backend/3Depict-filter.$(OBJEXT): backend/$(am__dirstamp) \ backend/$(DEPDIR)/$(am__dirstamp) backend/filters/algorithms/3Depict-rdf.$(OBJEXT): \ backend/filters/algorithms/$(am__dirstamp) \ backend/filters/algorithms/$(DEPDIR)/$(am__dirstamp) backend/3Depict-viscontrol.$(OBJEXT): backend/$(am__dirstamp) \ backend/$(DEPDIR)/$(am__dirstamp) backend/3Depict-state.$(OBJEXT): backend/$(am__dirstamp) \ backend/$(DEPDIR)/$(am__dirstamp) backend/3Depict-plot.$(OBJEXT): backend/$(am__dirstamp) \ backend/$(DEPDIR)/$(am__dirstamp) backend/3Depict-configFile.$(OBJEXT): backend/$(am__dirstamp) \ backend/$(DEPDIR)/$(am__dirstamp) gl/$(am__dirstamp): @$(MKDIR_P) gl @: > gl/$(am__dirstamp) gl/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) gl/$(DEPDIR) @: > gl/$(DEPDIR)/$(am__dirstamp) gl/3Depict-scene.$(OBJEXT): gl/$(am__dirstamp) \ gl/$(DEPDIR)/$(am__dirstamp) gl/3Depict-drawables.$(OBJEXT): gl/$(am__dirstamp) \ gl/$(DEPDIR)/$(am__dirstamp) gl/3Depict-effect.$(OBJEXT): gl/$(am__dirstamp) \ gl/$(DEPDIR)/$(am__dirstamp) gl/3Depict-textures.$(OBJEXT): gl/$(am__dirstamp) \ gl/$(DEPDIR)/$(am__dirstamp) gl/3Depict-select.$(OBJEXT): gl/$(am__dirstamp) \ gl/$(DEPDIR)/$(am__dirstamp) gl/3Depict-cameras.$(OBJEXT): gl/$(am__dirstamp) \ gl/$(DEPDIR)/$(am__dirstamp) gl/3Depict-isoSurface.$(OBJEXT): gl/$(am__dirstamp) \ gl/$(DEPDIR)/$(am__dirstamp) gl/3Depict-tr.$(OBJEXT): gl/$(am__dirstamp) \ gl/$(DEPDIR)/$(am__dirstamp) common/$(am__dirstamp): @$(MKDIR_P) common @: > common/$(am__dirstamp) common/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) common/$(DEPDIR) @: > common/$(DEPDIR)/$(am__dirstamp) common/3Depict-pngread.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/3Depict-stringFuncs.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/3Depict-constants.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/3Depict-xmlHelper.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/3Depict-colourmap.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/3Depict-voxels.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/3Depict-mathfuncs.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/3Depict-basics.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/3Depict-assertion.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/3Depict-mesh.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) common/3Depict-gsl_helper.$(OBJEXT): common/$(am__dirstamp) \ common/$(DEPDIR)/$(am__dirstamp) testing/3Depict-mglTesting.$(OBJEXT): testing/$(am__dirstamp) \ testing/$(DEPDIR)/$(am__dirstamp) 3Depict$(EXEEXT): $(3Depict_OBJECTS) $(3Depict_DEPENDENCIES) $(EXTRA_3Depict_DEPENDENCIES) @rm -f 3Depict$(EXEEXT) $(AM_V_CXXLD)$(3Depict_LINK) $(3Depict_OBJECTS) $(3Depict_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f backend/*.$(OBJEXT) -rm -f backend/APT/*.$(OBJEXT) -rm -f backend/filters/*.$(OBJEXT) -rm -f backend/filters/algorithms/*.$(OBJEXT) -rm -f common/*.$(OBJEXT) -rm -f gl/*.$(OBJEXT) -rm -f gui/*.$(OBJEXT) -rm -f gui/dialogs/*.$(OBJEXT) -rm -f gui/dialogs/animateSubDialogs/*.$(OBJEXT) -rm -f testing/*.$(OBJEXT) -rm -f wx/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/3Depict-3Depict.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/3Depict-winconsole.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/$(DEPDIR)/3Depict-animator.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/$(DEPDIR)/3Depict-configFile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/$(DEPDIR)/3Depict-filter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/$(DEPDIR)/3Depict-filtertree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/$(DEPDIR)/3Depict-filtertreeAnalyse.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/$(DEPDIR)/3Depict-plot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/$(DEPDIR)/3Depict-state.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/$(DEPDIR)/3Depict-viscontrol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/APT/$(DEPDIR)/3Depict-APTFileIO.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/APT/$(DEPDIR)/3Depict-APTRanges.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/APT/$(DEPDIR)/3Depict-abundanceParser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/APT/$(DEPDIR)/3Depict-ionhit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/APT/$(DEPDIR)/3Depict-vtk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-allFilter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-annotation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-boundingBox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-clusterAnalysis.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-dataLoad.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-externalProgram.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-filterCommon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-geometryHelpers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-ionClip.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-ionColour.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-ionDownsample.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-ionInfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-profile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-rangeFile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-spatialAnalysis.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-spectrumPlot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-transform.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/$(DEPDIR)/3Depict-voxelise.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree-mk2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/algorithms/$(DEPDIR)/3Depict-binomial.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/algorithms/$(DEPDIR)/3Depict-mass.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@backend/filters/algorithms/$(DEPDIR)/3Depict-rdf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/3Depict-assertion.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/3Depict-basics.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/3Depict-colourmap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/3Depict-constants.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/3Depict-gsl_helper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/3Depict-mathfuncs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/3Depict-mesh.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/3Depict-pngread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/3Depict-stringFuncs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/3Depict-voxels.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@common/$(DEPDIR)/3Depict-xmlHelper.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gl/$(DEPDIR)/3Depict-cameras.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gl/$(DEPDIR)/3Depict-drawables.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gl/$(DEPDIR)/3Depict-effect.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gl/$(DEPDIR)/3Depict-isoSurface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gl/$(DEPDIR)/3Depict-scene.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gl/$(DEPDIR)/3Depict-select.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gl/$(DEPDIR)/3Depict-textures.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gl/$(DEPDIR)/3Depict-tr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/3Depict-cropPanel.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/3Depict-glPane.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/3Depict-mainFrame.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/$(DEPDIR)/3Depict-mathglPane.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/dialogs/$(DEPDIR)/3Depict-ExportPos.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/dialogs/$(DEPDIR)/3Depict-ExportRngDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/dialogs/$(DEPDIR)/3Depict-StashDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/dialogs/$(DEPDIR)/3Depict-animateFilterDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/dialogs/$(DEPDIR)/3Depict-autosaveDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/dialogs/$(DEPDIR)/3Depict-filterErrorDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/dialogs/$(DEPDIR)/3Depict-prefDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/dialogs/$(DEPDIR)/3Depict-rangeEditDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/dialogs/$(DEPDIR)/3Depict-resolutionDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-choiceKeyFrameDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-colourKeyFrameDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-stringKeyFrameDialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/3Depict-mglTesting.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@testing/$(DEPDIR)/3Depict-testing.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@wx/$(DEPDIR)/3Depict-propertyGridUpdater.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@wx/$(DEPDIR)/3Depict-wxcommon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@wx/$(DEPDIR)/3Depict-wxcomponents.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` common/3Depict-pngread.o: common/pngread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CFLAGS) $(CFLAGS) -MT common/3Depict-pngread.o -MD -MP -MF common/$(DEPDIR)/3Depict-pngread.Tpo -c -o common/3Depict-pngread.o `test -f 'common/pngread.c' || echo '$(srcdir)/'`common/pngread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-pngread.Tpo common/$(DEPDIR)/3Depict-pngread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/pngread.c' object='common/3Depict-pngread.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CFLAGS) $(CFLAGS) -c -o common/3Depict-pngread.o `test -f 'common/pngread.c' || echo '$(srcdir)/'`common/pngread.c common/3Depict-pngread.obj: common/pngread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CFLAGS) $(CFLAGS) -MT common/3Depict-pngread.obj -MD -MP -MF common/$(DEPDIR)/3Depict-pngread.Tpo -c -o common/3Depict-pngread.obj `if test -f 'common/pngread.c'; then $(CYGPATH_W) 'common/pngread.c'; else $(CYGPATH_W) '$(srcdir)/common/pngread.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-pngread.Tpo common/$(DEPDIR)/3Depict-pngread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common/pngread.c' object='common/3Depict-pngread.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CFLAGS) $(CFLAGS) -c -o common/3Depict-pngread.obj `if test -f 'common/pngread.c'; then $(CYGPATH_W) 'common/pngread.c'; else $(CYGPATH_W) '$(srcdir)/common/pngread.c'; fi` .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` 3Depict-3Depict.o: 3Depict.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT 3Depict-3Depict.o -MD -MP -MF $(DEPDIR)/3Depict-3Depict.Tpo -c -o 3Depict-3Depict.o `test -f '3Depict.cpp' || echo '$(srcdir)/'`3Depict.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/3Depict-3Depict.Tpo $(DEPDIR)/3Depict-3Depict.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='3Depict.cpp' object='3Depict-3Depict.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o 3Depict-3Depict.o `test -f '3Depict.cpp' || echo '$(srcdir)/'`3Depict.cpp 3Depict-3Depict.obj: 3Depict.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT 3Depict-3Depict.obj -MD -MP -MF $(DEPDIR)/3Depict-3Depict.Tpo -c -o 3Depict-3Depict.obj `if test -f '3Depict.cpp'; then $(CYGPATH_W) '3Depict.cpp'; else $(CYGPATH_W) '$(srcdir)/3Depict.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/3Depict-3Depict.Tpo $(DEPDIR)/3Depict-3Depict.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='3Depict.cpp' object='3Depict-3Depict.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o 3Depict-3Depict.obj `if test -f '3Depict.cpp'; then $(CYGPATH_W) '3Depict.cpp'; else $(CYGPATH_W) '$(srcdir)/3Depict.cpp'; fi` testing/3Depict-testing.o: testing/testing.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT testing/3Depict-testing.o -MD -MP -MF testing/$(DEPDIR)/3Depict-testing.Tpo -c -o testing/3Depict-testing.o `test -f 'testing/testing.cpp' || echo '$(srcdir)/'`testing/testing.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) testing/$(DEPDIR)/3Depict-testing.Tpo testing/$(DEPDIR)/3Depict-testing.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='testing/testing.cpp' object='testing/3Depict-testing.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o testing/3Depict-testing.o `test -f 'testing/testing.cpp' || echo '$(srcdir)/'`testing/testing.cpp testing/3Depict-testing.obj: testing/testing.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT testing/3Depict-testing.obj -MD -MP -MF testing/$(DEPDIR)/3Depict-testing.Tpo -c -o testing/3Depict-testing.obj `if test -f 'testing/testing.cpp'; then $(CYGPATH_W) 'testing/testing.cpp'; else $(CYGPATH_W) '$(srcdir)/testing/testing.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) testing/$(DEPDIR)/3Depict-testing.Tpo testing/$(DEPDIR)/3Depict-testing.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='testing/testing.cpp' object='testing/3Depict-testing.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o testing/3Depict-testing.obj `if test -f 'testing/testing.cpp'; then $(CYGPATH_W) 'testing/testing.cpp'; else $(CYGPATH_W) '$(srcdir)/testing/testing.cpp'; fi` wx/3Depict-wxcommon.o: wx/wxcommon.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT wx/3Depict-wxcommon.o -MD -MP -MF wx/$(DEPDIR)/3Depict-wxcommon.Tpo -c -o wx/3Depict-wxcommon.o `test -f 'wx/wxcommon.cpp' || echo '$(srcdir)/'`wx/wxcommon.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wx/$(DEPDIR)/3Depict-wxcommon.Tpo wx/$(DEPDIR)/3Depict-wxcommon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wx/wxcommon.cpp' object='wx/3Depict-wxcommon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o wx/3Depict-wxcommon.o `test -f 'wx/wxcommon.cpp' || echo '$(srcdir)/'`wx/wxcommon.cpp wx/3Depict-wxcommon.obj: wx/wxcommon.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT wx/3Depict-wxcommon.obj -MD -MP -MF wx/$(DEPDIR)/3Depict-wxcommon.Tpo -c -o wx/3Depict-wxcommon.obj `if test -f 'wx/wxcommon.cpp'; then $(CYGPATH_W) 'wx/wxcommon.cpp'; else $(CYGPATH_W) '$(srcdir)/wx/wxcommon.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wx/$(DEPDIR)/3Depict-wxcommon.Tpo wx/$(DEPDIR)/3Depict-wxcommon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wx/wxcommon.cpp' object='wx/3Depict-wxcommon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o wx/3Depict-wxcommon.obj `if test -f 'wx/wxcommon.cpp'; then $(CYGPATH_W) 'wx/wxcommon.cpp'; else $(CYGPATH_W) '$(srcdir)/wx/wxcommon.cpp'; fi` wx/3Depict-wxcomponents.o: wx/wxcomponents.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT wx/3Depict-wxcomponents.o -MD -MP -MF wx/$(DEPDIR)/3Depict-wxcomponents.Tpo -c -o wx/3Depict-wxcomponents.o `test -f 'wx/wxcomponents.cpp' || echo '$(srcdir)/'`wx/wxcomponents.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wx/$(DEPDIR)/3Depict-wxcomponents.Tpo wx/$(DEPDIR)/3Depict-wxcomponents.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wx/wxcomponents.cpp' object='wx/3Depict-wxcomponents.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o wx/3Depict-wxcomponents.o `test -f 'wx/wxcomponents.cpp' || echo '$(srcdir)/'`wx/wxcomponents.cpp wx/3Depict-wxcomponents.obj: wx/wxcomponents.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT wx/3Depict-wxcomponents.obj -MD -MP -MF wx/$(DEPDIR)/3Depict-wxcomponents.Tpo -c -o wx/3Depict-wxcomponents.obj `if test -f 'wx/wxcomponents.cpp'; then $(CYGPATH_W) 'wx/wxcomponents.cpp'; else $(CYGPATH_W) '$(srcdir)/wx/wxcomponents.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wx/$(DEPDIR)/3Depict-wxcomponents.Tpo wx/$(DEPDIR)/3Depict-wxcomponents.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wx/wxcomponents.cpp' object='wx/3Depict-wxcomponents.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o wx/3Depict-wxcomponents.obj `if test -f 'wx/wxcomponents.cpp'; then $(CYGPATH_W) 'wx/wxcomponents.cpp'; else $(CYGPATH_W) '$(srcdir)/wx/wxcomponents.cpp'; fi` 3Depict-winconsole.o: winconsole.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT 3Depict-winconsole.o -MD -MP -MF $(DEPDIR)/3Depict-winconsole.Tpo -c -o 3Depict-winconsole.o `test -f 'winconsole.cpp' || echo '$(srcdir)/'`winconsole.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/3Depict-winconsole.Tpo $(DEPDIR)/3Depict-winconsole.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='winconsole.cpp' object='3Depict-winconsole.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o 3Depict-winconsole.o `test -f 'winconsole.cpp' || echo '$(srcdir)/'`winconsole.cpp 3Depict-winconsole.obj: winconsole.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT 3Depict-winconsole.obj -MD -MP -MF $(DEPDIR)/3Depict-winconsole.Tpo -c -o 3Depict-winconsole.obj `if test -f 'winconsole.cpp'; then $(CYGPATH_W) 'winconsole.cpp'; else $(CYGPATH_W) '$(srcdir)/winconsole.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/3Depict-winconsole.Tpo $(DEPDIR)/3Depict-winconsole.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='winconsole.cpp' object='3Depict-winconsole.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o 3Depict-winconsole.obj `if test -f 'winconsole.cpp'; then $(CYGPATH_W) 'winconsole.cpp'; else $(CYGPATH_W) '$(srcdir)/winconsole.cpp'; fi` wx/3Depict-propertyGridUpdater.o: wx/propertyGridUpdater.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT wx/3Depict-propertyGridUpdater.o -MD -MP -MF wx/$(DEPDIR)/3Depict-propertyGridUpdater.Tpo -c -o wx/3Depict-propertyGridUpdater.o `test -f 'wx/propertyGridUpdater.cpp' || echo '$(srcdir)/'`wx/propertyGridUpdater.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wx/$(DEPDIR)/3Depict-propertyGridUpdater.Tpo wx/$(DEPDIR)/3Depict-propertyGridUpdater.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wx/propertyGridUpdater.cpp' object='wx/3Depict-propertyGridUpdater.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o wx/3Depict-propertyGridUpdater.o `test -f 'wx/propertyGridUpdater.cpp' || echo '$(srcdir)/'`wx/propertyGridUpdater.cpp wx/3Depict-propertyGridUpdater.obj: wx/propertyGridUpdater.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT wx/3Depict-propertyGridUpdater.obj -MD -MP -MF wx/$(DEPDIR)/3Depict-propertyGridUpdater.Tpo -c -o wx/3Depict-propertyGridUpdater.obj `if test -f 'wx/propertyGridUpdater.cpp'; then $(CYGPATH_W) 'wx/propertyGridUpdater.cpp'; else $(CYGPATH_W) '$(srcdir)/wx/propertyGridUpdater.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) wx/$(DEPDIR)/3Depict-propertyGridUpdater.Tpo wx/$(DEPDIR)/3Depict-propertyGridUpdater.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='wx/propertyGridUpdater.cpp' object='wx/3Depict-propertyGridUpdater.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o wx/3Depict-propertyGridUpdater.obj `if test -f 'wx/propertyGridUpdater.cpp'; then $(CYGPATH_W) 'wx/propertyGridUpdater.cpp'; else $(CYGPATH_W) '$(srcdir)/wx/propertyGridUpdater.cpp'; fi` gui/3Depict-mainFrame.o: gui/mainFrame.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/3Depict-mainFrame.o -MD -MP -MF gui/$(DEPDIR)/3Depict-mainFrame.Tpo -c -o gui/3Depict-mainFrame.o `test -f 'gui/mainFrame.cpp' || echo '$(srcdir)/'`gui/mainFrame.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/$(DEPDIR)/3Depict-mainFrame.Tpo gui/$(DEPDIR)/3Depict-mainFrame.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/mainFrame.cpp' object='gui/3Depict-mainFrame.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/3Depict-mainFrame.o `test -f 'gui/mainFrame.cpp' || echo '$(srcdir)/'`gui/mainFrame.cpp gui/3Depict-mainFrame.obj: gui/mainFrame.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/3Depict-mainFrame.obj -MD -MP -MF gui/$(DEPDIR)/3Depict-mainFrame.Tpo -c -o gui/3Depict-mainFrame.obj `if test -f 'gui/mainFrame.cpp'; then $(CYGPATH_W) 'gui/mainFrame.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/mainFrame.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/$(DEPDIR)/3Depict-mainFrame.Tpo gui/$(DEPDIR)/3Depict-mainFrame.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/mainFrame.cpp' object='gui/3Depict-mainFrame.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/3Depict-mainFrame.obj `if test -f 'gui/mainFrame.cpp'; then $(CYGPATH_W) 'gui/mainFrame.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/mainFrame.cpp'; fi` gui/3Depict-mathglPane.o: gui/mathglPane.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/3Depict-mathglPane.o -MD -MP -MF gui/$(DEPDIR)/3Depict-mathglPane.Tpo -c -o gui/3Depict-mathglPane.o `test -f 'gui/mathglPane.cpp' || echo '$(srcdir)/'`gui/mathglPane.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/$(DEPDIR)/3Depict-mathglPane.Tpo gui/$(DEPDIR)/3Depict-mathglPane.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/mathglPane.cpp' object='gui/3Depict-mathglPane.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/3Depict-mathglPane.o `test -f 'gui/mathglPane.cpp' || echo '$(srcdir)/'`gui/mathglPane.cpp gui/3Depict-mathglPane.obj: gui/mathglPane.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/3Depict-mathglPane.obj -MD -MP -MF gui/$(DEPDIR)/3Depict-mathglPane.Tpo -c -o gui/3Depict-mathglPane.obj `if test -f 'gui/mathglPane.cpp'; then $(CYGPATH_W) 'gui/mathglPane.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/mathglPane.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/$(DEPDIR)/3Depict-mathglPane.Tpo gui/$(DEPDIR)/3Depict-mathglPane.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/mathglPane.cpp' object='gui/3Depict-mathglPane.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/3Depict-mathglPane.obj `if test -f 'gui/mathglPane.cpp'; then $(CYGPATH_W) 'gui/mathglPane.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/mathglPane.cpp'; fi` gui/3Depict-cropPanel.o: gui/cropPanel.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/3Depict-cropPanel.o -MD -MP -MF gui/$(DEPDIR)/3Depict-cropPanel.Tpo -c -o gui/3Depict-cropPanel.o `test -f 'gui/cropPanel.cpp' || echo '$(srcdir)/'`gui/cropPanel.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/$(DEPDIR)/3Depict-cropPanel.Tpo gui/$(DEPDIR)/3Depict-cropPanel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/cropPanel.cpp' object='gui/3Depict-cropPanel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/3Depict-cropPanel.o `test -f 'gui/cropPanel.cpp' || echo '$(srcdir)/'`gui/cropPanel.cpp gui/3Depict-cropPanel.obj: gui/cropPanel.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/3Depict-cropPanel.obj -MD -MP -MF gui/$(DEPDIR)/3Depict-cropPanel.Tpo -c -o gui/3Depict-cropPanel.obj `if test -f 'gui/cropPanel.cpp'; then $(CYGPATH_W) 'gui/cropPanel.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/cropPanel.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/$(DEPDIR)/3Depict-cropPanel.Tpo gui/$(DEPDIR)/3Depict-cropPanel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/cropPanel.cpp' object='gui/3Depict-cropPanel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/3Depict-cropPanel.obj `if test -f 'gui/cropPanel.cpp'; then $(CYGPATH_W) 'gui/cropPanel.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/cropPanel.cpp'; fi` gui/3Depict-glPane.o: gui/glPane.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/3Depict-glPane.o -MD -MP -MF gui/$(DEPDIR)/3Depict-glPane.Tpo -c -o gui/3Depict-glPane.o `test -f 'gui/glPane.cpp' || echo '$(srcdir)/'`gui/glPane.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/$(DEPDIR)/3Depict-glPane.Tpo gui/$(DEPDIR)/3Depict-glPane.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/glPane.cpp' object='gui/3Depict-glPane.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/3Depict-glPane.o `test -f 'gui/glPane.cpp' || echo '$(srcdir)/'`gui/glPane.cpp gui/3Depict-glPane.obj: gui/glPane.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/3Depict-glPane.obj -MD -MP -MF gui/$(DEPDIR)/3Depict-glPane.Tpo -c -o gui/3Depict-glPane.obj `if test -f 'gui/glPane.cpp'; then $(CYGPATH_W) 'gui/glPane.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/glPane.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/$(DEPDIR)/3Depict-glPane.Tpo gui/$(DEPDIR)/3Depict-glPane.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/glPane.cpp' object='gui/3Depict-glPane.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/3Depict-glPane.obj `if test -f 'gui/glPane.cpp'; then $(CYGPATH_W) 'gui/glPane.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/glPane.cpp'; fi` gui/dialogs/3Depict-ExportPos.o: gui/dialogs/ExportPos.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-ExportPos.o -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-ExportPos.Tpo -c -o gui/dialogs/3Depict-ExportPos.o `test -f 'gui/dialogs/ExportPos.cpp' || echo '$(srcdir)/'`gui/dialogs/ExportPos.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-ExportPos.Tpo gui/dialogs/$(DEPDIR)/3Depict-ExportPos.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/ExportPos.cpp' object='gui/dialogs/3Depict-ExportPos.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-ExportPos.o `test -f 'gui/dialogs/ExportPos.cpp' || echo '$(srcdir)/'`gui/dialogs/ExportPos.cpp gui/dialogs/3Depict-ExportPos.obj: gui/dialogs/ExportPos.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-ExportPos.obj -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-ExportPos.Tpo -c -o gui/dialogs/3Depict-ExportPos.obj `if test -f 'gui/dialogs/ExportPos.cpp'; then $(CYGPATH_W) 'gui/dialogs/ExportPos.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/ExportPos.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-ExportPos.Tpo gui/dialogs/$(DEPDIR)/3Depict-ExportPos.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/ExportPos.cpp' object='gui/dialogs/3Depict-ExportPos.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-ExportPos.obj `if test -f 'gui/dialogs/ExportPos.cpp'; then $(CYGPATH_W) 'gui/dialogs/ExportPos.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/ExportPos.cpp'; fi` gui/dialogs/3Depict-ExportRngDialog.o: gui/dialogs/ExportRngDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-ExportRngDialog.o -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-ExportRngDialog.Tpo -c -o gui/dialogs/3Depict-ExportRngDialog.o `test -f 'gui/dialogs/ExportRngDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/ExportRngDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-ExportRngDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-ExportRngDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/ExportRngDialog.cpp' object='gui/dialogs/3Depict-ExportRngDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-ExportRngDialog.o `test -f 'gui/dialogs/ExportRngDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/ExportRngDialog.cpp gui/dialogs/3Depict-ExportRngDialog.obj: gui/dialogs/ExportRngDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-ExportRngDialog.obj -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-ExportRngDialog.Tpo -c -o gui/dialogs/3Depict-ExportRngDialog.obj `if test -f 'gui/dialogs/ExportRngDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/ExportRngDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/ExportRngDialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-ExportRngDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-ExportRngDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/ExportRngDialog.cpp' object='gui/dialogs/3Depict-ExportRngDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-ExportRngDialog.obj `if test -f 'gui/dialogs/ExportRngDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/ExportRngDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/ExportRngDialog.cpp'; fi` gui/dialogs/3Depict-prefDialog.o: gui/dialogs/prefDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-prefDialog.o -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-prefDialog.Tpo -c -o gui/dialogs/3Depict-prefDialog.o `test -f 'gui/dialogs/prefDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/prefDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-prefDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-prefDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/prefDialog.cpp' object='gui/dialogs/3Depict-prefDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-prefDialog.o `test -f 'gui/dialogs/prefDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/prefDialog.cpp gui/dialogs/3Depict-prefDialog.obj: gui/dialogs/prefDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-prefDialog.obj -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-prefDialog.Tpo -c -o gui/dialogs/3Depict-prefDialog.obj `if test -f 'gui/dialogs/prefDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/prefDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/prefDialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-prefDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-prefDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/prefDialog.cpp' object='gui/dialogs/3Depict-prefDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-prefDialog.obj `if test -f 'gui/dialogs/prefDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/prefDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/prefDialog.cpp'; fi` gui/dialogs/3Depict-resolutionDialog.o: gui/dialogs/resolutionDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-resolutionDialog.o -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-resolutionDialog.Tpo -c -o gui/dialogs/3Depict-resolutionDialog.o `test -f 'gui/dialogs/resolutionDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/resolutionDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-resolutionDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-resolutionDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/resolutionDialog.cpp' object='gui/dialogs/3Depict-resolutionDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-resolutionDialog.o `test -f 'gui/dialogs/resolutionDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/resolutionDialog.cpp gui/dialogs/3Depict-resolutionDialog.obj: gui/dialogs/resolutionDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-resolutionDialog.obj -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-resolutionDialog.Tpo -c -o gui/dialogs/3Depict-resolutionDialog.obj `if test -f 'gui/dialogs/resolutionDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/resolutionDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/resolutionDialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-resolutionDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-resolutionDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/resolutionDialog.cpp' object='gui/dialogs/3Depict-resolutionDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-resolutionDialog.obj `if test -f 'gui/dialogs/resolutionDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/resolutionDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/resolutionDialog.cpp'; fi` gui/dialogs/3Depict-StashDialog.o: gui/dialogs/StashDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-StashDialog.o -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-StashDialog.Tpo -c -o gui/dialogs/3Depict-StashDialog.o `test -f 'gui/dialogs/StashDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/StashDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-StashDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-StashDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/StashDialog.cpp' object='gui/dialogs/3Depict-StashDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-StashDialog.o `test -f 'gui/dialogs/StashDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/StashDialog.cpp gui/dialogs/3Depict-StashDialog.obj: gui/dialogs/StashDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-StashDialog.obj -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-StashDialog.Tpo -c -o gui/dialogs/3Depict-StashDialog.obj `if test -f 'gui/dialogs/StashDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/StashDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/StashDialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-StashDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-StashDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/StashDialog.cpp' object='gui/dialogs/3Depict-StashDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-StashDialog.obj `if test -f 'gui/dialogs/StashDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/StashDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/StashDialog.cpp'; fi` gui/dialogs/3Depict-autosaveDialog.o: gui/dialogs/autosaveDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-autosaveDialog.o -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-autosaveDialog.Tpo -c -o gui/dialogs/3Depict-autosaveDialog.o `test -f 'gui/dialogs/autosaveDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/autosaveDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-autosaveDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-autosaveDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/autosaveDialog.cpp' object='gui/dialogs/3Depict-autosaveDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-autosaveDialog.o `test -f 'gui/dialogs/autosaveDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/autosaveDialog.cpp gui/dialogs/3Depict-autosaveDialog.obj: gui/dialogs/autosaveDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-autosaveDialog.obj -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-autosaveDialog.Tpo -c -o gui/dialogs/3Depict-autosaveDialog.obj `if test -f 'gui/dialogs/autosaveDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/autosaveDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/autosaveDialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-autosaveDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-autosaveDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/autosaveDialog.cpp' object='gui/dialogs/3Depict-autosaveDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-autosaveDialog.obj `if test -f 'gui/dialogs/autosaveDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/autosaveDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/autosaveDialog.cpp'; fi` gui/dialogs/3Depict-filterErrorDialog.o: gui/dialogs/filterErrorDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-filterErrorDialog.o -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-filterErrorDialog.Tpo -c -o gui/dialogs/3Depict-filterErrorDialog.o `test -f 'gui/dialogs/filterErrorDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/filterErrorDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-filterErrorDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-filterErrorDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/filterErrorDialog.cpp' object='gui/dialogs/3Depict-filterErrorDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-filterErrorDialog.o `test -f 'gui/dialogs/filterErrorDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/filterErrorDialog.cpp gui/dialogs/3Depict-filterErrorDialog.obj: gui/dialogs/filterErrorDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-filterErrorDialog.obj -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-filterErrorDialog.Tpo -c -o gui/dialogs/3Depict-filterErrorDialog.obj `if test -f 'gui/dialogs/filterErrorDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/filterErrorDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/filterErrorDialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-filterErrorDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-filterErrorDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/filterErrorDialog.cpp' object='gui/dialogs/3Depict-filterErrorDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-filterErrorDialog.obj `if test -f 'gui/dialogs/filterErrorDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/filterErrorDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/filterErrorDialog.cpp'; fi` gui/dialogs/3Depict-animateFilterDialog.o: gui/dialogs/animateFilterDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-animateFilterDialog.o -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-animateFilterDialog.Tpo -c -o gui/dialogs/3Depict-animateFilterDialog.o `test -f 'gui/dialogs/animateFilterDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/animateFilterDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-animateFilterDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-animateFilterDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/animateFilterDialog.cpp' object='gui/dialogs/3Depict-animateFilterDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-animateFilterDialog.o `test -f 'gui/dialogs/animateFilterDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/animateFilterDialog.cpp gui/dialogs/3Depict-animateFilterDialog.obj: gui/dialogs/animateFilterDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-animateFilterDialog.obj -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-animateFilterDialog.Tpo -c -o gui/dialogs/3Depict-animateFilterDialog.obj `if test -f 'gui/dialogs/animateFilterDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/animateFilterDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/animateFilterDialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-animateFilterDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-animateFilterDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/animateFilterDialog.cpp' object='gui/dialogs/3Depict-animateFilterDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-animateFilterDialog.obj `if test -f 'gui/dialogs/animateFilterDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/animateFilterDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/animateFilterDialog.cpp'; fi` gui/dialogs/animateSubDialogs/3Depict-colourKeyFrameDialog.o: gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/animateSubDialogs/3Depict-colourKeyFrameDialog.o -MD -MP -MF gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-colourKeyFrameDialog.Tpo -c -o gui/dialogs/animateSubDialogs/3Depict-colourKeyFrameDialog.o `test -f 'gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-colourKeyFrameDialog.Tpo gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-colourKeyFrameDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp' object='gui/dialogs/animateSubDialogs/3Depict-colourKeyFrameDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/animateSubDialogs/3Depict-colourKeyFrameDialog.o `test -f 'gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp gui/dialogs/animateSubDialogs/3Depict-colourKeyFrameDialog.obj: gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/animateSubDialogs/3Depict-colourKeyFrameDialog.obj -MD -MP -MF gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-colourKeyFrameDialog.Tpo -c -o gui/dialogs/animateSubDialogs/3Depict-colourKeyFrameDialog.obj `if test -f 'gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-colourKeyFrameDialog.Tpo gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-colourKeyFrameDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp' object='gui/dialogs/animateSubDialogs/3Depict-colourKeyFrameDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/animateSubDialogs/3Depict-colourKeyFrameDialog.obj `if test -f 'gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/animateSubDialogs/colourKeyFrameDialog.cpp'; fi` gui/dialogs/animateSubDialogs/3Depict-stringKeyFrameDialog.o: gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/animateSubDialogs/3Depict-stringKeyFrameDialog.o -MD -MP -MF gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-stringKeyFrameDialog.Tpo -c -o gui/dialogs/animateSubDialogs/3Depict-stringKeyFrameDialog.o `test -f 'gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-stringKeyFrameDialog.Tpo gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-stringKeyFrameDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp' object='gui/dialogs/animateSubDialogs/3Depict-stringKeyFrameDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/animateSubDialogs/3Depict-stringKeyFrameDialog.o `test -f 'gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp gui/dialogs/animateSubDialogs/3Depict-stringKeyFrameDialog.obj: gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/animateSubDialogs/3Depict-stringKeyFrameDialog.obj -MD -MP -MF gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-stringKeyFrameDialog.Tpo -c -o gui/dialogs/animateSubDialogs/3Depict-stringKeyFrameDialog.obj `if test -f 'gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-stringKeyFrameDialog.Tpo gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-stringKeyFrameDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp' object='gui/dialogs/animateSubDialogs/3Depict-stringKeyFrameDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/animateSubDialogs/3Depict-stringKeyFrameDialog.obj `if test -f 'gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/animateSubDialogs/stringKeyFrameDialog.cpp'; fi` gui/dialogs/animateSubDialogs/3Depict-choiceKeyFrameDialog.o: gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/animateSubDialogs/3Depict-choiceKeyFrameDialog.o -MD -MP -MF gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-choiceKeyFrameDialog.Tpo -c -o gui/dialogs/animateSubDialogs/3Depict-choiceKeyFrameDialog.o `test -f 'gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-choiceKeyFrameDialog.Tpo gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-choiceKeyFrameDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp' object='gui/dialogs/animateSubDialogs/3Depict-choiceKeyFrameDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/animateSubDialogs/3Depict-choiceKeyFrameDialog.o `test -f 'gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp gui/dialogs/animateSubDialogs/3Depict-choiceKeyFrameDialog.obj: gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/animateSubDialogs/3Depict-choiceKeyFrameDialog.obj -MD -MP -MF gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-choiceKeyFrameDialog.Tpo -c -o gui/dialogs/animateSubDialogs/3Depict-choiceKeyFrameDialog.obj `if test -f 'gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-choiceKeyFrameDialog.Tpo gui/dialogs/animateSubDialogs/$(DEPDIR)/3Depict-choiceKeyFrameDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp' object='gui/dialogs/animateSubDialogs/3Depict-choiceKeyFrameDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/animateSubDialogs/3Depict-choiceKeyFrameDialog.obj `if test -f 'gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/animateSubDialogs/choiceKeyFrameDialog.cpp'; fi` gui/dialogs/3Depict-rangeEditDialog.o: gui/dialogs/rangeEditDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-rangeEditDialog.o -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-rangeEditDialog.Tpo -c -o gui/dialogs/3Depict-rangeEditDialog.o `test -f 'gui/dialogs/rangeEditDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/rangeEditDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-rangeEditDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-rangeEditDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/rangeEditDialog.cpp' object='gui/dialogs/3Depict-rangeEditDialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-rangeEditDialog.o `test -f 'gui/dialogs/rangeEditDialog.cpp' || echo '$(srcdir)/'`gui/dialogs/rangeEditDialog.cpp gui/dialogs/3Depict-rangeEditDialog.obj: gui/dialogs/rangeEditDialog.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gui/dialogs/3Depict-rangeEditDialog.obj -MD -MP -MF gui/dialogs/$(DEPDIR)/3Depict-rangeEditDialog.Tpo -c -o gui/dialogs/3Depict-rangeEditDialog.obj `if test -f 'gui/dialogs/rangeEditDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/rangeEditDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/rangeEditDialog.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gui/dialogs/$(DEPDIR)/3Depict-rangeEditDialog.Tpo gui/dialogs/$(DEPDIR)/3Depict-rangeEditDialog.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gui/dialogs/rangeEditDialog.cpp' object='gui/dialogs/3Depict-rangeEditDialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gui/dialogs/3Depict-rangeEditDialog.obj `if test -f 'gui/dialogs/rangeEditDialog.cpp'; then $(CYGPATH_W) 'gui/dialogs/rangeEditDialog.cpp'; else $(CYGPATH_W) '$(srcdir)/gui/dialogs/rangeEditDialog.cpp'; fi` backend/filters/3Depict-allFilter.o: backend/filters/allFilter.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-allFilter.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-allFilter.Tpo -c -o backend/filters/3Depict-allFilter.o `test -f 'backend/filters/allFilter.cpp' || echo '$(srcdir)/'`backend/filters/allFilter.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-allFilter.Tpo backend/filters/$(DEPDIR)/3Depict-allFilter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/allFilter.cpp' object='backend/filters/3Depict-allFilter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-allFilter.o `test -f 'backend/filters/allFilter.cpp' || echo '$(srcdir)/'`backend/filters/allFilter.cpp backend/filters/3Depict-allFilter.obj: backend/filters/allFilter.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-allFilter.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-allFilter.Tpo -c -o backend/filters/3Depict-allFilter.obj `if test -f 'backend/filters/allFilter.cpp'; then $(CYGPATH_W) 'backend/filters/allFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/allFilter.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-allFilter.Tpo backend/filters/$(DEPDIR)/3Depict-allFilter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/allFilter.cpp' object='backend/filters/3Depict-allFilter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-allFilter.obj `if test -f 'backend/filters/allFilter.cpp'; then $(CYGPATH_W) 'backend/filters/allFilter.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/allFilter.cpp'; fi` backend/filters/3Depict-filterCommon.o: backend/filters/filterCommon.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-filterCommon.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-filterCommon.Tpo -c -o backend/filters/3Depict-filterCommon.o `test -f 'backend/filters/filterCommon.cpp' || echo '$(srcdir)/'`backend/filters/filterCommon.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-filterCommon.Tpo backend/filters/$(DEPDIR)/3Depict-filterCommon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/filterCommon.cpp' object='backend/filters/3Depict-filterCommon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-filterCommon.o `test -f 'backend/filters/filterCommon.cpp' || echo '$(srcdir)/'`backend/filters/filterCommon.cpp backend/filters/3Depict-filterCommon.obj: backend/filters/filterCommon.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-filterCommon.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-filterCommon.Tpo -c -o backend/filters/3Depict-filterCommon.obj `if test -f 'backend/filters/filterCommon.cpp'; then $(CYGPATH_W) 'backend/filters/filterCommon.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/filterCommon.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-filterCommon.Tpo backend/filters/$(DEPDIR)/3Depict-filterCommon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/filterCommon.cpp' object='backend/filters/3Depict-filterCommon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-filterCommon.obj `if test -f 'backend/filters/filterCommon.cpp'; then $(CYGPATH_W) 'backend/filters/filterCommon.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/filterCommon.cpp'; fi` backend/filters/3Depict-dataLoad.o: backend/filters/dataLoad.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-dataLoad.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-dataLoad.Tpo -c -o backend/filters/3Depict-dataLoad.o `test -f 'backend/filters/dataLoad.cpp' || echo '$(srcdir)/'`backend/filters/dataLoad.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-dataLoad.Tpo backend/filters/$(DEPDIR)/3Depict-dataLoad.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/dataLoad.cpp' object='backend/filters/3Depict-dataLoad.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-dataLoad.o `test -f 'backend/filters/dataLoad.cpp' || echo '$(srcdir)/'`backend/filters/dataLoad.cpp backend/filters/3Depict-dataLoad.obj: backend/filters/dataLoad.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-dataLoad.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-dataLoad.Tpo -c -o backend/filters/3Depict-dataLoad.obj `if test -f 'backend/filters/dataLoad.cpp'; then $(CYGPATH_W) 'backend/filters/dataLoad.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/dataLoad.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-dataLoad.Tpo backend/filters/$(DEPDIR)/3Depict-dataLoad.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/dataLoad.cpp' object='backend/filters/3Depict-dataLoad.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-dataLoad.obj `if test -f 'backend/filters/dataLoad.cpp'; then $(CYGPATH_W) 'backend/filters/dataLoad.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/dataLoad.cpp'; fi` backend/filters/3Depict-ionDownsample.o: backend/filters/ionDownsample.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-ionDownsample.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-ionDownsample.Tpo -c -o backend/filters/3Depict-ionDownsample.o `test -f 'backend/filters/ionDownsample.cpp' || echo '$(srcdir)/'`backend/filters/ionDownsample.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-ionDownsample.Tpo backend/filters/$(DEPDIR)/3Depict-ionDownsample.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/ionDownsample.cpp' object='backend/filters/3Depict-ionDownsample.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-ionDownsample.o `test -f 'backend/filters/ionDownsample.cpp' || echo '$(srcdir)/'`backend/filters/ionDownsample.cpp backend/filters/3Depict-ionDownsample.obj: backend/filters/ionDownsample.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-ionDownsample.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-ionDownsample.Tpo -c -o backend/filters/3Depict-ionDownsample.obj `if test -f 'backend/filters/ionDownsample.cpp'; then $(CYGPATH_W) 'backend/filters/ionDownsample.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/ionDownsample.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-ionDownsample.Tpo backend/filters/$(DEPDIR)/3Depict-ionDownsample.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/ionDownsample.cpp' object='backend/filters/3Depict-ionDownsample.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-ionDownsample.obj `if test -f 'backend/filters/ionDownsample.cpp'; then $(CYGPATH_W) 'backend/filters/ionDownsample.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/ionDownsample.cpp'; fi` backend/filters/3Depict-rangeFile.o: backend/filters/rangeFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-rangeFile.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-rangeFile.Tpo -c -o backend/filters/3Depict-rangeFile.o `test -f 'backend/filters/rangeFile.cpp' || echo '$(srcdir)/'`backend/filters/rangeFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-rangeFile.Tpo backend/filters/$(DEPDIR)/3Depict-rangeFile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/rangeFile.cpp' object='backend/filters/3Depict-rangeFile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-rangeFile.o `test -f 'backend/filters/rangeFile.cpp' || echo '$(srcdir)/'`backend/filters/rangeFile.cpp backend/filters/3Depict-rangeFile.obj: backend/filters/rangeFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-rangeFile.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-rangeFile.Tpo -c -o backend/filters/3Depict-rangeFile.obj `if test -f 'backend/filters/rangeFile.cpp'; then $(CYGPATH_W) 'backend/filters/rangeFile.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/rangeFile.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-rangeFile.Tpo backend/filters/$(DEPDIR)/3Depict-rangeFile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/rangeFile.cpp' object='backend/filters/3Depict-rangeFile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-rangeFile.obj `if test -f 'backend/filters/rangeFile.cpp'; then $(CYGPATH_W) 'backend/filters/rangeFile.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/rangeFile.cpp'; fi` backend/filters/3Depict-voxelise.o: backend/filters/voxelise.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-voxelise.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-voxelise.Tpo -c -o backend/filters/3Depict-voxelise.o `test -f 'backend/filters/voxelise.cpp' || echo '$(srcdir)/'`backend/filters/voxelise.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-voxelise.Tpo backend/filters/$(DEPDIR)/3Depict-voxelise.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/voxelise.cpp' object='backend/filters/3Depict-voxelise.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-voxelise.o `test -f 'backend/filters/voxelise.cpp' || echo '$(srcdir)/'`backend/filters/voxelise.cpp backend/filters/3Depict-voxelise.obj: backend/filters/voxelise.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-voxelise.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-voxelise.Tpo -c -o backend/filters/3Depict-voxelise.obj `if test -f 'backend/filters/voxelise.cpp'; then $(CYGPATH_W) 'backend/filters/voxelise.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/voxelise.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-voxelise.Tpo backend/filters/$(DEPDIR)/3Depict-voxelise.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/voxelise.cpp' object='backend/filters/3Depict-voxelise.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-voxelise.obj `if test -f 'backend/filters/voxelise.cpp'; then $(CYGPATH_W) 'backend/filters/voxelise.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/voxelise.cpp'; fi` backend/filters/3Depict-spectrumPlot.o: backend/filters/spectrumPlot.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-spectrumPlot.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-spectrumPlot.Tpo -c -o backend/filters/3Depict-spectrumPlot.o `test -f 'backend/filters/spectrumPlot.cpp' || echo '$(srcdir)/'`backend/filters/spectrumPlot.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-spectrumPlot.Tpo backend/filters/$(DEPDIR)/3Depict-spectrumPlot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/spectrumPlot.cpp' object='backend/filters/3Depict-spectrumPlot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-spectrumPlot.o `test -f 'backend/filters/spectrumPlot.cpp' || echo '$(srcdir)/'`backend/filters/spectrumPlot.cpp backend/filters/3Depict-spectrumPlot.obj: backend/filters/spectrumPlot.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-spectrumPlot.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-spectrumPlot.Tpo -c -o backend/filters/3Depict-spectrumPlot.obj `if test -f 'backend/filters/spectrumPlot.cpp'; then $(CYGPATH_W) 'backend/filters/spectrumPlot.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/spectrumPlot.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-spectrumPlot.Tpo backend/filters/$(DEPDIR)/3Depict-spectrumPlot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/spectrumPlot.cpp' object='backend/filters/3Depict-spectrumPlot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-spectrumPlot.obj `if test -f 'backend/filters/spectrumPlot.cpp'; then $(CYGPATH_W) 'backend/filters/spectrumPlot.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/spectrumPlot.cpp'; fi` backend/filters/3Depict-transform.o: backend/filters/transform.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-transform.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-transform.Tpo -c -o backend/filters/3Depict-transform.o `test -f 'backend/filters/transform.cpp' || echo '$(srcdir)/'`backend/filters/transform.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-transform.Tpo backend/filters/$(DEPDIR)/3Depict-transform.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/transform.cpp' object='backend/filters/3Depict-transform.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-transform.o `test -f 'backend/filters/transform.cpp' || echo '$(srcdir)/'`backend/filters/transform.cpp backend/filters/3Depict-transform.obj: backend/filters/transform.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-transform.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-transform.Tpo -c -o backend/filters/3Depict-transform.obj `if test -f 'backend/filters/transform.cpp'; then $(CYGPATH_W) 'backend/filters/transform.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/transform.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-transform.Tpo backend/filters/$(DEPDIR)/3Depict-transform.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/transform.cpp' object='backend/filters/3Depict-transform.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-transform.obj `if test -f 'backend/filters/transform.cpp'; then $(CYGPATH_W) 'backend/filters/transform.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/transform.cpp'; fi` backend/filters/3Depict-externalProgram.o: backend/filters/externalProgram.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-externalProgram.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-externalProgram.Tpo -c -o backend/filters/3Depict-externalProgram.o `test -f 'backend/filters/externalProgram.cpp' || echo '$(srcdir)/'`backend/filters/externalProgram.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-externalProgram.Tpo backend/filters/$(DEPDIR)/3Depict-externalProgram.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/externalProgram.cpp' object='backend/filters/3Depict-externalProgram.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-externalProgram.o `test -f 'backend/filters/externalProgram.cpp' || echo '$(srcdir)/'`backend/filters/externalProgram.cpp backend/filters/3Depict-externalProgram.obj: backend/filters/externalProgram.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-externalProgram.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-externalProgram.Tpo -c -o backend/filters/3Depict-externalProgram.obj `if test -f 'backend/filters/externalProgram.cpp'; then $(CYGPATH_W) 'backend/filters/externalProgram.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/externalProgram.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-externalProgram.Tpo backend/filters/$(DEPDIR)/3Depict-externalProgram.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/externalProgram.cpp' object='backend/filters/3Depict-externalProgram.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-externalProgram.obj `if test -f 'backend/filters/externalProgram.cpp'; then $(CYGPATH_W) 'backend/filters/externalProgram.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/externalProgram.cpp'; fi` backend/filters/3Depict-ionClip.o: backend/filters/ionClip.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-ionClip.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-ionClip.Tpo -c -o backend/filters/3Depict-ionClip.o `test -f 'backend/filters/ionClip.cpp' || echo '$(srcdir)/'`backend/filters/ionClip.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-ionClip.Tpo backend/filters/$(DEPDIR)/3Depict-ionClip.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/ionClip.cpp' object='backend/filters/3Depict-ionClip.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-ionClip.o `test -f 'backend/filters/ionClip.cpp' || echo '$(srcdir)/'`backend/filters/ionClip.cpp backend/filters/3Depict-ionClip.obj: backend/filters/ionClip.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-ionClip.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-ionClip.Tpo -c -o backend/filters/3Depict-ionClip.obj `if test -f 'backend/filters/ionClip.cpp'; then $(CYGPATH_W) 'backend/filters/ionClip.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/ionClip.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-ionClip.Tpo backend/filters/$(DEPDIR)/3Depict-ionClip.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/ionClip.cpp' object='backend/filters/3Depict-ionClip.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-ionClip.obj `if test -f 'backend/filters/ionClip.cpp'; then $(CYGPATH_W) 'backend/filters/ionClip.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/ionClip.cpp'; fi` backend/filters/3Depict-ionColour.o: backend/filters/ionColour.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-ionColour.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-ionColour.Tpo -c -o backend/filters/3Depict-ionColour.o `test -f 'backend/filters/ionColour.cpp' || echo '$(srcdir)/'`backend/filters/ionColour.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-ionColour.Tpo backend/filters/$(DEPDIR)/3Depict-ionColour.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/ionColour.cpp' object='backend/filters/3Depict-ionColour.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-ionColour.o `test -f 'backend/filters/ionColour.cpp' || echo '$(srcdir)/'`backend/filters/ionColour.cpp backend/filters/3Depict-ionColour.obj: backend/filters/ionColour.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-ionColour.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-ionColour.Tpo -c -o backend/filters/3Depict-ionColour.obj `if test -f 'backend/filters/ionColour.cpp'; then $(CYGPATH_W) 'backend/filters/ionColour.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/ionColour.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-ionColour.Tpo backend/filters/$(DEPDIR)/3Depict-ionColour.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/ionColour.cpp' object='backend/filters/3Depict-ionColour.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-ionColour.obj `if test -f 'backend/filters/ionColour.cpp'; then $(CYGPATH_W) 'backend/filters/ionColour.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/ionColour.cpp'; fi` backend/filters/3Depict-boundingBox.o: backend/filters/boundingBox.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-boundingBox.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-boundingBox.Tpo -c -o backend/filters/3Depict-boundingBox.o `test -f 'backend/filters/boundingBox.cpp' || echo '$(srcdir)/'`backend/filters/boundingBox.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-boundingBox.Tpo backend/filters/$(DEPDIR)/3Depict-boundingBox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/boundingBox.cpp' object='backend/filters/3Depict-boundingBox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-boundingBox.o `test -f 'backend/filters/boundingBox.cpp' || echo '$(srcdir)/'`backend/filters/boundingBox.cpp backend/filters/3Depict-boundingBox.obj: backend/filters/boundingBox.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-boundingBox.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-boundingBox.Tpo -c -o backend/filters/3Depict-boundingBox.obj `if test -f 'backend/filters/boundingBox.cpp'; then $(CYGPATH_W) 'backend/filters/boundingBox.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/boundingBox.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-boundingBox.Tpo backend/filters/$(DEPDIR)/3Depict-boundingBox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/boundingBox.cpp' object='backend/filters/3Depict-boundingBox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-boundingBox.obj `if test -f 'backend/filters/boundingBox.cpp'; then $(CYGPATH_W) 'backend/filters/boundingBox.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/boundingBox.cpp'; fi` backend/filters/3Depict-profile.o: backend/filters/profile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-profile.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-profile.Tpo -c -o backend/filters/3Depict-profile.o `test -f 'backend/filters/profile.cpp' || echo '$(srcdir)/'`backend/filters/profile.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-profile.Tpo backend/filters/$(DEPDIR)/3Depict-profile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/profile.cpp' object='backend/filters/3Depict-profile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-profile.o `test -f 'backend/filters/profile.cpp' || echo '$(srcdir)/'`backend/filters/profile.cpp backend/filters/3Depict-profile.obj: backend/filters/profile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-profile.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-profile.Tpo -c -o backend/filters/3Depict-profile.obj `if test -f 'backend/filters/profile.cpp'; then $(CYGPATH_W) 'backend/filters/profile.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/profile.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-profile.Tpo backend/filters/$(DEPDIR)/3Depict-profile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/profile.cpp' object='backend/filters/3Depict-profile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-profile.obj `if test -f 'backend/filters/profile.cpp'; then $(CYGPATH_W) 'backend/filters/profile.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/profile.cpp'; fi` backend/filters/3Depict-spatialAnalysis.o: backend/filters/spatialAnalysis.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-spatialAnalysis.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-spatialAnalysis.Tpo -c -o backend/filters/3Depict-spatialAnalysis.o `test -f 'backend/filters/spatialAnalysis.cpp' || echo '$(srcdir)/'`backend/filters/spatialAnalysis.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-spatialAnalysis.Tpo backend/filters/$(DEPDIR)/3Depict-spatialAnalysis.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/spatialAnalysis.cpp' object='backend/filters/3Depict-spatialAnalysis.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-spatialAnalysis.o `test -f 'backend/filters/spatialAnalysis.cpp' || echo '$(srcdir)/'`backend/filters/spatialAnalysis.cpp backend/filters/3Depict-spatialAnalysis.obj: backend/filters/spatialAnalysis.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-spatialAnalysis.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-spatialAnalysis.Tpo -c -o backend/filters/3Depict-spatialAnalysis.obj `if test -f 'backend/filters/spatialAnalysis.cpp'; then $(CYGPATH_W) 'backend/filters/spatialAnalysis.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/spatialAnalysis.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-spatialAnalysis.Tpo backend/filters/$(DEPDIR)/3Depict-spatialAnalysis.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/spatialAnalysis.cpp' object='backend/filters/3Depict-spatialAnalysis.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-spatialAnalysis.obj `if test -f 'backend/filters/spatialAnalysis.cpp'; then $(CYGPATH_W) 'backend/filters/spatialAnalysis.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/spatialAnalysis.cpp'; fi` backend/filters/3Depict-clusterAnalysis.o: backend/filters/clusterAnalysis.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-clusterAnalysis.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-clusterAnalysis.Tpo -c -o backend/filters/3Depict-clusterAnalysis.o `test -f 'backend/filters/clusterAnalysis.cpp' || echo '$(srcdir)/'`backend/filters/clusterAnalysis.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-clusterAnalysis.Tpo backend/filters/$(DEPDIR)/3Depict-clusterAnalysis.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/clusterAnalysis.cpp' object='backend/filters/3Depict-clusterAnalysis.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-clusterAnalysis.o `test -f 'backend/filters/clusterAnalysis.cpp' || echo '$(srcdir)/'`backend/filters/clusterAnalysis.cpp backend/filters/3Depict-clusterAnalysis.obj: backend/filters/clusterAnalysis.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-clusterAnalysis.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-clusterAnalysis.Tpo -c -o backend/filters/3Depict-clusterAnalysis.obj `if test -f 'backend/filters/clusterAnalysis.cpp'; then $(CYGPATH_W) 'backend/filters/clusterAnalysis.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/clusterAnalysis.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-clusterAnalysis.Tpo backend/filters/$(DEPDIR)/3Depict-clusterAnalysis.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/clusterAnalysis.cpp' object='backend/filters/3Depict-clusterAnalysis.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-clusterAnalysis.obj `if test -f 'backend/filters/clusterAnalysis.cpp'; then $(CYGPATH_W) 'backend/filters/clusterAnalysis.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/clusterAnalysis.cpp'; fi` backend/filters/3Depict-ionInfo.o: backend/filters/ionInfo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-ionInfo.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-ionInfo.Tpo -c -o backend/filters/3Depict-ionInfo.o `test -f 'backend/filters/ionInfo.cpp' || echo '$(srcdir)/'`backend/filters/ionInfo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-ionInfo.Tpo backend/filters/$(DEPDIR)/3Depict-ionInfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/ionInfo.cpp' object='backend/filters/3Depict-ionInfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-ionInfo.o `test -f 'backend/filters/ionInfo.cpp' || echo '$(srcdir)/'`backend/filters/ionInfo.cpp backend/filters/3Depict-ionInfo.obj: backend/filters/ionInfo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-ionInfo.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-ionInfo.Tpo -c -o backend/filters/3Depict-ionInfo.obj `if test -f 'backend/filters/ionInfo.cpp'; then $(CYGPATH_W) 'backend/filters/ionInfo.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/ionInfo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-ionInfo.Tpo backend/filters/$(DEPDIR)/3Depict-ionInfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/ionInfo.cpp' object='backend/filters/3Depict-ionInfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-ionInfo.obj `if test -f 'backend/filters/ionInfo.cpp'; then $(CYGPATH_W) 'backend/filters/ionInfo.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/ionInfo.cpp'; fi` backend/filters/3Depict-annotation.o: backend/filters/annotation.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-annotation.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-annotation.Tpo -c -o backend/filters/3Depict-annotation.o `test -f 'backend/filters/annotation.cpp' || echo '$(srcdir)/'`backend/filters/annotation.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-annotation.Tpo backend/filters/$(DEPDIR)/3Depict-annotation.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/annotation.cpp' object='backend/filters/3Depict-annotation.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-annotation.o `test -f 'backend/filters/annotation.cpp' || echo '$(srcdir)/'`backend/filters/annotation.cpp backend/filters/3Depict-annotation.obj: backend/filters/annotation.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-annotation.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-annotation.Tpo -c -o backend/filters/3Depict-annotation.obj `if test -f 'backend/filters/annotation.cpp'; then $(CYGPATH_W) 'backend/filters/annotation.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/annotation.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-annotation.Tpo backend/filters/$(DEPDIR)/3Depict-annotation.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/annotation.cpp' object='backend/filters/3Depict-annotation.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-annotation.obj `if test -f 'backend/filters/annotation.cpp'; then $(CYGPATH_W) 'backend/filters/annotation.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/annotation.cpp'; fi` backend/filters/3Depict-geometryHelpers.o: backend/filters/geometryHelpers.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-geometryHelpers.o -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-geometryHelpers.Tpo -c -o backend/filters/3Depict-geometryHelpers.o `test -f 'backend/filters/geometryHelpers.cpp' || echo '$(srcdir)/'`backend/filters/geometryHelpers.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-geometryHelpers.Tpo backend/filters/$(DEPDIR)/3Depict-geometryHelpers.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/geometryHelpers.cpp' object='backend/filters/3Depict-geometryHelpers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-geometryHelpers.o `test -f 'backend/filters/geometryHelpers.cpp' || echo '$(srcdir)/'`backend/filters/geometryHelpers.cpp backend/filters/3Depict-geometryHelpers.obj: backend/filters/geometryHelpers.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/3Depict-geometryHelpers.obj -MD -MP -MF backend/filters/$(DEPDIR)/3Depict-geometryHelpers.Tpo -c -o backend/filters/3Depict-geometryHelpers.obj `if test -f 'backend/filters/geometryHelpers.cpp'; then $(CYGPATH_W) 'backend/filters/geometryHelpers.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/geometryHelpers.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/$(DEPDIR)/3Depict-geometryHelpers.Tpo backend/filters/$(DEPDIR)/3Depict-geometryHelpers.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/geometryHelpers.cpp' object='backend/filters/3Depict-geometryHelpers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/3Depict-geometryHelpers.obj `if test -f 'backend/filters/geometryHelpers.cpp'; then $(CYGPATH_W) 'backend/filters/geometryHelpers.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/geometryHelpers.cpp'; fi` backend/filters/algorithms/3Depict-binomial.o: backend/filters/algorithms/binomial.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/algorithms/3Depict-binomial.o -MD -MP -MF backend/filters/algorithms/$(DEPDIR)/3Depict-binomial.Tpo -c -o backend/filters/algorithms/3Depict-binomial.o `test -f 'backend/filters/algorithms/binomial.cpp' || echo '$(srcdir)/'`backend/filters/algorithms/binomial.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/algorithms/$(DEPDIR)/3Depict-binomial.Tpo backend/filters/algorithms/$(DEPDIR)/3Depict-binomial.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/algorithms/binomial.cpp' object='backend/filters/algorithms/3Depict-binomial.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/algorithms/3Depict-binomial.o `test -f 'backend/filters/algorithms/binomial.cpp' || echo '$(srcdir)/'`backend/filters/algorithms/binomial.cpp backend/filters/algorithms/3Depict-binomial.obj: backend/filters/algorithms/binomial.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/algorithms/3Depict-binomial.obj -MD -MP -MF backend/filters/algorithms/$(DEPDIR)/3Depict-binomial.Tpo -c -o backend/filters/algorithms/3Depict-binomial.obj `if test -f 'backend/filters/algorithms/binomial.cpp'; then $(CYGPATH_W) 'backend/filters/algorithms/binomial.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/algorithms/binomial.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/algorithms/$(DEPDIR)/3Depict-binomial.Tpo backend/filters/algorithms/$(DEPDIR)/3Depict-binomial.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/algorithms/binomial.cpp' object='backend/filters/algorithms/3Depict-binomial.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/algorithms/3Depict-binomial.obj `if test -f 'backend/filters/algorithms/binomial.cpp'; then $(CYGPATH_W) 'backend/filters/algorithms/binomial.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/algorithms/binomial.cpp'; fi` backend/filters/algorithms/3Depict-mass.o: backend/filters/algorithms/mass.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/algorithms/3Depict-mass.o -MD -MP -MF backend/filters/algorithms/$(DEPDIR)/3Depict-mass.Tpo -c -o backend/filters/algorithms/3Depict-mass.o `test -f 'backend/filters/algorithms/mass.cpp' || echo '$(srcdir)/'`backend/filters/algorithms/mass.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/algorithms/$(DEPDIR)/3Depict-mass.Tpo backend/filters/algorithms/$(DEPDIR)/3Depict-mass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/algorithms/mass.cpp' object='backend/filters/algorithms/3Depict-mass.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/algorithms/3Depict-mass.o `test -f 'backend/filters/algorithms/mass.cpp' || echo '$(srcdir)/'`backend/filters/algorithms/mass.cpp backend/filters/algorithms/3Depict-mass.obj: backend/filters/algorithms/mass.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/algorithms/3Depict-mass.obj -MD -MP -MF backend/filters/algorithms/$(DEPDIR)/3Depict-mass.Tpo -c -o backend/filters/algorithms/3Depict-mass.obj `if test -f 'backend/filters/algorithms/mass.cpp'; then $(CYGPATH_W) 'backend/filters/algorithms/mass.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/algorithms/mass.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/algorithms/$(DEPDIR)/3Depict-mass.Tpo backend/filters/algorithms/$(DEPDIR)/3Depict-mass.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/algorithms/mass.cpp' object='backend/filters/algorithms/3Depict-mass.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/algorithms/3Depict-mass.obj `if test -f 'backend/filters/algorithms/mass.cpp'; then $(CYGPATH_W) 'backend/filters/algorithms/mass.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/algorithms/mass.cpp'; fi` backend/3Depict-animator.o: backend/animator.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-animator.o -MD -MP -MF backend/$(DEPDIR)/3Depict-animator.Tpo -c -o backend/3Depict-animator.o `test -f 'backend/animator.cpp' || echo '$(srcdir)/'`backend/animator.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-animator.Tpo backend/$(DEPDIR)/3Depict-animator.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/animator.cpp' object='backend/3Depict-animator.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-animator.o `test -f 'backend/animator.cpp' || echo '$(srcdir)/'`backend/animator.cpp backend/3Depict-animator.obj: backend/animator.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-animator.obj -MD -MP -MF backend/$(DEPDIR)/3Depict-animator.Tpo -c -o backend/3Depict-animator.obj `if test -f 'backend/animator.cpp'; then $(CYGPATH_W) 'backend/animator.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/animator.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-animator.Tpo backend/$(DEPDIR)/3Depict-animator.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/animator.cpp' object='backend/3Depict-animator.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-animator.obj `if test -f 'backend/animator.cpp'; then $(CYGPATH_W) 'backend/animator.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/animator.cpp'; fi` backend/3Depict-filtertreeAnalyse.o: backend/filtertreeAnalyse.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-filtertreeAnalyse.o -MD -MP -MF backend/$(DEPDIR)/3Depict-filtertreeAnalyse.Tpo -c -o backend/3Depict-filtertreeAnalyse.o `test -f 'backend/filtertreeAnalyse.cpp' || echo '$(srcdir)/'`backend/filtertreeAnalyse.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-filtertreeAnalyse.Tpo backend/$(DEPDIR)/3Depict-filtertreeAnalyse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filtertreeAnalyse.cpp' object='backend/3Depict-filtertreeAnalyse.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-filtertreeAnalyse.o `test -f 'backend/filtertreeAnalyse.cpp' || echo '$(srcdir)/'`backend/filtertreeAnalyse.cpp backend/3Depict-filtertreeAnalyse.obj: backend/filtertreeAnalyse.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-filtertreeAnalyse.obj -MD -MP -MF backend/$(DEPDIR)/3Depict-filtertreeAnalyse.Tpo -c -o backend/3Depict-filtertreeAnalyse.obj `if test -f 'backend/filtertreeAnalyse.cpp'; then $(CYGPATH_W) 'backend/filtertreeAnalyse.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filtertreeAnalyse.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-filtertreeAnalyse.Tpo backend/$(DEPDIR)/3Depict-filtertreeAnalyse.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filtertreeAnalyse.cpp' object='backend/3Depict-filtertreeAnalyse.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-filtertreeAnalyse.obj `if test -f 'backend/filtertreeAnalyse.cpp'; then $(CYGPATH_W) 'backend/filtertreeAnalyse.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filtertreeAnalyse.cpp'; fi` backend/3Depict-filtertree.o: backend/filtertree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-filtertree.o -MD -MP -MF backend/$(DEPDIR)/3Depict-filtertree.Tpo -c -o backend/3Depict-filtertree.o `test -f 'backend/filtertree.cpp' || echo '$(srcdir)/'`backend/filtertree.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-filtertree.Tpo backend/$(DEPDIR)/3Depict-filtertree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filtertree.cpp' object='backend/3Depict-filtertree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-filtertree.o `test -f 'backend/filtertree.cpp' || echo '$(srcdir)/'`backend/filtertree.cpp backend/3Depict-filtertree.obj: backend/filtertree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-filtertree.obj -MD -MP -MF backend/$(DEPDIR)/3Depict-filtertree.Tpo -c -o backend/3Depict-filtertree.obj `if test -f 'backend/filtertree.cpp'; then $(CYGPATH_W) 'backend/filtertree.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filtertree.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-filtertree.Tpo backend/$(DEPDIR)/3Depict-filtertree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filtertree.cpp' object='backend/3Depict-filtertree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-filtertree.obj `if test -f 'backend/filtertree.cpp'; then $(CYGPATH_W) 'backend/filtertree.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filtertree.cpp'; fi` backend/APT/3Depict-ionhit.o: backend/APT/ionhit.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/APT/3Depict-ionhit.o -MD -MP -MF backend/APT/$(DEPDIR)/3Depict-ionhit.Tpo -c -o backend/APT/3Depict-ionhit.o `test -f 'backend/APT/ionhit.cpp' || echo '$(srcdir)/'`backend/APT/ionhit.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/APT/$(DEPDIR)/3Depict-ionhit.Tpo backend/APT/$(DEPDIR)/3Depict-ionhit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/APT/ionhit.cpp' object='backend/APT/3Depict-ionhit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/APT/3Depict-ionhit.o `test -f 'backend/APT/ionhit.cpp' || echo '$(srcdir)/'`backend/APT/ionhit.cpp backend/APT/3Depict-ionhit.obj: backend/APT/ionhit.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/APT/3Depict-ionhit.obj -MD -MP -MF backend/APT/$(DEPDIR)/3Depict-ionhit.Tpo -c -o backend/APT/3Depict-ionhit.obj `if test -f 'backend/APT/ionhit.cpp'; then $(CYGPATH_W) 'backend/APT/ionhit.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/APT/ionhit.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/APT/$(DEPDIR)/3Depict-ionhit.Tpo backend/APT/$(DEPDIR)/3Depict-ionhit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/APT/ionhit.cpp' object='backend/APT/3Depict-ionhit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/APT/3Depict-ionhit.obj `if test -f 'backend/APT/ionhit.cpp'; then $(CYGPATH_W) 'backend/APT/ionhit.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/APT/ionhit.cpp'; fi` backend/APT/3Depict-APTFileIO.o: backend/APT/APTFileIO.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/APT/3Depict-APTFileIO.o -MD -MP -MF backend/APT/$(DEPDIR)/3Depict-APTFileIO.Tpo -c -o backend/APT/3Depict-APTFileIO.o `test -f 'backend/APT/APTFileIO.cpp' || echo '$(srcdir)/'`backend/APT/APTFileIO.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/APT/$(DEPDIR)/3Depict-APTFileIO.Tpo backend/APT/$(DEPDIR)/3Depict-APTFileIO.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/APT/APTFileIO.cpp' object='backend/APT/3Depict-APTFileIO.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/APT/3Depict-APTFileIO.o `test -f 'backend/APT/APTFileIO.cpp' || echo '$(srcdir)/'`backend/APT/APTFileIO.cpp backend/APT/3Depict-APTFileIO.obj: backend/APT/APTFileIO.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/APT/3Depict-APTFileIO.obj -MD -MP -MF backend/APT/$(DEPDIR)/3Depict-APTFileIO.Tpo -c -o backend/APT/3Depict-APTFileIO.obj `if test -f 'backend/APT/APTFileIO.cpp'; then $(CYGPATH_W) 'backend/APT/APTFileIO.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/APT/APTFileIO.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/APT/$(DEPDIR)/3Depict-APTFileIO.Tpo backend/APT/$(DEPDIR)/3Depict-APTFileIO.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/APT/APTFileIO.cpp' object='backend/APT/3Depict-APTFileIO.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/APT/3Depict-APTFileIO.obj `if test -f 'backend/APT/APTFileIO.cpp'; then $(CYGPATH_W) 'backend/APT/APTFileIO.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/APT/APTFileIO.cpp'; fi` backend/APT/3Depict-APTRanges.o: backend/APT/APTRanges.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/APT/3Depict-APTRanges.o -MD -MP -MF backend/APT/$(DEPDIR)/3Depict-APTRanges.Tpo -c -o backend/APT/3Depict-APTRanges.o `test -f 'backend/APT/APTRanges.cpp' || echo '$(srcdir)/'`backend/APT/APTRanges.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/APT/$(DEPDIR)/3Depict-APTRanges.Tpo backend/APT/$(DEPDIR)/3Depict-APTRanges.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/APT/APTRanges.cpp' object='backend/APT/3Depict-APTRanges.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/APT/3Depict-APTRanges.o `test -f 'backend/APT/APTRanges.cpp' || echo '$(srcdir)/'`backend/APT/APTRanges.cpp backend/APT/3Depict-APTRanges.obj: backend/APT/APTRanges.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/APT/3Depict-APTRanges.obj -MD -MP -MF backend/APT/$(DEPDIR)/3Depict-APTRanges.Tpo -c -o backend/APT/3Depict-APTRanges.obj `if test -f 'backend/APT/APTRanges.cpp'; then $(CYGPATH_W) 'backend/APT/APTRanges.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/APT/APTRanges.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/APT/$(DEPDIR)/3Depict-APTRanges.Tpo backend/APT/$(DEPDIR)/3Depict-APTRanges.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/APT/APTRanges.cpp' object='backend/APT/3Depict-APTRanges.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/APT/3Depict-APTRanges.obj `if test -f 'backend/APT/APTRanges.cpp'; then $(CYGPATH_W) 'backend/APT/APTRanges.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/APT/APTRanges.cpp'; fi` backend/APT/3Depict-abundanceParser.o: backend/APT/abundanceParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/APT/3Depict-abundanceParser.o -MD -MP -MF backend/APT/$(DEPDIR)/3Depict-abundanceParser.Tpo -c -o backend/APT/3Depict-abundanceParser.o `test -f 'backend/APT/abundanceParser.cpp' || echo '$(srcdir)/'`backend/APT/abundanceParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/APT/$(DEPDIR)/3Depict-abundanceParser.Tpo backend/APT/$(DEPDIR)/3Depict-abundanceParser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/APT/abundanceParser.cpp' object='backend/APT/3Depict-abundanceParser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/APT/3Depict-abundanceParser.o `test -f 'backend/APT/abundanceParser.cpp' || echo '$(srcdir)/'`backend/APT/abundanceParser.cpp backend/APT/3Depict-abundanceParser.obj: backend/APT/abundanceParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/APT/3Depict-abundanceParser.obj -MD -MP -MF backend/APT/$(DEPDIR)/3Depict-abundanceParser.Tpo -c -o backend/APT/3Depict-abundanceParser.obj `if test -f 'backend/APT/abundanceParser.cpp'; then $(CYGPATH_W) 'backend/APT/abundanceParser.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/APT/abundanceParser.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/APT/$(DEPDIR)/3Depict-abundanceParser.Tpo backend/APT/$(DEPDIR)/3Depict-abundanceParser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/APT/abundanceParser.cpp' object='backend/APT/3Depict-abundanceParser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/APT/3Depict-abundanceParser.obj `if test -f 'backend/APT/abundanceParser.cpp'; then $(CYGPATH_W) 'backend/APT/abundanceParser.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/APT/abundanceParser.cpp'; fi` backend/APT/3Depict-vtk.o: backend/APT/vtk.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/APT/3Depict-vtk.o -MD -MP -MF backend/APT/$(DEPDIR)/3Depict-vtk.Tpo -c -o backend/APT/3Depict-vtk.o `test -f 'backend/APT/vtk.cpp' || echo '$(srcdir)/'`backend/APT/vtk.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/APT/$(DEPDIR)/3Depict-vtk.Tpo backend/APT/$(DEPDIR)/3Depict-vtk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/APT/vtk.cpp' object='backend/APT/3Depict-vtk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/APT/3Depict-vtk.o `test -f 'backend/APT/vtk.cpp' || echo '$(srcdir)/'`backend/APT/vtk.cpp backend/APT/3Depict-vtk.obj: backend/APT/vtk.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/APT/3Depict-vtk.obj -MD -MP -MF backend/APT/$(DEPDIR)/3Depict-vtk.Tpo -c -o backend/APT/3Depict-vtk.obj `if test -f 'backend/APT/vtk.cpp'; then $(CYGPATH_W) 'backend/APT/vtk.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/APT/vtk.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/APT/$(DEPDIR)/3Depict-vtk.Tpo backend/APT/$(DEPDIR)/3Depict-vtk.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/APT/vtk.cpp' object='backend/APT/3Depict-vtk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/APT/3Depict-vtk.obj `if test -f 'backend/APT/vtk.cpp'; then $(CYGPATH_W) 'backend/APT/vtk.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/APT/vtk.cpp'; fi` backend/filters/algorithms/3Depict-K3DTree.o: backend/filters/algorithms/K3DTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/algorithms/3Depict-K3DTree.o -MD -MP -MF backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree.Tpo -c -o backend/filters/algorithms/3Depict-K3DTree.o `test -f 'backend/filters/algorithms/K3DTree.cpp' || echo '$(srcdir)/'`backend/filters/algorithms/K3DTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree.Tpo backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/algorithms/K3DTree.cpp' object='backend/filters/algorithms/3Depict-K3DTree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/algorithms/3Depict-K3DTree.o `test -f 'backend/filters/algorithms/K3DTree.cpp' || echo '$(srcdir)/'`backend/filters/algorithms/K3DTree.cpp backend/filters/algorithms/3Depict-K3DTree.obj: backend/filters/algorithms/K3DTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/algorithms/3Depict-K3DTree.obj -MD -MP -MF backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree.Tpo -c -o backend/filters/algorithms/3Depict-K3DTree.obj `if test -f 'backend/filters/algorithms/K3DTree.cpp'; then $(CYGPATH_W) 'backend/filters/algorithms/K3DTree.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/algorithms/K3DTree.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree.Tpo backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/algorithms/K3DTree.cpp' object='backend/filters/algorithms/3Depict-K3DTree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/algorithms/3Depict-K3DTree.obj `if test -f 'backend/filters/algorithms/K3DTree.cpp'; then $(CYGPATH_W) 'backend/filters/algorithms/K3DTree.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/algorithms/K3DTree.cpp'; fi` backend/filters/algorithms/3Depict-K3DTree-mk2.o: backend/filters/algorithms/K3DTree-mk2.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/algorithms/3Depict-K3DTree-mk2.o -MD -MP -MF backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree-mk2.Tpo -c -o backend/filters/algorithms/3Depict-K3DTree-mk2.o `test -f 'backend/filters/algorithms/K3DTree-mk2.cpp' || echo '$(srcdir)/'`backend/filters/algorithms/K3DTree-mk2.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree-mk2.Tpo backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree-mk2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/algorithms/K3DTree-mk2.cpp' object='backend/filters/algorithms/3Depict-K3DTree-mk2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/algorithms/3Depict-K3DTree-mk2.o `test -f 'backend/filters/algorithms/K3DTree-mk2.cpp' || echo '$(srcdir)/'`backend/filters/algorithms/K3DTree-mk2.cpp backend/filters/algorithms/3Depict-K3DTree-mk2.obj: backend/filters/algorithms/K3DTree-mk2.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/algorithms/3Depict-K3DTree-mk2.obj -MD -MP -MF backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree-mk2.Tpo -c -o backend/filters/algorithms/3Depict-K3DTree-mk2.obj `if test -f 'backend/filters/algorithms/K3DTree-mk2.cpp'; then $(CYGPATH_W) 'backend/filters/algorithms/K3DTree-mk2.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/algorithms/K3DTree-mk2.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree-mk2.Tpo backend/filters/algorithms/$(DEPDIR)/3Depict-K3DTree-mk2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/algorithms/K3DTree-mk2.cpp' object='backend/filters/algorithms/3Depict-K3DTree-mk2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/algorithms/3Depict-K3DTree-mk2.obj `if test -f 'backend/filters/algorithms/K3DTree-mk2.cpp'; then $(CYGPATH_W) 'backend/filters/algorithms/K3DTree-mk2.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/algorithms/K3DTree-mk2.cpp'; fi` backend/3Depict-filter.o: backend/filter.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-filter.o -MD -MP -MF backend/$(DEPDIR)/3Depict-filter.Tpo -c -o backend/3Depict-filter.o `test -f 'backend/filter.cpp' || echo '$(srcdir)/'`backend/filter.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-filter.Tpo backend/$(DEPDIR)/3Depict-filter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filter.cpp' object='backend/3Depict-filter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-filter.o `test -f 'backend/filter.cpp' || echo '$(srcdir)/'`backend/filter.cpp backend/3Depict-filter.obj: backend/filter.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-filter.obj -MD -MP -MF backend/$(DEPDIR)/3Depict-filter.Tpo -c -o backend/3Depict-filter.obj `if test -f 'backend/filter.cpp'; then $(CYGPATH_W) 'backend/filter.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filter.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-filter.Tpo backend/$(DEPDIR)/3Depict-filter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filter.cpp' object='backend/3Depict-filter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-filter.obj `if test -f 'backend/filter.cpp'; then $(CYGPATH_W) 'backend/filter.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filter.cpp'; fi` backend/filters/algorithms/3Depict-rdf.o: backend/filters/algorithms/rdf.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/algorithms/3Depict-rdf.o -MD -MP -MF backend/filters/algorithms/$(DEPDIR)/3Depict-rdf.Tpo -c -o backend/filters/algorithms/3Depict-rdf.o `test -f 'backend/filters/algorithms/rdf.cpp' || echo '$(srcdir)/'`backend/filters/algorithms/rdf.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/algorithms/$(DEPDIR)/3Depict-rdf.Tpo backend/filters/algorithms/$(DEPDIR)/3Depict-rdf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/algorithms/rdf.cpp' object='backend/filters/algorithms/3Depict-rdf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/algorithms/3Depict-rdf.o `test -f 'backend/filters/algorithms/rdf.cpp' || echo '$(srcdir)/'`backend/filters/algorithms/rdf.cpp backend/filters/algorithms/3Depict-rdf.obj: backend/filters/algorithms/rdf.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/filters/algorithms/3Depict-rdf.obj -MD -MP -MF backend/filters/algorithms/$(DEPDIR)/3Depict-rdf.Tpo -c -o backend/filters/algorithms/3Depict-rdf.obj `if test -f 'backend/filters/algorithms/rdf.cpp'; then $(CYGPATH_W) 'backend/filters/algorithms/rdf.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/algorithms/rdf.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/filters/algorithms/$(DEPDIR)/3Depict-rdf.Tpo backend/filters/algorithms/$(DEPDIR)/3Depict-rdf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/filters/algorithms/rdf.cpp' object='backend/filters/algorithms/3Depict-rdf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/filters/algorithms/3Depict-rdf.obj `if test -f 'backend/filters/algorithms/rdf.cpp'; then $(CYGPATH_W) 'backend/filters/algorithms/rdf.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/filters/algorithms/rdf.cpp'; fi` backend/3Depict-viscontrol.o: backend/viscontrol.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-viscontrol.o -MD -MP -MF backend/$(DEPDIR)/3Depict-viscontrol.Tpo -c -o backend/3Depict-viscontrol.o `test -f 'backend/viscontrol.cpp' || echo '$(srcdir)/'`backend/viscontrol.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-viscontrol.Tpo backend/$(DEPDIR)/3Depict-viscontrol.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/viscontrol.cpp' object='backend/3Depict-viscontrol.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-viscontrol.o `test -f 'backend/viscontrol.cpp' || echo '$(srcdir)/'`backend/viscontrol.cpp backend/3Depict-viscontrol.obj: backend/viscontrol.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-viscontrol.obj -MD -MP -MF backend/$(DEPDIR)/3Depict-viscontrol.Tpo -c -o backend/3Depict-viscontrol.obj `if test -f 'backend/viscontrol.cpp'; then $(CYGPATH_W) 'backend/viscontrol.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/viscontrol.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-viscontrol.Tpo backend/$(DEPDIR)/3Depict-viscontrol.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/viscontrol.cpp' object='backend/3Depict-viscontrol.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-viscontrol.obj `if test -f 'backend/viscontrol.cpp'; then $(CYGPATH_W) 'backend/viscontrol.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/viscontrol.cpp'; fi` backend/3Depict-state.o: backend/state.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-state.o -MD -MP -MF backend/$(DEPDIR)/3Depict-state.Tpo -c -o backend/3Depict-state.o `test -f 'backend/state.cpp' || echo '$(srcdir)/'`backend/state.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-state.Tpo backend/$(DEPDIR)/3Depict-state.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/state.cpp' object='backend/3Depict-state.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-state.o `test -f 'backend/state.cpp' || echo '$(srcdir)/'`backend/state.cpp backend/3Depict-state.obj: backend/state.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-state.obj -MD -MP -MF backend/$(DEPDIR)/3Depict-state.Tpo -c -o backend/3Depict-state.obj `if test -f 'backend/state.cpp'; then $(CYGPATH_W) 'backend/state.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/state.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-state.Tpo backend/$(DEPDIR)/3Depict-state.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/state.cpp' object='backend/3Depict-state.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-state.obj `if test -f 'backend/state.cpp'; then $(CYGPATH_W) 'backend/state.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/state.cpp'; fi` backend/3Depict-plot.o: backend/plot.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-plot.o -MD -MP -MF backend/$(DEPDIR)/3Depict-plot.Tpo -c -o backend/3Depict-plot.o `test -f 'backend/plot.cpp' || echo '$(srcdir)/'`backend/plot.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-plot.Tpo backend/$(DEPDIR)/3Depict-plot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/plot.cpp' object='backend/3Depict-plot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-plot.o `test -f 'backend/plot.cpp' || echo '$(srcdir)/'`backend/plot.cpp backend/3Depict-plot.obj: backend/plot.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-plot.obj -MD -MP -MF backend/$(DEPDIR)/3Depict-plot.Tpo -c -o backend/3Depict-plot.obj `if test -f 'backend/plot.cpp'; then $(CYGPATH_W) 'backend/plot.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/plot.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-plot.Tpo backend/$(DEPDIR)/3Depict-plot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/plot.cpp' object='backend/3Depict-plot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-plot.obj `if test -f 'backend/plot.cpp'; then $(CYGPATH_W) 'backend/plot.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/plot.cpp'; fi` backend/3Depict-configFile.o: backend/configFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-configFile.o -MD -MP -MF backend/$(DEPDIR)/3Depict-configFile.Tpo -c -o backend/3Depict-configFile.o `test -f 'backend/configFile.cpp' || echo '$(srcdir)/'`backend/configFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-configFile.Tpo backend/$(DEPDIR)/3Depict-configFile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/configFile.cpp' object='backend/3Depict-configFile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-configFile.o `test -f 'backend/configFile.cpp' || echo '$(srcdir)/'`backend/configFile.cpp backend/3Depict-configFile.obj: backend/configFile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT backend/3Depict-configFile.obj -MD -MP -MF backend/$(DEPDIR)/3Depict-configFile.Tpo -c -o backend/3Depict-configFile.obj `if test -f 'backend/configFile.cpp'; then $(CYGPATH_W) 'backend/configFile.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/configFile.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) backend/$(DEPDIR)/3Depict-configFile.Tpo backend/$(DEPDIR)/3Depict-configFile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='backend/configFile.cpp' object='backend/3Depict-configFile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o backend/3Depict-configFile.obj `if test -f 'backend/configFile.cpp'; then $(CYGPATH_W) 'backend/configFile.cpp'; else $(CYGPATH_W) '$(srcdir)/backend/configFile.cpp'; fi` gl/3Depict-scene.o: gl/scene.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-scene.o -MD -MP -MF gl/$(DEPDIR)/3Depict-scene.Tpo -c -o gl/3Depict-scene.o `test -f 'gl/scene.cpp' || echo '$(srcdir)/'`gl/scene.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-scene.Tpo gl/$(DEPDIR)/3Depict-scene.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/scene.cpp' object='gl/3Depict-scene.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-scene.o `test -f 'gl/scene.cpp' || echo '$(srcdir)/'`gl/scene.cpp gl/3Depict-scene.obj: gl/scene.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-scene.obj -MD -MP -MF gl/$(DEPDIR)/3Depict-scene.Tpo -c -o gl/3Depict-scene.obj `if test -f 'gl/scene.cpp'; then $(CYGPATH_W) 'gl/scene.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/scene.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-scene.Tpo gl/$(DEPDIR)/3Depict-scene.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/scene.cpp' object='gl/3Depict-scene.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-scene.obj `if test -f 'gl/scene.cpp'; then $(CYGPATH_W) 'gl/scene.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/scene.cpp'; fi` gl/3Depict-drawables.o: gl/drawables.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-drawables.o -MD -MP -MF gl/$(DEPDIR)/3Depict-drawables.Tpo -c -o gl/3Depict-drawables.o `test -f 'gl/drawables.cpp' || echo '$(srcdir)/'`gl/drawables.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-drawables.Tpo gl/$(DEPDIR)/3Depict-drawables.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/drawables.cpp' object='gl/3Depict-drawables.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-drawables.o `test -f 'gl/drawables.cpp' || echo '$(srcdir)/'`gl/drawables.cpp gl/3Depict-drawables.obj: gl/drawables.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-drawables.obj -MD -MP -MF gl/$(DEPDIR)/3Depict-drawables.Tpo -c -o gl/3Depict-drawables.obj `if test -f 'gl/drawables.cpp'; then $(CYGPATH_W) 'gl/drawables.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/drawables.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-drawables.Tpo gl/$(DEPDIR)/3Depict-drawables.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/drawables.cpp' object='gl/3Depict-drawables.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-drawables.obj `if test -f 'gl/drawables.cpp'; then $(CYGPATH_W) 'gl/drawables.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/drawables.cpp'; fi` gl/3Depict-effect.o: gl/effect.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-effect.o -MD -MP -MF gl/$(DEPDIR)/3Depict-effect.Tpo -c -o gl/3Depict-effect.o `test -f 'gl/effect.cpp' || echo '$(srcdir)/'`gl/effect.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-effect.Tpo gl/$(DEPDIR)/3Depict-effect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/effect.cpp' object='gl/3Depict-effect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-effect.o `test -f 'gl/effect.cpp' || echo '$(srcdir)/'`gl/effect.cpp gl/3Depict-effect.obj: gl/effect.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-effect.obj -MD -MP -MF gl/$(DEPDIR)/3Depict-effect.Tpo -c -o gl/3Depict-effect.obj `if test -f 'gl/effect.cpp'; then $(CYGPATH_W) 'gl/effect.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/effect.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-effect.Tpo gl/$(DEPDIR)/3Depict-effect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/effect.cpp' object='gl/3Depict-effect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-effect.obj `if test -f 'gl/effect.cpp'; then $(CYGPATH_W) 'gl/effect.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/effect.cpp'; fi` gl/3Depict-textures.o: gl/textures.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-textures.o -MD -MP -MF gl/$(DEPDIR)/3Depict-textures.Tpo -c -o gl/3Depict-textures.o `test -f 'gl/textures.cpp' || echo '$(srcdir)/'`gl/textures.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-textures.Tpo gl/$(DEPDIR)/3Depict-textures.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/textures.cpp' object='gl/3Depict-textures.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-textures.o `test -f 'gl/textures.cpp' || echo '$(srcdir)/'`gl/textures.cpp gl/3Depict-textures.obj: gl/textures.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-textures.obj -MD -MP -MF gl/$(DEPDIR)/3Depict-textures.Tpo -c -o gl/3Depict-textures.obj `if test -f 'gl/textures.cpp'; then $(CYGPATH_W) 'gl/textures.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/textures.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-textures.Tpo gl/$(DEPDIR)/3Depict-textures.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/textures.cpp' object='gl/3Depict-textures.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-textures.obj `if test -f 'gl/textures.cpp'; then $(CYGPATH_W) 'gl/textures.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/textures.cpp'; fi` gl/3Depict-select.o: gl/select.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-select.o -MD -MP -MF gl/$(DEPDIR)/3Depict-select.Tpo -c -o gl/3Depict-select.o `test -f 'gl/select.cpp' || echo '$(srcdir)/'`gl/select.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-select.Tpo gl/$(DEPDIR)/3Depict-select.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/select.cpp' object='gl/3Depict-select.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-select.o `test -f 'gl/select.cpp' || echo '$(srcdir)/'`gl/select.cpp gl/3Depict-select.obj: gl/select.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-select.obj -MD -MP -MF gl/$(DEPDIR)/3Depict-select.Tpo -c -o gl/3Depict-select.obj `if test -f 'gl/select.cpp'; then $(CYGPATH_W) 'gl/select.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/select.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-select.Tpo gl/$(DEPDIR)/3Depict-select.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/select.cpp' object='gl/3Depict-select.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-select.obj `if test -f 'gl/select.cpp'; then $(CYGPATH_W) 'gl/select.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/select.cpp'; fi` gl/3Depict-cameras.o: gl/cameras.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-cameras.o -MD -MP -MF gl/$(DEPDIR)/3Depict-cameras.Tpo -c -o gl/3Depict-cameras.o `test -f 'gl/cameras.cpp' || echo '$(srcdir)/'`gl/cameras.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-cameras.Tpo gl/$(DEPDIR)/3Depict-cameras.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/cameras.cpp' object='gl/3Depict-cameras.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-cameras.o `test -f 'gl/cameras.cpp' || echo '$(srcdir)/'`gl/cameras.cpp gl/3Depict-cameras.obj: gl/cameras.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-cameras.obj -MD -MP -MF gl/$(DEPDIR)/3Depict-cameras.Tpo -c -o gl/3Depict-cameras.obj `if test -f 'gl/cameras.cpp'; then $(CYGPATH_W) 'gl/cameras.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/cameras.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-cameras.Tpo gl/$(DEPDIR)/3Depict-cameras.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/cameras.cpp' object='gl/3Depict-cameras.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-cameras.obj `if test -f 'gl/cameras.cpp'; then $(CYGPATH_W) 'gl/cameras.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/cameras.cpp'; fi` gl/3Depict-isoSurface.o: gl/isoSurface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-isoSurface.o -MD -MP -MF gl/$(DEPDIR)/3Depict-isoSurface.Tpo -c -o gl/3Depict-isoSurface.o `test -f 'gl/isoSurface.cpp' || echo '$(srcdir)/'`gl/isoSurface.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-isoSurface.Tpo gl/$(DEPDIR)/3Depict-isoSurface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/isoSurface.cpp' object='gl/3Depict-isoSurface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-isoSurface.o `test -f 'gl/isoSurface.cpp' || echo '$(srcdir)/'`gl/isoSurface.cpp gl/3Depict-isoSurface.obj: gl/isoSurface.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-isoSurface.obj -MD -MP -MF gl/$(DEPDIR)/3Depict-isoSurface.Tpo -c -o gl/3Depict-isoSurface.obj `if test -f 'gl/isoSurface.cpp'; then $(CYGPATH_W) 'gl/isoSurface.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/isoSurface.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-isoSurface.Tpo gl/$(DEPDIR)/3Depict-isoSurface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/isoSurface.cpp' object='gl/3Depict-isoSurface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-isoSurface.obj `if test -f 'gl/isoSurface.cpp'; then $(CYGPATH_W) 'gl/isoSurface.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/isoSurface.cpp'; fi` gl/3Depict-tr.o: gl/tr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-tr.o -MD -MP -MF gl/$(DEPDIR)/3Depict-tr.Tpo -c -o gl/3Depict-tr.o `test -f 'gl/tr.cpp' || echo '$(srcdir)/'`gl/tr.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-tr.Tpo gl/$(DEPDIR)/3Depict-tr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/tr.cpp' object='gl/3Depict-tr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-tr.o `test -f 'gl/tr.cpp' || echo '$(srcdir)/'`gl/tr.cpp gl/3Depict-tr.obj: gl/tr.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT gl/3Depict-tr.obj -MD -MP -MF gl/$(DEPDIR)/3Depict-tr.Tpo -c -o gl/3Depict-tr.obj `if test -f 'gl/tr.cpp'; then $(CYGPATH_W) 'gl/tr.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/tr.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) gl/$(DEPDIR)/3Depict-tr.Tpo gl/$(DEPDIR)/3Depict-tr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='gl/tr.cpp' object='gl/3Depict-tr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o gl/3Depict-tr.obj `if test -f 'gl/tr.cpp'; then $(CYGPATH_W) 'gl/tr.cpp'; else $(CYGPATH_W) '$(srcdir)/gl/tr.cpp'; fi` common/3Depict-stringFuncs.o: common/stringFuncs.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-stringFuncs.o -MD -MP -MF common/$(DEPDIR)/3Depict-stringFuncs.Tpo -c -o common/3Depict-stringFuncs.o `test -f 'common/stringFuncs.cpp' || echo '$(srcdir)/'`common/stringFuncs.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-stringFuncs.Tpo common/$(DEPDIR)/3Depict-stringFuncs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/stringFuncs.cpp' object='common/3Depict-stringFuncs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-stringFuncs.o `test -f 'common/stringFuncs.cpp' || echo '$(srcdir)/'`common/stringFuncs.cpp common/3Depict-stringFuncs.obj: common/stringFuncs.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-stringFuncs.obj -MD -MP -MF common/$(DEPDIR)/3Depict-stringFuncs.Tpo -c -o common/3Depict-stringFuncs.obj `if test -f 'common/stringFuncs.cpp'; then $(CYGPATH_W) 'common/stringFuncs.cpp'; else $(CYGPATH_W) '$(srcdir)/common/stringFuncs.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-stringFuncs.Tpo common/$(DEPDIR)/3Depict-stringFuncs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/stringFuncs.cpp' object='common/3Depict-stringFuncs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-stringFuncs.obj `if test -f 'common/stringFuncs.cpp'; then $(CYGPATH_W) 'common/stringFuncs.cpp'; else $(CYGPATH_W) '$(srcdir)/common/stringFuncs.cpp'; fi` common/3Depict-constants.o: common/constants.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-constants.o -MD -MP -MF common/$(DEPDIR)/3Depict-constants.Tpo -c -o common/3Depict-constants.o `test -f 'common/constants.cpp' || echo '$(srcdir)/'`common/constants.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-constants.Tpo common/$(DEPDIR)/3Depict-constants.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/constants.cpp' object='common/3Depict-constants.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-constants.o `test -f 'common/constants.cpp' || echo '$(srcdir)/'`common/constants.cpp common/3Depict-constants.obj: common/constants.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-constants.obj -MD -MP -MF common/$(DEPDIR)/3Depict-constants.Tpo -c -o common/3Depict-constants.obj `if test -f 'common/constants.cpp'; then $(CYGPATH_W) 'common/constants.cpp'; else $(CYGPATH_W) '$(srcdir)/common/constants.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-constants.Tpo common/$(DEPDIR)/3Depict-constants.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/constants.cpp' object='common/3Depict-constants.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-constants.obj `if test -f 'common/constants.cpp'; then $(CYGPATH_W) 'common/constants.cpp'; else $(CYGPATH_W) '$(srcdir)/common/constants.cpp'; fi` common/3Depict-xmlHelper.o: common/xmlHelper.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-xmlHelper.o -MD -MP -MF common/$(DEPDIR)/3Depict-xmlHelper.Tpo -c -o common/3Depict-xmlHelper.o `test -f 'common/xmlHelper.cpp' || echo '$(srcdir)/'`common/xmlHelper.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-xmlHelper.Tpo common/$(DEPDIR)/3Depict-xmlHelper.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/xmlHelper.cpp' object='common/3Depict-xmlHelper.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-xmlHelper.o `test -f 'common/xmlHelper.cpp' || echo '$(srcdir)/'`common/xmlHelper.cpp common/3Depict-xmlHelper.obj: common/xmlHelper.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-xmlHelper.obj -MD -MP -MF common/$(DEPDIR)/3Depict-xmlHelper.Tpo -c -o common/3Depict-xmlHelper.obj `if test -f 'common/xmlHelper.cpp'; then $(CYGPATH_W) 'common/xmlHelper.cpp'; else $(CYGPATH_W) '$(srcdir)/common/xmlHelper.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-xmlHelper.Tpo common/$(DEPDIR)/3Depict-xmlHelper.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/xmlHelper.cpp' object='common/3Depict-xmlHelper.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-xmlHelper.obj `if test -f 'common/xmlHelper.cpp'; then $(CYGPATH_W) 'common/xmlHelper.cpp'; else $(CYGPATH_W) '$(srcdir)/common/xmlHelper.cpp'; fi` common/3Depict-colourmap.o: common/colourmap.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-colourmap.o -MD -MP -MF common/$(DEPDIR)/3Depict-colourmap.Tpo -c -o common/3Depict-colourmap.o `test -f 'common/colourmap.cpp' || echo '$(srcdir)/'`common/colourmap.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-colourmap.Tpo common/$(DEPDIR)/3Depict-colourmap.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/colourmap.cpp' object='common/3Depict-colourmap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-colourmap.o `test -f 'common/colourmap.cpp' || echo '$(srcdir)/'`common/colourmap.cpp common/3Depict-colourmap.obj: common/colourmap.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-colourmap.obj -MD -MP -MF common/$(DEPDIR)/3Depict-colourmap.Tpo -c -o common/3Depict-colourmap.obj `if test -f 'common/colourmap.cpp'; then $(CYGPATH_W) 'common/colourmap.cpp'; else $(CYGPATH_W) '$(srcdir)/common/colourmap.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-colourmap.Tpo common/$(DEPDIR)/3Depict-colourmap.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/colourmap.cpp' object='common/3Depict-colourmap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-colourmap.obj `if test -f 'common/colourmap.cpp'; then $(CYGPATH_W) 'common/colourmap.cpp'; else $(CYGPATH_W) '$(srcdir)/common/colourmap.cpp'; fi` common/3Depict-voxels.o: common/voxels.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-voxels.o -MD -MP -MF common/$(DEPDIR)/3Depict-voxels.Tpo -c -o common/3Depict-voxels.o `test -f 'common/voxels.cpp' || echo '$(srcdir)/'`common/voxels.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-voxels.Tpo common/$(DEPDIR)/3Depict-voxels.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/voxels.cpp' object='common/3Depict-voxels.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-voxels.o `test -f 'common/voxels.cpp' || echo '$(srcdir)/'`common/voxels.cpp common/3Depict-voxels.obj: common/voxels.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-voxels.obj -MD -MP -MF common/$(DEPDIR)/3Depict-voxels.Tpo -c -o common/3Depict-voxels.obj `if test -f 'common/voxels.cpp'; then $(CYGPATH_W) 'common/voxels.cpp'; else $(CYGPATH_W) '$(srcdir)/common/voxels.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-voxels.Tpo common/$(DEPDIR)/3Depict-voxels.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/voxels.cpp' object='common/3Depict-voxels.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-voxels.obj `if test -f 'common/voxels.cpp'; then $(CYGPATH_W) 'common/voxels.cpp'; else $(CYGPATH_W) '$(srcdir)/common/voxels.cpp'; fi` common/3Depict-mathfuncs.o: common/mathfuncs.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-mathfuncs.o -MD -MP -MF common/$(DEPDIR)/3Depict-mathfuncs.Tpo -c -o common/3Depict-mathfuncs.o `test -f 'common/mathfuncs.cpp' || echo '$(srcdir)/'`common/mathfuncs.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-mathfuncs.Tpo common/$(DEPDIR)/3Depict-mathfuncs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/mathfuncs.cpp' object='common/3Depict-mathfuncs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-mathfuncs.o `test -f 'common/mathfuncs.cpp' || echo '$(srcdir)/'`common/mathfuncs.cpp common/3Depict-mathfuncs.obj: common/mathfuncs.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-mathfuncs.obj -MD -MP -MF common/$(DEPDIR)/3Depict-mathfuncs.Tpo -c -o common/3Depict-mathfuncs.obj `if test -f 'common/mathfuncs.cpp'; then $(CYGPATH_W) 'common/mathfuncs.cpp'; else $(CYGPATH_W) '$(srcdir)/common/mathfuncs.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-mathfuncs.Tpo common/$(DEPDIR)/3Depict-mathfuncs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/mathfuncs.cpp' object='common/3Depict-mathfuncs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-mathfuncs.obj `if test -f 'common/mathfuncs.cpp'; then $(CYGPATH_W) 'common/mathfuncs.cpp'; else $(CYGPATH_W) '$(srcdir)/common/mathfuncs.cpp'; fi` common/3Depict-basics.o: common/basics.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-basics.o -MD -MP -MF common/$(DEPDIR)/3Depict-basics.Tpo -c -o common/3Depict-basics.o `test -f 'common/basics.cpp' || echo '$(srcdir)/'`common/basics.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-basics.Tpo common/$(DEPDIR)/3Depict-basics.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/basics.cpp' object='common/3Depict-basics.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-basics.o `test -f 'common/basics.cpp' || echo '$(srcdir)/'`common/basics.cpp common/3Depict-basics.obj: common/basics.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-basics.obj -MD -MP -MF common/$(DEPDIR)/3Depict-basics.Tpo -c -o common/3Depict-basics.obj `if test -f 'common/basics.cpp'; then $(CYGPATH_W) 'common/basics.cpp'; else $(CYGPATH_W) '$(srcdir)/common/basics.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-basics.Tpo common/$(DEPDIR)/3Depict-basics.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/basics.cpp' object='common/3Depict-basics.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-basics.obj `if test -f 'common/basics.cpp'; then $(CYGPATH_W) 'common/basics.cpp'; else $(CYGPATH_W) '$(srcdir)/common/basics.cpp'; fi` common/3Depict-assertion.o: common/assertion.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-assertion.o -MD -MP -MF common/$(DEPDIR)/3Depict-assertion.Tpo -c -o common/3Depict-assertion.o `test -f 'common/assertion.cpp' || echo '$(srcdir)/'`common/assertion.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-assertion.Tpo common/$(DEPDIR)/3Depict-assertion.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/assertion.cpp' object='common/3Depict-assertion.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-assertion.o `test -f 'common/assertion.cpp' || echo '$(srcdir)/'`common/assertion.cpp common/3Depict-assertion.obj: common/assertion.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-assertion.obj -MD -MP -MF common/$(DEPDIR)/3Depict-assertion.Tpo -c -o common/3Depict-assertion.obj `if test -f 'common/assertion.cpp'; then $(CYGPATH_W) 'common/assertion.cpp'; else $(CYGPATH_W) '$(srcdir)/common/assertion.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-assertion.Tpo common/$(DEPDIR)/3Depict-assertion.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/assertion.cpp' object='common/3Depict-assertion.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-assertion.obj `if test -f 'common/assertion.cpp'; then $(CYGPATH_W) 'common/assertion.cpp'; else $(CYGPATH_W) '$(srcdir)/common/assertion.cpp'; fi` common/3Depict-mesh.o: common/mesh.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-mesh.o -MD -MP -MF common/$(DEPDIR)/3Depict-mesh.Tpo -c -o common/3Depict-mesh.o `test -f 'common/mesh.cpp' || echo '$(srcdir)/'`common/mesh.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-mesh.Tpo common/$(DEPDIR)/3Depict-mesh.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/mesh.cpp' object='common/3Depict-mesh.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-mesh.o `test -f 'common/mesh.cpp' || echo '$(srcdir)/'`common/mesh.cpp common/3Depict-mesh.obj: common/mesh.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-mesh.obj -MD -MP -MF common/$(DEPDIR)/3Depict-mesh.Tpo -c -o common/3Depict-mesh.obj `if test -f 'common/mesh.cpp'; then $(CYGPATH_W) 'common/mesh.cpp'; else $(CYGPATH_W) '$(srcdir)/common/mesh.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-mesh.Tpo common/$(DEPDIR)/3Depict-mesh.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/mesh.cpp' object='common/3Depict-mesh.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-mesh.obj `if test -f 'common/mesh.cpp'; then $(CYGPATH_W) 'common/mesh.cpp'; else $(CYGPATH_W) '$(srcdir)/common/mesh.cpp'; fi` common/3Depict-gsl_helper.o: common/gsl_helper.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-gsl_helper.o -MD -MP -MF common/$(DEPDIR)/3Depict-gsl_helper.Tpo -c -o common/3Depict-gsl_helper.o `test -f 'common/gsl_helper.cpp' || echo '$(srcdir)/'`common/gsl_helper.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-gsl_helper.Tpo common/$(DEPDIR)/3Depict-gsl_helper.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/gsl_helper.cpp' object='common/3Depict-gsl_helper.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-gsl_helper.o `test -f 'common/gsl_helper.cpp' || echo '$(srcdir)/'`common/gsl_helper.cpp common/3Depict-gsl_helper.obj: common/gsl_helper.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT common/3Depict-gsl_helper.obj -MD -MP -MF common/$(DEPDIR)/3Depict-gsl_helper.Tpo -c -o common/3Depict-gsl_helper.obj `if test -f 'common/gsl_helper.cpp'; then $(CYGPATH_W) 'common/gsl_helper.cpp'; else $(CYGPATH_W) '$(srcdir)/common/gsl_helper.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) common/$(DEPDIR)/3Depict-gsl_helper.Tpo common/$(DEPDIR)/3Depict-gsl_helper.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='common/gsl_helper.cpp' object='common/3Depict-gsl_helper.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o common/3Depict-gsl_helper.obj `if test -f 'common/gsl_helper.cpp'; then $(CYGPATH_W) 'common/gsl_helper.cpp'; else $(CYGPATH_W) '$(srcdir)/common/gsl_helper.cpp'; fi` testing/3Depict-mglTesting.o: testing/mglTesting.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT testing/3Depict-mglTesting.o -MD -MP -MF testing/$(DEPDIR)/3Depict-mglTesting.Tpo -c -o testing/3Depict-mglTesting.o `test -f 'testing/mglTesting.cpp' || echo '$(srcdir)/'`testing/mglTesting.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) testing/$(DEPDIR)/3Depict-mglTesting.Tpo testing/$(DEPDIR)/3Depict-mglTesting.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='testing/mglTesting.cpp' object='testing/3Depict-mglTesting.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o testing/3Depict-mglTesting.o `test -f 'testing/mglTesting.cpp' || echo '$(srcdir)/'`testing/mglTesting.cpp testing/3Depict-mglTesting.obj: testing/mglTesting.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -MT testing/3Depict-mglTesting.obj -MD -MP -MF testing/$(DEPDIR)/3Depict-mglTesting.Tpo -c -o testing/3Depict-mglTesting.obj `if test -f 'testing/mglTesting.cpp'; then $(CYGPATH_W) 'testing/mglTesting.cpp'; else $(CYGPATH_W) '$(srcdir)/testing/mglTesting.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) testing/$(DEPDIR)/3Depict-mglTesting.Tpo testing/$(DEPDIR)/3Depict-mglTesting.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='testing/mglTesting.cpp' object='testing/3Depict-mglTesting.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(3Depict_CXXFLAGS) $(CXXFLAGS) -c -o testing/3Depict-mglTesting.obj `if test -f 'testing/mglTesting.cpp'; then $(CYGPATH_W) 'testing/mglTesting.cpp'; else $(CYGPATH_W) '$(srcdir)/testing/mglTesting.cpp'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f backend/$(DEPDIR)/$(am__dirstamp) -rm -f backend/$(am__dirstamp) -rm -f backend/APT/$(DEPDIR)/$(am__dirstamp) -rm -f backend/APT/$(am__dirstamp) -rm -f backend/filters/$(DEPDIR)/$(am__dirstamp) -rm -f backend/filters/$(am__dirstamp) -rm -f backend/filters/algorithms/$(DEPDIR)/$(am__dirstamp) -rm -f backend/filters/algorithms/$(am__dirstamp) -rm -f common/$(DEPDIR)/$(am__dirstamp) -rm -f common/$(am__dirstamp) -rm -f gl/$(DEPDIR)/$(am__dirstamp) -rm -f gl/$(am__dirstamp) -rm -f gui/$(DEPDIR)/$(am__dirstamp) -rm -f gui/$(am__dirstamp) -rm -f gui/dialogs/$(DEPDIR)/$(am__dirstamp) -rm -f gui/dialogs/$(am__dirstamp) -rm -f gui/dialogs/animateSubDialogs/$(DEPDIR)/$(am__dirstamp) -rm -f gui/dialogs/animateSubDialogs/$(am__dirstamp) -rm -f testing/$(DEPDIR)/$(am__dirstamp) -rm -f testing/$(am__dirstamp) -rm -f wx/$(DEPDIR)/$(am__dirstamp) -rm -f wx/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) backend/$(DEPDIR) backend/APT/$(DEPDIR) backend/filters/$(DEPDIR) backend/filters/algorithms/$(DEPDIR) common/$(DEPDIR) gl/$(DEPDIR) gui/$(DEPDIR) gui/dialogs/$(DEPDIR) gui/dialogs/animateSubDialogs/$(DEPDIR) testing/$(DEPDIR) wx/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) backend/$(DEPDIR) backend/APT/$(DEPDIR) backend/filters/$(DEPDIR) backend/filters/algorithms/$(DEPDIR) common/$(DEPDIR) gl/$(DEPDIR) gui/$(DEPDIR) gui/dialogs/$(DEPDIR) gui/dialogs/animateSubDialogs/$(DEPDIR) testing/$(DEPDIR) wx/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-binPROGRAMS install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS %.rc.o: $(WX_RESCOMP) $^ -o $@ 3Depict.rc # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: 3Depict-0.0.19/src/3Depict.cpp0000644000175000017500000003117112640746376015270 0ustar pcuserpcuser/* * threeDepict.cpp - main program implementation * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #ifndef DEBUG #include #endif #ifdef __APPLE__ #include "CoreFoundation/CoreFoundation.h" #endif #include "common/translation.h" #include "gui/mainFrame.h" //Unit testing code #include "testing/testing.h" enum { ID_MAIN_WINDOW=wxID_ANY+1, }; class threeDepictApp: public wxApp { private: void redirectWxLogging(); std::ofstream debugLogStream; MainWindowFrame* MainFrame ; wxArrayString commandLineFiles; wxLocale* usrLocale; long language; void initLanguageSupport(); //Don't load the main window, as debugging was in progress bool dontLoad; public: threeDepictApp() ; bool OnInit(); virtual void OnInitCmdLine(wxCmdLineParser& parser); virtual int OnExit(); virtual bool OnCmdLineParsed(wxCmdLineParser& parser); int FilterEvent(wxEvent &event); #ifdef __APPLE__ void MacOpenFile(const wxString & fileName); void MacReopenFile(const wxString & fileName); #endif }; //Check version is in place because wxT is deprecated for wx 2.9 //Command line parameter table static const wxCmdLineEntryDesc g_cmdLineDesc [] = { { wxCMD_LINE_SWITCH, ("h"), ("help"), ("displays this message"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP }, { wxCMD_LINE_PARAM, NULL, NULL, ("inputfile"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_PARAM_MULTIPLE}, //Unit testing system #ifdef DEBUG { wxCMD_LINE_SWITCH, ("t"), ("test"), ("Run debug unit tests, returns nonzero on test failure, zero on success.\n\t\t" "XML files may be passed to run , instead of default tests"), wxCMD_LINE_VAL_NONE, wxCMD_LINE_SWITCH}, #endif { wxCMD_LINE_NONE,NULL,NULL,NULL,wxCMD_LINE_VAL_NONE,0 } }; #ifdef __WXMSW__ //Force a windows console to show for cerr/cout #ifdef DEBUG #include "winconsole.h" winconsole winC; #endif #endif IMPLEMENT_APP(threeDepictApp) threeDepictApp::threeDepictApp() { MainFrame=0;usrLocale=0; dontLoad=false; //Wx 2.9 and up now has assertions auto-enabled. //Disable for release builds #ifndef DEBUG wxSetAssertHandler(NULL); #endif redirectWxLogging(); } void threeDepictApp::redirectWxLogging() { //Disable user visible logging on the main thread, this can throw up "error dialogs" // to the user that seem to be false positives, such as "Error: Sucess" type messages // ihstead try first to log to file. If that fails, just disable it wxStandardPaths &paths = wxStandardPaths::Get(); wxString filePath = paths.GetDocumentsDir(); filePath+=("/.")+string(PROGRAM_NAME) + string("log.txt"); debugLogStream.open(filePath.c_str()); if(!debugLogStream) wxLog::EnableLogging(false); else wxLog::SetActiveTarget(new wxLogStream(&debugLogStream)); } int threeDepictApp::OnExit() { if(usrLocale) delete usrLocale; //libxml2 by default seems to leak memory, unless you call this function xmlCleanupParser(); return wxApp::OnExit(); } void threeDepictApp::initLanguageSupport() { language = wxLANGUAGE_DEFAULT; // load language if possible, fall back to English otherwise if(wxLocale::IsAvailable(language)) { //Wx 2.9 and above are now unicode, so locale encoding //conversion is deprecated. #if !wxCHECK_VERSION(2, 9, 0) usrLocale = new wxLocale( language, wxLOCALE_CONV_ENCODING | wxLOCALE_LOAD_DEFAULT); #else usrLocale = new wxLocale( language, wxLOCALE_LOAD_DEFAULT); #endif #if defined(__WXMAC__) wxStandardPaths* paths = (wxStandardPaths*) &wxStandardPaths::Get(); usrLocale->AddCatalogLookupPathPrefix(paths->GetResourcesDir()); #elif defined(__WIN32__) wxStandardPaths* paths = (wxStandardPaths*) &wxStandardPaths::Get(); usrLocale->AddCatalogLookupPathPrefix(paths->GetResourcesDir()); usrLocale->AddCatalogLookupPathPrefix ( wxT ( "locales" ) ); #endif usrLocale->AddCatalog((PROGRAM_NAME)); if(! usrLocale->IsOk() ) { std::cerr << "Unable to initialise usrLocale, falling back to English" << std::endl; delete usrLocale; usrLocale = new wxLocale( wxLANGUAGE_ENGLISH ); language = wxLANGUAGE_ENGLISH; } else { //Set the gettext language textdomain( PROGRAM_NAME ); setlocale (LC_ALL, ""); #ifdef __WXMAC__ bindtextdomain( PROGRAM_NAME, paths->GetResourcesDir().mb_str(wxConvUTF8) ); #elif defined(__WIN32) || defined(__WIN64) cerr << paths->GetResourcesDir().mb_str(wxConvUTF8) << std::endl; std::string s; s = paths->GetResourcesDir().mb_str(wxConvUTF8); s+="/locales/"; bindtextdomain( PROGRAM_NAME, s.c_str() ); //The names for the codesets are in confg.charset in gettext-runtime/intl in // the gettext package. Tell gettext what codepage windows is using. // // The windows lookup codes are at // http://msdn.microsoft.com/en-us/library/dd317756%28v=VS.85%29.aspx unsigned int curPage; curPage=GetACP(); switch(curPage) { case 1252: std::cerr << "Bound cp1252" << std::endl; bind_textdomain_codeset(PROGRAM_NAME, "CP1252"); break; case 65001: std::cerr << "Bound utf8"<< std::endl; bind_textdomain_codeset(PROGRAM_NAME, "UTF-8"); break; default: std::cerr << "Unknown codepage " << curPage << std::endl; break; } #else bindtextdomain( PROGRAM_NAME, "/usr/share/locale" ); bind_textdomain_codeset(PROGRAM_NAME, "utf-8"); #endif } } else { std::cout << "Language not supported, falling back to English" << std::endl; usrLocale = new wxLocale( wxLANGUAGE_ENGLISH ); language = wxLANGUAGE_ENGLISH; } } //Catching key events globally. int threeDepictApp::FilterEvent(wxEvent& event) { //Process global keyboard (non-accelerator) events if ( event.GetEventType()==wxEVT_KEY_DOWN ) { bool mainActive; #ifdef __APPLE__ mainActive=true; //Any way to actually get this?? wxGetActiveWindow() apparently returns null here. #else mainActive =( wxGetTopLevelParent((wxWindow*)(wxGetActiveWindow())) == (wxWindow*)MainFrame); #endif if(MainFrame && mainActive) { wxKeyEvent& keyEvent = (wxKeyEvent&)event; //Under GTK, escape aborts refresh. under mac, //set it to also abort fullscreen, if not refreshing if(keyEvent.GetKeyCode()==WXK_ESCAPE) { if( MainFrame->isCurrentlyUpdatingScene()) { wxCommandEvent cmd; MainFrame->OnProgressAbort( cmd); return true; } #ifdef __APPLE__ else if(MainFrame->IsFullScreen()) { wxCommandEvent cmd; MainFrame->OnViewFullscreen(cmd); MainFrame->ShowFullScreen(false); return true; } #endif } //If the user presses F5, generate refresh if( keyEvent.GetKeyCode()==WXK_F5) { wxCommandEvent cmd; MainFrame->OnButtonRefresh(cmd); } #ifdef DEBUG //Determine if control or meta key is down (dep. platform) bool commandDown; commandDown=keyEvent.ControlDown(); //If the user presses ctrl+insert, or alt+f5 //(ctrl+f5 doesn't work on mac, nor does it have an insert key) //this activates hidden //functionality to create autosave from filtertree if((keyEvent.GetKeyCode()==WXK_INSERT && commandDown) || (keyEvent.GetKeyCode()==WXK_F5 && keyEvent.AltDown()) ) { wxTimerEvent evt; MainFrame->OnAutosaveTimer(evt); } #endif } } return -1; } //Command line help table and setup void threeDepictApp::OnInitCmdLine(wxCmdLineParser& parser) { wxString name,version,preamble; name=(PROGRAM_NAME); name=name+ wxT(" "); version=(PROGRAM_VERSION); version+=wxT("\n"); preamble=wxT("Copyright (C) 2015 3Depict team\n"); preamble+=wxT("This program comes with ABSOLUTELY NO WARRANTY; for details see LICENCE file.\n"); preamble+=wxT("This is free software, and you are welcome to redistribute it under certain conditions.\n"); preamble+=wxT("Source code is available under the terms of the GNU GPL v3.0 or any later version (http://www.gnu.org/licenses/gpl.txt)\n"); parser.SetLogo(name+version+preamble); parser.SetDesc (g_cmdLineDesc); parser.SetSwitchChars (wxT("-")); } //Initialise wxwidgets parser bool threeDepictApp::OnCmdLineParsed(wxCmdLineParser& parser) { #ifdef DEBUG if( parser.Found(wxT("test"))) { //If we were given arguments, try to load them //otherwise use the inbuilt test files if(parser.GetParamCount()) { for(unsigned int ui=0;uiOnDropFiles(array,0,0); } void threeDepictApp::MacReopenFile(const wxString &filename) { ASSERT(MainFrame); MainFrame->Raise(); MacOpenFile(filename); } #endif bool threeDepictApp::OnInit() { initLanguageSupport(); #if defined(DEBUG) && defined(__linux__) //Virtualbox has a bug, where the video driver generates FPEs // trapfpe(); //Under Linux, enable segfault on invalid floating point operations #endif //Set the gettext language //Register signal handler for backtraces if (!wxApp::OnInit()) return false; //if we ran the debug code, don't load the main window if(dontLoad) { OnExit(); //FIXME: This causes wx to shutdown incorrectly, but gives us the return code // - I can't seem to simultaneously set the return code and // abort the init. exit(0); return false; } //Need to seed random number generator for entire program srand (time(NULL)); //Use a heuristic method (ie look around) to find a good sans-serif font TTFFinder fontFinder; setDefaultFontFile(fontFinder.getBestFontFile(TTFFINDER_FONT_SANS)); wxInitAllImageHandlers(); MainFrame = new MainWindowFrame(NULL, ID_MAIN_WINDOW, wxEmptyString,wxDefaultPosition,wxDefaultSize); SetTopWindow(MainFrame); #ifdef __APPLE__ //Switch the working directory into the .app bundle's resources //directory using the absolute path CFBundleRef mainBundle = CFBundleGetMainBundle(); CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); char path[PATH_MAX]; if (!CFURLGetFileSystemRepresentation(resourcesURL, TRUE, (UInt8 *)path, PATH_MAX)) { // error! } else { CFRelease(resourcesURL); chdir(path); } #endif MainFrame->Show(); MainFrame->checkShowTips(); MainFrame->checkReloadAutosave(); if(commandLineFiles.GetCount()) MainFrame->SetCommandLineFiles(commandLineFiles); MainFrame->fixSplitterWindow(); MainFrame->finaliseStartup(); return true; } 3Depict-0.0.19/src/myAppIcon.ico0000644000175000017500000011455012640746376015667 0ustar pcuserpcuserRPNG  IHDR\rf IDATxyWy{Vi6k,˶˲"2A.I$@roBr !^ml!˲IFH3[UwUW:է{zB,]]ԩ*57 6>u?h=<ǃ \2_ص~J n;kp _YGsw|i |p w+>?1u=|y?ŧ~y}&5\wp+`sgzOrC)чډ ᚧU.^C۶m>eoc>y7I_gK媇-.^<6õK*ܕу.\\ຏPzfwnIoeyYFc?)6<3ޱ>rϛk֯⪹\<~Fx۪եw\gϼWs{|8$W^/|MM|u`=WfA\byCqk3qPzsl_1Jnw9x_T?7w[rrxrkYЧyM7P^5+oW;WGvOlXq% w ڷzW9#y7/{_/~~y1ĚS7?aǟo\ \E8|ލ"%5)R[x4zY~Fpo%|zؓn=>حIn^w ӗ[ܸ\U֜q _=b ??Mqۻ~ow3yK+33=y]k({!~ti\Gn(J݇Ɯװk+}p)/ܶsq^tL| YeHGҗnӯ;q`筪_kS݇Ɯ}#Ϲ]yd=،(ێQy6zh|9q`]_`|Ơgzx0Q#N4K941aLUPxI\,Fն~…́sLzg-ڛt7# ^>gx.Y.%|>u'Nt4 rO~:֡jC3=g݉3KL9Y(3O]]t>$ @ w~x „z/'j󬳘;@?p8φ!8q`u:m?T G3oR`t80wy<+46?y r39ᮇbڃ0d,y; Y㛇Gaغlyk^I߈6:kH8ubK#uNWR UkZ06Sg'vo`u2Ya;xrrAFwsVaVsRg/g.p{vReeیj-Y#l@2: gujjgޙ qU(,Y#S\%լ_s&ɭ2UE2Xew-yU ȡ3QA>hHG/ $n'r=~ լQ5x7~+XW=@sP}|%7=C[7'|+2]*4Ir/ێxypQy$L|}m%6MG\Q70w%e䯽we)Z\u.ѷ΃<PW JnN h[ߏ܀g0 K+rL+z%/ƙ ıOd/-X|\y/|i6V.F7j-emBl`We .|׿G!eO^ArMWZH*H !k;@t>@vR Ȉ͛Gߕנ\{grRKbz4ƻZxd PZnn<yeo,tv|AJHuGC @TrJ>ȽaA#dx|W0Jξċnz4G<|D'.7.?@: ^!b ;$N2acAt5E:\F!CnS[lnPm2y{ysp㥗so@`ג~Q@8Q[1G7jzZwmpR%1g>M['݈ r2-o! =q)!r{~^kLMIL tFej$,7m8r|hFgN3\4!\ݺpR%;8nU1%'nNĒz҈ݱt+uDtjO6Bx,g+^$J:K:HSI2\'p2/ _ٛ-9Gsή{훜:޾yr'.?=?]o!qú5 'U' ECT&5G Z ҉T3q3yQ:5҃mB4Dx|$>.w9[_wpZv7ڗ~o"%γo]S8Iw,2żko$ٖm`(Z'AǮ]]$c FcNH4ձ1ϰBZq,7[=濶L{qՒns1n[U׾#W_ _lxQAxh*ͫ7n` J#?65t"vNB#G:EZؖf;O#{6P469rݰ42ǫ]dF`jg u?8y2~ <i{oAxg 8SIt'j7 .soK Ava,l7hME,: u= F7՘?nݸ"ڵzXw:'oye/Gjdy/ƞ\_Yg5\JETK-u smV`iQS-ED0T}<|Cuyw {'j vnXvMK>_Wms}9P eaӺuSO1sA2ۺ u~90 s_?DၽLVp 3|Φ \wv`U=Ws>Ѕ?<>l֭a_v2C| \p/j-w!Q:3/v j(M5ټ2mνQw\΁?o~ *lZArL((ZrfϲSaU| .Y:Vp9u 90<ڏQxwAνΞ97mQJdt&^d7kVdaPQe专Ј\C(ǥԪ9$D^窕g둍uqc~k 7n:|_/PX ='jRE&IO3e,b^j gfWM) %OIؔ&i8L0ʄa(tDAxſvo9v}o$兿mCU(QŽdVH݄ijڑYru(x㹌s7FۮL1 zRjUn=Ñ/[;ps7m}]<\ʹ/ L0l3/K 4:ԗhʋ^ZQ2ޮg{/GkR%Zt}[}12V0bJ$Vu=0Hrt^ F?ݵm埍?'/74Ոx^ƛ7rKrr ¡,ezFo?%G$j*[!ϰOvuѻN{.#>6Λ$y"e2Y!T)-N%#4Uo4J i'fl#?Z7#\a-N\f8`ZaX3UfXcTÉxa ~ %.޼ !͸+$֙kYEQHw7* m d]џkڏM&Aryv^aW:ksڧ,<,RuRaoI=E8,'dhmC|5y*/"W-⢏Qp^;$.Owbw{S"hiFGy݁sowR: o P/O%n]k⮋G|k۩7srTwnaQnpIU-qU~lBQoT։j`6.S_~8`FVqy7hF*?U_(./"h^Pbڎ{^ {w{{yZuCwG嵓}GT:fz7 LT}We*K|VF7]˫.`dP@vTwGܬ_ǦmTɢ&rL JT^24Y/4J;r..|o}?`jjܿ7h451 j)R  ToLFnxnG2 5K:S35:N}ƸENm@S-XK?|X!Yt':_Yg[_UW?$#tKlnJ ն8R1JD*yF#WwƖ6k*#g.w\+1ʸn_;׌10u}K/09OQ.ݳ}ewl+r^Է:n6_ VyYۡQzb^*K^zeú&; ^Pޡu$[6.&~OwqЫ1q]9pZ Qj@7~a]Ѷ}jcnض.[7\@l dQ?~ ޽gnu“6 %JbVydǑn6oN݌-;uF'$PKŨ>Hi;|MtKrqkփxRgA7YśWpmWqm%6< I%"t*YƱe F7ˤ9R1% 6t*cx7"}Ͳ.cs8ƅs/0WU9C\_wU=c} `ɺjv k; Xe׃Saқvx8w[S0SOۅ_ BVQb H♎v/r/om/s͖h+lgekЫ:ON@cF~?{*3e]bYe?1-U l(hC |;e`[eZ? =#_f[,o.Uȯ$b ϥ86Fnx'DžHűLѶv$'EI%v6۝9,OtI/?lto0,usr|ǬlW*e?IΤ٥Y_2'1>"Sn(l=_GT?6cmz2)[ose ^yp,@s5B1@tN%4Gv z ,D^0!\wX_NFoaTZ `w+U)f_ۨ&\`} eZ8[/73oy\ss o(ԛT65[Cql\1ʡhy %w!7p<U˺[xJ"J}1%E CK*ݿ֪f~ہ>xi֛z2m:~"W\65z wWy |[?9ƻ/lN%1k$rQciCd(W eHe [ʅtg7n\KaDo׮\&F#MJjPdb$q}xo5#na<l.{<ے_Y_xQE\EA׭25[P?U(&nrNl>uˊ>ݬ†swUtvnn.0i IDAT`% wT~\i[".d9.<*>SnmOQuv*Ӯ~9#zyd$nFd=d?ߵbP*99MjOӲJ͠V5(E~_:< 02*Ε `rPtRf6Hk9m6l);6i6bj'xcwٓ~%OSq^/۹Lsc} `|$3EiU lNF"og^F Eۺg|T=g9 ^5 I?LsUB}Zy G\p?K'bXQa;z"6 c/% !ny{-.Nx Ϟ}[x}Q2"La`{%rn?m9 @neϥ lPT{zÜ8;/P5-xf/ڒ>E*F)1b FD:0i}RcJ fݱ}2 ݱ})~^7+*!%\gT\IHJrK9 A0(ð.sNqq)U!j#w]jA g"XLSQ@ˬdvuw)|dLU1'|6 ^N @)Hd-wG`:ܶ#=7pqFt IYwKF(0Y#owc:Oo4*[ς\4(/@1tJ&DKX7ܑ*eW]IbUJ]wCv$zՆE®52N\ ꕽ-ڰh+O>Qxii |L6tj3@EZQ+1~he;Lt/޼U/`%Puw5FBJbtx7hT 맼ptC N/m_3Y'hرdK~GF79?NzTc-yc|ap3[G4.I\7euW&1|$y;t胬~WF@(#0S|Q 8q>ey{bT:EAgn @Y32dKGf&P6.:⸫U /.R\ ݍ9m-dt+Υ;go=C6( DAfߩl0S{>̆3m rkRӕB0,;X [ ss<[.=+ cAc.݋jw|NEX~6aQiіWFZ.˿Kj$P-vλSOgZd rRo,ؓ=E*gvbf,B`O>q٭==#v#==Wۖ ' uO9QjzbrZ#xTt#Pr"M" ?m0vnfߤ; @DkGɺҲ~~Jd3rYrh'Ҳ~\Gն~GE+Xc`0█25+h}3_}n ؉-d2'S:vzrfҏk'N}ˋx}:~RywAO, o WZrB5h SoxN m}@l@W PE0 "r\"C>/(jK\.uUA5r( 0c^er^5|FQ[ڍH}!l?9^F #qϮ̢L[J<?ƻ:ccc,ڎQv3̈́n?S]஧%T>ŴnM@|/ 5%LO[\@[humI"/pAq|b(N-@eÇ Y?\n#l(:@#R_/|.v; o^A)?{ru(V UǻcޟsPJ^Ŏ%QW_h4-۱/hUY(k8 m7\O¨#ʉCr^,d?" ?aH/p%wE9ll̛?lӰN(8aB n#B'N!#|?E/Em?\u V-Hy@C0J*My"t=m[dҌW̞m/Vbvȗl⋴|rêpoyr(]unWyᴀHp@=, пZ/(1h?y0 lv\AIhK~QF&NXގdT5P^IT )7FCGJ apll vuઅ?Sp Z4/ҚH [L|y"jY}|BR}W:Ivpn .˖VS0'H21Io+lJu'9FC'!^^; ë4z#vXG՗p?ØL}iLL%_}O(6#`zw}g F|ge"F[&*e(m/G+A"4†'զ36|]%m<#XJ6IxEb6ɧ@&QW,4*i?Tk/괔?gtO晀_e/w7^_d" G0N-nYQ1:CZ7!d NaBOԥuf3xӢ/? ϕO֚`3{w+ џT'$ղBz]epZV\oۏrQ<2o[ЮiW5:QZ3;S9X| Rޅh|#:If_tSSC BNxGG!ˢG'"u˟-ި0͒34 Ȥt8 Q4S4S.QS0Wqw [,y[#yGbPPqxe>jDG`,G#Sw8Fլd7k~%IIҐ8j5.$j,v̮XfǨIf [J})uET]c삔b D %S"7<p˯WZr( oZH!ydBޮlhmEmɡ uLS3`_y}xEUyR})*S'[t;߷vZ4})8>ƒ?9kWDqQ(Q&jnƩJw4u??$8T7݁|%u"0afyKx⚆i5@^ijJ?VS%~inSQZiP"dp81ıjhzR~i@tX?nMd҃/tsM XƳ&'}yn~5FAz/Щ0^_\C2[gӛq =͞<4(à,&k(,T&Yluyj5pYkX@MݼbW,YQL5F A˙f se&6FŨ#ȯuGj>eQhhQ>I9ف ;~7x1h} {vX;fԗñɀˈ =Hf:*U !kWxv} !]D((6‹L9 )ccW0Yq;p;D_ o49) ]4 'H>ϭg(_fC5 v,$w7x:MCױqlB:k$17<]O4 -p5l}mJPRSL@ƪ2%UA?|0W${KO5-qk"vs~4Ø8j>WpH516fD8?9s=]k+\sqn^v> BԱ@Bu,eZyFh`7qܚp/=7$Пt?|5‡юr~ܩN.LGҗ:C_[  ٯ>9ݻ8|0ܑNv&JmQ{@z`2e)iOBzIva)0qC(jz2֫"!u8yBd\K>db: U-&uL_V! b?_/X'u9| o@ֳc}Lךni>c&6 fNvԙiN'J>F_9[R&55~h*_Ӯ0 WrZFFt}P.9|!twȾ{A=u2b ȯOD}16/b׹5]\CP3.=ۡ2YedJCҵ*=88L7oҦ.0!L8ɸf;xcf j~A83xW)uk6HݚbNz mS@zE`uz~^BD $ U S4*o/ -ڗ1G@KxQTҏU_=gc#;'o@UEkrHt|Z/k00c4($@qڽ ct SJ 'U4+ܰݏ>]kyxc)+zs=ANq Θl-r^m3T+yOh%!M`ؚVPu9tAF:eɸi1DeRL\} bOi~; {)L͌;h 61Mx<)KoxpX,7 p/]9_|KXBa0_oV`45g^Y[ N7ȪY~zuH,E8|_یΩs KXXgŪ }{zS$ )ryt_S :{v#l-^s3 x\9:k;AIg8u(G*k,OSx' 7e DZ/`W^u/ ,3=yX~їwu epwK}yyd)kq/~ ;w^ B3* !,e[.܁ J~#D }(/% rջrVl185R !(+TTb2nbXTKfy)/GhݶHt򽀴0p}@b`BL%\6h-S]hd,ݗ5#ƛ O~ /ÚV,1uU'IR=NO'A%LF_^XSTרN*k DX=G&r&!Σ?Evg}uFG03:8\pYBI0:gLKY5-JϛP'>B3c2a8n@D} -]g,h/Y'sZt"^VJCV%?gyYLWl57S!z Fw(۩N'adq]7d]jpؑ[;%/0LM?{J#XwA.(l={n.ʭzQ@8 qYզ|r ]?^ JF\r;X8cX䌰aYué͎"E8>ρqx\.Pƫ[G҇0:I& ר=HP= yo[7^K&^2^q"LF,!8FL֬>s?zJ';>驀<ߦ{ϝ rbΎ˖Ga'ln'xXj-?u:o=8^& wIEخ]\ m n]8\.pvʔ IDAT^yݟ|Z/6[O6G_9BxV/" t4:QmFdJefx!хMWrs5ja}c ދ2:h,C='`8cò>1L.L pòY;#֭~77*<߽`=~y檝a٦"_ LKdDɇ\RsZ@, E^A?Ey;F78rH,dz.ܷͤB; Qt~rtw=Kvsv:;L}uy.@>iCSKdi`H;b{TGu.X6^BWoT0-FAZlD:~p"_n {X70ꍊ<<6|/Nvx[S\}u'bJdAy`|ꓩRs/"O֑M6 }T9jCG'P.r5@}X_x W]KYqGsmC;dE~%O.$7[|g&ˣt|>P4Z,ӊ.Ώ@\%υwe4Lbjku+p9^q㞎%Q2?H1[G9`>JUh"j=S>-ިLBRoT0/ֽrR}@D7zOp:ܑʋ/:b^:ZCUB\s/9,V/>bTk6eTk/tē|'\gTBm}f0[x@a at9:FJ/QVn01'G'2ʍP7=e8:j r.Kq_nLηn~Q&TNSskx(#TMTF>ŋc^EZ|8xp 6ź•wt_h݀,4 9?|1~(謷GFmszc). %&#(LM=}tu!Ƣ_žd3[J{~=]HJ:B'^S /.#% &d7lZ, υ;s@ ᴚ5/jeqL/0@́%aMjO㍪B.בӢl0B_(ڙgY0d/ @9;Kc[λ xNzNn!hU/a+Dp\ȇCģtQ=K>͏b<#\voAO3W7dJ|dpR*s={J{UjLL3xDo̓%I_V߽3svwvvX HH¤S(KVHv8* 2,[&DȴLIQhB-h@\{`1vg9UU#2+G/YUyFtVZYF8 #P(?p p?]Uc+W &ԏc?>O}j@ïW^z7'KY,Zyk|<4f%P,Hو`$˨ew`RBI 60m%? u͌|䞻4J] x ty 5_"TqxS>*+.U;^os< ֽQ9)  G|g{h^l,ͧ\)Wֱ7!%x!vM} a Vn؂æGy#QB7l!6z1B{ ztK&]Fbbuݰrq~boxA/O&p+?/l'VQ>x k", 8J.%F!az˘BD&Z( hwry9F~ˁheOFiwuݸO D0Bg"NԡX66ͅj{tr ȇ~XrP<[FX 1ATX(1 C:Јmv?q|$P<6󥸵F ?[lJg/a_W*@y}rחl7O?}ʵ+.##e8R:P8Hm$| Ғ{7H[|+p1sbz WZzl@u! G~ .ag0zxLVX(VW͔[ fO?9=]K w;o2ON]ZS#ٵ%PO3 t@y<- }K0X_ǐ7Exjc8۹/:D%yybb:lD~S3:5zp@x<.!`<ԋ-)ŕjPK׸YqG  }y=l%uhQ8n4"@yz[=l`DwH;{ G,n&?nEskXV_rc°j֥FR b o8S1-JJ!2·(ώW\u"(-VQ+Z+Fݱakx&i9ࡓ6jof] ΅':/// k ]*-c1 1b7 !FTZRi 6MTr„, @sW2_!/K-_vtB8|R ry0LfʢG`ى<>~]Oh4|;Ogx*-t ÎTH0 G-tjhMX~cצܴ_yYL;gZ2 \=bi]Gc..؄Jv_E<M@9o?N#7rx 71HzeSkv: E}Eނ8 }[[6TÇњ1TGqtx34Oi߷QJ0lqQf'0 8D{0v ҄Lu~pC<"Z-$ C)-ja=tsDu#d '^Fd&h2LAqnf?c;XձX_4rdIf,/G&n9B%md9E0%&`B_h&*$s.Q @1TrfbMUUT}Ö_eMl_4wT?q'O<'5 (-⠇UNwBQFـ4B%ȸa+eSF8yPü_DE+6M1 n߳]q-߇w@螑8_ڿi ~wUĨ^#uT15ivSK".#\aaWO IDAT Ei @3P/LG^&0x|z|$^VQ2٠H7V_Xq%n\g3ZKfas.19Ŵ~q33 gKKu,S7UƿߺKŢfv fxd9PaT].t,$ڙNzy e`~gں3Qi]-= MccD8XY*hAjm}n[@i hW&k> ݣ俒r,ԊP+jFq@hށ4[wOQ^FW ?ߴX ht@wJ堂_t>:a5Ϸ70.jjNbm% .AbKڭ )y&qdwyb\{3Ƶ4}Y A3KÑׇճqyO2̷!p8lc%MGPnؔߩ`9 ]@;@{y 7ppn\Jط\#+n ; h^&/p[h@ݗ r1 DX](#l }x tPFeBo"3&? -' A/vdÝGP??d.#9BcK g4scyT*t:B^^1~:Λ>~Qի.U\Ġ> +mWbNAjDZM䶏`u$&/j:'w W \`B0ntBݺo$ty ڼX>g~J-/??us ]dcb@1 LC0Q C+|Ka'D1{YԤU98nbT:^YuW p[8ML0!& +h,DM4x+¦e% e}Q)dN9W@)vp]8G\DϦ9]P]|S8K ոYJO(}|I PR_A ! w?|fo?)=uGi3B}';`gc RHVFc_" LuHX*;3Q.KߤCqTG 5] V'MÑFagj,5;8՟Dj^Ԛ:<Zž_\^AhtX,-7F÷JkkL 7 ?,tR|3g:htKX](c<.@&Wy: "JmL}U+bek$Hx"ċ/73qCPQ{ J%wS]ir=w o+@t^"0exHFGw nBN @UUf{rPSL׫f7T|Aݩ8v'oUʷ#Ch+V]꼬fY4%\9{БaIG `|~(G$q|@ +qmC0V޴Yh ~Y8=4,1hO.<3a*~sj8o 6 KKZ p-hfLZcq|M2^.v=r98AmdP f2%tGUE#:G#R@yUO0;jA$j)7jBv~+OUzfAo6@gג.-9%Ք` zbO,2 /9K?}W^~e>h[mm&d<>-Ep6'@rjTF{tPo|5uZ T rX_@'7tz#On{#R<+=Owwy9u8E7[s4|;L(+ (bg=806 xqH}LՒ2@4#jř?*E 8I]8ή|N3yg\+Xᧆ4l\ƣgLJςjWՀKC5oofҙ~ 3-\+υ ը)gyd|$ۻ@O'殿 0p 19aHS ⹀(NL*bAC4H+Ɠdi|.)k ?4sWa540|o_yf,M!^D'+NFsw^t{v}ݻ\`t',/V?!:J?-."yD47m߆y߭M"c ·33* 98#FXTcLaeѳ- و(b^7J,^͉ߟ2(ܜx/.;K󻾇+'VU72F]~P.,cVQ P ȠRGw8/-?ATG4: ^xOw:jYi>4߿#諩wX\q@E888 W=|vHL?hPPAXS.QƴӞwIyNY)M/W*L!?ȋC/ѮA5t'sƴiiY&FS>+MF 7Zcy9XaWvӬYiqdӅ Gg zʲ-1so9 pX䭸+]ZJiZǹy40Fḅ6,kӄ* 0nZxp  E /_OfwŤ.L`b#:@-ȵ37O.|%&9^|`xVcH{;M(Y%xG>JJ) Bw0f dTU !@Ks.)8~9o Cv fmr^.J{4E+CM%WQ+x8}WYQYixDžQ9Σ- 0t5l6b̴|YD[5oV W`4 +-|L;qX%l,LwziY45a x1~疵b/1̬=Ϭn$&xӦwZ6di 5mV4#l3ؒp\I<#N &8k zXG=r gAk8<|-tPQ9y<1]Zڴx,;n&4+yQ: ݣIZ(;IcR*jd, f,۟iy\*+KH$莅#twߖY͂g%wK9-}LOppioW:$ x]Lc@jvJ4>n 0.lfu)]W.Yeֲ+ :=2:˪WMqQ^zC6c oR(Hw ]?-& o6vޜPhKCs<ވ,_5T&D7L #7Hdok4< ^^igz=Hl,o1iR뛪;P&qbOz}{&⌍*/:~֍ԲeTQՍUg穲cϨS`4<42^V8i!x.㳀 21S|(Qm R;P~|i ]W '臱r\+E;*\6g Lb^>tձj/*SkՁ)]?B櫢j0Q =%1wsU$Gd)E ^!4`P+蠌KK-_bd#|^N<e ׳ Z ?t8 ppF'M>[ݯ6Հj[ޱO4ɼe4^RͯjMNy%am.ӌjm.Շ{EcuO c,ׇ= .7wQIDATfl='5?\3mc{4_L8ԁڟӫX2)*Pt dj +7g}q< 'eiQbFMwސ4]I]j2̈́8N?3 ̵-^8GU{/=gzlœ0ݤ`'F+4˷,@ d8n4Ng"L0hZ%pЗ'_v3ٔ2FUFFnf`vE`k\YFgvy|JuqwEʈ=c){bբ:qҭ^B,@%4 sRf%/y@>~ޓ€ Zw)1/.Ϡɻ ʪ~ >4}Zӥ}xy\Ukdmudi\tl\[8M+3-]n-_Nv2Y D,A MP'!!D q}bvէlk|{ :|qͭ H?o;QhQ#w`ZX=[ܾR6OBǗe0`1?psY@xt. W)qGݧ6+/gbLm*K/c>cu,4sim{b|4膌I5fzD/cUUf$H;ɩv.Y{n sIړuŌ1Is8-z]z*u26j'|ʃ1)+E0g.G7| O󪑹wk~]X?[#!bm_h#T$آ\&ʣ QCks[̾ }*3G / @ ϻLt5$-ʫދgaº yi񶵾F@p0ģn<ːz=eO@Nj0jUeq4X~/[N5\Ϡ?0GRZiIU 2t=[#&,qT8mH'aAA}Y DVxR9B_>* {\!Zג] (B2pi"R-/-3y35Lb.(WyH;:Y~:Nki ScgՃ91!, DF}Ow X ։.^{66X#= Ig|rb8<5?]dk_h ^|};ń`4F+xڰ8U\;VRx-Vemk3c0𨾬\]YZUkFsnpŹq%pjAll$aB_N/ ~dzrLit( 7utYN3gm`u5}m+&i媟@\bS!:ӡ1f׷3S*|NiP [p# ;"58'*# ;plMN̟ATLIߔ5J^#j+.לմjppM; osXGsql6d@̺0.wˉ-uCXgrVUSX8Թ^JrW"Dcjy057wqpC`2$Զ9)LԄ,S\dϊJ理qgD(:g F+1@0,lwD#sjRdijCJIn܄EXc˅/,¯0G8_>Ǜ,&La꛻ ;Φ!K4]8]$`)Z֙.gj{VWu2lNF׳C]!I7r)+>5x?]ebufy@y"ׁ,@^W",ʃA0 p f 4E 8\kp)ל]8@vZZ\n]VEBϼcTL1m9ֻF kD:x\~͍M=np!p K<"g cwt | L4Z=FUgN5U\?>ts@x= C]}xi]v\Yus3I{NeZ>g\ܚH pGY֠;خXS nJt10Bd2[7.>Ki4x$:(+(#<w:^cGXq3X{~7zч^(%`f[GiQpS m`Z g4+Λl><..}O_d\7(8/D?{bz {/bU_{0/?wvցxM;]O@<6bjT orxl{_NG{](pc ][I+70 OOE?~?={տcߞ$-O/5k# ~m?.&lL&)QQʭ |ndT7OQ ?< pe)=uTtD|-)l2ݐ(9- ^x^.ރ6RORޟ0p'x 3?0 ~F'aa KbAX1N \L`祴i4ŧeҧY4l DrdUGz'M8ퟖß|<[@,Bi0nPhR<"fXθ`av2pmB쳰N86 f #N4.GiӬ !mvw Ob<rW"D/!rnk*ӤXѺ#++VFo= gV/N+{B[m  ~6`~`.n]g ,><`24B:dʮGբኟŽci-@i^.%`.nN@-LlY29d ]* m&`Jpg gqax7?umasp@Lv/o3 t]\uq OGa~eCSa'kb}j`~`.nEh༾7d ͚gZWB]m؊ HTG塠ү~ wT [f.9[@V; >Cu}[#tgo?| IMgS A}h~2YP\ƺ[Ysp_hPD!@}º9y#ۊ9̻>݃]oh %dq\N x80a:}eT&}>ewR#<#̻-6̻1HK<;S,W]|V.*&߷ WEH-9pEq@cUbpn?+ߵr., G'41AJ&?1Bz=-J.xPw~Q0zQ, >K  s7 V]5)U[x~lsm<䞼VC֖;pq"+*@+݈,]feV,#7ůA>~#?QX\.assSk~}w-4wPjրG}hF25kAſQ;wT_? z!ngxf 7^Gj^mjd\ Zt;Z0w.Ĥk!ei/(8g }73@=Tv$tt؈>Yůz%}oo`~`.1}C>^2 xx] 'sBo'9i 8̻0:kL⩧vwE^i0wF-kMIq -!@ Z:uxTt!oN>1|- KFl tHXwĻ̻9qcvL5@#9 },5q1N/&~|w3~6>wW3=4V@H$Sqt><1@ &eSaDk9>}ϼ `>zQؕ|W s `4|'+ѿX]D :Hi A\$f% LޓúдcQ_w<#^[<ѡ(>̙~[sH<x6Յ_8?Fk{Cb}#x%?}?!Y>?I.w0p?}??տ蕗.[XP=v W㞅!Y/@-a&_{n1:ځ??{LD[s8*440ܿ_ ? [ =wZNJ+0s >O>72_O"o2N`.p`V=7`sa.0`sa.0`sa.0`sa.0`sa.0`sa.0`sa.0`sa.0`sa.0`sa.0p=(sIENDB`3Depict-0.0.19/src/common/0000755000175000017500000000000012723200266014537 5ustar pcuserpcuser3Depict-0.0.19/src/common/constants.cpp0000644000175000017500000000252012716174467017275 0ustar pcuserpcuser/* * common/constants.cpp - Common constants used across program * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "constants.h" #include "translation.h" //pattern to use when looking for rangefiles const char *RANGEFILE_WX_CONSTANT= NTRANS("Range Files (*.rng; *.env; *.rrng)|*.rng;*.env;*.rrng;*.RRNG;*.RNG;*.ENV|RNG File (*.rng)|*.rng;*.RNG|Environment File (*.env)|*.env;*.ENV|RRNG Files (*.rrng)|*.rrng;*.RRNG|All Files (*)|*"); //Name of the DTD file for state loading const char *DTD_NAME="threeDepict-state.dtd"; //Program name const char *PROGRAM_NAME = "3Depict"; //Program version const char *PROGRAM_VERSION = "0.0.19"; //Path to font for Default FTGL font const char *FONT_FILE= "FreeSans.ttf"; 3Depict-0.0.19/src/common/stringFuncs.cpp0000644000175000017500000003144712717201575017570 0ustar pcuserpcuser/* * stringFuncs.cpp - string manipulation routines * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "common/stringFuncs.h" #include "common/basics.h" #include using std::string; using std::vector; std::string getMaxVerStr(const std::vector &verStrings) { std::vector > > verNum; std::vector thisVer; //break string up into numeric components for(unsigned int ui=0;ui strVerNum; strVerNum.clear(); // period or hyphen are valid version number separators splitStrsRef(verStrings[ui].c_str(),".-",strVerNum); //Check to see if we can interpret the values for(unsigned int uj=0;uj 1) { unsigned int thisMax; thisMax=0; for(unsigned int ui=0;ui= '0' && s[0] <= '9') || (s[0] >= 'a' && s[0] <= 'f')); ASSERT((s[1] >= '0' && s[1] <= '9') || (s[1] >= 'a' && s[1] <= 'f')); int high,low; if(s[0] <= '9' && s[0] >='0') high = s[0]-(int)'0'; else high = s[0] -(int)'a' + 10; if(s[1] <= '9' && s[1] >='0') low = s[1]-(int)'0'; else low = s[1] -(int)'a' + 10; c = 16*high + low; } std::string digitString(unsigned int thisDigit, unsigned int maxDigit) { std::string s,thisStr; stream_cast(thisStr,thisDigit); stream_cast(s,maxDigit); for(unsigned int ui=0;ui > comboString, unsigned int curChoice) { ASSERT(curChoice < comboString.size()) string s,sTmp; stream_cast(sTmp,curChoice); s=sTmp + string(":"); for(unsigned int ui=0;ui &sVec) { //Create a truncated vector and reserve mem. std::vector tVec; tVec.reserve(sVec.size()); std::string s; for(unsigned int ui=0;ui &v ) { const char *thisMark, *lastMark; string str; v.clear(); //check for null string if(!*cpStr) return; thisMark=cpStr; lastMark=cpStr; while(*thisMark) { if(*thisMark==delim) { str.assign(lastMark,thisMark-lastMark); v.push_back(str); thisMark++; lastMark=thisMark; } else thisMark++; } if(thisMark!=lastMark) { str.assign(lastMark,thisMark-lastMark); v.push_back(str); } } //Split strings around any of a string of delimiters void splitStrsRef(const char *cpStr, const char *delim,std::vector &v ) { const char *thisMark, *lastMark; string str; v.clear(); //check for null string if(!(*cpStr)) return; thisMark=cpStr; lastMark=cpStr; while(*thisMark) { //Loop over possible delimiters to determine if this char is a delimiter bool isDelim; const char *tmp; tmp=delim; isDelim=false; while(*tmp) { if(*thisMark==*tmp) { isDelim=true; break; } tmp++; } if(isDelim) { str.assign(lastMark,thisMark-lastMark); v.push_back(str); thisMark++; lastMark=thisMark; } else thisMark++; } if(thisMark!=lastMark) { str.assign(lastMark,thisMark-lastMark); v.push_back(str); } } //!Returns Choice ID from string (see choiceString(...) for string format) //FIXME: Does not work if the choicestring starts from a number other than zero... std::string getActiveChoice(const std::string &choiceString) { size_t colonPos; colonPos = choiceString.find(":"); ASSERT(colonPos!=string::npos); //Extract active selection string tmpStr; tmpStr=choiceString.substr(0,colonPos); unsigned int activeChoice; stream_cast(activeChoice,tmpStr); //Convert ID1|string 1, .... IDN|string n to vectors std::string s; s=choiceString.substr(colonPos,choiceString.size()-colonPos); vector choices; splitStrsRef(s.c_str(),',',choices); ASSERT(activeChoice < choices.size()); tmpStr = choices[activeChoice]; return tmpStr.substr(tmpStr.find("|")+1,tmpStr.size()-1); } void choiceStringToVector(const std::string &choiceString, std::vector &choices, unsigned int &selected) { ASSERT(isMaybeChoiceString(choiceString)); //Convert ID1|string 1, .... IDN|string n to vectors, // stripping off the ID value size_t colonPos; colonPos = choiceString.find(":"); std::string s; s=choiceString.substr(colonPos,choiceString.size()-colonPos); splitStrsRef(s.c_str(),',',choices); for(size_t ui=0;ui verStrs; verStrs.push_back("0.0.9"); verStrs.push_back("0.0.10"); TEST(getMaxVerStr(verStrs) == "0.0.10","version string maximum testing"); verStrs.clear(); verStrs.push_back("0.0.9"); verStrs.push_back("0.0.9"); TEST(getMaxVerStr(verStrs) == "0.0.9","version string maximum testing"); verStrs.push_back("0.0.9"); verStrs.push_back("0.0.blah"); TEST(getMaxVerStr(verStrs) == "0.0.9","version string maximum testing"); } #if !(defined(__WIN32) || defined(__WIN64)) { string filename; filename="/path/blah.dir/basefile.test.ext"; string a,b,c; splitFileData(filename, a,b,c); TEST(a == "/path/blah.dir/","path split"); TEST(b == "basefile.test","basename split"); TEST(c == "ext","extension split"); } #endif return true; } #endif 3Depict-0.0.19/src/common/basics.h0000644000175000017500000005322412716174467016201 0ustar pcuserpcuser/* * common/basics.h - Basic functionality header * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef BASICS_H #define BASICS_H //!Basic objects header file #if (_MSC_VER >= 1600) || (__cplusplus > 199711L) #define HAVE_CPP_1X #endif //C-style Array size macro #ifdef HAVE_CPP_1X template constexpr unsigned int THREEDEP_ARRAYSIZE(T (&)[s]) { return s; } #else #define THREEDEP_ARRAYSIZE(f) (sizeof (f) / sizeof(*f)) #endif //macro to switch between normal bool and atomic, as available. // do *NOT* declare const ATOMIC_BOOLs. This has wierd CPU caching // assumptions, which cause the type to not work properly if not using // true atomics #ifndef ATOMIC_BOOL #ifdef HAVE_CPP_1X // Killed? By an ATOMIC bool? No sir, I guess I don't take // much solace that the implosion trigger // functioned perfectly. //This bool is reliable for attempting to perform inter-thread flagging. #include #define ATOMIC_BOOL std::atomic #else //C++ <1X does not provide a truly safe bool type. Most implementations it seems to work though (provided you don't use const). #define ATOMIC_BOOL bool #endif #endif #include "mathfuncs.h" #include "common/assertion.h" #include #include #include #include #include class K3DTree; //Set new locale code. Must be followed by a popLocale call before completion // Only one locale type can be pushed at a time this way void pushLocale(const char *newLocale, int type); //Restore old locale code void popLocale(); //C file peek function inline int fpeek(FILE *stream) { int c; c = fgetc(stream); ungetc(c, stream); return c; } template bool rangesOverlap( const T &minA, const T &maxA, const T &minB, const T &maxB) { ASSERT(minA <= maxA); ASSERT(minB<=maxB); // A- B- A+ // A- B+ A+ if( (minA <= minB && maxA >=minB ) || (minA<=maxB && maxA >=maxB) ) return true; // B- A- B+ // B- A+ B+ if(( minB <= minA && maxB >=minA ) || (minB<=maxA && maxB >=maxA) ) return true; return false; } //!Text file loader errors enum { ERR_FILE_OPEN=1, ERR_FILE_FORMAT, ERR_FILE_NUM_FIELDS, ERR_FILE_ENUM_END // not an error, just end of enum }; //Exclusive or operator template bool xorFunc(const T a, const T b) { return (a || b) && !(a && b); } //Perform a a<-b<-c<-a rotation of data template void rotate3(T &a, T &b, T &c) { T tmp; tmp=a; a=b; b=c; c=tmp; } //Find the min/max value within an array //array must be nonzero sized template T maxValue(const T *t, size_t n) { ASSERT(n); T maxV=t[0]; for(size_t ui=1;ui T minValue(const T *t, size_t n) { ASSERT(n); T minV=t[0]; for(size_t ui=1;ui bool hasFirstInPairVec(const std::vector > &v, const std::pair &r) { for(size_t ui=0;ui &spacings); void tickSpacingsFromFixedNum(float start, float end, unsigned int nTicks, std::vector &spacings); //!Get a "human-like" version of the time elapsed between new and original time period std::string veryFuzzyTimeSince( time_t origTime, time_t newTime); //!A routine for loading numeric data from a text file. Returns 0 on success unsigned int loadTextData(const char *cpFilename, std::vector > &dataVec, std::vector &header,const char *delim); //!Load non-numeric data from a text file into ragged array, using specified delimiters unsigned int loadTextStringData(const char *cpFilename, std::vector > &dataVec, const char *delim); template bool writeTextFile(const char *cpFilename, const std::vector > &dataVec, const char delim='\t') { std::ofstream f(cpFilename); if(!f) return false; for(unsigned int ui=0;ui bool stream_cast(T1 &result, const T2 &obj) { std::stringstream ss; ss << obj; ss >> result; return ss.fail(); } //!Replace first instance of marker with null terminator void nullifyMarker(char *buffer, char marker); //retrieve the active bit in a power of two sequence unsigned int getBitNum(unsigned int u); //!A class to manage "tear-off" ID values, to allow for indexing without knowing position. //You simply ask for a new unique ID. and it maintains the position->ID mapping // as position could change if an element was removed, but ID cannot //TODO: Extend to any unique type, rather than just int (think iterators..., pointers) class UniqueIDHandler { private: //!position-ID pairings std::list > idList; public: //!Generate a unique ID value, storing the position ID pair unsigned int genId(unsigned int position); //!Remove a uniqueID using its position void killByPos(unsigned int position); //!Get the position from its unique ID unsigned int getPos(unsigned int id) const; //!Get the uniqueID from the position unsigned int getId(unsigned int pos) const; //!Get all unique IDs void getIds(std::vector &idvec) const; //!Clear the mapping void clear(); //!Get the number of elements stored unsigned int size() const {return idList.size();}; }; //!Get total filesize in bytes bool getFilesize(const char *fname, size_t &size); //!get total ram in MB int getTotalRAM(); //!Get available ram in MB size_t getAvailRAM(); //!Determine if a given path is a not a directory, bool isNotDirectory(const char *filename); bool rmFile(const std::string & filename); #ifdef DEBUG bool isValidXML(const char *filename); #endif class ComparePairFirst { public: template bool operator()(const std::pair< T1, T2 > &p1, const std::pair &p2) const { return p1.first< p2.first; } }; class ComparePairSecond { public: template bool operator()(const std::pair< T1, T2 > &p1, const std::pair &p2) const { return p1.second< p2.second; } }; class ComparePairFirstReverse { public: template bool operator()(const std::pair< T1, T2 > &p1, const std::pair &p2) const { return p1.first> p2.first; } }; //! A helper class to define a bounding cube class BoundCube { //!bounding values (x,y,z) (lower,upper) float bounds[3][2]; //!Is the cube set? bool valid[3][2]; public: BoundCube() { setInvalid(); } void setBounds(float xMin,float yMin,float zMin, float xMax,float yMax,float zMax) { bounds[0][0]=xMin; bounds[1][0]=yMin; bounds[2][0]=zMin; bounds[0][1]=xMax; bounds[1][1]=yMax; bounds[2][1]=zMax; valid[0][0]=true; valid[1][0]=true; valid[2][0]=true; valid[0][1]=true; valid[1][1]=true; valid[2][1]=true; } void setBounds(const BoundCube &b) { for(unsigned int ui=0;ui<3;ui++) { bounds[ui][0] = b.bounds[ui][0]; valid[ui][0] = b.valid[ui][0]; bounds[ui][1] = b.bounds[ui][1]; valid[ui][1] = b.valid[ui][1]; } } void setInvalid() { valid[0][0]=false; valid[1][0]=false; valid[2][0]=false; valid[0][1]=false; valid[1][1]=false; valid[2][1]=false; } //Set the cube to be "inside out" at the limits of numeric results; void setInverseLimits(bool setAsValid=false); void setBound(unsigned int bound, unsigned int minMax, float value) ; //Retrieve a specified bound, minMax=0 for min, =1 for max float getBound(unsigned int bound, unsigned int minMax) const ; void getBound(Point3D &bound, unsigned int minMax) const ; //!Return the centroid Point3D getCentroid() const; //!Get the bounds void getBounds(Point3D &low, Point3D &high) const ; //!Return the size of the cube along the specified dimension float getSize(unsigned int dim) const; //! Returns true if all bounds are valid bool isValid() const; //! Returns true if any bound is of null thickness bool isFlat() const; //!Returns true if any bound of datacube is considered to be "large" in magnitude compared to // floating pt data type. bool isNumericallyBig() const; //!Obtain bounds from an array of Point3Ds void setBounds( const Point3D *ptArray, unsigned int nPoints); //!Use two points to set bounds -- does not need to be high,low. this is worked out/ void setBounds( const Point3D &p, const Point3D &q); //!Obtain bounds from an array of Point3Ds void setBounds(const std::vector &ptArray); //!Set bounds via cube that contains given sphere void setBounds(const Point3D &p, float radius); //Set & set-like operations //!Checks if a point intersects a sphere of centre Pt, radius^2 sqrRad bool intersects(const Point3D &pt, float sqrRad) const; //Create a union of two bounding cubes, which is itself a cube BoundCube makeUnion(const BoundCube &b) const; //Check to see if the point is contained in, or part of the walls //of the cube bool containsPt(const Point3D &pt) const; bool contains(const BoundCube &b) const; //!Is this bounding cube completely contained within a sphere centred on pt of sqr size sqrRad? bool containedInSphere(const Point3D &pt, float sqrRad) const; unsigned int segmentTriple(unsigned int dim, float slice) const; //!Returns maximum distnace to box corners (which is an upper bound on max box distance). //Bounding box must be valid. float getMaxDistanceToBox(const Point3D &pt) const; //Get the largest dimension of the bound cube float getLargestDim() const; //Return the rectilinear volume represented by this prism. float volume() const { return (bounds[0][1] - bounds[0][0])* (bounds[1][1] - bounds[1][0])*(bounds[2][1] - bounds[2][0]);} void limits(); const BoundCube &operator=(const BoundCube &); //!Expand (as needed) volume such that the argument bounding cube is enclosed by this one void expand(const BoundCube &b); //!Expand such that point is contained in this volume. Existing volume must be valid void expand(const Point3D &p); //!Expand by a specified thickness void expand(float v); //!Obtain a corner point of the cube Point3D getVertex(unsigned int idx) const; //!Obtain the corner points of the cube void getVertices(std::vector &p,bool centre=false) const; //!Obtain the vertices that arise from the intersection of a plane with the cube void getPlaneIntersectVertices(const Point3D &planeOrigin, const Point3D &normal, std::vector &intersectPts) const; friend std::ostream &operator<<(std::ostream &stream, const BoundCube& b); //FIXME: Hack! friend class K3DTree; friend class K3DTreeMk2; }; //!Data holder for colour as float typedef struct RGBf { float red; float green; float blue; } RGBf; class ColourRGBAf; //Colour storage class. Uses uchar internally class ColourRGBA { public: unsigned char data[4]; public: ColourRGBA(); ColourRGBA(unsigned char , unsigned char, unsigned char); ColourRGBA(unsigned char , unsigned char, unsigned char, unsigned char); unsigned char r() const; unsigned char g() const; unsigned char b() const; unsigned char a() const; //Parse a colour string, such as #aabbccdd into its RGBA 8-bit components. alpha value (last) can be omitted. Will assume 255. bool parse(const std::string &); //Convert an RGB its // hexadecimal colour string // format is "#rrggbb" such as "#11ee00" std::string rgbString() const; //Convert RGB to hex colour string, with alpha channel std::string rgbaString() const; //convert data from RGB/[0->255] integers to [0->1] float. // alpha channel is not used RGBf toFloat() const; void fromRGBAf(const ColourRGBAf &); ColourRGBAf toRGBAf() const; void fromRGBf(const RGBf &); bool operator==(const ColourRGBA &oth) const; bool operator==(const ColourRGBAf &oth) const; bool operator==(const RGBf &oth) const; bool operator!=(const ColourRGBA &oth) const; bool operator!=(const ColourRGBAf &oth) const; unsigned char at(unsigned int idx) const; }; //Colour storage class. Uses float internally class ColourRGBAf { private: float data[4]; public: ColourRGBAf(); ColourRGBAf(float, float, float); ColourRGBAf(float, float, float,float); float r() const; float g() const; float b() const; float a() const; void r(float); void g(float); void b(float); void a(float); ColourRGBAf interpolate(float delta, const ColourRGBAf &other); //convert to a ColourRGBA (uchar representation) //TODO : Rename me! ColourRGBA toColourRGBA() const; RGBf toRGBf() const; bool operator==(const ColourRGBA &oth) const; bool operator!=(const ColourRGBA &oth) const; bool operator==(const ColourRGBAf &oth) const; bool operator!=(const ColourRGBAf &oth) const; //TODO: Deprecate me! bool operator==(const RGBf &oth) const; void operator=(const RGBf &oth); float &operator[](unsigned int idx) ; float at(unsigned int idx) const; }; //Randomly select subset. Subset will be (somewhat) sorted on output. // Returns -1 on abort, otherwise returns number of randomly selected items template size_t randomSelect(std::vector &result, const std::vector &source, RandNumGen &rng, size_t num,unsigned int &progress, ATOMIC_BOOL &wantAbort, bool strongRandom=false) { //If there are not enough points, just copy it across in whole if(source.size() <= num) { num=source.size(); result.resize(source.size()); for(size_t ui=0; ui ticks; ticks.resize(numTicksNeeded); //Create an array of numTicksNeededbers and fill for(size_t ui=0; ui::iterator newLast; newLast=std::unique(ticks.begin(),ticks.end()); ticks.erase(newLast,ticks.end()); //Top up with unique entries //TODO: Overcommit & Discard implementation? // - Should be possible to predict how many we need after collisions, and then overcommit and discard randomly. Removes need to loop-sort like this while(ticks.size() < numTicksNeeded && !wantAbort) { size_t moreTicks=numTicksNeeded-ticks.size(); for(size_t uk=0;uk::iterator it=ticks.begin();it!=ticks.end();++it) { result[pos]=source[*it]; pos++; progress= (unsigned int)((float)(pos)/((float)num)*100.0f); } } else { //Sort the ticks properly (mostly sorted anyway..) std::sort(ticks.begin(),ticks.end()); unsigned int curTick=0; for(size_t ui=0;ui (ui-curTick)); result[ui-curTick]=source[ui]; } progress= (unsigned int)(((float)(ui)/(float)source.size())*100.0f); } } ticks.clear(); } else { //Use a weak randomisation LinearFeedbackShiftReg l; //work out the mask level we need to use size_t i=1; unsigned int j=0; while(i < (source.size()<<1)) { i=i<<1; j++; } //linear shift table starts at 3. if(j<3) { j=3; i = 1 << j; } size_t start; //start at a random position in the linear state start =(size_t)(rng.genUniformDev()*i); l.setMaskPeriod(j); l.setState(start); size_t ui=0; //generate unique weak random numbers. while(ui size_t randomDigitSelection(std::vector &result, const size_t max, RandNumGen &rng, size_t num,unsigned int &progress, bool strongRandom=false) { //If there are not enough points, just copy it across in whole if(max <=num) { num=max; result.resize(max); for(size_t ui=0; ui implementation //--------- std::vector ticks; ticks.resize(numTicksNeeded); //Create an array of numbers and fill for(size_t ui=0; ui::iterator itLast; itLast=std::unique(ticks.begin(),ticks.end()); ticks.erase(itLast,ticks.end()); //Top up with unique entries while(ticks.size() < numTicksNeeded) { size_t moreTicks=numTicksNeeded-ticks.size(); for(size_t uk=0;uk::iterator it=ticks.begin();it!=ticks.end();++it) { result[pos]=*it; pos++; progress= (unsigned int)((float)(curProg)/((float)num)*100.0f); } } else { //Sort the ticks properly (mostly sorted anyway..) std::sort(ticks.begin(),ticks.end()); unsigned int curTick=0; for(size_t ui=0;ui void vectorMultiErase(std::vector &vec, const std::vector &wantKill) { ASSERT(vec.size() == wantKill.size()); if(!vec.size()) return; size_t shift=0; for(size_t ui=0;ui. */ #include "xmlHelper.h" #include using std::string; //Convert a normal string sequence into an XML escaped sequence std::string escapeXML(const std::string &input) { size_t strLen= input.size(); std::string output; for (size_t ui = 0; ui < strLen; ui++) { char c; c= input[ui]; if (c == '&') output+=("&"); else if (c == '<') output+=("<"); else if (c == '>') output+=(">"); else if (c == '"') output+=("""); else if (c == '\'') output+=("'"); else output+=c; } return output; } //Convert an xml escaped sequence into a normal string sequence //Re-used under GPL v3+ From: //http://svn.lsdcas.engineering.uiowa.edu/repos/lsdcas/trunk/cas2/libcas/xml.cc //accessed 3 Mar 2012 std::string unescapeXML(const std::string &input) { const char* chars = "<>'\"&" ; const char* refs[] = { "<", ">", "'", """, "&", 0 } ; std::string data=input; for( size_t i = 0 ; refs[i] != NULL ; i++ ) { std::string::size_type pos = data.find( refs[i] ) ; while( pos != std::string::npos ) { std::stringstream unescaped ; unescaped << data.substr( 0, pos ) << chars[i] << data.substr( pos + strlen( refs[i] ) ) ; data = unescaped.str() ; pos = data.find( refs[i], pos + strlen( refs[i] ) ) ; } } return data ; } template<> unsigned int XMLHelpGetProp(std::string &prop,xmlNodePtr node, string propName) { xmlChar *xmlString; //grab the xml property xmlString = xmlGetProp(node,(const xmlChar *)propName.c_str()); //Check string contents if(!xmlString) return PROP_PARSE_ERR; prop=(char *)xmlString; xmlFree(xmlString); return 0; } unsigned int XMLHelpNextType(xmlNodePtr &node, int nodeType) { do { node= node->next; if(!node) return 1; } while(node->type != nodeType); return 0; } //returns zero on success, nonzero on fail unsigned int XMLHelpFwdToElem(xmlNodePtr &node, const char *nodeName) { do { node=node->next; }while(node != NULL && xmlStrcmp(node->name,(const xmlChar *) nodeName)); return (!node); } 3Depict-0.0.19/src/common/assertion.cpp0000644000175000017500000000343612640746376017277 0ustar pcuserpcuser/* * common/assertion.h - Program assertion header * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "assertion.h" #include #ifdef DEBUG void userAskAssert(const char * const filename, const unsigned int lineNumber) { static bool skipAll=false; std::cerr << "ASSERTION ERROR!" << std::endl; std::cerr << "Filename: " << filename << std::endl; std::cerr << "Line number: " << lineNumber << std::endl; if(skipAll) { std::cerr << "\tContinuing, as previously requested" << std::endl; return; } std::cerr << "Do you wish to continue? - (y)es/(n)o/(a)lways -"; char y = '_'; while (y != 'n' && y != 'y' && y!= 'a') std::cin >> y; if (y == 'n') exit(1); if(y == 'a') skipAll=true; } //DEBUG NaN and INF #ifdef __linux__ #ifdef DEBUG #include void trapfpe (bool doTrap) { if(doTrap) { feenableexcept(FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW); } else { fedisableexcept((FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW)); } } bool getTrapfpe() { return fegetexcept() & (FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW); } #endif #else void trapfpe(bool doTrap) { } bool getTrapfpe() { return false; } #endif #endif 3Depict-0.0.19/src/common/basics.cpp0000644000175000017500000007717012716174467016542 0ustar pcuserpcuser/* * basics.cpp - basic functions header * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "common/basics.h" #include "common/constants.h" #include "common/stringFuncs.h" #include "common/translation.h" #ifdef __APPLE__ #include #include #include #include #elif defined __linux__ //Needed for getting ram total usage under Linux #include #endif //Needed for stat call on posix systems #if !defined(__WIN32__) && !defined(__WIN64__) #include #include #endif #include #include using std::string; using std::vector; using std::list; //default font to use. std::string defaultFontFile; static char *oldLocaleStatic; static int localeStaticType; unsigned int getBitNum(unsigned int u) { ASSERT(u); unsigned int j=0; while(!(u &1) ) { u=u>>1; j++; } return j; } std::string boolStrEnc(bool b) { if(b) return "1"; else return "0"; } void pushLocale(const char *newLocale, int type) { ASSERT(!oldLocaleStatic); ASSERT(!localeStaticType); ASSERT(type == LC_NUMERIC || type == LC_MONETARY || type == LC_CTYPE || type == LC_COLLATE || type == LC_ALL || type == LC_TIME || type== LC_MESSAGES); oldLocaleStatic=setlocale(type,NULL); //setlocale reserves the right to trash the returned pointer // on subsequent calls (i.e. use the returned pointer for later) // thus we must duplicate the pointer to own it oldLocaleStatic=strdup(oldLocaleStatic); if(strcmp(oldLocaleStatic,newLocale)) { setlocale(type,newLocale); localeStaticType=type; } else { //record that we did not set this localeStaticType=-1; } } void popLocale() { if(localeStaticType != -1) setlocale(localeStaticType,oldLocaleStatic); localeStaticType=0; free(oldLocaleStatic); oldLocaleStatic=0; } bool dummyCallback(bool) { return true; } void setDefaultFontFile(const std::string &font) { defaultFontFile=font; } std::string getDefaultFontFile() { return defaultFontFile; } //Compute the number of ticks require to achieve the void tickSpacingsFromInterspace(float start, float end, float interSpacing, std::vector &spacings) { ASSERT(interSpacing > sqrtf(std::numeric_limits::epsilon())); unsigned int nTicks; if(end < start) std::swap(end,start); nTicks=(unsigned int)((end-start)/interSpacing); if(!nTicks) { ASSERT(!spacings.size()); return; } spacings.resize(nTicks); for(unsigned int ui=0;ui &spacings) { if(!nTicks) { ASSERT(!spacings.size()); return; } spacings.resize(nTicks+1); float delta; delta= (end-start)/nTicks; for(unsigned int ui=0;ui=2*TIMESTOPS[ui]) { #ifdef DEBUG std::string s=(PLURAL_FUZZY_STRING[ui]); ASSERT(s.size()); #endif return TRANS(PLURAL_FUZZY_STRING[ui]); } //stop descending if ( delta>=TIMESTOPS[ui]) return TRANS(SINGLE_FUZZY_STRING[ui]); } return TRANS("moments ago"); } ColourRGBA::ColourRGBA() { } ColourRGBA::ColourRGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { data[0]=r; data[1]=g; data[2]=b; data[3]=a; } ColourRGBA::ColourRGBA(unsigned char r, unsigned char g, unsigned char b) { data[0]=r; data[1]=g; data[2]=b; } unsigned char ColourRGBA::at(unsigned int idx) const { ASSERT(idx< 4); return data[idx]; } unsigned char ColourRGBA::r() const { return data[0]; } unsigned char ColourRGBA::g() const { return data[1]; } unsigned char ColourRGBA::b() const { return data[2]; } unsigned char ColourRGBA::a() const { return data[3]; } bool ColourRGBA::parse(const std::string &str) { //Input string is in 2 char hex form, 3 or 4 colour, with # leading. RGB order //lowercase string. if(str.size() != 9 && str.size() != 7) return false; if(str[0] != '#') return false; string rS,gS,bS,aS; rS=str.substr(1,2); gS=str.substr(3,2); bS=str.substr(5,2); if(!isxdigit(rS[0]) || !isxdigit(rS[1])) return false; if(!isxdigit(gS[0]) || !isxdigit(gS[1])) return false; if(!isxdigit(bS[0]) || !isxdigit(bS[1])) return false; unsigned char r,g,b,a; hexStrToUChar(str.substr(1,2),r); hexStrToUChar(str.substr(3,2),g); hexStrToUChar(str.substr(5,2),b); //3 colour must have a=255. if(str.size() == 7) a = 255; else { aS=str.substr(7,2); if(!isxdigit(aS[0]) || !isxdigit(aS[1])) return false; hexStrToUChar(str.substr(7,2),a); } data[0]=r; data[1]=g; data[2]=b; data[3]=a; return true; } std::string ColourRGBA::rgbaString() const { std::string s="#", tmp; ucharToHexStr(data[0],tmp); s+=tmp; ucharToHexStr(data[1],tmp); s+=tmp; ucharToHexStr(data[2],tmp); s+=tmp; ucharToHexStr(data[3],tmp); s+=tmp; return s; } std::string ColourRGBA::rgbString() const { string tmp,s; s="#"; ucharToHexStr(data[0],tmp); s+=tmp; ucharToHexStr(data[1],tmp); s+=tmp; ucharToHexStr(data[2],tmp); s+=tmp; return s; } RGBf ColourRGBA::toFloat() const { RGBf ret; ret.red=(float)data[0]/255.0f; ret.green=(float)data[1]/255.0f; ret.blue=(float)data[2]/255.0f; return ret; } ColourRGBAf ColourRGBA::toRGBAf() const { ColourRGBAf tmp; for(unsigned int ui=0;ui<4;ui++) { tmp[ui] = (float)data[ui]/255.0f; } return tmp; } void ColourRGBA::fromRGBf(const RGBf &oth) { data[0]=oth.red*255.0f; data[1]=oth.green*255.0f; data[2]=oth.blue*255.0f; data[3]=255.0f; } bool ColourRGBA::operator==(const ColourRGBA &oth) const { for(unsigned int ui=0;ui<4;ui++) { if(data[ui] != oth.data[ui]) return false; } return true; } bool ColourRGBA::operator==(const ColourRGBAf &oth) const { for(unsigned int ui=0;ui<4;ui++) { if(data[ui] != oth.at(ui)) return false; } return true; } bool ColourRGBA::operator==(const RGBf &oth) const { return (data[0]/255.0f == oth.red && data[1]/255.0f == oth.green && data[2]/255.0f == oth.blue); } bool ColourRGBA::operator!=(const ColourRGBA &oth) const { return !(*this == oth); } bool ColourRGBA::operator!=(const ColourRGBAf &oth) const { return !(*this == oth); } ColourRGBAf::ColourRGBAf() { } ColourRGBAf::ColourRGBAf(float r, float g, float b, float a) { ASSERT(r >=0 && r <=1.0f); ASSERT(g >=0 && g <=1.0f); ASSERT(b >=0 && b <=1.0f); ASSERT(a >=0 && a <=1.0f); data[0]=r; data[1]=g; data[2]=b; data[3]=a; } ColourRGBAf::ColourRGBAf(float r, float g, float b) { ASSERT(r >=0 && r <=1.0f); ASSERT(g >=0 && g <=1.0f); ASSERT(b >=0 && b <=1.0f); data[0]=r; data[1]=g; data[2]=b; data[3]=1.0f; } float ColourRGBAf::r() const { return data[0]; } float ColourRGBAf::g() const { return data[1]; } float ColourRGBAf::b() const { return data[2]; } float ColourRGBAf::a() const { return data[3]; } void ColourRGBAf::r(float v) { ASSERT(v >=0.0f && v <=1.0f); data[0]=v; } void ColourRGBAf::g(float v) { ASSERT(v >=0.0f && v <=1.0f); data[1]=v; } void ColourRGBAf::b(float v) { ASSERT(v >=0.0f && v <=1.0f); data[2]=v; } void ColourRGBAf::a(float v) { ASSERT(v >=0.0f && v <=1.0f); data[3]=v; } float &ColourRGBAf::operator[](unsigned int idx) { ASSERT(idx < 4); return data[idx]; } float ColourRGBAf::at(unsigned int idx) const { return data[idx]; } ColourRGBAf ColourRGBAf::interpolate(float delta, const ColourRGBAf &other) { ColourRGBAf result; for(unsigned int ui=0;ui<4;ui++) result[ui] = data[ui] + (other.data[ui] - data[ui])*delta; return result; } ColourRGBA ColourRGBAf::toColourRGBA() const { ColourRGBA tmp(data[0]*255.0f,data[1]*255.0f, data[2]*255.0f,data[3]*255.0f); return tmp; } RGBf ColourRGBAf::toRGBf() const { RGBf tmp; tmp.red=data[0]; tmp.green=data[1]; tmp.blue=data[2]; return tmp; } void ColourRGBAf::operator=(const RGBf &oth) { data[0]= oth.red; data[1]= oth.green; data[2]= oth.blue; data[3]= 1.0f; } bool ColourRGBAf::operator==(const ColourRGBA &oth) const { for(unsigned int ui=0;ui<3;ui++) { if(data[ui] != (float)oth.at(ui)/255.0f) return false; } return true; } bool ColourRGBAf::operator==(const ColourRGBAf &oth) const { for(unsigned int ui=0;ui<3;ui++) { if(data[ui] != (float)oth.data[ui]) return false; } return true; } bool ColourRGBAf::operator!=(const ColourRGBAf &oth) const { return !(*this == oth); } void BoundCube::getBound(Point3D &retBound, unsigned int minMax) const { retBound=Point3D(bounds[0][minMax], bounds[1][minMax], bounds[2][minMax]); } float BoundCube::getBound(unsigned int bound, unsigned int minMax) const { ASSERT(bound <3 && minMax < 2); ASSERT(valid[bound][minMax]==true); return bounds[bound][minMax]; } void BoundCube::setBound(unsigned int bound, unsigned int minMax, float value) { ASSERT(bound <3 && minMax < 2); bounds[bound][minMax]=value; valid[bound][minMax]=true; } void BoundCube::setBounds(const std::vector &points) { setInverseLimits(); for(unsigned int ui=0; ui bounds[uj][1]) { { bounds[uj][1] = points[ui].getValue(uj); valid[uj][1]=true; } } } } #ifdef DEBUG for(unsigned int ui=0; ui &points, bool centre) const { points.resize(8); for(size_t ui=0;ui<8;ui++) points[ui]=getVertex(ui); if(centre) { Point3D centroid=getCentroid(); for(size_t ui=0;ui<8;ui++) points[ui]-=centroid; } } void BoundCube::getPlaneIntersectVertices(const Point3D &planeOrigin, const Point3D &normal, vector &intersectPts) const { //To visualise the connections, draw a cube, then label // each coordinate using a binary table like so: // idx x y z // 0 0 0 0 // 1 1 0 0 // etc .. //Now flatten the cube into a graph like so : // 0_________ 2 // | \4___6/ | ^ y+ -> // | | | | | x- // | 5---7 | // | / \ | // 1---------- 3 //Edges are between (idx - idx + 4) (idx <4) : 4 edges (diag) // and (idx, idx +2) (idx in 0,1,4,5) : 4 edges (across) // and (idx,idx+1) (idx in 0,2,4,6) : 4 edges (vertical) //Adjacency graph for cube edges const unsigned int eStartIdx[12] = {0,1,2,3, 0,1,4,5, 0,2,4,6}; const unsigned int eEndIdx[12] = {4,5,6,7, 2,3,6,7, 1,3,5,7}; for(unsigned int ui=0;ui<12;ui++) { Point3D eStart,eEnd; eStart = getVertex(eStartIdx[ui]); eEnd = getVertex(eEndIdx[ui]); float denom = (eEnd-eStart).dotProd(normal); //check for intersection. If line vector is perp to // plane normal, either is in plane, or no intersection // for our purpose, do not report intersections that are in-the-plane if(fabs(denom) < sqrtf(std::numeric_limits::epsilon())) continue; float numerator = (planeOrigin - eStart).dotProd(normal); float v; v= numerator/denom; intersectPts.push_back((eEnd-eStart)*v+ eStart); } } Point3D BoundCube::getVertex(unsigned int idx) const { ASSERT(idx < 8); return Point3D(bounds[0][(idx&1)],bounds[1][(idx&2) >> 1],bounds[2][(idx&4)>>2]); } void BoundCube::setInverseLimits(bool setValid) { bounds[0][0] = std::numeric_limits::max(); bounds[1][0] = std::numeric_limits::max(); bounds[2][0] = std::numeric_limits::max(); bounds[0][1] = -std::numeric_limits::max(); bounds[1][1] = -std::numeric_limits::max(); bounds[2][1] = -std::numeric_limits::max(); valid[0][0] =setValid; valid[1][0] =setValid; valid[2][0] =setValid; valid[0][1] =setValid; valid[1][1] =setValid; valid[2][1] =setValid; } bool BoundCube::isValid() const { for(unsigned int ui=0;ui<3; ui++) { if(!valid[ui][0] || !valid[ui][1]) return false; } return true; } bool BoundCube::isFlat() const { //Test the limits being inverted or equated for(unsigned int ui=0;ui<3; ui++) { if(fabs(bounds[ui][0] - bounds[ui][1]) < std::numeric_limits::epsilon()) return true; } return false; } bool BoundCube::isNumericallyBig() const { const float TOO_BIG=sqrtf(std::numeric_limits::max()); for(unsigned int ui=0;ui<2; ui++) { for(unsigned int uj=0;uj<3; uj++) { if(TOO_BIG < fabs(bounds[uj][ui])) return true; } } return false; } void BoundCube::expand(const BoundCube &b) { //Check both lower and upper limit. //Moving to other cubes value as needed if(!b.isValid()) return; for(unsigned int ui=0; ui<3; ui++) { if(b.bounds[ui][0] < bounds[ui][0]) { bounds[ui][0] = b.bounds[ui][0]; valid[ui][0] = true; } if(b.bounds[ui][1] > bounds[ui][1]) { bounds[ui][1] = b.bounds[ui][1]; valid[ui][1] = true; } } } void BoundCube::expand(const Point3D &p) { //If self not valid, ensure that it will be after this run for(unsigned int ui=0; ui<3; ui++) { //Check lower bound is lower to new pt if(bounds[ui][0] > p[ui]) bounds[ui][0] = p[ui]; //Check upper bound is upper to new pt if(bounds[ui][1] < p[ui]) bounds[ui][1] = p[ui]; } } void BoundCube::expand(float f) { //If self not valid, ensure that it will be after this run for(unsigned int ui=0; ui<3; ui++) { //Check lower bound is lower to new pt bounds[ui][0]-=f; //Check upper bound is upper to new pt bounds[ui][1]+=f; } } void BoundCube::setBounds(const Point3D *p, unsigned int n) { bounds[0][0] = std::numeric_limits::max(); bounds[1][0] = std::numeric_limits::max(); bounds[2][0] = std::numeric_limits::max(); bounds[0][1] = -std::numeric_limits::max(); bounds[1][1] = -std::numeric_limits::max(); bounds[2][1] = -std::numeric_limits::max(); for(unsigned int ui=0;ui p[ui][uj]) { bounds[uj][0] = p[ui][uj]; valid[uj][0] = true; } if(bounds[uj][1] < p[ui][uj]) { bounds[uj][1] = p[ui][uj]; valid[uj][1] = true; } } } } void BoundCube::setBounds( const Point3D &p1, const Point3D &p2) { for(unsigned int ui=0; ui<3; ui++) { bounds[ui][0]=std::min(p1[ui],p2[ui]); bounds[ui][1]=std::max(p1[ui],p2[ui]); valid[ui][0]= true; valid[ui][1]= true; } } void BoundCube::getBounds(Point3D &low, Point3D &high) const { for(unsigned int ui=0; ui<3; ui++) { ASSERT(valid[ui][0] && valid[ui][1]); low.setValue(ui,bounds[ui][0]); high.setValue(ui,bounds[ui][1]); } } float BoundCube::getLargestDim() const { float f; f=getSize(0); f=std::max(getSize(1),f); return std::max(getSize(2),f); } bool BoundCube::containsPt(const Point3D &p) const { for(unsigned int ui=0; ui<3; ui++) { ASSERT(valid[ui][0] && valid[ui][1]); if(p.getValue(ui) < bounds[ui][0] || p.getValue(ui) > bounds[ui][1]) return false; } return true; } bool BoundCube::contains(const BoundCube &b) const { Point3D low,high; b.getBounds(low,high); return containsPt(low) && containsPt(high); } float BoundCube::getSize(unsigned int dim) const { ASSERT(dim < 3); #ifdef DEBUG for(unsigned int ui=0;ui<3; ui++) { ASSERT(valid[0][1] && valid [0][0]); } #endif return fabs(bounds[dim][1] - bounds[dim][0]); } //checks intersection with sphere [centre,centre+radius) bool BoundCube::intersects(const Point3D &pt, float sqrRad) const { Point3D nearPt; //Find the closest point on the cube to the sphere for(unsigned int ui=0;ui<3;ui++) { if(pt.getValue(ui) <= bounds[ui][0]) { nearPt.setValue(ui,bounds[ui][0]); continue; } if(pt.getValue(ui) >=bounds[ui][1]) { nearPt.setValue(ui,bounds[ui][1]); continue; } nearPt.setValue(ui,pt[ui]); } //now test the distance from nrPt to pt //Note that the touching case is considered to be an intersection return (nearPt.sqrDist(pt) <=sqrRad); } BoundCube BoundCube::makeUnion(const BoundCube &bC) const { BoundCube res; for(unsigned int dim=0;dim<3;dim++) { float a,b; a=bounds[dim][0]; b=bC.bounds[dim][0]; res.setBound(dim,0,std::max(a,b)); a=bounds[dim][1]; b=bC.bounds[dim][1]; res.setBound(dim,1,std::min(a,b)); } return res; } unsigned int BoundCube::segmentTriple(unsigned int dim, float slice) const { ASSERT(dim < 3); //check lower if( slice < bounds[dim][0]) return 0; //check upper if( slice >=bounds[dim][1]) return 2; return 1; } Point3D BoundCube::getCentroid() const { #ifdef DEBUG for(unsigned int ui=0;ui<3; ui++) { ASSERT(valid[ui][1] && valid [ui][0]); } #endif return Point3D(bounds[0][1] + bounds[0][0], bounds[1][1] + bounds[1][0], bounds[2][1] + bounds[2][0])/2.0f; } float BoundCube::getMaxDistanceToBox(const Point3D &queryPt) const { #ifdef DEBUG for(unsigned int ui=0;ui<3; ui++) { ASSERT(valid[ui][1] && valid [ui][0]); } #endif float maxDistSqr=0.0f; //Set lower and upper corners on the bounding rectangle Point3D p[2]; p[0] = Point3D(bounds[0][0],bounds[1][0],bounds[2][0]); p[1] = Point3D(bounds[0][1],bounds[1][1],bounds[2][1]); //Count binary-wise selecting upper and lower limits, to enumerate all 8 vertices. for(unsigned int ui=0;ui<9; ui++) { maxDistSqr=std::max(maxDistSqr, queryPt.sqrDist(Point3D(p[ui&1][0],p[(ui&2) >> 1][1],p[(ui&4) >> 2][2]))); } return sqrtf(maxDistSqr); } bool BoundCube::containedInSphere(const Point3D &queryPt,float sqrDist) const { #ifdef DEBUG for(unsigned int ui=0;ui<3; ui++) { ASSERT(valid[ui][1] && valid [ui][0]); } #endif //Check all vertices for(unsigned int ui=0;ui<8; ui++) { if(queryPt.sqrDist(getVertex(ui)) > sqrDist) return false; } return true; } const BoundCube &BoundCube::operator=(const BoundCube &b) { for(unsigned int ui=0;ui<3; ui++) { for(unsigned int uj=0;uj<2; uj++) { valid[ui][uj] = b.valid[ui][uj]; bounds[ui][uj] = b.bounds[ui][uj]; } } return *this; } std::ostream &operator<<(std::ostream &stream, const BoundCube& b) { stream << "Bounds :Low ("; stream << b.bounds[0][0] << ","; stream << b.bounds[1][0] << ","; stream << b.bounds[2][0] << ") , High ("; stream << b.bounds[0][1] << ","; stream << b.bounds[1][1] << ","; stream << b.bounds[2][1] << ")" << std::endl; stream << "Bounds Valid: Low ("; stream << b.valid[0][0] << ","; stream << b.valid[1][0] << ","; stream << b.valid[2][0] << ") , High ("; stream << b.valid[0][1] << ","; stream << b.valid[1][1] << ","; stream << b.valid[2][1] << ")" << std::endl; return stream; } bool getFilesize(const char *fname, size_t &size) { std::ifstream f(fname,std::ios::binary); if(!f) return false; f.seekg(0,std::ios::end); size = f.tellg(); return true; } void UniqueIDHandler::clear() { idList.clear(); } unsigned int UniqueIDHandler::getPos(unsigned int id) const { for(list >::const_iterator it=idList.begin(); it!=idList.end(); ++it) { if(id == it->second) return it->first; } ASSERT(false); return 0; } void UniqueIDHandler::killByPos(unsigned int pos) { for(list >::iterator it=idList.begin(); it!=idList.end(); ++it) { if(pos == it->first) { idList.erase(it); break; } } //Decrement the items, which were further along, in order to maintain the mapping for(list >::iterator it=idList.begin(); it!=idList.end(); ++it) { if( it->first > pos) it->first--; } } unsigned int UniqueIDHandler::getId(unsigned int pos) const { for(list >::const_iterator it=idList.begin(); it!=idList.end(); ++it) { if(pos == it->first) return it->second; } ASSERT(false); return 0; } unsigned int UniqueIDHandler::genId(unsigned int pos) { //Look for each element number as a unique value in turn //This is guaranteed to return by the pigeonhole principle (we are testing //a target set (note <=)). for(unsigned int ui=0;ui<=idList.size(); ui++) { bool idTaken; idTaken=false; for(list >::iterator it=idList.begin(); it!=idList.end(); ++it) { if(ui == it->second) { idTaken=true; break; } } if(!idTaken) { idList.push_back(std::make_pair(pos,ui)); return ui; } } ASSERT(false); return 0; } void UniqueIDHandler::getIds(std::vector &idVec) const { //most wordy way of saying "spin through list" ever. for(list >::const_iterator it=idList.begin(); it!=idList.end(); ++it) idVec.push_back(it->second); } #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__) #include //Windows.h is a nasty name clashing horrible thing. //Put it last to avoid clashing with std:: stuff (eg max & min) #endif // Total ram in MB int getTotalRAM() { #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__) int ret; MEMORYSTATUS MemStat; // Zero structure memset(&MemStat, 0, sizeof(MemStat)); // Get RAM snapshot ::GlobalMemoryStatus(&MemStat); ret= MemStat.dwTotalPhys / (1024*1024); return ret; #elif __APPLE__ || __FreeBSD__ int ret; uint64_t mem; size_t len = sizeof(mem); sysctlbyname("hw.physmem", &mem, &len, NULL, 0); ret = (int)(mem/(1024*1024)); return ret; #elif __linux__ struct sysinfo sysInf; sysinfo(&sysInf); return ((size_t)(sysInf.totalram)*(size_t)(sysInf.mem_unit)/(1024*1024)); #else #error Unknown platform, no getTotalRAM function defined. #endif } size_t getAvailRAM() { #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__) int ret ; MEMORYSTATUS MemStat; // Zero structure memset(&MemStat, 0, sizeof(MemStat)); // Get RAM snapshot ::GlobalMemoryStatus(&MemStat); ret= MemStat.dwAvailPhys / (1024*1024); return ret; #elif __APPLE__ || __FreeBSD__ int ret ; uint64_t memsize; size_t pagesize; mach_port_t sls_port = mach_host_self(); mach_msg_type_number_t vmCount = HOST_VM_INFO_COUNT; vm_statistics_data_t vm; kern_return_t error; error = host_statistics(sls_port , HOST_VM_INFO , (host_info_t) &vm, &vmCount); pagesize = (unsigned long)sysconf(_SC_PAGESIZE); memsize = (vm.free_count + vm.inactive_count) * pagesize;//(vm.wire_count + vm.active_count + vm.inactive_count + vm.free_count + vm.zero_fill_count ) * pagesize; ret = (size_t)(memsize/(1024*1024)); return ret; #elif __linux__ struct sysinfo sysInf; sysinfo(&sysInf); return ((size_t)(sysInf.freeram + sysInf.bufferram)*(size_t)(sysInf.mem_unit)/(1024*1024)); #else #error Unknown platform, no getAvailRAM function defined. #endif } bool strhas(const char *cpTest, const char *cpPossible) { while(*cpTest) { const char *search; search=cpPossible; while(*search) { if(*search == *cpTest) return true; search++; } cpTest++; } return false; } //A routine for loading numeric data from a text file unsigned int loadTextData(const char *cpFilename, vector > &dataVec,vector &headerVec, const char *delim) { const unsigned int BUFFER_SIZE=4096; char inBuffer[BUFFER_SIZE]; unsigned int num_fields=0; #if !defined(WIN32) && !defined(WIN64) if(isNotDirectory(cpFilename) == false) return ERR_FILE_OPEN; #endif dataVec.clear(); //Open a file in text mode std::ifstream CFile(cpFilename); if(!CFile) return ERR_FILE_OPEN; //Drop the headers, if any string str; vector strVec; bool atHeader=true; vector prevStrs; while(CFile.good() && !CFile.eof() && atHeader) { //Grab a line from the file CFile.getline(inBuffer,BUFFER_SIZE); if(!CFile.good()) return ERR_FILE_FORMAT; prevStrs=strVec; //Split the strings around the deliminator c splitStrsRef(inBuffer,delim,strVec); stripZeroEntries(strVec); //Skip blank lines or lines that are only spaces if(strVec.empty()) continue; num_fields = strVec.size(); dataVec.resize(num_fields); //Check to see if we are in the header if(atHeader) { //If we have the right number of fields //we might be not in the header anymore if(num_fields >= 1 && strVec[0].size()) { float f; //Assume we are not reading the header atHeader=false; vector values; //Confirm by checking all values for(unsigned int ui=0; ui> f; if(ss.fail()) return ERR_FILE_FORMAT; dataVec[ui].push_back(f); } //========= } //Grab a line from the file CFile.getline(inBuffer,BUFFER_SIZE); if(!CFile.good() && !CFile.eof()) return ERR_FILE_FORMAT; } return 0; } unsigned int loadTextStringData(const char *cpFilename, vector > &dataVec,const char *delim) { const unsigned int BUFFER_SIZE=4096; #if !defined(WIN32) && !defined(WIN64) if(isNotDirectory(cpFilename) == false) return ERR_FILE_OPEN; #endif //Open a file in text mode std::ifstream CFile(cpFilename); if(!CFile) return ERR_FILE_OPEN; dataVec.clear(); char *inBuffer= new char[BUFFER_SIZE]; //Grab a line from the file CFile.getline(inBuffer,BUFFER_SIZE); while(!CFile.eof()) { vector strVec; strVec.clear(); //Split the strings around the tab char splitStrsRef(inBuffer,delim,strVec); stripZeroEntries(strVec); //Check the number of fields //========= if(strVec.size()) dataVec.push_back(strVec); //========= //Grab a line from the file CFile.getline(inBuffer,BUFFER_SIZE); if(!CFile.good() && !CFile.eof()) { delete[] inBuffer; return ERR_FILE_FORMAT; } } delete[] inBuffer; return 0; } #if !defined(__WIN32__) && !defined(__WIN64) bool isNotDirectory(const char *filename) { struct stat statbuf; if(stat(filename,&statbuf) == -1) return false; return (statbuf.st_mode !=S_IFDIR); } bool rmFile(const std::string &filename) { return remove(filename.c_str()) == 0; } #elif defined(__WIN32) || defined(__WIN64) bool rmFile(const std::string &filename) { return DeleteFile((const wchar_t*)filename.c_str()) == 0; } #endif #ifdef DEBUG bool isValidXML(const char *filename) { //Debug check to ensure we have written a valid xml file std::string command; unsigned int result; //Windows doesn't really have a /dev/null device, rather it has a reserved file name "NUL" or "nul" //http://technet.microsoft.com/en-gb/library/cc961816.aspx #if defined(WIN32) || defined(WIN64) command = std::string("xmllint --version > NUL 2> NUL"); #else command = std::string("xmllint --version >/dev/null 2>/dev/null"); #endif result=system(command.c_str()); if(!result) { //Windows' shell handles escapes differently, workaround #if defined(WIN32) || defined(WIN64) command = std::string("xmllint --noout \"") + filename + string("\""); #else command = std::string("xmllint --noout \'") + filename + string("\'"); #endif result=system(command.c_str()); return result ==0; } //Debug check ineffective WARN(!result,"xmllint not installed in system PATH, cannot perform debug check") return true; } #endif 3Depict-0.0.19/src/common/voxels.cpp0000644000175000017500000002311612723151712016567 0ustar pcuserpcuser/* * voxels.cpp - Voxelised data manipulation class * Copyright (C) 2015 D. Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "voxels.h" #include #include #include #include using std::vector; using std::pair; using std::numeric_limits; //Helper function to test if a point lies in a convex polygon. The input points MUST be convex // - by default this will re-sort the polygon. This is needed to // ensure convex ordering. If data is already ordered, you can // safely disable this (angularSort=false).; bool pointIn2DConvexPoly(float px,float py, vector > &planarPts2D, bool angularSort=true) { ASSERT(planarPts2D.size() >=3); if(angularSort) { //TODO : Optimise me. Probably not required to calculate angles explicitly //Find the centre x,y value float midPx =0; float midPy =0; for(size_t ui=1;ui > angles; angles.resize(planarPts2D.size()); for(unsigned int ui=0;ui > tmp; tmp.resize(planarPts2D.size()); for(size_t ui=0;ui0; //repeat, aborting if any half-plane intersects size_t nP = planarPts2D.size(); for(size_t ui=1;ui 0) != positive) return false; } return true; } //FIXME: This code is unfinished. template vector getVoxelIntersectionPoints(const BoundCube &b, const Point3D &p, const Point3D &normal, const Voxels &vox, unsigned int numRequiredSamples, vector &samples, vector &interpVal) { vector pts; b.getPlaneIntersectVertices(p,normal,pts); //Dont do anything if there is no intersection //(should have at least 3 pts to form a plane if(pts.size() < 3) return pts; //Now, using the plane points, rotate these into the Z=0 plane gsl_matrix *m = gsl_matrix_alloc(3,3); computeRotationMatrix(Point3D(0,0,1), Point3D(1,0,0),normal,Point3D(1,0,0),m); //Now rotate them into the Z=0 plane vector planarPts; rotateByMatrix(pts,m,planarPts); //Find the 2D bounding box, then generate uniform deviate // random numbers. Scale these ot fit inside the bbox. vector > planarPts2D; float bounds[2][2]; bounds[0][0] = std::numeric_limits::max(); //minX bounds[0][1] = std::numeric_limits::max(); //minY bounds[1][0] = -std::numeric_limits::max(); //maxX bounds[1][1] = -std::numeric_limits::max(); //maxY for(unsigned int ui=0; ui::epsilon())); planarPts2D[ui].first = planarPts[ui][0]; planarPts2D[ui].second = planarPts[ui][1]; bounds[0][0] = std::min(bounds[0][0],planarPts2D[ui].first); bounds[0][1] = std::min(bounds[0][1],planarPts2D[ui].second); bounds[1][0] = std::max(bounds[1][0],planarPts2D[ui].first); bounds[1][1] = std::max(bounds[1][1],planarPts2D[ui].second); } //Init the random number generator RandNumGen rng; rng.initTimer(); //compute scaling factors float ax,ay; ax = bounds[1][0] - bounds[0][0]; ay = bounds[1][1] - bounds[0][1]; //generate the randomly sampled points size_t nSample=0; samples.resize(numRequiredSamples); while(nSample< numRequiredSamples) { float px,py; px = ax*rng.genUniformDev() + bounds[0][0]; py = ay*rng.genUniformDev() + bounds[0][0]; if(pointIn2DConvexPoly(px,py,planarPts2D)) { samples[nSample] = Point3D(px,py,0); nSample++; } } //Transpose the matrix to obtain the inverse transform // originally rotate from frame to z=0. After transpose, // will rotate from z=0 to frame gsl_matrix_transpose(m); gsl_vector *vRot = gsl_vector_alloc(3); gsl_vector *vOrig = gsl_vector_alloc(3); gsl_vector_set(vOrig,3,0); for(size_t ui=0;uidata); } gsl_vector_free(vRot); gsl_vector_free(vOrig); gsl_matrix_free(m); //Find the interpolated value for each point in the voxel set interpVal.resize(samples.size()); for(size_t ui=0;ui const float FLOAT_SMALL= sqrt(numeric_limits::epsilon()); bool simpleMath() { Voxels a,b,c; a.resize(3,3,3); a.fill(2.0f); float f; f=a.getSum(); TEST(fabs(f-3.0*3.0*3.0*2.0 )< FLOAT_SMALL,"getsum test"); TEST(fabs(a.count(1.0f)- 3.0*3.0*3.0) < FLOAT_SMALL,"Count test"); return true; } bool basicTests() { Voxels f; f.resize(3,3,3); size_t xs,ys,zs; f.getSize(xs,ys,zs); TEST(xs == ys && ys == zs && zs == 3,"resize tests"); f.fill(0); f.setData(1,1,1,1.0f); TEST(fabs(f.max() - 1.0f) < FLOAT_SMALL,"Fill and data set"); f.resizeKeepData(2,2,2); f.getSize(xs,ys,zs); TEST(xs == ys && ys == zs && zs == 2, "resizeKeepData"); TEST(f.max() == 1.0f,"resize keep data"); //Test slice functions //-- Voxels v; v.resize(2,2,2); for(size_t ui=0;ui<8;ui++) v.setData(ui&1, (ui & 2) >> 1, (ui &4)>>2, ui); float *slice = new float[4]; //Test Z slice v.getSlice(2,0,slice); for(size_t ui=0;ui<4;ui++) { ASSERT(slice[ui] == ui); } //Expected results float expResults[4]; //Test X slice expResults[0]=0; expResults[1]=2;expResults[2]=4; expResults[3]=6; v.getSlice(0,0,slice); for(size_t ui=0;ui<4;ui++) { ASSERT(slice[ui] == expResults[ui]); } //Test Y slice v.getSlice(1,1,slice); expResults[0]=2; expResults[1]=3;expResults[2]=6; expResults[3]=7; for(size_t ui=0;ui<4;ui++) { ASSERT(slice[ui] == expResults[ui]); } delete[] slice; //-- try again with nonuniform voxels v.resize(4,3,2); for(size_t ui=0;ui<24;ui++) v.setData(ui, ui); slice = new float[12]; //Test Z slice v.getSlice(2,1,slice); for(size_t ui=0;ui<12;ui++) { ASSERT( slice[ui] >=12); } delete[] slice; //-- return true; } /* bool edgeCountTests() { Voxels v; v.resize(4,4,4); TEST(v.getEdgeUniqueIndex(0,0,0,3) == v.getEdgeUniqueIndex(0,1,1,0),"Edge coincidence"); TEST(v.getEdgeUniqueIndex(0,0,0,6) == v.getEdgeUniqueIndex(1,0,0,4),"Edge coincidence"); TEST(v.getEdgeUniqueIndex(0,0,0,2) == v.getEdgeUniqueIndex(0,0,1,0),"Edge coincidence"); //Check for edge -> index -> edge round tripping //for single cell size_t x,y,z; x=1; y=2; z=3; for(size_t ui=0;ui<12;ui++) { size_t idx; idx= v.getCellUniqueEdgeIndex(x,y,z,ui); size_t axis; size_t xN,yN,zN; v.getEdgeCell(idx,xN,yN,zN,axis); //if we ask for the cell, we should also //get the index ASSERT(x == xN && y==yN && z==zN); //TODO: Check that the axis of the edge was preserved (not the edge itself) ASSERT( axis == ui/4); } return true; } */ bool pointInPoly() { vector > pts; //make a square pts.push_back(make_pair(0,0)); // pts.push_back(make_pair(0,0.5)); pts.push_back(make_pair(0,1)); pts.push_back(make_pair(1,0)); pts.push_back(make_pair(1,1)); //shuffle vertex positions std::random_shuffle(pts.begin(),pts.end()); //Run test TEST(pointIn2DConvexPoly(0.5,0.5,pts),"Point-in-poly test"); // Inside TEST(!pointIn2DConvexPoly(1.5,0.5,pts),"Point-in-poly test"); //Outside TEST(!pointIn2DConvexPoly(1.5,1.5,pts),"Point-in-poly test"); //Diagonal return true; } bool runVoxelTests() { bool wantAbort=false; voxelsWantAbort = &wantAbort; TEST(basicTests(),"basic voxel tests"); TEST(simpleMath(), "voxel simple maths"); TEST(pointInPoly(),"point-in-poly tests"); // TEST(edgeCountTests(), "voxel edge tests"); return true; } #endif 3Depict-0.0.19/src/common/mesh.cpp0000644000175000017500000022235212640746376016224 0ustar pcuserpcuser/* * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "mesh.h" #include #include #include #include #include #include using std::deque; using std::make_pair; using std::vector; using std::string; using std::endl; using std::list; using std::cerr; enum { MESH_LOAD_UNSPECIFIED_ERROR=1, MESH_LOAD_BAD_NODECOUNT, MESH_LOAD_BAD_ELEMENTCOUNT, MESH_LOAD_IS_INSANE, MESH_LOAD_ENUM_END }; const char *MESH_LOAD_ERRS[] = { "", "Missing error message. This is a bug, please report it", "Node count was different to number of present nodes", "Element count was less than number of present elements", "Mesh loaded, but failed to pass sanity checks" }; const size_t PROGRESS_REDUCE=500; float signVal(unsigned int val) { if (val &1) return 1; else return -1; } size_t findMaxLessThanOrEq(const vector< std::pair > &v, size_t value) { ASSERT(v.size()); size_t curMax=v.begin()->first; size_t curMaxOff=0; for(size_t ui=0;ui curMax && v[ui].first <=value) curMaxOff=ui; } return curMaxOff; } // Recursive definition of determinate using expansion by minors. float Determinant(float **a,int n) { float det = 0; ASSERT( n > 1); //Fundamental 2x2 det. if (n == 2) det = a[0][0] * a[1][1] - a[1][0] * a[0][1]; else { int i,j,j1,j2; //recurisve det det = 0; for (j1=0; j1::epsilon()) ) return -1; // do not deal with this case, the triangle is degenerate n.normalise(); dir = rayEnd - rayStart; // ray direction vector //Check for ray-plane intersection point //-- Point3D rv1,rv2; rv1 = rayStart - tri[0]; rv2 = rayEnd - tri[0]; //If the dot products do not flip, the ray cannot cross infinite plane float dp1 = rv1.dotProd(n); float dp2 = rv2.dotProd(n); if(dp1*dp2 > 0) //(signs are the same --> ray is on one side of plane only) return 0; else if(rv1.dotProd(n) < std::numeric_limits::epsilon() && rv2.dotProd(n) < std::numeric_limits::epsilon()) { //If the ray-ends -> vertex vectors have no component in the normal direction //the ray is coplanar return 2; } //Project the ray onto the plane to create intersection point //Solution is found by parameterising ray and solving for //dot product with normal I=rayStart-dir*rv1.dotProd(n)/dir.dotProd(n); //-- // is I inside T? If so, then the dot product of each edge // with the ray from the edge start to the intersection will always // be in range [0-1]; otherwise there will be at least one that is negative float uu, uv, vv, wu, wv, D; uu = u.dotProd(u); uv = u.dotProd(v); vv = v.dotProd(v); w = I - tri[0]; wu = w.dotProd(u); wv = w.dotProd(v); D = uv * uv - uu * vv; // get and test parametric coords float s, t; s = (uv * wv - vv * wu) / D; if (s < 0.0 || s > 1.0) // I is outside T return 0; t = (uv * wu - uu * wv) / D; if (t < 0.0 || (s + t) > 1.0) // I is outside T return 0; return 1; // I is in T } //---- END This section under specific licence --- //Creates a list of pair,vector of point indices that are within a certain // tolerance radius of one another. Output first value in list will be strictly increasing. (i.e. it->first < (it+1)->first, regardless of it position) //FIXME: This algorithm is a poor effort. It just picks a semi-random point, //then nicks everything within the capture radius that was not nicked before. // this will work if the adjacency points are *close*, and well separated, but not otherwise. //TODO: Unify these two overloads! //-- void findNearVerticies(float tolerance, const vector &ptVec, vector > > &clusterList) { ASSERT(!clusterList.size()); vector marked; marked.resize(ptVec.size(),false); //Try to find the common points for(size_t ui=0;ui curClustered; //FIXME: replace with KD tree based search, or some other smart structure for(size_t uj=0;uj &ptVec, std::list > > &clusterList) { ASSERT(clusterList.empty()); vector marked; marked.resize(ptVec.size(),false); //Try to find the common points for(size_t ui=0;ui curClustered; //FIXME: replace with KD tree based search, or some other smart structure for(size_t uj=0;uj &orphans) { #ifdef HAVE_CPP11 ASSERT(std::is_sorted(orphans.begin(),orphans.end())); #endif ASSERT(std::adjacent_find(orphans.begin(),orphans.end()) == orphans.end()) ASSERT(isSane()); vector offsets; offsets.resize(nodes.size()); size_t curOrphan=0; for(size_t ui=0;ui::iterator itJ; for(size_t ui=0;ui newNodes; for(size_t ui=0;ui degenerate // |x1 y1 z1 1| // D0 = |x2 y2 z2 1| // |x3 y3 z3 1| // |x4 y4 z4 1| return fourDeterminant(nodes[tetrahedra[tet].p[0]], nodes[tetrahedra[tet].p[1]], nodes[tetrahedra[tet].p[2]], nodes[tetrahedra[tet].p[3]]) < std::numeric_limits::epsilon(); } bool Mesh::pointInTetrahedron(unsigned int tet, const Point3D &p) const { //Compute the following determinants; //if there is a sign change, then // |x1 y1 z1 1| // D0 = |x2 y2 z2 1| // |x3 y3 z3 1| // |x4 y4 z4 1| float f; f = fourDeterminant(nodes[tetrahedra[tet].p[0]], nodes[tetrahedra[tet].p[1]], nodes[tetrahedra[tet].p[2]], nodes[tetrahedra[tet].p[3]]); //Ensure that we do not get the zero case. ASSERT(!tetrahedronDegenerate(tet)); bool positive; positive= f>0; // // |x y z 1| // D1 = |x2 y2 z2 1| // |x3 y3 z3 1| // |x4 y4 z4 1| f = fourDeterminant(p, nodes[tetrahedra[tet].p[1]], nodes[tetrahedra[tet].p[2]], nodes[tetrahedra[tet].p[3]]); if(f < 0 && positive) return false; // // |x1 y1 z1 1| // D2 = |x y z 1| // |x3 y3 z3 1| // |x4 y4 z4 1| f = fourDeterminant( nodes[tetrahedra[tet].p[0]], p, nodes[tetrahedra[tet].p[2]], nodes[tetrahedra[tet].p[3]]); if(f < 0 && positive) return false; // // |x1 y1 z1 1| // D3 = |x2 y2 z2 1| // |x y z 1| // |x4 y4 z4 1| f = fourDeterminant( nodes[tetrahedra[tet].p[0]], nodes[tetrahedra[tet].p[1]], p, nodes[tetrahedra[tet].p[3]]); if(f < 0 && positive) return false; // // |x1 y1 z1 1| // D4 = |x2 y2 z2 1| // |x3 y3 z3 1| // |x y z 1| f = fourDeterminant( nodes[tetrahedra[tet].p[0]], nodes[tetrahedra[tet].p[1]], nodes[tetrahedra[tet].p[2]], p); if(f < 0 && positive) return false; return true; } //Tell us if the two triangles are indeed the same bool Mesh::sameTriangle(unsigned int ui, unsigned int uj) const { vector t1,t2; t1.resize(3); t2.resize(3); for(unsigned int idx=0;idx<3;idx++) { t1[idx]= triangles[ui].p[idx]; t2[idx]= triangles[uj].p[idx]; } std::sort(t1.begin(),t1.end()); std::sort(t2.begin(),t2.end()); return std::equal(t1.begin(),t1.end(),t2.begin()); } bool Mesh::sameTriangle(const TRIANGLE &t1, const TRIANGLE &t2) { vector ta,tb; ta.resize(3); tb.resize(3); for(unsigned int idx=0;idx<3;idx++) { ta[idx]= t1.p[idx]; tb[idx]= t2.p[idx]; } std::sort(ta.begin(),ta.end()); std::sort(tb.begin(),tb.end()); return std::equal(ta.begin(),ta.end(),tb.begin()); } bool Mesh::isSane(bool output, std::ostream &outStr) const { //Check sanity for(size_t ui=0;ui nodes.size()) { if(output) outStr << "It's INSANE. " << __LINE__ << std::endl; return false; } } } for(size_t ui=0;ui nodes.size()) { if(output) outStr << "It's INSANE. " << __LINE__ << std::endl; return false; } } } for(size_t ui=0;ui nodes.size()) { if(output) outStr << "It's INSANE. " << __LINE__ << std::endl; return false; } } } //Check that we have enough nodes to support each primitive type if(nodes.size() < 4 && tetrahedra.size()) { if(output) outStr << "It's INSANE. " << __LINE__ << std::endl; return false; } if(nodes.size() < 3 && triangles.size()) { if(output) outStr << "It's INSANE. " << __LINE__ << std::endl; return false; } if(nodes.size() < 2 && lines.size()) { if(output) outStr << "It's INSANE. " << __LINE__ << std::endl; return false; } for(size_t ui=0; ui tris,lines; //Lets look for triangles and lines attached to this //(really we just want the triangles) getAttachedComponents(ui,tris,lines); if(tris.size() > 4) { if(output) { //Too many triangles outStr << "INSANE: Tetrahedron " << ui << " has more than 4 attached triangles.." << std::endl; } return false; } if(lines.size() > 6) { if(output) { //Too many lines outStr << "INSANE: Tetrahedron " << ui << " has more than 6 attached lines.." << std::endl; } return false; } } return true; } void Mesh::getDisconnectedTets(vector &tets) const { using std::list; //In a fully connected mesh, every tetrahedron must be //matched to at least one other tetrahedron by a face //By definition, this is true for a zero or singly sized mesh if(tetrahedra.size() <=1) return; //Create a lookup table of vertices -> tetrahedra vector > tetLookup; tetLookup.resize(nodes.size()); for(size_t ui=0; ui connectedMap; for(size_t ui=0; ui::iterator it=connectedMap.begin(); it!=connectedMap.end();++it) { ASSERT(tetLookup[nextVert].size()); if(find(tetLookup[nextVert].begin(),tetLookup[nextVert].end(),(*it)) == tetLookup[nextVert].end()) { it=connectedMap.erase(it); --it; } } } if(!(connectedMap.size() == 2 || connectedMap.size() ==1)) { //this tetrahedron is multiply connected. //(remember, that itself is included in the above test) //Thats screwed up. tets.push_back(ui); } if(connectedMap.size() == 2) faceConnected=true; } if(!faceConnected) { tets.push_back(ui); } } return; } bool Mesh::isTetFullyConnected(unsigned int &badTet) const { using std::list; //In a fully connected mesh, every tetrahedron must be //matched to at least one other tetrahedron by a face //By definition, this is true for a zero or singly sized mesh if(tetrahedra.size() <=1) return true; //Create a lookup table of vertices -> tetrahedra vector > tetLookup; tetLookup.resize(nodes.size()); for(size_t ui=0; ui connectedMap; for(size_t ui=0; ui::iterator it=connectedMap.begin(); it!=connectedMap.end();++it) { ASSERT(tetLookup[nextVert].size()); if(find(tetLookup[nextVert].begin(),tetLookup[nextVert].end(),(*it)) == tetLookup[nextVert].end()) { it=connectedMap.erase(it); --it; } } } if(!(connectedMap.size() == 2 || connectedMap.size() ==1)) { //this tetrahedron is multiply connected. //(remember, that itself is included in the above test) //Thats screwed up. badTet=ui; return false; } if(connectedMap.size() == 2) { faceConnected=true; break; } } if(!faceConnected) { badTet=ui; return false; } } return true; } void Mesh::removeDuplicateTris() { ASSERT(isSane()); using std::list; vector dups; //Create a listing of all the triangles incident to each node vector > vl; vl.resize(nodes.size()); for(unsigned int ui=0;ui::iterator it=vl[ui].begin(); it!=vl[ui].end();++it) { //Examine the triangle that is coincident on this vertex, then //see if the other triangles on this vertex are duplicates for(list::iterator itJ=it; itJ!=vl[ui].end();++itJ) { if(itJ == it) continue; if(sameTriangle(*it,*itJ)) { if(std::find(dups.begin(),dups.end(),*itJ) == dups.end()) dups.push_back(*itJ); } } } } for(unsigned int ui=dups.size();ui--;) { std::swap(triangles[dups[ui]],triangles.back()); triangles.pop_back(); } } void Mesh::mergeDuplicateVertices(float tol) { using std::list; using std::pair; vector thisDup; vector > > dups; //Find the duplicates // placing duplicates into a list of sorted vectors of duplicate indices findNearVerticies(tol,nodes,dups); for(size_t ui=0;ui > >::iterator it=dups.begin(); it!=dups.end();++it) { //replace the points vector::iterator itJ; for(size_t ui=0;uisecond.begin(),it->second.end(),points[ui]); if(itJ !=it->second.end()) points[ui]=it->first; } //replace the lines for(size_t ui=0;uisecond.begin(),it->second.end(),lines[ui].p[uj]); if(itJ !=it->second.end()) lines[ui].p[uj]=it->first; } } //replace the triangles for(size_t ui=0;uisecond.begin(),it->second.end(),triangles[ui].p[uj]); if(itJ !=it->second.end()) triangles[ui].p[uj]=it->first; } } //replace the tetrahedra for(size_t ui=0;uisecond.begin(),it->second.end(),tetrahedra[ui].p[uj]); if(itJ !=it->second.end()) tetrahedra[ui].p[uj]=it->first; } } } ASSERT(isSane()); //obtain the set of vertices that have now been orphaned vector toRemove; for(vector > >::iterator it=dups.begin(); it!=dups.end();++it) { for(size_t ui=0;uisecond.size();ui++) toRemove.push_back(it->second[ui]); } std::sort(toRemove.begin(),toRemove.end()); //hokay, so all we need to do is remove orphans killOrphanNodes(toRemove); ASSERT(isSane()); } void Mesh::killOrphanNodes() { vector referenced(nodes.size(),false); for(size_t ui=0;ui orphans; for(size_t ui=0;ui dups; //Create a listing of all the triangles incident to each node vector > vl; vl.resize(nodes.size()); for(unsigned int ui=0;ui::iterator it=vl[ui].begin(); it!=vl[ui].end();++it) { //Examine the triangle that is coincident on this vertex, then //see if the other triangles on this vertex are duplicates for(list::iterator itJ=it; itJ!=vl[ui].end();++itJ) { if(itJ == it) continue; if(sameTriangle(*it,*itJ)) { if(std::find(dups.begin(),dups.end(),*itJ) == dups.end()) dups.push_back(*itJ); } } } } return dups.size(); } unsigned int Mesh::numDupVertices(float tolerance) const { float sqrTol; sqrTol = tolerance*tolerance; unsigned int numDups=0; //TODO: Non brute force approach (k3d-mk2) #pragma omp parallel for reduction(+:numDups) for(size_t ui=0;ui trianglesToKill; unsigned int triKillCount; do { triKillCount=0; std::cerr << "Pass..." << std::endl; trianglesToKill.clear(); #pragma omp parallel for for(size_t ui=0;ui()); for(unsigned int ui=0;ui tetrahedra //and vertices->triangles vector > tetLookup; vector > triLookup; tetLookup.resize(nodes.size()); for(size_t ui=0; ui > triMaps; list connectedMap; std::cerr << "Examining " << tetrahedra.size() << " tetrahedra " << std::endl; //Draw a progress bar unsigned int lastFrac=0; std::cerr << std::endl << "|"; for(unsigned int ui=0; ui<100; ui++) std::cerr << "."; std::cerr << "| 100%" << std::endl << "|."; for(size_t ui=0; ui::iterator it=connectedMap.begin(); it!=connectedMap.end();++it) { ASSERT(tetLookup[nextVert].size()); if(find(tetLookup[nextVert].begin(),tetLookup[nextVert].end(),(*it)) == tetLookup[nextVert].end()) { it=connectedMap.erase(it); --it; } } } //Should either face another tet, or be exposed //note that itself is counted in the connectedMap ASSERT((connectedMap.size() == 2 || connectedMap.size() ==1)); if(connectedMap.size() == 1) { //OK, the only tetrahedron that shares //this face is itself, so it does not share //a face with another tet. //However it could be exposed //or covered by an existing triangle //See if the triangles are attached to this face vector tetFaceNodes; tetFaceNodes.clear(); for(unsigned int uk=0;uk<3;uk++) tetFaceNodes.push_back(tetrahedra[ui].p[faceMap[uj][uk]]); std::sort(tetFaceNodes.begin(),tetFaceNodes.end()); vector attachedTris; //Loop over each vertex on this face, creating a list of incident //triangles to this vertex for(unsigned int uk=0;uk<3;uk++) { size_t vertex; vertex = tetrahedra[ui].p[faceMap[uj][uk]]; for(list::iterator it=triLookup[vertex].begin(); it!=triLookup[vertex].end();++it) { //Push on list of attached triangles, if not prev. //seen if(find(attachedTris.begin(),attachedTris.end(), *it) == attachedTris.end()) attachedTris.push_back(*it); } } //So now we have list of triangles that are incident to //any vertex on this face. now, we need to look through these //to determine if any triangle is incident to this face vector triNodes; triNodes.resize(3); bool triClothedFace; triClothedFace=false; for(unsigned int uk=0;uk lastFrac) { std::cerr << "."; lastFrac++; } } while(lastFrac++ < 100) std::cerr << "."; std::cerr << "|"; ASSERT(triMaps.size() < tetrahedra.size()); //Trimaps now holds the mapping of all the tetrahedra that are exposed //but have no covering triangle. Let us apply a surface to this triangle //using the physical group specified above std::cerr << "Found " << triMaps.size() << " uncovered tetrahedra " << std::endl; vector > curPhys; getCurPhysGroups(curPhys); std::cerr << "DEBUG : Found " << curPhys.size() << " physical groups " << std::endl; for(unsigned int ui=0;ui &ptsX, const std::vector &ptsY, const std::vector &ptsZ) { //Incoming data streams should describe triangles ASSERT(ptsX.size() == ptsY.size() && ptsY.size() == ptsZ.size()); ASSERT(ptsX.size() %3 == 0); clear(); vector ptVec; ptVec.resize(ptsX.size()); #pragma omp parallel for for(size_t ui=0;ui > > clusterList; findNearVerticies(MAX_SQR_RAD,ptVec,clusterList); //FIXME: This is totally inefficient. //Now, we have a vector of pts, each group of 3 corresponding to 1 triangle //and we have the mapping for the new triangles vector triangleMapping; triangleMapping.resize(ptVec.size()); #pragma omp parallel for for(size_t ui=0;ui "rally pt" for(std::list > >::iterator it=clusterList.begin();it!=clusterList.end();++it) { for(size_t uj=0;ujsecond.size();uj++) triangleMapping[it->second[uj]]=it->first; } //now we have to do an additional step. When we create the new node vector, we are going to exclude points //that are no longer referenced. So, to do this (inefficiently), we need to know how many times each point was referenced //if it was referenced zero times, we have to modify the triangle mapping for any nodes of higher index vector refCount; refCount.resize(ptVec.size(),0); for(size_t ui=0;uinodeVec (ie the indices of the pts, after dropping unreferenced pts) size_t delta=0; vector numPtsDropped; for(size_t ui=0;ui strVec; tetrahedra.clear(); triangles.clear(); lines.clear(); points.clear(); nodes.clear(); curLine=0; std::ifstream f(meshFile); if(!f) return 1; curLine=1; string line; //Read file header //--- getline(f,line); if(f.fail()) return 1; //Check first line is "$MeshFormat" if(line != "$MeshFormat") return 1; getline(f,line); curLine++; if(f.fail()) return 1; //Second line should be versionNumber file-type data-size splitStrsRef(line.c_str(),' ',strVec); if(strVec.size() != 3) return 1; //Only going to allow version 2.0 && 2.1 && 2.2; can't guarantee other versions.... if(!(strVec[0] == "2.1" || strVec[0] =="2" || strVec[0] == "2.2")) return 1; //file-type should be "0" (for ascii file) //Number of bytes in a double is third arg; but I will skip it if(strVec[1] != "0") return 1; getline(f,line); curLine++; if(f.fail()) return 1; if(line != "$EndMeshFormat") return 1; //-------- //Read the nodes header getline(f,line); curLine++; if(f.fail()) return 1; if(line != "$Nodes") return 1; getline(f,line); curLine++; if(f.fail()) return 1; unsigned int nodeCount; if(stream_cast(nodeCount,line)) return 1; std::cerr << "reading node coords " << std::endl; //Read the node XYZ coords do { getline(f,line); curLine++; if(f.fail()) return 1; if(line == "$EndNodes") break; splitStrsRef(line.c_str(),' ',strVec); if(strVec.size() < 4) return 1; Point3D pt; if(stream_cast(pt[0],strVec[1])) return 1; if(stream_cast(pt[1],strVec[2])) return 1; if(stream_cast(pt[2],strVec[3])) return 1; nodes.push_back(pt); } while(!f.eof()); if(f.eof()) return 1; //Read the elements header getline(f,line); curLine++; if(f.fail()) return 1; if(line != "$Elements") return 1; getline(f,line); curLine++; if(f.fail()) return 1; unsigned int elementCount; if(stream_cast(elementCount,line)) return 1; std::cerr << "Reading Element data" << std::endl; //Read the element data do { getline(f,line); curLine++; if(f.fail()) return 1; if(line == "$EndElements") break; splitStrsRef(line.c_str(),' ',strVec); if(strVec.size() < 3) return 1; unsigned int numTags,elemType; stream_cast(numTags,strVec[2]); stream_cast(elemType,strVec[1]); bool badNode; badNode=false; switch(elemType) { case ELEM_SINGLE_NODE_POINT: { if(strVec.size() - numTags < 4) return 2; unsigned int ptNum; stream_cast(ptNum,strVec[strVec.size() -1]); ptNum--; points.push_back(ptNum); break; } case ELEM_TWO_NODE_LINE: { if(strVec.size()-numTags < 5) return 2; LINE l; if(stream_cast(l.physGroup,strVec[3])) return 1; if(stream_cast(l.p[0],strVec[strVec.size() -2])) return 1; if(stream_cast(l.p[1],strVec[strVec.size() -1])) return 1; if( l.p[0] == l.p[1]) { if(allowBadMeshes) { badNode=true; std::cerr << "WARNING: Bad mesh line element at file line " << curLine << std::endl; } else return 1; } //Convert from 1-index to zero index notation l.p[0]--; l.p[1]--; lines.push_back(l); break; } case ELEM_THREE_NODE_TRIANGLE: { if(strVec.size()-numTags < 6) return 2; TRIANGLE t; if(stream_cast(t.physGroup,strVec[3])) return 1; if(stream_cast(t.p[0],strVec[strVec.size() -3])) return 1; if(stream_cast(t.p[1],strVec[strVec.size() -2])) return 1; if(stream_cast(t.p[2],strVec[strVec.size() -1])) return 1; if( t.p[0] == t.p[1] || t.p[1] == t.p[2] || t.p[2] == t.p[0]) { if(allowBadMeshes) { badNode=true; std::cerr << "WARNING: Bad mesh triangle at line " << curLine << std::endl; } else return 1; } if(!badNode) { //Convert from 1-index to zero index notation t.p[0]--; t.p[1]--; t.p[2]--; triangles.push_back(t); } break; } case ELEM_FOUR_NODE_TETRAHEDRON: { if(strVec.size()-numTags < 7) return 2; TETRAHEDRON t; if(stream_cast(t.physGroup,strVec[3])) return 1; if(stream_cast(t.p[0],strVec[strVec.size() -4])) return 1; if(stream_cast(t.p[1],strVec[strVec.size() -3])) return 1; if(stream_cast(t.p[2],strVec[strVec.size() -2])) return 1; if(stream_cast(t.p[3],strVec[strVec.size() -1])) return 1; for(unsigned int ui=0;ui<4; ui++) { for(unsigned int uj=0;uj<4;uj++) { if(ui == uj) continue; if( t.p[ui] == t.p[uj]) { if(allowBadMeshes) { std::cerr << "WARNING: Bad mesh tetrahedron at line " << curLine << std::endl; badNode=true; } else return 1; } } } if(!badNode) { //Convert from 1-index to zero index notation t.p[0]--; t.p[1]--; t.p[2]--; t.p[3]--; tetrahedra.push_back(t); } break; } default: return 3; } }while(!f.eof()); //Do some final checks - element count can only be under-counted by our class // as there may be some primitives we don't support. However, it should be // never over counted if(!allowBadMeshes) { if(elementCount < triangles.size() + lines.size() + points.size() + tetrahedra.size() ) return MESH_LOAD_BAD_ELEMENTCOUNT; if(nodeCount != nodes.size()) return MESH_LOAD_BAD_NODECOUNT; } if(!isSane()) return MESH_LOAD_IS_INSANE; return 0; } */ unsigned int Mesh::countTriNodes() const { vector touchedNodes; touchedNodes.resize(triangles.size()*3); //Build monolithic list #pragma omp parallel for for(size_t ui=0;ui::iterator it; std::sort(touchedNodes.begin(),touchedNodes.end()); it=std::unique(touchedNodes.begin(),touchedNodes.end()); //TODO: Test me... touchedNodes.resize(it-touchedNodes.begin()); return touchedNodes.size(); } void Mesh::reassignGroups(unsigned int newPhys) { #pragma omp parallel for for(size_t ui=0;ui &refineTets) { //Split the marked tetrahedra into sub-tetrahedra of 4 using a //internal vertex insertion method. //Some strategies are available in the PhD thesis of Wessner, //"Mesh Refinement Techniques for TCAD Tools", Vienna //which is available at httpP://www.iue.tuwien.ac.at/phd/wessner/ for(unsigned int ui=0;ui()); for(unsigned int ui=0;ui > &adj) const { using std::list; adj.resize(triangles.size()); //Create a lookup table of vertices -> triangles vector > triLookup; triLookup.resize(nodes.size()); for(size_t ui=0; ui connectedMap; for(size_t ui=0; ui intersect; intersect=triLookup[v1]; for(list::iterator it=intersect.begin();it!=intersect.end();) { if( find(triLookup[v2].begin(),triLookup[v2].end(),*it) == triLookup[v2].end()) { it=intersect.erase(it); } else ++it; } //OK, so the intersection of the two lookups is the triangles attached to the nodes. for(list::iterator it=intersect.begin();it!=intersect.end();++it) { //Disallow self adjacency if(*it !=ui) adj[ui].push_back(*it); } } } } unsigned int Mesh::divideMeshSurface(float divisionAngle, unsigned int newPhysGroupStart, const vector &physGroupsToSplit) { using std::list; unsigned int origStart=newPhysGroupStart; //Construct the vector > adjacencyMap; vector touchedTris; vector boundaryTris; getTriEdgeAdjacencyMap(adjacencyMap); touchedTris.resize(adjacencyMap.size(),false); //OK, so the plan is to pick a triangle (any triangle) //then to expand this out until we hit an edge, as defined by the //angle between adjacent triangle normals. //once we hit the edge, we then don't cross that vertex. // //this algorithm will FAIL (awh new, bro!) //if triangles have more than one neighbour on each edge. //Once we run out of triangles to try (BFS), we then pick one of the "untouched" //tris, and then work from there. // Step 1: // * Remove any triangles that are not in the physical groups of interest for(size_t ui=0;ui::iterator it=adjacencyMap[ui].begin(); it!=adjacencyMap[ui].end(); ++it) { if(find(physGroupsToSplit.begin(),physGroupsToSplit.end(), triangles[*it].physGroup) == physGroupsToSplit.end()) { it=adjacencyMap[ui].erase(it); --it; } } } } //OK, so now we have an adjacency list of the interesting phys groups. //Step 2: // * search for new triangles to group using an expanding boundary method BoundCube debugBounds,dbgTmp; debugBounds.setInverseLimits(); do { //Find a triangle to use as the "seed" size_t curTri; curTri= find(touchedTris.begin(),touchedTris.end(),false) - touchedTris.begin(); //No more triangles.. all touched. if(curTri == touchedTris.size()) break; //OK, so now we have a "seed" triangle to work with. //create an expanding boundary via adjacency. size_t groupSize=0; list boundary,moreBoundary; boundary.clear(); boundary.push_back(curTri); std::cerr << "Seeded with triangle # " << curTri << std::endl; touchedTris[curTri]=true; // we touched it. triangles[curTri].physGroup=newPhysGroupStart; // we touched it. do { //Expand the boundary using the current boundary triangles //loop over the current boundary for(list::iterator bIt=boundary.begin();bIt!=boundary.end();++bIt) { ASSERT(adjacencyMap[*bIt].size()); //Check the adjacency map of the triangles adjacent to a specific boundary element for(list::iterator it=adjacencyMap[*bIt].begin();it!=adjacencyMap[*bIt].end();++it) { if(!touchedTris[*it] && (normalAngle(*bIt,*it) < divisionAngle || fabs(normalAngle(*bIt,*it,true)) < divisionAngle) ) { //Alright then, add this new triangle to the potential new boundary //(let us not add straight away, as we would like to expand in a minimum //perimeter to surface area manner moreBoundary.push_back(*it); touchedTris[*it]=true; triangles[*it].physGroup=newPhysGroupStart; dbgTmp.setBounds(nodes[triangles[*it].p[0]], nodes[triangles[*it].p[1]]); dbgTmp.expand(nodes[triangles[*it].p[2]]); debugBounds.expand(dbgTmp); groupSize++; } } } //exchange the new boundary list with the boundary list boundary.swap(moreBoundary); moreBoundary.clear(); } while(!boundary.empty()); //Debug: print bounding box std::cerr << "Group size: "<< groupSize << std::endl; std::cerr << debugBounds << std::endl; //advance the physical group listing newPhysGroupStart++; } while(true); //return the number of divided surfaces return newPhysGroupStart-origStart+1; } void Mesh::getAttachedComponents(size_t tet, vector &tris, vector &l) const { ASSERT(tet &res) const { ASSERT(!res.size()); for(size_t ui=0;ui &searchNodes, std::vector &lineRes, std::vector &triangleRes, std::vector &tetrahedraRes ) const { std::sort(searchNodes.begin(),searchNodes.end()); bool searchFound; ASSERT(lineRes.size() == triangleRes.size() && tetrahedraRes.size() == lineRes.size() && !tetrahedraRes.size()); for(size_t ui=0;ui > &curPhys) const { ComparePairFirst cmp; //TODO: could be more efficient by replacing linear search with //boolean one for(unsigned int ui=0;uip[uj]]; float newVol; newVol=p[0].dotProd(p[1].crossProd(p[2])); ASSERT(newVol > 0.0f); vol+=newVol; } vol*=1.0/6.0; std::cerr << "Signed volume :" << vol << std::endl; return fabs(vol); } void Mesh::relax(size_t iterations, float relaxFactor) { ASSERT(isSane()); using std::pair; vector > adjacencyList; adjacencyList.resize(nodes.size()); //Compute the adjacency list for each vertex //-- for(size_t ui=0;ui > > adjacencyFactors; adjacencyFactors.resize(nodes.size()); for(size_t ui=0;ui &p, vector &meshResults, std::ostream &msgs, bool wantProg) const { // ASSERT(trianglesFullyConnected()); TODO: Implement me //ASSERT(isOrientedCoherently()); ASSERT(!tetrahedra.size()); Point3D centre=Point3D(0,0,0);; //Find the bounding box of the triangle component of the mesh for(size_t ui=0;ui::max(); for(size_t ui=0;uiB on one // triangle matches that of the other). //for all triangles in the mesh vector seenTri; seenTri.resize(triangles.size(),false); deque triQueue; std::vector > adjacency; getTriEdgeAdjacencyMap(adjacency); for(size_t ui=0;ui *curAdjT; curAdjT= &(adjacency[tri]); for(list::const_iterator it=curAdjT->begin(); it !=curAdjT->end();++it) { if(*it == tri || seenTri[*it]) continue; if(triangles[tri].edgesMismatch(triangles[*it])) return false; seenTri[*it]= true; triQueue.push_back(*it); } } } return true; } void Mesh::orientTriEdgesCoherently() { //Need to check circulation of triangles, (edge A->B on one triangle matches that of the other). //for all triangles in the mesh vector seenTri; seenTri.resize(triangles.size(),false); deque triQueue; std::vector > adjacency; getTriEdgeAdjacencyMap(adjacency); for(size_t ui=0;ui *curAdjT; curAdjT= &(adjacency[tri]); for(list::const_iterator it=curAdjT->begin(); it !=curAdjT->end();++it) { if(*it == tri || seenTri[*it]) continue; if(triangles[tri].edgesMismatch(triangles[*it])) { //Reverse the vertex order on the triangle std::swap(triangles[*it].p[0], triangles[*it].p[1]); } seenTri[*it]= true; triQueue.push_back(*it); } } } //ASSERT(isOrientedCoherently()); } */ bool TRIANGLE::isSane(size_t nMax) const { for(size_t ui=0;ui<3;ui++) { if ( p[ui] == p[(ui+1)%3]) return false; //if nMax supplied, use it if(nMax != (size_t) -1 && p[ui] > nMax ) return false; } return true; } /* bool TRIANGLE::edgesMismatch(const TRIANGLE &other) const { ASSERT(isSane()); ASSERT(other.isSane()); vector commonV; for(size_t ui=0;ui<3;ui++) { for(size_t uj=0;uj<3;uj++) { if ( other.p[uj] == p[ui]) { commonV.push_back(p[ui]); break; } } } ASSERT(commonV.size() <=3); //If either zero or one common vertices, then there is no edge // mismatch if(commonV.size() < 2) return false; else { unsigned int pA[3],pB[3]; for(size_t ui=0;ui<3;ui++) { //If common vertex cannot be found, replace with "-1" if(std::find(commonV.begin(),commonV.end(),p[ui]) == commonV.end()) pA[ui]=-1; else pA[ui]=p[ui]; //If common vertex cannot be found, replace with "-1" if(std::find(commonV.begin(),commonV.end(),other.p[ui]) == commonV.end()) pB[ui]=-1; else pB[ui]=other.p[ui]; } if (commonV.size() == 3) { //If the triangles have all 3 vertices in common, they will match IFF they // have a rotationally invariant sequence that matches (3 matching edges). As permutations // other than vertex sequence rotation will flip the triangle normal // egg : 1-2-3 matches 2-3-1, but not 1-3-2 return !rotateMatch(pA,pB,3); } else { //If the triangles have 2 vs in common, then they have one edge in common. // this will match IFF the circulation (edge ordering) of the two triangles is opposite return !antiRotateMatch(pA,pB,3); } } ASSERT(false); } */ #ifdef DEBUG bool coherencyTests() { //Create a perfects valid mesh of tris //--- Mesh m; m.nodes.push_back(Point3D(0,0,0)); m.nodes.push_back(Point3D(0,0,1)); m.nodes.push_back(Point3D(1,0,0)); m.nodes.push_back(Point3D(0,1,0)); TRIANGLE t; t.p[0] = 0; t.p[1] = 1; t.p[2] = 2; m.triangles.push_back(t); t.p[0]=1; t.p[1]=0; t.p[2]=3; m.triangles.push_back(t); t.p[0]=3; t.p[1]=2; t.p[2]=1; m.triangles.push_back(t); //--- //TEST(m.isOrientedCoherently(),"mesh coherency check"); //Flip the shared edge representation for a tri, so we get an inverted // normal on one tri m.triangles[1].p[0]=0; m.triangles[1].p[1]=1; //TEST(!m.isOrientedCoherently(),"check incoherent mesh detection"); //Attempt to reorient the mesh coherently //m.orientTriEdgesCoherently(); //check it worked //TEST(m.isOrientedCoherently(), "Mesh auto-reorient") return true; } bool nearestTriTest() { Mesh m; //Make an L shaped edge m.nodes.push_back(Point3D(1,0,0)); m.nodes.push_back(Point3D(-1,0,0)); m.nodes.push_back(Point3D(0,0,1)); m.nodes.push_back(Point3D(0,1,0)); //0,3,1 TRIANGLE t; t.p[0]=0; t.p[1]=3; t.p[2]=1; m.triangles.push_back(t); //0,1,2 t.p[0]=0; t.p[1]=1; t.p[2]=2; m.triangles.push_back(t); //Test that the exterior test works, // using point (0.5,0,0.4) //float dist; //TEST(m.getNearestTri(Point3D(0,0.5,0.4),dist) == 0,"Nearest tri"); //TEST(m.getNearestTri(Point3D(0,0.5,0.6),dist) == 1,"Nearest tri"); return true; } bool meshTests() { TEST(coherencyTests(),"Mesh coherency checks"); TEST(nearestTriTest(),"Mesh nearest tri"); return true; } #endif 3Depict-0.0.19/src/common/constants.h0000644000175000017500000000402412716174467016743 0ustar pcuserpcuser/* * common/constants.h - Common constants used across program * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef COMMONCONSTANTS_H #define COMMONCONSTANTS_H #include "translation.h" //Hack-ish variable for minimal size of data to execute // openMP conditionals as parallel regions. This is highly empirical! const unsigned int OPENMP_MIN_DATASIZE=1000; //Plot error types enum { PLOT_ERROR_NONE, PLOT_ERROR_MOVING_AVERAGE, PLOT_ERROR_ENDOFENUM }; //!State file output formats enum { STATE_FORMAT_XML=1 }; //!Property types for wxPropertyGrid enum { PROPERTY_TYPE_BOOL=1, PROPERTY_TYPE_INTEGER, PROPERTY_TYPE_REAL, PROPERTY_TYPE_COLOUR, PROPERTY_TYPE_STRING, PROPERTY_TYPE_POINT3D, PROPERTY_TYPE_CHOICE, PROPERTY_TYPE_FILE, PROPERTY_TYPE_DIR, PROPERTY_TYPE_ENUM_END //Not a prop, just end of enum }; //!Movement types for plot enum { REGION_MOVE_EXTEND_XMINUS, //Moving (extend/shrink) lower bound of region REGION_MOVE_TRANSLATE_X, // Moving regoin REGION_MOVE_EXTEND_XPLUS, // Moving (extend/shrink) upper bound }; //!Structure to handle error bar drawing in plot struct PLOT_ERROR { //!Plot data estimator mode unsigned int mode; //!Number of data points for moving average unsigned int movingAverageNum; }; extern const char *RANGEFILE_WX_CONSTANT; extern const char *DTD_NAME; extern const char *PROGRAM_NAME; extern const char *PROGRAM_VERSION; extern const char *FONT_FILE; #endif 3Depict-0.0.19/src/common/voxels.h0000644000175000017500000011570312723155621016243 0ustar pcuserpcuser /* * common/voxels.h - Voxelised data manipulation class * Copyright (C) 2015 D. Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VOXELS_H #define VOXELS_H const unsigned int MAX_CALLBACK=500; #include "common/basics.h" #include #include // Not sure who is defining this, but it is causing problems - mathgl? #undef I #undef Complex #include #if defined(WIN32) || defined(WIN64) #include #endif #include #include #include //Bug in accumulator.hxx. Needs typeinfo #include using namespace std; #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #ifdef _OPENMP #include #endif //!Boundary clipping mode /*! These constants defines the behaviour of the routines when presented with a * boundary value problem, such as in convolution. */ enum{ BOUND_CLIP=1, BOUND_HOLD, BOUND_DERIV_HOLD, BOUND_MIRROR, BOUND_ZERO, BOUND_ENUM_END }; //Interpolation mode for slice enum { VOX_INTERP_NONE, VOX_INTERP_LINEAR, VOX_INTERP_ENUM_END }; enum{ ADJ_ALL, ADJ_PLUS }; //Error codes enum{ VOXELS_BAD_FILE_READ=1, VOXELS_BAD_FILE_OPEN, VOXELS_BAD_FILE_SIZE, VOXELS_OUT_OF_MEMORY }; //Must be power of two (buffer size when loading files, in sizeof(T)s) const unsigned int ITEM_BUFFER_SIZE=65536; //!Clipping direction constants /*! Controls the clipping direction when performing clipping operations */ enum { CLIP_NONE=0, CLIP_LOWER_SOUTH_WEST, CLIP_UPPER_NORTH_EAST }; enum { VOXEL_ABORT_ERR, VOXEL_MEMORY_ERR, VOXEL_BOUNDS_INVALID_ERR }; #ifdef DEBUG bool runVoxelTests(); #endif static const bool *voxelsWantAbort; //!Template class that stores 3D voxel data /*! To instantiate this class, objects must have * basic mathematical operators, such as * + - and = */ //FIXME: Cross check all algorithsm agree that the centre of the voxel is // where the data value is located template class Voxels { private: //!Number of bins in data set (X,Y,Z) size_t binCount[3]; //!Voxel array vigra::MultiArray<3,T> voxels; //!Scaling value for furthest bound of the dataset. //Dataset is assumed to sit in a rectilinear volume from minBound //to maxBound Point3D minBound, maxBound; void localPaddedConvolve(long long ui,long long uj, long long uk, const Voxels &kernel,Voxels &result, unsigned int mode) const; public: //!Constructor. Voxels(); //!Destructor ~Voxels(); //!Swap object contents with other voxel object void swap(Voxels &v); //!Clone this into another object void clone(Voxels &newClone) const; //!Set the value of a point in the dataset void setPoint(const Point3D &pt, const T &val); //!Retrieve the value of a datapoint, this is rounded to the nearest voxel T getPointData(const Point3D &pt) const; //!Retrieve the XYZ voxel location associated with a given position void getIndex(size_t &x, size_t &y, size_t &z, const Point3D &p) const; //!Retrieve the XYZ voxel location associated with a given position, // including upper borders void getIndexWithUpper(size_t &x, size_t &y, size_t &z, const Point3D &p) const; //!Get the position associated with an XYZ voxel Point3D getPoint(size_t x, size_t y, size_t z) const; //!Retrieve the value of a specific voxel inline T getData(size_t x, size_t y, size_t z) const; inline T getData(size_t *array) const; //!Retrieve value of the nth voxel inline T getData(size_t i) const { return voxels[i];} void setEntry(size_t n, const T &val) { voxels[n] = val;}; //!Retrieve a reference to the data ata given position //const T &getDataRef(size_t x, size_t y, size_t z) const; //!Set the value of a point in the dataset void setData(size_t x, size_t y, size_t z, const T &val); //!Set the value of nth point in the dataset void setData(size_t n, const T &val); //Obtain an interpolated entry. The interpolated values are obtained by padding void getInterpolatedData(const Point3D &pt, T &v) const; //Perform in-place gaussian smoothing void isotropicGaussianSmooth(float stdev,float windowRatio); //Perform in-place laplacian smoothing void laplaceOfGaussian(float stdev, float windowRatio); //get an interpolated slice from a section of the data void getInterpSlice(size_t normal, float offset, T *p, size_t interpMode=VOX_INTERP_NONE) const; //Get a specific slice, from an integral offset in the data, no interp void getSlice(size_t normal, size_t offset, T *p) const; //!Get the size of the data field void getSize(size_t &x, size_t &y, size_t &z) const; size_t getSize() const {return voxels.size();}; //!Resize the data field /*! This will destroy any data that was already in place * If the data needs to be preserved use "resizeKeepData" * Data will *not* be initialised */ size_t resize(size_t newX, size_t newY, size_t newZ, const Point3D &newMinBound=Point3D(0.0f,0.0f,0.0f), const Point3D &newMaxBound=Point3D(1.0f,1.0f,1.0f)); size_t resize(const Voxels &v); //!Resize the data field, maintaining data as best as possible /*! This will preserve data by resizing as much as possible * about the origin. If the bounds are extended, the "fill" value is used * by default iff doFill is set to true. */ size_t resizeKeepData(size_t newX, size_t newY, size_t newZ, unsigned int direction=CLIP_LOWER_SOUTH_WEST, const Point3D &newMinBound=Point3D(0.0f,0.0f,0.0f), const Point3D &newMaxBound=Point3D(1.0f,1.0f,1.0f), const T &fill=T(0),bool doFill=false); //!DEPRECATED FUNCTION : Get a unique integer that corresponds to the edge index for the voxel; where edges are shared between voxels /*! Each voxel has 12 edges. These are shared (except * voxels that on zero or positive boundary). Return a * unique index that corresponds to a specified edge (0->11). * Index *CANNOT* be inverted to yield cell */ size_t deprecatedGetEdgeUniqueIndex(size_t x, size_t y, size_t z, unsigned int edge) const; //!Get a unique integer that corresponds to an edge index for the voxel; where edges are shared between voxels /*! Each voxel has 12 edges. These are shared (except * voxels that on zero or positive boundary). Return a * NON-unique index that corresponds to a specified edge (0->11) * Index can be inverted to yield cell */ size_t getCellUniqueEdgeIndex(size_t x, size_t y, size_t z, unsigned int edge) const; //!Convert the edge index (as generated by getEdgeUniqueIndex) into a cenre position // returns the axis value so you know edge vector too. // NOte that the value to pass as the edge index is (getEdgeIndex>>2)<<2 to // make the ownership of the voxel correct void getEdgeEnds(size_t edgeIndex,Point3D &a, Point3D &b) const; //!Convert edge index (only as generted by getCellUniqueEdgeIndex) into a cell & axis value void getEdgeCell(size_t edgeUniqId, size_t &x,size_t &y, size_t &z, size_t &axis ) const; //TODO: there is duplicate code between this and getEdgeEnds. Refactor. //!Return the values that are associated with the edge ends, as returned by getEdgeEnds void getEdgeEndApproxVals(size_t edgeUniqId, T &a, T &b ) const; //!Rebin the data by a given rate /*! This will perform a quick and dirty rebin operation, where groups of datablocks * are binned into a single cell. Number of blocks binned is rate^3. Field must be larger than rate * in all directions. Currently only CLIP_NONE is supported. */ void rebin(Voxels &dest, size_t rate, size_t clipMode=CLIP_NONE) const; //!Get the total value of the data field. /*! An "initial value" is provided to provide the definition of a zero value */ T getSum(const T &initialVal=T(0.0)) const; //!count the number of cells with at least this intensity size_t count(const T &minIntensity) const; //!Fill all voxels with a given value void fill(const T &val); //!Get the bounding box vertex (min/max) Point3D getMinBounds() const; Point3D getMaxBounds() const; //Obtain the ounds for a specified axis void getAxisBounds(size_t axis, float &minV, float &maxV) const; ///! Get the spacing for a unit cell Point3D getPitch() const; //!Set the bounding size void setBounds(const Point3D &pMin, const Point3D &pMax); //!Get the bounding size void getBounds(Point3D &pMin, Point3D &pMax) const { pMin=minBound;pMax=maxBound;} //!Initialise the voxel storage size_t init(size_t nX,size_t nY,size_t nZ, const BoundCube &bound); //!Initialise the voxel storage size_t init(size_t nX,size_t nY, size_t nZ); //!Load the voxels from file /*! Format is flat size_ts in column major * return codes: * 1: File open error * 2: Data size error */ size_t loadFile(const char *cpFilename, size_t nX, size_t nY, size_t nZ, bool silent=false); //!Write the voxel objects in column major written out to file /*! Format is flat objects ("T"s) in column major format. * Returns nonzero on failure */ size_t writeFile(const char *cpFilename) const; //!Run convolution over this data, placing the correlation data into "result" /*! * Datasets MUST have the same pitch (spacing) for the result to be defined * template type must have a T(0.0) constructor that intialises it to some "zero" */ size_t convolve(const Voxels &templateVec, Voxels &result, size_t boundMode=BOUND_CLIP) const; //!Similar to convolve, but faster -- only works with separable kernels. //Destroys original data in process. /*! * Datasets MUST have the same pitch (spacing) for the result to be defined * template type must have a T(0.0) constructor that intialises it to some "zero" */ size_t separableConvolve(const Voxels &templateVec, Voxels &result, size_t boundMode=BOUND_CLIP); //!Find the positions of the voxels that are above or below a given value /*! Returns the positions of the voxels' centroids for voxels that have, by default, * a value greater than that of thresh. This behaviour can by reversed to "lesser than" * by setting lowerEq to false */ void thresholdForPosition(std::vector &p, const T &thresh, bool lowerEq=false) const; //!Return the sizeof value for the T type /*! Maybe there is a better way to do this, I don't know */ static size_t sizeofType() { return sizeof(T);}; //!Binarise the data into a result vector /* On thresholding (val > thresh), set the value to "onThresh". * Otherwise set to "offthresh" */ void binarise(Voxels &result,const T &thresh, const T &onThresh, const T &offThresh) const; //!Empty the data /*Remove the data from the voxel set */ void clear() { voxels.reshape(vigra::Shape3(0,0,0));}; //!Find minimum in dataset T min() const; //!Find maximum in dataset T max() const; //!Find both min and max in dataset in the same loop void minMax(T &min, T &max) const; //!Generate a dataset that consists of the counts of points in a given voxel /*! Ensure that the voxel scaling factors * are set by calling ::setBounds() with the * appropriate parameters for your data. * Disabling nowrap allows you to "saturate" your * data field in the case of dense regions, rather * than let wrap-around errors occur */ int countPoints( const std::vector &points, bool noWrap=true, bool doErase=false); //!Integrate the datataset via the trapezoidal method T trapezIntegral() const; //! Convert voxel intensity into voxel density // this is done by dividing each voxel by its volume void calculateDensity(); float getBinVolume() const; //!Element wise division void operator/=(const Voxels &v); void operator/=(const T &v); bool operator==(const Voxels &v) const; size_t size() const { return voxels.size();} }; //!Convert one type of voxel into another by assignment operator template void castVoxels(const Voxels &src, Voxels &dest) { //TODO: Remove me! src=dest; } //!Use one counting type to sum counts in a voxel of given type template void sumVoxels(const Voxels &src, U &counter) { size_t nx,ny,nz; counter=0; src.getSize(nx,ny,nz); size_t nMax=src.size(); for(size_t ui=0; ui Voxels::Voxels() : voxels(), minBound(Point3D(0,0,0)), maxBound(Point3D(1,1,1)) { } template Voxels::~Voxels() { } template void Voxels::clone(Voxels &newVox) const { newVox.binCount[0]=binCount[0]; newVox.binCount[1]=binCount[1]; newVox.binCount[2]=binCount[2]; newVox.voxels=voxels; newVox.minBound=minBound; newVox.maxBound=maxBound; } template void Voxels::setPoint(const Point3D &point,const T &val) { ASSERT(voxels.size()); size_t pos[3]; for(size_t ui=0;ui<3;ui++) pos[ui] = (size_t)round(point[ui]*(float)binCount[ui]); #ifdef DEBUG vigra::Shape3 s= voxels.shape(); ASSERT(pos[0]<=s[0] && pos[1] <= s[1] && pos[2] < s[2]); #endif voxels[vigra::Shape3(pos[0],pos[1],pos[2])] = val; } template void Voxels::setData(size_t x, size_t y, size_t z, const T &val) { ASSERT(voxels.size()); ASSERT( x < binCount[0] && y < binCount[1] && z < binCount[2]); voxels[vigra::Shape3(x,y,z)]=val; } template inline void Voxels::setData(size_t n, const T &val) { ASSERT(voxels.size()); ASSERT(n T Voxels::getPointData(const Point3D &point) const { ASSERT(voxels.size()); size_t pos[3]; Point3D offsetFrac; offsetFrac=point-minBound; for(size_t ui=0;ui<3;ui++) { offsetFrac[ui]/=(maxBound[ui]-minBound[ui]); pos[ui] = (size_t)round(offsetFrac[ui]*(float)binCount[ui]); } return voxels[vigra::Shape3(pos[0],pos[1],pos[2])]; } template Point3D Voxels::getPoint(size_t x, size_t y, size_t z) const { //ASSERT(x < binCount[0] && y Point3D Voxels::getPitch() const { return Point3D((float)1.0/(float)binCount[0]*(maxBound[0]-minBound[0]), (float)1.0/(float)binCount[1]*(maxBound[1]-minBound[1]), (float)1.0/(float)binCount[2]*(maxBound[2]-minBound[2])); } template void Voxels::getSize(size_t &x, size_t &y, size_t &z) const { ASSERT(voxels.size()); x=binCount[0]; y=binCount[1]; z=binCount[2]; } template size_t Voxels::deprecatedGetEdgeUniqueIndex(size_t x,size_t y, size_t z, unsigned int index) const { //This provides a reversible mapping of x,y,z //X aligned edges are first //Y second //Z third //Consider each parallel set of edges (eg all the X aligned edges) //to be the dual grid of the actual grid. From this you can visualise the //cell centres moving -1/2 -/12 units in the direction normal to the edge direction //to produce the centres of the edge. An additional vertex needs to be created at //the end of each dimension not equal to the alignement dim. // ->ASCII ART TIME<- // In each individual cube, the offsets look like this: // ------------7----------- // \ |\ . // |\ | \ . // | 10 | 11 // | \ | \ . // | \ | \ . // | \ --------6-------------| // | | | | // 2 | 3 | | // | | | | // | | | | // | | | | // | 0 | 1 // \-----|----5----------- | // \ | \ | // 8 | 9 | // \ | \ | // \ |---------4------------ // // ^x // z|\ | // \ | // \-->y // switch(index) { //X axis aligned //-- case 0: break; case 1: y++; // one across in Y break; case 2: z++;//One across in Z break; case 3: y++; z++; break; //-- //Y Axis aligned //-- case 4: break; case 5: z++; break; case 6: x++; break; case 7: z++; x++; break; //-- //Z Axis aligned //-- case 8: break; case 9: y++; break; case 10: x++; break; case 11: x++; y++; break; //-- } size_t result = 12*(z + y*(binCount[2]+1) + x*(binCount[2]+1)*(binCount[1]+1)) + index; return result; } /* template size_t Voxels::getEdgeUniqueIndex(size_t x,size_t y, size_t z, unsigned int index) const { //This provides a reversible mapping of x,y,z //X aligned edges are first //Y second //Z third //Consider each parallel set of edges (eg all the X aligned edges) //to be the dual grid of the actual grid. From this you can visualise the //cell centres moving -1/2 -/12 units in the direction normal to the edge direction //to produce the centres of the edge. An additional vertex needs to be created at //the end of each dimension not equal to the alignement dim. // ->ASCII ART TIME<- // In each individual cube, the offsets look like this: // ------------7----------- // \ |\ . // |\ | \ . // | 10 | 11 // | \ | \ . // | \ | \ . // | \ --------6-------------| // | | | | // 2 | 3 | | // | | | | // | | | | // | | | | // | 0 | 1 // \-----|----5----------- | // \ | \ | // 8 | 9 | // \ | \ | // \ |---------4------------ // // ^x // z|\ | // \ | // \-->y // switch(index) { //X axis aligned //-- case 0: break; case 1: y++; // one across in Y break; case 2: z++;//One across in Z break; case 3: y++; z++; break; //-- //Y Axis aligned //-- case 4: break; case 5: z++; break; case 6: x++; break; case 7: z++; x++; break; //-- //Z Axis aligned //-- case 8: break; case 9: y++; break; case 10: x++; break; case 11: x++; y++; break; //-- } unsigned int axis = index/4; size_t result = 3*(z + y*(binCount[2]+1) + x*(binCount[2]+1)*(binCount[1]+1)) + axis; return result; } */ template size_t Voxels::getCellUniqueEdgeIndex(size_t x,size_t y, size_t z, unsigned int index) const { //This provides a reversible mapping of x,y,z //X aligned edges are first //Y second //Z third //Consider each parallel set of edges (eg all the X aligned edges) //to be the dual grid of the actual grid. From this you can visualise the //cell centres moving -1/2 -/12 units in the direction normal to the edge direction //to produce the centres of the edge. An additional vertex needs to be created at //the end of each dimension not equal to the alignement dim. // ->ASCII ART TIME<- // In each individual cube, the offsets look like this: // ------------7----------- // \ |\ . // |\ | \ . // | 10 | 11 // | \ | \ . // | \ | \ . // | \ --------6-------------| // | | | | // 2 | 3 | | // | | | | // | | | | // | | | | // | 0 | 1 // \-----|----5----------- | // \ | \ | // 8 | 9 | // \ | \ | // \ |---------4------------ // // ^x // z|\ | // \ | // \-->y // size_t cellIdx = 12*(z + y*(binCount[2]+1) + x*(binCount[2]+1)*(binCount[1]+1)) ; cellIdx+=index; return cellIdx; } template void Voxels::getEdgeCell(size_t edgeUniqId, size_t &x,size_t &y, size_t &z, size_t &axis ) const { //Invert the mapping generated by the edgeUniqId function //to retrieve the XYZ and axis values //-- axis=(edgeUniqId%12)/4; size_t tmp = edgeUniqId/12; x = tmp/((binCount[2]+1)*(binCount[1]+1)); tmp-=x*((binCount[2]+1)*(binCount[1]+1)); y=tmp/(binCount[2]+1); tmp-=y*(binCount[2]+1); z=tmp; //-- ASSERT(x< binCount[0]+1 && y void Voxels::getEdgeEnds(size_t edgeUniqId, Point3D &a, Point3D &b ) const { size_t x,y,z; size_t axis; getEdgeCell(edgeUniqId,x,y,z,axis); Point3D delta=getPitch(); Point3D cellCentre=getPoint(x,y,z); //Generate ends of edge, as seen in ascii diagram in uniqueID switch(axis) { case 0: //|| x a=cellCentre; b=cellCentre + Point3D(delta[0],0,0); break; case 1: //|| y a=cellCentre; b=cellCentre + Point3D(0,delta[1],0); break; case 2: //|| z a=cellCentre; b=cellCentre + Point3D(0,0,delta[2]); break; default: ASSERT(false); } #ifdef DEBUG BoundCube bc; bc.setBounds(getMinBounds(), getMaxBounds()); bc.expand(sqrtf(std::numeric_limits::epsilon())); ASSERT(bc.containsPt(a) && bc.containsPt(b)); #endif } template void Voxels::getEdgeEndApproxVals(size_t edgeUniqId, T &a, T &b ) const { //TODO: Speed me up? Could not use // other routines to do this access. // I think some redundant calculations are done Point3D ptA,ptB; getEdgeEnds(edgeUniqId,ptA,ptB); size_t x,y,z; getIndex(x,y,z,ptA); a = getPointData(ptA); b=getPointData(ptB); } template void Voxels::getAxisBounds(size_t axis, float &minV, float &maxV ) const { maxV=maxBound[axis]; minV=minBound[axis]; } template size_t Voxels::resize(size_t x, size_t y, size_t z, const Point3D &newMinBound, const Point3D &newMaxBound) { binCount[0] = x; binCount[1] = y; binCount[2] = z; minBound=newMinBound; maxBound=newMaxBound; try { voxels.reshape(vigra::Shape3(x,y,z)); } catch(...) { return 1; } return 0; } template size_t Voxels::resize(const Voxels &oth) { return resize(oth.binCount[0],oth.binCount[1],oth.binCount[2],oth.minBound,oth.maxBound); } template size_t Voxels::resizeKeepData(size_t newX, size_t newY, size_t newZ, unsigned int direction, const Point3D &newMinBound, const Point3D &newMaxBound, const T &fill,bool doFill) { ASSERT(direction==CLIP_LOWER_SOUTH_WEST); Voxels v; if(v.resize(newX,newY,newZ)) return 1; switch(direction) { case CLIP_LOWER_SOUTH_WEST: { minBound=newMinBound; maxBound=newMaxBound; if(doFill) { size_t itStop[3]; itStop[0]=std::min(newX,binCount[0]); itStop[1]=std::min(newY,binCount[1]); itStop[2]=std::min(newZ,binCount[2]); size_t itMax[3]; itMax[0]=std::max(newX,binCount[0]); itMax[1]=std::max(newY,binCount[1]); itMax[2]=std::max(newZ,binCount[2]); //Duplicate into new value, if currently inside bounding box //This logic will be a bit slow, owing to repeated "if"ing, but //it is easy to understand. Other logics would have many more //corner cases bool spin=false; #pragma omp parallel for for(size_t ui=0;ui Point3D Voxels::getMinBounds() const { ASSERT(voxels.size()); return minBound; } template Point3D Voxels::getMaxBounds() const { ASSERT(voxels.size()); return maxBound; } template void Voxels::setBounds(const Point3D &pMin, const Point3D &pMax) { ASSERT(voxels.size()); minBound=pMin; maxBound=pMax; } template size_t Voxels::init(size_t nX, size_t nY, size_t nZ, const BoundCube &bound) { binCount[0]=nX; binCount[1]=nY; binCount[2]=nZ; bound.getBounds(minBound, maxBound); voxels.reshape(vigra::Shape3(nX,nY,nZ)); voxels=0; return 0; } template size_t Voxels::init(size_t nX, size_t nY, size_t nZ) { Point3D pMin(0,0,0), pMax(nX,nY,nZ); return init(nX,nY,nZ,pMin,pMax); } template size_t Voxels::loadFile(const char *cpFilename, size_t nX, size_t nY, size_t nZ , bool silent) { std::ifstream CFile(cpFilename,std::ios::binary); if(!CFile) return VOXELS_BAD_FILE_OPEN; CFile.seekg(0,std::ios::end); size_t fileSize = CFile.tellg(); if(fileSize !=nX*nY*nZ*sizeof(T)) return VOXELS_BAD_FILE_SIZE; resize(nX,nY,nZ,Point3D(nX,nY,nZ)); CFile.seekg(0,std::ios::beg); unsigned int curBufferSize=ITEM_BUFFER_SIZE*sizeof(T); unsigned char *buffer = new unsigned char[curBufferSize]; //Shrink the buffer size by factors of 2 //in the case of small datasets while(fileSize < curBufferSize) curBufferSize = curBufferSize >> 1; //Draw a progress bar if(!silent) { cerr << std::endl << "|"; for(unsigned int ui=0; ui<100; ui++) cerr << "."; cerr << "| 100%" << std::endl << "|"; } unsigned int lastFrac=0; unsigned int ui=0; unsigned int pts=0; do { //Still have data? Keep going while((size_t)CFile.tellg() <= fileSize-curBufferSize) { //Update progress bar if(!silent && ((unsigned int)(((float)CFile.tellg()*100.0f)/(float)fileSize) > lastFrac)) { cerr << "."; pts++; lastFrac=(unsigned int)(((float)CFile.tellg()*100.0f)/(float)fileSize) ; } //Read a chunk from the file CFile.read((char *)buffer,curBufferSize); if(!CFile.good()) return VOXELS_BAD_FILE_READ; //Place the chunk contents into ram for(size_t position=0; position> 1 ; }while(curBufferSize> sizeof(T)); //This does a few extra loops. Not many delete[] buffer; //Fill out the progress bar if(!silent) { while(pts++ <100) cerr << "."; cerr << "| done" << std::endl; } return 0; } template size_t Voxels::writeFile(const char *filename) const { ASSERT(voxels.size()) std::ofstream file(filename, std::ios::binary); if(!file) return 1; for(size_t ui=0; ui T Voxels::getSum(const T &initialValue) const { ASSERT(voxels.size()); T tmp(initialValue); size_t n=voxels.size(); #pragma omp parallel for reduction(+:tmp) for(size_t ui=0;ui T Voxels::trapezIntegral() const { //Compute volume prefactor - volume of cube of each voxel //-- float prefactor=1.0; for(size_t ui=0;ui<3;ui++) { prefactor*=(maxBound[ui]- minBound[ui])/ (float)binCount[ui]; } //-- double accumulation(0.0); //Loop across dataset integrating along z direction #pragma omp parallel for reduction(+:accumulation) for(size_t ui=0;ui size_t Voxels::count(const T &minIntensity) const { size_t bins; bins=binCount[0]*binCount[1]*binCount[2]; size_t sum=0; #pragma omp parallel for reduction(+:sum) for(size_t ui=0;ui=minIntensity) sum++; } return sum; } template void Voxels::swap(Voxels &other) { std::swap(binCount[0],other.binCount[0]); std::swap(binCount[1],other.binCount[1]); std::swap(binCount[2],other.binCount[2]); voxels.swap(other.voxels); std::swap(maxBound,other.maxBound); std::swap(minBound,other.minBound); } template T Voxels::getData(size_t x, size_t y, size_t z) const { ASSERT(x < binCount[0] && y < binCount[1] && z < binCount[2]); return voxels[vigra::Shape3(x,y,z)]; } template void Voxels::thresholdForPosition(std::vector &p, const T &thresh, bool lowerEq) const { p.clear(); if(lowerEq) { #pragma omp parallel for for(size_t ui=0;ui thresh) { #pragma omp critical p.push_back(getPoint(ui,uj,uk)); } } } } } } template void Voxels::binarise(Voxels &result, const T &thresh, const T &onThresh, const T &offThresh) const { result.resize(binCount[0],binCount[1], binCount[2],minBound,maxBound); #pragma omp parallel for for(size_t ui=0;ui<(size_t)binCount[0]; ui++) { for(size_t uj=0;uj T Voxels::min() const { ASSERT(voxels.size()); using namespace vigra::acc; AccumulatorChain > s; extractFeatures(voxels.begin(),voxels.end(),s); return get(s); } template T Voxels::max() const { ASSERT(voxels.size()); using namespace vigra::acc; AccumulatorChain > s; extractFeatures(voxels.begin(),voxels.end(),s); return get(s); } template void Voxels::minMax(T &min, T&max) const { ASSERT(voxels.size()); using namespace vigra::acc; AccumulatorChain > s; extractFeatures(voxels.begin(),voxels.end(),s); min=get(s); max=get(s); } template int Voxels::countPoints( const std::vector &points, bool noWrap, bool doErase) { if(doErase) { fill(0); } size_t x,y,z; for(size_t ui=0; ui getData(x,y,z)) setData(x,y,z,value); } else { setData(x,y,z,value); } } } } return 0; } template void Voxels::calculateDensity() { Point3D size = maxBound - minBound; // calculate the volume of a voxel double volume = 1.0; for (int i = 0; i < 3; i++) volume *= size[i] / binCount[i]; // normalise the voxel value based on volume #pragma omp parallel for for(size_t ui=0; ui float Voxels::getBinVolume() const { Point3D size = maxBound - minBound; double volume = 1.0; for (int i = 0; i < 3; i++) volume *= size[i] / binCount[i]; return volume; } template void Voxels::getIndex(size_t &x, size_t &y, size_t &z, const Point3D &p) const { ASSERT(p[0] >=minBound[0] && p[1] >=minBound[1] && p[2] >=minBound[2] && p[0] <=maxBound[0] && p[1] <=maxBound[1] && p[2] <=maxBound[2]); x=(size_t)((p[0]-minBound[0])/(maxBound[0]-minBound[0])*(float)binCount[0]); y=(size_t)((p[1]-minBound[1])/(maxBound[1]-minBound[1])*(float)binCount[1]); z=(size_t)((p[2]-minBound[2])/(maxBound[2]-minBound[2])*(float)binCount[2]); } template void Voxels::getIndexWithUpper(size_t &x, size_t &y, size_t &z, const Point3D &p) const { //Get the data index as per normal getIndex(x,y,z,p); //but, as a special case, if the index is the same as our bincount, check //to see if it is positioned on an edge if(x==binCount[0] && fabs(p[0] -maxBound[0]) < sqrtf(std::numeric_limits::epsilon())) x--; if(y==binCount[1] && fabs(p[1] -maxBound[1]) < sqrtf(std::numeric_limits::epsilon())) y--; if(z==binCount[2] && fabs(p[2] -maxBound[2]) < sqrtf(std::numeric_limits::epsilon())) z--; } template void Voxels::fill(const T &v) { voxels=v; } //Obtain a slice of the voxel data. Data output will be in column order // p[posB*nA + posA]. Input slice must be sufficiently sized and allocated // to hold the output data template void Voxels::getSlice(size_t normalAxis, size_t offset, T *p) const { ASSERT(normalAxis < 3); size_t dimA,dimB,nA; switch(normalAxis) { case 0: { dimA=1; dimB=2; nA=binCount[dimA]; break; } case 1: { dimA=0; dimB=2; nA=binCount[dimA]; break; } case 2: { dimA=0; dimB=1; nA=binCount[dimA]; break; } default: ASSERT(false); //WTF - how did you get here?? } //We are within bounds, use normal access functions switch(normalAxis) { case 0: { for(size_t ui=0;ui void Voxels::getInterpSlice(size_t normal, float offset, T *p, size_t interpMode) const { ASSERT(offset <=1.0f && offset >=0.0f); //Obtain the appropriately interpolated slice switch(interpMode) { case VOX_INTERP_NONE: { size_t slicePos; slicePos=roundf(offset*binCount[normal]); slicePos=std::min(slicePos,binCount[normal]-1); getSlice(normal,slicePos,p); break; } case VOX_INTERP_LINEAR: { //Find the upper and lower bounds, then // limit them so we don't fall off the end of the dataset size_t sliceUpper,sliceLower; if(binCount[0] == 1) sliceUpper=sliceLower=0; else { sliceUpper=ceilf(offset*binCount[normal]); if(sliceUpper >=binCount[normal]) sliceUpper=binCount[normal]-1; else if(sliceUpper==0) sliceUpper=1; sliceLower=sliceUpper-1; } { T *pLower; size_t numEntries=binCount[(normal+1)%3]*binCount[(normal+2)%3]; pLower = new T[numEntries]; getSlice(normal,sliceLower,pLower); getSlice(normal,sliceUpper,p); //Get the decimal part of the float float integ; float delta=modff(offset*binCount[normal],&integ); for(size_t ui=0;ui void Voxels::getInterpolatedData(const Point3D &p, T &v) const { #ifdef DEBUG BoundCube bc(minBound,maxBound); ASSERT(bc.containsPt(p)); #endif size_t index[3]; getIndex(index[0],index[1],index[2],p); Point3D pitch =getPitch(); //Find the offset to the voxel that we are in. //fraction should be in range [0,1) Point3D fraction = p - (minBound + Point3D(index[0],index[1],index[2])*pitch); fraction =fraction/pitch; size_t iPlus[3]; //0.5 corresponds to voxel centre. for(unsigned int ui=0;ui<3;ui++) { if(index[ui] == (binCount[ui]-1)) iPlus[ui]=0; else iPlus[ui]=1; } float c[2][2]; //Tri-linear interpolation //interpolate data values at cube vertices that surround point. We are coming from below the point // so we are simply extending the field on the upper edge by duplicating values as needed for(unsigned int ui=0;ui<4;ui++) { c[(ui&1)][(ui&2)>>1] = getData( index[0],index[1]+ iPlus[1]*(ui&1),index[2] + iPlus[2]*(ui&2) )*(1-fraction[0]) + getData(index[0]+iPlus[0],index[1]+ iPlus[1]*(ui&1),index[2] + iPlus[2]*(ui&2)); } float c0,c1; c0 = c[0][0]*(1-fraction[1]) + c[1][0]*fraction[1]; c1 = c[0][1]*(1-fraction[1]) + c[1][1]*fraction[1]; v= c0*(1-fraction[2])*c1; } template void Voxels::isotropicGaussianSmooth(float stdev,float windowRatio) { //perform in-place smoothing vigra::ConvolutionOptions<3> opt = vigra::ConvolutionOptions<3>().filterWindowSize(windowRatio); vigra::gaussianSmoothMultiArray(vigra::srcMultiArrayRange(voxels), vigra::destMultiArray(voxels),stdev,opt); } template void Voxels::laplaceOfGaussian(float stdev, float windowRatio) { //perform in-place smoothing vigra::ConvolutionOptions<3> opt = vigra::ConvolutionOptions<3>().filterWindowSize(windowRatio); vigra::laplacianOfGaussianMultiArray(vigra::srcMultiArrayRange(voxels), vigra::destMultiArray(voxels),stdev,opt); } template void Voxels::operator/=(const Voxels &v) { ASSERT(v.voxels.size() == voxels.size()); //don't use the built-in /, this // can generate inf values (which is correct) // that we want to avoid. for(size_t ui=0;ui void Voxels::operator/=(const T &v) { ASSERT(v.voxels.size() == voxels.size()); //don't use the built-in /, this // can generate inf values (which is correct) // that we want to avoid. for(size_t ui=0;ui T(0) ) voxels[ui]/=v; else { voxels[ui]=0; } } } template bool Voxels::operator==(const Voxels &v) const { for(size_t ui=0;ui<3;ui++) { if(v.binCount[ui] != binCount[ui]) return false; } return v.voxels == voxels; } //=== #endif 3Depict-0.0.19/src/common/endianTest.h0000644000175000017500000000337312640746376017033 0ustar pcuserpcuser/* * endianttest.h - Platform endian testing * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _ENDIAN_TEST_H_ #define _ENDIAN_TEST_H_ #if defined (_WIN32) || defined(_WIN64) || defined(__CYGWIN__) #define __LITTLE_ENDIAN__ #else #ifdef __linux__ #include #endif #endif #ifdef __BYTE_ORDER //if both are not defined it is TRUE! #if __BYTE_ORDER == __BIG_ENDIAN #ifndef __BIG_ENDIAN__ #define __BIG_ENDIAN__ #endif #elif __BYTE_ORDER == __LITTLE_ENDIAN #ifndef __LITTLE_ENDIAN__ #define __LITTLE_ENDIAN__ #endif #elif __BYTE_ORDER == __PDP_ENDIAN #ifndef __ARM_ENDIAN__ #define __ARM_ENDIAN__ #endif #else #error "Endian determination failed" #endif #endif const int ENDIAN_TEST=1; //Run-time detection inline int is_bigendian() { return (*(char*)&ENDIAN_TEST) == 0 ;} inline int is_littleendian() { return (*(char*)&ENDIAN_TEST) == 1 ;} inline void floatSwapBytes(float *inFloat) { //Use a union to avoid strict-aliasing error union FloatSwapUnion{ float f; char c[4]; } ; FloatSwapUnion fa,fb; fa.f = *inFloat; fb.c[0] = fa.c[3]; fb.c[1] = fa.c[2]; fb.c[2] = fa.c[1]; fb.c[3] = fa.c[0]; *inFloat=fb.f; } #endif 3Depict-0.0.19/src/common/colourmap.cpp0000644000175000017500000001324012640746376017263 0ustar pcuserpcuser/* * colourmap.cpp - contiuum colourmap header * Copyright (C) 2010, ViewerGTKQt project * Modifed by D Haley 2013 * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "colourmap.h" #include #include "common/translation.h" void jetColorMap(unsigned char *rgb,float value,float min,float max) { float max4=(max-min)/4; value-=min; if (value==HUGE_VAL) { rgb[0]=rgb[1]=rgb[2]=255; } else if (value<0) { rgb[0]=rgb[1]=rgb[2]=0; } else if (value1){ rgb[0]=rgb[1]=rgb[2]=255; return; } rgb[0]=192;rgb[1]=0;rgb[2]=0; rgb[0]+=(unsigned char)(63*value); rgb[1]+=(unsigned char)(255*value); if(value>0.5) rgb[2]+=(unsigned char)(255*2*(value-0.5)); } void negativeColorMap(unsigned char *rgb,float value,float min,float max) { value-=min; max-=min; rgb[0]=0;rgb[1]=0;rgb[2]=0; if(max>std::numeric_limits::epsilon()) value/=max; if(value<0) return; if(value>1){ rgb[1]=rgb[2]=255; return; } rgb[1]+=(unsigned char)(255*value); if(value>0.5) rgb[2]+=(unsigned char)(255*2*(value-0.5)); } void colorMap(unsigned char *rgb,float value,float min,float max) { if(value>0) positiveColorMap(rgb,value,0,max); else negativeColorMap(rgb,value,min,0); } void cyclicColorMap(unsigned char *rgb,float value,float min,float max) { float max3=(max-min)/3; value-=(max-min)*(float)floor((value-min)/(max-min)); if(value * Modifications 2012 D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifdef __cplusplus extern "C" { #endif #include "pngread.h" #include int check_if_png(const char *file_name, FILE **fp, unsigned int bytes_to_check) { char buf[bytes_to_check]; /* Open the prospective PNG file. */ if ((*fp = fopen(file_name, "rb")) == NULL) return 0; /* Read in some of the signature bytes */ if (fread(buf, 1, bytes_to_check, *fp) != bytes_to_check) return 0; /* Compare the first PNG_BYTES_TO_CHECK bytes of the signature. Return nonzero (true) if they match */ return(!png_sig_cmp((png_byte*)buf, (png_size_t)0, bytes_to_check)); } /* Read a PNG file. Returns 0 on success. Must destroy output with * free_pngrowpointers */ int read_png(FILE *fp, unsigned int sig_read, png_bytep **row_pointers, png_uint_32 *width, png_uint_32 *height) /* file is already open */ { png_structp png_ptr; png_infop info_ptr; /* png_uint_32 width, height; */ int bit_depth, color_type, interlace_type; /* Create and initialize the png_struct with the desired error handler * functions. If you want to use the default stderr and longjump method, * you can supply NULL for the last three parameters. We also supply the * the compiler header file version, so that we know if the application * was compiled with a compatible version of the library. REQUIRED */ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (png_ptr == NULL) { fclose(fp); return (-1); } /* Allocate/initialize the memory for image information. REQUIRED. */ info_ptr = png_create_info_struct(png_ptr); if (info_ptr == NULL) { fclose(fp); png_destroy_read_struct(&png_ptr, NULL, NULL); return (-1); } /* Set error handling if you are using the setjmp/longjmp method (this is * the normal method of doing things with libpng). REQUIRED unless you * set up your own error handlers in the png_create_read_struct() earlier. */ if (setjmp(png_jmpbuf(png_ptr))) { /* Free all of the memory associated with the png_ptr and info_ptr */ png_destroy_read_struct(&png_ptr, &info_ptr, NULL); fclose(fp); /* If we get here, we had a problem reading the file */ return (-1); } /* One of the following I/O initialization methods is REQUIRED */ /* Set up the input control if you are using standard C streams */ png_init_io(png_ptr, fp); /* If we have already read some of the signature */ png_set_sig_bytes(png_ptr, sig_read); /* OK, you're doing it the hard way, with the lower-level functions */ /* The call to png_read_info() gives us all of the information from the * PNG file before the first IDAT (image data chunk). REQUIRED */ png_read_info(png_ptr, info_ptr); /* png_get_IHDR pulls useful data out of info_ptr. */ png_get_IHDR(png_ptr, info_ptr, width, height, &bit_depth, &color_type, &interlace_type, NULL, NULL); /* Set up the data transformations you want. Note that these are all * optional. Only call them if you want/need them. Many of the * transformations only work on specific types of images, and many * are mutually exclusive. */ /* tell libpng to strip 16 bit/color files down to 8 bits/color */ if (bit_depth == 16) png_set_strip_16(png_ptr); /* Extract multiple pixels with bit depths of 1, 2, and 4 from a single * byte into separate bytes (useful for paletted and grayscale images). */ if (bit_depth < 8) png_set_packing(png_ptr); /* Expand paletted colors into true RGB triplets */ if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr); /* Expand grayscale images to the full 8 bits from 1, 2, or 4 bits/pixel */ if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) { //From libpng-manual.txt: // // The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9. // ... // The png_set_gray_1_2_4_to_8() function is deprecated. // .. // If you need to support versions prior to libpng-1.5.4 test the version number // as illustrated below using "PNG_LIBPNG_VER >= 10504" #if PNG_LIBPNG_VER >= 10209 png_set_expand_gray_1_2_4_to_8(png_ptr); #else png_set_gray_1_2_4_to_8(png_ptr); #endif } /* Expand paletted or RGB images with transparency to full alpha for RGBA */ if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr); /* Expand grayscale images to RGB */ if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(png_ptr); /* Strip alpha bytes from the input data without combining with the * background (not recommended). png_set_strip_alpha(png_ptr); */ /* Set the background color to draw transparent and alpha images over. * It is possible to set the red, green, and blue components directly * for paletted images instead of supplying a palette index. Note that * even if the PNG file supplies a background, you are not required to * use it - you should use the (solid) application background if it has one. */ /* png_color_16 my_background; */ /*, *image_background; */ /* use black for now */ /* my_background.red = my_background.green = my_background.blue = 0; */ /* if (png_get_bKGD(png_ptr, info_ptr, &image_background)) png_set_background(png_ptr, image_background, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); else */ /* use black by default */ /* png_set_background(png_ptr, &my_background, */ /* PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); */ /* Some suggestions as to how to get a screen gamma value */ /* Note that screen gamma is the display_exponent, which includes * the CRT_exponent and any correction for viewing conditions */ /* this should be user configurable somehow... */ double screen_gamma = 2.2; /* A good guess for a PC monitors in a dimly lit room */ /* screen_gamma = 1.7; or 1.0; */ /* A good guess for Mac systems */ /* Tell libpng to handle the gamma conversion for you. The final call * is a good guess for PC generated images, but it should be configurable * by the user at run time by the user. It is strongly suggested that * your application support gamma correction. * 0.45455 is a "guess" for images with no particular gamma */ int intent; if (png_get_sRGB(png_ptr, info_ptr, &intent)) png_set_gamma(png_ptr, screen_gamma, 0.45455); else { double image_gamma; if (png_get_gAMA(png_ptr, info_ptr, &image_gamma)) png_set_gamma(png_ptr, screen_gamma, image_gamma); else png_set_gamma(png_ptr, screen_gamma, 0.45455); } png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER); /* Optional call to gamma correct and add the background to the palette * and update info structure. REQUIRED if you are expecting libpng to * update the palette for you (ie you selected such a transform above). */ png_read_update_info(png_ptr, info_ptr); /* Allocate the memory to hold the image using the fields of info_ptr. */ /* The easiest way to read the image: */ if (!(*row_pointers = (png_byte**)malloc(*height * sizeof(png_bytep)))) { return (-1); } unsigned int row; for (row = 0; row < *height; row++) { (*row_pointers)[row] = (png_byte*)malloc(png_get_rowbytes(png_ptr,info_ptr)); } /* Read the entire image in one go */ png_read_image(png_ptr, *row_pointers); /* read rest of file, and get additional chunks in info_ptr - REQUIRED */ png_read_end(png_ptr, info_ptr); /* At this point you have read the entire image */ /* clean up after the read, and free any memory allocated - REQUIRED */ png_destroy_read_struct(&png_ptr, &info_ptr, NULL); /* close the file */ fclose(fp); /* that's it */ return (0); } void free_pngrowpointers(png_bytep *row_pointers, png_uint_32 height) { unsigned int row; for (row = 0; row < height; row++) free(row_pointers[row]); //FIXME : Should this be png_free ?? free(row_pointers); } #ifdef __cplusplus }; #endif 3Depict-0.0.19/src/common/stringFuncs.h0000644000175000017500000001224212716174467017235 0ustar pcuserpcuser/* * common/stringFuncs.h - String manipulation header * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef STRINGFUNCS_H #define STRINGFUNCS_H #include #include //generate a semi-random string (not strong random), returns true // if a file that could be opened was found // this is useful for creating temp files bool genRandomFilename(std::string &s,bool timerInitRand=true); //Convert a boolean to "1" or "0" std::string boolStrEnc(bool b); //Convert an input string "0" or "1" into its boolean value. // Whitespace is stripped from either end. If string cannot be understood, returns false bool boolStrDec(const std::string &s,bool &result); void ucharToHexStr(unsigned char c, std::string &s); void hexStrToUChar(const std::string &s, unsigned char &c); //TODO : Eliminate this function. //!Generate string that can be parsed by wxPropertyGrid for combo control //String format is CHOICEID:id1|string 1,id2|string 2,id3|string 3,.....,idN|string_N // where id1->idN are integers std::string choiceString(std::vector > comboString, unsigned int curChoice); //Convert a choice string, such as generated by "choiceString", into a vector of strings void choiceStringToVector(const std::string &str, std::vector &choices, unsigned int &selected); #ifdef DEBUG //!Obtain whether or not the string is a choice string bool isMaybeChoiceString(const std::string &s); #endif //!Generate a string with leading digits up to maxDigit (eg, if maxDigit is 424, and thisDigit is 1 //leading digit will generate the string 001 std::string digitString(unsigned int thisDigit, unsigned int maxDigit); //!Returns Choice from string (see choiceString(...) for string format) std::string getActiveChoice(const std::string &choiceString); //Strip given whitespace (\f,\n,\r,\t,\ )from a string std::string stripWhite(const std::string &str); //Strip specified chars from a string std::string stripChars(const std::string &Str, const char *chars); //!Return a lowercase version for a given string std::string lowercase(std::string s); //!Return a uppercase version for a given string std::string uppercase(std::string s); //Drop empty entries from a string of vector void stripZeroEntries(std::vector &s); //Check to see if a given string is a valid version number string, // consisting of decmials and ints (eg 0.1.2.3.4) bool isVersionNumberString(const std::string &s); //!Retrieve the maximum version string from a list of version strings // version strings are digit and decimal point (.) only std::string getMaxVerStr(const std::vector &verStrings); //!Strip whitespace, (eg tab,space) from either side of a string std::string stripWhite(const std::string &str); //!Split string references using a single delimiter. void splitStrsRef(const char *cpStr, const char delim,std::vector &v ); //!Split string references using any of a given string of delimiters void splitStrsRef(const char *cpStr, const char *delim,std::vector &v ); //!Split the file into three parts, base path, base name and file extension // this splits using "/" and "." under unix, and "\" and "." under windows. // the "." between the basename and the extension is omitted. Trailing slashes in pathname are kept void splitFileData(const std::string &filenameWithPath , std::string &path, std::string &basename, std::string &extension); //!Return only the filename component std::string onlyFilename( const std::string& path ); //!Return only the directory name component of the full path // - do not use with UNC windows paths std::string onlyDir( const std::string& path ); //!Convert a path format into a native path from unix format // - do not use with UNC windows paths std::string convertFileStringToNative(const std::string &s); //!Convert a path format into a unix path from native format std::string convertFileStringToCanonical(const std::string &s); //Print N tabs to a string inline std::string tabs(unsigned int nTabs) { std::string s; s.resize(nTabs); std::fill(s.begin(),s.end(),'\t'); return s; } //Brute force convert a wide STL str to a normal stl str inline std::string stlWStrToStlStr(const std::wstring& s) { std::string temp(s.length(),' '); std::copy(s.begin(), s.end(), temp.begin()); return temp; } //Brute force convert an stlStr to an stl wide str inline std::wstring stlStrToStlWStr(const std::string& s) { std::wstring temp(s.length(),L' '); std::copy(s.begin(), s.end(), temp.begin()); return temp; } #ifdef DEBUG //Run unit tests for string funcs bool testStringFuncs(); #endif #endif 3Depict-0.0.19/src/common/assertion.h0000644000175000017500000000637712716174467016753 0ustar pcuserpcuser/* * common/assertion.h - Program assertion header * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef ASSERTION_H #define ASSERTION_H #ifdef DEBUG #include #include #include //Do we want to trap floating point exceptions void trapfpe (bool doTrap=true); //Do we want to trap floating point exceptions bool getTrapfpe (); //Ask the user about continuing (or not) in the case of an assertion void userAskAssert(const char * const filename, const unsigned int lineNumber); //Warn the programmer about an error detected by a check void warnProgrammer(const char * const filename, const unsigned int lineNumber, const char *message); //Assertion macro. Used to trigger fatal errors in program (debug mode) #ifndef ASSERT #define ASSERT(f) {if(!(f)) { userAskAssert(__FILE__,__LINE__);}} #endif //warn programmer about unusual situation occurrence #ifndef WARN #define WARN(f,g) { if(!(f)) { warnProgrammer(__FILE__,__LINE__,g);}} #endif inline void warnProgrammer(const char * const filename, const unsigned int lineNumber,const char *message) { std::cerr << "Warning to programmer." << std::endl; std::cerr << "Filename: " << filename << std::endl; std::cerr << "Line number: " << lineNumber << std::endl; std::cerr << message << std::endl; } //Debug timing routines #define DEBUG_TIME_START() timeval TIME_DEBUG_t; gettimeofday(&TIME_DEBUG_t,NULL); #define DEBUG_TIME_END() { timeval TIME_DEBUG_tend; gettimeofday(&TIME_DEBUG_tend,NULL); \ std::cerr << (TIME_DEBUG_tend.tv_sec - TIME_DEBUG_t.tv_sec) + ((float)TIME_DEBUG_tend.tv_usec-(float)TIME_DEBUG_t.tv_usec)/1.0e6 << std::endl; } #ifndef TEST #define EQ_TOL(f,g) (fabs( (f) - (g)) < 0.001) #define EQ_TOLV(f,g,h) (fabs( (f) - (g)) < (h)) #define TEST(f,g) if(!(f)) { std::cerr << "Test fail :" << __FILE__ << ":" << __LINE__ << "\t"<< (g) << std::endl;return false;} #endif #define TRACE(f) { timespec timeval; clock_gettime(CLOCK_MONOTONIC, &timeval); std::cerr << "<" << f <<">" __FILE__ << ":" << __LINE__ << " t: " << timeval.tv_sec << "." << timeval.tv_nsec/1000 << endl;} //A hack to generate compile time asserts (thanks Internet). //This causes gcc to give "duplicate case value", if the predicate is false #ifndef HAVE_CPP_1X #define COMPILE_ASSERT(pred) \ { switch(0){case 0:case pred:;}} #else #define COMPILE_ASSERT(pred) {static_assert( pred , "Static assertion failed" );} #endif #else #define ASSERT(f) #define COMPILE_ASSERT(f) #define WARN(f,g) #define TEST(f,g) #define TRACE(f) //Do we want to trap floating point exceptions void trapfpe (bool doTrap=true); #endif #endif 3Depict-0.0.19/src/common/mesh.h0000644000175000017500000002055112640746376015666 0ustar pcuserpcuser/* * Copyright (C) 2015 Daniel Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef MESH_H #define MESH_H #include "common/basics.h" #include "common/mathfuncs.h" #include #include #include //GMSH load constants //----------- //Constants are defined in the GMSH documentation //under section MSH-ASCII-file-format //http://geuz.org/gmsh/doc/texinfo/gmsh.html#MSH-ASCII-file-format const unsigned int ELEM_SINGLE_NODE_POINT=15; const unsigned int ELEM_TWO_NODE_LINE=1; const unsigned int ELEM_THREE_NODE_TRIANGLE=2; const unsigned int ELEM_FOUR_NODE_TETRAHEDRON=4; //----------- extern const char *MESH_LOAD_ERRS[]; enum { ELEMENT_TRIANGLE=1, ELEMENT_TETRAHEDRON=2, ELEMENT_LINE=4, }; class TETRAHEDRON{ public: unsigned int p[4]; unsigned int physGroup; }; class TRIANGLE{ public: unsigned int p[3]; unsigned int physGroup; bool isSane(size_t pLimit=(size_t)-1) const; bool edgesMismatch(const TRIANGLE &tOther) const; }; class LINE{ public: unsigned int p[2]; unsigned int physGroup; }; class Mesh { private: //!Returns true if ui and uj are the same bool sameTriangle(unsigned int ui, unsigned int uj) const; static bool sameTriangle(const TRIANGLE &t1, const TRIANGLE &t2); //!Returns true if the group of triangles are coincident to the nominated triangle bool trianglesCoincident(unsigned int ui, const std::vector &v) const; //!Return true if the specified tet is degenerate (coplanar) bool tetrahedronDegenerate(unsigned int tet) const; //!Return true if a specified point is in the tet. bool pointInTetrahedron(unsigned int tet, const Point3D &p) const; //!Get a list of all disconnected tetrahedra void getDisconnectedTets(std::vector &tetIdx) const; //!Build an adjacency listing for the triangles in the mesh //using vertex sharing rules //i.e. this will retrieve all vector of all triangles who share edge incidence // for a specified vertex, eg: <|> vertex only //incident triangles eg : |>*<| , will be excluded. //The returned map can be used to perform triangle -> surrounding triangle lookups for shared edge // incidence void getTriEdgeAdjacencyMap(std::vector > &map) const; //!Return the normal angle (in rad) between two triangles float normalAngle(size_t triOne,size_t triTwo,bool flip=false ) const; //!Reverse triangle vertex (triTwo) to reverse shared edge to invert implicit normal void flipTriNormalCoherently(size_t triOne, size_t triTwo); //!Kill specified orphan nodes within this dataset void killOrphanNodes(const std::vector &orphans) ; public: //!Point storage for 3D Data (nodes/coords/vertices..) std::vector nodes; //!Physical group storage std::vector physGroupNames; //==== Element Storage ==== //!Storage for node connectivity in tet. form std::vector tetrahedra; //!Storage for node connectivity in triangle form (take in groups of 3) //triangles.size() %3 should always == 0. std::vector triangles; //!Storage for line segments. .size()%2 should always==0 std::vector lines; //! std::vector points; //Returns 0 on OK, nonzero on error. unsigned int loadGmshMesh(const char *meshfile, unsigned int &curLine, bool allowBadMeshes=true); unsigned int saveGmshMesh(const char *meshfile) const; //Return sum of all element sizes (total lines, points, triangles, tets, etc) size_t elementCount() const; //Set the triangle mesh from the following pt triplet, each vector being the same size. // Function will clear any existing data void setTriangleMesh(const std::vector &ptsA, const std::vector &ptsB, const std::vector &ptsC); //!reassign the physical groups to a single number void reassignGroups(unsigned int i); //!Remove exact duplicate triangles void removeDuplicateTris(); //Remove triangles that are not fully connected to mesh (ie have all edges shared) void removeStrayTris(); //Merge vertices that lie within tolerance distance of one another into a single vertex. // note that this can produced degenerate objects in the mesh, if tolerance is large comapred to the smallest element in the mesh void mergeDuplicateVertices(float tolerance); //!Perform various sanity tests on mesh. Should return true if your mesh is sane. //Returning true is not a guarantee of anything however. bool isSane(bool output=false,std::ostream &outStream=std::cerr) const; //!Get the Axis aligned bounding box for this mesh void getBounds(BoundCube &b) const; //!Count the number of unique nodes shared by triangles unsigned int countTriNodes() const; //!Translate mesh around node centroid void translate(); //!Translate mesh to specified position void translate(const Point3f &origin); void translate(const Point3D &origin); //!Scale the mesh around a specified origin void scale(const Point3f &origin, float scalefactor); //!Scale the mesh around a specified origin void scale(const Point3D &origin,float scaleFactor); //!Scale the mesh around origin void scale(float scaleFactor); //!Rotate mesh void rotate(const Point3f &axis, const Point3f &origin, float angle); //!Obtain the volume of the triangulated space // triangles must be correctly oriented, and closed float getVolume() const; //!place triangles over exposed tetrahedral faces void resurface(unsigned int newPhys); //!Clear the mesh void clear(); //!Check to see if the mesh is a single unit of tetrahedra bool isTetFullyConnected(unsigned int &badTet) const; //!Refine the selected tetrahedra using a midpoint division method void refineTetrahedra(std::vector &refineTets); //!Get the line and triangle segments that are connected to a particular tetrahedron void getAttachedComponents(size_t tet, std::vector &tris, std::vector &l) const; //!Return all the nodes that are contained within specified bounding box void getContainedNodes(const BoundCube &b, std::vector &nodes) const; //!Return all primitives that are WHOLLY contained withing bounding box void getIntersectingPrimitives( std::vector &searchNodes, std::vector &lines, std::vector &triangles, std::vector &tetrahedra ) const; unsigned int divideMeshSurface(float divisionAngle, unsigned int newPhysGroupStart, const std::vector &physGroupsToSplit) ; void getCurPhysGroups(std::vector > &curPhys) const; void erasePhysGroup(unsigned int group, unsigned int typeMask); //obtain the number of duplicate vertices in the mesh unsigned int numDupVertices(float tolerance) const; //Obtain the number of duplicate triangles in the mesh unsigned int numDupTris() const; //Print some statistics about the mesh data void print(std::ostream &o) const; //Flip normals in the mesh in order to have coherently oriented normals for all contigous objects. //No guarantee is given as to which surface will be inside and which will be outside. //FIXME: BROKEN void orientTriEdgesCoherently() ; //Returns true if the mesh is coherently oriented bool isOrientedCoherently() const; //!Kill specified orphan nodes within this dataset void killOrphanNodes(); //!Perform vertex weighted relaxation void relax(size_t iterations, float relaxFactor); //Find the poitns that lie inside a this mesh void pointsInside(const std::vector &p, std::vector &meshResults, std::ostream &msgs, bool wantProg) const ; //Find the nearest triangle to a particular point size_t getNearestTri(const Point3D &p,float &distance) const; void getTriNormal(size_t tri, Point3D &normal) const; }; #ifdef DEBUG //Run unit tests for mesh bool meshTests(); #endif #endif 3Depict-0.0.19/src/common/mathfuncs.h0000644000175000017500000002410512716174467016721 0ustar pcuserpcuser/* * mathfuncs.h - General mathematic functions header * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef MATHFUNCS_H #define MATHFUNCS_H #include #include #include #include #include #include "endianTest.h" //!A 3D point data class storage /*! A 3D point data class * contains operator overloads and some basic * mathematical functions */ class Point3D { private: //!Value data float value[3]; public: //!Constructor inline Point3D() {}; //!Constructor with initialising values inline Point3D(float x,float y,float z) { value[0] = x, value[1] = y, value[2] = z;} inline Point3D(float *v) { value[0] = v[0], value[1] = v[1], value[2] = v[2];} inline Point3D(double *v) { value[0] = v[0], value[1] = v[1], value[2] = v[2];} //!Set by value (ith dim 0, 1 2) inline void setValue(unsigned int ui, float val){value[ui]=val;}; //!Set all values inline void setValue(float fX,float fY, float fZ) {value[0]=fX; value[1]=fY; value[2]=fZ;} //!Set by pointer inline void setValueArr(const float *val) { value[0]=*val; value[1]=*(val+1); value[2]=*(val+2); }; //!Get value of ith dim (0, 1, 2) inline float getValue(unsigned int ui) const {return value[ui];}; //Retrieve the internal pointer. Only use if you know why. inline const float *getValueArr() const { return value;}; //!get into an array (note array must hold sizeof(float)*3 bytes of valid mem void copyValueArr(float *value) const; //!Add a point to this, without generating a return value void add(const Point3D &obj); //Convert a point string from its "C" language representation to a point value bool parse(const std::string &str); //!Equality operator bool operator==(const Point3D &pt) const; //!assignment operator const Point3D &operator=(const Point3D &pt); //!+= operator const Point3D &operator+=(const Point3D &pt); //!+= operator const Point3D &operator-=(const Point3D &pt); const Point3D operator+(float f) const; //!multiplication operator const Point3D &operator*=(const float scale); //!Addition operator const Point3D operator+(const Point3D &pt) const; //!elemental multiplication const Point3D operator*(float scale) const; //!multiplication const Point3D operator*(const Point3D &pt) const; //!Division. const Point3D operator/(float scale) const; const Point3D operator/(const Point3D &p) const; //!Subtraction const Point3D operator-(const Point3D &pt) const; //!returns a negative of the existing value const Point3D operator-() const; //!Output streaming operator. Users (x,y,z) as format for output friend std::ostream &operator<<(std::ostream &stream, const Point3D &); //!make point unit magnitude, maintaining direction Point3D normalise(); //!returns the square of distance another pt float sqrDist(const Point3D &pt) const; //!overload for array indexing returns |pt|^2 float sqrMag() const; //!Apply float->float transformation void sqrt() { for(unsigned int ui=0;ui<3;ui++) value[ui]=sqrtf(value[ui]); } //ISO31-11 spherical co-ordinates. theta is clockwise rotation around z- axis. // phi is elevation from x-y plane void sphericalAngles(float &theta, float &phi) const; //!Calculate the dot product of this and another pint float dotProd(const Point3D &pt) const; //!Calculate the cross product of this and another point Point3D crossProd(const Point3D &pt) const; //!Calculate the angle between two position vectors in radiians float angle(const Point3D &pt) const; //Extend the current vector by the specified distance void extend(float distance); //!Retrieve by value float operator[](unsigned int ui) const; //!Retrieve element by referene float &operator[](unsigned int ui) ; //!Is a given point stored inside a box bounded by orign and this pt? /*!returns true if this point is located inside (0,0,0) -> Farpoint * assuming box shape (non zero edges return false) * farPoint must be positive in all dim */ bool insideBox(const Point3D &farPoint) const; //!Tests if this point lies inside the rectangular prism /*!Returns true if this point lies inside the box bounded * by lowPoint and highPoint */ bool insideBox(const Point3D &lowPoint, const Point3D &highPoint) const; //!Makes each value negative of old value void negate(); //Perform a 3x3 matrix transformation. void transform3x3(const float *matrix); //Perform a cross-product based orthogonalisation //with the specified vector bool orthogonalise(const Point3D &p); static Point3D centroid(const Point3D *p, unsigned int n); static Point3D centroid(const std::vector &p); #ifdef __LITTLE_ENDIAN__ //!Flip the endian state for data stored in this point void switchEndian(); #endif }; //IMPORTANT!!! //=============== //Do NOT use multiple instances of this in your code //with the same initialisation technique (e.g. initialising from system clock) //this would be BAD, correlations might well be introduced into your results //that are simply a result of using correlated random sequences!!! (think about it) //use ONE random number generator in the project, initialise it and then "register" //it with any objects that need a random generator. //============== class RandNumGen { private: int ma[56]; int inext,inextp; float gaussSpare; bool haveGaussian; public: RandNumGen(); void initialise(int seedVal); int initTimer(); int genInt(); float genUniformDev(); //This generates a number chosen from //a gaussian distribution range is (-inf, inf) float genGaussDev(); }; //needed for sincos #ifdef __LINUX__ #ifdef __GNUC__ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #endif #endif typedef struct { float a; float b; float c; float d; } Quaternion; typedef struct { float fx; float fy; float fz; } Point3f; //Uses quaternion mathematics to perform a rotation around your favourite axis //IMPORTANT: rotVec must be normalised before passing to this function //failure to do so will have weird results //Note result is stored in point passed as argument //angle is in radians. //Inefficient Point3D version void quat_rot(Point3D &p, const Point3D &r, float angle); void quat_rot(Point3f *point, const Point3f *rotVec, float angle); void quat_rot_array(Point3f *point, unsigned int n, const Point3f *rotVec, float angle); void quat_rot_array(Point3D *point, unsigned int n, const Point3f *rotVec, float angle); //Retrieve the quaternion for repeated rotations. Pass to the quat_rot_apply_quats. //angle is in radians void quat_get_rot_quat(const Point3f *rotVec, float angle, Quaternion *rotQuat); //Use previously generated quats from quat_get_rot_quats to rotate a point void quat_rot_apply_quat(Point3f *point, const Quaternion *rotQuat); //This class implements a Linear Feedback Shift Register (in software) //This is a mathematical construct based upon polynomials over closed natural numbers (N mod p). //This will generate a weakly random digit string, but with guaranteed no duplicates, using O(1) //memory and O(n) calls. The no duplicate guarantee is weak-ish, with no repetition in the //shift register for 2^n-1 iterations. n can be set by setMaskPeriod. class LinearFeedbackShiftReg { size_t lfsr; size_t maskVal; size_t totalMask; public: //Get a value from the shift register, and advance size_t clock(); //Set the internal lfsr state. Note 0 is the lock-up state. void setState(size_t newState) { lfsr=newState;}; //set the mask to use such that the period is 2^n-1. 3 is minimum 60 is maximum void setMaskPeriod(unsigned int newMask); //!Check the validity of the table bool verifyTable(size_t maxLen=0); }; //Determines the volume of a quadrilateral pyramid //input points "planarpts" must be adjacent (connected) by //0 <-> 1 <-> 2 <-> 0, all points connected to apex double pyramidVol(const Point3D *planarPts, const Point3D &apex); //!Inline func for calculating a(dot)b inline float dotProduct(float a1, float a2, float a3, float b1, float b2, float b3) { return a1*b1 + a2*b2 + a3* b3; } inline unsigned int ilog2(unsigned int value) { unsigned int l = 0; while( (value >> l) > 1 ) ++l; return l; } //!Use the TRIAD algorithm to compute the matrix that transforms orthogonal unit vectors // ur1,ur2 to rotated orthogonal unit vectors r1,r2. MUST be orthogonal and unit. // matrix m must be pre-allocated 3x3 matrix void computeRotationMatrix(const Point3D &ur1, const Point3D &ur2, const Point3D &r1, const Point3D &r2, gsl_matrix *m); //Rotate a set of points by the given 3x3 matrix void rotateByMatrix(const std::vector &vpts, const gsl_matrix *m, std::vector &r); #endif 3Depict-0.0.19/src/common/colourmap.h0000644000175000017500000000230312640746376016726 0ustar pcuserpcuser/* * colourmap.h - Colour continumms definitions * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _COLORMAP_H_ #define _COLORMAP_H_ #include const unsigned int NUM_COLOURMAPS=8; //!get colour for specific map /* 0 jetColorMap | 5 colorMap * 1 hotColorMap | 6 blueColorMap * 2 coldColorMap | 7 randColorMap * 3 grayColorMap | * 4 cyclicColorMap | * * returns char in 0->255 range */ void colourMapWrap(unsigned int mapID,unsigned char *rgb, float value, float min,float max,bool reverse); std::string getColourMapName(unsigned int mapID); #endif 3Depict-0.0.19/src/common/xmlHelper.h0000644000175000017500000001023312640746376016666 0ustar pcuserpcuser/* * XMLHelper.h - libXML2 wrapper functions * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef XMLHELPER_H #define XMLHELPER_H //Undefs are because wxwidgets and libxml both define this #ifdef ATTRIBUTE_PRINTF #pragma push_macro("ATTRIBUTE_PRINTF") #include #pragma pop_macro(" ATTRIBUTE_PRINTF") #else #include #undef ATTRIBUTE_PRINTF #endif #include #include "common/basics.h" enum { PROP_PARSE_ERR = 1, PROP_BAD_ATT }; //These functions return nonzero on failure, //zero on success //be warned that the node WILL be modified. //Jump to next element that is of a given type (eg text, node, comment etc) //see EOF for more details. Returns nonzero on error unsigned int XMLHelpNextType(xmlNodePtr &node,int); //Scroll forwards until we reach an element of a given node. return nonzero on error unsigned int XMLHelpFwdToElem(xmlNodePtr &node, const char *nodeName); //Convert a normal string sequence into an XML escaped sequence std::string escapeXML(const std::string &s); //Convert an xml escaped sequence into a normal string sequence std::string unescapeXML(const std::string &s); //!Jump to the next element of the given name and retrieve the value for the specified attrip //returns false on failure //NOTE: Do not use if your value may validly contain whitespace. stream_cast skips these cases template bool XMLGetNextElemAttrib(xmlNodePtr &nodePtr, T &v, const char *nodeName, const char *attrib) { std::string tmpStr; xmlChar *xmlString; //==== if(XMLHelpFwdToElem(nodePtr,nodeName)) return false; xmlString=xmlGetProp(nodePtr,(const xmlChar *)attrib); if(!xmlString) return false; tmpStr=(char *)xmlString; if(stream_cast(v,tmpStr)) { xmlFree(xmlString); return false; } xmlFree(xmlString); return true; } //Returns 0 if successful, non zero if there is a property failure, or if the property is empty template unsigned int XMLHelpGetProp(T &prop,xmlNodePtr node, std::string propName) { xmlChar *xmlString; //grab the xml property xmlString = xmlGetProp(node,(const xmlChar *)propName.c_str()); //Check string contents if(!xmlString) return PROP_PARSE_ERR; if(stream_cast(prop,xmlString)) { xmlFree(xmlString); return PROP_BAD_ATT; } xmlFree(xmlString); return 0; } //Specialisation for std::string, // By default, whitespace is dropped by << operator. Use assignment instead template<> unsigned int XMLHelpGetProp(std::string &prop,xmlNodePtr node, std::string propName); //Returns false on failure //Do not use on validly whitespace containing XML template bool XMLGetAttrib(xmlNodePtr &nodePtr, T&v, const char *attrib) { std::string tmpStr; xmlChar *xmlString; //==== xmlString=xmlGetProp(nodePtr,(const xmlChar *)attrib); if(!xmlString) return false; tmpStr=(char *)xmlString; if(stream_cast(v,tmpStr)) { xmlFree(xmlString); return false; } xmlFree(xmlString); return true; } /* Defined in the bowels of the xmlLib2 library * Enum xmlElementType { * XML_ELEMENT_NODE = 1 * XML_ATTRIBUTE_NODE = 2 * XML_TEXT_NODE = 3 * XML_CDATA_SECTION_NODE = 4 * XML_ENTITY_REF_NODE = 5 * XML_ENTITY_NODE = 6 * XML_PI_NODE = 7 * XML_COMMENT_NODE = 8 * XML_DOCUMENT_NODE = 9 * XML_DOCUMENT_TYPE_NODE = 10 * XML_DOCUMENT_FRAG_NODE = 11 * XML_NOTATION_NODE = 12 * XML_HTML_DOCUMENT_NODE = 13 * XML_DTD_NODE = 14 * XML_ELEMENT_DECL = 15 * XML_ATTRIBUTE_DECL = 16 * XML_ENTITY_DECL = 17 * XML_NAMESPACE_DECL = 18 * XML_XINCLUDE_START = 19 * XML_XINCLUDE_END = 20 * XML_DOCB_DOCUMENT_NODE = 21 * } */ #endif 3Depict-0.0.19/src/common/pngread.h0000644000175000017500000000227712640746376016357 0ustar pcuserpcuser/* * Copyright (C) 2002 Thomas Schumm * Modifications 2013 D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifdef __cplusplus extern "C" { #endif #ifndef PNGREAD_H #define PNGREAD_H #include #ifndef PNG_LIBPNG_VER #error Requires libpng! #endif #if PNG_LIBPNG_VER < 10200 #error Requires libpng version 1.2.0 or greater! #endif int check_if_png(const char*, FILE**, unsigned int); int read_png(FILE*, unsigned int, png_bytep**, png_uint_32*, png_uint_32*); void free_pngrowpointers(png_bytep *row_pointers, png_uint_32 height); #ifdef __cplusplus } #endif #endif 3Depict-0.0.19/src/common/gsl_helper.cpp0000644000175000017500000000206312640746376017407 0ustar pcuserpcuser/* * gsl_helper.cpp - gsl assistance routines * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "gsl_helper.h" #include using std::cerr; using std::endl; void gslPrint(const gsl_matrix *m) { for(unsigned int ui=0;uisize1; ui++) { cerr << "|"; for(unsigned int uj=0; ujsize2; uj++) { cerr << gsl_matrix_get(m,ui,uj); if (uj +1 < m->size2) cerr << ",\t" ; } cerr << "\t|" << endl; } } 3Depict-0.0.19/src/common/mathfuncs.cpp0000644000175000017500000005630412716174467017262 0ustar pcuserpcuser/* * mathfuncs.cpp - Miscellaneous mathematical functions implementation. * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "../config.h" #include "common/basics.h" #include "common/stringFuncs.h" #include #include using std::string; using std::vector; const int MBIG = std::numeric_limits::max(); void Point3D::copyValueArr(float *valArr) const { ASSERT(valArr); //compiler should unroll this automatically for(unsigned int ui=0; ui<3; ui++) { *(valArr+ui) = *(value+ui); } } float Point3D::operator[](unsigned int ui) const { ASSERT(ui < 3); return value[ui]; } float &Point3D::operator[](unsigned int ui) { ASSERT(ui < 3); return value[ui]; } bool Point3D::operator==(const Point3D &pt) const { return (value[0] == pt.value[0] && value[1] == pt.value[1] && value[2] == pt.value[2]); } const Point3D &Point3D::operator=(const Point3D &pt) { value [0] = pt.value[0]; value [1] = pt.value[1]; value [2] = pt.value[2]; return *this; } const Point3D &Point3D::operator+=(const Point3D &pt) { for(unsigned int ui=0;ui<3; ui++) value[ui]+= pt.value[ui]; return *this; } const Point3D &Point3D::operator-=(const Point3D &pt) { for(unsigned int ui=0;ui<3; ui++) value[ui]-= pt.value[ui]; return *this; } const Point3D Point3D::operator+(const Point3D &pt) const { Point3D ptTmp; for(unsigned int ui=0;ui<3; ui++) ptTmp.value[ui] = value[ui] + pt.value[ui]; return ptTmp; } const Point3D Point3D::operator+(float f) const { Point3D pTmp; for(unsigned int ui=0;ui<3; ui++) pTmp.value[ui] = value[ui] + f; return pTmp; } const Point3D Point3D::operator-(const Point3D &pt) const { Point3D ptTmp; for(unsigned int ui=0;ui<3; ui++) ptTmp.value[ui] = value[ui] - pt.value[ui]; return ptTmp; } const Point3D Point3D::operator-() const { Point3D ptTmp; for(unsigned int ui=0;ui<3; ui++) ptTmp.value[ui] = -value[ui]; return ptTmp; } const Point3D &Point3D::operator*=(const float scale) { value[0] = value[0]*scale; value[1] = value[1]*scale; value[2] = value[2]*scale; return *this; } const Point3D Point3D::operator*(float scale) const { Point3D tmpPt; tmpPt.value[0] = value[0]*scale; tmpPt.value[1] = value[1]*scale; tmpPt.value[2] = value[2]*scale; return tmpPt; } const Point3D Point3D::operator*(const Point3D &pt) const { Point3D tmpPt; tmpPt.value[0] = value[0]*pt[0]; tmpPt.value[1] = value[1]*pt[1]; tmpPt.value[2] = value[2]*pt[2]; return tmpPt; } const Point3D Point3D::operator/(float scale) const { Point3D tmpPt; scale = 1.0f/scale; tmpPt.value[0] = value[0]*scale; tmpPt.value[1] = value[1]*scale; tmpPt.value[2] = value[2]*scale; return tmpPt; } const Point3D Point3D::operator/(const Point3D &pt) const { Point3D tmpPt; for(unsigned int ui=0;ui<3;ui++) tmpPt.value[ui] = value[ui]/pt[ui]; return tmpPt; } float Point3D::sqrDist(const Point3D &pt) const { return (pt.value[0]-value[0])*(pt.value[0]-value[0])+ (pt.value[1]-value[1])*(pt.value[1]-value[1])+ (pt.value[2]-value[2])*(pt.value[2]-value[2]); } float Point3D::dotProd(const Point3D &pt) const { //Return the inner product return value[0]*pt.value[0] + value[1]*pt.value[1] + value[2]*pt.value[2]; } Point3D Point3D::crossProd(const Point3D &pt) const { Point3D cross; cross.value[0] = (pt.value[2]*value[1] - pt.value[1]*value[2]); cross.value[1] = -(value[0]*pt.value[2] - pt.value[0]*value[2]); cross.value[2] = (value[0]*pt.value[1] - value[1]*pt.value[0]); return cross; } bool Point3D::insideBox(const Point3D &farPoint) const { return (value[0] < farPoint.value[0] && value[0] >=0) && (value[1] < farPoint.value[1] && value[1] >=0) && (value[2] < farPoint.value[2] && value[2] >=0); } bool Point3D::insideBox(const Point3D &lowPt,const Point3D &highPt) const { return (value[0] < highPt.value[0] && value[0] >=lowPt.value[0]) && (value[1] < highPt.value[1] && value[1] >=lowPt.value[1]) && (value[2] < highPt.value[2] && value[2] >=lowPt.value[2]); } //This is different to +=, because it generates no return value void Point3D::add(const Point3D &obj) { value[0] = obj.value[0] + value[0]; value[1] = obj.value[1] + value[1]; value[2] = obj.value[2] + value[2]; } void Point3D::extend(float distance) { ASSERT(sqrMag() > 0.0f); Point3D p; p=*this; p.normalise(); *this+=p*distance; } float Point3D::sqrMag() const { return value[0]*value[0] + value[1]*value[1] + value[2]*value[2]; } Point3D Point3D::normalise() { float mag = sqrtf(sqrMag()); value[0]/=mag; value[1]/=mag; value[2]/=mag; return *this; } void Point3D::negate() { value[0] = -value[0]; value[1] = -value[1]; value[2] = -value[2]; } float Point3D::angle(const Point3D &pt) const { #ifndef EQ_TOL #define EQ_TOL(f,g) (fabs( (f) - (g)) < sqrtf(std::numeric_limits::epsilon())) #endif //Check for near degenerate case. Acos does not appreciate small arguments in the dot product. if( EQ_TOL(pt.value[0] , value[0]) && EQ_TOL(pt.value[1] , value[1]) && EQ_TOL(pt.value[2] , value[2]) ) return 0; double param = dotProd(pt)/sqrtf(sqrMag()*pt.sqrMag()); //trap the domain - on some systems, there are tolerance problems here if(param > 1.0f || param < -1.0f) return M_PI; else return acos(param); } void Point3D::sphericalAngles(float &theta, float &phi) const { float sqrVal=sqrMag(); theta=acos(value[2]/sqrtf(sqrVal)); //phi phi=atan2(value[1],value[0]); #ifdef DEBUG static bool amRecursing; if(amRecursing) return; amRecursing=true; //Check that the definition of the spherical coordinates matches Point3D retreived(sin(theta)*cos(phi),sin(theta)*sin(phi),cos(theta)); float tmpTheta,tmpPhi; retreived.sphericalAngles(tmpTheta,tmpPhi); ASSERT(EQ_TOL(tmpTheta,theta)); ASSERT(EQ_TOL(tmpPhi,phi)); retreived*=sqrtf(sqrVal); for(unsigned int ui=0;ui<3;ui++) { ASSERT(EQ_TOL(retreived[ui] ,value[ui])); } amRecursing=false; #endif } bool Point3D::orthogonalise(const Point3D &pt) { Point3D crossp; crossp=this->crossProd(pt); //They are co-linear, or near-enough to be not resolvable. if(crossp.sqrMag() < sqrtf(std::numeric_limits::epsilon())) return false; crossp.normalise(); crossp=crossp.crossProd(pt); *this=crossp.normalise()*sqrtf(this->sqrMag()); return true; } Point3D Point3D::centroid(const Point3D *p, unsigned int n) { ASSERT(p); Point3D centroid(0,0,0); /* This code should work, but is not profiled. No caller uses this code at time of writing. #ifdef _OPENMP //Parallel version //-- vector centroids(omp_get_max_threads(),Point3D(0,0,0)); #pragma omp parallel for for(size_t ui=0;ui &p) { Point3D centroid(0,0,0); for(unsigned int ui=0;ui components; const char *NONWHITE_SEPARATOR=",;|_"; splitStrsRef(tmpStr.c_str(),NONWHITE_SEPARATOR, components); if(components.size()!=3) return false; components.clear(); //Now try splitting with whitespace components, dropping empty // strings. As we have already checked the non-whitespace components // additional components must be whitespace only, which is fine. const char *ALLOWABLE_SEPARATORS=",; \t|_"; splitStrsRef(tmpStr.c_str(),ALLOWABLE_SEPARATORS, components); for(size_t ui=0;ui::iterator rmIt; rmIt=std::remove(components.begin(),components.end(),string("")); components.erase(rmIt,components.end()); if(components.size()!=3) return false; float p[3]; for(size_t ui=0;ui<3;ui++) { if(stream_cast(p[ui],components[ui])) return false; } setValueArr(p); return true; } #ifdef __LITTLE_ENDIAN__ void Point3D::switchEndian() { floatSwapBytes(&value[0]); floatSwapBytes(&value[1]); floatSwapBytes(&value[2]); } #endif std::ostream& operator<<(std::ostream &stream, const Point3D &pt) { stream << "(" << pt.value[0] << "," << pt.value[1] << "," << pt.value[2] << ")"; return stream; } void Point3D::transform3x3(const float *matrix) { for(unsigned int ui=0;ui<3;ui++) { value[ui] = value[ui]*matrix[ui*3] + value[ui]*matrix[ui*3+1] + value[ui]*matrix[ui*3+2]; } } RandNumGen::RandNumGen() { //Initialisation is NOT performed here, because we need a random seed //to generate our sequence.... //we don't initially have Gaussian //value to spare haveGaussian=false; } void RandNumGen::initialise(int seed) { long mj,mk; //initialise ma[55] with seed mj=labs((MBIG-labs(seed))); mj%=MBIG; ma[55]=mj; mk=1; //Initialise the rest of the table for(unsigned int i=1; i<55; i++) { int ii; ii=(21*i)%55; ma[ii]=mk; mk=mj-mk; if(mk<0) mk+=MBIG; mj=ma[ii]; } //"warm up" the rng for(unsigned int j=1;j<=4;j++) { for(unsigned int i=1;i<=55;i++) { ma[i] -=ma[1+ (i+30)%55]; if(ma[i] < 0) ma[i]+=MBIG; } } //the constant 31 is special inext=0; inextp=31; } float RandNumGen::genUniformDev() { long mj; if(++inext==56) inext=1; if(++inextp == 56) inextp=1; mj=ma[inext]-ma[inextp]; if(mj<0) mj+=MBIG; ma[inext]=mj; return mj*(1.0/MBIG); } int RandNumGen::genInt() { long mj; if(++inext==56) inext=1; if(++inextp == 56) inextp=1; mj=ma[inext]-ma[inextp]; if(mj<0) mj+=MBIG; ma[inext]=mj; return mj; } //This is known as the Box-Muller transform //You can change it from being a uniform variance //by simply multiplying by the std deviation of your choice //this will cause the random number returned to be stretched //in the x axis from unit variance to your number float RandNumGen::genGaussDev() { float v1,v2,rsq,fac; //This algorithm generates //two Gaussian numbers from two Uniform Devs, //however we only want one. So to speed things up //remember the second and spit it out as required if(haveGaussian) { haveGaussian=false; return gaussSpare; } do { //grab two uniform Devs and //move them into (-1,+1) domain v1=2.0f*genUniformDev()-1.0f; v2=2.0f*genUniformDev()-1.0f; rsq=v1*v1+v2*v2; //reject them if they don't lie in unit circle //or if rsq is at the origin of the unit circle //(as eqn below is undefined at origin) }while(rsq>=1.0f || rsq==0.0f); fac=sqrtf(-2.0f*log(rsq)/rsq); gaussSpare=v1*fac; haveGaussian=true; return v2*fac; } int RandNumGen::initTimer() { timeval tp; gettimeofday(&tp,NULL); initialise(tp.tv_sec+ tp.tv_usec); return tp.tv_sec + tp.tv_usec; } //quaternion multiplication, assuming q2 has no "a" component void quat_mult_no_second_a(Quaternion *result, const Quaternion *q1, const Quaternion *q2) { result->a = (-q1->b*q2->b-q1->c*q2->c -q1->d*q2->d); result->b = (q1->a*q2->b +q1->c*q2->d -q1->d*q2->c); result->c = (q1->a*q2->c -q1->b*q2->d +q1->d*q2->b); result->d = (q1->a*q2->d +q1->b*q2->c -q1->c*q2->b ); } //this is a little optimisation that doesn't calculate the "a" component for //the returned quaternion, and implicitly performs conjugation. //Note that the result is specific to quaternion rotation void quat_pointmult(Point3f *result, const Quaternion *q1, const Quaternion *q2) { result->fx = (-q1->a*q2->b +q1->b*q2->a -q1->c*q2->d +q1->d*q2->c); result->fy = (-q1->a*q2->c +q1->b*q2->d +q1->c*q2->a -q1->d*q2->b); result->fz = (-q1->a*q2->d -q1->b*q2->c +q1->c*q2->b +q1->d*q2->a); } //Inefficient Point3D version void quat_rot(Point3D &p, const Point3D &r, float angle) { Point3f pP,rR; pP.fx =p[0]; pP.fy =p[1]; pP.fz =p[2]; rR.fx =r[0]; rR.fy =r[1]; rR.fz =r[2]; quat_rot(&pP,&rR,angle); p[0] = pP.fx; p[1] =pP.fy; p[2] = pP.fz; } //Uses quaternion mathematics to perform a rotation around your favourite axis //IMPORTANT: Rotvec must be normalised before passing to this function //failure to do so will have weird results. //For better performance on multiple rotations, use other function //Note result is stored in returned point void quat_rot(Point3f *point, const Point3f *rotVec, float angle) { ASSERT(rotVec->fx*rotVec->fx + rotVec->fy*rotVec->fy + rotVec->fz*rotVec->fz - 1.0f < 5.0f*sqrtf(std::numeric_limits::epsilon())); double sinCoeff; Quaternion rotQuat; Quaternion pointQuat; Quaternion temp; //remember this value so we don't recompute it #ifdef _GNU_SOURCE double cosCoeff; //GNU provides sincos which is about twice the speed of sin/cos separately sincos(angle*0.5f,&sinCoeff,&cosCoeff); rotQuat.a=cosCoeff; #else angle*=0.5f; sinCoeff=sin(angle); rotQuat.a = cos(angle); #endif rotQuat.b=sinCoeff*rotVec->fx; rotQuat.c=sinCoeff*rotVec->fy; rotQuat.d=sinCoeff*rotVec->fz; // pointQuat.a =0.0f; This is implied in the pointQuat multiplication function pointQuat.b = point->fx; pointQuat.c = point->fy; pointQuat.d = point->fz; //perform rotation quat_mult_no_second_a(&temp,&rotQuat,&pointQuat); quat_pointmult(point, &temp,&rotQuat); } //TODO: Make as efficient as possible void quat_rot_array(Point3D *pointArr, unsigned int n, const Point3f *rotVec, float angle) { Point3f *fArr; fArr = new Point3f[n]; for(size_t ui=0;uifx*rotVec->fx + rotVec->fy*rotVec->fy + rotVec->fz*rotVec->fz - 1.0f < 5.0f*sqrtf(std::numeric_limits::epsilon())); double sinCoeff; //remember this value so we don't recompute it #ifdef _GNU_SOURCE double cosCoeff; //GNU provides sincos which is about twice the speed of sin/cos separately sincos(angle*0.5f,&sinCoeff,&cosCoeff); rotQuat.a=cosCoeff; #else angle*=0.5f; sinCoeff=sin(angle); rotQuat.a = cos(angle); #endif rotQuat.b=sinCoeff*rotVec->fx; rotQuat.c=sinCoeff*rotVec->fy; rotQuat.d=sinCoeff*rotVec->fz; for(unsigned int ui=0;uifx*rotVec->fx + rotVec->fy*rotVec->fy + rotVec->fz*rotVec->fz - 1.0f < 5.0f*sqrtf(std::numeric_limits::epsilon())); double sinCoeff; #ifdef _GNU_SOURCE double cosCoeff; //GNU provides sincos which is about twice the speed of sin/cos separately sincos(angle*0.5f,&sinCoeff,&cosCoeff); rotQuat->a=cosCoeff; #else angle*=0.5f; sinCoeff=sin(angle); rotQuat->a = cos(angle); #endif rotQuat->b=sinCoeff*rotVec->fx; rotQuat->c=sinCoeff*rotVec->fy; rotQuat->d=sinCoeff*rotVec->fz; } //Use previously generated quats from quat_get_rot_quats to rotate a point void quat_rot_apply_quat(Point3f *point, const Quaternion *rotQuat) { Quaternion pointQuat,temp; // pointQuat.a =0.0f; No need to set this, as we do not use it in the multiplication function pointQuat.b = point->fx; pointQuat.c = point->fy; pointQuat.d = point->fz; //perform rotation quat_mult_no_second_a(&temp,rotQuat,&pointQuat); quat_pointmult(point, &temp,rotQuat); } //For the table to work, we need the sizeof(size_T) at preprocess time #ifndef SIZEOF_SIZE_T #error sizeof(size_t) macro is undefined... At time of writing, this is usually 4 (32 bit) or 8. You can work it out from a simple C++ program which prints out sizeof(size_t). This cant be done automatically due to preprocessor behaviour. #endif //Maximum period linear shift register values (computed by //other program for Galois polynomial) //Unless otherwise noted, all these entries have been verified using the //verifyTable routine. // //If you don't trust me, (who doesn't trust some random person on the internet?) //you can re-run the verification routine. // //Note that verification time *doubles* with every entry, so full 64-bit verification //is computationally intensive. I achieved 40 bits in half a day. 48 bits took over a week. size_t maximumLinearTable[] = { 0x03, 0x06, 0x0C, 0x14, 0x30, 0x60, 0xb8, 0x0110, 0x0240, 0x0500, 0x0e08, 0x1c80, 0x3802, 0x6000, 0xb400, 0x12000, 0x20400, 0x72000, 0x90000, 0x140000, 0x300000, 0x420000, 0xD80000, 0x1200000, 0x3880000, 0x7200000, 0x9000000, 0x14000000, 0x32800000, 0x48000000, #if (SIZEOF_SIZE_T > 4) 0xA3000000, 0x100080000, 0x262000000, 0x500000000, 0x801000000, 0x1940000000, 0x3180000000, 0x4400000000, 0x9C00000000, 0x12000000000, 0x29400000000, 0x63000000000, 0xA6000000000, 0x1B0000000000, 0x20E000000000, 0x420000000000, 0x894000000000, //Maximal linear table entries below line are unverified //Verifying the full table might take a few months of computing time //But who needs to count beyond 2^49-1 (~10^14) anyway?? 0x1008000000000, //Really, there are more entries beyond this, but I consider it pretty much not worth the effort. #endif }; void LinearFeedbackShiftReg::setMaskPeriod(unsigned int newMask) { //Don't fall off the table ASSERT((newMask-3) < sizeof(maximumLinearTable)/sizeof(size_t)); maskVal=maximumLinearTable[newMask-3]; //Set the mask to be all ones totalMask=0; for(size_t ui=0;ui> 1) ^ ( (-(lfsr & (ull)(1u))) & maskVal ); lfsr&=totalMask; if( lfsr == 0u) lfsr=1u; return lfsr; } double det3by3(const double *ptArray) { return (ptArray[0]*(ptArray[4]*ptArray[8] - ptArray[7]*ptArray[5]) - ptArray[1]*(ptArray[3]*ptArray[8] - ptArray[6]*ptArray[5]) + ptArray[2]*(ptArray[3]*ptArray[7] - ptArray[4]*ptArray[6])); } //Determines the volume of a quadrilateral pyramid //input points "planarpts" must be adjacent (connected) by //0 <-> 1 <-> 2 <-> 0, all points connected to apex double pyramidVol(const Point3D *planarPts, const Point3D &apex) { //Array for 3D simplex volumed determination // | (a_x - b_x) (b_x - c_x) (c_x - d_x) | //v_simplex =1/6| (a_y - b_y) (b_y - c_y) (c_y - d_y) | // | (a_z - b_z) (b_z - c_z) (c_z - d_z) | double simplexA[9]; //simplex A (a,b,c,apex) is as follows //a=planarPts[0] b=planarPts[1] c=planarPts[2] simplexA[0] = (double)( (planarPts[0])[0] - (planarPts[1])[0] ); simplexA[1] = (double)( (planarPts[1])[0] - (planarPts[2])[0] ); simplexA[2] = (double)( (planarPts[2])[0] - (apex)[0] ); simplexA[3] = (double)( (planarPts[0])[1] - (planarPts[1])[1] ); simplexA[4] = (double)( (planarPts[1])[1] - (planarPts[2])[1] ); simplexA[5] = (double)( (planarPts[2])[1] - (apex)[1] ); simplexA[6] = (double)( (planarPts[0])[2] - (planarPts[1])[2] ); simplexA[7] = (double)( (planarPts[1])[2] - (planarPts[2])[2] ); simplexA[8] = (double)( (planarPts[2])[2] - (apex)[2] ); return 1.0/6.0 * (fabs(det3by3(simplexA))); } void computeRotationMatrix(const Point3D &ur1, const Point3D &ur2, const Point3D &r1, const Point3D &r2, gsl_matrix *m) { //TRIAD algorithm, for determining rotation matrix from two // linearly independant vector pairs. // This is a specific case of "Wahba's Problem", where no noise is present //unrotated and rotated vectors should be linearly independant ASSERT(ur1.crossProd(ur2).sqrMag() < 0.001); ASSERT(r1.crossProd(r2).sqrMag() < 0.001); //vectors should be pre-normalised // ASSERT(TOL_EQ(ur1.sqrMag(),1) && TOL_EQ(ur2.sqrMag(),1)); // ASSERT(TOL_EQ(r1.sqrMag(),1) && TOL_EQ(r2.sqrMag(),1)); // ASSERT(gsl_matrix_num_rows(m) == 3); // ASSERT(gsl_matrix_num_cols(m) == 3); Point3D rCross,urCross; rCross = r1.crossProd(r2); urCross = ur1.crossProd(r2); gsl_matrix *a,*b; a = gsl_matrix_alloc(3,3); b = gsl_matrix_alloc(3,3); for(unsigned int ui=0;ui<3;ui++) { //build A matrix, row by row gsl_matrix_set(a,ui,0,ur1[ui]); gsl_matrix_set(a,ui,1,ur2[ui]); gsl_matrix_set(a,ui,2,urCross[ui]); //build B^T matrix, row by row gsl_matrix_set(b,0,ui,r1[ui]); gsl_matrix_set(b,1,ui,r2[ui]); gsl_matrix_set(b,2,ui,rCross[ui]); } //Compute m = a*b; gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, a, b, 0.0, m); gsl_matrix_free(a); gsl_matrix_free(b); } void rotateByMatrix(const vector &vpts, const gsl_matrix *m, vector &r) { r.resize(vpts.size()); gsl_vector *v = gsl_vector_alloc(3); gsl_vector *rv = gsl_vector_alloc(3); for(unsigned int ui=0;ui. */ /* * Declaration of flexible 2D arrays * * Usage: * * Array2D name (X-size,Y-size); * Array2D name (X-size,Y-size type ** data); * * creates an array which is valid within the normal C/C++ scope "{ ... }" * * access to elements is a simple as: * * Array2D my_array (10,10); // creates 10x10 array of floats * value = my_array[3][5]; * my_array[4][6]=value; * * or copy an existing 2D array * * float ** mydata; * Array2D my_array (10,10,mydata); * * * Useful extra pointers * * ** my_array gives access to the pointer for access with [][] * * my_array gives access to the flat stored data. * * Advanced usage: * Array2D my_array ; // empty container. * my_array(10,10) ; // resize to 10x10 array * my_array(10,10,ARRAY2D_CLEAR_DATA) ; // resize to 10x10 and clear data * */ #ifndef ARRAY2D_H_ #define ARRAY2D_H_ #include #include template class Array2D { private: unsigned int x, y; T ** ptr; T * data; void ar_realloc(unsigned int w, unsigned int h) { if ((ptr) && ((h > y) || (4 * h < y))) { delete[] ptr; ptr = NULL; } if ((data) && (((h * w) > (x * y)) || ((h * w) < ((x * y) / 4)))) { delete[] data; data = NULL; } if (ptr == NULL) ptr = new T*[h]; if (data == NULL) data = new T[h * w]; x = w; y = h; #pragma omp parallel for for (unsigned int i = 0; i < h; i++) ptr[i] = data + w * i; } public: // use as empty declaration, resize before use! // very useful as a member object Array2D() : x(0), y(0), ptr(NULL), data(NULL) { } // creator type1 Array2D(unsigned int w, unsigned int h) { data = new T[h * w]; x = w; y = h; ptr = new T*[h]; #pragma omp parallel for for (unsigned int i = 0; i < h; i++) ptr[i] = data + i * w; } // creator type 2 Array2D(unsigned int w, unsigned int h, T ** source ) { // when by reference // TODO: improve this code with ar_realloc() data = new T[h * w]; x = w; y = h; ptr = new T*[h]; #pragma omp parallel for for (unsigned int i = 0; i < h; i++) { ptr[i] = data + i * w; for (unsigned int j = 0; j < w; j++) ptr[i][j] = source[i][j]; } } // destructor ~Array2D() { if (data) delete[] data; if (ptr) delete[] ptr; } Array2D(const Array2D &other) { *this=other; } // use with indices T * operator[](unsigned int index) const { ASSERT((index>=0) && (index < y)); return ptr[index]; } // use as pointer to T** operator T**() const { return ptr; } // use as pointer to data operator T*() const { return data; } // useful within init of parent object // or use as resize of 2D array void operator()(unsigned int w, unsigned int h ) { ar_realloc(w,h); } // import from flat data void operator()(unsigned int w, unsigned int h, T* copy) { ar_realloc(w,h); memcpy(data, copy, w * h * sizeof(T)); } unsigned int width() const { return x; } unsigned int height() const { return y; } bool empty() const { return data == NULL; } operator bool() const { return (x > 0 && y > 0); } void resize(unsigned int newX, unsigned int newY) { ar_realloc(newX,newY); } unsigned int size() const { return x*y; } void clear() { delete data; data=NULL; } void unpack(std::vector > &data) const { data.resize(y); #pragma omp parallel for for(unsigned int ui=0;ui & operator=( const Array2D & rhs) { if (this != &rhs) { ar_realloc(rhs.x, rhs.y); // we could have been created from a different // array format where each row is created by 'new' #pragma omp parallel for for (unsigned int i=0;i. */ #ifndef TRANSLATION_H #define TRANSLATION_H #include #if defined(__APPLE__) || defined(__WIN32__) || defined(__WIN64__) #include #endif //!Gettext translation macro #define TRANS(x) (gettext(x)) //!Gettext null-translation macro (mark for translation, but do nothing) #define NTRANS(x) (x) #endif 3Depict-0.0.19/src/common/gsl_helper.h0000644000175000017500000000150612640746376017055 0ustar pcuserpcuser/* * gsl_helper.h - GSL Helper routines * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef GSL_HELPER_H #define GSL_HELPER_H #include void gslPrint(const gsl_matrix *m); #endif 3Depict-0.0.19/src/wx/0000755000175000017500000000000012723200265013704 5ustar pcuserpcuser3Depict-0.0.19/src/wx/propertyGridUpdater.h0000644000175000017500000000316212716174467020116 0ustar pcuserpcuser/* * propertyGridUpdater.h - Update a propertgy grid, using 3depict backend data * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef PROPERTYGRIDUPDATER_H #define PROPERTYGRIDUPDATER_H #include #include "backend/filter.h" #include const long PROPERTY_GRID_STYLE= wxPG_SPLITTER_AUTO_CENTER; const long PROPERTY_GRID_EXTRA_STYLE= wxPG_EX_HELP_AS_TOOLTIPS; //Build a property grid for the // The filter key is stored as a string in the property name, for // each grid item in the property. // Due to a wx bug, the grid cannot contain items and be shown // when passed ot this function // statestring contains the previous grid' state (also part of bug workaround) void updateFilterPropertyGrid(wxPropertyGrid *g, const Filter *f, const std::string &stateString=""); void updateCameraPropertyGrid(wxPropertyGrid *g, const Camera *c); //Convert the property grid value into a 3depict-usable string std::string getPropValueFromEvent(wxPropertyGridEvent &event); #endif 3Depict-0.0.19/src/wx/wxcommon.cpp0000644000175000017500000004114512716174467016304 0ustar pcuserpcuser/* * wxcommon.cpp - Comon wxwidgets functionality * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "wxcommon.h" #include "common/stringFuncs.h" #include "common/constants.h" #include #include #include #include #if defined(WIN32) || defined(WIN64) #include #endif #ifdef __APPLE__ #include "CoreFoundation/CoreFoundation.h" #endif using std::stack; using std::pair; using std::map; using std::make_pair; using std::string; //Auto update checking RSS URL const char *RSS_FEED_LOCATION="http://threedepict.sourceforge.net/rss.xml"; //Auto update event for posting back to main thread upon completion wxEventType RemoteUpdateAvailEvent = wxNewEventType(); // You get to choose the name yourself //Signalling event for main frame that it is completed wxEventType RefreshCompleteEvent= wxNewEventType(); // You get to choose the name yourself //Maximum amount of content in RSS header is 1MB. const unsigned int MAX_RSS_CONTENT_SIZE=1024*1024; //Unlikely text string that can be appended to treepersist const char *PATH_NONCE="%$-"; std::string inputString; std::string locateDataFile(const char *name) { //Current strategies: //Linux: // - Look in cwd & some common hard-coded install locations. //Mac: // - look in bundle //Windows // - Locate a registry key that has the install path, which is preset by // application installer #if defined(WIN32) || defined(WIN64) //This must match the key used in the installer wxRegKey *pRegKey = new wxRegKey(wxT("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\3Depict.exe")); if( pRegKey->Exists() ) { //Now we are talkin. Regkey exists //OK, lets see if this dir actually exists or if we are being lied to (old dead regkey, for example) wxString keyVal; //Get the default key pRegKey->QueryValue(wxT(""),keyVal); //Strip the "3Depict.exe" from the key string std::string s; s = (const char *)keyVal.mb_str(); if(s.size() > 11) { s=s.substr(0,s.size()-11); s+=name; if(wxFileExists((s))) return s; } } std::string s; s =name; if(s.size() && wxFileExists((s))) { return string(name); } else return std::string(""); #elif defined( __linux__) //Possible search paths. Must have trailing slash. will //be searched in sequence. const char *possibleDirs[] = { "./", "/usr/local/share/3Depict/", "/usr/share/3Depict/", "/usr/share/3depict/", //Under debian, we have to use lowercase according to the debian guidelines, so handle this case. "../data/", "./data/" }; const unsigned int NUM_SEARCH_DIRS=THREEDEP_ARRAYSIZE(possibleDirs); std::string s; for(unsigned int ui=0; uiGetRoot()->GetChildren(); while(child) { if(child->GetName() == wxT("channel")) break; child = child->GetNext(); } if(!child) { delete doc; retrieveOK=false; complete=true; wxPostEvent(targetWindow,event); return 0; } std::vector itemStrs; //Spin through all the nodes in the first wxXmlNode *itemNode=child->GetChildren(); while(itemNode) { //OK, we have an item node,lets check its children if(itemNode->GetName() == wxT("item")) { child=itemNode->GetChildren(); while(child) { //OK, we found a child node; if(child->GetName() == wxT("title")) { std::string stlContent; wxString content = child->GetNodeContent(); stlContent=stlStr(content); if(stlContent.size() < MAX_RSS_CONTENT_SIZE && isVersionNumberString(stlContent)) itemStrs.push_back(stlContent); break; } child = child->GetNext(); } } itemNode = itemNode->GetNext(); } delete doc; if(itemStrs.empty()) { //hmm. thats odd. no items. guess we failed :( retrieveOK=false; complete=true; wxPostEvent(targetWindow,event); return 0; } //Find the greatest version number versionStr=getMaxVerStr(itemStrs); retrieveOK=true; complete=true; wxPostEvent(targetWindow,event); return 0; } void wxErrMsg(wxWindow *win, const std::string &title, const std::string &mesg) { wxMessageDialog *wxMesD =new wxMessageDialog(win,(mesg) ,(title),wxOK|wxICON_ERROR); wxMesD->ShowModal(); wxMesD->Destroy(); } //Does a process with a given ID both (1) exist, and (2) match the process name? #if defined(__LINUX__) || defined(__BSD__) bool processMatchesName(size_t processID, const std::string &procName) { //Execute the ps process, then filter the output by processID wxArrayString stdOut; long res; res=wxExecute(wxT("ps ax"),stdOut, wxEXEC_BLOCK); if(res !=0 ) return false; std::string pidStr; stream_cast(pidStr,processID); //Parse stdout.. for(size_t ui=0;ui strVec; s=stripWhite(s); splitStrsRef(s.c_str()," \t",strVec); //Return true if *any* field returns true bool pidFound,procNameFound; procNameFound=pidFound=false; for(unsigned int ui=0;ui typedef long NTSTATUS; #define STATUS_SUCCESS ((NTSTATUS)0x00000000L) #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) typedef enum _SYSTEM_INFORMATION_CLASS { SystemProcessInformation = 5 } SYSTEM_INFORMATION_CLASS; typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING; typedef LONG KPRIORITY; // Thread priority typedef struct _SYSTEM_PROCESS_INFORMATION_DETAILD { ULONG NextEntryOffset; ULONG NumberOfThreads; LARGE_INTEGER SpareLi1; LARGE_INTEGER SpareLi2; LARGE_INTEGER SpareLi3; LARGE_INTEGER CreateTime; LARGE_INTEGER UserTime; LARGE_INTEGER KernelTime; UNICODE_STRING ImageName; KPRIORITY BasePriority; HANDLE UniqueProcessId; ULONG InheritedFromUniqueProcessId; ULONG HandleCount; BYTE Reserved4[4]; PVOID Reserved5[11]; SIZE_T PeakPagefileUsage; SIZE_T PrivatePageCount; LARGE_INTEGER Reserved6[6]; } SYSTEM_PROCESS_INFORMATION_DETAILD, *PSYSTEM_PROCESS_INFORMATION_DETAILD; //Function ptr typedef NTSTATUS (WINAPI *PFN_NT_QUERY_SYSTEM_INFORMATION)( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT OPTIONAL PULONG ReturnLength ); bool processMatchesName(size_t processID, const std::string &procName) { //Construct the memory structures, and load the DLLs needed to grab the win32 api constructs required size_t bufferSize = 102400; PSYSTEM_PROCESS_INFORMATION_DETAILD pspid= (PSYSTEM_PROCESS_INFORMATION_DETAILD) malloc (bufferSize); ULONG ReturnLength; PFN_NT_QUERY_SYSTEM_INFORMATION pfnNtQuerySystemInformation = (PFN_NT_QUERY_SYSTEM_INFORMATION) GetProcAddress (GetModuleHandle(TEXT("ntdll.dll")), "NtQuerySystemInformation"); //Grab the process ID stuff, expanding the buffer until we can do the job we need. while (true) { NTSTATUS status; status = pfnNtQuerySystemInformation (SystemProcessInformation, (PVOID)pspid, bufferSize, &ReturnLength); if (status == STATUS_SUCCESS) break; else if (status != STATUS_INFO_LENGTH_MISMATCH) { // 0xC0000004L return false; // error } bufferSize *= 2; pspid = (PSYSTEM_PROCESS_INFORMATION_DETAILD) realloc ((PVOID)pspid, bufferSize); } PSYSTEM_PROCESS_INFORMATION_DETAILD pspidBase; pspidBase=pspid; //FIXME: Hack. Program name under windows is PROGRAM_NAME + ".exe" const char *EXENAME="3Depict.exe"; //Loop through the linked list of process data structures while( (pspid=(PSYSTEM_PROCESS_INFORMATION_DETAILD)(pspid->NextEntryOffset + (PBYTE)pspid)) && pspid->NextEntryOffset) { //If the name exists, is not null, and its the PID we are looking for if(pspid->ImageName.Length && pspid->ImageName.Buffer && (size_t)pspid->UniqueProcessId == processID ) { //FIXME: I am unsure about the multibyte handling here. I think this *only* works if the program name is within the ASCII region of the codepage wchar_t *name = new wchar_t[pspid->ImageName.Length+1]; sprintf((char*)name,"%ls",pspid->ImageName.Buffer); if(!strcmp(EXENAME,(char*)name)) { delete[] name; free(pspidBase); return true; } delete[] name; } } free(pspidBase); } #endif void copyRGBAtoWXImage(unsigned int width, unsigned int height, const unsigned char *rgbaBuf, wxImage &image, const unsigned char *mask) { //wx image must have an alpha channel ASSERT(image.HasAlpha()); ASSERT(image.GetWidth() == width && image.GetHeight() == height); //FIXME: This will likely be very slow const unsigned char *p=rgbaBuf; for(unsigned int uj=0;ujIsExpanded(t); selected = treeCtrl->IsSelected(t); } TreePersistNode::TreePersistNode() { } void TreePersist::saveTreeExpandState(wxTreeCtrl *treeCtrl) { treeState.clear(); buildPathMapping(treeCtrl, treeState); } //TODO: Limit copy/paste code shared between overloads void TreePersist::buildPathMapping(wxTreeCtrl *treeCtrl,std::map &retMap) { //DFS walker stack for wxwidgets' tree item IDs stack > treeIDs; { wxTreeItemId baseItem; baseItem=treeCtrl->GetRootItem(); //If tree is empty, then baseItem may not be OK if(!baseItem.IsOk()) return; //Start with wx root node treeIDs.push(make_pair("",baseItem)); } //Build the map<> containing the flattened path in the tree // and while(!treeIDs.empty()) { std::string pathStr; wxTreeItemId curItem; pathStr= treeIDs.top().first; curItem = treeIDs.top().second; ASSERT(curItem.IsOk()); treeIDs.pop(); if(treeCtrl->ItemHasChildren(curItem)) { wxTreeItemId tmp; wxTreeItemIdValue token; std::string baseStr; tmp = treeCtrl->GetFirstChild(curItem,token); baseStr = pathStr; //Push all children onto processing stack //similarly, push down the tree<> content while(tmp.IsOk()) { pathStr=baseStr+ string("/") + stlStr(treeCtrl->GetItemText(tmp)); while(retMap.find(pathStr) != retMap.end()) pathStr+=PATH_NONCE; retMap[pathStr]=TreePersistNode(treeCtrl,tmp); treeIDs.push(make_pair(pathStr,tmp)); tmp=treeCtrl->GetNextChild(curItem,token); } } } } void TreePersist::buildPathMapping(wxTreeCtrl *treeCtrl,std::map &retMap) { //DFS walker stack for wxwidgets' tree item IDs stack > treeIDs; //Start with wx root node treeIDs.push(make_pair("",treeCtrl->GetRootItem())); //Build the map<> containing the flattened path in the tree // and while(!treeIDs.empty()) { std::string pathStr; wxTreeItemId curItem; pathStr= treeIDs.top().first; curItem = treeIDs.top().second; treeIDs.pop(); if(treeCtrl->ItemHasChildren(curItem)) { wxTreeItemId tmp; wxTreeItemIdValue token; std::string baseStr; tmp = treeCtrl->GetFirstChild(curItem,token); baseStr = pathStr; //Push all children onto processing stack while(tmp.IsOk()) { wxString s; s=treeCtrl->GetItemText(tmp); pathStr=baseStr+ string("/"); pathStr+=stlStr(s); while(retMap.find(pathStr) != retMap.end()) pathStr+=PATH_NONCE; treeIDs.push(make_pair(pathStr,tmp)); retMap[pathStr] = tmp; tmp=treeCtrl->GetNextChild(curItem,token); } } } } void TreePersist::restoreTreeExpandState(wxTreeCtrl *treeCtrl) const { map treeMap; buildPathMapping(treeCtrl,treeMap); for(map::const_iterator it=treeMap.begin(); it!=treeMap.end(); ++it) { map::const_iterator stateIt; stateIt= treeState.find(it->first); //If the path is found, then restore the item state if(stateIt!=treeState.end()) { if(stateIt->second.expanded) treeCtrl->Expand(it->second); } } } 3Depict-0.0.19/src/wx/wxcomponents.cpp0000644000175000017500000003674212716174467017210 0ustar pcuserpcuser/* * wxcomponents.h - Custom wxWidgets components header * Copyright (C) 2015, D Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "wxcomponents.h" #include "wxcommon.h" #include "common/stringFuncs.h" #include "common/constants.h" #include "common/translation.h" #include #include using std::ofstream; using std::vector; using std::stack; const float FONT_HEADING_SCALEFACTOR=1.25f; void upWxTreeCtrl(const FilterTree &filterTree, wxTreeCtrl *t, std::map &filterMap,vector &persistentFilters, const Filter *visibleFilt) { TreePersist tPersist; tPersist.saveTreeExpandState(t); //Remove any filters that don't exist any more for(unsigned int ui=persistentFilters.size();ui--;) { if(!filterTree.contains(persistentFilters[ui])) { std::swap(persistentFilters[ui],persistentFilters.back()); persistentFilters.pop_back(); } } stack treeIDs; t->Freeze(); //Warning: this generates an event, //most of the time (some windows versions do not according to documentation) t->DeleteAllItems(); //Clear the mapping filterMap.clear(); size_t nextID=0; size_t lastDepth=0; //Add dummy root node. This will be invisible to wxTR_HIDE_ROOT controls wxTreeItemId tid; tid=t->AddRoot(wxT("TreeBase")); t->SetItemData(tid,new wxTreeUint(nextID)); // Push on stack to prevent underflow, but don't keep a copy, // as we will never insert or delete this from the UI treeIDs.push(tid); nextID++; std::map reverseFilterMap; //Depth first add for(tree::pre_order_iterator filtIt=filterTree.depthBegin(); filtIt!=filterTree.depthEnd(); ++filtIt) { //Push or pop the stack to make it match the iterator position if( lastDepth > filterTree.depth(filtIt)) { while(filterTree.depth(filtIt) +1 < treeIDs.size()) treeIDs.pop(); } else if( lastDepth < filterTree.depth(filtIt)) { treeIDs.push(tid); } lastDepth=filterTree.depth(filtIt); //This will use the user label or the type string. tid=t->AppendItem(treeIDs.top(), ((*filtIt)->getUserString())); t->SetItemData(tid,new wxTreeUint(nextID)); //Record mapping to filter for later reference filterMap[nextID]=*filtIt; //Remember the reverse mapping for later in // this function when we reset visibility reverseFilterMap[*filtIt] = tid; nextID++; } //Try to restore the selection in a user friendly manner // - Try restoring all requested filter's visibility // - then restore either the first requested filter as the selection // or the specified parameter filter as the selection. if(persistentFilters.size()) { for(unsigned int ui=0;uiEnsureVisible(reverseFilterMap[persistentFilters[ui]]); if(!visibleFilt) t->SelectItem(reverseFilterMap[persistentFilters[0]]); else t->SelectItem(reverseFilterMap[visibleFilt]); persistentFilters.clear(); } else if(visibleFilt) { ASSERT(reverseFilterMap.find(visibleFilt)!=reverseFilterMap.end()) t->SelectItem(reverseFilterMap[visibleFilt]); } t->GetParent()->Layout(); tPersist.restoreTreeExpandState(t); t->Thaw(); } //Convert my internal choice string format to comma delimited std::string choiceStringToCommaDelim(std::string choiceString) { std::string retStr; bool haveColon=false; bool haveBar=false; for(unsigned int ui=0;uiShowModal() == wxID_CANCEL)) return; std::string dataFile = stlStr(wxF->GetPath()); ofstream f(dataFile.c_str()); if(!f) { wxMessageDialog *wxD =new wxMessageDialog(this, TRANS("Error saving file. Check output dir is writable."),TRANS("Save error"),wxOK|wxICON_ERROR); wxD->ShowModal(); wxD->Destroy(); return; } // Number of rows and cols int rows,cols; rows=GetNumberRows(); cols=GetNumberCols(); // data variable contain text that must be set in the clipboard // For each cell in selected range append the cell value in the data //variable // Tabs '\\t' for cols and '\\r' for rows //print headers for(int c=0; cbr, // so you have to do this first int lastRow=cells[0].GetRow(); int lastCol=cells[0].GetCol(); for(int cell=0; cell lastRow) { lastRow=cells[cell].GetRow(); data+=endline; } data+=stlStr(GetCellValue(cells[cell].GetRow(), cells[cell].GetCol())); if(lastCol < cells[cell].GetCol()) { lastCol=cells[cell].GetCol(); data+="\t"; } } } */ else return; } // Put the data in the clipboard if (wxTheClipboard->Open()) { wxTextDataObject* clipData= new wxTextDataObject; // Set data object value clipData->SetText((data)); wxTheClipboard->UsePrimarySelection(false); wxTheClipboard->SetData(clipData); wxTheClipboard->Close(); } } BEGIN_EVENT_TABLE(TextTreeCtrl, wxTreeCtrl) EVT_PAINT(TextTreeCtrl::OnTreePaint) END_EVENT_TABLE() void TextTreeCtrl::OnTreePaint(wxPaintEvent &event) { //Draws a message in the text control, if the // control is otherwise empty //Call standard handler on exit event.Skip(true); //If there are items in the control, just abort if(GetCount() || messageStrs.empty()) return; //scan for the largest string size_t largestTextSize=0,idx=(size_t)-1; for(size_t ui=0;ui largestTextSize) { largestTextSize=messageStrs[ui].size(); idx=ui; } } if(idx ==(size_t) -1) return; //Check that the string we want fits in the control int w,h; GetClientSize(&w,&h); //Create drawing context wxPaintDC *dc = new wxPaintDC(this); //Set text font wxFont font; font.SetFamily(wxFONTFAMILY_SWISS); if(font.IsOk()) dc->SetFont(font); wxSize textSize=dc->GetTextExtent((messageStrs[idx])); //Don't go ahead with the drawing if the text // won't fit in the control const float HEIGHT_SPACING=1.1; float blockHeight=textSize.GetHeight()*messageStrs.size()*HEIGHT_SPACING; if(textSize.GetWidth() >=w || blockHeight> h) { delete dc; return; } //Draw each text in turn, advancing by spacing // start far enough back so that float startY= 0.5*(h - blockHeight); for(size_t ui=0;uiGetTextExtent((messageStrs[ui])); int startX; startX=w/2 - textSize.GetWidth()/2; #if !(defined(_WIN32) || defined(_WIN64) ) dc->DrawText((messageStrs[ui]), startX,startY); #else dc->DrawTextW((messageStrs[ui]), startX,startY); #endif startY+=HEIGHT_SPACING*textSize.GetHeight(); } delete dc; } std::string TTFFinder::findFont(const char *fontFile) { //Action is OS dependant #ifdef __APPLE__ return macFindFont(fontFile); #elif defined __UNIX_LIKE__ || defined __linux__ return nxFindFont(fontFile); #elif defined __WINDOWS__ return winFindFont(fontFile); #else #error OS not detected in preprocessor series #endif } #ifdef __APPLE__ std::string TTFFinder::macFindFont(const char *fontFile) { //This is a list of possible target dirs to search //(Oh look Ma, I'm autoconf!) const char *dirs[] = { ".", "/Library/Fonts", "" , }; //MUST end with "". wxPathList *p = new wxPathList; unsigned int ui=0; //Try a few standard locations while(strlen(dirs[ui])) { p->Add((dirs[ui])); ui++; }; wxString s; //execute the search for the file s= p->FindValidPath((fontFile)); std::string res; if(s.size()) { if(p->EnsureFileAccessible(s)) res = stlStr(s); } delete p; return res; } #elif defined __UNIX_LIKE__ || defined __linux__ std::string TTFFinder::nxFindFont(const char *fontFile) { //This is a list of possible target dirs to search //(Oh look Ma, I'm autoconf!) const char *dirs[] = { ".", "/usr/share/fonts/truetype", //Old debian "/usr/share/fonts/truetype/freefont", // New debian "/usr/share/fonts/truetype/ttf-dejavu", //New debian "/usr/local/share/fonts/truetype", // User fonts "/usr/X11R6/lib/X11/fonts/truetype", "/usr/X11R6/lib64/X11/fonts/truetype", "/usr/lib/X11/fonts/truetype",// Fedora 32 "/usr/lib64/X11/fonts/truetype", //Fedora 64 "/usr/local/lib/X11/fonts/truetype", // Fedora 32 new "/usr/local/lib64/X11/fonts/truetype",// Fedora 64 new "", }; //MUST end with "". wxPathList *p = new wxPathList; unsigned int ui=0; //Try a few standard locations while(strlen(dirs[ui])) { p->Add((dirs[ui])); ui++; }; wxString s; //execute the search for the file s= p->FindValidPath((fontFile)); std::string res; if(s.size()) { if(p->EnsureFileAccessible(s)) res = stlStr(s); } delete p; return res; } #elif defined __WINDOWS__ std::string TTFFinder::winFindFont(const char *fontFile) { //This is a list of possible target dirs to search //(Oh look Ma, I'm autoconf!) const char *dirs[] = { ".", "C:\\Windows\\Fonts", "", }; //MUST end with "". wxPathList *p = new wxPathList; unsigned int ui=0; //Try a few standard locations while(strlen(dirs[ui])) { p->Add((dirs[ui])); ui++; }; wxString s; //execute the search for the file s= p->FindValidPath((fontFile)); std::string res; if(s.size()) { if(p->EnsureFileAccessible(s)) res = stlStr(s); } delete p; return res; } #endif std::string TTFFinder::suggestFontName(unsigned int fontType, unsigned int index) { //Possible font names const char *sansFontNames[] = { //First fonts are fonts I have a preference for in my app //in my preference order "FreeSans.ttf", "DejaVuSans.ttf", "Arial.ttf", "ArialUnicodeMS.ttf", "NimbusSansL.ttf", "LiberationSans.ttf", "Courier.ttf", //These are simply in semi-alphabetical order //may not even be font names (font families) :) "AkzidenzGrotesk.ttf", "Avenir.ttf", "BankGothic.ttf", "Barmeno.ttf", "Bauhaus.ttf", "BellCentennial.ttf", "BellGothic.ttf", "BenguiatGothic.ttf", "Beteckna.ttf", "Calibri.ttf", "CenturyGothic.ttf", "Charcoal.ttf", "Chicago.ttf", "ClearfaceGothic.ttf", "Clearview.ttf", "Corbel.ttf", "Denmark.ttf", "Droid.ttf", "Eras.ttf", "EspySans.ttf", "Eurocrat.ttf", "Eurostile.ttf", "FFDax.ttf", "FFMeta.ttf", "FranklinGothic.ttf", "Frutiger.ttf", "Futura.ttf", "GillSans.ttf", "Gotham.ttf", "Haettenschweiler.ttf", "HandelGothic.ttf", "Helvetica.ttf", "HelveticaNeue.ttf", "HighwayGothic.ttf", "Hobo.ttf", "Impact.ttf", "Johnston.ttf", "NewJohnston.ttf", "Kabel.ttf", "LucidaGrande.ttf", "Macintosh.ttf", "Microgramma.ttf", "Motorway.ttf", "Myriad.ttf", "NewsGothic.ttf", "Optima.ttf", "Pricedown.ttf", "RailAlphabet.ttf", "ScalaSans.ttf", "SegoeUI.ttf", "Skia.ttf", "Syntax.ttf", "", }; //FIXME: Suggest some font names const char *serifFontNames[] = {""}; //FIXME: Suggest some font names const char *monoFontNames[] = {""}; std::string s; switch(fontType) { case TTFFINDER_FONT_SANS: s = sansFontNames[index]; break; case TTFFINDER_FONT_SERIF: s = serifFontNames[index]; break; case TTFFINDER_FONT_MONO: s = monoFontNames[index]; break; } return s; } std::string TTFFinder::getBestFontFile(unsigned int type) { unsigned int index=0; std::string s; do { s=suggestFontName(type,index); if(s.size()) { index++; s=findFont(s.c_str()); if(s.size()) { return s; } } else return s; } while(true); ASSERT(false); return s; } 3Depict-0.0.19/src/wx/propertyGridUpdater.cpp0000644000175000017500000001621212640746376020451 0ustar pcuserpcuser/* * propertyGridUpdater.cpp - Update a propertgy grid, using 3depict backend data * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "propertyGridUpdater.h" #include "wxcommon.h" #include "common/stringFuncs.h" #include "common/basics.h" //For colour property #include //workaround for decimal separator bug #include #include #include using std::vector; using std::string; void updateFilterPropertyGrid(wxPropertyGrid *g, const Filter *f, const string &stateString) { ASSERT(f); ASSERT(g); FilterPropGroup p; f->getProperties(p); #ifdef DEBUG //If debugging, test self consistency p.checkConsistent(); #endif g->Clear(); //Create the keys to add to the grid for(size_t ui=0;ui propGrouping; p.getGroup(ui,propGrouping); std::string title; p.getGroupTitle(ui,title); //Title must be present, or restorestate doesn't work correctly ASSERT(!title.empty()); //Set the name that is to be displayed for this grouping // of properties g->Append(new wxPropertyCategory(string("") + title,title)); //Set the children of this property for(size_t uj=0;uj choices; unsigned int selected; choiceStringToVector(fp.data,choices,selected); wxPGChoices pgChoices; for(unsigned int ui=0;uiSetAttribute(wxPG_FILE_WILDCARD,fp.dataSecondary); break; } case PROPERTY_TYPE_DIR: { pgp = new wxDirProperty(fp.name,keyStr,fp.data); break; } } //Set the tooltip pgp->SetHelpString(fp.helpText); //add the property to the grid g->Append(pgp); switch(fp.type) { case PROPERTY_TYPE_BOOL: { //if a bool property, use a checkbox to edit g->SetPropertyEditor(pgp,wxPGEditor_CheckBox); break; } default: ; } } } //Restore the selected property, if possible if(stateString.size()) g->RestoreEditableState(stateString); } void updateCameraPropertyGrid(wxPropertyGrid *g, const Camera *c) { ASSERT(c); ASSERT(g); g->Clear(); //Obtain the properties of the currently active camera CameraProperties p; c->getProperties(p); for(unsigned int ui=0;ui choices; unsigned int selected; choiceStringToVector(camProp.data,choices,selected); wxPGChoices pgChoices; for(unsigned int ui=0;uiAppend(pgp); switch(camProp.type) { case PROPERTY_TYPE_BOOL: { g->SetPropertyEditor(pgp,wxPGEditor_CheckBox); break; } default: ; } } } } std::string getPropValueFromEvent(wxPropertyGridEvent &event) { std::string newValue; std::string eventType; eventType=event.GetValue().GetType(); if(eventType == "wxColour") { wxColour col; col << event.GetValue(); //Convert the colour to a string, so we can // send it to the backend. ColourRGBA rgba(col.Red(),col.Green(),col.Blue()); newValue=rgba.rgbString(); } else if (eventType == "long") { //So wx is a bit confused here // we can either be an integer property, OR // we can be an enum property. //integer property wxLongLong ll; ll=event.GetValue().GetLong(); const wxPGChoices &choices = event.GetProperty()->GetChoices(); if(!choices.IsOk()) { stream_cast(newValue,ll); } else { //So wx makes life hard here. We need to do a dance to get the selection // as a string unsigned int ul; ul=ll.ToLong(); wxArrayString arrStr; arrStr=choices.GetLabels(); newValue=arrStr[ul]; } } else { newValue = event.GetValue().GetString(); } return newValue; } 3Depict-0.0.19/src/wx/wxcomponents.h0000644000175000017500000001150112640746376016637 0ustar pcuserpcuser/* * wxcomponents.h - custom wxwidgets components * Copyright (C) 2015, D. Haley * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef WXCOMPONENTS_H #define WXCOMPONENTS_H #include #include #include #include #include #include "backend/filtertree.h" //!3D combo grid renderer, from //http://nomadsync.cvs.sourceforge.net/nomadsync/nomadsync/src/EzGrid.cpp?view=markup (GPL) class wxGridCellChoiceRenderer : public wxGridCellStringRenderer { public: wxGridCellChoiceRenderer(wxLayoutAlignment border = wxLAYOUT_NONE) : m_border(border) {} virtual void Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, const wxRect& rect, int row, int col, bool isSelected); virtual wxGridCellRenderer *Clone() const { return new wxGridCellChoiceRenderer; } private: wxLayoutAlignment m_border; }; class wxFastComboEditor : public wxGridCellChoiceEditor { public: wxFastComboEditor(const wxArrayString choices, bool allowOthers = FALSE) : wxGridCellChoiceEditor(choices, allowOthers), m_pointActivate(-1,-1) { SetClientData((void*)&m_pointActivate); } virtual void BeginEdit(int row, int col, wxGrid* grid); protected: wxPoint m_pointActivate; }; //!Update a wxTree control to layout according to the specified filter tree void upWxTreeCtrl(const FilterTree &filterTree, wxTreeCtrl *t, std::map &filterMap,std::vector &persistentFilters, const Filter *visibleFilt); //Subclassed wx tree ctrl to draw text in tree when empty class TextTreeCtrl : public wxTreeCtrl { private: std::vector messageStrs; public: TextTreeCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTR_HAS_BUTTONS, const wxValidator& validator = wxDefaultValidator, const wxString& name = _("treeCtrl")) : wxTreeCtrl(parent,id,pos,size,style,validator,name) {}; virtual void OnTreePaint(wxPaintEvent &evt); void setMessages(const std::vector &msgs) { messageStrs=msgs;} DECLARE_EVENT_TABLE() }; //!Data container for tree object data class wxTreeUint : public wxTreeItemData { public: wxTreeUint(unsigned int v) : value(v) {}; unsigned int value; }; //!Data container for wxWidgets list object data class wxListUint : public wxClientData { public: wxListUint(unsigned int v) { value=v;}; unsigned int value; }; //A wx Grid with copy & paste support class CopyGrid : public wxGrid { public: CopyGrid(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxWANTS_CHARS, const wxString& name = wxPanelNameStr); void currentCell(); void selectData(); //!Copy data to the clipboard void copyData(); //!Prompts user to save data to file, and then saves it. pops up error // dialog box if there is a problem. Data is tab deliminated void saveData(); virtual void OnKey(wxKeyEvent &evt); virtual ~CopyGrid(){}; DECLARE_EVENT_TABLE() }; //Type IDs for TTFFinder::suggestFontName enum { TTFFINDER_FONT_SANS, TTFFINDER_FONT_SERIF, TTFFINDER_FONT_MONO }; //A class to determine ttf file locations, in a best effort fashion class TTFFinder { private: //*n?x (FHS compliant) searching static std::string nxFindFont(const char *fontFile); //MS win. searching static std::string winFindFont(const char *fontFile); //Mac OS X searching static std::string macFindFont(const char *fontFile); public: //Given a ttf file name, search for it in several common paths static std::string findFont(const char *fontFile); //!Given an font type (Sans, serif etc) suggest a font name. //As long as function does not return empty std::string,, then index+1 is a valid //query (which may return empty std::string). Font names returned are a suggestion //only. Pass to findFont to confirm that a font file exists. static std::string suggestFontName(unsigned int fontType, unsigned int index) ; //!Returns a valid file that points to an installed ttf file, or an empty string //NOTE: TTF file is not checked for content validity! static std::string getBestFontFile(unsigned int type); }; #endif 3Depict-0.0.19/src/wx/wxcommon.h0000644000175000017500000001327212640746376015751 0ustar pcuserpcuser/* * wxcommon.h - Common wxwidgets header stuff * Copyright (C) 2015 D Haley * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef WXCOMMON_H #define WXCOMMON_H #include #include #include #include #include "common/basics.h" #include "backend/tree.hh" //This function is adapted from //http://www.creatis.insa-lyon.fr/software/public/creatools/bbtk/v0_9_2/doc/doxygen/bbtk/bbtkWx_8h-source.html //Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux //Used under CeCILLB licence, limited liability and no warranty by authors. //http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html //This licence is compatible with GPL licence used in 3Depict. inline std::string stlStr(const wxString& s){ std::string s2; if(s.wxString::IsAscii()) { s2=s.wxString::ToAscii(); } else { const wxWX2MBbuf tmp_buf = wxConvCurrent->cWX2MB(s); const char *tmp_str = (const char*) tmp_buf; s2=std::string(tmp_str, strlen(tmp_str)); } return s2; } //-------- //Perform validation of a wx text control, adjusting appearance as needed // can pass an additional constraint function that needs to be satisfied (return true) // in order for validation to succeed template bool validateTextAsStream(wxTextCtrl *t, T &i, bool (*conditionFunc)(const T&)) { bool isOK; std::string s; s= stlStr(t->GetValue()); //string cannot be empty bool condition; condition = s.empty() || stream_cast(i,s); if(condition && conditionFunc) condition&=(*conditionFunc)(i); if(condition) { //OK, so bad things happened. Prevent the user from doing this isOK=false; //if it is bad and non-empty, highlight it as such // if it is empty, then just set it to normal colour if(s.empty()) t->SetBackgroundColour(wxNullColour); else t->SetBackgroundColour(*wxCYAN); } else { t->SetBackgroundColour(wxNullColour); isOK=true; } return isOK; } template bool validateTextAsStream(wxTextCtrl *t, T &i) { bool isOK; std::string s; s= stlStr(t->GetValue()); //string cannot be empty bool condition; condition = s.empty() || stream_cast(i,s); if(condition) { //OK, so bad things happened. Prevent the user from doing this isOK=false; //if it is bad and non-empty, highlight it as such // if it is empty, then just set it to normal colour if(s.empty()) t->SetBackgroundColour(wxNullColour); else t->SetBackgroundColour(*wxCYAN); } else { t->SetBackgroundColour(wxNullColour); isOK=true; } return isOK; } //-------- void wxErrMsg(wxWindow *, const std::string &title, const std::string &mesg); //locate the file we are looking for in OS specific paths. Returns empty string if file cannot be found std::string locateDataFile(const char *name); //Custom event for remote update thread posting extern wxEventType RemoteUpdateAvailEvent; //Custom event for signalling that a refresh is completed extern wxEventType RefreshCompleteEvent; //Return true IFF process ID and process name match running process bool processMatchesName(size_t processID, const std::string &procName); //Copy data into a wx image from an unpadded RGBA block of given width/eight // image sould already have been initialised, with RGBA and size void copyRGBAtoWXImage(unsigned int width, unsigned int height, const unsigned char *rgbaBuf, wxImage &image, const unsigned char *mask); //Combine an overlay using the alpha channel void combineWxImage(wxImage &base, const wxImage &overlay); //!Remote version thread checker, downloads RSS file from remote system and then // parses the file for the latest remote version number class VersionCheckThread : public wxThread { private: bool complete; bool retrieveOK; std::string versionStr; //Window to post event to upon completion wxWindow *targetWindow; wxURL url; public: VersionCheckThread(wxWindow *target); //!Used internally by wxwidgets to launch thread void *Entry(); //Returns true upon completion of thread. bool isComplete() const { return complete; } //Returns true if version string was retrieved successfully bool isRetrieveOK() const { return retrieveOK; } //Return the maximal version string obtained from the remote RSS feed std::string getVerStr() { return versionStr; } }; //!storage node of tree persistence // - tree persistence means the state for // a tree in terms of expanded and not-expanded items class TreePersistNode { public: bool expanded,selected; //Contructor for node persistence TreePersistNode(); TreePersistNode(const wxTreeCtrl *ctrl,wxTreeItemId t); }; //!storage helper class for tree persistence // persistence - expanded and not-expanded items class TreePersist { private: std::map treeState; //Build path mapping for persistance node static void buildPathMapping(wxTreeCtrl *t, std::map &retMap); //Build path mapping for wx tree items static void buildPathMapping(wxTreeCtrl *t, std::map &retMap); public: //TODO: Const correctness void saveTreeExpandState(wxTreeCtrl *treeCtrl); void restoreTreeExpandState(wxTreeCtrl *treeCtrl) const; }; #endif 3Depict-0.0.19/src/winconsole.h0000644000175000017500000000223512640746376015621 0ustar pcuserpcuser/* * winconsole.h - Windows console debugging header * Copyright (C) 2010, William W. * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ // winconsole.h #ifndef __CONSOLE_H__ #define __CONSOLE_H__ #include #if defined(__WIN32) || defined(__WIN64) class winconsole { private: std::ofstream m_out; std::ofstream m_err; std::ifstream m_in; std::streambuf* m_old_cout; std::streambuf* m_old_cerr; std::streambuf* m_old_cin; public: winconsole(); ~winconsole(); void hide(); void show(); }; #endif #endif 3Depict-0.0.19/data/0000755000175000017500000000000012723200271013365 5ustar pcuserpcuser3Depict-0.0.19/data/startup-tips.txt0000644000175000017500000000455512723162674016634 0ustar pcuserpcuser#This is the startup tips file that is passed to wxTipProvider, to generate the startup tips dialog # each tip must be of the form _("some tip") # wx docs say : blank lines, and lines starting with # are skipped _("You can reset the main view by tapping the space bar. Hold down modifier keys like shift,ctrl to change the axis. Double tap to switch which axis to look down") _("You can delete filters from the tree by selecting them, then tapping delete?") _("Multiple languages are supported? You can translate the program into your own language at https://www.transifex.com/projects/p/3depict/") _("Package files can be easily shared to allow others to view your analysis, using the File->Export->Package menu item") _("You can export plots to SVG \"Vector\" format, for easier editing - edit your plots in inkscape!") _("You can access the manual from the Help menu") _("You can change filter defaults using the Edit->Preferences menu item") _("You can overlay multiple plots at once, by selecting more than on plot at a time (e.g. using Ctrl)") _("Calculations are much faster (more than linear speedup) when working with smaller datasets - try sampling, or clipping out a small region to work faster, then remove the sampling when you are ready") _("You can abort most calculations either by pressing Escape (OSX/Linux), or by using the Abort button (Windows)") _("That anyone can contribute to improving this program, even without knowing about computer programming?") _("You can load more than one file at a time, then either operate on the separately, or together") _("You can have more than one range file for different parts of your dataset") _("Cameras can be saved and retrieved whenever you like, using the camera tab") _("Subsections of the filter tree can be saved to the \"Stashed filters\" drop-down") _("The console tab along the bottom often shows useful messages from filters. When new messages appear, a small symbol is shown on the tab") _("The raw data used for any plot can be accessed from the \"Raw\" tab on the bottom panel") _("You can ask questions about the program, or using it on your data on our forums (https://sourceforge.net/p/threedepict/discussion/general/)") _("By creating a camera, you can switch between orthographic and perspective views") _("You can open multiple files at once, and get a side-by-side view by translating (shifting) one of the datasets to one side") 3Depict-0.0.19/data/atomic-mass-table.dtd0000644000175000017500000000453212640746376017413 0ustar pcuserpcuser 3Depict-0.0.19/data/naturalAbundance.xml0000644000175000017500000016175012640746376017413 0ustar pcuserpcuser 3Depict-0.0.19/data/3Depict.xpm0000644000175000017500000001350012640746376015430 0ustar pcuserpcuser/* XPM */ static const char *_Depict[] = { /* columns rows colors chars-per-pixel */ "32 32 229 2", " c #5D251D", ". c #602C26", "X c #6B2D25", "o c #752D24", "O c #7E2F25", "+ c #65322C", "@ c #73342C", "# c #653934", "$ c #613E39", "% c #773A32", "& c #35410F", "* c #056933", "= c #10723D", "- c #615926", "; c #61423E", ": c #60602B", "> c #29385D", ", c #1B1B7F", "< c #2E1E62", "1 c #012370", "2 c #163A75", "3 c #2B2B75", "4 c #23237A", "5 c #353570", "6 c #3A3A72", "7 c #5D234B", "8 c #64264C", "9 c #622751", "0 c #431B66", "q c #482677", "w c #57367C", "e c #67376B", "r c #014D4D", "t c #094B54", "y c #004D5E", "u c #21447A", "i c #306D69", "p c #64524D", "a c #87342A", "s c #893429", "d c #91362B", "f c #97382E", "g c #9A392D", "h c #843D35", "j c #883B32", "k c #913E34", "l c #993B30", "z c #A23C2F", "x c #A23C30", "c c #8D4239", "v c #9D453B", "b c #9C493F", "n c #AD4034", "m c #B04134", "M c #853140", "N c #843749", "B c #993944", "V c #864D47", "C c #9B574F", "Z c #90475A", "A c #935F59", "S c #A5574D", "D c #AC584F", "F c #B8594D", "G c #A95C53", "H c #B65952", "J c #856741", "K c #B9665C", "L c #9E736D", "P c #B56E66", "I c #BC6A62", "U c #BD766E", "Y c #A67F7A", "T c #B17A74", "R c #BB7A73", "E c #C05E51", "W c #C16D63", "Q c #C37D75", "! c #038103", "~ c #008B00", "^ c #088108", "/ c #0B8D0C", "( c #019301", ") c #009E00", "_ c #0B9E0B", "` c #00871F", "' c #108710", "] c #138913", "[ c #188C18", "{ c #159215", "} c #1E9515", "| c #25951D", " . c #02A402", ".. c #01AA01", "X. c #01B101", "o. c #00BA00", "O. c #00B60A", "+. c #0AB40A", "@. c #00AB14", "#. c #00A61B", "$. c #19A619", "%. c #00B417", "&. c #14B314", "*. c #1FB31F", "=. c #1CBA1C", "-. c #21A11C", ";. c #1CA62B", ":. c #27AC27", ">. c #23B223", ",. c #26BC26", "<. c #23A630", "1. c #3AAD3A", "2. c #00C100", "3. c #00C900", "4. c #00CC0D", "5. c #00D100", "6. c #00D900", "7. c #00E200", "8. c #00EB00", "9. c #00F200", "0. c #2AC12A", "q. c #29CA29", "w. c #33CC33", "e. c #3BA74C", "r. c #4BB54B", "t. c #5BBE64", "y. c #44C544", "u. c #50C850", "i. c #50D851", "p. c #62CF62", "a. c #62D161", "s. c #6BDB6B", "d. c #7BCD7B", "f. c #74D474", "g. c #7EDD7E", "h. c #04058D", "j. c #000F8F", "k. c #150C89", "l. c #001184", "z. c #001E82", "x. c #151586", "c. c #010195", "v. c #000B90", "b. c #05059F", "n. c #0B0B9D", "m. c #0D1790", "M. c #141491", "N. c #21158C", "B. c #271F97", "V. c #211C9F", "C. c #263D8E", "Z. c #0202A4", "A. c #0A0AA6", "S. c #0303AC", "D. c #0D0BAB", "F. c #1313AE", "G. c #1D1DAF", "H. c #0101B2", "J. c #0E0EB0", "K. c #0000BB", "L. c #1617B1", "P. c #1E1DB4", "I. c #1C1BBC", "U. c #2121AE", "Y. c #2D2DB7", "T. c #3131B5", "R. c #3E3EBC", "E. c #573B84", "W. c #4943AE", "Q. c #4040B9", "!. c #0000C2", "~. c #0000CB", "^. c #0000D2", "/. c #0000DA", "(. c #2627C5", "). c #2E2CC3", "_. c #3131C0", "`. c #3C3CCD", "'. c #0000E3", "]. c #0000EB", "[. c #0000F2", "{. c #5151C3", "}. c #5E5EC4", "|. c #4949D5", " X c #5D5DD1", ".X c #6C6EC6", "XX c #7676CE", "oX c #7C7CCF", "OX c #6263D7", "+X c #AB8985", "@X c #AE8D89", "#X c #C58D86", "$X c #C3908A", "%X c #C39791", "&X c #C79D97", "*X c #C79D98", "=X c #C89E99", "-X c #CBABA7", ";X c #CAAEAA", ":X c #CDB8B6", ">X c #CEBEBD", ",X c #80D780", "X>X>X>X:X%XC @ jXjXjXjX", "jXjXjXjXjXjXjXjX] [ ' jXjXjXjX. c R -X;X;X;X;X;X;X;X%XS @ jXjXjX", "jXjXjXjXjX{ r.1X4X6X3Xd.1./ & h S $X&X&X&X&X&X&X&X&X&XP b X jXjX", "jXjXjX^ :.g.aXsXsXsXsXsX8Xa.| - S #X#X#X#X#X$X#X#X#X#XP v j jX", "jXjX^ >.s.6X6X6X7X7X7X7X7X5Xi.-.- U Q Q Q Q Q Q Q Q Q G k k X jX", "jXjX$.w.g.5X2X2X2X2X2X2X2X2Xs.q.} J I I W W W W I W K k a a o jX", "jX/ =.0.f. E.E.w e Z H E F v a s s O . ", "jX_ &.&.u.p.p.p.p.p.p.p.a.t.i C..XyXdXfXpX0XW.q N l d d d d s + ", "! . . .*.y.y.y.r.y.y.y.e.u R.rXgXgXgXgXgXgXpXOXB.7 g g f f d + ", "~ .......&.,.,.,.,.,.<.2 ).eXiXuXuXuXuXiXiXiXtX|.V.8 x z z d # ", "~ ..X.X.X.X.X.+.+.+.+.t P.`.qXwXwXwXwXwXwXwXwXwX X(.N.M m x a ; ", "( o.o.o.o.o.o.o.o.o.` m.I._.XXoXoXoXoXoXoXoXoXoX{.I.L.0 m m @ jX", "( o.2.2.2.2.2.2.2.o.r A.J.P.W.}.}.}.}.}.}.}.}.}.Y.J.J.k.B l $ jX", "! o.3.3.3.3.3.3.3.O.1 Z.S.S.U.R.R.Q.Q.Q.Q.Q.Q.T.A.S.Z.c.9 @ jXjX", "jX..5.5.5.5.5.5.5.@.l.S.S.Z.S.F.U.U.U.U.U.U.P.A.S.S.S.Z.< p jXjX", "jX~ 3.6.6.6.6.6.6.#.v.H.H.H.H.H.H.H.S.D.S.S.H.H.H.H.S.S.x.jXjXjX", "jXjX) 6.7.7.7.6.8.%.j.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.H., jXjXjX", "jXjXjX .6.8.8.8.8.4.z.!.!.!.!.!.!.!.!.!.!.K.!.!.!.!.!.S.4 jXjXjX", "jXjXjXjX) 2.7.8.9.8.y !.~.~.~.~.~.~.~.~.~.~.~.~.~.~.~.n.6 jXjXjX", "jXjXjXjXjXjX( +.o.2.* H.^.^.^.^.^.^.^.^.^.^.^.^.^.^.~.x.jXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXh.~./././././././././././././.S.5 jXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXZ./.'.'.'.'.'.'.'.'.'.'.'.K.4 jXjXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXZ./.].].].].].].].].].K.4 jXjXjXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXjXc.K./.].[.[.[.'.~.n.3 jXjXjXjXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXv.A.S.J.A.M.4 jXjXjXjXjXjXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX" }; 3Depict-0.0.19/data/textures/0000755000175000017500000000000012640746376015273 5ustar pcuserpcuser3Depict-0.0.19/data/textures/animProgress1.png0000644000175000017500000002100212640746376020526 0ustar pcuserpcuserPNG  IHDRƽsBIT|d pHYs : :dJtEXtSoftwarewww.inkscape.org< IDATx{p[}?  @A)"%ۊ,ɎWQlpf4q'&qf}thvtnil7m:;L&iNMS݂ 0CC Fƒ'Z|']sljΨ_͸҄Q7olޛ=WO5Z20h wkK `3f/#fT6K6-5մTSB}~t ,S,ƢÃF$210chHQ?Ifqyȏ?~=$. bEv]k;60B\rr9&q.sYU w4Eo]G~ i]\CB^jk8ڊdD0[0`3?KrY+]zTx:Ë׮q52L%!>ۍ>o|7ASLK}]@Tz-TU0>`4m)g^B L]o|x]0>gדzO$(@sU }Cm`[K4rW$}g˝̤|k)o4gj ܅&:nch0`{Uv=7IvULW7oEf2擽#^K;F~(ٟ y#&|3w77z=w/#Tߺ@ʥ9urM 'j6C> o7+\|t:^L&QmϹDx-1qY9bzt.VWVS䖒 } y)_:Պd"JH$P%|ge8_ɯ>Qxc?Ykls~m74/ۂ6΂xHT?\-!? U >{Gcc#vՊᠲݎ^G$rli&''qaddQ?$Ut̚N9 pW*e㍰E8w`osᜠrem*P455DUU.xe4&&&`rr n޼͛7/ _3 4@ԏzxWnsQzÆb2zE{k1A=GeC^__OGGFjjjhF4I,\tHdΔkDA+{୵~mݶFgQ m^U8p,6OFTQ&? =|p]wE16;ŸqqY&&0Q蹮*h͍uE~{]fcEb}=~S^! $AbnP(_0ȑ#477p88p6mR6###\rl6i\~sΡܼ16 {\fk:_\TS7㿦i_}w?/vߺBfzÇ~DQDG}}=jB\.Ǖ+WFL PSaκe'4^f603ae97ax& \[֜ Ul6wNUU4R]](k-~CDx뙟#WKU:MmnN\.UnFf:4K}+s&C=S@5@MM Ǐ`0( pA\.5bKK k w^^Q'"8fl2b]:Z{}{若P(tV: E okkY^ϲm8ӧ|N]Ӿ*-1Ϲ3x|U : Q5 I20m*CPx0Çihhndz_.@^^V)$c0҉# NP'u~=P4V$? U?9Bmm%I,$ҩ狿X(h((5McjlluXLNFB"=Ub\ @ӕ O=`*`"!/ߵ,3SSUoE, +'/|R-<y㮹yQnwY{n* 9P| `T$Ird>ۿg.2Bǘ%8p`Q#r!bH}zi걀Hd2k8z !d2_K  nvEw8e#^yNAuRNq榭xuC4vvCLAɪ*ϗڊ$IKJv9kWԫڤ0. r3_oC$XzNAb4%s~߾P('pt:SthoO1ͮm CAg$ x?3>^ݨYKTASY%RD9fd~UzQe22ivڹ@U%MkD'&M[S}è{2ك0OBCސ3L+d-"nLMY[sDk4)2L1Lqe|uaK9VSa64 "c`ukT2ߪ\D<"aƥЕHTEۍjb/Պnpʒ+H066$r2/ (p5U0ul>29qI'(5dIo4. K*82񇧦i{QD\",FN]$I>@ @]]ZZZjbي(ɞׯ4H>"\Yx}l&[w.t#LƢu HZQ3x<^]*)rV=OOOSQ&t>iä's2ύNs),.xQWWtr=pa<ϢgJKpPWWǻn4M#pY^}UR O6sz?z2wU9tS-~,3L1[aH+*T"N!aшN[u,>R]]IK!+HNH**'Ǧ9;GU(o>1 r $)7JXx衇xkƩSzvm\zk׮( gǦxu|*pW`v3ĥ`U%J&mfn ӻVuMI0::Jeωs|As|?JLEX,z=PǏқ|"GСC<3>}v W\Uxy"8l$+l6k/H4cxx,ThDfpzrhy^:::Y~}c\.얿W(z Yۊ`hh(qnֵ2;i:!YWX,F$Yr.6.ENN Acc#R((nH555|;f>L$ŋ(x4+ق=7($B!'p/~oppłѸmJփl6˙HYz=wqn:?H >}z{ٵ^God8=#z/f.pk0%02z{{ EiL&wKt*oYV,K3wtt EͯGy|fq1.\_H!~ɇks F*bNk^sd%Ȳ>oۼ~Oӵn7s |.j!I8tDQƲ93b'(ch4:N(Y^%I҆l,344 sߟ_zikk+G?m, w}7'Oy[[$D|5lxޟ(II`EqӤ0l+..\o Ug0\0Simm/P__O2djj udll`M&T|N鎚xiHss3(. pv˚F~_.[innEQV&=fSl@ӭ}4e Xɥt: qq;A` yhFnq<)rY_Nlv ˵W ^KWnʄo0k?UEee5~ N,\p7j]1N˺Nd2b61 dY~:<'UuKoqq\Wۯے,[jm/_&ʫ/ñ%Xe]VSq:DQOeϪoN5` pݗ;::PB~()\KO%ږ-a6UGltVXqrɣ{WAr+`d3㫮jʹX9ROsM9}jអC^xz}@oo/`,YlH$w6PU,,>. 555gjjj^(G'8R)Vz%4$i˭!VD*5kΜ$l6˛d v'Cib1\?`8tvvb2ʞI$twwy}x=2As26YT؝u444~ӋQ ͊]Ӹݫm5=r\z}ż_e:;;ݙ)y*S$x)_&hm74O~ʐ ~쒧rKUF'quvn,M:CqC-u:h{KQ!x5UU. ՟,Yz=!twwS[[#@e퍠ߜcSgsі'_R<\oVmRRK!Re ]詞ikk^{{ީH~8NB?O:ftt}[x|kr cX|*XlK;(`lmCmmmoiiC=ts*^HD~@dt:h`0lsTU% OdT .mmm?ܳC~8\.uu #.U@44tNNPWUY>SMMM|>?xXd7p8P(A|>ߎ{ZcJ)da'',NR)f~,;kAv];宝F*ZXp8<! rhrD]Fr> 4`Z=:VJ~9hrhCM8~A?L&U5W.(HdB5;_֬ ×O(\t EQEq[{jq}u?VoYVflNz#?a0b[B,~xW^y-`_[Qv=f0&5jp?Mex-VUUtTrG=fsZ,Gk51@$5M˗/}6 6!>lZ=/w9ˉ(^8'߬k窪cm9\*b,ض? k9Nbhhh*XeOQhQ0 kN P6'!o ?^ziS BNGkkJvvSUUut^ZO9#N9s ?@,XZ[=}:}4_}VxikfNUUΟ?O.C-߯\JPUI8qGcǎ>8/Ė_ӧ ?}ׯ_L"8fl֓,UU]EQD+Sq{odY.&rw^9v_{==l#qi٬qff67'I_"LLLɤ`0FcN @WɤG o}+ &ǏsС9r> 8g{kTUeY֫*?B$)+I/~uIMv?F.+:vGuuE\7<ե cSv pw6Ew(JQl6jkk '~Wׇ2adޱ?UUkt:vᆆ_uy%ɏbW_MHR︠Oa=A^ن6*povCte3RԄ/(neb|cF= J7ez͐zɟ!\tq芊 nv---?hhhfcX(pΐd2yy {̻.---O<:y6v|à N[a(JщPYYɡC?{{b4E&oKR﷟h:=JccF{{? -:#=k)\X_POY' {---?qĚWw$vcJpp[F*'f577f%n?!?#(F#Fq[B!ٷo@`0`0绸;v{̞.z^F,r9rܜ)륵 ' OZ, v ;u:ݗEyo IR#lD#\YN'mmmxņWWWwn* 7[l]{ᘹBIOAq)K.GI4sIDAT(\.QwW?#N]I~vZWW,˟?LU$ITUUzqx.zޗ}>߫(-piy/+ɘEYqj bш`=NZee[5> v{ӧeYl===mkc'L:L&fZe͖퉊$I)3LVub l.qfMAy^=AijY65dYs&ɲlUU (DQL`HLT!Znd֎=w1#c]=w1#c]UIENDB`3Depict-0.0.19/data/textures/plot_zoom_x.png0000644000175000017500000000737112640746376020362 0ustar pcuserpcuserPNG  IHDRrdZRdsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<vIDATxklu\Β)zۖdY"TNlH*Y*Z$A#mOu@Q$Ԩ P +'ʪ("G$-YeIDR⒜}p3ᐔKΘ?`9;g.3wNE( ԠgH8UH94i_ \  8YLlE‘MPʐ%C/Uaqjlxh,rYS$>G6NҬ̲h("#B 'I@k+Uqb܈ErTD!'kV8yu t8nD!jݑJ' TR9,-NympiB IL쎪YJ5~Bv]OShWpT#jgjR{|U$@Ün^$D,8BH9J5O8mm?ig!w!<R(OFfpԀǖB؆tT.=joNF;YvʼJ6CUiYԠ?LHl]̷~vB|t t`ˬFg.[aG!: 2l{cfi4æ?fqD?i+!倲駫rAG cG{t0ވ^$y,:N2jV݄ͫ䩰I)Ej f |6B¼6qA(^ bhWǡr@PcL(]V 52Be1?1%`bkc޲0~.I9\ oU@K޴:$X)Gaaɐ"5#_AD-gEe9L Yo2[L /O+cNmY]{@1vsO`Vթo"}!oeLMwZ @ oi9̪rs{BNÀUq0i@p^ ?,,xa' zm^dy$9tQ# 6  3p=n9D.1:jƣfFF=H䉗2"b*R t@#g-cF AFXJ$gZԶ-LY%BBXwIڗy[$‘Lj/k'%%b麿n$˖gMkzƄ9*!o'!q/BIDLw,ci&E𭅰 c-6s>ҲzA\%^. (H੼.B뉯RzzL}*vByZ%=b*ucYX~ _-q2ɲcŒ\L[<BV>WO=+*/V~[z?Ά3ϦtᬼF-(HA/v]/Hku|pRRɥU/_e<*k_вqo{%'s|o|oLR7s||o 5\Zm^g-&UO7pj^q u 9%i7Bz{ޒr &4/{7lע>|p8k\$R"UdXث+e_!.y^ tMcC@X0Kqxbs@?Z7;Hh>]f˪V>@Bm,jjpۯ8#g^ CE Me%6wNVr|וߧߧ9+q 31|t}"WkΝT^#.O Ub߭h?C0|fiEYNo໫{jY6:M=б|r;qYEA$xā& l\|P"FRÔm~+grswg tiNyKWsLHneK,-\7n2sFGޭ= !Cw愎=G&0rl舿`ZHB@<͝Av,_]#}=1޵eM+ g_kMD5~!R T9%5(]vvF<s-|3Nd"g+RYHBխeBz:yQMYKb7a7\yg#m+H^{5eJ 6Xdk%PV_W+zJBrnݝ;mz=PS iDѯ'򍟗=5KWϯ^tJ8;=u/]$GMF BZR-=m!}J#uu޾3r_h+œ 9AHLDxo~-'B"˥˗~=r9ӆHᓩ#' XsR2jaڦSKH}˗$Rv%vcیKPsLAEJAN)a=xM# Irl yͪ }Gn?\(ZwV&  #NR?fe:ppٞqRnTn^i$˒[EvVoq$$K[RG- 򃖥@ @Hp6ڱ;-۲Edk_fqg{hFҬ~{Gs4ws< / a`mTEDB*ɯU11mw8w`@kUd0$2,"q^Cs 11yKq~YN0@ٔ  #'+ 40A ""U@'c RUmɑIØ l`iB@fI?CAa rb&F2`((dw !M,@cj@U#gjrlV3a9FKGmMc CH3%Z+{"u{A?()y@*f sT8ߛ+(V>ZXXA·ۮbǤf) 5W`{*,1=0_H5<0$}SYĊDPQ|W s ̉S*+vo%v]l~+~98?GDjsaa]9Xw+}5;F2^ZS\vy.l*uo5PZ\m,vd)_+S]DUKC}< Gmec JqX1zF@EU|80YRyo97dž#b֎Юq*` Z(3T.">#6NdU=<ȜSDwb}+Ac{ͷS#+)ΗF71xX2_DoTo Y)dvf#9,y~>ԧb"Ʃ Lȟg۞bE5-*S,,@Ds*a ;'3RD~,"L Cw)Vit_5<Ʃ,Ct xIDkUaB"qgFzqssa KfӼ||EDRy*u*,Q,˷S#YDU H>OYKZLh_tๆf?,` |mV|h-"cV6t.ӑ>#U{mT@QAශ&\| ho7@rfYXg1Գ[OeDZcE3"ҐQHk•nRA=1Vg#9BUU]z"򈈼]DJ2ec>Iw DTO/|81cT>-ĶM7'Ck2a_.9һxI|81Tu;01_7{HQ?gw C&'jweL yY$Xwxi<7m0gT[U?,Ž> eNjsA$L/(T~FP:w/ "rg~y#sˎΉ` kp][zIb,`Dd#~n2TT~߸9"|-yzsidX]"oNyDCJ0~xlT`3Y&a E(l/?8pe+9UmR40_т.kPAU4L%"?#F B wridno+4RtdhAo_fPӪUU]ȿ2G?+"9}rG,pED8We2_E^?@Ur"FU_SH}L,EyDb< F,{A2qWU}'w,LTSUX0LU'E/2nÝs|%ʙ =@m,WP+YХ7mo*L!T5?RM50stDUDUDskO Ut{QuqtGgmN)wcx;)kHIWa;Vq6{_X]qN=VOKJ_MU 00Qǰ7%}(oe8,v@装]<$; o^]~a-.~%>o>¡]U Ô7\]OUia^l#+ފ\>3ڞȇ@!"ǀΞ~z֭[GMM͸ӗB'j+B|!uߏ林+N>D䷀[UuxNORWOT9/UmE?S( DjNyy9H$a_d wq~__ڞܶj6#;OBGh1KEy9}qn:DU}mƎk!B4)pΡ=Y X ػZcEE}}} B!7oR'ob.}6ޱ6~޾Ȅ \;!?Txi@]E@߂ '>u2bo߂~эׇ70XD"j\{"@gF} bݰ-&{DΏ( Y dDs555-oɅY)QA+ou,E9ߏ~͙3 'zT|~߃jAK,K2,џ1 FQw> Ǯ:A C<{}>"9ظ49'@O߼'ۏȕڞroᚈF)奷 V"XX-R'`9jʨ/j<[Zٳ@OmFccc.lJH!|v#x~kڈVN؊FۓWq=+a_h ?"HEŮS/"F ?"Z 6ʴ, ?5\'GRWy"'!k-ѻ}GA} &܃h)G-䡙_d`DU\QQwB^=7 ?K^Ddl־s,+vy@t.PTG9hXo$r K|7؛=L?es"M7T0~'Lgo]ηi36BvѮ[-!6Xn,f#v.DX5bDxוltVD00 ?䜫5kkf13 ʂ~}[}Iiw;4Kc㧓cԯJCr$ o#[sw 7.}WӚ*e҆ÝK#yCcy *c{AFzhne/7&9z`V $>ޓ["#=p(ŝODaXg kӂcp?`B{8{2AMBĈ>=E'C/[jt|сĶm)@D䂪 ~pn:^01Vsᥗ^9t( x&+ɤ8xqrȁ_G~jkK%VU5~00nZg-ܒeO!Nzb^5߸`,>1 ε3f`Yhz*p2>r:ߍ;Hۀt.ꪫ vşb}|Ci'c;5PV-YX4;5%&#c ".\Hmmqh]Ly^>|ݸ7D! EtBYeQKX9g\, ҹ+ZTt@DH}+ :Kx5 \[`U^` 9iC{u%qY1^@$')yАm[2J1fzf:0 F " b4ϦifyS#Ie\lY6 >*筫f%f#IRWWnj3mKƙ pK^F`6sEŹl* nl[#\OK1 @'T|RA@KJY~Ru1%v… l"Ow B'Gyv֖1ETrل?iow#p):ē̞=9c.Nx^9o?8|çG5T÷/Kh9777'{yZv:aTi*d{Yŵ|W2f7JoDZU/fۮb}rւBssS6РByv|/ܞә32ԔY ؞l91\Dǂڶ*';K˓/n2"ԩPP22 >eO@eU4TO7h`^~#,STMZ0w\JJެ"'D#XѦs THQB%!?.j &=O;ܲr\Ӂ&@$BtO.C=LaOvl_ а{4?o|X`sF|&@HG%"9s7w.'*c#2k{E`$AX.ho4&#) G*r6/F@:{t)ʁł}SQ{woEdž L@03y@(!@2D}b3@^T@´x#.!swD@zz~/?.DbqIUȷF| Ƹ^"aX,?6KUz%ydJ޳$8#6 $WŋB+Ct5kPw"- 2@Dx{05^ c?v)/I=Ddƴ`sd^魨oOA~PFOЇؒW&L{>< "./Ї9[YX% A8 qxӺ@c. ]<bM=8ޯЈ $ :ՙH[x{䐎v#DUØ8@P\$ ȷ&#dž8z~`|aP y=@tH0 /5oN;^,t!0{{bs 8 @>^$ ./N(kG7uCﴡ+((0 X"0 J4%"ɂFm@I'84u!M)Q'*  $ÀH?)CM09^J f+:X !V+),`L I<~c@DcHp$B@^B 0:y.pW/W}cq~1$_o6 `az֘K'2c ?~QU; &$@ 7%Y*|޿#z5@` bA)vÍcl4CMp ش```˲ Bz~%0Ć.2d6j˺1E@}-q>_U@5s[w $nG,5?H؛' #Jp"B⥮c,G81D!~^HdZL,($2=qK?$^B`)7X( E "r@D^(T~JgT** P^'u ct-,\8yX#9\>Hp/1y8w|3$ܹs913.88uȳX===2p:rO(Jӧ##xI0 G_:C~?MxH,-)q]a 8}挫|{ S1t0EUDy{;wx2L9D^͓'N~h*0X]fYgΜɓN{AiIIg'N,` "P Rii뺎&OggkGIIICy4`1'.A(,w <H@"hc``&' o8y4Y' wk|܊ |K_̢=vO>︲$$X!30881"Y}G3@*D(Eck(j%3FRpu<7 :1.^hr!ױd˓E ܿ 0Ą8 q4;LMuS\Ncwo$xK#irȰwAN9yOᏙUUɂm9rd8VFEۈ&zX5֊raD'3#irV6ew"tuuq ױd:|Lɤ tC2 c޽%%%'3#`KK|tGfnm&p#G͜938@vDYS媆mvWP(,/,`zqb`?t0"{ϙ55[E,m;vɓ5+Y:'S# P?k뺣ZcHUm\F20ML}A>o/TUUWn+PKK& zUϘw) "Eo$".?_fx$+۷HEc: "_Cd%mhhp][TGGܼmmlDky2uJ``ٷ/,Iuu n0g߾p̝${ND6-z71C1xiV]'r}})!"B987ᅗ^ʵmE'ٽgجZ]~37L#ൽ{ϊ罽TYYY\nͬ!zױP m޳y2wJa Cڳ߀JV?tum=8-QU߼n?w.>gmF2|PDڝi\P`pp_&eK\YHG|0ONIdwwH;35xydiapt߲R̞GD;w6f#^{K-G-28{?X `.o_F?[C1DoDIo/hpҖ-fKxG]C aBD"7y4yb صq|,?ߵl_jl,200?i\qΜ=L @رkISDY(b͍D"?|3.R7kuf%EvL+ @پs w DDu]D#LY J͙(7"p;_ȃ#YfΝ qBYf1/<b"?0~cN{NQY /Bo۹<_"[Wy0wZH}!cP<-vqu/LGGo[َyy⩧lFe%K/K7{`c<u{Hso{?Y!~C<{fz g<=mbv1k|?㽽9g@u7 6|# sIqa{\S?t0 +!7ΙÜK.Iqɖm.a#WYAxb0IHݬY7bٲ /],^DA۶ݛ0n k׾ VU ŸKo&oyy|fl,+-eْ%q|W~>0a֭[[=wy'\: Yf mD99>^ںg>' 4͛?q pK[Mu*[Dh?q3gN .]W\A Ȋ?~{-۶%E'[ #5׿0{ǎ=ƦUU\u4XĄ sQ8k{hjlwIL'ly`]i}/lb!F MW_> 0{^UpSOsqC6 B\@C}= o?f9obtՕ*]ϩӧ9s,+KYSr@/We3/` n0DD,.Eo_ߤB!1{M s/T#EƵ\x'0ck#]tuw38800p`` @0ޑS< ع ܋/Mup0P\w5۱=&;"=]ܕO3{'K b4g> ^,c`qƍMz`́ [碏}ĩMB@0 u^v>8yϏ`(j S`01n[tIENDB`3Depict-0.0.19/data/textures/Left-Right-arrow.png0000644000175000017500000004356012640746376021106 0ustar pcuserpcuserPNG  IHDR\rfsBIT|d pHYs#o#o5tEXtSoftwarewww.inkscape.org< IDATxwW}>3{{\.r^H#Lɭ;ZQ%GyxߑF)$uǙ@2=1X,ΑY٪iE !{$PQ.n7M9'7qY-lZ2N30iL; ɭ;> n_e9\ƄYuǴ[h`$U D,Sp)M\rN+VW@r8VhqՖvBCܬ8>SL;ZF!uZ i[ڋ۹hs YK ͌ ہ*UK\sOiƨ8U4iG @MQzs$m 4s= `F+Sr @Sr!f R[wQAk1 ӛv/ٕ;GhfއaD,[~a;͑O.SwC1 hfJA{\~~+Wni)Ҕtː5?(;(O fFXܺ# ܂2knv.=x̠j*v_8W<1-a @rK6JmQ׆? H!7Pr|a@r- ք`^96Uo/u!'kR xJc @򒻯Cl߬]5 mc( xdi1^xhfy) c casGzi\eoU=}%~U<C fFWpq6 "`87nଓY{ǔm 1v_|{Z43¼+kE % E1n9#43iS1-aN @U~_xiUKcxq;X j˅FgpR[ 4nT0;A7D5 uƀ6T >)44XT*Khf9%#(Gρskj.{@׫.{60` ~a`OWNfVtC7"LQ>fHdq\tZS%6zaAEzFje _F۷j3k<⯀O̪4Oc 9ܷ6Y\Oom3jɄF&N]`I{Z <ې˷C&!?͜gVƇ_a ʇvFSՔJ@@2"|r#N}4Dٶehx٥ JsJoh<3:/@kwapU4%M9Kl"/B20f)n.|z\>Pj_Yu߯?8#YoEs'M*icF<=r*񍋁!a.L42W2ѹW"h9vb1NFD/#kfi7a>?j6Z52r#_bWv_K9yoÌ[կB0 5cD#/l#DZĥm4.|C2fp.9'ֈXd~dX?ipVN4E/߭@sI @Onn6N[nȆm5-$c!51y]ϟ&7}T.m]LHZy? q}l|1nv+a,5& \OL 3J3%o}z=o-+ ze8k]]lj^Y į`ʹdDZ} . aȾߋGs g]U !=ϼ>pPf.L3!w~?? ZrWJ^Cs΅;`"Uj?̀c1)7} `SUZ_o >%Wq XQq3wn7}2z! C8gۄ!F ŕ8hUb/ŧvZU=7}\t`^m6"7liaMGa!]3˫}k#nkq&z,/<kWFeh*bZ8 Weg1 "&2xp_>;S8nRe`-Q/9._ ׬10F>ś ;˃n[`JX 5 ^7yuaSUOֲ&"K ߏty&zSI0i7} |jEmj^Msb$&$7_M4,wj%H5Йrj˖cK'&kT^Q (aD Ir)84,#%Yg웰 aL\!P62nvץw0/XU[ZY!fBL"yrD%,I}ɛ7C%K}3Fn`  Fu/풵% +;^]:yޫu"t?P$b=Bh`PfYo0{X( lXH"i3 k*p 5G%{Ix_eۅy@LDªg >X@{,PpK)k#ܺ{L|h1\B7޳X̹酏2έ`U3nkGxyX-Kpr3iPAB/& ?Iep^&M'I $e_&p{,48HjDz)!Ux7+#q9d.b%C{Y8^8Njf* DMГN]0Tpa7–pg ̱ mk@]cC)oHqB0hO@B|5^RM1V%&XDHర͕d/s^.?prX4OꂟY@>#GeO,j0)73:I_K`DL(8VKK65$$@0 jp"8RBX/]xq^z.l@re p2UE؂_I;lBE`R9b ;Nϊ\9-S D J #Y `i޵nY u}]ЕGza\.&-23U+B|╾bwh uǁۇ̔lH5RN X"od]3v4Gnq{0<֓va0j`D6Dlv !fHaaF 1ܤipѿqCƑ*>"‘j9 nt'1;pxd^?# ¾d)U=x`MJj\xѵoKkFS81XS^]<1BG$IF8q`/KTn@݇հķ|?"L㷜{_l]@wFBMvN^ØS *@UF 0W7xKE{!rf+ ތZ Ɣ vMY"K}%,J NINN /!H|7['qO1?f~7Vns\3/ ~ _HꤿK ƀ$ K#J푦3{j99bu*v?pVNn$vv bS"E)&bā~*''ղdNϿ&){W`nH\ovYN\E?&ƕc^?OЮ~r+Ejv<·[P"@q ZX"%gwt\F7.oAg #ƚs[0fw?l K Co]gF*;X%1X;KGHL*䐋+ʃ"nXd;qOW`DV;M|U5_o$p}d#дʗ/_O^wGՋX(<%OP>!0"E7~e[/5H<8FffLҀ QXO Ltxd@ Y$"`c6%`]\3o\D- 9<DF7)N\Վ?cc#v]=ݏ>-Tpϸ/Wsgܞ|O "vٟ_x[^c #X'7?1lq Fm'8  ^ő¾y Iz_g1s]/ ۀ4K\0T; |JnxOn?HܾВ'R"T_KXׯiOoVulyqcMęMM&j@2N%`_0Bހh_Y^8=XC CGW%.Nju |-}●r3]mvn?1c<>{Ar[F(kxͿk?le{C6,\:R^5z$DlW'['/~^aEڗ[ܤ&N$o/K Xo: B3$XyxpV==YH-0d~#( OQEO]e1mD?^q#<NZ7۫Z,*9w`R+zP0ٶ5ҸTaV3`q)Ib#S`L%" <1 ÑY*SΌtÑ{/W;T'IX$>*!w@ݏ~aQ(yA@7zBDhO.K/b 2l &@LXe2 Z,rpO/{Cil >BƬw(9Zm V {Io4ʂқ7iaX#hCOQk Xo4lY,D,/ :O xufo:W7eqIaRgރR"])tzW"]WRRHJוHuf~|W{Q}?*5%i x}oCߨ>ʎ(*x69.],A$SjSs˘P^A0NPz&Ճߺ?yS$t n‚vĆ890R6lp_wfMJz/pM ̠Nd/mT4JP"0PM7>)/P⻻QO,jcٺ; Z~_ [?}nԃZʃ! JP%0^濔ud^O1࿄xBr/c6[ W ȡ7G{q|cF(;wmy˕sa`?eVmGz"e?_))dxڛÒjXko-?2DȤj\mXijG$'*~cr{/>xUVR.{[P x݅Sx5J"ފ#<;c0KyGuK˪0[L/PT2W1ˆv/7k 3| *jqNzCdͱ?ٽGR@.~{[kof#ll h,$,a@H-1^A[b,⮍FJDaP0By0`FaDA n E\uVӔkEnAFo6lv >Rl_ 2 Q_]ʔ 2PPe>o9kFOOд\U&DL7a"v5&6t\/Oo.0}HtD/BN0JI 9O3X hSz)ᅄ|RX`q%2(AJ@d.==Oκ5p|g~ySSxboF f 7Hɧ  &nL$W$WUׁC9ܒ}(qIX7 X~o4j/K*EʫܗZhɷ0g?"mWU<0L]ܻkL-R]%MmYǟn07b!=x]beۄ&*8 *WF  kLmPtT^ŷ=M7fT 1h 264cy |Z&7Ěeik u9ܠ_=Tκxw͇T *϶=1?*ś-8'f֜nwֈ6wn` dBF "M5&b  _tAvty>{%}P`8ャ%䄣^m}+c'_oXv?؜qqsJ EVb# 3t wKN{ӚMV x2n"c&F+ X)(${>./].G[?P3g3A:;@ᜁ7!jPm՘h'sg Gr!2rt?"oZUqNӃ?xwxL1,`8foDc]g'i!13AlaA|1: Jdˑ?8VˇQΌ6$uKcqT۪ zPY=.*FP.8rɣ})K7%y`<%լx"jXHUB`W+veރ?  6pMmQ%NkFO>A8@?8ꏽLt,*A@X.h\+w>brX"FGV=rO>Qa0$9s.M䯶T/5< =RJz9c`)[_c v$ |_Om3^A|ӥ;o,x FY4ԨECm521fGcϪր"2pK vw="<:)}y"@f9[r׮=Dz!RJdw^ 85)H$;ooz0"@T5! Ar%4UA9G%֛q.hZ>܏Eםu{2BN3T!jW-Uw*>ٟl M3=?A6xЌ8tO6^HS[E_ ^~ǟS)EzDZzjpncp|3y[OQHXsp8.n:V 8/t˃s4$>?-DX4^ oԛk!,R  ǟ0@ڹ́ރnk)#m%8°M&sθXm$"p8.n&FJe_U7̄lTOι=쏷=8S%4j6JWO{Ճ"+h]]yY`҅  0x|?5.J'/mhQx/}(7f3h<-V:+yFe&wPbHo}":HۚךLp"z0JGE_f$}cb 3Q*ZR#Ujmұgt23jꇎ!$!ĂT01Ld2 EA2vA.- wHng ybPezGO|?iS4odGi"Z;׍̥\!T/;!DJxxLF F)k%U7e`6Ő(n:ض*Z/**?l{3>ͳB ^:U/Hv># `U+C\ .?9A2juaQƟw "Jr=38{k8xD^2,'D@oZbM`E0ɤQo_j:c  #6|sǨGCW9-Bf$@!Hr\9T^rSQt0ь^E @ula0?#9 eam u^ -2\a{Ku~2! 6XՋ./\;"pr+1A0yL΅l4Jސyri+^@ݏ3/]GL@yJU2'EKPlu SRxpWpfT7xXc%q&˛W%&,,@rJ Mp UU/€M1W*HdR6xa*7*A*0tcgCsb.:_%fUU#EqdŮڈ!8ky-k"('W Irg9F h2 *=$\e؆W`o\#yFT `*z&nl}]! p@\-Ӑ6ˎ iyJ#9W! CR6щc/H)5 >"S_ze qZa {gG};o ;_S#5Ĝ3 UUyCW]wF\҈?<m(ٛp.hWRA<:J!PqxIX rE%f0:ࢎپïS}*̋cpضԓʐ.S^{nO^}#+0V0@` !*m0 :fuN1h\މ,u `P7ߥײEB;8kބ $fmBE` w8Dri /,D G sGݒSĜ/!^Q͑6[*dfrlnRBw`(_/@ƅCjR'7h7\ѻAA)Ȧ`nS$qG40]lRr?ٯ\ ,;`8zyx%Ⱦ'zF0 ͮ</\ 0ի/bj"Þ!؟R&oj Z 8:,Ew̴͕!tJ(0gY;i`: ELAYLοQR!Y^(+ie6XTՀl Wt} RZR<ƕ ~`c_4GE K-sȜ3"Z"kg tUD}e|S΅؛V?s<5†x) ?~~`9rq 5|iNv]=;{)7|o^ OҔD/ž%Z6`lhI4˾2'Ȃ kaSPG/+h֬Fܩ KYT ) #zjŐkRR[Wg)( X]_Ty_~[Dƚ-jcraLIwIpa#\\ *F mWXl6=CG2Z#̡z4 )o( =z*q @wkŲ;.c "+py3li,Lt髤<qfkKG=%'p +Ha2O?ߺIuPY}s|g^Q@ 4эY'~,,cymFpYl#zB3A^apNT/ɿ}@ߏtGs ?OoS_A b4:ZSj$٤ńK`[#4Շr.Bsl"!ם'R H#T\ၝc詯ͯ+F_V ڻ9(Um8͒KW.Hv83ldxQG~(ݼ$s$G49g%B:n{7`i?{hCE@%(hnmo|ړaEc(҅!0 CaH!@z5P{o*Da"kq[݄9޵V7@rNXa;߅xtYRcns!u0OHcȖ5gyabrn??)74M$1]ӅfC,i|<1<^# f-AO^+tJ/,lIMꀍ#R6-+K{K{!]_OͯhNE] 7 ,}#o=_1[/_h³ X/8.yGa# s=}sSfZ.ޯU#M}yB^|Gpt@[,o"!s!}(OǍޏnnz۳>A#/什~_ Z e%-&4f-g͛GIDAT `N~;ar0>$v6s]4~?fɢ`R& lуf/QBG:j @eC昃8iagodO yjNӅ3|-s'`_h+pIQ*="ItHqY8Ypg&k纞{[/ 0Ci0`PY^% թxpjWiws{~"xcfɢ@3]TxҵmaDH^'`0  vgOnO ?7X|]@3;P[`R*F ovWO;F Ζ7/tg-C-@[?`(,`j kƓ;S]CLMoyߌ7Yh`t\R{7xJ۩S?=I3jiƫK.ztq{6WnT)-! wu?>OZ4SMTkv c']xE^出c{_ꇿyyLL !E)jHc? image/svg+xml3Depict-0.0.19/data/textures/tex-source/Right_clicked_mouse.svg0000644000175000017500000003077412640746376024070 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.19/data/textures/tex-source/3Depict-icon-hires.png0000644000175000017500000016260512716174467023442 0ustar pcuserpcuserPNG  IHDR\c~kgAMA a cHRMz&u0`:pQ<bKGD pHYs.y.y9tIME /EIDATxwdWyMB==9'e I$`k 6|{ֿ ^:p"h ! !ӌ&tι+W{thVW'[ީ$I$]ƗOg/oS} J۵ٶZRGs$ :r7@$Iw4}.[>mc&b ~dٙGEWFOAR$Iގ͚o}rG _V,r7Fl2$Iڀ>4{,}ޜl/̠t9/IAֽ֮2pNC.)wc ?$I؇6mr/{#n86gl&r7F*J$Cv6ﲰ?S@mS(1t|.n]2\蚆KSQGPC[YWUҦ @`L۶lHӤ2b$th2I""JY끍g:<|# %I։;<[qJSB^/!C#x] }i$JM&YřXřFFYIe2>9_YS$nT2$Irj١/!(w{v )"\nZs( L-.1B,VB(_|upr7F*.J$U{oS~ JcOc0HS0H}Os0(_\4 ,EgrqJV~̆v#^]0$I7.Ӳ~܍YTZõׅ騫U)׌na h:"N~gXSة$,6۶Dadfي 8'#2_<42/w{‘$IRd:Q旄|+^->QQĮ |~x>P <4!E(v,B4XZ^\'P]gf^Z*8ecOtO94]H$IRTrUM t7H-̎_ u(:D 5^3ir0hN 4D [Ye1r LMʔ&;&bmXyh`j܍r'@I tkS`ՎKWC=[nGSռX M( MPu}}  Ş@LN`MC0=m3 OL1emx^LYA@:P$ڀK6~_K(VvQ)@܊hhFkqXec-cM(`(KI$936Ʃq.Ζ%veha r&@I ^\~g,@s_vߵkPZ-mD jakl{tkl P;0HrztS͕<Bqgd- @I2}_|3Rnfj}%D['JWJ[(wo=95<9p 0d!'.\`|~G4#3_?wRP$Lj }zMCSM4E ]Q'sHmQ0؇L˹hC&*]<&ikCSE%GU$>#;?Ul 5ޅy+JkGKHؖ=:9xk/ner~bW)Y'ydhI^PZ3J$Z͟m~ p֖ܺfn!8<uJDfYRIg0Ϝ^{wDFxe`P~3,KO~w"2Y3& %IOC ;%QqmdT ufm;xZ"6O+e,/ 2P1gփ /.Y@$IE=[fρۊZX](QBx"a=uV*#<0̙q"w LJu7$IR|!}jjWW PL!Pϵ=yK;vm޾n 3wv*E4رhxupWqMde۟O<]>EZJ$}]m[ *kʾuww7Pn!'uT#41`{ `,╡a^/seׇ'[%2$I*z]ٲO !ROU;ڸ~?G۱u* fU@01yyp5By(X=*d(ITt5 ?b_U۹fs~w~=B}}ND*Nc_ %Ip_{ضᚪAoS7mBsg zVG(ڰD$_}PTyyphc|Y=422[ӵP$)G? mr[6s6(yb,(%;I %I ܯvtp]oFY\߂PEG*$SXmestxϞ#mJe!Cc'j$IU'Bz= ܼm+OatZfk>޶k 55k 孈@ΒQdfH<8V-bqw ۧ= } \xgzP$ gSu ?۶]Ylom-hjgV|7܊0 ^ZNĉQ׶y 76P ׆UsUmd(I҆woW˽`=PY3|4ls[$Z3=Ezx_XX(Pi۶M!/epK}ZH$}Z~R%:jy=p؍g}TjBQۻ̐.0;4SKw5 !'vkjOG e@$mH_>Պ E*Uˍ[{1^Z{:\;vlIX~ TXAw*Mu}^FXYEڝ!^_[g 7e$m87Dd_ݻm"_$US_~ X/k)仯`j0blLӶ51+'uvl6\ 1:7,I3_*Nw0;~D"} Ĝ-w~e`RJ$@IֽuP5}}ܱ{'~ pw4IRNb'{բ?'_(۶աɧJw*$i]|;vĭ(ӷ{?-}$ ;)BS65Hg P*F|`g0쉅rr@I֭u6ܤ[ kw[+n.Eݽח IR6 OԅᢾkFyo+.甂Cc_+902(IҺtog~ ȫ"(ܴ}EkJڛJ}$6X^Zٹ|@ƾgOm%?Y@fA$X!"aM ]7]ۗ~tUhV ;Q")qf6V@H?A<_g۶MM~KTT d(UOӊI PA6u+ `b=~K0`3L0 3`2EAdOcnjֶ@:wEm;"4߁ȻZ*Fzf'Y㊖ 9~Xfʆ{:8/%;I@Ry:aЃE+g \9}6}ưݶϴl4[YqkY%q,K/?_If[P#@^3-+S ?+w*|9i(%<ݛKu$'=UJ+816~ ^-lXF2EwΕO֫(3M'}nPܷkaEfng?[gJ ?o$U b!X^n"qKW!>xp7U&I~<#/A%$j'`>;̑M]b>PUn-(9aG <؅1^/'nm]+8Xd(-Zy?67\KO&>|ӬYt6!g[~s7:M]{mQגJx%ϖ5_h lI^2>A->;Q*<( *}4sth551JegL}_G(Q҆m4N}w"3} |+4wԆy˖% jowSK^O*U zĐmM}_ij"E']|x;2a9,'ҥtog.!ء\ 򖭽E/QHݍo)IR~^]L_?g'󪬕E:#)`>MSShpy\|. rRHwE @w-ݵIŗ-[L&@:6m̌I2$O.bY+)w{Zk "yzn uAmw˵~%$3O=^׵m'14W9 / L̓p6TkC~|a؏7]O U/* m'IESAa,I" 2!2!:%2!ڊ,܍ԗOs?|序zn/ tt>xMI_SS? 5ΙΞ|>%iKH^  ~|jݜQT`}PsPcb pn^N̴IdA̍]8V8 3y xe|:k\.ع ^B|rI SO'մl9uH$* ܄{\XpԶjlXTJJXX`ft&TDu9g/JWzm[_#kKSsjܥ]m$|Hf$JztyVL|i"H|+Z(VQ.?\bEn@mk-KRWxg>O͋?8iJ[ӶlbjhIDI۰ߢ#|[Y*'۶RyZnzIҕ$,XDGN!ul MlV":ҩkaP̞JROh ,„EaB"O /qѭvEBKIiBT[r֞eb}s湂m376DN_`fdGP ~ {Z~uކztun{{^_e1ȷK:ȥZ/zYi2>M & T&tmkpSVu+J/jgEefuYNX' d,ع117e܅! ~W}[ 9heKOY/l{ l-c $?3enG} 5oce>'m*ƃxY#(rn}mkcGyKGWe].6>W(qN!O|a;:ձ˃KءvArD;mh/Rll^̼ȳg U$86@+,,p'\u}Za5Pg;=uN5Wl 0[ω@X[z_biWpF4Dc"m}U55^KN4=nY ~nneCN(qk'Odɂdg.ps\8scm(ZvU{\v4޶OwtTΜbr7㢔i3R"˃cUr4,/kۜWfsq+kPrZK*Gw'_t>ʹ1ptL;bw}ke'wwt~';h$iKq'݌יxm;0K>ˑ`1}*$Mla;m-}U/y6noE99ʿfn4G9YUy&:mc[KQvmn$U}+UY jy< دq/S2,x;?}͇6 7&Qi={F򏧒;mop<,bg=tJ3 \(vqۖ^Tr._^jw*w3$M"ёr7u,s}r)>ɜW7*ʹBG(UT=in~]N0~7y<_K}3L@ |dQ*_ 8Yg!n&쭬𷴖T3{DTGO%XiY{><7M>}PU賁 F{II~Ա1 cXm3|$¬m|9Z|zwK3[_R] #gKRs r7xix4[!2$ roB^Qws#t@3rիrq?yz^9wkTٸ?Oo6߄"D,2 u ,j#<l"˺Cdu%i]S\}}`WLtQ!LZڽ=?{Ǒ%fBоm7n?<⽮RT}ĿX1L/mG9$#lrǮ(@WU޺e3ng ų>}>  PswP;:gJ=|;]wm\.0cVPs(v!ԧmKR?mpzmjS'o$Pʿ.娊0SZd07f(5nvܴy﨨b]rmE66ϥˉ/gt.ʩ'O1z&1WNr\{E^F+I3w3'݌7\@۲[64\6.$tS46 Z_Tzp=ڕv>8ס ,^ƵƵLZLXFm-uԱ8H2Vna[cY{mU9Ӌ7XT(f:Ed7T0j#|ȇÇ[ƸCɜ& EShi$bntL0+!3b쎄Qm eyn7M9.I)\egIpXIB:ϲ JD#>MSM} {C)T)(nz[yΓ˜ocˢ]Yxf3{;JՒûhMgv'\KǑkڒ?xaYNVpB_(Ger _~{><54Vc__ |GX sP?Ȑ9Ĭ=[Puu440Pځ-S RZ^J}ij)ȱHc 㣤sy=&"5V5LC82ԯr  Pk# ! LV|:'mp.qc,~}.v!`nt s2 t 'TKMcc"ɧ|8xXӛ{mCXXe|i}{{ ):v-El!|]X8.Ik>hVr{)B^65ïϿ0W oǰJ3 .llI屾NՕSCdymU 뷁2 |0 ;OwmWAw.](YRitjy hF:fq0 \qNٿT}Z|rI*Hp$v1<<ӳ+|d}(P n`*TqڲSةk$D׊݀,V&,㼞 "!j-MMXZ*w3Ue1)\u)ۻ㧁 oIu(j2t}r)I/p"}`E|>64Db)3fx64EOt֯p-pm/IUdzDf#Kҹ=ѩh_ںqOӎ#ͅ]9&.h3}Gk>fmsٳ@!nfәDvh.-E0a>']%S& $xeMQ:IB8D\IlW<l)w{]n 'I.%\q*u%pk`s-arh-@ PSP)0>F2|BE% &"ҦWS 3hg'TOsoUa-hYEB.Z{9Β$]UԊg?c/Ǿ}`Dnn#=Z[i)fHR KnF&"Q^aKWS!W2p 0w?f]Tn#Oh٣t?2|L[u`bmw?AO@^34le+] ۥ@gzʇ|8}xWbcM~7M[0w8s|m~A 5R->ʥ*:m8r1۶(85Cc;[uwoʭ[K|$pJFg4nndqr1z3$KE˱;ز,:B}֤|zy ~+WיHfoh֬Xߚi.K%$v;{7@r3!{ԫ /SZдTbi}WsG&u;V|/==%hz]k[яQ6g-Q Tlf'+'"' }GIMvz)zWq%JZV3Eo ofBgiWC; Yd|MZ3zn_0@s )%ߕʣk.Eq4 #£lK]Eqxp ﹾǏNԩu|6̒ȗ9<^KF8 F+Ncjؼw_ɎM֫/w/9vk̄pWd6@[cfnrSJ\TF>hV10~ a5%5k͜Ia.]Җٜ'$U%M^q8MÔ;"Yϱ,zQq,f>l2t>왾BOq/1vyg3:K[\|Ge?jZ&J3!$Ksi[b=_3ae.ATƕnrOmY ;׊>īkEbk!PDjhC0˅sN5nk뚮6;7J~KҺRBdfJGW v'i&;8)d\%=.IZ槧(w3JFh:Me}syPŗct]ۅ-J{wqTbQU\$j꽕33~ c[8ٜ3O6Ord 779IMjJ:/_iZ~ Iv?)t4_}34 e9&IFΒN݌p ckڦY?7979GΕ4۰9{{/נ 2'IoIEȐ#ʚt5K DoW+ ~]'v6c ڕ8~4:r\AMei! U. =T)j'ϳd dilt!'~HCy!BA3Dl:驜s >z}i.*JҥFֿ[j]# ~IŢ{m|"9[6l*TAݸjʻ"]L6Tq D'c9L qx,j --r,$J8`gS`!",(Vל=Z \7o;؆%.b.Cf$)_z'^-w3^` XNχ8ρ }}}ۻEwT*L>J2 `dfd2ynWbӞ˦`z{EGQц@TT!uEWh;r*0/[&2ÎfSggIJ` _w%ce3IMp 6eSݣr,;E(42(Iy҄FZtfMyou̜qmL7 ?uxZ I2??dn57MOSf־,mYF&(N&^X/Bg{ZJEejZ4j$U&t}Y4l 6#>VM}sط{'B(>$I*:3cr<@0f]gR'Lz|>۶m!)/};rٴnkO-֤5$H1o@5- <:z:Ab1鑵 L_TE70͡۲,w*r?Cndi_eɜ,nG]EfƊl$Ub?OOaO/O8vޝ{=SL# -!IRьNL03;[fTg™NRn]=@CE_IPrJT2(I(RPW K&c}}}ܜ2ʻ$C4hͨJUA,'NUUn(k.]g\˦[k1FufPŶM@eݔ+5M >2e: RmuAz=$3۶mJ.24৩粩7o.ǧ*l$Ub6]]GGv{-ǝV9ּȾhlTC9O2aӜ d2n4Bڴi-~p^E@ƊjA g7\_SŅN;4>r$dمr79h;N4Mw,?A˹lsWtS|2'IUoP420嬭 Ov־zFFq:pJr6>5d.hBVUںMtve2i.۶5!o?TU#74̽R]YQyei$yO`Osa,C:`sn`}F/aIcs\@P|ЕN]z)pŗ~۰x_.6m@Q(Oj8uVl3`Y&ٽ=>lXL,&r-HJ`#X_dF^u2T03,EmpAE1TM[5i*3kb˲,W&qY\nއ[|x#V*Z[ϕ {{zGB2}޼08x62[Ҙ'ńJPXL:8t\mt!E/C?Cߤ#ō Opo˒Bjk2۲,@Puכ)^ŇN7 rg^Jr$&kiEwo7ڀ?W]aOan9Duۮ P`p^gpUŦg)bk]M BiB)Y:J$)NɘV f#H|>'*/JR U^ A02ްmea`liKa?1,z)zkSjL1AWv%WD2ARioyTeMiF6g۶J\R\pV>|7~=MCBUTU׏*Ԫj!+Skt9a .~ r,^pꄛ P1ٽ nK>W$[^Mc.u@{Uׯ ˶mEi%>fF᫺`ʶ*RS!y$Ց:U,L\AO ;mLp5$Hi,F,yKĻƻ˲ ˲Y@Ca$ 2z!t^>roWe?i%%IUʬuDyW?J%#J /zya_RKer9Ρ׷ǨT1--7:er_ yԵ_ht:m\.ò, 6MɃ67+M B̺%H 3mVzTyb~s%`sC-16dwqL329Uέ(b盱,Xhiض}+,\ql,iC!Ie& vNm83̬/tb(2qeY NL2PlhU#z1_&1?iR)CUUr zef-^jSVJf%2vK83Mb0N^WO$ܜ.~hvŋ2*13&3T`Q3Z9%&ڂ9+JeTֹ :]ܽeFƮkg6S \ Riz6dxM3C|!ŧϷg.M(.̯iV~i_/L{/1;;0SŠbU0 .~6X}ھTƴ07lDf[UI[W~eUO-G"%*ؼfFU|zrx$e fCľ=4M44tImm+KlZASBsQ/?C_Wxf۰``37g3?o33c3>n39i1>n]wkhmFk6`y"SSCLM 199e/Kh݉F:Sϝ]ܻe_* Fb/`Z,Re V2Z4MвBu@K{;*Oh4.̧9_KzzZ[Ҳ.Kjn  *vFg AAg~if|bxbhfhhD"iNSS7MMd2i&&;9"3 _?_?s[YLt/ۆ'.xj,;f&h'ʘL.EF7: +%`? Z +8@q)ƺD3Q<"IN,֤CH|ҎWRUMtt줣c%c]ÄMصKWA}] ۷ o׹^FmN09qMrUUc;04 ddŖ:姷Q.kMHh˶@V[7e?i-@r ?AN`L'iTb9?^G Sokq+;ii}]UQWe>C4_-×/GpơCS?.X<|W^00R-l;=IJ28c eG3NՊib:a.ǒ9uI[C$ l۾ !T۶545!f P;Nɵ~WiGAYxvbVKw~\rnUCT~j_WֹnqgIef 7ؿ8YBFM0y4ٹM3&r:߯r-:;wo~+|M~4'N9 Z8xݻoep/8]c8でs[,1Bgm3ӦB"lN}Mk ں-[56 nU]]{) :rʅ ?EkA]w{#LNp3LLS/.Zrq>y Ơζ!N3KI6רtX{f3۶R fx6 l1޶al)w3$3Pٛ4lr 55+۵KmoӸ ^ I{y ?bn..D8_)ZpT3m<2Rϯ`"ro>Lb]+@^B\ڶ8qBQ=i}\(S,r7E*N|F 0HqMt|`ri\.AB޽*waukv-U(ÀnӸfg? wٶF^ISPy,מε ܷ8.+(kHZ+@u˲T!i@jNj]l߬0;C; I6O:R.>_mۮcb͹|ءr]]IQUx FA}Mlr-r3$٩FNy/)**L٬4MSd2*+5~?9ӛ 73v$:¶6k$"# /ضz"V5Uy{ n],VT9pK/eSLL*FO!6m1Nz(b_Ϯ>NHJ_۶۶˲]|x<z p̅j@0ݿYLMr7E6'>_`s3vװmutu{lT>o]ֽ5x4f*2i~::vq;\Q7?ݝqXyPdYl0f25JaP<- x!_PfHRYD4ϵLRaxCWF3=.nACQdo=nENi2|A-[/s쳤Ӆ%L/f~A _u@۶UU0֘Eᴡj&D|93T ~lrJ\70OUwaw\?."n77ި/%8v,TUrXN-nd9OTFAtRlVXd^R5nދu&Pj ZR?;r21# /NCGں]n{o*߸hiYReoc|c/ozٹ-tw'9^. A1g,U\ ˲bbjYdڼq# SJ R[BmE?XO|W 5{lsS[ ?if'H]s;㏱X،sӭ EW嶜TzNd²,EuV[A4"LppCt-͐҂? \aǎ[hmK^َ߹uI~}.TalbhO?U"bqW9/'lOMΐ2Mv\s~|Q!}/Թ#  Cu>PӋ״x Ix-\^MA'z)ʖ-q 7u=>n\(p * js/aaaB}`,[prhݡitEV(_#q+t]΋?2 #rt]\a]#E4MB7l2V>)T03xx7ZHF/ne޷/ݭ?^`۶D vPJU2&K v=@05׮[_+3D `˲4BQq}]%5u8*hiZL.oFWr7E6 /fhR57{0 o>IilT8|Xcpbv0w.ݨ܅Metj#l-!c]>#+3 È ,֭[| +{ ~g^Y48;TI̤mf_BoCC7v|n7.n_NN(,9Ls^{{ iKo)O _o@Vbem[ض-,˺hooW}.ٙ\|Fah%)_G?pa֮oG]rfXMKS"7RE& x!uruرN]/xZW"IcM N0 p51m9vEȲ9Ry-s׶Y̿;UAO5twDA~|KC"3REYj/6ᅴgdxX^;¯|OE4k8 eAdCi3i=r7E^ pS[1#f{*x;}>9IL*‰BVjaM禛!d$x֤IMtr-f\8'57 K4'I1t+P׳g;x>Qr̟Tdlgrft~a~yKl+]:ϋX5'JN7fop_Zr4' aY Ab0~kV*௹y+{(|y#]Y/mm#U6Us30l''k_iKfkhpq5XJ_ХuW~3~3n{ѶK"lv:j>5˲-NMbOtUHngg/B6o}@' v+pTroySOeή]w CC䵯G'm'Md)DTTLL+VZZ/p7ERuڲEcbdbXp.W C3 Ӵ/4C*Q_$FM/ru]8O%MӖ<ϢiKi^8K%LaKJE1v'ew4RAMfv}梌Xj--p?]L3I2ŸLJ{_r.M2C6` !l!m//l+bno۶z}>V\j&i3M*FZC9x_mںe=(}ƫI&w3dff̽^k).'iZ_z%tvo6 Ka, !^u*5N:-5-nN<u'.ں *۶ھҺ >Algܜz8p}ڷDr_GزgvRL1 qBX\T@UUT*j}?8}j֟)R~ٙv"NTr@@֗`P>{ZNcc/ b4f9;"̦Ҍ߼^ i3u]_r݋a,zEdz1l>_FFA@M;ҲY^٣xiwMm+O9vAhuN}T~~ul ̗lI%g?KQKQk,`˲쥥%_ݿE64zLJ,X݃}6]Sݻu5d=L]\a۶Q'8^R;qO~M3R~r^y^(iu뭷Z='y"t\HU"vzkwy4UTZ[U2x|܍ee~)}o?l9QvodiJw뺩 P\ `4 Դ}nTfMy0J۶MgfUf ]?"+砭mkL4ݑ{imB3TBTRUJ&2 vllmqaaw:o]#0 outyWɂ1Uow̟]ArcEvBgU.`72WS3qs 'mtv^G0naܛ$]΍7˱҆BO[8}DS9a R_Ƕ/CׯuEQ2_EɨLML!yС1+ȸ4 5 \G>/ ֲy,/m$v.4 YY.c&dEa˖8ya}j-֒[&QzPUUn`EQLM2e\.Wfel Qqڡ+3f!@4% R嬝jx/>C=l|+B%¹݂C\2'Io g]Uu{+N=iVo÷Ķ|Ya=3BYճ[ :F#+t|%`PR&I9\aw9i:޲۳ǐ?I.ZLyҹ\6o~ g~ɽ6e9b>" 4-(J&mbYâqdXubLkxep}3V4 7(uþ}!Ikp#.j~#6]OSrO}/ 9)$Wtt^d_`X@GvW! L ǭʒ1`Ꮾ!3y#ԴG#RdIZ;]~.`A0ZWfysC1pknV[oƎ6{[tu(ey}+I47B sssBgӦ9{;1iI7yf;ؙl` xUoZUYmg<`]JY)RVݲk_GhnPMsuvCf$)۶\y`^9~˶>o>4EKal>--IR47 VV#=%E{8T7Men*x<_!()EQҚVt]OniiyC߲9ؘb% ĪF핇M ;uLrMsQ)]&hjRwhj؋M*uv7#˶ìtf)EQRTUM)EQRKKKo.l@˙BB lQ]66v7z|M Р( $@6S0E4:ܗgkyr&}a:"n:+"t4-u]O麞ސuTBKc@TMm]Sw9aBnk\wUB}*T &+sJ}cb2ERWZw Es( ggTUMi,[-$TEVVoW,"7wݵoT.* "Ts C\Bdn`˕W %^-7'n7i8܃߬`PB Ul; %5SS>6;Z lڀ ݿ( k$Wu=(JRQwqRRg/jQ=_T2*ͭ9mi^jkwTt-3%B!?S {F',gݹ-s/ob0[/IEQ4MKBI!D*JNր$N JRp!Ӧ {WV ndP (R]LNx ~4oBeیĜ!e|/xe9 jf.y7 Jj _UcUз:L*r\I0 W|lU{P*O_#|owNBQx `I*4U*d2RU76fg2FYXRRP4x;;\"%VL*B$mN !LRrqk5Ubx{4fiit:hw7΃jԷtzT4-jbeoruv'JOf% :rPP[-\>M+>K)Iը>[ڝLL?JUj(8\Bt5ZǛ\a9>|#Mp-jH\Ӵ( !DK8iZ"i.`X$ʾƂ7sj1ڪ͢2(IŰ\-Ms<\}>ͥ\9+@]#/z<4-nŌ7[c5@`9@IiTk7@"a $A<^]Y@/:C"<>[Y{1u=jv 2㸸,#IW|79rc*hTf%2TFttY L-VΨL\VE,+a\ -Jmo[hL;7:͒iqS,IUm{sP;tS QE:+Ys%W%%By9f"yqd$]N=x3]P]Ǜi JR!-.: *ՄaY}c;/2)ʩP+d_c+En;iZnp\`pu3 TS)Imq9X *bVssi9X $YZZ_c /vm@w$aR$Kt>~DdCIDATOy ΚN P5=&v_INr7b 9IBAvjz%UUbOӴ)bSSS9/BK $4NǛ\̀~R7,I. Tjviގ C!Chlc9iŬ劮'iB䭾E?08@OΨ$U'’@jbvLL$dr$az:.q8qql5nL&R]8C(RYa] c+j y-:<h26o9i5(o]w$6idPIxr]_'4-,gL}}gUL͑Shc pq_teG0iQMӲ?ǀ#`^_GH0Y֍r܋+o$;vx IJB(]o"E5e*<1|2 39EM-ٿ/:y뭷:[G2~.}|%f[/"'Hco e-.YXHSS#PpRM 8+0j˯.K4 5J+`$; 0Ȫ.ᨪQ۶BY}e5o,@63M0| 7]_P;e(IN$7Ե8 N3ԉ{)6nDhcG=ODbA ]ze> @qrM`i!(u?R m *ZXl,U !mm'븻y rXv~89e]x˓?Ve%4-lrEw@c0\XXl\M3V##r7L@*uVO9e vtq63 #r"G\.WvGEu=J ǥQcfBNIpay[*6PfHRU0M؆VhZz%I)NNOM& #ÈVf^i1 #(J0?mV oYDicgj?6E}l,A,㑃%jFF$EQ8inuEY@I42ۻ89N笪 87&Vn6:$md'Lv7nvg'dsx9vۉ1ls:FYU$9g~= US՚0`G=K0mJ,5)emc])U/ ^`6TD2tg:<nƝ[Ena627>Cՙ73Gi Z( ΁/~)l%Zq뺵8({]6E%Z4gdQD%6msOM%ͼ5qjJ缞Ayq>~}gG28(ͿMrN68p /}F3|x}~]A)|׾ˁo8=R7տy3ݻl9O$+acs/ {R6p]W^ios8=zO]-aY??8׾۾c,L]5 }մJ)kRʚC-J߿ԙ`B'3#5 F26N}WZشŪUF0]4n/hՕd x6@4A=U±V`7c?)e+9SmUJդ5TMQ۳gOָ#k<L{<|̻06j=ւs;BFOС࣯x{;lF o[XuwHԪjr<] @| x2v 5h8x?] fs wnRkq4 )>Su;ݯ _qֺ+V BuΝ>v[~P̴S'4޼Yr $yuܑcs-gL"l[NiSp.r/\a $ tl%*35#ocFw#d{vۀ 5TB$չW/?ff=pWkVf4{WRV.ɜg2ɷQ 4҄ ȸ^j@)5kORʒwZđeʹN q.g=k~m'ψ_85uˎ㔕R9SWo%kn{L/A^!>v W_Cq$d9z'oV$g0 4.X.8?WR"$셗+$ֵu݊8$V\VR˃jM|O%  PK/RU,N8z ,l^,j6.h9r1 v^5)eqnYJYW&&&*7x?uq PxAW2 2ߠSB}瞫cǎ<@2*a-G?PrRd#_X l2.KRro?!Dy;/I؇百W&0`~[<|]S8xEK@.* @r/M Q,p|6s /Y7iQKßye󺯇aXڽ{w .l-XDLs*2DͿ ^| .A) dxT!4rjsW9'Ѳ}@v\>cgT#fs]*K)+V(}C7 [,2"hN@` &Ӊ+۷40 r9đ#j]2@k=BA3p) qdIB;.yIt)kU@߹ٲϯ`qo}h $dx!k/@?K# -hcV@28bch>r8B h˾1\x)X\-[[J`) =˙d~qcX HrҚ>v K%CؼYPGBtD;ԲϵZk0.O(=ȶ]L$uC`n9˕f164ze)_؛i7ӽ,d]D"g"2X^bڬ5 鏵ǎV>,jC2v(Dئ 3^sֺ3ࣔVecLywAF<%EdB sukej*[{b YDahqhK#=jS #bg9y[gᯧWr]J+xw t__>qdIa֑@1k3Jlܨ ?B^KmpX0A `q)X@Hyfk_N{JdS+I)˞畾 |go"^A_6!.5Zep $\@SLM4p}N(^# l?f )iKBJӥɡ/z߃@ֶgle274 pCV ^M#c15ѠpX8_\tN;${j`q޽bhx8}"~'LXi/B~3& kR)Bcn&aҗNs-,jScǁt0ucȏ^t)?~_ZSJR%ul֠ߝ?ǽ0x/^s,}鄜ű>v&al=jf G.G2wժAlwhl>\ˁ]|9X!D<+)X)խiK{ C`~7 ʴKYB[@ &)\X0=m>MզJ8&A0R+驤caO/{_ %)eiA+Y/>[};hd-lZt:ՀK3Yj5Z T[>jS&Ϳ"Bǀ;Xbg5}Njv[qH?×p;xeՙ"dh (Sjo >P*aHC|myV'A}YyfD cQ;yEu)y6?~|(y ' AR:<[Nm `|"ِA1VCNymKO1^_{ǟ isg:M'M`u)E!޽{0  ؏:~LPϲ,@JIˍ@hX ,0=-8TZI` ~+G[ 8PJBJM N+~ZbRޱcGgW.N}{}go!YT\9:Np\P\悀V7 !)eSRN N}>Jֺ866vjϞ=f_KG Lh82x~*nt:nD# `h]Ѳwx!Dr+Ƙb_mZJY}o^1᯿wL=u˼7tjd2(\iTq"(Ea>~#!{כfӂshR*+n1O+R"Sw}/j}.̴_q;W&.@@ Բaű|_=٧tx8NS)UO`:6}|ߟ^Xq y'F J4dTDCRZG FRq~("RRMqRʪl=.[Xcl/,~>x2c"@W8|_BR2]`0# P/4ڲ߫ERʖֺj(JZz={}ehq'a&Y}p)hrh2~?("(tBPB"0gBb?D m)eSk]w8N@Ik=8Ns^|og< }_Ȩ aHRiu*ih DC0Z(0FR#g4&}T%)ֺ'yh:F^Da$_ @r& QE-( >gb1pC~pی8NMk]Yzu^OٳclY/_q/{`>xZBR>8?[0%7hm\6}o"7 a!Ds9UyhL1FO`}35m!#+s Zx ,K`< rX+aL|{C槯>1ֱֶ9MyMJYm4{_״8,k}EBL@2?2X;PGrǻa~OK?|Ͻ:FEuBa$?,|u88?xh54$`_-Cxz;)!wt裊8YJ`Xc:Q(jAr\k=P&N<ƥ}cȈ ?,Pxk۳B{{Yӯy#aÑ2E1&H{)_kߧL-ٙQƳVQF?Fi5N n2&l3l^p-m>{de_Gav(pk-70EXU#K| ]f |ߒ15:k?` H!-2f"k522H0-꒞-E*k\. !d%>0sw^彏BYkGuk3 -YQA@BYwYc 2k-Ka?Or#5җ='_2k<gMFU !d~ ~ PPٓJӤKw?V(bA0F.vR>ʼo~?Z%,'c'B!î @J 9;t?MG4 sxT+hG}bjS!~X㎀ӝq%7j|O`=kXx@BcuP0!,^S2;vln⃯ ׾"ȲH!dd϶$ ޏoXy6#2ƘQgBcݼy3UƇ2m_i X=!pa6H!KDc2,缻?? ZrYL݇/޿ 3lgܡZB+0,@r Zkz}n^ S}_׈&d.T2`@T3`KaR .8MY4cp)vuc>nbЗC^7$wgN!# cc圛 1clV8@-O_!Ľ MG bs?K0!F>ܤ@ߴ xjjjr>` :;A}mH?Tի;aιRgyfÃ~j^x26 !,l#;P>97i%0mR__8 66{[ YuP$~Ei?#B$0"{%V^G6c|q}1d(mYa BEX(IK}c-*1~qxtЗBRmdBHV d͙Gaì>AX@ ^.^< 4 "Ce{9@ !,&`wH_#k0.31_-@Ne>B2vmVc(2Nn0q!pЃhvy?0BH?h]9c,BDs !"u$ɵ–opsyOܳ?bȨd 쨁Bb'<7"#+0x{gAk:'2T# "KI6B>ɿ+0>||f}~@nE)5v(}ՐCa7A0mwy#9ʩ×n OZ"+ !!jU(8ѵ^;^6W0A -X׏!׬1>| oA| Ȓh;njBHb=֭ä !By R0H)5!|wgL'!0 -vC?0Bk~_=>0RJAAYM>'py^js7 fT@BB1:ÂLLD> >ww^}qdpwegN!+@~kvl( 1&t]7` WL}E6 Ǜ dk A5!'2q9AT)e6 !X` #; `j>}8?b"8]Ϥ3dO<$:skÀsp΃dp9A2!tP(F00fq&>A.;}yd6ԁp: Z='ev[) |I 81&dB`Yg_QF x{ށZ̵xgO`NSf B!gs[H*}U98PJ_~95}>ai.1B{7@ҷ;p٠ϜB7lhC3ƂdK 8>c,Z P~Ϣ|ry kBYOι/RJ?_.0|uA,A_ Hw3!>Oc!ϓA i_@G 5o& |?`m#,8gJ^S:p,>f >{BYF ի;p]Q3*/'''G9Ujm܋ G?Ҽh BY1ģ3{ygN!̑{lЂ(A5U>s, [a Wf(][2f is뺾8#H(N>?HEC4L˝|֮#hRhB#"sEXI !:1_)aAG (GsBٵu/l18Cտ5ZA g`q;69?gj$<eR.!7zu'QJu_GJZw A_ᰠ B5 H/ y/ ^b-GwYu~_ B!{lO!l!0v;RʎwUZ\ ÍXi-gE;}t@kgN!C|677տ-ӊ ׃b@7$#= o8x lsүڒ`BȐ>PjA9_zPbD>^F?p=\ ]LNEOvfb BfYͿNcyZٴi5 R/> ÁE^S o,V~f#G"raKgfeKwn0au\mZsN׃jDK^| ,ji0'A#^2P_Ho9l&2"s}2D7])<Zk;fg8&C(B\ X<|!gK[GcǗ BUE?-#۷nMޯ8>>NͿP1܋ <$߳ +> O|?W6 BȐ8#4ؼX[ ~B8mq?}ꞅ7ůdѿA0.k5ċۍ 2eJeޚ6 !d;Xڇֺnqyy) aDM!|vx?ߖ q?FE_K6`mv>U}b[x׋g.ʸaĥե-B`p*^۶ՠOz`KJR~{<]{BYBdڃ1맠ֺnٷn9˕R YPp_%|;`oЧ A q9'KxQc38BY5giSBvvO)B8-)es*^UQnq*V fH% E}Nxr4'چ|!Tq0kp$1Ulv:\.n:Rv]nYk]v]w<+fT\)q1_ yg'ԠO go1v55&7%OQ>_3Vuz% wUe*7E B*?YkRMT3[K_sˋ +$L~۬52Lut`ՓJVPW`$_3V!@bӦ;"5ʹ(hzTJƚv 2Cp0 /LNNYwlFظX8*3D g!x& ?TSѭj8VE?`& Xkߟ{?zmTjBi}d(|6mBY) -nw(0PJ|><O{vlllwy1F^UGPؿ_/W?}ѷׂڍVN3 ~]#äoBwaVMkt]n*ۻwo @\߷YSԾs7ՃN0gvׁ'GyWV! '#^Bl^/jH)Z[zu& 6Y$'>%\x-oj^]i(ZC3υ PG6g"}Bx \uU;8qҕ?JֺJ[n>+^.C駟b1jVzv=㟹3ל으/f::;?oh8B<̼W.o? -\.w"W(}s\.wfXҪE y]Z}+ 90 Nc\cm~Շ, Q K#7ǎBHB?տ]Nb8|>?#zw"y9Wkp}' Ct:EΙy^ Ќ16ƨ_N'VXTQ=0|˴mҭc;!B Y?HHʪ(y*d2rpC8/tᆮqC^ X XƘaY&ZιI^3"ιF>}CwYL!sp,W_]LW@WRv]׭k6nj@L6= 1" 7;cxc1 n}Ng+ß`J`$#>'R~2'8] $a {qnq啥I寞8(h(TmW\Q$K* Fd=nv[yHGQ(RɤJ(ʠ4t7Ƙ@2aEQ9'p#_4qΑ?13i䜧U? XkpΣu9‘l^qG0FB9"oWQ(!'>Oày+{GC $0u+~~zjy(ƘB(Ƙd0 DE6" C&1&EO[gaB0LSiKaZh1okg|F!_Nq]K.)wNFjKCR.~T d$SDkiرcq庮 [t]Wt:iͿ<}Lz18,cZ LCliKΫRTL+Mw0:?+͟ D!=p=6BNo/i9SZ{I' dY8S'?IsNq~zPDQ$ּ^ ÐGQĥ<">!39 ð(zUBtcr΍c,!„ah}S("!Dɟ~W}ؚxq,/G! \mNZM)>Q BԩQ$Z ӊ's9r9~Wyjx>gRJh4i/V5#zg "lZ8& CݺuktacǎRkʯ?|b!d@5.qNM|UuMJ }is]+A_JCQ[BX_PowB{zYK.9caOկT頏4rʚ5kʌ1òȨHPH x>xPHnCYJ7q"\)%ʓ*_eV>w]7WݵkWoL2 !C#!/2>~}0\Ƙq]8N9 {!pv5;o9lL@|sB:x\wbzC^ʮ떕RT%m߁QB]a!oxux[^Xr)f?~}2MMLL[~F U Yv>0~ ~/ B!;!,>-[Ҍz}t7u˞2\,K>$E@BxiBF+ogX;5㵤Wv=u9XJYBT<+ݻ;1h!Wl9fCYT'9 {1h}zjxwT.rySBaqSL93֨0}( 1+ArS>?ljp'fdGqROկ+[R|>_޳gO  !+½^E`?u@ !+ ᯿%@o>|m1a/m<ҪUo8P0!+=? y`ݠ/ Ķp'qyޗm.;)uOrSϧcccSZSׯ?k׮f@ B#7i1+lPB%/Qf۶\-i-zWt]rֺ=+r΋6l޵kH}`1|Р/ٳXwW?ugG1y,[Zi`J<+}+_C YHypZX ^x+3%!-D<8k~.9Ջ={u&tTQk]o2CwkBFp[uB\uU _=[:#oZk]>>}{~P$Mkx·'Ds{ 1֮Oqf.8N'IgLZ* ! ~$ d+jؠ/!5x; \w)1#Lڞޒ8drnRfOL}V @pK}q  xNͅqe9s?XTJI+V\-+iU>N޽ B:>ӀMzy;@sRE<;v !:Iof@u)]7m<ַP$=S-1]`] YV,'|u qM'1>>JFOk 馔*rbիWoiƘtH{Oօ=6k},)Z#qc_ JkZٷ< TJJRP{[ZV. &%P/>H4R\!^w1\vY]Vc3ֺy^Ik Gu)˕Ɗv[3"@BH_nB< $+aԂq"p9=_9 I8N) =#K%)e;y:dHӾ+۹4H,Uģ{BZn8\nf51Y٣8Ό-i-k˹\;DJYVJ{iy:dHIOE<xW<1/b:ֺʽMiL2ʭVw֠5t(B=w.5A_$!s`|X|>uMaݺ !:Tz*~Zn0jժ";z(Bȿ] Yop' ^-77pg[s3ڷ>O*}eTY8ϗ (?IeQ$,(` >@oY!Ҵ1dXL!^X~~5Lc֙cu'u _YJYOP !Kh90;/-w/,[7>㗺:rJ>JzR񫦁/ *8NR"87vܹ !d>.͈'0y}oxEn>"֮}RnTR𗆾4V[r)eP(Tn25HuwXkB>KTjJR8Ό 8`5 I߿uW_}5G !d0`o.ݷ.F\܁xZ(BL \ĕAI<oa u,7i( ?[D-'{q;A ژ -liK*3&pNv4-5M)eq`79SWJ]׭k|FRHY>s>kbˠf&!\J*y\xamīlΰP Xض9=ۊTJn/  XB4\.WׅuSSS5օ,aByO}*z$@ q07k?!0:Z~׎mz:f3zDEؼ[X:^-1f _; yn/6gW@PJ5 Xu y^@ !#kZ/СV$~+6nlc6lhn-l' 647`7ga5JRaB2&''{OwJ;Ȯ`VZ`̦}BNo vOkki Lj>/ NӜhr-uK@B~6711≗Wȑ[*7}ndnlƍ-_!:IpI`[)NB_sZI(li[Z&3j2ƚU7|3K@B97}5ܟ{tKc;s$1! ֮`&6mjPRʎ9{B`;yjK)=t %h9dR\.Z7;ػwNjHH cǎ (lԧ [ZA(a aC~9灔O^$u@4{`Z֯u/82*(B"ֲ^xA9rċȱ:v (: CE6(tE*3{Z+R),jQ^7f Chc |j0"#| !#%,hm"82uYy6<rsQ)e٤\0Ƭp{CߌǤVYͿ*`@L'>|Tuc#h~GF@BYbZqcccNZu(J)]k*kP[kU PEQ>edE2" @c1FZkEEQ$pk0uGk-c߉ h`hpgc#6q/L*iSp $U@JmNc08>>t:>6KF1! J~Ɇx@Y18z* tcLA0TsiIؓaJk4ƈG>&. <"cƘ3n*YgUsn6 {YU0}L~@cL( R6dJ)?EQ>XGkݡGȫQB?:,* }BHqeR 1iI+" (1Fx(xZK1v?k94 !LO6#(DIZrC)eh _EQ0 _*|>#Q$eZ+yh4tVBAZ-aZZkAdRa "q arÐsλ }L%AhRJcR/>1=HJ Th XkCkm8N` M7I5@BY&''.q1庮VIDՒ=MiSp1K)y1Ƃ EK DQ@8aBn/2ksn04޾=i7 Fn7^{mH5Y8 !do~͛Ł$\Zs5aȣ(\5 9gA7aȴ3Rv+J)knB>J)Ro|7VI!_5u Y !d%s֚I)SO=7n܈ifsJիWۓ'O}vZ{1\q& CmZk5G [2\/5&Ylj%tEXtdate:create2016-05-11T23:47:28+01:00<%tEXtdate:modify2016-05-11T23:47:28+01:00F|tEXtSoftwarewww.inkscape.org<IENDB`3Depict-0.0.19/data/textures/tex-source/keyboard-tab.svg0000644000175000017500000002431012640746376022456 0ustar pcuserpcuser image/svg+xml Tab 3Depict-0.0.19/data/textures/tex-source/keyboard-ctrl.svg0000644000175000017500000002240112640746376022653 0ustar pcuserpcuser image/svg+xml Ctrl 3Depict-0.0.19/data/textures/tex-source/3Depict-icon.svg0000644000175000017500000006265112640746376022345 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.19/data/textures/tex-source/keyboard-shift.svg0000644000175000017500000002264512640746376023036 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.19/data/textures/tex-source/keyboard-command.svg0000644000175000017500000002224312640746376023331 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.19/data/textures/tex-source/plot_zoom_y.svg0000644000175000017500000012317412640746376022474 0ustar pcuserpcuser image/svg+xml3Depict-0.0.19/data/textures/tex-source/Left-Right-arrow.svg0000644000175000017500000011302312640746376023207 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.19/data/textures/tex-source/enlarge.svg0000644000175000017500000013403212640746376021532 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.19/data/textures/tex-source/scroll_wheel_mouse.svg0000644000175000017500000002657112640746376024017 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.19/data/textures/tex-source/plot_zoom_x.svg0000644000175000017500000016001512640746376022466 0ustar pcuserpcuser image/svg+xml3Depict-0.0.19/data/textures/tex-source/keyboard-alt.svg0000644000175000017500000002224012640746376022470 0ustar pcuserpcuser image/svg+xml Alt 3Depict-0.0.19/data/textures/tex-source/Left_clicked_mouse.svg0000644000175000017500000002230012640746376023667 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.19/data/textures/tex-source/Icons-licence.txt0000644000175000017500000000531512640746376022611 0ustar pcuserpcuserFiles: File:Left clicked mouse.svg File:Right clicked mouse.svg Origin: Wikimedia Commons: Uploader: User:Darklama Licence: Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". Or Tbjs file is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported, 2.5 Generic, 2.0 Generic and 1.0 Generic license. You are free: * to share – to copy, distribute and transmit the work * to remix – to adapt the work Under the following conditions: * attribution – You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). * share alike – If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one. ------------------- Files: File:Blue_Glass_Arrow.svg Uploader: User:Everaldo Coelho and [www.yellowicon.com YellowIcon] Licence: This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. See the GNU Lesser General Public License for more details. --------------------- Files: File:Preferences-desktop-keyboard-shortcuts-ctrl.svg (renamed to keyboard-alt.svg) Author: Tango Project: Freedesktop.org (http://tango.freedesktop.org/Tango_Desktop_Project) Licence: Public domain --------------------- Files: File:Green_sphere.svg File:Blue_Sphere.svg Work has been used in derivative work (program icon) Author: User:Booyabazooka; recoloured by User:Stannered Licence: This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. See version 2.1 and version 3 of the GNU Lesser General Public License for more details. ---------------------- 3Depict-0.0.19/data/textures/tex-source/middle_clicked_mouse.svg0000644000175000017500000003536712640746376024254 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.19/data/textures/tex-source/plot_zoom_reset.svg0000644000175000017500000023322012640746376023340 0ustar pcuserpcuser image/svg+xml3Depict-0.0.19/data/textures/tex-source/Right-arrow.svg0000644000175000017500000004252712640746376022331 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.19/data/textures/tex-source/3Depict-icon-anim.svg0000644000175000017500000021666012640746376023270 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.19/data/textures/tex-source/rotateArrow.svg0000644000175000017500000017156612640746376022443 0ustar pcuserpcuser image/svg+xml 3Depict-0.0.19/data/textures/tex-source/3Depict-icon.icns0000644000175000017500000025415412640746376022503 0ustar pcuserpcusericnsXlic09XX jP ftypjp2 jp2 Ojp2hihdrcolr"cdefjp2cOQ2R \ PXX`XX`XX`XXXPPXdKakadu-v5.2.1 Wk@@j*q6ttة;us,eEc?>k w!gSqgx>! >z!}tޏT)֔eu"'vw`8 b*#oqQ}dvU J,#_ '3K)zM u<&/Ӣ  8{Zid24JzbC2Bj)iyO&K?J}0E3Z4|`Oߝe} tKI%iʟ5GA jO &L:I:P&vIh;I IaPveD4a󗅂 sJ9m/JШ`z{KT^^?[hgkyD?d[XRgʶ؀Z.܇%'XoPm-lS7 M7TRH{4FiyK:ߝ:ʏAx#LG=b-6ܳ4cNkor}7Fxqa%.{42J,I:P {hDkHjWL&z@_KWB>@| |4cǹ)G1mQ͑KU1_dCO"MSqƗƸhRNB4!(#[P?R ,~mL>zKulN+b+|7B)ؐj#)J)\٨oo-iqTkbcxlvD4BH)i G+]6~C埞<w5t9t =%kv q & ҖyPtQa%bmhTYeQUv0T}-/'5KI;wc|m֗>(6KuEK!yD.DiiO# .8GJz:WƜZB8DV|J_YR!P=fVt_t'nJvҹ`-Y-5%|& )3%)&_ ͦz٩5(’ g5/q&:+qr5R3>F2ݻNn1ɱ `yq/7L=Dkwido (*8B,N7)׽_$TjboiFߜގFNC{8|; f;1MGQ𨀁-E_w\ ـqW NSG=$*(l݂DQ"4  ;ۓ-0dc=n^6WW:pB 6Œ|n@io%.Qg Kn" #PHN0>'!_y4^fg,+Z@^˅*e^bNuňȝW)wAMĖ|MߦyoW6ιT>HT wy#^!?*ƠD(>tm9(t{ rhۂs&+ddq]>#FM14?[V``wpxz7;Ow21wMs޵Є`E9!R't!|:xi𜦄_~*dWkjt[C@]£qnl>:P^ՙZHQVq 8'VDBmECm]aX? eB.UI 9oL->To!!ߊ5C:m\?䓦>o1tT{_YfZ}JORF.`hZ;x]!> k$}p@=;_ ɵlF\O*⸖!"PlC g|wV4%yN2+P6w7>|s6Nb_C3>F 4 (;:|}U11431*-Vg&mp_{ol޸GTO[?ƣ ј< UCU(|O7eFtU{!7gxw`<'oVAsaҦ_ZrؐPio#6΀‚΁HWQB~\*5db~;QUdgkk<*nutA, :o{%ѡ̩Q#S$XW;6E3259񴻡374Sx*~?m? N\]Oӻ6heqS_l>Kltk ? Ay+9[(6 p2&ˍ#N>Ⱦi >N^ʑ,P[\i1?٢~ Qe&PLA'Վx+rqurC}vRP p -DYYr7, fΩ(\Kx젞ʆao N2bSܛGCM>^Y ̠{jJrfMׯO%j`DQ&)Zkњ~BmS@c:- \'rha`^i~1ogw ȠBpɆhN#݉.˪AA^^'dBxȨ&kVKسgC8('v|E-5{ws nfwںs I B/#Nʈ('>M)`mi;3HYMENN~#ٳ_2~gIz;BaadeKY5ڕÐ.ݖT1kDU%TZw+~ej|n|8rgH5~;cui} |¤K[>r| iF9[@\[Ft*gKE\WkT\y y5y'1y})9</eZ> 1\||6fZAm)y?un2l>0 f=a,SxՇՖ)>ڪͱ%zP.[6&z"S:eGr:?,?u`3!\n˝sBk*GO M]3T tvfE_<'?W{} 76(+`3%i̲c̡gZ "IWi^`ZdžaDRQP_"kIS6b2lDY ff_8>|I,kZ+hųi8珸 h,A'B:?e0ӊb K~e>(#%՗^r(pD:`\ lH ¦H'D޿+s-)b!ޮg[s"AF^" 1r֤˪zF>Q2dd|~)"]N$—58桵{MQ q<_ "$`ZM`e~w/Ԥ~6;|ECld? *sƋH4S^3jqYA[&B v=0+["T:i@dITrykg5 kNׅt^^8}PaUnK/zCiV҇SN+f5nK2Z_w:s^rA ȗ%Xfl0XMw+ $r. ~$4R`ԥ2r*OgC*9]ڦ,S8,pq$_KXZ^+7A+Ix Aѳ~@giHa|ޞtM߆,sڸfOs½rcT8mBeB1Q&󈐎؂#o/R) ?YI6ꆘ1WLaF/q#ܶ#4_)l-*p4\\\ځ:XBE)ݑ5+XrT&--_.nR1%BDK#wyKyߍ3&YRL$rEA[,=["dUHyE.5EW"!:dc͐E̴Kιh=idf#F&' V5Xzbhe+JzΗˣ~f8SE(F sr++z6ׁbrkpЬro꽧*A=BYϔ:-SbKg{\p_{:M{qĈ{j⤗dI5-!LOiU, -J,t㜽V2AVmBZ6'w:%nt H` ykK=l6 T殂xA {F3HF嫬3ieM^# 4KTdJORvceyU5CC64c8ؼs ~5!`I\ ƸwCh7S'æ(dW9t#FyPumD"0Ng*SCnD<^irVr{9dJ%ڵ??.LYiP͵~\`5{IS)wGǺQMSt\*BIj%DĬul8tE4I! {N~Qe;f~kg`g%%^Ac1mrl1ʴ6g3 aB%̺qwAñwh[p.7&+AϨ{Lm n":@:E'O ϓovüً2GO@[=H' 'HuvEGMyO0Kʐ:]h02)-$:+$ .H7Uv=bN3fx.b5Q-kulhud-7c/C(ȱM~Q|?vH m'GROTT~hX߁55! nQU7e_gHE`Zꨫd̥pp&9"ť"B-UO 7Eɐl&1w[A>VK-_GMAH% !J JMg2?g]exv{ 3\/#qs^~݉_2Aj4]9 !~2¢ .$$J@ҽD7z&]OC擥#n}+xȄW:ѵMY kd/c*?APCg_8OB!{e&Kgmy'ƍ_xTY{ A麷GR-UP$ү"#CSK+;OVf: 4zֹ WD1>6`|> n /^FO8c!PnWͶKuin&lcU 7'3XtOEX^e ! 'äZD;t`cpv3mn9h1-_>vb;yX6P%K-QP`[MIO8~9_΍btZm!>l2"jj|j1k:9hQYix$xt|VO<2"K ꨘ+:m☬&oQ۠fT{cV htf߆*٫e;LR^4ʱNŚʫ_(fg,E=PUk ZDjEG8lg0A]}FI [F,CÏ 6*1_yZxp[QT{KͫBś"x+'ď7?ԥ[UP k2Fd]>*>: Xpn'˦f6G1|πbZωL x8m2¦F(sՑ5^x*p%gYס;Ğ _TKeC9yL"&e|`7nG( FGYh\nz(D&]9\v;Ӧe;No5cJ` 7&gxoܾ^UTqP("ԧDߋ*eCI/d_ 0QxWLy9ցGsr6~t5l +`ߥk?V2aBAu 6g /;qq?6l"ND֮.s1uo~~{g_0Nu :pu{h0|| gg j1Z74!YC2?s~p7/4 $1+#W#ILiY]1W7 e0yA<?ˬMy>(U.[ ?:<%x{#'ɦ/@T1Ćenso\6`dI<§&P}ӬT L6Vs<5VoQʨ©JqdG]Vl"rD2CEn(.~Q@v[qFrZ^t\L۴(#r±o P(e-RnQ$=!Bs2,E9/gʨJߐ[UF5J04*|ˑF~Rɦ8쓏>gO>IȕhjC])IJ Yxx " 9 ~yTcJuxdd}Uka !E2"R~@x%H֣Cے3q@▹SkX&fb{.E.))./oǠ5gOʆS_Υ+1Q4n&;A8?UbM_Xk'J@` PuxtUHPT=\%!Q0uLsJH>.´ݜ<%ޏJp_1Q@  1W^r&J>heGF!8f3SȢl G|0PcdL[ kR-Rl!)M?SalӵO7TXw3$LE%6D5MGm"У.})tE8M-*NsĿSv*K(J#rZ9Aq`]E0K3ܦArVFOc?ԕXIAa{=bI=(;bρ"Ex\DlҧZĂ=]?RI/t#ο^t:h⏙nv3{57Hon[cB?e%;k{Yg^b@hc 2A@mTZPm4yiֆMV${8qo%{#ޟ z#ođX[ t>aQ!D[UxM3^ xָsҳtXb/y$iYn B2nО6&>UyRL/\"lGR^9ME|̇^W[6usg42@GHY;1 _q4H8;dڳ}_~ퟲ)|Wyr݈\w#=~J JpP( =@2{<35j 6Dx\?=b @뗐9sa-hMG-,烔/auS}ʯQJ0b҇Xc8] ͫ,1eƠaS +鯸nT#1$uegw2goGek9N) .->&+Z17y-gy J5%qrsUfXu{q?p\2i)g>e14UA?󳪔+'EUr@*Yr^Qv4)ܛO*ۙOb_Pʢ2zM|\n+HE2$؋]d?Pyϖ>6#4yµy?[+.[TPUV,q~TU;Rf^KiUKeA}IE}Թ^~@p6WQ$Ue3@h/Mv%f )o{8?hD!.`Qǽ+NGǤȒӫ|O޲B翝5ShfF*#<^k./Ŋr]Q(u;p۪ǥ+Oz҄!Q%.zo3Gn2ɩE1d9o_uho6C?dj1qt*CSf 8\M/RPJ){s;-taX Œ}+.irjg`85.y W~C$~C9GD2dɰ=|,/h7UR\O8Fv;˷oFU> ^i~38Nf[6 u6Ce̕kBY\c~%FTeh*-ZR򜰆m3+9DUQ\L|P*Wnm8 x[gP"ΈtBY,%„HtP̫9TB8ٶFzcKo977U!e\Nwzho_Z dY ؋WjJަoiU!.{8 tNjvk{ng1[ hјM@]C朿 +>E(@k؏ԯjBw0vV#<3yFiT%_\6B#K% Ȅ?uCttqG[f$ i;OPC^;X+FEq=v!~'|dEՀ򿗂{Ay]ZG*n#GqW%EW@s<得q$M^6ls7vxhAwt8ԍӬw}kѩ9]fP2hE Ilo̊1"Uiv&yܭsFHk xa"R/A8ݨt)wP!LJ8;i1n}CuDaNA!&A{r IK5k$_Wev4^|Iʼ2vieLB"qB2NFGt=A[e/BP:T`N*2^[rkKEk Z@%{`;T=DW|/6 qF۪*Z#!.|E+ЁBuh5&kz"WqgZS֙}^JDWnfU<* [xwM[`ԡMeƿ-~1B2冟yFRwA@'~ La֙2\z$twlE8'GAnǣk]=1ep"סA-::If$& i7N揕OCtmsހ=tL8J/'= AumK:QZ OGό)$κd>UCy3E|XyWHPlJB(0U:4do :.~nn(]rzWq7mBaN${?R Ք>޽u~_4RzC땇13d~Ir@?cԘ pʯ;.$\a,nFn_,\GsNaCD8El|Z&}nSWOp һNAbl9&jnq<)a%R^ʴ` пɛخpғ@pdNFN񏜺z e@A "MX&m^%>B}9oz4C ]{Z%XdȲ@-a(k<-lB&$*2 )!а99-}M->d_Uxy J^|ߘ/ZS*m$f[+ ;$i{hs>2nIp&ނ8W I}:6rY 6LM9-*><>qU\|ӚJتX qg€&&4R[FH;^ ` kdR\iJcEZ^HD0[~:WwnX8L$3fj^)~Fޖ~ ?yͅX N$GJɀՠP"Q6㖧z^hأ(*Q] ;S1 ʺc:v?u)Wfxp1 o·%RV^K!n*tYK D4d_UrIZ7Df"詘BSNecnk8caEw#Ym]7?DW 5rW$n9 ij25!JcɎNhx;/oO^RąʣӲu7Ul/X CxfhD`hOV .8T9/jvoЕD%  @Odob t0Ϫ(F_q)ohE8ux|k'6ֵ{Φb~υUxb)BV`=nk^CNO]K({,X]PͮB f0/~9 <{;cOnehQ?6djPrz2B::W\Ot p1*MQ ljh p{WO̤2؇t/[4DWXJ~z띥(:IYmǀ6Vg"*fw .OۚͲQ-4o$;[沢<tPJE.rȵݥ 6nPj + X-] oHnΫWi+-}7t{T;yx ˝^}E0oX'6IPw-T~Cjqsy "tAs{x.{R3$&"jzbg2Xm'˃@ J6u[4%'RpD"N{xuX|9oNgfgùMELeSRq6$`A1/.x4Ƀ5TGxW0Nf"H ӑX]\ t;^Ƭ+jrgT~Z]`rZԯ| ]uVcf Vmҗ8[0/8XHqi Gέc# bSh#`A.xJE$9^3kcRLURaiqWgZp\C~HyRzLJ쉕 R^6Yjrk*i0PӨ;|Ӓp8Asw 9L , #@2st<1 [(/kh)lsbtʬ~@T:ίAÈUq)N1Enі@*3{\X{+s~[µEf-S}9СRa?ROgh~NƬ{Z[t?s礠ך<AWFQ xImJB " |]b48B )_/Mu@\2  P G:>2N2rݼTTlgNTU Ҙfn@d-%ϾGyo{DKmaz+ \hJ>=\a]RdcJKW_]M'Y6Ư"ybai#\^ĉy bxD,'"۠kX.Gi˙[#U>WSe#Ok7zaLq3:r=4{tTw]7z&k75WX__}6뀠t1ԃ[8}A W=s@V6D&K`HOqBWһ\hJ02XxӴ{60V;?\Te8sJ;i>l/yTc}V;j*6ZtAuQwOm/{쭖1X60j\Sa<#fGMDhaUoO\/SJVF_([3cv3! 7!lŔG0_G3IYF-}. ,~ tnS@RT(K}ugǫx&jH(>0p^h!O~su?&hq1nq ]$`XrޞF_&6I'F_U>ctn_=6u>78>VTPN97<7WN"1Wa864- ="w´hZT}C['K [m뻛jSuw;T>kzCW?Yös@b*uBC٦i<wdNK{ڟq}A[@:pι5TMxm8&棐@Ð7o< .-4WXq+rJg% /,A^wۿ 5H>nrCeiBZ';@ o\ዊ ^mXl+*^{)OHX kfKUyS/f36ICGmVAш㡴eR.;귖s̼F]bH|sCQt&*1|;Dy r}|>DZmfueVh5%u8cKGNΜ[KjI5* M#&=EtK6h /I9uEHghImg3/˿xtNJj3|T!"!`^whHdtmx .lT,IE {.iE܀ϕ┇XUQ>Yx6ةbA!( vd`I̝1\nA ^MC 4k0BI8z@T롌 'aQq8f3CTc惏YʛDۨABtGa Ţv3|{h-6ܧF2^tg8Wj y^H;(N Ҝ~(4g>ɩIJ"{GtW+ٕ<=)<Ч/&"1˱.B1dfp), HߖcÂ~h$Ko}ciI 'w݆ LO p-M4lH!13~;Z@pEzR3YHd: ^ܢ${`l\XSAt*f|WN4ޖ%L iئjHr 켎~gg%["fi+=qY= (,2ƠʀSGt{卤Lmgؘ1` nӻpY),jΞ7*p> 8$} yذ)4.Hu%2.ROfI-=O<7ܦ$pS}8OWHj:w%!c.5װ-!CEi$nߕ,qk'zm(ϝ+A+'_+ ddl=dI\}^w6l%Z4S M mIhJ++e>䲙 B!tjxBmFUhh]e^5G! PϒW% \KS {I3d[‰!*=-_Eʲ߇Mrx@`"q>EŒgbBYfjN|ӮfΧa$@ࠬ; ZlsDz7R*ذ׈5,<'RP))\$jz,H;C"[۸Ӡ짜*Jf aP,V#y ߇W k-%sú~m5KGxb3cXV6ʵ-&3%ã]$T(A>E>jTHAKz6+a[ݗ(Fd4\D 蓮Xa_jM& !z8yv*r>Ba_|l*Є&y7ٛl }_%/Q$Tnֻ[@fc)5im6Zv[M=<vi UG^Ko, 0x_H!7g$GIͱeC. l4O3-u^\vY!3H`@{!_\' dS4гxl`@k&f d?)#o+/^mbhDzqbBqz/Dukn _6-:979a~mbt;o^e7_\v՗ p w} QHqڌPSEm4 M!AQ)T vZ6X4}jSY!W~ت@Z?P LB^څj?tP:&M{Q\=P #Q'/O5eέCBZ.N"M㠉`5m 7֭rBn'mmA^aY/ } |vr4Qߩi{noJ3B}9T4( Nbv9'f˞oַP>! Fj5BYlcAsȻq> OpHgˊ]6ݙL6y3 )}R:Q?sPWӤZh'(-F.~~|^ſ&`Ci;E̩Oz3Gܓq}4a@F蜵 D3>o^~9\_S?9e'#-رQgǍ^sȲ3'Ԭ<@靻6 #YGʱتsQkd$Ŷ]4ؠ{lK5<*M@-2Wֳ ?Gvc͆.vHz%ܧ" eU/5KrƁԷC&_[ 鐛#. k*۵O˘̛Ӑaa K+l(h߽EŞ%R.â%Vi fcUOC y"H`kq1h݂m3 ТǃZGnNey#gmKF" J1暰K8H ~`rV?X-`y J)^{ۚ{cL[U6Ee@a~QK+lF(4ݹe7ZͰKm+KnX'HW_]ld+;!r8A8MsG;blm\oi)~cwݵeמu]4qt9NX14u[VMk> u }6W4`oI12 G=EeZoьџꐄqT*ԖڿxXFp|>b]/&&zg/05H0ei88Z^Ĵ؊EKt28=v7Ⱦ\A4lɶPs p?ܾ_8 YV4WY#nNd2K?)Z9uNcbb؏"h~E +({M|hVFޅp"v)FkcͤBgmycWv^nv]` bKHF"^YQZMƔ(D"x !&U]#u!~4!I=D+]p\aA?[2@}\2_qBL:^ Yuf!4J~>ѡȊ(E0W_ͥ|(~ۃ[Lٌ &΅WAjC[P᠀ ;2R?M,sN%K-keʃqQCT޴^Q︞ yQ;iE. |p+>DN:zxG5OW;+[&l㻬^"Ҥq8ʘZ)m$(wRih1=ˎP"qHޝLe)-s6~m͝F>w\VvJm9'Õn#$v-_{5Z#)PZ>ɤVL]~3N /›640={&·jC0u%8v;yc+siK#TUa; u5?s 6[Φ0 ozǞLp0P[,#Ѳ\/I0@a{G*ɧd.Y/r0<)*0I`XqXFx:{kd۟B$ \ԌND> V#V2=.nY=8@>yəvccaiX%J GS VrER g>:P?%a4)2; ;D\`Vw =bbs;ųm,L|m֙Qg-cD#ۋ?O<ѝL0CFOwV AƑ=bWu: Cve'mU繾j&Y0m}~ˉ0R$,p4)*kTVu.]O@b<~5;7UO)n./[X3X]DM5dJӵ**"B^3Yz#y_d"곉U}Ӗwr.GJbi$lbhQ1/m[kK%j$VWK ^֧0Pakީ1͏r7AFlTV!-C&<\, =ߦ(ĀҢaoNT&vJ[VxhӔZץ=I!-ߤ h1H`%n鴴fp vsRa~xS(k^!U*P05E܂h@p4$l0ǽ0Uu+J˯&]hڅ90Qbr (82RV Xf:-ei-P $0:oO#S+*cPӌ/p5;g!zaPv(DZuYhzgD#hH8'e޽؈zHWD}@rr`bm7YxB DFdi)3&u]qdw%je |ZP|h^g[ vj:M5)iz_"o n,~:q4PRk U,Ka*Bnm|na4h5R%(/OT"["<ʷo!oI"xIà|&I=\ɃGRQ>4m"S#C#7oaYʰwėG*A+r6$ɸye֐"xҠoPK5 ma蛂%n'/gVuuk H"k85f˧ˌԍSE?ll~J4`AH2T}KϽ4{ߕ"B'øm5vW4jC ;FӄKHj聆(Z+M COb~FH 8߱T8|\$W86tд0ԇ6",HMLGO Pfwn bH缠?[ND1Um/+W04Y>CXXS9b:fh\A6HV71e臒a, 0b? B} u#͔!SMbu(I™SéfqQx6>|V?ɁVɳMXĦr)dL10_phG`1Q5Z}]U7"/K ɆŶKLҐY2*5TPoۺ %Ug¦bߢmH')\ɧۣX?9@E:0t{3+C&ܠFCh+l|-n=6g!o`6!vAn.43sE+g8K7S%$*\`]aW^`kuS}:ݬ'uO}ncu[}o@w۴`9G$F*tVs!z'UCs&oҊS%wvOR 3eu;x%^yo/&SϏT@-3K5:*LPdpE/O|l|u) d2ӐtbQ鯊͜H\!7 ֔h1ީߘ:BW3ވ`u}f崶].y= 'x`O9Ƥz7c~<^ƣDwxJho1f[ c:;{+$l-aR:'DD2G& 0gk:V NYfM t+\t…v];D]aGCiXsSz0Lp.A6_쐧zeɖ$ÉU8t\ Pi˼ݰ'|rK"7 ~uT\2ݨe@%wE= YAŌo탑GGO ;~Xf,Dis/5{eɛS8 -F8.;75s2@I_6R[zB`=K&cn{%[##|Uxd&pSxzu%'bҴƨAZ6K%PuSC!0)sbz(Uns ::<(NtrҖf/Idg"P9aT`n1t(ڃ ]>-EgN*P~*ŀS P2fl!{bG>^ DŽ&U%yC.ǔ9"Gz&PZ8t=5T%x"Ǥ-Kd]u&pPT{p˒3/ːECodm\PIQhi)εM5lР-i=EkOk<z9ohl% i[zd =#{!-@I#"e}d2K7;IhP)`bQy12(G#_ =3 ;0!՟`xe2&|p@9G`vO_Fd,`W'tPE8V8fj"{hJJނ 9"or4MVѦ7V+eA3,dzz#2ov2.rzjbazVyH?)idcӝaٞ/8:JgICZFlB24AzFyx"sخ./NXXk"͵mN#t =FSnVR0FdsYZarl4D(fԇahٹစT\NfʄnVg6 S#yh9 ?^hO@7=zyxz !ZT%ķtB9YkO܀wBZ4*K~<]_0X4 h<3JeQ{~sg֍aRh/dٽ .0Y\v. 9,ԛqIiVaS齟׮Y!OWwѶ }ТV & Mz0aWW[QW<ӈ@Ui~7?:|]".xE?UsC T.̂#$09dͅuyZRSfeB-#m'$Y=0 Pe 0󺴪)ݦg:nٯF\XC.pǔ򘪙.014`qqɃ.ȥ^v$6}PaB)wҹy()D5Bm/boM;!5;VCw@ڥ\"3Ic$[h摦X"DC@N1Br6%ژ$2اX%zLV|>N6jPE+a"Ly40\pRYE0=,Zf]c,\9zB&M#⫀x&Mӈ;J|`ڙmM˚R ~nP)?3'%9My>_lN#|$1! !:rf-CGȑJ+<}w4^8;H2T}Ä2/4o6v`21VzC&4 /=EP9Cțcyޑxp-kGW̘jR]~ܐjjߝ@{AO75#ۙ Yܻ#o3?][IN*I UXD?7 %9_\B2-,N]W-r:F CK8 5v&ruoj: {):\ka۱#*'vE-Uk93~͒"xݐC^YU.>Gǧdwc-U'njz{h1 s04׬ǢM-#{H}?ˮlim fxI=n4q< 9d"aZrkW^mUP& Z$ Wf<+{6,\&x,3IS0+ H~4D3jm)"@p]f/D]@:eF,3"hè s'|}E۔ '\BغMmн!X^W6j}?gnѡɖ M&jln7^ m}+];Q ]*嘏QQ* =0C*W鐹n4xhwDԓyysjb RTgfy>kܲ4,,#i4toKUG+N(=شlBpjEaOU{em[Qnݶߛ'c+^xV˳3jN4vɳ)Ƴ腙4qAB{mv%՞^0V#;ɰS K3[HY)_!0GNM>?x<1y-I{, 0_G1Tth/c[1=ӥFIWO4^ztBQ˓E6M`pg-,KIbŲmϿ,|s4lGT<~ taJZӵ֢`>Z qyiw&$lp;siqUtu8=kxX0+}Tdh'ʮu7jlogBЂ\<ӟy^${\jJ#{L'@m7N8j@;DIjZXţT?4AAzu1)7̑v)n?5쐶Xo7Voϸ/I*)HHmTO*e@ ޏ# fH)sC\%[{|ږ6|R*᭐sӿ #~Ś=z-Lu‰pvLF<ɴیڴS;O[9ڳ;(y6n'x4UbJyXoh`뿙!)RN{3qP7*+ݭH>&Q@WF %Zũҿ+f f=KG,Xm4QeU()晉CV^C6hqô|v|rS/dt9h&ciVz^LVS;GLBsڹDBE lcFg;Z(l/? uD.E!EVo4-[HKnQ ˞=.LU~ʇtywц !d$ x&`'LDMLAIV#dL\hЦͶ;w(" nCfm]a1IЋB"OSJ) ĀGv[nBZ+VG,!lhț0k ex01dFµڳlM!.?Rڝ@ %.-9H] -` Ϧ@/,`#2.%FƙD`I~WT)^dGcǯ o5CT(7K&jQ)U)ܖ#o mNz$۝Ts0xMEQ\(0 4ڣkH ƋD-ϫ\)a,-Q̄ae|lK qoWIi^A}#VBȋ6giԵ@ ?5z͏y&`^\jp_==BAW 5Stp/P] u"K,@JJv лEOlGc `d>& @ O>n== !U~#iT׬]n+&Zgrљw+B`7L-ݣc#wͪ1),T`кK9Ƀ===W7Hr(WÁ0!Pt&>L(. LQ^L~"tF%*КĜ;⦐lB0|4_K9dR5Z8F+uT&$Ih`?(/ѣU$$i2PS,ťbb9 v7_r g5K؜4rl~#A zb{9sꐌeG55&jfؓ+QZsy \8^5ij!@E#DXsөely?# `F@zm$ʩF u/;Mi+g/O]ȚGlR m_ƷCylw->:-[DaUEwp=e*N{\ljDyt 31EF z[ޔ?_j/I},NwۦNGu5IGr@nn/z9(BjP2&l͎T02̓ljxӴ n]xHQڡKFX*ZW TtIufEw+-}9^Z:C8&ޜ^6 DѡMuAMo#)x?0('L^nk@dfV!>ZΖu3F_NƗ<*mS`jGK\8<#M.iNX.t£S{/k51aP _WW`BYN=%R^7UB1**y+^ʈM #{1b`gЗ oU߃Mlŷ.Izb8qR7 nHdp= ,}\m0vx'{ fJt)NV.v]p0}D {DTժ8>?A &ډ[]؛iaX9WeP 7tVlz8|ڲqVF̰)soxK\hjcvx yRG: mFn}X"0h(eY2PJ dc'|/+YW5`^Uw1T=VKO)E"з 'ϟ?+qcEW*4h&ĜqH dt愊D=SonD-7#A 2}xI{wJv^]Rֿh-\VAEwI"?;S(2*mZ˫u>vDk`Qr;;|EQ_F`j SW)^'p㽄SfCh'2W1w'/'w\Cj6U_'}ϚMg&s."@+UR83>#6r^'^nna?f5M:6NdN 3b;Ӝ<#H~F:= #&Hl#Y Pi9Oc(lq%̆fK+~e^ޗ+d444s ;0Xj"ywbU7l1 kˉr@6CVqhdABtMik . NBIFяR LqoTg3Ә#]R!O"N .4ޤkPFԣ"Mqfy0N5WG"~^p{+oYC_bkKQYqP[;a"CQ^='Ƭ =ZE:SNYI wX1?9^ؿr!{guj70}\9 o2DqG[]+ : :>yछgle[)nD]#KwEy auhyyH4h bAM%~췴1)1~c[Ώ3& WixLXq^,*Q&$ui)bɫPR%׋J$x}+Pd {Çc[%tй:hU6GjeQڴωp"HT#ׇެ60#ɯKo ]7ŎDYg폾M9\AXͺ,HĀ;{My_~X/ݱmIRy{(ji Tk\e.-Eө4xb`_APPGl0-lXof#H JG{w1gΆ*Qg(D(sZ[wl'f~P/%@Qwc8ΐX sQyi[e L9?kA^C9CwdbvgSi|q(= \ciZߣ؇NKkۺ YN^{m!uF^zr(|z Tn [~CRuT4|fXdqGu- [辈]td 6v9 sN{aGUgBr;)E;Dwo(1T^Tv+P}p_%+O$m!J)#Q.2Kv[6T@{<3ӎuJ .!nũ6oۭ&B $l$IsRT?FmdSlgI?yu@ÔjX +(Igw3r<މ TU b]޾Ub6T:5v>ױxn_ 2&Az@ jE=3%f˧%HXYVPS]p>}{%+Ad){BOQby07{'xxmNV;U3 I5dFBϘÆKm~iذ~\ؒ0)Sq:(lkRW5G)` Q m,w}jV],» a]G>A? x |+ |/O:=Bƅ~\'<-T[&,T ac(/T'c1bp=. #acǂISNq΄'7XOo$G_MKB蔑mG=Vj%G3Σym]~ #aH V*:VD f佢TRR AH=Q@'wΠn6Cӟ pS ̮fK 8sPAA[GT .䫄SPUQ51{]6_P"wfs< `330ƲSVT>] y1?jEKᒩ R`þ2j2/MǬn]`i5n4&=ۢd r8~@Ŝ6i1?Ug2ߖޓA{%$pU4E:>0SFibbbɲCj2%xPcj)+G"{Q\5-Nγ(@R & Y8@J\xjRкd*#uو F^Ŷ;Ģ;g!`bRilXEa&Y[-KEvxρ.6Hl_&6Nӧ:ǸqN9.cNP`Dr6عVU8^!G#Huk+ubGMhY`\E"Zw,*DDfT~bfUˉ ﬍OYQ'," T9UHpfZo4 q0_uZEhFxtGUH,QzB0͹JFK$qN2gVeeq+k"%_TISzRf֗N[ v-Gfzc'Ȕq5&9v)oPDMT=Ai(&"p7"l;r[?D2DeKI-d$y9;43| >#~UC1I>OMt{{>r΁;#ۀ^(, mGf1ψjMl&io:JLlI *Ǘxek9$~Q6ӇtCZëƾyw(7>U@bjZ9.ap [P^ɛ<_%U>ZE}4/aZq{U76@sR4)9)6*cGuC:%mjXy9 lkT{Fq}i>meW  v2$HOCɻF^>7WCO7ee#9@7'Ue4n)΄`^Ci %gb{dKCs)gGsOI ޓ%+BvNgw%tMxT ]ƃuߒ 8)2cl` a elq7D՟MWW g۟k7;iNܿG+MD `ai提jvFt!05DMåSV1)pFT~rs-bX"|֩ky87;сnR|Rqe bҹ)Odܸ$GeЋ|rM'E19Bi1 NKf߰͘*e/7)X䖎pKB&JL_R!H&b<޳%\{[uAV$U>)JEck^Pdp'Gzw0L-)+w(iUT[wj3Q/lچؒ)DMЊ̐:h!@:3F`ʉA&b:(6XV=/3l} Atb.Gm K5GͲHhA(.2ߍ`;5-W%VBy 5tN9ATɸc(Y6j J:Mt#s'2QCzrD\"ZIt ٝ÷滺sӴq{0, 4V`c_#ۏu*(2e<5EsDdɬt|@ SJZ ZV3tٳriW jX'#SnFPTys˰[IIo9M%k L 8 V#?g}6ltnUKܟ9ۢϿVqz75lot}]?[^%}CV+c/?E?ndnO[:鿫`c3tJ#|)8,q-߄Q!^ شa z>)t ]+y_^mٴ};H}K!HMn Bj]J?v {Vd^K ){e%&UOF*w tHIӡݞa0-ȅfU 4{eiwF060A";_! ?m+Ԛ9;m45 rsNRK&J7wqa1:Lസ€\&]8Zbt4ʗa9'ԧN P:L+:۹Gԋ;#348VXŒH#2H3J2!=T=D'H'P:.ͩs3$RX*Yx}qZ$B Z&0XmjB3u;̿MLBBX*^Kۺ陋<Fvo-S K (֌ʓj.0G4*Mmo}bucK\ւ,0(.!u$;ƍ/MdNl$H7-qqh DSb\ҽ(o[I[!@5z *qKz@$vofӰ]@Y1d\'irsٖ=.0k0 `뒕1% <N;WtYWAxPPq$oj9JUݒȞ< ΂{icDTE{#uOCf/*܉V6LQk'oz<R_MN)4 Opu2mՀ\kUW5,̏h'ߚUnwq)#-&40a_nGO&^5 u#I,Hm5G$pě4Oz^90CkTL` DG3;ެ=cݛV7EKi~pi3٥Xs!ϦN+fŐCp:_0l!R ya4vYb+AK"/`Wpe%lFƎswRs]ԧI8gU=^[TAظT%@0G1 F}vؠ $OfrUiᏀN/fZу5sǃR%Tb|!SyQĽGoU΢ػt$ojȊP{d'fbSFHb!*7P0g?UTL'\k&,z܊~C=]S`hԛՃT>6AbT6Yfυ۱x=R:` О}lj/\I ~6֐Rg?Xm\[vꎛgB]UUIݻb"{m4Y}+=?H10{VgkE0r)\.ltTĂZV Iz{PH?8ߩ9JF;ƱC.f\䏬Tꨑ,D/#ZOF?餣-yO-EqED+97ί[y+Pg4қ]6? (lXDwwGB+8νlk5\-d!W>Q/eJ 1jI᳛옧':˙sfR:aQA8-7X}Sj^g*"~X1-<8y,r=fpC~B$5V .7E oB$*;G &UGNRaTiiIYx$hJc ?7 ^Nebay7;g#3sA!h~ a֘:{.S'D7e|@[CeQ5qַ>f 0<(CqG$ēhs8S'} z1)ݬ^ \əwc%hnMQ@z vfӝ)2\+J-2Eez$v(VUɓLSX5nUiQ8渢(~w 5)-铉U5x_H ?հ_{췂FnGEkQ*04r]aSXMK NogFsfK1wy2T%B*O)H3rӍ_+h-< }jWk4ӗv ֛,pC-USf#œ/%VzGlhp׿KӐ#} uk?/ _:v3@N!ZZbbeT:o𕋌C s:ˍuZ Xkj]`NKz&<{ffls_R/>:W8ÄD﮽-+7 IF^"0.pO|Nͬ9k|逕9|Tu#z3J#Y#3t8[J2Ic^mI3GV"XAqжV />4 nМrLm j*mhk""m2{G$%OU/6:L/%tz_b.wd;toٺ~t8R j xRѧ(t5O/lڼ=F4_c쏽Yjo{YupT Z*GMM aq;0~ȝ/YlDž4i\']-uHTX8D SuyT1aPT -!2:lGEi~=*)h B1HyZ/vx}* ˵N3?P73RBoRԖK݉z ̙ GWs =)jv]mgIuP[ tBFddt{/|h A@5k>GIzg7oHFU{*.;6mw$|Ԫ#[# xlN~5*<@EE2#g7JR+uQ䝐wqMyfiEH+YJ;߿؝ZEjçl]^}3Wߦd԰<7c:eDN\&;]9*=u4K;[,-+Ҫw^0ׯ)ijjspy?2fPN񿀒zPz~ϜN+̃wDНY{dd4F@vvA%U8`*uV堃=OiP-4j&ފ\ C#OI K/k&,wF[C`4IpD,K YPrhy62!7!z`y@gLly "48(_iBmo.^VBsF"bF /=ؐg ͺZ':cpK¬:3!&x:F%PY9!\wY6!s*dӪ]r *ƠIv!Y [?7$r60IҳX`,Zxn\KUoɉ`; 6buNcld&JN3G&Xd:_j=Dx%GV/MD3_V&k瑏asƦ{fV13LuJNC^Ok4.b*mȈpg@V!ȶ)8Aߙ2M}@"R(Fz U}szuPZns՚&g1-/$ #STNP9mEXu`x~J]ij|Q7μd[!@#pd )">>ze?> V77-7⹬E|%n[2"),WBU VL@(Fk\2x[<7cVHVDR) m_m]wkB86>Bq`-mүِη_&8y>u.XG_:cl\xZmhn]? Tq3H^ O(Yio:WnP(6mTwD%(9eF\qNoW?j04DyǔWJ),нe1o@L-,++^JpXw ^ ?B+pźueI[5޿;8$~fv/aIAl8K䮟(ne!P.fq$"D=ys3Y;-!*T;䐫v=Oe4gr49 Z@Ii>t؈SJ8ZGM޳< ]0y`CG \t03Tvg1@muR-O d׶_Xέ_#uZCD%I~bUThCcDN 5v(U|VT$}4(ݫP's)nzë!uEe(ƢKt=֕ uL~ 7 w$3ElhXG`_u!)jee4J?]ӈp 7㝌qjkpnahBצAl-oxڑ(w+A)y%9R& &c௃bnd`ˉ )Y06eB{jf7:^\7p'W`%29KKdwSBƱjav 5aA>n褚J+Xl yoY/-sr31t SXU4ARMZփ,=&]K[BBcE#=43I|qhKJ˔B,=$P=a\SB^bʂ@CICм"T#lf\@@YA 63d25P ^jۤ+3*/+RoHTޛK-KYWdWCY7]QpwB֚_IuUC?Kg[25C˼ {S2ĸEn1x&&|*dSCV1f_•Y{VR".Qީ`|ߗ]w~6.l@l]X"X?igU?Iyk7=rΗu'6z0 m_}6>Zfm{$I0e~X ~DȢy}a!Ϟ.4!grZK>yN&3^qfJg0;[Dq]'3Tq*H>ڵ_0[p2 Rl0i!(;,ߡAvЛQ夆KE1 ^[X~31<0uWfLltG{F2 L7\9aJkTebOVΐJ OH1 ]g_yR[&*AnsOsC?A@C+x/u4>89PhV] tA#GХDj:趘:u;1کGţ82.'Q(NYTF<ܪ[qSp߈(XxJDRFA/7cbX_2 aV#ٶ Crj͞$$dkPA@2NwE/=t9%04YX-+(.B/LCOp0HxWWxyB(v:zߵJJV_(deGj^a|Q.jQ/|%MQoAXj ,t,Pwħmkx*|OkL2Jy4hg5Gg>}o\4}ɁLuHQ-SD9Ir,h}q[  ./]UY.b;AtID5A.: ?/W"(mTu)Eݬ?hǦ'N1(W476gMMzsNTyHY&V'u0[2+ԎP;(^"eP6,Ofeλ6wb-+#\P}( gTFH)/RocVO qbj%cGfrz֩eݍCl@ai5 Rz:flhg,w UevQ*ֶsA=AgSo|mF88$#|z;LZL=KNIK80lgAE0wTp &3*⑹Q3(oؘkX)tΕVnX煮DHW'o!uqtu)͛RQIqȩ[&0ES\u+-5,R>}S>lR*:j^= ٧[0hڥ!ZWKQOAhTUIɀFJWis +B~A2v33I8֭H!fYGYA6-%Jx$JDX9$QvqpvEAuI dyԷmNDdi ih `QmXE &yJ@L2r8Ybg rdUӻJ諰 Bb`|/C&4Ҏ n%bl$!̻\g86= fbOhɸ"pGBY*TF6?…pGLġBCE\Uw,CZb+},r?sꀑkhvj)\L0wdIqr7`7|&_9odޚI:^#5^sm0騀%Q(bI%@I$sb3u9Ν<\ހyoЮ_Qo[]|ivAƅ *v'Y8^7:ڋ]VZO릊QtH9"e4JeBPAb&.ŧ\"7*dk!: A8~N9ߨ\Wc cuF={-cO 1ߪv~ǩZ#VI݀+F1- gA"Gޕ'k*f2M"'! 9NaԀN|ߊ& !AB%Axoеa+b՛($ Jf]!(L.a:_Db{[ZnrtHf8tP$. 5ѽE`?4CFKd{=HGϜC}\XtD_=ΫN|":*L2Id~ 6^o,r4>cT8ws]ֵ|(#$?{\W:hQȸ?lr}A_sp+mZ qa -{{l"9K n?u}>;\>VދnYcE)?\b*V;@iyۗT`E;덆(hMflBUf06X ۱:9nh%IQdWƐnMͧ)9ɸC 35AW u H'pOnT ;745I xq=A{U՘]f6 f3|0%;8?.Jؙ2&2e.[r,ONdP Sb4qf}E.F^W:*yI}b`qgnnUT.‘1qg4+wa:eZHӀC# Sk /t!vڶ%cAMȋN1ypFuVLiL˨ U{HYC 6U=a0t㭄1˗L$~N`wx\H/Af/&*4(O>b}4ۗOwL\ 5?ڶH úo(ctyXLDW/|.nJ\f Pzij[ ɾݶjdh.R?}ll7c(XQ2I GN*"N){;Ŭ+va! Q?w!^L.`GЎ ΐm%GQ!(>Z6%uӷא^BLR!)(1WV_!p#:=gY^m}vSrGU5bBo ~H=tL@*:[Xcݮ-[X(h5&o38~hpHVauEReYR @陹 ެuū?9_0MZԿn3M綼^~ ?bw<98i*cZKtŪ.[~įxҵ}U.5Ӆ֍:[CGnٓHE`|vݖu7·ƽ}*/ 2'hvVucxblt~:ZgAw)S.S db!v9 fQQPLʶH(rey{o~Yђ$iU 1m/kr;͸8!#qdQGrwv$ *"6Z] M8.4$$t|6G&28s"8Ost}ShӠ!'9OrƉю@pJڢpf3suMb#a!u q 6,4ϝ"Yq5aO_u2`/&>4+Ci%.{-c!7S+~b*[_m*aLD: Ź` jKˌ^GfY'#Tu!L6L›'vP}T8rp&%̓Ś"?o TLHJ(@FE\D3ԅW `V ,xJE?=Q[ۖo698"( Mߤf>o 緸S#7zZ18%W 2b( wlRzvk$yʷHKMW{ST'Q,v;4IX !һl&#<ςAR8´L!ʎ&rB6WBvT;#4[U3Օ}Щé+QC۫>9o~x$e~0H4NW?w8,j_KXJ.f5B= gMߴO@RWL-Fy>oljuWiEvrlns3@ u@H XnM/dv( -j& 5JCcG;)BRJ`B] Z`~L׉+W\|`AaT^ |ک;E[/Tqh]prFV֊%ڵW{-oRCwnZ 5rm*xE7sM6̼hQ0U}PL?5zRp)ˮ6ZEA=XE'PCU@C گr_"j 5]m7h nN;#`y-%~'?YjJsFD W $ŽV6Pvbw&o̻-#IGu2D-rӣsd]j `U= 6q, j)rЎPkKo)] ѣ0wnjej$1&j ׬?q/gK3o'ᷪ\Ke92 8hdFP]nBƗi7[o3+F0CfYU Lں6NL_)\wZNjل%G [bH' F:>(1(5{ 7k!uPpg*4cyٱ45jrJ% [C9 di){F)xU8Jнۓ t>pAUOKd8FWŒ!5q1#nxT+E>Țy:ռm+ÑVr\Cgw[j2K˻W3H({%)} 'QJJFr/ THSLrY8@8_Jqr؁g-ikƙX*9=dqވIßY훥\ijϧ*KT7P0G :[d,P^|cI+KazKþZϐbr ͸QyxM/#<[ǝl~ݻ S4G]ﰺBd^t>prXp%H1A/≮1KY?;LQ(6sqt:o5QJ߾c㒐nLJ6wUL)P_W$I?H5">Uܬye %?,K)!u9:i*3:ە5Dy؞#QXUҠ_5 ڗ#n}nb0_12MEO8.Ѱ C_O}{ /yܗi]KV1,}@p_}IK8R14Opz(U@{Xy_MۺyvMˀ9 ]Pus-)g ۈLʝWIQG 'Gk1t!WU!U?@^ulyalOe.)+}l5=bx;-sԤ󶨰?fzw*fu}~b#? wTS0D9@I#TL`rf'0RS H#pV6=\N']RßfK>ڮZchQ''VRUujujAH|*nư{ņx̌_by)Z#53~p A(4DR[eajr%Zd :Cf*6kAjáw??Lr>&w_l?׮vkjnO! }Za}[6zkR_Voս߫mt5l:u+U+_?U}Wjޏɰ/On~ZV~>mh_])8,q-߄QJCe/hGk&ګF;iY68x7VMPNdhw$B?>ΒէnQ\488=1ް 2EN& UO{&|GNw Ïl'%)U< :n~wfc螖^seK `lǰ=' fM61Tu3 Z-3\їb3N;g67*?竭:9?%%=}ۆ%#]ұ;+d}& дGL?{ue#G 3lA09_Up+p | *(g~&q0sM,{8^ DO_?:Ԁxj/׶, sV-䫲].Y!5vóUˠ%.X;2BJoO?ra U/ިׯ/,GST|آ- ICmw-1.\(ntb:JqY9f*WS ԉ 87g7`4˃[M$h @*X+ y Qd;vGk"r:uo )uFc?MAVn7t RYᐤ06Bȧ>=AL/! T"QH a>cqw$N[O! PP+(N12с} zaNvitXa4Yd=s3D=:}&C ې;A@kbR P:&Hba3CKg%(1Wl?. qE%'.ed&%[aq|N*8NfcLzzx ȡ]~zocг 6 Yh/PQ_rU#)ae;0½6'❸Jm5 `<5 2baz*6C+npA2TOV= ^tge.FF*cVdk"c*+9#iC'D(?KAשu]:+NTεYX(E"Z5@%=ʃRd #eV̱q_Q3 yD P0vWǰ)ZdsAx=&r@=x|vUսx }6c8)lL@A!ӝĠTS]_``>A;[Ln&+%#o[Mڍߠ'KR f(B5Lg˼Xқ,B{+f,)+f abO 2xg'L+C1L M)n@ͷ&FgdT=|:cܭay):2E>i/Po(Oi'giSm(jX 5i ӂ SV#MgJ )@)RS#7N.udvhU84u??IdM\H3âq)r˃\3=A7Qcߊ4f8tdv맋^נ sJI`])|kȔc4YGQdE`gE2ah78zepQ45fh0zS?NHxW/ O "usBD0 3QdP`}[1g n]'?x?7.I{ kmw.OYD* 7I?P+v4~YbSH0V棣IUE)wuc~ oXl?7B C@qEjSn]{^0X x:pAV1I61.UcC,} U|%x᪲^]"pы70Ϸ1r5F+@UJTێӾo  sGW`=R>;#,{af_Li1S[L7$ wWχ%lsgXPTRP#;^~J9<>`%erXf#}|=~Hd77 D<*Pd<u̓t)gK/?DpS_EPW # CE@#Α]/0iʄrڜj( SXR@sK\!a~<-s?Q>.^L!̓ιϹЭ2qcD<ø]0qԋ"s|'XfP_aPrIks3F[ *"'÷\Uo߳eR;C40Cc(蒬wh*b8I\,H"w gh+[c揆T.֌U_As7{:X2Ί"ʻw)o_BVk0Yq{0X |h0Z X5L457a%NMXjdI/+w1|]LI\Hq_ϊ!:b?i>{C hx(iAqwh}V#I@4_a*5y "1f.",nImb"MsĄ,]zBLgq 7T@bl|d6ǽ6m}3~^<&<<ޛeKsDA[޳Ԣ0K+5,)淑?&x65Ż1A%$؏&]z;w'"Q4o,Zit{7Qud$Lv=n[a[P2t)LA3\Zθdw娟W?-rnZY7 , ~*Ʌ84 4{v @w[z7Wij1Œmќ㧻kx_.ԑpq?IbB)p vTڀK8> j{m~բ.uXbrTCR+#׶@x=8dը.,;B[}n,ZΓz(&z;?o@I >sW)qd?K`g,iYHeDK'",TqhRixu 5 Oam#YHӣˁ^oHdε2 msKLfs?TԤu94x6x(Q<{%a:@H' ,]r|ˠ5n1!ʍۇmCtgtX$ڋ5KsNM7@z=?8%YA!uiH´es A -pHB6}g[ 2Q5=^*v >IReHIDbW#E*oRx[!kQS ~$O=-2_a}ǒՑ~!r7<zH+vT}l"sChZG[LJq'[aU$XޡAyYd^N"2 "`$Db3Mln|t&N)黯18-1XxwIE`=P@?wT@.J_f?L_~:&]&UD `*P13{ !8O'I^JD60چB{xU#ncs6dwu /'1fQ 82A`;OJD%\$iQN.G8E[~ߴ"GB~:)xkdPCyLvFpWHFC߸LvA?[IASq[7x} U-2vE0n*}!?VZQ[55 ,|"35Ep9f`*ॣ1f¯Da Y9/u怸fe#LyN%+&fWfC*`jDs uO>:kaT[6'OP)tD8g=?IQ =HR2QMǧD_z<\S#v~қzBPZP(+ΙZ8)P-)iو71P?լ0;2=f)xiZDlA2R0ˆ}*DT*B,r`,.ԓaaa@mI#tڰlh[\` HK%mop7rD“ZhG>ͫ7q٘STх1p,k#[2 R@>bsBяiV(MB@Gb ~[⥳#yd| }{&;} y!?a߻)<Itrp؃(Ho>d,`"&1)>d/*Q=siy?W}I5 [BO,mԀ'& ۮVpHHcM4 "q+mJMp\L_SlЅ91 rKiE"| M>(E5t?K$͹dCa6/snjgax5SfS0DeX! wZ3•#m_;_eH : U1 moU@.9OR_K?cRˬpi%-4\6~ Ld͇iχS[65HSCm$ހ<:bbablIJ~?E-mC(ʒ5 U14.&3/~myd0"7 aF B`P 3/!5 Mv@:wt] Dܟw@! 2BFiW*><> $C>fhK=T(Ӄq89?9Nph*Tv.GUaH`=e?E{0Ħc |x8j"*YD%._CĎFZ{qJ[B<\*| +.GЂz^muH`)ey'*.`@: ߯O`D='gu8%9z=BT "f՜vC2GnQZ{%D}^m}:iFD8ͣh w =JAyL?aIPc3kAhzV2\(LJyR2HSoYly1*Ϭ i -cg4Tyֆ9"bd& S4DAKD1 M Yj¦f+(vNC_l؁"qW)X˝$(wԮʾ4#i栭qa&Qlml39O!Y Z#cVg=%4n;!CakA:m"6oNs\M|V5cN>JDcG(j`!bea4ptlu6F.aj:8"jWL3ə^YK5f|xǴ\TԯC_:$S01RO?iTc#,E&7."5^pW$ >fVL=5֗2ryjU)ƴ1 XKר.'Lŀ=%-uc$,J3*5-A핆/.THۏW5ԥy{ o(pUh exu-ϦQԚ꡾p l )V;~X+p^ սlkQwg/Wi0#y >sgXW-̈=BRS>b!o5,F%.5ƙ7-}<qq[ެenXh10aH|ߨҵ5?1'h!~Qrˌl E?ҘhnShn:eB$z UJwsҜ/wOA] NUPOW흛5Ve-``̮'GeOXA(̓XyMFMK5S4z'*y&{'{H>lZ*)hVKZEɼӪ\-kmuf(㞀N 7S_Wo`X'.f&D`.Yc\w,/ A[˲RT.tf YOȜ;&M!@7G{1 #Q169 $:qsj'[6FZ";X4{Pc"^X$UpOQjQ~K#ASfӥ8H-?-L力iv {{PaWWwI`vKϋzd5MuRRŶ^/DjՒ˻XK " B 1dͤC3dKCO0{`F[P..yTZ)SeCTg_[PWlen%tkne=uF*B$[2Z>$ lhGHDI1fԌ(;3Nr'oDr1IjC9ln  =lVxD7uo2]3}NOLelq]L!)Eנ< Uf$־43tІ j?N`^uYǛ3Ϥf!c}Jc>kqcV ǩx2ܓ`,BCB,'6'mE h~=iS!1m eU.KXzs/loP/4 y)Bӗ.G_潨Ð0uO11;i'{c{uD* KpJga5g^VAԥ7} eNԏl5_c4}z⍈R,I:qwyUJ9&CW_Ϙ#.4/VLx,N}D&&sZQ[,/xٶ{~x)Y#WsD{R Ǵ?̘Vzȗ$&jOW1l]@ul 2MzObC&)G]^N..c:]? hs ohu,1Vo`FzHV0N4B –^FGTUWԘWiTU]%Ѓ.L[)羍/E{HDƿУ>ҫMLOB amB-u5$49T?u-9}G`pZY*@=)wmߌ%F(胿7ҷ[L'G4&Q~BH,yR W]YO3EzC#X}m%}&x>m>80< UOl6-Ϗ%J_]sD~'2Bjy04dVwy!WՔ{V׆Ǥ/}1oV;|rca+SģVZ<>[S= Xєe=e' -n-K K0L06Z>Q⏻%X|VEnSq"u& TBKR#)C[#g^^]|;D] o04ac XgZoU yw"4Bp4G^Q[ض8V a`D@;ru6GuL5VrȆ964u__  gWx:^:IFbF28-˳+E=q!^Wś,]buw<b|=07mJݫ+fBjH㰑[Ժ'R`af;dF,ѩݟNc;?H1'oW[:#yo?7c3[Cʰs'Z*RiؓL(gg 6izS䷁irְmrc\Apw-.ÿs?]%ly;] re(j'(p_R-t]f58[7f ԍU0YN|^3!T=22JM:BlrATUAϢ&+NA↯}js$NA(anM2;l{Kj I'<(ECeh_?.BZd:9ZbɇpϘ4AM~N}uTJͻ `ʧzL9(Gۚtã{ٷoAwe~esQ`%*!/|yIӉEîd&9,wۺ}f45#Xj,ݞҔ2- MX2]JZ&jyx]YfL1QQ;]10EH6\-=G֊Rp|TO7wEzYGN5)̺2>zo>915|VTMIm}sǭ01f͎qҝ0oʏ7XeĨ}s '.>LucsSԿ}|Ms΄plWGEfDkޠ (%/h$ .wbߘ4'>>315 Ad _c/rɱ `N;tU`dBkvEj\HG_x5ҝ9@^DX#羭XSQn~}k_vkԵ_Qt#Ӿ~_?sV6[CV?&ATnpU?WWV~{m{ӍsQ*|g|)8,q-߄QJCe/hGk&ګF;iY68x7VMPNdhw$B?>ΒէnQ\488=1ް 2EN& UO{&|GNw Ïl'%)U< :tO25Ug1Ɲ*G^1\H+WP.rև"Wӏ)B-f x.)SV1By6g\t 6˽hn:Hk{nD|okV /2B]e \,s9RS-XhQUUdutI#sH#AH7>t3:mN_{r' ( L3:wQ$^Yݨ_ed豋1qLOR)[:m-SMZ-.j+ERDۖƀ!Wgg̈Aцξ7(o3V2wgWȔS"l6`F؏l>p'Khsr[sBF k_yfn8&y/xSݿiҦbq7sW_6B!9Ĕ gf-_v PAUQh !3+PTPK%߿!!IVkR! |X tiS|(]%- BpNc"tA.;{kJKp[M$h @*X+ y Qd;vGk"r:uo )uFc?MAVn7t RYᐤ06Bȧ>=AL/! T"QH a>cqw$N[O! PP+(N12с} zaNvitXa4Yd=s3D=:}&C ې;A@kbR P:&Hba3CKg%(1Wl?. qE%'.ed&%@C p$X)59' ~'ꐔlXg߯c 9hePif/&9׊8I-#cg⦋gnLJR f(B5Lg˼Xқ,B{+f,)+f abO 2xg'L+C1L M)n@ͷ&FgdT=|:cܭay):2E>i/Po(Oi'giSm(jX 5i ӂ SV#MgJ )@)RS#7N.udvhU84qjXOaI #l{-/{ rMNZl'> NXTuMh?^?FOG9. [6 V$__@/xhqht/)cCyDHUih2v !Pg '>̝.3g \b@_t;N:`܀yPQ쒊DX k]@rPk 5,0n:2louOC~P`+) )2T Nf_Q1<՝ǰ@7ׯ%KE0#sK\!a~<-s?Q>.^L!̓ιϹЭ2qcD<ø]0qԋ"s|'XfP_aPrIks3F[ *"'÷\Uo߳eR;C40Cc(蒬wh*b8I\,H"w gh+[c揆T.֌U_As7{:X2Ί"ʻw)o_BVk0Yq{0X |h0Z X5L457a%NMXjdI/+w8ѫ\ke_*t}9WiH TBo.[7I-Ho?3B6(3uď!"&Js~.y{)mL3^&TW yF5v]4_ܛ!C gzU@PW|QJ|s&ήQyƒrSB{Ԏ'HK[z8xyZBso'rG[᝚g,GPl+Q@a27cI6^{ZI wgd{5<0˪_Z7k' YK3_$Ev9RobGߡιᘄsUQ#.)!%y7ܴ:A{v<# _1LZo&@)Sy2 I?P=S݆L14Mimr*f el^/ U9BRx!9rQKUtǵѓ# ,b︟+!3ԭvr+Q1췝>ǞBFwym4b&7Ux ti0QC -vtRv\ɀ-bR ׸%klS 7:cq-B,S9ZSx]/_*|D%Gq3TJppvpT HqEg&ф@~}8[Z)ϼ#"`+R|4K hweP@kSZR#sL:&5x5 ڭ&clӴR,y4Zʹyn1G!,6,d/PT?Wӛ-e\cО Zho:ܵDAfXW+Qq$E8UyX@4L~VzNfaEtWAժ^' 'O\*Q:@Y{~ ؑ,CBZ@y9st<'ڶ^tN Bl\fz,JZcaQ}/V9_, g>a:@H' ,]r|ˠ5n1!ʍۇmCtgtX$ڋ5KsNM7@z=?8%YA!uiH´es A -pHB6}g[ 2Q5=^*v >IReHIDbW#E*oRx[!kQS ~$O=-2_a}ǒՑ~!r7<zH+vT}l"sChZG[LJq'[aU$XޡAyYd^N"2 "`$Db3Mln|t&N)黯18-1XxwIE`=P@?wT@.[f T?iÎ{Vx1g 3qǮ"r"d!&mdoo 2Xj ީ$~,VratI'գVSB UsU~OgkU@XZ#4W w:+%^+\"'Ov#*@G4; l)$*4-߁7O5$|Ylk4AWmWaV(d֒J?|iwpHN: *6Mdem^fI$gcp/K+#DGy1b(q%#'{-hsYmq9nTeXݕ!_϶4UҮb+fV& 6JM-rpVDg6B 0f8֨]N4įN )q5bi>X2lʦf^}?x.Vn|Y MDO{"P(/ L_ gi_k` #ՙB*V/Ro'MM{K-Ehd:;4Th~( s?i a*,ɳCR v]k}?>QggXwY`p#~קBLcMr=@2$rce" sQuk?/fJ ʜpG-ڿ6['dg@椠^g#r8J7R`z;Jm U hxhX/jMԶhюLL^_|UW>B5m%Jie0P7q%Ԗ1pkpooی2[kH6 `̈6bOn'ԣqeko4aŭCDryL-&`1>R6fgSA5kR 2Ȳϫ}ɮ*BF/Oլ0#w'0-*2]6A8Ct=;%34hh}pkKq( d<*,Q7J:_5aY̟퇩&6Ȣjnn!2ss&l3gxL\<l Hu,+OFwe+B |9lZ*)hVKZEɼӪ\-kmuf(㞀N 7S_Wo`X'.f&D`.Yc\w,/ A[˲RT.tf YOȜ;&M!@7G{1 #Q169 $:qsj'[6FZ";X4{(.FfE߃_ê0HrjS7vV7CQrmH>'XȽ:~)GrZ.[<]r,!f΂;v1zi,`鏖! S2_锺?-yfM e{}3hՐ/+R Yeb@bbuqu|'qŧ@7҂4Ij:ouRX i%cIHV03'HB48M~unGbMmNf֜ĜQޥfKsXqk3C@/4٩5f~k}χD9`/,Ypba`]pyتߺȸ߻>wqʦe陋)h?YWl/,UA RׁOt/v*ju1Beuڀ}@*fy07;#@hZ++{1PKgُGEC9!Lc}޲75N Hbt wO5MٴZ)[ó^υVҏ/Jzڞ磻TM [G&8R :Ӽ;"}ݱk]F{86N9wV4#r#lZN3P^=>Jc&1%"jo; Q6OJu8Vt_hbzt@ړHlǚjơx''0T.mD!f Ts@%2ksV#jrFϨ p)2Mn@u{2WϝX<$QpOSR);jjm,lX9|,+f2ykp̋7$yceLl.}Ľ]C2 >]d|D 0!e*RBb٦&=3A?d@-i|Q#K)=ׯ.*/F9~XGlxw݊U_ah)j]H;7j='o!R6r3gN7urh@B!-q]L!)Eנ< Uf$־43tІ j?N`^uYǛ3Ϥf!c}Jc>kqcV ǩx2ܓ`,BCB,'6'mE h~=iS!1m eU.KXzs/loP/4 y)Bӗ.G_潨Ð0uO11;*Ndì0k b"]d9gײ鋕Be^\%* 6U%2Wj.T1R[\{гWTwm T!< ؓL(gg 6izS䷁irְmrc\Apw-.ÿs?]%ly;] re(j'(p_R-t]f58[7f ԍU0YN|^3!T=22JM:BlrATUAϢ&+NA↯}js$NA(anM2;l{Kj I'<(ECeh_?.BZd:9ZbɇpϘ4AM~N}uTJͻ `ʧzL9(Gۚtã{ٷoAwe~eqZp9G /en0&8Tzb]VLY^lܼFfu{OWZS۞C|論 y@&Hݥ[g9.Nn[OnY^EG},v¤׋OS %ಭT88Q84LbIQF>Y/22iJXY9MbKYg!֔P?NX>HŐ+biPYH!avε et-؞_Bn1GTvāUcP*6{YnQY=9zb@Z(A?wS_k*V>?m|r|_mgE_۠t&O{Z>M-}TWNGХQ`MKձ7ɤ@ueu*)a!>4uCXâ,.)+R &قs0.#"a6/[nۘdAV`wwlb ഑##z*4H6K6bi!& 3_{ƪ7: da^K"u`wlCH'ًjrzQXݳƎ/RؿW5io=F$uɼ } X Qwa&859.}.t|Ai*lX,Ȼjt1 ILnKy|vQCpH&׶vF@1`, d1a],u e{C- =~oE]LaZ`Q^N"\|3ϧ gӺ8[ ٖ73'U&aQ9# ̭_W^Mhz2AR%KVr$^HcZ 3FpqW˻jGF,IBg%L"~gNKIL&0piΤ'u @5h <̍!~OeKʣj0H{WyTZ&inM 6~Bg8hM$] 6=.ޠIV2t'\v|0UEM%o6H5?u$G1^h ǾJfNWcC ~9e(雼p_&’jitc& F%I>O?eR=pExYmo+TnqY2vgԩ3J}1@{j 3ǀlD(c&31`Y`s}|>@56?羛|ޠfWK7ږu WSs Wc w?Mϊpˀ PW-pKny{\R3DXDArr̴G.Z63OEwh$JQxgqmTN.33Pbcu~CΟvlbvv1ޞ@GfW%vzɆuCnv+y-tq^{9_k4ΝZ'2.>1z\0njv{,Ub͛"$Us(! x*}sШ`bc=]uk~Z/7BUG|̉f(P$#?JY|.WҨ`lCXpjm.WiŽyU{S~(WZ}['A%K#?uuE6$t47tC(FmxPh ʨLQm6ŒIÓ¶wY~:˒,4x}"t,1ej\]J. F2ڰ ' gѶ<+ʮ [ǒ|}gQ2Zd<8C~:.MÏM L8kSJ~2}UY]zeRF^iBrAC)SyڅHVAW nW1- \Jx=iDGlӃ3[Ӳ#ݞ8蠘 ikQ#z&8Y\_Xk!g %p6wtpy(u7Ĥ\j}- {Wц0eIruG>f*bkvd.}b$AV>"'8W -[O!N_RY#ǡQW\ /\n-XVw0f*cyu;?mo؅@ߟo$J(-%.i䛛3$WEʏjTJ5˺2i2`{5d|Hk6lGaJA@`ZG; }unt:Wݥ],ȡc2F`Gi4% q$uv (l `GsŜ]n}"+c&Vkkd+(Q} 뚲jVxݚ=k$ 8tc-wd6: [N:-!8-0F a[0Y>Ё,ƚ7Oob:Tl[ᬧ׫j\߮Dޞ#]ι=Tt;k>eF0h*'29ݯ: h{; GiHH>fnb =O0jz/cD*(Yņ l':8Yx2IeuN7*؂B&=z(f7JC?s~G\}t{8(w`B0WuD/bGZvQ~V9SzRN:/(7EֈNZ>L gbb{mO0h<14ٽS. DHR|Uz\a{c)\߯ķÉФ8fY *Eqbxl΀ys $ `{٪_q5BE)|Ϥ J_ <8yktj sK^e,7% GWkBtL=ңa,n7GN@ -OtUntM[r_UX;) jkVE3Y4_M+h$g} if,nx*#I )}O&JUlϮxMnN|ʈ.F$., a`&^Ȟ@h3V}*Sx\su> yphHJLyn88_ւM=$(\R%-,:mx܁RSp[YluS{TVvG`e`[ٯm>'/H,;*Ƈ=Z48(J!+X;'t긽[Ж/fV-Vh=iaYXTqhOd,򲜍 Z$8l Rž[ f \ZZNAZs@$>]C6f?'_v*#wo8mK>*b"?=3h6Uz&Vv|cs52W(Ţ s+)/pQk`RyкAn= n5"k+)(d*б3e`17v =H\:,0< V$'c6k[{o!Ur0G? x3=m -djrsőJ!4"{)Lڋ}w(8]bh$Xtqcg4HoӈsyΥA^ -s>zZ{+0oGQoǗpmL#E [l XOT&F}2Ќ,!\|jo@?DY,r""bux.ÄO$Xŷ &? <֗EjK'h \r$T.9fMtOX+M8s}'ݨ)YʆE7a:-2<_vҷ{F~ьiשN6 {73m삢;O NIewIؽY+ o\mIu{@M!a'ILK!:licnV B3Depict-0.0.19/data/textures/plot_zoom_reset.png0000644000175000017500000002716312640746376021236 0ustar pcuserpcuserPNG  IHDRcasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATxwUչ^kfi TPA((kaH0]jk4{]7D;Lo}4d ^sk<ϪJ)׾?:|iȟ C;F{9)~e9Ke*,W^K/s/\::o,a땶iF~Ο0@8);J~Z)׎o-tּ>ʣJDkaHÄ yzHD]  ZXm[B^CF0>)ͻp ?uYޙF䝻u5 ahajS!6'$Q@{! _gJ,#gx;,hd\q^m~9 91Յ OrϜ?C'M~_#L5Ei(ͯ?=#EZ(B2%Gy"( YR'3{~%4{05 #$r_{`c山C@?Is7 ]1~tQ2x}q ?f)!Bw1GK@ ga@'vkR6sYHn#HUOeUo9Ľ 4B>cÌ$B"<o <:BJ&V*4XX l!,6Ljm|U`P d^W?|Xr# ՛,>9pBdv9<:R(sGpֈ_n`oČӾ> 'cϑs@haH0$ duHCpf7EZz@Rʁ :@e?}pɯjBQMcSFy5 y B <:N"!,#sٺ3' ry93ߔڸ`C4Ye~-5q#r=cGеċ44uWGo)X#JB70-@884n~o*jȨnv5yŐ~IYHSou7F U@6Q84(CG%-Tn%^.;sFY .|4i0vާDƯ F { P6xIGGhr j-A?/Qؐl+ jP"𖷁J ۴@xfGuz< (  b,)AQ8(V(+oI٨pbq9_ժ!fr9Cgwqu{_Ґ!ar 444!t @H*xi;lHCk;i\UL~XT+=`!4 +s%SkÀe04 A9 DYsojکMbM?m !Eȟhd!<!@Jx"!ZRkk[r`U)jLj䜡ʫ?CG%KZ-i6 t%\*d T@ʙ݆&1 ɨ!aǥs QϼQ7umiC#  7EA(7%Hl>nЮm4F*ݍޞlK,Yn:,nê2Ek{˱#37bv܈ණ/_zV y BN/qjoqH'+^:۝ml #(杛uD2_˷[:A]1!9BLCˤ#f=|0`Y@Tק+U;n gs93 jiGX2ulK ,׍SpXlM ;+ALyͦ{<&ş_BEmA aQ-Z ab\AtyS/\jlФu_pF6[ltD A붿j+L؜ }̍P ^Vڅys*(K_E!jC$f}{;؆  F/#N} C@ấQm ; 1m1YW{Ċ}Ș 4+^eDZeVcQq ղUvD֤_xA_Q}:f~005*v:"C҆ HoNصp@^7GmiU+ $ jA N'h-)*xըƙ #K>AOR'!v;3;sPU c[ =(k_ڗ2|U܄PTDR"CC0-~؊˼ 蛃0t%=uXx}a}Ĥ3nWY~؞b6,MW8]_#^mm02|gY[S8-b4XP "%*Ð\yZе˾eϖ>Է{,M p*e'̨C*vؚXɋč#Vdm*ણ鋟ñҍ+.^!`yavmvT/ PJ56 2o5K%F]Єqx:=ڻk`ܤ3{X5ŋK5 A ;A-h: ɨBk8O\(: pQ.Oa[vZU5& 0aN={W/ xx{eOֵ R;gl$.~Ug 3j46e|Ȁ)k5\YET5xNuU  l+һn(; ̗'j;V5kٗmvuV)NHD30M#M Zv]\qJ{.h}+SeiMe|@ >۔͕ W'|xȀA@(`(Tj]TZvTg{Puefv_֙XE.zv8 WD<\\vTP0k}$-nH8%€^W-ho+z唾e^ZGn !);HA|n:^@(QQj~ L Vm' zpa$o:bHLWؖ޽rIbk[q>Ri 7 FL>ِnVH8"$gJU+~kV\ѫФG|@)ZDx GI xֵQuO'wv4 ;N@QO|NƊNȘEfQqb;NZN@.H0{k:Uq;+)n d+@~5@P/ZbV Dra36vyIEi=rbs7W&^an΂X"F4UԿ׾xu/J\էRʆMVfqΨ0ZĎ[S|إWC&P68Uh՟nq#4N죪&AvQ5j_7>k($r@BA׭ SQor%+HA07 Dcw{޼s*O(T} v슿]W`'*ZvdB.sH[V7DPSI5~|`3aS3+߷d  L>^bFH8->Xp>ېh )XDx i% Ҹ1"m;5=` u=i~ao-ߦX>EkpU?{8hF\t]sC㦦.nId[ 9i;y']ytpaB:<̡bM-N<(xyYIezuH⤾^mM£PƸ@ؘC<VrRWo{ibŧ[3D;ڝm՞C> ,*+Zt@@N? ~7kh+3@~~Pm1`eYkr]W⻶O|dP)e! 뽁qGi۩|p?xdnb-c@Co:Ԟz8~ {&;V5?Y8ukqwO8TI[klHZ;U|LH)|E~@ 2lI5~,\(b/uqw8@A"N1ܻh;n?;ڶp Ŗ}ywx*M-NYp@IȋM5NZj\] v )hBqԀJZv\ vٺ(R=N)ڳVF/Z!=} +JiPU z o`[E"%sۋ/f0w1EWiPq2SJb?~[;(mWܜ'Eд} 5%~\18D0 HS/ă-L<0dMׂ7U㗜B9|z@>WU87 !T#~sɅtWs}ui8l<9"Ѥ6VZ\3g $m毲[N7U=6孆7xQ%6@fԸ@.lbPͶNrV'crҦWo2p؋N0;2e nםn~Lq#Zlkl2%%fW=Ij_] UFݥm&}WHe y0G-x|Ah&3]3"B ^e>N0-:## q3mWtUͿ-?ݷ ?4iM1zDTǎGT Q/nu;Vv7eHP˿sϺ¦+@/ zx~IԦ ō'VS&8 8de*\v˫f3sQ=cvF޹.!Zzt|Eϩ>xbAf}l,SiE+.bwFmWnZdU4+$3_F!f0iWqtV;3h )ތ>>.)j¶@ QFhȥ#@q|L63ʸOņBq±a)BB&tֽ&bs>hmhh!a&~?=bDێ>Hy`nrB7Ac]uWGHCC+ 40 I 6a&^ U `B  xLF>~ȁ^ LOdco4wP׋ο4!4Mi6j5FJk_fyV=|zA Cz[LУrݩ u0N- < okq i]܆)pQ`yqeN]E9 NX ڔEP6\nePi*7Q~ eF10|gvuqgwP51_W x ^Z\%t[bB*k÷5NUe|c۔>wſqj{کܦrԡJ9ix>^>8},;@u}=3rϘ0_6+ݺx#^@؆iSa}j1X總{Gƶ+88qԾOpgljF7#S:ˌH7stH)"A^ 'w0G!πU BGf/jzKa7$xqV%*䨆V0"c-Ozk2"&Z]u̯qxQؖp΂t; lj3wt\;Uw}=Vdr$tJꚧFn +,(0 G\(U*86A [aU5eW_ގJOֿ7};{mdlG2= %cE5Рܮے֤ڋ6-JU?\ܥrܡ`#nƁeB%^ܸTipYӮ1K!tM352+L@Oan~9r^q؍)6o'xGG#[=idgƜ\뽗w1Ђ>H6Vú uL:Xl_ HH초Jb6vfw݌QCp9q{9((\ w޲NBj^bsӾR^`? ~ ;J;)uw5t}fRԺ. /|~9,KlNhؚ,Or^vQ$cBrGت*jc'vOgf?wnM e(J]̢^6!5C+5A]( 0$ÜVIY$הcIZ]QW]}rJ,Y/6D:ZȇP+9Ol5*fk[LHH_ĉ8Ɋm5-uG٧q8Z(9M+) 'M pbCwÍ6mSn_Quӎ J)?tݽ(^GD.ͥ)H'ʷԼXJ$`.;ꨵp_&nvxgާ!JLrl_)LJ nv9}+*eu/>R)w3PJ' ם# $SEհ%;-$uT:kS w!??B)\qNxfسisטC#' 捏w3wE=vFR׾r"2~a7Gl,y# R3XT-XVNkDjKF*ع7&TB#AZu_ /z'>g#178im(zqO}\ɚMktMXrːsxz!UJUDzIg,ȾDI,"bJ'~[M6PbdW)`Jyλ@*O,5BzJNG9.hS<ꙣDe/ yX׉F4Hjy#-NnYYǒۗt j-u_! P9gR;$} N!h ehLmzȔȿviڻ==@XI/R*߾tl~j\wf5Y(}QodcH7Xu)KvRV+UHM 7m8[h -5r# `mZV iI/zG5|ꓪNU=<9爪b0&'B`0 acIDd|SD>$" mDEL %D6N@lo}YU?]&.F BDp٤ ROC&0xF)jgLT8>Jpq̙0xc6/VL co 0xxb1kK$e #O]1n@0`"cuˋ#/Oɋ#/rj+b$ P+&F ^@0`"c d #/b< 0xc)/VLX9/VL<Q@0`w30_ؖ'[&/""S_s(:{-\" 艨۞߿Lb!"-iɱI#Y&PgSy k4.MNdEvv/s mc!"V4>?@76U=[&'FVT.o-@Dfȷ Ui~LFLY㊮Wh|4`xwW߲IsE\ > UIl^@yW\""AADŚ~4ï~.e[Zݕb4@4("E!qkkwgj!)Fr?qmN-^YhOfec%ˬh#9">XﳵX|}l2ED/`82 |PUdFCzeÊ, T(  mg&<*p)F?ί}XP3ѐFrRUbI KEX.5YT Uݐ3Fr݊>$+0ƎlT*"/71<TY>80cQd)BhGDESX- Q ?W#U5k$x@m*Ve|LoUBD.Wn~,b<<\- 8CU\HbQO2O"U]_1߻ Oc xsvE[A fq|{aŬmc<<yI24^oDd68g_UmkS #yBm:ܙO{DdG^'O7 Tz<<1-}j=$.on\[Dx\ժze@C0GP8W#^gUi=|k5Uܙe7&gںu+v}9ktV&zȕ=b<ԿnX8. sc%S'E&,g@ʻ+Y`=`dCQ@`6OD4x0ʏmr ~EP_{Wj-5?`tvIzF&?(.P؞Uov-Zh[By#VzE(_7E"iR\A@`O(-V鉋XIEᐢ.Vh{bOg='lWdӂw JwV3U|O`M~\U `*E|{zZVSӫl,SkF9ZPݾbGrX2s)|K*p䔲O6߀;ִ?#"~X;  ,PT18O(E[Sk_sN.mUߏ5 o+ S 7DdZ0MGT&[Pc5 aM kڇE|zI]P?: *v]"Rd(v(?jDu~fduV?6a-ioXRwEtADFS&)|@U[C^)z8ӷħiEopy0 E?>|Ֆ<#"`fpҠufT̛Šv>ۑhSSv'N:tV>w^Ĵe|>uuuqypA^z%6oޜaD~_;7ժ=?P&ęZ[{NijW@Ϝ;gW*nDd&0XYY@MýW'P&hhhW^'O:ʨ*p2z_1 ""_10`z_B_-LRE{O+ڷ8"k%*Omm-OHLui]9{lf޴4~1uֱvZˋ/Ȏ;ez|YD\cv2b[W)ET+k ^Tmݍ jp XQ~G///$,]˗o\fk[n[nҙsD顢j_,MD\d? NeA?_{`0aWZןHŔ)Sx׻H$a[Ρ!G1}pAu瀻TisU~wBD;0gj9?|SN D"Ik:0@g igܰyâ| ߣ(--xGB<`*sk"F|4{1y*%+{]8\{c)<8cC0%Dd6z }>ǘw(w]Bmya{stL>ع6d#?plj^敬WD7/ 7)4\, "Is7G_ fУnJKK1x[ƉqKWM"o亪 a֨*h4+3Tc`tZ}˩)2x^k&&soXsM}6վFDD7|>ڴ4/KNDUuEsLAj|t? ʥ] Eo'Zo Q߿TT}XPY٦ۓ]7 _qEަqV\ /#G)^u !99D6EG0Uw:{سDDnI aVZx˖kIzZSqMZ΂ 糖֑y~ @Ex/ة%X44vI"ְL΄3~F{|1vM |UAenxXQtVP$} ~zog!l. w^EO=8^{m&v-ź& ɋjJ6wW#ho!ÞBDsgx4Ski>zָZ@2fΜʕyNo r~߇D_NOT%PTjż}O{`Ϝj'7x9hꫯ&L{t)ֵ1d@^3Zi{5U<E֟x?W4o끨% >-3mݍvayXN#Jy\Q{(.@uu5\rI&1^@doj( zPc]a?? m9@mُvn,KR \ve6IkdHeUՎU[_]m> <[&p#dhc6_=o-(I?gj9)phPRRi2#'J|KSv|Z"=ZUms#w~f_לoFoS7|7- UVQZZnXʐKLsfz鮟(![ȯs抹=+C'vw6h9㙉sO:>u3'ZDX)+Vd4ֵ2xP4T}"|Vc#"^Şs+Xvn̂=ZoORDXzu&ů3  ̙GzT|ve@-8{{dM$ WiОup7i\ ?Ql]5+agTHsINQ;۾8X^z-}uigTx~I;G3guuu;v,ݏB \ +vL=pZUųT}^?!n@J&X { -Kz:M1wZ6l-,]KC?iP\?w%K2i_ɆԤ5tI4έɵ-Y=8' @DdVXLhjj&m]F瞓K;rk¢9k Hu,9zOID#Y MKfؚ0Q)ص50y^^\API @ee%uuiM^CsI!i?%W <[NsL?Gs׍кyM[^ҚZʧMgj|͙d^ -.80`CDj6膃|]tw twчhh鲫(:-fy%< H\c7kn*Qo:?32R__nq?560\ĀOba=5x ưa jUL:-!>eOa5eR1c&%US2[JSTIZpἩTzK;{|᧯20>nþw8c~TV! DbjD>; FFdpO.:rh8\TÇ3ϰm6$0Hinag3{o6,5QVAW3, qkv%+gVtF# twQVu{ga޽:Sմ'LTX"̜9H$V>vB>||o[JUš;,wJѤ;+ 2|by6 /IuV}Y:\yy99=ùٲX1`1Leܹtwwo>9~kfvfQ^v v @TR 8>}Q6ü\yXp!-~2&*F,Ƽ]TA,YŋʶۓOls[WsfL=Q ćػ?G=pB}{7nᆕ}E3_WP=+  1VAeӿu?NKK ڨ0ŋP_I]KB+/`H? 3}tf̘ڋ/fϞ=l۱IH_n8/7`~]%w]ny+GwiK &og7 wE488Ȏ;hiiuԲ,] R^Q1ܿOs2^\߳|2V{.Gc˶mڽ;՞c||7jQo_ +nD➜4 s4`rG}b"0 NIcǎl۶={$vildeml*YVz;cklL84n`rϙ9Yؾs'lI+Dyl[mMApnAi%bUӂ"`ړ}}.AKO>ͮ]ضm]///gҥ,_a,S2Ph<7ϗI%%%ZիVqa6nĎ]z~I;ɧ9ե\p:@<pG}b"Ҫ2斏2=cTAk⏸w8 ev55,Y+VP[S3gOF׫vv2Fb8eee\f k/Nv;i;p i`,:6Ȃc^m:GeW~\#̙,]%Q7}zN\zy':F`:;b.]>ɶ;J,]6쪋2{aՄ\Cm~<8Q !gf,Y1|Vz;\9ة`\tᅈGpvO oᣱWP"!wB]Ǽsi WlDNj1ODY]_ϡ 2jGZx >;>$'X<E *0R9MAn F2@uRweEę{+"[(10Q " 7;upwQw<. فĆ>.Ϩ$y"#ɽ8#6H^ u ;tlhod(/J2|?"l':Fp_8#6$;mx]ag֠~LU~e}^. uVhz )^D$aZ p{/I_̰Ho=d 0I(@t& %HKP+? E ^%.V`]Kce qx^[ KedQOD~ő?[`r{^#`RFk M1^ćbI>2q[|@݀#| OIsЉΤDoWkup!/127`eWr/HKTA@#6$x]-r q߾чsaP=p)ڀp.9VuV~!5,'.>?%`eƉ)ϤIC!0s}.cUZDaYZ+1۸ (& {=oN)?- AE i7 Ə7`е f @.˵8.@bsYpW~?݀Dnnz` x]܋k -FV/ë$?8F=,I 0浟9u$!h˝l1*}jp[}c ~17;pp` U=g߹$x.@7,){r$zֿ{@Á@tX^"N  cw8n=CMpXk.h49^o+[/$v H l;KWM? =QW{΍)w70boUףَ݀>xF?B؏2@yzD"}:Z ZOVIDlKN:iXu ZmP^' c[]3clk-S&bLg#Y9I%"Fl!YD'O:C*N8xJ3#GMmvY4رcQ5(-)Iŕܐ$ADHD*--u8<{9ucGIII4ճHNAĺFpСy8a80ֺ (v.+-M?|!nT@BWɆ݀vt!8uïh*@ k=G0µ)ƁnD%$)E8#"peeyCCC>\{F<ط<c10:Lv#G`a`D"rݪT8h_%Oȯ dfQ`` Wl3U6  UffmfȲ Z 'mmk(&j%F`_kvy2ku9s$UeݎcOkm^ S# O+cǎ4i?pC\Sp HX08kwCرӹ{[ee%v_zH= |d*+)Ix9ct-1:U{ʿŇt6"aw%Pc?na(/'<F20&mp,Fٱ;M:;;9xXmMMǻ5C2ib D1/`ݎL5غmuiI eeeZ,E صg;TS]mCcphM[ۿqlʔ)~kϞ=81!(>:ܹ1]pvlxǢP(U_Xb Cv޽)l[EQ6j--~>aעuӦݻԢY 6Qnk+]CUyyDZ Lg#g]!rNX deq{ϞMXgեj۾k׾Z8KA͜>Q̐p8+SMUU%fN%v<$"uG+**׿"CC&1-]^~zmT"B]]]gyh3 lt3fpŖY\H:uloD? d8غ}{X^];v$dazaS*p2wB``lپY51}zDytFa}K ]]c f?ز}2u` ;wC0kDy~|V<|-[:M:dObs816ov\D>nraF\ SO9B̜1#USm;^ s'FĦ[/x KV'LzpR>^7}zº{ㅗ^ʗi<c@ys8%1DK"klh=ɦ͙C(J?!"_*#9M1qGӜ9iIH?z hìY {.8;,c GiaADY(F"~%|3/.{!zGH$ƒ~OR*+=kVT߈^ٸ;i0c6l[DqOd6m= &}엿k봪JC|d}ٰqo d@kI6uxF] H_= &#Md~SS Tψ-vv /HGG7T#:Ͻ|dAs3>_Ҷ翀>H+Dnz2O Y̾VqpqX略ͩZ +=ibv15W 'Ǡk@uW^|#6 k}GTF#]uwC?t%Yu9Nǧ_ڰY8 1P@.Z۸bC0Kix׳xB3gxGxmӦ{~?Q[]^ܰY91P`.7?9ªJہthqV,_[p8S=c?@e,??ae};׿} gp^[~ɓ8tp0d\n fMz{{Y=ruu4Ξ?yopiB1.J߁HqXa\q饬:<@NgyiÆWTT4gN~{lxK֬y-`^5ʦ5՜bK/fɢETUV w~[GP 464X$p /L·! k׬i~\cǏs!RqD,]ٳښjkj(--%ӧ9əN?;ٵ{.hmϿY c(.|~_U9u4GY/ :lP(93f0`߁e{E3׃8.@E2}}}9zcǏ涞TWsΌLMr@U{E0FK/xRcwde"(tvuqq%BTWSSUEMݏ&>ő81Pd\z%KwUD"tvuCCC ÄaA`JkG^ג)e/m`HK*<+;"5\ڕ|zK k`,mor kNkQ;0<{<'O3%F&8W[fӀƊ=N? l|FO05F IY`0&19TpIENDB`3Depict-0.0.19/data/textures/enlarge.png0000644000175000017500000002341112640746376017417 0ustar pcuserpcuserPNG  IHDRg]x2sRGBbKGD pHYs "tIME7ܼ IDATxieWuk3ݯ b@92v*NR.R3T%]* @ =J=o~w:g|{Z-#'){o{޽_k-fv;DD-@N ԮwԮ1mrÕW[ߍ//m(é"fKg⿿@dztI_"Sތ`>N;f?`(A< dx,xyC "Hax fUPIW6^32qЬͣx`f 3T$<7 |aü!J6E~@Xa%A%>2^L,H1"!x󀈪bADD03$gfhV3pԜyrXGMHojbjQuBxQLN:&*8ATDDUp CoVX{z{Ҭ4XQ6(m7,z6$Hz|Wt|EjPGH-2ױDa&f&&2?#ZaV&ˎ\z_Ͷėte Q}tIN1tS󅂨7S˳  T`*O\'OSf4u* wډ($**#D:5uf! o'댚$pdCD0<7^i&_ vMԅ"KNC Ns) 9$BF?~_ް‘ʠXp ՕTx;$sN2JCU$<Vz5VCVĂ2rkűbPCTvg8쪈Y4jZ1geN88 D#lH{xAs0ن+mc;l;s{: vTaT >|jXW<#/cb%xC{"9'X%fJ 뫤s|ಱ:(mZ;Rbm7k\6t[$h*fn'ə3/\,y @PQp)%F#?A 4HxƠOćY+o'<?7w۷/j166bq~hªFn&wD7~|QI$4~T/#JcLsȺhZd{&k߉ׄeLG-qV1WʡRgVNx?ȡg`L'~EJYʈ&Q (ȅ<F-2r+e" FZv5sqN̶eJB9VC.qYb2!쎌LU;[Ţ?Pڅx!$ELFg&E*"]+sk17\\?~톪׽͏>gÇIG]̯ذ+ B#dvlˡ:C\+)$"`w;q#&"SUA@(18G11dFDCL2-*+Ef'7Jp!;},+њG]gY,0X]qF޶-|$R2դFL,U 8srU'1ؼ?!Gg#UR1ab"CqR(pX 'DAM|ݎ廖`M致xd9DeYX8m!f42'"Q&z;;rs5&#kHt"tl{G^s"C7̰TϜ/8>7 jW{a%e|L5sU_OHמn1 E GvD_0H609z@{ϵv4wݼ%ݑIC8G^զNX,Jڂ .kΩt\.p)ӝ$3ubƹT#yA}Z.-HazF @L2iCh:)n}vfͷɵJ |pr~_NJ CPS7&HRHlwĥ9Z#&1LgέOm_pTiP H n MBFUm 7t3ų+ ۚ~y];3vEvMg{ZPzOHڄM=r$IƌňaDZo> _V5y2 F7܂4t&txM3\{Yc* ά`gC7tXU=mkZ  J|R2!yҦ7l.)'*U<;S8-$QJ=/I>Ivx,߼#Ԁ:*4OFʉ=miA Kys`{*I2HF AJ#$eXe+BIpT7?mLhb!,E*L*5W6{og:`}'H Pe8e%z'Ӌe`z/@&iڐiIڰ4qU&#Tիs&إ% /o +Y?;m7|ÎEn_HdݣAYb\`!<90(Cq6 o p4Fbu录 c*X&%Gu;*5r*=mknel}UjLi# "^0fTŠ|{ xz9_F>eM$i@IbiiHΨܱ!l6Vk&^1R󧆻޾waGa :4O̍(VROn ŁDţ2[&yțMHDm޼`$@)٘SU55 ݕyOǻ{fK~Zc+Q$sh 2|y5/7WiC+ZP}ӘeM4mb.ιIz"ٶq$ZZm^T/ 3q燍i}rvLaE3+.Ye00X,́'VwIF@KMC%M^a/󧺻)#&.P` x| npg[sҵAOށY\"u*M6YG:&=!`qPVqk4M?tLwn#wiW6H`xvKxe(Y*ɵ-cswRӬimdM DDX[g jVžGmcӹ7~#Wn܋<Ioٙnak!^fIMӬe$Ip⊄աIMbvhY1Xqiũym|g>rU^ N"w]`7K<\謡Dp.pRȁkLdb G 2/E5 ]2_?W_t`8 }`  C8?X:$I4Z5ͫ3Q œgWD1ZSKԩs}futĤi>3ǖ]m"9k +NȚB[B+./qխ>[̭ C߃؎ .]Vŋ7skK( bm`sO70j旮 /\)3CDa K2$mA6fHTO-o.r'mw*ӝTҖ- -J[,0Sl݆ I J.RvHHi􆇴a5LVUU KQ 8ԳcKr!K[2Z6d!(/uzëyq}pǞ-ppzsPaa搷e HrAS%zD.BX0yCOEԉ lpMW?R LepY 8҇lΡ>EFwŠKtu&6Z q)Omx >ljgQ-9dַg7uK}~K{р1x 1 (6=>(%} I&8'Ƶ6#-Ϊ~q#gED NO6m8#s{b9]G^т!/b2m0`@x63KJ#o IS$IA+5; aUՃXDzltWYU7^IA;GmV@<=?0Pǥ5"0 4!(1jm̂¨~[6Sgcv璳qto~e3 @ GW/pc'8 XB{ [3F, gS%!ϤQQ3qhf+ReP_$g/$7NIlغ2`` w޺egps`4G⡿7HނIjh&kMQe$)5*#+2ʍnp$[7F ?{ O<̳qzxJJ<1%>g-!Q֔j]LF`j&m#.fAusCr̤;c`DJ/ Y7̄/6 KǾjTH&yX[KY}mNT]Rʯׇf4?Lkd" 0"*,xxtf3l>-a`}mCkAB@՘d/M$5Ga,h\m( 1QMGz}eI'T"0\%9pn2.% sp=4=1uV86i{F]$.ʊ\ʶ:8{vO'?׶7Sr\ݤ1/Nzv,,آvY3柼HHKsrQZOʺr$I#=Q1_q)WS#Wo&7P8VuY8Cc6H_ ū@%i"JfNڡ6 dMщTMKҰV] h5PgM8C"fs*(8[Ǜ4J% ̧ );3u4zܷΣZ RΤϿَkv 7Oq3CU(+!ۚ}l*P5]X9/[#!o4:Xڲ@p(X7H*{:&D#ZE1t1.ߚhWb|2ܙ|S+UEԗ+Jo+oHBoov}YK|ߍ ŀ|GroSQ5xtXƮ&3uWoReCLݱuyS?vU/ç$v9?ع ])ڻ?3N6ؗ?dže9w~2<ًk(psۦ`q=gdq I_*?AJvh1U3AHD5ͤ]{agmx'4+/,}>cw]HA(ʡ{5q}mYs׶u(_ڟ'Q%/ߕL.S/r=0osa|oRsMA`GA4"fFm,m`n:t4^($ټI̘ F -XvapASerELS+\K[艆\3]74'=LJ|6yU}Ksp`ݾ0Հ[:pcbi\ p4QUM \`lO18a@!4oS"f 7.::)*$$sB:2UD\uDLh ϧ3~N- |=3npUm^<x`臇?$)8X9lP%O`iЁRODI m|qiAdċu%\ANY$fU}zcuX<YV>-W ivk9h K"p4_ L-53 ID_!2eӢN5!Q?*0}![$%%U].Tj[ȳxuMn"M-{}>ir>{Jxtuu`L#?̆ *DĀ{cH: S5K?xo6: fBxƸ83tWp&zMk$- ٮ}c;XHR~ѶD, || ׽< im@we\>oCL;$ i!uFob1dBMj)+`}VijP3jmj6MKⶔIl $b>[\q(3:jO2=3d}`+9 0NTaũ'Gg◫D;1 gcS>{k::Js/ o>xίi,!Aڍ?|K_8c_Hhʖuoy9?in,M/ph~=;9᳧[3g{܍g)`v3@o}.lCo b7(s _YT.զvxno9+4YX71i3|e6 2xρS殳ϭF6(zo_Xb`9^WjL^+}ּoɗ(L<"A8^cYP3j _d{\{]?1=;2ry/|۽wODgJMr5>ӿc7>yկ}xxzOhC*ېlQk-͉RQØ=P>xCO{֩2GcŠ7pZsɚT G٫߹rҹWCaX6gƨl6 R1E6,Q)_=C'98%LujC~f")Pf|hښ]ff2؃:үuect>eMIz9̤HoŤ+;Y=!)'U$@80UԌע["_DoDDݬ%^ݳiZ+[X"Pz}/|}'}ƣk*l#iLQ .@5'|$1F`KQzrU;-@ |S 9nYMː4< sp 8kQIT} P*05nqK{YgsI[<ܱI20 d#GN\(PqKBoUyjň"JKTq*BlpCOmI#D&i3v2oYj]-~~$@ѱ8lkAhl_7٨3hG4Z `^H>Bٺ7%fCH'@9H.nA5S_wPF_ ys^`f}J@,I"E ؂!Vřk_B;IŨ5{a#,xnI>`j 5_>y3s\i"[ 22R|b^Ğzazy$X=Ow^qj%`/F;w_e?d2uw_Ȱנbޅuwk'I沾Uߘ^g='ug䳋7^?AAɰ.IENDB`3Depict-0.0.19/data/textures/keyboard-ctrl.png0000644000175000017500000001321012640746376020540 0ustar pcuserpcuserPNG  IHDR>asBIT|d pHYs//EutEXtSoftwarewww.inkscape.org<IDATx]{|T՝y$d&dB`G-UY|Q^nWѶm1XqhU\P?@x($=3{;s91#q{7̜{<}޹ƅe;`bha0 `p08L& I$a0 `p08L& I$a0 `p08L& IÖlZQa"-h 'S$ˠZ`0#FM~_ `U5 )6!׎̤hb0ꪚk?a&QE\ PW_̧p PRR‚B8NXf9==h܎ ΣE)f^y]׎p+Ǝ جfUD8F&4:P(0VxDOu]W7jѣnF䆤KMhZyދmWɓ's2` DAHGM$ BB6aEoy_Y^o:_Kd`tGD`?0V+Jv`X`W)wD" Kx9Ak%*+Ǹ(p8L$#1b\tl(X <^)"zz{| Vc\b߰Dr(pJ/-G{G;NmF @_x<&T.NmE!˭èr3YY\|mfnntt\F{{;JKPP8w,:PY<ºZ_uU%6SKSVv90vtH!=c\ \4rr(Eө8w 7٘ӝ2#% AFNB^┟ Rգ+ȥےB/t?d֭} v~p&LVM5. Ç`ܸ 1GK 1"0$Yݻ|ތU?%H 0-?\ o,!@CxqB< g꿽?y_{d6mEwr~!ɘ t#}/ .X薷lpߊx^x/6owB6aM7~&QP:xBpϥ fF~$" `;Rx7Te^/Y+1t$ +jEkkOcXUttt2@?z!]p;3~LjD"N "኉1?@YwHKP3"Cz>`ݚu*#a;QToEEE6V,ŋ//;Z^|Q|*O/i4 @>'/1q@= $Js0x$4@||y>绰f+&guɪ8x't6zvW E4XfjY&G(! @XPc\} `[tWҵ@l9 $(HZa X9,YXVf+V`ocG.^Ĵ |'Ep8B0sַk?"Z[Zrz bo-vbJ pE#QŢ .x M>o꺺zEө|kya\w`Ҥ-mcOA<S3D?tkoӧa`ǎ4`>x^īń Wku`4#cP~0vO8ƄϙHLSĒ8*HV,B0*2 DZ.Fƭ@]oYow2N'&N!P8G^񼂕rMV^Պ|n2$jY|6;- Gn. ʮHs<+{ҏ@sѭ}q)ҏNTUV,˿Q#(''ooZ\S`Vo<̹yrsqqz,N+()iYLRddm:s]QtNhm>KuFF[p=6'qW {xerm w3]cȧL v1-ʋE2l,V+MOSڣ}*iæ2 X~ftP\6R~xV٠yqx-W#77Wu1dlB;#HK?+IW +=9AFaa!Ӿηbm0%H01cF>O.*'OE|p@׷`32Dmn7HGkڈP!1HnTTpeQ!Y+L'92Y6?*-"Z@ўr<ӈZ$G?U}9k"0ڃ-7H$[3ƌ݋ŋ/N1b(,5Ipw:#cL-'N}؇Slt9|-3mc=Boo/~?Z8q׷ 0Ӓki9n+-I0҈V[Y{3Ɔڪv 0'O֬^rpntBNihsS~U l:> ad؃w-Z_,www磻Yl{v?O+DPUqُ2ysAd Cii)qEֿmߡO""w0Y]fg#+層g 1PZxɟ* Գ$J泀's0z?򱇹'Y߿oo(Ϸ@ e_>X#JG0Jr嶃 z{z;4ocg֞D82pJ -+0rg?DC 0q~iF#tU$PيVՅp:˂cY`hnnƋ/+1{l̞3 e(++EWwCF|C:ÇcRÒ;wn/] -Dhh+I!&F?.4,A+HGT#xGp`U/!0[6o[(FĦw6+GW-\سg9{,y}}[.sI@F@Fx!G7_Ø1ɵG,]?+[#6ĉt.[m}gW. 6+绱M9kî8aKZU$?Hs ӻxAcV+q;s>56chmiEggBL2cǎja+tRZa>&TSZP+zrDsBy@yst݀̽yN BTt5d$@3}Q=p8OrjbI[`MpdQ@UA*A bI3{ zq@B~BXF |(Q_/ς(g?V1>Ʋ赐.m$Ffqt'p&@OO7wV V:M ִ'6\=Q `͈t"9BJvĐDQs1rDnl zz%}RƙLlt;+t~T.0:yeauZM{ENRݶy<أ5wtv 4eA.Z-VK(8xh?gAJH'odA8y |7H :Hl6dgg_ jÑKhl"}юP6;"󦐁"%x$*pE~I]6DQD ^Z=]e;};h>M+Y5==*(㮬,$wCAq.y{ 5PCEB^(Bp[!$^#ػo/&}8r?x z5#ai]7Q6T `nl{Z4_N,Ξ=vyKuUZ8 {ŋQYY8L B}8pN`W\A_5tx KLGLd[!" `fb0Sm6VW$؄ D]} ( GMj{æIձ&:0 `p08L& I$a0 `p08L& I$a0 `p08L& I$J\B68IENDB`3Depict-0.0.19/data/textures/Right-arrow.png0000644000175000017500000004155212640746376020215 0ustar pcuserpcuserPNG  IHDR\rfsBIT|d pHYs#o#o5tEXtSoftwarewww.inkscape.org< IDATxw$W}?:L*G`ZtN#9&t>lFBav%jlC 03+NW}RJZ+9(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb(PPb$;] l:*)t uzd gjn˦BW@@JS@___nmdgyp؝xfphټJ+xms.89s\'."5 /38ЕsT'.t-Opcn&=R(02CG3PQ7s[6<."#384,ocy߰ÈX""38$HN+-tN3yER*ml1a>g۲@),l( 2CW;*o&oIxbYYZ„""38cx\tvrMKĮ6Vq0-J(Paa@u,QR_MB|}3z/agg838t=Q і~>swg5QxKpfp蛙^CNB@gS!?''}6o 338`5TԠE$Kyggxgp7`K!D x Ѓ/SEt&@*9³2|g6mfޟ$7EE097@Ǯ;O.9-Ds􂶌="o3CgPB@'!H! m~ Ź{su.D2C/lG "NBYDeY:򡷞ֹ¶A xtfpv' RPQBp33% \"38k}/39p,mP[: xSfph+vG-vIh"m p7/^sc|>i1#haHk?6sQ&%EhaNajܖMꬠxC[WU=tg,47$9)r}z#0 #ȿ=fIE7oyx x_go>t.}=tH &$]Yno#Fفoy's_"b< K+{*>|dH '29kS#ʩy, )6_3E_}dpaPW?v-⴬fR>nH6[):F6Cg$_>S5+EPA,Ggw8"|C)Q; )f.n?9M~ƪHF}BH}ԡX돞ֻIW,9 4C I#%~(OF;$ 9|RvtEĊlG~% L*Hlb;"˩wyn ߯c+Xm@Z2JB A8]Oҫˊ!g/fq*xXm:Ϋ8smϾ}#$[>PaJ|j; 7W5 $"_VjC@7HB֧olp`3# 4b/w _k=1Z9!69o={kթElX/~)Wa"$?/텭9tUZNu*57ʈWu ۛ>=g7G$$f$mGy:!{%ʦ|١ 7PEX;_܊wUakq=k(qZ Yn_e?_!E`?cD D Enyp=GDݺcϐٟ@-|"u'zH iBQj2Tm |~?|jD*4,,1{Ewp[x'Cݑ0{թG]XV'dF5sB(95~^!9U ZHnB@5MŖg3 sy!:s׫4_΢>|doc;CG(ȡUn:9TV> l\BKmhBZd>"vi9Z΋Ϯ3)DC1ʉRoe4ڗ X%#\hx{qj߳ur7׬rQ>8^L[-qAC}XҰ5} l۝O01k(;/n$H`\>|r )Sdx S#%F4 4m gr OOscKVhGNO5V˹EM8SW`;7?ӯ_ƕ%-=4R7C at +RA![0I6?;SK^%q,OL5?&O8%;o!~SR']"!@@cR" z YnA pv+qӃ;^ⱭWDC89|mx 3.rN5&nmTn0wJ ZwiH`jޠm{SY3ܶ4/_ٺ![UD|CCrI ≛,"v;(w>6}O`Z2\Uԏ_7SfQ>;|%}$݊bɐCpJTj^ȒU0/%S:?<ή#c3Z{ 1nyy;j U3ǎ5m{ֺh~5NSJB-B$I 힑w{ 07s7cTQ-~s$j4.Dp=Bl]֮Y{P$H{I(+ -y=SoQԺ_սj,'"XփU4lm IЁE䗟g14CۧM 2(B+4K^mw0>^QI~ @s {ާnDs4tlEsP_[A$qGinu`{(SIXt.='Ғ;hzi%9iZY{eVmVmsL>d T"B,A!,mg{ "VHh$z})\zsEk| xǫWNk= =H^%!xbʷ?O+X\-vY<5Zy5-DFYǭZ )ý)AM!S \ ")j 睇ZY}%˸`cvKP^,nᘓ2P/Q>QW,- 9 z6`iDhq_h trz3 6zw\*'}=tU~y_>mSBBwf]Ъ/Lp[JsF @KA:-}xk<ޠ?R [WqdL"-[N03P{HE ie- o]rh=Lp[JQ&@cH&HE KQ籇%99eTYEP7o/9c;xx^5F(@ƫ$Orы)Az.IXދHDXB}3 滃;WKHǬUG=ijdZ1?Fj$$auOP"#b󁕈=Qgg+lɝo,ܴ¿?*ߤIcջd/* j'!2ڶNճO;Lsmu @O# l  oȋpܱ"߾g`WsN,Ur ?6^5'0\W-U-ϱYquzi," ћ^. ߺgݢ拠T]5?ꇩD^ާVG( #d(jC;9tJXփL'ŪikCރeѣSv_8;}߁\x07h+PG^Jh?c$j*m)dnPzmp|jN#.(5hUCNB3x6z189_B!@/d`eK`}(([n6r؝hlDhN᜵i.ژư`&o`\;bo=b/*g{kc(rG#R?=ID*5[g- =%L̑T~ /9H/c %@ړfM=4Åi@p:&N)]smfl!P"!^ 4Aby" =0جYa]_9ϯ EҼ>4!t L Kۛຫ7[ACCoi^r>.ZFbϪ[;-.0$&9}m'zHh+@ V" XC:Cd05߻ZTyӼe^4'G>m+mO.+?@4[e. 87PKU7Cwxk'O SCOhǛ/uQ=nJVPVmr86V3l T'5($GüRr{,N#07E1NP:6i{B~rLZugxåYϞ@й}8ESm@wE]b?_iɺϱyI<2ps\<ەkekzSޤ/%IFvJ*7l䠤dQ'7 쵵:Bp@7\+?ժ+&} wg,Y)6'`%<y4[Mժ6_ nCq:=d!҂" ت)'\#oH_H4o@?1~l o)tY?Wc;etk^޶ 퐃KdȯS *!/$rȬddVgQw(*Ɋ> $y9i_?KX: UFIUgtFVJ[z_Eش3r;Zr)-IVw(N|Ǣx]\L!䱣:YۯsҼ4(wPmh/9~MqZ\{:zG?C0znYU <>'7GEٟبgP*;̉@&@ ȪK|(j%9$|m,~}t襕vb(0VsVO*~oX` 3Ӌ)ujv߶{yfΞ}Fjo W}S~"=߬|MLrG 16?1]2٪9n>N:;x /[k 9}tJ)t@ϖ0L!e}-Xγ`[mms۲hswS:'2ؕwI"U웁aZgٟ5aq/W_0{ѳ:zѨոlږ'ߍ"T"v *,,r<09~wߎ{L9lÃ'YL_n+A:V ڹF0%('A+r# :Z^ r\<~#S&X~y?F pA8#x9p*KFuÍh0,؟5fpcBSԈm5j# CNj79\%)ZrxC^^[ 00wkx}WYeGm遽%M,qI2ք`I<C'l^22tW}a=YyWs&<7{mh^sM?cȢIkZi]rD f#0Z,] IDATtۧ{[s,YYvZGrF 1Fs'nj@Vb ^%0P[ZMl Em߿| 8-cz`J#d ={g뉨CFbQ74<ÓG @V{m݋tmy kq~>; \:-4XM='a T%ur׾&섩!cOg6}uWP;1pd޵!5im-u^nR a4*b uF"i=r `ox}ۂ;H'\TɊ6zyBbVN;IPpf|yJŚq h8î<<.Y׮K;{0Um:PK!a,<7ka+\K~8ƄUW#z&0Vmv!$WP31 2zZdҳ. @u`늾y ZǪM<=]`;6X]eGM l˜B{Z_(p`y䌁D0& Di§8%4r]Wyn8d9\ ǫNjb_3!M⡙PV9Q{Lkkd#ZdMH*-6oWO-~yKiUiهJVjn!Rvte>{ł("uiyŲKMNcTA- R+H4tYC 1 ;w}5 {q[^ $pZ;1!ai`Id~p$S>@rR'5zYT%C2x!DirPoC/{ZE >+SY;7\ߩ#%[rLg5 Dvζ. cBկ7"-#%35ibk?DZaE)5)Xl0X &0ø&p aluKl0[n/ŏwl}yؓu= Y9Q"=^"5#b)88=qH FM{Qh- T `Jxqw3<+W5k+}ZQ|Yv`e,%`<6Fό & #WPhhZcʀ'aJ< W׬|`B%m,4NB;$bJG)6,lK`R}$! e AǨv,q,P,1 ۧa8W=i-lU:-wt#Ex.jJLbDd?OH='- l) pNSԺ0'XVtYOإi \R:icT݂ؓ\p*aQzbk `!bei.*Z&iE2N\$Qb9G}PQSr\;!ۺy- &ÁBua@gܻK__/M/b:'kR;s@L[xz{+pjx*wBA!oF܀?0<]iœ,Q|llŗYȏ>v=wY T {,$C栳 J'WV #]km37=ři5ty˲OG: 8\b'yJ'3X4;rmcniEl(Ԏ ԄU$OQaNW=T'gY(xGRp\oF;*A'b$m~or/ӥKKR:Ejm/&?y/n `KH*qX+V}B:!$vjPӎ}U>0MVq"M 3&)ҍKݢgc ڴp':Ú86?4v(Y.aPi|IO WtZbok0%@v`Wv{+p*re'Q+tW,=E81 R3)ڟE5QR׏x7} ؂,^RM^:!z5;Q[D_7X;v\!FsV/lZKjF&p- KK8{T)옆ѐ,J;LJ>ucq ox(/ x9PE4hI =pFZ e ά-^ގ*p2[/LU Q|*I8PŊ}|$N)E8L\FfDj>(RI J 3Yj1 (GA` b1>`p9\r/3Lȝ7N`I`Oꔇ<_j4$JfJh $(5?Ѓw|vK-aKWFW hp!aNONl\$ AgB<n__k Bvlp#ŐBj`e^ W>GG5njoI8evQ_bo,gIL$~6COZFk]KX~H8k{Ic)T2`!l{>[H5 sJ7SkV/-˓xzUiaDZ70 9id2`&71*Z &(.*]V% Hfι=w}#.L_I)z ᚕp;v* jߗ`_ K=P-!IM#l)AdX'M3u7ѭ}Eaa0zYD2@ېJͯ%Qu[io 8XY )p 9P-(ij\p rz}U>8'cR,>Ep<ڄN"k4*5vx 7WOկղ[FP#[}zQ}3??|P9[ًFډ6H%׬^>]8Oq{n-}'Վ8}^Ͼ X,CK g }/[rjL9}sBkz~R>i?X8eMYa82S%6! @/:<1͇ Wh[QkM 09drӛI*h7֭WUU0[Dq:x&6p&)DZ7ieM;gzhR?}CЖï7j߷,.QW& w]V֬^UMõkuz|H ܶ$rԒzpDP 3gȚh~P @j*Mzr߹јҼG^ E Kzt8럸2}%֬]G"@TZĽX&. oW,p~!nYτ־ `?T"T5rF@lj,pjۣ-0]"\P[{{_s&."P1$Їs݉†!q")DO&ҽɴ&ҽKh}IѓIe)?)R= ӗބH&D7)$H"NL%D"TDRT-dDBZ2A"ZB#LMlk"i M.B6i6iC|3 Hd07_=zE/ె@پ7XR1m;Tpvقb-M/ʛ~ֲf 9|S2Vލ'{~9'8IM@n_>4Ph+/^?~w +m/Z[g酄}/m5_Vi {>a"tIb@+47Ea&;r>cAka߅KA{#()F;¦"Za*f84麍Yj[>8l[0"+5XQH trJY QHf DӚ/?ŗ~39F۰F*.4/?0(9)w:".DU,S,3r-2]<@d/=ఄǾ_O X%IpaKE"kTw@an>ar-~r{Q]i^rpXCTkabLkP]%i{LG-zZ~PZfǿ(ငǾ_LO4&ENḎ@P Y?~ۧ/ю= +/ʾ_"<؍KƼǓŚ0N#NswI!4CꕮI{p@X~0%a.I,A54n;X8j'*h-&ă԰J7'&~ ?}o}EPPMA4ͶjWt<*ktl)@?\|!@BA1c-o}+3uIHpr|ّ"юz-~ V]x [Q:f%b|GT4aHz߄=NXp[ʃk',C?l;cmƳLr4X8t=?Ō=fu?o%_^{x+x{U*m'gD%v.fOSp $/β< ~)J=`%:33f_?z?Վ6jj.(wR!8xj>i7 6)a ܉Pre0ПN'-uncCțaS.Lf'f}ɟ[cj덳b@z5$$z?_p'}^>i @Gb' ,3$NduI C"s{|K~-I+hng}[^Р*o͢6@S{ߐ*̛_!M5yDLD= s7wybqZZ嵂1h\ Q,1q2P?F"Ud䏘XS-z-Uܳcs~IQB^_1vL-³4[b%0_Q@M[&>#WyF|e?m;+ kQ->  OOP/ϸzz }YTL34EAq"`ڝsIF!wFI(kwBwQeO#_DqS] G X `w1TQ4!-E~f9~'6k~;pdʇXrVC`<`h*0pM$2J &ӘbJj &=R`d%ك&c&{扂ѐSG&>a*ĚFf"t@B(oiBXH&@i\6)L;G<=\(Vk K244eDRF ˬ(U( &(fϑJ#;{o0F J-E}K#i=]N%Y[dZDBaقRz#|[;fJc%6Mb.{53/=h=b!=y B־I)uǽ#޻ oñ (h `yfNC"l9>%=`?!1--~#1|N>sϟR[q )oZG 4uTm.M S&<JcYCyʼnS?]4k`jzWE @TQf@% ,wn€҄Q찅8$P2u-W1{MC[ҘG?7b߫~y~;gMET|d|\_~lcqCy*?P]iH`NmjYIX% iR'e=&sx8;*7PD"̀V 8*¨'-A`'Lgx-(޿7SivJZGBO%T \2{P iYlUnW ߽>ʾWy"U4p={ꂴ!w$fѾp{ҴBg33['n?i ?ůsYK <@@{l9;nÞW{q 0r}A JVCpcM3>sNHOP:"Cb 2 _%B.J0{ #tzZG+iL?!]' fPMoձW/cO4z;+Mi`y* @BdBi:XOl /ɝώ|=GwPsN_˱'k:(7(h$L]hIG`6R oN܁`CJ՝_2}?f3;f{wGC\4Чl{0~'[|;oS^\^y *eԅܱ Ǿ'?s{Lu眰?j͸ꜳȡu\nlVz]_y/>K|~31F<C@{QŶSZt gc?<~0?|V&hģ_^WBpyDy}j9qxs_Y%%ANRݿg[܃k(U_UE E#޵_aIۮ/+q2Kz׮1r lZ-~31|(h\S&el9շ&3aSfU _yC,?#Q垸mhsҚ9_9Ky@0f<>XKSUdOǾ os/qI# }@?v~g\>&מu!`{=!R8w߸gދ_([P@IDAT᭽%PB@&'>gIŚˮ93\!K4P-~j+A;UWuQA@6 Kیr ЏMgs^YÄ?l'J,q R֝DeqII*7'By 5yyÄ?Aebp˳9ZMU}*(hQ껎_w[yw r}Y|*(h 4oKO <q9 MC@sBlPx|w5T}@@ '&0p'=|Z`WhZC 7Dk +G a~¢Z f*œ@@c{ J"~h`@A<&ʣ0gP$BIE@5*Aj᮵wו+4E#L A|Q*+9Tg3E-\;J+ڀp~_aΠM!z>a|)J$0D =(W(h3$߅zy".Fpfz.".".".".".".".".".".".".".".".".".".*qJyIENDB`3Depict-0.0.19/data/textures/keyboard-alt.png0000644000175000017500000001244612640746376020366 0ustar pcuserpcuserPNG  IHDR>asBIT|d pHYs//EutEXtSoftwarewww.inkscape.org<IDATx]{t}ޫ[W2X8Z# `%:6`ahzh===UDզ9=i(%MiZ-ڄ7Sl_ekkCrH;;;;;oogWR oafrxp9<\.G#rxp9<\.G#rxp9<\.G#]ݝCNp#dIRPA=~`/7lko똔a'EypSM0xmLtuw>`<_MK y?PUUTנ>G$h2P8!;׋ "uuߑ]ݝ@}~,X---bD<DZpŬano8'O'`kxb1ϟ믻S [jUΕ[/LLDN&h AAaaA@Xa߾:v; kDqQ1/^6$ !2A$2u|zg{U9eX GO|#-" E 6 /C$C:sS )WۃSÜFTW+P]Upeep6c0f|.mDͷk!JyuV!FV5yRH&8{JȫΨ. +@I(xd,z'#^}T*F1Tru)iXi BS #=u%ccw +#UKgp^ޕQB? D?  f6GĄP- 1ӀroRPW 1' vN @w:ګ Gǚ{M0ѣXoKJÃafF 9 r~=p^16d|1_|b084.q lIqdN5=Q3#Զܑ<oiO QmP0Qr-+гu;IH!!.&L+xW1287 k۶şZ'6~rJq'w #rg%#Di$ϷO*ػ4>op@(4ŎQ__oTOe8Wڬ퇠3PI !ґazw(/_1>WNj";mx+χƹ3kG[[* r ᝙GBA!L<;_68/ -=r;ʪ/ľmx˯].L>TH6ˈFcH4ov5'JY1E`,;D1GWMf}xH0p]]-;V#vv܅5kBX&|F-e0A7݆!B?[={6^{%PB,!aH<"ys[:}' غep;|"Ae Xv2=O`ӆ-O#r JX,iiWg J5'E_V$R,SO=#uj' ^ӊof7lķ[bS6X p+1:Ig/+pUW;uuAc,[ /9E ``% h_Ic|^}SXr ?|ppYK kƖ AGPqV7?iz&)`0Erȫ7ȟ ^Y]O@exVĖ2|q ֛-p]DI;_/ Ug/WsG}J/lp/; o(;ud󗖖<" lڸX J 걈Q +(>?ӨyP4 O@o(`-nQ)s뚻# `sk. h@3nc*Pr* r\"gWDn]mt~)W^u%G1#|ߞk/@I / ah(wZ8Ʈ/`2j޷J&ǹS)%zq*\ a_ZE60 C:~'4>̳\~oK>jOIL#u+'ɲoQG.F'6oܒfm=^ nY ªiwXTNnsZ]O5}<?G~8Ҵ·3_:Bzn}P7%!}LΉ$F-LΗ@('o`ִ4wPt2G@P,k.`&1[r\(LHuuk}gQeogpøbP(ݳ$k ] h X {Xzx'k_Pׁ?czKVDM9EK@~C>VoOo^x܍@A_v~on ئm]ӊ¢Bk]M [ suߓ't'@MqDD#ULjUGæMbw7VJ((yLBP[S+DO? Epvh>EEE8xBϋJn%2RɿBآKu,* #}M3:Ŧ DvM|t?hRJq#=A. ApRfA sm҃D–ӊ zQH3o|M1gk׮c/.g7ߟ_~0?#+u; !|WJrgժLjn+O@B{"}Q+8Z\.J(y)'?CC|PXut5z)MӞ=oBֻGԜoVͽ_W}t-Gt=إ.AnrGǟ{9=Gǥi?ԙCd'DS 6v_;q]|zEf|&S‘9@gZ7 oOƿa;8(RFKbcO)C){w@)1?Ci{b҆ڳ.B:̞=5&O1P(@Sc3c!c1{d Tw떗L~_s.@WIoZiKФ %cK(+)CA}/#0AVCQC>?{R?ا}?T<@"c{_fLLLяQUYp;zJp)TVTCL&0( (,(B},2UdEZûR`ddz$PGA D"f d P^nM$I gZ)`\ PTXP:52&&3S7a<2!RY.eB'Ӈd2| P2jkQ匔a||EB^iIٔUx P\\kT8ByyŔfduk&χZe'ӎDD;!L2lO ʱgGˋ@(g4F uO7g^{?/l _^{?SB$ D{AZ\p}:JK0>>1$i1Og 㠔"L;QPJpW!)ZxJqwq(-5D2`MZiA<7)e3$]ݝ] 45^N!8}vͻ:nӕMu T}ϟǒ%KPTTb73h,Q1t ð ]ݝx  P__`0 |_!$FFG10Џ>rxc) ]ݝ1=\lmLU(-s %)-wcKWpRNu,ͣf~R :&eI@FWwgasBIT|d pHYs^tEXtSoftwarewww.inkscape.org<QIDATxyp}?'ApMK,YcvU+٪d+Q]9ޔS&jGXʎHq$Q&EDo@ Aܘ1= 0 H|y{~עb-Jɵ ,!" ȳ']d "2؛"CbdreH&, {Lޑ+2dAcA9h̉ ѝ]+2dAc4e{AFʶ7'VdȂOrbE, {4lȉ , "|#e\ؒ) _c|`S2cADD2e?(b[yx$͍E  "C\)_?:f#@RnUgA7@DSM3,K,`D|5` m97lX@"Yr|G)T2;[n._^d[=a!{h,=DD#֗8~˲BFF]{:2&[N"rǃau\t:vn7a`|9ᖊD~?H$Qkkkٲe WFuO9y$ (jq""dp% "NC`iT իٵkS6&:;;y뭷FDXx1}}}:= ϧ]2K\˗/' p$ZP xͶm^1 "tbY[ls\FfFǻ\.}YD"x=gBm7#S]]g?٤oN'_җzC!\NgLF1Wz}"^d&J,^-o)**aD&-Dd#.yi}^̾MBaDbEvS@3QJkYa8>\O|ꎚywݿJu[+pMYrhh;]O!p:}5!"o\%uǝwޙQgt f嘆0='2I`h+Q}9_))b:~ Jry)dNMM 7k +sNJkEނj/<C!BC vvP\UÊG>Kʋ(AqC@f]]dKD\Jd=w1֖zC}!y}@#e<ď_PW'm|O-l wr3*|RqQY$_0%jnZ)g8ߢk__Y:8CtSYY%|[hoe˫(r珳l2n7p8-% ˗g%k}|:O>5.~1s_4jj&[2?|@ؽ{7o6##[5p5k87(w0|=,t*/^ y9oDGl~<Ȇ عs'eee@ł>GO%K\:cc!Hsʾ}ho0i^@ |)&rȹMYfMlvz{{innȑ#Y{'0k?zSd,߿kN'TWNGGǸ-> ;N'Elij" rNZZZhii&VZL{JeO3L(GA ̊+ ØCh 4uGr_aA[6o9.^v~?7nd͔NH&F/&J)hnnٳ z*j0 {)z40Xcziڴ6g߾}۷zhll$^wqR&rq﷏ըr 4 뫋4&fW t]tfjZ}}>s E]]X;p3 #VJA{{{"xPR\5kXЀ0M cu7 ZKdCqYNpUΝ;ǹs/*aBjJzrQ_WkJ#8]YS3d"8Mؾu+@?mm ¢`YPBHeKP_O}]w1mO`jՂ)jD1x >ol{C8D$G\M  ,bD; 4tQ4Tw I<(u! W`xQ<8,$1f(./M ǖPpI$~ ;Ɯ94F4VIoW<$jR; Cx}+XhVd5 )4P1I҃E)hN Kѝ&E A!J%4)F5""Nr<&R 9~<t")a'W˹v {]Ĺ Q\Esi*&y-2?v=s[$ \"2}!,Kx2LJM S' pA( ;G\DNFԃvc^Cĉ8£5'vbDth! B8A.W;mqx<&mp:=-^뽒9+Yi@qO[_q:Á._=e{qBrq)82FA/0nfʶa qBA?8:0Kr>,""x6{L0+ 0MsdL4)_"g3$0 0s pq@jwl0l!&>"s&@Khq`/}Q}Au[F3 .lI<@ /1G2 cPs&DHx%ihv!F 4MkYjR$B MXl$^@ĄB 6m;Ѭ9b W]☴~ƌyt=][sh"]NSThbl"h9+(IIlyr8te$3 x=8#YK񲨲TiU x#v̒ Ϝ`0a(kZr؜̐ ``ptJKkBfܹu"2?}w;k}Q~Sv/3eÞd:d$3$A |Ԉc&.`Yy]=;=xoPQ"0ŧpYH?J$/X-1M `3`eΟc1"BuA|%pMΟ <XDb gYJV!&42p-,Gb0'\#֌=:5@0oQ8DfΔH$B(BDg+  A{ʠ\ܹ7w[k{`MDGӉi/\%xß)CCg˖,Iy1geKyF9PSYᠻ妉5M~ (EE,^(D9Ғ$ ;ujX41Ѵ![Go-Q|}}\.j|Ci;ujffy#'NE*,(_{{ kt8slKD>zDv5sW8r[SW[oi / ==n]‘ߚNǎ|WDXTZJC}=si^OG:~?0cUC;^m>v쏳~қ2-[7mz om%RXPώ[.3`H2o{>r4).*bE]]|-1k9򏹼a^ `w?"_TR\#vs6.WF}J<1Tx1ǻځ/jn>gy/MMe. @oJ|>ߤOw߾IJ.%%TqGb*_2vlZ?]. ]_YDX\VFue%5UUB!>ҥ KӔPUY ~Wsf-#8l۶uSp5 ){u]XRQ\}.nܻ}RC! `~r& }s-+8ءF`%xS syboC p `2߹SjbXnq[ `TtIENDB`3Depict-0.0.19/data/textures/animProgress2.png0000644000175000017500000002111212640746376020531 0ustar pcuserpcuserPNG  IHDRƽsBIT|d pHYs : :dJtEXtSoftwarewww.inkscape.org< IDATxyp}?=' 0`p.R4MD^c+YqV78˕JƻqJ^'{lَؖKrye("ERA$c=G9zu~~UU9 8C0?8$C0?8$ð x8LZA<^ʀ9`PUuB UU'TUX,^ݏ ͣh4>#6K?L&i8$hjjj$AQUnV2Ab`ZZL&4DD"A2dw𲪪O˲]{ _mmm'Ek_,bP]]MUU6 Nyy9Vٌb`0NI&R)333b1bL&WDQӞ_Ƴ %I~jqTUUQ^^n#jPP( 3332778,,,߮ mY?߿xH2,RU@EJSS mg,c``a,haPE-#—2̧w.8$?~UU4`mzcZX,tvvR[[! ,2 ( Dn턘 ~!@CCh4~x\vioonPWWGgg'&iFx"PH$Bww7333}#V(Iʑ#G(++`0p *++m}}}twwʕ+$ yQJֻ9c(--رc96u][GFFrJNi.]~}}}6[% |EMMM ~?7FnN~67nk:2::ߒRU׮]f7 M⪹ Ջ[.ş  #hF]kk+^w='Ob;_ڵ>1F3 <hFuW૛G/Hgg'c=555=ztyʙ3gD"Ka^u2 @Rz{{_HJ~ 0@#a4)_$aٰX,$ bX< S Ztx|}(<;-B!~]###LLL ·S xG9y0TUU$~;PUi'N322իW_2ldd+AKKˊCUU^zϮ]F8k׮}vM~ x73n7wu^Q|aX]+!ߟ~]~sc,366*Z,ڐ$iź:::^,).ߕ 2===*a,4 >NM'`qի'NhRIqqct: .puQ-PͶjǏWF/X,F__Jm@ ` <C㴵!" L]]ݮ,L&Cww7Ӏf} _@UUNJ|>uB4W^]󞑑0 @Wooo{6= hӪżt( Eee%,omA۵g||{UU۽n{$I"]uX0EqgqD"TUA,oe 6E~ x @0LȲ tuurtþ~z{{m1 Į%;D"FN'￯{6L~ 8hc! ~?!=< IIYYFEDтt,_\.0 ߲rcCO&Q9~8>o)++vGǒ8%%%ݼm#myAp0??,'Z[[]?_@ P(8qK`0Xpv}CR0;;[/T܆8[RR!`c& _ɐ-(c闿%fNQsjj WЪ͛b /"FL&C&-O{͸kjjZಲP333\~i6*!:&&& 311gZd2d>O=eX@ a{III +JBłsnMO7GGGq\)x6}]DяV!?80L9J/p\p(nZJCCC466F UUےD$$IBeBлuOh൶b0VBhnYl6ox1::|3Ǧ`6,,,4|ck}'n#?xіeq885{$I####9M&Ӷ\˃477#IEb@4*H 6Xbh9&&&<&x<͛7J%ٵ{}%f_V$R\) ŤRF^|ф@nu[Aw A(blllk$6L&ej?t !gX%6JD gFu_;s27WJ&5#O!D&&D._6`2eR[hܜvPU5o'9 .\0. x< Xm7n'pM@HkuPx$[DʪXvRBI|h4B"@<YRPtZHQ mm)|t:4drVEuaPUD"Q1==]#?FȏFG& E 2?ԅ+IF<&jjڨnvvZXZZB,V‚J$24-۫hf( 5RQoQQq{'PH$rn'h4Z/r6-p3gKYctt:guR[ر,lX,dG~I2\B#M 9F0==Meemg2s(ZDQb2Yx1z{pTUat䤃#Gp>t٬N俟8X199Ybdƍ1vnw<[$h4'1NFoKLNJ\Ԅ?FM쮵C EY36j#0>>nEEE  4-yq <[Au8##2;x>^hJ[#E @ N&9[h"^"R  fu\ZYN4&2-!𑏘W hm(/o._~T*h;hv. sXm###X,/ֈ/**=Xǎy!}—u-EEem P1εp VιuM&"b&Fm$,x<=2|1&'s߁$rp&S7 "#G%}}/0;;H ~YFcдe%,tԗ"Tl TfO$刺?,gx5]~Ţ"G&ro0eUUIlg5\ Fm46unwI ._?,\٬iiM8Vb6U{TU]71#kpI]&yS_\vfg`a訓]Nlۇw @ pvwEsydlAWwE[,JA:,up8 dQS$mf*** h<3+͛ZE@QV'd{fⰕE NZZ׼_G6{vU: LΟCV^G<.d2}N:L5~ nI>lvW %x\%%=?A orBu%P@_#G^eYł/++{# y=?W_զC Fc2n1? L&tA~Moff&Wouu5UVVՇQUY &/##Bnm8`v6EUUKLzdԑNP*[mnEEEv_x{{rߋ|& ! Hb45Y6=/KR cc e A0iׯMz{ @.o"X3[~@UahHcOȲrjFeFGTT^18 \$N16&(m~d2tp8<Ϲޗ3@`E"4 p8AX{JpΞ|h;gE0,B9}EmQ*ꞯ?%DPR(;ptu(%V:&&ܟ04#}Qg}ЎSqÂuk\~z.vvkjjnN|UUD"\umhyoSTTT8B[ρY8~܈dmY+..s ^+ՠ"ZbW8.4nrK#*Bn/¤RH8H&s)Yf3>lhh#<2R `0({ aE9;`EٲY8160044hq TTTt755}W!4; BG('5fUFFR%nI( (--niiN{{7֪!3[K]r-wp0-a6b *,w:6  HHc)++[looӧO\`0> d2̾%hTW&xU06R\RR®jEp"^EzfsSKK?}\ᅲ/4RQQ=RИ _hqmbw(@2)L۰׃HL\o<裗W 39df7Z!ܒQ+AQ   Y IZj>Y^)hx\Ew%VХ`'x<س#5v Bv(xMAj@U9}j0@eYf`` ~轃P]Рg D"񜬋X?-7n݋bK-6,-kjUEQ6~xhfQ^^͝f%|%+lUh0"===C/|DQv5) 6ȲիWeQ"?fh.\Ze? hW\ɝȷ3 65Ԍ$I(.`_-I${@~~Ur+fb&iӻ87(ZNyW8z.\͋p+p"&i{T |`0~ fxN+* B*)FBcih6 *@uZC4mW2qtuy806+򽇂N~UU5iVJ:!L2<<0[,V+%d"JL&I&$ ,F)0\woLjj\nm16 amgϞfh4h4ڮ;,9A:mh=jC`Q#ww~~Vjuu={sڵߋb7N3=͚E-FEA; Wz? <]]{}wU{{׶2gϞ%NhS<b1w(qdʘ挰{`0$@J_XLqk8N6jy{F9vK'No>Vkݷ5֥=WEfFEQ hJ`H l,Wjk{=*윧}tnxGcR:mݨO /wEhؓ6nEmyd^Ǜb}tQ9~ϿwD r,{noǛ|U\7A@ւ<~ $vd N3lRoRTsOhE^[+A4mma|Dᙆ#%ߴ$3(gm]uuyᝐz( o@ p? oezsAFp8y,>/-"q'ʁ_[VF >iٲ:5IKKK_}ݷY< ,h.`5jØB'|>8ue|hL>]I k^74,p /uuu}L'BAxCh RsDqG oөSvߥxK O |qp8 8Yhc hIm7{:5hٝ4V[|Ax 3/wS {4pvǥkj&uue644;noqugЖX.vg+#hSЫhR:Α#TVkkk|?mhhnQQQx/BAx$|^~bZ:B+rVBe gu8z4μIDATǣ.x_|߫+u(un6KP"Z`)ZPɲbB^,G 1[GU$MM 473x^zz_Fq !OleߛId3 'Auul7n劊_z<(*{-88{,?ѠF?85`8'+*BDQjXd4Dsa,aۇNg_iinWv}n_ gϞ%}huppBlͬ;:VU-.Vv;)Sb`0$L&Sblq&8$ 䇖iS:Rl6kS (&DQLƸdY,Zhd/!o!6C0?8$C0?8$V2?#IENDB`3Depict-0.0.19/data/textures/rotateArrow.png0000644000175000017500000007653712640746376020334 0ustar pcuserpcuserPNG  IHDR\rfsBIT|d pHYs#o#o5tEXtSoftwarewww.inkscape.org< IDATxwG6Jڕdɒ`9lc 8q@:#s6,9ɶlQYrؼ;鞴33~^T o}K tLFp.0,0)"qmM7u,`SXԇM ȝ-p[/T(,hu qS +, ^j @nܴxxE[>:YP7< r"-` ^ k#M.P, q[JM *[o! w,(RB)D qǀ@BhRM|=ntG PH>]ͬ酛[-;OAM}"O9Bt WE^w.6 <#ťN5nܴxh-{ b:fFMi`c'o|b5:`/V|u܏G2,jY a%y*yeli?%}7nZ <,.XԸW3@*c25#K_t=9^:GJGCwְB/ Ȅ|!D( [W7LIVkY$ eS4H* X]wg,`Vb^2M!⒋x]' )7LtOǚGU~KXCO65Uu׻LPLwH&cj)SW1)~0^4+wHY_@Mq42|Nҙ% |Jt\(:_HI,_gH gTBlLkdT'>f4Zѽ`7{nI\'%AetY87ILG?ʮ:ۇv8k9kVo]I\ OAO[Lh>n1}3Tp&‘]@31@nWP$v[T3ߟh߯R͝LK`iU}VY&K}~8`G>f4δY?A`-7 q,ȳ 57p5] UvaM4fJ-+%Ib" 7λrW̒=>18uwm{$Arũx ܸ؆У[o}b^tq;(rIN4 d6[-H~%`${jx&id]uY0kq |X~~b.]E{ϊ6R*^j>mRSI[ gdsqL0ncZ9Üd+oqxEF ̽|}i C- RB~ OM$b&O ߱g^y_gn(H}\IDP_LUHkc/OMKkʯOdn^F;? sC开k]R@ygykzi*%i?Ӥ~w}p<:N*k|pkNK s6WeBt\N'!2rgOW:;iZ> t i 5ɨ&i@3L!$Y>Ψ|&/+e4CTis dO3 x}!;bYdȒ޺,_i ԯ=ƭ"̼71S*m\c, i;,~MADgT#UX^?,J߬o0M~:杉[~M9BWoWீV SSk>ƭ܅h82@#Ka:ܙe_+yklX`]P,e.U8(ID>#.ft#{~ί&)ȼœ`7_r\LZbzU)TbfTlS ]<`xJwPvNZyAذyD̠1o#21 8 [vº ze:Sh ->9#[O%^e13FR, Oy8#)Nɿ,Z,<ȭ r[5Zg3lbj5VR12:fZHd-"_(JmqN sbC y0%㎸5\Wơ_]h3o0|:ri)+^|߆A7,;T?w0apZԭpTڂybWڂ qr*iOdR͈rP}^Ë79YLӓ|Lsڌ_]=# tN,hq#tmwSi <C*)є%IQlqU{@X[O)͚a:0?9<#tnXҳKJ'N4nox,6ulqWWۈDg:WU'ye]g [/yeIHZ5xrovOp?[cerBPEY҂׋qahC Sh&0҅!:( vm ŨQC2)Ѧdg,]>UA0/mQڃe94\y2%t6COQMwv"><-x{[PzU$ \T*e^ui +˝׹}(uW#8s[pN/|r$j5WAn6+tXJ?0&>iA(y|+;Ks{m^%+,k%a3IRV2ezjB8u(k'X뮈-uNP|bpBOvc|cuBn9؁ ' #oPe$É3 >9skD+a|t=0t-bY>{ YHCS hd`!ED-uAn+dЄ׷K| ~yLe?Ebek#a| J{)eXk&㩼H_naᔋWƻnKS)$7#: "n&fT '`O O@z kI2цc h ɼ/9/(:?1Rpʯg.8n8Oh 0R 1*f {([;ip~*0Sn8Ru0}@^^ܝ[#7tPz^mi/vfY߫HpUE]\ՀqՒFW!̬7,-1xdTH~.o#omV!&pϳ ^Py(]%D2'c}~^13 p\@s蒵E8'R>_u8e :6ﲶ9/,VoːQ7Q؏d*:rAٱX +=jz{N┫$ŒQ_WFY3IV| 9XR;84 !ZG|^W_ۉJAO=(N Vmųx"i1LD(<;&p-Z:L,#]J̤巌+ð2K63dxQ=7 >fG9(A˖Y~r1 &22s ~UhXCk]{3g B|p`xI-NT7cӥOm6#ώXD?R6 ik{t:V$Xs ae:ѥfm;W`_ExGQ:Bd Xj .  #q;*llAn9?+sE9_o>yƔh/>Kfk0am"E=pqn4cUjXjmcFL[֝ o0wi7_A)Uj'(Z< jC_v}L5PL A-Zu[P* Oϩ,Y,g3*l鷶.?\Sﻧi}CA1rk!~,8vU& ]a !Y,0Yt! KXYpIJAoӤE ADnqi?8`Ǧn{:1_UK+20փQ V^jQEwn7rk̾!0M6JHPëZcg" /[5R(ZC}52OPex@MC}l\nxelh݈( kv'xtNtr__B[;*K9a~0'o߱6} )A鉜:ν*ww_6+SܣC|CXk{K1M8\އLwb@WD7T]O'x@nv#_X>?x9gG /rk:F ]##$?OY,SgoTH`3>w !Eye=/Xb `0sCdRagwۺ#s 1/xW#6~ߠ^eV_b${hᑑ;(aE`W'^A>yܱ;U!&Iê.Ob^0Yi J lۜK]U|W6 eKEôeL`#n2 _ F/!`y)ŷ $K1qZIw]`*hm.X쒉iW120킮\R*lĕ`$$$\p IT"Bqoń_* Aw뼄i0AI~Gцx, ~vm+enAn 䆋c);I`N "7?$ ; ŗ9@x¤Y- D$_0q3Lһw7ꩉ|=kfow }*.d$riEB`I?sG0_ p91LK=& 9 :<C*Y6u K@d.[cqmVPz $fMsuĖ}wYCw,ETPz#~QZ!++#!Ö&SϜ O??z UQՎ%<}$4NX&/vźhaVB_u 28kc)qE刍RWTM+ʧu3=Upc)ێMS駭Xpa;jiX# | ~D3K@ !b]nNia5zȩ!(||`32h6 Hi.*KԯBکI}J~!ϢzB`f42H4G2]RV/sGa.+ )&43>1Y0^\⧻ShDT0Ͷ {*t$G[ IӓIn *h #r;OS5"1 7P šw`C 6?] l/Zu}%`kFs}f )#1BqQ`*iEw+e&XwN1i~RϜW '#~"fB9ۧN aG4Zju6 :w38-Ն?0$%jUȐ>q;xRqR=Ichґ-˃%W(I+Rx e(_bG)VK;ƻuJsZDj?XK-DGn >ҐٙY"lovJwJ6u*^.l,3 0&d,d̮ܗ~{+mGUz=v8{OwewMFǡ8cېۂ(JrZ@]>S0+vir? FWmǾSm 0HGv̚L)`Xq5 t N IDAT)2CYpXϢ(C#c`$N%rF)#&9%3=*ԓo$Vlҽ<)hRuQfV#w o[2ضFa -]`>#yq@GBO-Ipڂ矐ĔAU-֪=6K, rL52@ڱe)0Tb)\_a3~;]ՑoPYrrY ŗQw] ²ۂgQ,MnYQe4GYv.`QGX)C4kTV+mA}"]wO"$4m`@q4'ey}xH|go{Vx=37ڷ 0Lcc k` 0[Q[48\V}#B; E=f3{ xtXdz,bO1`<(zmL3p2Pl\ol+nX/QϻIxB]ӗT` `4{P:Bx" =5<$Y#5d@Sp= e֯(X:?Q@)m޾Vһ M rtG;bPLஉrs:]#ͣك")˽+{Yr%-uz,r$qI!o>@`fcz8 @wX熑73?_|R@A qA ;s]T;pĒ ,`KZ(WSs_*/f6314%zW\|ч^t{r>^_kzd}$giR@]Vff|}p@叆;?K G}MyZ( =~KmjU;`W !{pK,{p˿ +{]%"˔؍HdGYd0j|FK6q4# v/ 꾐>V3X{DI?wrG-x]=XTt_Άd y ǿ<]q}{z7 g )NhqaVߑ>vt d~/8;j)mV4@=Ʌ*:#Y!{ȭ+ Oc JJ`taL7A*.N-D39+BGkugɅok^_NNRď昰zyNC.G^p]0ld[-VeCÐ5,u/sndO|afq{36ݱiXۏ!E9aj׃_>-mߺΈ6K)gH«1KS3$tø+9$۱+U@GT[ޒ@{&LB@ך`Nk[v(Ǭ2I6oOa+3m׳KOn@uZP109SBCHck/mhϧL-aiE!D kz,6 oSq:1-.;U{aw |V,Xį=O3>޷ (.i!shy*#fJr P [3{xkz䎛|O{w@K^>LͰF]\܌ԲcLݶrFa@ǮFpud0`e!2 ,PˠKPk ]: ͻ,\,GPoWev<<d Bgm8m q0>Е \w%oBv2t>2+N8vMCc՜wwY|" ,e.ZIZnHRiXIw͗ba1Y U vA}Hl C_C_"趿23O5X]Y\|, ouʐ,SW/0t#Y,ZW7Eޥ- Q:\`鯬i][3:} P^c?}oTn})B~FrY ~s ̰ ^-wpB9Luk:pi U'~8vր=s X֮!K vWc-X s!PY+G?W7xzZ$L2,'L`F5a9?F/߷iI'AV/R݄iH8`Ha=4iby>Q/Dn_gzIHo8gOR` aldN4R[+p hCdG_G|һk+[3gf=kƌ1Wm ":jªl*Y/p, Pq<)%guճ⋀{)os(= ml3kHQW=>r7p E^镾snA.N—F*yj-ggis3ni{{~<`$kbH8e$CuiFB1gؚjA9mYLs'𹧀/7:ɭ}7IHbW` j>MA4rVau֟uJ4磝3ˑXq/Y 'R#!% m#^Zh7Ru`lk-5Ut{谒YH+~?GnLw=f&]Gܑhz\&~!ǽ^?!QB?WaVj{dJ9a~LVy޾=#{޳4n@9<;n/>6qgSq;[:LiS=s@nT,ag̈́=q~Wn&/BjH!N-C<, 9 p}brךu3x+`2{ K?kÕyUa(|0 fW@-Ji!= '@/.7{qJG|7 %9E9W]·t?< +|l"_n[4derM؟W sd- }Ŕ ר2{d& o4B\t8ڥm ſb<{ iӰy3p)es)h3ws }IFg9 yY{8) <c*N0P$IjiBkZ,d IlnWIJUT$ eùP鼙ǵl.%5;&p]`.d)L `5Óf0hh}[G{QP2m–տNd,xk3+` 0RIE(YmW=R'l)0y8fL^)ʫ* rIvxkzly GQ?V8M[ƾ;`g|"L F@T' L-?!Ub#9W|r/b8oO:?w L^$$ʵd0d0_;޻o}h\M/r؃h/,!VyiSp,MCeTG5=n8ŭ H'Cͭ`H ݀F֙&  ,BVATawQ5mG>4ɜJw]2'fL j>,qJKu*ʛLSS01 r֟EW1fk;Ka3w'm X06]ބ_*Y.d Qz2k]Ֆs)>+CE;+TES@l ˯XÛs"C)5!h&p elیѱZvyڠz4S7糑% Z{’[ ">rLާh-_Q40)@,}i^*#ry;w=;/c3M|I, ` |_4L?'U_  uW >=HS"|'o?{f0}md]|اIM Ӟ8iț??R'U0#aڠO a}U@nU!v~x^੘jӁ19ƘЫk6FOdL}С?v1qŽ^{,iht}hGt E2Xsrmx׆j~˰>vEDԟt{ {N]h6F2/(-i+V@r0 )<`$t2FCHSwoK=۫Z$TAׇw SW1Hօ<<+*xQ Jkc^2' & 4_gh`ksz qQ8͗a(6H=7>Y -W3/<;=#ŏ2x9z:~ Y6_ &Ő$0+P Ll-o@$ gozj WZ+XPK}Wq{l` O`LO7u-22vJn3|QppʷWu.da> 1,QLQ' 8I%Z$X!Yki};W~FIndF}7+kzre *2{G+ǭ9&.~.1OKSYO߹-73Oz,šXf(DWʡ#0%,NvZ^E%$˰TdmΩ D<}7\Nq$hB@Em^9_% ' .YU[rߥɒ,U4LTjOԓO-oV?Lx3DG'$ĻWSeexWΫ[Ы?@R`o\]`=Wf 4*OBơ+-?_Tj~lodT3/mJ=C wazY-AK;@Gl%7yeEV3I! XmuҤf#VtU(oCK`˰ Xϒe3\_iooΪMIgl*$N`yevLC&j|"ڻe{잿{P;l.&zhFX ޒ7G\ |RB+{"_%|."s3ɜIZ-~"%mJPffFZEa,aZv{ Ohea"P ԡ/A_!k?qzϱ S>?[~m5Đ46rTˁOʒtW {Uap_ iƀ6^%ژ5DUs0 B 0Ռ. -SZ_?Ó2 0A="31>5R)-uzlɉ;#s~9P0yS( R],0gE!6e/:ᢀe V ڨ>k4BRٱeyC@[ ^{3❔>_o\ &)2; 4 ?{p/vhL{dw$0Rjm=}vJNbwny؝D$v{Yu}@AEQ>x[daثUeӆ|:OaZK#,Lg41eu) Lq!V~KOfCKҜN7] 2;5M51Gx~ڬ6LywMNo|Ro3 'of6~]=DHx}(^OR}=Ų6Qӭ#ݕԠ /OeܝZF@k4d4 ֟e9M_2a gKp(3}Ld 3G$ԁ͏V}xtΡb]ͩ Kj>SQ7uRWAÊ\2Л3f woՄIJ?Nӵט<';uidS޻J<4cV,%z'#xs?de`K"IvHZ /[{n& c8- m,/Ҟ㙂sVގT߱Y eBk%|:MPBʗ YC~uS2OQk&M wnf:VNW#rDT'#9G6?B~ WzZHAU|䝚WjEiokvCơEjN%tNF0RJ#;9+ή(x=)Ӏl"&~Մ%`szj$Uݟ$Z k |0P ĉݟ;U[!ǹYeck)rKaߺɿ4=+{S04Y;u[sa,0?4;˙F!S@` S( )\ H*1yrs {U3;swjdv9N_Lf% ~9=?N Uy=S",?/3?Gm$JKyO؛7Z/)mM O!`8het&ެEUZҏIFȜL?=|?v'#JyK?ʻÁ+\RD^jS|j)\-v%skSV_ذJ< &6(ufi9<`ciztG_0,\|A~lD=AH[O>ŇgG)N· IZUNJq_W%+ O9o˹6B228\b.)KY'=G*ڜҿ)hl@Fack2% K1aAYi'̌Aq1bj{'ө&V=v$o_,+~}aL?xS%JJzEZ$HQw.2X*LX IDATOHvmB/fy4c(AGE:x/fS&+ѲH?:Fql4aN8s'RPT<J!V¾w{{gZD " aP$e>V*߳?iO^PU|J=ώe@4_*ʹ"XT8ڱ4Fk&*lԓğѭ%?UjsEx |ؿmjA E$$[R9X L Of V'SJ] F>m! ϛXdwI=8v$UWM$Méw4sܽmBwΥwN-6ci|Bm /S;!%muS rYoNTJ{0 '{k|{0 Nj/?F~b CiMH_'~~SeT&$>'SOP:vT}b_;oOZfݻ9v~ r?JW4x#vXVe}8)=_0}`OQX߼<ܜ9~CNr3fcou4a'O?{3ݓ+&|';筴w<`v98՜WI͋ʖ?|Vמ'l3b/8{pg M\X|!;!s"bBj8I`HyM2Gx<۵]1zyZVڗ¼s#-^L^B(x{@Mu੆/e\ jP _@׆.^ hLw}k+<' tiΆ T)ώ|.=;S~`n}lPZyL9\G@i "jԒJC)9MU:oaT©,`+, 5GIcu=Ph s#mw/2j =y@[;~3F0 $ pwNƙL/&|<ލ%Nqm:郃uV^Mܢt*H& Nc^všpPsYkQdz%s~R.R63Agh'6Me\xx3n p {4xԓ?NBd98-NorA6d0-XzJ%upNbP@*Ha9$:X: W0{*c( {ק pLJm7TCG(<#D7}j7WeMuϐ0dvA63㏎qY+ Bhӝ’XN/眍O樋sued4/ Q%c&t@oXCw_k?ž2Ȯ~&zB?(Vih:5_v!i&r[E9PWũ? _L( w|k~Js*|6u ,D1vϳ+|ŸvA8%3vDIh3pz@kErZy-}x48FhV@ (%S3MaR+E3ׇI>^Y੢DL|L T"/ԍE+u6RXn ƚb<ɝ$ Ji ? |q lJe:UUP|o^X ?M'ySsNfдB>.Gb}m N`&BveY2 ǵɌz Q0#bc &29. YҿZY:f2i 'Ql{w9J4l;E^֞O;&컫#U@?dVbYIpa $9lTltsQ&Mi̞fS*`gk $ڞY7vE-R'a9?XB#d خVl?Ei {0;+80<>?C3ȞL4+`i>n ώ[ e7},e5'}v)蜮U hf;+6utJ|g&=/as%bhՃ:F.;89Ks-ɒ|IHHI HX>9p%'!.ˆn†$,&0mٖeYu4ќ=wwvuU]=#Fӣ}T귎>wk%$_T_9f U̗NrKWlLESWĿ#(r"LQ;5؏ iKdžd` 8E ay$ïbAENJqX_W'E%@E/ s7}7;'YBQ CFsLi{̱5*ኴxN[b#Bp^ό`HM!VP<&2nQ^ okQ`G/ߏ:ϣVw\/mK'8K~D Ok?1ы!c6#>Mc:8{ .QT>nhfqnIzc.:T!DFb!l-80:rTYG?¿pw_٦F~^.dGDML}z{Z3 L c߶O*;=rXE%e[|5 ~ ?=O/.r IC =NE\Pܰ@mۡZosXu +p6cWyJwOp|@87R_nF%~u xxgI0; W xzՊbv鰩,8gLn5TI㲮#̦JwAW D_;o. <۔)b3I`dF>?G#7^i>.`g!KpðEZޯc3p;ʀ-ˏblWkMaSΫZnhpY3Jk!Cd֯V~Q ~q#gEV7'6L:!2jNCMi$Elsׂ3-o޸kafKFLQeZoԹ"shrsW_5~ռ6.slG#-Es&9.1 b9H ܊/ώgV*s=|h[**#iaА>潆ޛ)_A}'c#sΊK]haȆNW4pO+¯l}G>|% Cy39li^5 wB΀ da DKwLXk'7H_ol@C ߒ։n"-D/#)+%#0|pmۗ.WxQG`,v1NN9a_ڏ_b\c(:z#z[~"k;P}ѕ?JUó?;Eъg *|Xu'V +ۡ3z~2`Bz5w䰝?ǫjKFH@HH j8Ě+(r-߸ZC<S/"{'.rEc+PsvKwKA_L9_(p{s8n`>6UC[e@_hѭDEC~ pcs suЕiUWQy$Tx/ VPO͘f6]/ 4 n@;["&C2X::sܸ¢~5I+>}}0[!F{z͛,?.Lَ_ƳӞaM݇m8潿觪/YAc[n@<9nw]! ]#m1@+O\9؎ă}[:G_Zj}k1h+I/#+X?C>J.%h: Qo<.0ُ98DNyk}߶ہ:L.+~dN4aq\\)f0-۵BFg'-~?0Rkd 5ZΕwPrnF<@T.\^.sT>-!cƱƱ@W kO#.GV_ )jE\`R׿lX h Ҩlp;6h ^/p߉@ D7wmtrF&$ZDx; ~^Q"ĞOo_'"mJgn4: w/= cWd;gdɒ (:%%!\{_yV2%4a%d_ň_;y.E̬7e-Xxm>X^{u{& An'd:GoM}fEZ~+Gp{ɵY.'S5uiWlTNHk&Oxܨ§^]|X-"II_ʭ{!dPvI@L&H15@%`R]$|$2$ZHC1MI_LAw.9r}D܌10}vOE|/yvw/] ;z~%x~"kN%f jEKrҢurzn=s:腛挷 9&uSeŢq{(cey*+/ fPEPw/TA,Z \yzAznRC+Bhhu^ىt>IΛ<~(9\~xO-ko=Jwka$ ߟ0R.}m|0تA$8 HAvګ<$(k)g^44=6 `"U}^BG\k{3ҖK?n"kfׇmk:[g[79I{ƈyѥm?\ߚ3 vLκ_m9}G3LRf>c! ߉Ⱦ M~VL@-@;%h3iLK ,Ỉ B2o`k="5I tIDATBq 4/":쐩зN^, ؑZlw1#"&=J{^V?U4,TJG%4m+沂)y_Ů1^ߙ#_~dsĶYRO_-m[k 8]i8^&n5K7 d-'FeV-DGv龳D|,͙qe_m <^Vot.xB EtL-uGl7w12S҆I9[{ W 9:W£_%ӆ$YȘ2 W^&kbvuIe1sޮQk&1Z %s9!siZ*mAUiq|y{vde*GͱGv!F D߇DuO@=?E]_MW\+'46bze2QJIw-S`*J*FiSL<_94i"(4G$آ @hĻ==|?[cݛ{s O)9!0Әi"Dh ӰC]r^Մ,<3 NV0tK#NN{ z-1!Σ|-[s ,KTUiރ-E?4&e+OkmwU+ '& ߓ\twV{{ZA=%l_#^lwaB 2ICţNV h\1OP4] HHW0If_yG̳_{toC xI`i$!_ժ =_P?*?[;oT4s]A Oo/g(B9\ u&m驌?ti% $`0.k$.~*SERhQ<2ILҵ>;'xӍ\k)Zhp_ x׭ܴq2mGƊ<\Ɋ|MxfAJ0e,UPn=ׯw|]iDt+W\:~2ũsZSߟBDB: @;p?s?{sl֯4MKY:!S} U6{#1:9FD#:p6Dճ[Q)T&(6Ǔ$Ӧ{=IΞ?ϗ[ ?]f`?tto'vC;ᘜ B_^+L* *F=JhM3A3,Z.XŒ4_Cߙgg<'vGΚn_U?7׈ߘN/@+.#{>ywlO(j)1~/bߏcEx% B1B (z,#Z<\PjJayv^Mr1\)΍ +T[ĎKt>뀝)W0S̤ ח'A5ǾqS//NNOμ a ,ENC*kq|ɌDtGnXyo'g#/ƜxƉ|V٪NA 4nϓ*Iq "p@u jzKTRM$j?ϏUKPEL-[w .w:h] ÃCf8;ŹrmXFWi}L>Wh#RYmS1Ϡ{^ꛂY3Eb|:xqo3>\wjM:>O=X@!p :o8P@ ;[q}H{-/hH<e;EĸW֟3>WԘ\F&e|B^}"(rڹ!|s^o200q}OfpMGC]@Ul\aU-5NAK#Ez]\C(&il1e3@W|ه fqxLNjd)|2_% lQtJoٰ c0BƇ1ĆŗIe+v!U~3xQ/Q.p08fC~2p* Ĕ2pΡ`hHtۻwD5۶顊h" vE[:Q`l"[,2y9xDP i}[#ũ V;-[|hzk_(صWO癝"̅_N^/`-wJo7DjM 88B.4[jQ[׵ĮƒwZn\K5ֈ5Ew#:ԠM6oK[ %Sx jT" Bҳ45!cvԄ:4a;8%:P)GOl?*p`guFro~^Ξ=$ބU&D*Ȏ"G`B,"~P5[MWhV7U6 5΢hvr)1mYҒYڂ/-}5g~D٠iyǣi1UsdT/>*Kp !ѩm"kZУaHHHy= a ̂!!|Iy3k3kxNK +A/CWQUޓ "Q7aIBXHQ,/X]:/i|~\&@|?c&M0!~WOA'Jށ(d͉$ 2>wvo[D = 'NFKعzK93-$2SyU͟Bj_VMXD.!T[wo sjT[ H`>bp)hw5ϖrWձ4@!;{޲iGl⻠֗ng`@*9\W\U&,uo!Բ~_["`u|yg5YV5gsB㽚es侃{q~sE$h7U /Em A@-aE* ƫEјq܂#~|2scXH^IG2  ZnS~~GW PVk%=|MmK柭o uU>ٟ5(gUIgd- e]_Ղw }Pѹ B؃OG}5+/YO4n\2$x-\Hp jSs~JWĆ kMʥKG?~5܄d-'ч\IAsb Am mֺ|:]5 @JG>;shV9c cqS|.o/@p'`aV-z`^ ?e۝:7]č_(9J?򈰲* P#uϏ󜅡K!DRK]Q :,NV^'.!lZYs8yěLM`b/4\Kԉ›C i 7N Z˖[ʥK>k[g,f9_]b*4]&9Ǒ37u#gsE-{)en8TZg^&4lPHlG }_yF~QG;}/eZtPs88SiHk}UFMMhb٠Ծ{՜&xxŸ|W&h@  8!gn5$X9e7O7h h@ j^.ja ~8XI6j h@j8݄y߯.-4h@=%pfQo  %//IvF7ǟ4Mh!`W/ Mdh@5dÑZ $&V|DM_4M$4~Ѵh2F@M\֌(^IENDB`3Depict-0.0.19/data/textures/keyboard-command.png0000644000175000017500000001323312640746376021217 0ustar pcuserpcuserPNG  IHDR>asBIT|d pHYs//EutEXtSoftwarewww.inkscape.org<IDATx]{|EAd]">D=t~[A<芯\>zfQyE9wU"`2 HH!L&3GwWWuWOLUUWU&,F11                       pE o0e؈ KKʂd&ˠrFs0@J$'u|=*-)aE<qm %>}**P 0@jˡ|l=l7p,IBkK+,IVmoIÉI0qD`(=R^- ҒoDyuߗٳ`rm1\NƏ+΃EŖB|h'䣰K?YQw$$''}*6Ғ[uYZ 9)@H ?~ߠ`cpp:=p8Hp%]<NDk[t\ - #o8LX,wa#"o8OH?=rg @0"Fʲ.N&cA5Fdr+3m=~z4͈#,B\@EeXo, @yc!B I! ## .{mHήNcƌEvn83g 1!ᮨ,g#Er; 0ή=vOBp8X#999>tQgΜz=;li$I;{m!Frr hl:? JǏԔTTz=ɓ!H2Bl9V\.2(p`j4?y_ 8qؠI,Jذgx;x2 ܲ e& CÁFEfz ==Yhim<`. --sFl|j8Bτ}~B,~l9ЪLꪱLXIBK7 $\\ffvDeiXRG|_jx+*/]jkjӉ0{,<*٠-xp$$IgS\!kƆ 2@A*`/^TWHY=;Pk^[n  MP(_믾% ÁO?yD?]>Ǹxu' Kϝ#t-xB]kb@Wȕ'\ܰ ͽOm~j0566  Y Zq7N@^?^J$ <򺉔&+q:!"'A0,vFuAxÃ9^xn=-v>m7G,Vz>χ|D!٫@%R29y i˛xo_dee~j-Np4?N0 Cdg[/n| <ƻcQFQe|F1 ˲_5ؽk~t|avl߉k%~;o._|:;;˯< @S@!L" C5>ٞ%P/Ubԅ8_ܲfNJy5YP[{5{&,YU_ر_LܸCHWa@^ԟg2e g,vzW\\DaאG~aT,:FPʟV4;z+H!'lt B`xH0d>>\WIHOOhii6~P7-lZzZ i:;NS U0@@(qM8 "(t2=wޥ; JZk[6M7p*}ahs6~t?+_I_Ǻ5@ 1'Jg2M]u|[68:W0DoF01t+W[ߥ5-pZ!22uٯWCm]_ؾ~{&hkk燫@q? "DVjdQOFuP٪mxfSo1YΆ] .<޼ --o'Oɓ,uY?YjTUU[xt^o-Agg'ɗ_űr=5k{Esr{uҤ|L8D1p* *SiSd@DL5@sHFo 0բb_Vl<|`R~>_7\?=Xt1_uU ⺑8B$༼1s؛xW aUU~"eM,Y7MSM~+`?kb N`^rIi|*NElz;6pqb]sX!& z'al 2pgj2O7D,s?qBϙ\'0_RF}~"q-SsRgvI0[/Q vLLkLb}~s<1_B'Xe~&׏mE-~z2seGQcEz?&b,ឞ?ڋZ<{gq} Ei}M/omYY(,Xt)\ N)%:'tJ৅h{L ~WpY>V=`}: χ_3]ss3Ca+bӆ5?AY1BjIt";zҺv7zBC޵K-񣅚Z,f'Q3 S{I*+: z,WE=xG_c̙vo!v d%_C&W_?2---س{/ xpCض}$''A ǽLzaU]!*f-(.lpm˒!\ B֭Y3gP|~2Aߞ=z4/CX-om(**'>(y_uuuظa_ DVlH5RmPYA<;]jP ɿYX9*.@$P.-ܱgV ڏ.ꬄ~n4}Wpe,ǺbUDy4&yE+!i}ˢ ?o:pELB}{Ӂ[`ǻhK(+R-6YbDW0H#ɿ^@ ӧg?YTz 7S򯒡x:Mz5l}//P-4[ WgLW),3>|o=wފ`Xqr\vehow.v!f͙-,c3wU<~v -DZj*>=pm~5RNNj}<7#`tsJ!6?Q$w#j?ڟ~x򢊍66NŚ %1/nP <:\1g;vu i*ʑ.tLDk : %;1*g$Q߶V9GXpYض*D:ژa1^4ݲ\E,YTpBƚVDw&GDŽ A^ѝ0Ż0yشETUU٘2u rݾ !p{#Y2&Mmͯa'[.\:{LOu ,GQ&EyWRe^FQjW+_T Q~})rasrŐڳL\xxSt S#aFJq#if_g]qi<T͸ϱ3@A,m + ~p 0w' )q$ƚ6XՌ~'5$"b_ e|ic8b,CXhAnJB|.{yw/si]]IsWhAL Vw5r>6`3œ)Ɋ\ŵZ",h8 ~xX@+N@Ww'zR6.qUEwL` zh]6S/y^Џ\J p8HKIC"h@y_s[{AucǏ"7g$RRw:-6b YQsSH0Y@(B]C===;52%R J\.idfdt"%%F I!ttv\ HLH'w$1_ (EwŻ@{{;]]}g1(x0:-~"v HO!"-3Lrrr<2DLUtww ˋ>C#G 11 i\-CILHp%D#ר䊔!)1KMI X}ʖaq!==c@+"p\gÁ 9=~a#2d:nzwGhE+̯ yP`~4jf#Jϯ+a`:6>CViIY oQQYa A%e>S 1l};66666666666666666666666 '; IENDB`3Depict-0.0.19/data/textures/keyboard-tab.png0000644000175000017500000001322312640746376020346 0ustar pcuserpcuserPNG  IHDR>asBIT|d pHYs//E(-tEXtSoftwarewww.inkscape.org<IDATx]{tUNwҝtIHH2yqtX@Wttc1٬3 8]wE] z<+Q&@ ytw:W֭~{V8& ˕n+ I$a0 `p08L& I$a0 `p08L& I$a0 `p08Lx37% kx0 6'|X o[`9ynR #쫩?ڌ"@}C]6&&;H G$@}C01m31Ac%IE>,:._,dݰZj8D׋ӇT˯K4_NZ:`z E(BS7h>Ռh4*FpCMuVXM?w { b`fe%n71zy45@}C])_ŋ"`hCCC4L\T).q8z0ζIQJjk+,Ν+ C}9 qp #?TX-VXJw# ,P@(N'\.tyY> y{6&Ƅ 7JdtIRSSv{rrsA ~χp( g3WnwCE,IFNN |t\lǷ]"䠧[2&L @0D07'QZR+0)/ (&H^{{04Rl :.]@ )OOwE*WXf`pM' QZ2 y_)HKsbR^>~h=ۂXGr-͸qgŸ`\Hwq#;;G8>!9(†4aSj+Āc6LR1y#_JJ ]Ym~ŌG/$)R8)q'O^0#x;X29}RcjEIqRIy * Xp9ӥޮqH'D* /O˥uhC.KhD;)Pt\IDBaHDpS ƌ5@jj*s"ʡˈ=^NAjpDaq`9G8aIk!E's9\ Ofi*&P%`Z(J|$`rٖx1 !/uvrOnp 8Nbl$*ǩMDw^ǂ~ 'kMڒ: '^񦔭W[!@kD`" {TĨsBwDB]'N$ VPH0" NI|~mV4W &e?ߋb;oO/#LnJrid5lM w5`b5p1(tzƛ  ')P0ӕG<ɐ?'́S9_#B W &8 :-xU8 [GũJ4e&8% ( &ǡfL$Jc>Gpa aNh0RfAB4}eXA|TqԹ& ISzWAh3GxsY7K@RBO8ϋ&`LB!|-щˆ)x w_ġCp:;;qr/~Բf,YtlZDs}xLڵǾ>.\.`X~k< 8OIa@e﵄KZ:P 1 |~x<|)^_xӇƇj4~mzزy+y]:=|i{nәv R[jOi |}nܽnDǶ #Q 6[sEB!kX}]HI4J@g#4U<]%椲lL0F#VJWM`0߫KoY9sRԛ.+5Z?M+êU?d-Uym|ɻgy8w#x$RS[:uI -5?y~rޤ.Tdgg3>P8hXJ*Cm=g6iAٴ2Ȏ &/_‘'0V陸iA+d!aBQ`O5bww7>?x>;`ɾ?o2`Μ, {ʉa[^Q.;ie*u&kDpˉ\P*N 1qΝ?fjjƩgrgN˱ޤ" m\@klv*W9'39v8HiiDq a`6%!+*8/\ JAx<>1B2 h_o"%tKkVtMr>+/h ;>On:V\>;/QrX) b(z9cIQ(@2{?p'P Pq~&َF׈5wTk1gl|;9s&fͪD5{6(#RŒh[p\+m҆}~&:H0<)")Z@2-"H(588yg*߱zn]q+̟/ [ AV0=gf庺zP< &#?!Zz!qH tʼrKn\pAJmаk׭%1HTJN/RKifR_7cL&?$M6Fg*U}{ٗd~KvZn@1D U7‘;j}Q=7A;Ey}8q⤔fa֬Y5c/> VrZ2 Uj߶3U "S x&oĽ7[zoMe˫'8aH,b,BK3[ZZpsrBصkW]5U~y@ ;Wߍ߼`J|@n*|Rzݎg{z.uLgH`5ViZC<ս[֮[;ߖ>1_9stj)RRlpǏc7Kqͧ*Xux Qi }fJj͊m۷+pQ>AW&|DAhENm߂opTQ(Bcc#5Ǝ_ǿsG{X"y'D[$xXS Y@#M"C@lS3Eigć{ Ͽ tp8Xr%ow"%Ŏ%ƞ]eEjK/m۷PiiiwnL$A{W%PYYұӅE B?ߠ+S6D|1?VIX-@ C!mz)Sh"868G|㨰Əފא8FC8s4{ɓ`:r:0U]8X>RMN6iڢbHoVr3hѣO1RR H9vWGvFx\S\!q0b`EXdL&J\0H88zE|GG+ kNT["kI;)(};_ةIՎsS$55m .^ [(($`ax 6VU `GW ZxTܼ+&@4P~]|vf.ƍ^B/ŴA&FtGF8.VZ˚1cƸ| Ρ|L+-.sSa@/-5B f# d}`1/Hő/ (ǤT׭[m6қBs\/I琟_L~tpĸpitbaEKiH>h;"u`\t"ӑ# 5D# c;>~b3͉,]H6󡧷}#21^™٬l q,ڂ,&NDrw$4 xM;V\ppp(F[-VLӿ qjd|'& 0"QrZjrtr#.dzߣ1!8z!ӓ5v6 #(2c^JI(?JRO8=dZ E4$ảG(BHtB`X>>A4GiTww73cm~xTW Ǥbxxp8t3i`}LSÁp8 h \hB G~^\z3 hlx'OjƧ~b<IԄe*, rs SF"GOO0yš:cn&V\@Mu퇱8e$P `gf" r$4X`ՁGT!1F}CP\se1 6.AMza0 `p08L& I$a0 `p08L& I$a0 `p08L& Im|CIENDB`3Depict-0.0.19/data/textures/scroll_wheel_mouse.png0000644000175000017500000004017712640746376021704 0ustar pcuserpcuserPNG  IHDR\rfsBIT|d pHYs7]7]F]tEXtSoftwarewww.inkscape.org< IDATxw$}ejﻧ{Ǜ3@,I@R㝎'͉'=h"I .vl{_&Ȫ,]] NgFfFef|E(h4c3hV-F ,"eyٵYh | C7MY!"_PxP)սYZ&l&W2#mh YX@RjblPJMCYΆ@ x#c+ MzZMZGEDrMqٗZ@ -B)5 ˑL7M9pb@SqvEr)GFsH.6Z4Hh@@ BhД#@7M9-B iq<[hʑ{rhД#s?"hД#̊b@SVH5p(G2-EB ٻ, eݣԔ "mYe!hD[rd/(h @S+@ KQ36yh @H#-~/_\YUD6PT_sqf{nr~_|YDm\)J4+'"a{)S-ADEOy>ұ%µЬoDWOO-ԓϕ&h"%^wRxҤC[!"x)Jo-ch, iv߷]v]v4y@S0">m˼| WJe^KSZ4y#"[_7H} Ehr"";v>u_+H,-<;\K >JpYZ4IHelS?|KEh, "`;灯SkjMܫa J77Mi.2aiTyӔ M%^:߁+/ʡ- 4?diElOSJhQ3YQ*pBm?PJSiVmlL~ 8vm%T鲤Y )y$.ϕRK+jgx: R't_h `!"m/W&WD[O{ZS9_p%2)l,8JȊDShAD&S)uk)qh#{1"R<ɑ^Axx^)uԬ&  1wdSxUJ]_4eu%,Yz :@ EDLC[?UJ 5E@ #@ff{^h C BD8)!:w\D"YCƀmXEdhXH5/[;DX~N)սhV-e|{<~iH֚rA{{;mmm477si4]]]|ӟfxx^޽ˍ7͚,VeT?SJ82%0?xEEϯ8p@ t8a466Ƚ ;wx79sLڂDLt{RɚU@ @""c`_DرcGa¥N{{;?8݌$QJD:/ MIPfqx*LS^#GpajjjrϬ~?Ǐرc\z'Nӓffv4|Nq2ާ+/"ka h¿m6>Q]zDm۶m6zzzb?2==ME ̌ǀ~yT)ufə-eiLm}~^Ki*ڵ~iΞ=tlzf4,ٻP WJeeZS21gc ͛y'-Vt^ (wga6CxXOvOϦ333)~5wcJhXD:]?MC/bgMP\f>QYH(0~~mbLSbyl>;}ypS7pZ1J8N,Bz='|s*2x7سӔ-%$6m_ǜ|>sϞ=|GZ]v}D,},Ʋ0|O Y6͌s: 5%B @icyp)wlڴMwǠf-wQ[+!6D"-+!`Q?ThJa~D?Oڊ ?>QEWKAZ67bsFGGsMUH^r|hkkO7??)سԔ-%@Dv`Ϙ#^ 7M~5S9jD^Z/:XpсKoQ/<{M/Kg)2Zxof~t}Gc} +,mmRi~P!b|||IAp}(e0S@Fj_$[laǎl bGJ6`S,Π-˟5я~4E`?[MPDD/;󮮮x0a `{[ }Oض4qg399A|/}933 -EBD6_Mw4n;4yGp\tQV--~.h7Àe9؇eY/7:9=z={rWcZS?'GzTfiuliM&?>IgJ LLL}~9?Ȓ:g)Z|x"ñKKKԫ#QD-EgE?J)"G>[=s2Lbkz9j<]TWh!P:5Cg9FGGsY`| 9t|-v2 gzGE)Ί~,KoK0߹$bYtQEooBA;2^ ]^ ,Xpʯf8Fb=[__O{{;p&(K}'?Pڃט;F(ʫ[-$ނV:U <,?8 ُȏ088?^Fo=]A,ˢ-0(CEjii7=V`YhX""32K{ {x05@0KO[uM~\iDr.+}x_]h% "riIEGya<;ˀ}+W{A)}C*@rmĉ>T{'mi|+ze߾}B!,ˢ7,nv*TL7D4yrk;4>ir!&&&Ըǩj+e@g"\Sw_A{m~`Oɳ?rHORppGQu b)feqͼ-Gx{ߋ۝:4:{ߍ@!gΝQ'4Tl-?g\@g^A{ 1hکׂPUUŃ>X) ( 3=(ȊvU//2VbYf=is\δH:vc#MhȓBjjԻ0 ⧡]?hPw4' 3LNN244bxBCPA]${ Bg8:E8 ˂fJ)_Tג8pϗo]JZ$2 *,ˢ3({T--~juQG׬?V3+*J9J4MYWp |452fog+vdgnS2qI8eZNjёY'墡jc!<SG(GvURVYmWP30m-!do]jҠ 3y͵d讪˺jbk@ imd@ @fB%0e)޳ 4T @cbwZ(8&@wf@ @Dd WCsK[ .Y7Ų`_GK#]]]TW=`jV;eJ^&5,K2O <'!t5؛gIB/ :wGB)Å"֭[yw=姁V,I'/jE˂s\+Fq >ff_j6d߹CR,r,ؽOh^Rk)`hp "|҆jr(O%#UX~q߾>pv  wLDjR-A#wsǛXboѨYBYe.c3ɩ}`ƼC~O6Wk -A|ýxUok;?[+`[- ^yBQJPXJa*XJa)J)LL;B ?w'"<3tI0=4bA+<({ͮ.x|n7Zj|̈eY(QXF\ XN.k/+)g~jK~%_lٲ^9??"RJ+}y+ƴ/;} _s?Y]T#^LܹũzyYT|>MnbcM m$h7o. Zߊ[q3C\y)x&?~P奡GMg06 #C$xmeY\yT45 V..ܹoǀK5d6^oQn`-}iDC!zmHd!4[xX'U3Tx𰷳?ɗ@4P=?Y~a]]]&~t 3X}:oZ;s/~p7mY :sL?~&gO#KLgg'{,޵-G֭[vŚwn( `ڕ~Meo澭uInx e--Tn6mڔor֠ &s\ttt*V@3X@aj"ǖ/R"<027`V&\hX|bnKz ޸tmUUGTp-;y덀E(nݺ׾5.^XZVb fY?{7Gw4g^Ǹ2o|ӴнQܸq7nC==܃a,MK㑀X3tq <,D v-OJR/,hS_exҾOM⯩-}ի\zu9iFTރ+ZlrDѴg3 /pQ9ߟ}XoxB͞# ',|r_~P\Ì E)ŹsxW{nt@֖'+k-69fak׮חRXygy9tǎ*u-Bb@m)a@:JA$ɓ꫌dLW]]֮.FZ @ Mn!O,򯪪9^ʭ[:ڠP^{'NpCА~␅рr@JH8v߷[hVR__$l۶34ML\X = +-qJ$O{ٽgW\)kEQyN<Ν;9|0۷o_|C%Zl( la|eBBy ER4g۷SUUM\7Zlrv"{=gyܳo{vڵk\|9Ijjj8x ,z6`q1_c`hp8̙3g:0 la?y @A-69?O?nݻwk.߸ Қccc<<رy|nÞ,'b@BpS `>lR/ p``nN:"nvlή;x7rI`KLC}=w{{Q0=bPtZkn[Ƹtϟ9@ ={طw/UxvʀRiXDn@j\h&(E`v>6?#e|< v;;:~n݊&~&)}iX -RT|Zp+w!A #֭[+l,%p8D zMu5w^0Yۧݯw@E% qpOb` !Vd(ٹ;wP?~r+`*bO%8?9фo%XSIDATc&;Y_BH+!--*ԛjM4d.|>{4 9@ }yN:e C֏uvN`BG&,͆] ̕>>H!;hq g݅4n8`u5`O\9O~ٶeKq2@ @9.8%xi;bZ蒋Slpv^`! Lc S9ӡ M]D1J I=+P<Jt-digMKI> ")>[ ^慞'$m8(w(/zeI8?gPj-$ Jȸ  Pj  ^OYC!+P(8DE`a,υa%%ah ^I(}P~DEcq,@qS0Hlx !Boո.gqlrƛ b%DѤ)Ӣ-j#"@dzpNmYO<:U\P gi\ I-8R|OY0PL!6pbr0=S#G=dpej.L$ 0L36/ޛ~ -I98c\6s*fc~C-Xp&Than00Vy.sIX<@.M'X)` oĸK+AA Iw_ʺpyq(~ | 6@-(aR2s;߈hD|<|i()f@M&ܾEGts7[;^=Tnڶc%ېiK0c͍4d`3ʷ "4mݞӽEi.ݝHW '_0}b@mĜi3%C MڏtTL7osaJ(ltҾ<~@1>,Ƥ,B撻>h@ "rQD"Z(W kʪ\rVf\Ly`{m'E Nnq5`dt4|N p8'2OE_z3/So2/K:ֶ{/m{B g?&Fi;n6}.W㙜$bmd{~~ae); g^ESjUy006฽]LHTȽpoY]z=+LC0K8hl<%gSŚXR V<Q&yd~R5[x+xVIؚNSHB$06di덊8.hѲ0;vqH rfq>#U$1 cṅB)a˕IC @ 9nNaY˔+mҾww/K1ߗփGu܁ ,J؆,U`a,@ ,}\.W z# Х)q]#`#lڳ}cf|QN|wr1Lp 'wQ?PQj7%p`Y4 0<2wÔk½cMMb ]Z3]_hHDE#\n7B!fff QU^NsX>߅fPv{_c^>ZgiWǛӾ~: }b~߅"~jkkSvg2_\[hH@vm /.5:6 N40 \jHp| 8lk):#g8A?QeG$NLL$wݙ²oHڏv' (6mZlMhcd@ .5E]MSXˎZOs;~PAHo 33ehC2azf&)0$ @}~۝nxd5j!"!œ1 ^=?\*])O9ι94OϝYBMsSpQGtMm;@+qyI׸4׳ /aW ͗%Ͼ;a@4LrJ\.;w('""2NrvNŠ"1x97>o!s?9їFzk-Z\ݱ%eY R.CUe%;w@Lf#UgyoOsNRxn Cpכp/T_qHҖ9}j4IM)f-FF\TVVRUe{0::axLyxrq9 =?&;כw.^> km&Kp'|fZT@ @n߽;/"Otj8sssᘀ8{v3oԃzák', jk't7yCϗݻ廴* "t$a4nZK\.ٳ)ixXW}UWNM )O9k2a&- yejjq&Zz߭s\hȀwflcwzu*++ D C\Kjo;6HGWϏcpwŽojlLȼ^gH |wB @n޾=-"s~?iy8/a۳aV ޸0ad( mt=4lCcCB^-Ν}Պl߻yvNh7tZ7kMmm6I3Q.ܞί4SJrZڅ C9@ $K;f }-Y1gt g/0l+KD*.8'g:OGJ  3>fl΃磶6)? :1b>,\ysFvƓUJqs8njl$*fřٻrtaKe1DDhMOtɯ_ysZBLXpƍU`ٽs'b[ap4Jrf)4:E(3qQUYIEEERnܼt@M/[kh7.)̀Xg|||]"ڊ%^T#K Vi-!|s7QbpsC$lKI`&AyڍlZKiw8{zzV,Cfmx;3LY<>'smNk/Ma)=QA2Kuv< q!@;Ӥ b~\S]-˽}>:6mBnƣ͠^ȫ/ serw"4ijlLSۂ k_~hȃ+׮ޔ֑ŸՈ%^n 1:ŗ?!> !eNAFVUe?rZMNW8?^p͔j*n &# q+`34D)?'KNapwE<<| r6U˲蹴~֝ގe"ZO?!Bm|1@-<_JR»W&1 HH+ ܽ:SW^f=D~'+Ijk0@D b™kk|ciޝff>9a"ΟOڣ"f.]rEDtJjaN]? 675jSAƦ"c9npDq4"WGr2:6Ƶדf}KW\)sXh($~Ά55I.^4\u-#" V@|)1e/G'sk;d6⦪*iy'iOǓ)/"kP =/_E/_tmM D'ObNK]m-ZA&̆,f`zZ,QermC$i_:&ht|UWVf{R?7g,/pz+**R8qpx}e`WN72l4~o3 T":CBOOJ4ZvP_͈tۭYBQ }"/RJ_c]]:_ ¹ "+Z ^?wM )^|uhr?[O24fr&J:'@8?`.xɤ}.?u]8BwjjxcVLӤ[S-po&]?7gQ*n*Arܹ}uua?_+/Xh(gΟ_wR~?%6|OϺ08[lL³!QH-aL xy=29~C+[+ZsscCCʔ?|9&&R\s uuapun&n \%̔qJ)~L:M6 0Sg)Z|^Dn'Va֖}o]*cUaD3Qf#^nWrRF)|7S~"}-Eٳ#"I:-~J9-.u"\m0 a)ŝ9 C8?TWW' +Wv}>Z|ٳk52B @y̙А2okx7W*k% ƲWn0 08$u KbKggJl@{"sZ=eou0iF p ؎Ĉ93IM aKg'']jpi 00 bm&x<~^nO2 01- 'h{kkJ`PASg)2ZJӧ{E"2Xy<fn4󝔙oUapirsa4O>`.P_)HgE'OMw?PB9u5 Dct%F|^"r[n^ߏbnno) Z[ӅF>ΩSO0h(1o:mD gSx򩧸E"6KLķ ss7ɀc`[ n>u۫36 ZV}O njl=)m4-ίF àjjk~)&VloOPhX!:yi654)~sI# "ڍ׿ՅiL?yZloH\h/U'w7&yvROOQXyϧXe0[Sf_\iltNTSHs կrwm8C RS]͎[3 wމB7,MO\vc4qao R eYXM;V9_z~:Ldzͷ"ijlc&ξK'^?&Q >HF}.oʣ=ā{rDܹ ›oq㊊ :;3| ׻‰k-eƃG|ylff7o2e*߿ݻv{N*% @8\x3ePt\t۫go<MiP;rKt}.j8"¦6EǦMTWWSSUDLLL066  qE.]=;SF9&|s}LPoJ)F`| z< =-MM456\WOy-e +"]Y"jUWUDmMM{ WOm2F ᡣG[YL&jYLLL01933Kx4;𛯼]hXc<{FQ&&'d~~p8L8!$. ˅rv )30__yk-k|ERF̦|.^ |_^E4u#ǎmǎi`wowxKvҔ-GŶ#@ֆ{7Wb۫/Z?͚D :=@P%.l$ 'w8⫯fЬih4=!Fl`ak[SQSIENDB`3Depict-0.0.19/data/textures/animProgress0.png0000644000175000017500000002044512640746376020537 0ustar pcuserpcuserPNG  IHDRƽsBIT|d pHYs : :dJtEXtSoftwarewww.inkscape.org< IDATxytdW}?^*U*-%TJRv[6c f I#!'d!ф0gƓ@8`cLcr7ݽZjZ_{+Z[I*-m^z~www`B8}18 }18 ø/pÎx<~TQ)PUBQW FUUG#:lZϽqՕLzp`Bq WBeYKQ__h0Bܧꍬ2d !Zl6l6fd2I,#Y!ċ>Nٶ q@hnn>(__7Jee%t:)--faXZF$xD"A,cbbH$B$attaJ_/$YggQWACCC`~J*++xF޷766~RM4UUUXn2qݻ\|gf:tuu144?PU3===rw|& $EW~^v5njjuMMM|%ϜV ڮV{0 TU}Bpь5jwqya:::0Ν!Nvuu]Ym!_RXںJ}T6VR.Vht-Rj/Pb<)sL&O0':%2JVi_lmv9UU aELmmm>a[pFGGGw !^F|rlكY+M؁?,%DY`M~f R3R*( VLuҭt36;p0W0? < !hjj ~$[n%/^``tww?Ap^m€&Ij/+xeueXNNr.ސ))z= Q.~%~ ?i\.WЕﹱj?=_򷞞fggYOOWW+k6qu 8wC`۹|;niS'Op6uQz-ad}VIZ477c0V,5͒=4*aD冾[m_ewi~w3fmTM5}JTDrQΧ-uu~!Z7of/t>Λo3"H:~fÒ/D5ڴzuG518fb"Ja>ZQ $%>|3hRo2VU:bVu'^qKbd2vFU{鮮糟ə|&n#>oG/x? J&%%%%6hK{ѹs5"HN)..fvvEQ$oYXԑSME?B4n%,FS#GGw\կ=}Ф>h4JaavޖDr4tDSS3%_B@)@-/r^{kߝNgNR099Y߫PUP(sGfwmB`2E-b+aXm,{C-_tF#h4sq, v=se@(bdddK1DQTU333c%+jr N.o 7V$avvh4,˜9s&'a0lv,/;rʖʶadY> W}&`+a,4;̥Hs\hQ- uLQ昝evvv~t:<󌏏ىlGEEņDTUG'^ƎF^{ts:gc*9Ex/DBW=h1o-l\PPDpu DDQ$#I^eQ+!L2>>N<۶0]TU%y26 `%7Tr *"SI}4]p2TTTP]]MUUFÑYQU5C/_^fggfppadYFQFGGÇITp8}?jNj˲%/f9'xE<WH$rJfh^UUUTUUQQQԩS\x<+'XmF#. EUU7t2<Yg'Orq|I:::hii!pEQU1B :TʐL&8Dqqqsl'NxHR9r$ FFFHRtuuu7FEQ2} mI  =Ӎ߹BrIeVf6ai>ߏ$I[REyy9ԧ6믿aΝ;G:X,Fmm.Ft:m46nx{m'vXJLawhDi28v%%%yާkq!xx4tIx cccq򾸤sf2'X=MTP0qfO3&xI c$p1v{­y;Ç?azLnٳafgg9<ʫXo ٬H$E-%dc\H]Qݎu52%%% 2hvm{xwuw3Zh4rq:;;3/r5VBQ̘oXR!e${笅-g+qޞy*gՎt!~A{^ Wm݆;:Ư΍7O?~0h42<+tvvf6_^wu8M}nSZZ:dG%߂ 22"#)a@ڞ@UULg1+6SFj|.o4EQĉ$L;\.l6ۘj7F8蔅d f6sKԅWH=񥥥꛰SҫQPP@YYcccD"ƨؘ+]z۝v:}wqǬnUׂJѨi@  X,{ZZkv355,Q^^$5%lłs\@$󇮘ń4dqqޒMk|ɴgQ/_ORcrQTTt:+@+ 4"!appϗShk[ZZz`QɄшt\9VNOOoH=fffrZSq݌#2455|:frrІvII[I&?f\AAq'pW̦F;c43v@`,NUYY=[VVB<4Y2zeAAA+d%BTPP@"@QBЪ eY& Ny<.EMF,_ѼB$I9z``@ d2p6PU2e.byy3l3h)E"Prh$axxxKn 6rСevM<n\.\EEK]]]/.)GmWmb3 4l.yMbN$L۳6TU͜KtzY6EQ4-Q^^NMMӕ?>DrՖǁ?dHugoF144'-mM:FNǃ鯪zX|)*0n(f[j8"׷:%1DOp8O|W*C'9dŌMO! Ih3e.ļ?Jٹ M$ɄY,~?~@ 2jmg1o#ŗتJ[͜]x<ΥKxދ?'?P~fK !L<}}}TVVJHR\rd2K裡hі*#_h.ORh4%%%;jb P8III\0~KKwn֙>!_mWcM|_^`mCܞGeFGG> wnnqX,`0pccwK}o4pmοIt]*:;VӸ\ EQH$$MA'?HPSS-..~( ~#ș?}j*/1p6u&:.9x^X ϗ3?* OƵ>rkrɺXmW 7:BEbXTEQ69)eR2Oے"6CUmWC혪Ў,AWtɷZH}kjq@ALNԾwv ?0 j"`uv`0l8dN6ڮw@; 0Zv_p}p-v{l6/=^;D>< hc?#5g_(p:a<}ԩ 3j~ @%v6NJpN";RMM̀n26" e҆2EQ,{<NhAA宅 CmWNZo; *Z6d֬^/cnOnMoeNi/pqu27zoL4?Pv$!ټРMchWd ;4? _%%%vOU^["2vf$!i.Eտ;@z)**)**:QK@]MTT%|Y ЕවAs]rWQ V̽$拋rc)+q:j>/ăa}dD4mUQs+ U m`mU! Jd˯/6;To)"%D(g08rO;M:IE@zwܢ@סCꯩVQ?mP+[R@@QIYml罂줌^FR__|H=\/?%@k~gNaa!G?lwp8 ܏L*"^sF~>l\wuTWW?hccI<좓'p:.»A l40Ng8EEE?~Z[[[zkx_#Ϣm2iEIeY^8y$>|---o6%u;Ft:& 8,_j^Ass3555766>|7o8?W#p:7?&8ɄbՌ\z2lG9cxǒt:K/2ŲB٤m.@uu@@ hEEŹ&p:uO ɄdV0J!2,/z^xo^())yzxE$e=|<?G'&&>x8HSI2Fdaa!@ 0r.;~]TTtt:'`Y®A*2NOOCCC P2{ѨjKIDAT)Ñp:¨hj Qrz ³q@Cɤ9L#J(b$Ib$M&Sl6GVkL_rkd_11lcq@>cq@>R@i!?IENDB`3Depict-0.0.19/data/textures/keyboard-shift.png0000644000175000017500000001166012640746376020720 0ustar pcuserpcuserPNG  IHDR>asBIT|d pHYs//EutEXtSoftwarewww.inkscape.org<-IDATxyp%}?ڃ]ծ`U$,ĩ!JJȢ@h  c|T9a5WaV}>i&̛!|UMOO߿= ۶]$V1V1"GL#&@ q8bD1"GL#&@ q8bD1"GL#&@ q8RfLK)#FY ,YACÃ$pp>p.P[L1ʎY^G}  n.)1V/W Kw 04}͛ضr#Fc.6oꢳc 'OR)::; {m3=3L&ٲ5kKD.xϱYҴYLCà ޱb۶93z6ogK/UUXm466N rò,ellDKK}errLftrCÃ}'Hi85=ɫfK6zl'T55tw277 #o{ォxWl Gd5˲hmi¨SO*/%iuwVj}G&_/LB G u7/FGGim]"V6JH :1/JPg`WM!֟g2zIt%K  9lP C%CKKK'.chNznm2A6-%rrH$ذnM 444hQA S@}}"'Nh o|!< RJ^~Kᛏ=9nݫS(;ھ'[&CQK{y|h]bHzy%E8! u~e .E@@1ܗ}5=^N =c||k]-iH ]VIj$N!ŕbՖo$ 1P RۂjN 4$XqWᒯ{*ɺU˞/|}/u_K:f׭7L%,[nڅmujOJXa*_He?h| zY}FWgsv/ml+> ')H0Z9,ꊷ$XA8cx{D/Np.0Я꯮ w3cvM"C۹($ȰRX1xs|ĩW_6A#Gw=8 ;/+p=cc 5F12 *Nk_JKRWvyOﱽwxs? !]!mn%2>@J_d-@E!Wn*X)@[!Wu d/PUUu_x>;~2:̣k`BH\CŠ. +JURh+&WHDx12 6l\xW455p{9y>:IW3~3nU#@P!~_nǏ/}Fk:u}099wziò෻~: MTSsàjҠ(uqnN5N[[ ۲ϰgϏU#B@ Ie+Џ!@`o:$Sd|2!${2y]jdrR)n6/7,--f;!A m6CpN2OEP) os?P߶mn ^9jkk<o]}v^xګЃg~aQrA0'2,(;d^ tǞСtw?u9`zX_MH]s{cǎ[P #>PCBEV`?d`d*n/{ny̏ظa}*kRnczzv~+ض;qy8"N6[ -yL %½NQNy|wls>s>7ܳCp/c-۶F lo.٣~j Kly jYTP^Gƍ7gگ_m~m*fV.tP6zCü --|;ߒ{^{ȍGZZ[lJ{ NTUŻ* /Zpn~+,֯_U{_(Շy9gfG]$2ԁNCY5 h~뱺MV!4v,Qf24[?1LxZgQ57xNgͫ9x*{BMo )MFn2B:8EE빼_R(«CC6&OSl}mjZ Z)ibRRP6?yY tNBX%Bb J 14V$X0WUʧXFUCr@.W3I4۫uK^5-s@$ 1*{7P|5 ,!A3ݍS_0)b@ECۊZ_,+|:0.zJA?j(J-_ɿ[092WţhO&-2, !r te)zm/s Jąw#gjpFPKMf-x~+Had1E\/T*{fsyqzz ˲Wuejfy07n>#CH+sa\knnvٳCX:'BvS&&BR Htm"JN[p9ov?pM^g Zx{vsdeZH;%H-'2X֎D"I}m=신y_8Ex5:L$Xƨ,lX%bKIKKK9F!+y<Ḿ;EI J/ߥd2ImmBe-195 ҩ4Uj:;pB$9s ?yRQ:;I7f_]ŭ4 XtXfS*hxޟto-sȧ5(;"@UU5 J\,+˲?ʑNmʯQ9_,U5J\]mUx PSSC]kTuFRq>$D"AKs[ T,+9 !28G]9'Ӌt*mW, ecmɤ=>uϜVԷTLOZ]UUUXKK,,88}|x/%SWuu03;e[LZŶm,kɹ1&SضM&1 a"^ Y.YK,!Ɗ`qiѹn8C@f@4:Feq=}iJ|j }8q;b2 8p#GޔqliD ^ <,ǥRi:;;iooD"{1Ve119ə39ypU#as`hxn1g7L |#W܌e1*q<$_‚04<(OGcfxo LCÃ)`3z\ 8v1 q8bD1"GL#&@ q8bD1"GL#&@ q8bD1"GL#&@Xr9 x IENDB`3Depict-0.0.19/data/textures/plot_zoom_y.png0000644000175000017500000001036212640746376020355 0ustar pcuserpcuserPNG  IHDR_`{`sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<oIDATxi\u3==ӣт I,#!*FFv>8Ʀ\1\,RI\fp| MI"H#l!" gݓ_wLf~=ի~9}s=1KTE'Q&bΔ帍+N]l~Ω4S qkp5|O{?8gFUgL!OaǛkEՎw}:w{hñ 5!PTLPxl[C _^2^?֯YܰJ160jK7>[W>@GmqI<V/b3~3 amAy,F$|xMc&0i~~+ű['`Th|gXSDT9FMZŘ]j/W3?7"gBUؼ'ްv i6I*;V?DMD6v9 U첎s>9oNj10i?xS3Vڥ6 4^|}槪 b갼8v[ǃϝ*'{xQ}35W5?EdYxSKWʲ,f_O#Oa`߀W2t|ݻ o44KD>k2槉̺ͪ]r+\./R=>/1t0OGoዉukTu 2=fXń_׸JbwL`LAy;@M_.W\:Dd!0 -w RIV\|]\i^_]5Jo sK+ْ!Ob`i< b-7s^*Gwg4cXMGSWJmz̨;p`!&P Eqô?|rč6s?OS~5X"O*AQ/_;_3i"9,/*G:_ @,ѲwAE @w]0r,M(T{${֘Px"(G>vFjgμܮhXD[# k`R&|`A!uY"Ǜ ~?}5uMu'XVtЭ^O ΝU{۹}Ow#TUx3w W*ӚKG8;xy* 9?+<о=Bb*9᷿||Boy"L_iۃ;kHDkVٌEL{ ngmsĦ&]ь#s#1B#%E\CWI4ET/оx=L[|x`jQ#"+FE0fDԪzY5Vb,OXIH?5E$;h?iA" w~ hfo?CR'9Q}YUdA`g ϝgÉƳWzQ1z!8e2vdrĪj5֞H  TvrQAET>4tt*F,VV=( 5Q~;FjD*nu? mnOVbתZ^OōRVܸJ󏮌HF%VިN4SJtK{0 5# H^UdEda%'Llj-zcLT(!Lw @bݡj|Pf%L65vr*G0=M aAUgâw> |:=@#?KA־[{| z5 d:So 7WDr@Ңw"/GۣX:`Qz Y>L J}5Z4ޘ-fk宴]_jV-!eij Z}ux#pngkeAYg%"C[:\{ӝQ DY(-]6dԵ-^YQn`&Y!bso!;@5Q[wK1i,~ΙSIR"w)ΧG~ͰE_3)w^caή, ,MyY)a&VF툋;K9F.w'Eγ "7ņ  zc$xvESWfe緌jt99!ai ZaF>P]Ȣq~إ̅/:2:kO}1av_hYmoma|' k"HU DUhJ:}fgcXrtW&ӠnVAoܖ0*B~鮥!}z;ث2ʂL]OU"z4gt(j~㾛$$]l-km B e'-8-Ng6ѩd/5poipU`da t-kϗ'1WULD=nwzwHUpm?tC;3D¯=xK*.jurXl,Ͽ֦쪧lj'iB;=Sx!k[qBXzQPiEX%6nt`cq<<.+x-5j}<.+En]#*N @q"[;p8 q Og ijG~xJV; |SG_zDx8-)ERdц謒|aXĆgJm3V: <8Z3I8,<>'XbᗟnA׷|i/W  ?a`Ld-M1"i܌Ո=бiKİ—Ǫ"^[Guy*'*p=뭘FAS9>&qu\Uδ_jwg׎'T5^&th*_2<|qqg 2?حEhFY J40HD=4OgXyJTTQuTON>8vͣڱ)2w gv_Ԏ>CKDۄVS|,0jIENDB`3Depict-0.0.19/data/textures/plot_slide_x.png0000644000175000017500000001746512640746376020503 0ustar pcuserpcuserPNG  IHDRX0MsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxyU;['! HB@P,~DGgy1/ 2tpA_G>g@’-!K'Yz{[Gսnu;};u9O;9uN )%wVgMUzׁǀ;j;n7k$z Bpp纵檙pUq)ρ9simm]ǝ)i3ػwaO|h[jU)oᒢ+B*U@T)S(Y3g`^2)oV>q"`'@mKWF aF4-)DRZœO>AWwW1ʲukoV1V,) 9!H2wi4OmԂ,=bˁ(BSc#@Oo7RJ8}Mk'F ؄Ud$N?ЇYs;4Cl2I eYŝՐhFSمB޾4 ElTMmˀa&~-3ME%fj@VB#AS5TU=E1"2urpǤ]aI1giX`?}\Əާ!{Gx6%Cr!!@[<3z'_ D uzb8x-7v:b‰Pl?tfpLחP"%DEع7 7nc*u8ǍOhљ|__{7'|jDRi`(8{O(bx^%p*=bn};M$o'psJ}SsW&t!» 'I8QL 1'߄ -8|0ӷn;&)o1߷o\I^h=H!o>sBYcb*pÑk^b}O;hhh%1u|DxǸ;ߥDb/AD dX )>VDך+ 4?<]_Ds%?}#(t0 |W,璷_ D"HGH3"@HB"p9t pZT1a҉e4u*z{{XsZTU-#WR_~%t E8 5q)|n-!MDrBJ'MY9D) =H MITbxA j >hjj6yl/{tMIX+9\jS)5| 9pI!1pv`LI|p"M7nYJO字9%gZ]* +Qo|LjG^9)bb| Ɋ*HyOKɁOx6S)1JQ45whفVM3L2Qqt.U9)Tv\K>GwA]ܟLMW .@+ýƧ1*I!qH(o>Y}|>K\iR=iL&tCM\QJ OS釈b7 9rIԊ!s JjLJ{8[[fXAT|yx5hVJ87̘iIT~BH!h^G}AZ/9# BM5&Σ Fl%}!2.b['q$(v]S;I_(,xN!C^ø2\գ$bIҙUNnLD4ZL&ƴSxԵSq>-!]oqf'f5 ;6L7g@HDK"=zx"L81 #+;^fsB**‘<&5ؖ Zw r:L>CQfLEg1M&hzLdppmDz-O`T M53ϤPGimĄCAks+E[ a+YIt&M}]3cL:|'664{fiOdv'% #33c,eb5ũ-[0 e&*464^=T#!pݲ7]ר/<0W2ևD4 [ژVi/@r TYߩ|] =C̶Lm%S(0J躎-m dj6U+j8E&w|E!Hb[˲|f4~ wB&Dso]G_5ΣGefVXIDQTg>o/)mc&_}?nWՈQwv)o8DdPub~f!p&U\/]8_7U1a8?oRSjj 1ą2s% [ܳ~$.|H<`TM@S2w wxBuqJ,RU\D.t_6[yk}bգ[ "mZ{*囚I )sZj @SGeRj? C|ؙ!=&LUF,]QY,>۬)q!Hk"cWpҖ47 {i W_KHgQ$6!ض\|XIݼ̖9EiӢmq +$Tw&""*BlI܁Q9M݆Mx?W_#"& iMDpWbsECWQ㺣E Xeu\ݝy6dۛC瘖K ?l RAi"r-s\YM: \o(`#36MW2 U4LwmP1'ДQ`ǔ1H4,),hZ|z*{*nIނG:nm 6q0 7%Cb`ⶤJEJ9iT7fT>e:Se . lZ UTɈ)1%-Ȝ ;$O5eyMbӗ69oygCkj\ ~9Se(S3j= 3`_Z|7ᝳ`q}nJ6 k`sL[cM[;,teaK{vFx )εiN(evGQ)= ;!k:X !A_ڳO=cOT%Ns eSu! ~V +80/ g 3B< OvͰ"?l@Ѡtwa!(mVRZӹѭ- 55$]·dN@q!a@cY.f8˭/nh{z3`O^8/Hij0 !b-GQ,y͜{0; RpĀz=0'+ [t|aؒ'3d{zЄR_/C-spIد5%{1 NgAhZ{uY}M8XsK-EA{k8g`ff`Q-j+fB/=pZAj UɹfNke !aI 1;NZJÆ,l4%I^tH>w~M˪h71h 2@"'FΆ9؛9h`Y 5 =0`xG ҆›i7p$mGz@-i@SuY[+S2ʼn.Ak݀ТBaz#P^Sy1}LKYDڳl ;Vs_٤.UQ:iH[pȀ^J8F/ ÷ 73vҲmp#uKRJS @ Ȝ5^r3Q%e#(8*C*03c&ؙ`O!`z!۰!C`93> dcp˧f})_@YTiCiK< mdLtXҖ) `Z`Do+ 8n])DP&I?Ig\0uɚG.VD4.k53 2 ` #:T ^˻N_15t2I#88榮Ysm{oX(NkH E.@. }huu' E 0]t!.M8dCnJKk70veG 0,i}GOmkr] CUzeaTh]w|ް,QQώ]#8z7<fG!iæ{|r7]Ǻ8t.)e~e`:Ni8Ypނe5V2A %),۝>b@6r훟y_[#ɐr8t Ca{XBNGp5+zgyXz\#(H[|Qq`tgB@M#savݛ:QNq dH)2u);`v( 62 *g]dwXG `X؅to}_Boa2P&CQ3H/FCHL|ߛ{}gWο.(tTIӉ4*#> L|/p ۇ%r8k2eBSddc\EO&fOF? =\@cGeO c c~ Gځxc@}.H>ЈHm%R$/.UTl5 oYVpCw+Nvyif_y=[38Ÿ^pI 5{?kyIr$?cN]SDg$g+D[D e-61cSH3ocE ` )1{MD62W_xle2XafVjJ\؀!I)Hܲ[>gu.?-PUDT#2M!ц&` v ܓbIQ:f $ 2}0.1m0,j߯  ɐdbBf$C&{zj}'9W]7Zg;UU`uPL% f>_8oezv7̈́$Ǥ-i-*!$FbƆza|ڻ|}VwK@GhB44mI׿_k3cOdxA2$2䜊 pfpQGq =rpfci7c s5tI"4IdJBh8őe3!e?rb‰ȪP%HtIENDB`3Depict-0.0.19/install-sh0000755000175000017500000000000012640746376014471 0ustar pcuserpcuser3Depict-0.0.19/AUTHORS0000644000175000017500000000015712640746376013552 0ustar pcuserpcuserProgramming: D Haley mycae % gmx com annacegu annacegu % users sourceforge net Translations: Erich (de) 3Depict-0.0.19/aclocal.m40000644000175000017500000013510112723165555014334 0ustar pcuserpcuser# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/ftgl.m4]) m4_include([m4/gsl.m4]) m4_include([m4/wxwin.m4]) m4_include([acinclude.m4])